From 7dd994051a0de26bdf18584ef6aee0b341eee917 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 1 Sep 2025 11:55:34 +0000 Subject: [PATCH 1/3] Initial plan From b05104ac8e8cac4c19fbe18117e2646809467643 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 1 Sep 2025 11:58:35 +0000 Subject: [PATCH 2/3] Initial exploration and planning for test coverage improvement Co-authored-by: jdan <287268+jdan@users.noreply.github.com> --- .bundle/config | 2 + vendor/bundle/ruby/3.2.0/bin/erb | 29 + vendor/bundle/ruby/3.2.0/bin/htmldiff | 29 + vendor/bundle/ruby/3.2.0/bin/ldiff | 29 + vendor/bundle/ruby/3.2.0/bin/puma | 29 + vendor/bundle/ruby/3.2.0/bin/pumactl | 29 + vendor/bundle/ruby/3.2.0/bin/rackup | 29 + vendor/bundle/ruby/3.2.0/bin/rdoc | 29 + vendor/bundle/ruby/3.2.0/bin/ri | 29 + vendor/bundle/ruby/3.2.0/bin/rspec | 29 + vendor/bundle/ruby/3.2.0/cache/date-3.4.1.gem | Bin 0 -> 76800 bytes .../ruby/3.2.0/cache/diff-lcs-1.6.2.gem | Bin 0 -> 59392 bytes vendor/bundle/ruby/3.2.0/cache/erb-5.0.2.gem | Bin 0 -> 21504 bytes .../bundle/ruby/3.2.0/cache/nio4r-2.7.4.gem | Bin 0 -> 116736 bytes .../bundle/ruby/3.2.0/cache/psych-5.2.6.gem | Bin 0 -> 39424 bytes vendor/bundle/ruby/3.2.0/cache/puma-6.6.1.gem | Bin 0 -> 239104 bytes vendor/bundle/ruby/3.2.0/cache/rack-3.2.0.gem | Bin 0 -> 117248 bytes .../ruby/3.2.0/cache/rack-test-2.2.0.gem | Bin 0 -> 20992 bytes .../bundle/ruby/3.2.0/cache/rackup-2.2.1.gem | Bin 0 -> 17408 bytes .../bundle/ruby/3.2.0/cache/rdoc-6.14.2.gem | Bin 0 -> 671744 bytes .../bundle/ruby/3.2.0/cache/rspec-3.13.1.gem | Bin 0 -> 10752 bytes .../ruby/3.2.0/cache/rspec-core-3.13.5.gem | Bin 0 -> 167424 bytes .../3.2.0/cache/rspec-expectations-3.13.5.gem | Bin 0 -> 89600 bytes .../ruby/3.2.0/cache/rspec-mocks-3.13.5.gem | Bin 0 -> 82944 bytes .../ruby/3.2.0/cache/rspec-support-3.13.5.gem | Bin 0 -> 40960 bytes .../ruby/3.2.0/cache/stringio-3.1.7.gem | Bin 0 -> 19456 bytes .../3.2.0/date-3.4.1/date_core.so | Bin 0 -> 1299200 bytes .../3.2.0/date-3.4.1/gem.build_complete | 0 .../3.2.0/date-3.4.1/gem_make.out | 24 + .../3.2.0/date-3.4.1/mkmf.log | 89 + .../3.2.0/erb-5.0.2/erb/escape.so | Bin 0 -> 32144 bytes .../3.2.0/erb-5.0.2/gem.build_complete | 0 .../3.2.0/erb-5.0.2/gem_make.out | 19 + .../x86_64-linux-gnu/3.2.0/erb-5.0.2/mkmf.log | 36 + .../3.2.0/nio4r-2.7.4/gem.build_complete | 0 .../3.2.0/nio4r-2.7.4/gem_make.out | 53 + .../3.2.0/nio4r-2.7.4/mkmf.log | 186 + .../3.2.0/nio4r-2.7.4/nio4r_ext.so | Bin 0 -> 345376 bytes .../3.2.0/psych-5.2.6/gem.build_complete | 0 .../3.2.0/psych-5.2.6/gem_make.out | 30 + .../3.2.0/psych-5.2.6/mkmf.log | 97 + .../3.2.0/psych-5.2.6/psych.so | Bin 0 -> 147880 bytes .../3.2.0/puma-6.6.1/gem.build_complete | 0 .../3.2.0/puma-6.6.1/gem_make.out | 41 + .../3.2.0/puma-6.6.1/mkmf.log | 228 + .../3.2.0/puma-6.6.1/puma/puma_http11.so | Bin 0 -> 141920 bytes .../3.2.0/stringio-3.1.7/gem.build_complete | 0 .../3.2.0/stringio-3.1.7/gem_make.out | 19 + .../3.2.0/stringio-3.1.7/mkmf.log | 30 + .../3.2.0/stringio-3.1.7/stringio.so | Bin 0 -> 184552 bytes .../ruby/3.2.0/gems/date-3.4.1/README.md | 102 + .../3.2.0/gems/date-3.4.1/ext/date/Makefile | 269 + .../gems/date-3.4.1/ext/date/date_core.c | 10064 +++++++++ .../gems/date-3.4.1/ext/date/date_parse.c | 3086 +++ .../gems/date-3.4.1/ext/date/date_strftime.c | 638 + .../gems/date-3.4.1/ext/date/date_strptime.c | 703 + .../3.2.0/gems/date-3.4.1/ext/date/date_tmx.h | 56 + .../3.2.0/gems/date-3.4.1/ext/date/extconf.rb | 13 + .../3.2.0/gems/date-3.4.1/ext/date/prereq.mk | 19 + .../3.2.0/gems/date-3.4.1/ext/date/zonetab.h | 1564 ++ .../gems/date-3.4.1/ext/date/zonetab.list | 330 + .../ruby/3.2.0/gems/date-3.4.1/lib/date.rb | 70 + .../3.2.0/gems/date-3.4.1/lib/date_core.so | Bin 0 -> 1299200 bytes .../ruby/3.2.0/gems/diff-lcs-1.6.2/.rspec | 1 + .../3.2.0/gems/diff-lcs-1.6.2/CHANGELOG.md | 518 + .../gems/diff-lcs-1.6.2/CODE_OF_CONDUCT.md | 128 + .../3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTING.md | 71 + .../3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTORS.md | 49 + .../ruby/3.2.0/gems/diff-lcs-1.6.2/LICENCE.md | 40 + .../3.2.0/gems/diff-lcs-1.6.2/Manifest.txt | 115 + .../ruby/3.2.0/gems/diff-lcs-1.6.2/README.md | 92 + .../ruby/3.2.0/gems/diff-lcs-1.6.2/Rakefile | 115 + .../3.2.0/gems/diff-lcs-1.6.2/SECURITY.md | 41 + .../3.2.0/gems/diff-lcs-1.6.2/bin/htmldiff | 35 + .../ruby/3.2.0/gems/diff-lcs-1.6.2/bin/ldiff | 9 + .../gems/diff-lcs-1.6.2/docs/COPYING.txt | 339 + .../gems/diff-lcs-1.6.2/docs/artistic.txt | 127 + .../3.2.0/gems/diff-lcs-1.6.2/lib/diff-lcs.rb | 3 + .../3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs.rb | 742 + .../gems/diff-lcs-1.6.2/lib/diff/lcs/array.rb | 7 + .../diff-lcs-1.6.2/lib/diff/lcs/backports.rb | 13 + .../gems/diff-lcs-1.6.2/lib/diff/lcs/block.rb | 37 + .../diff-lcs-1.6.2/lib/diff/lcs/callbacks.rb | 327 + .../diff-lcs-1.6.2/lib/diff/lcs/change.rb | 174 + .../diff-lcs-1.6.2/lib/diff/lcs/htmldiff.rb | 160 + .../gems/diff-lcs-1.6.2/lib/diff/lcs/hunk.rb | 379 + .../diff-lcs-1.6.2/lib/diff/lcs/internals.rb | 308 + .../gems/diff-lcs-1.6.2/lib/diff/lcs/ldiff.rb | 189 + .../diff-lcs-1.6.2/lib/diff/lcs/string.rb | 5 + .../diff-lcs-1.6.2/lib/diff/lcs/version.rb | 7 + .../ruby/3.2.0/gems/diff-lcs-1.6.2/mise.toml | 5 + .../gems/diff-lcs-1.6.2/spec/change_spec.rb | 89 + .../gems/diff-lcs-1.6.2/spec/diff_spec.rb | 51 + .../gems/diff-lcs-1.6.2/spec/fixtures/123_x | 2 + .../gems/diff-lcs-1.6.2/spec/fixtures/456_x | 2 + .../gems/diff-lcs-1.6.2/spec/fixtures/aX | 1 + .../gems/diff-lcs-1.6.2/spec/fixtures/bXaX | 1 + .../gems/diff-lcs-1.6.2/spec/fixtures/ds1.csv | 50 + .../gems/diff-lcs-1.6.2/spec/fixtures/ds2.csv | 51 + .../gems/diff-lcs-1.6.2/spec/fixtures/empty | 0 .../diff-lcs-1.6.2/spec/fixtures/file1.bin | Bin 0 -> 1 bytes .../diff-lcs-1.6.2/spec/fixtures/file2.bin | Bin 0 -> 6 bytes .../diff-lcs-1.6.2/spec/fixtures/four_lines | 4 + .../fixtures/four_lines_with_missing_new_line | 4 + .../fixtures/ldiff/diff.missing_new_line1-e | 1 + .../fixtures/ldiff/diff.missing_new_line1-f | 1 + .../fixtures/ldiff/diff.missing_new_line2-e | 1 + .../fixtures/ldiff/diff.missing_new_line2-f | 1 + .../spec/fixtures/ldiff/error.diff.chef-e | 2 + .../spec/fixtures/ldiff/error.diff.chef-f | 2 + .../ldiff/error.diff.missing_new_line1-e | 1 + .../ldiff/error.diff.missing_new_line1-f | 1 + .../ldiff/error.diff.missing_new_line2-e | 1 + .../ldiff/error.diff.missing_new_line2-f | 1 + .../spec/fixtures/ldiff/output.diff | 4 + .../spec/fixtures/ldiff/output.diff-c | 7 + .../spec/fixtures/ldiff/output.diff-e | 3 + .../spec/fixtures/ldiff/output.diff-f | 3 + .../spec/fixtures/ldiff/output.diff-u | 5 + .../spec/fixtures/ldiff/output.diff.bin1 | 0 .../spec/fixtures/ldiff/output.diff.bin1-c | 0 .../spec/fixtures/ldiff/output.diff.bin1-e | 0 .../spec/fixtures/ldiff/output.diff.bin1-f | 0 .../spec/fixtures/ldiff/output.diff.bin1-u | 0 .../spec/fixtures/ldiff/output.diff.bin2 | 1 + .../spec/fixtures/ldiff/output.diff.bin2-c | 1 + .../spec/fixtures/ldiff/output.diff.bin2-e | 1 + .../spec/fixtures/ldiff/output.diff.bin2-f | 1 + .../spec/fixtures/ldiff/output.diff.bin2-u | 1 + .../spec/fixtures/ldiff/output.diff.chef | 4 + .../spec/fixtures/ldiff/output.diff.chef-c | 15 + .../spec/fixtures/ldiff/output.diff.chef-e | 3 + .../spec/fixtures/ldiff/output.diff.chef-f | 3 + .../spec/fixtures/ldiff/output.diff.chef-u | 9 + .../spec/fixtures/ldiff/output.diff.chef2 | 7 + .../spec/fixtures/ldiff/output.diff.chef2-c | 20 + .../spec/fixtures/ldiff/output.diff.chef2-d | 7 + .../spec/fixtures/ldiff/output.diff.chef2-e | 7 + .../spec/fixtures/ldiff/output.diff.chef2-f | 7 + .../spec/fixtures/ldiff/output.diff.chef2-u | 16 + .../ldiff/output.diff.empty.vs.four_lines | 5 + .../ldiff/output.diff.empty.vs.four_lines-c | 9 + .../ldiff/output.diff.empty.vs.four_lines-e | 6 + .../ldiff/output.diff.empty.vs.four_lines-f | 6 + .../ldiff/output.diff.empty.vs.four_lines-u | 7 + .../ldiff/output.diff.four_lines.vs.empty | 5 + .../ldiff/output.diff.four_lines.vs.empty-c | 9 + .../ldiff/output.diff.four_lines.vs.empty-e | 1 + .../ldiff/output.diff.four_lines.vs.empty-f | 1 + .../ldiff/output.diff.four_lines.vs.empty-u | 7 + .../output.diff.issue95_trailing_context | 4 + .../output.diff.issue95_trailing_context-c | 9 + .../output.diff.issue95_trailing_context-e | 3 + .../output.diff.issue95_trailing_context-f | 3 + .../output.diff.issue95_trailing_context-u | 6 + .../ldiff/output.diff.missing_new_line1 | 5 + .../ldiff/output.diff.missing_new_line1-c | 14 + .../ldiff/output.diff.missing_new_line1-e | 0 .../ldiff/output.diff.missing_new_line1-f | 0 .../ldiff/output.diff.missing_new_line1-u | 9 + .../ldiff/output.diff.missing_new_line2 | 5 + .../ldiff/output.diff.missing_new_line2-c | 14 + .../ldiff/output.diff.missing_new_line2-e | 0 .../ldiff/output.diff.missing_new_line2-f | 0 .../ldiff/output.diff.missing_new_line2-u | 9 + .../diff-lcs-1.6.2/spec/fixtures/new-chef | 4 + .../diff-lcs-1.6.2/spec/fixtures/new-chef2 | 17 + .../diff-lcs-1.6.2/spec/fixtures/old-chef | 4 + .../diff-lcs-1.6.2/spec/fixtures/old-chef2 | 14 + .../gems/diff-lcs-1.6.2/spec/hunk_spec.rb | 83 + .../gems/diff-lcs-1.6.2/spec/issues_spec.rb | 160 + .../gems/diff-lcs-1.6.2/spec/lcs_spec.rb | 56 + .../gems/diff-lcs-1.6.2/spec/ldiff_spec.rb | 100 + .../gems/diff-lcs-1.6.2/spec/patch_spec.rb | 416 + .../gems/diff-lcs-1.6.2/spec/sdiff_spec.rb | 216 + .../gems/diff-lcs-1.6.2/spec/spec_helper.rb | 376 + .../spec/traverse_balanced_spec.rb | 312 + .../spec/traverse_sequences_spec.rb | 137 + .../ruby/3.2.0/gems/erb-5.0.2/.document | 6 + .../gems/erb-5.0.2/.github/dependabot.yml | 6 + .../gems/erb-5.0.2/.github/workflows/test.yml | 33 + .../ruby/3.2.0/gems/erb-5.0.2/.gitignore | 12 + .../ruby/3.2.0/gems/erb-5.0.2/.rdoc_options | 1 + vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/BDSL | 22 + .../bundle/ruby/3.2.0/gems/erb-5.0.2/COPYING | 56 + .../bundle/ruby/3.2.0/gems/erb-5.0.2/Gemfile | 10 + .../ruby/3.2.0/gems/erb-5.0.2/LICENSE.txt | 2 + .../bundle/ruby/3.2.0/gems/erb-5.0.2/NEWS.md | 65 + .../ruby/3.2.0/gems/erb-5.0.2/README.md | 255 + .../bundle/ruby/3.2.0/gems/erb-5.0.2/Rakefile | 19 + .../ruby/3.2.0/gems/erb-5.0.2/_doc/cgi.rb | 3 + .../ruby/3.2.0/gems/erb-5.0.2/bin/console | 14 + .../ruby/3.2.0/gems/erb-5.0.2/bin/setup | 8 + .../ruby/3.2.0/gems/erb-5.0.2/erb.gemspec | 36 + .../gems/erb-5.0.2/ext/erb/escape/Makefile | 269 + .../gems/erb-5.0.2/ext/erb/escape/escape.c | 102 + .../gems/erb-5.0.2/ext/erb/escape/extconf.rb | 9 + .../ruby/3.2.0/gems/erb-5.0.2/lib/erb.rb | 504 + .../3.2.0/gems/erb-5.0.2/lib/erb/compiler.rb | 488 + .../gems/erb-5.0.2/lib/erb/def_method.rb | 47 + .../ruby/3.2.0/gems/erb-5.0.2/lib/erb/util.rb | 76 + .../3.2.0/gems/erb-5.0.2/lib/erb/version.rb | 4 + .../ruby/3.2.0/gems/erb-5.0.2/libexec/erb | 164 + .../ruby/3.2.0/gems/nio4r-2.7.4/changes.md | 332 + .../3.2.0/gems/nio4r-2.7.4/ext/libev/Changes | 617 + .../3.2.0/gems/nio4r-2.7.4/ext/libev/LICENSE | 37 + .../3.2.0/gems/nio4r-2.7.4/ext/libev/README | 59 + .../3.2.0/gems/nio4r-2.7.4/ext/libev/ev.c | 5689 ++++++ .../3.2.0/gems/nio4r-2.7.4/ext/libev/ev.h | 859 + .../gems/nio4r-2.7.4/ext/libev/ev_epoll.c | 298 + .../gems/nio4r-2.7.4/ext/libev/ev_iouring.c | 694 + .../gems/nio4r-2.7.4/ext/libev/ev_kqueue.c | 224 + .../gems/nio4r-2.7.4/ext/libev/ev_linuxaio.c | 620 + .../gems/nio4r-2.7.4/ext/libev/ev_poll.c | 156 + .../gems/nio4r-2.7.4/ext/libev/ev_port.c | 192 + .../gems/nio4r-2.7.4/ext/libev/ev_select.c | 316 + .../gems/nio4r-2.7.4/ext/libev/ev_vars.h | 249 + .../gems/nio4r-2.7.4/ext/libev/ev_win32.c | 162 + .../gems/nio4r-2.7.4/ext/libev/ev_wrap.h | 272 + .../gems/nio4r-2.7.4/ext/nio4r/.clang-format | 16 + .../3.2.0/gems/nio4r-2.7.4/ext/nio4r/Makefile | 269 + .../gems/nio4r-2.7.4/ext/nio4r/bytebuffer.c | 465 + .../gems/nio4r-2.7.4/ext/nio4r/extconf.rb | 53 + .../3.2.0/gems/nio4r-2.7.4/ext/nio4r/libev.h | 7 + .../gems/nio4r-2.7.4/ext/nio4r/monitor.c | 344 + .../3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r.h | 48 + .../gems/nio4r-2.7.4/ext/nio4r/nio4r_ext.c | 24 + .../ext/nio4r/org/nio4r/ByteBuffer.java | 295 + .../ext/nio4r/org/nio4r/Monitor.java | 176 + .../ext/nio4r/org/nio4r/Nio4r.java | 104 + .../ext/nio4r/org/nio4r/Selector.java | 297 + .../gems/nio4r-2.7.4/ext/nio4r/selector.c | 606 + .../ruby/3.2.0/gems/nio4r-2.7.4/lib/nio.rb | 61 + .../gems/nio4r-2.7.4/lib/nio/bytebuffer.rb | 235 + .../3.2.0/gems/nio4r-2.7.4/lib/nio/monitor.rb | 124 + .../gems/nio4r-2.7.4/lib/nio/selector.rb | 188 + .../3.2.0/gems/nio4r-2.7.4/lib/nio/version.rb | 10 + .../ruby/3.2.0/gems/nio4r-2.7.4/lib/nio4r.rb | 7 + .../3.2.0/gems/nio4r-2.7.4/lib/nio4r_ext.so | Bin 0 -> 345376 bytes .../ruby/3.2.0/gems/nio4r-2.7.4/license.md | 80 + .../ruby/3.2.0/gems/nio4r-2.7.4/readme.md | 91 + .../3.2.0/gems/psych-5.2.6/CONTRIBUTING.md | 24 + .../ruby/3.2.0/gems/psych-5.2.6/LICENSE | 21 + .../ruby/3.2.0/gems/psych-5.2.6/README.md | 80 + .../3.2.0/gems/psych-5.2.6/ext/psych/Makefile | 291 + .../3.2.0/gems/psych-5.2.6/ext/psych/depend | 17 + .../gems/psych-5.2.6/ext/psych/extconf.rb | 53 + .../3.2.0/gems/psych-5.2.6/ext/psych/psych.c | 36 + .../3.2.0/gems/psych-5.2.6/ext/psych/psych.h | 17 + .../psych-5.2.6/ext/psych/psych_emitter.c | 589 + .../psych-5.2.6/ext/psych/psych_emitter.h | 8 + .../gems/psych-5.2.6/ext/psych/psych_parser.c | 564 + .../gems/psych-5.2.6/ext/psych/psych_parser.h | 6 + .../psych-5.2.6/ext/psych/psych_to_ruby.c | 48 + .../psych-5.2.6/ext/psych/psych_to_ruby.h | 8 + .../psych-5.2.6/ext/psych/psych_yaml_tree.c | 11 + .../psych-5.2.6/ext/psych/psych_yaml_tree.h | 8 + .../ruby/3.2.0/gems/psych-5.2.6/lib/psych.rb | 793 + .../ruby/3.2.0/gems/psych-5.2.6/lib/psych.so | Bin 0 -> 147880 bytes .../psych-5.2.6/lib/psych/class_loader.rb | 105 + .../3.2.0/gems/psych-5.2.6/lib/psych/coder.rb | 95 + .../gems/psych-5.2.6/lib/psych/core_ext.rb | 40 + .../gems/psych-5.2.6/lib/psych/exception.rb | 28 + .../gems/psych-5.2.6/lib/psych/handler.rb | 255 + .../lib/psych/handlers/document_stream.rb | 23 + .../lib/psych/handlers/recorder.rb | 40 + .../psych-5.2.6/lib/psych/json/ruby_events.rb | 20 + .../gems/psych-5.2.6/lib/psych/json/stream.rb | 17 + .../lib/psych/json/tree_builder.rb | 13 + .../psych-5.2.6/lib/psych/json/yaml_events.rb | 30 + .../3.2.0/gems/psych-5.2.6/lib/psych/nodes.rb | 78 + .../gems/psych-5.2.6/lib/psych/nodes/alias.rb | 21 + .../psych-5.2.6/lib/psych/nodes/document.rb | 63 + .../psych-5.2.6/lib/psych/nodes/mapping.rb | 59 + .../gems/psych-5.2.6/lib/psych/nodes/node.rb | 76 + .../psych-5.2.6/lib/psych/nodes/scalar.rb | 70 + .../psych-5.2.6/lib/psych/nodes/sequence.rb | 84 + .../psych-5.2.6/lib/psych/nodes/stream.rb | 40 + .../3.2.0/gems/psych-5.2.6/lib/psych/omap.rb | 5 + .../gems/psych-5.2.6/lib/psych/parser.rb | 65 + .../psych-5.2.6/lib/psych/scalar_scanner.rb | 141 + .../3.2.0/gems/psych-5.2.6/lib/psych/set.rb | 5 + .../gems/psych-5.2.6/lib/psych/stream.rb | 38 + .../gems/psych-5.2.6/lib/psych/streaming.rb | 28 + .../psych-5.2.6/lib/psych/syntax_error.rb | 22 + .../psych-5.2.6/lib/psych/tree_builder.rb | 137 + .../gems/psych-5.2.6/lib/psych/versions.rb | 10 + .../gems/psych-5.2.6/lib/psych/visitors.rb | 7 + .../lib/psych/visitors/depth_first.rb | 27 + .../psych-5.2.6/lib/psych/visitors/emitter.rb | 52 + .../lib/psych/visitors/json_tree.rb | 25 + .../psych-5.2.6/lib/psych/visitors/to_ruby.rb | 475 + .../psych-5.2.6/lib/psych/visitors/visitor.rb | 34 + .../lib/psych/visitors/yaml_tree.rb | 626 + .../3.2.0/gems/psych-5.2.6/lib/psych/y.rb | 10 + .../ruby/3.2.0/gems/puma-6.6.1/History.md | 3046 +++ .../bundle/ruby/3.2.0/gems/puma-6.6.1/LICENSE | 29 + .../ruby/3.2.0/gems/puma-6.6.1/README.md | 485 + .../ruby/3.2.0/gems/puma-6.6.1/bin/puma | 10 + .../ruby/3.2.0/gems/puma-6.6.1/bin/puma-wild | 25 + .../ruby/3.2.0/gems/puma-6.6.1/bin/pumactl | 12 + .../gems/puma-6.6.1/docs/architecture.md | 74 + .../gems/puma-6.6.1/docs/compile_options.md | 55 + .../3.2.0/gems/puma-6.6.1/docs/deployment.md | 102 + .../3.2.0/gems/puma-6.6.1/docs/fork_worker.md | 41 + .../puma-connection-flow-no-reactor.png | Bin 0 -> 16029 bytes .../docs/images/puma-connection-flow.png | Bin 0 -> 16165 bytes .../docs/images/puma-general-arch.png | Bin 0 -> 13088 bytes .../gems/puma-6.6.1/docs/java_options.md | 54 + .../gems/puma-6.6.1/docs/jungle/README.md | 9 + .../puma-6.6.1/docs/jungle/rc.d/README.md | 74 + .../gems/puma-6.6.1/docs/jungle/rc.d/puma | 61 + .../puma-6.6.1/docs/jungle/rc.d/puma.conf | 10 + .../3.2.0/gems/puma-6.6.1/docs/kubernetes.md | 78 + .../ruby/3.2.0/gems/puma-6.6.1/docs/nginx.md | 80 + .../3.2.0/gems/puma-6.6.1/docs/plugins.md | 42 + .../gems/puma-6.6.1/docs/rails_dev_mode.md | 28 + .../3.2.0/gems/puma-6.6.1/docs/restart.md | 65 + .../3.2.0/gems/puma-6.6.1/docs/signals.md | 98 + .../ruby/3.2.0/gems/puma-6.6.1/docs/stats.md | 147 + .../3.2.0/gems/puma-6.6.1/docs/systemd.md | 253 + .../docs/testing_benchmarks_local_files.md | 150 + .../docs/testing_test_rackup_ci_files.md | 36 + .../gems/puma-6.6.1/ext/puma_http11/Makefile | 269 + .../ext/puma_http11/PumaHttp11Service.java | 17 + .../puma-6.6.1/ext/puma_http11/ext_help.h | 15 + .../puma-6.6.1/ext/puma_http11/extconf.rb | 80 + .../ext/puma_http11/http11_parser.c | 1057 + .../ext/puma_http11/http11_parser.h | 65 + .../ext/puma_http11/http11_parser.java.rl | 145 + .../ext/puma_http11/http11_parser.rl | 149 + .../ext/puma_http11/http11_parser_common.rl | 54 + .../puma-6.6.1/ext/puma_http11/mini_ssl.c | 842 + .../puma_http11/no_ssl/PumaHttp11Service.java | 15 + .../puma_http11/org/jruby/puma/Http11.java | 249 + .../org/jruby/puma/Http11Parser.java | 455 + .../puma_http11/org/jruby/puma/MiniSSL.java | 509 + .../puma-6.6.1/ext/puma_http11/puma_http11.c | 495 + .../ruby/3.2.0/gems/puma-6.6.1/lib/puma.rb | 78 + .../gems/puma-6.6.1/lib/puma/app/status.rb | 96 + .../3.2.0/gems/puma-6.6.1/lib/puma/binder.rb | 509 + .../3.2.0/gems/puma-6.6.1/lib/puma/cli.rb | 247 + .../3.2.0/gems/puma-6.6.1/lib/puma/client.rb | 720 + .../3.2.0/gems/puma-6.6.1/lib/puma/cluster.rb | 634 + .../puma-6.6.1/lib/puma/cluster/worker.rb | 183 + .../lib/puma/cluster/worker_handle.rb | 96 + .../gems/puma-6.6.1/lib/puma/commonlogger.rb | 115 + .../gems/puma-6.6.1/lib/puma/configuration.rb | 407 + .../3.2.0/gems/puma-6.6.1/lib/puma/const.rb | 308 + .../gems/puma-6.6.1/lib/puma/control_cli.rb | 316 + .../3.2.0/gems/puma-6.6.1/lib/puma/detect.rb | 45 + .../3.2.0/gems/puma-6.6.1/lib/puma/dsl.rb | 1438 ++ .../gems/puma-6.6.1/lib/puma/error_logger.rb | 113 + .../3.2.0/gems/puma-6.6.1/lib/puma/events.rb | 57 + .../gems/puma-6.6.1/lib/puma/io_buffer.rb | 46 + .../gems/puma-6.6.1/lib/puma/jruby_restart.rb | 11 + .../puma-6.6.1/lib/puma/json_serialization.rb | 96 + .../gems/puma-6.6.1/lib/puma/launcher.rb | 497 + .../lib/puma/launcher/bundle_pruner.rb | 104 + .../gems/puma-6.6.1/lib/puma/log_writer.rb | 147 + .../3.2.0/gems/puma-6.6.1/lib/puma/minissl.rb | 459 + .../lib/puma/minissl/context_builder.rb | 96 + .../3.2.0/gems/puma-6.6.1/lib/puma/null_io.rb | 101 + .../3.2.0/gems/puma-6.6.1/lib/puma/plugin.rb | 111 + .../puma-6.6.1/lib/puma/plugin/systemd.rb | 90 + .../puma-6.6.1/lib/puma/plugin/tmp_restart.rb | 36 + .../gems/puma-6.6.1/lib/puma/puma_http11.so | Bin 0 -> 141920 bytes .../gems/puma-6.6.1/lib/puma/rack/builder.rb | 297 + .../gems/puma-6.6.1/lib/puma/rack/urlmap.rb | 93 + .../gems/puma-6.6.1/lib/puma/rack_default.rb | 24 + .../3.2.0/gems/puma-6.6.1/lib/puma/reactor.rb | 125 + .../3.2.0/gems/puma-6.6.1/lib/puma/request.rb | 692 + .../3.2.0/gems/puma-6.6.1/lib/puma/runner.rb | 220 + .../gems/puma-6.6.1/lib/puma/sd_notify.rb | 146 + .../3.2.0/gems/puma-6.6.1/lib/puma/server.rb | 688 + .../3.2.0/gems/puma-6.6.1/lib/puma/single.rb | 69 + .../gems/puma-6.6.1/lib/puma/state_file.rb | 68 + .../gems/puma-6.6.1/lib/puma/thread_pool.rb | 446 + .../3.2.0/gems/puma-6.6.1/lib/puma/util.rb | 141 + .../gems/puma-6.6.1/lib/rack/handler/puma.rb | 144 + .../3.2.0/gems/puma-6.6.1/tools/Dockerfile | 18 + .../gems/puma-6.6.1/tools/trickletest.rb | 44 + .../ruby/3.2.0/gems/rack-3.2.0/CHANGELOG.md | 1226 ++ .../3.2.0/gems/rack-3.2.0/CONTRIBUTING.md | 144 + .../ruby/3.2.0/gems/rack-3.2.0/MIT-LICENSE | 20 + .../ruby/3.2.0/gems/rack-3.2.0/README.md | 376 + .../ruby/3.2.0/gems/rack-3.2.0/SPEC.rdoc | 258 + .../ruby/3.2.0/gems/rack-3.2.0/lib/rack.rb | 64 + .../lib/rack/auth/abstract/handler.rb | 41 + .../lib/rack/auth/abstract/request.rb | 51 + .../gems/rack-3.2.0/lib/rack/auth/basic.rb | 58 + .../gems/rack-3.2.0/lib/rack/bad_request.rb | 8 + .../gems/rack-3.2.0/lib/rack/body_proxy.rb | 63 + .../3.2.0/gems/rack-3.2.0/lib/rack/builder.rb | 296 + .../3.2.0/gems/rack-3.2.0/lib/rack/cascade.rb | 67 + .../gems/rack-3.2.0/lib/rack/common_logger.rb | 89 + .../rack-3.2.0/lib/rack/conditional_get.rb | 87 + .../3.2.0/gems/rack-3.2.0/lib/rack/config.rb | 22 + .../gems/rack-3.2.0/lib/rack/constants.rb | 68 + .../rack-3.2.0/lib/rack/content_length.rb | 34 + .../gems/rack-3.2.0/lib/rack/content_type.rb | 33 + .../gems/rack-3.2.0/lib/rack/deflater.rb | 158 + .../gems/rack-3.2.0/lib/rack/directory.rb | 205 + .../3.2.0/gems/rack-3.2.0/lib/rack/etag.rb | 71 + .../3.2.0/gems/rack-3.2.0/lib/rack/events.rb | 157 + .../3.2.0/gems/rack-3.2.0/lib/rack/files.rb | 216 + .../3.2.0/gems/rack-3.2.0/lib/rack/head.rb | 25 + .../3.2.0/gems/rack-3.2.0/lib/rack/headers.rb | 238 + .../3.2.0/gems/rack-3.2.0/lib/rack/lint.rb | 964 + .../3.2.0/gems/rack-3.2.0/lib/rack/lock.rb | 29 + .../gems/rack-3.2.0/lib/rack/media_type.rb | 52 + .../rack-3.2.0/lib/rack/method_override.rb | 56 + .../3.2.0/gems/rack-3.2.0/lib/rack/mime.rb | 694 + .../3.2.0/gems/rack-3.2.0/lib/rack/mock.rb | 3 + .../gems/rack-3.2.0/lib/rack/mock_request.rb | 161 + .../gems/rack-3.2.0/lib/rack/mock_response.rb | 147 + .../gems/rack-3.2.0/lib/rack/multipart.rb | 77 + .../lib/rack/multipart/generator.rb | 99 + .../rack-3.2.0/lib/rack/multipart/parser.rb | 530 + .../lib/rack/multipart/uploaded_file.rb | 82 + .../gems/rack-3.2.0/lib/rack/null_logger.rb | 48 + .../gems/rack-3.2.0/lib/rack/query_parser.rb | 259 + .../gems/rack-3.2.0/lib/rack/recursive.rb | 66 + .../gems/rack-3.2.0/lib/rack/reloader.rb | 112 + .../3.2.0/gems/rack-3.2.0/lib/rack/request.rb | 787 + .../gems/rack-3.2.0/lib/rack/response.rb | 403 + .../rack-3.2.0/lib/rack/rewindable_input.rb | 116 + .../3.2.0/gems/rack-3.2.0/lib/rack/runtime.rb | 35 + .../gems/rack-3.2.0/lib/rack/sendfile.rb | 167 + .../rack-3.2.0/lib/rack/show_exceptions.rb | 409 + .../gems/rack-3.2.0/lib/rack/show_status.rb | 121 + .../3.2.0/gems/rack-3.2.0/lib/rack/static.rb | 188 + .../rack-3.2.0/lib/rack/tempfile_reaper.rb | 33 + .../3.2.0/gems/rack-3.2.0/lib/rack/urlmap.rb | 99 + .../3.2.0/gems/rack-3.2.0/lib/rack/utils.rb | 622 + .../3.2.0/gems/rack-3.2.0/lib/rack/version.rb | 17 + .../3.2.0/gems/rack-test-2.2.0/History.md | 389 + .../gems/rack-test-2.2.0/MIT-LICENSE.txt | 20 + .../ruby/3.2.0/gems/rack-test-2.2.0/README.md | 139 + .../gems/rack-test-2.2.0/lib/rack/test.rb | 382 + .../lib/rack/test/cookie_jar.rb | 251 + .../rack-test-2.2.0/lib/rack/test/methods.rb | 94 + .../lib/rack/test/uploaded_file.rb | 99 + .../rack-test-2.2.0/lib/rack/test/utils.rb | 156 + .../rack-test-2.2.0/lib/rack/test/version.rb | 5 + .../ruby/3.2.0/gems/rackup-2.2.1/bin/rackup | 5 + .../3.2.0/gems/rackup-2.2.1/lib/rackup.rb | 21 + .../gems/rackup-2.2.1/lib/rackup/handler.rb | 113 + .../rackup-2.2.1/lib/rackup/handler/cgi.rb | 61 + .../lib/rackup/handler/webrick.rb | 162 + .../gems/rackup-2.2.1/lib/rackup/lobster.rb | 81 + .../gems/rackup-2.2.1/lib/rackup/server.rb | 462 + .../gems/rackup-2.2.1/lib/rackup/stream.rb | 199 + .../gems/rackup-2.2.1/lib/rackup/version.rb | 8 + .../ruby/3.2.0/gems/rackup-2.2.1/license.md | 80 + .../ruby/3.2.0/gems/rackup-2.2.1/readme.md | 64 + .../ruby/3.2.0/gems/rackup-2.2.1/releases.md | 24 + .../ruby/3.2.0/gems/rackup-2.2.1/security.md | 3 + .../3.2.0/gems/rdoc-6.14.2/CONTRIBUTING.rdoc | 219 + .../3.2.0/gems/rdoc-6.14.2/CVE-2013-0256.rdoc | 49 + .../3.2.0/gems/rdoc-6.14.2/ExampleMarkdown.md | 39 + .../3.2.0/gems/rdoc-6.14.2/ExampleRDoc.rdoc | 210 + .../ruby/3.2.0/gems/rdoc-6.14.2/History.rdoc | 1668 ++ .../ruby/3.2.0/gems/rdoc-6.14.2/LEGAL.rdoc | 50 + .../ruby/3.2.0/gems/rdoc-6.14.2/LICENSE.rdoc | 59 + .../ruby/3.2.0/gems/rdoc-6.14.2/README.rdoc | 144 + .../bundle/ruby/3.2.0/gems/rdoc-6.14.2/RI.md | 842 + .../ruby/3.2.0/gems/rdoc-6.14.2/TODO.rdoc | 60 + .../ruby/3.2.0/gems/rdoc-6.14.2/exe/rdoc | 43 + .../bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/ri | 12 + .../ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc.rb | 211 + .../gems/rdoc-6.14.2/lib/rdoc/code_object.rb | 395 + .../rdoc-6.14.2/lib/rdoc/code_object/alias.rb | 104 + .../lib/rdoc/code_object/anon_class.rb | 10 + .../lib/rdoc/code_object/any_method.rb | 374 + .../rdoc-6.14.2/lib/rdoc/code_object/attr.rb | 172 + .../lib/rdoc/code_object/class_module.rb | 888 + .../lib/rdoc/code_object/constant.rb | 186 + .../lib/rdoc/code_object/context.rb | 1222 ++ .../lib/rdoc/code_object/context/section.rb | 176 + .../lib/rdoc/code_object/extend.rb | 9 + .../lib/rdoc/code_object/ghost_method.rb | 6 + .../lib/rdoc/code_object/include.rb | 9 + .../lib/rdoc/code_object/meta_method.rb | 6 + .../lib/rdoc/code_object/method_attr.rb | 411 + .../rdoc-6.14.2/lib/rdoc/code_object/mixin.rb | 120 + .../lib/rdoc/code_object/normal_class.rb | 92 + .../lib/rdoc/code_object/normal_module.rb | 73 + .../lib/rdoc/code_object/require.rb | 51 + .../lib/rdoc/code_object/single_class.rb | 30 + .../lib/rdoc/code_object/top_level.rb | 273 + .../gems/rdoc-6.14.2/lib/rdoc/code_objects.rb | 5 + .../gems/rdoc-6.14.2/lib/rdoc/comment.rb | 236 + .../rdoc-6.14.2/lib/rdoc/cross_reference.rb | 228 + .../gems/rdoc-6.14.2/lib/rdoc/encoding.rb | 120 + .../gems/rdoc-6.14.2/lib/rdoc/erb_partial.rb | 18 + .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/erbio.rb | 37 + .../gems/rdoc-6.14.2/lib/rdoc/generator.rb | 51 + .../lib/rdoc/generator/darkfish.rb | 812 + .../lib/rdoc/generator/json_index.rb | 284 + .../rdoc-6.14.2/lib/rdoc/generator/markup.rb | 171 + .../rdoc-6.14.2/lib/rdoc/generator/pot.rb | 94 + .../rdoc/generator/pot/message_extractor.rb | 68 + .../rdoc-6.14.2/lib/rdoc/generator/pot/po.rb | 84 + .../lib/rdoc/generator/pot/po_entry.rb | 141 + .../gems/rdoc-6.14.2/lib/rdoc/generator/ri.rb | 30 + .../generator/template/darkfish/_footer.rhtml | 5 + .../generator/template/darkfish/_head.rhtml | 48 + .../template/darkfish/_sidebar_classes.rhtml | 5 + .../template/darkfish/_sidebar_extends.rhtml | 15 + .../template/darkfish/_sidebar_includes.rhtml | 15 + .../darkfish/_sidebar_installed.rhtml | 15 + .../template/darkfish/_sidebar_methods.rhtml | 21 + .../darkfish/_sidebar_navigation.rhtml | 11 + .../template/darkfish/_sidebar_pages.rhtml | 32 + .../template/darkfish/_sidebar_parent.rhtml | 6 + .../template/darkfish/_sidebar_search.rhtml | 14 + .../template/darkfish/_sidebar_sections.rhtml | 11 + .../darkfish/_sidebar_table_of_contents.rhtml | 39 + .../template/darkfish/_sidebar_toggle.rhtml | 3 + .../generator/template/darkfish/class.rhtml | 221 + .../generator/template/darkfish/css/fonts.css | 167 + .../generator/template/darkfish/css/rdoc.css | 683 + .../template/darkfish/fonts/Lato-Light.ttf | Bin 0 -> 94668 bytes .../darkfish/fonts/Lato-LightItalic.ttf | Bin 0 -> 94196 bytes .../template/darkfish/fonts/Lato-Regular.ttf | Bin 0 -> 96184 bytes .../darkfish/fonts/Lato-RegularItalic.ttf | Bin 0 -> 95316 bytes .../darkfish/fonts/SourceCodePro-Bold.ttf | Bin 0 -> 138268 bytes .../darkfish/fonts/SourceCodePro-Regular.ttf | Bin 0 -> 138680 bytes .../template/darkfish/images/add.png | Bin 0 -> 733 bytes .../template/darkfish/images/arrow_up.png | Bin 0 -> 372 bytes .../template/darkfish/images/brick.png | Bin 0 -> 452 bytes .../template/darkfish/images/brick_link.png | Bin 0 -> 764 bytes .../template/darkfish/images/bug.png | Bin 0 -> 774 bytes .../template/darkfish/images/bullet_black.png | Bin 0 -> 211 bytes .../darkfish/images/bullet_toggle_minus.png | Bin 0 -> 207 bytes .../darkfish/images/bullet_toggle_plus.png | Bin 0 -> 209 bytes .../template/darkfish/images/date.png | Bin 0 -> 626 bytes .../template/darkfish/images/delete.png | Bin 0 -> 715 bytes .../template/darkfish/images/find.png | Bin 0 -> 659 bytes .../darkfish/images/loadingAnimation.gif | Bin 0 -> 5886 bytes .../template/darkfish/images/macFFBgHack.png | Bin 0 -> 207 bytes .../template/darkfish/images/package.png | Bin 0 -> 853 bytes .../template/darkfish/images/page_green.png | Bin 0 -> 621 bytes .../darkfish/images/page_white_text.png | Bin 0 -> 342 bytes .../darkfish/images/page_white_width.png | Bin 0 -> 309 bytes .../template/darkfish/images/plugin.png | Bin 0 -> 591 bytes .../template/darkfish/images/ruby.png | Bin 0 -> 592 bytes .../template/darkfish/images/tag_blue.png | Bin 0 -> 1880 bytes .../template/darkfish/images/tag_green.png | Bin 0 -> 613 bytes .../template/darkfish/images/transparent.png | Bin 0 -> 97 bytes .../template/darkfish/images/wrench.png | Bin 0 -> 610 bytes .../darkfish/images/wrench_orange.png | Bin 0 -> 584 bytes .../template/darkfish/images/zoom.png | Bin 0 -> 692 bytes .../generator/template/darkfish/index.rhtml | 23 + .../template/darkfish/js/darkfish.js | 120 + .../generator/template/darkfish/js/search.js | 110 + .../generator/template/darkfish/page.rhtml | 18 + .../template/darkfish/servlet_not_found.rhtml | 20 + .../template/darkfish/servlet_root.rhtml | 65 + .../template/darkfish/table_of_contents.rhtml | 70 + .../template/json_index/js/navigation.js | 105 + .../template/json_index/js/searcher.js | 229 + .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/i18n.rb | 10 + .../gems/rdoc-6.14.2/lib/rdoc/i18n/locale.rb | 102 + .../gems/rdoc-6.14.2/lib/rdoc/i18n/text.rb | 126 + .../rdoc-6.14.2/lib/rdoc/known_classes.rb | 74 + .../gems/rdoc-6.14.2/lib/rdoc/markdown.kpeg | 1289 ++ .../gems/rdoc-6.14.2/lib/rdoc/markdown.rb | 16849 ++++++++++++++++ .../rdoc-6.14.2/lib/rdoc/markdown/entities.rb | 2131 ++ .../lib/rdoc/markdown/literals.kpeg | 21 + .../rdoc-6.14.2/lib/rdoc/markdown/literals.rb | 454 + .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup.rb | 240 + .../lib/rdoc/markup/attr_changer.rb | 22 + .../rdoc-6.14.2/lib/rdoc/markup/attr_span.rb | 35 + .../lib/rdoc/markup/attribute_manager.rb | 405 + .../rdoc-6.14.2/lib/rdoc/markup/attributes.rb | 70 + .../rdoc-6.14.2/lib/rdoc/markup/blank_line.rb | 27 + .../lib/rdoc/markup/block_quote.rb | 14 + .../rdoc-6.14.2/lib/rdoc/markup/document.rb | 164 + .../rdoc-6.14.2/lib/rdoc/markup/formatter.rb | 272 + .../rdoc-6.14.2/lib/rdoc/markup/hard_break.rb | 31 + .../rdoc-6.14.2/lib/rdoc/markup/heading.rb | 84 + .../rdoc-6.14.2/lib/rdoc/markup/include.rb | 42 + .../lib/rdoc/markup/indented_paragraph.rb | 47 + .../gems/rdoc-6.14.2/lib/rdoc/markup/list.rb | 101 + .../rdoc-6.14.2/lib/rdoc/markup/list_item.rb | 99 + .../rdoc-6.14.2/lib/rdoc/markup/paragraph.rb | 28 + .../rdoc-6.14.2/lib/rdoc/markup/parser.rb | 585 + .../lib/rdoc/markup/pre_process.rb | 318 + .../gems/rdoc-6.14.2/lib/rdoc/markup/raw.rb | 69 + .../lib/rdoc/markup/regexp_handling.rb | 40 + .../gems/rdoc-6.14.2/lib/rdoc/markup/rule.rb | 20 + .../gems/rdoc-6.14.2/lib/rdoc/markup/table.rb | 56 + .../rdoc-6.14.2/lib/rdoc/markup/to_ansi.rb | 93 + .../gems/rdoc-6.14.2/lib/rdoc/markup/to_bs.rb | 102 + .../rdoc-6.14.2/lib/rdoc/markup/to_html.rb | 461 + .../lib/rdoc/markup/to_html_crossref.rb | 226 + .../lib/rdoc/markup/to_html_snippet.rb | 287 + .../lib/rdoc/markup/to_joined_paragraph.rb | 46 + .../rdoc-6.14.2/lib/rdoc/markup/to_label.rb | 75 + .../lib/rdoc/markup/to_markdown.rb | 191 + .../rdoc-6.14.2/lib/rdoc/markup/to_rdoc.rb | 353 + .../lib/rdoc/markup/to_table_of_contents.rb | 88 + .../rdoc-6.14.2/lib/rdoc/markup/to_test.rb | 69 + .../rdoc-6.14.2/lib/rdoc/markup/to_tt_only.rb | 120 + .../rdoc-6.14.2/lib/rdoc/markup/verbatim.rb | 83 + .../gems/rdoc-6.14.2/lib/rdoc/options.rb | 1416 ++ .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser.rb | 297 + .../gems/rdoc-6.14.2/lib/rdoc/parser/c.rb | 1257 ++ .../rdoc-6.14.2/lib/rdoc/parser/changelog.rb | 350 + .../rdoc-6.14.2/lib/rdoc/parser/markdown.rb | 22 + .../rdoc-6.14.2/lib/rdoc/parser/prism_ruby.rb | 1092 + .../gems/rdoc-6.14.2/lib/rdoc/parser/rd.rb | 22 + .../lib/rdoc/parser/ripper_state_lex.rb | 302 + .../gems/rdoc-6.14.2/lib/rdoc/parser/ruby.rb | 2378 +++ .../rdoc-6.14.2/lib/rdoc/parser/ruby_tools.rb | 165 + .../rdoc-6.14.2/lib/rdoc/parser/simple.rb | 61 + .../gems/rdoc-6.14.2/lib/rdoc/parser/text.rb | 11 + .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/rd.rb | 99 + .../rdoc-6.14.2/lib/rdoc/rd/block_parser.rb | 1706 ++ .../rdoc-6.14.2/lib/rdoc/rd/block_parser.ry | 643 + .../gems/rdoc-6.14.2/lib/rdoc/rd/inline.rb | 71 + .../rdoc-6.14.2/lib/rdoc/rd/inline_parser.rb | 1854 ++ .../rdoc-6.14.2/lib/rdoc/rd/inline_parser.ry | 593 + .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/rdoc.rb | 551 + .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/ri.rb | 20 + .../gems/rdoc-6.14.2/lib/rdoc/ri/driver.rb | 1566 ++ .../gems/rdoc-6.14.2/lib/rdoc/ri/formatter.rb | 6 + .../gems/rdoc-6.14.2/lib/rdoc/ri/paths.rb | 171 + .../gems/rdoc-6.14.2/lib/rdoc/ri/store.rb | 6 + .../gems/rdoc-6.14.2/lib/rdoc/ri/task.rb | 71 + .../rdoc-6.14.2/lib/rdoc/rubygems_hook.rb | 327 + .../gems/rdoc-6.14.2/lib/rdoc/servlet.rb | 452 + .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/stats.rb | 461 + .../gems/rdoc-6.14.2/lib/rdoc/stats/normal.rb | 58 + .../gems/rdoc-6.14.2/lib/rdoc/stats/quiet.rb | 59 + .../rdoc-6.14.2/lib/rdoc/stats/verbose.rb | 44 + .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/store.rb | 997 + .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/task.rb | 354 + .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/text.rb | 322 + .../gems/rdoc-6.14.2/lib/rdoc/token_stream.rb | 118 + .../gems/rdoc-6.14.2/lib/rdoc/tom_doc.rb | 257 + .../gems/rdoc-6.14.2/lib/rdoc/version.rb | 10 + .../gems/rdoc-6.14.2/lib/rubygems_plugin.rb | 23 + .../ruby/3.2.0/gems/rdoc-6.14.2/man/ri.1 | 249 + .../ruby/3.2.0/gems/rdoc-6.14.2/rdoc.gemspec | 71 + .../ruby/3.2.0/gems/rspec-3.13.1/LICENSE.md | 27 + .../ruby/3.2.0/gems/rspec-3.13.1/README.md | 47 + .../ruby/3.2.0/gems/rspec-3.13.1/lib/rspec.rb | 3 + .../gems/rspec-3.13.1/lib/rspec/version.rb | 5 + .../3.2.0/gems/rspec-core-3.13.5/.document | 5 + .../3.2.0/gems/rspec-core-3.13.5/.yardopts | 8 + .../3.2.0/gems/rspec-core-3.13.5/Changelog.md | 2439 +++ .../3.2.0/gems/rspec-core-3.13.5/LICENSE.md | 26 + .../3.2.0/gems/rspec-core-3.13.5/README.md | 389 + .../3.2.0/gems/rspec-core-3.13.5/exe/rspec | 4 + .../rspec-core-3.13.5/lib/rspec/autorun.rb | 3 + .../gems/rspec-core-3.13.5/lib/rspec/core.rb | 212 + .../lib/rspec/core/backtrace_formatter.rb | 65 + .../lib/rspec/core/bisect/coordinator.rb | 62 + .../rspec/core/bisect/example_minimizer.rb | 173 + .../lib/rspec/core/bisect/fork_runner.rb | 140 + .../lib/rspec/core/bisect/server.rb | 61 + .../lib/rspec/core/bisect/shell_command.rb | 126 + .../lib/rspec/core/bisect/shell_runner.rb | 73 + .../lib/rspec/core/bisect/utilities.rb | 69 + .../lib/rspec/core/configuration.rb | 2419 +++ .../lib/rspec/core/configuration_options.rb | 240 + .../lib/rspec/core/did_you_mean.rb | 52 + .../rspec-core-3.13.5/lib/rspec/core/drb.rb | 120 + .../rspec-core-3.13.5/lib/rspec/core/dsl.rb | 98 + .../lib/rspec/core/example.rb | 666 + .../lib/rspec/core/example_group.rb | 912 + .../rspec/core/example_status_persister.rb | 235 + .../lib/rspec/core/filter_manager.rb | 231 + .../lib/rspec/core/flat_map.rb | 20 + .../lib/rspec/core/formatters.rb | 279 + .../core/formatters/base_bisect_formatter.rb | 45 + .../rspec/core/formatters/base_formatter.rb | 70 + .../core/formatters/base_text_formatter.rb | 75 + .../core/formatters/bisect_drb_formatter.rb | 29 + .../formatters/bisect_progress_formatter.rb | 157 + .../rspec/core/formatters/console_codes.rb | 76 + .../core/formatters/deprecation_formatter.rb | 223 + .../formatters/documentation_formatter.rb | 102 + .../core/formatters/exception_presenter.rb | 553 + .../core/formatters/failure_list_formatter.rb | 23 + .../formatters/fallback_message_formatter.rb | 28 + .../lib/rspec/core/formatters/helpers.rb | 118 + .../rspec/core/formatters/html_formatter.rb | 153 + .../lib/rspec/core/formatters/html_printer.rb | 412 + .../core/formatters/html_snippet_extractor.rb | 122 + .../rspec/core/formatters/json_formatter.rb | 103 + .../core/formatters/profile_formatter.rb | 68 + .../core/formatters/progress_formatter.rb | 29 + .../lib/rspec/core/formatters/protocol.rb | 182 + .../core/formatters/snippet_extractor.rb | 134 + .../core/formatters/syntax_highlighter.rb | 91 + .../rspec-core-3.13.5/lib/rspec/core/hooks.rb | 646 + .../lib/rspec/core/invocations.rb | 87 + .../lib/rspec/core/memoized_helpers.rb | 580 + .../lib/rspec/core/metadata.rb | 498 + .../lib/rspec/core/metadata_filter.rb | 255 + .../rspec/core/minitest_assertions_adapter.rb | 31 + .../rspec/core/mocking_adapters/flexmock.rb | 31 + .../lib/rspec/core/mocking_adapters/mocha.rb | 57 + .../lib/rspec/core/mocking_adapters/null.rb | 14 + .../lib/rspec/core/mocking_adapters/rr.rb | 31 + .../lib/rspec/core/mocking_adapters/rspec.rb | 32 + .../lib/rspec/core/notifications.rb | 523 + .../lib/rspec/core/option_parser.rb | 325 + .../lib/rspec/core/ordering.rb | 208 + .../lib/rspec/core/output_wrapper.rb | 29 + .../lib/rspec/core/pending.rb | 157 + .../lib/rspec/core/profiler.rb | 34 + .../lib/rspec/core/project_initializer.rb | 48 + .../lib/rspec/core/project_initializer/.rspec | 1 + .../project_initializer/spec/spec_helper.rb | 98 + .../lib/rspec/core/rake_task.rb | 190 + .../lib/rspec/core/reporter.rb | 266 + .../lib/rspec/core/ruby_project.rb | 53 + .../lib/rspec/core/runner.rb | 216 + .../lib/rspec/core/sandbox.rb | 37 + .../rspec-core-3.13.5/lib/rspec/core/set.rb | 54 + .../lib/rspec/core/shared_context.rb | 55 + .../lib/rspec/core/shared_example_group.rb | 271 + .../lib/rspec/core/shell_escape.rb | 49 + .../core/test_unit_assertions_adapter.rb | 30 + .../lib/rspec/core/version.rb | 9 + .../lib/rspec/core/warnings.rb | 40 + .../rspec-core-3.13.5/lib/rspec/core/world.rb | 287 + .../gems/rspec-expectations-3.13.5/.document | 5 + .../gems/rspec-expectations-3.13.5/.yardopts | 6 + .../rspec-expectations-3.13.5/Changelog.md | 1366 ++ .../gems/rspec-expectations-3.13.5/LICENSE.md | 25 + .../gems/rspec-expectations-3.13.5/README.md | 326 + .../lib/rspec/expectations.rb | 82 + .../expectations/block_snippet_extractor.rb | 255 + .../lib/rspec/expectations/configuration.rb | 244 + .../rspec/expectations/expectation_target.rb | 163 + .../lib/rspec/expectations/fail_with.rb | 39 + .../rspec/expectations/failure_aggregator.rb | 236 + .../lib/rspec/expectations/handler.rb | 181 + .../expectations/minitest_integration.rb | 58 + .../lib/rspec/expectations/syntax.rb | 132 + .../lib/rspec/expectations/version.rb | 8 + .../lib/rspec/matchers.rb | 1046 + .../lib/rspec/matchers/aliased_matcher.rb | 116 + .../lib/rspec/matchers/built_in.rb | 53 + .../lib/rspec/matchers/built_in/all.rb | 86 + .../rspec/matchers/built_in/base_matcher.rb | 225 + .../lib/rspec/matchers/built_in/be.rb | 191 + .../lib/rspec/matchers/built_in/be_between.rb | 77 + .../rspec/matchers/built_in/be_instance_of.rb | 26 + .../lib/rspec/matchers/built_in/be_kind_of.rb | 20 + .../lib/rspec/matchers/built_in/be_within.rb | 72 + .../lib/rspec/matchers/built_in/change.rb | 452 + .../lib/rspec/matchers/built_in/compound.rb | 293 + .../matchers/built_in/contain_exactly.rb | 312 + .../matchers/built_in/count_expectation.rb | 171 + .../lib/rspec/matchers/built_in/cover.rb | 24 + .../lib/rspec/matchers/built_in/eq.rb | 44 + .../lib/rspec/matchers/built_in/eql.rb | 38 + .../lib/rspec/matchers/built_in/equal.rb | 81 + .../lib/rspec/matchers/built_in/exist.rb | 90 + .../lib/rspec/matchers/built_in/has.rb | 194 + .../matchers/built_in/have_attributes.rb | 114 + .../lib/rspec/matchers/built_in/include.rb | 218 + .../lib/rspec/matchers/built_in/match.rb | 120 + .../lib/rspec/matchers/built_in/operators.rb | 128 + .../lib/rspec/matchers/built_in/output.rb | 207 + .../rspec/matchers/built_in/raise_error.rb | 275 + .../lib/rspec/matchers/built_in/respond_to.rb | 200 + .../lib/rspec/matchers/built_in/satisfy.rb | 62 + .../matchers/built_in/start_or_end_with.rb | 94 + .../rspec/matchers/built_in/throw_symbol.rb | 138 + .../lib/rspec/matchers/built_in/yield.rb | 375 + .../lib/rspec/matchers/composable.rb | 171 + .../lib/rspec/matchers/dsl.rb | 546 + .../lib/rspec/matchers/english_phrasing.rb | 60 + .../lib/rspec/matchers/fail_matchers.rb | 42 + .../rspec/matchers/generated_descriptions.rb | 41 + .../lib/rspec/matchers/matcher_delegator.rb | 61 + .../lib/rspec/matchers/matcher_protocol.rb | 105 + .../lib/rspec/matchers/multi_matcher_diff.rb | 82 + .../3.2.0/gems/rspec-mocks-3.13.5/.document | 5 + .../3.2.0/gems/rspec-mocks-3.13.5/.yardopts | 6 + .../gems/rspec-mocks-3.13.5/Changelog.md | 1329 ++ .../3.2.0/gems/rspec-mocks-3.13.5/LICENSE.md | 25 + .../3.2.0/gems/rspec-mocks-3.13.5/README.md | 465 + .../rspec-mocks-3.13.5/lib/rspec/mocks.rb | 133 + .../lib/rspec/mocks/any_instance.rb | 11 + .../lib/rspec/mocks/any_instance/chain.rb | 111 + .../mocks/any_instance/error_generator.rb | 31 + .../mocks/any_instance/expect_chain_chain.rb | 31 + .../mocks/any_instance/expectation_chain.rb | 50 + .../mocks/any_instance/message_chains.rb | 83 + .../lib/rspec/mocks/any_instance/proxy.rb | 125 + .../lib/rspec/mocks/any_instance/recorder.rb | 299 + .../rspec/mocks/any_instance/stub_chain.rb | 51 + .../mocks/any_instance/stub_chain_chain.rb | 23 + .../lib/rspec/mocks/argument_list_matcher.rb | 117 + .../lib/rspec/mocks/argument_matchers.rb | 366 + .../lib/rspec/mocks/configuration.rb | 212 + .../lib/rspec/mocks/error_generator.rb | 390 + .../lib/rspec/mocks/example_methods.rb | 434 + .../rspec/mocks/instance_method_stasher.rb | 146 + .../lib/rspec/mocks/marshal_extension.rb | 41 + .../matchers/expectation_customization.rb | 20 + .../lib/rspec/mocks/matchers/have_received.rb | 134 + .../lib/rspec/mocks/matchers/receive.rb | 134 + .../mocks/matchers/receive_message_chain.rb | 82 + .../rspec/mocks/matchers/receive_messages.rb | 77 + .../lib/rspec/mocks/message_chain.rb | 87 + .../lib/rspec/mocks/message_expectation.rb | 856 + .../lib/rspec/mocks/method_double.rb | 316 + .../lib/rspec/mocks/method_reference.rb | 214 + .../lib/rspec/mocks/minitest_integration.rb | 68 + .../lib/rspec/mocks/mutate_const.rb | 339 + .../lib/rspec/mocks/object_reference.rb | 149 + .../lib/rspec/mocks/order_group.rb | 81 + .../lib/rspec/mocks/proxy.rb | 517 + .../lib/rspec/mocks/space.rb | 238 + .../lib/rspec/mocks/standalone.rb | 3 + .../lib/rspec/mocks/syntax.rb | 325 + .../lib/rspec/mocks/targets.rb | 124 + .../lib/rspec/mocks/test_double.rb | 173 + .../lib/rspec/mocks/verifying_double.rb | 125 + .../mocks/verifying_message_expectation.rb | 55 + .../lib/rspec/mocks/verifying_proxy.rb | 221 + .../lib/rspec/mocks/version.rb | 9 + .../gems/rspec-support-3.13.5/Changelog.md | 429 + .../gems/rspec-support-3.13.5/LICENSE.md | 23 + .../3.2.0/gems/rspec-support-3.13.5/README.md | 40 + .../rspec-support-3.13.5/lib/rspec/support.rb | 162 + .../lib/rspec/support/caller_filter.rb | 85 + .../lib/rspec/support/comparable_version.rb | 48 + .../lib/rspec/support/differ.rb | 217 + .../lib/rspec/support/directory_maker.rb | 65 + .../lib/rspec/support/encoded_string.rb | 163 + .../lib/rspec/support/fuzzy_matcher.rb | 50 + .../lib/rspec/support/hunk_generator.rb | 49 + .../lib/rspec/support/matcher_definition.rb | 44 + .../support/method_signature_verifier.rb | 467 + .../lib/rspec/support/mutex.rb | 75 + .../lib/rspec/support/object_formatter.rb | 279 + .../rspec/support/recursive_const_methods.rb | 78 + .../lib/rspec/support/reentrant_mutex.rb | 80 + .../lib/rspec/support/ruby_features.rb | 221 + .../lib/rspec/support/source.rb | 87 + .../lib/rspec/support/source/location.rb | 23 + .../lib/rspec/support/source/node.rb | 112 + .../lib/rspec/support/source/token.rb | 96 + .../lib/rspec/support/spec.rb | 84 + .../rspec/support/spec/deprecation_helpers.rb | 50 + .../lib/rspec/support/spec/diff_helpers.rb | 45 + .../rspec/support/spec/formatting_support.rb | 11 + .../lib/rspec/support/spec/in_sub_process.rb | 73 + .../rspec/support/spec/library_wide_checks.rb | 152 + .../lib/rspec/support/spec/shell_out.rb | 115 + .../lib/rspec/support/spec/stderr_splitter.rb | 77 + .../lib/rspec/support/spec/string_matcher.rb | 47 + .../support/spec/with_isolated_directory.rb | 15 + .../support/spec/with_isolated_stderr.rb | 15 + .../lib/rspec/support/version.rb | 9 + .../lib/rspec/support/warnings.rb | 41 + .../support/with_keywords_when_needed.rb | 35 + .../ruby/3.2.0/gems/stringio-3.1.7/.document | 5 + .../3.2.0/gems/stringio-3.1.7/.rdoc_options | 2 + .../ruby/3.2.0/gems/stringio-3.1.7/COPYING | 56 + .../3.2.0/gems/stringio-3.1.7/LICENSE.txt | 22 + .../ruby/3.2.0/gems/stringio-3.1.7/NEWS.md | 243 + .../ruby/3.2.0/gems/stringio-3.1.7/README.md | 45 + .../ruby/3.2.0/gems/stringio-3.1.7/docs/io.rb | 8 + .../stringio-3.1.7/ext/stringio/.document | 1 + .../gems/stringio-3.1.7/ext/stringio/Makefile | 269 + .../stringio-3.1.7/ext/stringio/extconf.rb | 9 + .../stringio-3.1.7/ext/stringio/stringio.c | 2023 ++ .../3.2.0/gems/stringio-3.1.7/lib/stringio.so | Bin 0 -> 184552 bytes .../bundle/ruby/3.2.0/plugins/rdoc_plugin.rb | 1 + .../3.2.0/specifications/date-3.4.1.gemspec | 25 + .../specifications/diff-lcs-1.6.2.gemspec | 35 + .../3.2.0/specifications/erb-5.0.2.gemspec | 27 + .../3.2.0/specifications/nio4r-2.7.4.gemspec | 24 + .../3.2.0/specifications/psych-5.2.6.gemspec | 32 + .../3.2.0/specifications/puma-6.6.1.gemspec | 30 + .../3.2.0/specifications/rack-3.2.0.gemspec | 31 + .../specifications/rack-test-2.2.0.gemspec | 29 + .../3.2.0/specifications/rackup-2.2.1.gemspec | 26 + .../3.2.0/specifications/rdoc-6.14.2.gemspec | 32 + .../3.2.0/specifications/rspec-3.13.1.gemspec | 31 + .../specifications/rspec-core-3.13.5.gemspec | 31 + .../rspec-expectations-3.13.5.gemspec | 29 + .../specifications/rspec-mocks-3.13.5.gemspec | 29 + .../rspec-support-3.13.5.gemspec | 29 + .../specifications/stringio-3.1.7.gemspec | 26 + 897 files changed, 179411 insertions(+) create mode 100644 .bundle/config create mode 100755 vendor/bundle/ruby/3.2.0/bin/erb create mode 100755 vendor/bundle/ruby/3.2.0/bin/htmldiff create mode 100755 vendor/bundle/ruby/3.2.0/bin/ldiff create mode 100755 vendor/bundle/ruby/3.2.0/bin/puma create mode 100755 vendor/bundle/ruby/3.2.0/bin/pumactl create mode 100755 vendor/bundle/ruby/3.2.0/bin/rackup create mode 100755 vendor/bundle/ruby/3.2.0/bin/rdoc create mode 100755 vendor/bundle/ruby/3.2.0/bin/ri create mode 100755 vendor/bundle/ruby/3.2.0/bin/rspec create mode 100644 vendor/bundle/ruby/3.2.0/cache/date-3.4.1.gem create mode 100644 vendor/bundle/ruby/3.2.0/cache/diff-lcs-1.6.2.gem create mode 100644 vendor/bundle/ruby/3.2.0/cache/erb-5.0.2.gem create mode 100644 vendor/bundle/ruby/3.2.0/cache/nio4r-2.7.4.gem create mode 100644 vendor/bundle/ruby/3.2.0/cache/psych-5.2.6.gem create mode 100644 vendor/bundle/ruby/3.2.0/cache/puma-6.6.1.gem create mode 100644 vendor/bundle/ruby/3.2.0/cache/rack-3.2.0.gem create mode 100644 vendor/bundle/ruby/3.2.0/cache/rack-test-2.2.0.gem create mode 100644 vendor/bundle/ruby/3.2.0/cache/rackup-2.2.1.gem create mode 100644 vendor/bundle/ruby/3.2.0/cache/rdoc-6.14.2.gem create mode 100644 vendor/bundle/ruby/3.2.0/cache/rspec-3.13.1.gem create mode 100644 vendor/bundle/ruby/3.2.0/cache/rspec-core-3.13.5.gem create mode 100644 vendor/bundle/ruby/3.2.0/cache/rspec-expectations-3.13.5.gem create mode 100644 vendor/bundle/ruby/3.2.0/cache/rspec-mocks-3.13.5.gem create mode 100644 vendor/bundle/ruby/3.2.0/cache/rspec-support-3.13.5.gem create mode 100644 vendor/bundle/ruby/3.2.0/cache/stringio-3.1.7.gem create mode 100755 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/date-3.4.1/date_core.so create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/date-3.4.1/gem.build_complete create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/date-3.4.1/gem_make.out create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/date-3.4.1/mkmf.log create mode 100755 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/erb/escape.so create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/gem.build_complete create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/gem_make.out create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/mkmf.log create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/gem.build_complete create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/gem_make.out create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/mkmf.log create mode 100755 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/nio4r_ext.so create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/psych-5.2.6/gem.build_complete create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/psych-5.2.6/gem_make.out create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/psych-5.2.6/mkmf.log create mode 100755 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/psych-5.2.6/psych.so create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/puma-6.6.1/gem.build_complete create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/puma-6.6.1/gem_make.out create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/puma-6.6.1/mkmf.log create mode 100755 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/puma-6.6.1/puma/puma_http11.so create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/stringio-3.1.7/gem.build_complete create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/stringio-3.1.7/gem_make.out create mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/stringio-3.1.7/mkmf.log create mode 100755 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/stringio-3.1.7/stringio.so create mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/README.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/Makefile create mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_core.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_parse.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_strftime.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_strptime.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_tmx.h create mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/extconf.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/prereq.mk create mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/zonetab.h create mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/zonetab.list create mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/lib/date.rb create mode 100755 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/lib/date_core.so create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/.rspec create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CHANGELOG.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CODE_OF_CONDUCT.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTING.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTORS.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/LICENCE.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/Manifest.txt create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/README.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/Rakefile create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/SECURITY.md create mode 100755 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/bin/htmldiff create mode 100755 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/bin/ldiff create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/docs/COPYING.txt create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/docs/artistic.txt create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff-lcs.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/array.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/backports.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/block.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/callbacks.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/change.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/htmldiff.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/hunk.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/internals.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/ldiff.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/string.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/version.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/mise.toml create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/change_spec.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/diff_spec.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/123_x create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/456_x create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/aX create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/bXaX create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ds1.csv create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ds2.csv create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/empty create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/file1.bin create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/file2.bin create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/four_lines create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/four_lines_with_missing_new_line create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line1-e create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line1-f create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line2-e create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line2-f create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.chef-e create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.chef-f create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line1-e create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line1-f create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line2-e create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line2-f create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-c create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-e create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-f create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-u create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1 create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-c create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-e create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-f create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-u create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2 create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-c create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-e create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-f create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-u create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-c create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-e create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-f create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-u create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2 create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-c create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-d create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-e create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-f create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-u create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-c create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-e create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-f create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-u create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-c create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-e create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-f create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-u create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-c create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-e create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-f create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-u create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1 create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-c create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-e create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-f create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-u create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2 create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-c create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-e create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-f create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-u create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/new-chef create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/new-chef2 create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/old-chef create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/old-chef2 create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/hunk_spec.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/issues_spec.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/lcs_spec.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/ldiff_spec.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/patch_spec.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/sdiff_spec.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/spec_helper.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/traverse_balanced_spec.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/traverse_sequences_spec.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.document create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.github/dependabot.yml create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.github/workflows/test.yml create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.gitignore create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.rdoc_options create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/BDSL create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/COPYING create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/Gemfile create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/LICENSE.txt create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/NEWS.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/README.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/Rakefile create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/_doc/cgi.rb create mode 100755 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/bin/console create mode 100755 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/bin/setup create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/erb.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/Makefile create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/escape.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/extconf.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/compiler.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/def_method.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/util.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/version.rb create mode 100755 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/libexec/erb create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/changes.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/Changes create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/LICENSE create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/README create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev.h create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_epoll.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_iouring.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_kqueue.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_linuxaio.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_poll.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_port.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_select.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_vars.h create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_win32.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_wrap.h create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/.clang-format create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/Makefile create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/bytebuffer.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/extconf.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/libev.h create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/monitor.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r.h create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r_ext.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/ByteBuffer.java create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Monitor.java create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Nio4r.java create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Selector.java create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/selector.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/bytebuffer.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/monitor.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/selector.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/version.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio4r.rb create mode 100755 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio4r_ext.so create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/license.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/readme.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/CONTRIBUTING.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/LICENSE create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/README.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/Makefile create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/depend create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/extconf.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych.h create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_emitter.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_emitter.h create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_parser.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_parser.h create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_to_ruby.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_to_ruby.h create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_yaml_tree.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_yaml_tree.h create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych.rb create mode 100755 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych.so create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/class_loader.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/coder.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/core_ext.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/exception.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handler.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handlers/document_stream.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handlers/recorder.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/ruby_events.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/stream.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/tree_builder.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/yaml_events.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/alias.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/document.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/mapping.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/node.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/scalar.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/sequence.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/stream.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/omap.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/parser.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/scalar_scanner.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/set.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/stream.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/streaming.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/syntax_error.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/tree_builder.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/versions.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/depth_first.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/emitter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/json_tree.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/to_ruby.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/visitor.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/yaml_tree.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/y.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/History.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/LICENSE create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/README.md create mode 100755 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/puma create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/puma-wild create mode 100755 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/pumactl create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/architecture.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/compile_options.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/deployment.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/fork_worker.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/images/puma-connection-flow-no-reactor.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/images/puma-connection-flow.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/images/puma-general-arch.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/java_options.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/README.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/README.md create mode 100755 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/puma create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/puma.conf create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/kubernetes.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/nginx.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/plugins.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/rails_dev_mode.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/restart.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/signals.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/stats.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/systemd.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/testing_benchmarks_local_files.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/testing_test_rackup_ci_files.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/Makefile create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/PumaHttp11Service.java create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/ext_help.h create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/extconf.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.h create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.java.rl create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.rl create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser_common.rl create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/mini_ssl.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/no_ssl/PumaHttp11Service.java create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/Http11.java create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/Http11Parser.java create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/MiniSSL.java create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/puma_http11.c create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/app/status.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/binder.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cli.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/client.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster/worker.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster/worker_handle.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/commonlogger.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/configuration.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/const.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/control_cli.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/detect.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/dsl.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/error_logger.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/events.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/io_buffer.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/jruby_restart.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/json_serialization.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/launcher.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/launcher/bundle_pruner.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/log_writer.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/minissl.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/minissl/context_builder.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/null_io.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin/systemd.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin/tmp_restart.rb create mode 100755 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/puma_http11.so create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack/builder.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack/urlmap.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack_default.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/reactor.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/request.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/runner.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/sd_notify.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/server.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/single.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/state_file.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/thread_pool.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/util.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/rack/handler/puma.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/tools/Dockerfile create mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/tools/trickletest.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/CHANGELOG.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/CONTRIBUTING.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/MIT-LICENSE create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/README.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/SPEC.rdoc create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/abstract/handler.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/abstract/request.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/basic.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/bad_request.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/body_proxy.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/builder.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/cascade.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/common_logger.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/conditional_get.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/config.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/constants.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/content_length.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/content_type.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/deflater.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/directory.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/etag.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/events.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/files.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/head.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/headers.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/lint.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/lock.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/media_type.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/method_override.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mime.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock_request.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock_response.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/generator.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/parser.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/uploaded_file.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/null_logger.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/query_parser.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/recursive.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/reloader.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/request.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/response.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/rewindable_input.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/runtime.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/sendfile.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/show_exceptions.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/show_status.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/static.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/tempfile_reaper.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/urlmap.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/utils.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/version.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/History.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/MIT-LICENSE.txt create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/README.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/cookie_jar.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/methods.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/uploaded_file.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/utils.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/version.rb create mode 100755 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/bin/rackup create mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler/cgi.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler/webrick.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/lobster.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/server.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/stream.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/version.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/license.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/readme.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/releases.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/security.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/CONTRIBUTING.rdoc create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/CVE-2013-0256.rdoc create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/ExampleMarkdown.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/ExampleRDoc.rdoc create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/History.rdoc create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/LEGAL.rdoc create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/LICENSE.rdoc create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/README.rdoc create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/RI.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/TODO.rdoc create mode 100755 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/rdoc create mode 100755 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/ri create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/alias.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/anon_class.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/any_method.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/attr.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/class_module.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/constant.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/context.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/context/section.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/extend.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/ghost_method.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/include.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/meta_method.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/method_attr.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/mixin.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/normal_class.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/normal_module.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/require.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/single_class.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/top_level.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_objects.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/comment.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/cross_reference.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/encoding.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/erb_partial.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/erbio.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/darkfish.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/json_index.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/markup.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/message_extractor.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/po.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/po_entry.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/ri.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_footer.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_head.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_navigation.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_toggle.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/class.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/css/fonts.css create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/css/rdoc.css create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-Light.ttf create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-LightItalic.ttf create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-Regular.ttf create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-RegularItalic.ttf create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Bold.ttf create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Regular.ttf create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/add.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/arrow_up.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/brick.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/brick_link.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/bug.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/bullet_black.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/bullet_toggle_minus.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/bullet_toggle_plus.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/date.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/delete.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/find.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/loadingAnimation.gif create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/macFFBgHack.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/package.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/page_green.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/page_white_text.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/page_white_width.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/plugin.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/ruby.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/tag_blue.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/tag_green.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/transparent.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/wrench.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/wrench_orange.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/zoom.png create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/index.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/js/darkfish.js create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/js/search.js create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/page.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/servlet_not_found.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/servlet_root.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/json_index/js/navigation.js create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/json_index/js/searcher.js create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/i18n.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/i18n/locale.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/i18n/text.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/known_classes.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markdown.kpeg create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markdown.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markdown/entities.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markdown/literals.kpeg create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markdown/literals.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/attr_changer.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/attr_span.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/attribute_manager.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/attributes.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/blank_line.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/block_quote.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/document.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/hard_break.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/heading.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/include.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/indented_paragraph.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/list.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/list_item.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/paragraph.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/parser.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/pre_process.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/raw.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/regexp_handling.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/rule.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/table.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_ansi.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_bs.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_html.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_html_crossref.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_html_snippet.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_joined_paragraph.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_label.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_markdown.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_rdoc.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_table_of_contents.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_test.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_tt_only.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/verbatim.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/options.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/c.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/changelog.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/markdown.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/prism_ruby.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/rd.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/ripper_state_lex.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/ruby.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/ruby_tools.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/simple.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/text.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/rd.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/rd/block_parser.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/rd/block_parser.ry create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/rd/inline.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/rd/inline_parser.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/rd/inline_parser.ry create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/rdoc.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/ri.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/ri/driver.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/ri/formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/ri/paths.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/ri/store.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/ri/task.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/rubygems_hook.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/servlet.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/stats.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/stats/normal.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/stats/quiet.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/stats/verbose.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/store.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/task.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/text.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/token_stream.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/tom_doc.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/version.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rubygems_plugin.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/man/ri.1 create mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/rdoc.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-3.13.1/LICENSE.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-3.13.1/README.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-3.13.1/lib/rspec.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-3.13.1/lib/rspec/version.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/.document create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/.yardopts create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/Changelog.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/LICENSE.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/README.md create mode 100755 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/exe/rspec create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/autorun.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/backtrace_formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/bisect/coordinator.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/bisect/example_minimizer.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/bisect/fork_runner.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/bisect/server.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/bisect/shell_command.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/bisect/shell_runner.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/bisect/utilities.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/configuration.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/configuration_options.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/did_you_mean.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/drb.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/dsl.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/example.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/example_group.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/example_status_persister.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/filter_manager.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/flat_map.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/base_bisect_formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/base_formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/base_text_formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/bisect_drb_formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/bisect_progress_formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/console_codes.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/deprecation_formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/documentation_formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/exception_presenter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/failure_list_formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/fallback_message_formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/helpers.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/html_formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/html_printer.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/html_snippet_extractor.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/json_formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/profile_formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/progress_formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/protocol.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/snippet_extractor.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/syntax_highlighter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/hooks.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/invocations.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/memoized_helpers.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/metadata.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/metadata_filter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/minitest_assertions_adapter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/flexmock.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/mocha.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/null.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/rr.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/rspec.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/notifications.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/option_parser.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/ordering.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/output_wrapper.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/pending.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/profiler.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer/.rspec create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer/spec/spec_helper.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/rake_task.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/reporter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/ruby_project.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/runner.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/sandbox.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/set.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shared_context.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shared_example_group.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shell_escape.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/test_unit_assertions_adapter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/version.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/warnings.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/world.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/.document create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/.yardopts create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/Changelog.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/LICENSE.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/README.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/block_snippet_extractor.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/configuration.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/expectation_target.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/fail_with.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/failure_aggregator.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/handler.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/minitest_integration.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/syntax.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/version.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/aliased_matcher.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/all.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/base_matcher.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_between.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_instance_of.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_kind_of.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_within.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/change.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/compound.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/contain_exactly.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/count_expectation.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/cover.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/eq.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/eql.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/equal.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/exist.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/has.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/have_attributes.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/include.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/match.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/operators.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/output.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/raise_error.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/respond_to.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/satisfy.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/start_or_end_with.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/throw_symbol.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/yield.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/composable.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/dsl.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/english_phrasing.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/fail_matchers.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/generated_descriptions.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/matcher_delegator.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/matcher_protocol.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/multi_matcher_diff.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/.document create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/.yardopts create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/Changelog.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/LICENSE.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/README.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/chain.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/error_generator.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/expect_chain_chain.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/expectation_chain.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/message_chains.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/proxy.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/recorder.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/stub_chain.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/stub_chain_chain.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/argument_list_matcher.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/argument_matchers.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/configuration.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/error_generator.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/example_methods.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/instance_method_stasher.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/marshal_extension.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/expectation_customization.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/have_received.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive_message_chain.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive_messages.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/message_chain.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/message_expectation.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/method_double.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/method_reference.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/minitest_integration.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/mutate_const.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/object_reference.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/order_group.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/proxy.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/space.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/standalone.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/syntax.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/targets.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/test_double.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_double.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_message_expectation.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_proxy.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/version.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/Changelog.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/LICENSE.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/README.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/caller_filter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/comparable_version.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/differ.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/directory_maker.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/encoded_string.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/fuzzy_matcher.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/hunk_generator.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/matcher_definition.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/method_signature_verifier.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/mutex.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/object_formatter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/recursive_const_methods.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/reentrant_mutex.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/ruby_features.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/location.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/node.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/token.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/deprecation_helpers.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/diff_helpers.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/formatting_support.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/in_sub_process.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/library_wide_checks.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/shell_out.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/stderr_splitter.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/string_matcher.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/with_isolated_directory.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/with_isolated_stderr.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/version.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/warnings.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/with_keywords_when_needed.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/.document create mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/.rdoc_options create mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/COPYING create mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/LICENSE.txt create mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/NEWS.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/README.md create mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/docs/io.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/.document create mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/Makefile create mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/extconf.rb create mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/stringio.c create mode 100755 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/lib/stringio.so create mode 100644 vendor/bundle/ruby/3.2.0/plugins/rdoc_plugin.rb create mode 100644 vendor/bundle/ruby/3.2.0/specifications/date-3.4.1.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/specifications/diff-lcs-1.6.2.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/specifications/erb-5.0.2.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/specifications/nio4r-2.7.4.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/specifications/psych-5.2.6.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/specifications/puma-6.6.1.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/specifications/rack-3.2.0.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/specifications/rack-test-2.2.0.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/specifications/rackup-2.2.1.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/specifications/rdoc-6.14.2.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/specifications/rspec-3.13.1.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/specifications/rspec-core-3.13.5.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/specifications/rspec-expectations-3.13.5.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/specifications/rspec-mocks-3.13.5.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/specifications/rspec-support-3.13.5.gemspec create mode 100644 vendor/bundle/ruby/3.2.0/specifications/stringio-3.1.7.gemspec diff --git a/.bundle/config b/.bundle/config new file mode 100644 index 0000000..2369228 --- /dev/null +++ b/.bundle/config @@ -0,0 +1,2 @@ +--- +BUNDLE_PATH: "vendor/bundle" diff --git a/vendor/bundle/ruby/3.2.0/bin/erb b/vendor/bundle/ruby/3.2.0/bin/erb new file mode 100755 index 0000000..6c0716b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/bin/erb @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby3.2 +# +# This file was generated by RubyGems. +# +# The application 'erb' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('erb', 'erb', version) +else +gem "erb", version +load Gem.bin_path("erb", "erb", version) +end diff --git a/vendor/bundle/ruby/3.2.0/bin/htmldiff b/vendor/bundle/ruby/3.2.0/bin/htmldiff new file mode 100755 index 0000000..58aadf2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/bin/htmldiff @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby3.2 +# +# This file was generated by RubyGems. +# +# The application 'diff-lcs' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('diff-lcs', 'htmldiff', version) +else +gem "diff-lcs", version +load Gem.bin_path("diff-lcs", "htmldiff", version) +end diff --git a/vendor/bundle/ruby/3.2.0/bin/ldiff b/vendor/bundle/ruby/3.2.0/bin/ldiff new file mode 100755 index 0000000..7a54829 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/bin/ldiff @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby3.2 +# +# This file was generated by RubyGems. +# +# The application 'diff-lcs' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('diff-lcs', 'ldiff', version) +else +gem "diff-lcs", version +load Gem.bin_path("diff-lcs", "ldiff", version) +end diff --git a/vendor/bundle/ruby/3.2.0/bin/puma b/vendor/bundle/ruby/3.2.0/bin/puma new file mode 100755 index 0000000..0e02bd6 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/bin/puma @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby3.2 +# +# This file was generated by RubyGems. +# +# The application 'puma' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('puma', 'puma', version) +else +gem "puma", version +load Gem.bin_path("puma", "puma", version) +end diff --git a/vendor/bundle/ruby/3.2.0/bin/pumactl b/vendor/bundle/ruby/3.2.0/bin/pumactl new file mode 100755 index 0000000..04456dd --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/bin/pumactl @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby3.2 +# +# This file was generated by RubyGems. +# +# The application 'puma' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('puma', 'pumactl', version) +else +gem "puma", version +load Gem.bin_path("puma", "pumactl", version) +end diff --git a/vendor/bundle/ruby/3.2.0/bin/rackup b/vendor/bundle/ruby/3.2.0/bin/rackup new file mode 100755 index 0000000..387be6e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/bin/rackup @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby3.2 +# +# This file was generated by RubyGems. +# +# The application 'rackup' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('rackup', 'rackup', version) +else +gem "rackup", version +load Gem.bin_path("rackup", "rackup", version) +end diff --git a/vendor/bundle/ruby/3.2.0/bin/rdoc b/vendor/bundle/ruby/3.2.0/bin/rdoc new file mode 100755 index 0000000..ea3f386 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/bin/rdoc @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby3.2 +# +# This file was generated by RubyGems. +# +# The application 'rdoc' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('rdoc', 'rdoc', version) +else +gem "rdoc", version +load Gem.bin_path("rdoc", "rdoc", version) +end diff --git a/vendor/bundle/ruby/3.2.0/bin/ri b/vendor/bundle/ruby/3.2.0/bin/ri new file mode 100755 index 0000000..8ccc297 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/bin/ri @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby3.2 +# +# This file was generated by RubyGems. +# +# The application 'rdoc' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('rdoc', 'ri', version) +else +gem "rdoc", version +load Gem.bin_path("rdoc", "ri", version) +end diff --git a/vendor/bundle/ruby/3.2.0/bin/rspec b/vendor/bundle/ruby/3.2.0/bin/rspec new file mode 100755 index 0000000..b8bf169 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/bin/rspec @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby3.2 +# +# This file was generated by RubyGems. +# +# The application 'rspec-core' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +Gem.use_gemdeps + +version = ">= 0.a" + +str = ARGV.first +if str + str = str.b[/\A_(.*)_\z/, 1] + if str and Gem::Version.correct?(str) + version = str + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('rspec-core', 'rspec', version) +else +gem "rspec-core", version +load Gem.bin_path("rspec-core", "rspec", version) +end diff --git a/vendor/bundle/ruby/3.2.0/cache/date-3.4.1.gem b/vendor/bundle/ruby/3.2.0/cache/date-3.4.1.gem new file mode 100644 index 0000000000000000000000000000000000000000..fe7bd0ad608a57f49b138081290d00040647c9e6 GIT binary patch literal 76800 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

Q(OtGnKqe=WiyFbr;u z30Bx)_wK&DN0%e8nat$~8p5QHk%%W@%FcsPDsM%s@ut=&4nns}?&%4}pw-c`)_5;# z&V>mL%{?7)_g)P^`LTX?Sijr5C*DQ;{Rt|~oo754;S?WoVBaZ)Y{0ejR6h*aOSWl=4bsGIG?lr zS5FCMri(rEHq&ThE|#KZdeqF1b2r2D+Zz&=kJy5aNHK|6w@R^TF!(?+wJP7ff4#qZAg+15 z*ge|IUi;pA8lF^jbX)5xI_?hn3Q8GD-o{PE5JSd7uK!f52EiFHh zin~TXIdTGv?TkZM=zZx-IU;&g5eDNmXsrB<7t6+u^!klZ;{;TGLI_%z;z-C0gLZl6HwyeI-iCChM32~^82KkS zIbFBv>G89JWE?(yaQy5Ee*q*)*)SZRCOzo8o1DZjb08&%r(`iu5H!o!Jf4hM#3Ryz z{tg(eum$6UA_bDYk+C#Z-kpbC9u&66xY;2_FI~a*Z`l(0Y7iWUgSr948t-vU0P#T( zXTPsdH7pdY)}KmDX#j~3V|qL#oeYQ=llXiT_M+}M0REt$dbo@g^}zC)q{vT>oe;$U zc+gv4#NBm$S}7i4p|-1Ev!!^PmHDF%Rk zDs{u|e3T}Swi-{9gYB)&2T^R;>HCvBbEpHyG5d7uM{1~NIjkW<# zkxL+9mrg;xA264_SrgHJg-Zm=V;n>=4?fL)-+%X(VXs25j>S`gH>et+hc)a$=|xg| zQJ3C>PCsbL*b|n9h$xJvAn--I%5y1h&AOnG`O=B+#YIg^Wfuw~5X?c3t$EX?p#*aQ z>rg_zket)ft-xzHq?+GXH(d3M0cvt-nWbqnbk^3K)4aUyM$6xF8Wha}cM{~=OkbRB z;F&-r*1@&r&AgUD%a}u-!z8$d)^Bb*3(@Xse3|lJP{+&hxG61Ppg5&szg@+N4{LBw zjr`8Tm(LmYDkR1YN(yLs4OXXn1Nq-GjHcv z1Jk0I|473w|A9wYcAl+>&LDvYb%V^C*0&Pr1@x`N`%Bfg26LC`TYDZj`qmlyKUw|$ zd)GgX-0O^XF8)KfHOZ-bjW?J>Q&G zAeTCk26FRl$=sA$)1WS(*fjKCs%o>Cr%buIoVI{FiTwB(G}_IvXAyU1ne#8CXS|GE zqG_(l&;Pi1H?C*&hYGv}y7hW9=?he@$TNQ%2Uv~HXHc)| zDA8wCuix&!V?QwL_m*S`bg=fr8g{Uls+DBXi@D!4+v|7r3pk0ITB+8#WVFd>w4ZBp1tzyY4mRf>e^jgBt{&qEx`WxL%gfeISHL?{sJsM(0Z_Y@K(JC z>qc(##!%!h;WG97YBr&gdIX$D5K?6zw zx_!YzGJzh&Q`3^G3IjjVd<3{xSDA{L3{#!n?c|4*cC)PR-KHk za;{&Sz*j}&J!eO5U^!Et;y1o`!s|#&4pZ%C$XgZOLr=U|lF`M-N*9-?>ZL##RmYZ5 zC7y+mqb|xxRjNu$)#~U|RUF33D9kxsWzw{ec@)rBWl3qLQ!+A7XC>LfCq~OCwsn?> zTr4y3b6bUndH-&&^WE$!#@P*mxF{SZ_Um zX+r1vMs$%X7&yy9cqKak$1;hNVFcCLx068>#H5qr$?!NFtur2|0M|B@nxb|@0l7jd zqZ0H!PEx!ec08rlxy7c}LzsMQNiX2EYVF!aZL_vjySMi6UKN2}`fBGHt2CPrw;s1! zk6O)#4>le(8r6a(TD7KVqh8vEpFslo`gs9=7(+0m3VeJ%6^y`e-XRz!Fr*PsuwX3c zVxBP^w>K6;Nyyd)ka6?T0z*;IM9xSI=N^jTEMp-@0;7YRgd@*D6tn;3X#$qKOKKVm zFQqZQ0fn!24yd)ll!JtE!bY`LTu$w)&f@<%ph(N<&CS-sM;pAXe+ULQKLV}CkDFVK zq7fjwv1kma#FJtisS&xQff>APMHPmU_#Zx++!V#BY@>)C^nmgFf`Gq!Tqp$Sxu!y- zv4CI$zO4c_Ee|(SX|Augx3;QfB*7L4$9CbMW4U>dltVk@HOcz4o$LZ1z2Odp$6EG}nN zIbtG6ncG-j->Po2caxa7BE?Pp!U3Lfd>0?y%NaCJO5pwr5yog{3+&gKm(HO{8$4xlwEqEshzVp>tuz`@1R3 zngy7RCthnoVQR$}e+gec9gKyP2bK#J? zgzCM!Gxgj8-w!sPxX#(;kUQFERd#2GnOaLf21e8pb-Egoae_-BL%kAEW7?}!Z=%T# zV&mEDGb(x!jm8r&lhYGX8>nz+XNccbB!g&RmA`@=r-s)uw3lKKbllO-fNVbP$-{+~ zm>;y~R%m`u3Cr$iwF^BuvNvjMqsBICF#LR5j|`8(6$>o3nBhS+%RKw2Y{epqC*#mY zbo23Ch+-e*z6F$8(6f(9*Dr7vv=B>i?BhCEVjtyZB%X9y2urM3j^#C%FB~$E4|SbI z44X#ln?$8~mov;N^EuyXzZ1oZa)p}|V#Ao@dN!H#Bg&2i_M4{7F{CDRv_s~n=W&gZ1MjHw?`WwDhq3t4eVw7SlF%;Q>==vJ9h zf?-)NtqiNQ#_(M%9R5+yYoTgWFGD+J<{2dJ8pTBahGklEHA~43 zb&XIw&qId{=@buSB5!$(+Ev7J6%kz>^>R66)FaRQagmy*dtbm8{Xr6p^N%j@a`HB! zJKbm*6zEE)Lt+?_J|04x*2JS4*jm`*m%{i<4iUYpfwi!;^B_&dQ=G^kUw!PAUd*al zkAs@Gv^b=CN0YWuo9hkp-c+xWR@d?Dskq366T04P)SH_tvv$09@apyM!HdGK+gr_6 zt5wqV!_8K`@wndHSSeasl-<5M#5dyhcMqzfH)^H6FDPDGpWi>KYEY@ZQT>Kqkj$~Z zu*f{(?#0)yTj1YShLZI;D_if|!NeSiDKm-D5=2bl{{g#yWj+*WZAxA7lXqA0yd^)a znLTrPB~Dn1)0|iGNTn#xPd{Gq!;UhIA9%ddM^RUI*#FQe-{<@P*?;Xj&39!S1I>e@ zYs1ks;NailXs6DPtm6FirUiA^2X)tgx}w3BCzXwWouAyXz(dk7P?=$<>FWw*Bcjei zUg42Nb8so)il3eZp!pl*=}Bi?m3JgQWlu+5SqC9=+wA7InR`76FS^o&Hj}F%!-MQa zGJpmkNu0l);8P>=S{wYoYM-TURv-@{6ZGr_W9x#Pc@=nao-f=raGvYEALvdm7V+Ne zrE}kjTI-@)y~aDq)ZiKy>4vawI6|{wU8C(aY-?8Pe9UShMH=fGWJ_MjLSAe5Rz;Qu zXwF+b>gJB;rcT~%oaTys>n3w&#(FsM8Ez?f?#MX&;bT_5&PS#5mBpMLsT^ z`ELRhKCRYET*3tr5p#A1Kkz0{Q5Mm9xv#Y#LfYus_G!GN@6&iFE)vxZShyjyXJ2)= zl5Y)L>PjaFjYY13qqH#XN?kNb`rGAd%32p9J!OMfq@>KdxFz~3>2rOhZsX0aufT*h z0R2hC%4&Sb1`&QSIUnFFE@4W8Nl(pvClg8$g#ul%^*4Njc`JlhI)_6=U7PZyfjmykOKYq7Y z;q5thnvXg!_kRF~_KCWIZ{D}1_t6tv2oWC$2ETucU;N_Y5cf*ul`c$1yB=C?y?%S} zO7yy|Z`Zxp|4#*^@$)yG@AeM&-@XucEO}e~PSERB=<=!xIFcz(_ZqR2H*a6qS?XS< zahY$7SNG@^<s!)jl&ZRduL7YPnK-xccNZ&!As~VZOmm+i)J9o3_Lf{ z?+lY(L7l3JM2c|B60tw{?5@+*>5Ooo(-iYc2Yw5C4#}W`4j@QX1!+cb3LZ2? zp)Nyr`fb$z5jg({oIgq6ynOw3_ejedv803|CaJM8J`SwpPKq%owjH^IF)1W3C&2B8 z)L@75l|a#~p0H;y%V!Zz_$zVdASQxH=~n=@RRGRv`c8k4B%=x>vj;g=i5*da!3 z6rOG*2tkji#t6%$zJ$Q(24ezIqjJu3VB{`CRCRi+^ub)swRaMB-;K<&olAiw6)?xa zgsKZ1 zheiYjn`y0FP;`8dbod_)BklwnFmjMHoM+R*8#u^pam{YAp3~yrONr;jB^ru#s~b`3 zG)Zk0IW%|vudUg0w&mC#re-nY-&Akh0`TA{V;`AGimo+334Ap0ra9WwLNpso$MhF9ldcia){LfY=u7Wp{ojC4Bj*O^)~&{n<`?Z#YIsIuo2d+BI; z9!d-RsB^e`wEy;CS6OY&LPSF(pCsdiuRd@r9^A(bwE-KSf_^wT#pMsnhLFvA+!h|P zYV3F~G@Rz-p^ync4jVH?4+_{LaEDTwFiRGw*_r;u_(fwXTkH-=f;c`DbuiX7npID$ zcD`&$z9YCT3*tt46^hR3HdoIr=mP#@fBa*A{9}K7X8YrBZhHLvtd8s@K%UTn@%%viA;pzd^`R2d;l#!Ap|h7Baa@Z(qmfSBftBZ>HappZiaVn~J#oM|IV`id^$_QpNi+ggvpkXn%qq)L3@@7%*+7rm zFMQ~HH6y&h17T|IjYsgEt3lcQW@Bf&#`Nn5hq@j{F-t>zvYM_$ME!m^3NbX+aX7vV!_GuFtoP zUbM&U2hP3$VYFXqw;wdCrQqd6Mzlbcx8QQ`M$WJS4s+v-&SjZSnY>jcm6J#9%(Vxu zYyrJ7&zr=(Y+917J3HIeYR<}dZc}n`x9(Z<)~%I${bla8+!M_6xpM(@9N1EE5{Fk~ zl4GdAo7LIQ(5*RV=hou2^@5{DqK7#T8pSi7EQ+hnNusB8kSI2^P1C*ykfmB&aBK(! z$i>_gs?S3q)x(!YAwIdwNrY$BuEvEYz%ws9jly$0W5=aFUHnZ3gX9vwtk6frZz=Wo z?H7GbW<{UlSuue#Z^`JRP%FiUwXennXFMJ525VmwzF$3f|N3=}iBmnfL}Sl@Ue_d= zsD}K-quZqn-$NR0Q;O$6n(v;dK~;pQDXtV*)M{&j=2on?st%bO^`;yNto!|`Fdx!j z$fG3nl8}c14zD86%Xoi_LURJ*gicLf%>);2tV8*c9;aA-DVyM8KyxXiZT zNnp}W^}`7*eL{6uL#K5lpQdoHPh{_kjis62u5gdU4JK-=f3~W)5FkAGY}iV=%&QAX zH*Hp{dHRLp7%sI~EBXp1(N z`FZFSXbWAlzU9I1Gii&qDYP31P0O&6TshosJ~N9p`Cr8%dzOxcwxHH#)D}p$GDVeh zqkkrCk>ihL=dDmac}`WKJ4MVktGn*)jdS;AD**B8xGnH6HRO3L_bE)r(gY-SSbzP@OVD9$T62_l0UQ=DWuUMProJ4%@D!`3St^TPEkK5KVG_eyXM-P@7qH_YC+bdC@fAEM9 zJJ1Z1PpQA1jL#=y-T8_(Ay%xEb|z&rlkzZ=^2kkTHZmzKkz!fDG25e23dTTR3LPWZ z3J6az1`48QA~EKivj(H{H|n&%*)4ylou;#BVinskgI$WL-Kyey&oqzB*)3iS%^q*T zR;tT6ubil zmt4k3@F>1M!K0WH9Mx34Sz>pHjys87G`jYEAX0FT9XlW^4K)HQZSYYbP! z=n{yJ9@jkM!^;O9TG=|Lf5gj|9X$O3I;}5W@(nt;?seRu<5Rpuk4p6D(hPv_9K;bC zMV#fy<_qlPVIP7)9g&mOj;&N#maD?>*YH<-@zVfaA8J8xt+Pk+eR3oH*hnW;OnEz0 zM!Y54agHeAF~DOZQ8ux}>tn_a(L|qBL`up-sHzPPiq1GTGaU5fK!{VHzNc`OM@*tJZf!Q$z4UjzbOoZp`Un`bJNTGd#|AaSPm_hc(uESalZ_TP^fJS`S&J(%RU3 z{P5AEkF`cxYsA&s8vH9FJ$|gJ12|%ro@=mmxo7WLR2406sg@s>v@G_JMayzWIltvc zs^!NeE%%6nbo=@bkM!8I3-(y{k9wWYD5pu`lxym7QfG_2gM_U(hmYh?ZB=z!<)!7o zHfAdQsA?cC0hRuJr7LF=ay1<~10Bto8@+YTk<~0Bf`9xp6)fPziRW#3^TfNz*6WDG z|5G6m^2qv@uNUB^2-Q`RBIk9e;rT4bx9;THIMNLBTNHkCgWqoQyxES&*Rv13L+Y|R zjBUo+4dj~@b}~N=Y@fOm){zT{b$Q8@@W%BeZR^Ox_hsgdzl>wzaBIM4=5TYsXX<$D z0aqz4`D~pfpP{qlw{kohtC78(lF_=iq}_9s?+vMW|A~3haku1MsIl`u*=p`dm3tT^ zjrBX)%b3&2;O!PZ>M%h2c1Oq~5e~e@198@bk+NR)?u}ut=q+n=+ZX&pGvYlD3|;e^ z6u3A1k5O^!MgsT^7x?Rm>3crRD{;RAOFuz$`H_vcQ&D87{~L zhDNEKf!$elMiv^&((s^XSsT7lqPOQ+CK@iz4|%A>o?uxJ=QKV@%wEs@(2{xq17u-q zBDdGSqCuey2Bkc_OC&0HHe-a0wk6BF(7ISWb!C!NK8R&|#$}I=g})9u*EC=~FL9}j z6~jn22YS{QNl%0H)N_P59e3za*v^<;)Y$1y8y|9yBcA@$_~6_W<;l$t_LWth+WKH$ z(&ee`5B9ZZ3ed{$*bl=Y0g1Qvfvb{!<53V| zmSNadNS6D?DU37-4oG45p$Ti38S?u0yw3$l#5e`XavF@-eKCaUc{aw|t=zAA+sxgQ zrp-)TfA_sC6o_PPbI?s4{aQAESxmp!3m?DlzkACbZ8e$~B@|eQueAi|(HFoYl-scXf4jbyanDb=BHnbpF`wKkhkx;Eo=P zJ~vn`^v-Kw9Pzb_px6Di>onbN5!zYBc2?g|nbl)CfU)uej7+ zChajTmvWp7d^Obt9&04Kz^mcQ2}E)QJ_|V)%$iED_XTE#Pd-{B=PE7|GS4E2S9%3H z#5Q!P_H()N2v$E-vhwR*NMc63IBkFHF0s zBD;l)FB-wz4iEA?O$V&8@Wtz$Kh+y8d>gAmV_?U5Vm}bQ;Xfd^{vND*gYK*C^zpEk z+86Z8&oVMCIWjFVGAy9qwHD4#D?N~(rj1@pjb2NRUW<>OS&$<8St5CfXuycy7X}+Q z%B{#Ks}O!>^gpxk-a$fH4EA>&6Y4LHS29@{y2P9%ot-IbDb9K{VuFzmJwaAak<;P< zwMj^Y%)s~&rq`bY)8_If`^R&>;&xkdGRG8gR= zC+5Il#G1z>VP?n__0Hk55=_lUt}R#DD!;r@t0k=RQ|$pU-g9wT5{KzG<)nG}%pHyT zgSCt22^QxfTB{A_bJq}tNS+yxKC@-vYtOmHUj<9IFPY&b%}e%4Hz}FjviK_qA+PUR z$M1Lc_g{W|W0gxKK@|pn(P+H^!#!wm99Ej+PFl0!_QcA7;mwflx*)YW@Hbc5c?4=R zqlW2nCNNxd0tJBZBhOmVe6QGN>5{<)rDW(Lq_m32&%l{TZ`ymD-lIMRZu%t`O=B zo^{=0WX4ap2#peDA-M;Pt|s;iFj*I1&OiaI2y1Ngk;C<$wYzunZubZtTh7?0q?{vn zncqO^ib6EGYbq&>K z-Iu6(0q;`B@wzB}a2UEy>kHPwzO7-c$85_4DMTJ{;y%@NXXG;K3Qr93ki~2ch|>zO zr|$gbPy7b9q&U^MpB3ZiM*I=ppog(*Q0ienIZqpxQp!2AEwWWmhCP-a9CPrBpfZ}g zC+Yt2VDFE{?uWxy?=aHItKVMhPK{ynSxzqApz;dQ=LiKN@l`|@<@>|}km$=RCK0(5 zdcU{7zZV;J1?3X{iKS346Nz|4UqKok7NzIsH8Nk%(s|{|qIW(TSjC`3r-3&T^)NHZ zowj3%#R&jo&AT6$O($f6a1E~4X9Amppq#%`2uNv+w?%?r(PgmQP7YrmZdx7h+8Pc5 zyo={_f${q1G|?#N3CvX<{DI?hbbNBOcks6H;p8Zf;7rUy%Bs;B_glX9YnzA1;3^t7 zO=$OI#kRGJtOZsE=Y&~eLUwe*M>Mw+zp09eEw`>x+iqRC?w6FWX{cTG$GuYO*K+dL zG{7u8cv7dmWP;E_Bat35|94^;HS?wv>1k!cXoyL`KQq3L7C<&z{Js@UMkV+0#I8=f z)e>`yx(6#9kPf(2!P|l-?VI4%N0N18l1>@cm5k~()mdNLIn)g>9+joh=>^ffMMNQC zf6+{T1hu*6yKdWwmvo0)8Z`8gY3Wm8Je?IRZpp9@Twbac;lC|iHV31uDV6|>n5zVo zRS7<^{a&%W0gk5;Ka4ubI=lIp$9y?zOJhXenA}|;BfoJ{EMdhXH0JHzZ$Nk*{{i7Ia#?X&U z3%2L>S{I`{atIldWP`IFfiOQBH-(W#N62W^IbirfL4S=*B%LSl?gjx`8M^GJwaQon zuXgYdw|p2ddII`Mo6%V0u#LqINjN#Pl=ALnB!Nadg6PqQ@d??w6J}+Q3v-D=!zMBJ#!lJbM1GjBCt=3@F7I6W15?1zk+9rcQGwB?`dIOBWyeSw! zv@KmaY5vAeGkoHe*AzSsoj>pZ-M@>&lWEzaIejzV^%B=8{}CW#jFu#@mlON3V5rLC(LBdYWe*W|(Wx z2JvusZbh!=a9)qz30_`utfi*4H1QUcq{1 ze7)B85PAT;=|8SM=7rLyB`=iikWte7-R9E!&81_YeEfl9{Qj#ypu<~>MNyf1a?oW>c*{R<(reGlcmkCj0kjp+(&-BZ_P7h zhKZhqsU6BRnM!;PV zq(t8;?yOB47zC72f8)yU%ScqMe@Egk?vd*FFYo$5vV*L^p;#sFmvF^^)mpsdR}^ zvb?cguE`}b#vxdKzbvAbWBie)>rcV~+^J%v_Vh{JtaxHn+$fi0E7qRWtD%a=X2nW9 zwqhOBW~kyjv*OdI(OZL5?np0JDV2FSzt2z1jkiwIE~J%vxIHGgdI?}7ZN+USQFCWl0E89BC+8CW4_Cnlu5FQaYt0Wn1peu zPq-#*d~qjn(Y*0>fsW8TpSptJ&5h9uwtz!tQd+s$+PczlwCGgrj}4y`Jlwa!qrA)@;;ryG7^5+3m+0C=cT5Jz&MI^P%7 zFt9mup$kIVC_&yEOd+6AYg@NRWg?}MD-xM$7^?;P#E z;l1_*XnFF>XCbZbg z87|tvS)8?<#2GJ#!|P|JVuAz^pkR__1(hTbG*D6sOyjsz2_XQollpW(@e(6qCtYaf zQ8Zp}SgATVt6@pe=sU2GY79mVoZe_ZAqv9KQRWlA71k0~dCbzX3>|MoZi*Pm7LBGM zZt0^NgA=qa(0z#Dd|<(2UDDimHFA@df15ZVS-d;;Op{Q50qm&7!=qPM@*RgEo~3yv zTO0e%xvRydjk`HnE)}f0t%_i{IqV2Fvxxy@>EE@rC+Nfoo%AELw8s55blG)+3vv6* z8jfMbnqvV0e|Ot`*O%dcT^9Y9hmo_~ew+XLl|mVK{VX+k70SdR>I2e9PegVN`xZhb z7!0fdnB%H6LBrx3p`!mDJ0tW2DHp3+aYm8y+FHH9tA?sw4Mtyh!UPH4`t=+A`#rtC zu~o}5HnDXu2zcy5jruqVn-j@$=ql%Q{Q>&RwFbSW*9YxIdk&^Dw!k54!u;A!`d zy?^Z-*&@mp9(v+sNV@RuU4qVcq*Lz#6hGcQ!8fYnmTs+ZvOBt?`D}!{3!<$n63K*% z{EbpqB2s(w3%_xv5n3b=jT9Y(ivBFLpMmJzffE;K%n60IWx0Tr|E0(SJm_S}#vqQ> zNsNFMF!;)^+v?=e%ydVy(L;_7*NF4?_q-Sw;c*MGsg3Whrwg?UYhI!JBrQG827O(Y`RKtGRgbG!c}j0om^nx|lv1 z(695jtlc!8>ngQ1yEq+(zs%hX)S*4LNKcGh%L%0_vXmb~jjH%KNC8n(AkKLy7_@My z`jjN)iIYa8!@w;oa>g?9jmEnLlPIGEA1rs~&5iYok*XG63_5aK6ebUf6*NkWynYn7 z66}^ik4%z*#Z$e~?BZc6QI?OJlg2f!I??-puA1=uHSX^4id7Rnypmo=C_Y}l-Z|M} z!iD@69p=@bCr1|_EV2HTekq5m(YWSfl)rO-Q0Hl@SE6=+H)tgzzrjuuokS@n=}Nki8; z#;r0xr1A?GtHM!6g1Me1{}6?U&UHW!)>1M0HQGSr1Rh`1-@Z;_!wz=Syc z+}@37G0ZX538YKEtG! zV7gw?R_dj%X(^h*9rS%1RVZAevX(B0F$#D)W0YhurT7G|lTR=yJ#70CYy1(m{)n1? zbV=H8QR*<=VqlRY@J@qAx69Q1FhDd^mJlK3RMK)jz21GZ^Kt*Aar`!9ULl$xs|s~3 zD3}Tuz(f>6O#5Ev-(gDR33q7DEK%E(TQ$sH6e(V?zd1ImNO8gY3Q(7w@}io-nD5z(Lj|GLE)(9KC2F6s4oQx zzm`pTEMxz&KsA(-3zJ(>4{*bY(p<6BYTOIF)nMtlXkHBS8n-?gQC2R-ZzGw4D_f#1 zmchGH17S?@bZ|A!(rvMfUM%AmJ4i-+@Q|&|Ps%`Bj)NAa*wPQn2tmx&+{x>GG7i)j zKheP`DTUZ{^6H}dg32FH`MlJ-k{$wIdp}a@S(Q{7;#nD;;_7usSyQA3{j|bqx7oOc zBD|q2`94(uNaw5Iv~AW=6{rLX61W~kxU)mh!?q*Dy=E!=?t=3yQ{*lsd#wT*!$`l zGSyt|%B=+k%8tK*8HP7wt|ZbQy*YIV%lA4(jc8X|LVG;c3f~(No5<*P(Z=l+xtqe{ zoWXlzS6SPN(RZ>E_s66WBX*Z_q5Y0zE%#Jux!&znU5}}{AEx!5PSJW#rfR+Qd(wLK zTWh^~Ry8_Z>t$A;sP$5nUS|E-!#>jCsmSCkwvsP|mmv6K6SDhcMkXN>1q=9nDZuZ&~a=%Qni&EW#qXe|}L$Q99=^t4<{myWMsL zMo@A`Ef04rSUeHAXF>5pXw!mXh1}8h#a--QAYzG|7g~=fJ!itApEj#AY+jh)Dhc2y zjppp&%Cr-52m2u@mal4XuC0ozIZe&0!X4~bXtvzd?QOZMe{8wGoh?VA=?<*9D}n`b zgAQiygKCF(|n4%+|PSp{pMP?NL>zj#keLZ?`94oY= z@_#}1uDXmK1IG*OT0~$^6UO%{Y59cF#cU_T*7H^2pZ({*=k{|JDGPmRd_j-!xx_5) z?V@1)GT;6#6#jCTVwUz$Nu++ct(evJQv2%Xmmgt@|Bb|KwA`0C8+xIyi_v~m%udB;D7UN`H*2Zp4^8G9lfnUNR_aB-2SC_f!221KbR)27nKaK7= z-D?JDjczWP6nx4S1e07l$8j6^eZTUG#5lBMzpeFY}Ag3B#27K$fv?=KVs5B{%3 zD)6=2DcCiX4sw%P&Z?{dS(S&2PiR0d z9D;wT!B^w-74PC|;r@OhNkhXo%0Hrj0*`{89d1XK%IR7?=&c3(y85bB-YAunVrQRv zgFb#yYbpL3u-%dxp1s3OAYPp`J}>Fh)k)*z zJ^ugg`;)^rZx-cE4+ibL7l2ZyF~Iwi6b!zdmy+rK9viNnK?D>l&Uivp_88az7oQ*)2JNA>2&B3i&N zXi0q`?#1DSmzefMGy>egf_Gv`+QF9+ne$EpdEUOah2{@o!P~^Q=RK{>Oichn``XLFxKGEDA z<3wJe^aFAZOC|tpo>|4$JAY!}evzqwZu|g`nXidSgn5k9`pOygG4+qMN7y+HX1egs z`-4%$y@ERlQ@9CX4ovI<$Rp)4Jdsxlv)UZ$^c5b!cECVdbPdk$2vY;~pN*!5ybQ-b zjP!%*1#Nx9o>R}wMAp)B9#FNn*x?_$8>(6U-{Tg1rm7C8Z_NpsE9ZXP&2VJ1jRRImxqBrQt8k*N}btCGwHB%@aO?Qc3>Cpb}~5(gjehVIGQyTQSULvyp^P z)COl2CW69fuoDd-gpj|q_qs_fRv3|fc>TEg_&Q5C>^0F=BF><;aK{ zP@0)e%#IAVw>v7~P2bPU3<_o&OaUc8*LQXVKN)v*W$J`km7=t@N-DH}Hsxq!ONiU| z(C_oidB=vU11v>j*Y22QxRWV#;aRd>#Ktd=}phBZa z#GoNI(FRU*G1Qp9W?2$dSZljJ!oYlA{&+YXfU@=V?7|3uC6-0tS6&-hANRZ77gvTA zT+N{&qZ^N4@b_<;$S3^I%UJUy{z9BH9cmQ zW5)c{D#W=G#c%A~IXASDc8b<4%U}YX11R$EoJ^^Pu9DFjMY zti|F5^Lo~Y_tbiuTL05p+7m(Khgq60uZ!kO)0?MyznAL8^|=1OE&jgruj119J_*3P zZmr{ArMd3`Pv3}9e6bezc1+?9Yg*j{pwu1_ijAthpj6gN+vDk86e>i5^kj1W+ijsmWvKk_-5tV5L z-ATck491iX>>R9c2T+{AkhKsD^k>{f)qBj6oMBu!uZ`JRS@_0?7{DCSf$Owcuse@T zHQp1zdC0>oijH!u2SXkyhxt>gAhSRQ93e(R47v@gR*HN@8{)WLU={>?8ae%Q7bajS zhq&c7@Ibxie1YzJ0nn}6jnnsxUs9C)-3WHAnNo$Sl^6YXa#ItUATJ6V3DU6Mg@0pMF!snO``?{_52gq3_~vZ!C*+-!TdQ{L`L8Y z0P+mianJeG>wDd2kLd-bfD4e3T{hlMfWwL`8?aQvboNCI2%}HbNLL4pU~}mL6dWul z67a1E(}O2t+o_6SQ)vbU;Sqv(1TgMfL11%G^M7zE&8rY(6k1L(Tv1oHLLr!$E~rX% zA-;x{hWVa!2jUq1P{9vGV?72g-;hMQ*$kD{)u`HG<4d0(K<|jWLfJG=RNG8fHtGN! zP>vj;(*zpP1nP_iJ(asa%ab=CwJ^XLG8s~=q`l)qi*hJ&g%BqpMbGYCMj8#>law?& z6T7;ZyP?0UpcFKlOH|G(BrBSbd?@L73jtV;7l4&{1mK)#rs0j^4bo zD1TXsq!T^64@viT6%K-C{|JYlQaFg=c_`s<-Rt_mi#_KrCLaEHzi%BA;%Ndx_3j@L zkzGV6s{JD*eo7&s2Iv882+B7pgv5Kyk5smP1BNAe5z1XTkE95{U=L=J4F3t+!;)}+7t!$UwC|B{xvQ1cOlQdv?MH5Z$8I+m&eQl8NWbDlH*o6WDw_B`puSxRxrU&%mHt}i9srNhZ8`@Cr+85b92 z*92ZXxj5!`1e#ICkn(1!x>?>RA|YkQL=?^g06r2Lf-vx1*ZTH`dyHUO-q%bw_1hM< za~{IT1A+;jZE9X%Gv@C@R3vVd- zDT1= zz58nK{mwq+h;JOeY2YofGp&V{p>XbEmq*=RYdFad3!)1$PnBrDC~|WQ@d9Mzqq>67 zXSX$3u|8$?>>yw$x2kf>+eLT=A+XpZnB9wwcgk{Rs`#ftt`9ygs4%kln+a+Ao zg=8l$r8dz-xrl_-1tkkQ~V3_~8=Nxpu3PE+R7H!x;|UemftdCL*eVT^|a|0#>GP zPvI|dM)P;&8_~bJ|3@ZF=g)Za(tzpp!yte=^%D9ONBuo2>&&Ux1D=arTRX^n?C?*u zU{yN{dm)6$GPv=O_{yR@PPEih0)02lw8tK=AfAX*2I{!K{K|X0{lasRR z;{t{zrD&(<)-z>i4<0H#JGsBFJSM5f!r?*POLyesqMEXG{>nmzunfyE&GOea3Oc+h z00Jt1UBD-{_Q~g15xj8@6Ghb=2dxIXgqvDh6^lTiYqM1-KPmJI?GzYP5UW=ysvbs| zu#>tY@Kd!$W7Xanny+y8?#pzUh9Iz zvvQ|mMtjyt8D}Qp08=8)8&XRP4%A`sLb&N7;sU+d`-ARmcQ7^(`>16R)4pQ#Bk?&B zgk&-$_6SduY}|rwAvxG;T8}&uiY#IV7Ey6TvcwLF+1bk+fnScN;;7KZyE(4I<2#B_qdE%|r2+6v@V@aCrH}qKK75o4!lQx~Na3Yd zr?>$Mx+bLN=GxfH`zbbP)K zxrKE-u`5YuGd#;OO&{pGJMu2+o|SLC6^U+yxTHmkQdwxlVnd&_=FRO(wI^&kUWB9iB+gqX3LWo2>{k>!>@&yk=w;*WtH#@pJ4dg1XVCD$6Rsv5C2*F(jc?g& z906?xr1L-NZQOeY;358JjJ%dSq6xY=o7K>cXqo9s=IUbLi+RTv|2|K+$B>;qMP!S_ z$(b_8K2K%q6eX6#%-kek8RsNBi@+`JRU}zGHzJe(Mj6P1#t5E@nTjTemy^~!80vbt_L-lV2 zi4w^LJ|6EjKJ2{uKPFhz%Nk(unrY|oTNa$MBtqU9--h@J;n(xKe>C179^@VQ1#EJB z_j>0~C&TI`kJOaY%2fN`v1Yc?E_a853%GCcI9=X}9z0JKB5l`vTzScc44wYXjh*lNU;4VO|Zgpwveu z_Pgr^pw4~?ispXg>wL16zh9%Ma6KL!>vNkme+Tk6JBF>na3bw@JlkhAb-9Yc!nx?O zXTV>SVRG!zw)Ow=F_H{^zdC&XVIO4V>z$L-zGq-5CDmdql#HyCad#t{w+7fVFgK6h z?;SM$+}$}M_tvUpvEP{8ZaldafxvWBY!5X2xEeRV1`v3dToJBp&(iN|I=|m6l}#psZ>k# zr{x;hvh|IprP7nxA#lbkvi8|iI+Pi@Lr$A>cV(8^@!d#*pbsyP?C^csjN=L2?`F<% zU=K0tVyB$wj6Ui3gcFJD<&^uW=bPwA>WmYGZae1$oZHMgiOX&0U3#ao&7I^9%~t>Z zXJ05U=y=BKz z)vzpeTO}+3-9`l~Y;LQ7r}QhE?o8>^i~#Om^^W^q(73FKn-m_OKH@Mm&)lENHv4YJ zf3Aqn=2>j3U=8@K223-w!XbIW+d#gA`YrSRfK1$hHh?`tKN?=(jw<;?>=&jZuf{jsa&~D;rN0%vz5b$(F8d#9kw4+FY#x1cK;=<0OP(-l%=+6g2$089#HfW7C>WCo1h%3L9L zak}3@mowS8VKz~A6rcOe>5rY!1T5s-8@D+Uzu!Bf)tyWu{O9j(yU!n3`IC$B zNPK)V^7yY~2SyctrxGNgecm{4nYXI7$D88q7)`M0-ouMbbQ{PIMwH_cLr4@%1WwOP zlXaja_Vu_$JzyRo2#jq*i8*5$x!FYciLAc@c#jNClF6Sed-qDLoGjTg&^4`41`1x^&8E(Aeg4&$ge-yla5J+ej#-6*^BS^jt5*)+BMo zwzp-5J%7T}2X9+@uPeuYzRyQW^Hh*qvOK%XlU#w_kivqPNO&ON)m<$q`OLr zBJu6mX0~A%qw`i{xCvtrojs}-r+Z8v|*(GH^7_f*`{kGL} z`rdHdbppC2%^ zEv*k;XETICk%Bk%UEsUs07PM1#ymlvD}Reuynr`d_%P^qCuU!C2=vvw7~xxa1cr%u zw5t>%M<|ObgK<~*M=YxVyyDdJzn@|RmEy?lYzm43HQ?1*n4~)#Va6f_K&j>OOhoMh z<=o(Zh8oorG3*q+%Z|%22WP@d|LY=K_Ev2W2ap@BX2PF`Q1|%sR+44 zT*vpLj3FHGDHInbAPQWJ{>8$Xkz!;d1Wb#APEp*t4RuFzb<9P5z zT?{Td4s^vh2?en(WN1{^>$BqUxgBa=a`Ysz(a-ICrB*N3YqeQhQwz~htJ((`U&qR` z5y5q5K@b8T>_nurH7+AY9mZs4a!}|6j++PrQQ)q@UciF2`PPLy9)ak_(0tuwGVw4D zs?B9v-hE0&C{n*##sXMyzWP)IID^%mv;Ob(O0k}){SZNAW-&oin!Y0DA!ZBXQ8fgy z6&eA?>>H{yZAMKkS|WWkfFuryN_VJ@ik1=-dzhI%3Ya!TT87U#fywdWczqTFH#aag zczWi~WqV#=Fs-b*p2w50y9;2LmUCWUosm~9x7`*W0G_xq!vF}FGCw8V-a=L5biJ>j z{)J(Lsp_~XlRMVFv)F3ZG4Y+B!|(?89B%E`uG4h8MGc8n*5WEh;w-A{cVvJXidMNA zw%OcK-~i^R$GdI-OC8m1ZhKHD2qqoH6ck!kKwFAC#$Q?U?bg!e;HLcLCWjL>s3LLxyz zMH7b-b3fiH_)G7r`}FJB%tbkzAlbhHDZJ>m?#AXSQlXUJ0$)QS8;kyf-0 ziN46ezdLdx6uPNZ|@9ghE2M9FWXi+WQ{&fdFdNnvOsDdF0fl5%>GJJ(@^i2P5q$ zL@&sq?+*HzvD-a(yT5brTEmaOxeE*fHS)vJpo_w=B>;)?+0bNx2LQ|0FWE*Fk3?`^ zNUCjv+3=K3N*bz~&e9y_7yIzw&XwYP}(4C5|u^$U>EQ8$as2!BSX>5P=vO5eTuMNxyI z`#ZQ{7&Cw{$c~REfC?B}yU7v6>RklKqCw0)L~U(g+OthVE?yJ>{$e&LBmoo*dYlo0 zoZ}i8`7YC}PlV0qu>#Cr%!Z+ur`oXdH}mNdIu%jC=y5iT8e$(zL6NU!gA@fc9~_py zT|o@4!}gPnHS3Kfyhi*TA#$L*&sy$%?C$D-qtV@uV#Z31r&l40u-K}eJ@}e z;R1kq6N^Y<{RRf9$;q{E=tCAmAq2YPb-M~4KC$>)@hT!z*ERxi&mcg?c8Gl_g{oiE_&EBi_!2PH5fdAmwb=r}zC z7o+d%E$WV$l`vOzbfmpSU0~k0>Qgis?M7&n7XcqL@PXVG(5kDgf-Df^)(BT~e0L$k zw8tc)8vEg6hW2o~AXHVp%4GN8@seik;A4hnU3T1~D)JXuEDait@bJtsI5A_Bg~F?< z-mp9N<2I5)HHw-bg^9qcOdF7EyrwYG$Ai7eG91H^dui4dZ?e?Jmdtju$i8u_6;~;} z*7N78&d9&;Iza|{K6|Fk46RZIiiV6W^)542LlD%vtdwn-rjUG<83VJve3fZ^;|FvJ zOG*cKn5EhAFc_#>_>^Ik+JmdUUX49x87aIZqina{FhgV8+uNED`S%#N_oh~I|J{9| z*XlO1G=-^|R4tZpbvmQtwNcF?fhTSO&R`CBeRL)Z8YAaQUs%eQhE16TQUppi4a5A& zbT(pdGI5~ex6Io7MHZ`m-iq3$o00V`LserxYSzly_L`BcE?ZTxT_mfrot`XJ=d7u3 z=WzCx+d0z}vbOVLrc=wpRpCTPn%oF|nPcmu=YVc;x{da@H*5^_{e$qA>{Cdu84oYZ zLW>vg4xAXI@a;_JR1yx~LQ?=j_ja~b^0dhH5P#fcH(~}IOL=R$j_-9R@|p|d30zN5 zl9Mq$F-yCk`|hwDEnzoHne2eIgW1seJs)(q!W_sg^u1cMKKibu3MPWV+|zV{Mu35~ zCl=bwA~9k?l?g^p>x;s10{z7kA(ldYH10+(A?-v`03pWg#th4sA~P&(QV44G_*s!d zy_Bb6>Xm*frQWh*iYNeej-oX@fQIqsuUbUtg5?ISwHW{P5vC3uxz;k4TuyLsPe{vc z>*eD9{F;(=f~SvUStl^nUD$UTJ)U5&l`|vr8VvIq-Ylb`C3oMZYdO*#Pi4hq?ow;a zqcHq>*|(6U1y*kWXsEk$Ygx&(R=*92$`w5^M;wWE`q5;e1@Z`E z(+z`|wY?TOi<6(2*Xh92>bIm%Skn!zT({30q%jOS<9?j6A5UJbQTlK9+CeWZmYea2 zUmML=3zeEpNg4$#nX?>7c)@SfRcW+Hf&jb_h+fMcK)fiER3d>LvfmSmM;XV6kp}JWJuh&Nlt(%27(}xP>pFFNTwat=re?9^( z$2yWT>AAXX$=SPHUaQ}NWVNO8dOFE47Y0s1k<$()-p1`FUTvvT-mJ1VH$oFn5Le|3 z-`iYzzqxd5Ee*3ZnFE*v-1_i7M7QUrM8Qi^nLuJ7jmTA_ZFVDv&)vyjOlgnhyg_|+ z6;l8|z6b%^3zqT1AR1bDBgykyc=4ItWI+R0Uda00>w*aBS;rT6$8hL6Bkhv8+h4o# zzIa2o?KyPK3ZEYHDh;j5nPvq`(C@wTvD*dVfp?@XoqnL-;fe>%s(|6&kX0n;wnsP0 zRgN&8e)qz|OZOA2C<=l$=#5bZ4wxF<$f{I9Nh%r)MnKM&gTWUd zHfGUjIY?LXI|pIc0aI!!O%Ox_K{Nn_yoGMP8(g`UD3%3K?(q-Ouiak`tO@F`HYfx@ zP4i;^7QORs9g#YihKQ`#5PIZS^@?c}Nm06qe}%k+sEqpoQ080tNxd?y5rI=9e*m-i zIGA)@yRiccR;XM$lM?_ss=y4Psy z`HY2V*`z5yAB{1O)`C|EKuvPoqr}TMamI_UCY-JS`34Qh?e+3H$iiZ!x-7Ciikl#Y zOhN&4G6q{0rUA?c3+t)8kE@jKMl0VEQ!#6!?0QV3$z#mzIkib?Fmz$b*`AP;!$l89 zg}_TZ0p@)t!U1!&t)eiUjEh!s3`c4`5CF{`mH?Y(^>~D17e{BU!`nL1BR!(PY5Lo| zK14+Yh!Pcgk^1FQ#Ht0%K)hf1Omu;GL+OM4nlJ%q%p5E4VLnu+3kI72Q7*FrK20Vm zMp;D?pzM~hS1ZAdo>zR{&>8U zPva!i0^VgDTxpa`zQrWNeBjtzT}+s5aOL8bPamy$Y`--c_-t9sxhj#$0>ve{4z%Pc6 zeG#ug9|lJ6YASB@cRhmPn~?`|r^eXRy&4PFe}p;V)g7cBkZXoL$)olI>NrH5HOB3EJ! zcoqpDf)bhYdMzqIuF_0&7!5RE!lt^YZdmM~;b?cJ#R3R)N!2Zb6uNRKD8DRe_I`rP zO=mbn76luq=`=9{6Y2nu$7XA6Lw1)Ud-Ia zu|WYIxYt1(-jX8l>`)*=UcKi?1|cIJmL@#9iO&u7HEWOIMf*Az&ZR4mlLJWd2%zH% z*JlIYbbYeVy5rUt(7d0=J_d1e@XkK&qPC4y4@X#%ujv{Tlnl!@3mMx6W(cUYIb)^@0;LUXDCuOT!!nw&`;VUXov3s#Q@IXyg+j zEu64JO_BC8{Vpvfd`(DP96e);KPX}_)D0gB4l?5{9}dI3>B9lde%psb({KE6ShL>x z;gImo(_O&PZxDrUe+j^Mai55{Chru*H#PeWBS8&$%P1aj`kf<;*3pT-Do9DP<+Y<3 z`47xGbByQ+Yu3JL_m$#1H_xpj4tpBt`62WBNbz82y`98iN+*YSsI%WQ;&7!CLpD4d!1L?X^J-kMQx?*pvzyNCxo$E6w}lv9%IL!rNuel5~)V$P!S>4pa5>4U!1K2zOL z+sch5lYggv*?BtVT1EW^<#e<|6+^9N#yLW9J*9jW+#_TU=cJzvKnxb4zQh>TMgse+ zcjRUI6z!tCd>4mwI;cpr1O4sn;8KYiq4LZlhE#mDX#u|0=OR=D+3jTDe;JuX624rCM39Rx3}Sd>#L> zN)JJRF`k70Dpwb-+f6Aq?R&U$e~~}rNUe|kruAyj#tZ=y>%;-MH}Ee!>&>|DG##r_ zDwhlJR|RDSC@~h#lnIfwi(Kfu0go$lZYO#smMqF*O_Z{M9XKI|MF?;er*mmLNmgHD42d*%nWm1i%kf%VuDKTpvq zL)Pdt$nDR~U)x9n+-=1yY}W;qO(&l#{&&tsRiV{#+HEK_30GQPT?Q+-07TNt`r~G7 z*;mt_ zHuEf|ne(K=&tnQ>qNOP~Va}zPR;E{cz8%{cT&$)t6fJHUOX-w$g4RWTRPc?OBcmpj z;f?wRLyp`|eo*j?x&x!`=^3x+g)3IDX5sVHx)rEfus-Y6o9?;SpVBauiEA4SuPIfb zL@d(iDv3B>rsBMM?U@)%@9?J~m zJOV{YJvX4ci1{zPGx)$r#I7iYvqt5=RqGBg0f(VMK$c2_psKgsZlpTAb3w4C z1CS6}pd2cg8j^88KH@y`=oK(P$q>M1;rOyKx&1_FW&iZ-w5DbD^I2v;7QqF>Smand z3X$0_V43|oEVG{<%Ip_zfUX3GoA}H!D0Wx|#U9I`=nO~fi82#@Ml5(~mO;_M42rlZ zNZAtyEPG;~WlwC2?1_RVo{x$+-vYIVe{FB0hOusLEb+9utO)4%!v?z^ke4Jxr`?>D z!)=^Jo)1sgv|8P9(}}PBsYJU?W!os+Oe|c97QRXSqe^Xi^s;gC=ZD?K zhde+$X@Fh0ckmVy+4d;08R@Q`t=Bl%+lSJi2ceVvp+^twciYx7OAavE++<5WBG8_C zBzJdAK8eK!@QYdFV&kzqkF*} zYHxQBUbDB76@d+hG(=nwtoSy6jOEJ}%3e(DjjTyj@vZ0E0L8Y>2f@JVvu!x|*2I>5 zUWkLA0b)4M#}ODg zo}uH5fkx4(b4JhPugB=qX%(NN!wjrJ7PNG&Vh(7p#5~Ym$+;kUJ`e?ZVsZ#N&;&_h ztaipOwx@S7G=-A86U99M%?3OD2|Cd{;H!G(x7`I%-2`s5|d5Uejq$sjOgLR~8> zS%hzRLnN?y3hL}rs7s?31A#Zrs0{i+j2KfDJNx^Gum06I$m90{DG)iw0D4(u_wBj8 z)^L)i&!K6^ft~VKXzwh4DlPLb9&&~>?4X>e!du1>y5z5c7SfItLHj(B=h70Cj?Qyb zgIdi-6Hk8shv(+aA`KE`uwb@cqO^!GTQ7;(=I1UlC3W`7#1lVy*n4vhJF~yNo<8a< zbK=$vvTw?Owi9JzWI)^ZFrcvd_{)uFd*1P6r$b)b7*NaznKYg)+nmkl-iQv8EQzeTh=hG*DMZJCVVF%yh+Esh^lD(_w?|!FuuoBhYov?Q` zqg>@~eEETd{t~2bnfC!|e;3;f z`Zh5~p;4kn42<**GErK*8!VWAc3 zBBu-6sRm^QYJ_c8w4xaEp@-pIWaZgN(jkx>RPmER!J*Huw3;?6%RkyCEA%)cu>A@K znjisW-R6@f-{JyCyTre;CVC8a=_+sW3NzOgx_Jq7z^R@lwiVgH^L_SNjL zPqM-evcVQIUmabe+i2i4@#xx^Qo#thuz~lB8kpBLybH^efw>!dCFT!KFXZGr{ICHO z$o>2k=Q*|-ezpw-ZfFMU?9t_oH^QXWXR zy4v3obilQEpKS+cXxq>>eO>e*2^Rf}(YXJmftn(oM1m&t@*J(*`zQgb;aPLDTotjs|at9{77$2e@6|mD?Xfx#ht`gWhez z#d?81HW5yg2p$rFaAW;%o2>B@kfVKy9jAqpwH!wmRR96ZN+BW&Gor}%L{Gz|l#{7p zcyJuCF)iuR)mFK<>BkffEiiSOhE~X$TKdNJ=-Ph3`-e|gsDF?e`77*WWQOAy;n^Cx zdfK$du4stW19naBijxZ_iF%k0*5{Y@bkGY1jPL9pBKdT9uuSZF=NCadyam?vatvrz zZgrb=NEHyHouO$z2ouQYh-w>HLT(LcBloq>_ZH-c`#9vfEWxJ4BAzPokFbdEoW9@r zqw)LU(Q9OmwjfNt8T*Zu#zEESUoNRRF@FzEdkJw79b}?R~LvZZP}cG6hHAvX%xG{wORfvtTU8Q zAT1=RsRRDXs?uD+>c!`5N+LG+9Y)gTDVHheRCT?CvuQz2Tw$WoKGXtjAq~FhJQdm+ z8g8ixrR|_gKA`Aa@Qz|BvL6^`D>O(*jw+A?nlu!lj{($scm!Rg!>|&lSVTWuW*oFs z8Jmwa^>0f|qN+LSF?;3<9DjaRQCy}0Ce^agEf%$7@4-00X zRo8h!K;uBOIy6SuF`k}VfA4WDtv4ztez!v(cngWE@6cG%njxd{QGEd zX|Pv*h?B98Gl5#Cv+f~oROgrL%kbtGWCQDwRkm&Z4W#1ohTtwB%Ls#|z&fDYq3BMR zu(BkQBDb+QDwsuJxq{+N$AS*M7(hOPMf_Le*&_TC2E|AN=u{Lk@7}HT`xq4#e{eil zIbg=JEt)TrY>f(6{JhFJlSHr`Zd59EzTU>jlRdTv74exxqSL}8k0yS_w#`PF<0x)k z@c@IggQcOu16%fNwLsTVQ`1(50X6ch2@<-ZVwsCl>V!nWXnfog6$$Y7P|uahF=u^O z9uucdWNpy8$X{h!8}10#!a}PAi>wOJt!pizpIZ_K6R;`)qgayhz$Bov!c<^&Tku^1 zuv$7Wqz*CCHc9vuYrSMLmCz}S?M()cV@bT0!W_GGsiLWVwMaO6*?9Y^@%H1+(Q9eT z558>b3kYF%m^)jTN(ecCuOIaFwZ~0;xlrP3B(~<(y{x56oxO!VPBuUH(rg0dbmsx_ zj5UR=>;!%YHFBLV$$nC_mpJI(5!TF4FCB00%QqM1c=#5^o-Peg4z*S@A9C!Xy)$D8 z=kpHv+Kx9Y7uarL8O$8Ma8oB{JYkr$9QhD~Rb}oqBqJ8x>(udzx;ze@fbU+P!s=Gu z)H62X7IL3HHS^{{(dqvdAAkDP{`AQ|!_x+oEl>^$>8DV(JV{vC(%Y9iucm{Wx$C_Z zj|>)M`;XW~+H=)Mg)W4NP@(d&=u2vGPkjpwSdpy=S+*TDD!NGA?RjR6Tm=^&I&SVOs2 zv?)zsJGQzQ$S)g6U01TTJ!^e?1Hjs%wP74O^>}oK+~pAE3Q`+4zM(au_5!?F0)18y z9#y(*7&2GE56mQv`GS#lnfkdvg+Wj*H1Y3+cF@)A<`Eb!5=T=zd#9KSY&>I!OO|B8 z68vbnPNbY3m!LE4;6zP?Df3{eOd(?7v27j%#;SesBDctIhvFeHo;hx^qfPqU!_NzJ zJWOgn7cPK@n1!`7_F%v8S$SK7Dt`<3`BP_jh824t$ZkG;T7!Srpl)u8RMJE_Uf8IJ zxmBJf&?_kuIWnFVbD((W2ESq_h(+`GD0%`#*Z3Dgr%&2Yqcsx}bJLH0VmafM$_9s- z4YHNXNr#73c7V-ZOEw5Uz~d%6u5PdDFR4tt7F&>Es~Jy;>YSnA=L(&OGhH^l^eQXO z^qWM0n2#fTqhof#nGtLDUT6>g3;Ts$%TDaEMj3iWwhnW(21mfu@JOq|8y5elwsXda z7}%Znf}3&B0{l;lt7nQno8tE-BUCId`4>fR^YnDn=?*WP&9gN$CTM<({oot1k!!;z zWH`WjIvfTAYTypt3$2PRB*pz3BV2BVt&x+|g2Eh;?k>A;_YNAnN95kp)Olh++N%BVmmbGTQD##9~c)0 z=B5d6TH;m9e678;akkxl2w%nxVI_44)4PvDqVX`5qVG2D7!F75I)L0diBzdXs$k^P zNFDu@IkcRokyEGbsnfM};kLez?{wqJYX`y$XCitNx;CIr2{~26r-c*qq#d_`%=7R# z$9!q9B;JvVIf&;^& zbXJa2#A>2ul~?F`7&NV2kYcwzMeJgtko1*wbIS5~GHvC{nh9=o2=umExL$AKB;MRB2nkJVI z`%BCAmh}cLwK=DIR;y+r_I~mz%2=0Z=7O-t$!G{$45qn22A{O{SP{c?V6eCWAq@Bz zu`8107sVHRxe-T9+gQ`(xRdryBDmAy@)^OiV?WF4H#z2JZVVTDisdEY(9ONT;ms~^ zm#ldUBPqK6Ac31;B8~k!6~+nDM3Xn|X}ckRYiWEt`phSdMF)SBG#>juk2KcKE~bb` zUNlWePLsvUOmHNMVE#Q(>`N(;BAHhUhTK|Bm(;hG#pyElKT(9eV~{ApvpqPTxq~~l zZQHhO+qP}nwtdI8ZQHhX{=fG&_PyN?`=K+ktFtOAsw0{w&-s@CAPrZO!#mm(2$zD8 zsJUTv#Y7G-+N3syf5$)^ilfdW&n1-##h3lTo(JMH2qQLdO~HUzi8fG4B-Za>1lZ=N zTvu9UZCCYAhImctq(MEciYa;wjgZ(;y*Mj*rl!GhZOPh=3WJ<)XVgOb&T?;`&CWnH zrbiQPN{Q0JSTweIUBB*fR7=TxW9@HCSip;`+TYLn>iaLSpK|Y3|DT#yN~EtL)K|TS zt}}9~beMVVhGQMD<*KBGbjA%9i)GM@q`hgD_2duqt9@i~NX`MZhyqw1wdBXX3KNVf zP9_V&k)6QXJJxJ@$yP9v%#5trOy6zQn{dPk1C#E!o(4N%spimSra>TbEQJqztOS4D z1mpqg*Fu+_PkeAMlIOT)oGea@vrYLKi*O@mL6hC6Gm#-9ACa<|K8RxIEWA%urlFXN zA={-JbToptdoM3}hE473=~I0#%_$<_#ENb9(nw>8v@gPG#qq+DK^o_c_{7-3GX>dP znu`}BOk;ybx2Wsz8GWS2hh~b;z&AIP;jc)?a}SPE6K-+SNb)N!t~-G2UoHqq6~@#m zV;c1tEeG!6qWV${*KXQuXP*tuZ(zmeU3wA28@(GNThpJ_@h6}k0VoC{$^Yii2--AA z*`Y2B?8`fYr9+|JQk@?@+q}w!on_zV0(T9L>Ad%&CG)yu#p(IueNcV$GLiYI3hT4i zymi0uM5@^i+ezj@5D8XrD$<6f`KX5SWIXpvQ+3Lz{wRRr{m#^K8c)TsFHBkN@Q-YE z7Tq;aIubG|s&-h~iZy46*VBh2{u1TUnp50%@9|0|eld|elkyLWqjQ9IQEs5zCjBt# zuz#>6sfNs@OkzXs;uWx~*$7p~wY4!=p&hPE>+#UqWbSdo@j?33^T+RP1?o#o6%gSw zs}9$W)UVz>;9t+>+tIxi=gP~ab)5SNM;|c%PFwfT+=|mTG355fwF`YyGqz*FlN$_d z<}69N@qp%)>j?ru^BQznJuD8pO&ee)_0e{1w6wm` z=7frD2Br_ffr*JqKoySp%b|W-Yr=S!y0sOFPQz-A6`!qPhsfefNZYL1M8Y;Oa_#`nVWOr>+2<$PGNMwONq~7r#|$^!LUi&8~`!}Z{gd0+;l=Z zTeHK3B_{eCg}lJbl)3A)0eJ#?w~DVw<39dY7sH+6Q}-)*yf02D+VROAse44qDZ~yA z$Pd~4;VWq1u0IlaRj>0=DUPWwTX_5M0IUWT{c{GtwLq}%q6td37eF()n`y?rmZ#Tq zp%IoTDrdaZ&*>!9}*8Bzp{6dOCyjZtU(=;(_t4*O(SN= z5#S&Hh!@LSU2Y7Zj$qK;8;URO721)3P@2wbfhn6WnSgh?Oug~DYF$b8o?@UUbNCvK zpkVlkntn=G%DvHDhJZLb&{GwGZh&NIZn-$!rNp3j=5#npBr6FC0|RCv$5w@)9!eHT zCH_Vdmt#?i{@jErH13~T=|0&I-CURfI2$BO$`%P}l|Lh%uxBOY+!In!5!-r6I2XJy z+y;c1L(1y11o-2bqqt4m1VoGbqmkVyh53JPv7uO^=lI~|>=F2rHoSo5#I;@$!J8O9 z{FdjzAJ0m@m1xpqkss=xRdK$okOC=WqbZQeiUjsd=~Yey66DJS$x`?E^w{l%)E3Qv4TVj(OAU&zF62$~7~+&udJL z28o_SdBZ!k{@gXB2Dx$3@{+dD^ASlq1H>~e6%Jri7FO`8T`JKdch>L|WW`%(DJ4cl zzU#_nEe{mEt|gxlEiIOpm<^Nuz>i;#S%Wt{KR}yN>+>1zXQ>+WudBE-=xKNDxJdP)9?8?I>Rb&6)=|w>Q(JE`?1b?2{2j zgag**(+GF!q#@k2Yc?K@N_r=dRGc9t!4mW9&Sgwmk^246UISHaQ6ft5~J2>Qjg zcRMQ4^y(tZ$h15J^uE>vyaJ;kwN{U(+$FRq)}cof*n0JOLr$7_(~lcMO=M2|gDIS# z&)qol5f;i{_>ps=SSRhH()#{)*6|afa}X1!JjenSgb?80!+*Obk7iIx43aR9WR;G4T+M@{X=rf0T4wRUuugF!=v!3^1TZQNU#KROz3fgLC4O|wnz zBS-0Yp;Yl4CyDcGM>cnQT4k43U13;E25<38cuC*0XWliRcgsD0EdwRP=bEm4YS}v0 z?98f69Ns>YO3NlOR4IX%>|NnnCR~h2oNX1b+BwJCwM*}bv54l6WkvkP+!RQP55;G= zm40Sq^hL(={*AJ$ChPf#9!1O~>6}5P(Bt+45Zk-;y4xwpT-bhknY-^T27X7gGB7^!ygZLb($M*Y;>sm#Q}kJHjZFszDILm%e7qO_2jKu}5|BZvf+*^a;^c~sq}~i@C^LAB&(t(M zGl*qsu2jC-l(>_ zP75o4KI+vL-V)=`u{B?_`fUP;SUDDg4v9&dX0?jJ!d$H8?O-dvGIZC>eJQwJh(X15 z@<@i*2vT){KaSf5H@I+>}22Za9+YW8(mnjuf$8mjKkBTyFR2)*a zV>QQqL<3nPlIy=@4~}&6QFY8mb*hn3TwH(NcGF;XoEzz*eRQQr5z+Bo1;~67hF!}@ z_OK~_KR0`?uI|D}n$3-0U^e+9OKOQ=RNJ`&Gv-VfZE=bHlF1||RB>F$ajT7-T)VW$ zII6tij6ajhWDt>`N)59#ip&8@Z^n@DW`(Z>OR=}$o8@nbH-GwR>?MQgs@E&Wtt07M zQW)7QNL*mg&bKM>{3^I`fReL1QR2Tvc)Pg*sgYhjAR!6APkA z?U5j-)t>o9NSo+fW8UO*|J3k#mgMv|m<^d4_B}hjc51p#Un{ zVr(1X^L$dxmOwgJV|mW}AO9kUC^0=5Ib{PfMr6h^aH3x`640^@e{YivSF{sBR%$P= zcfUtGR$7k#A6F;t`oarxZ0+3g!jiVc?WO3nnvjor`;^N}2Mrowyjx&uYlNi!K?55; zjc^C(>ha{pA}BJADG3UfB?y;%rqhtsBjkj>C4$``TNrP~_q1b(K0ITN+epMNS39Pu zX=xp+<6z3(R*Ah2={c49Q*s*=-#XpR!z5i0TI&8K)t-${%E)am!osx)DP*cEKuY2S zJh?m?GosP**O}*%lnsHOYEmy!)o`uvi)cHSGOv+&TA{|*o{b#i?j3gbCz%Z`DLFqa z#~5?!ka3D4;oQN$#tU~p5gJS!smDv{yb9(SGWBKigMDHu$nOuQvuw)gB_yEbgi4Xc zY8WvW3-(&M>vPf29?xe^+#T?uQKWwc-58+gp`|mH6CKzERSPWW)=_I96gMi2X4e=i zhsx$_WR%yN*^0Gi3Ysp;SF2|#npPD1xW(nyWla=*H|6#Aq8`U$>AfGPU{6J=2rPWo z`&943;_b*vV@wGwC=^0lfs8MS8L@&TNiW>_S6Zj!TJyJbq;J8pkGPVYg6oU$kPWVk zZ@?w53^caL@S7{*@}{t^x_@z0pcQvZ7IPNljy))_MLAq27mZSH9_LZ0g|&@PxE7Qq zuZn92(}M%hDNarr+*!!hQsp3X?zm3rG&TiF?qu?YvqG-?d%;N5zffJ9D@ueL`uZ{( zn!zgZ1=$$`W`hGF%Kzp^6T6j;qGFI&(b@{qcJIsaP)|B5`vRNPDERzR)wSK3NzlI zwct7VtJN(OZKUx{B>Dt9MHA*uP5d$vX{Bdjh$lfKT;+qbAlMniqfzR?QRmu=R+`Nm z#uu5n84~%ZGbMJ(iI?=XBB^-Jau(wVvWT>JbIDx~ujVK6l$-ahu{4Od(y^4A1$C;O zQuUQ~d6_QDbQQhwn5U)@3&RXa@|IXC+jZ$wYx4Q4Y3t6_F|Gvz1^!o4^0!tk36hwn zu4*XLrMDM0%7&>h4TNNo1D^}h90YjPAf};IW!(_u9d5EokdoZ9tVR~_g#)|oJri?! ze)~vN6huPb#QyH0<1NG}y7a$zbzK-_`!E`zD1qsCMS^HaBCi6aE=P zVwEVu1gQce4FD4oo+gOP{DDz(8_wZ7&90j`ljV=0a9@q9BI%`V+ z_B$HbD7UEdU-mAXhsZimiR1zqgF)omC9KFutQhktUZmoeP_N{cy~#sUoA{2HTf-uI zJI8G(n@zBvdyeSAe zI9690ae{~89M9#iLzR)(95?ckp{f@y6vM4yoZ-_~cN3?hzow5#W1R{~D14Jq%iSTR zm$G!_lnbO!iADsfKQR?d`VA@!(m%L96lilB=zq^A>AQH9*@Q2Itsl=2h0ex4G6|Q| zBsGxU)LG~Ro~7P>gv6Al<^H|vd7@&1#riydUMMs(h2GH!z;q0NC-Gdvjc0d!J@D&n zOw{S9^;}{9@PD~=eVCjae2W{tn2oGMgEGW$i_y_2V}OMss9w+JTyM)w?Qh4umErXn zsD-i9Od1GN4PI&*HB)tur!t%_|^Y^NDlx)ENe)ayNKMi|(`Yf2n0WbO0r zb_{R#ZI5kF^N8&+egr2}ThjAJS5nckG`{av8+A@OymZWF^oBv+koo(r@<2Fb2$8D8 zIRcb4Vnw1P2|o^tZ;wz$egvj0G}C0qpD=aQ^t7!~xOCQNJ_d@fY&AI)+B+s_ZeF#r zqN?K1ey{NQegpY#UhL90{P_yLE8uYBt6y%PV39adFz-_Ns73fdd~emL>~H-a$gxk4 za-A>Q%11a5w7^?5!2cI`jINrRlIb}Uugj~|8sqfm6Ky1Y_CTngG17;X7!x%`Xuf6?N12yGDGcexu`YGGS)j&JC6VL8L z#nIp@>OIf~6Aud}L%Q~+mfFB8bx60%r;^jAL#l>rxM!KhVcpWi__^k;+T&{ycHM7$ zeaP_udzhbbr+Jo-S+|Xl4^&s53q3MD)f(mF=ym2`cx?M)YnW3rl=BW3aSARf3~)?J zsgvH7Uc;@^fISts*81x5OJBQfyKKwVJJ&gGqxL_)1UmvN1CBsx&?-=Ky5dH1TPT7| zHl6hiG|~1u8LtD0u8$v9^ron5X%w}bp`Y^u1b-1@3U3BlZ`=Pem3)Y6K6^$2gYIvk zRl+&XPaNeS25LnqTDvCBlJn)Pj<)gQ5hOWE`h^63l}$p^y6|Zc`QEoxcd;iBBRaX^ z?%`_r`g$kIqdae2M;YTM*PthSu1JA2wS>LP?^ZZ}IsHUcYso=u3o z8r8$4EgE}G47&R!3Yf8A)(=u5Kv z1JJnbGZ=ht>G?P=((Cegu{d!;O1{x_py=G>G{@>5d(o#! z;^pxKCkfd;rWxkejAuYPv8 z0pDL4TYY+)+0jNadjtrUr5Pr?JDM6j=!wCmBUXnu*sBg&);~kn3flPjEw1OUh7-73Y zY@c1XS+=o!xZJW^#Yt#pb7jxJ+p;p39V>;Jiq0NK#~;}7Ov0_V)Q&3!uaGnO(Y7J= z8i^Nv0Tr+g9+E8N#8oKGZ+fmTPxRA_d@(STapCVEWxJktYC+oqtkx)>f5}>qfv={v zzkLn{rY}}J!EGOO1Y&*1B55M7{hIVd**WO*x}%%xd7&lWmbMY-P(5s5Ro#5}#TYJv zKby^|HS<`JX9)ne3L52DE`|d7U{~>!`-dz{3i;yISH02j|F_fj)Iw9|=PRm8g*WKtEO(SBsz~tKfnt z@Sft;gGwS1F{4y@>A>L(P$i{=2l~L@=s5|uTI=)6GyW;Bg~0iI7McHkC2Mm&O%NbPE?p}l7(G`mRaW`4ikuhA_YYq z5Pb}E#@!P$q~z=4XPa*%jBl<3-|BZ~>YKPb=+N^=u!J+I`o)=bmbHn1yb>8~rY9)u z8wW+JDjs&QXzP_c^I;yrobplB>Wy7b(ie8EzGZQd9x0VT>a;rrwY}G}lTvQ*L3x^LhnJH#yyK?kED$uaN z)v8XfJWDgV6HboLDnVULJ-VhbkTK6WeMhjBIScOuccJ22SH|_SJ7C8hY)xf9n33Cs zcV>8Udcu}XEP+|MSA!gN$?K10BFGW3!s)M~miRn5#(UhFk3XvmgKjZnfgQq?pL~>YF71iKA(SN_V zwjV6bCi@(lxBM)SN)5 zxwM9Qf$Zu?HzI{^>y3Bc@!i0q1e^7{ea(i)sg`owNwrpj0j8W6!Zptoq;$0+t)i8g zv}*C5+{({Lr&Dkas8F&Og4Ut8O^EdNf++7iq+p3BwwHiDY2`NqsQg^v{z8L23R^+i zvS7cXpIhkIh-2Dj|9oO)C$)?@eQ`4PK8g3&?YrvYV_7;Q?hJ4?gIh^xv~Dl33sfzU z_-_;P;uG}R)Vl-X)KYGR@}o!o$fRjHhg!6HO&eURpz!1o!Of8)gfawvCxvFb9CBf^ znrP9`ZDSm9f8*xSN&=@Ea$_Y$>S@4%y&uyX&6UlTc%hTpC#0-twiK%|c-r=6!x=Y3 z(&x2Th8D-n!3|u^0wN8B@-U@|t?-vMSjZJ1A$SY$v9+~>Z-jI_D876-fC|XqeiBk3 zN_{|z8hJ}FW@KvwhBKu3c}loAgx#?zw10ah`&(XK9uH?{Q>xojxU%OJp9)fRWl>9} ztfaYHomEq;`eprilchLwcIeg{IxD0>Fy7I+h%jluIkX2>{6mFC1ey+jl5osj@7BXo zM2eY7q;~oDpvRG8)Nn)kPlpI8r-6|ik3AJ;&#~E=mD5w=){Q+T)c!ufC0y=LSu)u; zqjL$ub_>2j=oEgduY3C5fXCg_Pr3`sfcR=@wDV$pss>Tw^3Xa3XmgL-cxl4Lox*^F zw*UePIamD|p5hkaVtd?h3nT;>*w8TEN)#%wZ0W}N?{pOe+f^ZMZ!M4e5|BC=NL2ww zQG%mzarMg}hD{-N9Y$Or`O8JZFr8Q^ z$c6cBI-yk*S23#k3;F2KFs_HDIMjIQ{p z2~hu*RDmw#_s78H_pi1Oht-NFNLqbY||EbfRtP~nUlvF^aZ1co9rikl(;+=0&8&9K?V(2kwEXD}twyHQK~G3I?9?Fs;R8=BzYaVfcjDeNC8oDnwjtNDcYa-- zS*y-akStuhUsafBSJ1Uvb3KZuZ`UEW1-CYyGZ|o>xW6Sga=&Zhfy%sUVt4S4#8Cfx zDk((z9$gokasWD&Z}t18-sW=ZaXK~M!g%i zoUYd$C=*G2!F9Rd&!%QRWUW}E{l0f*@lB^ucI*jqM*PfM@;%d->f+ti1mqdkWBRYg zn_~P~xLm+;v%0Q*Ovx0x0Z^XeN2m+{XwBt%Q)B$~6W}~N#bUy)W(acfNciNyA$H3Y zw2Z)llVXwpUICvQo{w&F`jym*F$-B`bdzoIX!k@*B~9w;UbU$j1-Rn}lEb3pcxjU8;drd3JaVU~MZ6^@})onRpt zH>2o;5^k;6Cux@+*DF7T^pn3mWq&-NaDs0qbQohn@PQZwvzr$7S{W!?rqG?Qs|i)3 z#3nbkGi~mZU#>1_nHnLMkRbrz(Z_0M36CdQSa;;jGdhn}8w~)6OlXC{<}u!n9ZNRk z!jt)($ih~`^JsYqBQVjPM=QwlPbBlX@=O*|>x8z`ZUz_fy9ndZ0C36?nG$6wQJ;NV z1o4yrB?_*|-BLF@?>S&QIUn9Egu?})dMPqWdYJ`p{*vPy%P5SMw``$7qOZvvi^a%| z&otzMpzsXrE9KdHVByT^a}^A@35DK4u;HM^D;_tQ4;b5_rS|D-frZ-t0i{7m&xK&& zg?HNSl!y3|sGbP`v{l$PaDjO)$1&H%lSc059wZlCekNIZvJp%CBU<1KgH+&wRDgj* zfEY|zfw`#4T2^k8S8?DtturE>U@qk}toZ%ss#MvktiE6pTjM6>EQU_Efb;F|Te_dB zn0d)Cy{%nTZ0z2ck|bC$JR?K?mXmD zl;WAVUf$pq?G1UGq}x25eT|ywyzjzzaIYWh2(9&5?nk}p(%CfV>LH_ zuwHLk_=eSOKCjp?Z$*TTWdV=Ib-oHAR9U*8@`lCmzI|lNG!(Z#O7xV=1%lG5#6!%J z{NguHH9~@I)cXDsT8b$Wq7(z38G*G4$gI1mmgl5nT^eoEh8ptHT`6ZZ=QI*B(lGCf zk5t6w{zpDIDg=k|BYqT)UACu^N1g|E?M}?4|H_e7Li-i>XS7*J=YfUd6l&h3Z)Hkr zs@Cz{h9d0(%J=nVxBry9C-RAA0q-m0xWK0{huw*42l3_zeHYIB)cia?^!Ok>KTrQW z^XB|~J^VHez3tFC+$M4KJnD=jzB14rm%l8rM9vt}p1%8Jeu6}QF}AJE*o^#P~@JpUd-C0z}G*`Ihk#Pa<9YmJW9+r!6Vb9G<-%*hJ7?_Tk*+p7n znHJtIBU<0woH++>!3m&nzh93Hti*N)`H7g$;P7~Z^y&2Ye5JXIE9FbJn!mvFJbz+> zb}z%TWeoU0PA~IeWRw?#H%yFD<;c$LPmy$69aGni>A11a`41h)Zn2(LJv>rLn!r(= zX-^26dhM8x1akiPE%cot0YNzn%7R^_4+5S^LQ~F&V%B9ts=2eQ`*mppQpU1i*5xYq zmVo@@ zt}*ib(_KSD@ibqcX{y4crVQR|gNkls8EZ;!Riw79Ir=(-nMt!4oFPf^0ueA4VmON zc%DhkR2{moZQarK>iO8)id}q^qYH(g5MI`syjYm4i8DJQm$3`>czu5=Or4q5VbaWz zX_PIkye~DEIPfE14-i?!+kZcdDv&=dO1`(Nmtuf-K64?_y_pv;C!h;g6eM$E2ZyUq zjY8~^bdC!AsOi#aiQ*uU1Vp^kCivp7_9l?d08~l~i^WvZ zp%m|$x#*iIJEsI_Hpj^5^=$)WtkK%z_IZ1RF7KXp9u%I4dI`b1q1gfObsuoy+DU&e z_1BD;J!|wXMFF@YPR4;sc(HH;fOHZhVCJ7snj#66Q;OeaD?dDFYO|k{Z=wyzL+wPD zXR!EE6%_4stD=2Q$deOa0&LIQ@f+$+Hh1Bm*)M@*K0MkeMBXePu!n-JIH5Oak!2Es zh&;ZaFZ8yVu}ld7ggA~QXQLIs0YIdjO=)ShDUk2fU(^}BOsvSq% zXJM!0ip+_)P+vM@?X6@fw8z>wN0yr^iCm|;M7(p)K^d(${N{|rwxpm}^1YUjh0cHPz32D^m zth&bZP(Vf=od>xJXW}JWuAi;V+ zyNePtd@6D`5zs9@UqQlNbICZdqL6&y7Tig3FF^irrNrdwQ(?ZcytyHH>pJtYfc54y zz&U2a_`DzVK@s`NQj|tHrjjdZd7@PMc^aGnxxBegh>LlHJYs5D!ZNQNlR0?Ma*YDa zo5cGyuUOO#^4r%Wg#ghre1kO(9MTfHexgv;aW681$0D;fp14%Stm`@?a_xD!Kd#qe zL>A+5Ppa6I#%YZ)v}T5{p9^xL0>Xf=d}L?|_{1@>3Y;|pa8id{nYXj4e@RNvlds0< zTak&4lx=eK@vD^EEE%QOeEveYLFicDDYW)BcsI45lZ+jZx;0LSS37N7glra?@*6IR zApJ#|c(yW+{^yB~;fiNPwUPXEy(!)tt%5CJ<+GJGpH7xMjlprfD$D=)6^(g=$?*<5 zGz`emVQDLy+8lbVW|q<2)ZL^er4?e9>>ZMAca##Fl#|Hx4B9s(=|}ehl^4wOxX}Q2 zEiHYwsLvO|X_diGjF*c{KQ{50FSbX%F|FDuXqs!Ja7Gi*!B6<^o7QD#)1CHHW5cgf z5{O->H^{D{c|w*quob8mbCt)vkf1UypIroQCc9?y9Qu^F4Wnze)w^6Hm5gWdyP*FsotXK~#MG0_{5 za_co>^efMe_MzB5HlVu*(1C$N>iDHBr{^5OK_r?ke}+TC*~|F!;z0Z-S%lT=wl&2@ zw?nV?G;lQ%TdPZj(6o6K=Q8?S2XCBCOIl$C3TQ}*(n5Br@F0l2c5@Yz=h7)N4gH@v zy`rPAuMi>a8{y3&)T}=*CN)kbR?jQ$8xcDadryao2y)v`jle9qXvNKUF=FiKMr zZegX=1D}a2Y%AVG!z(UmmF^llJ0K!YZ`UU?fyW$BD}WxxXG$9r%O zFhZS%hf*nclzN4?>nIN0&Hdc97u({k2C?#RChO*y+^`&uoFvZ_@pSDuJ1)c;t$o)) zHj{$gyI135Jn}n*>$R0zR1-kU@>B}P$&(^;vB{+FD7JCLomF3I*G;c|JYZZ6%p`td3HMjwK$K&M?S3w`8mNKMC*oYa_6kzBs(dIBI~)?7F}YX~ zKcHF;(Z}7}7hd+)^)0A9%%;6J+O^{P)~zvbfVvFWIkN*@q;TxXI9FXN53MWw8?Cg; zz?mM7+Wyy^BbMdCHKdPmx6O2&vutE%n@QjSmh5IH3HNlci>(*yK|gx~V8b1-jU}J2 z{EgGNcu7BiU}3Q7<2BZ0|2kO!wb5y_m~MPyk`Hu`Cw+?LmwoOIU_71-AA)$8e|#WO z^K2*Xb~JrYP<^-bQ3JChP845LcVI;tK9@f|Nx8qyN*CPPaz;vRufIPX?~ea&l8Bs7 zliZoyW1>$?II)zb7Hs=hkLUXG)J{(_0Ie30?YYqZUEydeWi|VWpq~`4Y;mpGI5pGl zYc}+ntc*csTpdWNN-g1SS)Rk%j=%?WlIxlc~g+JWJ$inl&ECgv|Q6jkrGy?lPVkk59-3M0M zxf=}EazC@RG@83yt5#$=fP((HcZnTG=j4n(?gg2ZJwSTmpM@No@~RhkQ>6<}Z~i_` zdp8^kBts0J`SCZbu*QL6AQzcgauv-ndms&uKaCdvp|<-H^5T(S^nu|q#8u6tF$47j z)Oof})3X+Oac<1xJU=R*0B}Bkzp6Anwp=&CRs6E>98ZP zqe(10&#!unqlIby5K)T1lldCsNFxe^Tg)fSmD#r?^E)$4)53AWxZ3iU@gWu5-InvoZIX7#<4XA>YQB0?lR%u z)BqmgZg~37*;eHo>`$e1X{Aw;B|-Oc=l$CejG(gkvg<EEJDyxwzu z$X%FHjk5jQ73C*W70yK4mmUW5LUCY^Gu<@ZLoBNG}l8r}PjQ}IwSB%sn zFd2XTppR)_$VK6gP6s0MY^OHl! zQ1t+zX6h23Sm;IMO1}yOQbKDv`7QB)#D0?SvsqfwF~MaAd5t~YQ-u&a*7|M(STV=x+__FQT>FgO})ze_V<9Ty_`3{2Ez4MR;TU<-? zvB+`ip1Gf9)2)86W;siGBN*ct%Fvr-@42knzat?9Md;c)YW=x8SaXfl>Grt)On+%} zMcBmN2k}J5W!hhM~|&S>h}550VkOAl-kY&>^A|XR?() z^T@JI(5xQ*nY`=SCMs&ZsX_65dl>Q68}+?0Nedxca>YCQvxhR5LaXWT)s8#gH zHr?LIXzj6Z_x-?%k@-62?|ht2>ZE#jQm;psotM67WSB|KowK;^cLjR&*iIMTC&`|30F`h)g!BpdNVF#N!lOSHf3 zhVc;$^Al+#Sm++?YCdTP^dsD@F=W&iG7wq1eUnARwqb6#sfb+NYR9_8L8~we6`@$$ z`0vQI;Q2IVWPe7gtA`~Mjs_V>AB?F)|6y5Io#Ai{F(u0F9x>&z`ITNKwyS$g2bOKI zl#2auEZ4UFF|0I`3EeqbK;yD`Cf}y9sQ2QpBxL706*{`H)9M9IX!}Hhcg|-NF=&Q% z3KoX(>t%B&=gqp`OD28y;@NC9zAjYD^PLJ&~(XS3C>i3}X7*eb1Ok#BTcztb(a`G^;gthAV zjU!ASc0zarC|dW_sMf{7Vr8cl&w44n=uM&vFW?oZ99vVJbkE#GU(Tig-^qrnEiXn- zz9cPuzxN;!$lET&PMI9Ci<1>voUYIF%ZZbng)p-mTQ9#TBqfOGXSR zz2@bB8hb|S=BO_U>H)iFg|+Y@YY3Ahx~vx#(ROkz`Der5>Pw1e{)-$lXFV27S03pB-T@)3$PQ3j&T}1CcD4@l7Ny_rH{quR zyr5k?Y`-viIJs77AFtOxyQD$65I!Ea3!%AypU``zLOyuVFzA`L!0cY5d!kfwSto)t zxDIb|P#DK=ag=^qfQOKHssL?3Wu$&sfQJxxq5$jx@U%2RTKI>M_^J?X0;9+RHE<5W zag@JJi-`O&5Dr3dgaKIby)*$@@P`q2svvCyqf3EW-2b=n@Q5n}Xa6q))WLIjE?D#5 z1_SUCLQj-1Y-1r9m(6p&Sl>(FHGH=eoYz|gD}5NBIS6+Y)aluOnrC(moFfq()dvrC zb`>1sgU=Ax>=HP7tY|c{&zbR_0r{Pxiw*J~FX z_q7k)=k`A?ub+n>s@Ei=o`ABX>k z`@bT4>!JK`fp$XyUhx5ZApW;^8#H5o?$rxA%iA3OJk; zInQm4kft$2yKPxsNbd~#G-6Bmi!TnM+)r&~BLEpV-8Ogr2~CoV{kQYvgLr4`(Cdy% zr|;woeeT;p%893w_c0WKjz|}~`qi!yr_UOJC9(4n3g9t-7^;0yU{4y98N2JXC8e40 zVb>led8wDnM`h@a*TehW@Ad8X%Pra2Y2M&1QYn~5MQyQ%21Ppy&z}5i&($s;n0x5FH8v0w@oEQ0omhbOlK&IYDy_4gVDLr-*#({`S_97Fjl`-mb(V#L7F6ka z)?$CTNNu7A^atepyp69PR5duZft+N0M2p#YndEW+5R|DO{mafEOqcR zT^T5fvp=Xq9)6r3xC%_ud5|)7);WM=rN9y(N=%b;k!w+djjvBS{S2CJD2ZWEOZWl$BZg^v%JXlm<7X`eLrmHS;bas)-QiE<5+j7XA^0+?^(cz*nQ3;y+%v#q&4joZNkt2emrOq>3>uAvTd-XIA6t*l9UVn;bachn_=U1-n zYS!~(66lt2x7Sa{i?>0Or5+;0{;p9y+;F%af?LtEDlce_U8Y}C;w?^T11&eaNC#D7 zCTMg*P#H;ZJ!7j46)Cv1F(5}rC$xGc`0Hf~D7=gpDRcf3=WLy$sfP?cJn>I$@W~QL zVU|I%ufjUz4bxnVZee{5qg>){b^iA~b9@;^ZpchB(&>yam^^3t*gi#IvG$!Rf)?e; zucFfQ$wjnC!-mRSfm24z#RJ}(x#ij<-vqw}pm3M|h8v%Rwmy6baM7ai*mQ@)=zN;=d1ILm zxufKnTChyxKb(KDn&@`!e5>LCNKQIxbr{4_|fpRuTv!@HRCBz zQ-eMvHP_7gax@}TkXofc#RMr?QRIqLHP1!g)%D4d&rC1EL7DjG3t>>;SHL1zq^$GI z9M>57@~K^9^sPY)tq+{$ z*)5dts;3Ns{>IIVkf12^Uax}DlXtQgt{TTy6fLp^-mhH@5CM%YAFkaefbrx?-*NongE$6K6&!%0v=k4 z+yGn;Bix@vD%esxLNBTw&V22}QF&6LZ;^8rT>c4eriq8796stZRH zvu#f21FrfJ0evu>i&RLI)uUx1A?ap|u#>0l11{J4%?9t0}3 zBxRCnDG91pAKr)z(ohYIOOQUbEM-(yKZ+%`vZ+BtTLf+L1~ysO^1FmVl~9sf{dEQ2ItI@53P@U$RC%L3|EN0&S)2unuyOFkL&Y{QN7T8(V=Ien zRrZnXz5jM*$J-_p;CO^_tn4#~AoV&}*sCih?JNQpaCaChz(zdhp&&|rS@6OA83Dr7 zSIeZ$!GOk$OvRi>m}o_j6ISnzHfXjD7Tchpnv7-{V1U|-D`*~*j6}s(h_LDmRLW+c zQL$Iy0oOPW5S=8YiU7=fh!BP6I=Tyg@U4nJFpI^Vx+SQC&DpoY$Zt0U&lg(q^b5NKkS)h z%_`C@z3Lp>FutWxoSQ(D_BDQLYR*dF-zMX0h?x^OYxBwZ_ak1R z07UXHwAgq!^$}VtMrMXMT{Tk+s+OcDCH{TTKG*D`r&+UxmMTE_=g{z#KSCs#L{Haa zW=m>nTM{1_JfAcam{p%hvtE;LZ@`)ZC#>;sUbd`#cRi=w$Y?ZWu(t#epgzYb5 zq~1_0_Al8{93?!NYLpQ`HLpzAx4%|IsfGDAh~c>Ut|rL11kd>~UuSpu zg)ebTEG2ePKGq3i!8+5?0|?_n)h}1Q4L?D4pwEV&Lu@4-Srh>4rOC1J%8)nt@k^Om zYbX;W3UAo0iL`1u&pCy8xpWKMq4rl{Drg+^42^Sx$yE?FnH1ZVf=zl_F`#$SC9j=? zKzDP4;#86#x574EFE&z7l=)1vs6gG@Pf$s$iXb|q3{kf2ctKMve+RHE=_rdEPi5B^ zMbk*MeEvNJsq@@Vw&37WwnGMPc~NdM$Ha9&1?^76$$F<-%7)_S7AB##GZyccQ6V3` z3kw@3bvg164^qGRpg0B#Nmp}=lA5(Ddn3a(>7MPwW~=t|%aV7(U)7!uuF&8_G*yka zB2S+~KV?3c9-P;QIh!iy}}>u%VNA8-^DfJ zZE_!Uv%xg$Ws25&del4Rj0AN#IB8Ji@M2mF)b=I-RZHDHsuyo9JdYTLOh>Y8zWCzA zV}+4;NRmuD1mwIvDZsZl&<_p`r3hT9^eI2iI1tj51u1uSr*BCWelDWPWM-}Ww9W~q z{)oA$lx7{S=NVF-Id+LhzqaiE5W_YN80IH* zf1fTRfP(ocYV|j9H~*fjbdMUv9+9;iN8(_W0k=0xVFRGP7@rBll})j1Lm zZRGxikHfm|)Qg??&2Jx64nGGQx63$|JXLh<-noc$Bf)Z-8L{KZ+8VI>!m_F~plnC_ z8vX0tC|-M!SY_B-18_O2j##mYG!^Ge95lKNM=OcfY;;74l1*FHAtxdw@K?uauOv0`p=DE8 zD5~PyzQ6vmc#)!!nsF?%dueu~8Uvhe9 zxUvu?fw_Pib+nJr?E5py$&K!~jq#WEi-Rmx4VU(f`qqOjs|U@(1aZzz*q?tscZs}r z(fvt$NxOhn4;Suqo#*v5!ilFtcwHLwCT|(o%_CHq9famJdl=k|PQTLrX|e9<_A%-! zr@cT^7FiIJWwM0iPQPy-_8I`rm)g3St+zwtFd?9K=!l8^CXt7)RqqDgwcS8J$orHx z^GA+8DI;nf3r^WDIjd?4cmuW5!$ zvOd%4nnS;G42`xqfkDglcKzF}nM=1Y6nJi7k9FZ8s-i39^kZB^c5^SUq|Q+}B&OwcGf?KOd(49Ac7tT*RjA~%gM|99PU z!dk=by=v_Ou;sjvk9!++0T+bK=CS34g99%nc7FNPLQ+ueN2wl$!7>rfGUIMy`*ULf zqIIrw(>Z)VBidOWp&szLpLrYKbVR&|b|Xa-Uem}sifQ(Yq*0BRphP2fAu&zO^V})S zj*Ydn-S(Jdo+qFj3j|ESYr{s5#(W>)MgxAeKcxIDGwi8oVB}Vd>1GiMyY0j+?!AQR zMg+G3uJ9MrK5K*ysXUm0h$h@P?ZF#ikgMAM4@GD#qE0G9opbgZ6+-(DSxA?MI5puf z-YEQ;37EShVOEjTwqFs|1#aKfa8urMfj_<~gRVY7O@?+<9%6o2=t6wDp6XLg>q3-N zRlD6@czrJE(ubdCB072Yag9AtjWG4f?ElujD>t{wbP6pztmivY1YaeUoQO~qMfO3N z3dKY23q4q9sLqp+ITD~%C{yh@Eq|aXiC0HU!te_s`y#&up^DySSoX4qiM&=J;onJ- z65F_$JjZx5Su1`IA2v5JNW#}ulZ%I*Rc-ivr^~{kFg_!K8f@GkjnT@s>2KOZojKSu zeB*5{kVZ^nx(}MHD!82twVxH_T4RWPJ)x`OK4ZX`7rGHxUGNzV9aCz{Fd9h?OnFTq)`5v zq)Vp!ih!fpJ}1JFxI<`p-5Vj&>88?F8z{8!d+*inTpRU@PW)$+j!c`y@VQ-&Yp<~5 za)DV45kxT=jRdZH=b`@|Mn|)Y_JIh!;QT2QZ-(CWk4#Wk-mM9J^EJlbyjxTu#wO2q zkQ9h(@5#gabrE>Y?~1aa;d$Dex)SpOMe&G|ot0y+;OU5XGQQ> z9x6kRo0I+Q&Q6j=ZZ%~y4=3UaUN?+{dHz>5bkeKUs{Z3 zfT(>4;F_JXqREup7KcG7uFP+P&O;!0k;u_vi8<`Ub}+Py79XgT;xQ%E5Y-&*RvWE( zqJ|m<67h#auVwwNvG>>4U$Y_3E%O0^cYr1lPfo1Mtg7@43kuoEHn-__+cgD;{`)jX zU~TW*Mv*F!#kAxfRM!pc*8*W@>- ztJ6R=U5t}=Zx^eP^cQ%PtrEA}$lQ$sk+QYv3-7D8lSAz5cN+{J#cd*HOf*-npKI_c zv$rGf`fDVPkcYe%Iq?BO!#DH%E6X6B3)gFq;BR^E!P;9nPX%4axtD7`TrqK;`r5kH zxgw@FOqKCRw8H;zhcKMF{XTsh0sxHC#R0nMqYeG zM2vUCGd@2C^<6o%Yv;n<#XIkZzoOhu`mCULMbpIL+4?CQg+Y8w1 ze7w%F6B&E}EkGZWFlU^yJmgOp_H^RS`aW)nUc4t{X#Bg8OeW|UL zYcKgxoa9+YE7d4C2cO)p*Hg`do`9JWfZ&sXi*bF92?#D_vS#BFbly7D?VHulG9kulQ^qvI3S_N`8zh*6 zzkYY#vVMc`ypeuZ~>A z5TXl*fS4krKa+4bCmu*Z2*D3v>y4@hx|znl0wyE<`#ATsDTy!KckbGiri3!-Wt94NHE@OdEm}`ms(q5bEhi~+={YaRrVpF=wbsn`K#p`Eg_48Y{E#Lj|upDwL z2>+~3rG+Nj`?;yX%)c|vt88}yObtTu{iwZH7XVp#PLsx2p@oyD5qc-$Nq4A`Br4Ho zxwmCleKF}O1cnE2jKrALp)N9DS4yMOIa>LoA;IIge7F?{}xh>eLEDNZGT;c zC3AhOF2BeAB@m(drck1s*mryU$iLw?-g*Ce6nfh%X8%oQK>|i!->wPbmf&T)>GVZa zkuJt0^k=VGfz@s(q;@j#Tcr8-h-fH6S1Nqt;bY(;H>qIP&}&>KkFhD3G*v`L<-KXK z^`vVQc4YcsTFhuJy~ImtMz0oNF}6roVUY#(lFx|*DM+Kkh#cm+ke6KN(l-Pq|95mPA`q~-D*3=0&YhEEb~gcrY0 z)aaA>1s(Id#0n2B7bJiaCsg{|#bM(zU1LzvvfO&Lz;F6Vyj1)=d*O+;>vxo@7y@|* ztg|^>bIB6bK((d8SPwC#7kA#5+9^YITZOk{-A{~**%_E0om7d8gdpd)6r?Dpk(N1a z_t0AccgbzKM_DZ*2N$<-KiZZq%>=e&{@5(!3J2vS zVWQ6POvLU{`%H()GCz$!!eoHx%>N#0*$b27niV7N0Fc1W|0HV!E;eWJ)|LJgly{pJ zkTrmVMbC$|tP>15b~cawgYeNw=*O66d;*uP>w4GLMX%(vc3_@g>mzM#5ZCOo#p_=& z+f$zB#QrF*%sqiK>3f7d>LSwl3u@1+?n&!{ZmtI+!vq^89vfE>a=~`gpgKVG9@a zySh9aS}V)<`@MsDbGA+OFk5sJxU=V+LM6rj%Xhh2!B(I56uWhe5q5C`Id92?1i4bj zILrVx2pll6O%Asr>*(^K*T1t}>6-v(KTN4#IO}7k<)nV}xv@cG{u@ntw(CM(mjc12 zc|V1Ubg2q9d~}p4i{S9iv6b78N1P6}87FOeAn}W8`vDnh4_1(umWTW!>-QPoubX$E z2lqad-`a06=nM8uZ4a&Z#Hfel&~nq_bsbfULNuNS#pDmqQ4f0@B2H>_`e@>^OIBQX zk(%*@*TApWc=yi(z|AKegAl4QZ`X9YyPYj~*RttZ?VS^G#)xeTJMF^EW!q{1>3!+g zLtNlJ!@1NP7RF@kIMGEmi&2^T*HP@O$>2RxzHlh*MbpRs*s zfIay3Ko(#RkAhu@u5jsdlPO%xZI|(x`Z-XHi>HB zH~k6halZ{`5p<#61}w9wTTOzZdlUJa*-YHG&}cVYj;3F^#`~}Z7;X{YkiV<7g9t7* z(^TaxzbdER`ml-$7lbFd5Jtych3x)Zh!QBpt)7iyWphvHipx;PSF`%&*fdrHa1Xw* zjwU`0Nqe&d6_PR{;wn&A4HMGhBq5Ds<-|#gLL|u(Iw}LGqwfBMVx^~Ne%ZHzrG9!C z6e8u!bk8a1_lzX2l2z(v&1(5z`Xa}cVhe-TxPeZ=4VTyesHTjQrf1Hb(vlL*2r`Y4 zc7%f~PLiFNNuMPb?1WovbIxaI^CV|5y{r96qK<)&zi>#3t0ER?(*IwcF%jBcm_{UO^X!j;IK z*op(PPrh;Cv+I9)_s`7V{y}eb)Q^Zvw40lqjL`9rm{=@TZm-=R%Zpx}7y> zw}Q9>y%(7NNX^(gnFKGdr~6r@uas=HIRAVrPGMluN&ixUby=lTbv)|XpzVsl62ePV zwJh_(6IrjJ=o+>pIRy-0>($Yfjmd?WP@W1(U(dkM%d4 zRH^j#-O$cqocI-QDHEr!R?d)C}hs*u)C{5t;%4*{z>X}{OE#x-iU3%Ox`mm0La zrW?FIE;Q+0O^81AHmd!2GcUAUX#cgB?MQ5yWV6cVy21Z(a!nSjw&3fY~SVi_y=o zw18K_`bx1YFR8$QO&k8MaPCjHRZ-0TU&-8{xWj|Qr2IfW6AW())KcS_%b12bhP6V51qD%!b7-=fy6|zL2 zfOXaz;+q@KC{~}Lc8rXTt7`=K*?#;+0tv==f5FZmx{0n!pw6;4JQL)L_tzda z63Wz~wEoC|Dr1(bF!?gEA$(h3d=g`JQ|c_~efX#*JKJ50Bz^va6{Rr?en ze`dT`&lqD5UId-Zvv9qVB;t~Nj>*kn3Y**+tM`9~`8$I;{gIbKS$oh!=xDT}yWO8X zpS&o1=fk=|?Y8bZ+aP`^vm7ir+!XtBa+7+)YcTn@rCA-#7tUO-{Fd1@9^@D!$1&N1 z`FGIXn+f(6_1b&Ylfiu?>2*#y*VuYbzMNfF6VCOxu&6JVB68k&S4e&m9iaI|tIU)! zpT@X=h3ZXJx3g^ZQiE}-=(T|BLtwjmz4BDW{o~2*9YIy`+5;RfB+qs6QHB=>`t9+N zDlp%7P9@-pUFo!Z=9ERO$ZL}4w_}qH6h9So&GCb~&Ne*VDeh(=v}&7U?U`k3y2~8m zi5p9i=B!USWueNkT~2cWRJGARB~i`1>w?6UhAShN@n$FOi&?DMXB&)~E=caPHJ}N(`Y7wgmQw3meP5rw zLy_%O=B!Fw&q%3lg@)&8Q*Pj1NzRU`4qHP9g6Vof%u?(3vhb=BAsF&|d!RD*Pm-tG z4?%k^TcVWe=Zh-;?<}!s$(||EJ~0KgDJl;>Xo?y|-J3Y_Eoa$I_&36^>>aANAoP*V zIH-31_V+*S4EZruLLExW0TgMPctz)lVnH^xv$GB@ny4O;eF_ZHnKmYqsqu?G5ylLO zof}-kY@^Jl$Y^J4(1#a3J|Qo=40heY|Kf1zs^y7+?~9Xrh6-~1789_>Z;g6>CqB0% zyYk5!pT#|nBY_5@L+(f?-1D3U6-n4;9gdvqxa@PYBm9ixzDHkk1b$9C_dm019Qh$H zWpkHSIu`NtP3zd9Xh^Tkt#GQh7j^8h!7gc&qt~aKU*8IwYH(a|xrt98#yja!CZb99 zQ%5b8l_Jl~JUR9xexJKnJ#4{;x)KBFA9Eh=O;J!#9v{(BO7qM;QE;)IdjH7(UkF&* zSz9`KcsYA;g3Xd0=Hf7jGK9S*p&cfPNO&jl*wEI^9ay}0 zi?8$U&;98I@BqE(10>enuwN&3L%5B0wcDWMSe$|3RU8BNk6B49Si8U>UqA<#m=a3- z@zSKxqV>)*gp_3mNSTn5lb#^9HPI2D;1F-m^l)ia@+dmcNQ19%i_)`UkkDGroIA#H zwkU=<+4m+%6z6A?T4WY}hTu4+yAseYJ)O;L^n)R4VR(wlvjxg{;p*O{7rQu${Ey2O z6keCHqg%9oa&Eri=V<6UWgp-fJp~ZK)S6nQ+2&=QSJWQ+wW9K68M0KfYs`hqwOrvV tV$IgQ6Bnd0h9M#dPQ>l$Ga1`v;5_R8>LdKexPK7%2Z4VO_!bxN}B%v_C3ja-cwEWAPfcL~#f1ONbl{5Sm{`LCLlm6-*EnT?5=iG_`w zPK5F)1kT?YNH>$%^))Q^I8938j+d;~+Qu3D)^{ zUT}gzMwc#zk~RRbT7Zz04B8#wRux#EI!CsVa8N+qPM=bPD$Wh+aHVUN3_SR4;283OydG|r~&vq1Qy;SGB`{5>XQ%@6XYu;Mj%vY&DhP8X;RDZQ3Y2(@{cJffwbS1+vbY{}bg`l;4v8<$(P!`{g zUfu_IrWMU+EXBC&t+A_Iuv(u-+&7HZ_rK=CX^KJO^kzzoUN_6u^%f`{nC{NCPtb>~ z5!;#-(d@CYG8tstOe~8&{*aHm&M=Fv>^qFD!?z2TdI}3)z$}@8Dm%9ML3aYAB_o8Lu z%>uhJ!@j~mL_cWHIY*e>_+7L`W!L!!*M1m}etWEeEVd1Kj>Ox0zg~K*7YsQie#(MUH#ccnOEfAE^0&zLY9ze072mCrpfe)o85>%E2`??n$M zt83~&kI0C)OPKRqr4X?=i#3|w>rU!A99w!y7(hOmTSvN&^G7r4mxRt+2UXi7TGylRm--P8K7H1##z&t0XuC5f_WV`J2;t6{#&#bv1JS#e=hMd0>08 zqpGrg*?xR;H56;ski+68!g*)+7bwk-SxCwki{R8W8S065AOX@sq4lM4h_sA7s?vv9 zBpQ;7YUQHx%4?B#PU_Ac9D~^H8GYu8aPoE|r*XO}TbWc@`Q&gYesraTpcc z2Fv#bCM=!bV{lu287^NUb>Ai>rdH`W$mWosE-oHR@Ow3-tU0>6simJ}N8Eyz?x4CZ zvUR}tY)nj_^R-l$g}qSGjK8YEv`V!cQ>WIegJFgnqp|{FL2>x#o%}+Sl}zfV#DxlX z?xnmB|)K+ddz0q_+!DAwA{Fa=~8!7iFF!TjEKlTa^lRg?y8 z2697}jix_dxf^&!BwOP7L&&im&W|QDjT9~zjn_*e(A4psrl|zDa#?Ix1Nj&)a8*mP z_#_gfA8l2gv=Rsa9N4U$ByfF;DvWfshF*V`;17k`Ti#qW>eN?(Ej4*8=$^nkk5(t40Kw z@bUSK|4i;KaH%qteVJ_gNlMb#0HR3Z*0IfFF_oDXBz#QI!oqSrKXz}m^fM^%=up|- z{A6iyillSj`np?PZT^5Xt><0Y{Bg#d$DzYhT`iDNE$|5y(AWjTnl&*^6+M#gdE?T{ z$Z#z%ZqU7>FbbrD`@a3y4H)kITD>aP$Q?Y?h#TL_clq`pIGoa${c(5kIemHf(fQ01$TJiQ-nB~nlJiuM+0MZe$2y9s^&qPGBrUO~6Dk!vHsq z*cdKw7vG$}lJB;V@hJ8&C;f8f6P)T;8b9vDTjS zO)0FP0x7+6umA$<5?$gC)Uw=<*+&3j=3j7&CG*L*EY<}-_6ud1#wG^C!xvh!p?*-t z1Wy)Px>Ii@&xV4GU1d>oOyI1!Pa{tJMUcLp2C@Q%958=Ow6!>Cl?|alSj1a**lpYG zESIx4&z{9N>6x4w719k7QNybPuqdQ>H<(BV5{0sm1rI052u8k;D;MRI_w*hQOjVH6 z(nbWHi;6(lQ6;14uBRbHWLdHwEt6phI?&cw0y9hBSp699!?|$9yhI~+31^|^^#%D> zrmX-782`%Yb30)<$a2Jb2kCOL;SG9Ylg3DPY4D0>Vsm27OcJR>WzdNPhXH&W%G^c} zUIZ!f>9KtgoeiporNYH13$}JTe+v~fVTF?3sSc2Ripn#yA(!mNa5~AoO%ef$8PmT7 z=S`*Ccw(c@;EPC-v<@S{kQ+^I+Uh;{Z?|rt{MXzBE;ppw|DCb#HPiEu`&Kz2d2Z1V zwqC0CA~ka69*2Vpp?!=!#yq>J%UVEk*mMYG6JkcV_zBQ__&@en$#@j7e9`4CObozB z3PNWhdliq!5v0ozY*K9PTBhk{%2L%gU6g5w_q~UQ_x}BT6w9ae22L@v=>M~qsKe{G zQSP$hD26i7|x^H6%sc#JiQQ`*SqP0}yi^ zB*){QD0s7&V15hZ#=NxQU?7vW34xovX*K_+y~wISDY2j|AVX zzFk>?3WV@C{F3G=ATRZ+qOEUqhzDH)@-7{ES7OaJZ(+Ib>dEXHuaF&TFj6Dn!B}>a zvcwI$dWL*3U9LTJAInF_-LMaT@(9B;_Ct5T2m2%x4Xp2EHskDankb+D&O;;TQKsR0 zl5F)+gLVrf`T5?k(-r6O)A>GWl8xL3lvHM$`)eaZPx~+)#my4;^MSpL{LS~4|Mv60`GH$@hUKJxhEMS2pBZ$Tl;M4YLT{qf z@hHKKUBnTNy)rU?!MX(IyC$T5OhRk?UP;o4i`hCD5qoI^J%Qse%b5#DAq*d7v~s%# zUu-HRt(!(7Pk1;n!&;Z5^bkq3^9dtMpYzYx>vR-DV*}6>~>vC45@Lj{w^~b)m{R*eeQ) zKe+Zuo-_2Ic$58y@h6M{YCZ)q`7l5}%7j4T1K51qlt70lfQrW-L)xWo3N&1?XdpqC zsg;06KS}pJ(aCH`wiH%?BI2XI)9?1e_ccy2gHT09Mq5N0{rXLuCkYK$B6^p^I?k92 z|3jbk7}+!LAS?KaJQ8-iV_9dF5_gK=Gj24@Rp_C2#*Z8YLaa+}sgkRZdsWTRX$o}< z%Iwut&dWX9Z?LdlGH~8>E%+kkwuQ=fvlb z_-A>mjp;2CR}RuYBR`&ai%+ieGIAEygTfE+F9GujRN0JD35|p|H~v(%*oirWcmRPL ze1i%r>*Sec+`@$0p2g!WTRo%#xQL!Sh^rjkHs{y*DB)~xfLY$;Es2+1$jA`3T}s!^g9MgQ?speynhxq6gMaR z4|l6C7Jb$n7Ot?RWHy>MhCwsY#>zyomv3d6O+Sskus|{}?Iclm`J#@l;xs?DdU(uRIcv)a>2bnasn;7h&wsEMb zaox<4xJ7unAXq~Pm1KGWRyS~PCLV3mowo#L1rLQXBHQ}2UFi$OAbDzF$_;bGw_Ic& z1_(yZoM*b^4{$Sa=&Wz;_Nk86jD3+#k8BTGGI<|zMBY~H*_zn);u_@KzcAXA;@+eI zj-7jolVk=p9d=O*Ts{R}3^xZf*+7aVsC03HWetBp8zope=J+_TfvM`pE`BeA$9m?C z_KIRnIkF7g(%nwwC|IhU_5tg5^Xqd$I=7z7wHZlV{dyW)xdj3%j)vGD-{d=9?NR-C z8KJe?`Pk0sAf3@tf%X0rsf|AKgS@ykUf^(xK|6w#CzU)jp|2DKX!ZHzfJ5W7x^PfI zj4vb<^mC4-i&kWo{taFwvL_N*{CB$j?la|A$V!qzKzmaX*nW8Vc}>z|_)vyScXCD* z1H)Yqivt(hmZjpNht|x&9gyWrBv75jP2My(5Gg8~nk>OoBXYRj5*!)XI$;6Vo~#2j zvCO$R8i#}tRG=aot_U0AG6v@7fTU}Tq`dMysh;Is&Lh9Kr zGn(jM`|IwMl6BHqc&M#5Hf;I0U`8af-6y%;d{ifsY?K7`9eNiATT|vO!CV2tgZv0; zTnOU87EBFzCO%y12C;z`1e=n|(U4&$PjuTURXd$H*0XgAgO)n#NUS7`lln0?u@;J3 zhgt4V$YhROy^ZEyV#KMc!ei|aP6Gm$WAA1Thvj^I#%Z81)fheP3ZmII-K0=0s)9LM z6SAfz7&dBSy5fs$sVK2IW#9!9R*R^jwB{+?6c8_MM|`F84{aV2j)7S*e1xKW<{5+F z-u;o0kZ1Z4%2%%!>=drr5*3_sUhbxpr&!}Jmz9gTW1Lf(qhw^35O3~@-?3KzP954R z?Kbu763(m3@=*1EyOkVo5q8(+4n0QBB&EJdecNQHa}$JGc}Ho&uoGvffH6D>9Nzf~Xjr3;rswhQ`85@WLuvfE9ms2p;H!Dtqfvu<+}< zr@HXA+NQkG|MdL!J3VUh@iom0km-C=UGZ0@nIzzX3gl0fT)0mREt&F5LW_#e4x!6w zpb*SV@fF_OkGX2{0`hB)i8;BiHsp4aP`89Vl(MEYu)y+ub0emJA3=dcjK*IzL^uYZ zqwI+7i-sv0EdENnNlc|DU=wH)V@t<;TDZ~C)Ez}QDzQu!O(#C0=ehxWZ#9T?OH$Nb z0LC6+(bk&NYPKou!DI#>_ErB8Q9ia&C#)h?l0LX(X{7vR9?sb{i~5-_3LfXIme zcl=lNs~^90>*dczF&@VXy&kR~-8QQX$Qu!s)iLO-hO2ZSW4~BQCH)J#^ckeZEe$A| z0>0XaZ0RG%_ulrglVY86hSP^`2l$E6iH$+$TE_$5n$l$6K^~#+WAxW)kbKP}6juJs z4AG&fFS7hgQww!c@>-|d%GbQ6m?v^q4rc5df@HQ6Nn7tCE}@O7c+9TjgliYcsKRjGcO+$T4JK7>nqgZ~AuWTb5nK$ISENe4ovT}~>_aJFn1Q*zhgtyoAhJkL?A~1Ix?7m64?HGl22jVX zkgzX;`s#p%8kN>PoOzfIBE~ZXo0IhQ9y(=J-@_cv`y8+BWZplMg7!PXsem(hSo7;x@T8xwQVxb?#;-W?#ux z@Wg4H)Ez6)*OpH~ug1*hXeEWvgT#!YVqAxznDhN9I8MoWlyV48w^~V1C(t-?|2l23 zc(yPfb>tt`oN1l?_3&%zh4`_muK^Z6!{!WmXG28J@Dt8R(|G4E5F^GBLS~tC-Q+rU zr@G93MbsmvPNLxqy@QUeiW@piTZ+vRq{Y5_>a3#8)XyL+wtQ^2p`$o08C4<538Z)2 z2O-#7s2G*2y_^c*FhFO7Vgb6c8J{snY0<7jWVorm+I@9dolAzL<6qtt*q!uIpM^YX z6&aS=A?aYKH{Bva_uk}eSlLpBL?C%}grCQJjB;?X2JE6tM-zsJrVQraipu@E2VwfN#6DoJ)&Yj=`N6z zBy#ajPZio#=sI)E=mSEfvPu9{&KRUf+Ofad6XG^i;HuvL4ht=%q_m%U--kTbjcKYc*lBOt8!HK0h ze}^7IwWdX7!QN0Y?k^EtNKZ{jHp!PDeif#SZNI%_N#Nf zZETK1H>+Ot+bBd<(%5l{Jn4QEqOg>J;cB(&`UYhKC!4LrQLq7-#gbNty!MGV9NZP(~XILuUe^YqcudYlRf$sMut;rw=Qg>uMFDjS|(xXU^ zGph;upLw&B9lE&?Jn)MfiWkkJf0-@SzzO@cagnO)AwXu-9ih_*ZhB6inEK;xgUCR;{Yaf;saxH|5`G<4SNY_=m|I$elHgX7BBZ|!eyo~aN>WGes8N=WV@1odI zI`p5>=6}USmJ0*uf+!*^rlF;jQOi)1(JoAj2u!P4iblA#FgyZ{BWNR|QPd}NIIW6M zqxr*`Mwe8t3ZjKDOctzpKut23wfDd7+nTnV)@vLbs(BeErJs6O&(<$Cfp}J4CGU#M zBbX16@JfYQ+K!-Shuc=&ejU44D{s>zQ0`BW%+%dPRlc<_5c$RHoKxtCDo+BaAr;HZ z++-_@e^piIk5*jfyN-3|T=oTX@FYy>RD`F}1$Hk=nhoDhthf!B+oIhF^}z%BKf!-~ zb(;Ecs2=k=sikfo`GnW}?y-<2ROdpq=Da9VTCqrNbEWd^KQTI$xfsg_`>jsSDKd|U zQeTo1c05`N0uoGC{k(nAf3q11nJ;p3)FhXJM$|xGRb;Sw@!Q_# z)^aUi;k-7>=dHL?V0qoTc;B97`M&={%2lG<5s|ZV&P?W6>;(8XDP{Se72ZnnRitnK> zBfODoDkuirEezs0W-_0CiWyAV?MToGhZZ1^Lq)$PobU40+4No#J>(C!RCU|j?I@Ii z+BK7tGZs=???Y6o9W2>(6dK$Tw%#bh5ICA$Mx0o4uWM7Nn?5xgy`*^F@Cr?y+U9deI4%jSW^;43-pcPhHBfoUCE= z$O*VQ6Za&+nLG2nu8*dkSeQKQt4! zBOmx>k}TB}m1wg7Q#>>li@VE&yyRKkru;mWu`REuIzLVM8s`@0ADB$fk`)%~X5Ywx zI|NbK7#LzuPwv|4+tOxz(&a;gilHOo7@~h+JRT~_NX(DJ2|3&iLNzbCCz zzk)NH@hep)x}bAIy7E!QCeOiz`F3XRyHe%%=mXF$Nc8g?uFQIir0PxxEO5umjDX`E z3J)H?csNdf)7~-QU}1RlcX!7q6k3;pzhN2iM|%S@H${~zk2kzKA`{_i+%GhU{Vsfp z>&{oLi`I4_HJC;Z`@nM&RcHG>S9-G;bD^+^>$*AJEf(N1=fRNdDfSgE4>;lXuZtE= zLaU>SC3B-i9J7Ztw ze%VQNKWVb>a@Cfe5J&YP`SnhX4A8C^dw?Ah-KoE}lPY0LTY3WxXLPPd1?rzPZppeR zbd8ZkG!z=m$zLd<*s^QHL>MMz5;IkqObrwe7Y##4GBkcEE6KB|SEz6wW_Ze+)=SYL z=_t`v-snEUPI^->@hc*vyLg!XTiWN44$0%wnJKZHq=xBs%0!}P%a^IneRrx<#b8r2 z4t6(^Q4>pBLM0}8m7}?qau7yM{&2F^Z@Bm(dM~Lsr2nwn@Ndnt21&1IGEYD0PcD;d z^v7ABoPVdCc(Oe-g|bR{2($9~<&J7-$8Nh|G;;ZN@B7AG_Zz z6{dkm=@$5%S}o{vQKDOylhAL&kj20H^11leTbFy(Xwj9;&z^UI9bJkC<+(u+S{4^Q zj#CF_jROgG-Msi)U^9rg$NDVVbcUX&|0HibR{ND1tD@q|kg+iED>pLsW{D6hJ1RD4 zDxvZ&FW{WDJJSe@W>zeu{7kIlG&7k*|NFYiwW%#P^y$$1~3~v2`~KHkLN@6$mu%B8||E?14#kL`vi>}5&^At z(=ZIk6h|?Sn>0AmhH!R@%u=!VM5YXR48L~cw{m71x}*S~ti*vTPH^Od9lh<$=a{(2 z1ZvX-*X{;Ufkcf)LOc2eAr^$rK40Cw#g4MYoMJr1h_B3}i%D4EyHZw_s=$svNKjC{ z3{qc$hd2vYWBBK%jzR23T48Xk+~sSL+hi?elUqoj@~4$prOkMB?VN+Tvx#68|BiX<8q+XBUFT%<*I;*(sNi2)@`blBhnU>4Jje; z_OyH3yJ9D_yw8Z3y$(eUX&xOPKX2JOoiS8DzqP)vBL>T%?Hm4ls7&VY2ui8aCi76* z#XysPo{czO3xnLg8rg3g${0IG&zm|RJqC5`ahCG2(nMSJw6=Rm2`sS56|DLGPFP%Q zqJsIA{ixg*q*3fB>lZ$JnI?XGlfAqeV!gF8G15Bh3t58x-Y!)A?WWS#vkou)`?1GP zN671RxAn?h(HZx}t`jZg8vQ>CH)RI-#qNWODlEZga2>SL?MKeKU2o$XOp-^@VV6*M z6H$Lt;d=K~O3^!d*C%D0!cgCGj#^CxJLfup6+Eu-%lu^P|e=R(1~jD*IZJ!&N$eDTUI}3BsE8 z|2e7dgVXE{ct}dJO|abXjA2v(!_3NDECFBtCN{-MwQ!xR!+{UOCWnbc=uIbIVIh8L(>R@ZMKo(Mky*}Y@A_W%g zpP8u(cX7sJ1o)BP+zXe^DlP@flX#ZdKZ900F9}H8r=yIsF9`{VJ6HK%A`OE6+&?Cb zVj%isKW&S)*WY zI5i2>Bc0F(kZnqFqN~$%yKqQw3SYOB*7JI7si@V z*K*1$VbdjHAb}(6R4kMN=BSv+U5;V5=McF`*Bzu1i+2&0Jw<{f%OCXY+mO~m!v5e* z;FS}9x{uC1NdWj?gcb_|K8SN&``mJze-%6Vj&Bceqx*#d>sT7mSse>O1VjneMBI8K z(LAlB&q1FL=OCy%obDN}Mgc`e_C@uk?^Tc?8FsjAchci}1^ZOLMu#JdolGBa5T)c( zUyp_6-mnLjQf06Oc#KSANKa9(dF9v~WJPh)N}?v!RmBonWQ@1*I4z8@xkz6B#X}Hj zII&0u;)>D08mviq;*uXV3mXV(9&6eMH1Ppu0RH`YEBB^j(eJPT)yq*hPQ&Lwrx z@x2n}sx~UiGT}SzVJ5Z! zS!nYNz73sAiC3`)hfOSDaPlHvcCKX&dn3JyDTbvqP88+iTVpa5f3r%1%dxNpBkh}S zfC@Ek=Oot-u!xI-m2E#>{>mk9cvRF4b8Gzix_35#!E}k7T13K%z{tVs8o4-$3{;6VHEPrWA`*6s5+#r) z!^S~w0`6;~EU5j}E?lLuE@yqA;p~r*wtbvP+!YJK9k+~r?tzwh57vQ!<0$XmmTo$Y4S3U5c0nrcqcOwzp~hC4t%(fR0s!x-X~ zzdGGW;v)YxvXEnoG10U-Ih6XIHWvwr{Mv7MG=E}~NFUtHLNbjkRDwU08*yz8$zv6r zfpQ}U22d;DTkjih5dRjCUt3*c%71eIx*XnNCQxikZ{ZObf7`U}0tN7T5t8y}P}ffs zQLoCupHdtWERoyVC2vVukgO!QEMTwO_WuYpB+HrH0icAi?2)BkWY-pbG^vsd9VjB5 z(N5>-Q#?@*3?XKar0rh5$UpUY7ZWA0EDvrvCCYM>Sw%<&wS0c)JQulq{CsZtPI^bx7CTn36DP~Dkd3Bn&4A%>w=SFRDH|b)=0f9(-+Fbl zb1fcy3^S}zRjlBw8D{vw>}5W0qgZ=Lnw z^eKDKi4=yj5F|Mv+2>Hn0U&pdDvE?GlU>vzNL2XJ=~*z}v0T zUHes6p}OhN!k(RNSUbD8-!3hW;OQk$%k(_C%E2R*42?|4af}_IZ znv^k15Qh?wt;auA^?-_y0d()}d%%g~3m+f2WNN+`Xd#ewi#zF<+eqKI zp^S@Nbf$tBLcrLZPf@;u0<<}#ykf}G(ipZ>X6a-E4^O5cFyyc}!Xhc-??$j&&!`W( zBYoBeHe-)97n#DL;o7Oe)~AftWSaaQ3~5xs{3kz-xn}enF2bUj+ObdN)QP%TNk|oC zbHs?YelWSFz<(~m7pMtKFt1{reVaX;kt{IyN@!o;KEoS{g%YJ}WO|E+{$M~{6?1IK zbKHA~KgpY=^Kt;B+iBMa*ig>LJoz|cmJ;Ck;}US+FOxMH;uy<4K`D7a0-I!x zbI807Dh4g_hkto{{#&n914mN%pIFV=WgYJk-qEK)>13XqM~VV-pDU^Ej-j8p7dZF| zzzsy|cm8YrXBuBTWeOCozwhLT=qf;kfDcOuDm0d?Xw(W+&06g$2~wBSy#JqO{O3G& z7NBu-91lPLs=Z6)&e5I$KwoAWK``1ahox=?PSCI;CgLpf5KVS~P(^T&3&^b=Mvn@K zEV<7Tjnw>}Igh-YH?^bx8nkW{cT>kCK)|)VN1!x?$V=6NMWGgkc{1TLpiJnTZTx=5>#>h7YT|7f8RGNp1F?RB`OU9 z8{QyZ@Ti)R?8~)g*yX3B5+W>~q_Y=odlv-H_3cq(w7=EbhwLc@$6HzYmI~t@zj2?U zsYK4yoa8ZM?g7SWU5Z=hy*+tWRQD+J<`{8dzsjLb6k#ar2nvY@ovfB8BMcu7x2gHd zwnwhUXFi+xZBb2E(u?{VZ%le(eeoUCXh@A@_n)9V28Zuqzje4Rsdfh_CT})*Y3OmD zp90EB1fUZKRSZ6OwMhkuoGMzy$>xe^2MJ;bBe+>NC_dR0equpG+c!bZf$=W*rLKSd z=#Nd-Ceq!*J0$Zlne+j*Uj++r7KY__P1I>NdDS7}tFLE#BIK-&p6 z2wa$v)?Tzd=8io|3Rder*mTF>Jx$oM9}rdF4Rkfb z??dh&N#ju&fypCc=j~9js>ucWy%C7u-spU12gQHmZt+w7!*ZWr=kWvomLS?|_I5L0 zynEccyY)kRitO=k<+*oco_wHYwU?H9CR`@?vrtcV%wSc>aZ26)C= z4wIt$3kf0$?(Uxa2|sa|t|$8Lt_(oJC+ribD5&uH?`YcKR~JqyN2`+0@?Tb?ZXdS=nseNa)}BXX%C zvTj}dq6IzAC|=T&l{CPf4QH_YMK;5w`GQyF0YzEcGIr>xgl-eI`V^+ zUfMH(kf!!!TYJazJ=p3a14u-F`MjUUmq8MAG)vI9j`~vpzl@!j_lsW zpWX0pLTN~Ow%vmALAmlb{oLljMw@^?g4yU0(~(tFhGw1?regMqd`HpF`i zUaam6_s%g^$wJg4>XeqhEjy2%*k}o$js5=Ww}+KOuCNcWHp%`okHKRs9eg-p3NDrv zgrh5HFZRJ27f{VP?9t2YsS)C1S}Cp%9TsDOQeKQSMT17q%r-C0ni)1j_#OAX`=9L* zm3kch(6`y(Nh|2ra^MBu0b`oxK4}IGI*-(Ulgauliq2O#nkO%On;@1z0z&K-*fs&# zCCBhz0@|g;4uBG`8ynFvQgPwqWe^9LNvSuGIs5sT}P zm4~#7DfQdt>CNy%3@dYSNkKLuTGr%R$221lm?HPH(Hmg|evOa&&y~%^QJm>-1YFHZ zav%L#`FBXC{R$fh=n8sM&t zO3}=X2#WGxJ(L?o|GdO=JE)a5_h+KKa6*f|0Hr-TkED=O@SjJc`rHQiRoyVt2jaNo zShklre|~Ke86;F}mDny$rvyl!%AKB7 z2^BA}F23dUWGt>;4T=y{e8rmw3_NTK_1 zBW-STu({0nFZzeA=Vq9kABP$&u7BNjgh+tKt(N}m3W(rSXhXq;J~oS2@^ZPz1)Sx% zTbKGR@Iead=i#ZmfKWCUXmm&bs*8)`AHfu}C*tR5U%#)LRA!C~7Wx17$k!YHm=!{+ zEnH9yTB(|Y4~O#Bo~l9sn&NN6ss&+-qDtLy3~_5GMS6R zWehI+_l(AKI=;3VEuVvQTGx5iEU;ZIm;qYbQKh!}zPj3HU>$bF;)(Jjprhjxbaoh$ zUKAy|UzCHdq^k2{q|JWcPW$UK*Tp3k`vzD9kKY}SmVY>KzdpTzRyM;bGyUDS@R5tQ z$iY>fJK9eXW$Ye-!xifDSj{;8N|m#N!GkpU*Lj=pU#D3kZ!x$#pfs)QaXnqY+sSNy0!f*d zr!So?P&yAYGX8DzS4g{Sq@a~A9bZrgZ3B>?6)Zu+%)kZ4Ck&1pzpgglB?5!H4!^3} z4~)~}CiMM;5*Hc~V>`n^?W)DU@Qg3%fyM~1&X1HRI$s_JscpPq#e+tm#3pQ z{xL8lzx?iwcqjLHk)@TnY7p9Jz1m}CznBI_dB#Z*(n7=Mg_);_4LYn|a~6cR*YF|5 zdSNOs$mKoVY`u!-3O-DKU7IuF>59jFzB^Cb@+0Nhh0ki0`1R=rs6_R;@Qf?HCTU3| zUstv_VPSBT_XaLVj+6oL_rzPK!UxT%KM{=(6PoCDZ2c@+%qVg3ljL0(satHlm0QekB@>i*i zHY7s5Sp53&d%nkdUg+p?g1Y0%+sw%gnK5=Id`puk0+bAYmlL=ogzRldT&kc~hg;-V zg}5J!1OR@}a;eqbHNhH;!hgWenFe>Dd`!31Kf?7?@aia)EcHHs;!l-}GCfG^F|n*x zS|SMIi2^97yI&{E<# z0_cGRLdGoh?W0SJgiDhJ$!XU+F~Tq~FbG<4GSHL~5^9%R4H6YRECF`2evZxg0DOxa ziN7=Rr`BX;jZ1M~+sOqEM?t@M|K``ehD{;&*g}BjocGY5t{41N7wd%n`QF;t`xA1G z>#6J&_Es@L`*zPWKby*t)=qWvltpXcB9FWc6N#d;z2d9lsVMmF zu>Q;IV!`Tdr_B4%ZMTraFQJ7UCO$RPGLgKW>_S0VIR_PG&PPOF$D`NbO#D9K(W$$` z=X1?Iy4CEH_a$J@?_jjD^(<}rU(4;w@e2Mv#jmt5yFOa-DNMtgRvi$}=3Jy>EEiH} z7|JiB<&g(u25=-SSu!M>(m2AqO=d02u0r_{Nijp*M@a^6Bq& z&~n8M6YL6YD6V#Y*Vk&p;t(ev1K_El^?C$(ligNw160^WJzR z5%=o{K0J8#Wl^X~xT`ToJh$NwcP(CFHV(aW&Z?oOOYvBE)AA#oA|qCuMUySyWbvxEp3HbyHych!wGbry)b#^ zA+*MeJcKy<%&hb@BN*RZWiqY@!q-JNMr(1S<$nWX^{1E?8>= zGeWaP;}0!fQNO(H54Ilo9iZk;6up-Hc82zvwuU~}DcEW=zn;Idv)U=l8=BRMWqRvn zwho)>yF1l(ceZO#>P}1F9`8(|F6Z}-V0EX#H%N?GOK_MY!p1$gau#9OFs z683HRr66oK!?}|iYP|2{vw$V~L!=+xui0zoPlf+{dad4l66hVyPZe9Sb==lg@-zr$18jNj3}$e_A(BPS9gq{Ny6)4-I)K%m#0iXCsaqAhONZ%eEb=yb z!Xz+}U))|V2cs@=QyjBX+KqRv2*i21l$zKj&;Unn$q%0-b)q6TNAkh zQjG0Jrrg{F6?%Zx2h+*dL07wo`qttMc-5!VbjAFNWD`K0B}QXpx7$iuacXps@7BBBG$K|Z+2482d|^QVq+d0tg}jrc%gUSlt{QBf_3 zULzy17i@6w6Mk8d2jdzt{Cg^*@(a98-G5#=f7vhh^X=_dwnjW*`YAMWLmO84?Pd0< zq81{$ef!ValjXvz1oX)Bv>1Ko3ds_7s{nq7pLUFZ#wYTLjeOGY8CNcCa|vaBb4*V+ zS^!v)A+m-70_-CzH9s6bbo8C1?dINP!6mAXo=zzBv1rr}y9HYxftl;=Uv5P@@9r*> zJv*O6AEB-9-^C;D#ncD{iyyHWu8!Rhn!6wI zxO)(5X*a7WnmL1Ps3sdXR?Y+zQryM*w;57PT$IhntuRxk-A>+7jMv>rEvMq>Npswi z)3vYfw8cVPCgiFYuMPY8{EqFRWvt_G*&lyHuF>SPgN?_unpz{s^OZiJl*XR;x;lst zjhJ>S9)xm^t1i4}DZTJs_yPXXho*jZ4sk|A{FSG`CS=8>PNeT{+jkB)Z`sAm_2Mzr zzHRxK>!d!DBtmBexyG_4b?(8gmuIGj7n@i`LLBypQ@W^t@8UO)2b`ot2%5z1!dRmKl?5(iSctQMm~smT1LPd)?1;=V};Ms{{=`ux4+?Q7l#&r zMivRq^{G=Eq)PV{i*nIs+ng8;a}0e1%pp>w7svQ(8^%M@bZ#Dsa+g{>gve-%Mh_Zm z+_S*L<>JusjPMEj$29l$t4@`u;cvyBM<1g;$^5IXAcBO)uIP#4YB9|xdvv*n{VQ+q zPhz4mD^TVzoTsy56A3}+%y*H1L=*+wfRXpvv-+FP=_xISlajENp@7>o8%28by~ic8 z8HjW*A>!dG%9biF0Q{WAie%X&oaUpnFn0b3>1Ja>Zx%y^p1a&AqCP4{d%_3w%P8?O zVUE5zy}EREuKI(2Up{nylRoTf7C@rd_-Tj`BekaMLuQsb&8}Y0CZ>LEFk;r2-VFY> zx0$7BQD)NUMdNWVP6nIOvM$?KhZjxWf;who>f<$U+yAr6f1Wq~KTG~2VQ;bi&vvu< zd;Y)Q$o}te|I}8ZVw0LA#)}5#do>IqSV}XiJL_OpS_7TtiqjNjQ6I#lV$X8{v{Ph+ zPiMKy@+v8bIYttu$#{Z_Cxxbmh_#-2wJ#gyVA}j*7*u|)RmQ1i8^hGNAPchVX#PK* zK^}jk$tT5#&7OhFBk#Y1oc?8yt=D2*)=;EH$kk+un`nF;>95ET_9E(surN4qHya;q z*U(zuAfa6*rs$!m7>;XYPJ4xXP*KynE#Q(3oJw9zPy?66Sk%be?Y5M*AH|m=WJ?O3 zoA-b8YL9Pb5?A-I8465 zL;Y$_bW;ytqWIO~p6Mim9AE9?tIxS*-TV9WSMNEu`uzpX3P8TUgP<8 zMUP8>C_zEj;&d8ec>KfLER zK9n)}?5|r|ATC^*I*C(mm<}2c5`zBNk|SRs(E|F^A;zrp3oB+-p|uO8G`!iP22RPTXLHhpfqwk#@qB+;YUdMxuCM?^Ni zHQi%Y^Q~iw@3%f|H1a8dc>TX^ZUmA&Vd0f#<&{7Zs{jQ5PJ(`1KvVc!Ku@#NPXA^< zHb4Ar4T=c6A-)Ta2VbaUFuj`Or>JTAmVCoO_k9bhB3?WS1+MF}npwM96FtsQltwP} zRl9hV#!kLw)#+<9Q@(aW4fw_(+Flv6wZZp4I?f!m$F6jCnZ2$WN{oiV} zmgxW1U3u`&AZcfU^+Gpsm(c6XzEc;2d0v#t$IxF_GsvdX3z>;$vw5P zy7XY;?9D#)?BdTJmr{O{t5h|D+knG=Z;6$g^u`h1f{U9o;Y$5YIPbgsWEm7Ud0Etx zYoQ|JH)nN5`m;gG9*FtK<}q-8FgF7d13sHK*C9D%?Of730XhJ11mZ%Rb{6uFV zXIZmZ!9Ot+ehciJ>vdb;o0D#{JnrWe!*;WRjI9Km^d3%+QX;N8HJj_n)dyuQQto0M zDyS2bsPk|k!<%M>)56bLdYOe2WIaRAvtpEHxh+b;S=eMxX-ey-2!WDjx1nieacowS zB2gCDhf$s*UFqtD!3aWpePhEIn>rqAog0~p6jYE2=SV!4GHP+Lg&X!V46gtT25Rmy zz1>7wk9QblnP$n?{ezEVfl_Y$h!%(n-K%GoFQJ~lrIJ-VaK&#ui)Lt+*aX#YIkTR6h)QU+}D`RC0FeJW@i@-KS$@;kPn&KTr)Cw}H zn>Wo-YpJ4>gylA#uZ8cZ>;Q2N@H7)!(%?esS7UQ zU(PEQo%%4Mj(8j-yhJ`tjWO!S)0iD`L00^Z`o{IjR5r&I-2X%? zdxr@1e3;v%*ea~FAVGLOjTYe*;Q|J@OAyZaWZ9gXyR8svnxs&*;1ZgvMM>`uch}HH zbcah<3{O60GHg&%!KERW2)11O=rO-QsYUK%5KULNEG(pg0&gP|JH6*6enT9#VfL0K zapuu1rJH?{`|))>y?Qk80UZ!&9%Jh@2dM2U(Cg?Sj5{+iU<mYtY<5C79x8l*<6#fwnRQK^ayF3+2S!vSLJ@I4}sMG}QNLjr*= zNRD4GD)aR+YAR|yRBi)Qo*o14?mYipXQ~{Iwx;VIS(ju?RAko^OTc#szg>Z2i;Rmymx%WFTOcG=)UakxA6c& zZfPx>6>O8@CPUs8dge+oLMAl+glh*$Le}XxROFSyYL*6#Bos9d=gRwP)v1z*pklPW zj0B*TkzUPfG-MCf-pc&eY7!k=3z&g%)8{+FTLWgVHRR12FU5t(aMXnM7D(Jx6!Vh3 zUyPQ5qp6~>El581B9ku{JPvR6)`u>n>_7;S(mjV}UK!4dxWSE<_bz^R5}MG^a4~nnZU+(qTfU-Yu%2LTfquX>`%WdgdZ4!8lJDbrtW><<;@P)uMH7@vi zG)ssU*pb(XCTcY(mQYaDmnO#!QcT6XIz!&@8;#%x;dYEevTSB6OR*K%UP5k>T5Zdq z>^pNb;ruQVt!3P_n}@m2)L?skP8&S5mUcvO?b)PO7UFUe06;U1`?GYGk7abP${hj^ z)s3AN!3={=(tj&hnI)PH#$h~>5J}4hd}FRqQX^(7v}N@IX_njTYbdeiMTHWI6v#1G zy_}=?Qi+UrT?aNpyC*ApTtO9dWkT`FI6;W8K`&{%ysd@7c$Y-%VNTY$$xKJ{oU2F) zUdv&&vRkMr!Ex8jwHK}Gq(&KK03EO7F=M!aKUyi>a?p%9trByT+0)`y)49~>T!Ao_ zVk%_|gtE~aGrlAzGTmEAaZN8)!Bd~>WYS(Ggi7GeimT*Q7uO6p&G-tuB-9}8dlE&0 zB(jP;s^%%@vVf2z|tCVycOldxv;Rs$F0E0@E*8i(q+9Z zE)1FaDH)Vi=q=5IaZ?JlX}2D{Y>9US>I%^iKgS!oocUMg#xfUL%i!erNxJI%>f635Wtp;3)sd4zSd>rNZp#g~}~jPt|tF9HUM6&H5(x zX~{q>SV~0R3J`gzzCOl@Otj3UxY4uwY?=DMO7T|b#SggyeQ>)VgpwK%W@?rLbNHdB zK<42ZY?Rsy*0k}7_jvrsRsv*b^LB}!^umGBYZTGVdViri!;)`muH)!tfhKY zGZc`uIuw3YB7H?ar)*Ec@fA)aDdXji=Ch25Lv@IlO337k}ppe-Gm%L%PPr^UMLa-AvNY;O8D zTItnPQD}nISBHlF8A(yJL9l>xn!rH2rPel$jioRmnQ$C`xue12og!(CJbqK}Ea}4v zh}y~$p`Z!@(FK>P5s~?X2e7N=1gjzv1)`KuplbS%A(6K8*tbK z_?Z!%Xx!4GC_AHuHP4J7uC9ghk*Xf;+cMnD7kRos=2LU6vg4|WsBou&;xbuL3ebDs z7}})~%MImFEZqdr$0!p~*ecO%?anM6uLQOyKXH}rF*F-in#xyl0<`9C={?J3PKXFz zUII$CTNQa^9e~QJj)Fy2i|M0=>fg$UY~Xu{sQ(%C`@;Y!rc#av5t3f6PgviQ2=y{c z{=C@<)nuH8kh1cU+x|4CzPN*n>Tw{#-qVP{rJR4NQ{=Lj?Q4S}%c7_#M+h3-5t z$6Z5MWGvkg%;5Z6NMS7Qf@>Kvx8S4-=8u>l%xlVzD+86lvL(vs#8zx2zDSK-RzMhY zX(P*OE8u*5t??x+u;(5YA?{t#iR+%)-Lhn`D6Bm5%cUz9qh?*v4h&h9n1B%lr6j3sN!wwy2)Ohlz)R=nvs#}& zyu4n=pN04H_I33I3GvO>)G ziqJS33u}^tjBn@)1H`_I%$m=0lu2bB69{j0{agXQX2V4_SCbAEDAyk935_+0k_SDy zjD)p{;E&dD_5WPmHCu%IpSfWa)oPRTL= ziK><1{OWH$(^6q20zp(DZ}f2rH7<)!ded8K?r|zGY(l+MAdPy!EY1xxgXyiq-#$9X zCrnI&f^0SlXSfAyS~6TB5-Z~Kt}CV$xMOJHD;0&Wqms6Y#)^SqE$+O#xF9Tp=4k|- zDb6}E#98Tx<0i%@hj$6m4M?$_Ko)T+F#3NE9%HH(BVM1kZdbO>N_W1jDG^!=B3K?n zC28%{j5+Fg!L-&bA3QN*ILw(`1yPi?RjaNl^oWArvN6yG75Sp&L%eVx@P<|>%h+Bw zihCT5M<;U}-Z(?P%8ASCk$&iINnxh$&BaDG*F^rQH z@k3SVR`%FcE@XY9bvU|@jZbFmrXMT-aY4dSuZKqsv7&JBqVOl5;`BeW;);L6!U0m` z&pBdJ)@&)7ODLwlh|`E1;;JUmv-R6~m4zMy-=m=lGwV&E4~>&Gm9{DY(CVIC>@!XpLG>i5vx+cDB-qlweW^idPoNr#R+&+5K1n(MJ(z^V4i_$(lUjQ9R*P%+CQaqPTD(`_fSN(^?NWE!(;no;9E~wPtcj z47^bbJS=2hnBmBX0NhzuR~RfxX2p3LY2qX;+ks0;y-}uA%tEA)R7T$ov2aFeVr-MM zjOzlbPmJqs#@pM9_l3Gbp}DWoPn8+Z;lM-amB*9Wn2u>ArXn$4&>eEAY-LIH1K()l z`RzprU*z?c&GhD9+C*^P7BO!*d+GtO?4%Uh-F1#M94Lscw03Hi&Phs`*V((kJKP?d zU`HY1CtPpJ9yzHquc?7$K-WUQ;Nrtf*Yq1nk<3)kI%J8GGL&;)i1R0qfo5gF%UMI? zqO7obSeZQ1Sf{Y3XSlSSHi$R*6Vn$K&NKNe>7%$N?--1<$ii@{OXN^SWx42pyTD=W za|mod&ib>7Z*98z7)oY(W9*vgOThs)HlN zhH#AI$_%ZIPn~M8=*vudv>utId|laM;rVM$y&AY&qjJS-fUCv+DJ$dwFw|@2;>sx! zsypwTfRno-w%*l>wt^x{la*lhN(S{N6hb^o zW9A9Z7EXw1C27i_wfEr)xvO~4T7-rwS!E-V0;Sez#MFD>sBYxDb%u>T(C)Q>^iY3}(n&SF<4 z9C9blt;=AG;0er75+tL+ASxvGKd{mH7{d8dijjj5k)0u#x3+0K2r$sDCY+XnGZoEf z(IAWV4XMgddWu@nSW}ZR^IUy*NsbUo>3P%XMY{&t&B^p^4{Nnjh~pdErTZ-t2$bs6 zDnD&K#H@YLPAbi;%Rpr)yTPT89?&6JfeuS+FU=VOg!w8EESSjV&VePhY`$#*(RB4} zRt0B>-_lmY@{ZOU)jJ)`Dl9plup^w1U*8`!SL~p*KatOBb`JzWO=~Xfm1Q&&i7dZHgJcPDQxKE5y}tB zxxjh+G7ZOky7}y7*B0%BD?pM6aqOk`r4E1}*-)QK0FCsNPEsebBLqks8wNyR^crzZ zG}}9px_mMa>gd?~&^|e7AD#WkNYQMV7oGh!O2eZH{M(b`S10W^rh97rWDm^ClTL?A z)4y(?yz12O-bn{<_z?Hi2$fH&R^f2 zbWUmg0rlN|Lo@EskKLpF!*>Vl8vKHKI66KfIMK>zo@d7l8vCy8ohC#52X8tjNH%)b ze$hSb(va{ae%U=cq9NGhxGgi^e|OlXMZ7zCdwkk~P6r^QP6*&9-P6CA_GzGi{kL~* z*AYRN`gp^6dTA{S8;RwbACKSRDxq~B9^i$*z5qaV%t7a6XaB7GJ#8<&NyD7Jd(%;P zpPn&*4iC*yXCE2iPJT3}os;jo`+!4m(s|qN68PaYeR6_cj*o=kv>Mnv!jjJSz=3y1 zhgj`N=ilDZdRAZp`e?r*Yy&X8eGh)<(%{&k#m%pA6Z)at{2vL8j?J6)kK(HRqoM~* z)A@2&v4W7I#Lo7MW5D1A&8N%LqKNoA#^DX)SO_z(cEhdCi=@?d*5)fqo~{ zqrE;9sL(0;w|Ce@dZ3+{Hf<-C20YX)!x;pw9a$Wqu@}$fdO7w2{sAuzk57SYG{{-o z@QmrdFFJVpq;o{@;^Wlb-+y;PM+_3~-%o*dZo#Beq*+ug%= zCrda+BOen8(Iw-W+YpOnryDiK0n>d+L+!uT-7}R_`=fbHTk)bpueA@p?}GBkI02o7 z)2_ngSbI=7-bU?cwcL7zgMYQfYjLJ(v(ze@*fVAn=;4o`%tyo(>2;W+sa~O)&=@7C zgl#IlExnL9_2tuB^^!wI@*;4xL1wwTs6+%*$sD2uln$)B9zhfl?nu1h`Lc?Opn7S@ zW$9vk;J;K+f_lND&ZcbDj5dhQs&0!S>@Ox^axTBAZ&L-M!y;224zV=M*tMS6m)Q%D zO;PwoO);Ec*@l-&(295#5+`vT&DFF;Tz;sa6c;9<@QRkiCL2`NKEyg?{F zMS*&&n zT@{;L`fukI2GjZU-Of>!;T95&ZU;Fmjb_}-dexVDW0}!ztOkH@u~m6(1m~YZ;cU4x zI##ruHSsDT$;V#!AWZhs|Hj2>s6|lyXRHPNhj*1^^%~D7kei8zdnRES> zYKBmIv!5ir$Mh+e*o%rsED|WHg94ynXmOh{hO43jI|G1oxm3S5DDn zWw&qq;rb8#iD-48(R>PtknLfmZ@8Tw&%w1;47S0#l^B$Yz-i z9&_WT3D8&*T`c?XA%dA-iHN48b85D3gXNvqvbLT?*@ltu?<~k6>yO1Il8E0sjM50V zE46rKpw3zu&tf@{co-yzuFoaN^R@c3hj6!;j_KN9XDe>QiNG1Ve@y4;V4g&J(%B5y zo4bL;ji{UepAhgUN`!TA>gdA5^M^2`v1=in#$2L+bE6I|@R!Lq{HjX-irJXgAre0` z5qu^dCx{m(EIFIgNlTOGHPa++EsMvT&;)FY{7^%Vk36=KVBZr4sRsBK`sfrgYGEps zA;2Ghe_0I@c)_zSPk}SXWj-kiVa&}^*s?)vdKoow+MK|;k#ig;2*2D`Y^Ic%5N%~A zFn>f(1D`whl|VbU+9n|iH`bffMuHF0GQ;R{evDvsevD-$=HJU4?Z>Uhi}{}(?fhQ<={Nb~AZ%MZ#vZk`Aoz;@%A7@K%fSgYFOm(AE^PW=PYo+~ zylT>ew^~6!W5?MTKB$T1#Kt~(%*<;s6~W_5!r5@Q26;p?vQ}e@w=Prx5xrvg66tv2 zW*pf91~uZjAhVGex)gowxU0cuv zt0&1)kHJ@cEs5<6x6#L97LF^kZeW_HwsN;-1@q^tIbR&$xKc9g-5h6uYMEcz@GAD| zbJZqX(3Nw9W+ZTal&~mZmbN1HA{xP!PmMnVNj1Q8U3_m%?yr;?tym;$C+d~_2l3Qj zxo>&N1IeGxp{X*6U#=IfM9a4SNv%)ctJHMK1V?&)8e9zmpPAY@=Zmt=apQ zCu{}spHSfn&Vb@q_Ej&;W8Pgj=Z73&P&0#BX;PPf1ek4O5ggRsA1Bx8n1sGs@Rjo@ zhSU6yY{OA!%3f6Qb+m&!W8f;xgHX&yR)@p3d?y&}Spu&HXi_jO8XGJPou(^J%M-d3 zAfbRA;msR>5#&eevwcm{0wA^KS5r??j=zR6hgVxxEC7QYd?mikwbHd0jH}YBAwt0{ zFn|uk)(>1zB-%HEueyZ|L3U#<$CBgS<#0@riM}coB$kx>>DoczrWhh7c<7B$N_ zc4+NxNdaKhUZvZAuy|G-dABFj>L@(7zEwE^EHXu2?6p~8|F=3kE#71O`%8fWbk7S@ z7iS(+r03f4HTFr;B=%ZPo`Ww~*s9RaU^%){*vx~Jop|B7XMb75Pq;)|2n0UmQSt>C z=OeClRoLq9Wo#yTT!bsF$_oZ7eXN(m@E72(*%&wm*@8WA;aYSpk^n8DTqR1KlK^n? z1&vD=J*7siLjr|~&xLiC(d)=a7Te&)<@m5cT1Gt`A9XAmt%wm5zj|I+HI_t)>C$d^ zKoQrNNTP@q54Ca(xEQ#|wZt@p@nAV-& z@fN6kOZX(wYq8B=K(m<5XpF{e)<~d=60exhxBD;MMPm5o;1G@(yA?*OPiN%a3mUez zl*GWIk9ZHpxOFU&sfejg2H9np#J`kAdXB)#BGo9vnKG%{x=UUhhs|^*BD{4Ar$aEL zO)W~L->RmSfIp^~y)qQBf_NI%?jnpQVFHe08fs<>#_(HasGJPEsx()C;^~CT3h{B`gC>_e z4<&GF4z}fis=(I*?+$?bd*JY{7tU-`+GH!)Qs)%E>}MS3RuJ@J32b+WBaq~?*5^pl zbx8G_+uJkoSmtJiDBBiQ?i{CPK{XbkgUF*(?+q}XmjB@kyw|9V;PJn697TBIGw zoRXE-ikIRsCBD#+n(kHJ$WctB#1+W_>3(%+IVde_-l6DfYE=uHG+O{on0>krb4@~` z2n=<#Ypl^aXOrm~I-}1(69`u%8w_%FO(&?bTpLK#s*g(Xgu%dJ8;cadrgY(V1hIm| zdK)hx*eZJBb}3=!ZVCAcusfd7xf+%W1lFno@B|=B|CSGdIMzpj$A=@I7#~kQr{%twN0kkM zr-(me-5D>(vzu-yGTEFvu!`BVP@ET=9gjy)zForem?J(2K}t=I%efc?Pa39O%~G-? zAWH&?=u=S{s@d@#pYVq^DeuDtM$!D*-r{-;Y|1a%V>|LrJoCnTr6K-6- zCx?1yn&XpT+2^w2s%cxXs~o3pt+;9i6<1C3MXs8nvIlrO_bE$DH-oEw+sJzVjQX$i zV{6g=^LzcD->m-Yee1maZZrL#>Cc}3&41eYf3(xwdbCvkhaUZY{{Q*sUo!M?@vd)# zS&+Oi$`byWe?bASZ@*y2s{XGW5q|&$^(@~A9?;uegU~Kc@5vb$ z5hRRcLZvfK8L7kk=-0r}uhnOYmA$Tl19dk7&kesOVgxw-9zW3J1L62GrG7^UFD!)b zn~Qg?XN^r0;!k8|Y@zdN07%5Px#irc3xG{B}X&N79x_uzG<*faOX`AiF$ z7Zjx8AtdHMFf1FysfuCv0umy;n!tr2XctMIBCf{A7MMzf^yS_@|hDx-yyhXy$l(iTH9vtW#&sFjUUeR`F%lFk>6cnex2L(4OG{8_@eEE-2*Jb+`t1DUl5+GUEM2zI#D%|so%j-$L-jCO=&<5<7d8zdJSXEo@&zItPEkou%9J1nx6Wy>JB~2 z{v`G2(b?g{m`Bm1+yYJ0pgHE8$b>m?opm4IOKIx?(5`?Bb&qSni~Nb!4{g~lyeC2r zhwVn1=nDoDt)q_KJv7U0{CmQM*u@78Vh{VQRc&oz3p>W|Kh8|45MW3Ba5%f;e{5t%a(e~@!*IF%OI)!mO1SU#62c0)g zf9ygabWOF=8F_DcuJ&(X&W3(AJa2#2j4U{xxf3O;M2zOi%l+l+1}BLP`^8L@TXsXK zgRgmX>W(}9+D%IS?hHon;^L~4Qb=~WMzM|IUGWoCUp z%rY+SVA@$0&KJu@+)nG)=}PED#SOe+(9_q@TWtlW#lnU@Q5T;TnD& zj%S>%{eddjqVh-0>4@2Cf{ol=IC~x_kGUxF!|>ro1LLok-#5VWaM6Z;`IqIFF>$=G z@Q7X{&Iuc|o=Ps>f9Z|W{?!Jx-dFx*{;PM7{b0J9{UsU=gCbf6Lk$gJ7-N9GcfCG zAg}e_ypI2(`1I#iBWG##igJHR`4_Ayzwe^XvJj*vvRjecY9zPQh5Vk2Ds+f**MVK( z@-O#X?urgpuigCmt6%x|RA1l!tzo02PUHc}^$IrKVv~~*7>3+%1sv_`OJKA=d?^%N z`#S;gg}(i1Ahty{oNM+mqM8aBXW?~f=&$*AIyHnsZ4M_b`CU%Gj{edLWniwuHFI%q z>La>{iTq;2O-TrS%H}k?ySmj`>2@j(m1wBo<}d4Z&_!U%uL3~-orn=39LHgPE*Fd0 znpBV}d^A@y*`%>$AvTy|UGU|9WO z$7OJFfBNEQQ0E?KL#JZ_TEu{8-t6-t{j=HAAvJtmzpXC!C*)ZEkK&yJ zw%txa6|!}o2oN;@ zv2_cZ`g0R(s&m9s7FAQw<1_9*@8arOnW<6jenS(c7xeo34_aS|Q_ZLp6X)mQpAqdF zYe2Df-@v%%sD<(oE*ihazv}9f=wks`>U%WJ2HnGdwwV{M(Xov1XI)3lG(Q-(DDOR9 z`1@;S$N96{ivobV_Q1*yZ@F>^0Ce5Zx&_~vhgPq5<#SkhDwZOlHam!v*KID8MQrMxL|MW3y*+$%yoa-x6V`;Y zF&J;uz)NQt-3dv_Z0R}D->fH#pM{Xmxi`!{@+N*PDx+}%sgV2HXVeX|OBaRY=mVzo zwd0ng8MRu>6?Pn7LpzmA?Q|s^USsQmS-NnQO$HnGu;#YE2Z-1~g)T1{fVj|9 z1SbDz-Nr2XXHBq0_C*Uc42S2+KZfJ=J$&a5S9DwD9xL!%$vKKNR3ayv`yJAGdFQz- zJOZmLIyk-Nzp^}IpK#q#|QiTSBFom?3Yg5GuEm- z{NqFSz~k)}UaD7L;u~S{ov*9!NPLKU6sb^bKb6{!zdJ$7?@p0U??9546%JAZTWj@c z@;NgM`w|-Du-?|06&>w2-sKBA1$^3lng|_4EcW`k_!28uDqBjhevUX0E|%KgZ@)G67xPBctnRmC<^>S0W#6!hSS$)u zm}tZ(%t6hW6qlfJTl;`HuD!j5Y*_o^Manqp8!ON;CqrW8OzPq8?SHELv33_|o4;;r zmoL62;{nR;)$fIQ&L!roy^byU+DLL_rCY+xSnjPT76Inx`oo4 z+^l=&Vxxi&4%6W+?MMoNT&RfPy-2Xy7vHgZBcu2WIX>XYY|@ru>w(U5 zd@uH)s&MT_^P&qSJI%>hWH(R%3aCP%P!~w&9GeEvi|+ZVqFpHwp&0_o%wxn-f3ETl zlDWA!sX6BZGa|q^1wSL5p|Ogx0}{ov49FU3o&EbDmnP|7q+@8+OiL&yHO)Is84^>-Yb8)XR4T&%uQo~f%b%!EEi+it zh)|XH$bkp78xbzXM0V~nT`W@-IpOi5Hdf1SN*;`&`98|%Xk3GxBGf3dSBqNoGF&o# z1d?8;@p3+(*B|At6{*^>OJ*iyG1RJi4d`WQLa`!uncTpZ&!ofxhn>77SY0?NT0UDe zEhIF?@5k@t87;t=*f9l{nnv=viAGPVz_NGbRhhTrp_{N*<9{{B9bQ&sX4ZZPe(gJv z*bn~Lk*Q`0+NwONE^bc6MYsrxjiZnO6`hi`xtSh;H94hx)R)d`BhwR3dw62(;WqIJ zUajXAPVv>89?*K2p@z#vMW#%HyjVt~0&v3s!-9cI5QB7TZU9nZnQ&I~2}KokDbbrx zr(~oiYMQ9V+TV)W3cnSky2V|SF}?`eMFfF2aMdqdT=p3m=svVh$8@#Hd!$SnCDtvy zccg`@G8sB?xDt4uEEfgOu<_#9@RXWYo@?voN`NVKtO4kvnEISm!Y8Hbpf*!-bYMj1 zoLxF?deWoxoG(}^-;!{ZUM}DY6htuwbXnYC72FLcosDB95@im33)VxBvmR)aDUAsX zb@laN;Y3N2H0OG}CUcc>{NUIxw>(%wQc)e;e78%F6!md=!;zc07!pp3JkS8WT;Znl9cv>HeXM!>>~_XgBTiN4d&K zwE4pA9a;@8stmw&FDecgxDdoIdBfDf>?Y=b)S{>>nkr)*4N_h~S+{^IqC%A(j>i*l ztu%1MY2uy4H=npeF(0LM@wYDecJ35?-8A|b3~uL$`3{7xIl|S(ceG%9>x@p14M{0I zE_+mZOq>wabD?IHGBj?B90-@c$`l3`!yCW_5XPpaU|e|Vy%R_wwfo18IB>vij(|3y zw@eM)CDhPeLJey!WfwK9iS65wS8jtE0v9!y z8_{i21MLNw)xH+;?qJ)m-TJnli(MPDHfmf*y>Ha)+!<=Rt4T#Eo5ZZ)H=cjB`35Fp zab5%CJ;WTN%_At4i_Y*y#oJ}_h|{@HLlnFs?GP!faFp%4bZ5z^sbA`->F=XZ1s@c5 z^b}nMi~%SB4jsj{Q5kyM8QOIw&y}QOi#lhaihsNiDok2 z>Pj$34H#t9zTH!O&mr~KtM=!g{D7!g0&xVsa#w;e?x9N8AQ}g6Aa_{Ii`<3eIm7V> znQO(tj7h&tad9cK9eOw7F;kptF(~dF!g!4!(Jx+$_k&sR8QB%UUCqy=Oe<^+3R{E1 z*5F#U20%sM)3%Wm1_)~yAXpguP8o(OK7`mdH@x+&6LLh~W!4GCJ+fo4a*t9A)v-FH z3s-(kF{6esNWEHs-N2^yWjA7qD~WUz^J#qRmJcheg=}{%1ZtxQ;(H4WBOFE%csK^j zh({UA2*ujsHM(-vvKnT86PK6D zZ&}EMW?lgblx{E^rBR0%q9TO9ibs;`q`bnVWyZz0a$T>k>s}9zx_C!Ot@5umf3@q# zEy$G%A{~>4L*{J*jex!93u`>3>jqoHw#9yc07K|MMrGB48%gFh>h6@>+Bx1+OP6Ko zvG~hFb=@fyveH3q6j+y-hO&lWpf4LcKC%I9$y;jiR5`dI_6*osMNF)@tS896a2W;0 zWy`2rxkKfUp|9bG`4iQCRkyAoqRepuiq$HrS4{?0o={FUcU{0sO~R={~Ren0ZA>X7LC zuaGhx$@oDQpqc?_XDJ{K$M|ZDER5X)qbMnu@&W9xj2Jp9$b)o;OQyXYkt0)_6VZEH zg(NXdn+YLO7lemoIXE%^u9}%WtPnr-l$P0SKJcdM1u^`j%mlKLx&)%8k`RU zFjRzM>(zKV3WlKfQK9i*7316UAnB+DC12&~=>q=m#A;5_ z6_D_VxIwy`_M~>p=s+o@spG|MMI8<2HAXWQ>2qLbL0Vm(y1ZsrXa#~1rz>ANf;*z$f;2Z*^cyP5d1`) zLcfJ;1+g?hnP>+wk%{iMRFDwtj9d$<6DNW_1!m*oP^BnSNq~7Wo~?jWW3iP1B0{36 zlj1$;DIrmYIWbC%C%S})loDBh8H*=2kW3M3TkM26tsB8ta$0wSwp(|0&^is+QCp1e zfwTv=2qTC~-VZrz8XCDoAt+IzBbJ$}Ry_5NCzb{Z*7e~bE9-OAv}YWn@W<&2mXjIV zV$)DEN8!We)l47pC?0RHkEKjI;c%I@jSJL95fOo$LgQlqbh?K}Q!SC|PdN@^&>72# z*aXAnGq~@svJb*qBo0Yn`!JqPFGcc(ei)!RfnZ^9u{8`WKw@>)onu>grgjhak$3-V zskEqo1ha55^@_}}CkJ23p*%Mt1W`L^{((~1y>-|zjoC>Py-PD$Tf^$mEaF_i9&Okc zuQi$#beK~V3YBW$U!ZZoT+wJYpoJ+B^vm)V7D4~z(U|hWy_flN&0w<-y|b1dT{a~< z7)LK#qLVvW<+i$v7nE!Cc-{V5z0FCT0E`pEs1`ZFzKr}|k0~JDt!DvSmjBOh9;EVr z?KSO5X20s_)V3GDGm1(6Qtk04D6-U2a9qk1&?u=zm4c|RP5*FtxAFboZyosQ{ogP0|2_!%hkFfN72=`+a)D7E^eO1Q zc#SH?|AD{K2$k*%&!*$~L?wf)b4cF?38mhus)P&}`8!}k43T79iF`n31=OO72sykF zbX$~hj}xVF!3OH=_k_%LyHWgjNa>u2GnrTB&V^jzwO6+C`OhUfCJfFYj3 zbr_CUW}%e)P&S?}N0ak3dz&s}(Q6-I0irH^=S9o%3~y8u>L#+`k;Ukyt*W5V@6%Go z5W%vckSeWQQw6E&$+g0esui%F;oFbHQpo$iUa?E8#QzO*s?EuN&E4IDto+w%6#V}o zp8p;bo65_2`G%6(+Rk&zEhe#YA_%>gDosJq%n<&ldY>BU|Ad**45Yuh;c;QaT~rg~{u`dh;0sDg znnyChmK3y|QKayv%c|A_DsH{VN`#|AyVFE5XWH)}#f7-ph5KGCXEvQ5+icb571$-s zt8TiQ?_R5UbQqJc1N0&JAbpE4ZLqK;FZMItNU|xkVoEuL9$@Kp zp^|Z93alv3OL6E3*0Ay_%|<%p^)nB_C?UOQZ?FGZSFM%1@AP@fJk04nX3_wrq_)rw zA4a)n`%m@EXc8s7!{~`nK|OOAq#R7R% zN;)K}@Pon>7>Su#Wd}r4ii}C$@SQ1&+fY!5HH#7$A(LCyFWOQ@21VXdK|`TIlpup4 zWqlCV41A>>+;yy3&&S-Hrr^P3{Tx_(s zmu(TteZ$L5w$ttD9>M!*{(B!Vl`MGACunj4Y_o%A3$&cvaW+?v`8o>0h-Yz zlmK2Nlt=H&nR3fy4Gv2zx>RB{KIcLlptGnj+~nhxQG(y7tZQUEx0Pju=rXr?97TcfgcC>3r23 z7?~hyqVILbwuM|K;7@7U_Q63^G&B(<4jV89LlJlz;v7*4WR=}yJeJ~bcH9NCP$UglqP*e2{HRR*z)laho87mF1`;wu|a({=4Xg2KE{mp$impNZ0fx+7Y%#B8;sBzxIv4M zGxf9{3cHonIi)khld1*@T`QX8{w4KH!h%yq&@+89$o)Dzi=?p$IdCY@VVumT(r800 zXos}>#&%R=rWvF8%-xthWVJYW zL)4;J6wgQ%iCVhsnxffOM-CI_T9T=dydYT3jigf#n)b3XX<8!Xu*{;COe(CIDASbrb>E$1jf(T!&e{5j_6etU8qTgaspUYRu{6D2I0G9 zDf~ps;qnJZ7m1P!#d2P@CCcItEu}A!(@#uEoqmWGmk92>?4H@8mg93J`4g1obrmhx zFA?oeOyT|nCG=D$_i{V=joG3U?VZAVO;w=d0srCa38?0^pvuS}csN+Of_Yld=LPem z081$rp;s_oO-R{n;(o-*78scz&wuJ@Ucg04TNH*51lrKP%>p$dLZls#TF?Nc;A;!J zJq$FOjFmKJXM)`l2{uVlYVu+1NHQPJ5)6acUO<1z3Iuou#E1JR(VG`|ZsK#%9&U*a z+VlFJQ7=n+=z~c_hO2ZoEJ$I%&BYVgGe33K_(P9XscY|G;-e>bkY|(WduZIl&HfCc-L3p6f2_C0xW(;ibdQ&ZxkgWfjr+L1Aa1HkORH0Mnx-~ z4xeEAudb(~M4l^2q71}YDmU*e?$Vbs1vAioFioAI786gUJ`M4FDo+*CZ|4a8f3M_0 zY;6j(w?M;d(d^g}2fPLTop^6^qjR)*gru{yi8o4~JD#Rlkqkh#;C!7ISNBUkX6KE$ zIBhREZMzW14i}xr*E`l((GCPME_JPIo!(Z5nZ5bBF2DuHF>x)R4r93|FyjGa;+oI_2{kp{C`ZmAvSFquuq@!2s{R^Hi%kHym! z4nCmwMBiZd!RL+8J-~ zj%6ft*f;H%=cO$f-!Pi85vThRga9}6O|aATL+B*@t&&ldh=3ll-{a_l&1aYvorBuJ z?(G<-JcvkWr7c-GEh^{1 z=4Vsy4^f)FFY5Qc(QhqI=fQ>&Ljn5$zb`5cB}St36a2ntlq8{N1oWKJB$qE1%hN)6 zRwlm{+0`jl6cX&Ro1kRXtDx7{6;i=sHqm!wbn~V9hX(PfQ6$wx#}X-ZnL`u~$7HPy z%_%KJJO(`@2!|jZ@*Ud~W=N3iwJL*Zqn}{Nw~yXThCokdpy!p=F)2mh3fNg!oPF35 zDoLeTne_ETx&kupeC%r+M;NZm9f>J;s{4VPiO0cR0PWr;P>0ZcU5H^#)QT~o{I zYhY$dKx+~a(n(&g2^EbQat;`}4i4q;?@;k0UdFTU@Z}NnDNqnzS)+>@ScXCud#J1D z`^ax|E+;hWyDsOoR{=k9ojv9(0bb2s!P!W~wxUQQJyKBeF-GPk9H~LKceYuXkGfKY z8xK|{gCY2Jv`u07RHQX{_=pz~XIl7q$bUju83hs%Wt;6(sxrFS_OY{g$|6VD3!&-@ z&Y9)y!{hA=b{57X0?p0i^o2tkcPA9DjAsdX+A#J%&wqOPedqaiZ(jcL>NTF-PImZ7 z@Q6L)hrq*A8SBtAl|+nn2!Bt@^q1JO1*|SSjGyXIAj%5C+6tJaeMX(FvS-=~;F*Mf#IPjU zbqrwky_Yd9MuCOrgqZEEj{?xuwkNFsvbG2ItUNQP#fJW?#MGP1NvHs-E>g@dMTz!K z9L1R2q5O46kJ8&Z-1+ZMVFKB3afS<>B8S0r3MrhXQ}g7a1Jv;6%7+T|LVLn`W?^tuK5NsHM!jC&6H!mF zYRgg8QKu#97$Jl0$&p@jrra#mRdp|G&?CM0zr#}_us(^AqoXn&VyMBgo*+1};hVY$ zu@|VYFlBvkq!MBknMD+#sY3FJRZJ~&S;}qna(HxXb`$4|`oP~E~QVc|PzT4V8E*kpt$jWSj>GY*<=78xPI5D_r#<%bXg z&6;}z=(vM-VO-C>br78M&?#JOv47)%dV40qf}Qgb;$BL91}4wbn-EV7hHq~i zFdl_~ZV2Z^!(+tSG*U6^Y&d|672%}9<7N9JSNQVo=nzra-mC`2j3v0@ZfG0fJu~{j zf7wQJ&kXSQw`G=p8TKoA8>cxM%mo7>`R%6^MpJI7&K6#UA97nTQKDP0o@QHcZn)Cv zSWJcZd9q+ePIaODnITQaE$rCYIkHPA0aEFp4E`iHPmtxoxB+4ajz`kHMr&I^JQvbG zrDCIWP4Cf6AM|b@@dJwj!CW2_vW0fG>*i3h`Uc)z$bdw4pK|Cz_y~iOhT&ta1LN@* z&C?VAltRcFB@T@e4S2mmogJfu?<{egfx4)U@@mVKki>L_L23zJOB#8$f;eI=U0u?A zYL_=xu`X{u&BD(JGp5OK270D+zRj;g{CT!a{;@}_i&>8yf{;COUC(;#s%K)rZZ1!f zlC5QHnNM@%ufoZHZT;W*Y($|mZdU`iB>u}mb2sh(zjx4R7W%)3o^tP`SN12a)h~FbHRtk5LSH9`}F7U<1#&z!-JsvylAU zQGSGo@<}p=KrTVt2`?rAM5zk8NhkT`P0K3+-B^JgMP@)0xo$5c@WtN!sy zdZRxxdI~kD(1|&KQxGpbeBh}ji~*R{%;!{(p4b(;ITgE^id`=oLJYVY;6R-bdPzbR zRR%6~K=A$%cazCKJ=k1i6lcR%hOw{8hZ7Lxp!$)w^|908r`&$0Q`SJQyyLBpqVm<@ zV_y9DtvD9QxVg%~M)XbQu+-LEI)ntOW6^kuGFk>xol>;4AbNwGR!(*b18IMys*gtcH+^B=!raJh%v?KsTZU+q^q-xV% z<+|C6zJKw<^WT4Z)A{9BsYw4wDTgesa}1KS$VDWH)_m4WQiW#GjJHRRu9tc!8`dwl zR5mMQVdoSa@vEg1fytp*=8?eNX#=H2D6|FN-6l7RM}7SUew1Y^Jx@Lt86rm$H@fzq5oO> zuMg*Zv#jCIHdrk}`;?K7kCT6;B}>EOV}Xchalh6Z5666i}L;M9tpjtod zjmZ?KjjOgMGTkG5T4s4b`~86dv^$)K|5V5oxM&#|=6lyw>D*V-V&D=J-oU)M)=2*3 zXH_=*}1jvsKh4Epa6dWe?-_cD9fMVUwWkLiEpL!^AzP^h7!)aWeJ&G*Elrs zGdMqIcO*a)-ib+Xr?~a)E-JuZn~m9T>pFI23I@?G!T;}M*5|*|MS6*7-=HZNTe=)l zIF-a$O`do$RLs_53x=u!dO~tzeL7DIPV&wIFDAglE>p@0gc7 zJm;(97^@uO65}FGdeL#&hF(#z1ojV1<8$NzJA2HRut)FAy0EZm=wQ8lN!1S@%k~ao zyATl1eRr$;ITe^3{}i6_X=wA-`6NlHOo))jzrZ~`-|2rDf~7bwa7@yj=x@44SJ!wI zeh@Xd{3aUfNAG2EBs6*~5a&K=EM%9=O2Teg)s-{Tlu~cjvw@q+&xqkZ6CBqFL3Afe zg=UZ=h31c@?eMW&K-b1hp~Sfd{SSl$xb^VA%i=#CH1?Wl{SQ1U^gj zM{rrf!0Wy(#jB+PdU0#8v_#kG39B^L&i0ibNV9E%rre6- zo&r>%v)*@HBm|cwLNK9z8Y*uiuqby0JM81($-Z$%c#|lkl$TJVo;@MJ;|_;Z#R44; zt4ejMY%mPYI%?Vn(J<@`!}x4=-qFU^GNIt}8JWgaWzTVGVC+S7iGnC{-%>1V5qXAh zZe3chN9-gWCmJ_k>_+8Oi@j9-q;Xoe;vR#zYrL~!AX^4H-vu$cmd+!<9Q6~;^tL`? zTguw$pVCmDA7oXKJZZs@q|{ryXOvvAPIsjpj$yEX=X1<4H14aki+scroJzjmb`ab0 zJx76@hx#A{EmEVxB~dve<}=R&m(9AYnG%8}6a%2~0v5`Vf+_?IQ1oE(N23n{uaK5r zJ;TV}a2CZB?A9Y1m2+q9&47m}fUn}nvG!q_Ro-twnBa>tq_!Qx-wx}TCJE<=t zW0`&oToi+*d1I{&?eJv=0DMbjaYF#vf;B%?(xl=gJfsV4cXK+{O?8X_I6BsCIt%7^ z>=`Z+LDYQwKt;T@nxKt}S%?U{ONDsZ9lH=H$pxGy!D(_hxb}?_0tl7h1$ShLlFa>4 zH+KdgO5>+tKVm94Xu#>GYG_sYo%oV%rc1r9(l`~42Fog*e&X2-@VgDk_wnrllSnblZ3(!kP- z(0W%A9?ObbT6>D_7I48MK_+}KWwl;+m_pItvj<`S~s#Y04x}(e8yBK`dd7C5X3ND4M5q;6kX!C^~gx;Hj44KUQvQ>8+llMknOSg?|5WBhrzCZv;) z<;#HkI@!+1EFLM0V;XVU>2kSjk{R_`tk4QO%?G_h;=G1=Z%04 zXCg7E+WrIOhp&^Bl<85G+*gh$6Nq7pPp`FIT3fCZqEG|@RSk=KKI7(}v}=ws$I$=x7^p5L)CmLst&jBO%4Oki#>#;; zJM2q?Mv&_8loZ65ie0CYAPW)?$if#F|F%fA3@fcGk5#Zz<<^9Y%*47qVIKlc{oacU zIPJj1XMvgB1fY*RLqsC!{aEI$rAnq)qhu;*+E@gmD1j3#tV)zFkJuyQ1j0`OvH;YR zrJk16jv)_HaLjPQ(#MY_uz)Pm7unwh!`>XC$Way_A^A?pSpFA@jH!%WsY87P*1oc3 zl&f-)y%$bM+@5OJv@tOW?6>k)7e<4E@d#M_#fU^_I4I+>FD!doA0+`G&~h6EB(LgK zuC_jA6%r?;l^IV?uQE09#E&)K#-2RRzZ|F>Q?N3DtDTA9CKJvnW_X0afKSrPFcg*% z#yXTI6jVp4gi{MDQ7=ox3Uu^b=P^Moi4)B$>vg%2pHiMDI*U;bY=OB$=2f^rAue&? zn|J}EPhTooHQ&DFRLtaRE1GQRB!jbbO{YA1kah*`q z(mv69fxrp>mXDL;JH?5MRskmtT!|L4*Qb(|X*ZnIPGPgR#k8EErf1JsZR?|isVS;* z#db2!fpc83XU~vYL~FmyXP8C}v7Shcs0=%R8@rMG1ds!=pQ10Fb8L%siP{T8%}p+2laQrj$H3pg@@6si^Qqz1zn6WVA(wnWi?E8c)`ML2xb zJPkY3yeua57@`{#xXD-o38WtCji*8ti&HcPF~arMN4feLZW@C4uN1*&?+X|7fyNE{tds?WC{Xi1M_E9M zIVxEo{+8JS?M=y*PY?_@c^@bVAnxkmI|7EOHC=+@oQYEExKQKEhjU=Hc651~;uETO zdcv0r`gMqD98Yu-BXhO!ldGT2XC!6=Fe4`H$ecd@c-@`MT!ngr*j}_jY_HQ}d)HeJ z={w7jZXBL=%--anpOdPMdtOWLz83IPA}njDIJ4=2S_57imFASX=1A||lI#94j^eVp z(^qo0Uvs-v?ycz)n7sv?`|H>CN6DF%D8XN_1!66;YQj}Oo*cV6zqt{ES@(4DtCE{> zOYzwRvXp2&yE;{Y5GS znSIN4Wl5o;vMqqFzj57g>&n@?uCsfk_AfC$y@4@3WaqB1+PfYz+@!WsC8dD_aeD;mTgT`CfZv@7!o*FOo-YZ)LBvuu}^; zyN#M#rrbvJ)sDBOqswlGTMRNK^rq2drtX%L`D8NYI}#d@L@|W0gm6iup%L|{ONYQs z0A0uJg{OaL^m-z_Xb0wY<#yH+_q7~s+{J2ri(Ccbo@B@KQbk3SCp1{luELH2zAmuC zV4YkGHdS5PM4mL6nD=Tzrr@v)g}AZqrG_zM!gOMx%AramX^okx#MJ%UO8U#C4V%#A z5M`W&#dr8CX~=-Lg_^O^j^xyhxjBR^QMY!t9G+lE)m!XeVGMC-L8DA+=JCK*UVyFw zR`pB*aoGhk5PH_3y6~+B1rfi&9)P^jo7I2zHO((dzzoo z7=l~NGbUd5z$52n52RX#%VpyZYlr!js&%33oA))^;~-U+j$^v6{B5u9GQ_42;oh3B ztAsD0@dUQcE047)p6CKrjKfq59!rZih3OBQiz(h632wc&95fkNYI zvzn|1oMO|F!f9dvHcAg@+7J__K2*=vDl;WGkk_a-hzBWNeG5~W0j?PIP3BrC54j-0 z1&agz_RpKySM8^+(m|AX^+NOChwZr2H9iT{V+*gHu1 zf9(5>R^k8g0Q^5x#13U0Z&>4Wg!fr6EEDs_NbfozzRvmb4>AGHc)O|Z9WKw54OcZS zI3QqSckfdu5!z8Q&Tr24P2nJM)$ayF&|LHvRhRO!4ge;TOqoH!4EG9|HC1iMQn0e2 z=;-qx^TQGPlc{<@V;Tyjib3)X#R9$(n-6>^g~TUn=R`j_ReGD$Nr)LmPZww%j7q6~ zr?wMg@37Ygg@YVnY!%bh=A~pfhJy`##5#DLJBC9j7|xDH;~2C3$S}O7 z37w834FFykVInd2J3r9xba(1zZVs~VBLnyk=i@~9E@2qTgtyZ>7xqwO7*&#~`9$?2 zXZP!z)s}-Q>sC_b@#u$AREN^Z;wg|Hk3Ok_d>2pPNZH{-;ba$_M5i3kNqAb3r_WG& zx^EeC2o!6!%E2fL+^+i85O2i7K4L*#*tC)Yr>oy|?Kkhk-fTQI5>UhZVD-KckQw zwG@p6VByzKfrk&Z}YygzCPSn3~!D^fP+^Rh60wNAl;K z6Yda625FB%uWF-&v5JEuyePKVb3UUN6V5p)YYm)8F?kglwvMOok~TY^%_d3v@neu9 z`FqZx>%7&+v+*SAJ^rTYefvoD>!@1+}DOhNvtjs$N&qWGIy-2M$2PF91DdoY+u<+=g$GUv@`09ismyfqL=I zaMFNcb*1Q%&HSMm{TAdGJck$`Wb2DVgQG16+IvTK*E4Vc;)j~?^ipJsj!+)}sID52 zq8X+D5*D2pFJlz_MRPQnPdR==v)ve62;fW%u+$Bnp1L#6j^(hD0&*5Jkos zh>Vl@aQOJ3X+Zq<`6XKO!2KK-C`Asnl>zcY?>tN%A3QO4K~%Gs2`wjlLpx@FRIEq9 ziB8!ee{Ae-y8IFQBX0|&i#EQDdm%q$U(EP%n;*WW0&Qu8Bl5*l z`Gz{x#yC8Tubn?mC6j(9nY2??Dhg2#Y~>+9hFB@sfG8k2@u@Olo<&0}Vz#3A2)sD) zPfrDyljf;4BKf#+n%6yoV_FuYExWLwN0WBW6NZ<6g|;KY1ZV_IA5e*f4^>{l+JqvS zZSjRZ9f4aYE!Z-}N==N2{5qyNJjq0QRp|t0V`-}_(?!WT5HYJFGRn@vo-~m+O#5|T zbqax!HX=(zRwc@~DdK$7kUO$wS$?TPx(U=5HOz>;ziMoZ8QpYTppuG8E5l~a20OA< zVcj6LKdLQj+zV!@AsQzPvx`U<&!=Z|kTPCOr{if=`AZ9~kSMQo$gfU$T|OduC}%|7 z%VSz6M(?XuA5TqA_TmB(zJxXpkS1quz*L^s14^!)T!>E{09uLBQl|J(GE5IGc%Ny}^d2K*qO3teTjHC-TA{9qf%^*tf(I zD{AVD1DJz_F=JxWB@MwW6|`J*WomZC%r;=cHy6vYz8FhsX=jei&e($xXnM2+O{vzz zh#oB*5w-ouyX`r-3vA}j?5c>?-G z$h9tpkk1UR#|Z58WEh`_YWGLvtMz3gRBrU<(F&Nkm6dNAtMg6y9hxQKj!ORcaAc<4 z?3gy%)YW!8?ikTH2}9($4^>r1^*-M#6}5{0M6_B}fQ*b5CwSti;&p`F z`r5c*8)e{SmCi=0%skemECqHFnrjhK3K*R>If!qW0IIR;OaqzTI2MrA4+op7S*;kD z$~2P!lxirinXHWMy>TAP!3q!cOk7+IDfcu8u9p;Z!l?1Kq*E+`TqrU(3h{V6<>CQn zszNP@p#+?AxgmD{5Xq^u0KXBx4LX(ANP3Tv{_&7*%SB>`28;h9S>y zv0pTXp32KHsAvXhq6ien_#6yOw4K|01Seg5Z=3lb2h(AKZc|UsnT> zU6fW44i<2#UC5}{aLUa>#UNv9Tn$70Z@xJ^G9XFIN3bl|fIbC);?Dy>oOdNMbLXc6Uf?xx+@mgcdaNdk~e> zwG<|$rSMWBcQg^#K8gn>_kf5#9#WJY07`bZETefJ~882p6#HhC|dl5xU_B)xwd~K&z)( zku2AMsFzXtPULW1(3BwhOe7;mdJHGC}*girAkll+s@yC&?-> z5G6+p0`9{>3UBkP?A<3OZZ1yb{k;V1n8tUe;7=?=$oi6hC>0(;5|nJ%jy17!W!ky*zM#3+2&+T^8RF1~EQ zMhfYOUt#CXEvy3+w^a~ZDNeOCNhej87#9H~=*XkZP@YM*EA4>sjL<~K7z37WxO3xyppm>x)Bo&;whqRIb>GsC^3e4CuPfkpq7{1tvhV3ekG1HvQhrqEZfSO*4S$R&v4hJQQ^PC3k+_xd^hytKjzjyM1}L3_ zRve(|OLRvAv;*y}JV37&Li-ey94{fa!~V8(9pyqjsaCO%Vs*^Ma)H!6>Qg7LQ(-@^ z)xq^!g~Nm}_Yx|TW!=blLFUggMT@V&OnAmzzJZ?N_5eM=%;&gbL6ZdsRgo@k1hp}# zRQIw5e=(STtm1-_9tjFBi_qYYFXD6LU30F2#D?EcbQg)9Ek z)q?UPay0NK;ifx{LY%(eLi8s_|3his!&wB3P_+!@=#rxjh|n}@7cAsmhota!`3Q`I4ZrMcQT7B^1( zhp>hff8=>tEK;d$N3Ns-FoN$=Dc{5wl1Sl3y&$;}lGWm@MhmwAG;D`4^=?}KzuPGE{}0Fi zTZNPp!k*y`UR(-(LHB<`ZE)KRU@85#8fp69+uJYb{{hgy;j+)kU;Lsd5R8diH#koF z_5FI&E0XqpcApWKj`_)MG`zz$meGG>-%rth%ik^X|8C@SG8>PF$!Tdi?}EO@Yt?tX zQt2d&-=CI#e*W^+n-{O1zxwV4yaJBk6@>j|eZai!G2LZ#;QJk<|6WG_y9cfPO#biP zBL35Zvj2g#(SfV1aLV~ZKZJ|WZs>3u#VaQD-UFY}e&3TfPszM1f?&%c{SKZnDERb_ zhdD?*VV|i&PDfCK{AoLwJ~{04c^QmJoGAfsMIPGR+RB?czsS-8bZF-T2v#W5#WLzj zMWKh`IKovCR9lXq#mJEz`)m*d86rhXt0L*>HdfIxL_Mrkv?higZ306pETs)%NJCi_ zNyiTaNlTZ~9U!T@Dv}OA7bLB+npQ$mLO~D|f_QyThkBrRH8X=0negtdGVO+|-E~(Z zPpJXNK>THbSK-Gt7XE4YcZ=7u8CjrVzZO7Mb=gSDuo4IE+~=+E5$Wyz`q(MkF%S&L zbcn}n$22e;&MPXeJj+L>Pi9)O4u8_*PYfuYy4_d}$7Ww;AwOFrjcc2bvUoFF zBn{9Uf@1<#l>adz$6ZPPOXdIO?tWVTzq{8g&i|j4{Lje=ud@VUXD$lb?bjT_j|iaM z{u#sNP0^MfI0R-x?19%CSr$MXR*JLpXH&5XTBUv`X=W`Cbl_HDAWkGB4z^fCv;mQ3 zKLk@sc~B9ARMxN!qw1WVHAT<-RL`0mfU{>!ii^9nXAoF5uWJB&N!Nn2Ac_;r?o3HY zWV}9qX)>F?|8Q~nmnVJK=&$gEU4X?5@&s#l5B}t|$}9wA2k#DTM%m59 z<*tYqB*gF&Ow0!+W>=Pz-Flr~IM>@37u#szvV9R;bhp(Ei|7sB#RY8#GA@G$#XPeY z8V?u%piB`MQrMw~2&AIAM?dZUO{IsYTzlG%yv(@Y3#-)wa*Hn0D0r1gKh`v-op|8L^MXS{S# zDE0r|`hP|LyLX1h5Wyf51;XZ{tNmS^dJ1^Uhe-Jtu+1b7WBWFPw=0D_zU`% z^xyr@U2uTq^uL#t{|o!SjeKCn3l31wKhb|b@$0?h{f6m(ua&X?Z#8!d`rpX;zuGD_ zs|Tf4)o+z{t4+VOS8e&F{pxP3bWq(pC_Skjv`XJpzwt|cqw4$okI##?N`ABI^VdGF z_=Nw0s{GwvwYkgx>{pw-mVZ!fHF%LH)fR{5e^YHe@k`A{b(go&^sBr3yy<3jj~8jS zs(X9<*KT#c!Qbsw_xJdp{pvx3KRl=&@P?XCs!w_H`9I_THJME~RYw1d$=HcJ1^^!?9%vr(M?Hu4$AVQKbZT!LJ( zVF~8H&;}RuA10KB9x@SuRWO*D!{fW6|E5j<%_bBt=>J~mzo3b~Fa2X^eRKz@r%B(h zh1YFkDgC$7^zZNQ7yjQH`MkoQ)iA-3UM!6J5N{KXfrS`Q(7#RpgN@REvHutJUwj@8 z{Wmwf{}=RM(0}oHNc6wi{lC!v7xZ6z?uGs_YYO_s)_dpS;QAZ?iuCXMDf`c6qtz(x z|2OhEgpeda@5gPH&kGJ=7g$=Vpr$XA{s;F!|9%nwy`cZ%bKmrTE4Khk<^SE3{ZF&S zSwKPm8=?P#vJ3iOhyDi}qW{AFr=b7h^U&zOxv~Afp#KLX{}*&p(Es&s0j@>=Mf{h7 z{)^AO(7(uF3Eyv}jpg>g>G%%^t%KtHzmbpM^Gk;;_)n=;tCfyf5e}xHf0O=ey$#TR zGrj-&2m5{z|7jziufP79rDFj8SF_P<)EfJ>W{dfL+uv)qnnt4VT4T4-0Di%;!NXRn z`nCOm-^^$D^^ssj{C5pF(xZYS-7o!z8=(J&-^|c|asR)m{lA11RxfC*pnnJb5AKQn zi~Il0e7N{u(0@Vyx%5BZg#7QI|04d|W(nK6Int*{|{vTZ>j{k#{BQLiur#y^B>;B{1^Uz4`==d_b~s3 z|JTEr|M}+Uf3Kkbhcf@oyO#fa-y#1M^uLkMw^1BSFVV^)VL8EoG0|vFpioS_85Tj~ zzTop;^RDH82mKfOe?kAn=b_Mlcn|bn-2WEzUwj@0{SP)z|GUNgZ$baX=V8$QeDn0b zSM2`<{TH8mr+)|lbJzO6#z9v9cTk-FH}YxqTBSqAnAZ=J-ZYxbqH*lCnRgy}!X+g8 zZaDS|djA{I|6S|<_8RHfyCj5)vG%_ zL8`mt3&Pk({(sJX;$Rd4-?{LrrAIluim|KG+XWu1=u^TWqgTnwkb%=JgZww3|GT#T zXtlERU-*A*X#X#{mwjOnUhMz36aeyC^k1C+H}c`)e?k8R{V%5fJJ$cT_VzRMzgz78 z8~J1f__gH!tQW{y@;`claH)I;{(1JSL~^+$me<_!{!Wgt{w2%m_eK9VH2_?y|IfsK zYP5>{Z=3lv`w;(S8up?|c+zdR`{5v%4`-((e>d=VtNuahSiT*%+nlUU^@BRuVM*jzmO#Ju#MnV7gtp97O9lX_Gjc?k!t#)f~4FzDP{_e`LV5)mk z11R`NU@)edi(9FZJ=ep&>tSfZG_`}yE;XyZP)lN2pL0g3OBC>iu0}?#hq3W+C(T`V z(%f|?&0TkHle?})|NXn&{~LQ5`Tw9e|8L~eZ-e zJOAfj0IYWYryGDheFNY+@w*QEuJgX@xbHaaW1G!ti#O_556o7Fj+!IKGwTGOKES8X z@9E?FgVK#IqyKO;nO)Z3C-uR2KE)Ie$*t3WW7kjTe`po=|C{+V0#10PV>XUM{_pI= z82&wm-~jgbc6S8;m!`d8XxXJkeh1mp4zi~m z!Jc*s_H2&(EeWn+5*ZVxpWib5H+Oe4^uJ%&|K5}SZ*}=UtNUA1{s%=|quNl)za13wQOXxWej(%EGyUrs z1tx%NqtO3-LG;fluiq#g;sN^*57>v|fPGjTunYQk(SM=;`=a%KYwqDU5g-=2|JRTw z)sQFE1W&3FPl7fZq#7(Jc=Pms>-xWp{SQC?7xq6J+y4t9D(HV5`X6k9{tNq`jePn( z+b!t7p#OE~ztI1E$@;%F<^QY_aCP}#x&MO_5RyTn#E$~MkoOA}#68o0lqB=;o4w9# z8bo|ioOOERcotsFZgu}}rs;pTRpkHMko?~R|9`*P645?)_x1~VE9ieI{jZ}0T)O}7 zr{jO{RansfJ?Z~AFX&uY+xJ1c(P;Yz^~OPC-`_j%_j6T$eBM%Z_uG3<+RgoX>q%q3 zx%;Gfuu%2aB-P&|WJru%2s6MY>G~cacY?hqp)n4d2hu|6XDLv!VUJ1VmLB z{1o)R9{msQnEng>|3*Gs{4eOgp#Syhe|~%P-)!z>=)Z{nb6@(u)#d-J>Th-VpHzQM zF#T(y>JKFT9hC12@%{nP|A;dHAp1D{fJ$Ni8f`4y|M%1W|E)$5|8Fy&-QKRW^dkiz zel23?7WAJ(|JR5Gx{UsJGy4A)hy(@w-;4e)|Nifwz1ymP)7)?Pt(L!v6L9B4G&}F4 zm(WUJmt+Qli$aE`flQbNKGLRvMxLMCas`LGF8znMPXCRp{cp3#|MgJkf3TVPFYG@a z=={%beg0cn|DWb=LI3x3{$F$dU*rUMgZ)2~83cE7+{jJSpq*kf-z@!KCl|=I&i}gw z{crgEza)KT5fH4Pe@_3KI{z2)-@TvzZ?JveSgg42`G1WZz_~CA`d>u<8#@0N^#4HT ze?#a0;{Nx6&i{ta{{{Wu`}zL{`~Nzjfo^jCU$os9!GqSOe;K>|cH3CW|Myb--{0G7 z752Xy`9Q*5E8ng=ukKYrDSs#WZ*G+SclTRq`Y-Z-Z0O@ix8caF;Yh6E$g3e94YH5U zvX9QQkD~0OKeCVBWgiW*k4D)?arV)*@*RD_^e=P2-2eVx-2XqA{r@~F_W!@h{;zUB zZFc|no0HmBlzw5xa`m}ooZ7iYx-MwbY|KH!`44|O@O?{04;e{)Jn?zwROaPb~1!~Qi?0A*Q7R_pa1gjDaz0S*) zvo))XnmK8lR#~gc8Wj!;fkiXsO{U}ioWI49M1v^oGwcDM)e)PWhoCYQ06d9X#=;9e zoikqch#el*Ui|0R7vH^k@qPU)nRm;N|L@ym=W&&JUd1u~dhdKZng}qAp_-QM_^6^4 zpW5yI8UYPzFpQ#>;In`bwof8?*4wvK(RsYlLzCS~z3nVUU1Yc{aVQ ze9j1D?Cm05`I=a+B70a9*TQpjqw6zmMqoT=KC>P@Vr!rsO$nqSfvf(F*0R9Vdiafj z>)afSz#y>MUo5 zk|I60=wleSkF$d*XLz_}CE?5%eRfAal^fAQwrYU5MZzY|Ny$S@-nkA(OrvuBZG~{D z|H8lU|IbYRM<@T}&Q1V}<$u4ix1Txx`_01t_uOCdfvX{8H1Q&?n-f-Tx zr2f|&@{b6(-Tpb4_0Bo-vQ7vdE>E`QD^8M}2h*_M2`_@tWXKtgcOJxj_>x5M0ND<< z$UY^0l_kw88;qwPf+=TS{M9ExyWNmK4Ndm+3|@B_3Jd+ zQ^aMRdYj*p*sdS87YU;=o%lod%cJK-*UzP6GCy zQ~c6p|6%mwUeRauMD_2E(5R4^;YE7~3Y|b1$@zHBh3`QS4H?Q(fg+G_Ivr09+;1_y z;lzDT^X-0=1YJJ1*R#uE`1r>lIe&c_&w>j}vSS}r2ZP>h9t=5S`q=JqLOdH!FWJ#C zpWex&J`H;B>cE%7WaeGD> zrvBtfMpy8B8blz80uIW*0jF=bUtqZaZkH14*Q@dD=WzA{%2u+-3gdiSEuO3WJ%#>$ zIKY)ehG?j4!EdB(!LPDuI2Lz?VSF|_N9G((xlGEj!y2N%gv;3xM^Oj%KK?w8hT;v` zPx416r;>f9wi0K<^)TS96gDk9d3;jn77gU7i_(CE!U&Z`?om_}=-g4F2<(2VDvyH8 zZioS)qO-ZgM8YdusHtMaY+huMC1v=+?zALA&_o^ zhCFq_l2XI+vR5~-tz>U+jHf;GX$Df?StoQp9V~=&=B#t>d>So;^oO&~JLl8kLP#TL z9peVbQ~Y0iQM%jJ(cW`D?Jw-u3J7*1HUnt|1iKNNfwTgG-H6RVik)?Y;f?WRBA;X+ z{Fx~$EO9au=Ga?*3NASrKK_xjuKu|9GVX^l?KZahB(*8n8h9n7g398T?_d7#Lq*sp z?`ivF$3<$*ag)j%SE#=-Su4F`+dom+@(Tj+20>e zHk+B*o!{rft*1-!3lhgaqH;adK7SHs;%5B*Ueb5VVJ>n4;<@Dm$zdlt zLh%BpnW4ZF=ZMUllPMh8e$GV4Zo!*Vo6`_|RUCBLdO4)BI=61dRpQD=F)~Q8O3Hk# z3SfffM=O*mSZlJ7GO;05VaU*t`dx3VHjFc--=s&oRMn_zgi%y`EK;}p*vmH?V3LWZ zC)7(cM!<{Nu&}*8Bv$B^eSxOOOTc?GhyYIraHcZe8v^3Hwg8~xK1Tg`fXm`6OAHHLbu!M-+VG)X0)zL^M-o+kd^HsQ z62EGE8njMUaVP7W1rS@KGVXTvMF4qG!z!Er;42Kcw243(r_MJ$V}sXp4=jmKiW>W8 z?Gu+8^sEdh=p4eC)j%A9<;zRLn71pyzE)KALofBJakd+BUX(Vay8#oDo&h5f@`}m7jE#C`f;4EUD*kPK-u=O0K58a8-(80G~{mgRmB2@r;340rfqHm8L?&{FL z8hg+qR#5Y5eVrD;7O!1X(ojVt*Zygy!0W1jeBZ6>*G+BM_F-vOF3urWpEt}DixyQ`Ktkw6M(I9JsGMj=gwjl?}Swm_!Fgd=-{68`8 zUVw6hTtIqQ_BiMbX$$e=*mF=9^bvLlR6JODi0i{2VU1nj`2y^OCqp$DYk3M7RXHCR zG7PXS_duj+!%2KNHYFW(@std-*VOSL!mw~deA8fkZ0+Wu4C!Ul%TTWFABL1R8<}mA z>VB%5YDV`~>3^?fgKvdhmST zs9< zZk~%D7FZvBw4Sl6Nbr$jA7vG{xX3WPbRt01rUA58 zUP@u`Vc^J`*r(&=9JA%Niy-9J90#Zbc&93I0u(ZT$!ZWLzND-@pK{5#6qZm9p@eP& z{VyE5SDB~s57E1+WS*VV5`ViGA;h~5{f-H{o4^Z-#wg) zWwWn7=bH#UxoJ&VZC@!77-~BPEwz=l9Yc;c#Rbh*ZWa%6E~ai49~S*FL|&3_5Aizv zAH)Zhwxnw6j_p{x8eTww0R3*Lb_Nu>m-=GQb1>+aIkUEE51;Ukzqbrtuv~`b*LlHe zx4Jh+eTN&YFY8^&h?v&`#Xwiq2juQ7E4!-2Av1!Q!4s{Z1c*R-@P&su&4UNW$CUt52S1)N3SmwgU)fEjCHccenzPcWRx*6}&fZzYhhD zS>v)5Q)im9=CQ$56o{^UM9Vjzv->e;pP5r!oZZd3sPjBAA{3hyy0W>VmEAx0!Dwm$ z5h~>O2?;Mtr@<>mN@vR0A{&7!LQK~f2_qv(@OLw-obVf3vZ>fXz+g;Be-dl=a9OOG zNY0JakVS?UW#1GKnY6!^oJQ-rS*3RJZI=_RdA%{yb&Ae@WLL5}Sd)93I9He;GE(;t z#boBBfEUW*p1^G0Vk4!!rXB#q?_!L2nBCk>aTwo(>q3Aeh>sZWJ#+;Ioxkm}>0hHV ziRLq%YtL*WKJoCKsE+kC?5W^7P2bSxepKdIjdE=EBDT<&POj>kK2TMVl~*PcP=G4S zEPMedfR0rMGwPRA*>$m#Yip`$+Vgh}ySe}?)lbrDy!_6)d*}j&qu#n;vg&$=w}O$$ z#_oCo1#`TV7JPGP`_+M*_h9Ms@btig1l9qrIM7BOd+h)b0Mk>rONT$Y)CRn>M-ZN z!Xt9+&5?IJt!xuv?)Rn-EWBaoaubX?P^Co#|k7w0fbQaOB7FO7Fm(>JR1uQ}( z%QH{`8{Baz=lS1}^%NMsXJ6>8&5_eDC$aj2?weyn6}uvTp|n3r5GK}F>W-OoEB&*t z)stcj02BJT?2mgodC%uUjGoG>AWb5*f~MDK#uGJLb{364(;R zA$;Yy-PisFqkPr1FF%0q>{7&JqG?pVQt4GGY9M= zWNkPO3^~Q~ORJv+8K@?`I=T^?ycLAA8P5IE-8N#-D)+Pvos4hqia;BxVZBFKS6M1pBfJD zK&FX`D_bs@POM*R2y`EWqIJ2C*g0Lj_KPz-{}d&D!Ru|paAE6Njnk&&TH(ixBo)7lSJm+6hPV1^7C`Y|Fd zQ^;60wYHiO5)vLAiI{*|Nk8AoZ7oIyUia||RB^k*35~?)5Y(?{3r$q<2zNwAF7Uua zYKJ){jtaYPkV~3y$O-rAT`7;8$`F*|o?_z#(P{X?YokF7(bRgWG-r?vg()cM2sT%# zscQ657VXZ}eBEmB{Kg0tw<`tSRB0>vzp9&+0x?zd6;Iiti%F!Y;z9X~hSFWX1riTK zK|^{BHCCg8a&2;z@V8qBCGI1s9FsBY4a06F^2coKZ>FZk*zzp6H4Yh+R3^xC^=ZE- zOR)cO#Xd=oCC&5epR$_7ttt*n4Um@Zfj65tVfl6H0DpYC@OG*g+QGh{b`{Bd!c;}| zdW??U;%U{II-`#Lsb4JZwJ&9){?UTlkxOru$BmG1VI)II-;Cq6Yr}QR&y}{L!JgIk zHlgtaes&Aq;5V|HD?UiDgf}HY*Y%&G`$ysK4p={@U;j%`tA~gvgLiff(L~g^;V4qZ z5V5hXAnlU=DAFz8Yto*dhyOgHN3~JR{9{2aJl2Z^chdUe$KF4;l+!5hee!Un*ycn_oPdDBeg};Cx zO`va+&{JLv43uZ+`$_0~?SopUM9+r_y3{OFmyh}LbWOojRTBZvH;)a_#rqsWNSput z5Q~Rz&vx(we=8m6a$^RX>ACvcwJHjoL&a?T)@~lQhLg+he=3+W8+sQ3@rjOYCxtjR zfI7-OxErhXh!@@PJ6>c5WnYG-EvxL9%{`9v$00_t8}-h6eb}YyDxHke336cZZ7h7E z{yK&O%*odK&pZHBSzL*r-`!L;SHfKJE%yN%BM@v}thR5uZ=|y4F}){G-n((Cp5oi7MaLY_#lr+Xxxzua4*rO{BrOM$n zYUAfj(lsiKY)S|~-*vS7JN+H}X+DDj1e>)XUOBiRdascF@JBzuCQlakY9q~baQBEF z`ebqG%wek%z9Q25L1S5wr-KC+CF#s=nlBDoaVN^hU?*e7p>HO1X1hn21};4&eDW#& zgdg7pu$9d=m6_dHswaOtNQMm#mi(=rT%{vsr&&98*y@_R!&+a7^S!jf43hz*oUrip z{55h2q6QPy8fhW^p5(EFINqvPPZGDZRV758Ee-6gYh<}G&nSIm6O#w#l^>`rChLMT z$0CcHyk5UI3h|IYzj6ri$Ubwa&d+kZyDUi&bY8!duW!ZNR3RH%|HXfKl&?672Ts~? zu{$jfJO0x=PqAh6=o|7-X0jMKla;Ac%+^tAOJHMbvdD#BRo$k9ZBk61MAD;HY@SHv zuke_rD$l3hJU0BS%u;ZV$IK@G?#ljKNI=TE0`Nh$9`msj(*$Pnd8AgP{ zIFR9rZCPHh<>;9uEJ>u;$?x~NtCVJhyXSyEpAWD=jGpqRrHNT z6@)scxMUo;hb7GyIvMynwniBRYgwozw9*6kyC9(?jj2Wb9Fk$L>tKWj2|)NOwOE_#F(ez>UniEcYdQ> zZ=~xkK@6iOLOHB0y$IPGW@q4POY`ih&f_W&jIiG1g5^E>?ZGu}-yxWV8_e1_gB>9~ zNJ!|91))ZyiObeh+UnG+#MKC4g%p4I-!au3VG0Xw#7&+CV*L+o)dCM4asyr`)l*4?_k`$-8s zQovnbQ)I1j@s;)n+?jUlktK#0j6sulPExaK6nd!Gp zy2m`Y7lj=ub8S8TefLzn~GBU zn1^;}Qh$7EU&&%oEI-c1(5 zA!WC%c$?5^FI1IgVpX?{(D!hPe^pjrwmUfa z1b_UaX?&_8`10LJ0~PVF){Qp;XASM+P#J=aa#lH^iSmTZ*xgK}vlH8tqodi zhmK`ZJI)b0y@rLXDm+5Td2Uglkg;JXM{SrxCm~k1EWBMLpJ+k%8N3gJD5CvSPGU;- z(QlkFiGrAQG+gOh5_J9>!Edv*Q%?f+jm;)>0K`89v|wdYU@bIg~#}@y{(>3 zR4Nz;rI|Z9I2E4a4L!D4lF5Z24UXhP4BI zJ8Y_WK=+637NhV62c;xNu$=32B$^A4!C9QtOmBLz_Z5Ba0a%~pxA&M><3vdBBvSVz zzw`oaI2UOo+so=MSQ_`MAd%aeiV+8*S8V&*^-W5LCgJB#D>jcqeFVvE)b(VF$7kGn zHi1$GYf@iOtULEfet9us-=yVka1d zvdam`49<(<+9dr^_}izH@QOr_ zIAaP;$v*ZAq{le(jskTxvRojcU%i2D<*jS_R{sd<~5xlraLBa>3> z%q7kD))bQF4n%v;ATqZt{QLg556gt?!+k$FD}2%#r9=(QS^tdd-}Jk+8wjO`%w+IW zVs2M7&IU9`djIm3SeCw%LoXKJ@e9qQHQM_PzH{-wK)^II9Fyt1B2O&{0;Ocru){38 z*Rx)a;|Sy-LYGZg*jCVNF8fT4S3VO_vGMAG1*J(3kyNfi9Q>?lZ$lT#$PT)NXM-JJ zsJrS}C?%)}IMQ8%X7ya}7y?`1_0@EJNpMUq;c-K3NieNa+MEBKP}rjC47JEf$L1z0fF_Xr)4vS?Q!8^*TUU2`S9ULBdpmYZ?|;Ke zfLG$-;eq)}zS4h{uQomyPF?^ffQy%p|1Ucy4F(-g?DFao(8}E0 z?!Q_8_2GZB|6_0e+T6cJ{-4$;BavV_^r@}hz?pv&RD%Ox!Mj4bC;{}x1xegoE(TR8 zVRDSJt=YWPJ?c}uq79437cVy`thYng4?38NKJ!EUx6cu7Z>&_7`kUfIxt+**rt`Xb zcwv%8^D^nnwum*j7WQytF8y^dA0M{kSeNKA;P>g$;!P2ng0@hy8TulsF23LokO&A6 z9(KktVC4vVbwRQuQJBOm1xi_>nYkhaQ(Vpv^!gejV!8N1r`g7>zj*K`5cP0ENp*hB z@41YaHh<7{-%U;>sbV`odeG@W3PfwF8=?n^YRQp=DH8?_zqdCV)UkIk*F+#C@rojm zG9A%$MHM6Lx3JO=+OxG-L_aLo3 zrst`)F?BXHF?2ShH}?ekze*VY6INDMp#NF_C;y{nVrF6oVq|7!XW`&rVgH}~Of0Od zEI@>e|5pX{zu(uz$=T5HzmVK4Oiiu-_m2O;{y+2ouetqi$^8$@|KB<#h=Kz0f15)A z0qs%QvR!6G@_AEF_qkBccAjEG316(Oti)8n3;-$^cOZ}0SV!n>?(&=C+|UDAfq4*c zEt$^7-a4C>$tH#NF%s^Ol>Gn=o|6|i`DlbBvZ88F6GNRrKSr~btR3JMc@$6e#t{x) z>?$^=HFjEb+g=;3%pPS6hTOxsa!j0uy=~{HO>yqvt@qY=i=op^q^Pxb08@B?iOwmrfCRxih(GvX9cKMvED+wZYg3yt+J79Afn%+Ui zhGl}d;ax9rjY$vgJ)?K zv`>Kt@f|7(-S^lSAmqnDTg7*-UJbAIiL{6W^FXBP96ZmA@kqsNWiBi?Z9`|)YPTI_ zL_)LR$L$vTWKX^*&rTa{in$~&z%^EPF}KyZ9FQGqTo@fZM}W*MP@yNji%mOw=k^2~ zOkJEnYps8dgVa1N6^)!Y4t#GGxplmEn^X#2{c~{lZdl*+2H$!Hag!4zDQXWkDpF3q zoJNYu1ts`wkf;Veu_q*;n!h(PGQUXVXuFk%OBLN@Vwmy%7*3&t0toQy@|))}nA?Co#NW+-8z>tF zFKOTT{+dDMUx!TVXBZhV?-&68f9oCj|8iXa3-%l`rYS=ibBfBgTy z6ZOSa9$BzTS9L_U>)&Zhm}bFnVC%-)D(1q6n_l$?dqcm+Q#dHHUoDf84OOYju6q zcKv2*b=B&--YV*CS=(IqTpP5z9c#CR@3Gyv1j<>i>D%`E<^NhQ)AMG(SpB+PfBBN* z2*0UXxF4$pl$33}0FEV%FMNLh;d3FlVtV@=qC=U{Uvk%CveMz1SUf#WXUjDmJ%pW+ zMsCY!WaKHCOHl=4DuIqd&pq=uBZBVWcURw(mpL6j6Z1BU3`D&Au0ycqP-OJFZ{F^z zoo6I|oiBda!Dm5+_Sh={V7*L;?S?-L1BG+dfHImGinl9(xVN|YF+2Edhbb_wKN(N1 zh#W4^fRNTdj{W|oHpL{+HhH~)Ih1bG*gqOnFC*3&;E;PkXRpv1x z@=&%26r%nz89{}75@GLcxu--_UAs@9J#-1WmBWwnT-fhheW-Wo7HUb+pxt|+0(uB% zHXMX-ny2$A_s^iiL?BE9UIEVL8u3sE?xW`$rQNm&3VFb3<`^FNTXD zFC4MEiXl5zSihWnor-=(@aM?5rP7WdR`f4ExNpX%L0P8(WRg2?1c~U&}qIc;|)VMTJs9>Gf7!w1;IN!&&Nw6 z(O&cF>#m0M=n=g@A7ft{o z(?lHjdno^4s)DCe-@|YAC5~kWdUW^dCOq65V{k? z1#kxujq1+S4q7lHh=7E#B&}GBoz?S4cIO|&Y%R27F6af6Az)N64Xl5lov(PFh3@x} zqBjp5mcN&QUx2&e7PcLQ5wC~9W>`6(R`7sio(AM^d>Z<`PWRJddQ$!G?%rJeZ0%ZF zhp+TU2IT1)9Nh1hZgbbyH&C*=cp$xQ*1{mWyuJ>PO^gX9)1=-fH`hN@n}0ui>stC4 z@}0kSzHZq2f%3g@c_43AeN~&?*xL}>HhJu-Km@{bc0e0;eAoE=jUc;Jt*0_;$zAut z-D-Mf^7hY0uU=ih_SG*Zvt9=fT3;Z#$an3o|1@(TwsE`;e+~7#b$!vniZ`w7?rrZ{ z^jX<#fMkY|i(Z|r&IYUlERDUk@cw+K;cQ=FJlh<-xK0&97}#sy^sJr&#}a?ELc0gr z+Nh8Geyy6}_BH=*1TtA)|7fK!zG(xTphEUbT3Q}#kLchkyg|tgAlMP#wC?K57{7mp z*1jNbf`)=p-MhNFTI_)Le^z(rZe~`0VHF|1#9%EfNWEpj{g`cZHqARATQyD@@wn0nI*xw39#+UcIOs)Z zrEn2mf^kYNpF<@^pPH)tvA^82x~RA%k;bBl9~)6IB%oD5R%##2Up4-F2y95Hw&~lo z@V^Qgq3|#AF7o(RC=;64pJo)4{oDE!D58erq;XE+{#99S@Cr*rOn;p^LGG@u$z z)&)#@JniT(g#17)=9ET>O4P%jV%Q=yZQ#uqp$p`+TxUjDF&+DCWBo1*eX+V<<;=z{!w4cGgn@Z}hVT#30b*_xC}V{Q)OYM+wa~ZK@N|Av$Ej zNF&1Q?(44tv9Z^?Xr%4fS0oL=AUTOalb93%g-ZCRyJ>;%blbcDQ&aCOOh~%l zs%^*73Ve>LjYo*#S-=tdRQ@+JT5!9alHb7J7>g+%x|4`b%3E$Qj2+Q3h$%)*!=IB7 zi_YFLUaViV&c4V#JvsqOZmRnF5yf8;rHhf+;`0#>3E>eve8No_#hen%0^R7&VY5ra zXPv{$3hHsv{VF>*^p;9B_4!EjG#b<>chjhqNQ+RoNq~Hk!KQw#UqWIl3+e_UNm-Rt z*a}pZkeN%BE%^RLjbb%5^ek_9H-3xVulN_S5|I20aK6|D0EGFJ&XZ>k-SOD2&^&=< zcpC-ds5CKr|8)I*M}bIcuy{30Kn!AH_Sh#9m{kx+w)g5W`7JMa2W^CTQQr2hll5j$ zlZW|)4uKMgnWxjJ_3Qh(7v>lHzRR=t*&Fi%lp}sVr})shkTFbByINQU*+X{lnsyZd z^3gO6&^q}j|5|$Ka;H(3XZYXfSuL|~w9YZeo%Z#k zxpjLO3g7Dht_g8coxZTqSH*{kCv5@mM?9il;iQk^mbcE0?~ax>MD~#gtR#vUh-MH_ ztpVVhJTK!|Rx&Uk{cW^c@p?H2iF0{mzcMDlqnIt$-ExcfDX6}aq@n|`(3go9p7Eof zrP+B| zE(Pv^_jW9y=*Dm&>|YM{ps@&?%j!n|KG=&i*u?~kTX;gL-uNmsd7^s?d@$ld|44=d zwLe^A_~XvaM?6bh6EY1k!^-kAMXoAuW}@?=cLVh^@(&RZhIO>`&d_Iz9|DE2a2ph6 z{J~WyX60t^c4+))wRwulL)f)hg8LGbtv%00?MRT_u@Xk~eCaU=#|dB%IZnH9Tw+_PoT_cLyu{f~~~eG8H% z$hs_KSmSrA`-hf`AO$x+g3p){zQElz2Lzs+GGH=pAux7Q0?KJWzLE+|jU88m1!W&K zf0Mv+RNU%E%sCv(1=HA!`WVD%a7TDRw--^yc5ObsgwuA=6=QlV08vOz6g@Ale*-OQ zb!4B7wG+8(!RwqP5x~RdKeZd+;xTE<0$KjNeAQ3~sUY@?C$1BE&LA{aA9Q;-Q6IOo z1JbTzA>Y*mN!nD|9wr0`xw}@HC*);Y4~IbnaB}QXN*`7JhtY*cZYleP)Mwn_PDj5 zzQ+Z@JiqkczUFUdQ_D?&TOR-r^z5hco!W8$yB1L!51a23JNx5ce-TRgZG?FoIJDK` zjF#L?drZvEl-f$LR111jtuZcr97+)JT?b4vY#6NF2~-tn9&hgz+m3O=XcP~8i}7qJ zo!}M*gz`x*fV_NQ3x@E0ZgEj?An3Up8eLkc&UlHLn<$v*5wCHn2Jr#d@W^%?Av;N8tpcYrmuG+!OJcjTVigfoA_C9LLzT)cFCR}RYePN#q(LrJz5HhY z?ng=bEXSr1P5+(5P@^9hLnF;9NVx1JX+F=&8&>miy4yJrF}mP=H6)0jF!Hmnq!Ew+ z>_0HaFDpTJP{z?gC^w=8xAQ1tf$%NxVGqQxxz<6jgf18be_PD_5?V2}j~VVlGq_KT z>CgMf2*@1&?jmU#DF2uo%EG_hjOp3A34uUnL=aIz#;ASbd_jCkQ}hJ*4b`BVieib8 z3T=ZqCLChjV#Pd1ohOkId@)#}E>O!Tq%aC16a`i6xDmY?Il*C>Kwk_dmK`7#$Ky~2 z1_MaX>xMvPaI}H*!cOW*<$40CEet!c|Hz2>6ju^eSR4hNF2#oh#oBGt>F(`0=CYC8 zQ91<`qec%NV5p>DN6_M}g9lOFbr(DfimLyj2OdW2RB?c#LqqC6z0#`#&%VPJ(tqKh zYta-rsgGdSYo&)#|LbnTS*szERp^f*a~o9dw;tJ!EPO2|ZWp;ziCsT|YoeYdvlTP?Too|5il1 zlXS!b+IgZS7u)kEj;nPi2SzXLe-t2BR0#%J$_-S`*6^AmbE}DzRu4hd9ESEm%up}{ z4$@b+$+vOQnFlX+*@X?`2IPVFep;9SCAu`;-_5n!=qE{@>ww|U^H-}l-=2?0 z)h_YGg~~abnS(0>pOym^VP*{%Mu!;6;5Gv(KSIa^mm>L%S)eRj>Kj>1Y|VF|+_Y-^ zz~}XHhvXU80EsZJG0B|@0=?Kn6oj#MeW6C81eW3c_)>nXBILS{62j1Xr~vFg+I`{B zDM8NfECdTCX0CV~nG6u-k6vaMqz{drw@FR-k;E}VykoPl#MVyg8N;$jT**YTY}`%w zfKYnCbUeUR?zl<%2^fc**8ZTLrCFz~;x?a%VJ!%JCkJQ(GK$Fd`;kdE9G{ z8$TjH9s-x+qPejk^bmqYAs|V)Ycl4p|Ci^`el)}5#tLTCU;c1{7nzlz8Kp&hJV15^ zx}gDFGW1lYapORZS}eDP5%2br;jeE#;* z6Szj-0^m)XM`b zC?njagT&x@9y9`RL?`@cp68Usj?67hEAOS{Dp+k|XTfwvTLuU3`3AQ-fBEyHr;4J> zHNIJyg)Yz3T%9kMr>NY2S_iu0%D)sP1V~))3#6x53l0o48kXb)L~n!W6QabaI~qJ= zrL(A3Iu&ZLyq@>|I0Ju}bh$;Q!rwhSb;Y}^i<}e zLwdIHpM;6hM3v~zCb9u5DZ2!%=|adsl194EBA_AO=bZov9VOF6*Ge=yjSx4*Iv9EX zb58e1^a~*?m2d(BL3e+@ci`0k$aitofJ-Z|5Xs|}ezKl;E>N@f_-w>3kmZepyD1@G z#h5G4s;Wy>C2S3>t{<5Jgh%&a791(xQJd^e2k}`X3bBPfHrn`6v~I^F714su$mC|Z zcr_->iO+x6Bf@SuR9x-E9szK92`%-#T4x|tF4VJZU4nprJBc!OFV>bj)kKreQT2WG zdI6ErSC!}K(kQ#gubctQ*tJ&lFt34P2E=I)`Wm0-O2T$NEz(GkVDP18L_p^ zT4Q2~z3Jcsy9XQk=+aRcuANt1SblV2=mnN<`vaiX3@giwj!Wnx$vrFJU zXO{!n_|(xr&O*$-M_f}0+0&S%C#O189^mN5iG@;y_V;})B_kuF%~&Lgp~c8t#`|V0 zFx@UYPblRb{aAvQL5@F=AZ;3B0ef-JqXFBF;r?1r2fTj2+rGbGtBB4E>}hI-TT%8& zF^rOsRG~PTMtsY|NO0ZI60?vYc!V}eN&Z>w2lX(EkAsFKm}M48bnMNQPnEwzf*#si zys)E2K_ZkgetH9La^KKs&&sCKpGM~hjO*X5n77()V4d&58tq;u#Q*FG@nLAVZMmRH zaAaZ|1(fYTz353af}~ZLwE`)X1spNso#bHnbMyaz_b1X+3lI`YKZR`Q5ETSj<{CJH z9YacLDyA-*GJM$T2jKzE;#~U_62zy{`C{j4utJO2&(6X}Rr{!+~2@wcy zwqSQbZfdM>MiTufYm`iChvQp}HSbiu<58S~z`jpkRo#axqEkmOC=w z#pW)kMknJ53NjE113UJpV>CGw+3;$P*k}p7r{1XR>h3;1)^tFE>lzT>?6`7ZO3&!L z)D>@49%#aVjHE?0Arrb{hb%`nqS9Gmc{uI27^~&muN6L3rq~!xKydTw=_?^5?-7N9 z15*9$go}u}G|S(9iwoUyn%%kk1LUjxeU@ZC*Z7bZ74`O!=Q}R`bz>6Q!j0rb;ad1q zp8WpISe*4JbogJ9LbSk|1$n;@gdY#GG`xncglzn*Is7_*m3SyyuqUv)gYuW$ioIW% z?!6Wxw_}KDEMkm3^}0T!g?zVPAB{>JZhwK~Qt&L{kE`@pwUseg)H;v%k5yUAQ)|ys z*iN&}h7r&lo`zKo*HW&$fX9@mQLR#W`Gs@;4joc@g z$WpkVv)x75jv<7*U%ZQR$~vdJWzgzh!z({a?q4sD3qHUU;wE6ECw?x=Zp%~n`BNf- z(w%rov2a$*X!7MMJE|$R!L&RI&-gPHTFk4@W-o8=-R{eOKovnLnKPU9>RPo_p#ku@$}@Z8xdJ?``WZWXey=5&|HsQCY5;U8xSRa( zMP_oqjILvJd1DP*_O9#x()!%<50m+NJuEbu1e$I}V<9-K*kFsltZX<==LbBekox88 zB5SxB&=B&suVMa!Wk4}WI9%;1uFH!zuVjSkoZ(!Qd(!FW5S9?A zlUORtxv#~fPHm=OZ+12JV5iPC8U;VV{LxXwD^-W}23iL%-EDL(1uE)eFf~g8bNd74hw+h@ zLCpuT_LcAmm^gf#T>jCgdHV$r6alK>bij3Dkxmg38U+(q2eH3hv#s&!sw7) zdH!-20PBl+`zH3jvG29&mlxj99lY>NU@v1DP&|LsQ~q8zzjAQwwsGIF|88v9-h`KR z!n58`bz=`@@ICDa<`MvEf_R#KVLkl?mo$zkA(xLzjxbkS7!jOZ!&C78*#0&*gq7rj z*;mbZ{7}7BLbVacda6K(f%6yW^3v*#ay;iUlrvqW@Ffc*qy1{>`2H3uRLJ!KXnI`5 zj=tBxJ!63TKkn2oe(XoLTs*xd?V{T0xENtI))-hlPbOgC{lNP(LXZBgTgv>tDqA{e}&1v7H^m#5rk z08tKLp#^BJ577?t*f}^_!lXk8_@+Gkg=)Fcb%#Zzx%6mOO;9PO$G?nbbTO$z^~f_g zCd7ZJM+~eyT|HfOALUBV?R=rEtLHMoNkbohI{ruH98X_1HjPN%nG_(nAGc2d=V$EY z<@R(oD~C;>R-vG35+9y#B9H9@mk&7y57x`S&VpotG0a)cCOATHw!d|bD#wnt^0$X~ z2#(&gvNMu+SA>Iu>49k+#M&>=pUH2zVJuGnJa7~yY;DP^&CU91#7?Gn1EU1RMZD)B zg>+npa^4nQyP{h{wOH}59%_YHqE$I%C+!Xz(cy#fuvY76i|KSlHl>RC5o5tNZ7i_c zvW=qfvf6Y28B#i~i~UnVcz=2Pv*BuCX@ax{RblG$%H{^OK50H_#T1Ol`inS5ywB}~ z7hF=f|2$JVs7$=`Cvc+}%3e+Mr9|S|SQ_w&|1i&Zd4y)nxw5I55y&IH@+ydjS*6T} z7Vw0gPNc=zTmH~`?KEiYSuZCCu_Gk+IQcy7%+!2;!eX|ufDx3y+LH91Xe?*X`OblW zgK7{kp)BvZ*ACY^di#V|F71v@5{|oQQM0Lu^I=s(7CmC4KPv0|kDGsbV6NRx>hY?C zoZRvguaq{9+vv2UOzebn{M;Cd*kJE~G+CPHoo!_kZbP%jkR zB(6p!S|wAotQt5s+LI1_{}D(PYZsb)&1&$fn^KB9ZnN-$fN2dLdb7 zpKj+I;Ki7a``pr*4=4E+Pf4_wRi@xNRr=0^k_hceUW`Pg{zLG?5bgC-Pou#Pmbb6) zux2(J*39o@khM%KgN#lIuJUpr0|s6(T~PgPws`L$LGSkt``2aYQ(w>H)tUOYsKK28 z@L>GSfAO@f7_%(Ey{L=U;c^s197o3Q(@K-TDpo0>A- zjk%6`mmAZ7@Vba$@<9jzu=gewz`#DoE6(0H_kn6bV2tP4+{f&)rCNA4Mfj!1IN;7~3jsGAe5WxT$rUqK zrc+$Z%y1l8ChBs%U_JLCl+llO_d9^tG3>HhT3KC~(7#`6pE?m)>=718D|$C&(~DF+ zEp-|olW?cI_P%Gx+yv^Im$^|T!m~1rz@{pYot1eGn5pk9bjmo@YlYnra~#2<_n6M6 z6=r^0A7Zir_GsUv6^~8*3{7_F-(b_arGGJNA9S7i4N&)J5#fNpFggs}_uZx;g|7~( zmIf@Ol(-D<&+a5)mC@X!;ff~xT>fE^sr8ccMB{ns1!A=%`l`pK7rsMi8buyzpF~ha ze#M2W`47k*`S?PPbMg^NIV zVSlAfYS0*MPI5R2gaf;_jC7zon%6RdiG@ZUB754)xLJ~mI`Tr#%u2T8VuF>ALRG%i zC!>~vi;(Kn9+>GL>Bj%Kmp-MhhB5(GZrD}f7&y zhf;1){Z=;xYr>v#qO(URs(|0la|S&L>L}cp-%Z^%iIuGWP-__!$@1ZtO1BqkSz1Ol zg2!g3(hE0BlkB?ZleH`)`e2g;i#{^_EVTYpH^-=gmZut9KuR{K>jd}5IF?Arh7sn0f#>9z+#z>ElI!vW>|L^NTj){#m(#6d4$p+SZ<3Z zUWDA6y7NrlyO*gXo6L>^SrkjLwlEZDcCVL?f#eKvh=!U+0_Ey*dGx`8|JZZ-nx(N9 zb{1^=D!zt#Q3V*c7$z9u#rbD(rck&?#C4B$K;VsBbiqg%MlbSb0*hffAYI@UO5+_m ztt|$k71%{W8|cjj#_9BuMr1Y9(2iyHct>MlS-^D)i`42LSH&O292bko0#oSH2$RQw zotXkfWdhwIc%8ErWi`1lIV*<77(cuzHqr%|TO>ZipXI`KOH|p*w?$<1p}_BtLy7k) z<@!zRbdqh7n4B;E(!XU49a1V;YKvO~ReiOf4X&b4I0;c&TB-8WOMR2NQuCYF1_h?G zlOI?2>}~CEZ}avyA@pmE@9JQN$Qsn2F)FBle9q&pag{YEC|8;$)hL!X64C3X<6f9w z7VQze-gnw}v%saHDr^7^Y_JeEKzGqgNcXU>feOIzfRUrgUYJ)Nav-^ybyTm=MHOn- zDVT0Z>`_TqU-wrP&uf@>%I-R#?<6)#v&5hbCVA>c$E{@;oeUMinG%Z-BLB;*Dg+Io z*JrUl84gMCS7@EMy!4Z*$*GCW?o!&^i!dze?%of>!OzhumaVRh@NQlvO(x0wF?JF( zhuzmHgT?AeUz>R~y9$*9@x5CVHLbeBl;G80aXZ&CGh$)UQPG5x>59{bKhX-jP@95* z%=NXjI@~`yc3ELSfBB0Mg6IqUi)ANsd210=nB+gHS@JDZBYHO4!ikAxgspz04l+Y4 z4x=c4%b>lr@%Oyj2C%(3@Pt(+cSnsp#C1p7l5Pj*`Pfq+s8E7nFY>NgA#|L(1XCHvyz&XEIhv@3R&1Dk*w~YFk~3!p+6A#4OGMbQfDU$ zy5OnDmNo9tSVP4Gmt-4E$f5#9<8yMd#1qk0Ks6EU*y4FrlpP6XRKugADZohO(;gR%vO@840tBNR zTc*QED4)exMIWaMXS$=BB~#*onK>+9<9XHD<3{P2F|tJq3emD=WJ927!|zN@GNnxU z-Iz-Wi($`2o;Me#V;CEl|Dnm~E6I+z1IarvWE-~Dd*&_A3(EXqOUVh2SDjZN{5=Tm z<)I~>HbI4aardATP_#WRhseRt_x7>VXCRYi;nA=*j{&K7|Rp|a=#wwJF3VV`oU)QQUeC*HVjMA1^fl5LRw zzU0JMm%wZDP~OOlG9vpq@$*Z<^E`wbYTM$eFC&oIi(G1pT(lB#{x12)&nP6}=j%8OYom}>nAH@{K$IBN2e8AIUL%KBPkXB9q>7?R9o&{!5{Y5zmY^Je zZ#lwxtj1}>&B?`AT?x0Myh%7htP#+ZAEEcLCA@T!fnxblc)=K}mu8sib;d zei0-%1|b#z0SY3dEA5^kiT$sb>plJ5U_eYMeM`V=_TJQ^RisYBh1{7p{~mr~kLp52 z6-{A8R^{E7sHDemZL&JWxvDU`dY3_8B%)oTLP^z%gN*Ynd`IYOMNbv$j^AW;HL z<+-t;Ski>lL;pVTIWPNsT0>+n?W~MmY_Tces5APAjB_PE1^5Kpm1Y_M;4`4p)0dU z##Scp>DnA-)IEbld6ga z$^c2@s8vKOt|_SiFDbY}c(-uz<$pg4K1>Zs^$_!6BAGonft-8>>9>#Crw>Bzll#1j z+UL`0a(o1pM( zSKHt=P#oWa5@k?Ahu9!32`afGmAagNZX*dFIV;mu*696D^@9fwEZ6V1?csXjQHdR} zb-4KR0U&Vxb-N|n(~2qbLtRVaC6wl;^c+}c3wc2%oh`%ke9K8jY4M7|kR?T|u~5~v z{fMs<)51I_lx@kz6aEVu==9hvE$NP-15!U6s)ReBusDFX!ra&<>mhd@5Br+M{FC40 zFTb3ymvU_aRBbRp^sGCfGm$V#Nfk({Ua%c1?y@Pbt|eM0!!+l5(wqx!$z0cPqBYHu zRZ&bWF>3G7y20C&-WsHQgAx0}$jGfA`dQUj@QMD;q2zL3aWfIUzF!1)=H> z|2}A7V^(c$;KvMUX+SU*>a~*EKc3fxaqbhwwBD` zQB+<-gB6QKj*^C=J|ho(#oaUNl@UJ;OJ`~JLZ#c8lJdg8fb9|qy+%y3rI~1BT+b{& zY9h91_2|*!dK^iV+Pjf9oM(?hvI7kpRdl^x_`u(w;e(iNRz>T|2|LT%@}oAblE$QY zE@AHTa87B0QTqX)*CQJ=u zBYd=k{7d}XoJV6h2`s%+t}AC&+ohl0bm%ELE$7w`)J=g0yxLvh!9 z@7dM1UD?V=rlT4oQtoMIH?h6pB5|{UO3uts&**`_GK*`HurO0%Mi+K#2Swes26}5w zmiTfnf__O$Q$7lR75b9+O5W66=8MsIE0?uCwx4Z#C%ffbEO4+$v=9Bep_-WTH9{l6 zz4na)A9;0D%03f8hD*o0F>sE8)@ zV=F_y`y{+R-Ba`VBU7n0a0gj#!=sw;Rw`y3AYQaX!r321VjYg|q39W@4KF{C(Xk4qXD9oXU9RseoI+QNvf$nP=>qX6FdT|b}g_`d6`D~1q zEs>s1kILRqAcH+-kwAa>s@PLL@0q&JTv=+DK>S2dVWbQEtw$H}UJWhiLG$~mDyMnS zu8L{_*tc|h=;~6MVnmv40F`9tm!}Fdut_qe?6ok@K(Jk-^waNvTyyAc7&s^ORwsMa ztW)4rN4&8-_X01uY?qZv>ZN2tEKkau63fT=F}{7h|$=#rl^&s zgoLDBEzz|t^e zpVAIF=y%alrwuZp&DZHud)d}Z=iAJE$i+*Hu}(FvOxatJ>e}|x)?atlPjn`y=XKC) zL}jzE*ZQxZcQcswFb#r@K6}{6oj2FDmkLyp3B>M<%Ihvuns;JjTRueHU>$i)PqA&= z%XgsiRr)1eNt!yj5;U zg0jM)a1_2nkm%4}lPywvQ!Rl_%t|^jKvDNlmhi~4*N)9(K;!RA9I3VJ^M~2^nXvGt z%kdtWb3VUG2sC&L{0|{2rwW`i%#vniv$W)-^wOp}U#vRl)FejyF8|tKgXfTDNZtI~ zB94d|zA|TYN#&iYGXD9XY~hs={F)R8_tq?rO!fAzJ`{YZz$!sVcw1aGr!yNHc$^%n zk%_L`Uf;8B1K-;_bP21~ieo=HJX=9SKBxa<=3KH*>B@x%?d0yN605TvAHJivE%}#T zd{~z?w*ae&+!bjlhCNP+t=M2+LSL+RKmi3i_0>kby4oOf^?hlxcYr~OK|%xT77<<< z8)Ot+l@-3YrO{RgT|@^v%w3ARTWe)R|sM|%X)J<5#Y1Lq<{&xq>;k7(bXQHJPU~+tVJm+JZ7kk?Z~QkwIJtkgErFn zBrzbHAVj6ujs~@%w=v8rSamEfc$kpRvk%@>V$y$U`Rl)f3t8=zb!&>SVzmtuL>T)| z`kM7;KdWuCp`9Cc6!BSEb|phoZoxJ*Zo0DQJ>+stYl5(%LrGzUQjV^5qp>wml7`VC zYg(lck>w;G-MOIw^fP_;o^nZWI678peFax`xvZqw(Mbfy4xJ-4Hc2Q3J48*n1fvQ< z)--Yuwun@^)484BHR{gVSF_e{osz-3!bcO(*s1r?tzx6&_inNd=DvdqdlqjVh`p2ZfXyqvZJGq;%2*jd^(t&hD`QWyQBBn+D@e$ja5LBZ`T8C0KC z)N?6PC+9z6-k48Xz};AeN@OzoR=KOP=r+V+_}H5TbVc}_*#k|0zdN*V3`IDQ8A|-oQ8F}VUU_$VQ8`a`7{3Kz5d9h2dYmE;k7@iVZ>;|f>GQs) zadD>eb+6i6uHe?b3bl?~Z$aryIbN1FQs(vM{jrD$q5a{jT;t=d^a;mLiTiya;ubT< z`tCPJyo#KPmym4MnK{H91i_V2II^hmkWq-uoSn~$-dC@2`fgWZ#A6SKFpb&(ox4jT zpnpin!!a;8e(rq^I-eST<5RoDH-)M($vhe$05*BG+UK~~^dHT-Kq%H)v+!zX9THGz ztNr|YGRowk!V($OVB*?meSNbJ-WcXBLXS@V?y>o?F!k_f;ehEzQ(!HgMPv_TkBau+ zv)(VWr-!T>K^h%{8nr6}hpA9$&_5tKtR*PYo?R&=i4_QCJG4!mR63Utvn+SsC^B4K zOGmoNjcdjz=Lw6VNXStaqc-GSG7-p90ro01{p0u|nik1s47dogzVI<4Pv?&@+TZK9 zK5RE}pD$EGj%`5ub9F)w;70Oj@$%=})U;*>V0htlui{1gI4@Jndl`I2SOG{U>Y*-q1Rr=qaG!1?sliTRg?kMulUZH!+-#B$J-#TdlyM4ga zT6JjVyl=hI-p zun`p}nvv=^*hF94zzTX z+Z2ifL8d!{A&db>eaQH#&tRTLPiFi=Z$YqOA}6LPhpgb!ZMNFRIa7Z9yRiX)a1bM4 zVi;(pSc77tThv1V!9+#J{Q4qDT9cKZwJO>g=_F7(*Tmb7fB^Ka!tG6N(UT#h~1C8+c_(B(qe0Iyu>~>a6!j8fq(?&VRm)TD1-hR3| zQut2uJwhX{QSYu7H`!v5)%=S%07ppVLe84jW^R%$v`?TnuM1@?Y0>4yU`OtsKiK zY4bdm=4>L%)iLegPV3TgkFQG{*w|5>bGXsl$uFbW-;-rNo8@1(hS%<=0yDr_`>j*^ zB_(uMxP%o!GVFg672}5?u+~KJyMB?wkOG?(BK2Ea@7#eBAsbzLthi44W~g+6@GpN6 zK#KW6PrVQSNzglc=_jv#d*=s0J@-3BM}J&}+%|VNV%UsX^h?UR`epI@=_1&{fAqgw zg`mGTpUa)r07ys888now0UjqOm%d&A!mEIwPg0mG-MPB1-w=Tr0$H57zQo>4t(s7{ zd_hh9QS|~hPmCzXI^xt^em^~{eub)gdEss+VhV&p7WwP8-vIU2U+TM8gq>qYf^I{t z&b5okWEyYAg6^o#Quuv-l1cg4nXS|m*PRlLL=}@gu18uRn1`62|EZmOeP=>};{fgw z8YN^~b>tqpF|=}PLNScF&7~!b6-Ff~xunZ^5SE$ioLJPv(3+G>J0wlEWQ^e)m&06g z$y|0Ucjuf}=XuVH^X_!s_zS+z^L@V0@73@5)L8a+Qe;x%W6(aTAw|QP-BSv>7QEZP zwKJ?9qw%r zNg4g#-f2`Pq#2LBN)&MwTU9i?^OvKI%M7B|i(QUpm98Y33B9z?d+LQ^^^q$CEBguco$Ewt8sz-upP#{1Im5Y!dhggp71^ZBLE=85i8x}FpdYFfB4V7f;{-{<9L&BR29^dg{E)z41lZdt7c%9W z+sUblEp(R+mpuxof_xF&T|{1}Ec)q$Ze!yCw6t!Xbh|xVhc!@Nq7<4ZlS+KG_d2w4 zd_G4z@z|ONW;igU=g`G-m^VgFm#5#|Yjdq`G3!%?C&SjO3G^2A-`=m=5HFABWcHzt`~l}izOOFU=Z4zfZH zcO5v5xOJy|X?1?K?M0ICQX1A(_AwD@8u#ID3`B-H)acxVZ7`Ii!dcJUCMrtnKvhd7 z)-eJ_H;|50-9hpVq_XAHO)zNm!W#Rqs4W^jEK ztN<)5b5YAC@uYpCX9?Q;*k|b{80-AJOXb2EZGS<N1tA?ko9IZQh!f1=lXHZ5R#~ zk5*=$AT-e6*J&{qnQ6-gcP0$3w@eg7NL+*iiWlC?`#hw3zkfGvyXt~69eM26pgvcj z5?~$0ZnR)5Bxl{&Xx~z1?x2CI7MGiwWyUgD@pkAKU;ozHY|lHj-iqmXdEf`dJ@Rwd z4=|c*i%$QW5nb$#X5ZRTYyC+cuScN4D2s3VJ^T4l#G3{>A;DdPWMjdk;lQNxaT{bz zQ;J>pDhV^GmV06M-d_#tc=I_8S0;b-s!}$cI=H0ZSbdkQ3O&8mclRlAd;}z+<5&@E zgew-IH79UMroJ60eC$~hpMxGI5O48VmWf*QVl^YUA5SgSp!0?<4}U^2_qAykkrNb) z3opGYPq}}*ubB+ZPh7)(~>F=H|(v*TNBAAnO0gKwo;;^pBEbIDZiqf&S(fUIH-{v{>&M} z0x)M%fgiI@4H{W?yQZg9%9D=%%B7`!d|t~6psI_E3?dps$0stMFV-tF2onCNE9F6> zhfHh>4Ii*c;vQ181mjQ-y+jWv&}xa7#_mX%fe?K!hqH{=L^&CM{P*DAiyvEtkofB^TNlt8SNs0}Uj7-H; z#J>kXv7Pb1HV_z$4a7x8g-7b&4hRqXZxoonXsmznzaS@|M*r}?PMkC}+V)?*$1wi( zU$7bGH&q}z&#n0|!~Cx=YYo&nl7Z^?+$gMwY@WDK zm7TsW5_0;5IW^(d_Adv@GS|@DqWF4{`$#}51I94uvD@6_KU7)- zz38?XbV>SBbl3qfmwnHQVs~bhdfB{SIzJt1{%pzkx#mW0BpZ!iwwI5tE`hk4N={brv9sD?Ld=Liks_E`01w4pE$!Yuh2LY0+Zo#pY&Y;-8~6i2eKMo~ literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/cache/nio4r-2.7.4.gem b/vendor/bundle/ruby/3.2.0/cache/nio4r-2.7.4.gem new file mode 100644 index 0000000000000000000000000000000000000000..22b7976ab1b2ac8da7d0275a2c093af1073c08ec GIT binary patch literal 116736 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
f&0P9ai=n= zQuYa*R6rs$TedL#Jy@{qZxM zc{xuBGA3$GW$a&KHhiXVzSiLN@M`W@?{@xC>mjm2Pplx78t0uc_}Gfx zr_h{);w5JMWGVZ8hLT^bD%qp4MGp%}mVJaE!anp1jW&M1~NY5tz zaem+cBl3rso+y%7q%|fcaE2;Wf%irZfhV6_vae3?$$bc}>HU|MF5SK&3eZ@|d&0;V zuWUGs0*6QFrCElS)&&3Lz2}Ykzt8gND(eo(`5EST*$Vjl$v1h8fsxZ#4nJ4)*+z-b zT!23xa|-Tt7GKR!vXbYS7q)U(!Q0X0Rf;k=iuCc9xHrR_E7Ud*@4RHl;t~>gZoXAu zVG6N6Oz%+XF}z0L!JAQ4c8@H@5vGBII+UCnSV%-J38&DiI`>jIdJMs$a2~J>Ihwc< z2-tzoF069d6~C!K_mb(@xLmTypC}I4`c4N>yjx6r2^t#UAso(|@&Lqk?c$~17uN*r z6V_lYuTKmmJvAH%EHB>kLv#`rniqN$)q<#ih8y?-Rlcq72V(eF~fN^w#h4f^E1(Rp*AG#RM>aa13Y4a>|g*%(G^ArFt=w~tIUq_2{O&C`v- z(EZQ^ey{~?p&dt3P_EFvb~E5`6zBviqI-zCM$R)dNwy-gsKIj9?YnD3`6Or-dP0x! zunCHabdF6ICy<@eEmZIKByAXkfDZepo2)W|0{M6kj5DVtx;m#1^dXvEj}J~L3x98T60g5J{*vS%R+mRPfSoyP!kqrGJ|*;do1YV^@MV<Q=C7E3n zh&-7Jrlp7X`utj2hVl?oWGYxeS67I%F?E4X?QO5UK<(+(d-=pIW5-^yy;HTxyMde z%jy)5R2frC##(e%{x-AH96bWm{^k?X*rRYRk-yEy-A}Ct%~Uu^-1dvF8Q#b-d(*R+ z>hw=v*)K{GI&=99YFj#&8}?kL7Q(;Oq|zB}lNxu>$JBzV(;(lp){Z76OmgYwCQ{p5 zmlbZ!lKT~u-L-_MZ~zDN2g{nR&8WCUpQxKGkj4CEFN; z)7ds53F(Jj3EdS?uUXp9w7#m9HwGd4X;~&DAkn~?5Dh_6_&0~HtUX(?Q z)2p;k#sc#wnM&^=?;*ftVB8a)VQ8;Kb8E%PWlpTd!gGV=?o}wovMHXMM#PJa>Uevw zuwGCk;nyIOm@^pa8uV9`f&`)nw{t)fj?o^IkK4eBHu7X5QTOs#q-F=At3;l?yc+jh zK#L*};GWohsbRR`>Py z?7uxcI*=Qzm>|F)$m)O7fC&w3u z$Cn)=>WBHZf~Cyz5CH)6m5*?Qh$Nga+dgnof#c}C1fq0k{WdZAAB-lV9@Di>B5aaH zwbJ@k7*{Aa?P(VENM3`so?o00hNWsMFhjEo>O;|aQxqFYDpE_}*iflB^bE;f=9A?> zATuv=@Eo9>ZtWFx3pJnk4>ax(zcFQ#$57`Z(J4rQd041?4AqvHhzRUq75=Eg%!R`$ zX)rwPJhL%Q=Nsa_VFR^jWYR^b&rhnm}paJk7~VmIIxv*(8LToM4sR9qvd=P zvtdsRWovDT%%r#@&Gf?g=&N9sJa2uoRu8x}SG6rGbgFj)Ll#ea^(w1CY2TSJDyYeI zX>2X7D{n0Fvg0RBUD?+n;QI-uh3*t4X@Nl z1wi#ygAd0iaKQQ{fE93gd~w#^@1V)Hu2aq>62}ZGN?OC*(2XF@|-HbZk~1E)w77Egn8G!u;JKy#T`L4m7~K?NV~-BKD(8A^xFd+0Pv zuF+O8Qj2stPkOQNq0?>e(O2PAiV(VMe@h%DL=!v%QO3e7QUQ^mqdCIN&W1wG9JXw^ z9W6_<`^r5DFvrE@n*!*oA zHqj8|w2aUvUQ~k%)M{WayY1KK_yZ=rez)HSG4iN;a*W2mus{;&cgT}VVVIi8e>9oB zG*UsTawD^x{y5+afG6B-2eYYIR%GzYuZBikp}Ncq|ACT3+!_y{svtmD0QriUNy#qS z?@qgKFMnY_5N*?X+BrKsIXEZSiMdjCngf0mu83d&1(a%MeXblKL|po?MmM0hjEi*!8cNG0D18$VUpu+3-owM^p;KT3Q z|MTQbX=uC!CgXb*cz7%dBr7HQOjniALm|>+Gxlty^DT7jHp0t2Sdh2LFh>7FG~yAf z1y7?HV%FapQ8^bm#l;wgGsdk9Sw|thmg5)KC^)`>95h1#j@;egA?BwwCGNqyYbyai zxlEh*v>W_OK?igdTu2FFttbh`O@v_U#%fwI2ze+<`4cy^*X{jZJI4ovu>lkaQ){C=gGDzb7I@+a9;nXz}R*S6W*bDxvu(AjtBo$#oIXrWfv`eJK zVF$jvycC)+EM$<=Dw-cfY$+P>*2)&@K*}fZj*Xa|n8J@V)sExo>+=Iawns&3GDSqe zSQpTPE5mznVdI43H;$(=;8&V|!L=m^6UH8P4H`Kq+$U4zl`6f;X_zfKD-$Y;+$`vV z<>PfpzLd^|D8Ah{SsYVmS0t?r7Kq0yGRPIK@j>NgI-R`O+JXU_jq*AoT0-CJX?DFu z!J%*CEp|bi+)TEnwPs`cS)+b49SuWgB#e-e)GDa?_~fGVB9J1CLion}f-J#f4q6tl zQG!~t<+M;ta?LDVLR67u?+hc!Jg|7lAdA@VE3lk+bQSmewA(M^I3}ZUb`^5fwTIq% zMO*Bj9;PlR!f}aYTaqCjDMZk8oP+Rz%kOp608X%i6DWP61qNkk`d zmZ8T5gFA9f5Epfw_iv8czjWW6oc+50wzL1MZW0{O`O*aXFtN|jCcWH}U|Jo&cWwzE zIj4T-GoI3+xs~;!!`HZlKr!d*265!{i>7H3R7z5tM(sk^to~e$HF;N$?KG6k2+^aX zBq&|8k&tt%xH(gJMmz71_G@mnan6{3KZNQ5r=jK<#6xP>b!;iuK?1{)I=3Q>~ zUgRiDcabOf843$t1hs8n@JeMRqo}vEWSIp$ackRHa?@9`ytA_J2^Ke5*TTa5Q$!s0X&A!RnkR;*szOddJku9z!_=e(3DsQPLmV8jy)o#30QjM8tyQMc zUb#xCv9qc~t;c<;6ngQME0sDut5QCbt7?~4D)rv?pe}3A9O}}^QC7ROR;8j}xmuaS zs#czdMZHU_mBDIPtW)YYtvcyssE2ihiFBVTrQ*<;NM?=8s}y$)D_1I2i&mwq=~^<8 z%y8KRc_nY~q^vzx;TS+jZ>{bts&D8-dBV+%-6TxMFz41!CNzwLJTbR8ggTtrT`5}1 z%2w2KaVmsFsTVH1)V_3-j6fpe&?XJTwq=2Fu(W_X>a>q9Pc=E9G}gBD;Jh$~mMb6Q zis1rIfT7_c&`*(F!+c5swGcOfj6l#{jC17GKgU$(j*|S5FzXlr$kCRjI|Wg}Qx^2xN$Air*V}0lK2)!T6Dhq6TfSqGmM}bp zxdscOIAt*4D^N>WbP^#cOPe7`uU33*F(^!INTr1w`kPc4fI0mkybUhrvOFEPtUtEQDd+jZ`$G zj|uVu(XhjVqmFa>GV&w@crP-TTdEnsiy$_E0W;Jl;d2N$Pj%BxHr2P}Ya!w^z((22 z(mWkZYjnv_L$k$NGOcA~{x^!?D|2wOJroHDcA|Hu7YxN|ew0|pW#5U@=#QlaT{h9! zxXZ|9jVo$H{5cWgvn*F(t2Z->Ew_-@X&4J%Wql=ePob}lyk%yfGk2lRwZIS$8>Mp3 z!u>onXHHpk^^$^>U!?FW5#7x0;PTUDpl&N zBzXDUMQu6O{p3orrpct0wjk4)AGKvFs*#*J3Z}1aGsp-{+1Dzg+bTsf#%K$3+*5MA z{Louw7MYNwh4PQH`xO-&970WkikPukhzYX zy5iRx?oEJir!lpS7!_|UoOXA!Zj*3e`0@ZPY(Wx1N zPk~hz<2)5QEVv$nd&3GHQ6vEY>b+hq$C^wCYjQ70G^$9Ua7x)rfh1%#a+{<>v_-}c zUYM2f9g8TL3du1Ey-1H(^^!`XDdQiiF5zq`l!A@G4o-cYGp-~()0RE6in$D&n&l(T zqP_^|p+lt3b0=`RfR}^kTJ0g@X^-O^eNM+y?!JgYtLf?QtIFf?K`!2jl6bFr%*O6I z!lNGpLhukZxfzL|8q8TLksakuQ0#5I{R^#+Mra=VY=qh2@CXi8r5XH3FO>pG$MJPU zlp9b;Iu*xfy=q5Gar;DHKu!y zJB9`qfKXhHwT zI!Lk=lY)NB`RQ%|Ff{C3ST)lvP?3lVq!=#hkdF(hF$8xz^*t3^ssTFiH?Ipbn)nh$ zmnZ|3Txi~@R*w78C>YPM{6830ubqqXIHB&oPot|}YPxnk! zR+!0|%1=ux6zOobnmG#BTb+H+*pU)W5)^+gCnu&tV(QeYDrA+7k_)xJ0rf#3mJkS! z!r*BMSRPuS5(dl*MWeKU65Lj4@ElrN2d47#5<7dLov+C6XckvHL`lb5S10KJ>N#3T zajZRM!z+(I^Re}g+is)0`SUg1TlPiAE<>l_J9=3iaHfmtLCY7T;?7-MiBn?V`^#bBK*ukY*XtjfiW2q;hWk~F5iwhIX zPzy9$-xUXq?f-0(ZXcKc&W6|G)*e^_p^{jk*W0Xl1VwefrZT3r*_sK6pw~vKUMX-T5QCbsV2?;HVnKnKf|$ffLGehNw}^~&#skqo zZsTAb{Q+u}nju%oLl41OgPY_UnS)?TNzA}sm~gW!W5eN0}}noat_#gzRV?GLModiy7RbQ>mSg5KyrMLqz3AF;a!IlNDLAEHt>~ z!9XL-#|x$2@{I*2DUOC`&aD~96xe1na)+o%MCC)}9NSde!zLEJ2Xso{G)RF+JSqi@ zQ+&(Ddni9KayjTVN$Vgw{Bk zE}kAjF9oO7O*+(b9(UY@s3B6?MD>@ZZQqw2<(1w;(VN>KJT3>o@%w_SOtQ2W=Xmob zrWBs@Wt)Rn1&o(4EL1OMN|)7k#R0Wb>)~UzZ!x^c`5tt3b3sv#b3=MM}^rdp3WvUA+D*^ALrl`^^ zaBX}4Q2I8?p~6{83nRr!A{8W_wiBgBTDYT_&`c|BDoS!unkj2t=vs}XQ8F&&8;miB z#U7*IsBNZL)%|xGRqWrk*~rA`pSj|mBeonPCm}s*sxIF?ObQweR=%Tra6kk-^lTDR z`Xo~7+Nr$P)0HmWHGJb!wsH7%o~vyilD3MQEF`Osaq=xb#=r z807{S+94(=q}pA;LpH;EOF|paHS$sC;^g4ug+RiK$AqUw03-^404rlthMQ;tY%ynk z|NCq-5zy0!0rK-|zQGHy42#j@IN+YqVh$}&%MGh{0=OAB$R@eV?~)(DG?P!ZmaLpT z-HR2ivM?7c!nI|qFEPyYQRA^_$%T%mxEKYTJ3@fFx(gzTM?MaO6tmLUtAm(5@Fo%g z*HvmGAVyaTm!2V&_68EC5M$XUI`*|eCk!2X6Nj}|5vhi_=9Zt5n9yEagBb7C(5goJ zOXIDYa{eaQY#qz>a|}DhP%JqNU?}!Y9B%lIxRZokgxPRvSNV<(5|DXcpG*S%=+G|I zq(#tC^o6}|9g9=b^V}OZ%JD)kDkqXwK~hY~19?w-BdeJye4SnY<~1YE8g!3|N=A#4 zjGUJ2v4TeZ$p*^Rco6uXm+wx4JVw)uJTUxYSUjGPnTFhwM{zW!!WKsv7j3K={?;$; zbDvfDMo@pU0ApG~m1@`QO~+~5blNJ&ttP;zovjQ9Rnveq*FerWPs6G-R0A28PP%g>U_%}mdN*l;xGjTVeRur@?E)G;B_T+qc%06zZ>l=0VJim%jdxq| zXo9wdeTD;)fWm0as&mOs;EY%EqmD4?G`^Grv1i2b=6V)oXt5agbrFOD-Rs3tTT0e5 zd5oyt*u*-Ojb!0C3IkfVnOLQ|7>N~iGXp^|PNsBMo?~}te)dyV9SUtr4HqgrWflRj zkF&9e)^)MUYhuPMLf#%$Sb1+`jIrs31;j+dG-snnG7g8-Ou{x}t{ z+?r?QmM)hHWqDc9jG#|9eR@HKhl>_b=m1cN)xbesY0M=QTgl=oqAJ+P3VuL^#p}yh zgd{Es@sKx&5d{qsaPOM+a}9F(XxT&tarEwduzBl|s__^wfLBmvAYsY@eqi9hv;ina z$NFP6CgMMx3%b5CawGD&dUz!%zp3{f_`TBbJ8?IK(7}YOTfu%6`GxF}Zx(7`AW`j=Y@=DV3JXOkWSc|t((d>Y0n5JHlw15q+(d#>&cVzz|DZYSe!0FnvJPBFz@d2V4R59<7DY0c)hwi zwQMUrPb^r3>B^TWW@Sr4J8+z| z2P^Gi=^deMP*#C9n z<)Z{;K_SEf#*$4#R%~z(T?x#I+pZD~3SzpZ5~~(cj3M3w5@A?PrH(ePFio&cQ~L2m zq>zG{6P_Zp>nBA9HZL7lRfvp;yvS-8{JA!pn3Wa1%VY%Tl6aM+aiB%^1!16(+>>+) zOD>6q6lK&7X6`+`nAlQhm&e`XlMn5~3lwLi*)B$$(zg2WR73^~7qE6Uvz+)KR;&~U zCc<^PlwP4Y1&6lcd(Y8|oIc^yM45klXQ+jl5D89IU}sD|LAX^& z;#GY;oG66~l_|Va@E<;-2f-nx7)!eJBE9C(EEzg#+2B`DOlY=$nz}i@t}Q?KNaG@{ zF@A7IJl7vJ|NZVmyW<-Kgh)>DpgxSJ5~C0!jbTKaTn4lkrC!B&cU}ZCTs)D)R;WsO zSuA1EyecGa6*_>tm=_1iG}C#?0xF_`A{#{EJBR)aK*|t`ta(g3yT@6~E zWa2Ut%~4?GKn}wwmex@f?`uU#BB@&-Y2Uash8EA$l;RZPU0Cl%oeN~}G3+-lVgOq} zq`#0y#>r?lDl~CK2Ap`PPsAZ#$3tgrrv&_~J9+OpO7i##4OuouI#)3QRAJr*Kd+GH zguI_k_VnqkF#eK6oqnzAksvhyHX8_dQeA^|0+#Cq_7EEOEmBWX#k zgyf0yXwItG9OG@mr@R-BBiO>LYd0~`HJVPv-3E4X7?Ex#fVs)yooo}`p(L<3;q0S^ zWwUWEMEf;T=W?Sl1K)+(DU;DC?k8}TL9(G$Kz(g7jk7y3x8_+iF=LC&CakQI4dbwO z{WaWDlQA&U2^`#TNT3t2E#fr%F&A5z7@pi1pP)GV#{D%YlTp}nY#vGPR&Y&LXXe~f zqW6zzJx7(`2`I-MeoZx!=_cBs3C9LV>2OGEVj?f=$T=q0RHS@sl#dN6aQ}rlo!`W; zf396nm}~65jKNA4?-lR~Qs^1Zm^G zn3MEXgf>HojF$o&Xv7sO1+=ARh}&-tdWi0BYV{@KHPV}!OaYh`Ec7pEsl%5gH>Bk1 zp%QbHQp8FeO};saU{%K?n1K{NqC?tG|*!)V}#M<}21t%ck0!lh(W!Hosbzt)&5%p8e6k=+Sh31> z=yW`vjp7B_r5)uMap`aE+Zli93k*$^enb?v$jn5UW}_{nHa`2A*WHTI!N0XzIGL5B zDQXSQ7$}tyM9wH0N7pf%M$Hf*PaSZ09m;gWczg|#Z<4bRCoC}>=bAYt?M8hV(+@`k z9oDZRk`f5LBjK9`zZgIQhJzANEOol@+M};D#3d#7<6&vZf`iZ}$KuteIuccKoh3KI zX0wXGKxJM_BGY5h6f>i=6q1L8YA}G!3K589KtMd7+;-8NBI|nGn6%}voy5hm^TEyi zp|-vi;p5OPLWgjWJ@vVaf8{YFyBu%B1ol92l|qZVToYA5p3|!Ic~{k?Q3c(Blznt< z$x9sNRiC>dddeGpR&j!AugW{$^*YQ84zK*Qo1JNV z4fZ_X5BT4gI=nqAti|sa5`#e}eWf8eL{k2(k`}-`(Dz@u>=&mZCRZ39+;j$+;C)0O zE!aI&9!M~qgjBmH(u)?DK%_pBQLX8uKra_8#Hpk4eIPgdxD%;O7=hL`FNtB=XK#~1 z-#6KXWL9+3v*L%8n3So82w9eu7#dlQz~mHy+&#)j;OBKT6t_8}DE|yaJwnzaB*n+U ze_`k09Qo$pyu-m(F$~`U|N3xtc+nAPhhB5BRa%m2a5Qd|!0HtJ>he=%(5HHoM&0l3 zX-#I~8iq$ujnPDq&NvM#?c+BGRffW=N-RC1;u)zo%Ey%d7J(5+cu73y0cZR9PP5H zaUBbji3+F|X3hO3h6GKp`Kv_g@Z)+tgr8ba7{&p@Hxy=@ysWl}WMN}fpq*M+N(wsB zDF?bzW~J~OgzFqZy7~Fn+fLO+c_a>I<5l{Y8IDH6z;!MNij^5*UZGVNEZvo$Y&bax zFlu7sYgkDZ(Z}lq&%(BevLYBFNZjj^0B$?*Y(On%Pxxii&|*>Lv+z4{DL*k-7}k;) z%aFPpam{{zin(LXMKY$Zq#2i8tLgc=R(co{O?p|Fy6Rx|$C~X4qUzMnq95JNpY-93 zCC@U<79po?^uP9L7~9j(>y~O($>2EjL_Q2_}%^tLC8hFq%ja z6KM7Iz1q0At9}`PpBG2RI*R%FYq(X}PTywtJR6QxeEHx@HIyE7L>y%^gjEJ!!w$;1 zSR7M0#)*-6QM7|;Ex_CHPE7-W!QNa=q@8cHzm`UdQ;|V1G)TC%AR>qzz{T&>e@}=0 za%cWh=<_1oyaIp%3^F!%nq`9-9kCSumLR>B|KOROQZ=8F2TcP z3d6*7b+Mv6lPOsk?ffRfg$=CZ-7OdOW+hpp2#vDBy8J&&;xN+}UT$}n>l2qS-4=ui{Ll{*&BAa$ETc00NYd}&*7kXeA?Q~2uarC$q< zfah&E9-d#c&o0(}2*`XdHr^rlwS6;cgDke@OIWr0Gzg*{Y>&u0 zguvK-rL+a&#Y+jgZE6f0Wa?s&4p{@KDTLWmG@T;%BpV*It3rSFIFlyY`Fho~GkByB zy>(OQ(tu1>{`@mo_Bb&fji^NzXw`&d$WTw97+Yl;_gk&6#1 zN?TB=!Db}_-@>k14bI;j!2CEShmqhfViUf zY8c|4kQzRc>oCxQXRfE1=Ma$93Bf;b=TUp^375E7hrQR zV(;4Lzm{9IIZVOVt-_pFiF}j3Wa?iYtI2OT?a>l!SUgvgVOV8za0(tlw7IyIFXt_?RU`=R50#R#$0&En7WDyHy zUJ^%bne1sr?O^jq@}9|O6NEL>0TV=s4H>pe3XZ zL0BDYtMreJOMZ(Jl~Mn{kr6$h@Ap2-x@WwL_Jx|Rj%@G)1{=ZWA%b7vqc}9ub0w-? zg+Z4$PPuZ2(jhVt%`MmIvVht^jm0`QK4B-D|hXvFD-A3^fduU zz7cE-4-kwQI~TxQz+})$Fqpucr{KEm!lWE}(f^vz1%p?wg69l{COSoSzf?!}_2nC! z6NNamf)s3E98wcDgX8wQ4vPKZ0$g|s=uOK|@7M5Ifx*MPoa6CIRscyk0%1@Y!I{62u==LPIpoufDW;@!!6`|*GSN-p@Lg!^y`y6BjN z>hca?F`T?JpD#{UDDvP0R?nN0qob1#A}`2q-S)wO6^eH5JGMv}7$`W%gM5&;EI7S6 zIv1gbx`;bTXT_^Hm}U|A`CQ#eI*VCPZ-VOyn|Ok4Qi}!W&}XP@ENs`Q zPC_mrr+M<0%cod1A&r^kF*<9?A7D1V+^#>ZZ$GJOkcx4djnGU3y`JK6@6I_wKY~fI z{dD_@mN$S@w2JEDj@}L>;KmLp@QwmL@FPLoikx?_?+@~Vv+`r$r0~8z=uYn@WTD>p z(%gBrLnrq5c2GbFku%`Wz|FSXXgnpB6ix4uslU5Rz%F?|y+>W0H&1qiv-|ee&g%J| zZC_Cve;*9;?bWkAfAW0y$@2ka&7#qLsPbfI_vw?}-I!+f^gcOvnwWPt;`ZJn<4?`) zou|)tsLHEpcCXfMLt}s9;m_g(#HxD`x6y2DH-Gwx#&bHF+^gQ_K&74CZOr-*;@NX?7@IP9-trT4I}1Enb}nlRVSIsO_uHdf_{>L9G7Ny zy#1mn?raj=BxrAEvcqvYjU}cB0_;j0-XCDlRTe6 zBg{gPl}2OqzDs%u(UTIfAa6MqRkYF*gw{q5E&ipI>UIZI3mK%?lyjU z>Ob?rW|DEUKVqU!*4b*B^(J>gh54#1&IZj*7e-4+gc&Q0qp@)=+w<2-x8sV_UzibE zl6c_?0CJNr;%-o{H^^OP54)N5ZZg@=AGdxiW}vNx(j)v8<=Z2&6=5-o!NkbgX`c5*bDPJKJ%pia({9+5=-W6{V5=;xRf@E2-M=oAl%cK~J@Hy#@< z;;j}o!w*Nnyz4}OM|T}-tX5e}Ei9)T3th}Z5ygX_Laf>h2yzg@no4T%D*t zUSx6cS-K7K1Moz%rLFR6HV8fz^$wpTb4v%g{E4E+9&(7jVg-;JFDh9>0T0qE0v7<} zv9&dy&+D^1zpf|aeiDtN zItZy-H*m6m19&prf~sd~tiT@_{KT6z{PLdUr5aC#} z-FVvksjwS~6TAwqZ1xg;6p65K3PEi>c2-7LVP#dHWHP?ZN0G#ME3f=be=SL6yccW| zJCJ$*G_$C^+`7&Xrk&{Ur8L;$omnnHOZ!~ls3+=1(g;*b(-?hvq-}#uo`K{9EQB~C zEp9etI+I*lfy7^n3M9kCfRcoU0j;(QfKRk?X-QWDvFcotfTB47=PTL*`0M~Mt(m}e z3iPZ2O;jU(w<8-_{r3q&J~7X9VzS!C*g6KOz6;g)7K@2jPU{CzaP2P$B$kxnN)!$kM{h#0svTJnW0O_-ajBV@QE_6>I2LeRWFiU+iBp|NzL{H}Vc@y51Y zaKgD)RmCZ|P=GKlj;uQ(eJ^o@U9U{+YoQ5903l?iYgd0_x=zw5xf;V8ddgF*c+~RR z7K+leMi@Por_(Id97epUgLsG>>$5zWYrV3YqBLJ~@iFI~cS+Le+PlCil?rPvV5y;~ z%694LK&27x9zwtpFZ~r0 z-?`~{$n13V&P_N=`h|Mooty01lkB>fETazF$uduGY1eep;X5~7M95HfI(k>2izng8 zm$2ta*b@muQ<*E{e+i%$Tw*w}Qo`ez0SA}Qb>q%jLnK3!3T8e~55uUYy?Uax=GfSl`CO`h8wiM5e?ed-GkK(Q)RY0B~u%2DX z#TWCfK)QLOd+03c#kk0<4NJ0S8w|>eRmRdCvRP9`bNOnvGGl$9!*3azaa@9cI~VWk z*+AR&8Zz_j74yhyndu4{S)Y|Hh73pNdi8!Adg#UUFe-3>MM}&A#Po12AboSsKaUo~ zGh0bYC>KG?4Rw~<*@&UG4gSie)Zb`jQ$7IB`nBEPN~Nbl1i6A7<#nKRN8tgkC=2lN z6vzW2-W8xy5Iyf(F6<%%&BB)Z-I+Ewv0doiW5Op1Ce0sVH)ySCcIi$_<>14vP>vU! z>UfoK0Bw{eem9D~IBz9*WVuIO;3-XbFp<$FN?NV8g;s;kVA+@)Wn=ZP=zX@75}pLL zns3-Ysd1K-EG|1VK#uebDXb)RU^AxD*Hssn6Gcn;eR15XqC>9;tMx5c*?mkYH#d!_ zTt1&tvyCeJmJY;4o~33`uJQ#S^9CPvdSm7nf5+2 zRuasyATFcVzv66_-M8ned|RtYvJ~g3C+D}GrJZ-LI|mDa6fnSCznjk~w1^r4dg~nm z8PyaW_@{KaZNb;J+&eKYKS_)CVoB;((#X1nmPR}pYMLZ1sA(t>6qkk;s0aZkgbH4v zc$VWOA_-+*Fh8uPk_TJeRUBCScwomx?y}y?&!I7Wu?Yfh0sA24tWZS{`fT-TgxJz& z@j@s>Gd}igtif|FnwSpZU%lZ&izLH~44YnbwXs3(=MSV6XD%ZZ$B&d;Q>+2U4}1v? zMHE~+?Bojc`RY`<$h|yh_|{T?=u9t`Z1KN-V%gF#RD>_Ax*TrcY+&Ww;Gr8>31Pjs z3*=WL5W=w`eGb=%c7Xhh0d3Z+GCouAST&ix$VdWtP*GU))R2GG`s_+d8(za-VWFoDS*uP?R8tuYI z*(kA;Wi9krsDc)ssTA1SkdxFH5}M6%)tK>wJMz~wDb7k?HogB=dBeDar9XFGIOAsP zKlHFI95q?`qS5$E0*6_xB)T&TOcwv&CKJoR(j_7>w~qG-5k;DDQ)M{ma&efl1Rq7p z`v}8&gjOKazoIBCx^7Ft;$^KSC{mPzi`l;UVeP2XKE6CH9M>=+{A^M@u<`r<&LbPQ zV9}vXwy_$BpSk+QM>kc(!o!=$3&%H=-k!7QY#{1VKCu#pg2HTl=IFs$Jm_)2B=(M_ zZCirvxH|DAr$RL@_PKDuu>5_?p`e+*$5Bxc+c_+%_i$WP!{9kE`tpD4wbDNS?Rei^ zDN%kmE@JJ`+i$u`&{G_bXVPw_1kvJti;0@KU@3`iz%s!fx%ihBk<7Yi32`nM6Or~l zEML;qn&;(Y{nx}v6WzC_w0v8uNwO5DvnS_Yp3E*~RqU1}l+_cj+0yflVrD5}iHnr6 z9L%Nj&7t~*xd${EgNLefTpA>)>6IZOQq#3|WdkJSigEm_iij3bb{(oz_yjF)*{Tby z#5hvgwFevcU(d;Md9^@J%v*cayRurK-cxG|vacjKr_sW%=jxA>OjVLW7Q=wyTb?A? zDb+Bh#8+?Mk+{q4wtbW_Os3U))2PVSLD(q`m6bUL&@=ujDi8h)yirRm3Y2$kntDv6 z{+8ZNzfJEF**m$qsU3!o3!c;QUpdl7Ja`UuUR`0fS~J&W5G&IL15+a=L9c)xAkr8V z!G#f^06@z_EeT|T#=_t;v7|&b&@`=R3C2Z=P=#UL) z*_?!yqZFF@P{4%XW1_sEhGkw*b96$P4`s9{?f#DC^Ro%mvgm2wGs>wy?XxiNJ1ntE3XUM58FQB$Pol*A@`z z@WiE%MIVfoIv?83xHJ#uV<%9UJJksMnr9nXzd4i5g|>&eSE~iDnJ{OHh3=(?PWjmax? zUQib8lZzk4K4RpTN!h?IEk@VGRr97HB&9thed{uRx^HuB^^c3e6e|M*qvfxnF zOAt=ahGLLTn|D~$Gwwqia87q(a&xMIRnW5dwN9Tnc&yzcdDFj$oRqJs%maKC+wjmu z21TF!8@)hUrbvPQ&0gUl-haC<FRrZu8%Q#@|7J86FFvDf62+9xh0??7Q2! z|3m(^Hr9fTfM!52=D;oO(?g2v8)xtdzwW1#yDYiBfx~kz47Op&YTJ$NM({4mdO>>_ ze~HGBI5>)LM$vd2yrk0pN8Y;`rP-w3k6&RSZNw(QLJ-CxkF(pjUl-+{#eF!SX35oz z(3=s_f+4AbJe_5|nBH6^>#oNR4;QZvx z#RrhG0{DG;cJlu40QR=mzrn{&(7wEQdvX^1um9CPhtEI$2nU1%`2TM~=N}-Oou3Er z@$emNU!4Oi4~jW!A731H&a1)U@&3^zhD@#ouP-kGID`jBhwlzApzsSg*J9}+r;#l< zc@x0-h-TRSTX@%geRu>rBh~xn@ZuQj1o1j(2Ot<;9PVEpwa6=O1BS@rD-QS=9JJrHe}Vo~7Lx%B1Dfw&o^{?~3!(exm#@z+ z4lgb*I>9d|CkI60^Um4(!~M>AD>yniCn8;*gH(LbzGze3Py`U?yoJSKw=T~QiBjaU zb#{4rad>hZ25(P303D#EZODBOBq)w2prole0=g7#zL{+6V8U44Q5tJ&gVNp_nH`!2P#^{&JqThZGM8Iq&eU%1)N) zcuE>=Sc$YO5o8b+&>b4DQRMm=F-NEB9o=SW{gD%WsIaJVO7%}4= zX)ec{77M{N%oUC73SbSY5M5J*>!;L1syUV{*R8rr<`cbSl5m9TJJtOKeaC|0gxVsh zkY=j>wLoaG31}LQ1aG?vznPyD;6S%G8P0P2zXc?)e|lQ^5(Z!RRBoiAIKPc%v$1nz zU{@OoZRjyVIZmcBdWAQYI;0md47h6RmChwH=}#AL&rUvA^=~1GWUE%atR`P z(%z5c5mkXCjj$x^`|H6U;di)8P|ayzr0fZBjH_gbHkyb(tw(78a;I_$Di{ENf4lJ_XJq;J2)P9@r>N<+T@p+5YM*f9UwEsz!)VPfLtepMjmw7 zVzFXm58)giG(%qo++s>HY={0Dj^7;q;?1z@&47|{Ne$1v89uZx_F+>xFJ@>y^=5e8 z-v708eBjBjySjeibm+rbOGO4OGgsvtr%vJ0YD{(?5`f~=BE1%*|f@u4^a zd_}oxZL>7zn{U8r%ys}^Ny z$jzdR_bYeNw$`*dX?A z1CXNCiTkbQ1?I`-tarl&NjppTRLj3Ag#hk;&pr3-=XLMg8;HIH`UaQP^wL=|&ilPt za$R8JO*_Jv8n}LlOjoGOoEwD&P-tLj3P2Xs6F+gEWCpGM6SYy>$ znoz^w>k2zikHEUu^=< zj-DUFZuQ?z zw07Dn`&l)3=XWQ%0iQDX8te9&Ef0Md_5mUQkJwj~ig9Hsq+dJ={%fAkurpq}j z&SWM5)0syDR3lONNm}uWx#k1+9HQ>G!=#aPZ7QG>YP7;GRbWH00pR&Qs!b?Xw8@iu zF)A>mg0%Ga)8q4_SWA1cme>fsp{d^S$@6DtN9SQvU-B$W&U6wNn&ca7x0nR8kvVoa zNm7pJ2PIknY}-5-lQz^CquKhbW=Dl3)fe-4_&Z2Y&17$P6|&+_Zc!VwX+^@aFSs*)wd zJxqIdm2wWYc_p?7ws*Bv@R~pigifQ)LZWo@V>qnaR=FC4{}rU~|Yfx}p)+tiTFampija|X1#SACbY;T`1;@Bm+sV7fE{ zR9?r^)00yV4}K|{bfPNAt7dVPO(-8vS)y98-=8xrihd}Z%*efMFeqPtUI7CETbH37 z4=V_a|6xZ0Sd5AaAxadeD`cxLPhN$hRd^*P*$CbHQC|OBx-bDy{mSMw*(|l|M&H61 z&{Y{aTkJ<P&!fkjdfCx`R;i`RDODVsEITkfLKePmIi~$E*X%uhUufn6xCQ@&LGe zm#~I^%(?JzXo9KerPWrW+Zk)OZ<4X9>Y-YUO>8B*No!mn2SJ0=^INZ3<>M)A!!FIzxEa$zU^cP8%-E)6EbY@y zsH>1S`MUno+sV#aV-|A|>7cTGT5*yH&@tsxR4$I#0j{{?lT(s#XCtWgnW|`7VS#pY zT{=`6)nnfiXI!PCbaZiJaF9hz$5`s${_WrXuMO9wbDxPEI*Cxx`7U#h7pRRfC?sVB z!(zzz1y?p-4Ejt2e|jx!L}t)?aeQ{}O~Zam%zOG^v6JscV?ySy=n3h+^?I^yW+}8R ze6-s-rlLbY1Xc+XXT$kZ+*Diy|7V<`+~DtEwQcHkplIf)UwI?Trsk!Tmp^ zds@q2474}yK&X&E8hZ5y4T)lE2SdV5^oE3mf+6869+E212xSik4o(rKgsdcr(r{1o z%%;11<5}*-Fj&zs=SAb<>3=T2xhj0apb#grJim(Q!E+rDdWKrYmQLZ_c0AXJz=c=(O~zYn+)D2qwpFKhEUb zk2X6 zV#1+D*NYozglqn6U>hIj;}D3sP-Lv|p?@`^BWVVQMAstCXUNv7#ZTqTYMR$4z=M(WysgNZeNA1nH|iyQB27+OOROa3Lt@w!)L@o574QPm9b|2Cb6(3Ru7BG!w{ zk&LA%vv(wa_VhWydYU9APAZLk)s6;bN%jzyGbE6;djN`$vMu0bLwNXOv_q> zZj^w;VH+B2hHUuQ-tYo45GIR|0?nvEprBt&s+s0cg)#2?KoX`MS@M~3k+`2tvP|l5 z!BTFMH+aa;?|zy0U64D>Y z>2Vr&VMIkHn-il6IOv9ojq-POYCr{C@hgUX&tlWkP;P?7`RSu4$3#HW++4JXVzdUN zm-XMpMo1spiaOx;zS=LDG$YAnM$5$Gm6hhezQSFx083$mB}C-jNMcSSeGbP<^0w%3 zv2JX%6yS~ri$7&0?chRKAORT-e~>}z#Z6=sDzb~O8;5C%t{i{Twd1D-PkQK3C1M<* z5Cv$CM0HZ-1GHLY+{+_u-U4%MohI`r=mVj{P%F;i zJuO1|+-T;GPmEg5(SMy-0}ChcO-*CzpjX>sXmQnOaJB12R8()!{RY&{u*=Zy3}HT@ zJu(PByab}93_)i|v{)&M>Pm>sn{-f$P7J|y)6yhv>@)?rT4Nu~)-HD}u90Uzq+b++ z8v?s3@gpx4zWggZMJ%G9G-r49(t#O==xCn5IQ*`6_~zWITt!I;|K4=e5bx(X>Uq$MLtwBK!Nl4G)7_!NAUKSHF7joOceG?tt0Vm3J+Hew#GfeR6OI1SR%IQ?05YUlVp50%f{20x}OMv+@Ly^R)H;kE?PvI8Xk&3>^PfU6$1toW&(}1_|=<#93G!Il^*Q4^E<@AKo7dRUu}g|k5As5qGO#? z^-Hg6Ui9W@Oxj5vc6V#l4`p+l>d&9cE(1gIZc;2Ji3!pkRA%6IDx-mofF)EO&gsOv zwLdr!Z>$}XYy8BLRL#`g8>j!oxDk|Q+moj)tpwO1UdgL9pWuljjXhtMEN{vNPE`68 z9fwVn8K4-zri0(oNHjeDs>xUZhEN?VyCuYd(;iWJ5!=8Z15&9jz2tI?_F2U*N|ZBX zWk^+rk@ffjFlMKWAv=^#wPIep%%~vg36E#Sx=$Pp$w3gWQHmBh&c;Q_D#ha=Trd(D zwMzaY18#+gTrT1XIkX*4+lqepB^n{H+7{4NNuJuMU`$~=B+8x^=p33u%^PMd=d8U= z`|3WOoI96yUa<>cbyLAjpi?r_W_@IIwX<1IhNm!^Y_e?v|DMh;Vt!fVUHyU*TW{16~vJr6j9Wu)4BpLpv zhhoY0(s@C%&?3bFa!f8<+1a?dTsohak@rT-{55BYBm012A{kPdU9LT6Pt% zj`WBYff$FhlGLne1;jNn;|Z*7P7Iiw_$ zJd7zs6a>fKIDNC@0E5M#KpO=H4g(vj_twzxAG@!OXc;ck$c*>ZBr;ia%kHcz791u- z1aagnJmeh2szfB3Tg~Rgpg49d{stiBl=6&mVTCdgE6n>S7evDs@zjmax18aW_gy$J z-#2tU;&5mIOB>-`M?<74S!8)RU<;uJpgL@eXqfMvT;v1Udtlsk^H+f8(t&XbbUu5O zJe*DN^S+q3ks?dL((z>J0E||J3~DGAE*@fQK(7Rh+91P_%5~9n$hrFvrx_68^e^yX zFsE<=v&;+sj|vCeP>Lduvdai?M8sgtd|7Y=adHvI%^hU|m}8)9tj8&{M>nQ{lo$um z9~&0paeL`Hn5<5(KZd;16hsXtP(Qurbul5=H1`_Kh1?RANiF=d!6qR8EjK(HfC z;UQxl+$xkz@P%a{`#VM8btInVv>8W-O3#|)^osQ=G$>D2lrZ0>m?}`>k2SZv{ zWpJ?U2}UwO)@F|w8nLX$_{N*YSY8-x1TMIZ-X&Ln(4w7xdwO*E*WS}ZX!C`UM$9KL zfceDc;?Q#9e4xXWA{@fnEqAC)@m}JTL%`wNZ*7LlO^c>MyX!YYoPFS#J2i0;Y&~aA zk-LQ}qxe7+W#-JWfohoz?{RvPh#4~AnKC1<$a;bkRk(Ep{8h>eZL;nYiAJad*anuh zix&jqsH>D(8x@nwZCH>ALcEHC@jE9~!4X};MM7vVC0;_4t^hbu$`vIfNUbU@b*SR7 z)fVJTk+bPNM>oMQqUyrKI7JW8MtU39B#9!ySZSN$<#nBf!0`i-4hSVDVY)I99Wvt( zjt?yg)GM=N0)**0kmyM@V9r|Oy(p{)G0;YtC7f`-~~R+tIW@-=ccYIrZ+yk-QxFFOhTYwa0IiHFmxsj{HNaR4| zV%8M3&2Td&_*NTDVhf-%U>?`-GYX>z{Ehy(rX)~oN+DfE0ZmV~! z{G6FyOG&L{FcMg{r(0WOH%9&dVHhlCqJlzvT>a{)N51bpylVL<+k#*od-u0YQf5ng7%zonb z>URp`#2$x(UbI)I)8PO+go4mseHc>pS9c7J{hE9z*fmjYy$%~UYwz4|Xv^;GAEvEp zaaA)OZUR4OV~rzF^8g)0F|2x>98LfXgdoYCIomj6yI9P0XYMTY0>rA$KpeAX8V>Z83 zo9BR8C$y_{b_J^`%j0h;_l5ST*cld#ucxW3Ul%yM?Y(ALri9NlfOccRjR}hTZV;mp zwSW?8xbOiK<|qu<{%7$n3($*6KHJ#xCpAmT{-wkHq-G`8ufQ}S;sA+wU`>b`p_&Ue zE-fc%{oR+=q`drnmsV}DevhRMkfptA0AY62E7f0HlQ4=ge+%d;SXn186}<;M3V+mF zbp@hyx+RP!xU#*vPbcvdcT4r*ztX}Q2-4{supi+_M3L#>mKiF1uR({ys9h4tIOuJY7Yf3uj)wBc{zsz zk!XAEjtr(YhlA>`K*GOavlNN1TtUIgpSoENR$tW>W9m=eEQ9Hz9eI#m8Qa%}OQE#` zY|2`EK$~s4JC5egaW_XH9C--=m*cV8eH-k|8y9mTjd#@=ZX(NsA8CA?bO#uqWHF`G~_NT{t6X(>?+L1V;djr|#iMZzO>ol{uFVj=>Gt74iB z=cx9C`o$DF1$f~YLl_`nf)2B3RZPe>2W?aVGn8JaI5QX{K!}39fj(R$EY?XZFgJs* z59d)}_Dt_pI|1Kt%&fu~Fv_vg5B1|DwP8-iTS&c*P?~w8IuVh@*cRD7n3~jx@Qsa% zFM2-vOSIj(-iz$FNmp)^6+nFyPW!3Y3aH-JD6AOVu^vwP?9~lKTX1vjdM#+i=ru;+WawV24LO%| zB183)AEOq~h{6)a{lAmg@A)KFqUo^kSkp_){|7b*7_j)DCAu8^+UKN9nqNMc0eC zZ-d61^+F%9^_HBQP(=0{nn-8sHBp$eugw8ZI0W=W21>mh4yqCU%b6LyHvgsaiR zsA2*hr*jy^ziz!FZCatBuF=Y}B&unBBMIouq)i7D<$@ijyWXd(+#;ki5x8E-mWEalGIEd+bqXJYsf?cck+jQ zNe5qVN(?Up8^}bOvIdgS6n|)LN=?v>sW)4p{}QzU7pI6dnj=hx6AGI%A0o|tUbkK| zVVI?#&=iGjY{(8p?K*yOZ27H$n;7Y9S1a2T1GY$;*0gO&o1wKDwJ9cRrp=f!ThOL) z68_vxkCr6$7zu1lXA)Bc_AHXz>_dCwHr4aLdj97gxzBa`e{TNgy$8ErJPh(bKis>& zbDRJ9&(8l$+mC^~NdAEmY;iSd%mdwlKVRaXui($_4*uE2KacPae%<}*HcRwvmgw6o z(YINmZ?i<-W{JMd68$fnC7LOTOMxmFNLER}9il5tu7S4D85OiXnNbX8)cZnr0}1X) z7YT-Tm~~OjX@Yxa7#eO~$wk6p{VC426L%P!l4S!p!f+lL`^sUA2{eo^5JaWq+* zLUUZSd3q?Hq8<;QJxe}2NM4>ilRyC#x%JTn3&eSuY7C4j8O&LguZa&3K&mVoR|?qd z6bNUPoO5RBB`2HcbDwba+jvqEWPrHpf)kUW8+gCWr?Uc%MGM#b9eQJHZ=-yiYxop7 z%-mXmo`xKMqbiK?CxyadaLD_*Vz}=D_DBHG=mrW9>K21O=Nx7VbA@0|I*ReZ>paHk zg`<_`ZEO%sv)1m4UTHbnQ8mlVBgFf{^Cs8yy^X;MtK z=ac;XO`F#vH8EE*od!`ol_!=&w8x+UD05mOdCg}|+%zvUCAHFojRRO0t$z20FmG`@ zsK?3I2YcN|-MvQ~t_D+iB;U}h`+E#$Lm5u5KO2b*0?*LV>!Z_`PF4>NQlE|%=}pC5 z>x}~-Nci&(g)kr*_72A>DaP!fkElYOZJ5SWoRJf(5_T`d9R_wQzntiqsQ^(xuD^IQ zGlrTJ<0K?Api9XE7FK;=Ojc-V%|y&mAX~6vJTA}&9^f3~G2;!%l&AnVg{?)I78Ia% zCe@q_$;j1}0%BYDB5rb2R1z56pb+x0O)iTGwGo1z$>-r_4P`$1>KiXF#1RIe>hT6( zcB73AN#IA*uY%9pVb&tDIKVd_3ilJ%&Ld2*Tx|s0aW@T!oBN zQnI93lm%+o9Zc+OP&J*CjX2j*Qx};Qt)tVP0az0ClZLpXumjB^F3o3T%GA*TaBYkh zR8diy14WJCup4-H7-VBo_i?8bCViN+KBGm)^T{WP7E=~BIe_l){`hG)c-zf*t&`e2 zC^o_E;b?=^Ov428eaU%GQ5tF3rDQ$@zBIYNN8#`~X7UF;_gWjx7zwYnBui;?BH^lliX~oKIZMma|5hh=Mjrr*JxfeMvl&TBn#7xmdWX(cZJNglhwBAu(j-xzze)!}va+{Fy%C=1g?27G#$N zM}jX#hS5R6@%V}9XTpZI5C8eFhW{=LtdjM6xD7NwQ?6k}nr3R6)XCy+loeB)j1|*9 z`p5BEWZL{*t`j(0ggo$IQfzth`~bAVH=jMceD1`?#?1YmIpXgCk7p8HGOs*JfC%Jl zk#KfR?=-_XM&iNCEvRc{j_N`3yR9z3)$g^scqK#@cjZ+rafOIDz=bM+WSJBf7sx-k z>uM1$BFFiJLWT)ZRWRw+wG|?m%fG$MLXj8v00)M_#rYmWSsJ_Q5&M-hbb|H#PDuM>3ZJdM-$-gAF~UbDNMpqbvJKuh@czSEK0X7ZEY z#@5zbSdihsmj9s35!-rt03glKu&Q;3WS)&FV@?6y_Y;$3WnnPQtJP z*zM@s!)MPC)?yS$Gy^7eknYL%-RwoM6ESo>O!2t2 z{4Eo3((oP!oYlUE;;!?gwbO0ut;{EhVt$a5HimMcusd+yrsX9EQJEyI7bma2L!0WPu6t5jdXy?alEi_tw0yI*6|^ z%#Me#sDcB6=co1*qtz5eTufSbS~U5#Gl@Ix{rC|=@Ws%RIr)hvIrM5aKiS&K{Q*Si z;Z0cO18-RX1>_dd6Me135|KXH_4YSPMNu>YLQsX=UlFQH+o7OjJ}Jmqwwy9>-6ZVV z?KqgX3UA7%d3lP`g zU6z26N~8*u(`2T*x++n^L3|DE8eI&gMfa+z9|Q|AA*uYC3r;N;o|13AK`Of8b|brB z2^A?65aLSb(qsurH6xkLuLsGVduNGkD~sGq@fjd6-c9}!;kN0%trG%R+5n6XG-ex| z^jgBsA(euX6vU+@Y{@DyW<`1g>0;n}6G}`v@|$DmqHw2IDeyxR#H#%iC6>?=JE&A7 z*uh}9l7`mCyn^uu!z0(SOh!YTeO3lzvYBH!0-{v8%w`_1Y8&-o77vY)WNKO!$xqWY z(y=K9)S^*K<`ln477`noFu;{wuzWIGKsKVpmcg8)f5s66-Jp>J_FHs1q&PA(tx!T# z+3d>LLn@IGl|>!~ZQ>d&G8LKt5!J0NO!iok4-j@z`JCV)8bwK42{$c}9~i_N-_e>; z2<2f`2CEIErs6Lrks>hz93C(SG=NYz0GxqH*=GeweB_VQJzowgJ-{@`liB+0twqST zUNf8PWm(C#QFiy09DF0?haEtH<7AF;y9xqR1`1DX)A6T3p)!R8fwiB_Cn-iQOR}_5 z29z^#cl~;VCgNNV&1V@?O`{+Z#N~xTgi=Rf#6oxpy-N&*y#^wT<2)t30}N=~j|>&u z!OOVq5E_>K6#OOWd@+j@lEWx`!$DEN(TZHptbAw*p>%K%5Mlw@gvPrVKD^~pDTW*I zt0H|N%**>3^FZnXS0{ejbqX+O4Y;9LM+EsXVhV_(-k76@FYDI`Y|V`QWyUjJ-Aqs{ zj8kx=uM~=ZPzhELp|=R`NRqFL01Qgo?F#%F649snfnMC+-cJG|RVhB7#mnF7I{30v zvmQ0FjtDJ53%{C!-u7e&wfi&VbBSw{Jm(6tF;ESGLix(@e1(&$&2xL(U!%AC%dh(# zmzvY0edk5#l?W<9P?miJp}&^yNc|P9~$}cLPGBjLU#7m z9dNr%Y?&j`#0`W;tvQBf(bFv8fOoU)`y3|H>ftEW05idAz?zn9dB6k=d(=dI6A@J^3+j~2EJGZ93x2C?groOkPzPF~nx2C?groR6pO?`b5!m;_K z&_`sDmsK-sa+w^nO;|;7)QV)7mR(d9Q9Eid%T-v;J;_jzo|gGYtOYNNVxU&8)X7CQ zo2janATBT92Cu4)F)*#>!y#%1jIA+pNNSlVcNbNfx(7A~Xs8>e5e2 z8$^jUU}u=Aq`3Ifno=crxYULb%~Mkxuz)IBWjqms*y3G>Cv%;W0r8mf-lO4V_Fm0t zs4f) z*mpIgEyfwT5tk_GLwsPYf)voGJ@woPIj6G?K)4^cU2h=WU7Ogo& znU_Sr{*H@gOiqKeVviAW}(@FCG{y*EI zA7t87kf`Bq(m5PS$~%@|o4^=gTss|z++h+LkFA&i+X7Ka)-Nn}DsL!dJtvyFDi|P8 zS5lcn&lhK+2PpP7U%!12&n*79Q+;^$4vhfcJJ&Jm{1?`hyW9-T4=D zv<#x8Bt>$6@13KjMQCGHs$F|Kfpp9%mxd;ngnBAayD1#nzW6p=pj{T}cW5+uTMg#S zb->`g2|aF_v_gzajqxY-YZq)dFsF~jY$Qy@3Feg$PzEkJDAb7c=Lq*hvU4y<8T+QR zy~%uvN@+UZ3v`uv*nPNV!Va>XX-;wfaBMW0f3_J0i>qXO^BH3_7}|S4sk~=wXbCvA zQfo_l35p0nkq0YjC?hSV2V*u5`D*fkD8|TsGQ&v60`)juS08CE8czS0PY7;GOckl5 z6a#lBxnf9?C5B}|yAUdbNiE(R#GVr?c>&h}S{%Z9JldjZziYb)Buh3AUmtIx8ZR5c z!UHfICxev3WL9Xb%dRW4Vg|&`tOPE80aVmG1x`xLL6Abrl;IH2Gbrr3O-E5pScC$Q zHt;G3lF=sM#Rxa&C(lkEi=cy8fKh_!)REcXP>x)HG65S0ACf(A#w)z>JHWI(J3V>L z8F<`kC9B)|Ki{iH-mFM^L!vA0eJ8D z)iK8Z0?rJ0&ii{f_uum$hv}5O!HY7T4$=XJxY%Y0sj|L!t}uX?=>o8QelNYq6UpgS9E z_PyTx%cPhh3fuK0&0o`z#3Qnkbc^G8{ZD#Mbfc5r0VB-5B;B4 zE)!JalxV&FbRK(+ar&IvS&Do}<*(yU4+wIab{bogQ{A+-I8-V^DK-rCPG0v&_l_P`^6ybonbV_}CqGbBtmKPG8NJiw-|lX68EtBp zE(utU5vR;XG1Wy?jOMefV{>DoX0uN&BTq39SnuV@tCRDSSI18gyPCz}Efy3;8g5{n z)La1_p^_Pfua4pB{6(f4@I3Xj(RU&9=@guW;(IL zLTkuBQ+O}l@|$m8!o`1fPBLs$_(8-T;u@~+p1lXN+1yPBF2}Bu#LsQA$^UH!>A8g@ z*h^YxKb{4xcWk3lIc})o4~#NUa=>ZiZp{E^a7gDDV|KQYcjJ80V*w7rta(isqk{t8 zisDUEBFAJCesOs79>4vMhRHk%CPO1)OFU-~e&5oibb)P4%JScx2;-3C%s31ZCza`MT5$xnB87p%X{0IxD>GB+hTR2BQ9GqNz^257Z6(f|{`Jpm5f77Amar=iw65bQQVLxf(1{;fT!={Bo^m0Q|OpPE^3 z?eJ2^>F7b7X4!yFs+N%>y3)IduHCxZ4V^i(8frNC(hE6h%Wvo0?RGYjrT0nAf%5;oIax}|>`Xt)oMppa4 z)`3yiArs!b62u}LD2iy%N*k3T;h}*R7Co>oqX*z<`TKC0|`Yp*k_aPR0LR}$guwQWI2X=PB_;XiStQk+h)xtI~>ic zD-tt_2wwdYSkNOzbj%uiAvd3%JUg;YbEZ*p$$96py_398I!#V+N^Tvz(=fscBC;_;MgTUdirheCD4zjKf)+qJv~w|<#g_>B&yP(h?J_LEN`3z!VSZ2 zeTz?HagJ?JuDhJgkz9!bk+AS}+;0a0ws2XZoGw~SET@h36M%?4Tmdf`KumI<3#1F@h%Y)OHWcb$x@u#9?h!WS zyh3@IZC7-jSmGMHM`pu;lO5ZJ$fe{begYS!9GrSEFtMvXKYaPR_x+pij`aHLvpkLn%Svwie zC*yQlE7nPZ7j&kmFSpVDdX4tOM*GVerAq<+tsE&8>v+^BwU}TuYvbAMfe6SB7QpM&HVAlp8ypv;^RC2V8A zO+vYF^W7D7zxP*s*DdkCYsehDRC?nA4rl?_KBdwVT{Ww+#i5f`c%4+G+hKkE*Kzz&3gpMdU2My7CmHx?Ew+ug$`i_L8Bgr=c|o)lo#L7@q256CF$~ zH6$-wB?0i#n~Ti)W^+C@$8q;6XOoHf1PF!lhU_=2mY7bfXi$xdrX7M)pY_QSWTcZ^ z;%R1FTHoDq`reQek>%J3saLvJr7xcK6TMx-5s)_dk~O4a?log#(uY*#s=om++uaX7 zI^*+cT@^74*%d>BiwvD zL>h{Zp@aCpWy6k;Xg-T-(b|}nlbM@e(-|R`egl9)QclQ0^=@C}Jhu0^s z-@G_P_hVNSP?zPl<9M|;!2X{;z^9P`TEre%LD{}PYx$1OnyHop_vS$lIeAI3rTYK_5;%k^nai&gih5 z3Zn0eS8$Ypp`@{?4^bETXCl7D{rD31o0hmAU*dk#68D!ZaldJa`^%RYKa2h`IyhH3 z83;2QC&cQ@fT}xC&d50D1)8r;a_%{#1_x=zp0gh8JKw_o;yliV>uuWPifGPv;EcGG zy*cze6Psz~!xbKhK3TZTCvn3g?U&H@QYxDz4W&Bn!gVx+gj?4nTa5MaNATpa{rH%G zqZCO`!{`0t5oAW}K+?OvunjFP?42oKhpZgk+)?AeymF)SH3?iC637+HS`G}}Zhyl@ zF??L2N@%b2a9|IY4d4b7u-20j%LVmyqLMPk7%EO#NKjL2@+OgeouEb}>wA|^$nJVR z$$`pEj-PRZWOr1c_f!9><3yR|&=XJ+XisL8Y zE9=O_xs_V*RF`%iQUug!+_K+%1R{sv@Y%D56X2hLU{?}1^h2=1zt^65PWgsr4C2W? zNhI8k7i}jNM%E9nv);BF2~DGb7_l)&EL)*MbYAN@)m)nDMrgZpik3V0qXYLa+J^5q^h6R3;3@4SVFxVexr0rt1z-{v zjC9@&DhN`C_f-XvOHOt)DTh_;`-k&xvh#i@|K5;|qMS%XXZ7L~k8a;>l@)DNOf}*F zvbM(dE``;TJHVt&(BN+AY}^f^sTs%$`abYcbuA8avu+7yPVUTjzf86-P=SovY?0n! z6d0mv5eHGYC7p$Da62M-AbB>=(b+=o-wMNX5=h}h(E%21|2HI@SvgK^40^uy9oGP~ zB(@*(Zie16mt?Uf!Obbm6-O?q9AkKjOXyJorQ@YFL5+u;TR1v+4{$?>_$$19Q;gqB zQI$L7{>A41JX=x)J=riqG`!^KR@PAKL-(pv#~-3jOz2X_y{meMl2F(Mf&f?z^{235 zPSM7iH7;!b!&C$L>Xnr2w;9*e;wJ_d$;xou(vBE5)M6^L9fE`gGPigOoeL=54XKhu zSSwzdsGT0P>v~~;-)#!U+Ymc31Yhe11jGL)j1~PlQ;hg~hqBY-yrn@e7I7?oZy4#U zIUp2=K1#OBtnvaJN0_8K>2RmLGRQIS`4FuK6cC6qB@pC2L1Rr(U}M9y^c=U#M7q+H zpohH;o-zxOXr1pSEgK)zhBI9n9rahQDv%G&HHplSiUv~{R73tj89+0Ocqw!!8%n_4 z3%sMosQwo6SHCT^9CR7@-|3o6V zF~jiJE4biJkB*=J*bX$2Mm5VDz}kA1N>nR#kw&=TF!Capr)ez;3e8FC0C79P&bXTv zI^qH2O@Skd#l+-&C~x@uu>hR}8k~osgCI2GTpb)OTar4koeH@Ebq#4`%nZd>@P>z= zK1GtI$ITESY>#Q-pByYhL@LD7QvAVU!o#HUa}J`J_pi8~a(i?=QYpCc)u}dd@>t+5 z4^oahiayDl(}%rM3na_X=1C$A!-m^o5uqrAAHfja1U7o!?5e07Dv@+B24qtjLaPm9 zAB|8?(GkOpR0qZ|YYZEK)t6mv6P#_{qu6}{{_0!?E4V=Go^0x@lWq%=v<&TxKAR*i z5`ny!Uua4Ygc#tt@{y}*K?TwFtk^~y8YGwB=i~X<$?DIPtlcZAt;DE+h&$`D&t#teSkF zKYYhFz~({}>X?p71&5@6Wn%I>UGe>wiv_K^(%2`WD^?Xc2vYlhJzfalmh3LT-(~SxYh;S zJa7t^wrJngJv(D>r*UkY#QhOQMQFv#o<{ybSmNyhM4JB|*#+ssN=WO%y{sbjNYJgu3U(JTgpdy^*a z4h6kx|NIj!$krARDOmk2bt{5yTB^@vsno8_+YA_lDny#?$~N3NeAxH|!&$x9BbxwZ zCEW!SSis9t*U_-h9F18C9kDBSgk>TNA?NK;YK_^@Alg7UG7PSt_;A3aPUYoQ7^Q5@ z$ry(qh^U>w{@8 zR%X3$E;fqG>pI5^`G7elC=CEgv;`YCNXG!W9gAyb9C0VuT-UiL9dNRjBHoZE_LJG3OmlN!0J3|JTxWrlz_ed#d4(}`hKAscZmTP zYb`48SiM&oy4nB1<#alDQvVk`K&mPqFu{fzun}gu$5#x*?r4FK6Gj_t)cu^ z!UM37`Q$A5hgC9C*SyK--;)nvlgX3&=oMZj8=ogm#`;$rszu#^v@~1lvS5IxU+w01%+^{_{v@(Q>o3o;4n9P|X3Ye_CAs4}fv_~VQ!+D_OjdnQ zCz^CpC}xJ!kWGsDFQ_pK`a@P5~`BVP3n`7+G6%y=vEq4FmWOS#e zC#MbRUn$o%Of1$hM<)!DPKvf>LLpFH8$dZpni;o~;pw@-DQX?|!-YZ}?1z?#ljON&jN7INJ)Bbb56Ndj7j zE-;32PTj}r)Hca)g;enB@0h1{;2{ym%LfOwo9MszzKteQ{X?(Zh+0jGF43ylq={;X zCwf?hSps=!1%POp<5hE+&G1LdgyHbh0t&b{XPlJGnC>kf&5+4@=NV-UzQy4VuzddgwHsztSOAX$k7^ z_Q@G6{~(wO>7&Xz{)DV-^u0?@)%1LS{o9+PH%D?4wZEVMN3zQ`6n`o1&aWcrxfwO9; zYoxVZMc*?53X&Y<1C?UQSj0?DEL>;|;ugTSmn5*pifDg_4gn^pe^*PQ6hBMfRYZzm zbfk2m7(r}zaB)m75K?)l|HG`1gdrIF{_=)pS@2zqQ7I6B^U zkAE1SG^8mFF%`G5-;}^KhN+rqc6AM26MG3$36z{k1EKUR;gmsTEZw8&PdQG#%D_aH zQW?6O1T=FapTSqZzmD6}|B@d|nis#b26$Ee&o3T53iZEVJiOKa{ukx{#9SXAllt>k z&3miny;bwxs(EkKytiuJTQ%?h;H;lOI5-JE(XWmTlKnJd$0tv}?LB?@jND9(t4}&Y zQUj=GzN=7(CfCV>?(UapocfMK7ErP}ifll>Fpt^1UyNG$ni4*_PuVCnJs}lfp3E&k zs zmmCh}{VR4gU`LW|S|*losH?UTPsE3-MjOUlWzwBlc(dQIh!;5!D;Y+TAe!fiB#Y%7 zngW;=d*(i7I;0jU04D^KqbLNdNpMn}vX>r9Kq~bvS0jB#-llS_VMfk^?-VwTBRZW? z@tmyQVZyT6jhPX?7l#{hh}PAR$6wjmnRim$VohmUH%Yu$e^lde1Knqv(yu@h{ zy^jF1cG#`0-LxCV$5e-20XFWqD^g`FRiNtGdraCzIDqb%%H5}d zNDF`a^HD0=EIULu|1A2HQ{?+Am?WS6iG<4M?d{5j&_)?Qah6OuIc%MQ%4M@H9?KXK z6@VUgBrVC!cvy>AYI2K`2SLT>b(~9jNfb%q4nL7ILb!mNq#TTB#sCb}1jzNg@1&-r z6MLDCFX*h&>ah@Neu+sos|3NPt%-^y`6+D!_BtdFYN(^hV@cA6!^Ynw^j;!o1L$Fv zjkg!TI+%p7I3vBU1Sm8Gs+>99dhxiVlco^TH5o0HC7c874kRZ9ZO{`M)a4u|hCrLflWDTT*S=VOo^7sp)IF0oI^ZUX{GT;yqX5>I(d-| zTH%fr3whPmDVFXPJn|3^So@n2#x{?*!HlYo>A{frB%d zDfQ%0?nCOeBQiQoF>6ligt{*llP<+C;Y(Sfj?e`3?986nkVeChVP`g5a-_1V8DERI zl@hAbCuxl3z64+Dy3G*-WNC2mHGm0j0oqw9I1!L@QcsIt*k50+o+?U{;7@HsBQN(k zV`8#;lHGUkh=6Uff+`HU)S5@^zD%Fb|#YH$3MdwE0-j`)P`7HRMU_Mxkj_4@B)bfb&=5-+(qE-4&Zy{6bKcQP6|WvhqBHV4+Z16f zl>3V>d}K7_F(|Gpl86{KC%s}|;*{Wg&9jid(88>CQbB)3Xo}I+1qRVsm>~d~!Z`h< zm@dE{%7V>}_KPtmFX7k}cwW&WPyX0k&e8m;-K%dBlPL?JKr)Kb7wbtoCj_8D!)`P~ z`4k8g1Vb|9Yfi<=ZNh!gOD}TCQ~KXN;VLeWv?*%@l-%VgzvxpJn66t>h?$vbh(=*^ z_!dUac7a)a`BoL*${EV&kvQVWXgN9<`w7H+KII{&%(BT`H6iRh5|?+A8_Y(b`Mi^E zpU7$gN0Yr;<1SEQVdiBWWf4Wpxt6#rj$DzbRk#6(>LDt|UQ?8|zRJdcaPxk}5<7&7 zo{8Zu_X;d)_yOaWpyZTdQW7W78)cJAybcr?IR_KNt}e^r@d*Wt?!7$x?)YiluwmzY zy1PUFb5nkqTF0-Rp1gd0c&;JrF%j5~=4HZ-M1Cerwz4l4M(RJT*^xO1 zrB<>OA++xLpL>B2_NnaOOOz5%h`%JZxf~IXUgD$jcz$ILH0-`1a&X^$6Rf@Wt+q4! z;n2*+@EFNf0cN9%B^q%XHcsMt>12P}ku0Z;$qd8%ij&e<+F>U`WMW#v{_K4(A52$f zR+OBIPD5IAd0IuI5%&A#$_>5lnqH;0cDAA~jR+a*s>4Y?C#92PvVQ^dznK2?wqYFi z?d-*mUE9KDpyrD4u&AJEJmD}pwGH27T5aX%xF0(@YE0@bAK_&-lk>A|(J1m*Vb zUoho}(P>j;o;96#Y4rbe?*IiR^ozp?;kBE>rAyQ_ibXvJDk0_HI2Te)7M%E-%%xkYGMgahB?#r8OTzYXAJLyysnfu)@i|BSRjVwfK$%uy;L?6wnsagkA~ zIFz*@bNt}lx3H#Yev`dVF=u?&8g;nRJrUPIpZE9RKANGRLDq91O>4ANGSo+u6Kh7dH&VIpt4YbZk`U60PisF`tu| zfTh@pB=|@W@VwM3X>A2_*A)USmSAJQ{yH%S%ZL>;tJ-d0E_UD!}06*g>S5xB}0ZKCQT}+g3kb8$L4kxVHT2N%7 z(nyI0uH^F$uzv9I4vrIj+t40IH*kW;*-zL77j#~5{yqc*fXXVvhGML<*f76cf4I)-h^k#dz7OS5_5&>S9$c7mFisDU) z){L}WidA4LRfcIOW}LN?LIUxMmb9W$qbQ$P%V`}dRX;F8kJ%`0VwtuVIgX&^Kj3a~ z(gh$wK}869NhO>>OjKmT2#t#|Ipo2WU}N36DG*VJ;#uY~FDOzr*lj^DiJGqAzi~Fk z@Y*dLB-zb34I3Y~zX3K7_iqIMmzeAaJ`cGcD-Jinz(l&?Ej8`pUMD~C%dIWSB?(oR zWR~+G39Tg+ek_F{@L{nf7Qm}*+Ze~OnWbN%N`9(UdCN;sd(RFnyEL+Gsy!QfPah=6b*6ABIn7#BvBsFVwzxt1p6p?Pz^Am zVFU9TiW9|dCVHn!En!^Oab8J`dQ|06Ohws?MZqSpn4J?ZBvRIz#<^%eG_5?Mc*9T6 zU!dnCyS3UF{6hq zi18|N*N=n#lCZ8aq5A1|K@(ZLX-$A%*qbR4<;64%_Pa8wrFCp6Gq|7d;xb0OmYXD< zAJgYY7(D9aJ2Huans=&sA8qaL)IF~1D^_Dt4P*oVg;DcmMLRW8CE0B6w9&$Mr@bno zW;8{%8);34zp^EX3h2(537xN9O`331Z z!HMH(A*1N+4rL4Q`@j(P?i)Mr&__t79(5D?@JFOIfuk5?GzrcU-uQkF51Yip&*I_y zTbu_2!%75OB9)yUyir+Mp-|cz@|0ID|>`z83WV5$Tn=hMU=Z#}`rAAP|=7 z5nFqoE)Xi9DS~?Jq7I>UQ z403>&vL^e78!gjmP!oVOBtU_U{G?1A=JG<5fIgajnApd|7sRE3^FTok{7t?=Jj9vbk@^Z$j|NVNx5&ZV|Kmo1O{;YS*RnJs)foX1t1Fk z)W**bmTkrc?aJxwVVkU6si)+&dKXFJ+NynMyX4V+Jm$7K4>MWxg1YP_R-pe1;6~CX9Zg(HsSVx1A+t444amNj0PAp*J>ObWOH<-x4INumZ zAn^dD3Sh#j5g1oOVRB&4mlyv$)N7gfV_m=<8dKqSIPs49Dg-PZDCvk1w0(7YyCEn7 z+@!K0H9bCg+b_|tuWHd({X=U_GU|ORK7>n=lghCUV=^!V%uhRSpNPzc93#_#pWcS= zN7@Nta{);L5ePPdT zhgPRUCrCpt*)H7pOF_ysFQ?*~Ve|(?&XqSG8^qoSUfikp!R&QhjhsOQa~Ue5qig~B z_QZ+Z*uBb&R%TUuwd^Z){+lFEewL2ZCy1RiGi5eTfz?NYev@#=WtGq7t$ z;5;qziI)qB#-$WES*|)+JwjpAI`XYx7Xi8uEd5pT^^$(toMA@)Q8bP`3?|u1SwR$L zY2^%;%=84q3T%uOgEu?7fkHto`q1RjQuCWIpv=`5kH$(cSZC4sCJ zn5BN)W3K`bW0d2Yjx`vy9JT>JxXmn+j;t5tkHt^0MT&Vvj|?|o_E9^4Y&M_L4cC6G7)3&96%=?&bYvL$K(EeZIONr&~Wub0-7e(>T zxU?&#H+gW#_?o;H(Gdx6fN4IVGsFhc(CP#hq7uoUxe3g2u+GgsejSne?I%qcQffwV zKFW^@|4d(XF(j}a=Id`yu=2y<3-?t25}xpLGQ**CKP=w|zQCCLlSO_(dH7J5C8^pc z$@qp;0_;=f{@Y{=^%AzK7@Iso+_2YdH~D+!J4=za%SpEG=4WfQiT&<4o~DFf$nnWB zleg&uDb)+Io87RzvkWllY&NYP-@7*ggwz$w)S|q+H$^H2r84~M-tG=Y)VP0-JW#SM zYzlq&=M`~i?8#Z7aec~cZVTPd+UTHDW)X+7ur1a#;rjCTUsbe)!>Phq_&C&)YlqrX zBZM|U_13==JRPLDXi+L{RqSr$yYO2>96VdhY8bbf3mB*6JJAw~ABBUlU3!X(W7b^R zU#znY17YtLwk^;nlr8sz`{l#3BtnPZ9Ui}0|8SVJp8;*oS%);s6OW}r*OV_^qL@AKxuqUPHb%hLkPOcZ+ZGokTaUuvtGLqrUyF7<7oS zJWkNHM3w-h(3hB3oRXlDGZHj=Nj}5fg@o$cXdnlLJ(7UzN`~m}_4hMC?h{vfmsBL26l=Vc>o;bRu zrt>Te8;9gjREJ?g`G&}nM#5s3*~x|*I7%@AS@lboagDadu!~7kk$jz&a||2%q=vCn zvsqwb>W(cupNG)=arw`!wL?7tdM#G!GP=OM)kFSt$%VZBjZ1M;BcF2P|`^}bHb%b73@M%09#IJyFn*EZBF%LuNr^!jF7%zdfR-+N7(@qp*6MkdCZyBu4Ux^-*w23)c7 zKGS5hBK3ovAi*)64mocmxXFO6>vI&f1P`dhWmS&F2wj!%<5eU0GuzAHb#K#spN>$Q zsqv%ps_O)(7VI7i^UBNMP`4|w3Qsm^F1Qrkt%JP0OsQV{SK?0lzk7_)75P7RclPdw z@n3fyd~qB9_0Nv~N{4Cv(67yzKyUMZ-Uf!f4Geo581^}_D!+rY5@gYtiB@Tofc z7dV`dI&ttmX`vKnwO2FH;uMV4IOTS`on(8rlXSb?HU(Bf`!b4$x5z~KBLNC1RP1~- zD^t|nA{ZKDDsr&hvVOO5?`ay{))p)OLi>eK^SC;%CE6Yi-WxHB&EV*YVCZw`{6iKs zvT&98<+-TFS6OTf2gucHec#~}zacN?=16oDXDIu}io=>kvez7XD4R}z8{XPl;m5>n z@>FC-G##nG%1w!?B|kx*Z@Z*L8V(#el8T_iQU{6V67gKh++yk-WaOlQPn&UR^PDPH zyRlh2?=l-BGFWd>5$={bzwqvDZ_BbZ__{a~lr4fMsp2WrZTJ4t$^M3>P9LIYVhwv9 z4+xUY>Hdae%9tdv{E{rd=C&Q6Ay{E8$@xj|<=N5Gq@`WO5<`A+0?4}J108@a(m|+% zil`1=oxD7HiH6sov81Edzwn!x6oB29x3gXXN?ejV?T9rj>076|`}>-3a;nW)aH;8U zXw4Zpp%3e5lwGDHi5t~PF3JKUcs3#RCK#^xApBL@?2 zERs%Lq=dzN?TW7*+1_@|Vb|*o&aJw5wO4Cug`D?fqy9 zxIoKWPXOoWbvGO&O0rUWSF2#14~Ar1)0@wGUMg#6-E>UOUK6E~!K1xLUw*OsFln*tjffV|JM-h4dhqb!-roJBMfn~y+&;@FKB>JgzqtR!mwQPI zC>RPrdUOtW`V(7v@L+c*X$8@uYYi?Ii|#nhN83O}UBT(^_KWeoNj6)s;mfu-?);x& zpX2IsclXP$zU*Gj#v^Vvxvsj&?@qVLY4e_ee_H}hF_k1Z}S!2&ie|LOKW-@U&FFv3En zb~LL78ff|nFq~u?OA}>K7kDYRzI)d*6N*|yg7Y()WfXQo+ziahO8QeGs|SvPIEi*6DzNh zi$05so+HvSZD<@$4StYfqjcGEC6;uo3H)oD3!^Q)6FZ#^U)E0yd<&;+2m0jcGH z6q6e-1#1a|h6CA;F5a51y(QXJ=lhKjJTSBu=95Qv6tv^F(bSz#!IEIb3E#Ys;4)|ItaIG=OoVASd2T94wNBq`E19oysv& z2>|vy<6vTvY%z3otd}qPIvAD zY2WVRoHepTOn2ff7?KhgNHe_=p9t9^j15a6Hg$bC=5m=)M5Yz<#g-WEb)B3rNjF^(I8*f`ji;a2r4oPIk0(|-J17x;U9<7u z82qj&s$=i?|8Y7V@Ew-lnq z9kSJSEXY0Il^Vg}pBk2dF_NKZ^LN6VP!yHJ{v-@n{T#6^UX{sIr_)Z)Aqjc z2&1e5L%0kvwsKnDbR08r%~o_h>Oxia#MH6 ziyP1^CK9=$H(ob+MFILyO0t`6e`S5aWUac6)z2C#KsAKnkzmj@SY9SoOXu!jpd(L& zv{X-knC{TfkWIQnp_4>+=;MG#5B52VGo2PEIEkENm|vD(laK`i4O@TQ-~F)1RgtIX zO{z$wJeR5>T?E+JMCf-zM6-J;d1PX|wI;r3A`0$&+{u?yTxQ$G*Mz)&DBk#ld`>uA zOT;;ZDC`ny&A-Kzd> zRe!gtzgyMct?KVz+V5jH!EAWFzaPK4zqi4D*-$-yFG)s;_We9DsuQ4$t$HTW+P$mk z{JqvbJpxQrZzAy%gEO5vyN|Ck{Gfqi!L0+3-3PA2g4NV-#(`0>^AXWs(q z!DelW>RRz+2U|xG_=RK>QxX-)rao#V>JzjnZR?ZnU6WPrgyTbKe>)2|NMFNb98vjxVqLBV@bW+IW*K%&G^bMCeg<#xanpK#QN z7+zN#>!-64O+Y# z9gGS`VGuUk*IB<;=AJ`@TkGkI)1|dOc@89#UNs4)(CS$%K4}(IYlC6d04>ERFG}`# zf@3QOn45>{lrK+`=Iy?DfqAYl&ffphg1RtqAvSi4lBcf^sFQZxJ%kVSqQ~+n8p&3& z>qymk{VB9;Pf|T{yJg-nH8%|kazyM@sEE}p;x+LI^-0=?LZy2m(sH~*coicpF4h^# zA~u%Ar;g=wzJcV%bo!Nw%eShQsXpts4d2L!VF1~NYju!W9rNgH<$lKIejYK;gn@`+GCtG@WZKO}2 zsY#PL&iiFi6~md)na(itICAPX#5*7u+iLbc$H3P}vD@(6I*MLeWoK)l*ghzyn7pKWCr*pNT*WE5fpReH7UeK z1ujfwl)*JO^3Wsq3|BL0L6s+1@3CWI5sBs-#@781h2;Og`I++(yJM|s{4`8UnfYHf z+<4#{@o3<3bNDg9ag?=8uFZB(ex_H44quL!KSG|MTj}GksB9rlob#MuZH~{DF~LQ< zt+V;{K#Ai0k8EX8YlVp2U~M8i%6iRbYcwC7eLeHH!~occySZCSty=De4;u`9$}(F} zL!!Nd6xhB6IANoOUf8EH+uNEe#f2y30 zGHX;+`9I$Q%6!PBW0!2lpZtzL#T|dJJIjZ(<8`cuy=I=pdleuTYIp7d3!K1Ec)T_^nD8r zy*iV0oVD?}g}*wKJt?7=8yi&0XhJc0)}l8ALZqayk0VUHO>8bXjRLb!UBR47;MMUZ zbQjhiPkPWqTg3n40v4i}09f~dYkQa6fp2$W)yf%E1fpO_-Qtg|%+ON_74g*9w$qq) zuI6eO-4N4U4YN%Bw`|5M>gw;wCUk<|fsLm(6vvm|kk&nThfy+Vagx?Fqx9H7#vHzS z4ZIwpn@xS0{PgP0%h#vJZ`)pBa{oiYfqiZ$NkLPck{EB$D=DLr&r{U0!>q4>EI{WL zlT@icFH81Rmy+%(PXWYJ%zG=}dJA6W`FL#0Yu+SW*Km6`F{mM*T)e0=iPD!d&BJ-`O~}RYFzW3(qeQ6rE=3$Esof3g@t}g^@FFBagOFidT+nahi;k=ofoiNv2ycNk$=QmPs zLekPj+b}uSmVC8c2Zq znKv!{1S1YU>uJ*x)z3ZrZ^PIA(y!Ierdf=ha(}Nkt2IpG;KoAzbqZlOt4j2)fZ$*D zeU|2JXf8sL8I~>F(i!(x%(%bKjQeZO7|N;r_p&m5 z3oaf7CNMsPo3Mxh@yw-X@YuOk;%Dx!e|vNE=4i=<`;MYOV3uyWcU`>k&Y)Z=BzEiW z(7Z3fE#iH%2&Jj@I!1RtG~aut=S%NB^?c_m%=*E5_mk^=A4gqJU&ng+{_xea7e}}e z{b@k7$jvhxL{?2-1`DRI4Qqnr-S3{j+B8}ueWk?{%Yw9aluVYw|#_lkQ#t04K5Q5QWV{?;UguD~JG%S`p#L5`v zN*GI1+GLxk*T!ru3XXWyd%@Y?__c`FCxm0dTNGdlk6)!_?ZESu&D6~lSbD>GGi z!i>;blr;FU1;ub;r%O5_j0RoNndRSXiiz@}f6jp+9%M62L~EFIGaxDMUW^`9nNSB9 zI*zFnvhCGCa-^uE_b%7?{OIuf&FN9^@bz(Q#D2>pwBX!YF&PN;V95UJ9*I^g;}mIY zkWFV-)Yj+dzcQaB8RtFTHZR~rT{HLP6RPtnD+lQ;ZKFKx>DHF9o2}+kia(D6M$B?f zV+JINLI{!~qBQ|pn|6W8%O~%uu7SZagWjr)5`&BA!oFg`MH`ps)ydI6o*unE7p$H3 zNv!Htv#*+~<&*2;9TrJC^?{m?4vet}C$7SO3p)o-|G&s5_xFDP1Q09q|9kfz?A7u= zJlwg}|Nq(XUugRibrr}*B;76N!&%bmO^R7BNv%kAwLQSC+W%JVf2;PtRr}wn{cqL& zw`%`??JzKoZSMw$Ld_lvtd0@k17zaLv&*`~U9IL9KzdDP7*bqa%JA~#$eqUkTP3O5 zp}m)9&t4@JI*qCCommaoMe(u$=J5IJBdIaI!KmK@i6Lr&fzs{H;Y4kG)ZwT|al^K! z1u!)?Uh~}AQ0Ck(35*7Ad~sM?bdIBluGa;e6YX0_4ehnNJHvhB8ZOR8 zC}-_Ydlm3lnAR8>4>Z7bIMKhK9U8|ZG494!QsMA9aMnkN+MrAi@Y~VhOY&ls|9Sqg zRJmGS)4INXpsg&f80lQifp`Og@H3pJ%mLjNP$q>+Taqgx+ze1?h8kSQqaFK92ZOQ) zhy(u%tMN;+lYCI8cKQ~$pX0msep4Ieo~>K%)$5jfR98H>kZwVw=e)w^aGW$0%p|?N zi{sIl!&-w)|J^NWx6#XvoDYwm^|&=J0^C$G_pzwOl^wpjgVaI6>T)@}yeG0By6!II7PUHosyF0;6}ToxF% zCe25tt;=kN)zCs`y(aIjZj+mFo7-(H+v086dHXTzUT+3&$O(CYYjdBzDsTkOPoAAT zHXg(N2*kgb`bqm32%tmw?Q1yh=u|`VQ66iccx0J3`3(y5R1oNN)UG#YaM{QABh(f?wZ;x_oz)l%h5KSs0ZxFy)PZv zo8Yqpi`vD9?$=-Ah*OHz-UF0N1}LUC&<^dG{LX=doBgFSXTW%vyFJhmkbiCu_&zo# zPURxlN)KW^@JiroY_3egdFZo%cYg=E-sqQF_$!2{Gts)^*3OCHPHys^!eb_p_{krQK-fXz2kC&|}LyNgB zKC9gfepPP)ZOz?vYtlk)cvt)fBg;kl$JoB&Lrdn`P7HOVZ>*6lY~1&UKOFVYhZA#` z>~0vHJN-gMf}sbK}u3cD~jKob@wHdMHtQCn@##=vYed3j=f)dX9S<4NljBCx|m-BmbY(au@RjriU zCs~F&CDc+}zWb)Uwp?i98!7LNuV(mLFJDDVSGBU5StcxPEzRoXt7vJrZ8qMwrRdpy zcZ|qvA309w}g9S z#U97`N`^A-cYNWMSa_co_M6y`+0SZF=9TbPKwkJIycLiaeu>Ke?yP_{gRmtW;|DF} zIP*9KJr^Hawm)^tkRhY_=Gm;e#R6m2NDVa0jn-g$-AE0!osHJAhP9EJrFXm3jJ6wU zs6B6EO>6Mm)B?r8X{^ph#Z7fN(Ogqqw)2kEMRVq8HMVmOYc$TWac;xNwhbdY=GfHN zD|iO?VNJE_u2-}6-jOh%lH9>FH1cOx*3|6aPuv!I! z)lwL&mcn4Q6b7rMFjzIgVATYJ)z9$>#%Co?4)F>NW17W)b{2zLHm{EsCbRok`9-{V z1Q!_xl}HWayJBjE7V@@I-F7}&$Gb}Ew)oLHRYQ%cR=!Ta)GhKOHL7^|di(5jP%Evz z2wK{8p0b5~m#SJ>aYTxgw=POy9d)0IRI;8`@mf_=ohnvCtv+LwtRq;ho^j2J)N|an z8tTO-<~VdU)TajO(|mnY)e_IU@LG`$7);3`dWvjygjn-YUR8=vF~c-re$6$hmPW5xvEymn}KoK zaErN~96`xoc#bPbShA{@b9*MwV5f*U8vEZ}&*8AF?^PVB$8O2dYU;6UYO!~#Q&!zw z-4g7u>K8IjtbVzwR;u#L)EcU_5;Wn}caxMlrF@^ITIniQ)@zsDsoi4YU~S77e-@{d zBDQrL37dxb6O(kkLf;eDmZihc=kpzum9!ZOZ@ss(JYWh1d1+*+l#rq-j(E91^U zT{OZH?)Y3^47ZfGH`b%gD^mp}oV`)E23x{9I%pXQBQnt1Ym#(^ZxQ|JJC$B~&(3&QE@_^O1TuKz))2X(c_t~MKKZi3$Xll+ zSMnFU6RaG0YfE0UHj|$m@m%=IX~&4%%nO#UxsPsfl%1Ie7L+-UcAG>9<~%O+w@A3$ zN2f!PUAd2@LnD6I76v%E0HhEkeCn5eYlUzX9RC5_c{3Nd~?`>`b(!A)B5Jw zQ1!tZw;7?;_1RM8=8aI`-m}vJ)7Ium$!LAy(96y%d(;gj?7uLJU!!c@52Z6MAxDEp zzoF6@H`AT^q%@{JGezk>IaQfh^q#z;3-8;aP;;7Fi^Vw_GL~H;B zpin3j3Uyeo9KyQKosrvQ`?FbP4-?pS{BC?bfiJJzi=ROt*+tJO_`ee;bfzwP_jiT| zNqq2*e+-0l2)D*2qkL$UJ+Xe4--Uuh6bCBw>s9E?F#8o+mF{Bby?vf_uZzL>5KfaFV=T`~ z8HYucE|V?<{ON5+04U!7_uvA!mD&HBU-th;`KPjcSBVN57*(0hcRjJnzw_={%ifR*}7x94clfmc=FdpLlTDTdnhS6TN3DTZScp%<{eBoyEg2O68jj=ab1wD?whE zPB`kz>D+}MSMo=h9^JSJ@|G>+u7WPPz>GRkCrs$_s=-6v`5d0rI>XFu-}5| z&6*D<-fWd+M6aRp^{2pzR)G%0S-v{OYU!`gz;%q}T~gcgBlHC_8>shzqutY=d*{cP z4RC#nxYWK8ItHBsPv;lcm`DCzV@o#}C(oDDy&iOT(CY4=wolGFr@C9Q7hqPZe(24B zIb(`l3aBIo;sx9%hOzLX2Q_1McQ}hfo_Otr8+YKcj=nE7igN}fA}5=0GQlrsD2iSp z>NSl3C0#Q60F+aSp5PnRO~6t7z^4oT`wo(78vsS=y9#CPVr^jZJ#(dMvM+I30}wtj ze9V|bCsp`f6+L9n?WB4i54Ik;{?`yzomG>X)jHPfcP@ShqDY1-n$i&oEX(iLQa#l3 zPE(mVbeWJ~A77@Is?m;*)@^s_mwoP8*`jP$X2Vi_Wn_}FeVGk2eJQfxlAK)f3>>I3 zZTWB=3o#mp)=-iP$rzUY6RDzF&zCsrDg|x{kR)Veq0wg^g`gxLDJ5iK>4M3PK<;E= zMh46k=1U@leT-DJ(g3MN&gcZRRhB|XGM3d4B`XasvXaS-Kq-kS3r`iT1Q6w^XIWtQ zc_lcoY}U2JC=%tNynbUD3d&zAE#H$TStuZhtpq~}P&P!1qLlzjc`gf2maGI0B{U1J z;OmO?grb{mj`)2gP$<=90pZsbM-WKP|;( zMr-$}5r<^p#wlu|xI}sQkl&?%EpuEaB_!OkJo=Mgk;6l!L_Ki>bmnO_KQ&gx9Dw|` zfedSDl&vkD*eZ%wF2punSYj|tk4M%is z2JysqM-*0*DS8{hFJEd&-kCt3nnYNp0~B(+p@-3hWe@J#K3R41>!8__h5QNY8OBWX z{WMcwA5y_q(0UZaq~o&G#>lAKKhs?y_4p;W#Pa6=Z8N}!PrMmm1gXs+=c=d$tE{>c zIDgIC1_<$KmV2+X6L=4D8z|L-eJ4nEPx#Jk1GP_{Vg(!ZYdc9T*}L5Rlmn#n7NXHE zKc_A4MxW{S(az^3ld?W-ea=jQt+UmS&h%^CXEMPoweO^M&@=W6rKN1LU&vIZ43jVM zlBjb;*XJ|k#qe_!kLwu8e?EynF|Pz(6!jgy2jh=wd`5gK)y=IcfZ&5QSSNi!JfhWr z&J>`8rLmhOCBY#W`pIM(OQx;5O>1NpQ<{a^WktM%Uga zrd>}X82JRRmepICP6$LUnRx8!&ihEY9D0$6o5Pa%e_wlVmh<338w0U$6nKztiBG(I zT^iR*XEJwd$__%X0^%_26jKr$zvvydj*}W`Ms!Pi*LWR;l@r?z zWwxj`$&)ygv#2wJ!R72;TB4ON=SB7&$+LTjRgZ*@%ttL`#Fdc|ffu9tK)X8Nd{BhT zq&j2npI4x&@*~=&?FZZ=LS{o@8&4cDR(IEh+@?zSBNxIve1)04BN${+)G;4ruH*< zOPdB)Zsswq#KBQQ?X?7%#mDOMr@56EAZ?@kIo-#B)`6Z$6zS1Dx;MkjGznFr(R0ls z-p25PZr}$#ef#ZN_F%pC+{vJpe=W`)wCT-|d-V?(4c2<;Uu97&rr@86{u2e08QeMJ zVNIcaVRI3~jDwQ`4@@@NWrQpuzCnamp5fEp?ZaGh;$Zf&h^Z*HTN$2B_( z{A;!w_B}WBvK8-Bogck0h{hi4j=c+D5P8+QZa8uQ*j40SyI0v-52)6G;{zvUdssQl zR(eF0ewzC*sQJjrt8gAUmveUPTsqTvm|N@62_yD1bQoo8e2+M|#|I8TU`VgL$;5M} z*}4K%FG6<|ga9@0N3rMURoe@kKL8ga3kpPyp8_Xf&oTWIESIIbEndqV4nx2vh+x!P zMI=0A)o^}sJ#wc}71#b1Uh|m42J`6@D_^>l84|>US0Z!Lh1+*9jpTyo>ZFvHbAUsB zKOW`?OY;3<{xY`$N9YT8+E`#FrHO;VKBmurBVM>8&lhZ63}xV6U3zg94_&gIJUQGw zd)_%cY6wS%XSM1SNOn|G6{0d%`(?C@NhE2z; zr10Nn^Itwe((4ju>;Y$NL}<%gr3&s_FRmcm1Z&gF=@2kBcCK8CWaNgm>KsTT9yG?# zhQ5<$Of{_mfYQqU8o0xVJ$b^a>jxt1<6-;w{GYq+PE}s#4bT+kW&`8gI2RuEU;)wY zoTF;F$_hXL1PVQr2ZQIVsxmu_=sMcq*`)H?pL7lntBj@Elj5hEM1Sd_jc^s?#pJo!O zRqG&u#wo8jK}Zj!d$xOguzT1!hI!t>m^j$0NbHWfat30}9QO+vi~Bm@ZkC3?u%|?6wNQbs%`vh-3j~Se?{NE{=fbez4>;7?=;$C0}pRx zI9`_Q#%iS>x|oY*Dp`_V_9dvxjpRQfl@E~pX?gsY?ac=%`42ODeUbk@PW%Twd9#+j z$&#*+ZRr(|_Z@YPJ7=Ba_CDK87oE0t4=G{YrgEB1Vofv}D(M(TocOX0KZE^04SWv- zlG_gcvONFWgNIw${BQTZ?EjCH{|!^Tt2+X#_1EYYXI|defrnDS#XQcv2*S05(#{{Y z_glx^RwI5JlQL{L4=H{8z{TjAk;)mL2|J@cJpoC@MLFr|YN2S3I04@<*o$agHqwi% zPVWs%!n~-uH;?fmK@>X8a9JGne)3s3F>Hccy$hnAE#QNMO?gjm7C}S}FXB*^#m7+f zgR&Ln1WMM&H)C6yl@Q_#1`0?4j3N+}(c67rC~{$IrB?w>3ed~Hd<(qsuF&F&jGD?X zM!LS7esJ-7G5(wZ2o+Ik-Eq6L5pkF~d!OOe8dVJX-a$Gx25~*T2qxR9m9Wr3W{Zow zmv(ZZR|yTs|Ew@5$h8F5?enO2Y#c0@!!QJ~?@rJ{=)%QI=fd&u>_B7yDjX)H4a9~S z)I`8rJ)%j%{tLsIh-$0FG7*jH){~+*l7?!U4Wp4|>UDOn(7!qXMr<|(hrTV1L6Cwm zc$OZG7J49oryl?*hx(tlq8$HO={5!4qDH5&kxTira|4_^karbC=}GQZ_@HuxI0zn zL(NuP5Dr1qk&=MLv>nzz0Y19F9&NV|YKG`p-qb>IphEgeJVT7WcX+Tdl)h`#uxgmU zD7sKhV63f|s0}a=~FLZ=M3G+HN$i-46a`Ri^p)`aw2?=cP3Gwm7vY~5D?<` zT}BmMNyPzOf!G3H=b0B%UK0=Q)d0BfOkMtXcz44briPG&c`1HjS!-?AaDqa$YpgIw z6UPiJI+m!S)ntt;_==c%S!I^s+x!b$6Wx&)#b|+M^5ms_{nq*JGPl)atO7&Yl1N$~ z71O%T;#KRfvRO8N?BwfshTbf(c-9>H%u)(?PkOodSTxT2%< zz#Tg15=-|Y#47n{r*M(1GPxsDmB0RCsn4nP5+jqRNOBF-2A4p<;ceB6X@-u2Ja>=M zd(x^ME-N_Q{st4_s2($!uG<0SYj!G(~CN@2tHviuohBac>Yf{udc z>6^Y!3yfuygDdC;S5xJQxxK&gE&=r3>N;~w@2{X!C-q0t(G_UySFkcDB85-0qwKdl z+Ue@vnj1{0)p@QwfW?sEHq2qz!W7wbO3}iL`{SHKdSh@RSJF+>D6woHb5lIdRKLJf zgO9E7i5gewV6kEcDZ*cAE@k@~aMeT>wy|!fa~~7Xs+cgrXdV@k^jEC*^#He0S~r_g zx|CP)igR3_a{e)18mds%r0C8f%73-PtOU2Q!P-Moib;a*&%+Ro8dBCq`cu-vWzjg8 zPX?qhV_w`?q6_(lZRgX7NLc`ulNO`RiI96H+?x z;h^ZzAVISjoUB2C$oR_(pf~D|T{IUm76TtAus*55#Ul-3sd+=xJIQPC%D9*3!l$?Y z7KXSV-~VHKb2FX)^Zva@U-EzcXWM^s3rILF?w|I4R0fFhw`L$N{E{>SadJ}4e%Sz~ z!PA#!pV*D-hJ4AmEB<(#Dx|dPJh}Q~)YRiNL=N{zD(I8iUceU4r8}P`+8>H~cHQd- za6&2xok^=Y&LMz91v&$47U#Pnycl`IreP^FNm!{Y%ZRLl-dK;~@uaTbI0|2OGh3ppW-Nybhp`h-&gsVfm!1piicqws?M?TXnu_EU91O7z< zkCZKJ;j4NrhluMYLhs^<%1M!MPKg`IY8NS5Y%}cfiwo2j|F7iyCtvse$36cyA8n=m zKObyA-2QU@f6DWJ9RppgECe7dkONkB0@M9L`&FBFSjtO4vd0?mwH*I}#|7C^AM5ZG z;VYj5;S?*~Gg|*V>z(fIpLI@q-QDLcX`TTs;5N){8JwY8BP9nva-@HRxFz7DgYrJB zy$!i5n!L(bCuJ09b27f0Q@YV5BH8~zI1+y)U>mc{7_h%le-FYY@csZF$oNtU$f11%oycRt0k);zJI5C z4ElyWwtwD7Bk-KEb|Y0c%0yC#=GqR4r9pIY(F@R1sz| zlhh5l=CE-##tX}S05^oUaY4O{xi`T$MeV{F$l7}t@Q!415hi3nQJrS)Wi)nwr=w>! zznGva1>%=!R|pseaPEjD{fJw|EcC7b5)<0{AsR^XK=TppfR}ClEy^;2Y;tg#%6ZyJ@ z!NRrycf-*fqxx|^vMi5c>WNA8_cTKmJOkg_O-E5S*6UfA7LN%$F=rk0{EGz(JGGY-f*VGW)ESPBR3fwakf{>HO{t@q`*kQ4mzaO_(0o7 zF7@Mb11;V-1tZPun!|KbBazK9f6E-|X%z+iS~4r%XunvpEoL_hPr8`lp)!l$E$o-# zl#DCy7rwZdOfhe>9P&hoe}|p&XI0??-Rv=R!@FE!REzR~wvD#vE1%U#hQ<#xxTJ$J z`x>(bJ#u5 zTy~jg`q)76y!TkR)#)mCs3z|fxxmt#monqnIIodAOs3O${f5buKQJBs2`avMyb625 z0n1!EX%3X9+sWfVn&6$iawi|Ep$OT#>@5#I}3=CV$WIoQNgX zlII~zEv1*UkVeu%ain>-a(Y^F8D>vUN@;k@l4e1gL;FImxFIR|Y8fW_rm1^`RU)&ZM%tCv z(hxo>&X+M7nbt9%&rprC;C~F8xivv5kL6fi1i!GHPsnm!sVtebnr&^=lz3K-l59sp zy&30urIJwo2Qr`BI{+rsTv?${t#0W}L8Pr*c?_c6EscUgoUJ?tYISRPh{`AdmJ940 zkX;v-jLe`%i`_ylVVayf^~9KP?!wHDHzHM;rE&G=C(-bh7K)M;=A6vLczOQ4REofw zyfcd|fjL)HYra5&*C5}+o9cYT74zoTr2KbIo+WTqC8NgQ#2F|wADAA>iE9P|cyhnZ zw_m?qHNBsr2iu`*R_k6zu{&*e131S4(2q_u-VX-+@L8*udofy4Pb_kAr9|ngs_E{e zw`l*H*#8N0!`m_bTWbHewf*ox+Wz;^z3nglKc9vD-v>0~<8@)9{On$T48yow!?6<9 zZMR~vW}2Nz&zW1YIlK4h-n~cPZGZp$qpht6o3N3-&$l_#G0!d$`+7Z&L?-=lvdvA7 zue^JbIAbEzGk170P1vL<^WVY{CsNd0&zp3%dJtyB4=<2Ei?7y6f7;Q^AryPnQXLh* zEE|+j)#1VBG-ZGaYND#}Rnw~EK9c2~=31Z>eI3Z+9^^iq`f6!X%-{~b!B`ZL;y?J& zaN-yxFFKA_r-Goggd%sr3eZ)sq_TaOp(cxzMVgy>!HZm5#gHgHOOvEZ4WZa9W62nD z_LKRzTQlf!XUT(W@q12MGFJEV{FoCdxmfY4oUM^G${d24X3e6p;Yy$!eVP$$K-*yH z+2Wp%bvv`Dc1(^lJg5vX8Lfo#P%$Ds7Q?b z93BPlgIMtk1%4z7#JGz8*(6x>5Y3|tmav$reMJ+EUZRo@$faUc3u>cb>Cxs-*KVDH z{ZU{7TBo&gZ|^)QN`Zx#e4boBXX6=cDb=D)*;i8XEX0%M_K-IDLXu^2&TL0XvKk)D zW4@*;e`DOv8l4jnrtd3^O8nPftf=Ph{(kG^jMvSvd@C4qk*%B7ENdgT+=^09nxiMZ zc~|)8`9EWMMclzM>$~4MK5p%QehVx^p%&apUQ*1}m8=>G=;LyI7hgsSIyVnsjO3cW zfbuKz4wgMGd*dzVK7$zwN^8ogcCo@gkpXUVFeZkyv;)g64eVRc)G}D;Ro^*gr29$$Ac}&EWc7Rl%eZU}LHvK<8;BQO& zzcl{GqlXV3ru6?0A3l2cMgRZV>Hlx8-OsNU^e>gve~YgG+!3`vL(ey+$`4&oa}qd% z#-Vo+I^p%oDu1myk7cr_`F3Xtk7OXOOi4FU=o+sGv{xBapSV+sWh@4odP7jRw#QkO zEY2^hkG}|liR<|6V&Z3xL~;Go;K@UPqn*K+MR|h@zDf-maQN?Gv z>-#~B!3sng@LE?LW#XyBg0v(*UJlN*Y`32Y%H#vk4KOBVn};y@Y+Zma!+|;nWtyw{ z=YuuPh5ZJI)9eXyaJQ%XXD2Ufsm3BKli17>H!UBXKIpQxW+*r8_%#DV)S1Guv}{|e zXFuT&4c~QU*#9l*F%@{B{^5H}#WlFC9<7lc@G@#sd1-`}tBEV6eoWGth&_W=I$YtC zju|hny8?WJEXkyLZWV2XB7S?LQdXHc5Rz#2Hk(WlmA-J&3+tq9w!^w`gGtQ3s@05d ziD@fb5CZtC4|_6ut0|a`PzjVYQ_TUQh0wn#PC^?}wCJB)QL>q`)!n$uNW5Y0bUty= zw+|!AopieGf3gdA>|A+hPOunz{V^)0qe(EET{Gt*m~)Q0fGgxQ7`Tz1H?5EeYc_IV zf8`Np9(6KfVt?(h5=v*=-bo|dNGsHqNIjvo-#iBIIo1fm%+f3fym_y5{m~oC=%yw(A*+db}K{C2xSW zo*ed{^Px^2kH3lkM7@p^hN*kIp}}pu{UY7fkX`@Nm6v= z%q(BgTsl)y6iV{*G&9}hfz&^FY{nG~R7LQ^j}&r|78{V=nYsRR5A|)Pc1nd&za=Br zt@{riZhyD+-Gh7I-`~3b-J^TU!z!le0LEgP+sUSaWS?Y6tF9B!Q_Q>FcPA5f0KXy= zgo@EGb!R+I|8p%&zrc>t8+~9i*xJ;kMB)^hc!>;z!R2v{N*cxv%eiyV7OL6&Jj6+i z3sqgaeM??5LWQcEc|lt?q+5FJTg~uTtVQY~F23rPfVrcm+oos$mrD{`ZW{5Ti6ALM zHC)aDe{#(dhgQ)=UbrZF#nN|-2;Ne1w`HCUwH*bJMB2S&?r@rFIiD>w0^nh_8+ylD zaCkE>*;}AAu_Eu~gJqD?hkDswvReH0^Y64GAL2Q9rI&U6?O37Fi#kNv?3u;LgEjLE zMvCU=PG|9T;q+Qq<73S35_n1t)n~lN)GYag%t;#NEh|~sanpfvaTrP%xUV#MsYDE& z#r~~@X~@vXYR02-L#h1EON~b%47y; zUax6~3Q|sn+3&mg<19E%q1{qCOuZ-+JZ0~T*y1H(ip#fctsm)AnY@e3SK&1sJ`G>6 z9-U*>btN=ub*>}{YM-pc`Q|9QSj?|kYZ34{#hF1W%f+s zXo+~KS@uE7EHx`;X>H7t03!*in9i3oxxZ1!;ON@#!}|Kjf-MfnD@LU;e37$iGQekDGq@vpiC1k9C#dxB0Ss0mDu zVM$zU<4jJ8YoyVA^6V+2G_#EF#T24>j3O_3f#G?x7?v$FdSY{d_#gbd0OVu%^}O4S ze4%<`D(iI!@gGjw3 z&lRbWt$Y^t66|zRa;v>9HkEwg!HudmsLp@ttUN&gWsPL_|0Gz|%h z;=N6WM33+-iQu_U`D-Q()rA zn@qf}3kx?uwpGKjH5lz(wzavrX@P7msM)*#dpE=1(y1&X8_O{Bx~UX@dAD>wI73(< zV>{SmA<9koiK24??|D9%M`ISuLrzrqE-V6TgQ&0WPI$6JX|_ae96Hy~hN(`*BWKoV z`M^aik8Z}{^)&U!ZP(%JGP^If&h2{~F{cp!_<<8>)LtRuy&FUHqdlF`JE zqBu`Iqf|V~{ApmS)?w?Y_5d+qP}n zwr$(C?c28P?%OuE-|S3m#LVK)&hEy>%O90dnH5=?C+k#Zob%;(enMDKV^%smFWaN? zz=B`JeYU+fEOB!0yf<(7%)QH3h8^3)vldj;@ZN-=7LLE#cY3n{e5yihU$ zm@8A?0(~h5#P4KNI1HvuEVkDX>7<^*?LDyV@(fH_TLKT=Aud-p`DqeN7Q{EL~J zr{p7j5Yq(ay{068DwqyNdu1Jy%F)B#!sv<#iN%B97iKjA>wb2e=P$Gaq3-mjB;~?z z+#qsYfIt3=FfVd$_5$b?3JrlXn&XoU>HN1sG1R%+}sUu%sreke#kKU z^INQXOPJ2G0K~4DO!DTs0CC#8>op=oz`ZwX@nH|f;>bfH?3}EcU3;^Lw0bof8}3e1 zh3Q!XS@NFrLyktKV0pqgwm<@&xp54gMDMwR6*2&`llrTyu?S#;&-Nj=Lyka4|1`89 z<|RkH9G_OtHCQ}o8Cc;N(ACZ0%gdvG33-krjCgW1P{Dsz117ngo85fgUTk9*?m5-u z@4=J0=W`rRhtJ=?*}T5n9LCQr<m!ee2&MXA0Y{D(Po1v2-Y+V*p44l-y_PwGgAFpHr+%L+5>fAa@4mb? z)pO^gSmSwc=$x5pR^E7~$3YB4;$2s=G6(9!kr6uIktdJq7l<|}!xAo~Bi`&6te{tT zz)_fso%q7D3r+dyv_?YS^`roVarrXYAM{;I3-^&AODX5%FTFJ=woJ1y9{d5!$SO6j z6Bo~}woMKuhn>4vUT_KaHzzEp+N_^$`4hmfFMU+^hhsy-*~sizj+QM|6=0mz%tZez zR=IBGRT2yCy94MdoU$~3c2wElNPdX77C=;uedTW`4|tN*xzH}{=7I(vnzv-H;t4Fe z4^q_Dgz0gCa&RI$No1kSKWGLJK;K1iDtkcagMBL#5T~{Xq zll=n4gLMn^9VD~VZ6PEy-f7&j$k*%3^w=?L9mAH9D+{`4~D?_qCEXv zWW>2Z+CmzicuO!;=)t6v79DR-sRm31hTx*05T#~mHr?{G?r;Zy_rC zB2h?8Pe)c@U4ZT*`S1q(Wb9-G9t`6_asoEwBKi&p(6qmUas=II1U|(wqXc5SCipt} zg-l`Tx>I~o0=E#fMZ5D4q%D-Ik{u)vq4&YR-h$oE^HulE0u7=?tmsB@c%|-$5tPQZ zG!s>X?i9S)oNh;NySBX)O=mo}me=kFIW8VzI7dB0vp;jqvoIPN%iERZ7+pmcxtK|1 zD*A`7>lWyh=XL?s`Vpn_R!9@75iwV+L9|SFj4(tJas(d+kJz%>xopC%>^AmP0!e!k zafXn7BaOT%QnHiLbITb8fi>GENC=4hMsX)amezn&M@5g@XSzjov#J$_{$*+1JvV}6 z6hfTZE5=ZB0$Vh#LF-PT^Dc&!l;98wX+5ez1uUwdE!-o;bK8sX&AE0JDuAAgGTSIw zi$D39c95HPqf^`XjO;sC2Dk-)Sfm+uE12CReFt+0WI!{`MBf2_YFjQiX0MJ47d+fEJqHVxBY1h+t+13pea4w=y|96=@sGRsjIgSuP+ zC5-8|&sApGY)&srYbUWW{OI?jPUt<-c-&+UXzv0idM@8;U^~c4%0w(<|Cd6PB6e#q zzm>QLS%-8T*J9QxDmywMcXe?0Z-yy#b;sDA;_c?x@T$%PBsCZf8}~9~7;9oJMKxqH z-GTGSAZZ7e2sW?n1b%D&s@z>@a|>tlN-8W*t%OQyl6`tgY0Jbmd;+hrM$4rl*NjxUwu-4DSO{H zb!?W$ExbSe1-H`dL7V!`>`MRQw&v4OEyy6L){JkjtOICTYRcNL-X?$_`uE`8_o{`n z@|p4W<5hDMdg6KMDl4}oR<~*!Rm_0I$FxHtU8j5D+7~VuQqFe%5~daouOmDdqbj6d zed+*l@;D#D)^k`eSZPdU{+1YqLiC-E56{kN-Nd`8y{%gnul{HQ+@bKf%fBaoSoIS* zc3MHjfFW(%Za?Y)!=v?=jCi)#qN|tMlDyJE;z?tTjg2y3P?Ti+kpxSBki%~XEX0{| zd23ABt$#&zF(orc1yH_Crh(}`2#f|g;(Xb;4kD&^_K7_@T@+X+dPh(ES-8Sfu)F^8 z%wy+I{A`btBjifebH-XaLM(D{GVhJ%^p*XNTQ|U)Q34di3Mx1!2SODc6D_m%?_(SJ zF`@NRLAyDOh8DWICF_`)g9u zhkXmAji_ujW;IVUQl3djej<9W)QDl{+?@C?irZyIudA}$a;lmW8oMUdL%3Rw4_{OY zl<)MV(KQGf(|@fj7L!E$NwNvGB%i&anAX9H^5pDIGuvDX%(Q@K>~IvxU1N3%7Y-7H zB(R+f9uqpq-ocYC*=9@Y`wh7PP0AmfS@KNVt~PHuZhPgR%tZmHvC(2XQ+5jCP~%_#2z zhI~0?guK7yd( zr>5i~aYMUvN90<9h;eto=7$mdA?KH17Se6mE(7;W&P;|{{PVdZE+SdiWu=K#(Cf#r zG$nsZ1|YC?LMx6OxDaPuL{-{wnId-mTIYCMFGV*!1Ql*;#4elsNLjsK7)ol+ zMZ8+Z&!5=_-@R+!VssImuFR#V{|@WRiW|`bTcmcy@O&=v-l4yiSjR0;N{nF@AQepr zMR9D+w)-LX7{4E7LEeoll9HdyodB=DF8X;qvaR0JYJJn4$=Hb#xf?ri6;Yi4jhU1E zXA3L$jn2~xpxMARncK#pg6Qq2#htH5lYs3sA7%$N-kx(l<|-&+!K#3ZKlO%BtoBse z{@3eLICe~SI+HFIxMLhFtyThJ@f6J5KI3>V(yI~?)6|bovCg7f65X&INyof;+kAP< ztF!QLKnQ*Ch%s%7arbYSAV}cs1X`f-G$t{F{X`P_2Q(fY-gTZ;PNjIfU&nG!z$Hpi zpo2zKgM&i3tfoe2Cqc>S7@_+4&Pbi3S4MIsl&K8#sA6MYswyP}t)!7h(24;^-J{rx zp-5$imMH2FPho_QCMBxP`hvwK38tdOybGo3gt13SkJ$2Q2;lxB#tQaXc5OsqiS4Qq zlZKD&W-R(oFDt!8z`6@BP@;s+{G+BDb>EgAX*rXBHCgQ^GCGP2p1M{R7YiMsZaAe` zKfZpt>*G{g=T7UM&(6(z@8B2Wz!RJwhqfZ9uMSCBWp9yVqv??r7*)I)kxILcp zNnz)pXbo?DR0P{-1z3$<76YkW#W+Zw3JC3`y5cFeQlx_d-bi|lr9>Z#)>M9gCxMG= zQYK$mLplxOV2s0Ak#Pzb4oyTL-)U=#Tzg$!CN);fdSP`OGDwiMesx0 z#B8pEq4m28eL@wARY^b{KU#^1^Kz>c>Mk{a1r%W2LR;1e_#rjz!$dF=|1$JbqWZoM z2zQtDCt5Y%47I`y(4eWq5N81JxZ2Lsd}?)EVSy@+*j11b4)s_;TP7mmNT>Eh z0a(!HgOvu2noNXToGkW@o$CC___8@tQhP#4qNH13X-$UmLg0*8F(uN31ew#4<}Nwa zo%wS!GZiZLwcrQah9&XZp@gGF{)wfA9>TSA3FDr+cZNTSrT7sXrYg$B2*zY{W_Jgz zI~lQ%I4yms45VKx2lK3Zk=xBDGGNW+w@Gn`7>Wl?o?l!o8M-H0K8m;|2X%nI4L)i` z+-~;_q))8Usy#GbSiOl9njHl z(=f#{KDV)zZ_YjDc^@B?;!B3gY5CzQyFal=(RvS{*vQ*gU4CrK@TcN*AOf&3*e_{;d zyAld=L|Ho1vtS5lnsIE|=M#peLS?3ZF;nzP<=IA+2$n|D9()wdxkg$r$L%%4Z{3w$ z!B=|VU@I_XUg;Hp9lw?Ik=fQarK@JY;b-_t*2oxVhBn#E1{OwNoYKp=q-G7yDmfej zcw!zAY4cs@WaqV3-pTV*6)vbznRIdxJ1MH)9V9MtoZZx33{8ICD-pON7ZD&^QvVyw zY28QlV1i68@;Ju`)iG1Z2a~hpQvd-;t693`a^hxf{R$A%l9r~^0O7_Dmu(hB5t=Jk zd>ph8`n-}+fCv-x#{REZaRbipDHbpp2;hyrTO;W5&k(a5+}Ug+vH3DcP=op;B`|NG zgjWR>48}37EbgTTS7W3&nzptWZ5nQUL`*Qd{d^qSI*g@=KkqAH z^pJBAcN!%;_Af8e#RE1sFy=j-W>P>1uM`uOg2G-Wwt06Zm9feL=!H{B3o;cJZXZq` zx>?^?SGKw+6g=OpcwBCFytv=@+lBAC)8D;Euex7h-f9X8tJ{apBmF2cL4mwnt~a48 zGb(@Bs~5;EEZKsPgAGOjrXnw}Tp`gWe3^Jh7}d+4=~bX*&3eG4pUQ&Wy7u@5G|56V#-4dQx6%_&|pQ5xw zOdhWxYbv)qe+dwrcno|sn>?LI>riZa*>Beu;2K5!4SokC$E!8S(6*m@1CpNuTEyAIOGUZRQ~OYeFE8bCcYoC!y+r$bTk zLFXu7n&IajP5WTi>??S6Kp{AOO3Q;NXw-rhx^20?J?^%1!9VOFbb?S-niCM>6AFew2{x|*H%O2AL0CFu1cR+iAh9hP%KQ@n*r!oiCOaL-{$zj!)SV#7CXAranz9;RY^){R|}6F zGDK{;__!^^RB2SB0b^8o{mI>M4N1;CqrytEpEF>fUP%|(pl?dVV1Za+NOc_FkU+HG z2jz3y0(R*J(2sT+lf<|>8O7Mmri?{{n!B8dBt!sSpRu#ev+-<9D2R}Hh!)@rO4aAc zR{YjRd0<o%rs9MuHLWXIo}65kdrx zDi$;xNu?}Ul|^?Fko5=66?0}xZttw=(eHm_0IUHh^DsNm+3FL1ai@)LEQ&au8jDyJ zF=WXD$VlK*homEw3n@NqcC!fS;mIjBDgLw7~YsGPZ%#t+*OI)PP?i#P3O- z=*cZA{Ypbx-VvjwpJx;)u%ys#iHxRR&r~uKf0rm2%eY~aih%h%(k0q#WyF)qBrcj3 zsVlzvfV3W3;@?8QL6&>_bpzhb=B8r#LjVO0Y+w;;aT^dZS4xi@RbwR;yo{2Wvf9v+ zox$WiII6eNC{CK`B-?7$wkLWyjx3Z(l8RjUnKJ@my$yjvOd*YXnFJIe2*2R2OZO`@ zsn3H%^JL?abVLBc(b7R!X!)>YRY)=`lzLk%*p=4(-iOS5!>?hUsdKN_Y3o#p!L zUlIvh|XfZ%-SMo8` zUa%}zAVtgt&8T#`w=a#7VGwor?yRMRJOgZM@j-Q%ll*ds>B0zkpssfLv)Bire>(Oe@o@neOJjP@A9eD zY5V%l${A}zOuCC>b3($@$WtcN|?C8}%77MEkO6^DK8KPV>LRJ&}{bzW2`*4#91iOBZA{MoxJ8j-*9bsItWgy*=6idFnNiow-f}o|EbPyzoH2yG_{UvS?;x-?AK`1l(p3z8kuo z^}f#zm(!VCL~4f7UOJsm`I_sM!@{QL^UXToHoF!aXzL+Wi0xmF--&z)(lC9J4+`j@qSWY|AZ{LRr}_@>`Pho3spQ0OdMFCN}rVr2xG&9qK zfiF(%DlwnmsjG-%Uh{bxX(WGMuGTcs177&oS~0S8J_(FoT)8yXJsr?3Q3o>*j^)Yg zg<{Qa0UnIM*W5F*X~YsTNrgY_enO#SZRlfQ>xz)n< zRs(slHZkpCIr7D_W|AkSpwP`=)HH){^`!VJZTwV+6_9oc6bb(WA7an;)TfdHaf?b& zm3eo>-3Vu9p~h-A_dzwrYrfd*@?&mH2!!11*0{7J*nB><_6Maeq@hon;}%c&3dx%< zaC8*RDAr-IKTydgYcbrIW(M&m*7R*Ph1O1@)?7+!ytO5mx>o@wyG>5~l`7HzDtcOP zHqmZT>4-`Wg#T6Ei}+;L#7qS9gHZao0*?$elouw+yxRT80=i5DYb9TT)iaLzlx}4_ z_x?U*EN{Wk%8@F3rNsom9yd;`Kb(D6qe0)vsD`97&!nLwvHD!%m^gB_F6+IOwa)Gr zD{~X>bHEZ-gc5zKz0J^{nl9lo!VdD?<2X+IQZ!|a+;yY8B#3Jd`p76qp6jK*9v&ev zf{?wan2RRq8Lu&J8ZyGtn<}hNJAMIWjR#Z+xCqYAj`^}ziQl>@BgN|z{E|SAZkO$I zsePN}3rUA8_8amrI3Hoxq9Fw-!Ud_(SvtbPY;T4y=MZfF?$6F)$d~=qHDO}dFkL|_+p?%s#hdv~@`HrLi&X_sT^ zwI1Y-m5VLP&G5U5Yz|es<4g7xg0Lt*;y3pkQ*Bn9cDjwqvF?^LGPmm7fcn^wOF}Km z&rE6#ysG1ol)~e&w6$9D9xH$3x)Y2^7&LAwTZ`P6?)(K!jo1W|)f93OiDV)itH693 zBYSHJ)n4eG`1bB!>|I%6Ca(-6JvEWCd<7|9Ap0B$HJzhhx9Y;(!#}<{5~Aq(+vI#9 zj^4IujA|p|EUW|BGfN{VT&_Ssjr!^sX2#KM-r?MlY*f8s+e!vr>0vHP+=4J7j36{RtS| z)(^EFY_Xv|X+4hIp=~RmRwx+Qiupg&#KwW69cUJi+GjkjsfM{=Ej8_u%Uxhl8Uug`8M%#ZX_Wql5mE6{8$=@FVs#Gf~BLG z9>BUJU3QHR4K=G2yjizX5?@9a~djU*vp>QdXiD-Gq8v7jNKF}UY&BKxXT zQWFAuEAkoxMnFrK0vJXP=nyk6Ph$W{s;carSJAmEjRZ#w%>6A;0h-XV)?>UcPJK>y zEn}QA7IO|3E1^}ilj?Yw%54*0xR=mX9?fyCq7DSe3c;VXMbriyQFl|yZX9(M>GVxw z$u|hxAJhHC7M>II<6gGvsPnJ)R2~y40W~@?zRD|Izs_q9@{vNnCh-UxP^le;%(eo> zV~w8JR;mIKM*{+g`3xrc6>^jM)k4(A>mGn1rc$3zsaKRkTxyo@pGd3$Wb`yP)dhMagwZ~7lBBw*BHTxo3m1_#)PR^6Rbn6) zbeHkr&w>x@G$_@5*DkVvG|6czpP5fuSJGqdmnXHYPlZrjM3BN_iz@-U!lL$vb)9JD z)X4T+Vl6?jzDKM;*$}DZRGk!^D0esavi3|jN&vl{(on*uM zA`Bz#c9s8HLjRrV5iBq~6J!ysp3Y6r1@&zj8_Mj^KFFmN2!oqls61XMqf<;dBc zt|MlK`V3H>*)HrvhzI%7GUDQQ-h6=`T}xUO4q$bg1=q|X%Dp&CRDU|IKOaDs!lv&m zpCX0lUu~POX=^9f3QVsp-e08+I`KBesG~}Q>tJ7Nwr%&-3 zt-zcFV*b$Tc*O8s7apr%lx={x$0Gt+uf;j%KvTGe-XgO^)J(qQB(H}Pi1KgrJqVs3 zAop>%r}}$uHSOE?x7|B$!*ZuC%|OQNn&|do?)S8h6IyR+^@C6zc~ni)mfK>R?kE0R zj_cqL6ZeN7B0=ik@4w)gXD_ig7k|FKIj?-{m1RfTQcbN~86dj*$FyG|A#J*luM(r^ zw<~mA?!Y&`y>LqdWzoJL_nrnt&pv<7&HQ=&j(_TH$^40pqE1s-duGaRh`OQqm4iJX zZQ#nq4=XN%d(h2WI_;0H^A*#4Y&Y{n+qmQ~1$1XIAdOd3UFCT;Wn!m3R+-X_H&&kB z@^di>s+uZKY^ED4cVi2c9Lsk+dXs5^N-cEpCWj-tBuNAF1yOZx_IVfphyzu-rP;m8 zRsD@B$y%y1aYa~~V*VUg{=nCWd7CBg*MFZRjHd5iCk3a5pia*rB&Vj(;+IE3?q17d$J?TaPS6!vE$ z2S9?niRjn%!##MnA1*t#eYh0~}lY z%&GYM{r(MTUjTn;h-aw0v2Te+>sf>EMlbh=qz;iT^feLt^Zh&0ZzZUZ0I1;F^ZTp! z{yYL9iFd|(W8jV>dlneY;Sfdyy4E*c^}@H1mdSwj54yvE_OX&B;9A3SGvg1f!am%9 zUpCuza-ym+t=*SjG*<&ccUe8Ji$D{?nH1N9ICsuyJ?JwinoxShS=t&qstk^oE*lJu zUZEOW2FL+iXkS#k@fw87yN-Z4&aOE^|Nh7OcdOFWHk0GIkBCq=EacOyGDz zfA`1pH+EwTFT_bop{U>cc=0`QtVjxiRp^i;H^aka z@dap6cAP*&k=&v((K0X>HGGfCIAj`&&H(+cK2vceIF3HIH;hVyJ}`dY9HW*WBM&Nb z7m8A60qC)!zYJInV>v`}mXM67xU+IT7xOG8_}PC!byTvDsf1DpX~*E;O^M z`LwDS&5LwOdm}L($41J+@=PP>UC^o`*`&VIqM0&bTZUAYOuvXTaW84PrP~a%KUWR5 zrtce7J4=5rUo|8yO#gY}zwlFb?Y!yKFs)rT<#m~!!B}M5;^uizcFt+sI?!F4`Fjw^ zVflG~*tGPwVcNXd+sR?oroZ*+_G|Bz|NRAYBhY0O7lCSnKm%yD5pEC;w9KV4vM)xX z^qqHLW~=*2|NU~sv25Z1!Lvn%Aaf|Cq}& zoMsnw+Tz!q&3oB2oJ*{WZc~{ucwUxD9Tq;W=c6GsufA{RP46e;B6B~}6X&RD=}jYC zBNw-#v~F`}HOB_GwJRdwj4Y?=ZtvaTE6vb19;Z=7gpT}RP?N;y z12;5gRu+-EgA?>p!RtAKgGGLnvd>%?^-pfbd_V4e) z$xq*lucy@a@6q;e-^UD=&CHC=#Qa9H!)wWUQu2NZvq?H5qoYUFTKJoEjVpTJRxa^LF#Q6=^|tcNw^`tMpE}+E)5V#* zVq4OlmjJQKOu}q(hC^Wiy8Sx?&dMq%BqnHpMVO5$znXS$9x(B^2D&}HSVp2)qs8wg zOjhG=2Z1Ojk|@nU{e3AFQyX9qk1w@oKV%W`k3|khV7OROb0VBw&od6sZpq5d z*tQi2WD^#LJr9haLf8*M1pZusZRRz~9QjK?&m$c>WF;X}oQFVhT+-37=f2;c%@SU? z?!E5>c+=$mtaS-`x+!G7)t-P4U6SRkY*hU72mJMKbnmn29b#;2fCNW`3d3Hvru1uy z(3jNGjTMO`;RyX)>9V-gW0)wj--Oe7ZzGf?`I>F$K&X6m+azRW>qchdIv~>|`<9Cy zoPvr0^bo)on=nyTS0OUG7@Xur74byOpKH#hLa}0vb11_a2x+Bm@&btgkpy^&FXvir z$S~%yAmt8>d2v$M0hin__Z^{xfpGzx+NriO>o2siZocGRs{H_?O4bg)FR7M^O(7IG zwBGXZWuvg=DQ$@}LZPO3?Fr*L<@EyJHf*?NeYqBWxg>lxEv@cQiBthEkmNbAzP>HH zuGHD^;mB=lA_3Hfhql7pnYU+g>K(KR{amjTgo34RPn)cZJR@#P#9H_*o+GV@{f^6>`=Y(j@);wgT*9BxCEBU|vcza%g6=Z)ZC*21ZRWv2 zV26v$iLAk(*j=XRWs=yTwIAMuif~R_)!6!F+(ItKj;s=F7lK{Sk~v25wlzR0LnlYt zsusmj&zCU>S7c2C z=?0bf<0Yf3ob@O{p9*WRQBAy5Z@o^jVIU!kpdx^KB-1-dxKd&ByU7LP9!!4O(?wj4?m zW{}UZofv4auRUN~8>}0f^@TBODh$D#c?UHT%dEuGwGAHt*+E)X;{CD!;1{(A6a>mSI*jA!1Ol5@7aCF28jDU9 zqpRvsK@ZwqHM<5n6wVR=7rO_`#Az4LZ!a#YHK||zbgby}F#bV{(o;V^HAJ(!&C@@I zVT1pIHHnkbgL&5?J(tHmNT3Aq2)9u>m_yDmc%F9MFY6PL(naGcS@}^R_qS8Pak!h& z$8%3cK6`}^x_3v3$p1!TXzNQF2ChXL2K>nu)*OH3j`(oCEyM^(#vUCw4pYze%jt&E z)iHzJdlk{D+mqY07oKJ%F#TfC*FDd_j+ZR9!TGLikWTnz^lkZBq}j@qV##4H9&VyU zj800&tC!lAmj3GXheu%*Ld=uk$WBuoV~f=8*o1~GKGb6%XNm7GI_N;EukM%k>vQYp zvo8Pu!1p&WfNVXt9RLLQ&)q-Mze&JI-$|dwN#B9S)Pu&+-1Ogy|F`CJKZ%Kn3E&_3 zPx|*c9m`J{JrgS(D=RA#D-$yS9X-=eNH72by8o@c_#ZUp?D#YKpDwwY85>*u51#o) z@&Bs+zmDy{4eo!^)c;FW5p13Likh+<$xUIaSACnp<;eJPkM%vRMMGUkZt>W2N9yo2 z@2>exHo!ub=eo5TTJQlnYRykBSjk9=PJwq)q(Bv$`cN0;F9X@vHr-jpZ4-yzi0fB{ z33c;Ci41H|3~El?ytCm~b`AsCYvFr0(a~_Jk~d)Ii&JmW`qak#3cs8xvC{H;K-H3B zUGW*=b(E{jGX%CpOT3ZB2_=xhpm@ki?* zJk$bH_m^sB@+(p%~^)7g;3P|Y?JGBzwzU4^w8Sld{j_gOd&%h=|1v1)9C0}U#JJ;FXuCa9`M>=w7@8RyS~@ygJJPu8 zTU-771^yE{^bghepXomnGyT8Ue-=iDf9n5#!c_c+Ch;R70FGYqO@V-ofe`#fAz&j{!k__$h3mm|wxqrHC968nB_GQWEWC-?=$IjJco1=12hD))EGawJV< z=YXk*hm;-FTTR2>z``r9MP&TZH^%)Q7b9SfvX0ynhpQL|OboyySnxaZp3kyQVR3#d z^SQbV9+6L(Em_OHpK=449n(~?#ceadbv3zawp-;_8zjPK+-$ka1n}-$Ij1*$%=Dai z^+u145nrFu$f)kV!uHuB;D3fe3;{Yyn5&tAjK0S{U^wp zl*kP8LT4YMKsD+mkDxR_Cmlr83@cicGp9kouoSU+*%WWLF1}}-!K9&4n4emoLxIWX zdQUx%(aK*)4GEqEtE_gc{K<8~I(Yf-yww*ylnAdG)d8YFHgDX>y2OI|0x#xBz`fU1 z^k(4$T>SgdVt~X{kE|=bj5#^VzihMxIM}1UkMH5~T%=PHd@xyDi{&S{7n8=Jc}Ckw z>WsDC>Uc1a5$xR}Z8<_E>A&MIfrp3`l4}9=beRB5+$}x&r>KO;msh3l(+%>R6J?M` z&rnX}b)RZiGXS*IYXy>ZZ-s(s_LM9v?iWF-sE#pclQH2@<-UA;GJe>r-_zkTx+^lz z1l1MmSe|g%W38`|ET)HvnQPcG1g5QB*bfz?ypY6MH5Z9iHBow+v8@FHE%s|vSjK{z m1}T(zuI$J;(pzm_y{o?dk4*AEU-C~0{8Iw|l)!&S0{;btqC#B& literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/cache/psych-5.2.6.gem b/vendor/bundle/ruby/3.2.0/cache/psych-5.2.6.gem new file mode 100644 index 0000000000000000000000000000000000000000..becbf8075baf886b17eaefd0088edd3d1c7d361d GIT binary patch literal 39424 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

ZnvUbTPqa`I69)IL^$>zg+W>RvI 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/cache/puma-6.6.1.gem b/vendor/bundle/ruby/3.2.0/cache/puma-6.6.1.gem new file mode 100644 index 0000000000000000000000000000000000000000..4bf4af8fa3693609576a3bfa88d34f54eafcecfd GIT binary patch literal 239104 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 !lwP6MaA!H zG`CbPqf3N$sA!{KCzpo1q(1K3sNdV|dOezgadAS^yJ_Fm z#TdkFG!mH_Fe{(?zBI@Avq(`|11;eV-0sX_2e#M#1m1o zsr6xkG#pvSysM4&SFpT`1o*;`2{AGf^#lE)rV)So>EcJv5_f zIA$GCkmM)y&=>x2kT5{ZfM-BB@527Ut%FfY{vLR{7^Ku-?U1 zT29VNy^ZdodQS|Qt{XB9P429bZ)}i_Fp#%yk6L)RxVTtZBV^6Y3d%=EN2?55Jb+Fn z0Qwa6_et^K$O!m+TuI#hcfIHFN>ETxdOB(M_RdbP5}f$Liz}rxI<0DmK7E=Fe^cX| z`~I(AW(=S>S|~=m3~=l4XU|!ZzQVuRIXUZX;lwTdPq*dSJ zR(Kis+sw_)%?tsnOlR&t>wOWCku{rEK|iU)J+#_wr$6~z{8k222mdpk*R|#tK7d6U zY!zcjWf;R@Dk>_k>a9-?>PB^X5;uj{ufS6O?gh_&kkdU>sxLBKcagP?{(UIa;B-K6;3QxYO$VTiDo1PrjRUU^6 z|E~L43_Pxw|MfGvJTg8$SKPCb2_zr}*G#}%Q%iKIg28RumybI)_6(nBFX%!hmvSB+ z!BctMbFTk-6+nXUA29s~pZ}(T$v~37%;~>g4>+@jFXREU_di?y@Nv}f6qz#k~^R>F7K{ZA9R|5WHTBC`=P?#9`*18voC&M9YSOjxTzPJA?%PjY)K*N zvbh{T2N?Q8TH2NBR+zx1#K#L{Up*xDdt?sW*{n^L?+E=>gmvcqgjvHg6?#=IJnd5c zH)^?3cWDDSK-T(=CPq>z(y!@-m}Jbv3?z5Uy07qW6dvRe6@}LHQdbORXpY1J-CiJn z^fi6g3V0V5zy|r|=jVm94mAUACYRG_&i5uu0k>&?{u0QfTA;B#5>(*QJJZj=x0i>n z-IM3$=Ay95%gU?)))N{Unu3LisXv!lTW(xq_DBf+to0}ihXU{g#&)~e%G0W`09bDT z3~)I|(f7n$uTC`ISzyIKr5TBGoy2qd25XvVT44mOPeXh+0A=ZSHVo(mjU0&#Uphe3 z>xS%fU-LBFU#1)ggO_GCsk-b&U6?-OJ}p~_d*;T z(fl&{U12yPPAd}DW3+`o>gxsXU*Fu{9=qnokO_qKz>DhuF>U9k=o=6aAbi|%+!hjo zvY!rxLZ8KYqWfyot^E z^7q`wXNgqaBBeJgzQ-@7`;Lb)1WFc<0RT3cB2M8 zS?`KKqx)jqo`W90$ugR&JsLoWF;3bTG?74aI{(?Au226L?`Iprq{Rk@IuK_*BO*

x z)^E#SBHCBW?r(eJw)R=q^m1yx;%X451Ub{;sAVfxEe z*F&tsfR*Z$F&{q?i=nl^j%G{N657+{XjEq6qtvO#)euYB;57V}V#URZz{lE!*x62lQ+Hu=$rVuHN81AucJXgE zFWxt=r)h>6cf(YN0~%()xA%qxBD)EhhuK8jVZh1K8*h0_M?7Dh5xiS@V0#Zv$MZW^ z_MbMnRvr*V`f@vJ`w&dP>XYXo6u6SE^f4^AsQwnTf4|@9II(j3tx_&GBue*cLGAT! z)VD?fVHjiN7eUzk^!;nfcqNV2bjKZ0lf{O7`RA!OIu^F-KP%495kB%ZKHdt?Wvq$M zdRw`F;lm1&@oIi^9bhgFVmOZP-B5iX`dSz?m1wIoN#+&$P1oPYY>IS!{~xJC@qg5Ru(EKpa51&#GIe=t{r^PqhyQ#1 z2R=bT-v3$uflow;pYQ*#|M34({f9OL1VpAk^&etCdw>uS_;>!P|FDel?71CH?Iiy!MI)tGXiCPP0iHtAP z)7dgri_4lNj^odGyLefgCLu=Ir?-eaqjWZ`Fg5|TzyS}7?brE^gU340kg;1n7vb`B1QAApoGFfdrl z!-Jn)Ag7=ZiZi~tN+SV(R3%_F!m6pS`T8}GK^NQnZ%Z63us+&4IH;?t>Mj@5*Sp!< zt9gDgs8ejz)6-iF)T=UjLQMP((i2A|{;j3O!5)77GO=f_uCBadn>#yJ=H^4Aqpvj$ z4L{!SKPIR*eE!^A0$xrQAO(oPAS!1!20n1)cd_A8iPigFInGk>^YhEPMZ5$C7MydZ zuC6{Sfrd-Tn{#!%x*v47*vKKq$;qj&>F?hfjeC^B-Qs`S(BLk=C!-LW#$#;j`R<)o zTJwqX=`RJtndxZ@Ng#2KIVvfkjUyri?#AFssUZ9gtA^C==2b>DH;X!GYHF4i6*X}L zw{VM}61yF#RcTZT>M1M0?j&;8x4 zTm>#52e=W3hK6?Sjf{+}2|6!=S^1ipGr2vi>qD}l^JSjMqah%eO^%HvM@C|Bz#AYGAR{2aC-(o`I01y)%*>3OYMs=ZI{PX%9v&7k7!4u< z{57>veVWS1O1qxk-bmbbYy{pT3~{fMwT|xY?(_5WkK&%xZ-Oq?Gg-eWK1_aK5q4bC z*VQd_D3Fs!2>hA#VgUXflo}dwKQUb&?){1Kg!58QoDhQmBR(fTFXKi0om0(0IJ^df zo_*pXix-Z-1)(BH@Sf|HoR+QRwM#*rWFN_L$-H1K=!!=~5DbzDFe4EsKMLBOgA87MP}$Kyi;b5&ZIAYdUJTnjXRA6!m3P%;WTI3?fX?yzR>vl7Zb z)du(lpC(Y?oBHrlf29n_4dsx)r!qr9Ailp{4^b20*7<5pLH6U~P1%+{%~!t0DSbC3 zGz4iMpKrHl%OJc-FM66)gtD)s@eA>wB4%c0MSsAqsquo;4?!K7Rma=9bH<2Gq9nGU z&-(}ne2cI1>Fj5eD(+w&PLFo$v~KCd5Txy2QjwFB3wk=1H$SG{({#kd#5cFMt}ZSsZT@zW09XQoyv6&h zq`{qCM5M8`^{zXT==Agy(9F}*)6vn<+cNdR}$)n4!Sar)9eC?(WRA z;^JAr{hJtuTaZ&lMMv|zX?l0GBMZCwKd+C*?a(Es;FFR%+Wu;L zwL4zeQMFuW6~7M|%TqmUsIRxay*}MoX!AVIxd1e?Qp*w6vLU-@OkCWAX^kIzdcnW_ zug~{%8OJ*wA$h7$;X8(ew7pziv&HCmp5L-0gn@xU0|HZ$l8%*XFflPbI>sbsN#*%7 zxhH@?1Tar|6abk-1|_$XsdC*!`EaYzoJX3El%DO{P2=RZVQ?G`B@&K zCjcV|^5Ob?9MnQUmq+-5F0?U7ClOITdU(^*?)&*> zhLX>fridsat|}{2`g}+<4f7k=wKR_s3D9P#=OsOduKI_anelGY{}+4j0nkL+1_)zC zqhjx(BcOmn=m?<*2ntG5zy?Y}GC(BB#7sgFL=gq-ioGFLz=n!_QBmxuSWwsA1+jy@ zac`MP0+!wT@B8-dzgu=yGV|8weR_Gb>})_M612KER#zujH&|Ea>~@_i^@@7vfL4L}=r7CS`ry$AI94`K2Mm|1r!)J` zGs`)`tk^Mok2+>9Gcx`(RR2c(T)oS-kDuO`kG$XQv~T8uueo~Cdco=Bs54Iq@;wCn7Lr5k0Mxi^5V#m zNlxaI#*bg)vi)Y)%moMY;nT*>&dv+{uBpzuydE=b=m%2+@uaYO6WZlyzT9$VO+v1N}EM9(M{PQo}Gp9c4nKv@v(b#k#r*w5} z%m85c)$EuepS^@$+m6V=A3*8wjPjJb*K9Mf|Q*;eKK2IsWljt28oIbGLOVz2EW7h zZN(bUYm^Jl{WuMX^ z-CLfTTg?+SOA{>R%@aGU`lCJk?u2XG#?azMLgCa=SxerV&Fc}QTWmQ?a%FpS# z(oS+nW-H_JyG4Ar&+lR`?CfG`SbDZF!h254$WCynvxR>KQ#9&p+eCy%XK~C$BsocX#54t6M{xK5|->zM@U~>2oPxbz~haN4Hqu@nli@c|Cw_PtR{wSUy*=&Qw+C#hpUP4tZ!yyZZT~!&04(}q_@BFDMv!DL-3=Qy zfX}P)Qp+C~LJ)7%Q|GL}>7%~QQ(C@E ze7RrucIVUUER#OI{ye4Y)1)uM(yweDarx7)%=wefF16}*dCH5Ff|#pYj(AO8yhC_0x#rsk_?_~jMs-fk z;0W&NWS}noa_!{gnr8MM$(X_Jcs;LfP#6&vpU-hoYO6#vdr|(%FV;K ze*XAy?h3n@6CE1&{s#T`DgHIE!XfrfVZ!=>ligmMmTo0lv}(5Wn<1o;+Z^*hi-5ihRamO6Up6F;|VF7H&?Vkr& z@LNWmUzx(=&&Y0M>^XW5bvJ8Imkzh4rabO=yLayei#?{#$xF>cYi!`N+{*G)`)uLK zIT6jlkuT0~kd?OIIeWsIjt4?)Z&~>z=s)UxeJ5GctRr`Ov9+=yaQ5n_uh-=b*ix_& zW5J`5Tm1CpG6!WvtKR7ozr26<>{`C+*;NPI4Bn})ma}H7A(sBDUC$*q3?_EDb*Utn`tfzr01WSuNmY`a3rp4DIJ*;G|I1 zyLtBQ)63%vy=~_$dOh0Z!RLXp!JMzZcgT#sA2cOs+}c|+2OV3hx6zY1fz~1EJ3l>`X(7Afox7^F>F!1yAz)(yd-aZf6AfYh`!#9 zKe>FGzjVH7(8ddE0E<6%_|%v7)-K9W14Ml z%hm;7Gu}@#Xm!UUVE2btcMtE{wea91XPpYSwZ6N7I(=-!j*XsPS=YegA8sAG?#7~p z$I5nY)Elzc%>6_5uH~s^fx2(QKW=&=99_9OYuvSst|Nx#$9(*xTBATBZl{t6xi*+9=uQY41P*K@x|BM28lgv?T!k!lI zO?-4?)22;HyU!&p$kBVsoPOUYXPd6S|H)puDel!AdQo13!W4s*`%T_%Siz|zUgYM} zyJz;bd=6CCs$TQfG&@l2m#t@gZ-Hydtb6Mlm+uSNJUl6%-ukscMWN#HnUAjZHhS*J zExuk5)sY*Pu}YLN{u}@HNSCXYjb3#y46TwRBtN*5c)V+t?4rT9P{`T(L z*NikE12J?zO0vsQN!%Jm&m%GSJp)j7cPcztWLH>&RY^rkP3HfrAH zaEsmi_k+?L;a7Ldy7C@I6&Ws76wY7K=1O?+l+M8Hwu`#ee0yeQr*%i>kqLX8C%ygt z<;bJgO}WAyg32PlU8B1D49;l$U`f{ZE*)~uwl((mJR>dYliPExaEgENsEQ_Y(i@uH zdVR`ox?;CQs~fw-m;Z=+)$_!=RF&|ZBKyegg|o~`3LYmM9bz%P->mrWpFWOQ#%p-F zU-yllW-sB6G5DZUcI0us@AS$Idcc-@+qlqFuZL^cy{Rp(&RbNLxpPm8>OjL101a+p zMbDw>E%PEfH`pdxCzVScT zI~>(^!p$d>oyj(7^C2kqe*ZA3qspN#Et4$enY3t~_-McL_L)PekY-Ri6s{Is^NU`X zW_EB3eW|7OPP5X*<@XFb7aY!Oke6;R`7`_W8-B8bveCyE=>vmwOZ$#4p0czruih(N z;{yR(ykd_4L|fR?y{(hlecV8P$_CHqv`gQ@?%Jr`>=k^N5%XIC17^Vu^0@#Yb%{RT){9s_3Ps zyN(Kt$}hOq`I6RUiBL2Ds85OEWdXB zS+`y-TKMQ+H6OF-Ywu3C%b*1wc)_%)dnAV@R9+8+21$Ys&en`YL_^oM3x~?5daazF2$pwz%O#UZ z9^b1y4J!)IF9!X*vv^4ppPbz>={sGsN80sn;@ku6YpRzVZeIHNRsWh#`~OU=-l%62 zb-sCG+qYpmB96a#c=Fo_aV5WU-q1w@gRk_c`8X)cL<#hZg+qM01W!Mn->2C#NkVs9 zz8ld({BgwRg4Gk-JAGLbGty+wgQAoM)WLVd)AjT#%xq(>N*-(%w2p|d;&Zv=;Z zync}GnY%!4&tAJ3u)N~q)3VHZ z`?JH}x_)mlGso|b`0rm^l%9Ikt&*ELs?Fi_#pa=nyIkB)m-{x1f+8L$_HE`w?T~gJ zZRydbX6xCV4sPQ+%+h!2V149j@05|E$!iX9XIGb(=CtfS41Oa_PQdDIeu1*wFIz?x zq;+vTu=rK`MU#%NU-RIN(QbX4$XVPY?*Rl_NmTJ~xBc;bQ1z3VoQYrVlVniezWw_v zb6KAi6}(;noK>}I{&i1j&v&B+K52hA z&8zh=Knqg}c35RUkD)~T-}A8!jwQ=iRg4ur^_J^5?vd zo(Tz`?j1>0z1S48x#DzMlN|YpvYR<0^2h#Z|A+Ev{k^Z#yc*8g?%nh2dG{8NraBKw z@Bi&-!1FNvdgX+V^W+CVLQQ?6o`hG_xXPugL+>h1j;>V$yQ3`wzdk1eGs6eg-_k@` zbg9Vn4q?!va-eRX*H5b49v++CcF2$+hTR&)MuexEti0CqxcpP!Lv25Qcy(Cuc<{=+ zF$=lL%l58az67X{4Z2@*9@5U8c-D;49a;a6rq-4^@6AN23?F?<<5^w%>2>hf3sk@H zr9dH~&CRQJJTU7V>8l@6bloVZ-nH#TBc@-QHst8KbVIImIShT{j$Z+W!d zXMw?`k~8=EPAKSJZ}pQb&zl`noCgpPACE%Qb78W1Nt4bw!!1&)2b-!c%yDYjetADC ztE5=BM^d(IYO^ZCL!Y}nOghW-H;aSPi94epBWXBT{{DE!aNjit z2N#w0m}qaL&o`Rk)GGS)^TK(ZCm8fMJ@ZUw%&C+E&2Io&x?*~1)1chqkfZajKfHIe z$%a-po7_F7EULey)6v(C+v56WrEb*Q+e|gDbj&k1LUx=NoBUb7?v)$y-9xFbhC1teANDGUK?R#pc@x@K%Hyxg}+SJ9f-RwJiq&LI5 zXY04QNEBD;H?6q2*W$zUKwX!PJJ-5?`S5DQI>kheB9**pvMoL|%O-j*D`baB*|ipTvSl-t z*1Vu5ZSDb7A+BISIW_O*yyMh`Z1>icI#l-1s3qp18^0`A(bpl=O;2ei(;rc2UfNm5 zDf;X3*W{e*cP;02cyUm%vO^`&!K`s$6V=C(@b7K%wzjIYe*WhU!_~ak8&AX!DLIm= z`!qkJ-Ttt4Dfy{+0~Wd&9X{V=7`LTmgFS6(-tRrU!*KB{lNl}C4ty=k3+frLgxfPe z?U>U}+PL%ifQEDEmLH5J4|h3zFE7h;XD)ehtyfR0++$rM+qR}k3NBN}?iN@!e=(eJ ze7Z*OQpL1ky81C6dhUFYvsW75>eHN$O=cFJyW-wY9AA0CcE=RA@5c454AbAsyg+3P?v&%T+9hFBBxPc$cNQr|ymxO1{FeO~I6hMk72i&)z0MQfkr$BRZd z%xP#-AU=Ao*PV@ejn~GPuZr9B_N<*#*T#w|y9k?29`hD=>EOPuqldo7tP`)2KR6wI zb~3!4?hVe+NiHVOs|Hfhm4Ssd$w?>mx7ajXTQ6c7zwy3rX(RnEMtpy?ecR~=x?MAj znk*T4G`d%D>-=8MJs&mce0}^no6K%+_PX6m{n~cY`p+92LV;;K-=SH8vs*&`rE`|^ zT0JuA5;{MvP|y8YOsIQClH-oJl6?vNujV{`H+Eagq}-?HHebulOWms1ucL9k&Zk+P zyh5P5Igg0k+Jv6%O+=jTQUAfo$U!btwTbG&9nVK|bNzE8HsuX)optx?lYU=!zC2u$ zT%h}~Phq{L?*8*SB>Q$$1@3d4yKXGK>gBVK&S|IiezrZh<;acCF7kUtIW<#;)nD+y zvS;PJ5nCtf&pY@z_LkAXHrt8h`3K5FLPFZS%KpA1)U&?be8E(E$qV&JVkJ6+25(}MWb9`74JYAE*6SLuA*P_kcAn&mP- zX!D5tC+&zM=dVoEue5z1!Rwvr!L8V+2gKgOF9vH>9c-6O&imSluv4wyo^iHK&%!A> zB}pq*I#@L{=zp~Spdq{4X7r2!oW|wj_@h&s9(1P~C-K?kw_$5X7+ai~*LvC8D@Vdz^i)l_ z6>rSrldtgd2UwbWPpBRuc=NbphQ)0l_FK<+)1PlKU}9uxmi|Z2j5eG$r+Ph_F;BOF z>F@@sCTqK{wNdsR(>LGu_!NWE!TLi(0hMjkJMzkX?1G(c**2%TIvhLI{o}#vn@cv- zBibK13>MUL?GrM&iLXcZg**3+oyPN=@?=?K_v-nr-e(+lP!!)g*S+fXF|+E55nBs< z2EX_4pO%v~fx}r5e$>xk(78+Z9DK&6&-?7NVtmj0>$;c*cbL=k;+9oyIC&?y`qur3 zgIh=M<}Azp{Pt?y0Xl#%?eBN1D1sg2k^%2Np7$pBQQO1w*17b&R;uqO3O=)8F{SXkp(lx zXBfpV<*E8SNxv|=Fe;@(v;2eaM_+hwV|tO<{7JeZ*L^+%J^J;!B$#VBtaHdfhefuV z2O)@DG;zgH~K~mT)*T%``4-Fp?mJFHt}y&&$s^S?qT}lJ&RKIx^`*N@xI=ToS7~6 zhZxit4NSE?))BClyi|TC@p`?q@ZDph@@=NJys_kYbXf7)CVW7G!^QB~`ji&E_bh{s z$+9Ec2UqiS<5xZF)xu%dnSv{2M=Zhf&9?dU?J;U0E~BFb2!$|ug|>i~eUGci;DLj%_4vzSY=cCsDE_W-9yuEU0r0; zV#Imh5iOb-PFL9%o}aV*&%+ZFujePX&)PlVNd2Jn8-@3e==NB+L2#!qVSYhcO7N-r zDJu!{^UwH;o~X_@TzT#Ob=~e43bOWn7#oz{L`3bY`Tpfu-=nflry930xS5)l3b)x- zZto*$nUa?T?D%bh`LFI0iKz*xI` zCnuxntFTisRm-h9?jO2t;Kki>ukK9OJH?+iDr&gX#hgy!1yLn*YRLIpyCSCL7FSDe zOdV+B{K@OYbE=c~kd^uQw}4jj^jh!x{q0lRN3I(6!gF=R$Sj+_rK?}wGOfI@ZM~;? zT2()XtfLt%*L!{HzHMmngXh-^-Zn^Y*~35Dq;bquQ36SisYW#Uo>i=pQ&frMq1o-mne4ZsaX%qwz=yc-PP4@+@rlO{3ey|-1Pnv z#UGhfU|O2ObI2dSTQ~bmNlE9-SyP_g8YT+1-c)bkiv0=4=dECuH z<}X~A-ul+C=1w9o0yMBTZQ4{3HfD^p{PB&KMWa@X=yv+_@g^2loF-{j-5N(G_`9eq zRSwBt9ace4=+@A^Re!jyNR{A9zM-If#HR#1mN^)7gNf56dqX6H~y0WSKPyPsc+ z*ypek-s@?l{{C{ZQm1*bC0N79=LMw);$EHar88GI%%o4BKId2Wr+`5nIH*OlIn9et zSwr3YH?fb9zSy@v;9|B;ztd#N;xPx5P4(88+=AZEeZrG^LFvde0&QYOw%hh6kOSwo z){1^KKl$!x*%9nzbst@wmH2Y{v0iJ}1DqQhKDGWT>TaQ4V0va|8|SW7TlLOXoOrf! z8FrHcGumBHE2I%#xqZUBalFH?k2YJKROPdvx8K$L@S0EMtK%xmrl0us<--bI*oRR} z%;4#@Pu1o0c3{K3?fa_q(8MoQ8(bsLcA6tT^1kT0UCdQ}c@7D5xx15UzU{r696Ee> znoY{rR{IC=O2TJ%vN9OaEdS8wO@?N^`jwktRIhb|je0hqzoX(&UQkZ_j%}lNS3aEE zUv_m%=g>|`OZG-ztZzO<9p5vq9>)gqgIvRm*#T;KmG zd~sv9VPL_9tsK_vt|IF7xY>a-kQg`rQp-Vey4??6!X0yuv+2ES{A>QZ^szo4wC^Y#KN6UcEC#RWoI67xXEnD_W7#EFjBy`iU1{+H^hrz!Oh%^mJPQ-d9iZKBRkEnoPypiTh9cx~E+q|X-J9OOEC zo5zmb6)^twJ@?UW7q4!&1ZoxZa5uF$XjJ+7aF2;)n_Cas;kSxs7iZqCCu6KR0j;;x6x&s|}3zbD|H-?BT%t$MEN6>zeV-Tp?$Dt0D) zQgm-U>5-Qm3SZ7zKC@$wgU`4_)1#8#%zWF@AtXV+cR*J2A<_4!u=s#&+C5|2anZ2eq7E@e&52Bm+xLs}_xL4|=Wf`GBP!?Vv{|oLahN~vq@IPHPr&Yy9`iPv zymL(c8oyK30>)u{N{^dvnsYA8WyRw6FK%A;KE%lk8`^lx^kP-1^yZ%9BX(qA-dfG` zd?tEec6!j(_ZJi2RZeSs;BlGzXN%mCWkxPnx^Fw0R=TafUcH5PvdhYWeLucQwtk?f zp;t-Gfeul6`ctLLyAEYXf)SH;tx?1zwzAc>2WAHrJ1@-*`OJSmH!L(HWKqrWmLUgP zw|~Zl)T0Yl2Hea){C#;3tBE52yZzxnCBgy}p{JEMm%+OqWX{^8rEDaYz2ftGil^IpFy+C2fsfqbd0>V5FpvYR$yFuua0Mkf{Z^ z(ufWjs=`CaI}Li(4r7?M{$6waj|Kr=Yfa`nO#QxCr(TonCT?x$sm<=sw%@8GU&pmV{m zY9c>#v_r+`Fm8_D+xzldKjk;OWxkcS8(d6Lwbq9jWd7yvcMp2`F}kDSvEXJXvzPCu z41BicT%<7e&UjL~$*E2D;$cfa&>S4YDc#|?T!wb4h5_*m(3>`i=`Wi!|FXvvc+S~=L$f83rk z(6B&y|8!(Q>XCb2bd3`aWdUG)O%_k7;!u52$o_DS`p)eeEH z&d=<#R|)}6@H}&~JPlfZ%h}Q=c-51a*Y`q%X{B$lZft&HLE*XtSGSO5A3m)e_af}t zwZo3zlJBazmM0*CD;fq!}lXLOu;Z^45WjSrW0E$rwpm$;|cNzI|J26xVpdw#hkd7KvXk`ZyseB#9d}Fthsd zihe$-F@5*6)yWoj@d*j>TD@+ap-;<}E#KHozHD&%^mJGM>2JFzxKn$n-oPkIXPv%eEG8e$2qjY>1E>;X~Xv`;(Y7r z{5jgu_w&b(@dH**i^~rW4{y-v$y5j9Rd;4Mo>%GUJb(Fe!i%1bSFTz`O5NX0ZlOwT zYj9fJbe&RXa>C883rjwH_^@EXg0Mt>dHpf|UfcRP82dNd&_L%N^=@8F%Y<>(iCi7y zo~2&P+g9zCWrKr#GUQ3#>9Ca7acSj^JDAOV^~bB^ZMI8;c6>@oO%F&UXI`qOv-p&8 z`4CgbSM}s=R;J7Pd&M;`J94BR81(Gr>T3E!#ei2^d;+?>r_N1z{AS{Z+i{H_I7x3# z2+Lc)QEZ~$K}Toy@`pOtV=unAJ5*>y?*uKK_?wBt7Sx+Y-OhwIy&!r zpD!)_Hu$NIj`#RUlX?^t6`opoH!!3R$x z=qJgC^|+P)%A$Eq>r=rWuQa{CrFeu+(UH^dCTv}}ZrYCcXD#oV*$47;bQ*cOo@-L_ z=Iz_y!JoEH82TOXm-X|M@$nU_s8`VohaG6U;l>{G)xKX{3Qv}gPU<%?U{RI0-9o*? zjdUEiIRRDMze(;CCl22nGUnQ-v9mtt4iPkcTl|OB`2Ux_f*93*jT6KQ!YMiY(qEb@ z75%5@_*ZnLV=8kAPE&siU=h|2%`nED3SKiSxkPX@NyrsctXKrbiWNvyBuxkuBtgR8 z1xixH5vdenSrj3biIrl3L_7hFXGREQB4%Qmh>I3WNJ62K$zV$*7*ZgY6VZZLl8{jZ z85v0mm0XS=r68$TQej50OJwGg3KG=Y5zD~tXp*2J!LQ)G7(SA#lr)#aF*GECRB}0` z0L#+AE{X8+A5QoSq$KgPpCrPQnQb_n4SZ&PhQq-zaM-4tB=g_?B=Kr}lIj6 zV2Gc4_|OoqVWYx>f`|F|4+{5l9~tiJ zL;?{9V4+9?P(lDuNleq=6-G~ph_z5n-Gf0jKyv~Smjek0zmkJ-m7p&{DinZVq$EuX z0A)eqp}=SgHBMs81vts)^Er_eBe zAYxKTM2KZ*QbI}6N(+TR7^9L~M3WK;#Z{;{97x@G=ay&_zdLy`&F+p%gg_wHft{7L zwS$8OXqutnj?{zy3f=#5bbxY}b&dqe2qoq{1ndGfEu};xm&-+9M>sOP7KZ%tG=2qa z$Nw2<{+&hDS^*dpaw|eEP)560SXtZH+S&JWa3l;N$phx8ptafxRSF4V5Uo_oc@`ED zN+^&-Q?!!jXzgfiln6(dXuvE%C{RU3D*<`~pdv)&5#GVUfdnZbk)+VxECjrS0$f@F z+5^OfG~q}Hz?R|w2}np;lrox2n80y)JZ~_0AXpWt@Pfmda{g*7U?-0MpElwRfl7>^ z6cUl<2`TGBa|k`u~4Q|3icf1QuW@q#{-e zHEc*KXxNMCLleMwp=2ZxLB%uu>(Vf8h&g~KDJNwjQYI8b4Z9D)A2*&)n1dw%Rw4xo zv$;eJ#u`V1LFGsbfXai6Bt_WFM9+}mLruh3nZRZy5eY0nG>H#T;efD3h82ecReM7q z!{rI6F;cEDUx6dSM`)QMu>zQglp=vJkqTl+f>t3DlvE_Z-9>{PD}Y*P0hKhB5)4Bs zq_im-oK}f|0W8NOTc~IS);KIkr4Un=dJSL%&{e?N5OvIBxP0|^N=hY+t~(l>feU-F zBYMf8z}MOr!^qXckiuw+Foy5KNz~TGV3b#ofidCgO0WyW0|L0ABWE=W%o-SV4`?FT zCRdP=qyiitHj{s~JgB8Gx-~fVAgHctjmcW+JfJMIm?u~3wR~tYfJ0}F2-!rS10hfX z6r;d6VkyKW&M2TnK_`SjLQ|k8CD)$81U{e%cVAyTGF0jXVAZrKT-vYar{rLIPA~=b zN!MBR53QLdNO1({C5r_*7{nQqI6(r<`eu|s1y&oQ zG=u{w5~~$SM$%#`^#*5b41Fp9=mKES%EVG&bA!piL+uUF(UeLeLS7bZ_#|?g8ZbP< zfZ!3KoTg2|qoz#_0CgGg2m=eKds`?eVAzNyw1r$jjRU|jFhgyCCX5=1NV$YcFh?Kp z8-*$&Ash}0;0s&8&s_GiRuiBNqt_Ae7w~u@r|B5ZL{_^eJV>BokZSV@+DiylkiQ@& z77z&(FyDcCqDEz?IrHF=29X#W6iCyDi&GyC3x^1e0}9ZyN+toeJ684uKs{F=?4<~n zgNT(qwT9KOAE53t?knwC!S)Dd$6ABbZJ})rm;fUPkg8IGEC$#K!Nm-kj6#SG;BWz* z!M>DClJMgITK!pyi z(a{`3K#oMIfE8&4Q;8L1RHhTy72#jo|3BqB~om`hAKO~o#jO*u_*bRm>5FcKSp=SuL4_M8U9 z7$-tR0g0oCfFu8O4dx21Wf+Oa{Ec;h`I`d4@b`v;BKEf;EDB525ux=>NC2ucQCjTlMSrum1N>{QRG3s{c!u|0w;(s3J&(j0A@GeZ zpS5+}_@8Y*JKKNh|DW;y4^baJ^2ZEgTvvhEVOs08kBnfhhgW;Jer!g>QHmHC8!#8s zW-#lDmXks;=u+Fyt#Rl_kO>sfGLV}Qxyg_hElwduPV$5}K?3wzMUl`6DI?>wr}9LM z2f3-DDCo{H!2Z!$Z7#S5O!(n%U5X~AvD&t5Jd!gXKT4Ukd9h#6+A_8=fie-4A zPy>pl;_yz{MlcfZ;~&g71IvaJ(v%c>#mB3Fa!*K+Z!iKpg$n~~$IkOeC3KJ}Q4m2O zfnfybXaf%c45GjS$w-w1=!Gh!2(B8Ya-g{(peQzTLLd~9a^$ULCZpk&p~FldBP3u* zIGspA$>m^Bwh6%`&M7E~1n0XzsDYmD=&S?^U1oUg%T!=;~}8MLg-dh$vGT%npR2S@bC=T{h`b|ff`$c5*3UKqkRF+69WMPzk2{I zRSt8zC`E!9>JPVr-2DVCma5}U(8(GnRz{;$X&j75BRoXRK>$B;xcDUc|mh0&xCk`Y)5kd3hdMIHJ< za2S9d`3dCUFtvyiLXdGrqhZieL$z=nz+MFbgND+?^R?uFn8KlX6lX9+%Lv8r{Z(h! zoQn??WdxX_jS2uFD`0F+Dp!!vFxL|x1kAmR6$4Uco!qfNxj-Q-HVGM^6A^*1OY2aX zGvX1*l|OJ;fFH7~dDdJzu9dk!B8NdkLv>E7Tm-X5;Yk6mK`LrF&uPxE5PyJAF-$XP zfx%A#5#UEEu|#AZ0WCU1j0x~WQPQ1UAdG=um4P6P;swxYhF#Yr>Icq1%35sVNMaBv zMN4P$Q#k_y0!OJIGXHXcO&LRQEzpwKt~hoHM@Jz`2r=y6hYW@R8}g6gA-Mz>twauZ zn@Ucg1Sz<5P56q933`nT3<&ZfU=9>#fS+eA>k{Xg5#|(O$wmL+n29?V15o^VX5z9n8Ei&XtNu>ZlTL7bA(9q-&FnAS5Lhfmf zzI_CSJ0P*b7BneAu@D~eq(}uyVYIIxf|Sts0RiXv`3MAH;9$YvT$#RF^THoVtzmvU z5dL9+_v=RNn&A(iQ>6f)qC!1``EPd1PJ#F!k8noOB+L|{WN}qDfM=?;W^>Ivf#3}f zpC~vE0nKL`|v4s~Q3hcgh6D3V>#KxUaMqk$-hik7PY$3#gxK!A%;cnEN3T8v}N zfTN)vDA7+XVsL<#MA>TqN9BOTpeg{F6#Ee@SVYon49ITeNPurJBFRW6K^^&oa@CN) zXK0p@bV%5tv{^vTp{yWB>(b(I>@HyvIokHmWuS(A2_=+D#EqgTUe3LNZ2b~*S24tlq?x|j- zCWHvjjerNotcOTAfmJVShZebMn~(qMjaPyj?I z#{%e*XkG{cGd3Fsb0@SF3<8L7SdeN_Dir}e3eaExU=$;fjo5}5YfeDf6v)6cm7I&R z$gy@0^g>mH5+;#=y}`L~AX=^81Lh?stkI-4yx&qFh0q)_Jed%%KN+Q>ku-g?-IBOp&o3&IucPW=13n)O2g0 zK^lf?)T?1?41lczluVHr>#OLfND*o+mc>#r>iy8hwO6agC}u!y0GTKg*yMdCH$^l0!j3Jwd< z1DYqOkxZCS%XZT~O}P0V7Y->NLF6a$>la%^JOJ@0XgtEI3vJ$q<&icm!fGR7bS-;M z%~nu}6EdR^RbmdoS{}8fCR%1B(10=CL&1oPK9Ib`SYOvz#WpsAD0pMWq8Cc6NAO0I zVj`%8Z)Ol048S262Dk^pf5AqjJSdt4gh&jFS^&-hqQhDMY=FrQ$OG0KR|$ahR+0=v zAxmRxRM4gb3I){k0i>jIB}#ZlseC|Osw4shFq;LKzabkzBZssP5ap_nNR^EMiYa4O zLoq`uRp2w~3e9`K?qN+BiIT#g){Tx2VYIZ?=|mv(VKoC0JYsPqvpd)hy@xsnv=}8~ zC9;t5ei0@zma>*KgZ2X8MG}&fYed;k_y7%y!qD;rIM?Q{7&OXn!wL_ECp30{kOpwh z7&tdlPysk=NgYPz!NOlD2Af0z5GE~(Azy-KCe-&Jji5<1eg=k;>qs%g;(v8o$kYex zk_)1+-G#^$a5X^D8g8g&rD6?dLv(^186+&{`#S>cw?YdQ1Oge23|%PUaj}I$4K-jP z8nb+fV7j5DlL|;75V2UFLIjDFO$Z_x%S;u(FoD(~wA+wAD-uVdd`P7_9aiJTz=??n zL9jgxR6GUTAwC75Ysf?v5D{fU1se4)c5VtW2%Zv)NeHXJ1ajriDs0eOCF5FC{G807 zfQMPN?Ad9-79Ag>&jC;(na{d{w0uWm*3|(k*Pv>M85VA3=`IOLOv!`(a6|GV}d3z>f?(=ZXfK+qFIkY zB;E_)puekc5Ysdu2McQ(TN~^J8v)<|;RwzN>gc%QF97jl?4KcgP!|qo1my2(#YkPi ziVK0jW)TUoDi`3yq)?19{R9ydfDUv*8bpYr4Af0X0T4e>PbPw}-2g{|ZZm846ren@ zL?;DT2;283tnJWSGu$1uv1Oa|C#);s2h7FZNr9vPg zsmMs01qm1CXyOAQP=W)kZBhaK1-olmRl*i)h}LjZQi@ihieJEqMzPtNNCQB`WDDEi zvMx9mL}~E^mipw7_Qf)_b_4!ak!tY#I1+@ZTq?@X%=}>Q5E!?+a0FKev#J2X3 z5TBqPf;NT{+s$h24ax#cdbUgx=p|vftC*cr1g60o(557S+_h&j#@wjD~s+Mtsm4VV~bHA5*r_ zm03PM8yX)D?7=__Y8YT87$zppV0Ke{Dr{guE8q7AOh?N!VRZGL*ki2KUJ67B*r*C> zh!7BnMQf;D4h15TI3g7^XtbN-m$<2!hCBctq2vkXl*}B5ikL2NUbYRkLp2UlmT#fr zG>s_>%rC&4z@bkdMF!Z_ik;Tc(4nhdBwV&9q9Vv*HAHLslYKDA0r(h~@C9Ji0{M@P zYrzZzgJ?ORo=odpBgaA?)1;HljNFOu< zL>;_~WIHQsKM!-OK^|J$#{wQVfN!vat1en`32!QnM3+p!^HTF+yhw;e5!e-iNRKV% zWsq0`gbTDEsW_I~Fp8Envyvak0ZA{pL?C2>6F7PW^&$2B1PE|&0B|nD-2Kov03OiD zpu?^>}ZFn}#X9W1xg#5`*|2^Y72o4{G?7uQmFTmAE9;JJ`?H zVn9$3ln`hP1*uesN#saDxh^QMM_Y)&u(U;_0!#~dIQSqVg;<6nmp4!adbzJk9w{d@p#h>}L| zjuR)gG}uRzD!_sa*LrJk022X(DXu<*#-bQ{29?Yh>d+E%R9J6eL7_ya1~a;FdlsO~ zfubrNNM9@nwcx@)2F`)=RM6dEG7%Y%K?y%%wAy1WV^_#@ zfi2*DFpSsMLTerd<(NDtF}rVdR0SY`jLv@RB2O1Np7_}PA0z^J#2Q;)R3rUh86 zunCmt8L}PJv}lHV$FTrcBZvm@NChS1q0Iog;l(hAMUa>K7&YHvIs*O+qZa_nFezb|AtW#{iC7Y}MbzR4$`<;!NB#Rl{?+lq z(R%)#b}-G$1;83&?lnR@*Xd`Z#f%GUY~wKEpki8@6sheHCayt4utbrJ(~g~$aSMQ@ zC=&2RXN-Gp7|aD{FY7}{Z%BBA1Y_76L-qpmorH*|2(e9uDF`}%#|h$5&=mDkGsWaS zL>Siu$i*ZfO(#W(Ba_C-$^KDEa#>W;INH=CtbeGbx#O6=ru~grSO7c%ya8U?7td_J zHp4X}(A`mpDiHfWnvF#jA`?4HOYp}U{ILOlYzYhS0G*4I_Oe_w&shneB`ujMWi6>W zk*PEP|CjzRm#BcarvFdyN1`Ak(-7Uk5DN7BFt(2Jf8sVOi8z9Jg9d|U0y_#<5n&2*>xSWvv^r&yWJAPQ znDC)#!S+$cEBQDMtO6oa1Xl*ONyVsszb13s=(kJ5P1schvT3I(c`bi$ZQ!#xap)Mq zXKyqHVG@B|`6?NZdtfki0yP`Pr0`vHgdNw?6d(a}BJiwWdRr_C=Az7ipLl{0P)ule zNevJpb*?Tk=9_ZBdY~5=EP#)(?vkIc0_Nl*V-cA$OdwE- zf=x7K#x`VQ-h4bBpTmp~PD%==M1Cng)0;5(5$s?E*o;6ycW7owX(m7l1s+Fz84`=V zCSVsRpaN6WWB{&cwRO5Nu14I&lu7I0YvCZDc?k_{R`$X^C^ZkKu`pM;sPm<{=$0DR z)y;008OIFixqK~@L-}0Dt;(h#QwlcK7|g)Mmmj(Z`rs?z5c-?P!L`F&23m70kOLqu zDHQJz5&(x#6Sic4Asq=MWFEn1_6OMmgCp>e*~h@Xps`0-t1HaMK<{B40?r+SXMsY~ z7)&T-2wnxOWK0rHq)H~l@dg-Oggk}eQV@)ALT2ut&nSioAR5hCrC?@OXBY?wKE9pO zGsu_E!Fg-y3se9&V7e{xnQFowwWtN+HPRGdLUJ?=Qh{BBGGk)U^2eBPxplb#WCKjN zlSG&WEjSKVI^bz(b7-b8LyWExVooiXQOlT_@JmCSXc&$h7kp+#>L@+}H8zx>tCtQ<@U6TbFN!y!!gtX2w{AY?}XEo*_p3Z=C_b;dnsmRsja5Lh(%lN!>lxgam9F0CK!z|2zWu=|_TG@k-6o;C=tF4O*Q>Glm8Se*!61#*qpnEJPUafK6i+DTtD&m|Ok~;b$u@ z;gNuxGCyBF8kx_9w?>@U9KUa}W;O(R>bPghC+y30|_$B_hx;NM>rKgK7ps6Vg1O zO}IlPm}I`40H`WjH*Ip&3;N|s{sRb%hc?#?ZH|UE1&1R`z>(oNc&9bK_nxix_%(2t zz2gh>F_4wNAq1Se5XUCNvI#DbrwDP%Y&6RnYGEEs8-cDJHVu?Z;Iq|y7XX1GQRpro zbxD&8@xKIbc=Zl+RE>fBocK3hp9R@fEfJgh&}yqRG$H}M`KgX40``DdWDb}R zkOnGpf(35NriR)&^kXV!<-bsD!E^M7%_X(6vw^v2&=)JGCY0g zh|m&#x&mAW3d;>)@f27`i~)OH0y~>XD>|&HSVwCP<-;D~m_q@nr}as5PrbKhsmRX) zrUvb#Kpewe7_jfm7|#xV3nNDaAIe0&)?#7oP+f}660=H92%-egQ3Kd1EVabRS5U`_ z7AVlo7@CSFN|TDH{z@6-7-iGV+_4G`^<%bb7iI+@HwjX9)OQsVOu-IH7h_a&&BYs1 zflP&S3SbcnzIQ=gNe<(PaLGT^^VFVDC69uc*^Eu0q)AC6n<+wQApig~6Q9=F3ATdS z3_d6(&C~@d=rV`|R8feNw3#Rt3Opg*9(pOztoSlzP3|DDUZEH^|y1-;wYIw z0`oVS1LF_!3g&CuMd|_|7{6E17EB!ny9l)giyWkU3-#sH?2u@Bp;Ds0wwf?OQc{Ie z@70AN?0}40NF1s0Ihtu@rsLwppKYQ}VXrBpH>|GX!$aH;kH5y?KmW*|qFPP0kKtM6lXOq*Y(cR26F#9K&)H+=oWQCx*30Nad5m@^+Y$q^y+*#7xE< z6ujI9>?1%16S|?>HdvvGjFgbW;H4H|5x!!XDjq@0Bgm7-00EkE6gwy}P6e%G%@&v= zX4x*%>@-kQSKf%!1(+JUkm-uAS66cfnq_B9k%m}NYeP(l8Ojo600xX!DNN1<+9k8Q z5rE%A=OY|+Fx=cg>Qk>yThk3SikN08F!vZjGN-Mkz`4mF<8TA@+xz&$Tj; z+3%Ty`3S7(#nxkJGF2Gd*F0eEpTY4NL@w%geCEy*luM!gSX1gxCrDxOl9@XB0~+#D zn7@Pgw1PBOe@7lu#t%asY6HK{cl5EmxsH90;SVi!8L7TvTyqJz+6@46x7d6jn5c&@ z;_pN7DVZjafxlymiUBkJ0_$MC7h9gEzQ9QPn*?FmHP!z^90OBhtAtff+=Kr*HK*ecazJh9~$X#Z-K1SB?K{xCX>rh+hJVTZ4tLa=3S z<@mAoMW)eJ;3fP2DHW(TK>xNDWc6Rrg78wzf2|DFY49J`iLCz9IuUfJLQzGjQ#3H* zYklSEZ&4rEZZdSC2VV||jSR64R-jAuI5u$8Dr7_aP0ekK`Db{L#^u<3YS2O@6}S+&{qA)xF1?W(gBkwneU)g zE0v6%qos-$bxiw{zT0v+vC#1ppU<8=)dI3po`fE*QL^Qh0pble; zAYqi)OhZC-7{dSU3J$ta5SbI0n$2(?ah>}?;wbe+aX-_61X@*V8ka7_8TKlx+ED+Q zeuO-cSVsbH>k33>OEmQIqi;0Tl7EcZf-V|lP=l-Ot6*yt*q|1c=;KvlVGMNQLgk#v z(qL;Ne^m9gu8z>!!%tSp=<{`957&nBUr^XYjTJw^I2ham8)H(0kXXPD14vX%yg-c9 z9Hl}Ku7EO5N`{NH-0XZaXb)*W!Tta$l1qfB86%EQp*1m%3Z_sJ)y!+I`#~*G=nP7F zCPxY-&C8MhiBY3OT9->IVR2zpf|*ufdhHYt=;CH`;RsI(ojtr{O${Yfi2b`QV!XuP zV~yPLns3gg@fAF=WL*&ax`PSS@tHCnw$w*VWAHOxuyCmIK$(DiYEV^Y2S?^6KQdCx zH|47DK0rJV-C+a6tT2x9D^fsO2y)Iy5^zB~6ve0_1bu5N&JKY#ITJiof2|RM6mtRf zPrd4FBh4?YL*CNT*0c_d2(Z&j!GtFfiz0CDc%95*$^CK#g* z!#i*Rk>K0{bP*J-_FsppqjrBad?0QZZUTju3K~$Rkjr3IhS8#t-XLSHnPXh+>boj% zNLZngGda9UcsquY6*k6D?keE@y^&C|f;DS`*MufV8RkKV1PT!|qt-pXteiu>ae-DD zcCBkkP<#}Bja=;^v^5pYSGmho3Rso#L)1i!VhI8zyv!8oN$BE6sAj9x=-R_;ZZgzd zo}zs*u$j6!Vs41@Xj2wgz7kQ8lUOcMXsd4u!ix7PV` zp6>S~r*7T5_tusWm^d>TdnQ8KySuu(s=K z`CCXTpzuD|5)!Rt@_zOP9I&h(hJDoCML`L+QQkVy^s`1@2f;<^ADqQA-NnFp&z`Bv z8@yNvk9*^@)H5~ewbh1_G30|$^Ln6`5R_W!O4%ho{og_12Ineu4F?x=tiX6w$FdKY zz?3&~Y{CkBaH^BFT0KN-@YQ?u2kI#!f|Lqc7ckji=azq!vQu>7Zy{fh57+nHav7f~ zzv`->;KBFfC-Bp8*Zk7q3oN}>fU*S@9T1O4=eZ=hgj{042Dh-!uMW*oQ2VOiiAAnP znPH_5$`4J5&Om$SYmAa_3-h{_)(T2TSsr*u0kmiW8B!b1c$6t!x80dETNfF4msO9{ zM>NZT3|#C*CXI1P(>ZK8%Lu{iUM5Be()L}i$rRH>HaFx*H8@4Ao`!Sy7=1@5-pw^% zqwE4l6FK5eXC1-_uMGFIHBB0F)&(V9vDZi(l+QT~)10r%Z z!*XnGNV7V<6ww01<$ydZ0QY2f|I`YML;-`X08u!v9WHqA@)Tok-CB@(%5iK>5Zll+ zXKJydR>-|M04y5~=>!vj@tK)zb|iI9t{(&xt&BW{jQTWv0V5Z=_Xx7RhU`p1rUOqD z$bo`kz~!hx+t@F-X)Cv~-6*y3{N6jc9B2j4Ui5aga0=jrASVzKV9b)}_sRL6oV87rm^vjxQmUOZ;8TVJV_>4j9$>F|v z8@aZg?`=~HFOR;Vk)z|lG;&#ilzC7<^4R_cfi{U)2DdzSd*=Yx6UIbD*VDJq9I!&AODA@4CY{?85eta0uZ*N6AWzuurDAw zH`#b-JJa0*UP|2W5lgAzKr5m2lLA6Uo}~2kl^)0P1=TiX)k6I*jF6tAg`=K4cOH$A|)xA3_i_^J9RWHD(1?fi0hG-Fq;+c z36$LkW$c{l*TJgJfDEe_RFKpO-@ZUKoE*#X z3JZTz5`x$(aO4h5q5OQ^({HnP{F-yFo&~b(T_lALPEpdmZg}QfH^e z!@)x$V@Q$X{s>en6SFRf_?)sNummQIR5ZQ}@3S{;VQMnIYN5Z9n1m%5XRm9HSi@=X z4#apHfwA0Vli_HEuE(Ox$??|BT~aa4gAj@_0;x9Ne3w)DMsu>px*1EZ;Z<3l>efVL z`#tm&#OAAJ-xgJ))cwJLqsy_;>73J=6>$bKaha4&+H3$Mqw$C-Cj!cDY91^+*pdZ* zs)Z9;%cmGnzInsz1eYD>@WG3l7;j0J%JIc8DU6qrp=d`RMkCs(t`(%1V<5Bgh8UKZ zvTIg6DsB6VgsdM}y_Wk{NG@wIc@_aB8Wn+~GeY2dpsy5i;UNPD8T{yc6ZuCl&%sS#bf&Q=dDD3#|d_H^G8#JUbxvzcM zd~ZD=x5!E4o*kcA=P>J%Q6CWz037d+(}^-&$KkW>%rLySF(zLo(wMH<{wE`8_fSLa zOj;B*7YC&Ku%=E0J*Ns(rbG6d*$kQeApm{3FqQimyZHDF7DOeq?Mj;>2SKkWN1Y3szj4BJ6sSYuz4 zUGF_bwzs2Q^QiQG5XDY_)C^ zDfFq335&IceX9z=iEI*UQ+%I%8@fZz=n!&xl|id0>>tBxaiEds3@34?wakHfuU$r) z>sl0nCZd{@)dJBnhp$_Ubb}&pHHF-HTa1WK8?tbD8aLv17-6=sojBwM;Tq(wnIL(@ zW$+;p_3PJAgf>lz^VS=zsl8?}(U~Gl&&949F6*d>w}g?>#*;IQK}Ue{8mu7(Z?>8S zEboU6ECs?6O}?5irRi~pyV9`)xG;~{K&9_4;iNH`=R~q8yu-*Tsqktiko>tFph!DK zu#6&;Nu+;rX0c_+HCyN+$@fh#9HcN@SUQ|WnC99oxXwz!S#kW6LV3+`*SzA-Y1}x| zB6dKb0{xar55J4_JF*R!rxrgl&!YSU9(xj!%w`RD=w+e0=9HzEf?6o#a<7m-m_A3> zv?*jQT2nN#Y}1%_9Hn?22mi}G1V+nK7HP0*+52q&`!w-ig!rk{EBO}6dDqw1dCXnY z?gVc^zYkp{j)&dJHEfo8=B$b@5F0M~H>prLMtha^&B>s5hLc5;2?=|AY0V^@WBT%*Z@p)$P>U0%UU4u;iyK1+>KCU3p z0Vy!~RgV1{QfP;;9Fui8H&6<~3p*5#7QF%{#>>OL-5{;fF@9%^5@(uouBTBs)c1p_ zBdl(DO$_vH!M8=(Sj<=98$u-H?N2$!;_ay$Vdh-+1#@q%&FP5=)ZFpggLhK(ZE7!RyHJU78EAE|JX=1@5egDN^m74)kf z=P6e>XaM7W52mQ?Va_od$9&~6CtmnWD4ZVD0jA2SmEAYR;h9f=knSAgrE{27KyItc zh$@`{FLIfY^VeOCa@JVQ$g~@ozVdMKgtd3ll_Uqu?i06BWR=qjq@h60QnErhUg1q*hi zVT~m-HQIMUsZQHhO+qS1|+qP|c z+U}mVJ#E{@+uoo3*xlHTsLaZbn|bP^q9Sf(-g6+|=gYTO?SD9hZw>sGIzFqGfh=DG z`vmJ#3EOadOrSmf(TBhKz(u?LB7Q%f2A4=3z^Z?vaynFnMztq_ICSiP2n{5phv=Va zu+})?JgwAJm31*03Q+F8xVNs%Tuzccql4nYgD5B<&2n0&GxEH{FRd=*K)$l8^Z?$5 z{R`X=ZR(FBIQB9rer0vViosR#57LC>(J5>^W@6eU1U=BYz3`A%!v-Qw<&sy zwjsA=mDXSFV=^nspCAh^IX=%SM*PK}xACR)+Rv&}NR|kDa~sCKev8iJrPWgka=lb7 z5vM`jH&cufy*+TLJ6G;4x@;m1;$TfFQ?48W0BZB;q}?B(IxgLtFC)h-celPjw&D;O zYC$*uYfmm4=2r!lzL-#0;<8N(Br*LsXxT=YE^T=%F9EBs^~5WiC!Z}ikrcwXe>Pm8 z(+F8Ibfpx3x;Bv}wR%lHnwUReNt`0wHoT)>Zd>wut=s+>2O-nNuKdo)|3!k36}l)W zD#e_V((v%`gM%_TVMar%T3FMG$mBLCe4#5%M&6S(iO%pv`wBv6M_**HF`@_NlCHT-%FDf6G z{TBcB&;lXD^3dp%q zp`~=qqHSETp{CL3W(U@H=1{4X!K_7d&_5LV{RkcKCI9(C!V_thqUd=0duy zYlGj$=N3#YGu|1GV~C40)n*+--oGG+_7C9jGEhlu9)YXop;pWE_<5)2KX&D$fz$J0 zO*D$2a4;8`b5!XoLmhUYxuQD{YpF*KH+**OVwfSN3p1lTEEVoAf#U9z>XC;+bi9oDPo}3@na@sgj8jisQ4` z6cfhi>c4Jc4-@Si=)xj%Qy_GhBced;#E(D$OQ*?4fWZ6NCbOgzPasSZi8XbFVH~S= zK>SR5HIedBLbP599b#nsV(}u~!{kOD5Lbxpj>NZO-KT>aZ zQq{zoa@Y$SEtBM4S2i-*^BnYLs|zv_SmZnG$J6TCt;I!@-lbbf{T5QeWWaz@J2rRvo~6;WNVZV)7-`=9#*b^sI$ zuTh^Jp<_zGx&YAH#v?H5buR7w38wb7e5Cn8NmQ0<*-5@P0j`ya;I_F03?u zQWO{(6Lg%VsX=|pl-0s!KY#DI)Lj4gHr3_89O)Mw`^d-j%9gUBS$pP{Gt0KtaFrfK z7k35_pi3@`o0zpb-s#WoYos;-yyUPE`@cB>N{SQjzYt=NG)cO?`}ReZurS5=7olzrcFh5@ON$T7LP4S-}2BD+OdP zR5=Ek=wE(Lt?avzeJE@%65WH^r)!bF*<1%ULhy0}E!yDa9p)}|r&^+OM z1rZ{QGHY+2<{%#G9biF7jbiqy&|`Ec9ivVk%M@vTBM7kHoZ_A!ARI|Z;g8%VY|wp^nOF6*i926^m@0TFzq2WIkGy-Vl~oI}J_=yvm7;r;mB^fm$w7 zKt4|hUK2i%7J!K;Lejl2hmx9?y_5}dp><5icrp2*;j@zs10i51#;d=ZnNJ!?K8+hm zT>r>1&YbZoifnQbq!CFI|1gf(3!Kg|$w(6jF6`0z9a!q^@7Btx=PYu_Hr&B0j5R=% zyWDzyUR@g}f z6P1&Z@a;J$f^z(=lCfDmOd~~*^o)Vz1O($fJW)G?3YswSDVfqs)P8p^C$RZt75or? zcS&UN+7gQ6&SjKxmUvK1!31I27@-!oM+?v~t(};!TMxUnCGhPOQ+hA%HhFEKYz;~C zt2Ay;+3u8u&_icHU5=ImT~i=S|5QgnL1jmauN}~=F^*Y!D+dUii$G7F|BXS-2%Rrn z>^~psUrcRYoJ*7H-->EwAdACE$S=Z?oNjk%e1esut3X0SvqaKJL5cmmOOGqbvs^%8 z=pegmBw`x47O%p?hXVf2n|PaKN!ZK>XI;v+;621CCPo-jm>sR2&D#fmpgok@uS*K? zZ*{t=N|kb~txyL>MU+v{sC?d7RNI1<;1lell>Ylo6QNGGgdG(+R>GGO{n<|4SFQFA z(|y5o1cqN}QXmb@8UuI)EH-TaE_-c*^?8|)4^+Eoiud2*4YgDr;iWW+$nxm`_3w7t zW@xGsqsXX@t{%{-ijQ3C@RK^nDD?}y&_Jv^faI;Y>7wejl)KXS()@^9VvziRoV|M> zj1Iqg2`hS4lYwtNImENxN%l*7h?59?5UV*s#fqx~ybzYEL?kRQ{Ip#uS*ZEKm6XX+ zJUqp@j0dZ=OK4N1mHP&tWcXKK&OFI(cAe{!UTBmFSc#%jMud$T!%J!ysiKuuiRx$tO_z674nBpZg}Sg(S`|*76b1?J@|l|_RBF>2yubUD z=UFOsp`^4b(Q)f;xOMY`yHh&|{=y;3H)hqV!;(${n(b5wH4#zTqlG^Kha|*op023@FFRen&Y!v=bvoiPt zqyR*OBpVvFFY8oeaQBU0Ld#tzH=*20Sy8YI5mQU( z4SVGp5Jg=y8hXN79bFe+J($oGVQym_ql%!R5{boJOWocdv*K)4g}UWbih7+2okFIS zn$?Kz^EBZO=_g7#cVvvrMTbbyx}LH?22mt@)2ECg1VBS@=thb!vHt z3Z<~C0BI?MaeB79Zyq#RCUhyW0vIt{!r+VR2a>Xv7?QVUO%R{nF#a})Z(dNTbZ^DQ z$MVEZPzrs_2>Fjt5TX(L19d>*fkFEe?0kApz4Ew5Rmg_*x;w2hx0!)@u}%^nn$lUS zhdnjA7H(B%cX}uM<;;k*r1Wa}GRPImIBsG=APi#;baI3C;d0nj@RV)h0v%Ma+Y`8v z%=RCl-5ce^7q1$F3UuYlX`_#@c>d!enQESP=wz1aZL;~QP$eYMB?&p9Z{*G4ojA*1p{NYiir6d4wTbd#6QV?|goAYqb5+DX z#HipVpiD>=F@~hT@DmnbiOtZ&3}~X)R3*B`H)*g1FHSualiN|Be+YHD1*^0ADv2k- z_MVH|k$UhTb;k563A<#3+#-X*@`S-FY-h^3GLA(Dl@f^1LmJUSgvKLyF_nZw{d-Oy z_vfPp$yw?~f@&&*YTyEuKXoK86W`+5vr?tRYFiAGYFcuI6FSS!glj)jl2pzjK6K70{q*I`Li??Dl)IQFD2`JTuU*W_W&vM(etiDd)*-Ev8*p zqDJyt-T4&TFJ1}#+nUbD6#yH2O7+_s(y>W>3u6~q^(vJbbqA^X)o4$08FUaPl1-&B zD#2%*ZExN5-HnX{5M$hHhgrBVMEXBawn6j(rBxOM0v0j z)4kk4ut`EEXI1P}iSrS%E+MbrWnmzoCztuSWN=rRn8$%~i9!%P;j)w){cDRg|J2nZ zFx?ayo!k;%1hUChHncl<8k2&-HqyrF-#o@{YnJVuJf7q(|B*k^WvgWT%fYo7_7KO{ zzO_o6FEO5?TRtHeNRAuf+DoR*2x358yfKTSR3-f;B|B6B!kjdnlhoN9#VfxkGG9jDD$Hc zvr%q2#oThNTta=h5Yj~oamNK~%zTU(H7!Ut@UAzJxi}`$%ROdR`pve=F|TiICU;0k z`+<^<*3O-*E82r$Mk;2*=!hHDr8VLWs=|_+XQfEk}p!FYoDybCri>f>?(un)ED8~ZCA57~8 zmcMcXg|<5Bto4a7w^?~EGgR1!|f^7#>|zW2m%?v}`&f!tka+WL(i` z6sPp~c}1@L5W>rwEU^f$y;wydwnF#P4TJF|pksfvpb_kgE= zXzen^Y?QNNEytvG@tD({6GP9Cb^i^6?z4;7+Q0``%7vI4kQ`T0=(=*pq;bAb4DP|y z&H>$hwsAvXRtI!fF{oc82qr@655mm{69%-Qs6%*@JW`!z@MkPcf?DT`w`Hn8>q>L% zGceVr{o|a=ov6lOy)vBu&KAD8e*bo#kT+rMP-#Yc z#LbA~BylE8Jr*pRDiqBS37mlsT2bxws-N&cGmMc%qSyf|Yn+^Kk?TNvGWS3~&9+%< z$FB#|zQWS_qt#3S#*5-?G=m^7MRh2bTSoBJyM=Q?kzVX(|7pagu#F+EEj$;y&FG80 z4czWESzU!ka>6EF9hZ*Vkq|Nv!cV=aTm0jbTr1%&V9FSpPI# zJI#fj+`B71J%&MO5_^H#zsRN$*~w=SdSgc_7={>M<}=H`$ks29hiF*pLNy;R{82t6 zhS85RrNp6p9)|9WKN|8q(&kwPc4};#sO;rgD$))6%4U3NRj> z^-nkzq?!q^4hYk7ICZnv|048mg`fTHj9Vm%3aA`+sG#@C;KyhuOjZD~(Vs_K|65rz zUJQ}+PmM71VweiMO>3>CcqChh)~1vnJ>Av^N`@Pf;`aooB5q5uXB*Ys@d)FoBINqy zc7Z#TcgnyHa=2G?5q^hN6-_*Nw*rhH_!(Q$dU zYCcOBFjmeOxlj@}9R@-E=v=4@Zuu`VreDgs?6VL(<7!>a;>h1Uv(|f1a_f`qU?ZrxyH<6W~tgZ{Usp=*od};lOwK)BW>%+4jrn(h} zcr_vA5EZ99r9PF0{dbX!!NKAI9jL+%W{t^)uI-S9d-d_*5U=f747(r3WH(qavaS20 zUK;mse~|O(PhiBrCB$JsHH;kK;X754gQ0(fw{{o0lEC08{=q|r9aatEg#01f9Wm-% z5}&toU~^#i^o1Z7q7Q-oT2V7F(2#ke7ecdq0(NmC5lCcvVjZZi;rM)lKJPXNC7xBz zp8>!C*fqm!1L~d_w+-5l0U%l>xDNno)U5>zK)u2hfK4Touy|sC=dt`!ce0F5TfKbq zs?`hEKqyBnyBkXOH|a!;77FSj*0$2NLg$4O`8mpOqa@-qw9z{3JfpnXiv7?FX!RNR z?Z}2H@NT=JNVzE{nH9;jGN(WDN37$R5Q^RhDd?3$uGvJc^fsVRDyrrhiV~b7f67~w zq>AoT5cdt}?5^0^5!(E%ZSgK|XnVlt$z{j?olG@MwCOkCLGXxe6)@Hog4XK5F%Xn! zW5}@zOQzf(nf(%;fmA;Z2`p#xag3655i~NjLmgROq?27|&ZxO`1wToKNe;uz znzSjHfd^L(T0NL-T`c29 zUm~(L(>Ch#pTv?=G&6)ED0yR}f?YwV4X;mpMj*T#g$~#fsx!#- zan2=M6lXQ|R_S!4X|C)9CvTh^dgs~8TW}K}4nF_&J%pEH`D|C9=QD+j=|8TC0rFW3 z4h5vPu-lFea!w@+vI-C6*qOjK>@+OdT$JqLG7B_0s{!h8H{G`hy>jfF=azHKa+!~^ z_GKXxE{4h$XJUd3#ETJmFQ*+-DuhXh!2NmbMkYLHBVi~~1t4VbflvI4K)jeutCM~4 z;T|VnAd|NHK1bB{TF>!KUH4*Jv5?j0Q!}$o&W$UK)gZf+?(Qp3RRJ5 z7=3{k;nM4+pl--IgdzOk;S+~faiX}#)Azlxq-`7}ea#lUXGQt0JxyWGEmBNbGksvVKnefWd-x8V>`Hdu ztLa-`?x5=TO_I(hF5qSHFQDhTU~7PPP4;C}>>R25riCEWLZWr+z{>=%Tha({vS)Bk zQtSDBENW*<`I)PBz%oZ5)HmIqE^p_fF9F9@z7QYG>SK(>N&}}^qChjpzndJi(a0YN zv^m55#!3shb?A0gvhrHymo%Ug#Krw@XcHCgJ&ePm*`urEXV)3N<3b*5BE7)c_3Gt= z`pJrG^3|2zCGj*mt`Pn-^}H5rdK)5C0f`H^;4F5-1-3>YYliq8l%K zMGRfjW+NfdnvXr!C9ukJ(@c07NY8vZxT^MbrMBma?yUaUDai&+U`?HmyWDo3S);5c zO|&r$ijt7tpfS62V0h)|edTyN`Rjev^78U}83*pOt-Xt3$4&p*KKBy;k^_5viKP3Q z0}K-%VWa1_G~g?T|4!iB02nZ4^6&HYGWiZrWI!u-2WSFh0{o-=2P2mjjy5N+m8qAn zV{v@q@}+bhh~aq4SJeQ2K%b7VXNx5=zU$`CpR-Q_m1Su31WhikpilcyxC?cF)F3=} zC)`X!a<=ze4Z(vhbbnSF&Gruh2Gzfso)b~v| zd#ui^qQ{`Bmc=$9xuI`-FmH#}_e$f-X%hGei(&ptm*uTN4#zzX(T#fb?JZ%+2l)kU zIUH6(f@MV^U~NWnT_6J*Ni0O&&9r?XPMM|^#87)TZON=VQCT{@6%4M8`s;13vNDJh zkrGUfqfOq=7M6QeX5H#FzCInZD2O`uIQE48sOuE&@q^&=GoI4a57X)kgq7i*Lr^4S zz+Xx6mJl2wZB&nQ73@O(_Bd`T>qe(HZwGB{J}k0ttd1`1)W%!>pfPQEw6 zeOUu{lwbJHWi9=BxuA4mlfru}b`l=8Dp%e4`{=id{@8?Iz|I!PU5a0H zi`#A~@!V(4a*Ka><0X!h!I}A^*gC+No3M`&n&{B%uk_Kj{aWbO($@u;b~JGZ92O`E zaC38Vr_}<)9_X|Rm)XX`Vb>Ufxu;T^m$l`&FH^^s`CNh)$}ur*1ZP+2dWl9aM^!%Zql znx8>nU(V=X;jBpkUO|R42rMm|^u*2BJh(9HNMoJHw_EY4XywDVJz_*EIp*&P`WxoG zZG!Hg3w9P#s3a{gDp=c+r9tYEPfwFDGX8X+>d4%e{Jv67^tas$h+AGPuOJ2Vo+b#C z9JHn{eIi|8jf8cKl1-uUwi@2Kvr&TpzMcfW7ctq!GH{BXpdR~(Exr9@0W>^*d(GcJ zs=B54g*GWps$So+m@kW!%ST5k+Uhz(^V1o)z$}E{U4lYSEVM7$`gjJc^^Kt9rA7dr z#(sLp|}YI2twe&xYgs3q6}nUB*d1mgE&quZ3NEG*CR8Qzl#Zu z!Dp>YT}Jh_K|l?aqsx#uHij%%pNf;Uw&(6W?G|Y|=j&nG*7Sv5U;=rA@jGdcGw=w# zKO@fNx7&0z*}htt z6_?R%6w0_kPplzp2TQgRnsulJZb7{M+G) zH$%TQByBV>k9GyPqgX)^nB@7)(y{{2{~93@^#5MCWhqEO`&G%ZtE#oco_DqT=Z8YV z16T|SCHEFduu!>r68n?67ySBOCU8y5i!Y(?rfGI9x6ErxA=3k=@fv({-%Dgg!{Y zZ#z9fDnT3ci@EK+nllcp-Nv~eE%l>lhSOXPZ52>+<}gn(gzAyMLkJ73%f3~gQNIep z{g5Jmj&%Ri1?_-#y@kP%{(I7~#-c{MnIIjRP!)=mpqyy&$d-YckcqaUoD~ll6{gV- zRj`{?@Q;RJ5W4p@w;f)$pR3@$^W6~JsgcNCj`87e+_p(jO1P>T$316)7&KpsX%%ry zFQ1sirHWTh!t=c`WXTXeAPGsa@^mO6jZrkV)!2wBsj-%10&nCnZT?f{*}cSuUE)53 zoas$2MD;mgVw+g?Ib>|0XU2MOm}SZMW+DwV*pRDCcN`+kL5Wfb4t z%+9F8V#cKp`{kN{HF~Z0#D{m^>{qEbYyr>jyyAhk-X4zX8wRVM8XX2Tfgq2J-Sam5 z4EWE|U4}z-qlOw7fqH0b%bd1-wnJ|F+Q7;mZl{{Dsgx?X z!^i9QNx!Ef+mC6NvWj(_%fwZp`X%N8Bwo!4$NQGcWVF4CHu~MIp`?})(Q`(Qd~RdW zHJcOfU*5sXa9woU!8_wb{CNHCVP9PjykitSqqILH;*LRS2EAjH4T8Z_(sw|bZRF5| zs4Q|@z6HyzfRMQT6X9l68YuaSqCeNUZ>=bM-ttVn#^@U;cs*3gcUsyJ2UsKlDAW=9 z71Et?p67r3?hlk79seaD&Qpl7JyzW-u2f}P>hGr7t*~=&*IND#*hW<%?!Z}urfM43 z)S&fs2WoS)(GbqnNYVGNTgV2b_r(2qfByPtN+vn9P$Ho#WZD1PiPh1H$t?9Dz+yB; zCkP#5QkdJo)tWxkTe1A<7B}ZeXwsIiB|!tYoZOFI=94KdYzdxaE~r@#eIsb~`TK4$ zgcItK4%3CD?1@<9K()lL?rut+HDPH+2QW}SP~guFQ|NKf_;Z<`7A=STr9oah=4zIL zN=+V3>XpAJyP`(Ax=EAMFDRT@88VAK{i!7$(2p#)^JnI}!;dWWnI#^QIJI@5ou{8Y zKL#w4Do44ghjRIP+loHCL$zuByNAt0hG#>M`_%n}2NvB0&O!SdkNaASbxwfIY>LvS zp9Ngg9%RMje;FoA7IdA6PCbuHaN$rB&tdApybH6#x4#Dbtw+AcP=?2=#p5o-JQu*c zuLjUtnwQ9qF89s&TrM;{Qv>+e74aKy{Mdu|A@QSa0Mn5Dv!U|It$Y)7Ar!?kAi2t( zg%cXoqOX~}E-3ihgYOCTq204GsC2|hb6f40@mjMYdDqDZsa*-vGt2Bj{)+kTcJ~9 zb?gLPX{S$$MIkq|vf?{m(P>Dm(?u401EL-x5KYpZFj{1KcB!zlA=2By^8*Gs@FRV3 zxlEntO%$CQd6FYHS7cgJk4ZJWQ~dg#oDAdA3+%W8A?_GWq8%H^Vk0-P9oEFhRS3Zy z=R-zySs@*Nq651Uu*R3oNvZt|raVJQe+*(EN5g~hCjg!DbOb=z6ZtMLzEh+1aUAD} zPH`awbDiulo{$>R`(>Tbm1uZr*FWaO59DM=aJ?8Yp77%yCoRFv#+v*l0-IZeCj8H| zZqX^en6eX3gm5kfC}&3kTze)4w}a7ZU)bYM(W$qeih!Sr6h<@gKUukde~xMWXI4~X z1`R*#aTG#$hcWW;zCP`?uysWFGGhHJQw9y0aorGkP$WJ`Ddi42rge%8v z!9R^F$7;d9j4Q`(!M~*|$Kn28zWHbQ^s`F!LM1S0X(2iTr?u7iiFq5N5ZnsF_N+L7bL zvfdWp2||rVs2nmp7)_gz2*N|=v~iIxpmqqLhw6-Asdy-tAjzN-fEY)UP_cV2V!BYX zI->8g5ebhL4k6X8?i1!(Nn*7IN?(QiIXTO31E&K`4P|QV^xT^S9qI&puq72r{BwnP zkYGo^ysgg{XSah~hdvP05l)FpBhnrnpFQdr!oK3rm~6l$vD9IYbBr?o8Y>-|Q%$Y8 zoOTE?{E>_Sk}v{y#GlR;CpFX7id8=i$|Oq=-=79sFf8Y*?$zVFFY5PWgEDD&PeGly zeqmh7;@jjXGdU+Srd&7~*%R2zK-;(fQkZ^rS$(a?$S3@^8K6t;K6|atfAIH7@(0K> z>8WsIshJ{cV^!|Y4yDMAQAl)s>?lf?V?b*iX0Hgw%|tXqa?dPwaVx`LBhc|IJ?$bVHdYV1IaOgyO+fS5c}d3%B^j<`7( zqIR)0|J!?XiCxiRXVLT1(u;Ab~v60~R4Qr!qK#1*=-F0!`h?#jHo8~erB-ld=#3vKR!^?9OKAH^FDCIZRZ zX6v<#2?bcCh9{7UQFhrkgK-V5O0SKp4POX}G_IGNrh z-dkQSS)H}tmgV;5GtHQ9sm-B$Qe^o&BixE70L0-+QY=L@;V6b{r-Y?0HSCymN}nEI zSA@=N84>O8O(ibh5Qm=>D`l0+YmUIz7TDC$SLbdK7%TzpE@Mg3x`kdi+9Rj6ES+@w zzTstQW&X}jP51EUnr%6=cX4QRE47`Nkgy5ePo!<;zLd|yEdDMe5ms=g;b05O*~-k} z!|puqKVa00{_Q@$JtEw*T^jCgjpMd>7TPG$obx@Ft0jk{{b>13r$zKjk`%Fc@I<0~dNl&Abr zz1U;U%R5Kg2(lxx}=9#k(PqN?Fbdh1tSoXz6soAc259kl7(*al+h zBO`X=H`=nlY-UAW2?0)zq`+KM;y2!ALQ%X)|9&S@X=jU4G0YgEDfFf#xgL>?nW_eP zW60BASw>oXPnO){fd%0MEBr?Rp6TFk45^0#fLy6(L~n-m%Mhv&mwULF(mXi(Qh~D_ z->fOg1=wAUYwjtjskqpb(I{$(E_{%pvU~zYO?i!{={@J+bWW11NfYCtCz6?qn^&74 z$z?f?=5IUwGzdAOsRu$R{FFlv$diThD(>)eIl`q=aGK)v2<5&b(lc#)W94Y3vTPJJ z##AY69hDpfH6!fl=smXMX-^Piz9TQTUq&u8#r(7$buqL0J?7?SqcULA4kWV6s0#IQ-e=`Mix53mGW9cI0T})9%kifjQEY`M@uEosV%(jC{eQ6_ z^N)OHX1+D@0X{8f7DOKkg`BS62cG#4fUnhDfX~d?3s?D0kMsN1h_2@vf42Yj0J>6ZWTcz9z8y1^6nHH9(jy&+}^DM?0#%5gDHNu1$Bkztq97l?_eL9 zP+aEQbxy))5Z6#bI%1<~Q~;D)Hw0vT`oDHjoh@IJOA7Wx!}uP1kZd|r z_sF2H8&ji?itb#d>WLGVto%hQzap2cMevl_-(t?@Pdg)c3S{cIfMA6*yq&AvsyZ)x*WXslm0OyqBx0=NB5;ljQs|ii<2x z4#Y3Z3rl+lx1&df0|Ri%QGRGR@~CdR#;I|9>u78qMy)Y9>U%Oi{jyoI_o+FHG=67YpMONtC30*lXVcWaescLXk8cX^pHciA zrw>r8z1XMlM*e#pMeThhXR{>lKC<}=XAf8!IIK!Xmd}O8&JM-ug0NQ45*Tun3)i_X z+O*)sX@&bl9k9 zIGM(eX7q!%&bifcK}zMzHqRjE0di=uWr&jU)M5SpZzJN&Di>(Jy=|0Z)8F#>1PkbP z*Pc2CCa8*Le;AzUW|Nl63x0NNAq<*$8Z&y2&?rTXfdDX|3+F<2=Avu zN{@^aQEDcRS2ayWnUVkrkwaEcAUf25SBHVFn2>GqZQTmCj(+xZj&o=^f378=K4!+GEeqE=8yXJ1gLZBt%t#!A zW3WbNZ9{}U2C)S2htO8mJi*Ay$JC$UFb6@Ed>hJmXHDQ>mfvzB=Oh&L0;1ghInv8K zTMCe92<&T{$wn7o>nIw5Wt7l>-`wOAN!v$#lGDe z%rlI9_2nk%y!!wyl0UnSz*AjSM>Q()M)GQaKOhC4B|V15Ts)eg>)&|meGTk!aaUgA z<6p3|yC7mu*l+hLSOT=#z0d_V7a1I+$$KpgNChB{INwG-j0>xH#M`GEL?FT$??+b# zqKAs#@9wS#dbuK`eX604i8U{=QK(lKJIzYB1WzHDn2g`YyeFZ(h<0#vCntXMEMmXFb8}#H4b!{_Q@mlozv)MqHE5uBYhOV2)|Xe7ebQGQG#5@fmzpBM zD_VB|fS~8!XQku)qLFV`qqAx~hnqonh5gNn{JFQlkut%GNSg?((#!WBzlAlw?TQ{= zE=fB9jme1l=TMzn8c|yDt@9>sH2Sg)4BFg!TPj-DC_YVaBj|6tmBK#g0^Airnfm;t z__#AJ49~`{t`4;ix9VrTp6BEH!H)N9&ySLi@7-hHuglGi7yZJIrjN~fhBkNgc6xY! z@5P?C+M8ahSpTo+ikq_`Y6$KfIPr20ynrKkt{OruQ51W^g@8(ADKi(=mbpV==_p{#FXM4WC$3vT%&;1s{*z`@<)?W73iG}@k&)qh_ z&2RbN`|9raEl=3}^&0|1o-Sys(8F%GUytkJ+qyTv=GL@zt&gAITjz%?^u3;-DpmdK z#QygThk>6!O|K{5VSe^TW(VJ8CuZY-1xv}oL2>J2)#GV(eERi7ZuV`@z@o2rhfWvW zdM9rQo|>WFox|n?2M4|5{A05@A~c+Sp9pym5LGU2@_62wSr__}$}QXfQVQ*t7X8|x zH8L9%oWHsGdbW5ngYH{?uanK}y~CqAvp%elUVsWI-68vQb_LJp=vG0#T<_WGH&E=Z z>QydyQxPXo$`|yfhs16l9@?5ntR_=Euk-E#5omab< zVw7&sm=xcJ(^+yaMrDjdPxbGMcQFcFwD`s1cOKX3_DA1juanoM`p&u=yYSbYGB@bQ z9?c?!bN|ru*T)VK`<^DNeCZ{QA*4>##U1D~jS{7ligGdh^Z@|+-b!JXYmgpYSOx!?1B>?S2R=KuVhQ#KgMsZz{E|u*3;a6Bb5jYsFG&5G!M@Lyr4BT9 z5V)W!woBbvFKmz=D5aX7XP6&y_D5{J_j46>kms z*c_IXb8vpOz_%h+AVqwODy#^xV=G^3&lAHv1za$ zizh)9htf!(Y8V2zX;BrSoThfrJko9--D9Aa01@Awdo7}7&)`W36>SAYgnC;|E1cr5 z@LJgFC;PiN!#I$HAF1Z`>HOIcF2am`Fr=XYzRQ_j(rpF1A?}8~JV8w$1;B8~;lj8*1lzGHFz_!_CLVU5?ES zyNh8+Q!=CA$HD7-#GhD) zp${)y@8)=@J~r*{LsYkU`P3+**tB}pnk5)Zzpi&H39Ept@iFw^>=MI~s&Ry~Q@W|h z*S^(Xmq~8)9)iv58Wzp30`_5jVk{milXp3oSEI3R>jA=I%x!4UKAgT_B7z+GCEQE_ z)Rp^UJeJWtOJ%o}5FV@frvKqPdX0>ZU~2-|lB9y964pVCtv|XD$GIXJF}sdbvvjfd z2Txw(!2d4>Ka$#~ozK=4M_@Y(N;fpO$z^1j&=Tc{;2Gn#SDsoYx;v-K?~tScQ&G9HD*gM4UX6OZi}tY#C6U+hZO4N@exSfIASvG`5SxF8BYe;7ps+~NkRd$s%&Myy zWqx68$-buprS%b0j5OpxbNAzUC1;BhkgFK*{RS{gp1>;ROw1z>3p8Db|H-%p_3=OP zauYE9Kns@}LQ9s-MlWy~P6|hGEG1;}sNCb&M48)Y@x$bhXq3C4v0<5^YW9^N2kT^g zIi-)EiYZvUnW(FL6w(-a6tIrB;Ew|fBQcE>!o0h%I|;*J%Q7=6yek^{UJTo@d=kev zO|Rvf?>=K(~Tt$V?NhC zZlGDg7$Ut5n=iogrRJfzjoEh4V`plODJL?QP_Fv^GCH{3d{^klEuim0GSCi~6|M^u z7>r_hh3;#!=(W4^Y3$k|Oed!6fLRG-H&5HLrf+41RWa!mSET&&^Fto=sTLfrZ82&^ z!S*&|)(=~!wf4kS`%qnxb2o$Q8-%vgb>50mzy3E8Jyj6UaS1c@C8)#gg~K_qF~(Lfk@(vY+fp z=uWW>Y+nN?=k!&CM92itw*DpDX-#^&^%bpyhf_(Qe+STn7Uks#Lil2Pusp>;Y$#m= zcxp>sZ2{!-h4%wYG%~grRINpEp^Yu5MAUktNm2G`ic7vKYHk|s=M<=&j7CE|Tm3r< zeMBtNSIr7W{l=U$&=4YtjJlkwF?cJo1tEVv6A;2!k2|ACZ>S^rEN{)^g`tIeeOy_} zsL|KRR+({4;-d?Ub6J7;h`A}P@_bss5%DCj;KYw?+bE3j8ZHi`j*z%UG9d_9c{+GI zO~EO$z{M*=oi+xpWI0B~yc)sNr+GnEL9AZfd&Bu|`=85G51#Vo)x%2TMgx(XxbSr8 zxPo+G*QiNLT-JwLmHR0~XCVEt8H1W3JwS)V+f7x z5w_5xc7!3|gh6)jAxLfPVfmxbMa-rp|JDe9?a2y;6cNFvih&xDU$*c_cvZ<|V6Cj+ zC>a}Nw6?MFPw9s2tm9WefRy5PXQ1h}Y7@>Km~m0E^@f!R*M{PnnJZW-zGgTn-e+!{B0PbRY6U-_mrUhCGSl8fVBr+bM1$kRc2V` z+a7CmKF=CF0M$_gNooKlaQPlNr$9xu1>?C?SI z22#*ky$kf%sSUWBz5y&rC!~C}zmk1}v77q5X@<$Ph5v}H zB0NGq{A6S1L}ho8+b7Y_I))C83h5Y}ghzvvj3)_V+R&L$xAd%{RohMVqRSSKhzH>} zG~C?%tP>uRJh-%vhn%?yhr?HxMpXHbIiTFcyK!C&dL7(f6p(cc6h=tZC~SrPk%-W) z4{Eb$fmv%i1&2lHB=ZxTBXoQb3O!k!gDi%c&4~UzqiVQQGtVRf>wyT5t=$?rc_OhB z=jW}uS&BdZ&~beVr+0)Ud^wMOUwM8Qoiw=+Tgv7#&+c6ohRERNt|Z7e70zAWML)*N z{|^9QK%c*MUvs@WT05z(lUR4ESfo(gvJ6`i-IZyGyenqr9vx_Edp8Pi z0kU`}U&y0t}77?s*nv{@AeaOJ?&3#_@?aMI3Iyth*Vg znb{1W;hm$A)a%YB%zOxuj?$Bc6Fq{zlU3AOcVrz5m!3r+ZP#XNWOxvOWe}=>-*oF zJlDrcWcHt$oy;STU+%)P;PbPCLH~w=eT;kUjyeEc7RoEJcBqJ95dgw=+3lSx#vLmk zBT%C|?ffhxa@|{SD1~OBkYCTkp>AbrjV^lf0hl=ITn@=00ER`vE7lf#AUAYW21WDw z0qk!$Y)tOZ3u1~MV*<}lP_Cxq6cqOwXE*4k@UBA_^D_Ip+l?Qqjgku-8J2=uEWLB& zdVtDc&}#w%oF%L&_QG_NK@ z?u`>U;voGjl$Y2TZl(ZiF*YPF60T_xh4v5j>ss&Qtz{;MupvZ5C22S}!^I_(i;()w zL3?<~A&*t_U9;D3p7k*d6a{KjZoWvjp!-ca!{pLyYuojm+RMEYz}{%wK@}aNcPlTC zA(`Xnlu>~+vVk1c_O}mSG&XSc2PGl%}HMoiDV(()IR%YF>+35$>?3-KT8)=cDXkme?umk`Uad<)MS!?QQUPe4Gx z;}tm(B{u~89r_mNrG;2*@Qv&Q=K?;GNp#B7N5;_NdVD*4pXI?9Dco$eI-?23iki^g zXd|7llZf*c?7oA^w5v}9s}Y>XF{nLA7=`vU-bP27&>zQgDzqJ9wqtHN#&u>+d61`* z9B6Dz8!A|L*b)$LswALaZwz6P85>M0Ml-9%Y|2@6@I|MkX&1eaH=lxUpjy&`iQPpE zR|}n*fDGNf?Lc%fH`a(eHW~9n1TUs48f?UMHNu~vMvmRl^ka-XiI25honc_)U-pO6 zKUSPr$guCaO_(+7F&9AC$=#jZ9|^|no2zV7(40cN{yG83ukkCYb4qe#LY>~P=(v>E zj~-kG=da48%Im0K4?DaD>^x0=v}8+#&%sbXx@-n-DHV6MXnRm`N#jdNoud9oUvycK zSGYJk{pm{biYo}WV0>eV`q9zBQRDchZ$SeZsCXMRJ%rX~2`AdylP-Iwkyo8(r@13# ze++r!42C$hW{tmjPDw<-hhUTm!%2ni-#GQDyVlM@ENVHMK*dzDKe#YGz!A&?+WV+3 zOTLy3mloP}b1;cD2^yB>raH_kANIs~jnzpFJf;2Ru{f9KrTlaK=%B$o*K%ux!PsPt z#(K0^Z9+>?4$nP}Q=WI7yKIZrC4)b0TfBV=*t?}Y2NvHm=gthh9nP5%u^uE$iCf5X z8)+!ST0~~Kog&6%e#C+C))!NTfK7p}%K8wU`ZOdjktjj{qBXu5O@IxA_F@#--N}GfiYXA}h(SOkBVR`sjidP4&FNn$|j&n>{mlfATewTN#JF zOMgixj~BzMejD1IjBg_SjUU>~S;o^hHj-ydaB($h!?v;5l)<|me;&UczLk|~Iu#Gk zp)y!zV`}Xs3#i{g$2!TH*=@sph(Ss(a6r8Qw;GN|ea+odYo_z@evUewF*!ioN*cc6 zrLT7_dZlaj{U-fh{Ke1gP(2@wn7AqCoBD~)-9^q=S`)0PL5M_Vn;@s4wxzMXB>X$1V@M!`E zjCS*b7_%&#SS-?xQIsVfYcsbbY(xU}grRs+HUkc)@dpg6ul^YTeGjiLn`>)wH+F69 zc-VT|nLI*?S&m}aaDe%9{;8c2i}?atk;9xge3eJ@RH+LUZ(q9~x0>wHHODuIJ1^tr zEL6G~ODpA*;b>}L@m+=#`&~4GY3~lHf&u(&E7;|*O=kf5 z{_#4IW~ceKgU*{{R{8M8CrBPw7!i`6WRA9nt(^L)cC?-4d`w+MZe$Lnc)OIV4t#Qg zM-5l~P9}}SPDkviIOu-wY>e3B+@6S4QKHaejL6ySpATURzPJoRV=cKy*s7tt!_AG} zvHWAd#0fBLC-kgAX_qMcdCpwamRR#0l3~Iclyg-o5c1M>njUGQX6xV#%~o2W!(v^w zCDQ3e2A~;pDx3f2LAI}oCqS2a7IXC4G`@qn{Xx6~U`zUc>_~yO?!@Bnwn67t+fi>n2 zZO-5tA2qzjy$9Gx9HLzr??U%G6A&+ip)nltu21J^k2OAyY>&I0RZ}ruGM(c|bI@*% z+w@EnlG%;Z{+s3_!gMa-+|Xjf^I@>u8-u|Q&3LBv07Do5^CpA#WqXc z)($DtRvjx|$ILonSqVEQ4{mEqtFmE5{p5CR^d?_N@o1``?D}PMqBC2*8oyRrTjXGU zMJ-GWQ+17Q;HO5!l^y+&<%V%e?m`{94{~aq!JXzA-akdWd&Raln4i7=Yqbsg zPG^7@Kv*F%aR6rwN%t`vm40$78bguV!esc6>wnO$lHo~|sIZo~#1dSyCiLu#0?`<# zQ_G51U5vfZ{UE^R8A=`L?45<-`$&oE&*KbHwq)T+qghJvwRh zC=ZOh9FEWPZzvi#dWx-2KOVDEkVknqzu63Wtv%KTWiBOw!uIn#e19E1?*FT;|5Jl+esto-j7XPj5-!1yS8(;rUq4atEf6DbAU5R&C?D%*K z*XfLR&zr%;j8`vc2cGeA|LPKCsn(3QY%`hhk_D=yF*FB*Vg6s#woceGlY4O!wLV?b z!Bh2_B~dJy^alA|yJyqIJDRlw`6Jx(=d#wTNw1&ZyqR?NdX#HK^0fc6c?JC*tEWwM zG46CX(w873O@?d3elvdt!plG3_VPg|{p_IMRGaYo>1y-Yyn2}Lq<0nkQ~u^#!^`xu zt&8Tk-wD(~zX!6Q+P|7iI%9#f8s*K*A21IUh%B7roe>aa!pw55cxLFZy0cr~+ivXF zUev`|6~r^QSX!T1k?ERT7filk`t2EQPYToyQWdXhK_<;(d6Hck?OLWj?*W zV6REE47*(^0FIr4>))aCHi$XBXCXGB`xU3^7Va^CqxyF*>&GXU7APFRd1tbPs`nm& z$)pcozNke?Vofd$A}fv*2kd4S8t-(AiQ~13C5<<&p3Lh16L@(KN*>j|c~Rd#39+y^ z1*27y$tPu!#zF|ZKj{u@(B@*aqoNVw;k>yU-K^&35)R8PLOHwp_ahy^Ir^y)dXvmS zM5JhJ7R#bt3>yh;CSt=bHxC<0V|a2OWIV6ew(CdHSqvk~08@IRyaj0;0g^Z_E|EB! z9lunmB=p>FSeoSa^~R>Q4)#xQ9Z~caybiLrdwc>-4?5STP)2{rkNVBtAd|K$rL)oT z&2L7Ach`nw$}H3r;*2ii?*6!NJ5*=Uk-UIOeSBEkS{z?FwHR!@KH2oUF!*S-yETPO z{I2aloy8h4Tzb(KbcMT(f!Nty2Z5CqYbL@c7H!6^v{*Cd8aZcpUAU!Ky|f8R6m3md z4Y26?;N8LaaEu4hlbeh@4--S#L9|q7@a}s_7szhfc>n+pGgN*`_s*E|UqY|1`s5R2 zo~>ChO#2p~4@vz-CL7yVtS;x&?qJeEW+)d(silO01fhQ=Z&Xn%#D;@jS&O{c;4gL#Ic(7bbd)Qj_sbBt)5b+e>d`2zg5T`%;{n;Gx}xNSHA0AXk675smL` znnZ&N&76HoW4SXNUp6O3<;kQ^VB?SsmvWpm8V0=yXdL-;thEo3Uouq52x-bF(9&8L zDwEip>csmfQvtKYk^gspAau=lsVa9+a!>~3ECGL@r@a9@?6vdiC57JA7l)-JUWWw0 z&32w|5NQ16WV%GANo<&jG>qavPf?C6qUUH#Q&qLSy@RdV$-$AV-Prq#jSHFWmg-9T zIC*y2CbFC|ioSj8YO43xUerXElk!tzN#qk`){j`)qK3M#(a?gRE)T^yMHF&2yuXM! zsF)Ds_(00gfL@YeKaK4jQtE3l?Q3wj{;?b|JKN5m&fZ=E-&lyxT8lEoXDe(O2621$ zB0XcGWwJR#bvs0QSV@2gmu)b7{ub zKvR{N0Sxy=^Sx{j(J>*T1%Wsx*Q4-GCgTLJfLH_UbuoPUGbj;XSca3LlxWS*aDDM@ zl0`U0)b5l7G}`;*zH0wCnS=l(3O57OazZ;nh=rl25^917) z4BzsJ;nhgNTJ^WuSD`Pz=0Z7+uMF^flOfSp zGYQ}Eenej}(teDk3dyZh3ijUcE_^&a^G(;du|zvvZnpU@yAbSmG1#^lEjP!!X0zT9 zS#jxBu*Zn&hKUF$EhWr9#2Th@FXS+-%2}RuU0@Tvr*GDKPo88GFN&vU`OdFb&3=%Xq5G5j(^R2|9U>Ok7yYTj6@qM!zlC$tj;5P{#9082 zVbq;=2qwvd5J6}+5AsAN(pot9S#w%1{CCk={SG(G&ae4yGnmwlI^9e+rii?=)sJ^T znEhTqlbsg-1jI2AshhhMQS&hsVMXuIZT?*zIQ2VFmQIEOEH=g71%#9&`$%%hvzdG5 zG!q_6ws>*ixHBVePK+b~>|zGX1^V1J!;+~cy@0jM_c%nxvri&pTP(QxWmuNmc@)Hhga`R4w{tc0zXh&WQ`RuRE z(KK7b{@-!`n`QoF|FoQ6QZwv-R@yAP zPjk#8w)-2Dx^s);4(b(mZ_LuUNhrN@!(9LzTqL%vUnPzZ3-p2pmjP8l!7=cGxZ``Lxvi8wxQZaL%zFND}BTpZl}!yq3F9^OeKV^ z%Syr+c98>vL~SBwsD#l771w7L%Ued-k+#j68EGk-oTG(Jtk|y&whH0e&l*a_$^#rt zS2JAfQBJjUh`Ma7{G44%njX+Cjj5CTT=L<596nGCx&$57!2{+V>CC3sE+3AN2CMiW zg?mUQrDm@m-18G}T}@Si$FLOZz&#sG(xo zLb=m>Ke)Qg*w~t5qnNQq>6{K7BM3{-omq?4!sN8wR5K8}&_}Zm(>2YL=JYPgxqknP z8643fGvB@})Qjy3HWlyCAa1Tn?eQsvcy6z*3O7joUw`X=3;BNwN4&2W_8K2=69(Q|Aa5k1b`FHY( zRxg^Z3+(uMPT=3~FVOQET}FYRMY;9KH1-S-AA4j!sj$^9oLt6 zRtkF{v)3Nc0+_36NN(5?uMNTkwzPOVJi6H}h3$9-e-5wH$odt&#p~7aW|oSr=~BV0 z)3Ce+NmhIDmKurWVWb4fo*%bhc6z30cm(N|w%vFStn#X)abj`61?tUfhw-#{joB-d z@wC_)osUKC)7|S$*W#IZUrzFQbe~7}UphKfm@7ljwmoB)pCLg+#ef6>Vx~0D5grRec;cP&xZpAw*FeHJ1@ePQaoKlR<462fmE?T>Q*e}&Rs~MD~0TilrdGN+N4OS3YDx>46AestcE!xY&uTW zh(r#FN}}A6V&)V{m1EJ2plTJ51m7yp5~oV)TY*$IQqx?5>e7f@61}y$M=D;CltNNL z-O`;Ex(MoL5O<0^cUiVjx!3A-7GAOQ*QC49>Tssa9VN@CQJng;4KUS+iKTFhAtp4# z@OO*rI}x*wQ;Iw@MhN*{nR;TGfZT%2Zh|DUeBn=lVfEM*JjqJ&?)E7#N@7Bp!P&^b zA;y)2x7NCx!)=|oQZau|HYOWORgv{R^*P_@meePKXPNK3%2W@gV0f&)7i>uW+_4BZ zvT*Ge=i|w@RQnoVh)AWhUR_A@%P|4&K|70O`YRwm&d7qJz z`ja6=pT*01^FB>UhD2DN^%;R$ocU?fj?0$jeMU-_BcGNqU!0;B8zE+WMoLx%QZ<+O zX_pnXf5vBY7Kll7#%Ba-(kB~0rszd`=giLplf047?gU-=)WTk1ksMFN8aWJTF;enR>#zhbuGp7Sp}OwV4+)*A~gIARL!Dp>47h^Zp&@ zjYZ(O+O3%acb`2AA6Z!%i{s>ywNxiA$2bu!Ft>xob)Dw!2SIn1+XgIpvfodAzsu-u{hSHuUh`-Eq1n_lz&R9wi|%C+#hcu= zHk7kIzg)LB4kitLw*gE4mf||eQ(@gY@-4ZGANeNT^6!kh%~nU%IoiqAruGl9y*(+B z?F=_h_P$%h&y##iKFsaK4&Fa|&^|156>w(H!t-}?`W`wIwt{u*7kbe!;q9lCBzG`D zP2GM>9z6Dg%jWp4{hPWy4UQkjfN2+TDw_)3iw$aY;TVEUVH?ftaT;+gYXvgr!bhRE zfK$4UyTBK~G70R|s#%8x98T^^%YnLJGv65t-r-4GofCOtt%A zYI5=FPV%$V*R;b++Ez8nJt^Lk(S;z<=nykAmcg(a=6WHvl2apnQJm*85`$4{=C!O{ zyu-;C5zVbneh+H{bL0T*ryE#qO{Ljr0g#}5%(6V}N?jclNud)eloAjl^xX^RGtm7U zsy7v;U%<*3W=V4V=?lt0sT+!$!I*ANRKZl<+5PcFeGL$Nel_l>;nhT446o6l^34@= z=ql)h0AX}1qdqVlt}H@;c(TfPsh}CIphx^~H)5+OToQiezDoiT-grys;P15c@MPi# zunPtH`@sHz=KKGjy?1YGWM ztx-#0#%7=QL%g5x{UpD0se4yT!f`UQzbEtT#;CgPb?Vf)ANBWnI!TG*k@xl+DrqRk zQwl1o1H*=yfWp&OW9JK1A9#>XQETEF_!0IXk zF1;h)Sg3tgH+*6i!q-Nz-!Dveee+3{NCIl~7>FGO#NQ}tW4jro(*Cnh11KhU; z`0*|SV0JJh8Gx3Uo{I0*ay>t=dj9KOdM;TMgH17xR`ZME^m6XN56!^$AAG@{6`#iU zR?iRb&~wQO32y~w@f~uQ7jtN(THqjSxy`BBQ?Hqg!k^X97Co{S^1~M{#0zk6m&GhP z%^%D(AFThzX=0#(-(!wHT628xg>%$C`M<{m|7uO}hr8n@i$yL#Q5N!h@Z%Tmfa9xu zmtC-?XKjX68r+i&3$H%B|Alk*U7UZ9!`ra%^TS8K@d{8Bg5PD97Oww({Y!DZBYPMz z$xEJ((7JAWO)s_t>;PGHppixt_J@1>gkMm;C_Ju;NH(T3g~wjqI&0SFvHtLjxK&M( z0hz7d;4kL-xZ%pm2&tzqr@1kUVT8w0J#F9UC5l@|l(ez&@Q$)1Ee^pnx0x#hV95}Y zuy`yeU6J1%$;b%9gu;4q|7(b{6eFZ?`_6!3mL9&!XH?30%C4lv8T<(ePIP}W z5WZThRM@9no?0FES-iZG?GtJ5bY42lqFBd;9zBUeZp5;`)eS#AyW?e=tM69#KCXMI zkG+gPc_&n$nx%@v5 z)*t-o|M|Zr|IgNV-1(B+Kr<5nEtKMCfeb%)$-|SYi*TP!M_5|_8~oiIoW{MQNz%_| zbGP&ekGZ4*nuCT!ncv#s`PGN;@r6{(}Lzl@H)(<2j$_b+eZqOuH9bDk=QD>PJA5bdhMp1fej-y!x0CwZ0AifkVaM<_lJ9 zVk%a^G&wkSx1*(TjF^N1*rG5a2te=poPF9lY z{h4>EegKuG2H!2z=5=S-%Pu;Xv1;sk@=LNJm^TddmpZR5cUsB?iDuO?Qo|UWEa~)R zV)mof4sa=}kN&#;;NgS6KKv2rh`(+;+_?YX;qK$oR|}l~6@unl=2LR9;duE(+&;F* z(R`eI)jkv(`-_6)TaDmsy^!?$LB^!F^5vGK>KUsx8u|cLqFnlnkdhBGk;*2L{w?Q~{*LoKzw9I!bet3& zz#d>qrR#BrbWWXdIvw`Jr{}<-Uxx5BX?D67qSJ%Rf~xy?2pnKn=0LrU0ggC0Ii-sB z{od^>$Nfp@Fax+seAR)|hGJiLJ3uf30t5IG+5o_GQ`gr(S9~nPDTVvAY!2ZPZ?joS zR@6K0SH-XUI24z!3oIMmS7pK=3-oO4y6FJsI&o^NqEP*_elnuUl?uoo@eXb*v+QD-mBT8yb5TPWBi zet<-Z@69V8TRZwB5J_@d8z?imbj7LEMVznlf%KN;BwnzS@H21`1Nn@g7=c|hxw*&H&@cf;0JVb z&Mh?TZNYi$i~%e%8%`;loZ^09%f}M(GY)Q!8Ghi9V$7%{n}oJqTa|S(6Z%k3*xdr$ z{d>XNUCl31At*m88BWeDR)ML!I$0(u6)JFn{6t$STH*6gtwcQGfi1$sgcZ&3f=Z(T zJK9G-J>DaLZn$CQRwElv8X_2f8?VMr2Z4$#hS>m z>`%p|Uj+3fsN@)l8T~L=%osYr;y=X{=zifM!-x8krk_rv!$C~8iLBiLij%=bYVdM| za&|N9UX0Tr;K`mF9F^)<91#l}#(tdCyzsQ$E4O68=PFxOOICo)OyoG;nw?j^CPHjt zO%(CJHBrdwO1Qz?H^c}Kw#ywNrMU_0Enz%*h4jwpbaiNkgiAot1Z;IDJ20utD(>Rz zXpk;XM((%A*`=`D#!gRQVj{$#_S`HtM#0@F7Q6q6?v zq_Q-h*2A4R3}eH@<6I?ql=jKyE6Lrr55rRj!GoD(ayJid2B&G?EW-3NYns-Yav4MF zoeYJzegYADXGgq_yX~n2L;Kywl2ERc+>SZ#yHEb)YP*1ogUo<^L)PYw;O-Z|TI~W? zz+Md^s4VWE)g7p9$UKKd=V zR+MYmYgw+PTvgf0tWNY4y-3%y^EfOp(Yung#q?@edxQadiz&>z(Uc3m>_uoZi0BYz z0@(a3Q(Zx-5WQ^|AbP|zQ7(&ycg0MFngCvV^{EJ~q8N7-U>)2IAI;)BPL~jF=bZN( z?=S7O{~DOI&^eH*l(*Aqzeg@@fR}rL<3o-`t*#-;V#Nic6(}-u;tIjHLSjvGe5f1P zo_xeKm6n?mSptT%aS-z!!$)Tc|YldnA4w0`n7H%+LY?l)v5e5uMVijo{se~79 zG0Q<%fq~<))|VxfK4p>3z77IUg#%*=W?}C-zeAApZCq556Y-IDz#yeBTz~YN zcc5@a9(!d@K9R7Uo(XNkV}=e4Tv4M|WiA-mM0bfy2s0qo9M?~(K^s2C1c6r&X+T!& z>5gl;dZ_VZR>vWfV0}{rH>=y>djk+Ks|CHX=!~x++Eus_u23W{#~LaOI4< zX`r}Q@iqwHu6xl*fRj@^J>Ynf%qVs+q`}bh^S2khMzA{xdE}n^jEex10zYF5^VDMM zfoaM~>Dk<6!3U(`_=Xbbodrv$phH|-N(n6S=6V)taBE>;5Z{S?wC4=;TdyE_Tx_9c|2y} z^>{cP;QQEyyVbD{?cM&?+Zz3Kw1Wlr`y=}hMg#5-F!)O7fj29vL-J&=(yY>__{>^DYvx!Znc&j#N8WQa_=3cDkL1%Q~0Qo7xA z0A#pQ;3`izL`3KeY4s%Sd=UI$Bj0o;7xh8sVbTq*_ z!{Y0h2MW1I*bKc z+tuffc54YHBq)0(+VG|T+3FS6U$*vI2d|quHoV(nDtobxDVECN7-x5oSUZ^@ZFP?K zZYcghFRF6St5IxjB`1dXh50JJ0apHC>-GmNhi0)nUwFTA?@OJrXU$uA&6|VS1MlF> zA<5r1N0>W#Z4oA48-gqkg5+y+55L*_8F;}AL@Vs+&BlwXhoHUJZ0`{PsAT zBR8Yw^NL=A*Zh_g-2}ItcT4RF=ij*EDKC7YZerft(}UMk-cBDU=Ck%H%xJKoL4jzK z%J-PQ()M`GB_Q}H%}$p4JMHY@*1=EizQT1SDGu7v(I0MK5nl05DmcCt&v z2RT+*pPp=vQkP2gZi`;vh83(kfcXnH|28CQUKsg#6^)sDk(AtT;M$7nNf@hGhGPAD z(*y6iZ8mG$%j6p759m&qTUIu{qNHGD*2M0i=1*Bm_PQNHT@KM62Q*pAeZ}k67P&6? z{GoMtT*P!Kli&VahAXSwK}L6KB;ld`HMy6eV%@TVUvNqB$H^EWEU17Ez4RvKybDGi zYA=K%r`f$iAPT~TCvdGfbEpQDJokLj}Yeh0tCo)%xs zSu6Xk+y1Y(j;Q=VKg}ZG4akOkZ&5itTl$E-;_tk%nEDcy-V;YBYskLfq93oHiU^@NUp>1H_vj9jZAV6i}Am(?)DC-F}s*fdg=AB zVrvj27y0?K0s)*iUD6#4mQ+OpDE*}^?=OFHweNE)Y4sQlscPlT-U?n_v)rQSECpNV z$82#et&AZX!oIr7AI?P%Px`q?-gn3dUM$j+62Et}PBWA_!aFuhChN4d^_yFfbsOaJG`|FQnA zcfZmYv*Z6f*toy`gB$;6XX z+Nz6#i_SIH_%)r9#9$ov5)AElI-O7ydU!0?NZi^>&Tg<^ihlJZ^v&>Lp2XupCORDB zp^iQ6Cf#_5F=bb~eZ1k~#lcPq-7HH>>{>7O4-WTRd#|Fs_F?p)_?`^A z{b?^2Wr}BWQMO6|kfV#ZKXOW+a6Gj7#Z#+{15>(XUG!;iipp+GJm?j^ox$49#G9?X ztyj&Rh-Z0VKB#%WJ>1W&1 zw9}8=0Je{3)|rlza0L~*HT=~MYZ|WM1reP+3k={1djl6x?9diuf)qh2U?KVKajF~n zMrNegNYE2P)w$~QlOFSecp_>u|9;dyY$B*EWxA~S%iFEJo#@RL?eD9@*AYz%YpLqG z?oRWiRk5;HQ;zjrq>e~+6-@-zSX$a!T9WlRg#}rca6L-G{GDGdYVKoz6#@XD9Lc6a zl*N+R6Yx)xIYAB)kCY4NuBKI{_$$|dvE;r~t^woxN3UAu4gQ(8DQ1W8LFc2Ym!669 z+NaT!f-3&{z^cVL+7N zo+7A6Krh~};P=N^B5PcA#tD*vm2XXxD&}G`(~)p3dv z5xzZovlZ<(|9;dwIE;?=Th_knWz47}DjVzfAHs99ao@s^p}ya4!N$((+^ZxiKW_ZB zsAFic|Eqi*3Og>SWTw4tdiSm)JcqkG(cadZW=-7x{t-~f!3uOmYU0Or>h1o+d_8OD zYP0q-Fv9-Ut2fQP!m)fq&tiGY(8qWbcS#%}vUCt%quLTfFrYjE z&b(k=xaqZ-=a8S7y|1;ITb*zFy1BK}gbSw5paOfhA|BkYk`W7_b&mQ-`?Ebi*<+rPwST85(4SZUVjj4Tp)Mm?Ay6WJy<}32dK|G=dtQ#%Q3} z6W0lx8Qk`ZPIeJ>GIXY@6M?2&>H`}gf0%&yoJHZ=$@9}F6=&^=5 z>;8@+qFbx>xVZX;uKvwgrM$Jh-F$mkuGXwy(e~@D{ez}o+T7a)YI5(DSG>Em_v#2J zI$gZG+kU5i938%H@3;PQ>#)_{Q-#}G+pn9^c6;w|zrCvq+k1P>ZKoPkfJ@?yJ2oE} z?sCP4zrJmnKH5LE^e=p1)Zg$Z!f@)>%l-Bn_4n)cfi7<$gdc9dwtq{KIyz|WZ8xnC zd+ohuuJ%6cj$P?!FWmm8X7gWM%gmI+Q0l71^3>W5733p{pP;3V=4u8pI%G-*M8W4UTlUOhF7r;&zYBCrd!)tOvxSUQ%KQroW zqEI-4c+ef)RG@mzCfaL01U4sU=e1C@U}S$Uh=E!0 zr@?Zp01>5ot*Ri=F5`gSaL&m`RJ&q7Gcv!Ue1^`5EBx(%amUk3@bK^m9g()&$IVTe z7D}-1;Ta4@)``jK)4Z#$99i!UZ;meiJL#EVujqDInOLj<+~0|dQBBO=r&>wO`=8x` zbYqqsTt?D5OctJIL$4qJ}#(uWmTk3<<&wHodVFX_me7>gz9Uam;XDTifc|ibs*1?E)7wE!S*O9i^zmoSB8bukKI_B@znNF6-BA$w_{Y04x zY8<5R{KaVX>FM-rF5b#F389MI9`lh{ctMY+CTFDd(p=?AWm%tH)O| zMczrZN>H}C`k2E>N^KmzBE2b_mFeRm1bxMmVCoH?V48-MI>2-dJY4zkpxdeiNMJX~ zVHtxN!qDv+YVrzQj0uOaGD%3xjdD@s(%7aez;ep>t1aRUYxZ&^@!#SHo5 z+_W+4(N~*ufw%%1)r7?bR=@57VF~`~biSlNWNC_V{YvXnlP@|l%F^?Po*6R8U-{5* z5&i<598Z790&On-D=pAogug&PA=GbO<8PRzHx+B9C;)tk&So$+%iLsJ{eGwF(LS9H zyCm<-CeyPsdf1oI+!M`1V-^ldO3F&k^d*a?M-MaT6t5X(&SM#YCn*|;p%LGq{SQA$ zz_x8SE9%9nm=8jHqy{}@-ei!x)hA})k$s}7g<4um65m~*p*(zg%>7%NUnNSt%U#&z zR#jYOt{xTA5_zxSGft9%X2DKbv(v>SC&4w9&DU~GCb;sJQ}g$%2E@ZHS6(Mc%Kp)d zUrB-hOzM8K8MWTLY3{V(Qtkd)Bc_s}(&~odx>mTDqfVB>J4Mm3qdgleYLYwBC&d6@ z$Z=?9eyGpxdq?)duKLEU2Cs%yhtxM*L7`uygthL*ZHvguYRp;}u3}$*sN(8(xQci6 zFbIdQ`ZaNi{)T zFlIpM9y-?pQT2}o{;<+^0X@F@RQ`fbqyna}BAKMtWknMEC+w7w%IsB-W6a48>xKi6i{8f~#+-8M zfH4!mj4FB(nbE`|OPLkA(OPh1Vv-5=0rcvHQdbQ+mk3O_gK+j)!T!-i{*5+Jv(j@m zkn>;R4x&-|8u^FFjeNJg>vfB^?$9;U%?aM_GFTiD2bm{-GLQ!|ZmaaXcjNueuO>DcqvT zgk}oh1DB5J8WYE@M%T~=6muj?YA>JBs;m#BN`Ho(!j#UE^C@be5F*d`!V~INc?T&p zF6yXIkBni#v2k7P9g4D5RuzHzE~7IxI^ye#cqltb)U}|LhSZhdUIus!G$&YNKRw6P zCNTDOIwm|qnivZ?(dNaSEJ59~Hp$5*cn2o@a2x@+qtkXNWtdeI(&Ev3sRa zoVlY3ES>Nvh5ys*Mi13w+(Z9^DZRT=@kAnRxjtGcp-%PWu~t1Es!W_x^Q2~gjnF=j zF|6_?h4r;2G-Xn6DUeCW$vH(=AlT`kVyutI95FPmk*Hl%f+0fasZ<5*`6TldWK@x$ zEsQYKT{0M>CP{g7yZAR>6j_gM+FaB^ITLZUo1DLpY3Uvip;je|H`L=y*&LtZ%P|s4 z3VFPjtzYi9_Mi)$N>>h>GZ*4@ecQ9dhZXAN=_XA}+panWLfD%!*DSVaDE~)>!kc{t zj##FmG>J0pvw|b6m-8YeT$xQ#sbhI811VS;9pzDCiyAGrMhmFXo@mdPqGg2mQM-G} zi^*6U2y@aNo7kvMO_Pk0YFhyu=I&H$NLD_q4?aVgnamna7pH@!^kNIJ3_|r}d?SUd zDZoEoYD}{P_ih+7wxTQu!*sZc#35W{ zzM6nJB}JuCR6-Ul3K1KUA#i)mPX944e)v`Q&ijkrbn}#b$$qKU%FF_>Fi~Gfe9hcJ zn{9&w~r;exFTG!fI$S2@)Pe#04Nd=MGOguq7>#)&)duA^&%f`N%LEzN3m5+CuvD01v`P&?2QnA#76K2 z;Lx=ErQ{5i_OG{oZbt35%{@S_(Ti3)dd(s!bUlhN>|K;)eL2@bid&~Fyi7IA0AK6( z?e6zqM9p6gqy4Sz!}fl3u=TRZB1E)*9#f#O2t( z*)?0?)Tanp5m|XxsJEIcx5BDj_Hp7Zvuq80Jx5tdt=}{cU$=L7_&|M98U_m*vea;|Pp=2|{z?*H7}kKXRL58K=A-NL!Dw7hJ~<7MPn|AoK9w(10V zaL`WnJ0(HR85Q`0N$}O&3cAyf?*8+?{O*~kr3!-h@9yA$nr**)S?`@=c2^Z{$aI@P96)o5t zF`L_(u`xFem?9x~6=Ol+p+Ev~gPs0#=K7cYub-Tf&sTkX`n!!W+y86*!S@d~JpZo; z4<7xQ|NRg7-x4yy|BQ$7S&aG#@Zg<(gZK@&(n7s90w84!uS=Yj@TE(D;atvAj4-xr z3MTPjbe8mEs|cQM>lcrbq{}6%5&2{<<6tOMm*q8}=3=6=vc}rlc`~_}o?^fff>!mP zet+%$gC93cU;3jYq0Bh&oM2?oD^;l%Pk=&MF8ci68Q?ZfEu8$59BiN~CY6Y729&nM zB0eIh$ZMs8bn8{p5g#}S?)Gl$Lyd%2xF%6Nq>Ja%|sEF?kX8j$XLh0+Rg9wElo2q37&R9xsmY7-PXtwZ&+C8PmN-#7_l40^-8-_6;5P)h=_kyBf6p~{e=xjQ|1mHE4 zpfUgvE4v>P*CAK{VnCh0A%@!yN7B%*Hs(oni^=efSAJI08AJ8176 z*hsa09uF~?O>B*)TNR9_hPxoO6Mnwp%oxM8fExTDMQE8!!9{pO zICMx|CauyS9U6r4larsHnRZ}=o7a*x!#9nw@t zkD=@M6m@wjdZz4-O)#=iN-Dm3$$DG}ge6XF{}de@ZXF&Sz(rmDB+3lm<%TGymt}Fg zTt}_XKjV^q?w+Id@jxh&MjSU9jJOm5bmCW?q?ho19;+O-!=!&g@=Pu#cRJF^PEi3m zu~z||=m6qpcCxO%CbqbfP3*O*k^XZ%yG=b&^AQJ%R6F|DdLQ)U2WiG$AQ0U;B%voG{xc;CfmX$ILoAdgXYshzC7?XY{87^0yM^pb;B6wkQJ0r!1HJxHw zslJT2Oz|f*-J*ogRwty%A5I6Su>F-x1~bL;RqhRR;vJcI9L3)08GO9IzAn^4Y+680 zXwwgY>F?g;68%4TNb@ou_UANa)+x3~-b>3Yig2in$m!{%wC#3+e z+`Tg!oRD_Pb;@MZD!Tt5p&fezm~y~O$0r55DrqmiTB4VV&+H(kTYvW4wXANRJQ1G+ zR&NNeQN#S{MR7Hh^@7`A#RC2tBH@qC;k<6aSU}z=lMJj%HR3-`3Fw0lUdQYu^V2QT! zXc^X(M!-`5nKG%Y9e?}yWUX44n#^aSOwBi!K3SdVd0TVE$+_^tx1c69p%krfIH3dF zT(*cJqR1?$Q85EHo#@8Pvi&NyUlyBBoepcEnryI7b#V%HO2Ppo3N6~uJ^n6gfI0Esez^befye(neDvT?{_o#G{$C`< zmxBKQgGge}kXU^>N&3s-24syJ;v^Rlj9N0$8K2i=tk>vtn)G{|)llMIW*lD-{L3sw z90E>C@o_;i&Gy#zPtniK{exB;LnIw<)E=EUJfzRbX+bw(Z}bk{wpWWXM9j%@)ez0S zpA`asZki#Br+=u=vM2mUw@9)H5-1L7^*k8@MFlN;(OHjP14a5gN3sLo#hw(Ax?f3l zie?OMcQ8+W;1#}qPSz0-mz$@ijE`7d%H+y&fA9^lx3A_^r>8!%Ynz1w!3jq*_L~f* z{Yk>~qTLSnrJj-Xgjc6SgKijoH>)^+&yvT;L3I znpu?S5^4pceRr&Aj=IBF{dG$NihSS)psgW9?44 zY<5r@?i{pV9=_Y!r_HCZP^z3mMd|9Vwho)`wtfZr^{~1Ba%-C!Y`w5`*o69_JP>FJI zes+Hbvq6UyoJZAOef=z+bT6p9W?_V?y8$E$vJ@k@Pj#|-{3JdnpGCrI6P?Dlrzh)) z{-r51EE_qftawQ@VxY1Rl$8R8A9O}EdJ4m*^-ixhKHfMHw~xgHRXP8-2Y=*dQ!oy> z&PC3VAZtOIhpMK1`FA~w`xwXT)91_D)n{=jHvdPg5kR)~UN`q!htd1q%GxdO4l=+I zZ0wa`d(V0`0hj`{GLqvcH-Le>Z%GK9i5x>^48?WUL$W|>wKK$XEy*71H88gj6y;uK4h}OZtDQBO7wE)fU?+;m@GXL3`>YGBpBC4TtBai z`(hAxh8dW%H<>-)zk6$T9%$ot~=v+O)hk8&>5<~S9xNq>PprxCWC%4 zSS{???C$<4A}P zqUn%E#klbJFDV00W-D`pg97$hOGehXQjrd0z-$W!PXdEmUC74eiopeV$Y>lRHQVPkz^5o$$Y%Agr{Anp7axl9O`wq8d9QOe1FtE>mr*IB1 ziCfl!=%ZtTzyL+L&e02uf*}H~qST47-Gs)dZ@4}_`Z~B7 zVl6buM{ZYEEJSM7Jzf&;P~cTq74-r#!8{Q#sGmB;*w;M@atgD&jAQb-lil(733fT` z)}=2XJHwMlpP6ZAcq40T9SqycQwYeO>`$MV!LVDAmp)O;TX?+Wm2W^1RJVkn0xfk^ z1Nd{Hy3uGHpCuo83|V&jtnA3Q6(DW$E}?Hy52+{o^_j{L@vGT>HbrVavWWE@5!w|! ztGMG=ZAoH&i=R9Z6+I2;O^#*h`&=13Ama8;yFvGf-EdDa4houp(cF}26Qk#6vquhW z{v63OhKROdtyIu^$gYQn{ajSl5~AuGz-j&1kEQZ0x$SD&!v2PaPZm$_e1dgSL!3MP z5vr9Rn#Yv)%aL6SlRlRWGK8GvT}20KVYS^e-H^(+4OAJc?^bs>@#i^d2t%X3TiIl6 zZWD(MIofa4d42HFRi!|MIy2m^VxtVOW#1Fnk28!?;u6-Bgnfci`f=4w+L%(_JE|HX zm?~b12E0hoQWO7TBH+wbKv|C}{3*)ciIy5vuo9%~>YZS6l48og+iHr(f?xjp_~PWZ z%-x{}!n5DfI6OG}*c&~I*z1`XMAknzHOT4$@h#?%;&bINPBbg}tK`k-I_kst!!8nr z+#C_|v&ypdX_;&?`RlRs;RLhDEt5Paug}Ca>Q0#vUY6y{GBh?bUHLr*95R1@t%=ms zfNo#7PseiG>h;x)6LS|5UsWn8M)dn30uwcMiB~6ofJ>j`4ZcO%1KFn#4$SLP9nGa9 zqXay2oS`RnlAe$NDD|!%SyI~6GRN=%B&;^+mjA>Lx8?eIHa)GB|Kt8T5{jbiP|4Ej zQ>C+YZ#8_gA0)AiBg68ZyGKn9+M?V(fPDp?1*sjW!ZrOH^WLniXb2P_&oD_1%+WCx zwU_=J9w1t5@ebb+OW9&xI1w61(LQQI@XWqU`hc17-F;TUIy2A(b*SN){owu}?8aOi zt>L5!)ApeHo?a2$@&!7gMFZd7?Kv@Rqu3ygQ# zopk!S4%GTp7t^X&#k*F4x#3m?rY3h#b-cX3yz&K|tM?<{zd4GTbDuff*MnJnz(Vj! z`&*;UFmKjfo|pg(FZ7gnj|eaqb|09@Gh*q`e_S8qFBBG>lu9`?PtFj^6GF2I$Tvu& zukpK5OqRZwK3PKlcbpZ9H*r$zC4?`Ga@oKy@ML%T`0k1Gc)*-A={b9Kr!TjfV)C^S zDjK*84hQZu+eMEZ(-y5%QaGO*=E5h^XUQFk(g!{eA2>{J)R}ycQe29H)ESREK(Sy5 zumnT8kc7Z}swB~*+gH9*CseHi1Mm!)%d5}gicM?c!Dw>x%(LC#$$rX)88al(z?BD0xS*@I?~C>>rAcNP;OVB zb9Z0w*zwiLw+<7%O#L^OtARM?BptQzh1_)c++9_r0zr3C$7Hafj^x-tfnD9=63ZwJ zeD3Nnd7Z~JW*&L@m?>1EeZORa))%a+Cs!MuLCt0XtM&YW{#L5!ZUl<=e4{)=V?)%_ z06hI+%$hSetK;0^{{ZgnPCU^(E^R?ROg~1>286gN*p7ckmdX*+J!8g(9*VEeUU^4q z&5YwJ=~z=o`>jR}B!Y4-dcm$^p|6)fV-qwc=p{W&8i0O*K$#6h$LLuX{HKcu(OOx*;^GOI82 z25hyJX6mfxyZuSk&;cn7w&6V^XGs^zWbevgTQ!L=l#_IHX$8Qs)z8%7p(aD_cuufia(qJqxRD6}O9`GSG&Jap zD&IB`qf}>Tunc^_OUq1^eV2!r4xFBf%qY)D`{tplxxnNvtsymGXUQ0Ll`cB`JlcX~uE()tamQ2>0lreuTTPU8L!30G&AMA7*yD2bB&SQBMOS_jWgH5Pyv#n8 zaTqGor*=Do^t5!$7?n?(qHy?Iewj&litN=2{&$5ne_{pyyQ0im;3Zu_a(aM@Onh4; zp|YaYuN8`B$~JdZ8B`Tmtl=cnZsBPF8xDK$Ndwvh;Lm1_OT+4aZ(ZnZCe^jOQd(MYHKS4lP%e5 zXzmR?J^rE115b-QPCn8Mw!wy8t^09Ywt97w|>PW0l7;#yUT<2u8hV|GeyyU z^XQ7Ta!A=Oq{1cw*I%XIj?@azu9C?;`U6fce0*~#wH2iKR@izIHM@Wy1|2llV^hrlZQ`gx zDwZl_ldND+9m0Qw2$ChSOa2o#n1evlLKvAqQhFs@bA_j;UBq2hG41yvsoi2W4S!VV zztxg04zScazC~=F`AjK^kI`?}IX{fkD$I-4M62yHr87hb0g)q&o#T7;ojTOX75eBf zaf4A9_$*J;DMbcB<~yi15B;5~RT>n7ZR==Uu=alI`5N#A@7K#!6k6#Ni~;?>gQE8~1-e zllJ;X*}ZYzeVc(BL-*pYgp+kDvnZ!OdWi&>k#UsqC9#II=%X<9bD<3kN)o#PGmL8uA+=ZUz*e=qz_jvIW+ zDVmTHOjss5y4HezLcwVxh=xIjXg(QLt@7!%TBqNv(?h7LaP=A`)^(a!^KSRp}`_n`7DbIc)MBF2gP~F>Y)nsP*gGo`L*8EhG)Yz?ZF}a%2 zCZ{YEQ~eq&uBy^n%!Nn44(n6I-XVBECyn5j4eRJU(VbV7r8K()ug|UIj>*B;q5mqpQBgWN$Hgqg|z!vEB|D;+Ike zsi=Q_jL4i#Zu;c9wWK!~hE;(c$=g*X5yjca4VaRSbfq&szgki8@$6pJ#!6qx%xAH! zs2bRZ=V+p%O=GBtB&~_~igY5IqDg-g1lnM)Mb|R?Id+d0CGd~MIm`>np$FtYN?x!I z6u_t=m?Fx4Y*X9k9O1$(lPT=f^sF8y<5W3$S@qQiX^_QX2^9AdPo^XN#bRq*R^+)% z*hBx^zpr%I|+F*;mrS76tX# zFp<1f{(C$8itcRCIq3QYfo2EpZGeu7l)bV$5tnOI7`4wR-IUmck8iVxzMP3w&(EUKDHzxagYrcc+soNb_- z22EgflIjo^DyBsyj?q>11Sj@F&Iodl&L#qWH)nu_&o;U3S~{QNxo-28ai@ZE zXkiQhy!!Zq1@rPN9#g^0?01Fm#>{Vd5urm_i6`|X$jjWszOb0F@F*{_~t$X~J&n9BSUm$!cvuj|qNE>4D$i{K$+nbano zak^t6t4lmuCr_JY%;~YLYGR@TX*0%YLc+5RBQOhREih*eVtv^Dskv8nRok=%{w$}} z$-D^L1xqTJuKz|JH%z3?6Q%{{&zp!zhSGDiGVa5n_XU-nbFysC-HJicU>b!th*~T# zTrw6rt$iGDn~Y|0FQ7o#*3hd6==e9*59EmxLd0-HZ^BI zRueM2va!CtF1O=5SY}qdA=r(KL|vh(m@jDrn0WrJYw_Ob$cGZ)9*kfY&ThnCcH3J! zl*&*ja7p5#=fG611NneF0?kJGnlzTH3t)i+h=ElM5kzY8=5~9J!@%t6pi)_kOf|;q zm?W&oB`t_bBr2}~VlTXOU6EZ(fdaoCE&y3Lc%%kj1hhuHePq)2w!MFdKX=Ful_qw$ z{g%!B%#-g!0;1a0Q$kzxwsd+|D1GQD5@=CEpv;uS(kF-Z0dQ`<+&bDlJfILj5o&x+ zQ0xyK-Y)QtjFKL4ehMydw&op{Ul*97>SrN@I_gg`iqqTOqgSmx{ruy8o+nqa`T)0# zgYA&@HHULVI+CJGp-vwg>0<6Pt1mKF9)7W@au|5|*lP|25L^fe%)t*lh*vpMWIXHw zb`YG%!GCx4`dQ577_W2THqbP?jkvb$eDtLc52J>vCcpE z8vkROP%hH)PAdH$&lOrhDH$9liSZ1ICYpBUu2PqC$G_t7VZ2o}o+2pp_$)iS5oxzO z9nTySSy9z&?$G-@wA4wib_YGN{bnchqK~8{6N&ERlP(ivcf>`C7?}F-+wSmYHDrj; zxW`8eBNZR5Qjx0Rpz_?6WW16L@XXLZ#SuKyBcR^nEbE*Dd|1*`8GzQ`(B}nmMr0=U zru}}a&9cS6uvBM0j2+17VUiJzPv0paGx<=mEQ2ca;tBA=i(r4M&)WI&>`%R6nBnbBFwy;X#E< zCLE4hRD=PggPp}XjHWOt&O)ZDFMYBiS2r3m;X#i zXcDMd2u-57zkjz$u!>^wNgNN;)e}7v7I)Lpux5iockoAaPQe_hJor_o?+vbXAy-aB zkKDMYo#Bu$HQ$IQl6rnBo>*#yr)7V#5n@@G@dZQsMcgNf{s4Vm=!bvn{=!F6r`wm# zzgV;Fn*N2h4z~Uu<8uG;`5zuW`r+Y5F8{;#f9n7L9rXXK-fgu@(ti|*b}b7;{Wi-l zNozoO9%trmMq%sxSNi+t#%T7!4HXe@;?hf6mSUAwakq@SD#`ouRN}={KN-BEMV@hkCMfbcj?vY7n zdZx?*@IgYm0Oa-A({G7T_>f%*l>M<~wgG#E$uVdbywn;}cduRVR94=7W~J!oV>e62 z>&axq5;FSw{rU#fmqy;Y>eB!FKmYfu{GZrqi@o-tI67zw{ORU2CcU2I#t0xOPqc1a zV(W%2%antngzGNGv5d!(u^%*WN?LkE^1P1ptz^J`3B$!7JA+X_uE}oD%aNmsVwy^? z?ddqZCKcD1OSX^pca_ydZdxj1IF0u~#Sd1=1Tl!igk#^rhgMtYOuI|yCBX53DGPI* ztXt#{ic0*E1N;)rg-V?dOJt4sff~aFLIMrbi|bzLYK_uo? zGF}msw3J~nI(M1rjirYa7>SkJp2ZBEH1ypVroFV=P~s1^7*^20s< zXEJg#*et33c*7_fh>3>1{rYI{r|6*dpUtSX_w&{+#ou2${;&5JCu^!3Q;#aZ6yyXX zJF?r_YhqzRMd}@E=f3FlVtB%(7>GmAo>Xo9DgK^0=A1`fRTs5Jdr8`0gJeJP>SxY zQ`u)qU=5Ez=QNcD4aP0npIq~o?dAbyS=e|azOzE}Es1TJylt1l^QbF8fRsBz4j*rP6FBy!@(s^Uc_S^0Gc1WzzRs~{ z(x#Vgl_@gHvxqau()*yGfqk@l_PQ>T{|1gO&fCXfgxW}@HslypK-CTsZ+eB*BD}{W zn)Z7h#ql^9x!qt{bk-RpeQ$5H*RWHH5%4h?2zm_YL$SW|bIqp`5qt!X0XCi75iL)^ z=gBa_=OJS3;AK*9W_vzLejCf@tDL@a1GavhKww%Y@}gBFHTNG*9HFN1eXo^+W-UnAV`FN)oJH_ z+#3p}sJ)yswwQaqrF`lmKH*udOCh`3{Hal94dcNLPEXDoDUehX1vdSX+QBSAHil$NB=G@;FD$R;U$ z)cLJchVuYYvM?>VFt`4OIpA9D6AolAUx}HU6d@@QQ4(xxtNcxw+9k& zW${F5w=3{|SA%HyEel8y4!f7pc|5_d6rv)hK{ylDe_*4}GvSH+45B#fG+tylVW z;JZf{he1zIeo%Q}>}jpuby_vCeo|Lj1kZ&KwxM#y7&Go(ZrX-v$_|<;<(_l5c)0qKDqVtI%U}QsTqk1`P5N_{UFlUJGQw%SF25t&_&bS*5qv;jKx4ZIk z>);T%MYuFSZAFKzH_i6ZVKtP=++mLkq}$RQKkxLvB(iIc1C>k`_3^dc{?!{F*@d3# zf_gJcp}Ew;ZpQr1aH!_#_#9LC0Ua=&jwTqi*+Srf`32`RIa9vXn%4ccZh7KcrFJvR z%eo@FsFKK!|1Kb(!*sdlR=w8-4$lq5U?J$%8PEiXIy>W=8VM>0H^1F)|MIJOCw2Bt ziT{9>L6}fnE#G7cNPw;s$p4~46X633t0IX!UA!q8R~s(GOH^a!UVlG+ zKP=}o(1@mJjS3MfKW{|)%~#D|>XfjjB73UlW3>-@#~bLZNGLbE8%YPF*#HhpD6i?U zD+-|`hk%~1;>dmS@U5!^>es#aqYFKh4vA<7_E?~KDGxe!<_3inv;@QiC5ajR-;{C) zJ~SKok@-RFGx2FqS&^>2JqZ^*%g>0VsV@L1N-FpsuDE4HgO9%f-;CQ7;6lJFl1;#~Z8r&0^0aY@A zMulUA!^L`Y&O30bG-Gc^JTUVJGu8EzC-#uel{BN%sBoa-MOwqH|9{X zGXpNKNEXn`*XWNP97#1L-y{C}p5j7_$6gZe#=w?}59*L5D1IPa60l7fU0m4bvuR&m zePvas_<5C2SGo|KNX-PQDEJZ)xpjIYq22RJ^sa!*m&(%0a}uLHS3)lbz^XPihza8@ zW|JbSMev60HMb92?LBmIStbm$?D#6`L-YU=h_6lfh?#)va@i&b&@vJW2M4>$CY)sa zkD7=O{i~NBsUs%NYywTvA>^J|lbQ=e2T*P|!EDzCk)Fng--*r1Wb$fOE+kntC5z*p z3@e|x2ZaG?(=lo*`ZwlQ-^2Z(1aZn2BYM+3eBIu$=}~*4^)4!aD$8QIiYW^2mmJb+ z(78E{HC-k3^j5UnXE~NKE{fJK^TTdBqaUxm-#Y#;ak8>@lJBWz0{SyCM^=P2f-TaA zp>1hhyg&stW9N@mX9@B0#_qh#{8W50`H_zJA$e0e|b- zwYLR>d3A^V0 zetRD{-GjI7y@Tel)$GJ0i6?+KJL8^DKIUe@jIaALD{h#G9{%p|_yxj8I%zm)de@Ev z^-f5*4R1VlNBaM?sJ+q@>;*ExZF#2N>7} zr5#jzp=yRSh&W&<-;|r3#*HLa?>Ix}{>SH8+@T81yY(_^?KKaJDh7P|r4&e$f+&m_ zp$$4Jz9#l7Cv9gWkCO}raWCmiVjT)c#luC?O&MxP`v>+ThDN=9yrz8k)Wxb7M=M*h z6f{GY(LJ-Wk`T>cCa5#aB$&)*S*Bo1*jaUu^e{9*dZzJ#wqU4-85kvccd6-|3~SR? zzre`0akCbNc{jwDvN#z-owwTJ+6v_|ra@TsoYUzzK>$rC28-7TSOwfoX;Tx8vwqr{ zL;%(OgcV12pn5~VHh*~w^y>-kH_BsLdq+*{HNo`XGW!5JCZ(4;loQLuje(dlzOfpg zrxFgY0SEd>lm_3}h&I;O9r^QFf0_kiu6imWM?WIvG&ZMN(n4?ifQ!wUbKO5N+cAl) z=RN9QlNKtj<2C7aEFhq&Ml!lwv!j9{nk52zQBGnpYSrhp^4aprD zx}`}R3&0$Wk)mnz_`ua~1Y#BY{F4whjKgWHscvh=NmUNl5X(qE-7e=-;@%4`FF4fq z>l^u@p#LGFQL+jPk7Em1)e;G~HUkH~@Ww8&EM|Oh9fHP$I>*;Gp7t} zipP!>?RIFSdHWrX#pLXdhc~)?g&aIdw1p_UeG8$%D~L}TO1n@w3>-0rtw!938J~34 z(f2(vx`&M*>fFX2v#bRblhy5$przaQiTnA4w`;eEk-MQ6Wz$if`^0I%BnkUuzR+i+ z@NT%k_0?qKuH+EIEA^dh?^+M%&N>6Tk62n3qdx@Ar8E}^ zXt)4grRKyu3!C2ZjA!@{_0bT`o)wYQi&^BUjkf&*ruu;jj%o-sUbri1uSZtmJ!LUY zE<(slk>nVIO3Cl(P>0lBl7VDU_Wg;0FGgREPmhf zhhG4e`B3Im8YkQXGPly<(7EtE4(dP)mu66pT z?#2n7O&mMSaeSpME6XO~2zd@g-LYfP{{;{G9iR2kqh9o+7i_jYWB(lOE&FYU7)BzC zr7U16InT(B)LO8f6&FG377lzAgR4~YdmvyNIfZKg!li!5D9STx3-#wpE9^DWe^KC4 z$v0emP(8u?McHLCA|eZQD1{k=6`*pD`QBUtcMk05Nbbc}7Ou5v@0M8cL@o#nJ7nmi zoV=9pB&^q~d8eJ57mH>|+7|_eeLtKxaCJ_!nwk5&S^z%5Hz_D>ppDk($!F`xzs+He zoH;vtk*{lYyyC6303})z<9GcYJlS!2W@bd8=*j2qJhsB@U_upC`a%bsGO?0(B&|A@ z$>fcrtR+=g7@m;v&g7`CoY$63Go-@fW_cVt-ASKv<)tf=paAO5tf-_}JV?4}pR(Pa z#~=MW7hS{{Mu`@JOwou{&5u1TKgwis4!KeiV>+5IBD91s#x<3sRJxO5;UJtuJXA;m ztC9!=J#^feQZ1Kz4|p3mk8~mJDG93ypFffuKF+|eTEHTn6!{q!n&G;HO(AkCa$jC` zCs6V=azUHc0+b>ZYZTm4OYK+$w7tLkvPM}WfT&aOnyp=!2!4G{AeYU zd!>Meb5f_YSb+(DcOQL|3MTp8{eWq9AyD8r$IiC-FJKOcY@_smq%2G`7ZI&Gx^$Pbnf({&I@&WDuPeK@JROTytzEH9XlK{Yf*9O^#hRt02@!DO7~GQhU+#mAem zLAH1@w}~C^AiauRzm*PIS)y7yNqe*#$soqSbQDkk(>C%2qyO+IPWyzOl}@*tU}$j) zn?b?Ar}XD&%BG`rhuP8G0MMcpegtrxtAs;W{pGKU`_+<1SD7xPm8l&xV4(-$jSO#~ z9zqUnAUV$&5o2+RE1SkXk1fK+7OJj56=%YdI~kc2elsvGGS}dN;c{*Wh;z`|> zw9`Y|ad0icCRNXmLH1N53|1sTC5z7~>NM$$FfJL1*u%aiG`OZl0*Gh^U5IT-b^3s) zc69qygu4Xf9AO!FLW+)f+k~MQBpHznWtJ^!_wT%ynphWrsnA;ax9IZp(S%-Zm@G1t?(iX-AEO1 zM4@Fnbcs;*>N9SpOKIzzOJBk#I8@sV*`Lj?-^uXY?}}bg*Q~^qD=cFSySlP#q^f93 zw0!b)tWN+G3dXk#X#8LmE5;N+JL`u1k_sIdNMBr?>wWue{Ryjhl12T~7a^kbM?;~1|IrvRE? zF_+~Ji9|ax97k50B$T^G21xthrn6#44vc=GV(6Ww>4XaD`U2sH8I3T6dtc=gp+|}0 zik4+m+A`ZsD33fK_v&%oj%H3aJ*ztMtrJmAeE19Zwt6kT|4V4H!veqs}!` z(I(`TiL5(`+4m}yA70$wiWXmx1!N`|py{3>hL>)NeLZ4YN0|0F(t{474! zVL}6O8`i>NVq`a{ExAp(6QO1>^GkYw)fnTL;%V8 zuir1u+}Be6_SVE;@%J#PLpSdC7l%s@S%K5NgU>eL$pSquFK=-Oe*WuI-`@Pvv+#+zP-yc6xGE^+UIQebCq3VI*iaR zKC3hsA1L5q)I}|={1^Il=3^y<`bh+a(PrCdsXVfblof7Ik^CX~Tjw+Zit~m<8${UH zNwxCgCfUJ3JQ__er%Jg(aeuoPY0{1D=s6#g$-TndukP|mQa*3>dhvl+HB$p79$v9g z2%?l6o+-vF&VAU1ArOBe@;p1cHBX^ZlW77;f$JoVa9$OxUv)csCoAJ40afsJsd*ZU zTeo9Iuo#`63qJd=7x$@qVuAdvsJw0MnEnwb-c|)tCUE$adBIqbaSi-7>wTZKJhKUA z-&1&wPH!sTHl)r0?qbzEmn~AtsVh&JD{AWDT}QDuiO|#OSfO`GYu9xT?_#AF>|CX& zLX!u@DQ8I?i2Ou19o?*^!&SCB9K-{BjPWhjUAgqtJ$%fF!lI2N-I=(Z@shZ`91}?L zW6Y`%+NT;p*GT~c=c<>CtTYF?kz6Qpj=*T0-<*^z*RO!?fiOM_R!u#XGtA?bJA52JK+@Rn6LPRt97)w5JEm}l_pa-*7Qj;2O>NeT zr~6cnJj?~50@B|K zAz`tRPXl~pkjoS+f%`ziQUtN9PG4V06~54Y9s=A};1O{NR`aSBpSld{#XgKEt06`3 zL~AfQqfQqd+?w)%Q;|fi=GP|81D~hK;geBnIT_oXgawk|x0*}y?QwE`G2srXM!mIU zu)Tfz6vz|t&V$~wz{w$~N}i(M;l>EEKpa>6_l&mb_|OmY3h-e!JT;BwJybO;u_ zarfxT0XEm6R)X+<43#mtmQ{M9vW(VM#;pLZs}LT`5u%P%M-_4%l9)KAr_Zx#f@;(V zJzv}}77Z;wXliXl0fjzEq=3I0X#1yrsK=gLH`J8)r%lMt;ooQ=`3?Uj(?92-8M}`J1fC{UN^g<{r7Y1;Eej8S)>Lu7RB8zt&LC))eR;P-f zOzpPYsY#jrZJki=o&F?0xK&y>eYw~2ifWnGA0msQTqH?P%D}r9 zNx!Ff0U0+@zJ~-Un7iYj@i+x=NB%)0I!axDh9Bu@+9&md#F;F63-K6v+7~x1v*n%I z{t<|7wL8jHJ4gmz2Oe3QeTekA*i;#Fe}?h7*MaS^DFn^^MAP-D10H zu575m;$yp1Vl7GcI`vujDQ9kfVFCz0Nm9uE*w-;|lc7H|`&%{Fh_?W{wSJmfw|SIp z_M>Pwo(DHWZgImE7MSmH>Ce5D^J*jA+BrJ+xQ`oL`9$2B_6As>u@5=^?96u9KUJ;U z`XC;k#}yLI2JGd%H!F-j7nE*U&+k3+JXiD^sF^FVUiD=QIeEUJnY?$vL<6^D!jVxT z2lGPHu`C{SkoQ#zHNYpAsPbUD@4;ygssP`wV(n||J0$HgsaG14fFTOphE;{W`GbBT+tRy*k=||@S*i1O20+39KeoGcPhmr+0}(+9`5xI!c7 zgf5!}Q|8dAzEo6dW>ik73K6IGsy+(x7eX9@Eiw7_Ti?FQu&cqZ)@46#Xp;`Q6DPkA0KRvYr-xZE1 zDSMV5+gg%>Ejn!Ozi}qT)}ZpLlUBOlCmArj*r*wmZCC`wD9_?O#gR%rFf^f#F@3c( z5s>{-UTgi+YA(fmWOGJYKBWr)S)wHq2l%bk;VWxaUh>$zCgm2^0#P>7<)Ix$kEGd! z&NPPVA@(Q2{D3f?%0ZHqoToacadyb#ux=DTkK*1v-?y*AhlV!6BR1gHCs%cWg{o6z zRVtxQlXG18iMLR=nM-23AEReD{H$r|1Es)|Gg;J^&rq-ywTXp_W|~e$(}@btQKLxaxvlJf-;#?CrtG1H`{z_XkWQ%tNUj@Udz>|;c`n$;m%P-3<|mEsO< zUxqj7Fs_R|xJPW@Y>9@{z;>JpWm1O@vScocLIX0_JdL{@&KU~7mMLA$lsx^($mV|i z5$EW`P@c9VirS)?3Q_B{LWeeyX~Dl2*(O0phD53F-a$6ho^fmJ{4bT21pj*}PH-4pM&_V-$QuNq=U zIc6_?GSgbMCUq-UR>`W`0|p7n(TE6WU0A=4NUa5;=>XC^@Xv=chEx){%I@W@w zZVgS-FQmW$ULOBlw}>@|{x**~Kj(FJJT&XV;_M_8>!E|D4@`$4sb!@(L1|>k4pXi; z3;o_5WyWgq+9--y8?W5aTuFuKC9$OvZ6Vjvr{s*C8yR5AlDQJu#fja>%+PuqN+xbH z^^Zv{aEtI=g9pM90n^9R7_-R&n=*i1$Cu(pcfpYk^sJ2Ew~_t2{S|K15?UNEr$-gl z1F7}Il*zsuC#2^c3_3%~vR1NukS;CD24k;TcLdmSPPRcv;gsk`9AUtS$+*9|O^O_# zi!}IhY%|5uUw6i+2r}?tY^s#hj*N6Axrg}ToDx`TIi?0hcB!Bwn|dq~vq^zqNQ__e z#Oj+agqBKSmV;}b7%3DNl;)bTum#63>4)uCf?747_h{`MI;@999v6nTVU8o0`b23_ z!^WtV1SkSL5$R3>rXr>RIYoyBwV}u-p2$FJRe?s$n>hvbv!0F$bG0hufa#_$WQbO! z?ks!F$c(f!)76r^XPf{{K(fDm3VN)1f|{I!eN#!+tG*{^=p1H`SY$-(OAQu0KHs%h z;}1-i1do^;h5|Z;G@HSZ6jvTto!*Ms8}I7NXZ2Gp^pk!i%hnkxWigNVc1ayZi_P-bS zk~2*6ZPM5nP2MA*PO-{#gcz(&uV3YU^)|EYuBGhowj3C2LAWZs!ZQ}${N=E@zqhp; zp;RT%;}Qj`7^8PIN>f+}p$ytcGF=Oc)`GiN^=ewYR?zWbES#TuD)widU)%0vN zyBT&B+Cb3@vaJ$H1_aWfVL~Kb@FoTB3u?>#!(0reen)7UPr2u}q0qCb*j^(f1u2EZ z^;#xj5&o9p1T1rEg(I?9T|cN~p(zy$5B%!Pr#YoLS$jS+K#&E^nP29WN%xSV#Y7+a zQwH45unTNwsLK_aPW7UORyG*@=}*q1FRI24A<&b92Q@Zm}ug(Bk# z3L`L@f)f6aD9G;|Blsn#Y#4i^aF44rNX6L3tyl45I_`0VAK>1nU2Q^+5lc|T;16;T zPo(eXtiAgnc#lbbz!jx23x8L+vg)~<>gYg-qMh+nKOvYvc932fFE}asVF6B!GjXvn zUv~0g3CV;H2nR!x){@Ky^Y*b67Ml~MCRoB+3W09hY;X27;M;t|dwkR(G z%1>;NO%92kP+F4?>4Z5jdOW6py7BNT8K*;x@}adPWTG?Vb}StxO}#WL?U12pItF}! zN+K=dsmZXt6e|R)nK-?$5Ogf)VK85_qH%oQ8TaU#qbBeo#s#sS5p@wp6~=N5tq5Df z)o1B|f{jfk%#!CMO*jJ#dMJlO)5zOW*d^4LArQ-<@t1Apb-%I-dulWsd+pa-Zm1~s zB2|%I5*J@OGg7Y|59G&DRauRu?(p=+D4tLm2Aw^q->-=eYL|O49_R=5#T?VK zC@2(czjNdC3IF@xA5HZG>nK@*%lT`R!r8z`LtuP~tg*HR4yHn9aKkg*uZwqhEk0N@@dpb1G(>3tf(*i>Vn=YhQcASIB1i-H{xVP@c|PXs zeO#q3#0x1ZR*vy>Ev_l(;%O{F2_>_EJ*fMJ;||zKI;}$IPB{$h9=Lcmhzp-U%aL4? zMIz|RvqxU6{CryVLfFsA`qb1flYYOlUSnXcdNGaIgfW|-vb57j(KYTkWsx2d62<5@ z2xpbJeqOK1fCknnSMRVmpJ?)ybg;ku+N5ZI>vNctU`oxHH1Qly#Q^bL3~`pkEP*47Zb2 z%fX=vxutn?pwJ%0*J?^~J8v7>jl=Hyn(pbM<}Aey zQKbO)c^Thi1$}rRWS3DMx=*)vk0$iz|NgiA&yWAKro1dp|ETy+8xMYXbl;2r^ytB( zhkwR@`ZtLG@$&I1J zF>hses6`SS>%V73aI(C>bO0x!>aE4_NqpeZwOa{AC#78gqAr2Xu^BIcrzxLK_dL-_ zdzkjpuHspoFh%-<)>%cA$U;V5+z8+sni&UHTvPGnh7CTSlX=$Qli+Tw%x4j!DhJ_z? zBw9* zr7q{OZR$+seB=d`T>$T=jB~Lqn<{f0EejFN3AuwUYtmcS)=ShZWKb;?$f7hJQ5Xg3 zcl*W2i4v3%zSw*!0oSK2A)|6}jV|Jt~+J^N?=ii&7QQV>GmC5c{WTL#%y z8v`vMP6q20g;YSbC6%5^0@IlJ+vjX|t3|?z`%T_VoKI|3)!mnK&ppfcI0nR4GFLuf zwWQu3hJpRrx^>xzgb#A_u{>lffG8}=kxWj~#=ed`YLX+1Qj_~-nDIqabRivejlPXR zT7@lA%mGO@F=^d2CxXA(A|^-6O7paikk8~@oLa<=6wjF_iQ)6NRG5he&8fSY>a@dh z+yPS>%EEoE007fgi0+1dkmA-Fk}Wy~$ey%++aHoC?I0d!#Uh0uSHGoQP8%B31f~lG z6O-DnJ1H%tp-aHz*|^S1vo6E?37ecG{%so`rHvjclj(Pd4^Po}T*wr^`}z zwgoM8Y<{4rmOoi>TbHbGd7V-`XD2I*0$!*CDQrI)Yo(gqRBWh?Z};%{c(x(*e0mu& z(hh3a{r|#a!luE;yX|fllEG!C^p5WaNeHX~o@fMbt5lNsFC5qorV8t(^ZUhoO2RP zok<}EJU89Uq?^R?&{x<=`Kd=H^(gq{E2pFU7WAzqI4;Kd>CdgEoX?Zn#ig5}e)NxT zR`2ZLzrXWJGBzdHj_3Dqv63;s=P5oreZ{x4dyYP!YQ=XW%IP$n3h3i|yNOiI?B0V- zpS1;xVxs2UwybF_$J8MF!}3r!7MkFNOAc*kO>O1;i6S{2qds&jk0Jy^AOf zaITlKkTk)m!vc*vhle0w0fXP6F+pFDI0p~EsHkQwzpUijBo!SP4?pLeA~H5f3eLf{ zM#_gptvT{GT=V0ob6gFMQJuhnNS@PZ03!fB6Yj0$hN|>FUT3BZ1rrj% zPDkwQYb3F%0t$c!HD86naHe!S{1UMfVvN?oY8-}PX75R-2vq)b4tJ2Gi~O=wI_Mbh zqm_(Lkee>9y@lJA=iKwcMiMJdplv7bj0?pJvYOh?gv45;bfaNy%D6VUxA4PmgnAU1 zF3$qLHfB&cHbzpTcpuv}*_>3`9!SjvOa_0-*I2P@mC@fQEZubrFD*Z(>*2M0xb@mt z)Ew8*Nlip5#&|0Ib2ohssM2xk_~ghxY#pQg2Fly8uUwVqKgsXEeHeUKwQpbWNq(zO zsf!pSaNek7&dm%GS)vvuan*5^UA&Q0zm;WKLATc|9IhpG#K=ICXC1j80oiZ%z(NHM@ny?R&_j;Lkt* zAKL$sCk&iSmtQ>yQmY5Tv%)2Dyl|Ne0Izg4db+zXtBv{v?Lt>DG%CYT}= z9Y&s4P@s6H!TZN0+^gV_3nr5_asXRl-?2-)l3@&52^T=G?^+Y|T2f9~C|}_l*8Qn+ zO~HQ$^?=fmV+!0rl8vqUlMO7hel;5nS2=r6#dXA1tns>DtLrF>oeTYv&^J&U>U4|D zXfDu43pqA#4Fjv!3F#?WQ$gw}g!yXPwvWeXe?A;?QKnK|BMNcPS=viitD0Qsl zHh@8eAv&K1FsfVdUV*{sd3nxok5JnO zf1N%`AP@X_l+a%#@6iDM`7pls9#L|hTvQ1y%i}$2)Sp~HPUbw`bpGDjdFwwYKc{W) zqUDBL%HF|i|G4w6ZOSP>8f-i|-+1(E^U<5;qj$|mN8Y1w9G7Q8tLI=NQTGhQga9A&Yik%D+fJjkssCXxMDNq09E0Ah|*Z&G;tq zM$sp^LgIAzKexL_or8Uyahv>kXOPqSYLfqgeSY8S?zVUFS1NhxD`kT#%^Sb7|LVYQ zp3bJfQrdr#Lpm8Uv43FFD&hFLY5=-| zajw`#iAETowdP@bZ?s)PyS;QN0uH;KStFz`=dX59F*5Q*k2*xByNdo9V88`7=TxY% z0Rw5H;Le0%hie8!GpECb^Z8M18EK;MpWg#1#TM4QGH<)G)f4G+H4jP=Pm^t{7G)JQ z8Qxm;V5*;fQXuAcSTEO>88uZ`9w7c{-Wd0mzy{=Wv9MAV9VEWVi2yuGF5#_9z#e(0 z);;a|G;b63P_2$1t^GjnO6#SXliS(|*#yv%IvkT16m3350ITV8>>bi`Kk5yidT(!T zWq^&~mIQ10eDyAq=04SWn_l&tb`wIX>>CqU4%vzd3~CO(|MKOLKU1=(*=lbaVT@o+ z&QdY%)BB6(_0I`?=!A;c3|XtwM!o*n`oshL`{q9N&GR&kR@7QXzihG4<(`GDnPzq+ z8>&3ev0IRqxgv5>j`T}12UMKxZ0_QJGB|uJ8Dox1hPR4Acpdda%|r4fV`j|dqYF=6 zgbfOCrOEbCHZ8tXfS7jw)5x`#Y*hy-7Ws89T>DyRdL0bsDA<0)9 zvaLEvC^iZ5_|P`Ud;v!u7K(XQzNFM#;Y&QW*jLS@YttQ!M%+ZLA#~+ll1V<_sIXPC zf5ov$WG-d!{xuVFFzxRVLxAF4iBkY_ua>!4#A% zBLEJ6K^X>^7`XfHI4WX=+>(yyq{Jek3@W{1`S8logPPay`DosunmJiLYh9n5L>Ptk65!~$W= zpt-oSi)c*J0-u-KnU>(?k4&DNVd+4TkRdyd_8Se^ZjGbNwz>kp$WC$Ujm!TzRvvB} zn|3wum@Y^6^0Zg^7~ZNrT!g42*DoAS^R%~(UuwK%RSvt_Q}~Qa!sQQ51U6N;8A8RE zTEZLQL$l>FgKfV@n3Csq^Hsb}d#PG^?e|4_Qv=1>A#duvmECAsO_%Z`Sp%`MD#V^- zmkCv$DBy3b+SBh;8Tz%|xixO^no5OAvafg(+&0xBc;t#7(r9MK%4=URBl9ZA}y2Q4oz&{1Ow#_=25v4A(SM zG}#cwfyT7Nm`WGwv{U2@wK4e|k0&%Y(Wfo7S;{-xaV`~j&+t1{0lp8b! zWyXTJl5>hbQK`jW63So*0Cq#QH zxgF1fPc)ZgOgf0?$k+_#vs;A24BUEoa*y_OtP>kEWv|0{DO3lt1}c`Nv&u*>$R83< zg@c+%oDrSy6r+nZ6=!kQM5zv!e%8E-6Z|b`39#X#frp4zb?+rN2ss6Iiy@6)q}0w* zTK;@%C{0^~O533yPoa7V%Zn@^w1HymoME+fDfNWV8nF7SIOb4+I8dWtl6YrU^SSkg zf03drhEcVUbtTqHK&I~Qo?Y)~`*XS)pC9T$Z6$vGtP7RHTzm>hcJ{c@c&xvNqJ}pO zsEY#@za!R9KA1?YP)tuJAr4R#swO;2tRcm1bB4v9Sz23>!MXFIb>|$N3)Z@b;?({S zwq8JQ81I4advfW39el<~eH zo5B^B?KSMh(d0~1MD9D4DE(JGmX1+E?iTfmcx0wo1HlF{)R((#?R@b7*HM%(Xre){ z^;Bp%g5D%M0a8lAZJh5h>|`n1GfR|c#nE4Nx*q=?K5gGY4 zVWB7yGi`yUcUqqHC(VtGMxFj^{8F6Rc&zvJCwl<8As^uqF~h9Wwd!m^Hof07Ve-1fNv93=HtTj(aOmfh1%O zqM7*I-Gmeo6la>_tr3#XMa)D)3}ot>MM6tOOrb0y?eSV(85T*P)s3}H z5H%g{I;h%!JwWC^s=*>+W zQ8Wkx4n8TTxGoFkCl~=a!=QmojuPT}E@Nzh)a=xVa~D89+R(U(4Cpcn4#@DSbP3C3 za9dJ62>R0)Hq2(jL`UZBF5a7X15H^Br}=g0Tk9m!x#N(j^V%jWHvwu zN<`m*pW$@slWq05k68WU>Su2~OdMap`ohI^+FP{7X}|@BRxNA+@C?XhhXUIo07Zg^ z*J=#R7qiN@bWg}J*jmJP+mryNtUdA4`@T4QZK@=O0vFP^XZU$Ou3B=e(ZUwq86gk~_ zOo1Fg(?e3N-V$OKw8F>Bp-;X7+;CVv^+w~VPM0-DZ+g!fsn4#Hb<;~{@6QQ39wpVV z`Yvx_3~%H4_!1^Fl`?H(Zc|j(gg)C0d+FnvPbuX5VKj=Ec2c7Im1T0K?YsM0p3D#4 z!kGiV+WSA(yl*MyRW<**NZ$X$i`)wonW@N4F(c4Q1=bV0oZll!WREOn;-xqa9Y{D7 z6Yd4wB$000g zy4V=Yn6!YPDZ!cjU_xTlN?vqyZCTbt=7{T(k;~iNGtB*$_OnS@uLwn$}C&9RjNQK=r#(612fMxGjTO% zCRQ>y06I?{4ulKrtJIZR00p0|vhz~7SjT!-!cLytR_IKr+94#3Wt(yNdjSWqwfn3O z?p87@OMEk2Nzf3v9pyy>N$T?Eo5Hl;tYmx@&ANAr!=;-orier^ok`IbEM2khx(6PY zA$fgdL3}8H=?sb0?pUg(OA#R%N!PR)nEF`I#Ju9&Hjc>8wzBM%a$_`Ydpot zHlDImorO|>CiCO|e2T!4b*)rNXUMZ3$!|oKblmA24i|@m2!sd!`DPnUiQoYv69KZ1K#`c-G| zh~KHQ?(?kDG^&gx9Z2*dwqAa=X%3NdT$mLrg%ykaMXnOZP)M%E5`jCrSZO=$wAB?? zd2!lPY7Vm5IW4d2Ik!|JiB439Th{Xx_eLo+fMkE$-lO-@8MgMYfnKdS=-t<+=bn`i z9;+P15k*lKMv`trcV6W96P{*U(M!iT*r5nG`9hY8c(@D5F|+5M43_x7vs97gcNg&C zict6Q!s!qnniv$xq^7T)r%JGz*BRseQn^Yv(jvZjD!CG_Ny|;1)4q!aaEb#{9_Bm9 zDoFrDHHM^H7>K79`Y^|DOSGN(n!WW zR6R!t>>LJV~rAe=1o{DrP8FFbm7F=_RbyW8Qrqe^V7{T!{US;(T(ZgWI?yDaD zmQZ*1rTpS~?DH^=OV!__8g`E(zmT^e2>{AY3F>;qp$=YoHku5gslE)N_FlW@qwVj7 z_no)dXf&!e=5A^A4uwIS_nr>?b+#5?N7z63>#u*kFD>!cSjPS8CiXQ8yfL2<*49QQ z57RT5Y9!n?`X5TTyq|vh-|yN-N3GW;L~DvY-bU_RRm;bB$<)1$fz3+ZWjNAmKj<=Q zXbf8S;V?u;vS2XC$qBh`F>IeelB-;9qexhodl2Cvf@&I)+q2vn9Y($Lc{IceI6^|B z&S+dSp$sMeg^2pF3D^Q);3Ld0=o5A4eDtM2E9e!}F0utO^w%}9;yakB$4Nwo9w~P9 zc}R|~s?*l-l_Rn!q%e9ZNcs&pP3MzxdW)y$y#P|dEnSz5%`WG^-jFdVTNg9-)_v&= zR$)7`hjD(f5=bMb=v=a3a|YJ>@k;NagrcrlY=~E0z2nFGa!J|c6Xa_Xgc>vD`*3$+v#mn9?!Dn zNoW7*Cl*0`Bv*$zBlIH8e_knJic$_^^CI6Uk_zl;F5J{1!<~AqqFGg=qiF;^}KRKU%T{GkD~pueieSIY(A@gflG&N|DVjhGVsI0 z?Ekm2_zzE>ZvKh?_upgxACCL+fb>T5*~R(~E588{@MJ9BSmA(m2@DO0Di%dPwXIs4 zbfp^K0A1E#I}Ol0VKU*XyadmHYvmLpHt7(=p0OIHqR27{j;;&3G>vD&TNUg`?0Y6d z;L-*XXcWFiW42gAab}g%x*ANkWaWF6ky)(Zan3G9gagbFG9M+9ssa= zhu(Uk0S0bvZt77m4hUQTMmM_TD8z(3ptv)vH0RCwX1$+Wd!M}zVyJ^0i?==o%7V~l z8~<7PFt~esU#(T1e{(YC!o$Jm50#TK4(5kywQ~BOwcc8FLqN9v>Q{+j`C!==dB#Qv z_{S0O_4mk>fB3ZZJw9&r&`C0y+~bQ{3C~3GOBB4WorB%BF%<#AfO*NYKN`=&a!p=u z((5A_rv4R0$ezZtxE~J_onnhp2n-S=(H|buhc=pdcyG|mL%wWDT?cRV3$A5{V{PfT zTyl$mGOX8J?tVO8Z_Q^{FrX#$gC!_xH{`9TK5uckop-4BQ*R&3U{HAz*w8zKSexk2JT&iO zG)6cKp?_oAVfs4{(ks0E>vudtM`7q4;AYbA)o9GTcVcybOE>39M5>|oFbVgoos1?v3zgH{#)2)X~4w{7WH>9tbmi-{> ziY+CMS-Gvh{-`$D#V|5Mw8=yCIv(pfH+gIrU?Wq@rrL94q!Cd|UeVoJr+BQlGY;T! z9D93kqc`RANS$;${4Lh|_Q|F!1#^~o?_f>?@A!6N^7DWJw{scNfF8kkBo~oAZks%A zZL-M=avHfMYdcDK$%L6Dvb7~`k^3px&$%1&$rg8Y53M*%(cC|-&)W?raPGkYd#k^5 zC$aBDp!9q0*U98^8o+Uq9{8;vvICz<^P?{M9g4uEOKL|ydA#W?5r(jUi$gdBzBV&a zPxU6z9#9AwyBA*KeH9K*I285}ybjb|R1RJq9qhG_+q+er zOa?2Qp~9?i??d8yG1Fo81ZRkXty6aeHj@|wHgjW}GQv$}i`7K=k+aR~iiR(J-#LEc z?;rT>{o~H@ul~z}-Cy;YEvK6?d6HAjym)LL{U;()k;5Nb8+y#fvha_T02rx6YpD7 zdx^%f4D1|uj~`)in~g_kV@3x)`3H=ELR`~oX7m1eVj#Sx6e3P>pLNGi&U70YRpz+0 z1usfgS5JG}G9(7@3fghR-9d@G$ffnK4z5UX&=_;O1W zTFeg*(bSeN_*_4-N2*t-rAH%aZy3yMbN}~bMNHf^ITy^P1f(C1=9rLGXsB)Q6#;8-|fJJn7TI`28=y~;f^j*vhCriFI(EUlrT}MJ1|m^5Qon^m7LFrpW;~w z@VS&l!-5p{b14s64AQu7)D&q5E=Zvt?D;!>cj&)t9ko@=Rr%KLb`QFKw|#VYuumWF z3@DURpK4JnVwWMn2?^h9+i=MvOl(P^z|jkfqx~@bFvkB&#*+5f1`i~$6tSm@deYVR zJQ!Fe$#^T^vlau2QS6{KD0UR%&=nNTlOwKLt z$Fu`qF48g6CQgxY?*EbTgN)IiYNX&NTNQO7AeE-1P$?T!t!va&J7Be z#2fa_$^KjasPn&YGd+7kTCA-nPOt|FyaFXgqxnd6mgW)-6!^-e91XOC0eoV#ZI&zX zCY(y37ZW@?N@|P^5S9n*(Kd`eQe@OY%;*!aP|$Rrn~O$eZ`!Thc9-bj7B;x@L&ID1 z9&c4utKUgWwZ{e`&(R=ABiXBHM3--5KjI5-6pmsT8^Zr&*ECcGl0txY3;FMuMhMGh z+Ov{})Mrsqe#6s-Iq)0)TT-oNzeZe5mZWNW(O-vK8nD15uYyPX|HsYE218+@(tRB{ zqw6TVQNbpNl>xfD-`+VUyZCDa$0LWr*7438)Vqli>FDI}@SqF4u}?B2ZX=419^IT$ zBM~O^5IKQEIC*y4$VYnzhsSVs9(i~wwz>w z#*_7T!R`9iV|v?Z?YDB;EgPz}vnRjs7}@LWx7YC~>K^FVo&8;9fAOZh^R}~ZKfy_> z9(f@3)8Vi3lZQhdV4&m|j+^}4YrSl%>YxR0)z5>Sw_2;&)jG|0Z(BRZouA=CpkM5? z;Mm-4brz`vqWN&!v zjEuxcCcO=pJlgDrYTGEGL?QHJX%VhzDerwjj-#W!+#K+}Cck8iaf5)|AeaA`n(%?YVJaWa0QmAl!+Q1P$zyy6|C9tI7q*is zgZv%QCnxpI?;QU81QTp-eNV1Bn>h)dVS;8;KAr3%dUNMh2l}jXiIj^$OY!mx9B+Uv)wYcC}>P3W0RAkJX)`&KEH2I~#H8@2rQm zz8|*R-JN#VlrRayX+NCKq*Ejqf^T?^nQ1#xuM#WSk^i>+tD4Ot>w|R(F4@o4GLR$5 zPGnwL>Ds>>A`76>@T0k?b@oqaWH%d)^}c9`?1pS^`lLXzxKeyp$|RQ+RXMg&Iq>=5 zZ8}{em9F8W;}-56@b!djB#)v7#>YHTBK@8SkUS_oEhjAQ#$$j5&kAE8m`sME zFR05A|E_iPw)JwaE#qawHMm5erip+n)%Oe~N9t4)ftj1=UXAU`V2sX-YIyV3f!|NJoRtyPgGq!&Vq-A^ouJYohS?7!d`QH0_%QYc)<(SU5pA;%EzkqQb) z%Zv}BN!WGdc$E8n>uvkw(BeJh{mX*`Iswm}x4@+mJ-Kk+wtvA`XRzimt|5L7ozLp+ z%z1k#$HK&U+u7YCauAjN#Q*&h|CjCmFaW9FA4Xr>3UG=2U*r4DXDR!?r_a8B_NV>d z9|!-}E60-=Nl3p8_?LvKWmC$08d*<#y(t$&8Rqr4v)55nTDSp z1D(OUGj9|IV*+a$p>Pq{2szQktV7^wIS}7UPAEr~KdzRv5~nfWnI$o!AUtk z-F#BEYJ@9nIad)PYf|`4vocBTLLfJ`DscY*n4EtoDTT<9ae;Vd8oW$%y;Q@}GR2&z zrH5U(h7gzN)}>an$A4$W&Mi6}+-G`8kwFkFXj?F%JO&KH$9A_%NGMI)`5zPmWIEa!7T;7zGcR?j;;W}Yz^J+QdTGVi= zjvc~sW^B>C(#;N7)`^KO9;Z%9E-aJ_wA}^sOWom8WhbrUY@c-Z@Fi(`5jz0i$wa6d zs)~2d3h4YsxVv^)?~dJe@Nzpoc-!7rZQ)na5Y+FxhIPNCX%5|3*1}i1g|Pb9-6^)v zT9f`Xn#>C8wdm2Z3PY~YCQCqMI^Bc)cW{F**#Yusfb4|q0L?a8=m>}a1n4!Z(4j4a z#A<$9U23?nt^O>ChLzI#8*cDbIHa|DbQRyQl3g}f2_aG4{fktv&S3Sn^3%ZnJyY3-_(|J#1;qU&X96y~V^D#;>Zqr>(w9 zMR{4D7gpa9a~S!Ib*rQc>Toy6wiN}*!J0vs1p5&VVh8eb#YPOb%dEp`|GaoZW>8kF zN*)ZYQV6e-_K0`Zb*iCRuUq%RX3$K^3zHfLcxzBB++yu3l}0aiuyC5*sol7qcV7c; z#3R11nklw!0ryy^wDSiM2+|P6l&n{Df-J~rCF?Dr@{6*YWWBrtdP(agS#JTBKo$bQ zp-CFTV8u`&Z!_zLDyi(4WllL5U{CEQ;$3nuyrv=0qR{VW;DC80(p2c4WWAKrDfG5K zGOQaiSOhOZd!N!<*bL6%&#qfaPK(W2x5^dGUHR<6 zUv+}kC7r8WCcJwbTE&r}rGJoyRl!0k-y(@Z4Qw?vg0ueQ_m7g(dC%>9s=oO+`ebKS zObWsMo+lIm(L34i{K5rVDa}hp^t9HVwwH6N{3qG+OFObq$?6?fw{G|_fSppxE$$mAZmZGADefhC94O;{ zJiNH2!qg86&vi9&xBp)2wW>E*OK)E2_{e`ke(@8(m1V?U^#$ zo_Do-?3jH*3%Q7>NHQkvvPtZBgXa$gn4)9bQfQcqkzp_ND%uwxDdZc*=la()oNv&HvWtv%L}OY=m5odrQ`1v)IQ^D+psP%KIvvN& zX8Xw4T{}xu)rVsssDb5z0m#m+{wS3l-6peegs7t~s#AL0l+w!Hq4;76Pp}`;>ckZc z|H8!4<)yS(4)lc-&V|98k6ln$YGod$VLFq4aWfQ-Aj)r|@gTlQo}*mEx%zzjt@lkz z8C6U~y}V0=Gjv&MrTdq?>Z*}?$Sqfa)M>J4O<#^UWEkm7B4RWK(@R04O21q~M@`Z` z@C~t-z3ryb{#S{3XzL!GNuuQarJBC;aUS;qn9gMh+)FiQntBcgXl|%QB@mBbmthGq z7BiEn5_hB!Bj?GNN~N+<&ux%T%4Q>iW{@!TJ$^5~e9!odbS+?FQ&S4Ds=0uosddl~ zy}vfJpEXM1SUW`G?n^=E@nrv}#H9pu*B{{(`>&1qCDDG-hW!=EKmOK7z+cgLSm%K5 z*aAKE-XNh3BO^-N>(D()jgbuzYLeI0-v7OZTiX7IZ8iQa0AP#le;S)lHos5fe?5Er z}!}6&iBv+(u8Ytoz;x!fJmPEb#@bXk#<`>o^7&uzbR;JP$Yf^|CyrLrWg=Kb*{J(ckUZSz;0ZFmyWd7tUls>OX zpS4nmvm6|ug(`j6Z6ED)JLK$U>M0L`=?#We=j87@`@0A4kMgn*FxT_S#wdaGpGPof zpZm9$@Oz^wnfE&TCs^Az6{#3baZ_e>B|EAO&iJm|Q8l*rUy}(uazpd;TWXg^F#IRJ z5+iIG4FmC}Q^mDwVX*hKtMCsOZcX!AfO(M^1nb$mGUeQ48t+XUkVZ z|C8ar2mNsg{oj22`1@yR`_Ctv&mR9t|Nl7lpARwiL`>&$mV8riVy3P_{Lu?v-|12E zODxzpi3VX#bWnw{yee)Lgx{kI#Ilsh9Gg%8Cx!POh25_L({iLtfn~74cn}j0gA~s3 zwO2tA18`t$gIaA`v0A?@QmYBZniq<7Q@)x&tf?@p@-{aRtANu|1lAIV(bT@6O)R|R zb`CgO(rMv9+8z2U9MLo3QI$QGs#n^%rIUBV1d#&Am+tI5aDc2EK$9I4O_d~S|H?zK zWrpC_cutH9K{t@Logz|(p8|x=NPwZiPT4_@X9P(xN3nLqVUXAG)dn|W%`6>SaM#Ze zu7D9JB#0~uVky$Ztrw7U7I}+Qj!xX4-Srt!T{hq zQMwO}znw&V+QY0{w1^F>9(kvU_Q2{YB^!r23bfNH?hxs&?9oX)6=Bdt^}2|$bvVmB zIVRlhd@{f`G@anjpDAv%z(Z=&08h*^6Ynhynr$?II8q>@Uj15HU=!R7=?&T~G<9&2j9**XvDxv*+QuAA99*&AV;n4AKfEH)AiIE1L%xhFry6 zKfn;Fkuq5>ecKPVSB0XT0EeL*Q@O%^(5v2;u;r&^bagL7Ut#9qLPt+MBb?;%s2WMq zjgQE56W7T^OZLnTIW4LPTU60hrx<6)fn*3<sXLTTOpO>vLkwF!9GLJq zdDWFx@0?fn-#U-F4(Dx;XD;uHu1J9enm*|_+#CI<>o5sa4~zy1jTJGhy1T~ITU~^D z(Yyav{anX$A(Ozzw>?XHnO_0Lp-H{BiiWc*TepvIogs3+WVbEsv1G>Wwv-d*ZE9ng z54vuv1SbkkQ5maud0+0WqTOM$Qp>>QwVuCyo$8&TwNhsWH~lSNA6{R3no-Q`5D7F$_p)Q$e(FRS%7rnD=vv9uxHJ z2dIpKUt#_#*)x0PS~*KW5KP5XhEKXSeBko&SMI5WAF7$w!{RYTBB#7kY+wr2Z;ZvbuE9@#G*xCk<+dT6sG1$MX*kF5GSD20-yqUep-;L!^we_| z>13iqiBc{!;(zxoecc{h3}>!BnpqS2T8|PxcwRwdU5doa)yjE~P+3)!lG-mNKzOy9 zs_r^K+o`p3IrSdy!^g)s|{NQ#gr3_6w_qd|6{D{$sDh0y77uZ9Hi})q>&DN^^=x*W+f%WN?!|jHa8d zeoq8m|91BmyvWc(=baGx6mdtJDzz!@znIcr>$+{4zj~MAYaLIC1);GkI_ft|IjXMz zqn8dyYDK43@#@mC;dL}8r%EffE*e@^4Toz5wZl^22{owpORcO4Va-&GnKKnsqqH?| zbD;^>vS8u);l@=UNgasFa*;#^!c{({qN`d#rr1Bne2DAH<4c9|E;JJ{!7PViFwL|3 zGO>1X9n)p8nu(-oC+Uf$Z?-Ty)siBBXgcD)W>duz2XfS(aH_nOhcX(BORuBS0BAs$ zzq_+*zBu_V!x_cSltye@Q8IN4;XBdL+YvQSk`@Mq#e2=b5soE98;fZO+IHJ3zX_rGn)g1Q4hP?qouVjOwDp@J z_0*gfcg~Zi1B|RwY!LFcM-%#u$uNjiRF<67jGad5v0Zh>Tr&r*%5v|PaEgh0)+_Tn zbi_6y(8+O$TFniJT!9(HC0z5qr5RL<0$!7c5WQS+BLW^y<7<>-X?XiplzNs)mx4z0 zoJj`;grZjRV=Zsfx75lyBD)t{0Lmei3_{aO3LQb$=F{PtT3gnqexShO&)IWuJ|=K& zfl`7crb=bdX4o=f>gu)RfI~5E4TEf2g-xX2D9U%;cF7)ztPU`Ktbq-WbDViK05POg zGG7r93HUcT?VxY42j#$3!V*B++vp-zWhD{rgH)s3&9Xy24#=tr_uQIH*aK;v+_T+w z=-mkRIPIh>Y=P2|E!%nh85z6z+DZ!wP;L+#*THmSIv*=bC4!VJf5oC|-koR6!kS)r zbL;Vwr)63TN zrK9fJo5``egW{wo$R(m9$>JP7mfUk09fx-}g@YNN^{sq=ba(1fwqc zGsgKb(Rf#_)JI|1)R^6uKv3rAz(kGMgn|Bwk_2*ZY;OMec$I!54MOVwxbgJIAD=$? z;Rjuuskv9iUG9KSNPtTN-sJnu4f_~u9t|4l~3~R}<0Q z62=C`8gd646_S=~pfp~9pPN5!{kTmp>*6bx=p97?_j6S z>>x67O@$UsfWQ(fuqN-;YIZv@XhPj7Wj;X)gNWgHBWJl?C`ACXzvg}Gt>Krohh#$z ze{{TeWaY0(cKkP3qZwVZ?&GOqZ>~b7m@)Nygd!g-bcj)Q_~uR25N@VO3};ub6L<2#@VJ&~VdN1wC(^V3*OYX@{$M$oj=6brhmF76~w4@5-jbv;&aFsqs*(YA= z;Qwz)vWkDzC*i2DRG#JeY!37c=emM3Uj1Elp&qgy&@Wq7V<{WcjoFPjZlFx0!I-fo zGu5Q*7JY839?3X0+v&`dK6r*`(zhF%o15jLYfN{J08m8Beb^b6rrNpeu&v3evPw53 z8`C2rmZjKY#8W`3Y`q zx`7erC9%;^E-{z*eQ>B_ATOvP{DgO}h@u~(o)+)$W{%_*#4W0$Ee_BYio8Z8v&SLb zI?}@+bcP@l)mb)7vj<3p=6v@HQ)m543Ycy~Hy1G(HPbEHz$_DkqG5oB`XHT#!|)m- z{HZ{1=qVYokrL25McI^K(n4KMAB(D266pyqb+9KX%8uzwnh!#l$=K?G12_qt8=>ob z63*rmGje1LG7E=8Wz;ku_vPp~mvsmo)QrNCbx6)5$QNMVRG(tr5Sg{gMqPr6i32Rm z2D9(dP+18|uDD7!RWy?0nD?||N5QRS&19-6I51d3b?eD4%XUshO~QZEjdsWvu)V&{ z?Mv?bN)NDuYG4a%uJN)UQ#?AzA6TbX#sMtnkhk3A75qYGFZq-&Hxtqk(zkU3n#vu16XfK#kO8)>m7ysxlX5{i3m zp)3JPAcfBnDO2lDx}9c|!lFn0`uRK>4k`*#fxs!a$fjp(pPEXuMO9X-MtqkYuqz$; z5bZkq6GbH8u8Oea6O*60HrRpzNcY7jIOhk!x^*34Gb+AXHJC7xRI~Fk2Uy8 zW%r~}blx)7fCi;8qns_JBGqRXST-%LEH!RUwgrPWK`)Ag0y!J}1$|$MfG{b`K{36C zvxF$!XyLeRJ#^em{d(LUfBCp&ODP_=Y}$v68yUEg%bvjcD}QBKMdt2=ALgTT1i-ma zgHU6qY_cdN@~+HEi#IE5uw{D{XGf3Pvo9YtJAd(b*{L2fQfP?`Co|o2;k@~Hi^5Jh zVc;2#7dY_F(XJN;Prt z3b|UBf=0er0%IWzmX<6_yIEx;6HBunR(I^~X5OrYAnA0TbG94LE9N|vT@hnwX=~ZzDxJGXxxv2=t z%{+C6oT_HK<4d&#!y7#IdBq0a1yF32iA~nAEwrwsF&r?JSgqOg*4(IgWut(JVz8hk ze2umWt{|twC?i-*q|jFtV?(d~-i^YN2=&pY9#vqhwp9&U^?}A5h^uxT*fudVr7Eps zJF~u-NoMuYN!nOsgY#+_2QzF^HQyA+;$L$5g3C5aFV-Ez9TKEk;Y9{9Pob#bg%A=z z5r_3r>TkOGqEw5-!8Kw5F}$KpU13^h{ha%w@IVrpeWc{M6qBB=b%Oy{NhTxsddYq# z-v~w>5X{+C0Uf}b$H7>4r(Q1?XrFNrm|`lfN?FbZpZr;xCRvRT?^$VF!z+&OfS))+ z&6b0rKB6GK++czXk>K(iI0=S^0uvE@uj&rT`WerK3<|tT6xP|j*jw)mqjS6wY%q#K zjTk68vZj}F3dCx*AC^&LYX=qVon##7UL-aUI_9|ad&%faPqcMpd1Jl-gnwfg5BtGv z1KXvNQ2SD&p2}V!XovKg)`>;~T*~lI?#<r#>FC0V(#&iD$&`R&DxuPF*+HVf zN2N=N>eFmA*??~eO9SCox>J(TG1GdH0V@^NW&R~h1fYs7hP`%4el*yL2xDp`9IFG( z*A(Y)wwPSvvA>L^Gf*q0H}q~H>tHtmyY)>j+t40AtV>ki*;n9C?Pg`PVdm2pbuG7N zhv))DktZbXyYx+*qm+Vo2{%nyeas5$b&vib576?gj-f)TY2MmSUvZvt7;F18?IHU` zW+Nf-8HDF^?gd86`2Dj%<)t}P{mwO$gSR~!^gpe0UBivD#ZZW!tLG?&&-gS!ZV6&kqU}h?wx6-4yAQ)&LWo6lmyzp ztiOtf8&!ebHQi_pq+X7aWHJU6P(0~D**?pGSZr_t^cBqc5>BV(e_zQpLk}!hPq)~L zgvue#OycCwZyqC71LiRpoZaW_y-bXl+>}swFB3Kc}P5*kE#P6peXx zt)QP4)Le)P(sBH2IicvCox8&3jtH;~z1AplSGG^I3^*z^o=A@Qlfn ztU;D+Ks8NImnEP|mX=ae1?jaWpDHkOH4ml?))D+vs||iyvPk;_rPLpSPnI@baO20gmg3%8aX6HAt~Hr8FZBz+a*DKupy zVJ)ewu!up7yG5ByDr+Y;72?B?jE8Iq6Unz2+>DA~cp4Frp~;Vwzvf+HJYT#`Pj59q zi!sdy8as_A(@2FvNOIb3%2g_Fg3{3EF7NR(ax!Y38L1f?j!Q{rcp9B4Bh4fvR)wrX zq4R7Rq^Jb*S3)zfs+z>cB|o<_)$;LR15%tRU$iswh_105gwjXimu6de+O+lz2N)Wh z-z!DX>4F@vJ$Yaocu7fg=Vi-oT5&KhM8HIBW#^z<&tdzW$LCT(i~LDATG}dscoBmK znI9!@QZA<7Ha@rCm(a6%Uq4pV{Y)1!}DDx4WY^-k? z2e+o@Jl4=^VB%OtMmHV}ooq%fPDXIY1W15Lhis%WT)m?6~$eJ^H6+GOIdS z%p^9+i~#ia?)?1LDvtLL8=dF>$?3v{SG>U~;Rjy1Vy(q&q=p&}q0kc(T2dL3t=^LP5I{I@ ztIz?F3rtOsWUEk6;OwNxXOgaB3KJ(PN3eerOo_=+$n2yW6qJ5sVfuEL=y=ojaIPoi zCTAx{TdX7oJ{pY|uH=59$_^Z3(z0yRvRV{UUW9kB0oz-`(!myzM<7>2#;{})sY`Vm zhninaDDbj^@=9PA;Oh)|zgy<-f|+UJbz*m4O4GepEV602)_L<4Dzga1FoVV+>4#%j zYB34W@XV5mmJYHMhZda4j2*df=BB|ISso;F9Li`u#<9Yq8tqR8;ba)!(hAo#*U(W> zihGC;*4ER3On<{MT~k_IfiILV1?nzlqg>_i3jhl8d>d_PE8yzpnsHkOJS4d zSh>99_Di=h)pBbWt4Kl4%E418no2kSlG(IU*6_yW7|qzld?9ht^Ni+BiZ~IXYK5)R zq8TwmOf%S#6kCT=Ou9y;`(UairIig6gh;*)z%Fu6VpZc1Iwh#eC3g=ebgrRJhTJVC zbbp{_s*!E;4YI6RBh$x+E>&&E`a71ZD&t{GR;4anwz{|_B#E^cG@R4u@@ke@!X_}- zZ&{0fxD`-v#-s=prh4$~f5AcHW_s9E=NvhyVje!lOnvm+YUh}*I>R){G`l#Bw>Y!T za$-axRpnQhUB-uAGQlnC`orfpQ|JSyIFqkvmNN-clbkKcooBe<1&IW?NtMP2TDFF~ z1;R^WA~E?eCrn)BhB#?D7hl_FU_4Qg!iY={X5 z9uT8&jlGYWFE%MqmoFB>@pzpfJHm^LsE<(bx1>mY;0;c-U*F@F-QY+NZpI1S#6?8#-*U*ZUf5YBvP2$u z{>rpCJK%AhTXgq&hhw$gFSCOuLi}5}EY7;*#N|X;o=P%*)tw_p@&DY71C7MR`Sq5% z#05vx6Fuht1JOPrZ0IyE&dqQzB6;e=p7>^d z!!+EI=MNj_lNgym3)J0p7RTQZ+lt=0QZ8cwl9jP;uq9mKRM=kQFRAqB18FNq-%YKZ zE{Ei`%#vL=3a=YPi6}F|Pw1D4ouk&EQ&ONLy*aCzCKLXJ-34PuOb2^Cp`rj?jW12e z8tEl<0Iuve|Bj1x4h0wY*F_#p(y|A-HQ5C&^lcLIY^TrOi0rRly4uyf$gFc<3sA13 z2=If~I`Yt|#f~DAa>B5f=)7w*P?Qqae1iB;w!e9z@cFz+gh{;lq-fD7eOJN@#B^eu zUhG!4&TrYp%UIPSB$*1yohoU7Cfw^_s@-IB zgR1g)KJAC8@lm&1JtqIHn}`BjFWf_z;=x-86Mw-D!sLY;2tO_qDa7;HdVH~dPOjqF zFj@#8U{oAN<&u__sy(MjyDboPz2B8zy5rVD-b>IhIC zrP7AvVarab>FhyKfCuIhp+I=1&4T1(!W)d}hBZ9wX7aU{ zCoQ1)%#Sa8Z1iH^Qj;#dY|NL;njtMDxf;YQYi7AJd5C!N#ZvQ({(L$`U9~P_nIo63 zD`lsXw#m^6EAT4^a6o-V)g(OR8s!|aHZ23JEi6-_R90qLCjVjZ$07MFu?+|&u=-&R zmHX`l@I~`!_yE626zG%t6oMMe(ROCU0(n>)o4F<#zfHy_+Cy|2`6lgEYJFPlrDUZn z_EI8qr}+GzYq(w3XrXCyFoM}b#04*$PUESH1o~xg=zYi~b|Y#yxiq0753&k_ny4W@ zW%Z>Y43|Eg+HmQo2z~C|-PgR+64x^U;!x`K7Et#5(jSH`{(GUtv+g~4Z7Bd7r+E;} zUnZ0a5)EcfuTvzF2-t8Ljzk=62tLpV0o2`cc5%K$fp!$ z=VMenrY{-<&lvr)_Z_uaWhRp;)D15HybAbyQ~ci%B;qJWoqow2>3#BfZx zN1F`h));=8z-q%whO!jL(U}UUP@-+r^}byw`B7|-vc86$^mcw8PRAi#b;OJ_j9qHyU3|1NJ6D7eOL8zaKS#h@h|U76c*`U7~{8Ba^5iGs`_e zbzG&bhk3>ZuPO&3H7A+nmt53_#Y?C-U-5dfoQRwiNQ99E+_KI+d!5^%a)s<_d5MW9 zq{(-UaieI-D9><9HmK~eIRryOcSNF3D%_0=DJljoLQhE02`wM6s}s6ZVYrlp7VR(! z2NqR|`ChCpy61&7j+!eS3oZ$^lvPjZN*zCT;_A?EC$;m{xwg!yyO6ASr)B7ukNxt= z$v{7Cm3zObIEub4dOid^;-IPcb{$r6{Bf?zU9i+M6(qi5gtMfuxHYn<38**6O}#K5 zE@}zZM+IcmR4vQI7AF>#>mW)d!vLYVweiW2@l-QDwCw!Hu0cAE_bj-qSx$aHgUB?e zp2~282(_5ZSi#`UO7hP+a1Vt}dkA8feX}8s6eWH7=0adaxE7YV;|7;r8CfYzTV9wd zefxoz6>evCe&8E>j#D@C?matM=9ygHFzg(OVK6R=ZL7CvES?siM*a@td7m2K>o#pR zme|s-at3K`u4R3y%!>L^WNM#EZ=)!>S*>yXnOxiy`-f^Fr4S-%Hr?nyAc7y^WrjZhBY)X%C!L(O%l!(B( zCNZ@G*MuN_axr#8kzg(9k`lZ%6aho(?72?TxihhFF+OYj8&>0TxK1g!*<}6TDp~>f zc5uhcYE%%ODw?GV{;fkts>PN{z&`Xka-9Sf&mE{*aRj*hC0?~$-c>_>vc1o9eeY9) zlsl2uik*hY)w3stY;WbgztAP#t%eNFt?^w<+@xyNL^cMAXAhzB+P&z^ZNS-ATwmCh zf6F4X3r;Vj%*fh_dqoQ{2dL8?)wJ#9Z-Qz5JwvIX3013peDH80SDrtN=|YzdWje!` z3@04hux~DJ?eXl-=`L2}hJ-G&lQ>D}lFgbL7r$Y%?tS-N6SyJR7|HCr@4R)YO1&`7 z7EwK{+tN;>*f+8;I=2vu0q?Wp8CfaNkyF*D5VqGa;#*XEJRI0{^W#HmR>iw5KqORk zlEG0E7gSyZ?y0)I_BELno+V$;p!9hu?*jRjur8^RE9!?@fx60V{Zm41S|t6OQ{C;F zYFn=^SG?z$GBvU9jM)#3NugPm*$%IJt9R<*{vp&nT|&?5Kt3dMD5$UVux6}nSRrIb z88oOD=rueK846eA`e*~I;cMyVsxjCHdMU$wB+*`d<6EPi z3KHS8tdI)mFcP7@Cl~`kNQSr426wUj16yyK{=jv5jLIO4H8Mhb2VgfR;gk?5#{H0l zODH(fP6G+bbdou=oe=HB0Fsq%c$YSM4`K(=9Z`#N&%@b_{WLjRuiXj^9W~@g27>;b zdt2DY9Yvctv6)6Sta$%p6eRMQ_!x#0SZvp!C7mS(vJcnzvC^o={r-G%OK>NAn^z_y z+Ezu{Y4pPist#Q%S{`BPCLzPsnb8?vM&nO4l7n!`c`Yz&N)Lu{pujoDWn$^&zd-br z#um#ml)qP4Ixexw>^~NA4|k){(QKI#LP0k?@oAJMJdLjw?82>a`L? z%+Sn^-L|GNs%oK&Xah>1Kd`gcNj0q~%=smn_9 zKCJzoxvFs!Psc#DqumHf#~fWZ1(8^|xEl3Fqu^RjQZcrPjtNw(PT(8Hgwci*tGV() zWnFTW;YG5j*t~yy*Lu)O#z6!Q<9N7=7GP-E?&G-oIPSjfAZ-rAqI9$xsLweZSy3ig z8F)-y0BT07XT%jNFRlII{>?!p>{@uw%dE z%Q3;+ARkx6UOs&YbIBbb_Krv~S>uI>aRdCBw!cyV4iXoF2{{<3*YHh*tC~5E-mH#p3M<4^lclrrE z{C$4<+jrkBDk+VRVLG4qy|N7E`fAPCVZ-p`SK{JDxtigo2EdnFVRP}jY*5mX2r)`e48+W zm02yEmkeLekpr;Sh?%+z+*{<5F9WAm9gdwWZ^`!rr-N7rUj+|sdd=(2hfW5EFpxcA z+VZAFWqOC*gI|8tVM%MawF%c{Q+i}juC=)z8`ENRaLnsWGZo?mvsr*fOB7doR?F$K z+r_8Y#ScHV#!4Li;cs$vGbS1+U5AWUFbQOHmF+TaPU^C05oWr<@FU*K&4Z3&dG^m8eYLUzfU4V>mpGHE%! z1J|U^q*Q1Jj@MufdK%!>F3)CTR93e&%W^l(JSn=w zl#oJcfZIkA0%V#3rwUpySYg+V#nh6yNR3=hM^_3Wn-sPjQIW}aErIA>Obd9sIOow_pO zl1nZ&1tTjc2?3&ni)h0&^l_~ra}+<)pkSE9((^AtQiI8+sZ zIY~M3Sz-`_G!+;asWj$BOLWd84)wGZ` zI++I8PJ$@aBV)91Y?-d>ML@exf>QJ- zG`$b)vDDl=$~U2RZ1Z4CV05#^3xJkcO%oDybE9-I+2RlN5U~n^&;~{RN=cdY<)lyo zVq^G8`Vc8Kz<)18-b_|@7#2eIKyIIHpVQWo^@Mh(;2j4ADt&RMMbYkAEggT*I3Z9wC1bZHg z-GH8TL0`+Pc5S05Bb*}9+AT|WM$FFymJsE*xZy75Lo#D#yUiL}<*HSX8YMNkBsK_# z5rOAmx}1@xGnOvEIqTE*dznq);Dx1l!SWDUDMh>2k_xdQ6feWyZ-B{XvyYASsj*4M z@RCCwrju2KpD7A=lF7gk5GhYaJt_uYN+OLEM?s}_4iK%DjIUDB1(lRT+}HHHGYE>Z z;l{%JmRE28dIf3ivg-gIJtf zwMH_ObRf)C3(pls=tX7J8b2t#DL>vjMe5kw~eg`cX%?Vss0_y~XDUAVceCq4Cj~3F* z%;%Aq2j^Zwc^+KO0|*l82+pHRM=m!BZpp7qM_sJp0dszv#*M^t!rYyv%CZ?sKn(;e z{q?=<7DI;Xq zG@yxLu`nDt)|n$^5$}X$L$|_dKf{DPs1Kq*Lj@w86g6>@QfNdOW?{Kzor(_SM8!w0L!7qlxf#9^Xo(%ZhJma|5Hq z$e$$n*AB=fWo&PoVp1j;xkZsY+hkyIIeCjfQQNxMZ@;x`s35|r{#d^RGFV~VL$y91 zNB>oY^tuJ#K;k<2a6JE_Rw>Zvd^dXU3Xk$ub79=DXq>Dlv;Smv?BesJZA2 zecDr>RRHGPF(KiAo10WI#CS*nr%j5h|V zw&n@@bt8HX{>HRh7pg2^`>K#>-ubRk<{AlApRMZp^ zxRi}Bg$p{v#8|2IOz3eq*!SNbbl{5RyYQA3E zaGRd0O$1#0UZ=_`{RzsR(7BEUgkn)dE@w(b%9&vNfnyJEH24wf$@04C^w}Qoo_F`e2jlcXi{F$TP5SjufRybUcZrS&A=l+NMS;h1E zU*TAm4cs7Ss3G8pcPlF*?DePNkgi7*Y$utOS5{zc&qX=1qAr0EvWbqEk>E9ghyb1m z&qSii*D22nWmWJLO+Z%o@aK5*ZA`sqBD)Lu_lQ>&P~+JQHHIVrXht!{FQ)h1_CHSA zN5}rFgYLW5F_5cAccn+beJ78SlDFxtb;Y6a?G^p}d z78^@}mU#u)2fA2uB@i9)Q&Efm|2H<)N6IG;%uF-GRNC=&{-2)!Hkr@PfG{j# z48)s5Z51BjZNpd7i=NK;U-mb6)Qq~2D?TDEzR`IPj9bopXA{Yo`GfgrQh|pm@)_zS zT!9k2PvHB4{M6{W_Fy0c4ScndzXt8>^?%0ExKjEsF6Gb#r}5T^5~zVSF!;P^%odMz z!HB};cJ#_WKgqLBp@Ygq77hHKg1x9MJn}=?llY)PyQ|z_k&T z8Src#9^i5w+09J5WG}s8D`2cir4hqmZZyo6X5dOM5{MnT~7r>>9=z zv%)Vm6R892k#}lc#ja1)XO`0RYPlZ|TgPvRbH83^oUOtjdI8do&<*I}!)rHhY!9?dH!NF(m6dq2W*6Zt=J$cvj?(sf&rB+aJ zb8{9XZm@5^Rc%erMz$z-^P~TxD#@@Pu&&{~Hb+JGvdRszWH2Z?RecgqDx_(uDmYLI zqZ(dXp7V+)sYi()Jg;;Pszk))CAq0!JMgrsY*w?`m_otcr|NN~XVZ|jPt$XLhx#mY zDGrnVJVYLD95=e}21VeomITxv1oHko=SB*npMuObg1oFqJTMe4jZv%*a zv=lRlAWHXw;m5QTR2eHM1W|QYvEV~%Z1WM%u5ujruNWv4nF%aCr|)=DUg_l7!?q~) zkM5hj)^dZ~=Cb|E($Y*udA}g1 zv@MfU-d7jO7XSS7Kj{3AVxKLszCH`EreUbA4vY|mHBfNXC%LT zZgvh{(&F)c5~Ww?p!f_;<`Y;2fp14r$u}L)a_c_M^9fN3&Q>(Ks8*rnp~Y5l#NVlx9U%8-WlC_&b%A4DI}Ta zEcl4dKcT*gtq3b%YuLTNZF^-Xp^TSf`q18g-Pvz@-@tol_r=99oI)*SX>2Ma;RKC? zp>gWQ<)~T78h}z%zJpFC=H7}=njeCP&z=^sY0~K8Ji5Gac%yxqp@sgdSDj{aFFKzp!zU;M%0KtY{jyTv z!OrzBfTodRquIY2L_nd?Y=wwtjYKhjZrcBr{huIPA5Q6{CjISKBLd6x|4*MiN$vmd zA2&At-2eag_y02Xj|3_bMFUn6h3r8WKQu37OJsE55&L>vVT967&L84cE+)f?_xGcN zeJajbgQO)z{4O*)MY@7wSqG4wkmv#q$SZa?H5G$&*8T95R$}y70oke5rRBTCElValVJ`pAmT72Pjl^XAI&IQ0(yQX-k1zJR@mbV z2zJ7*UCQAjXON~Lf!w24B{hOH*tx~f6q|uWoPz6+L%5K6=pafkY~qk0deE$LI8aeP z$i;RQ{jn3&!N6#^qb^}Xf`~lTR~Oix;EGDErbt2&$Ql+Ku0e=)_bQUXD!cBffkp48 z`Ea-{VU`9c%R=|-ItId{$d?pNRY^J-jR+>4{3uxBXc@zrA^)%A}L{PxjK>yUDte)!aA ztbh2l`Kq^p5CxW7CtL*DJMUWSPa03SkaXs5co}}0pj|Yync7h^)z=Ct<@*L-7M`3QAYYiuk0*#TCu3agcoJaMjXY!ga%fLM4-#>%Q6AB&1?mJ13I z#~?Khg}^LUS@&gkRLFWiKk4bihGi6@GxJv(7Pm)S^h3JUOLa@2FKP_mkei2lWC<+t zagprSiA|5Q@Z8LFvgfuCzoZ&z{3A1|=~F8CI2z_B9s><6FGkSGl7*UAIvJ~=L>9!{ z?IdKV8yFm-4~53+xm%NmsAz9mjV_f}iss}J4ycMt;;OXN`d0yZG=x)onbCgNU#t%_ zXqtFB3$FYD{*=>ciQcBul`_c+h_IV){;2-sm$LWBw5%Ra2L(&n{+%~Og`;h#$d^(> zHkz+}>1ucP%fpx24oSQy?29U2>#uSb9qKM60rYN}zr-K&7OU@nLkaHlZ?FJZeE)mA zwfXe>wETbb`#<&ne@y#tbTJ?q>$IHnl{Nc$UpUNS-WR#G<$YpDm~ychdiDdmo8=g& zyD_X3_N(9qL93^5XNu7ZmOyA!OxA$;b_N)xkV^z%fgUd_nXsXBCm=s|LTw>y1XA_~ z6y^vsnc!qfn68xw@$gz9Kl8N#uUBqZQnCF%>`@>F;@{_}*#8#Mn-#p=H_Ld=?X8K$F8i9%5LusYDvn#Abuz zr1=yy4JXZx22MsM3MUqu|N`1T>;K-)^t#?Od3Qkq!7O2Yr7aXi0@T69LBhfh66i_uNB8P_1mRV z*yak>SMvRDv~vbeK*(0To9)ZN|uxqT2CAMnd$ zETneC>a75!(B~HoTa;QDci8HHuFmd=;8PXgL6HJh{+ndkEY4PbcqTG9(ze6=995hi zSB_EH{)jdL6?{RzDI>Web${;cMcrS!2km!TmE*kMtwdSn<*8NG#MJX|I&?So_c|^v zy5*Z?WlXCq-;z^?&=Azt$Zkh?HQ-~8(jpWP+dCzz*%s)<^)>FxQru1SAFiT_gLyyK z%fkuf9iP1e2W-&Qcp*Czxd6z~Fq}Q;$P&bi%Rg7w)DN zb&Wm2#P8Rx)=BWHb<*&=KWciI z>m)cziytjBlRE~bKs#V~3E-Fu>`S*27%=LXYcF*llS$pkbFI+5k4gxT4J@d?d-G$b zDBB!_YeuL10@_uy?18(A=cV_FxxqISS}##`6qnbF5DQH9E;01^+**7=ON1O_CQ=;i z0vFe_BM@F2K@-`J1>=fuZY*?@VGmgJW!c=_dEI$a^*m)9XI>@^ji71YOu{C>A6zrq zijM_QwrMS=`-mWh7b7yD647w{#`PAHT~;VG-)!_;vMcH_1I^KRH88CT2?6&6GOYdS zkm9d!coz$D*lU|c78#B_kT2uJs2Fjwe@eRWL5QmnSlb$AylVSoMPO zY4Ts*R0j^TsvQK8vF_sc*9mVMoe)Bok?R&b@NqIQNiq%5Y%+9uX?;J==Z5#=1rY7a zcvM)(BwJ+#ftzj+L`BA4!ov$q>~OHPYFMqC!Gsw>UqC{`nn-`yx0oRjP%Q=Z00Y$E z80`9rxgz^>!P-f(>M`|ih9J(DHOxz1r&I{YqjWyWrY|_r@7ODJ`wDvKcVz-wiKgA# zXBWNUG=E&}ud?y=r_X99I7g>f0jL0C3;1}Fu zqXYqJYxdCUd1G%nDHMCKKMrsov5;7a1C+-p1r}>CF!m(qcDI%B_akIul2Z)ycLWTZ z;E=-+r@B-wAN7RizbLcyf-Xq4y6(5E4kXGid}?Vv20{O7;9OBE3w*bbxcXN{_XmH6 z*?5>tYt^7y50*T6OEJf38or(ffkhDR5sx_HXoo7eoLODYq!@u*E;V12%THB=T3r;m zn?jByA_cPOQEohR@YiSv2qai>3oHk3(sXco8$X&8e8pcRmNG`%nfaR|pEVFS<`Bnd zfaW-((LGaOybTPcj^CTXL1$}u@gwI7MKzl+26XMo4|PkCP9>K%7~+BQA60=Q#lz~c zpgp)B=M)SH(8?<0l3PMILo#dSHty{jRbxY?n@=eBt2`g2RxV9Bf2tgtH_|Ny`ofAE zChvpr64};>DWE-l2=vAHne$EOt$RYz{lJ-=cm4 zMMD>neOTfL>eNm5b6m2Zb7o2gv9Gsv7;0_@_lsar7nUs@To5?UuD-XJ?FQ?Q(N7kZ z2KOX8eLGIS$kjB81TqQhPDLPV?#<%6&0^F2C%EI0V0k_m_JU~IWViMpHK(RS83f-$p zS=&rngv;z`Zkgi;j3dtvbj~c9LPI>)Nb8vlbo5_VIBOg1bT+lMw|F~*ok4zxtGDRsSCYTLMIP}sEifNjsO}_r9Ihwlt-UP9JFO#9 zXuiB99WQH~fUxXDHhDWVC3nZuoTN(y7%h5)s|9f;3Nm9}%2y9w=uGzanxr;^?^cn0 z({;{cighN9fVQBR9r7?nZijgD#g7hrx%i>pA<)=MPd_9eV2vsQj=9wlqk3c)L21R^ zam5wslL!OV7Vak(2b`-cp4go5KOd*aQYUN#`K+kctM0cpe@14qT9jwbwE9^&lv1uY zr8P3pvj9jyx4)$yd664{lT4H4X?*OgIvnKjJ?%Uyrd35~!6h2O z&PGW;od8>n4=i+;>0PH2>XWF;tr`+BTtcR;hr&BtQ?`DK2SIjwh4SzQ>QjIvC3_}q z9b^LIlfzU z_%6IMj^G6x;tV!m9LFUrp_j3;+^sm-N7jUFu?Yy9TqYw@YA$!sD_IA(Rq0)HQ@n=XF(1798TyT4R-7 z@0H~aj1E#s=X?ZzG&r*rVfnl5-PRUCKpw3g*BA0~3$Y-3-`U=ZTKjLh#iBZjSpl=V z*ZMD0HHt) z6%MbJjbF0g!-Je_CK0}NNJQSAMO*@L@| zQ903w??zJNUg`O1n6A}b?y;Aj6oNir-GS|>m){^Fetd&Wgd`}eE+Ju z#o$TEN!%#QczE|rr}%A@-r90}lICEXP^wQwZ-dgnVr?g**@tl6MQN<9Y{{x)Slq1m zn%XnEgIz<$Akg->oGY?%ltt0C_|c@@HI+*oPW6J_yh0BChPw2B2mVX3OU_sE2D}gd z<%b_U{J-_p)h9oE^Z)yU;s56RyzCgWoCJT+dkG^-z~c{IeoBMM!Q|lgKQ z!Fz-j>VqxNv7L)8=N3=GQ!dxBJ!otjCC^!eum;>(t=#3+>!RgZta>cRnhmR8#jeyw z0_BGPVwna$f?gf&Y;CvqqrLsZowhCGaD`@ht#w}e1WW+Jv_x0QC=yeIM+-i~K=Hb6 zk|DoU{b#|W;E-Y&b6gSVyHbbS0!Q*Rf%o(bc7qKu&pmc-W!w4;=Na3iaDb}Qy)&3Q zCRhs&7ghZ}z|DjAbwL-5O6?*gBMF+&H|=-P+ue6itk}6S8pTRfwR1 z*PZQx^03>DL(kkQT6=rOOxpOwBc{b{#I+4bdgU-&UiYC99G9QL?_{fgO*-|_|0nlxJ-_qEa3>ua&<{XZsu62 zK+q)A@hR}7mna%VH;_R5Lfi)~bqw`>ADgW9B=-d$Y}*Q?H{R79uayZ)Ea*#NrG!Kl6D0Z!9FE9S>8F}#q9UPq zgaO0*;gcFJ5@Tlh%98$Y=ch8jkhfhzDHG8=#sUQ>DNbx#Os zjYMb0lJ$8a2Qj8G7$#&yMqM^=c@(EewR=}_DsYi|%8*~C;n@(K$wrU<17i=M^J9OC zf6qCW&WIN7AE*97SOKMH#K{W(7rD{`wF4DFC3jf#{exmzF27fIap$m*yAbM2h(fBu zfqE5tMgw!q2L4UpG3Nbe`th|9VD5SU{rF@(hyVWU={Nk(KPLVQ0(nIU1X=+8Vug^c z7Ga0#Pf5Chp{T011hUzD+v-L;t%J@l?WnUGy>E363eZO163k+zaVvnO?8gWeLeLk$ zrJ;u&AqfUoP&GnbQn}hvHXWq1=@Pr(P+v3t3V$!vEgTc&p=$#WZZRjR{dKJ~O%Yg} zLv3Pt<>Yl-o9+2Kx2DR`;>Yj4yE_KDjp4XTjmzgmGIcyFc@7#LM;1_mj$le9dVMtK zfjMnz2V!)+v^{^70AQ2c$Ag}kId+YtppwLUtGTDCS5qDqfmKKc11IFE9dXt6f%X^0 z#*OeDn=M!iZUgUQ`osFn!CdXRcvv)76b)FLAK#KDel44#+!Mo95Hql&kh^=ZwR?Eb z2;krL{(ijx7spJsLW7}~4N>qcNYL$u#qQHo*$dvJCKv%1%0fQ`ErGSm z*n}UA!2MM+x_g4$y7hmj_P~8{Z*{Fmlk$;sVJ>$dfxA}N5?ZXxiK@#kzpz~=^cY!^ zjk8o{0!SDM_O^TMn#|GSSXaN3mrW{byuGQ`LJL?glxSt~qd5^23o3BK_7#Vk_ahN{ zwR%;S*fRdx0~_-6`;iUh>%7p0DhmycnlDIoqZ-P`|ChrWx`BINIOMLtn4hBiT8oUE zzw#$_F|oqCpltCmLi%s)5PgePhnR*G*cn61Hgg-Z0@QJLzo|Q+j||!yuN8!~GN(&L zw7PGnFCrKgMjKTQdMM%GP`U&GCb6P*kY@?n+;g%U3jq_YSwf5|3@y4DIaae36dK3= zAh$uZD&TpHc>_ZA4GPG+Q7PUJJ??N-PTy0T)|4*zT@HPfivVNk=5rHpqsm09%iCxcp~0 zTv>ne=QYz6ofu)swY9Q1SJE{N41~&b-MyeU4Ma6SwqP(tSrGTKTV#1r%QU&d>^-y_ zPlnTgGO8GSvnj*v_DOnQ1KyRvR7cfm9iIX$x@Leu1dbh|EN2&H5GP1zZ#gM8(*-wm zryKnz`f>-KjEm#|rWxtkzN4QG48+rcqK4o^SjV9IZ9r z{~gycX2SAX@c6NLTki6Ek{_#OJrDaF@(&>(;Hy|Cf4Gt$9nfu*o zT?>my@)NW9C|j{rcf5ct|teaDh9pDE_#=7 zRe;f`7=wo~MX7r}ALK*CCw?#yn_fg)G4B(S7~)lA@HpXAtL+X6E5wpQ8(}~2o1=;~ zYf`idSXjp7V6PRP9n){cbr%&4%&~eA91(v5|2YntYEOl#Bor%Jt3xrG>R-hDOJc$F z#EKjbW0%WlHi2u{2%027#R`ZxeEQ_2 zDAB63*(kICTen{!t-8Wk!dX1Z$oOvvw`^h0Shnfa)NZ|Lb#|~zK+RBdH@PLw2)Usc z?SqENCAt_^hr{41$xdUk9s+9ho;_Vdzh~n2O4)iU7xWW@9mKr$_&#Rv`V{i_dze4| zFdp_C!86CULs-vSSWAQxy`X5s(@mNLUxl z%WL6PmChzvJiLy*nPwZY&Tg~GrQSoW`_hVQu_C+8g%q@c@`zL{G@=P#boqk3@(Zsc z>%inqS-yZ?`^WMRPqJAHBxn(X-o(dhdir_cJ|zu9IEp zL~{I|!WdHw!VHAxgL~)Q#HWIV4u@Rj4iiypkCs$iw1Rj(^S zX>>>g6O-OB7I2Pxh_FvBOu+{_5Q@M{Yk<2HOkoqI+Nfj=ta`I~I8BD(cs4o5$QrQS zCbRK0`Ul$XIL7Rw6!(!Gi8Px{;sPS)&R8L7$v=jbmc_Q&bU&E}yacCS^*T>7C9Fb0 zofhV8rX!TsznUc|x;n8TJr?uX7U3b8oZUu6ha z^RLfV{{jQRz%FO#(iF1@VD7|Qsx&q6)+c@881WOT*mW+;NdLy#+hw&tZ`84Y0tmC#hzqlLR3zQljFueeQ9dRr(vKhPe52CG=yx?IKC>%TJ$|HV^klbK0IY& z#l01zf%TI_pS=h zt(cE0xlmNpZnM2A9RH%vs$8gmdcL@|tFKN2F2uRFJMl=8$NMsxZ{sFc`%HM3X%c76 z;P1Wbo(j(n>y}ONeT$bU@&P0*826G1j6}!=%GZcgtl(zAG=o!P?@LwJ{L~0zj=EXQ z&exf+E5-EyYo1N#v}4lewq#{1Z>yh-F_6oFN zh~^04o9U(s{&xwSC7UPr`jpj(+ zK@{xV+zL9U1QrqgTVJ?u7|Qxi?-eYDW+nJ}PB1D8K&uWme@& z-2g55jlOg`g#)qA)tpWEMT4-W>?;q$>)5>maZdk64Y6VE`tUb8IwMlK==mC2&qr9( zWIjmgY~9&)bVqza+HFW}#XVZ&=W(35ht54{hDN#X?Q9rHOV~i8l(Nk$wc!`raHmUC z!hg|J>H6nRlfM6R8?K`0E8V#UqgHRImpKAUJg&7NZO>annKAm^ed}TM(Xo8Sr_gAb zk<{{cb?Hr7nh>cwJQBdSl8eperQMWXc?sm?=Ctf5n#s#)uvxN_)2u5vJ)kyL-U@?^>F`Qin|KFS{t=%VB-@1bNU?Vx#T`KRtP2w{!} z;wv2LBQ*vE2U6Ye^cqqH?vlbfNTi@E(X;K;;@xZQ4{?8n*Po43Nem;s@d+ALy-ZLv z%~l12xIeiavxE{mUV6}q$FFNt4VFwu?u7AB9JDxesz6H(<>00MmbhIgfOrzJ&MJOV zds%$m^D=o;aoE3rTZNEWsnQU*RwRWl7Va6`SuYtX8!Hm{qE7+UfX)Q`=N)?*sE*%N z%GPO5}^#$8)qy`+(-oJx2BBYm>EDmF)c7qSNR z;D%6WGb%r&Nu`jxaI5L? zKC2bxO-L_dS5HhcEJ^j=F401Iy(y5L;a_E)ZhXnSn5s>$CB!)K`d(Z2Dt{M)L6V{P zD`QiyVwv;JaiD~k8+;rP699%LY zt}t`>@BIU%v&QR>TaFfI~!5qd_-zSqA#D5=u2lMDw>x_&rFn? z8~ul+2njYMfP{S8Yq$5|+nW9Db*r--bzY+w9+RWZ_CC5GuPdjL0#j-<+(sKr_3!C0 zJzcr#A7$Ifa@cK0n{V5jKSu|hckPNy)5cH1>W6iu@~mv`Z*!)KeE=!b(|o3=wY^<& zGW}U+>b%+6-G>(UI|tAum5nm3t?FE;Fp0Vc`<=~$ir3z{$py{qzK{0ycmMh;O?9_o zdS!C$?QVBAfAzc1-7>k_f8B#@or8$8yZtiRIy-MWuOL@z=huA4^4Z?C_WW#5t!xr~ z-f2>I&Fwk{6ce~N<&NdE4_b;FEFYB1G;&-sD zMknJFC*xjg|De;teb?&jQXdzSW4Qph7{$*lj0t-)c!}89;j3 zwMBnh3l~zt@T4zmHp?@Bg>b=VKY2vaQC~@CUpH|LKPx z)}Q(Kzw1xezxn_DJN|dCr<-GhAqG6fHwHPem*MPkBB8h9A72QC+jne1f`G3V-+sto zA9-ORU7j)(R{w||9>-TqB3&q^-Q|%8P0}1X529ociQ%dxWxl;JuorAy|Duc$wMuHgZd5Vi zma6t4d)D1^?g;5azKG}+a%1p{^2eg$c}0~|%u6n)IG1Cgc+ye1P%!IS2lRWUos?cQ z@1!^5iPtKr`(|ELW^PCGT`wr*&Au6nUs~qhof+7+aXcY;48~WE=$9pjQ59GQhSg)& zP{yOd{hoKkKW7emGJ`#L!h9Np9tF8m5|Mj$h}=#g?e3d-0^`VRPR}= zo;~3`Z>oE_Wy&eDt>U>fx3+@h(#msm&rd3=TBpL9Fz&4WsFgfdm8aismGY@r9fWl_ zHl?bR`iOAq8vzRl3rmsc&o33Z|8VEk+J{L(mAJ7kYw#T2_0~Er}Es_Iq&j0UT3epQi_-xi}9l3FM7Ek*ZHOyBJ?%X;g_#;%4&8`{&*9Ct9 z>xcjSL|=gUqkry7kM_Oj{;mzIypfvTOXvSLVS|4E3$E|KAOB}{{f8g(_&@7EetZA_ z;o|=+VwCS|QnB?$L1%ZFT(Sj#mi+sA!<*i1hJk(J-h_<*RGi;Y$_|kW8t{Wv}T5Qwc;{Qm2g36zFoXn+eoNV$!EX-Xaymu zQ&sD#54`p+xk~yO%*G-fayEOg2CJ0(3YVZZj7R5?WrH1&BnmnGvT$TM6RCoO=fUbd z8pzrxK4%PWseJJx|8Wj5nx_U{1Rtg3G?73dwB^b;}~vSNfRew21;A@9&)LLn4aav&i(E9|S{Y5K{UCd=Q& z?zu%s#SAI#_Y>n&g)RipzSC$rStyRi+oko68lDyB#tv zO9h4E^h{N$tq|Pe2G_Pc!$z$LaT$(hhEZ;A>t(>gC5g7TC&D)S2T55j&4f6hFY+*+ z!e*fj(m;>~hG-yvVM3V+7m9`Z1>R&5QaFO;O9xOjx|!GKbY~nhMIu&f!3q_^7`mz& zsi7@Do6S~tv(t(G{Hk-1Z~rtIS*~jNR;@gR>-Y6p1bzRHhqLo!^sl)7@4Nq>K3QA$ z?*FGhJo|S4|54-r35w|+Z5X(n_8In$2;YCGy)1DKC=X%)3fV36xqO)rhF+iE@JGi5 zG>`%eIN@LuJn@*Ho5(Pp>A(vZ%Uc>>x5LcBfOi^v{#>&8{<6+j>)vE)@5}*EdvteF zCZuGKd!C?0j0QpouxA6Qw1De4!$=w&0I{Yban^Iw!_iqW&`|QpeuE`8&OF9)aASHW zA$`eJT!bZVsEoIW`!uAN~=e zV_wFhne)~i|3-eQ$7Xxkg1=+jdi{0p53~EiCM&5~#Uh+5iyxh!N;&vTmxJ^7kBOK_ z;6Pj_S{pl+x-P9>JeuMzoRw_hUiq%=4F-`};M(c%vR<(6aKs>`WY3#?`I5BVBMKn~ zlM;WRoqyU0tj*7u_hc2}#6qNy)_B`X3~JgGmGSU=6r7&Jv?fmUt5X7hf9R>$)7#uV z8A|PFpBnW>U>k1v6;w8xD;V}}eSHP*Uvz0&!5CF5>*0F1%70RjxF_LixVGZm(JRxd zaU|hV;l6G@X(HCb^JzK`YO*y4^`AtJ46U`g>aVZaEY-Q$+Qz7m7)cVQL)pRp*3!ai z%8ksv^X>|lEG#TUBJ2T!TuVnWJ|PH0tbfr%gbsKts2x>%v0*BOp^hiYzX2rOixtn4|Yg5B02IZviWBaO4EI%kzo71`f3P2f(heDLCu2+j!Y zzM5u=10L^20AE4^;5@SCQ7bA?x$&pTBYOpEM}J#6{=WVjO#gR}LK=7t>r(Yz9jzUg zgh-Jq^s#kDg-|-3#B*Q;hGi17i5r^iw6H2Wk)Li+3~zX;TGG_5tf`2m?nQA#Y$9U! zP}Snn8HbvD1OEQ1{QpWus5OJH`VP34|9|51|35r=_AUO~A2a@27|K?uE-Wn4JzIsR zI`0~GdYN!QZvrV`fNyF*&L(@{74X_Q2eP^92f_NbRe&< z1y-{%F%m+`+y)C2^Q?8@tYwIQIZe)PMOUYagl+^#jN;iwZji<(^GXF(q;zYNE80*$ zO)r5A$0NDObmjalOo7IxDF*BPC|cw0V264WG9KAoSuwn9$3^8R0Xtb*RG5XLCJ`ix z%P!cAf?6AeDdd$?$x1eY%|~Z&L#c!)8^-aNJZvUVP^*eMUW=hce zLu_?RW~Fpay3jPui3%#GXGcwnX~v(Jh2nYPS+N$(m^d8lZtXU85SP&a&w`Om=k_6X zsiuZ5zw7fjcsaLtw)IEsfPsi@qs4*AQU&5Hz0abWLD z`5Gr5H8I?dDr@ykVwyKh)b0uq%*Bs9%1sO}po2NzHC0FPX~+jU;uf+yc!8=v8-df= zW^lClQ4Q$sSRQglFn&*yTo<RVD-1k-U!yb67Ckt7j)C} z3qhWd5-I8BF9zc=pnlj$ww(5UrR z9wcBuoFG;H3TP{Sdk_2`{@;D%|6BO~wI@%1@c929*T3oi|1aSGKbtWY!3TkZ(al$Z z{Z?rN6}9E2AEp%{`ROD%7yor3%AGU8K(9^(a8}4PR!hLYqu}p^l}5nt7z`Q_f|2bf zC^k!^Zwqv(H>|njiYk?Q5saBFX_3xRGLj=s46pRnCi3565Lmu1JOs^Rj;sJ=n;EC| zg;I3fD`ED^dv|XS^@QW}l8g>tXy|@TmL2h+A=r0(%QB`jPrEGT98+-a-%m7&uFbJx zKm9srl(4@pALJMRO*Zre^dD8-D__y+>%sJYef7!e6W{*p$Mt95=>H!~|4XFG`p|6d z_sEfz6&||;pPspKS|8OgoQkHJoW)iU!l#IGP6+-7)A#5n$(t*1H>^Kx1l1s@*6Fzg z`7`s_!e8NOZ#1Ifl|$r0n`E^y8wW=O6(?;T!%sBkaDUFm0%UYtS#T@OVl>s9qQz~c zG-cmvplQ_r@6~veYOn=eG=&RqImY{Lc^PHq!FFe-jX&|n3~$dKeZt2DVi3VS^fCB^ zwSBS)AC|J6oNdH&`>)&mC}J1*u0%c9-rJ3VL_Sy%RzZygKY` zZ?*TMf{xlrs>2jxDo};9{v;Vsiw7aI23$O6J|?I_E9hEb?*`mE3fzK!qM(j`kidpb zifj1syRG)C!#BhqU|ezRLs8>Y_Sna2xhrV-hFiYrO-A?^DOd3aVf&C;Xo8Vm>_Hbb zh(#XM-aoiK;J)IiZZJKgnDaQ;vIeL?K??;;YS(<;hz1!M~ zFjr8M5and4MLINsK2Aq{p6cKeG931D*K`M^Idn!tgMfMn2e25>@LS(0b22;)kqoyTOMWRA9qe3+0?^f@EpExe0!j3iTIf$?0VLCs>%OG()M@~VVa`Z4&Wk!Ar||>cpY07 zOK;sD^}DDmOad1_;yG2PpKG>dGosC= z0DSRB1lBRz3h(nE4sGEv`TU$BeX?32L$qAS^hOdUlx#xIvk;X9cnb9oH-FxQqIlVg zMvrP(V~NLtY9dw}0ZwtV`If5+f#lTu>!FSwmx%InP?3*4P5-lErnz(XCIaT#TJoycDNBc)YwC(PsYfS=_iJxK)wLdJ~`~g z2ob1Zm@9v);r;aq@00q`-+IgcY%TxS@e14LyfB7{6b0&hgmgvLtD4b`#}OrD$6yyI z)*ti$nUeHo6fSs)KN$CG621)6Q`GrXISuO2XHq(3%p4a*dnW08TWrJ2fXuAD zRHVLb72YgU>8QV~s5UEBwRX|%WHdG3C%~b|cP=JI)r)2(7xf=9LMQ?w(I0jvCaq|M z`0b%1#JY#QtJ6V`_<_;&r{D-N?ShY00)iP$m(dZaiWIwwxG*ae*t2@q2#%_|KUa^B z>E(4_mzSUyOK9o}w`nqfU3G&1vx?K3LiZZM5)@iO@#t8A^`;bS+3W-Md;2w=Q4CKU z*b=P3l6c6;2I|RZ5BIml4JW77Izn0} zQ!IX`M?;J_4~0mIAjf z_y9!w4zDcenDwO23!8WfSBp$KH7b-)=t$N9eI6eZ0-iP%r?3Mr;WWU1;T*w#;e=hy z#>A#HxQJCt!>EJ=YFmYi24akMMeMaTN^i(xjI97hxBS(d;LLUl`M{(ye>5kV1Bt_ocGV1+88xwb|jCipKmwRl`GXJW=N5U-VjBz z9ak4M2-rJaLMP;w8=9tV6Lr>D#`2}AtNoL<47*c!~khM5U-o}#@Z6(Kq=8FXpcvw)!(CRC-Hiv&YIp?(!_uTwQ6llUy2pgXJ%d~WwRIa5bwVB9oe zW^1Oejo^EHf*6Cfkd(cggPYJ#h$@z_;|xc9oY`5%CI(gkeb$xQR8+ zgcXoXS!^$7Mto^TA;qrP4oQXjmCeb`G`&szFW9|r(;GC2;vV#giH8?fiaWH&`><$SZ9&GNde^d&weV`Q_F#KasGyYSBqV z4l9gT+A`c}-XZY`t=xS0`otY*&49!sRSfexXk?%1hT5C;TyA>AS68a_dq`au$Z83> zdw1KCL9-zrcCR*`^f!uba(!<@27I0s+;DJVlbs0884$Z^O!gUh>fujJ$umKX7f(10 z)cshrxc5_kqL{?<3&BK^r*<_hC&zh6H3pA+lVY2*(SSVX^z##ig3Yfoq>`)Y%SUTn z1)`h5wHYUIpTO*`!SOXf7ZElkN)&y2T_nIe>h_m>@CyuK#`ZPduEBw#GRQcM!j~h= zidTFImt=7_iYKRvUN}_0CJZI~Sr3|Yj5R<&0*vuhl9BQRhlB25PyxXTAl=r`{ke89 zl*ddhAnBXtUOuZ@Lgd`s@9Z5!sI(=X9Bm$=&d%#y34x2O9h;p_SUQS&sq5Z|yRF8?LAd-1 z8ytX&kgc+*WMF75)rtz@m0b`+4O|CKF+RN}bR&~9+-*7|Bv6=J>4Fg>%CunRFtx~@ zrvjmYCN`H@ZuHi2Kp7e&`pMmzp$^m0Irf*=lQ^A867yoxqqKo=J$*8>xTW+fTr|c1 zSYk_VlF0Z@`%UYh^Gh2?-P!3J{0bMu@>;kWtOUxj!%8s;MPep?7=FAnHyqx9c<&cM zPB>}IaL~5hzzrMDkG%K!Prz8c1q<@-x{H;Zs>jmttTKN5odTk~AzJ6yb zp;DY6Q!4mwtr2{;US=Xo``wM)dwy_V*N=YO;tIO(7 z4zOol6@2aEeut+?d>((`>$>u{#gFpyAG35C*Hrm>c%IEpv3vvA+ofv#4h6)Oh7@i# zcXr!5o4Y7rv=q-r?i4n-Nm?1D;<^hnpd8WZExn#3qQDq8&$ zyLDI53;ohzAaNbb*Zq@!9*P1Xf@C9R`)x>|MB| zXSeQ_vNkWps>`Mez6Lk{IB`aQ^mO%Up*qf%*}(4j>+)tV>-PpC&_RQ$3Q2Ny(rNG- z9U{;K1ZV3GB|CBkv)RN1z{&L&b1%%918WM3UsdLO%U-z#qJ6EcrWQ$rpCZ^JN6f}1+P!2Gz`O_b~>BticvqVDzCfMl3@ea zYg=vQQrDfBtcwA;$lTyv!9MbKQ#kPDWR$^7C-g{EZA)orO6H~p(-QtOo}@3nJIFGLufGRo4bQP;7py%dnY@!nB-};Lfp;-ZfNWSFRq&e?`AZSX(+J>#! z6nMiD|FL0K*2fxERY%sqwoeS62h}H4x8q-_+n>>CB-0Y;ninCsnz8bbgxKO1siqaz zqVkPi|2L-pz;aL1$-f`}eGUHK(;WW$+S70J{}1N>XYgM$meR$8S3o;rgm?_PQ=m(| z$-qT{T@2o(qXf29#`t+dprL~P-Psj2b=IIKG+A+o@)RXp@wHg`q3zBU*8*fqH0Z)9 zPvU+Iw^BxE>w!dA&w_L|C5~L9$nW#!Cd?@GQ@$A)85rvOZh8rtk*wVGE`dCb@v0if z6V$ION;yi>r;~=Q0z*ZdC@m)`JR0yqJC*sU!Lf?38&p4qR@=ehPS`u0o;`>c4^$t< zQV*#Mq#l~4!3kt-HoKIRP9)C>HA&S~v5&KHmF7iHqB1G4ro$c~YUgR~jFHFiHbC6J zOI#ThksQUB3~>Va^kg?=84w8xMZGXT*tRq*&|I0W1UQ9p7H94RYg1YlC&AodyZ>Vr z&sdXsJL+FdV3GeBQx{<`pnaNb5Zt0yG}j1yh3MM>PYYoRg?eMkDm!{+Xa#Fh8vxpp zy<}}b8SUw9un2$IrWRukcQ8=<64(6{yK$Xf;?BUaQzQg-kH<}@jmQ{8wKr%;eFby$ zkWHGCbjlv{)u`G!4R)$BPGh@vDL~-L&E9O9HiGY)O=p{hDvy#mh_Jz}z(mKAFLNWK zvlwt@hy_klCJm~SLO4eJ=Uq@UbElfbbgvVFm=sj&cb1)_5jwooZJ?d1J520S@xX!m z8pcySyLAhE8RJoG@Lsi0q+iNfX0|uQOWr3N#g-4~;Z?Sa8{)>-3oH}}#>K&nsUBvI zfr`nwL0+!LdMbyii~Z%wHa-(GSNMX8<28ZZjx_3+=Xhfav-4RCu*_P6fgDpYaxtgW zK8!+eh>I2DDYBhXhYBf_`VsY}s_4F0RB0gyD_{7mq1Duo5%BQXd8ZDjL5;iQZHMR2 zrK|p)3z<6m*!^N9x=Aq#XeWtCzOzezAl3$ZhLGEg>|d*M9NnNixWQu36*xqDcn#i% zq>vj;lOd($_ZMR0V)Wk&+fYx#E7}7O?QqSmb!^EL$jHBFoR)PS_w+Fx{(Fod@>`B7 zjV!WYdA_)V;90WAI-r1w@`a_X4n)d(8Y~+a3)ZdSQrt@!sAqbGYhgmes9IhT*)VGq z_a?BtV4thKjh>#0CE)qRStGRGfnAl#zY)}Q9UF#LG2AdcSXFW;X;vj>Dfy3@WT^)q zKf$^D6mSn7)!;`+-kr&mZtV&Ffp@ORXJ`W=9wdpD9JR?TG`S@x2DbO87 zx#{X%QF(24($`%K`oUd6+}yJD^maf&x@CwbnZ_0sRC`_^?S*zQz#tjqC25pizL*=~ z(M*BpvmVtRHw{^<-wT1GfPHL^-1S=Q9&EMu_d|BQoFiKojk}_f47;`EaNmMClc9!*!|4CU{m$79sDX>GU#?~-P8yaesdIeRQo^Vil zvIOKrvN|VL$5sxzL*3Z0y^srNk?WG^X@aqrw{uXAyt9Ui?F2pQ^r=JOLm}j$&$!TW zsXcz_TH|@cP0qY7=k6WSBFlA+O;7bz9p-~Pc(JcJ^V|$QB%R5!CwdTTNOpUw7xL7H8Dh7lZ|GY8 z56l19nEc-^|9kf1)2Dg)-w)sLAOCprzs3Lazy9}E`TxPzZm_d^5FB>f0sfpC301;A z{rZiJVzzVyY=SPlu%N|CY@wgAMLw#{MM6QUCx#5b5Q|evQ);IHM;fFy$&GYDIbu!y zD#!7Jf>%OzG)hq9S_P#PCt$K(o^k+^MM9=D8QFb@9$hNC&|NJb+o512XZhC2nTuF_ z9d>Sb+c27&SUGh=X{u?Fm2#2vPl+q_OTo;_qTF+l)tTU>3eNZ}Tn(Q{|CA0(hP)Uw zN9iE#H}(BbQTl*!A@Lscd4kMcI=F4J%RF2(@C!{V$%OzW2eE?ChdzxY1|=I1D&%F7 zsY&oZf%zo)pUxi!+r0^*F{5dgTdi8+;cd8Jm^x_S13EnRK2Q6FZph?&ibE9NAvKZq*UPhqR!5Y#w$GcHc$agVq5QsPfOMf>srTGlOsLx^LNM zTH@96d@S+tSZavKH`5wZ$J5bv;y2saoPLs>Pbf$|yet$gSkiC8CD+@jGp!OcPqsTt z^gviLVq$1%Bx)2Qnkb}bFf|*bafT4A2*;}XAr`#4GdDfTW1?-$YrNS*(fpF)Os%&0 zt$`>)&@UvhN;u9mNO>ILgXRXQ8BAdqhkh+6Hb0G_hKuCyD0$WXto|IkoqU}LElix= z;+?gGZypQe-880sVqa1eZuO8ql5Ii1j@>NUx9LbQ>UFv_dGsnxhcMd>o~UEb=gFnV z!m>AXwMKe39h(QQ zm9~$CIy-xZ2PQqlMfCF=?r%rk&A07$ZN^ztepZ&%EtzbhEDgl{*PRmk-g7*j$YGi8R7D1e}c#Dzx-7Qf0sHN}?OzoRXfakBZa%F)jEKl64jFcC6Q%B-K9yw&DOLtG z+WsGh?e0PJu6^)!ck9>|p>l+jhT3ion=XphA;Mr3A%&rYmq{OXoKm$o>a#+yi2^yT zE8%_9nwz{ThY;jE*BqAddVBHnvP@gkzUo`cP zh$Tc{ui;Ja7VmY+M{(nEma7U_BfJOOyxDw>TU;v>9kOTd)fq>R zRYXr+v<)#fMC71_(mlQvPx;9~=SfSb@nO~zrDVll0&7QG`@!8sHRuQ3`p;IMcp!8d z0PXh;>GySNH4pxjV}nX7F5`e4M+ozPgJPQ3n~nPE?? zZZ(6+CXQajQ5C$+k^ms=2lCdMW97aYcPN5C?9V0>+zfU>CGnzuix83GztL?)9HO$$ zAs!L8M#NiVgWpgzIo9{g0hXhk`5YY}KSXr=W$r8|ONRh&K#;#3J)LE@DuS9Sr+!*x z9?9aX$z*L`i1x0LQij&dwPf?AC_5!S4&y2028EI8ZG$RVOI#~+Dwv7nkz1;ETjlM% zV6t%}_{8`cl;csO%X7||u_Ua1H?3IJsKb`~*=}DQ%7|G%$L-pcXRr?>_mB{qtu%F+ zSrdf+b4r-BW9x0LhT(!F<26WDI*+UhysjQwD|H&f&S$95$uu)8IVn1LmIm<{!y>}A zPDeUJH8YXcVTUArjnSZL_U1qd`EXA_?~|zj!Wrn@fz2F0@``&SnofG73>FR^uKg6R zL>9L&DSfmNtgk+GBS#g_7J|l1ZfU-1^h{L?t+SgPo*cns50fnFy{OTpRd)kV$f>i;-P;5#R@x2xkz+;HfjXb$!YcTyY8K8AI{o+XV04|?|F{< z)>{`wcb&5`W%E%!ZTX2R%DC`(Gxwl*E1$J596UY%7!tr6eQ|bu8t$D1U9n?a*hSqX zuqIivi7fbZ-uQJ@s!HnIF`6_gKfsc0pfqfaaZya%oiA87Z;uUL**dq-Vr0q^Tvw9-&{FR?a{) z&l$@z1PEV04zMD{Q|Z^xbcU#Oidl0iv*bD^KQjm9y@Su+k!5C@zvt)Ntb(TyIihvV zryySz$rEma;&mbZwB|Idmv&CKV6{0)se1bsUt3)ZYTcV;+P}cM_a^By?We=6t`&R2 zvXgZH#l~g@m$j1{wj^z8VF-!h*c$-NV&7^nTD%9NDrn+syHs2;e-9wP8SvT3YRC^e0#X_b9<|> z8}5Zt6pqEI+#c0J8CAJah9H{zCsT?G^;DGOX3TL=j-qSx=D?O5$&s{D7k=+1a%F9q zt#SkCwzi1SJj*~owW^Qx~|FVkq6g*~dKqiTb7n#aa<%~kJGL>u)f`fK!h zcmI8Bf2+L}?d|U#>>ktEJ6a9H@EJktu!gj(j8eJYpRv15xhkopi&Wz;A}BHo<-*8A zg)>a&q-v=U(N%85ufVF_fN+GWO4(t5mD-eQ0haWfO@(TrR5`s3PKv~nb!A-fo>hrG zLBAn=kUF3>R?tJwPGpB9=}BE(OJBTwJ#Z+Dj()zpE9ztxUM##!wTWOgIsc1e<=nO`TS^eA|4GM2`Y9%0N-xfb0? zsf`%&CwM`FZkm>cNk4|vaCyxNz(GUDuu6>+H1~e&B5F%eV0Rx-wVg z;GS|{5$GMkho8JfcYEnm(dzeSSF<6(b)R4hCm8wYDr33QiN0t~EZatI*tYyDIbFvt zuU~YSSdY*i&934Ju6l!>J(fzrdLQXRhP{yMrL+5rejh8_KCPDZQ~<)mC^5fl3pVok zU!`jJ;)87T0iSt&+m614&-DD88<`b1M2`#>4VLMNz%e0MhKqcuZE?c{gNi7b0)_su zEoJNT`F|>`2@zeZwY4AW4b8vHXd6Wgy?Z!IIJ3>|-EKR_n&zX=d&~HI!?v9*83dm< zGw|Z|_`R=>oXG0St3rF*&@vL1z2&i*rOHlvJUDxc<)V6XDFKTePnu*O9HGPoFI^Nm z<75y45B}))2oEC3GPqw~IQ40lP8h}~y8^Tt!a2Efj4@0G-EqE)blaUsMDr0Ie95cbdYx8mTAleqgGX^=(fs#)`S4FtB(u@Ono3uM!DG?Y>Ue6+i9Ik2B4l ze3uY`fd7(%IsY6{_ezA$pS1xHqm+<$KkL9b&HIsFzvg-T9XGstlFqC?7xxuKWW@*U z-@|H@wLM3N@a3KQT129x2Oh1MZ|7AY3;xU(?B_oIzUYjFR5AnCDx0~0&Ulr?Y5GK z(#2?^N52?+JQ-g*^0>@Z+!hj7`#qVNY9eDo{9+H8&bUJ&{a4L38!NK3fVm3b3Z>Q7o9@aW>bGg*s8zS@$`WO;q zylwx6uUMiu?7Be4PxM%Y(PLuNUN5lqgr^wAmSIjna z=<%&ggejUMC5BG7q0{@nM%{z`&dwXvZJ6^3NxSurVy82WkAJL8vh6wG5cP|}BK@np zG?FP0WGCM4YoxC#n9j}3O_;>fvoM{UuT0MR_#s~ zBjzaw)&2InUAV1UTU+~<4cemmjvF1lQ+mtSy-C78N;SL!GG(IqG+Yb+Ojiv4^%n!w zuXF|pn!jPdK5PySMRJ8VAlq{o+XIHduq;dCTeqa#BkJZ$uCC$%p?|ut0J;V~djG*A zmBQLNb392uzytmq%HN=W6;w)?{Ki%mfe@$#gyrm$-*bw$$3<^=rh3i$Mh!)5J}cV& zDtE%!HOiXtdZ_{cE^o_-*t!-ASfZWXgU#KY9Y;*T_bG-L5_8&&Za*jqD?lNKQG?Sv zO@?Uv3sZN_$HS=vo28CuBv9tg{zK6>3Sm4#-B0LA`%J&1v))xQB)=Qh{xqAd*Ki=( z2R}IMqm1})r@PnQ?7Z%@w<5eh=W)-)MV`*#HZ8i)jWM`K@l7b`O8QLznRtZHr)isM+;?3Rd z;{|*8nz?ou#)Tq}iwNT@9}&?lb2so+2yhF*^b8|Y!Hb&tTb<-bk7}Lm?e?42cJ#L0 z+Je6R-2OG%Z@+2(6~k7U0uq3xSi3LT_?r4%-J~jXM;SG+w5z|gwh!C6&hmZecGsEi zf|+ULzH&zll*b2wZ&U&o;x11bCn|Uwv7T@m$=K>7I>8_YVelTk@e=jIC@FgdJd(!v zVxQdc1zxMDnj@pX-qmRWZyk~9EE;T=ljRfgeu4Jbteb#Y@XqNY_(dPBW5l;Gcr}}{ zN!Xe8pdkz8X~I+$4QLQ1LF~i1XNW=(3N&;&AZcn2nne0I)M3C91wnCjl?sPYOJc>m zP}~?#x8}`AGT}ge^#)ysz+Bv1+#+9zjsuKoGo2t*_(li>xf zBx9;Vgu@^sg1(Uf5Ydf3p=iXhc64xOfrBOK6GBW#ifjlXvMp_K1w~gYVMV<5U{_>CxfNyH@w- z)~oHdP=PLUDVKHkp3|LkZYI;^=g))7d3TsSxTDMCax=qGd=sI*^D>-Hu$zsb5>>p; zXkLmk*K^{k^4f(N<4N^9$n*U1uDm#BI-+LrPP)Fw=FXZoG>My?ru}r>1g?y%DZ10! zVZ74qoy9x7>*Uo&9r!Ba)5H^%>w1_*ntUFrL>n!KIkntJ3CI|N{&tIy93}#?j+iAZ?!Fb&q{p(^$ zZ7~mU?Vb}EF`V1V;>XK7f_%@xbQJh#)ZE^p!r)O!gIV2iy(wrg^I9yD2y?mcY!b)+ zjElFdx3~-Uxa-OX{i;zx!Sg$doegnX2Qi1PBYpr2ir@pOE5ctLcB9SRt#;QpJc*}$ z>_0Xb;f*hDsA^(z22;A-3*{ho5UiO~9VOs%8cYOP@6{iBo1eUr*rs2lS3E zu_0=}m3pia14%6LuhY9lvm6FxQ0b8#VhkmG1JY5Cap0mkmru>;2US=^v>PSn&g5tS zQ;CEbL5E3gp?fHkj%$D7ySSeCJD%rQo2fsPrhZL#(GnLA<>A57YIyeT?i4w%>U+Du z-NO^T3GND63ZS|ly+C0 z#at-y@B5>zu`O$xXzY9rEH9#X5vkquM)GJDM5lfM0)!3fFqw@AeO?_)B@q7yMm(`Y z;TG7>hB3(X$6>Do|AT`B?w9?J%IgOVQH9;hN_I`cMLGsw=9igcfS($j1Sa_Fk6F z;PL?;87d|X7HgU^quN|%fIgEu^U-k>Tn0ny;QSD(9=a$Y>z%J@?Y^2WW7MS*KknCN zbRWC6nprtTBLXFc_8z22qO%l{{)kvBjBpiRTn4&e+W<~kBFYZQN>EzPe7g2)`r40( zPYje}Y5_1xkuPmYU4~=uJgW=pvjOj{S4H9T-N>*1JH)pz@gLysj{ha$U+;_m`ec1= z)rGsNPFNo$b`%;cE40I!X5-$?NTGx!(2d@RO*&Lf)aes(3tzP1w((3(#<7G&SSSkAIqc0w{fk(8Xueb*2r8NXT*%=PT8W|gs`80S%F4rER64A| zS#oZt^B0wFVvFkx@@c_f*gBjSRymyj(RV)5ti^+eyJ7@#3;^uG0T`*6?8uR;Va*ap1!SnSF$rogL@XOr_dA_JevY&?zV?c+`u zySiV;!*q;(*e|?wJZi!dJDH@TE3#!pk8&$_C12MRHtPc_!E6PkVL#R^mt!B-6_Rph z1h&*})sokx3>Oa@%iCvCp1KVpwzORCtQE&J(tR4UP~tiaQik zDXJcF=kB1Y3&qa#TU+~`ox^V1xFfVSH``qo09Rt&H6-L?6Ws=^y2&65w`G-2Le-AT zno!K{FxZ_W=NNl~Pof(gvXb9GYM>K}e5|7iH-TB04y*Ya#y(K@QxOI$Q3pUlTxMRi zYL+>-&PC_Eti4Bgl_aM#p#DdbV^o*l!YdL+u5~1Xcsz;ww5@4p?jOGTHQH)-H}^Yx z_&hlwHUtK2MQnB}3E)NoT2SGA$^6Emm5EUFbu0ftuwZ^Gs*y10m;fwn%0~Ke=MYMzytf-k>TM>4Ei|ZUO9!(TLJdSa8ZE)^K;rWBIVxI@o->-TtM$ zZT5kOh*Z?Bs>qfPRHRDIaThp0b<6N(F6vOFOh`~tYeBhk00vyfbT%E&rt(Ux0k5mg z*obyGwArF2iYOC7aWfebW8SO!K6bL&_q0}3;q66`x0#|Du<(l?v1fOvxZ&u838!zhCdX{1}@i(DW5LjT4s7 z)cfFM!U@Y|YMZ%{FbV4CoxS^ULTGdM`N3hF*op-Fy&TNber(QF67`wOPmt)6tVc_IjF;Ewe6XxhM#tFH3 zobCO6Z=4um*^HAi-ZxGYfq6voXBXhv~-%H zmdm;=J|t6(fnm*x%kaso+UmxGqEirQc@!Knt~z-H^agepnE~T~+{Mh8X8ZD8)EvCa zhnmI2&)M;P%#j)lE`b>sjTn`d{+J7%Q4Yf{%xIopuMxlgQgQyOn{}sLn2caR$u#02 z)%-EKxeHxl&0}-^aYb)2vL>++YGuD|CGZ@@Yz*lfLSf8BWo%3=j`ymdH4OI(pb;GX^QsGfOIm7UYLG@3s5B_vez5B09 z;c{qE(nsA(xzFM5{b=!1NKTqTDd%9T!;w#O3uC*;<2G%c)77ABF2ZKh+$=CJ{R;{T zA-N0_YUR7jMa{bNw=`)tB=QkMGP0AJ31oCWBcp8+SmuI=yf|?M4H3U}UZ)E(o&Z!yIGAo`ySp5`g~ zIDUN<&^`K}wI@&3{rKNco_*8*{DJg8L4|!2D|zh>8uq>G90c1*KW3X8j%vM`j&CRA zEMDu^gZ0(5AD7o*k%QJb(Aw4r-dMdX9Rrz7GhJp6O|av5B^4>DiRLjZp*%%u?D=HY@eC{)RosS{2h>FOJzFtRP7C>E*&3r2fHoR~~0 zwq__o#6F8N5B?j|5XZCAVUhuxF-S7uxf(%+A8E2FSjP$qy<>9k8lxMK9=GXbgM;d% zI9JdQnKH7xzPS+7b3G!Aiawi+pjpP693b>ogEeq7!dp}p+h+t#AyP{A*COkPMZGcD zRIjhM0#cZMEFpf-qQES;BxM&pmSWkF+!?TWQIBwfJwYWOp+qC50V%b_8Cs3RL|8v~ z+YY+BuMgh0_S-?H8|>}x{?dVqEU2`)@Vn9o(1s3PApzvrZ|xlX8tlFfT06f6KX(ud zsQuSHxb3>Z?mku5dAGOSX~Xx<&gS+Z8b1ZEpezQo-|oO!fQk=xsZpt})9zx0@7nvD zZ{cU_RcE_%@M|M@-8tBSda2UayZb>a*lX<{bT$vSTl>M@;rjpz58@&TDk~ zZ@+8r9E8v^d<%fn**OThZ(G~j)LiQjMzOE^xw*Ud>wf3W+k@ck?lwA91+UuBLv*p? z=3s!E+pW&KMzGa-*Ls7!+z)o4rhUpLy?p<+jh}evJ5VZUkp%`02~F4b;b#LzynmpJ zzwe+dy0zcw;^e&E--RY{dZ7el>Fh}Nlr0BMzq?A14SyeY+on%j?bbHb*Tr7gnXQG! zO-0xVLIN~W!8shn*(pYDS?K`Ek&UeUh(K8|~Rj=7!?W5@&v9(1>4lq1pW zs^XJ*h8~X7DJR_ytsUJR>~PO%uw!_qER*alxf*kDchRK+Pp|Iv+LJnoiN&E{#!#}{ zGp>t`_6K-sfn?!hAXeiJgLe{ll@1vm-Cq9^9-89yxtxxJbR?CHmQ_vsFVNKZJPfva z6Cf7#(4i2my$;OjSZqs&w~Dr;O3^TXL=8pjCh-}@lR(e#*@Pw@UVRv69qT$fOAr$p z-8P}$xQy`DO9@qweZtjrn!de6gHs#k0&kx|oLx@SF`-?kD`iE-x&oD3Ow`5n3Tc+? z169AgH_UUNUVsA~;$jk4aZ89iLWQ}PDWRH`Y{EiyWP=56fDuWaqxk~9_UPw-n5WKu zyS4SJgr=&{kBzm8q#$pPruhm?{E(#g_=els<)+jR)zs@PXdI{mCCU#>GcVY9ct!wYx3w8ukW=&@+#n^L z#>wWbLxXPwI#a#iHOzJ4V-8l~-uh(99#AJLxX1Tbsph%7#+;{IBvNepu`&e z_W{k*wu9Cw|AQJICxf!4uYkpb;j>Q9NJR871 zn8f!~C`ai5lVhB~@PS}Q|3mJL{o*G<{9#N;FKRqiOhCQU9C9XNOJYeCx`+6=vEeD{ zQXFr2319x5nv4i|g-u6wrhtO*l7wN|!42G!NQ&&tGz-LLny4a}M~;PiW~6fkCPD;Z-x^1i4pPTpwl11&nM>3>OpY-51 zg73Z~6L=FgMKxya=^dBvu^r8>6MTCRHEd8+-jW*_9(!kcU){PplnfsU&dXkErKX>; z4?D|zDbFOGopT2W0!j)fXbIVT!{l^=hWKUSfa9DqI;ZKAT?p7>+1b5LK8$8pWQcNX z#Yn~W2@=l_WnoW>xkebu2$5~Y_J|-tkZ~TRR=l1`jITHRi&#XN{B!Iu*Xo zWp-Zw8Zp9W?!?M$Kf)3!35qGG2CsCTP~%ja#fQ5!7);P$K17Hr0vT=u&8;{4t#|cM z{1XVD{Zo*My(I6#yM>1a=H`X7)~$hxixRa~BZxzUu9;4h!?F(`@lB%qW%6IvpZ)vo z|DUb>xc-B0|NrCa`ZxLSA4vXN<>Vx-7Wo8NfvM*>2ILcrmZ&I|HN8bCquFp6VPEn| z6E;09>;`$Y7NxLmxF}^dO@_tIkOgSfo*}v}s^&wIu3*ffs!|FIPDiU7?X(U$zqF&y zZuGv@IdEm_MvkTUgT8j(;iHsACmr#GNP_*N@awsp4j3UP)jLG<;ee=>lG*n7fPUC6>}B0l~#$o?8OIq`l8j zuo%~jCGkB~iWhbdj@yapAPv&%Aq|s&>u`*6HfRO#Hy_(T1+VAD>l(`l<@aJK`JL~M z^Gl)gMJ|Dx%zyVhU7R$_!^Qb-Sy#e-w#+D%)8eABXK)Itg^K#=44#Q@Fka8rSTTOn zbl@vJ1jE&`1QrSK*$jBGINxq>1}_qzqgN5i=Ah3OQV;^KV+56G(3|!s9ZlJU!D#}! zeu)qQ{Yx~UA}&^^p)!Yzny0!L4zY(4Ci-Hnk2?R*7cs~2J~Jg;P{ZCN%Y8idOcFHO zyBz;u3I4O>zD1VIS}w78n)lCkdj6iR;yG%Ul0cJ{6CtPIzGMzvi37Zvc_%ovw%H-d zt5S*eEn_Z`gmD#ay}acY(MWwF?nym$I7no6o6bmV{`Zuq1?kOzvg_%vtceyyWtO1y zBb{6pp%->B%ogbrg?<=BV=@{-EEJ*yq_Mp2B}1Zb)EewtSl5Prq~M&<0ark{g!}j= zA{+t((uhVrthXG*vR{-7j@luU)6fSrHLiVRil%+>Xh6oZ?&DqEb*8hd;&d7LhwtG^l5jdNw+1zTsZXIqPbPMq4Uy6k`2C4J@w-MCT5Ex%3XyRETpr_S(@RJr4 zz2whKj{G`|p`)GaxWFYdC@ZR3H+dU@rgLF79cZKLmlmxL%6nqv(jCd)3q>XKxpW2j z8=|O!d@fxAVE?v~Rq~{E~z)|9*bD@`)%zICG7&2ug-CRzy7CPCSX02Sh zG|P7_#F?ycm2oQ6=PAFXAevLhJqK| zrh4H^70mcSsaI?Zjzrr~wYnusJgV-uHh+%buPVb*xh}{09Fe0L! zfI%gBI(q~y82x|jU1?JrNt*tyUr`o2mehy>e08_RvQ7JHVr=8E@pva_LKIQ~6$q6^ zRRU{l{`=;8WagV$SrYb4Z})E4(QQK=nOS+h=kus%JO5VuC>?%4YVTJz5{OB@p^+R3 zt^r)?d&oSpw2{I&v^N2cm-(kIW?t%kB+0V`sX(W#p5<34Q>#ZJT!h*&h(u0GTm;(* zCZ?y!1;bWk7vN)3caXCa7?vl)1$!pZ4K$q__GI>!SW#M&hfE@m&Kyw`=ZG(_)4fQ1 z&6drbwdjFliVz)b9=Hn+=q@lP)oIyxTm$!30XBIg3ug=I1|q1|tbb6DFrxH9p8s9z*NjyG*F;nP7N^3e}ou#Emc; zYN4etL1XfV_Q%$rqCdQYb@?p$iVm!##AGYCq7QH0!XXAd1o0`)2N0t;(EAWX7d>t2 zQ@d`1d;B%y=y?h{T!|Bz32hcTK1wJHNhp__(>^mJMZ@gs@z`m zGu_*L^RgESWV0wDUv2cLueMD!QuN!ye)Kcu&~tP9@}1SIVEMH210_}@mC8c_ zxFCN<1cm{D4@x!CVIPJw3__B~&Q7qW!~6niIl5Gtjp<=JIZcFiFM?>zF|IQj=UOIwdoaCbx7RMFzQzE;8bekMs_~0N1k_N2MY-tThhmk`}%k+$PEmJ z6o20pt$CbxBTXu(M2i${Y+&}(J`orZ^j0I8qK>SWm{i5toc45pWA-*6#3p2P;7og6 zFcaJaP$!n>G=b#cbV4k~N;exXbenV-*)ioMWF-Z#8P5gtVHhX5SfkuCq~x8ea}80? zu@?vkRU8VtC*BPWtu;~y5qViAIfoNgADpH$NHI~ZXczP08B{|o!;a%jI=A#=kiGq> zW6m|_1#_;6bg?8V#!5}*twfzMz&=(vt`kW1o1P)NnGq38-iOw+b?-AOEEw+##0Nh} zX2Y|rR8`JrX?!s{YzMM`FxUzIIv(f8n->W7vN_6!#isZAnuXupfW-@jUXQU0Sq(UE z9F{%~FEoX?J2a^oG2}8O88FWSM?J(H3JK@PVKyme3xLcZao~vSh;_^}mRFgC&{77J%-GR^1nz{3+DFcT@$ey!(^1D*AoR>{lB{zY-J`s4o4K z4nd%hlSB!f*)SH}$V)masO=iW%IpXFWNGsbbOdMRQKuq57(z&P35)F@iSBLv&dDEhW&MN!~{IGmvNm`xd4QgZCybZYS{FE3Z|Gf8BYD411 zo1#>?x<2;Z^=%A&7kXu+L(ewc6n10vY-MZyZMJ+DQ;+xfO$0nwBGA?s+c9eyxN&n!$|hTTv1( zfZIk78+d58qMr2E6Y=f<76*&%_&ceQeIl0-GVeuRrUOQEJakzMdiahI`M~cBl+OKb zT?tgppEOpjT>=66ng?FyVpZB<=tnmo?p8ddB07X zdaH10KWgYSYy7me@V>jC{_A~^zp@#6)eEqx)Hv}!+hgX$fmaorHRKd z@MiFJugFnrElNua0#o`+qcUqKhov96d#}@B$Rt7Ac<8C%SmOZ=!FU6-p`lp? zB$g!)DwSsd3uAz0D(a=SjRmTE)m+fycnK+9>V8aYwQN1z*w3BK3+ zsM?{##1R-fZ@d~N)g?*W)OtVKj#xHWvKMHnf}|_7-DG*!oQCP-5{=WHPFyBaGT;Q- zHjFjOE_*|Q&n%5osl6F23M1U>k4PLi`)j3$>&EhKbbt5VBpPw~mz`%X8g4A{F3Yw^ z`Hc$HWMOivS?T~Ge?FnJEgb>U1c*AZQxaxKRhzIRr^??1=Myv}aBN7*M@{n;j+0Wx z@@XyEs$B8`?6PMtztkqQ_8Di|HFPvncMFZGh!I#FAF-u{%wD|zI)t?~vQ#zHtGW{! z8=@Ak!XI`D>11l(Fj5$UbY8d8&%A~AW4*rxf{St_A)rM5( zqO|-5&81-R@@?%wn>c4eT%GSHu zs{;F3HW?xuj&Y}G(}|kmxJrFStIV^@0-KezGnl}4-{e+nHcq5b%P~~d7r~JM1!X?{ z4PXj(kX@_D(L0zdJbMaTMTFkHhFRQ@0ixM$N?R<%ct*^QYjOsXiMGhHB@>Or4b902 zqhxKo4snXfd6$_{X8XGW_oXo{Tf2qp(DCdRYtha~Z8Bw6aImNLwN4yUNMluG8=UnJ zHD?s}G||qKff9Dq^pa|C;P#<;6M*{J8w%&A^!D#?# z*x4JwNrijwl20&DA?BS&{c0e;vkg=n!5j#Kxg!-~OFfwfWH0XDeD#SH2;Qu+Z5!TM zu359FRjoc`YA}A~T1h#)vxRa)s;c{{&Fx0(Fl-iCrEJxSjbZ_>R))eBX1gVIghUOl zC=#<(9T@=bx%s?UbiHrI1%dO`J~0$L^2MF-#u27Ry)mblI|N{ zqi^0o!6B={jhI%{K+Lk!Q{d?_4m~|*SpuWgyMZPPScHWgn6+p`{(AB}vj5mY_CfoL zm5}NebT_(<&vruLBca#iU%69RH2|^R{YJ+It<0Z>MKQKh&@4ko5i85- zTVOqyxpf(O=rZT({0{0unfJD~!Zjn4f?xNNitlf2e{J3Bm9MYcF`?eLqMDDaS><4~ zY}T*q9XK1tC_i8pxpl{%MC*_+yH19S0>VsEZ4&Wg@2ZnQ&4Ml`dG|$=jY)YXwGa38 z0Y7mlwFtfzt5sGmFrc?lk=FGypoF&5j>p?wDdEnl67VZJb*`%VSM-N>mM0>>Q65MY zvnP?pRf7Cvi?S4}aRoP2>!DK6?K4I{f7FV4&hwBa-){ak5o|OE8ZPqlbvHU7zN%p| zhrnIbIRkWZQQLw*b$*+yeKr+bHxGkM(OxCusW9)-4W>WP>` zs;6I>noxw@se;8#XQ^7XAh%JI+O_4&#z{54!em|fI=%ir8Y9Gb3;`vGIV|lqAn}m4 z=r6j8k<`vBn`_Cp27);g1vZYNG;xaHA`nECWdgo+ekv}qe+l0s!4(P@mA&;}#55Ea zi-P=IO#<8O0jW{+3q>GND2JW7qdDYU_WNpvHv9&nQFMUkI`}+3p?$RMX3{`fUnzYX z5V)*wUvI8`#_vK1Gj;MzfT_I%_u7rhf_JKGO5bgER6(*RDIG8GmFJXYR^KPVjf2(1 zTLHV`6Und`emfL10dky3~gR>H@=hGLi- zCxN1+NU!QnFQz#_O`<6^p-6hzICM~@THi&CIO^j>>E{4{m=%TELpHbX-nsj;9euN> zTS2hJozk*L#0?b{SA?l>TLm{mXYlk!_`b}iWYZw8tc^A1V802RPzB>8JLY7uM;dU> z6DR(WEZ%IDIRPN^@dCNR(30WsAh*G$6+-3JlTCUYJS_yb1+l;|97UVRyzr=Txw0nd zm-yzIP@f&}9Kc`S_f|QEud1)aRO``)q zL|KmwOE#V#u-9Y?j*DH@_2H=?=R>5^96DKvmQOt~Z0guT#_-1}N!3aSCqi9?i)y7! z)uz4di>gUM7FJ8Z#{R0RKcq%5t{O8MlmzaC2F)W4OokwE0>&&zK}KKF_w&o}sv619 z*YY_R3WNbO#3lDxw~r6uS@)8B+@BxEDa5jasj>yQs;8t}w=j;B@Uyfh2SS8l<3@S+ z$HxsjUz5>j04a?+Qlfp97iz3wT)Ns$oKhSLCx??Kq^r~UKttcUbI(IHi2ZV-RpoZ0 zU=E;eBk0hD{Y2d=(>=z0(ZX^`_|&WB0S?Cfd9I6=fRI#KK|>2d*AuL z{zUk%68RK~%0rl_qZD#yLU*R)xsnN5A@VQ@8cKM0B~f#^;GwUW#*si-VYW1{*YN|+{{8|kP?B-&0s@zH-# zX&Ys<-MfEeFgSNgj&hi#hA78;o<4|^iADZX5BZRtXW8%!3xiDlXov`mBLhKyBq>vM zVvtQjIg)JhjH}8NISHFu7#fFQN(JsG0lOk~%)}gF^+$g_UnnEB50bLy5R*Q!H}sx* z9V5}1x`p549PS;ySInoHx7D}b2rbl<;E10gic=GwBPvy*VGWRw2*okan`@Pl2Wa~@ zo)Zo|e#v$dHMcbN3k8F~Y#@2eH@!4XMk#^Ja3h7=%WZu)C&K2IJbkrm@vC)5#%9KA?jUVB~$vsI6=a*4c2APmqrd;ak@bSXRmRYJXPB2W5k&92=-KkW5GaapHDymH>3AVHW`? zSk;nITBuEE6ibnT6P+Ool_U^KX~tJ4b9D-4Ly~Za#fz|eK5(^b zh;bwvZj=$6ESEsko=xNQVp=X9*Oc7GM4FcD;}*zFm&kY|jI2?s6S+wq+^FB0*evkT zMLn;joh2r5H0RopFi#@MJuOBWE!|wwhkH@$>bUn||HZ~nt&kb_D_*CG(5p5gXtjsM zjPpl-6xM`M-gq^J$S^TM;8$;ks1Js#F^MX$Y92?ewU&8E%_(sD;Uh}tD5F+SHS$hy znq7kZvSzNeML-yo$TPt@S+s}b{7@jMRwgD-uvW`8xu7}Q&E~@AHh95PB7G~GL&AInc+J5VnMXj01UJ? zgzI2&Aw%&@_njOD0p`T(y(aL~_nTOS*f2y9Fh2i3$cK#lC!J&eVF7Tt{C9VI`_4UI z{(JD?JO9t0ivNeEN09x;L^cKtJgDJ7D%i7pSfC`h1H#yJ>>w;KZ{&rA?eJ(#-U`!A z6A@1m=Y60yXJ!|N`GuIZA>`dnVnIZjp+Ou$QfDOxx~7RGMZD+)|m+1)r zIfk}uV$4Y@;qGoN4Gq1bb6S+NURslt{Q?2r?8H}kOvt`D{#T`Ek8`lbQ0zLmleJ*) zmXn{@&ZO8Ol?L2)x0HjNGKHZ0GfmF@;QK3Kgb&?U`Q9@eG`~tpfUH!a{ zZMsN4*^9}i^+>wT*5v3`QIOE^WhS8YnUhYWIWH~Xlqw94aRXQ6XK8ta8xB|I>=# zHteYLF43Be)5I&kDz<4cdK!cJZi{egY5gsKvb}AT!VnZ6a+j zx{L7a41@f4=W1?aq>%UTw zGvI5VkIUHfZlJP$^g>DZW%~wSqg10ntE^vdO!S&ECI1QFE957GV^|j=I!RnUv^*u> zn(6k07Q4QQDu#SDaJ%MJ2ra396Yd^bjD3rVC|?O;CAvU|^6@$dL;-_DCUvuD;91`9 z-IXFbb)YjX{kPd|2AB5+z68z7lJW*ubF2Y9)t=&L2Wq*+gcRna@8Gf?I0=x> z7J`5hZ7O?3@a+>fu+7Vnu~WRd>o^5Dgkrqwbfcczx#|M%J{}u*D2XkY*Lj{Uq}?Q4 ze1Uj|`EfqXr#-bo3&h}kUoOV!CPaRK6!2Qm6<3QqP=y@Qm}qraUBNJ%foi#Ws!-D8 zKwTRQ>Z8XEGaxyNFx;fb5s@%Qpg}%iq6@WuWFTh3qW-pE6;HhI9bOnCN~0y_%xCTT z@6j=Vp{z0%f~__^b7sh!PGC^ao+0Z|8#n(A^HxW`CIf_Q!SJ*#z_zC0<6Z>%86=|% zM5{n?ydaLT1rc_I@GGI^kG=ET1)diD^;xtgx?U9|adV*KYIo`0`f8lxU?@}#__6zC zD|)~By%MBAi&U@Ym=>DM%lIRg0OM*b%%&33kJJl!Zoqb?m_rSK=Rp8W%rp4 zH~qvL;qYBPF`4>1Vz5yswN;;DMRuxGw95VPYyn}ynJj)5bqr6e#>ld(quP8Vh6+dp zw{M$9$=lGHY6mP6D^}qqE$^Bz#*>+MC>2ER3=O7+R=OfElA-)qcgoRBr48mRJ1HBr z4-od|G~O!)e;t9?>402;x9GB7cV2|l3{fRYJA=}?&Mv*+*L#ZyT8Y*O&LMni*e z2#mck>7h&Vikd5Pjim^uh0uo&VL6$-(%sNa)VZ@Mo2~k$TQG|%I=o0m~YkAaU-t1UCjJsaP9eq3^sGmcP`Cu)2v~NJphW7 z07X6`bf3s@1-4#`28qZQ`w($=6Z`8agZ#^3RLuaU40P?_!!QETXX;%~In$3z(ccK( zO1-AK%ltiwOV{a;&?+|PM!coC-vSVW--o9))VQ6POc=VexW2R@`*PP!0h2+* zNV>98kejhYUjm6zwOo@qWtwlvTv@((>!B~%`o-e35wQEte#RB}t|}5P3v*@T!_H7z zQkheFbqNaA38w+VGmN7VbiziKX4V`7QHaN;_Khu)bV|Oq*N})*0R5-_U20q9^!# zOc7CgUcxCIf|C=`Q<9Yi@P6IUVEy>lfDZ= zZ=9zp9Bd0{iZZVpAMWhjaHLVt7_4whyb6jjb)j>GWDi#Grg+Y>MM6NIt3S2Yz72eL zQm10phS^9{89`n*qI9`#|ChT$m3;~0z2_EROMWk~IC)>Llcs8k(gXw7Df&*awf6F5 zuBQy<10o)GWNns=+u|+3)gfhQLeK%Us8MsSYf2DeVY!F4zt3BdBR-0Sl>*gp8W|$# zc!~^vDHW)y(I&1#e4L)b`Em|5S?}wHY-+Ok`T^C3_-XTNUN%VamdxqT5UpOVrWh>> zWXt<_hk|PFKY3F^GrQYSVTz#6DsE0&1`Le2Zp#Qja-_2uD!Y;5$_gfhRX6QiNmIY? zvtf}lXrHUsGl(30Tyl5Mc@Q%-MJb2yYZoY8VH~CIoD}JUcv^c!QOY(XrOr_iKtG2mZoBxtM+A1Q2=&#ehy4G^wg_s-t zeQ%MI9+vCTGEj;-jLK^LEtBfnkb>`9ujpFHuFWNtL)LR1FHI;n zw#fT)C*_kwn)B4*WI3(XkSCV5Tu~a^&93Rd$iEz3S3f63{^syg& z&=_E#gWr5*XZazd3TqYzVv;i+_YC}Z=8_env^Dr-M3yw^@1F{-KW~3GWT>}Dq)k0! zKwKFX(%tsuv;aK%iaJaDg$Ld^PS4i*MpFx5wEuFU0NRzRkGoZDqC)*FVZ0~n6M+UL z%Tp2BX`WKn1dYW+aEz@F9~BGgn;(&}SK00Mo|wwio@t)NBI)|r-OJT7!J8%ll7qki+&BW&^w2dz13&c*DFs^)a~>B>|;#JbO~Wj zMB$k#$pu@t_VFG|)mljM4*-7W$3dM?kOF0W!6r?`Dqc3+<{M3lBZWrouqMi%r9UA-` z+Dh}P?*;8nC4qM-iCx-!$Ja?w(gjW!FOq;&(jRGg-YNA8Y5X%#cN-~rbJpD$i*&nw zoVmWQmehJoCC&tg-S)|wd^%fS1+)->fp^AO3?!3CU!+QV6_8tmVd2j=F6hC&5I~(dX(o1XE>dZ%_B*eo&s)A=L{)>hxQal`-V!?{* z^}n;3G}gv*M?i}0cfb3B#JJ&DfMKTn3FhfedC+2&ba&H$kz zE$vBS9Vq2q2Ar&#v_;1%9bJ)HJ13a;nmIidixp$Co0?No6ZK@*rF9lM`oc5RSN)YE zFt@IX!0hAR0G(9|K|t+J-d!U_jtYjJp5Dg^Q`{-D(rn;w=66c05Y?X#7lN136V(-C zB#s|CHR)g6JDKX1ZZ3Afk(Z6JCB+|(6vXd>zg!&NMr9FHUtyf&bm}hjLVOF0H?s3w3y?l;6>+KS6R^P)WYMzM*VL~u{`xW-4O7|NiulV{bWLIU) z*0V~BLi)f{g<{Mw&{4j(PHxcS#je!5i&(#yl)ysI9ZXn=30k;WutPno*w`3~l$=h! zNp|M`h@@e{-~b~xQ}}j&skq9NNvUUr(2;{{a=jC>VVX$J>^ol2>hxnVRa87&tgTYi zrzot?D7?dO@7!id$kP0qPDR$b=uHAUrDoOpG7C95yV(2z2frDK*eaLM{A`-mnB?wa zo!w8^#Qi?x<3vS9?&Sn#I9WH0>5ad@O5{Nc4{Lak-R|2wYJzenO@RbXSb>ib-ElMSCgGhxSDh(3Urjw0l{+`tgKzy=9)sx&2fLltnt;U zzNL}8Nz57{Z-MQ9 z*4D!7?Uzf{6qm~|q^=qwX;|hsm*z8cpR#4-gx?uxFqBkx7{xQ{s;Rsy%xs}OHpwIK zkX#OExU*|M3KVE3Jr0J+M###D`>zE5QkB#)1!WH8cJ$DQ98Qr<4bbglqGd%)OofG? zJFk-CGpcGyiE_`7H8A!qVg;486zc-^nh%AC6n7CVba!4}sD_y-9jk5T z6_Jy1q&Jo$3Q7HD|IdHjirex>NS`QgVg40@ zpsA06w(o?Faq#Gxy#R#yi~-;apMtS5$Y(DN2TR6tN>j3(x;(;MQ)_^B=^ieke4V?l zyVu;BunW;FaNOv`g`%ZM-)1tT*r6f2tS{^=RVtu~Hn6Nn9CaTtwn53|lsmk+alF<8 zR0uUF;DV8URLV28m-LVP)z)KyFm!Q-b|N7sy#aW<^;UnBSySgZa{wPxwLRro2R7o# zPNrvS$L56ih(t5onL>KcFv4wM z4)4s~jR7LpHag7)yTK14?+C)|I7(>j8G>%2$2i{PGDvg;_~{90bJA4kbOHn$dY!#O z-i{X@;ge5Q?%@TZ<1oe1xTGONcMlrToiK=|?BCp$K!D{T#Xt!XMEg z7Vfgh1&cJ0O7cNpVq5LY;jK^`xV!lmMIC8w@^2=4q$K5}$>6{LY761+f%v3NW)dG)gULI$x9AqJ#EU+BTQE_=F3sK-U#;Wzxivep%Jv(}n6}D`@D5+G#sUkls ziF{jZ3`4E+aE1dioDt|PtpwaEQ(p0bxy_$0$`KJ|Sp+6THL@RX8>9ND%OBbsumZ(v zO4^LrlgI^wD~p?2o~+6hA)isziTAG%Z2kN8hBJOCrG@ALcmg?_P3~LE6s@=;Tlcd1 zkiAR&`hdWnz{sM~y0GErvgrVG4%svsr-e4Q2TNcX67KL&3Hq}rI_zY0k?y5>3O4^^ zcbJtDR!~`4nqLDa?Iwh!kd736k{~4YJa(8;A*@Wc0g#r(?fQK&5ts@)B#L3{8N#aw zj1w5aryzyitNfzWWfHA&9W0{lVAN4_i>KXK2mw+}^oC6^!?IKzYWLomx>OE#<&;J@ z1}(RO<>mae(su2B%rw(eh^`x!wbU~L8?`qRR^`Xn#pEN<6V9&HW1VmfsXy|Fv=Ph27$s#@G6>|`Ju=h-wZQvn7@ zXuQ9FPgqj-6-z6NS&sh_^t#Em^(6m?5APzUO|M!Ul3M+G<&i0}pqT+@{n?O89B1x( zD88VPYCOf}ZQ#?DLW_Ko}Ff)sU% zZ}4|@&ug{o)12GgaCZCHt8H&@`}SB3^yC&W?X!B_xb?il&m6I0Q_;wToI6 zzcNx*oC!`(!XnLjOth04DJBfbaOnR_b3fwqS3H6PsJtIvHg(hM!VJg0MP0$}R8aaA zI3!K2^RUgwCu+QZR-%_h(iTx!CrGJHrHl@ zVV&}@mwII}!^TX9xJA@A?^*$O4`bJotH}Gaz())K0Eq+wPDb4W0lPSW|CeBCXKnex z&BM`+%g5Xi!e#6GZ;*oL2?PWL0RO;G@INt+fFK`$hmTK)9}MOf`Ujm?K!}$QK+p4U z;N@So^l)=GcYR{X%g)*w@-NhXPW*55|Ca5a!u@mQfAk0xg$W3{9wSBtTE~k!0eLV# zU1u_qD_L9e#8nzzX9LbBOI4Cfi@Epalrfp9{ZGVQT9>&_oU5h&1hkk)o|~H!KyPn4 zOe1)w*>~rsJb%Xfhm2<>0uocPGsTyso-)0|Kt1T+#nc5)QZEtJrgXo9J}yIp^qp(n z_ChTeduL^qV78G1M)uI@Z`}n{x}-|L90~g#$(;OkHI6GKM`u|Kk#Id64-`(dbMf+d z5nVR3AMpa81z2!S(k41FjN#|qf`c`n>nav%{;H1|izy_`2!P(0zC%LCeH1wF@c literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/cache/rack-3.2.0.gem b/vendor/bundle/ruby/3.2.0/cache/rack-3.2.0.gem new file mode 100644 index 0000000000000000000000000000000000000000..2f3af2a12a8825ca3df62c6f8ad6bc81ff0dc130 GIT binary patch literal 117248 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

CNAVc07|a|V1>?& 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/cache/rack-test-2.2.0.gem b/vendor/bundle/ruby/3.2.0/cache/rack-test-2.2.0.gem new file mode 100644 index 0000000000000000000000000000000000000000..b0b9c9d82020472bf6f93c89eeeb487e9dc26262 GIT binary patch literal 20992 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 K1OL4q`2PUXs%Xmq literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/cache/rdoc-6.14.2.gem b/vendor/bundle/ruby/3.2.0/cache/rdoc-6.14.2.gem new file mode 100644 index 0000000000000000000000000000000000000000..7d4e3990016eabce9c1603fed2f80dd1cec9627d GIT binary patch literal 671744 zcmeFXQ*bU!5U?5Bwrx8(v2EM7ZQHhOCvS`s+qRvYXusXP__zMO*sI0GcGXnRRM&KM zPfgW4(=&Evu12Otu0{+N-a!9%3DbYV#>NKpzv}`bi8>>OJ5rsWCYOCcUo;AL2s4zuw&=;%?N@_UXRZVr;3OYL9oT7?#R$4}QFq7UDNF3cXU#hkI!ayP>kLHr7pL~V3v>`oWR1QzIG6x0y#V8@>^ z4r`R5ts9@KO!)-L!0*vqgMw+vGakxTS~(DY^UTRts3ud}GzHAGvyw+MDl8o0>*E!j z-CrI$N)RRPW)Ee&Rcvs|WKU)1OgbZ|K<%Kt4Y5uM1H`%8)<=dn4&G8WY9_C}_;O~x ze@)x}MFk`{R|=jIu|f!Z*;C>*u%)jf$_=QQXQgQ_-glYffJttx`C-~%rExAdF;Hgh z4^aO3ejmZqb+U!aE{I6-Ofr;Fw9P;dXIpD)l?8&Kfyd!e3^@cpfml6~;1GUK5dN8x zhsgU`)AMEGeGhPJgyn)vu~OG!e1~;oh*t||uIZf}9I4Q_n=_$#;!+Xb--EV5F(wP% z9Npg_9!tYFFf5y$TCq+}!=+%=H-T@WC-%R5KdSP0Rc)zgQj5lQ&o+}E$i*g$ zEu*zpD^0tvCxA>5C89dAXFugx>C894rOI8X5e+5{4+)7gkpFziV0@-9f{7`Uy0KZa zK$SO3qEcXY&01JqTnkf?Z|sJmCas~D^J=;0$2=qq4+OvXx8z9xC@voXm;$sgD!*oLpWH_msBzeqK!;JHB3jfMK7VNP9Xfh>afbuW)vCr$kMx39l8=_NkcHE>5dG zd>!vBe25%e-%LhKr>H#~9-qH|ce}2>_x|(zYD)TM49?{m%NO{WxCgbU${_E2UMsT- z?}4^D{bgb)%T;0xm(k6~t}xfNk^fJE-x<%+F30Bcd*bV83=a_AUa zHUze~jw~-&F{z`GHoLwZ>wse_4q`aB{}TtYv5*nG)6%3a^;d{$kGr;RbC%g^!&7va zD9UMFt4Iy~z!BD0v%-b}Z`@9X8JwlFhR$(1X~W%=N|{@{m421Fs?~PjPeGU|cohyMT&Dpo*vRcnaE7$` z9L_FmlkuF6-by@01c@#$glb#!{fNNAA?T(Kf%`c_%;s1?irhxz-;%_!o^eY-IkU`mrJ|@U%WWroqB5;p#jay-2ajAZ$11sMbg~KMan>Uh!|MR)n-u zwQY8v{??|THM>`d?^m4=c*bam{x9{+Q)%*Ozq)n}Z?MnOPkEL3hFm2+U|2rUNe@hm z_(nU~83)73WVhCcB(rvg)2GTa5!Is!)i_+@m1r28f&12r0)@3s7<5AMs3%#A=;!`Xj^I|)ei{k0mqAnV`F59R@b4l>hB|yu zd68dSS0kI9anry{9J8E0fjdBgL1YWlGw#}Y~$~(y4k55m>e4}uHS|WTgHAiUNCaykWR;v^F-!%DK zbP%mfg5`d7#xRqN4Vi)vIsVJx%D<2t<6)`gs)T=V%p2^iM{#ojrqFcO6l%RR7Lfx=K%3d zo@Jb4Hhd)ijicK0Fev_Vahka}Qo)~>LmtA!9)Or|OQ#9aZkLd*75t}I=zB$l|2ETG z{6fOZHCY~$+pe>oLxlVM3C5HuVuZj1WS%`hN1ykp(Z#50gKh1){VE$?nNb+Mt?VLt zrv=e~zWe5c6-k zTQ<`QUzSsP5ZerGflo!;b_y&(OqGw2eiu=j`H}tM`g;uKp#eF^vd)Ywv_sco08!-5 z=F)4_w&>4A>j@R+L&~J6B1M5MKWe)JqB!Nzd<7&F@Ig?=9w^ z2!F)nv}rqbDB)B9e`3h+@jcPzmownMV`nEY-(;kLHS$M6TjOA>p{lkER7T=?JE?>_?ie~bTE*jU&(Sy=v0{P!Ow{{Q^<|G+NzAN+US zH|>mT)y}YL!Y9VD;wPC76bW=^SyfFHovc~5g;7;qucwzIO@u0lftq#Rn;87Bb=V(7 zVx4vFbx=eB&pmWl;I(x4NuXh$@}c`D158rwh5l6_qM9lSjOF)ppngyL>iwnWsiPuc zFR!5AdzHS}_c>p z0r6cWLrrr~vA)77clU9-qTfOOc5kvk0+8}fBmd;33s#|}cC5r-oy=#`Hv4Fpv<7g? zR1->rToY3s6~dA|q+=MOVcZ08eE<={T}kmy#1J)=@8aC?64TsR?GiRR8LSDc zaKeZZE2jA2YKBAmnwN8>`_BB-y48!!^rCEv4f5|1xyjyfspuGG@{(yR@xhy4V(Mug z1|2ozq480|fdciFUOYZerXcpJh#e&XAI0V2QP5ro#P65}w0rp9 z4#X|nD?cm!SR@4I*j${j5G5zv_bo2!eGaury3-WPg2+c({98smNdC(&x^~v=vBq-O zuLAOwCvPmgxcAxFVX3buUZls8Kl_{M%(X}_G!f)~F#u-i1{MG=S>?`rGn$Si5irIe<~2 zf53HOEE`5}u;?bJ*o#DX`0PvJ4&uao>(bRP$$OQLgLJ=Ynq*#jC{i&oERy&4NB$$C znVG5tWoEM`P~whl&2Nq#+Dlw{30G)3F^6pR=gNTR){Dqn?@84wt?Z=_%eKFEF^5jc z_K6LKyOCPC@O%lv&>IQf z@v6q)v}?}*kL5XTrFQUHQUK;jH>qSLBE~10sdjJpbV+zM%|ML`;v}`NHuzF+@m~z& zxKHw4EaaPs80`C@!Y1!lDrd}hWUl72ykKr!N-9Fd-=tX(p0OMEeAD;~JT5CO0$^xs zbzvPdcsoFk%08u_h#_v_funNh6ZKbYMx7`IT=N2wIQ00RA4On2ybW5q-jsOSdp)#) z>wH4)9MM>M*K+aeX*_a*R_-A2LLN{QVET;|;b&L%3N_*8FgpaTr~xpq{YQURh9?C2 zGpBsO^S$szakt%k6cJ09!(`YI;rJub%ySh!-Xu)i(N*^JFML>E=m2sF_w;6BxENvi*t{6I{5>yH2BI2gz$+^rij{Gq`Wm1CI~me7Ff;1b`!vD{fiaVcKWdM^VSnkDB{ zG<_19F&S8ka;bet`s78BdoN0Qye!~4hisL-vNqL_R;LKW8e|9b2Eu z_Jtd!chfN8k+kP23jSs%A*cNv+7gYlz9rIWlA7L;h8#@v-AD~mqom@%OSWyt9xFfx zbgX$19vH2%A;5ovEs_|J>9%;-;<^j z=erHY)c6MyCGJ{0$s8^j=85r|2IHreuvP;R^U0@)Rvz#rv~kB-3M@{2($8oUJ;Z8# zqH(QPPa`*%fsdkD%B*AT&!siR1DioG?;Q2XLT1YRKaiFfZx_Zfm%qXBqL7tC8IT=LOziH$0Q>7! zx0+?`CWjfKo$+^joCQM(kK8kM$noO9jmn98Q3(UHk*Jmfvx7z&Da!PqrDqg$A4%mh zaXXAgcyFM^C6d}bbuK3`;CQcGB<|I@!vi?G-6}SMYE7g{9ZqAbRKkn$NWHW+=avA< zamyde;zLrsrtsrACQ+JpZjxg1snt22l9cAD1(m3!|`Q~ zXmh69@(J0x$YoiZzz7mheyBEVB$w`?bvR7=_uOI%W%;8CRMW7FjM}Hc3@XS%WFrW) zeso}DStlwnK8Q4k*A#EKB{DiQBAUvUFSod81qhiDpB^C*c+5rxA}!<%NFx|>21DOL z7nu2Uj)NJJ21*sJER)<@ne0pcUX)5VKFzObi6}NVF zG2}q&O?4~%f-U9jM+EK`2g`(8lrr0%X}xs&!%<<5M%WQTSh>bVh9pPi&tcMDeDgz2 zi8^Z9q~%e%6`Mn&nu{-MY~y20vFqB3B8_JD^VmKnK=_tKS+Q+3xC?yK3Y8S+V3G}$ zj2G`sk{R%B=~#O$sv5Pv)26sk2?d_$7oat9T%KiiMUSz}A^W;`d)|`;ejnKh_CM8I z3hDihE8Uk#5=&~y;F;J`9IT^ETz*&@VgQ3|tIE=0J>t^Hc45D4H6E1*>t0FNe4Wx0 zg0tpstHs0RN`dLtCRR|=&zu)fX0TS-anqIuHdPU$uU^Asvq3WiM`dK;W8Fo!8JF(# z(}=f}&?d9g zn51g<4kT)ooO+RnIcdn83jHm>LQRXxF|lQ(Y~l#w@PZjPqEK}XMT!;7FX_QaL|2(o zQij>MBrI~kwla=p^sc~IoUjiFPeSKWJ8`NNR5o;-t=vx>Q54@RdOJ<2R-W&+(l8lz z_m(Za$f;yZq6N`RQk;3_Dbqbei?^19k-YnOl63NU@KBkely$5+kUOwO`IdG58YY|e zI8lVldFla|etzUEQkZY(cxATIPNI z*0){HSatpOHRY_D1pc66&&WKC+FD|Kp`uxpNF(!vGZ!^zf8r@DS75td@~fbz1!EV?>4ggXXj)L;&Y|1g_96V)NKZmXvjy$_nN+v~p-YQ=3t`jal_ zBw=^fVp(JUa+%tt-rd!hN}u(i2A&BY(!wkw;5}lq-~H*HB7ex30@J1q3m%`=85(4y z8t3(92h5?c({$BSNSKq}xxVzuPD<3oc^zLiEm~tWNQ$`Zm*i3a2_hry1ovvQD{VyT z1EAA0@K8!XIVL0FuU%)m>F&l4bE@RP21NSdCUx zN5Tm7wxk7%Wb0Z`aUx1V6b>a$r6RH^EK_7jhrxi4%fs`_R))lx<$6Af1zshh(TU4m z3;T7%eiCQeD&y_Xm(PdG*Njxfz{=LG?Tg3Tk33M}*25p2EuSs9uesOTpCA06Gs2Kx z;`Wt0dykG-c(B$A|NE_$mi^;lz8O?-sdu(H?*buEB8k8~C_hnp;sap(?nr1l5a&0% z4M@L%rJdm4eHk#|mmYo&#bs&^ep!=KQMS~~h+^rCujpI?vV_FSAF4S<)Kf@|5=a${A-wgxz*n4{lxV}k01aW*wlm_khuM_r0;A%+(umW z*W9`;-mx5p6ANDj$fr0pB7Z$<;C3G8=(Vm{tb{*-Haf5v+Sfio@fiDQ@4@A&r$heI zN0Phnd;Zke@Y#AjXy9HcIj@-E>PL_tzRcL?70ua^7Bb@Maqc?6>FxSJF*e6OTGlQ6 zo*@zrW)$??d@)C=a2Q4kU~v3_gqAjU+S7W+)%e%1Wra^)ErVtojd5;Z;%utpS+^2%zgr6Sdot?Fmrwa@S4-k~<{M!&5A$VGE zvBXHps%awH=2tIgNhy`B3L6{^cf=(^M{cFq8b{<8M1Vk>8;gonz!=;1gY5haeRT?x zaxq&R(D}7?_wttWe)pZn`*BD3c&1N8IY?A?{4Ne()}hK8uMIZ;YE86d)+ULc!o>~P zzinO5MW)`KE^b0;hU8b9s7m5)ByMde%F+}Uul_U12&O**3Fn^4gj8&qabKcT|Bzu~ z;||LKmnq%HnR7pa8WL-|jPCo~9eG}Tb$2JY?DR(n7zN&{@*%}G zK4!faJ>Tn2|DJ8G1}>4|61I)ceuCual=}%NA}<|;NpAG{~05j0NhM+ z2s2w=y)9%e>ME~GWT`8(wQ)iCZ$0^A(XyD3J)}3Ld8h~$Q#~*8-@w1p580NI)Nw)y zgMG2o2F!ff5DiNv+wFU6y~>*c1RaSUsr|;bXubDd_jO0w;^Uy8jZ<7A>&jmE<1Tq3 z7;9?C<$!U%kTTCSgAVvmH=GK~^x)HaXm(hO48=DsKAlE*T&Ib1uE3M3bturi;o*1g zS6G&RYP$Xa_ljy5iHv!y3xtna`C&MSPj25wFGq;Qhhls_=$b~{T!<7N@d7ZAh&D5p z#1BXHcJ@R9GV_JM( z)p-+ilT6@=Gt-^Y)mM)Y@W|m4OktRb;B2VmNKBOJ{&tv16Xe_uynPf!%f+D=z=XTgdEd}Fbc#tY3;k1n=6m14}d_& zw$u2`l&nMT=}}q~1;0W{;+$h2k~#i?UbJcD7cmcB*R{##!bsx#B|^oBt1=IbrE~Bd zTY4#Wp;L!pAhpRA<_Ve|JKb+EDU{4vN-zjYhQiBE!D=WnV2~Xrf7)}1o+E7jQCvg< zLxfIJLl_utnq>3zuPTY4+VjshrRFH&UuoyQEdRRH)geoAis9NmR1DDu|F%H zqBS3c+8=-J#O*Z+=a;*a-j@H~p0dByizQ-Gp9LmI+R`m6uJ`jbet$G>zmNC3%5*Ad zn$*Ot4%M)nQ20sSxFCoD!#)e@RajPrt6@kqiX?xB2~a`0rM8Vw1=6Jem`|65nj4C) zElVl^PX@xDB1Hv@l$h|SLa{&5|Dk9a;laCQt0xnMM*{_siW9mbgSSjQZ40yxs4bED zn+4q;rxTF0am72tgfPulSHl%{kXyV1>sJ?QIwS5D6xqrb7X*RsxVSXR7?Kfo3#1rmny3VUhrm2nfjR{bqodG|bU~NRUtEAK`sfvY{yVmi2}wx6}m%a zHhFX7LqGygqbv>?Gp_j;p z#UNX^?(eul_pm6O<{gKG$muut@IE)Z_Ul*~l|vyC{lkx+k%U*?J@zijg|Hl>Bn%dM zEOB8k@PI;#-Ltj_yPWhwO3EnVi&5tTi+N*6AySr03Q}kzuZ1-b{KqOX83=`C{p=p} z%^tccx~<6tjlLbkG-76jCv-17F1Qy(m8?4B6pEERo5CDYsMYEIeF|!?f%5Qz9UKW= za^oxcz`%KXtgt=4_1Z}8vwr2BW0|qDmpf+CVRyLaiK$^{V!{@1B5zE2a9Q^yrAJ_3r+95i8Mr{Ox8|r9I2nD~7nJIRCg3(>$@A8B8!T&Qz&0*Yo0qE7cHU{@}h_N;`l8 zk0h8DK%4oO0o@H3*oy}035Z*|Xa(&%a4}FeW5FKHt(KZMSPwU=B*>p@{&v7e;mk#Q zdUS8*?M>>}U|?XNuWx50;O^%2_AB5Q>$e~msC%SmN8f|i6Y06b`!lc3zhWSy`QgYr zxQoD~_qhOEf%(d0jQg8x5823ti3&zlymKcT2fp&5qfnW|IJiZq-{))Rit{Xi=dN3H zVXqhd_QuwMxcZh4GS4Af_Y`npnJr4}{>d__I6EDf8fP4TH~K@Jn&09;e0WDZX38>g z>v9aLXXTEV!`}^7$Kna?+895?(B}`a)*;w9>ZWO0ngK!|*`WAVis@m=*YIf6H^>a$ zFf@&{cXG0^c(QTz?44Jqhhy=6RP97y!T>5;VSG5Q6=b?jX8s1Ce(r{xmhnwak}|~# z&Yz2FgL;)?Hb|w5M@1nP`>g)U3PS`tj~zv9r`G`;P95c$L0+{G&pqFtTY|`<>}<(? zpt8B+vlS81s=_o+X#^qd<>-!XVHUOe$AU2&lWf5p6K$el;tmabXTNhAx6f~W*nGC! z>z*$(3_OhOE*q4c?okFpVhrs|O~&-0@8(8NK$V;VMvTa(82)xa9>0v~%>fx#B#yrb zEzHud${8U6W~wHNsPVej{bGmp`C6Q-0?p%njMRf?IFu<_G%%#<5b=pgN$3GTNk$2oD zq>X z$^=ZyTIvfyf~rz!c4(SDPwblVo(|GfaP*g5Y~jSjwg+0q#A)F4IqPzFdcw3 zQj%CAnS1P(%~B_qa8Zsx_qp5m> zy1h7=kaBj4&<;ZS2 zykj79lV%V`j@fRs4@aYJr}odU-=AASgA3Tg2R+`yh@Bew@k;9ngY;#wjWAOAf+wYK z!54CDO{KH8P4jRX##xB8F&?mdOdA6Pb&VK*%X;M!^+VvPx0%`n-CN9p;lA zuc`I?687_6`jq!7JLP0o_b>Gdh1*_IKzzHtHiUs!5I&))QB*=3vGpS#o4PN{%>PJz zxj&iT zC=GJ?c)f)vfC73DJ93?jj3a#EYDwd(m-jsW?5zw-6f6Ok@ahIVyIt5n#G94!@fUEt zB3jbN4+T35CD*1}EU$5&5Ov@dYNhmSwwpQ0brlOF8v|E-#3b(auQ4<4 zuB*9TGU*%4Y=Cg>Yk_HZ5bwxB)krHXP=DWvc6y6^#4CA8<#tUfE?TlI=5vJ;h=L`a zO+EAL3{=Zz;ur%1XKaY>(l9_+a&+~Q%b3u6a}3T3JzIW`e$)E2?Eg$wO-n}019I6m zh;pU(x+W)5y1OsxjzNmY+gkwNxPfvRa4Y6rkTa+!3hc`L8B&qiH>)?G)ZlJLi=FM(g zzA>R{-@9Sy;p%%roc#%gO&mqBwowLCg3D^Jo33;vW{^18enihh*-=9I1LyZ*smaIv z!PMa;EE8Nn6hp!f5yM|e(|Z@6!(gK&Kdk%mm~TD7TSyQSH<2N_J5!Qaav)SN?)Upp zaG5EG(RWKwdH5HrQvl@4&7pwvcp6UAK6BQ1NoDSNS*I%IX}hr*k`gIQ27WP@PPZ1D z&kNIJQRd>gu`Y`A%Vf6$T$si3>KD}KAN3U-rID_X^#>5SWM;@X5r#px4Sx)Bn|KLz zF@nUi(R8M}xPKe3-tVy{$PhQ7yfSXc_GjStH2@Bb+r!Uq zr|vK34qbh>6a}MUKVt(T+v^JT*-a?Amx_fGFIN~ljLzSNir94KU2IfPy{C`gQj`W& zv6^MyUlH7&fMo;%fzqePkF#uXSFewbe>LlhIh=gw_>1v-h2h*Z1=hE{vzW-0>R~XR z*<1}1OUlkjyxHI}R=WfrC{}m(_p89JJl2aRyh`#WZ1J1QlH#Ff&QRK`RA_3^5QZwf zymqykbqX|A@FC>-q^L8~N^jXdj$JRi{kLK&{pKnlSrx0qekr*-QUEC) zOl72HM3)60i~GmutOfCb$fNz5MyBuTJkfs=Hc}V{h&#xJ04%hm4PcvC3i&jACmCKd z&*Y|@^q3V((K_d-Y|ZQZ>5%RI(bLD|^gob?pU1~JDVPm=xxM@;hw@&I*QpMy801x? zqvVJz>Ny|c&h<(Q>5j>ZH#MN!<2h6QsyRoM5>c9{Uywfjp-0BDMfpeD7L~iXQ?`iYkD0WGdvG7Yi-K* zsn*`sv7AdROy0v<#0WvSo7kybSkm<-Js0@bRbRI<7Baa5Rqi9H>p#=yFyF!_sV9P@ zM!p+_H{vChbiE0+dr8#nfg1HolaC0|0Pq?Np)=nPyp(Iiy6~f~qoEX8>bgof%u)+Q zEEZ%S>E@sdGA&)^zg-<}s4qx9fiV8+M4~-Fo4g0Jv!^JDRQXbqzcEQZ+m)9Iuv^4Y z(GJ64qUZZpTykQ$l*Y4*Wiax#I~wn3%nl&Y(p4l&hee*G%nm3o{~mWXo=BTIt-_GF zsv==QNrp`?Vya{k;1t87=@NTlm79~HDf^YZLr)4)1snXD!cCs);J<$`rp*gGz$E}O z1YkkMNjj+auJM+b`Na5Ip#DU-nz(ZLy$EHh@j1&@6L^e2g6ZR-R~LcRDdm|>YINC6 zdMQ6NVgoj0kmp0@H6tG>>>aI>y>cL+t$oh6qki&i{zX~7w>`ne0UMW_=2`i0f{@=o z44>RW+AzCjVkF5#aG})XTgT>7THWdfZ4E!6@|vh!O{Ay)giA)XDebv*2qd0N(pQbA zwp&CXJS_VA@^av{)j{8dt@9J9Ri}uhLD&+HHSfhh$+jSTbaVzV=;QCI`49Tk`tZ#F zK<7j!Hf~^E&?7;F++kx_2VqV{xAa@*?Htm1Jn*&@i>+15wQ=ODH<)^3lgE zp83OJvr|Ub3{YiUiiR2XO(OM9C8?*R80pG1Q2e>A5`$@%Y|qQgSq=Yu zHBTf&_)z@M9MAE@{F;a5MyFp&P&Ap&>ghS z8aG%*mm&uUaS(C}H5g?_xW>+=Xx&4gB27V)q`*D_yXc?$)hKfjz^s6t%vLQW&b$?V zV@5|*nEm0H99fPa>X$r&vvkY|T~rZq1kihej1N)U+$l9TQ3VDNZrBxme$&(ofx%i# zO2p<8PZ`UPhs+Pu%O;RfiXen^}j3Kz^&GfKy( zCMiEE(Rel zgkyjS5|jkAd6$-*3A#<14kg?SZ0lW_5)1SqR&_*!6V^suNawXUseC7FHt2Qrvs!xj z>8xNj(zC2`Geef?bp&V|q|XmLO5jMzVt!3D{JHK8>RkB0ZpE7LJ^xd=#^ zpcZ3KYTU6VgE@Tr`f(Yu%Urc+iAuoA65D$%tM~@&+Qo4`uBCfp(EMQA{?&^%e85JN zHHW4S31FGk>SJ=FHg<=Cn>wa~Fx+C0{OYNc281KfNL|yIYg7*($U7$~X;(}L0 z3u#Kb-r-OM;>q?ZM03gX?8SyKic)1_(c$fa#Rmuu2O1Bac)5Tk?6FbNQQYiG5X@*M zYHBHKSuXo$d*@3Hn3rP^2z0ABU;iV-%&c6J^+pYE1sEGedl%|tqBKxL%~`jYz!Tqn z*s;gGyDPGKO*s<}VF^ZN1o-nf)#!PJr>-l-w?4V zlR)m6bm4&$!udm&<$4nr} zRa$s^NbXJ;^WzLDy25hi7B++hG0eFkC29(9Jl?4cQT-nD)xGms61duHjB>K3y!9VI zvTtWKDNV6f=$brLvrfbyu1hj@^2F!X-lkUilh$N;rb2WI8XHSmlBJ>^rio4y$`rZX z4B4yN{L5UTWcT^c>LZD|1!IV#Sr|4wk+rA*EhAwLiOak+nnx^dacgrm7A`JG1+{Gn z#d)~@AO$S#!verRM69fU6185E<{I!$2?kZ~rDpdMg+f|!Ags8 z0G^tXexPe3pG$=8M3>|VJn!VqGjkVn(uZL|?iBrEJQFF)DVwyYIyANM-z(TUs}^Bq zpe1w(hE$brGZ(+wsr@U&(f0cAzROh!xwCSM`0t(3gE_MW@vn z^()P_z+@83g=+r}iG#`nTv!VP2*t(3!aZMnxYuza?@;tU-hfSRK^!V8c;)&mDT!es zgf?cbcGZW!9OKTEW&?3qPF4hr(Sj9?XX`F zwoj=OTToz`5Q?t?4ebopPNCh2stKC5)W&tRs)#e`y=Rn7#Y4tB;p>TkWI){jD?aLa2kW@7PU zI`WSnk}&d6^04aSUvjUIPDjhuGg8SQg6OeBqF_o@>6ch6J}bk?qi(c0NAcXoosQS~ zMk2kkw5QS%EZ-b2sJ^M?$ei=grfK&bWh%5e;)G!5Om~@=4!!f?=+MKdBa@>0toYR< zn46st^!aI`9h>-Yhj))%x0iZE-NZ}+niijhrzMsSBZK4Wq30GQyZzV{N z;2W)8yPc1j*xcY_p`bp4XB1Z8gxIdKlTTH~lj~t0rWas$(}B3}dRImzXki(`3L=?j5VYO3dtBA>AWJKNuM$P=3- zGNlqaQ&X8ya4wgVsw7vHPFh6H%wBgS{~NQ9o5Zyl#{OsM06V^#6O5?&FnJs*WZ*$;$PzeqCXb>KC;DB99gm7G*8&Ab z^1GPt3Jl{hzH&*aD{zUs2k0Z;3f3*MnA`ujUU{<5%8dn{>muWL>(QM0sg zYlk?#{ElesqC`^pNw^3ifoM2QW@LB^PaONcDB(niJP3+>!b#QSFExX*~HnfrBSo^u?s1pG?m*I?(-bo3||nb|G&h*%yqlg4<`|zA+t- z?(YH28j3G?Fj@DJtzvs>ie0$cb9+1Y66a>{2Jm$Glo8H4`QOCr`Rc#$^8mqm$fIqjc!-d3s$@WKf+cL`s*11H z^|}XwM}}YgEJycAP*pE2N>VbvS~oWAtkJNWj;JQ(LjigeTeimmD)wY>qptjuvgq z$ocOmU^IJ)5x({DFzCBv4-hSnn$zVpth#`)I$aqjBXOW1S+!cbP6VD9@1jA%qr#RK zKD~el(?Cp5VQiOgt@x$L7zAiK?h~I&EEhxy*dz8q`0hXRV-RonXknAG%A(=YPh( z_p4?3_}18nTl?^4lf9)FYNm5L$Wz&74l<`Pm#Yna7?werq%24|M3<3mt=V*smWfkA zR@&TdT7Tk0WG=skOVLvy17jxBEFLw2kve(hhtSbsXl(;+iHpdB{!@@n(5) z|AhD;N^^09t$Ey!A8vi(fuullkp6V%HPP)kE_`{h3U>^3A>y2>E=PT}Z!BYeOD{F25bcRk$oi{)_ z^&=7)sH|_E zyv1OO%pAP)y9^3qfcWo^qP1pcq2z{o1+6eP3f#Y*1(q4FD!0xYQ4}_acBhL(6jHfl zg!5i0=0~S_Vn*&o2Lth4^5ZEgFy`8OWD59RJP-OmsMF3Ry_GIH1KmZLPUX@B={#x~ zD5o)hXQ`5LZ{F8fz|i8!Mj=1}*WY7lb*!q~7Z5G4^(4q{3O{2c5e^phC8L3L4z-1q z(D1Q!ujPr66oKZQm8nvWI770aYPuCXD3rd99V>emI10o*&~NP-Y%a|y^{xLjwNGHoaSQE@(;6+GPTTWf#S*=aj>2oKN7VO{wvXs=hO^x- zeVHFfKl2NE`MndHc zY$14G;slowtdI}UETUOjv!vwop!HX4#P5`l)%Ik9o3yb(qYWA2>EpEe4d9N)WJ-ch<#TmRxz~;vJEJ z|KRY&$Nc@1POuL3&6BFcl|iyL(Sy@8c-XhqoX@K*I_Fc-q?|mLF#;W-&iUC|_bRYM zv%&q z2TXZryvMFoO6SJId+5!mt2nMEplL`McR?RoED;qNfV3ZRb;87icBfq&_OiKf<%C`R z&0et-l3V2cl78Y-ye_TQ^i_p^I8zorl*w%_l`aNPaZOk73qx+%OhgH$^b1iAYc3&F zstXugleKnLTJ%SP8Z3vD$_XtAi<3l3vgNjoYHFR1?+>`NG3FrC>YU*%SDzcMyFbQW%=(5=>>K57$pp?mT#v=$$`}xURit~H5iJh zmM^ID_2@#41%s2LqTKm^Pl%)#IgS2VH1vO%E}B zm#pW2Prw^4rw}d0okNFMtJ3qTG}^Fwy3*;Q#gyh~!QXlJe-@DgG!-`vj*$|M=ybps zF$PBy%(*MwK|pnnOaKhC?3k>>5*iv!)GNW3vRdxdiy_;|uJ(%8)j1i-+i^sgM@TYr zvo3~^mgoT1q0_MusN$sZ$xK!yYf;oq*1bQSX?=(0A>#RZ%VJXtTWGvsD#8J9_DsCi z>nUy9U$3k5?^eu59;(tzFjJ}{pon^AkqPW)pGoul@v0z;u^!H@>wB-A5h>B54sR5G zhC0r{hTa^P2O9-HD&7~YL#;#ZoMfvfCCQ}_vo{?FY9y|==#EeGmT?qW;OL2& zNqL*t7{euJlWGX5c`dy>pvpS5r}tRcD8?ZNxY^IM1f1ysy7VlMcuY>b=uGd3xH(iq zn=o+ZiuK8J&BFZJiaB#|_W)647*G}|5S)Fo^ljOtF%y7J(H2n`)WfaTE~OJ>8Lnn% zyzoi#7`Qpw{@}my=VIlYTL*+%S1WPtQxSc17so|+P;LQzpRV! zMJ%G?R1;muW|dQqMI8S5h|JcvSGtuy56yx@d?_agvq!_&=&kVt{_w3UEv^%Jw@X%k zYC;0Ug$zPtH>!c;POeU-_GK;3b#(reVE-=wVL+b0c6PZ9S=J_)ifdk{v0+&W0t)N7 zTJ4-Nv*K%fYHKvK#URXw?s4!iIQk8}aW5DUkZ&ONLg{LXhE1RQL)(wto!MP&#t?#z z@pV#4kTRhNj;mU&wEn8YfPIR{bIGX)q|m~}#mTED7ZJ?pWG010T*iw=K0FO!<3)Vs=Dy$?&4T4;Z zofmnX8JR*1e;^sWh(Cz4mD9S2gP8CJlqCf{6#~-X2)-Ibg6g93vPGETBFrHt_r$VA z8xGL}__m8q@uhbMgCnEY;j7}4CFxy2ADT&u$Q;Gou7v2>vhoARvLxV77Mx2j`dK6A z9AurZ`;q(74e;Gw72s<@nOxJ}A~Pii?QNc-zsQV#gWU{-(chk(QMF6VX@RF%v+Dd< zsu;%cDp>b}lal9`31yodr8!0)E6Re)4a~7#4lM!3bRBishl@l6 z(***c5Z!5c^Z^NzRdHLzZ60gBjEG|B`)WRhrIJ~mv~;0+n`Hm%>+jWM!k!1JDD!Jm zQ^^_gjtYD$@17K|rKMkurfBi2iw!01AmCFkYNtl1cGB?U3wG@5+!+=d-#9?eQAM6^jw}L^{GI z!}kns+W3&|6C?mHcldFljf zIOKvGBwtZG!1`KTrij5kW#XV`+UmH#@6cUg%fEmWnZ(vsqYmDz`?H#Nsw64S&~uMi z_aK>$Qch9MWs$hXg(2QOL%g>-y%hy1j!5CvtABp%uw(Y8sjqNPVswAB7 zg?SSq0|%~P`rUH+-8#6%6;21(r2_^=kqBvLC5P?rT=I-%*gyXdfBt{|{C~m!|J#55 z?}I=8PxQv|b%e3Qb(nk5COpfIZ}xy-LNgEO~us_0lK znNJF-p~@dQ9U|TQ;M%*<;-c>ohF-! zMHR7(aK$chIc|KSN^`lSD-AP}Wbq>dheA0&dD7%pU8u@9Iu+t#c%02`LTKyE(*HWEu)8Dw0w_kL@e%T zOKen2p^X56k%1z#gxUpHnq?tcMUwkkMd!Y6s~9^l0{>fF?Id&Hc|srAgjJbJ1_I&J z>8e_QrA-UoTd_ni&o@*y;g(Q(D-aX!wcLh~Rm|7z&ak#r42dti|eNN;~@BOX)=(Z)t0q$^nsq7IkLg4tykqz%d#)3Y{sT zFw)ePl_XLB!W$s)Un&mB+DDbMKjxd`Gb8rGg<~vT#o~*?SQJ0X5d@wmpO%8rEeY5C zRw>Vp7?M{SuX;K`bCo}iA!87%&VGN-`<^a(JVRuM@#CQ2WBlT_g~6cNa&UjSF$z~Ojw=^$a>_N3RH0+|btEi7^<-eVGT00RyLwc4xj+@@)uD6ByokKzqFj2A{9z(Ig19BCoGWMQ z)q4~b8_5x(NGKHd`T6;qv*6v^7o{~k!!gHd*UG`~KTKwm&+lUeKd%^;as6@l>sJ(R z^Ac|H(lV-&!gGL=AI{5~L&1d?b&Nw=%k+S9RV|jw%^N>U5x-#&%V2=e@qHC8g^Gy50Uc$Fmvl{pn_kGt7r{|aEi`pTEe!@$eqrp% zYjB>|_*9{lSG3<-yGU4pmD}->)Bkk6X~A6+ z1&8w)eE6HVASnw2AS@D0d=g8Fl^629+u!PYrGa0@X{9DbbUeR1>l~dOpPs^;C&|c) zgc9V#i%c{L+w6Q@(~zy&NU_qqss)+}f+yYJTa5S`UABX-#BqL%zw-9!p>yiHg1|Wf z{Z=qF9Kq)(rhBBA9;I3?KA(i1(_p3F6|dUy+ZRub-I{VW*f#fnj-MY+2LT(k)+o70 ze_j0H-XEP74^|qlmP(Yl)*O{C^ynBf5t=xdHK?USED;wRDU%oXgAE$RTf{YPE`cz( zdfyXSGK~37JU6hN8`}iKU>H1n*b(#LlCOWCEOTGw(+t+k2c^C^d3N-IBw{`)e#p1L z8c2I#okQ#UY0IXL?vq)9xS+3qw!kswE*@h&N4oK|*m%Lk4Z}8!CmQLk@wC3}Y2TEH zKFT5>0Kpkdd+JnM<`ZaoSVHV9RlF;mhehL{_OHUU_9n)_GE{?}q36Ny8tRsT3j`v} zj44~3D(G2;$pJ~Jftsc&Lm+U-#xIBBvEVN;Du;V+aOpO53%~^NwHwU z&FZ_|j@U*6T%=L8vmEGbx*nS9?^1~CuhHwc z^9B@5g^)1 z)Z3~%w@nf7lH<;lrn2#ZjD?jkr;Tt=IwojG2F4==;a#hr>m2b58Jah>ghC=?@EO?tAWAE;Xi;6pDLZG!8Px8|9ndq+uKQev;UF!YCfIRQ#fa~I)(xJA#jJGV z&lK@O{!kR51(T}^C$RWzf@}o0;ReHvbhUG6oal1d56orX>+}zQ#%0&jpvYpggD|d> zSKrVUAH99{w0k3|z(V&W`X%8+g1kOD16eiZz%lrB_T zEV&$C^Jg3Yg3DO?cUxt9@Sd}TM}cOCAvM6N+{TrYK)Tx_#BuYH~&jFfksH)=xd-c zye!URo82Y6@;#A@oNN)LO&6hLRyWB6WBO2-{F>7tu@x4#&`Hb1b|SnRZuTsSf3HRCjEI5fVh3%N!juNL|DbsYxjEt5C27TGYGB2d>9f@Y8%?O8Mrc6D9&HU@YtM zfv92n>#>po`u)4*;A$?u&A~#NLWhi!)M;iYYG?|#U>nxdMVl(3( zPd?z;@uQQ=5EC?IW~hvYe!_DUGwua6x&5NnF4R6s5rj8^R)# zVC=YZh}1r62fw5Ve4${On@PS0Gy>zN zkd$9CevaX(K(dRo?x%P^l7JfRN4~t}y0aW&7r4Qujg#dJV2@+{GBO%IhQXE%&>*Gn zlAv2jPbQjUBVCx&D2d8%;-X*~@@xjj%_mdM(0K`=GBTSUA`=HwI$lXx>w9P;VQR_( z#Ga!}?g~(JS(yY{h!NZ|8n5O?yk-?G?%-@{oq{ zqE4;2fV(22cfl02B(N2{=>*&55M>q2PF4%9__xUuMcHRU);rY-VRQl~xmANWF}{p* zTZ}!|B(gGhGXw;1Z%lp{gXRfIEi*lVm@c}2QI0yG$B?I=!AyA;+YE{pcSMUIOqXZ? z?F4=AnwF`-4vJ>)Y2(pcn2eH&q&2=A^hg>!4W3DwN5*_2T7&5l<5~)1^+e`SDI^o# zgRh<~ooLZp1m@Wh5YLE%A;}?#A(8~Iz7QRoK{!>O2NW!ZM=p0_AdnlNr*M1gpw|<` z=Vfg$pKcZ>(73Z0IURZ|H;@2b7jSPkQ8cMg;^~?(OY28#;YG803BvsJNgFuoPe14UII3v*z=KJ747(fl&$& zc3J%1VUj4w$>+%gIH8=Nd68VfO_AHIq!812*F!i&jnBnmDObYA>uGd#l7Y}dkrg(m zR%5S-*iVwGtVe3Ck`#Q7K1IORyg)NVBVGgrD!LDjLkx3^h8T>*Y?G%#*=Jx)I1QIj zrd>4%Z;`=$h2@!IJKO*Sy6|)MD55_uFUtjwtwV~nB$kvwHWR)Q*qoDIGUbr{vhes^ zB3V!&o7EB+K&ezp3|uagp=P4Ar(kEBJTyx=yfGF_Be5`hcvgz{!VE(EyCid;kzei} zNF%>&>n{`hO}dLyO_=ES{8#k#{SS}2OD(grtq(d;5;pu8=tQ1)d83nMIbDVRrFiq*hGOEfke^P%#SEbvhB%c0ta8k<1wagXhwnL zWz`Yw+2q64lpR5jd>e=il$XxpN|ARFBak$i7!2z3NASWyci*15o;h!syXM1 zGj3-0$Q{8Y&w@8>+|AWnvg=IqXIT)@Pg`n+of2fE3yeReg8{vB0;DEbhg2X5B$%V3 zU2wdJNhuvJRM^Fx17X}VGjMV`J#CU*O_&6~6q1zIfm?sG77O>ELJf%w3CfCdJh+!G zLEg?8DO5;4?lv>ia6<}D<$4bJc#I-uGh2>9^)=7Yi(JSU)sOH)`js2W+dtSpBsuTNM}{@L zDL@1RvF*|eOm!kkGdS7>5Gc+CAifihPcTse%(|rv3J<5R!>RIN@}qH@IZBICRyOfXSDM! zB&c*dvmCa+&jkp`>v(hp7fvFlfF)a0kZVS{$9D7!BN{q>apd|nrqo5dbwnaBU(&Lf zT{@>Mw23(o1oJpf!y0YU=_OF_A|E2qjH%0xLtR)ryOp|-nrGrG-Lwg;dod?mPD;!c zitZ{n0MckU4>ZjaJ>Qhj2N8LcPYO-~(tc;J6uT$0*mh^JeakG)S0uerbzFW0G0UX7 zS;F6xj&B1;)-39QSy2V_{qS-aNf77p!w2{asnV3|QL|QZmu>Iao;;kmrqiWybOSNH zHql2UA2PJunFkZ*#k#;!SbFc&bBndOPY%;IyX^^HC1ECoK(H9J;DneiL&uOJ;$xp7 zqY;3EmBsO!ZnrC+j}`cUA1hDb?~u3|i;9+tV1tB6{py!kL9LfY<#7`vP)b|L3&C`} z{S$Mgg^HH%92>L>IwpggL^QSXMmZIEG0e}lgwqF2x(f>x7u5z)R31V;{1KLmkxgPF zB4X^usJ|gl&^^*ozJB-kb#NYD#?z$88)3?haT=LeT!o#bEF)sacI~irMhl5XSdO6Q zvKKCOWmpo>*FAQYA0-jor{mfr{G(${W~RK>bnd}84JW)Cn(07X{f>>Xk!uSJ5HL9; z6LyKoErin8N7sUwk|M+L@}U>atb*i0P_&IXSDHn7g_+aiC*pGW6cc?LOFa@N#+fYM zZaC`_quOJr=2;bwLy#1YVe3Y+pD$Nshw<^5YEpMhB$RzRHWA1cmshOnew+E0A5q<1 z_E*VqESotFSuP-Z1Ob9aQ$#!pp*DJAum5Rbc1eFJ4ad>kW9$>s_!WC_f(x5XQR@l}$ zrh%;3tmIXU>OMKU;M}*WEi~*)bWC93MC<_3$=ZZ_?n)oDT5mP@bS5Z%>~vZW*-8+z zG)qC@_^yFs$WwxmZ;^NGIw>huOVH-G3JkPNWL?rc3Zbbdkh}GOK>xy&oK#nXiin8S z%uUtnPrrZDF%=VaWR+=O*cv7oP~0z8Qn6k3&YUC?sPJ`Ig_EQZ?capdYNptr0}^98 zZ)8uWNK+WEecXkR!`&CIZnC4BNy1rpa&mV3_Vms9>FZa93;7s?P&9J{XfBN1#GsCe z3PcNFmG)a%7u;8p@5_Cx+FB~Q`)98w2qd>pMN;Lx|pB3T4 zqlA|KDMd6;USnf4k0ea$$y|SHr+a$7chjB6Kegb45matOLK$`PgYzf%8 zXHdAM@9i72w zU^I-DJ)b7%`VL-%IB@1VGgv4Jj%O*{DD#{~=$70RY#lx5?%hz8Ly_hUvDQelOu-ER zB-A|ShTgkj|3(Sxbo6`0+gn(iK}Y$bl97*ZYQ#FoQJ_Hah`ikVB&O7YE9=w)SV~$H z>Z3x&J50v8ZBimOD0M$Qbu3VGiRtAxBY0JULnsQL$rh*4AdY}$%L-v$X~;2PD{@=e ziohGT&cV4ftJHyPSAqeMXqHg}Bl6lA6V?8;LbTf@?QGz}9AB@t5IfR1;jlH=L9B zRDuNcGlt}*iS}_Ne_0z>Ntp~2jOJ?-T{G$7*lxlR$jj2WNQ?ck2b>>)$ zIvwbee|PSkT|w_rcI5IU^u91T$xLga_TRoNw->Ln3L0qku)Sm%{;4}>M3wkMb!*F1 zl1Pgk(ME7S@}DsNZ^8nLDz0LS?xu8qUOSCg)1TGSYE>x_kprY9EGEXNAxw~7vDNRy zVFcFqyL^U}Rw`5ma}HzVdM?IOHrjBx6gGmXlzIE8^-4&XqW}td&my1NICis}S~Cjd zlDcACW=3NBNek*Qaayj+>vk}jRqdc4*hE>`OdiBN;B_X}nw2sV`&))-wtnI+x~bM2 zOFd|!;oO+&DSi=Ww*I@{t^ef9VXLJGN2FX3gMn~F?8#ukv~UacN3*0hxy%zbvG&tu zBUuJ~USV#bv1)iQeru?wd}(~5GEMPl{20zMo9YT8_edfb1?H#MXz{{PbC8=gDpP^B zpH5udDxDgv;exlhYA?F}tZQKf0?v?okfZ9k$@!CKzF9#y{S9ItUzBB`Px{ctttH0V zb;YBRiP@D4su;$v<)bW$kUco2*m_(HH8N7bvQEW{`D$7uDR9b4MlXpq$#IZmpS~K8 z+3`BGq1&Zl{hxf9Q(#a+4OZPLc|{kdf$(+n@rC((={3p20R&QP^6ty_%M1IhF958q z57w8`-)g!_Bqj+W?{JrkHLoBG3IrHr;TrN4o{HX&jZLFQyQRn+&q(*vQHh+Iyd6-w zL2{QOwf zrG4{Yi_;Ci0yewI%V|Q6>PXxPSlE(X7r}2|zVJ&nn~L&u)1{)kX_b?^GJuVRwC`#Q zXhMUJn9k_}Ys_FHyT4pisurnn(&n<{Gqsm~45#5DY`aj(-CkcUn3R%Svb$;eUqOxF zpha^c!0I}xCYYfV3oB*rd=7RDtl*|KUSVTUvpPmns==?rp`@%IR~koX@T3gj=^t|4 zg5_=T0Hgc6hd1_*WSZ~7Qo@D+tpt-yirLB(p+{48>XW^4YBD-c!LP{h$7ZQIW1Ne3 zI1l^#w;ZuLOMV|Hy4_dnsyugE+3wxaiaF$N2%_=r!)t;zciZC_ZPOml+-Z}HlGk1m zJ+AkwDNV;V?t;Q`lDVx0dkUB3Dk<{Jq*pS<*Nqc`n$!$~U31oUI0E&%y2SJcCs~wB zRKvwZ8E4VO1zY8cB+eptcPDWrso*%H%81UMto(PwkD$$U$QH8&3vQjGJ$ z_NJHW*4I#ls;J|()H0&vqlh}v5G~o$9)rv(p@s2AuFKcxEQ)v9GKdUgQYU+SUJN3`%vTHC&_u=R0v6Q@nK` zkVXmRen7zrk*{fBq^&wPS-UfKUX~CV zMOg8Ef#3t9`*hPZb-#I$JDytf2|9g=!*GTZqJ)wW2g{Uws1%olWqAlZ@HP8i&gv?! z?RlQ(2=OKxGdVHCBqi^uR47ldmdFSsz@%jBk!f?ww#g12+b&ymG&~7@WB|2wkfKq_ z>QDw1>NIaXJ2z%rZ|06{mYNV519Y$psvLo-&a89Ys~9EZWxc!ZVP~lHH0x~TPdoF< zkKE)|mgieb;mrq0&+MT&vinXr!&3(=nqLN#u!Nx(>b|(4q}>oRNwCLhIkNyViGt3+ z++`MD)zh%^RangO;5qPlOw?z`cVNc1!}0X5UZ0Yk-kwK@r-YbNAaYlJlIiqPhXRBeK9?L}mqZA5sN+8~96UZ?Q?m zirbD_6~*XDYFzUQ$xVYr2gpOyBMne& zq}lI%cfb3$kkEG-0^ueZc`uvhAtxfSh$lFLLIZK|7EiOQQyf9r1f*FD<@{|pyQXHMb;W#(tdh?ZaJCIAXQ6Yt< zm+?`jt#u78x8*vm(M#eH@l-YUvSBZ!oSh}5)mck2Xc-|XVwhSps1eLd5|e-w$U|)F zo0}Xh4$AuyX#Yp5V`Af;407G<;I6ZS>^bf&@1fDl?+p{GaBC&!6_-M#esUC0fC~tm z*(ILm?ZztbU>kM#m|AySFcI5eokW9{S#KTmtbPHDQ-;Bl>m6;J- zIBl-Z%5l_`{X3s?XX=TUVztd249i@PHSs8D?56Q2(Zkip=p4DP+$!auv4z9nF*zkTzd@boU< zvlUhnwM#MR8x#Wy14I@O{w5eo89;(@8z^`qY<6o|U)Jr~cDHNmwmapI?u>$cOzjc1 zoY?qP)~f@yFbq6An`9cpssvP443EgFyQcSmqDC!PRB{A3roLuvR?UQ{XM^KRmJJ3N zjf@1H!_vc&qVcIJb69#^MtMx=W`@j-DPW(nRnVJuHT%wLZrw_uPG=(5s@|Aj^6pCmveIS$gM2tByR|Bz**GoSc%2?uA_a6 zM6rrdzXmEEWA-Ac+Tp_WgX%gN#g0Eo0Roch$7EYx5%i!(_f?KYLOm+xplnNG$-|p+ zVXQ*GJOjrX=t-yl?E)`K`=eTF@X1WlW?a zqqxym9RgER`g#$BKnU7Mfee8}w+XBFqh@aa3cG)!HICioZx|C{sv0%1dv2(#=JK#W zYwPrAHXxbIpq;o-y6j$m4z@-wa_}%XeQoUvux8~_YwGo}5h~=xa%y<2eB8ZBtfiuW z54YJwdU;M+jA)&6Dh75eVihJaKr?qU&RA0g%Qfxalnu;e7Ll0J?f#*@fAr?mL-x=* zXuV!;S~BpF0%kaF(KcxSR(WC1L4i|Kh4l2Uj7u?S5qgsnd9!PXVK%{&c$kEluO9dI zdpcC04|Lcx3hC|X#hasNCvRP^jP=N1v<=qS|R4VC~oQe>SUA%(%nw)ko!;IFTf#qQfKcN=mX0;Ai zj}-xf^LXTQYvN7l+afo2$Ls?>m{x)!$wN&urXqv9(c6_A zE}c%^2tg7*CMcIECv`gH0hZUcc6THtFB6%8BW6kRNw-FPD8>8q{k_B9mX!U_ggU^W zlX;m)_Fvad?^q@DWbGa9OaCXca8ybWX^H}7?actknJ7kX!bfvFw+{}y%O=G}oLGW) z=TAEau72&zU}vw*|L(h%5SsuD^rbXD%EH~wp7u_Gj zf~{%YN|Ym}YEOwpn>RJ?=Ricgl^#G7tU%k_Od(>k4XF0CBU<;?A!$#&)(YM3nAs~u zs*-^!mokBrW4rN)lN5r@X8F9Ho6h>Cv+YiQ_g0Gxn}@|lOBAVQU#jA8$_fqy+kMe4 z(tsvEKrI8&Q&PB!(?_|beznlw1AJVbUdk$DA`~68^jmm|DYzv_Ta7jQR#+{GxQPIR z7`w;zS%K&dx5Gk6wh5PvCf3kk#K*n|~wes1VV_3^oBW_5BaTb>R+7iPo9q zznrZa^XZr__I9___*Vh(D{`+S4Q7MMIC4qD+$qiK_yJscNyt7A6X(wC>}?%-b$Y1g zu9xgb(ttHWfgR_xw6uG8cw<=GQrZ!%EtM^^Drv6A;nKyl9)=2*TWaQazq5!05(Yfa zG-2&xPOO5t0=iBbkA9DlE>1+FRUMY|MEf zC5bQ1?Dx1%j4iY5dUjB3!utzUKPg8w8kQJI5G4_cE)mue;VO$#xP&SmqK5@~_;xDU z<`YupfZs^6*Dnb3lt&9KHA4(3WS`hCgW&a)@)@E$U6QhDNnOuSpT5*N>D^9!Sfpt4 zzZV7BP|UC73$(v#Z6j9#(F|@xbkO0X4|xivXZP~X%nH*#gXGjV$SgVjz{G|l5L2Zk zWbUmhP_+ z6;%3Lq~M(?oV10M+yZ%@u*e=_o82>-W`Yml_HJ+AoaCco1`3rq&aWs?5HA<2*)$iT zI4o>Q@0bH2nbd`3vT%fKH|)wpo*U^}M4Df{czyH)be8kyq{Vj5J$d%&;jW5$=qU}a zav6}=KF09?@M4zA@Dt5;kX8vX+amxniN)KL~eNHyl^Xyfp8SzIfxPUoct=!VX4yu zguFzVGRC#{`@6flZT@$!EuK^Od7nSq>&w5p)+qi!5q~J_S{wuVtB?qIC7C6Gg96$S z0)vZka61zW#i3w*t`vf$=>*)As=r^nnlq%V&R^g}9um}_d;5tc1 zy`)X0Lq%Ou85}=<>FgukWF(FGb*7cAZ+em9_jrdb)n^etDV7?rHVmgEXNA=Y$GPoa zW74>k7m;Lgo0oiizDC&X%Gg;VLmHw?soYS7pc;{qqBod;hC_l)Z`qBhmLSJ?DtqW0 zUVKgyCpnPZ3Oxaad16QpPzbhn@>Xhs8jDd2Dg+&KswilTBdl?gCX zMc4kp;l5E3G>Xzy6UerwVaTRn2M4sd12no<`-X%WW-a@M9;W7A^A34OE`3gt!$nk0xBTttGqnOr_KV)u{tl^(&+_bJn6mfpSy+JHS7&(} zkzzg8jxz5Y9PA!;dg`^Tt8wR`%hJA2Zcc0nZ^^L^5*j2#bX}kTqdY|+u*_KjapDq1 z!1YB!l5&?)-JtQxhbmBEH0XoD9ud2`OEAZ7tQ z+4OS$(g-EmUwftj!P4fVL=DPhmZRu4p%iV(lg=nbG|va7qJ-2@qBj_XGK@!|nymTr zluX%VA4D-8u}GDvk7tELDGgzg_+gkOaRzI|vC|}zQgD=x<1{ks^HmP=&o>wcUwj)E z<4q}Id5OAW{DE;1by+(pbj+FV?d=n+<=iIpc@kG#Ba8-dY^Ae?A4m@SQ`nFMR_`ga zaM^V^5tq|WGz@_aJ(PwO9h@dgR}9hX9D-mOoZTu3B;${-LoY37BOQe<3D+u+B%_3? zEF#w9oWV#erd%jZ#zxeMVbUT4*)v4Lm?Bn~2h;i7uj;{!0@iApkmX+HV5)sAIn+(Q zNcalt7PEnRDer%HhC~!{s$(F-UdWSwgF~x_8pCE(9jKU%1)%SS`IZsFlJ!Shn2zWlxk|KKv5z5^g zH4v1a1S~~$G_b4{1*UG4O9_Se0>6MwHz~^4jb(Eh;=8iHFAeCD8gF4ZwkQCh=8 zOZo(SKD7up$^ee0a=uDP5fRo#*M>(?AwHyROpL%1jGV)%X_Q|H`u1q59!;Pnb=DlB zdvc*6JhyGempS?l52VDZ5ZojU89f_ZK!J`JjeFB$uzVY%+}JljFTl_zQU<9ZN$IdW zuJSip&#O&ti>3E@3uF?K-g@&Hk=KUNv%m7SIi!XHQ@*F$WtMn zq*P>-B-#d%!Rdfa5Zc9LMFw|e5Yk2WR?XK4&0!?Tfkn*=D4~ElajxSbw2V7K@O~76S z8aFx+21fNckn!;9!TyyU*=Uzw8*E$G|&#LH)0Ssn^uX4L|{_> zn`Rsee<8Zw-}-g10Uv+M+2`Bl)(vwctYysE!(bG}rh3NJM9T&g=XSa&Pm!eODZx3A zwz&B)8v_+ty{Q05fDN-HH=~I%&Lg@y4dVuum19H%*^nttN(_N)Q!sggNq{xDjixhq2G2kwhK0iz^%B*I<^)`wgl!6(tKBbUwmulFH^bhaC9t_b5QE1_ znpc(Q+YDJsVK9Y+(ISt&rm#e#UvZ(`$6=wt0U1AGDnjv7EXX{i6b6_`9IdyhT7^(Z z&0_jQnx~KrYo8J)MaZcu{(tt~ZMlu)To+u|c#3MGZ2$sT6m_&=Q4(8HtGO+S3R3O1 zgQCGAQ6$R(QE(L?iWapZ_7hCRT+U-m%tTDg#LV5?d%w}-f6Dwbs|uvrYP&tFwfAxp zmFM$+{C?9lQ;~q@Ar}b0dF&*68Y>1z_z^b}Y6O@YYuqIaK<#x-?dP^CHhAE3fd__L zXSGuan+WABc!Mj8w4PY*yeBJKC&`!>7ZNB7C4dCCBQe_PA)}6)12bN5yvdWKID`%9 zTvj|lO5w~bG-XGliolQ{Mo^K@PN9+9@M5?z(KQ$A|LX#Pn+E*4=A}#KB;@UozC~}P zZfTy0xu2zXb+=Z6Zb?tZ`Qp$uB`>M&jGv>nGhP<%O!ug#8P`&}q93xOe0EVFA6#CX z9p>z{)%mqIhxqhz+g-3=F>^!qHRXF zRvSYid{KD1u<#%vg{%uY;m=>qTNB*IM-#S0Hdle_zEptkF(HHQ8}GC9Jgqz^vK6gBKu6nY9*9R; zlwqayWEhk6BuoUSP?VUm)*zGk$%;sq7_U`~Sl5)N)Ype*b81%9@Uc%9MK-^1l9`z* zXg3pH%F69boFyR>qd=S`6X1aOfwHK9g$2{vq!`9Bp_*YL($=y}PN2fe`^U<;asxay zbMvMJ_ypYpfV{xzrSaSBY zD1@_u3_1L1d=d*EZpCiSJ*EYXhlO74IDm?N~u@C-r z%(7piG36AY(ma7{j6qPhpKQN=Q)}PfvH|6-&4)J%Ci{<3j1QtzF<65(x?nr-M=%@c z{a4{{$e;?7-XCapc&5zwWgIyCWgV~xZDCGwvuwV`cxVl^fG9S1_knWwbJ)->@KKp_ zjK(95O9!!!_%5~_hYdb?LLOsa%tqE6V0Xp`Z+HwOJ4es}gB?OEL*bpmLa>%Vweb#w zaPuf3^z50>5uHw5Su2aFgT@-WXQeJ8!EgwxxS~pXN5|Lj>PEz~w#GezY!xX9KBkXHbK zQ8HwUnP=fSTrP>(-G*qRz~UnH#RZ<@Nf+-u?hIHP&ID~PTEBUdwE%E%%}ju@(d=z1 za3i|YcsuXnmf;}l)9BgG;VQg5V+&XR+EAkUJ=5P~cMr3;vf`v{9cPFFmt$jNS5XZ< z!&=I<1~TBoNfl@KZR~|X6ybrjhbChK(kT*M5x4&1mw#9Pd-3e~<_k2n`RUrYX*TP< zJ9qx$CjATld;9LqyZ^C%_vY>OyZ7#x|1QV{A*kE3-o+4_iOYbJuy`Ft9%Yh!7WGpw_0ybU0eopWoC+KLgt|0FqsZy5HsnRVr@Bu%ggyVf>)g3hUWAN z21c5A@nog5H*$CUH@i=x+p8GP2Pg#YS*)sNDH%ixMvmM@+uF@0@1iZZ&(Ly(gtYI- z!vj&1K-UYTTR`gx#xB}nVhk{v4aHVr@f%kZZptELfz7*i%6d0 zi{T@Tv-|h|`S1VF-~TW3fB)P6_@AP`|1bFCfBzr<{qO(x-~W%l|DWd9|JsZGFfkYP zSyn{9&&~drX7BR%4F5}O(2CS5yxe+Yry(gr*yZ8yzm@rPi_M_P_p)X%e=(UxWGww- zX4Wfy<%GH1JiBld`fYl)DWPwvqxhbNO4V^nG z)5-BDFGkW528CmjG71kgOHWqe0UR4*2^W-gKri{5H4%fuOMRg7x*&Qk<)>3q>gd~~ zm?Vg!yak$eFpw|3Bc&Fz0*`=|>7{WVERqbNF|eaR&8%TKXIO-h^koE}V1)&$!j_5* zJ0IWflp-Nwco`5mo9guDBY+uGy)Hh&;%hfz6c>=B8VWtJ^3yKLy$x-3XVv`AU7C{T z#R6PMPUrL4a19QUxjc^z({X6X)OecCn=cZU>AaJ5qbpzWI#F@!2jNgHpjUkx^~e6 z0+59aWo|Y{LSPOMfne^HivHjKzId0Ee~X^}ElbCL%Z@PDH=x}(&c)X>*dDuEFQV<4 zxu>CD(F^M4Ao>H_)2zqq1c2ghWAq$&Z?*|pvCd^qNSas1Wk%Do{q2h-*KYN$!!E{0 zrC7$0#gdbkw@5@^bBhdANQeXr$lRMgm^t`&rvKVh>Azd|*MFh^ z{u%!^3>3hOn^3X;xdpGnS-+iCVPgKJifsAK6nA7 z8B1w{E9?2|7cH@1xPBf|rbs@s zrdP~>Q3h+sfb0xGT3ff&P-x~D9m!oVwu>MDoFX(-&@<=&fzHBR2{C!+(e|rnQUQs; zfx<_a&Lob|>6BW+Rx|dI5y{PKf{A~cqu~H}B}({S_TzJog5R3$F}a8~<+dJ>FJY?~@6Leb3DPTAblF0D~GH0@s4VaEyOPzISAT z+&mz)f5H4Fw%8w(8&OVpmQfhP>TyA;!WU8b9Y$he=W$0+i5*n(q+?Loo%y;k|XrFoL;c@PffU;<1@6+g7}k+;K}z8Yg3|{?fLJ# zlkQaRGbD!jfU?!kyyj{{QRD@+=v~a+8DUy*Eaw8uoqOm;Iw!%O5=Z!B!Oex@?70>d zxc++1B^NfYrCdvXvuIMj{7&HeMiRGH>u!up zBvZ9DyB#>SNyZ-A5?veIiO7&<%%XSgiQ`S{H~>CC!N11=1+Jd(a%q-Cy;nTh#s zYd6~6{`Soen>)`U^Y`nW?LTZiefBh3+1xe1SE9{VPop2U-h8+H{TuW5pQ2}fe7*B* zcQ@MJf!elSzJ9S~a+~5io3Gw%J=+~bTd$tH`2OkEtLFn-@Wqy4UN<3T`oJ{#Oo~Ab zuB4&yqnFQio_uG1Zho`%V(ZPHu=Q`Z-n@bqzun%6Hlx>@J8!n0eE(t-+kgH2&g*SM zRsZ}s1Ge+~Nd>^m>Hqch`*&`K^#A&uU+DjT68--c>Hbv`)jsu<>LeIwwcy}K!yz)_ zrQyU+%*kCG#^#W(fz=4I-Yrx%t4wH5!a1{?@*D!fow&Pt_)Z9NCIoLia)~E$jXR7iAxs>tkL0BI^U9 z#)O0m$^b`!`BY$_TlUiSJuzSe&s`PXqO@Au6d;DL zQ(u$qz#f}p>_>Y@QN(e)4`L+pjG3*@^Hqe^WfSyrVJZOMXfTmh)vT_9!$PaI2?_Ap zAel`bd527du-R&LvJ>k^0WPLsIKz}uR~QQ7PElCai(RuVa?j#XDG!I5HW*nJ7Zx&0 zIGC0tBH%0XnGMjzD5)w_3#x*UIjHhZ0^hDVGR|VlER4wF(195DVL22_&0LlCXh2UF zGmGF8$MH#uh|q?R!vdp!THO|kpozX^4MtT9Z^ehRB0Cd00|dK%8@VAln)O=z*2g{?azY5KqWk8=$9ywkr_(hmG0r!y0{U z*$^Mmh99&xo~Gw6HKvhnM0=gYY=_Pu>Kwv<_f?i4$ZgaSaWgdDR^#RtBp#7%8AH=h zvl#rxI^%E)K{faa**k+gIf$#7gDa7sYiMgzZB&GtsBatTGdS#2pa+r1FY?^OYp>+D zI?}}QL-?KEI)BqS$+?{J3C8OQ{5;y7xF!0JM#{k44~J`K=*YR|CMuy&!XFY4=+omV zD2u_%X*Lpqv(>%!NF$(REU`T$SPknOF2-_$miX_BbqflroZ$;xZy5c_0gvO(#F#p5 zasd~QZgyV8F(k!dHb)MyJWXaPg;FZhf(4ngJVOH-Qwf#cgqbEoOU^K+^ zoa=GMSy*F#mQOBV75Ze8Bt^G~|8vQRs)S5rI<J?h(ZCqINBDYXO#Q4>fs0=1q}c4fGxK>5 z!QG1Vc*yr5e%&8f)n=GMz9WpMdG*5dou~WKx`+9Sp0E}s-nwgd%<`VY8}(I!m|s8Am&kK>q>8l z%bFMfkGJ7r?`wR=))QF^B+dDC*AXvK@&rK&*mlj4Pu36~{U=&h{BDDIMlwvcgRAS( zQ!ltCJB_x^Pid11XqmpE21Ga^W?CiE2+7(H%^E?V!j^(M5=(Rtu9;(gbOnT^>(+t@ zk=7h(GMoixV_!9~H*;F8_lft?!R~pYDM5-eOO_FDLaIG`6c|5* z4t;c-p5rkAoQR86g;)l%I;ISe*_hy$*#;cf&@dx*6-r#QxZ?K!1BRWsl z>dNe!x=zh@P3j8&1!H2S5E63@GwnxR3>)$;QvEX<UnHKGzJ{aF~w0#5O3Qq@fP64 zZU0{U99lY=(Ip&|ZO5z-^K1!hy2A+qbk0wSUT3bT14P`(qDWhC7?^)S?obOdNSsfy zUns~92z0!m?gXUfAzNxXM}x0ueLb@mFnU=BqnFzN-*D=3f0fSRklup;R0+RW11=|$14D=Wb$AP!(8Orcm z=Tuz=3L8rj4;(X>on->rgCL+(EONy_X9Oa3bAaXvW6q%?TQ;AjWoe}-W`>Ut6J)k1 zAma5EGU%PH_-yGx*!(>REyp(mjFdVvc*Xg;&xEKKO_(L?OjWz-FV2g!qdR38*CSk)&=Q z*?OwNsRv?OBK_$+z@eL$0h}p5cAL?S8%V3%xB*A=#tmZUZrmXA!w++9sbRI77R`wL z9gsrGSjC9+kCKZ--GjI|Jb>&6@zFsqHqCBNQz~w557Q=5GfNs3|2ErBNey}87j6ee zY#V~{fdo+1&E6@fGG0w4c~#O)K%G#XNx+Vq3eUy|$kKv}mEe=`o(93|Gvc#N5BTxP z&p^34?wKh*I5;RzTVI1q$ajDcs{geuGp-!PAXiKU2n4ExXS22dt|v&od3rEs#tzU_ znrlK&#`>n|niS%7IK-?lhi!?%3PR!XYGy-NMjes)) z?fS@Ex@P%M4h-D}0~Mxc7{UyFo~MS4JRyD=AwC%9lB=em=^n~iaIZG@5^l9Uh%ETF zt1-Y}Dc<(3H}7j(JKv!27W!TiE*Yt*M#%&Y+Qo<`75F>C$Fz?CK1VI~sznr@gASaS z5r}RNV%$+L0fs`eJ@fONcNL`IvOmZk?#_`+g>MhmvWHOXmVi@C22=o$&+{p9vhZw_ zu1pJIIg@Av+}X$ingIYC2)<6iDV$Na=v6}~!){_3xm3;@$`KL51GtSn?iY+=e{X$1 zrrvG^h--~qP6;8D9yz}Zb$OcC_PGk`#uZkFa-L*-S0+tm-tI+w8G-BNcOnO5(8E|u8Z#oCC#_5t9zPfIx zy>h=81OUbJ?kisLZkku4aG#nTPlpcpUwKmsV-720DLywhUVgx{0Z+#$iPX>1nG$lj%JHwWHgIrgnet_C8GK zB}9%!op|lP%V-x*{g3*0*}7a^`tOS5D+-&w^X6>oyGL{p??F&qB!0f4?^6442q)}1 zwVQ=UG$Y#x6^)x}e>OE0VAz=J)XuBx3dPI&ZiwCJb7uw#WBB%aG-UVOePFQ+VY;6-KM~daoI~P3HUKQ~*#~nVJ*FTdXGy9p%+qUCt zw_RSdaR-~$&^K=Tsu{1gZ8__J|Gxf|OWRk?czxT!uuD}bp^|jg=0E*o4IK+VxOH=L1 zjo7a>tS-7ntvA97bzi5l$JkWyY}|Mk{cfWSWHE*!$ zKDxZt?vQ$GWOlXlsPkI#jq}UwI8h9WxkZ!0%S%SIB1~_X(XJfQ^>V zeztxP>7#@8q7a-cGbBK&G9s26L#LyNBKqqhJ9;;{7_>yEh$ek$fieZSgF(7_$|1K3 z@=3GOSkf(&Ovi2$b8Z+NU=7Ib=>S%|IG`{ak(rML`V&pllrV|G8XB~g7wqRXKV_MT zi$VUo7DiXIWhp$w>hUBUpQu%V2^q9df|;Y}Qyj>k88q1;;hI#7jSX60*hA?5EJ?LS zp6G*XEm?3jRcVfV)VReuaHcBm))(a$~1C$1=qGIkC*Lm%*~a?Cj;5gSUnm1n}M4T2nj16dc2KZ zAOfU_g?LwCQX4SpF%A@F(z`xQ@c-QVQ#z!d`l_c;|q zepj*GCp9&nA4RL5RrUFi>M=!jTTJJErEpl&INDa z2=@krF(zX?bEdAkBdtNd4amn#0o$4aIf0kL9`KyS{@(gc)Yk325Oj5O+UQv`Y3uv^ z?p-1Nzv8+kb(~dQhpBLxLSVOCTqi(N=S7JFrRDSj`uPJ=L9u*EJ}|v zPRTV215uRr0KGXC9wt9#jUx*{ts#KRh|dM*v#{b7%yY=SH7^}@xc5;DOLRggCsF1M zI8{odcYvhMLH*rGa`4OOR9=P+{`4Rsq&6P;7y8FdY_ZAjklhQEexQpcI)$uCkJ_(% z{o?54TRQowCk=ze^7qyCc>P{{YxTo#?v3u_EM+XD?;l^jSVN~{KpwVinu}I;$`Hybu!rCcLxk$x-P?QtgFzOf_W}N8iV;Sm zKfVTDYdyXx5iZ$GoB|*dPHv)NJf-tRVVEN3cM~O(GaYpjIdW-otL0r>?BP4PaK`LM zX@M>dr}So)!Vd91P+qLoF2y%H+S)d2i;Ts}pEshF)&_jBr&6Dx4G5A=cL)B^cg7HN z`gg^!Wp%W*dYSM-wluOd$XBriZ&5mX; z9Hrf|7wDoS=hb(rA>t@_EZ*Eb|6=s!myF!_0By*JR;zN^e6hok0A%=MaQ)v2*+isdoT3@acEduK19voiGHLB~@+BQd_7F#_xWA0>- zc-_uikRUU7_097IZ*Xk6E0ebM`HpG{1ke2&=h8qYQCr%8JhfDsS_Q-))wED>gC5=(2g1i~ z{~a0?nwR$w<$MHH=4UB6vTrFa?9>6g0e+C6Sx9B@EAsp(qBywm`B?1Mm%6McR1~ys}4-g&lBti_LVKJM-S%J3=wzfp6 zmE(ejF&JlndxHxJH&{+Qr-PiY`6>TQ=K4_>ZM?8~@9v_8*-3 z|9`9u(3>^7>X6!WYFPHAagG}(yl{>g=$BzJYw(IO?;;fSDZPr9f+bv(WYdsECL2fw z%r_gb$H$u?t893+*#Hh=KSkt633&bJ=1k!(IUImVAEJG;;cW{;;y&D`F0_zl9!aor(7L2#XQ`MH2KU#=>b=};8 zf`zbJx)2)P8y0FlpQObhO7Lt8;&FijFQ=lmARSKA>tk%c&n&5R(81jUa^1?7a+C9# z>XM0++izhD2!{3-v9|B|%Om$UWi*$=yhJpN65U;g}Uyzc(I<^H@~A<3m5 zAWm(uaRK|bk6aLRmUweI1)8XQo@Aico%kO;iMf2s$|J*TCm8J2PazrD$UN#Je&oIM z8AP-%rlT_m&3Iz zn{U1|Qg`4d!NS^~=K*>&Xr`%W2nL@eDcn&2An*`#T&_)P&Pj{}&X1&KYLZMsFvW-MRuX*3p_&tSN3y1~NBWok#ZLZd5 zc%WSAeX`8+P4wonz7tqmc9wyUKkGgHWiazBp_LFv2Ctv(vuy5Q5+T|j&e`v9 z9ChwGu`R?4`McWQP*~;3g}=wXB$3|8~A|5Oq;+cChkxexMP$2xaZi zc}?_yR>iHiB1>GZI2s;{?j^lC|OHnne4Zk%-}$w_tM~z;Z5m&Nu}zyH+`V>RFD`c@jaB$rHR0 z&tCmuuOmiAoqa3L4sz(^gAVqi!#~JWiv9*mL7bN@FzuXTPq6)gmW@CZQhvWDXzzCL zbvYlK!~;UlfP;%o#MVp@EVi0<8TFmmDf)BJf=y0CFb@|%Umm9ZmYRCjW;BH@w#ow~ z%#n>`rq@f^#PA#p>}O1TT9a%c_wrlE9f`0qUj2>$!OiVb?Z(g%j)VhhaW-S+rPc( zv`!p|>8XkkZWj}cl4L>;R)w0~c)GO%@Fz~1;bkL&!+HN5o zHX~4TEw4Fd(6+Y#BlZNN3jOXR|0E%$YEYR@YmQ+;YZPYTRHS zf`f(m#21%=q{pvNObd;diav)-CNRRpppoWgEBPtQH|b z)_VQU`h73K)@gIxx_7I7*dRf$!^R(a*!W@ju*Du&MM4Qz4D4VIATBKmlC-ukmE?m_yUHLsydh*bj)RTSK$ccF~<@Z;wN>g8X@7MQt(1Q3M#TYHd%{e!nK-o#q z37&k#3pTF-2uyI=PyNdiJ_j>=da&#Q1-S)MgH{A%B^Nb&nWZh*@_VmkNeLQ%e`Vun z<{@Gpzv<{{dbl__fpu=C9kigwZbbO%6AoUsC0#<{5Qkx#gMMA^X>2UbU9KV_({0kDkNy_Yq zf15T*(I)w}NWz2}UqRQhBS|7V*P6Of8IRvNi+o3R`9ob@ud<0N`LY%BMKDM9l>?W^ZSGMk~j8IIg+<0Cff*2w5M8eH?=+^k%$ zG$D6xekqatKS3maU6FfhxyT(aF!qZpmz-_jTX3sPJZ`GOM1}ihQr#~OazTLzQNR-t z09J8eBGgq@gg+$84Uw(BNF_Cl^=2U(!^8h?DIdnII+(M;k`YH7?2wv`1CEa;blDx^ zSks0n^)3Y6k~2KEav!rlElw1`#b7Si$G!CjEpy#QZy=izs-6O!sqKvG|3YYb57 zm{#K}sO>2gc*eZ+j6@o^D(cKtH*tt>6V)@!vNh7l#MkmU2^(*ks`w2>bx!`47GN8) z&GEnjK|qPA8#VVbrPMwG6g7=9_~Zi%89`&wqTO#6MJ`?cT|`rUyeMz2-(hS+7558? zVwN3JprMM)zd+MwG|R#3O-V_V1k4n$L9ak8rJ_!8&@gn>GjF&ja-q;get@kb4lh#4 z2ZGs2euU9dMN)Whb}<4scZzdXjUm)fgq_j7w}V1Z<+BK@j4W*fCOo!;7)H3zoWLv0 zVeeD?4>VOu#{$gmdtgHED4q_12841}8cY?-fYbN)Zh?1LYj1sj7`Yf7fUo_SROWru zTkhSerYq$pXS!X@gttZC^t4acMc>(#?cJ$n=Ub$Y$7A)@lm2Rg|I6pJwRg8#hHfcc z@x5v$P*LeD_p4cotWV}gV9?RrF%;23pC-0v@Ts-;+x=nmSxBQTaLudjY0(1Dyh;*! z@b$AP1ny(UbTl8iqO&4T^!jVRw$PfRxe5>~V9C=KT5mMxWElWve&0fqjpoe2bgtfh zDjdD-8+>np2EA^5wDAilTAS)`fo`&{f@Iz|C#z2g9iXME)`0Wc7Z?dRAInBTlV}FQ z3Jn~G*^Kn7^&h|d`w9NN*?zkH(?);23jhD+?Yp-t`2Y9s-1`Op|DO~86?Oo<@qTPK z46lu$OPK7TP@boT1x%;t!GZwCm#wr)hl|k|g;rd4@_>GJ*m18=0pY3I=Hv?if%h z=H3=A(y%ngAdxZr_dA3D8DiJ{AYl80=)o${F%g)qU?0yQcAfZ(5&{)Ctz(>+m&v@y zKJ489Y=(WB`B&LdN~3?D;_Q<@7uxnf&=HW@aOeT7f{lNBn3LkRKA!*u2k7Oyr)JW6 zkcXVXNMZsK?n(??8{i1A!r_yd7xUnoYT=0%(FHlUud;)?Z-8%F7S;s!DcH@JahsR_ zMzlGWh=gp+PI0Wf*ktYlM4fbVxAJ;%ILVGy!eNl{7{guR{LC<;^upA@Zl=7a^db}$ z?@iND_)6x#Fr8ax5MU;acDJ5yz4~^W_9N_-8!*F%hFrEr4_q^>0mY;nl?H+zx3PbckUJRV611~%gG0?ac* zfp!ElGmu$<0Pj@9MlLiQjy0I25S<+P4TWhGqcoewZZX;%`fY<9Oh7ka4pq506f@^Eko+cBPgqo6G6t^i@`b_~9$#jz3LTD5xNG!BlHBo*ya>rwBY9hT;nsa-y{eckf)HMhxozt zSY-m%*(@uM4x2NC~P$zA7OV zaxj#6A8kB@APZ4HD)LFXvEou!OkuDWTsh0fD_~4`v_QeBxws%s$CMKOP3YD1L%Q}8 zlYdD6-M@RciT+!^cXz!)|K0nA{`=>|fBFiwm515XaMkbeNpH1VZ3=fk^aJQ(fO~>) zASn(!G?176A&mq+AU4!;TpW^rZ;m2EhZ{vrR6@>q(dMudDF*n{!P^*^3?jHeRCwrb z3oY3E$j?Pu9vLzW5IZS$tU1o+6#*4(R^rh|v#^K)%9{Go9wCkKf-_gy&?HMG&(pKv z@I{`CNeYdjU~A(_OFxR*=*});@#fC+KS<@K&S^dzK6|yj`}zrlwJ+yps6}ijjWX)& zBnWkc?&@%byC|t1710R_R_c*JiSWq5n+LQ#RR~w@9PY&vbFtca+eLNtvk%!^rpWeJ zys2^|H*r8p6Y**{BQlvy*u}U z^MCvHy<5MW|9?*WPs30DEuD@Co@c~f(Ew4oNL%`0-ym3~Hjr*Q5OLWQl+#o7q2oD$ zk3qHG~w*!@9 zAcT@I)D#1+?PAk`dw=Fk~E72gpMytjoQ2*(6uQ`j7)9Tv?@l@_gfBJ zkI9`S;#|{Pcj_W!nc-^8RXCWM|0JP2fS6Y8e|LK2=8EVH%;$G~O*(eyCn}bL) z$SpjS*4;}rZmRN{@2Rn~^zreoVR^=V(YDpJ4*MZ(I%IUZT&*P0Ht(e{a@VZPoWXQT z0y4-lClUV>Z@#4NCv_DI*hcL}#WhXdrL>r?w;*t>T||8S?KOi@#zn$7Q00-mYTBV_ zEr;#^=r_n403};^d`l9M30xW4Aljp9ZWol&nG$-l)Ha5(*%LlQv&rHF{Be0RBr-A3 zLQ$2)ddH!0IJ9ckNJCsBZOyKV=kl#u58OwFetMs!=fF>bxjFV2qJNf^!!NhU6NsYD z$3jA`A1w+H$4|g@0+ttKa(sQ7E$KqOM-Rq@ng4A1xJ)s+%YDNO&mU6P6svFYnIDg5 z5?Ov`1Iq(A%0uy6$cyX*UX zfzR?(3_8){1|*6g&43Ak%733`e_2FZyWefS+5P_an;8Eho6StAorGVJt?AJKoN47T z99xrKtciPq@rz9dkk^K1VxF7;Xz$TG!Ww2XGLpDQk$GYPV9asa^V0&B9W8h+=pIUe zbVig<5`Pj={=hUnh42^n^LN5V^20bP(n*4wkEm=GiFZ_+thjieu@n~^X-vW&wsyC^ z*?O_{X6xCmAq4h@r12O;Lo@CX)L?*PG&D4Ws zSAoNP{_NGWoy`}cm)lRbzTJAZ17rQw`Q9`KsP`CzCx1&-MScaESbOZZ$>S-|TeUNRj@zb}^mt@fu{ zz670JP!2}evGvxhwOdTgp=Z;Bad_HK13@$ENlMt|M>Lz=;`L0%@MTPul4tqW)Tv8 zPR-u-`iho?;)YZ0w;STNQ$<48zzJ3lPyC+}Qs2ALpzr@7^_r;QKo{!oL#UUQ)pTZL zsxhZT?*R7?Lsz69W&kS%6V>go^KPdX~1sjg%#TYJnBkMq+0pSu-;{5 zlflirm}ir+!zum%+L2i~`|HE_WCWI}Bb?EV2(Temyro^)k1j8%S0MK7RtCQEpDVpV z)SIs8P-$Uo)vv+2YqnY2smYy+hDNrQsrgI{WAYv7&E>Uw8EGjrrcnhSu< zOc|Cj?CSC|CWBuFII*Q0ac(jMMGPmkyokvV?A@2_E7rIl#F=cRQfx6>vO>gV2Xp=O zs<|Eq1Io|5<5(R~em1I}$KSu&{^8XK$-QU0gPLORre;6_5EvAG0}y$;2tYn)X!9LO z=S+_9A|PQ@^A==j)yfhcAY10HvV_gzUY`9FO$8p~%R)`*}Shx(D#%hh8D$|7KEX$_J7DX^g+_wHA zk+IC+IyKDm*$C$)=*H$WpFSaIs;etWOlI0KeowH1myB$6 z)%Av|aoxF2HFe$DH4nffy=Hex%q-pUrx=VtmtB0`6hr2fV2LhXav-4VEYSrU!UcB~ ze%mz6+toXj@kU3$>IE<0X^4G>_axa?$Vw?X1_c;iC*s#V7)>>%7BD)Jh)yDP@Edf;tt)w*Xsgb*JdJrLgl~G z|LMlRv@USD{_ocMo%PWE|L(n;_kYp<{pJ#5?x{q)Rd%fXH*!xD;YO6&X ztYXd#24)PD#p?qL<^)^Yi$avL_~w`i7!?S_9}U%a&iyox&J~V4MZ3)=W5XvusuY)O zBgwL~qB4cZhf8V!A&{zJ(`*x_UR@*8 zbfjug?fig;jRo)M$ZM(m=saWT%Y%%25_; zN~3YIOz<4E5e~2oDVc+Qkt82>H$0N+^_lImK7;7S&E`afvR=UQy zRXuM`lEef=C3Q#~`j|I}P6C@5m4*-uDlKZ0YgSJF3_2%Wh)Z+I4ybF7(?;Zf zv8)z6c~O0@!7^3#*>3@NO?^2q=y^A?YQzhZh6Dvou3b#8AW5n1La5Reb;g#>Rie`v zZC=$}^$erwp!6Z?UuK7b z8w@;7r6wHkBWIZ&{Id;-qgvBwo0`VgZu80SC2**D^^ZMU(-O6zfB6RdiR z9Qv8mDiZp-GG_GT2ZvVpkM&GEzUDM|i_Rn=w-}Q*;>bocl$--M$4fe=^*A-nwXRd3 zR+ma{kKz5IL4V+tBO{$hR+75ukzNj`OBFgE+T3K$f^n1#F*xnaX-&;jho|4%cINSf z&lHkS_$Ye%z-57`hM+1bLpMd33SkiZ3kYKcB!p|^ZVx%b-1A3uH=rB_dn+Y&a=Vf< z9Y4ZopODSf-m6UbvngnNOR}FT>F=w^(2l$4-8F=@!6*+?^BI)j07Yl`)58l(UE9Hh z7yd@K@~OvadZ#9LePJSIZ^kqOaj(bKM`O>D|p~1OhlDY-@Md) zsNpP4$bpn*D4Z5^G-^9%s`x6nSu1^dgT@`fW|*#- zr6BDJ8Gq21s2xs78}qa)TT|IfOe<_)-I?m*y7Ol0W2lTancFc}2lRQ79;2ydjwOTM zL}<*=uIY^F{Q!h4{UNbY(B=LRBzf~uz*wOwiyFhVndTgyBs3-iGFWX-e>ZJ(F+jxi zcV-R2w?RQBn&`!i=&QPPbzM9T*UDdauvMU#70qlknti*av{5HKc~~2$bHW>=*?=D- z8z?atzDNm}lZcbUGM_Bwwm{HH6e4JlIsdlGy_?FH8eHf0HhC~SGLuG&=^P^$4si5_ zS~SlQ`WXOnaFo4I3OmLs{p~G!1A$I)L#};oTUml*tTT~07X9}tqVfe(T zefO?SL^6k40G^SY_Dxf>9K}Q#BYWcBm`nhS+s7Fhrx10J?h`UjJ;fL!(0P)`q#(jR z7MoREQIfo&yc{bnb%bMk-Le`Sn;wrNHhlCvufYlBJ!sx7#>QBxaTBm*;~(LEm*I9H z5TIe#XQtAgc&+5K6b{fN0r3#NQ>N*RL2_!|^jeygh=jT}kpKj_7uIE)bJc`vYpQZf z6dg~J6PYpIfLKv}WbSLnx?|?gpu(hg%+=yYn3xd}%l_v7F5$Lmba?G>1&^v%Xq!9Z zbxodeM{x&lwFT#AyheCiRUC-C<{k$W+WDML`#eVkri2!ZJzgpmW)+PHW0guhu{tG$ z0*q=5bFqTByg1 z>cU#|G_};A9FblH4_Mcl`t&LixF*4yFY|Mf*NwX&skq zsDv57RKZ{Z@3I;)@jAS%9g}bjKa!iQk^d@s-KBok#t1k};_e&gzzxN|VxKLN;L)g# z)eWbnJpL{`gm&0(138Zzg;Ax~4RWZ3FLZc;8Z zsVv-t)ZJd1HkO6FHg$~g1u@V&fp4{~GXr^Ef?Ow*sTfiT!Saw++EfBLp_u2VHG~_x zDJUZP{1hX%R0wWE0#+F=c!(>cnq5Zj!e?wcZ_EEkBFxoMM~B%?1)a3Sn3802Yd@`x z)xQJ&L)A3$%UOY4h5vg0eu)2Y@BaGTU+lkrCiY)D*8baE83~!#+Mu%FR6H3YA+}~n zeWJ)_Nme-gg)wuNrYiIiIa)yI;v=!WT3s~>0Illy?Fj9S$bH%{(;qI#xPVBNHA}z% z0ED642rU8G0oGwD>nP8zh^l>1Yh@&6IUGoV+Uk^%5ZIn2gp3puuu>ei{_NG4UQwS+ zp;mG8wI_3Kt}-)}f)OervVxv7bcLD7ssV}3qF-wV#So!qK}4PfmBMr1%*r>lpn0TK z^{N5tqz^^=5`Y9oUq*cyU|*yseVMEN00}m$H6}ehwA8l)=*u8$boO1c?Ux1yb`h+S zaNs6uNKZOZ9EcIy?eV*W#wi;J55TX4o#72v0VPReCdIBCCfF0O;r0SH1quYE+qN3W zfGsIFMg>aRnXJ(6%UIj5S)zp~=J4YSh)-ux0ue7n?YWpK({bc?NNdDM~ zPb>Ak$i}P3MP?Ev7dA{DY&knWPQhgB!nU3~---?Yn#|I!U8MM=TpV^gtKe6-dh2PY z*W)k0!Y`d(48PX?yt-z7c9dF@HXwMf&I2x zRT<-)2*U2K%vJlV^5IJKt7wnuRN6{pW<}5SC>swrQMEsC+jQVICS|Oyac4N}SnFQ8 zZxC?StzPx=?X;RpEmfRLiZ+^HCY> zuoWykj7*!Tl$7eD)rayen3zvyfgnHa4c8B%dF$yv>wWY^h`=l8zni!2-VW%$`}c4C zV*mehq5n3)4kVvmoPpb)fGxjE$&@~dKx2-ESTU(BaCcETF^%^iV}O|i>2e&|D$L1K+KA3 zf`;OCuRvCgh#E7aM3|e+o!##?UyL|xiMjV~tJhf@1%Z)WL16iBwHc;ieBKU$d#o{W z9~%~DM1@Am9Nkv~Jc*7MQ_%z%2FtR{%q=qA*d=fj-@gN7lgRn?YFa-UNyV+I&H<(L z>{g{(sHr*vO>=*EWSGU1yto+ld)1~q;lJj1kIC{%4`hMdBd#`CJb*YgA=Zs{7PA3$ zLsC1X>PF=J?wi?MyIt#8UFLJq^oUs7Cf<~2@MTPBLq7YbFsW{pw6T5t&IwGr6^wu` zt0t+Un&2rGW<*N)q_a6HW`&X|9hE)`ZA4^YIYh3(Y?MB8@{Umh#SmuiN+knf_o+#m zDBB6g03pF4g<_gR`_qX5>L#?M>Wo9X6k7+&=50oZ=yO&|ALy4(_ml^iCr~qRJ|_vV zO=+WK&ZVy(u8)>Rq$&>{xUedb6_Ka_Ei&!LR@&yOuPo$i;(DO5J}~ipxb8bFw~94; zuemzOP^+|r%{401zec&BKA9QA4|t%sd$dY6st%ea*rLud!Kz!1$>tSQ5oBUxWoy<@ zbwXHFw$CT{!K(0WzqGPmK8ik`)#tF_Dw|>Ukf}m`iUz|l^>r$ur`a(|OW-QLDD4HN z&V==c(5Xw)qeqOTS+p7L>25v2|mbdHEKzNd{NAt*tA6^qTd5 zV}Gm{5@0kKFk1{w$sfer2V65r1|^a&nqg#Uv1eAa&SJ4`=Rcgn4X?Lat!pab-&> zzZyr&dFQIW2!-oa`D)B>lqNWe-r-Xe+~|TEBNDgAA<0%>^E8p?J7mXmbgB{9>Bx%7H;nZO?a1S>Vc&`P zESUjcewkeIK=zWDx`@D5-9%oW-oAfL1moSSn};~G#~IY-a!Xd5Y=vq2ctKZ}aWAC4 zZ9TfpYA34gx+hslP0cKbS$%I1z6kaM!Um7%QIL;3$pdA*rBcZxS}>RVt|`)M;M;!1 zUOxUtGG99`4grQlw0zam)+Ff_1WkX>!7XB5eRC%JX3G&gIosK}TxhqPgMAU1Hn*+u z5Zm(OIn#E?rFLj)Ycpf~5ZJKk{S1wFu|vHjexX;;zs?<1Q@^zit8#3De`eF~H~98m z?cv*$<0x=jta|M(X{F+=TXCTk#fVM8Y23TX1M&MOsq6c74!@FmYd_S9>D1et8aj?r z>Ye>Mzv&I%88e0*XbrBoGkV~VeW zW0Yk2<(aUYnO2_zW7Rc#ZNN9L(zh;IQS0E<^Z2pHio^9@9&e5=FE{X2P%aDq8LhR~ zmiUxL(bos{DNVk#Xtl~zgl#A`Tt+tUf=Z{itWZ45XG_x&LKLcL=#(8d9`Deom>6AJ z$eZ{=${Bwc-K^a3FCAN@9RmVN)$my44wG6AY%Y;F&_xj6gtp_ulv>ZT0mVs!<#DFS z^lc-2NB7qL9N&2KHtxPX@AuXQ(K^7t)@NFp#pB_s0tw{)tV5Ay4teY#uOZ-R06Rd$ zzdY|LgeEsnUSH_;eq{OjHewXbP~#1T7hrow#KKtDMzKJslr}pz+zCdrU&eJ>iGoe# zEw}P^y3&iyLop9?azm(_hUx5f;~TxVFj<|q>vo&gX79fJcsb5{Z_68RFS~nxzT7tj zFXJ0fbnx~Tmu+NyU0-#bmG=GI4<1A-gZ4-7mj1MY^PxZKmc0wTw*9)2sZZ_ig{16~ ziurgrITf6b^aC)#*<3F#ZkB;*0z=Y*x0d9xHT@d1FI$AcBQyWMHv8L}6?pxxE%Wx* zavZC^V z`GuPvI(&iP&$$xY)9B_iI!_Ct2#NDQywHb{tYU*R$g-r;l9|D=6FJFGbn5p0+>Q42 z@--f}OE_fxx0iV2V*G#Qjjox&%eS9+HKQMK@MMK=ylu@j^X1S42fKk7E_&`#&y<&25{3pNv6AWd^*MuXY>dC=A1f7wXrZC6ek zE=|u{6$dP#Zbdk2?T=W;r^_gg<46e-)wygIJ>^mPE}Q9xT?Nt@kTOL@Y7lIQ_jKBX z<6+%~968E0&QnI0Af<_FgIrR@w%T-Hq*^5bmnZUye*Nn}@Mb=I^;Op+R4*^1uS8rS zcT=OJvGn1p)Ki?H8j=mv#vY<^-0XT_RYZ>dsyJ*RAMXfIBu7a*Q1Nf}=bM#Rg9zkA z)P1MCIuphk@T$bQl6+#djlHjksWZ0swW7*Fr=rC{SDi|g%6bhsgAo{X!5om_h<{wV zqhZxCk`}Y<3+{iEiNXFh@5q@AjX_l5C!cDs)ibGa;(0S{`@0%4yZ=x}^@8 z%opOA6(w1z_l}yrvLGaVmuf3Z{*xOy? zc)GWnZ}-+(yukA!Lpi4ZMni1i6@G8XRd^#(f=)x*I4Acy9f&Pv?%;Y6q~wT?^63%i z*mbU^ret4oQIq@?9DwO%G<7439+^M(;u~-G*P>xG{iI8bQ^N%riFpa* z#S}ab=_@~MW``V|A_$Yr8WVbWc;VBlr%q=eOsEBze^SNL78>`}%G7ZD~5D zyf|I%x24Vawp{a1pfoQ?PmfU4K6KwPwg-|{d=h@K=K7i2f6eE`7X*R6!v6FA?fW7A z^S!(Ge~JJ4bF%*wt8WWEVYsxn?F4b*>A&nbVt+F3XbyP9{7Fo60;4cc7%sI3yIpS& zb`8U?TFbA`u;khzg3}Ej28r&t-Of&@H^9J*{QC#PADfr*FgNeGNi{zo)fgoe=gsCu zFcC-w9OmN-wl5m6anS&qUZX&e3}4bO&ijn3)^-jwAk0#pGY}a?T!~8S-fc$|UtzUW zoL|$A=DH?K#kra7;{0>mVm6h>x_JuIzb=vqX_3w1WCb=_s#Yn;**Rv;#$b?WNC+9{ z#)fvBamGaGJ&c|(JVTaevs8`CBAZR;fPqOmH14M=Zz9R0^}`jLsv46jy9qznjEaT| za(bwvVnWqzw47>M{6K0iHDAM!%4WUNRLbVOjv16>t{6hON%OL(A62WRHrP0c6G$}> zW33gG&C*%6dkG;PEn@J{uy#K%j%^1fu2joZUzcE5Q$hgO#Y|w#m=!?r8^oUl=A<`3>Z*v2!%k{Ko_Q5TO3 z_pR(q_=3Pg4tFWTx_T9Mbe2w}vrvC@h9CS4)W@25iOs%UdK3Cuwnx!Q)O8k*?T=O4 z29T}|trGXj&F^JcLFBQqsn>lb5qcf8dc~s*{(tvZW$$zR$SQUe<|g33s^$|{njB~| z7udc3poPniH3e~FxV{ZY)qG@$K}Vw{%+(eg*D%(=nOkP3!G>2qOA`&xyrRLVqREt^ z$$+BCY@*3n;-6z8VV?e|TK1CXJ<+CCQawvzxIMV|F1Cu zDMhyi(aIjXS2Ep%o|Wy7wkh~goPP>#X;W^0B^u`~FI?#|XzahnDDDKNLVZJP_!TZU zT)86mY!;$i*P?JWxtO*;x;GgHw9JdNj?5Y7=;ViRtJ-Bk0Tuq_I@C(R+mdk(c-o1G{z<;@Q^VTo&pP!BVNBQA?jt5|xp_Wns$^in51(oySJ*gHR z1hKi?4YTfxfo{k5`R5H5^C+q=5C$;biRR?|qLRU4dc_hvV8r2ZK;0x3S{$4012F~T5Wo@gNWQ7yDRlmyu1<8|? z`3`M0RfpE<9*1lWKy{M?DkC=9r>hnKP#7`?p>K}z8HLO>8M#w^`mZ7Tzb_H^6||dY zxmivH9;^X@83r4XmC%-Ao>$}0McpkJ?(|*Hi&c-LCObm79%8s&qV>gt!X+Y|X3}G4 z26*ON-R!hGyHhJzlB7%R=@IMItz`8TP*lL8nVylSo)ABj>hLHb*~6;j_UzRldOyhM zT^N#8Yr0il^;y@;3PW8f?|YXCZUS)L8P((t(^N5gTj~7z3X_a-ZRvdKD%0IC7gE?d z+)Hrm1`D>D@u{MHg6u79D-$rM1W$MxQp;VI)Oxg;zGHowB*B4Hx}Q0Itb|?WVBr{R%pH;=;}6Bu{i9 zUMa}QnW5`h-fm5*I4H>EqE6|>nk#3UrF_pHha`&vQDBP_hwTD=14>PZN|K>|6RQ#Izb#SkRPo*yo{ zP2K3lUMLsUh;29nGf9vSryRNhy-d z4E|L<-x6S;bc~T12GNSd($J+zU+Lu9O~9MW;6J&q5}|_>dXs=ojd>Ll(fOOBGbe+A-*D4$L)90ns11lHKOR7<19172b`5OQJ5H;vl&r+{`2la zo7wByY+$pu!LNXAxDxZ&P5>_AhrD>lPdk{K0>EGNU_O7?-*~WQ{?i<{HH3-y_j^)Z zm(6Cg!Sz5f^6Bk#b#?XawEfZhy5h|4{YZR{0&BEodR@TuOVB_~3M;L65}l;e)GSh7 z_{b+J_zDnOD9%$WGb0mX!}&Tcl1L;Xw>%L78I%*-=5t)>*`eX*FiLZ&OM4On{^n$u zw#ICVtxq6&&vaQ7XBRxtlZ_SV^#kwRytL|TR3`cSXPM3))rONq6b~zjje=sAmys6W zn6@5?r-GmH(~=H{*UFV)A1RRG=Y)P_s#bzg29Y3j7ElCLtp0s6iMyyg2rH z7+ux{Fs{zS7U&4(Y3aX#jdw2WY^_783!>!tIb(*geM-3I=GRU>JpaU+rb`LB%X2C z`9*N=a5*v+=@8Z?^ih{gkG%|hDp+LBj-=?h1k;6*jBsbX6H8Gm(TX$*km{-HL*0g8 z)qn(oyokW0H9O9@T+>OagmnxJQWzWDuD3R>}*h2+HF)inG5~K*$7QRR))is8b9dkbjVvJ zYTa#OW!nH&S?t0!@V6$!Pu?63zcFjmA9&7-1#@B#Kn?$JZ)FoKMG*A!XVe}G#0 zhk6@ajBKYy4O1fcSCv%gT=i=_Nv9{~xITz(@%H-bl;*M~Z#Kn=+}rQrp@A3GaEo$m zkYRoBAnM{v>)eB)A?!8$2#gVKvgxOlUgLQICDstMtYBDbIaLT-RARUU8;QKeW-v74 zG>jbFe@fp|=EdBBWSQ^YvFFDGZIQi*=U|D5UrBUG7SPtlkXnkhP8vTb>@xgqW9v#m z3tRw#6f?_n&(jW6ZKZXmD@TVHq$8>)vt;PPU<3(^L;^ zS^9mcj=Y{ec1sK<5GRq7Xcqa0ot1s%j26rY7OwV~ItYGpf8B2dq`oOoouB|I;zuKm zIp)9Crqt41*0>b6qWo~WJoC1I^)V7=^zG87+6jz4S8))bbCRaQi;hjc~nQTZl1Md_XSUEet{*{}8uzUr>QZ`U*Ub)AkqwwgbB<{b!~ zC=TuUQByac_=di&em~wu)#A5m@VoCzaB6I5gL|quR-HLz&$^wlhq1m(mo-46smsvLJ|e0uaa~s12a<-f#o;77YNrRC&YoyLq9rgq}||Hq6!sDwwl-``RXku6c*W=1&vL z)F@M{MwrGnOWuwl*&(L{g}tp|Gi~@~{L0Z~%yks!_FBkqy-Gu$HElK64`LP`Zo2x( zgJ+C~=3~LLo`I085v%xgO_ytRkS^9dj8Xln9U`V*HAbIwsU4%^ zop}H{t4{YuiC^Q-8=o-S16pzUQ9C-#hc^vQ2od;i?a(ZD&z;s8D^OTAGYCJv0(7ZK znoJ|HUa1a;nR6VC{kwKBifwNi3qP3>W+WVm2m*K@DqCe7lJ&a7Q2IO^iub#AIFRG2 z@hDoOc0gK-$b(XO8;%xyyZ+I#&+pNhGq7rUmE4R({j+Q;7L|RRfWAC5XorLN6A>rT z-1J3BxnTE#({y4e2Y_RQ%EV*_MXu$kVAav6lr6%aP*Dd=i4Bi|(dAu{1RYfJLJ-ZO zE~+@ejuSCO#QB5lY@jSz42I=gn{`{lGb@YzUzP~5+re6KwQF{SxW~5TqqXd6>s{fp zF?MB5PR45SML}WTL4lugU%l-+VC2hCRAg<|hzx+@FoBCO4Y^?9{ihyJK6kTg-f5J#5!zpRK$`PQmp z71)c)A5O(OQxY_Er0Yy*WT~t$C5variFyW`rdd?48~&u?{ma#~G$VR3vb%&1j;%Si zj$~mAw#0_tWUO7!{35bOetv(sgf*_bY_5-kpa+dK)tScdZ+_y!nXdD=YF!~lRHb>t zEv;ZWZq@%%47_fnx~pndUNf5hrmL=Ey`Z4k%!eFXonI>i8^fE!X&U)wGf>VZnZE;f zS7c*&e#w#+h4_r7t74o{03Z>4TR^i^`CM9xSiHqFHvdLf@SA!Xi(kj14=mDv9dpKm zmLFoiHkmfbt3k(-Lx=NYG8`29{rdc+y_~ax9A?XOu7SJDv|CY?wUpE|U>B|Ilg)M1 z=5{!^^|7YRjb1um0A~;-vXVyEL@X+f8kIe6(qhK2@OsHfG(Wec*%ZcF zV!A#$yXE@R{5pYMmp7ZHfzc&yO|*2jmX}e!n9mk^hca!?rqdhjtHcggEE^a>HVqBN zlW;np&qj;Fh9FZp0JnlLQt9KsX0F<$yn@4Q1_OOI|KZLOt!WAj*@Ab;<)Iz6lc^(% z0xNE7erPIoCP`_8Qoq8xalra+WM?Np#`2J`oMLY1*)Y{3iy;}u-A9)$@pG1;kgcM2 z*vF>O#+^nMu6K;aIc#N1rvTvQ$<=x~xrn+5jZ`v_cxi65o*QdE^$chqs}HD}5@*Z= z0>V*e1&9}v`Dd3%rs?^qnpS>~X0<$cFv_*VmX%3M>ps3FzTqUr>zh$wB}lc&OOsDi z1^sR~snmi=yXb+Q`=oo1xMHNBP+H0U9AFvFI&SS!il*Y?<)QLuFICEeQF8&;+15N9 z!cSeBR75GB2dpefvkkL7q~yBa@<*3kB6^KvenA={R$e`DyiQIn8FXblzxSw14dg3gN3Lp%lP^J;4y)KO&NX za*lRughFlBnNug=h~ghYkvnN^6a|`bwu9o5m4enMS{FnqEGuc7S`@cwuOLV~S$oIj zss*(O&@reWTO>VaeT)90JWuCgSP0MjH;w>X3ydcb;={blMV7L7$#WQP^8yX5HK~2P zDI7dTR-Q*lSJi}MW|Kbuoe2HUn^m4YI8Gkr63o>q`EFG#r9BLzpj>6j%;tB~;yK`vf?SAM4<`=& z*Xg7oil=5Fk<|&7MAQGSqgAs*&w)JlZN#w-)YQ{#T~WH8M1ONJOJzhlhzYpbgMik# zc~-kiKBVoBs)tt*?r<jiLr3JjF}&SXz8pSGe04XL zcDp=zqk^Lk)z3gH})K?MgV%_K>=_W-Y)r8an&nzI^kRm^Zg%Lv6r9<&Nb zq{hF}DWwAwfbjD#=QLH_-a&q||i(!XTXxmt6Pjd+4#rR*d)d?8N z*xkRFg6I1-Qw?VD7Z~*@TAWN!URI<&ZmDl?g9fX%4|U!}VWQ_ZrIG_k8Pjb9^$|24 z*Z^SL<6WAHinsMx^ephc4if_$dC{oiEeSefzJ-G5R8`)s+Uxzu&4W{6cxCL$)a3QG z$~C;%HCyz{ENxNGU952Qy?nKzab)C54i0MxZgZ?bh=%`bJz~pxSp!KZD)I(~tNV8A zk1wAMt(}Fv4T{wC>u_@6;$Q(z#Aue6=xRJVT$rmqE$2u<1*g*UTedb5B$@fjG70A6 zrDN&AQk%^}&osUDRoC|prAS{j+XSJh?0R9~yC7PkXRL9>Obdtd#U~ma{eyWLh+RnI z><1I9oxsI*LrC@JHcV0N*sm|*I(w*IRvI5+Pl1%9@W%iEn29rosywn4cCSDF~~d^Io3ss zbYNVb3xFPT;K!npehJd|UmpM6`saL+7=TyB|69Kw;J>fmzjOEYFZl02m-v6qY0O7$ z7c&$G**;E*nXCsDzgY_^Zj}Iv4!I1h*M2K+;0?{-zhElM}XojpX&>u z-*8PS`@Nx<=X4d8^%85bQtj9kg32K3W2=4Aq6+9&Bc>^4wpJiL4<=Om(rR#0ECWts zGQ1G!w8_6WaL~MFgg*x?4;%*q@{zVp#~pgG@lc2E^J#Z4kRRLHu|L0ZaUn;weW)th zBXd_T)kXK)zoL(oAcPz#3D=}8vSrjCs3ClQ@Ii6$u^C)58kWEhO<1)-^A3?inqtM! zDMf}9t0x4kvPTUoAnYPlFf^>VCW=)hLb<2%eOwWKQ8c*9=LWm4<9sn4yXfsoi3NyY zbiF*T5wO+u1?#df0shu^X-@a3?Ogmx2q2O`FJ)JQHVU#!9-PdzkbW#)PaRZGHLhXp z{kkm70p2G6niZ*?aSD0Yuq>foq9*ZrasIsEdBfr7gw6Br5(O8sG$fvVM*qREcr;iM z1;Z-I{$K#VQ5Vc_N$ft>xGl%< zhty1MnjVawPmh_mP5!JEl)p>h*npZl(wyRnUk)joxMRhF+)6B0!7* z><+6?6hvKK!w%r8Ix2P^zsQ$<&hj6Op#5dUKUc_q?%!U&bu*Oz+`5177x~Z6M*hR7 zw7?@kAWjOKfHG$=^*GI)70w{CQCOIE8ED{xR@<3%6o!S)3W?WZHEiUci4{nd62Y%z z2Zl+jEnO<(icAW7S}&3kZ+nP@mlXJZC>9Bk6(QgnLr0shZ~pZ9*{-=_e|5em_GV;< zvaivQkI8%p8wOU|JS$-R0>l7#5)k!vXr7w9n2X^F*foNf17DCg+b^GPKN-E*dh-IC z+e5;u^BPH_j`?eAN+E*a@23_UzO(PW3tlaw-R+$>rYi3vB3+7WFLdvcdWo>+(Wm;D zf7;PNMeI{?)}vuHlHVo-p)gr)=;`#!xQGg_*f-$)3lCXxR!XFp(i!WZ0*_29F>ovr z`eU|Z5n4&YMh4P0LW8ENYsESk^pE(@H0`JE{0gTYni{huA_?D{u)*D-hHOGw(o$Rw_~v_5g%y zB{k?kdV%YcZ~d8ms0dCp-|YCIu!TU@TQk>kJ5`G6gtqnCq{6c7Y->r|l}4kkL6pE) z7fvv}i)*%P1yWImLSt?gWZz#y!9k4D;AB@jN?9*`WCX^X~i*H=HLIWzjkQe)(Ira=+G$)0v<&-?d?9ty%;m{)DiO zjHErVxE)D|U@v8V;(g^vg-NS{CbJ-;C~ajL8wN4!$ar{(agKE!GjSk=L)He$*)aLr~elf`6CZlofm0y?eCSIsAS7W@gX zg4OCUi7ud?@*C1$`DP%=k$jcQ*#D~hfYevz+VyrL$SrpU1%xNuL=JkL^<9>OzncBt$v4_HF>bfJwsz9jt+EsPQ(G4JW_l$I}~H= z!(>WeLOFRJME!T$j1wY3Dm=|9oAF>>^14~ME58hr3vwXVfRQTD6+?{D#1NVz zzhxW|k0Oc+kfx`rwTQu7>juZ<)FLzjt_;yC{n}cMP+jSyw2eql>snz1)e35AV>=ai zvx-kqeW)^17QMKm_DAf*C-Gg&T;68KA&PaGu-}1-tG$@#U>^n1Krbvsp~Dhlfv%MF zcBg!_y2_e3lYF5uCNV0z*eXy;$3n3UY=zFW4IJxgkd`Upi?#H-UR4&7QTItLrTQG( zk=u#}&QM>i7(zJZ)!Wf^z)F0pmr=CgY}{)vt35jk7DdbW_VK>i+h0<7JX@5felHvX ztovHKO=M#G7!Cs+Pk2Z$Khd-9#^CgQ=;EqfTIN{aS~8e3@JBnj4rrO!=KBv%6O zBFhq>OOYjz@Ft;>#50LG2xI5kFe4(47$7&`QBucwPA)+xeXvxtv_a@HE zOcW;0R_JIuzsk?A&U~b3a)v2R@jQD`Uey-26YHHoJ6lVRVB5U78BCwqsAiKKy+aDc z^bqDT6Q(@TwI%L>mgjr>={6oalQ7E-6^CFEQ74?>4!{YZn%<18%OZA}6bqkEfss>> zL;yf0%VHJhaRv_LQD>*4&nT5~`Kqvi1d+1gzwUdc+`e*dp-i5>g*+aeU5;x*?OQLC zjwB`zhT5@V7iv2Vv$fILSGFq}1_xOUc;{8MUZ>r6Gh+}&ap#B55@1F(8G3}3>U0o< z8hi4FmHOejD@B9;w_LA(zm>8%Rd?LbJZk-M7092TH;v32c7}-t%NO|R?#)r3>u6Dy zUlAYMN6K@gf}m>;c=uv_lS7iuj8v-jmOo1_L{o`4CnP%;r`HTv23X$|0#1D#%1X_SrN60gE0)!{N4=r|Z1Ci$l)-z?N%U+tHDEWJX?5axF(%AKoOYf0=R?Z8j(K1bJ?13D6f5>C^yu5yZ`8X1~n%vMl+pC)B0 z;-pA`d-awYnMUjLPC^*71N|`RkjyaQ6iC3;5QMhx$dq)%*+C^EyaHmAgW$l%xqZSx zZbeLFO;xZb<&Y~{wWko0cu7o=_4qeYmv>OFHt#n{nH}i@zrCUWMBe?wOUY~gV>pVx z#zzqZFrsopw<}EY`?L6nYvTG0ad)2bvhjnjCW5RUwd4vv;~7n?sHW}3eKyr0Ai`-r z#khvC&?Q*C1s?b{F!7VT6yyqF#mpt<7A@NN&uHz>!+!VedB6AdnrB$2TxP#sw^yQ6 zxdGn3BlPxF*fUWz9^Trpzt+PjY$3I;TR<;u`r&$~o-CCYdfbisz2UH?*R~s9-%^;2 z!6^K3)H%ea!WPte2&R7Auy*v_=9AwKqocwkrUV&*Lb6$M^llCG-}H0zK1JnT2Ce)-A5f0m!Dgi;4>+V8GEPAWfe|IvKDX)gyctlS66rT|JrAKRO!b{BDz;X2|gIbRXWKLaY;^IuwAHswr2&J#r zdtO=9BhRUsG3v~JxPHP2YBk{SHZ>O_6J6PC*o=pjYXK$3*%;oq!*qi99W2~PJQO48 zRLw5xbPu?kGOiG4P4y{yLN6@znzb+7W!t$lK8XiWKo2(TxXFYl~VkA%=YRx6W2uR|{~QjOV$|y<^nfwJ)bmo#l5t zD#pkT@9ZHI5tP4?FwSe*Py4|g<1A{F*$`c!z{Uj-BPWggw3d+$=g40i6eB!9_=~;m zbZYSD_egEs)MwF|`}gfW+%aDo{x0?VQAD~bfrd8w%v>ngEz8P!?NWEtA0m|arLCN+qCZyOs-Chr*1)`2 zMDgZnO*t-FJt(b6#-bsBU$KSM@9DHz{Mt`dp;PO6v}xHMX88@4O*J~7j#Xk5LJc#)XtnxOj#-BDB;{8YyR7rU8`tuhZE!h zra0#SWQii!RkfJhy&|A0^21Sb=#m!dIOs;3ydNuOtUp&*D6j{OYHxPbxfs>9YrspW zSvUh($XfiD_*=Df=2HYp>!%`1shcycnw_ZTwXG;U+C#>b{ZL*l#&&H74mECo#}WAg zZC{+N^Ia#+cJhmlvd&E}vJ+2ij<1QaQ1fQL1Doebuxw|l5!+iTS?F`Pa6GK0dJ<*6|7|SUEi}+jnaQaQs>97fBLj?6 zDeY2k7PN`%7VIXGnF7T8c3Y!Em9Y(4#Fh*pB0wsJTPSxwTC;04oYlni$JyUp$H(k$ z#e?C-&c0)d2hC0hm%r@RmQ&V@H$OYXxr+eg1kekWO#E9W*p~a+5%pMHfQf| zbZ*SelvW7h{yrPe^8s|E(z2h`I8;ASW;h(KDm@v6N1m_l&?awK3dW5_+3zW#^i*xXQ&^EBiPEMvEdyK6P1fSS7wxMI;tBP z85=}b*q?X}SNHLx?>Jy<9@pLF#O&G%7ZZ1fuZ7IM9~y}@^ZbW~3lh>W?mGgF5&^v4 z!lf5aODX|1y4ScmHBr-3-y0vfuP55~CQ$q})1o+rW>NOp)V3X!21#_Y4HdH(l0(Eq+V6I6#;05`a+gvPblIW zb4Fl8VDJ0)3!1grxLdL`W@8Ke6~#_Km#zIkcMgew4UPa>V=luWYCM3~Wb86q@d3RQ zor&7SY|FTM45D3u7MmWoxDWz#_Z#8p`OL;dAOe*ZM46o5PPq|19VDZ7`=G1~j@AN* z346$#D;#8Aat?#i>x&uZx}LxWknBU5#3L6@WHxq*8bshyYiI*2)u4FvRv>(32CXmt z#Z-=G{v5!q4Uq(U1dccy*les%BBn`Py_di~vjQ^E#YGDNEGgP(0QPt#<`x*Y@yjO5 zz{tT@GPg6w^t7t&(}->BlYY0Q(RxsCEXwReOMh(68y~EQ(!$55=Q2fNuTQgJ*H6&9 zeynoMcobotc}XmlL_D?@LkW+|X7EiLF#tp+2o}g{Mw=#a`a1u0h!4M8#Gz_iVFw8s zzB_g|%n2AjPyXevDRx`88s?@9Son%0D$y=iWH*D}jLjCQAdy-LpAHs>K<|VQp-h{c$BV17e^pNw(Y;B+>>HwV@q_joo3nPG~F9q$FYse=8|8--l_qRR87>_# zFGC9*rGHu^YX>|gXcc>mW@CaU;ov{aIAAEi_4SD5h$q1XPVsJyhmRH%(gza`hOa~V z^sy6_2{;Q~+sWxRstDPIAlYwPcETVfOcPk`Bk($F8=x+2e;x9*j>Jsc4tSt9VJi^u zU`K;)lW%~AfW}pc*0iab@snzyEwyL$A z)}UT{J>H^Xib*Pg{L(z+6s_ChbX;|iu%AMaW`h9}rRV~>Tp(bf9fnS=O!L;QO1wHH z<-7EPgvG|N)vttaV5S>Ekh;bG^mt{5lZN8Z>+_o9m!K4Y?)C+bNZ=vgC)of{A8b$t zaD3Git4ON-leAc{&3KnNVwRqsPeL`8ABKpqnB|i}a#6QDcpAmHKem4lYTzx~ZL?GD zRK`Q%DssPAvcmxGkCu#GlO?e2cV-M;MZrjWDIB6?cG;iz-mT0oCUBHS6pyb zfXuR0r;*!fGr{=~?=xMYl3n2z2z&#L3^$jGvGa5Tfp!irId zUz@m;9>2&&ED+VsaZSrD#qcvEcxmbvM&#)^tFq0IaZ9yrz}H+}v>q=vHtw$aC;%wY z(>#^fo01XzeTT~e4s`*`73iJCGnX-7Zim>m(s0uVwCaXgTbi>%Ofp$zsLya{`5(p?4on@yGOgrz5 zC#lmuZ7Szl^qO|EXhMyXU_KViepnheo4Xh1@Ln(8uJz1c`XdU{{t?^R z>&i_Rf!nZ;-`H+BAG5ndB`n;5qwoN$N9zZcswX{(p}^rz#nueX`TL1_bhk^vACzN5gP`DNKGh-f4GFw1Q%;4 zq3Z(RCa^VRFcxmAYew5qx8IUbusKYaKm=FGrDZA|yK$ZZq<8`02--9ha^D%ci}6k& zKl761Yf|qbV?TV${Zz7zZcK=*dAcP5vU4sZJlCAyx1c=cD71%XjxJ5p`SFFilEJx1 zkJfFt{Gdb260~Tt4J^>)!ZE^dm0dZxjXU=g6mz23XK)f14)+BobQFXidWj)bCz{@X zvUr-$BFk;2MHW@~1_@3?Y29s9Mug~v7)i*cR~=tOz`||xjcd5cp>}xnxskFhEG&#D z%Ytgpz`jO#YgXuUd|@rvpS<;|YgnZ2FP7rCaV?d3Z-KJZazxG3WQx#Sj*lJ1`qtkx z%()ok$d>?5rphPB4z;hk+yjZ${%(N)E(gH||{sn&#U9{J_CQhw7q zr|+Dj5P!EI*1X+#>5eWKGJAFXSv``=z8_`X5>vY>7>9d^9BCuq{Ju}8)2!cD3-S2E z5-G;vATKUtyB9WO?BkS*=Z1~JXGAB7Y9&B^y5e-BT&(|y0k-FWhh+u#5oI~39V0c0 z(+iTkHtZH(bp2RA*0Y5iV%+sn4kx^)xB8*JVfKO*>F%?Av?l` z6qRY3U-$KCfe*e)jiUM9NVB!$UMGsx%X_zOS-`$d?f2Adq8+145d|-1)K)MFDruV0 z`JqK{ts44{JNq~vgNvWKicAJ6oL?xY_4`!&^j&=lWH67M_KXlCWRzlzdc<-BK`uy& z>!7T!A=#;ko0;}Tt4X`)Qv*qeW$#;WGL$I@jaT@uQa3H{FmJ4ncW?1sowS9{n1{m))t;ndfqNwg*$~J9bXv0k2&=t22jlMLG z*(zhRPM1X54GS-q?xczG4=W<};?lKqyFusNP6Z(@#eBfm@p~6bTdOY@qcZaW(dkQ( zTBmPa3A}PGrGA;Ez-xxQ1Kc!IDkBnJ9|<)huQwzX$0|j#%fZb36)riN@7vwHRg~5yf(p zpQjiy@&d2ZZ3#c7dXZ-D(|#8<;KngozS{;;@DVq3GpYkELx5wlHzzZx2Im4Jm#Vg% z0&S|SSIn106v(8}5;bn7ubXEa%rc_&M*ZzN5zVN3u*spNxDc&+L&i18Uf-%bJ;!Cq z1>3shJMaz0GR+xcZJ2h)w!Nbu?UvP=4z?l;b9Ncs$s_{33)pb~ex$!F=;4(qK4gKQ zIdjFy_l64#3Tz)p>|Sv!PL-K=Yct|5Q0xU9E!oK0!vv;hvxLKB`pzd2;}g4hM&$s@ z9^e_HIy({)Pqf+arZXF1N#LyFRPESUt0E4CcWSYL$dTTyk(-k?h-1M*!n463+S^$kf*%+!{V#Di=X29U7v?ALk9SUPU z`wpzf)NpYQKI9#fUAU_>R%b^qb=NEBzA8W^-?SoZCyl~wY6`Ff2gqv8#^PWXfR@J@ zNkV?E7`N!(^L)l!H>A^%NoZ;uue~~c6;E=h5e$^Uavtb*p?1qBm5TOVQp2dxWoXgp zs#=T#9ZFnUx?u^uub0M$K{eFiV|&S3ww$Y|m1F!DFOwTLIM_MKsrp#z`cQIn;=qJz zR8CUGZuW}db|i|V_^c(-3~eI8nv)HvOjtt>Y$+dTB=b~zAlO%|8(dmM+DUf~u}aYh zP;5fE7Y@{2ozH#f9iVHO&x^&Tz16UX+!CsVy zM+S~SH(-#CPC@9i5v}PhuRo${fa1$KHlTSR76*5*g!OkuL%UxTn14GdMSyTg>yrfy z@M2(D;4xvxoPtkn?z*<*>8$G+#Ck3+jk0hmR%t~C6t~?3{t9+Lc!|>2PZRr%?xwK2 zX94B_i3a*&RfBg2=!JO=_Z4%+vpud0cUebvq3?%L;PUI)rIcSp!bgQa0@&RqQvf;X z7j#}5+*~sXTKVk_2M@2$9r@6X>haQ(@diLgNX>`Wx?g5q@>`G0z9JR5p&iL!a+VyY z5;CIBTOQH>)wVkr55eR7L^T7}ow|UGI4~21?rTL7xUUtNuzi|kbm$Vf4pGcN%VR4Z zCKDa5uN8GUVqbKnUGXT7P?g6-RD{_G#RN2g7@|5?cVy?Dua^E z@%aeO1M9-^V&|W)w&9`;K{JojsHT#n{TeETK*^E}Oc8Z(zpnZ|r1!C$s@(4zraLy) zFP}Y6j9@^m5_VMIv|e-UD4ojE+Bt8{gSf=O)qD_g5GpOasDBZZYa1kh5!XN_s1@uC zecd!D2Aah9Sa}3HX2UV)Qbdv#0(TW|OCYCQ)W?F40fj(kk%C>B=x`Z^FMu0XwLoLg z<&X9L=fLWv6ZAy@$_(@6yZ)DXUl*Xg-f3*Y66i>SM;5sNk{&!BK$8QYOC-!?3pPo& z+s~%m?v(@yUgZr}`4Z9j|F!tfGPS=q4)o&q&kw%&_R%+P{O5-czWw^qm-x^B`S{P` zk6-JZW~*u5OD1W}eK}VrK~3&;a>&%5eYewYZ)5sx0Pm7O(q(aRF@!{W2@(O7Y;(Fc z%9rUfREE*F$y5KR3(oFgyGk{5&V z(cMrA7-a8JrdcR}En$jP>Z_=eT)*|hb4G*%P`vxOA@z#kA?pHi8NBdm%udT<=LvDb z8_W@JGNXu~eo;HJ?$F{*ZpZcv;2o4-u|dtCR=wiT1ViM41pnwJ1{$uat`54jv0=wI zG<>CrV~E2cJ>YkI?KcN7%AC@l2cSR*pj+C}2~G527i$vJ)Sbb!1_RZI;jiW%*1I%8 z2B!(={<{Wng5Q~%8lDF~>Zpo2HA=Mi!S_xr+BS8_ zg$mS$Mmj*WsMW^P>@)*obxDeP-&iau(Ayu4MFFo(Li^-~K(-=U?ipEvp_26sqa`!A z$*zXzWA)wu!^zDj0-|9T3}a{&4JCs0CKg0}80S(#atc9)7>rheU1}9#I^+;S0}v9; z^9TbYYqen+k(Y0p%!}`#zsj5y3x+o~+6eAZgJ&mXoYoi6r&`UVbG~|Lhq5M-j-roR z^)Twpj+S-Xd3Y&)|*d?*H0`j`*f#AhX?~(V7GD2>^r#Veb70<&}N)q5}kS z(h630TdYuRr{UzP^Dn)gOCnqZf&r9Z!%$$)19c~oaGq??s26$lgLGdl=7}20kdHVU zX2IveRek+l-hS}QyP$U-K@`N$&p)TNXAJgM-U?ptvylKt_hk5 zTyt|Or-b07n@tyV0A4_$zxVI~sYU&MTj1XOqh?CyVD22)?7B?!3U(OB;+By_Z(?;2 z^(o5YXgp(RL(R>IuNYz03EcD)jZ}b9N=9>#Z5i7eRl!*@==SGB0w_D=Y4y09mc~55 z^V-ntb!d!ZnpNg^f^jZkt`eOD`rpTstao2lV0L5lA{_TKJ|G z%B4p}9MyGQ{b&R<*Kc4n%u%fcIZb9gh5EcortjvHcKbP(2h%$l!#s}(&O)=Z;qN>#%-RNH3*J*FrLVC)))ty*DXMgWCIV4 zfwd(9FkR3=8I5~BHes`1*Jbt!P)XEo16x>olHp{x+f!;&keD-?j$~_FXMzo^Piy4# zaD3U4q`=Rz23yW4MPW}Ao3pS{>76rYTG$wfe zCpeLDNm^1oBX=g(M`{|TtTwfleVTVMY7 z@Y^r)zt3g=e+R39O}nR{#mw=1)^-WFay?c|FuV7`2Wx5{6Ef7`@$!_rU9TWqR5u6Pk{xn7Z<33N`$VV>sp@LPdQAlrB{Cj z27|~g_@0Cqc2C1AtlBlPiaP1_(mV(65;5lD{1djx)Go~MQ~RHIc`aK}52+m^mKal9 zzag7}!i>YHZE1?(x=^4u8^23Opvg;cgE|I69&)rsyefw2Ov!J_#Cwq&_v@R3>U>%GF(vXu=Hexu{yaoWV@kC zAk8kL*h6vC3j^N`gF;Qk zqY0I>g&`&EQbb$L!=-uC6By1y?&sMF-m1Y^@B-a>pbgiQ0!g}g`m>Lz&95UKSF8+Q zAop(Byti0zKP934SZ9rk3u$_azAB|gAl7Cl0lKxwqvi}_0iq*i(HlvFv`KU?tvYy{ zqXI~WW0r}zpt!_TQ=μ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%0A>C6<(r)X&3sT!N zcf`N0@b8tL4n*AqbSmBny=is~>Z0CsoRjvUX$?)Y6*awnH+hRUpcP+rNhFFt$Eelpp6R%zeVuA)DB57P@UykP*6p%_A`tT*uu892$3HCrr5d3 z{CEI?MV6`t4PCv?;Wgsvw**dI5w!u7kr~i)X<>`jz!=USgtzCx!n)7T*hozGM-A1< zd^%Fq67}grbStcrVy-|rWpMayy`RE(^1K>V6$TAmKILZ#+D)heY;fen>em!n!BKw( z(L`+)0ok{EAn@wjVRUuIOm9U$>>PX#sMZW~j^NaQcK!FA*Uw?Zi%{woetG~T9IJFN z(^VlJYI^Gikm;|VLyX4V*E_FY?5Ua%bG!^Uee132!`?n2oBMF_PXVTzVAC~dI^wXm zH0-&+ewQGMZ>j%(1^~%~_iX^i5lP&}3~y=7@E3c#sse@!-xXl;*V|GK47)o!fJ{!X z;-)>%x3^xZ(f}UaNn8%ztq*w{oSTChfl|xC?`3Vi&3_?gq*gE)P)TFuyuZDrCbO%S z$M!$FFLu%Ra-Z*dnL63N$Ir^Ox_59vUvm63p~~zWH|zW9{sxd+>u~^pcuX0FvCHW zDL~y0h0tbC1xi2#5PNOUZyD^NWBmkX7Q9Z&fz7N5WUD{P)(kXf zDQrV;@{4&~s|;Fk$*XX&#hh<1XSC#R4_E%q6Q0`^dj~8n zz@W7K2U?MXlBgah95xAFkzG{Td|wZn2nG*G0nE{<&pEoa&N1#LK%5q2&w_ipctZe> z2T=gT=b-+tL3Z3&DqqB8-0@LJeBH)LZMgj>93W5 z2N?!(^eGx41c2O!XilNDLc;-G-A{yOWOX*fnzmJwSN>8f4(Ja|?s%3;$R78Ya>L9h z225o@iabREQRgJ2={WsWmiXzfG43B(9Yy5LBfFDC^>xZdCQA)3wF> zBB2rjYlJ>%$X;vz+wf}!cFUbg%xze^M}>S+ZpTpiH3#*aHEq_2H2?N%)=gzCu^%)ekJ5T>VWUnmKl&QgbpxI!QP`;lD{K2dI?2u zLd@qzSI&k?5DIsk^vQu!uQ$;2?aV+~F+L~Rbj>bCBGrRd>iszDV-eQnRn?7(dUcp& zLx_aS@wK3Jz$2r3)HG|BMzNR9l)!guhvc_=FHQJbc3`dLI#^(H21>OV%2_ozVFT~F z^^K^BJ&Nu2!T9^xZ~*FX9s0UEpGu4jEAv92@nTDx@GrH94qLzB#&5j~hSPPO{x+@D znOae>jj(<$qVs8@E<+R$4=4;wA($k@`7g9%rscAtWWk?hNY>Y#9#=xs^`XvKQ%US4xbV!v=K2!Bsg3I_&7-pg5d zmQNH3o1KXNKNhN02dWFOTI=e6tf)8ZTutxly?hn$7GObJ?uk;Qo6C0;fJ{yQbAb0f zpfCz2DLBB=HkI&@G&82P$!I*v06j;Qef=^c=cY3YBZWfUh`i1e2gp^lPf-R?@OcR5 z@Oy;+*vdphuZt?g0HrPDCkI@JW$fX!fG=A!pZ0ip4b&ctM)Touis!~&Iza9A$a0y( zBx6O>jFhNKM+Dr{V4a*L??JwOY-AEzxYI^5ryH;%Ep9#c2{M z7?XaV)QQw?!6boDu`Mi3mrqe+SsCwpF@obYvaiNf8lovf<}O!PR~0lu0726pc&Xk| z{OMLbUT)O6PxVf}*=PXA+F7eLmb5FMT2yx*p|Cz$iPq>&o2b{~V+Im8Rb+2GAI;EN zi&ZjF)5du!}hM-n3<&Y{1!IL8NJ6n$GSZy;} zYdD_^v658!b;a_J*fFF7o+0Uq8o5s8@x6z4m)Gv9@rMMDBXrz`VriU?+=2}XF}AR| z!9#>iFW>7Ln}qK3HMsA-Q|m=BT4^$*2w-3oXfQB%z31+d0%RJE&SFh|(}{Kq%Y%-` zu6EfhI0QYx7IdivOEN3^lsSN}`}h&&69HlZS*ohCJ}-Y;5)0Ql^v8jj=A|H`mdk7S z4TUG>6WvnLbr2f!TclQPyj<->%dja|GgTpNgs4XQwC1?gQW^Tn4v&^s4=pMP5Ew1j zH#a)_ja37Y4(t9mc6K!Q719mVvW%j2exnnB-TyoKrdI2Npgh!F?$r;qsHT=K6?8>c z#)zF}R9%l%DddwF+Tf5dv;g!3mQ!W;{Ypo$xG_IQWxxl_duzt53n)VTvFyA+R;blg)J1t$qWx(UT=!xd4H3ngU#|WiykLBNg|DOOT>G3DLV_tLr z|LW0Kh5P@SdiCZ0|9Ra1?K|e1-2;-H;^qGPl#Ct|@I4&m1H6p`6nb=`F7w2(Sr%bn zOvU!C9FsU!YYkuhIG#s6^Nu#^@kNBc<%S|=+4mw?vC+y3eTk%y9c{LiVh|f#*ic-c z+CZ(A=FiDYGK}#=U;+V|AWi!SG&Z;plTKn8`aheRV6Zs){rex zyp{h+6f=_MJhoQb2$OB~--)y-)JROPxE(;}80M#7twvrG?=zOTeE0e-;O^lSR8=?S zR8AWCewq%cA7F&5dol-+sg*=s$$AM?m?6751Ydbu}0z5wXj zSgk8lkjkBj3kbDj0;c$oIM%a{3E6ami{vk8q!X=7%uvZfkxs6xWFri;Y7Lrt$sPp7 z5nfrLcM%i?ax9)LVCN9F2hAPrg)}Qm0lk5pL+dN;!*LUf;b&eJnfuU!S*oe z!G#ttI0tBM3F`$Q$>x}(+-`Z?T@odbiu$D;|MCQ+A|b4 z%Udmw(`yp*wa=fQ0x583OG?LpjfIFlveDo-tOwQkIdh_{nI0$B0D+6{(nk5=b} zB!muwBc|A@LDtixf^LJj$^^-%i}{BKbl(sFyw3!K;s4Y;lR( zTR}GjC%>2$q=$NagV@P*q0FdQ9TmX$(0lkd2JY5KZBYbe7`NvZM349#7;9OTEohi6}F$wfSDz0U`*i@<(cy$%VuNmwnyXHiptt9nB8tTalUQ) zU3I@SWTNLlDUYaX+@Ru3K@;4SK4h@ zoe(I=Qt52Dk9}_ypKpOi3N(aYqCxX3`mimp2)h=?py4Kt`Io7R{Rg!eIjX4!u5wjf zov~J$bTVG_t&2gCYfE3;kUy6HFV4m9xe;8$|37;0)z>cn|8VV_ZytQ%|34G{pSO4} zG@rOnqU-yFI9+}OfN0kx6hW^IDcVpN)Y~CBX~tzVyJ1sdLx8~pV;pj3#rC|}1yWU@ z(|#{=R-sW7T2wd+^hkC`(uR^69DL%;$O{Z5jIMJ}2wR#7Sw@}PI}6;hDmF5k>UE)ZF0jdU%Y^Y>C1ngfd5m=@K3Y#x84!vB4i@?RFmBFSCM_`TT; zo93_)3W`IgDdSb=rsx2>M_dh1w+vN@AFi~z>=Fsb6B=yTZwELNlxM%EQLZKlx;Tz zLJPE|9HoVBTNVRN3+Z-KDBW$gEv1|7Hk77E$~OO$meOqj+yCFpy!Z5;B-;sOQ|LM{ zmh|4tH{X2MeDlrKxS_74wYILIft-X;W2Ts}BZ;LJ1RP^Y+t$`a-n4t%L`N(wc1yRz zLymf=kgMx%?C5MH=K*v$NUYtmfryQzer(Wd>2g;@wr{j_IQBY88A}6LP(drUY}mM~ zp$-kM*wC_a+s3xW$X1)zXYogmD}<)at*t^^9f%r$IvCG%oy?!i?01Rl(G^-N zUjgJG=j_TZq~B6W2R#zE(J2qWR4T5pG)m2uR5(rO+SstMf>uj{(299{Wj%}n*FDiWJPxALi=&byr-5dTl?ysm~9IM@3B;{3q*|1$iW_y0a1{$HKni*k+# z#H*X#>!WrpQeN;%m0vQffhW2!%b?6l4DrmFz2X8A__Em$B!vRMJ|WTfEPK;PhzkFskVWPo&t!*b{fzNKv*~B7eqGLQoPE! z{D>g&;AnYi|6i~OnFE#>&-PD&gf$3I&KxeL8js*S?-h|?NI9XxpYpLB5+*i}$2Oj= zP>(A>Kv};ZKu&=Btoj#NFU|5EtE6RflpZ-*dcaN!XS3Ebgg%3Yv7-2jgv%zYUgZ$= z40kXnHBNOYiFD$l@=6kErJK@XiK;JWCsBB|fgoV9b8ulYm`^)MusjUiBY73~P|aLK zG5!zAKo(2yBI>tVu@4|9mwF5{yRizOX;vD>LLuZmCnU_!mMsXRmB0*E!H^&W%%F;A z3h|$TZ>sJ?WSz1U8SVI^FYM~I&`eZ7qD)C6^HB68oC=Ybp#KcqRJ9?viGEYAZXJC- zL&K!5j^&}7i%e#b|3JTUG}X0fG(tl2$*kL77MQQSm(69koY5%ez#)6YU_hE{wmtdyS9GehQs z46}{@JT zJZ_hx+9Za+=%oWS5VopO|4n;CKHsRfA}>!aYu#5wW`y$khaCNT@|Y*;G1YXl_YQL3 z9s{vfK70~V9t6)rc76v>0qqTU+Zj$N(laN;v8CgZwP}Y!& zhA_}4KTttc9(#=U85ZSnE8^l*!IDAEh60H_j`4kNkKL<4f*1`mgDfxP^o@@?4x2+9 z$;g^TfU+7@t6jxWuvo3SV#VfXMcobRyD-F683D-ns~1%GiO4Wq$bjn#Dh}0NA@nj< z>Aq`KQ*#1pAF<-%2$ARkP@;z*hO&Aqw03 z!(WzImF&nWLoU#zrx(&IZJ2-Pe5(d;a?1g}In4L3nKA1`g`w>ALE$8$oG+REN-r<%6>Kk9p|voa*OF!4-4l5E@pIn?}i5 zS@3J50w%GGC&;Uz_(e#@nbAQYdRA?si&=Kt_S)D}+FWu#JLyt)DQ;z~7DTp?h5kO} zn~a(~Q>9pn9ex?ASWtngJXWIuBd@2wdX`#td-FzYd!2)nSJvH-b~|y-YW$Ec9}qhx z@u~okk3oO`pfEyte_$ksCnOkAa{Q7K8ce^}3-^yK{>L{H6Ev@H99j%R+#>X;PjSF8JXPwU_}XNl)fi)_iE=ebo#TIe5lS#T#9o>ffjP~b4MK$zjA-c_t zoiD_0YOKn`E9Mtf3jsHLi|4#E*CD$$)K%oPf6fC&^Y-I|ssHeH$N^k ztY}{UuZjMn&lcxa#ch5fi^T!3H1v?|g!ullj6@^N>#z%3$bubaD7=0fG3JsA6OY6~ zj%PH9BM)E|fR4OlVZZ3cuv{YUo$R=Ja{UQv!F)0hAh{IJ{o^(gzp#ZKLXk=prw~f@%CO|}^d!Q7!BWt#yfK$-A+L_Nb!GZ5 zPP<>B0hn9=1NMIvmJ}40%lYGPaoKG;MBU8dX=i2{Kr;)w4*AsuWk<-CMzWzFFG)C*tpvvgabU8};H|PJ0*Ed~V z|G%K9v?R#?FP$I%U!(q?C{8vTqD%L8N&TVnDZN08u3ycu+D70QFmWg5V+LcP3>2{Q z-No*oz6#a!3wYp{TxY>yT1iVIo9xKweq`w@+tP&Vm)N$gOZ(^ z%8`CY5ak13ya&R!h#;;8?Ss(yaFc&N?DHP&zhVOE3c7%~{J+w&fFgIv$%*6@wAu*(TQEy)RIr zku}xGmfNN@V^`I;yfXb~*CSr(La;gXzYrt9K>x3}VE+EMYZm|U(xbO`u{#_CZ_bof zsnE+Zg~Nilh9l(i3jctJ-5oBi%#ed6JsF;Z+v|FE=IvOSy}CLt=P=zXD`oR93kqB* zqKNh=kyXX0EXp7id42hlS)%S=PH0M1{h-G^HY%NaF`ypF4$Rf+fq?eP{)=MRY-Y>b z10YMcY>F4BDBpoCD#`=|z-BT;;@T{Av};I(qGFJ&7^+)B4vEG3><*vJ>GCpPmr4Y= zR3)Q^oTWb^dt)_K-m&3fn`a!AO2;eFn^hFGi`8blhc=9en2W#_yO}bSIWk1Ljg3&E zW)H|mHL>`dh~mutvw}ZP)%l$R0q*hD<3mV)7u^FR`!xz6&j0&Apx0L=l6eI+wnhR zZD0g|J(ZPL+%+ZTl6H8w#w|lmyWJsbG}-bl*l3PwQ<_OU{<+#T=I$gZLzFwMf|QMwYZ!M%^( zP$vdO9A=?$gzW9ZBXViBL}X?wWlvT?N2!4!C?|9THlF6`8}p7!sIn)H{i8Or<|n8D zjMzT+u(Mw-AGiAczN3`%Rb>=JrBW#&^*jRn_Ds&3Q!Xy{CkjQv&Jyi;d1=T0o`wSH~=)waTjlhZn zmUu}pRDvgkuW7WpCO~8rF>A~0^#;U_6(Fu?6^5c*hML)|#*85Fq6e*fqKFLpA1d1& z7*P%pV^#~_mG$H^B0e9P{*d(l?!iH*=2edW76z~XE6tzp|F3QQ$G?)o!niD{ao?EF zM;C$E`sj>mwJBd6An2mm1yM$V!T{tTv7m@bz`6~#N}lFn5dg7RO=jAvva-@jX@UHF z7~rp>|LmyT|E2SP3Q9|h3IosoDb1fB|6d#Z?{nM7+2ShqsN8dlOZ??gy?=`gogxxX z#UQiS^oE?QkR3!8Tj>f_4=^xNHGxJzo<9*V!7KDEL*D1%3oL(Zp9)n^Pe%uNid^LD4%I#|85|v{D9bAsk0?Np6(c+30c1$nHnth9 zrlKNLJtKBSn^cRcmG7$Z+~PhTc_}*?DHl+^4Z(AX# z1q_shhMoJJBlIfi;BxYWu1F}F*Fy3J1vTVd!W5Fq#HlvsW(U?v7s}NVA5x1nc~wAEqHxq<);McgF` zv~0lU5^CjD(U&3Ba&`-I6D(rrNVZ|(WA(P98N|L$t~<2cD_T19jn=AIs^lpW=CId6 zMplJ)2;&+go-DrX>dIBI0CyE9vv-^`lM&8v=AdWnsk{iQq~TRU+)5 z{o*q~@MBMwTX?+|(xaMcdK74S_5sk2U`Q%GQLYu3fndQsuEI))bKOUthCCMXM08UvA$+~dGn=8!QjiU$MpTUgy?xi( zZyR;`=t=gHw@gq9cpS9-GuZYLMuptj>9)^kcG>I8H@kwOkkh*h=-Irx$Vw*c zBZ{1rsUff=mhP0Rnj$7FT(PK02R6;q1$a8*N4n6o^OyH(Eb^3+M>78 z2zfiV?_0Uunm23)uX1wc$ex#N&CThtRPV?f^i}4e$o7Iv4;dL`eZLwzRu3ZtH{K;d;t;oEWSVpN`>}zgQr11%#98W#pW6G z20$6Ld2GYfM7&S>h3+~7`+TuhpL-9xXT@O~p3Makl~$Z9G0iY59nhiB>qw=Un;B=T zJ88BVrle<>AD+>(Q9YFJ=b}yZ?s1OpQur^cLk%l0)0Lc+jB~k@D(dvR$)QgH9T*92 zN?x6qF_7e=9(G>6Sb|)rH#WM9K%??QUPr!%aiy|RS7{)v!15}2$wBz3z2xB6S7*$v zq|J=JvZ}qaddoAf`nXb$`7%*foO*G&J&W>Cj6lAwA@2nGj$OLM$^>&iL}x0=gIrjQ z{0pmR&MaM8=dlvkEqf*qerB76x%1>e_(q(rfLb%&yPds4qeR`y8R8#-JQ4G%7*Xf) zx&`*aF4(*kO6ike58Fmr%wmu2kg8o|=(opaW%E6(?lhsfZq0gu&cHhM54-XlBd{rC zWlSK64*EOVgX)v&7);;LVN*@o!6EvSUW-69?{MTC>+bydBSS2>^Z%mv?+GTeU=rQ~ z6Z~4Ca{J!{`SFbGov4__UWKYEa5rtJETIh6oP&DRPKw#a#^TFJ!M~+gJ^i5C>z+rZ z)UMSchs&G)SDtBq)#v|O z&x47fmp~I>{q8Y1(tfRc9;BgpM$WWLMYD9C(pc|{tAIC+jeCKL6WcQR%amZ@!Hbi7#wri zJc?{%9%Qmwnc>I_ncM2~4VZGoD{`~xk}n#l&Z&$%{J+!CvN;PzAI5b3`@#_D9C{*t`dXh69kJ1I~US+b({qMR~UiB1IH$cD-wbQU9Bld(z0u zm4TvQ86d^cO1uu{Jb7mce5dBPKg;`&=#WjIaoqkZYl6^13(eM&pd2%`hh@Clt-5^W zq^%0JEy@PXWqFjDt`U1?YRIgNxg4H|&A1${FsovD@Bc_~Y6jXH+k~c#ZCyfZ%bLcv z&PK@!5ECF+gu+sx$A4SO4PdpVEXJY8c#)dH`5a_47s>Vj>loT_9fQbtB z0vi~<0gpqxBQBS2Fu?;DYv8+wxHS8Qoc%+zR*YV4<1nRycL=SsGiy3b;4tS014A#w0l9m9%~?$$#zpk@Xq~KE0YtCVzlkIV`G;&i`pP5r zkpvQ5C?}&$NI=jIM28|T5{odv|K3aS8FKG~YNUF=ImN&g6Ip@;32n)e z46&uXywjs>i6k!#jZH0WE#$iGPV&>Fau>*1jRO!a7SM-OI;bwOqvPZ@GtT>68Um-8 zo`aC>%?Z^KLezc~_CThH(@z5|(7^s7EAuX(1O$k<3|3%qT2`$YLgEDLMaO|LNVyPB zYM3e5IZ`%<5RQq1chu1@%05FvunqW_W5h-ilBeb+!wpgonkCn=5$~KMHkV{314%~g zjyU}b%Bh_(at?)i#6jiEOKp}y&I76HC#hWb21#i{)E%H_!?0Qeq|HvX(C0Set;<1{ zRhckZoj;z-8SR z6-hiM7FQBgHEBo-sKz?>367DyPLF$pUeqczy>84m?thNv>x12-3(=7zH3VZ799*QsRTiM-_S!8tsi88(KQ)h18kCnvHD@ zeno0`cxa57EGh5`fbT$ife48&n^}KAdL@|oL5EqwUqr#(=YtIZVF(}_l|YH)Dl}-h zG2*EcJ3elvIZ14m!lX7-wCv+ShLm+uu+}b>?T5O`KdEEyRn|(sQ)Ee+X*iFF~$|wcC7fXvi5nUfNz#j?}@R^ntu^4OthVav0oRhg3}L z?$Ld~+ZM?E(td*ndG<&gD}va#gBUe4pHP;*QJH=Mh**Et8PO>M$No`})9Ir&zz271 zRHdz=no1b;yFKFecu^$-ZL-*FArpi`wDlvzUqVMsG)Pns5OtW+hTu&@(9G(O5*KAe zVQUBpZeC!fQIR)LbBS{awHI9%>IE@pb=Xbpf@8$)_JEK? zEA8-ed`{YBQ;7{^1-ajY9PmU9SpS|8_de*zphF~^Xhf0Ek4-50k+)3FRoHu&Ix*KJ zkY$u`GS?(xl`vujSV`HU0i@r)nM3t(RKJJEyp%LbEeC_(uYsw-{tPpvv=F0dU{@aK z6e?ADMo*9#n#*$rXYvFI48JoNvJ2}XU07Qk>9>M{JADoqU{cSR%SGF`*X^{^xh=mB zAek-6;uG(hcHF=X)1y7%xl2Hfj=Hw4tr*w{b!}UP^(}1;lu?b>Vc^)=DQxTzS~j$|wlp@F zg_gE8t(zNK+SUs7DB8A>3}iR7bOCPHMp{~g*3yV_O;o5GJJvMgNnL$QYfINwv(VJi z)keTJ0dAepUf0ppvSxE@U5C)Vxubm}hQxJk4S?L%($>_0iW)aGwsle0rwL9#`__(@ zwar~-lkfOP+wUtnYYKR0zXx`Y` zfCBZ6Xht1I$P6hogObxMG}LXVTie*_2TiiEb`U^*YLGH(8`~N?>RQc0XM5wC7V-s@ zZ0TrR(?#h9>Vpcc6i;|FosF9|;{ozf4zh~CmF7lT5s)qoosA5I{{G8-X|BD+&=w*bIsi4z`Ji6Go9|!BT=;q%@^9#i60Gt`%TA z2{J+1tt^r_zw7rs%>PN3QD61_zeV{4#U(-ee@o`~|6jxTKU0IqYLn2>;O-aJbkZS9 zdW*e6kQgtN6qESgDocKWrLauMFQ~|0RZ(2NjmFiS@Q;La(X_K3yF%FD#AwFh64t_d z8bp6pHR!O{HrX%+b!^z&K%)CKtVA9OSHkNXt`G)%)ub*52G{$l3k9DSf4uasn5)1l zbdwF8eJ(c9Cv>>cv2@aV$Vr|G5BW{vw-$@I)zz}kY4;7$sQKvrO8RC9&W4LP92N}6 z39f1V{YAxv_DTU&bT}|3_7bn$MY~@QJ+x8^{)meqX=St$2kGnJ#)Se}UX)*4LV*$r zg9e@;*m8M6E-%9-ZnO-nB%k~z0~7jOV}N8C^f<;TAnJ3A1^eK8k<;l%>~iq|2l3f(BmAa^p_TO2c?@yR2bvgxyul`SHNQ*anl{m;^c-< zXcgAF+~F| z90Y|?7B{rG90LS1$8b>FDW&LWvESw*dpiaJw9n>skX-(WH0J>aX&EuhXp4xqaFA>o zt`IB*)*^rw4omG&yeJf36a~J>7he>sU*ucM#TO-kFG|E0r8B$$S{2NaNJLftEK>h0 zR{tzf|14Gfq$HPV>l|UEVHNsFAkarElfM@EzZUzymiWJxieD*UCMF__ECpicCt5*~ zad=1qRT#yIdZMtARGyjrv52rJVG2Bi-N2HLMXicWKFZo>D+rM-whFD1owv~fDy{N& z7!(U1TnI@pnQhFs7I{g$h>8-`K|AcQ$Hwx|0kR}$^sW5F;vN|AI*5QW5dtn7Y+vNS03^Omf*qS;&Ew_5!|xgd+u;xQLJjVXUMHXp~K4Z0NQqx-d3DYoq<- zm6ZXmC04dng}5T^z!-HCIOfPvPl#!2g;689C@q6~0hVi)jz7mQIN;)3A|pQVz}Am> zD}+)eccR5WdGP^h+3sC4*HIxz-zZoH$w#_>v*7<> zXV%(}bRk8$Sc&wUtWtxYm3*`M8){G$BfcR^|B%yV&&J4LBu7GacF-Z*6ItfVtU{Z7 zo(q-yPUhJYQj_zAW|Mo-=g0{ZuTqsc^oa5`mu&m{#{uVl=3r6NCUVl}a}SF@n1Q8V z#qo#eE-D8l0SY;@w?fQR3p)*m3`6|UPlW?d2LZ%ECGouxo5$ncN35{JF(UeKvc`@3 zHSU0g?rJ1mLFJXXCNq0M;2OBn!;W&>q3-0E1Hp0#?1Uk;C>N;oj`bUJim?J%h|Xj- z4_z#5RUH4S>^xch3?;v|u_t2Dp+d7jKa11~PyVAGgj!Kcn9T}6G1SmOY^Eetmq!IS zN(TcZo%VC``yz8>+H4mobiHLz9Z|O}nxMg*jT0caySuv++}+(ZxVyW%ySs(p4jbJ; zHUxKneD}R`&$(6iRgLbNYxR#_)jeyis##->0fPlV=+@I1MU#gOHWOd|^ZScTNZ7t} z)mP=0KQVnj8@1`y4CpXp8LZ|rrsM?A_Kz$Bt#aVps#W%?2Fm@=Zhx_$;h z*a*Mx4rpr%4I`gm{uURrIyghJGkqf5UW9HA?1YutJSEf!UCW-w|es(kK9CMP&I1P%+6Vj3M4j- zsH=orkU-JwRcGpFydgLQocdXU55tcK0f>^4dP++;aJzAKK}_ArpRq&d!-L<%Taw{!B2yuW%-#q&=d z;56-I5NJCITsi>n&wuvQMZmI&x22lTDx`kYy|zDn&QBugjXe;Aj~A966hqzNEO3PW zuxR%}98uFRm8v#tzJFKD4C|m%Xp)4pZyMfVrv9oL*ra=C5#orvewpl>?DeD{z8y-U zR;Nke7ylHo@+7Wgm7n6coS3GS>#r_L3j=&JsX0}H-L^o3V-JKMh1MPE_G*7qUhEYC= zP=MEbIqI{V*TB7cc#XmBfoSZPx<3*jI4CI*bzY9SSPgpu*wD&Vfof{}FpX3Yu!TCP z)^f#o{eNVCO${roZ2Lj6`$IuV zl9ijhxZ9I>>X4CeUK~)WyjogV!#>``m$-wn;&-j}z;2nEdfl+m1Hc)=&51a^U&&8e z%SyOWtzujB{4`m1fU)?LQH?wbVd_NoxB9Xxw=IJ>zk3rh631*YRjPr8w)P?8fny9z z3LeS1!*}-sd2x9&Xq8I$)wPEHKv$UXESS&(aWhMW2tsAjgjS->4&sP$=7_;Htfj8i zLp&F#A}?G5GK915XeZ8Q)xV=|@JpTX^-R%vI?4*1JY6Ra-Be_0;r#~Yev&_thng4S zI2&lojr2AASkhb{;#uAG`X-K@XzEVYA52Yx>XCf+K#J}n8DXw8orGSL3TfvP^5cF*D z9i{;iWHyLg$8~Ou#n#O~18F+nB72O3VRG?D^$sc!z)xGssm@idDAkhUD!m%t=?A~- zcikKqL2LzS6N%%B5OeUinxDsN&XGH!r3mt-_{)thS<{aW;sO~#A&2D<+FAxnk4iXD zc^4aL!;6S>Rurlmnoy+v*oZ!d2J%*M#Ily85T!R)6O`7!+meLH38VDQFoTfqtZ8+D zDdzPf={cy55foKf%&O~idtaLq*t35Q3vC3G_CP0TQeVet%ym~|_67_vDWvE*HTHIx z<{=N8U6~zuM-S?nU5TW=Mvz6m4n%le>DI+8$kP9wRf>Tf%~~F`t;+HD%P+n!qOI&@ zGRPC${AY4x^Xc9Ztr{#KRwNI*OlD59%q`~*U&uid%H{rcO4umP6U9uBInBn1S zh!U_pH{9Wok%Tz-Xq1%`mdn2+OcJU!D^QD+RX8!NLwFXu>T|S&wI@eceI^^{$xMXV zig)zlgo+{&d>{&G;v3pw^3gfQ6FfDVZPoJ^@kA8hmveu04XEpzp=(B328+j|V%VkU{B%eZn#Mruk) zBhu05^5Xu3oEZGEqPl3$`Rza}h2pklS`OVIO#{$aJRq{R*rfDX7OzlZLY*W@exA&n zbxoMV`n38S=)UeWZ|uBAiwlD3)g|!~{sx_S-GuA9Q&d`zuoLG8)B*>!a;*)*t@wc)LQ9w)N_t0l?tZu#_x_J&O70^X~eksR~nz|{? z=x-7EL3Jq;d@G#jdx$B^|MRj%aH?|$9eynaEnspT%S|eZNv8FWl4lz3p9Iv`sW=h& z^$>k$@`lu1S7r1&Td89;`P_sy62r(4Ak#b_l?BIP`?_z(!$%0u!Ljw(2Q}RkBkec7 zPc}+JhpGR^Ec??q8Sa(j_-MV|&e~J)mRoM!cpp#wem&?=lUICID4td;h6r!P*>!A6;J>DYZrM(AL z0>BkYFvkT|-Z-coC4Vot?kZ^KqxhzoU^R2v$%B9_Zpt;-gmAp~8L5Yna449o+(^*> z1Fe5CJk0L}pZ8(^Z5F$*uZ|yic0w<7{QR)PAdt1rAZamWC7L@%)WByZq|KpREhRKeK+nd^2F?>dk^%;e{FzM&e?p|AafPzYq6GP{ayj z^1$VkOI}pf1^_^4#o5CS)_COPm*08mzsU(R92s5cmnOAaHz0aqyJgJ*t;Wu&_;d+&Oe0VNqpRk_7 z;pIbjsH5mlXr9&PZALRk>-LXi_hp}D@@SA~?dacJ!T4r(X5&--diwhQuBm>@fS+#_ zq|N({QL?G6>iu>8HRcc2HzyY>$je)*0p8O=VdHoKz}v>wPMiKkzB%U{omp`?4;QCJ zW!+a-ev1(c2>){VfPC3;3km_3MEJz0L=7i1U1$}o^r6}@i{ab$jxz9gXRFk-6rq%! z)NtT|1fC>Mj4OuWR?Mw(iB5vOIL|Lv{DreX9|Ev_iBE#U_pRt#>XO-lyxGFI@B|_W zZz!;G$t)Rv*e&$Zop{N3VxG`5`a-glB8mKW{@7c@g=Q(r#JrA1{=7Qf^N(Xcm&e&?)pM0t> z&{^~^ja>2SnId(I`KsoDXNZQrFExx`P7(fp!h5=g-Y>R{ zUpAWu?uYnx>LMJl72?YirI=HUeS|9kLZ$zWjwY~%J(kMoEpwfPN;<%;1Mg7BUD&RE2|65a zi0uTEPwceS{a^3Sy>7OVR9sl3xOatElyTHM^yua;5P6nD4eBJk4 zSOvPv1t;ykZq*Gx)Gi8wyf6KD1w7>P|LP8y;Ba*$@;#n|vO1Vc{3dwgEMTwRQ1gh# z9xr=^I+yP&}uC1g_VBwNTmab#Put|$v|B|eD)p|{+-SEviaQt{vUqi(%Q#uNGi zZ~sSDeS|#c4;?`*EK1FO=Z|(p2cLRAAe9^?e_&CY@Fu~X*I*D=L zx5935Q{J!z491S)zktT2ED{+CfDQ@zlDQwTvpb}EBM*XmH;fYo@O0flMw|_&VRX45 zInU%U&P=IJDeTvu5wpfoXSurEGW8-aG-ZmACd3VXs4PzC*I%^0#25`Yl6hTj!S)h} z;*DPfKk|iGgkQb65AejfaxU;oQ6`*=KVvTV1qKK%KuYD8ZR|rD%mf2U+ypN72|S&U z=}#r5y5_6wTdMH+xL}ELAW>!t-7GP*L0>qK4MAUEkeB`mS;5NiCTs=)k^j2;N^z+p zB3?jg)DBc(X>P&U2_pRm2FQpPAz?a&%NTPfaF%yaEl+I!ffvMvFWv^^vueDi$8uCKb6b0%Sb5(Gb%T|`lP%YLF|HqT^ zLiPU-^S^lujQMn;4eP8h3 zA%5ILPmIeZ#HW8JW)v3C&r)aU54<)I^Ckepl`xX9%{!%!pV#N{g-#XPbV=2|5r%a!Psh?E$YG=YgGj5%E$ z37RyKxc^B+2ZUjNAkx3%YQM0y+*??JMJ>TU=N7`b0EQ@#b@-FP7Xr7TCQAk~;r2!K zqs_yQ{=C=3l3n;U1Nq`VYhTE}{5M=!s$uAfsYws5Ase);Z0LrWwH_<*favK; z#K(g|lnWa_6D)ZYG^%Xq^r?;tjV<|Kp?JRs%-c5Zt&hdrMXvDw9t?!v><)Wf?(sc3 z68UnW2;{&L&jh0!4gQbmTJ9);b3{)kqMq*yoG%U?p7!<_R3xV2RX_Z0#98(UJXW zbc}#}G;nx76l@*1brveoCPLPj8#M%&`;4GM;!Y z(FF^JTIiL^7kMUd^!^4mDv?Ye5`X4fFp)C&!tg&+NU`F9+E?L!oP=>6J3`*bV6PLq z9XRTJ;oi;f(%cCp1Z(&DO4l4xYRD~JSlU}On@>9=Z(qUF)#f)xy}KyM03fOJY0591 z@qt=|-4$lXQ_PN(ugJL&7DUjJd0!Aa{qv9d}79J}?r01B4C`NK>bT z4p@{PA*ggIR6g&%@R$P7@c9s-ia|r=LVKzOm()sExc@hhR(PVR^?akzhr(j~6$KC; zj4s#}SGpvn@ZvodGY z-i}Ut5JC1XNFD!#P>{am0kcveK-&w^`O3-iFS8QJUkT)7c`#it@s^N^sZ z2x-tIU?H$w<5Vmmcr^;?s|eNVPeh|!?+5oherFW;uh9I{O?7obU#SzIb`G8DBYg0m z5YG!S!1Q%6A*; zgjS~sZFp09=q3*2^V?s%y}JsG{}~;Et_Kt05+Nyt-;xX7rIp@)Pz9i?2|`xoe_fsp zT(A&2U@f@RQhG2`x-(O9g}}`H0!=B@38!@QqrwG!i5u=D2g*(17Z0UyZgRl@uF@_d zl_Lx$7bJYnSLm67JBztzR?9csmUl$$0GL|AV2wO6+S!6si@Bj>%RSr{M+o{HAz6yK zB)AsSeMrp7*G)ox{CSo&+Y+3TTFcWmFlW#Kw4oRLS}ufpdEgecp*ws=F2smxpeH=4 z;@5p@A#P{~d6d`~u_%d29N)TMpEk-ebz>Ivd3L#dP_g_-6Y0Bx=*RJp&!E6ZuI~cK z5%G}w|8Mx-|AqOhh7CX6innIX-I6hy&B2fdN>Y6Du=Sb|{l5n6Q*QL$cO>-1mbfY9@{AtwR1;qAO7&p zPX4b!*xDc2-5c`DC-g^OINv@f0RxD9#-Q2sfusMP=7(y`OdmLv-Mu5n&FF;lPKOIsiA&aA_)<_Vaz;MnBW_-E!yi|} zxCF-qyWREPajs8pB)*7wT1hcWT`k%R0c+RloAFUUu;$*e5_|{dkqEW|k42~KC8q3Q z`s`cI&6jo|x9z()!_Ow2AOkq9?+P`D|JQ8;B;f5|elzH&_Gj9F{Km--4{_pdW0GvAV3Q5LVWp zjZS%8*wsn9!#3y54kCNrc8ua3qnYVgs9nL$rHMKRqHOoKXhxhtH_rQHla&B~vcCLJW12h2wxE-@z&>s|msz9g*wgqn|$?d9@5 zO#i5tc&$Dd50~s>Zfx#&J5@FHoR?z2b=5~Q_4chqN%e{mQECMt71A7~^*IL2#8Nx!oi@BGTNfCp_!glUGcd z3g*)$9Q3n=z$`ht?XKcg!N~))tB_6$P-=lN$0HJ2v|R;&Eg<$ej~1`Hkf6I$Zw}HU zt9%FKQa51X1J(4yXyT15;gwP7ykCm^V+ttfY_Qh{kCYLJ%!l+85cUG|;C9Y^?sfhl zJp3;w*hOUF!39MGbT72=;N0z%*B$$U$vNufg;ak4)9DAy@AT+s?=)~;oSP8^eh9TI zI1}$ZccR%Ry};pI0gnF}og>wu@Hiv1T>H$?7AcA)M=1Ekt~z}n%D<33V9(PCAfkK1 zb-nT2{(G1^jTi2|_#5X;d?YaV2Kn%y*3Ny*HUICW<3fmZR+J@Ejwn#>odCTGRTvciJB+H zUTU7jR>q{7Lp|8C)&guH zdC*H@Mu`n-s8mbpUzK9vE8O8zDa)Vb``O>3!4C3*f^YGQlw}Ut0$ltYes8X`t~YAe zY71&>rq4ElzGpiIyf+&U`Y-1;AFms$`Y*q2=mlTqXZo_DMB-|M6Dfy8C`;uzbr{a(-S7Ype*HyN<3x1wvkbehpDnh~3nT>8~}r>gdjq{usDExiQwiO4r=YiAePmA|Fw7UYb& zZA>Ryi@%m>zJmqc?mfHw*_*HW^WOPCaOW6cu(_K#VqM|0UHN8<_3&cbFnZORuzOFh zOQqo^Fq(yk`;#~+My(O8H0&akb##l-@GD4aFRfaPHh6x>3){+As}xa_Gcb&%WT+Pj zvUqJQYuzIWb;-Y2ZWH`o1EKI#|1}9Lbir@LRGfqB!G#jD|V zQHZM{p`*1VkE4#LS#sBbJ&U2>_E0JcbD(y242VV}HNCKHVSnfsUojgOt3i z0=tN9i>0u%la_H6N1DMTWs-sVt92h0b8Ssal48vst(Tp(v9ghKlCX~HH_@-YoTeod zW!BppnHbpv9*S=rI{gzF-8Z-`+Aqm*lT3Q|v^uWTV?aIM^Ex2bYg&FdxHjzA z;vM_;^+7@YlytaF6qGf$Dxld-7rJ`l{3t~~!qwEuz^O4FZZ-dsdbOvEQ-KR@jqS`+ zYtIS5o|FtjJ6I6A&ieX@toz8oz@oBQdDOa5!j9G>G3`!hAI1b-2mvV2^UUbC|OTFY#%^PnpG7wvvU2EgOn{>*F zuaMV3E^o>5spKFlG_p~9`WipqK_8uvxba7G$5oee;T~CBmht$N9-6PNt#=A&dl`Wg zRNSm_QK6I8ZZp-@goQPnj~lTMGG2I61h^ypthE&ES?BX=?riP%wK~14&2%#IJJWJP zP-$MkwqXxXisn4qT=^EUF>Z{Z&r)Mx$5Li)aZIT=4!1sP<5SgjamN8Rh?Ac4?eX_H z`#my=@!V8vl4Y>0+rE)hF}ZS3Px%&;x5@Ix`&RsnaoOFpE6hG{s->qR-Xj!@-G|cC z@=cU0CL`{Ia|iBDMtc~1$7~ZJd>SGwi)^z7%*@R-`u%5Sri>%zq)lCw^rTC;#c;Af zM%gGfEGZ!zaVAyyX7m;LQ!&@EdwD}ZR~598vYMsQJ85iHFC$xR-LA=@UT#HTG`7Zm z5jIX|IrsJ>AepAUmAw|elQR+cPxWWZLE0%@+Nu4z^H!}6eOhh1e!G#Wo%P8^A`*UB zwu)+Y*i(GCWS^fT#12u)to(JSw1BWBUfBCZp17?9HcgWy8m*%Oc=( zsAa=jiqISC47D67I1&HLU55gx?e}~I*z3?xFt6~0sUPHQ?I(A{+^nQdDk2{7$ogsH zvLlu6TN6`^l$Lp#`qV^|A&KQri3tEgd>~$}X06yD3$3DnXQHQ>uQ~RQ%R2U#_B2c5 zV(hVyaciWqDEd@&KY1;^)vH+@nIZQ1d9y5bcHi@rkWi2%kfUM#n!|*#bNzSZ( zW=2W_YOXoKEL%s+D^rLS#rOlhu?r`cO*(zGoBc#A^FRF6e|~nqooHxSW*R&%IzOJl zYipe!JfCg6BpfU!*{aA8-6#$HB_Y!Qn$O zQ;_Ncq8qNa zK&$y}f6%^m7fGwZdg{rH?_x1rl6>5c>;S(p8UtO`IN#t^*Vov#qfnEWC>Qf1c628~ z$5u`%(ud*TsiP!=DfphO9tVIA+9wN}CfnQ7wljT5%d#1jT{GqER22_ zEfLR-%L@a|K~B^5mHA+j=~H~Uq#MhG|8~KsCvWkX^O#99e8%xrgKy4;V=ptTg*qyl zB`F~62NNGwuTByPCMr)z_}jU|rd!H?qemCBQ}N}2af`qzFYT)fPcYg(pz?IHSV zy`Dg&a)GF$$YBvA4aA)W&qQgA{w6us0x^Zuv}Mbw3aQw?7PWt5XBap~L&L$OKWn7s zLr29;|Jo_g*8G`W2hP)sgi0Qhxg~0mw}SEHNh%lXCg)Qukq1;5YUEXz!V!V3=v)%gKB)H`tx4-U^YdAHwtfEuP_~J#Gyo z$|a1ha3rpo5RfP^4CzaH(Y)XD90xN>aU-XGH~t_$F_<>=SDm`OaH|&2?(cDr9BQy> z#rfjmSdJI*Nx&V-u=y5R!)Gfef`kI~6e7f1tFz^QYol<~EXirl_gu61)LMLY@BOev zNH{KedMX+3;R-yfTg?&Rz8g!{Y2%w5&;PuV9aJ51eD~uY*g1C|#wq)55B+Rbw;w1< z=ks@ej-E{7>UOqjB|4Vwr4Oe#JBEe@THfN(bMN;BuPNyT&u3(y)hlXeCR)=mfQ)Ew zJo_S~kPL=6t;_o`aBX5V#{!%Q4OlW;6+9+VxbHS2j%~M}?p;o$^oYNfK+P2EGo`c!xKo9GQ#U|^PEW7M;yjsR%=bwt~@Ud1|?~fxMTgrQ{j8!lz^>o|Le$!c} z?KM$Rx^-}ie_4>8fk}bItdy*+sgfCQt{;F4_`0t5+eBBp zu}5Evzm>9D(b&>?vJ%gh-IPtp&SJ+#K=;eO{M~(G1wx@huPj|I;onYR_oOrv_m$Bk z?UP!D!rJ#W;)SD2ahRcbH9M60*vL2ehY~Udef&Z%Czo~!-lsrw%78vD8gpyT07W^q zy!%K8T-M}m@}KmMCY%;< zl*<=gAqq|9MOECj&E2ym8@_bmq@`7r%2X)N=T(xBd1jCx6bAy*=(6`Y>emf8uGj9c z?ArOP>Vdt@c25fvBN@MtX3FCFJv6kv&(}In#t!k?4-@1!7o^WG+k$|5R7V+hY%Fzeb8ZFHgKnwr_|8B}mB&}z%hsANUCG+&!) zbZHC-6>~F(OxEfz*35kJePVGQyHg^Vwag40L+iER z!?N1ff@rKXeR_@fJn6S5i@juZ9wY7f@S^PWOhy|^jpopgkzaCzO*t;9-b{7mKSx94 zoe?@eBT-k_X3y;{kwBZX>ZDC&h~g_ae}Xq56taQ4wslgKW4n*4VOO)Qsg|IZshWw% zI&C3*ciU86POt2W4Rh#gN_{Lz=VCnIAU`|+7{jL{T;*K4UCGoq6KJ$KisY}ByX$2~ zTJ_MxAM0mo0HxoNZQ&>sVP zt2WlnIoi3af1aJw8T!p(>`Bwp&88*v+F!J^ zXBa7)N^m%tret9-Fa3?dRC4Sw72D3Mc~$H$#Nf@RfxBvewzW&yc?_%DO}>tPitg1n z2O6MzL+RNe;pmeNa@~&a)IHyHn|k-f_O?rYd7b+|5}(Yi^O`JQyTUSV4?k@?jDS@b zDzUw`;nPiIhenNm1Y~wku(zkDEsP?z3mw1j45Wt}*m3C#@Ce!^=I0qJKs7(XZhUUNaD&RU`<8oIHe}6K12(wzdh~k;C}FN|PR<0B z60%nZT;`;2itPe+GxD%QaI_f9I21E~4WJ9^P|obFJgOV=pejx{>#m~L>)3FwPp|>mw%VE);M>TSJ1sR{dGwFPUfb3wWr$8EFm_csP`>C zz6#_3VMlZ@YZFlC7RU_4(CXefQB*6epF59(!hqHv_lOg3O}q2PA&qy#^M2?yagFTg ztv5oQM#ja=3Y*Rs9e%Z&yb~F>{I_mGfd!W`phwdsGQJ|31@AHC@tdC8x?{DqtaRYQ1W3`(Feh;hS%E-9hV1vhKWtMAuCB(BC!VBi5`;=> zjf`&6!)4poWum;lud}+fquA!%o?lyYZEjq$J+PNIPgs$h!s=m|SiGf;R)&CWr`g() zJU`P@vx)q5^Ho)qTl*a3!H2)GtY{aDcAQ{f&e?Kocu3@`8TU81@Hv$>^Cu*&IfjKJ z>5lGtyvR!$KTj^Wrjl&2STGmHXlz0m0cufF-s_PD@sjAj5!Cb+AXK-tSfITca@x9F7_o6;_}ZcBd}Zp z>hY{+oBiIGhuiz_TK7)-M{VK>1E%aFVvwTobG>i&B+F(#jt8~_K%k56JH=T&gS`&B z>)cx;8=Is}09Iz(7JCN`b@w$sZ`;4)Kh|sdO;1;w-54>d@tQhmnNuMZG!Nx3arwL} zJugp{{d||pm7J9BY)fDh)|FOXgMHS%D=+^ilm|C~>v7od{AVeb#iC^&o+p*yLbD6K z(`I~x^q>?R+T-oQt4(NKZ#(NEOOMH3iC2!}b^=#6yhU{A$Cb(-5QSzz;(ZZ{2PA)v zTih;eW8~)o{F@Gx^;B%L&8G*JDA{1k{LLfScRxBT-}|T~)q371x?$NrtaUpr=YK;T zFQF(ud|k>Nsoiz%JlTk{JP~%}fn;=xR7)GxRK-yox1XFONYA!IPx|?T(V*o^D2D1V z=;zQh%B2{yE*)KI%^#^!xoJ7sHooM7h5EgC;ijHM9B#Ys_l*SKSfQ z+-z@Q0&#JGx%}aB7%)>>sKiMGEL#YXZawH0GU-MF(#+psBF6?jf{f4zRT2p|ff=v= z3Z;&XuC7A$-T-Iu)Stj=f&+!H=d`PP``I}klnGX}>zLn4Zzl!fG`gC(tx7FQ&TRLW zzHA2&J8W58%q&alvef+1F=(>AAO_ls^u-nPx1X}-|y)>VL9b<)!Tsc)_1bo(P7!lW)+j~JN9c_*Pp5KuDWvdFI^$jxokE;xlxwBh=)9n?dP zc7?X*RBbyR7T5PYaCrXm?jjGoPL+KeZbUm!MZ?9?npC4AIxNn^*KKfii{n-Rn9t1i zobN?@Y`K6FPc?IXO$vwTXs1psu%J&y_LEizmXtjd(LQ?KZ zE+CJ>D%_Huc{_ejT4~Asu)0VU7cIUvoX{-c*5ZB@$~W`*N=<-;pO|E>we4N7$ug0@ z^>ACb-00LOYeHs>v={dJjsdw*Uv$nnXHP#CPQlWQHE#21o%u#zem1{I%|NKwt6a=X z%PafcL=4-i^s617zK&E+F5PxjDdae5UpK82c&LO*-t0B0WM0D1HLtEFh4<+a4{4 z-Kk~Bqu~9+ahL8WC2x<}s9Q}7?tj7(l*I%X!M6TIA_d>dAnsOau1VqH$?%D3w2Wz8O)K1Ce ztvcDpv3prE@9(7|uTh$30V5&3{B=IwS4|#^*o-TEUAB|Fr?-+r#@o{xQ<|h!D968* zjQ+|i=m{0^@KrKkZ_Ta0HIAGiZ<#IS6)3yivcWueQb9e?6Y{uBjbqA0i{fqESCirw7 z_fl`LrQGv&*%jU=aw@=eNBFi`fPg#fu`F?7wS-V-`u1F3Vo1=SiPx?akmROsa~y#a z95hNdgOdYkl2I=FCq{0Fod>Vj+7VYxZ~ffvP_jEYAbI!&R4XPCmUdvNFw8VD~p#QY&SqJ+cYd@Om%=Bh1RnTifUKCE59Q_kJbA%bb_FB>=W&M?&=51pJE8@+jyRSQ0 z@AfXhqL!Q%aq-ny&bs#HOqXcR*oT_8isG)yOt3fJBNK!Gj#Pk1MD12daW7o6{)EXc z;<3^#T+0VJTENzX8gM|Z<$WTpy}y2TXK2^g=h>sH{R?HNY&BL(kvL4Txc8;5im`1A zNsR2C>TQh<`Iu-FS7QAXdzK3%N}L9AO*d#%G+e*OWXrJhWiYLklW)6z>*jpRm*ZtsQvEq-TC?&Qb&^=1WYo{nz!oX{ENY%~K+qk1OpwiKy)D z=ZSMMM={A#f$d5)nxK){`<=KIhW{h8 zVQr$XGW4~Cj6+{gy*@fe+d?X0yYQ*;uzG$kd3+c q6{oUE6Od#odX4d8u3LAy$^ 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

77d04!}5WjbY@ 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

Oo4UhENEu{_V_`} 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

Z_8nB}np&N!}WBu6*cr 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⪙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ĦF)1^tGpRCZGN~|WFsU(V{ZV$O?MgMI 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

ask%Idx(UrS< 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

-ul;IfQ&v&1t}Nf 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≷A$bI<*Q-m^#Hz_59$lTHF=24Cpe|e- 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

0jcn6ZAu0ogK((kuoJme*0zz=OVog-Mw#bOe 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

AxoxQs0+-W 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/cache/rspec-expectations-3.13.5.gem b/vendor/bundle/ruby/3.2.0/cache/rspec-expectations-3.13.5.gem new file mode 100644 index 0000000000000000000000000000000000000000..51409fdd2137048ac7a75975aa694b3bde2d547b GIT binary patch literal 89600 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 E1={BUjsO4v literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/cache/rspec-mocks-3.13.5.gem b/vendor/bundle/ruby/3.2.0/cache/rspec-mocks-3.13.5.gem new file mode 100644 index 0000000000000000000000000000000000000000..05da2b390ac190401249b062fcd4b80c2f466fd2 GIT binary patch literal 82944 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

}oaB=VnD%x8C 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/cache/rspec-support-3.13.5.gem b/vendor/bundle/ruby/3.2.0/cache/rspec-support-3.13.5.gem new file mode 100644 index 0000000000000000000000000000000000000000..c9433273d1a5febc7b46ea19da969ed16847de67 GIT binary patch literal 40960 zcmeEsRcs|Z)7}X)Gc#?Nv*B!*H?(19X69tW%*-2RW@hFMGjmQjIf1@^d-1nlrS|Gm zE46bo9*sSkv1QrMW80d#7@8Qm7&4iA0sdXW@{e$EZ~*>8|0DmZIa#^50W556T|FohXJzN$@A#MY|IYv4YWvUP{$=?8ttLqn zEFj={79AX7SVJ>ue+6sbB*pY zD|e&t9DRkvyaiSlTKObz@bu^OnIC9=a91~TLZFy4t{pI zuw=Wf`!{tV^taKUkIEFs+`(}&Ih()C`smO(yCzRN^vZr8uSMC`+_bw+233#@ZhF;7 zI8~GUp?5E8X`;90ppup&-)7K5_{AC&RjTf&2-QTO*EM%y&Z$5FE3t=skHZ<#N}p8c z{9(XNUB3K_9bOK+7AKcVHc(3zOkBzvISnF(XA`90I=R1b9Z;Z~sx7VhLV6_~UE(`A zk&-_4#4s>9wK^hiFsanYCxYLl_qC8E8K@O^C zNa4hmmW173ibgHeljdv2K2K_sbM3EW$WZ>_b$#aEjG;h7%_=LWCtKygRfnzYNp1$E zB@ZnE3r6K{O)Rr_jM;2P>n_v$ExJ=|mN4aJzpoj4gv|)p*K0f6^aPiLgF2+F#f;8+ zRI^gurJ;i((2yHq$U%@p-f7gj?#M%s0ikSe_lUi#>iivj@GS@>3h_kpt;`gxE^`ds z^SfLT*lxOfb#gaGULa!CniNj@@>n%i(}6?OBTr0QZCB|i)Oh8~bZ4KWYn$fCkhSnHqv|9K;A2R<)!-O!KmMAh3kp}44$?J^ z#j|dm54uSJG0tSQHLK(Rl^7#@I8a4xXx{!DvU*9hz1mcFh$<`|Wfg{aStFQ>!z9mO zEN~Jc4u=vOU96r*kl8`vVVZ<;seNzX#zo83h`==Wz9LsZ-r#`YfM7^>p$4yNEj{)@P;@w`P0)y&02EHefH zcB*13VhtdZ-d!g*qlxU6DZrZym5MkPn3p=Us$gQ48+Jcp%9zH5Q2U6$eefrWeVBsj zDYhu1MRRNmx#MZDrPOG)T1$oA4_xV=c2MPm2=!Hr4l);QOz;V7KeCL zged-T)ZZTkYb@0hZE?My(N9!su!~AIwM?H7=UL#vXe70}rhd@Cg``X-gl;oK_CVn`6 zzu2aJX$_sORGsz9bD!Xo?xFkwcZsu||pK_yW zw1scZf&gbPVU8(kym=qG<#+uduhx(6);Map_NMdh_w zY>fXrQcrphvJHu02;PvwG%GTg<-;*sY$7X_24;3aL9ew9scI(P=c}h*K&@6+ti`G! z3v$8!Ob>pa?z&4UR}*n1L{#YDBvd!_vC^&FeqeetJD8%rKTtYRdK2{ACYKG`u4tP< zhsNB9sYNk#Evzn@B;+tXi4B}BMovD5v?fbM7oE=)>C>-5ct$YI5_U>xf3phlWgB2qT4-26jhUgVdsvcgl*&*K-BmKo2X5&nGR9O3P0# zKIL1`r<}RhuO;KCMdk#mq%w_Z<7}{`;QSExG>Q^jZJ#*@put4OxHu+7W- z#eCru+S1NCTtX^B?wmS|PM{igC|-fU;s;3RXD2|KZzqkKV`fgFy78d*oIiJNf;~5( zZOrXj#ir<3#(>9jQ~+N))~Gn`WQ@C>59;#B}(beIqF6^N|E+(69LZ; zJoZ(*fI75+7*%}V4}OjU&e0uhr4+aE}eLW8!`o}xq%~5@UWYWlK=*OBrMCA zJi%u(9#Rj#_LKYT6SWI*p#OQ9zpU2IC35hObFaT^`i=df5h;Flpz#6G3|W1Sq8iBo zc{7+lBFTn$L}60Fm%`5LZa$_i^jC8GO(l|<{&yGfJ@~`L{sm5%eHKrSG2TBqx}zYF zOYCaH!d1W^gyiBR+|ET|G7jz#3jXaj+niRycUPUc3BZ(I2h+n3o^nu%1xAuj=GBkx z(g-;&C>(0jLJR$ zh}$36_G4jed>@xr;Rbil90N__f+m^ccKEEcf9BuLn{_!~;?{bu`(1x(^`XD7=jz|^ zy={ix2`vF~yzS&}USE0)^4@$+tkQ$`8$0rzOY?Y{ZDul*JlwGk>1%VIUWuOt+b+Ge zRo+_)J(leAgk1eTdrL(HW6*ZqH?$XP2MlSL z4{(R8cQy;2^zFnE0=mwvU+?TWX=C{kvHowp4F5lvm+gPzKPG2O^MA_>{0B7pU*JF1 z|B4C!2mHsu#>)Qx@!!8?G5#eefupLX1!2Xf#03G-`O$c0u6m_mNI?(BK?-9>>!XNr z;+eDlkI28OU{VCOJE1qk(D2zC$j^U@iLWHkAK)-Iqu-=HpKuDNFEPr{siU+3U) zxD&(KveZ%*K=|KI7FCzcTewQN zc@cNsb5uH+A?U@~bw_RhDV@(t=J6Fm5Ife3T`w5C7r3)h1aeuOPI2nlhV1(`&X)Z+ ze!5WA$XkEt)}`T#m(u6C!P1JyQ-hw$JR1Ew_dU2^h2hl%2x-OwQvJY#Us+{LVq1;E zrZnUuhd(exdhdB8QQ2aS7e{Uc+-Q$`XZ`n5(#B!l=M1UtCwo&ML5`F1)TX|K~sEzWP z&I2=@Zxy@9Ha;T=$KDMjptny;EfFF?X?PyLKWW;q+)#%Ze8Hf@?h4IxI>s%HEjTTt z(T7brutuWQEFmtu{ww$M4+HXlj{o82{D=4XpZFh^|Ih#Y%TE3GnE%QDTy}%}H@F&j zy!@W@11CyTmL{4gd(m^+$`5#A+==)|HrDLyGnwV3lcy!fn<-64W1K(pK=zxxmopFm zFhR=iuI?M&NzN@T(hdMb=-`Zg{-@fm+XWKIv>B5ZegC;$x6-Zc?alXEuCK|D&DHhw zwU=7A*3Rzw#>V=XS-#sUkbdEZ{#U4fBjuwJ?!CHv7i`f$OrzpY`i0=H*u8qv`!{jT1%LQ# z{V{ZL&7p;GbWP*Jrb@nxRPJLA0mjeS6sq&^`Ka4h&pc~R^Nciq)Vxs^NdB@*)18uH z59CGzrPb$AieN^PV&asV-x}7skLW*n)xJM`!_S3ED@dC$`ufp#KH8HmAss)!y{+K^ zJVHc+?u9(7#ueMMNPQW^BI9RmyMwtIri~o-{(7R04C`=RK*!iY2);$n)b$)sX^SvB zC^!Y}Q^yWW0;_S~%7vtSU#RK)karC!S&mgH)gO*h+^+^tZl~x8aw+g@yMUzlibK*L zRJ%1)h`(#xI*6P_xJaBtxV~YVG`fh?6h;U=GWoJ14?MR~r+q>Sg~GifVV`ky)JvI* zRz=x$b~gXr*4eNSI;`u&8r-Hu)K*4ddzL+83^YFLV;tc ze|nscMzB_=YFyda!wV6mV_e=ra2N(X5uI8{l*Z#V*MaI-bY*qDW~WnzN$Y zcpXJaV@lKu#SBrlMGO4lOpqXdOu}@-73tR%RuM!7~ut5HJ7&+L$TBV|^ z0}sG6Bf?9%E|YHUwBCyGR?w1{RLm`14n3QQ!1;CiPj>tSZ{#CtKd`Y5wj)0Lr@>dR zxb>p>IMIrDGBG`e1m(u#^dXI3Y+Nyiq|ZZ@P8T$E@{PU*0ZL$WNi7=>(*^A&Om0nkfe8-0dMpZ@biuvKpliXCaLa zTzuk$H!-90F;dEfWCj+}-;GsO-L6LaX>nO>#VHKZ#v;HHB8*0aHIV*P(L&lq3>Gjx z>0(Gc5B~PlbxApKfgV7LU72oKgCOssK-(^6G&MeOCG39+3#4iEI7IT<8+F8_M@RS} z?6#AlZGq=Acs3%-17r#YBNWBpO-3CqT7C8xO_te=gCJG4pQ?gU$UQJ{z=}zNAB$^| z=NOM^um8KPcVQ=ln7NKGpR<5L*1DJd@a?I)fG-w$dzHwm+&!=hMq$R;i|iB%n9U*s z_G2gRb&YM~HbETAiNI}z_X;M{ZZsc$H5A6M1)|Dm1cfL1V1EFM3S`I(%sv>!!q{1zpx#!xK=j^YCFDn8cWj=?iFAz( zrn7;gd!DO78TRBSh#3(i2aG*xB1+Qn`=U{*V=b;;rZ3K2gmu0FMdga*_oK6aE{nh& z()MDZWvABXL#fdeIW9D(yf0{8xcprwKw@!ITv$WqSx5IKPX(&RGr&C$1 zl0x;7KY?q|_( z8>0s_^l^rL!iu4BXO{F+zD$#JD0evSg&Sxdf#U$}+ad#+M(5PcVX&RS1~+{+IcXSQ zB?yX_uV)73I;v@OXShQ@Ii8C1cl`l8bRW5-?Xg`3h+&3^NXk4mj>Agq5cM1iK!)Fn z)OFXyS34sY^cEky;YB+&+mb6-7~AVCG@E}h>~{3OXtQpOl?{%j{F#Hn3`Smv#S;Ch zaCZ;bpzJPnzX>8+RlXBKXV*K`b1?5*UUNt*-_qCYm^5t}z)-FC7H0pyA(G!OPnQeBYQIO%o#%mD(yHYkHq z6q~NfU_U3*`!#8I?A)frjb_$G#t#dgbR-#-6KZqcl1|rQI6`}bAPL`ANTmxosgV5S zhd4=ZzA~YDV?XMwl(=FF+@lMG#tLpV>PJVZHkFWd&ufi#3ryh;`_Zdqb9QuL(m&BR z%m#Nsaa1@%mi;rHuq|J-2W(@Iy#j)0Am-;-e|{d2o9Ph=sRL=_Nv?gsh;cA0TSkTr z8l%*UgeEnvwbeu1VM$uijo{enQHj55!x>6qAot@iGwUSDJVVaR0>|R)&kE_F0+c8W z?^d|#VNVV?WfV8JecgWG5;_95`3c(fD#Yq*ouTwgzjGd9kcrLIUm^)a4?M9n!+@8` z*a>S}*P-glb%;F@9sM^$(%dh%qd5CYh4GjxIa{A(Ta7t=MuK2Z#B_^qcPHMrSf61T zbX&@XI{8_{>6`d%!7Rtdb{Zuirz&vsEsLavbyPnIyB%S?7>sJou?tA_jXGei8@O7T z$l76R`q}yOZQB45)~N^$!O|+@Cww1H+j7_KuWPx&HY$$I7`tUE{GTr9bAJXYmpkBo z3NrbVpd79xue_pXh7<~Qc6A*Uym(}YQ;KS}h8tj~vbu1_=m=xVMAX_D_aVZz_2E`J z%#Y(9xV5~|&e{vkoj-pp4MOC8R*-_RY1Gl}|CmlX8O-0ye@tViw{dBif^)p#ueQac zAQ|E>1;{d$f()TBhekYX50S!soLV{GWCi{_4W_TRED0_OB;(F&a{g}QB=i_#2>45* zmuY5>9Hk!p3WsPW=M4B3!cORiEPcZ)>irBflf4w_{Q15`5@-L2Z$nqO4y}aqas?re zWlqca#hB{Zo05*hbqsYo2B!D;17zRJDKSj?u)6!zO6*`m;AOL^7AkCgSW1!X!z{b90xvZ6>aWUmbux-u)!AMglT}`V5w=47=_vbQQb4)1 zMZK37>i#2ZH)Io&G_HJ6^BRLKP$^4HrqYBc=EDR(MD*7N^RMD)cQX8O8;205d#LQ5 z{(u5~j>h0z4mn3hLRP3-xZcaN1#z@%Vu)Ddh2{L^2trKBzlqn@37R~0y0 zX1S=Gve0PnA}-mCSyc9nvx%*D40!fJ#QRTHi{nTo?1}(3OPfFAh_E>vF69^@5LW`b z{oBBmxj^bR$Qo8mW1%j&S`9Mzt_TmcdVKASn)Y(aJ;tt|XDuWq3wMO;I@f*+9W~CY z$R}19n=0f-fM?t;6s4zjT+f4{-gq{BRA~0$g9N-&$#N800JvmY1YLMggdr3(t;l)! zeI-CmmKPI4bZ+;6ImW)2mo2u7Y-?fnIzIKs`h~I_W#jh>59x5`i0?O^v|c%Zn`*=E zEvN#~mXq%;WLKP^Q=|~@@2~~I*5k;}aEr8Aak&5Zr4#dq ztTl%ZQruah{Kar1Amb&GVDAIFLO)ZcL7RqQwAyU4ax_bPf^@H_0b8E$%08aIG7EZ> zkVvq&_k!&gLKeW?LXX#Hh{4jA8|ya|S1YL0lib<)a|2{l_O>u)GV4A=_bKt^y<+%@$9 z4PUnI*y#handAncUTuSt2U{apQnz%$Y#c+sd0i%$;$`lSbnlL?3Ul^YfCWO)(&$R| zvnX{iynR5;rPflf#bA<}vM^B!28J`cxiimcNVgeSCcZ#3wQxAmz=cmQG!dX%(koEJ zSVV-~*q3?`AttXpYu=}ZK@#=i1^Rq69jLYLrxL~t(6&-oW^f;;vM@urm|?H_gxUoTQ910% zXXwCRUS8c+at9Xsu|5Suo>hQD@NL*aKoLPep%@j9- zwOF(CT|;=b&_b^=ng@6|B>)CX*b9B{cQb3bT)DVj?j8iPEDhr*wv2Hcc&n$;J(23T zpM+jo_d|rD_bWEyX58kb-m`5DP0l5qfx{c_I76w-f_`i*1RFm-aN9}h1rL?pk)>_c zQdTFT4TzctxyCu}Npoq}(Ta`2#_v@+t*{va+jhFT3d3Di9Erd4oqtmCO<~~#RZqHm z-O*}Yn_Rmf(nvIKaLu<~8D_sVMNKr|58MOn*9u>-$C0SFf8sRaEJbK&i{{Ea1loKL zz2`+s6CCp=t|PEoq&O#x6Zy>{e=T;?w*!*q$Q9Y3BUGp5BeU~|A0Tt`bu9zj%|I(< zMs|B3S6bbuc6+Ek?mIf~*mowb?9hsZCefZ@5Rob^LAfo)gAgG9C27pz{#)zRbXb18&7+Fl`bU(fn1W5zs}`Sg zj)kl{>Ci(_^UR=u7C!U_7LZWZfEP}95r)gVo+c(Rk!a2rUs_Ve6MjB&xbI>a<}I^XDfr!;~ahB0>szC*4TyavkHP ztV4<=R6dM^HQfN8tFoDlPrE($*tE;+Ih&Fnsi z=-V12L7@+DZ}N=Or^l>#fv35qzZe62r24X{zO1XVnwWkE{5>9L_s!tkVfm{=5^~zR z?HA8^Q^q-3gc?KaU=@fAvO!dCHUu}PAWCBMg}yhwr?j#p^bGQ1y+$@|CnW!-d;}OP zF@e-pWJ_v@oeYix3kI0kM*EOOGOtLt$^Ru0+TOPO6^YF7nPzBLYTXbU8`v>(03)KS zT~M>QbV(k^t-`oCLpKE#2nSgQfr@t)qlg~tVr7~*FUb6xqsvMv+xsBjxFNbFFxc%R z&;b>N1Fm_x=QiZp-n#n!H1Lhxj@yL!S8XV3R-qyB;X;=!LE}a!>xNlU*q=D*K}gv_ zfn7f1I4a+z$Wo6C87-DcHRL-K9M1!B&3J>2mQefn(vKP618syPD-@WV>$*jfC(yP* zU1RfsfZzKm@N_=^!-K^}=uVPg`?x5EXeXDY@C|j@6rP#Fox}V{5$(&{rOn^L$L$tI z!k;FpK;OPSwKhJ`_UHBHg@}xvkt0+>Z z0o*-Jmw9dgROb{uKogMw;{j&qNZ{yyLgx)isAO5;=e#zB33RXI{FJPfX+%j{?EBK1 z&#~al=cAbv7kNmFL=o@}4d`M;x}hH+8(`kEgW>V9|9QyVY^GY~#9!F0f zx`PVz9p_-WYoL^I`TrDK?eYJekG+axT{XmiS%)u^khHyxHIIaqr;1$V@e6SmJ(dHA zQ^b=L$eJ|{!v2&HNR)*V?msS)(mg;bbQr@HHrSJr)XO8v$BYS(gBLv_o5NCTskl>f zI!Z`z3PF=7B*v$EbeVI`k2}US${CADd9X*`3jEY34sT4tIT5gRTS$C=xAxp{dvcf9*?N%Y0=>F4p@)$DXTyHW~cZoYr0O4#G& z>*8_SMTH#q9JkFc#Q&+pAAA$5XplxY@C3*|p#kSh&PPVs?Zlz4MOK*CeD%3m+ne8e zon-{>-@fA-_5kv|_aC>*RZ_{TNNsSPvpRW_Zao`>>O6Bxucex+f4$=KX zeSeqaHjKx+-Q7h@_o_Q^K5yaWNm1|1$Lr-_(iwPnc=`&)@8eeI)ne*gM>-5UqO@0xrazPw|8+VnFh&OVk3 z5#pTPx4x(wjZKtlHL2^!FbTNzfva`gA^WD}Vfd-~P6L)OjQ8aD#- z4o%*_Mtc{7yH9FAR}cL6UVFFBj%UBFo{rP*zjhM8#8)L`fKQdJvu6Dsv@^SHnN+d} zV;;dQ0~^Jz;4iMN-TrOc&!K5ONjmymX`zF9!*H-u-|x?$*2RTaZ!zGVM~l3$ku{b@ z)wQc}AG|PRQ(#z|tLb0S&Ku zPZ}YB9nXa%YFYRp!m6U@8L_l&gx^E@h z<9;FZ;R_TB;r6>Q?5HfPMEzsxcnr5d$eZjE6Ebml!0Uc~7(#TLsB*=5WY}l3 zr{;;044zyXSp$_j>JU6KWlRB|NM%B|M9}RVa``w^E0%X~Z53Smb69>OwDIcu>^32> zfO{TE_6-qnKiT{cHE2G*4EL7-55b=sd=Skn%4QM{lN4Zf=Q6L-Z59qz9LH3aipjig z_?94^4OyfH9F7zud{QtV{+ly7CNG%7#pN#ZkisVF;wuvkrUP8kJuo{Qy#~hUKHa&^ z;8!MW5lZ^h%M8xbTX?EWGs^4t@C`^w>B3t)Q*v+@5SZ?VBt?TNDGy*%_~y-jI>_1{ zanQCxSAJ5uni6PaN4on9Y)#&>b9_G90_~MvC;cma4gzGm#Wu<7__gEx>E5AD@OtlG z38MPi=)HJ9Nykjf!PCJ@S`ej?=jo$%f$4jP&}e_Zm+K^fum9$ETLQ*{whCW98+RCW zlI%^|uWFwBD6=J7XUL7lO9v)t>GYTCZ?9xxt&CIwx5(&Rew-ge4;xg2@AGn2qjMKW z+Y9ZrggbmJ0muWl$T<1Mg{+@;k&pNs=QT8g_i$oqH1S+cThMVKDxOug+-MC(ScHrDkMkZz} zhu}xnb1&Y|dQ-ykB(fTJTrdiq7CzJH@J!Wn7vQV0KNyk8#3YvIND8Elo5ao|p(C(% z4jtDid4f`9FC#Pk6wBK+M#`$kB>JVYdpw^SL2ni}giR;vr;BP|SgH9;J+BfzkM8mB z@AVYA2U{Fo>!;El6$IJU@U>}c>~s3=W2Ja{GU?m_Qr_qRpFREknu@t|Ltm1gII$-s z2OV(lE?W|cg~881qo`LXS*=}4!QjY7qe#vITL4g@9#BFOc~)zu9}cws&!cep#xuzX zw0?8-Cwz`9ObtrfMoXV0JlSlADKS4jLxr%2n8|l?`JJ;0v)wr*Lbj?W$`zth&zMl?&r`E#jb=YZS4 zK&Ppdv7T9``DOMNm-y}##M$E`ni(7L`+PA5#&=C!IX2src#V;359BAGl)>yjA<2&A zcObEd$jrXUg>yO@N%R9CN;om@tn|F>jdP>#?^jBd|Cofumw*k0M~c)dhkT$-N#BCW zXF91wkij-1a-N`XSK%))BnKxNljAs^L6ZLDGhC793d))y{2I65xdy6X>Pd*0y_M)_ zZ(=>iR?W$MFTnsC@gu>6#zfHo#B;>+r!>`Sy7dVBTX1L2nsXY(LTSkVIPOPOVoUc)g z;*6dN&!rAoXH?D9t;?!D=K@N$ogcKlELA$a8*>X0?8A$8{GH~%zgzwrj~yN6d@1eTEl==TADkdlHyZ^DvrG1^jjj;785rajOm4XfZW}g3}qI8S7hbS*Vq2I#1EO z^XsX7WM`-N6-JS-tk3(BPEZ~LUt25uEg$X}6QCF7<9x=XDl!Tuq^K{>onTDI;nJ!s zWUuS$NXRSfkWz@=#nuh$MqspX+us@{q-KI;ggK<|;!|W;jy$4Zaa;0M-yg;A~d|tT71E zf1OW2kpHtj8N{r0{mXT-iXZ>?5P7e=FWv+xao2WSIdN)whz;sd+jPVdWtT(c>9dJP zHy@cibw><3k41WFD-TvkCy16+w<5{Ysf&&ddpr|EC3br-Xr(HpP0$gqZC%ElV-e2Y?k*!zAt+$sa(b}ES6W+m&<$Whp5 z9vLRv{X9{^bNj+pv)V|?osSF6B}-|?k-Y8vy)E-~dI+ZM4cj0e1cE}`+sk60< zVBhD{+cmsw0sWn>6hac_-J@EUjT&U|12(;J&XMZqIgt%|txm%Go4bH@@6UJCoaU$4 z&HJR4Yc#$34rb&yWRvHiyIUshmaxEn!^eYuA)xEKqku7C%yJx(@$Jqu*p`c5Oi-Ot zZzZ=7CqXa3yBVyMXRH*^@&MHNR4?w4TfmaTA}I!XyF(v%HTn;s?fUt31K~_Aw`)zwNI4f zL=mr{3RYRis4i!ND1YHR!YRnAdq}=-#@wO91|x&1swJLk4q~TL{V>;iaicW(2egrV zkIaGlIhwE!+jD?7D?Sjc4Y>e@dn1{n6#a zjc8ZHJ2Z^wAo%C8^dO3C9h#TM?Z+PNNVlGV;r4!>f7|GOB3oYF69 znIzyl11Zf-plqzs1gWLZm*5b!)R|S|T(lNGVJGaM7P8UZAJRL-JruVgSigHTBxo_W z6nrJ!yh~)vBYLF9IB4IgSCNq$lb~qs&I~ygswDhx=Agm;&iBI~(ubA!gr^7#4Ff$~ z9(dpONy)wtsp7r3FlX8;n6nmP$GFpT1+mhEXOSP zT%}`BJISsxVmzci$++h@wNA6X$9tGeqdQ3@&UcSZXo&Rda;dqo|E6OfmAOuS`Guc+ z3Hbw%%x@6{&IvVBh5)Ix5FjNiD$aQdZ_HAPW>!8f0fyWDu=xAnniec9!AxKLl9LF? z*3n;Xs)|{sJ^hmnMltwAX)d(XvFRabZ8Aj1xp2t2P!^uD)JoW}!nhYYpr?0_ldoOT z6wmTZXyg&iw)VG`%Bv`nN?3}tJJAy@;c*zb%C*u9FN^5XkAy$pLn_fpD8(jXpvw~I zZ10Bp(K4yWgB1p-8l@--mN-%1B}CI1J>ZJX@lI%op#gYx;OHAWJtboOKNS=#Bw z${PqAYdk&&Q6MzwS}vGU`0%-my?0TVQp+VFx|BQ<_r_aypc@?R82sYwM~e?3G)n}< zK=ddl|hTnbf|84Nq z)W6K&qX-Ugyi5f{M2TSF(~Jz{rn~pO(~o!~^()%zk7~v&WLwxp)q>8W^gPRaiID+` z(jbk~b3o?9ojI~0Z_8eX1W&96CiS!BAG^UHH2TQm>gOcgGpM+@UH4nGP_9h#2;~-z z8O%fRT*J^=!+&U61&DU^M55;z_3(Ku7oZ4y99;%(QM=+jnG41F0<7VeKWM${~Ke! z@~io%MKP5d%2AB>i=~md!Qg!m(jHOQr!@;{+ai&1uC=p}ULEB&W?oFnfjeOiJxGhp zygh1B%@LptZ<|MoYxI!tFt}_PlTZWJ!}JkxAsqpGIAW@%DoW6=k_^(!??Ht2!JtXv zsK?9&oZKHA@jSGy;mb_?r3cjBcsN$1_Hhtqa#f&z7GsRJFLWP1;|F37`@8VwWPiZq z`b2!aOuqPM{`I%q9HXJoneR-?u55g!KOTnL4&EDviyP+n14GDh3L0{A-+uc$hJB>B)^#^u0aw90yo?uIxyJ%NS}$3vvA8l;(93>F`{TbAu+$ydk^ z!6|0vojKky#iMgN;m*G{PBXM`+SYYlhuN4lbh(kuv8NHSa8!g^Cy}2;x(b2t+R%Fw zG%hRDN#lV&I9z{sysUe>LD$!5d+rw^NwnZNN-e#UMH)2|Uy+acPrFI_e%h^OrDl+& zb}T3e;#J3`JYTf0cQ?#0wH}|1g&*;TqzL;$Tpil&puCxk7!93Z!eK~S@5Rpxb5&Ev zHp{zcaJ#K$FAK1MWqYlo6&41n`O|>m5nVKmQ00}U9fxK7nOatz=&Afb|2x5JEW5x& z+urYSx}bkwB8Eikv^q?CDUo)-%2F=ii`XL)63>(@lq(3Z1qC zyX|l);gl`4{nBU%ZW$42kD!bR0f8Ic1pUR*;~wtK^5w*;ZJQ+JaE;8iwQ}qlR9TOC z6gM}D+f>dE(1Y3avRr0C>(;D9+$Y7Cte4G73S8UXfJywp!m~pgZ`uJ)pJvq!qti20 zyD7VN*|0U?2RO=VHfd!#Bz~vfSY0pb8Y4jDj&I*|wrF+tIy3dlO@fM%3%D|{FB zPvhp~uy(QL^buZm=kf43h_7#(FEVEoS*DLJaq>%NT!{L3muzok94t+saVkwdQ4FD@ zyANVLy<~aCzENp3q}(1O+38>_unN}0uW@xxKXelAam_WwXE)HMxnbMggMj*w!vh@m zGYeHZ3#3GY$Bo~C{cg1a;Im{GPFJ9%n_u|?-TAX#>Kcy~>q%*(_Rw)5i)U<)t7+Pw zWpvhygz74FAgm{Mr-LtPaksGFjM6ZY*pDT&!6~?9W}YjT9C$GHH?q-lW0JRzJ-+ih zns63-!t-#8ReetzuVSA4yUxtx@<@411JvQtPp6LlnY+dY2sNGvRV3)%pO4{TJ*Bm` z$Cywhi}6&n%tpQdG&C0#Fd?qKS8ZqBmqxLiAP}G5r`>)^76+}~C0SjdM&Bt^#433y z{PGSCmr=Yt(w-^Uy+gSxOI9ZIs-I;|PL2G*0N!t`4Ip<6ZCK`Xy18qq<=3XOW9DJ; z$SRk}p&m_&3iZ*qiHA_Cm&kxE%6c~QNH|3~$g`igJ)qY?Zk$MqLz*uV3Q)%)JE z;SEjOKj`F2x|-195(Um=F*V(UTO+3Dp>c9GtbFFRP8(?G&wqd7+qzc8O9;?C_^#h_ zGEPVd;JOupB33LcFu7C~tjA(?J5kk1y>3F}5^nwTa%&69VQ-6!Q9oo=1J#(Zs{A0_ zVL8^WS$6unW9ZpQa_P3@8OAGV^m}EWt|+6W_LOdOt+W02yn1uv8V`}qQ5zF%k{ciw z`F)FV%#?5}$$mzC&aIDTZ?`y2N0T*fd^ub1EJ@%Z0DJ$@+ML(+@Ehp66aQg@G+>0U)#x|PpGlhg;6MHs{*&ZtIwpqsS;#*FL_+^r`pMTAnuBloH7?1D3u2#xNL(KG&X;$u&|H=mWDwDX zEFf@56gQ(hL(SO)*A$zmuW_4-l)ESQX7}F|#p+KEkMD{SPvt_7SxF|LzV{rzbG*GJ zIQ?d>q4S3%@7w+1La+|S`((j{OAJl`vPOLHig&5^2~FuV!xr_-Tg{N@Pf-b4q_fzF zm@Mb%(*S&8Hvd8aBeu_7f7nD0&u=^0J$^R#F$XN?kI2ZMo*r(o3&JxOL7S)_vtiyo zPM`0$P4IQge6WbIRZNbGo#W#f&Vx`*bH!;1FG~%2bNe&8g5X2euv65x7`1vaML9gmjXf{M>&e2*cxv{@_s`*5mKFtH=Vh+K?_dfYX+RK~)gQOi-f z*vBcHwYVn3MklsPlU2t9#gOup&#09o60;APmho3LlM>o_`Un2j=9sUeO!9@E7pf1x*IBn?4_Kjm@lT-*K0eRa+Rn$} zuV?1VFY8x0i~h4E^AP8%U@Vpt2s87x~JFUsV%+@ zA^tx&=GG71jLw^VfN8HnQQj#wW#uTOLq7q9JSg*GrP67wAD(4JG3}YIHuwv%>7VAc0S`FQ&W8&Kmm8Pmk4{ zA7ZHl9Dn8zE7gt!&XZ_T!hP>d=%(<$ThwpA*Oo~g{gy?4Ge-0up`YG=OwR=4W^l{= zYRZ_^Fjw2*095{Ip_Eq<%Un)mY*?y9)H2Ha=`DxNF_mwK?NMcIuso+gDBG1Mw$ekt z)A`UtcCvB^7rE(@nt1xjgZWEFJ5(hjRDVL+c|x}YX{ ziJs-uCLK*#K*--bgQ~m-llZJDg6gq9l8}GB-$CPos>-E`ZR5!zps2@hX~Dj+oJiXGs_2%o7jIWAzScjT zuI+htXMiqwHTR3KPb{v^B10Hmj~~Q7;JQIQ0MC>Ot+H0E)0~5Ern_p*?$8ad={NIy zE>N4cM(>)q(UUA}vXXY@1k;yErz?HUPl3L(c0NO$&Lc2I)_N}>B*2T5eKvK22s0j} zh+pgaBL88r4>aflG3j!EPDx%olr=L^-m)+;ggRV---wAi=8$H9lL!{Kk&&`!mYR$z zWHUJ6frgQD3LbnQLv;bAw`n`&-Wej;>12->vAvJ;Qz38&+nOn(H(M4fFndSgW5TYW zbVFJQpP-q)9a|czhf~uy*|>;Cyw42JqH8g^A%hNi?_uD*`M6@L{nRm6g@Yv1QXvD6 zc{iDwM7xhHgB5&~H+BIh9nF~7|BwyF>zx;cUajwlbpp{YeThQM%Y4`LkJj^BaEEb` zSc1Mv(my~QzDaz%k<+HZ&A<(sFk<3@)!hEjn`5o=`pIA)DY02SUoO2njXcZkE~)t@ z;&sxHN@AUYc#zJ_#$dCsDC!#u+=8sfSy~Kss~~w%qpu5T_{XDIDX6URWA%=S^!X1| zqRw$K<0iB@ie&k5IYGt?l}^C3W{tDybW}3ZhD}eUKD^61_pPO!mTqp_#x0 zrA3(yBXW3Yr!9lKVc<0g-vm{e-$@j!@BO7b1MF9Xm_yWr(LNtFDZ;5CtzHhXQMaQK zbKOLT++UH-6#|+Bqa2+hT4Qta1lW25njYqf3ME4`(l-EgY|{BHbGWS zjAT~UKRvj(i3M8tnhm=9l*LH+yHYG1l}~aX^;9pXv|8Y-z0995XLdc5cAYX#4%KWwF%Ze_ODs0|& zM0xqka*v5bS;ebnAA|Ta93G)Aq@0a3cG&ePPJ0bHJ+-xZEA)<)#EE3?8(htO#m*nJ&!3p%PnDGkdF$b0fL%m(G{Uwa(BIOkN z%{Ra+F&2xwCbRyjXdR|4nW0~_e%vgMi?CcdE)w=D7^O;X2o!>&&*F+T5-Q8`7;Os} zTX-LF7EP3wI!Mlx8m_(O#g{UekObh4^Z2_K-&t7S+IJUJ0J3B(7v^;YML5nk_2(`> z4GJp9E^MzPRVb!E3Skn|tBF=>=1_XSuXfE(>Dfv#>XhF77EBvvHyou%;cK~-Hf54! z>HeO`DBl9)NUo7#yT4Z=gS_E$$k5M9kU{SXb9c!BUjIeYHt`?3_qlr z@`~NVUll<$_9sPTnKwH)tFO>y!oL$f=(3=^Rfe=1J?EF^GeK5kPGh0hL(-w3-4Y3- z3@a@`uv&Cc2%4pOTCwOFYST&O3SXJ4TTLr)Ow5N^={R7GOgG>7!<4`x|CgE{TjYZD z-;n>ayV)(||7?G$|NfWs|I4Bs3S^|n`G=BM#7y75%h$FlDP!4>eeb;(+z!UUKvuAT zopr0VOe&Jnvg)I>j3UC4%8i;9GR+S_mx=2KmBnfz%x$BJbf^L=Xv2?YmshHu2z?I9 ztTbkZm&zNew^D5erX5KCU84!C2T1~QKJiAWE@*NKXv2|GifODO<}5KQ zz~S$imxHc?soyZ#Rh6vMU1HKt)!EZrcyn17D)Y)@cqb-9E4I2=ShO z&>iDlnSY+;obe^G=%2y=UtY*zvV98Z!z|!j1N3vnfcfYD#@1FRfBtv3I-M`)|DQ?! zvuLFLd3E8I`>4ogYs<+Y2Ut*YkmAMSC_)c}8RzWJ>JF*Q{RxQzR6NNauIEZ*z4vc# zqIk%Knv6o(yf5Y)T&&J=#@czbSZ}i^8`;dFWb$CI&$sVcM zs7DoH2Rs`?k(L&v?BA}Ov612}*PGBH8@*B#_vL2b|ws)nSHb*ol6=Th_Q)Wxg+K%n51r7kN}Z*)9DFrwew#wJ( zH3B@i$#m?cyzdHC?9@eeaU;S|jK`$M6=TUMAfNex^<0L2&)xErYpGq!c}_4yP+e-g z@~}v&ALqjPR4Zgy&8Lkma5xh1D|=S0?IWYH`mqRygPmlyAC;1@C2CDGO-kjk@|<=4 zur#q2hE;&``NJ~sAKqfpxS#|VH5xq^DReRKW$sKeK*_#oLoS!Xmb^0pswAfu9h2!a z=(tvotT>;-3AHAy#?>7upP%JAk{tH!yQ=vcY069(FrFWzR5E`^vZAiEGEg3(7=GSP z$>K>R@vsPzIz3EAY3+Y*;3k-minPtAIhUs^FVS-j!l#Y=Ol2KKDgx;xDGh^MviNR~ z?K9FBpR1H9xhO!lcFaZ8*W+Zz^Xz2FN*y|7e8XoDI#sbFJf7XRUBZ z)2z7P?+d&?Ka+D=FHKfBoWdDK%T05wj1COi@&1d2r>SdmqLOaHt9SX2|lHL7E4NibB^_ol;#`sw>YmQpxJUqrCRT z$oGd-R?Fjh_DalGokd{|xGEp#jR6Zu?pnVD*GNi^JtDgLWx9F0)_GT;ofF(|H$lSH zLYZbXbt@-clgh&~a>?jD2VOF0CKw;);9X*vQ!2wiBn?pwSNM2B)mW*@C6ZYV7M4=& zDbfISWMWkA4H8`)(?i_H9H^7SL^{ivsyw#?fr*b0yx8YhDqv#Ffb6 zuu8CRGu=`Kn|EiO!)}YM8`+|9jCa{WN&_n_e<}N0@f`8(B)& zJhWPJ#|CDsn4C)y>$YG#_nfIXxNNSDYLPAUn>?mOhCpN$Xxowt3qnkB>&)+>8WJ43 z!6cwe^m#A^y`)Ut$-}EQ4p^F`t?!g*N$mwV+m+nk8ZfJrSdfTA=C(lmBe2~u<_fXa|Y1X{4s%m@1IwF$$mVu<{>%rz1@Vi~B!kPsQIxC$%OgMvBN-1-oep@lfB%Kekgr>`? zb_`eMYwSe?ly+AjYRkq}q@(YOWUx%0gmUfvbM))w^fb3pe=^L5%V}bt2P%K07d|d} zfG)%Jzr6>Dxh#3Xx7AE|&WDt9Lc0%^@ZFa2)U+rWP_&5@HkMcyZKrKtbr!A@d%a?M z6O~@%%9G+H)o#aBy7D4`v+wjV?2c{ftL7jFv`z3*B>E=71ZBerXp}%?8UayD$J@PQ(usm5#qlXbeu9r5AV+v1J)1Fp-{qRIZ zEm1&XqnCT%td4$J=42MQS~+zEFv8YaVsNIt7F~ARsFs(Vxg-JR<;fBoaB~62UEre3 zL^n%Rz%Z$Vu}>7Y){$mpBt2Xc4kl9}{?1CKV1t4c#qYfssZ;m~-qr`?p@KPc6Co2R zBaAxUN2PJ3@_bWt1Zd!KmOculQx&(MIui|!Z_`>NUOAw47NQZGHp}={XF|n}G&o6W z376HFj(rNc8%G{$)-3hg9}`MwkeHt6}UGdqZhkSTW9T%I&3A%qb*k zB^!vbMl=}wJE>S*Mh%GiAm(FckSLE&^nIC)y*L{xv?u41grlXY3YlsFUI$~UlB~DZy%~nwio1ZTKOL)(`j9l? zSyGF&u1?)cpHPtzIIAKu(byr2yy1Ndtag|=kuUL0~sxr8lwu$tI(ihrT zo4a9?Zr!dWD9Xw2=7dDm)(}VysAgN^I4$@q$ZP4I9%_rUNP=U1j&U zFN=dRZ;EwiyA57uG(Ny>+Y7fx4(9 z__}_p>`xk|4*7d7XUg>U{VtZvsaQg4QhxcZarqaRl1Z*}rj!%#vhTQS%Q~njnxYVu zb| z3rI!cPdtzy2gGbhrpWk|ijc)LFPW^8ak1FX?x9qfVJ#qW1RG}D;vn6j2~7zvHZY~Z zv;=1I5LCK%Av_87C9u(JEbj>NkV?wWrffYa5_R-|K`0#f=pHPtgBSxf# zOi4(R{i6g&MmmrZeW3HqF3UG@+DH2WwXoa39}h1`(WJ5X!>Z9B+zH-i-};!jVHr06 z3?Z2^RF3aIjN`?8(JC)kl^8|~#wRTgEorW;B<{U_LT-1Uh67(>q#z!%n_lHVntaZ= z`49PV*@0%hUfQPUc51&bxq7$Wmm8$>av(~qZoU>vP`D$=`?%F!@q1CG zq%mps#Menpd@bHui;#z#Ik_3l-sLiG1EY?sJUe=gIaoTH6QAn%b~AISPPyPS$~xu=Q^pnMfxhw%x&;X?e(1S zlhJs_4bed|gIeljLn&>RcU#QWA`Lhh2`PV}Rk?3GJl1w>VPjD2fulIMF9_Rlt%Xq>{@l3TxHA zW<;?DRWIqzRl-;-HBrw1UC{o{=vIciM5ZI7^cC4x6&bfk!*5g^735XusfEWSkc*BX z#hJf#C^(60G%7BA3r*k}T>dp5(yX}QEtjIL|7T=|w`w}23&-};1sa;LIOhkDDf!11`_AR5Vscz&wQ`;)Max06 ziWZ6{gC(709>hK7on zCHm`wEK)sUq0Ro!a=}bpZM=GU*njai(Asc$4T`gBx;4p~E4$ zB6k|BIAn__XXs8=$7WR8BM$liXC0;+jBcr7TuO!7SC-Bm-fTESW-vUj%p-&!CaKe+XGlmsJ{V0{rMDb9ivk_S_ zgV?(clC?qLMDeAS(`FFG{`#*`KUv?}-0ZX;?QG5ophy0*;Ew#p3sNq(VFsY%RSYG3 z%Ux~D)(%Q@nRCDS*P<+zIz0|M2?wwT&Us0JR6tOs40IGfgn}fG!#rcu2&S{-N`J|D zhm2HXK|54=^djnnpeznJxqk3@4^oCh|yF&W^R*tnwp4^ModjF=<55J@ly1)F#DVbb(E<8jE_yzTUcedMG`TVcj zU-JL_DdfMUQufq~DSPVoN*!I}cOm0oFVrOq$#$8|3eIyB z3eE#8;rbjHH2(%%=2>w0+#duJ8IoP;d~iav|3Z=ey^{AF9336LK07?aYQK)-)GGYl z@R~yHt)a`am5D+#M)^v6LsR&$AIH*PT|43^w@w{(P2(p|?SMlTx#S7VV&n}n&uObz zl&YJTo3_K_L%A_Y(H1j}k|fC7kc|v|T%^Lk zyE1^&812nIrM;7sgH8?$J6P(w!Ua&4S*dz~cf0L&)Ak0eXel^LP8FeO5K@T5-8&ml zwl*rtV+zK(kyfBN7|rXD^8pztJLaOuk&mkUDvVAztKsf_0n&K$V5E6pJXs2LWdoUa z-=F0z}P;Sq(%Ip#rQDq{`cdjLmB^FNSxaPD_^I zDaWbg0zwk<31Dm2 z^|e1nJ}irsv_yh=V{Zuq-uS(mUIv0}8d=FJIC3W$RPqxYfLIbu_zizd$!RmxsH75U zq|;XzQ(-i$*cGrSA%s71FnlRg0XV;+<1j|yTu_mbRowwr$iSHY?1>Q)BM%7d5+k3; zyrPS)FrQhH`%)lvZub!t&~Qpv4lPLm41My_&Q+qmz?CfjfbT)gNOOB2IVK>d0TbfW z7F{LJULWkApPah;M|)>y2WM2Q7B5_N+q>*D2N14s@idnwwzLPj98wz}&$J~fkK1^n z{~EIdht=+LP(d`6_52n9 zzEi&ARgLb$l1bL7#DRIZXOHa+Den!h04_&{iu62}2i#?E4RF*yusZ2waE)JMT1D~c zUG+vPOm-pBKZg z`giqa{xeF8QvKCO`0A7O6(x)0APya+h=yOjUSBRBO$Bc)%(xP%RU1wJ)?6rJk}b3B z13r#)?Ht?KRt?Rt9+?oz$6vbOc@|&Umr5#=_^kKx%R6EJ?SQW9jf;HR41~9r9IyQ8 zYg+pr)^V`-6)OsPNfw(`Ute-*OP7?}#&l{@(sb(Jw+-rN{+d4n!ar1JOKzCzeCcV6 zPhrrcPFaVSn@6?^OgfIzLzP|A&shmeF01p%_zWORU`Qo6oR1_v)X`>;q3Vf^It}2( z$?2=Tb5!-e{(0@|$=cUL@%78z*ROhCpVd|t;I4=|?2}yL^YVu|SKxElu2?WPO#DGJ z7mHiOtj@>|1U^auP@}f`k*D#=S^Zf1y8U>FuA#CO0{tYu{;f8zD6AAM>Gtmd2C!`o zV771o)oZA1KlfTkuO)C5`{L`L^;$Y#AL9`2zoL3|)KJL9Nd2*Jtyjg~00a1>wT$(o z0K@L__AMsUm+YNl?k}w77iQMCRjn$Zl?C z+6{)EzMqq(iM}dXWv)3GjS6$jF|9du!Ml$-j~;inZ8x*r*o>YF>+rRZojWeHbY1j< z?lhOhA-WrKcEyhK*y*-#^@9Nug^)B#R-q7+t6;7x?xiJG_2}UDU)JSJ#BuRbZv zMtLgE-c>KCZ1PT5&?5@)lRJZLbe&C#&JHGMQwB-JI7bbmET{Y$MwA@~ZOH}*^!1W= ziP0<;hS%>rf31FSIpluUr?c^ReY0z)$nkX%sS+ep<>u2j&wh6Qad3Kecyf%X5$Z6P z`T}1zFO2;@a##^bO|AFkq0FM7!$t9DOpZmzd$aw7OTxxsA zXNO`Cp=$;HCuKKkFExzK>}t)Ke>fAYx<@sEtYisMhnx|LJ@7EuFf>6+@)#ow;Kd+{ zqJ;OFUBi$Xnr_=bY(b{oz>vxvW%+noXB{CW(-k)Nf=$`n+ zf4i|UK^pRuKONx;o^vr61B?u%Q^}=0QJ>T~cQMMyR6HW}jehb2c3@2#>%aKFy!~bP z-G8sQM7`epv$_r!{Xa6>3gv;)d5AvW4P=4;?^b&=U;nq;?R=^K_*e1&eXX1^H04mP zVqb&acc3lXTYa>nkMHtpbSE4$@avCN1(Q=B#egrC23+)~)Oij8uvN{&bBl`qqOG&PR-V%=*bP1HK7iZs`mp zTYr4plGOs_6!%^qN*CLq&b{Ap9#K~ymSRrJj4x;TrWiysbT}y|bDeOSvAflw{bG;d^wAiN(Y4 zewFZckxxM{C-wM`nv@}(R)KEu%;g7UC{4t%H}OsBb#7lagk|v9d-krXMMJ^DcJHz@ zH?L>|IXVxaH4q~mVJDYL*J$QO;nN0e#Fl)VPg4i4@)Im;SdiNRmu|kJdHu+X^{hKw z45KM$$6Gk?qIp{_T1(VsVdgrNaTF{YCiC-s>VX!Yft#0QS+7lQexr^llPsbb79igTqK z$cAnqr-+-E(tvU9@TZhzpuyaWtS7leE-N}zLGpR(d%FPJE%8?Ec7F1X^MVi_-Ys5> zMQF|R6a7r8D0{u$pIbfo^6x*O|AE*O11obMDiU;o{ppoO)!D9L8m>58?b!#Vx_&T!~?8{Xzlf3*3iy}32)ZVz_4 ze!o2ey7jg;wz`{se?Y;W6YhwjJs(?Rc~0f zWts)N!02SLm;Q$UV_nzO-3yL+Z5RzG1QS17qYu`p6XzD#YpZjUM@M(4E z=BZ*G%fxVU8uVN$W0gs^ZFtEOdUhF2PIU}HNfaQ_#!6Y(UoPkmu$V5i+N!d8qu>LQ zr3Z_5DOR`I9eI7ufos7i7$9ZRZPSL+CU;v5eL(XzyR?{DpjTy$L?Vg{#L4jK1p~bC zk}NAf<@1n5#oAQwiKh|vaujoiakAeEwIgc^dXw3nusRSA*HA)1)`z0@xR^8jr{#jyR-4- z{^!pi|I58E>T!P%g`?oIzFbIfjVgb{D95_jTotvpoHkL2%w5f2GyQAk$GU6}Nj+I2 z{gX2cT!Q~<0ygiHPR@+K+|eu?n8~NvF+LoEGGnB{{Hk%<->0efdiy8GFAjfvTfd5u z)Qyt*JF)w}VtsIX37_3f68bM7@#d~S7~mf_D6!x9lMn07DnESc&K-fm<4(QwD(kq{ zdjSu7y}hGz_w3;H-s#@?$tj-4^n2#>e0{Wc zj;>oYVyrn+FUJ6Vt4Jgh`mM(lJiM<7N>PbKjj(g> z!t?|sQbYa&5%q75tbv~V=mOz`bb0}k!cc$P^A)D_zIh>~!Gw5g%YfJCETbXG zplM8{+VK<2sHJZDypU68_l)mES)@ddK1Gok@2@j+LL~EeVrF>ss>u5ki%iF5VlDej|q{46hS{U7|;lO17TewoXA=p%Gvf=%%U1Z)nxT=F=n~Nsxu_$s`6=X%LNik9wBjp zJkIOdPq73Vhf+#^3UwZloKbp4Wh|l!RMuFFP&|?yXUn)*T@|MU0gnde?^5(};z38O z!Cz=4Xv^}biMXLc17q|*vMPO1n%@`?0X%U4DTyzVXciBA={|+#(u-a&x^U+9{Q>_E z4qNQEvjZIiM2d_Jhj4xs@&p^Oj{ShFeRvKjXx*0ZolA${bpc{~G2Xr^BF>SXT2C8w z13C2;iiuqk6Pu+ena^1?qOr)_L5b{G3}-%HlH3URlRTWWuj3!j#lED&%y9BTHV+7*<7nnG#=a z1AK{DHD7prX|SESU^T0X{eD1MT3ji+N(s3NI`Yqe_~)Vpgx&Y-pJH9^6(7XJtnN1E z4-YAEHVJ;!+b*9n(7*P^jame}@kGXu`Zxc>GL#s?J{}~;> zB*rR3bfit96SMlYBONoJHs1CqXG70>*Q_=3HE9}G* zAir5^465z_@BN;N_J5Y#9x?&^BLAPAZXy5s*4CH&?|+^ApP<1;LtxwtW63Lmx^>aC zWWrF(=>!AmU?V47x|S_cQtud%2N7^~ohg(vaH8D3cXrO@LZbJ+G8)PfAoOursZj*BoK1T%l~w5({k(IiS}u75GbhaZ$SR|+I{u7iE%6QCML5NG z&E~zcRZ*%>6!US38aTQPhFrW|nyG{H$TdI>TP=n8#+Lm#kyY`4ATq@iSCwU42(%<) z?qN3!#&)?7HO71z>I2>cvh!@D8r*^GUZ+j!!z`Ji;7xNG;h%1|h{K!n;U}LnCHbYE z)Y$(}I;V4N=WuJbXUK)-M-Be5^b~M;6BiCjBwjaXcB8t}#rGA{D{Z^+dFyxpN;J=^8a7M|Gz|XE>vmB z3F=aSP!vX~lQBI7W+|qfB|ke-4eW%4xJf|19Yo{VB(!oBs$lKxYNo`6Qg!<@pBz`E zyyeuVdz=#Yn{VXP1jHkBdgx}4R1Q_(jlTTqFiibR%%J$Gns+_f{k}oY$!6EI^Vw-C zNNCCpVk^*?gD8m0lmw*ZKa?kE0iNy1%g8gJ^Mn777rXoNZ+ZStr~ShiffnWe=yr1a zzq7N|{!;(tuVeqoi466JJ2&>Yh5*Q86y3u2r)a>T14GAsT>7CObEQ~}5W6rGj|aK9~W#31D>YhiP+4nCl~gAN2| zuw~H0XUP%g3!KZ=`D!7ya*$u$Vitp|U_6Yi^x{9LXS6i5ELk=PTojQ_5yy_z;um$J zP;7Rir99n@Dv^-uM4`V@cA|_woWyng#JsU=CbD5I>K~O$8{~8JW>=qhK&M+sX zeX~Z9QQqLHC{v}8>jO(@xa#7_Z7R9SOc`L_1|mOlVWlbOxmAzec%!VfRuXwM4mVV) za$;+{#y4CQ&?XZKWEAEn1$9<_Jcuysng!ia>%O$EjW}}gZZt{r#RfkUS-IIRhZAcO z%(L!+mbo*mNQ7w{`j8D)WKYe7ipuM3$?fv2v*S2xop*Ri`S#tSf;)xtkn)yNA}H&O z(+6O}rwbNFixRvBiLpj5`v-Gn-Gt5>(ZK28rXhn`YsGX$4&W2z!AX5((D5r;TG`Er z%84mn2f&!w^$IzmOjBT;?%n%dtbNfq+mMlJ2m>Idada7bla~GXEnd4=qp;uO4aha3 zs0F|L5Dcj>a1DB_!GlgqwBNmZ*IMQi7@z!P3qG;Gu>O2km@M!q6k7_|3X}_W;?Lmx zqa`rtbQNP8Wt|>!W$XLW`E97HDti-v?cGuoI|sNbAhw)SegKIlwg6Oey!YH}Jzce) zznAF0=#_st{f{j%5264ry8qwU&fov2qtM@>y=Kb>QQ5?4%Bm z>n-a|R2L<0ioIIOGc8w%(p-HneYIwt`I-MYE7GR|Lg=4j)*uM3}a=X|oeTeMHh>F-K&acXTP3j*NLOQbF!dj7x0 zPg|n5yZgBkH~i!&=;{}9D;Ti1vgOc@0ul@y_ssj7Icg4;drI7Bip(U6t3ZI_`OP;f z=QajG?#^-L24Glu(}X1-xkG;(Opw_=MO8pOEsVdY%8x;?AG-b9r^Q9mFx^5cs_MqT z-D(hv#Jl3)jo#-nRIEDpl$4I0>Si z-eRkF3rTlwcS~YHY36W*qdAQSnUU-gNP5ey->q0hG&rYGJrNf$`inK{UT*ZP^mk8O zkRxyAB?erx9}RCWOr;>(KXlw+#TXi8eiz~!`=VX*AnWlL4dcP&fB54ey?>X;|GtsG z|Jm-gx4+2$f2#Z+CXLi9o)hh?2LNo=cc&bLU0+g(sL{7W^b_E14Fc{MxIj|7*Z09_ z^jRNLMa&?H#;8aDGC*>T?*)KAaml4H_3!s>R^&vz_#I>C6!%elyDSXL54*Oqa^uBx z3QGez`9l3SPp`!3^DM=*17~vDB*)6eO}X+8XO6)vSyTW9uX_e6^oZfTkkLABJbMzDyf{XP!J;jWSDp3<-~$l(3I~7Zlu{2#K$RQ#imQ zK6VC9-ycOZX?Y+O5Q_;4{PZh3VaCAmMu_w|pI!TLFuHZa$W?uRl{@KH=pJq0pp$h1 z%8DD$LMIAkC_X&LY{-33UQ<#)ceBu>fp$;Ub)T>Z8fcpJ3^oBq*$BY8IBl*0hevvE z6b)txH}XGtn4AL3uBNlZ#U&1s6b*`5#v81?=rH4u%@Zg6kk%N2^hyVE3a){+L8$Pk z8hdZ#1!F`C@ClVfXAme4caLur@wd0VDOb9GNBUOnT&1ND2!XOL{>0yl{X?$$;QPab zDlTHp0L;V@d=NqE)Oh-3e!VAWj!GPa^2)*SKi<~&59{wp;8?;Iq8@RB+|6=2o4Qm` z-XBEQjc@2q#f;%TQ}2Wi@+yy<^QYK^IgUUbA5#9j1dxxpL_v(2WFgtnc!*KYeGore z;=liKaQf`z3=JXbSD7q*C0D1Ha!%lkk5AnF6KK2l<3atM&O@UjU!QO!{6@Xxb2G2Z zS1Mr*L8wNwc`x{!Dk$Rw(Q85?*MdAUkuxWJ;85x{_wfnpGT z-frgWv-O`aOg6_5VigcFErL`6|d9DwCWvhZW&O3 zXtuouRxySETVV*z1#a*Qp-)12oyC+9$Pj0=ON>2p&Wx>2eji^gYKyXXJ%250l}(p1suUtDS3u{npPR!%1wwKqM`fJJ zE$SC->5Kj+W%v>~{PT6f1^V9xsC$L_U)?YHAOCFr-zaf@dI;X514~K$ z2C}%8U~latM6-FiyDl>!^4E>BBb2kvfT-&7>_(Qy+ zAbGSQyKSPoxEdF}RUf_0#;9v<)SFETYn04)&RpTBF{b+`o1*`(2D$}SOa&!}KhfGv zK-t24%YV?q#1%P~B(j*QEDM3XWN9t{A}xy&jIb*E`xj>-7q0fj4uBnxfF>C|(|9 z!-(kJ?b@b;+FGZ@>{>SXB)-c(sVZ5*fe7=5w!L6zZpnaP1arFdKYy|TXJb&&)oY?- z7XhsrL1|D#0dokih&_5*n;$w+ejh&t7AtI-9l69ofeH*8W~_TU)h%PdNLRe-Cs17jGp0xccwyZXy1^+u7Ru za{m9x>_2nQ`m*cR%#{j5Dhe)F(yi~3N|FAbUy|>Bx#MD_&fp3T?k{ZNKe+#GACBLt z0W9+W-!91ioiFy^zu5k_94NF9Rb7aI%Pr5Tyg|N!l)bEOq+NXzPP{m|!cc8a%bLp# zLM1Yq=H2j{#2?MZ7%$~f;8Yr^OJI0#Iga{Ro`UrOc;yKodqwqmmt}KHG^96%wx;Y- zMF!{)W)lsfX-{VT#wrnUFi6(9TEvkbUZz(q{dBKCI18-6?5ubKJJ7d`CpU4x{uqZR z&NQ$*!2!kSw4uI{e-=Kl{5jA3RP=+;!{RF#9fkTw&Nom~c#n_C$!(Wok^`7aTrFULR%(!^J3Q&7H5zclc4< z1<{=dBFy7U6Z~Y(e+m=b)g($qQ>hSXc}6D_8>+9`9iuO4!s_QS@F`XjWb`4XU4jRuc4)nd6vHfsXm3 zDwgZH@q!dKWdr`#ECr8MG8uyodbczRD}_IrEB9DR&On%T5R446T`Ad~R{!>5r)DKwEgcfU1b z1_Ml@2_lpqihcxKo9YX%^Zb! z9s;zp;IKnROVpd6Y84gmG&cPYY3#YQ(*FruhS0x-G&Dr5I^Uu>D*W&D&%t``%Ll6Q#V*Ps+3D_OR>g5HUI_+*yOX;R?2E4hUKqWAx@cl2LvC8L;adLXWBymfl=VgYikZ z47DCK8$$MkHy56Zq9@Pe!67U=4QbR|Tx>4F8Q>jDLm70H$(f+IS9?TTK5)e0WmMBO z>(EhWTt+p2seS~&U|*QiF@iE=EP+F1+k9Htj1??MX}*tl(jhN0bezdWe<0NzXW^ii zC}rC`UY76f`(hV87_MXV;J_F{=fwS7hxTrVaw&f)z^me{`t=$aK!ZUMejA8;a7=S|}7+a?61VKVBb-&0AiUdZG2R z=)xPDp0nluOxoIt>;`7aJ@gGD-$J&IlX2Pf(yYlbX^2IML)~_SJ1qJuS zw-{REpmWBy>V&D02dh`-v!QCJt=houeUKq4VcDG`zvZ5;qv9MH+g*K{8@qxPvc@8V z2K26kTf`)HdoQ_|Ijmomb1_=ja&)wkiod?NfIUKW*FxS8SuFo>im3V)Ozq92U+Gu zs92C<)Rt3^HrE|dTe9Me;-~&K{li`P;fq(x^om_FNe%ZL?4;> z@!yI;?{J)Yah459FI4GT>EV=PQdc>n(zMncPqL1^6*9MInPLKxH><-qj6tR}lV5|) zLO%s|0NcS!HBJ?pML9*2%t0DEK_^rJM~DcAusaMGFCf}3um=lD|F%FWaDjBF0(9gv z1$UL`03l`Qvq`og}1SBwKE~0sBsE9(`9am2ys! zU?|=pKl=_hv(xyKFJ567+-p>mgbCla(fu3db)|$#Mf9inq6sD!{WI?q1_if`95rSj zIMK%Fz#seF_wZWoJaSDMvw&;w2e~zu5;~pM#Yiq#eZaf*d2?qF{7!oSld1cFT|C?E zVi@57kVTD+e;UlmqM{$BpDC@w;6@Cr2GsSTTG;Lpjja5~8Vj1TlM?;cILT;A&8Mbl zpG3hmYR{y$OOiFy0t#Kg{0_rJDJuAvsU*;2h_XK-uiQ<>R<<}{H&g)ZFi2aly;N!7 zN_z<^?^TP2Qs&(m07|lD$vpk%onC*RR=j$VgHEY76ow8w;6!h&Y@1Ydf@Vo8M0h4` zC_bgl=;kz`_C)>vSs;zk|7+dueMAD9V*m4GrRD1XF#_mJ|NkxN|1mV%ni=;eJdc{h zNDT8h$&4>VIvA1cZoUGA5=-fbm1JAH3I|3MNEDCa6wbPJ3_F2BDQ4BupRuqu|2S`m zs~d_=agHgsu1o_E*9ybEm$Tv}2x<%1=LB|>nnIyIIes_r2D>MmZqRwTv%9w?)^+hi%a*TmmSPMmd10!C z%QwpWIQXKjQ)L`z9A}XJvQc9as3oDwje&};v_!Yfqu!Cv|Egh+D=eFG%aXzAa#3!H z3KJ)U09b|{+miXM*#-6i!x!`6=X98^wBt<4fju&Jl<|w`nL{;2VP@IL$u`uWju}k_ zJQRPYu$*-1Mxtnut-&=ZKgjsYto=M5e7R6ANe1` zt8hwds6)7GW2dL_a_h)%t zp7gJx20jiVMp)f*z!yxR(PyIs0Qohv7x!J1<9-wI#DG-LaULC7^ch7w0<^L`|4dYM z(a&ma8|8JDvMM#_(2kzEIei(qQ%D;NONZ#JX~p2IPh%M z@IUpZOTW39k=nwncWO6rYRv7&#Ak+`|B zBMqZ>A)FOSn4UXnyaiTX7oLZnkckgRp%pFLRdg7qo)gj?U}`}-RGj~&hS_i2Hq z`G2)mT>sD3qqXf_XEYpIyB<-ZGtqmEs4>GR(SnKIq76YJf~bR-Q9_jQA-X6NB@V(- zLi84GMwIA8jV|g$C%Ry+^Zh#aoV)J#E8qI=UD)mVr*iRZBCzFR? z7<`7mUH?!tD7C%^$!4$DL-H_42bI1JGG)mng~L_!C(Z6}s^i$&%c`PPk%qLpU4*rL zd{W9WN3%(>eU_v>tF==!V4YplRiE37b14B?tOZK8Zew-n>*r&(GCo6Q?3 z2G6MfaTCD)1Cy2>me>e@j+Utpog*DatLxM)8_OQHU^KF4^x&qi`PS59cEPTc3S@hQK*bhUBI%xNTG5?_{=lkfHnp(ZtQ z`ncBiSQ0(Sxc>ItjgAd2N@HMtRvwU~lN`M&>U#vZi})07IN0sljPeq~*{0e#TA|xF zfmI!Pdn6mt)VGM-Ny#1Ml!-lwOc{9F_rIAm+{!{Ub)-Gchpq*Kah2>mPi9SJ2iOLx zc;3A3tJ7y4hWRx&*w5xl8uS0V5+E%!)i_l zXJr=2SCPTCZAQ!_Z2Q#JY#wU(x4ye)16vAa0zt6%` zY!%Y}%D00*SJh7YI=xc29V!;ieF=Z05D(HLO)x%I1Q{iFhi)Id(mkLDs?!rd$8Eh6 zw>`gyY#%;^0e#0ZaH{x1EqiFVLybi)w-DOeN@D0F?cO4NE##%#tj?OUSsuGHnyTXL z>Ss7hv9-Eml~_}VnTi7_+8!#M-q;gq3>!Di)k?Ejjt~t0Gz+wY>C}Izf!0_vPDAJ1 zP28AAlvNnM_pTA!NRzbUFVDG>jMg`pQBHgFob{*kurC%aB31i%OF8_0v`%&iai^1s z95_2bE=hYK61SI_anc`zCFx}6C}`AVt9cEQHcg0+{1Y7cZ~!nN~JP6#`3kKU#p z?Zmz%Qn(*PUcU<4uzuH#F(OZGxHJp&T)L}Z@!LuezH||5`V?0sdWXZgs1o<$>kHv0 zaMPk=y=XldEV^`UhO=*!X=EIGpj6*UUp_J(w9#Gk27lPSdAak$0*|kL@%o77NKRfH z?7o~nZ?VrM-ZwtuQ+0{{etIb#>~w}5Uy^dTxQk+~I>c|S;gOfPX?w=}jrXX&`ERpf zZ_1aoiVK7|@FQ&Qu5*dHXL1`MfMtNTiqfz#~{`9joe^!$* zj*ak2_9XGun6H(J8{zKqtFeyP$i0S=DRwl2ERh;;F+f@vxC%=!f+ zt9IJ=4+Z$_Hz*iCh#bzLT+yE9rwNA4pMQ4c#Y&ex`3~1u(C>B zsr&Mh$?C}V;Da4r|6;37;m@v9gG(dKxiD2jVn5OAinm6${Dih&u^vyN@D~|)!S`BF zR7{e;t+wj~Kc4$E$ZMs-A76Lo>wOtShr`1MPSbCRV=7NX?allo?1L}bisuc(c4@SH z+)%uL8SU!h zD!Y?$fl2rDe6;MTl%7=>*ts^64v)~l)PXzlc7+lS#j&Dyrvor!v?{wfRm}`UC!tD2 zDv!S;Hb2tX&!be7-71Tya!0B@!G7pEEIQ*Ms#TETnH-fZv^O7n5F1)9q*F~{E*taO zrTk&Fic7iDz%HJ8#A{l=?*-A*pepR-{N|3q{;~BHi#8rl2(Y+st_={r_H#J3|1W9% z6aV{dgpF^DbJ z^a`ii&lYo^^mYdlwYlbm_>34Xjmhn-M!g=AzVWJWrAay-z=ovBok}O`Nbb)}OE^Xv`szM0h}l&-`8vNb5Ge@&=)dD% z8Z7Y(|3Bd<{-%;EniLRxJb2?8q5Z2nmGmG=;{7`vR*wbYwePbM5)jwK7=dI`zyb|r zlH1df4|i(L4*e7{fv37IK?<3JJI7lq?)ZZ(Tqhza|B>8pJk;0vGkn}sEld*qS-AFR zH7UocrAlIDOFcX%moK{ge#B#+3$m6|xCf&ub|Ce@8^1g24__PFAMiT`un(6^AQe?= ze#qcd&*DdnfILSb{cOA1G!pjPjEIGv#r}#!-U1I^+l58FXFlIhy__Be5?b!hMpqx` z+*CM4x{owEt2>*H_D4o7liVhI>U6%7L8(H^%=TclT}i2=xk+e{!%(Ndox3cq$sfA1 z-kO+cP$V^s(){4y&pu$R*i$)r{fl~(&Vo(ScXeZtcd814nX@&VSirLt3hz;Zzd7#z z$-v+6{}XNj{{sL2L;jbNl>U|f|1A*)g`X;1*o!EFS-p=kZkESA??CA;L}bR___+9+ z%u`1u7Du<C?At$YT`4JG1&C{kM1wLJwrK{ajc^+n=4Oixb|vGr#Z_GCqAmt zB$r}y@duhd5v`0W#DRkmdLoFoh&7s;3vb+nKahh3>Mb9tN=`$j!p&|Ny;`$qIgks?7v42FPyGuc_USXpFw ztbo%K$VY7IUcUDygDK)SDdg2TI;5xKnpukpuTNLz2x$sd2b^)!hYMgQth$lt8%g$Ca=glFFb{h#^Q%SJcYvBZL z&aERJof*#LiLczM-abB|2Ie9C8FP#qFuDyTk(xe7(EB8Pq0Y;-VUAnza;*}M3ajj) zW#@En_$RA;#F~A1i^ci%b<~SeL=N!+TG=O2`<8(!LYSsjr&n!*07IH;YeU7{Ys`By z`4p4s_bB5#M%B^@KNjcFReB{uwr-db%+awuE(fyI6Tlp( z^cN*mvt8kgRAYEqd`_K6_{eCSx$o18R1&e!mif~L1`RHnAW#1DbKBMcV-J2F=?bwD hn?|3wEp;BOkTRi6LiN8T$bK#I%LBhW@E_@c{{nt9E&>1m literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/cache/stringio-3.1.7.gem b/vendor/bundle/ruby/3.2.0/cache/stringio-3.1.7.gem new file mode 100644 index 0000000000000000000000000000000000000000..bca0b39fd96fcba6e34aace2ca689e7659ef2d52 GIT binary patch literal 19456 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

_@@f3GNnW%cY(78oGTODIM(=K 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 ~bfWT+jDaVYXBes?doN)rzbH)D^6L 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[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

+d4 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 1000000) { + 8: int (* volatile tp)(void)=(int (*)(void))&t; + 9: printf("%d", (*tp)()); +10: } +11: +12: return !!argv[argc]; +13: } +14: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_category_warn; return !p; } +/* end */ + +-------------------- + +have_var: checking for timezone in time.h with -Werror... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -Werror -c conftest.c" +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: #include + 4: + 5: /*top*/ + 6: extern int t(void); + 7: int main(int argc, char **argv) + 8: { + 9: if (argc > 1000000) { +10: int (* volatile tp)(void)=(int (*)(void))&t; +11: printf("%d", (*tp)()); +12: } +13: +14: return !!argv[argc]; +15: } +16: int t(void) { const volatile void *volatile p; p = &(&timezone)[0]; return !p; } +/* end */ + +-------------------- + +have_var: checking for altzone in time.h with -Werror... -------------------- no + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -Werror -c conftest.c" +conftest.c: In function ‘t’: +conftest.c:16:55: error: ‘altzone’ undeclared (first use in this function) + 16 | int t(void) { const volatile void *volatile p; p = &(&altzone)[0]; return !p; } + | ^~~~~~~ +conftest.c:16:55: note: each undeclared identifier is reported only once for each function it appears in +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: #include + 4: + 5: /*top*/ + 6: extern int t(void); + 7: int main(int argc, char **argv) + 8: { + 9: if (argc > 1000000) { +10: int (* volatile tp)(void)=(int (*)(void))&t; +11: printf("%d", (*tp)()); +12: } +13: +14: return !!argv[argc]; +15: } +16: int t(void) { const volatile void *volatile p; p = &(&altzone)[0]; return !p; } +/* end */ + +-------------------- + diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/erb/escape.so b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/erb/escape.so new file mode 100755 index 0000000000000000000000000000000000000000..ebe3d7dda602b2a91903f250dc231aebcd0616f4 GIT binary patch literal 32144 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/gem.build_complete b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/gem.build_complete new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/gem_make.out b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/gem_make.out new file mode 100644 index 0000000..ad8f223 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/gem_make.out @@ -0,0 +1,19 @@ +current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape +/usr/bin/ruby3.2 -I/usr/lib/ruby/vendor_ruby extconf.rb +checking for rb_ext_ractor_safe() in ruby.h... yes +creating Makefile + +current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape +make DESTDIR\= sitearchdir\=./.gem.20250901-3344-g3e8k0 sitelibdir\=./.gem.20250901-3344-g3e8k0 clean + +current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape +make DESTDIR\= sitearchdir\=./.gem.20250901-3344-g3e8k0 sitelibdir\=./.gem.20250901-3344-g3e8k0 +compiling escape.c +linking shared-object erb/escape.so + +current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape +make DESTDIR\= sitearchdir\=./.gem.20250901-3344-g3e8k0 sitelibdir\=./.gem.20250901-3344-g3e8k0 install +/usr/bin/install -c -m 0755 escape.so ./.gem.20250901-3344-g3e8k0/erb + +current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape +make DESTDIR\= sitearchdir\=./.gem.20250901-3344-g3e8k0 sitelibdir\=./.gem.20250901-3344-g3e8k0 clean diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/mkmf.log b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/mkmf.log new file mode 100644 index 0000000..02d30ea --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/mkmf.log @@ -0,0 +1,36 @@ +have_func: checking for rb_ext_ractor_safe() in ruby.h... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lm -lpthread -lc" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: int main(int argc, char **argv) +4: { +5: return !!argv[argc]; +6: } +/* end */ + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lm -lpthread -lc" +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: #include + 4: + 5: /*top*/ + 6: extern int t(void); + 7: int main(int argc, char **argv) + 8: { + 9: if (argc > 1000000) { +10: int (* volatile tp)(void)=(int (*)(void))&t; +11: printf("%d", (*tp)()); +12: } +13: +14: return !!argv[argc]; +15: } +16: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_ext_ractor_safe; return !p; } +/* end */ + +-------------------- + diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/gem.build_complete b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/gem.build_complete new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/gem_make.out b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/gem_make.out new file mode 100644 index 0000000..a257ee0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/gem_make.out @@ -0,0 +1,53 @@ +current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r +/usr/bin/ruby3.2 -I/usr/lib/ruby/vendor_ruby extconf.rb +checking for unistd.h... yes +checking for rb_io_descriptor()... yes +checking for linux/aio_abi.h... yes +checking for linux/io_uring.h... yes +checking for sys/select.h... yes +checking for port_event_t in poll.h... no +checking for sys/epoll.h... yes +checking for sys/event.h... no +checking for port_event_t in port.h... no +checking for sys/resource.h... yes +creating Makefile + +current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r +make DESTDIR\= sitearchdir\=./.gem.20250901-3344-j7y6tl sitelibdir\=./.gem.20250901-3344-j7y6tl clean + +current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r +make DESTDIR\= sitearchdir\=./.gem.20250901-3344-j7y6tl sitelibdir\=./.gem.20250901-3344-j7y6tl +compiling bytebuffer.c +compiling monitor.c +compiling nio4r_ext.c +In file included from nio4r_ext.c:6: +../libev/ev.c:2136:31: warning: ‘ev_default_loop_ptr’ initialized and declared ‘extern’ + 2136 | EV_API_DECL struct ev_loop *ev_default_loop_ptr = 0; /* needs to be initialised to make it a definition despite extern */ + | ^~~~~~~~~~~~~~~~~~~ +../libev/ev.c: In function ‘evpipe_write’: +../libev/ev.c:2798:11: warning: ignoring return value of ‘write’ declared with attribute ‘warn_unused_result’ [-Wunused-result] + 2798 | write (evpipe [1], &counter, sizeof (uint64_t)); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../libev/ev.c:2810:11: warning: ignoring return value of ‘write’ declared with attribute ‘warn_unused_result’ [-Wunused-result] + 2810 | write (evpipe [1], &(evpipe [1]), 1); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../libev/ev.c: In function ‘pipecb’: +../libev/ev.c:2831:11: warning: ignoring return value of ‘read’ declared with attribute ‘warn_unused_result’ [-Wunused-result] + 2831 | read (evpipe [1], &counter, sizeof (uint64_t)); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../libev/ev.c:2845:11: warning: ignoring return value of ‘read’ declared with attribute ‘warn_unused_result’ [-Wunused-result] + 2845 | read (evpipe [0], &dummy, sizeof (dummy)); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +compiling selector.c +selector.c: In function ‘NIO_Selector_wakeup’: +selector.c:525:5: warning: ignoring return value of ‘write’ declared with attribute ‘warn_unused_result’ [-Wunused-result] + 525 | write(selector->wakeup_writer, "\0", 1); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +linking shared-object nio4r_ext.so + +current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r +make DESTDIR\= sitearchdir\=./.gem.20250901-3344-j7y6tl sitelibdir\=./.gem.20250901-3344-j7y6tl install +/usr/bin/install -c -m 0755 nio4r_ext.so ./.gem.20250901-3344-j7y6tl + +current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r +make DESTDIR\= sitearchdir\=./.gem.20250901-3344-j7y6tl sitelibdir\=./.gem.20250901-3344-j7y6tl clean diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/mkmf.log b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/mkmf.log new file mode 100644 index 0000000..77c9b23 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/mkmf.log @@ -0,0 +1,186 @@ +have_header: checking for unistd.h... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lm -lpthread -lc" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: int main(int argc, char **argv) +4: { +5: return !!argv[argc]; +6: } +/* end */ + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +-------------------- + +have_func: checking for rb_io_descriptor()... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lm -lpthread -lc" +conftest.c: In function ‘t’: +conftest.c:14:57: error: ‘rb_io_descriptor’ undeclared (first use in this function) + 14 | int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_io_descriptor; return !p; } + | ^~~~~~~~~~~~~~~~ +conftest.c:14:57: note: each undeclared identifier is reported only once for each function it appears in +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: /*top*/ + 4: extern int t(void); + 5: int main(int argc, char **argv) + 6: { + 7: if (argc > 1000000) { + 8: int (* volatile tp)(void)=(int (*)(void))&t; + 9: printf("%d", (*tp)()); +10: } +11: +12: return !!argv[argc]; +13: } +14: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_io_descriptor; return !p; } +/* end */ + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lm -lpthread -lc" +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: /*top*/ + 4: extern int t(void); + 5: int main(int argc, char **argv) + 6: { + 7: if (argc > 1000000) { + 8: int (* volatile tp)(void)=(int (*)(void))&t; + 9: printf("%d", (*tp)()); +10: } +11: +12: return !!argv[argc]; +13: } +14: extern void rb_io_descriptor(); +15: int t(void) { rb_io_descriptor(); return 0; } +/* end */ + +-------------------- + +have_header: checking for linux/aio_abi.h... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +-------------------- + +have_header: checking for linux/io_uring.h... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +-------------------- + +have_header: checking for sys/select.h... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +-------------------- + +have_type: checking for port_event_t in poll.h... -------------------- no + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" +conftest.c:6:9: error: unknown type name ‘port_event_t’ + 6 | typedef port_event_t conftest_type; + | ^~~~~~~~~~~~ +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +4: +5: /*top*/ +6: typedef port_event_t conftest_type; +7: int conftestval[sizeof(conftest_type)?1:-1]; +/* end */ + +-------------------- + +have_header: checking for sys/epoll.h... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +-------------------- + +have_header: checking for sys/event.h... -------------------- no + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" +conftest.c:3:10: fatal error: sys/event.h: No such file or directory + 3 | #include + | ^~~~~~~~~~~~~ +compilation terminated. +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +-------------------- + +have_type: checking for port_event_t in port.h... -------------------- no + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" +conftest.c:3:10: fatal error: port.h: No such file or directory + 3 | #include + | ^~~~~~~~ +compilation terminated. +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +4: +5: /*top*/ +6: typedef port_event_t conftest_type; +7: int conftestval[sizeof(conftest_type)?1:-1]; +/* end */ + +-------------------- + +have_header: checking for sys/resource.h... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +-------------------- + diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/nio4r_ext.so b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/nio4r_ext.so new file mode 100755 index 0000000000000000000000000000000000000000..a185a06a0d6962384c371fe464363cf07fd6b7ab GIT binary patch literal 345376 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

r^LDBlal;JIAjZD)I5AvJ}bW6yy9#tvJngW z2CJ{X6lsXdg_9UQHTAhOVY!?5c8BCSSFrKlpe|+eoD%y_4aB^SOHd0 zVaV2YLhGh$ffR6uvStfNgA*|tbQ5Ut4v>^J^f?=8ZF;+;+*qrYV;|l2CCwG0xceSB z3Y5r)seZ1c?5qM-y%j`~vWISP0=JFb#-PE6I)Nq0_Ht%MbP|YMhvoDBLRd``P7hw6)c1 zy-7Pe$;_#Xcc`a+f~D34LQBS|i_Tyk2!3^dzx8|H(47JrRO?Rj;>8!pjaz{b=*utU z1gAXoBv42-*D5;PkGA%B<9YXjj%cjO{KROjV+#v z*|w~Pxb!N*4t)pSBY?YT^sfTTOmHZY#L^m=P!sN@VB*UYIjX5hEUAGzZ3bGMjnoTU zmOxj9dU7*$lqF5&3G)Wp1mpft58U4p%zl05PF?rvjqp4U#hsRLi=6O_)*VR|m$Heb zh%5MvIdujws>f;0xa3EvSW8E~1&aC%K1lr>+SUH-0K#8C5Xi5A)Ymab-fZokC?;vP z&;((!Y#CzQkpsZEiXfRFT#z6P+UGwQ^4Ddn|HB$HLFkq!ER3)EsEWqU-xSY##TKHS z(Btg1>lizR_!t#tPe|<+CkzVtThArFVKjkd%()j1j4z?Skq~kijVTt|duMAez>H3b zvtWhasMBz-Dh!bluPsFeMs;BLXr8o!ndwN*?Yoz1~cd)S4Egx0C z{UIDi2uE}BCakk+F-E8Dh_b9zU5SLH;%rqmo7V zBdQCH0Z+kzfoJhZI>%GQVBkj+pFyP9ZHsX$crT(Jtd+1@po4@043E|geWQ^iX&f_n zcYpOQ&*(TMrGY?5S=azeHa=m&f zyd|C^p=E^J@gN>%O6CFYQ<8Y4v-y;GSK@cu1c9I&Y)EF-v?Z#Ckn_gG`tv9XubLX! zfHbzM@adtpg|zoDEU3}{S5U8D)P81F!9>qhRM)>61qzEN8~s(dCx0UQ*Wpfm2WChd z2O)h9RrW;|8cW|kB%5iaYi7&cmMSpC0#~aqa0qpP2q5;I3`W{#(44v-b}=E`H$hl* zS+@K-l`{+7j573$78xmx;SV+VASNRQy9GN*fZ6g!TFKQb8FonzqIjL3Fjovo{aLa4xB4ZrLTb#q+6=zZZAtrJ(M{(*WW*#>u*Q z50dB3^nFsWe;+)Cp-$G)pS^DRb&8qL*E-yWaEnV5E{+c}!6sY&6U9-w8ng@0dt&-F zd|*T;fqD?4%haqlAJN3saFc9jC7dnS3gZ<0UBTk4Kyl?WxnYcHbyAewW zwWOkn4|P_saomju9WD}Uj2s3vmL5uPNvBz~ic9;yD;cwO9C|wwnqRY;09ol^7k>&h zXIyWnW2sNo0}(xR*f9^2gB;#8hkPzQJXKA_WPYDMyq7H_f~%vj?wixElbR1< z?$EV#A{n2LCIVKeed-Bj{n$aGD8L_62198dcrb?duQ>2=M2`)t1tx$nm z896W~@SXQ!(+Jo@0D@Ai2f7^~AZ`0IEe~&?rY7R4 z+po&CL8$6dHuDJW*$uEsrYN?1=}F6o@&v8vw25)aD_J;Pi^bIc%NgH#IrjXW+$|Msf_v5829^5qv2ged{KSN|jZoS^^+7Cq z1{)t|BLy!m*Z|Va@B&Dt$tx3dE^A>_0Cis($OAd);X1Hr`=(Ry;_D{`3s0hzb!ded zSYHsS)6uxYkGK;fW}~4=21nTNJ#;@4!n=a+r8T3F;HE5o&CH|;3toTEh97Fg&JVpK z|4X6pIuOI%9LKX`n*WXThizSuQ>#vE29-W4v+KZN7^G2G!A!J!b16pVdrvgx@PCNC zcEVnzyr23Lwj$b1th}ojx&)!#uVOA4J1Yv&wm?(<8Z(9u0amZ4;IJo2OU2rEpj8#D zecEk!0!g)+qG~l$t%OJ|D%NDsV&$%((d-TTR-O1m3BvB$vitcUUjvM`Jf8zQ(Ewr= zQu7h2bNy&A8C1dxlZdjPhXc!K4;4F@6}!2Wjlmjx&D*>P8 z&z&P(^5j%)OhFeEHnL5FVtpY~z}IN1NE}wDCc&1}O#C4wT&nGu$E3&!{+;YcU4&-! zo>w{059Eg-Hpe&`R~ic{ths~8mu4~=vMlXEJV!+z+`%`;W0tyu{~V2rS_VsnpQX^kIgC8rsH3z) zhv($c>ZPclJq0q_!s`BBxjg9?_IPMkPN^<`f*d_5zTpAPC;4e%{P#2c*34G#4IPY%h zA(xzx=28;UXu|RxeE@ku7u-CPibwE>-b;YNN`!dGJIbwWo&yjGHfP4+YtDRNd)hO)RVg*1LQr8UK7~!0ZgQA z9ViyOmnhqg;~EGrPE=2SOBnBE6l)6})FrO$wQmhf=Yz=Vh`&tEieuWk?-vqh(5xE0OxBOhuhx zgb!0Nyp0w(To{3}jl7`R1Emx{D%;4tk$PVFC!s>&V`4a{r zp(L)P#LG^WZCQPQ{HVCf4~zqg22o>o`SWGe7%h;ifq;Xe1%+-g^RMz@P61pGkaD9` zg&Nw9>k6IC79F=1SEvx{ATqAxt51$MD`}$^0%*Xx2r8R4pM*?>k2BGYMXK_+0)~Kk{8X%cv=r`+Mi~)2i-hIV@}yL?3{eBAwi-0=({>Z83+CFCEW1N~ieWRFj3)8+8ad0Z`jHE8c^+c~jvF3Jt3vhVSJI-t7i;Gy9=^xNyB* zQPC*z(rPLZ%=SLVLW5pK+Dqf@>2-BZaxQjik=Cn-gVFv|yuNz;KZw5ip4GnCQpq^p6p}=J| zdU=Uno*Y&FV;k$A>ekEcoyyIQOUlhsAdEe({~J;nf_tc1TL_@D{D0;AjN~46r>DLO zSp5XymBeAE=rX>o zFYHDN?DO3K+%%3;x1(jJtT|<*5`K{621))8OnTDG2=B2&;m@8IK%`#JM$iikxL<6ZzNUYi3F1(`alm8dG21i#CG& zul_3@-Si|yQ4+b=HLsAv|4{ua>=UU+7qXQZ=)I)OOraR%e;8i6I&pO<)9p^BFxfHu zb8jKGrIP1AuK3x4n)Ee!o6jYAKNgo+)DyW8&SS}7^~1_)b)^I(YKS_4Qu@TGBn(ugVDLEm28 z)gsd`$-cd)d8-E6S3ye>%XR8L#@D&m4by^Rp;KwCJ40PMiZbjEHj}u=9VwfRRu7KWRV1|GC@hDl4zOt#4zQ8`DUGn7OiTrrd z@^m1StdvIj>^(eY7W0^LRx(%NY;s=QV;cG*N4b-HHdE3w%!-(^fXS|+wi<~Mnrzsm zsjLgu`tX0cJW%`p=!ggT_znMtVIqyLlFCEgOo}6t1EJ-^)AvQ%r(KF9?noFY`Ri;_ zaH(KZHL!PNU_2f^K+1Q^s;+;i=OLc&`7KV(sI`vqDS zC(CfnhS$gNv~ZRQU@b@@#B- z(aZ?Yw0#m8f5ZOBZ~O?s2BW>H>O$7cQCKpbK-j!js)r#QrdMW0R`SxJ2*)zA`YrFS zo3&xnEbdT0LO*w4-($5UYgRs@m&lvSXC`_(}Jd-lAQkD+KOwY)&FOMfpP3=lkg8B*u zuI*#A|1zzF(9@p`xdw5${=o6Y5xH!@8}n% z-w6els&?#3z$GvV@YJa zOW|cAm3evDe^K^6f@`$j|D6t2wH=0`PUpots94uq%Q;rOkBYD5#V=Wk51wJgJE{0W zUR-4<{+z4e6)Ns%2B|V3-%=dlihrDnzv9IcQOv|1^dsZ^5S4wv%dRlWJ~++F3aIQa zysU>&_5d%toyr2d>;zUV#`D9US-tU8R?N#3`uV)OXp?J z(@KaaJAD^f& z{tXBkGc!R)5k~?pVxPkFFf0Cl+X&9-Rs3GhdIC#N#}E(8F1s-(41di8{Y+|6=^M6MYoF z4d|u8FRd$n8PA&X#p(R!bACT!9gOBT$HMPxDv$2(&b21LB%R;yIKMZ#;Fl8Nr?2;s z;GJHdJ;iJIu7D!vfH9UNtlv8lb-r~lBSlqfVn`*ca`;p87A7 zpRXS)K?j?cYtOX!55$YrP>ZnM=9{`cPOScj+EWrsbZKw`rSM!kV*7yB`DIY5zD}XZ2sO`sNwZ81>8G)Ak9sk6-b*jQFgEC_fxxL*x51>fgyk zq58)7z0T`@%!#~5$-bE!2QUy+e|85u+}0`I0sY@eTW^>AZzB+@{2B|rv27V>Jz~>@ zz-{_&zKgjZVq?!J2BzW0u|0t+>um%H5biJN98HBm5##U8g?oa^$yj0d^cbT%L~~(% z_IF@&kBNcQ<0LyWgn>)I6+ONa^sdH9nJ8flhk|)F)0{c4Hh#?XHqv0NpE4x=F8`tL z)it}&hW}iG7vLwWtjBK3ngA-3CMeGaQbNfnB-DRNB9Hw7j}3&3KT-MExVnY8Dk=PNBBaRnEqs9##;jd`CUGkSa+k)IAHm5Wb z24c_LB*{4;wGi6EEGhkuo*-^eJx!!vI%ogRw_I_TyMtF<3dNcBOJg|#l3`vx#)-T~ zT^S8x^?p8%WqQq_sQDtR$?cx%orXoBp1V`MXL!AFsGq z!}UgflJ%c7E+>vO>bvE$diAdwSoI!yb(}Z6YBH+p{*cxcs=txfKSV1SO)a;wEW{ar zllnAx(4*A}j}Y}xWPGr(>F!I(2^^xgN{*12`QU(VOY%LbZh3wtChqlJStM_lo~;Pl zpJ8J<42=s~Faom_MX)kOoj(-M?KVrwxVcQSc02VS6%nHFN7up?FA6L18vr}+?BVH=Xq+Y{47)d1NRJ1RL zMC64m!>Nhj#c>b=lKL(&?UMR&50@jski+z=XVjZ@Nl@#;&P^a!RSk*Ywjl$_!{tyX zT*eLolBCI14%vAlDLgQh0{%`SM(RVp=V+-8UR<)8$tMQhp3oWhqd$;bP#yV$FCRDj0kuc-`5-gX#E&@<{7FWgSiKyD zX!C8oCi&4Bm=nn7vG{@Nz0T`BW~t}B8+B+sr`CRtIzw2UDlp@51J$eK_1u0+WiL44eaU)3=sU7I{GECUS;!^&gM1tfIS$rQPZFy+Nf&aoK&{69BNB-F&nI|iNyubZ z^VX2TK1N$vCGi?!6ufvanxQ6B4S!{{SIOH;Hrli7OXi^^W4_>V{BvN~_NL|e8|}fq zWJ8C1Oz`4={D1~&FmiFo4fEnAYLa=q#=W>hTINiM70fw>3rowKK!N%LX4XrYvj*9gR!OeVUT!D$FUc-z3iek2-_LCIBakHrGLSDAYC_73G z!z26wWxtRt%7hZ5?00;Z{v$Q{4KK^3CYc`y_J53KeQ;baVjJSc>6YT}c-G}-s{I#U z+}Bck6E8kW#gFjf(^#6A!0&Q_OQ@`fmwjoJ9pPnnQQ0lLY#Yi9p*HjWtfS%)y!Zv9 zYERxDg~~);R%Mi3eUf!%36-7R$@EZwGCUI_iN?(*{63C%NAR?t2#zCBc4<3MXwC&= ze`QS=(ENb)^=CG)avs)BYpHI(TN7!x&1^aRng5tg^6Zw^(BxFIl@hpg2l2-VXGxj% z(P&I^8E9!Oow}54&60wLXZA)1?Lffl)9@Vw@sQuBEy=rK^L2PhO;i}mwwHAKrTq}{ z1d%7W`hK}P&bUuTD1@Bh;qYpVAhOl$IW+4}pxxVDI{@o0T2204y%1{9%ctW=8IBE7 zYJnvr@Gfo5qWkf;*JUsn(fku{i-i+@km=n#Jh0vYp-&e(Gb zacc)2rG}P#h2zGxMCxy~Nqde-Nwrj`7U%v$EZ?!b|4hbvSPc%~=isf=J8RXVFl7Rk z_rD1xXq{t=#8FLnsrX4Wk+_V86N@fnqI$Cu$qYeI^I#9ch}Fg5z{|js-Z;32jH5TO z;Mac=0LB+3cpqWbZZtg|O%JP4=_NxHP4CzR32Wc`&M z4At4*rn5bi{;nNbqAf1@s(QExo($S5Af(>4gA6G>q`d*WW%*gHJhKX(0FQAdH9ksr zkTEPb`&-4Jv_w*>8=K&{BoAg!^1m=xIMjgGK88xlq*O_^DLYr8RQ^Ky`%ZGGOimmI zZX&yu6e(2-?DFoDGCuXSNkJ*KZ5QFEWAZGf)lL4HhdRiMBJyEtBbi>wHtg~ylEju^KPR@K}ZA0UYvA6gz)RSu;{k zwz7FK2pk#h;^S}Aa*ku*fO9G(O?+b`e)UoA;aimw^|89IOI>U#~@X)<2~3vD=$%OlyO>o{6T2Rh1cyi0CsskbmM(k z@>Ir&b3}ke4*$b_1##7D(3;Et@Iai-L?^G!mQSH`{sXq8W}Igo2*r9GcuwtaUP6vnR*M8}< zR=lKG^Gmmkmu3R9yvVJ*E#XG;?1Ov98wK&wnJ-+yewRv09Qo-XC#9r+Ioca+lIU!7 z+5RiZaoBqZ(vSuzsmb9#5{E-G4Rodsx)|0;7gZ1~a=u8CouObB&N_#)gCjqr65082 zj^{g^u?_dXy%{zi_)b!CLJsk1I^^IJoz-D4-kkVe<=+dV?1>9HqEnZsL#MB(L*f1x zpe|LUN`0wPFRFAg9%8WlmQjzosMjMF;r{#n)m6R22p~Jvqm!I^Jz^2=|4Ntj-Zbiw zU{r@*2_^k1=%w;T8r98#_#|^itr&b9{tY`wPwjBLCO)kj-VJSy$NQo2Il<)auHe!{ zAtyMkzmSu$r*c$Iu-}F5j4vxMXL7k3vuRPMyj=oq^r7~U9q*L;jCrVw= zsm`1&cwJ$GBu@{i7jGixGChQ(%?5;;y&0IZ1=7*MK@wE^1u<0gdd=3_RBMv5LrJ_G z8xmOa1iUlXiZ?dLfEO*B_}xV-rc^(SBf^u51mefd!lfEsHz`iZv8@;P;wG>>| z3PB3Hto(4N%56334n(Gw)dKU3#S_$Q`mP-;sMVvKAo}P(KHe%aeRX2Evl+i3tc{6R z5_558cV#CXJf;{R1mkR0w_=j2iI`(>25FA?#8+6KZ&9+_M$@8O^KAkS6WLF?<RrBUNx6vD>OR^=5JO**au4Eyecr)vw?n6n^x}m9N?ob%VPfiKzC$!)T=7f_ zV%0Da-ylHN)1^F0%MX^<4m{Kv2!?{(N5iHN*y(V>dtvU_;&z3!Qo>Is1 zCO7LD3BLX-Qxn|5`Kgk;Y_HpP0u_cbg)Q3)9`KWDKY(pJc>GSwk)AJ{iqF`P546t9 zCP`smPgt=ywo*@1@hfHI4iu|9aJP+|8Q#HkuoJjaFt7m);PWyeYE}-c z#|0YA#Z1NmAO^;v4Rcn>U**WH_?Q88o^@y^77M)M5Tt7QY-0?K2{)iBGT{PSK!YbT zSsST^XJ(=W8QX~#G4KO;psiJZ!4)E`1D*GBc{j`Uo>4D=8)a)5D-f&KP>V3E`5?n! zo6jZ0z{kX3MLp@ovT$-e!vnF-sn?($T6?ZG(fdyU| zWq;W#E9@(;WC!Zh_gKgw2Bz%bep>q&99KIs8khgTj*pw|QBNQ$zLA862+(M&z{};p z3%peCakxbZ5=K%uC2dF43(=MyS2F*{rn*ZG8>dexl6!V7q$D-Y#Vl|sD8rK&u!S1)%D|B)sBh_?@;9 zT#pvNbHMaFVf98NeX7km&~I2T{17v zF}Xz=-t4M59EXkuaCRZwHj=jooiXY=ahi*%9_L?`e$U8#=qoxd|91&!$6F2suLjRs zg2|&K4+SF#s8_avwYX`f-G4B?YH<%?$$QoNyc?<(Cjq(7SMOF*@sPvUr)?{XOLCNg zG(vb^m;d7!IxTIa7oi;;2*WGtdCU^7Wymh~6$%3y_hbd5f1y$v(B-=mWttpQsbsD=f0*>;2ZAtfwsQhojwz zaSuDDyMqhr+1I#E!y(fO+sWy|rKK_@K0H>v4mbGphFEgnm-?-= z^y|xI0ExtGWm!GEKfb0`TJNX|KTJ3Oa)?iT=vV=HC}l9WMtmydKOo|0wR4Lj=|j8~ zah!Ut3~r{5--Gp7$r_26GSQJy@4M1j{hha4d)6=;z4Gha!V(9(J)C>RBuC>}qtzai z!{n>DuZCoxwk^$~Noq>Dcm-4PKC${Dh-1wE80}%{8~y9{vgL=ys?WDu+S5MO$Ax|F z3wquO-eI-jEjl$>4?}z63lM0u&ZxGx_49Rs_Qk{aa|`n@ZN_F59eNnYWG%;$vn~53 zPrF0@oIW5Y#cytu)H`7i7bU~v4YY@b@PAcp(78ofS8S{%eVgM;$G8euZo?W-P zkr7g@M)tLfNc~~BL;Vm(qg+royh%nh3#PCTSZS>tj54d>Lh+J6b>aopA>;Er=oyv z^@43T;|8w>C!s%W$@+TiZ?jd5kUV(DIswlO6Y3SJcq~|n9r^d__s|OnD!(!91>DQA zuL99BaHm_HJH8804Tvp2_}GN!KWyotyn#EI_8}7AVQLe$&}MgM9Q5AoQUdJtC?#Q_ zlADT5@!`hIRN|!A)%#$pn*+0`*ftfQu{LAP&`eQL;{%~q>x95j99?f{h2B}+N)x~> zpI1NsJHoqQT6Y}I$;mic`8&7#3zJj1hWg-dt5RR4)g4ol)%hB`77VpQD$>{RaV}Z$UH*?&g=wZU0b;xEmFRj)(e6+SYS!sEb$6_ zJwg248J0KC=~OOnX3?4aEX7z>i{|sGVI{4|Ti zg+LX##O3=5kB_2|wS@RP-4FeZLR(AP0$=#KEAfAoYy)s*PKeSLNOl7|i@wa$CkvnF zOzGdtOY7Oydlo*7@~nZt$45EBF;IzNrTB!WvEHb!pJ4g=sbJG59xR&0m8%fLf@!Z@ zYE+zwGe@T&E>3bO+kNJh&^p*(CyMs zaf1%@$-=l?y=T!wXe_a^)UPqGEDoF5ht?gWQTqu!qXEsQ+)k>@QPpo*NS8tbG|Q<{5cLF{B}>X{HMon+ zA7nui;Lt`Wx8W73)`Z|4ar82nGVROJ(u&4a%sR5;ke?W@WZD}iVb-&$R83bNZ_$2+ zzhkd-%T`KPX6$h$7Ey)A@yKPCQR^=vTR=4}c zQldJNW8hyGqeL~&GQ3P&K@dqZl&m_3CaS)DSiW_n?sc$4nZDkbzifW-oI5myo;Zj{ZOPwi>2p>8(6#)j75V<6$24OHwALBEt6m z0p~pE`Om~u&4-cF-*?bc=6ar_Q`Qhm03I7HkUw&Jj^Inhtr!I?7xZyq2fl`5`&Mxz zi<_48Sanwqe8e+z)v~u`M>5`g#Ipo;WCY1^`76p*1rvVf|CXMs0O8z@jGNOPT(%v{ zN{L{>>}_FULw0J9Dsk0NnjHLtLXH~( z^r;~+xP*~DP5VxkDhtv+l^#@SKVdGZAE9B3jhgucBbmT5n^LD$8w*+_ozMYpW+n(9 z5de%g+{be?%d>7EKS^GHa;Z*>0o$VZXObWYX3z;diaUf439H{hs}eqSz?n$65cW&b z^)@1R2b~-6Y+qTUQ&4L)N4u%hUt${qJlBh)DauhqPsCPTf*Z-hTGKc4S1` zh-Ycn>8AsXZ}TG0k)fvp`nFxo?J$xLxD*Lio)9>WgaCQxJ2Zq)db+^(tphuc$`#ru zSO}Z1@D|5;Cadi!^_jnLV@?vQN8(9=za!au6Am-`CU=@CzDbxRl4X`)U2v}FyZiMT zeVG=`hMToVVOMxFer6rIDOP{_Pe6F<{(h{W0}u?fy{_Jg=Azb{PB~0E$!jq&3O~tw z)cKT^*+dUPu^c9TOQ5o24g*Ivt1FldG$KtIv4Kxf(@8=8zj2eJyh^mb6b*+tkejZ; zU!-R0?GABsc3QV0c&{H^p0R19sr9L1U?K!ZN^3pkr9O1pzFUuccZha~uJ}!@s48xv zjc?U*49m6pZn1CMNS&`G|I{h(z5OT|ILnFq4v}bq2QebhYt-{iQf-rwI0>8UGs_!N zJ^3osD_X7YL$ApXVd!3@6eNbO9}V5bQ9LmqjWr~7^_?K2LJZ2mdDi$?Th!SXke%>Y zJ}S4kG8gNu6u)vHF4+ofpM88wSvif+wk8G79P9DDNU{1M=o?=gnq%N;A)k%rftzXI z;JXob;k0kIjJ?*g1;9J}4Yna2v{cc_7+aHD!4Wn*Gd+>&^8bv3;$P6f@r+`QM?*Re zUwuDzLq)O}pgBQkpaA@03mC{3&8u;k5U9hqLDlK~c;UN+8^qFLNTdeLL&-K)wFuCbzv9gW2 zgrE@5lEU6G6tOBB>8oggb{{@fXnBYy2IgV#C4Br0?VIsAs@{qKGG)y?#)pF1tM`a2 z4?~S$#?tK%_Vm6US%1l|VpBxPyQM?`KgmvwDQl=zir|%v^c9z#uaT*V&xWvJvC}sh zL-z~n_s`>_7wkj#U@zQ_#D~5>+(rDdu{tciJxb^;AS9vT$w+SP97_XcqRY?f;y$_DaY>+-QdpE*7n(r4m8>_xMcJbUafPhffa? zgfAnZ6D)Q>OA1pC;{IkVBF$Jmv1Pfd*SAH`JUeV9JNK%Ue`cY-a|?e_A_2{+;Xid+ z%OmrbkFCPKm9MNBkCyOcPwAno8LQu3udK<`Z^s1hu;JDFFDfoq*4)T&&5AID9tn2C zN8(cnV~%MiW=~{%yrgK(M5Hp8G$INh+<_@*U*bU|P_(dJim5 zqeCrxy<kHdio9Eo3Wu;ml|{5*d)i;(al_TkdCG{j~akn>eP!x-VMaeSJx zLFkUtJ*`AV4_W0o35ZBi&~e4xCm9a|Qz1+k&uUYpq#u-xZqkS>rAQ;Va%wud;h{z_ z`3X58UGXzr$8*Ko@jW~luXFf`wV#=#4gSranQSAus^<|~^w`BEX%MS9e1GL|7a7?FXhHNjRJlljR7-)HTaN9#>6^HFZI-)^E z*%`-{=hGGiM;NG7a$F?(gU+R?{Al zEp@jb{YXaM(eI2xA6(UN1x$RkcYMkfahkq$a)skyyzjg~PFz@{z z_iGZGCHDFvL;JP1N3>O4kD_I_r-sfJZ2>~w9ee<*Y6zUO zQu#{X;Xjrjx=u;*Ov(cZHRt2}4e>ZlIIbKbHw#z>RCx!hQYSqX; z)O5tr{{++E9gDY?JT;Q%3$SN1h{X|SB^wTOUL9BQfzg26ldVkpxZvD`-f$;;m-}~@ zj8_sP#}xH+N1C#n@8IvG9lR?(yLq%LxH__f=XnmLXJ8k;^FwB$tS05+KcK+8bI4T$ zWb6^2n2s`h3&N#rAT_!1zufp6@jvR|RL9W-uBS6N+yOOQE%q4(?WOpCj$fV{yyINW z**GZQ?b+?ZF_Kdg#gv5J=x?p)cYvc?k?d_{n7^n&zfy_|C-~@ajNKiaiG&uNnoW^X zBPiT)6ppxFjk4KIE^*RlOb&|5P6E4I^y3{yWNgYV68j)vpJkueQ$$VsT4MgPOltW0D^ z8iCA8RnH&8V#HG;{2cXaY7r?7G${IegIAl(?SmAUvBx(Cwy5X1%2M%V)uApWiwtoO zjUzY2J-Q**dasvjY5Y8AbL7t?xx+1Ox@@O%oAK3!9BYhe#aZW1CoX2da-ArzflU_#a-In?Krt&8Lzz9PDp`^jh@RFsRVK`4dwjoNScyS4o@|2OT^1e4^mEK8=( zvD-1nc1iKsyOAaP1D|8kNj;aS^u|z68b;9~O|}Y{KRaXHO{`vsd$_TQDQ+Ar^*lmz z&Mh+oVops`-la)Lho_Xqu$z=SQ-S~03~QlLV>4_3Y!Nf;X0XM7EEVr!qkFP#p{YPH zG3FZ%z4Q5&3+s-WZ@FF0H>^#ateaj->Te%h^1WMLPPQt!w-uAAQZP z3PK}9`cezg*$cV0?K$R$u!s=yAskx(jJY+cZ8DyBIK(o1s~}Z(@LkTU5j3wbemI=g zL@MW#>Lg7nhj?{L#WqQ%(d&}}X|M*gowOJ<-_IJktrf@dUjiT)OisfAq2rho!qx^+ zxXilyL4Fd3P8nxq;T(PfUY-0$9ExH8Zwy|0nC+)k994Cv=NM?E(@=ezo= zm`sa%k#E==_cfmEf(XylPa-^zu$`mHp7~-%{c7KcufmZgO`9+^?3p-W>JUSB?t;G8 zM$%R0m7E`@yCEgYA)ZY4*VP?KdEC?qGd!#NQ9!&uUWl%(mJxWg9$4FOc^X`vmP#^% zo>(gz>Y48!iv2zt)iO1#udIN_?|IB6klZRrSN*F6K8UGeY6;tD1QR@H1_;&~#|1XVyf2=?LFUG&&{+RJ^ zoBlX*>}&VOKRx!<{c-zoFN57+_vUuv-0=H?k>lM{sP#u~)b;*Koei({*d*oQ7lX+Fh#Y;VqJzq8kg&auO&cIop)L;%ZnekO(&&veIv?Z4T?HO--){H@I z_-EuMOK2>g7f46FO2ZEv%??y=l-KO)Z-^EBJ(!NJ)p}gL^4}{<_oC1GD*R+lj$lby zlqm1*79~lV9s81|EboU%D<^Qf4B>M)D|Rw^m$5q}nHi)`w;^*x8Pw(kZj#0&hrv|} zRMM=3sd!IT6A>j*9pVwk?M=wS>zqVCgDyV3$+PxWowY=D@CPk18Xo+d=a;7w>{*@0 ze^#A3HN@$@>MiV0?&a-TdZETK@;-jP|H>^C!}JFJ3bx7LreGb~HVPs!JHrT8u!+Cv z4U+X`F;ZeF+ms^eZ&bc`eBtuL5?jl!^ED?bzw7DIf291n-77e|{9f~{c^-SfZYDFodzF54ts_1l#>xeqhdU z`QWd7EtvaBz%ZT+9Wb%-=Bc7mZyJeU*=bA!mJjEv#q!pc3&mXM^*QA2+$kAHu8{tS zAbDgxpUQ-J@Ea?bBp(JrU7zYzA3CNQ@NPDXC3*86 z752y_gQ%FGRNFEPC+OHBUZ{~U{_?M?{ADM_K4LLd_ zx~9Zp8;=g$6fTFd2ZcAunN zI9M-L#FR_EKkYTP&QAJaJz3k#OpVhWM>;dk&I?@VmAeAwvH6+CNrl{jk6SP?XZ@G% zlSxc2N4cy2WNIMwZ*?sU_+XN>tgL*j{+I}KYWd=&HQBD>OFtsLA}y@6xO70>0@H6G z)-HV99v8>U)NdXaJ~ye5uN~F#v{T}iUsm0Ns*~j$LlbWr>aSRPR=-Ch&0^Aw)|sKb z4#2$iZ%oSv7pG-t;l;!{Q3Zm(--UkWspdml8coJDDm-?jD!6T2EL*mz=l?Ty^=mSN zU7hLa%>K13UH(^gRe4c_O;wHz+tX5xWrS_1lJ-8LR)_6KuTkpyBI_XsDDU81*mBD= zvP3uURVjZ44ZNEkm+vnU!%EEZk4|gZ0y?LDpU3~@mk__tAJJRJ5h`ZWsnupU@o#Jf zMXMowC^&9!tIf3JsHGT&`k~(cRYtLg#M@8aKh-XLx$GY;2 zJv`A*=Sd|znFGRABzgR3=?XsQ(2Dsv+J*<>mDl;;Cc) z>Ybl#mVi{4Y8NC zax@;vnn1DiyQv^BG>w<1(}=)J=U-G+(4q*t0{`a)fu&wfyUS_{O)9U)di>J0i^Dg<^I02z6sM>sz7VpRr%T(UNTv|LI6Wdet1| z$k`;vd-7y(EOpKd_oJ##A!qVgBw;lRk?@MKi?@e(^?_@vMXq%MC+%d*N7R_$Dm0rl zN=+g>^-q6BNSTC~1KQ|CrWZ81GvNZa`rkl;2^ZoO<6V`a%$J57L6!O5zZ-%PhpImy zz%iF&!XvC%j^n9g%kp;! zUz4IwrUt(4S!>oXqfeip>Le$mk9`jBsqo-lt6MRBsS%R9hs3_a(}(MpsV0PFPkjqa zflMDdCc#C9pE)vpV2GtpFiSOY^Cko)f1MUBwq-sg)J|@>zvw@fdm^f*afx1%BX22_ zmuKZPh?J=)G_MwWs_#8@>tn7@%%l*9;c zltwj1+AKT`2k;c&5yA@@7tWl{7=I??)pXjBnQt%$VPY>6FHWnk`2*5|kwI4h4Q1!) zo7DYJ(r(JkK*DCe*wP3UzK#jV*K+J%N_3U!%2Xo1)KaLpoY8TAHVw<#Go^DG!LS8f zQ_E1%$JAe7xVk+sEyM_#z?Nn@0_ks+20N~o*f;HJd6=ldJ1}*!Llu|G5`5@Y<)vu| zp7w^+lkgigYc>l1YPhY$rK3o73tpw7sJ9i5y{@9jtS*=iDO9vD;w7n2u)4nONBdS& zdM(qXjehBAlZy(;&PFa^32feb5KHu|Po&wUnsHe?eT28QzW9i&`-qRJ8$rL#VKGG# zUSH7X&GQ3`X=qlNnVz>>vO+gTPV{dz@^B!H zm&p0*W&gjbb3#JtzfmL&zV)#jc)wfRe4$t-(W~>(q8W^-d!KUZcP+pF$mYDjQzCA5 z|7Nb=m$&`tn|zH!*9MEJy;%Xp?#QhX`z4|uU)`#s7T;B>`#7EPfWvC}5)In>I)PQk zl{hWuBZRpR%N!t3*CGU8JR+qlCsL7TR?8^1T-)()zbC^C*9vrRx46TW#+88y>D>Nz zGside8vrsu-lX2N@~?c}9at-G5Y-+3o-?O#-~h=IR&&)01ACn`4m7$Sw0~QGW!(?= z(=d!rZ{^jP{X7#RJ_W+Y4D&5M%Jd7bRW-lej>rNy%H|1tBL=-23-~NqEn=t-9DW%r zpixoZMC1aGEX-WCCPYdV7W6P@Y?(nxwc3-M=@0^>U*B@o`mmn!8=n!jbklC@8DgN) z?}M*i0Y?_DC4#BMv~NG?-?ve=?fdr|2$QzyNd)Abyd1gN6Vc@Zf~ZMuS6LuTjWl^2 zs!`t-gu5hIBRIlV0d8doj=UWxlpv6L0*HW5~yxW=AI4wGnMT= zEK+ifNDN%$ZIiz-5%RWtN>K%CA+`5ssxO$XYF@-S84e5m=qo#NUo)=?b7kTvKiX$| zG?4HdJEiD1mHRZ+9d~NJeZu{Sh(!LYLg#gwsv$brJqu z_(qexL~UO~hE6CiUbaLZoZCVd`rfmbBbvAH`3Y^NFG$ZR$0YeISCP^e<(ulOd%`X4 zQ+2$27ao^*bSfK72mvM}g1Mw0?!UMXoBJO)A97HAx=G&NyZWOb(U|0}k^Tg@zFEUx z9o6tQNr~`#5;c6ltKlOuj3xZ(Odz#N&+@t8sA6`d_(4QZIyyFR(@u&kx)qviJhG9TebS?S($DM&#t)pzZ$E1C{?H z{QlMH$}O_`SEu5Jhti*ab)xo(`0#LRU$XXD+Lx|<$1zOe4aX;kW&Ep;ilxryuVBR8 zB8sQ}ZT{zb${RC?2)t491-w-<2E1Ex2CS~-@5+q~T?;aCrNQ3SP2ZT2GGhgo1_dg`E#GRB6`% zIV6Ku?-A8$`p2!raAU$bo|Y+(^8Quch+9R|p4BHKUqGohYs6}$Z+#6;KovpWh}F%C z>@zeIP@0EKiovtGSp`V}5Oh=py-W}{k|YvFOeqx4YS~OBObUZADH_jex%8bdDH6h@ zfIO?O)nQUFgh?^6-=f2$YzULW@~kdZVG$R(s5g2=@`(O6m_P#;Q6@3vqZ0RxxrqV@3+A0 zJiazr(9$oEc}aTue#~T-L2yT2BAtG^{Mz4 z|DUDv5tYj;6IpfNCszNXU7B1Ss@tiFv{U=4ZuX7%RNASD-Xno<`|)@$vLb^vb$KG) z%@%a8l*e>N+7T%cy|@tB$8t0#IPh{g8?owih95aY82{zXdk>NF9Y+FZ`TTGD|E2EZ zk^BD|SH>phjQIX4uJdkRrouh4OouO$v4ZYzRDaT4)@!;zrACV8&OPb(X-R{(FfnH) zq|e-_r45!2p7q?K@9e4SBD16~&QWt&)^KEeB(pp&SCR$qXIFILWX-Bwa;D}nA!505 zm#;DUZdo7OJ3bw16f-`Pfh1m^c)1fpMm4gO!R%~&p&D?W;TJX3Tx7P-fAx-ZXa9EW zNm02~#%Hw@vtK0T0n77dXyMYIwYzHUPn7EaIQY+ldTf;gxq4su$NEEU`ugOYe!uiT z9R+z!9$x3=etm9;m+wCazQO!o4{wmT^?eROZ3AVWHaf(T)R9+P?bRL+cvfGB?!sdN zeE^G3a!qAaz>6pC#^sHL>Mhu-pW8#EK>kf!s8;I8_Ltq{s#}|m;vLMVvi*aDgGssd z>$<+ijk}=F9(7-x1(9b%af4K#`rR@;h3IC$qnL2Ce9C z4UY;8SBffKD~eLz9nSX`M}A-T$MmDdGcu6T?|T17>Iujodx#McLC zpOn0J!oaI>`X{6ZCNzto9u-4vjJ}A41)7%`G&MBE6|}=MB;wxjGJ^~SKcusTY98H# zQ0%RfA%*<-khY9px!XoU_SVUuR(?UbyToptiJ}(=+O!vEvj0ilF5Bl=MZeMu z{h!#sDu}=a(WYJgDyVJwlkks}f9t8Y|F(U1(vl6co9Zi+dX-*-{ge`wqNGLdj$#GA z`-CloY4nwS>0UU$@c~h!bTr4*FhRd&6}*_Z1%a(;GQblaBjEv5i$uXehbSz1JtF7@ zA-)US(!}7lO@A--d+`t2w=&UJYyB4Q3GFw91Zm#{&t1vbDr#WZm( z-#;!xdl}!gFJG0d|GxcqrJ>=mWG#3-thqRv6y=>_LgdD1eA3*hV3r8N&0R*Y3Ua&Y zH@dDBV^#H8#y|B}aJ*x8+xg`GX8T(&Y6xto5n$S16%-**V(@Q|*+s8sq7m({Jqly^ z<&7K<@}lV830|pXa)Z^{3izXqo(%Yc;Y(>ft2cqi1ibp2zW;|7sK%oKwuIsDEHu%P+7<+rBgb zyB5v%eOAqqWN;|NM_vm)1^bBJHex+f-?2GF-DbqZqQJjrs{ga6D~O94lKs>7FmlUj z3UxcOln~h+*#;`#zo013zn4wi1?B_5W_gDO>rR%*S@37qBsP(n80d8jhU+gz>458akzTaLh1^V~k{+a4~jb$hLSff2Z@o`fi z9OaAA)v<0?{`-nAGmIxK%84~yzOQ(2w&beq_Z3+$;kHwm>YK$xU*OWj z_QpM4)WmK8?M2`hRga5Mvi*@RT3Ws9sv~VIy*iMn{#m}?H*~R*Np9wK z2lrk=TT#ePHH(X^b*Wu!^L;z64EFhV2cuC_;1@N)@1XPrM#(4X6N2;Dkn!n0V()ml z6~WT`-)gz6O?_<~wr7#n_e?vf>OOljS4x~fO^vEA2=&S7l=JB*R`Hp|W_$Ej?nweO zs6Rk`d}tK;h^QeE{oyxqyRuYK*FUk)=Re;ERq@pX>>amK1@9eKrr|ZUKo<`eDvslf)2eYroO_YROs|Ml zpQ77Fj`^iwV?ocwBGj0!;&$Q=F21ylvLef$B(O;{O$&?-?!L&_0Eba27Af?jl$Eq3 z2azBzz*pAyj<1js+dE#%Nqz9t-$g+1Y_y^GE}79*sjjwq5q1)Mis@MXym*6d!>|*}xI*;H#A=hAb%dL$sRn8ne?JdUB%b1BuCO znAfo?-N9T|!`1nM7CB61;}z;j&TAa`TWgCE9EIq4fzkAkb&}AwSdU)alZ?kob@aaw zTuY)YUsJ5?_XQLg!#tsuvayBG?Og<-Wu!z8M88kgG2zQk1t=4)AxXPGXk)+B#XxQu z+3T$OYgV0G)+yRdD{xg+u$HYFsf0Daa3y?~mH4)mFdVm#xHf;YD62Ls+EtN*$XIX{ z!ZGTR@2S1lPYlkif7qW!4_+^}<&RF&gnS=QM#C=z*U>QK`xo)8g*~wOo=bd%O&{27 z6*e2gpRSy$;~&x#RUeo-U%+dxFUT-$DmuovWskxbcYL^`p!wPg+HQ~Kn;wUSPuPA* zQocvkk0gz~gynt*yGHIEcDhFHH{qvczRt)j-?98EO=UfsiY}7_sp!Af@yqP^`qO$U z?_0>ykk=`H&hRA7;=2jY+2f-?bdoI}1NCo2C44um-yN`zluzvwoxc?(w&ZUhvGsT}oWCb@ z{AqT4cyfEi>r%G65bY9G4Q0he$7{7GS>eZ$@&l*k2g==%ZLaKn1)@Ksk&ui_y6gIe z(~UQJ9k0{fqp8C7G#a_p;Cyc|3kt~s@7Y%s!0=ij<^E3?D8};L&_{cl{xJMq+anh$ zeH7b#eT@YNw5@47J0j_}*>vh8cBVf<&un0Ka0J;7+rQ3l<1p7{B#OP+SBQ~qwia^R z=Ns+GK7!m$@O-dh8uc}k`pg=($Q+1%;TM3$o>%tKIp{(Cu=R14mV2vE&;p2oN%0Ou z7_AR!kvoa->fV9-V5l|#e1UFm>09N(Lk7GI2uk<_Lcy-!LsLb4T#Os-(>#^^tT{y# zhW$wYBndnrHb%X+(-r$xX@3&jg-H4S52Zc98vaUd+A8i;6gQk#cc}rQI8ypzp-3|9 zDoRB+b&Uud3`*7l(O+rgLp^O|1xPiP*WXgj^M4V3wHU(+I*6t-@WBeAU`q0xw^^#h z^*2bx(7&0kRd7WE*g=eoMR7yN_fQ`L^oeIh$A zG9&*K!$R!t?_S&P?D&;B{=jg2J|JLMq-DAuyA6Xh82m~xpd7;Guj3zHuCgli!F-E3 zm~uWMC=-330Xpw0f5~9vhHsd!p?3X2%0Ep}CYw!MMM$y9wKoRM8`a?vve+~4GE+$Z zI!31^8y^v)DLsDH_}4!NKkGzzDKn~mo4MC<>U`t$X7&wuoo?8lkdEn6bFe4zY1NOn zw(9aNi?_&YoAKd^`DtD&z7<~6d2?Ub!*kzvC*oPBc($$&sMe{Ch)fSxhiaDQ`QLm( z3axr591kFD%NJtiD7=KeXx71CspcOs%$kH&y{ezz$Zh4-XUT0_b>FzEo)!ZfNxjfx zA8rh|4?F2xN-;DJ`}$;n>hBv6O*KJ7z6d5zD}!$lrCt8*hQ%Fx?NUnCzbAO7)HnZb zzBB8p%7N{RdSX{C->+RrEjI0VG+B`y`Om~k{Lx!AmDGd1!81tM)ZU?(AgrRQ#=&Zt zVI|+cTtIbXTxj|ezJICtOpE06ffD6CX$3xlC4Ah9&uI~S-Zgxr-xPV~X+Ew z*{bLeIJo{3$JT{*mn$HeRqVsiOE1#K~k5}z5<$0QY4?f6spnlepqH*eYh5C)?pZ@aFMKJ%}d{XfUK$U zkhHtwHJ?2iuk&?PE1!B1jfE_2h*+N#?n(;ohHfL(P=CI_|p`Y1I+n>P$p_Uqou`*#~Jwa`Qb~ z$-kI;fNg2?_+(gaW_#G$zLw`GC>b9|->l;w>7nDltH$5qubG~w<5&G4{xx>|QXT(h z6aO|H-%dYX$It#j{Bd^t5juXY)IaHa8Bw(M=izbB?#U`22|wWTwX~(-_EPkrrl37t zS{~2p4sG~_+kee(hY+j&+t$l(+w;3a^Sj@cPtK`?#~We!`f7evKj3$9dwz2?zYA@C zm$%_3?Squt8`uctHuMMlI<)5(r}<4zG5R~X4L>`-b(-IyCGGS3xD-$z`p7&G*r{+) zt>86;w_nfVI`(0|oyBqzw`G0DZ4Bzp=Qos1pLHIqXIx9wFo_fy23Aeas{4-j^2g#W z2%MY8|0@F^TuGk#4{&|48}eN^YQIVF)PF3vKy>~*B~Qy8 zM3Qk3=i**v2_Vle?`O*w$vpKFCBeq3wBf-|s6@fXIm)PqAr)5;ml`4C@W+#NeARzT zeXcA}`pwrgs{f|F6wO~WQ7Pnf6PxzC-zH+4_FMXYiGP-k@3P}Z&I3-;9GYb!Y0`hm zPG7hG9|S)`OsSWehV~@TZPQ%nks&ZLI2{f{zTm4A{^x=>=h+!rYZ%fG^y{h^+Wo)> z!MilSVw;~D2&(+}iH|17naGl#rjveyJ8QjcnWCYkqfBuO@sP%eX}Ac-2^+Wq1?63-uf zOxF9PUgpWYke8|iqTkYi)zS|Zb=Uol*tfLvcjUnK=erw@vdwq=Qm;-Ga&D(|J$Qp)K=Ae<=ZhuED(%l!ymD z1SrHSAcD_I1_EQA!!4gH?smoJifS3rgVnhTcMrJ7=!| z6)s1jekh3r#w?VmQkX6k))B2iz`=zKwAHGXzb|7sle@CDdnVRpp& z9P^dH1eV`tWOBuF-S`C#e_?{k4>s3@NgsCz&T3gtk=ga>iCVPB^1sYWTBLnfb06tD zrD@#_^5@^r8u(cQKWpG;4g9QupEdBa27cDS&l>ny13zov|7Q*K9o?^TWWNe;W<_~r zX;o?Y;xYY-y_sdDi%P4MYu=oSIrB=Zmg6~B@=;k)GOu)gX-Toyj^Hh+nO9O$TDiV|dGqb+!F7|B?G-9mksom zFTuHtLrHVXFRQNfPRg4+yP$k=X;t}>+0_-rbE-;amoBaSo z=>H%I6*0Z6bZ*Jg{@!_W7B4QZ^3EwME1yR)-hO4p-nq-GN-76>=gci%QdPS6vcVF; zrY~8t1X<@TDVZZEZ)NFai|3S`F{g6*;(6YR(uxu-RV#gIdG!)SxU95l-U4q`xwoXE zysXTsT2NZ)&717ye@+?PikEwrlw4L?DVZ$xLcG9RSyEOq4-F`mRi%qcyegCE(`&0w zm(kJ^tEzlnpg)v>{N=c0^-hH%lGB@4X^=2Utm#@v#U#mH49L@L^nl0|b$7fS{s7}yDh zEyyHkhnFrcE~zo>TkS}Pwl%g^*~MT@6pX`~ytHJ={Ic?8IZ_3lMqwV#L%~ zIo7(2j9)U#8a*1!oZ{K@my|Ek zI-bqy4NG)}TNE{~d=V9_$|{*NZ-G_1Sh8DXk%N&V$6;mTRDoINPn~vt z-lW{wh11Tr!lh0*SCDj7Ml!ODzN*7nx z%qcDRmX^;(bE*NT3}aO-n7wQcn^XCD<8m&TJt03UcWM|-993^-qr>WoaIjWR*sE%i zT{H70D;-WQoLx9MKYw;sc6OL9TnXDSixjZ3dM*YQj?f0BBH6_fp>S2*=g(VQRb~oJ zG*oF(S7t9PSw7Y(SyWL4kh(N`L3tU4XH_p2pQW3Cg;!LUP{I|oGT5J1mStxg(uIr5 zmn{ZXR#ylO&BEL{^A?sYE*?n}YUze3Y}--=bsJk&US44pR9BVMScbmRc2Kx>6GQRN zSy+NU*4< zIeF6e!+#f>l(}!|)3=}eUO{HB)kiuDzamATKGiEx>|d?z5V-%Z>~j1q6k2yU6cYDn z1H~=RN8oJt{|&eq{*E5bQF8I+Kapo!Ixp_xt~rB~xWESB0if^f5GOt@s~)%=c;z{v z&_SRzJQO+(Oa&$-T2|kYq0oK6xxih(uYhSRj4l|(_n(3H0E>a|0e1k`j1Gm~1ilG8 z4on;q3MI3=IuSS=_!Mvpa3637@Q=V6mUKS{HUYiohC-PvJr4nH1fB;x%5wa4po{H` z*}!Dr^}yl4t-u+;=YRv*FWL)i2F8vJg{s&FYXIH=?3oz~?E&`B3WXBc$D9Ei2>b_d z8t@fXhF1dnuo}Jv$h`}pJ;1ks$?V2p@CBg7Zt}OlV&F?G{O8L!o2h2d1)LI%5`g1PlVpfa!Cf2Mz~r1ug*Y0d4{w z1~vh?zTG+qOa>;;rCfkDz?r}%V6BADBR+5eunD*m_z^IjcQcYY!oLK40@E);A3*oz z=o7f93_4(N5%P6{?_%Tw9tW0*zZ`o4He5lu0yhEo19t+OfxackMg3U-91d&%&H!$! zq)h;(R}oG2H_PCWpralQuf-mL4RzQja1*cz$m##kabOcLgL>Aq2DyL- zfn~A{wwC-#cmwqxSmVbosc#Lyb-+!)Ex>KS9l)KyCSVir5bz-IC@=_gQ7?}JlYz;< z#7=UBf;8tJ*aHsg!!AI&fFd5hc91e6hQl7vdFbF)j9z9Wi z8#dAoP*0CvhaCYo-9UY#e%Aa7{Q_rfqTK`fZl)elPq*EI9)LBQDG%}AN_z%O-h!P2 zHv!YB$H{jfH*mpS$PIMgOML>S1GfXWZ9`7#dGhZ_4_NaA`I377WGJ)^*aUnMcpTUa zOn)X6Dy055?IIjF{8_?*2Z1gx{^#HW^gT~I1FU(0^nl5Gu|ElKqW;lN90dA+4g0VI zVET*j18xIav>WL!VK2aKzy;#pPdNg8z%9Tg;915ADg{QzqYVduc$ zU(n-e^j#f$*#U_B)$ET9{Bn&UU)P*C#v)cwP4`9JjbC;Dx}^<(qeCy8Yv%2iFa9;H*$vaJzi3nKvAhWRtxRuDWTBXHni)U=heBYZ9=ihZP0CPPd9#@ z(~uR~{0=~uaDFJX;fMUL5`Hpn@q#-JT@`ehz_7jN)H$6gPEog9rDLVK&^Kc$hCb>i zWspJGI>JPzaJ-0mBDbV%{t0{q`1`>3K0$m*b0hdC!87bpKS^^dVKTNmS3>5Pw&8pw zrpn76@CU(96})OYv|U8yw9*8jNn%`B7^Vr^*HWSK5}puEdH)-l3~0*!4b3!YHvI%m z8fn!)vj>_vVR^KTmXrznvxR@I&}YNHv*Mp0AEjE6y!d4jJrDbn^lBu%OF3dG@`d9! zI(7D+64LSUleK`NuWiupnH>tP!5x+_Tj;YS0m54I;8SgU)H20N@sfG(X!=aivHX<%6PC_gfFYX6`=pLBc{+~Z_eA2S zn6mI`dUo#l6oQSF}d3n>AWe`tc}N9v1~W3tlgh2W(u4uf}-momZglQfSLR!mrb z2~e_M+7XjbX(ll@tO2L`Vmn{-4Kqba)ED779Gdd}q0m@~&(F(~PuMMl-6R2aJl%&y ztt0Aaf-9iOhj(u&ivp9^)_O_3iMm>n@x_-4$c>MZg53SW{+C~QRr0!>_%D-2Ic_T< zCb2GdP1L%W#_08~4Nk$!{5JJ;(^lFtAbSm51b-C#NbqW$r0_XPS5kwdUMAAmA40y< zL_WJMRrNYYH5@(!yhkLXBN2WwZ|)1fdvUjy$4gKV_}_w`BzTn`Hb0K`YaBcX5+3!? zya~c;USnn#2X65JjebUjDZemO$7d2~p*f+c75U5*>*k zDZ@9RnE}o9VVd@BbJQYJgi8OiHZdLjdWF7S&V`?R-env7=7>!w{Za=DbYHSAhL*mk zYU!nESNx_y-w%ER@VDnD?M4;&rc%>J+vSxfZMi)x%#D|HH$&&Woc1N0uAPs`Qf4IF zM13&t>NxF}NUy|zL>@iYmN6WeyeoVoC zz;8OGq{<(f{fk2(fci-~)9^GA_MphE%E-30iH*^@B6!pk(SHtdOPf^>y{{q^S}Gj! zOq*bjTV-4)@yh|bKI+Brt)pC(b+T|Tr{Whiu~@U-Qz z>sW!xx9W9-UUat-`l;!y<4XzKNLXG(n3U^Q!p0J&+IO2TZAdAC3Vx5_qsraJM~q1i zgU=?uns2tlOPaE#e0&LGEZp*wFj)^f)-G%yVMp7AWfJxgVW?C6BVH*iM)Gll*VFwAb#}bmpPQupHr$&xB_7irXUEF5E_7lbsAe`9ev`0B9i$T0o?ixG!q3i!*itrO!tZdTjpVG?_4&7A>3Q*9=w!|CJ;n=}xK+EL zta-ieSE&r3t&RMZvA$^Asw#iNWbJX3#Iwtfwo;mRiL-~l2JmWLh+kwnNZ1a-Uc()Z z(>lL>mZ+-DurQhcGF>fn()Ptr!=f8q>#1W>m%ZRW0)M06Cz-k_?ex+PyT`u(mz?jut)F6g|V+^o+|92B`` zApP_@=LEB6AT$G^Spm&L++kkO`089y(j7~Bh0r_;&BRC=dz^kHM1)JbQUl##bZ~d1 z%|!GmQFll_CdRAshxSo;s`+2L{z=l@1OAWT=bR|bsA(!uu@hN??ld?QI$P-YN%>k- zs)VJXP-%F4Py3b^(YN(bU4k@O%3d<062jv|eS+9uA^3qcq0qIF`BH6QzV5T4zLktI z)Hdr8^ICPXj<`>g4<%o_e5wv(T>Pa%E$!e=Xp5JJLT^XfS)0CWt!kTd;#F54mj5X6 zHj>7x@MzyRi#}xC{Ug@vUyGDqjklxJ@Ha0$>OskXboO58W#7w#KBP=rZB(tINcX1d zVlgx|D?_0VgvPd2%~MT3giz962VEw60Ov=hO<%*Dm`R@EnH%p+Q4=qre-iqNRon{J zhJL*>x6zfeE;^gVsJlee^K3ajf<8dr-xfLA)b*$uA+-CkB=!t~SD7)onvdwZkd2)m z7Q)>4De^CUq}0=F=o8R^vZr?SvM`=mzJ+@L2BdSY1@Q-Ugw6 zaUgufR@&7q(W#q#nq!;EU!*Oy_7{H?UNSC}D7Sl13RciO`%L&Kqq_VXNMw9+6bWsWxvDwDss{sqkwjua_X%SNb#fM!`p%lp|DYRMf6Lyc= zKknsmuVhIV=!MirJl7qj4L(o$N$QOBN3vKzO%a+hXbPdZ0e4ttp()o)r7hnG&3+a(TQ#Q zZRg*9p{9YZ(6Myel%B%)=x*vvST6Es;^nQ2nZ%fWflV*z%z!@op2#+YvbOudsHP4| ze@c6KcI9{((X5Tc`^Oof&`Xkzl)D-6i*D`%=e;*_{Yb{*dd=!0Nt{Mm>c*SUH9&WV z@UYvjh;o;;0BO8lenr;}7oFLd3}erdX2clC3yU=HLHOM${KC4{>8^p7$mWBlcpGhj z(Aec~WRu2HrZAGf3g|-QZ-CHATBh!M@vZ~61s=-VAwunFJ^=&t_;h{`SY^6q;Sod<4yvxWhU#dS7hH<}ftA-?10khNjV(x6YMY7rk65 zS7b|IuvH74(trChjF3&raX7R)X(vupj?)AOAAg(lw7p2%B>Js^Chb1n)fF0kUY>P? zZGh)y2~c&DwJDRA4a5_g?a+K{%lIQUB75I6;Qcq@W7GI#eL-!3sIidLQP~^!-p`(H zB%KL+2c-+qiR zd%h-oRuXoUu--zY$ab%x9fiN`|o+Irnam-$b*ysW91HmuC z9nO2i_)Rh|bjP8qg03`72Osto)GF14cxfV3dR`{YPeM06lFke%y@X|g{}y~72OeA3 zQfI%>t)a9>#n8C7b2cGN(`xfi3K^@Ms{~GrSF+sz{es`qw-Yy#r;;r%zEWfpdzG^Y zTcBfD(MqSsi?WBJ#;KBDFX$k&*$;(6w})w4WmpYEp^>vqyP)}VB#qYHUP)8*mI2Mm zKbWzsonL#+<$%t!$TkDI>>cDGGS7z2*+q3s$__K2l`~W|5A$ZN(As?xV|m7YYBPm3 zSLXmT{E^v=*v3xc?0BT@n!tX-c147Vy~uft{ea=ry$AZ|N9rkY58 zz2FBv8Vda;60hd7QEGQa7Bq#<2i*?n+Kg@N{3b_<`YdUGDxiDvF>^hlZS%69wOSiO z+x@JlED4<)|I^T(KkSFM_etudR5Cj+_S}n38Z~~S)W|>%QtMm(GM){E9u~bv$l~0h zrWmR&%lVZ3&$XUykg^?0SQBCA;SQ&x>}0NpdtUq`m0iL9{QFr0KWpG;4g9QupEdBa z27cDS|8or#E!0VR4ZN|d40a-ZYNEin%-|z1Cv-CO`N>~llIEYOCXxF4)**gdYJM_W z82Rt`_m-=y_-*`9M>+bjhMC5%eLw#1H7L!6`Inib*?wodCb0b-jX%L=nW-HejeoTI zvZ`gJ82^D8Iwn(Y^<&tpek?ht-$8>{V{bxi{O8~6BOOQ0I;}lVJSdZGesVTNehmg; z&n-6?`3z9&t3oHsV)6@KqUAAcEqUKTen}cw_P!uXh3ePbUqd^*=~V5vNlOF>t$qy9_*FV6%Zo4YbCa z^bPbHm|uy z2b=wx@W<$K$B!TBO`krudT~{?cgR_T&l;RD=m1d|4kl!S6o8qO9AO+4PnXedrube8u@1jx=4)t^(~J zt%3Ee@qcCfpHI?`I^(aItQ~gOc7yS&qnn_9t@d;{%46vNZ2UJFe|w+Om2mcU0^L z=zWSSnm5X=9@9X_lnIR^rm{0MCCcr-9CtTY>_3SHrc8WMtf<3xE+e- zd_8W)9lyB?;hR#Fdl0>Fr<-;7t8~nrZb=dP^W78n3F*r$j(2)ap<^Vy_}8HEq<4M_ zH#}d4CnEoiw9~g!<_8mpxUa#0oU41Y4t-Xvu(F(;*ziw0JMIu}w{tf+PCQ3>5}mKo z$0rU~o@D1PSSOB99pcg4;Vma$(_fN8OEE;csyY)BljwYZ(J%ZM5kdo3Xe zvAI~5+Zq)wnvThIJWrr=4HgW8!P&D=u zDx)J--t>ry9f?MrvArO4#Xd;MM8}SUBqsI=s#a`lH5qruj^sZs_8WM1h;@k$V(&-R zgxFK4q8($eguYYk#ZsMOm*DOkdoihWiG2wAuCb|zniTs6{JX^#5Z*oZ9b%mvdla5M zVxK|nsjJh~Z8BqT2U`@|3}J2ehmgv0bibHP0-7mUKpm{CsP0#glI7}ts;I=>Jx)5E z#O@~v@OJMfAhY{f0%|*D39uYir^(6@Wp$dR94@QVLgjEn=iJ4XUVGVnsQ+supk1oa!1{W{)J1Xw69Mkm88TCB`6$ z(ZgY4%vrMB>h0(vEr;8>D7nKwqf4PV>!iNO<%m}@oHU4i5J$YEW{oOBi1ZF0xYy&$ z&Bm@ed?*!U5I3O@a>NS%L@P$@IsSc=b5dF2?F7Ya<4{|GK*}!@#p~=(*J=8M51$9KM=oCo}~U2rC@IE^gftm=Na%%*{m?B&a2^=a=T*Ybw*>DDR(Bw z8|CTFUSu`p?j%2+3}>n&^E>6qcD_e}r97nK%y2#;((FjS5warZCzN5zqn$s+Q|nwS zte;YG8k}Dfl(I`2VAQHT$JUg6spo5gR6xmK^A8anA zS$TFj-=#fH`MdHoSuvu!7}4e!CpC1#H|Qd9j2sEyD9+?D?^90Ks?Y(;;IE9Y$4bXE zf@3d1vySeY#gZMd6AAIgc7{`?75_2f_jn?$gs>h$nl3N2`+7X>-hsz?HjH{a-?@l* zma~S&pvPCSf^eUEJMoeoJ^CU_#<|y1F-~#BOR*0>SK7V-4kdM_H9EaVQ*=mJbwPtY z-blWlTv*QOB+}!M^0=Mfqv#(0=+X&RiOx?2^QpolJ7Wgp`O?!BjMwTSy^|0{S%_}M z2-hK!q{v|RHbn$_2Oy|xq^Qcf8`ZeZQ_e03>6)aR@+ORHigLQpzUxBe97dL0bCgpS z6KDVWVoiz?k>pDNvRv+zJtK|IVw)wXa+MMiRW77aXG!G;<>J~P`Rxk!mT5Qr*ax) z#b*iQ>z(^0k$ob@ZJvIhV@~IYb|4-Of_M+|^mvwn?Zkb*u6uIVWIKsduY5$<7oKOTDM-CKz~~-%6Z& z6Ml~;-RUK<)NKj!&PImw5VbA!Hwg}`cDVB~;r81EdHW*Md8Z`$yM!rte9kIVoO)kE zIUa^r!utM%Mm#f|ozZ&g0|}4gDRMq6DtIvQFL)L>ms9eo+m$#K&N_+n`veaJHO^Wg zdq^p@R`txOf9Nb_P;d1pfKDl^0`a0+|Elp?F}ERljOZukLjJml+9ZQNpu0-2q9Mt# zR=H+ytBrUyj8HC(6@!U+#3uPxNOlnvrCdsu2x9TayloSU&NQ(oUKMMUW*P%V$&w!? zY0Z`j({y4=G5u{~(X?XFnl~%v0vju;*V)=3@@WS0l8Z`cyI>VU*_rZcl83>>JSe%m zPKYHpQdX^LXqP5_Mo2`79Vo6S_18`j5!w(v#r%~R@%^dFsXLrfkUiuMkr-hSe;jYm zDzBG-_?M}5r{wh*hdV>u>5pM4Nhy~&q|NUyohfeVOs)Rq^XH34Sh!W6Ydi@~>7tD% z(TW!iDGPh$5|~~Hu{Wj4{g!YmSv=25S=vS1mU9e$DK*ODc3wiwPFbaz{6y!2Xd-2e zY9f=Vu~7S@H;R&uFG^CkVh-VtIh((D=@nD{;gse-{RsI^?sckr3N_66CCyQ<)8dur z&NER)uXM%V?OaU#>6PA9I3+mcO~+p8CyOW1S=~)MY2rz;dPKoyY#NN6oupM8d?$Y{ z<&1NBi_jIn!P%r4Z32_+!0kvHV*(THz^|cF&R!a0s36?+X15whp5~ITet+B4Oq8gVX*WH|Ua-z(m-j$F60)m*NM@ykP*vPerH-2fe~g5ztaaEz$}>^Fkr4T_V!ps` zvj$T@DHlfV3J0fI1gE^=RPo=EV5N-A?}(rNKun8-6bZ+nr<3pg{W|u8J}v50%Q}69 zLuIi$8PQpkA%MUSHeecmB#G8Rbyhb%R)9Ghd4$fXRwpLYxp z3Qm?Y&0{Pt4bEOis^IhROZ#^6{vnoiv0-5iC*(y(!b8}x>n|Xrm#yMSEgjlQ6*Zm^ z*8}mLg=#s70RFW+XRnQ*a)p_KkzaJ4Bf)hO6r1tfqJmES7;mLX++jNuia*!m<0Xaf zpt%R{RtZ0KH@+G>hV2lH{9I36BQf59W;@;oc%qx}Jc(l`k9EmYXE8&uquUO&qJFLi z6J7fucn#mHD#Sg>&`P<#1#gFAdQ>I<(^}g?tLs)nBsMc{pYe!UK^^C`5-ACO4#yPd zU5@G0E@`zr3or)94u@)O9ob2Y4W+~gNtYt)TWUETaj4#)r<9uGQC)0SzqvHT+f>1O z7c0KjGz}>D?_i?}ew!}%_rSc(qYD1Fn!{K4Kj%4l2~BdYVPQ=oTRlgn#WE;lZOJ--1Okjop1t8#g**3~kkkvBY4F0a=d{P@@M#NB72+j6xp zJgeV&igk@jYL}tK1k}&5S*ngoYK`M`k@7}ZZm^ST&`JFkzbrw<9s0LP<-%fxO3EtJ zNsI_5wa`v#h0c{sShw3rt<*`qf`7jxm1?5@c&-N0I?Yl^6)w?fd>l?nUNKO)n&lWM zx%x9K|HN}%X*qF*OVHPNKjKk3ovl+pn?`LQ&q)<%tjN((dYNLLizTc8;vz>k344M^ z77$OqW3XjiXHs|kk>raV(Tmu}bv*z=?(ukyCs7d5j}h_@e2015H<>un^NfXF>}eI@ zcbV`92*1#TSE7yInQ-aSbOnXw$sZ2k0HvLJGa<_y2_ACp`UZqF&>!=p_8dx+3KRJ` zKIboPPA`X04Fust6Aqq4K}4TTNJo6}JkgnWPQuYmJQMNs#?ebW)9?(y(O*25;u(hH zEFSJv=xI`t&e?J=HquEc4kJxumlmRJ>*8K#s0KkLFR17oLgW}llM?5AQzqv89FFtj zoF8=79?QMgM3XMJ-b526zG=cgM}%!Ee41*}rnpyHZf}~KNo&{l4UP2Z?lXKYq=Nhz(2M{gJ`K>L2)o(juja5ciyI9F+eXIes_@N%g2*)}GiN$5{jNuU@ z9P1b%L34Pf@+c$B(nct&PS;DA7~wc=gfHQLR>I!F=*MXz>_ej|*8?dde9olqxQOI) z9nt?vF-ABVis3wof>1_SfbTpW_g)i6j8N{Z6t#=~-Z0@}gojKxDu{c>gts+9S&9a@4{#1jI$8Go8oP56==Da`%uc1^r!d6bo(X;alhg_VCGRAS{fLva&Nq9Bx&--S<>JC&8+kK=dZ5i5Tb z$HU?gD}NS;e8x;!`AazV@nGczCM9jc3P^w%Mb;v5}rCZ@~>x}luI|u`fp`?p*=Z3Gob4lY_y=RIp-}iBmGz#pS45D<*yISP zejWBZ;#@aDF%{A&Jg#5jDZ+87#JxKruDgBQ`1Gg**K<%TgtS!RK8&XZ$5I~ooqP|L z{i?~EwSkZkjKoo*>tzsiP+cw2p2gFMBOsoK@!W*tMxMAgP2BaP#EPawT?q^KEhbRR zYdOrMp0*!+goXXq!?3~-No9V{M3y<+Z(76SzBA!sF{(KZTZ`p6)P=AVGmhzSiam}= z(c_qoGI|0%OiEuyaXlhOajCkrty6vhlW*17&#DmJ&>w1mUH#Q-SxKo32fpn$jllcK z`t3YP^7Zm>&var8NAb!=aFPrezdcuyN@8Z0$WtKu2H#7(!T3()Nfy%!skMp=@SZP0 z&l5S+RpKqcJD*1xqou{G#b3d5^7Dh4X&Ct&GGuo;qW{v1VwryiH6Mz{cw86Zc^Ah) zp7Hs3Tx0o*V^Zkkah)0I=@;oqj`YOi3A6m3gu@Iz#gh)FKEmxV9=XoyT=BdWL6#`; zMOVUQE-2Y8i(ZAtkE2dJ0X+BNxKliv@Vt%VkK(x-&v6|863;_;PC~_kmkfvQ+QXTw6)vfK6c4LZs z6G>J|?p0LN+?96s@4nk$#rj{+*f?i$xX1rv1X}TpvQgG4S=jY4W!ITzhspS;LqCRye;U#Lmx3cNKuanst4Z+|!{vQBA&?jw~_g&|JU36WBEACuBY zYG|E>?f^L z;^25#<$H?}n+mCZj?JU{ntUHt@gqn>RplK}JiwDE2vwC|!S^DM zs>*h}XxpKMWtMSw7hxe)`8|mL!ehC=F{wyZJ{`2~y{xW-s&zC|t3NbkqMzBC?1y#2 zoogaVyAJ}^#iNAuAkBFGfKNh5c~rkrMPF6 z;^alr?|76|y=hw&wa9YpNhl|}vZ}avR+o8{RoPT7p;E)pBv4&=5+y`gRXV;?d6ZR+ z#xYVnVpVd1ne6K*tCAbeFBgwkRXvVtc=*NHY5cfVo$(fWcif{g?sx-1JF7*QdorYJ z?3_u5;J9bBxKHB~BbH-Z+%))(l?LlKD&y8Ey)et$RQ%>2DDI_GjpA-o{BA?6TX>Y> zwy5|I;oZ)o6nD&4+#nKh+?BA6=t^-cDIQVWIXH&#@Qbt4_;JOZ(wk;zqt3VK4sumoB;VX{n#uP@ zwX`!8t_3_Q-`A;pFTz{OlX~tjn#L=1Ovl4O$BohRiS8-^u?mWnJg$rIG~iexo&r4A zeQaJY}xPPQTbV|@)O;W3P6x*ITjh74og~&hU8*6j+a3|q6DZGL(ZD?;ZZGy zO&@JLj4ZSmqa~`e7?!)raFv!~I>EYom}Ygo+aOF+G0%7<_kK;MCsL6smRB1h*}92q zG#)WmX@A6f%6>+OD?F$={Ne>8UG;NpcJya$NsbISm`$J~$8@ENm3;&u8*RgQlHY;D zl?lROJl-)pR*Y7wN5sZagO)9ZQX6gO({eu_5xc=gzZGWw*9i2z zHu~>jbj(sMsiggajXq|hyY@9`+4M*lXFRe#t2z~@kx^;Gu3oH7F-T6h)DRD{i91CS zH=BAZ#2Hq?3PXIcO`Oz*xJ=7vh;KH;Yi;75k;L1Lg&Q#*HpDw@;+-aMN@lwQG@Rcw z#P8e0r$utM$0COFM}|0dpwY(QR$^5PRnAsNkWs+Y zNaBj}HpDv(@o1a)f=FU}$}#MP0+_GX14&Nak6sqm_DtcWDGmb7XEd!J{BC)&idk;L|9kKufk zAzo$^H$)Own8ryH7uo0Tl?aWIg!bN{CbZ^kh(*w$4u?$qdzY5uRtFi!$}zvQJE^^4 zk8HOj)WZwuokz}K{X-UL2=V#n z1}Tq^4j^HTx1XU972>8m^mi3*dUJfnr%T1SdV&|&_fD)IC#5((}QZfhM`!mV$q zl@Ks1Fc(OSfFnV|dk&HG16r8AOZkRe!a7HStgZB1ElI9(be7(~XSsORJ3N;VXRds@ zDdEo!=e&1FvnK{%C0yt52%R;l=fy(#kfWn;r>7HE9=SXw;Zlb~1a>B7*n(c_=u;#_ zo)3lL1xA%)!uSguX@c)tT3ll#%+QHjo~6QUvSBtWOgvfV+Vb>}9OW8jzYODZ9erDw z<=M>sDmof#h#w6TkJXatl(TH&Qc>JFhWK!p_?$>FN7%%pL`+siRGwW!>^x^Uyds9> zDNX?2-!MxH*(%xSWANEwd>=dh(;|5f!@oF;?_uNL5Mh%{{Q59H$yU>C9l&=q z@wbNY9Swf+V~OCu6Y2MZ?5u42yHqLF&Z@+}Q(NlR83&+q-KUm@owC)`yL|5D1gJ$d z>x@58CE{jltSssFUX1tDW1@jxnMo++utS!DW%0H{B`28h>zKXPbtb6EA?JIigt1MI zo?>Q`ddk!CHE?#0OLPbq8|v8e(vbrO8U8@w<68{l-SEuNguZi88GAJ2y;srmY!SQ|Nw*!p;n1PjMt` zSvsM&ScP03M#h?R*ppwvD7rUG8aIMeMb*7o*WBSR5wZKjf|J7m8uzej_D);E_a3`H zt(H!$;hrv3>rIlFtQje~m`zD4@iTlBN7N^}xMlI6_fotksixqJC&*LOZMwOXb)?=k zcvT50{!v@hrhqm4Z?wJ6a^WY3Eqa&!FT%bAK8j-be|mN{+09O}M|R1w31JB&B%Db& z!(~uVPC*4kxdI}Gaw(uFAfTd%`T%bwD$f%Y6>k(o@WlI8yzv&FPr>7<&+GsFR`+ZY z@csV#`BYNXRn=WxUER~uGu;Cs${1;TlI2_2d=RmdE#GMxn`QYf}E{yuo)eq`5(-#M+jZz*>I~;oh9#_RuYCwLBdi#Ge)}U$)S?X|ECX zq5Jwn!sW{wnj6x7Zm}DS4*onPJ0+~1KOm6&KQrX`6igiE|5-cYnaYg7ozW>7TGmQn9Yiw_5kQJTwb|sLo`Tdim3w=4 z=yM^m6C^qi7(kwsLn&DSI2^12fCy7$1z;j5zW6LF0H*<2K!Pg({Lb215?ldz5y-P7 zxB`%c_Ob!^^Xz_Av!z%8AF^5!s^8rT)b)10Ar1+|C-i>6If+{B?AHeA`o+c zoCN4WrOu}sX%B&b{H{^EJndx=UJ7VO?ce~Tk*P-iOf`Z{B9QTbcC2VSRxsGokS9DRc$H4W*)3J@s9w-#E3|->2|$DlX$5}Cvlbw&;OY52q@fimm<3y5 zG=%90d^gdQ!d5sGY+ZFM_FQflx*259SY(p$C<-r~DEA{~$3bHfvYG&pLBo@BC?$i& zQm_^SB21A%V?C&=0WxSj41_PV$)NE8katMPvLP;ng#Z~eCIguOz^@10eYdeDgLpyF zTpi~5{hyG(9w2_d3&juSWY6*P@Dn zYZGugcDu@+-D2+94Zc+{T#{tZZbEO@9j>?QmW~7GNdC!PL>awjxAYXj|M#BVV(!_^ zsfbh2?AaX=$Q7+7yKP7M9f|}#$l__jHAghJtYyxV9P*s$z?E}%0fu^K9Ps5%bC|Ef zYk=e5HEb>w?n25Ae;=nx_-bkf!rS;S68sSZ}VzcQ8y zrY)O`#9Ug_pOzh=NLM{cBZn&X1a0K-CPo^{7-=YDB&Y@>L9C~dsmTkh0EkX7Bpvw; zEf5%?a!Hk2?XG}?c9>w=tT+;LS$;Jm{%#<>*ukvgspu7c9tVkpCcQM9ocB?=#9pQ$wuS6T6G?B%HzFP-tdr=lgAb5 zys^^uo&+mVgNj%+k`WTUZjDCD!8tr$?V9ocB? z$VOvFHX1v!(b$oV#*S<>c9udu&ykJB&Z)qoj%+k`WTUYo8;u>=Xza*FW9L1LyD4WM z=8T1oY&3Rcqp_oqUhL?N#$~e6n3nr)$Qnz_A9dk;t4uZ;voU=;)ocu|&N$eac4VWm z6TzrZ>&Ql9haOlS)*Fq(dZTf8526r5(>cfrLzCWU9M&6+!$EihLsJ3&rNeroaaeCO zj`nAwg`vsYXdLx68b?nS7KSEoqjA*RXdLx68b^n5fU}lcQE#Jh)Z1tr^)?zuy^Y53 zf&3y-3{d=~qvokeZB1sQaaeCO4x5d}Wfws%`&|67*JQ1MQ^I`n4w{*b#-jo@HX7dx zmbcOPW(as2jU{phB<&x9pF?6aU;nZH8>57kl8wgLX?z!mK#Dt!ZEQ7WArWg##Ku-* z7dKle(ZOD0t;D^?HZ~h?kSIJhY5&{b2~yr>W3j_*HfD*|VRg7>mfK$jj)l}%zS3fU zozGqpuu|A>Y-7VQONn3s5II)!&&i-o-{t<}$gIfeNXcD-Kkc|3SB49#EB7Bqwy}b_ z{L|Zqe!gZaut;w{gIh~9*;}^FN@|&Go24sbOB8RX9oaS;u16WT=*hNOM{k=g=C;|` z);2%lUnxcV$hO(o_JOcJkGp1LPeo@z&C27h+1RhyWCSAIH5%`$0)_G9jM$h|A?`10qo{H|SavCCf|=r2Ui zBx-iO_E}Vo`EERSF8rCtt71Ga!7HYf_Y4O4csLP&jYhznGs z&uRz{inn~6Ht`{RJZ%O=en30kO0o>(g;`iDnE<(YygJ28#K1`2I%e5A#X8kmr3>({ zEjPvm^H_1$hG>qUL0@?t>x#r6j2+y9o(uYF&2d}pxw9>Xoo!TWfu#_+1V}*o=x)8U zEiopW{^!;>Uw`J+tpEjN6{)PD85L$=HRq=o;_aK!tjQkB>To3nm3XHmOpvKc!^O8f zcSAM9ZYX-~(u_uX2Tfam-B8T+VJ}%`H@;brls{Hq?yqb9qv#Ig{<`G1v5zUt%o_e! zeYw9bRW6ww_X=`ujy+M7>C4S_g~Np*o9zlu7Q7X&WgH%S?Bsg0UC}aO^&m^?+F>|) zivJOOmr|Rf=UyGSqt1WNL@(9qHWzLW{MU}1#w4jeF)J5aWvp(C$^6ZZUD}k{?FK}F zeTmAtC6mv@(X0?c2O$9g7{fqb&Dh?!48e?h{kF zqpW1MWc*QvH4Ey-RPHD%86*6k$S2Dh*8&Br_9}Pz3X*tv0R5gnRlghU+L3*-y{e?6 z-^57u6rdx!W_#6(Zf%btvjEU(4*bwj1z4G7pqDc3cQ~MvYR-Jtfj%D)`oa{`MG9d@ zMQh#+C-+ooDkB;uqe%Qp-i6G8;*bjdjPxMybOSkEA$PV&TgpSQ#3nzdR7LC*Bp%Ag z`+9(^wjiDZvJ2qPHF|7Su6F46I;*G}+I)`AqM!a}-Q^kC+cWYPGnj~x2Z}@L03%;9 z87dDs$jCQg)9ap*Ujg}oMt)%Q{?5pehF5EhJO<4#p6urtxv#O22Z}@L03+vlMtaCW zM*aYs_IpNVp>-XAf9c;EiE9l!*~WOen=vwm$Q2_8s6yS`Ul}6?lr+L=axpicF3y4xCY z$+av`^eB57W=ppjF0TYR`x}WaYb>g|S~;yv94&_AmBJKbayFWDUIQM~=|SIa^E}(~ z2RZY@k8D{|-W)+q@xyB!T*I_-IV^bX)>-As!nhC zFkZnwD*-aDwb0|*bD$pwgvw2cRZ!*cOALw<)M?dR2X)$vVG`7yxX(j8Jq39Q>b=PI zOMnD5N6r5NbWoe3RINb{iWe?`=K>_COMs*S{^3U48#rXO9q;1c7n)*tok`)x&%25F zCEmc1Y&--XC=RIuf_jl>q=y`2WJlQ4-ZQcmNIx36^8YaM3d2J$mtPe;B1X3HjEpok z@<4G&9bn{UlcDmEgNz&sn+AJEP6RTZMm}ovntD=?Za*8Icb#Ypg~BKUt*x3o1$Gzq zFa+bPa2fu1oRFvMwL$<)sUTE!5Cs}n@IY}$HB|6$UI=qmYEP-X2!FZo%|w>d0o|D* z@v#KdnE-!*5%y}OuYNrw2YCVL2&~AEaQ^qVz{Zt-IxWaTqV=>&5Lwp+US4iq5p=g%tmrm2lmhl zK(7SIEF-LE8C*;|65wJ74q9JHQTUQS1F_iDb(!oBxZV?XYFstiam-f9|knzK=6aio?Zp{ zG9XmP@eDt21R01*xST!xT%coStcjVHyqX>;{c}M>$jIoj$YiHHZ-B2Cz-i*S-;7ydT%+!Y0+scWJiR&5>R+8QE8ws;Ylka35FbK2faO)#s_Kk#D zZ&=m^a0K58`KCJ~?*xzx{MJ{Z`gcNH9Q19m4y{__pmI8>tI6I+(Qk|8Dz*};=K$m? zb`=obR!N-I8ENGq2RZHzh~5Se$8lYL8^Ax?=rwg*H&!XV&hX-JNyceBYGD-af1g6v z`BMB)d!}~4$c!Jh;0c5H;ma~s`ehXK450ON)Z_;6q|$p$rF%B6^Z=8WkD_~ZrT0UX zizHHM?v>$^gH(EkkyajZP^GzekO1gt0a6a|FEo08SLwBe$9q>(Y1DQl;^q^n?Y=V( ztnDp@rna9{u(rKXLKi^mV^M{*;7M&iGqtU3T-zT_UOtL`rfWL^s^b7s+j&6d0Hn4_ zueKg?P;JkF=n8<;_6i`E0sN(ZTic$jM%rt;rnNm9-hNwZTW78@=VjWqEuJGv+rBM# zthb_s>jAL`sMAN98zh&zWORK;Mpr-F=L3YUGx>RQj%`K8KOY(YlpFuFVHfbEeIDYe zeWZQGLkDsJ;;RxMX@K}@iz!EW$U(m1u>f4k6JPNYmWKoUPZ_ zpNDvAZ|DZtge-3dNCP|uf9dB{Nx@ESy40Z0RU4&+mSf4I^6y9UTNJT|}- z*!{N+P;7+Q0B0H@Jc`NjYQP4#s%`ngKO^3x;{~v4)lzyFG#+93$y_i(l9K#JDbcIp&qW3DOiqD@lK7YmdT&5HUN^#0DZ7a1PCb`Q+cBi|@1$FqiRdsZ`e$2V!WQJ}*<$taAr z{9hUd70@?0olSm+(O{eSagP~`8m<+erHvoA$u;u~Sb7Se_4x?Hm%tN8Z8whEWgI0J z$j?k(K8kMF0l6NkR|6ys?D4YRiQLiJFI6Gekaz=m&t-r=tqnz?0fOY-+osacwX2YD>|Fb#1d# zFc2WMO#w*)^!Rrs`!HHyi$M;mZAXZ<2S{yef%F6TpE^_PHLa~oJJVjI9gkM@t=qh; z8Sl|GXBBcj50J@00u3sU;HFf%!p23LA-+;*-K};|%@}F#wr|{5?{?p4jnL{da zJU4N2@)w+>eSE;|u%=N%6kyCV4Uu!LNsmLhYbKqIfkoR3Ovzld9VX0C_E{0D^Q9*J zquyxa|Kt=)le)I$WynfYqnKxy4-mLhP3S;|1^Pp{Q<6-MS>4gWb zpH`ael!qK-;$&Df$un^QkW*=5-~YqJqYp4K-p-hKx-oH8V-pXQKK(!wXLu%h$U!D9 zgGEa{6E6X>mL@LzTNCxjTChTUxS#%K+3n5cUD&uEbU$kyVnD{Geu%zGbrAD`Fj{)FDCR@ z&_nF^A8nXT2UTxrH}szIL?=_*?WnC>N0ysavPF&K-IMlvh^Mx^K&~TOVa~$)8r$wk`#i)` zTcK_L3&s5b5Zhxd@yrMywpW^Rl!qK-dnrU)1H|^8K)M6`eT|;iF1oMQ(CE;yhUZNh zx_30TpKWZP(b#rR+UFsj+S%In!%$p*fY?3;$S8o=KF^e+JmetTXF_y3Kx|(E&3NCBPmH;!+^%NDKjS1CR|Q`hwU5R^}-XpQR5z+5r z%s{-HvpfVBGF`;wDrYonaxJ93gzo2nz#WZL0-lP|u(EO1t-Tcz`yu)r0Iqv%x#sev zAzo4CkTTw-V(Rn!S(?WuDHot9@|Pj~1C!3nH4n|q=mj$`ELk~sL6SedE%c=pa@K8G zmc{$p-ncsduOlKmKWG&B9#W1M{&5r)$8hBpb(G{~<#-`ResyEM7`lGBm|&4R@*wVw zhRc_uW*9E3moS469|xh9y6~%VQ;ZKIv$Edu`H>(QHg~o?@na*LSom#db^M z5feZ%JytS37UXC^&h18-Z=&4*HMUA%kd^+_r2h`HeW4jC2VZE8ErnDYULba*nA(U)?=?VHdzG| z4STl7YH}#V1{2hLjM&90SZajVd%|DmW9-0BLf5+shcHhgD7e~4@A9PgHI|MT6Z8|x zf(MN7PoD7C(MDN&>mEkU{5w7%v(~ZsWmXwSc|1`oAJmI#Dg}n!z#*9ae@M=%Es z!o3@W<>rP@qEGzZNJ*^*Hb?}0-s5APofU710mCU#oO}7ZVs6hjq(L_qf*Y|xw3|gw z$Sr+*59Q+`&%4ZQ5s9l76lulxrk!TW?N9kQSG@e^s&T-1UQzy)exaK&A)l*8V73;5 z>qQ{C^G(Ejo{HedsR+WkCtrvXA$TeRI30!HsR(|YittVVIy@BtL~9{R>PDLPE$WswO$m=kLRV*K;B8U)AMeyTP1TJh9 z@>B#6QQlz{@>B#rPDS9vcN$Mc@Z(g3>4Q;bVMiqSaVi4ktigpm6~T{F5tt!-%B1&e$Oxw)=!|$8g8vW^E$r?&4rd`Wh~g{+Ey}YHuy>l~9i9=zNeB(1 zI0-?Ea$l^!Qp}s05v^2dZ641-@K;DiXJ@!L1wnIp3WC2xxEnIu5>J!U}zMtXZ`~#gc&p+_zitc|iT%3L&+##~*@eei)XLA)2!+#X9wiVK{f5@%5 z6<>VE_8h5LJnX+5rM-`&pQY0({^rN_!iR~d#NbqO>sG_?eU^_Kfb4cUU z27rD;KzNdV51}}JHjdccMwRK1+L*@MY5@Cq5Dx&k4-i<`NI&~PeIJh5wJ(9hV-S6m zx+_7v0OUCU_OwPDX**28@8lQ~(d?_v;6Kb1G2fC4{>|nJfK9|acf#JKxYeT-q-CT7 z-GVL}T*z}LY@9nmHiUWZgng^J88~aJg>mi#g1s2fu+*@T8 z@!W~9KFmdjLFo*EmiSQnlaUz&KS^MxFJvP?z+==i5{6c$ersz18|FyGsK#heI~XEx>ti6;uJQR)qB0lb_tSNYpsiW6A4+4~d+PXfBD_B3A}Pwnjc~or>e6!H8&Z<3-5U4} zEd@Wb68LQ`q_$_kL*ctyNV=k__ZJEN6y>)ROErh4fp63JpSWCwcW9Xx5s%@=by;(; zW*dI06?KCz!jPIL@CRO=A4NnmA$m?nNW7iPQrj@$CxFzzXH|M1CSHQJcFc!~DTwcA z;Tnt&6EnAf^8|(xe3+O-#4#TxCXsY@z-#z0F^RNeK1@ua+~HS2@L^&Sm5%u^F^Qgz z`7kkwS|^G=f)5ju804Id{(%n@lNjlk4-=CZ>zEG{Uk*F#9P?q~Ye39!%!i3-^*rZ! zT0J2K#mU+PX}?fGXsC|VdCqN+c{2KLTIS*4ae3#7}_O;Fu2+)0~aY$E?r9AbY`P=SuWOe3*DR zh%FAEM&ZN6v~7pOm+ZgsAyM@f}DAvcYS<#h+yf1Z(WdJmOJ)!8(6( z6tRt+>j>6(cH#u$mqR9z6B|mL`;D8W@)x2SL&`CJ_g-G$4~_&PouwcI)kVV zGDzAu>zQ>|$-3Nm9fM6#P3~9VR64VZK=h5yMQwXJ-@%-sLn4bo)H=VywM9b`big2I zCkBn8p+byxnv*k3h#AhG7!-<*D_{*4S#9Vw7x5-;!0`o93}!771;?SR=)yL@3sQ54 zAKeakGFeA_2`bbgm87N74rsm>g)($UpF(P~6f%T#;?6?4jf7sf9GE+a+F z0}!p&-_ov}hJ4cLK;T=XImg49=^UxC<>bR<>5vc+Ysk~!&ypS4w5ID$6$qeVWJh*V zc4Q}IM|SdhaO;wL&^eZu=pET5dPjE29vduGqIYDM=pET5dPjDN-jQ9RcVw679oZ#% zM|R5Fk)85(WT(6x*(q;FcFNn4o$_{Mr@S56DQ`!1%G;5h@^)mWydBvoZ%1|t7V;NK zVRYaxok9%oS37Yuh9;asv3ya9-jQ8mc4SxN!x6s2DKts89Ct+|MJCCXW1`7PvgKG( ztMzwegX}>yy`fjeN8KeORUW+=U5OZL9Z0@|;98-MM#}7;5sz(>*%tsW%`XF_Ou@c;=GE>WhplEBQMMOCn{FjJCEJRv3f^J53#?d z%ze1}m-f$*@Nx<<9+Vy`gyZ~(a!U`3vRr)YJW_guU5I|HGacMG(;+%jtuWM6NSBVV zr)3myjBkS#M;nC+sB7slQe41!1|70=RQ@3li#Tggx6;uw_DSZ~+EIl!sMVBsM0n_tVuwixCp9F`Sfv9oN2!QH9CkWxA)aWS)TKA@d*wb7JWU{_P-pJ^nYW-@gU zF{P)QicO|Li}DYFvTKc)SK7s24~5c)%JHXLmf-(r1-wtz<#2WB)0jDy4#;8yj+}Jr z0;_ab78|PcJXUv17Tch718tb8>)V3a&&y)XN_i@9=^0rxT2H(-0h95m5Tki%o8Zr& zom0@mOUq=qw45hMlndcFEf8L%?Su%(s9IVngzLQC37o}2RyATp7c)+l_?dfj4BDh@ zP^2!)vPJ~jw)9uwT3$L3Lr>e1sE_y#jB{<<1cw5*Dh|hA8OwZvNgIe&LF!dL0okkC z76vW>;hc?uux*(?4BT?w#30wUQ=|^P38ukcZL7qzRnA&m3fgvcuZGxKYsg6aJ6i>> z#J^~55-z_s(GL1Uu0z5xeulaGLDsS8#}nm@o1~m^law=Vl5)mPQqH(ZHixb%(P!M0 z=re9gx*%38yF{OHQ^Fl1R-iwRw6-X7JLecb==QC!>@)1a>xnsOD$?dAWV;0&TEMM@^*?uz=aLM2+=R2A+NVQhjJK=04F<2dg=K95by*-E_QfRqy z4?)0|4;89|a-XFQM=A%gT&dhW^y5*AcNtxks}RlQqZC`PC%!&MYP3+b%Dsx-8za;p zr57EmU3TYt*5B@kesL7 zS~}ze;Vn|`we;_FwE?{4%KaMAUp_;4tCSl>tCi0by|u8D4R(_7u2SxL*8OCm>Xq9C z{jYqkYKu77pj;OtL-{=6ZB*_8w(TkEF_f@bxnI%FQ-!xhx# zl6S69U2XR+TD?-Jp0?YKK08mSKDIlB?RUOVwYFPDJ68!cz;>^sEf)wi$aaJD?rNci z*=}D3-GxGpwB2>=Y!?YN%689Vo)-%>)^>j+^$(%O+wO5JeT`6cwtFi*u~w+5w);6_ zVx4r08MfP+HM&H+G!Gx_qGgwguNT?wT(<2-iGq!&A0y;8k=$&%E?ebxq3(w#I6!Pt zucI}$paj<8PT}pa-Lq)RT|zx+yJxfg?h(mdwmX$Ec(3qYv0Z-qtNcEp-mu;2^vgqP zH}c$VyTy!xi8_8RsN{@9(t8NcONa=F1(&TcQ)Jh zF`@eS+!SMCr}`O^wLW)02a?ByH^}FXX8(Ias9`?0fJa_rr zH`ulxNqK`D_eGZQvE(w$ai3;neImJxbllVE!A})$Lzg@51N82fB5C>EuUNuYA{p?z z%h_W8lK$7z?|#kx{;g1b{BD{x`c9}?zq^bvxL^9%AiukpdH$d{lN#xFSFjF03N_a6 zPGvj%q<%)$b$%Qm zK^+c3eGvtbjN>92;vsD=sC-aqtAhXZB~>uVI#`d=f-JI(d(m(RwvQ=Q7s18lZZ8$N z5K7vbK25AKl(EK8#u`u!)_}N~))Y_13FaVpX@)TyGR6p|jcJF(AWJM``EFn3V~RdL z&h4)vT~Q%z49`C0o7m(h$E4QaSbSOP4Tp;mWu=Am}7Z}2gtcNK#o)g ztAhKawbumGhCW0?X-yfA=)s}nKBnj+5Ytupt(x8shRAuNt81&uaRrq13^|UJ12*od=#zf&(YAGq$1qsr|UDhNqr1u>SHKVA5abT z0WlhRn3w=1F%jBk|;D5E*CVJCwn@*n zlbhIPC}W$UjBTJAYy(k70;WA@SS4GHW>NS7~|sXr2fEToJ@y4R!rAgWY*mVYDa4@#GR zbCdE7Wy&{{DIZir`5;_OTUdYmGxaBC>d*37NEwTCZ$bT8ei`B_?cR?1LsXZ)sY&^U zGUXe}ln<(*d=MAu^3TtdFPN!65`!$Hj77S4qW&Q2;+WmwhUZ=tnTKR;!2L}OFqARC zP{sgI4F-T%jXaW}f!$ERgDRhQ(&=JsG;kkQLEiF}hu&h_Z&P`^Qym*}b3r|-+;yN9 zg`_iX*PZdI5O;96kEt+c2)m{nj}Es(h1Nkmpr-UgF*{W#iVBpgDco-IxXR;0vq9*6 zD?w`S3ue3zW{@>3V};!(;C-Z2oyobK`z+=^VCl*~-=y+}GL<)!sXVBL%7aK^u9XbA z9Q?gH|*-XP=Yo)&Dvkt5@q%PNp zow|?dSYArrh+?eNR;aO*IFxest7DMxno9X&RFMp9N0Rdhva3i%u2;yz z`8RT^C=?>#IPgwIix~HKMw}NgY*rKtk#s&q?iDSCNIOp>w~BP^Qizp1w;)6+S_x6< z?8kMfq9TvaR(m?v!?22Wl69?fG(1<)UWh@?$E`qg5Mrd0PYXImXxdn-4Xxt4^|C_f zvyRDTBehHVzCl`Q9%2-Jv`Q{V0P``@Noc1?`=UTE-1qdyRiS;c%;+qK&;8rCba^}M zIQQcs*FG&opg&)CYu`!;*LgY$PKl^T^b@xs$mv{tvQSk^}mO2BiC}!JeXPB)k)v?(3D7eX9sFX@x3>n)x z;aICjcH$W%2iIVRe!{WCte)Aaw@J5%lOAQ&WT*J{cJOx4-8P{qRsZZbgFooIe>R+l zU$+Z-AbFsdyxAm|4Mq@lDpUpR6w$*Fi=9hSe2`PQ5$;TP?h{y;hP$|6*ST+S6c|>2 zzU$GspAdomr=B?9>U>C$p9zULCnF*{*9wuuA}Rb`+j(%HC0f?m3%_+98ju{Ez32s< zj|}vIQo!kgw(dM4nnF3Q^E^VL^Vk5-w~RQO5Z0ZK3nW3roUX{F^YNk+caA18UUI_& zH;f{kCkT;tLL?>zXb<9$g-#Yur4xh$I!~1hdOAUtbCM8!td+{eoiAQAtPCupty|Hm zm0fa(Th8Z*|H|${^mkq<15qQy+0Ho#`O4lxJmH=JcUATi!cp#j5$2VL355f=;#Pg19btC~ z`YP)bQ?1~GAV)=-1%d-$RA>-|l7Xxj5EPc&*Qn-!=y4zdp=Z!(R7z99&^Kr?Rj8?) zP&q@VNK>KE8O)_P5IF>TIO6z1B75{gf^RQrIRL2C-?5RmSMQ=Ze9 zRH}{v-%*eo6{rdXugTcf#n@(*UBz6x27G5zDAFqsdJYJ0eiUBRkb3|Y(I*giA4MS3 zD`;@vfd5vA1zBvHZ-5cRxsD}f$=e(Xq9(C|tEKu9z(AMjfSD6es)FmMnyqg;(xAna zm5(7*166GTT%zoc+r=vHfduastJ;R=AUnt5;jLBWLS$LNUesnel`GS5UG=B{mnI!* zRFBbPh4iTEVa_SZ2Oen}nNRU^*Hf)4Klq4!)tJ{sh)vS}DDB_|L;U!6G?WK{Ca`C8coplaa$uHqamCQvZcJgfmzmt3q zDYeN9kg~jFJN{xo|1X2vF1Z(@0t7lEF_3HzFGfnfKP^e4&HB`Ex6-wF!0Y2 zBH+}gLCh7xbw0$%>pw+^h_e&<`cD-i?mR|fz7R?0JrWCqC~_2>;Xf^(C8n)5U69>O zpy%tWBOYbplI7p!FknXn?2~*~f;n>TG`u)@a)@Jp>7j6+Jxg$Fgk#V1HHQ(UJ@Cgq zC7wcdrEf#mJ~hOPL+N#0fzJ=|a!~pcva%QG^cr*}d!fb)se78n?_v7s8vlvui!|N~ z4P~F9@r#(xnSxs*lJ-(xZ(49UCC<_%HAB4G%R)@I+R*Buz$9L6tFjp?P-{;O@Ldz< zbzDa5X#u`oVL7}xx2FrCoEn6hJtIiVZH^oE%wQ#OXX?T-#E&xrEoaY>YiLBKANJfJ zYn+@)j}9_6-5Pj^})f!Oy-)^epEj=6JIZj;`S? zLIj*$jJR8caGjCpz4k^SA`bWE*tZE`3cfwaoRbc>v)gwRv0ciYR_LqtrXu=#q}7IP zdI5yQB%f8a4apI;IUKkjiF(w$CoDH^(W)EB$M5usL)S)ItQ_lBB- zGt@efTd8tNH9jAcpkS5Y=^qhm-F9YEYZ&t&qGuqh6wl4*_f*y-rgsg1k*>oC+rG}_ zCGSk8X0EYT_cOujUZaF}1$iI%@Mk?RE64?=8YZS`P1)E2K8NS4LplReR=NlwSN4kN zzeSe(VF6Z<%lb8>(|jIZ_JasnK()S~SQvk-AfMCMkQ3x{_nI7F=_Cg0vgbsn9cane zN`HupXW3VhI)tfGl@Y|=LqWJwvrKZ*ub?T*UKGi>p1z1%>EkgHlszM?l^)CLz5)F} zwXjpn@)jmb-kDOY?%$)+_h@g6-s2eoscZNBh}a$vXg|I~9-o9--7iB)D%X}bTYq9Q z$A4`__cicbdOO{b&Ei+ETZV+3qJR`AuHtd)-A`rYen39P%BDt{!po*+pK zZ#@E)*>9sXex)G20)uaFeB25(`ikO2#1pz&>6dz8ax+cJjG=gKUoA9!4S)EB2P?Rg z?MRvQuc%X~NObyBhci9j^Jpurjb4u(i>)xcg<86lWt~s@pMrI0giy*I0qZFEkAnrR z^w(&ZKKDq8x05ek>juj%*n?igsRQOi9938lCO&%MDqh`ZM(4eoeuOMN~ z%|-jh=J=LSRPJ!n15l%mog{C59=ws7khdVs3i6e{Am7^?eKTB~^LDfz|1JjSWva-S z@d&uurZI0}kbd0W0`{0*2+PMb+8=GS&ECY+@u=U!f~L3R;Rx4M4#v82tV>j!Py53THQavB{#?KlYVzD1;h_yY$UI?EqJ!O zA4c~$%!#ssw^D)#8lSfTeTRvw9%pjKOso6O8mLS&{ogAU?>yoXS9z3Ze8*J&!MEpH zp%A+a8fPl0c>=D{HRr3By3%vng)x&U&E-Inu7^hdD#_N{aIj+t1gA$Sc8bT9-jNAtQGA{T^J@Ld|4_!E)6x`ch1g7}(U zj@@P@+eUGx#U5R`eau^bO19DfQYH?$$vTiL9 zkq*a0#J&NnlOQtBOEeBAD9Pk`7)6mknoJqpAlKprG9un}Qptua|`osKgswH>xTvwa!f zp8JpCzB5$};ofk>8>do5x1b}an-Xgu(giQ@45(j-pwJC;QzDlQv>Tn0IWMLLZ%gd%Z_YerrxTATNyR3AD=`T(MPsB4Sh*=p2xgi^}SDsn_lDCyf3Dz;>xm zq{uJ9#UusL?NXm;#eOps2?GJTU9QvZG8YNc0n#o3>@nG3b|$~^D7nj0Fzj_B{l6RLkGQ~cTwFJjr-Q*Qftw76*I56{O~ta-4a#c0 z4`;CBR5#`s@R<>;(?_6!EpYiNSOm_D#D*`WOzRB&55Btsnd=TRL;LO|7&;9=-_6jz zJ0Ii;f?V<6m?2MmLhKk=SFgKTb+#4_Kdi)PNBz6O85?ig54Xe`yq5M z!0rU%2_QSE)!B#s9Wa$s87vd_rzd=N3y8c1VJ?!}5fGmO`3T^bjV;J!)f_rc&h!A) z<4_E_qZ8G%p#E9RZ**-(C!&lLyDg4{gEDJ7I?;-e(hW%+0p)X%Ie+c+KPwL9Sg;H7 znVgVW%S=d}2=HHEB-g(xC99rj3g43D+3-UJSOW|j-I7++C4BcIEBiwv5w(H+DFAlCtM$Aj>4u;tKbRT%YM&m2wz>u$*0Nu`+}xGQKIAUqBQWv@WWtDv3- zz{&|A`FlY7M~=?%mzl&%c8TedSg^kxW{3&vOD%ta{s;FxjvF8CzP^bV-B(eL{TTqd zuWzCa`A32r#N-%E=!gUzAV=r`nG4QrfDRDHl%TA?nxXhZ6223lAOUg~gq8p#KrRMy zp=dEcPS0qS(4E5*zB{SKz~KAL*HDXraR-pw0RAOL!2|}zLnID2iJmu@803@X9{bQW zJ0xzUMfKnH_G;WAAqyx^Bf~8K*0@8Wlr;`vX7C4+T7M3e8Yt)>>8gWd7`Q_K{@-V6 zKQ;-H`Cnz3Ai3)c%|-*VSgXBCQX9FZiyc}#fik(67 zBy(Vp)I;VPDltg7Zgv|W%oE!sNcco}3jkI=W6WsmmbTxU#3ntf;8+YPiA4HyZTA_* zd{w`w}Zb3@L3{JOg7{~%?{X+e#7u+=K(nv5T=-f$km`O1;E1W&$NY&L&Pe0tOvgG9p7Lawp5G2 zHEj>^T(d7O7w7%R`&N>J8Rdh_eJuL>nd z%=`;NdjS$Ne*pQF1Y;(J+i1Q$BQfLU;IkGm2gFPvbKtPj6EZwuPh#c>AOitmib>2I z4{8(u_f&D?E)z5Qo+@jtF^>0PBamsvQ}%qg_(8+na=2y9Y0T9w_U!r=eJi8rn@<-P z4aZ=n9*Cz+yN;y|_^JBK`+M$vKu6>Kux}F}r(LP2NLT#`32!n{?$jQLx5u=_3U@+F z1M<-j55;rY5FJ340m=_I1+|c3ur!2Xbfaw3jdCQUh5@q17|AW?Vs#Eu+H%W(f=Mr) z>!o4-$LU;_mp8|l1x7<=^fo$K+eJpNgN{LcklCnge7z&5Tp`ek9^o|qrue?sv}p;Y z|Ev1^!#r2q6qifeB-l3&ki%EEpi)YS#Yi}viTb8BUQJhAiG)i5bj2;&759O>8xX!D z=2iVRUG+DS`YK@hpD$vX2kxEm;4g<_OLpibh%+HO35;*?eghcR8bqH;{CNkg+aZ`; z1)>K=TkZqN?h9fJ5WZWPJp=^bj+sSbG>8j;tRyi7#En3%2Mk*Mx~Vj7XgD&p;CjLr zCK00%3R2eu{jz?r4GLQTvVQO>kPk?3{UC{{cQZiXccaDlXMS#Q>1CfVTG7++(Z2Dt;WS*pZy(@A#$w$` zCLxD$CSxd&&%OPp0m`Qs^)h2u8cclwKQ}J-1lK_7DuB6w8*ydv1$4DE?i&LI8Qr-` zcPl_f_boskq?W#bXS7xsEM$sPtK<5f;28)%MQx7kyMep`@Lz1i54eEyHN+mf@n=?i zom{{kF`U7X{EYo#MrOEvOGjyiHSqDN79S9R3H4e~%v$rKiT3O9mn?7;B%+`29{7C?5#ic-ae!PE$5jL%; z!?y*ej!q_^d?_jS&t#pM(f;$AzdOx^B$(6N&vbgNCJ{6pK0RM=;iHg8k zUs%;`=36B=W>GFsojKLNbq}qCaTzS66D-vR4&tb>3OSw!kYKqQh`eCJV7Ujxoq$3v zAKbb}EBYE?I)#Dr8Elonc?R-N0VHtV0`dkxV&-!op8_oZy(X(BA=83|%rhKiJqrh@ zA~>IO#2=w13!{uiAI2C32vbCI<_dQNfM3Dg#ki5q-=VLn)_Ic1wwW^2YnwmvCGgrp zfvc%(n?Lf4$v+C@V1V30JZZ8}7I%NCzw&)shoD-Fg@urr50F?m7YGjz)VC0cJ-S3? zd03ujLOAY=q7VtnOQEoiIq*Vr1CR{>e+#4R1?3W`X62d0Hb-ORf_`S2%9zdSX}EOd z5gD%KA7IkC4BJQpD-6LXW@bGuZjX^Xzcp)Cf6H*sH6P~7-PL0-=57F8^I?8Vx+a17 zLpC6{{|G#!HLh{2Ud-T|eBTwrP?saY;!5Ng%AEn?v>B)Xe##n8x#{`7KarJv9#|_N zvlI|mY-GN81A@8Z!8*^R*w!3s&CCytM($w}*|Wf34>hi_Wvw-W3p!xvg$U~DcdbAG zxu#7A;iG?$w;IX)&q3`ML-2-Sg;vAO8fMDAC2O-SzhzV#H-fCd4ao$=a@zHCzOM%y zCtc`1m~#(6y3kWVc9LKh`UJ@P02yz+9DLSV=74U~ia9XC`3U|`Dlx*tAb3z#m|_y) zC7|R{oYi)TF~f8oa~JgBhpeb&y?Z1sz{s>wo1@BJ!EYmm<{!kp(d77R9fGn67xP^I z9fsT3A4T2EP{f1zo8OT_EuLV*pQ>m1`a=Jpj-|6<`2s-X^hwl6^C8w7pdSb5`+*1Z z%Yj=RYB1shct5Zu-(}E^1UUc@<8~_bNWN^Kx*G{=09jwZD`iTR2ccM2nV%)WCojNV z`JU#o+e|x%yVh{&kaG{>t~Xp(=7s~g170@V>t4Z`kD6=ln6hxk6eus^!flQfu>$wM zuWgVe^iyuH#+5YxPiW}*`zAdOwL*P2>G8*EHWsr*by~iUy-Z7;mhWADR=3OB{={`j+*=e z-jhrKc^p7Dc1?b<6pw_3fPqsMPP2OF2bhs>-P)!3bEo09w2!vwatN#gZ=p) zLc;BU@>&z|EsQm@kwyNAr&+3hev40lbKUZBfPb_R{1S;?w>VlZ__?>dg)!BzeO3-# z+&4e>2?*LRg7rGoUj^7ZL3|11Q$X_vK=`{FExv!jkmKzdTD_&hXtT=jq}k<-dfLOe zy;ZENAoqe4wZb2j%HLrkqyzN$Q}v8j-GNftrJ+7JDIMkJNCc$vaZ|B7!?$QKZ(>u_3}LSV`Fk$Z1?55)Rsdq+&m0|9#~@)SAfNsW>9pmbmjJ{Kp^Ho*)&({SkLCNGMOos8s~~e3 zK-};kkWBzsG&VZKqsYG-H>aw-u?PzTZ&LZ% zZCV~pB)<=lX^gv$)VDDiA6B5arGVI-4DkK21YgZtkAy1$S$7+CzQ^|jRN0dH-G@MD z%m23F4${V$_FIO6TD*(CGv2Um>s{EVzK(_LpOE|jGQJ03?*;KTkmmvL{sIKow5?*L zWm^wX<2Uu<`{0FdCfM^M%Il#)QFdDRB3S<#Me)s9HRbpkWHY{F1&lDEl zE5K-N()n~W>n%g@ns{?Yh&>&viUYcuD)5@PU329+oHfKS_!8q=Mr|4LUbG!X;ny%E z`~X^*Trq*J`8NlGUI+iB?0+1^JGHJcv zWT7k`Uai*0eDfe8lh!*Sa|b{st=oV+0?@(jdk2{O?x)s2W4>Fc#XkOGEk5Q5kl_9o zkdFcS4mxSHe3plWz~WEc5Yy`^@&1S)fJ}2sfwThnTNp(%qtG)LE0|7V`aZEGZb)La zrW%uVejFB$^*pgECQI6fA}6kW(i5v}qqASVK3wsx$^!m$>!PM5@dpO1kdyy3YB zGOGbLmr1Szat#U2)*b|MFF$5A7gvqp?Ka8kk}prp~m;>j}w@!`4`L?oe-Hx-e z?l3ZZYxrig0Q>n;^o|Ej`Y5D7+9-XeN#~oLnC-ws z0sN?(xt@Y+74n|^c~e!D!QcV;smU?lF|b@hyyIb*eE=lH`vB<$&>`O36oLsQ8*_Th zcLB8+;=>^{m|DDy%>{CTXmLrQi_!8~$5CrW%=bFA_z>uG2z^Q|-ogC`$oBw$Z==w7 zvOFNMTidz;UiljOs2^$;@Pb^wV8LxcJ>u0E&|-haAX9(*c&{^4U^GuUn8YcO**6D`G$1=3X}dn8kWlwFTJ7dQyC0XP5G(bG2a!( z!@umYI|g8!1xSy51;|Sz*keBe@&Q1vXPMl5R-Da+9=n1$u*ZH2nQy4X9{UH7-vD8X zNso;Tgl_?8!vB~|Oplf4c!lh+zZ*sah9;Ar>J#(rW=ZU{Q<2RSfOOi0Ku%%4g}n8A z@=YV3!7{Zii-ksvgVLW6dk6{-0J3%)dA^$63Ea$OR#oGAh6g+TZyHH7aJ$M})CwSr zV~haXW_l(IyryN+*)|vGbo~~kOtui7S*I8Y_SsuRqERT^(}?+^$u{^GJ1+0QaH*Bs z@T?z=7$fF$BZkXi))A&Z^A_Aeoa?ZJx^KxV0V`{SVY3$%W!P5WM3XL8=%t3BeZ!1U zBNN!et}!Cg!wSL}Gk%ZOnpP~;O@WT~Zl_PLevA+d}*sg>{$h%`kLdf$7vo(ew^o`boA4hDG~%OZ8I9oEw8sHjugJyR0TVpE7W!3G9+6xK&iQ~A5roiPrT}GK4Oz86 z8nnA1`DXC{39#FN*a>7Si54LK4din`?s5=sXSDC3_BlEJI7+i`2CE1Q#BnYXUjw2) zkiH}?1~CQ5ctDss*_)BF8r0c<>}?<(2eKW|{uvNYQe+p9?~w8iMcxE4Y!F6lK=vmf zt_89NfM1LLpxws>$9>4Vv}r|--yVnLc7yS*BEUY982}js2va0`8d9c#sspq?6~w=p zIv>d8NVymwKbbd`?=X~g3UmJ$k3?8wF7`bD!TSJmQF$83>E!+BoT0ceg ztmi`ryh{yU8h!`zBOvQtBg~-w9+@NNW#;2Q)6}f#bg0Lp9nn0|ZxD~Feruf<9b0vX zb{~TMegH^UJa?`Sh3_4KboEc zvh|o|E6Zk;Uc-ZWlr4ksZ&3dkAcJuJP~2JoWDsrxBn^;3*vr9ZC71&S;VkCBLAV!W zdQypl@L(WZu?$m82I29b#sFYtOJhdkK{%ITFg|17q0IfQsBbZIXDB=Z)w=)^3VVTk z4hU0BLcuo-13ywE6vi=?q0k+v9RT>X+p}H%TWji&GiEyT(Q2U`I_>hau@r977lJ#= zUVv%+LgUONt?Kn>D@00^@5V1TIVH3*T9EeRSS%zPKa+}QxO{Z-Lc)ZYbi8$e=ty~zUGEnH+>AN4Jm z46iVjo#8+Toj@djL;+SVM~wKxra&CQ1+AN+p-WJ(j2aywR6#9{8Y6%lMuMZpl|a@2 zWYnn1>wVAL4G95`w`3z?l%;;8W-Am5VUs8MkwA{G#)j*J>3K@9`QsId^pDF7KY zPNoP)jq8wd5k)v^>;>{3362__MqrHvfZy>9mqm~0T20XZEN|F&1~QKUn#-`kkwU^^ z1xsL9d0NE;IxE2Jq_v z(q!9!JV=5~_63kV06oxWv~Q+1n(U7gAjc-l!^%w-K$@%zkj^C7WTSu_2?$e1nrsQE z1psNX`+;l*NRw@$2%GFHvJ%ImvBYePkp4$zVqUhH-(68s~U^)ou zbf3-|g?<5L20@+f({)H1320r0B8Q&njpwuVc)k&wTLAvah)DjLj^{hP@x0Uhnyv8O z5lWsF_5BN3$#}jM>JI^AJbx3&t0cOkD*pzu7a-%gmxIsBXAT(8-(n7@LC!ZC2>=<- zV?ZK+FvVm%F9p>S04s;zugz#Yo=a=5HVkFeGWU7#EXVS5pmsVyTKirgcLBl_k=A|z z)YAZI?csBEk`bPPs*0Np(}DjPV?2e}v^ zQ8M*roeNKA`+tPJ2bdJa*7)7svy(Q>Y>vQ^7g%!6OHe>Ef`XtfL81r>A}UEi1rwkm zf-7JE1rsKWS21HoF<=(23UWm;XZ`=qsp{E5e7~=s=gicJbt;Fh?#95ttiXemnAVaP zk$Dc#TJi~jj{vjAe9&sKF(FzfWCae1maH+qMd*-d$r>|$B25c$GGvYUlGO@0CyCaH zS%HqYt82``2n__Zew{+#Bp|rQD%kp^3zS-Sy+X52#6MjujUg}JgghUmv&70Skedly zFUX@HuM*e=#6&*456TZ$vHO<=u;%wE8&1@bF_p9RSR$ryt)5PaEc_xc!J zU7S0?8!XLFYNgJT4)A~kch`wVXG^!=Vw?;)*Gj6pWCaFH!?-M2dtq2Cfh?2~fRufnW#6(P6*DYWh0Q}!&-AHa-x^MbF z%V2w6tar-_EEemsO#KDbp8#E^hEKu@;AlP4Pl|yAoEJo^m#s&|2;>4fk*C- z@jyRfH|hQ{t`iAK#EhpMDmPqMKmOhWi6=_|noFch*=tSi=e{>n7kK%#q zgz!hn!XL$raKZTva6j%?H@k{ETyAx%)BTKiHLiCn8?)B017!D+$acr|MG?nA=nsVI zSOfD>`<*ELxpr$yKeU9?!|)8@XhLq6E%PM zB*snQ?22ojKaQwJ1C4*RvLfNn<(!UdTClQ6X<-V`qMFMEvtD_g~_FD>?qixFfK#B&=_hZTeD* zzhd1lfr#JX>t;^Onxt!k;KWD^TPx8BxbaVr}tst`q%m5Pubzj^)S#b{Gq$QXqSCZN#0p61T8xu>i=<5Msa(-#(S2&OrIY&zO{uI=%i& za&qMLFLmN2Vsc6qJL>@NL${JeAaZ5QwvvsE|<@9{iU4`@rg4bjDjg`Yv}La0jsZHd(cRsq@)zD(HOBerRYui=Zf z#BVLDg=4NKVc3?qX>ssx%RRCsY?7AfzG4(=TH*n0pDfNuOMHj8_xSN2*llE8CoM+& zw8WvvY5a#R%a6YojGFlWvfO`(fAbqj@kc(ig6d6VbrKeQVS*8~{V6-QjQ^73A)5l% zDHE^!cK1DA9|APDJD}VOh@>SYH*~KxDedk99R5eUd+=XkG=;qSS>ucAw3jGX#G}vC zD7BEsp)?w(>1O95G7fh58KSum))GJqcRhhsfEMo7gw2g&lfu2@EStIaSeBo;8(`FA z?h}^#FPZz~YsSx-!o45cUBnqF+*gVFML+&>o7t|jPvWO=E0EK|ZDm=0{Iy}!#NWem z|0VwYM-*=P^#Dqr0g*mdNRkR+H^+} zi=O5REdE8FN)A-^ZQumgy>2W#MLy7-hgL6NyhUC-ks;58G`5YBuLDWaevgH_oJ}Q? zM?}In=>jp~=%XU7!5RW#c~oREfpYM20NoO5y31H_oy}t5P-ZM57Gz7vJB>*wa=Ind6{I~-BwIo; zk=3oB$&gL~bSvl<0viCc=Px3%74$lkCq+cIf^sGk5Rl!wp#*vXTp81L)3-lwdn zmki54CaX10=L0A8!o*{i-O@-oKWB!E#zHR|!cXuc%atmdsIDkWZB1poV$7R)A=B?H zmTvLz&-2kc54_tY{Ir62FO=|dkdi6v&H!2f+nzI#xz0(*xD~P3>T^h^6u=B*#sgXa z*Alo&5GjBM3ETt3L`MtaeXw@`EeK~SHzGi^Am)jP6hvdF1%MXBGy*3JA_cLTz*>My z3!>Kx#;2fjx%kv6miDvwBn8o88awBJ7Q{dT{Qxb9EfS9u#AGOwfZ+Q7vmi9(ml3mE zuCr5OX%mYrC5JTSi%_2nXv((|*bJDeC$gI2U67suG{uJqdjHYjS;)vG_W>dcZNbY;K=zqQ;_?@i>ohfgPPbTc zMcHP#M^+R$b1W6bLnq^8+ToK{%ySM(`mc$HA3T>NPlxq4uKfx$I|szg#_9P48qHvq z2DJQvuKy7`G}MI3tuyW`nK4gBqv6O71-ufFi3DV8%F6^fi@-8uf*fOLi;xkRFdTXQy`TSJmI7q^3?JlqK6E(~u2nzaGBL=x1Nz)Mh` zl_+;ugTGc$W;ROGVe$&e&~uh6i|5x9TqiWprd7^nev_cf9W)M{1V>x0zjYn6Z^>wMF@Aclz&c1Kd;ygF@gR3!6LNki$0$0%abDmMF?#6_@iP-D5bS8>SK^$+ z744eVBl)DnNahOW-U)#D}E> zE)Ya~xQf6kKz+E8z(yc=+rRpd>Qpjr?s>{2`88s)nbY)3JEr}&h8C%3ZO9u3Bkhuq zrWaZyYe|iT2Q95(4J}f~Rsh|qx!mnrf%uMC78UI}fL$8P6EUvR-^c-XTx{oHMV)Tu51(Z* zW%h!`#q>;)JF3nf3+BmVkS(eX2dD~FP* zp|1y;4j5u=z5-uLpQat0W@$2O5?bQqgmcozRE!mtZ5x#{Di$dE6?)NE{De~&?(W9& zRzU9+%A+{u8ipV4N_zxoH~bd?y_X*omfj=$AEYk;RVQ%Zw7dVRv)|ssNV_?3$T`RhH%5C#vB8u7r+yrHtKb6iM{b@n{%6P z&Tm?}xu9tY6>}F|fcs8nKxUC99q(l7Lynq`k2CY+Q~`2zrEc%c3|x|s+nK4G<1Nf> zk7qKq*5b*)=1kHuTdfc^`bqOg#r!Xtrn=mksTK27+#3VLWF9MbEbh(Bmpc|qpe+LW zUuJDc`D?~?NyVA$U4GS!({*RRLq6+m_#M%)`R z^^*_pLD&sA1zlUS(9PUr&4v?Z59nRO(SP9^#=z}Ssec7~NTUDe#our%96NGt#{WRKx9 zE9p7ya>%AdnQ6|hg0hJqmrN5ARifa*2C|*qOg*85p4@}@g(eZMMC{kASeow*E4rfEb>In+Iem3kzz zP(H9+cj6f|x=3c36uC1sPVxMbu`{9ZONQy?3!uBdu(`;8-60ax*KdkPzh!9kbf&)B zkUQuZpCxp^&d@_!a&zwMj3T``*JW%eM@6*V9eavN>c~WjWf5bF|NV>-DgLJ@pT_`G z+8<`qch;FSQ$TNi*C$X1a6(m9 zU0&n43Pnmqj{*l$rv{zSd6p}6;V#3~Ee@S>hc2{SsS3{}xK8k@B%3m|nnOhS%V{F+ zbs2%55Hv+`U4}MBr{KDdbb}c=wr-plFxlZ&ORT2dmSkxEdJHai1Y~roW%B$A(4|0z ztU-HO6OJ=2huE5Agdbi`ie=sT95T-UI`7#_;B7%<-m{;;=Yq(*=NAG$05LJ3lb`If z=(mC3$=0|(0W(`Yl|87uPRX>lsX11_O@zWGC63!NBV0gF=$(sLD~z=OT3(W*6F5pI zy_c6gXDuRFKVbuTHrW_+6QPK2eQZXfDzQEhv7T7&F7D=A`4eu_Le)YjdH;6GJz>ZX zQK9v6PswPMdMSnuAT|Ueg8*Icv`pyuA+krW;PGDILy270J0~MQRwD0h<&RkJG`7S) zk^B)A+W`c9ld=x-JB5*Uf zzKgq(GOC`^r7%MWlgOQG$PK2L?2@7%ZpgAL5UNa~PfMbYPNH9sM4y*LUzbE*lSIEK ziGF_){e>j@o+SFdB>Hzr^k0+cnYQ@F|17#avRwUdnnZ6>LvJh_wsMI)Ic6s%WRO#O zeQikF(@z;=Bo3sQf4917wcnj?PuHGzBNb^KU`Cwn={n(f4#ML=`Ayb9k>_R6}K=@f7Y`6CYyStQGYr~ea}DC<>4=*Uebw{_nT$c zgz8vd+}G1%lQ9_i+lm}+0U`&PL@o7YxWbj{XDBlbmVf&(i@B=XVRTd9&2p4iO@Q0)O9j?-b;+$m5BX~yMF@S1t76GxCn&K zwaSrOF@&h!v@WuA85$NP(OobTkrk`;lB zp69H>mz+Bsr!Icf0=y82+$rq!fMQMH1~8{wDTz@CUdUkL#Df1(r4Rs zN{(SM)4m-|Gt=IZUSy7{)REUCyIay5$wxWek#%Ov^mj}807Zv81-+@=o6@U}TJr2q znA((HVoeP|*4>oeM!x^aL6$DhFezW3ek{=sJ4(OsD&Lj$={oV2BR2Cfa7}vUQNkk= z!q=qR6?h%_2BdpUx^DK!qZKoou?wEw%Ian$(!466du4h(>!>c+uS{=ac3GT)31zHR z(#ww0eL11KJiS)3?(+2JR=0~&%J~HS8d==xrzPV4GogQBx_^$S%QN(D3sk{5N)Kuxk{-EowkjOnWK7q@aB4!~>~vjhh{7T|vMH)idV*1)Z1r-hr8Z^j%5z$} zu4b0Z!5tvd#LDVRdb$j1M?bDM(kwkIVPk*7M!$4jn{Pn>TCq`RWktg2vbiZ+o@(Qr zQAQb~db!oo@f$xn7#r`Q|FYQl!pe#tkzbM!=L)w$8w$NVT~9^@=E~cw>*_Z>Ua?}S z3Hx&&C}UEq%%_iH=0A)hkv4o|7cX>`0-{Ser~5-x-bk*-@O*-s>zc)(WE{*wok5=c zYZ2Jx4I}teU2+|J2(qmhxm-o-%;lIV&_mvjAGusN4NnFi4$PZ7&xu@_E#Lg%0p7*O z%Jft%jVB%Cogi1{Fap!#3=*@0PQlGL;GE67lJPUVgpH^zBVEf za0^8GHmI9`Z25dhB*oRUXCFd%3#cVq<11`jo^vwFkyJO!TMRj49&y$% z204a6A0Q_3;me_n1RDXgTo1Cz+H(`3&Ndb9F}#g)Cn6J(9S?Z-gPcWRHc)gcNca_g zE(Ti$gx>>ML*Qzl=jR}gSlfBlV)zS)x52#$2)<^y$*Vz~vRUa))0s(}Z_9=IRg&E6 z19jKp$Z9w*Vq+KJT?Fzjfp-Ks7vuneFM!}ut9;zYR3pwTEWq-KV%2AOiBP_cG*TT{ zy4J??49RxWCw^{BEl1-v7M>H z3n0!1I$gBKarRn&nPwsunUmdW9i?y+oHdAC4d_QVZX<9L&~%@bFF{O_Ztt*CSbtg0 zh`olh5Wh5v0wx@CF%gw0=4M~vNAWxsp9VCFeFWYIn%1)N^EC={Bet!j9c6rI!uZ2t z{Os(5zVW}X^_y?J@LXCw&~%iQe=EuOjQ`8{B?;p%i1B&Z{U}S#oc7pi4XEcs2@C+5 zUSZ|iAjX7FZ!+BcFUCWCn1jeAk915n!a8|R;kb0j3CcXlXOqb()a;Nyzc(Uqr?qFU zl(JT)hPl#xr>xa+*Xez`&{uRqB=Aatxk49IxiSo-tjHIpb9PD-ka06<`EK>M)wY(V zj8n;rNzYV3M}d@ar7~&AJdXqe$If~ne zm|GZ|j@#Np_e7z)Sdboi2!TO@NDqAqfpI`gRJ4bl2_{Dtw1@6!O}dUB>R@8vBj2`% zUV!X*fcDUr5m*7#^w8IXtpl`&-bUayKzr!n)^?7ys6F(5;64ZhCt0rFLz`C=F_Dm~ z>1NAaL<*&$G5d}@U}^G(fxhk?Mp8PmZAK^>c+2m|`VOx$Z0Wn6Hf&jhJE1X_k@X7g zt;Trcxt4A_H5GQoy;ep(cYK-N%&l&;!LK77b*3QaB|ZeCCrjz5Q;U-pfC@-YmeNso ztoMLFD>UiJQaU#2gk!Df9g2Ztr%jsgq;%Gbb3OPKK>3;xNN^1_f6liz(1FRDMpJs| z)8g+V^e)gz9D2qIyUx!ziNtQCy#a6zB60xmx`X^h;15AsgXAn?I0u~IcB}0lzSHw3 zbAIvs=crJ?YJGsgSFlhx#|RWy{An*Q(803BDFHT zcN?(tyg^YZt6w(Ry%Z=aJQb%$0{WFSh;^hzKM&zQK>fKW4MZhJzkqwGr#IUEhVvtk z5u)C$x(gS$TxTP)-lbmF|2Fbp4_4d7j5L6k4{`#55kO4D!Y!c813Mk))CHtEVdfq& zb13@kM*c2>vjve`0PoynWG2WCsP_wJJjgo)-V$UK$d?2@7vwmQz!LTuK!UH^IPB(b zAa$EO7bnl7jFAnfruFXDlsNBhG);>p*T21``NO%>H`h`mCsP18+9o2$ScbI1$deY4 z`9j~xSBwI7*XQTn;($%UhB#w>_r3F@<5k&vZw2(&mept#Og97 zX7_YR*99a6(8)QHg+d$yVJMK%0K?bW&W-9xWZrBqIQ3@!d%(I8nKghX4`j8wkn#j# zA{HJ9Wj5GkAbcXo9RxNBG701-0$%_nGLn3eh`DQ1d(SY=Mk6-#6)M%J}CN(WL>Ft@{Hs~@RkC>RaGYXBRbB-=2_d&gO({nOb;TJ zI<*+zzqWK~Il;dyB8>%sXy8-7p|BQ{%JsAraGkEwIHq}FFCX%HqQ3?Ry=3`mFVS(- z#1i_<(&cp2V@dR)@s3`ytN3OTy{VIQiE#g7u9XI4i;W#?6;Kn7R|sJWV*Qg(I&w^}aP9@64ORD@48TT>WBwo_4|C z8;%o|&!gubUyRAUZs5^`$-S<=rz2Aq>2MlKZ(ebzHpqLfKF`QGANIn%Pu=3@LXzy# zi=_qM=kDBYa$$sP{@v;}}FLInN zKwL(4h!sMd17QkK{)>%?5k#*$H#5G>kt}$~EtN>OAax6nF=#8xm3xeo=lmh1{gfNt zh`cu$)&t1g2Y6#Zo+0oQ5EHTR94K#ry$(>p{ z-)kjZCp(pR-f+XE_@|Noh0Gs-MxJpo69*tBVj6jEuwsA;eTg+9k=tIBS?xf|ue3uc z25xfKpJF_jVI6X-W#`-E{Y|b8(><`&0SL(}GUbxmdf}FY#n3~RE}H9;=+F4_RMUGc zok>^dElZbH@?w(wCzdW}B@ZO%vT8xAaqv_VyFGkqZ{P3+;ZgP3X?F&{)|>I69L+{tb^Kcw^%+dA6Wg#qKvCi>QrWYC6S>NA zbt+I=P(~8FySqmll`G93vpA2cWOA~*t9#YkN&hWC=8|kvhpp z$0Q`w-y(8{^;6@YbZw1KvUI5zSD09G%pbl=Bi0>YxVj^$hs{75 z4q%6h4SM;!4ybk#97@VxR03Y#4M=-2U1)vNsnyj^qQ2WoI*B}4A$Sd4olQ6^-P`M< z^|vdm-FKVF_a}UiiK_0kcz^5s`5UroKVW7bt}&8#3AZqT*o#qr!kg*pgts}=W`It3 zTWvRHUFUt|yi7N1AL~(_@b*Ba3!oF;X#`FKVj`v!-X&m*0G;r5OPKje%p8h7Dpq8| zyAqKr0G;qA5Sj2M5Sj39MC1k$lL_zL1nv|>CcHZdJPrg;vvDLEL}J1_TI#!*^=`I8 zuMxlPp87xFJI4S`;bUrzrO0B#NXdD=Tbf2}9?M_v|CZyye(CH3GN;$=2XDXbZsqEL zw7*Qoqxm|LeJOHI?^9%T@`mb2qaPt-%Nshh} zXWA6#(~oP0%sXmo-e9$xUkino)b69=OG<0O%hZ5&H!t-Px)YT?C;t+L%iw6weIJt6 zIS}>R$$zdbtf5{&ZWtQYP&=Y`uOg0Mxh}%$GRZUCa-*n=Fqq~g4%2JVF$SM=8!|r7 ze5s(?e4%J8A5&Vd0lEl-sM*wMIfEsTeGj8VaF?s=%ykeh0_u0e(tq!=6*c&}si?og z`9`>N;qJnv?57)``=ML>D$S!}1(RYRSa_dg5rgM{OkwIXJ+cI=o2cvKWBT=RODyW!t1 z3NqDvmB5RF$W-%x1oi_lk=NI9gf3;J1?ZG>w@_uunFl2Y2)3MHQgg(V(|^5-ldWJJ;dD9+VK)0<`{ZmGu3O4 z$QNkJp(d{hh<6!GAh^>iCd%bi<_$Wj*+jHX{>OC?TIdG)(+QeJzR=9vb(#&Qk#uW$ z%&UWo-JH!#gep#ucDKaM5tWKY^*}B#4Y*=sTaXJ4(n2To!L_FKQW4vhkqM|Yr?=vr zK;5qu;WIT?mnI@V)74wu6~}gjImgWvjuU;SA@i^1LK>#>t=2&0T4es{c1GOecRRz} zGMRrBkoXvot(Ha@OWh%K7NRWIgU6e(aTJ8%LaZ)RqAu5GLYM}GPPb7>1O)(fMz=&l zHzYAySq5Khc7k^#F+>`oOfmI)1Ug}xzNQHgwQ{3mrdz#~hGRO+R%YgS8PQ$<$X5f9 zYAFKGg8xTooU4P@QTqOGzz+ejI@r-pt)0nh?{cQ^Fmhyx6=dFWLx>IrVnaZ8yMi5z z9BCGoXTOr*F=)ORu zwZ%)sY^c3oRQ?Y0BgpOmbYEaMfmeZ=eSwd`J_O9Z0D-Rn-C-VME#_E@Vc8>aui$Pf z62a3g*WV*JVux9~`DIpuZ){0Ak9E_un{SMTx`1}`LkRQ-w42{(6;z&WuigBYVEX~>=2r?;x_R$Pk^lrR8fDUQL^r?4zQv3BFHI+3 zJ}4b5cLR4*AM9{!I-I&Ppq0D&$qA=)ZzII&y3X~+WQO^pqP4u=uV{6RULH|r0i3u; zpfCfT zRwe+ldmcQfpU?RZ=-on+MRxF@9^VeFqyh^~*4V*=&D9BL-GO#G>K{s*Mlx4{Un;cW z4T$sWX#4uyD+Ip}D8Kl4lk)jC1GYav_ai&%U+IQ=r|0qQZY#sQ6@PIcyCCy=MCB3+VR;h!OPhuazGB=0}_$V#|Qe=+@bcrK>(1o-iY z3Mx^n;?)mwABSw0%S(ic48aNh9Xo+UdXFM?1D37_yt_f< zNY?Fw+zj#QJ7XqEaeB8DPgbcdnF1PHtIEXIh=~(s!)q^-;@oG0A~#SBIK3Z~hH37R%Hy&| zX@yaeNLMu1_*H*Jj~CE)dWWzWyig;OS%}fOu&zYp^uD|{%=4AmTbN&nSLYY&GNe_x zgxd+-iHi6T`9^bELy?weVsnRf5Hw%zsOFAjcu#BC;3fWYKcJY>8nzNSr}X~TjKFo> zK_dlYgff40EONk52TizolIll_{SXkTva-5KaGFIfro#%IZxNXo?nj??6%Cy1Z@@P8 zXLhn_T>gRz)29u%2%PU&j;Xdu)+sq*zhN-8ub-uonx4aw=g zO{__MPi>vovBT4^U;MP&l&$EZXVk0MTI z9J;M!6D4*z^yR>@;>9-IN4O32CZL^62t&6k?FI0sMQqBfxlZT~r5yzS0?>Qg_g-i6 z({(C{B=k=Ej8xkCQ{SWENyKKt+9VlGI1|ymEV;)<6bSp@qWLBrALrQ^-Yh^ zPj}nhHB4&oTjpS)etI8$1f;%z&cQUJV4HiEAan#{pM{hA7GKlr=AJRuFppHEK^ zSbfLhc7=6`?zpTmh;+CXcY)RJ*^GCgOWjqsLglI-kMQE8$7u&L2MaCMwlNpUvw-0A zQ;n2AsnIhD3#$W2?%QHm(!g#&U#1Zkh*}i-_neDr)Zj*2sqzB#9ih zBJ7MOoBYv=$Ub#&xpge-6^U7%p_ZB0B3vpR-VD-#H0MO)ANit}Tm9M-c4&aByTYqU z;!+?~&&tXM`3$7|sa?>1B(tsM%j-u%=UPPWN31o%o_^ROFlTwH6S}~%<#dNwEZ%b*G<~UYD+iw4i=VSX-8VzE=TURdpo?D|0zESJJR(1w4HIPH4vXe3U;KG z{4$!EAoy6oq+myy-qza&VGEEmdm67keke_cz!xFNIm-4`R49mgKsm7b{>3E{(Tg^E zPKVgg631NbvuS~Qo}{1n1F>%~@IS!&1|&$c4*=e$$;ewE(jjC6v02i&N1vv}fYk-U zxgc!_v;u3{4YT>Piz(n~n3jfQJ`AIqB5qeF zGRBH%JHFl`lE$@G{>XHuFzvAMiqS{@#b{d&(^(O%HTe?|bT_00>XDr~(*iLwt*gm4 zkb+L+UR|vK8%({<)PmoT)=W6^Z1bkH4Ee5E#rJj4xY5)SdV+dj3)3n$A;oo*`J?Y0 z@{C^}7n=I`969zlV4BpzH2oguVF+IVra~@E(-UOrj0q9om^ss&#c3sCiAJ+9XU;U9 z=wF;x{}c!n@EZW-^Ea6&``VZ*Vd_SYyEHBKDZS|NNDT(``Mq(P_Dz zApeQMUxCJQ(oQasuw5*P;El*m|Fp^*4DWmMM-d~RppzJ z-RLVnN#H*~&oh#geUSnguGt;J-dt!0`%zK*o8VA@VgJTuY9OHxgp2&U=Vb$`UeLx5>h z!L)oCrs~s$lmMnp1=IA^5z-G00_0KkuxY&WL8k)c*_%wd^30!e*7NlHV@hx$Gc9+k zj%N=oZYiIq^(DPT$k%aWX=&Pw9>n4UfHtF-2s|r@G^4Kw90Y=mZG5&F$rF|~%bfC` zY@#!*FMo(HlgK4EH!c1-IpMADtFHKhp5upn6}OgkKv1O`_?3f0q`! zCpB;df~Nc3lWLB1?(e9adctW@@d1+*_rIw+KWtHbe!Soovzqu6S+*;rx|)Q&_Bz%A1ShInf*n& zS!4?~B7H5Qn;Jut#6pWKB9p|&Y*coV_>0TnY}v_ARz}uaqA8b9V^X?2H6WiH%GCF1 zEKiO3@6%YGstW{ppT?!BIwx}Sy#^>ON)7Z%C@f0N@f8-O*6Ktec@aM%x|!?bkCEYV zYHDCfLSd?n0ja4r2A+s_r>90iu+y zuP{~TqIqJe*jUOth7UNTMn$+q#ae2#TPIat{8TZp6r?OwU&@p>n+jRR55x|QIU z0D4m)Ho_>o&SM@%zllcmnBs%*9{}{G!Y%^O0Y!3CAtrKqGvOUbZvj2!lOS!Z9lA@s z^v1#gxSs*R<1F`xb=4euW1+N(FqJ6^vsSJe=&N6H9p?RkXJt>jK3Jw=PXaf$QVG4zif;z1wS7s z5$Q**4L1==baT6-=`SPUrH~a{kiP{8zF_73_bh6IkWnV`hUMsJw9g{`+RmRF&}GyS z=O2$ssS8(Y!Q)YVM$aj|ye`apqW*cY;}R*8GXW;s?uqL1<6*qH50F!ZXy`2BUGTR6 znXTLxO_jmw2hhVnsJ-<_Zh5c3m~^+stA!-%7|T6!E~8WEP}b5VOP0*1@*Zk}+D*}b zynfkqvp1O{)HK`_)#qSzZxJcIWmNHeZB%ZF>iWG!g)GnAZKf2k_lz({L<48O>f0M( zN=^ENkw&Z{Q*xxrAT9JG_6wuhfmg_#8Fx`MLvGE;1bT5aQ&L>v)q#FNRCmKFzK|~e zLW3}oI*n>MAi9(4Cf7XkN5zr7GLyXnqI&MM0pnybpxHYhsy)vL@Z$h8@DGUUj`Jc2 z^MG3NeBxi$u*CEY~kFvwJYdsN~O-=2saFh*PGhDoxgEQB_8DvY07H$dJ;+ne6Nx)jM5I z{!7vwwTuSjH9N*YOOr8bprz3<23neoFa}y115zGsObu+2$Ci%U!4w*$eorx$8$<)W z7}<^G2Bu%jlwC|X`jVzh*)9grem+ybYuO;$MjDM&jz+c)<^L=yrP08>5}7o|G`I zm6~ekF?pF{m zs%MWfH#&~YZseU}UbOUBJnIkI12FZ&i`ExA7ebg1=$BzqqWWc+$HDIxn!fBTXcF@i z1ex{3z9B;MImdLvsk@2l1q4qWg+VUA%dKQG6htD zOE0%tRLleAe?+v~HSezbBT_r34=Uz3A(~pJIZinE1)7rkw!UTY`r*b(&xAGECQa3E z%e)=Yo@d}D?&AWf@_-I%Ws)CLAxr?`6VK*-jBiJp&7q}U3SpTNzf323nH7YUlBM6#6(ATUfmm6QbA!9@ds6V z%ac)LBpva^t+Bo{BJs-`<})=tJ0sdO>Z;2-BRaP?FAUom(MOFc#!8iYDq?0VXa3s8 zaW+N16#dSUW1AxSzQ-1Fs>R(LDcGDM9&{N7(hS>>)!4cWai_OA5poi|a~XDi#4R9)rH<5wd+&jR)!wn?D zQz4uP^!?fzc(fI*3{|@_X0f1U8Tr-nx59Ty@2P{t%i;M$O?0J+SRavCXU>@-+`_#9 zPBCG8DR8xWu@&A}W1UCwEpa+I6!8yc_m(&cj;DWoHr)QGocIEL&538j#rM=TIdNV+ z{;v*8^Z9Xzab{`4r*&`94^ST0hV=~!58%z+z%difp6sj*XV<|-VD+a9q}RJHtd&mQ zySR>BGnbnLNWKP?x3r$Nw06%Ds}re?;arLKYh(@rPN>8RzKi5#2uV(2o~LmwLuc-T ze{2V9YFH|)bE&ae=9+)ETHaq3$K|PEt?Pw1(FTEQ+>_#Hoe|F2h8l}0xeoU!Ut$e( zH58`=b-o1P&JF8)c|NN1fXI3)CpqH8$~+^rz(`$>{pyCkWTu*4~mtkqNbE=1x` z?cuJqok-qgCN?$Zbg!u3t!_O%Y3rAuq(cC>-e7mSzbxF2o}BHHRrngWsu6_FUa?S| zA^V~<*J9c0dJk^yC0T;%93(f5?k-wfAWbFrj2sC!)Rr=2DE&fsu#}OU*vNf9B&fR! zJof_h34e$^XGmAFEZkZ2J0#>fyJ~N3rm$qE!^vGuPfpm_-bwa`>xqoK9>CbHXLQtd zJ@-79#ID);m<^AFRbv*jJ<&OGDuwlwS+L&#!{F5K<+(=kI_J(U2@A4 z5%PSn6FJw)X}_WV$#FNinwmel!>V_!OWm;CL8208s|bt+nqK9bK&&R&k^D#0Gudt^+#HF5~2E*5c=Nzo|sido($Ur zgqmCNZ4}moJOp_1+Nci*ya$ws(g#+lCS=nury<uSqtrq&oUiMH)97#;&~i74;3 z5;Y<6LobGPcNB(t%82fZ`OLQG7$d>=t^QeB`$l0`>Y!v@#Ip`*Pu@?aHrp*_rXNMM zoJRIuft5$Hvw#wjd&|nzgxdHTnd@o7Imu&k!MBE96uQs}aj`pyY zWvPePx^m2UYYJ7N`k4>W{U4}2Z7PqSdcT0k1G=k#w!!UmE2}pxY@4Nl?F-x1Cg7eL zZpPn7NPGaSb>$@R^J`4(9c%(PI$Urui7uK7Gki8bhmrjXaJqE@dm;rNh&|jHBz-d# z9LSKfSo5wmCOqd0WP;UhMm_QJVpz?QX$E-bf%G8I4Jeug;!WgdFxWt0p9pd?fw4ev zp|zJdy|!DnM0u8Jgm!kLbyYqlW%YFn>5xNrT4^~WTuHpr#?Aez1#q9W+~qhuI>B`! z-PanQr7bm`X_0el1e#uDX;;+Hg16YppSbIPR^qOIL~hN>B@sooT4htg3i~h{c+;?% zC+X!@-}n*fZV2lv(mY)g-js>|cUq`2336gO`UKj9^NJ>#Aq(zLInQs>iR#Nx?+7%l1 z!uvC*$0@;StlTQ9V4osC@rC@9xS=^&2+q@RWIExJl<*;R;hZj*7d$r|qIk>^_cv{ zvu;G!Da#rrB9&PWh{%$>Ra$_qlh;$oj_2fs$YPY8yak%05hw2hr8sV{571%PjBT?n zpQ2aR!u=FCWAcUCj8<--N)%)AU05GWiOrFcu)Ii2-fAb92MU>bdG_CPa^al;a8c}%vEGLAJ^h10$v^2Rd_8PC>;XW~t7@vNUKc$a6y$${>z z2`2|1;iSc^lNPg1g4H+)@}xLfd;DA{1Ed9RmBoIi1Tu!Y8G@BN?H^0Hr6J>17l?6* zzqj}@%oTj#3KT+KF@sO2VI!&9m$a3tokicC5_*!~NT`^JMm%&{2jU4mPVy^5+$5vo zkE~#CJ?rh-{QhkWo$a*|LvJ<}LtmocIZfsfL2szq_GqK8QTO6Qa&|$kKZz!nRh+|) zqf;>infN4rCX~cea_K5cQc_0I7VG!RVaIBU_81j&;7=UT*U6r$c>PgyQ#pIHt{2@+ z{0tI-yMcfNoYrkH5SAoHPH_K(5;_e9C$xoyRZ3_ghI2zdvzBZSs(>C2bs$IF&=SId z&^f4jq18~*L;X^*;0%^8YsS+n-G;FAt%B);(=?v!%S3E+)?%WFIIUNUF^M&Iw)-)% zp|gq435}(Lb3@M{k5W?i%96vZ1Ll4k{=0m;Wrxk9n-0y6wIWB z?!?#hP;Gj=jF5DUnW2;LEEYP8a8~FfV#yBOi+oO~6jyUYd$6Au8Vo%@^gdd}p~I4~ zp(n`q(oiA()C#%KYlj9PS;uKToZenN58M>`Sv>y_zNI^@Q!pB=B9_3DZaU^dWAU>r z^cOi;7K+myRfaagtqOgD;F7F+@rqvXBofKrCscp_mST!N@l0Z(Pi!Pv63LQBiRcpx zpDvdwu zT*s^HW=k84I8zF}L%~-hZn-y_@206A1*J{G=h|H{^X(rM%PQ1(4#U{IqY(k9Jf}!(CGG9+MQt<)=@8 z3b*nkLHoQ+cCM0OVV`{{tX694bErw0mjw%4dHYysEVa+gswNKF%yCf4LRr+UN~iwU z_*C#{gKMBwh-lwk)W!Y;92=R0myu+cEPVcbObD@ z?WR44T&I{kyj;-C)y7=u3@INoAcD4(BPobpR$sR>C1s^C9$^MH36nv506RCLi zx5D{WIfdDw79c;z`obx52K7QygaW6c;Kaph6Nyv2uo)R&iTP0XVD7oG+o64LvM1vVL#kAoX zOrdPjPSjv~@+57%2FH@rv`HEqN2aIE(cl`)q@63l64(1sDnk{{_nqH{$$DYN8Y+6W z%nAxK^JK>0WIxZqQW(pVktLFSODB+cwv2wAvcF+~D$I_G`qb<$2p8rka(Z@C(aFgY z&g|^#nEn*zDrau?tD=)zD4hA(dnBH`?9)LOWIr!RftJ@2#wPsednv;G3+o&poZUq1 zm)X9#6^*;Fu9}Qw%T1}my18O9JzGZS!g}gpJbSg6tY0i?s&on)kYBl(l5h?>R7u+4 zddTNlVx>7wOfF*<@WFhf+)L*#aGaa@MT zbA(z&OxlV9y(A<*&d>wYHl4g_M;hUQ>dKGxZD-djP6J_IF<%TBIn0%A`th3eVE=uSw!+_Ia9*v}I zhC1J37BwZ~H!u4pkRzdQ7A4~tua?js7XgXQDQbdFv`2~hmh&C8dKT5rF%ug|Cs3l~r{Y6+DAp)-?+G zaXP$?T>Wx2QS=M-skX_;Pepbc0_urVG>%}|Vio(vkI89KKt2RZ`D8kEuqItj>CndH z#D!jV6nXzcupX@Z-Oo%C;l8I)S^`x%)h+s@kcT{tfCgy9<0$1-wm(G zb2Vv2x087d8b@R;xk_{-bDeI3Nl5A=TZC{Xc%X_Or`tQ!!qj^n^r=p%*NA$0o~x~F zuaK({(>~cWuwyEz>!qjZ^vEPntPOKY_mS^Kwl?O|od#s8X(SRMr|5)2>g@OGbO#aA zf|sgdyzJoMbwg7zy3L}>H@e|?U(9JCAFRnZ)ytkNB&|rLPZDdb$);H?6mk{bI4w>m zZyFc7p;bb9PDrKKLn^q#4GVUMZ!=(;azA>+=xJKppBI*9kd(Aj`Z)8R^0jVEdY6xU zo>TM?rQBq-rX#@IASoSH2-*sAEoSR{rb4xk5OTV$1kc&mE*sPwu> z3YKGe8K5bs^oC0cHh`}OGzFF3m@2gI2j32)|4hdA_EN=8VD;`r>U|&M{fqFQ0~)Oy zO&R~s#OWqNWUyXtKQBEOb#Dh^?<4;%;B5ohPvCPwHh_Ff;2R*NleHv+51U51k2u_m zEFnuywya%au&nF7HW=2~&0=T7&D8y_-Y}a73{ZNx)pLnUgswyNoEKqzU#pSm3bc`)KZ1iQdA(vadjzY?j0l%%+RO*v^8|OyxII}-$?M>;` zhE@zTzLfZ;GDS?^OrX8jOxkEP5T9krw9Prg=woaQ0Y`*gguH7Zw?w@;;H?1ZO`sA8 zZw2XZ6?kCUhUhl+iZ*oP-lK?&LiTtdxC>+|fyqG1C@U`Q*4$l@{X>R0I6s*B7oqVu1>a+(9`8-v26dHPX-mg*9n;>rtVbPI#}1{i(6frY}2~a#A`2g z=V3g10MPc-%(SN$z@Hb7=UR2?eTmj?>ekHfh^?K})CM-TA5ApWHoe?xDI|@pfmbfE z?ZN76K=(OTv}Lm+E&C43j$U9as02VlXw2u>};3V@Cxc5Omzl?}D<BHW__{|x9S zNx#8H&(ajFU2eug{=6d6*?61d)CIhBkiGNo|9GP2BxI4P4XeE@VzV?`YV^{pn<*d)|(pLL^?it)1RNbcOC@dMzs014bqS^-b) zm1h%(3z82~N}yPfG>|3)8Ux`0AWIUt;fKm>Ji!O4x|0!Ui>$ng-CG3GlR$StE&~}t zV2~hlK*kanBgj~g(+Eri8huUDe9JtMXJcdDq*ri_n>tF;@)u&WkeB!2h0{mZ=mZlw zR>g@7aMQg~M9xL_9DpjZ&f1mrhRwiR6AAM}X~N@j-*KbzrCQCvr5LyX&3iM*emhYR&wCT76hu59PGG1Y;`u2A#sSvz=tA2~bf| zU?5#O!F${^vCTtZ{oWo%CfJxgXD3;ByBqwo7R+;ovjRZlIKZ0@GK;`8AaXK@H;kY4 zVAlw{PcqUW8EKM?l!7Eo#*#T6$fH=gPptijPyZ$Gz90uc{CGNvf5BzQrrkxS0R&fq zv>{L-NHxeP0s{rv3UVQVMS|=Axsky2f;ETU`ExU>hd+8DOO86x9adDj{7Nf2hYsJ5MJmFnN=JE@|0Ge`msZUzC8Qh| zBBVcRS86&~$OI z$<&HQ(8_?+Db{3fYx2T6cHX?nwF`w^XPCjcOyo{J&3p)pp)a_1cm}BH+*Bn{$*v*crnGlri^}FRs%P?x*BlPWiDBz zJ}>oAYpsPb>YRw%p%UAi9d#lwyt@)cbabUiQ*Cr<)&Jur*FOhA*o`x_I9 z>-eFgl6)buO8`ys8Uj}XDIb1g6pu_Y1rF~|%R6#CpodzhYfkij%a;Ygon?N#bka%> zi#oHJG5i#VWwLddsXd#%RfeuSt9oo_~Rlc%grm?JfZCYe_d#@fpCRePiX%Ie_v?Q_pCG%u$1jY52QYC-SHP* z1@&wRUF|kBCG=2o3Hjn-#}E06E(%&gg_z9;w1ngUQxiZ-=o1^4>-eFgN~j02@+w?Y zDG3Y(QVv{!snT#B4{+tSOGgB()S~n`o)o~a&3D9~9&DPUQSrS>1DX>oi z8gHY5r=zb`6sF05?KT5+jo#Qsm*R-9i;yPzEYxQMn&^uN$V(VC(VeV<>-eFg5`7)A z*8-a8+X-w1QjW2TM<%+xBs1kS%lp5oWs2oXwd_lR>{>M%vvk?x9jA2t`cT>>mTs!+ z4(h(U%vM*sq#0nd*RB2wJss|rxq4IlA)LJ*(9Uj|+exb2ZtxcY9qumnhr40XJxL3s z!^W?g#jIaDq#qyVqD`vx>Hkw4seg3( zhpj=^@k2*dwL6LUc0jAzP6CeuDSukUBdeOWuf`8h&DXGpt!-+NTSwZ|D=57Hn4KVq zvJ<2&$_ji6^CKX2`1hvXw6fJ_9+tFqA!u6HrsVF$7Y{pr$X9ex(3bWiX1@otrA6-L zel4IaZK{on@0Q!pQOPeswg}MVw;)gfq?~QV{p9Q8gKisfIc1gQ`7O=7eZ$`nithf- zBupl(kC3*cd5M4X&57n(8`2uzNC-L6dX_GCWDZ-po(t!dIZkwl<;wk>OzIY<omx7ifdEV-La+>9=7dsuq|4*x}x0n3}ap05A90kb_BF%80&TrYsZ5R26Cjujdd%9 zHV1qrpuNS(rX|q@L>vEPOv|LNHnz!uL~r5u0XplWx9DzVO>gl^N2G@sKX)EBR^Cha zDfYAn8{+DA%hkkv1&~=zH6CVqi|ycd0FC8XU0D-bYe%>Rrq+IvJSIG2V@PpCn3pvc zXia?*^(O$Wsc#Z^1JIg!z$&8gzBMLV zSyTIbr$@TAjnjLRo0=~kaQu+3$WCx=O+fHIdNe>2ATJ5e2Q&fYHZHb8Z0M*2G()xt zpb6+fpc|0V-ijZYfOg_?>QKw;WfSmcQ#;ihgx}SGmLZHux@}<@mFBvaGXvytLKQ`)MZvU(v+6nznKh z_(-8$Oq^Za5|Nt=K3izgrn;JTb_w`WAT|33;}1^gb$Nv?tsef!=Oo`I@Wlg;AMzDl z6tuL~WA-{gOY2Sow*#iC{$S#us@l*|Rdpw_j{{m-dkDM^q_qFRDEd{^l$L30qb#qT z5pmiyw+ZOw)-%=Z7hBzQz4lLWr2a8<&$b3##}6IlXpaqtV**KsD){sDbKnrZU_1bm(&{0{@3E2*SX2n1P1AvtOSj8g?tev== z@~-9C=9R*$V|c@O&7GZ8U%>AK>rllsg?-!-lfnbZDfGnyjvw+BT@*BhC*adaKvOu4 zz!X4JcsP+lKXg(=@k}0zb1)3 zE{R_7qbXSFUd~IhP{!@y zbV~n|`9q26l*)cJaX!u=ExGtCKzrLMmAE?dsD6M(4d{%zmYGrC3w{@n+Uj?shDE&| zpa8VM8uTgOuDy7by5t{T zj-?@}m*u{ftCGF^r#Mpo@N!eaOFwj!m-}$)V?e$9fxve_%ANn}WjpoqlixH89X~H+ z?yFul^}Sr4?Bzejk@|<1PQpt+bd;BWI9yp6np7vu#9kO;E{0%8l0fNUTk1k4g=BT9fk z0x^V}g#;TCLIN>MfB^a5_f&OHYa}n+d%y4bpa1#or$^OY)m5iXojO~css=Z}m6h8k zlp-Rtr({5Rj|b&w56TTeC^L(rR0fpuZG}$AOZ9?sAb{$ROK>?BiE3O~7uXkjj`&f6 z%Z>~vXMe%svf6`kRS?R|;wY5?c4 z-$FK*4qFyMP6jkD`_Oo)UeH{J#;@_9`4$p)6Pi7JLIZ^iEPkTRqeVI!Pz8-9-z1IC zvZWYVIQU6>!wAH|p9OE~?BGbwmf+2<;LUJ5Yo*wV;LTHko2)e?q^NmEv% zU$v!pwHp< zhqx+-9*qUlCPD=NWNGjThWkEo{ZmPhB|wv~^#hW)xMVRzzo4IeRD z`;DT@0mQIJu_}fu8)_kLp(V?2D70Wa);j5be7k{0%VfI8-)^90HJL6)^Yp^Zx5^k5 z^mcxdxSwHO)#-jv}uVlcOz%&vVKejMV2*Q|I`r}L(-|=DeQoUf@ z1CU3OKSH7Y-21)<<0lrzu|XI!OMj9H<49W_OhudO1*6&lj*3h0 zSb{_nSJsiXcu#sXV_lyC<2*1r!Q*EZ#*sl7GfRJ#3FCYpMlaP1#!7%R*n{y1B*qcO z3;Ki+lLK?6Jp)Fk#!9o0XUpqlTsuz@#0aUFA)b@jqQpXa@Z1bSTAS9WR!o@>j_F2=2~WZB668Ukdua9IO<-X zqt+wecgdXr0O#SFz^6h0OK^7~!T!&FIBM2*o9VfB#*0$w@yi~6dI0R)!;F1p1AaOLVtXlhG&k?XP&*phD?{{7Y zioFr|@B*Wy2nj8+#Z|~lc`rJ6K{_xUO-{ol9cV_P5tnpegWmx!)vE&+pzL|Lqyrm} zScfa?sy;hlnB+Y+&!dD}rq~fE@jCEMumfIk74lNviw<6p4qSmIFUKVv=tSaXT+)G^ zeh0i%uMRwjviIYX4*Ud(AK}V+w$BbsBJE6M98a!Kn;$`2a{i{Do{IJv$MY+^{wywu z<9Qv4KjTWr@uo@Y9FJcm<9PfW#_^P)wj?fz;~9m-2;MM` z$1660@JSrc6l5KZOX7IWK%$8^jN@5>#D%g@!X5V-MnEO&kvAz441_5 z;J{9qNLilFYT|h87a-EnJQII^G7RZYq%2;^0y}m7k@t55zl7gH&MT{!bt z+EHd8iudO$r_R9LDgGN?%6sF9$N5Gh%8WqiVYu|UxcLGSWBB^`^8s(nDl%a|1(QVn z#qTc&UxX4fQ1*D155+uMq7_$kEbwFf{XN3rR$74Wf!!9n+TMHxH{<0E?39=gieGP^ zb3-jJBJ!E^B2qH#PG{3 zy>n<7`J;cc3T)<4#JpOx;qob zoj#0Ssuzqe0Hj}eFusn&Zo>F%pD-HpX>SIMCr!6_e8$4~d=SRW($8eV82!+aV8~1L zg7KdK>1_|jtS7;caAg(S7kiGif$?aY=Z*CT9*oah7`uZoW|n?F6UGyL7`;?481n&A zE-o4CDkLfh;~9OzXvVrd1IC+XSUkRHVcZ#nF|+iGnJ|9chtW&*g7GkbG|Gc<3KDgM z@vc5$oWN1Ze%9uVwsWR#riJlk3*#d}7&A-1oC)KrK8#+f7mN)6X{HC`nMj;Y82_FD zqfycY#<*+g@fdK;c%HpsfOPze_J+>8*y;9$I|I>Z7g%^hKH*xXxzLQ8{%E)Enb1OxV9dNf$*CxJpo1qwMInL%N5SvmHG&DmN) zbz_c3{8~O#wa}C|P1$Taj?T@Op{B*xKvX#ojpZ>4IQa0i(UTDB`OZH~nfZQE?p8XK zMYj!m3J=>bAg#E>i+I0y5g)_tHe3@~^gUZaIJCG7^**3y;-PG4`WK44i%a%DmA!2n z2zewkd?thB@03lGg;uW^2?0*^=ygAa|oSe@$Pf6NaZtpz{tpXERo|_x0Ju#5s zJq#`RC-8&DoUJH2QZ^oaV*>Xbg--kTcpRe9VUadaphD4`|BQlyiK_(@NdQ-XOE7Vb zU}89Kt8fk8W?w#rkS#r;6t7=i!pdK@TW<^eTBprIt#t2RK9=s?33&YoT$2gW6;f-h zw_le^lZ9V|yYKc6)#Xk={GJH+v2U5GtBlSHxZj>_h5I=Yy>t?4ug4{Dw@3@CaJ!5b zzk=bk#vVo$2vl0W_^d@CXO#&1Ymwc7YeXI3dKWNPuA7LBNfNMo51!wNE33=4y)!O= zN+buqRePB%rKX{s$o)JOe>ZTtp_wF<&H4m@DLYUeK~)dqlD!*0LE=Ze;SQ7+koXmE zxOd|ZNc@gB+`I8NB>svk6l=6F@JNMLRLS{(u*+D=KIah)o8|c_>2pY99f90Cd*x33 zyMdL*H~h%d8B_B;)haeSko_kwd!CmaKgniG2v=%3v?K=~Q+3Sve9s>ydYxkv?c-BG zAfx99^fC1U4^82}Sd+~@0@)3c4aIqQiI=_DW^)tyA}`w`h)~rPHv0xI>r)G(jE|=k znmwUa_u9fg^$M$mX+{criy1rxG4`KO)l;_gUaz!kfs)eRlDMsUk1ag-1a=TTcrIAA z7k|gX<3d$gcE-%|3O^exeB1j5Gc0^K4pp~>S9^u?f?#-jz!pBn7QV+T{7ZX&qQLC! zn?Yge;hDDdi(ct|!K$DCTN;kBp{g~uu!Av`9=;g_+S_?aI8gX{Te#XQ{7$g&{6G&; z_&c`nJg@LY!7=pqa+{j7x@}>Si-0lLKOwSoFlJq>%5kWnt8b#VT%M4GC*^Xp+}s?x zl>I7Tq0(3RM$*0^jsYo@bOy4}D4v`YD{*qB@{Q7!AeQV+jx!%O>JwPh$s1re;7JLe zB)RH^n;~+;^)B2T#dAB7ujb-rvn}>uLT;+0*xRn$940q2@^Q1pDg8KxcQ%@vA##(0 z&LU^5+|;nPOPz8;klS)WiZ_)6H+eg2yVRM=+D0u5WnW>plb*^qt}vTYOAcrIR~TSM zt@!e?Q1+E3*tujgo4nFQTbC^6%~zd#E{wG$+5RhzTJaXzEIAC1vbQ?<6@(ZREx?ve*US>Q09+Xc+RR&cB5%L zRJwwdonR}w&@X&~>2;{IKYKLYR`v})f4VayUD-^pvOg0?lWpN{zwl%OnQ3{dS9l>2 zH{KS0-!D8q2%Ub$e3~^uvXRK3U`g{(!clIH+vLpTcLp+>(lidLI&Ibn6 zTtC0cd;dv7-rv^W=I8hK@?RjZpk;agIzK<@p{WzHIy=|C|2;oH*XGZBlw>^*ar8E)kZ4No#FWza8^R5h&R~6)+WP1%V11X_`qmU9^DE|t z^<80~OMTdQldkV;w!VJ#nD61ej`Jd#dcZ0)bx8A{bMvp~!U;qMfFjbNe?k1di))6Q zwDz78=X(V^;pD(IoW;FL!hWg{MfflLo>TZRN`(K6pTl>eW?aKZo|=9~`|q$k|An7% zVmI-fX()E|PN+_}!V_>a4T)oMMNSS>5b0Hc8i}(QmY~RNlx^V4XXB<3iBoZ5EA86> zm^ppMqN)L!qHpqFdo^hbP7T2c>fbOWn>u4q#)+Lq*8_ zl~cxS6kZ1!3g6@0i!}Rd3g6?Dv+$^vPvadNRHysjG>_w zd7!sxQt&yy;51VU3r=$;Nx}N50CSv_d&@63&QM5b=ym{~93;8fr`bN>zKno{>hplN zh-8lNGb8p?zg16T#wK5tgCdVZu1uxmtA?*mc^YpfzefP*ku-VVlj8u7SavR;ds1}R z(3E`OKIiLfjT_&kT+Y{%()!F9U>WY)Oml<#SbWy_?b7)GD>UUbj8tSXbLhDpyAU^p z9Frp!g(7X`m}sFR&I?6WnAG{9$jb5u`RsyFWR*!>7>cYe=V5=Lp+^JK=yd5McXi7s z;=Z52Fmx+mh>n-sL;c+GX5d0YS7sx(LUL#LxfLF6X$eN-l1o3ZsX1=YSMu^uWac?? zoMvdsyP%Kgzeq_u(MHe^{g>fN&40qvtbRQ0?8nF(c`4w{>KC66*hli?30eJ0pJJLH zPsr*wY%0>BX6pN+s`&h0e1{)T7**v+xl8aq(ljzh@}mey%R8%i*o3Dw$&|v|_-bzx zX2Tzmb=FR7AjYNN!p$lqQn-fmrCh73r&DDi^N$BlT;f%5Im%y(tBDn44YM!x5uy{@ zZFM)ASNGucK25AF*Ve!zutb-7C$0ZM^$e{!3t;e?m)jX%js5y&C3$q$gJ9Wx_Pv?-U_zWVb5wh>H=nZrlFI1jaBP zH$=t!LqKC}Tk=U`hmx)^3A0eJE*`JUnwdzK9_=?n%!ZpP_d2IlLVr0-YN^aNL&j>V z1sDEkgQ&+?w4o(JZ^&nC0%J`)VPCPKmvNOCr7@`C3qt)~onV&Lq0GTXWTB5MAl)4S zl(SPu`CwXXfCAuE>iJX%!ysvb4_d~EP7GGxbFh!D29X8HVv<4aWlp8VCn2dxI6-XJ z8m#mKx+_a&COA>+OgHL6SKKmc_xRZK6Z`p-cTe&3JbG;VjwIpvNezrZ$F zLpddA!t{@jO(QyM$}i00TpKf~68!P_@iIZC3q&Ldk}>-;fw|a2H$t#G)3#eVf<+20 z6k;?WQ6CI72+3#6-&te>7OdGqlR_Jnv6&u2n-h1i=Q(2}269dJqf%IXgoR1%;4u64lw2(DZM#W*a|d*(@M=yU{bNxMmsY0w#nv#I+@$- z6PrH=!M1x6knj%ppR<8v?i)Nq=C++mVPN7+zcU!NAgO%GA2~D^%$RQn59huI-!*gP zEPS=Z@@0e-#)Vg(a}-1dIvW%nzKBppjAVH-L3@J04akm&Wl-oRg+es5k1};)hLEyN z1w>Fhj+mRG2$MNI=#}8)`tm5xrzI=G@;xqJU~{Bha*RUBft)Gwc%<+o%jy#rxfaZ% zMUO|(;K2kXC{B7pWrSuaJHUcv@_yg^eP2=q0Q+2;0QZ*`e33DrH%LY-7}4U-2jFK= znplbR!NfVSNnr(f1kb0X15V;fnJs=ZRl&kCI729c*{PvD$Ihz^C(N^z;eB#+$_Ej) zf^2ADejP@33OI)ZDH|ff;{>C8I`(G?;TY{d4l?D#ykV6gw8QF)iQvOAp2{#bz%&lG zlB+UGHderP@BtztGpwix8y*T#VMoSrFe8Z5l0sm$g2HGoZS2`YAt^%h=rKCWf(InL0l6p3$Q)skloY)SMuTBovwHLP*=gQB$FT4d42wT8%Yi}yK9bf)zUZkBCz0b*1_Z|Hl%5QK zuARR^=$yZ&_LKmgd_X<{Yz%TPxJdX$lRt_+y+c%x|IQ0iP>_C34a87W9gBj=A<`B0Llr61Bwk)uu zADo&CgUraz;YD%Fz7YCml*jXJDa%tX2)1u@Kf@U>%+#S4rtAS9K@5r0hQmU?FC1Rq3?pAdkF zMyH3h((}EZCM|52pqWx*aKiU%dk_}PHlt|O+2NEKZu>Af%?GAfx({YgwIm_WIJ1uN z`IVJug2H3HTG;w={wVTpn$UbukviVaf?zw-GnvW^RsvDfV=e;4^+qphKr%GTFs|7d zy$zE29DhWhR`j$5Pv~hpoEYpWjFp+84Nii7os)uSfxHrd*3-g1MMlE(k$s*UXf+-* zwNACNsB*mMLxx0P<@i)!3Dx>H8il|rHMA6AJ56Z2GGfg8${beVvbkoyE^ivY2_&1D zJg{?m3|E@&&hTXLnVxR+CDT@AKqHzjGetvkgPhsWm(xnhSu&9Y2!IBKD|EI9a&Mp! zwvY=AmLzkoN5;9V+chks#S#e?^9enu-@wjh76{P(Y~iDYJ^Eqkc~OsnPj~LTv_Lw# z@+ToNlh5x{k-ngmI$zNCztGnffOBtr7W?A~l;?U5izNX?cd6G$I>3aRR|=zACJYJK zSx#D|&m`rMfLAg-sjrpySkp!6@o4`t$A@0V#Sqcujz3z$aK+1l z4<+{~97N6)=^V?U(^PXM@;m@I@a8>(|EthYFs}k2eKn(ex~8vrIhKTi5Og^HT=zIW zf|4Ao$>9Y$CAK<7nY+fZvxEq`wg-X+V9nsV9#70bT#vRnojd_^gS1Bo(ptgS1#QNS zbRdn50MMZA;kowIkci)xbOZ2480ExzunBs0T9(H>jm~#K2yJk*>B9Ea51gVP^x*Lm zE3Wc|?O3~-%%#9r42>%SG*)EG0GWmX88<{mO`d8d%|kWwRH>368N#pKlPHXmmf_b1 z?E7**^n5!=2>sJa2DCJ5XIi2()GaESAl7pV^j6RUEU2QF6rd9#?Iy4otm24rP==(Z zG-o6n*p|XG+s@eI|9oJKZPCALr9-TJeRJXAmXCKxRpGFJP4(>1m)x`3wh* zc;dnLQG3`B|H}kpO-$_Bo|WuJTP3tIR}=x_ZjzCxzCWbK?>42TCv<8pN8p^SlOZ$6 zOmi%=-qD9Y+73v@@J{s<037*8BnUv_k~r32r6iyczzdP#BiW}T!W-zy$FevNIl-p~ zQIQt+GlIi!hZ64UOmK-KE)l(Q+DE-Tr2N=*4xt4UDMiA=Ux!x)Ye_I&>JhRcLCKz+9F#{rl&1;p5Jd7k05%^ z7o`i1nhPxIH#!)>3q759v5;oK<-f!yHcV;5;XQp$N@dQiWkKdZ!iI8}<`$NMQ$Bpc zDT45|1^qTFjHqAfSx{IN4}xPze08RIw1(8^OYkjN;nw&T;RKL{<2e6@10R2I6EY9@ z@l5DkxE{v!J6sWD9E$5?T=Q{Vj_YAuFW?H}6khK;mcMEq7ch4PenQ#_#llO@W3SQT$05gcw00X32^~c$=C2fyvG_(t=@NyY7`;cADln8bw1$L`5fzP-d~;1plkcDbfkgvix$jk)ObRV z8uK65(Ham=lh#cbqS|_`2R9-CG8=n=C9~(k9+@G-l251B9J3rCISWtKpV#gHC|Me~ zxX}@)9Cac80won3NLAqQPa}$FyXr6NoMN4eylnS&@2|XEYu-VrTzP9Mi_DX(U$VEw z99A!L`+DYH1FY%-*GZuin+mJToOb?Ax8;?n!C>V`y(nEoKqWcrRL%|ofXOu-Uh*0*alL^KbmFSNIen4; zR()!-o&($;?bhib=wXCq-@mvI%eC?{QV3AS} zcMEk%jUL{}UuTXknSiWoP*tL$+Erg&zsu4mCu3fh)>BeCyIJe#sc1EudFr2Q8+Eq& z8nA&$i|+n?t@M`-xq_>Dcca@*j^gN{rZ#e(6pD`%=5Sn%uBp*Q^;uB?GopUEwjB@_ zsqchq@C?0rW^FZkWpZ5(LWC7ZI5gMm87&Z`%5Kz2wGtzvVvW_+)hK(m zHe6{|Rt!%!%hcz)^}0;ptrnJ$#}1SvP&?X2?7z(0Z>+081x*1i@khr&t*8kwT)M8> z6#vL^YUE)Ko>dUj7~sExymM77T8~DXJd7q#d%o6}YG)c|#_Uux2C^wD8$}-UX2V$o zB$*Y*vscW#b<}LZE@x3a3Kyuk_$z3@{LmG^Z?qi%ovz0qIfR{R_lJM?S{Cikhw5gG z*BDX;y7;HHAev%BBZ6L!LT&+OEy7SP(GDD=r==~0irLXdzow7yn5OVIQju-F_F zxP+Z3Pb7=`$>1aezbdB-^D05;i7!<4M?gJHsNxKkYvd>$rSs&;W47^THlC_RwYeZ8 zr$v{rGN3e}rCKzuavYOZ9K7-}m2GIEQaXE5BbypiFYFzowH=Kbidjh3t*!@C0HSqv zv2cxF3$9T(Y&l97@+m0u1*|hY@KMtrQIs`lcaC&pV55$vP`1I{n-zA|jqBU_QX^qU zY3_vxXJrYFvvwH-JP24oitEEedUH&zxB7$kt@Sc(K?v3Uv%A;J*sGUAHEtcpQhgJU z+L?mt*m*nIe+NJlZbBpMM!OWsz@3O$k+Sue>nCmc7h^02ATw(8lp0-JPmHw-=jQC#WJ&jPGP}P>>wI@V%&y&{`m?o}%yI0T2<%A4;6LkH{ElKsJ_4jE z&asuzBEQqm3cYhb;Xs-`&2O`PdW+*?IBrg*c9!d$jk>f+=Ln;v#;Elk zUAkNslai@mwKa>F86JJi2>1W+8I(8}KtowZ?p;d1;c5k_quD%$>E^C@J^E5~8~*e6 zrDz-eo4c2A$N#*u{{d#3)-$y;2D*JX0i*ja#MROge-DuNX^A5W-&o+Z#Cb9Yt#Df7 zo&`>eTrBXRm(VPgpHpD8I$~L0OM6w!>sy!-Tl{XMR0>71Xl-j+*4nqMU0UjnZ(chz zsvR2D#+Xl=(logvw2oa`%&u=#yELj@8r6~!z5#87@8hl5*tat!Ry4f#a1i>uD--fuZ6_JFJITEFjd2|bD< zEv9ZegtM!@y?(E))vY1*yXqR%p*3Jpr+|W>LDJC8&>)3<4N~*0V5U|VbFZe^0h_{A zhuG(+*ire7>cURU%RK7R%c$R|ye=0Cz?=$jI`ylIt*-!07wUO zABNC6a(}R%23HR5I{;a93?41!3!-Lr>pWtMYGICxhEEr1;ixB|D2bskSUauNHp!A! zt(mgMKw~C%gAdBY9-tg&AgM8c9B1ID`5a&zvwtW$EEMX5OqAf@oFGoFwK#dp;^bP3 zleaz(PPQHZC$H`UC%b#Xa-)Ui4GYVS7M3?Y4=gtv0G6>AnekC$GBI;R55&wgBQ!pW zF(%_H%$NdH60RGP6Uy`Y-4s8eR zI~rV z0K^7p#B_1hhV?Yo!d?7vsqhh(trdn37US8+8&?jw0xA(3ndJq&PHT@Pfz2w()TOTzYfb>b5QqwEz z|uenEKn2dU(3^}~5a0oe3_*Ajf z(ZjX#4fq1p#`TTr(@+cML7w`IJS~}M)}vepg@uh-26wdpbzu}r4nQ^nWq<0AYyFWG zj@xehfUcn~VS{I~ot`rd>f8PpuP_*Lz_1!Xl>HZnP{Yj`bGMQq;_sz;fc$NMQdjS` z!-LPh-riBIb0-pdEH3OY(C>P+~;q}UMN3^8E9N-YL($_*QN*mpc&g5^J;VY)dQ)`=#F8EdAb1N`1Ho= z7R=C9;Oz4&s*zg5wT&EDjXotFO$IvGf(jRX8b(>E>N)!kFq$&?9JTELATHUG0V0rDXej7b z(C|XT0UC{a(M*m%gc{RRvga`NGN(Wn;A8O3^tPr@`;XmfVoJTe4)$o!&!JTjm4XYQ z;5F!^@A2T$A3Pq(<+_NdCeqrP1I~%Gqr$i=+EDpp;;4YTVlXzUV=Fw&NIELM4R=GI zjtYcN7zYKN6Ld<@QNd7wAHm|^jf-IfbXt6hG@Tg?9}vgIw1@E|Q~*DLQ_P<#dJIM} zbtHd|MQtBTba5MKQV?ZNVI~w4Y%R#%;k@pj!_6*4(#He`lJxE$!&mCd1MLwDhlc--R;gx z6r}I;+hw1Tkd+&qtRqQX4u@Q1qPtMX%b<+psWlEBAyKd6@R*N7a!8Gi&(kFn^|*RH z7Ah}u>O?NYYjyb~+_klOuhPX=p3?o`_pgCBU&Sa|K7n&QXM&<0{Is;aloU3*AeE@Bb&W1B1x=}}5b%7|Hx{x(RvAn#=Bu_=& zEDC9AMp@K3v*1Efg-!)uYO7BQp0lwu-Kw)^;@Lth8d;$mZPY~@jr=_gIWi=unJsi^ z=M0nTubmU%&V{2$B_NBj$OOPn)#a7Cu1QZt+3+Rk2Y3n?`XP0Cgn3(xpn7D?2AZ)x zui_n$;)12f0oB_g%RYCdEh9hB~%HO+vIkM+V;Xl02bbK zM@O1Hus}b}qCpmtuxh2e`Zfr*rCK|W34VWj5!f9vKu{2zfmd_R1eRQN)rBoOf^Lbs zu6qeuV+jWyJZoEdEOIhcNoS;P#ULs?cfk_io_oCyX2^N zXMJ@$%rRE_PFZVG~e*elkh|%eBM|Cu2oQ7gkdm#$kNZ5F7^7%;wTO*R|C04oJ(SE}Nk% z+w`yo4WkM0b~M%_8{ImuT@S=NLsPoA6Zf^O+a(<fpwd*+RX^?>h6HxAUe+ow3AL+ON!HN{v z#aK5nvv!hB*5clfPy{`P+OFXMo?fFzV$j`1(J|&FLhSC+EBIF+KO6$A_MjbB(8m@+bCBT- zD9V?ncDIwwF5uj!rzWPZ%CBJvNVR$&vmti_a_h*U%&fRPpRq3F7#yPoGPPVNX<(W4 zjk`G}+4bmGOr;#uA&d(3AOOML$O_bDm?!3aZ@i+NeZTcV;H^s!`mKKj-rCaZEomv* ziOzViy@fu~V3JT2>+u8pa@(#;>o7jV@g*4TFkI<}xQVZcLK${#j)P~fM{hCM`8Yp( z7>VI=L$L6Fg7qi1iDC!g65Z{pB~h&MB60#x$(EdORT5UQ8?DAoag$cF5z(R5D(xIk z%HM;zO=_8izXf{8EUg~XrRU_}OoF0Rql9Vk|-*<-SM8ZXYRK1W*7 zDB^E)J>$fLf$Y4-&Yf?QJtrsv$Uw5AKSw>$D$E$-9HSF=OBW+Gs~9Oq4_0e{Yw7+P zJh%qtN%5`VgJ)r^B5F$kU2$>s@nSB6qqpq^q--!R13%^p4e>>2F^PBsFacdDIWU3n zH{5M*DN-c21!OeF?J}8=fl^ppOK<>aOo$H_a|#uzj|;l$*)kOP#b{Wa#TM)^H)sZH zL41SZLShpz^+ADvASS&6llS05KcgnV$03g0Zhad63a$~Fri)V0zSuO_c;{k7ok0RF zV9(1Cb!yV+b-xZmvL@Q{IUu3I02*+KKpCL1*VzHO7d^59F!^(oX)Cot9D`$|`7BT! z;>y4}$AM8wU&zav^kh`3YxHEWLFRucDOMawji`5;5D0>ftnAd&a61%)RQ$4T zRhdkmq*{S~K#bNwbVwWm2up;ko#b1P(kEVsPMdA$&RRU#(0y{1?7Z$aml0OxWQ;i|!RJH?v(w z3~@$)0W&l6#x(19iUxnt@JS=G-d#zQ-HMpl6O<^9v=so^V;=sSeu~AXT&t| z<&&Ohxb8zb68(klkJ4o;^{h7Ce*#9RPFLYU@hn{i<$e+#)XMZk_JB+DtcF@WU;`eG zA<;pVoJE~1PMw$DT7wVHD8P@7#Hx#P0|C@a&}0;=STlk7M9zOm_Y4MyjA1) zs9l#VL6LFRfyM4-)tH&VD2-VL%P!Z-%hYJp1MO7CK%MN306L5badY9W-2hCfmjPEU zM58;0fEmZW=(;B0)wooI_TAesp?(feI;SJr%^5%b zJ@j6|JQ}(I2!N!^ei?cw?Yd;b1Rx(Hi0RUiO~S4E@m9zmv$@H{0YZm{dRT(GTla!VsEJQDZFgtJpcybb04auGi zRH^(069jfwW-wx6FUv9QZ<7T zYG#%I4y?@uAUPF8Uy2sPWn}~}W!W2Y@NAJ)cUq0+B{9`lWY8P+NOWBN(>Qf$z&CS0 z%vD_d#yTssTCqMkPY*Y46D-(#CM~cdhi^pL(L8v2_v&>W!Jw)f8VAChtDq(+gf>JPm z4b=(3#uXwVg4p0vxM0Ik_mp4{$|PD5;VRN-v8Qs*wDSl2`6rsKvosgpl{TwXb0tK^)ehGZ}kFvKYfg zoCvh7u7?lA7W#ej(h+svT1*<5mSU=IN*KSN`o^+GSSovRDd7-Kr>;jVE?SY2sGmX* z)?$W>s3RF2k79`2;mgKP z>LFgdJe@*FoY~Y6CCGys$xYD7F<+lsj7=~I^oJb6b`LE5G5{z7u!hJ&a6&C_(L+=& z^o`R^3u-ZSEqEwQpaq&nyc!`afPMW{0117Fo*n568Ao)8IH4lyc{BBhAV1d&}ruojDhC&Pv zYVdez=$kzV2h>ClJp2UU*SQ?-cuvI+R3Aazn?Nfc<4Do1BgQ zz{A8>G#HzKYII?fE?O=qG^nfvI^fQt9^ZzdP6-zBJ4}TFhSYVxj*RYEvpTz-?l?8L zD}lHN1`2!$ZSyZ(@W46T%+UTLY9)=bCc=g;-CE<8!}-8C2x$0H8<_gtoOR9C1x+Nb>Qr)(`g}LevA%Wpf^d4Zlp}HA< zp#f_562zE^JJm->v)k3feX%Rkq;BVeMwYrEzY%Ye^Ae>Cz|i0aZ>;AS&c7>Tu++WA ziwLk^0EAJj9ddp8g%CVuNRzUm45OkkK!3f4CXd7sl*rpCz(lljZ;Ur=%Dr81N+RKi zixc~6*z%&_M|v9tp}JkoYWMFX{~Jm=s-75eYv5z&WXx3!^&AkU9rg1iKweT0hRvc2 zsTPVu6MuWUAbL7hGh7hFm)KAb))94@TU6UKma-fwqMkJ zTD;U@bdd~^Tn8*0@(Qg2(V!^%ZQhjl#0}AhgTv zh}M@DgL~y`^;>Rga-nhpLp?UAwX-xbumKh&Bu1uZfhd}0iK{TyMimVY^Sv!T1%vK? z9_mQQD0zC1r&6W$p1lOv1Z+hsq|?F`s5ijnhY7RiJ|tx*4~uUBz!$ozTl{n->X8Dh2FUWmiU8@NHW&9ROe0u>y#x1`2{BxsFly-=d!YdmQ#X_quuy))==FI+To7u8y5xE%IrmprJz98KvG{YFzV| zBpvmcc##m?CePBI(1UWqvr5$s4bn{1Wg6iaNtdQRY$~px=c(l! zxZFkz92)Oh--1R5z!8CE=CCeSpHUPeHlsHrb?_I3)icmUy}BKDXNxEeUF+)&bF;9s zCKpw)t7v3XehU^REP=eU%@PQlVi2{oz@x{ck>6;j4NHW3Ogkq6+B{m5n7NCwtgl`W z|Ab6Z8RRpeOst{OaH2QRoB`qk{}zM;=>khPv+(BcFD5_nqy&wPbNK*dO_I)5t?+87 z@-C*R)7exP)N#fm%EY=2ne*XKK(7WkepL&k4Rt+8-pD)3r1`*ibgYgcBB2f;bg@BL zTQ_s_rHd_NHn*`|@|RJl>PA!n_QMB^(Hd)gm+}CM3lQAse$q{zrgLWN=-H4-vvldV z@O&ebo`hqT)evR|Qw7tgiF&>4)Qg?UN%PjlcBu{?nMhI$h#YwO(F_#>0o^Q-mevdT z_3P3_SRmd;6;Umwp3>Ae2B9#74=FlWJoST)Ocf*IUT;vMPLH;*%W9>FVzEZl&z&xm zp)N=(1Wo}W9qUybP&yE?ibt@{X@^G6y11@WuFDV@qgGSZt<}dO_;)hhXltktok*H| z1H>~D$5G&EgPwVb9tJ%N4-vqJhcrPM@uU7^NDO)}$y>H|=wb-N8MvFA041WR>YzAu z)lHx=rCwi`O5ts}qgfXriOjadx79+pQBQ@QP&QG3n}$$`L%Vd@(QFisvILhgu%t;S z5q+&2u<0zNM-XyEOQ3M&ay_h8S0dyU29Mgcj*RzS12aJW)j@&`f#;}iJJ_<0B{jrk zz?lU|8_F%GB9*K{EEPv1I^R5Ofvxjwh;#xEjd|p%@50oOQr;shH;Jrt^s(*w%XCDj zM|kdl8R|mp=;qqk4m@I-M@sBiTQ4}nM*#!VM%)R8{zV4M-fkE{W+4a$Gd9?C1nzF| z(-HUU9x#2v2l9Cyk&njYeG&kIq7YA1TMZf*j9I64tnU(!B`n=SRoAHdsi_QAXuz=H zzzrw^JFsL0BL&a4GSEDSv+Fv42@m=;DtQyVDI@&Q8Y0GC5>DgTCUui-Fb1U$ zQ>n#T@9%uqvg3!b3~y=_u8OpC3(V&4tmo?9FM&5r#R)jXX(nQfev^EcWZsO=)+MRk zFjN(AThkl#!1`+KUt@ZMEvuJ9P7U@nR(m%1^Em8@_@eSiXiwo^yh^oQZCKWYS2pA| z)}Dr4&>OHhaR}~cIyTTT@*y1~6yC<0f@mJD3xc_D-aH{@yO}@a5Um0bBJgly%af{Y z`AP!OsBZ_NBBG+u;vzn+eg*LWt2(W zB1SCit6+Ntm8OdCnL)7rI@AH<;NR;&mlWCxyd4#Ox~>a>FM#)eHheofh-PIV3EE~n z(8X5Af&LV$h+-pYcf0c zf-}C4LAlP*fmwy8Gj5`*;*I(gr0C8Xj=xh+(|NU8@Con#R91qg9C?hKS17OXAWDGg z;;5Y*7r`EgXN|bG`-9GPf}&Xf9ji;^vXI3lln8MUqyVgh&?yDQ@+j;sAphcugylsz zEelJ-WaSgV)_AhUDKiBy`eKI@&JN>2M+ix)03OcB2PrYeQ{3!oWsNCA69tTr(g+{} zVusn#K}BR?gGZWDM8|j@x}Z!pbuD;Pu6ipZ6An1;5FE=H5hO^uW6&vRcyKtXZ!E3X zQ)d8N>@RVh4(JWEpTO=R*B#aBO&L!LKf$w-3iU8XmhN|sRGSF_qE1f|o5Ccq(`BNW zE3%4U=1OMY5Jpi8-`jm9LH{0tlqhQHX{@>*dkS^cY)t&~At=taN&W2K{1%gwUA7i#%vndeC%OXw)UEEK{ay z6UyIzK{7b%4hPE=zoXAYR-iCy2V@D~v@9WKtj4KH?hL%MNp!F{)&RMp6K|@;F$Bv& zGfjxUzyhRt#msf8TV|4z=pnuNr@O~Ym!M2&%m~ZkOyBYUwV7@wF*q1!ukp##&xYW0 z;RFXa)5Rj`Yo_BA264_cI($GM!Az{+;09cs(cc5(|b3Muia<|?&wDb^vt&W#ei z*>b#%qDA~Srf}bKj?5@i&hfyA=pa$I< z4i1IMXwzTd`|6wyJ(dZmZ&atpm0C{uR^FCQB$f;>c$fY#iTkJ?qzkDq^jRl zu`ac$`XRNt`nzgP_0B^cJoJH4PmJDv*ftPrw34B|*d%QIz3RPYId0GVgvS;UK)Sq5 zm#Ym##j3#^4|F6mVnyfG1{zsbZKINNmUYM7dbX_v(Hd3b* zt@Q;EA+EkDWQJ4G-XwFMp1xJyGF)+zd5ju2i;pqpUgy@pKSmoGfv*c~D41cS z6g`Y3Af&Zz#%85LaSeH<^)bn}oieD2FfZ=PvB%_gI4Al}h z6>f6zZf^LnBJ+U9V{9t%*Nn>AO!5*uR@v>MvK2!2rUlB;flRUixP(9?I(<*500nv! zytU7QSebO4uVWxr+dX?4I`#UdZ|2aE>`}4IFEZ`i1!L zDc7m3NW=?vGZJT_cwxl{fg?Xe!~x*JwuBOOVYShy5G5?70BdvwqH!!4pCAZ^zL}4e zP7WyocuLeeZ6LLjc~M;niwO(32%^H~)HW=gstycb3~4+^8Ziw3>@5>-f*NQ8wfvv9 zfm(WcJ2uL04thI=(zg3=yE?Y+-_;=oP$%XA&W}M)Jp;&hg-AY$*96x}s*$(CFChZN z6+n)cc8Ebk{%#CnfJVR_2+dT~{cxBBeyQcn;$J-F0n6(5U{eWoCwNI|3O4ZXvDjyp z^*c-?u=tY~fCwV0^?RYv-ZW9`Pg?fSnwv~7J1t@s;1rx)x0#L()g1+Y)Szzh5EU{wSC>O*g6f4_V` zL)#C5R@m2Pm3#kYDluSb*g$j1+IE>7xj#gIR%3T?zPo@&mZ~?wA!2YL<*Vxv zSyY01&>7OQOI*Ef_=h1i>q+^)%|-sVNUd*&sjp@Vm*~rlBEC}VW(jZ+J@u(}ip|Tg zqoPs#0GF>|94o(10 zsE)8RllPk)L=Ta~peaSvU)Q1#zVW~fcz2`)p*2leOFMtKw8Fr1#J1U>)5JMO|DsZr z4wj3lH=zAV^r^aW9sCMH#5+j4CIA(SG~iQjgB%G0+>Kv>Ny+67tIX+JP0GEGr*AMu zoDt3@Q~K0t*`w-=lMT}aq(uxdR>;d2ujRf!pXYlHg8s1Je=HP?Q4dj>gM#4N5%&89|hpCvUj5%i%NT zp(k_k+{Dr;_vg%pOlPBN1TwHVf+ZqH?L8kiWzkv}&MFMcWeMynZ#&nGRyYZ}`DC-f z8FCRTW*l-2qDaugN{?PMf-c;Wn}BfRrHvy1hltMy%i*w25=!5#i?&IWRu=YvfTXEh zW24ezk}#T~&=wAM!U`y~+X%!jri1vT7$GF*W*e1S!d@UHffdvebMX-a`K$7GON#v3 zq@0ahh{f?@#Ok(nJB*@-9$|qt7iSwn?jii2J*3{+rXywiY=YGWq2J0{4rt>CSeFaZ zW$OXxlC`TRK~V9xM7p7hhd*}}kS;$%6-wQ;6uKlfz;lGsvDvM9h{R??p-a$DFX7oj zv<%ipQK)sIKLUz$Y<51j$DOK+xp=a`tPzSyK%EEfIJ)5?y&|-!{`HE`-V}_`hGd{R z;st1TqoQjBT$(AY6FYDISD@w4S&f=n5N5*vCdi}@b!F77V>=%R<#(e4>h{$*9uWQL zPmkj)eJGO~kUYU(DlC2(QT&Y%m{@Gs1>px)jn&=Z-JtKJOaR)#VeleWii7NgUBTHY zu0w@D9zHirfl~M`v_Q^er|eMNsnb)UWeyjzNAJZEsIFQiuY$WesuLOkdT`U4MqvZn z#RkBNCwBzqs`EO{)5j2OQG7HCZg0kp8@9F!vKg)ICCHCLEvd%m4TL48Ab&m=J4R(Z z6B?E6LIqg*edpKKWp;I$=QGpA$ja0D0bml18IpZ|AwY@HazW4kw~hC0`!(KAaI0Z? z@5gxGVYMrwe;#lIZlbnwi>CU=LOJnaYYAeo=i=Z2d`3q^^s5V@TQRx@VgXAc`;rQn zwAlZ)FUg<+k|71b04DOmNb5=lzZdGHr?L%0iNp71Q;K~LACJK45jOZ?%8M5Hzh7gJ z&-KRwm?w4A{@qqA0Vw}F2wqv7*bWL~?a?;vFwT3A-&hGx5;EaoYr2bzMVXV^ZN(10 zZXUVonZ?yW=w2fnYs*#w!m;$9-8z1`g*vn}ICB-aj>a1xI-q0TL4;R7dB zAZU!wsptgU_f*kwq!E^Qv+L02_-@&>a@#I5TwrN9R*`sj)U^h4?7+bVNBo6|V3T+Q zJ89`jAo^5|u7V7crLE5{M$`?qIBbB80CQjizVpyyi^Eo7s#sX|&jI=bl{)HCfrWb< zz||1s1ZKm4CmC?w(Y=7pFF3iuQKc!aJOStDcZvj*1CWr9_1L7lVuQPJ+jgv~#G;H- z`iqV&(atzfW9$@}K6@|5ZafqQaNN^?a{+9JaL^D)TWwX2JD;6$XQd~Ca~5dmEBNpO zgcZcQaxY@v9d&6>+QTgR7hsL3%h!@{Z~%-<(S2>8`2c0PevH?imTwc$p8^TQchl7O zkn;Sz?d}Hx7=w3SF{T+_y%U&@B0dwGgetO8l(0DkIPPH&oEy~5kZXY zO%3*ZFEX4N8YknJ#gkjf89)Z`duw;1unFgWoQOhUoddFl4)_MnYng&A67C*RL&DRF zQmK~CmKIP`cp5^ZCLybBp3G@bQ9-xx-JJ08*pjjolPNsT=(gCgxow+{Jb?D$`Hd{o z&h`okeuxah+;469d2~#)78ifzKM+wAt%arNAi%WPaS@K%2oCyIa1+ih9^8duKSD7`9VBmc zcR;T56jZXhacBWseq{|-0zArE*bs?QJ$iuSy`Ii$fpz0;Nd0pYRhS4Z7APLWgBj+F zbDhIenT5G~HM1~zXM{o8l0kY%m@T!xmsnhx`j9JLTVVBf4!3K?pe2|^G|b~Qvri%=MxY^ZYZrTpBuNAOcDp8u zQ)e?6zkeHcTcQ=_WUNUDGg2QhdIeQwsV!nNXUWM5S@i7V%XzX&MADXk!z(chDY|%o zfO-h|cktLUvMzC%po8ReCeCnw(h?m}zt;>1Q0mS#IK>~z$IoHb6R+(`#pc*Oom&E`T~$cXH1{j(oO@P9+NbWv3B!3?-l3D~elu)y!Ye{_=9*%C;$9C$8EqJcpM14cm^;p=#+4d7^ z=p+G@^!JTLNe%xx)|~_%5f{XVx)C`NTMCJRZ|nV%x505Z7kGX~#^E6uhbUmb7+X4`MGvpm{VDUB zu#1rR!GYN7i8LZbRr--o9ObTiy%Y)%Gm&_=An}zxk$9^h@lOVccYj_azLbH)FZxKN ztmuuz*D{g#A!6qZBiIc8OjP}Q)xjch6Uz6AM4qqJzlE`(u!YKD3$^GfENK}eGE~GM z@rDc}{w0mX8w?U*_K>pnhWz6Vd=^2hUb%`a;=Kr2L?&r&MmLoDH#Rk(f-6^jPSX4* z4&o&T@JMsEk5#HWy|6lEw`H(T$_Jr(%%NMf<^m*6Ce+utsRX=nc)tva%$j;PWm=J= zPtEdCfQxq$0?W@8Y_Vi3_`SPgS#NtK(FRuJwoStR?6&1@;614!aR!>d-;Q!0@`oWt z8lUp+OI;@No{u;*D%At4Dmr-oQKa3B4yyeFj)pbFb1PgdQT3;l2TMGiDBmaXRHE{J z@U-J-m>O=4scg|`zRVDhIY)&v@Kb3yt@*Y`JAbvt~(7_!%Sl7O#$90Y5=A=;DvGg$LVJrM9Sl)+7sHU@QBO(XP%f!H2w0}MUv zQ^?PRLLS8#b&mQOJVVe<5n_H21Mn1H^!hCu10b@AI`CrzP@jY3EC8ckK}!SG-RSWM zoD{Q9*8O6daAX+*p|yS?#iqwp5>R*)ki)oafMr^Yk|-Em@m&E4H@QZuEBdQ;Z<0>0fq zMfMx`W=dkY+d`8wX`T&g?99r=E!?G{H|;Eb9$;v3*U7ibPvy6#=RMwrA;Zx~_NaKx zZ@TTAZQuCaAOMaH$;JtfG+dD0wlXx_EFG0Kv}HOMrZOywGOV^l@EsI+dOW~Y=#_JX ztG)zvnWhT2tS`c8XZFMv9C<6tFeoKnEhs)X?SD%E0x<ibTz(ua3x?|YVubx~|4cC_(L55+VyvljW@S?+X z?5jF?5uPD9&8)gW(}52u7waNiLWSJ{M?=J&j>RwLj}s4E-le(}$1$9s3lG6F7=Sbu zEJ6_82?8#u$JSo5bPSdVNV8~TN_2#4T>fL1&G5spF2zl%o?RRwwP8`|^ zdjLi0^4qZ^a5Z}{R>lm+lklVRrebJl4M-{2Mt)d<`08*b5Io(;y4Ebk;BfR(NHAb& zK{p;#kZ?tSQwnZP9KFl|Ra>FiWUGIyYmsHgYk7xC@DgPAQAlCri>K)7oAfcYt=vP( zquY+*^BO$S#S3)VTt1U17_7##&ghGHvVxHJdO-d!Wq309N}0Q)cC2$Fa&aO2mi*Yw zp*)GPP+{N8p=xQT?%&Qc8SzjGRRR>tJNSuul#WA20xb}faLgQqt+x?%9@`nqh!0{ymWeRa&2fncT_>LW;}Q{= z#p!FPbux-aiGXrcfcSpgX4lkUGc)5%*3@cwYO-WImSkhEiCT^|4wgXx zs1)r6^cMmFr3rM2w8oi0D-FyahjnUBmiuvX6bB4$2GDP|TM4>A6dK(q@XJJ-WllI7 zar&gIz5s?{e1@u0)<`y{T&g{?>h&%wl+$ipvNsR*4t!1AJibJiLy;4})QPeX*sBlB zH0$96eLgvzDQ^yR!d7Efoz(((2hRg3bjhyWQt0M>gu$!pcrx-}eDR62GF3#|Yjz$= zP12+^F5qGt2PWZQoB)sFm{%}e@V#LkAEe3+f1xml4%N;nI(j8bsvo;uN7^fsb+!DBdFR>K2HMG1yp)ViLyKXpX>ZG01{dF2jrml#3A8P;w>dG)V89pt6Dgn?R*JAZUB?%1&c}%i| zPd8y!AfQUV(}hpXB1;azsx$9AX7+iahDI<-E_iV4e~O*y)Q_=vQ@qtKv15X=>)7uB zFF3y30G{5aN3P-tV2N)q+84(OCWI?SA&Ew!dI{+yG9G7J2^^g5st0qi@QO$F#5o*< zH-_P}d_by2m4>PiDk}S94AsaOcIz@rT&L+WFlrfM3~7M6u=Z7C%i!}gZNMQ^t&bM- zjHsCUbS>QA0O2`Amd4bB>!|=f7fLaR_QCb?bx>^BEdji=PZEe8wh2{;L2Tew(@AX7 zjsm~C(C>V+?UlX%h4`WcMUAE)*uhkRk=?5eyzEtzwD|?vIou>i@l?Jqn1&14NwD9X zMhI}MLy|mV1F(kV4nqN>xJ2e?=S&)^bp5?0U}GJ|AaqtD2|gyGRFGH#+DO1T3o$D5 z3{c^ql|+gCPt1UrA^si;(|A$$g|ULCeuEVx2k9E@FXA1(2o99SoyW08bUKg1=2D^= ziQAPK32%O4)$PnMoaVNG+E68I&h3(k`q>$Hj^H8l?uIH!2#4F{Re<+Rv;fP{32%q| z?II~`UKI|4$N+ELFVXk{3c!Cdi&I)Au=6u?YqN+jXOu1+VgwmgCW->APcoc-7M%%O zk7iS;1q7%zyU6bEW&p8Ote(p+)rT8lB@+}tAoMBMj^(GpgC zmZQ-&fy4?^$~aD63ErwVswWpxn?z@l(F2yP##c03LTdSCI38&be_2O1bBU!+_iNQf zJd2*;n{d+2R2_L6JzHun6qgHCVAmocOngaugpz=Z$ZN$JpJVgYx{5JJFYWrI(5ENTb! zma2D(Q@BT+UtL6L$7NQMHAx|iOhQv9nny%^e*arczjzNEVxtz#CzcO_~dJ6>g;h6M~qP!W-uNxfnEB>OlYt z=WKASOgvAj+pr)Uv(GLr)JNh^*o_V(WvQFaBWGZ&I8|&M7m4?TuM(758zt~g9MtYu zzI}72ovfmWnHlT0GKb{txH4(Y<3yqfXOB^gv~Kp#k{sl25zPFPdIA_-U8#kcM;f9Gz~ltlc9AJsnaFY_7R@wWm13f zdv-V&5l(zEyUW{*(syti$#$+7eVd5SwwCE4wFdhqPQr=YIM)ZB^rEF`cV(iCu#)mj zFV*Ad!DOHS`l;y?F>UZ59m0WIlG_2D)lnN-IX=Rl2CUXOINu$MxHxKKrA{nC^;QiS z5XA6~GXLA9L24l^PO)Qr(r|x(+hc7S-(~=o#6<%-8UWS!G(7;!>oBB!!S#o8h+RZA z_HWb!=ozdNnfJ;$g1La-MI@q>MLb-8XH%La=+T*taca`)F#JIJw_tqKRJED2_13?xt;y+j_3Mmpe1Cq@~p)HYR41{*qNJH}f<@*ueC} z4tj!~*g-?kFfDh~%24KJY_>&cY(14_;dRguF9_N!A}$AA%rgYYE$4gMGh3QVYR5VR*s6JYVF z7Nb*J`DhFuX@%bs+U{b(*g5?FVej1otg5O%@N@3j_spFKFf+U#Dhd`_JVhnTbbvu7 zff;571w*g%xC0~e;@&$v`YNDcYHC8D;&bpp<}*r6BvUj~)HEy~X=X9^%(iQ4J|&xW}MJF z;e_(7X%O$-ctxDHR%akw3+{Sv!4E|NJ_6=?Wt0}21-9G8dC&mdS%J5J_jbbLLa0m! zz2JY1)wg`n16I#`l`Zv$H)lI5;t|I@FPlX)fcsrAtoAt?Y0k*T649WA@QCmo5kBY8 zkL`ZyFr4ysyl@&m5RMpj;V>>iaB%4NE9UA`U1Az90ClQX|7Eot7#co46F+nta=2>e zccWbIu*6Qh3WM#kV}8t6;4GcnSGH#Ha+VSzH;JF<>-9A`8U}~c5)wACPt=iL8_-Z3 zI^$wKnp0=H3~BUgh@JPmGnbo*WCBh`M1y#fI!{60sp}=KK1@Pq+ zY~D&uFkyt|{s3`7WOs&hvgU0K)BiH|1~d=b!W|C=v=?erJ3j zzslP=4=!u}^LeL(oxS|uuf{80_yl+_99IXWuUn=A3S2Uk#PcwnGjT)}j#vuHt;O53 zjyN7Sm3ZV7U`6dw0I|1hH6`NH4OHZX-mAm19Qz5I=zEK{ytP4S9nqGwxkmrIGE9im z{SVyoc>c}YFNgohm-7fcq47?|!-wY?TnFe?!KIM@LOSVq4S}h~s4iDe7}-B@C<&og zBy=}ZLjutEw%1Q@7n zlcd*YEw3kfcnPLr>1tbvc3i>%uSKwplvz$MTZVFZj;t)M)=D zW^VVt%FDO?U+bE5o!ra)mwQU(*6d`JD}1@k^<_lg)|a_|l{td#JdvXNw4Sk2B;Jaa zpQsim(T#paN*vDtO z$V&V83_Sv9=)8WNaE`{^Va|l@A@)LU`IERSOyfu}zPReh2I8A|$PV*e-in0>cj#)G zBmR8S17ImLd>#)H@?&>r0K~^r_C;`abjjz#-h700@JVth$i#bf+A2pz)jXbp52_Rf zRj%n49V!Uw6a;m;fywE~^$v%@MMUsuVE&L{(N_^F;FbXvWVGXWA<0i6l6cP^wr@S} zS=?h}53r0o1DzN&Rx_NK2R;2`gx=R7(Hldu=oL899v*9(%_|`G6#+ol3A&h`-I!Pm zZx4HJFuoy-4=Y1C_WWVxeENL+crrhloQGN$;(95*`^yh3^Fz!0sIq)W`HT1A%fF8N zsl}&*U4BzI#_uJ2H=ue9-8pI||CF*|1M?R0F2O$|@W16D z-GM)`AL38qe%?KXKQ6zB?7q%Fg=pp+NqGDovBz%|=N-Z%JI^~FcZoas=Oq4l0eK0Q zCdTp44phdMR&jR|ll%m7j2}MEyBZk8TAAd>pFP=CJlXC;ZiSF@Qt7y#ccF(ZZvRxT zl{?+Y)t+&DMBH5*$NNdoAiebm&E<{U;Pz_Yd*fU#3s75s69W>9Wo^EnmKE*mcwHPe zJzRQm@qYb)q3gW@?=MdIn8_<#Rn$C`TYs|8!N>l2njR4X9`x{zGWqBOA6uO3wc!Mx zhcEcL9v-=Z0q=bmydQTKqL_GN_E%7ANMcRgosOnBYAT`<$BOHC3Kibpjb^|4ABv^e zM@S~}^FDx%mkQpUxO2})G-2bd>Vh6??`p5u0L5Jsz^9Lc|gfYK*u6&3--@|$ZO7m+Z+FN~xpie_Mo@2ZyOah%_NQ?{2 z`=EG!;+t5JG7n{OytLs6yzZSz?;E0K^vXgi2tIg$ZzV!HJjUcNaW4?(#RVVn#s$2A zO4M6Ly!^uW0DhOU(ECB`0#Nl3@5%GMkJ5`>r0~$y)n5r{`iiVbMBqrD zZ-Qyu&hYvng?Kl=*iF*oV|;SO%O-KwEjd)5y?I`Ui?iC@e40@ubabFz~T;$cOCY9 zAdUI@m0ll9YJipedEC|%8;TQJF?>iH!rA{u2+_zd<91$rEIP+VC>DHprD6Ua?0)i% zlXJJ@t7e+vdN+paM6yE60Jx5BtH_+*{64IU*Q^Q(vY?gl>u`)ChHq%`k|+f?F`Q>` za_Iv2u{f0v1;Aqipn@=+@}MGpxy5e?eHcH~fS+Z+ha>vSXCBZOiRw!cMvJKo`TQBlBS?*Q{ojLs zeesaQMB20hJjatbG47V5i?>AA9ceJWLQmsBnm%JMIws@sLpgo!)(L!r3%ffw3qBrsqAs;-?aS}(ExPXE@{Y5gG zCs|<*v+;r*GFt9gi%WnJW66{F5>o5>@z9a`6>=JnaO2ZJGK+XpqVwPg0DB#i@}7!} z8XqFlqsG-5@0$@vKzsm?arfUxrv!U3hAbz>4~sDP)?oB{CIg4hA}(THycbD?J=)e_ z1xzzXa^PVAXuUQ@xA0VycuSpgwF;by4dJ+nQ4UC~Cv8rQTRCV1w1`px5NtvnOkIgi z5rTNKM!Sb()l|iMCxZb|>JA15RFz1Ze9!=$M#yvaeklD1GBU&kEr%L0OYR5hv(Q-! z+fdhk8N?hIFD}OlG+sP3?%slPe`9!;kNq0%;}uVjy9@bF+<5V!q&#fF*?%>*;MKt0 zhSGYzLFxf~4Z>c6fITJPGDc>sJLsbI3Z_^?Hs}>(Th!E)N94<< zPs`>D;bl|q_W}{c*u>J%;&go~4v=v=h-{DN18_i)cZVs=qjr3OoMWNo z`u`f7&oILdGBA8D(+=$a2ed!)sYF|hNk3VhjN+mOOFmiq;)#^_R*2OyENRZ>6)Nky zI4(@Be+{&C4{9F|1Blw^HpkfiT&weYX%Ve{6&9nEeVm3+h3FK|M8UI=C8P8YEV&07 zEE!$BWOUb}HjY54CQX?vn>f=azO1-vqbTGva_v-E`ebH!^5??Im^#kd$! z%JQw&rQYXI%l8f+qu2RzmW5V=tM?MRi*cNH=6S*RT)0wFELu-Hs@T2n<{o_p4+4nB z@a|9?$G6K5M4G#S`7{Zqv6KOy!*xcPacF2>bG^0CfR0uk2!j(Z{n@~;@s>tyb$}wG z*4;pVieU>dY>kc-o>4z)3m%-2 zM>%>6mGBi&)|AMSvDj3Z9({@pvOS6Y@xU(}vmcV5os2Ue7`kM@Sy_)rV&m>U#C(Y<>{7QvbQr=Vx|l&@Ia0R zU6{aoL6OlLi-rR)l62<)32EOvxdp5?>#~SU@B$EzccbHIVdAlbn{iOx8))Co>)C=C*8;lWJ?2pzG8otIJO* zpIgP!=Jq5Cl2UVFU1njjv9rTTW)`-mv-O=#w*IV&8TNKc<;oGA4**>sp$>k#drN3fzEqqtn=0mtG{TESTEm z9VsW1YH2c~Ygm|SSd?sNY0sn@o$ATSnt3xPSI$UQIrTs+lU$l^&Sq0>tlUtW?o3Sq z*)WpHBy-uUdCBUs(}jo)b#2MI^ny$>lM-5iZjGr-L%O*m+n#2PR650;* zQ-UMtn_-Q%&ejRwM6$W9rMWF7Z5rC!mVoxB%$hTN%J}1lk3VM2F=NIJAKlv4KDxcN zIXk)~Ro67SDP7l^8r{*3wy87A2CyO&mUY!SKVgK4b72HBN8K>3t|em#4RJ`N(%?f&Go&>T z=vlSZb809-sNUSx(9+qMO18E)cD8_Ql)I*uWR`rE2DS65%BLo+(2aMJl!;V2`=w6YmBK1MJj@EIjQkEDKp`X$~Y#cY+_F8*ql_ZZpl?GlX7Z)N#wYqvYg`Y zRM*s2SIjykIjgdK=48#jMXBXW+tZE71QBy7eb0^fqJOR2!S(oOZ40mX~}e?8lXFp zm~EMC#%azZTk9K=ZKx}4WNt#w&UY@L&IkS9fMOkh6jCppvm4N^O?d8p> zmPT-}1-fI=Qc-~2Wr(6p6fu`3VD1O=K9%Wg$#$;{36SBna5~DL&bCbRg0@uSaLoJe zwL3aR2{lweB`g4Gs1mi*JFSpFQHbSj4egB}p(sQ{wV9Pu=NP)RWur(*ImD!9dRcXO z*<{oa{U!RTF4NH5+|b_I0Wyj1g$n8HNY+DdQ$PbsK}wfE8Fk0Ct_2*f%L*wnff{Y^ z$U+#v12fH%RHxcr1$Ekz*>qiVi<4|>2ASI}Et^41nLAAmr>V?G@D?f}UDvk2NC?J4 zK4K1m0}VCHTkG3fq`Qvx3?!?)%?i?-SyRiW*#y*1xszNX+AZ1M)I?=(NH?o;R=EQb zEL`F=&@uunL=_d1ZS8F$#3)Utz$*EhMH0u8=Z0xg98y zptEWxOsjx}txq=AW$Q%KX#<^Eo=G;5BDq>7*-+O}*FeM5JsD|2#O@M6semtqfa3Uf#jy0StfH>J2`=J6V;ZSQ9g^qs!PK% zq?Ynldm6M3jpQ3yId$HwvY8cAXd*%#UZHhgIMX@7wKqa(a4O*HBy&l$AJ#KL;W=%P zJ}pVqXEaTi1mu;_LEEWZI1#H^Q&m2tqKq@XVp^?bR&`lzMI~%cFxF{M=p4wj8KV8F zoCeH#@ZRWgY7FT68RfN=LXB{KL-HD}wnwenGDx*(56uWI@yU+nMkCq5q_3xs*q(-X zIivWV>_@ zBO76)EGopDhg^g{Pc}C$b7VarhRBd0SyNsPlIW&L_DK%=H!ZU zohqMETcfSnRLE>c9ZgdvXQ40!lcge?YNcD&Y(Z$GIFyhGVuXYYq7$qnLQ^!RmT8c} z{BGoLZlm9kby`wQ*<@YgIh`3I4T3J@Bu5X@D5s}3xDzPT)XuU0fnc#A=LB3*4M5aL zV|yq3ag;T;cC;ixHtjXSSY)!aS$23}#hfX%@M+-?aUMf$U^wE$0B))*y};;`x@AFu z;o|hNn&}bw4%cJ!f?x@BHL)nusw>ZcbcDV{Qk%Jkg^NT5h|S~b4Sj0&FUL8g#Yj$@ zGi!>)dRFDs@~Cd7&s9BH>=>yrE#kl#XB;S{(&@JLq_`fm_NW+gvQ z$v!SvOm$`!HaDTPMwav4HB71w{LMggv4SRenwN$p;;flrhYHk5Vr7hnU+H zL5Ik)5Ujn)p)7{P$zhk45$Yi$i!&=v!{S1?1y$c|i8QmUcFJ^uZY_tSm`Zb{Dw@O? zyeXBlz~64vgh(yOE=;yIXS81vOg_$7hn7KnM(_*{ZZg?K*_F9wBOp+=aN)H>YFR9V z$|PYTAP2!W1k|Hohq)jK(WOvk3bT484vFt!8TA1*O0}B(z zfrL)9lc*3%m;|yYFPP@dP+D~zrWaYnJExV+fSVtv)TFl6kr>u&poBP6vQ4})z!p{q zo}CGIb;CHFVq_#2k+vi}0LhAwBuRWVj0wigY?TQFZ@M!Lp=s%CZPWUWnvOV#hPEuS zk&bZTZ*#`$K~d{L(~=>_O$1Azk2(?kLNLHA&*{5bXrc*nqXy$qQ+qmEPvpi8#!t*G zJyuv(lWLKO5^O)*S1jNgFr<2{6rJ+Zl2fLaPdOFBndW#%wwb1q7LiO#dzRJ8tE(%k z8N1Vv;G{6O1|bi4qz0}7X+R_)2Z{vua&kI5AYUo^@(eD)2Wv|$(;{YjrjpgYNAY29 z*a$KO-71S2C^d0IsR^jY+n{zcg0sXqWQ-Lvrjpf-srt?ZL1eTIQ%o4nk-(Q>8(B(5 zyQRyn1C*&HnDLN&n2%_Mx<&*>%wPy%%8c@|S#v~(S&V20a@ufez!^g{6G%mBNm_ul zP3YEu&S}_>?Jxu1#}Qj49!s!1F{C8;W;%-02~ngovgoGv5GFX`*mSgSY2Bg};s`Pi z(=sZ={3>T+fcA3QGc6Q3oAkDcT0+YCZ{^`nq(w8N|~<#3dy$ z3WO8UOS-&h0O1N^zfq)RA~ISL%@h%cG|DXvT_FylVk&|s7;1AnQ>Rx~)Jh1#FklIb zvdu6{Lbk>UAW}|O5Cslfj8+r{OT|o1Z5uUWzm7Fs+?0BV9}UU z6XPO-WL%oB;8fjm#|S}FGo1@!LTPC;$OGS&_IBY{sv1%Ny6J&LaR_{GJGDW100Lnr zKyHCpRe5zq<chh7@+yS9ms<}vlq_e?2uz~5u zeh54W)Z?J5?I1WVFt#b#Bqp_~5zYewQmu8%oaVOnY;)6c3=bjYOf%L4jp<}drk-$N zei%7I_5y}MTkA55oK#0U^oGbcn`=75D}=pfR1k|(r@X3i#*C`!3I`UyQ+8o8i?RA| z*Y{btC{hDT)#%IyOe6L?!D(t_;7a0+k@`ukHJyfq%`J_oB~E)=Ln_(8C706*50HBn zOY54mShH)$)l(;z&6?`KgMmVuJfo5-zB$>6VqhewJBvG0SQ?vYD(IYEJ*%>MrXza_ z$qp<6I7dMQ9XttWT@P9=3I>CLVdI6-U)0of>d=P?(8=<10yeEcKN1L0-Ogn!&ve!! zf=~K!7A(tR@y|^UL=2iz;{DURXh~tRi;e;75YB)|e7Q78i|n*}@PG+_PL*4ZH{ty4!8MRn8p zgdqn$jj0YS=Liah4LnAu$QaS)1&t}hEToo!7awm;$$OsOA!Bp%Yh5juy7!Y zjPldCKVppew5c+J7V@xztBC+a!{Q`G*=d5XwuoG4iWsghNj0FHs4ak)Nva*S7#9UB zGYe8#Y+=F}k%jF|jZiW$uFz>Fi%=mdn3@=7+5wu)7*_*lN5DmyrqG4U;ZtHB!a>0% zXV!rxT%g^=x_WGoI+;3h0U|}wNj7KN8zvkBOw(Beay5$;cK2-LnW5EZ78^}9%Ow#Sk zgUO?9Cy=%U08jj&@yG#7SR>p`88})PH#m%qFj81!N2Y^>SccFK*9IAs&}M;*7g5Yr ziI}#c;>7D0<>sWRISpC4V?YhoT6YdM2_aZu?NS5Ch@uRzda4))xv!W->d*#(-l#8T z5uwzUMH**oUD*Y^b8R(2TL`jYAeyzp;$bWpC`cmmq20}7W>K@~DV8#70-RE<9a->- zD-lsuWpipP?ftAuG4#+|nDSZ!0HsCEur@*n%n$UY4_eT7LJH$zY{vkbRarq8)8=td zSd675ZWJ(F({w4-v7DsHN~H#bCgCF`K|W5HfScidiQxt08gkB|)7UMo14)F2)3HR* zRU#6hO|Q11!V2)TvjaiN4otJUY?JJpM-8Z9q999L$V#Vd7Kp(fp&yy338!5H+z{QX zNSa6>2-J?ia7P{X=P*ck_!(^XLNr0f252DIU<{9$Th8^sAL8i%4SV3XFJ5g>aeq`T~<5U=qvyUicyV24`8SSWTg(W##>ZD0gZ$hT~svQIc*NSc3wD@3F?>$ z0Y7B?Vl4u-3d&(R!8ON?2wnNyDKqBORGd~$+d1L53CBt~_O7X27mLTPJ=lyDWV`gY zIKtqft~f-gCA4l@djXeDP(xxn+Daisyv3CYxm;5|1DmNbtBoB1?Ts-5aTxz@!*Zn= zF-$!(y9u$xEdsWPQwxvL94Di$SZ0LQ3OkoC2smJLGM%k8h3(;pxEmIb>(w^p;ME{3q%7LYZV_@x%@&_knW8fdK|&g@F2ehIks{ z;7lo-HKlxp$aH5LaS7Z(@E=4FryrV08#z&ua_%dj1w+P$nSjv#Hx`euYJjC4cxxU-J^h`I&XnQv@g+9u;e2w$9UJ$cQ*(4X<)^o&J^ zi1~_xVHSQ=G}dj@#O|;>M`hwm``)&seGxR6b`Zs#lX=9I50(^E%)%|q3I;1ptH5p< zo5D@*q(~OXW?f5BDB2T;R{%-C_^>@l7}A9V&JgG1G7^-9(?OeSr*|-$Fa(eUrUL6L zP>L&N?x2}jPe?&kY<%l=Mkq%*Et6C{+t!Rdqo`dSdW%}eiJ|~u+JKVSGh^+zf=XKg z0X?%6!a%LC!+8du8pBQ@hcH=2by2a?fHc4tHoOZb=8TG2bLN&IVuLwLI#`fq^`lpW zw2Trza6}yKxr;{FQ72iCsR6A8qDrAwJbKpX6{5KB%OkcNvH(j}Q8{IDmD5(&)}Eo8 zj)8STxr@2vdOrBFHWe|)%JRA8Q$)2=kup!bqNJWqSTPF&2BHRd4rdvrI6dF$y%1_A4TsV&udA*k;Y9;EE(r<&SFBq{lZ>ZvUwXqozJ&3lT z6U(w>-2$G&kv_FqB?g&XpQJ9^-b~EwRFzp2QmzbC(<&Q0fYQ)mDb5E@e7(~tx>64y zX;;t@X6P`K4b+G=)QmG+Sn);+S=_>F(0k3` zB2Nh?lM7m!u}ccol1eXuqy+vQ989BjpfohJpl^iq<$P0+0VN}P3otv|xSYie2QDiT z9>^0Wg|P?h^(Jx1P!_AAGbK1}g-FJQ5QG&_05db#VT_>(p|$o!%_$@2LIf>W>=Pjr zkh6(LDK$TVq-L*>Py0M{#m!oshRPC+;en+RL_nwtD@v@zXh_h%sPtS4Lr-YOz_zv) z(u|#9G@%>k8;8JCeF&>iCLqNKD5nt0SJcj zDGoewVJaZPS_2~FSRXEfI2k)EqapPJKSO*j=8zugoUla(Lx_0v;&Bo?h&WfEdgB!ur##RN){?`Zqf`IM-?tsh>VO7 ze-!Id8|pcA_MCET!cuZ@`VQU^j}2(bFto{q0Zk~UZs1JhU=-3Qh^CNLbic_n45=N% zq@OIu`M?wH^iT;~%|*{&tbmmnFt4$*wG|;1qdv3;h{k3`$vBE#1}@VPbTeY^Ea-hs zaXHN#onSPCCN9pf@f0m=Hn@S|S@nTXC#NKotUiYzUaQQcZ zv|@O*Y|NsgQ^w5Tv>6aPmf>kj(J3q|VEYzw#psJmoCQ76CV(<({n=t|HS?;cL!NErd0EJxEQChJt+A9FkKpmzm z-AWN4&t>UICn@MkrT{svj{-Ky@e-bKkO?B5I;1*_v1ze3E)}~0a3K}!jOMUjNP)20 zwp34L@J@+9%zCY%q+-T_N*2;+W0%fidq9jZ);rh+K}(B)ELs^? zMcB~DzL_66(p_B}6lF&Lan2q zLv+|W#*S20XsQVTh_dQcA0@QaRNtr-3EltFsm|s zdWzGOw4jBTt^*;rS|2>udokn^4kR}@Ei|Ay#zl6>;9BuSR2BzW8VF2t+{ic5n&FwH zTx4t)l z07Gxb2SsMzJqUm1K+EjEenXg%21(c$oFD#%4$9`V)qok6c`HooRFgd`fMdVR2;3%GNefma@Gs6Vtw``=qKnU2RU=fCL`*I zb~0nn73t-T951mj0_d1M+$5IqLxJJ68jp|U;tW#D27(=xd1_4`*RT-vDW9NA358$? za#BO0#7LytGBn&dXxoqviml$%(ve$DrkGvaLFwecut!BO=^FKeA^}#GR=E_L60VP}@nvE1BHpbmn* zKH^x*M>D1}YL$bfmWJHc7IW$yixVI7$Z1HWW1dOP$rmZhg*SE~qLE`UPCT_a7D{Z< z*rlm@{bVOoqdTCV7o-`~IdB1D;*IU;vGu6bLRj_7#~w3g!kBSmv2~RhD_hE=CyY6M z%*3$>Zs>I6@wqV#&e+aOdaMylX+K)G7f^N)I+l;HE^JL@q1QfBgU?oLYy)=5bF1Q+ z)#Py#M~j{wy`ZggtVBhnPpostE@)^NyI+;@$Jhbnz{*MN-->|8a&}~LD{|mH(!i{t z4>tbK2+2MzfE7h{%tB{DOM5*I@8FK{)$pN2WTbIoySafS`m87nA&v~;kw|29wn2&W zMuKPj!v?w{?#$z`xC_p}@;=*$2n%myeIPlaym%yAmp8YYYg=|S5NtyV65pBPwbdp> z=OZC|mb`NNj#vE@3Gc*iQ9mL9i@2bbaP81>i(Txt40k7RFM^6I!Z6&@V?}Oc;i~t= z<(4}M$Pr%-S1Ng2G#N%CBGH1BtQK)K54huw{KN&037!Z1Pw|qijnTUo+GY+1kjLU5bk?A4aNkE>qTr7+P(2x|= zfQLp+uiWjujx?eYhyuRop14PiEaR-OxXZ7U2pX zk(lDy5jND+w~|GG%oHL(9=R*S2W*gcU#Whtwtj=1{i}9(uX*kq^_usza%etGh zjXy6db&ETv3)j2iZjG%iSM|ELQMpy>26Y!NFRQ=t@-KB!9GA=DSMzdx{5D*4^>@AR z6SRSZS64ggUGIGlSvRQ7C~=gJjCYaYxSm>#f4o!bV*JA$UU==`?gr&0KIsBry!stC zcq0rT?qLP}Q(NLs#xam5<9IdZe071p#|~u`iQyv? z!#{_i#$S#1?kL)zB6+W}ss1*ndMW-}ylT$T)jORdy3}t`+PfpML4|ol_9Zr&WAPgP zWnlH?3Jka6RKZAnrQBeKx>bu%y6Ait#pk=LU0tE&ys*Mr_f8j8?sT7EohRHUO`W^k zpXxgR+1=~oUa0eNuV?!R*G$*;g7S}gxwYz}UN`p!jGKFZw>QY~-QE}UanDj~`rOFN zrargva(AC+aj^|?Raf`EjCz*A@lqG|N7m@{J;J^c_HNh;;CqISKhCpNrDV3TO_W|+mr_+w&v~N zWk=qtd6vwjl*anJt8-zZ;Oac7q^pp~Amf9%;N$Aiyq)X_ zTrqdx%1-79S9a#@;vKkR?!Xmu7f^3i;`RhMb9(|Gai6a~Nc=qk{QsV~Jl~x!b=0cF z<^))?8TDc-bTjpn#D@t`SE^a+sx67FY`ZnFF99A(8HGvRm-vaaMCbO_=j{UtRp1Qo za!i826VZH=(4DH^Cib9965+RrH_=aUXSIb!jk1=1S3X8`SN_lQfydAD-^ff^uy);K2eg5inmx zPcpOsnB1uQ2%}2v%6}Vd0T!1K)FlKpU$?GO4;DPk)WZcoXBo!?2101?ADTa!9~)2f zKa%Ui7&y|=Vt>=sUnT~uV((ea+()a%#u-Ss3Z!v4kU%g3!G(pORs;#qLCR`$nM?xD zi^pBHgD48%_rj}186ALNp6BY3|W zA7|?EzArNMQs38^dcE(TkP4cqReit3>~Hn`L0`-%fejTv*xG&ri&cFuXZJzB58Hm# zr7VFI_C=OR;i|r?g2G*~H_3}PWABH&*b{rl@M2GF4|q{TUhuY%q7sp-{qn#I=Jg5d z1-u~8{qn(!9`nJA9`i{NwJ)}se)wwd3eWOFt?@4L^t@Q(t?^il ziq`b9w*Ic7`-^Cu?k{?#D4?ghrRX+RyshZ%A`nFC!{qitt^14moa^`*=ZFn%V$#UO zq|b>u?lB)4tjBzaA@lp@!m*+Vq=`#UrRtfY7mNDqX5)uh1a!j!j`qK4Soq&IgwRF^ z2`F%`dfmw-*PXq7(hL0gNw0@{frtvMZq>8>QM$EM8rOz%OhA8Ja#<j3x^vcpf7DPulr6V)y{}lw8TK}&g zaE54>&k@sL65#)Fy?Y8=Y5uC+B^Od!E-XF2AJ*09_q(K@NSwN)-yUY{>G!tDc)Q=N z{gH8N|L^tJHNMyXodI?YPRBd)15~iNR()Kuhu+7YzVG#ootIGW^%dw4j!XLO?uUZi z8aguG?zgEwGB)+Uxj$>(tb0L$^ulQYFAM%jI4hBJMd^CV>-y49`a)x0((jFaxV+u( z=Ki=yJ1#rmi2bp&z=O>Z1i6TiEWPwmTL%1OK!Nvkw3Jzf(V949uaJ%^F@89oN9Sb8BH-$TF1s^}x4KnnPD+nbNg` zZWz>!uFN7`L9urSojg*KOS7v;exy`0g3Oq%p8}{fhWIT#`Xb5=*3TubmFf0dA zofSnv?NGl{fd4!7EzX{A#joJ(xgx&S%pUOKF?BxVJ=DZO*3Rf~f2aPca%wq%`B#MK4d(mcpmGYTtsfw zZ6bajT0E729(gKpM<)aET*sFV)~k*?OYaZFMgD91Z;;sTKs~njC7qliXg~$ z6unU5t=qPe?SdZwpl~({|JVmI_{Tm105bb%@f*d+c%%4lgoup45uz4P-Kg3?++rcB z9Ys%YiT*^wzpSR#+3?(5ss#!7Nj{ zv)2nK&GAK-qCpyWG#zg_iXRia%w?tn8hA2!oT;v zy-$wzv{@Zd7;F37kXsA-99h({fN_7HcTk#R<#pD=D2!cwUdye8>5nX#{vJ5iRqQ3c ziP@>|{Y`5*4Q-N(Qe6NhW1PDBNFf97ZS|lCkf0b?gr?Yrx}~7);pWK7yuBya0Dw@Zk<_ zs+k0`^P<@%fo%R%$7=Su+Fcj)sn)ocbHm}|3lFq%^o!pyh&hZtl;HE(*rRo~X%K3g z`#LjTck$)IIqEI<_a^`M?mpz}mhv|OX9RS?h*l7(bwzCDD78Y`z^+LfJzpcWCqg+) z+~<1hw(4n~Q&gvmy6KdhD%EP@4_(aoA8MSd;hngzGUHW^EHb2HyRoTp&H*u3P2A#A zp=%Ix3E~xIyrMxMLqLS_CVx&qH8_!K@M37P%ylmQUgvIdy=)bP8uH}#3#yfQiHgOuVYY`$}99%4(c*&@Ymk2 z@04>Cn03@5j9^jLil-TOSm$uC>F_47sj1ytfzI1mHSjiafX!A%9gndc&l+ZH)W0R@ zY(4~JeqA0KC&po?ia-B}p!5VZJmD)wL?ii=&}!0&2WmADxKBJ$<4%(nX?PrXd)!y( z9XkozO+xIB8%zAw^lQv@m=1*1FWx37!WbTyN@1OlN{hXfRb6UvE|tQHM?sE3rLzJm zQJ?VV_X|2a1SCJC9we`C6=1C$A<6wyf@(qOw{E&Wf_dM;Y_$naCi(f1ra&Af2OYjO*cV`hy0b zoE9`|S*`_I=S2#uL5Aw3;O$b@040=@c*8V38WCLRf?G{;l3Sab4Erf1@G17)OUoifQUbx#T>mzvUE;;$saq;+&P zYCvw)@Aa*6rUAKW=K!~J7UOPlT2IRKawL{7cWV-Rnsv=D&C{4yth4)cY(wst>I2h0wW zI2NUuZL>a&*;!#W|9%E$`@`STH0p7thJ`)N)Oyp@%+!%4X=ZAe6#iapN`skdGkTt> z!lWHBQX2trtElVI(y zg|&Y&cm%Aq8QobM%@0{?a}8_5WWZXR^?%A*h~TDxxnIMa_}c$~1pjkht}YI0oC0c` zf?1=MvxZou#I2^(OxZ9gEG;k+uTNVh!laGE2oq1uAIKI?Scojy0pM;Sy|m0{t*V=$62)#|+O#ky4W=_<>sv=Z&y4fJev zBmo*H7lq@4e#>Cl%ccS1v{MogjDk_FIJ=2irp6J_*wX*LU&<9mTu{9-SRn#jw5(Pg zDPv4O(vb{pI&Q!m2FNkR`#BAyL{euc6 zTx*nc##cBKj_gvM%ky}HQ(K%8bM^fW_bFG`&~P1pasWVq3aSj$U+>;v<<*}V z6pusk#qM|D+(}da%%J3pkj-TmaCyU@KRYOx1n+r``)${3SNo?0B}ck*)yhj;cdl;o z`=G$<-Qfg>t0#=?QoZ_{)_@#V^LyLf-U%b+th!&)+n&KTIVJrC(}Zo*->z0R1&Wu! zU3}J3W`dv|7V$uNugKQ8KRjsFgVPrl_Gn5>Q)^00(wdSWsZEJVhNi@19K@7tdPB$v z**u6T`SyWKNwoFBO-TqsOo>gxl41M_@{9Mt4&Z%@0k9%{8VZOa`XJX8oU< z5`TC=zMfbc6!yqkQ)*djl9shWQnS`1L)My%gR%B^pMkXv2V`xe^}$&if)Li)Bv`vm zv(`WgSsQ@PbpW4@u7A(xmR}c_Jc~N zW8R;>o@RW#t^_@fbz8Zq@MX7}2KZc))c!nru^EPwJSK%|%2cz9f*=_>1EO}Sc3UP3 zj?l3+SlC``+=px3o1l)>O}x}3jy1d_#3Gy{y`&{(#V=19%~ARA2ZMlhr^^y`2M>!G~+{t$*>n) z0llq#UEdo2Vh@?Ohe5+RYA@o88pHS88)C@6A$Akv)Hm@mKXJ}N-SX)u_BtyEDm;@n zC|L|w>R|{tJf}uD5CvXpqTulCn!xcV1VrPr4J%i6?^XD@#NeSEZYo{vZnpUNYl9MQ zOj>2Oz_juUyKMPy_-;M`) z-;S?Go`rJ2tKSrW&-3T6PprS#Re8PhaaV)HDp&RHSEv(JNH0_U4(+9r+1;*W96GW% zl2Nr@t^$~&9zmUF%2vC- ziJ8K6YgepKth;{2dbMsN{-EJ+Vz0#p04lQgD|-#6>HDrP-oN0T*u(085Fb{Lr~^TK zL_Mi`g!rU-_J9xrp7{G-vn(D52_1JSbquDv zgsDKvAWSio`V#}KR>0*+!5Aaw(E_LhLsytdPS$!#qL5z6rK|S z_&Id?xzQNs=ogI=6*#qcBIxoM<^o%5rIiB#i3pGpXg>l@MvW}BWbSFKYBW}}0qr7g zNM59|!allSRnr}26lk?ut*Wo)D)DMPRP2$-P|wsrs{!;(%u<5sLrFxiqZ8XXl_?bZi zZk1%A{dIW5sO7MDNMBgjlZK2~Ui1lmLyj4FE+0eAF7*}}Dg;H^+7|V`uDFG)upVJ#X@#k8RBB zF6kkpuL9ezZln}$)Q~`)n`4hN<8ciF83IC!rGLkR7Ku|~-X8Ft^z3B+eo*px&~dBx zFdzF7{V+c$8HhG}y$fJ5r6d?ySR+rZ+mgiY=y(X+J>G*fN{@JZdD-iI;$dW;co!)M zD+0_-Ki2JeVwU}YL^ew~UcU|ySBuz)Wg=uF5?#v6EA03?9A(HHlX-&*I)apj=J;EF zt?zQ;$!a+~Z91HKjzlUg1PK>Lc7UX&_>Ef)AhS>mlY|3oy}*?~6oW!zroI-Mu(Wqn zXmB5u5h&0>28{Nt0oP{qwBqzn4n}tZsCmK}deWSMHHjHN07UE5suSiy8s?snM@lVr zj!>vu%jMGP2GU46cJv{Ao1>f&7|;krDfiFEso{~*Csu6%h{FIeCuu3|pB11hv$KDX zVafi3M*RmX#>5H(bATbZZ!@rX85oMqF(bVlb(-B!Pz3`9XTG>WS((Zy3@E2>{7oKzRWv-Phr01^3n+Mw}8P#0^qFlpp(@Jkj=9%}uUdouv(9D{-%)`;U^ zu2)qbkR#rAXm->FHQu~=;+R80kVx^r+)rFlWS`(>Xyza_Kf!88YTf_^1a%65KE~k1 zBVytX*bGL5=3tYsn?BPx`yJ2Q;hce5XWT*ie~0@EL-Sv_Tt{L3W88MUwPQXGgWh5M z^*eBf1y6CKhOuP7E^@%v3iuie9#sE@%h!NdfXEPlH4%Wql4lK$qx51Z5u`Q8!sL7s z!Y0jXCrnxy@t+IE{C~FEN&L&e9B8D$w;9Uu`*%3llEbS;rXLz*w?A-jl*c)R6urk@ z&}1DISv2@32e>0@tNI@T@*Oe~cO#F~`aw6LI*L@RRs9bG;|{})tgdK6@ImF_JM^t` z@XVt+6wffug_(L>pK@1^doL?wysX|be1A*5iwxTun-xLxcJ$Ex7^aeXOg9HpANNq( zD7EIGW)?d68t-;b!bZUNo}gqbN}k7Kx27bg?ADmK?D@Fb7JI^zo0q&-<%Xs~ei1m= zaA9~29yj-v?bJ<>W&@eoj_ecoF9qFpqT9|+I4GU}guA4!h}~&1h*bKgE8Vh?H>TT2 z1soHr#o0O5L#G0S(HetX*qib@9Il0w@?j&^C+6YS|EC+*cWkF`r3e2v0hWKGZoD*h z8~hamR4&?-%dNjBs9fsSsnP*%y&7;N?v6YPcSoIoyAu}T?ke{l7ngh7dtGGR>mo=} zub$>vvO0AEpUbZ|qqC$XbpN#gxEus4bHA?28bGuw-TM%_Q1`jmjhT(zm^XR3BnE#A z&jQD8fs#_U#5UXWf}tZ50XP*^r?&S?I}=8J#c0S8YU0Q&J>B;90Ugc;)kDc@_fdBI zsQa$lbJKV64uS#Qfr2?cz+R$Ja;<|>^e6|3qlL~8h`^9zfb}uWxLdvgN|to+!y3(C zH1aKXBPD)b!}>%And>*laf_SfEA$QDy&%6xby+hVhcO&igZ==LyG4mnJ9Ne4(F1?J z%}|Kx;oQpcn1C_-^MCn>uBaRY)1U;vRqfhQCL*PIn8JCzMN8n1IShJ_R`eP|&R>7i zLl*8R^fzh~4Z)^}=e&&>+hW^|HQpZE$BcdQz>MEfZyU>boa6Sh3@py+qE?N9%+;tH z(FGoOheQ1%CVzwum=y3e8hkCDoxx){H3{3xaoP}k!*n{#J9n3!n!fX}#iPHs*y~dL z4;4lxZ2n==5~$b=qXD5VX-jPG5LC-a2CkMDbig-F#ryQ=YV{fT*>`|twpn?cA3!hg zIugDrD2inqRdhH+@^CoFYSQVrYg%q~XjmPdDf8zT)#HaH1$lKwI1B20+#;xin&wUu zOaA)xLEmH0)0pEiyyL%)yR(~d*PQ8}UYR~OeJ%{!IDO)1!skYKT@e7h_1A9GISQd> zoFlu8TH!MHhsLn{(EEjlj9=iXD=n8Vczc+!$NQPKG&$fRz_P$2D^Orx1WK)if((Iz z2aYrpv2}^-3?ifKbg~)7JsM>vc)tfM#uGr>-^JdwR>0!ohc%AElsam(x9q$wHTs^I zk9g~d$KvYevFCz&X+KxJ8+*hv#YU-uHX$6S$6BaI17e#7fvn%5S=3m4DZmXU39E6E z5SQ7wTnrr5ZH&%v4@Up|uriIeN(h>Xiv!eHKNqJ+lYi5U{TqO#1~3xnTGvIYp&a^c z4n#3iwlpBmu$F*dW+^$ekhE(7XNJ>loq1{FWWTtyAkWr)=5XQ2FP0jS}S(c#nG zGt~5RK%wh#6cQQR+!si%mtiV!xi;3dzc~UvA&^ti=F}xUTa_hC4rGwNC2wj|Pofv^ z8)tW^cilf9z%u>fM;W0-IT?!JCDWYqi_cwrz=`V*zfbrA8z{cubMytD^IkVI^mXsOT-PtC zEv_G&s~YvHu8o-}wXN$H)THZoJ71KcrPaSDD52}OC-z||$C0wT;BjGg?TS4Qj}JF5 zqZi&7iI3ETq;b!N4IsI@Vz1{+qL+f+LXU5?oMwUr_l|rVySSsK=87_tVF_ zAFDj1e&OzB>RM=@{U(&m&({Lr-95esIH?|Rf63YOBA@S=4XWQkkMEAyz4Z9*jor8Z z6!SxX|E#_( zT|X>|czjL9<6G3x-Qx?Z=X!hqsXabJ=+NT}C?9xySQh^AM;hbctc1a~vM{eQ&^x(*?4f^ImwQ*m<{QT0HxT{};yG5O!!IAUN-fY>>27KC}IOaof zJZGXr&$;hYN4?L>{KQSh%8%_PDiI)jn0nYMipeSs1g1iO;Bj^UfiGCw6~d9E=v}`t zz(bDKd`bKLHuppg7dV2T`EfgbY?S*BZ*hd=)N3(cYwwWM6R%g#ousP3})G1q$*#j zt7ZW0_I9jrLSot=W2EW~Z~?V?BDudW=$pzWnRI6du!{8($bug1ox3GYMDVyRfBvdl z_j{^87UsZCyupa?As>T?dZM2#N{UP zAr9_c#7m@|#Hu0V4+k0e?vD7NAVVrAY}GPwr-=oM6I2$*_gF~ov9jIsW!*EznJ`sK zW9zh*^Y`5%Jz=uQky-t+R-G03>pM5wYE_t1Rq(@V>=T@LxO|(7Wp9mtk|C>d5Jgr4 zhok23!=-O^_{mgtvBYT8ofDfV+CvMq!1hlH`snXAs{UWc_TNM9&s^O9%*F1;S!%Pl z8J9>mLy`IAlVvJF7)}a?G7Ns$6?I%vx>l^E@-2@3WWh2He{RZx2i2?P2fn z!QJ;tb`N)xiSKF@9jwxm0q7jCwQBNAP;=();oiD6D8a!+t9E2c|Cb@G6;lyh>)f^449v zQr%wsqv9x#9~Hk>ECqLz{;f1x@b19721~(RgWuCcH{D)36t7>Y$Lm*K80xM2`wI2K z&{vp#1@AtIV)F;S)uaw@HTf$`|1tFPVFK;)Ve8259}e3&EZW<%hrD`7G`;rF8xNKG zH{vEz;9CyhTv{Ysl~=R2)-#`pt`VyKAr^%s1Zyw^!|?Ve*dIVJ6!c6m6zos1Ye^Z) zT6OKv?~*d#B^?_;$5%i{aORbv|H!GPNd|bA54$RdR-cV_X!sw{?(ZusdIz}rF9lNg zc}(%ozY!CpZ!P|T7N5c!9G5*+x zHum*g#nDxwa}mlR9AKw#ODi6{g6{)8FHD*PiIx-TXqvc3(;Px19gZZD8Qo0AprWWi z1rY;W*fB2b4;OZW3!z8!(kQ4UsO{@_87_+2j?4%Doq&rCP{!*^Z@_EQ)Rlu@7=p`n z!+tOfm-`R-*&*&(iARj8>t*%zRs)nLLhBLc_&pc!`se%4=o{sHH8L#qZsEIyk#sP2 zE$5n`J%GTt*fKJ%p&S?f`RjgWJL;X-Tzd58zDL7tx~|tPy@C|SzvmYQYVP>`+k@6J z`hG9)O?|fv`q3a<9vJcjh>+OZec1mpu#_{L!}i{UIu+=Nul`*3G6RU-)}ZeX6GVCM ze?B1foqTh_KZ-A=J-NBx&VIU1ET)@aZ5h<;%d>fXGv?8u%+lb|p{47>M~D7We13_k zab3Sh`q@W{_J@XpWAhbjuvLnEk@aKQ$3EN~o4EovMW~lLo#2tKH|I2)}Q%$5HmlZP2gsG9H zeDB~!9Kenp)1@}M*doTeeqy-H#sv`P03tpZKnk&Ww4t{WLC1~mw>`OGHQu0-hyQb{ zGAPb{6?SBo=9|&d=CiT6m$tdB!TVcK85hAti-4&oBI-}wsgvAQIlvC@0?dtT+?N>P z+w1?u#}v_8NB{MY4VAi|AyHx)s_+3N59Dt>_>`03t5KH#vL@&@+n z?6zYoOQ+2U&!PAO(75LcBzq4rbZLAyd4UhjkQaE{DiBEAZn%&0Q8|3>R+uY2SYlXV z>W6o;1Ou@*eq$hp2!GC355{leH)MXFw~DVQTb1|@Us(2?#5#VPU|qpRKBcj-;3r5W zE(~N;KeJ(u6WkHNi&4U28MMe`K;6vS3={va!bfuS5l=s?`nKz>#GwWj^2Tr~rvhgE z|EkO5xLl6!?0748#zpLM>e#Iq!ZG()mO!?mJ%Ou&1dd>aKh4*z0qzHss%D7Ob$n*G zUcIM2RNbZOt^fkw=BI{C#{SFXg&6#G?!%OYhuzm)q&`&tLXboEZdI=1hi#{$>h#6^ zvOP)F;>8CNnG5mm8Z`V+eZmOJC+gC8&k!z+Ul||J9X9BRXpa`OvL`iaBfD`~1T8E~ zMnr%IGlQfET159;`jm#JoP3Hz{xT?;Wy`>aW!Q$otG!+9Wbv68FeTT zV{(egU>v5G8s=WQ@xK#vha(s~it;V)M?`*_+1Cfv4#;e(kSqE1p?W-nO`hkfkPQI@ z!|Zu#@&XL&O7{n3#1D9&WH!#+{SGPJy9%t|mW@|Cpxck0m$3hl7>};l=Ote`>r3Oc}2O4+lGA0DR0CxgW!z z>E6Qg@m4iJOl<$9Kz2syw^c=QaLzwkp`f7S6&wIv$%C`ee7c1QLt8j}0)WL=859V2 zRZb2+xDlzqkFZ3N2Apj!;DVWjiXcLJV9;;C;bZlSyg%jP@=@Z-d|bBV|DeE4`p?!& zT__EDvPa|LfFw4y9_7;7n2q%T6nx$ysqVz5hH!Zy@#lolGBN2{4Z+a^lAd1(+VByl z^@*!_xjJ!k0)8x}%^p*1Pr3QC3=HMq@#wSg64@*G*MmZQ^-1;aK&0?Ze)o&P zL5#AC!dH|VI+qy*3C%@rGxsKaW?52 z#(g^gSKyp1;B1Zo7bXRqP0~As9N44*hk@+41W4e=C&uQe;zMlg3q_9wMMWqo8XN?t zcA5fufE*;{+TSsgcLda%u59mNApWo~c^x>d|0TXu3Pb&^sWQy?l<4DMK`X{uN+1b% z1)TelIV>c=2~?O8txN@1GR#|nlQzRnLQf|xmHVX^x!#Hxj$7fuQRH6f{tan4ERr~W z76CcVtl;5&f1Sxvj=VWyp4SOv=QYwP(=+wvpu$8L#EFvta?*4l4{5SR)5Cp`#E(q% ziF&wG%+m-}?gHI4{`#i}k0^|QM>XPTtdx&F7I(*f#ch;Y{=A?@Ar#_ZEV)c;e_X&2 zIg+`C#9HHi(+~>;US=xrX-f|W{(S5{;)jsAzx5^!1xg3+9p>MO`0JC7em>q`sPc=r zbx>49<`ort`S<`{EDlo?QxK@ILd$BqCGj`*C|)r2j| zQw0m-T~r4_4yP}>@@Fq)PF+LxN2<~J4Q_OhE ze}QCu0bhXA`7in}Aw#oE3-1F>7LMk)M~-_l^UmcvDe#cu%-Q-DQ)qTW-nk07dZv^a z1P)ave^sljAV=m-B1~#p_%;Ju9YD%E6h=eqg=h%{%Nq!S4#c+WN|3`(EHphij5#}r z-Uef=u$Vl|BuD7vSd%REGEl83pKmgT>GJbUauSn%V)8;mRV49)82e|LRi}AJ!xQ}8 z*c13xSd_nDQCRJ3kg%`q<_o!Z0l=Mr@mYs6=DU>lENkufuDX5VG3_>N2Hcy5n2{4*Oshe15N^6AxfHFLY z>ksx4cXg@3eAhK<#$r?fgMv~AqKE1oPX6EU43)mSpLZUP2p1mz$q;Zy&wYhb;`bZ9 zl*iPg#l^cMC`^Ms4+4Jv^YM%`0c8377jSb7ZoV)kj)zfjGiDsS4}QM$J$2>r{P@fDds5UdU;>_fNZB-zf)gHA~{HX5WSz?slnfyIpi7?9VR^ z>J5~k9V_vbsri{5F(2Vj|A_ymv+n?`s>s5g_ujlhLP&?u1B8x900o7`Ad0#cx~r@3 zcq9*qq>+MRBPc3@NDxp|T!NyAWsMzm(Wq+&7qNkj*mkjQ)MZ6o<^RsinR)kK@^=6K ze@gD1Z_YV$rk&|?97u-}FyMzD*aVTl}j60%y+G#DD>W~CL|1KvHxL<+Gcceo3t zUB*;I3YYME-PP2gRt6G(983XKmAgb1ieW>+wn=vBf~{L1w+N-uwH(M~7!BP=3>gR$ zx1l9^?gsb9;_T^UcDngg59SsYLk$ZmeIq-MQ$4YS(+EH($B=MW_73LITZ5GmzK0>| z^h}W%d6CP+r8qr=nB*1ce)T1sja<=EPVQ{+k}?x>50apvMq7TP#%{Q>OO zDWS6~l(AaBNHGN!VhY&}%%yDBO`6>7dy>X&Px{`$*%wnJgo|mqoT8|);=P%MLDR9X z{vE1Mj&m0-hAGT|>SO55`9j=>bWjg94iMieSI}O+OCkeREeBd2c!-? z^r@&F523I(Ey02&t{b!@N=WE!8@^haT@whb`3s7?FS3_ChUktTppb#EmKwNpyI;2J zi!l1(4kgmc7wXiY^^&+9dAbbtRYeVu+XtPRu3+m1Ud=WsDVx*h2)1k7Y~2!}IeiQp zy49R$$sVDqdyM*OKRrhMbS7HedW8|3c3>_;82ivt)4J z_2IJVsJw}en?>a_{%7!T#FXw&&mN{mbcn|WDSI+&wayIx zrG#7eSUsLK)HHVwX``4Km(e<%DZ~t;XuL7ANV1M+>Jh4yRYq|*=U>E9U4LHSVih^TcT#u<#4yQ!NyG!^~d92g^D>IAj zv*?lNcmPoGz_l(EkEtqb-}%mfL0r%uKK-#(%MlE{hJLhpbv7#PAJOfYh1!D+YqPL; zaJ$c6CFJdtZnJPVH?9qsWizHgm$vnsPp89)()L$&215%4Hbbewj=`{$hzsVai;i#& zh>jzSB@F6RnUafR-NOqo!$!l9+)gP~ON@&|n~b50Po1r0B1WOs`?W)gK`3~GN>HlQ zwLma$^EXl%+ein&Xfrc^0#>* z+`UB3Ux~H{&y_xu^O*dW4hF)lVyT%!U;o)i?~SZDy&8XZ(@B8y9pPf17KO)i`66_U z<;jKARk#}pk6W;uqlF_49VBrmy$W~NyVc!qMPMhSJaY;DeCWe9LrH>-Y-IWgdQfWJ zBeNaW4KW!^eLKpL1Oqmusa!RP6vF~F%cLAeecK~_>XnaPhCoElv5L~%$JMyO0FSr) z`_T$;Lb^z%fn+~&ld~qY(6XmsV&og&U9`*PF4`_%b3hMMn9?w0+^659h@&vXu^lFg z-5ndbecKq=LBNi{>ojP6J+Ke1Q0;8PG6{Z@)ZHc6gzD&$kF-K@dSI43_jCm>@}hs|{~!r%wP{M7yAvn6dN2-^u&+Ogk0)=VCiz7ghIz9CQ9@22Rj8!l=ir@( z<(_po(1(X&J=YZ~77QlpC1>UY?Ef@7|fHAlBPOrk(IM4S1=JBSc2`wI>STH&jx}Y@15?4B6do>vtC1+<|ah~n*J~d z{f8h@L-gHda`;YaRd)LK=+3gHbNqGjPM7`F)wufRG&y`M%FtM{$MO^3CLB(Xa+Cjc znq+ug%X5y^oH|TF40T@uBBsc(Dsb00&7(A0{$c3L3?nXd7r-@Dj@?c74eiz;O;u&$ zSB~cdR74bl;~vxzp#^w{la9L5FLV<7)2bH6W_iJCfs@kkiCn`z^a(-a!(N9VhZBWE z3;NV6XrX|WQGWC%bc>x?RnyzWNb%wekP{c^E4i64v~H4qqodO^WS1*3n3Pw_YxFD< z71SX-Lh6BH>~Q7;YL>g3iO_C7K|oQPA=8)X33c3wiw{owR&cj(UR zD-hcKfYAgWzmX~GB9`-Ym*RXFGmiGxmTEHc<0&6{#p(jfdd>!XgAb(}@gHK#-*mNg ziiKCKbng8;f)uKOLIoD7VF@F31s==JQQXic+^QXq8212b!zl+HK)pMuNS9FlLngkM z@Rt3seIDnseHc*9kk4W}hmQGkzUMJz7FrN9v^Air(I04#i}!&?dpQ2O1jl4QY{;L5 zefba^Q-aO7QHh@A5Pc!&E?jK9NjRHT#jv^!NSwjL7OSx z#wnt}Wmx{X!jGGgW;(*CgYRPW%x7X|<{qD-xrY|1_1r6MO@k?%XywyEj|r#a&-*y; z2E!F!7omvqu`A^|00&GsHyR9^cWH?K=i)Fge(fR>vZ_ zb2I@}D~e`hDRa#H@1Ey7ICbwcvXMDYBx`HsDr-xEt#@036P|9t;A>>DIod23!FKCC z_LAA;%86jkSRabW!MQjUqtI;Yo!Wk(xXhfjz4=@)??F zu%ox?;+(EHu~nYvqYirN5JyZHIQ^^Th|mu<*ng9CxQY&Yp6}qZ;~pm=7FJaEim3TL z!NPzE;5Qop9pOECl7C5t{MmQ4A5TRR8oN%D(p_)3um4n4Q6mOD6{&k@`?{}`G4 z$FwlaAt_-qUBYI{qjBf3JPyKmAx;T%3Bs}Xtvo~I&_hK=9$kboQnZz{{qIqmDur<|ZWg>dY$^{&NW<|dEwot2j}0%(StscW2xG@{ zXrTuzCGF3NbkGAc5&FpD>RfDBRW&094F@9F?}8F$0o|!V&<3H|CESb>){G{WXm)l6 zsLtQXvFk>RPPZCUTJNsTCZuJmNx*g}HtohDEyj*hrAyb5dA|BGhz~5ve9t@1;A8?{zGcE~m?jmj|~5q12Y(PHZy^ZDUhT z8yBK7$Mq>^m%JDl?+l`6b!V_CXuc}Sxu`-#XCyRygHa%tdLg+_`BE$%X)iJvakC1&gU42V7!44txQ?^59FQfvcsH z!X`{)&}91(#T6>C9A}|g{6y0DmjW>4hkj`tETK6ceGli(p>KSidPF=^;bUAJRBcZa}|dfp;Z&m?HD0}D}XGRH-hEDtEFLA<_@g8-!{b6f!4)O|DfIR9Am zsA-pj4vToMv_jQg5}4qSoqI+W-kYB)TCt+hvu}8z(64=m!VimB=vs}Tu9YwH2J>Qy zSPS%p3`ARNQ6JjTM%1oY{WAgbGc@@w{U(KKX3$~BRpGb=L)CN4gkgw_OVhL*tY**> z1Asj~rP!2B2?5aa$hIjFOSLVIh9yQRv`tE>X+|jkN~viHnI>6DC;URU+e8})dp2@H zV9ll_GG0%^%6i}HnB9c)O0(14QR5TIu0l%G?f$yOn1q(`D=$T2u$ij@Vrr;0})uUevP z%*1D(t6KPoK`XS)OE@VOk-f|_Tbrg`?3@+4jCP&S1>=#?8+AN!ybzzRbpYo>qSHw> z#pzb*6gh#}XCMTesJGI3K-xN)a`^B-^@7l7LH4&v1p|AjkZs}?HR@L$H)6TR-sg=4 zrrWSu#`QGhq?|4bZ+B+7({BpW)EN3abSl3XI6&r!rh-+6}sOUBoB*N?i&puNE zbr3e?2VLQmS7@;%8HTht7JFaJCXvuG>y;*JUdGMPgRk-FmuoR6qux|o1g#yUkODgV zB_b9Udc%r3UP~A|Q}dG&PG9hi#gvNH?NiG|pCKJ|y2DV1nr*y?B5FgO^Q}nHJ#>NK zOeIBykf2t#v8Xv+)Y3ipW&u+9Lr|+~tAkAtV^@Lfr~FWc94(!u8%#NZALi_+n~W{k zfyfEigPn&+9fIOyg_(Z{pH~RzU903osUUk~ir)t470+FR^j9~$7aE!B1jVzEj!uXu5Y77`eUkEUF+t9=q<_CInFiKQ2n`b&zi)$waf@$DjokoMF0hzYQRb3p^(`7yp zqP7e^5eanSqJ$PlNS>l;(YJxnDJ0a+JpE=xW+R%}__m$Q9nIdMgr{1A7_D@PwCCzS z$XJnH)*gfs9rjQbci44wL-}j zV(!I220Be`hZ_35<(q-boN;bo$;F%Gd8N3%B@sP7He&z`)dN*6LIyK4FV)|X#iiBi z^HqIj>xkTHtGMbEo}fyI@VO8T&p9+ri`!6h2_SF+xRdJ$6B~(@o7Y&MS%bY2(k5!-@KL3SPnAJl| zFh{in1YhTGG`k5QIdU({&+x@K%uryZ2{IE`ZDi&VS6+9BVgf|1(UNpUYIp68`q^83 ze0`)&A59sWe4UY`)*IDLY6DFQMvU*k(9i4N6#Br4!3t6Wd6|^Tgwro{j+K=|JFapN zu=0Rcz4gk3Hknx}1erC^Sy-Gj(`6>ChRp8`LX?8uWSi8_AIh*ZQfh_`H`d8x?Q-tX z))S|MWR|%`9vVDneN>U5>A!_FHloJ2CiL?~Pf&z#0O14Xm}W4Ho-M}ugqrN=X*@E2 zd^u;d(lzw9_3Q@EZo{3PoHCdWTd!ZGI2%cGHm+-)rLJq%N%SOkpa9x|*q}%;U5$efJ07UBl+vz?$nWqt4GFCcrRfgBw6&nC_$a6>oJg+oOUD;Kn{#q z4$-0^>8vi6BwFf@+7LoHR-M#9?K!s7XunLB+gHJT2N^^$hXy9tkdvvokjwVT;ibYS zFJr?KTx!5gUZztrd7suv3RSgnB|HgC{6YzWY{WYIcPQ(>(=CWRVGa>@0AaJ2ASFO@(hz&-IPMUv$q;1**~M24yuhI>n$WUh)~@*QH24U-&Mj z@Z=|jKj@h}j?{~V9~7c-{-E$<3h9%=gXB6`_%oVq4vlWbpCLcR$2$@+mraDySF#jp zbs&_!cBN40KqFN7fo~n{c-cTjnucNUKjaHU>M2FkyXr9E4F@c1{-yN-TMM0Bo*|dE ze}K+6J<$Gedq?;Ww114w3qIEVAUttWOn#QSxqV7tZmuzr7RsnJ5JFqpe!ZJYL;f+F z@Vya)@iBZau`(KApcl`W@_vVg!D6~Bt z-*kkg*om?+w4Dz9Z4cc*LwmrOq z==X=ep~pv&gZfa5{72+Rv=2r)1+XLZHyVrlErc`M(;)T-y7J^lh{dC!-AyoLs#9QC z@bU;c2EL#?pppRHPW9H#e61P<=?Fvw z;lsoz7HcM%Lbj6in!M_M0DHW8UnJONlp z;g|Az@N0eayJ2T97OnkQ){l{u?PSU>9V9sn4}v78lgtE3xCwG)JG`qTkdodFJAx!9 zi`EX3<^0L|y!)u-yDx8lo~ns*f8KWle3!R@8^aBq@1RN5J34REfRkNl{^^Dv&EWpL zgVdousQCeG=)9>jfK8g8&8Aa`mN5k~KFmW2{7|ccR#J(YqC^4T(D^o6hPbWs7H&kh zKq47J$Wo*jSZG?kAqeQ75IMB|@I9cO8^8-U$_lbgdxsj|q_U<+%sY|syOWf9_ev6; zN|IU!B}ps`u_S*yY@C&@h_epS(9O_vxZud7t)kOSY#;0T7Zt1o zK{T;PKiSgZ7MeS{CHa!A8Hyf4r|Yht>GA36Q%puArgX6`4)?Je<1K2PtqkV+-zPmcL}Jr3t1D*-dy*%B;*> zof(9g#SJaUDeKD6DT~%E^JChw^l|1vT=^{55+4ug48lbpZ&EAj=*M{s(n0lb#8Zy^HoX*z6UR9w$Q|69LXQm)g2vW&S{A(bWYA^}LQw#Ef z$jLQX&t@SD>_FE-jm|9ClJ%&I3ZW6Cnr{lNsng#n3;y2eS9caPb$W-g;2n5V7O=my z!r=R;6Rhe-%73=;S6yjJHCdmwnMSjl({87a7TwDVie^*x>)A+y*R#LPMS=V__orOi5s~|| z9?{63b64TyvRu{i#x^>gh8@=gW`9qYCVo%sGYmV7+t0acIs#wQaeYUm<$5i}W{_Kn zDUkB7T&#Efi=<39Ql^lUwH<-4B`GtElteb}$=*jZYWuQVb5Y2D&RyM+?Ww#jXCpS6 z0$PFKRcLZ=&VGXS=lqWlomSRl+l#C!%YQ+ z0g>+XlP%p3bw|n`>i(xb2^%MW>b{b$0Jyr(sy;|PM6#jxZM{ut$HnIecxC45_Y ze*@nSbBwu#FF~Xze4Bgi>Xj0>)yYc`l}GqC=HH*65_sLoOA!0E=Kl)c+nu}wvE;oy zKku0m*y{8ph?+G>-rM8z9w~t)moFgp-O%$+@IK-6CCER@-IG+QWdF#x~cW7&Wkc+uj9!CMCd*gE(v2HqOH6i3bF(jhB{XqJ^jZXw{7 zAzK*OGUO8iJ{j`XQHiXuLAzd{$76j^Q63{bW*I$D>vr`2u0Me9`YSyEC_QEwJpd>@ zF#E6d0HE}kW%K}`^q6JzII_w%_SxA7wsmKphv}k^hx@BEKwaI@|3x|+^Wu;-q(6W) zM>QP>LY${pd5yZUUQ?Ot07?!%3H^1cG3=wzhm*W}vK ze;4Vvi*!66X}O6e^fr;I=OZECC)fLfKPA_vgTEx#mxI42*Y|^eBG*rY5gQywA94dO z5s)`fq|Qh3K18mEk<7y8i$gvfk`h>D zJ2j|f1W}1a-T$ut<^ir6YM{wZbFgf{dN-9onO#4C>v8jdUGR0)V}iK09U5@eKu?6np!)}T>M=p49uN8)zV3PqhY1ZFsX`E? z3c82;3a;(z?9Esx!CkOXndeN*38Aj4&7H575mXzIJeO$9>>h-K{S zdu_jzz>f)Q1Jx8HoHAPb{t6imDj^A?+(8cC({CSSI2sxQ9V$15m#l5SU2ZB3QA$I` zKlG~#Ce6%z+vi&VI1evZ7OaE_T;n9y6|AE-HSk{tYZQna*4CL`s4wvf zStH%|mrb2tpy`VjI=|;w4wSES-bEW5cXeKg1La1^H#&br;76U`>Q35qf3Lf4(_1_L z+Sz3>P}%^oE!f`Wg)SajKoHm1`mU?GdTaqfT-#s9rvN;*fFSm5=yqE-k1ZgGCGYL_ zIegu1Iv}p?jot6>?y&^~k+1uQJ0)MG&DpQEd!42!UvKv&x!!E|7SDyg)oukYv6L%P zR@2yhbxK2uZgUfvOY-C+|9?`{koS>xxJqn>e5>7+2#JK*H@r_i4_@b$Cjynzorns& zvG4(!$$y}*$+2djd|Ctb5MIk5kOdX1U`36yvr?t7Xk=iSKuu?s0H0+{ZBzYoAnu-5MSrVwKI1hX$Fz z9In8306+8NBAjpWx-5WglUD_Z+F+#mTYBIKj( zo@*yt+x^r|K9jO51@i{&u1k^IQ=Y-=iqz{;F>$jtRo<9-YpRgV?VH=nzqWs+z1-D) zPkSLZcG%PbW4)(32zg!l4e4@i`i6AbnBJH!@5YRYkT)1m$RE;wPM5!?FUyck8INZO z`Ci6{8L}ngs|-vK+?0vPWwvI@A2NTQf>{BYfE5D06Tr}3&=;Y&0olW1^yL~2Lt~>a>@shaDT;r z@&&n5%D3fGq~5yVI(+LhxDT(7hQ0{N2g47B<#*xlkXo-rK8eVt)ZK{pL+zeuC!cNi zMLQv{%(yy3UYoHAQCI=R<)1P)L;I_1T?dIfg7nuI$=F1XB|W{IcJ85j495Fz+T)yWyMZBAD1~;+K)5u>@iF znFVC(Y!Pl^5u5#Cb4yC42>+Q+K?w^&RFh>5%bZ~%Y>rB8^@q*Ln5{k$zM2okh@e4n ztQwmML@;qoN5~G7MDQK9HrTp@8xchCTD{hYbWD|9yJNeR2zFm>k}4?EGiB#)G9NpS zw)$QH&k5EqjBQ9;fxKjqfXw_Iq&67tRGB?m1jl;ZwNCd)5jLBo*80L`TT#9U*RIu4 zM9_fPxFb7t6=8E)@ne6uoHq$T=T@ed;($+n?Q8YP2LFRDieuIpy`&5miC~>|r_1zW z+y`@?&nd9pdP~{!99&Yg+36jAg}p`4D1plqWzT-dT;5FZQy^?NF^FJSyNv)FU2ntJ z+U2A4CG1^Td32JEv}8SS2ZWqF74mMOh7&#crAc$oE`{> zpgFyQgR1gJ|J6W7-)th^UG`h<6T#&cKx!bDUa|)*{4!;r2yU`_!UxO2^Ip zxFOl2lnyfUI1x;I-VpnDbLjhqmH{CpzDF3rQCAUeVX4K@*fw?D#(_ zg_R*rfkByK-T3_Y7!h>bl}Z<)ir^q#L6PDtc}`3O&Go0auuOKD4$D2u2n@;dKkDQ2K?wUr1a?v@fVoFzN3+0F!0a zH2}>06;ce8Bhl99K4=KSvP-@!I73eRqX^#PKnn)Rp)=8zJfsPq4}{Id75gA>GQ+qS zS7wx;hr2cqH2zXl(RCIgn7GU!B2zQ4r%wbASiUq>kB)!X=n;`Q+k6fg0(k-<;iXJ5 zGirTsKqjt$uhLfwB-i9vB!;gDP^q)CO&oCMRvh}`}4<) ze?UgEMes>WpCZ#n%F$!w*c0TbzZb#dw;Mu_$2#kQ1`cL1=Ltjjh#%Vn(d+%p|14BK z&f=^6_^9>+P;Rn?pfW0K1Fm>Nd-kLe&{1|ozi`A;#yvv55O_5p-ws?a}~mydD$egvBTU%|=r$0oIMHMz0C{ z9FV^%_5W;fT+;WP|IvWl9(ak$g2jKq+6T-A%7TSV!rl!u@|;jVj4q@+PtGbA!S)u? z#bM90hNOdBqtEyK8MUo}$y)Nm=Bt8VLg1U0I|aRoLq2)f_e4nEo%NS&xh?14Ir59n z-*l5Jy07mcAMNo{54o%7hdt%${M+(_MhHHThVK!|rP!S;f-gL8!Vbx-YkczYtYz8q ziO#=tkZt~ggZ*&hoJ4cI4bCRN^ zEK=0yN9{JjMPypG%-c$q{x3cZX>Sb3jq*O^-iMY%b#a~#ycrN-^8vRBRv8$u#K+by zkt@^Iq~SwrucgTk(|${n_vU<)E1$}HJx{*TWq%h()I}odn_e)wATBxkbLIVc&3W?q zE^m10(O0cKGU|rC%53zG4-W3^_?~m9B;E@Hb%?eW}tTOGD@LbqsM_}*70pI zT%5ZOSMlS!V&URqP1sum*S}K^j=bUeq>4nM_CHL9Qcu6ei7V=c!mBPk~c@bbWvVzDcj3VJ#qD@9D?gnZx22X^VMYi z%4PZIKG`bkftrsRvBrr|!;@aodWoO`jmDL)8jah_>`t=VwSE|dhfu#ZSPzvbBIx-1 zj{5kH{3kxWgI>%|Bj7msP3orhBAEC@&Fukf82mPj&(qx8PJNsv==d}ZeV9glmPQ1f zpQDlY<6|`V6wSei2)=B~L@pBY&WOA(@&Mr9zixuW`I&zQ*CMkL-;-H@OAD?5;`oG& z`hX02_oP<-oRy$|NU+4l{s?=Xx15w+t1Ab+=rkeMB2_nzpG zzNMM(k>QLI{klj5UuTqBgv>r7XuPCYC>O&2IVPo{M{f-3I=^dFz~0F&@;|=Yq1Olt zqTiE=%#9nO9=H|r7f_tO*C0V$WF<3(9SLR2&KUhXVhJ%vgF$6rpJ9Y)&sDP}AAew= za=GLg6ew({7r|dF+FSNNOUCc?$#-y41bxyE4Y|N+eYx;DU;h;7S_iXKBiQ^qBkC8l$znpOqtamvo{Q#=b#I}!Jx1pES3CN z%W(|uN-PwRd3{B=k=+Z!#T+Pd=3Yw_qy+0T_DHC&>_19`e`Z3M9OmYEjbOniiJ+0W z;YM~Z3}5dE#}XyN@jx67qatXyZ8)F0!)a#s!tfJ`a9*=SHXJXc!|C#wmL`IR+k`WT zeW-F|V7P@mJz$|evVWn|t@F6xbC+ttEe^LHYKQCpu1OY$KTBx4l0nLHPJJ(=wSA8X zMbK~?ZRI}_LG!5oObemwiw^ zWxEDUQ$Nz~k#@2f3qo=)mV+=4o^mJ!TSa$ZGW)aC&r;>*sb8ncgE;sgu-R-`n!GCQ zx-_{S+s+UcwpOYQjkNb}cb0r7YagbyX@{(A!M0qrSyjmIdVJSI*7tm{r~IzxcRl43 z`A_7_YkOVWOYZBnub14`ds}b$Q}3U8>y=owlqs+X*;F8#v8X6F3~m~%)-BblCHef= z2R^U#r!59=4w3I+pMk)Rkne`54GHx6iFw_2)I&!}T5{Lv+ty#CBIa|xJM8sK1K<}O zgvrMs6LexcgY!3=@qUck3}$?^!I{20C;%;7Sk1)QO=}mDA`?bg8co2OP)5A=w-;4N5 zdYYq(BN?YIFX1h$e;MP{ZW3JO@7^COEncmhFrl+-Y zl5cAc;}{Jp+$>P^(&EJ0fW{N66`FxIiz@x6YWFyn)0c5`S=Mokk1+JBG|->rPhi|E zUTkIha~S_^ng-Y;hy{$BJG;g*{UXNAm669Yju~&Ir#<}0I2v|^+bKr4>9>_}GxvT5 z;!nSa7&jk$Ih*sn893$pBc6PJ-O%5l`IqX4*vq(C+sJ49E5^+lM+|QI`4A4Jvsr5x ztYOiOadR`}<%}QCxLu22Ie%n4u`r<-mN1@JV9@w##?38$RR8I>nQ?R94SKEWw+%R@ zLo+L0uVK-|c+ngt3~3Kc1*v!y{YksqG5w2-n~O6RGTSag->3<1XZp7pH_HY^jMIk) zDBbLoJ>x$yZtfN0B^!K3M$?= z@x*+)_SnL>xxpgF^!GDv?#wur@y8i2n5}^>jMsDek7L}>zs&S@8lB_y9^sIW4i_n zPM>3=a9en;a0B$C-?@w@X7e;&#kiSxx`5+*DdVj?lH_e@Vin`&H1AL?M%--h5)CY3 z{LjFtKAP_+&gTaEImYX`o(^OBS6NOICyZqM_cGqhW8VrGH)8~Yk7nHT=?#85d-Tn;EZSyny9A$#^5%MCpnNQ2+T_-@8mGyP-0NuPX=J}&}qt32;!IgJ--0Vym8 z+p<)An;19c>OV?;t|&TJ*RNBVJ`EiYN}m=FeP6~i7Hh&@Oh1P4BF5V@eg@-{88`jm za~N-6oV&B4obgu1C$pR@fRlX~#`YO%tKaoZUv#l{8~R43AMK&PkLepc^iMH;vnQQj zX8INn{YOmyvWNaFrXO~R)+eSP!iS7d?T$yEG~krZjZB})X08v@pX#AMn(@gVd<^5~ zc<@tLe$%B|kxyCvxlF&^qyJpSn>=_8<9B=Tdd3?)_$uHkUfcnv{wV#nF#QG({ez4* zc<`qgU+%$QWBeiyzL)VT5B@ph^F8?YjMsbc!@x=Z`lVX$YgzwpsX8BpC!Gf}e!wH= zSjJmC_yopVJ@{nC4|(vJz)7DBHee@nJ}zeZe2+d?F`nna*D#*p!Ea+c;=%6$PT|hJ zN~gos`XOFq`T-vLJxt%q^ql?TE2iJ;iPs^fuVTSm?L`(02-TO}9{QdN&l3YY_z>W2 z*~3x5N&liRwc^ND^*e*{$&91hpnexHKAZ7gjIRVv?S7-jPTt1!4NPz5XN=uzV%*rh z2bjK1s6_iM&?Gd_cHk*4D{>}w75=JL>y@!8*KoW}X|8^w4lH(aw7 zD#U4wPyVL{b~0|t$;*7W!`NF>PR!YCgO{+J{8lYs6U#An$y|J5=#3pSmzfy+VwTg) za^7P(ro5Tss)pW_e{%%Y;HLbWW2FYap5-@wrv?9m<(qnK&TSidQy-f=>F_YiY4~0X z;NmDuy}sK+Z^~_vr`#I5(deOnhvm2apykiyd^GKXIo)aWH0{eFj~vquwt8^Wo|==E zM$SJu+}Q_pxY?XO0d$p=J@num8E<6#G^QWQcq`*)GJX={MKlqI-!}aa=NNj%2eG}q z2sqh+1D^TDs~B(b;5RV7*Mo0je76U`kMWm1_!Epbd+-+--|oTR1WxIb|C5f;)2zQ~ zPv?8m-?XQ*J-BI?t30^rZ`6Bm({H)RgB$y~+=H9;XoCkg_PN1>AK-Yk{G#JE(iqBg zoi7<4`ZUHP9=r?V!h`o`+#CQi+~oa(_%|Dni(n|6P+2RHqS zVIJJ{D+YLQ)33<);HF=6jt3vl@yheyXDK{Soa(U;(-0V~RdYoKeIEgX0RZcm>NB+~8l! zvMy)5k#W=iybgH2BRunZE7KQk(TJI6xKH7RD)D@p>Fv@pd+lPp{%H;5GTy>?{wEqR z`m`pIA3))3t9*7&g7;B4#+#h)VGj2w;0WS~-`FH_X0V*AOEk+W=8Pwyzc2~DJPD3- zPpUi!?kA6A`F~DA{}j`=_n`V_#Bqg$N{!vo>GH$;K;Hgej^m#LF6}UuM4<8b`tQm(kGfkPE`{8$|U&OB=}tl?;y-2;fq+~ z#~E+htN}RH@8u+N-U6P_G|tDjN$3wJ!Lwm-s601p*HTXA^yv+}t@QaF(^s*c$R_oh zu5flZ9&x76_(FrN>{p(IezB4NmL@d)|7#hyd!AU%O^i3NKBm3cl0^RFOmBB1v7DEa z(0{=6v+Fcr5wH8SCZU%db$XgRfy-Hbn!?%Pc;qvEx3e|agZ)M^ZugQgJ~4@$KP18D zCc!Uf`R20~Kd}5&N$9sF!T*v3e~INc?bU+UvHZ7zXVUtPXTInQrr$L~6Qbv*em^IX zpV~>Mvps#r^qm-g-Xmv#!kNhN7zMm7`+s5*`l(6qxk>Ov3dg(?r$daxzA6d*tx52Q zSx)O6T7a?tPbZ;&D+&HB%gH~W<$TKe{D*OKz{2b+=#Zz=`CU%WkxXBpaCSHzM<>C@ zvYbW^(AetJlhB`?1fR!p@>!1Q7u7M|$_=mjJ_hu$Rm>*jdkCs9t5QC1q}9^@4;5gi{l*tusMT+=iCcRL4kNMb2Sp zhf3+1cv-x-7LiwhtAwDGr!3O>G`9pfh6J1&kC#N_i{cf?T2jfz4Czr5*FH6EqaKEN z@meNFs#KOosc0k^6TV=psHv^0uB?LoHn_I^oykP;@&w5#H%AoDFD;`8sb`I-DV>Kx zP@@V+>Ad-|ijuN83R!7Y95nDWk*}z{Fj`ktf^_GA79lUAHMLX}bOtR_g<6#y6sY(j zlA#M1(oWGL8j93Z23rJeNvN!>(kzBV<&bfB%ZD@jT!gAjK$8WfRFlYyvsZ@?pZJ_u z$y_R^@rugwc)8$0K%{ORb&5ob7ut$r5jWwHtThYcQRG!3;}RrD5tUlb1gxwmj>9%Y zYb%9$Ev?k`FIIvIuqbM(x|0iVbzOy4C0;%UCA6wKjsi)dga(lIx&Z6Ec5;`*=f>*F zYNN0$Rluw3ifeVjh%XYz+gjEV?8**YSfZaSjtE>OAXa5cyMNb59q5`5Qe>J5S$B%$xFl-*u+Qn5z&{fAT zEUhT-td5t*5HHvtk4JH=Dpp)tyV#49^(iYYM-}%lkVjQzO=&H) zHy%H-{a&oJq6S9h2r-lou_Ixa<(1#&S4Q@-S0YFH3cmyGE z)XSQP#-6g3&9Xy`F6u0^r3y12u4 zq{|nkHo;hUoZFAOO6aWAI7vpkNGK`20gP}_P~=Ntew;#vI|Vx4hq*Xa@;H2l4|6&S zoernK;qLGqKSKrk+#lLZ=diP9+LQ zID#r1?vh@!xO`4!*>Kf|fOH4pD95`~ai`ve?j(j4tV9R64PnQ+0!2gI7Ez&_iVA}f z<;?EFQQGiuk>yT@t!C3yN3^oqRnII){e{Z9+9*2xWi(PydRbpxh0w>ZD4t)9>UuHP zCre=KqeWB|qbh5W3u6o7XkPzI2>&Gj&Ft37RZ(p)HM+x{Tvyv#SQceGbVKfq7`)=; zRoqTlhPn!joIGjd=nNze+x8cdlQ?|b(RJ7{tB9_=u4GQ=;bu2MyHTB59;~jas(i!f8Q~N&!da6?I4k@J zXN4c(v^paSML7~q*BPS#I$9H_jz9C{=*efD6pg}l%2_j_C!fmTsV7Yps-GsJr<^hA z#PMfDCrz9Elm4<76VAe&z(rT2fOP)xCKUJ?Y%D#-DlG1nOp+DB=}e3mTDD z&p{g%tEq`r#4kk6M*kCibwcA6HFec-aT;37s56g6NnO?OqEpT|?ZgSu;X{X`B?58j zqF6PJPL(*-|D{SeM=RA{<*Bse!AfXWd~WJIgcAA?z{iOr1*Ri2Ls zgNCVUtP`7qa_REsVA&L)eTD>d{h=&rVo6~e(S@$UNVs-xw0Qmk>oH>JNFKuJVZXy; zIK?S3D5%7!e~}#yz!if!bm=WhoNh#-V``J!6$UbgdYOp^M-_Ef2}F`q zdCD||VlskcCo+OEE0OHw@!I*7DxFz(_MTgM5%m{{5@TJe%qkLU21Lg&dfN0ek<`W# z!&uOeak|N!c-@h@sG&29;^D7Os`%8p3MxIicaJb@=c_>sHLuYNOQ9lK^LdL@eRquP zH8U5W8Vt-ZC`BRWI8oE+%4f)>xfNtYMPCxe2{($)K32RB1C!5EN@_%ArbHn(0)%;b>K@GCaB##pYqCiCS5FQH+eV z8pL?jqL`>8twt{a#ge8j5Q>UfbY3ZxjjB>fQzYbpAuaN>uH2QATz3-_3goM#s+l1w z6?1F6Atww8u_Mu{(Uo!$Su>v)ybD-u%1{>_0;?&D$5n-)>Y;4CGMuVVs#zH|5Hd}T zs!Wb45jFqj5{Z~%@)mU^hQZcimq9GFgvU`dRle$`gVKi@i>PX6qLp(lAcKFgGR5RK zuUL)UFc(%`U8+r#Y7Hv1VWo*eT`eHiX@5+v^5k-~ytINQreOuFDr`)tXwqa2DQ2l- z7pPI1wmg_x#-s~rQ#?)e=+$dw1*p+h(R2q)0OoMq)(zyyAY05xyqeE6p^+}p;@X5h zBZdyA1`boH#pSV@MC-zO*3@Ax0+T2pL0g9j3|B-b88Le^FIvrkR-n|GMBwQs;)WKE zipsBX^U=tbo^OTe#Z>}oFL(nDk=bIK@9kd&AvEv_!Dg2~ho)>CLO z7`9-Vkp<|DwW+JFrV5TMszp}@R-v@kSzp9iOXmd16^*tXAc3#Ud9Ul!~7=NgK{675s`yRNvxQ zTRBsFR%w}TkSOy?N?<@-vJeTZlvI|NBZr(FX5fiAZBmD9rm}Wah|ohpCq(tftTgmP z>_j%bDuZICuHh!rr59PqXqg1ZGRTE7Oul%;*ojiu!_u0{;^8BxMAue2itK0#gbM^U zzj`8@($vbLVhz<%k=1CfB34nUERQ9i@{J1QZMUjbu|so23rx;nsL(c&E*D6gw1k5##Xf_HVSv_>swQF6Fje`m7LNZOk&B)nue2KE$8jqVFlz=?$y za+x-rY&4o`w~5vfQv*m82Q@Hkqd?SEP!WVIQ@oYMFP#TtY_{q3QH=NJon@ z(#?{pF%Q+-S~PnYxKlGgftJLpYUk6s9qhR!ri?Ojp#!~IKUEMg0fmmDP}73ehqz2Z zqnd3!Mygyq!uG2^9TGP_zIvXnUeL$dEZsiCTMc%GQ}3Acb&ffTs}em^%-hT@u5cJx z(uRbeJZYj94hPk$s=Au_qTE|nAbAc_cLA{!Pf~3Yg@#$rYE{t*UtAi;LK_iG#3B`U zJjGBH5zIK^i5jDx^UWKqTzu%fin^h+Xoe*7`P)c+$6t6?)Rq{(syjTpa#kfffr4<8ESE>=)(D-~_ zBbZ+TX~v~xAf2#+syWO%aZ#WUpcIUiV`X-zmNf?*a4ha!-p$P_^te6p15yW{S2QseA-`5 zdpZpN@}Q__&O8mBMujkL^Ss5wFHT`fem4J)@bB>OoBQp|^Ag@C=?&kww|V%@xij-L z=aUS*H~k)9ev|(qg9{u#FQUrn_?dVc=yALdhv7Hp;motv!|x6M1rL8~4;{XF&hBMG z(oa+V4Ei^`;HaglgM^v;Yj&Ti<#_3h+dSU~500=|esf>W-v3Mfe}I=l;%Z{=w`no_ zS`AR>U%q+a=fCizB4YT>xxNFZF(W4|n6dwdf9F1<8= zjQ2q@`w?MHWPWe@UGkRZe{ziB)K8 "-lyaml \n" +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lm -lpthread -lc" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: int main(int argc, char **argv) +4: { +5: return !!argv[argc]; +6: } +/* end */ + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lyaml -lm -lpthread -lc" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: int main(int argc, char **argv) +4: { +5: return !!argv[argc]; +6: } +/* end */ + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu x86_64-linux-gnu-pkg-config --cflags-only-I yaml-0.1 | +=> "\n" +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu x86_64-linux-gnu-pkg-config --cflags-only-other yaml-0.1 | +=> "\n" +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu x86_64-linux-gnu-pkg-config --libs-only-l yaml-0.1 | +=> "-lyaml \n" +package configuration for yaml-0.1 +incflags: +cflags: +ldflags: +libs: -lyaml + +find_header: checking for yaml.h... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +-------------------- + +find_library: checking for yaml_get_version() in -lyaml... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lyaml -lruby-3.2 -lyaml -lyaml -lm -lpthread -lc" +conftest.c: In function ‘t’: +conftest.c:14:57: error: ‘yaml_get_version’ undeclared (first use in this function) + 14 | int t(void) { void ((*volatile p)()); p = (void ((*)()))yaml_get_version; return !p; } + | ^~~~~~~~~~~~~~~~ +conftest.c:14:57: note: each undeclared identifier is reported only once for each function it appears in +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: /*top*/ + 4: extern int t(void); + 5: int main(int argc, char **argv) + 6: { + 7: if (argc > 1000000) { + 8: int (* volatile tp)(void)=(int (*)(void))&t; + 9: printf("%d", (*tp)()); +10: } +11: +12: return !!argv[argc]; +13: } +14: int t(void) { void ((*volatile p)()); p = (void ((*)()))yaml_get_version; return !p; } +/* end */ + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lyaml -lruby-3.2 -lyaml -lyaml -lm -lpthread -lc" +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: /*top*/ + 4: extern int t(void); + 5: int main(int argc, char **argv) + 6: { + 7: if (argc > 1000000) { + 8: int (* volatile tp)(void)=(int (*)(void))&t; + 9: printf("%d", (*tp)()); +10: } +11: +12: return !!argv[argc]; +13: } +14: extern void yaml_get_version(); +15: int t(void) { yaml_get_version(); return 0; } +/* end */ + +-------------------- + diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/psych-5.2.6/psych.so b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/psych-5.2.6/psych.so new file mode 100755 index 0000000000000000000000000000000000000000..ac4c58929802604cde6ecc94b3532393fbd24a27 GIT binary patch literal 147880 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 "-lssl -lcrypto \n" +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lm -lpthread -lc" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: int main(int argc, char **argv) +4: { +5: return !!argv[argc]; +6: } +/* end */ + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lssl -lcrypto -lm -lpthread -lc" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: int main(int argc, char **argv) +4: { +5: return !!argv[argc]; +6: } +/* end */ + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu x86_64-linux-gnu-pkg-config --cflags-only-I openssl | +=> "\n" +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu x86_64-linux-gnu-pkg-config --cflags-only-other openssl | +=> "\n" +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu x86_64-linux-gnu-pkg-config --libs-only-l openssl | +=> "-lssl -lcrypto \n" +package configuration for openssl +incflags: +cflags: +ldflags: +libs: -lssl -lcrypto + +have_header: checking for openssl/bio.h... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +-------------------- + +have_func: checking for DTLS_method() in openssl/ssl.h... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lssl -lcrypto -lruby-3.2 -lssl -lcrypto -lm -lpthread -lc" +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: #include + 4: + 5: /*top*/ + 6: extern int t(void); + 7: int main(int argc, char **argv) + 8: { + 9: if (argc > 1000000) { +10: int (* volatile tp)(void)=(int (*)(void))&t; +11: printf("%d", (*tp)()); +12: } +13: +14: return !!argv[argc]; +15: } +16: int t(void) { void ((*volatile p)()); p = (void ((*)()))DTLS_method; return !p; } +/* end */ + +-------------------- + +have_func: checking for SSL_CTX_set_session_cache_mode(NULL, 0) in openssl/ssl.h... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lssl -lcrypto -lruby-3.2 -lssl -lcrypto -lm -lpthread -lc" +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: #include + 4: + 5: /*top*/ + 6: extern int t(void); + 7: int main(int argc, char **argv) + 8: { + 9: if (argc > 1000000) { +10: int (* volatile tp)(void)=(int (*)(void))&t; +11: printf("%d", (*tp)()); +12: } +13: +14: return !!argv[argc]; +15: } +16: +17: int t(void) { SSL_CTX_set_session_cache_mode(NULL, 0); return 0; } +/* end */ + +-------------------- + +have_func: checking for TLS_server_method() in openssl/ssl.h... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lssl -lcrypto -lruby-3.2 -lssl -lcrypto -lm -lpthread -lc" +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: #include + 4: + 5: /*top*/ + 6: extern int t(void); + 7: int main(int argc, char **argv) + 8: { + 9: if (argc > 1000000) { +10: int (* volatile tp)(void)=(int (*)(void))&t; +11: printf("%d", (*tp)()); +12: } +13: +14: return !!argv[argc]; +15: } +16: int t(void) { void ((*volatile p)()); p = (void ((*)()))TLS_server_method; return !p; } +/* end */ + +-------------------- + +have_func: checking for SSL_CTX_set_min_proto_version(NULL, 0) in openssl/ssl.h... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lssl -lcrypto -lruby-3.2 -lssl -lcrypto -lm -lpthread -lc" +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: #include + 4: + 5: /*top*/ + 6: extern int t(void); + 7: int main(int argc, char **argv) + 8: { + 9: if (argc > 1000000) { +10: int (* volatile tp)(void)=(int (*)(void))&t; +11: printf("%d", (*tp)()); +12: } +13: +14: return !!argv[argc]; +15: } +16: +17: int t(void) { SSL_CTX_set_min_proto_version(NULL, 0); return 0; } +/* end */ + +-------------------- + +have_func: checking for SSL_CTX_set_dh_auto(NULL, 0) in openssl/ssl.h... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lssl -lcrypto -lruby-3.2 -lssl -lcrypto -lm -lpthread -lc" +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: #include + 4: + 5: /*top*/ + 6: extern int t(void); + 7: int main(int argc, char **argv) + 8: { + 9: if (argc > 1000000) { +10: int (* volatile tp)(void)=(int (*)(void))&t; +11: printf("%d", (*tp)()); +12: } +13: +14: return !!argv[argc]; +15: } +16: +17: int t(void) { SSL_CTX_set_dh_auto(NULL, 0); return 0; } +/* end */ + +-------------------- + +have_func: checking for SSL_CTX_set_ciphersuites(NULL, "") in openssl/ssl.h... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lssl -lcrypto -lruby-3.2 -lssl -lcrypto -lm -lpthread -lc" +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: #include + 4: + 5: /*top*/ + 6: extern int t(void); + 7: int main(int argc, char **argv) + 8: { + 9: if (argc > 1000000) { +10: int (* volatile tp)(void)=(int (*)(void))&t; +11: printf("%d", (*tp)()); +12: } +13: +14: return !!argv[argc]; +15: } +16: +17: int t(void) { char s1[1024]; SSL_CTX_set_ciphersuites(NULL, s1); return 0; } +/* end */ + +-------------------- + +have_func: checking for SSL_get1_peer_certificate() in openssl/ssl.h... -------------------- yes + +LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lssl -lcrypto -lruby-3.2 -lssl -lcrypto -lm -lpthread -lc" +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: #include + 4: + 5: /*top*/ + 6: extern int t(void); + 7: int main(int argc, char **argv) + 8: { + 9: if (argc > 1000000) { +10: int (* volatile tp)(void)=(int (*)(void))&t; +11: printf("%d", (*tp)()); +12: } +13: +14: return !!argv[argc]; +15: } +16: int t(void) { void ((*volatile p)()); p = (void ((*)()))SSL_get1_peer_certificate; return !p; } +/* end */ + +-------------------- + diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/puma-6.6.1/puma/puma_http11.so b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/puma-6.6.1/puma/puma_http11.so new file mode 100755 index 0000000000000000000000000000000000000000..4a104ac331acf46fd516928c9ca60ce090adc7d8 GIT binary patch literal 141920 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 +4: +5: /*top*/ +6: typedef rb_io_mode_t conftest_type; +7: int conftestval[sizeof(conftest_type)?1:-1]; +/* end */ + +-------------------- + diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/stringio-3.1.7/stringio.so b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/stringio-3.1.7/stringio.so new file mode 100755 index 0000000000000000000000000000000000000000..eecb41c3329131ef8d9789e11c6a5abbfd341155 GIT binary patch literal 184552 zcmeFa33OD&@;`njlVlPSm_R~ESO*A8WHAAP35z5^;0{b6vWW|XkcC7-5|bGgWr-wF z#&IyX`&=ISo<3ZjFHcc%!?5G>6cH6gB_hHdFVO1l^`_IJorXbG%;4e5}1D!538i-i71!Qs#?9RoauhKJDee@-S0I zQR0Y*K5@Jts|mG1@NE!$da3Ac5oHu-Q%Fa;wg`N1X%lpM8O*m|@CBDCf=@504f@Rf z%31vXroDW@xA`tEC%7yYdg!Iz-WA}}UBx;7`?qkXGE1} zNKU5^`g9K=e+is=AvxPZ$XSYZI|q1@1JpmZ3*di4yBDH&hG;iB1ioVke{Kum&(sij z4LV-P-fKd%`$Gu-yFuUY0`@Km(eB+L{QpS^yf1{D1tIj=6ar6U&~^bm{}Mv~p&{t6 z3ZYLL zL(tC+fj<$#Z~qCQe@h7Ze}s@f3G^2lcRz%XKP7}+Ux)Dj$PoCMA@J`4e<6K(govxV zLfHF32z#Gl?RHY~SAhVZTP?g)3JR7itEw!hbr#k*3ksA1`<%Rj;*y$@CFQlwlA1Yr zlPanzOXd_Vt|;Mk7p^HNT3J|7T3%ULQGP>-QsY{@s$gYlO$lxn7c40%SXNlGlx}Nk z>AR$|s9;HnQ@^cs))W*~q0Pd|C5(aU30YaPg7k8h7ZE987Q0FdiVB?tg|$WH<%BG+ zgp!pb=oS(SmaZtQS;E>_TC!?IRZVfhlJeyxl?ByAP*he@w3Nh@S1u`VuBv8j32=E~ zg^R&ug|%e`#V*D`dK9~sEnCI;D_zS*z!^(OR!L1wRZT%*O}TRw19NJY75?Kz!UExu3c4&&NaFWCc~U+lEb2U84y*h zo#K+kt|bU*9#EAo5LP=`bEP$f%SsBIW#zTZIV85cctq{0W!zrZGQ_&Gss`#5tSEPu z73hkgdqylS=K%)4m68u+-Ed#9Y;jRV3F~))Xxvm+QMU>tSqfj2m#%_&)rFNTh*+0k zco5C9l4V8JtEgC3wY-GNT0Runn95vS4!=n5a7j9mn4mFPjltwB4e}esC`0*mA*i%` z

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

_@@f3GNnW%cY(78oGTODIM(=K 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 ~bfWT+jDaVYXBes?doN)rzbH)D^6L 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[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
#{element}
\n) + end + private :htmlize + + # This will be called with both lines are the same + def match(event) + @output << htmlize(event.old_element, :match_class) + end + + # This will be called when there is a line in A that isn't in B + def discard_a(event) + @output << htmlize(event.old_element, :only_a_class) + end + + # This will be called when there is a line in B that isn't in A + def discard_b(event) + @output << htmlize(event.new_element, :only_b_class) + end + end + + # standard:disable Style/HashSyntax + DEFAULT_OPTIONS = { + :expand_tabs => nil, + :output => nil, + :css => nil, + :title => nil + }.freeze + # standard:enable Style/HashSyntax + + # standard:disable Layout/HeredocIndentation + DEFAULT_CSS = <<-CSS +body { margin: 0; } +.diff +{ + border: 1px solid black; + margin: 1em 2em; +} +p +{ + margin-left: 2em; +} +pre +{ + padding-left: 1em; + margin: 0; + font-family: Inconsolata, Consolas, Lucida, Courier, monospaced; + white-space: pre; +} +.match { } +.only_a +{ + background-color: #fdd; + color: red; + text-decoration: line-through; +} +.only_b +{ + background-color: #ddf; + color: blue; + border-left: 3px solid blue +} +h1 { margin-left: 2em; } + CSS + # standard:enable Layout/HeredocIndentation + + def initialize(left, right, options = nil) + @left = left + @right = right + @options = options + + @options = DEFAULT_OPTIONS.dup if @options.nil? + end + + def verify_options + @options[:expand_tabs] ||= 4 + @options[:expand_tabs] = 4 if @options[:expand_tabs].negative? + + @options[:output] ||= $stdout + + @options[:css] ||= DEFAULT_CSS.dup + + @options[:title] ||= "diff" + end + private :verify_options + + attr_reader :options + + def run + verify_options + + if @options[:expand_tabs].positive? && self.class.can_expand_tabs + formatter = Text::Format.new + formatter.tabstop = @options[:expand_tabs] + + @left.map! { |line| formatter.expand(line.chomp) } + @right.map! { |line| formatter.expand(line.chomp) } + end + + @left.map! { |line| ERB::Util.html_escape(line.chomp) } + @right.map! { |line| ERB::Util.html_escape(line.chomp) } + + # standard:disable Layout/HeredocIndentation + @options[:output] << <<-OUTPUT + + + #{@options[:title]} + + + +

#{@options[:title]}

+

Legend: Only in Old  + Only in New

+
+ OUTPUT + # standard:enable Layout/HeredocIndentation + + callbacks = Callbacks.new(@options[:output]) + Diff::LCS.traverse_sequences(@left, @right, callbacks) + + # standard:disable Layout/HeredocIndentation + @options[:output] << <<-OUTPUT +
+ + + OUTPUT + # standard:enable Layout/HeredocIndentation + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/hunk.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/hunk.rb new file mode 100644 index 0000000..24b33bc --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/hunk.rb @@ -0,0 +1,379 @@ +# frozen_string_literal: true + +require "diff/lcs/block" + +# A Hunk is a group of Blocks which overlap because of the context surrounding +# each block. (So if we're not using context, every hunk will contain one +# block.) Used in the diff program (bin/ldiff). +class Diff::LCS::Hunk + OLD_DIFF_OP_ACTION = {"+" => "a", "-" => "d", "!" => "c"}.freeze # :nodoc: + ED_DIFF_OP_ACTION = {"+" => "a", "-" => "d", "!" => "c"}.freeze # :nodoc: + + private_constant :OLD_DIFF_OP_ACTION, :ED_DIFF_OP_ACTION if respond_to?(:private_constant) + + # Create a hunk using references to both the old and new data, as well as the + # piece of data. + def initialize(data_old, data_new, piece, flag_context, file_length_difference) + # At first, a hunk will have just one Block in it + @blocks = [Diff::LCS::Block.new(piece)] + + if @blocks[0].remove.empty? && @blocks[0].insert.empty? + fail "Cannot build a hunk from #{piece.inspect}; has no add or remove actions" + end + + if String.method_defined?(:encoding) + @preferred_data_encoding = data_old.fetch(0) { data_new.fetch(0) { "" } }.encoding + end + + @data_old = data_old + @data_new = data_new + @old_empty = data_old.empty? || (data_old.size == 1 && data_old[0].empty?) + @new_empty = data_new.empty? || (data_new.size == 1 && data_new[0].empty?) + + before = after = file_length_difference + after += @blocks[0].diff_size + @file_length_difference = after # The caller must get this manually + @max_diff_size = @blocks.map { |e| e.diff_size.abs }.max + + # Save the start & end of each array. If the array doesn't exist (e.g., + # we're only adding items in this block), then figure out the line number + # based on the line number of the other file and the current difference in + # file lengths. + if @blocks[0].remove.empty? + a1 = a2 = nil + else + a1 = @blocks[0].remove[0].position + a2 = @blocks[0].remove[-1].position + end + + if @blocks[0].insert.empty? + b1 = b2 = nil + else + b1 = @blocks[0].insert[0].position + b2 = @blocks[0].insert[-1].position + end + + @start_old = a1 || (b1 - before) + @start_new = b1 || (a1 + before) + @end_old = a2 || (b2 - after) + @end_new = b2 || (a2 + after) + + self.flag_context = flag_context + end + + attr_reader :blocks + attr_reader :start_old, :start_new + attr_reader :end_old, :end_new + attr_reader :file_length_difference + + # Change the "start" and "end" fields to note that context should be added + # to this hunk. + attr_accessor :flag_context + undef :flag_context= + def flag_context=(context) # :nodoc: # standard:disable Lint/DuplicateMethods + return if context.nil? || context.zero? + + add_start = (context > @start_old) ? @start_old : context + + @start_old -= add_start + @start_new -= add_start + + old_size = @data_old.size + + add_end = + if (@end_old + context) >= old_size + old_size - @end_old - 1 + else + context + end + + @end_old += add_end + @end_new += add_end + end + + # Merges this hunk and the provided hunk together if they overlap. Returns + # a truthy value so that if there is no overlap, you can know the merge + # was skipped. + def merge(hunk) + return unless overlaps?(hunk) + + @start_old = hunk.start_old + @start_new = hunk.start_new + blocks.unshift(*hunk.blocks) + end + alias_method :unshift, :merge + + # Determines whether there is an overlap between this hunk and the + # provided hunk. This will be true if the difference between the two hunks + # start or end positions is within one position of each other. + def overlaps?(hunk) + hunk and (((@start_old - hunk.end_old) <= 1) or + ((@start_new - hunk.end_new) <= 1)) + end + + # Returns a diff string based on a format. + def diff(format, last = false) + case format + when :old + old_diff(last) + when :unified + unified_diff(last) + when :context + context_diff(last) + when :ed + self + when :reverse_ed, :ed_finish + ed_diff(format, last) + else + fail "Unknown diff format #{format}." + end + end + + # Note that an old diff can't have any context. Therefore, we know that + # there's only one block in the hunk. + def old_diff(last = false) + warn "Expecting only one block in an old diff hunk!" if @blocks.size > 1 + + block = @blocks[0] + + if last + old_missing_newline = !@old_empty && missing_last_newline?(@data_old) + new_missing_newline = !@new_empty && missing_last_newline?(@data_new) + end + + # Calculate item number range. Old diff range is just like a context + # diff range, except the ranges are on one line with the action between + # them. + s = encode("#{context_range(:old, ",")}#{OLD_DIFF_OP_ACTION[block.op]}#{context_range(:new, ",")}\n") + # If removing anything, just print out all the remove lines in the hunk + # which is just all the remove lines in the block. + unless block.remove.empty? + @data_old[@start_old..@end_old].each { |e| s << encode("< ") + e.chomp + encode("\n") } + end + + s << encode("\\ No newline at end of file\n") if old_missing_newline && !new_missing_newline + s << encode("---\n") if block.op == "!" + + unless block.insert.empty? + @data_new[@start_new..@end_new].each { |e| s << encode("> ") + e.chomp + encode("\n") } + end + + s << encode("\\ No newline at end of file\n") if new_missing_newline && !old_missing_newline + + s + end + private :old_diff + + def unified_diff(last = false) + # Calculate item number range. + s = encode("@@ -#{unified_range(:old)} +#{unified_range(:new)} @@\n") + + # Outlist starts containing the hunk of the old file. Removing an item + # just means putting a '-' in front of it. Inserting an item requires + # getting it from the new file and splicing it in. We splice in + # +num_added+ items. Remove blocks use +num_added+ because splicing + # changed the length of outlist. + # + # We remove +num_removed+ items. Insert blocks use +num_removed+ + # because their item numbers -- corresponding to positions in the NEW + # file -- don't take removed items into account. + lo, hi, num_added, num_removed = @start_old, @end_old, 0, 0 + + # standard:disable Performance/UnfreezeString + outlist = @data_old[lo..hi].map { |e| String.new("#{encode(" ")}#{e.chomp}") } + # standard:enable Performance/UnfreezeString + + last_block = blocks[-1] + + if last + old_missing_newline = !@old_empty && missing_last_newline?(@data_old) + new_missing_newline = !@new_empty && missing_last_newline?(@data_new) + end + + @blocks.each do |block| + block.remove.each do |item| + op = item.action.to_s # - + offset = item.position - lo + num_added + outlist[offset][0, 1] = encode(op) + num_removed += 1 + end + + if last && block == last_block && old_missing_newline && !new_missing_newline + outlist << encode('\\ No newline at end of file') + num_removed += 1 + end + + block.insert.each do |item| + op = item.action.to_s # + + offset = item.position - @start_new + num_removed + outlist[offset, 0] = encode(op) + @data_new[item.position].chomp + num_added += 1 + end + end + + outlist << encode('\\ No newline at end of file') if last && new_missing_newline + + s << outlist.join(encode("\n")) + + s + end + private :unified_diff + + def context_diff(last = false) + s = encode("***************\n") + s << encode("*** #{context_range(:old, ",")} ****\n") + r = context_range(:new, ",") + + if last + old_missing_newline = missing_last_newline?(@data_old) + new_missing_newline = missing_last_newline?(@data_new) + end + + # Print out file 1 part for each block in context diff format if there + # are any blocks that remove items + lo, hi = @start_old, @end_old + removes = @blocks.reject { |e| e.remove.empty? } + + unless removes.empty? + # standard:disable Performance/UnfreezeString + outlist = @data_old[lo..hi].map { |e| String.new("#{encode(" ")}#{e.chomp}") } + # standard:enable Performance/UnfreezeString + + last_block = removes[-1] + + removes.each do |block| + block.remove.each do |item| + outlist[item.position - lo][0, 1] = encode(block.op) # - or ! + end + + if last && block == last_block && old_missing_newline + outlist << encode('\\ No newline at end of file') + end + end + + s << outlist.join(encode("\n")) << encode("\n") + end + + s << encode("--- #{r} ----\n") + lo, hi = @start_new, @end_new + inserts = @blocks.reject { |e| e.insert.empty? } + + unless inserts.empty? + # standard:disable Performance/UnfreezeString + outlist = @data_new[lo..hi].map { |e| String.new("#{encode(" ")}#{e.chomp}") } + # standard:enable Performance/UnfreezeString + + last_block = inserts[-1] + + inserts.each do |block| + block.insert.each do |item| + outlist[item.position - lo][0, 1] = encode(block.op) # + or ! + end + + if last && block == last_block && new_missing_newline + outlist << encode('\\ No newline at end of file') + end + end + s << outlist.join(encode("\n")) + end + + s + end + private :context_diff + + def ed_diff(format, last) + warn "Expecting only one block in an old diff hunk!" if @blocks.size > 1 + if last + # ed script doesn't support well incomplete lines + warn ": No newline at end of file\n" if !@old_empty && missing_last_newline?(@data_old) + warn ": No newline at end of file\n" if !@new_empty && missing_last_newline?(@data_new) + + if @blocks[0].op == "!" + return +"" if @blocks[0].changes[0].element == @blocks[0].changes[1].element + "\n" + return +"" if @blocks[0].changes[0].element + "\n" == @blocks[0].changes[1].element + end + end + + s = + if format == :reverse_ed + encode("#{ED_DIFF_OP_ACTION[@blocks[0].op]}#{context_range(:old, " ")}\n") + else + encode("#{context_range(:old, ",")}#{ED_DIFF_OP_ACTION[@blocks[0].op]}\n") + end + + unless @blocks[0].insert.empty? + @data_new[@start_new..@end_new].each do |e| + s << e.chomp + encode("\n") + end + s << encode(".\n") + end + s + end + private :ed_diff + + # Generate a range of item numbers to print. Only print 1 number if the + # range has only one item in it. Otherwise, it's 'start,end' + def context_range(mode, op) + case mode + when :old + s, e = (@start_old + 1), (@end_old + 1) + when :new + s, e = (@start_new + 1), (@end_new + 1) + end + + (s < e) ? "#{s}#{op}#{e}" : e.to_s + end + private :context_range + + # Generate a range of item numbers to print for unified diff. Print number + # where block starts, followed by number of lines in the block + # (don't print number of lines if it's 1) + def unified_range(mode) + case mode + when :old + return "0,0" if @old_empty + s, e = (@start_old + 1), (@end_old + 1) + when :new + return "0,0" if @new_empty + s, e = (@start_new + 1), (@end_new + 1) + end + + length = e - s + 1 + + (length <= 1) ? e.to_s : "#{s},#{length}" + end + private :unified_range + + def missing_last_newline?(data) + newline = encode("\n") + + if data[-2] + data[-2].end_with?(newline) && !data[-1].end_with?(newline) + elsif data[-1] + !data[-1].end_with?(newline) + else + true + end + end + + if String.method_defined?(:encoding) + def encode(literal, target_encoding = @preferred_data_encoding) + literal.encode target_encoding + end + + def encode_as(string, *args) + args.map { |arg| arg.encode(string.encoding) } + end + else + def encode(literal, _target_encoding = nil) + literal + end + + def encode_as(_string, *args) + args + end + end + + private :encode + private :encode_as +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/internals.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/internals.rb new file mode 100644 index 0000000..8a9160a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/internals.rb @@ -0,0 +1,308 @@ +# frozen_string_literal: true + +class << Diff::LCS + def diff_traversal(method, seq1, seq2, callbacks, &block) + callbacks = callbacks_for(callbacks) + case method + when :diff + traverse_sequences(seq1, seq2, callbacks) + when :sdiff + traverse_balanced(seq1, seq2, callbacks) + end + callbacks.finish if callbacks.respond_to? :finish + + if block + callbacks.diffs.map do |hunk| + if hunk.is_a? Array + hunk.map { |hunk_block| block[hunk_block] } + else + block[hunk] + end + end + else + callbacks.diffs + end + end + private :diff_traversal +end + +module Diff::LCS::Internals # :nodoc: +end + +class << Diff::LCS::Internals + # Compute the longest common subsequence between the sequenced + # Enumerables +a+ and +b+. The result is an array whose contents is such + # that + # + # result = Diff::LCS::Internals.lcs(a, b) + # result.each_with_index do |e, i| + # assert_equal(a[i], b[e]) unless e.nil? + # end + def lcs(a, b) + a_start = b_start = 0 + a_finish = a.size - 1 + b_finish = b.size - 1 + vector = [] + + # Collect any common elements at the beginning... + while (a_start <= a_finish) && (b_start <= b_finish) && (a[a_start] == b[b_start]) + vector[a_start] = b_start + a_start += 1 + b_start += 1 + end + + # Now the end... + while (a_start <= a_finish) && (b_start <= b_finish) && (a[a_finish] == b[b_finish]) + vector[a_finish] = b_finish + a_finish -= 1 + b_finish -= 1 + end + + # Now, compute the equivalence classes of positions of elements. + # An explanation for how this works: https://codeforces.com/topic/92191 + b_matches = position_hash(b, b_start..b_finish) + + thresh = [] + links = [] + string = a.is_a?(String) + + (a_start..a_finish).each do |i| + ai = string ? a[i, 1] : a[i] + bm = b_matches[ai] + k = nil + bm.reverse_each do |j| + # Although the threshold check is not mandatory for this to work, + # it may have an optimization purpose + # An attempt to remove it: https://github.com/halostatue/diff-lcs/pull/72 + # Why it is reintroduced: https://github.com/halostatue/diff-lcs/issues/78 + if k && (thresh[k] > j) && (thresh[k - 1] < j) + thresh[k] = j + else + k = replace_next_larger(thresh, j, k) + end + links[k] = [k.positive? ? links[k - 1] : nil, i, j] unless k.nil? + end + end + + unless thresh.empty? + link = links[thresh.size - 1] + until link.nil? + vector[link[1]] = link[2] + link = link[0] + end + end + + vector + end + + # This method will analyze the provided patchset to provide a single-pass + # normalization (conversion of the array form of Diff::LCS::Change objects to + # the object form of same) and detection of whether the patchset represents + # changes to be made. + def analyze_patchset(patchset, depth = 0) + fail "Patchset too complex" if depth > 1 + + has_changes = false + new_patchset = [] + + # Format: + # [ # patchset + # # hunk (change) + # [ # hunk + # # change + # ] + # ] + + patchset.each do |hunk| + case hunk + when Diff::LCS::Change + has_changes ||= !hunk.unchanged? + new_patchset << hunk + when Array + # Detect if the 'hunk' is actually an array-format change object. + if Diff::LCS::Change.valid_action? hunk[0] + hunk = Diff::LCS::Change.from_a(hunk) + has_changes ||= !hunk.unchanged? + new_patchset << hunk + else + with_changes, hunk = analyze_patchset(hunk, depth + 1) + has_changes ||= with_changes + new_patchset.concat(hunk) + end + else + fail ArgumentError, "Cannot normalise a hunk of class #{hunk.class}." + end + end + + [has_changes, new_patchset] + end + + # Examine the patchset and the source to see in which direction the + # patch should be applied. + # + # WARNING: By default, this examines the whole patch, so this could take + # some time. This also works better with Diff::LCS::ContextChange or + # Diff::LCS::Change as its source, as an array will cause the creation + # of one of the above. + def intuit_diff_direction(src, patchset, limit = nil) + string = src.is_a?(String) + count = left_match = left_miss = right_match = right_miss = 0 + + patchset.each do |change| + count += 1 + + case change + when Diff::LCS::ContextChange + le = string ? src[change.old_position, 1] : src[change.old_position] + re = string ? src[change.new_position, 1] : src[change.new_position] + + case change.action + when "-" # Remove details from the old string + if le == change.old_element + left_match += 1 + else + left_miss += 1 + end + when "+" + if re == change.new_element + right_match += 1 + else + right_miss += 1 + end + when "=" + left_miss += 1 if le != change.old_element + right_miss += 1 if re != change.new_element + when "!" + if le == change.old_element + left_match += 1 + elsif re == change.new_element + right_match += 1 + else + left_miss += 1 + right_miss += 1 + end + end + when Diff::LCS::Change + # With a simplistic change, we can't tell the difference between + # the left and right on '!' actions, so we ignore those. On '=' + # actions, if there's a miss, we miss both left and right. + element = string ? src[change.position, 1] : src[change.position] + + case change.action + when "-" + if element == change.element + left_match += 1 + else + left_miss += 1 + end + when "+" + if element == change.element + right_match += 1 + else + right_miss += 1 + end + when "=" + if element != change.element + left_miss += 1 + right_miss += 1 + end + end + end + + break if !limit.nil? && (count > limit) + end + + no_left = left_match.zero? && left_miss.positive? + no_right = right_match.zero? && right_miss.positive? + + case [no_left, no_right] + when [false, true] + :patch + when [true, false] + :unpatch + else + case left_match <=> right_match + when 1 + if left_miss.zero? + :patch + else + :unpatch + end + when -1 + if right_miss.zero? + :unpatch + else + :patch + end + else + fail "The provided patchset does not appear to apply to the provided \ +enumerable as either source or destination value." + end + end + end + + # Find the place at which +value+ would normally be inserted into the + # Enumerable. If that place is already occupied by +value+, do nothing + # and return +nil+. If the place does not exist (i.e., it is off the end + # of the Enumerable), add it to the end. Otherwise, replace the element + # at that point with +value+. It is assumed that the Enumerable's values + # are numeric. + # + # This operation preserves the sort order. + def replace_next_larger(enum, value, last_index = nil) + # Off the end? + if enum.empty? || (value > enum[-1]) + enum << value + return enum.size - 1 + end + + # Binary search for the insertion point + last_index ||= enum.size - 1 + first_index = 0 + while first_index <= last_index + i = (first_index + last_index) >> 1 + + found = enum[i] + + return nil if value == found + + if value > found + first_index = i + 1 + else + last_index = i - 1 + end + end + + # The insertion point is in first_index; overwrite the next larger + # value. + enum[first_index] = value + first_index + end + private :replace_next_larger + + # If +vector+ maps the matching elements of another collection onto this + # Enumerable, compute the inverse of +vector+ that maps this Enumerable + # onto the collection. (Currently unused.) + def inverse_vector(a, vector) + inverse = a.dup + (0...vector.size).each do |i| + inverse[vector[i]] = i unless vector[i].nil? + end + inverse + end + private :inverse_vector + + # Returns a hash mapping each element of an Enumerable to the set of + # positions it occupies in the Enumerable, optionally restricted to the + # elements specified in the range of indexes specified by +interval+. + def position_hash(enum, interval) + string = enum.is_a?(String) + hash = Hash.new { |h, k| h[k] = [] } + interval.each do |i| + k = string ? enum[i, 1] : enum[i] + hash[k] << i + end + hash + end + private :position_hash +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/ldiff.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/ldiff.rb new file mode 100644 index 0000000..6442c9b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/ldiff.rb @@ -0,0 +1,189 @@ +# frozen_string_literal: true + +require "optparse" +require "diff/lcs/hunk" + +class Diff::LCS::Ldiff # :nodoc: + # standard:disable Layout/HeredocIndentation + BANNER = <<-COPYRIGHT +ldiff #{Diff::LCS::VERSION} + Copyright 2004-2025 Austin Ziegler + + Part of Diff::LCS. + https://github.com/halostatue/diff-lcs + + This program is free software. It may be redistributed and/or modified under + the terms of the GPL version 2 (or later), the Perl Artistic licence, or the + MIT licence. + COPYRIGHT + # standard:enable Layout/HeredocIndentation + + InputInfo = Struct.new(:filename, :data, :stat) do + def initialize(filename) + super(filename, ::File.read(filename), ::File.stat(filename)) + end + end + + attr_reader :format, :lines # :nodoc: + attr_reader :file_old, :file_new # :nodoc: + attr_reader :data_old, :data_new # :nodoc: + + def self.run(args, input = $stdin, output = $stdout, error = $stderr) # :nodoc: + new.run(args, input, output, error) + end + + def initialize + @binary = nil + @format = :old + @lines = 0 + end + + def run(args, _input = $stdin, output = $stdout, error = $stderr) # :nodoc: + args.options do |o| + o.banner = "Usage: #{File.basename($0)} [options] oldfile newfile" + o.separator "" + o.on( + "-c", "-C", "--context [LINES]", Integer, + "Displays a context diff with LINES lines", "of context. Default 3 lines." + ) do |ctx| + @format = :context + @lines = ctx || 3 + end + o.on( + "-u", "-U", "--unified [LINES]", Integer, + "Displays a unified diff with LINES lines", "of context. Default 3 lines." + ) do |ctx| + @format = :unified + @lines = ctx || 3 + end + o.on("-e", "Creates an 'ed' script to change", "oldfile to newfile.") do |_ctx| + @format = :ed + end + o.on("-f", "Creates an 'ed' script to change", "oldfile to newfile in reverse order.") do |_ctx| + @format = :reverse_ed + end + o.on( + "-a", "--text", + "Treat the files as text and compare them", "line-by-line, even if they do not seem", "to be text." + ) do |_txt| + @binary = false + end + o.on("--binary", "Treats the files as binary.") do |_bin| + @binary = true + end + o.on("-q", "--brief", "Report only whether or not the files", "differ, not the details.") do |_ctx| + @format = :report + end + o.on_tail("--help", "Shows this text.") do + error << o + return 0 + end + o.on_tail("--version", "Shows the version of Diff::LCS.") do + error << Diff::LCS::Ldiff::BANNER + return 0 + end + o.on_tail "" + o.on_tail 'By default, runs produces an "old-style" diff, with output like UNIX diff.' + o.parse! + end + + unless args.size == 2 + error << args.options + return 127 + end + + # Defaults are for old-style diff + @format ||= :old + @lines ||= 0 + + file_old, file_new = *ARGV + diff?( + InputInfo.new(file_old), + InputInfo.new(file_new), + @format, + output, + binary: @binary, + lines: @lines + ) ? 1 : 0 + end + + def diff?(info_old, info_new, format, output, binary: nil, lines: 0) + case format + when :context + char_old = "*" * 3 + char_new = "-" * 3 + when :unified + char_old = "-" * 3 + char_new = "+" * 3 + end + + # After we've read up to a certain point in each file, the number of + # items we've read from each file will differ by FLD (could be 0). + file_length_difference = 0 + + # Test binary status + if binary.nil? + old_bin = info_old.data[0, 4096].include?("\0") + new_bin = info_new.data[0, 4096].include?("\0") + binary = old_bin || new_bin + end + + # diff yields lots of pieces, each of which is basically a Block object + if binary + has_diffs = (info_old.data != info_new.data) + if format != :report + if has_diffs + output << "Binary files #{info_old.filename} and #{info_new.filename} differ\n" + return true + end + return false + end + else + data_old = info_old.data.lines.to_a + data_new = info_new.data.lines.to_a + diffs = Diff::LCS.diff(data_old, data_new) + return false if diffs.empty? + end + + case format + when :report + output << "Files #{info_old.filename} and #{info_new.filename} differ\n" + return true + when :unified, :context + ft = info_old.stat.mtime.localtime.strftime("%Y-%m-%d %H:%M:%S.000000000 %z") + output << "#{char_old} #{info_old.filename}\t#{ft}\n" + ft = info_new.stat.mtime.localtime.strftime("%Y-%m-%d %H:%M:%S.000000000 %z") + output << "#{char_new} #{info_new.filename}\t#{ft}\n" + when :ed + real_output = output + output = [] + end + + # Loop over hunks. If a hunk overlaps with the last hunk, join them. + # Otherwise, print out the old one. + oldhunk = hunk = nil + diffs.each do |piece| + begin + hunk = Diff::LCS::Hunk.new(data_old, data_new, piece, lines, file_length_difference) + file_length_difference = hunk.file_length_difference + + next unless oldhunk + next if lines.positive? && hunk.merge(oldhunk) + + output << oldhunk.diff(format) + output << "\n" if format == :unified + ensure + oldhunk = hunk + end + end + + last = oldhunk.diff(format, true) + last << "\n" unless last.is_a?(Diff::LCS::Hunk) || last.empty? || last.end_with?("\n") + + output << last + + output.reverse_each { |e| real_output << e.diff(:ed_finish, e == output[0]) } if format == :ed + + true + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/string.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/string.rb new file mode 100644 index 0000000..9ab32e9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/string.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class String + include Diff::LCS +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/version.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/version.rb new file mode 100644 index 0000000..82830e3 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/version.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Diff + module LCS + VERSION = "1.6.2" + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/mise.toml b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/mise.toml new file mode 100644 index 0000000..22418cf --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/mise.toml @@ -0,0 +1,5 @@ +[tools] +ruby = "3.4" + +[env] +MAINTENANCE = "true" diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/change_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/change_spec.rb new file mode 100644 index 0000000..42533ae --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/change_spec.rb @@ -0,0 +1,89 @@ +# frozen_string_literal: true + +require "spec_helper" + +describe Diff::LCS::Change do + describe "an add" do + subject { described_class.new("+", 0, "element") } + it { should_not be_deleting } + it { should be_adding } + it { should_not be_unchanged } + it { should_not be_changed } + it { should_not be_finished_a } + it { should_not be_finished_b } + end + + describe "a delete" do + subject { described_class.new("-", 0, "element") } + it { should be_deleting } + it { should_not be_adding } + it { should_not be_unchanged } + it { should_not be_changed } + it { should_not be_finished_a } + it { should_not be_finished_b } + end + + describe "an unchanged" do + subject { described_class.new("=", 0, "element") } + it { should_not be_deleting } + it { should_not be_adding } + it { should be_unchanged } + it { should_not be_changed } + it { should_not be_finished_a } + it { should_not be_finished_b } + end + + describe "a changed" do + subject { described_class.new("!", 0, "element") } + it { should_not be_deleting } + it { should_not be_adding } + it { should_not be_unchanged } + it { should be_changed } + it { should_not be_finished_a } + it { should_not be_finished_b } + end + + describe "a finished_a" do + subject { described_class.new(">", 0, "element") } + it { should_not be_deleting } + it { should_not be_adding } + it { should_not be_unchanged } + it { should_not be_changed } + it { should be_finished_a } + it { should_not be_finished_b } + end + + describe "a finished_b" do + subject { described_class.new("<", 0, "element") } + it { should_not be_deleting } + it { should_not be_adding } + it { should_not be_unchanged } + it { should_not be_changed } + it { should_not be_finished_a } + it { should be_finished_b } + end + + describe "as array" do + it "should be converted" do + action, position, element = described_class.new("!", 0, "element") + expect(action).to eq "!" + expect(position).to eq 0 + expect(element).to eq "element" + end + end +end + +describe Diff::LCS::ContextChange do + describe "as array" do + it "should be converted" do + action, (old_position, old_element), (new_position, new_element) = + described_class.new("!", 1, "old_element", 2, "new_element") + + expect(action).to eq "!" + expect(old_position).to eq 1 + expect(old_element).to eq "old_element" + expect(new_position).to eq 2 + expect(new_element).to eq "new_element" + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/diff_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/diff_spec.rb new file mode 100644 index 0000000..869f098 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/diff_spec.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +require "spec_helper" + +describe Diff::LCS, ".diff" do + include Diff::LCS::SpecHelper::Matchers + + it "correctly diffs seq1 to seq2" do + diff_s1_s2 = Diff::LCS.diff(seq1, seq2) + expect(change_diff(correct_forward_diff)).to eq(diff_s1_s2) + end + + it "correctly diffs seq2 to seq1" do + diff_s2_s1 = Diff::LCS.diff(seq2, seq1) + expect(change_diff(correct_backward_diff)).to eq(diff_s2_s1) + end + + it "correctly diffs against an empty sequence" do + diff = Diff::LCS.diff(word_sequence, []) + correct_diff = [ + [ + ["-", 0, "abcd"], + ["-", 1, "efgh"], + ["-", 2, "ijkl"], + ["-", 3, "mnopqrstuvwxyz"] + ] + ] + + expect(change_diff(correct_diff)).to eq(diff) + + diff = Diff::LCS.diff([], word_sequence) + correct_diff.each do |hunk| + hunk.each { |change| change[0] = "+" } + end + expect(change_diff(correct_diff)).to eq(diff) + end + + it "correctly diffs 'xx' and 'xaxb'" do + left = "xx" + right = "xaxb" + expect(Diff::LCS.patch(left, Diff::LCS.diff(left, right))).to eq(right) + end + + it "returns an empty diff with (hello, hello)" do + expect(Diff::LCS.diff(hello, hello)).to be_empty + end + + it "returns an empty diff with (hello_ary, hello_ary)" do + expect(Diff::LCS.diff(hello_ary, hello_ary)).to be_empty + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/123_x b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/123_x new file mode 100644 index 0000000..cd34c23 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/123_x @@ -0,0 +1,2 @@ +123 +x diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/456_x b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/456_x new file mode 100644 index 0000000..9a823ac --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/456_x @@ -0,0 +1,2 @@ +456 +x diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/aX b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/aX new file mode 100644 index 0000000..5765d6a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/aX @@ -0,0 +1 @@ +aX diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/bXaX b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/bXaX new file mode 100644 index 0000000..a1c813d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/bXaX @@ -0,0 +1 @@ +bXaX diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ds1.csv b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ds1.csv new file mode 100644 index 0000000..9ac8428 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ds1.csv @@ -0,0 +1,50 @@ +1,3 +2,7 +3,13 +4,21 +5,31 +6,43 +7,57 +8,73 +9,91 +10,111 +11,133 +12,157 +13,183 +14,211 +15,241 +16,273 +17,307 +18,343 +19,381 +20,421 +21,463 +22,507 +23,553 +24,601 +25,651 +26,703 +27,757 +28,813 +29,871 +30,931 +31,993 +32,1057 +33,1123 +34,1191 +35,1261 +36,1333 +37,1407 +38,1483 +39,1561 +40,1641 +41,1723 +42,1807 +43,1893 +44,1981 +45,2071 +46,2163 +47,2257 +48,2353 +49,2451 +50,2500 \ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ds2.csv b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ds2.csv new file mode 100644 index 0000000..797de76 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ds2.csv @@ -0,0 +1,51 @@ + 1,3 +2,7 +3,13 +4,21 +5,31 +6,42 +7,57 +8,73 +9,91 +10,111 +11,133 +12,157 +13,183 +14,211 +15,241 +16,273 +17,307 +18,343 +19,200 +20,421 +21,463 +22,507 +23,553 +24,601 +25,651 +26,703 +27,757 +28,813 +29,871 +30,931 +31,123 +32,1057 +33,1123 +34,1000 +35,1261 +36,1333 +37,1407 +38,1483 +39,1561 +40,1641 +41,1723 +42,1807 +43,1893 +44,1981 +45,2071 +46,2163 +47,1524 +48,2353 +49,2451 +50,2500 +51,2520 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/empty b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/empty new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/file1.bin b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/file1.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/file2.bin b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/file2.bin new file mode 100644 index 0000000000000000000000000000000000000000..ba18e3dcc474e720bdd955f81c8848324c862840 GIT binary patch literal 6 Ncmc~u&B@7U000O<0u=xN literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/four_lines b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/four_lines new file mode 100644 index 0000000..f384549 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/four_lines @@ -0,0 +1,4 @@ +one +two +three +four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/four_lines_with_missing_new_line b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/four_lines_with_missing_new_line new file mode 100644 index 0000000..c40a3bd --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/four_lines_with_missing_new_line @@ -0,0 +1,4 @@ +one +two +three +four \ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line1-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line1-e new file mode 100644 index 0000000..1e8a89c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line1-e @@ -0,0 +1 @@ +No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line1-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line1-f new file mode 100644 index 0000000..1e8a89c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line1-f @@ -0,0 +1 @@ +No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line2-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line2-e new file mode 100644 index 0000000..1e8a89c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line2-e @@ -0,0 +1 @@ +No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line2-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line2-f new file mode 100644 index 0000000..1e8a89c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line2-f @@ -0,0 +1 @@ +No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.chef-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.chef-e new file mode 100644 index 0000000..8ed0319 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.chef-e @@ -0,0 +1,2 @@ +: No newline at end of file +: No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.chef-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.chef-f new file mode 100644 index 0000000..8ed0319 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.chef-f @@ -0,0 +1,2 @@ +: No newline at end of file +: No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line1-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line1-e new file mode 100644 index 0000000..397dd5b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line1-e @@ -0,0 +1 @@ +: No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line1-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line1-f new file mode 100644 index 0000000..397dd5b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line1-f @@ -0,0 +1 @@ +: No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line2-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line2-e new file mode 100644 index 0000000..f9493ef --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line2-e @@ -0,0 +1 @@ +: No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line2-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line2-f new file mode 100644 index 0000000..f9493ef --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line2-f @@ -0,0 +1 @@ +: No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff new file mode 100644 index 0000000..fa1a347 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff @@ -0,0 +1,4 @@ +1c1 +< aX +--- +> bXaX diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-c new file mode 100644 index 0000000..0e1ad99 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-c @@ -0,0 +1,7 @@ +*** spec/fixtures/aX 2020-06-23 11:15:32.000000000 -0400 +--- spec/fixtures/bXaX 2020-06-23 11:15:32.000000000 -0400 +*************** +*** 1 **** +! aX +--- 1 ---- +! bXaX diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-e new file mode 100644 index 0000000..13e0f7f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-e @@ -0,0 +1,3 @@ +1c +bXaX +. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-f new file mode 100644 index 0000000..77710c7 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-f @@ -0,0 +1,3 @@ +c1 +bXaX +. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-u new file mode 100644 index 0000000..b84f718 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-u @@ -0,0 +1,5 @@ +--- spec/fixtures/aX 2020-06-23 11:15:32.000000000 -0400 ++++ spec/fixtures/bXaX 2020-06-23 11:15:32.000000000 -0400 +@@ -1 +1 @@ +-aX ++bXaX diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1 b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1 new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-c new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-e new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-f new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-u new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2 b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2 new file mode 100644 index 0000000..41b625c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2 @@ -0,0 +1 @@ +Binary files spec/fixtures/file1.bin and spec/fixtures/file2.bin differ diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-c new file mode 100644 index 0000000..41b625c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-c @@ -0,0 +1 @@ +Binary files spec/fixtures/file1.bin and spec/fixtures/file2.bin differ diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-e new file mode 100644 index 0000000..41b625c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-e @@ -0,0 +1 @@ +Binary files spec/fixtures/file1.bin and spec/fixtures/file2.bin differ diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-f new file mode 100644 index 0000000..41b625c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-f @@ -0,0 +1 @@ +Binary files spec/fixtures/file1.bin and spec/fixtures/file2.bin differ diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-u new file mode 100644 index 0000000..41b625c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-u @@ -0,0 +1 @@ +Binary files spec/fixtures/file1.bin and spec/fixtures/file2.bin differ diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef new file mode 100644 index 0000000..8b98efb --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef @@ -0,0 +1,4 @@ +3c3 +< "description": "hi" +--- +> "description": "lo" diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-c new file mode 100644 index 0000000..efbfa19 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-c @@ -0,0 +1,15 @@ +*** spec/fixtures/old-chef 2020-06-23 23:18:20.000000000 -0400 +--- spec/fixtures/new-chef 2020-06-23 23:18:20.000000000 -0400 +*************** +*** 1,4 **** + { + "name": "x", +! "description": "hi" + } +\ No newline at end of file +--- 1,4 ---- + { + "name": "x", +! "description": "lo" + } +\ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-e new file mode 100644 index 0000000..775d881 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-e @@ -0,0 +1,3 @@ +3c + "description": "lo" +. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-f new file mode 100644 index 0000000..9bf1e67 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-f @@ -0,0 +1,3 @@ +c3 + "description": "lo" +. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-u new file mode 100644 index 0000000..dbacd88 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-u @@ -0,0 +1,9 @@ +--- spec/fixtures/old-chef 2020-06-23 23:18:20.000000000 -0400 ++++ spec/fixtures/new-chef 2020-06-23 23:18:20.000000000 -0400 +@@ -1,4 +1,4 @@ + { + "name": "x", +- "description": "hi" ++ "description": "lo" + } +\ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2 b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2 new file mode 100644 index 0000000..496b3dc --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2 @@ -0,0 +1,7 @@ +2d1 +< recipe[b::default] +14a14,17 +> recipe[o::new] +> recipe[p::new] +> recipe[q::new] +> recipe[r::new] diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-c new file mode 100644 index 0000000..8349a7a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-c @@ -0,0 +1,20 @@ +*** spec/fixtures/old-chef2 2020-06-30 09:43:35.000000000 -0400 +--- spec/fixtures/new-chef2 2020-06-30 09:44:32.000000000 -0400 +*************** +*** 1,5 **** + recipe[a::default] +- recipe[b::default] + recipe[c::default] + recipe[d::default] + recipe[e::default] +--- 1,4 ---- +*************** +*** 12,14 **** +--- 11,17 ---- + recipe[l::default] + recipe[m::default] + recipe[n::default] ++ recipe[o::new] ++ recipe[p::new] ++ recipe[q::new] ++ recipe[r::new] diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-d b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-d new file mode 100644 index 0000000..ca32a49 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-d @@ -0,0 +1,7 @@ +d2 +a14 +recipe[o::new] +recipe[p::new] +recipe[q::new] +recipe[r::new] +. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-e new file mode 100644 index 0000000..89f3fa0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-e @@ -0,0 +1,7 @@ +14a +recipe[o::new] +recipe[p::new] +recipe[q::new] +recipe[r::new] +. +2d diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-f new file mode 100644 index 0000000..ca32a49 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-f @@ -0,0 +1,7 @@ +d2 +a14 +recipe[o::new] +recipe[p::new] +recipe[q::new] +recipe[r::new] +. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-u new file mode 100644 index 0000000..ef025c7 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-u @@ -0,0 +1,16 @@ +--- spec/fixtures/old-chef2 2020-06-30 09:43:35.000000000 -0400 ++++ spec/fixtures/new-chef2 2020-06-30 09:44:32.000000000 -0400 +@@ -1,5 +1,4 @@ + recipe[a::default] +-recipe[b::default] + recipe[c::default] + recipe[d::default] + recipe[e::default] +@@ -12,3 +11,7 @@ + recipe[l::default] + recipe[m::default] + recipe[n::default] ++recipe[o::new] ++recipe[p::new] ++recipe[q::new] ++recipe[r::new] diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines new file mode 100644 index 0000000..e2afc31 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines @@ -0,0 +1,5 @@ +0a1,4 +> one +> two +> three +> four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-c new file mode 100644 index 0000000..be0e827 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-c @@ -0,0 +1,9 @@ +*** spec/fixtures/empty 2025-01-31 12:14:52.856031635 +0100 +--- spec/fixtures/four_lines 2025-01-31 12:13:45.476036544 +0100 +*************** +*** 0 **** +--- 1,4 ---- ++ one ++ two ++ three ++ four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-e new file mode 100644 index 0000000..f8f92fe --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-e @@ -0,0 +1,6 @@ +0a +one +two +three +four +. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-f new file mode 100644 index 0000000..f02e5a0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-f @@ -0,0 +1,6 @@ +a0 +one +two +three +four +. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-u new file mode 100644 index 0000000..60bd55c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-u @@ -0,0 +1,7 @@ +--- spec/fixtures/empty 2025-01-31 12:14:52.856031635 +0100 ++++ spec/fixtures/four_lines 2025-01-31 12:13:45.476036544 +0100 +@@ -0,0 +1,4 @@ ++one ++two ++three ++four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty new file mode 100644 index 0000000..67d0a58 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty @@ -0,0 +1,5 @@ +1,4d0 +< one +< two +< three +< four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-c new file mode 100644 index 0000000..b216344 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-c @@ -0,0 +1,9 @@ +*** spec/fixtures/four_lines 2025-01-31 12:13:45.476036544 +0100 +--- spec/fixtures/empty 2025-01-31 12:14:52.856031635 +0100 +*************** +*** 1,4 **** +- one +- two +- three +- four +--- 0 ---- diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-e new file mode 100644 index 0000000..c821d7c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-e @@ -0,0 +1 @@ +1,4d diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-f new file mode 100644 index 0000000..442bd5a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-f @@ -0,0 +1 @@ +d1 4 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-u new file mode 100644 index 0000000..79e6d75 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-u @@ -0,0 +1,7 @@ +--- spec/fixtures/four_lines 2025-01-31 12:13:45.476036544 +0100 ++++ spec/fixtures/empty 2025-01-31 12:14:52.856031635 +0100 +@@ -1,4 +0,0 @@ +-one +-two +-three +-four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context new file mode 100644 index 0000000..4335560 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context @@ -0,0 +1,4 @@ +1c1 +< 123 +--- +> 456 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-c new file mode 100644 index 0000000..4b759fa --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-c @@ -0,0 +1,9 @@ +*** spec/fixtures/123_x 2025-01-31 17:00:17.070615716 +0100 +--- spec/fixtures/456_x 2025-01-31 16:58:26.380624827 +0100 +*************** +*** 1,2 **** +! 123 + x +--- 1,2 ---- +! 456 + x diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-e new file mode 100644 index 0000000..7a8334b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-e @@ -0,0 +1,3 @@ +1c +456 +. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-f new file mode 100644 index 0000000..97223a8 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-f @@ -0,0 +1,3 @@ +c1 +456 +. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-u new file mode 100644 index 0000000..7fbf0e2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-u @@ -0,0 +1,6 @@ +--- spec/fixtures/123_x 2025-01-31 17:00:17.070615716 +0100 ++++ spec/fixtures/456_x 2025-01-31 16:58:26.380624827 +0100 +@@ -1,2 +1,2 @@ +-123 ++456 + x diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1 b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1 new file mode 100644 index 0000000..c5cb113 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1 @@ -0,0 +1,5 @@ +4c4 +< four +--- +> four +\ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-c new file mode 100644 index 0000000..55d1ade --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-c @@ -0,0 +1,14 @@ +*** spec/fixtures/four_lines 2025-01-31 12:17:43.926013315 +0100 +--- spec/fixtures/four_lines_with_missing_new_line 2025-01-31 12:17:43.926013315 +0100 +*************** +*** 1,4 **** + one + two + three +! four +--- 1,4 ---- + one + two + three +! four +\ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-e new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-f new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-u new file mode 100644 index 0000000..010518b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-u @@ -0,0 +1,9 @@ +--- spec/fixtures/four_lines 2025-01-31 12:17:43.926013315 +0100 ++++ spec/fixtures/four_lines_with_missing_new_line 2025-01-31 12:17:43.926013315 +0100 +@@ -1,4 +1,4 @@ + one + two + three +-four ++four +\ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2 b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2 new file mode 100644 index 0000000..10e4326 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2 @@ -0,0 +1,5 @@ +4c4 +< four +\ No newline at end of file +--- +> four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-c new file mode 100644 index 0000000..b431030 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-c @@ -0,0 +1,14 @@ +*** spec/fixtures/four_lines_with_missing_new_line 2025-01-31 12:17:43.926013315 +0100 +--- spec/fixtures/four_lines 2025-01-31 12:17:43.926013315 +0100 +*************** +*** 1,4 **** + one + two + three +! four +\ No newline at end of file +--- 1,4 ---- + one + two + three +! four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-e new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-f new file mode 100644 index 0000000..e69de29 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-u new file mode 100644 index 0000000..2481a9e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-u @@ -0,0 +1,9 @@ +--- spec/fixtures/four_lines_with_missing_new_line 2025-01-31 12:17:43.926013315 +0100 ++++ spec/fixtures/four_lines 2025-01-31 12:17:43.926013315 +0100 +@@ -1,4 +1,4 @@ + one + two + three +-four +\ No newline at end of file ++four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/new-chef b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/new-chef new file mode 100644 index 0000000..d7babfe --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/new-chef @@ -0,0 +1,4 @@ +{ + "name": "x", + "description": "lo" +} \ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/new-chef2 b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/new-chef2 new file mode 100644 index 0000000..8213c73 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/new-chef2 @@ -0,0 +1,17 @@ +recipe[a::default] +recipe[c::default] +recipe[d::default] +recipe[e::default] +recipe[f::default] +recipe[g::default] +recipe[h::default] +recipe[i::default] +recipe[j::default] +recipe[k::default] +recipe[l::default] +recipe[m::default] +recipe[n::default] +recipe[o::new] +recipe[p::new] +recipe[q::new] +recipe[r::new] diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/old-chef b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/old-chef new file mode 100644 index 0000000..5f9e38b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/old-chef @@ -0,0 +1,4 @@ +{ + "name": "x", + "description": "hi" +} \ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/old-chef2 b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/old-chef2 new file mode 100644 index 0000000..4a23407 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/old-chef2 @@ -0,0 +1,14 @@ +recipe[a::default] +recipe[b::default] +recipe[c::default] +recipe[d::default] +recipe[e::default] +recipe[f::default] +recipe[g::default] +recipe[h::default] +recipe[i::default] +recipe[j::default] +recipe[k::default] +recipe[l::default] +recipe[m::default] +recipe[n::default] diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/hunk_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/hunk_spec.rb new file mode 100644 index 0000000..7d91039 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/hunk_spec.rb @@ -0,0 +1,83 @@ +# frozen_string_literal: true + +require "spec_helper" + +if String.method_defined?(:encoding) + require "diff/lcs/hunk" + + describe Diff::LCS::Hunk do + let(:old_data) { ["Tu a un carté avec {count} itéms".encode("UTF-16LE")] } + let(:new_data) { ["Tu a un carte avec {count} items".encode("UTF-16LE")] } + let(:pieces) { Diff::LCS.diff old_data, new_data } + let(:hunk) { Diff::LCS::Hunk.new(old_data, new_data, pieces[0], 3, 0) } + + it "produces a unified diff from the two pieces" do + expected = <<-EXPECTED.gsub(/^\s+/, "").encode("UTF-16LE").chomp + @@ -1 +1 @@ + -Tu a un carté avec {count} itéms + +Tu a un carte avec {count} items + EXPECTED + + expect(hunk.diff(:unified)).to eq(expected) + end + + it "produces a unified diff from the two pieces (last entry)" do + expected = <<-EXPECTED.gsub(/^\s+/, "").encode("UTF-16LE").chomp + @@ -1 +1 @@ + -Tu a un carté avec {count} itéms + +Tu a un carte avec {count} items + \\ No newline at end of file + EXPECTED + + expect(hunk.diff(:unified, true)).to eq(expected) + end + + it "produces a context diff from the two pieces" do + expected = <<-EXPECTED.gsub(/^\s+/, "").encode("UTF-16LE").chomp + *************** + *** 1 **** + ! Tu a un carté avec {count} itéms + --- 1 ---- + ! Tu a un carte avec {count} items + EXPECTED + + expect(hunk.diff(:context)).to eq(expected) + end + + it "produces an old diff from the two pieces" do + expected = <<-EXPECTED.gsub(/^ +/, "").encode("UTF-16LE").chomp + 1c1 + < Tu a un carté avec {count} itéms + --- + > Tu a un carte avec {count} items + + EXPECTED + + expect(hunk.diff(:old)).to eq(expected) + end + + it "produces a reverse ed diff from the two pieces" do + expected = <<-EXPECTED.gsub(/^ +/, "").encode("UTF-16LE").chomp + c1 + Tu a un carte avec {count} items + . + + EXPECTED + + expect(hunk.diff(:reverse_ed)).to eq(expected) + end + + context "with empty first data set" do + let(:old_data) { [] } + + it "produces a unified diff" do + expected = <<-EXPECTED.gsub(/^\s+/, "").encode("UTF-16LE").chomp + @@ -0,0 +1 @@ + +Tu a un carte avec {count} items + EXPECTED + + expect(hunk.diff(:unified)).to eq(expected) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/issues_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/issues_spec.rb new file mode 100644 index 0000000..5b0fb2a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/issues_spec.rb @@ -0,0 +1,160 @@ +# frozen_string_literal: true + +require "spec_helper" +require "diff/lcs/hunk" + +describe "Diff::LCS Issues" do + include Diff::LCS::SpecHelper::Matchers + + describe "issue #1" do + shared_examples "handles simple diffs" do |s1, s2, forward_diff| + before do + @diff_s1_s2 = Diff::LCS.diff(s1, s2) + end + + it "creates the correct diff" do + expect(change_diff(forward_diff)).to eq(@diff_s1_s2) + end + + it "creates the correct patch s1->s2" do + expect(Diff::LCS.patch(s1, @diff_s1_s2)).to eq(s2) + end + + it "creates the correct patch s2->s1" do + expect(Diff::LCS.patch(s2, @diff_s1_s2)).to eq(s1) + end + end + + describe "string" do + it_has_behavior "handles simple diffs", "aX", "bXaX", [ + [ + ["+", 0, "b"], + ["+", 1, "X"] + ] + ] + it_has_behavior "handles simple diffs", "bXaX", "aX", [ + [ + ["-", 0, "b"], + ["-", 1, "X"] + ] + ] + end + + describe "array" do + it_has_behavior "handles simple diffs", %w[a X], %w[b X a X], [ + [ + ["+", 0, "b"], + ["+", 1, "X"] + ] + ] + it_has_behavior "handles simple diffs", %w[b X a X], %w[a X], [ + [ + ["-", 0, "b"], + ["-", 1, "X"] + ] + ] + end + end + + describe "issue #57" do + it "should fail with a correct error" do + # standard:disable Style/HashSyntax + expect { + actual = {:category => "app.rack.request"} + expected = {:category => "rack.middleware", :title => "Anonymous Middleware"} + expect(actual).to eq(expected) + }.to raise_error(RSpec::Expectations::ExpectationNotMetError) + # standard:enable Style/HashSyntax + end + end + + describe "issue #65" do + def diff_lines(old_lines, new_lines) + file_length_difference = 0 + previous_hunk = nil + output = [] + + Diff::LCS.diff(old_lines, new_lines).each do |piece| + hunk = Diff::LCS::Hunk.new(old_lines, new_lines, piece, 3, file_length_difference) + file_length_difference = hunk.file_length_difference + maybe_contiguous_hunks = previous_hunk.nil? || hunk.merge(previous_hunk) + + output << "#{previous_hunk.diff(:unified)}\n" unless maybe_contiguous_hunks + + previous_hunk = hunk + end + output << "#{previous_hunk.diff(:unified, true)}\n" unless previous_hunk.nil? + output.join + end + + it "should not misplace the new chunk" do + old_data = [ + "recipe[a::default]", "recipe[b::default]", "recipe[c::default]", + "recipe[d::default]", "recipe[e::default]", "recipe[f::default]", + "recipe[g::default]", "recipe[h::default]", "recipe[i::default]", + "recipe[j::default]", "recipe[k::default]", "recipe[l::default]", + "recipe[m::default]", "recipe[n::default]" + ] + + new_data = [ + "recipe[a::default]", "recipe[c::default]", "recipe[d::default]", + "recipe[e::default]", "recipe[f::default]", "recipe[g::default]", + "recipe[h::default]", "recipe[i::default]", "recipe[j::default]", + "recipe[k::default]", "recipe[l::default]", "recipe[m::default]", + "recipe[n::default]", "recipe[o::new]", "recipe[p::new]", + "recipe[q::new]", "recipe[r::new]" + ] + + # standard:disable Layout/HeredocIndentation + expect(diff_lines(old_data, new_data)).to eq(<<-EODIFF) +@@ -1,5 +1,4 @@ + recipe[a::default] +-recipe[b::default] + recipe[c::default] + recipe[d::default] + recipe[e::default] +@@ -12,3 +11,7 @@ + recipe[l::default] + recipe[m::default] + recipe[n::default] ++recipe[o::new] ++recipe[p::new] ++recipe[q::new] ++recipe[r::new] + EODIFF + # standard:enable Layout/HeredocIndentation + end + end + + describe "issue #107 (replaces issue #60)" do + it "should produce unified output with correct context" do + # standard:disable Layout/HeredocIndentation + old_data = <<-DATA_OLD.strip.split("\n").map(&:chomp) +{ + "name": "x", + "description": "hi" +} + DATA_OLD + + new_data = <<-DATA_NEW.strip.split("\n").map(&:chomp) +{ + "name": "x", + "description": "lo" +} + DATA_NEW + + diff = ::Diff::LCS.diff(old_data, new_data) + hunk = ::Diff::LCS::Hunk.new(old_data, new_data, diff.first, 3, 0) + + expect(hunk.diff(:unified)).to eq(<<-EXPECTED.chomp) +@@ -1,4 +1,4 @@ + { + "name": "x", +- "description": "hi" ++ "description": "lo" + } + EXPECTED + # standard:enable Layout/HeredocIndentation + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/lcs_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/lcs_spec.rb new file mode 100644 index 0000000..c17f22f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/lcs_spec.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +require "spec_helper" + +describe Diff::LCS::Internals, ".lcs" do + include Diff::LCS::SpecHelper::Matchers + + it "returns a meaningful LCS array with (seq1, seq2)" do + res = Diff::LCS::Internals.lcs(seq1, seq2) + # The result of the LCS (less the +nil+ values) must be as long as the + # correct result. + expect(res.compact.size).to eq(correct_lcs.size) + expect(res).to correctly_map_sequence(seq1).to_other_sequence(seq2) + + # Compact these transformations and they should be the correct LCS. + x_seq1 = (0...res.size).map { |ix| res[ix] ? seq1[ix] : nil }.compact + x_seq2 = (0...res.size).map { |ix| res[ix] ? seq2[res[ix]] : nil }.compact + + expect(x_seq1).to eq(correct_lcs) + expect(x_seq2).to eq(correct_lcs) + end + + it "returns all indexes with (hello, hello)" do + expect(Diff::LCS::Internals.lcs(hello, hello)).to \ + eq((0...hello.size).to_a) + end + + it "returns all indexes with (hello_ary, hello_ary)" do + expect(Diff::LCS::Internals.lcs(hello_ary, hello_ary)).to \ + eq((0...hello_ary.size).to_a) + end +end + +describe Diff::LCS, ".LCS" do + include Diff::LCS::SpecHelper::Matchers + + it "returns the correct compacted values from Diff::LCS.LCS" do + res = Diff::LCS.LCS(seq1, seq2) + expect(res).to eq(correct_lcs) + expect(res.compact).to eq(res) + end + + it "is transitive" do + res = Diff::LCS.LCS(seq2, seq1) + expect(res).to eq(correct_lcs) + expect(res.compact).to eq(res) + end + + it "returns %W(h e l l o) with (hello, hello)" do + expect(Diff::LCS.LCS(hello, hello)).to eq(hello.chars) + end + + it "returns hello_ary with (hello_ary, hello_ary)" do + expect(Diff::LCS.LCS(hello_ary, hello_ary)).to eq(hello_ary) + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/ldiff_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/ldiff_spec.rb new file mode 100644 index 0000000..e13b561 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/ldiff_spec.rb @@ -0,0 +1,100 @@ +# frozen_string_literal: true + +require "spec_helper" + +RSpec.describe "bin/ldiff" do + include CaptureSubprocessIO + + # standard:disable Style/HashSyntax + fixtures = [ + {:name => "diff", :left => "aX", :right => "bXaX", :diff => 1}, + {:name => "diff.missing_new_line1", :left => "four_lines", :right => "four_lines_with_missing_new_line", :diff => 1}, + {:name => "diff.missing_new_line2", :left => "four_lines_with_missing_new_line", :right => "four_lines", :diff => 1}, + {:name => "diff.issue95_trailing_context", :left => "123_x", :right => "456_x", :diff => 1}, + {:name => "diff.four_lines.vs.empty", :left => "four_lines", :right => "empty", :diff => 1}, + {:name => "diff.empty.vs.four_lines", :left => "empty", :right => "four_lines", :diff => 1}, + {:name => "diff.bin1", :left => "file1.bin", :right => "file1.bin", :diff => 0}, + {:name => "diff.bin2", :left => "file1.bin", :right => "file2.bin", :diff => 1}, + {:name => "diff.chef", :left => "old-chef", :right => "new-chef", :diff => 1}, + {:name => "diff.chef2", :left => "old-chef2", :right => "new-chef2", :diff => 1} + ].product([nil, "-e", "-f", "-c", "-u"]).map { |(fixture, flag)| + fixture = fixture.dup + fixture[:flag] = flag + fixture + } + # standard:enable Style/HashSyntax + + def self.test_ldiff(fixture) + desc = [ + fixture[:flag], + "spec/fixtures/#{fixture[:left]}", + "spec/fixtures/#{fixture[:right]}", + "#", + "=>", + "spec/fixtures/ldiff/output.#{fixture[:name]}#{fixture[:flag]}" + ].join(" ") + + it desc do + stdout, stderr, status = run_ldiff(fixture) + expect(status).to eq(fixture[:diff]) + expect(stderr).to eq(read_fixture(fixture, mode: "error", allow_missing: true)) + expect(stdout).to eq(read_fixture(fixture, mode: "output", allow_missing: false)) + end + end + + fixtures.each do |fixture| + test_ldiff(fixture) + end + + def read_fixture(options, mode: "output", allow_missing: false) + fixture = options.fetch(:name) + flag = options.fetch(:flag) + name = "spec/fixtures/ldiff/#{mode}.#{fixture}#{flag}" + + return "" if !::File.exist?(name) && allow_missing + + data = IO.__send__(IO.respond_to?(:binread) ? :binread : :read, name) + clean_data(data, flag) + end + + def clean_data(data, flag) + data = + case flag + when "-c", "-u" + clean_output_timestamp(data) + else + data + end + data.gsub(/\r\n?/, "\n") + end + + def clean_output_timestamp(data) + data.gsub( + %r{ + ^ + [-+*]{3} + \s* + spec/fixtures/(\S+) + \s* + \d{4}-\d\d-\d\d + \s* + \d\d:\d\d:\d\d(?:\.\d+) + \s* + (?:[-+]\d{4}|Z) + }x, + '*** spec/fixtures/\1 0000-00-00 :00 =>:00 =>00.000000000 -0000' + ) + end + + def run_ldiff(options) + flag = options.fetch(:flag) + left = options.fetch(:left) + right = options.fetch(:right) + + stdout, stderr = capture_subprocess_io do + system("ruby -Ilib bin/ldiff #{flag} spec/fixtures/#{left} spec/fixtures/#{right}") + end + + [clean_data(stdout, flag), stderr, $?.exitstatus] + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/patch_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/patch_spec.rb new file mode 100644 index 0000000..8fc3ee2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/patch_spec.rb @@ -0,0 +1,416 @@ +# frozen_string_literal: true + +require "spec_helper" + +describe "Diff::LCS.patch" do + include Diff::LCS::SpecHelper::Matchers + + shared_examples "patch sequences correctly" do + it "correctly patches left-to-right (patch autodiscovery)" do + expect(Diff::LCS.patch(s1, patch_set)).to eq(s2) + end + + it "correctly patches left-to-right (explicit patch)" do + expect(Diff::LCS.patch(s1, patch_set, :patch)).to eq(s2) + expect(Diff::LCS.patch!(s1, patch_set)).to eq(s2) + end + + it "correctly patches right-to-left (unpatch autodiscovery)" do + expect(Diff::LCS.patch(s2, patch_set)).to eq(s1) + end + + it "correctly patches right-to-left (explicit unpatch)" do + expect(Diff::LCS.patch(s2, patch_set, :unpatch)).to eq(s1) + expect(Diff::LCS.unpatch!(s2, patch_set)).to eq(s1) + end + end + + describe "using a Diff::LCS.diff patchset" do + describe "an empty patchset returns the source" do + it "works on a string (hello)" do + diff = Diff::LCS.diff(hello, hello) + expect(Diff::LCS.patch(hello, diff)).to eq(hello) + end + + it "works on an array %W(h e l l o)" do + diff = Diff::LCS.diff(hello_ary, hello_ary) + expect(Diff::LCS.patch(hello_ary, diff)).to eq(hello_ary) + end + end + + describe "with default diff callbacks (DiffCallbacks)" do + describe "forward (s1 -> s2)" do + it_has_behavior "patch sequences correctly" do + let(:s1) { seq1 } + let(:s2) { seq2 } + let(:patch_set) { Diff::LCS.diff(seq1, seq2) } + end + end + + describe "reverse (s2 -> s1)" do + it_has_behavior "patch sequences correctly" do + let(:s1) { seq2 } + let(:s2) { seq1 } + let(:patch_set) { Diff::LCS.diff(seq2, seq1) } + end + end + end + + describe "with context diff callbacks (ContextDiffCallbacks)" do + describe "forward (s1 -> s2)" do + it_has_behavior "patch sequences correctly" do + let(:s1) { seq1 } + let(:s2) { seq2 } + let(:patch_set) { + Diff::LCS.diff(seq1, seq2, Diff::LCS::ContextDiffCallbacks) + } + end + end + + describe "reverse (s2 -> s1)" do + it_has_behavior "patch sequences correctly" do + let(:s1) { seq2 } + let(:s2) { seq1 } + let(:patch_set) { + Diff::LCS.diff(seq2, seq1, Diff::LCS::ContextDiffCallbacks) + } + end + end + end + + describe "with sdiff callbacks (SDiffCallbacks)" do + describe "forward (s1 -> s2)" do + it_has_behavior "patch sequences correctly" do + let(:s1) { seq1 } + let(:s2) { seq2 } + let(:patch_set) { + Diff::LCS.diff(seq1, seq2, Diff::LCS::SDiffCallbacks) + } + end + end + + describe "reverse (s2 -> s1)" do + it_has_behavior "patch sequences correctly" do + let(:s1) { seq2 } + let(:s2) { seq1 } + let(:patch_set) { + Diff::LCS.diff(seq2, seq1, Diff::LCS::SDiffCallbacks) + } + end + end + end + end + + describe "using a Diff::LCS.sdiff patchset" do + describe "an empty patchset returns the source" do + it "works on a string (hello)" do + expect(Diff::LCS.patch(hello, Diff::LCS.sdiff(hello, hello))).to eq(hello) + end + + it "works on an array %W(h e l l o)" do + expect(Diff::LCS.patch(hello_ary, Diff::LCS.sdiff(hello_ary, hello_ary))).to eq(hello_ary) + end + end + + describe "with default diff callbacks (DiffCallbacks)" do + describe "forward (s1 -> s2)" do + it_has_behavior "patch sequences correctly" do + let(:s1) { seq1 } + let(:s2) { seq2 } + let(:patch_set) { + Diff::LCS.sdiff(seq1, seq2, Diff::LCS::DiffCallbacks) + } + end + end + + describe "reverse (s2 -> s1)" do + it_has_behavior "patch sequences correctly" do + let(:s1) { seq2 } + let(:s2) { seq1 } + let(:patch_set) { + Diff::LCS.sdiff(seq2, seq1, Diff::LCS::DiffCallbacks) + } + end + end + end + + describe "with context diff callbacks (DiffCallbacks)" do + describe "forward (s1 -> s2)" do + it_has_behavior "patch sequences correctly" do + let(:s1) { seq1 } + let(:s2) { seq2 } + let(:patch_set) { + Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextDiffCallbacks) + } + end + end + + describe "reverse (s2 -> s1)" do + it_has_behavior "patch sequences correctly" do + let(:s1) { seq2 } + let(:s2) { seq1 } + let(:patch_set) { + Diff::LCS.sdiff(seq2, seq1, Diff::LCS::ContextDiffCallbacks) + } + end + end + end + + describe "with sdiff callbacks (SDiffCallbacks)" do + describe "forward (s1 -> s2)" do + it_has_behavior "patch sequences correctly" do + let(:s1) { seq1 } + let(:s2) { seq2 } + let(:patch_set) { Diff::LCS.sdiff(seq1, seq2) } + end + end + + describe "reverse (s2 -> s1)" do + it_has_behavior "patch sequences correctly" do + let(:s1) { seq2 } + let(:s2) { seq1 } + let(:patch_set) { Diff::LCS.sdiff(seq2, seq1) } + end + end + end + end + + # Note: because of the error in autodiscovery ("does not autodiscover s1 + # to s2 patches"), this cannot use the "patch sequences correctly" shared + # set. Once the bug in autodiscovery is fixed, this can be converted as + # above. + describe "fix bug 891: patchsets do not contain the last equal part" do + before :each do + @s1 = %w[a b c d e f g h i j k] # standard:disable Layout/SpaceInsideArrayPercentLiteral + @s2 = %w[a b c d D e f g h i j k] + end + + describe "using Diff::LCS.diff with default diff callbacks" do + before :each do + @patch_set_s1_s2 = Diff::LCS.diff(@s1, @s2) + @patch_set_s2_s1 = Diff::LCS.diff(@s2, @s1) + end + + it "autodiscovers s1 to s2 patches" do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) + end.to_not raise_error + end + + it "autodiscovers s2 to s1 patches" do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) + end.to_not raise_error + end + + it "autodiscovers s2 to s1 the left-to-right patches" do + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) + end + + it "correctly patches left-to-right (explicit patch)" do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) + expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) + expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) + end + + it "correctly patches right-to-left (explicit unpatch)" do + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) + expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) + expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) + end + end + + describe "using Diff::LCS.diff with context diff callbacks" do + before :each do + @patch_set_s1_s2 = Diff::LCS.diff(@s1, @s2, Diff::LCS::ContextDiffCallbacks) + @patch_set_s2_s1 = Diff::LCS.diff(@s2, @s1, Diff::LCS::ContextDiffCallbacks) + end + + it "autodiscovers s1 to s2 patches" do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) + end.to_not raise_error + end + + it "autodiscovers s2 to s1 patches" do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) + end.to_not raise_error + end + + it "autodiscovers s2 to s1 the left-to-right patches" do + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) + end + + it "correctly patches left-to-right (explicit patch)" do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) + expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) + expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) + end + + it "correctly patches right-to-left (explicit unpatch)" do + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) + expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) + expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) + end + end + + describe "using Diff::LCS.diff with sdiff callbacks" do + before(:each) do + @patch_set_s1_s2 = Diff::LCS.diff(@s1, @s2, Diff::LCS::SDiffCallbacks) + @patch_set_s2_s1 = Diff::LCS.diff(@s2, @s1, Diff::LCS::SDiffCallbacks) + end + + it "autodiscovers s1 to s2 patches" do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) + end.to_not raise_error + end + + it "autodiscovers s2 to s1 patches" do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) + end.to_not raise_error + end + + it "autodiscovers s2 to s1 the left-to-right patches" do + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) + end + + it "correctly patches left-to-right (explicit patch)" do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) + expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) + expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) + end + + it "correctly patches right-to-left (explicit unpatch)" do + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) + expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) + expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) + end + end + + describe "using Diff::LCS.sdiff with default sdiff callbacks" do + before(:each) do + @patch_set_s1_s2 = Diff::LCS.sdiff(@s1, @s2) + @patch_set_s2_s1 = Diff::LCS.sdiff(@s2, @s1) + end + + it "autodiscovers s1 to s2 patches" do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) + end.to_not raise_error + end + + it "autodiscovers s2 to s1 patches" do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) + end.to_not raise_error + end + + it "autodiscovers s2 to s1 the left-to-right patches" do + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) + end + + it "correctly patches left-to-right (explicit patch)" do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) + expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) + expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) + end + + it "correctly patches right-to-left (explicit unpatch)" do + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) + expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) + expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) + end + end + + describe "using Diff::LCS.sdiff with context diff callbacks" do + before(:each) do + @patch_set_s1_s2 = Diff::LCS.sdiff(@s1, @s2, Diff::LCS::ContextDiffCallbacks) + @patch_set_s2_s1 = Diff::LCS.sdiff(@s2, @s1, Diff::LCS::ContextDiffCallbacks) + end + + it "autodiscovers s1 to s2 patches" do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) + end.to_not raise_error + end + + it "autodiscovers s2 to s1 patches" do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) + end.to_not raise_error + end + + it "autodiscovers s2 to s1 the left-to-right patches" do + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) + end + + it "correctly patches left-to-right (explicit patch)" do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) + expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) + expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) + end + + it "correctly patches right-to-left (explicit unpatch)" do + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) + expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) + expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) + end + end + + describe "using Diff::LCS.sdiff with default diff callbacks" do + before(:each) do + @patch_set_s1_s2 = Diff::LCS.sdiff(@s1, @s2, Diff::LCS::DiffCallbacks) + @patch_set_s2_s1 = Diff::LCS.sdiff(@s2, @s1, Diff::LCS::DiffCallbacks) + end + + it "autodiscovers s1 to s2 patches" do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) + end.to_not raise_error + end + + it "autodiscovers s2 to s1 patches" do + expect do + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) + end.to_not raise_error + end + + it "autodiscovers s2 to s1 the left-to-right patches" do + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) + end + + it "correctly patches left-to-right (explicit patch)" do + expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) + expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) + expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) + expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) + end + + it "correctly patches right-to-left (explicit unpatch)" do + expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) + expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) + expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) + expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/sdiff_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/sdiff_spec.rb new file mode 100644 index 0000000..aded301 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/sdiff_spec.rb @@ -0,0 +1,216 @@ +# frozen_string_literal: true + +require "spec_helper" + +describe "Diff::LCS.sdiff" do + include Diff::LCS::SpecHelper::Matchers + + shared_examples "compare sequences correctly" do + it "compares s1 -> s2 correctly" do + expect(Diff::LCS.sdiff(s1, s2)).to eq(context_diff(result)) + end + + it "compares s2 -> s1 correctly" do + expect(Diff::LCS.sdiff(s2, s1)).to eq(context_diff(reverse_sdiff(result))) + end + end + + describe "using seq1 & seq2" do + let(:s1) { seq1 } + let(:s2) { seq2 } + let(:result) { correct_forward_sdiff } + + it_has_behavior "compare sequences correctly" + end + + describe "using %w(abc def yyy xxx ghi jkl) & %w(abc dxf xxx ghi jkl)" do + let(:s1) { %w[abc def yyy xxx ghi jkl] } + let(:s2) { %w[abc dxf xxx ghi jkl] } + let(:result) { + # standard:disable Layout/ExtraSpacing + [ + ["=", [0, "abc"], [0, "abc"]], + ["!", [1, "def"], [1, "dxf"]], + ["-", [2, "yyy"], [2, nil]], + ["=", [3, "xxx"], [2, "xxx"]], + ["=", [4, "ghi"], [3, "ghi"]], + ["=", [5, "jkl"], [4, "jkl"]] + ] + # standard:enable Layout/ExtraSpacing + } + + it_has_behavior "compare sequences correctly" + end + + describe "using %w(a b c d e) & %w(a e)" do + let(:s1) { %w[a b c d e] } + let(:s2) { %w[a e] } + let(:result) { + [ + ["=", [0, "a"], [0, "a"]], + ["-", [1, "b"], [1, nil]], + ["-", [2, "c"], [1, nil]], + ["-", [3, "d"], [1, nil]], + ["=", [4, "e"], [1, "e"]] + ] + } + + it_has_behavior "compare sequences correctly" + end + + describe "using %w(a e) & %w(a b c d e)" do + let(:s1) { %w[a e] } + let(:s2) { %w[a b c d e] } + let(:result) { + [ + ["=", [0, "a"], [0, "a"]], + ["+", [1, nil], [1, "b"]], + ["+", [1, nil], [2, "c"]], + ["+", [1, nil], [3, "d"]], + ["=", [1, "e"], [4, "e"]] + ] + } + + it_has_behavior "compare sequences correctly" + end + + describe "using %w(v x a e) & %w(w y a b c d e)" do + let(:s1) { %w[v x a e] } + let(:s2) { %w[w y a b c d e] } + let(:result) { + [ + ["!", [0, "v"], [0, "w"]], + ["!", [1, "x"], [1, "y"]], + ["=", [2, "a"], [2, "a"]], + ["+", [3, nil], [3, "b"]], + ["+", [3, nil], [4, "c"]], + ["+", [3, nil], [5, "d"]], + ["=", [3, "e"], [6, "e"]] + ] + } + + it_has_behavior "compare sequences correctly" + end + + describe "using %w(x a e) & %w(a b c d e)" do + let(:s1) { %w[x a e] } + let(:s2) { %w[a b c d e] } + let(:result) { + [ + ["-", [0, "x"], [0, nil]], + ["=", [1, "a"], [0, "a"]], + ["+", [2, nil], [1, "b"]], + ["+", [2, nil], [2, "c"]], + ["+", [2, nil], [3, "d"]], + ["=", [2, "e"], [4, "e"]] + ] + } + + it_has_behavior "compare sequences correctly" + end + + describe "using %w(a e) & %w(x a b c d e)" do + let(:s1) { %w[a e] } + let(:s2) { %w[x a b c d e] } + let(:result) { + [ + ["+", [0, nil], [0, "x"]], + ["=", [0, "a"], [1, "a"]], + ["+", [1, nil], [2, "b"]], + ["+", [1, nil], [3, "c"]], + ["+", [1, nil], [4, "d"]], + ["=", [1, "e"], [5, "e"]] + ] + } + + it_has_behavior "compare sequences correctly" + end + + describe "using %w(a e v) & %w(x a b c d e w x)" do + let(:s1) { %w[a e v] } + let(:s2) { %w[x a b c d e w x] } + let(:result) { + [ + ["+", [0, nil], [0, "x"]], + ["=", [0, "a"], [1, "a"]], + ["+", [1, nil], [2, "b"]], + ["+", [1, nil], [3, "c"]], + ["+", [1, nil], [4, "d"]], + ["=", [1, "e"], [5, "e"]], + ["!", [2, "v"], [6, "w"]], + ["+", [3, nil], [7, "x"]] + ] + } + + it_has_behavior "compare sequences correctly" + end + + describe "using %w() & %w(a b c)" do + let(:s1) { %w[] } + let(:s2) { %w[a b c] } + let(:result) { + [ + ["+", [0, nil], [0, "a"]], + ["+", [0, nil], [1, "b"]], + ["+", [0, nil], [2, "c"]] + ] + } + + it_has_behavior "compare sequences correctly" + end + + describe "using %w(a b c) & %w(1)" do + let(:s1) { %w[a b c] } + let(:s2) { %w[1] } + let(:result) { + [ + ["!", [0, "a"], [0, "1"]], + ["-", [1, "b"], [1, nil]], + ["-", [2, "c"], [1, nil]] + ] + } + + it_has_behavior "compare sequences correctly" + end + + describe "using %w(a b c) & %w(c)" do + let(:s1) { %w[a b c] } + let(:s2) { %w[c] } + let(:result) { + [ + ["-", [0, "a"], [0, nil]], + ["-", [1, "b"], [0, nil]], + ["=", [2, "c"], [0, "c"]] + ] + } + + it_has_behavior "compare sequences correctly" + end + + describe "using %w(abcd efgh ijkl mnop) & []" do + let(:s1) { %w[abcd efgh ijkl mnop] } + let(:s2) { [] } + let(:result) { + [ + ["-", [0, "abcd"], [0, nil]], + ["-", [1, "efgh"], [0, nil]], + ["-", [2, "ijkl"], [0, nil]], + ["-", [3, "mnop"], [0, nil]] + ] + } + + it_has_behavior "compare sequences correctly" + end + + describe "using [[1,2]] & []" do + let(:s1) { [[1, 2]] } + let(:s2) { [] } + let(:result) { + [ + ["-", [0, [1, 2]], [0, nil]] + ] + } + + it_has_behavior "compare sequences correctly" + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/spec_helper.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/spec_helper.rb new file mode 100644 index 0000000..baaa3d0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/spec_helper.rb @@ -0,0 +1,376 @@ +# frozen_string_literal: true + +require "rubygems" +require "pathname" + +require "psych" if RUBY_VERSION >= "1.9" + +if ENV["COVERAGE"] + require "simplecov" + require "simplecov-lcov" + + SimpleCov::Formatter::LcovFormatter.config do |config| + config.report_with_single_file = true + config.lcov_file_name = "lcov.info" + end + + SimpleCov.start "test_frameworks" do + enable_coverage :branch + primary_coverage :branch + formatter SimpleCov::Formatter::MultiFormatter.new([ + SimpleCov::Formatter::HTMLFormatter, + SimpleCov::Formatter::LcovFormatter, + SimpleCov::Formatter::SimpleFormatter + ]) + end +end + +file = Pathname.new(__FILE__).expand_path +path = file.parent +parent = path.parent + +$:.unshift parent.join("lib") + +module CaptureSubprocessIO + def _synchronize + yield + end + + def capture_subprocess_io + _synchronize { _capture_subprocess_io { yield } } + end + + def _capture_subprocess_io + require "tempfile" + + captured_stdout, captured_stderr = Tempfile.new("out"), Tempfile.new("err") + + orig_stdout, orig_stderr = $stdout.dup, $stderr.dup + $stdout.reopen captured_stdout + $stderr.reopen captured_stderr + + yield + + $stdout.rewind + $stderr.rewind + + [captured_stdout.read, captured_stderr.read] + ensure + captured_stdout.unlink + captured_stderr.unlink + $stdout.reopen orig_stdout + $stderr.reopen orig_stderr + end + private :_capture_subprocess_io +end + +require "diff-lcs" + +module Diff::LCS::SpecHelper + def hello + "hello" + end + + def hello_ary + %w[h e l l o] + end + + def seq1 + %w[a b c e h j l m n p] + end + + def skipped_seq1 + %w[a h n p] + end + + def seq2 + %w[b c d e f j k l m r s t] + end + + def skipped_seq2 + %w[d f k r s t] + end + + def word_sequence + %w[abcd efgh ijkl mnopqrstuvwxyz] + end + + def correct_lcs + %w[b c e j l m] + end + + # standard:disable Layout/ExtraSpacing + def correct_forward_diff + [ + [ + ["-", 0, "a"] + ], + [ + ["+", 2, "d"] + ], + [ + ["-", 4, "h"], + ["+", 4, "f"] + ], + [ + ["+", 6, "k"] + ], + [ + ["-", 8, "n"], + ["+", 9, "r"], + ["-", 9, "p"], + ["+", 10, "s"], + ["+", 11, "t"] + ] + ] + end + + def correct_backward_diff + [ + [ + ["+", 0, "a"] + ], + [ + ["-", 2, "d"] + ], + [ + ["-", 4, "f"], + ["+", 4, "h"] + ], + [ + ["-", 6, "k"] + ], + [ + ["-", 9, "r"], + ["+", 8, "n"], + ["-", 10, "s"], + ["+", 9, "p"], + ["-", 11, "t"] + ] + ] + end + + def correct_forward_sdiff + [ + ["-", [0, "a"], [0, nil]], + ["=", [1, "b"], [0, "b"]], + ["=", [2, "c"], [1, "c"]], + ["+", [3, nil], [2, "d"]], + ["=", [3, "e"], [3, "e"]], + ["!", [4, "h"], [4, "f"]], + ["=", [5, "j"], [5, "j"]], + ["+", [6, nil], [6, "k"]], + ["=", [6, "l"], [7, "l"]], + ["=", [7, "m"], [8, "m"]], + ["!", [8, "n"], [9, "r"]], + ["!", [9, "p"], [10, "s"]], + ["+", [10, nil], [11, "t"]] + ] + end + # standard:enable Layout/ExtraSpacing + + def reverse_sdiff(forward_sdiff) + forward_sdiff.map { |line| + line[1], line[2] = line[2], line[1] + case line[0] + when "-" then line[0] = "+" + when "+" then line[0] = "-" + end + line + } + end + + def change_diff(diff) + map_diffs(diff, Diff::LCS::Change) + end + + def context_diff(diff) + map_diffs(diff, Diff::LCS::ContextChange) + end + + def format_diffs(diffs) + diffs.map { |e| + if e.is_a?(Array) + e.map { |f| f.to_a.join }.join(", ") + else + e.to_a.join + end + }.join("\n") + end + + def map_diffs(diffs, klass = Diff::LCS::ContextChange) + diffs.map do |chunks| + if klass == Diff::LCS::ContextChange + klass.from_a(chunks) + else + chunks.map { |changes| klass.from_a(changes) } + end + end + end + + def balanced_traversal(s1, s2, callback_type) + callback = __send__(callback_type) + Diff::LCS.traverse_balanced(s1, s2, callback) + callback + end + + def balanced_reverse(change_result) + new_result = [] + change_result.each do |line| + line = [line[0], line[2], line[1]] + case line[0] + when "<" + line[0] = ">" + when ">" + line[0] = "<" + end + new_result << line + end + new_result.sort_by { |line| [line[1], line[2]] } + end + + def map_to_no_change(change_result) + new_result = [] + change_result.each do |line| + case line[0] + when "!" + new_result << ["<", line[1], line[2]] + new_result << [">", line[1] + 1, line[2]] + else + new_result << line + end + end + new_result + end + + class SimpleCallback + def initialize + reset + end + + attr_reader :matched_a + attr_reader :matched_b + attr_reader :discards_a + attr_reader :discards_b + attr_reader :done_a + attr_reader :done_b + + def reset + @matched_a = [] + @matched_b = [] + @discards_a = [] + @discards_b = [] + @done_a = [] + @done_b = [] + self + end + + def match(event) + @matched_a << event.old_element + @matched_b << event.new_element + end + + def discard_b(event) + @discards_b << event.new_element + end + + def discard_a(event) + @discards_a << event.old_element + end + + def finished_a(event) + @done_a << [ + event.old_element, event.old_position, + event.new_element, event.new_position + ] + end + + def finished_b(event) + @done_b << [ + event.old_element, event.old_position, + event.new_element, event.new_position + ] + end + end + + def simple_callback + SimpleCallback.new + end + + class SimpleCallbackNoFinishers < SimpleCallback + undef :finished_a + undef :finished_b + end + + def simple_callback_no_finishers + SimpleCallbackNoFinishers.new + end + + class BalancedCallback + def initialize + reset + end + + attr_reader :result + + def reset + @result = [] + end + + def match(event) + @result << ["=", event.old_position, event.new_position] + end + + def discard_a(event) + @result << ["<", event.old_position, event.new_position] + end + + def discard_b(event) + @result << [">", event.old_position, event.new_position] + end + + def change(event) + @result << ["!", event.old_position, event.new_position] + end + end + + def balanced_callback + BalancedCallback.new + end + + class BalancedCallbackNoChange < BalancedCallback + undef :change + end + + def balanced_callback_no_change + BalancedCallbackNoChange.new + end + + module Matchers + extend RSpec::Matchers::DSL + + matcher :be_nil_or_match_values do |ii, s1, s2| + match do |ee| + expect(ee).to(satisfy { |vee| vee.nil? || s1[ii] == s2[ee] }) + end + end + + matcher :correctly_map_sequence do |s1| + match do |actual| + actual.each_index { |ii| expect(actual[ii]).to be_nil_or_match_values(ii, s1, @s2) } + end + + chain :to_other_sequence do |s2| + @s2 = s2 + end + end + end +end + +RSpec.configure do |conf| + conf.include Diff::LCS::SpecHelper + conf.alias_it_should_behave_like_to :it_has_behavior, "has behavior:" + # standard:disable Style/HashSyntax + conf.filter_run_excluding :broken => true + # standard:enable Style/HashSyntax +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/traverse_balanced_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/traverse_balanced_spec.rb new file mode 100644 index 0000000..3a3f677 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/traverse_balanced_spec.rb @@ -0,0 +1,312 @@ +# frozen_string_literal: true + +require "spec_helper" + +describe "Diff::LCS.traverse_balanced" do + include Diff::LCS::SpecHelper::Matchers + + shared_examples "with a #change callback" do |s1, s2, result| + it "traverses s1 -> s2 correctly" do + traversal = balanced_traversal(s1, s2, :balanced_callback) + expect(traversal.result).to eq(result) + end + + it "traverses s2 -> s1 correctly" do + traversal = balanced_traversal(s2, s1, :balanced_callback) + expect(traversal.result).to eq(balanced_reverse(result)) + end + end + + shared_examples "without a #change callback" do |s1, s2, result| + it "traverses s1 -> s2 correctly" do + traversal = balanced_traversal(s1, s2, :balanced_callback_no_change) + expect(traversal.result).to eq(map_to_no_change(result)) + end + + it "traverses s2 -> s1 correctly" do + traversal = balanced_traversal(s2, s1, :balanced_callback_no_change) + expect(traversal.result).to eq(map_to_no_change(balanced_reverse(result))) + end + end + + describe "identical string sequences ('abc')" do + s1 = s2 = "abc" + + result = [ + ["=", 0, 0], + ["=", 1, 1], + ["=", 2, 2] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "identical array sequences %w(a b c)" do + s1 = s2 = %w[a b c] + + result = [ + ["=", 0, 0], + ["=", 1, 1], + ["=", 2, 2] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "sequences %w(a b c) & %w(a x c)" do + s1 = %w[a b c] + s2 = %w[a x c] + + result = [ + ["=", 0, 0], + ["!", 1, 1], + ["=", 2, 2] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "sequences %w(a x y c) & %w(a v w c)" do + s1 = %w[a x y c] + s2 = %w[a v w c] + + result = [ + ["=", 0, 0], + ["!", 1, 1], + ["!", 2, 2], + ["=", 3, 3] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "sequences %w(x y c) & %w(v w c)" do + s1 = %w[x y c] + s2 = %w[v w c] + result = [ + ["!", 0, 0], + ["!", 1, 1], + ["=", 2, 2] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "sequences %w(a x y z) & %w(b v w)" do + s1 = %w[a x y z] + s2 = %w[b v w] + result = [ + ["!", 0, 0], + ["!", 1, 1], + ["!", 2, 2], + ["<", 3, 3] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "sequences %w(a z) & %w(a)" do + s1 = %w[a z] + s2 = %w[a] + result = [ + ["=", 0, 0], + ["<", 1, 1] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "sequences %w(z a) & %w(a)" do + s1 = %w[z a] + s2 = %w[a] + result = [ + ["<", 0, 0], + ["=", 1, 0] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "sequences %w(a b c) & %w(x y z)" do + s1 = %w[a b c] + s2 = %w[x y z] + result = [ + ["!", 0, 0], + ["!", 1, 1], + ["!", 2, 2] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "sequences %w(abcd efgh ijkl mnoopqrstuvwxyz) & []" do + s1 = %w[abcd efgh ijkl mnopqrstuvwxyz] + s2 = [] + result = [ + ["<", 0, 0], + ["<", 1, 0], + ["<", 2, 0], + ["<", 3, 0] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "strings %q(a b c) & %q(a x c)" do + s1 = "a b c" + s2 = "a x c" + + result = [ + ["=", 0, 0], + ["=", 1, 1], + ["!", 2, 2], + ["=", 3, 3], + ["=", 4, 4] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "strings %q(a x y c) & %q(a v w c)" do + s1 = "a x y c" + s2 = "a v w c" + + result = [ + ["=", 0, 0], + ["=", 1, 1], + ["!", 2, 2], + ["=", 3, 3], + ["!", 4, 4], + ["=", 5, 5], + ["=", 6, 6] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "strings %q(x y c) & %q(v w c)" do + s1 = "x y c" + s2 = "v w c" + result = [ + ["!", 0, 0], + ["=", 1, 1], + ["!", 2, 2], + ["=", 3, 3], + ["=", 4, 4] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "strings %q(a x y z) & %q(b v w)" do + s1 = "a x y z" + s2 = "b v w" + result = [ + ["!", 0, 0], + ["=", 1, 1], + ["!", 2, 2], + ["=", 3, 3], + ["!", 4, 4], + ["<", 5, 5], + ["<", 6, 5] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "strings %q(a z) & %q(a)" do + s1 = "a z" + s2 = "a" + result = [ + ["=", 0, 0], + ["<", 1, 1], + ["<", 2, 1] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "strings %q(z a) & %q(a)" do + s1 = "z a" + s2 = "a" + result = [ + ["<", 0, 0], + ["<", 1, 0], + ["=", 2, 0] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "strings %q(a b c) & %q(x y z)" do + s1 = "a b c" + s2 = "x y z" + result = [ + ["!", 0, 0], + ["=", 1, 1], + ["!", 2, 2], + ["=", 3, 3], + ["!", 4, 4] + ] + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end + + describe "strings %q(abcd efgh ijkl mnopqrstuvwxyz) & %q()" do + s1 = "abcd efgh ijkl mnopqrstuvwxyz" + s2 = "" + # standard:disable Layout/ExtraSpacing + result = [ + ["<", 0, 0], + ["<", 1, 0], + ["<", 2, 0], + ["<", 3, 0], + ["<", 4, 0], + ["<", 5, 0], + ["<", 6, 0], + ["<", 7, 0], + ["<", 8, 0], + ["<", 9, 0], + ["<", 10, 0], + ["<", 11, 0], + ["<", 12, 0], + ["<", 13, 0], + ["<", 14, 0], + ["<", 15, 0], + ["<", 16, 0], + ["<", 17, 0], + ["<", 18, 0], + ["<", 19, 0], + ["<", 20, 0], + ["<", 21, 0], + ["<", 22, 0], + ["<", 23, 0], + ["<", 24, 0], + ["<", 25, 0], + ["<", 26, 0], + ["<", 27, 0], + ["<", 28, 0] + ] + # standard:enable Layout/ExtraSpacing + + it_has_behavior "with a #change callback", s1, s2, result + it_has_behavior "without a #change callback", s1, s2, result + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/traverse_sequences_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/traverse_sequences_spec.rb new file mode 100644 index 0000000..8e9928f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/traverse_sequences_spec.rb @@ -0,0 +1,137 @@ +# frozen_string_literal: true + +require "spec_helper" + +describe "Diff::LCS.traverse_sequences" do + describe "callback with no finishers" do + describe "over (seq1, seq2)" do + before(:each) do + @callback_s1_s2 = simple_callback_no_finishers + Diff::LCS.traverse_sequences(seq1, seq2, @callback_s1_s2) + + @callback_s2_s1 = simple_callback_no_finishers + Diff::LCS.traverse_sequences(seq2, seq1, @callback_s2_s1) + end + + it "has the correct LCS result on left-matches" do + expect(@callback_s1_s2.matched_a).to eq(correct_lcs) + expect(@callback_s2_s1.matched_a).to eq(correct_lcs) + end + + it "has the correct LCS result on right-matches" do + expect(@callback_s1_s2.matched_b).to eq(correct_lcs) + expect(@callback_s2_s1.matched_b).to eq(correct_lcs) + end + + it "has the correct skipped sequences with the left sequence" do + expect(@callback_s1_s2.discards_a).to eq(skipped_seq1) + expect(@callback_s2_s1.discards_a).to eq(skipped_seq2) + end + + it "has the correct skipped sequences with the right sequence" do + expect(@callback_s1_s2.discards_b).to eq(skipped_seq2) + expect(@callback_s2_s1.discards_b).to eq(skipped_seq1) + end + + it "does not have anything done markers from the left or right sequences" do + expect(@callback_s1_s2.done_a).to be_empty + expect(@callback_s1_s2.done_b).to be_empty + expect(@callback_s2_s1.done_a).to be_empty + expect(@callback_s2_s1.done_b).to be_empty + end + end + + describe "over (hello, hello)" do + before(:each) do + @callback = simple_callback_no_finishers + Diff::LCS.traverse_sequences(hello, hello, @callback) + end + + it "has the correct LCS result on left-matches" do + expect(@callback.matched_a).to eq(hello.chars) + end + + it "has the correct LCS result on right-matches" do + expect(@callback.matched_b).to eq(hello.chars) + end + + it "has the correct skipped sequences with the left sequence" do + expect(@callback.discards_a).to be_empty + end + + it "has the correct skipped sequences with the right sequence" do + expect(@callback.discards_b).to be_empty + end + + it "does not have anything done markers from the left or right sequences" do + expect(@callback.done_a).to be_empty + expect(@callback.done_b).to be_empty + end + end + + describe "over (hello_ary, hello_ary)" do + before(:each) do + @callback = simple_callback_no_finishers + Diff::LCS.traverse_sequences(hello_ary, hello_ary, @callback) + end + + it "has the correct LCS result on left-matches" do + expect(@callback.matched_a).to eq(hello_ary) + end + + it "has the correct LCS result on right-matches" do + expect(@callback.matched_b).to eq(hello_ary) + end + + it "has the correct skipped sequences with the left sequence" do + expect(@callback.discards_a).to be_empty + end + + it "has the correct skipped sequences with the right sequence" do + expect(@callback.discards_b).to be_empty + end + + it "does not have anything done markers from the left or right sequences" do + expect(@callback.done_a).to be_empty + expect(@callback.done_b).to be_empty + end + end + end + + describe "callback with finisher" do + before(:each) do + @callback_s1_s2 = simple_callback + Diff::LCS.traverse_sequences(seq1, seq2, @callback_s1_s2) + @callback_s2_s1 = simple_callback + Diff::LCS.traverse_sequences(seq2, seq1, @callback_s2_s1) + end + + it "has the correct LCS result on left-matches" do + expect(@callback_s1_s2.matched_a).to eq(correct_lcs) + expect(@callback_s2_s1.matched_a).to eq(correct_lcs) + end + + it "has the correct LCS result on right-matches" do + expect(@callback_s1_s2.matched_b).to eq(correct_lcs) + expect(@callback_s2_s1.matched_b).to eq(correct_lcs) + end + + it "has the correct skipped sequences for the left sequence" do + expect(@callback_s1_s2.discards_a).to eq(skipped_seq1) + expect(@callback_s2_s1.discards_a).to eq(skipped_seq2) + end + + it "has the correct skipped sequences for the right sequence" do + expect(@callback_s1_s2.discards_b).to eq(skipped_seq2) + expect(@callback_s2_s1.discards_b).to eq(skipped_seq1) + end + + it "has done markers differently-sized sequences" do + expect(@callback_s1_s2.done_a).to eq([["p", 9, "t", 11]]) + expect(@callback_s1_s2.done_b).to be_empty + + expect(@callback_s2_s1.done_a).to be_empty + expect(@callback_s2_s1.done_b).to eq([["t", 11, "p", 9]]) + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.document b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.document new file mode 100644 index 0000000..70bb626 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.document @@ -0,0 +1,6 @@ +LICENSE.txt +NEWS.md +README.md +ext/ +lib/ +_doc/ diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.github/dependabot.yml b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.github/dependabot.yml new file mode 100644 index 0000000..b18fd29 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: 'github-actions' + directory: '/' + schedule: + interval: 'weekly' diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.github/workflows/test.yml b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.github/workflows/test.yml new file mode 100644 index 0000000..02e9671 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.github/workflows/test.yml @@ -0,0 +1,33 @@ +name: test + +on: + push: + branches: [master] + pull_request: + workflow_dispatch: + +jobs: + ruby-versions: + uses: ruby/actions/.github/workflows/ruby_versions.yml@master + with: + engine: cruby + versions: '["jruby", "truffleruby-head"]' + + test: + needs: ruby-versions + name: build (${{ matrix.ruby }} / ${{ matrix.os }}) + strategy: + matrix: + ruby: ${{ fromJson(needs.ruby-versions.outputs.versions) }} + os: [ubuntu-latest] + fail-fast: false + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby }} + bundler-cache: true + - name: Run test + run: bundle exec rake test diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.gitignore b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.gitignore new file mode 100644 index 0000000..f53c35c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.gitignore @@ -0,0 +1,12 @@ +/.bundle/ +/.yardoc +/_yardoc/ +/coverage/ +/doc/ +/pkg/ +/spec/reports/ +/tmp/ +Gemfile.lock +*.so +*.bundle +*.gem diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.rdoc_options b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.rdoc_options new file mode 100644 index 0000000..62d6c58 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.rdoc_options @@ -0,0 +1 @@ +main_page: README.md diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/BDSL b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/BDSL new file mode 100644 index 0000000..66d9359 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/BDSL @@ -0,0 +1,22 @@ +Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/COPYING b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/COPYING new file mode 100644 index 0000000..48e5a96 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/COPYING @@ -0,0 +1,56 @@ +Ruby is copyrighted free software by Yukihiro Matsumoto . +You can redistribute it and/or modify it under either the terms of the +2-clause BSDL (see the file BSDL), or the conditions below: + +1. You may make and give away verbatim copies of the source form of the + software without restriction, provided that you duplicate all of the + original copyright notices and associated disclaimers. + +2. You may modify your copy of the software in any way, provided that + you do at least ONE of the following: + + a. place your modifications in the Public Domain or otherwise + make them Freely Available, such as by posting said + modifications to Usenet or an equivalent medium, or by allowing + the author to include your modifications in the software. + + b. use the modified software only within your corporation or + organization. + + c. give non-standard binaries non-standard names, with + instructions on where to get the original software distribution. + + d. make other distribution arrangements with the author. + +3. You may distribute the software in object code or binary form, + provided that you do at least ONE of the following: + + a. distribute the binaries and library files of the software, + together with instructions (in the manual page or equivalent) + on where to get the original distribution. + + b. accompany the distribution with the machine-readable source of + the software. + + c. give non-standard binaries non-standard names, with + instructions on where to get the original software distribution. + + d. make other distribution arrangements with the author. + +4. You may modify and include the part of the software into any other + software (possibly commercial). But some files in the distribution + are not written by the author, so that they are not under these terms. + + For the list of those files and their copying conditions, see the + file LEGAL. + +5. The scripts and library files supplied as input to or produced as + output from the software do not automatically fall under the + copyright of the software, but belong to whomever generated them, + and may be sold commercially, and may be aggregated with this + software. + +6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/Gemfile b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/Gemfile new file mode 100644 index 0000000..eded3b0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/Gemfile @@ -0,0 +1,10 @@ +source 'https://rubygems.org/' + +gemspec + +group :development do + gem 'rake' + gem 'rake-compiler' + gem 'test-unit' + gem "test-unit-ruby-core" +end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/LICENSE.txt b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/LICENSE.txt new file mode 100644 index 0000000..ca9fe59 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/LICENSE.txt @@ -0,0 +1,2 @@ +All the files in this distribution are covered under either the Ruby's +license (see the file COPYING) or BSD-2-Clause license (see the file BSDL). diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/NEWS.md b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/NEWS.md new file mode 100644 index 0000000..62bf370 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/NEWS.md @@ -0,0 +1,65 @@ +# Change Log + +## 5.0.2 + +* Declare escape functions as Ractor-safe [#63](https://github.com/ruby/erb/pull/63) + +## 5.0.1 + +* Rescue `LoadError` when failing to load `erb/escape` + +## 5.0.0 + +* Bump `required_ruby_version` to Ruby 3.2+ [#60](https://github.com/ruby/erb/pull/60) +* Drop `cgi` from runtime dependencies [#59](https://github.com/ruby/erb/pull/59) +* Make `ERB::VERSION` public + +## 4.0.4 + +* Skip building the C extension for JRuby [#52](https://github.com/ruby/erb/pull/52) + +## 4.0.3 + +* Enable `frozen_string_literal` in all files [#49](https://github.com/ruby/erb/pull/49) + +## 4.0.2 + +* Fix line numbers after multi-line `<%#` [#42](https://github.com/ruby/erb/pull/42) + +## 4.0.1 + +* Stop building the C extension for TruffleRuby [#39](https://github.com/ruby/erb/pull/39) + +## 4.0.0 + +* Optimize `ERB::Util.html_escape` [#27](https://github.com/ruby/erb/pull/27) + * No longer duplicate an argument string when nothing is escaped. + * This makes `ERB::Util.html_escape` faster than `CGI.escapeHTML` in no-escape cases. + * It skips calling `#to_s` when an argument is already a String. +* Define `ERB::Escape.html_escape` as an alias to `ERB::Util.html_escape` [#38](https://github.com/ruby/erb/pull/38) + * `ERB::Util.html_escape` is known to be monkey-patched by Rails. + `ERB::Escape.html_escape` is useful when you want a non-monkey-patched version. +* Drop deprecated `-S` option from `erb` command + +## 3.0.0 + +* Bump `required_ruby_version` to Ruby 2.7+ [#23](https://github.com/ruby/erb/pull/23) +* `ERB::Util.url_encode` uses a native implementation [#23](https://github.com/ruby/erb/pull/23) +* Fix a bug that a magic comment with a wrong format could be detected [#6](https://github.com/ruby/erb/pull/6) + +## 2.2.3 + +* Bump `required_ruby_version` from 2.3 to 2.5 as it has never been supported [#3](https://github.com/ruby/erb/pull/3) + +## 2.2.2 + +* `ERB.version` returns just a version number +* `ERB::Revision` is deprecated + +## 2.2.1 + +* `ERB#initialize` warns `safe_level` and later arguments even without -w + +## 2.2.0 + +* Ruby 3.0 promoted ERB to a default gem diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/README.md b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/README.md new file mode 100644 index 0000000..908fdb7 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/README.md @@ -0,0 +1,255 @@ +# ERB + +An easy to use but powerful templating system for Ruby. + +## Introduction + +ERB provides an easy to use but powerful templating system for Ruby. Using +ERB, actual Ruby code can be added to any plain text document for the +purposes of generating document information details and/or flow control. + +A very simple example is this: + +```rb +require 'erb' + +x = 42 +template = ERB.new <<-EOF + The value of x is: <%= x %> +EOF +puts template.result(binding) +``` + +Prints: `The value of x is: 42` + +More complex examples are given below. + +## Recognized Tags + +ERB recognizes certain tags in the provided template and converts them based +on the rules below: + +```erb +<% Ruby code -- inline with output %> +<%= Ruby expression -- replace with result %> +<%# comment -- ignored -- useful in testing %> (`<% #` doesn't work. Don't use Ruby comments.) +% a line of Ruby code -- treated as <% line %> (optional -- see ERB.new) +%% replaced with % if first thing on a line and % processing is used +<%% or %%> -- replace with <% or %> respectively +``` + +All other text is passed through ERB filtering unchanged. + +## Options + +There are several settings you can change when you use ERB: +* the nature of the tags that are recognized; +* the binding used to resolve local variables in the template. + +See the ERB.new and ERB#result methods for more detail. + +## Character encodings + +ERB (or Ruby code generated by ERB) returns a string in the same +character encoding as the input string. When the input string has +a magic comment, however, it returns a string in the encoding specified +by the magic comment. + +```rb +# -*- coding: utf-8 -*- +require 'erb' + +template = ERB.new < + __ENCODING__ is <%= __ENCODING__ %>. +EOF +puts template.result +``` + +Prints: `__ENCODING__ is Big5.` + +## Examples + +### Plain Text + +ERB is useful for any generic templating situation. Note that in this example, we use the +convenient "% at start of line" tag, and we quote the template literally with +`%q{...}` to avoid trouble with the backslash. + +```rb +require "erb" + +# Create template. +template = %q{ + From: James Edward Gray II + To: <%= to %> + Subject: Addressing Needs + + <%= to[/\w+/] %>: + + Just wanted to send a quick note assuring that your needs are being + addressed. + + I want you to know that my team will keep working on the issues, + especially: + + <%# ignore numerous minor requests -- focus on priorities %> + % priorities.each do |priority| + * <%= priority %> + % end + + Thanks for your patience. + + James Edward Gray II +}.gsub(/^ /, '') + +message = ERB.new(template, trim_mode: "%<>") + +# Set up template data. +to = "Community Spokesman " +priorities = [ "Run Ruby Quiz", + "Document Modules", + "Answer Questions on Ruby Talk" ] + +# Produce result. +email = message.result +puts email +``` + +Generates: + +``` +From: James Edward Gray II +To: Community Spokesman +Subject: Addressing Needs + +Community: + +Just wanted to send a quick note assuring that your needs are being addressed. + +I want you to know that my team will keep working on the issues, especially: + + * Run Ruby Quiz + * Document Modules + * Answer Questions on Ruby Talk + +Thanks for your patience. + +James Edward Gray II +``` + +### Ruby in HTML + +ERB is often used in .rhtml files (HTML with embedded Ruby). Notice the need in +this example to provide a special binding when the template is run, so that the instance +variables in the Product object can be resolved. + +```rb +require "erb" + +# Build template data class. +class Product + def initialize( code, name, desc, cost ) + @code = code + @name = name + @desc = desc + @cost = cost + + @features = [ ] + end + + def add_feature( feature ) + @features << feature + end + + # Support templating of member data. + def get_binding + binding + end + + # ... +end + +# Create template. +template = %{ + + Ruby Toys -- <%= @name %> + + +

<%= @name %> (<%= @code %>)

+

<%= @desc %>

+ +
    + <% @features.each do |f| %> +
  • <%= f %>
  • + <% end %> +
+ +

+ <% if @cost < 10 %> + Only <%= @cost %>!!! + <% else %> + Call for a price, today! + <% end %> +

+ + + +}.gsub(/^ /, '') + +rhtml = ERB.new(template) + +# Set up template data. +toy = Product.new( "TZ-1002", + "Rubysapien", + "Geek's Best Friend! Responds to Ruby commands...", + 999.95 ) +toy.add_feature("Listens for verbal commands in the Ruby language!") +toy.add_feature("Ignores Perl, Java, and all C variants.") +toy.add_feature("Karate-Chop Action!!!") +toy.add_feature("Matz signature on left leg.") +toy.add_feature("Gem studded eyes... Rubies, of course!") + +# Produce result. +rhtml.run(toy.get_binding) +``` + +Generates (some blank lines removed): + +```html + + Ruby Toys -- Rubysapien + + +

Rubysapien (TZ-1002)

+

Geek's Best Friend! Responds to Ruby commands...

+ +
    +
  • Listens for verbal commands in the Ruby language!
  • +
  • Ignores Perl, Java, and all C variants.
  • +
  • Karate-Chop Action!!!
  • +
  • Matz signature on left leg.
  • +
  • Gem studded eyes... Rubies, of course!
  • +
+ +

+ Call for a price, today! +

+ + + +``` + +## Notes + +There are a variety of templating solutions available in various Ruby projects. +For example, RDoc, distributed with Ruby, uses its own template engine, which +can be reused elsewhere. + +Other popular engines could be found in the corresponding +[Category](https://www.ruby-toolbox.com/categories/template_engines) of +The Ruby Toolbox. + +## License + +The gem is available as open source under the terms of the [2-Clause BSD License](https://opensource.org/licenses/BSD-2-Clause). diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/Rakefile b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/Rakefile new file mode 100644 index 0000000..8e83d7e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/Rakefile @@ -0,0 +1,19 @@ +require 'bundler/gem_tasks' +require 'rake/testtask' + +Rake::TestTask.new(:test) do |t| + t.libs << 'test/lib' + t.ruby_opts << '-rhelper' + t.test_files = FileList['test/**/test_*.rb'] +end + +case RUBY_ENGINE +when 'jruby', 'truffleruby' + # not using C extension +else + require 'rake/extensiontask' + Rake::ExtensionTask.new('erb/escape') + task test: :compile +end + +task default: :test diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/_doc/cgi.rb b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/_doc/cgi.rb new file mode 100644 index 0000000..0902b73 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/_doc/cgi.rb @@ -0,0 +1,3 @@ +# See {CGI document}[https://docs.ruby-lang.org/en/master/CGI.html] +module CGI +end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/bin/console b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/bin/console new file mode 100755 index 0000000..6355e0f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/bin/console @@ -0,0 +1,14 @@ +#!/usr/bin/env ruby + +require "bundler/setup" +require "erb" + +# You can add fixtures and/or initialization code here to make experimenting +# with your gem easier. You can also use a different console, if you like. + +# (If you use this, don't forget to add pry to your Gemfile!) +# require "pry" +# Pry.start + +require "irb" +IRB.start(__FILE__) diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/bin/setup b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/bin/setup new file mode 100755 index 0000000..dce67d8 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/bin/setup @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail +IFS=$'\n\t' +set -vx + +bundle install + +# Do any other automated setup that you need to do here diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/erb.gemspec b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/erb.gemspec new file mode 100644 index 0000000..94edc68 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/erb.gemspec @@ -0,0 +1,36 @@ +begin + require_relative 'lib/erb/version' +rescue LoadError + # for Ruby core repository + require_relative 'version' +end + +Gem::Specification.new do |spec| + spec.name = 'erb' + spec.version = ERB::VERSION + spec.authors = ['Masatoshi SEKI', 'Takashi Kokubun'] + spec.email = ['seki@ruby-lang.org', 'k0kubun@ruby-lang.org'] + + spec.summary = %q{An easy to use but powerful templating system for Ruby.} + spec.description = %q{An easy to use but powerful templating system for Ruby.} + spec.homepage = 'https://github.com/ruby/erb' + spec.licenses = ['Ruby', 'BSD-2-Clause'] + + spec.metadata['homepage_uri'] = spec.homepage + spec.metadata['source_code_uri'] = spec.homepage + + spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do + `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } + end + spec.bindir = 'libexec' + spec.executables = ['erb'] + spec.require_paths = ['lib'] + + spec.required_ruby_version = '>= 3.2.0' + + if RUBY_ENGINE == 'jruby' + spec.platform = 'java' + else + spec.extensions = ['ext/erb/escape/extconf.rb'] + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/Makefile b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/Makefile new file mode 100644 index 0000000..58021e1 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/Makefile @@ -0,0 +1,269 @@ + +SHELL = /bin/sh + +# V=0 quiet, V=1 verbose. other values don't work. +V = 0 +V0 = $(V:0=) +Q1 = $(V:1=) +Q = $(Q1:0=@) +ECHO1 = $(V:1=@ :) +ECHO = $(ECHO1:0=@ echo) +NULLCMD = : + +#### Start of system configuration section. #### + +srcdir = . +topdir = /usr/include/ruby-3.2.0 +hdrdir = $(topdir) +arch_hdrdir = /usr/include/x86_64-linux-gnu/ruby-3.2.0 +PATH_SEPARATOR = : +VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby +prefix = $(DESTDIR)/usr +rubysitearchprefix = $(sitearchlibdir)/$(RUBY_BASE_NAME) +rubyarchprefix = $(archlibdir)/$(RUBY_BASE_NAME) +rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) +exec_prefix = $(prefix) +vendorarchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/vendor_ruby +sitearchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/site_ruby +rubyarchhdrdir = $(archincludedir)/$(RUBY_VERSION_NAME) +vendorhdrdir = $(rubyhdrdir)/vendor_ruby +sitehdrdir = $(rubyhdrdir)/site_ruby +rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) +vendorarchdir = $(rubysitearchprefix)/vendor_ruby/$(ruby_version) +vendorlibdir = $(vendordir)/$(ruby_version) +vendordir = $(rubylibprefix)/vendor_ruby +sitearchdir = $(DESTDIR)/usr/local/lib/x86_64-linux-gnu/site_ruby +sitelibdir = $(sitedir)/$(ruby_version) +sitedir = $(DESTDIR)/usr/local/lib/site_ruby +rubyarchdir = $(rubyarchprefix)/$(ruby_version) +rubylibdir = $(rubylibprefix)/$(ruby_version) +sitearchincludedir = $(includedir)/$(sitearch) +archincludedir = $(includedir)/$(arch) +sitearchlibdir = $(libdir)/$(sitearch) +archlibdir = $(libdir)/$(arch) +ridir = $(datarootdir)/$(RI_BASE_NAME) +mandir = $(datarootdir)/man +localedir = $(datarootdir)/locale +libdir = $(exec_prefix)/lib +psdir = $(docdir) +pdfdir = $(docdir) +dvidir = $(docdir) +htmldir = $(docdir) +infodir = $(datarootdir)/info +docdir = $(datarootdir)/doc/$(PACKAGE) +oldincludedir = $(DESTDIR)/usr/include +includedir = $(prefix)/include +runstatedir = $(DESTDIR)/var/run +localstatedir = $(DESTDIR)/var +sharedstatedir = $(prefix)/com +sysconfdir = $(DESTDIR)/etc +datadir = $(datarootdir) +datarootdir = $(prefix)/share +libexecdir = $(exec_prefix)/libexec +sbindir = $(exec_prefix)/sbin +bindir = $(exec_prefix)/bin +archdir = $(rubyarchdir) + + +CC_WRAPPER = +CC = x86_64-linux-gnu-gcc +CXX = x86_64-linux-gnu-g++ +LIBRUBY = $(LIBRUBY_SO) +LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a +LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) +LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static $(MAINLIBS) +empty = +OUTFLAG = -o $(empty) +COUTFLAG = -o $(empty) +CSRCFLAG = $(empty) + +RUBY_EXTCONF_H = +cflags = $(optflags) $(debugflags) $(warnflags) +cxxflags = +optflags = -O3 -fno-fast-math +debugflags = -ggdb3 +warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdiv-by-zero -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wold-style-definition -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef +cppflags = +CCDLFLAGS = -fPIC +CFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC $(ARCH_FLAG) +INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) +DEFS = +CPPFLAGS = -DHAVE_RB_EXT_RACTOR_SAFE -Wdate-time -D_FORTIFY_SOURCE=3 $(DEFS) $(cppflags) +CXXFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 $(ARCH_FLAG) +ldflags = -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed +dldflags = -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now +ARCH_FLAG = +DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) +LDSHARED = $(CC) -shared +LDSHAREDXX = $(CXX) -shared +AR = x86_64-linux-gnu-gcc-ar +EXEEXT = + +RUBY_INSTALL_NAME = $(RUBY_BASE_NAME)3.2 +RUBY_SO_NAME = ruby-3.2 +RUBYW_INSTALL_NAME = +RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) +RUBYW_BASE_NAME = rubyw +RUBY_BASE_NAME = ruby + +arch = x86_64-linux-gnu +sitearch = $(arch) +ruby_version = 3.2.0 +ruby = $(bindir)/$(RUBY_BASE_NAME)3.2 +RUBY = $(ruby) +BUILTRUBY = $(bindir)/$(RUBY_BASE_NAME)3.2 +ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h + +RM = rm -f +RM_RF = rm -fr +RMDIRS = rmdir --ignore-fail-on-non-empty -p +MAKEDIRS = /bin/mkdir -p +INSTALL = /usr/bin/install -c +INSTALL_PROG = $(INSTALL) -m 0755 +INSTALL_DATA = $(INSTALL) -m 644 +COPY = cp +TOUCH = exit > + +#### End of system configuration section. #### + +preload = +libpath = . $(archlibdir) +LIBPATH = -L. -L$(archlibdir) +DEFFILE = + +CLEANFILES = mkmf.log +DISTCLEANFILES = +DISTCLEANDIRS = + +extout = +extout_prefix = +target_prefix = /erb +LOCAL_LIBS = +LIBS = $(LIBRUBYARG_SHARED) -lm -lpthread -lc +ORIG_SRCS = escape.c +SRCS = $(ORIG_SRCS) +OBJS = escape.o +HDRS = +LOCAL_HDRS = +TARGET = escape +TARGET_NAME = escape +TARGET_ENTRY = Init_$(TARGET_NAME) +DLLIB = $(TARGET).so +EXTSTATIC = +STATIC_LIB = + +TIMESTAMP_DIR = . +BINDIR = $(bindir) +RUBYCOMMONDIR = $(sitedir)$(target_prefix) +RUBYLIBDIR = $(sitelibdir)$(target_prefix) +RUBYARCHDIR = $(sitearchdir)$(target_prefix) +HDRDIR = $(sitehdrdir)$(target_prefix) +ARCHHDRDIR = $(sitearchhdrdir)$(target_prefix) +TARGET_SO_DIR = +TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) +CLEANLIBS = $(TARGET_SO) false +CLEANOBJS = $(OBJS) *.bak +TARGET_SO_DIR_TIMESTAMP = $(TIMESTAMP_DIR)/.sitearchdir.-.erb.time + +all: $(DLLIB) +static: $(STATIC_LIB) +.PHONY: all install static install-so install-rb +.PHONY: clean clean-so clean-static clean-rb + +clean-static:: +clean-rb-default:: +clean-rb:: +clean-so:: +clean: clean-so clean-static clean-rb-default clean-rb + -$(Q)$(RM_RF) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time + +distclean-rb-default:: +distclean-rb:: +distclean-so:: +distclean-static:: +distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb + -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log + -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) + -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true + +realclean: distclean +install: install-so install-rb + +install-so: $(DLLIB) $(TARGET_SO_DIR_TIMESTAMP) + $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) +clean-static:: + -$(Q)$(RM) $(STATIC_LIB) +install-rb: pre-install-rb do-install-rb install-rb-default +install-rb-default: pre-install-rb-default do-install-rb-default +pre-install-rb: Makefile +pre-install-rb-default: Makefile +do-install-rb: +do-install-rb-default: +pre-install-rb-default: + @$(NULLCMD) +$(TARGET_SO_DIR_TIMESTAMP): + $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) + $(Q) $(TOUCH) $@ + +site-install: site-install-so site-install-rb +site-install-so: install-so +site-install-rb: install-rb + +.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S + +.cc.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cc.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.mm.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.mm.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cxx.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cxx.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cpp.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cpp.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.c.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.c.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.m.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.m.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +$(TARGET_SO): $(OBJS) Makefile + $(ECHO) linking shared-object erb/$(DLLIB) + -$(Q)$(RM) $(@) + $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) + + + +$(OBJS): $(HDRS) $(ruby_headers) diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/escape.c b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/escape.c new file mode 100644 index 0000000..2a5903c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/escape.c @@ -0,0 +1,102 @@ +#include "ruby.h" +#include "ruby/encoding.h" + +static VALUE rb_cERB, rb_mEscape, rb_cCGI; +static ID id_escapeHTML; + +#define HTML_ESCAPE_MAX_LEN 6 + +static const struct { + uint8_t len; + char str[HTML_ESCAPE_MAX_LEN+1]; +} html_escape_table[UCHAR_MAX+1] = { +#define HTML_ESCAPE(c, str) [c] = {rb_strlen_lit(str), str} + HTML_ESCAPE('\'', "'"), + HTML_ESCAPE('&', "&"), + HTML_ESCAPE('"', """), + HTML_ESCAPE('<', "<"), + HTML_ESCAPE('>', ">"), +#undef HTML_ESCAPE +}; + +static inline void +preserve_original_state(VALUE orig, VALUE dest) +{ + rb_enc_associate(dest, rb_enc_get(orig)); +} + +static inline long +escaped_length(VALUE str) +{ + const long len = RSTRING_LEN(str); + if (len >= LONG_MAX / HTML_ESCAPE_MAX_LEN) { + ruby_malloc_size_overflow(len, HTML_ESCAPE_MAX_LEN); + } + return len * HTML_ESCAPE_MAX_LEN; +} + +static VALUE +optimized_escape_html(VALUE str) +{ + VALUE vbuf; + char *buf = ALLOCV_N(char, vbuf, escaped_length(str)); + const char *cstr = RSTRING_PTR(str); + const char *end = cstr + RSTRING_LEN(str); + + char *dest = buf; + while (cstr < end) { + const unsigned char c = *cstr++; + uint8_t len = html_escape_table[c].len; + if (len) { + memcpy(dest, html_escape_table[c].str, len); + dest += len; + } + else { + *dest++ = c; + } + } + + VALUE escaped = str; + if (RSTRING_LEN(str) < (dest - buf)) { + escaped = rb_str_new(buf, dest - buf); + preserve_original_state(str, escaped); + } + ALLOCV_END(vbuf); + return escaped; +} + +/* + * ERB::Util.html_escape is similar to CGI.escapeHTML but different in the following two parts: + * + * * ERB::Util.html_escape converts an argument with #to_s first (only if it's not T_STRING) + * * ERB::Util.html_escape does not allocate a new string when nothing needs to be escaped + */ +static VALUE +erb_escape_html(VALUE self, VALUE str) +{ + if (!RB_TYPE_P(str, T_STRING)) { + str = rb_convert_type(str, T_STRING, "String", "to_s"); + } + + if (rb_enc_str_asciicompat_p(str)) { + return optimized_escape_html(str); + } + else { + return rb_funcall(rb_cCGI, id_escapeHTML, 1, str); + } +} + +void +Init_escape(void) +{ +#ifdef HAVE_RB_EXT_RACTOR_SAFE + rb_ext_ractor_safe(true); +#endif + + rb_cERB = rb_define_class("ERB", rb_cObject); + rb_mEscape = rb_define_module_under(rb_cERB, "Escape"); + rb_define_module_function(rb_mEscape, "html_escape", erb_escape_html, 1); + + rb_cCGI = rb_define_class("CGI", rb_cObject); + id_escapeHTML = rb_intern("escapeHTML"); +} diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/extconf.rb b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/extconf.rb new file mode 100644 index 0000000..b211a97 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/extconf.rb @@ -0,0 +1,9 @@ +require 'mkmf' + +case RUBY_ENGINE +when 'jruby', 'truffleruby' + File.write('Makefile', dummy_makefile($srcdir).join) +else + have_func("rb_ext_ractor_safe", "ruby.h") + create_makefile 'erb/escape' +end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb.rb b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb.rb new file mode 100644 index 0000000..ebf91e4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb.rb @@ -0,0 +1,504 @@ +# -*- coding: us-ascii -*- +# frozen_string_literal: true +# = ERB -- Ruby Templating +# +# Author:: Masatoshi SEKI +# Documentation:: James Edward Gray II, Gavin Sinclair, and Simon Chiang +# +# See ERB for primary documentation and ERB::Util for a couple of utility +# routines. +# +# Copyright (c) 1999-2000,2002,2003 Masatoshi SEKI +# +# You can redistribute it and/or modify it under the same terms as Ruby. + +require 'erb/version' +require 'erb/compiler' +require 'erb/def_method' +require 'erb/util' + +# +# = ERB -- Ruby Templating +# +# == Introduction +# +# ERB provides an easy to use but powerful templating system for Ruby. Using +# ERB, actual Ruby code can be added to any plain text document for the +# purposes of generating document information details and/or flow control. +# +# A very simple example is this: +# +# require 'erb' +# +# x = 42 +# template = ERB.new <<-EOF +# The value of x is: <%= x %> +# EOF +# puts template.result(binding) +# +# Prints: The value of x is: 42 +# +# More complex examples are given below. +# +# +# == Recognized Tags +# +# ERB recognizes certain tags in the provided template and converts them based +# on the rules below: +# +# <% Ruby code -- inline with output %> +# <%= Ruby expression -- replace with result %> +# <%# comment -- ignored -- useful in testing %> (`<% #` doesn't work. Don't use Ruby comments.) +# % a line of Ruby code -- treated as <% line %> (optional -- see ERB.new) +# %% replaced with % if first thing on a line and % processing is used +# <%% or %%> -- replace with <% or %> respectively +# +# All other text is passed through ERB filtering unchanged. +# +# +# == Options +# +# There are several settings you can change when you use ERB: +# * the nature of the tags that are recognized; +# * the binding used to resolve local variables in the template. +# +# See the ERB.new and ERB#result methods for more detail. +# +# == Character encodings +# +# ERB (or Ruby code generated by ERB) returns a string in the same +# character encoding as the input string. When the input string has +# a magic comment, however, it returns a string in the encoding specified +# by the magic comment. +# +# # -*- coding: utf-8 -*- +# require 'erb' +# +# template = ERB.new < +# \_\_ENCODING\_\_ is <%= \_\_ENCODING\_\_ %>. +# EOF +# puts template.result +# +# Prints: \_\_ENCODING\_\_ is Big5. +# +# +# == Examples +# +# === Plain Text +# +# ERB is useful for any generic templating situation. Note that in this example, we use the +# convenient "% at start of line" tag, and we quote the template literally with +# %q{...} to avoid trouble with the backslash. +# +# require "erb" +# +# # Create template. +# template = %q{ +# From: James Edward Gray II +# To: <%= to %> +# Subject: Addressing Needs +# +# <%= to[/\w+/] %>: +# +# Just wanted to send a quick note assuring that your needs are being +# addressed. +# +# I want you to know that my team will keep working on the issues, +# especially: +# +# <%# ignore numerous minor requests -- focus on priorities %> +# % priorities.each do |priority| +# * <%= priority %> +# % end +# +# Thanks for your patience. +# +# James Edward Gray II +# }.gsub(/^ /, '') +# +# message = ERB.new(template, trim_mode: "%<>") +# +# # Set up template data. +# to = "Community Spokesman " +# priorities = [ "Run Ruby Quiz", +# "Document Modules", +# "Answer Questions on Ruby Talk" ] +# +# # Produce result. +# email = message.result +# puts email +# +# Generates: +# +# From: James Edward Gray II +# To: Community Spokesman +# Subject: Addressing Needs +# +# Community: +# +# Just wanted to send a quick note assuring that your needs are being addressed. +# +# I want you to know that my team will keep working on the issues, especially: +# +# * Run Ruby Quiz +# * Document Modules +# * Answer Questions on Ruby Talk +# +# Thanks for your patience. +# +# James Edward Gray II +# +# === Ruby in HTML +# +# ERB is often used in .rhtml files (HTML with embedded Ruby). Notice the need in +# this example to provide a special binding when the template is run, so that the instance +# variables in the Product object can be resolved. +# +# require "erb" +# +# # Build template data class. +# class Product +# def initialize( code, name, desc, cost ) +# @code = code +# @name = name +# @desc = desc +# @cost = cost +# +# @features = [ ] +# end +# +# def add_feature( feature ) +# @features << feature +# end +# +# # Support templating of member data. +# def get_binding +# binding +# end +# +# # ... +# end +# +# # Create template. +# template = %{ +# +# Ruby Toys -- <%= @name %> +# +# +#

<%= @name %> (<%= @code %>)

+#

<%= @desc %>

+# +#
    +# <% @features.each do |f| %> +#
  • <%= f %>
  • +# <% end %> +#
+# +#

+# <% if @cost < 10 %> +# Only <%= @cost %>!!! +# <% else %> +# Call for a price, today! +# <% end %> +#

+# +# +# +# }.gsub(/^ /, '') +# +# rhtml = ERB.new(template) +# +# # Set up template data. +# toy = Product.new( "TZ-1002", +# "Rubysapien", +# "Geek's Best Friend! Responds to Ruby commands...", +# 999.95 ) +# toy.add_feature("Listens for verbal commands in the Ruby language!") +# toy.add_feature("Ignores Perl, Java, and all C variants.") +# toy.add_feature("Karate-Chop Action!!!") +# toy.add_feature("Matz signature on left leg.") +# toy.add_feature("Gem studded eyes... Rubies, of course!") +# +# # Produce result. +# rhtml.run(toy.get_binding) +# +# Generates (some blank lines removed): +# +# +# Ruby Toys -- Rubysapien +# +# +#

Rubysapien (TZ-1002)

+#

Geek's Best Friend! Responds to Ruby commands...

+# +#
    +#
  • Listens for verbal commands in the Ruby language!
  • +#
  • Ignores Perl, Java, and all C variants.
  • +#
  • Karate-Chop Action!!!
  • +#
  • Matz signature on left leg.
  • +#
  • Gem studded eyes... Rubies, of course!
  • +#
+# +#

+# Call for a price, today! +#

+# +# +# +# +# +# == Notes +# +# There are a variety of templating solutions available in various Ruby projects. +# For example, RDoc, distributed with Ruby, uses its own template engine, which +# can be reused elsewhere. +# +# Other popular engines could be found in the corresponding +# {Category}[https://www.ruby-toolbox.com/categories/template_engines] of +# The Ruby Toolbox. +# +class ERB + Revision = '$Date:: $' # :nodoc: #' + deprecate_constant :Revision + + # Returns revision information for the erb.rb module. + def self.version + VERSION + end + + # + # Constructs a new ERB object with the template specified in _str_. + # + # An ERB object works by building a chunk of Ruby code that will output + # the completed template when run. + # + # If _trim_mode_ is passed a String containing one or more of the following + # modifiers, ERB will adjust its code generation as listed: + # + # % enables Ruby code processing for lines beginning with % + # <> omit newline for lines starting with <% and ending in %> + # > omit newline for lines ending in %> + # - omit blank lines ending in -%> + # + # _eoutvar_ can be used to set the name of the variable ERB will build up + # its output in. This is useful when you need to run multiple ERB + # templates through the same binding and/or when you want to control where + # output ends up. Pass the name of the variable to be used inside a String. + # + # === Example + # + # require "erb" + # + # # build data class + # class Listings + # PRODUCT = { :name => "Chicken Fried Steak", + # :desc => "A well messaged pattie, breaded and fried.", + # :cost => 9.95 } + # + # attr_reader :product, :price + # + # def initialize( product = "", price = "" ) + # @product = product + # @price = price + # end + # + # def build + # b = binding + # # create and run templates, filling member data variables + # ERB.new(<<~'END_PRODUCT', trim_mode: "", eoutvar: "@product").result b + # <%= PRODUCT[:name] %> + # <%= PRODUCT[:desc] %> + # END_PRODUCT + # ERB.new(<<~'END_PRICE', trim_mode: "", eoutvar: "@price").result b + # <%= PRODUCT[:name] %> -- <%= PRODUCT[:cost] %> + # <%= PRODUCT[:desc] %> + # END_PRICE + # end + # end + # + # # setup template data + # listings = Listings.new + # listings.build + # + # puts listings.product + "\n" + listings.price + # + # _Generates_ + # + # Chicken Fried Steak + # A well massaged pattie, breaded and fried. + # + # Chicken Fried Steak -- 9.95 + # A well massaged pattie, breaded and fried. + # + def initialize(str, safe_level=NOT_GIVEN, legacy_trim_mode=NOT_GIVEN, legacy_eoutvar=NOT_GIVEN, trim_mode: nil, eoutvar: '_erbout') + # Complex initializer for $SAFE deprecation at [Feature #14256]. Use keyword arguments to pass trim_mode or eoutvar. + if safe_level != NOT_GIVEN + warn 'Passing safe_level with the 2nd argument of ERB.new is deprecated. Do not use it, and specify other arguments as keyword arguments.', uplevel: 1 + end + if legacy_trim_mode != NOT_GIVEN + warn 'Passing trim_mode with the 3rd argument of ERB.new is deprecated. Use keyword argument like ERB.new(str, trim_mode: ...) instead.', uplevel: 1 + trim_mode = legacy_trim_mode + end + if legacy_eoutvar != NOT_GIVEN + warn 'Passing eoutvar with the 4th argument of ERB.new is deprecated. Use keyword argument like ERB.new(str, eoutvar: ...) instead.', uplevel: 1 + eoutvar = legacy_eoutvar + end + + compiler = make_compiler(trim_mode) + set_eoutvar(compiler, eoutvar) + @src, @encoding, @frozen_string = *compiler.compile(str) + @filename = nil + @lineno = 0 + @_init = self.class.singleton_class + end + NOT_GIVEN = defined?(Ractor) ? Ractor.make_shareable(Object.new) : Object.new + private_constant :NOT_GIVEN + + ## + # Creates a new compiler for ERB. See ERB::Compiler.new for details + + def make_compiler(trim_mode) + ERB::Compiler.new(trim_mode) + end + + # The Ruby code generated by ERB + attr_reader :src + + # The encoding to eval + attr_reader :encoding + + # The optional _filename_ argument passed to Kernel#eval when the ERB code + # is run + attr_accessor :filename + + # The optional _lineno_ argument passed to Kernel#eval when the ERB code + # is run + attr_accessor :lineno + + # + # Sets optional filename and line number that will be used in ERB code + # evaluation and error reporting. See also #filename= and #lineno= + # + # erb = ERB.new('<%= some_x %>') + # erb.render + # # undefined local variable or method `some_x' + # # from (erb):1 + # + # erb.location = ['file.erb', 3] + # # All subsequent error reporting would use new location + # erb.render + # # undefined local variable or method `some_x' + # # from file.erb:4 + # + def location=((filename, lineno)) + @filename = filename + @lineno = lineno if lineno + end + + # + # Can be used to set _eoutvar_ as described in ERB::new. It's probably + # easier to just use the constructor though, since calling this method + # requires the setup of an ERB _compiler_ object. + # + def set_eoutvar(compiler, eoutvar = '_erbout') + compiler.put_cmd = "#{eoutvar}.<<" + compiler.insert_cmd = "#{eoutvar}.<<" + compiler.pre_cmd = ["#{eoutvar} = +''"] + compiler.post_cmd = [eoutvar] + end + + # Generate results and print them. (see ERB#result) + def run(b=new_toplevel) + print self.result(b) + end + + # + # Executes the generated ERB code to produce a completed template, returning + # the results of that code. + # + # _b_ accepts a Binding object which is used to set the context of + # code evaluation. + # + def result(b=new_toplevel) + unless @_init.equal?(self.class.singleton_class) + raise ArgumentError, "not initialized" + end + eval(@src, b, (@filename || '(erb)'), @lineno) + end + + # Render a template on a new toplevel binding with local variables specified + # by a Hash object. + def result_with_hash(hash) + b = new_toplevel(hash.keys) + hash.each_pair do |key, value| + b.local_variable_set(key, value) + end + result(b) + end + + ## + # Returns a new binding each time *near* TOPLEVEL_BINDING for runs that do + # not specify a binding. + + def new_toplevel(vars = nil) + b = TOPLEVEL_BINDING + if vars + vars = vars.select {|v| b.local_variable_defined?(v)} + unless vars.empty? + return b.eval("tap {|;#{vars.join(',')}| break binding}") + end + end + b.dup + end + private :new_toplevel + + # Define _methodname_ as instance method of _mod_ from compiled Ruby source. + # + # example: + # filename = 'example.rhtml' # 'arg1' and 'arg2' are used in example.rhtml + # erb = ERB.new(File.read(filename)) + # erb.def_method(MyClass, 'render(arg1, arg2)', filename) + # print MyClass.new.render('foo', 123) + def def_method(mod, methodname, fname='(ERB)') + src = self.src.sub(/^(?!#|$)/) {"def #{methodname}\n"} << "\nend\n" + mod.module_eval do + eval(src, binding, fname, -1) + end + end + + # Create unnamed module, define _methodname_ as instance method of it, and return it. + # + # example: + # filename = 'example.rhtml' # 'arg1' and 'arg2' are used in example.rhtml + # erb = ERB.new(File.read(filename)) + # erb.filename = filename + # MyModule = erb.def_module('render(arg1, arg2)') + # class MyClass + # include MyModule + # end + def def_module(methodname='erb') + mod = Module.new + def_method(mod, methodname, @filename || '(ERB)') + mod + end + + # Define unnamed class which has _methodname_ as instance method, and return it. + # + # example: + # class MyClass_ + # def initialize(arg1, arg2) + # @arg1 = arg1; @arg2 = arg2 + # end + # end + # filename = 'example.rhtml' # @arg1 and @arg2 are used in example.rhtml + # erb = ERB.new(File.read(filename)) + # erb.filename = filename + # MyClass = erb.def_class(MyClass_, 'render()') + # print MyClass.new('foo', 123).render() + def def_class(superklass=Object, methodname='result') + cls = Class.new(superklass) + def_method(cls, methodname, @filename || '(ERB)') + cls + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/compiler.rb b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/compiler.rb new file mode 100644 index 0000000..08b5eb4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/compiler.rb @@ -0,0 +1,488 @@ +# frozen_string_literal: true +#-- +# ERB::Compiler +# +# Compiles ERB templates into Ruby code; the compiled code produces the +# template result when evaluated. ERB::Compiler provides hooks to define how +# generated output is handled. +# +# Internally ERB does something like this to generate the code returned by +# ERB#src: +# +# compiler = ERB::Compiler.new('<>') +# compiler.pre_cmd = ["_erbout=+''"] +# compiler.put_cmd = "_erbout.<<" +# compiler.insert_cmd = "_erbout.<<" +# compiler.post_cmd = ["_erbout"] +# +# code, enc = compiler.compile("Got <%= obj %>!\n") +# puts code +# +# Generates: +# +# #coding:UTF-8 +# _erbout=+''; _erbout.<< "Got ".freeze; _erbout.<<(( obj ).to_s); _erbout.<< "!\n".freeze; _erbout +# +# By default the output is sent to the print method. For example: +# +# compiler = ERB::Compiler.new('<>') +# code, enc = compiler.compile("Got <%= obj %>!\n") +# puts code +# +# Generates: +# +# #coding:UTF-8 +# print "Got ".freeze; print(( obj ).to_s); print "!\n".freeze +# +# == Evaluation +# +# The compiled code can be used in any context where the names in the code +# correctly resolve. Using the last example, each of these print 'Got It!' +# +# Evaluate using a variable: +# +# obj = 'It' +# eval code +# +# Evaluate using an input: +# +# mod = Module.new +# mod.module_eval %{ +# def get(obj) +# #{code} +# end +# } +# extend mod +# get('It') +# +# Evaluate using an accessor: +# +# klass = Class.new Object +# klass.class_eval %{ +# attr_accessor :obj +# def initialize(obj) +# @obj = obj +# end +# def get_it +# #{code} +# end +# } +# klass.new('It').get_it +# +# Good! See also ERB#def_method, ERB#def_module, and ERB#def_class. +class ERB::Compiler # :nodoc: + class PercentLine # :nodoc: + def initialize(str) + @value = str + end + attr_reader :value + alias :to_s :value + end + + class Scanner # :nodoc: + @scanner_map = defined?(Ractor) ? Ractor.make_shareable({}) : {} + class << self + if defined?(Ractor) + def register_scanner(klass, trim_mode, percent) + @scanner_map = Ractor.make_shareable({ **@scanner_map, [trim_mode, percent] => klass }) + end + else + def register_scanner(klass, trim_mode, percent) + @scanner_map[[trim_mode, percent]] = klass + end + end + alias :regist_scanner :register_scanner + end + + def self.default_scanner=(klass) + @default_scanner = klass + end + + def self.make_scanner(src, trim_mode, percent) + klass = @scanner_map.fetch([trim_mode, percent], @default_scanner) + klass.new(src, trim_mode, percent) + end + + DEFAULT_STAGS = %w(<%% <%= <%# <%).freeze + DEFAULT_ETAGS = %w(%%> %>).freeze + def initialize(src, trim_mode, percent) + @src = src + @stag = nil + @stags = DEFAULT_STAGS + @etags = DEFAULT_ETAGS + end + attr_accessor :stag + attr_reader :stags, :etags + + def scan; end + end + + class TrimScanner < Scanner # :nodoc: + def initialize(src, trim_mode, percent) + super + @trim_mode = trim_mode + @percent = percent + if @trim_mode == '>' + @scan_reg = /(.*?)(%>\r?\n|#{(stags + etags).join('|')}|\n|\z)/m + @scan_line = self.method(:trim_line1) + elsif @trim_mode == '<>' + @scan_reg = /(.*?)(%>\r?\n|#{(stags + etags).join('|')}|\n|\z)/m + @scan_line = self.method(:trim_line2) + elsif @trim_mode == '-' + @scan_reg = /(.*?)(^[ \t]*<%\-|<%\-|-%>\r?\n|-%>|#{(stags + etags).join('|')}|\z)/m + @scan_line = self.method(:explicit_trim_line) + else + @scan_reg = /(.*?)(#{(stags + etags).join('|')}|\n|\z)/m + @scan_line = self.method(:scan_line) + end + end + + def scan(&block) + @stag = nil + if @percent + @src.each_line do |line| + percent_line(line, &block) + end + else + @scan_line.call(@src, &block) + end + nil + end + + def percent_line(line, &block) + if @stag || line[0] != ?% + return @scan_line.call(line, &block) + end + + line[0] = '' + if line[0] == ?% + @scan_line.call(line, &block) + else + yield(PercentLine.new(line.chomp)) + end + end + + def scan_line(line) + line.scan(@scan_reg) do |tokens| + tokens.each do |token| + next if token.empty? + yield(token) + end + end + end + + def trim_line1(line) + line.scan(@scan_reg) do |tokens| + tokens.each do |token| + next if token.empty? + if token == "%>\n" || token == "%>\r\n" + yield('%>') + yield(:cr) + else + yield(token) + end + end + end + end + + def trim_line2(line) + head = nil + line.scan(@scan_reg) do |tokens| + tokens.each do |token| + next if token.empty? + head = token unless head + if token == "%>\n" || token == "%>\r\n" + yield('%>') + if is_erb_stag?(head) + yield(:cr) + else + yield("\n") + end + head = nil + else + yield(token) + head = nil if token == "\n" + end + end + end + end + + def explicit_trim_line(line) + line.scan(@scan_reg) do |tokens| + tokens.each do |token| + next if token.empty? + if @stag.nil? && /[ \t]*<%-/ =~ token + yield('<%') + elsif @stag && (token == "-%>\n" || token == "-%>\r\n") + yield('%>') + yield(:cr) + elsif @stag && token == '-%>' + yield('%>') + else + yield(token) + end + end + end + end + + ERB_STAG = %w(<%= <%# <%) + def is_erb_stag?(s) + ERB_STAG.member?(s) + end + end + + Scanner.default_scanner = TrimScanner + + begin + require 'strscan' + rescue LoadError + else + class SimpleScanner < Scanner # :nodoc: + def scan + stag_reg = (stags == DEFAULT_STAGS) ? /(.*?)(<%[%=#]?|\z)/m : /(.*?)(#{stags.join('|')}|\z)/m + etag_reg = (etags == DEFAULT_ETAGS) ? /(.*?)(%%?>|\z)/m : /(.*?)(#{etags.join('|')}|\z)/m + scanner = StringScanner.new(@src) + while ! scanner.eos? + scanner.scan(@stag ? etag_reg : stag_reg) + yield(scanner[1]) + yield(scanner[2]) + end + end + end + Scanner.register_scanner(SimpleScanner, nil, false) + + class ExplicitScanner < Scanner # :nodoc: + def scan + stag_reg = /(.*?)(^[ \t]*<%-|<%-|#{stags.join('|')}|\z)/m + etag_reg = /(.*?)(-%>|#{etags.join('|')}|\z)/m + scanner = StringScanner.new(@src) + while ! scanner.eos? + scanner.scan(@stag ? etag_reg : stag_reg) + yield(scanner[1]) + + elem = scanner[2] + if /[ \t]*<%-/ =~ elem + yield('<%') + elsif elem == '-%>' + yield('%>') + yield(:cr) if scanner.scan(/(\r?\n|\z)/) + else + yield(elem) + end + end + end + end + Scanner.register_scanner(ExplicitScanner, '-', false) + end + + class Buffer # :nodoc: + def initialize(compiler, enc=nil, frozen=nil) + @compiler = compiler + @line = [] + @script = +'' + @script << "#coding:#{enc}\n" if enc + @script << "#frozen-string-literal:#{frozen}\n" unless frozen.nil? + @compiler.pre_cmd.each do |x| + push(x) + end + end + attr_reader :script + + def push(cmd) + @line << cmd + end + + def cr + @script << (@line.join('; ')) + @line = [] + @script << "\n" + end + + def close + return unless @line + @compiler.post_cmd.each do |x| + push(x) + end + @script << (@line.join('; ')) + @line = nil + end + end + + def add_put_cmd(out, content) + out.push("#{@put_cmd} #{content.dump}.freeze#{"\n" * content.count("\n")}") + end + + def add_insert_cmd(out, content) + out.push("#{@insert_cmd}((#{content}).to_s)") + end + + # Compiles an ERB template into Ruby code. Returns an array of the code + # and encoding like ["code", Encoding]. + def compile(s) + enc = s.encoding + raise ArgumentError, "#{enc} is not ASCII compatible" if enc.dummy? + s = s.b # see String#b + magic_comment = detect_magic_comment(s, enc) + out = Buffer.new(self, *magic_comment) + + self.content = +'' + scanner = make_scanner(s) + scanner.scan do |token| + next if token.nil? + next if token == '' + if scanner.stag.nil? + compile_stag(token, out, scanner) + else + compile_etag(token, out, scanner) + end + end + add_put_cmd(out, content) if content.size > 0 + out.close + return out.script, *magic_comment + end + + def compile_stag(stag, out, scanner) + case stag + when PercentLine + add_put_cmd(out, content) if content.size > 0 + self.content = +'' + out.push(stag.to_s) + out.cr + when :cr + out.cr + when '<%', '<%=', '<%#' + scanner.stag = stag + add_put_cmd(out, content) if content.size > 0 + self.content = +'' + when "\n" + content << "\n" + add_put_cmd(out, content) + self.content = +'' + when '<%%' + content << '<%' + else + content << stag + end + end + + def compile_etag(etag, out, scanner) + case etag + when '%>' + compile_content(scanner.stag, out) + scanner.stag = nil + self.content = +'' + when '%%>' + content << '%>' + else + content << etag + end + end + + def compile_content(stag, out) + case stag + when '<%' + if content[-1] == ?\n + content.chop! + out.push(content) + out.cr + else + out.push(content) + end + when '<%=' + add_insert_cmd(out, content) + when '<%#' + out.push("\n" * content.count("\n")) # only adjust lineno + end + end + + def prepare_trim_mode(mode) # :nodoc: + case mode + when 1 + return [false, '>'] + when 2 + return [false, '<>'] + when 0, nil + return [false, nil] + when String + unless mode.match?(/\A(%|-|>|<>){1,2}\z/) + warn_invalid_trim_mode(mode, uplevel: 5) + end + + perc = mode.include?('%') + if mode.include?('-') + return [perc, '-'] + elsif mode.include?('<>') + return [perc, '<>'] + elsif mode.include?('>') + return [perc, '>'] + else + [perc, nil] + end + else + warn_invalid_trim_mode(mode, uplevel: 5) + return [false, nil] + end + end + + def make_scanner(src) # :nodoc: + Scanner.make_scanner(src, @trim_mode, @percent) + end + + # Construct a new compiler using the trim_mode. See ERB::new for available + # trim modes. + def initialize(trim_mode) + @percent, @trim_mode = prepare_trim_mode(trim_mode) + @put_cmd = 'print' + @insert_cmd = @put_cmd + @pre_cmd = [] + @post_cmd = [] + end + attr_reader :percent, :trim_mode + + # The command to handle text that ends with a newline + attr_accessor :put_cmd + + # The command to handle text that is inserted prior to a newline + attr_accessor :insert_cmd + + # An array of commands prepended to compiled code + attr_accessor :pre_cmd + + # An array of commands appended to compiled code + attr_accessor :post_cmd + + private + + # A buffered text in #compile + attr_accessor :content + + def detect_magic_comment(s, enc = nil) + re = @percent ? /\G(?:<%#(.*)%>|%#(.*)\n)/ : /\G<%#(.*)%>/ + frozen = nil + s.scan(re) do + comment = $+ + comment = $1 if comment[/-\*-\s*([^\s].*?)\s*-\*-$/] + case comment + when %r"coding\s*[=:]\s*([[:alnum:]\-_]+)" + enc = Encoding.find($1.sub(/-(?:mac|dos|unix)/i, '')) + when %r"frozen[-_]string[-_]literal\s*:\s*([[:alnum:]]+)" + frozen = $1 + end + end + return enc, frozen + end + + # :stopdoc: + WARNING_UPLEVEL = Class.new { + attr_reader :c + def initialize from + @c = caller.length - from.length + end + }.new(caller(0)).c + private_constant :WARNING_UPLEVEL + # :startdoc: + + def warn_invalid_trim_mode(mode, uplevel:) + warn "Invalid ERB trim mode: #{mode.inspect} (trim_mode: nil, 0, 1, 2, or String composed of '%' and/or '-', '>', '<>')", uplevel: uplevel + WARNING_UPLEVEL + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/def_method.rb b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/def_method.rb new file mode 100644 index 0000000..e503b37 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/def_method.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +# ERB::DefMethod +# +# Utility module to define eRuby script as instance method. +# +# === Example +# +# example.rhtml: +# <% for item in @items %> +# <%= item %> +# <% end %> +# +# example.rb: +# require 'erb' +# class MyClass +# extend ERB::DefMethod +# def_erb_method('render()', 'example.rhtml') +# def initialize(items) +# @items = items +# end +# end +# print MyClass.new([10,20,30]).render() +# +# result: +# +# 10 +# +# 20 +# +# 30 +# +module ERB::DefMethod + # define _methodname_ as instance method of current module, using ERB + # object or eRuby file + def def_erb_method(methodname, erb_or_fname) + if erb_or_fname.kind_of? String + fname = erb_or_fname + erb = ERB.new(File.read(fname)) + erb.def_method(self, methodname, fname) + else + erb = erb_or_fname + erb.def_method(self, methodname, erb.filename || '(ERB)') + end + end + module_function :def_erb_method +end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/util.rb b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/util.rb new file mode 100644 index 0000000..42c7a57 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/util.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true + +# Load CGI.escapeHTML and CGI.escapeURIComponent. +# CRuby: +# cgi.gem v0.1.0+ (Ruby 2.7-3.4) and Ruby 3.5+ stdlib have 'cgi/escape' and CGI.escapeHTML. +# cgi.gem v0.3.3+ (Ruby 3.2-3.4) and Ruby 3.5+ stdlib have CGI.escapeURIComponent. +# JRuby: cgi.gem has a Java extension 'cgi/escape'. +# TruffleRuby: lib/truffle/cgi/escape.rb requires 'cgi/util'. +require 'cgi/escape' + +# Load or define ERB::Escape#html_escape. +# We don't build the C extention 'cgi/escape' for JRuby, TruffleRuby, and WASM. +# miniruby (used by CRuby build scripts) also fails to load erb/escape.so. +begin + require 'erb/escape' +rescue LoadError + # ERB::Escape + # + # A subset of ERB::Util. Unlike ERB::Util#html_escape, we expect/hope + # Rails will not monkey-patch ERB::Escape#html_escape. + module ERB::Escape + def html_escape(s) + CGI.escapeHTML(s.to_s) + end + module_function :html_escape + end +end + +# ERB::Util +# +# A utility module for conversion routines, often handy in HTML generation. +module ERB::Util + # + # A utility method for escaping HTML tag characters in _s_. + # + # require "erb" + # include ERB::Util + # + # puts html_escape("is a > 0 & a < 10?") + # + # _Generates_ + # + # is a > 0 & a < 10? + # + include ERB::Escape # html_escape + module_function :html_escape + alias h html_escape + module_function :h + + # + # A utility method for encoding the String _s_ as a URL. + # + # require "erb" + # include ERB::Util + # + # puts url_encode("Programming Ruby: The Pragmatic Programmer's Guide") + # + # _Generates_ + # + # Programming%20Ruby%3A%20%20The%20Pragmatic%20Programmer%27s%20Guide + # + if CGI.respond_to?(:escapeURIComponent) + def url_encode(s) + CGI.escapeURIComponent(s.to_s) + end + else # cgi.gem <= v0.3.2 + def url_encode(s) + s.to_s.b.gsub(/[^a-zA-Z0-9_\-.~]/n) do |m| + sprintf("%%%02X", m.unpack1("C")) + end + end + end + alias u url_encode + module_function :u + module_function :url_encode +end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/version.rb b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/version.rb new file mode 100644 index 0000000..0875dcb --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/version.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true +class ERB + VERSION = '5.0.2' +end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/libexec/erb b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/libexec/erb new file mode 100755 index 0000000..4381671 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/libexec/erb @@ -0,0 +1,164 @@ +#!/usr/bin/env ruby +# Tiny eRuby --- ERB2 +# Copyright (c) 1999-2000,2002 Masatoshi SEKI +# You can redistribute it and/or modify it under the same terms as Ruby. + +require 'erb' + +class ERB + module Main + def ARGV.switch + return nil if self.empty? + arg = self.shift + return nil if arg == '--' + case arg + when /\A-(.)(.*)/ + if $1 == '-' + arg, @maybe_arg = arg.split(/=/, 2) + return arg + end + raise 'unknown switch "-"' if $2[0] == ?- and $1 != 'T' + if $2.size > 0 + self.unshift "-#{$2}" + @maybe_arg = $2 + else + @maybe_arg = nil + end + "-#{$1}" + when /\A(\w+)=/ + arg + else + self.unshift arg + nil + end + end + + def ARGV.req_arg + (@maybe_arg || self.shift || raise('missing argument')).tap { + @maybe_arg = nil + } + end + + def trim_mode_opt(trim_mode, disable_percent) + return trim_mode if disable_percent + case trim_mode + when 0 + return '%' + when 1 + return '%>' + when 2 + return '%<>' + when '-' + return '%-' + end + end + module_function :trim_mode_opt + + def run(factory=ERB) + trim_mode = 0 + disable_percent = false + variables = {} + begin + while switch = ARGV.switch + case switch + when '-x' # ruby source + output = true + when '-n' # line number + number = true + when '-v' # verbose + $VERBOSE = true + when '--version' # version + STDERR.puts factory.version + exit + when '-d', '--debug' # debug + $DEBUG = true + when '-r' # require + require ARGV.req_arg + when '-T' # trim mode + arg = ARGV.req_arg + if arg == '-' + trim_mode = arg + next + end + raise "invalid trim mode #{arg.dump}" unless arg =~ /\A[0-2]\z/ + trim_mode = arg.to_i + when '-E', '--encoding' + arg = ARGV.req_arg + set_encoding(*arg.split(/:/, 2)) + when '-U' + set_encoding(Encoding::UTF_8, Encoding::UTF_8) + when '-P' + disable_percent = true + when '--help' + raise "print this help" + when /\A-/ + raise "unknown switch #{switch.dump}" + else + var, val = *switch.split('=', 2) + (variables ||= {})[var] = val + end + end + rescue # usage + STDERR.puts $!.to_s + STDERR.puts File.basename($0) + + " [switches] [var=value...] [inputfile]" + STDERR.puts <= v10.12.2 + ([@jcmfernandes]) + +## 2.5.5 (2021-02-05) + +* [#256](https://github.com/socketry/nio4r/pull/256) + Use libev 4.33, featuring experimental `io_uring` support. + ([@jcmfernandes]) + +* [#260](https://github.com/socketry/nio4r/pull/260) + Workaround for ARM-based macOS Ruby: Use pure Ruby for M1, since the native extension is crashing on M1 (arm64). + ([@jasl]) + +* [#252](https://github.com/socketry/nio4r/pull/252) + JRuby: Fix javac -Xlint warnings + ([@headius]) + +## 2.5.4 (2020-09-16) + +* [#251](https://github.com/socketry/nio4r/issues/251) + Intermittent SEGV during GC. + ([@boazsegev]) + +## 2.5.3 (2020-09-07) + +* [#241](https://github.com/socketry/nio4r/issues/241) + Possible bug with Ruby >= 2.7.0 and `GC.compact`. + ([@boazsegev]) + +## 2.5.2 (2019-09-24) + +* [#220](https://github.com/socketry/nio4r/issues/220) + Update to libev-4.27 & fix assorted warnings. + ([@ioquatix]) + +* [#225](https://github.com/socketry/nio4r/issues/225) + Avoid need for linux headers. + ([@ioquatix]) + +## 2.4.0 (2019-07-07) + +* [#211](https://github.com/socketry/nio4r/pull/211) + Enable KQUEUE on macOS 10.14+. + ([@ioquatix]) + +* Bump minimum supported Ruby to 2.3. + ([@ioquatix]) + +* Assorted fixes for TruffleRuby & JRuby. + ([@eregon], [@olleolleolle]) +Possible bug with Ruby >= 2.7.0 and `GC.compact` +* Update libev to v4.25. + ([@ioquatix]) + +* Bind to ephemeral (port 0) for more reliable specs. + ([@ioquatix]) + +* Improve handling of SSL sockets and related specs. + ([@MSP-Greg]) + +## 2.3.1 (2018-05-03) + +* [#188](https://github.com/socketry/nio4r/pull/188) + Fix remove interests + ([@ioquatix]) + +## 2.3.0 (2018-03-15) + +* [#183](https://github.com/socketry/nio4r/pull/183) + Allow `Monitor#interests` to be nil + ([@ioquatix]) + +## 2.2.0 (2017-12-27) + +* [#151](https://github.com/socketry/nio4r/pull/151) + `NIO::Selector`: Support for enumerating and configuring backend + ([@tarcieri]) + +* [#153](https://github.com/socketry/nio4r/pull/153) + Fix builds on Windows + ([@unak]) + +* [#157](https://github.com/socketry/nio4r/pull/157) + Windows / MinGW test failure - fix spec_helper.rb + ([@MSP-Greg]) + +* [#162](https://github.com/socketry/nio4r/pull/162) + Don't build the C extension on Windows + ([@larskanis]) + +* [#164](https://github.com/socketry/nio4r/pull/164) + Fix NIO::ByteBuffer leak + ([@HoneyryderChuck]) + +* [#170](https://github.com/socketry/nio4r/pull/170) + Avoid CancelledKeyExceptions on JRuby + ([@HoneyryderChuck]) + +* [#177](https://github.com/socketry/nio4r/pull/177) + Fix `NIO::ByteBuffer` string conversions on JRuby + ([@tarcieri]) + +* [#179](https://github.com/socketry/nio4r/pull/179) + Fix argument error when running on ruby 2.5.0 + ([@tompng]) + +* [#180](https://github.com/socketry/nio4r/pull/180) + ext/nio4r/extconf.rb: check for port_event_t in port.h (fixes #178) + ([@tarcieri]) + +## 2.1.0 (2017-05-28) + +* [#130](https://github.com/socketry/nio4r/pull/130) + Add -fno-strict-aliasing flag when compiling C ext. + ([@junaruga]) + +* [#146](https://github.com/socketry/nio4r/pull/146) + Use non-blocking select when a timeout of 0 is given. + ([@tarcieri]) + +* [#147](https://github.com/socketry/nio4r/pull/147) + Update to libev 4.24. + ([@tarcieri]) + +* [#148](https://github.com/socketry/nio4r/pull/148) + Switch to the libev 4 API internally. + ([@tarcieri]) + +## 2.0.0 (2016-12-28) + +* [#53](https://github.com/socketry/nio4r/pull/53) + Limit lock scope to prevent recursive locking. + ([@johnnyt]) + +* [#95](https://github.com/socketry/nio4r/pull/95) + NIO::ByteBuffer Google Summer of Code project. + ([@UpeksheJay], [@tarcieri]) + +* [#111](https://github.com/socketry/nio4r/pull/111) + NIO::Selector#backend introspection support. + ([@tarcieri]) + +* [#112](https://github.com/socketry/nio4r/pull/112) + Upgrade to libev 4.23. + ([@tarcieri]) + +* [#119](https://github.com/socketry/nio4r/pull/119) + Disambiguate wakeup vs timeout (fixes #63, #66). + ([@tarcieri]) + +* [#124](https://github.com/socketry/nio4r/pull/124) + Monitor interests API improvements. + ([@tarcieri]) + +* Drop Ruby 2.0 and 2.1 support, require Ruby 2.2.2+. + ([@tarcieri]) + +## 1.2.1 (2016-01-31) + +* Fix bug in the JRuby backend which cases indefinite blocking when small + timeout values are passed to the selector + +## 1.2.0 (2015-12-22) + +* Add NIO::Monitor#interests= API for changing interests. Contributed by + Upekshe Jayasekera as a Google Summer of Code project. +* Update to libev 4.22 + +## 1.1.1 (2015-07-17) + +* Update to libev 4.20 +* Fall back to io.h if unistd.h is not found +* RSpec updates +* RuboCop + +## 1.1.0 (2015-01-10) + +* Update to libev 4.19 +* Do not call ev_io_stop on monitors if the loop is already closed + +## 1.0.1 (2014-09-01) + +* Fix C compiler warnings +* Eliminate Ruby warnings about @lock_holder +* Windows improvements +* Better support for Ruby 2.1 +* Automatically require 'set' +* Update to RSpec 3 + +## 1.0.0 (2014-01-14) + +* Have Selector#register obtain the actual IO from a Monitor object + because Monitor#initialize might convert it. +* Drop 1.8 support + +## 0.5.0 (2013-08-06) + +* Fix segv when attempting to register to a closed selector +* Fix Windows support on Ruby 2.0.0 +* Upgrade to libev 4.15 + +## 0.4.6 (2013-05-27) + +* Fix for JRuby on Windows + +## 0.4.5 + +* Fix botched gem release + +## 0.4.4 + +* Fix return values for Selector_synchronize and Selector_unlock + +## 0.4.3 + +* REALLY have thread synchronization when closing selectors ;) + +## 0.4.2 + +* Attempt to work around packaging problems with bundler-api o_O + +## 0.4.1 + +* Thread synchronization when closing selectors + +## 0.4.0 + +* OpenSSL::SSL::SSLSocket support + +## 0.3.3 + +* NIO::Selector#select_each removed +* Remove event buffer +* Patch GIL unlock directly into libev +* Re-release since 0.3.2 was botched :( + +## 0.3.1 + +* Prevent CancelledKeyExceptions on JRuby + +## 0.3.0 + +* NIO::Selector#select now takes a block and behaves like select_each +* NIO::Selector#select_each is now deprecated and will be removed +* Closing monitors detaches them from their selector +* Java extension for JRuby +* Upgrade to libev 4.11 +* Bugfixes for zero/negative select timeouts +* Handle OP_CONNECT properly on JRuby + +## 0.2.2 + +* Raise IOError if asked to wake up a closed selector + +## 0.2.1 + +* Implement wakeup mechanism using raw pipes instead of ev_async, since + ev_async likes to cause segvs when used across threads (despite claims + in the documentation to the contrary) + +## 0.2.0 + +* NIO::Monitor#readiness API to query readiness, along with #readable? and + #writable? helper methods +* NIO::Selector#select_each API which avoids memory allocations if possible +* Bugfixes for the JRuby implementation + +## 0.1.0 + +* Initial release. Merry Christmas! + +[@tarcieri]: https://github.com/tarcieri +[@johnnyt]: https://github.com/johnnyt +[@UpeksheJay]: https://github.com/UpeksheJay +[@junaruga]: https://github.com/junaruga +[@unak]: https://github.com/unak +[@MSP-Greg]: https://github.com/MSP-Greg +[@larskanis]: https://github.com/larskanis +[@HoneyryderChuck]: https://github.com/HoneyryderChuck +[@tompng]: https://github.com/tompng +[@ioquatix]: https://github.com/ioquatix +[@eregon]: https://github.com/eregon +[@olleolleolle]: https://github.com/olleolleolle +[@boazsegev]: https://github.com/boazsegev +[@headius]: https://github.com/headius +[@jasl]: https://github.com/jasl +[@jcmfernandes]: https://github.com/jcmfernandes diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/Changes b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/Changes new file mode 100644 index 0000000..d200b9e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/Changes @@ -0,0 +1,617 @@ +Revision history for libev, a high-performance and full-featured event loop. + +TODO: for next ABI/API change, consider moving EV__IOFDSSET into io->fd instead and provide a getter. +TODO: document EV_TSTAMP_T + +4.33 Wed Mar 18 13:22:29 CET 2020 + - no changes w.r.t. 4.32. + +4.32 (EV only) + - the 4.31 timerfd code wrongly changed the priority of the signal + fd watcher, which is usually harmless unless signal fds are + also used (found via cpan tester service). + - the documentation wrongly claimed that user may modify fd and events + members in io watchers when the watcher was stopped + (found by b_jonas). + - new ev_io_modify mutator which changes only the events member, + which can be faster. also added ev::io::set (int events) method + to ev++.h. + - officially allow a zero events mask for io watchers. this should + work with older libev versions as well but was not officially + allowed before. + - do not wake up every minute when timerfd is used to detect timejumps. + - do not wake up every minute when periodics are disabled and we have + a monotonic clock. + - support a lot more "uncommon" compile time configurations, + such as ev_embed enabled but ev_timer disabled. + - use a start/stop wrapper class to reduce code duplication in + ev++.h and make it needlessly more c++-y. + - the linux aio backend is no longer compiled in by default. + - update to libecb version 0x00010008. + +4.31 Fri Dec 20 21:58:29 CET 2019 + - handle backends with minimum wait time a bit better by not + waiting in the presence of already-expired timers + (behaviour reported by Felipe Gasper). + - new feature: use timerfd to detect timejumps quickly, + can be disabled with the new EVFLAG_NOTIMERFD loop flag. + - document EV_USE_SIGNALFD feature macro. + +4.30 (EV only) + - change non-autoconf test for __kernel_rwf_t by testing + LINUX_VERSION_CODE, the most direct test I could find. + - fix a bug in the io_uring backend that polled the wrong + backend fd, causing it to not work in many cases. + +4.29 (EV only) + - add io uring autoconf and non-autoconf detection. + - disable io_uring when some header files are too old. + +4.28 (EV only) + - linuxaio backend resulted in random memory corruption + when loop is forked. + - linuxaio backend might have tried to cancel an iocb + multiple times (was unable to trigger this). + - linuxaio backend now employs a generation counter to + avoid handling spurious events from cancelled requests. + - io_cancel can return EINTR, deal with it. also, assume + io_submit also returns EINTR. + - fix some other minor bugs in linuxaio backend. + - ev_tstamp type can now be overriden by defining EV_TSTAMP_T. + - cleanup: replace expect_true/false and noinline by their + libecb counterparts. + - move syscall infrastructure from ev_linuxaio.c to ev.c. + - prepare io_uring integration. + - tweak ev_floor. + - epoll, poll, win32 Sleep and other places that use millisecond + reslution now all try to round up times. + - solaris port backend didn't compile. + - abstract time constants into their macros, for more flexibility. + +4.27 Thu Jun 27 22:43:44 CEST 2019 + - linux aio backend almost completely rewritten to work around its + limitations. + - linux aio backend now requires linux 4.19+. + - epoll backend now mandatory for linux aio backend. + - fail assertions more aggressively on invalid fd's detected + in the event loop, do not just silently fd_kill in case of + user error. + - ev_io_start/ev_io_stop now verify the watcher fd using + a syscall when EV_VERIFY is 2 or higher. + +4.26 (EV only) + - update to libecb 0x00010006. + - new experimental linux aio backend (linux 4.18+). + - removed redundant 0-ptr check in ev_once. + - updated/extended ev_set_allocator documentation. + - replaced EMPTY2 macro by array_needsize_noinit. + - minor code cleanups. + - epoll backend now uses epoll_create1 also after fork. + +4.25 Fri Dec 21 07:49:20 CET 2018 + - INCOMPATIBLE CHANGE: EV_THROW was renamed to EV_NOEXCEPT + (EV_THROW still provided) and now uses noexcept on C++11 or newer. + - move the darwin select workaround higher in ev.c, as newer versions of + darwin managed to break their broken select even more. + - ANDROID => __ANDROID__ (reported by enh@google.com). + - disable epoll_create1 on android because it has broken header files + and google is unwilling to fix them (reported by enh@google.com). + - avoid a minor compilation warning on win32. + - c++: remove deprecated dynamic throw() specifications. + - c++: improve the (unsupported) bad_loop exception class. + - backport perl ev_periodic example to C, untested. + - update libecb, biggets change is to include a memory fence + in ECB_MEMORY_FENCE_RELEASE on x86/amd64. + - minor autoconf/automake modernisation. + +4.24 Wed Dec 28 05:19:55 CET 2016 + - bump version to 4.24, as the release tarball inexplicably + didn't have the right version in ev.h, even though the cvs-tagged + version did have the right one (reported by Ales Teska). + +4.23 Wed Nov 16 18:23:41 CET 2016 + - move some declarations at the beginning to help certain retarded + microsoft compilers, even though their documentation claims + otherwise (reported by Ruslan Osmanov). + +4.22 Sun Dec 20 22:11:50 CET 2015 + - when epoll detects unremovable fds in the fd set, rebuild + only the epoll descriptor, not the signal pipe, to avoid + SIGPIPE in ev_async_send. This doesn't solve it on fork, + so document what needs to be done in ev_loop_fork + (analyzed by Benjamin Mahler). + - remove superfluous sys/timeb.h include on win32 + (analyzed by Jason Madden). + - updated libecb. + +4.20 Sat Jun 20 13:01:43 CEST 2015 + - prefer noexcept over throw () with C++ 11. + - update ecb.h due to incompatibilities with c11. + - fix a potential aliasing issue when reading and writing + watcher callbacks. + +4.19 Thu Sep 25 08:18:25 CEST 2014 + - ev.h wasn't valid C++ anymore, which tripped compilers other than + clang, msvc or gcc (analyzed by Raphael 'kena' Poss). Unfortunately, + C++ doesn't support typedefs for function pointers fully, so the affected + declarations have to spell out the types each time. + - when not using autoconf, tighten the check for clock_gettime and related + functionality. + +4.18 Fri Sep 5 17:55:26 CEST 2014 + - events on files were not always generated properly with the + epoll backend (testcase by Assaf Inbal). + - mark event pipe fd as cloexec after a fork (analyzed by Sami Farin). + - (ecb) support m68k, m88k and sh (patch by Miod Vallat). + - use a reasonable fallback for EV_NSIG instead of erroring out + when we can't detect the signal set size. + - in the absence of autoconf, do not use the clock syscall + on glibc >= 2.17 (avoids the syscall AND -lrt on systems + doing clock_gettime in userspace). + - ensure extern "C" function pointers are used for externally-visible + loop callbacks (not watcher callbacks yet). + - (ecb) work around memory barriers and volatile apparently both being + broken in visual studio 2008 and later (analysed and patch by Nicolas Noble). + +4.15 Fri Mar 1 12:04:50 CET 2013 + - destroying a non-default loop would stop the global waitpid + watcher (Denis Bilenko). + - queueing pending watchers of higher priority from a watcher now invokes + them in a timely fashion (reported by Denis Bilenko). + - add throw() to all libev functions that cannot throw exceptions, for + further code size decrease when compiling for C++. + - add throw () to callbacks that must not throw exceptions (allocator, + syserr, loop acquire/release, periodic reschedule cbs). + - fix event_base_loop return code, add event_get_callback, event_base_new, + event_base_get_method calls to improve libevent 1.x emulation and add + some libevent 2.x functionality (based on a patch by Jeff Davey). + - add more memory fences to fix a bug reported by Jeff Davey. Better + be overfenced than underprotected. + - ev_run now returns a boolean status (true meaning watchers are + still active). + - ev_once: undef EV_ERROR in ev_kqueue.c, to avoid clashing with + libev's EV_ERROR (reported by 191919). + - (ecb) add memory fence support for xlC (Darin McBride). + - (ecb) add memory fence support for gcc-mips (Anton Kirilov). + - (ecb) add memory fence support for gcc-alpha (Christian Weisgerber). + - work around some kernels losing file descriptors by leaking + the kqueue descriptor in the child. + - work around linux inotify not reporting IN_ATTRIB changes for directories + in many cases. + - include sys/syscall.h instead of plain syscall.h. + - check for io watcher loops in ev_verify, check for the most + common reported usage bug in ev_io_start. + - choose socket vs. WSASocket at compiletime using EV_USE_WSASOCKET. + - always use WSASend/WSARecv directly on windows, hoping that this + works in all cases (unlike read/write/send/recv...). + - try to detect signals around a fork faster (test program by + Denis Bilenko). + - work around recent glibc versions that leak memory in realloc. + - rename ev::embed::set to ev::embed::set_embed to avoid clashing + the watcher base set (loop) method. + - rewrite the async/signal pipe logic to always keep a valid fd, which + simplifies (and hopefully correctifies :) the race checking + on fork, at the cost of one extra fd. + - add fat, msdos, jffs2, ramfs, ntfs and btrfs to the list of + inotify-supporting filesystems. + - move orig_CFLAGS assignment to after AC_INIT, as newer autoconf + versions ignore it before + (https://bugzilla.redhat.com/show_bug.cgi?id=908096). + - add some untested android support. + - enum expressions must be of type int (reported by Juan Pablo L). + +4.11 Sat Feb 4 19:52:39 CET 2012 + - INCOMPATIBLE CHANGE: ev_timer_again now clears the pending status, as + was documented already, but not implemented in the repeating case. + - new compiletime symbols: EV_NO_SMP and EV_NO_THREADS. + - fix a race where the workaround against the epoll fork bugs + caused signals to not be handled anymore. + - correct backend_fudge for most backends, and implement a windows + specific workaround to avoid looping because we call both + select and Sleep, both with different time resolutions. + - document range and guarantees of ev_sleep. + - document reasonable ranges for periodics interval and offset. + - rename backend_fudge to backend_mintime to avoid future confusion :) + - change the default periodic reschedule function to hopefully be more + exact and correct even in corner cases or in the far future. + - do not rely on -lm anymore: use it when available but use our + own floor () if it is missing. This should make it easier to embed, + as no external libraries are required. + - strategically import macros from libecb and mark rarely-used functions + as cache-cold (saving almost 2k code size on typical amd64 setups). + - add Symbols.ev and Symbols.event files, that were missing. + - fix backend_mintime value for epoll (was 1/1024, is 1/1000 now). + - fix #3 "be smart about timeouts" to not "deadlock" when + timeout == now, also improve the section overall. + - avoid "AVOIDING FINISHING BEFORE RETURNING" idiom. + - support new EV_API_STATIC mode to make all libev symbols + static. + - supply default CFLAGS of -g -O3 with gcc when original CFLAGS + were empty. + +4.04 Wed Feb 16 09:01:51 CET 2011 + - fix two problems in the native win32 backend, where reuse of fd's + with different underlying handles caused handles not to be removed + or added to the select set (analyzed and tested by Bert Belder). + - do no rely on ceil() in ev_e?poll.c. + - backport libev to HP-UX versions before 11 v3. + - configure did not detect nanosleep and clock_gettime properly when + they are available in the libc (as opposed to -lrt). + +4.03 Tue Jan 11 14:37:25 CET 2011 + - officially support polling files with all backends. + - support files, /dev/zero etc. the same way as select in the epoll + backend, by generating events on our own. + - ports backend: work around solaris bug 6874410 and many related ones + (EINTR, maybe more), with no performance loss (note that the solaris + bug report is actually wrong, reality is far more bizarre and broken + than that). + - define EV_READ/EV_WRITE as macros in event.h, as some programs use + #ifdef to test for them. + - new (experimental) function: ev_feed_signal. + - new (to become default) EVFLAG_NOSIGMASK flag. + - new EVBACKEND_MASK symbol. + - updated COMMON IDIOMS SECTION. + +4.01 Fri Nov 5 21:51:29 CET 2010 + - automake fucked it up, apparently, --add-missing -f is not quite enough + to make it update its files, so 4.00 didn't install ev++.h and + event.h on make install. grrr. + - ev_loop(count|depth) didn't return anything (Robin Haberkorn). + - change EV_UNDEF to 0xffffffff to silence some overzealous compilers. + - use "(libev) " prefix for all libev error messages now. + +4.00 Mon Oct 25 12:32:12 CEST 2010 + - "PORTING FROM LIBEV 3.X TO 4.X" (in ev.pod) is recommended reading. + - ev_embed_stop did not correctly stop the watcher (very good + testcase by Vladimir Timofeev). + - ev_run will now always update the current loop time - it erroneously + didn't when idle watchers were active, causing timers not to fire. + - fix a bug where a timeout of zero caused the timer not to fire + in the libevent emulation (testcase by Péter Szabó). + - applied win32 fixes by Michael Lenaghan (also James Mansion). + - replace EV_MINIMAL by EV_FEATURES. + - prefer EPOLL_CTL_ADD over EPOLL_CTL_MOD in some more cases, as it + seems the former is *much* faster than the latter. + - linux kernel version detection (for inotify bug workarounds) + did not work properly. + - reduce the number of spurious wake-ups with the ports backend. + - remove dependency on sys/queue.h on freebsd (patch by Vanilla Hsu). + - do async init within ev_async_start, not ev_async_set, which avoids + an API quirk where the set function must be called in the C++ API + even when there is nothing to set. + - add (undocumented) EV_ENABLE when adding events with kqueue, + this might help with OS X, which seems to need it despite documenting + not to need it (helpfully pointed out by Tilghman Lesher). + - do not use poll by default on freebsd, it's broken (what isn't + on freebsd...). + - allow to embed epoll on kernels >= 2.6.32. + - configure now prepends -O3, not appends it, so one can still + override it. + - ev.pod: greatly expanded the portability section, added a porting + section, a description of watcher states and made lots of minor fixes. + - disable poll backend on AIX, the poll header spams the namespace + and it's not worth working around dead platforms (reported + and analyzed by Aivars Kalvans). + - improve header file compatibility of the standalone eventfd code + in an obscure case. + - implement EV_AVOID_STDIO option. + - do not use sscanf to parse linux version number (smaller, faster, + no sscanf dependency). + - new EV_CHILD_ENABLE and EV_SIGNAL_ENABLE configurable settings. + - update libev.m4 HAVE_CLOCK_SYSCALL test for newer glibcs. + - add section on accept() problems to the manpage. + - rename EV_TIMEOUT to EV_TIMER. + - rename ev_loop_count/depth/verify/loop/unloop. + - remove ev_default_destroy and ev_default_fork. + - switch to two-digit minor version. + - work around an apparent gentoo compiler bug. + - define _DARWIN_UNLIMITED_SELECT. just so. + - use enum instead of #define for most constants. + - improve compatibility to older C++ compilers. + - (experimental) ev_run/ev_default_loop/ev_break/ev_loop_new have now + default arguments when compiled as C++. + - enable automake dependency tracking. + - ev_loop_new no longer leaks memory when loop creation failed. + - new ev_cleanup watcher type. + +3.9 Thu Dec 31 07:59:59 CET 2009 + - signalfd is no longer used by default and has to be requested + explicitly - this means that easy to catch bugs become hard to + catch race conditions, but the users have spoken. + - point out the unspecified signal mask in the documentation, and + that this is a race condition regardless of EV_SIGNALFD. + - backport inotify code to C89. + - inotify file descriptors could leak into child processes. + - ev_stat watchers could keep an erroneous extra ref on the loop, + preventing exit when unregistering all watchers (testcases + provided by ry@tinyclouds.org). + - implement EV_WIN32_HANDLE_TO_FD and EV_WIN32_CLOSE_FD configuration + symbols to make it easier for apps to do their own fd management. + - support EV_IDLE_ENABLE being disabled in ev++.h + (patch by Didier Spezia). + - take advantage of inotify_init1, if available, to set cloexec/nonblock + on fd creation, to avoid races. + - the signal handling pipe wasn't always initialised under windows + (analysed by lekma). + - changed minimum glibc requirement from glibc 2.9 to 2.7, for + signalfd. + - add missing string.h include (Denis F. Latypoff). + - only replace ev_stat.prev when we detect an actual difference, + so prev is (almost) always different to attr. this might + have caused the problems with 04_stat.t. + - add ev::timer->remaining () method to C++ API. + +3.8 Sun Aug 9 14:30:45 CEST 2009 + - incompatible change: do not necessarily reset signal handler + to SIG_DFL when a sighandler is stopped. + - ev_default_destroy did not properly free or zero some members, + potentially causing crashes and memory corruption on repeated + ev_default_destroy/ev_default_loop calls. + - take advantage of signalfd on GNU/Linux systems. + - document that the signal mask might be in an unspecified + state when using libev's signal handling. + - take advantage of some GNU/Linux calls to set cloexec/nonblock + on fd creation, to avoid race conditions. + +3.7 Fri Jul 17 16:36:32 CEST 2009 + - ev_unloop and ev_loop wrongly used a global variable to exit loops, + instead of using a per-loop variable (bug caught by accident...). + - the ev_set_io_collect_interval interpretation has changed. + - add new functionality: ev_set_userdata, ev_userdata, + ev_set_invoke_pending_cb, ev_set_loop_release_cb, + ev_invoke_pending, ev_pending_count, together with a long example + about thread locking. + - add ev_timer_remaining (as requested by Denis F. Latypoff). + - add ev_loop_depth. + - calling ev_unloop in fork/prepare watchers will no longer poll + for new events. + - Denis F. Latypoff corrected many typos in example code snippets. + - honor autoconf detection of EV_USE_CLOCK_SYSCALL, also double- + check that the syscall number is available before trying to + use it (reported by ry@tinyclouds). + - use GetSystemTimeAsFileTime instead of _timeb on windows, for + slightly higher accuracy. + - properly declare ev_loop_verify and ev_now_update even when + !EV_MULTIPLICITY. + - do not compile in any priority code when EV_MAXPRI == EV_MINPRI. + - support EV_MINIMAL==2 for a reduced API. + - actually 0-initialise struct sigaction when installing signals. + - add section on hibernate and stopped processes to ev_timer docs. + +3.6 Tue Apr 28 02:49:30 CEST 2009 + - multiple timers becoming ready within an event loop iteration + will be invoked in the "correct" order now. + - do not leave the event loop early just because we have no active + watchers, fixing a problem when embedding a kqueue loop + that has active kernel events but no registered watchers + (reported by blacksand blacksand). + - correctly zero the idx values for arrays, so destroying and + reinitialising the default loop actually works (patch by + Malek Hadj-Ali). + - implement ev_suspend and ev_resume. + - new EV_CUSTOM revents flag for use by applications. + - add documentation section about priorities. + - add a glossary to the documentation. + - extend the ev_fork description slightly. + - optimize a jump out of call_pending. + +3.53 Sun Feb 15 02:38:20 CET 2009 + - fix a bug in event pipe creation on win32 that would cause a + failed assertion on event loop creation (patch by Malek Hadj-Ali). + - probe for CLOCK_REALTIME support at runtime as well and fall + back to gettimeofday if there is an error, to support older + operating systems with newer header files/libraries. + - prefer gettimeofday over clock_gettime with USE_CLOCK_SYSCALL + (default most everywhere), otherwise not. + +3.52 Wed Jan 7 21:43:02 CET 2009 + - fix compilation of select backend in fd_set mode when NFDBITS is + missing (to get it to compile on QNX, reported by Rodrigo Campos). + - better select-nfds handling when select backend is in fd_set mode. + - diagnose fd_set overruns when select backend is in fd_set mode. + - due to a thinko, instead of disabling everything but + select on the borked OS X platform, everything but select was + allowed (reported by Emanuele Giaquinta). + - actually verify that local and remote port are matching in + libev's socketpair emulation, which makes denial-of-service + attacks harder (but not impossible - it's windows). Make sure + it even works under vista, which thinks that getpeer/sockname + should return fantasy port numbers. + - include "libev" in all assertion messages for potentially + clearer diagnostics. + - event_get_version (libevent compatibility) returned + a useless string instead of the expected version string + (patch by W.C.A. Wijngaards). + +3.51 Wed Dec 24 23:00:11 CET 2008 + - fix a bug where an inotify watcher was added twice, causing + freezes on hash collisions (reported and analysed by Graham Leggett). + - new config symbol, EV_USE_CLOCK_SYSCALL, to make libev use + a direct syscall - slower, but no dependency on librt et al. + - assume negative return values != -1 signals success of port_getn + (http://cvs.epicsol.org/cgi/viewcvs.cgi/epic5/source/newio.c?rev=1.52) + (no known failure reports, but it doesn't hurt). + - fork detection in ev_embed now stops and restarts the watcher + automatically. + - EXPERIMENTAL: default the method to operator () in ev++.h, + to make it nicer to use functors (requested by Benedek László). + - fixed const object callbacks in ev++.h. + - replaced loop_ref argument of watcher.set (loop) by a direct + ev_loop * in ev++.h, to avoid clashes with functor patch. + - do not try to watch the empty string via inotify. + - inotify watchers could be leaked under certain circumstances. + - OS X 10.5 is actually even more broken than earlier versions, + so fall back to select on that piece of garbage. + - fixed some weirdness in the ev_embed documentation. + +3.49 Wed Nov 19 11:26:53 CET 2008 + - ev_stat watchers will now use inotify as a mere hint on + kernels <2.6.25, or if the filesystem is not in the + "known to be good" list. + - better mingw32 compatibility (it's not as borked as native win32) + (analysed by Roger Pack). + - include stdio.h in the example program, as too many people are + confused by the weird C language otherwise. I guess the next thing + I get told is that the "..." ellipses in the examples don't compile + with their C compiler. + +3.48 Thu Oct 30 09:02:37 CET 2008 + - further optimise away the EPOLL_CTL_ADD/MOD combo in the epoll + backend by assuming the kernel event mask hasn't changed if + ADD fails with EEXIST. + - work around spurious event notification bugs in epoll by using + a 32-bit generation counter. recreate kernel state if we receive + spurious notifications or unwanted events. this is very costly, + but I didn't come up with this horrible design. + - use memset to initialise most arrays now and do away with the + init functions. + - expand time-out strategies into a "Be smart about timeouts" section. + - drop the "struct" from all ev_watcher declarations in the + documentation and did other clarifications (yeah, it was a mistake + to have a struct AND a function called ev_loop). + - fix a bug where ev_default would not initialise the default + loop again after it was destroyed with ev_default_destroy. + - rename syserr to ev_syserr to avoid name clashes when embedding, + do similar changes for event.c. + +3.45 Tue Oct 21 21:59:26 CEST 2008 + - disable inotify usage on linux <2.6.25, as it is broken + (reported by Yoann Vandoorselaere). + - ev_stat erroneously would try to add inotify watchers + even when inotify wasn't available (this should only + have a performance impact). + - ev_once now passes both timeout and io to the callback if both + occur concurrently, instead of giving timeouts precedence. + - disable EV_USE_INOTIFY when sys/inotify.h is too old. + +3.44 Mon Sep 29 05:18:39 CEST 2008 + - embed watchers now automatically invoke ev_loop_fork on the + embedded loop when the parent loop forks. + - new function: ev_now_update (loop). + - verify_watcher was not marked static. + - improve the "associating..." manpage section. + - documentation tweaks here and there. + +3.43 Sun Jul 6 05:34:41 CEST 2008 + - include more include files on windows to get struct _stati64 + (reported by Chris Hulbert, but doesn't quite fix his issue). + - add missing #include in ev.c on windows (reported by + Matt Tolton). + +3.42 Tue Jun 17 12:12:07 CEST 2008 + - work around yet another windows bug: FD_SET actually adds fd's + multiple times to the fd_*SET*, despite official MSN docs claiming + otherwise. Reported and well-analysed by Matt Tolton. + - define NFDBITS to 0 when EV_SELECT_IS_WINSOCKET to make it compile + (reported any analysed by Chris Hulbert). + - fix a bug in ev_ebadf (this function is only used to catch + programming errors in the libev user). reported by Matt Tolton. + - fix a bug in fd_intern on win32 (could lead to compile errors + under some circumstances, but would work correctly if it compiles). + reported by Matt Tolton. + - (try to) work around missing lstat on windows. + - pass in the write fd set as except fd set under windows. windows + is so uncontrollably lame that it requires this. this means that + switching off oobinline is not supported (but tcp/ip doesn't + have oob, so that would be stupid anyways. + - use posix module symbol to auto-detect monotonic clock presence + and some other default values. + +3.41 Fri May 23 18:42:54 CEST 2008 + - work around an obscure bug in winsocket select: if you + provide only empty fd sets then select returns WSAEINVAL. how sucky. + - improve timer scheduling stability and reduce use of time_epsilon. + - use 1-based 2-heap for EV_MINIMAL, simplifies code, reduces + codesize and makes for better cache-efficiency. + - use 3-based 4-heap for !EV_MINIMAL. this makes better use + of cpu cache lines and gives better growth behaviour than + 2-based heaps. + - cache timestamp within heap for !EV_MINIMAL, to avoid random + memory accesses. + - document/add EV_USE_4HEAP and EV_HEAP_CACHE_AT. + - fix a potential aliasing issue in ev_timer_again. + - add/document ev_periodic_at, retract direct access to ->at. + - improve ev_stat docs. + - add portability requirements section. + - fix manpage headers etc. + - normalise WSA error codes to lower range on windows. + - add consistency check code that can be called automatically + or on demand to check for internal structures (ev_loop_verify). + +3.31 Wed Apr 16 20:45:04 CEST 2008 + - added last minute fix for ev_poll.c by Brandon Black. + +3.3 Wed Apr 16 19:04:10 CEST 2008 + - event_base_loopexit should return 0 on success + (W.C.A. Wijngaards). + - added linux eventfd support. + - try to autodetect epoll and inotify support + by libc header version if not using autoconf. + - new symbols: EV_DEFAULT_UC and EV_DEFAULT_UC_. + - declare functions defined in ev.h as inline if + C99 or gcc are available. + - enable inlining with gcc versions 2 and 3. + - work around broken poll implementations potentially + not clearing revents field in ev_poll (Brandon Black) + (no such systems are known at this time). + - work around a bug in realloc on openbsd and darwin, + also makes the erroneous valgrind complaints + go away (noted by various people). + - fix ev_async_pending, add c++ wrapper for ev_async + (based on patch sent by Johannes Deisenhofer). + - add sensible set method to ev::embed. + - made integer constants type int in ev.h. + +3.2 Wed Apr 2 17:11:19 CEST 2008 + - fix a 64 bit overflow issue in the select backend, + by using fd_mask instead of int for the mask. + - rename internal sighandler to avoid clash with very old perls. + - entering ev_loop will not clear the ONESHOT or NONBLOCKING + flags of any outer loops anymore. + - add ev_async_pending. + +3.1 Thu Mar 13 13:45:22 CET 2008 + - implement ev_async watchers. + - only initialise signal pipe on demand. + - make use of sig_atomic_t configurable. + - improved documentation. + +3.0 Mon Jan 28 13:14:47 CET 2008 + - API/ABI bump to version 3.0. + - ev++.h includes "ev.h" by default now, not . + - slightly improved documentation. + - speed up signal detection after a fork. + - only optionally return trace status changed in ev_child + watchers. + - experimental (and undocumented) loop wrappers for ev++.h. + +2.01 Tue Dec 25 08:04:41 CET 2007 + - separate Changes file. + - fix ev_path_set => ev_stat_set typo. + - remove event_compat.h from the libev tarball. + - change how include files are found. + - doc updates. + - update licenses, explicitly allow for GPL relicensing. + +2.0 Sat Dec 22 17:47:03 CET 2007 + - new ev_sleep, ev_set_(io|timeout)_collect_interval. + - removed epoll from embeddable fd set. + - fix embed watchers. + - renamed ev_embed.loop to other. + - added exported Symbol tables. + - undefine member wrapper macros at the end of ev.c. + - respect EV_H in ev++.h. + +1.86 Tue Dec 18 02:36:57 CET 2007 + - fix memleak on loop destroy (not relevant for perl). + +1.85 Fri Dec 14 20:32:40 CET 2007 + - fix some aliasing issues w.r.t. timers and periodics + (not relevant for perl). + +(for historic versions refer to EV/Changes, found in the Perl interface) + +0.1 Wed Oct 31 21:31:48 CET 2007 + - original version; hacked together in <24h. + diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/LICENSE b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/LICENSE new file mode 100644 index 0000000..2fdabd4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/LICENSE @@ -0,0 +1,37 @@ +All files in libev are +Copyright (c)2007,2008,2009,2010,2011,2012,2013 Marc Alexander Lehmann. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Alternatively, the contents of this package may be used under the terms +of the GNU General Public License ("GPL") version 2 or any later version, +in which case the provisions of the GPL are applicable instead of the +above. If you wish to allow the use of your version of this package only +under the terms of the GPL and not to allow others to use your version of +this file under the BSD license, indicate your decision by deleting the +provisions above and replace them with the notice and other provisions +required by the GPL in this and the other files of this package. If you do +not delete the provisions above, a recipient may use your version of this +file under either the BSD or the GPL. diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/README b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/README new file mode 100644 index 0000000..fca5fdf --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/README @@ -0,0 +1,59 @@ +libev is a high-performance event loop/event model with lots of features. +(see benchmark at http://libev.schmorp.de/bench.html) + + +ABOUT + + Homepage: http://software.schmorp.de/pkg/libev + Mailinglist: libev@lists.schmorp.de + http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev + Library Documentation: http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod + + Libev is modelled (very losely) after libevent and the Event perl + module, but is faster, scales better and is more correct, and also more + featureful. And also smaller. Yay. + + Some of the specialties of libev not commonly found elsewhere are: + + - extensive and detailed, readable documentation (not doxygen garbage). + - fully supports fork, can detect fork in various ways and automatically + re-arms kernel mechanisms that do not support fork. + - highly optimised select, poll, linux epoll, linux aio, bsd kqueue + and solaris event ports backends. + - filesystem object (path) watching (with optional linux inotify support). + - wallclock-based times (using absolute time, cron-like). + - relative timers/timeouts (handle time jumps). + - fast intra-thread communication between multiple + event loops (with optional fast linux eventfd backend). + - extremely easy to embed (fully documented, no dependencies, + autoconf supported but optional). + - very small codebase, no bloated library, simple code. + - fully extensible by being able to plug into the event loop, + integrate other event loops, integrate other event loop users. + - very little memory use (small watchers, small event loop data). + - optional C++ interface allowing method and function callbacks + at no extra memory or runtime overhead. + - optional Perl interface with similar characteristics (capable + of running Glib/Gtk2 on libev). + - support for other languages (multiple C++ interfaces, D, Ruby, + Python) available from third-parties. + + Examples of programs that embed libev: the EV perl module, node.js, + auditd, rxvt-unicode, gvpe (GNU Virtual Private Ethernet), the + Deliantra MMORPG server (http://www.deliantra.net/), Rubinius (a + next-generation Ruby VM), the Ebb web server, the Rev event toolkit. + + +CONTRIBUTORS + + libev was written and designed by Marc Lehmann and Emanuele Giaquinta. + + The following people sent in patches or made other noteworthy + contributions to the design (for minor patches, see the Changes + file. If I forgot to include you, please shout at me, it was an + accident): + + W.C.A. Wijngaards + Christopher Layne + Chris Brody + diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev.c new file mode 100644 index 0000000..fcba49f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev.c @@ -0,0 +1,5689 @@ +/* + * libev event processing core, watcher management + * + * Copyright (c) 2007-2019 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +/* ########## NIO4R PATCHERY HO! ########## */ +#include "ruby.h" +#include "ruby/thread.h" + +#ifdef __APPLE__ +#include +#endif +/* ######################################## */ + +/* this big block deduces configuration from config.h */ +#ifndef EV_STANDALONE +# ifdef EV_CONFIG_H +# include EV_CONFIG_H +# else +# include "config.h" +# endif + +# if HAVE_FLOOR +# ifndef EV_USE_FLOOR +# define EV_USE_FLOOR 1 +# endif +# endif + +# if HAVE_CLOCK_SYSCALL +# ifndef EV_USE_CLOCK_SYSCALL +# define EV_USE_CLOCK_SYSCALL 1 +# ifndef EV_USE_REALTIME +# define EV_USE_REALTIME 0 +# endif +# ifndef EV_USE_MONOTONIC +# define EV_USE_MONOTONIC 1 +# endif +# endif +# elif !defined EV_USE_CLOCK_SYSCALL +# define EV_USE_CLOCK_SYSCALL 0 +# endif + +# if HAVE_CLOCK_GETTIME +# ifndef EV_USE_MONOTONIC +# define EV_USE_MONOTONIC 1 +# endif +# ifndef EV_USE_REALTIME +# define EV_USE_REALTIME 0 +# endif +# else +# ifndef EV_USE_MONOTONIC +# define EV_USE_MONOTONIC 0 +# endif +# ifndef EV_USE_REALTIME +# define EV_USE_REALTIME 0 +# endif +# endif + +# if HAVE_NANOSLEEP +# ifndef EV_USE_NANOSLEEP +# define EV_USE_NANOSLEEP EV_FEATURE_OS +# endif +# else +# undef EV_USE_NANOSLEEP +# define EV_USE_NANOSLEEP 0 +# endif + +# if HAVE_SELECT && HAVE_SYS_SELECT_H +# ifndef EV_USE_SELECT +# define EV_USE_SELECT EV_FEATURE_BACKENDS +# endif +# else +# undef EV_USE_SELECT +# define EV_USE_SELECT 0 +# endif + +# if HAVE_POLL && HAVE_POLL_H +# ifndef EV_USE_POLL +# define EV_USE_POLL EV_FEATURE_BACKENDS +# endif +# else +# undef EV_USE_POLL +# define EV_USE_POLL 0 +# endif + +# if HAVE_EPOLL_CTL && HAVE_SYS_EPOLL_H +# ifndef EV_USE_EPOLL +# define EV_USE_EPOLL EV_FEATURE_BACKENDS +# endif +# else +# undef EV_USE_EPOLL +# define EV_USE_EPOLL 0 +# endif + +# if HAVE_LINUX_AIO_ABI_H +# ifndef EV_USE_LINUXAIO +# define EV_USE_LINUXAIO 0 /* was: EV_FEATURE_BACKENDS, always off by default */ +# endif +# else +# undef EV_USE_LINUXAIO +# define EV_USE_LINUXAIO 0 +# endif + +# if HAVE_LINUX_FS_H && HAVE_SYS_TIMERFD_H && HAVE_KERNEL_RWF_T +# ifndef EV_USE_IOURING +# define EV_USE_IOURING EV_FEATURE_BACKENDS +# endif +# else +# undef EV_USE_IOURING +# define EV_USE_IOURING 0 +# endif + +# if HAVE_KQUEUE && HAVE_SYS_EVENT_H +# ifndef EV_USE_KQUEUE +# define EV_USE_KQUEUE EV_FEATURE_BACKENDS +# endif +# else +# undef EV_USE_KQUEUE +# define EV_USE_KQUEUE 0 +# endif + +# if HAVE_PORT_H && HAVE_PORT_CREATE +# ifndef EV_USE_PORT +# define EV_USE_PORT EV_FEATURE_BACKENDS +# endif +# else +# undef EV_USE_PORT +# define EV_USE_PORT 0 +# endif + +# if HAVE_INOTIFY_INIT && HAVE_SYS_INOTIFY_H +# ifndef EV_USE_INOTIFY +# define EV_USE_INOTIFY EV_FEATURE_OS +# endif +# else +# undef EV_USE_INOTIFY +# define EV_USE_INOTIFY 0 +# endif + +# if HAVE_SIGNALFD && HAVE_SYS_SIGNALFD_H +# ifndef EV_USE_SIGNALFD +# define EV_USE_SIGNALFD EV_FEATURE_OS +# endif +# else +# undef EV_USE_SIGNALFD +# define EV_USE_SIGNALFD 0 +# endif + +# if HAVE_EVENTFD +# ifndef EV_USE_EVENTFD +# define EV_USE_EVENTFD EV_FEATURE_OS +# endif +# else +# undef EV_USE_EVENTFD +# define EV_USE_EVENTFD 0 +# endif + +# if HAVE_SYS_TIMERFD_H +# ifndef EV_USE_TIMERFD +# define EV_USE_TIMERFD EV_FEATURE_OS +# endif +# else +# undef EV_USE_TIMERFD +# define EV_USE_TIMERFD 0 +# endif + +#endif + +/* OS X, in its infinite idiocy, actually HARDCODES + * a limit of 1024 into their select. Where people have brains, + * OS X engineers apparently have a vacuum. Or maybe they were + * ordered to have a vacuum, or they do anything for money. + * This might help. Or not. + * Note that this must be defined early, as other include files + * will rely on this define as well. + */ +#define _DARWIN_UNLIMITED_SELECT 1 + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include + +#ifdef EV_H +# include EV_H +#else +# include "ev.h" +#endif + +#if EV_NO_THREADS +# undef EV_NO_SMP +# define EV_NO_SMP 1 +# undef ECB_NO_THREADS +# define ECB_NO_THREADS 1 +#endif +#if EV_NO_SMP +# undef EV_NO_SMP +# define ECB_NO_SMP 1 +#endif + +#ifndef _WIN32 +# include +# include +# include +#else +# include +# define WIN32_LEAN_AND_MEAN +# include +# include +# ifndef EV_SELECT_IS_WINSOCKET +# define EV_SELECT_IS_WINSOCKET 1 +# endif +# undef EV_AVOID_STDIO +#endif + +/* this block tries to deduce configuration from header-defined symbols and defaults */ + +/* try to deduce the maximum number of signals on this platform */ +#if defined EV_NSIG +/* use what's provided */ +#elif defined NSIG +# define EV_NSIG (NSIG) +#elif defined _NSIG +# define EV_NSIG (_NSIG) +#elif defined SIGMAX +# define EV_NSIG (SIGMAX+1) +#elif defined SIG_MAX +# define EV_NSIG (SIG_MAX+1) +#elif defined _SIG_MAX +# define EV_NSIG (_SIG_MAX+1) +#elif defined MAXSIG +# define EV_NSIG (MAXSIG+1) +#elif defined MAX_SIG +# define EV_NSIG (MAX_SIG+1) +#elif defined SIGARRAYSIZE +# define EV_NSIG (SIGARRAYSIZE) /* Assume ary[SIGARRAYSIZE] */ +#elif defined _sys_nsig +# define EV_NSIG (_sys_nsig) /* Solaris 2.5 */ +#else +# define EV_NSIG (8 * sizeof (sigset_t) + 1) +#endif + +#ifndef EV_USE_FLOOR +# define EV_USE_FLOOR 0 +#endif + +#ifndef EV_USE_CLOCK_SYSCALL +# if __linux && __GLIBC__ == 2 && __GLIBC_MINOR__ < 17 +# define EV_USE_CLOCK_SYSCALL EV_FEATURE_OS +# else +# define EV_USE_CLOCK_SYSCALL 0 +# endif +#endif + +#if !(_POSIX_TIMERS > 0) +# ifndef EV_USE_MONOTONIC +# define EV_USE_MONOTONIC 0 +# endif +# ifndef EV_USE_REALTIME +# define EV_USE_REALTIME 0 +# endif +#endif + +#ifndef EV_USE_MONOTONIC +# if defined _POSIX_MONOTONIC_CLOCK && _POSIX_MONOTONIC_CLOCK >= 0 +# define EV_USE_MONOTONIC EV_FEATURE_OS +# else +# define EV_USE_MONOTONIC 0 +# endif +#endif + +#ifndef EV_USE_REALTIME +# define EV_USE_REALTIME !EV_USE_CLOCK_SYSCALL +#endif + +#ifndef EV_USE_NANOSLEEP +# if _POSIX_C_SOURCE >= 199309L +# define EV_USE_NANOSLEEP EV_FEATURE_OS +# else +# define EV_USE_NANOSLEEP 0 +# endif +#endif + +#ifndef EV_USE_SELECT +# define EV_USE_SELECT EV_FEATURE_BACKENDS +#endif + +#ifndef EV_USE_POLL +# ifdef _WIN32 +# define EV_USE_POLL 0 +# else +# define EV_USE_POLL EV_FEATURE_BACKENDS +# endif +#endif + +#ifndef EV_USE_EPOLL +# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 4)) +# define EV_USE_EPOLL EV_FEATURE_BACKENDS +# else +# define EV_USE_EPOLL 0 +# endif +#endif + +#ifndef EV_USE_KQUEUE +# define EV_USE_KQUEUE 0 +#endif + +#ifndef EV_USE_PORT +# define EV_USE_PORT 0 +#endif + +#ifndef EV_USE_LINUXAIO +# define EV_USE_LINUXAIO 0 +#endif + +#ifndef EV_USE_IOURING +# define EV_USE_IOURING 0 +#endif + +#ifndef EV_USE_INOTIFY +# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 4)) +# define EV_USE_INOTIFY EV_FEATURE_OS +# else +# define EV_USE_INOTIFY 0 +# endif +#endif + +#ifndef EV_PID_HASHSIZE +# define EV_PID_HASHSIZE EV_FEATURE_DATA ? 16 : 1 +#endif + +#ifndef EV_INOTIFY_HASHSIZE +# define EV_INOTIFY_HASHSIZE EV_FEATURE_DATA ? 16 : 1 +#endif + +#ifndef EV_USE_EVENTFD +# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7)) +# define EV_USE_EVENTFD EV_FEATURE_OS +# else +# define EV_USE_EVENTFD 0 +# endif +#endif + +#ifndef EV_USE_SIGNALFD +# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7)) +# define EV_USE_SIGNALFD EV_FEATURE_OS +# else +# define EV_USE_SIGNALFD 0 +# endif +#endif + +#ifndef EV_USE_TIMERFD +# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8)) +# define EV_USE_TIMERFD EV_FEATURE_OS +# else +# define EV_USE_TIMERFD 0 +# endif +#endif + +#if 0 /* debugging */ +# define EV_VERIFY 3 +# define EV_USE_4HEAP 1 +# define EV_HEAP_CACHE_AT 1 +#endif + +#ifndef EV_VERIFY +# define EV_VERIFY (EV_FEATURE_API ? 1 : 0) +#endif + +#ifndef EV_USE_4HEAP +# define EV_USE_4HEAP EV_FEATURE_DATA +#endif + +#ifndef EV_HEAP_CACHE_AT +# define EV_HEAP_CACHE_AT EV_FEATURE_DATA +#endif + +#ifdef __ANDROID__ +/* supposedly, android doesn't typedef fd_mask */ +# undef EV_USE_SELECT +# define EV_USE_SELECT 0 +/* supposedly, we need to include syscall.h, not sys/syscall.h, so just disable */ +# undef EV_USE_CLOCK_SYSCALL +# define EV_USE_CLOCK_SYSCALL 0 +#endif + +/* aix's poll.h seems to cause lots of trouble */ +#ifdef _AIX +/* AIX has a completely broken poll.h header */ +# undef EV_USE_POLL +# define EV_USE_POLL 0 +#endif + +/* on linux, we can use a (slow) syscall to avoid a dependency on pthread, */ +/* which makes programs even slower. might work on other unices, too. */ +#if EV_USE_CLOCK_SYSCALL +# include +# ifdef SYS_clock_gettime +# define clock_gettime(id, ts) syscall (SYS_clock_gettime, (id), (ts)) +# undef EV_USE_MONOTONIC +# define EV_USE_MONOTONIC 1 +# define EV_NEED_SYSCALL 1 +# else +# undef EV_USE_CLOCK_SYSCALL +# define EV_USE_CLOCK_SYSCALL 0 +# endif +#endif + +/* this block fixes any misconfiguration where we know we run into trouble otherwise */ + +#ifndef CLOCK_MONOTONIC +# undef EV_USE_MONOTONIC +# define EV_USE_MONOTONIC 0 +#endif + +#ifndef CLOCK_REALTIME +# undef EV_USE_REALTIME +# define EV_USE_REALTIME 0 +#endif + +#if !EV_STAT_ENABLE +# undef EV_USE_INOTIFY +# define EV_USE_INOTIFY 0 +#endif + +#if !EV_USE_NANOSLEEP +/* hp-ux has it in sys/time.h, which we unconditionally include above */ +# if !defined _WIN32 && !defined __hpux +# include +# endif +#endif + +#if EV_USE_LINUXAIO +# include +# if SYS_io_getevents && EV_USE_EPOLL /* linuxaio backend requires epoll backend */ +# define EV_NEED_SYSCALL 1 +# else +# undef EV_USE_LINUXAIO +# define EV_USE_LINUXAIO 0 +# endif +#endif + +#if EV_USE_IOURING +# include +# if !SYS_io_uring_setup && __linux && !__alpha +# define SYS_io_uring_setup 425 +# define SYS_io_uring_enter 426 +# define SYS_io_uring_wregister 427 +# endif +# if SYS_io_uring_setup && EV_USE_EPOLL /* iouring backend requires epoll backend */ +# define EV_NEED_SYSCALL 1 +# else +# undef EV_USE_IOURING +# define EV_USE_IOURING 0 +# endif +#endif + +#if EV_USE_INOTIFY +# include +# include +/* some very old inotify.h headers don't have IN_DONT_FOLLOW */ +# ifndef IN_DONT_FOLLOW +# undef EV_USE_INOTIFY +# define EV_USE_INOTIFY 0 +# endif +#endif + +#if EV_USE_EVENTFD +/* our minimum requirement is glibc 2.7 which has the stub, but not the full header */ +# include +# ifndef EFD_NONBLOCK +# define EFD_NONBLOCK O_NONBLOCK +# endif +# ifndef EFD_CLOEXEC +# ifdef O_CLOEXEC +# define EFD_CLOEXEC O_CLOEXEC +# else +# define EFD_CLOEXEC 02000000 +# endif +# endif +EV_CPP(extern "C") int (eventfd) (unsigned int initval, int flags); +#endif + +#if EV_USE_SIGNALFD +/* our minimum requirement is glibc 2.7 which has the stub, but not the full header */ +# include +# ifndef SFD_NONBLOCK +# define SFD_NONBLOCK O_NONBLOCK +# endif +# ifndef SFD_CLOEXEC +# ifdef O_CLOEXEC +# define SFD_CLOEXEC O_CLOEXEC +# else +# define SFD_CLOEXEC 02000000 +# endif +# endif +EV_CPP (extern "C") int (signalfd) (int fd, const sigset_t *mask, int flags); + +struct signalfd_siginfo +{ + uint32_t ssi_signo; + char pad[128 - sizeof (uint32_t)]; +}; +#endif + +/* for timerfd, libev core requires TFD_TIMER_CANCEL_ON_SET &c */ +#if EV_USE_TIMERFD +# include +/* timerfd is only used for periodics */ +# if !(defined (TFD_TIMER_CANCEL_ON_SET) && defined (TFD_CLOEXEC) && defined (TFD_NONBLOCK)) || !EV_PERIODIC_ENABLE +# undef EV_USE_TIMERFD +# define EV_USE_TIMERFD 0 +# endif +#endif + +/*****************************************************************************/ + +#if EV_VERIFY >= 3 +# define EV_FREQUENT_CHECK ev_verify (EV_A) +#else +# define EV_FREQUENT_CHECK do { } while (0) +#endif + +/* + * This is used to work around floating point rounding problems. + * This value is good at least till the year 4000. + */ +#define MIN_INTERVAL 0.0001220703125 /* 1/2**13, good till 4000 */ +/*#define MIN_INTERVAL 0.00000095367431640625 /* 1/2**20, good till 2200 */ + +#define MIN_TIMEJUMP 1. /* minimum timejump that gets detected (if monotonic clock available) */ +#define MAX_BLOCKTIME 59.743 /* never wait longer than this time (to detect time jumps) */ +#define MAX_BLOCKTIME2 1500001.07 /* same, but when timerfd is used to detect jumps, also safe delay to not overflow */ + +/* find a portable timestamp that is "always" in the future but fits into time_t. + * this is quite hard, and we are mostly guessing - we handle 32 bit signed/unsigned time_t, + * and sizes larger than 32 bit, and maybe the unlikely floating point time_t */ +#define EV_TSTAMP_HUGE \ + (sizeof (time_t) >= 8 ? 10000000000000. \ + : 0 < (time_t)4294967295 ? 4294967295. \ + : 2147483647.) \ + +#ifndef EV_TS_CONST +# define EV_TS_CONST(nv) nv +# define EV_TS_TO_MSEC(a) a * 1e3 + 0.9999 +# define EV_TS_FROM_USEC(us) us * 1e-6 +# define EV_TV_SET(tv,t) do { tv.tv_sec = (long)t; tv.tv_usec = (long)((t - tv.tv_sec) * 1e6); } while (0) +# define EV_TS_SET(ts,t) do { ts.tv_sec = (long)t; ts.tv_nsec = (long)((t - ts.tv_sec) * 1e9); } while (0) +# define EV_TV_GET(tv) ((tv).tv_sec + (tv).tv_usec * 1e-6) +# define EV_TS_GET(ts) ((ts).tv_sec + (ts).tv_nsec * 1e-9) +#endif + +/* the following is ecb.h embedded into libev - use update_ev_c to update from an external copy */ +/* ECB.H BEGIN */ +/* + * libecb - http://software.schmorp.de/pkg/libecb + * + * Copyright (©) 2009-2015,2018-2020 Marc Alexander Lehmann + * Copyright (©) 2011 Emanuele Giaquinta + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#ifndef ECB_H +#define ECB_H + +/* 16 bits major, 16 bits minor */ +#define ECB_VERSION 0x00010008 + +#include /* for memcpy */ + +#if defined (_WIN32) && !defined (__MINGW32__) + typedef signed char int8_t; + typedef unsigned char uint8_t; + typedef signed char int_fast8_t; + typedef unsigned char uint_fast8_t; + typedef signed short int16_t; + typedef unsigned short uint16_t; + typedef signed int int_fast16_t; + typedef unsigned int uint_fast16_t; + typedef signed int int32_t; + typedef unsigned int uint32_t; + typedef signed int int_fast32_t; + typedef unsigned int uint_fast32_t; + #if __GNUC__ + typedef signed long long int64_t; + typedef unsigned long long uint64_t; + #else /* _MSC_VER || __BORLANDC__ */ + typedef signed __int64 int64_t; + typedef unsigned __int64 uint64_t; + #endif + typedef int64_t int_fast64_t; + typedef uint64_t uint_fast64_t; + #ifdef _WIN64 + #define ECB_PTRSIZE 8 + typedef uint64_t uintptr_t; + typedef int64_t intptr_t; + #else + #define ECB_PTRSIZE 4 + typedef uint32_t uintptr_t; + typedef int32_t intptr_t; + #endif +#else + #include + #if (defined INTPTR_MAX ? INTPTR_MAX : ULONG_MAX) > 0xffffffffU + #define ECB_PTRSIZE 8 + #else + #define ECB_PTRSIZE 4 + #endif +#endif + +#define ECB_GCC_AMD64 (__amd64 || __amd64__ || __x86_64 || __x86_64__) +#define ECB_MSVC_AMD64 (_M_AMD64 || _M_X64) + +#ifndef ECB_OPTIMIZE_SIZE + #if __OPTIMIZE_SIZE__ + #define ECB_OPTIMIZE_SIZE 1 + #else + #define ECB_OPTIMIZE_SIZE 0 + #endif +#endif + +/* work around x32 idiocy by defining proper macros */ +#if ECB_GCC_AMD64 || ECB_MSVC_AMD64 + #if _ILP32 + #define ECB_AMD64_X32 1 + #else + #define ECB_AMD64 1 + #endif +#endif + +/* many compilers define _GNUC_ to some versions but then only implement + * what their idiot authors think are the "more important" extensions, + * causing enormous grief in return for some better fake benchmark numbers. + * or so. + * we try to detect these and simply assume they are not gcc - if they have + * an issue with that they should have done it right in the first place. + */ +#if !defined __GNUC_MINOR__ || defined __INTEL_COMPILER || defined __SUNPRO_C || defined __SUNPRO_CC || defined __llvm__ || defined __clang__ + #define ECB_GCC_VERSION(major,minor) 0 +#else + #define ECB_GCC_VERSION(major,minor) (__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))) +#endif + +#define ECB_CLANG_VERSION(major,minor) (__clang_major__ > (major) || (__clang_major__ == (major) && __clang_minor__ >= (minor))) + +#if __clang__ && defined __has_builtin + #define ECB_CLANG_BUILTIN(x) __has_builtin (x) +#else + #define ECB_CLANG_BUILTIN(x) 0 +#endif + +#if __clang__ && defined __has_extension + #define ECB_CLANG_EXTENSION(x) __has_extension (x) +#else + #define ECB_CLANG_EXTENSION(x) 0 +#endif + +#define ECB_CPP (__cplusplus+0) +#define ECB_CPP11 (__cplusplus >= 201103L) +#define ECB_CPP14 (__cplusplus >= 201402L) +#define ECB_CPP17 (__cplusplus >= 201703L) + +#if ECB_CPP + #define ECB_C 0 + #define ECB_STDC_VERSION 0 +#else + #define ECB_C 1 + #define ECB_STDC_VERSION __STDC_VERSION__ +#endif + +#define ECB_C99 (ECB_STDC_VERSION >= 199901L) +#define ECB_C11 (ECB_STDC_VERSION >= 201112L) +#define ECB_C17 (ECB_STDC_VERSION >= 201710L) + +#if ECB_CPP + #define ECB_EXTERN_C extern "C" + #define ECB_EXTERN_C_BEG ECB_EXTERN_C { + #define ECB_EXTERN_C_END } +#else + #define ECB_EXTERN_C extern + #define ECB_EXTERN_C_BEG + #define ECB_EXTERN_C_END +#endif + +/*****************************************************************************/ + +/* ECB_NO_THREADS - ecb is not used by multiple threads, ever */ +/* ECB_NO_SMP - ecb might be used in multiple threads, but only on a single cpu */ + +#if ECB_NO_THREADS + #define ECB_NO_SMP 1 +#endif + +#if ECB_NO_SMP + #define ECB_MEMORY_FENCE do { } while (0) +#endif + +/* http://www-01.ibm.com/support/knowledgecenter/SSGH3R_13.1.0/com.ibm.xlcpp131.aix.doc/compiler_ref/compiler_builtins.html */ +#if __xlC__ && ECB_CPP + #include +#endif + +#if 1400 <= _MSC_VER + #include /* fence functions _ReadBarrier, also bit search functions _BitScanReverse */ +#endif + +#ifndef ECB_MEMORY_FENCE + #if ECB_GCC_VERSION(2,5) || defined __INTEL_COMPILER || (__llvm__ && __GNUC__) || __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110 + #define ECB_MEMORY_FENCE_RELAXED __asm__ __volatile__ ("" : : : "memory") + #if __i386 || __i386__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("lock; orb $0, -1(%%esp)" : : : "memory") + #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("" : : : "memory") + #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("" : : : "memory") + #elif ECB_GCC_AMD64 + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mfence" : : : "memory") + #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("" : : : "memory") + #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("" : : : "memory") + #elif __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("sync" : : : "memory") + #elif defined __ARM_ARCH_2__ \ + || defined __ARM_ARCH_3__ || defined __ARM_ARCH_3M__ \ + || defined __ARM_ARCH_4__ || defined __ARM_ARCH_4T__ \ + || defined __ARM_ARCH_5__ || defined __ARM_ARCH_5E__ \ + || defined __ARM_ARCH_5T__ || defined __ARM_ARCH_5TE__ \ + || defined __ARM_ARCH_5TEJ__ + /* should not need any, unless running old code on newer cpu - arm doesn't support that */ + #elif defined __ARM_ARCH_6__ || defined __ARM_ARCH_6J__ \ + || defined __ARM_ARCH_6K__ || defined __ARM_ARCH_6ZK__ \ + || defined __ARM_ARCH_6T2__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mcr p15,0,%0,c7,c10,5" : : "r" (0) : "memory") + #elif defined __ARM_ARCH_7__ || defined __ARM_ARCH_7A__ \ + || defined __ARM_ARCH_7R__ || defined __ARM_ARCH_7M__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("dmb" : : : "memory") + #elif __aarch64__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("dmb ish" : : : "memory") + #elif (__sparc || __sparc__) && !(__sparc_v8__ || defined __sparcv8) + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("membar #LoadStore | #LoadLoad | #StoreStore | #StoreLoad" : : : "memory") + #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("membar #LoadStore | #LoadLoad" : : : "memory") + #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("membar #LoadStore | #StoreStore") + #elif defined __s390__ || defined __s390x__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("bcr 15,0" : : : "memory") + #elif defined __mips__ + /* GNU/Linux emulates sync on mips1 architectures, so we force its use */ + /* anybody else who still uses mips1 is supposed to send in their version, with detection code. */ + #define ECB_MEMORY_FENCE __asm__ __volatile__ (".set mips2; sync; .set mips0" : : : "memory") + #elif defined __alpha__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mb" : : : "memory") + #elif defined __hppa__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("" : : : "memory") + #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("") + #elif defined __ia64__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mf" : : : "memory") + #elif defined __m68k__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("" : : : "memory") + #elif defined __m88k__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("tb1 0,%%r0,128" : : : "memory") + #elif defined __sh__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("" : : : "memory") + #endif + #endif +#endif + +#ifndef ECB_MEMORY_FENCE + #if ECB_GCC_VERSION(4,7) + /* see comment below (stdatomic.h) about the C11 memory model. */ + #define ECB_MEMORY_FENCE __atomic_thread_fence (__ATOMIC_SEQ_CST) + #define ECB_MEMORY_FENCE_ACQUIRE __atomic_thread_fence (__ATOMIC_ACQUIRE) + #define ECB_MEMORY_FENCE_RELEASE __atomic_thread_fence (__ATOMIC_RELEASE) + #define ECB_MEMORY_FENCE_RELAXED __atomic_thread_fence (__ATOMIC_RELAXED) + + #elif ECB_CLANG_EXTENSION(c_atomic) + /* see comment below (stdatomic.h) about the C11 memory model. */ + #define ECB_MEMORY_FENCE __c11_atomic_thread_fence (__ATOMIC_SEQ_CST) + #define ECB_MEMORY_FENCE_ACQUIRE __c11_atomic_thread_fence (__ATOMIC_ACQUIRE) + #define ECB_MEMORY_FENCE_RELEASE __c11_atomic_thread_fence (__ATOMIC_RELEASE) + #define ECB_MEMORY_FENCE_RELAXED __c11_atomic_thread_fence (__ATOMIC_RELAXED) + + #elif ECB_GCC_VERSION(4,4) || defined __INTEL_COMPILER || defined __clang__ + #define ECB_MEMORY_FENCE __sync_synchronize () + #elif _MSC_VER >= 1500 /* VC++ 2008 */ + /* apparently, microsoft broke all the memory barrier stuff in Visual Studio 2008... */ + #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) + #define ECB_MEMORY_FENCE _ReadWriteBarrier (); MemoryBarrier() + #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier (); MemoryBarrier() /* according to msdn, _ReadBarrier is not a load fence */ + #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier (); MemoryBarrier() + #elif _MSC_VER >= 1400 /* VC++ 2005 */ + #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) + #define ECB_MEMORY_FENCE _ReadWriteBarrier () + #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier () /* according to msdn, _ReadBarrier is not a load fence */ + #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier () + #elif defined _WIN32 + #include + #define ECB_MEMORY_FENCE MemoryBarrier () /* actually just xchg on x86... scary */ + #elif __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110 + #include + #define ECB_MEMORY_FENCE __machine_rw_barrier () + #define ECB_MEMORY_FENCE_ACQUIRE __machine_acq_barrier () + #define ECB_MEMORY_FENCE_RELEASE __machine_rel_barrier () + #define ECB_MEMORY_FENCE_RELAXED __compiler_barrier () + #elif __xlC__ + #define ECB_MEMORY_FENCE __sync () + #endif +#endif + +#ifndef ECB_MEMORY_FENCE + #if ECB_C11 && !defined __STDC_NO_ATOMICS__ + /* we assume that these memory fences work on all variables/all memory accesses, */ + /* not just C11 atomics and atomic accesses */ + #include + #define ECB_MEMORY_FENCE atomic_thread_fence (memory_order_seq_cst) + #define ECB_MEMORY_FENCE_ACQUIRE atomic_thread_fence (memory_order_acquire) + #define ECB_MEMORY_FENCE_RELEASE atomic_thread_fence (memory_order_release) + #endif +#endif + +#ifndef ECB_MEMORY_FENCE + #if !ECB_AVOID_PTHREADS + /* + * if you get undefined symbol references to pthread_mutex_lock, + * or failure to find pthread.h, then you should implement + * the ECB_MEMORY_FENCE operations for your cpu/compiler + * OR provide pthread.h and link against the posix thread library + * of your system. + */ + #include + #define ECB_NEEDS_PTHREADS 1 + #define ECB_MEMORY_FENCE_NEEDS_PTHREADS 1 + + static pthread_mutex_t ecb_mf_lock = PTHREAD_MUTEX_INITIALIZER; + #define ECB_MEMORY_FENCE do { pthread_mutex_lock (&ecb_mf_lock); pthread_mutex_unlock (&ecb_mf_lock); } while (0) + #endif +#endif + +#if !defined ECB_MEMORY_FENCE_ACQUIRE && defined ECB_MEMORY_FENCE + #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE +#endif + +#if !defined ECB_MEMORY_FENCE_RELEASE && defined ECB_MEMORY_FENCE + #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE +#endif + +#if !defined ECB_MEMORY_FENCE_RELAXED && defined ECB_MEMORY_FENCE + #define ECB_MEMORY_FENCE_RELAXED ECB_MEMORY_FENCE /* very heavy-handed */ +#endif + +/*****************************************************************************/ + +#if ECB_CPP + #define ecb_inline static inline +#elif ECB_GCC_VERSION(2,5) + #define ecb_inline static __inline__ +#elif ECB_C99 + #define ecb_inline static inline +#else + #define ecb_inline static +#endif + +#if ECB_GCC_VERSION(3,3) + #define ecb_restrict __restrict__ +#elif ECB_C99 + #define ecb_restrict restrict +#else + #define ecb_restrict +#endif + +typedef int ecb_bool; + +#define ECB_CONCAT_(a, b) a ## b +#define ECB_CONCAT(a, b) ECB_CONCAT_(a, b) +#define ECB_STRINGIFY_(a) # a +#define ECB_STRINGIFY(a) ECB_STRINGIFY_(a) +#define ECB_STRINGIFY_EXPR(expr) ((expr), ECB_STRINGIFY_ (expr)) + +#define ecb_function_ ecb_inline + +#if ECB_GCC_VERSION(3,1) || ECB_CLANG_VERSION(2,8) + #define ecb_attribute(attrlist) __attribute__ (attrlist) +#else + #define ecb_attribute(attrlist) +#endif + +#if ECB_GCC_VERSION(3,1) || ECB_CLANG_BUILTIN(__builtin_constant_p) + #define ecb_is_constant(expr) __builtin_constant_p (expr) +#else + /* possible C11 impl for integral types + typedef struct ecb_is_constant_struct ecb_is_constant_struct; + #define ecb_is_constant(expr) _Generic ((1 ? (struct ecb_is_constant_struct *)0 : (void *)((expr) - (expr)), ecb_is_constant_struct *: 0, default: 1)) */ + + #define ecb_is_constant(expr) 0 +#endif + +#if ECB_GCC_VERSION(3,1) || ECB_CLANG_BUILTIN(__builtin_expect) + #define ecb_expect(expr,value) __builtin_expect ((expr),(value)) +#else + #define ecb_expect(expr,value) (expr) +#endif + +#if ECB_GCC_VERSION(3,1) || ECB_CLANG_BUILTIN(__builtin_prefetch) + #define ecb_prefetch(addr,rw,locality) __builtin_prefetch (addr, rw, locality) +#else + #define ecb_prefetch(addr,rw,locality) +#endif + +/* no emulation for ecb_decltype */ +#if ECB_CPP11 + // older implementations might have problems with decltype(x)::type, work around it + template struct ecb_decltype_t { typedef T type; }; + #define ecb_decltype(x) ecb_decltype_t::type +#elif ECB_GCC_VERSION(3,0) || ECB_CLANG_VERSION(2,8) + #define ecb_decltype(x) __typeof__ (x) +#endif + +#if _MSC_VER >= 1300 + #define ecb_deprecated __declspec (deprecated) +#else + #define ecb_deprecated ecb_attribute ((__deprecated__)) +#endif + +#if _MSC_VER >= 1500 + #define ecb_deprecated_message(msg) __declspec (deprecated (msg)) +#elif ECB_GCC_VERSION(4,5) + #define ecb_deprecated_message(msg) ecb_attribute ((__deprecated__ (msg)) +#else + #define ecb_deprecated_message(msg) ecb_deprecated +#endif + +#if _MSC_VER >= 1400 + #define ecb_noinline __declspec (noinline) +#else + #define ecb_noinline ecb_attribute ((__noinline__)) +#endif + +#define ecb_unused ecb_attribute ((__unused__)) +#define ecb_const ecb_attribute ((__const__)) +#define ecb_pure ecb_attribute ((__pure__)) + +#if ECB_C11 || __IBMC_NORETURN + /* http://www-01.ibm.com/support/knowledgecenter/SSGH3R_13.1.0/com.ibm.xlcpp131.aix.doc/language_ref/noreturn.html */ + #define ecb_noreturn _Noreturn +#elif ECB_CPP11 + #define ecb_noreturn [[noreturn]] +#elif _MSC_VER >= 1200 + /* http://msdn.microsoft.com/en-us/library/k6ktzx3s.aspx */ + #define ecb_noreturn __declspec (noreturn) +#else + #define ecb_noreturn ecb_attribute ((__noreturn__)) +#endif + +#if ECB_GCC_VERSION(4,3) + #define ecb_artificial ecb_attribute ((__artificial__)) + #define ecb_hot ecb_attribute ((__hot__)) + #define ecb_cold ecb_attribute ((__cold__)) +#else + #define ecb_artificial + #define ecb_hot + #define ecb_cold +#endif + +/* put around conditional expressions if you are very sure that the */ +/* expression is mostly true or mostly false. note that these return */ +/* booleans, not the expression. */ +#define ecb_expect_false(expr) ecb_expect (!!(expr), 0) +#define ecb_expect_true(expr) ecb_expect (!!(expr), 1) +/* for compatibility to the rest of the world */ +#define ecb_likely(expr) ecb_expect_true (expr) +#define ecb_unlikely(expr) ecb_expect_false (expr) + +/* count trailing zero bits and count # of one bits */ +#if ECB_GCC_VERSION(3,4) \ + || (ECB_CLANG_BUILTIN(__builtin_clz) && ECB_CLANG_BUILTIN(__builtin_clzll) \ + && ECB_CLANG_BUILTIN(__builtin_ctz) && ECB_CLANG_BUILTIN(__builtin_ctzll) \ + && ECB_CLANG_BUILTIN(__builtin_popcount)) + /* we assume int == 32 bit, long == 32 or 64 bit and long long == 64 bit */ + #define ecb_ld32(x) (__builtin_clz (x) ^ 31) + #define ecb_ld64(x) (__builtin_clzll (x) ^ 63) + #define ecb_ctz32(x) __builtin_ctz (x) + #define ecb_ctz64(x) __builtin_ctzll (x) + #define ecb_popcount32(x) __builtin_popcount (x) + /* no popcountll */ +#else + ecb_function_ ecb_const int ecb_ctz32 (uint32_t x); + ecb_function_ ecb_const int + ecb_ctz32 (uint32_t x) + { +#if 1400 <= _MSC_VER && (_M_IX86 || _M_X64 || _M_IA64 || _M_ARM) + unsigned long r; + _BitScanForward (&r, x); + return (int)r; +#else + int r = 0; + + x &= ~x + 1; /* this isolates the lowest bit */ + +#if ECB_branchless_on_i386 + r += !!(x & 0xaaaaaaaa) << 0; + r += !!(x & 0xcccccccc) << 1; + r += !!(x & 0xf0f0f0f0) << 2; + r += !!(x & 0xff00ff00) << 3; + r += !!(x & 0xffff0000) << 4; +#else + if (x & 0xaaaaaaaa) r += 1; + if (x & 0xcccccccc) r += 2; + if (x & 0xf0f0f0f0) r += 4; + if (x & 0xff00ff00) r += 8; + if (x & 0xffff0000) r += 16; +#endif + + return r; +#endif + } + + ecb_function_ ecb_const int ecb_ctz64 (uint64_t x); + ecb_function_ ecb_const int + ecb_ctz64 (uint64_t x) + { +#if 1400 <= _MSC_VER && (_M_X64 || _M_IA64 || _M_ARM) + unsigned long r; + _BitScanForward64 (&r, x); + return (int)r; +#else + int shift = x & 0xffffffff ? 0 : 32; + return ecb_ctz32 (x >> shift) + shift; +#endif + } + + ecb_function_ ecb_const int ecb_popcount32 (uint32_t x); + ecb_function_ ecb_const int + ecb_popcount32 (uint32_t x) + { + x -= (x >> 1) & 0x55555555; + x = ((x >> 2) & 0x33333333) + (x & 0x33333333); + x = ((x >> 4) + x) & 0x0f0f0f0f; + x *= 0x01010101; + + return x >> 24; + } + + ecb_function_ ecb_const int ecb_ld32 (uint32_t x); + ecb_function_ ecb_const int ecb_ld32 (uint32_t x) + { +#if 1400 <= _MSC_VER && (_M_IX86 || _M_X64 || _M_IA64 || _M_ARM) + unsigned long r; + _BitScanReverse (&r, x); + return (int)r; +#else + int r = 0; + + if (x >> 16) { x >>= 16; r += 16; } + if (x >> 8) { x >>= 8; r += 8; } + if (x >> 4) { x >>= 4; r += 4; } + if (x >> 2) { x >>= 2; r += 2; } + if (x >> 1) { r += 1; } + + return r; +#endif + } + + ecb_function_ ecb_const int ecb_ld64 (uint64_t x); + ecb_function_ ecb_const int ecb_ld64 (uint64_t x) + { +#if 1400 <= _MSC_VER && (_M_X64 || _M_IA64 || _M_ARM) + unsigned long r; + _BitScanReverse64 (&r, x); + return (int)r; +#else + int r = 0; + + if (x >> 32) { x >>= 32; r += 32; } + + return r + ecb_ld32 (x); +#endif + } +#endif + +ecb_function_ ecb_const ecb_bool ecb_is_pot32 (uint32_t x); +ecb_function_ ecb_const ecb_bool ecb_is_pot32 (uint32_t x) { return !(x & (x - 1)); } +ecb_function_ ecb_const ecb_bool ecb_is_pot64 (uint64_t x); +ecb_function_ ecb_const ecb_bool ecb_is_pot64 (uint64_t x) { return !(x & (x - 1)); } + +ecb_function_ ecb_const uint8_t ecb_bitrev8 (uint8_t x); +ecb_function_ ecb_const uint8_t ecb_bitrev8 (uint8_t x) +{ + return ( (x * 0x0802U & 0x22110U) + | (x * 0x8020U & 0x88440U)) * 0x10101U >> 16; +} + +ecb_function_ ecb_const uint16_t ecb_bitrev16 (uint16_t x); +ecb_function_ ecb_const uint16_t ecb_bitrev16 (uint16_t x) +{ + x = ((x >> 1) & 0x5555) | ((x & 0x5555) << 1); + x = ((x >> 2) & 0x3333) | ((x & 0x3333) << 2); + x = ((x >> 4) & 0x0f0f) | ((x & 0x0f0f) << 4); + x = ( x >> 8 ) | ( x << 8); + + return x; +} + +ecb_function_ ecb_const uint32_t ecb_bitrev32 (uint32_t x); +ecb_function_ ecb_const uint32_t ecb_bitrev32 (uint32_t x) +{ + x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1); + x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2); + x = ((x >> 4) & 0x0f0f0f0f) | ((x & 0x0f0f0f0f) << 4); + x = ((x >> 8) & 0x00ff00ff) | ((x & 0x00ff00ff) << 8); + x = ( x >> 16 ) | ( x << 16); + + return x; +} + +/* popcount64 is only available on 64 bit cpus as gcc builtin */ +/* so for this version we are lazy */ +ecb_function_ ecb_const int ecb_popcount64 (uint64_t x); +ecb_function_ ecb_const int +ecb_popcount64 (uint64_t x) +{ + return ecb_popcount32 (x) + ecb_popcount32 (x >> 32); +} + +ecb_inline ecb_const uint8_t ecb_rotl8 (uint8_t x, unsigned int count); +ecb_inline ecb_const uint8_t ecb_rotr8 (uint8_t x, unsigned int count); +ecb_inline ecb_const uint16_t ecb_rotl16 (uint16_t x, unsigned int count); +ecb_inline ecb_const uint16_t ecb_rotr16 (uint16_t x, unsigned int count); +ecb_inline ecb_const uint32_t ecb_rotl32 (uint32_t x, unsigned int count); +ecb_inline ecb_const uint32_t ecb_rotr32 (uint32_t x, unsigned int count); +ecb_inline ecb_const uint64_t ecb_rotl64 (uint64_t x, unsigned int count); +ecb_inline ecb_const uint64_t ecb_rotr64 (uint64_t x, unsigned int count); + +ecb_inline ecb_const uint8_t ecb_rotl8 (uint8_t x, unsigned int count) { return (x >> ( 8 - count)) | (x << count); } +ecb_inline ecb_const uint8_t ecb_rotr8 (uint8_t x, unsigned int count) { return (x << ( 8 - count)) | (x >> count); } +ecb_inline ecb_const uint16_t ecb_rotl16 (uint16_t x, unsigned int count) { return (x >> (16 - count)) | (x << count); } +ecb_inline ecb_const uint16_t ecb_rotr16 (uint16_t x, unsigned int count) { return (x << (16 - count)) | (x >> count); } +ecb_inline ecb_const uint32_t ecb_rotl32 (uint32_t x, unsigned int count) { return (x >> (32 - count)) | (x << count); } +ecb_inline ecb_const uint32_t ecb_rotr32 (uint32_t x, unsigned int count) { return (x << (32 - count)) | (x >> count); } +ecb_inline ecb_const uint64_t ecb_rotl64 (uint64_t x, unsigned int count) { return (x >> (64 - count)) | (x << count); } +ecb_inline ecb_const uint64_t ecb_rotr64 (uint64_t x, unsigned int count) { return (x << (64 - count)) | (x >> count); } + +#if ECB_CPP + +inline uint8_t ecb_ctz (uint8_t v) { return ecb_ctz32 (v); } +inline uint16_t ecb_ctz (uint16_t v) { return ecb_ctz32 (v); } +inline uint32_t ecb_ctz (uint32_t v) { return ecb_ctz32 (v); } +inline uint64_t ecb_ctz (uint64_t v) { return ecb_ctz64 (v); } + +inline bool ecb_is_pot (uint8_t v) { return ecb_is_pot32 (v); } +inline bool ecb_is_pot (uint16_t v) { return ecb_is_pot32 (v); } +inline bool ecb_is_pot (uint32_t v) { return ecb_is_pot32 (v); } +inline bool ecb_is_pot (uint64_t v) { return ecb_is_pot64 (v); } + +inline int ecb_ld (uint8_t v) { return ecb_ld32 (v); } +inline int ecb_ld (uint16_t v) { return ecb_ld32 (v); } +inline int ecb_ld (uint32_t v) { return ecb_ld32 (v); } +inline int ecb_ld (uint64_t v) { return ecb_ld64 (v); } + +inline int ecb_popcount (uint8_t v) { return ecb_popcount32 (v); } +inline int ecb_popcount (uint16_t v) { return ecb_popcount32 (v); } +inline int ecb_popcount (uint32_t v) { return ecb_popcount32 (v); } +inline int ecb_popcount (uint64_t v) { return ecb_popcount64 (v); } + +inline uint8_t ecb_bitrev (uint8_t v) { return ecb_bitrev8 (v); } +inline uint16_t ecb_bitrev (uint16_t v) { return ecb_bitrev16 (v); } +inline uint32_t ecb_bitrev (uint32_t v) { return ecb_bitrev32 (v); } + +inline uint8_t ecb_rotl (uint8_t v, unsigned int count) { return ecb_rotl8 (v, count); } +inline uint16_t ecb_rotl (uint16_t v, unsigned int count) { return ecb_rotl16 (v, count); } +inline uint32_t ecb_rotl (uint32_t v, unsigned int count) { return ecb_rotl32 (v, count); } +inline uint64_t ecb_rotl (uint64_t v, unsigned int count) { return ecb_rotl64 (v, count); } + +inline uint8_t ecb_rotr (uint8_t v, unsigned int count) { return ecb_rotr8 (v, count); } +inline uint16_t ecb_rotr (uint16_t v, unsigned int count) { return ecb_rotr16 (v, count); } +inline uint32_t ecb_rotr (uint32_t v, unsigned int count) { return ecb_rotr32 (v, count); } +inline uint64_t ecb_rotr (uint64_t v, unsigned int count) { return ecb_rotr64 (v, count); } + +#endif + +#if ECB_GCC_VERSION(4,3) || (ECB_CLANG_BUILTIN(__builtin_bswap32) && ECB_CLANG_BUILTIN(__builtin_bswap64)) + #if ECB_GCC_VERSION(4,8) || ECB_CLANG_BUILTIN(__builtin_bswap16) + #define ecb_bswap16(x) __builtin_bswap16 (x) + #else + #define ecb_bswap16(x) (__builtin_bswap32 (x) >> 16) + #endif + #define ecb_bswap32(x) __builtin_bswap32 (x) + #define ecb_bswap64(x) __builtin_bswap64 (x) +#elif _MSC_VER + #include + #define ecb_bswap16(x) ((uint16_t)_byteswap_ushort ((uint16_t)(x))) + #define ecb_bswap32(x) ((uint32_t)_byteswap_ulong ((uint32_t)(x))) + #define ecb_bswap64(x) ((uint64_t)_byteswap_uint64 ((uint64_t)(x))) +#else + ecb_function_ ecb_const uint16_t ecb_bswap16 (uint16_t x); + ecb_function_ ecb_const uint16_t + ecb_bswap16 (uint16_t x) + { + return ecb_rotl16 (x, 8); + } + + ecb_function_ ecb_const uint32_t ecb_bswap32 (uint32_t x); + ecb_function_ ecb_const uint32_t + ecb_bswap32 (uint32_t x) + { + return (((uint32_t)ecb_bswap16 (x)) << 16) | ecb_bswap16 (x >> 16); + } + + ecb_function_ ecb_const uint64_t ecb_bswap64 (uint64_t x); + ecb_function_ ecb_const uint64_t + ecb_bswap64 (uint64_t x) + { + return (((uint64_t)ecb_bswap32 (x)) << 32) | ecb_bswap32 (x >> 32); + } +#endif + +#if ECB_GCC_VERSION(4,5) || ECB_CLANG_BUILTIN(__builtin_unreachable) + #define ecb_unreachable() __builtin_unreachable () +#else + /* this seems to work fine, but gcc always emits a warning for it :/ */ + ecb_inline ecb_noreturn void ecb_unreachable (void); + ecb_inline ecb_noreturn void ecb_unreachable (void) { } +#endif + +/* try to tell the compiler that some condition is definitely true */ +#define ecb_assume(cond) if (!(cond)) ecb_unreachable (); else 0 + +ecb_inline ecb_const uint32_t ecb_byteorder_helper (void); +ecb_inline ecb_const uint32_t +ecb_byteorder_helper (void) +{ + /* the union code still generates code under pressure in gcc, */ + /* but less than using pointers, and always seems to */ + /* successfully return a constant. */ + /* the reason why we have this horrible preprocessor mess */ + /* is to avoid it in all cases, at least on common architectures */ + /* or when using a recent enough gcc version (>= 4.6) */ +#if (defined __BYTE_ORDER__ && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \ + || ((__i386 || __i386__ || _M_IX86 || ECB_GCC_AMD64 || ECB_MSVC_AMD64) && !__VOS__) + #define ECB_LITTLE_ENDIAN 1 + return 0x44332211; +#elif (defined __BYTE_ORDER__ && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) \ + || ((__AARCH64EB__ || __MIPSEB__ || __ARMEB__) && !__VOS__) + #define ECB_BIG_ENDIAN 1 + return 0x11223344; +#else + union + { + uint8_t c[4]; + uint32_t u; + } u = { 0x11, 0x22, 0x33, 0x44 }; + return u.u; +#endif +} + +ecb_inline ecb_const ecb_bool ecb_big_endian (void); +ecb_inline ecb_const ecb_bool ecb_big_endian (void) { return ecb_byteorder_helper () == 0x11223344; } +ecb_inline ecb_const ecb_bool ecb_little_endian (void); +ecb_inline ecb_const ecb_bool ecb_little_endian (void) { return ecb_byteorder_helper () == 0x44332211; } + +/*****************************************************************************/ +/* unaligned load/store */ + +ecb_inline uint_fast16_t ecb_be_u16_to_host (uint_fast16_t v) { return ecb_little_endian () ? ecb_bswap16 (v) : v; } +ecb_inline uint_fast32_t ecb_be_u32_to_host (uint_fast32_t v) { return ecb_little_endian () ? ecb_bswap32 (v) : v; } +ecb_inline uint_fast64_t ecb_be_u64_to_host (uint_fast64_t v) { return ecb_little_endian () ? ecb_bswap64 (v) : v; } + +ecb_inline uint_fast16_t ecb_le_u16_to_host (uint_fast16_t v) { return ecb_big_endian () ? ecb_bswap16 (v) : v; } +ecb_inline uint_fast32_t ecb_le_u32_to_host (uint_fast32_t v) { return ecb_big_endian () ? ecb_bswap32 (v) : v; } +ecb_inline uint_fast64_t ecb_le_u64_to_host (uint_fast64_t v) { return ecb_big_endian () ? ecb_bswap64 (v) : v; } + +ecb_inline uint_fast16_t ecb_peek_u16_u (const void *ptr) { uint16_t v; memcpy (&v, ptr, sizeof (v)); return v; } +ecb_inline uint_fast32_t ecb_peek_u32_u (const void *ptr) { uint32_t v; memcpy (&v, ptr, sizeof (v)); return v; } +ecb_inline uint_fast64_t ecb_peek_u64_u (const void *ptr) { uint64_t v; memcpy (&v, ptr, sizeof (v)); return v; } + +ecb_inline uint_fast16_t ecb_peek_be_u16_u (const void *ptr) { return ecb_be_u16_to_host (ecb_peek_u16_u (ptr)); } +ecb_inline uint_fast32_t ecb_peek_be_u32_u (const void *ptr) { return ecb_be_u32_to_host (ecb_peek_u32_u (ptr)); } +ecb_inline uint_fast64_t ecb_peek_be_u64_u (const void *ptr) { return ecb_be_u64_to_host (ecb_peek_u64_u (ptr)); } + +ecb_inline uint_fast16_t ecb_peek_le_u16_u (const void *ptr) { return ecb_le_u16_to_host (ecb_peek_u16_u (ptr)); } +ecb_inline uint_fast32_t ecb_peek_le_u32_u (const void *ptr) { return ecb_le_u32_to_host (ecb_peek_u32_u (ptr)); } +ecb_inline uint_fast64_t ecb_peek_le_u64_u (const void *ptr) { return ecb_le_u64_to_host (ecb_peek_u64_u (ptr)); } + +ecb_inline uint_fast16_t ecb_host_to_be_u16 (uint_fast16_t v) { return ecb_little_endian () ? ecb_bswap16 (v) : v; } +ecb_inline uint_fast32_t ecb_host_to_be_u32 (uint_fast32_t v) { return ecb_little_endian () ? ecb_bswap32 (v) : v; } +ecb_inline uint_fast64_t ecb_host_to_be_u64 (uint_fast64_t v) { return ecb_little_endian () ? ecb_bswap64 (v) : v; } + +ecb_inline uint_fast16_t ecb_host_to_le_u16 (uint_fast16_t v) { return ecb_big_endian () ? ecb_bswap16 (v) : v; } +ecb_inline uint_fast32_t ecb_host_to_le_u32 (uint_fast32_t v) { return ecb_big_endian () ? ecb_bswap32 (v) : v; } +ecb_inline uint_fast64_t ecb_host_to_le_u64 (uint_fast64_t v) { return ecb_big_endian () ? ecb_bswap64 (v) : v; } + +ecb_inline void ecb_poke_u16_u (void *ptr, uint16_t v) { memcpy (ptr, &v, sizeof (v)); } +ecb_inline void ecb_poke_u32_u (void *ptr, uint32_t v) { memcpy (ptr, &v, sizeof (v)); } +ecb_inline void ecb_poke_u64_u (void *ptr, uint64_t v) { memcpy (ptr, &v, sizeof (v)); } + +ecb_inline void ecb_poke_be_u16_u (void *ptr, uint_fast16_t v) { ecb_poke_u16_u (ptr, ecb_host_to_be_u16 (v)); } +ecb_inline void ecb_poke_be_u32_u (void *ptr, uint_fast32_t v) { ecb_poke_u32_u (ptr, ecb_host_to_be_u32 (v)); } +ecb_inline void ecb_poke_be_u64_u (void *ptr, uint_fast64_t v) { ecb_poke_u64_u (ptr, ecb_host_to_be_u64 (v)); } + +ecb_inline void ecb_poke_le_u16_u (void *ptr, uint_fast16_t v) { ecb_poke_u16_u (ptr, ecb_host_to_le_u16 (v)); } +ecb_inline void ecb_poke_le_u32_u (void *ptr, uint_fast32_t v) { ecb_poke_u32_u (ptr, ecb_host_to_le_u32 (v)); } +ecb_inline void ecb_poke_le_u64_u (void *ptr, uint_fast64_t v) { ecb_poke_u64_u (ptr, ecb_host_to_le_u64 (v)); } + +#if ECB_CPP + +inline uint8_t ecb_bswap (uint8_t v) { return v; } +inline uint16_t ecb_bswap (uint16_t v) { return ecb_bswap16 (v); } +inline uint32_t ecb_bswap (uint32_t v) { return ecb_bswap32 (v); } +inline uint64_t ecb_bswap (uint64_t v) { return ecb_bswap64 (v); } + +template inline T ecb_be_to_host (T v) { return ecb_little_endian () ? ecb_bswap (v) : v; } +template inline T ecb_le_to_host (T v) { return ecb_big_endian () ? ecb_bswap (v) : v; } +template inline T ecb_peek (const void *ptr) { return *(const T *)ptr; } +template inline T ecb_peek_be (const void *ptr) { return ecb_be_to_host (ecb_peek (ptr)); } +template inline T ecb_peek_le (const void *ptr) { return ecb_le_to_host (ecb_peek (ptr)); } +template inline T ecb_peek_u (const void *ptr) { T v; memcpy (&v, ptr, sizeof (v)); return v; } +template inline T ecb_peek_be_u (const void *ptr) { return ecb_be_to_host (ecb_peek_u (ptr)); } +template inline T ecb_peek_le_u (const void *ptr) { return ecb_le_to_host (ecb_peek_u (ptr)); } + +template inline T ecb_host_to_be (T v) { return ecb_little_endian () ? ecb_bswap (v) : v; } +template inline T ecb_host_to_le (T v) { return ecb_big_endian () ? ecb_bswap (v) : v; } +template inline void ecb_poke (void *ptr, T v) { *(T *)ptr = v; } +template inline void ecb_poke_be (void *ptr, T v) { return ecb_poke (ptr, ecb_host_to_be (v)); } +template inline void ecb_poke_le (void *ptr, T v) { return ecb_poke (ptr, ecb_host_to_le (v)); } +template inline void ecb_poke_u (void *ptr, T v) { memcpy (ptr, &v, sizeof (v)); } +template inline void ecb_poke_be_u (void *ptr, T v) { return ecb_poke_u (ptr, ecb_host_to_be (v)); } +template inline void ecb_poke_le_u (void *ptr, T v) { return ecb_poke_u (ptr, ecb_host_to_le (v)); } + +#endif + +/*****************************************************************************/ + +#if ECB_GCC_VERSION(3,0) || ECB_C99 + #define ecb_mod(m,n) ((m) % (n) + ((m) % (n) < 0 ? (n) : 0)) +#else + #define ecb_mod(m,n) ((m) < 0 ? ((n) - 1 - ((-1 - (m)) % (n))) : ((m) % (n))) +#endif + +#if ECB_CPP + template + static inline T ecb_div_rd (T val, T div) + { + return val < 0 ? - ((-val + div - 1) / div) : (val ) / div; + } + template + static inline T ecb_div_ru (T val, T div) + { + return val < 0 ? - ((-val ) / div) : (val + div - 1) / div; + } +#else + #define ecb_div_rd(val,div) ((val) < 0 ? - ((-(val) + (div) - 1) / (div)) : ((val) ) / (div)) + #define ecb_div_ru(val,div) ((val) < 0 ? - ((-(val) ) / (div)) : ((val) + (div) - 1) / (div)) +#endif + +#if ecb_cplusplus_does_not_suck + /* does not work for local types (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm) */ + template + static inline int ecb_array_length (const T (&arr)[N]) + { + return N; + } +#else + #define ecb_array_length(name) (sizeof (name) / sizeof (name [0])) +#endif + +/*****************************************************************************/ + +ecb_function_ ecb_const uint32_t ecb_binary16_to_binary32 (uint32_t x); +ecb_function_ ecb_const uint32_t +ecb_binary16_to_binary32 (uint32_t x) +{ + unsigned int s = (x & 0x8000) << (31 - 15); + int e = (x >> 10) & 0x001f; + unsigned int m = x & 0x03ff; + + if (ecb_expect_false (e == 31)) + /* infinity or NaN */ + e = 255 - (127 - 15); + else if (ecb_expect_false (!e)) + { + if (ecb_expect_true (!m)) + /* zero, handled by code below by forcing e to 0 */ + e = 0 - (127 - 15); + else + { + /* subnormal, renormalise */ + unsigned int s = 10 - ecb_ld32 (m); + + m = (m << s) & 0x3ff; /* mask implicit bit */ + e -= s - 1; + } + } + + /* e and m now are normalised, or zero, (or inf or nan) */ + e += 127 - 15; + + return s | (e << 23) | (m << (23 - 10)); +} + +ecb_function_ ecb_const uint16_t ecb_binary32_to_binary16 (uint32_t x); +ecb_function_ ecb_const uint16_t +ecb_binary32_to_binary16 (uint32_t x) +{ + unsigned int s = (x >> 16) & 0x00008000; /* sign bit, the easy part */ + unsigned int e = ((x >> 23) & 0x000000ff) - (127 - 15); /* the desired exponent */ + unsigned int m = x & 0x007fffff; + + x &= 0x7fffffff; + + /* if it's within range of binary16 normals, use fast path */ + if (ecb_expect_true (0x38800000 <= x && x <= 0x477fefff)) + { + /* mantissa round-to-even */ + m += 0x00000fff + ((m >> (23 - 10)) & 1); + + /* handle overflow */ + if (ecb_expect_false (m >= 0x00800000)) + { + m >>= 1; + e += 1; + } + + return s | (e << 10) | (m >> (23 - 10)); + } + + /* handle large numbers and infinity */ + if (ecb_expect_true (0x477fefff < x && x <= 0x7f800000)) + return s | 0x7c00; + + /* handle zero, subnormals and small numbers */ + if (ecb_expect_true (x < 0x38800000)) + { + /* zero */ + if (ecb_expect_true (!x)) + return s; + + /* handle subnormals */ + + /* too small, will be zero */ + if (e < (14 - 24)) /* might not be sharp, but is good enough */ + return s; + + m |= 0x00800000; /* make implicit bit explicit */ + + /* very tricky - we need to round to the nearest e (+10) bit value */ + { + unsigned int bits = 14 - e; + unsigned int half = (1 << (bits - 1)) - 1; + unsigned int even = (m >> bits) & 1; + + /* if this overflows, we will end up with a normalised number */ + m = (m + half + even) >> bits; + } + + return s | m; + } + + /* handle NaNs, preserve leftmost nan bits, but make sure we don't turn them into infinities */ + m >>= 13; + + return s | 0x7c00 | m | !m; +} + +/*******************************************************************************/ +/* floating point stuff, can be disabled by defining ECB_NO_LIBM */ + +/* basically, everything uses "ieee pure-endian" floating point numbers */ +/* the only noteworthy exception is ancient armle, which uses order 43218765 */ +#if 0 \ + || __i386 || __i386__ \ + || ECB_GCC_AMD64 \ + || __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__ \ + || defined __s390__ || defined __s390x__ \ + || defined __mips__ \ + || defined __alpha__ \ + || defined __hppa__ \ + || defined __ia64__ \ + || defined __m68k__ \ + || defined __m88k__ \ + || defined __sh__ \ + || defined _M_IX86 || defined ECB_MSVC_AMD64 || defined _M_IA64 \ + || (defined __arm__ && (defined __ARM_EABI__ || defined __EABI__ || defined __VFP_FP__ || defined _WIN32_WCE || defined __ANDROID__)) \ + || defined __aarch64__ + #define ECB_STDFP 1 +#else + #define ECB_STDFP 0 +#endif + +#ifndef ECB_NO_LIBM + + #include /* for frexp*, ldexp*, INFINITY, NAN */ + + /* only the oldest of old doesn't have this one. solaris. */ + #ifdef INFINITY + #define ECB_INFINITY INFINITY + #else + #define ECB_INFINITY HUGE_VAL + #endif + + #ifdef NAN + #define ECB_NAN NAN + #else + #define ECB_NAN ECB_INFINITY + #endif + + #if ECB_C99 || _XOPEN_VERSION >= 600 || _POSIX_VERSION >= 200112L + #define ecb_ldexpf(x,e) ldexpf ((x), (e)) + #define ecb_frexpf(x,e) frexpf ((x), (e)) + #else + #define ecb_ldexpf(x,e) (float) ldexp ((double) (x), (e)) + #define ecb_frexpf(x,e) (float) frexp ((double) (x), (e)) + #endif + + /* convert a float to ieee single/binary32 */ + ecb_function_ ecb_const uint32_t ecb_float_to_binary32 (float x); + ecb_function_ ecb_const uint32_t + ecb_float_to_binary32 (float x) + { + uint32_t r; + + #if ECB_STDFP + memcpy (&r, &x, 4); + #else + /* slow emulation, works for anything but -0 */ + uint32_t m; + int e; + + if (x == 0e0f ) return 0x00000000U; + if (x > +3.40282346638528860e+38f) return 0x7f800000U; + if (x < -3.40282346638528860e+38f) return 0xff800000U; + if (x != x ) return 0x7fbfffffU; + + m = ecb_frexpf (x, &e) * 0x1000000U; + + r = m & 0x80000000U; + + if (r) + m = -m; + + if (e <= -126) + { + m &= 0xffffffU; + m >>= (-125 - e); + e = -126; + } + + r |= (e + 126) << 23; + r |= m & 0x7fffffU; + #endif + + return r; + } + + /* converts an ieee single/binary32 to a float */ + ecb_function_ ecb_const float ecb_binary32_to_float (uint32_t x); + ecb_function_ ecb_const float + ecb_binary32_to_float (uint32_t x) + { + float r; + + #if ECB_STDFP + memcpy (&r, &x, 4); + #else + /* emulation, only works for normals and subnormals and +0 */ + int neg = x >> 31; + int e = (x >> 23) & 0xffU; + + x &= 0x7fffffU; + + if (e) + x |= 0x800000U; + else + e = 1; + + /* we distrust ldexpf a bit and do the 2**-24 scaling by an extra multiply */ + r = ecb_ldexpf (x * (0.5f / 0x800000U), e - 126); + + r = neg ? -r : r; + #endif + + return r; + } + + /* convert a double to ieee double/binary64 */ + ecb_function_ ecb_const uint64_t ecb_double_to_binary64 (double x); + ecb_function_ ecb_const uint64_t + ecb_double_to_binary64 (double x) + { + uint64_t r; + + #if ECB_STDFP + memcpy (&r, &x, 8); + #else + /* slow emulation, works for anything but -0 */ + uint64_t m; + int e; + + if (x == 0e0 ) return 0x0000000000000000U; + if (x > +1.79769313486231470e+308) return 0x7ff0000000000000U; + if (x < -1.79769313486231470e+308) return 0xfff0000000000000U; + if (x != x ) return 0X7ff7ffffffffffffU; + + m = frexp (x, &e) * 0x20000000000000U; + + r = m & 0x8000000000000000;; + + if (r) + m = -m; + + if (e <= -1022) + { + m &= 0x1fffffffffffffU; + m >>= (-1021 - e); + e = -1022; + } + + r |= ((uint64_t)(e + 1022)) << 52; + r |= m & 0xfffffffffffffU; + #endif + + return r; + } + + /* converts an ieee double/binary64 to a double */ + ecb_function_ ecb_const double ecb_binary64_to_double (uint64_t x); + ecb_function_ ecb_const double + ecb_binary64_to_double (uint64_t x) + { + double r; + + #if ECB_STDFP + memcpy (&r, &x, 8); + #else + /* emulation, only works for normals and subnormals and +0 */ + int neg = x >> 63; + int e = (x >> 52) & 0x7ffU; + + x &= 0xfffffffffffffU; + + if (e) + x |= 0x10000000000000U; + else + e = 1; + + /* we distrust ldexp a bit and do the 2**-53 scaling by an extra multiply */ + r = ldexp (x * (0.5 / 0x10000000000000U), e - 1022); + + r = neg ? -r : r; + #endif + + return r; + } + + /* convert a float to ieee half/binary16 */ + ecb_function_ ecb_const uint16_t ecb_float_to_binary16 (float x); + ecb_function_ ecb_const uint16_t + ecb_float_to_binary16 (float x) + { + return ecb_binary32_to_binary16 (ecb_float_to_binary32 (x)); + } + + /* convert an ieee half/binary16 to float */ + ecb_function_ ecb_const float ecb_binary16_to_float (uint16_t x); + ecb_function_ ecb_const float + ecb_binary16_to_float (uint16_t x) + { + return ecb_binary32_to_float (ecb_binary16_to_binary32 (x)); + } + +#endif + +#endif + +/* ECB.H END */ + +#if ECB_MEMORY_FENCE_NEEDS_PTHREADS +/* if your architecture doesn't need memory fences, e.g. because it is + * single-cpu/core, or if you use libev in a project that doesn't use libev + * from multiple threads, then you can define ECB_NO_THREADS when compiling + * libev, in which cases the memory fences become nops. + * alternatively, you can remove this #error and link against libpthread, + * which will then provide the memory fences. + */ +# error "memory fences not defined for your architecture, please report" +#endif + +#ifndef ECB_MEMORY_FENCE +# define ECB_MEMORY_FENCE do { } while (0) +# define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE +# define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE +#endif + +#define inline_size ecb_inline + +#if EV_FEATURE_CODE +# define inline_speed ecb_inline +#else +# define inline_speed ecb_noinline static +#endif + +/*****************************************************************************/ +/* raw syscall wrappers */ + +#if EV_NEED_SYSCALL + +#include + +/* + * define some syscall wrappers for common architectures + * this is mostly for nice looks during debugging, not performance. + * our syscalls return < 0, not == -1, on error. which is good + * enough for linux aio. + * TODO: arm is also common nowadays, maybe even mips and x86 + * TODO: after implementing this, it suddenly looks like overkill, but its hard to remove... + */ +#if __GNUC__ && __linux && ECB_AMD64 && !EV_FEATURE_CODE + /* the costly errno access probably kills this for size optimisation */ + + #define ev_syscall(nr,narg,arg1,arg2,arg3,arg4,arg5,arg6) \ + ({ \ + long res; \ + register unsigned long r6 __asm__ ("r9" ); \ + register unsigned long r5 __asm__ ("r8" ); \ + register unsigned long r4 __asm__ ("r10"); \ + register unsigned long r3 __asm__ ("rdx"); \ + register unsigned long r2 __asm__ ("rsi"); \ + register unsigned long r1 __asm__ ("rdi"); \ + if (narg >= 6) r6 = (unsigned long)(arg6); \ + if (narg >= 5) r5 = (unsigned long)(arg5); \ + if (narg >= 4) r4 = (unsigned long)(arg4); \ + if (narg >= 3) r3 = (unsigned long)(arg3); \ + if (narg >= 2) r2 = (unsigned long)(arg2); \ + if (narg >= 1) r1 = (unsigned long)(arg1); \ + __asm__ __volatile__ ( \ + "syscall\n\t" \ + : "=a" (res) \ + : "0" (nr), "r" (r1), "r" (r2), "r" (r3), "r" (r4), "r" (r5) \ + : "cc", "r11", "cx", "memory"); \ + errno = -res; \ + res; \ + }) + +#endif + +#ifdef ev_syscall + #define ev_syscall0(nr) ev_syscall (nr, 0, 0, 0, 0, 0, 0, 0) + #define ev_syscall1(nr,arg1) ev_syscall (nr, 1, arg1, 0, 0, 0, 0, 0) + #define ev_syscall2(nr,arg1,arg2) ev_syscall (nr, 2, arg1, arg2, 0, 0, 0, 0) + #define ev_syscall3(nr,arg1,arg2,arg3) ev_syscall (nr, 3, arg1, arg2, arg3, 0, 0, 0) + #define ev_syscall4(nr,arg1,arg2,arg3,arg4) ev_syscall (nr, 3, arg1, arg2, arg3, arg4, 0, 0) + #define ev_syscall5(nr,arg1,arg2,arg3,arg4,arg5) ev_syscall (nr, 5, arg1, arg2, arg3, arg4, arg5, 0) + #define ev_syscall6(nr,arg1,arg2,arg3,arg4,arg5,arg6) ev_syscall (nr, 6, arg1, arg2, arg3, arg4, arg5,arg6) +#else + #define ev_syscall0(nr) syscall (nr) + #define ev_syscall1(nr,arg1) syscall (nr, arg1) + #define ev_syscall2(nr,arg1,arg2) syscall (nr, arg1, arg2) + #define ev_syscall3(nr,arg1,arg2,arg3) syscall (nr, arg1, arg2, arg3) + #define ev_syscall4(nr,arg1,arg2,arg3,arg4) syscall (nr, arg1, arg2, arg3, arg4) + #define ev_syscall5(nr,arg1,arg2,arg3,arg4,arg5) syscall (nr, arg1, arg2, arg3, arg4, arg5) + #define ev_syscall6(nr,arg1,arg2,arg3,arg4,arg5,arg6) syscall (nr, arg1, arg2, arg3, arg4, arg5,arg6) +#endif + +#endif + +/*****************************************************************************/ + +#define NUMPRI (EV_MAXPRI - EV_MINPRI + 1) + +#if EV_MINPRI == EV_MAXPRI +# define ABSPRI(w) (((W)w), 0) +#else +# define ABSPRI(w) (((W)w)->priority - EV_MINPRI) +#endif + +#define EMPTY /* required for microsofts broken pseudo-c compiler */ + +typedef ev_watcher *W; +typedef ev_watcher_list *WL; +typedef ev_watcher_time *WT; + +#define ev_active(w) ((W)(w))->active +#define ev_at(w) ((WT)(w))->at + +#if EV_USE_REALTIME +/* sig_atomic_t is used to avoid per-thread variables or locking but still */ +/* giving it a reasonably high chance of working on typical architectures */ +static EV_ATOMIC_T have_realtime; /* did clock_gettime (CLOCK_REALTIME) work? */ +#endif + +#if EV_USE_MONOTONIC +static EV_ATOMIC_T have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work? */ +#endif + +#ifndef EV_FD_TO_WIN32_HANDLE +# define EV_FD_TO_WIN32_HANDLE(fd) _get_osfhandle (fd) +#endif +#ifndef EV_WIN32_HANDLE_TO_FD +# define EV_WIN32_HANDLE_TO_FD(handle) _open_osfhandle (handle, 0) +#endif +#ifndef EV_WIN32_CLOSE_FD +# define EV_WIN32_CLOSE_FD(fd) close (fd) +#endif + +#ifdef _WIN32 +# include "ev_win32.c" +#endif + +/*****************************************************************************/ + +#if EV_USE_LINUXAIO +# include /* probably only needed for aio_context_t */ +#endif + +/* define a suitable floor function (only used by periodics atm) */ + +#if EV_USE_FLOOR +# include +# define ev_floor(v) floor (v) +#else + +#include + +/* a floor() replacement function, should be independent of ev_tstamp type */ +ecb_noinline +static ev_tstamp +ev_floor (ev_tstamp v) +{ + /* the choice of shift factor is not terribly important */ +#if FLT_RADIX != 2 /* assume FLT_RADIX == 10 */ + const ev_tstamp shift = sizeof (unsigned long) >= 8 ? 10000000000000000000. : 1000000000.; +#else + const ev_tstamp shift = sizeof (unsigned long) >= 8 ? 18446744073709551616. : 4294967296.; +#endif + + /* special treatment for negative arguments */ + if (ecb_expect_false (v < 0.)) + { + ev_tstamp f = -ev_floor (-v); + + return f - (f == v ? 0 : 1); + } + + /* argument too large for an unsigned long? then reduce it */ + if (ecb_expect_false (v >= shift)) + { + ev_tstamp f; + + if (v == v - 1.) + return v; /* very large numbers are assumed to be integer */ + + f = shift * ev_floor (v * (1. / shift)); + return f + ev_floor (v - f); + } + + /* fits into an unsigned long */ + return (unsigned long)v; +} + +#endif + +/*****************************************************************************/ + +#ifdef __linux +# include +#endif + +ecb_noinline ecb_cold +static unsigned int +ev_linux_version (void) +{ +#ifdef __linux + unsigned int v = 0; + struct utsname buf; + int i; + char *p = buf.release; + + if (uname (&buf)) + return 0; + + for (i = 3+1; --i; ) + { + unsigned int c = 0; + + for (;;) + { + if (*p >= '0' && *p <= '9') + c = c * 10 + *p++ - '0'; + else + { + p += *p == '.'; + break; + } + } + + v = (v << 8) | c; + } + + return v; +#else + return 0; +#endif +} + +/*****************************************************************************/ + +#if EV_AVOID_STDIO +ecb_noinline ecb_cold +static void +ev_printerr (const char *msg) +{ + write (STDERR_FILENO, msg, strlen (msg)); +} +#endif + +static void (*syserr_cb)(const char *msg) EV_NOEXCEPT; + +ecb_cold +void +ev_set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT +{ + syserr_cb = cb; +} + +ecb_noinline ecb_cold +static void +ev_syserr (const char *msg) +{ + if (!msg) + msg = "(libev) system error"; + + if (syserr_cb) + syserr_cb (msg); + else + { +#if EV_AVOID_STDIO + ev_printerr (msg); + ev_printerr (": "); + ev_printerr (strerror (errno)); + ev_printerr ("\n"); +#else + perror (msg); +#endif + abort (); + } +} + +static void * +ev_realloc_emul (void *ptr, size_t size) EV_NOEXCEPT +{ + /* some systems, notably openbsd and darwin, fail to properly + * implement realloc (x, 0) (as required by both ansi c-89 and + * the single unix specification, so work around them here. + * recently, also (at least) fedora and debian started breaking it, + * despite documenting it otherwise. + */ + + if (size) + return realloc (ptr, size); + + free (ptr); + return 0; +} + +static void *(*alloc)(void *ptr, size_t size) EV_NOEXCEPT = ev_realloc_emul; + +ecb_cold +void +ev_set_allocator (void *(*cb)(void *ptr, size_t size) EV_NOEXCEPT) EV_NOEXCEPT +{ + alloc = cb; +} + +inline_speed void * +ev_realloc (void *ptr, size_t size) +{ + ptr = alloc (ptr, size); + + if (!ptr && size) + { +#if EV_AVOID_STDIO + ev_printerr ("(libev) memory allocation failed, aborting.\n"); +#else + fprintf (stderr, "(libev) cannot allocate %ld bytes, aborting.", size); +#endif + abort (); + } + + return ptr; +} + +#define ev_malloc(size) ev_realloc (0, (size)) +#define ev_free(ptr) ev_realloc ((ptr), 0) + +/*****************************************************************************/ + +/* set in reify when reification needed */ +#define EV_ANFD_REIFY 1 + +/* file descriptor info structure */ +typedef struct +{ + WL head; + unsigned char events; /* the events watched for */ + unsigned char reify; /* flag set when this ANFD needs reification (EV_ANFD_REIFY, EV__IOFDSET) */ + unsigned char emask; /* some backends store the actual kernel mask in here */ + unsigned char eflags; /* flags field for use by backends */ +#if EV_USE_EPOLL + unsigned int egen; /* generation counter to counter epoll bugs */ +#endif +#if EV_SELECT_IS_WINSOCKET || EV_USE_IOCP + SOCKET handle; +#endif +#if EV_USE_IOCP + OVERLAPPED or, ow; +#endif +} ANFD; + +/* stores the pending event set for a given watcher */ +typedef struct +{ + W w; + int events; /* the pending event set for the given watcher */ +} ANPENDING; + +#if EV_USE_INOTIFY +/* hash table entry per inotify-id */ +typedef struct +{ + WL head; +} ANFS; +#endif + +/* Heap Entry */ +#if EV_HEAP_CACHE_AT + /* a heap element */ + typedef struct { + ev_tstamp at; + WT w; + } ANHE; + + #define ANHE_w(he) (he).w /* access watcher, read-write */ + #define ANHE_at(he) (he).at /* access cached at, read-only */ + #define ANHE_at_cache(he) (he).at = (he).w->at /* update at from watcher */ +#else + /* a heap element */ + typedef WT ANHE; + + #define ANHE_w(he) (he) + #define ANHE_at(he) (he)->at + #define ANHE_at_cache(he) +#endif + +#if EV_MULTIPLICITY + + struct ev_loop + { + ev_tstamp ev_rt_now; + #define ev_rt_now ((loop)->ev_rt_now) + #define VAR(name,decl) decl; + #include "ev_vars.h" + #undef VAR + }; + #include "ev_wrap.h" + + static struct ev_loop default_loop_struct; + EV_API_DECL struct ev_loop *ev_default_loop_ptr = 0; /* needs to be initialised to make it a definition despite extern */ + +#else + + EV_API_DECL ev_tstamp ev_rt_now = EV_TS_CONST (0.); /* needs to be initialised to make it a definition despite extern */ + #define VAR(name,decl) static decl; + #include "ev_vars.h" + #undef VAR + + static int ev_default_loop_ptr; + +#endif + +#if EV_FEATURE_API +# define EV_RELEASE_CB if (ecb_expect_false (release_cb)) release_cb (EV_A) +# define EV_ACQUIRE_CB if (ecb_expect_false (acquire_cb)) acquire_cb (EV_A) +# define EV_INVOKE_PENDING invoke_cb (EV_A) +#else +# define EV_RELEASE_CB (void)0 +# define EV_ACQUIRE_CB (void)0 +# define EV_INVOKE_PENDING ev_invoke_pending (EV_A) +#endif + +#define EVBREAK_RECURSE 0x80 + +/*****************************************************************************/ + +#ifndef EV_HAVE_EV_TIME +ev_tstamp +ev_time (void) EV_NOEXCEPT +{ +#if EV_USE_REALTIME + if (ecb_expect_true (have_realtime)) + { + struct timespec ts; + clock_gettime (CLOCK_REALTIME, &ts); + return EV_TS_GET (ts); + } +#endif + + { + struct timeval tv; + gettimeofday (&tv, 0); + return EV_TV_GET (tv); + } +} +#endif + +inline_size ev_tstamp +get_clock (void) +{ +#if EV_USE_MONOTONIC + if (ecb_expect_true (have_monotonic)) + { + struct timespec ts; + clock_gettime (CLOCK_MONOTONIC, &ts); + return EV_TS_GET (ts); + } +#endif + + return ev_time (); +} + +#if EV_MULTIPLICITY +ev_tstamp +ev_now (EV_P) EV_NOEXCEPT +{ + return ev_rt_now; +} +#endif + +void +ev_sleep (ev_tstamp delay) EV_NOEXCEPT +{ + if (delay > EV_TS_CONST (0.)) + { +#if EV_USE_NANOSLEEP + struct timespec ts; + + EV_TS_SET (ts, delay); + nanosleep (&ts, 0); +#elif defined _WIN32 + /* maybe this should round up, as ms is very low resolution */ + /* compared to select (µs) or nanosleep (ns) */ + Sleep ((unsigned long)(EV_TS_TO_MSEC (delay))); +#else + struct timeval tv; + + /* here we rely on sys/time.h + sys/types.h + unistd.h providing select */ + /* something not guaranteed by newer posix versions, but guaranteed */ + /* by older ones */ + EV_TV_SET (tv, delay); + select (0, 0, 0, 0, &tv); +#endif + } +} + +/*****************************************************************************/ + +#define MALLOC_ROUND 4096 /* prefer to allocate in chunks of this size, must be 2**n and >> 4 longs */ + +/* find a suitable new size for the given array, */ +/* hopefully by rounding to a nice-to-malloc size */ +inline_size int +array_nextsize (int elem, int cur, int cnt) +{ + int ncur = cur + 1; + + do + ncur <<= 1; + while (cnt > ncur); + + /* if size is large, round to MALLOC_ROUND - 4 * longs to accommodate malloc overhead */ + if (elem * ncur > MALLOC_ROUND - sizeof (void *) * 4) + { + ncur *= elem; + ncur = (ncur + elem + (MALLOC_ROUND - 1) + sizeof (void *) * 4) & ~(MALLOC_ROUND - 1); + ncur = ncur - sizeof (void *) * 4; + ncur /= elem; + } + + return ncur; +} + +ecb_noinline ecb_cold +static void * +array_realloc (int elem, void *base, int *cur, int cnt) +{ + *cur = array_nextsize (elem, *cur, cnt); + return ev_realloc (base, elem * *cur); +} + +#define array_needsize_noinit(base,offset,count) + +#define array_needsize_zerofill(base,offset,count) \ + memset ((void *)(base + offset), 0, sizeof (*(base)) * (count)) + +#define array_needsize(type,base,cur,cnt,init) \ + if (ecb_expect_false ((cnt) > (cur))) \ + { \ + ecb_unused int ocur_ = (cur); \ + (base) = (type *)array_realloc \ + (sizeof (type), (base), &(cur), (cnt)); \ + init ((base), ocur_, ((cur) - ocur_)); \ + } + +#if 0 +#define array_slim(type,stem) \ + if (stem ## max < array_roundsize (stem ## cnt >> 2)) \ + { \ + stem ## max = array_roundsize (stem ## cnt >> 1); \ + base = (type *)ev_realloc (base, sizeof (type) * (stem ## max));\ + fprintf (stderr, "slimmed down " # stem " to %d\n", stem ## max);/*D*/\ + } +#endif + +#define array_free(stem, idx) \ + ev_free (stem ## s idx); stem ## cnt idx = stem ## max idx = 0; stem ## s idx = 0 + +/*****************************************************************************/ + +/* dummy callback for pending events */ +ecb_noinline +static void +pendingcb (EV_P_ ev_prepare *w, int revents) +{ +} + +ecb_noinline +void +ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT +{ + W w_ = (W)w; + int pri = ABSPRI (w_); + + if (ecb_expect_false (w_->pending)) + pendings [pri][w_->pending - 1].events |= revents; + else + { + w_->pending = ++pendingcnt [pri]; + array_needsize (ANPENDING, pendings [pri], pendingmax [pri], w_->pending, array_needsize_noinit); + pendings [pri][w_->pending - 1].w = w_; + pendings [pri][w_->pending - 1].events = revents; + } + + pendingpri = NUMPRI - 1; +} + +inline_speed void +feed_reverse (EV_P_ W w) +{ + array_needsize (W, rfeeds, rfeedmax, rfeedcnt + 1, array_needsize_noinit); + rfeeds [rfeedcnt++] = w; +} + +inline_size void +feed_reverse_done (EV_P_ int revents) +{ + do + ev_feed_event (EV_A_ rfeeds [--rfeedcnt], revents); + while (rfeedcnt); +} + +inline_speed void +queue_events (EV_P_ W *events, int eventcnt, int type) +{ + int i; + + for (i = 0; i < eventcnt; ++i) + ev_feed_event (EV_A_ events [i], type); +} + +/*****************************************************************************/ + +inline_speed void +fd_event_nocheck (EV_P_ int fd, int revents) +{ + ANFD *anfd = anfds + fd; + ev_io *w; + + for (w = (ev_io *)anfd->head; w; w = (ev_io *)((WL)w)->next) + { + int ev = w->events & revents; + + if (ev) + ev_feed_event (EV_A_ (W)w, ev); + } +} + +/* do not submit kernel events for fds that have reify set */ +/* because that means they changed while we were polling for new events */ +inline_speed void +fd_event (EV_P_ int fd, int revents) +{ + ANFD *anfd = anfds + fd; + + if (ecb_expect_true (!anfd->reify)) + fd_event_nocheck (EV_A_ fd, revents); +} + +void +ev_feed_fd_event (EV_P_ int fd, int revents) EV_NOEXCEPT +{ + if (fd >= 0 && fd < anfdmax) + fd_event_nocheck (EV_A_ fd, revents); +} + +/* make sure the external fd watch events are in-sync */ +/* with the kernel/libev internal state */ +inline_size void +fd_reify (EV_P) +{ + int i; + + /* most backends do not modify the fdchanges list in backend_modfiy. + * except io_uring, which has fixed-size buffers which might force us + * to handle events in backend_modify, causing fdchanges to be amended, + * which could result in an endless loop. + * to avoid this, we do not dynamically handle fds that were added + * during fd_reify. that means that for those backends, fdchangecnt + * might be non-zero during poll, which must cause them to not block. + * to not put too much of a burden on other backends, this detail + * needs to be handled in the backend. + */ + int changecnt = fdchangecnt; + +#if EV_SELECT_IS_WINSOCKET || EV_USE_IOCP + for (i = 0; i < changecnt; ++i) + { + int fd = fdchanges [i]; + ANFD *anfd = anfds + fd; + + if (anfd->reify & EV__IOFDSET && anfd->head) + { + SOCKET handle = EV_FD_TO_WIN32_HANDLE (fd); + + if (handle != anfd->handle) + { + unsigned long arg; + + assert (("libev: only socket fds supported in this configuration", ioctlsocket (handle, FIONREAD, &arg) == 0)); + + /* handle changed, but fd didn't - we need to do it in two steps */ + backend_modify (EV_A_ fd, anfd->events, 0); + anfd->events = 0; + anfd->handle = handle; + } + } + } +#endif + + for (i = 0; i < changecnt; ++i) + { + int fd = fdchanges [i]; + ANFD *anfd = anfds + fd; + ev_io *w; + + unsigned char o_events = anfd->events; + unsigned char o_reify = anfd->reify; + + anfd->reify = 0; + + /*if (ecb_expect_true (o_reify & EV_ANFD_REIFY)) probably a deoptimisation */ + { + anfd->events = 0; + + for (w = (ev_io *)anfd->head; w; w = (ev_io *)((WL)w)->next) + anfd->events |= (unsigned char)w->events; + + if (o_events != anfd->events) + o_reify = EV__IOFDSET; /* actually |= */ + } + + if (o_reify & EV__IOFDSET) + backend_modify (EV_A_ fd, o_events, anfd->events); + } + + /* normally, fdchangecnt hasn't changed. if it has, then new fds have been added. + * this is a rare case (see beginning comment in this function), so we copy them to the + * front and hope the backend handles this case. + */ + if (ecb_expect_false (fdchangecnt != changecnt)) + memmove (fdchanges, fdchanges + changecnt, (fdchangecnt - changecnt) * sizeof (*fdchanges)); + + fdchangecnt -= changecnt; +} + +/* something about the given fd changed */ +inline_size +void +fd_change (EV_P_ int fd, int flags) +{ + unsigned char reify = anfds [fd].reify; + anfds [fd].reify = reify | flags; + + if (ecb_expect_true (!reify)) + { + ++fdchangecnt; + array_needsize (int, fdchanges, fdchangemax, fdchangecnt, array_needsize_noinit); + fdchanges [fdchangecnt - 1] = fd; + } +} + +/* the given fd is invalid/unusable, so make sure it doesn't hurt us anymore */ +inline_speed ecb_cold void +fd_kill (EV_P_ int fd) +{ + ev_io *w; + + while ((w = (ev_io *)anfds [fd].head)) + { + ev_io_stop (EV_A_ w); + ev_feed_event (EV_A_ (W)w, EV_ERROR | EV_READ | EV_WRITE); + } +} + +/* check whether the given fd is actually valid, for error recovery */ +inline_size ecb_cold int +fd_valid (int fd) +{ +#ifdef _WIN32 + return EV_FD_TO_WIN32_HANDLE (fd) != -1; +#else + return fcntl (fd, F_GETFD) != -1; +#endif +} + +/* called on EBADF to verify fds */ +ecb_noinline ecb_cold +static void +fd_ebadf (EV_P) +{ + int fd; + + for (fd = 0; fd < anfdmax; ++fd) + if (anfds [fd].events) + if (!fd_valid (fd) && errno == EBADF) + fd_kill (EV_A_ fd); +} + +/* called on ENOMEM in select/poll to kill some fds and retry */ +ecb_noinline ecb_cold +static void +fd_enomem (EV_P) +{ + int fd; + + for (fd = anfdmax; fd--; ) + if (anfds [fd].events) + { + fd_kill (EV_A_ fd); + break; + } +} + +/* usually called after fork if backend needs to re-arm all fds from scratch */ +ecb_noinline +static void +fd_rearm_all (EV_P) +{ + int fd; + + for (fd = 0; fd < anfdmax; ++fd) + if (anfds [fd].events) + { + anfds [fd].events = 0; + anfds [fd].emask = 0; + fd_change (EV_A_ fd, EV__IOFDSET | EV_ANFD_REIFY); + } +} + +/* used to prepare libev internal fd's */ +/* this is not fork-safe */ +inline_speed void +fd_intern (int fd) +{ +#ifdef _WIN32 + unsigned long arg = 1; + ioctlsocket (EV_FD_TO_WIN32_HANDLE (fd), FIONBIO, &arg); +#else + fcntl (fd, F_SETFD, FD_CLOEXEC); + fcntl (fd, F_SETFL, O_NONBLOCK); +#endif +} + +/*****************************************************************************/ + +/* + * the heap functions want a real array index. array index 0 is guaranteed to not + * be in-use at any time. the first heap entry is at array [HEAP0]. DHEAP gives + * the branching factor of the d-tree. + */ + +/* + * at the moment we allow libev the luxury of two heaps, + * a small-code-size 2-heap one and a ~1.5kb larger 4-heap + * which is more cache-efficient. + * the difference is about 5% with 50000+ watchers. + */ +#if EV_USE_4HEAP + +#define DHEAP 4 +#define HEAP0 (DHEAP - 1) /* index of first element in heap */ +#define HPARENT(k) ((((k) - HEAP0 - 1) / DHEAP) + HEAP0) +#define UPHEAP_DONE(p,k) ((p) == (k)) + +/* away from the root */ +inline_speed void +downheap (ANHE *heap, int N, int k) +{ + ANHE he = heap [k]; + ANHE *E = heap + N + HEAP0; + + for (;;) + { + ev_tstamp minat; + ANHE *minpos; + ANHE *pos = heap + DHEAP * (k - HEAP0) + HEAP0 + 1; + + /* find minimum child */ + if (ecb_expect_true (pos + DHEAP - 1 < E)) + { + /* fast path */ (minpos = pos + 0), (minat = ANHE_at (*minpos)); + if ( minat > ANHE_at (pos [1])) (minpos = pos + 1), (minat = ANHE_at (*minpos)); + if ( minat > ANHE_at (pos [2])) (minpos = pos + 2), (minat = ANHE_at (*minpos)); + if ( minat > ANHE_at (pos [3])) (minpos = pos + 3), (minat = ANHE_at (*minpos)); + } + else if (pos < E) + { + /* slow path */ (minpos = pos + 0), (minat = ANHE_at (*minpos)); + if (pos + 1 < E && minat > ANHE_at (pos [1])) (minpos = pos + 1), (minat = ANHE_at (*minpos)); + if (pos + 2 < E && minat > ANHE_at (pos [2])) (minpos = pos + 2), (minat = ANHE_at (*minpos)); + if (pos + 3 < E && minat > ANHE_at (pos [3])) (minpos = pos + 3), (minat = ANHE_at (*minpos)); + } + else + break; + + if (ANHE_at (he) <= minat) + break; + + heap [k] = *minpos; + ev_active (ANHE_w (*minpos)) = k; + + k = minpos - heap; + } + + heap [k] = he; + ev_active (ANHE_w (he)) = k; +} + +#else /* not 4HEAP */ + +#define HEAP0 1 +#define HPARENT(k) ((k) >> 1) +#define UPHEAP_DONE(p,k) (!(p)) + +/* away from the root */ +inline_speed void +downheap (ANHE *heap, int N, int k) +{ + ANHE he = heap [k]; + + for (;;) + { + int c = k << 1; + + if (c >= N + HEAP0) + break; + + c += c + 1 < N + HEAP0 && ANHE_at (heap [c]) > ANHE_at (heap [c + 1]) + ? 1 : 0; + + if (ANHE_at (he) <= ANHE_at (heap [c])) + break; + + heap [k] = heap [c]; + ev_active (ANHE_w (heap [k])) = k; + + k = c; + } + + heap [k] = he; + ev_active (ANHE_w (he)) = k; +} +#endif + +/* towards the root */ +inline_speed void +upheap (ANHE *heap, int k) +{ + ANHE he = heap [k]; + + for (;;) + { + int p = HPARENT (k); + + if (UPHEAP_DONE (p, k) || ANHE_at (heap [p]) <= ANHE_at (he)) + break; + + heap [k] = heap [p]; + ev_active (ANHE_w (heap [k])) = k; + k = p; + } + + heap [k] = he; + ev_active (ANHE_w (he)) = k; +} + +/* move an element suitably so it is in a correct place */ +inline_size void +adjustheap (ANHE *heap, int N, int k) +{ + if (k > HEAP0 && ANHE_at (heap [k]) <= ANHE_at (heap [HPARENT (k)])) + upheap (heap, k); + else + downheap (heap, N, k); +} + +/* rebuild the heap: this function is used only once and executed rarely */ +inline_size void +reheap (ANHE *heap, int N) +{ + int i; + + /* we don't use floyds algorithm, upheap is simpler and is more cache-efficient */ + /* also, this is easy to implement and correct for both 2-heaps and 4-heaps */ + for (i = 0; i < N; ++i) + upheap (heap, i + HEAP0); +} + +/*****************************************************************************/ + +/* associate signal watchers to a signal */ +typedef struct +{ + EV_ATOMIC_T pending; +#if EV_MULTIPLICITY + EV_P; +#endif + WL head; +} ANSIG; + +static ANSIG signals [EV_NSIG - 1]; + +/*****************************************************************************/ + +#if EV_SIGNAL_ENABLE || EV_ASYNC_ENABLE + +ecb_noinline ecb_cold +static void +evpipe_init (EV_P) +{ + if (!ev_is_active (&pipe_w)) + { + int fds [2]; + +# if EV_USE_EVENTFD + fds [0] = -1; + fds [1] = eventfd (0, EFD_NONBLOCK | EFD_CLOEXEC); + if (fds [1] < 0 && errno == EINVAL) + fds [1] = eventfd (0, 0); + + if (fds [1] < 0) +# endif + { + while (pipe (fds)) + ev_syserr ("(libev) error creating signal/async pipe"); + + fd_intern (fds [0]); + } + + evpipe [0] = fds [0]; + + if (evpipe [1] < 0) + evpipe [1] = fds [1]; /* first call, set write fd */ + else + { + /* on subsequent calls, do not change evpipe [1] */ + /* so that evpipe_write can always rely on its value. */ + /* this branch does not do anything sensible on windows, */ + /* so must not be executed on windows */ + + dup2 (fds [1], evpipe [1]); + close (fds [1]); + } + + fd_intern (evpipe [1]); + + ev_io_set (&pipe_w, evpipe [0] < 0 ? evpipe [1] : evpipe [0], EV_READ); + ev_io_start (EV_A_ &pipe_w); + ev_unref (EV_A); /* watcher should not keep loop alive */ + } +} + +inline_speed void +evpipe_write (EV_P_ EV_ATOMIC_T *flag) +{ + ECB_MEMORY_FENCE; /* push out the write before this function was called, acquire flag */ + + if (ecb_expect_true (*flag)) + return; + + *flag = 1; + ECB_MEMORY_FENCE_RELEASE; /* make sure flag is visible before the wakeup */ + + pipe_write_skipped = 1; + + ECB_MEMORY_FENCE; /* make sure pipe_write_skipped is visible before we check pipe_write_wanted */ + + if (pipe_write_wanted) + { + int old_errno; + + pipe_write_skipped = 0; + ECB_MEMORY_FENCE_RELEASE; + + old_errno = errno; /* save errno because write will clobber it */ + +#if EV_USE_EVENTFD + if (evpipe [0] < 0) + { + uint64_t counter = 1; + write (evpipe [1], &counter, sizeof (uint64_t)); + } + else +#endif + { +#ifdef _WIN32 + WSABUF buf; + DWORD sent; + buf.buf = (char *)&buf; + buf.len = 1; + WSASend (EV_FD_TO_WIN32_HANDLE (evpipe [1]), &buf, 1, &sent, 0, 0, 0); +#else + write (evpipe [1], &(evpipe [1]), 1); +#endif + } + + errno = old_errno; + } +} + +/* called whenever the libev signal pipe */ +/* got some events (signal, async) */ +static void +pipecb (EV_P_ ev_io *iow, int revents) +{ + int i; + + if (revents & EV_READ) + { +#if EV_USE_EVENTFD + if (evpipe [0] < 0) + { + uint64_t counter; + read (evpipe [1], &counter, sizeof (uint64_t)); + } + else +#endif + { + char dummy[4]; +#ifdef _WIN32 + WSABUF buf; + DWORD recvd; + DWORD flags = 0; + buf.buf = dummy; + buf.len = sizeof (dummy); + WSARecv (EV_FD_TO_WIN32_HANDLE (evpipe [0]), &buf, 1, &recvd, &flags, 0, 0); +#else + read (evpipe [0], &dummy, sizeof (dummy)); +#endif + } + } + + pipe_write_skipped = 0; + + ECB_MEMORY_FENCE; /* push out skipped, acquire flags */ + +#if EV_SIGNAL_ENABLE + if (sig_pending) + { + sig_pending = 0; + + ECB_MEMORY_FENCE; + + for (i = EV_NSIG - 1; i--; ) + if (ecb_expect_false (signals [i].pending)) + ev_feed_signal_event (EV_A_ i + 1); + } +#endif + +#if EV_ASYNC_ENABLE + if (async_pending) + { + async_pending = 0; + + ECB_MEMORY_FENCE; + + for (i = asynccnt; i--; ) + if (asyncs [i]->sent) + { + asyncs [i]->sent = 0; + ECB_MEMORY_FENCE_RELEASE; + ev_feed_event (EV_A_ asyncs [i], EV_ASYNC); + } + } +#endif +} + +/*****************************************************************************/ + +void +ev_feed_signal (int signum) EV_NOEXCEPT +{ +#if EV_MULTIPLICITY + EV_P; + ECB_MEMORY_FENCE_ACQUIRE; + EV_A = signals [signum - 1].loop; + + if (!EV_A) + return; +#endif + + signals [signum - 1].pending = 1; + evpipe_write (EV_A_ &sig_pending); +} + +static void +ev_sighandler (int signum) +{ +#ifdef _WIN32 + signal (signum, ev_sighandler); +#endif + + ev_feed_signal (signum); +} + +ecb_noinline +void +ev_feed_signal_event (EV_P_ int signum) EV_NOEXCEPT +{ + WL w; + + if (ecb_expect_false (signum <= 0 || signum >= EV_NSIG)) + return; + + --signum; + +#if EV_MULTIPLICITY + /* it is permissible to try to feed a signal to the wrong loop */ + /* or, likely more useful, feeding a signal nobody is waiting for */ + + if (ecb_expect_false (signals [signum].loop != EV_A)) + return; +#endif + + signals [signum].pending = 0; + ECB_MEMORY_FENCE_RELEASE; + + for (w = signals [signum].head; w; w = w->next) + ev_feed_event (EV_A_ (W)w, EV_SIGNAL); +} + +#if EV_USE_SIGNALFD +static void +sigfdcb (EV_P_ ev_io *iow, int revents) +{ + struct signalfd_siginfo si[2], *sip; /* these structs are big */ + + for (;;) + { + ssize_t res = read (sigfd, si, sizeof (si)); + + /* not ISO-C, as res might be -1, but works with SuS */ + for (sip = si; (char *)sip < (char *)si + res; ++sip) + ev_feed_signal_event (EV_A_ sip->ssi_signo); + + if (res < (ssize_t)sizeof (si)) + break; + } +} +#endif + +#endif + +/*****************************************************************************/ + +#if EV_CHILD_ENABLE +static WL childs [EV_PID_HASHSIZE]; + +static ev_signal childev; + +#ifndef WIFCONTINUED +# define WIFCONTINUED(status) 0 +#endif + +/* handle a single child status event */ +inline_speed void +child_reap (EV_P_ int chain, int pid, int status) +{ + ev_child *w; + int traced = WIFSTOPPED (status) || WIFCONTINUED (status); + + for (w = (ev_child *)childs [chain & ((EV_PID_HASHSIZE) - 1)]; w; w = (ev_child *)((WL)w)->next) + { + if ((w->pid == pid || !w->pid) + && (!traced || (w->flags & 1))) + { + ev_set_priority (w, EV_MAXPRI); /* need to do it *now*, this *must* be the same prio as the signal watcher itself */ + w->rpid = pid; + w->rstatus = status; + ev_feed_event (EV_A_ (W)w, EV_CHILD); + } + } +} + +#ifndef WCONTINUED +# define WCONTINUED 0 +#endif + +/* called on sigchld etc., calls waitpid */ +static void +childcb (EV_P_ ev_signal *sw, int revents) +{ + int pid, status; + + /* some systems define WCONTINUED but then fail to support it (linux 2.4) */ + if (0 >= (pid = waitpid (-1, &status, WNOHANG | WUNTRACED | WCONTINUED))) + if (!WCONTINUED + || errno != EINVAL + || 0 >= (pid = waitpid (-1, &status, WNOHANG | WUNTRACED))) + return; + + /* make sure we are called again until all children have been reaped */ + /* we need to do it this way so that the callback gets called before we continue */ + ev_feed_event (EV_A_ (W)sw, EV_SIGNAL); + + child_reap (EV_A_ pid, pid, status); + if ((EV_PID_HASHSIZE) > 1) + child_reap (EV_A_ 0, pid, status); /* this might trigger a watcher twice, but feed_event catches that */ +} + +#endif + +/*****************************************************************************/ + +#if EV_USE_TIMERFD + +static void periodics_reschedule (EV_P); + +static void +timerfdcb (EV_P_ ev_io *iow, int revents) +{ + struct itimerspec its = { 0 }; + + its.it_value.tv_sec = ev_rt_now + (int)MAX_BLOCKTIME2; + timerfd_settime (timerfd, TFD_TIMER_ABSTIME | TFD_TIMER_CANCEL_ON_SET, &its, 0); + + ev_rt_now = ev_time (); + /* periodics_reschedule only needs ev_rt_now */ + /* but maybe in the future we want the full treatment. */ + /* + now_floor = EV_TS_CONST (0.); + time_update (EV_A_ EV_TSTAMP_HUGE); + */ +#if EV_PERIODIC_ENABLE + periodics_reschedule (EV_A); +#endif +} + +ecb_noinline ecb_cold +static void +evtimerfd_init (EV_P) +{ + if (!ev_is_active (&timerfd_w)) + { + timerfd = timerfd_create (CLOCK_REALTIME, TFD_NONBLOCK | TFD_CLOEXEC); + + if (timerfd >= 0) + { + fd_intern (timerfd); /* just to be sure */ + + ev_io_init (&timerfd_w, timerfdcb, timerfd, EV_READ); + ev_set_priority (&timerfd_w, EV_MINPRI); + ev_io_start (EV_A_ &timerfd_w); + ev_unref (EV_A); /* watcher should not keep loop alive */ + + /* (re-) arm timer */ + timerfdcb (EV_A_ 0, 0); + } + } +} + +#endif + +/*****************************************************************************/ + +#if EV_USE_IOCP +# include "ev_iocp.c" +#endif +#if EV_USE_PORT +# include "ev_port.c" +#endif +#if EV_USE_KQUEUE +# include "ev_kqueue.c" +#endif +#if EV_USE_EPOLL +# include "ev_epoll.c" +#endif +#if EV_USE_LINUXAIO +# include "ev_linuxaio.c" +#endif +#if EV_USE_IOURING +# include "ev_iouring.c" +#endif +#if EV_USE_POLL +# include "ev_poll.c" +#endif +#if EV_USE_SELECT +# include "ev_select.c" +#endif + +ecb_cold int +ev_version_major (void) EV_NOEXCEPT +{ + return EV_VERSION_MAJOR; +} + +ecb_cold int +ev_version_minor (void) EV_NOEXCEPT +{ + return EV_VERSION_MINOR; +} + +/* return true if we are running with elevated privileges and should ignore env variables */ +inline_size ecb_cold int +enable_secure (void) +{ +#ifdef _WIN32 + return 0; +#else + return getuid () != geteuid () + || getgid () != getegid (); +#endif +} + +ecb_cold +unsigned int +ev_supported_backends (void) EV_NOEXCEPT +{ + unsigned int flags = 0; + + if (EV_USE_PORT ) flags |= EVBACKEND_PORT; + if (EV_USE_KQUEUE ) flags |= EVBACKEND_KQUEUE; + if (EV_USE_EPOLL ) flags |= EVBACKEND_EPOLL; + if (EV_USE_LINUXAIO && ev_linux_version () >= 0x041300) flags |= EVBACKEND_LINUXAIO; /* 4.19+ */ + if (EV_USE_IOURING && ev_linux_version () >= 0x050601 ) flags |= EVBACKEND_IOURING; /* 5.6.1+ */ + if (EV_USE_POLL ) flags |= EVBACKEND_POLL; + if (EV_USE_SELECT ) flags |= EVBACKEND_SELECT; + + return flags; +} + +ecb_cold +unsigned int +ev_recommended_backends (void) EV_NOEXCEPT +{ + unsigned int flags = ev_supported_backends (); + +/* apple has a poor track record but post 10.12.2 it seems to work sufficiently well */ +#if defined(__APPLE__) && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_14) + /* only select works correctly on that "unix-certified" platform */ + flags &= ~EVBACKEND_KQUEUE; /* horribly broken, even for sockets */ + flags &= ~EVBACKEND_POLL; /* poll is based on kqueue from 10.5 onwards */ +#endif + +#if !defined(__NetBSD__) && !defined(__APPLE__) + /* kqueue is borked on everything but netbsd and osx >= 10.12.2 apparently */ + /* it usually doesn't work correctly on anything but sockets and pipes */ + flags &= ~EVBACKEND_KQUEUE; +#endif + +#ifdef __FreeBSD__ + flags &= ~EVBACKEND_POLL; /* poll return value is unusable (http://forums.freebsd.org/archive/index.php/t-10270.html) */ +#endif + +#ifdef __linux__ + /* NOTE: linuxaio is very experimental, never recommend */ + flags &= ~EVBACKEND_LINUXAIO; + + /* NOTE: io_uring is super experimental, never recommend */ + flags &= ~EVBACKEND_IOURING; +#endif + + return flags; +} + +ecb_cold +unsigned int +ev_embeddable_backends (void) EV_NOEXCEPT +{ + int flags = EVBACKEND_EPOLL | EVBACKEND_KQUEUE | EVBACKEND_PORT | EVBACKEND_IOURING; + + /* epoll embeddability broken on all linux versions up to at least 2.6.23 */ + if (ev_linux_version () < 0x020620) /* disable it on linux < 2.6.32 */ + flags &= ~EVBACKEND_EPOLL; + + /* EVBACKEND_LINUXAIO is theoretically embeddable, but suffers from a performance overhead */ + + return flags; +} + +unsigned int +ev_backend (EV_P) EV_NOEXCEPT +{ + return backend; +} + +#if EV_FEATURE_API +unsigned int +ev_iteration (EV_P) EV_NOEXCEPT +{ + return loop_count; +} + +unsigned int +ev_depth (EV_P) EV_NOEXCEPT +{ + return loop_depth; +} + +void +ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT +{ + io_blocktime = interval; +} + +void +ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT +{ + timeout_blocktime = interval; +} + +void +ev_set_userdata (EV_P_ void *data) EV_NOEXCEPT +{ + userdata = data; +} + +void * +ev_userdata (EV_P) EV_NOEXCEPT +{ + return userdata; +} + +void +ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_NOEXCEPT +{ + invoke_cb = invoke_pending_cb; +} + +void +ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_NOEXCEPT, void (*acquire)(EV_P) EV_NOEXCEPT) EV_NOEXCEPT +{ + release_cb = release; + acquire_cb = acquire; +} +#endif + +/* initialise a loop structure, must be zero-initialised */ +ecb_noinline ecb_cold +static void +loop_init (EV_P_ unsigned int flags) EV_NOEXCEPT +{ + if (!backend) + { + origflags = flags; + +#if EV_USE_REALTIME + if (!have_realtime) + { + struct timespec ts; + + if (!clock_gettime (CLOCK_REALTIME, &ts)) + have_realtime = 1; + } +#endif + +#if EV_USE_MONOTONIC + if (!have_monotonic) + { + struct timespec ts; + + if (!clock_gettime (CLOCK_MONOTONIC, &ts)) + have_monotonic = 1; + } +#endif + + /* pid check not overridable via env */ +#ifndef _WIN32 + if (flags & EVFLAG_FORKCHECK) + curpid = getpid (); +#endif + + if (!(flags & EVFLAG_NOENV) + && !enable_secure () + && getenv ("LIBEV_FLAGS")) + flags = atoi (getenv ("LIBEV_FLAGS")); + + ev_rt_now = ev_time (); + mn_now = get_clock (); + now_floor = mn_now; + rtmn_diff = ev_rt_now - mn_now; +#if EV_FEATURE_API + invoke_cb = ev_invoke_pending; +#endif + + io_blocktime = 0.; + timeout_blocktime = 0.; + backend = 0; + backend_fd = -1; + sig_pending = 0; +#if EV_ASYNC_ENABLE + async_pending = 0; +#endif + pipe_write_skipped = 0; + pipe_write_wanted = 0; + evpipe [0] = -1; + evpipe [1] = -1; +#if EV_USE_INOTIFY + fs_fd = flags & EVFLAG_NOINOTIFY ? -1 : -2; +#endif +#if EV_USE_SIGNALFD + sigfd = flags & EVFLAG_SIGNALFD ? -2 : -1; +#endif +#if EV_USE_TIMERFD + timerfd = flags & EVFLAG_NOTIMERFD ? -1 : -2; +#endif + + if (!(flags & EVBACKEND_MASK)) + flags |= ev_recommended_backends (); + +#if EV_USE_IOCP + if (!backend && (flags & EVBACKEND_IOCP )) backend = iocp_init (EV_A_ flags); +#endif +#if EV_USE_PORT + if (!backend && (flags & EVBACKEND_PORT )) backend = port_init (EV_A_ flags); +#endif +#if EV_USE_KQUEUE + if (!backend && (flags & EVBACKEND_KQUEUE )) backend = kqueue_init (EV_A_ flags); +#endif +#if EV_USE_IOURING + if (!backend && (flags & EVBACKEND_IOURING )) backend = iouring_init (EV_A_ flags); +#endif +#if EV_USE_LINUXAIO + if (!backend && (flags & EVBACKEND_LINUXAIO)) backend = linuxaio_init (EV_A_ flags); +#endif +#if EV_USE_EPOLL + if (!backend && (flags & EVBACKEND_EPOLL )) backend = epoll_init (EV_A_ flags); +#endif +#if EV_USE_POLL + if (!backend && (flags & EVBACKEND_POLL )) backend = poll_init (EV_A_ flags); +#endif +#if EV_USE_SELECT + if (!backend && (flags & EVBACKEND_SELECT )) backend = select_init (EV_A_ flags); +#endif + + ev_prepare_init (&pending_w, pendingcb); + +#if EV_SIGNAL_ENABLE || EV_ASYNC_ENABLE + ev_init (&pipe_w, pipecb); + ev_set_priority (&pipe_w, EV_MAXPRI); +#endif + } +} + +/* free up a loop structure */ +ecb_cold +void +ev_loop_destroy (EV_P) +{ + int i; + +#if EV_MULTIPLICITY + /* mimic free (0) */ + if (!EV_A) + return; +#endif + +#if EV_CLEANUP_ENABLE + /* queue cleanup watchers (and execute them) */ + if (ecb_expect_false (cleanupcnt)) + { + queue_events (EV_A_ (W *)cleanups, cleanupcnt, EV_CLEANUP); + EV_INVOKE_PENDING; + } +#endif + +#if EV_CHILD_ENABLE + if (ev_is_default_loop (EV_A) && ev_is_active (&childev)) + { + ev_ref (EV_A); /* child watcher */ + ev_signal_stop (EV_A_ &childev); + } +#endif + + if (ev_is_active (&pipe_w)) + { + /*ev_ref (EV_A);*/ + /*ev_io_stop (EV_A_ &pipe_w);*/ + + if (evpipe [0] >= 0) EV_WIN32_CLOSE_FD (evpipe [0]); + if (evpipe [1] >= 0) EV_WIN32_CLOSE_FD (evpipe [1]); + } + +#if EV_USE_SIGNALFD + if (ev_is_active (&sigfd_w)) + close (sigfd); +#endif + +#if EV_USE_TIMERFD + if (ev_is_active (&timerfd_w)) + close (timerfd); +#endif + +#if EV_USE_INOTIFY + if (fs_fd >= 0) + close (fs_fd); +#endif + + if (backend_fd >= 0) + close (backend_fd); + +#if EV_USE_IOCP + if (backend == EVBACKEND_IOCP ) iocp_destroy (EV_A); +#endif +#if EV_USE_PORT + if (backend == EVBACKEND_PORT ) port_destroy (EV_A); +#endif +#if EV_USE_KQUEUE + if (backend == EVBACKEND_KQUEUE ) kqueue_destroy (EV_A); +#endif +#if EV_USE_IOURING + if (backend == EVBACKEND_IOURING ) iouring_destroy (EV_A); +#endif +#if EV_USE_LINUXAIO + if (backend == EVBACKEND_LINUXAIO) linuxaio_destroy (EV_A); +#endif +#if EV_USE_EPOLL + if (backend == EVBACKEND_EPOLL ) epoll_destroy (EV_A); +#endif +#if EV_USE_POLL + if (backend == EVBACKEND_POLL ) poll_destroy (EV_A); +#endif +#if EV_USE_SELECT + if (backend == EVBACKEND_SELECT ) select_destroy (EV_A); +#endif + + for (i = NUMPRI; i--; ) + { + array_free (pending, [i]); +#if EV_IDLE_ENABLE + array_free (idle, [i]); +#endif + } + + ev_free (anfds); anfds = 0; anfdmax = 0; + + /* have to use the microsoft-never-gets-it-right macro */ + array_free (rfeed, EMPTY); + array_free (fdchange, EMPTY); + array_free (timer, EMPTY); +#if EV_PERIODIC_ENABLE + array_free (periodic, EMPTY); +#endif +#if EV_FORK_ENABLE + array_free (fork, EMPTY); +#endif +#if EV_CLEANUP_ENABLE + array_free (cleanup, EMPTY); +#endif + array_free (prepare, EMPTY); + array_free (check, EMPTY); +#if EV_ASYNC_ENABLE + array_free (async, EMPTY); +#endif + + backend = 0; + +#if EV_MULTIPLICITY + if (ev_is_default_loop (EV_A)) +#endif + ev_default_loop_ptr = 0; +#if EV_MULTIPLICITY + else + ev_free (EV_A); +#endif +} + +#if EV_USE_INOTIFY +inline_size void infy_fork (EV_P); +#endif + +inline_size void +loop_fork (EV_P) +{ +#if EV_USE_PORT + if (backend == EVBACKEND_PORT ) port_fork (EV_A); +#endif +#if EV_USE_KQUEUE + if (backend == EVBACKEND_KQUEUE ) kqueue_fork (EV_A); +#endif +#if EV_USE_IOURING + if (backend == EVBACKEND_IOURING ) iouring_fork (EV_A); +#endif +#if EV_USE_LINUXAIO + if (backend == EVBACKEND_LINUXAIO) linuxaio_fork (EV_A); +#endif +#if EV_USE_EPOLL + if (backend == EVBACKEND_EPOLL ) epoll_fork (EV_A); +#endif +#if EV_USE_INOTIFY + infy_fork (EV_A); +#endif + + if (postfork != 2) + { + #if EV_USE_SIGNALFD + /* surprisingly, nothing needs to be done for signalfd, accoridng to docs, it does the right thing on fork */ + #endif + + #if EV_USE_TIMERFD + if (ev_is_active (&timerfd_w)) + { + ev_ref (EV_A); + ev_io_stop (EV_A_ &timerfd_w); + + close (timerfd); + timerfd = -2; + + evtimerfd_init (EV_A); + /* reschedule periodics, in case we missed something */ + ev_feed_event (EV_A_ &timerfd_w, EV_CUSTOM); + } + #endif + + #if EV_SIGNAL_ENABLE || EV_ASYNC_ENABLE + if (ev_is_active (&pipe_w)) + { + /* pipe_write_wanted must be false now, so modifying fd vars should be safe */ + + ev_ref (EV_A); + ev_io_stop (EV_A_ &pipe_w); + + if (evpipe [0] >= 0) + EV_WIN32_CLOSE_FD (evpipe [0]); + + evpipe_init (EV_A); + /* iterate over everything, in case we missed something before */ + ev_feed_event (EV_A_ &pipe_w, EV_CUSTOM); + } + #endif + } + + postfork = 0; +} + +#if EV_MULTIPLICITY + +ecb_cold +struct ev_loop * +ev_loop_new (unsigned int flags) EV_NOEXCEPT +{ + EV_P = (struct ev_loop *)ev_malloc (sizeof (struct ev_loop)); + + memset (EV_A, 0, sizeof (struct ev_loop)); + loop_init (EV_A_ flags); + + if (ev_backend (EV_A)) + return EV_A; + + ev_free (EV_A); + return 0; +} + +#endif /* multiplicity */ + +#if EV_VERIFY +ecb_noinline ecb_cold +static void +verify_watcher (EV_P_ W w) +{ + assert (("libev: watcher has invalid priority", ABSPRI (w) >= 0 && ABSPRI (w) < NUMPRI)); + + if (w->pending) + assert (("libev: pending watcher not on pending queue", pendings [ABSPRI (w)][w->pending - 1].w == w)); +} + +ecb_noinline ecb_cold +static void +verify_heap (EV_P_ ANHE *heap, int N) +{ + int i; + + for (i = HEAP0; i < N + HEAP0; ++i) + { + assert (("libev: active index mismatch in heap", ev_active (ANHE_w (heap [i])) == i)); + assert (("libev: heap condition violated", i == HEAP0 || ANHE_at (heap [HPARENT (i)]) <= ANHE_at (heap [i]))); + assert (("libev: heap at cache mismatch", ANHE_at (heap [i]) == ev_at (ANHE_w (heap [i])))); + + verify_watcher (EV_A_ (W)ANHE_w (heap [i])); + } +} + +ecb_noinline ecb_cold +static void +array_verify (EV_P_ W *ws, int cnt) +{ + while (cnt--) + { + assert (("libev: active index mismatch", ev_active (ws [cnt]) == cnt + 1)); + verify_watcher (EV_A_ ws [cnt]); + } +} +#endif + +#if EV_FEATURE_API +void ecb_cold +ev_verify (EV_P) EV_NOEXCEPT +{ +#if EV_VERIFY + int i; + WL w, w2; + + assert (activecnt >= -1); + + assert (fdchangemax >= fdchangecnt); + for (i = 0; i < fdchangecnt; ++i) + assert (("libev: negative fd in fdchanges", fdchanges [i] >= 0)); + + assert (anfdmax >= 0); + for (i = 0; i < anfdmax; ++i) + { + int j = 0; + + for (w = w2 = anfds [i].head; w; w = w->next) + { + verify_watcher (EV_A_ (W)w); + + if (j++ & 1) + { + assert (("libev: io watcher list contains a loop", w != w2)); + w2 = w2->next; + } + + assert (("libev: inactive fd watcher on anfd list", ev_active (w) == 1)); + assert (("libev: fd mismatch between watcher and anfd", ((ev_io *)w)->fd == i)); + } + } + + assert (timermax >= timercnt); + verify_heap (EV_A_ timers, timercnt); + +#if EV_PERIODIC_ENABLE + assert (periodicmax >= periodiccnt); + verify_heap (EV_A_ periodics, periodiccnt); +#endif + + for (i = NUMPRI; i--; ) + { + assert (pendingmax [i] >= pendingcnt [i]); +#if EV_IDLE_ENABLE + assert (idleall >= 0); + assert (idlemax [i] >= idlecnt [i]); + array_verify (EV_A_ (W *)idles [i], idlecnt [i]); +#endif + } + +#if EV_FORK_ENABLE + assert (forkmax >= forkcnt); + array_verify (EV_A_ (W *)forks, forkcnt); +#endif + +#if EV_CLEANUP_ENABLE + assert (cleanupmax >= cleanupcnt); + array_verify (EV_A_ (W *)cleanups, cleanupcnt); +#endif + +#if EV_ASYNC_ENABLE + assert (asyncmax >= asynccnt); + array_verify (EV_A_ (W *)asyncs, asynccnt); +#endif + +#if EV_PREPARE_ENABLE + assert (preparemax >= preparecnt); + array_verify (EV_A_ (W *)prepares, preparecnt); +#endif + +#if EV_CHECK_ENABLE + assert (checkmax >= checkcnt); + array_verify (EV_A_ (W *)checks, checkcnt); +#endif + +# if 0 +#if EV_CHILD_ENABLE + for (w = (ev_child *)childs [chain & ((EV_PID_HASHSIZE) - 1)]; w; w = (ev_child *)((WL)w)->next) + for (signum = EV_NSIG; signum--; ) if (signals [signum].pending) +#endif +# endif +#endif +} +#endif + +#if EV_MULTIPLICITY +ecb_cold +struct ev_loop * +#else +int +#endif +ev_default_loop (unsigned int flags) EV_NOEXCEPT +{ + if (!ev_default_loop_ptr) + { +#if EV_MULTIPLICITY + EV_P = ev_default_loop_ptr = &default_loop_struct; +#else + ev_default_loop_ptr = 1; +#endif + + loop_init (EV_A_ flags); + + if (ev_backend (EV_A)) + { +#if EV_CHILD_ENABLE + ev_signal_init (&childev, childcb, SIGCHLD); + ev_set_priority (&childev, EV_MAXPRI); + ev_signal_start (EV_A_ &childev); + ev_unref (EV_A); /* child watcher should not keep loop alive */ +#endif + } + else + ev_default_loop_ptr = 0; + } + + return ev_default_loop_ptr; +} + +void +ev_loop_fork (EV_P) EV_NOEXCEPT +{ + postfork = 1; +} + +/*****************************************************************************/ + +void +ev_invoke (EV_P_ void *w, int revents) +{ + EV_CB_INVOKE ((W)w, revents); +} + +unsigned int +ev_pending_count (EV_P) EV_NOEXCEPT +{ + int pri; + unsigned int count = 0; + + for (pri = NUMPRI; pri--; ) + count += pendingcnt [pri]; + + return count; +} + +ecb_noinline +void +ev_invoke_pending (EV_P) +{ + pendingpri = NUMPRI; + + do + { + --pendingpri; + + /* pendingpri possibly gets modified in the inner loop */ + while (pendingcnt [pendingpri]) + { + ANPENDING *p = pendings [pendingpri] + --pendingcnt [pendingpri]; + + p->w->pending = 0; + EV_CB_INVOKE (p->w, p->events); + EV_FREQUENT_CHECK; + } + } + while (pendingpri); +} + +#if EV_IDLE_ENABLE +/* make idle watchers pending. this handles the "call-idle */ +/* only when higher priorities are idle" logic */ +inline_size void +idle_reify (EV_P) +{ + if (ecb_expect_false (idleall)) + { + int pri; + + for (pri = NUMPRI; pri--; ) + { + if (pendingcnt [pri]) + break; + + if (idlecnt [pri]) + { + queue_events (EV_A_ (W *)idles [pri], idlecnt [pri], EV_IDLE); + break; + } + } + } +} +#endif + +/* make timers pending */ +inline_size void +timers_reify (EV_P) +{ + EV_FREQUENT_CHECK; + + if (timercnt && ANHE_at (timers [HEAP0]) < mn_now) + { + do + { + ev_timer *w = (ev_timer *)ANHE_w (timers [HEAP0]); + + /*assert (("libev: inactive timer on timer heap detected", ev_is_active (w)));*/ + + /* first reschedule or stop timer */ + if (w->repeat) + { + ev_at (w) += w->repeat; + if (ev_at (w) < mn_now) + ev_at (w) = mn_now; + + assert (("libev: negative ev_timer repeat value found while processing timers", w->repeat > EV_TS_CONST (0.))); + + ANHE_at_cache (timers [HEAP0]); + downheap (timers, timercnt, HEAP0); + } + else + ev_timer_stop (EV_A_ w); /* nonrepeating: stop timer */ + + EV_FREQUENT_CHECK; + feed_reverse (EV_A_ (W)w); + } + while (timercnt && ANHE_at (timers [HEAP0]) < mn_now); + + feed_reverse_done (EV_A_ EV_TIMER); + } +} + +#if EV_PERIODIC_ENABLE + +ecb_noinline +static void +periodic_recalc (EV_P_ ev_periodic *w) +{ + ev_tstamp interval = w->interval > MIN_INTERVAL ? w->interval : MIN_INTERVAL; + ev_tstamp at = w->offset + interval * ev_floor ((ev_rt_now - w->offset) / interval); + + /* the above almost always errs on the low side */ + while (at <= ev_rt_now) + { + ev_tstamp nat = at + w->interval; + + /* when resolution fails us, we use ev_rt_now */ + if (ecb_expect_false (nat == at)) + { + at = ev_rt_now; + break; + } + + at = nat; + } + + ev_at (w) = at; +} + +/* make periodics pending */ +inline_size void +periodics_reify (EV_P) +{ + EV_FREQUENT_CHECK; + + while (periodiccnt && ANHE_at (periodics [HEAP0]) < ev_rt_now) + { + do + { + ev_periodic *w = (ev_periodic *)ANHE_w (periodics [HEAP0]); + + /*assert (("libev: inactive timer on periodic heap detected", ev_is_active (w)));*/ + + /* first reschedule or stop timer */ + if (w->reschedule_cb) + { + ev_at (w) = w->reschedule_cb (w, ev_rt_now); + + assert (("libev: ev_periodic reschedule callback returned time in the past", ev_at (w) >= ev_rt_now)); + + ANHE_at_cache (periodics [HEAP0]); + downheap (periodics, periodiccnt, HEAP0); + } + else if (w->interval) + { + periodic_recalc (EV_A_ w); + ANHE_at_cache (periodics [HEAP0]); + downheap (periodics, periodiccnt, HEAP0); + } + else + ev_periodic_stop (EV_A_ w); /* nonrepeating: stop timer */ + + EV_FREQUENT_CHECK; + feed_reverse (EV_A_ (W)w); + } + while (periodiccnt && ANHE_at (periodics [HEAP0]) < ev_rt_now); + + feed_reverse_done (EV_A_ EV_PERIODIC); + } +} + +/* simply recalculate all periodics */ +/* TODO: maybe ensure that at least one event happens when jumping forward? */ +ecb_noinline ecb_cold +static void +periodics_reschedule (EV_P) +{ + int i; + + /* adjust periodics after time jump */ + for (i = HEAP0; i < periodiccnt + HEAP0; ++i) + { + ev_periodic *w = (ev_periodic *)ANHE_w (periodics [i]); + + if (w->reschedule_cb) + ev_at (w) = w->reschedule_cb (w, ev_rt_now); + else if (w->interval) + periodic_recalc (EV_A_ w); + + ANHE_at_cache (periodics [i]); + } + + reheap (periodics, periodiccnt); +} +#endif + +/* adjust all timers by a given offset */ +ecb_noinline ecb_cold +static void +timers_reschedule (EV_P_ ev_tstamp adjust) +{ + int i; + + for (i = 0; i < timercnt; ++i) + { + ANHE *he = timers + i + HEAP0; + ANHE_w (*he)->at += adjust; + ANHE_at_cache (*he); + } +} + +/* fetch new monotonic and realtime times from the kernel */ +/* also detect if there was a timejump, and act accordingly */ +inline_speed void +time_update (EV_P_ ev_tstamp max_block) +{ +#if EV_USE_MONOTONIC + if (ecb_expect_true (have_monotonic)) + { + int i; + ev_tstamp odiff = rtmn_diff; + + mn_now = get_clock (); + + /* only fetch the realtime clock every 0.5*MIN_TIMEJUMP seconds */ + /* interpolate in the meantime */ + if (ecb_expect_true (mn_now - now_floor < EV_TS_CONST (MIN_TIMEJUMP * .5))) + { + ev_rt_now = rtmn_diff + mn_now; + return; + } + + now_floor = mn_now; + ev_rt_now = ev_time (); + + /* loop a few times, before making important decisions. + * on the choice of "4": one iteration isn't enough, + * in case we get preempted during the calls to + * ev_time and get_clock. a second call is almost guaranteed + * to succeed in that case, though. and looping a few more times + * doesn't hurt either as we only do this on time-jumps or + * in the unlikely event of having been preempted here. + */ + for (i = 4; --i; ) + { + ev_tstamp diff; + rtmn_diff = ev_rt_now - mn_now; + + diff = odiff - rtmn_diff; + + if (ecb_expect_true ((diff < EV_TS_CONST (0.) ? -diff : diff) < EV_TS_CONST (MIN_TIMEJUMP))) + return; /* all is well */ + + ev_rt_now = ev_time (); + mn_now = get_clock (); + now_floor = mn_now; + } + + /* no timer adjustment, as the monotonic clock doesn't jump */ + /* timers_reschedule (EV_A_ rtmn_diff - odiff) */ +# if EV_PERIODIC_ENABLE + periodics_reschedule (EV_A); +# endif + } + else +#endif + { + ev_rt_now = ev_time (); + + if (ecb_expect_false (mn_now > ev_rt_now || ev_rt_now > mn_now + max_block + EV_TS_CONST (MIN_TIMEJUMP))) + { + /* adjust timers. this is easy, as the offset is the same for all of them */ + timers_reschedule (EV_A_ ev_rt_now - mn_now); +#if EV_PERIODIC_ENABLE + periodics_reschedule (EV_A); +#endif + } + + mn_now = ev_rt_now; + } +} + +/* ########## NIO4R PATCHERY HO! ########## */ +struct ev_poll_args { + struct ev_loop *loop; + ev_tstamp waittime; +}; + +static +void * ev_backend_poll(void *ptr) +{ + struct ev_poll_args *args = (struct ev_poll_args *)ptr; + struct ev_loop *loop = args->loop; + backend_poll (EV_A_ args->waittime); + + return NULL; +} +/* ######################################## */ + +int +ev_run (EV_P_ int flags) +{ +/* ########## NIO4R PATCHERY HO! ########## */ + struct ev_poll_args poll_args; +/* ######################################## */ + +#if EV_FEATURE_API + ++loop_depth; +#endif + + assert (("libev: ev_loop recursion during release detected", loop_done != EVBREAK_RECURSE)); + + loop_done = EVBREAK_CANCEL; + + EV_INVOKE_PENDING; /* in case we recurse, ensure ordering stays nice and clean */ + + do + { +#if EV_VERIFY >= 2 + ev_verify (EV_A); +#endif + +#ifndef _WIN32 + if (ecb_expect_false (curpid)) /* penalise the forking check even more */ + if (ecb_expect_false (getpid () != curpid)) + { + curpid = getpid (); + postfork = 1; + } +#endif + +#if EV_FORK_ENABLE + /* we might have forked, so queue fork handlers */ + if (ecb_expect_false (postfork)) + if (forkcnt) + { + queue_events (EV_A_ (W *)forks, forkcnt, EV_FORK); + EV_INVOKE_PENDING; + } +#endif + +#if EV_PREPARE_ENABLE + /* queue prepare watchers (and execute them) */ + if (ecb_expect_false (preparecnt)) + { + queue_events (EV_A_ (W *)prepares, preparecnt, EV_PREPARE); + EV_INVOKE_PENDING; + } +#endif + + if (ecb_expect_false (loop_done)) + break; + + /* we might have forked, so reify kernel state if necessary */ + if (ecb_expect_false (postfork)) + loop_fork (EV_A); + + /* update fd-related kernel structures */ + fd_reify (EV_A); + + /* calculate blocking time */ + { + ev_tstamp waittime = 0.; + ev_tstamp sleeptime = 0.; + + /* remember old timestamp for io_blocktime calculation */ + ev_tstamp prev_mn_now = mn_now; + + /* update time to cancel out callback processing overhead */ + time_update (EV_A_ EV_TS_CONST (EV_TSTAMP_HUGE)); + + /* from now on, we want a pipe-wake-up */ + pipe_write_wanted = 1; + + ECB_MEMORY_FENCE; /* make sure pipe_write_wanted is visible before we check for potential skips */ + + if (ecb_expect_true (!(flags & EVRUN_NOWAIT || idleall || !activecnt || pipe_write_skipped))) + { + waittime = EV_TS_CONST (MAX_BLOCKTIME); + +#if EV_USE_TIMERFD + /* sleep a lot longer when we can reliably detect timejumps */ + if (ecb_expect_true (timerfd >= 0)) + waittime = EV_TS_CONST (MAX_BLOCKTIME2); +#endif +#if !EV_PERIODIC_ENABLE + /* without periodics but with monotonic clock there is no need */ + /* for any time jump detection, so sleep longer */ + if (ecb_expect_true (have_monotonic)) + waittime = EV_TS_CONST (MAX_BLOCKTIME2); +#endif + + if (timercnt) + { + ev_tstamp to = ANHE_at (timers [HEAP0]) - mn_now; + if (waittime > to) waittime = to; + } + +#if EV_PERIODIC_ENABLE + if (periodiccnt) + { + ev_tstamp to = ANHE_at (periodics [HEAP0]) - ev_rt_now; + if (waittime > to) waittime = to; + } +#endif + + /* don't let timeouts decrease the waittime below timeout_blocktime */ + if (ecb_expect_false (waittime < timeout_blocktime)) + waittime = timeout_blocktime; + + /* now there are two more special cases left, either we have + * already-expired timers, so we should not sleep, or we have timers + * that expire very soon, in which case we need to wait for a minimum + * amount of time for some event loop backends. + */ + if (ecb_expect_false (waittime < backend_mintime)) + waittime = waittime <= EV_TS_CONST (0.) + ? EV_TS_CONST (0.) + : backend_mintime; + + /* extra check because io_blocktime is commonly 0 */ + if (ecb_expect_false (io_blocktime)) + { + sleeptime = io_blocktime - (mn_now - prev_mn_now); + + if (sleeptime > waittime - backend_mintime) + sleeptime = waittime - backend_mintime; + + if (ecb_expect_true (sleeptime > EV_TS_CONST (0.))) + { + ev_sleep (sleeptime); + waittime -= sleeptime; + } + } + } + +#if EV_FEATURE_API + ++loop_count; +#endif + assert ((loop_done = EVBREAK_RECURSE, 1)); /* assert for side effect */ + +/* +########################## NIO4R PATCHERY HO! ########################## + +According to the grandwizards of Ruby, locking and unlocking of the global +interpreter lock are apparently too powerful a concept for a mere mortal to +wield (although redefining what + and - do to numbers is totally cool). +And so it came to pass that the only acceptable way to release the global +interpreter lock is through a convoluted callback system that thakes a +function pointer. While the grandwizard of libev foresaw this sort of scenario, +he too attempted to place an API with callbacks on it, one that runs before +the system call, and one that runs immediately after. + +And so it came to pass that trying to wrap everything up in callbacks created +two incompatible APIs, Ruby's which releases the global interpreter lock and +reacquires it when the callback returns, and libev's, which wants two +callbacks, one which runs before the polling operation starts, and one which +runs after it finishes. + +These two systems are incompatible as they both want to use callbacks to +solve the same problem, however libev wants to use before/after callbacks, +and Ruby wants to use an "around" callback. This presents a significant +problem as these two patterns of callbacks are diametrical opposites of each +other and thus cannot be composed. + +And thus we are left with no choice but to patch the internals of libev in +order to release a mutex at just the precise moment. + +This is a great example of a situation where granular locking and unlocking +of the GVL is practically required. The goal is to get as close to the +system call as possible, and to keep the GVL unlocked for the shortest +amount of time possible. + +Perhaps Ruby could benefit from such an API, e.g: + +rb_thread_unsafe_dangerous_crazy_blocking_region_begin(...); +rb_thread_unsafe_dangerous_crazy_blocking_region_end(...); + +####################################################################### +*/ + + poll_args.loop = loop; + poll_args.waittime = waittime; + rb_thread_call_without_gvl(ev_backend_poll, (void *)&poll_args, RUBY_UBF_IO, 0); +/* +############################# END PATCHERY ############################ +*/ + + assert ((loop_done = EVBREAK_CANCEL, 1)); /* assert for side effect */ + + pipe_write_wanted = 0; /* just an optimisation, no fence needed */ + + ECB_MEMORY_FENCE_ACQUIRE; + if (pipe_write_skipped) + { + assert (("libev: pipe_w not active, but pipe not written", ev_is_active (&pipe_w))); + ev_feed_event (EV_A_ &pipe_w, EV_CUSTOM); + } + + /* update ev_rt_now, do magic */ + time_update (EV_A_ waittime + sleeptime); + } + + /* queue pending timers and reschedule them */ + timers_reify (EV_A); /* relative timers called last */ +#if EV_PERIODIC_ENABLE + periodics_reify (EV_A); /* absolute timers called first */ +#endif + +#if EV_IDLE_ENABLE + /* queue idle watchers unless other events are pending */ + idle_reify (EV_A); +#endif + +#if EV_CHECK_ENABLE + /* queue check watchers, to be executed first */ + if (ecb_expect_false (checkcnt)) + queue_events (EV_A_ (W *)checks, checkcnt, EV_CHECK); +#endif + + EV_INVOKE_PENDING; + } + while (ecb_expect_true ( + activecnt + && !loop_done + && !(flags & (EVRUN_ONCE | EVRUN_NOWAIT)) + )); + + if (loop_done == EVBREAK_ONE) + loop_done = EVBREAK_CANCEL; + +#if EV_FEATURE_API + --loop_depth; +#endif + + return activecnt; +} + +void +ev_break (EV_P_ int how) EV_NOEXCEPT +{ + loop_done = how; +} + +void +ev_ref (EV_P) EV_NOEXCEPT +{ + ++activecnt; +} + +void +ev_unref (EV_P) EV_NOEXCEPT +{ + --activecnt; +} + +void +ev_now_update (EV_P) EV_NOEXCEPT +{ + time_update (EV_A_ EV_TSTAMP_HUGE); +} + +void +ev_suspend (EV_P) EV_NOEXCEPT +{ + ev_now_update (EV_A); +} + +void +ev_resume (EV_P) EV_NOEXCEPT +{ + ev_tstamp mn_prev = mn_now; + + ev_now_update (EV_A); + timers_reschedule (EV_A_ mn_now - mn_prev); +#if EV_PERIODIC_ENABLE + /* TODO: really do this? */ + periodics_reschedule (EV_A); +#endif +} + +/*****************************************************************************/ +/* singly-linked list management, used when the expected list length is short */ + +inline_size void +wlist_add (WL *head, WL elem) +{ + elem->next = *head; + *head = elem; +} + +inline_size void +wlist_del (WL *head, WL elem) +{ + while (*head) + { + if (ecb_expect_true (*head == elem)) + { + *head = elem->next; + break; + } + + head = &(*head)->next; + } +} + +/* internal, faster, version of ev_clear_pending */ +inline_speed void +clear_pending (EV_P_ W w) +{ + if (w->pending) + { + pendings [ABSPRI (w)][w->pending - 1].w = (W)&pending_w; + w->pending = 0; + } +} + +int +ev_clear_pending (EV_P_ void *w) EV_NOEXCEPT +{ + W w_ = (W)w; + int pending = w_->pending; + + if (ecb_expect_true (pending)) + { + ANPENDING *p = pendings [ABSPRI (w_)] + pending - 1; + p->w = (W)&pending_w; + w_->pending = 0; + return p->events; + } + else + return 0; +} + +inline_size void +pri_adjust (EV_P_ W w) +{ + int pri = ev_priority (w); + pri = pri < EV_MINPRI ? EV_MINPRI : pri; + pri = pri > EV_MAXPRI ? EV_MAXPRI : pri; + ev_set_priority (w, pri); +} + +inline_speed void +ev_start (EV_P_ W w, int active) +{ + pri_adjust (EV_A_ w); + w->active = active; + ev_ref (EV_A); +} + +inline_size void +ev_stop (EV_P_ W w) +{ + ev_unref (EV_A); + w->active = 0; +} + +/*****************************************************************************/ + +ecb_noinline +void +ev_io_start (EV_P_ ev_io *w) EV_NOEXCEPT +{ + int fd = w->fd; + + if (ecb_expect_false (ev_is_active (w))) + return; + + assert (("libev: ev_io_start called with negative fd", fd >= 0)); + assert (("libev: ev_io_start called with illegal event mask", !(w->events & ~(EV__IOFDSET | EV_READ | EV_WRITE)))); + +#if EV_VERIFY >= 2 + assert (("libev: ev_io_start called on watcher with invalid fd", fd_valid (fd))); +#endif + EV_FREQUENT_CHECK; + + ev_start (EV_A_ (W)w, 1); + array_needsize (ANFD, anfds, anfdmax, fd + 1, array_needsize_zerofill); + wlist_add (&anfds[fd].head, (WL)w); + + /* common bug, apparently */ + assert (("libev: ev_io_start called with corrupted watcher", ((WL)w)->next != (WL)w)); + + fd_change (EV_A_ fd, w->events & EV__IOFDSET | EV_ANFD_REIFY); + w->events &= ~EV__IOFDSET; + + EV_FREQUENT_CHECK; +} + +ecb_noinline +void +ev_io_stop (EV_P_ ev_io *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + assert (("libev: ev_io_stop called with illegal fd (must stay constant after start!)", w->fd >= 0 && w->fd < anfdmax)); + +#if EV_VERIFY >= 2 + assert (("libev: ev_io_stop called on watcher with invalid fd", fd_valid (w->fd))); +#endif + EV_FREQUENT_CHECK; + + wlist_del (&anfds[w->fd].head, (WL)w); + ev_stop (EV_A_ (W)w); + + fd_change (EV_A_ w->fd, EV_ANFD_REIFY); + + EV_FREQUENT_CHECK; +} + +ecb_noinline +void +ev_timer_start (EV_P_ ev_timer *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + ev_at (w) += mn_now; + + assert (("libev: ev_timer_start called with negative timer repeat value", w->repeat >= 0.)); + + EV_FREQUENT_CHECK; + + ++timercnt; + ev_start (EV_A_ (W)w, timercnt + HEAP0 - 1); + array_needsize (ANHE, timers, timermax, ev_active (w) + 1, array_needsize_noinit); + ANHE_w (timers [ev_active (w)]) = (WT)w; + ANHE_at_cache (timers [ev_active (w)]); + upheap (timers, ev_active (w)); + + EV_FREQUENT_CHECK; + + /*assert (("libev: internal timer heap corruption", timers [ev_active (w)] == (WT)w));*/ +} + +ecb_noinline +void +ev_timer_stop (EV_P_ ev_timer *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + { + int active = ev_active (w); + + assert (("libev: internal timer heap corruption", ANHE_w (timers [active]) == (WT)w)); + + --timercnt; + + if (ecb_expect_true (active < timercnt + HEAP0)) + { + timers [active] = timers [timercnt + HEAP0]; + adjustheap (timers, timercnt, active); + } + } + + ev_at (w) -= mn_now; + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} + +ecb_noinline +void +ev_timer_again (EV_P_ ev_timer *w) EV_NOEXCEPT +{ + EV_FREQUENT_CHECK; + + clear_pending (EV_A_ (W)w); + + if (ev_is_active (w)) + { + if (w->repeat) + { + ev_at (w) = mn_now + w->repeat; + ANHE_at_cache (timers [ev_active (w)]); + adjustheap (timers, timercnt, ev_active (w)); + } + else + ev_timer_stop (EV_A_ w); + } + else if (w->repeat) + { + ev_at (w) = w->repeat; + ev_timer_start (EV_A_ w); + } + + EV_FREQUENT_CHECK; +} + +ev_tstamp +ev_timer_remaining (EV_P_ ev_timer *w) EV_NOEXCEPT +{ + return ev_at (w) - (ev_is_active (w) ? mn_now : EV_TS_CONST (0.)); +} + +#if EV_PERIODIC_ENABLE +ecb_noinline +void +ev_periodic_start (EV_P_ ev_periodic *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + +#if EV_USE_TIMERFD + if (timerfd == -2) + evtimerfd_init (EV_A); +#endif + + if (w->reschedule_cb) + ev_at (w) = w->reschedule_cb (w, ev_rt_now); + else if (w->interval) + { + assert (("libev: ev_periodic_start called with negative interval value", w->interval >= 0.)); + periodic_recalc (EV_A_ w); + } + else + ev_at (w) = w->offset; + + EV_FREQUENT_CHECK; + + ++periodiccnt; + ev_start (EV_A_ (W)w, periodiccnt + HEAP0 - 1); + array_needsize (ANHE, periodics, periodicmax, ev_active (w) + 1, array_needsize_noinit); + ANHE_w (periodics [ev_active (w)]) = (WT)w; + ANHE_at_cache (periodics [ev_active (w)]); + upheap (periodics, ev_active (w)); + + EV_FREQUENT_CHECK; + + /*assert (("libev: internal periodic heap corruption", ANHE_w (periodics [ev_active (w)]) == (WT)w));*/ +} + +ecb_noinline +void +ev_periodic_stop (EV_P_ ev_periodic *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + { + int active = ev_active (w); + + assert (("libev: internal periodic heap corruption", ANHE_w (periodics [active]) == (WT)w)); + + --periodiccnt; + + if (ecb_expect_true (active < periodiccnt + HEAP0)) + { + periodics [active] = periodics [periodiccnt + HEAP0]; + adjustheap (periodics, periodiccnt, active); + } + } + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} + +ecb_noinline +void +ev_periodic_again (EV_P_ ev_periodic *w) EV_NOEXCEPT +{ + /* TODO: use adjustheap and recalculation */ + ev_periodic_stop (EV_A_ w); + ev_periodic_start (EV_A_ w); +} +#endif + +#ifndef SA_RESTART +# define SA_RESTART 0 +#endif + +#if EV_SIGNAL_ENABLE + +ecb_noinline +void +ev_signal_start (EV_P_ ev_signal *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + assert (("libev: ev_signal_start called with illegal signal number", w->signum > 0 && w->signum < EV_NSIG)); + +#if EV_MULTIPLICITY + assert (("libev: a signal must not be attached to two different loops", + !signals [w->signum - 1].loop || signals [w->signum - 1].loop == loop)); + + signals [w->signum - 1].loop = EV_A; + ECB_MEMORY_FENCE_RELEASE; +#endif + + EV_FREQUENT_CHECK; + +#if EV_USE_SIGNALFD + if (sigfd == -2) + { + sigfd = signalfd (-1, &sigfd_set, SFD_NONBLOCK | SFD_CLOEXEC); + if (sigfd < 0 && errno == EINVAL) + sigfd = signalfd (-1, &sigfd_set, 0); /* retry without flags */ + + if (sigfd >= 0) + { + fd_intern (sigfd); /* doing it twice will not hurt */ + + sigemptyset (&sigfd_set); + + ev_io_init (&sigfd_w, sigfdcb, sigfd, EV_READ); + ev_set_priority (&sigfd_w, EV_MAXPRI); + ev_io_start (EV_A_ &sigfd_w); + ev_unref (EV_A); /* signalfd watcher should not keep loop alive */ + } + } + + if (sigfd >= 0) + { + /* TODO: check .head */ + sigaddset (&sigfd_set, w->signum); + sigprocmask (SIG_BLOCK, &sigfd_set, 0); + + signalfd (sigfd, &sigfd_set, 0); + } +#endif + + ev_start (EV_A_ (W)w, 1); + wlist_add (&signals [w->signum - 1].head, (WL)w); + + if (!((WL)w)->next) +# if EV_USE_SIGNALFD + if (sigfd < 0) /*TODO*/ +# endif + { +# ifdef _WIN32 + evpipe_init (EV_A); + + signal (w->signum, ev_sighandler); +# else + struct sigaction sa; + + evpipe_init (EV_A); + + sa.sa_handler = ev_sighandler; + sigfillset (&sa.sa_mask); + sa.sa_flags = SA_RESTART; /* if restarting works we save one iteration */ + sigaction (w->signum, &sa, 0); + + if (origflags & EVFLAG_NOSIGMASK) + { + sigemptyset (&sa.sa_mask); + sigaddset (&sa.sa_mask, w->signum); + sigprocmask (SIG_UNBLOCK, &sa.sa_mask, 0); + } +#endif + } + + EV_FREQUENT_CHECK; +} + +ecb_noinline +void +ev_signal_stop (EV_P_ ev_signal *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + wlist_del (&signals [w->signum - 1].head, (WL)w); + ev_stop (EV_A_ (W)w); + + if (!signals [w->signum - 1].head) + { +#if EV_MULTIPLICITY + signals [w->signum - 1].loop = 0; /* unattach from signal */ +#endif +#if EV_USE_SIGNALFD + if (sigfd >= 0) + { + sigset_t ss; + + sigemptyset (&ss); + sigaddset (&ss, w->signum); + sigdelset (&sigfd_set, w->signum); + + signalfd (sigfd, &sigfd_set, 0); + sigprocmask (SIG_UNBLOCK, &ss, 0); + } + else +#endif + signal (w->signum, SIG_DFL); + } + + EV_FREQUENT_CHECK; +} + +#endif + +#if EV_CHILD_ENABLE + +void +ev_child_start (EV_P_ ev_child *w) EV_NOEXCEPT +{ +#if EV_MULTIPLICITY + assert (("libev: child watchers are only supported in the default loop", loop == ev_default_loop_ptr)); +#endif + if (ecb_expect_false (ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + ev_start (EV_A_ (W)w, 1); + wlist_add (&childs [w->pid & ((EV_PID_HASHSIZE) - 1)], (WL)w); + + EV_FREQUENT_CHECK; +} + +void +ev_child_stop (EV_P_ ev_child *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + wlist_del (&childs [w->pid & ((EV_PID_HASHSIZE) - 1)], (WL)w); + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} + +#endif + +#if EV_STAT_ENABLE + +# ifdef _WIN32 +# undef lstat +# define lstat(a,b) _stati64 (a,b) +# endif + +#define DEF_STAT_INTERVAL 5.0074891 +#define NFS_STAT_INTERVAL 30.1074891 /* for filesystems potentially failing inotify */ +#define MIN_STAT_INTERVAL 0.1074891 + +ecb_noinline static void stat_timer_cb (EV_P_ ev_timer *w_, int revents); + +#if EV_USE_INOTIFY + +/* the * 2 is to allow for alignment padding, which for some reason is >> 8 */ +# define EV_INOTIFY_BUFSIZE (sizeof (struct inotify_event) * 2 + NAME_MAX) + +ecb_noinline +static void +infy_add (EV_P_ ev_stat *w) +{ + w->wd = inotify_add_watch (fs_fd, w->path, + IN_ATTRIB | IN_DELETE_SELF | IN_MOVE_SELF | IN_MODIFY + | IN_CREATE | IN_DELETE | IN_MOVED_FROM | IN_MOVED_TO + | IN_DONT_FOLLOW | IN_MASK_ADD); + + if (w->wd >= 0) + { + struct statfs sfs; + + /* now local changes will be tracked by inotify, but remote changes won't */ + /* unless the filesystem is known to be local, we therefore still poll */ + /* also do poll on <2.6.25, but with normal frequency */ + + if (!fs_2625) + w->timer.repeat = w->interval ? w->interval : DEF_STAT_INTERVAL; + else if (!statfs (w->path, &sfs) + && (sfs.f_type == 0x1373 /* devfs */ + || sfs.f_type == 0x4006 /* fat */ + || sfs.f_type == 0x4d44 /* msdos */ + || sfs.f_type == 0xEF53 /* ext2/3 */ + || sfs.f_type == 0x72b6 /* jffs2 */ + || sfs.f_type == 0x858458f6 /* ramfs */ + || sfs.f_type == 0x5346544e /* ntfs */ + || sfs.f_type == 0x3153464a /* jfs */ + || sfs.f_type == 0x9123683e /* btrfs */ + || sfs.f_type == 0x52654973 /* reiser3 */ + || sfs.f_type == 0x01021994 /* tmpfs */ + || sfs.f_type == 0x58465342 /* xfs */)) + w->timer.repeat = 0.; /* filesystem is local, kernel new enough */ + else + w->timer.repeat = w->interval ? w->interval : NFS_STAT_INTERVAL; /* remote, use reduced frequency */ + } + else + { + /* can't use inotify, continue to stat */ + w->timer.repeat = w->interval ? w->interval : DEF_STAT_INTERVAL; + + /* if path is not there, monitor some parent directory for speedup hints */ + /* note that exceeding the hardcoded path limit is not a correctness issue, */ + /* but an efficiency issue only */ + if ((errno == ENOENT || errno == EACCES) && strlen (w->path) < 4096) + { + char path [4096]; + strcpy (path, w->path); + + do + { + int mask = IN_MASK_ADD | IN_DELETE_SELF | IN_MOVE_SELF + | (errno == EACCES ? IN_ATTRIB : IN_CREATE | IN_MOVED_TO); + + char *pend = strrchr (path, '/'); + + if (!pend || pend == path) + break; + + *pend = 0; + w->wd = inotify_add_watch (fs_fd, path, mask); + } + while (w->wd < 0 && (errno == ENOENT || errno == EACCES)); + } + } + + if (w->wd >= 0) + wlist_add (&fs_hash [w->wd & ((EV_INOTIFY_HASHSIZE) - 1)].head, (WL)w); + + /* now re-arm timer, if required */ + if (ev_is_active (&w->timer)) ev_ref (EV_A); + ev_timer_again (EV_A_ &w->timer); + if (ev_is_active (&w->timer)) ev_unref (EV_A); +} + +ecb_noinline +static void +infy_del (EV_P_ ev_stat *w) +{ + int slot; + int wd = w->wd; + + if (wd < 0) + return; + + w->wd = -2; + slot = wd & ((EV_INOTIFY_HASHSIZE) - 1); + wlist_del (&fs_hash [slot].head, (WL)w); + + /* remove this watcher, if others are watching it, they will rearm */ + inotify_rm_watch (fs_fd, wd); +} + +ecb_noinline +static void +infy_wd (EV_P_ int slot, int wd, struct inotify_event *ev) +{ + if (slot < 0) + /* overflow, need to check for all hash slots */ + for (slot = 0; slot < (EV_INOTIFY_HASHSIZE); ++slot) + infy_wd (EV_A_ slot, wd, ev); + else + { + WL w_; + + for (w_ = fs_hash [slot & ((EV_INOTIFY_HASHSIZE) - 1)].head; w_; ) + { + ev_stat *w = (ev_stat *)w_; + w_ = w_->next; /* lets us remove this watcher and all before it */ + + if (w->wd == wd || wd == -1) + { + if (ev->mask & (IN_IGNORED | IN_UNMOUNT | IN_DELETE_SELF)) + { + wlist_del (&fs_hash [slot & ((EV_INOTIFY_HASHSIZE) - 1)].head, (WL)w); + w->wd = -1; + infy_add (EV_A_ w); /* re-add, no matter what */ + } + + stat_timer_cb (EV_A_ &w->timer, 0); + } + } + } +} + +static void +infy_cb (EV_P_ ev_io *w, int revents) +{ + char buf [EV_INOTIFY_BUFSIZE]; + int ofs; + int len = read (fs_fd, buf, sizeof (buf)); + + for (ofs = 0; ofs < len; ) + { + struct inotify_event *ev = (struct inotify_event *)(buf + ofs); + infy_wd (EV_A_ ev->wd, ev->wd, ev); + ofs += sizeof (struct inotify_event) + ev->len; + } +} + +inline_size ecb_cold +void +ev_check_2625 (EV_P) +{ + /* kernels < 2.6.25 are borked + * http://www.ussg.indiana.edu/hypermail/linux/kernel/0711.3/1208.html + */ + if (ev_linux_version () < 0x020619) + return; + + fs_2625 = 1; +} + +inline_size int +infy_newfd (void) +{ +#if defined IN_CLOEXEC && defined IN_NONBLOCK + int fd = inotify_init1 (IN_CLOEXEC | IN_NONBLOCK); + if (fd >= 0) + return fd; +#endif + return inotify_init (); +} + +inline_size void +infy_init (EV_P) +{ + if (fs_fd != -2) + return; + + fs_fd = -1; + + ev_check_2625 (EV_A); + + fs_fd = infy_newfd (); + + if (fs_fd >= 0) + { + fd_intern (fs_fd); + ev_io_init (&fs_w, infy_cb, fs_fd, EV_READ); + ev_set_priority (&fs_w, EV_MAXPRI); + ev_io_start (EV_A_ &fs_w); + ev_unref (EV_A); + } +} + +inline_size void +infy_fork (EV_P) +{ + int slot; + + if (fs_fd < 0) + return; + + ev_ref (EV_A); + ev_io_stop (EV_A_ &fs_w); + close (fs_fd); + fs_fd = infy_newfd (); + + if (fs_fd >= 0) + { + fd_intern (fs_fd); + ev_io_set (&fs_w, fs_fd, EV_READ); + ev_io_start (EV_A_ &fs_w); + ev_unref (EV_A); + } + + for (slot = 0; slot < (EV_INOTIFY_HASHSIZE); ++slot) + { + WL w_ = fs_hash [slot].head; + fs_hash [slot].head = 0; + + while (w_) + { + ev_stat *w = (ev_stat *)w_; + w_ = w_->next; /* lets us add this watcher */ + + w->wd = -1; + + if (fs_fd >= 0) + infy_add (EV_A_ w); /* re-add, no matter what */ + else + { + w->timer.repeat = w->interval ? w->interval : DEF_STAT_INTERVAL; + if (ev_is_active (&w->timer)) ev_ref (EV_A); + ev_timer_again (EV_A_ &w->timer); + if (ev_is_active (&w->timer)) ev_unref (EV_A); + } + } + } +} + +#endif + +#ifdef _WIN32 +# define EV_LSTAT(p,b) _stati64 (p, b) +#else +# define EV_LSTAT(p,b) lstat (p, b) +#endif + +void +ev_stat_stat (EV_P_ ev_stat *w) EV_NOEXCEPT +{ + if (lstat (w->path, &w->attr) < 0) + w->attr.st_nlink = 0; + else if (!w->attr.st_nlink) + w->attr.st_nlink = 1; +} + +ecb_noinline +static void +stat_timer_cb (EV_P_ ev_timer *w_, int revents) +{ + ev_stat *w = (ev_stat *)(((char *)w_) - offsetof (ev_stat, timer)); + + ev_statdata prev = w->attr; + ev_stat_stat (EV_A_ w); + + /* memcmp doesn't work on netbsd, they.... do stuff to their struct stat */ + if ( + prev.st_dev != w->attr.st_dev + || prev.st_ino != w->attr.st_ino + || prev.st_mode != w->attr.st_mode + || prev.st_nlink != w->attr.st_nlink + || prev.st_uid != w->attr.st_uid + || prev.st_gid != w->attr.st_gid + || prev.st_rdev != w->attr.st_rdev + || prev.st_size != w->attr.st_size + || prev.st_atime != w->attr.st_atime + || prev.st_mtime != w->attr.st_mtime + || prev.st_ctime != w->attr.st_ctime + ) { + /* we only update w->prev on actual differences */ + /* in case we test more often than invoke the callback, */ + /* to ensure that prev is always different to attr */ + w->prev = prev; + + #if EV_USE_INOTIFY + if (fs_fd >= 0) + { + infy_del (EV_A_ w); + infy_add (EV_A_ w); + ev_stat_stat (EV_A_ w); /* avoid race... */ + } + #endif + + ev_feed_event (EV_A_ w, EV_STAT); + } +} + +void +ev_stat_start (EV_P_ ev_stat *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + ev_stat_stat (EV_A_ w); + + if (w->interval < MIN_STAT_INTERVAL && w->interval) + w->interval = MIN_STAT_INTERVAL; + + ev_timer_init (&w->timer, stat_timer_cb, 0., w->interval ? w->interval : DEF_STAT_INTERVAL); + ev_set_priority (&w->timer, ev_priority (w)); + +#if EV_USE_INOTIFY + infy_init (EV_A); + + if (fs_fd >= 0) + infy_add (EV_A_ w); + else +#endif + { + ev_timer_again (EV_A_ &w->timer); + ev_unref (EV_A); + } + + ev_start (EV_A_ (W)w, 1); + + EV_FREQUENT_CHECK; +} + +void +ev_stat_stop (EV_P_ ev_stat *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + +#if EV_USE_INOTIFY + infy_del (EV_A_ w); +#endif + + if (ev_is_active (&w->timer)) + { + ev_ref (EV_A); + ev_timer_stop (EV_A_ &w->timer); + } + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} +#endif + +#if EV_IDLE_ENABLE +void +ev_idle_start (EV_P_ ev_idle *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + pri_adjust (EV_A_ (W)w); + + EV_FREQUENT_CHECK; + + { + int active = ++idlecnt [ABSPRI (w)]; + + ++idleall; + ev_start (EV_A_ (W)w, active); + + array_needsize (ev_idle *, idles [ABSPRI (w)], idlemax [ABSPRI (w)], active, array_needsize_noinit); + idles [ABSPRI (w)][active - 1] = w; + } + + EV_FREQUENT_CHECK; +} + +void +ev_idle_stop (EV_P_ ev_idle *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + { + int active = ev_active (w); + + idles [ABSPRI (w)][active - 1] = idles [ABSPRI (w)][--idlecnt [ABSPRI (w)]]; + ev_active (idles [ABSPRI (w)][active - 1]) = active; + + ev_stop (EV_A_ (W)w); + --idleall; + } + + EV_FREQUENT_CHECK; +} +#endif + +#if EV_PREPARE_ENABLE +void +ev_prepare_start (EV_P_ ev_prepare *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + ev_start (EV_A_ (W)w, ++preparecnt); + array_needsize (ev_prepare *, prepares, preparemax, preparecnt, array_needsize_noinit); + prepares [preparecnt - 1] = w; + + EV_FREQUENT_CHECK; +} + +void +ev_prepare_stop (EV_P_ ev_prepare *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + { + int active = ev_active (w); + + prepares [active - 1] = prepares [--preparecnt]; + ev_active (prepares [active - 1]) = active; + } + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} +#endif + +#if EV_CHECK_ENABLE +void +ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + ev_start (EV_A_ (W)w, ++checkcnt); + array_needsize (ev_check *, checks, checkmax, checkcnt, array_needsize_noinit); + checks [checkcnt - 1] = w; + + EV_FREQUENT_CHECK; +} + +void +ev_check_stop (EV_P_ ev_check *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + { + int active = ev_active (w); + + checks [active - 1] = checks [--checkcnt]; + ev_active (checks [active - 1]) = active; + } + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} +#endif + +#if EV_EMBED_ENABLE +ecb_noinline +void +ev_embed_sweep (EV_P_ ev_embed *w) EV_NOEXCEPT +{ + ev_run (w->other, EVRUN_NOWAIT); +} + +static void +embed_io_cb (EV_P_ ev_io *io, int revents) +{ + ev_embed *w = (ev_embed *)(((char *)io) - offsetof (ev_embed, io)); + + if (ev_cb (w)) + ev_feed_event (EV_A_ (W)w, EV_EMBED); + else + ev_run (w->other, EVRUN_NOWAIT); +} + +static void +embed_prepare_cb (EV_P_ ev_prepare *prepare, int revents) +{ + ev_embed *w = (ev_embed *)(((char *)prepare) - offsetof (ev_embed, prepare)); + + { + EV_P = w->other; + + while (fdchangecnt) + { + fd_reify (EV_A); + ev_run (EV_A_ EVRUN_NOWAIT); + } + } +} + +#if EV_FORK_ENABLE +static void +embed_fork_cb (EV_P_ ev_fork *fork_w, int revents) +{ + ev_embed *w = (ev_embed *)(((char *)fork_w) - offsetof (ev_embed, fork)); + + ev_embed_stop (EV_A_ w); + + { + EV_P = w->other; + + ev_loop_fork (EV_A); + ev_run (EV_A_ EVRUN_NOWAIT); + } + + ev_embed_start (EV_A_ w); +} +#endif + +#if 0 +static void +embed_idle_cb (EV_P_ ev_idle *idle, int revents) +{ + ev_idle_stop (EV_A_ idle); +} +#endif + +void +ev_embed_start (EV_P_ ev_embed *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + { + EV_P = w->other; + assert (("libev: loop to be embedded is not embeddable", backend & ev_embeddable_backends ())); + ev_io_init (&w->io, embed_io_cb, backend_fd, EV_READ); + } + + EV_FREQUENT_CHECK; + + ev_set_priority (&w->io, ev_priority (w)); + ev_io_start (EV_A_ &w->io); + + ev_prepare_init (&w->prepare, embed_prepare_cb); + ev_set_priority (&w->prepare, EV_MINPRI); + ev_prepare_start (EV_A_ &w->prepare); + +#if EV_FORK_ENABLE + ev_fork_init (&w->fork, embed_fork_cb); + ev_fork_start (EV_A_ &w->fork); +#endif + + /*ev_idle_init (&w->idle, e,bed_idle_cb);*/ + + ev_start (EV_A_ (W)w, 1); + + EV_FREQUENT_CHECK; +} + +void +ev_embed_stop (EV_P_ ev_embed *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + ev_io_stop (EV_A_ &w->io); + ev_prepare_stop (EV_A_ &w->prepare); +#if EV_FORK_ENABLE + ev_fork_stop (EV_A_ &w->fork); +#endif + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} +#endif + +#if EV_FORK_ENABLE +void +ev_fork_start (EV_P_ ev_fork *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + ev_start (EV_A_ (W)w, ++forkcnt); + array_needsize (ev_fork *, forks, forkmax, forkcnt, array_needsize_noinit); + forks [forkcnt - 1] = w; + + EV_FREQUENT_CHECK; +} + +void +ev_fork_stop (EV_P_ ev_fork *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + { + int active = ev_active (w); + + forks [active - 1] = forks [--forkcnt]; + ev_active (forks [active - 1]) = active; + } + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} +#endif + +#if EV_CLEANUP_ENABLE +void +ev_cleanup_start (EV_P_ ev_cleanup *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + ev_start (EV_A_ (W)w, ++cleanupcnt); + array_needsize (ev_cleanup *, cleanups, cleanupmax, cleanupcnt, array_needsize_noinit); + cleanups [cleanupcnt - 1] = w; + + /* cleanup watchers should never keep a refcount on the loop */ + ev_unref (EV_A); + EV_FREQUENT_CHECK; +} + +void +ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + ev_ref (EV_A); + + { + int active = ev_active (w); + + cleanups [active - 1] = cleanups [--cleanupcnt]; + ev_active (cleanups [active - 1]) = active; + } + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} +#endif + +#if EV_ASYNC_ENABLE +void +ev_async_start (EV_P_ ev_async *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + w->sent = 0; + + evpipe_init (EV_A); + + EV_FREQUENT_CHECK; + + ev_start (EV_A_ (W)w, ++asynccnt); + array_needsize (ev_async *, asyncs, asyncmax, asynccnt, array_needsize_noinit); + asyncs [asynccnt - 1] = w; + + EV_FREQUENT_CHECK; +} + +void +ev_async_stop (EV_P_ ev_async *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + { + int active = ev_active (w); + + asyncs [active - 1] = asyncs [--asynccnt]; + ev_active (asyncs [active - 1]) = active; + } + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} + +void +ev_async_send (EV_P_ ev_async *w) EV_NOEXCEPT +{ + w->sent = 1; + evpipe_write (EV_A_ &async_pending); +} +#endif + +/*****************************************************************************/ + +struct ev_once +{ + ev_io io; + ev_timer to; + void (*cb)(int revents, void *arg); + void *arg; +}; + +static void +once_cb (EV_P_ struct ev_once *once, int revents) +{ + void (*cb)(int revents, void *arg) = once->cb; + void *arg = once->arg; + + ev_io_stop (EV_A_ &once->io); + ev_timer_stop (EV_A_ &once->to); + ev_free (once); + + cb (revents, arg); +} + +static void +once_cb_io (EV_P_ ev_io *w, int revents) +{ + struct ev_once *once = (struct ev_once *)(((char *)w) - offsetof (struct ev_once, io)); + + once_cb (EV_A_ once, revents | ev_clear_pending (EV_A_ &once->to)); +} + +static void +once_cb_to (EV_P_ ev_timer *w, int revents) +{ + struct ev_once *once = (struct ev_once *)(((char *)w) - offsetof (struct ev_once, to)); + + once_cb (EV_A_ once, revents | ev_clear_pending (EV_A_ &once->io)); +} + +void +ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_NOEXCEPT +{ + struct ev_once *once = (struct ev_once *)ev_malloc (sizeof (struct ev_once)); + + once->cb = cb; + once->arg = arg; + + ev_init (&once->io, once_cb_io); + if (fd >= 0) + { + ev_io_set (&once->io, fd, events); + ev_io_start (EV_A_ &once->io); + } + + ev_init (&once->to, once_cb_to); + if (timeout >= 0.) + { + ev_timer_set (&once->to, timeout, 0.); + ev_timer_start (EV_A_ &once->to); + } +} + +/*****************************************************************************/ + +#if EV_WALK_ENABLE +ecb_cold +void +ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_NOEXCEPT +{ + int i, j; + ev_watcher_list *wl, *wn; + + if (types & (EV_IO | EV_EMBED)) + for (i = 0; i < anfdmax; ++i) + for (wl = anfds [i].head; wl; ) + { + wn = wl->next; + +#if EV_EMBED_ENABLE + if (ev_cb ((ev_io *)wl) == embed_io_cb) + { + if (types & EV_EMBED) + cb (EV_A_ EV_EMBED, ((char *)wl) - offsetof (struct ev_embed, io)); + } + else +#endif +#if EV_USE_INOTIFY + if (ev_cb ((ev_io *)wl) == infy_cb) + ; + else +#endif + if ((ev_io *)wl != &pipe_w) + if (types & EV_IO) + cb (EV_A_ EV_IO, wl); + + wl = wn; + } + + if (types & (EV_TIMER | EV_STAT)) + for (i = timercnt + HEAP0; i-- > HEAP0; ) +#if EV_STAT_ENABLE + /*TODO: timer is not always active*/ + if (ev_cb ((ev_timer *)ANHE_w (timers [i])) == stat_timer_cb) + { + if (types & EV_STAT) + cb (EV_A_ EV_STAT, ((char *)ANHE_w (timers [i])) - offsetof (struct ev_stat, timer)); + } + else +#endif + if (types & EV_TIMER) + cb (EV_A_ EV_TIMER, ANHE_w (timers [i])); + +#if EV_PERIODIC_ENABLE + if (types & EV_PERIODIC) + for (i = periodiccnt + HEAP0; i-- > HEAP0; ) + cb (EV_A_ EV_PERIODIC, ANHE_w (periodics [i])); +#endif + +#if EV_IDLE_ENABLE + if (types & EV_IDLE) + for (j = NUMPRI; j--; ) + for (i = idlecnt [j]; i--; ) + cb (EV_A_ EV_IDLE, idles [j][i]); +#endif + +#if EV_FORK_ENABLE + if (types & EV_FORK) + for (i = forkcnt; i--; ) + if (ev_cb (forks [i]) != embed_fork_cb) + cb (EV_A_ EV_FORK, forks [i]); +#endif + +#if EV_ASYNC_ENABLE + if (types & EV_ASYNC) + for (i = asynccnt; i--; ) + cb (EV_A_ EV_ASYNC, asyncs [i]); +#endif + +#if EV_PREPARE_ENABLE + if (types & EV_PREPARE) + for (i = preparecnt; i--; ) +# if EV_EMBED_ENABLE + if (ev_cb (prepares [i]) != embed_prepare_cb) +# endif + cb (EV_A_ EV_PREPARE, prepares [i]); +#endif + +#if EV_CHECK_ENABLE + if (types & EV_CHECK) + for (i = checkcnt; i--; ) + cb (EV_A_ EV_CHECK, checks [i]); +#endif + +#if EV_SIGNAL_ENABLE + if (types & EV_SIGNAL) + for (i = 0; i < EV_NSIG - 1; ++i) + for (wl = signals [i].head; wl; ) + { + wn = wl->next; + cb (EV_A_ EV_SIGNAL, wl); + wl = wn; + } +#endif + +#if EV_CHILD_ENABLE + if (types & EV_CHILD) + for (i = (EV_PID_HASHSIZE); i--; ) + for (wl = childs [i]; wl; ) + { + wn = wl->next; + cb (EV_A_ EV_CHILD, wl); + wl = wn; + } +#endif +/* EV_STAT 0x00001000 /* stat data changed */ +/* EV_EMBED 0x00010000 /* embedded event loop needs sweep */ +} +#endif + +#if EV_MULTIPLICITY + #include "ev_wrap.h" +#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev.h b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev.h new file mode 100644 index 0000000..e616216 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev.h @@ -0,0 +1,859 @@ +/* + * libev native API header + * + * Copyright (c) 2007-2020 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#ifndef EV_H_ +#define EV_H_ + +#ifdef __cplusplus +# define EV_CPP(x) x +# if __cplusplus >= 201103L +# define EV_NOEXCEPT noexcept +# else +# define EV_NOEXCEPT +# endif +#else +# define EV_CPP(x) +# define EV_NOEXCEPT +#endif +#define EV_THROW EV_NOEXCEPT /* pre-4.25, do not use in new code */ + +EV_CPP(extern "C" {) + +/*****************************************************************************/ + +/* pre-4.0 compatibility */ +#ifndef EV_COMPAT3 +# define EV_COMPAT3 1 +#endif + +#ifndef EV_FEATURES +# if defined __OPTIMIZE_SIZE__ +# define EV_FEATURES 0x7c +# else +# define EV_FEATURES 0x7f +# endif +#endif + +#define EV_FEATURE_CODE ((EV_FEATURES) & 1) +#define EV_FEATURE_DATA ((EV_FEATURES) & 2) +#define EV_FEATURE_CONFIG ((EV_FEATURES) & 4) +#define EV_FEATURE_API ((EV_FEATURES) & 8) +#define EV_FEATURE_WATCHERS ((EV_FEATURES) & 16) +#define EV_FEATURE_BACKENDS ((EV_FEATURES) & 32) +#define EV_FEATURE_OS ((EV_FEATURES) & 64) + +/* these priorities are inclusive, higher priorities will be invoked earlier */ +#ifndef EV_MINPRI +# define EV_MINPRI (EV_FEATURE_CONFIG ? -2 : 0) +#endif +#ifndef EV_MAXPRI +# define EV_MAXPRI (EV_FEATURE_CONFIG ? +2 : 0) +#endif + +#ifndef EV_MULTIPLICITY +# define EV_MULTIPLICITY EV_FEATURE_CONFIG +#endif + +#ifndef EV_PERIODIC_ENABLE +# define EV_PERIODIC_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_STAT_ENABLE +# define EV_STAT_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_PREPARE_ENABLE +# define EV_PREPARE_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_CHECK_ENABLE +# define EV_CHECK_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_IDLE_ENABLE +# define EV_IDLE_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_FORK_ENABLE +# define EV_FORK_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_CLEANUP_ENABLE +# define EV_CLEANUP_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_SIGNAL_ENABLE +# define EV_SIGNAL_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_CHILD_ENABLE +# ifdef _WIN32 +# define EV_CHILD_ENABLE 0 +# else +# define EV_CHILD_ENABLE EV_FEATURE_WATCHERS +#endif +#endif + +#ifndef EV_ASYNC_ENABLE +# define EV_ASYNC_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_EMBED_ENABLE +# define EV_EMBED_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_WALK_ENABLE +# define EV_WALK_ENABLE 0 /* not yet */ +#endif + +/*****************************************************************************/ + +#if EV_CHILD_ENABLE && !EV_SIGNAL_ENABLE +# undef EV_SIGNAL_ENABLE +# define EV_SIGNAL_ENABLE 1 +#endif + +/*****************************************************************************/ + +#ifndef EV_TSTAMP_T +# define EV_TSTAMP_T double +#endif +typedef EV_TSTAMP_T ev_tstamp; + +#include /* for memmove */ + +#ifndef EV_ATOMIC_T +# include +# define EV_ATOMIC_T sig_atomic_t volatile +#endif + +#if EV_STAT_ENABLE +# ifdef _WIN32 +# include +# include +# endif +# include +#endif + +/* support multiple event loops? */ +#if EV_MULTIPLICITY +struct ev_loop; +# define EV_P struct ev_loop *loop /* a loop as sole parameter in a declaration */ +# define EV_P_ EV_P, /* a loop as first of multiple parameters */ +# define EV_A loop /* a loop as sole argument to a function call */ +# define EV_A_ EV_A, /* a loop as first of multiple arguments */ +# define EV_DEFAULT_UC ev_default_loop_uc_ () /* the default loop, if initialised, as sole arg */ +# define EV_DEFAULT_UC_ EV_DEFAULT_UC, /* the default loop as first of multiple arguments */ +# define EV_DEFAULT ev_default_loop (0) /* the default loop as sole arg */ +# define EV_DEFAULT_ EV_DEFAULT, /* the default loop as first of multiple arguments */ +#else +# define EV_P void +# define EV_P_ +# define EV_A +# define EV_A_ +# define EV_DEFAULT +# define EV_DEFAULT_ +# define EV_DEFAULT_UC +# define EV_DEFAULT_UC_ +# undef EV_EMBED_ENABLE +#endif + +/* EV_INLINE is used for functions in header files */ +#if __STDC_VERSION__ >= 199901L || __GNUC__ >= 3 +# define EV_INLINE static inline +#else +# define EV_INLINE static +#endif + +#ifdef EV_API_STATIC +# define EV_API_DECL static +#else +# define EV_API_DECL extern +#endif + +/* EV_PROTOTYPES can be used to switch of prototype declarations */ +#ifndef EV_PROTOTYPES +# define EV_PROTOTYPES 1 +#endif + +/*****************************************************************************/ + +#define EV_VERSION_MAJOR 4 +#define EV_VERSION_MINOR 33 + +/* eventmask, revents, events... */ +enum { + EV_UNDEF = (int)0xFFFFFFFF, /* guaranteed to be invalid */ + EV_NONE = 0x00, /* no events */ + EV_READ = 0x01, /* ev_io detected read will not block */ + EV_WRITE = 0x02, /* ev_io detected write will not block */ + EV__IOFDSET = 0x80, /* internal use only */ + EV_IO = EV_READ, /* alias for type-detection */ + EV_TIMER = 0x00000100, /* timer timed out */ +#if EV_COMPAT3 + EV_TIMEOUT = EV_TIMER, /* pre 4.0 API compatibility */ +#endif + EV_PERIODIC = 0x00000200, /* periodic timer timed out */ + EV_SIGNAL = 0x00000400, /* signal was received */ + EV_CHILD = 0x00000800, /* child/pid had status change */ + EV_STAT = 0x00001000, /* stat data changed */ + EV_IDLE = 0x00002000, /* event loop is idling */ + EV_PREPARE = 0x00004000, /* event loop about to poll */ + EV_CHECK = 0x00008000, /* event loop finished poll */ + EV_EMBED = 0x00010000, /* embedded event loop needs sweep */ + EV_FORK = 0x00020000, /* event loop resumed in child */ + EV_CLEANUP = 0x00040000, /* event loop resumed in child */ + EV_ASYNC = 0x00080000, /* async intra-loop signal */ + EV_CUSTOM = 0x01000000, /* for use by user code */ + EV_ERROR = (int)0x80000000 /* sent when an error occurs */ +}; + +/* can be used to add custom fields to all watchers, while losing binary compatibility */ +#ifndef EV_COMMON +# define EV_COMMON void *data; +#endif + +#ifndef EV_CB_DECLARE +# define EV_CB_DECLARE(type) void (*cb)(EV_P_ struct type *w, int revents); +#endif +#ifndef EV_CB_INVOKE +# define EV_CB_INVOKE(watcher,revents) (watcher)->cb (EV_A_ (watcher), (revents)) +#endif + +/* not official, do not use */ +#define EV_CB(type,name) void name (EV_P_ struct ev_ ## type *w, int revents) + +/* + * struct member types: + * private: you may look at them, but not change them, + * and they might not mean anything to you. + * ro: can be read anytime, but only changed when the watcher isn't active. + * rw: can be read and modified anytime, even when the watcher is active. + * + * some internal details that might be helpful for debugging: + * + * active is either 0, which means the watcher is not active, + * or the array index of the watcher (periodics, timers) + * or the array index + 1 (most other watchers) + * or simply 1 for watchers that aren't in some array. + * pending is either 0, in which case the watcher isn't, + * or the array index + 1 in the pendings array. + */ + +#if EV_MINPRI == EV_MAXPRI +# define EV_DECL_PRIORITY +#elif !defined (EV_DECL_PRIORITY) +# define EV_DECL_PRIORITY int priority; +#endif + +/* shared by all watchers */ +#define EV_WATCHER(type) \ + int active; /* private */ \ + int pending; /* private */ \ + EV_DECL_PRIORITY /* private */ \ + EV_COMMON /* rw */ \ + EV_CB_DECLARE (type) /* private */ + +#define EV_WATCHER_LIST(type) \ + EV_WATCHER (type) \ + struct ev_watcher_list *next; /* private */ + +#define EV_WATCHER_TIME(type) \ + EV_WATCHER (type) \ + ev_tstamp at; /* private */ + +/* base class, nothing to see here unless you subclass */ +typedef struct ev_watcher +{ + EV_WATCHER (ev_watcher) +} ev_watcher; + +/* base class, nothing to see here unless you subclass */ +typedef struct ev_watcher_list +{ + EV_WATCHER_LIST (ev_watcher_list) +} ev_watcher_list; + +/* base class, nothing to see here unless you subclass */ +typedef struct ev_watcher_time +{ + EV_WATCHER_TIME (ev_watcher_time) +} ev_watcher_time; + +/* invoked when fd is either EV_READable or EV_WRITEable */ +/* revent EV_READ, EV_WRITE */ +typedef struct ev_io +{ + EV_WATCHER_LIST (ev_io) + + int fd; /* ro */ + int events; /* ro */ +} ev_io; + +/* invoked after a specific time, repeatable (based on monotonic clock) */ +/* revent EV_TIMEOUT */ +typedef struct ev_timer +{ + EV_WATCHER_TIME (ev_timer) + + ev_tstamp repeat; /* rw */ +} ev_timer; + +/* invoked at some specific time, possibly repeating at regular intervals (based on UTC) */ +/* revent EV_PERIODIC */ +typedef struct ev_periodic +{ + EV_WATCHER_TIME (ev_periodic) + + ev_tstamp offset; /* rw */ + ev_tstamp interval; /* rw */ + ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) EV_NOEXCEPT; /* rw */ +} ev_periodic; + +/* invoked when the given signal has been received */ +/* revent EV_SIGNAL */ +typedef struct ev_signal +{ + EV_WATCHER_LIST (ev_signal) + + int signum; /* ro */ +} ev_signal; + +/* invoked when sigchld is received and waitpid indicates the given pid */ +/* revent EV_CHILD */ +/* does not support priorities */ +typedef struct ev_child +{ + EV_WATCHER_LIST (ev_child) + + int flags; /* private */ + int pid; /* ro */ + int rpid; /* rw, holds the received pid */ + int rstatus; /* rw, holds the exit status, use the macros from sys/wait.h */ +} ev_child; + +#if EV_STAT_ENABLE +/* st_nlink = 0 means missing file or other error */ +# ifdef _WIN32 +typedef struct _stati64 ev_statdata; +# else +typedef struct stat ev_statdata; +# endif + +/* invoked each time the stat data changes for a given path */ +/* revent EV_STAT */ +typedef struct ev_stat +{ + EV_WATCHER_LIST (ev_stat) + + ev_timer timer; /* private */ + ev_tstamp interval; /* ro */ + const char *path; /* ro */ + ev_statdata prev; /* ro */ + ev_statdata attr; /* ro */ + + int wd; /* wd for inotify, fd for kqueue */ +} ev_stat; +#endif + +/* invoked when the nothing else needs to be done, keeps the process from blocking */ +/* revent EV_IDLE */ +typedef struct ev_idle +{ + EV_WATCHER (ev_idle) +} ev_idle; + +/* invoked for each run of the mainloop, just before the blocking call */ +/* you can still change events in any way you like */ +/* revent EV_PREPARE */ +typedef struct ev_prepare +{ + EV_WATCHER (ev_prepare) +} ev_prepare; + +/* invoked for each run of the mainloop, just after the blocking call */ +/* revent EV_CHECK */ +typedef struct ev_check +{ + EV_WATCHER (ev_check) +} ev_check; + +/* the callback gets invoked before check in the child process when a fork was detected */ +/* revent EV_FORK */ +typedef struct ev_fork +{ + EV_WATCHER (ev_fork) +} ev_fork; + +/* is invoked just before the loop gets destroyed */ +/* revent EV_CLEANUP */ +typedef struct ev_cleanup +{ + EV_WATCHER (ev_cleanup) +} ev_cleanup; + +#if EV_EMBED_ENABLE +/* used to embed an event loop inside another */ +/* the callback gets invoked when the event loop has handled events, and can be 0 */ +typedef struct ev_embed +{ + EV_WATCHER (ev_embed) + + struct ev_loop *other; /* ro */ +#undef EV_IO_ENABLE +#define EV_IO_ENABLE 1 + ev_io io; /* private */ +#undef EV_PREPARE_ENABLE +#define EV_PREPARE_ENABLE 1 + ev_prepare prepare; /* private */ + ev_check check; /* unused */ + ev_timer timer; /* unused */ + ev_periodic periodic; /* unused */ + ev_idle idle; /* unused */ + ev_fork fork; /* private */ + ev_cleanup cleanup; /* unused */ +} ev_embed; +#endif + +#if EV_ASYNC_ENABLE +/* invoked when somebody calls ev_async_send on the watcher */ +/* revent EV_ASYNC */ +typedef struct ev_async +{ + EV_WATCHER (ev_async) + + EV_ATOMIC_T sent; /* private */ +} ev_async; + +# define ev_async_pending(w) (+(w)->sent) +#endif + +/* the presence of this union forces similar struct layout */ +union ev_any_watcher +{ + struct ev_watcher w; + struct ev_watcher_list wl; + + struct ev_io io; + struct ev_timer timer; + struct ev_periodic periodic; + struct ev_signal signal; + struct ev_child child; +#if EV_STAT_ENABLE + struct ev_stat stat; +#endif +#if EV_IDLE_ENABLE + struct ev_idle idle; +#endif + struct ev_prepare prepare; + struct ev_check check; +#if EV_FORK_ENABLE + struct ev_fork fork; +#endif +#if EV_CLEANUP_ENABLE + struct ev_cleanup cleanup; +#endif +#if EV_EMBED_ENABLE + struct ev_embed embed; +#endif +#if EV_ASYNC_ENABLE + struct ev_async async; +#endif +}; + +/* flag bits for ev_default_loop and ev_loop_new */ +enum { + /* the default */ + EVFLAG_AUTO = 0x00000000U, /* not quite a mask */ + /* flag bits */ + EVFLAG_NOENV = 0x01000000U, /* do NOT consult environment */ + EVFLAG_FORKCHECK = 0x02000000U, /* check for a fork in each iteration */ + /* debugging/feature disable */ + EVFLAG_NOINOTIFY = 0x00100000U, /* do not attempt to use inotify */ +#if EV_COMPAT3 + EVFLAG_NOSIGFD = 0, /* compatibility to pre-3.9 */ +#endif + EVFLAG_SIGNALFD = 0x00200000U, /* attempt to use signalfd */ + EVFLAG_NOSIGMASK = 0x00400000U, /* avoid modifying the signal mask */ + EVFLAG_NOTIMERFD = 0x00800000U /* avoid creating a timerfd */ +}; + +/* method bits to be ored together */ +enum { + EVBACKEND_SELECT = 0x00000001U, /* available just about anywhere */ + EVBACKEND_POLL = 0x00000002U, /* !win, !aix, broken on osx */ + EVBACKEND_EPOLL = 0x00000004U, /* linux */ + EVBACKEND_KQUEUE = 0x00000008U, /* bsd, broken on osx */ + EVBACKEND_DEVPOLL = 0x00000010U, /* solaris 8 */ /* NYI */ + EVBACKEND_PORT = 0x00000020U, /* solaris 10 */ + EVBACKEND_LINUXAIO = 0x00000040U, /* linux AIO, 4.19+ */ + EVBACKEND_IOURING = 0x00000080U, /* linux io_uring, 5.1+ */ + EVBACKEND_ALL = 0x000000FFU, /* all known backends */ + EVBACKEND_MASK = 0x0000FFFFU /* all future backends */ +}; + +#if EV_PROTOTYPES +EV_API_DECL int ev_version_major (void) EV_NOEXCEPT; +EV_API_DECL int ev_version_minor (void) EV_NOEXCEPT; + +EV_API_DECL unsigned int ev_supported_backends (void) EV_NOEXCEPT; +EV_API_DECL unsigned int ev_recommended_backends (void) EV_NOEXCEPT; +EV_API_DECL unsigned int ev_embeddable_backends (void) EV_NOEXCEPT; + +EV_API_DECL ev_tstamp ev_time (void) EV_NOEXCEPT; +EV_API_DECL void ev_sleep (ev_tstamp delay) EV_NOEXCEPT; /* sleep for a while */ + +/* Sets the allocation function to use, works like realloc. + * It is used to allocate and free memory. + * If it returns zero when memory needs to be allocated, the library might abort + * or take some potentially destructive action. + * The default is your system realloc function. + */ +EV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, size_t size) EV_NOEXCEPT) EV_NOEXCEPT; + +/* set the callback function to call on a + * retryable syscall error + * (such as failed select, poll, epoll_wait) + */ +EV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT; + +#if EV_MULTIPLICITY + +/* the default loop is the only one that handles signals and child watchers */ +/* you can call this as often as you like */ +EV_API_DECL struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; + +#ifdef EV_API_STATIC +EV_API_DECL struct ev_loop *ev_default_loop_ptr; +#endif + +EV_INLINE struct ev_loop * +ev_default_loop_uc_ (void) EV_NOEXCEPT +{ + extern struct ev_loop *ev_default_loop_ptr; + + return ev_default_loop_ptr; +} + +EV_INLINE int +ev_is_default_loop (EV_P) EV_NOEXCEPT +{ + return EV_A == EV_DEFAULT_UC; +} + +/* create and destroy alternative loops that don't handle signals */ +EV_API_DECL struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; + +EV_API_DECL ev_tstamp ev_now (EV_P) EV_NOEXCEPT; /* time w.r.t. timers and the eventloop, updated after each poll */ + +#else + +EV_API_DECL int ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; /* returns true when successful */ + +EV_API_DECL ev_tstamp ev_rt_now; + +EV_INLINE ev_tstamp +ev_now (void) EV_NOEXCEPT +{ + return ev_rt_now; +} + +/* looks weird, but ev_is_default_loop (EV_A) still works if this exists */ +EV_INLINE int +ev_is_default_loop (void) EV_NOEXCEPT +{ + return 1; +} + +#endif /* multiplicity */ + +/* destroy event loops, also works for the default loop */ +EV_API_DECL void ev_loop_destroy (EV_P); + +/* this needs to be called after fork, to duplicate the loop */ +/* when you want to re-use it in the child */ +/* you can call it in either the parent or the child */ +/* you can actually call it at any time, anywhere :) */ +EV_API_DECL void ev_loop_fork (EV_P) EV_NOEXCEPT; + +EV_API_DECL unsigned int ev_backend (EV_P) EV_NOEXCEPT; /* backend in use by loop */ + +EV_API_DECL void ev_now_update (EV_P) EV_NOEXCEPT; /* update event loop time */ + +#if EV_WALK_ENABLE +/* walk (almost) all watchers in the loop of a given type, invoking the */ +/* callback on every such watcher. The callback might stop the watcher, */ +/* but do nothing else with the loop */ +EV_API_DECL void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_NOEXCEPT; +#endif + +#endif /* prototypes */ + +/* ev_run flags values */ +enum { + EVRUN_NOWAIT = 1, /* do not block/wait */ + EVRUN_ONCE = 2 /* block *once* only */ +}; + +/* ev_break how values */ +enum { + EVBREAK_CANCEL = 0, /* undo unloop */ + EVBREAK_ONE = 1, /* unloop once */ + EVBREAK_ALL = 2 /* unloop all loops */ +}; + +#if EV_PROTOTYPES +EV_API_DECL int ev_run (EV_P_ int flags EV_CPP (= 0)); +EV_API_DECL void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)) EV_NOEXCEPT; /* break out of the loop */ + +/* + * ref/unref can be used to add or remove a refcount on the mainloop. every watcher + * keeps one reference. if you have a long-running watcher you never unregister that + * should not keep ev_loop from running, unref() after starting, and ref() before stopping. + */ +EV_API_DECL void ev_ref (EV_P) EV_NOEXCEPT; +EV_API_DECL void ev_unref (EV_P) EV_NOEXCEPT; + +/* + * convenience function, wait for a single event, without registering an event watcher + * if timeout is < 0, do wait indefinitely + */ +EV_API_DECL void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_NOEXCEPT; + +EV_API_DECL void ev_invoke_pending (EV_P); /* invoke all pending watchers */ + +# if EV_FEATURE_API +EV_API_DECL unsigned int ev_iteration (EV_P) EV_NOEXCEPT; /* number of loop iterations */ +EV_API_DECL unsigned int ev_depth (EV_P) EV_NOEXCEPT; /* #ev_loop enters - #ev_loop leaves */ +EV_API_DECL void ev_verify (EV_P) EV_NOEXCEPT; /* abort if loop data corrupted */ + +EV_API_DECL void ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */ +EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */ + +/* advanced stuff for threading etc. support, see docs */ +EV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_NOEXCEPT; +EV_API_DECL void *ev_userdata (EV_P) EV_NOEXCEPT; +typedef void (*ev_loop_callback)(EV_P); +EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_NOEXCEPT; +/* C++ doesn't allow the use of the ev_loop_callback typedef here, so we need to spell it out */ +EV_API_DECL void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_NOEXCEPT, void (*acquire)(EV_P) EV_NOEXCEPT) EV_NOEXCEPT; + +EV_API_DECL unsigned int ev_pending_count (EV_P) EV_NOEXCEPT; /* number of pending events, if any */ + +/* + * stop/start the timer handling. + */ +EV_API_DECL void ev_suspend (EV_P) EV_NOEXCEPT; +EV_API_DECL void ev_resume (EV_P) EV_NOEXCEPT; +#endif + +#endif + +/* these may evaluate ev multiple times, and the other arguments at most once */ +/* either use ev_init + ev_TYPE_set, or the ev_TYPE_init macro, below, to first initialise a watcher */ +#define ev_init(ev,cb_) do { \ + ((ev_watcher *)(void *)(ev))->active = \ + ((ev_watcher *)(void *)(ev))->pending = 0; \ + ev_set_priority ((ev), 0); \ + ev_set_cb ((ev), cb_); \ +} while (0) + +#define ev_io_modify(ev,events_) do { (ev)->events = (ev)->events & EV__IOFDSET | (events_); } while (0) +#define ev_io_set(ev,fd_,events_) do { (ev)->fd = (fd_); (ev)->events = (events_) | EV__IOFDSET; } while (0) +#define ev_timer_set(ev,after_,repeat_) do { ((ev_watcher_time *)(ev))->at = (after_); (ev)->repeat = (repeat_); } while (0) +#define ev_periodic_set(ev,ofs_,ival_,rcb_) do { (ev)->offset = (ofs_); (ev)->interval = (ival_); (ev)->reschedule_cb = (rcb_); } while (0) +#define ev_signal_set(ev,signum_) do { (ev)->signum = (signum_); } while (0) +#define ev_child_set(ev,pid_,trace_) do { (ev)->pid = (pid_); (ev)->flags = !!(trace_); } while (0) +#define ev_stat_set(ev,path_,interval_) do { (ev)->path = (path_); (ev)->interval = (interval_); (ev)->wd = -2; } while (0) +#define ev_idle_set(ev) /* nop, yes, this is a serious in-joke */ +#define ev_prepare_set(ev) /* nop, yes, this is a serious in-joke */ +#define ev_check_set(ev) /* nop, yes, this is a serious in-joke */ +#define ev_embed_set(ev,other_) do { (ev)->other = (other_); } while (0) +#define ev_fork_set(ev) /* nop, yes, this is a serious in-joke */ +#define ev_cleanup_set(ev) /* nop, yes, this is a serious in-joke */ +#define ev_async_set(ev) /* nop, yes, this is a serious in-joke */ + +#define ev_io_init(ev,cb,fd,events) do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0) +#define ev_timer_init(ev,cb,after,repeat) do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0) +#define ev_periodic_init(ev,cb,ofs,ival,rcb) do { ev_init ((ev), (cb)); ev_periodic_set ((ev),(ofs),(ival),(rcb)); } while (0) +#define ev_signal_init(ev,cb,signum) do { ev_init ((ev), (cb)); ev_signal_set ((ev), (signum)); } while (0) +#define ev_child_init(ev,cb,pid,trace) do { ev_init ((ev), (cb)); ev_child_set ((ev),(pid),(trace)); } while (0) +#define ev_stat_init(ev,cb,path,interval) do { ev_init ((ev), (cb)); ev_stat_set ((ev),(path),(interval)); } while (0) +#define ev_idle_init(ev,cb) do { ev_init ((ev), (cb)); ev_idle_set ((ev)); } while (0) +#define ev_prepare_init(ev,cb) do { ev_init ((ev), (cb)); ev_prepare_set ((ev)); } while (0) +#define ev_check_init(ev,cb) do { ev_init ((ev), (cb)); ev_check_set ((ev)); } while (0) +#define ev_embed_init(ev,cb,other) do { ev_init ((ev), (cb)); ev_embed_set ((ev),(other)); } while (0) +#define ev_fork_init(ev,cb) do { ev_init ((ev), (cb)); ev_fork_set ((ev)); } while (0) +#define ev_cleanup_init(ev,cb) do { ev_init ((ev), (cb)); ev_cleanup_set ((ev)); } while (0) +#define ev_async_init(ev,cb) do { ev_init ((ev), (cb)); ev_async_set ((ev)); } while (0) + +#define ev_is_pending(ev) (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */ +#define ev_is_active(ev) (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */ + +#define ev_cb_(ev) (ev)->cb /* rw */ +#define ev_cb(ev) (memmove (&ev_cb_ (ev), &((ev_watcher *)(ev))->cb, sizeof (ev_cb_ (ev))), (ev)->cb) + +#if EV_MINPRI == EV_MAXPRI +# define ev_priority(ev) ((ev), EV_MINPRI) +# define ev_set_priority(ev,pri) ((ev), (pri)) +#else +# define ev_priority(ev) (+(((ev_watcher *)(void *)(ev))->priority)) +# define ev_set_priority(ev,pri) ( (ev_watcher *)(void *)(ev))->priority = (pri) +#endif + +#define ev_periodic_at(ev) (+((ev_watcher_time *)(ev))->at) + +#ifndef ev_set_cb +/* memmove is used here to avoid strict aliasing violations, and hopefully is optimized out by any reasonable compiler */ +# define ev_set_cb(ev,cb_) (ev_cb_ (ev) = (cb_), memmove (&((ev_watcher *)(ev))->cb, &ev_cb_ (ev), sizeof (ev_cb_ (ev)))) +#endif + +/* stopping (enabling, adding) a watcher does nothing if it is already running */ +/* stopping (disabling, deleting) a watcher does nothing unless it's already running */ +#if EV_PROTOTYPES + +/* feeds an event into a watcher as if the event actually occurred */ +/* accepts any ev_watcher type */ +EV_API_DECL void ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT; +EV_API_DECL void ev_feed_fd_event (EV_P_ int fd, int revents) EV_NOEXCEPT; +#if EV_SIGNAL_ENABLE +EV_API_DECL void ev_feed_signal (int signum) EV_NOEXCEPT; +EV_API_DECL void ev_feed_signal_event (EV_P_ int signum) EV_NOEXCEPT; +#endif +EV_API_DECL void ev_invoke (EV_P_ void *w, int revents); +EV_API_DECL int ev_clear_pending (EV_P_ void *w) EV_NOEXCEPT; + +EV_API_DECL void ev_io_start (EV_P_ ev_io *w) EV_NOEXCEPT; +EV_API_DECL void ev_io_stop (EV_P_ ev_io *w) EV_NOEXCEPT; + +EV_API_DECL void ev_timer_start (EV_P_ ev_timer *w) EV_NOEXCEPT; +EV_API_DECL void ev_timer_stop (EV_P_ ev_timer *w) EV_NOEXCEPT; +/* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */ +EV_API_DECL void ev_timer_again (EV_P_ ev_timer *w) EV_NOEXCEPT; +/* return remaining time */ +EV_API_DECL ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w) EV_NOEXCEPT; + +#if EV_PERIODIC_ENABLE +EV_API_DECL void ev_periodic_start (EV_P_ ev_periodic *w) EV_NOEXCEPT; +EV_API_DECL void ev_periodic_stop (EV_P_ ev_periodic *w) EV_NOEXCEPT; +EV_API_DECL void ev_periodic_again (EV_P_ ev_periodic *w) EV_NOEXCEPT; +#endif + +/* only supported in the default loop */ +#if EV_SIGNAL_ENABLE +EV_API_DECL void ev_signal_start (EV_P_ ev_signal *w) EV_NOEXCEPT; +EV_API_DECL void ev_signal_stop (EV_P_ ev_signal *w) EV_NOEXCEPT; +#endif + +/* only supported in the default loop */ +# if EV_CHILD_ENABLE +EV_API_DECL void ev_child_start (EV_P_ ev_child *w) EV_NOEXCEPT; +EV_API_DECL void ev_child_stop (EV_P_ ev_child *w) EV_NOEXCEPT; +# endif + +# if EV_STAT_ENABLE +EV_API_DECL void ev_stat_start (EV_P_ ev_stat *w) EV_NOEXCEPT; +EV_API_DECL void ev_stat_stop (EV_P_ ev_stat *w) EV_NOEXCEPT; +EV_API_DECL void ev_stat_stat (EV_P_ ev_stat *w) EV_NOEXCEPT; +# endif + +# if EV_IDLE_ENABLE +EV_API_DECL void ev_idle_start (EV_P_ ev_idle *w) EV_NOEXCEPT; +EV_API_DECL void ev_idle_stop (EV_P_ ev_idle *w) EV_NOEXCEPT; +# endif + +#if EV_PREPARE_ENABLE +EV_API_DECL void ev_prepare_start (EV_P_ ev_prepare *w) EV_NOEXCEPT; +EV_API_DECL void ev_prepare_stop (EV_P_ ev_prepare *w) EV_NOEXCEPT; +#endif + +#if EV_CHECK_ENABLE +EV_API_DECL void ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT; +EV_API_DECL void ev_check_stop (EV_P_ ev_check *w) EV_NOEXCEPT; +#endif + +# if EV_FORK_ENABLE +EV_API_DECL void ev_fork_start (EV_P_ ev_fork *w) EV_NOEXCEPT; +EV_API_DECL void ev_fork_stop (EV_P_ ev_fork *w) EV_NOEXCEPT; +# endif + +# if EV_CLEANUP_ENABLE +EV_API_DECL void ev_cleanup_start (EV_P_ ev_cleanup *w) EV_NOEXCEPT; +EV_API_DECL void ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_NOEXCEPT; +# endif + +# if EV_EMBED_ENABLE +/* only supported when loop to be embedded is in fact embeddable */ +EV_API_DECL void ev_embed_start (EV_P_ ev_embed *w) EV_NOEXCEPT; +EV_API_DECL void ev_embed_stop (EV_P_ ev_embed *w) EV_NOEXCEPT; +EV_API_DECL void ev_embed_sweep (EV_P_ ev_embed *w) EV_NOEXCEPT; +# endif + +# if EV_ASYNC_ENABLE +EV_API_DECL void ev_async_start (EV_P_ ev_async *w) EV_NOEXCEPT; +EV_API_DECL void ev_async_stop (EV_P_ ev_async *w) EV_NOEXCEPT; +EV_API_DECL void ev_async_send (EV_P_ ev_async *w) EV_NOEXCEPT; +# endif + +#if EV_COMPAT3 + #define EVLOOP_NONBLOCK EVRUN_NOWAIT + #define EVLOOP_ONESHOT EVRUN_ONCE + #define EVUNLOOP_CANCEL EVBREAK_CANCEL + #define EVUNLOOP_ONE EVBREAK_ONE + #define EVUNLOOP_ALL EVBREAK_ALL + #if EV_PROTOTYPES + EV_INLINE void ev_loop (EV_P_ int flags) { ev_run (EV_A_ flags); } + EV_INLINE void ev_unloop (EV_P_ int how ) { ev_break (EV_A_ how ); } + EV_INLINE void ev_default_destroy (void) { ev_loop_destroy (EV_DEFAULT); } + EV_INLINE void ev_default_fork (void) { ev_loop_fork (EV_DEFAULT); } + #if EV_FEATURE_API + EV_INLINE unsigned int ev_loop_count (EV_P) { return ev_iteration (EV_A); } + EV_INLINE unsigned int ev_loop_depth (EV_P) { return ev_depth (EV_A); } + EV_INLINE void ev_loop_verify (EV_P) { ev_verify (EV_A); } + #endif + #endif +#else + typedef struct ev_loop ev_loop; +#endif + +#endif + +EV_CPP(}) + +#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_epoll.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_epoll.c new file mode 100644 index 0000000..58cfa68 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_epoll.c @@ -0,0 +1,298 @@ +/* + * libev epoll fd activity backend + * + * Copyright (c) 2007,2008,2009,2010,2011,2016,2017,2019 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +/* + * general notes about epoll: + * + * a) epoll silently removes fds from the fd set. as nothing tells us + * that an fd has been removed otherwise, we have to continually + * "rearm" fds that we suspect *might* have changed (same + * problem with kqueue, but much less costly there). + * b) the fact that ADD != MOD creates a lot of extra syscalls due to a) + * and seems not to have any advantage. + * c) the inability to handle fork or file descriptors (think dup) + * limits the applicability over poll, so this is not a generic + * poll replacement. + * d) epoll doesn't work the same as select with many file descriptors + * (such as files). while not critical, no other advanced interface + * seems to share this (rather non-unixy) limitation. + * e) epoll claims to be embeddable, but in practise you never get + * a ready event for the epoll fd (broken: <=2.6.26, working: >=2.6.32). + * f) epoll_ctl returning EPERM means the fd is always ready. + * + * lots of "weird code" and complication handling in this file is due + * to these design problems with epoll, as we try very hard to avoid + * epoll_ctl syscalls for common usage patterns and handle the breakage + * ensuing from receiving events for closed and otherwise long gone + * file descriptors. + */ + +#include + +#define EV_EMASK_EPERM 0x80 + +static void +epoll_modify (EV_P_ int fd, int oev, int nev) +{ + struct epoll_event ev; + unsigned char oldmask; + + /* + * we handle EPOLL_CTL_DEL by ignoring it here + * on the assumption that the fd is gone anyways + * if that is wrong, we have to handle the spurious + * event in epoll_poll. + * if the fd is added again, we try to ADD it, and, if that + * fails, we assume it still has the same eventmask. + */ + if (!nev) + return; + + oldmask = anfds [fd].emask; + anfds [fd].emask = nev; + + /* store the generation counter in the upper 32 bits, the fd in the lower 32 bits */ + ev.data.u64 = (uint64_t)(uint32_t)fd + | ((uint64_t)(uint32_t)++anfds [fd].egen << 32); + ev.events = (nev & EV_READ ? EPOLLIN : 0) + | (nev & EV_WRITE ? EPOLLOUT : 0); + + if (ecb_expect_true (!epoll_ctl (backend_fd, oev && oldmask != nev ? EPOLL_CTL_MOD : EPOLL_CTL_ADD, fd, &ev))) + return; + + if (ecb_expect_true (errno == ENOENT)) + { + /* if ENOENT then the fd went away, so try to do the right thing */ + if (!nev) + goto dec_egen; + + if (!epoll_ctl (backend_fd, EPOLL_CTL_ADD, fd, &ev)) + return; + } + else if (ecb_expect_true (errno == EEXIST)) + { + /* EEXIST means we ignored a previous DEL, but the fd is still active */ + /* if the kernel mask is the same as the new mask, we assume it hasn't changed */ + if (oldmask == nev) + goto dec_egen; + + if (!epoll_ctl (backend_fd, EPOLL_CTL_MOD, fd, &ev)) + return; + } + else if (ecb_expect_true (errno == EPERM)) + { + /* EPERM means the fd is always ready, but epoll is too snobbish */ + /* to handle it, unlike select or poll. */ + anfds [fd].emask = EV_EMASK_EPERM; + + /* add fd to epoll_eperms, if not already inside */ + if (!(oldmask & EV_EMASK_EPERM)) + { + array_needsize (int, epoll_eperms, epoll_epermmax, epoll_epermcnt + 1, array_needsize_noinit); + epoll_eperms [epoll_epermcnt++] = fd; + } + + return; + } + else + assert (("libev: I/O watcher with invalid fd found in epoll_ctl", errno != EBADF && errno != ELOOP && errno != EINVAL)); + + fd_kill (EV_A_ fd); + +dec_egen: + /* we didn't successfully call epoll_ctl, so decrement the generation counter again */ + --anfds [fd].egen; +} + +static void +epoll_poll (EV_P_ ev_tstamp timeout) +{ + int i; + int eventcnt; + + if (ecb_expect_false (epoll_epermcnt)) + timeout = EV_TS_CONST (0.); + + /* epoll wait times cannot be larger than (LONG_MAX - 999UL) / HZ msecs, which is below */ + /* the default libev max wait time, however. */ + EV_RELEASE_CB; + eventcnt = epoll_wait (backend_fd, epoll_events, epoll_eventmax, EV_TS_TO_MSEC (timeout)); + EV_ACQUIRE_CB; + + if (ecb_expect_false (eventcnt < 0)) + { + if (errno != EINTR) + ev_syserr ("(libev) epoll_wait"); + + return; + } + + for (i = 0; i < eventcnt; ++i) + { + struct epoll_event *ev = epoll_events + i; + + int fd = (uint32_t)ev->data.u64; /* mask out the lower 32 bits */ + int want = anfds [fd].events; + int got = (ev->events & (EPOLLOUT | EPOLLERR | EPOLLHUP) ? EV_WRITE : 0) + | (ev->events & (EPOLLIN | EPOLLERR | EPOLLHUP) ? EV_READ : 0); + + /* + * check for spurious notification. + * this only finds spurious notifications on egen updates + * other spurious notifications will be found by epoll_ctl, below + * we assume that fd is always in range, as we never shrink the anfds array + */ + if (ecb_expect_false ((uint32_t)anfds [fd].egen != (uint32_t)(ev->data.u64 >> 32))) + { + /* recreate kernel state */ + postfork |= 2; + continue; + } + + if (ecb_expect_false (got & ~want)) + { + anfds [fd].emask = want; + + /* + * we received an event but are not interested in it, try mod or del + * this often happens because we optimistically do not unregister fds + * when we are no longer interested in them, but also when we get spurious + * notifications for fds from another process. this is partially handled + * above with the gencounter check (== our fd is not the event fd), and + * partially here, when epoll_ctl returns an error (== a child has the fd + * but we closed it). + * note: for events such as POLLHUP, where we can't know whether it refers + * to EV_READ or EV_WRITE, we might issue redundant EPOLL_CTL_MOD calls. + */ + ev->events = (want & EV_READ ? EPOLLIN : 0) + | (want & EV_WRITE ? EPOLLOUT : 0); + + /* pre-2.6.9 kernels require a non-null pointer with EPOLL_CTL_DEL, */ + /* which is fortunately easy to do for us. */ + if (epoll_ctl (backend_fd, want ? EPOLL_CTL_MOD : EPOLL_CTL_DEL, fd, ev)) + { + postfork |= 2; /* an error occurred, recreate kernel state */ + continue; + } + } + + fd_event (EV_A_ fd, got); + } + + /* if the receive array was full, increase its size */ + if (ecb_expect_false (eventcnt == epoll_eventmax)) + { + ev_free (epoll_events); + epoll_eventmax = array_nextsize (sizeof (struct epoll_event), epoll_eventmax, epoll_eventmax + 1); + epoll_events = (struct epoll_event *)ev_malloc (sizeof (struct epoll_event) * epoll_eventmax); + } + + /* now synthesize events for all fds where epoll fails, while select works... */ + for (i = epoll_epermcnt; i--; ) + { + int fd = epoll_eperms [i]; + unsigned char events = anfds [fd].events & (EV_READ | EV_WRITE); + + if (anfds [fd].emask & EV_EMASK_EPERM && events) + fd_event (EV_A_ fd, events); + else + { + epoll_eperms [i] = epoll_eperms [--epoll_epermcnt]; + anfds [fd].emask = 0; + } + } +} + +static int +epoll_epoll_create (void) +{ + int fd; + +#if defined EPOLL_CLOEXEC && !defined __ANDROID__ + fd = epoll_create1 (EPOLL_CLOEXEC); + + if (fd < 0 && (errno == EINVAL || errno == ENOSYS)) +#endif + { + fd = epoll_create (256); + + if (fd >= 0) + fcntl (fd, F_SETFD, FD_CLOEXEC); + } + + return fd; +} + +inline_size +int +epoll_init (EV_P_ int flags) +{ + if ((backend_fd = epoll_epoll_create ()) < 0) + return 0; + + backend_mintime = EV_TS_CONST (1e-3); /* epoll does sometimes return early, this is just to avoid the worst */ + backend_modify = epoll_modify; + backend_poll = epoll_poll; + + epoll_eventmax = 64; /* initial number of events receivable per poll */ + epoll_events = (struct epoll_event *)ev_malloc (sizeof (struct epoll_event) * epoll_eventmax); + + return EVBACKEND_EPOLL; +} + +inline_size +void +epoll_destroy (EV_P) +{ + ev_free (epoll_events); + array_free (epoll_eperm, EMPTY); +} + +ecb_cold +static void +epoll_fork (EV_P) +{ + close (backend_fd); + + while ((backend_fd = epoll_epoll_create ()) < 0) + ev_syserr ("(libev) epoll_create"); + + fd_rearm_all (EV_A); +} + diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_iouring.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_iouring.c new file mode 100644 index 0000000..30a3d5f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_iouring.c @@ -0,0 +1,694 @@ +/* + * libev linux io_uring fd activity backend + * + * Copyright (c) 2019-2020 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +/* + * general notes about linux io_uring: + * + * a) it's the best interface I have seen so far. on linux. + * b) best is not necessarily very good. + * c) it's better than the aio mess, doesn't suffer from the fork problems + * of linux aio or epoll and so on and so on. and you could do event stuff + * without any syscalls. what's not to like? + * d) ok, it's vastly more complex, but that's ok, really. + * e) why two mmaps instead of one? one would be more space-efficient, + * and I can't see what benefit two would have (other than being + * somehow resizable/relocatable, but that's apparently not possible). + * f) hmm, it's practically undebuggable (gdb can't access the memory, and + * the bizarre way structure offsets are communicated makes it hard to + * just print the ring buffer heads, even *iff* the memory were visible + * in gdb. but then, that's also ok, really. + * g) well, you cannot specify a timeout when waiting for events. no, + * seriously, the interface doesn't support a timeout. never seen _that_ + * before. sure, you can use a timerfd, but that's another syscall + * you could have avoided. overall, this bizarre omission smells + * like a µ-optimisation by the io_uring author for his personal + * applications, to the detriment of everybody else who just wants + * an event loop. but, umm, ok, if that's all, it could be worse. + * (from what I gather from the author Jens Axboe, it simply didn't + * occur to him, and he made good on it by adding an unlimited nuber + * of timeouts later :). + * h) initially there was a hardcoded limit of 4096 outstanding events. + * later versions not only bump this to 32k, but also can handle + * an unlimited amount of events, so this only affects the batch size. + * i) unlike linux aio, you *can* register more then the limit + * of fd events. while early verisons of io_uring signalled an overflow + * and you ended up getting wet. 5.5+ does not do this anymore. + * j) but, oh my! it had exactly the same bugs as the linux aio backend, + * where some undocumented poll combinations just fail. fortunately, + * after finally reaching the author, he was more than willing to fix + * this probably in 5.6+. + * k) overall, the *API* itself is, I dare to say, not a total trainwreck. + * once the bugs ae fixed (probably in 5.6+), it will be without + * competition. + */ + +/* TODO: use internal TIMEOUT */ +/* TODO: take advantage of single mmap, NODROP etc. */ +/* TODO: resize cq/sq size independently */ + +#include +#include +#include +#include + +#define IOURING_INIT_ENTRIES 32 + +/*****************************************************************************/ +/* syscall wrapdadoop - this section has the raw api/abi definitions */ + +#include +#include + +/* mostly directly taken from the kernel or documentation */ + +struct io_uring_sqe +{ + __u8 opcode; + __u8 flags; + __u16 ioprio; + __s32 fd; + union { + __u64 off; + __u64 addr2; + }; + __u64 addr; + __u32 len; + union { + __kernel_rwf_t rw_flags; + __u32 fsync_flags; + __u16 poll_events; + __u32 sync_range_flags; + __u32 msg_flags; + __u32 timeout_flags; + __u32 accept_flags; + __u32 cancel_flags; + __u32 open_flags; + __u32 statx_flags; + }; + __u64 user_data; + union { + __u16 buf_index; + __u64 __pad2[3]; + }; +}; + +struct io_uring_cqe +{ + __u64 user_data; + __s32 res; + __u32 flags; +}; + +struct io_sqring_offsets +{ + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 flags; + __u32 dropped; + __u32 array; + __u32 resv1; + __u64 resv2; +}; + +struct io_cqring_offsets +{ + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 overflow; + __u32 cqes; + __u64 resv[2]; +}; + +struct io_uring_params +{ + __u32 sq_entries; + __u32 cq_entries; + __u32 flags; + __u32 sq_thread_cpu; + __u32 sq_thread_idle; + __u32 features; + __u32 resv[4]; + struct io_sqring_offsets sq_off; + struct io_cqring_offsets cq_off; +}; + +#define IORING_SETUP_CQSIZE 0x00000008 + +#define IORING_OP_POLL_ADD 6 +#define IORING_OP_POLL_REMOVE 7 +#define IORING_OP_TIMEOUT 11 +#define IORING_OP_TIMEOUT_REMOVE 12 + +/* relative or absolute, reference clock is CLOCK_MONOTONIC */ +struct iouring_kernel_timespec +{ + int64_t tv_sec; + long long tv_nsec; +}; + +#define IORING_TIMEOUT_ABS 0x00000001 + +#define IORING_ENTER_GETEVENTS 0x01 + +#define IORING_OFF_SQ_RING 0x00000000ULL +#define IORING_OFF_CQ_RING 0x08000000ULL +#define IORING_OFF_SQES 0x10000000ULL + +#define IORING_FEAT_SINGLE_MMAP 0x00000001 +#define IORING_FEAT_NODROP 0x00000002 +#define IORING_FEAT_SUBMIT_STABLE 0x00000004 + +inline_size +int +evsys_io_uring_setup (unsigned entries, struct io_uring_params *params) +{ + return ev_syscall2 (SYS_io_uring_setup, entries, params); +} + +inline_size +int +evsys_io_uring_enter (int fd, unsigned to_submit, unsigned min_complete, unsigned flags, const sigset_t *sig, size_t sigsz) +{ + return ev_syscall6 (SYS_io_uring_enter, fd, to_submit, min_complete, flags, sig, sigsz); +} + +/*****************************************************************************/ +/* actual backed implementation */ + +/* we hope that volatile will make the compiler access this variables only once */ +#define EV_SQ_VAR(name) *(volatile unsigned *)((char *)iouring_sq_ring + iouring_sq_ ## name) +#define EV_CQ_VAR(name) *(volatile unsigned *)((char *)iouring_cq_ring + iouring_cq_ ## name) + +/* the index array */ +#define EV_SQ_ARRAY ((unsigned *)((char *)iouring_sq_ring + iouring_sq_array)) + +/* the submit/completion queue entries */ +#define EV_SQES ((struct io_uring_sqe *) iouring_sqes) +#define EV_CQES ((struct io_uring_cqe *)((char *)iouring_cq_ring + iouring_cq_cqes)) + +inline_speed +int +iouring_enter (EV_P_ ev_tstamp timeout) +{ + int res; + + EV_RELEASE_CB; + + res = evsys_io_uring_enter (iouring_fd, iouring_to_submit, 1, + timeout > EV_TS_CONST (0.) ? IORING_ENTER_GETEVENTS : 0, 0, 0); + + assert (("libev: io_uring_enter did not consume all sqes", (res < 0 || res == iouring_to_submit))); + + iouring_to_submit = 0; + + EV_ACQUIRE_CB; + + return res; +} + +/* TODO: can we move things around so we don't need this forward-reference? */ +static void +iouring_poll (EV_P_ ev_tstamp timeout); + +static +struct io_uring_sqe * +iouring_sqe_get (EV_P) +{ + unsigned tail; + + for (;;) + { + tail = EV_SQ_VAR (tail); + + if (ecb_expect_true (tail + 1 - EV_SQ_VAR (head) <= EV_SQ_VAR (ring_entries))) + break; /* whats the problem, we have free sqes */ + + /* queue full, need to flush and possibly handle some events */ + +#if EV_FEATURE_CODE + /* first we ask the kernel nicely, most often this frees up some sqes */ + int res = iouring_enter (EV_A_ EV_TS_CONST (0.)); + + ECB_MEMORY_FENCE_ACQUIRE; /* better safe than sorry */ + + if (res >= 0) + continue; /* yes, it worked, try again */ +#endif + + /* some problem, possibly EBUSY - do the full poll and let it handle any issues */ + + iouring_poll (EV_A_ EV_TS_CONST (0.)); + /* iouring_poll should have done ECB_MEMORY_FENCE_ACQUIRE for us */ + } + + /*assert (("libev: io_uring queue full after flush", tail + 1 - EV_SQ_VAR (head) <= EV_SQ_VAR (ring_entries)));*/ + + return EV_SQES + (tail & EV_SQ_VAR (ring_mask)); +} + +inline_size +void +iouring_sqe_submit (EV_P_ struct io_uring_sqe *sqe) +{ + unsigned idx = sqe - EV_SQES; + + EV_SQ_ARRAY [idx] = idx; + ECB_MEMORY_FENCE_RELEASE; + ++EV_SQ_VAR (tail); + /*ECB_MEMORY_FENCE_RELEASE; /* for the time being we assume this is not needed */ + ++iouring_to_submit; +} + +/*****************************************************************************/ + +/* when the timerfd expires we simply note the fact, + * as the purpose of the timerfd is to wake us up, nothing else. + * the next iteration should re-set it. + */ +static void +iouring_tfd_cb (EV_P_ struct ev_io *w, int revents) +{ + iouring_tfd_to = EV_TSTAMP_HUGE; +} + +/* called for full and partial cleanup */ +ecb_cold +static void +iouring_internal_destroy (EV_P) +{ + close (iouring_tfd); + close (iouring_fd); + + if (iouring_sq_ring != MAP_FAILED) munmap (iouring_sq_ring, iouring_sq_ring_size); + if (iouring_cq_ring != MAP_FAILED) munmap (iouring_cq_ring, iouring_cq_ring_size); + if (iouring_sqes != MAP_FAILED) munmap (iouring_sqes , iouring_sqes_size ); + + if (ev_is_active (&iouring_tfd_w)) + { + ev_ref (EV_A); + ev_io_stop (EV_A_ &iouring_tfd_w); + } +} + +ecb_cold +static int +iouring_internal_init (EV_P) +{ + struct io_uring_params params = { 0 }; + + iouring_to_submit = 0; + + iouring_tfd = -1; + iouring_sq_ring = MAP_FAILED; + iouring_cq_ring = MAP_FAILED; + iouring_sqes = MAP_FAILED; + + if (!have_monotonic) /* cannot really happen, but what if11 */ + return -1; + + for (;;) + { + iouring_fd = evsys_io_uring_setup (iouring_entries, ¶ms); + + if (iouring_fd >= 0) + break; /* yippie */ + + if (errno != EINVAL) + return -1; /* we failed */ + +#if TODO + if ((~params.features) & (IORING_FEAT_NODROP | IORING_FEATURE_SINGLE_MMAP | IORING_FEAT_SUBMIT_STABLE)) + return -1; /* we require the above features */ +#endif + + /* EINVAL: lots of possible reasons, but maybe + * it is because we hit the unqueryable hardcoded size limit + */ + + /* we hit the limit already, give up */ + if (iouring_max_entries) + return -1; + + /* first time we hit EINVAL? assume we hit the limit, so go back and retry */ + iouring_entries >>= 1; + iouring_max_entries = iouring_entries; + } + + iouring_sq_ring_size = params.sq_off.array + params.sq_entries * sizeof (unsigned); + iouring_cq_ring_size = params.cq_off.cqes + params.cq_entries * sizeof (struct io_uring_cqe); + iouring_sqes_size = params.sq_entries * sizeof (struct io_uring_sqe); + + iouring_sq_ring = mmap (0, iouring_sq_ring_size, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, iouring_fd, IORING_OFF_SQ_RING); + iouring_cq_ring = mmap (0, iouring_cq_ring_size, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, iouring_fd, IORING_OFF_CQ_RING); + iouring_sqes = mmap (0, iouring_sqes_size, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, iouring_fd, IORING_OFF_SQES); + + if (iouring_sq_ring == MAP_FAILED || iouring_cq_ring == MAP_FAILED || iouring_sqes == MAP_FAILED) + return -1; + + iouring_sq_head = params.sq_off.head; + iouring_sq_tail = params.sq_off.tail; + iouring_sq_ring_mask = params.sq_off.ring_mask; + iouring_sq_ring_entries = params.sq_off.ring_entries; + iouring_sq_flags = params.sq_off.flags; + iouring_sq_dropped = params.sq_off.dropped; + iouring_sq_array = params.sq_off.array; + + iouring_cq_head = params.cq_off.head; + iouring_cq_tail = params.cq_off.tail; + iouring_cq_ring_mask = params.cq_off.ring_mask; + iouring_cq_ring_entries = params.cq_off.ring_entries; + iouring_cq_overflow = params.cq_off.overflow; + iouring_cq_cqes = params.cq_off.cqes; + + iouring_tfd = timerfd_create (CLOCK_MONOTONIC, TFD_CLOEXEC); + + if (iouring_tfd < 0) + return iouring_tfd; + + iouring_tfd_to = EV_TSTAMP_HUGE; + + return 0; +} + +ecb_cold +static void +iouring_fork (EV_P) +{ + iouring_internal_destroy (EV_A); + + while (iouring_internal_init (EV_A) < 0) + ev_syserr ("(libev) io_uring_setup"); + + fd_rearm_all (EV_A); + + ev_io_stop (EV_A_ &iouring_tfd_w); + ev_io_set (EV_A_ &iouring_tfd_w, iouring_tfd, EV_READ); + ev_io_start (EV_A_ &iouring_tfd_w); +} + +/*****************************************************************************/ + +static void +iouring_modify (EV_P_ int fd, int oev, int nev) +{ + if (oev) + { + /* we assume the sqe's are all "properly" initialised */ + struct io_uring_sqe *sqe = iouring_sqe_get (EV_A); + sqe->opcode = IORING_OP_POLL_REMOVE; + sqe->fd = fd; + /* Jens Axboe notified me that user_data is not what is documented, but is + * some kind of unique ID that has to match, otherwise the request cannot + * be removed. Since we don't *really* have that, we pass in the old + * generation counter - if that fails, too bad, it will hopefully be removed + * at close time and then be ignored. */ + sqe->addr = (uint32_t)fd | ((__u64)(uint32_t)anfds [fd].egen << 32); + sqe->user_data = (uint64_t)-1; + iouring_sqe_submit (EV_A_ sqe); + + /* increment generation counter to avoid handling old events */ + ++anfds [fd].egen; + } + + if (nev) + { + struct io_uring_sqe *sqe = iouring_sqe_get (EV_A); + sqe->opcode = IORING_OP_POLL_ADD; + sqe->fd = fd; + sqe->addr = 0; + sqe->user_data = (uint32_t)fd | ((__u64)(uint32_t)anfds [fd].egen << 32); + sqe->poll_events = + (nev & EV_READ ? POLLIN : 0) + | (nev & EV_WRITE ? POLLOUT : 0); + iouring_sqe_submit (EV_A_ sqe); + } +} + +inline_size +void +iouring_tfd_update (EV_P_ ev_tstamp timeout) +{ + ev_tstamp tfd_to = mn_now + timeout; + + /* we assume there will be many iterations per timer change, so + * we only re-set the timerfd when we have to because its expiry + * is too late. + */ + if (ecb_expect_false (tfd_to < iouring_tfd_to)) + { + struct itimerspec its; + + iouring_tfd_to = tfd_to; + EV_TS_SET (its.it_interval, 0.); + EV_TS_SET (its.it_value, tfd_to); + + if (timerfd_settime (iouring_tfd, TFD_TIMER_ABSTIME, &its, 0) < 0) + assert (("libev: iouring timerfd_settime failed", 0)); + } +} + +inline_size +void +iouring_process_cqe (EV_P_ struct io_uring_cqe *cqe) +{ + int fd = cqe->user_data & 0xffffffffU; + uint32_t gen = cqe->user_data >> 32; + int res = cqe->res; + + /* user_data -1 is a remove that we are not atm. interested in */ + if (cqe->user_data == (uint64_t)-1) + return; + + assert (("libev: io_uring fd must be in-bounds", fd >= 0 && fd < anfdmax)); + + /* documentation lies, of course. the result value is NOT like + * normal syscalls, but like linux raw syscalls, i.e. negative + * error numbers. fortunate, as otherwise there would be no way + * to get error codes at all. still, why not document this? + */ + + /* ignore event if generation doesn't match */ + /* other than skipping removal events, */ + /* this should actually be very rare */ + if (ecb_expect_false (gen != (uint32_t)anfds [fd].egen)) + return; + + if (ecb_expect_false (res < 0)) + { + /*TODO: EINVAL handling (was something failed with this fd)*/ + + if (res == -EBADF) + { + assert (("libev: event loop rejected bad fd", res != -EBADF)); + fd_kill (EV_A_ fd); + } + else + { + errno = -res; + ev_syserr ("(libev) IORING_OP_POLL_ADD"); + } + + return; + } + + /* feed events, we do not expect or handle POLLNVAL */ + fd_event ( + EV_A_ + fd, + (res & (POLLOUT | POLLERR | POLLHUP) ? EV_WRITE : 0) + | (res & (POLLIN | POLLERR | POLLHUP) ? EV_READ : 0) + ); + + /* io_uring is oneshot, so we need to re-arm the fd next iteration */ + /* this also means we usually have to do at least one syscall per iteration */ + anfds [fd].events = 0; + fd_change (EV_A_ fd, EV_ANFD_REIFY); +} + +/* called when the event queue overflows */ +ecb_cold +static void +iouring_overflow (EV_P) +{ + /* we have two options, resize the queue (by tearing down + * everything and recreating it, or living with it + * and polling. + * we implement this by resizing the queue, and, if that fails, + * we just recreate the state on every failure, which + * kind of is a very inefficient poll. + * one danger is, due to the bios toward lower fds, + * we will only really get events for those, so + * maybe we need a poll() fallback, after all. + */ + /*EV_CQ_VAR (overflow) = 0;*/ /* need to do this if we keep the state and poll manually */ + + fd_rearm_all (EV_A); + + /* we double the size until we hit the hard-to-probe maximum */ + if (!iouring_max_entries) + { + iouring_entries <<= 1; + iouring_fork (EV_A); + } + else + { + /* we hit the kernel limit, we should fall back to something else. + * we can either poll() a few times and hope for the best, + * poll always, or switch to epoll. + * TODO: is this necessary with newer kernels? + */ + + iouring_internal_destroy (EV_A); + + /* this should make it so that on return, we don't call any uring functions */ + iouring_to_submit = 0; + + for (;;) + { + backend = epoll_init (EV_A_ 0); + + if (backend) + break; + + ev_syserr ("(libev) iouring switch to epoll"); + } + } +} + +/* handle any events in the completion queue, return true if there were any */ +static int +iouring_handle_cq (EV_P) +{ + unsigned head, tail, mask; + + head = EV_CQ_VAR (head); + ECB_MEMORY_FENCE_ACQUIRE; + tail = EV_CQ_VAR (tail); + + if (head == tail) + return 0; + + /* it can only overflow if we have events, yes, yes? */ + if (ecb_expect_false (EV_CQ_VAR (overflow))) + { + iouring_overflow (EV_A); + return 1; + } + + mask = EV_CQ_VAR (ring_mask); + + do + iouring_process_cqe (EV_A_ &EV_CQES [head++ & mask]); + while (head != tail); + + EV_CQ_VAR (head) = head; + ECB_MEMORY_FENCE_RELEASE; + + return 1; +} + +static void +iouring_poll (EV_P_ ev_tstamp timeout) +{ + /* if we have events, no need for extra syscalls, but we might have to queue events */ + /* we also clar the timeout if there are outstanding fdchanges */ + /* the latter should only happen if both the sq and cq are full, most likely */ + /* because we have a lot of event sources that immediately complete */ + /* TODO: fdchacngecnt is always 0 because fd_reify does not have two buffers yet */ + if (iouring_handle_cq (EV_A) || fdchangecnt) + timeout = EV_TS_CONST (0.); + else + /* no events, so maybe wait for some */ + iouring_tfd_update (EV_A_ timeout); + + /* only enter the kernel if we have something to submit, or we need to wait */ + if (timeout || iouring_to_submit) + { + int res = iouring_enter (EV_A_ timeout); + + if (ecb_expect_false (res < 0)) + if (errno == EINTR) + /* ignore */; + else if (errno == EBUSY) + /* cq full, cannot submit - should be rare because we flush the cq first, so simply ignore */; + else + ev_syserr ("(libev) iouring setup"); + else + iouring_handle_cq (EV_A); + } +} + +inline_size +int +iouring_init (EV_P_ int flags) +{ + iouring_entries = IOURING_INIT_ENTRIES; + iouring_max_entries = 0; + + if (iouring_internal_init (EV_A) < 0) + { + iouring_internal_destroy (EV_A); + return 0; + } + + ev_io_init (&iouring_tfd_w, iouring_tfd_cb, iouring_tfd, EV_READ); + ev_set_priority (&iouring_tfd_w, EV_MINPRI); + ev_io_start (EV_A_ &iouring_tfd_w); + ev_unref (EV_A); /* watcher should not keep loop alive */ + + backend_modify = iouring_modify; + backend_poll = iouring_poll; + + return EVBACKEND_IOURING; +} + +inline_size +void +iouring_destroy (EV_P) +{ + iouring_internal_destroy (EV_A); +} + diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_kqueue.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_kqueue.c new file mode 100644 index 0000000..69c5147 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_kqueue.c @@ -0,0 +1,224 @@ +/* + * libev kqueue backend + * + * Copyright (c) 2007,2008,2009,2010,2011,2012,2013,2016,2019 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#include +#include +#include +#include +#include + +inline_speed +void +kqueue_change (EV_P_ int fd, int filter, int flags, int fflags) +{ + ++kqueue_changecnt; + array_needsize (struct kevent, kqueue_changes, kqueue_changemax, kqueue_changecnt, array_needsize_noinit); + + EV_SET (&kqueue_changes [kqueue_changecnt - 1], fd, filter, flags, fflags, 0, 0); +} + +/* OS X at least needs this */ +#ifndef EV_ENABLE +# define EV_ENABLE 0 +#endif +#ifndef NOTE_EOF +# define NOTE_EOF 0 +#endif + +static void +kqueue_modify (EV_P_ int fd, int oev, int nev) +{ + if (oev != nev) + { + if (oev & EV_READ) + kqueue_change (EV_A_ fd, EVFILT_READ , EV_DELETE, 0); + + if (oev & EV_WRITE) + kqueue_change (EV_A_ fd, EVFILT_WRITE, EV_DELETE, 0); + } + + /* to detect close/reopen reliably, we have to re-add */ + /* event requests even when oev == nev */ + + if (nev & EV_READ) + kqueue_change (EV_A_ fd, EVFILT_READ , EV_ADD | EV_ENABLE, NOTE_EOF); + + if (nev & EV_WRITE) + kqueue_change (EV_A_ fd, EVFILT_WRITE, EV_ADD | EV_ENABLE, NOTE_EOF); +} + +static void +kqueue_poll (EV_P_ ev_tstamp timeout) +{ + int res, i; + struct timespec ts; + + /* need to resize so there is enough space for errors */ + if (kqueue_changecnt > kqueue_eventmax) + { + ev_free (kqueue_events); + kqueue_eventmax = array_nextsize (sizeof (struct kevent), kqueue_eventmax, kqueue_changecnt); + kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax); + } + + EV_RELEASE_CB; + EV_TS_SET (ts, timeout); + res = kevent (backend_fd, kqueue_changes, kqueue_changecnt, kqueue_events, kqueue_eventmax, &ts); + EV_ACQUIRE_CB; + kqueue_changecnt = 0; + + if (ecb_expect_false (res < 0)) + { + if (errno != EINTR) + ev_syserr ("(libev) kqueue kevent"); + + return; + } + + for (i = 0; i < res; ++i) + { + int fd = kqueue_events [i].ident; + + if (ecb_expect_false (kqueue_events [i].flags & EV_ERROR)) + { + int err = kqueue_events [i].data; + + /* we are only interested in errors for fds that we are interested in :) */ + if (anfds [fd].events) + { + if (err == ENOENT) /* resubmit changes on ENOENT */ + kqueue_modify (EV_A_ fd, 0, anfds [fd].events); + else if (err == EBADF) /* on EBADF, we re-check the fd */ + { + if (fd_valid (fd)) + kqueue_modify (EV_A_ fd, 0, anfds [fd].events); + else + { + assert (("libev: kqueue found invalid fd", 0)); + fd_kill (EV_A_ fd); + } + } + else /* on all other errors, we error out on the fd */ + { + assert (("libev: kqueue found invalid fd", 0)); + fd_kill (EV_A_ fd); + } + } + } + else + fd_event ( + EV_A_ + fd, + kqueue_events [i].filter == EVFILT_READ ? EV_READ + : kqueue_events [i].filter == EVFILT_WRITE ? EV_WRITE + : 0 + ); + } + + if (ecb_expect_false (res == kqueue_eventmax)) + { + ev_free (kqueue_events); + kqueue_eventmax = array_nextsize (sizeof (struct kevent), kqueue_eventmax, kqueue_eventmax + 1); + kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax); + } +} + +inline_size +int +kqueue_init (EV_P_ int flags) +{ + /* initialize the kernel queue */ + kqueue_fd_pid = getpid (); + if ((backend_fd = kqueue ()) < 0) + return 0; + + fcntl (backend_fd, F_SETFD, FD_CLOEXEC); /* not sure if necessary, hopefully doesn't hurt */ + + backend_mintime = EV_TS_CONST (1e-9); /* apparently, they did the right thing in freebsd */ + backend_modify = kqueue_modify; + backend_poll = kqueue_poll; + + kqueue_eventmax = 64; /* initial number of events receivable per poll */ + kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax); + + kqueue_changes = 0; + kqueue_changemax = 0; + kqueue_changecnt = 0; + + return EVBACKEND_KQUEUE; +} + +inline_size +void +kqueue_destroy (EV_P) +{ + ev_free (kqueue_events); + ev_free (kqueue_changes); +} + +inline_size +void +kqueue_fork (EV_P) +{ + /* some BSD kernels don't just destroy the kqueue itself, + * but also close the fd, which isn't documented, and + * impossible to support properly. + * we remember the pid of the kqueue call and only close + * the fd if the pid is still the same. + * this leaks fds on sane kernels, but BSD interfaces are + * notoriously buggy and rarely get fixed. + */ + pid_t newpid = getpid (); + + if (newpid == kqueue_fd_pid) + close (backend_fd); + + kqueue_fd_pid = newpid; + while ((backend_fd = kqueue ()) < 0) + ev_syserr ("(libev) kqueue"); + + fcntl (backend_fd, F_SETFD, FD_CLOEXEC); + + /* re-register interest in fds */ + fd_rearm_all (EV_A); +} + +/* sys/event.h defines EV_ERROR */ +#undef EV_ERROR + diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_linuxaio.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_linuxaio.c new file mode 100644 index 0000000..4687a70 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_linuxaio.c @@ -0,0 +1,620 @@ +/* + * libev linux aio fd activity backend + * + * Copyright (c) 2019 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +/* + * general notes about linux aio: + * + * a) at first, the linux aio IOCB_CMD_POLL functionality introduced in + * 4.18 looks too good to be true: both watchers and events can be + * batched, and events can even be handled in userspace using + * a ring buffer shared with the kernel. watchers can be canceled + * regardless of whether the fd has been closed. no problems with fork. + * ok, the ring buffer is 200% undocumented (there isn't even a + * header file), but otherwise, it's pure bliss! + * b) ok, watchers are one-shot, so you have to re-arm active ones + * on every iteration. so much for syscall-less event handling, + * but at least these re-arms can be batched, no big deal, right? + * c) well, linux as usual: the documentation lies to you: io_submit + * sometimes returns EINVAL because the kernel doesn't feel like + * handling your poll mask - ttys can be polled for POLLOUT, + * POLLOUT|POLLIN, but polling for POLLIN fails. just great, + * so we have to fall back to something else (hello, epoll), + * but at least the fallback can be slow, because these are + * exceptional cases, right? + * d) hmm, you have to tell the kernel the maximum number of watchers + * you want to queue when initialising the aio context. but of + * course the real limit is magically calculated in the kernel, and + * is often higher then we asked for. so we just have to destroy + * the aio context and re-create it a bit larger if we hit the limit. + * (starts to remind you of epoll? well, it's a bit more deterministic + * and less gambling, but still ugly as hell). + * e) that's when you find out you can also hit an arbitrary system-wide + * limit. or the kernel simply doesn't want to handle your watchers. + * what the fuck do we do then? you guessed it, in the middle + * of event handling we have to switch to 100% epoll polling. and + * that better is as fast as normal epoll polling, so you practically + * have to use the normal epoll backend with all its quirks. + * f) end result of this train wreck: it inherits all the disadvantages + * from epoll, while adding a number on its own. why even bother to use + * it? because if conditions are right and your fds are supported and you + * don't hit a limit, this backend is actually faster, doesn't gamble with + * your fds, batches watchers and events and doesn't require costly state + * recreates. well, until it does. + * g) all of this makes this backend use almost twice as much code as epoll. + * which in turn uses twice as much code as poll. and that#s not counting + * the fact that this backend also depends on the epoll backend, making + * it three times as much code as poll, or kqueue. + * h) bleah. why can't linux just do kqueue. sure kqueue is ugly, but by now + * it's clear that whatever linux comes up with is far, far, far worse. + */ + +#include /* actually linux/time.h, but we must assume they are compatible */ +#include +#include + +/*****************************************************************************/ +/* syscall wrapdadoop - this section has the raw api/abi definitions */ + +#include /* no glibc wrappers */ + +/* aio_abi.h is not versioned in any way, so we cannot test for its existance */ +#define IOCB_CMD_POLL 5 + +/* taken from linux/fs/aio.c. yup, that's a .c file. + * not only is this totally undocumented, not even the source code + * can tell you what the future semantics of compat_features and + * incompat_features are, or what header_length actually is for. + */ +#define AIO_RING_MAGIC 0xa10a10a1 +#define EV_AIO_RING_INCOMPAT_FEATURES 0 +struct aio_ring +{ + unsigned id; /* kernel internal index number */ + unsigned nr; /* number of io_events */ + unsigned head; /* Written to by userland or by kernel. */ + unsigned tail; + + unsigned magic; + unsigned compat_features; + unsigned incompat_features; + unsigned header_length; /* size of aio_ring */ + + struct io_event io_events[0]; +}; + +inline_size +int +evsys_io_setup (unsigned nr_events, aio_context_t *ctx_idp) +{ + return ev_syscall2 (SYS_io_setup, nr_events, ctx_idp); +} + +inline_size +int +evsys_io_destroy (aio_context_t ctx_id) +{ + return ev_syscall1 (SYS_io_destroy, ctx_id); +} + +inline_size +int +evsys_io_submit (aio_context_t ctx_id, long nr, struct iocb *cbp[]) +{ + return ev_syscall3 (SYS_io_submit, ctx_id, nr, cbp); +} + +inline_size +int +evsys_io_cancel (aio_context_t ctx_id, struct iocb *cbp, struct io_event *result) +{ + return ev_syscall3 (SYS_io_cancel, ctx_id, cbp, result); +} + +inline_size +int +evsys_io_getevents (aio_context_t ctx_id, long min_nr, long nr, struct io_event *events, struct timespec *timeout) +{ + return ev_syscall5 (SYS_io_getevents, ctx_id, min_nr, nr, events, timeout); +} + +/*****************************************************************************/ +/* actual backed implementation */ + +ecb_cold +static int +linuxaio_nr_events (EV_P) +{ + /* we start with 16 iocbs and incraese from there + * that's tiny, but the kernel has a rather low system-wide + * limit that can be reached quickly, so let's be parsimonious + * with this resource. + * Rest assured, the kernel generously rounds up small and big numbers + * in different ways (but doesn't seem to charge you for it). + * The 15 here is because the kernel usually has a power of two as aio-max-nr, + * and this helps to take advantage of that limit. + */ + + /* we try to fill 4kB pages exactly. + * the ring buffer header is 32 bytes, every io event is 32 bytes. + * the kernel takes the io requests number, doubles it, adds 2 + * and adds the ring buffer. + * the way we use this is by starting low, and then roughly doubling the + * size each time we hit a limit. + */ + + int requests = 15 << linuxaio_iteration; + int one_page = (4096 + / sizeof (struct io_event) ) / 2; /* how many fit into one page */ + int first_page = ((4096 - sizeof (struct aio_ring)) + / sizeof (struct io_event) - 2) / 2; /* how many fit into the first page */ + + /* if everything fits into one page, use count exactly */ + if (requests > first_page) + /* otherwise, round down to full pages and add the first page */ + requests = requests / one_page * one_page + first_page; + + return requests; +} + +/* we use out own wrapper structure in case we ever want to do something "clever" */ +typedef struct aniocb +{ + struct iocb io; + /*int inuse;*/ +} *ANIOCBP; + +inline_size +void +linuxaio_array_needsize_iocbp (ANIOCBP *base, int offset, int count) +{ + while (count--) + { + /* TODO: quite the overhead to allocate every iocb separately, maybe use our own allocator? */ + ANIOCBP iocb = (ANIOCBP)ev_malloc (sizeof (*iocb)); + + /* full zero initialise is probably not required at the moment, but + * this is not well documented, so we better do it. + */ + memset (iocb, 0, sizeof (*iocb)); + + iocb->io.aio_lio_opcode = IOCB_CMD_POLL; + iocb->io.aio_fildes = offset; + + base [offset++] = iocb; + } +} + +ecb_cold +static void +linuxaio_free_iocbp (EV_P) +{ + while (linuxaio_iocbpmax--) + ev_free (linuxaio_iocbps [linuxaio_iocbpmax]); + + linuxaio_iocbpmax = 0; /* next resize will completely reallocate the array, at some overhead */ +} + +static void +linuxaio_modify (EV_P_ int fd, int oev, int nev) +{ + array_needsize (ANIOCBP, linuxaio_iocbps, linuxaio_iocbpmax, fd + 1, linuxaio_array_needsize_iocbp); + ANIOCBP iocb = linuxaio_iocbps [fd]; + ANFD *anfd = &anfds [fd]; + + if (ecb_expect_false (iocb->io.aio_reqprio < 0)) + { + /* we handed this fd over to epoll, so undo this first */ + /* we do it manually because the optimisations on epoll_modify won't do us any good */ + epoll_ctl (backend_fd, EPOLL_CTL_DEL, fd, 0); + anfd->emask = 0; + iocb->io.aio_reqprio = 0; + } + else if (ecb_expect_false (iocb->io.aio_buf)) + { + /* iocb active, so cancel it first before resubmit */ + /* this assumes we only ever get one call per fd per loop iteration */ + for (;;) + { + /* on all relevant kernels, io_cancel fails with EINPROGRESS on "success" */ + if (ecb_expect_false (evsys_io_cancel (linuxaio_ctx, &iocb->io, (struct io_event *)0) == 0)) + break; + + if (ecb_expect_true (errno == EINPROGRESS)) + break; + + /* the EINPROGRESS test is for nicer error message. clumsy. */ + if (errno != EINTR) + { + assert (("libev: linuxaio unexpected io_cancel failed", errno != EINTR && errno != EINPROGRESS)); + break; + } + } + + /* increment generation counter to avoid handling old events */ + ++anfd->egen; + } + + iocb->io.aio_buf = (nev & EV_READ ? POLLIN : 0) + | (nev & EV_WRITE ? POLLOUT : 0); + + if (nev) + { + iocb->io.aio_data = (uint32_t)fd | ((__u64)(uint32_t)anfd->egen << 32); + + /* queue iocb up for io_submit */ + /* this assumes we only ever get one call per fd per loop iteration */ + ++linuxaio_submitcnt; + array_needsize (struct iocb *, linuxaio_submits, linuxaio_submitmax, linuxaio_submitcnt, array_needsize_noinit); + linuxaio_submits [linuxaio_submitcnt - 1] = &iocb->io; + } +} + +static void +linuxaio_epoll_cb (EV_P_ struct ev_io *w, int revents) +{ + epoll_poll (EV_A_ 0); +} + +inline_speed +void +linuxaio_fd_rearm (EV_P_ int fd) +{ + anfds [fd].events = 0; + linuxaio_iocbps [fd]->io.aio_buf = 0; + fd_change (EV_A_ fd, EV_ANFD_REIFY); +} + +static void +linuxaio_parse_events (EV_P_ struct io_event *ev, int nr) +{ + while (nr) + { + int fd = ev->data & 0xffffffff; + uint32_t gen = ev->data >> 32; + int res = ev->res; + + assert (("libev: iocb fd must be in-bounds", fd >= 0 && fd < anfdmax)); + + /* only accept events if generation counter matches */ + if (ecb_expect_true (gen == (uint32_t)anfds [fd].egen)) + { + /* feed events, we do not expect or handle POLLNVAL */ + fd_event ( + EV_A_ + fd, + (res & (POLLOUT | POLLERR | POLLHUP) ? EV_WRITE : 0) + | (res & (POLLIN | POLLERR | POLLHUP) ? EV_READ : 0) + ); + + /* linux aio is oneshot: rearm fd. TODO: this does more work than strictly needed */ + linuxaio_fd_rearm (EV_A_ fd); + } + + --nr; + ++ev; + } +} + +/* get any events from ring buffer, return true if any were handled */ +static int +linuxaio_get_events_from_ring (EV_P) +{ + struct aio_ring *ring = (struct aio_ring *)linuxaio_ctx; + unsigned head, tail; + + /* the kernel reads and writes both of these variables, */ + /* as a C extension, we assume that volatile use here */ + /* both makes reads atomic and once-only */ + head = *(volatile unsigned *)&ring->head; + ECB_MEMORY_FENCE_ACQUIRE; + tail = *(volatile unsigned *)&ring->tail; + + if (head == tail) + return 0; + + /* parse all available events, but only once, to avoid starvation */ + if (ecb_expect_true (tail > head)) /* normal case around */ + linuxaio_parse_events (EV_A_ ring->io_events + head, tail - head); + else /* wrapped around */ + { + linuxaio_parse_events (EV_A_ ring->io_events + head, ring->nr - head); + linuxaio_parse_events (EV_A_ ring->io_events, tail); + } + + ECB_MEMORY_FENCE_RELEASE; + /* as an extension to C, we hope that the volatile will make this atomic and once-only */ + *(volatile unsigned *)&ring->head = tail; + + return 1; +} + +inline_size +int +linuxaio_ringbuf_valid (EV_P) +{ + struct aio_ring *ring = (struct aio_ring *)linuxaio_ctx; + + return ecb_expect_true (ring->magic == AIO_RING_MAGIC) + && ring->incompat_features == EV_AIO_RING_INCOMPAT_FEATURES + && ring->header_length == sizeof (struct aio_ring); /* TODO: or use it to find io_event[0]? */ +} + +/* read at least one event from kernel, or timeout */ +inline_size +void +linuxaio_get_events (EV_P_ ev_tstamp timeout) +{ + struct timespec ts; + struct io_event ioev[8]; /* 256 octet stack space */ + int want = 1; /* how many events to request */ + int ringbuf_valid = linuxaio_ringbuf_valid (EV_A); + + if (ecb_expect_true (ringbuf_valid)) + { + /* if the ring buffer has any events, we don't wait or call the kernel at all */ + if (linuxaio_get_events_from_ring (EV_A)) + return; + + /* if the ring buffer is empty, and we don't have a timeout, then don't call the kernel */ + if (!timeout) + return; + } + else + /* no ringbuffer, request slightly larger batch */ + want = sizeof (ioev) / sizeof (ioev [0]); + + /* no events, so wait for some + * for fairness reasons, we do this in a loop, to fetch all events + */ + for (;;) + { + int res; + + EV_RELEASE_CB; + + EV_TS_SET (ts, timeout); + res = evsys_io_getevents (linuxaio_ctx, 1, want, ioev, &ts); + + EV_ACQUIRE_CB; + + if (res < 0) + if (errno == EINTR) + /* ignored, retry */; + else + ev_syserr ("(libev) linuxaio io_getevents"); + else if (res) + { + /* at least one event available, handle them */ + linuxaio_parse_events (EV_A_ ioev, res); + + if (ecb_expect_true (ringbuf_valid)) + { + /* if we have a ring buffer, handle any remaining events in it */ + linuxaio_get_events_from_ring (EV_A); + + /* at this point, we should have handled all outstanding events */ + break; + } + else if (res < want) + /* otherwise, if there were fewere events than we wanted, we assume there are no more */ + break; + } + else + break; /* no events from the kernel, we are done */ + + timeout = EV_TS_CONST (0.); /* only wait in the first iteration */ + } +} + +inline_size +int +linuxaio_io_setup (EV_P) +{ + linuxaio_ctx = 0; + return evsys_io_setup (linuxaio_nr_events (EV_A), &linuxaio_ctx); +} + +static void +linuxaio_poll (EV_P_ ev_tstamp timeout) +{ + int submitted; + + /* first phase: submit new iocbs */ + + /* io_submit might return less than the requested number of iocbs */ + /* this is, afaics, only because of errors, but we go by the book and use a loop, */ + /* which allows us to pinpoint the erroneous iocb */ + for (submitted = 0; submitted < linuxaio_submitcnt; ) + { + int res = evsys_io_submit (linuxaio_ctx, linuxaio_submitcnt - submitted, linuxaio_submits + submitted); + + if (ecb_expect_false (res < 0)) + if (errno == EINVAL) + { + /* This happens for unsupported fds, officially, but in my testing, + * also randomly happens for supported fds. We fall back to good old + * poll() here, under the assumption that this is a very rare case. + * See https://lore.kernel.org/patchwork/patch/1047453/ to see + * discussion about such a case (ttys) where polling for POLLIN + * fails but POLLIN|POLLOUT works. + */ + struct iocb *iocb = linuxaio_submits [submitted]; + epoll_modify (EV_A_ iocb->aio_fildes, 0, anfds [iocb->aio_fildes].events); + iocb->aio_reqprio = -1; /* mark iocb as epoll */ + + res = 1; /* skip this iocb - another iocb, another chance */ + } + else if (errno == EAGAIN) + { + /* This happens when the ring buffer is full, or some other shit we + * don't know and isn't documented. Most likely because we have too + * many requests and linux aio can't be assed to handle them. + * In this case, we try to allocate a larger ring buffer, freeing + * ours first. This might fail, in which case we have to fall back to 100% + * epoll. + * God, how I hate linux not getting its act together. Ever. + */ + evsys_io_destroy (linuxaio_ctx); + linuxaio_submitcnt = 0; + + /* rearm all fds with active iocbs */ + { + int fd; + for (fd = 0; fd < linuxaio_iocbpmax; ++fd) + if (linuxaio_iocbps [fd]->io.aio_buf) + linuxaio_fd_rearm (EV_A_ fd); + } + + ++linuxaio_iteration; + if (linuxaio_io_setup (EV_A) < 0) + { + /* TODO: rearm all and recreate epoll backend from scratch */ + /* TODO: might be more prudent? */ + + /* to bad, we can't get a new aio context, go 100% epoll */ + linuxaio_free_iocbp (EV_A); + ev_io_stop (EV_A_ &linuxaio_epoll_w); + ev_ref (EV_A); + linuxaio_ctx = 0; + + backend = EVBACKEND_EPOLL; + backend_modify = epoll_modify; + backend_poll = epoll_poll; + } + + timeout = EV_TS_CONST (0.); + /* it's easiest to handle this mess in another iteration */ + return; + } + else if (errno == EBADF) + { + assert (("libev: event loop rejected bad fd", errno != EBADF)); + fd_kill (EV_A_ linuxaio_submits [submitted]->aio_fildes); + + res = 1; /* skip this iocb */ + } + else if (errno == EINTR) /* not seen in reality, not documented */ + res = 0; /* silently ignore and retry */ + else + { + ev_syserr ("(libev) linuxaio io_submit"); + res = 0; + } + + submitted += res; + } + + linuxaio_submitcnt = 0; + + /* second phase: fetch and parse events */ + + linuxaio_get_events (EV_A_ timeout); +} + +inline_size +int +linuxaio_init (EV_P_ int flags) +{ + /* would be great to have a nice test for IOCB_CMD_POLL instead */ + /* also: test some semi-common fd types, such as files and ttys in recommended_backends */ + /* 4.18 introduced IOCB_CMD_POLL, 4.19 made epoll work, and we need that */ + if (ev_linux_version () < 0x041300) + return 0; + + if (!epoll_init (EV_A_ 0)) + return 0; + + linuxaio_iteration = 0; + + if (linuxaio_io_setup (EV_A) < 0) + { + epoll_destroy (EV_A); + return 0; + } + + ev_io_init (&linuxaio_epoll_w, linuxaio_epoll_cb, backend_fd, EV_READ); + ev_set_priority (&linuxaio_epoll_w, EV_MAXPRI); + ev_io_start (EV_A_ &linuxaio_epoll_w); + ev_unref (EV_A); /* watcher should not keep loop alive */ + + backend_modify = linuxaio_modify; + backend_poll = linuxaio_poll; + + linuxaio_iocbpmax = 0; + linuxaio_iocbps = 0; + + linuxaio_submits = 0; + linuxaio_submitmax = 0; + linuxaio_submitcnt = 0; + + return EVBACKEND_LINUXAIO; +} + +inline_size +void +linuxaio_destroy (EV_P) +{ + epoll_destroy (EV_A); + linuxaio_free_iocbp (EV_A); + evsys_io_destroy (linuxaio_ctx); /* fails in child, aio context is destroyed */ +} + +ecb_cold +static void +linuxaio_fork (EV_P) +{ + linuxaio_submitcnt = 0; /* all pointers were invalidated */ + linuxaio_free_iocbp (EV_A); /* this frees all iocbs, which is very heavy-handed */ + evsys_io_destroy (linuxaio_ctx); /* fails in child, aio context is destroyed */ + + linuxaio_iteration = 0; /* we start over in the child */ + + while (linuxaio_io_setup (EV_A) < 0) + ev_syserr ("(libev) linuxaio io_setup"); + + /* forking epoll should also effectively unregister all fds from the backend */ + epoll_fork (EV_A); + /* epoll_fork already did this. hopefully */ + /*fd_rearm_all (EV_A);*/ + + ev_io_stop (EV_A_ &linuxaio_epoll_w); + ev_io_set (EV_A_ &linuxaio_epoll_w, backend_fd, EV_READ); + ev_io_start (EV_A_ &linuxaio_epoll_w); +} + diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_poll.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_poll.c new file mode 100644 index 0000000..e5508dd --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_poll.c @@ -0,0 +1,156 @@ +/* + * libev poll fd activity backend + * + * Copyright (c) 2007,2008,2009,2010,2011,2016,2019 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#include + +inline_size +void +array_needsize_pollidx (int *base, int offset, int count) +{ + /* using memset (.., -1, ...) is tempting, we we try + * to be ultraportable + */ + base += offset; + while (count--) + *base++ = -1; +} + +static void +poll_modify (EV_P_ int fd, int oev, int nev) +{ + int idx; + + if (oev == nev) + return; + + array_needsize (int, pollidxs, pollidxmax, fd + 1, array_needsize_pollidx); + + idx = pollidxs [fd]; + + if (idx < 0) /* need to allocate a new pollfd */ + { + pollidxs [fd] = idx = pollcnt++; + array_needsize (struct pollfd, polls, pollmax, pollcnt, array_needsize_noinit); + polls [idx].fd = fd; + } + + assert (polls [idx].fd == fd); + + if (nev) + polls [idx].events = + (nev & EV_READ ? POLLIN : 0) + | (nev & EV_WRITE ? POLLOUT : 0); + else /* remove pollfd */ + { + pollidxs [fd] = -1; + + if (ecb_expect_true (idx < --pollcnt)) + { + polls [idx] = polls [pollcnt]; + pollidxs [polls [idx].fd] = idx; + } + } +} + +static void +poll_poll (EV_P_ ev_tstamp timeout) +{ + struct pollfd *p; + int res; + + EV_RELEASE_CB; + res = poll (polls, pollcnt, EV_TS_TO_MSEC (timeout)); + EV_ACQUIRE_CB; + + if (ecb_expect_false (res < 0)) + { + if (errno == EBADF) + fd_ebadf (EV_A); + else if (errno == ENOMEM && !syserr_cb) + fd_enomem (EV_A); + else if (errno != EINTR) + ev_syserr ("(libev) poll"); + } + else + for (p = polls; res; ++p) + { + assert (("libev: poll returned illegal result, broken BSD kernel?", p < polls + pollcnt)); + + if (ecb_expect_false (p->revents)) /* this expect is debatable */ + { + --res; + + if (ecb_expect_false (p->revents & POLLNVAL)) + { + assert (("libev: poll found invalid fd in poll set", 0)); + fd_kill (EV_A_ p->fd); + } + else + fd_event ( + EV_A_ + p->fd, + (p->revents & (POLLOUT | POLLERR | POLLHUP) ? EV_WRITE : 0) + | (p->revents & (POLLIN | POLLERR | POLLHUP) ? EV_READ : 0) + ); + } + } +} + +inline_size +int +poll_init (EV_P_ int flags) +{ + backend_mintime = EV_TS_CONST (1e-3); + backend_modify = poll_modify; + backend_poll = poll_poll; + + pollidxs = 0; pollidxmax = 0; + polls = 0; pollmax = 0; pollcnt = 0; + + return EVBACKEND_POLL; +} + +inline_size +void +poll_destroy (EV_P) +{ + ev_free (pollidxs); + ev_free (polls); +} + diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_port.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_port.c new file mode 100644 index 0000000..f4cd9d9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_port.c @@ -0,0 +1,192 @@ +/* + * libev solaris event port backend + * + * Copyright (c) 2007,2008,2009,2010,2011,2019 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +/* useful reading: + * + * http://bugs.opensolaris.org/view_bug.do?bug_id=6268715 (random results) + * http://bugs.opensolaris.org/view_bug.do?bug_id=6455223 (just totally broken) + * http://bugs.opensolaris.org/view_bug.do?bug_id=6873782 (manpage ETIME) + * http://bugs.opensolaris.org/view_bug.do?bug_id=6874410 (implementation ETIME) + * http://www.mail-archive.com/networking-discuss@opensolaris.org/msg11898.html ETIME vs. nget + * http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libc/port/gen/event_port.c (libc) + * http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/fs/portfs/port.c#1325 (kernel) + */ + +#include +#include +#include +#include +#include +#include + +inline_speed +void +port_associate_and_check (EV_P_ int fd, int ev) +{ + if (0 > + port_associate ( + backend_fd, PORT_SOURCE_FD, fd, + (ev & EV_READ ? POLLIN : 0) + | (ev & EV_WRITE ? POLLOUT : 0), + 0 + ) + ) + { + if (errno == EBADFD) + { + assert (("libev: port_associate found invalid fd", errno != EBADFD)); + fd_kill (EV_A_ fd); + } + else + ev_syserr ("(libev) port_associate"); + } +} + +static void +port_modify (EV_P_ int fd, int oev, int nev) +{ + /* we need to reassociate no matter what, as closes are + * once more silently being discarded. + */ + if (!nev) + { + if (oev) + port_dissociate (backend_fd, PORT_SOURCE_FD, fd); + } + else + port_associate_and_check (EV_A_ fd, nev); +} + +static void +port_poll (EV_P_ ev_tstamp timeout) +{ + int res, i; + struct timespec ts; + uint_t nget = 1; + + /* we initialise this to something we will skip in the loop, as */ + /* port_getn can return with nget unchanged, but no indication */ + /* whether it was the original value or has been updated :/ */ + port_events [0].portev_source = 0; + + EV_RELEASE_CB; + EV_TS_SET (ts, timeout); + res = port_getn (backend_fd, port_events, port_eventmax, &nget, &ts); + EV_ACQUIRE_CB; + + /* port_getn may or may not set nget on error */ + /* so we rely on port_events [0].portev_source not being updated */ + if (res == -1 && errno != ETIME && errno != EINTR) + ev_syserr ("(libev) port_getn (see http://bugs.opensolaris.org/view_bug.do?bug_id=6268715, try LIBEV_FLAGS=3 env variable)"); + + for (i = 0; i < nget; ++i) + { + if (port_events [i].portev_source == PORT_SOURCE_FD) + { + int fd = port_events [i].portev_object; + + fd_event ( + EV_A_ + fd, + (port_events [i].portev_events & (POLLOUT | POLLERR | POLLHUP) ? EV_WRITE : 0) + | (port_events [i].portev_events & (POLLIN | POLLERR | POLLHUP) ? EV_READ : 0) + ); + + fd_change (EV_A_ fd, EV__IOFDSET); + } + } + + if (ecb_expect_false (nget == port_eventmax)) + { + ev_free (port_events); + port_eventmax = array_nextsize (sizeof (port_event_t), port_eventmax, port_eventmax + 1); + port_events = (port_event_t *)ev_malloc (sizeof (port_event_t) * port_eventmax); + } +} + +inline_size +int +port_init (EV_P_ int flags) +{ + /* Initialize the kernel queue */ + if ((backend_fd = port_create ()) < 0) + return 0; + + assert (("libev: PORT_SOURCE_FD must not be zero", PORT_SOURCE_FD)); + + fcntl (backend_fd, F_SETFD, FD_CLOEXEC); /* not sure if necessary, hopefully doesn't hurt */ + + /* if my reading of the opensolaris kernel sources are correct, then + * opensolaris does something very stupid: it checks if the time has already + * elapsed and doesn't round up if that is the case, otherwise it DOES round + * up. Since we can't know what the case is, we need to guess by using a + * "large enough" timeout. Normally, 1e-9 would be correct. + */ + backend_mintime = EV_TS_CONST (1e-3); /* needed to compensate for port_getn returning early */ + backend_modify = port_modify; + backend_poll = port_poll; + + port_eventmax = 64; /* initial number of events receivable per poll */ + port_events = (port_event_t *)ev_malloc (sizeof (port_event_t) * port_eventmax); + + return EVBACKEND_PORT; +} + +inline_size +void +port_destroy (EV_P) +{ + ev_free (port_events); +} + +inline_size +void +port_fork (EV_P) +{ + close (backend_fd); + + while ((backend_fd = port_create ()) < 0) + ev_syserr ("(libev) port"); + + fcntl (backend_fd, F_SETFD, FD_CLOEXEC); + + /* re-register interest in fds */ + fd_rearm_all (EV_A); +} + diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_select.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_select.c new file mode 100644 index 0000000..b862c81 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_select.c @@ -0,0 +1,316 @@ +/* + * libev select fd activity backend + * + * Copyright (c) 2007,2008,2009,2010,2011 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#ifndef _WIN32 +/* for unix systems */ +# include +# ifndef __hpux +/* for REAL unix systems */ +# include +# endif +#endif + +#ifndef EV_SELECT_USE_FD_SET +# ifdef NFDBITS +# define EV_SELECT_USE_FD_SET 0 +# else +# define EV_SELECT_USE_FD_SET 1 +# endif +#endif + +#if EV_SELECT_IS_WINSOCKET +# undef EV_SELECT_USE_FD_SET +# define EV_SELECT_USE_FD_SET 1 +# undef NFDBITS +# define NFDBITS 0 +#endif + +#if !EV_SELECT_USE_FD_SET +# define NFDBYTES (NFDBITS / 8) +#endif + +#include + +static void +select_modify (EV_P_ int fd, int oev, int nev) +{ + if (oev == nev) + return; + + { +#if EV_SELECT_USE_FD_SET + + #if EV_SELECT_IS_WINSOCKET + SOCKET handle = anfds [fd].handle; + #else + int handle = fd; + #endif + + assert (("libev: fd >= FD_SETSIZE passed to fd_set-based select backend", fd < FD_SETSIZE)); + + /* FD_SET is broken on windows (it adds the fd to a set twice or more, + * which eventually leads to overflows). Need to call it only on changes. + */ + #if EV_SELECT_IS_WINSOCKET + if ((oev ^ nev) & EV_READ) + #endif + if (nev & EV_READ) + FD_SET (handle, (fd_set *)vec_ri); + else + FD_CLR (handle, (fd_set *)vec_ri); + + #if EV_SELECT_IS_WINSOCKET + if ((oev ^ nev) & EV_WRITE) + #endif + if (nev & EV_WRITE) + FD_SET (handle, (fd_set *)vec_wi); + else + FD_CLR (handle, (fd_set *)vec_wi); + +#else + + int word = fd / NFDBITS; + fd_mask mask = 1UL << (fd % NFDBITS); + + if (ecb_expect_false (vec_max <= word)) + { + int new_max = word + 1; + + vec_ri = ev_realloc (vec_ri, new_max * NFDBYTES); + vec_ro = ev_realloc (vec_ro, new_max * NFDBYTES); /* could free/malloc */ + vec_wi = ev_realloc (vec_wi, new_max * NFDBYTES); + vec_wo = ev_realloc (vec_wo, new_max * NFDBYTES); /* could free/malloc */ + #ifdef _WIN32 + vec_eo = ev_realloc (vec_eo, new_max * NFDBYTES); /* could free/malloc */ + #endif + + for (; vec_max < new_max; ++vec_max) + ((fd_mask *)vec_ri) [vec_max] = + ((fd_mask *)vec_wi) [vec_max] = 0; + } + + ((fd_mask *)vec_ri) [word] |= mask; + if (!(nev & EV_READ)) + ((fd_mask *)vec_ri) [word] &= ~mask; + + ((fd_mask *)vec_wi) [word] |= mask; + if (!(nev & EV_WRITE)) + ((fd_mask *)vec_wi) [word] &= ~mask; +#endif + } +} + +static void +select_poll (EV_P_ ev_tstamp timeout) +{ + struct timeval tv; + int res; + int fd_setsize; + + EV_RELEASE_CB; + EV_TV_SET (tv, timeout); + +#if EV_SELECT_USE_FD_SET + fd_setsize = sizeof (fd_set); +#else + fd_setsize = vec_max * NFDBYTES; +#endif + + memcpy (vec_ro, vec_ri, fd_setsize); + memcpy (vec_wo, vec_wi, fd_setsize); + +#ifdef _WIN32 + /* pass in the write set as except set. + * the idea behind this is to work around a windows bug that causes + * errors to be reported as an exception and not by setting + * the writable bit. this is so uncontrollably lame. + */ + memcpy (vec_eo, vec_wi, fd_setsize); + res = select (vec_max * NFDBITS, (fd_set *)vec_ro, (fd_set *)vec_wo, (fd_set *)vec_eo, &tv); +#elif EV_SELECT_USE_FD_SET + fd_setsize = anfdmax < FD_SETSIZE ? anfdmax : FD_SETSIZE; + res = select (fd_setsize, (fd_set *)vec_ro, (fd_set *)vec_wo, 0, &tv); +#else + res = select (vec_max * NFDBITS, (fd_set *)vec_ro, (fd_set *)vec_wo, 0, &tv); +#endif + EV_ACQUIRE_CB; + + if (ecb_expect_false (res < 0)) + { + #if EV_SELECT_IS_WINSOCKET + errno = WSAGetLastError (); + #endif + #ifdef WSABASEERR + /* on windows, select returns incompatible error codes, fix this */ + if (errno >= WSABASEERR && errno < WSABASEERR + 1000) + if (errno == WSAENOTSOCK) + errno = EBADF; + else + errno -= WSABASEERR; + #endif + + #ifdef _WIN32 + /* select on windows erroneously returns EINVAL when no fd sets have been + * provided (this is documented). what microsoft doesn't tell you that this bug + * exists even when the fd sets _are_ provided, so we have to check for this bug + * here and emulate by sleeping manually. + * we also get EINVAL when the timeout is invalid, but we ignore this case here + * and assume that EINVAL always means: you have to wait manually. + */ + if (errno == EINVAL) + { + if (timeout) + { + unsigned long ms = EV_TS_TO_MSEC (timeout); + Sleep (ms ? ms : 1); + } + + return; + } + #endif + + if (errno == EBADF) + fd_ebadf (EV_A); + else if (errno == ENOMEM && !syserr_cb) + fd_enomem (EV_A); + else if (errno != EINTR) + ev_syserr ("(libev) select"); + + return; + } + +#if EV_SELECT_USE_FD_SET + + { + int fd; + + for (fd = 0; fd < anfdmax; ++fd) + if (anfds [fd].events) + { + int events = 0; + #if EV_SELECT_IS_WINSOCKET + SOCKET handle = anfds [fd].handle; + #else + int handle = fd; + #endif + + if (FD_ISSET (handle, (fd_set *)vec_ro)) events |= EV_READ; + if (FD_ISSET (handle, (fd_set *)vec_wo)) events |= EV_WRITE; + #ifdef _WIN32 + if (FD_ISSET (handle, (fd_set *)vec_eo)) events |= EV_WRITE; + #endif + + if (ecb_expect_true (events)) + fd_event (EV_A_ fd, events); + } + } + +#else + + { + int word, bit; + for (word = vec_max; word--; ) + { + fd_mask word_r = ((fd_mask *)vec_ro) [word]; + fd_mask word_w = ((fd_mask *)vec_wo) [word]; + #ifdef _WIN32 + word_w |= ((fd_mask *)vec_eo) [word]; + #endif + + if (word_r || word_w) + for (bit = NFDBITS; bit--; ) + { + fd_mask mask = 1UL << bit; + int events = 0; + + events |= word_r & mask ? EV_READ : 0; + events |= word_w & mask ? EV_WRITE : 0; + + if (ecb_expect_true (events)) + fd_event (EV_A_ word * NFDBITS + bit, events); + } + } + } + +#endif +} + +inline_size +int +select_init (EV_P_ int flags) +{ + backend_mintime = EV_TS_CONST (1e-6); + backend_modify = select_modify; + backend_poll = select_poll; + +#if EV_SELECT_USE_FD_SET + vec_ri = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_ri); + vec_ro = ev_malloc (sizeof (fd_set)); + vec_wi = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_wi); + vec_wo = ev_malloc (sizeof (fd_set)); + #ifdef _WIN32 + vec_eo = ev_malloc (sizeof (fd_set)); + #endif +#else + vec_max = 0; + vec_ri = 0; + vec_ro = 0; + vec_wi = 0; + vec_wo = 0; + #ifdef _WIN32 + vec_eo = 0; + #endif +#endif + + return EVBACKEND_SELECT; +} + +inline_size +void +select_destroy (EV_P) +{ + ev_free (vec_ri); + ev_free (vec_ro); + ev_free (vec_wi); + ev_free (vec_wo); + #ifdef _WIN32 + ev_free (vec_eo); + #endif +} + diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_vars.h b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_vars.h new file mode 100644 index 0000000..fb0c583 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_vars.h @@ -0,0 +1,249 @@ +/* + * loop member variable declarations + * + * Copyright (c) 2007,2008,2009,2010,2011,2012,2013,2019 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#define VARx(type,name) VAR(name, type name) + +VARx(ev_tstamp, now_floor) /* last time we refreshed rt_time */ +VARx(ev_tstamp, mn_now) /* monotonic clock "now" */ +VARx(ev_tstamp, rtmn_diff) /* difference realtime - monotonic time */ + +/* for reverse feeding of events */ +VARx(W *, rfeeds) +VARx(int, rfeedmax) +VARx(int, rfeedcnt) + +VAR (pendings, ANPENDING *pendings [NUMPRI]) +VAR (pendingmax, int pendingmax [NUMPRI]) +VAR (pendingcnt, int pendingcnt [NUMPRI]) +VARx(int, pendingpri) /* highest priority currently pending */ +VARx(ev_prepare, pending_w) /* dummy pending watcher */ + +VARx(ev_tstamp, io_blocktime) +VARx(ev_tstamp, timeout_blocktime) + +VARx(int, backend) +VARx(int, activecnt) /* total number of active events ("refcount") */ +VARx(EV_ATOMIC_T, loop_done) /* signal by ev_break */ + +VARx(int, backend_fd) +VARx(ev_tstamp, backend_mintime) /* assumed typical timer resolution */ +VAR (backend_modify, void (*backend_modify)(EV_P_ int fd, int oev, int nev)) +VAR (backend_poll , void (*backend_poll)(EV_P_ ev_tstamp timeout)) + +VARx(ANFD *, anfds) +VARx(int, anfdmax) + +VAR (evpipe, int evpipe [2]) +VARx(ev_io, pipe_w) +VARx(EV_ATOMIC_T, pipe_write_wanted) +VARx(EV_ATOMIC_T, pipe_write_skipped) + +#if !defined(_WIN32) || EV_GENWRAP +VARx(pid_t, curpid) +#endif + +VARx(char, postfork) /* true if we need to recreate kernel state after fork */ + +#if EV_USE_SELECT || EV_GENWRAP +VARx(void *, vec_ri) +VARx(void *, vec_ro) +VARx(void *, vec_wi) +VARx(void *, vec_wo) +#if defined(_WIN32) || EV_GENWRAP +VARx(void *, vec_eo) +#endif +VARx(int, vec_max) +#endif + +#if EV_USE_POLL || EV_GENWRAP +VARx(struct pollfd *, polls) +VARx(int, pollmax) +VARx(int, pollcnt) +VARx(int *, pollidxs) /* maps fds into structure indices */ +VARx(int, pollidxmax) +#endif + +#if EV_USE_EPOLL || EV_GENWRAP +VARx(struct epoll_event *, epoll_events) +VARx(int, epoll_eventmax) +VARx(int *, epoll_eperms) +VARx(int, epoll_epermcnt) +VARx(int, epoll_epermmax) +#endif + +#if EV_USE_LINUXAIO || EV_GENWRAP +VARx(aio_context_t, linuxaio_ctx) +VARx(int, linuxaio_iteration) +VARx(struct aniocb **, linuxaio_iocbps) +VARx(int, linuxaio_iocbpmax) +VARx(struct iocb **, linuxaio_submits) +VARx(int, linuxaio_submitcnt) +VARx(int, linuxaio_submitmax) +VARx(ev_io, linuxaio_epoll_w) +#endif + +#if EV_USE_IOURING || EV_GENWRAP +VARx(int, iouring_fd) +VARx(unsigned, iouring_to_submit); +VARx(int, iouring_entries) +VARx(int, iouring_max_entries) +VARx(void *, iouring_sq_ring) +VARx(void *, iouring_cq_ring) +VARx(void *, iouring_sqes) +VARx(uint32_t, iouring_sq_ring_size) +VARx(uint32_t, iouring_cq_ring_size) +VARx(uint32_t, iouring_sqes_size) +VARx(uint32_t, iouring_sq_head) +VARx(uint32_t, iouring_sq_tail) +VARx(uint32_t, iouring_sq_ring_mask) +VARx(uint32_t, iouring_sq_ring_entries) +VARx(uint32_t, iouring_sq_flags) +VARx(uint32_t, iouring_sq_dropped) +VARx(uint32_t, iouring_sq_array) +VARx(uint32_t, iouring_cq_head) +VARx(uint32_t, iouring_cq_tail) +VARx(uint32_t, iouring_cq_ring_mask) +VARx(uint32_t, iouring_cq_ring_entries) +VARx(uint32_t, iouring_cq_overflow) +VARx(uint32_t, iouring_cq_cqes) +VARx(ev_tstamp, iouring_tfd_to) +VARx(int, iouring_tfd) +VARx(ev_io, iouring_tfd_w) +#endif + +#if EV_USE_KQUEUE || EV_GENWRAP +VARx(pid_t, kqueue_fd_pid) +VARx(struct kevent *, kqueue_changes) +VARx(int, kqueue_changemax) +VARx(int, kqueue_changecnt) +VARx(struct kevent *, kqueue_events) +VARx(int, kqueue_eventmax) +#endif + +#if EV_USE_PORT || EV_GENWRAP +VARx(struct port_event *, port_events) +VARx(int, port_eventmax) +#endif + +#if EV_USE_IOCP || EV_GENWRAP +VARx(HANDLE, iocp) +#endif + +VARx(int *, fdchanges) +VARx(int, fdchangemax) +VARx(int, fdchangecnt) + +VARx(ANHE *, timers) +VARx(int, timermax) +VARx(int, timercnt) + +#if EV_PERIODIC_ENABLE || EV_GENWRAP +VARx(ANHE *, periodics) +VARx(int, periodicmax) +VARx(int, periodiccnt) +#endif + +#if EV_IDLE_ENABLE || EV_GENWRAP +VAR (idles, ev_idle **idles [NUMPRI]) +VAR (idlemax, int idlemax [NUMPRI]) +VAR (idlecnt, int idlecnt [NUMPRI]) +#endif +VARx(int, idleall) /* total number */ + +VARx(struct ev_prepare **, prepares) +VARx(int, preparemax) +VARx(int, preparecnt) + +VARx(struct ev_check **, checks) +VARx(int, checkmax) +VARx(int, checkcnt) + +#if EV_FORK_ENABLE || EV_GENWRAP +VARx(struct ev_fork **, forks) +VARx(int, forkmax) +VARx(int, forkcnt) +#endif + +#if EV_CLEANUP_ENABLE || EV_GENWRAP +VARx(struct ev_cleanup **, cleanups) +VARx(int, cleanupmax) +VARx(int, cleanupcnt) +#endif + +#if EV_ASYNC_ENABLE || EV_GENWRAP +VARx(EV_ATOMIC_T, async_pending) +VARx(struct ev_async **, asyncs) +VARx(int, asyncmax) +VARx(int, asynccnt) +#endif + +#if EV_USE_INOTIFY || EV_GENWRAP +VARx(int, fs_fd) +VARx(ev_io, fs_w) +VARx(char, fs_2625) /* whether we are running in linux 2.6.25 or newer */ +VAR (fs_hash, ANFS fs_hash [EV_INOTIFY_HASHSIZE]) +#endif + +VARx(EV_ATOMIC_T, sig_pending) +#if EV_USE_SIGNALFD || EV_GENWRAP +VARx(int, sigfd) +VARx(ev_io, sigfd_w) +VARx(sigset_t, sigfd_set) +#endif + +#if EV_USE_TIMERFD || EV_GENWRAP +VARx(int, timerfd) /* timerfd for time jump detection */ +VARx(ev_io, timerfd_w) +#endif + +VARx(unsigned int, origflags) /* original loop flags */ + +#if EV_FEATURE_API || EV_GENWRAP +VARx(unsigned int, loop_count) /* total number of loop iterations/blocks */ +VARx(unsigned int, loop_depth) /* #ev_run enters - #ev_run leaves */ + +VARx(void *, userdata) +/* C++ doesn't support the ev_loop_callback typedef here. stinks. */ +VAR (release_cb, void (*release_cb)(EV_P) EV_NOEXCEPT) +VAR (acquire_cb, void (*acquire_cb)(EV_P) EV_NOEXCEPT) +VAR (invoke_cb , ev_loop_callback invoke_cb) +#endif + +#undef VARx + diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_win32.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_win32.c new file mode 100644 index 0000000..97344c3 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_win32.c @@ -0,0 +1,162 @@ +/* + * libev win32 compatibility cruft (_not_ a backend) + * + * Copyright (c) 2007,2008,2009 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#ifdef _WIN32 + +/* note: the comment below could not be substantiated, but what would I care */ +/* MSDN says this is required to handle SIGFPE */ +/* my wild guess would be that using something floating-pointy is required */ +/* for the crt to do something about it */ +volatile double SIGFPE_REQ = 0.0f; + +static SOCKET +ev_tcp_socket (void) +{ +#if EV_USE_WSASOCKET + return WSASocket (AF_INET, SOCK_STREAM, 0, 0, 0, 0); +#else + return socket (AF_INET, SOCK_STREAM, 0); +#endif +} + +/* oh, the humanity! */ +static int +ev_pipe (int filedes [2]) +{ + struct sockaddr_in addr = { 0 }; + int addr_size = sizeof (addr); + struct sockaddr_in adr2; + int adr2_size = sizeof (adr2); + SOCKET listener; + SOCKET sock [2] = { -1, -1 }; + + if ((listener = ev_tcp_socket ()) == INVALID_SOCKET) + return -1; + + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); + addr.sin_port = 0; + + if (bind (listener, (struct sockaddr *)&addr, addr_size)) + goto fail; + + if (getsockname (listener, (struct sockaddr *)&addr, &addr_size)) + goto fail; + + if (listen (listener, 1)) + goto fail; + + if ((sock [0] = ev_tcp_socket ()) == INVALID_SOCKET) + goto fail; + + if (connect (sock [0], (struct sockaddr *)&addr, addr_size)) + goto fail; + + /* TODO: returns INVALID_SOCKET on winsock accept, not < 0. fix it */ + /* when convenient, probably by just removing error checking altogether? */ + if ((sock [1] = accept (listener, 0, 0)) < 0) + goto fail; + + /* windows vista returns fantasy port numbers for sockets: + * example for two interconnected tcp sockets: + * + * (Socket::unpack_sockaddr_in getsockname $sock0)[0] == 53364 + * (Socket::unpack_sockaddr_in getpeername $sock0)[0] == 53363 + * (Socket::unpack_sockaddr_in getsockname $sock1)[0] == 53363 + * (Socket::unpack_sockaddr_in getpeername $sock1)[0] == 53365 + * + * wow! tridirectional sockets! + * + * this way of checking ports seems to work: + */ + if (getpeername (sock [0], (struct sockaddr *)&addr, &addr_size)) + goto fail; + + if (getsockname (sock [1], (struct sockaddr *)&adr2, &adr2_size)) + goto fail; + + errno = WSAEINVAL; + if (addr_size != adr2_size + || addr.sin_addr.s_addr != adr2.sin_addr.s_addr /* just to be sure, I mean, it's windows */ + || addr.sin_port != adr2.sin_port) + goto fail; + + closesocket (listener); + +#if EV_SELECT_IS_WINSOCKET + filedes [0] = EV_WIN32_HANDLE_TO_FD (sock [0]); + filedes [1] = EV_WIN32_HANDLE_TO_FD (sock [1]); +#else + /* when select isn't winsocket, we also expect socket, connect, accept etc. + * to work on fds */ + filedes [0] = sock [0]; + filedes [1] = sock [1]; +#endif + + return 0; + +fail: + closesocket (listener); + + if (sock [0] != INVALID_SOCKET) closesocket (sock [0]); + if (sock [1] != INVALID_SOCKET) closesocket (sock [1]); + + return -1; +} + +#undef pipe +#define pipe(filedes) ev_pipe (filedes) + +#define EV_HAVE_EV_TIME 1 +ev_tstamp +ev_time (void) +{ + FILETIME ft; + ULARGE_INTEGER ui; + + GetSystemTimeAsFileTime (&ft); + ui.u.LowPart = ft.dwLowDateTime; + ui.u.HighPart = ft.dwHighDateTime; + + /* also, msvc cannot convert ulonglong to double... yes, it is that sucky */ + return EV_TS_FROM_USEC (((LONGLONG)(ui.QuadPart - 116444736000000000) * 1e-1)); +} + +#endif + diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_wrap.h b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_wrap.h new file mode 100644 index 0000000..45d793c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_wrap.h @@ -0,0 +1,272 @@ +/* DO NOT EDIT, automatically generated by update_ev_wrap */ +#ifndef EV_WRAP_H +#define EV_WRAP_H +#define acquire_cb ((loop)->acquire_cb) +#define activecnt ((loop)->activecnt) +#define anfdmax ((loop)->anfdmax) +#define anfds ((loop)->anfds) +#define async_pending ((loop)->async_pending) +#define asynccnt ((loop)->asynccnt) +#define asyncmax ((loop)->asyncmax) +#define asyncs ((loop)->asyncs) +#define backend ((loop)->backend) +#define backend_fd ((loop)->backend_fd) +#define backend_mintime ((loop)->backend_mintime) +#define backend_modify ((loop)->backend_modify) +#define backend_poll ((loop)->backend_poll) +#define checkcnt ((loop)->checkcnt) +#define checkmax ((loop)->checkmax) +#define checks ((loop)->checks) +#define cleanupcnt ((loop)->cleanupcnt) +#define cleanupmax ((loop)->cleanupmax) +#define cleanups ((loop)->cleanups) +#define curpid ((loop)->curpid) +#define epoll_epermcnt ((loop)->epoll_epermcnt) +#define epoll_epermmax ((loop)->epoll_epermmax) +#define epoll_eperms ((loop)->epoll_eperms) +#define epoll_eventmax ((loop)->epoll_eventmax) +#define epoll_events ((loop)->epoll_events) +#define evpipe ((loop)->evpipe) +#define fdchangecnt ((loop)->fdchangecnt) +#define fdchangemax ((loop)->fdchangemax) +#define fdchanges ((loop)->fdchanges) +#define forkcnt ((loop)->forkcnt) +#define forkmax ((loop)->forkmax) +#define forks ((loop)->forks) +#define fs_2625 ((loop)->fs_2625) +#define fs_fd ((loop)->fs_fd) +#define fs_hash ((loop)->fs_hash) +#define fs_w ((loop)->fs_w) +#define idleall ((loop)->idleall) +#define idlecnt ((loop)->idlecnt) +#define idlemax ((loop)->idlemax) +#define idles ((loop)->idles) +#define invoke_cb ((loop)->invoke_cb) +#define io_blocktime ((loop)->io_blocktime) +#define iocp ((loop)->iocp) +#define iouring_cq_cqes ((loop)->iouring_cq_cqes) +#define iouring_cq_head ((loop)->iouring_cq_head) +#define iouring_cq_overflow ((loop)->iouring_cq_overflow) +#define iouring_cq_ring ((loop)->iouring_cq_ring) +#define iouring_cq_ring_entries ((loop)->iouring_cq_ring_entries) +#define iouring_cq_ring_mask ((loop)->iouring_cq_ring_mask) +#define iouring_cq_ring_size ((loop)->iouring_cq_ring_size) +#define iouring_cq_tail ((loop)->iouring_cq_tail) +#define iouring_entries ((loop)->iouring_entries) +#define iouring_fd ((loop)->iouring_fd) +#define iouring_max_entries ((loop)->iouring_max_entries) +#define iouring_sq_array ((loop)->iouring_sq_array) +#define iouring_sq_dropped ((loop)->iouring_sq_dropped) +#define iouring_sq_flags ((loop)->iouring_sq_flags) +#define iouring_sq_head ((loop)->iouring_sq_head) +#define iouring_sq_ring ((loop)->iouring_sq_ring) +#define iouring_sq_ring_entries ((loop)->iouring_sq_ring_entries) +#define iouring_sq_ring_mask ((loop)->iouring_sq_ring_mask) +#define iouring_sq_ring_size ((loop)->iouring_sq_ring_size) +#define iouring_sq_tail ((loop)->iouring_sq_tail) +#define iouring_sqes ((loop)->iouring_sqes) +#define iouring_sqes_size ((loop)->iouring_sqes_size) +#define iouring_tfd ((loop)->iouring_tfd) +#define iouring_tfd_to ((loop)->iouring_tfd_to) +#define iouring_tfd_w ((loop)->iouring_tfd_w) +#define iouring_to_submit ((loop)->iouring_to_submit) +#define kqueue_changecnt ((loop)->kqueue_changecnt) +#define kqueue_changemax ((loop)->kqueue_changemax) +#define kqueue_changes ((loop)->kqueue_changes) +#define kqueue_eventmax ((loop)->kqueue_eventmax) +#define kqueue_events ((loop)->kqueue_events) +#define kqueue_fd_pid ((loop)->kqueue_fd_pid) +#define linuxaio_ctx ((loop)->linuxaio_ctx) +#define linuxaio_epoll_w ((loop)->linuxaio_epoll_w) +#define linuxaio_iocbpmax ((loop)->linuxaio_iocbpmax) +#define linuxaio_iocbps ((loop)->linuxaio_iocbps) +#define linuxaio_iteration ((loop)->linuxaio_iteration) +#define linuxaio_submitcnt ((loop)->linuxaio_submitcnt) +#define linuxaio_submitmax ((loop)->linuxaio_submitmax) +#define linuxaio_submits ((loop)->linuxaio_submits) +#define loop_count ((loop)->loop_count) +#define loop_depth ((loop)->loop_depth) +#define loop_done ((loop)->loop_done) +#define mn_now ((loop)->mn_now) +#define now_floor ((loop)->now_floor) +#define origflags ((loop)->origflags) +#define pending_w ((loop)->pending_w) +#define pendingcnt ((loop)->pendingcnt) +#define pendingmax ((loop)->pendingmax) +#define pendingpri ((loop)->pendingpri) +#define pendings ((loop)->pendings) +#define periodiccnt ((loop)->periodiccnt) +#define periodicmax ((loop)->periodicmax) +#define periodics ((loop)->periodics) +#define pipe_w ((loop)->pipe_w) +#define pipe_write_skipped ((loop)->pipe_write_skipped) +#define pipe_write_wanted ((loop)->pipe_write_wanted) +#define pollcnt ((loop)->pollcnt) +#define pollidxmax ((loop)->pollidxmax) +#define pollidxs ((loop)->pollidxs) +#define pollmax ((loop)->pollmax) +#define polls ((loop)->polls) +#define port_eventmax ((loop)->port_eventmax) +#define port_events ((loop)->port_events) +#define postfork ((loop)->postfork) +#define preparecnt ((loop)->preparecnt) +#define preparemax ((loop)->preparemax) +#define prepares ((loop)->prepares) +#define release_cb ((loop)->release_cb) +#define rfeedcnt ((loop)->rfeedcnt) +#define rfeedmax ((loop)->rfeedmax) +#define rfeeds ((loop)->rfeeds) +#define rtmn_diff ((loop)->rtmn_diff) +#define sig_pending ((loop)->sig_pending) +#define sigfd ((loop)->sigfd) +#define sigfd_set ((loop)->sigfd_set) +#define sigfd_w ((loop)->sigfd_w) +#define timeout_blocktime ((loop)->timeout_blocktime) +#define timercnt ((loop)->timercnt) +#define timerfd ((loop)->timerfd) +#define timerfd_w ((loop)->timerfd_w) +#define timermax ((loop)->timermax) +#define timers ((loop)->timers) +#define userdata ((loop)->userdata) +#define vec_eo ((loop)->vec_eo) +#define vec_max ((loop)->vec_max) +#define vec_ri ((loop)->vec_ri) +#define vec_ro ((loop)->vec_ro) +#define vec_wi ((loop)->vec_wi) +#define vec_wo ((loop)->vec_wo) +#else +#undef EV_WRAP_H +#undef acquire_cb +#undef activecnt +#undef anfdmax +#undef anfds +#undef async_pending +#undef asynccnt +#undef asyncmax +#undef asyncs +#undef backend +#undef backend_fd +#undef backend_mintime +#undef backend_modify +#undef backend_poll +#undef checkcnt +#undef checkmax +#undef checks +#undef cleanupcnt +#undef cleanupmax +#undef cleanups +#undef curpid +#undef epoll_epermcnt +#undef epoll_epermmax +#undef epoll_eperms +#undef epoll_eventmax +#undef epoll_events +#undef evpipe +#undef fdchangecnt +#undef fdchangemax +#undef fdchanges +#undef forkcnt +#undef forkmax +#undef forks +#undef fs_2625 +#undef fs_fd +#undef fs_hash +#undef fs_w +#undef idleall +#undef idlecnt +#undef idlemax +#undef idles +#undef invoke_cb +#undef io_blocktime +#undef iocp +#undef iouring_cq_cqes +#undef iouring_cq_head +#undef iouring_cq_overflow +#undef iouring_cq_ring +#undef iouring_cq_ring_entries +#undef iouring_cq_ring_mask +#undef iouring_cq_ring_size +#undef iouring_cq_tail +#undef iouring_entries +#undef iouring_fd +#undef iouring_max_entries +#undef iouring_sq_array +#undef iouring_sq_dropped +#undef iouring_sq_flags +#undef iouring_sq_head +#undef iouring_sq_ring +#undef iouring_sq_ring_entries +#undef iouring_sq_ring_mask +#undef iouring_sq_ring_size +#undef iouring_sq_tail +#undef iouring_sqes +#undef iouring_sqes_size +#undef iouring_tfd +#undef iouring_tfd_to +#undef iouring_tfd_w +#undef iouring_to_submit +#undef kqueue_changecnt +#undef kqueue_changemax +#undef kqueue_changes +#undef kqueue_eventmax +#undef kqueue_events +#undef kqueue_fd_pid +#undef linuxaio_ctx +#undef linuxaio_epoll_w +#undef linuxaio_iocbpmax +#undef linuxaio_iocbps +#undef linuxaio_iteration +#undef linuxaio_submitcnt +#undef linuxaio_submitmax +#undef linuxaio_submits +#undef loop_count +#undef loop_depth +#undef loop_done +#undef mn_now +#undef now_floor +#undef origflags +#undef pending_w +#undef pendingcnt +#undef pendingmax +#undef pendingpri +#undef pendings +#undef periodiccnt +#undef periodicmax +#undef periodics +#undef pipe_w +#undef pipe_write_skipped +#undef pipe_write_wanted +#undef pollcnt +#undef pollidxmax +#undef pollidxs +#undef pollmax +#undef polls +#undef port_eventmax +#undef port_events +#undef postfork +#undef preparecnt +#undef preparemax +#undef prepares +#undef release_cb +#undef rfeedcnt +#undef rfeedmax +#undef rfeeds +#undef rtmn_diff +#undef sig_pending +#undef sigfd +#undef sigfd_set +#undef sigfd_w +#undef timeout_blocktime +#undef timercnt +#undef timerfd +#undef timerfd_w +#undef timermax +#undef timers +#undef userdata +#undef vec_eo +#undef vec_max +#undef vec_ri +#undef vec_ro +#undef vec_wi +#undef vec_wo +#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/.clang-format b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/.clang-format new file mode 100644 index 0000000..6ad3f63 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/.clang-format @@ -0,0 +1,16 @@ +--- +Language: Cpp +BasedOnStyle: WebKit +AllowAllParametersOfDeclarationOnNextLine: false +BinPackArguments: false +BinPackParameters: false +AlignConsecutiveMacros: false +AlignConsecutiveAssignments: false +BreakBeforeBraces: Linux +BraceWrapping: + AfterControlStatement: Never +IndentCaseLabels: true +PointerAlignment: Right +SpaceBeforeParens: ControlStatements +IndentWidth: 4 +... diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/Makefile b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/Makefile new file mode 100644 index 0000000..2aa5897 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/Makefile @@ -0,0 +1,269 @@ + +SHELL = /bin/sh + +# V=0 quiet, V=1 verbose. other values don't work. +V = 0 +V0 = $(V:0=) +Q1 = $(V:1=) +Q = $(Q1:0=@) +ECHO1 = $(V:1=@ :) +ECHO = $(ECHO1:0=@ echo) +NULLCMD = : + +#### Start of system configuration section. #### + +srcdir = . +topdir = /usr/include/ruby-3.2.0 +hdrdir = $(topdir) +arch_hdrdir = /usr/include/x86_64-linux-gnu/ruby-3.2.0 +PATH_SEPARATOR = : +VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby +prefix = $(DESTDIR)/usr +rubysitearchprefix = $(sitearchlibdir)/$(RUBY_BASE_NAME) +rubyarchprefix = $(archlibdir)/$(RUBY_BASE_NAME) +rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) +exec_prefix = $(prefix) +vendorarchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/vendor_ruby +sitearchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/site_ruby +rubyarchhdrdir = $(archincludedir)/$(RUBY_VERSION_NAME) +vendorhdrdir = $(rubyhdrdir)/vendor_ruby +sitehdrdir = $(rubyhdrdir)/site_ruby +rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) +vendorarchdir = $(rubysitearchprefix)/vendor_ruby/$(ruby_version) +vendorlibdir = $(vendordir)/$(ruby_version) +vendordir = $(rubylibprefix)/vendor_ruby +sitearchdir = $(DESTDIR)/usr/local/lib/x86_64-linux-gnu/site_ruby +sitelibdir = $(sitedir)/$(ruby_version) +sitedir = $(DESTDIR)/usr/local/lib/site_ruby +rubyarchdir = $(rubyarchprefix)/$(ruby_version) +rubylibdir = $(rubylibprefix)/$(ruby_version) +sitearchincludedir = $(includedir)/$(sitearch) +archincludedir = $(includedir)/$(arch) +sitearchlibdir = $(libdir)/$(sitearch) +archlibdir = $(libdir)/$(arch) +ridir = $(datarootdir)/$(RI_BASE_NAME) +mandir = $(datarootdir)/man +localedir = $(datarootdir)/locale +libdir = $(exec_prefix)/lib +psdir = $(docdir) +pdfdir = $(docdir) +dvidir = $(docdir) +htmldir = $(docdir) +infodir = $(datarootdir)/info +docdir = $(datarootdir)/doc/$(PACKAGE) +oldincludedir = $(DESTDIR)/usr/include +includedir = $(prefix)/include +runstatedir = $(DESTDIR)/var/run +localstatedir = $(DESTDIR)/var +sharedstatedir = $(prefix)/com +sysconfdir = $(DESTDIR)/etc +datadir = $(datarootdir) +datarootdir = $(prefix)/share +libexecdir = $(exec_prefix)/libexec +sbindir = $(exec_prefix)/sbin +bindir = $(exec_prefix)/bin +archdir = $(rubyarchdir) + + +CC_WRAPPER = +CC = x86_64-linux-gnu-gcc +CXX = x86_64-linux-gnu-g++ +LIBRUBY = $(LIBRUBY_SO) +LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a +LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) +LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static $(MAINLIBS) +empty = +OUTFLAG = -o $(empty) +COUTFLAG = -o $(empty) +CSRCFLAG = $(empty) + +RUBY_EXTCONF_H = +cflags = $(optflags) $(debugflags) $(warnflags) +cxxflags = +optflags = -O3 -fno-fast-math -fno-strict-aliasing +debugflags = -ggdb3 +warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdiv-by-zero -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wold-style-definition -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef +cppflags = +CCDLFLAGS = -fPIC +CFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC $(ARCH_FLAG) +INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) +DEFS = +CPPFLAGS = -DHAVE_UNISTD_H -DHAVE_RB_IO_DESCRIPTOR -DHAVE_LINUX_AIO_ABI_H -DEV_USE_LINUXAIO -DHAVE_LINUX_IO_URING_H -DEV_USE_IOURING -DHAVE_SYS_SELECT_H -DEV_USE_SELECT -DHAVE_SYS_EPOLL_H -DEV_USE_EPOLL -DHAVE_SYS_RESOURCE_H -DHAVE_SYS_RESOURCE_H -DEV_STANDALONE -Wdate-time -D_FORTIFY_SOURCE=3 $(DEFS) $(cppflags) +CXXFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 $(ARCH_FLAG) +ldflags = -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed +dldflags = -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now +ARCH_FLAG = +DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) +LDSHARED = $(CC) -shared +LDSHAREDXX = $(CXX) -shared +AR = x86_64-linux-gnu-gcc-ar +EXEEXT = + +RUBY_INSTALL_NAME = $(RUBY_BASE_NAME)3.2 +RUBY_SO_NAME = ruby-3.2 +RUBYW_INSTALL_NAME = +RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) +RUBYW_BASE_NAME = rubyw +RUBY_BASE_NAME = ruby + +arch = x86_64-linux-gnu +sitearch = $(arch) +ruby_version = 3.2.0 +ruby = $(bindir)/$(RUBY_BASE_NAME)3.2 +RUBY = $(ruby) +BUILTRUBY = $(bindir)/$(RUBY_BASE_NAME)3.2 +ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h + +RM = rm -f +RM_RF = rm -fr +RMDIRS = rmdir --ignore-fail-on-non-empty -p +MAKEDIRS = /bin/mkdir -p +INSTALL = /usr/bin/install -c +INSTALL_PROG = $(INSTALL) -m 0755 +INSTALL_DATA = $(INSTALL) -m 644 +COPY = cp +TOUCH = exit > + +#### End of system configuration section. #### + +preload = +libpath = . $(archlibdir) +LIBPATH = -L. -L$(archlibdir) +DEFFILE = + +CLEANFILES = mkmf.log +DISTCLEANFILES = +DISTCLEANDIRS = + +extout = +extout_prefix = +target_prefix = +LOCAL_LIBS = +LIBS = $(LIBRUBYARG_SHARED) -lm -lpthread -lc +ORIG_SRCS = bytebuffer.c monitor.c nio4r_ext.c selector.c +SRCS = $(ORIG_SRCS) +OBJS = bytebuffer.o monitor.o nio4r_ext.o selector.o +HDRS = $(srcdir)/libev.h $(srcdir)/nio4r.h +LOCAL_HDRS = +TARGET = nio4r_ext +TARGET_NAME = nio4r_ext +TARGET_ENTRY = Init_$(TARGET_NAME) +DLLIB = $(TARGET).so +EXTSTATIC = +STATIC_LIB = + +TIMESTAMP_DIR = . +BINDIR = $(bindir) +RUBYCOMMONDIR = $(sitedir)$(target_prefix) +RUBYLIBDIR = $(sitelibdir)$(target_prefix) +RUBYARCHDIR = $(sitearchdir)$(target_prefix) +HDRDIR = $(sitehdrdir)$(target_prefix) +ARCHHDRDIR = $(sitearchhdrdir)$(target_prefix) +TARGET_SO_DIR = +TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) +CLEANLIBS = $(TARGET_SO) false +CLEANOBJS = $(OBJS) *.bak +TARGET_SO_DIR_TIMESTAMP = $(TIMESTAMP_DIR)/.sitearchdir.time + +all: $(DLLIB) +static: $(STATIC_LIB) +.PHONY: all install static install-so install-rb +.PHONY: clean clean-so clean-static clean-rb + +clean-static:: +clean-rb-default:: +clean-rb:: +clean-so:: +clean: clean-so clean-static clean-rb-default clean-rb + -$(Q)$(RM_RF) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time + +distclean-rb-default:: +distclean-rb:: +distclean-so:: +distclean-static:: +distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb + -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log + -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) + -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true + +realclean: distclean +install: install-so install-rb + +install-so: $(DLLIB) $(TARGET_SO_DIR_TIMESTAMP) + $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) +clean-static:: + -$(Q)$(RM) $(STATIC_LIB) +install-rb: pre-install-rb do-install-rb install-rb-default +install-rb-default: pre-install-rb-default do-install-rb-default +pre-install-rb: Makefile +pre-install-rb-default: Makefile +do-install-rb: +do-install-rb-default: +pre-install-rb-default: + @$(NULLCMD) +$(TARGET_SO_DIR_TIMESTAMP): + $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) + $(Q) $(TOUCH) $@ + +site-install: site-install-so site-install-rb +site-install-so: install-so +site-install-rb: install-rb + +.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S + +.cc.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cc.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.mm.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.mm.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cxx.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cxx.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cpp.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cpp.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.c.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.c.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.m.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.m.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +$(TARGET_SO): $(OBJS) Makefile + $(ECHO) linking shared-object $(DLLIB) + -$(Q)$(RM) $(@) + $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) + + + +$(OBJS): $(HDRS) $(ruby_headers) diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/bytebuffer.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/bytebuffer.c new file mode 100644 index 0000000..99e34f2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/bytebuffer.c @@ -0,0 +1,465 @@ +#include "nio4r.h" + +static VALUE mNIO = Qnil; +static VALUE cNIO_ByteBuffer = Qnil; +static VALUE cNIO_ByteBuffer_OverflowError = Qnil; +static VALUE cNIO_ByteBuffer_UnderflowError = Qnil; +static VALUE cNIO_ByteBuffer_MarkUnsetError = Qnil; + +/* Allocator/deallocator */ +static VALUE NIO_ByteBuffer_allocate(VALUE klass); +static void NIO_ByteBuffer_free(void *data); +static size_t NIO_ByteBuffer_memsize(const void *data); + +/* Methods */ +static VALUE NIO_ByteBuffer_initialize(VALUE self, VALUE capacity); +static VALUE NIO_ByteBuffer_clear(VALUE self); +static VALUE NIO_ByteBuffer_get_position(VALUE self); +static VALUE NIO_ByteBuffer_set_position(VALUE self, VALUE new_position); +static VALUE NIO_ByteBuffer_get_limit(VALUE self); +static VALUE NIO_ByteBuffer_set_limit(VALUE self, VALUE new_limit); +static VALUE NIO_ByteBuffer_capacity(VALUE self); +static VALUE NIO_ByteBuffer_remaining(VALUE self); +static VALUE NIO_ByteBuffer_full(VALUE self); +static VALUE NIO_ByteBuffer_get(int argc, VALUE *argv, VALUE self); +static VALUE NIO_ByteBuffer_fetch(VALUE self, VALUE index); +static VALUE NIO_ByteBuffer_put(VALUE self, VALUE string); +static VALUE NIO_ByteBuffer_write_to(VALUE self, VALUE file); +static VALUE NIO_ByteBuffer_read_from(VALUE self, VALUE file); +static VALUE NIO_ByteBuffer_flip(VALUE self); +static VALUE NIO_ByteBuffer_rewind(VALUE self); +static VALUE NIO_ByteBuffer_mark(VALUE self); +static VALUE NIO_ByteBuffer_reset(VALUE self); +static VALUE NIO_ByteBuffer_compact(VALUE self); +static VALUE NIO_ByteBuffer_each(VALUE self); +static VALUE NIO_ByteBuffer_inspect(VALUE self); + +#define MARK_UNSET -1 + +/* Compatibility for Ruby <= 3.1 */ +#ifndef HAVE_RB_IO_DESCRIPTOR +static int +io_descriptor_fallback(VALUE io) +{ + rb_io_t *fptr; + GetOpenFile(io, fptr); + return fptr->fd; +} +#define rb_io_descriptor io_descriptor_fallback +#endif + +static void +io_set_nonblock(VALUE io) +{ + rb_io_t *fptr; + GetOpenFile(io, fptr); + rb_io_set_nonblock(fptr); +} + +void Init_NIO_ByteBuffer() +{ + mNIO = rb_define_module("NIO"); + cNIO_ByteBuffer = rb_define_class_under(mNIO, "ByteBuffer", rb_cObject); + rb_define_alloc_func(cNIO_ByteBuffer, NIO_ByteBuffer_allocate); + + cNIO_ByteBuffer_OverflowError = rb_define_class_under(cNIO_ByteBuffer, "OverflowError", rb_eIOError); + cNIO_ByteBuffer_UnderflowError = rb_define_class_under(cNIO_ByteBuffer, "UnderflowError", rb_eIOError); + cNIO_ByteBuffer_MarkUnsetError = rb_define_class_under(cNIO_ByteBuffer, "MarkUnsetError", rb_eIOError); + + rb_include_module(cNIO_ByteBuffer, rb_mEnumerable); + + rb_define_method(cNIO_ByteBuffer, "initialize", NIO_ByteBuffer_initialize, 1); + rb_define_method(cNIO_ByteBuffer, "clear", NIO_ByteBuffer_clear, 0); + rb_define_method(cNIO_ByteBuffer, "position", NIO_ByteBuffer_get_position, 0); + rb_define_method(cNIO_ByteBuffer, "position=", NIO_ByteBuffer_set_position, 1); + rb_define_method(cNIO_ByteBuffer, "limit", NIO_ByteBuffer_get_limit, 0); + rb_define_method(cNIO_ByteBuffer, "limit=", NIO_ByteBuffer_set_limit, 1); + rb_define_method(cNIO_ByteBuffer, "capacity", NIO_ByteBuffer_capacity, 0); + rb_define_method(cNIO_ByteBuffer, "size", NIO_ByteBuffer_capacity, 0); + rb_define_method(cNIO_ByteBuffer, "remaining", NIO_ByteBuffer_remaining, 0); + rb_define_method(cNIO_ByteBuffer, "full?", NIO_ByteBuffer_full, 0); + rb_define_method(cNIO_ByteBuffer, "get", NIO_ByteBuffer_get, -1); + rb_define_method(cNIO_ByteBuffer, "[]", NIO_ByteBuffer_fetch, 1); + rb_define_method(cNIO_ByteBuffer, "<<", NIO_ByteBuffer_put, 1); + rb_define_method(cNIO_ByteBuffer, "read_from", NIO_ByteBuffer_read_from, 1); + rb_define_method(cNIO_ByteBuffer, "write_to", NIO_ByteBuffer_write_to, 1); + rb_define_method(cNIO_ByteBuffer, "flip", NIO_ByteBuffer_flip, 0); + rb_define_method(cNIO_ByteBuffer, "rewind", NIO_ByteBuffer_rewind, 0); + rb_define_method(cNIO_ByteBuffer, "mark", NIO_ByteBuffer_mark, 0); + rb_define_method(cNIO_ByteBuffer, "reset", NIO_ByteBuffer_reset, 0); + rb_define_method(cNIO_ByteBuffer, "compact", NIO_ByteBuffer_compact, 0); + rb_define_method(cNIO_ByteBuffer, "each", NIO_ByteBuffer_each, 0); + rb_define_method(cNIO_ByteBuffer, "inspect", NIO_ByteBuffer_inspect, 0); +} + +static const rb_data_type_t NIO_ByteBuffer_type = { + "NIO::ByteBuffer", + { + NULL, // Nothing to mark + NIO_ByteBuffer_free, + NIO_ByteBuffer_memsize, + }, + 0, + 0, + RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED +}; + +static VALUE NIO_ByteBuffer_allocate(VALUE klass) +{ + struct NIO_ByteBuffer *bytebuffer = (struct NIO_ByteBuffer *)xmalloc(sizeof(struct NIO_ByteBuffer)); + bytebuffer->buffer = NULL; + return TypedData_Wrap_Struct(klass, &NIO_ByteBuffer_type, bytebuffer); +} + +static void NIO_ByteBuffer_free(void *data) +{ + struct NIO_ByteBuffer *buffer = (struct NIO_ByteBuffer *)data; + if (buffer->buffer) + xfree(buffer->buffer); + xfree(buffer); +} + +static size_t NIO_ByteBuffer_memsize(const void *data) +{ + const struct NIO_ByteBuffer *buffer = (const struct NIO_ByteBuffer *)data; + size_t memsize = sizeof(struct NIO_ByteBuffer); + if (buffer->buffer) + memsize += buffer->capacity; + return memsize; +} + +static VALUE NIO_ByteBuffer_initialize(VALUE self, VALUE capacity) +{ + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + buffer->capacity = NUM2INT(capacity); + buffer->buffer = xmalloc(buffer->capacity); + + NIO_ByteBuffer_clear(self); + + return self; +} + +static VALUE NIO_ByteBuffer_clear(VALUE self) +{ + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + memset(buffer->buffer, 0, buffer->capacity); + + buffer->position = 0; + buffer->limit = buffer->capacity; + buffer->mark = MARK_UNSET; + + return self; +} + +static VALUE NIO_ByteBuffer_get_position(VALUE self) +{ + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + return INT2NUM(buffer->position); +} + +static VALUE NIO_ByteBuffer_set_position(VALUE self, VALUE new_position) +{ + int pos; + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + pos = NUM2INT(new_position); + + if (pos < 0) { + rb_raise(rb_eArgError, "negative position given"); + } + + if (pos > buffer->limit) { + rb_raise(rb_eArgError, "specified position exceeds limit"); + } + + buffer->position = pos; + + if (buffer->mark > buffer->position) { + buffer->mark = MARK_UNSET; + } + + return new_position; +} + +static VALUE NIO_ByteBuffer_get_limit(VALUE self) +{ + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + return INT2NUM(buffer->limit); +} + +static VALUE NIO_ByteBuffer_set_limit(VALUE self, VALUE new_limit) +{ + int lim; + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + lim = NUM2INT(new_limit); + + if (lim < 0) { + rb_raise(rb_eArgError, "negative limit given"); + } + + if (lim > buffer->capacity) { + rb_raise(rb_eArgError, "specified limit exceeds capacity"); + } + + buffer->limit = lim; + + if (buffer->position > lim) { + buffer->position = lim; + } + + if (buffer->mark > lim) { + buffer->mark = MARK_UNSET; + } + + return new_limit; +} + +static VALUE NIO_ByteBuffer_capacity(VALUE self) +{ + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + return INT2NUM(buffer->capacity); +} + +static VALUE NIO_ByteBuffer_remaining(VALUE self) +{ + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + return INT2NUM(buffer->limit - buffer->position); +} + +static VALUE NIO_ByteBuffer_full(VALUE self) +{ + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + return buffer->position == buffer->limit ? Qtrue : Qfalse; +} + +static VALUE NIO_ByteBuffer_get(int argc, VALUE *argv, VALUE self) +{ + int len; + VALUE length, result; + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + rb_scan_args(argc, argv, "01", &length); + + if (length == Qnil) { + len = buffer->limit - buffer->position; + } else { + len = NUM2INT(length); + } + + if (len < 0) { + rb_raise(rb_eArgError, "negative length given"); + } + + if (len > buffer->limit - buffer->position) { + rb_raise(cNIO_ByteBuffer_UnderflowError, "not enough data in buffer"); + } + + result = rb_str_new(buffer->buffer + buffer->position, len); + buffer->position += len; + + return result; +} + +static VALUE NIO_ByteBuffer_fetch(VALUE self, VALUE index) +{ + int i; + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + i = NUM2INT(index); + + if (i < 0) { + rb_raise(rb_eArgError, "negative index given"); + } + + if (i >= buffer->limit) { + rb_raise(rb_eArgError, "specified index exceeds limit"); + } + + return INT2NUM(buffer->buffer[i]); +} + +static VALUE NIO_ByteBuffer_put(VALUE self, VALUE string) +{ + long length; + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + StringValue(string); + length = RSTRING_LEN(string); + + if (length > buffer->limit - buffer->position) { + rb_raise(cNIO_ByteBuffer_OverflowError, "buffer is full"); + } + + memcpy(buffer->buffer + buffer->position, StringValuePtr(string), length); + buffer->position += length; + + return self; +} + +static VALUE NIO_ByteBuffer_read_from(VALUE self, VALUE io) +{ + struct NIO_ByteBuffer *buffer; + ssize_t nbytes, bytes_read; + + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + io = rb_convert_type(io, T_FILE, "IO", "to_io"); + io_set_nonblock(io); + + nbytes = buffer->limit - buffer->position; + if (nbytes == 0) { + rb_raise(cNIO_ByteBuffer_OverflowError, "buffer is full"); + } + + bytes_read = read(rb_io_descriptor(io), buffer->buffer + buffer->position, nbytes); + + if (bytes_read < 0) { + if (errno == EAGAIN) { + return INT2NUM(0); + } else { + rb_sys_fail("write"); + } + } + + buffer->position += bytes_read; + + return SIZET2NUM(bytes_read); +} + +static VALUE NIO_ByteBuffer_write_to(VALUE self, VALUE io) +{ + struct NIO_ByteBuffer *buffer; + ssize_t nbytes, bytes_written; + + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + io = rb_convert_type(io, T_FILE, "IO", "to_io"); + io_set_nonblock(io); + + nbytes = buffer->limit - buffer->position; + if (nbytes == 0) { + rb_raise(cNIO_ByteBuffer_UnderflowError, "no data remaining in buffer"); + } + + bytes_written = write(rb_io_descriptor(io), buffer->buffer + buffer->position, nbytes); + + if (bytes_written < 0) { + if (errno == EAGAIN) { + return INT2NUM(0); + } else { + rb_sys_fail("write"); + } + } + + buffer->position += bytes_written; + + return SIZET2NUM(bytes_written); +} + +static VALUE NIO_ByteBuffer_flip(VALUE self) +{ + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + buffer->limit = buffer->position; + buffer->position = 0; + buffer->mark = MARK_UNSET; + + return self; +} + +static VALUE NIO_ByteBuffer_rewind(VALUE self) +{ + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + buffer->position = 0; + buffer->mark = MARK_UNSET; + + return self; +} + +static VALUE NIO_ByteBuffer_mark(VALUE self) +{ + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + buffer->mark = buffer->position; + return self; +} + +static VALUE NIO_ByteBuffer_reset(VALUE self) +{ + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + if (buffer->mark < 0) { + rb_raise(cNIO_ByteBuffer_MarkUnsetError, "mark has not been set"); + } else { + buffer->position = buffer->mark; + } + + return self; +} + +static VALUE NIO_ByteBuffer_compact(VALUE self) +{ + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + memmove(buffer->buffer, buffer->buffer + buffer->position, buffer->limit - buffer->position); + buffer->position = buffer->limit - buffer->position; + buffer->limit = buffer->capacity; + + return self; +} + +static VALUE NIO_ByteBuffer_each(VALUE self) +{ + int i; + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + if (rb_block_given_p()) { + for (i = 0; i < buffer->limit; i++) { + rb_yield(INT2NUM(buffer->buffer[i])); + } + } else { + rb_raise(rb_eArgError, "no block given"); + } + + return self; +} + +static VALUE NIO_ByteBuffer_inspect(VALUE self) +{ + struct NIO_ByteBuffer *buffer; + TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); + + return rb_sprintf( + "#<%s:%p @position=%d @limit=%d @capacity=%d>", + rb_class2name(CLASS_OF(self)), + (void *)self, + buffer->position, + buffer->limit, + buffer->capacity); +} diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/extconf.rb b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/extconf.rb new file mode 100644 index 0000000..b4ae112 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/extconf.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +# Released under the MIT License. +# Copyright, 2011-2020, by Tony Arcieri. +# Copyright, 2014, by Hiroshi Shibata. +# Copyright, 2014, by Sergey Avseyev. +# Copyright, 2015, by Daniel Berger. +# Copyright, 2017, by Jun Aruga. +# Copyright, 2017, by Usaku Nakamura. +# Copyright, 2017, by Lars Kanis. +# Copyright, 2019-2023, by Samuel Williams. +# Copyright, 2020, by Gregory Longtin. +# Copyright, 2020, by Boaz Segev. +# Copyright, 2020, by Joao Fernandes. +# Copyright, 2021, by Jeffrey Martin. + +require "rubygems" + +# Write a dummy Makefile on Windows because we use the pure Ruby implementation there +if Gem.win_platform? + begin + require "devkit" if RUBY_PLATFORM.include?("mingw") + rescue LoadError => e + end + File.write("Makefile", "all install::\n") + File.write("nio4r_ext.so", "") + exit +end + +require "mkmf" + +have_header("unistd.h") +have_func("rb_io_descriptor") + +$defs << "-DEV_USE_LINUXAIO" if have_header("linux/aio_abi.h") +$defs << "-DEV_USE_IOURING" if have_header("linux/io_uring.h") +$defs << "-DEV_USE_SELECT" if have_header("sys/select.h") +$defs << "-DEV_USE_POLL" if have_type("port_event_t", "poll.h") +$defs << "-DEV_USE_EPOLL" if have_header("sys/epoll.h") +$defs << "-DEV_USE_KQUEUE" if have_header("sys/event.h") && have_header("sys/queue.h") +$defs << "-DEV_USE_PORT" if have_type("port_event_t", "port.h") +$defs << "-DHAVE_SYS_RESOURCE_H" if have_header("sys/resource.h") + +$defs << "-DEV_STANDALONE" # prevent libev from assuming "config.h" exists + +CONFIG["optflags"] << " -fno-strict-aliasing" unless RUBY_PLATFORM =~ /mswin/ + +if RUBY_PLATFORM =~ /darwin/ + $DLDFLAGS.gsub!(/\-arch\s+[^\s]+/, "") +end + +dir_config "nio4r_ext" +create_makefile "nio4r_ext" diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/libev.h b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/libev.h new file mode 100644 index 0000000..4076348 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/libev.h @@ -0,0 +1,7 @@ +#ifdef _WIN32 +#define EV_SELECT_IS_WINSOCKET 1 +#define EV_USE_MONOTONIC 0 +#define EV_USE_REALTIME 0 +#endif + +#include "../libev/ev.h" diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/monitor.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/monitor.c new file mode 100644 index 0000000..cb44d44 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/monitor.c @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2011 Tony Arcieri. Distributed under the MIT License. See + * LICENSE.txt for further details. + */ + +#include "nio4r.h" +#include + +static VALUE mNIO = Qnil; +static VALUE cNIO_Monitor = Qnil; + +/* Allocator/deallocator */ +static VALUE NIO_Monitor_allocate(VALUE klass); +static void NIO_Monitor_mark(void *data); +static size_t NIO_Monitor_memsize(const void *data); + +/* Methods */ +static VALUE NIO_Monitor_initialize(VALUE self, VALUE selector, VALUE io, VALUE interests); +static VALUE NIO_Monitor_close(int argc, VALUE *argv, VALUE self); +static VALUE NIO_Monitor_is_closed(VALUE self); +static VALUE NIO_Monitor_io(VALUE self); +static VALUE NIO_Monitor_interests(VALUE self); +static VALUE NIO_Monitor_set_interests(VALUE self, VALUE interests); +static VALUE NIO_Monitor_add_interest(VALUE self, VALUE interest); +static VALUE NIO_Monitor_remove_interest(VALUE self, VALUE interest); +static VALUE NIO_Monitor_selector(VALUE self); +static VALUE NIO_Monitor_is_readable(VALUE self); +static VALUE NIO_Monitor_is_writable(VALUE self); +static VALUE NIO_Monitor_value(VALUE self); +static VALUE NIO_Monitor_set_value(VALUE self, VALUE obj); +static VALUE NIO_Monitor_readiness(VALUE self); + +/* Internal C functions */ +static int NIO_Monitor_symbol2interest(VALUE interests); +static void NIO_Monitor_update_interests(VALUE self, int interests); + +/* Compatibility for Ruby <= 3.1 */ +#ifndef HAVE_RB_IO_DESCRIPTOR +static int +io_descriptor_fallback(VALUE io) +{ + rb_io_t *fptr; + GetOpenFile(io, fptr); + return fptr->fd; +} +#define rb_io_descriptor io_descriptor_fallback +#endif + +/* Monitor control how a channel is being waited for by a monitor */ +void Init_NIO_Monitor() +{ + mNIO = rb_define_module("NIO"); + cNIO_Monitor = rb_define_class_under(mNIO, "Monitor", rb_cObject); + rb_define_alloc_func(cNIO_Monitor, NIO_Monitor_allocate); + + rb_define_method(cNIO_Monitor, "initialize", NIO_Monitor_initialize, 3); + rb_define_method(cNIO_Monitor, "close", NIO_Monitor_close, -1); + rb_define_method(cNIO_Monitor, "closed?", NIO_Monitor_is_closed, 0); + rb_define_method(cNIO_Monitor, "io", NIO_Monitor_io, 0); + rb_define_method(cNIO_Monitor, "interests", NIO_Monitor_interests, 0); + rb_define_method(cNIO_Monitor, "interests=", NIO_Monitor_set_interests, 1); + rb_define_method(cNIO_Monitor, "add_interest", NIO_Monitor_add_interest, 1); + rb_define_method(cNIO_Monitor, "remove_interest", NIO_Monitor_remove_interest, 1); + rb_define_method(cNIO_Monitor, "selector", NIO_Monitor_selector, 0); + rb_define_method(cNIO_Monitor, "value", NIO_Monitor_value, 0); + rb_define_method(cNIO_Monitor, "value=", NIO_Monitor_set_value, 1); + rb_define_method(cNIO_Monitor, "readiness", NIO_Monitor_readiness, 0); + rb_define_method(cNIO_Monitor, "readable?", NIO_Monitor_is_readable, 0); + rb_define_method(cNIO_Monitor, "writable?", NIO_Monitor_is_writable, 0); + rb_define_method(cNIO_Monitor, "writeable?", NIO_Monitor_is_writable, 0); +} + +static const rb_data_type_t NIO_Monitor_type = { + "NIO::Monitor", + { + NIO_Monitor_mark, + RUBY_TYPED_DEFAULT_FREE, + NIO_Monitor_memsize, + }, + 0, + 0, + RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED +}; + +static VALUE NIO_Monitor_allocate(VALUE klass) +{ + struct NIO_Monitor *monitor = (struct NIO_Monitor *)xmalloc(sizeof(struct NIO_Monitor)); + assert(monitor); + *monitor = (struct NIO_Monitor){.self = Qnil}; + return TypedData_Wrap_Struct(klass, &NIO_Monitor_type, monitor); +} + +static void NIO_Monitor_mark(void *data) +{ + struct NIO_Monitor *monitor = (struct NIO_Monitor *)data; + rb_gc_mark(monitor->self); +} + +static size_t NIO_Monitor_memsize(const void *data) +{ + const struct NIO_Monitor *monitor = (const struct NIO_Monitor *)data; + return sizeof(*monitor); +} + +static VALUE NIO_Monitor_initialize(VALUE self, VALUE io, VALUE interests, VALUE selector_obj) +{ + struct NIO_Monitor *monitor; + struct NIO_Selector *selector; + ID interests_id; + + interests_id = SYM2ID(interests); + + TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); + + if (interests_id == rb_intern("r")) { + monitor->interests = EV_READ; + } else if (interests_id == rb_intern("w")) { + monitor->interests = EV_WRITE; + } else if (interests_id == rb_intern("rw")) { + monitor->interests = EV_READ | EV_WRITE; + } else { + rb_raise(rb_eArgError, "invalid event type %s (must be :r, :w, or :rw)", RSTRING_PTR(rb_funcall(interests, rb_intern("inspect"), 0))); + } + + int descriptor = rb_io_descriptor(rb_convert_type(io, T_FILE, "IO", "to_io")); + ev_io_init(&monitor->ev_io, NIO_Selector_monitor_callback, descriptor, monitor->interests); + + rb_ivar_set(self, rb_intern("io"), io); + rb_ivar_set(self, rb_intern("interests"), interests); + rb_ivar_set(self, rb_intern("selector"), selector_obj); + + selector = NIO_Selector_unwrap(selector_obj); + + RB_OBJ_WRITE(self, &monitor->self, self); + monitor->ev_io.data = (void *)monitor; + + /* We can safely hang onto this as we also hang onto a reference to the + object where it originally came from */ + monitor->selector = selector; + + if (monitor->interests) { + ev_io_start(selector->ev_loop, &monitor->ev_io); + } + + return Qnil; +} + +static VALUE NIO_Monitor_close(int argc, VALUE *argv, VALUE self) +{ + VALUE deregister, selector; + struct NIO_Monitor *monitor; + TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); + + rb_scan_args(argc, argv, "01", &deregister); + selector = rb_ivar_get(self, rb_intern("selector")); + + if (selector != Qnil) { + /* if ev_loop is 0, it means that the loop has been stopped already (see NIO_Selector_shutdown) */ + if (monitor->interests && monitor->selector->ev_loop) { + ev_io_stop(monitor->selector->ev_loop, &monitor->ev_io); + } + + monitor->selector = 0; + rb_ivar_set(self, rb_intern("selector"), Qnil); + + /* Default value is true */ + if (deregister == Qtrue || deregister == Qnil) { + rb_funcall(selector, rb_intern("deregister"), 1, rb_ivar_get(self, rb_intern("io"))); + } + } + + return Qnil; +} + +static VALUE NIO_Monitor_is_closed(VALUE self) +{ + struct NIO_Monitor *monitor; + TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); + + return monitor->selector == 0 ? Qtrue : Qfalse; +} + +static VALUE NIO_Monitor_io(VALUE self) +{ + return rb_ivar_get(self, rb_intern("io")); +} + +static VALUE NIO_Monitor_interests(VALUE self) +{ + return rb_ivar_get(self, rb_intern("interests")); +} + +static VALUE NIO_Monitor_set_interests(VALUE self, VALUE interests) +{ + if (NIL_P(interests)) { + NIO_Monitor_update_interests(self, 0); + } else { + NIO_Monitor_update_interests(self, NIO_Monitor_symbol2interest(interests)); + } + + return rb_ivar_get(self, rb_intern("interests")); +} + +static VALUE NIO_Monitor_add_interest(VALUE self, VALUE interest) +{ + struct NIO_Monitor *monitor; + TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); + + interest = monitor->interests | NIO_Monitor_symbol2interest(interest); + NIO_Monitor_update_interests(self, (int)interest); + + return rb_ivar_get(self, rb_intern("interests")); +} + +static VALUE NIO_Monitor_remove_interest(VALUE self, VALUE interest) +{ + struct NIO_Monitor *monitor; + TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); + + interest = monitor->interests & ~NIO_Monitor_symbol2interest(interest); + NIO_Monitor_update_interests(self, (int)interest); + + return rb_ivar_get(self, rb_intern("interests")); +} + +static VALUE NIO_Monitor_selector(VALUE self) +{ + return rb_ivar_get(self, rb_intern("selector")); +} + +static VALUE NIO_Monitor_value(VALUE self) +{ + return rb_ivar_get(self, rb_intern("value")); +} + +static VALUE NIO_Monitor_set_value(VALUE self, VALUE obj) +{ + return rb_ivar_set(self, rb_intern("value"), obj); +} + +static VALUE NIO_Monitor_readiness(VALUE self) +{ + struct NIO_Monitor *monitor; + TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); + + if ((monitor->revents & (EV_READ | EV_WRITE)) == (EV_READ | EV_WRITE)) { + return ID2SYM(rb_intern("rw")); + } else if (monitor->revents & EV_READ) { + return ID2SYM(rb_intern("r")); + } else if (monitor->revents & EV_WRITE) { + return ID2SYM(rb_intern("w")); + } else { + return Qnil; + } +} + +static VALUE NIO_Monitor_is_readable(VALUE self) +{ + struct NIO_Monitor *monitor; + TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); + + if (monitor->revents & EV_READ) { + return Qtrue; + } else { + return Qfalse; + } +} + +static VALUE NIO_Monitor_is_writable(VALUE self) +{ + struct NIO_Monitor *monitor; + TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); + + if (monitor->revents & EV_WRITE) { + return Qtrue; + } else { + return Qfalse; + } +} + +/* Internal C functions */ + +static int NIO_Monitor_symbol2interest(VALUE interests) +{ + ID interests_id; + interests_id = SYM2ID(interests); + + if (interests_id == rb_intern("r")) { + return EV_READ; + } else if (interests_id == rb_intern("w")) { + return EV_WRITE; + } else if (interests_id == rb_intern("rw")) { + return EV_READ | EV_WRITE; + } else { + rb_raise(rb_eArgError, "invalid interest type %s (must be :r, :w, or :rw)", RSTRING_PTR(rb_funcall(interests, rb_intern("inspect"), 0))); + } +} + +static void NIO_Monitor_update_interests(VALUE self, int interests) +{ + ID interests_id; + struct NIO_Monitor *monitor; + TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); + + if (NIO_Monitor_is_closed(self) == Qtrue) { + rb_raise(rb_eEOFError, "monitor is closed"); + } + + if (interests) { + switch (interests) { + case EV_READ: + interests_id = rb_intern("r"); + break; + case EV_WRITE: + interests_id = rb_intern("w"); + break; + case EV_READ | EV_WRITE: + interests_id = rb_intern("rw"); + break; + default: + rb_raise(rb_eRuntimeError, "bogus NIO_Monitor_update_interests! (%d)", interests); + } + + rb_ivar_set(self, rb_intern("interests"), ID2SYM(interests_id)); + } else { + rb_ivar_set(self, rb_intern("interests"), Qnil); + } + + if (monitor->interests != interests) { + // If the monitor currently has interests, we should stop it. + if (monitor->interests) { + ev_io_stop(monitor->selector->ev_loop, &monitor->ev_io); + } + + // Assign the interests we are now monitoring for: + monitor->interests = interests; + ev_io_set(&monitor->ev_io, monitor->ev_io.fd, monitor->interests); + + // If we are interested in events, schedule the monitor back into the event loop: + if (monitor->interests) { + ev_io_start(monitor->selector->ev_loop, &monitor->ev_io); + } + } +} diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r.h b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r.h new file mode 100644 index 0000000..dc65e91 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2011 Tony Arcieri. Distributed under the MIT License. See + * LICENSE.txt for further details. + */ + +#ifndef NIO4R_H +#define NIO4R_H + +#include "libev.h" +#include "ruby.h" +#include "ruby/io.h" + +struct NIO_Selector { + struct ev_loop *ev_loop; + struct ev_timer timer; /* for timeouts */ + struct ev_io wakeup; + + int ready_count; + int closed, selecting; + int wakeup_reader, wakeup_writer; + volatile int wakeup_fired; + + VALUE ready_array; +}; + +struct NIO_callback_data { + VALUE *monitor; + struct NIO_Selector *selector; +}; + +struct NIO_Monitor { + VALUE self; + int interests, revents; + struct ev_io ev_io; + struct NIO_Selector *selector; +}; + +struct NIO_ByteBuffer { + char *buffer; + int position, limit, capacity, mark; +}; + +struct NIO_Selector *NIO_Selector_unwrap(VALUE selector); + +/* Thunk between libev callbacks in NIO::Monitors and NIO::Selectors */ +void NIO_Selector_monitor_callback(struct ev_loop *ev_loop, struct ev_io *io, int revents); + +#endif /* NIO4R_H */ diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r_ext.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r_ext.c new file mode 100644 index 0000000..d2c2cb7 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r_ext.c @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2011-2017 Tony Arcieri. Distributed under the MIT License. + * See LICENSE.txt for further details. + */ + +#include "../libev/ev.c" +#include "nio4r.h" + +void Init_NIO_Selector(); +void Init_NIO_Monitor(); +void Init_NIO_ByteBuffer(); + +void Init_nio4r_ext() +{ + #ifdef HAVE_RB_EXT_RACTOR_SAFE + rb_ext_ractor_safe(true); + #endif + + ev_set_allocator(xrealloc); + + Init_NIO_Selector(); + Init_NIO_Monitor(); + Init_NIO_ByteBuffer(); +} diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/ByteBuffer.java b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/ByteBuffer.java new file mode 100644 index 0000000..8764b7c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/ByteBuffer.java @@ -0,0 +1,295 @@ +package org.nio4r; + +import java.io.IOException; +import java.io.Serializable; +import java.nio.channels.Channel; +import java.nio.channels.SelectableChannel; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; +import java.nio.BufferOverflowException; +import java.nio.BufferUnderflowException; +import java.nio.InvalidMarkException; + +import org.jruby.Ruby; +import org.jruby.RubyClass; +import org.jruby.RubyIO; +import org.jruby.RubyNumeric; +import org.jruby.RubyObject; +import org.jruby.RubyString; +import org.jruby.anno.JRubyMethod; +import org.jruby.exceptions.RaiseException; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.Block; + +/* +created by Upekshej + */ +public class ByteBuffer extends RubyObject { + private static final long serialVersionUID = -6903439483039149324L; + private transient java.nio.ByteBuffer byteBuffer; + + public static RaiseException newOverflowError(ThreadContext context, String message) { + RubyClass klass = context.runtime.getModule("NIO").getClass("ByteBuffer").getClass("OverflowError"); + return context.runtime.newRaiseException(klass, message); + } + + public static RaiseException newUnderflowError(ThreadContext context, String message) { + RubyClass klass = context.runtime.getModule("NIO").getClass("ByteBuffer").getClass("UnderflowError"); + return context.runtime.newRaiseException(klass, message); + } + + public static RaiseException newMarkUnsetError(ThreadContext context, String message) { + RubyClass klass = context.runtime.getModule("NIO").getClass("ByteBuffer").getClass("MarkUnsetError"); + return context.runtime.newRaiseException(klass, message); + } + + public ByteBuffer(final Ruby ruby, RubyClass rubyClass) { + super(ruby, rubyClass); + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context, IRubyObject capacity) { + this.byteBuffer = java.nio.ByteBuffer.allocate(RubyNumeric.num2int(capacity)); + return this; + } + + @JRubyMethod + public IRubyObject clear(ThreadContext context) { + this.byteBuffer.clear(); + return this; + } + + @JRubyMethod(name = "position") + public IRubyObject getPosition(ThreadContext context) { + return context.getRuntime().newFixnum(this.byteBuffer.position()); + } + + @JRubyMethod(name = "position=") + public IRubyObject setPosition(ThreadContext context, IRubyObject newPosition) { + int pos = RubyNumeric.num2int(newPosition); + + if(pos < 0) { + throw context.runtime.newArgumentError("negative position given"); + } + + if(pos > this.byteBuffer.limit()) { + throw context.runtime.newArgumentError("specified position exceeds limit"); + } + + try { + this.byteBuffer.position(pos); + return newPosition; + } catch(IllegalArgumentException e) { + throw context.runtime.newArgumentError(e.getLocalizedMessage()); + } + } + + @JRubyMethod(name = "limit") + public IRubyObject getLimit(ThreadContext context) { + return context.getRuntime().newFixnum(this.byteBuffer.limit()); + } + + @JRubyMethod(name = "limit=") + public IRubyObject setLimit(ThreadContext context, IRubyObject newLimit) { + int lim = RubyNumeric.num2int(newLimit); + + if(lim < 0) { + throw context.runtime.newArgumentError("negative limit given"); + } + + if(lim > this.byteBuffer.capacity()) { + throw context.runtime.newArgumentError("specified limit exceeds capacity"); + } + + try { + this.byteBuffer.limit(lim); + return newLimit; + } catch(IllegalArgumentException e) { + throw context.runtime.newArgumentError(e.getLocalizedMessage()); + } + } + + @JRubyMethod(name = {"capacity", "size"}) + public IRubyObject capacity(ThreadContext context) { + return context.getRuntime().newFixnum(this.byteBuffer.capacity()); + } + + @JRubyMethod + public IRubyObject remaining(ThreadContext context) { + return context.getRuntime().newFixnum(this.byteBuffer.remaining()); + } + + @JRubyMethod(name = "full?") + public IRubyObject isFull(ThreadContext context) { + if (this.byteBuffer.hasRemaining()) { + return context.getRuntime().getFalse(); + } else { + return context.getRuntime().getTrue(); + } + } + + @JRubyMethod + public IRubyObject get(ThreadContext context) { + return this.get(context, context.getRuntime().newFixnum(this.byteBuffer.remaining())); + } + + @JRubyMethod + public IRubyObject get(ThreadContext context, IRubyObject length) { + int len = RubyNumeric.num2int(length); + byte[] bytes = new byte[len]; + + try { + this.byteBuffer.get(bytes); + } catch(BufferUnderflowException e) { + throw ByteBuffer.newUnderflowError(context, "not enough data in buffer"); + } + + return RubyString.newString(context.getRuntime(), bytes); + } + + @JRubyMethod(name = "[]") + public IRubyObject fetch(ThreadContext context, IRubyObject index) { + int i = RubyNumeric.num2int(index); + + if(i < 0) { + throw context.runtime.newArgumentError("negative index given"); + } + + if(i >= this.byteBuffer.limit()) { + throw context.runtime.newArgumentError("index exceeds limit"); + } + + return context.getRuntime().newFixnum(this.byteBuffer.get(i)); + } + + @JRubyMethod(name = "<<") + public IRubyObject put(ThreadContext context, IRubyObject str) { + try { + this.byteBuffer.put(str.convertToString().getByteList().bytes()); + } catch(BufferOverflowException e) { + throw ByteBuffer.newOverflowError(context, "buffer is full"); + } + + return this; + } + + @JRubyMethod(name = "read_from") + public IRubyObject readFrom(ThreadContext context, IRubyObject io) { + Ruby runtime = context.runtime; + Channel channel = RubyIO.convertToIO(context, io).getChannel(); + + if(!this.byteBuffer.hasRemaining()) { + throw ByteBuffer.newOverflowError(context, "buffer is full"); + } + + if(!(channel instanceof ReadableByteChannel) || !(channel instanceof SelectableChannel)) { + throw runtime.newArgumentError("unsupported IO object: " + io.getType().toString()); + } + + try { + ((SelectableChannel)channel).configureBlocking(false); + } catch(IOException ie) { + throw runtime.newIOError(ie.getLocalizedMessage()); + } + + try { + int bytesRead = ((ReadableByteChannel)channel).read(this.byteBuffer); + + if(bytesRead >= 0) { + return runtime.newFixnum(bytesRead); + } else { + throw runtime.newEOFError(); + } + } catch(IOException ie) { + throw runtime.newIOError(ie.getLocalizedMessage()); + } + } + + @JRubyMethod(name = "write_to") + public IRubyObject writeTo(ThreadContext context, IRubyObject io) { + Ruby runtime = context.runtime; + Channel channel = RubyIO.convertToIO(context, io).getChannel(); + + if(!this.byteBuffer.hasRemaining()) { + throw ByteBuffer.newUnderflowError(context, "not enough data in buffer"); + } + + if(!(channel instanceof WritableByteChannel) || !(channel instanceof SelectableChannel)) { + throw runtime.newArgumentError("unsupported IO object: " + io.getType().toString()); + } + + try { + ((SelectableChannel)channel).configureBlocking(false); + } catch(IOException ie) { + throw runtime.newIOError(ie.getLocalizedMessage()); + } + + try { + int bytesWritten = ((WritableByteChannel)channel).write(this.byteBuffer); + + if(bytesWritten >= 0) { + return runtime.newFixnum(bytesWritten); + } else { + throw runtime.newEOFError(); + } + } catch(IOException ie) { + throw runtime.newIOError(ie.getLocalizedMessage()); + } + } + + @JRubyMethod + public IRubyObject flip(ThreadContext context) { + this.byteBuffer.flip(); + return this; + } + + @JRubyMethod + public IRubyObject rewind(ThreadContext context) { + this.byteBuffer.rewind(); + return this; + } + + @JRubyMethod + public IRubyObject mark(ThreadContext context) { + this.byteBuffer.mark(); + return this; + } + + @JRubyMethod + public IRubyObject reset(ThreadContext context) { + try { + this.byteBuffer.reset(); + return this; + } catch(InvalidMarkException ie) { + throw ByteBuffer.newMarkUnsetError(context, "mark has not been set"); + } + } + + @JRubyMethod + public IRubyObject compact(ThreadContext context) { + this.byteBuffer.compact(); + return this; + } + + @JRubyMethod + public IRubyObject each(ThreadContext context, Block block) { + for(int i = 0; i < this.byteBuffer.limit(); i++) { + block.call(context, context.getRuntime().newFixnum(this.byteBuffer.get(i))); + } + + return this; + } + + @JRubyMethod + public IRubyObject inspect(ThreadContext context) { + return context.runtime.newString(String.format( + "#<%s:0x%x @position=%d @limit=%d @capacity=%d>", + this.getType().toString(), + System.identityHashCode(this), + this.byteBuffer.position(), + this.byteBuffer.limit(), + this.byteBuffer.capacity() + )); + } +} diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Monitor.java b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Monitor.java new file mode 100644 index 0000000..bfe5d1c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Monitor.java @@ -0,0 +1,176 @@ +package org.nio4r; + +import java.nio.channels.Channel; +import java.nio.channels.SelectableChannel; +import java.nio.channels.SelectionKey; + +import org.jruby.Ruby; +import org.jruby.RubyClass; +import org.jruby.RubyIO; +import org.jruby.RubyObject; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +public class Monitor extends RubyObject { + private static final long serialVersionUID = -3733782997115074794L; + private transient SelectionKey key; + private RubyIO io; + private transient IRubyObject interests, selector, value, closed; + + public Monitor(final Ruby ruby, RubyClass rubyClass) { + super(ruby, rubyClass); + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context, IRubyObject selectable, IRubyObject interests, IRubyObject selector) { + this.io = RubyIO.convertToIO(context, selectable); + this.interests = interests; + this.selector = selector; + + this.value = context.nil; + this.closed = context.getRuntime().getFalse(); + + return context.nil; + } + + public void setSelectionKey(SelectionKey key) { + this.key = key; + key.attach(this); + } + + @JRubyMethod + public IRubyObject io(ThreadContext context) { + return io; + } + + @JRubyMethod + public IRubyObject selector(ThreadContext context) { + return selector; + } + + @JRubyMethod(name = "interests") + public IRubyObject getInterests(ThreadContext context) { + return interests; + } + + @JRubyMethod(name = "interests=") + public IRubyObject setInterests(ThreadContext context, IRubyObject interests) { + if(this.closed == context.getRuntime().getTrue()) { + throw context.getRuntime().newEOFError("monitor is closed"); + } + + Ruby ruby = context.getRuntime(); + SelectableChannel channel = (SelectableChannel)io.getChannel(); + + if(interests != context.nil) { + key.interestOps(Nio4r.symbolToInterestOps(ruby, channel, interests)); + } else { + key.interestOps(0); + } + + this.interests = interests; + + return this.interests; + } + + @JRubyMethod(name = "add_interest") + public IRubyObject addInterest(ThreadContext context, IRubyObject interest) { + if(this.closed == context.getRuntime().getTrue()) { + throw context.getRuntime().newEOFError("monitor is closed"); + } + + Ruby ruby = context.getRuntime(); + SelectableChannel channel = (SelectableChannel)io.getChannel(); + int newInterestOps = key.interestOps() | Nio4r.symbolToInterestOps(ruby, channel, interest); + + key.interestOps(newInterestOps); + this.interests = Nio4r.interestOpsToSymbol(ruby, newInterestOps); + + return this.interests; + } + + @JRubyMethod(name = "remove_interest") + public IRubyObject removeInterest(ThreadContext context, IRubyObject interest) { + if(this.closed == context.getRuntime().getTrue()) { + throw context.getRuntime().newEOFError("monitor is closed"); + } + + Ruby ruby = context.getRuntime(); + SelectableChannel channel = (SelectableChannel)io.getChannel(); + int newInterestOps = key.interestOps() & ~Nio4r.symbolToInterestOps(ruby, channel, interest); + + key.interestOps(newInterestOps); + this.interests = Nio4r.interestOpsToSymbol(ruby, newInterestOps); + + return this.interests; + } + + @JRubyMethod + public IRubyObject readiness(ThreadContext context) { + if(!key.isValid()) + return this.interests; + return Nio4r.interestOpsToSymbol(context.getRuntime(), key.readyOps()); + } + + @JRubyMethod(name = "readable?") + public IRubyObject isReadable(ThreadContext context) { + Ruby runtime = context.getRuntime(); + if (!this.key.isValid()) + return runtime.getTrue(); + int readyOps = this.key.readyOps(); + + if((readyOps & SelectionKey.OP_READ) != 0 || (readyOps & SelectionKey.OP_ACCEPT) != 0) { + return runtime.getTrue(); + } else { + return runtime.getFalse(); + } + } + + @JRubyMethod(name = {"writable?", "writeable?"}) + public IRubyObject writable(ThreadContext context) { + Ruby runtime = context.getRuntime(); + if (!this.key.isValid()) + return runtime.getTrue(); + int readyOps = this.key.readyOps(); + + if((readyOps & SelectionKey.OP_WRITE) != 0 || (readyOps & SelectionKey.OP_CONNECT) != 0) { + return runtime.getTrue(); + } else { + return runtime.getFalse(); + } + } + + @JRubyMethod(name = "value") + public IRubyObject getValue(ThreadContext context) { + return this.value; + } + + @JRubyMethod(name = "value=") + public IRubyObject setValue(ThreadContext context, IRubyObject obj) { + this.value = obj; + return context.nil; + } + + @JRubyMethod + public IRubyObject close(ThreadContext context) { + return close(context, context.getRuntime().getTrue()); + } + + @JRubyMethod + public IRubyObject close(ThreadContext context, IRubyObject deregister) { + Ruby runtime = context.getRuntime(); + this.closed = runtime.getTrue(); + + if(deregister == runtime.getTrue()) { + selector.callMethod(context, "deregister", io); + } + + return context.nil; + } + + @JRubyMethod(name = "closed?") + public IRubyObject isClosed(ThreadContext context) { + return this.closed; + } +} diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Nio4r.java b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Nio4r.java new file mode 100644 index 0000000..ccb066a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Nio4r.java @@ -0,0 +1,104 @@ +package org.nio4r; + +import java.nio.channels.SelectableChannel; +import java.nio.channels.SelectionKey; +import java.nio.channels.SocketChannel; + +import org.jruby.Ruby; +import org.jruby.RubyClass; +import org.jruby.RubyModule; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.load.Library; +import org.jruby.runtime.builtin.IRubyObject; + +import org.nio4r.ByteBuffer; +import org.nio4r.Monitor; +import org.nio4r.Selector; + +public class Nio4r implements Library { + private Ruby ruby; + + public void load(final Ruby ruby, boolean bln) { + this.ruby = ruby; + + RubyModule nio = ruby.defineModule("NIO"); + + RubyClass selector = ruby.defineClassUnder("Selector", ruby.getObject(), new ObjectAllocator() { + public IRubyObject allocate(Ruby ruby, RubyClass rc) { + return new Selector(ruby, rc); + } + }, nio); + + selector.defineAnnotatedMethods(Selector.class); + + RubyClass monitor = ruby.defineClassUnder("Monitor", ruby.getObject(), new ObjectAllocator() { + public IRubyObject allocate(Ruby ruby, RubyClass rc) { + return new Monitor(ruby, rc); + } + }, nio); + + monitor.defineAnnotatedMethods(Monitor.class); + + RubyClass byteBuffer = ruby.defineClassUnder("ByteBuffer", ruby.getObject(), new ObjectAllocator() { + public IRubyObject allocate(Ruby ruby, RubyClass rc) { + return new ByteBuffer(ruby, rc); + } + }, nio); + + byteBuffer.defineAnnotatedMethods(ByteBuffer.class); + byteBuffer.includeModule(ruby.getEnumerable()); + + ruby.defineClassUnder("OverflowError", ruby.getIOError(), ruby.getIOError().getAllocator(), byteBuffer); + ruby.defineClassUnder("UnderflowError", ruby.getIOError(), ruby.getIOError().getAllocator(), byteBuffer); + ruby.defineClassUnder("MarkUnsetError", ruby.getIOError(), ruby.getIOError().getAllocator(), byteBuffer); + } + + public static int symbolToInterestOps(Ruby ruby, SelectableChannel channel, IRubyObject interest) { + if(interest == ruby.newSymbol("r")) { + if((channel.validOps() & SelectionKey.OP_ACCEPT) != 0) { + return SelectionKey.OP_ACCEPT; + } else { + return SelectionKey.OP_READ; + } + } else if(interest == ruby.newSymbol("w")) { + if(channel instanceof SocketChannel && !((SocketChannel)channel).isConnected()) { + return SelectionKey.OP_CONNECT; + } else { + return SelectionKey.OP_WRITE; + } + } else if(interest == ruby.newSymbol("rw")) { + int interestOps = 0; + + /* nio4r emulates the POSIX behavior, which is sloppy about allowed modes */ + if((channel.validOps() & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0) { + interestOps |= symbolToInterestOps(ruby, channel, ruby.newSymbol("r")); + } + + if((channel.validOps() & (SelectionKey.OP_WRITE | SelectionKey.OP_CONNECT)) != 0) { + interestOps |= symbolToInterestOps(ruby, channel, ruby.newSymbol("w")); + } + + return interestOps; + } else { + throw ruby.newArgumentError("invalid interest type: " + interest); + } + } + + public static IRubyObject interestOpsToSymbol(Ruby ruby, int interestOps) { + switch(interestOps) { + case SelectionKey.OP_READ: + case SelectionKey.OP_ACCEPT: + return ruby.newSymbol("r"); + case SelectionKey.OP_WRITE: + case SelectionKey.OP_CONNECT: + return ruby.newSymbol("w"); + case SelectionKey.OP_READ | SelectionKey.OP_CONNECT: + case SelectionKey.OP_READ | SelectionKey.OP_WRITE: + return ruby.newSymbol("rw"); + case 0: + return ruby.getNil(); + default: + throw ruby.newArgumentError("unknown interest op combination"); + } + } +} diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Selector.java b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Selector.java new file mode 100644 index 0000000..99c0f28 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Selector.java @@ -0,0 +1,297 @@ +package org.nio4r; + +import java.util.Iterator; +import java.util.Map; +import java.util.HashMap; +import java.io.IOException; +import java.nio.channels.Channel; +import java.nio.channels.SelectableChannel; +import java.nio.channels.SelectionKey; + +import org.jruby.Ruby; +import org.jruby.RubyArray; +import org.jruby.RubyClass; +import org.jruby.RubyIO; +import org.jruby.RubyNumeric; +import org.jruby.RubyObject; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.Block; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.io.OpenFile; + +public class Selector extends RubyObject { + private static final long serialVersionUID = -14562818539414873L; + private transient java.nio.channels.Selector selector; + private HashMap cancelledKeys; + private volatile boolean wakeupFired; + + public Selector(final Ruby ruby, RubyClass rubyClass) { + super(ruby, rubyClass); + } + + @JRubyMethod(meta = true) + public static IRubyObject backends(ThreadContext context, IRubyObject self) { + return context.runtime.newArray(context.runtime.newSymbol("java")); + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context) { + initialize(context, context.runtime.newSymbol("java")); + return context.nil; + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context, IRubyObject backend) { + if(backend != context.runtime.newSymbol("java") && !backend.isNil()) { + throw context.runtime.newArgumentError(":java is the only supported backend"); + } + + this.cancelledKeys = new HashMap(); + this.wakeupFired = false; + + try { + this.selector = java.nio.channels.Selector.open(); + } catch(IOException ie) { + throw context.runtime.newIOError(ie.getLocalizedMessage()); + } + + return context.nil; + } + + @JRubyMethod + public IRubyObject backend(ThreadContext context) { + return context.runtime.newSymbol("java"); + } + + @JRubyMethod + public IRubyObject close(ThreadContext context) { + try { + this.selector.close(); + } catch(IOException ie) { + throw context.runtime.newIOError(ie.getLocalizedMessage()); + } + + return context.nil; + } + + @JRubyMethod(name = "closed?") + public IRubyObject isClosed(ThreadContext context) { + Ruby runtime = context.getRuntime(); + return this.selector.isOpen() ? runtime.getFalse() : runtime.getTrue(); + } + + @JRubyMethod(name = "empty?") + public IRubyObject isEmpty(ThreadContext context) { + Ruby runtime = context.getRuntime(); + return this.selector.keys().isEmpty() ? runtime.getTrue() : runtime.getFalse(); + } + + @JRubyMethod + public IRubyObject register(ThreadContext context, IRubyObject io, IRubyObject interests) { + Ruby runtime = context.getRuntime(); + Channel rawChannel = RubyIO.convertToIO(context, io).getChannel(); + + if(!this.selector.isOpen()) { + throw context.getRuntime().newIOError("selector is closed"); + } + + if(!(rawChannel instanceof SelectableChannel)) { + throw runtime.newArgumentError("not a selectable IO object"); + } + + SelectableChannel channel = (SelectableChannel)rawChannel; + + try { + channel.configureBlocking(false); + } catch(IOException ie) { + throw runtime.newIOError(ie.getLocalizedMessage()); + } + + int interestOps = Nio4r.symbolToInterestOps(runtime, channel, interests); + SelectionKey key; + + key = this.cancelledKeys.remove(channel); + + if(key != null) { + key.interestOps(interestOps); + } else { + try { + key = channel.register(this.selector, interestOps); + } catch(java.lang.IllegalArgumentException ia) { + throw runtime.newArgumentError("mode not supported for this object: " + interests); + } catch(java.nio.channels.ClosedChannelException cce) { + throw context.runtime.newIOError(cce.getLocalizedMessage()); + } + } + + RubyClass monitorClass = runtime.getModule("NIO").getClass("Monitor"); + Monitor monitor = (Monitor)monitorClass.newInstance(context, io, interests, this, null); + monitor.setSelectionKey(key); + + return monitor; + } + + @JRubyMethod + public IRubyObject deregister(ThreadContext context, IRubyObject io) { + Ruby runtime = context.getRuntime(); + OpenFile file = RubyIO.convertToIO(context, io).getOpenFileInitialized(); + if (file.fd() == null) + return context.nil; + Channel rawChannel = file.channel(); + + if(!(rawChannel instanceof SelectableChannel)) { + throw runtime.newArgumentError("not a selectable IO object"); + } + + SelectableChannel channel = (SelectableChannel)rawChannel; + SelectionKey key = channel.keyFor(this.selector); + + if(key == null) + return context.nil; + + Monitor monitor = (Monitor)key.attachment(); + monitor.close(context, runtime.getFalse()); + cancelledKeys.put(channel, key); + + return monitor; + } + + @JRubyMethod(name = "registered?") + public IRubyObject isRegistered(ThreadContext context, IRubyObject io) { + Ruby runtime = context.getRuntime(); + Channel rawChannel = RubyIO.convertToIO(context, io).getChannel(); + + if(!(rawChannel instanceof SelectableChannel)) { + throw runtime.newArgumentError("not a selectable IO object"); + } + + SelectableChannel channel = (SelectableChannel)rawChannel; + SelectionKey key = channel.keyFor(this.selector); + + if(key == null) + return context.nil; + + + if(((Monitor)key.attachment()).isClosed(context) == runtime.getTrue()) { + return runtime.getFalse(); + } else { + return runtime.getTrue(); + } + } + + @JRubyMethod + public synchronized IRubyObject select(ThreadContext context, Block block) { + return select(context, context.nil, block); + } + + @JRubyMethod + public synchronized IRubyObject select(ThreadContext context, IRubyObject timeout, Block block) { + Ruby runtime = context.getRuntime(); + + if(!this.selector.isOpen()) { + throw context.getRuntime().newIOError("selector is closed"); + } + + this.wakeupFired = false; + int ready = doSelect(runtime, context, timeout); + + /* Timeout */ + if(ready <= 0 && !this.wakeupFired) { + return context.nil; + } + + RubyArray array = null; + + if(!block.isGiven()) { + array = runtime.newArray(this.selector.selectedKeys().size()); + } + + Iterator selectedKeys = this.selector.selectedKeys().iterator(); + while(selectedKeys.hasNext()) { + SelectionKey key = selectedKeys.next(); + processKey(key); + + selectedKeys.remove(); + + if(block.isGiven()) { + block.call(context, (IRubyObject)key.attachment()); + } else { + array.add(key.attachment()); + } + } + + if(block.isGiven()) { + return RubyNumeric.int2fix(runtime, ready); + } else { + return array; + } + } + + /* Run the selector */ + private int doSelect(Ruby runtime, ThreadContext context, IRubyObject timeout) { + int result; + + cancelKeys(); + try { + context.getThread().beforeBlockingCall(context); + if(timeout.isNil()) { + result = this.selector.select(); + } else { + double t = RubyNumeric.num2dbl(timeout); + if(t == 0) { + result = this.selector.selectNow(); + } else if(t < 0) { + throw runtime.newArgumentError("time interval must be positive"); + } else { + long timeoutMilliSeconds = (long)(t * 1000); + if(timeoutMilliSeconds == 0) { + result = this.selector.selectNow(); + } else { + result = this.selector.select(timeoutMilliSeconds); + } + } + } + context.getThread().afterBlockingCall(); + return result; + } catch(IOException ie) { + throw runtime.newIOError(ie.getLocalizedMessage()); + } + } + + /* Flush our internal buffer of cancelled keys */ + private void cancelKeys() { + Iterator> cancelledKeys = this.cancelledKeys.entrySet().iterator(); + while(cancelledKeys.hasNext()) { + Map.Entry entry = cancelledKeys.next(); + SelectionKey key = entry.getValue(); + key.cancel(); + cancelledKeys.remove(); + } + } + + // Remove connect interest from connected sockets + // See: http://stackoverflow.com/questions/204186/java-nio-select-returns-without-selected-keys-why + private void processKey(SelectionKey key) { + if(key.isValid() && (key.readyOps() & SelectionKey.OP_CONNECT) != 0) { + int interestOps = key.interestOps(); + + interestOps &= ~SelectionKey.OP_CONNECT; + interestOps |= SelectionKey.OP_WRITE; + + key.interestOps(interestOps); + } + } + + @JRubyMethod + public IRubyObject wakeup(ThreadContext context) { + if(!this.selector.isOpen()) { + throw context.getRuntime().newIOError("selector is closed"); + } + + this.wakeupFired = true; + this.selector.wakeup(); + + return context.nil; + } +} diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/selector.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/selector.c new file mode 100644 index 0000000..662254c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/selector.c @@ -0,0 +1,606 @@ +/* + * Copyright (c) 2011 Tony Arcieri. Distributed under the MIT License. See + * LICENSE.txt for further details. + */ + +#include "nio4r.h" +#ifdef HAVE_RUBYSIG_H +#include "rubysig.h" +#endif + +#ifdef HAVE_UNISTD_H +#include +#else +#include +#endif + +#include +#include + +static VALUE mNIO = Qnil; +static VALUE cNIO_Monitor = Qnil; +static VALUE cNIO_Selector = Qnil; + +/* Allocator/deallocator */ +static VALUE NIO_Selector_allocate(VALUE klass); +static void NIO_Selector_mark(void *data); +static void NIO_Selector_shutdown(struct NIO_Selector *selector); +static void NIO_Selector_free(void *data); +static size_t NIO_Selector_memsize(const void *data); + +/* Class methods */ +static VALUE NIO_Selector_supported_backends(VALUE klass); + +/* Instance methods */ +static VALUE NIO_Selector_initialize(int argc, VALUE *argv, VALUE self); +static VALUE NIO_Selector_backend(VALUE self); +static VALUE NIO_Selector_register(VALUE self, VALUE selectable, VALUE interest); +static VALUE NIO_Selector_deregister(VALUE self, VALUE io); +static VALUE NIO_Selector_is_registered(VALUE self, VALUE io); +static VALUE NIO_Selector_select(int argc, VALUE *argv, VALUE self); +static VALUE NIO_Selector_wakeup(VALUE self); +static VALUE NIO_Selector_close(VALUE self); +static VALUE NIO_Selector_closed(VALUE self); +static VALUE NIO_Selector_is_empty(VALUE self); + +/* Internal functions */ +static VALUE NIO_Selector_synchronize(VALUE self, VALUE (*func)(VALUE arg), VALUE arg); +static VALUE NIO_Selector_unlock(VALUE lock); +static VALUE NIO_Selector_register_synchronized(VALUE arg); +static VALUE NIO_Selector_deregister_synchronized(VALUE arg); +static VALUE NIO_Selector_select_synchronized(VALUE arg); +static VALUE NIO_Selector_close_synchronized(VALUE arg); +static VALUE NIO_Selector_closed_synchronized(VALUE arg); + +static int NIO_Selector_run(struct NIO_Selector *selector, VALUE timeout); +static void NIO_Selector_timeout_callback(struct ev_loop *ev_loop, struct ev_timer *timer, int revents); +static void NIO_Selector_wakeup_callback(struct ev_loop *ev_loop, struct ev_io *io, int revents); + +/* Default number of slots in the buffer for selected monitors */ +#define INITIAL_READY_BUFFER 32 + +/* Ruby 1.8 needs us to busy wait and run the green threads scheduler every 10ms */ +#define BUSYWAIT_INTERVAL 0.01 + +/* Selectors wait for events */ +void Init_NIO_Selector(void) +{ + mNIO = rb_define_module("NIO"); + cNIO_Selector = rb_define_class_under(mNIO, "Selector", rb_cObject); + rb_define_alloc_func(cNIO_Selector, NIO_Selector_allocate); + + rb_define_singleton_method(cNIO_Selector, "backends", NIO_Selector_supported_backends, 0); + rb_define_method(cNIO_Selector, "initialize", NIO_Selector_initialize, -1); + rb_define_method(cNIO_Selector, "backend", NIO_Selector_backend, 0); + rb_define_method(cNIO_Selector, "register", NIO_Selector_register, 2); + rb_define_method(cNIO_Selector, "deregister", NIO_Selector_deregister, 1); + rb_define_method(cNIO_Selector, "registered?", NIO_Selector_is_registered, 1); + rb_define_method(cNIO_Selector, "select", NIO_Selector_select, -1); + rb_define_method(cNIO_Selector, "wakeup", NIO_Selector_wakeup, 0); + rb_define_method(cNIO_Selector, "close", NIO_Selector_close, 0); + rb_define_method(cNIO_Selector, "closed?", NIO_Selector_closed, 0); + rb_define_method(cNIO_Selector, "empty?", NIO_Selector_is_empty, 0); + + cNIO_Monitor = rb_define_class_under(mNIO, "Monitor", rb_cObject); +} + +static const rb_data_type_t NIO_Selector_type = { + "NIO::Selector", + { + NIO_Selector_mark, + NIO_Selector_free, + NIO_Selector_memsize, + }, + 0, + 0, + RUBY_TYPED_WB_PROTECTED // Don't free immediately because of shutdown +}; + +/* Create the libev event loop and incoming event buffer */ +static VALUE NIO_Selector_allocate(VALUE klass) +{ + struct NIO_Selector *selector; + int fds[2]; + + /* Use a pipe to implement the wakeup mechanism. I know libev provides + async watchers that implement this same behavior, but I'm getting + segvs trying to use that between threads, despite claims of thread + safety. Pipes are nice and safe to use between threads. + + Note that Java NIO uses this same mechanism */ + if (pipe(fds) < 0) { + rb_sys_fail("pipe"); + } + + /* Use non-blocking reads/writes during wakeup, in case the buffer is full */ + if (fcntl(fds[0], F_SETFL, O_NONBLOCK) < 0 || fcntl(fds[1], F_SETFL, O_NONBLOCK) < 0) { + rb_sys_fail("fcntl"); + } + + VALUE obj = TypedData_Make_Struct(klass, struct NIO_Selector, &NIO_Selector_type, selector); + /* Defer initializing the loop to #initialize */ + selector->ev_loop = 0; + + ev_init(&selector->timer, NIO_Selector_timeout_callback); + + selector->wakeup_reader = fds[0]; + selector->wakeup_writer = fds[1]; + + ev_io_init(&selector->wakeup, NIO_Selector_wakeup_callback, selector->wakeup_reader, EV_READ); + selector->wakeup.data = (void *)selector; + + selector->closed = selector->selecting = selector->wakeup_fired = selector->ready_count = 0; + RB_OBJ_WRITE(obj, &selector->ready_array, Qnil); + return obj; +} + +struct NIO_Selector *NIO_Selector_unwrap(VALUE self) +{ + struct NIO_Selector *selector; + TypedData_Get_Struct(self, struct NIO_Selector, &NIO_Selector_type, selector); + return selector; +} + +/* NIO selectors store all Ruby objects in instance variables so mark is a stub */ +static void NIO_Selector_mark(void *data) +{ + struct NIO_Selector *selector = (struct NIO_Selector *)data; + if (selector->ready_array != Qnil) { + rb_gc_mark(selector->ready_array); + } +} + +/* Free a Selector's system resources. + Called by both NIO::Selector#close and the finalizer below */ +static void NIO_Selector_shutdown(struct NIO_Selector *selector) +{ + if (selector->closed) { + return; + } + + close(selector->wakeup_reader); + close(selector->wakeup_writer); + + if (selector->ev_loop) { + ev_loop_destroy(selector->ev_loop); + selector->ev_loop = 0; + } + + selector->closed = 1; +} + +/* Ruby finalizer for selector objects */ +static void NIO_Selector_free(void *data) +{ + struct NIO_Selector *selector = (struct NIO_Selector *)data; + NIO_Selector_shutdown(selector); + xfree(selector); +} + +static size_t NIO_Selector_memsize(const void *data) +{ + return sizeof(struct NIO_Selector); +} + +/* Return an array of symbols for supported backends */ +static VALUE NIO_Selector_supported_backends(VALUE klass) +{ + unsigned int backends = ev_supported_backends(); + VALUE result = rb_ary_new(); + + if (backends & EVBACKEND_EPOLL) { + rb_ary_push(result, ID2SYM(rb_intern("epoll"))); + } + + if (backends & EVBACKEND_POLL) { + rb_ary_push(result, ID2SYM(rb_intern("poll"))); + } + + if (backends & EVBACKEND_KQUEUE) { + rb_ary_push(result, ID2SYM(rb_intern("kqueue"))); + } + + if (backends & EVBACKEND_SELECT) { + rb_ary_push(result, ID2SYM(rb_intern("select"))); + } + + if (backends & EVBACKEND_PORT) { + rb_ary_push(result, ID2SYM(rb_intern("port"))); + } + + if (backends & EVBACKEND_LINUXAIO) { + rb_ary_push(result, ID2SYM(rb_intern("linuxaio"))); + } + + if (backends & EVBACKEND_IOURING) { + rb_ary_push(result, ID2SYM(rb_intern("io_uring"))); + } + + return result; +} + +/* Create a new selector. This is more or less the pure Ruby version + translated into an MRI cext */ +static VALUE NIO_Selector_initialize(int argc, VALUE *argv, VALUE self) +{ + ID backend_id; + VALUE backend; + VALUE lock; + + struct NIO_Selector *selector; + unsigned int flags = 0; + + TypedData_Get_Struct(self, struct NIO_Selector, &NIO_Selector_type, selector); + + rb_scan_args(argc, argv, "01", &backend); + + if (backend != Qnil) { + if (!rb_ary_includes(NIO_Selector_supported_backends(CLASS_OF(self)), backend)) { + rb_raise(rb_eArgError, "unsupported backend: %s", RSTRING_PTR(rb_funcall(backend, rb_intern("inspect"), 0))); + } + + backend_id = SYM2ID(backend); + + if (backend_id == rb_intern("epoll")) { + flags = EVBACKEND_EPOLL; + } else if (backend_id == rb_intern("poll")) { + flags = EVBACKEND_POLL; + } else if (backend_id == rb_intern("kqueue")) { + flags = EVBACKEND_KQUEUE; + } else if (backend_id == rb_intern("select")) { + flags = EVBACKEND_SELECT; + } else if (backend_id == rb_intern("port")) { + flags = EVBACKEND_PORT; + } else if (backend_id == rb_intern("linuxaio")) { + flags = EVBACKEND_LINUXAIO; + } else if (backend_id == rb_intern("io_uring")) { + flags = EVBACKEND_IOURING; + } else { + rb_raise(rb_eArgError, "unsupported backend: %s", RSTRING_PTR(rb_funcall(backend, rb_intern("inspect"), 0))); + } + } + + /* Ensure the selector loop has not yet been initialized */ + assert(!selector->ev_loop); + + selector->ev_loop = ev_loop_new(flags); + if (!selector->ev_loop) { + rb_raise(rb_eIOError, "error initializing event loop"); + } + + ev_io_start(selector->ev_loop, &selector->wakeup); + + rb_ivar_set(self, rb_intern("selectables"), rb_hash_new()); + rb_ivar_set(self, rb_intern("lock_holder"), Qnil); + + lock = rb_class_new_instance(0, 0, rb_const_get(rb_cObject, rb_intern("Mutex"))); + rb_ivar_set(self, rb_intern("lock"), lock); + rb_ivar_set(self, rb_intern("lock_holder"), Qnil); + + return Qnil; +} + +static VALUE NIO_Selector_backend(VALUE self) +{ + struct NIO_Selector *selector; + + TypedData_Get_Struct(self, struct NIO_Selector, &NIO_Selector_type, selector); + if (selector->closed) { + rb_raise(rb_eIOError, "selector is closed"); + } + + switch (ev_backend(selector->ev_loop)) { + case EVBACKEND_EPOLL: + return ID2SYM(rb_intern("epoll")); + case EVBACKEND_POLL: + return ID2SYM(rb_intern("poll")); + case EVBACKEND_KQUEUE: + return ID2SYM(rb_intern("kqueue")); + case EVBACKEND_SELECT: + return ID2SYM(rb_intern("select")); + case EVBACKEND_PORT: + return ID2SYM(rb_intern("port")); + case EVBACKEND_LINUXAIO: + return ID2SYM(rb_intern("linuxaio")); + case EVBACKEND_IOURING: + return ID2SYM(rb_intern("io_uring")); + } + + return ID2SYM(rb_intern("unknown")); +} + +/* Synchronize around a reentrant selector lock */ +static VALUE NIO_Selector_synchronize(VALUE self, VALUE (*func)(VALUE arg), VALUE arg) +{ + VALUE current_thread, lock_holder, lock; + + current_thread = rb_thread_current(); + lock_holder = rb_ivar_get(self, rb_intern("lock_holder")); + + if (lock_holder != current_thread) { + lock = rb_ivar_get(self, rb_intern("lock")); + rb_funcall(lock, rb_intern("lock"), 0); + rb_ivar_set(self, rb_intern("lock_holder"), current_thread); + + /* We've acquired the lock, so ensure we unlock it */ + return rb_ensure(func, (VALUE)arg, NIO_Selector_unlock, self); + } else { + /* We already hold the selector lock, so no need to unlock it */ + return func(arg); + } +} + +/* Unlock the selector mutex */ +static VALUE NIO_Selector_unlock(VALUE self) +{ + VALUE lock; + + rb_ivar_set(self, rb_intern("lock_holder"), Qnil); + + lock = rb_ivar_get(self, rb_intern("lock")); + rb_funcall(lock, rb_intern("unlock"), 0); + + return Qnil; +} + +/* Register an IO object with the selector for the given interests */ +static VALUE NIO_Selector_register(VALUE self, VALUE io, VALUE interests) +{ + VALUE args[3] = {self, io, interests}; + return NIO_Selector_synchronize(self, NIO_Selector_register_synchronized, (VALUE)args); +} + +/* Internal implementation of register after acquiring mutex */ +static VALUE NIO_Selector_register_synchronized(VALUE _args) +{ + VALUE self, io, interests, selectables, monitor; + VALUE monitor_args[3]; + struct NIO_Selector *selector; + + VALUE *args = (VALUE *)_args; + self = args[0]; + io = args[1]; + interests = args[2]; + + TypedData_Get_Struct(self, struct NIO_Selector, &NIO_Selector_type, selector); + if (selector->closed) { + rb_raise(rb_eIOError, "selector is closed"); + } + + selectables = rb_ivar_get(self, rb_intern("selectables")); + monitor = rb_hash_lookup(selectables, io); + + if (monitor != Qnil) + rb_raise(rb_eArgError, "this IO is already registered with selector"); + + /* Create a new NIO::Monitor */ + monitor_args[0] = io; + monitor_args[1] = interests; + monitor_args[2] = self; + + monitor = rb_class_new_instance(3, monitor_args, cNIO_Monitor); + rb_hash_aset(selectables, rb_funcall(monitor, rb_intern("io"), 0), monitor); + + return monitor; +} + +/* Deregister an IO object from the selector */ +static VALUE NIO_Selector_deregister(VALUE self, VALUE io) +{ + VALUE args[2] = {self, io}; + return NIO_Selector_synchronize(self, NIO_Selector_deregister_synchronized, (VALUE)args); +} + +/* Internal implementation of register after acquiring mutex */ +static VALUE NIO_Selector_deregister_synchronized(VALUE _args) +{ + VALUE self, io, selectables, monitor; + + VALUE *args = (VALUE *)_args; + self = args[0]; + io = args[1]; + + selectables = rb_ivar_get(self, rb_intern("selectables")); + monitor = rb_hash_delete(selectables, io); + + if (monitor != Qnil) { + rb_funcall(monitor, rb_intern("close"), 1, Qfalse); + } + + return monitor; +} + +/* Is the given IO object registered with the selector */ +static VALUE NIO_Selector_is_registered(VALUE self, VALUE io) +{ + VALUE selectables = rb_ivar_get(self, rb_intern("selectables")); + + /* Perhaps this should be holding the mutex? */ + return rb_funcall(selectables, rb_intern("has_key?"), 1, io); +} + +/* Select from all registered IO objects */ +static VALUE NIO_Selector_select(int argc, VALUE *argv, VALUE self) +{ + VALUE timeout; + + rb_scan_args(argc, argv, "01", &timeout); + + if (timeout != Qnil && NUM2DBL(timeout) < 0) { + rb_raise(rb_eArgError, "time interval must be positive"); + } + + VALUE args[2] = {self, timeout}; + return NIO_Selector_synchronize(self, NIO_Selector_select_synchronized, (VALUE)args); +} + +/* Internal implementation of select with the selector lock held */ +static VALUE NIO_Selector_select_synchronized(VALUE _args) +{ + int ready; + VALUE ready_array; + struct NIO_Selector *selector; + + VALUE *args = (VALUE *)_args; + + TypedData_Get_Struct(args[0], struct NIO_Selector, &NIO_Selector_type, selector); + + if (selector->closed) { + rb_raise(rb_eIOError, "selector is closed"); + } + + if (!rb_block_given_p()) { + RB_OBJ_WRITE(args[0], &selector->ready_array, rb_ary_new()); + } + + ready = NIO_Selector_run(selector, args[1]); + + /* Timeout */ + if (ready < 0) { + if (!rb_block_given_p()) { + RB_OBJ_WRITE(args[0], &selector->ready_array, Qnil); + } + + return Qnil; + } + + if (rb_block_given_p()) { + return INT2NUM(ready); + } else { + ready_array = selector->ready_array; + RB_OBJ_WRITE(args[0], &selector->ready_array, Qnil); + return ready_array; + } +} + +static int NIO_Selector_run(struct NIO_Selector *selector, VALUE timeout) +{ + int ev_run_flags = EVRUN_ONCE; + int result; + double timeout_val; + + selector->selecting = 1; + selector->wakeup_fired = 0; + + if (timeout == Qnil) { + /* Don't fire a wakeup timeout if we weren't passed one */ + ev_timer_stop(selector->ev_loop, &selector->timer); + } else { + timeout_val = NUM2DBL(timeout); + if (timeout_val == 0) { + /* If we've been given an explicit timeout of 0, perform a non-blocking + select operation */ + ev_run_flags = EVRUN_NOWAIT; + } else { + selector->timer.repeat = timeout_val; + ev_timer_again(selector->ev_loop, &selector->timer); + } + } + + /* libev is patched to release the GIL when it makes its system call */ + ev_run(selector->ev_loop, ev_run_flags); + + result = selector->ready_count; + selector->selecting = selector->ready_count = 0; + + if (result > 0 || selector->wakeup_fired) { + selector->wakeup_fired = 0; + return result; + } else { + return -1; + } +} + +/* Wake the selector up from another thread */ +static VALUE NIO_Selector_wakeup(VALUE self) +{ + struct NIO_Selector *selector; + TypedData_Get_Struct(self, struct NIO_Selector, &NIO_Selector_type, selector); + + if (selector->closed) { + rb_raise(rb_eIOError, "selector is closed"); + } + + selector->wakeup_fired = 1; + write(selector->wakeup_writer, "\0", 1); + + return Qnil; +} + +/* Close the selector and free system resources */ +static VALUE NIO_Selector_close(VALUE self) +{ + return NIO_Selector_synchronize(self, NIO_Selector_close_synchronized, self); +} + +static VALUE NIO_Selector_close_synchronized(VALUE self) +{ + struct NIO_Selector *selector; + + TypedData_Get_Struct(self, struct NIO_Selector, &NIO_Selector_type, selector); + + NIO_Selector_shutdown(selector); + + return Qnil; +} + +/* Is the selector closed? */ +static VALUE NIO_Selector_closed(VALUE self) +{ + return NIO_Selector_synchronize(self, NIO_Selector_closed_synchronized, self); +} + +static VALUE NIO_Selector_closed_synchronized(VALUE self) +{ + struct NIO_Selector *selector; + + TypedData_Get_Struct(self, struct NIO_Selector, &NIO_Selector_type, selector); + + return selector->closed ? Qtrue : Qfalse; +} + +/* True if there are monitors on the loop */ +static VALUE NIO_Selector_is_empty(VALUE self) +{ + VALUE selectables = rb_ivar_get(self, rb_intern("selectables")); + + return rb_funcall(selectables, rb_intern("empty?"), 0) == Qtrue ? Qtrue : Qfalse; +} + +/* Called whenever a timeout fires on the event loop */ +static void NIO_Selector_timeout_callback(struct ev_loop *ev_loop, struct ev_timer *timer, int revents) +{ +} + +/* Called whenever a wakeup request is sent to a selector */ +static void NIO_Selector_wakeup_callback(struct ev_loop *ev_loop, struct ev_io *io, int revents) +{ + char buffer[128]; + struct NIO_Selector *selector = (struct NIO_Selector *)io->data; + selector->selecting = 0; + + /* Drain the wakeup pipe, giving us level-triggered behavior */ + while (read(selector->wakeup_reader, buffer, 128) > 0) + ; +} + +/* libev callback fired whenever a monitor gets an event */ +void NIO_Selector_monitor_callback(struct ev_loop *ev_loop, struct ev_io *io, int revents) +{ + struct NIO_Monitor *monitor_data = (struct NIO_Monitor *)io->data; + struct NIO_Selector *selector = monitor_data->selector; + VALUE monitor = monitor_data->self; + + assert(monitor_data->interests != 0); + + assert(selector != 0); + selector->ready_count++; + monitor_data->revents = revents; + + if (rb_block_given_p()) { + rb_yield(monitor); + } else { + assert(selector->ready_array != Qnil); + rb_ary_push(selector->ready_array, monitor); + } +} diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio.rb b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio.rb new file mode 100644 index 0000000..bca3ee6 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true + +# Released under the MIT License. +# Copyright, 2011-2017, by Tony Arcieri. +# Copyright, 2013, by Stephen von Takach. +# Copyright, 2013, by Per Lundberg. +# Copyright, 2014, by Marek Kowalcze. +# Copyright, 2016, by Upekshe Jayasekera. +# Copyright, 2019-2023, by Samuel Williams. +# Copyright, 2021, by Jun Jiang. + +require "socket" +require "nio/version" + +# New I/O for Ruby +module NIO + # NIO implementation, one of the following (as a string): + # * select: in pure Ruby using Kernel.select + # * libev: as a C extension using libev + # * java: using Java NIO + def self.engine + ENGINE + end + + def self.pure?(env = ENV) + # The user has explicitly opted in to non-native implementation: + if env["NIO4R_PURE"] == "true" + return true + end + + # Native Ruby on Windows is not supported: + if (Gem.win_platform? && !defined?(JRUBY_VERSION)) + return true + end + + # M1 native extension is crashing on M1 (arm64): + # if RUBY_PLATFORM =~ /darwin/ && RUBY_PLATFORM =~ /arm64/ + # return true + # end + + return false + end +end + +if NIO.pure? + require "nio/monitor" + require "nio/selector" + require "nio/bytebuffer" + NIO::ENGINE = "ruby" +else + require "nio4r_ext" + + if defined?(JRUBY_VERSION) + require "java" + require "jruby" + org.nio4r.Nio4r.new.load(JRuby.runtime, false) + NIO::ENGINE = "java" + else + NIO::ENGINE = "libev" + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/bytebuffer.rb b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/bytebuffer.rb new file mode 100644 index 0000000..7171120 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/bytebuffer.rb @@ -0,0 +1,235 @@ +# frozen_string_literal: true + +# Released under the MIT License. +# Copyright, 2016, by Upekshe Jayasekera. +# Copyright, 2016-2017, by Tony Arcieri. +# Copyright, 2020, by Thomas Dziedzic. +# Copyright, 2023, by Samuel Williams. + +module NIO + # Efficient byte buffers for performant I/O operations + class ByteBuffer + include Enumerable + + attr_reader :position, :limit, :capacity + + # Insufficient capacity in buffer + OverflowError = Class.new(IOError) + + # Not enough data remaining in buffer + UnderflowError = Class.new(IOError) + + # Mark has not been set + MarkUnsetError = Class.new(IOError) + + # Create a new ByteBuffer, either with a specified capacity or populating + # it from a given string + # + # @param capacity [Integer] size of buffer in bytes + # + # @return [NIO::ByteBuffer] + def initialize(capacity) + raise TypeError, "no implicit conversion of #{capacity.class} to Integer" unless capacity.is_a?(Integer) + + @capacity = capacity + clear + end + + # Clear the buffer, resetting it to the default state + def clear + @buffer = ("\0" * @capacity).force_encoding(Encoding::BINARY) + @position = 0 + @limit = @capacity + @mark = nil + + self + end + + # Set the position to the given value. New position must be less than limit. + # Preserves mark if it's less than the new position, otherwise clears it. + # + # @param new_position [Integer] position in the buffer + # + # @raise [ArgumentError] new position was invalid + def position=(new_position) + raise ArgumentError, "negative position given" if new_position < 0 + raise ArgumentError, "specified position exceeds capacity" if new_position > @capacity + + @mark = nil if @mark && @mark > new_position + @position = new_position + end + + # Set the limit to the given value. New limit must be less than capacity. + # Preserves limit and mark if they're less than the new limit, otherwise + # sets position to the new limit and clears the mark. + # + # @param new_limit [Integer] position in the buffer + # + # @raise [ArgumentError] new limit was invalid + def limit=(new_limit) + raise ArgumentError, "negative limit given" if new_limit < 0 + raise ArgumentError, "specified limit exceeds capacity" if new_limit > @capacity + + @position = new_limit if @position > new_limit + @mark = nil if @mark && @mark > new_limit + @limit = new_limit + end + + # Number of bytes remaining in the buffer before the limit + # + # @return [Integer] number of bytes remaining + def remaining + @limit - @position + end + + # Does the ByteBuffer have any space remaining? + # + # @return [true, false] + def full? + remaining.zero? + end + + # Obtain the requested number of bytes from the buffer, advancing the position. + # If no length is given, all remaining bytes are consumed. + # + # @raise [NIO::ByteBuffer::UnderflowError] not enough data remaining in buffer + # + # @return [String] bytes read from buffer + def get(length = remaining) + raise ArgumentError, "negative length given" if length < 0 + raise UnderflowError, "not enough data in buffer" if length > @limit - @position + + result = @buffer[@position...length] + @position += length + result + end + + # Obtain the byte at a given index in the buffer as an Integer + # + # @raise [ArgumentError] index is invalid (either negative or larger than limit) + # + # @return [Integer] byte at the given index + def [](index) + raise ArgumentError, "negative index given" if index < 0 + raise ArgumentError, "specified index exceeds limit" if index >= @limit + + @buffer.bytes[index] + end + + # Add a String to the buffer + # + # @param str [#to_str] data to add to the buffer + # + # @raise [TypeError] given a non-string type + # @raise [NIO::ByteBuffer::OverflowError] buffer is full + # + # @return [self] + def put(str) + raise TypeError, "expected String, got #{str.class}" unless str.respond_to?(:to_str) + + str = str.to_str + + raise OverflowError, "buffer is full" if str.length > @limit - @position + + @buffer[@position...str.length] = str + @position += str.length + self + end + alias << put + + # Perform a non-blocking read from the given IO object into the buffer + # Reads as much data as is immediately available and returns + # + # @param [IO] Ruby IO object to read from + # + # @return [Integer] number of bytes read (0 if none were available) + def read_from(io) + nbytes = @limit - @position + raise OverflowError, "buffer is full" if nbytes.zero? + + bytes_read = IO.try_convert(io).read_nonblock(nbytes, exception: false) + return 0 if bytes_read == :wait_readable + + self << bytes_read + bytes_read.length + end + + # Perform a non-blocking write of the buffer's contents to the given I/O object + # Writes as much data as is immediately possible and returns + # + # @param [IO] Ruby IO object to write to + # + # @return [Integer] number of bytes written (0 if the write would block) + def write_to(io) + nbytes = @limit - @position + raise UnderflowError, "no data remaining in buffer" if nbytes.zero? + + bytes_written = IO.try_convert(io).write_nonblock(@buffer[@position...@limit], exception: false) + return 0 if bytes_written == :wait_writable + + @position += bytes_written + bytes_written + end + + # Set the buffer's current position as the limit and set the position to 0 + def flip + @limit = @position + @position = 0 + @mark = nil + self + end + + # Set the buffer's current position to 0, leaving the limit unchanged + def rewind + @position = 0 + @mark = nil + self + end + + # Mark a position to return to using the `#reset` method + def mark + @mark = @position + self + end + + # Reset position to the previously marked location + # + # @raise [NIO::ByteBuffer::MarkUnsetError] mark has not been set (call `#mark` first) + def reset + raise MarkUnsetError, "mark has not been set" unless @mark + + @position = @mark + self + end + + # Move data between the position and limit to the beginning of the buffer + # Sets the position to the end of the moved data, and the limit to the capacity + def compact + @buffer[0...(@limit - @position)] = @buffer[@position...@limit] + @position = @limit - @position + @limit = capacity + self + end + + # Iterate over the bytes in the buffer (as Integers) + # + # @return [self] + def each(&block) + @buffer[0...@limit].each_byte(&block) + end + + # Inspect the state of the buffer + # + # @return [String] string describing the state of the buffer + def inspect + format( + "#<%s:0x%x @position=%d @limit=%d @capacity=%d>", + self.class, + object_id << 1, + @position, + @limit, + @capacity + ) + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/monitor.rb b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/monitor.rb new file mode 100644 index 0000000..c7bd26e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/monitor.rb @@ -0,0 +1,124 @@ +# frozen_string_literal: true + +# Released under the MIT License. +# Copyright, 2011-2018, by Tony Arcieri. +# Copyright, 2015, by Upekshe Jayasekera. +# Copyright, 2015, by Vladimir Kochnev. +# Copyright, 2018-2023, by Samuel Williams. +# Copyright, 2019-2020, by Gregory Longtin. + +module NIO + # Monitors watch IO objects for specific events + class Monitor + attr_reader :io, :interests, :selector + attr_accessor :value, :readiness + + # :nodoc: + def initialize(io, interests, selector) + unless defined?(::OpenSSL) && io.is_a?(::OpenSSL::SSL::SSLSocket) + unless io.is_a?(IO) + if IO.respond_to? :try_convert + io = IO.try_convert(io) + elsif io.respond_to? :to_io + io = io.to_io + end + + raise TypeError, "can't convert #{io.class} into IO" unless io.is_a? IO + end + end + + @io = io + @interests = interests + @selector = selector + @closed = false + end + + # Replace the existing interest set with a new one + # + # @param interests [:r, :w, :rw, nil] I/O readiness we're interested in (read/write/readwrite) + # + # @return [Symbol] new interests + def interests=(interests) + raise EOFError, "monitor is closed" if closed? + raise ArgumentError, "bad interests: #{interests}" unless [:r, :w, :rw, nil].include?(interests) + + @interests = interests + end + + # Add new interests to the existing interest set + # + # @param interests [:r, :w, :rw] new I/O interests (read/write/readwrite) + # + # @return [self] + def add_interest(interest) + case interest + when :r + case @interests + when :r then @interests = :r + when :w then @interests = :rw + when :rw then @interests = :rw + when nil then @interests = :r + end + when :w + case @interests + when :r then @interests = :rw + when :w then @interests = :w + when :rw then @interests = :rw + when nil then @interests = :w + end + when :rw + @interests = :rw + else raise ArgumentError, "bad interests: #{interest}" + end + end + + # Remove interests from the existing interest set + # + # @param interests [:r, :w, :rw] I/O interests to remove (read/write/readwrite) + # + # @return [self] + def remove_interest(interest) + case interest + when :r + case @interests + when :r then @interests = nil + when :w then @interests = :w + when :rw then @interests = :w + when nil then @interests = nil + end + when :w + case @interests + when :r then @interests = :r + when :w then @interests = nil + when :rw then @interests = :r + when nil then @interests = nil + end + when :rw + @interests = nil + else raise ArgumentError, "bad interests: #{interest}" + end + end + + # Is the IO object readable? + def readable? + readiness == :r || readiness == :rw + end + + # Is the IO object writable? + def writable? + readiness == :w || readiness == :rw + end + alias writeable? writable? + + # Is this monitor closed? + def closed? + @closed + end + + # Deactivate this monitor + def close(deregister = true) + @closed = true + @selector.deregister(io) if deregister + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/selector.rb b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/selector.rb new file mode 100644 index 0000000..b422e99 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/selector.rb @@ -0,0 +1,188 @@ +# frozen_string_literal: true + +# Released under the MIT License. +# Copyright, 2011-2017, by Tony Arcieri. +# Copyright, 2012, by Logan Bowers. +# Copyright, 2013, by Sadayuki Furuhashi. +# Copyright, 2013, by Stephen von Takach. +# Copyright, 2013, by Tim Carey-Smith. +# Copyright, 2013, by Ravil Bayramgalin. +# Copyright, 2014, by Sergey Avseyev. +# Copyright, 2014, by John Thornton. +# Copyright, 2015, by Vladimir Kochnev. +# Copyright, 2015, by Upekshe Jayasekera. +# Copyright, 2019-2020, by Gregory Longtin. +# Copyright, 2020-2021, by Joao Fernandes. +# Copyright, 2023, by Samuel Williams. + +require "set" + +module NIO + # Selectors monitor IO objects for events of interest + class Selector + # Return supported backends as symbols + # + # See `#backend` method definition for all possible backends + def self.backends + [:ruby] + end + + # Create a new NIO::Selector + def initialize(backend = :ruby) + raise ArgumentError, "unsupported backend: #{backend}" unless [:ruby, nil].include?(backend) + + @selectables = {} + @lock = Mutex.new + + # Other threads can wake up a selector + @wakeup, @waker = IO.pipe + @closed = false + end + + # Return a symbol representing the backend I/O multiplexing mechanism used. + # Supported backends are: + # * :ruby - pure Ruby (i.e IO.select) + # * :java - Java NIO on JRuby + # * :epoll - libev w\ Linux epoll + # * :poll - libev w\ POSIX poll + # * :kqueue - libev w\ BSD kqueue + # * :select - libev w\ SysV select + # * :port - libev w\ I/O completion ports + # * :linuxaio - libev w\ Linux AIO io_submit (experimental) + # * :io_uring - libev w\ Linux io_uring (experimental) + # * :unknown - libev w\ unknown backend + def backend + :ruby + end + + # Register interest in an IO object with the selector for the given types + # of events. Valid event types for interest are: + # * :r - is the IO readable? + # * :w - is the IO writeable? + # * :rw - is the IO either readable or writeable? + def register(io, interest) + unless defined?(::OpenSSL) && io.is_a?(::OpenSSL::SSL::SSLSocket) + io = IO.try_convert(io) + end + + @lock.synchronize do + raise IOError, "selector is closed" if closed? + + monitor = @selectables[io] + raise ArgumentError, "already registered as #{monitor.interests.inspect}" if monitor + + monitor = Monitor.new(io, interest, self) + @selectables[monitor.io] = monitor + + monitor + end + end + + # Deregister the given IO object from the selector + def deregister(io) + @lock.synchronize do + monitor = @selectables.delete IO.try_convert(io) + monitor.close(false) if monitor && !monitor.closed? + monitor + end + end + + # Is the given IO object registered with the selector? + def registered?(io) + @lock.synchronize { @selectables.key? io } + end + + # Select which monitors are ready + def select(timeout = nil) + selected_monitors = Set.new + + @lock.synchronize do + readers = [@wakeup] + writers = [] + + @selectables.each do |io, monitor| + readers << io if monitor.interests == :r || monitor.interests == :rw + writers << io if monitor.interests == :w || monitor.interests == :rw + monitor.readiness = nil + end + + ready_readers, ready_writers = Kernel.select(readers, writers, [], timeout) + return unless ready_readers # timeout + + ready_readers.each do |io| + if io == @wakeup + # Clear all wakeup signals we've received by reading them + # Wakeups should have level triggered behavior + @wakeup.read(@wakeup.stat.size) + else + monitor = @selectables[io] + monitor.readiness = :r + selected_monitors << monitor + end + end + + ready_writers.each do |io| + monitor = @selectables[io] + monitor.readiness = monitor.readiness == :r ? :rw : :w + selected_monitors << monitor + end + end + + if block_given? + selected_monitors.each { |m| yield m } + selected_monitors.size + else + selected_monitors.to_a + end + end + + # Wake up a thread that's in the middle of selecting on this selector, if + # any such thread exists. + # + # Invoking this method more than once between two successive select calls + # has the same effect as invoking it just once. In other words, it provides + # level-triggered behavior. + def wakeup + # Send the selector a signal in the form of writing data to a pipe + begin + @waker.write_nonblock "\0" + rescue IO::WaitWritable + # This indicates the wakeup pipe is full, which means the other thread + # has already received many wakeup calls, but not processed them yet. + # The other thread will completely drain this pipe when it wakes up, + # so it's ok to ignore this exception if it occurs: we know the other + # thread has already been signaled to wake up + end + + nil + end + + # Close this selector and free its resources + def close + @lock.synchronize do + return if @closed + + begin + @wakeup.close + rescue IOError + end + + begin + @waker.close + rescue IOError + end + + @closed = true + end + end + + # Is this selector closed? + def closed? + @closed + end + + def empty? + @selectables.empty? + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/version.rb b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/version.rb new file mode 100644 index 0000000..3b043fd --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/version.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +# Released under the MIT License. +# Copyright, 2011-2018, by Tony Arcieri. +# Copyright, 2018-2024, by Samuel Williams. +# Copyright, 2023, by Tsimnuj Hawj. + +module NIO + VERSION = "2.7.4" +end diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio4r.rb b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio4r.rb new file mode 100644 index 0000000..d551e82 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio4r.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +# Released under the MIT License. +# Copyright, 2023, by Phillip Aldridge. +# Copyright, 2023, by Samuel Williams. + +require_relative "nio" diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio4r_ext.so b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio4r_ext.so new file mode 100755 index 0000000000000000000000000000000000000000..a185a06a0d6962384c371fe464363cf07fd6b7ab GIT binary patch literal 345376 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

r^LDBlal;JIAjZD)I5AvJ}bW6yy9#tvJngW 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 'foo' + +# Emit YAML from a Ruby object +Psych.dump("foo") # => "--- foo\n...\n" +``` + +## Dependencies + +* libyaml + +## Installation + +Psych has been included with MRI since 1.9.2, and is the default YAML parser +in 1.9.3. + +If you want a newer gem release of Psych, you can use RubyGems: + +```bash +gem install psych +``` + +Psych supported the static build with specific version of libyaml sources. You can build psych with libyaml-0.2.5 like this. + +```bash +gem install psych -- --with-libyaml-source-dir=/path/to/libyaml-0.2.5 +``` + +In order to use the gem release in your app, and not the stdlib version, +you'll need the following: + +```ruby +gem 'psych' +require 'psych' +``` + +Or if you use Bundler add this to your `Gemfile`: + +```ruby +gem 'psych' +``` + +JRuby ships with a pure Java implementation of Psych. + +## License + +Copyright 2009 Aaron Patterson, et al. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the 'Software'), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/Makefile b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/Makefile new file mode 100644 index 0000000..3a55652 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/Makefile @@ -0,0 +1,291 @@ + +SHELL = /bin/sh + +# V=0 quiet, V=1 verbose. other values don't work. +V = 0 +V0 = $(V:0=) +Q1 = $(V:1=) +Q = $(Q1:0=@) +ECHO1 = $(V:1=@ :) +ECHO = $(ECHO1:0=@ echo) +NULLCMD = : + +#### Start of system configuration section. #### + +srcdir = . +topdir = /usr/include/ruby-3.2.0 +hdrdir = $(topdir) +arch_hdrdir = /usr/include/x86_64-linux-gnu/ruby-3.2.0 +PATH_SEPARATOR = : +VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby +prefix = $(DESTDIR)/usr +rubysitearchprefix = $(sitearchlibdir)/$(RUBY_BASE_NAME) +rubyarchprefix = $(archlibdir)/$(RUBY_BASE_NAME) +rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) +exec_prefix = $(prefix) +vendorarchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/vendor_ruby +sitearchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/site_ruby +rubyarchhdrdir = $(archincludedir)/$(RUBY_VERSION_NAME) +vendorhdrdir = $(rubyhdrdir)/vendor_ruby +sitehdrdir = $(rubyhdrdir)/site_ruby +rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) +vendorarchdir = $(rubysitearchprefix)/vendor_ruby/$(ruby_version) +vendorlibdir = $(vendordir)/$(ruby_version) +vendordir = $(rubylibprefix)/vendor_ruby +sitearchdir = $(DESTDIR)/usr/local/lib/x86_64-linux-gnu/site_ruby +sitelibdir = $(sitedir)/$(ruby_version) +sitedir = $(DESTDIR)/usr/local/lib/site_ruby +rubyarchdir = $(rubyarchprefix)/$(ruby_version) +rubylibdir = $(rubylibprefix)/$(ruby_version) +sitearchincludedir = $(includedir)/$(sitearch) +archincludedir = $(includedir)/$(arch) +sitearchlibdir = $(libdir)/$(sitearch) +archlibdir = $(libdir)/$(arch) +ridir = $(datarootdir)/$(RI_BASE_NAME) +mandir = $(datarootdir)/man +localedir = $(datarootdir)/locale +libdir = $(exec_prefix)/lib +psdir = $(docdir) +pdfdir = $(docdir) +dvidir = $(docdir) +htmldir = $(docdir) +infodir = $(datarootdir)/info +docdir = $(datarootdir)/doc/$(PACKAGE) +oldincludedir = $(DESTDIR)/usr/include +includedir = $(prefix)/include +runstatedir = $(DESTDIR)/var/run +localstatedir = $(DESTDIR)/var +sharedstatedir = $(prefix)/com +sysconfdir = $(DESTDIR)/etc +datadir = $(datarootdir) +datarootdir = $(prefix)/share +libexecdir = $(exec_prefix)/libexec +sbindir = $(exec_prefix)/sbin +bindir = $(exec_prefix)/bin +archdir = $(rubyarchdir) + + +CC_WRAPPER = +CC = x86_64-linux-gnu-gcc +CXX = x86_64-linux-gnu-g++ +LIBRUBY = $(LIBRUBY_SO) +LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a +LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) +LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static $(MAINLIBS) +empty = +OUTFLAG = -o $(empty) +COUTFLAG = -o $(empty) +CSRCFLAG = $(empty) + +RUBY_EXTCONF_H = +cflags = $(optflags) $(debugflags) $(warnflags) +cxxflags = +optflags = -O3 -fno-fast-math +debugflags = -ggdb3 +warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdiv-by-zero -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wold-style-definition -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef +cppflags = +CCDLFLAGS = -fPIC +CFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC $(ARCH_FLAG) +INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) +DEFS = +CPPFLAGS = -Wdate-time -D_FORTIFY_SOURCE=3 $(DEFS) $(cppflags) +CXXFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 $(ARCH_FLAG) +ldflags = -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed +dldflags = -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now +ARCH_FLAG = +DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) +LDSHARED = $(CC) -shared +LDSHAREDXX = $(CXX) -shared +AR = x86_64-linux-gnu-gcc-ar +EXEEXT = + +RUBY_INSTALL_NAME = $(RUBY_BASE_NAME)3.2 +RUBY_SO_NAME = ruby-3.2 +RUBYW_INSTALL_NAME = +RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) +RUBYW_BASE_NAME = rubyw +RUBY_BASE_NAME = ruby + +arch = x86_64-linux-gnu +sitearch = $(arch) +ruby_version = 3.2.0 +ruby = $(bindir)/$(RUBY_BASE_NAME)3.2 +RUBY = $(ruby) +BUILTRUBY = $(bindir)/$(RUBY_BASE_NAME)3.2 +ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h + +RM = rm -f +RM_RF = rm -fr +RMDIRS = rmdir --ignore-fail-on-non-empty -p +MAKEDIRS = /bin/mkdir -p +INSTALL = /usr/bin/install -c +INSTALL_PROG = $(INSTALL) -m 0755 +INSTALL_DATA = $(INSTALL) -m 644 +COPY = cp +TOUCH = exit > + +#### End of system configuration section. #### + +preload = +libpath = . $(archlibdir) +LIBPATH = -L. -L$(archlibdir) +DEFFILE = + +CLEANFILES = mkmf.log +DISTCLEANFILES = +DISTCLEANDIRS = + +extout = +extout_prefix = +target_prefix = +LOCAL_LIBS = +LIBS = $(LIBRUBYARG_SHARED) -lyaml -lyaml -lm -lpthread -lc +ORIG_SRCS = psych.c psych_emitter.c psych_parser.c psych_to_ruby.c psych_yaml_tree.c +SRCS = $(ORIG_SRCS) +OBJS = psych.o psych_emitter.o psych_parser.o psych_to_ruby.o psych_yaml_tree.o +HDRS = $(srcdir)/psych.h $(srcdir)/psych_emitter.h $(srcdir)/psych_parser.h $(srcdir)/psych_to_ruby.h $(srcdir)/psych_yaml_tree.h +LOCAL_HDRS = +TARGET = psych +TARGET_NAME = psych +TARGET_ENTRY = Init_$(TARGET_NAME) +DLLIB = $(TARGET).so +EXTSTATIC = +STATIC_LIB = + +TIMESTAMP_DIR = . +BINDIR = $(bindir) +RUBYCOMMONDIR = $(sitedir)$(target_prefix) +RUBYLIBDIR = $(sitelibdir)$(target_prefix) +RUBYARCHDIR = $(sitearchdir)$(target_prefix) +HDRDIR = $(sitehdrdir)$(target_prefix) +ARCHHDRDIR = $(sitearchhdrdir)$(target_prefix) +TARGET_SO_DIR = +TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) +CLEANLIBS = $(TARGET_SO) false +CLEANOBJS = $(OBJS) *.bak +TARGET_SO_DIR_TIMESTAMP = $(TIMESTAMP_DIR)/.sitearchdir.time +LIBYAML = + +LIBYAML_OBJDIR = libyaml/src +OBJEXT = o +RANLIB = x86_64-linux-gnu-gcc-ranlib + +all: $(DLLIB) +static: $(STATIC_LIB) +.PHONY: all install static install-so install-rb +.PHONY: clean clean-so clean-static clean-rb + +clean-static:: +clean-rb-default:: +clean-rb:: +clean-so:: +clean: clean-so clean-static clean-rb-default clean-rb + -$(Q)$(RM_RF) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time + +distclean-rb-default:: +distclean-rb:: +distclean-so:: +distclean-static:: +distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb + -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log + -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) + -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true + +realclean: distclean +install: install-so install-rb + +install-so: $(DLLIB) $(TARGET_SO_DIR_TIMESTAMP) + $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) +clean-static:: + -$(Q)$(RM) $(STATIC_LIB) +install-rb: pre-install-rb do-install-rb install-rb-default +install-rb-default: pre-install-rb-default do-install-rb-default +pre-install-rb: Makefile +pre-install-rb-default: Makefile +do-install-rb: +do-install-rb-default: +pre-install-rb-default: + @$(NULLCMD) +$(TARGET_SO_DIR_TIMESTAMP): + $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) + $(Q) $(TOUCH) $@ + +site-install: site-install-so site-install-rb +site-install-so: install-so +site-install-rb: install-rb + +.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S + +.cc.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cc.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.mm.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.mm.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cxx.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cxx.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cpp.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cpp.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.c.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.c.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.m.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.m.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +$(TARGET_SO): $(OBJS) Makefile + $(ECHO) linking shared-object $(DLLIB) + -$(Q)$(RM) $(@) + $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) + + + +### +$(TARGET_SO): $(LIBYAML) + +libyaml $(LIBYAML): + cd libyaml && $(MAKE) + $(AR) $(ARFLAGS) $(LIBYAML) $(LIBYAML_OBJDIR)/*.$(OBJEXT) + $(RANLIB) $(LIBYAML) + +clean-so:: + -cd libyaml && $(MAKE) clean + +distclean-so:: + -cd libyaml && $(MAKE) distclean + -$(Q)$(RMDIRS) libyaml/* libyaml + +$(OBJS): $(HDRS) $(ruby_headers) \ + $(hdrdir)/ruby/encoding.h \ + $(hdrdir)/ruby/oniguruma.h diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/depend b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/depend new file mode 100644 index 0000000..d0cb1c2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/depend @@ -0,0 +1,17 @@ +$(TARGET_SO): $(LIBYAML) + +libyaml $(LIBYAML): + cd libyaml && $(MAKE) + $(AR) $(ARFLAGS) $(LIBYAML) $(LIBYAML_OBJDIR)/*.$(OBJEXT) + $(RANLIB) $(LIBYAML) + +clean-so:: + -cd libyaml && $(MAKE) clean + +distclean-so:: + -cd libyaml && $(MAKE) distclean + -$(Q)$(RMDIRS) libyaml/* libyaml + +$(OBJS): $(HDRS) $(ruby_headers) \ + $(hdrdir)/ruby/encoding.h \ + $(hdrdir)/ruby/oniguruma.h diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/extconf.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/extconf.rb new file mode 100644 index 0000000..e7dd0bb --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/extconf.rb @@ -0,0 +1,53 @@ +# -*- coding: us-ascii -*- +# frozen_string_literal: true +require 'mkmf' + +if $mswin or $mingw or $cygwin + $CPPFLAGS << " -DYAML_DECLARE_STATIC" +end + +yaml_source = with_config("libyaml-source-dir") +if yaml_source + yaml_source = yaml_source.gsub(/\$\((\w+)\)|\$\{(\w+)\}/) {ENV[$1||$2]} + yaml_source = yaml_source.chomp("/") + yaml_configure = "#{File.expand_path(yaml_source)}/configure" + unless File.exist?(yaml_configure) + raise "Configure script not found in #{yaml_source.quote}" + end + + puts("Configuring libyaml source in #{yaml_source.quote}") + yaml = "libyaml" + Dir.mkdir(yaml) unless File.directory?(yaml) + shared = $enable_shared || !$static + args = [ + yaml_configure, + "--enable-#{shared ? 'shared' : 'static'}", + "--host=#{RbConfig::CONFIG['host'].sub(/-unknown-/, '-').sub(/arm64/, 'arm')}", + "CC=#{RbConfig::CONFIG['CC']}", + *(["CFLAGS=-w"] if RbConfig::CONFIG["GCC"] == "yes"), + ] + puts(args.quote.join(' ')) + unless system(*args, chdir: yaml) + raise "failed to configure libyaml" + end + inc = yaml_source.start_with?("#$srcdir/") ? "$(srcdir)#{yaml_source[$srcdir.size..-1]}" : yaml_source + $INCFLAGS << " -I#{yaml}/include -I#{inc}/include" + puts("INCFLAGS=#$INCFLAGS") + libyaml = "libyaml.#$LIBEXT" + $cleanfiles << libyaml + $LOCAL_LIBS.prepend("$(LIBYAML) ") +else # default to pre-installed libyaml + pkg_config('yaml-0.1') + dir_config('libyaml') + find_header('yaml.h') or abort "yaml.h not found" + find_library('yaml', 'yaml_get_version') or abort "libyaml not found" +end + +create_makefile 'psych' do |mk| + mk << "LIBYAML = #{libyaml}".strip << "\n" + mk << "LIBYAML_OBJDIR = libyaml/src#{shared ? '/.libs' : ''}\n" + mk << "OBJEXT = #$OBJEXT" + mk << "RANLIB = #{config_string('RANLIB') || config_string('NULLCMD')}\n" +end + +# :startdoc: diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych.c b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych.c new file mode 100644 index 0000000..afbd7a3 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych.c @@ -0,0 +1,36 @@ +#include + +/* call-seq: Psych.libyaml_version + * + * Returns the version of libyaml being used + */ +static VALUE libyaml_version(VALUE module) +{ + int major, minor, patch; + VALUE list[3]; + + yaml_get_version(&major, &minor, &patch); + + list[0] = INT2NUM(major); + list[1] = INT2NUM(minor); + list[2] = INT2NUM(patch); + + return rb_ary_new4((long)3, list); +} + +VALUE mPsych; + +void Init_psych(void) +{ + #ifdef HAVE_RB_EXT_RACTOR_SAFE + RB_EXT_RACTOR_SAFE(true); + #endif + mPsych = rb_define_module("Psych"); + + rb_define_singleton_method(mPsych, "libyaml_version", libyaml_version, 0); + + Init_psych_parser(); + Init_psych_emitter(); + Init_psych_to_ruby(); + Init_psych_yaml_tree(); +} diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych.h b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych.h new file mode 100644 index 0000000..6b3d63f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych.h @@ -0,0 +1,17 @@ +#ifndef PSYCH_H +#define PSYCH_H + +#include +#include + +#include + +#include +#include +#include +#include + +extern VALUE mPsych; + + +#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_emitter.c b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_emitter.c new file mode 100644 index 0000000..624ab7c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_emitter.c @@ -0,0 +1,589 @@ +#include + +#if !defined(RARRAY_CONST_PTR) +#define RARRAY_CONST_PTR(s) (const VALUE *)RARRAY_PTR(s) +#endif +#if !defined(RARRAY_AREF) +#define RARRAY_AREF(a, i) RARRAY_CONST_PTR(a)[i] +#endif + +VALUE cPsychEmitter; +static ID id_io; +static ID id_write; +static ID id_line_width; +static ID id_indentation; +static ID id_canonical; + +static void emit(yaml_emitter_t * emitter, yaml_event_t * event) +{ + if(!yaml_emitter_emit(emitter, event)) + rb_raise(rb_eRuntimeError, "%s", emitter->problem); +} + +static int writer(void *ctx, unsigned char *buffer, size_t size) +{ + VALUE self = (VALUE)ctx, io = rb_attr_get(self, id_io); + VALUE str = rb_enc_str_new((const char *)buffer, (long)size, rb_utf8_encoding()); + VALUE wrote = rb_funcall(io, id_write, 1, str); + return (int)NUM2INT(wrote); +} + +static void dealloc(void * ptr) +{ + yaml_emitter_t * emitter; + + emitter = (yaml_emitter_t *)ptr; + yaml_emitter_delete(emitter); + xfree(emitter); +} + +#if 0 +static size_t memsize(const void *ptr) +{ + const yaml_emitter_t *emitter = ptr; + /* TODO: calculate emitter's size */ + return 0; +} +#endif + +static const rb_data_type_t psych_emitter_type = { + "Psych/emitter", + {0, dealloc, 0,}, + 0, 0, +#ifdef RUBY_TYPED_FREE_IMMEDIATELY + RUBY_TYPED_FREE_IMMEDIATELY, +#endif +}; + +static VALUE allocate(VALUE klass) +{ + yaml_emitter_t * emitter; + VALUE obj = TypedData_Make_Struct(klass, yaml_emitter_t, &psych_emitter_type, emitter); + + yaml_emitter_initialize(emitter); + yaml_emitter_set_unicode(emitter, 1); + yaml_emitter_set_indent(emitter, 2); + + return obj; +} + +/* call-seq: Psych::Emitter.new(io, options = Psych::Emitter::OPTIONS) + * + * Create a new Psych::Emitter that writes to +io+. + */ +static VALUE initialize(int argc, VALUE *argv, VALUE self) +{ + yaml_emitter_t * emitter; + VALUE io, options; + VALUE line_width; + VALUE indent; + VALUE canonical; + + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + + if (rb_scan_args(argc, argv, "11", &io, &options) == 2) { + line_width = rb_funcall(options, id_line_width, 0); + indent = rb_funcall(options, id_indentation, 0); + canonical = rb_funcall(options, id_canonical, 0); + + yaml_emitter_set_width(emitter, NUM2INT(line_width)); + yaml_emitter_set_indent(emitter, NUM2INT(indent)); + yaml_emitter_set_canonical(emitter, Qtrue == canonical ? 1 : 0); + } + + rb_ivar_set(self, id_io, io); + yaml_emitter_set_output(emitter, writer, (void *)self); + + return self; +} + +/* call-seq: emitter.start_stream(encoding) + * + * Start a stream emission with +encoding+ + * + * See Psych::Handler#start_stream + */ +static VALUE start_stream(VALUE self, VALUE encoding) +{ + yaml_emitter_t * emitter; + yaml_event_t event; + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + Check_Type(encoding, T_FIXNUM); + + yaml_stream_start_event_initialize(&event, (yaml_encoding_t)NUM2INT(encoding)); + + emit(emitter, &event); + + return self; +} + +/* call-seq: emitter.end_stream + * + * End a stream emission + * + * See Psych::Handler#end_stream + */ +static VALUE end_stream(VALUE self) +{ + yaml_emitter_t * emitter; + yaml_event_t event; + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + + yaml_stream_end_event_initialize(&event); + + emit(emitter, &event); + + return self; +} + +struct start_document_data { + VALUE self; + VALUE version; + VALUE tags; + VALUE imp; + + yaml_tag_directive_t * head; +}; + +static VALUE start_document_try(VALUE d) +{ + struct start_document_data * data = (struct start_document_data *)d; + VALUE self = data->self; + VALUE version = data->version; + VALUE tags = data->tags; + VALUE imp = data->imp; + + yaml_emitter_t * emitter; + yaml_tag_directive_t * tail = NULL; + yaml_event_t event; + yaml_version_directive_t version_directive; + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + + Check_Type(version, T_ARRAY); + + if(RARRAY_LEN(version) > 0) { + VALUE major = rb_ary_entry(version, (long)0); + VALUE minor = rb_ary_entry(version, (long)1); + + version_directive.major = NUM2INT(major); + version_directive.minor = NUM2INT(minor); + } + + if(RTEST(tags)) { + long i = 0; + long len; + rb_encoding * encoding = rb_utf8_encoding(); + + Check_Type(tags, T_ARRAY); + + len = RARRAY_LEN(tags); + data->head = xcalloc((size_t)len, sizeof(yaml_tag_directive_t)); + tail = data->head; + + for(i = 0; i < len && i < RARRAY_LEN(tags); i++) { + VALUE tuple = RARRAY_AREF(tags, i); + VALUE name; + VALUE value; + + Check_Type(tuple, T_ARRAY); + + if(RARRAY_LEN(tuple) < 2) { + rb_raise(rb_eRuntimeError, "tag tuple must be of length 2"); + } + + name = RARRAY_AREF(tuple, 0); + value = RARRAY_AREF(tuple, 1); + StringValue(name); + StringValue(value); + name = rb_str_export_to_enc(name, encoding); + value = rb_str_export_to_enc(value, encoding); + + tail->handle = (yaml_char_t *)StringValueCStr(name); + tail->prefix = (yaml_char_t *)StringValueCStr(value); + + tail++; + } + } + + yaml_document_start_event_initialize( + &event, + (RARRAY_LEN(version) > 0) ? &version_directive : NULL, + data->head, + tail, + imp ? 1 : 0 + ); + + emit(emitter, &event); + + return self; +} + +static VALUE start_document_ensure(VALUE d) +{ + struct start_document_data * data = (struct start_document_data *)d; + + xfree(data->head); + + return Qnil; +} + +/* call-seq: emitter.start_document(version, tags, implicit) + * + * Start a document emission with YAML +version+, +tags+, and an +implicit+ + * start. + * + * See Psych::Handler#start_document + */ +static VALUE start_document(VALUE self, VALUE version, VALUE tags, VALUE imp) +{ + struct start_document_data data = { + .self = self, + .version = version, + .tags = tags, + .imp = imp, + + .head = NULL, + }; + + return rb_ensure(start_document_try, (VALUE)&data, start_document_ensure, (VALUE)&data); +} + +/* call-seq: emitter.end_document(implicit) + * + * End a document emission with an +implicit+ ending. + * + * See Psych::Handler#end_document + */ +static VALUE end_document(VALUE self, VALUE imp) +{ + yaml_emitter_t * emitter; + yaml_event_t event; + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + + yaml_document_end_event_initialize(&event, imp ? 1 : 0); + + emit(emitter, &event); + + return self; +} + +/* call-seq: emitter.scalar(value, anchor, tag, plain, quoted, style) + * + * Emit a scalar with +value+, +anchor+, +tag+, and a +plain+ or +quoted+ + * string type with +style+. + * + * See Psych::Handler#scalar + */ +static VALUE scalar( + VALUE self, + VALUE value, + VALUE anchor, + VALUE tag, + VALUE plain, + VALUE quoted, + VALUE style + ) { + yaml_emitter_t * emitter; + yaml_event_t event; + rb_encoding *encoding; + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + + Check_Type(value, T_STRING); + + encoding = rb_utf8_encoding(); + + value = rb_str_export_to_enc(value, encoding); + + if(!NIL_P(anchor)) { + Check_Type(anchor, T_STRING); + anchor = rb_str_export_to_enc(anchor, encoding); + } + + if(!NIL_P(tag)) { + Check_Type(tag, T_STRING); + tag = rb_str_export_to_enc(tag, encoding); + } + + const char *value_ptr = StringValuePtr(value); + yaml_scalar_event_initialize( + &event, + (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValueCStr(anchor)), + (yaml_char_t *)(NIL_P(tag) ? NULL : StringValueCStr(tag)), + (yaml_char_t*)value_ptr, + (int)RSTRING_LEN(value), + plain ? 1 : 0, + quoted ? 1 : 0, + (yaml_scalar_style_t)NUM2INT(style) + ); + + emit(emitter, &event); + + return self; +} + +/* call-seq: emitter.start_sequence(anchor, tag, implicit, style) + * + * Start emitting a sequence with +anchor+, a +tag+, +implicit+ sequence + * start and end, along with +style+. + * + * See Psych::Handler#start_sequence + */ +static VALUE start_sequence( + VALUE self, + VALUE anchor, + VALUE tag, + VALUE implicit, + VALUE style + ) { + yaml_emitter_t * emitter; + yaml_event_t event; + + rb_encoding * encoding = rb_utf8_encoding(); + + if(!NIL_P(anchor)) { + Check_Type(anchor, T_STRING); + anchor = rb_str_export_to_enc(anchor, encoding); + } + + if(!NIL_P(tag)) { + Check_Type(tag, T_STRING); + tag = rb_str_export_to_enc(tag, encoding); + } + + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + + yaml_sequence_start_event_initialize( + &event, + (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValueCStr(anchor)), + (yaml_char_t *)(NIL_P(tag) ? NULL : StringValueCStr(tag)), + implicit ? 1 : 0, + (yaml_sequence_style_t)NUM2INT(style) + ); + + emit(emitter, &event); + + return self; +} + +/* call-seq: emitter.end_sequence + * + * End sequence emission. + * + * See Psych::Handler#end_sequence + */ +static VALUE end_sequence(VALUE self) +{ + yaml_emitter_t * emitter; + yaml_event_t event; + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + + yaml_sequence_end_event_initialize(&event); + + emit(emitter, &event); + + return self; +} + +/* call-seq: emitter.start_mapping(anchor, tag, implicit, style) + * + * Start emitting a YAML map with +anchor+, +tag+, an +implicit+ start + * and end, and +style+. + * + * See Psych::Handler#start_mapping + */ +static VALUE start_mapping( + VALUE self, + VALUE anchor, + VALUE tag, + VALUE implicit, + VALUE style + ) { + yaml_emitter_t * emitter; + yaml_event_t event; + rb_encoding *encoding; + + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + + encoding = rb_utf8_encoding(); + + if(!NIL_P(anchor)) { + Check_Type(anchor, T_STRING); + anchor = rb_str_export_to_enc(anchor, encoding); + } + + if(!NIL_P(tag)) { + Check_Type(tag, T_STRING); + tag = rb_str_export_to_enc(tag, encoding); + } + + yaml_mapping_start_event_initialize( + &event, + (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValueCStr(anchor)), + (yaml_char_t *)(NIL_P(tag) ? NULL : StringValueCStr(tag)), + implicit ? 1 : 0, + (yaml_mapping_style_t)NUM2INT(style) + ); + + emit(emitter, &event); + + return self; +} + +/* call-seq: emitter.end_mapping + * + * Emit the end of a mapping. + * + * See Psych::Handler#end_mapping + */ +static VALUE end_mapping(VALUE self) +{ + yaml_emitter_t * emitter; + yaml_event_t event; + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + + yaml_mapping_end_event_initialize(&event); + + emit(emitter, &event); + + return self; +} + +/* call-seq: emitter.alias(anchor) + * + * Emit an alias with +anchor+. + * + * See Psych::Handler#alias + */ +static VALUE alias(VALUE self, VALUE anchor) +{ + yaml_emitter_t * emitter; + yaml_event_t event; + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + + if(!NIL_P(anchor)) { + Check_Type(anchor, T_STRING); + anchor = rb_str_export_to_enc(anchor, rb_utf8_encoding()); + } + + yaml_alias_event_initialize( + &event, + (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValueCStr(anchor)) + ); + + emit(emitter, &event); + + return self; +} + +/* call-seq: emitter.canonical = true + * + * Set the output style to canonical, or not. + */ +static VALUE set_canonical(VALUE self, VALUE style) +{ + yaml_emitter_t * emitter; + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + + yaml_emitter_set_canonical(emitter, Qtrue == style ? 1 : 0); + + return style; +} + +/* call-seq: emitter.canonical + * + * Get the output style, canonical or not. + */ +static VALUE canonical(VALUE self) +{ + yaml_emitter_t * emitter; + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + + return (emitter->canonical == 0) ? Qfalse : Qtrue; +} + +/* call-seq: emitter.indentation = level + * + * Set the indentation level to +level+. The level must be less than 10 and + * greater than 1. + */ +static VALUE set_indentation(VALUE self, VALUE level) +{ + yaml_emitter_t * emitter; + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + + yaml_emitter_set_indent(emitter, NUM2INT(level)); + + return level; +} + +/* call-seq: emitter.indentation + * + * Get the indentation level. + */ +static VALUE indentation(VALUE self) +{ + yaml_emitter_t * emitter; + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + + return INT2NUM(emitter->best_indent); +} + +/* call-seq: emitter.line_width + * + * Get the preferred line width. + */ +static VALUE line_width(VALUE self) +{ + yaml_emitter_t * emitter; + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + + return INT2NUM(emitter->best_width); +} + +/* call-seq: emitter.line_width = width + * + * Set the preferred line with to +width+. + */ +static VALUE set_line_width(VALUE self, VALUE width) +{ + yaml_emitter_t * emitter; + TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); + + yaml_emitter_set_width(emitter, NUM2INT(width)); + + return width; +} + +void Init_psych_emitter(void) +{ +#undef rb_intern + VALUE psych = rb_define_module("Psych"); + VALUE handler = rb_define_class_under(psych, "Handler", rb_cObject); + cPsychEmitter = rb_define_class_under(psych, "Emitter", handler); + + rb_define_alloc_func(cPsychEmitter, allocate); + + rb_define_method(cPsychEmitter, "initialize", initialize, -1); + rb_define_method(cPsychEmitter, "start_stream", start_stream, 1); + rb_define_method(cPsychEmitter, "end_stream", end_stream, 0); + rb_define_method(cPsychEmitter, "start_document", start_document, 3); + rb_define_method(cPsychEmitter, "end_document", end_document, 1); + rb_define_method(cPsychEmitter, "scalar", scalar, 6); + rb_define_method(cPsychEmitter, "start_sequence", start_sequence, 4); + rb_define_method(cPsychEmitter, "end_sequence", end_sequence, 0); + rb_define_method(cPsychEmitter, "start_mapping", start_mapping, 4); + rb_define_method(cPsychEmitter, "end_mapping", end_mapping, 0); + rb_define_method(cPsychEmitter, "alias", alias, 1); + rb_define_method(cPsychEmitter, "canonical", canonical, 0); + rb_define_method(cPsychEmitter, "canonical=", set_canonical, 1); + rb_define_method(cPsychEmitter, "indentation", indentation, 0); + rb_define_method(cPsychEmitter, "indentation=", set_indentation, 1); + rb_define_method(cPsychEmitter, "line_width", line_width, 0); + rb_define_method(cPsychEmitter, "line_width=", set_line_width, 1); + + id_io = rb_intern("io"); + id_write = rb_intern("write"); + id_line_width = rb_intern("line_width"); + id_indentation = rb_intern("indentation"); + id_canonical = rb_intern("canonical"); +} diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_emitter.h b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_emitter.h new file mode 100644 index 0000000..4c1482a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_emitter.h @@ -0,0 +1,8 @@ +#ifndef PSYCH_EMITTER_H +#define PSYCH_EMITTER_H + +#include + +void Init_psych_emitter(void); + +#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_parser.c b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_parser.c new file mode 100644 index 0000000..d973496 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_parser.c @@ -0,0 +1,564 @@ +#include + +VALUE cPsychParser; + +static ID id_read; +static ID id_path; +static ID id_empty; +static ID id_start_stream; +static ID id_end_stream; +static ID id_start_document; +static ID id_end_document; +static ID id_alias; +static ID id_scalar; +static ID id_start_sequence; +static ID id_end_sequence; +static ID id_start_mapping; +static ID id_end_mapping; +static ID id_event_location; + +#define PSYCH_TRANSCODE(_str, _yaml_enc, _internal_enc) \ + do { \ + rb_enc_associate_index((_str), (_yaml_enc)); \ + if(_internal_enc) \ + (_str) = rb_str_export_to_enc((_str), (_internal_enc)); \ + } while (0) + +static int io_reader(void * data, unsigned char *buf, size_t size, size_t *read) +{ + VALUE io = (VALUE)data; + VALUE string = rb_funcall(io, id_read, 1, SIZET2NUM(size)); + + *read = 0; + + if(! NIL_P(string)) { + void * str = (void *)StringValuePtr(string); + *read = (size_t)RSTRING_LEN(string); + memcpy(buf, str, *read); + } + + return 1; +} + +static void dealloc(void * ptr) +{ + yaml_parser_t * parser; + + parser = (yaml_parser_t *)ptr; + yaml_parser_delete(parser); + xfree(parser); +} + +#if 0 +static size_t memsize(const void *ptr) +{ + const yaml_parser_t *parser = ptr; + /* TODO: calculate parser's size */ + return 0; +} +#endif + +static const rb_data_type_t psych_parser_type = { + "Psych/parser", + {0, dealloc, 0,}, + 0, 0, +#ifdef RUBY_TYPED_FREE_IMMEDIATELY + RUBY_TYPED_FREE_IMMEDIATELY, +#endif +}; + +static VALUE allocate(VALUE klass) +{ + yaml_parser_t * parser; + VALUE obj = TypedData_Make_Struct(klass, yaml_parser_t, &psych_parser_type, parser); + + yaml_parser_initialize(parser); + + return obj; +} + +static VALUE make_exception(yaml_parser_t * parser, VALUE path) +{ + if (parser->error == YAML_MEMORY_ERROR) { + return rb_eNoMemError; + } else { + size_t line, column; + VALUE ePsychSyntaxError; + + line = parser->context_mark.line + 1; + column = parser->context_mark.column + 1; + + ePsychSyntaxError = rb_const_get(mPsych, rb_intern("SyntaxError")); + + return rb_funcall(ePsychSyntaxError, rb_intern("new"), 6, + path, + SIZET2NUM(line), + SIZET2NUM(column), + SIZET2NUM(parser->problem_offset), + parser->problem ? rb_usascii_str_new2(parser->problem) : Qnil, + parser->context ? rb_usascii_str_new2(parser->context) : Qnil); + } +} + +static VALUE transcode_string(VALUE src, int * parser_encoding) +{ + int utf8 = rb_utf8_encindex(); + int utf16le = rb_enc_find_index("UTF-16LE"); + int utf16be = rb_enc_find_index("UTF-16BE"); + int source_encoding = rb_enc_get_index(src); + + if (source_encoding == utf8) { + *parser_encoding = YAML_UTF8_ENCODING; + return src; + } + + if (source_encoding == utf16le) { + *parser_encoding = YAML_UTF16LE_ENCODING; + return src; + } + + if (source_encoding == utf16be) { + *parser_encoding = YAML_UTF16BE_ENCODING; + return src; + } + + src = rb_str_export_to_enc(src, rb_utf8_encoding()); + RB_GC_GUARD(src); + + *parser_encoding = YAML_UTF8_ENCODING; + return src; +} + +static VALUE transcode_io(VALUE src, int * parser_encoding) +{ + VALUE io_external_encoding; + int io_external_enc_index; + + io_external_encoding = rb_funcall(src, rb_intern("external_encoding"), 0); + + /* if no encoding is returned, assume ascii8bit. */ + if (NIL_P(io_external_encoding)) { + io_external_enc_index = rb_ascii8bit_encindex(); + } else { + io_external_enc_index = rb_to_encoding_index(io_external_encoding); + } + + /* Treat US-ASCII as utf_8 */ + if (io_external_enc_index == rb_usascii_encindex()) { + *parser_encoding = YAML_UTF8_ENCODING; + return src; + } + + if (io_external_enc_index == rb_utf8_encindex()) { + *parser_encoding = YAML_UTF8_ENCODING; + return src; + } + + if (io_external_enc_index == rb_enc_find_index("UTF-16LE")) { + *parser_encoding = YAML_UTF16LE_ENCODING; + return src; + } + + if (io_external_enc_index == rb_enc_find_index("UTF-16BE")) { + *parser_encoding = YAML_UTF16BE_ENCODING; + return src; + } + + /* Just guess on ASCII-8BIT */ + if (io_external_enc_index == rb_ascii8bit_encindex()) { + *parser_encoding = YAML_ANY_ENCODING; + return src; + } + + /* If the external encoding is something we don't know how to handle, + * fall back to YAML_ANY_ENCODING. */ + *parser_encoding = YAML_ANY_ENCODING; + + return src; +} + +static VALUE protected_start_stream(VALUE pointer) +{ + VALUE *args = (VALUE *)pointer; + return rb_funcall(args[0], id_start_stream, 1, args[1]); +} + +static VALUE protected_start_document(VALUE pointer) +{ + VALUE *args = (VALUE *)pointer; + return rb_funcall3(args[0], id_start_document, 3, args + 1); +} + +static VALUE protected_end_document(VALUE pointer) +{ + VALUE *args = (VALUE *)pointer; + return rb_funcall(args[0], id_end_document, 1, args[1]); +} + +static VALUE protected_alias(VALUE pointer) +{ + VALUE *args = (VALUE *)pointer; + return rb_funcall(args[0], id_alias, 1, args[1]); +} + +static VALUE protected_scalar(VALUE pointer) +{ + VALUE *args = (VALUE *)pointer; + return rb_funcall3(args[0], id_scalar, 6, args + 1); +} + +static VALUE protected_start_sequence(VALUE pointer) +{ + VALUE *args = (VALUE *)pointer; + return rb_funcall3(args[0], id_start_sequence, 4, args + 1); +} + +static VALUE protected_end_sequence(VALUE handler) +{ + return rb_funcall(handler, id_end_sequence, 0); +} + +static VALUE protected_start_mapping(VALUE pointer) +{ + VALUE *args = (VALUE *)pointer; + return rb_funcall3(args[0], id_start_mapping, 4, args + 1); +} + +static VALUE protected_end_mapping(VALUE handler) +{ + return rb_funcall(handler, id_end_mapping, 0); +} + +static VALUE protected_empty(VALUE handler) +{ + return rb_funcall(handler, id_empty, 0); +} + +static VALUE protected_end_stream(VALUE handler) +{ + return rb_funcall(handler, id_end_stream, 0); +} + +static VALUE protected_event_location(VALUE pointer) +{ + VALUE *args = (VALUE *)pointer; + return rb_funcall3(args[0], id_event_location, 4, args + 1); +} + +static VALUE parse(VALUE self, VALUE handler, VALUE yaml, VALUE path) +{ + yaml_parser_t * parser; + yaml_event_t event; + int done = 0; + int state = 0; + int parser_encoding = YAML_ANY_ENCODING; + int encoding = rb_utf8_encindex(); + rb_encoding * internal_enc = rb_default_internal_encoding(); + + TypedData_Get_Struct(self, yaml_parser_t, &psych_parser_type, parser); + + yaml_parser_delete(parser); + yaml_parser_initialize(parser); + + if (rb_respond_to(yaml, id_read)) { + yaml = transcode_io(yaml, &parser_encoding); + yaml_parser_set_encoding(parser, parser_encoding); + yaml_parser_set_input(parser, io_reader, (void *)yaml); + } else { + StringValue(yaml); + yaml = transcode_string(yaml, &parser_encoding); + yaml_parser_set_encoding(parser, parser_encoding); + yaml_parser_set_input_string( + parser, + (const unsigned char *)RSTRING_PTR(yaml), + (size_t)RSTRING_LEN(yaml) + ); + } + + while(!done) { + VALUE event_args[5]; + VALUE start_line, start_column, end_line, end_column; + + if(parser->error || !yaml_parser_parse(parser, &event)) { + VALUE exception; + + exception = make_exception(parser, path); + yaml_parser_delete(parser); + yaml_parser_initialize(parser); + + rb_exc_raise(exception); + } + + start_line = SIZET2NUM(event.start_mark.line); + start_column = SIZET2NUM(event.start_mark.column); + end_line = SIZET2NUM(event.end_mark.line); + end_column = SIZET2NUM(event.end_mark.column); + + event_args[0] = handler; + event_args[1] = start_line; + event_args[2] = start_column; + event_args[3] = end_line; + event_args[4] = end_column; + rb_protect(protected_event_location, (VALUE)event_args, &state); + + switch(event.type) { + case YAML_STREAM_START_EVENT: + { + VALUE args[2]; + + args[0] = handler; + args[1] = INT2NUM(event.data.stream_start.encoding); + rb_protect(protected_start_stream, (VALUE)args, &state); + } + break; + case YAML_DOCUMENT_START_EVENT: + { + VALUE args[4]; + /* Get a list of tag directives (if any) */ + VALUE tag_directives = rb_ary_new(); + /* Grab the document version */ + VALUE version = event.data.document_start.version_directive ? + rb_ary_new3( + (long)2, + INT2NUM(event.data.document_start.version_directive->major), + INT2NUM(event.data.document_start.version_directive->minor) + ) : rb_ary_new(); + + if(event.data.document_start.tag_directives.start) { + yaml_tag_directive_t *start = + event.data.document_start.tag_directives.start; + yaml_tag_directive_t *end = + event.data.document_start.tag_directives.end; + for(; start != end; start++) { + VALUE handle = Qnil; + VALUE prefix = Qnil; + if(start->handle) { + handle = rb_str_new2((const char *)start->handle); + PSYCH_TRANSCODE(handle, encoding, internal_enc); + } + + if(start->prefix) { + prefix = rb_str_new2((const char *)start->prefix); + PSYCH_TRANSCODE(prefix, encoding, internal_enc); + } + + rb_ary_push(tag_directives, rb_ary_new3((long)2, handle, prefix)); + } + } + args[0] = handler; + args[1] = version; + args[2] = tag_directives; + args[3] = event.data.document_start.implicit == 1 ? Qtrue : Qfalse; + rb_protect(protected_start_document, (VALUE)args, &state); + } + break; + case YAML_DOCUMENT_END_EVENT: + { + VALUE args[2]; + + args[0] = handler; + args[1] = event.data.document_end.implicit == 1 ? Qtrue : Qfalse; + rb_protect(protected_end_document, (VALUE)args, &state); + } + break; + case YAML_ALIAS_EVENT: + { + VALUE args[2]; + VALUE alias = Qnil; + if(event.data.alias.anchor) { + alias = rb_str_new2((const char *)event.data.alias.anchor); + PSYCH_TRANSCODE(alias, encoding, internal_enc); + } + + args[0] = handler; + args[1] = alias; + rb_protect(protected_alias, (VALUE)args, &state); + } + break; + case YAML_SCALAR_EVENT: + { + VALUE args[7]; + VALUE anchor = Qnil; + VALUE tag = Qnil; + VALUE plain_implicit, quoted_implicit, style; + VALUE val = rb_str_new( + (const char *)event.data.scalar.value, + (long)event.data.scalar.length + ); + + PSYCH_TRANSCODE(val, encoding, internal_enc); + + if(event.data.scalar.anchor) { + anchor = rb_str_new2((const char *)event.data.scalar.anchor); + PSYCH_TRANSCODE(anchor, encoding, internal_enc); + } + + if(event.data.scalar.tag) { + tag = rb_str_new2((const char *)event.data.scalar.tag); + PSYCH_TRANSCODE(tag, encoding, internal_enc); + } + + plain_implicit = + event.data.scalar.plain_implicit == 0 ? Qfalse : Qtrue; + + quoted_implicit = + event.data.scalar.quoted_implicit == 0 ? Qfalse : Qtrue; + + style = INT2NUM(event.data.scalar.style); + + args[0] = handler; + args[1] = val; + args[2] = anchor; + args[3] = tag; + args[4] = plain_implicit; + args[5] = quoted_implicit; + args[6] = style; + rb_protect(protected_scalar, (VALUE)args, &state); + } + break; + case YAML_SEQUENCE_START_EVENT: + { + VALUE args[5]; + VALUE anchor = Qnil; + VALUE tag = Qnil; + VALUE implicit, style; + if(event.data.sequence_start.anchor) { + anchor = rb_str_new2((const char *)event.data.sequence_start.anchor); + PSYCH_TRANSCODE(anchor, encoding, internal_enc); + } + + tag = Qnil; + if(event.data.sequence_start.tag) { + tag = rb_str_new2((const char *)event.data.sequence_start.tag); + PSYCH_TRANSCODE(tag, encoding, internal_enc); + } + + implicit = + event.data.sequence_start.implicit == 0 ? Qfalse : Qtrue; + + style = INT2NUM(event.data.sequence_start.style); + + args[0] = handler; + args[1] = anchor; + args[2] = tag; + args[3] = implicit; + args[4] = style; + + rb_protect(protected_start_sequence, (VALUE)args, &state); + } + break; + case YAML_SEQUENCE_END_EVENT: + rb_protect(protected_end_sequence, handler, &state); + break; + case YAML_MAPPING_START_EVENT: + { + VALUE args[5]; + VALUE anchor = Qnil; + VALUE tag = Qnil; + VALUE implicit, style; + if(event.data.mapping_start.anchor) { + anchor = rb_str_new2((const char *)event.data.mapping_start.anchor); + PSYCH_TRANSCODE(anchor, encoding, internal_enc); + } + + if(event.data.mapping_start.tag) { + tag = rb_str_new2((const char *)event.data.mapping_start.tag); + PSYCH_TRANSCODE(tag, encoding, internal_enc); + } + + implicit = + event.data.mapping_start.implicit == 0 ? Qfalse : Qtrue; + + style = INT2NUM(event.data.mapping_start.style); + + args[0] = handler; + args[1] = anchor; + args[2] = tag; + args[3] = implicit; + args[4] = style; + + rb_protect(protected_start_mapping, (VALUE)args, &state); + } + break; + case YAML_MAPPING_END_EVENT: + rb_protect(protected_end_mapping, handler, &state); + break; + case YAML_NO_EVENT: + rb_protect(protected_empty, handler, &state); + break; + case YAML_STREAM_END_EVENT: + rb_protect(protected_end_stream, handler, &state); + done = 1; + break; + } + yaml_event_delete(&event); + if (state) rb_jump_tag(state); + } + + return self; +} + +/* + * call-seq: + * parser.mark # => # + * + * Returns a Psych::Parser::Mark object that contains line, column, and index + * information. + */ +static VALUE mark(VALUE self) +{ + VALUE mark_klass; + VALUE args[3]; + yaml_parser_t * parser; + + TypedData_Get_Struct(self, yaml_parser_t, &psych_parser_type, parser); + mark_klass = rb_const_get_at(cPsychParser, rb_intern("Mark")); + args[0] = SIZET2NUM(parser->mark.index); + args[1] = SIZET2NUM(parser->mark.line); + args[2] = SIZET2NUM(parser->mark.column); + + return rb_class_new_instance(3, args, mark_klass); +} + +void Init_psych_parser(void) +{ +#undef rb_intern +#if 0 + mPsych = rb_define_module("Psych"); +#endif + + cPsychParser = rb_define_class_under(mPsych, "Parser", rb_cObject); + rb_define_alloc_func(cPsychParser, allocate); + + /* Any encoding: Let the parser choose the encoding */ + rb_define_const(cPsychParser, "ANY", INT2NUM(YAML_ANY_ENCODING)); + + /* UTF-8 Encoding */ + rb_define_const(cPsychParser, "UTF8", INT2NUM(YAML_UTF8_ENCODING)); + + /* UTF-16-LE Encoding with BOM */ + rb_define_const(cPsychParser, "UTF16LE", INT2NUM(YAML_UTF16LE_ENCODING)); + + /* UTF-16-BE Encoding with BOM */ + rb_define_const(cPsychParser, "UTF16BE", INT2NUM(YAML_UTF16BE_ENCODING)); + + rb_require("psych/syntax_error"); + + rb_define_private_method(cPsychParser, "_native_parse", parse, 3); + rb_define_method(cPsychParser, "mark", mark, 0); + + id_read = rb_intern("read"); + id_path = rb_intern("path"); + id_empty = rb_intern("empty"); + id_start_stream = rb_intern("start_stream"); + id_end_stream = rb_intern("end_stream"); + id_start_document = rb_intern("start_document"); + id_end_document = rb_intern("end_document"); + id_alias = rb_intern("alias"); + id_scalar = rb_intern("scalar"); + id_start_sequence = rb_intern("start_sequence"); + id_end_sequence = rb_intern("end_sequence"); + id_start_mapping = rb_intern("start_mapping"); + id_end_mapping = rb_intern("end_mapping"); + id_event_location = rb_intern("event_location"); +} diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_parser.h b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_parser.h new file mode 100644 index 0000000..beb3dd0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_parser.h @@ -0,0 +1,6 @@ +#ifndef PSYCH_PARSER_H +#define PSYCH_PARSER_H + +void Init_psych_parser(void); + +#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_to_ruby.c b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_to_ruby.c new file mode 100644 index 0000000..d473a5f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_to_ruby.c @@ -0,0 +1,48 @@ +#include + +VALUE cPsychVisitorsToRuby; + +/* call-seq: vis.build_exception(klass, message) + * + * Create an exception with class +klass+ and +message+ + */ +static VALUE build_exception(VALUE self, VALUE klass, VALUE mesg) +{ + VALUE e = rb_obj_alloc(klass); + + rb_iv_set(e, "mesg", mesg); + + return e; +} + +/* call-seq: vis.path2class(path) + * + * Convert +path+ string to a class + */ +static VALUE path2class(VALUE self, VALUE path) +{ + return rb_path_to_class(path); +} + +static VALUE init_struct(VALUE self, VALUE data, VALUE attrs) +{ + VALUE args = rb_ary_new2(1); + rb_ary_push(args, attrs); + rb_struct_initialize(data, args); + + return data; +} + +void Init_psych_to_ruby(void) +{ + VALUE psych = rb_define_module("Psych"); + VALUE class_loader = rb_define_class_under(psych, "ClassLoader", rb_cObject); + + VALUE visitors = rb_define_module_under(psych, "Visitors"); + VALUE visitor = rb_define_class_under(visitors, "Visitor", rb_cObject); + cPsychVisitorsToRuby = rb_define_class_under(visitors, "ToRuby", visitor); + + rb_define_private_method(cPsychVisitorsToRuby, "init_struct", init_struct, 2); + rb_define_private_method(cPsychVisitorsToRuby, "build_exception", build_exception, 2); + rb_define_private_method(class_loader, "path2class", path2class, 1); +} diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_to_ruby.h b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_to_ruby.h new file mode 100644 index 0000000..7b8e757 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_to_ruby.h @@ -0,0 +1,8 @@ +#ifndef PSYCH_TO_RUBY_H +#define PSYCH_TO_RUBY_H + +#include + +void Init_psych_to_ruby(void); + +#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_yaml_tree.c b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_yaml_tree.c new file mode 100644 index 0000000..bbd93f8 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_yaml_tree.c @@ -0,0 +1,11 @@ +#include + +VALUE cPsychVisitorsYamlTree; + +void Init_psych_yaml_tree(void) +{ + VALUE psych = rb_define_module("Psych"); + VALUE visitors = rb_define_module_under(psych, "Visitors"); + VALUE visitor = rb_define_class_under(visitors, "Visitor", rb_cObject); + cPsychVisitorsYamlTree = rb_define_class_under(visitors, "YAMLTree", visitor); +} diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_yaml_tree.h b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_yaml_tree.h new file mode 100644 index 0000000..4628a69 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_yaml_tree.h @@ -0,0 +1,8 @@ +#ifndef PSYCH_YAML_TREE_H +#define PSYCH_YAML_TREE_H + +#include + +void Init_psych_yaml_tree(void); + +#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych.rb new file mode 100644 index 0000000..0c158c9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych.rb @@ -0,0 +1,793 @@ +# frozen_string_literal: true +require 'date' + +require_relative 'psych/versions' +case RUBY_ENGINE +when 'jruby' + require_relative 'psych_jars' + if JRuby::Util.respond_to?(:load_ext) + JRuby::Util.load_ext('org.jruby.ext.psych.PsychLibrary') + else + require 'java'; require 'jruby' + org.jruby.ext.psych.PsychLibrary.new.load(JRuby.runtime, false) + end +else + require 'psych.so' +end +require_relative 'psych/nodes' +require_relative 'psych/streaming' +require_relative 'psych/visitors' +require_relative 'psych/handler' +require_relative 'psych/tree_builder' +require_relative 'psych/parser' +require_relative 'psych/omap' +require_relative 'psych/set' +require_relative 'psych/coder' +require_relative 'psych/stream' +require_relative 'psych/json/tree_builder' +require_relative 'psych/json/stream' +require_relative 'psych/handlers/document_stream' +require_relative 'psych/class_loader' + +### +# = Overview +# +# Psych is a YAML parser and emitter. +# Psych leverages libyaml [Home page: https://pyyaml.org/wiki/LibYAML] +# or [git repo: https://github.com/yaml/libyaml] for its YAML parsing +# and emitting capabilities. In addition to wrapping libyaml, Psych also +# knows how to serialize and de-serialize most Ruby objects to and from +# the YAML format. +# +# = I NEED TO PARSE OR EMIT YAML RIGHT NOW! +# +# # Parse some YAML +# Psych.load("--- foo") # => "foo" +# +# # Emit some YAML +# Psych.dump("foo") # => "--- foo\n...\n" +# { :a => 'b'}.to_yaml # => "---\n:a: b\n" +# +# Got more time on your hands? Keep on reading! +# +# == YAML Parsing +# +# Psych provides a range of interfaces for parsing a YAML document ranging from +# low level to high level, depending on your parsing needs. At the lowest +# level, is an event based parser. Mid level is access to the raw YAML AST, +# and at the highest level is the ability to unmarshal YAML to Ruby objects. +# +# == YAML Emitting +# +# Psych provides a range of interfaces ranging from low to high level for +# producing YAML documents. Very similar to the YAML parsing interfaces, Psych +# provides at the lowest level, an event based system, mid-level is building +# a YAML AST, and the highest level is converting a Ruby object straight to +# a YAML document. +# +# == High-level API +# +# === Parsing +# +# The high level YAML parser provided by Psych simply takes YAML as input and +# returns a Ruby data structure. For information on using the high level parser +# see Psych.load +# +# ==== Reading from a string +# +# Psych.safe_load("--- a") # => 'a' +# Psych.safe_load("---\n - a\n - b") # => ['a', 'b'] +# # From a trusted string: +# Psych.load("--- !ruby/range\nbegin: 0\nend: 42\nexcl: false\n") # => 0..42 +# +# ==== Reading from a file +# +# Psych.safe_load_file("data.yml", permitted_classes: [Date]) +# Psych.load_file("trusted_database.yml") +# +# ==== \Exception handling +# +# begin +# # The second argument changes only the exception contents +# Psych.parse("--- `", "file.txt") +# rescue Psych::SyntaxError => ex +# ex.file # => 'file.txt' +# ex.message # => "(file.txt): found character that cannot start any token" +# end +# +# === Emitting +# +# The high level emitter has the easiest interface. Psych simply takes a Ruby +# data structure and converts it to a YAML document. See Psych.dump for more +# information on dumping a Ruby data structure. +# +# ==== Writing to a string +# +# # Dump an array, get back a YAML string +# Psych.dump(['a', 'b']) # => "---\n- a\n- b\n" +# +# # Dump an array to an IO object +# Psych.dump(['a', 'b'], StringIO.new) # => # +# +# # Dump an array with indentation set +# Psych.dump(['a', ['b']], :indentation => 3) # => "---\n- a\n- - b\n" +# +# # Dump an array to an IO with indentation set +# Psych.dump(['a', ['b']], StringIO.new, :indentation => 3) +# +# ==== Writing to a file +# +# Currently there is no direct API for dumping Ruby structure to file: +# +# File.open('database.yml', 'w') do |file| +# file.write(Psych.dump(['a', 'b'])) +# end +# +# == Mid-level API +# +# === Parsing +# +# Psych provides access to an AST produced from parsing a YAML document. This +# tree is built using the Psych::Parser and Psych::TreeBuilder. The AST can +# be examined and manipulated freely. Please see Psych::parse_stream, +# Psych::Nodes, and Psych::Nodes::Node for more information on dealing with +# YAML syntax trees. +# +# ==== Reading from a string +# +# # Returns Psych::Nodes::Stream +# Psych.parse_stream("---\n - a\n - b") +# +# # Returns Psych::Nodes::Document +# Psych.parse("---\n - a\n - b") +# +# ==== Reading from a file +# +# # Returns Psych::Nodes::Stream +# Psych.parse_stream(File.read('database.yml')) +# +# # Returns Psych::Nodes::Document +# Psych.parse_file('database.yml') +# +# ==== \Exception handling +# +# begin +# # The second argument changes only the exception contents +# Psych.parse("--- `", "file.txt") +# rescue Psych::SyntaxError => ex +# ex.file # => 'file.txt' +# ex.message # => "(file.txt): found character that cannot start any token" +# end +# +# === Emitting +# +# At the mid level is building an AST. This AST is exactly the same as the AST +# used when parsing a YAML document. Users can build an AST by hand and the +# AST knows how to emit itself as a YAML document. See Psych::Nodes, +# Psych::Nodes::Node, and Psych::TreeBuilder for more information on building +# a YAML AST. +# +# ==== Writing to a string +# +# # We need Psych::Nodes::Stream (not Psych::Nodes::Document) +# stream = Psych.parse_stream("---\n - a\n - b") +# +# stream.to_yaml # => "---\n- a\n- b\n" +# +# ==== Writing to a file +# +# # We need Psych::Nodes::Stream (not Psych::Nodes::Document) +# stream = Psych.parse_stream(File.read('database.yml')) +# +# File.open('database.yml', 'w') do |file| +# file.write(stream.to_yaml) +# end +# +# == Low-level API +# +# === Parsing +# +# The lowest level parser should be used when the YAML input is already known, +# and the developer does not want to pay the price of building an AST or +# automatic detection and conversion to Ruby objects. See Psych::Parser for +# more information on using the event based parser. +# +# ==== Reading to Psych::Nodes::Stream structure +# +# parser = Psych::Parser.new(TreeBuilder.new) # => # +# parser = Psych.parser # it's an alias for the above +# +# parser.parse("---\n - a\n - b") # => # +# parser.handler # => # +# parser.handler.root # => # +# +# ==== Receiving an events stream +# +# recorder = Psych::Handlers::Recorder.new +# parser = Psych::Parser.new(recorder) +# +# parser.parse("---\n - a\n - b") +# recorder.events # => [list of [event, args] lists] +# # event is one of: Psych::Handler::EVENTS +# # args are the arguments passed to the event +# +# === Emitting +# +# The lowest level emitter is an event based system. Events are sent to a +# Psych::Emitter object. That object knows how to convert the events to a YAML +# document. This interface should be used when document format is known in +# advance or speed is a concern. See Psych::Emitter for more information. +# +# ==== Writing to a Ruby structure +# +# Psych.parser.parse("--- a") # => # +# +# parser.handler.first # => # +# parser.handler.first.to_ruby # => ["a"] +# +# parser.handler.root.first # => # +# parser.handler.root.first.to_ruby # => "a" +# +# # You can instantiate an Emitter manually +# Psych::Visitors::ToRuby.new.accept(parser.handler.root.first) +# # => "a" + +module Psych + # The version of libyaml Psych is using + LIBYAML_VERSION = Psych.libyaml_version.join('.').freeze + + ### + # Load +yaml+ in to a Ruby data structure. If multiple documents are + # provided, the object contained in the first document will be returned. + # +filename+ will be used in the exception message if any exception + # is raised while parsing. If +yaml+ is empty, it returns + # the specified +fallback+ return value, which defaults to +false+. + # + # Raises a Psych::SyntaxError when a YAML syntax error is detected. + # + # Example: + # + # Psych.unsafe_load("--- a") # => 'a' + # Psych.unsafe_load("---\n - a\n - b") # => ['a', 'b'] + # + # begin + # Psych.unsafe_load("--- `", filename: "file.txt") + # rescue Psych::SyntaxError => ex + # ex.file # => 'file.txt' + # ex.message # => "(file.txt): found character that cannot start any token" + # end + # + # When the optional +symbolize_names+ keyword argument is set to a + # true value, returns symbols for keys in Hash objects (default: strings). + # + # Psych.unsafe_load("---\n foo: bar") # => {"foo"=>"bar"} + # Psych.unsafe_load("---\n foo: bar", symbolize_names: true) # => {:foo=>"bar"} + # + # Raises a TypeError when `yaml` parameter is NilClass + # + # NOTE: This method *should not* be used to parse untrusted documents, such as + # YAML documents that are supplied via user input. Instead, please use the + # load method or the safe_load method. + # + def self.unsafe_load yaml, filename: nil, fallback: false, symbolize_names: false, freeze: false, strict_integer: false + result = parse(yaml, filename: filename) + return fallback unless result + result.to_ruby(symbolize_names: symbolize_names, freeze: freeze, strict_integer: strict_integer) + end + + ### + # Safely load the yaml string in +yaml+. By default, only the following + # classes are allowed to be deserialized: + # + # * TrueClass + # * FalseClass + # * NilClass + # * Integer + # * Float + # * String + # * Array + # * Hash + # + # Recursive data structures are not allowed by default. Arbitrary classes + # can be allowed by adding those classes to the +permitted_classes+ keyword argument. They are + # additive. For example, to allow Date deserialization: + # + # Psych.safe_load(yaml, permitted_classes: [Date]) + # + # Now the Date class can be loaded in addition to the classes listed above. + # + # Aliases can be explicitly allowed by changing the +aliases+ keyword argument. + # For example: + # + # x = [] + # x << x + # yaml = Psych.dump x + # Psych.safe_load yaml # => raises an exception + # Psych.safe_load yaml, aliases: true # => loads the aliases + # + # A Psych::DisallowedClass exception will be raised if the yaml contains a + # class that isn't in the +permitted_classes+ list. + # + # A Psych::AliasesNotEnabled exception will be raised if the yaml contains aliases + # but the +aliases+ keyword argument is set to false. + # + # +filename+ will be used in the exception message if any exception is raised + # while parsing. + # + # When the optional +symbolize_names+ keyword argument is set to a + # true value, returns symbols for keys in Hash objects (default: strings). + # + # Psych.safe_load("---\n foo: bar") # => {"foo"=>"bar"} + # Psych.safe_load("---\n foo: bar", symbolize_names: true) # => {:foo=>"bar"} + # + def self.safe_load yaml, permitted_classes: [], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false, strict_integer: false + result = parse(yaml, filename: filename) + return fallback unless result + + class_loader = ClassLoader::Restricted.new(permitted_classes.map(&:to_s), + permitted_symbols.map(&:to_s)) + scanner = ScalarScanner.new class_loader, strict_integer: strict_integer + visitor = if aliases + Visitors::ToRuby.new scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze + else + Visitors::NoAliasRuby.new scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze + end + result = visitor.accept result + result + end + + ### + # Load +yaml+ in to a Ruby data structure. If multiple documents are + # provided, the object contained in the first document will be returned. + # +filename+ will be used in the exception message if any exception + # is raised while parsing. If +yaml+ is empty, it returns + # the specified +fallback+ return value, which defaults to +nil+. + # + # Raises a Psych::SyntaxError when a YAML syntax error is detected. + # + # Example: + # + # Psych.load("--- a") # => 'a' + # Psych.load("---\n - a\n - b") # => ['a', 'b'] + # + # begin + # Psych.load("--- `", filename: "file.txt") + # rescue Psych::SyntaxError => ex + # ex.file # => 'file.txt' + # ex.message # => "(file.txt): found character that cannot start any token" + # end + # + # When the optional +symbolize_names+ keyword argument is set to a + # true value, returns symbols for keys in Hash objects (default: strings). + # + # Psych.load("---\n foo: bar") # => {"foo"=>"bar"} + # Psych.load("---\n foo: bar", symbolize_names: true) # => {:foo=>"bar"} + # + # Raises a TypeError when `yaml` parameter is NilClass. This method is + # similar to `safe_load` except that `Symbol` objects are allowed by default. + # + def self.load yaml, permitted_classes: [Symbol], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false, strict_integer: false + safe_load yaml, permitted_classes: permitted_classes, + permitted_symbols: permitted_symbols, + aliases: aliases, + filename: filename, + fallback: fallback, + symbolize_names: symbolize_names, + freeze: freeze, + strict_integer: strict_integer + end + + ### + # Parse a YAML string in +yaml+. Returns the Psych::Nodes::Document. + # +filename+ is used in the exception message if a Psych::SyntaxError is + # raised. + # + # Raises a Psych::SyntaxError when a YAML syntax error is detected. + # + # Example: + # + # Psych.parse("---\n - a\n - b") # => # + # + # begin + # Psych.parse("--- `", filename: "file.txt") + # rescue Psych::SyntaxError => ex + # ex.file # => 'file.txt' + # ex.message # => "(file.txt): found character that cannot start any token" + # end + # + # See Psych::Nodes for more information about YAML AST. + def self.parse yaml, filename: nil + parse_stream(yaml, filename: filename) do |node| + return node + end + + false + end + + ### + # Parse a file at +filename+. Returns the Psych::Nodes::Document. + # + # Raises a Psych::SyntaxError when a YAML syntax error is detected. + def self.parse_file filename, fallback: false + result = File.open filename, 'r:bom|utf-8' do |f| + parse f, filename: filename + end + result || fallback + end + + ### + # Returns a default parser + def self.parser + Psych::Parser.new(TreeBuilder.new) + end + + ### + # Parse a YAML string in +yaml+. Returns the Psych::Nodes::Stream. + # This method can handle multiple YAML documents contained in +yaml+. + # +filename+ is used in the exception message if a Psych::SyntaxError is + # raised. + # + # If a block is given, a Psych::Nodes::Document node will be yielded to the + # block as it's being parsed. + # + # Raises a Psych::SyntaxError when a YAML syntax error is detected. + # + # Example: + # + # Psych.parse_stream("---\n - a\n - b") # => # + # + # Psych.parse_stream("--- a\n--- b") do |node| + # node # => # + # end + # + # begin + # Psych.parse_stream("--- `", filename: "file.txt") + # rescue Psych::SyntaxError => ex + # ex.file # => 'file.txt' + # ex.message # => "(file.txt): found character that cannot start any token" + # end + # + # Raises a TypeError when NilClass is passed. + # + # See Psych::Nodes for more information about YAML AST. + def self.parse_stream yaml, filename: nil, &block + if block_given? + parser = Psych::Parser.new(Handlers::DocumentStream.new(&block)) + parser.parse yaml, filename + else + parser = self.parser + parser.parse yaml, filename + parser.handler.root + end + end + + ### + # call-seq: + # Psych.dump(o) -> string of yaml + # Psych.dump(o, options) -> string of yaml + # Psych.dump(o, io) -> io object passed in + # Psych.dump(o, io, options) -> io object passed in + # + # Dump Ruby object +o+ to a YAML string. Optional +options+ may be passed in + # to control the output format. If an IO object is passed in, the YAML will + # be dumped to that IO object. + # + # Currently supported options are: + # + # [:indentation] Number of space characters used to indent. + # Acceptable value should be in 0..9 range, + # otherwise option is ignored. + # + # Default: 2. + # [:line_width] Max character to wrap line at. + # For unlimited line width use -1. + # + # Default: 0 (meaning "wrap at 81"). + # [:canonical] Write "canonical" YAML form (very verbose, yet + # strictly formal). + # + # Default: false. + # [:header] Write %YAML [version] at the beginning of document. + # + # Default: false. + # + # [:stringify_names] Dump symbol keys in Hash objects as string. + # + # Default: false. + # + # Example: + # + # # Dump an array, get back a YAML string + # Psych.dump(['a', 'b']) # => "---\n- a\n- b\n" + # + # # Dump an array to an IO object + # Psych.dump(['a', 'b'], StringIO.new) # => # + # + # # Dump an array with indentation set + # Psych.dump(['a', ['b']], indentation: 3) # => "---\n- a\n- - b\n" + # + # # Dump an array to an IO with indentation set + # Psych.dump(['a', ['b']], StringIO.new, indentation: 3) + # + # # Dump hash with symbol keys as string + # Psych.dump({a: "b"}, stringify_names: true) # => "---\na: b\n" + def self.dump o, io = nil, options = {} + if Hash === io + options = io + io = nil + end + + visitor = Psych::Visitors::YAMLTree.create options + visitor << o + visitor.tree.yaml io, options + end + + ### + # call-seq: + # Psych.safe_dump(o) -> string of yaml + # Psych.safe_dump(o, options) -> string of yaml + # Psych.safe_dump(o, io) -> io object passed in + # Psych.safe_dump(o, io, options) -> io object passed in + # + # Safely dump Ruby object +o+ to a YAML string. Optional +options+ may be passed in + # to control the output format. If an IO object is passed in, the YAML will + # be dumped to that IO object. By default, only the following + # classes are allowed to be serialized: + # + # * TrueClass + # * FalseClass + # * NilClass + # * Integer + # * Float + # * String + # * Array + # * Hash + # + # Arbitrary classes can be allowed by adding those classes to the +permitted_classes+ + # keyword argument. They are additive. For example, to allow Date serialization: + # + # Psych.safe_dump(yaml, permitted_classes: [Date]) + # + # Now the Date class can be dumped in addition to the classes listed above. + # + # A Psych::DisallowedClass exception will be raised if the object contains a + # class that isn't in the +permitted_classes+ list. + # + # Currently supported options are: + # + # [:indentation] Number of space characters used to indent. + # Acceptable value should be in 0..9 range, + # otherwise option is ignored. + # + # Default: 2. + # [:line_width] Max character to wrap line at. + # For unlimited line width use -1. + # + # Default: 0 (meaning "wrap at 81"). + # [:canonical] Write "canonical" YAML form (very verbose, yet + # strictly formal). + # + # Default: false. + # [:header] Write %YAML [version] at the beginning of document. + # + # Default: false. + # + # [:stringify_names] Dump symbol keys in Hash objects as string. + # + # Default: false. + # + # Example: + # + # # Dump an array, get back a YAML string + # Psych.safe_dump(['a', 'b']) # => "---\n- a\n- b\n" + # + # # Dump an array to an IO object + # Psych.safe_dump(['a', 'b'], StringIO.new) # => # + # + # # Dump an array with indentation set + # Psych.safe_dump(['a', ['b']], indentation: 3) # => "---\n- a\n- - b\n" + # + # # Dump an array to an IO with indentation set + # Psych.safe_dump(['a', ['b']], StringIO.new, indentation: 3) + # + # # Dump hash with symbol keys as string + # Psych.dump({a: "b"}, stringify_names: true) # => "---\na: b\n" + def self.safe_dump o, io = nil, options = {} + if Hash === io + options = io + io = nil + end + + visitor = Psych::Visitors::RestrictedYAMLTree.create options + visitor << o + visitor.tree.yaml io, options + end + + ### + # Dump a list of objects as separate documents to a document stream. + # + # Example: + # + # Psych.dump_stream("foo\n ", {}) # => "--- ! \"foo\\n \"\n--- {}\n" + def self.dump_stream *objects + visitor = Psych::Visitors::YAMLTree.create({}) + objects.each do |o| + visitor << o + end + visitor.tree.yaml + end + + ### + # Dump Ruby +object+ to a JSON string. + def self.to_json object + visitor = Psych::Visitors::JSONTree.create + visitor << object + visitor.tree.yaml + end + + ### + # Load multiple documents given in +yaml+. Returns the parsed documents + # as a list. If a block is given, each document will be converted to Ruby + # and passed to the block during parsing + # + # Example: + # + # Psych.load_stream("--- foo\n...\n--- bar\n...") # => ['foo', 'bar'] + # + # list = [] + # Psych.load_stream("--- foo\n...\n--- bar\n...") do |ruby| + # list << ruby + # end + # list # => ['foo', 'bar'] + # + def self.load_stream yaml, filename: nil, fallback: [], **kwargs + result = if block_given? + parse_stream(yaml, filename: filename) do |node| + yield node.to_ruby(**kwargs) + end + else + parse_stream(yaml, filename: filename).children.map { |node| node.to_ruby(**kwargs) } + end + + return fallback if result.is_a?(Array) && result.empty? + result + end + + ### + # Load multiple documents given in +yaml+. Returns the parsed documents + # as a list. + # + # Example: + # + # Psych.safe_load_stream("--- foo\n...\n--- bar\n...") # => ['foo', 'bar'] + # + # list = [] + # Psych.safe_load_stream("--- foo\n...\n--- bar\n...") do |ruby| + # list << ruby + # end + # list # => ['foo', 'bar'] + # + def self.safe_load_stream yaml, filename: nil, permitted_classes: [], aliases: false + documents = parse_stream(yaml, filename: filename).children.map do |child| + stream = Psych::Nodes::Stream.new + stream.children << child + safe_load(stream.to_yaml, permitted_classes: permitted_classes, aliases: aliases) + end + + if block_given? + documents.each { |doc| yield doc } + nil + else + documents + end + end + + ### + # Load the document contained in +filename+. Returns the yaml contained in + # +filename+ as a Ruby object, or if the file is empty, it returns + # the specified +fallback+ return value, which defaults to +false+. + # + # NOTE: This method *should not* be used to parse untrusted documents, such as + # YAML documents that are supplied via user input. Instead, please use the + # safe_load_file method. + def self.unsafe_load_file filename, **kwargs + File.open(filename, 'r:bom|utf-8') { |f| + self.unsafe_load f, filename: filename, **kwargs + } + end + + ### + # Safely loads the document contained in +filename+. Returns the yaml contained in + # +filename+ as a Ruby object, or if the file is empty, it returns + # the specified +fallback+ return value, which defaults to +nil+. + # See safe_load for options. + def self.safe_load_file filename, **kwargs + File.open(filename, 'r:bom|utf-8') { |f| + self.safe_load f, filename: filename, **kwargs + } + end + + ### + # Loads the document contained in +filename+. Returns the yaml contained in + # +filename+ as a Ruby object, or if the file is empty, it returns + # the specified +fallback+ return value, which defaults to +nil+. + # See load for options. + def self.load_file filename, **kwargs + File.open(filename, 'r:bom|utf-8') { |f| + self.load f, filename: filename, **kwargs + } + end + + # :stopdoc: + def self.add_domain_type domain, type_tag, &block + key = ['tag', domain, type_tag].join ':' + domain_types[key] = [key, block] + domain_types["tag:#{type_tag}"] = [key, block] + end + + def self.add_builtin_type type_tag, &block + domain = 'yaml.org,2002' + key = ['tag', domain, type_tag].join ':' + domain_types[key] = [key, block] + end + + def self.remove_type type_tag + domain_types.delete type_tag + end + + def self.add_tag tag, klass + load_tags[tag] = klass.name + dump_tags[klass] = tag + end + + class << self + if defined?(Ractor) + class Config + attr_accessor :load_tags, :dump_tags, :domain_types + def initialize + @load_tags = {} + @dump_tags = {} + @domain_types = {} + end + end + + def config + Ractor.current[:PsychConfig] ||= Config.new + end + + def load_tags + config.load_tags + end + + def dump_tags + config.dump_tags + end + + def domain_types + config.domain_types + end + + def load_tags=(value) + config.load_tags = value + end + + def dump_tags=(value) + config.dump_tags = value + end + + def domain_types=(value) + config.domain_types = value + end + else + attr_accessor :load_tags + attr_accessor :dump_tags + attr_accessor :domain_types + end + end + self.load_tags = {} + self.dump_tags = {} + self.domain_types = {} + # :startdoc: +end + +require_relative 'psych/core_ext' diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych.so b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych.so new file mode 100755 index 0000000000000000000000000000000000000000..ac4c58929802604cde6ecc94b3532393fbd24a27 GIT binary patch literal 147880 zcmeFad3;nw_BVWQ@7Ws&Nwc>s0IP@B2P~JkN&<)m7)zIj2sYI(4dU z-J9-9M-`5CnWkZ1ZsQaq0U1V~uIM(%Ws?9m$VkKIu|^l6^~7r$7lOwqoShp%1+xt= zi+vQFoIf^5;qBbXC+(GMzNEZcy29JJlh22$gSDzYIS;WC*I}L8eC#z*8?It)<280_4Z1!#4{JI*Pv+aB`I7U_n$OPJ2Cqq*O)NzOme&S2+u zd#8iXHkIQ1&!2kOjfuLwWc%B2Pz$wl+ZWj`Wzc8FjGtn_JllwKBk^K68;LOMzhAj^ z%!G||-W*okrO$V#g^w9l^8Q#_ED?WE9k&n$c5yib~MUiRjw_9r&W_)Fx`2LkPG?4Ugq3`e-80N4Bo_#tTYNchvy zu_NIxgrY~n&uN1GWf;{&zKTEg8X$& z&|4UnBiX+h@JG_~i6+LeXA|wtX`-r|z-P(klbDC&(QWN;En~-yV6ZY@i1bt2udcNC){YN!1UfY{!_ad}= zq`3EF6YXBrgq*iw;O0iA5uBhby$s{cYYS2{qm>a{EudlVhhqRqKVy!q9MPUy_`^i5*%Qp(OkO z*n#avlJG`R(VY1U7Zfe3EUu_5Dl&=+CXXwcRa#Lxr)*JWX~pDmBjzn!P&&DI=Dbo> zcjTI)lEuYEv&$9~&nvsA)VQ#C{=A|&rIke&lvXS%Te!fem|0X@abeMd(!UnXu2?v~ z=z`*TRi%s2HkvItuc&11c}25}%jOvc3(6{s$`@T&GM6l+iz|yNic2aNRunBNo?S}R ztWq>mS~P#*tSTrpe}a%ExQfb)D;AYjIOG(S&M&J(N1Uk2g+&!rGcRfMAi;$(H7A>54ZfQwn(M84c<}EB~D4-11DRWrZDYyz!7tT6D zi)9ODl`g21<|bAxs4SabI;x^#VFeKt#bt}6`PpTQ`;~#Hk-C2^n^h@8v7llPA0`zs>1xoUw((|i8Tndg^MWq)&t)iy7 z#I7l(`Nies5dI%{&|Ycr{Qp2OYhg*%e74qfyIO{t1&vf=PZyLfF2}%>&XRFbx?wDe z7d7q)$Y}#GEX16Gx1rOt29WHDIDb(IASETPUem2}@}L717i#CCQQ;j)G6|PmP>k7v z(P=c63#%&2tCS82kJ9ruK_h(^*OCq|!0eU?W5)(HSw(3T4&oCt;gCh;RWs+6>G`Fp z9KJZebbd)WjE!-hHxG_qH9yf*KdsmV6>30JvT(toN{M&HVqet>2D>s;6vN|1lAbG^ zkc)|czQtAZI0x8+;(2tF_(ZBGT~xjh)1-1CNsAYil$8ydiQovDxPYoff^UFBJ>&2! zNM$olD=_}Vn@FxGTR`VI)34}()saNYWpu;fifx(>&kR+S8G;z z1?DFDpIA)Fi!0|cJcz%L39-K@KC{a%ka-NWy>ylomlu-^dR1YGaQG{bw)e}**kA^o zQMRZIYv`iM3ny~bQ`5>uo`t1)GMB1(Wiz>O_3GcdU++Z=dm|%?4$-R*5dzL<=>%4k zsM46ig5e{I`t|NRz_5#nQor5``})@3OMP6a0e=4GEJYS7p=MBxwX^IsdkOydoGzH8%i&sX%p zBz)c}3O^$W|Ei`hPr|RBsOXL4eW8ZeU#;rVIip0AGTY$5pX@(_TA(i_bc-;ELFUx_)7CwF*bl|atk6(u!c#ci{s#7KE!(?9p2j2D})&(7S zIB5I|Iq<1*tYL&5_%sK;n**Qj!1rcAg%;JZ8Ua^nq{zTd-v5AcQ@7x6u%q&|WUd~XLnAz=s|9J`Q|0 z2fnWZ-^YRP@4ydo;0HMHc@8{RPy32E@F&SL_~pXb1@ci{6K_ze#Ha0h;) z13$un-{ioLbl|r+@S_~~Jr4Y62Y#;uKgNOI=fFoC`27xifdg+j@M9hLgAV+u4*X#U zzR-a;^g2a9ALqaa9Qg4Le9(bE&4CX&@Dm*PumgX(1K-Vox3?6m?&H8ua?lTQ;3qrq zc@DgNX2$A>1Am5teu4vkrUO6KfuHKY&v4++a^UAW@PBdO%N_W$9r(o#{4@uCnFBxF zfnVXkpX0!F2U0 zcA&n#e)ejCc`zS)JpuDTKDHwP^B_LapPomxehHWd=&_CoID>HW1e{6Om4LGdANn)iUmlRh4kTb6 zjK^M2z&sF-?MT3UP!oGN0rOxyc1Hr{fq3ki1k8i**yRbB2jH=a1k8i)*vtgX1Mk?x z1k49OvEd1r2j8)N3AiocjtQ6t-Ld8gmP+e1k3~K*u(_P2U@Y=377}f zv3?1d2h_2S3Ah*G<_WkrVOIh^p75dH-!ru1UZ=fR0_BfO+s7t4P2+aE{GPz&vPz&u!v^-I7*2zN}t zJV=f;Pry7tj=2&r4~}Dpev9`%kMMy6%!A_C>j{_##IYR-m*d= zu1UZ=0FGUrfO+s6t4P2+@Quw(z&z-UO-#T%;EfGWz&zNE^-I7!(2aFWz&yx}HBZ1i zz>T>Q@M(k({TlB-4{T!x5-<;HW3MM*9?-^iBw!xQ#vV? zc>?CaYpfyx^T0JWGXe9UH8wF0*LU&Zh;?>W2iTeMxxUNikm!UzN`l``f?r93cPGJH zliDocxy|k9{U?MvySmm{i_=|5_=f7umt^>9w}MI;S)u7 z&Q4InPBwkErZ3d=%l-%YPqAmB{I;Zz<}LYUU!>Kx>iyXb#jE>4+Iv!@_BY-~T2G@B z@Xknd`r+qeOKF-T=o7s(OyNbS-sFKM98%?g_V_{G4=~bnszI^W{Q~R#9I5^-8#c?! zx^B0{{c5CkpER_yq5UEINaJ72v9H=2sl8+`24x2(Tcmc%evHT*j!5k|D^mM?ary6Kb8Y1$$=|KI zLm_Dmgcw$vg#3fTWp^z}{*;2+xAG?!)c!aLLlufd2R@8lwsXer>$}ZbD#CYKH$YNh z?YE-$4r?u%0KXH1m}F$%Sn2e^H|SqPUr??Ek*~T0}L= zlhppFxaayW`~O3{|F?-Ms{b&>f7^eyzZ~?5{?qUUwLf7Tra=$!MMjrKwqJ_2`~Ezx z<{Ldmd0E%*#z0^=tRF-z(IxQT>v9Q#igg%fOpZr%go4`N^`zU4JJciT^X;Mfdd$GA zTaR;Sl7Zfz+lFl^b<=TQON~psj-!E=_Q4=`?aGML@xL+W)82-JMDUWB$a z+p?BlN~sN;`J%{WyHs18;`C>%H+erl=g+F?4~s`?>a&&~$3oO!y}v`G`mi^vrZr$| zPojB7knRL)Yee7b!=9|==Zof|p4C>&wmVitU1hqw$5nC)w2I%~a=s4083O(F%=|Ox zI)Bg_mwmlQlpZ!NS`~2GU{Bv|1<_HVg6Q;Mq;^XPq6=#u8^l&?Yr@E^W51VjHcf=IcxcR6bhogNbQd51L)JQsQU|0Kko`>E#Jh}wp&@%`!B_2DeLOZgn!wI zk*m+D2_i%lM5lyD(a>9Fu(4g4*Zw{Ho8d{=$S0Wi9^!{j(l~K8Sw#)t{QR zHB>lj`HRHg0DNuDG&Zj7vHT#T-qwTSfj{qr89Q@YL4-Hdr(z991S3}E4 z)J=_RJU|wnbY5`j>_~J(IF=4j=99w@V#~SRt-ds9E?peKjxE+5MAl#^80*8cVYPnt zARLIpkcK%WZDJXYO+|&!6-H$ov<)~BV!tESuGV-#d?h=&9hxTg0l}!ZBUhrjf%C90 zmaUNWJX*9Si=Ard`H|@2fVB&gut7XTASkH)8H}y-v4TkSesdD`sI~8KzhRC122joR6z9#bl5TK9up!ZfWX|TVsR}On_FGE)htA!H()fIZ& z7AZZxy80<@LuFc{f8T)0vBKE4L? zrqFvT+eGT5R9jaFnbxn5=*g5G!5 zD=-HG>H}1%VL-i;sLOWI1Pu+Y?W^p)Gd3Es`UQeA7lRnpX?bnVhd#TXgH$w{S_C=|2UpU9>@&pXAj`B zYP`B958!^W$ro^mTk&MUdN)ShIG%8UtmO}*)~bOSF!~ z660B7^Zg}>Z>;8PsrY0(*W2T{pMmde=;4^5iSZm)`)d9f<7#(vipsspWnXinpyy{{ zbbb&6l7UA*dX7eF>$u7!Pt_h4dm{5j$8qI?yEqByx=*v<=;}WJTR%CuxCOT+Da-^k z0Xggly`{3BlD5p2_SYn7a{w3Cer{!x-CilTM3UHh+3cN@*t0eJTVDvf@YP9YtUF** z%<25<&v48mJFl$eAHhJ@zon@i<7&_?Q8XWSrdiiNH%bByO56LsUKlM8j>>wRfrm0Z zxUs8~(#YDn0YF%lkUlahW$Xv>yGO&En>K;JZ@2!@7f*XuJNTsT;V9j*lgv)@{Y4bAz9Rf)Lm89zct4pKMpQdSua zrL9q1i&*uUC^z^?pK9nHZawM-ma^&vUFA_#a=ukJ@N`!FQ&ou$JGq|L4U7h(O7uC~aSXH2^F!0jQUl0JSfep!bGdR@^bdkKZP5!Nr z|AxS5`5Kbv()e`)zr=HX>#NUDjt)k26!LW>e@EeLv#(G#e1qhhSyeYw%FAT@hrR%O zq}F?gv3@>K*wO%epWrzHeg|+D!P5l9*^~DHg7hEUg#f$(VE**{bEfaKh``Kma#nv6n#Zppf%2)PHE#-+$!#`F8!vBiB#2>*pPzeu_SR;-Mq< z{R1N)c7|1K!pC4EISeON2eDl|Xmy2<#%GI{0jtjUlH?ixlRPzE$>-92o07K&i@<-> z?@Af}WO@GrR@t-eH13P@xt2tSJ;jL;y9NTo zH!8!Cx=Z$0*`Fx4uH7Bs9YS;hZdTcm&b@YC2z;_{J&%(PRxZ$sYR_$80fz2e$;ZC51 zDCixj>MOs9L|bmadnVXjMWQEL*Z+%q%*~zmqe&PPH|=7MGMHnS$qGv2*8 zS2tP%puX)-a$er>U`THDYp>sjtrhk`%OrbjFEXd4a7^@E&8I*@W5YW15zjDo0klp; z8;GCb{@nXx#A`MZ`#lK67FgA4_7HP5>0ryQv}JVQ4B9Wcg^h}S+=lL=i$=X~4T7lX z-J%ahqa#LRWh*@RS-q9-mQhBv$nxF~LOzN6LfwAiKJp7|AFFtBR&y%u<*XEd@bSyh z=t;Lw->l{1fj?; zeNaSxZsmQfw&ITf4ZHLKQ{<%IvM!(NCt2k%6G-lc1ldB6^8^{OkvW1~B1qY3lD!p> z;!}mSTNaZtTE~&au>!{uCu!VT;a(4Yeh_DKn3&7p0}3gprszpINUUWa)z?>Vp|+`6 zSEj*q(Ha7XE`Ns5M2Y9}h`IL^J`&ACgKAvA{+JEch`H*9zK1vW;0zYHtV5V{XmT%5 z7@bcEMYpgfAG>AmM;I(|uB_z~Q!rRNvzAAZ=bwb5wewN1uKh61fH`RW_yMI|Pk!A% zr1pBzE-Fa5p+^HWJ_y9;W{^kg_6xphfX8Yt1)yQH91mco;@}SloSzX<`(Es6$)B@c zd|$k207h7QQ_aIT7ZUlg4^YzaD7xh^o8lb;zq{A!1Vcn0qx;D=uVxcU)&jB4V;hN$ zUQd*?`KdgLdnaFlkJU=l++tt|uyKXN%8}@S@W1krLnx0}+KE6VDJpVh_aO*tFI3mf zfHqnapv0(5b3FK4i@}iRvn6%usF0igs`YrzSzCpt;7F~uMd}JuOg!|&v%!sUlMU7a zsHXbMd6x(IQE@8vn(q%4_cyB~PJLZnaFX*FW4^&7^uk)1}PpU^bf zPW*;v1b%I&@82WQ5$$x3Qz-596A-q=8`)`t2ojq$VJALMjQlUyX*4Vodl$pI8odaL z*|*U8)-5!d?G;pPnkc4vO84uDF7miJTXl{;1u}7~ci|=0OR!>GfbAB!B4msBlj@!I z=DTs@6x41L{&&D%SX;9JBCVPuiP;Mz3`#MDQK8dg04{OAOCc0B(oXI6s5(tAc`PjM zQ?(Ynd&yfn3T_mwY0G}sRi1#`&2bwdt#E#L316@H6=!wT2eQS{;9<(qYNu?3tB9+O z+GP3B`Pj{Wz}H|u@fS7ZoC|%d=aX$161`;+;?j^QQ((9C+CF8wXbrVuOUfGyaH?Kd z3w3Kpt+v*oOR?k8l>I)3qJAoy%MO*R8(PMLdC>OVRxP@ik*twBD5`eUT5B5lzx&<6 z@9=v*5427u#mho55(5~8_Ilh9iw;vWu7h7=mlr9S;E9wN&mhvG?Ml3kQ8&4{iS5dn z=pfFH@H~P+fv12q%ej&@)^&^YZNBsk)oP?ht*7dALx<`ctlMFq*Z@&153(G3-^*u* zQCZHci$TT7KIt9DWUpxfHg4P;Pgs^Sh+VdeJBz|vtHIM1^jqti7=;o(PJmS-CCUi; zC6l#QD%Ik9JdNYX@jTG`5{kqwvFoigm={jMB@rg#Qd#}wVUYa*F~D zxdlgTH9k~3O~{?|YeMe#(4>Lfyd%jS2##0~9}U)>e0hz8^WzxnKBpWzMEnS(J#|&@ zoieFvRL*0O&V$3~U7_y^^(j9;OlY4r_(%0h$9l zkk!ZvYG1_`Y6VKM>(MCp3zpm25D&~I0)Z#lS<9D$1RjUyuU6(;V2&;gi1oN(M+c9$ z_RtmWAc_u3L~9{BUe7X?2r|F+CX1M>C zA3VfFqLBz5q)x!lF!C1G%`gk=%CMXDe%_NVr|z~sz+atgO@lD*?(fDx;~ZqSs+YSh z7t88y>zCJAixajQb*C~4k=)`9S60nW5O8YU$X`vieumw9slQCrO6$kXjdY~=d zvhWzEZrtjpm)G4$vBM?_rpumQLT>xK>deM2T|htb$G65x!Iv;yIln920kWF z$K-f&EOm(vR%bGG1BXD6Yl_M(sWn`h-*jOM;eDa65^T>_X2TsLo-~%xGK^e|t!p_#$3iUCo z_p9=GsZ#wOdS<<>P^Aj>3{g)h)O3Zqi>P}Q>MVt-CF(kbTCGqEh`LOn@)T+kQ417m zfITHGTqfqULiYU}^3gsedph9&~s4uz$)ls3^sLs7a6vvzI`=PUs0)Bp{dOjJc z{Uw(D8kev5`-nJ!#4Bz8H}pEWos##-)Nzy>3KvFu zRdy54I3unao`mClK2h&u=v;sbt`3!GfmJ{a6I%G@PHTLeuAd-xSVM@3wrdHoPpW-X z%kG>Y*aFlI%oZZIb+7pPV4FZ<7EX^*Ypv8h!CaH$-?MSIyOuGnZr~x@hRS8y6S@lUN&)$t;L@(F_?XWLR=z^z*wb63dWUrpG0~QM z4_1ve-mz8lm}5XI13Y>iwZKse9JRnv3mmn;Q49Qkuz>o72mMXd@!yl^vdF;Kgoi7u z%IB4a=T|MN49_eLFPt5oSGr(M<=k*TBT~Fz);xTNy#4L*j_=A=-(QdK(8iAj82m*5 zT~zp4`nLk4CJw0Yus1ZT{uu+sYy+xJ|5|}m*=6~a03-3s5Ao7agWsdRpt87I=;Ia}E0Y?DNN;MfySfu$lXw0N!%`*2eLRgsZ4j zenX;Y0aU-BRQ>9PF`rt%sbtVQ8EZGbcB(DR(*X4b!Hp);C;9~=AWf+-cn!xBg*r3*4MYi z26YMY0m$1v4_e$hbw@r8d4J>^ke`jb8*UgEBIj?+RU_YneBKM#K7;RTUx&O9`6lG|BmWe6 zI(DN$oQB+wd5J@Mcm8++(!$Oj-_f;@tJ9r9_&HzO}c{sHpk$a~^> z%w5QrAm4@jCFGwX{~GyW&$K9e4Mp}zh37RR$6-@**BS1og(rq*Hji3=lM9$a@ z-)Kcb-9JFu_8;nhNBv&ZAA?-A(U89_?6AK9KlIG6c27nVls^RZ2T_lQiJE^*hVRrw z`_pv&iSc^HKOZDv;Fh31i1|?BtanXmV2AafnFbnu#evfCv<%;fmF{X!l{Cb*`3!mm zXz=zB?(k^Ovohe4MmHqBLa`EcQ(0%*TKLarJ0sK1RQi%O9rJA4e@V-qll>92>zs0j z*SSZn^hBz?t_lhtgTbWSS)iSZdA=l03pTZ%q@=;N#NuJT;%ro4lwUx!#X0)7$KX(Z*1uk)_-jjZ;& z4pCkNV@LWh+TDzp_-rHkF`C}pS`@%wb52YEeGjxRafS9sYQG%yLvSkiALO;OJ4AWw zLI2&3rsYZOezU%QIL0^LpW#=#N3HTis2~g!aOu&dyn~SU2;||Nw?_7%&4P^ei23rn zW_C;&zRF!t=P6j}ja2*GlUdgyWN^ zK}oo^z>Rd^*xvoXO#qHxXQJ9eOkAQm$NHC0zwAHMe~tQ$P1IAjbOeq4sHZGm#PN4S zzfQsp0Pb)Sj%%Xly@tHgfD1Zslv@s5Tj22OjqU^D*{EvwSum>1f7A~_{S)zeHBS*& zIQdqww~Q;DQNJ0qdqJBX_f5o=F^r9_S4cNf`|zir+l2M{7fw=poJKq6(3}A2M{BuU z$5+Ja>pybJg^up$O;AxWWt$5;Rjm z6Ct1IgKaMS`vEpXHVM=fyF0!J-y)B;B>@PCj6?BBt(fA`Y@y9Q6 z*}of#KZTM@vm327Z2x|!ea2ze|MX}5LXsThIT9`$mB=+iH-sYuxp>~kOU~+$&(H#J zbRZYc^LS}8W7A3nYq3VTrnk?8aO*BtuFltM0XBYLj;gTr+@lSLqkFmR_T)SZ7@H2S zw@QC(JL44~f!Atzc&DgA{Xq?HYpLY^Tf?><3j6=x=Z33}EUS+m-#nd9(D@9Vm+O3) z&R6Svz0No4e4Ebq>U_V>59-|LtJ)9hJgoCRI?vPj1f9>&dAZJ)>3p@$*Xw+v&bR4& zug>@D{GiT_e!6{~U^8dRV)7+KUXW+V@8ZPIoxf^%&G;IRpGw<@%z+$dYw=uV85mP2K4STpu0xP zvAzmNDp>3tqC~vagqEy!8T%0d75zs1IWw>Q*(zU#Kb7TGqq0Vye2m~S`krU=+e=7q z&7aJm=&yO&rr###nuftQw2yQt`qn#a`nwAF zrv%e?Jg8EZpd75mN7h@Q_qJ{^9p#idQUv@rv5kN?3MMn?WpB)&|4Jf*o@s{=TO{hUOo=BJXduAT*E@lDmPx!=h7&qE7!ro@g z^1L0GEpzu`X5h!g2TQ?axC^A86Ni?st|BLqzXazHdP3_UsZ*?*7t#H8Lq`%zDof0j%9y>M(}-P%|8O! z)i)8*{An0wHH)F<+*zyRT-!R3m@WM&?x3F4Elvbo=6S4q z7Il8Qke|jjvOmUWaJ2a^qE|HdFw%a5%v4_*p9iP;(k_IIbYB`bG8vv07eUjkGbph+ zsQfEXFtQKequH~*&cs{>VMe<_ATx7)6ZBl4LNZ+Dy7xenK2xJ9;w&VeImPU2q%Y9u zKOllHWdNPxHmEeO_N#UE-BL9<#qHBoKJ)Yxw>|lM=0vlPk#W5y{u#0|Zq~qe1a8v+ zAL(|uTLZL%5q=b1HT_~tTb#UPfI4&CY|Q&(_^i$JcV_>CNa;wKoA8m6!qIT88JYPZ zWTeR0xYk56xe-jsRdt1#Tid~~X%ysIGoj-J$bZ+t)1)LbGwWS&2d+d#7%(?wovv|E zc}V3t6b#%6WOtOiB6TLx^8hdmq$d%03;;dzR03N7%t4`;z_S4EMd5Y=F9Y}lg?}O8 zYDtBfYlE0}f#c3Ai?6eYYX1iG3sMeMv&lSm!KObXO1exCB8h(4C^RQP{fe*x-yI|8R^&SGsu9c zJVVyERFt^B(Y5XCE?A(ATH87w2V@(yww)Qsyd?|b-_8}JTIt%Tm9C9i>DsttrOV_> zm)1Rd5tyf{m98_(ZPaqt`BIcK|BCyEw6(3IJR9qM+D&a(4s0NyS_?a~+&9w7F!rVQ z4Ge~={!zG_O7HKdG{b*EI{+u7+=+6)Z{dC?{X_wR{-qF@K1hI&zp5pGlLQF+PsbmI zrJpQ7H-GyS0D}eS_5;Jz_{iU z0W9+$LX1uypLG_1%l+?Az-fVVAdRmr060Bs0e}_$7zLb_aU;l9`}gA(F8%D>#i&{9 zp9#CAPiu8Kfc5^zNH$&6+2CKmcFsu|3Z9MrsnohCbr^t6{wXxo4AE_y|4X<``pm$U z5U|V0EQGiWf2&79ch-f7OX)o_M=eKtfzwbQAo@fO7qvQ>4g%yDlt+C?8h+*Js3J%R zT!NAi-e?oHFarN1HODuTd!EeJEf~}~-wp))kb53@4);85)Sjn}+Vce70Ks3{sGUz6 zwex8ckeyE^cRpEj#8W%RKz24irWK4dvgQgh^Bedk?fju)uzYX6CHp?^D zLz15_6Equ_ChhoF_5d)o*-xMj7#-{28-BLxEjRyyE_k}ZdWPpsC~JE1v9WS_o&~qt zGXQ0e=l4`ldUD|@K2LAVC%>m0_<-kD;8Q$P(P*ltIea|LbBK=W*@%J9@KgYk>A4lP zS)O~^pn1=HG~3+sGyJNB=X8uxwkL>S+R`%um>kcWklfl+1IcYXKY^>Q=UR+^JI`z2 zZSN_7XLT?-%3hF~`|t2oP;<2x>11u-XfT)m||C6G?($wHFMly3!)9(Y9>;=PW zFBsN)!H)ego-)iSSNraRQNpWWR&e%KXHj8eSRln~X1s!`_PcvwEYr;#2FLb~fH5W8 z%oX3s3#I&!Vj?mO!pqx6%CF5yVg$=8D~uGE+2T$BfnagfVk4!cnZ;&;M)P1wD>J1V zc!I*y#?(y36&D&Q$C%9-VFJdOP|7#nLQu7@#u%sMm}#QQnQ*<7o@N@`G)8B_$-1R{ z5vTw(?j?HMmz*fU;zdSEFVioL7#)9yvq@KdrM_E087|{89d6y6j=gM{(Ru}1z~wSJ zc7P`-(mQ=zr#CRNY~kZnxJ_qeww;0U|8KaCBXLo4{cY00;Dj1x)4l8$DbNj!QZ zR={q)je*$!q|?4f*y%y&wC{U=8n8hl^D@Y4J}+1SD8OZ|=yH6x8E%d7i*r%8nd2AW z$6($Ow75Fw0hEJ-pT=j4)dGYD^RA%98dcMAAWR{)$zEdeWnj-!@E9|E6&=R(Ou#%1 zd-&3Co{>2VLy`S-=bu2;nWTMxhR%`ft${J9_x}Jt$bPmNqp#s#j&Ps-Z$B#n-uDq4 zvO{K@#{u>6&Se;AZ>CY}L0*Qe>>j4XtUM#HTlOCBHI%jxJj_VGI+^jw<)e)vxIIZFAUH=EELrEW-dwC^=p;OUp=Ntydt6{O62_c5F&RvOk9|Chu7ewa2(C3_@99HIK=Ukm~89n@F zbSh`H-j}#xyPP!wc>K8-@SJO!kt$%ENNH=3q-!oCb2O$w&b96dKxGo2b8FUp$N~@I zqaDNMODMR><(3jr%98>__FV!^SLCb@z72Eu!&Kt-^gmHH{Ph^f1jzPZ3ftz~Ej%HAkh4*(|k|3P&gNax>4PxU{^MjuQ+ z1;7md3viB{e+G*I%=MpzPUUPAb;|vG-7x2&bgnjw{rT|KoQK7z%VY`7d88S~V7bxx zH86>>enijRiI0EN5P^=U4bVP;_wmt=W@85%(Yb*XDeSQ_xe{=UT`?(MAthByhY6f) zlPn|2NTA$O5?vg`gagxUV%kg*-$D+$y;}*r$|l(xCrNZmaEgvD6L`QTrlmzdqHjjv zJ-e2sSKS)K)|7z5cI^PxN`?5DfQsZK)CBsop&XRju{Rv6L>sE4h)0lwZnlaf@{wc+ zhc#%Yz-$m^zCe$9)XjnHycUSSsT?`V$y^U#$*m0EMX~^pvNjIW)aF%Z7h8wn3pH z0Rl#VbeV7BBQ(S9L4C*V2pkfFLnWDWfba~!*$y2#66h{AjI=I5Qe7>il%2j zRB(A#qt9;7`xr=%Cx(FPH8NA-Dxt^SgFw~sb4*_);mOQfDd9FT-c2Im6O228;qRac zZFgTp`WF!H75%QvS4f{DEw)70P0uSZ2I#*8P3UF!-%(wV3#&35l$brCx92v{8J;dM zi|P3n?CSD71uC~326#ME;74B16KKxoS%tFS(;KD>cus~MDV{gLn`(3~fW%8p_j}-L z?g>TBl+z*D`#MHDRA;uM1E3-py1~p?%!(28&9!D%0!9#j9cP4YRuFutFQ}V`Lu<^G zhe^ANBYmyem4M-Oqt(#g%q+?ec=^t7=vGt0bI1tLv(fw=X3Ac2O6^^$78QZe1~Vnb z3U0STe>Yo;CmYTCgdQ|g&fqXe#YSBb#NYlIp@$U|@O};ZgdSB;(EA+S|8X;$o)PlC z1qTgnQZ0qOR3r41f;xNeq2V{1$IunJ8O=kXZDz_%@y2#EXl$3=n5e#6i3lnYd(2Ms zg=~s=$xQhmF5;C2BK9^A@p=OhZ<-zH9@)mQKA{z+cQ}^7_M13HtIV`PFid;?X;kPo zGwl)rY$0^Fnf3&MvBv`VhnYshw!gnCfGyZE5IC7*`MjA%1GcZA7r$kuv4h5tLd>qY zmz%*AXh?P)p&B!nE@#L-BlM2xXCndc{qWb&duB7vxj|k&(FlE@pb19zvmoUo(@kv) zuD~GBb02kW2I#pTzJU{OSlIOB;1hRz7+SZ{{YKDjb-AwtQTIGdw(YLAZ=yV80Ln97 zbp^U%8Y+!mcjZu&p+@^Hmx^dgKbPCjz!6mXdEKI4AElpPK@p?-d`#nAu8c(xGGr*) z4Ls)xo&)*8^GYv-Wn3!AD*t&=K^~*~cu>CNat{C@2K0Sb%579hoa{rF@=WDqAG^fK z0?G^iqv8aU_@Hw&?WpIsRPNhS>(c6B148~9a0x`E#nga+7gH1MM+R_FahSKyMwdfg5D?S zl{s!dRn&2)mAeDuP)Nn0W8D6iQ5W_Wqlr*ww~TZjFFPALRzU-l?{rt*qJ6uEg5cYA zXs?&sO~nGk&`N*}cfS~3`hqv(3Y2AkzyPgwJoh2AxJhUfJcnt)sqnJ54PvurFf5Iw z24Ttc+zEADo-fJeIT4>8&)HZ&ydHiXj?eP}*F4Xwpb2=^!*>zH(WO*R9mJ%0+QTK% zJ%h0zW_Z$o$@DCO8L~W8n5aQdSKyl&-P_}a>L;(8dJWlv>hxc|!6FcQKSV|7cdvGN z38#N5$m7kRSqz`l1&r=%FubPE-4$#Y*KWR)^%O7`5g>G&uPr-jc*nsIp`JcH0X8tw z^!BwZN3%g=SSWO?&-*Nx+P}x(bi6O^JOb}P(NI5M);iuJ!4*&Nc?0adc+4PQjs$(R z=A5jcfcH_VHbg-|?+YLgouVMjgK%iL&wFZI#7JLAlv5%`D@cooC`gMKt00+5r9SVn zxQIEv4g|E{mMKX4?Rg4<-*Q;dc!kfqC(c>v%O#*WFHjI}M`6p*Vg&`gPjJ#*q#&${ zjJ~k&QlHm_kymzD=F5DL7FM0OTtQlc+G0t?A&pByUDo8V}Qjjp+@AJ+h zlMMfZ+Tz}xT)8*;g5u_0Sx+AJNz?>WIP|#B`%f~-CUcX`w2jN`Q#R92@Yc{~dzdz} zn_E>KY}_rh!{vIXDP;pTv?7>hJS&B81gU80PcS!*QsZl2FiPhaib zPCXa;TGI(Pc=@{lp^JU~8q{s{9_Bo(@%di{v{yyKt9^btmlf)TfOd^)z%WC+X}w-S z9y7E9)?TZifEoG-q2y)-rJJEE(E2(B1&#F;^!-y`%TXAb_8Q>&?(RoekqlUrrTFhlg*0 zi;xEx6}z7cGaU4}>6|6kBh;9wejcf$xI?SqA-FnS371Jrs~2RRja-7hrEBCM8(9hd z42|q#BZon9rbc$Nk#6)ROC!TJawU}N+m44sc%*!lYQ66xpzLNw11Dif{B@XQ=1P6y z&Tl|8>jVh+yQ95nzme0!$!Zi=}B|^=IIdUmXAejC@>cM zxx=}9{^>J`nr{;rx%{Ka>=mZiWfjphkgRlWo^Baq+d$>kKg#L&X>B2+)wj(bCmrP^ zK8&&bgE*_|CUPcx3kPWJGKFdE0r*tgaZ=Hh?*p_wPs%@2$fXp*15cytU69@GQmIM@ zyL!UWbt#O}zK>vg63Zh&#YNBvJc1F}rjZDWmG z6UES%rr7@w(Ogg5a)*{Xf*YQnRb2`kUFwY7&Wva2E@2s9qutyGxjEwMLz>GyfNrLY zRwg)=r2H@fzrqGxe}y|AbFF_U5a+RK7z%1HlRFk#wk=j{SF%nrroyVN?^AUT zu#S(R6hXXX+Lmi{twv{EQv`cY9NX^!$T+68 z>Eq(5rc*!Oe1`mf^ChC#oYC(FhNS6!lfUQV&>;5-IDhv2rZ^=+m+pc@oUY@cb*CvF z&fgqX$zy<1|BgNf|J5^2n+k6p6tuh>}+`tlG)&W zA>TAzO`X3{)viS#!ka@UmK*BwEpQMu#|jG>Hqo#+(UqEr=IAR#kdZe`%V>Ltt}e2x z#%NAcUQCK8I@6r!N~t&6Zqd{$ZR&|m>hOp-wb|Eb`<5nt(k3o)5(kGTi2E3A4{GAi zZQ^sC#CuOk5ckLF_UQ_2(UF}-e=c+quXad=8pmqlJe&9mC-Js%3CSlIZSytpe4Dt= zNqq3s1n~f)?OB@mW}A4OlQ@{4AVvo(HSu#c@qJF>@Yn<~B(K!OKib4kIEhy`lzguy zKBkkl#!e^kwuXc9v?d;-h+RuyK)it#bQl=QzOAV$ZIN#{MXq)b!@yr^;+wU|OO(j{ zLla$sNbf`iK4**k(kU{Smmr47R+{)5Epn+6X}^98cQhe#fTn7Vi6?I0I^ULpE^X94 zPU60paGKZ%<3%%Jzzcern!)f*a#T;XtL1f4iuBENRF|u2*HYlmci>lO{3WEt?|xN4*ekyYI)U6od4Mliq|{PMq5|)!9Gd!ObCv-iJ2>@P^t`wZ3lY`9HxB_Zf!qhsnML^MuJr%$|1Lb?^T$q_6gr8O~qYW07lR=C3S`aAD=xub2z9h zs3SNQTe-}2wYCKhn(b+=>!2%N-4|;eQr3C^FduWLcGm3wVYGtq)dSL&y;__YZ|hj> zha}b=FgvoXt&sT?QZqhwIbilC?tQ>~LL=>es@ne<@Q+Bo`yK74L)a1LOX^llHCATS zWIS0P**#E?Ch~cZ^}Hz8)dcstZ+mKmo;O>waejrE8>tyj!=5*fB`y!eAxNUoi%Ovx zfX_hc|0%S3$>gD(d(Hl(Et^fp?axSUT4N~Nc-QnEgr=_JP<1s}qDZdx0PaKKZX{n9 z&A=OjcU7lkb)M|H1SWr6*M0|I>OmpI8ZGA+g-x;=fNe^xxOCMANv7^0u1ZjgTn*djeScA&LKvM`0|I?*q+1|Gf#MD(t`%;=lgk zqL3~tZ>r+3;JsVM9nNt z;CWDTCX!6*l?rzo;J+aa=VRkKg?j?$~hk|pQHvC1l@aVvG+V0JnMOR8+xe5v>g3(&P- zjVw7Q0@EK!mK>YYYuF_v3HQB}z$NE2(2hegd>h89N-jCaqgutwsYb?heM6(x9En@< z@(IXIVT!7^3sAX{6*C^o_agO^^#I60hHZktNs<<^* zSGkNGZ0R<WYamFoMjK{D`om6iP#;q0<$+#7R zgik1vaVtBGXRkVL*=+vC0_?ao1hgk0N!*%)LNSuWEt@$t&g_g^Z}b5V<5m>(wMY`T zY@YNuk5)Jlw{8aQS|lB}EU)tSZf!#0aU@)+&mSRf$-1%rR3+3j z-l6?(Hd8kAgSxc;E8u+rN$k(x=!hY;Aeq?T7Afn7EyiuwC8zzbrAXR8fZ60j68ncx z;LBFBZrE(T#sX~ncLi-1GIQNH5ru(BVt<=CCC==$|0K3f`;P|wNF=ep&65`AQHH=n zS9{%<0@_JP+WwE6swiBBU20_iS)iVYB=%o~!ui5(q`q+k`}@uvs{}Icy$mJe!P0SS zlu@CHxIXw^*8rD<9~6gs&9P(N@c_|4A;AAYl5lxp!}aI%d}SfixDEw#sp;(li4uoi0m} zg=)RvD|Wv^QCWY+DcnHd`XkBuGhX3F5=N5s=QM>Y0(?4gTz@7g+~a`nKoWya)C)Qe zp0kj|ppzP|KU2&WTz~lYK_if4{V6ZBjqLJ3=ecI*2eGZ`#RG#D#K^j{2Gn&(vhLU% zUc)Xa3E0Y!lk1M*yI70mdUG4l@%5(HI7RJPZ@!GHkV_TLGrfEZS;qMvX!Kqr8RutF z*pB4;Ni%SqO^|Y&6YI@J-9loVm!e6DcY}15%jnLQrkg2iaZe)g?q3l6K3n2GIXw%l zAhjTw#5;QmOT4qicnrJbjCa)($#^#a5_%&^yemTCEF_6{Hk-e(06X4Y3EIoZ%y`F# zHuob*ytA28WOHeX`_w*4zWTTW)$|8f+TA&LEM=9DYAQ<}ehS zZ57hBMup+_Dhz*v`cIG~40mW4hQsPMpigr=TtaH~L^kM5dDEmE@N6WREuF?ICozpO z_O+Ag9X$lj#ogImpy68#GFx_{@C;H5lF4lOUORxy7F&$luuIO_!r!@<+42!2d_a+$ zE#IQ>HImF0o6Xl)fIVCO0PSyN=4{~`V`)e-TWsc(IJ0xMP*IsJZGml#B(uflNsIF+ zLpWwj572fONpe?zf;N@QuuF|*3tvSXge0@20EIEaZlwNpgxMnYKR<5&rL_NXX3FlN zP?z>E0`J*KV*jNmT!hquWMY3?q}bmU<2LM))BX=pB%{?$kZ>bK(*F0Ma4(YB-)8eQ z7GT?d6KEeNGwsipD|aJ_{cYxyI5TSG;%ad|TW7R-2iUie#QruG!z(H_-k=%#P2)SZZrXjBE`jL&^js*&5m$ z-Z-zV`0eCWTSNb83dybEQ$TZTxW@1q8K3D2y*0dZ21Zk(aEwP4PBNQclLw1Ef~t9F z^jxHg+Z}W+p-cJPbiD@b#i+gzDJ2)9VvF*|ONPEu@Ls-a07$L^?FuAUR{-l!xS7nu z9nAhl%>Hh!bXO5b{sG$i$UG6i78IUF;w5J)f7cx`jhESxVW#)bJkat?>0a94Wvu5K`A5T@5VAlMh>l3?NU=3eOJ!V|kJLL3ta( z8PM~Js=k$jeB;DA1ka(v4rH>WM2BCo`7UINIsLo;zW4{4@GH>b8Le9bBc zawu7DhXQw+ll%1M1CNZ5mM_LS>6BiGQkm?w{aQtdv<}{NpMkO)jrEN@g}w#4--y(W z?-YI`523dKe2OT(S@_K<6!Qr{ehb1-TJ)Q-MDbCRfz*kAX8T>3f5_xoljoDahD8nE z7kfu3o8sO!QZ-NKUXv%UBb1+Fqb34nWb{X*;H5g?%|v_B0hPX#nkXv!Lz=cn_)gh;*GilY9r@ zYeeyt@LS~l%p5fIJ5ZhYoaxr)>N(TirJeX^R=2h1pDuB-4g3*mj~flnP3Y3ya_Aie zXEjn5|6K4MK|KNRA4oZj@?${G%QSrGOV{xg#{MXCj_}T8GTtId9qOn|RP@CeV}EEf1velA%8UmxFGZXEp;arS0sL-( z2L;8y+P(uRi%0zb%;gEo9{|5V8W;ut=LM*{7-P4o1>NY}HaJE{>cqcZeo|1ptLnrX zmZvnhcWKV>8FxSXM%Ns-(oWuSL{B-temLZKg$?2>E& zfyM&tUD6ED{)NokB}GxFL6TjP&72lzcJ7jL**bSge2w-2B-tg|JQ;Bwt#D$Ov=y|Q zk-))SQg3Z2SG0+RaQ{67^d}?9 z3>c3>A(G4hTR>_f0r43y9kgeYnKNJ^3jD?&uwOI-F(d9Nb_x3jxqQR%Ucyx%SqkbU zNNG0$xE6(|u*($xf0%m{I4g>)eYpGf?Vi4KXJ7BI&afje?2GIJ3@|V(!T>X%UIv%} z1ZHp+wvSE3Et&`>CTb9uL}Q{Dcictef|}$t?iv$GM2-3yeThj-)cAj%Q&so&44^UZ z@Be+@@T*Ims#B*FzooYX!wB!Lh7^-G^aDkVZZZ9DeJR$4V@XWhY`ONaPVkAoU3i&^T~{oT!Ie31(XU+13^`@p_jV0U2(qP-+E&47Upq zITs<9NHW}v<&@!Oh&Yys^-@%2xIIjg9B$Wx!nGvH;dTciw;{-IGsV2)37FybC~zNP zVGg(7Ao5=bGTcnzNTP6Xn%U0UIoyr_|Mv(o+)SBhqKsxZIn8_o+z$~@g2Qc?7E~w^ zJ8roB3)r6{$Z$(9Mg#$Wsm3(Zz0{&;>yToWa69 zM;f2h`Nsiw4$E-BjV{KS7=mb1B_cBrM4L>p)Z+*wv}p-&Ygm}tv<{Iq2q@06FgKwq zCKenEG7h!^dkcb$gT07cgaB200UfY3QT#eI@)rMHGW$&)Qcx3-6r)fl1QE$7M1~=Fr%zJ#QY3{yRZAFd zDYro&7wFuiK#+>3zdD%$;S1m_ble8pFv1V7)@US@PQOGK7D3D}>4wEUSNJc2u)Xh3 zRl4nG$;0o3$gM=^!(GBza^!F+z;h8q9BV}!zXtd?f{0^XQXE|7&zr2;XIt+h(&)Z3 z9}?hU=)X|lQv|WUy}LuB5pszn_Sf7{E%w(CaT4SdQMKH8mLzF^D?owY2Z;TxL1Ynv z*k41yJDz~CzpH>-&%(67n-JN+!hFZv6pkcfiQ20$4|DH$0dUVlz+b9)IkD~9gDNbW z$lA$*W`(V=jh8LThC|}=;?z|r|2>3UrpspXUO@LCq^_H+%5Ya28#AQtZ`<@MFd}T z$9Mk-efa9@j8nc1!_>D2)C56JdS;BE+Aab(2SL=aQq*x5z%2;F;96YW=J-=UHxS7# z#z}*mCOi)C5R>?7{%kqZcoX1jOyYONb0o>{2}NZR&xPhn(nur?L>S)R!6WyD$h!zE zFDTf8Hk^+1YJ|yGgTjIWHYoEL4wzK#X5_RYqz4ZN6tGWy!0yx z7mS3yeXje{wmP7is>lb6pnESP!^2uB#PBqLZisY281Nu~(9iKR70@JRUmpZ64+0kk zf&T}2+=7e9g%7R-2iMtqy?epKmef`s#8;Qb%aM9rgy9C!8jkZhX6&4 zz)CI8khKil)I_#bg8<)NxeDa=AmlP#jKE<)k0Z!2mMQ01CZ;Ndz)69o==Z>V1HtlI zbtOE(YCtxa!ESd4o>_dTb7)UAN8Aqc&$c$A=Eac^bXPd~AJF;$A(!dGQAQtV1cGp6 z%DJ+kRy5S_JBFhk!0m=$rGF<-Z~7Mj_Q0*t9~zn7sGOoZ&d8YB_;JkyjkFDguhg`b zA$?IG{brrcSLwGT(qXw0FV%YwX%v1eeMO*NzHMfu{+G_3rH886%80XmqG}^wO52L4 z+)4QyO0VM24ql7ysr)GG3Bqua+XxDoyuWZ4vL+}>p!u-az8;Y?8%p+$l)9F0-){TOI zc>++FhJ4F($v#yl<`XVZ$1QK!WEB>%(vLv>1B5=j_N8zD?^Vg{i*rGQKJ4DYv252k zfWr~wki1A_z7pVa1kNW#@{!4IK--zpj3#vuq-y|PjgVOljyg)xZ2)gUSaa`0#S=J} zztN{#))>wjcE{W;NU^(fzUY|SKLulM@5C{jGE7$LixX9$wvz?Si9BIY=HwNP6S8&# zxl`IBs6YnqVO0M(LN3!~@E!s527(M;Q_izYOx1B$S71-Sjj~QWgqpAIw31cDl`}WeOiM z*xB9r-QW~HO0cuX$oJ(X^FYbpEuWq*J`2%mSh7s-!9CIpv-7IdIQj1fDuq00D}a0xif$Z>>_fIR==)= zKnXv(?!_ZC0A-|By4vz_R~@4R-zGB`+oHDv4-@HP#Z2jj+9u1t#7^UCXCR+-1CYTz zkQe>>c&(obQ&j{d^Ix~u%|Mj{d4-UFnR=neS}>4r=lFNna@!4Jq*T(E{GMr(-E9dj z&$PSAr{N`W3TmN9@uo!XLc0fZOINShWck&qUaN%9;(ff_2|`aMQ0J)TS|uN0{QJ{{ z(ElWIr`g?;genXn-nHpZ5Y$d_Bew~PBUNXaK|Pb5I#N)lB~V8O**n#s&SsAd687p6 zsDtcc)y@#5&{qhZo5<~Jq_8U&x!ol9xi&v@8@JAB49Zl|XDpa17{aqqA z&xqwIYH7NZ{Vb82u5%maQD|RCZjYri3z>jX`>m!#3}x{&OPtuq{*Df`L5Rjr_)r zF&iy8fR2d#L`dNy?FOA0QpMD>RQnS z&|l?QI`^Fl^{;k867{dP>}jpWN)&W489MxYENuhhIYdiqVf2)1vCye1gwnYW*;dz& zp;GQf>7HL0x`1U+vcN{W9}8GrmtbhP<%0O%3B+<$ClSl-F$%E~J>?D&#MEV)Q@~n~ zKSGn;E|S|Pk=sS}ht>5ImQ9h|sfpYaeeZZBpRl<{SPM_|22on>5!voo<1dAkaPMZ` zw-R}G%YEe|n(Dyb!!l=Cl@FsWp^qpIK4%>y9xteiR^>;a9@@|NGtAipKzdBdhpts! zHa-hAIE^e{upC(86@#5Q;w;N)EgH<&8q3+BVrwmDW6}9cTW2|&RII^rHW%@ZZ!8wD z>k3bk)(!(P=~KY+t)ta7JrlVjC3jvTcckiZtLv>X6+>7J~+>504%{vDORm#0cG2{8ly-4x5NpK?!RO%H) z5~q8S)GIqO9=V5zwz%3VW_-|e$oAFfV7~&=^yywCIy8mUET8U0q9Y==Gw##9NOYtC zSw7v1L`Mk_^XXnBda3}$K0hCbjuxPgPxm6xF#-(o>0Tr{R)A4H-HSxW2{6&8dy(iw z0jB$WG#4!sV6I<c(25O!|z>0TsyW`zBEn@{&5(Rk`~ z0QdTIFA`lUydCoCUL?BAzZ?X#dy%x1qQ`)@fbK=2{W8YUy-4H?4-DV9sk_a3#6U?u$3o;o_b1r*Ef@EnWT9h9ez4$4zU2j!`w z!{bEpJN%U>Ssfe*8jc^b`QOA2%2P+7@zhahJarUSFy9JWg^MKOTZMHJ$+8NYB~ok^ z8c!XCOTj<1*(w~*|G`M%EENeA8c!XC*9(s27aC6;g@;s1aiQ_lQS(!j+KInS9afR& zi5;}3jvhlXo~4W2OT7?Oq=WL*QJC=5F~WD@siQZta-JLj0m4%U?M%*{DCojdhxEYs znERK=V&E+1n=$S`bBJO^xl?uFsY5JGlnyIgc3r`)q5+N#O;Hg6uqK^s} zo;o;KeQQa~{m{LEwbPA-3r`)w3O#kW@YKONt#a|y;lAs0ZGSo)C%EtDQr~7 zaMr(cxP#7S@T~Su_Kyn5ct{I}3ii@Ban7z?}t0 zJN8{LFK}le8IEyhF$@#IAcwD|(VYd^9_1K!7G!y%HJ^q^^0hk)=EQvM&Y}l$imd|LIUp{1+?P zi|G&kEczfj!n5uI5}1idh^0ajV^XLLKURc^gN#3m1t{wmXQR+{Y19U;DENV`Pl- zwLgpA04Dm{pG6gb>Av=7(F92%RkjAgDtNr`HI{aDi+Tf+W_GfVfz$#z+vmiU` zeeKU82g<+6*ZwTX^-eL@@Mpn3*liWlor?&o8O1`$pG^R*$aSbJLit1%8>!OTI%l?AVx_wPjtTv@PyX z4ZK{QHXSTkJ}<|GQwjpUe`^VV9}19kN-+jydWcgBVdut-JIKyAaZ0h36vQcoP`EFH zA4z|OQ;LU)|4auxZN(nX$VmtO$(>UCnfPB68~j%??jrut?r2ju=M>Iz$I!}9_)ln_ z6TY)IlEb4Bcf$*i?uBpYg`(k7h{X@{=~*P)8^lt>%kdixZ|#H4WZ3Tyy$nA9{EYB$ z#52Q%D3uj{0kvd@dCZ*?o`JHt;k!XOFMLK1OchqAt^iVPN8O4ZE3hN4fi;JZ-eWPl zGt~ja{a7bEa*P>#_cqqW?jVZAjBa)$iq(zE=#j|CiuJK0Lzp3&c#6(&2-%+55`8=CG1x$hWyxQJMtYCl94gi7He-gGBn03D2z2z zY?2+hJHf&fLt93}RKvoESS;6eJ7Qa(Bc39P?C2phG)M05?rKLVjvTq@yQdwc2$qW1 zi~)9(&Ca<6eH9yNN7>XIzG5DmU`N@YoLK_^OtYh8)aus@eK9xP&Z_TdR zB~y5;!cHNpz9XI@D(!3zgkncLMa)*vD67*@Qn4L!JCQz4sIANGM|dXjzxQ#{sR9(? z<76GkrHPM|qhwZ80X|N&Du|DhC^o6iWGqDJzzxt&NKC)C`# zLUTa#q&`kMX&)!Ofz(O+I9Z8!KjY)%fdohJaY9m->TUQqQPSf&KL#Hs^gfZLMizXW zkfTA0KlnHyG~Md74yf>PLOJ*2b0hjV`5%ys8XqUj(N+#VP6&mqPTI%GQ$R$A!pF%F z)TERQK2D@Vm6E~7Nx+oB$B8y&;^Sl`3(07Lj}roVG{MISAwOz-oDjmsjO|VnA18F& z;TRt$tlLs*1|KI>vlzL8j}w08sw#kw6LBb_hAVuW5YiRE#|a@+z=op&_&A~DoHuEH z;p0Tygs2MOKSn$f-qx3Ej6Yz`iG~*=o)&(u57!u*u!_hC_rz~z zI0NZf;fujQcDMk)IpM2-lN;U)3VGoY%#QhC8?_gNt4eUBj7!i_W#6#F-FZL0HqvKc zIBOL+RhD#cScb0U$P#d9Sj6wE_6`q=z|r21QEo)o8H8fcrj_ByPf0*V(CTnE0$Q8a zD9CrVqC{++f~ZZvz{Fn{c3%K;j<{E82uE88yh7DDJDmBm5RfnmHig{+7%xSBOSnLp zX_@Y}D#&;4qOxpPP?jU^Rdy-}L$Ek@LD;4JQzR}5$EXUL!;2N9Nqk#Dn#83F5)!wD z-F*oXw}lG{XcBiQ$aj8=F%r8=L0OJCNx4Tsm{z&)fUpjQ-Io(|9t&p-NV4*{g7naP zQbAa5#bVEe-6#&M75~qNI}y;8zo;Nx=w$^#!c=IKd@JmhCrZ8@?m|G9d{;rbawSiinC`lN zP87;?I}y;;Wh+P*%2g1mqt@0w4y`_7$0mfcegiA%h-Z{(;X-bREJr+}RD{(rg>yDg zV>82Q^Wyvi!zVUNDR|8J6vHSsM=5x*^Da*BVyCHcqZ~e%iOpAe6P@1^iibO}x@u<@ z23u@dSdM>|I(#oN))Y>;6`ZY#)-~2!u~t>XPDlI>ofA%>!e8iY!k~`rR=nKgOvTDG zwkMoIJ-|=NSBh14?3UiR%nZ8$^3a4BL%u#k{o)kT!^5)u| z&wz3Im4d45&J!TBSHdY&=W4q%y}P_0PT^Im>+R0;?($){h`My4-8lp){XLvA19^Mw z&Rl)kZpv;zH`$%{pjYzT6l%;NyE8qU6uJd3L%4XkJmNr$Bb-J$JrA_buJae5MLJ@f zO_=E5^Tvz}p296#0%_V#3gZ!H`W|#W{<3P(Q*JZ|coFA0otXXtnD!(wYcNQr=={T` z(DM+6uM-cM#0fCa5uJFiNxTBZQ+48PCh`7aXsu4X$s{(SQE58yT9bGa7)jTOSD3_K zqC+!u;vSQ@3a!i3i5Hs09$+a;C+;+fGeI+3CvHk4qSJD8;(C+#A@pHfXP$jVoTc9q zdBFn*K)Ohw9QgsHJQz_^CXYU?SU2=zhw%zwBN61JH?{)|c7y{Bmium^90hOn_ff>X z%=T_fppT^I1~_iG11XUq(D5!kz+vHGdD_8`8rAcd*etZLu)vn&qk+=s)u$XujeUt$ z6b@7MDA#_eF{6r%9Qill?NE+3*_I^7{`SDDfwvK=}HI3XU; zTV3cHrPE$P+I%vksm~PS)-is*Cnc@^KcaEj8?yH?iJ#Y6T^>ed9VQ5!gG{C9Lf=M? z6)S^`y7W=<<2QFo?v$q0g&r`vzAwf8oXDc+tXL|PrEsGvmWmT5RgA1#UETu&9V(?* zF|(wjx|{;pby+50T2=mirmL$iH6=NxOh9bIxIDB5FD9cne^>)a-w8d11 zRS-Hac7c9GAkD3;K`(KGn*&4?dfc4DHN*g+WuHstMF!nO?V*M1CgPBJz zt&wp^{(DLlN3I0f2bI=zSr5^Mh6z_Z+zuU*zIXz9o>CVkMZN+T?83#6Y{?Jo%;})I z*W_9K4?xws!FR}ynN)^6tN$i8ZJ28xWRh^vCoQmI<*-Q|?^8nh z3lS(SQB*5t{ELuyX0geW;o4<3jAhCK;kPHVloH&5{^;?D)HWuOIxPil>-o{b1O-t~ zQNd|+NRs)7wTZ0GXus8k4oP~g6Ec@1vXZ6h(t%`0L*9`Uh~V${w))@RcU^aw;Pg5L zk}OA$d{}VS*(wpQkLzqQ^q$FnuF7PO*4b=8dWkN5wl2+=uHi#rb^wQ_UTSC!;0(3A zWdWQ824_nEXSn5U2;gisIJ*KkBk|Ie#-W%wFW@D|i1RItV@kY4Z!;BpF9xy)ne4k0*+&A|b4>RA ziR`}wvKvgcaiU^*UcF+4b${Dr$JeVw%PR_G-(s?jqZG^QAIN^zWEajMZ-=C`@rPo07YDNWb&zBm4=9$mKakDu zegxo@;Tw`J90dNR#c60`U5gM*cF`OD{a5y##bSe20o*%!b9 z{7XG@oDX;wLeHCETfVfTEQI%mvoY2Y$)`nWMD}Wg0bgikfr*yC-@x|tdV`6V_tLC(LXjAPu(~>dXJP?Xi&%uL z4gh*T1Yva~BEt!g)iOjT5Fo2F5vd?RR{6MMJ^`{CN8}6yEA^%0SlyCfVI5iZLYdDS zR@b1&N(5o`+ytJ91z3IDu(}oKTM&fR^AXuifUNF8Q#tbL4d6O7?JA@Grg|!&)zp>5)M~5L_h7oVvmF6dk}KzHS5z} zObVm)=S+IO8L+{fvCXE0%1feU3?LTGIo(6ClLKa_k|15`_9QbG0 z*7d_;5R`Kmo(*j#26tCqNRqSn#cf?PF;o0Yz-N$q4?kN0U`SjNVn`< zt{sN~9)!?)KdO3dER4cj$QE}{vU$$l=eB3_qc+?>NmkDQVmS%0gJX6_rt#&PJD4_B z()uzjzZ7#ZLiW$VPRt%E%>+CQVZfN>s2qPk(8jKkg>S}BM_XQ&m)!mKA7Nl%Ia4%&lA{P<33c&4% z+>B6h1AsNU5=w=C?3*%LL6Z?q#0-kPWQZ8Sr$OT>1TlhdAo4nb7{TqDsBM{8x}u&m zf*%3*Lj*B`p@GOo$h=q=Y- zU4_Uz0vz0DB62zb4(?Tm)Dz&~ZbD=|f|dEGUJTM?($;T7qVW5x1i!ZlzxB{7;deXA zZ9x!zUr+FBVgY_nV-fOuDbT--ApBm5$PWmR-yb1z9Rc!t0Fj#skl%xd+)aS|K8naA z2v+7@?fBhl`2BN&-v@->O!SSKl2Gnx1mX9y1ivO0;MZmm^80(Bzkwk9{t1zH2$0`n zhdEo6@0yze@2HNLPXTuWQ31HvCqg7 zHSYkDF$7Wb0f_WN5H+8#iQ1Nl9jE3Kfjb^S)O+@zZo!fEyhte2_$!2YS0GtVR-o69slcU?4pEVCWySLt+a4o4=_Gq2a_ z-0v#-uvn|&q=mh%`p=?;k~P;*yQoUc>yEK3&wi=FxIY08g)b|%_? zIzk!ODyB?05i@1{V_BjUX90B;f+)ofM79y2QhX1Q%Ls@PBXTnVD#eqCJWha0{3as5 zLx9x3uQ{Bo+J_y-e8nMVMM{v<;tr(ro&sGyYp`zTSi5kAZf7=+?8d9tCqDY3IXLKh<^2B76Iy41tMhxs9#qhav1^Y*SmlnL9RlrAxSNpFAp@T@s^Kj zGZ9h`>Vh%~4r_p_(-jmr3gqIzgx+cdj)Dn6gz(;Lp@^B`_WVvfF~7Zgpp&A*HIG~E z!j?&D9U|A3Z&N%@0)PDxM)3uZ?JDg~z&}LD=Bpk%R9XS(XZSATd)VU$lwIS3o{G~RZuKJ6|yWVaMQ0(7F#m9+#pGKhA z?+GF(v8Udp^Q9A?4p4hXA>(GHHs*Q6;=9bq+_!c2yW3!dI#0w^ifRSC*<|X~%zSfVJML3K}MLt*LoIv)eadc7K0j zeEPcNpV-M;H9-0S0chG*?+AMH%Mn^dZ?Fs1&SvKhQPCTf7Cntlz7IiE^d~B<1InZ# zh(nW`RN5lI3z$ZAyvddgV=dq~f@t6@EpOY(qXr(di+p5>2ChM5HG*iM!3ztX(ZG$! zZbj(J!lHqf0Qwe!*uLu!xrPAs@Mc7QN`U%!HzIcupk6+L$U_Je(0P2m&Io$VyGjGn z|3EliTHYfXh5f&{EsEBt*Mk&42vEFGp|>?Oen3NS3LHsfi z8vFbi)#r_X*C9xs_tZkLt$(0e`&FFSAxrvvGa?%iq|XgrSny1rpNDLEU+K%j(&twJ zx&lG^{O5=qAizGq50Qfe*yq1M5A;7FNUwZ? z$T0$(3;u-&J6U?gM;kl@>6IKrvIwwOIw8^l0saD(D)Pw_!XH+~usViC$m*#;ABiBWPDZ4R09l=d$V>uMphbu*AV3AGMI=sutgb<1 zH3E*^^d2F}>V4IQ)fdQWFFWrO!|Fy9X+{uMAJcfYWnuwV-!ZIS2=wz2gw@Ls*+YP= zQdzDdKvr)=TQVJN`S21kI20U@Y!=5tG})`tnw=$ySH6%%@{4!CsE`v1Yz|R zjRz-kIu>AcFN;vBuK@ie1Yz|Lh`dRFtbTyVdj!bpUlF0T5mvuM31H9}QFuu}gT zWYybQt=Qz#Q(jgoqw-#v+hvPTT%+O!Ep*H;uOzUB{6%4_a0*HvitMu&rH^SmO-{og4|O#jFf+1kPpo}G35ao znY{j7A(Pk4djdot3+zizOu)+9HXS>UMT$B;*I_67cGj-(kn>f@%7?JCDfI6E7=lPC zLSLe}HzK7RP#J=IJAl&>sX`ddy8$l*N(QL74*}SQ)XfM(4g+vsz|UoXzC+yK1Nbg* zKN<(C&O<`OOsXW?7j=>olN*5hBLq1yp~s+m5ah(hBCeH%*X#_bjp+B}a z5Hb(wg670TZv3;$D2mL(I?tSoaLb##QY`fqoy|8RQh%=jzDeQzO9On{Vj7w+!XJCK zmamtq^_1E5CcE5Zr}kW|5I;tCYJUxoE@sBRLr|-0RK9IJ$<+{Ex^I{OndIR#>O(Z? zU4#@LKpt#E4np6Tx$Y@ON;g2A5ZrzMrXn()0PlcagUE6MWdQadav{R#N&p|Aa0=*8 zngxId=1_ah0Qv8Qtai=Y8ptj;*~#Wztg{cYc?UGW*H=;>)BvYUu>TD7;A5R+TYqC) zbL^taCxV~Xk###bJbZ3__ z3D8~x{woM6vjNb)9!2Q2DnP(Lj(`W(A1UVnRxlCF;i z`CgLf!EB?)=+II<4*0@(>Zuyw>mlA84e+^BBPv8u92LQ2MiQ?}SzfJ1;yL358mSqD zSL<}1GhUNSPu;51`QnN$Sr(rz7kf&i`^>mEqfCAeJ=6+vbN5Q)d z>{&&Z^n#Yj(=#)3LGtp4i$;N$%Xf8;4d9M`J34O@LRUV@{v<7m5yW}>N`yYY)YINT zj5S)dVL0t|e`GJ{4%8yL4F6E-FjG!mqK@XtsDqE=K9r|Y4};kK2xA}Da|=!(<*%dM z#r09zg@n?17uQE=EZb2o;?n7TUeu+uiB-=YlQvd;pM5ThoyDIWyt{yRz!mZF`=8V^ zL`@;dVg3}&;h%a?3eSPNUy{S4C*<(`0Eh1fIMnHVKKU9Bi#`A=ZwV`AGEcH{tzqS@ zQ^?96!N%{&N?1?(ZH4uAfR(octmyPUdAiiegjKY=H+`Y7CbRHQ>PEO+>&EZ;6X73V z<1YxJ8*hqkbQlYpfY7J%t8^oyCte+uI?O^R+1yK62X*7seyrnE5F3s#w#NyZ`+A_c zuLqi|)B6njy5{cf#;cxL(_GDQC#8FMko*_Z+~;K|oCY>#B1m&zl;$=8T#L|W?N>GT zdWiIwQpft^>R2>Yi}aU0$;5X-?AxY}UrQZ#0lbxUT+*%%K3qu*w}}|iPf8sVb(3M^ z<8=#qsuZ8aEc9y-U@QQ#p3# z<~Cx*t6X3ONU+eC>KrjtMNjv@OC-XTIaW<_b?!9X@B6==fM zFOppSqAgb{$Ig8Eq+Gq(hATc=zh7~6Tz|Z4xVm5Z+{R+^GjJt+{-AKx4N1H#vCl2- z`U5X8B>STfdUco7aYWahY&loTVq))-mY0FpI0WgBdsNE{(DFv0Ny`r=TYj)@%TreJrcZVGP*37r9VhjOjY&L`Tsv8*|J0aVBw1_a648F?=AJ63h5Xt3`p?Ai z6t8CK*QpFiccPM;5rowN!s-hEpGEL)&@&;IV+AP2HCr>r(j7XT@8xQqFhdXTj=4VV z9MCk&s)MRd$cH<;Tz-dI884B7+N7)9Rbjbn7M7=_^EfWKl{NaSF38-?waS$}_Mvw!JM-h31 z01r5xMdWD$Jm7cp^eSAwXC`I;5GN0A2v*})9}jeZEdxDhdkP9kQC zBzAMB0(T_wxtlZiULqFORd6>aJ2`GXCnLyCZXP0YS(rOHQ`k?$OyR^%?o8mG&cfWu z@k-y-2>i?3svDQvS?N2}43p;ZOC2{v5M! zN1UA?WB|(xV3XzgrBCcAbFJaLchWs-e;aWMU!mgONz%23^WI7Ku+5v6xII<5hix%t z184HyNf-A{G8@RechdcdkYc|mWZXMRQj_Z~7xzxG8f*AeQ1yC+_^CYm;1rrZ!1+X+ zI~9W-*G{VXdF`b4S7{_4$16-+JDI@5t&@Uz>cb%Hf2730XOKfT04$`{fxmA^)@dZ( zKba$!CX$n3a%tjl#^lmOiOHpj-(#9wnkX^3G|>kY>ond;n0)8jggoj4H zHX80AXGRWtzjSmTNtld+rEm3=_#ePU={`)%K%9U`X8|7<~ci9qOC6 z0wwd*9fBcseIW1#qKfn;!xK0N-qe|b61XROY<4}ON#)Z_aaUpeUTu5CN z7gATnh16AX(Mv!ftged7xCISQp@gsZ-otN1UB8xrsO6HKN9`{_JW>bJ#gRs^QXDx4 zzY`->NLd;=4=6j`w?NRc-RJO&|E@$1{!_QFx$5>c_i>{5?q7+LmI z=JvJl?ShOihYzVpaoF6xR`634*@?eRuDX5A)wiz|@_Mn92Xmi9ej0BUyL1m?S!ujO zY!9Qcw2u+pE2$xM`Bm)m0bs;QVVQ{YDzotCzl&6VB@=5=!eK;ytW16i73pI$Woz3k z{{a+=)G%i+bJieYWoDPcw9OLy+Y|WPk)!DO7o$-0M=bQD$+rBLk(joGiN8%IE=OYe zRwnWqQpFPqq0=y`($_I353Nq-=qk3LyVDmko1aQKQl_XYK)Z*xbS3`B-)rhWEG?dd z9;A*#kzOou9&GkG2&q?~_TEgn3efkM(h)7|%apqS-Nuw9z&V8}PXPJ_g11eRCttTB zV2+D8)_S1u&$~)zvq3MYZ1r}1#QB3c1@msvNEF4VZIM1qAUzhK)EO;Mlc^ks{Vjp? zVgPAUTcm#(q^y5vq((u&ahl7ajXzl*X6an)cJO{qR^BR=x6dGF2a%tvSGfwg!>Jls zxGD)E8skL7!LXBCAjpmsq^WMYB82Wa2R)O*_q#h56X7?I@~;q5WHH#EN$&tW!lb)N zWfYUX1o#hxRBn1ZGo@%E%oTz+ST~5uJRP(lIDVTnK_^rF>s2zIh=6mxkCrn-=T1Xz zLehLj!re(hKPHUVx zq(J!AM6CpxkaZFI+g9_Ct>z(H%|o`Dhio+u*=in23Cu&8Y96xHJOn(>Lupj2ESZN= z0`pMXZX}}`&O<1`dB|4t5Wal5fQf1zvei6ft9d9TFb}1-n}_r@py{9+oQJ;p7Enjc zL(X$7Wjksfa@0KJsCmeF9773r#i)76QS*?a<{?MTLm@K{h0Ht@GV@T#%tIkF4~5J; z6f*Nr$jn0_GY^Gkksr)MAu|t!%sdn_^H9jlLm@K{Whdq#N6kZyo`-S*^N^pMhy3I` zUu z&-;v~)AicxpS@3vy-a{Vn~1F*f|z!nwcQ2iHm16JkylKB;lp)&zsGY`bShZq(`8u`4O? zLd+s9Vju5}h!8R4I|`q=)C7@7r(xDK-4Zsub6fUEY+`JSFxiEYBTro^w_SD-MOR!3 zc_=>E#vndUb4(V5s=BjVqB#o+tD|U3lmxpUmx^e5h#DGet>8_I+f?C*C=Q7(WrIKG3IAFIYxXTtHLvag zA>J`L{yQ19>YQ(rAS=h6g`zrA77C|(*FCjFP>M?&)xX8YI+PrbK|0+|I9j_K))K?L zhcX~NQ(;p$Wnn@H)(@3SjO9S1`xx0PI;w~IN-r8oU|ro->LsC?k{j$rB^hK7FC*-< zb7|E23;)uMB^m7p(g3O}cF|xv(f2qImR4w0z;iFHRoY?=&c(PCB|rk}8j@&(beys~ zLyaUL*&Jp0hDj|6Tc{c}oEk(bBQy`XmXT(3j?#K5=^PoSng$`IeS2{Kr5eg(bQ7c$ zjpkU*wGtmI#D<18-I!*@&UoG1u(oaWVM1XW#h<9h0qB!fnc)eo6(KJuG`4M$sV1nc zlZ|wQKb*lzepr$fG#S7*CC}Ba}!L6 zvT*LgQBXpYX%WmsG%uJ+vsZ$R!+axY@X$`uxMNultr9FB7DO@H7A7aJ1%=r*C$B{? ztk8$*VMfRhJN=2rD7P`nKu8sd1&&B&BU2vPy;oX6V(4K1F{7 zi=0I>sVChvQM~Aqlfu@l4dSc0a9vbp>4spAGOLX`N%$;|DjT}K6l;%QO=kxu&887p zcD0*3xejuI5~H}16KG(n3(lQ^ITyZ6k}CrijwI&MRI?_F>h2Q}5htzfq?X=paAqX+ zgZyQhnK!Eq9@~;_Qk3+SNx_|mL5rU&9n{Y3Bqz||M46wQ$_kP*SfQvPX1Z8gEilW# zBIycML3{hCW=YJUZI)}akDc00E}eyIGueznkuHhqV0cJa4d||>&0@;*GND+_dL_n) zCl+UB4P%yP#$NY0;dI*5&`xM`uY^sYUYW&EZ!?MX38->kwKh3L>~CT+>v!BdfC*Ah z!J@pXRRfaaptP-R9!R?~NK+Au&A~D_!IyL(numFj>WYJH&44!bY8FhG`r(Oz({92U z(RRWasqJP-As0eQ{PJy#n!|z$rzS|Lfp}`@j*en1s+o37kk{n;YpiNACPp*+jBh*1 zO_1KuoGU9o@nmyNS)vZzPa+X~Uxn=#1`6lDz=C7SNU^u&#(oB8yQ#W+N;-23gsoP> z3QkLOTyW}|ZWetNY_TzBGurc`*P=6Zn?!z?_e>egb;4r1aXMT2vRxvkIt=iV6m(3Y z52+J#MR7_zwQ|KQr@I>5wq0AyOU_c{m$TG-HA__`XQ>5AD};HCv(zFrOI5d>rE1J9 zwOE@u(L0*CC2iLYr)#?;`FdtL!%Ssonyv^;W$~aP(*>65O0@iHrC4BQTh>-**!Rn6 z^j9R70jS<+bGzw|vM{SC%y`C#5<8gHcE(dSca_q1OnQlaH-;6jP?#AJlihI>U6ArR z7B=IVm1#7!f^#e?l z1Wo}W(*LNAXBN6t3C|vsWTHtm;$)Vlkhpj>#|!Doc4q`Fa*4~;C3(qAR10knRGVdn zUA7txWcK*|MviI}Hjc-ud|p!5^Qrx0ufQmCVOu@oqA}JsiK>OEFW51`zU;u7vB<&H zr(-;0=#&_eqJ*XZ4l6)BvGmiTJN{@1{iTkUFg+$$DQerFJXLBdaeV#AZV5^}qS-F- zDYSr4Ptt`-i0q9t)mP~!?yHRBg`AlbGEbgF$k|57>a3}afzLf&$nB1qk}}ITooii- zDbmH+_7AD_w*6T~I{!nWg@8y`A4f;lPK4VLUPSmOLQiD&MyNsv**l$U+^_@ai|vF8a`Bg!>lS&=W;<-VY0lL< zW+1=FIcn_z?0U|XJN8KNBVSj1roz8Uj9NH^DB z=tjnafyHhHa@_~rjE~(kJV~|3BJtYAH8nNB%yr$aIHa=epJ6DlkJv5flH>a*YWm3Z zPY1}1{WTf?v!B-D|BDb3{naxSkR?CK{$dA(?nOrE3H(S`g?>%&b%ICn6K0pXA0p;` z!XI|7%gzmb1~A1!uRC}|sCwARW~>W-LVfV#55`Y~{hCT|^eI!AF^4hsddfn^_>?em z24kz3+sGdxhc@$vih<6CCfqiTdI0J_2-_5(H#1j6>q4|mt~*|9#S7c02Pf1Dj~Zb+ z*EzOm#H(A2TP5KqPPOMW9{mcUZ+WmN>2}D=XX^aV4v$bKihgt zu>k$Gy$siV*rQ5}n*p7uMg%fguOEOo_u=W0$RH0HnXcR2wWqo61Sl7D$aB85+g7|= zL{zzWg*W~(VzhY9?(MheA>|f>RGJf+;TAg^XCz`RCx}s1oyabu-_B#(L){adkqzNO z)w9tb_qy4u*s$su{Po82*G~Kh=XvKo{R~-|QR=39&a7%Tl8;EH8|m(*pY28_xakM^ zYkSU~aJ_1)^mhxox&;F`)7iPLnj_TN>5TQp%aH!tR`z|Kn+ivM=;-J1_{7aauZM89 z3l5xHcGzwNLe2DSDJqG(&~qgBudQs|Br1ude~uSLM4U59kstAZP~EoVmmyX1oNX*Q z;Y1}pXa4>ZGJm6H{`HVyexK;rH)Q?|&BBj`g(UMYw`cyx+uAYznlAa1cFYG#dd_#Z zlKbxdO4n{i6W?~bLvo0WbF)2>QguCL#pc(zxp)p*Z+q2*a-~0ZiOKxBCe5T&QRYlN zKL2OC?T;!wJ;Yz)+Go4&X4h`qg~D&==6Z`qd*c_o>CSic zXa!aZ*}H{57)74*VTd}K>(`gg*zY+bzJ|^VqE6`gG*>|gl&dkYQmUHok!7j zFkw68iW!V1XQqle>3EC`@JGTYx&h@Ovk=XUjEzsW?Lk_q=Uf`9cO!+;Q4r_BZOpcv z0VKn2rrAZD^7cSn$_~efRej53)b3r2=IlSINdBlrva7UoPc@C+p~>3tzX+v3TK|@>uM;P2PCb(`-3wSwrqiz4uVjy(j8KYK(JOcjBH>P;pvXL`q9VA}0`1s*|sT zv_@kz@PAZT%(|Q`4u_Cms>FmlrfuhC>9L|*H|k}N)fVVFTWsNe%JOA2RLRnF3T-z> zkEj+lV62-(dK_yT-C^Ff{@DGl9aG|%qQ!CFHZi?U6qAF~+Tuq2#p7fefM8H(e#LZ@ zZbb}?daX=iWCK@7UbVMDn){uTD#d@?UbmCfGmgzpv|7wWyHn>i8|WO(~xMy+l#D~l9h+1xG7%tjIr8g!#;rO6{5^%B8ol}T@^C` zEk{a^!)_;MmRN(K`%zz^=iCHS$gEelwU8N@3G3*|xB;GpH2bAU3A%y5iV zD>;v09W#Jm$Z?^j#0_Xz`xy~MWIputgt#(kfH4nlv4hmyv?36Uc*|v=w|*09TqRJh zUj51YBjP=cE<`g?#ct8aFHP?sXQsYVBW*PTZEdH512CwNUpEf_q4n`w-#{N92jbgY~4LM*U8`OhS6Y#lW^ z^fluC>hX_t-|p>d{C^2s_-~JYQL9X8(dW{l+oaWp+O(SEAYX7EAkKIf&of}Bn_Jv$ zCw~S;;N}^wNabvZq*X=HN9i+FbPQ8#&J_!v?+_V0qKx=d@@=T)78}!~gb}U^|^`e+K99=cemP>tn3oXcJ~~8sg>!`*hd66R4Z9 zPPl>pWBqslQFc zXJeb>r0KYmLBcU7)fU1fM04itVN(arU^}_oM`N+|wmrWz_a%Z{S5>u>9H_8kVsY5`rop2+<7|^_Ph1lcYh}b|w zY?5@HB6cf@d44hK$oETp?AE;8{d%?ixOG^HjNJuR@>R4HJ%O3}j*!e_vPcR0IcO(7 zu8xF?@zoapoV!8R_My?6-Do2U_%-NXtTV<_D_uCp&cY@=xK8taggW%x#wFs9q=BEE zbQjcKT9mNNTwEkc1D(ICP3Eq#?%?ZW`gQytLV%%Cci6Q8hy8tk!!6$LVF2Da>B{gb zy)rzi#q!y<`?XlmY^ccJuq>tp#g6yHE9$SDs*C|W>0?dc-Vc`aI z-v145zHZ8_m8Gk!SM6O?*ZcXi2ja=aUQv|fJ`C#uIHTWhe2v-c}lYd0_jVHu`dx)|VG# z^g=Sc%5aMmiTP-r4z%EUjB*qImy5 z81ENi97eG8z7ktFT90?PW7i+yBIGt32QEAuSteFQ_Mxwv(UI7PMrdtoZ0euvY}n7v zk?nTr40rHrdcrw~#K43T>c>?{_?YKJ4`a@GzMTy@N)kBH@SIz<4XNkT2~_j$_F`p2 zs*izJ*&)mJKWnZY7yr%PQco8O)e*Q;$o;`;Or}nLDPn6F%Vlg`i(A;OhDUg^XKXoe zwTY@VGECwIx3Eb8Jii;i*uMt_6}1j+<+3`!qaxH#_j>=p7SbYA?ZORKPLdW5vTR= z36S;&aJ>Hr0MifVsi!r0cv^A7r!{HjX$_yy@M#*K+VF|ZiJsQ< z*^8KZ!ge(ui^$U%K35C#DM?tK=kQ^TE6?BBKCF=^apB~{8b0y~pWum2xZM*QK7@<% z=}b!E=}ef9XwfMdSIclzlqz{#I; zm^*l!hs<*hHw|*Ny<-@x&<=B}8xAXAakkVQF(CiL;K`X?O;( z&`sOm@Aq~==e!!v+353u#0fIaK3PUD$&g1@V_0;?ejMkqA#5PJ#I`2_|@`&mOCyypT(nD_84~u%8IHJkn81`3?0lO+*>@j6IhjS z<0v$^>|V+BB94+$nc{5WNjkUmak)joaHQ#V=}cXeg)eA zoV~~y70ip1uPV@|v79GhyD5%bA4k$?9N<&s5!l#j^;BXSCXg4Mm)R~jm}}HW_uTx9 za|gkq@lcaHYp{p?C!hYNwV+C#8#OXDmy8{DGo)P*Q{m#EF| zIbdL%Oo6{u8yM`2$7)g6f2E{*Iu}7mvI-=TnL_0C1QAVR&)3lS*6}o6`(`xKoJ$Oi zd%;H~n~#YA4}Fw$U&DhoB*}v$N`vPSE~SQ;lK4*?i2P$dcJV3gP!FCaK%|hScTFx2 zZMeu^$s-HbUF>$_@@#`wJ$|&ep=P(>@%e`B^W^_r^iPI|lL~Zomb0RTz~|dBb>?A* z(ur0_ccD6?W*0_Y`8T>woz(ncJGagDQ819NPO-sK#Jk2VQ9KS)JbGuCOk(p*hYKV_ zv6%ySP7;<47LI6~cdVx(LHV# z*0D>SP#tA%>MnPXj9WIbz;{8qW`@V7Un^C;f z6uu*=X*8MTwh)Yz%#r;Z$!8&R6=gPJ)tzNBjyFroE{Z9sia2&a=Q2H z<@C^r<&=#h>v|Cec7ATQKh*7fG2~d5?DAu7Pj9!IO}?9y0P?h!Xa%cryVNDLL@Xrc zOb?I2nqC_S-_13m}tUzuEwNz|yC7tihh~5mA{69$k zjS!8>-2io)>}H>)!6rO|z-d83S)J5UH+!a5yjI{&akFO`5FM@6@YSyu@6~GbsYMp_ z5D$7q53`-h77WTB5N=_!o4bZ~3UiXKnT+bUWLdBui`< zCyd+tJ<^z&Y|KV!%ujV=rSaYYSF%pfEYG>n-sAZ#HCT7#nK8Z#X5IM-`^k9&CK_wT zP>&qwsdH%io;=aG+zoEW7m+ekEX#d32s=s3!53P^7t~PvQB=kEck*C7Zna@OxKMKb zxplv+iGb7Jc^s_{;gziix3|!WVO~}#wt3X7CZfHjM5*(HE`b?emryCTqX%-ZL~;ej z2hxSk<2bIMWF4$rXo+aV^0jIu$5uPl^8BMHigz87C1s*0^ux@af79O{Q>6z?2F83)o7`;7()9Ei3n9jR9rD(KcTwT0niy z&F6Xoi9KyZU@37n4=jxIw|IcZO`2JF6rw@$6u_H_B3OcS!-oV|e^7&+i!qR*-lK@U zw!K{Z_%2FXviqGGITxTA8m?AK^GJ3Iqh9nX2%#=y&P?o_su8XfVz zi={AkVOa-maWg8AfCukzswMlhr_{>oo9@%3-=&s_=U2K}II7@FiZ(VkXfLZ(i|NC# zOl%=iPp}o12bfMR2l9VVGGt1=^G)k?P!ehoI!bM%ofKmkX3S%n#9V^D{CHGRpGEYK zhz{0+6@OFFsYc(e_DL9N=(I;|`|aIg;vU^DJMC(2=VSwjBRm~ZM(%7mgTEg_y_S2z zqL*EFE;S8rvE=na>XsHa??Sb4_OX0zb@Q4P#8b|39I4PY&zCjUi6i45#F6I)w*wD5 zW5id7oq$0BkNuBNuW5((|2LS2uF{eU7l*DP%eHyt3g0&0fTJjEcaMMD9Q%T{Ujy(B zb2+2T;C*eD{P672=Ii13mIJvwo(%D|fAxC!vpf>yYu{lW4u*JEC^0!Egu>%A%-lfa z6rfWe-I?ggY&UJ3e*4*6A>=d#vS+xNd%4HYlt(bTQ39_Ndrq2u0a_^Jl(_aHHwPyu z*kGOC6*0 zg|`mW3~1>Fx6{3NLs`M{T(ic%hE=&Pql|1FP}Gf zNLz5IwYITgW$}u})@5t!tayBNL(AYHqb#Ygd41jT)wOHm%NrY-TbdK)rdG@@tE^aD zt`g?YEuUObRvDi^y<%!r0!OMk)mm43R%4UZw2WkjG_s5a24R{h$> z+LnZPid!3+SFdcSTcLy}5;RH0XsR`B_JZQcgGUw*9$GrIbWrhtbq$RJ8rQ9E8L+ml zwthf;Q|-FC0qYxqS=WTjmez*4aVzT@>Y7$B2Uy#*eAT#3qecuEF|2sN%HjcYh7=E| zHw4<1t#59rUA|_(`liN~I!bN;?*C+e4ya#VZ&Ft`HjJxpUAq>Eb1Np}x3+n6!}3+Y zYiw;E(AuzZb;F7QEw$+XW@Mg}pvqXjwzhdyfU=U){F+&l=2XU~R+ddussmkZZCV@^uZow=k54Zzn;WlK7_XQ;rMx;`HL23tT)S>wdIo?pWF<#%)xGoMSjIDLa zfjqywe0Cgl$1A2-@kx!1S}f(2Rr4{NF*2tFYp;X;LSLTCXZC_wsxIAP zNf13)yLy>0oaj?pB#32`Ehs0Z~b*md-B#gwW%Fwe3sJyyjVc9%ueQk^B zKIt^EHSxHpWPJImHSzk|K&Q^Hm_4nsylT$u0Q;I^MKu`~{!E3YOA~c2niNM`6_geN zfCyniVYA}v8dtQ!M9N^7pM=!O((I~v3+A)H>Sox>6?O6DVyhe1V_2`SYRYC+#wX8< zPlC0ZX*I;x)xw4D`n9#I8{(_itzWx(`RW#{ZbKcqG2YtH+FZ9{h_$h)c0C%{)VjPS z-T-@H#p_q&w%$hJsJ5k6=7JS*To#LgAKy~Dc5UNws}|!LvZRfTFKeo+U1P06P2gIx zYg_7!N}#Hy%>&RyN0%)vk!wH#V(8r1B~8%JSLPy!lo0Aa#jLW2elSykJ)O?5cSA>?!f`g@`F3%qp8Zmx#0H zOo0x_h~~xIa~f8!oLt*nH??u?iYiWW8=F?Q)WsF|P4N|IaG)z_gqk6#6;MaCVNKoU zjg3t!;wx7}gz@#NBVlUDqiTi7B3@@LgOJw5DU6Nim8NABe!Pi2wSrZktf;I)r@e2i zuZM=BPuDG5&T%BOm)7X`iq%b!Jt`#=bq(nD)eS3EGiT3HEu>KsO;AeFRNJt!&RS8= zF)aF56|b08K5LFD1R0i>%?e0tSzU7rrpy(h7-U`HEvTA03RsipOo1d7$9izan^B)G zu%dB!>pGO=C~4C6p$dvRrF^QcyJjwWuZ^}Vo+RB2i@~abB(-*M3maeG+OQl_6-81L zz$R%U^tY~do#tR&ZSxu;x3<)eN{UM)gr0})tz98ff+}vN<{Jr3EvuYgZow06Qs7!4 ztKw5Duy%-7%!w;~p=W9}2I3eiD_d5zRl50AW%HnsqKz{8*t1$2;!PNUSWRJUCTvYr zeDa)Gb1TcMEzu4=8hJl6^|fsM`n8+O)~+>rI~77;`?S3v-Q^+~i@hRaa^vb1;0ZV& zh4s#Q%x7_|*q}R#Q5e)k@%iPaEkN&<$LCkoaAm}`UsG*UQ!ST(wJXu~`7KQeO)HyS z0|TrEl`0_P4>~e<#H8|eYJzIn9}rVq%nfv9bqkhwtG9>_ODj1Vpz}hdd{#wOd{X6{ z$upC6R8S&unFYWh<{HyaP~QcUt1MABND&sK0fw+y>5J->W|)#?wau%St3()|wY6C7 zwQOEnhtVljvOV)BmsOU{)9u&eL>ZV9l!I!wvqpL?s)u)SbSvpiUR4JhAV#Kc-7+x) z0V~)LZ)xIOvaWXhddOI-u2_ZUy0cr+Q{ePO;=>XQE2woArX!ej>EncHZCsB9yAji@ zIa3y>1+N}88v?R!s{j>M<+HSmsWSf-%sE(9glTJ*c)yKu&aq+ql<6%SH z+T%*J=oB@#qj&yKYhMCqRdMBA_r2=(9t}-5d(&(Uw8lhjaM#Sluqq^IH%*g}M0_?) z10C%py(lCBiQ9-qLzB3SVn9hIxJ?L(;2PpGYTSrsT*f6tol!9}!GKXC#_xYlovK^+ zzIWC6zVGs*Z`G+&r%s(Zb?Ve|UvW*XHGu_0*J7I~3PG)71~F-tZ`PeMZ8nq?EICLPJ(#RSWkm%Tw8bsl^%VxNwr&MII%@?P znS8Uga@0k7Y{#&&ru@C_tt5abbIagxb8DN9i&V?J0whpQwDdk8c;v>R?txOG=+nhzDouZd~j1O?jC@4G%X2% zG;@1*H=PZy5K1WBN}Y*m0R|L84UGnyKi0R9!{`X$vltQU;+C^o;9`<==1-?7m@vS8 zF7*lHbmg0RF#2KKSLD$uPoc$8KB;cb40tAyQGjij@t7^8bC#ipb$2#3x1iCnQbA)k zyfm0-8vL!fg>6d#+tASa&%a z`n_lc+*B$qlvYgJ%^2C$(E(3TdQpfQY5T9v#L#C(RM>gMLMx)7j32-& zGI?}e8m+JvK@MU&R|K7dYi#p#QT0c7(FfUYORef zOc2v&$MhZrf4nCzj#sPDvxbe{YH@Q%8(IpOElYs8_}jh6K-2X6vX&-kb~A0u&z(VrjuEaMI*bi3@V&VBuQy=4a;-$O<;FZs zxl}h<81CRs0i4D~yQVR{BrW#8m@NBnPA5qkM#nf26OI|KOrGu>do*lWWcJ09g5S8< z7!R}ZXj_-rVp5p$7|)u_i5Yfyy@Ax!jCf240}we-M&j1$g>6)X<>_^&HquPeW4nl7 z8g`zDIa|U;*>odV2A-nv3~9Nd89j})JPAbenI4Cwgzg@!H!NdrjUd=)(zwU2L&#!m z;5%tHronm7>0nGTV@5V?FU3q3Xn{$zUZ(Ymi$O6c`i=@_;NBukBc`6G&NKohWp|^R zKgphsy3dA#V$fKgY>QmCDX0v&45U@?9w4k~^JmX#gwH`j3yX5OW$LmBeVn{)(h{Cw zv!yWjb50dck_eOA(|mT1ndQmwWgU%nTAm;?jQ-aF52*>>IqWGqW>87A>||11BD|VT-2Y4GuSoA8K971+{{g^)pbwi&dkt$CnDn_ws5Nb&APSe>8+q2wh~QU^W?!B&kpSIoE=L*n9ZNHgf%d9=w16$#lQYZ zb7ks-Gd*uo`T|*g+C=duzTI%uTbGkGPn|snqV%l^J0S*OR|^<~`4p`Wn8mo0@HV+v zy%3}2C74kxf*50(#}3lsW3Ze|zIvW~6nL}kOX2j(%**;(((~=Qi?nCmH(_|fJsh@J zs-clO`wZ&DJv5Ux)u5)M^%&OGa5OX%|IVh?F3gm=mbMm4hc0(5J=>%hPoK<*v`a&8 zdrxay%S@U9cy)~pb4A9Bc>juw8tq^gZV4%}Suw6x@KeaI=XKAaU3;PMO*` z9S$@vU=~ceNy1na>4fUhx_5JL7wq|2y=^=}eh5}Co zNmxCY5jZiP)!N;oFw1DBKdmHsEHPmkhFG_mOHy4_o)$o{;7qO2)zSm!NkrFe{IRZr zE`W9YuBDjqu<~<5x$!B%0J3T3H5B%N&!K%oFiOjcN75{c4UTa=v6?3%J9&0I9MU*~ z4G5C9aqXDzXu;%s7I-#h9pBmjmS5CR@=7Pe%}B_e)C{|a;F~P$7R9G{4Kq)kxxm^- z-^h7B7b`#689V5Q0PH|DEq64T30n583#Uw6pGYqv1Jq*L!*nZSkxU=713U)lj^3Wm zUg?Y0>J^m`nICWLRr#}dN7m{C<{Rih-KOL5bT03t6SH+uH_nKzvF@wbq(K=ir*@pu z(q^nB=^^IN9cZwg4nsMbmk67jEj-nkx1znLX}QTvi};Y+nGnPB<`(7-E|Oba#-hXG z-e%Yms0`KD>Lu~;?cTP|JO(NwKJKkL({U#36B~X^_e~xQ z%4W-j#qMEX#|Fi=bz(V)o70KPmj|7qDvC%QCuwCEY9+^nGN&cNabhDZonSo?61uf0uTvy z@%>{IA|aST!-Z)8LnS^jq(R>_W`q%OLJMJHoty$g6X?(>lc|FUAr@q z@5Her>=qfVGRK{;aULOJy(hoDig9M-&+Jb z?2(FBEqV3^#c*4heowN>Tf|ML&Wrv34xCNH1iE-b+3da=n(i;A619*4Dr$qwfC5&@ z)V4w+6&zFcP{Vo~jj?7X&$Ci5l{Ym_Ba`)yn{j8SoZ_;gm~8@@fLag5gOH2TbtaqD z#Vw0^m*%^S+%OZy#*(6p{^gDL8jk1zX@i7iMoz#jU0Uo;yfW`E{Z^(F=&cvGjXjur? zPC~26LpGTn+j<_Y=!hBS_E6}^THLPtMu6JZG(V~*rXI5A6-KO!+le`y>jEmTGRCb0 z+hl4(>K4!{?*6=*i!MleaNg2xWJd4A8aeXCecY=7H>5X^qaa#K1~=T(LpAo?C(qg! z%C@ru%hO=eH@`6>;7f>lmguP)XnlqBOjSZNMO1O-DfNxth#W@9W7gV=bvYceYH4fk zT)`fhweHS}VGqhMJj2d0LQ5PPCroxsUl)&#njwECX{}#dIuJ2?Iu1%WTBd`Tae-xT z1Y+c1+9|XG>@=GZF5h%ER!rz5rlBwG8?wg4q5^O}IwVV$k~`2Y z>{*ytBN)T!S2@cVmZn=dmk7_$@cI@k^Li!Lf;?nJ&C zVT~eGWz&Xk3KBVUpw4dXZpFb_Z)`OO{p5HVZ52~*q`lX+mTulG#Q`9eR5SL^pbI!4 z!Cofm9sC+M9inYcHrcjAHaB%P(NV@_M{+(Yl487)%}ND;DGDv<&gGZ^`fG;G?#7M= zI^GS;*0cGvh49}k+ff$p8#q$iNXN|Bo33qEla_U~wM^>jZO1X=NjNTd=A?647MY{S z6gwPyt1Fgvb>L84astNt#T{Lf76IujqP1wnq@!w&tere*DNZ^};*t(O27qHH!A_aD zn$+9fHL10|`K;c>Cd=U_3+J}YK8g13m$kL@z}Jgpz%l6ju}2?{{@c6!@TKj&li;Cu zM^T7SF`AzZYf^Iu4pG#8Mr6Zp1Q}~IJ+;etHL4r$?j9Th>^U6&+Y#ec5`sof(gPr8 z`4NJJrxTnAnRySZGHgPNgJ9}Ib#!srdUJ6zQ$o}zE&@aYFVahkW#5<<^D$o12x=Le z(w(%lxp`87ppQ7pwpygRg^1K5lW1c8$?X!QlGJFEV8V>s5iT%+b#wd;0k^F~K=c(1 zk_7Ep48NEId|sB8_z^q1jj*s~(b`M_@~!Aiyz*ugB1_NeScDVe2w`VwXnSkIXfKEnpb0e= z26XJUr*%nd3$@li^6&)(I#Dv(=5IzdsdkQHs430rbNJeazHhOQ#>Eu#_2NoCrvj{y*mLkFr74ac;Om#imV5_06J+O`Fy~y5z*`W{bBNu#y8fYznB5oz?AAfFF*$XmNXF6;tSiPZ^W+FGToM{hK_6Nr6_9{)HG({hJ~=N&mhThDrZy7N>s|a)*rQ z-*~5gH8#Qat+f`QMnO|Y9cM9#%S@O!1pR8rG3XD+9LG6x+aw<;a`h)#8hlu4alOO#nwS6Vbau5nR==gNs^Q%INDwCGG5Hv2Luh*HA&||;S zj8OBAAUMqgS*pw_F4w`SV>amacKi)#BT@tr z6>M)0<~y{0!F;+X=~KxmB3FnQC#OITx0`)7a)pS+$n{e>ThZa5-oMO6sjyTg*DPY7 zD1L?2MKirBQ&+WtxnYjhPBmezjzK}kEJZUfZ9}89eP5atGJV|PXr$=F(QrphAuCH& z`khNGM>8FEtZgJ8ej33~bA=+8{UvIxW~12IH>E)HrWAg*x?XQhJ(Pw%{94p&sATlA zOoDn%nw{=@gw!i%NzD%CdL>ZM%Q8D?(6iqPg46X|!PXS|M#Baav^@>L_Vhz(19%9b z;B>F#(_;ipG(vWPp1l$>TZs-bA032gFCg0YqyV@F7j=O)01r`N^K4-Rpu*;Ph0%~H z1+>ZUbZf-|$7N;<^?wHMr-FqZ{z8jxbA8|CDuozJzZm58v%#hmUYk;Pk!0^my-2aQ zQg7kqQOa{mnm?JV9F+|C%~YTk6+=xO?hf#)0rT}k!IJ?4@a;H+e6z~{gQm9ycfm%G zEwhBkma(RckRO&NTXwqM89a*SC`?&sQWmO|>Ci1M7kB8@!Rmmzv{jE%>Vt)-V3RP> zsVyRPYR#g`d<}HkanT!`DT7DeKuuHbwp@_mR*{HC7Ta~Se%O70E*&6yHEWuZxNrsNp;m2#~j zro@)(n-UK-?4%aaGbJ7#x&zxB>TecPQ6CXg;-MCjr0ya1!NW@=S%_MkBut4VC#J+k zr9XaEL_$&c2`*~;Bio7&L1I(#a)Bvv$uK20RZNLXB00d6xHyV~>2Og>_Txx~DY407 zN^DeEKR?R4i(1x0Wz5*0r`Nb&bG~l8Qe$MhQg0-yu~FZTSnds})mZ1uI$b#m-o{al z*4wb88rj>(h0%tvJPt()U7#D^PC--OPHog?EZwMY)d1Xz;tk+_V&rs>k$8WP5d4O2 z;E!MsN>?{S!!c&dqMH5^hHeos2xw`G;SCw*@^ea?ijWAIos|lt?alB$A71c&2S6=Cb zB&i}YYx3|CNfx3OCkgvw$%*7_R3!I6RB|qACC5WpX`Sga7z3couLQ5r5T?p=2MHWd zm5N47O2brLs;W0A9|HVr0fG;)L*z}a)eUIW^j*^~v!rtGdPqwLE5f#QG2zGvd^Wq+76S$>%N zVUAETSBd$7VdgBQhdA#olbvb#84P{~KLjEdugcjRhfpk5i_AcmC66&J|DLhr?*&)T zn0H0$K9JZPD-@Q#bQDrYfgl-oCg~CSZ(4AAFSsv@!P%7^D&R0zB9A@WQNr2?lWQ%L zneh&lN4lGVdUXW#>QyR5#beRf{iP5;nXsfKsmUAk6878o2KT2ac7OWKG>uW|XK65h zRzFsfUe&n)uWK`iUz>R{Ls(B{KBVY}nM6M*|x`oGh7?Mr_|EPj+eU(@i5I%XPN4l+vn z((ePoqqHorLb7i#uWP{gVIWek6Aftx;ofH>boa+EtOt*?gsr@>hd(HX8JaI zJ(2#eG-3T$`Y#kcPhUc+{bPNDCg=?sKM}c5KZSq6!iablLQ8z{py0b*!Morcz+3pw z)Vn6IIeozRGJU#FQ<763sCvwW32T$N&=D+$Ov;x-ipwtoA^1Yqrf)WZhtjW*bMs32 zQV>SMrTQAk6o0mw_`~{P4*1M7;;2KSp3kV0P03oFh!(mqwH8C9zJOe(`TAGsU*YAL zrU4V17AjNW@}NuTzwjEYGOdyc=^dOpZUd9R+tDaRqzG#9!b+I6Pa~;_WFcxHNg6E8 zp5kXBS%_MkBo_N^rD=37D|b;IopD)!hzqiWYUhrSs4D4HwEl@-Fihp}OJn>%#<}WQ zCd~Ynxg=#qVC-60WI`zQq6Wc-0D)Uwx5f1E^JhoRO#S%6wqV9dHNz>jyIPOWd@ zVe2~x5YYNA>RR7HfPmJ=7r^{rWHjwV#aWpBRdpfw%9p!g7RWOCQpx|lqqZB(!Y ze_Cz&ldt6JW0=0*F+CNoz|`rwZ`Y~~`rVRCGJ#pV&x9D$$-m(=3UGe<3L+tn62fZQ8){xTtc zd1~ecpy98>D?_9RB3J^sC=2QSIZH}WE1sLt}Zn8XZu46 z{RhCMr-@CFYm-!(OOmgaIme-w1N|`U_7=jiRd|DJ*xEGU^9p?%Xy)xg5A|8g?9d;yya#3&<)%2?1dK$>>lUeG}%fNKm3`p*~ z7m|Ws7+g!E54B;Y+96%aj`DAUSLw|Q7m0~!${DiF^ABQ}GM0Qo8s`gZQBU6WMZqt^ zd<{mq=7Pz5^=Q)U{d2XBQ$=3DU~Hg1 z#L6*195dD+5}8cr6narp@xZj6MipoLG!JdX*bcqZ;m(Y0>&vg0J=ISG` zShi4KY_R8Uz+PN7^r;gg7uc0^6uNjZRFdWdMf7Wj^)n+qS^mZdNeOJHx2zVa@H?HJi z*%N^a>dOY)UIrt(wfsDqIz2GxronhUHRR8xSd?!SGF$cbQ5u;YF3FiIO892J{V75H@Py9#~N?3>zZW)8utK;^L!|UB~JFDRrTGD#^fIrge;~xk72#xpVD*as5Zpyox z^5%i2A4dwb6av~eaa|3%H`yS4`}lnmNgedMn){7jcwp#&0i*Hh(JulUWv{EbqXuP* zCcHTQfr&5-4@}%QF$=xR;0U?FuvS;EpRj2Hc-b@ox#yWQxLX0p{nLcf^f#Raai9gh z1^J)xACC92(n=F3^$%v~1@(OsQ^%Sz@djIZ3wWU*iAVop!krVq^o_!FiN2iy)Q2U6 zK71#^xDQJReON;1!xCb0_fB|f0;;>d=EfR~D=Bm{DM3C83k1acArISD~}TPD6Vu{6EJ7pMW%`vQGn;;sl5 z1WF)uDEfNfossX1ga)mogXtnEy^!k`*$DzZ74{14|AB-V?@PjcQjY07rjrl3| z$n{Uh{$ea*zZm-g#XcB&={UlI`wePvHR?A&9~g09M5=*6TR^oUg7H)U&#x@+RF*Vn(dSoQRyhdGn~8!itGv1r=c)Sr|0Y;!xFbef z9W5hQR}LXYCPov~fRQ2}r7BFYe^`kPYDf{-Py>rsRypbXuLUvO%JqMpbHx93PSLK* zhu=1wwClFv+iCl3`|uAiREg>_ZTe$IV1@DQ)}e%a>(CuTfxKhrvqQNzJv(#{#rF)o zd>E_dO`{(kO?VHFesMJ5FOGg~G~>NC`us7N;G93^mNAU??zlUufhQhxXR|2J3h8u#1PI@7*-|0`6rOjJcY6+0{%QSnrNoN96Uo>g%cj zzpi=*u#bkJ|9k{e>AsEU5@_{skfk9n{^&ms**64~_6@mmDD1(N zLpKpun}%La!~0F6G0vWjLNBJmE=FO9ZK=M4Vt1fKh!tjX_3+gw2fLRrlN26+u?g`)`X!cqS+3RV1< zQBRK|yaI89;Io4X@!7%uK?ME-1i<^g!SB%y@q2@xA}8jfs@s^@ZKJkhhN8EF7@I(S z?~q3!6IG^6sDWyE?~r@3`g(u|0}2m7I8w_(AO-^h1`Sxswv=G*nRnjkyzTzoQevJKec)RC zYXuSf*NUw~U@Hiq{*P5WMU%~^D&TjKzji5W_@$$NL>m61(Kn4Y(zs&K^@EHwIKGgUg_oiGaC>2F@}^^HeH-*qQzDHQp}CnqO8;xw-w5e%gmjug!lE!CS?3-|AC|2j2&5OPcaw=+Gk)!O zysjC4Jzg|N=&yGVJTMUFGFM_!2=mEY76LO0cyA0e+cgrQOxP~;5+uS2>6|5)HK9~z z1=SBi&<6%ySk6U0Sp5ibwWs<3m7L|BJxRxE(Ib@FXi^*Xf$B975*gNPDgX)L+K>>* z>5Vu=0KMI+@7C$A(-E>l9zWz)4Lqp+19PWs4_Ie@$=id^%M4Y{ZePB-vt5dhofs0#GPnknj zToy`Ot=CZ#tkc(;Cb(9wk2b*ti3nWUuG9gddmyzzm}KZq{W4K~S?_bi^ndEN03(gU zV`B9Hy+a3+-vJ_2$~>QxhMb?W5UO?Yg;G`G=J%^hw$WL&Z6zBsnAmL0+#sjRZphqB zD|$C)wgZj{ugRbpy%Ff^>Fc2N2E7r>G=ztxy$If1;4wX{fZmY#Wd@__FM)@am`ii$ zC=U%l{%MA0KZYni(BeD|oQI~wB&vr%FohMHt)PQ94Od&J26M^2O9=LT8^PGVO9=K| zLTMKw3G2U<{1uq`uO;VYFyp}Z@^=c&bs>TQjiESyl{ufP3ADeI{0-a2*f@e|bzztn zqUUT4MHmU@B}|YACrku&>>(2?{OBix7Xt9}Lhupo9SQJ_;B5lF9lS%EXYbJG67voE zN5KzLNclnPTC+o^f0X($04A~in`psrUhSzqYEs_`!_>JB)bZuy)gWsNLBd?!c_l4e zUx@^1C8X+eR-uShKe6lGw0u8bV;0CJg0gGXA4J`jBta@Ffm1o%!>Qn}LJ30Kmi%bI z=IVo{qEgt?HfmuKj`|{s{Nk6v&|#m@m6ib+rWoUP)KCjjq+CKi>RJ0IY34^y0j2TSp+-3#vvvUckltlNENY;o!G zazEu;(=B5eoyq93!K%dD6vo!C%I*}D4}+}xl2?^@AKmhYwJKXb!;qTjp=Irv)gR`v z?r^5c+7l%QXWh9KRdVu7%Swg*4Ni=x5_>#@B)k@9-&D!>98Ojb|Gd7U45fA zCIIbMKKJXa{g7d-%G!@WCT8uYCP1~HS4_;>k2nCdUk*%k+0okn<36d#>VcziqVr=2 zqs*P!&+5ubRpOo2#~FT5`jY8QyFc%``-Ooz3QGXi!0{KjsPkJGq%KTdlENX2J26@M z_tbx+^dD1eFkC%|fBGT)JFQ>PuW0=$d<>-kEzCLE6aDTXH)Q+~4oRemo<>4sd{hK>QPG53{!8Z+E%6Ssrq%5nId9>_(YZdebsY_ z(;N>oyuAqSz&?k5e$_{eiW2s@uKT+d%LR1ZhV>g0y+STL(bE znm#Z4D@}{`Kv)ml$1pYGi4jkWDE>kj&%b=&Edy^GsP7v1n}OhX;QoR7eM~KQ?gEhy ze19O%Ry0jBFcVob-T{F`K%+?sf7$C%?|d9jeg%M(8mO!yP7s7acn7q^d5HnoO0fQ7FWxIHJZ-XyE5 z@D9{SHH8rHSXb~mgb99p41Rjblxx3_wi~V|2;BajgN1*Dh9o}i=|2nqsl_LO;JMhm z)I$Py9*4mH1#hAgx*sOtLcw?Lgy8QG{Lr^B2@eR|4y%U<{#t2Adk$?nDIlH~@t@={ zIVOj<1b#>i{=UGgWAH!Odf8D)=+oj0)hisLKmgA$(H}R$2!5sDhr^A*pCb5nsF;TG z=s8UA!*RpFj|W^A>0eZDZm)kdc=qp1flrCS7YKZH4Bien$t@>xK$M^FGJL3de~qPV z-q#DAoiRGMGX4;?H--;Kt|k0U_zprgDh!X^VpU~MU@Sy_FL9SG< z9kKQuF73NJhJUc&KN7>AB=|}uS(g4x!CxN3ZxsCM82*`pe{l@|dxAej@a^}0mkR#I z82(QLe{Br^X2IVa!@pbbcgOIb7W|zt{8t5kGW|>ep3&x|{wDaVWBC0=pX+1zHGq@+ z*T(RV75vT^{>g%Wbqs&5;IED0e_Qak#PGi__*-K5R|tM*4By)GU4nm<)b|&RKTMqw z8>j9R`W2KB&vx@t4+#BTG5U`Q{w~2E0DYxrm*6jp;eQWjz^PyF{+hviugtt(68tk_ z_-_h)K@7fM;Po*$I%CoPSOGYdyK{*tZ-9BJQ3Bs3a4Vlf1zxe#Alh;KxCHu1c5F8A z12tIHd|wLmUd8O**MYCpAho#5Lqzb~%ul)6yetaGel_TiP&NHSOThnC0{q_+ z;IAgYOESgfIVJ&qBH-05!RVh;67avt@PXVkjympPB^t)CBmP1o&wQ@D&O03lrdL6W~8jfZv?}e>wsF zdIJ2<3Gh?&H2H>P` z&&TxbKmvXi4rDQTRxup@?P6nWUJ-xzumt?63GgKe@Z|~cwF&Tz3GiD0FE$QtPr!dH z0WQC+9sU%$`H60co68&*x0pM(qn8KZiiPf8{9t?xO1Hr>I&P#n_wXW z29Dfx*+u@G*2TDO6EVLWM8jKS4F$Oe#V2a-r4bn4XJW$5T|M1BxRn&YVvcLIT9)Eo zLtNd~(}tT|aAzB?Z^b=tdGnL%`NjCX^zM99?{eJI+J-A+apw~RQ51u&;%b$f%^?%W za!FTH8*XFmZEIVBEMAN+Mu?zt)6vhWw=UuzM3>vj! zVfY9ye54mXs^Ew9y*oMLmw5R1e;9uJpWV;rPimNY%1m6bJtLoors5jq{LEPboHe5X zS8IZR%AY)^ZW^xltvl(Yc{6bh-&DFc73htpOm|rqcX!C8Ov+v)uUOm7btrVLi&br0 z{!#Qgydw800aYv(Leaa;_zICG+=ofmjp8z<*hSs5>Ee@!U5wnzLMF`Kl%U$`yH_;R zRSWh~5`-d`p0LbJ>&oS5z@WQ~x|*6{C-U7*OIqXtlbPmz3TBCJ3gkP-fDJ`Qj!xW^ zAeA@laOWw!aFh$QI>(*dlupgriah29TzeA{(WYyt_{ufTYPwbNjQKn+ifEU9lsDI* zE=NDWg*wWUn%vt!6|tAL@oh12by9cc=Y!x&^FD|I3Tj|5>dB&j|U2xAhSWITn+TP-77rCggu1ujx)a@Pgrl7d_;9;?-mf5QFxKHD7-1S1)SlBvWTs>)CX{V`u=p+lo<|Y3ZnrP(y_t zZt-2+-8G?GnEU6Pu#Y&pkXN}L8jMJ# z`GPuIrn#*VLvtN#If3nn1yP$z-T-s=DXUuCIfQGY@$Ts|?`1aBj(b;Yae-DX40mS> z?m$wt4#Yms;kciW5$I|oRl9gaJBXP#tOci7|HF^uk=E66Rug5AQ0G}as+O8m)goBC zv_k^jEzPQyZZK4}>=o7G3QkPxan-(qVYB}4+_?kdTf#7^F>A8z{ zG}D#tj$l{&QWGz-RQJCEjRH27AhCC0p3M@l?`nbD7nbQFPc348{zoLgeb+>=Y0oM8 zOhxpsAAj6o%ik*j`<^4{HebB_uOb~w4~~D@SEt9mtFg{Q50>?@Zxf!Es3agB+76{G zw)`_>pUu5v1#{qJ7>tIfB2%D$&a{y6^v zRyxaxKR@9yHn~<`A6Wt6^G4#DPU9twgt>HIr=93 z@*m5Gg=l)ovK z-=24|?}HDwC7ZV`*FtZM<+uBm_ATmY(VZSyz%M1gZGY7%De_+I5)3>pf7-Vu`B^l( zpK9MPQKI+6^FM?%KmU{-gKXb#l5y}Jt3MX>6aoYBU%IV3H)79^#PMz1zUjPAxtHIb zQ?YN02NZs6+`iucl=!#h+w*Alz1d`Qf2&={1oq=ax^MH_ePR2q5W!kCvgKMmxB_|o z^6mb#eb2IlO>wUOSvnuZ^1J=&wI+kblk6_Pji*sK;n-qwHlMtATSR#m&_jOWe{vj8 z@*f(56D~dWJxKB!X!!Ri$?p&)$>y_|)k*ouFyJ|l6x4g-`RTk>97gEdzGk2o4Dm7} z7{~o$LjDuJZ7^pY`N{cDlKgS`{b0Sx{|_|4dXIsIe9TSAf6s3X=6~6S6&msUO_JX$ zf`d0aX)qt25>2uBE%ZAH`CH44;vX98|MC13x3 ex + unless retried + name = "Struct::#{name}" + retried = ex + retry + end + raise retried + end + end + + CACHE = Hash[constants.map { |const| + val = const_get const + begin + [val, ::Object.const_get(val)] + rescue + nil + end + }.compact].freeze + + class Restricted < ClassLoader + def initialize classes, symbols + @classes = classes + @symbols = symbols + super() + end + + def symbolize sym + return super if @symbols.empty? + + if @symbols.include? sym + super + else + raise DisallowedClass.new('load', 'Symbol') + end + end + + private + + def find klassname + if @classes.include? klassname + super + else + raise DisallowedClass.new('load', klassname) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/coder.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/coder.rb new file mode 100644 index 0000000..96a9c3f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/coder.rb @@ -0,0 +1,95 @@ +# frozen_string_literal: true +module Psych + ### + # If an object defines +encode_with+, then an instance of Psych::Coder will + # be passed to the method when the object is being serialized. The Coder + # automatically assumes a Psych::Nodes::Mapping is being emitted. Other + # objects like Sequence and Scalar may be emitted if +seq=+ or +scalar=+ are + # called, respectively. + class Coder + attr_accessor :tag, :style, :implicit, :object + attr_reader :type, :seq + + def initialize tag + @map = {} + @seq = [] + @implicit = false + @type = :map + @tag = tag + @style = Psych::Nodes::Mapping::BLOCK + @scalar = nil + @object = nil + end + + def scalar *args + if args.length > 0 + warn "#{caller[0]}: Coder#scalar(a,b,c) is deprecated" if $VERBOSE + @tag, @scalar, _ = args + @type = :scalar + end + @scalar + end + + # Emit a map. The coder will be yielded to the block. + def map tag = @tag, style = @style + @tag = tag + @style = style + yield self if block_given? + @map + end + + # Emit a scalar with +value+ and +tag+ + def represent_scalar tag, value + self.tag = tag + self.scalar = value + end + + # Emit a sequence with +list+ and +tag+ + def represent_seq tag, list + @tag = tag + self.seq = list + end + + # Emit a sequence with +map+ and +tag+ + def represent_map tag, map + @tag = tag + self.map = map + end + + # Emit an arbitrary object +obj+ and +tag+ + def represent_object tag, obj + @tag = tag + @type = :object + @object = obj + end + + # Emit a scalar with +value+ + def scalar= value + @type = :scalar + @scalar = value + end + + # Emit a map with +value+ + def map= map + @type = :map + @map = map + end + + def []= k, v + @type = :map + @map[k] = v + end + alias :add :[]= + + def [] k + @type = :map + @map[k] + end + + # Emit a sequence of +list+ + def seq= list + @type = :seq + @seq = list + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/core_ext.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/core_ext.rb new file mode 100644 index 0000000..fc259fd --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/core_ext.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true +class Object + def self.yaml_tag url + Psych.add_tag(url, self) + end + + ### + # call-seq: to_yaml(options = {}) + # + # Convert an object to YAML. See Psych.dump for more information on the + # available +options+. + def to_yaml options = {} + Psych.dump self, options + end +end + +if defined?(::IRB) + require_relative 'y' +end + +# Up to Ruby 3.4, Set was a regular object and was dumped as such +# by Pysch. +# Starting from Ruby 3.5 it's a core class written in C, so we have to implement +# #encode_with / #init_with to preserve backward compatibility. +if defined?(::Set) && Set.new.instance_variables.empty? + class Set + def encode_with(coder) + hash = {} + each do |m| + hash[m] = true + end + coder["hash"] = hash + coder + end + + def init_with(coder) + replace(coder["hash"].keys) + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/exception.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/exception.rb new file mode 100644 index 0000000..d7469a4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/exception.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true +module Psych + class Exception < RuntimeError + end + + class BadAlias < Exception + end + + # Subclasses `BadAlias` for backwards compatibility + class AliasesNotEnabled < BadAlias + def initialize + super "Alias parsing was not enabled. To enable it, pass `aliases: true` to `Psych::load` or `Psych::safe_load`." + end + end + + # Subclasses `BadAlias` for backwards compatibility + class AnchorNotDefined < BadAlias + def initialize anchor_name + super "An alias referenced an unknown anchor: #{anchor_name}" + end + end + + class DisallowedClass < Exception + def initialize action, klass_name + super "Tried to #{action} unspecified class: #{klass_name}" + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handler.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handler.rb new file mode 100644 index 0000000..ad7249f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handler.rb @@ -0,0 +1,255 @@ +# frozen_string_literal: true +module Psych + ### + # Psych::Handler is an abstract base class that defines the events used + # when dealing with Psych::Parser. Clients who want to use Psych::Parser + # should implement a class that inherits from Psych::Handler and define + # events that they can handle. + # + # Psych::Handler defines all events that Psych::Parser can possibly send to + # event handlers. + # + # See Psych::Parser for more details + class Handler + ### + # Configuration options for dumping YAML. + class DumperOptions + attr_accessor :line_width, :indentation, :canonical + + def initialize + @line_width = 0 + @indentation = 2 + @canonical = false + end + end + + # Default dumping options + OPTIONS = DumperOptions.new + + # Events that a Handler should respond to. + EVENTS = [ :alias, + :empty, + :end_document, + :end_mapping, + :end_sequence, + :end_stream, + :scalar, + :start_document, + :start_mapping, + :start_sequence, + :start_stream ] + + ### + # Called with +encoding+ when the YAML stream starts. This method is + # called once per stream. A stream may contain multiple documents. + # + # See the constants in Psych::Parser for the possible values of +encoding+. + def start_stream encoding + end + + ### + # Called when the document starts with the declared +version+, + # +tag_directives+, if the document is +implicit+. + # + # +version+ will be an array of integers indicating the YAML version being + # dealt with, +tag_directives+ is a list of tuples indicating the prefix + # and suffix of each tag, and +implicit+ is a boolean indicating whether + # the document is started implicitly. + # + # === Example + # + # Given the following YAML: + # + # %YAML 1.1 + # %TAG ! tag:tenderlovemaking.com,2009: + # --- !squee + # + # The parameters for start_document must be this: + # + # version # => [1, 1] + # tag_directives # => [["!", "tag:tenderlovemaking.com,2009:"]] + # implicit # => false + def start_document version, tag_directives, implicit + end + + ### + # Called with the document ends. +implicit+ is a boolean value indicating + # whether or not the document has an implicit ending. + # + # === Example + # + # Given the following YAML: + # + # --- + # hello world + # + # +implicit+ will be true. Given this YAML: + # + # --- + # hello world + # ... + # + # +implicit+ will be false. + def end_document implicit + end + + ### + # Called when an alias is found to +anchor+. +anchor+ will be the name + # of the anchor found. + # + # === Example + # + # Here we have an example of an array that references itself in YAML: + # + # --- &ponies + # - first element + # - *ponies + # + # &ponies is the anchor, *ponies is the alias. In this case, alias is + # called with "ponies". + def alias anchor + end + + ### + # Called when a scalar +value+ is found. The scalar may have an + # +anchor+, a +tag+, be implicitly +plain+ or implicitly +quoted+ + # + # +value+ is the string value of the scalar + # +anchor+ is an associated anchor or nil + # +tag+ is an associated tag or nil + # +plain+ is a boolean value + # +quoted+ is a boolean value + # +style+ is an integer indicating the string style + # + # See the constants in Psych::Nodes::Scalar for the possible values of + # +style+ + # + # === Example + # + # Here is a YAML document that exercises most of the possible ways this + # method can be called: + # + # --- + # - !str "foo" + # - &anchor fun + # - many + # lines + # - | + # many + # newlines + # + # The above YAML document contains a list with four strings. Here are + # the parameters sent to this method in the same order: + # + # # value anchor tag plain quoted style + # ["foo", nil, "!str", false, false, 3 ] + # ["fun", "anchor", nil, true, false, 1 ] + # ["many lines", nil, nil, true, false, 1 ] + # ["many\nnewlines\n", nil, nil, false, true, 4 ] + # + def scalar value, anchor, tag, plain, quoted, style + end + + ### + # Called when a sequence is started. + # + # +anchor+ is the anchor associated with the sequence or nil. + # +tag+ is the tag associated with the sequence or nil. + # +implicit+ a boolean indicating whether or not the sequence was implicitly + # started. + # +style+ is an integer indicating the list style. + # + # See the constants in Psych::Nodes::Sequence for the possible values of + # +style+. + # + # === Example + # + # Here is a YAML document that exercises most of the possible ways this + # method can be called: + # + # --- + # - !!seq [ + # a + # ] + # - &pewpew + # - b + # + # The above YAML document consists of three lists, an outer list that + # contains two inner lists. Here is a matrix of the parameters sent + # to represent these lists: + # + # # anchor tag implicit style + # [nil, nil, true, 1 ] + # [nil, "tag:yaml.org,2002:seq", false, 2 ] + # ["pewpew", nil, true, 1 ] + + def start_sequence anchor, tag, implicit, style + end + + ### + # Called when a sequence ends. + def end_sequence + end + + ### + # Called when a map starts. + # + # +anchor+ is the anchor associated with the map or +nil+. + # +tag+ is the tag associated with the map or +nil+. + # +implicit+ is a boolean indicating whether or not the map was implicitly + # started. + # +style+ is an integer indicating the mapping style. + # + # See the constants in Psych::Nodes::Mapping for the possible values of + # +style+. + # + # === Example + # + # Here is a YAML document that exercises most of the possible ways this + # method can be called: + # + # --- + # k: !!map { hello: world } + # v: &pewpew + # hello: world + # + # The above YAML document consists of three maps, an outer map that contains + # two inner maps. Below is a matrix of the parameters sent in order to + # represent these three maps: + # + # # anchor tag implicit style + # [nil, nil, true, 1 ] + # [nil, "tag:yaml.org,2002:map", false, 2 ] + # ["pewpew", nil, true, 1 ] + + def start_mapping anchor, tag, implicit, style + end + + ### + # Called when a map ends + def end_mapping + end + + ### + # Called when an empty event happens. (Which, as far as I can tell, is + # never). + def empty + end + + ### + # Called when the YAML stream ends + def end_stream + end + + ### + # Called before each event with line/column information. + def event_location(start_line, start_column, end_line, end_column) + end + + ### + # Is this handler a streaming handler? + def streaming? + false + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handlers/document_stream.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handlers/document_stream.rb new file mode 100644 index 0000000..b77115d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handlers/document_stream.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true +require_relative '../tree_builder' + +module Psych + module Handlers + class DocumentStream < Psych::TreeBuilder # :nodoc: + def initialize &block + super + @block = block + end + + def start_document version, tag_directives, implicit + n = Nodes::Document.new version, tag_directives, implicit + push n + end + + def end_document implicit_end = !streaming? + @last.implicit_end = implicit_end + @block.call pop + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handlers/recorder.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handlers/recorder.rb new file mode 100644 index 0000000..c98724c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handlers/recorder.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true +require_relative '../handler' + +module Psych + module Handlers + ### + # This handler will capture an event and record the event. Recorder events + # are available vial Psych::Handlers::Recorder#events. + # + # For example: + # + # recorder = Psych::Handlers::Recorder.new + # parser = Psych::Parser.new recorder + # parser.parse '--- foo' + # + # recorder.events # => [list of events] + # + # # Replay the events + # + # emitter = Psych::Emitter.new $stdout + # recorder.events.each do |m, args| + # emitter.send m, *args + # end + + class Recorder < Psych::Handler + attr_reader :events + + def initialize + @events = [] + super + end + + EVENTS.each do |event| + define_method event do |*args| + @events << [event, args] + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/ruby_events.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/ruby_events.rb new file mode 100644 index 0000000..17b7ddc --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/ruby_events.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true +module Psych + module JSON + module RubyEvents # :nodoc: + def visit_Time o + formatted = format_time o + @emitter.scalar formatted, nil, nil, false, true, Nodes::Scalar::DOUBLE_QUOTED + end + + def visit_DateTime o + visit_Time o.to_time + end + + def visit_String o + @emitter.scalar o.to_s, nil, nil, false, true, Nodes::Scalar::DOUBLE_QUOTED + end + alias :visit_Symbol :visit_String + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/stream.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/stream.rb new file mode 100644 index 0000000..24dd4b9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/stream.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true +require_relative 'ruby_events' +require_relative 'yaml_events' + +module Psych + module JSON + class Stream < Psych::Visitors::JSONTree + include Psych::JSON::RubyEvents + include Psych::Streaming + extend Psych::Streaming::ClassMethods + + class Emitter < Psych::Stream::Emitter # :nodoc: + include Psych::JSON::YAMLEvents + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/tree_builder.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/tree_builder.rb new file mode 100644 index 0000000..9a45f6b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/tree_builder.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +require_relative 'yaml_events' + +module Psych + module JSON + ### + # Psych::JSON::TreeBuilder is an event based AST builder. Events are sent + # to an instance of Psych::JSON::TreeBuilder and a JSON AST is constructed. + class TreeBuilder < Psych::TreeBuilder + include Psych::JSON::YAMLEvents + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/yaml_events.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/yaml_events.rb new file mode 100644 index 0000000..eb973f5 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/yaml_events.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true +module Psych + module JSON + module YAMLEvents # :nodoc: + def start_document version, tag_directives, implicit + super(version, tag_directives, !streaming?) + end + + def end_document implicit_end = !streaming? + super(implicit_end) + end + + def start_mapping anchor, tag, implicit, style + super(anchor, nil, true, Nodes::Mapping::FLOW) + end + + def start_sequence anchor, tag, implicit, style + super(anchor, nil, true, Nodes::Sequence::FLOW) + end + + def scalar value, anchor, tag, plain, quoted, style + if "tag:yaml.org,2002:null" == tag + super('null', nil, nil, true, false, Nodes::Scalar::PLAIN) + else + super + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes.rb new file mode 100644 index 0000000..2fa52e0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true +require_relative 'nodes/node' +require_relative 'nodes/stream' +require_relative 'nodes/document' +require_relative 'nodes/sequence' +require_relative 'nodes/scalar' +require_relative 'nodes/mapping' +require_relative 'nodes/alias' + +module Psych + ### + # = Overview + # + # When using Psych.load to deserialize a YAML document, the document is + # translated to an intermediary AST. That intermediary AST is then + # translated in to a Ruby object graph. + # + # In the opposite direction, when using Psych.dump, the Ruby object graph is + # translated to an intermediary AST which is then converted to a YAML + # document. + # + # Psych::Nodes contains all of the classes that make up the nodes of a YAML + # AST. You can manually build an AST and use one of the visitors (see + # Psych::Visitors) to convert that AST to either a YAML document or to a + # Ruby object graph. + # + # Here is an example of building an AST that represents a list with one + # scalar: + # + # # Create our nodes + # stream = Psych::Nodes::Stream.new + # doc = Psych::Nodes::Document.new + # seq = Psych::Nodes::Sequence.new + # scalar = Psych::Nodes::Scalar.new('foo') + # + # # Build up our tree + # stream.children << doc + # doc.children << seq + # seq.children << scalar + # + # The stream is the root of the tree. We can then convert the tree to YAML: + # + # stream.to_yaml => "---\n- foo\n" + # + # Or convert it to Ruby: + # + # stream.to_ruby => [["foo"]] + # + # == YAML AST Requirements + # + # A valid YAML AST *must* have one Psych::Nodes::Stream at the root. A + # Psych::Nodes::Stream node must have 1 or more Psych::Nodes::Document nodes + # as children. + # + # Psych::Nodes::Document nodes must have one and *only* one child. That child + # may be one of: + # + # * Psych::Nodes::Sequence + # * Psych::Nodes::Mapping + # * Psych::Nodes::Scalar + # + # Psych::Nodes::Sequence and Psych::Nodes::Mapping nodes may have many + # children, but Psych::Nodes::Mapping nodes should have an even number of + # children. + # + # All of these are valid children for Psych::Nodes::Sequence and + # Psych::Nodes::Mapping nodes: + # + # * Psych::Nodes::Sequence + # * Psych::Nodes::Mapping + # * Psych::Nodes::Scalar + # * Psych::Nodes::Alias + # + # Psych::Nodes::Scalar and Psych::Nodes::Alias are both terminal nodes and + # should not have any children. + module Nodes + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/alias.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/alias.rb new file mode 100644 index 0000000..6da655f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/alias.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true +module Psych + module Nodes + ### + # This class represents a {YAML Alias}[http://yaml.org/spec/1.1/#alias]. + # It points to an +anchor+. + # + # A Psych::Nodes::Alias is a terminal node and may have no children. + class Alias < Psych::Nodes::Node + # The anchor this alias links to + attr_accessor :anchor + + # Create a new Alias that points to an +anchor+ + def initialize anchor + @anchor = anchor + end + + def alias?; true; end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/document.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/document.rb new file mode 100644 index 0000000..f57410d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/document.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true +module Psych + module Nodes + ### + # This represents a YAML Document. This node must be a child of + # Psych::Nodes::Stream. A Psych::Nodes::Document must have one child, + # and that child may be one of the following: + # + # * Psych::Nodes::Sequence + # * Psych::Nodes::Mapping + # * Psych::Nodes::Scalar + class Document < Psych::Nodes::Node + # The version of the YAML document + attr_accessor :version + + # A list of tag directives for this document + attr_accessor :tag_directives + + # Was this document implicitly created? + attr_accessor :implicit + + # Is the end of the document implicit? + attr_accessor :implicit_end + + ### + # Create a new Psych::Nodes::Document object. + # + # +version+ is a list indicating the YAML version. + # +tags_directives+ is a list of tag directive declarations + # +implicit+ is a flag indicating whether the document will be implicitly + # started. + # + # == Example: + # This creates a YAML document object that represents a YAML 1.1 document + # with one tag directive, and has an implicit start: + # + # Psych::Nodes::Document.new( + # [1,1], + # [["!", "tag:tenderlovemaking.com,2009:"]], + # true + # ) + # + # == See Also + # See also Psych::Handler#start_document + def initialize version = [], tag_directives = [], implicit = false + super() + @version = version + @tag_directives = tag_directives + @implicit = implicit + @implicit_end = true + end + + ### + # Returns the root node. A Document may only have one root node: + # http://yaml.org/spec/1.1/#id898031 + def root + children.first + end + + def document?; true; end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/mapping.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/mapping.rb new file mode 100644 index 0000000..d49678c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/mapping.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true +module Psych + module Nodes + ### + # This class represents a {YAML Mapping}[http://yaml.org/spec/1.1/#mapping]. + # + # A Psych::Nodes::Mapping node may have 0 or more children, but must have + # an even number of children. Here are the valid children a + # Psych::Nodes::Mapping node may have: + # + # * Psych::Nodes::Sequence + # * Psych::Nodes::Mapping + # * Psych::Nodes::Scalar + # * Psych::Nodes::Alias + class Mapping < Psych::Nodes::Node + # Any Map Style + ANY = 0 + + # Block Map Style + BLOCK = 1 + + # Flow Map Style + FLOW = 2 + + # The optional anchor for this mapping + attr_accessor :anchor + + # The optional tag for this mapping + attr_accessor :tag + + # Is this an implicit mapping? + attr_accessor :implicit + + # The style of this mapping + attr_accessor :style + + ### + # Create a new Psych::Nodes::Mapping object. + # + # +anchor+ is the anchor associated with the map or +nil+. + # +tag+ is the tag associated with the map or +nil+. + # +implicit+ is a boolean indicating whether or not the map was implicitly + # started. + # +style+ is an integer indicating the mapping style. + # + # == See Also + # See also Psych::Handler#start_mapping + def initialize anchor = nil, tag = nil, implicit = true, style = BLOCK + super() + @anchor = anchor + @tag = tag + @implicit = implicit + @style = style + end + + def mapping?; true; end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/node.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/node.rb new file mode 100644 index 0000000..6ae5c59 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/node.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true +require_relative '../class_loader' +require_relative '../scalar_scanner' + +module Psych + module Nodes + ### + # The base class for any Node in a YAML parse tree. This class should + # never be instantiated. + class Node + include Enumerable + + # The children of this node + attr_reader :children + + # An associated tag + attr_reader :tag + + # The line number where this node start + attr_accessor :start_line + + # The column number where this node start + attr_accessor :start_column + + # The line number where this node ends + attr_accessor :end_line + + # The column number where this node ends + attr_accessor :end_column + + # Create a new Psych::Nodes::Node + def initialize + @children = [] + end + + ### + # Iterate over each node in the tree. Yields each node to +block+ depth + # first. + def each &block + return enum_for :each unless block_given? + Visitors::DepthFirst.new(block).accept self + end + + ### + # Convert this node to Ruby. + # + # See also Psych::Visitors::ToRuby + def to_ruby(symbolize_names: false, freeze: false, strict_integer: false) + Visitors::ToRuby.create(symbolize_names: symbolize_names, freeze: freeze, strict_integer: strict_integer).accept(self) + end + alias :transform :to_ruby + + ### + # Convert this node to YAML. + # + # See also Psych::Visitors::Emitter + def yaml io = nil, options = {} + require "stringio" unless defined?(StringIO) + + real_io = io || StringIO.new(''.encode('utf-8')) + + Visitors::Emitter.new(real_io, options).accept self + return real_io.string unless io + io + end + alias :to_yaml :yaml + + def alias?; false; end + def document?; false; end + def mapping?; false; end + def scalar?; false; end + def sequence?; false; end + def stream?; false; end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/scalar.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/scalar.rb new file mode 100644 index 0000000..5550b61 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/scalar.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true +module Psych + module Nodes + ### + # This class represents a {YAML Scalar}[http://yaml.org/spec/1.1/#id858081]. + # + # This node type is a terminal node and should not have any children. + class Scalar < Psych::Nodes::Node + # Any style scalar, the emitter chooses + ANY = 0 + + # Plain scalar style + PLAIN = 1 + + # Single quoted style + SINGLE_QUOTED = 2 + + # Double quoted style + DOUBLE_QUOTED = 3 + + # Literal style + LITERAL = 4 + + # Folded style + FOLDED = 5 + + # The scalar value + attr_accessor :value + + # The anchor value (if there is one) + attr_accessor :anchor + + # The tag value (if there is one) + attr_accessor :tag + + # Is this a plain scalar? + attr_accessor :plain + + # Is this scalar quoted? + attr_accessor :quoted + + # The style of this scalar + attr_accessor :style + + ### + # Create a new Psych::Nodes::Scalar object. + # + # +value+ is the string value of the scalar + # +anchor+ is an associated anchor or nil + # +tag+ is an associated tag or nil + # +plain+ is a boolean value + # +quoted+ is a boolean value + # +style+ is an integer indicating the string style + # + # == See Also + # + # See also Psych::Handler#scalar + def initialize value, anchor = nil, tag = nil, plain = true, quoted = false, style = ANY + @value = value + @anchor = anchor + @tag = tag + @plain = plain + @quoted = quoted + @style = style + end + + def scalar?; true; end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/sequence.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/sequence.rb new file mode 100644 index 0000000..740f193 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/sequence.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true +module Psych + module Nodes + ### + # This class represents a + # {YAML sequence}[http://yaml.org/spec/1.1/#sequence/syntax]. + # + # A YAML sequence is basically a list, and looks like this: + # + # %YAML 1.1 + # --- + # - I am + # - a Sequence + # + # A YAML sequence may have an anchor like this: + # + # %YAML 1.1 + # --- + # &A [ + # "This sequence", + # "has an anchor" + # ] + # + # A YAML sequence may also have a tag like this: + # + # %YAML 1.1 + # --- + # !!seq [ + # "This sequence", + # "has a tag" + # ] + # + # This class represents a sequence in a YAML document. A + # Psych::Nodes::Sequence node may have 0 or more children. Valid children + # for this node are: + # + # * Psych::Nodes::Sequence + # * Psych::Nodes::Mapping + # * Psych::Nodes::Scalar + # * Psych::Nodes::Alias + class Sequence < Psych::Nodes::Node + # Any Styles, emitter chooses + ANY = 0 + + # Block style sequence + BLOCK = 1 + + # Flow style sequence + FLOW = 2 + + # The anchor for this sequence (if any) + attr_accessor :anchor + + # The tag name for this sequence (if any) + attr_accessor :tag + + # Is this sequence started implicitly? + attr_accessor :implicit + + # The sequence style used + attr_accessor :style + + ### + # Create a new object representing a YAML sequence. + # + # +anchor+ is the anchor associated with the sequence or nil. + # +tag+ is the tag associated with the sequence or nil. + # +implicit+ a boolean indicating whether or not the sequence was + # implicitly started. + # +style+ is an integer indicating the list style. + # + # See Psych::Handler#start_sequence + def initialize anchor = nil, tag = nil, implicit = true, style = BLOCK + super() + @anchor = anchor + @tag = tag + @implicit = implicit + @style = style + end + + def sequence?; true; end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/stream.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/stream.rb new file mode 100644 index 0000000..b525217 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/stream.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true +module Psych + module Nodes + ### + # Represents a YAML stream. This is the root node for any YAML parse + # tree. This node must have one or more child nodes. The only valid + # child node for a Psych::Nodes::Stream node is Psych::Nodes::Document. + class Stream < Psych::Nodes::Node + + # Encodings supported by Psych (and libyaml) + + # Any encoding + ANY = Psych::Parser::ANY + + # UTF-8 encoding + UTF8 = Psych::Parser::UTF8 + + # UTF-16LE encoding + UTF16LE = Psych::Parser::UTF16LE + + # UTF-16BE encoding + UTF16BE = Psych::Parser::UTF16BE + + # The encoding used for this stream + attr_accessor :encoding + + ### + # Create a new Psych::Nodes::Stream node with an +encoding+ that + # defaults to Psych::Nodes::Stream::UTF8. + # + # See also Psych::Handler#start_stream + def initialize encoding = UTF8 + super() + @encoding = encoding + end + + def stream?; true; end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/omap.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/omap.rb new file mode 100644 index 0000000..29cde0b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/omap.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true +module Psych + class Omap < ::Hash + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/parser.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/parser.rb new file mode 100644 index 0000000..2181c73 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/parser.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true +module Psych + ### + # YAML event parser class. This class parses a YAML document and calls + # events on the handler that is passed to the constructor. The events can + # be used for things such as constructing a YAML AST or deserializing YAML + # documents. It can even be fed back to Psych::Emitter to emit the same + # document that was parsed. + # + # See Psych::Handler for documentation on the events that Psych::Parser emits. + # + # Here is an example that prints out ever scalar found in a YAML document: + # + # # Handler for detecting scalar values + # class ScalarHandler < Psych::Handler + # def scalar value, anchor, tag, plain, quoted, style + # puts value + # end + # end + # + # parser = Psych::Parser.new(ScalarHandler.new) + # parser.parse(yaml_document) + # + # Here is an example that feeds the parser back in to Psych::Emitter. The + # YAML document is read from STDIN and written back out to STDERR: + # + # parser = Psych::Parser.new(Psych::Emitter.new($stderr)) + # parser.parse($stdin) + # + # Psych uses Psych::Parser in combination with Psych::TreeBuilder to + # construct an AST of the parsed YAML document. + + class Parser + class Mark < Struct.new(:index, :line, :column) + end + + # The handler on which events will be called + attr_accessor :handler + + # Set the encoding for this parser to +encoding+ + attr_writer :external_encoding + + ### + # Creates a new Psych::Parser instance with +handler+. YAML events will + # be called on +handler+. See Psych::Parser for more details. + + def initialize handler = Handler.new + @handler = handler + @external_encoding = ANY + end + + ### + # call-seq: + # parser.parse(yaml) + # + # Parse the YAML document contained in +yaml+. Events will be called on + # the handler set on the parser instance. + # + # See Psych::Parser and Psych::Parser#handler + + def parse yaml, path = yaml.respond_to?(:path) ? yaml.path : "" + _native_parse @handler, yaml, path + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/scalar_scanner.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/scalar_scanner.rb new file mode 100644 index 0000000..8cf868f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/scalar_scanner.rb @@ -0,0 +1,141 @@ +# frozen_string_literal: true + +module Psych + ### + # Scan scalars for built in types + class ScalarScanner + # Taken from http://yaml.org/type/timestamp.html + TIME = /^-?\d{4}-\d{1,2}-\d{1,2}(?:[Tt]|\s+)\d{1,2}:\d\d:\d\d(?:\.\d*)?(?:\s*(?:Z|[-+]\d{1,2}:?(?:\d\d)?))?$/ + + # Taken from http://yaml.org/type/float.html + # Base 60, [-+]inf and NaN are handled separately + FLOAT = /^(?:[-+]?([0-9][0-9_,]*)?\.[0-9]*([eE][-+][0-9]+)?(?# base 10))$/x + + # Taken from http://yaml.org/type/int.html and modified to ensure at least one numerical symbol exists + INTEGER_STRICT = /^(?:[-+]?0b[_]*[0-1][0-1_]* (?# base 2) + |[-+]?0[_]*[0-7][0-7_]* (?# base 8) + |[-+]?(0|[1-9][0-9_]*) (?# base 10) + |[-+]?0x[_]*[0-9a-fA-F][0-9a-fA-F_]* (?# base 16))$/x + + # Same as above, but allows commas. + # Not to YML spec, but kept for backwards compatibility + INTEGER_LEGACY = /^(?:[-+]?0b[_,]*[0-1][0-1_,]* (?# base 2) + |[-+]?0[_,]*[0-7][0-7_,]* (?# base 8) + |[-+]?(?:0|[1-9](?:[0-9]|,[0-9]|_[0-9])*) (?# base 10) + |[-+]?0x[_,]*[0-9a-fA-F][0-9a-fA-F_,]* (?# base 16))$/x + + attr_reader :class_loader + + # Create a new scanner + def initialize class_loader, strict_integer: false + @symbol_cache = {} + @class_loader = class_loader + @strict_integer = strict_integer + end + + # Tokenize +string+ returning the Ruby object + def tokenize string + return nil if string.empty? + return @symbol_cache[string] if @symbol_cache.key?(string) + integer_regex = @strict_integer ? INTEGER_STRICT : INTEGER_LEGACY + # Check for a String type, being careful not to get caught by hash keys, hex values, and + # special floats (e.g., -.inf). + if string.match?(%r{^[^\d.:-]?[[:alpha:]_\s!@#$%\^&*(){}<>|/\\~;=]+}) || string.match?(/\n/) + return string if string.length > 5 + + if string.match?(/^[^ytonf~]/i) + string + elsif string == '~' || string.match?(/^null$/i) + nil + elsif string.match?(/^(yes|true|on)$/i) + true + elsif string.match?(/^(no|false|off)$/i) + false + else + string + end + elsif string.match?(TIME) + begin + parse_time string + rescue ArgumentError + string + end + elsif string.match?(/^\d{4}-(?:1[012]|0\d|\d)-(?:[12]\d|3[01]|0\d|\d)$/) + begin + class_loader.date.strptime(string, '%F', Date::GREGORIAN) + rescue ArgumentError + string + end + elsif string.match?(/^\+?\.inf$/i) + Float::INFINITY + elsif string.match?(/^-\.inf$/i) + -Float::INFINITY + elsif string.match?(/^\.nan$/i) + Float::NAN + elsif string.match?(/^:./) + if string =~ /^:(["'])(.*)\1/ + @symbol_cache[string] = class_loader.symbolize($2.sub(/^:/, '')) + else + @symbol_cache[string] = class_loader.symbolize(string.sub(/^:/, '')) + end + elsif string.match?(/^[-+]?[0-9][0-9_]*(:[0-5]?[0-9]){1,2}$/) + i = 0 + string.split(':').each_with_index do |n,e| + i += (n.to_i * 60 ** (e - 2).abs) + end + i + elsif string.match?(/^[-+]?[0-9][0-9_]*(:[0-5]?[0-9]){1,2}\.[0-9_]*$/) + i = 0 + string.split(':').each_with_index do |n,e| + i += (n.to_f * 60 ** (e - 2).abs) + end + i + elsif string.match?(FLOAT) + if string.match?(/\A[-+]?\.\Z/) + string + else + Float(string.delete(',_').gsub(/\.([Ee]|$)/, '\1')) + end + elsif string.match?(integer_regex) + parse_int string + else + string + end + end + + ### + # Parse and return an int from +string+ + def parse_int string + Integer(string.delete(',_')) + end + + ### + # Parse and return a Time from +string+ + def parse_time string + klass = class_loader.load 'Time' + + date, time = *(string.split(/[ tT]/, 2)) + (yy, m, dd) = date.match(/^(-?\d{4})-(\d{1,2})-(\d{1,2})/).captures.map { |x| x.to_i } + md = time.match(/(\d+:\d+:\d+)(?:\.(\d*))?\s*(Z|[-+]\d+(:\d\d)?)?/) + + (hh, mm, ss) = md[1].split(':').map { |x| x.to_i } + us = (md[2] ? Rational("0.#{md[2]}") : 0) * 1000000 + + time = klass.utc(yy, m, dd, hh, mm, ss, us) + + return time if 'Z' == md[3] + return klass.at(time.to_i, us) unless md[3] + + tz = md[3].match(/^([+\-]?\d{1,2})\:?(\d{1,2})?$/)[1..-1].compact.map { |digit| Integer(digit, 10) } + offset = tz.first * 3600 + + if offset < 0 + offset -= ((tz[1] || 0) * 60) + else + offset += ((tz[1] || 0) * 60) + end + + klass.new(yy, m, dd, hh, mm, ss+us/(1_000_000r), offset) + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/set.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/set.rb new file mode 100644 index 0000000..760d217 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/set.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true +module Psych + class Set < ::Hash + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/stream.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/stream.rb new file mode 100644 index 0000000..24e45af --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/stream.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true +module Psych + ### + # Psych::Stream is a streaming YAML emitter. It will not buffer your YAML, + # but send it straight to an IO. + # + # Here is an example use: + # + # stream = Psych::Stream.new($stdout) + # stream.start + # stream.push({:foo => 'bar'}) + # stream.finish + # + # YAML will be immediately emitted to $stdout with no buffering. + # + # Psych::Stream#start will take a block and ensure that Psych::Stream#finish + # is called, so you can do this form: + # + # stream = Psych::Stream.new($stdout) + # stream.start do |em| + # em.push(:foo => 'bar') + # end + # + class Stream < Psych::Visitors::YAMLTree + class Emitter < Psych::Emitter # :nodoc: + def end_document implicit_end = !streaming? + super + end + + def streaming? + true + end + end + + include Psych::Streaming + extend Psych::Streaming::ClassMethods + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/streaming.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/streaming.rb new file mode 100644 index 0000000..eb19792 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/streaming.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true +module Psych + module Streaming + module ClassMethods + ### + # Create a new streaming emitter. Emitter will print to +io+. See + # Psych::Stream for an example. + def new io + emitter = const_get(:Emitter).new(io) + class_loader = ClassLoader.new + ss = ScalarScanner.new class_loader + super(emitter, ss, {}) + end + end + + ### + # Start streaming using +encoding+ + def start encoding = Nodes::Stream::UTF8 + super.tap { yield self if block_given? } + ensure + finish if block_given? + end + + private + def register target, obj + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/syntax_error.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/syntax_error.rb new file mode 100644 index 0000000..a4c9c4a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/syntax_error.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +require_relative 'exception' + +module Psych + class SyntaxError < Psych::Exception + attr_reader :file, :line, :column, :offset, :problem, :context + + def initialize file, line, col, offset, problem, context + err = [problem, context].compact.join ' ' + filename = file || '' + message = "(%s): %s at line %d column %d" % [filename, err, line, col] + + @file = file + @line = line + @column = col + @offset = offset + @problem = problem + @context = context + super(message) + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/tree_builder.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/tree_builder.rb new file mode 100644 index 0000000..83115bd --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/tree_builder.rb @@ -0,0 +1,137 @@ +# frozen_string_literal: true +require_relative 'handler' + +module Psych + ### + # This class works in conjunction with Psych::Parser to build an in-memory + # parse tree that represents a YAML document. + # + # == Example + # + # parser = Psych::Parser.new Psych::TreeBuilder.new + # parser.parse('--- foo') + # tree = parser.handler.root + # + # See Psych::Handler for documentation on the event methods used in this + # class. + class TreeBuilder < Psych::Handler + # Returns the root node for the built tree + attr_reader :root + + # Create a new TreeBuilder instance + def initialize + @stack = [] + @last = nil + @root = nil + + @start_line = nil + @start_column = nil + @end_line = nil + @end_column = nil + end + + def event_location(start_line, start_column, end_line, end_column) + @start_line = start_line + @start_column = start_column + @end_line = end_line + @end_column = end_column + end + + %w{ + Sequence + Mapping + }.each do |node| + class_eval <<~RUBY, __FILE__, __LINE__ + 1 + def start_#{node.downcase}(anchor, tag, implicit, style) + n = Nodes::#{node}.new(anchor, tag, implicit, style) + set_start_location(n) + @last.children << n + push n + end + + def end_#{node.downcase} + n = pop + set_end_location(n) + n + end + RUBY + end + + ### + # Handles start_document events with +version+, +tag_directives+, + # and +implicit+ styling. + # + # See Psych::Handler#start_document + def start_document version, tag_directives, implicit + n = Nodes::Document.new version, tag_directives, implicit + set_start_location(n) + @last.children << n + push n + end + + ### + # Handles end_document events with +version+, +tag_directives+, + # and +implicit+ styling. + # + # See Psych::Handler#start_document + def end_document implicit_end = !streaming? + @last.implicit_end = implicit_end + n = pop + set_end_location(n) + n + end + + def start_stream encoding + @root = Nodes::Stream.new(encoding) + set_start_location(@root) + push @root + end + + def end_stream + n = pop + set_end_location(n) + n + end + + def scalar value, anchor, tag, plain, quoted, style + s = Nodes::Scalar.new(value,anchor,tag,plain,quoted,style) + set_location(s) + @last.children << s + s + end + + def alias anchor + a = Nodes::Alias.new(anchor) + set_location(a) + @last.children << a + a + end + + private + def push value + @stack.push value + @last = value + end + + def pop + x = @stack.pop + @last = @stack.last + x + end + + def set_location(node) + set_start_location(node) + set_end_location(node) + end + + def set_start_location(node) + node.start_line = @start_line + node.start_column = @start_column + end + + def set_end_location(node) + node.end_line = @end_line + node.end_column = @end_column + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/versions.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/versions.rb new file mode 100644 index 0000000..3202b10 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/versions.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +module Psych + # The version of Psych you are using + VERSION = '5.2.6' + + if RUBY_ENGINE == 'jruby' + DEFAULT_SNAKEYAML_VERSION = '2.9'.freeze + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors.rb new file mode 100644 index 0000000..508290d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true +require_relative 'visitors/visitor' +require_relative 'visitors/to_ruby' +require_relative 'visitors/emitter' +require_relative 'visitors/yaml_tree' +require_relative 'visitors/json_tree' +require_relative 'visitors/depth_first' diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/depth_first.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/depth_first.rb new file mode 100644 index 0000000..b4ff9e4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/depth_first.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true +module Psych + module Visitors + class DepthFirst < Psych::Visitors::Visitor + def initialize block + @block = block + end + + private + + def nary o + o.children.each { |x| visit x } + @block.call o + end + alias :visit_Psych_Nodes_Stream :nary + alias :visit_Psych_Nodes_Document :nary + alias :visit_Psych_Nodes_Sequence :nary + alias :visit_Psych_Nodes_Mapping :nary + + def terminal o + @block.call o + end + alias :visit_Psych_Nodes_Scalar :terminal + alias :visit_Psych_Nodes_Alias :terminal + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/emitter.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/emitter.rb new file mode 100644 index 0000000..e3b92b7 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/emitter.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true +module Psych + module Visitors + class Emitter < Psych::Visitors::Visitor + def initialize io, options = {} + opts = [:indentation, :canonical, :line_width].find_all { |opt| + options.key?(opt) + } + + if opts.empty? + @handler = Psych::Emitter.new io + else + du = Handler::DumperOptions.new + opts.each { |option| du.send :"#{option}=", options[option] } + @handler = Psych::Emitter.new io, du + end + end + + def visit_Psych_Nodes_Stream o + @handler.start_stream o.encoding + o.children.each { |c| accept c } + @handler.end_stream + end + + def visit_Psych_Nodes_Document o + @handler.start_document o.version, o.tag_directives, o.implicit + o.children.each { |c| accept c } + @handler.end_document o.implicit_end + end + + def visit_Psych_Nodes_Scalar o + @handler.scalar o.value, o.anchor, o.tag, o.plain, o.quoted, o.style + end + + def visit_Psych_Nodes_Sequence o + @handler.start_sequence o.anchor, o.tag, o.implicit, o.style + o.children.each { |c| accept c } + @handler.end_sequence + end + + def visit_Psych_Nodes_Mapping o + @handler.start_mapping o.anchor, o.tag, o.implicit, o.style + o.children.each { |c| accept c } + @handler.end_mapping + end + + def visit_Psych_Nodes_Alias o + @handler.alias o.anchor + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/json_tree.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/json_tree.rb new file mode 100644 index 0000000..979fc10 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/json_tree.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true +require_relative '../json/ruby_events' + +module Psych + module Visitors + class JSONTree < YAMLTree + include Psych::JSON::RubyEvents + + def self.create options = {} + emitter = Psych::JSON::TreeBuilder.new + class_loader = ClassLoader.new + ss = ScalarScanner.new class_loader + new(emitter, ss, options) + end + + def accept target + if target.respond_to?(:encode_with) + dump_coder target + else + send(@dispatch_cache[target.class], target) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/to_ruby.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/to_ruby.rb new file mode 100644 index 0000000..580a74e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/to_ruby.rb @@ -0,0 +1,475 @@ +# frozen_string_literal: true +require_relative '../scalar_scanner' +require_relative '../class_loader' +require_relative '../exception' + +unless defined?(Regexp::NOENCODING) + Regexp::NOENCODING = 32 +end + +module Psych + module Visitors + ### + # This class walks a YAML AST, converting each node to Ruby + class ToRuby < Psych::Visitors::Visitor + def self.create(symbolize_names: false, freeze: false, strict_integer: false) + class_loader = ClassLoader.new + scanner = ScalarScanner.new class_loader, strict_integer: strict_integer + new(scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze) + end + + attr_reader :class_loader + + def initialize ss, class_loader, symbolize_names: false, freeze: false + super() + @st = {} + @ss = ss + @load_tags = Psych.load_tags + @domain_types = Psych.domain_types + @class_loader = class_loader + @symbolize_names = symbolize_names + @freeze = freeze + end + + def accept target + result = super + + unless @domain_types.empty? || !target.tag + key = target.tag.sub(/^[!\/]*/, '').sub(/(,\d+)\//, '\1:') + key = "tag:#{key}" unless key.match?(/^(?:tag:|x-private)/) + + if @domain_types.key? key + value, block = @domain_types[key] + result = block.call value, result + end + end + + result = deduplicate(result).freeze if @freeze + result + end + + def deserialize o + if klass = resolve_class(@load_tags[o.tag]) + instance = klass.allocate + + if instance.respond_to?(:init_with) + coder = Psych::Coder.new(o.tag) + coder.scalar = o.value + instance.init_with coder + end + + return instance + end + + return o.value if o.quoted + return @ss.tokenize(o.value) unless o.tag + + case o.tag + when '!binary', 'tag:yaml.org,2002:binary' + o.value.unpack('m').first + when /^!(?:str|ruby\/string)(?::(.*))?$/, 'tag:yaml.org,2002:str' + klass = resolve_class($1) + if klass + klass.allocate.replace o.value + else + o.value + end + when '!ruby/object:BigDecimal' + require 'bigdecimal' unless defined? BigDecimal + class_loader.big_decimal._load o.value + when "!ruby/object:DateTime" + class_loader.date_time + t = @ss.parse_time(o.value) + DateTime.civil(*t.to_a[0, 6].reverse, Rational(t.utc_offset, 86400)) + + (t.subsec/86400) + when '!ruby/encoding' + ::Encoding.find o.value + when "!ruby/object:Complex" + class_loader.complex + Complex(o.value) + when "!ruby/object:Rational" + class_loader.rational + Rational(o.value) + when "!ruby/class", "!ruby/module" + resolve_class o.value + when "tag:yaml.org,2002:float", "!float" + Float(@ss.tokenize(o.value)) + when "!ruby/regexp" + klass = class_loader.regexp + matches = /^\/(?.*)\/(?[mixn]*)$/m.match(o.value) + source = matches[:string].gsub('\/', '/') + options = 0 + lang = nil + matches[:options].each_char do |option| + case option + when 'x' then options |= Regexp::EXTENDED + when 'i' then options |= Regexp::IGNORECASE + when 'm' then options |= Regexp::MULTILINE + when 'n' then options |= Regexp::NOENCODING + else lang = option + end + end + klass.new(*[source, options, lang].compact) + when "!ruby/range" + klass = class_loader.range + args = o.value.split(/([.]{2,3})/, 2).map { |s| + accept Nodes::Scalar.new(s) + } + args.push(args.delete_at(1) == '...') + klass.new(*args) + when /^!ruby\/sym(bol)?:?(.*)?$/ + class_loader.symbolize o.value + else + @ss.tokenize o.value + end + end + private :deserialize + + def visit_Psych_Nodes_Scalar o + register o, deserialize(o) + end + + def visit_Psych_Nodes_Sequence o + if klass = resolve_class(@load_tags[o.tag]) + instance = klass.allocate + + if instance.respond_to?(:init_with) + coder = Psych::Coder.new(o.tag) + coder.seq = o.children.map { |c| accept c } + instance.init_with coder + end + + return instance + end + + case o.tag + when nil + register_empty(o) + when '!omap', 'tag:yaml.org,2002:omap' + map = register(o, Psych::Omap.new) + o.children.each { |a| + map[accept(a.children.first)] = accept a.children.last + } + map + when /^!(?:seq|ruby\/array):(.*)$/ + klass = resolve_class($1) + list = register(o, klass.allocate) + o.children.each { |c| list.push accept c } + list + else + register_empty(o) + end + end + + def visit_Psych_Nodes_Mapping o + if @load_tags[o.tag] + return revive(resolve_class(@load_tags[o.tag]), o) + end + return revive_hash(register(o, {}), o) unless o.tag + + case o.tag + when /^!ruby\/struct:?(.*)?$/ + klass = resolve_class($1) if $1 + + if klass + s = register(o, klass.allocate) + + members = {} + struct_members = s.members.map { |x| class_loader.symbolize x } + o.children.each_slice(2) do |k,v| + member = accept(k) + value = accept(v) + if struct_members.include?(class_loader.symbolize(member)) + s.send("#{member}=", value) + else + members[member.to_s.sub(/^@/, '')] = value + end + end + init_with(s, members, o) + else + klass = class_loader.struct + members = o.children.map { |c| accept c } + h = Hash[*members] + s = klass.new(*h.map { |k,v| + class_loader.symbolize k + }).new(*h.map { |k,v| v }) + register(o, s) + s + end + + when /^!ruby\/data(-with-ivars)?(?::(.*))?$/ + data = register(o, resolve_class($2).allocate) if $2 + members = {} + + if $1 # data-with-ivars + ivars = {} + o.children.each_slice(2) do |type, vars| + case accept(type) + when 'members' + revive_data_members(members, vars) + data ||= allocate_anon_data(o, members) + when 'ivars' + revive_hash(ivars, vars) + end + end + ivars.each do |ivar, v| + data.instance_variable_set ivar, v + end + else + revive_data_members(members, o) + end + data ||= allocate_anon_data(o, members) + init_struct(data, **members) + data.freeze + data + + when /^!ruby\/object:?(.*)?$/ + name = $1 || 'Object' + + if name == 'Complex' + class_loader.complex + h = Hash[*o.children.map { |c| accept c }] + register o, Complex(h['real'], h['image']) + elsif name == 'Rational' + class_loader.rational + h = Hash[*o.children.map { |c| accept c }] + register o, Rational(h['numerator'], h['denominator']) + elsif name == 'Hash' + revive_hash(register(o, {}), o) + else + obj = revive((resolve_class(name) || class_loader.object), o) + obj + end + + when /^!(?:str|ruby\/string)(?::(.*))?$/, 'tag:yaml.org,2002:str' + klass = resolve_class($1) + members = {} + string = nil + + o.children.each_slice(2) do |k,v| + key = accept k + value = accept v + + if key == 'str' + if klass + string = klass.allocate.replace value + else + string = value + end + register(o, string) + else + members[key] = value + end + end + init_with(string, members.map { |k,v| [k.to_s.sub(/^@/, ''),v] }, o) + when /^!ruby\/array:(.*)$/ + klass = resolve_class($1) + list = register(o, klass.allocate) + + members = Hash[o.children.map { |c| accept c }.each_slice(2).to_a] + list.replace members['internal'] + + members['ivars'].each do |ivar, v| + list.instance_variable_set ivar, v + end + list + + when '!ruby/range' + klass = class_loader.range + h = Hash[*o.children.map { |c| accept c }] + register o, klass.new(h['begin'], h['end'], h['excl']) + + when /^!ruby\/exception:?(.*)?$/ + h = Hash[*o.children.map { |c| accept c }] + + e = build_exception((resolve_class($1) || class_loader.exception), + h.delete('message')) + + e.set_backtrace h.delete('backtrace') if h.key? 'backtrace' + init_with(e, h, o) + + when '!set', 'tag:yaml.org,2002:set' + set = class_loader.psych_set.new + @st[o.anchor] = set if o.anchor + o.children.each_slice(2) do |k,v| + set[accept(k)] = accept(v) + end + set + + when /^!ruby\/hash-with-ivars(?::(.*))?$/ + hash = $1 ? resolve_class($1).allocate : {} + register o, hash + o.children.each_slice(2) do |key, value| + case key.value + when 'elements' + revive_hash hash, value + when 'ivars' + value.children.each_slice(2) do |k,v| + hash.instance_variable_set accept(k), accept(v) + end + end + end + hash + + when /^!map:(.*)$/, /^!ruby\/hash:(.*)$/ + revive_hash register(o, resolve_class($1).allocate), o + + when '!omap', 'tag:yaml.org,2002:omap' + map = register(o, class_loader.psych_omap.new) + o.children.each_slice(2) do |l,r| + map[accept(l)] = accept r + end + map + + when /^!ruby\/marshalable:(.*)$/ + name = $1 + klass = resolve_class(name) + obj = register(o, klass.allocate) + + if obj.respond_to?(:init_with) + init_with(obj, revive_hash({}, o), o) + elsif obj.respond_to?(:marshal_load) + marshal_data = o.children.map(&method(:accept)) + obj.marshal_load(marshal_data) + obj + else + raise ArgumentError, "Cannot deserialize #{name}" + end + + else + revive_hash(register(o, {}), o) + end + end + + def visit_Psych_Nodes_Document o + accept o.root + end + + def visit_Psych_Nodes_Stream o + o.children.map { |c| accept c } + end + + def visit_Psych_Nodes_Alias o + @st.fetch(o.anchor) { raise AnchorNotDefined, o.anchor } + end + + private + + def register node, object + @st[node.anchor] = object if node.anchor + object + end + + def register_empty object + list = register(object, []) + object.children.each { |c| list.push accept c } + list + end + + def allocate_anon_data node, members + klass = class_loader.data.define(*members.keys) + register(node, klass.allocate) + end + + def revive_data_members hash, o + o.children.each_slice(2) do |k,v| + name = accept(k) + value = accept(v) + hash[class_loader.symbolize(name)] = value + end + hash + end + + def revive_hash hash, o, tagged= false + o.children.each_slice(2) { |k,v| + key = accept(k) + val = accept(v) + + if key == '<<' && k.tag != "tag:yaml.org,2002:str" + case v + when Nodes::Alias, Nodes::Mapping + begin + hash.merge! val + rescue TypeError + hash[key] = val + end + when Nodes::Sequence + begin + h = {} + val.reverse_each do |value| + h.merge! value + end + hash.merge! h + rescue TypeError + hash[key] = val + end + else + hash[key] = val + end + else + if !tagged && @symbolize_names && key.is_a?(String) + key = key.to_sym + elsif !@freeze + key = deduplicate(key) + end + + hash[key] = val + end + + } + hash + end + + if RUBY_VERSION < '2.7' + def deduplicate key + if key.is_a?(String) + # It is important to untaint the string, otherwise it won't + # be deduplicated into an fstring, but simply frozen. + -(key.untaint) + else + key + end + end + else + def deduplicate key + if key.is_a?(String) + -key + else + key + end + end + end + + def merge_key hash, key, val + end + + def revive klass, node + s = register(node, klass.allocate) + init_with(s, revive_hash({}, node, true), node) + end + + def init_with o, h, node + c = Psych::Coder.new(node.tag) + c.map = h + + if o.respond_to?(:init_with) + o.init_with c + else + h.each { |k,v| o.instance_variable_set(:"@#{k}", v) } + end + o + end + + # Convert +klassname+ to a Class + def resolve_class klassname + class_loader.load klassname + end + end + + class NoAliasRuby < ToRuby + def visit_Psych_Nodes_Alias o + raise AliasesNotEnabled + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/visitor.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/visitor.rb new file mode 100644 index 0000000..21052aa --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/visitor.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true +module Psych + module Visitors + class Visitor + def accept target + visit target + end + + private + + # @api private + def self.dispatch_cache + Hash.new do |hash, klass| + hash[klass] = :"visit_#{klass.name.gsub('::', '_')}" + end.compare_by_identity + end + + if defined?(Ractor) + def dispatch + @dispatch_cache ||= (Ractor.current[:Psych_Visitors_Visitor] ||= Visitor.dispatch_cache) + end + else + DISPATCH = dispatch_cache + def dispatch + DISPATCH + end + end + + def visit target + send dispatch[target.class], target + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/yaml_tree.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/yaml_tree.rb new file mode 100644 index 0000000..b6c86f4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/yaml_tree.rb @@ -0,0 +1,626 @@ +# frozen_string_literal: true +require_relative '../tree_builder' +require_relative '../scalar_scanner' +require_relative '../class_loader' + +module Psych + module Visitors + ### + # YAMLTree builds a YAML ast given a Ruby object. For example: + # + # builder = Psych::Visitors::YAMLTree.new + # builder << { :foo => 'bar' } + # builder.tree # => # v } + @emitter.end_sequence + end + + def visit_Encoding o + tag = "!ruby/encoding" + @emitter.scalar o.name, nil, tag, false, false, Nodes::Scalar::ANY + end + + def visit_Object o + tag = Psych.dump_tags[o.class] + unless tag + klass = o.class == Object ? nil : o.class.name + tag = ['!ruby/object', klass].compact.join(':') + end + + map = @emitter.start_mapping(nil, tag, false, Nodes::Mapping::BLOCK) + register(o, map) + + dump_ivars o + @emitter.end_mapping + end + + alias :visit_Delegator :visit_Object + + def visit_Data o + ivars = o.instance_variables + if ivars.empty? + tag = ['!ruby/data', o.class.name].compact.join(':') + register o, @emitter.start_mapping(nil, tag, false, Nodes::Mapping::BLOCK) + o.members.each do |member| + @emitter.scalar member.to_s, nil, nil, true, false, Nodes::Scalar::ANY + accept o.send member + end + @emitter.end_mapping + + else + tag = ['!ruby/data-with-ivars', o.class.name].compact.join(':') + node = @emitter.start_mapping(nil, tag, false, Psych::Nodes::Mapping::BLOCK) + register(o, node) + + # Dump the members + accept 'members' + @emitter.start_mapping nil, nil, true, Nodes::Mapping::BLOCK + o.members.each do |member| + @emitter.scalar member.to_s, nil, nil, true, false, Nodes::Scalar::ANY + accept o.send member + end + @emitter.end_mapping + + # Dump the ivars + accept 'ivars' + @emitter.start_mapping nil, nil, true, Nodes::Mapping::BLOCK + ivars.each do |ivar| + accept ivar.to_s + accept o.instance_variable_get ivar + end + @emitter.end_mapping + + @emitter.end_mapping + end + end unless RUBY_VERSION < "3.2" + + def visit_Struct o + tag = ['!ruby/struct', o.class.name].compact.join(':') + + register o, @emitter.start_mapping(nil, tag, false, Nodes::Mapping::BLOCK) + o.members.each do |member| + @emitter.scalar member.to_s, nil, nil, true, false, Nodes::Scalar::ANY + accept o[member] + end + + dump_ivars o + + @emitter.end_mapping + end + + def visit_Exception o + dump_exception o, o.message.to_s + end + + def visit_NameError o + dump_exception o, o.message.to_s + end + + def visit_Regexp o + register o, @emitter.scalar(o.inspect, nil, '!ruby/regexp', false, false, Nodes::Scalar::ANY) + end + + def visit_Date o + formatted = format_date o + register o, @emitter.scalar(formatted, nil, nil, true, false, Nodes::Scalar::ANY) + end + + def visit_DateTime o + t = o.italy + formatted = format_time t, t.offset.zero? + tag = '!ruby/object:DateTime' + register o, @emitter.scalar(formatted, nil, tag, false, false, Nodes::Scalar::ANY) + end + + def visit_Time o + formatted = format_time o + register o, @emitter.scalar(formatted, nil, nil, true, false, Nodes::Scalar::ANY) + end + + def visit_Rational o + register o, @emitter.start_mapping(nil, '!ruby/object:Rational', false, Nodes::Mapping::BLOCK) + + [ + 'denominator', o.denominator.to_s, + 'numerator', o.numerator.to_s + ].each do |m| + @emitter.scalar m, nil, nil, true, false, Nodes::Scalar::ANY + end + + @emitter.end_mapping + end + + def visit_Complex o + register o, @emitter.start_mapping(nil, '!ruby/object:Complex', false, Nodes::Mapping::BLOCK) + + ['real', o.real.to_s, 'image', o.imag.to_s].each do |m| + @emitter.scalar m, nil, nil, true, false, Nodes::Scalar::ANY + end + + @emitter.end_mapping + end + + def visit_Integer o + @emitter.scalar o.to_s, nil, nil, true, false, Nodes::Scalar::ANY + end + alias :visit_TrueClass :visit_Integer + alias :visit_FalseClass :visit_Integer + + def visit_Float o + if o.nan? + @emitter.scalar '.nan', nil, nil, true, false, Nodes::Scalar::ANY + elsif o.infinite? + @emitter.scalar((o.infinite? > 0 ? '.inf' : '-.inf'), + nil, nil, true, false, Nodes::Scalar::ANY) + else + @emitter.scalar o.to_s, nil, nil, true, false, Nodes::Scalar::ANY + end + end + + def visit_BigDecimal o + @emitter.scalar o._dump, nil, '!ruby/object:BigDecimal', false, false, Nodes::Scalar::ANY + end + + def visit_String o + plain = true + quote = true + style = Nodes::Scalar::PLAIN + tag = nil + + if binary?(o) + o = [o].pack('m0') + tag = '!binary' # FIXME: change to below when syck is removed + #tag = 'tag:yaml.org,2002:binary' + style = Nodes::Scalar::LITERAL + plain = false + quote = false + elsif o.match?(/\n(?!\Z)/) # match \n except blank line at the end of string + style = Nodes::Scalar::LITERAL + elsif o == '<<' + style = Nodes::Scalar::SINGLE_QUOTED + tag = 'tag:yaml.org,2002:str' + plain = false + quote = false + elsif o == 'y' || o == 'Y' || o == 'n' || o == 'N' + style = Nodes::Scalar::DOUBLE_QUOTED + elsif @line_width && o.length > @line_width + style = Nodes::Scalar::FOLDED + elsif o.match?(/^[^[:word:]][^"]*$/) + style = Nodes::Scalar::DOUBLE_QUOTED + elsif not String === @ss.tokenize(o) or /\A0[0-7]*[89]/.match?(o) + style = Nodes::Scalar::SINGLE_QUOTED + end + + is_primitive = o.class == ::String + ivars = is_primitive ? [] : o.instance_variables + + if ivars.empty? + unless is_primitive + tag = "!ruby/string:#{o.class}" + plain = false + quote = false + end + @emitter.scalar o, nil, tag, plain, quote, style + else + maptag = '!ruby/string'.dup + maptag << ":#{o.class}" unless o.class == ::String + + register o, @emitter.start_mapping(nil, maptag, false, Nodes::Mapping::BLOCK) + @emitter.scalar 'str', nil, nil, true, false, Nodes::Scalar::ANY + @emitter.scalar o, nil, tag, plain, quote, style + + dump_ivars o + + @emitter.end_mapping + end + end + + def visit_Module o + raise TypeError, "can't dump anonymous module: #{o}" unless o.name + register o, @emitter.scalar(o.name, nil, '!ruby/module', false, false, Nodes::Scalar::SINGLE_QUOTED) + end + + def visit_Class o + raise TypeError, "can't dump anonymous class: #{o}" unless o.name + register o, @emitter.scalar(o.name, nil, '!ruby/class', false, false, Nodes::Scalar::SINGLE_QUOTED) + end + + def visit_Range o + register o, @emitter.start_mapping(nil, '!ruby/range', false, Nodes::Mapping::BLOCK) + ['begin', o.begin, 'end', o.end, 'excl', o.exclude_end?].each do |m| + accept m + end + @emitter.end_mapping + end + + def visit_Hash o + if o.class == ::Hash + register(o, @emitter.start_mapping(nil, nil, true, Psych::Nodes::Mapping::BLOCK)) + o.each do |k,v| + accept(@stringify_names && Symbol === k ? k.to_s : k) + accept v + end + @emitter.end_mapping + else + visit_hash_subclass o + end + end + + def visit_Psych_Set o + register(o, @emitter.start_mapping(nil, '!set', false, Psych::Nodes::Mapping::BLOCK)) + + o.each do |k,v| + accept(@stringify_names && Symbol === k ? k.to_s : k) + accept v + end + + @emitter.end_mapping + end + + def visit_Array o + if o.class == ::Array + visit_Enumerator o + else + visit_array_subclass o + end + end + + def visit_Enumerator o + register o, @emitter.start_sequence(nil, nil, true, Nodes::Sequence::BLOCK) + o.each { |c| accept c } + @emitter.end_sequence + end + + def visit_NilClass o + @emitter.scalar('', nil, 'tag:yaml.org,2002:null', true, false, Nodes::Scalar::ANY) + end + + def visit_Symbol o + if o.empty? + @emitter.scalar "", nil, '!ruby/symbol', false, false, Nodes::Scalar::ANY + else + @emitter.scalar ":#{o}", nil, nil, true, false, Nodes::Scalar::ANY + end + end + + def visit_BasicObject o + tag = Psych.dump_tags[o.class] + tag ||= "!ruby/marshalable:#{o.class.name}" + + map = @emitter.start_mapping(nil, tag, false, Nodes::Mapping::BLOCK) + register(o, map) + + o.marshal_dump.each(&method(:accept)) + + @emitter.end_mapping + end + + private + + def binary? string + string.encoding == Encoding::ASCII_8BIT && !string.ascii_only? + end + + def visit_array_subclass o + tag = "!ruby/array:#{o.class}" + ivars = o.instance_variables + if ivars.empty? + node = @emitter.start_sequence(nil, tag, false, Nodes::Sequence::BLOCK) + register o, node + o.each { |c| accept c } + @emitter.end_sequence + else + node = @emitter.start_mapping(nil, tag, false, Nodes::Sequence::BLOCK) + register o, node + + # Dump the internal list + accept 'internal' + @emitter.start_sequence(nil, nil, true, Nodes::Sequence::BLOCK) + o.each { |c| accept c } + @emitter.end_sequence + + # Dump the ivars + accept 'ivars' + @emitter.start_mapping(nil, nil, true, Nodes::Sequence::BLOCK) + ivars.each do |ivar| + accept ivar + accept o.instance_variable_get ivar + end + @emitter.end_mapping + + @emitter.end_mapping + end + end + + def visit_hash_subclass o + ivars = o.instance_variables + if ivars.any? + tag = "!ruby/hash-with-ivars:#{o.class}" + node = @emitter.start_mapping(nil, tag, false, Psych::Nodes::Mapping::BLOCK) + register(o, node) + + # Dump the ivars + accept 'ivars' + @emitter.start_mapping nil, nil, true, Nodes::Mapping::BLOCK + o.instance_variables.each do |ivar| + accept ivar + accept o.instance_variable_get ivar + end + @emitter.end_mapping + + # Dump the elements + accept 'elements' + @emitter.start_mapping nil, nil, true, Nodes::Mapping::BLOCK + o.each do |k,v| + accept k + accept v + end + @emitter.end_mapping + + @emitter.end_mapping + else + tag = "!ruby/hash:#{o.class}" + node = @emitter.start_mapping(nil, tag, false, Psych::Nodes::Mapping::BLOCK) + register(o, node) + o.each do |k,v| + accept k + accept v + end + @emitter.end_mapping + end + end + + def dump_list o + end + + def dump_exception o, msg + tag = ['!ruby/exception', o.class.name].join ':' + + @emitter.start_mapping nil, tag, false, Nodes::Mapping::BLOCK + + if msg + @emitter.scalar 'message', nil, nil, true, false, Nodes::Scalar::ANY + accept msg + end + + @emitter.scalar 'backtrace', nil, nil, true, false, Nodes::Scalar::ANY + accept o.backtrace + + dump_ivars o + + @emitter.end_mapping + end + + def format_time time, utc = time.utc? + if utc + time.strftime("%Y-%m-%d %H:%M:%S.%9N Z") + else + time.strftime("%Y-%m-%d %H:%M:%S.%9N %:z") + end + end + + def format_date date + date.strftime("%Y-%m-%d") + end + + def register target, yaml_obj + @st.register target, yaml_obj + yaml_obj + end + + def dump_coder o + @coders << o + tag = Psych.dump_tags[o.class] + unless tag + klass = o.class == Object ? nil : o.class.name + tag = ['!ruby/object', klass].compact.join(':') + end + + c = Psych::Coder.new(tag) + o.encode_with(c) + emit_coder c, o + end + + def emit_coder c, o + case c.type + when :scalar + @emitter.scalar c.scalar, nil, c.tag, c.tag.nil?, false, c.style + when :seq + @emitter.start_sequence nil, c.tag, c.tag.nil?, c.style + c.seq.each do |thing| + accept thing + end + @emitter.end_sequence + when :map + register o, @emitter.start_mapping(nil, c.tag, c.implicit, c.style) + c.map.each do |k,v| + accept k + accept v + end + @emitter.end_mapping + when :object + accept c.object + end + end + + def dump_ivars target + target.instance_variables.each do |iv| + @emitter.scalar("#{iv.to_s.sub(/^@/, '')}", nil, nil, true, false, Nodes::Scalar::ANY) + accept target.instance_variable_get(iv) + end + end + end + + class RestrictedYAMLTree < YAMLTree + DEFAULT_PERMITTED_CLASSES = { + TrueClass => true, + FalseClass => true, + NilClass => true, + Integer => true, + Float => true, + String => true, + Array => true, + Hash => true, + }.compare_by_identity.freeze + + def initialize emitter, ss, options + super + @permitted_classes = DEFAULT_PERMITTED_CLASSES.dup + Array(options[:permitted_classes]).each do |klass| + @permitted_classes[klass] = true + end + @permitted_symbols = {}.compare_by_identity + Array(options[:permitted_symbols]).each do |symbol| + @permitted_symbols[symbol] = true + end + @aliases = options.fetch(:aliases, false) + end + + def accept target + if !@aliases && @st.key?(target) + raise BadAlias, "Tried to dump an aliased object" + end + + unless Symbol === target || @permitted_classes[target.class] + raise DisallowedClass.new('dump', target.class.name || target.class.inspect) + end + + super + end + + def visit_Symbol sym + unless @permitted_classes[Symbol] || @permitted_symbols[sym] + raise DisallowedClass.new('dump', "Symbol(#{sym.inspect})") + end + + super + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/y.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/y.rb new file mode 100644 index 0000000..e857953 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/y.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +module Kernel + ### + # An alias for Psych.dump_stream meant to be used with IRB. + def y *objects + puts Psych.dump_stream(*objects) + end + private :y +end + diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/History.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/History.md new file mode 100644 index 0000000..bcca8f2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/History.md @@ -0,0 +1,3046 @@ +## 6.6.1 / 2025-07-30 + +* Bugfixes + * Accept `to_path` to be `nil` on request bodies ([#3635]) + * Fix single runner stats before the server start ([#3572]) + * Fix incomplete worker boot state on refork ([#3601]) + * Improve HttpParserError messages for better debugging ([#3586]) + * Fix refork logs to distinguish from phased restarts ([#3598]) + * Fix `rack.after_reply` so it doesn't interrupt chain on error ([#3680]) + +## 6.6.0 / 2025-01-29 + +* Features + * Option to turn off SIGUSR2 trapping ([#3570], [#3567]) + * Shorten `ThreadPool` trimmer and reaper thread names ([#3383]) + * Add after_refork hook ([#3386]) + * Add busy threads stat ([#3517]) + * Add a debug log before running each type of hook ([#3375]) + * Allow alternative schemes in Binder ([#3348], [#3302]) + * Avoid spawning `Threadpool#trim` thread if pool size is fixed ([#3384]) + +* Bugfixes + * Change `HttpParserError` to be subclass of `StandardError` ([#3590], [#3552]) + * added test cases + * fix update phased restart symlink folder + +* Performance + * Only ping worker 0 during phased restart if using fork worker ([#3568]) + +* Refactor + * Fix multi-delimiter split to get status app token ([#3505]) + * Change ping to use const ([#3595]) + * Fixup use of Puma::Const::PipeRequest constants ([#3565]) + * Update DSL hook processing logic to be consistent ([#3376]) + +## 6.5.0 / 2024-11-23 + +* Features + * Print RUBY_DESCRIPTION when Puma starts ([#3407]) + * Set the worker process count automatically when using WEB_CONCURRENCY=auto ([#3439], [#3437]) + * Mark as ractor-safe ([#3486], [#3422]) + * Add option `enable_keep_alive`. `true` mimics existing behavior, but now can use `false` to disable keepalive to reduce queue tail latency ([#3496]) + * Add parameters to Puma methods to allow CI to change ENV in isolation ([#3485]) + * Add `ssl_ciphersuites` option for TLSv1.3 ciphers ([#3359], [#3343]) + * You can now use `--threads 5` or `threads 5` to config max/min threads with a single number (used to need to say `5:5`) ([#3309]) + * Option to turn off systemd plugin ([#3425], [#3424]) + * Add `on_stopped` hook ([#3411], [#3380]) + +* Bugfixes + * Handle blank environment variables when loading config ([#3539]) + * lib/rack/handler/puma.rb - fix for rackup v1.0.1, adjust Gemfile ([#3532], [#3531]) + * null_io.rb - add `external_encoding`, `set_encoding`, `binmode`, `binmode?` ([#3214]) + * Implement NullIO#seek and #pos to mimic IO ([#3468]) + * add support in rack handler & fix regression in binder for linux abstract namespace sockets ([#3508]) + * Use actual thread local for `Puma::Server.current`. ([#3360]) + * client.rb - fix request chunked body handling ([#3338], [#3337]) + * Properly handle two requests seen in the initial buffer ([#3332]) + * Fix response repeated status line when request is invalid or errors are raised ([#3308], [#3307]) + * Fix child processes not being reaped when `Process.detach` used ([#3314], [#3313]) + +* JRuby + * Make HTTP length constants configurable ([#3518]) + * Fixup jruby_restart.rb & launcher.rb to work with ARM64 macOS JRuby ([#3467]) + +* Performance + * Avoid checking if all workers reached timeout unless idle timeout is configured ([#3341]) + * Request body - increase read size to 64 kB ([#3548]) + * single mode skip wait_for_less_busy_worker ([#3325]) + +* Refactor + * A ton of CI/test improvements by @MSP-Greg, as usual. + * Add ThreadPool#stats and adjust Server#stats to use it ([#3527]) + * normalize whitespace in worker stats string ([#3513]) + * rack/handler/puma.rb - ssl - use `start_with?`, add test ([#3510]) + * extconf.rb - add logging for OpenSSL versions ([#3370]) + * Lazily require `Puma::Rack::Builder` ([#3340]) + * Refactor: Constantize worker pipe request types ([#3318]) + +* Docs + * stats.md improvements ([#3514]) + * control_cli.rb: Harmonize help message with bin/puma ([#3434]) + * dsl.rb: Clarify a callback's argument ([#3435]) + * lib/rack/handler/puma.rb - relocate and fixup module comment ([#3495]) + +## 6.4.3 / 2024-09-19 + +* Security + * Discards any headers using underscores if the non-underscore version also exists. Without this, an attacker could overwrite values set by intermediate proxies (e.g. X-Forwarded-For). ([CVE-2024-45614](https://github.com/puma/puma/security/advisories/GHSA-9hf4-67fc-4vf4)/GHSA-9hf4-67fc-4vf4) + +## 6.4.2 / 2024-01-08 + +* Security + * Limit the size of chunk extensions. Without this limit, an attacker could cause unbounded resource (CPU, network bandwidth) consumption. ([GHSA-c2f4-cvqm-65w2](https://github.com/puma/puma/security/advisories/GHSA-c2f4-cvqm-65w2)) + +## 6.4.1 / 2024-01-03 + +* Bugfixes + * DSL#warn_if_in_single_mode - fixup when workers set via CLI ([#3256]) + * Fix `idle-timeout` not working in cluster mode ([#3235], [#3228], [#3282], [#3283]) + * Fix worker 0 timing out during phased restart ([#3225], [#2786]) + * context_builder.rb - require openssl if verify_mode != 'none' ([#3179]) + * Make puma cluster process suitable as PID 1 ([#3255]) + * Improve Puma::NullIO consistency with real IO ([#3276]) + * extconf.rb - fixup to detect openssl info in Ruby build ([#3271], [#3266]) + * MiniSSL.java - set serialVersionUID, fix RaiseException deprecation ([#3270]) + * dsl.rb - fix warn_if_in_single_mode when WEB_CONCURRENCY is set ([#3265], [#3264]) + +* Maintenance + * LOTS of test refactoring to make tests more stable and easier to write - thanks to @MSP-Greg! + * Fix bug in tests re: TestPuma::HOST4 ([#3254]) + * Dockerfile for minimal repros: use Ruby 3.2, expect bundler installed ([#3245]) + * fix define_method calls, use Symbol parameter instead of String ([#3293]) + +* Docs + * README.md - add the puma-acme plugin ([#3301]) + * Remove `--keep-file-descriptors` flag from systemd docs ([#3248]) + * Note symlink mechanism in restart documentation for hot restart ([#3298]) + +## 6.4.0 / 2023-09-21 + +* Features + * on_thread_exit hook ([#2920]) + * on_thread_start_hook ([#3195]) + * Shutdown on idle ([#3209], [#2580]) + * New error message when control server port taken ([#3204]) + +* Refactor + * Remove `Forwardable` dependency ([#3191], #3190) + * Update URLMap Regexp usage for Ruby v3.3 ([#3165]) + +* Bugfixes + * Bring the cert_pem: parameter into parity with the cert: parameter to ssl_bind. ([#3174]) + * Fix using control server with IPv6 host ([#3181]) + * control_cli.rb - add require_relative 'log_writer' ([#3187]) + * Fix cases where fallback Rack response wasn't sent to the client ([#3094]) + +## 6.3.1 / 2023-08-18 + +* Security + * Address HTTP request smuggling vulnerabilities with zero-length Content Length header and trailer fields ([GHSA-68xg-gqqm-vgj8](https://github.com/puma/puma/security/advisories/GHSA-68xg-gqqm-vgj8)) + +## 6.3.0 / 2023-05-31 + +* Features + * Add dsl method `supported_http_methods` ([#3106], [#3014]) + * Puma error responses no longer have any fingerprints to indicate Puma ([#3161], [#3037]) + * Support decryption of SSL key ([#3133], [#3132]) + +* Bugfixes + * Don't send 103 early hints response when only invalid headers are used ([#3163]) + * Handle malformed request path ([#3155], [#3148]) + * Misc lib file fixes - trapping additional errors, CI helper ([#3129]) + * Fixup req form data file upload with "r\n" line endings ([#3137]) + * Restore rack 1.6 compatibility ([#3156]) + +* Refactor + * const.rb - Update Puma::HTTP_STATUS_CODES ([#3162]) + * Clarify Reactor#initialize ([#3151]) + +## 6.2.2 / 2023-04-17 + +* Bugfixes + * Fix Rack-related NameError by adding :: operator ([#3118], [#3117]) + +## 6.2.1 / 2023-03-31 + +* Bugfixes + * Fix java 8 compatibility ([#3109], [#3108]) + * Always write io_buffer when in "enum bodies" branch. ([#3113], [#3112]) + * Fix warn_if_in_single_mode incorrect message ([#3111]) + +## 6.2.0 / 2023-03-29 + +* Features + * Ability to supply a custom logger ([#2770], [#2511]) + * Warn when cluster mode-only hooks are defined in single mode ([#3089]) + * Adds the on_booted event ([#2709]) + +* Bugfixes + * Loggers - internal_write - catch Errno::EINVAL ([#3091]) + * commonlogger.rb - fix HIJACK time format, use constants, not strings ([#3074]) + * Fixed some edge cases regarding request hijacking ([#3072]) + +## 6.1.1 / 2023-02-28 + +* Bugfixes + * We no longer try to use the systemd plugin for JRuby ([#3079]) + * Allow ::Rack::Handler::Puma.run to work regardless of whether Rack/Rackup are loaded ([#3080]) + +## 6.1.0 / 2023-02-12 + +* Features + * WebSocket support via partial hijack ([#3058], [#3007]) + * Add built-in systemd notify support ([#3011]) + * Periodically send status to systemd ([#3006], [#2604]) + * Introduce the ability to return 413: payload too large for requests ([#3040]) + * Log loaded extensions when `PUMA_DEBUG` is set ([#3036], [#3020]) + +* Bugfixes + * Fix issue with rack 3 compatibility re: rackup ([#3061], [#3057]) + * Allow setting TCP low_latency with SSL listener ([#3065]) + +* Performance + * Reduce memory usage for large file uploads ([#3062]) + +## 6.0.2 / 2023-01-01 + +* Refactor + * Remove use of etc and time gems in Puma ([#3035], [#3033]) + * Refactor const.rb - freeze ([#3016]) + +## 6.0.1 / 2022-12-20 + +* Bugfixes + * Handle waking up a closed selector in Reactor#add ([#3005]) + * Fixup response processing, enumerable bodies ([#3004], [#3000]) + * Correctly close app body for all code paths ([#3002], [#2999]) +* Refactor + * Add IOBuffer to Client, remove from ThreadPool thread instances ([#3013]) + +## 6.0.0 / 2022-10-14 + +* Breaking Changes + * Dropping Ruby 2.2 and 2.3 support (now 2.4+) ([#2919]) + * Remote_addr functionality has changed ([#2652], [#2653]) + * No longer supporting Java 1.7 or below (JRuby 9.1 was the last release to support this) ([#2849]) + * Remove nakayoshi GC ([#2933], [#2925]) + * wait_for_less_busy_worker is now default on ([#2940]) + * Prefix all environment variables with `PUMA_` ([#2924], [#2853]) + * Removed some constants ([#2957], [#2958], [#2959], [#2960]) + * The following classes are now part of Puma's private API: `Client`, `Cluster::Worker`, `Cluster::Worker`, `HandleRequest`. ([#2988]) + * Configuration constants like `DefaultRackup` removed ([#2928]) + * Extracted `LogWriter` from `Events` ([#2798]) + * Only accept the standard 8 HTTP methods, others rejected with 501. ([#2932]) + +* Features + * Increase throughput on large (100kb+) response bodies by 3-10x ([#2896], [#2892]) + * Increase throughput on file responses ([#2923]) + * Add support for streaming bodies in Rack. ([#2740]) + * Allow OpenSSL session reuse via a 'reuse' ssl_bind method or bind string query parameter ([#2845]) + * Allow `run_hooks` to pass a hash to blocks for use later ([#2917], [#2915]) + * Allow using `preload_app!` with `fork_worker` ([#2907]) + * Support request_body_wait metric with higher precision ([#2953]) + * Allow header values to be arrays (Rack 3) ([#2936], [#2931]) + * Export Puma/Ruby versions in /stats ([#2875]) + * Allow configuring request uri max length & request path max length ([#2840]) + * Add a couple of public accessors ([#2774]) + * Log entire backtrace when worker start fails ([#2891]) + * [jruby] Enable TLSv1.3 support ([#2886]) + * [jruby] support setting TLS protocols + rename ssl_cipher_list ([#2899]) + * [jruby] Support a truststore option ([#2849], [#2904], [#2884]) + +* Bugfixes + * Load the configuration before passing it to the binder ([#2897]) + * Do not raise error raised on HTTP methods we don't recognize or support, like CONNECT ([#2932], [#1441]) + * Fixed a memory leak when creating a new SSL listener ([#2956]) + +* Refactor + * log_writer.rb - add internal_write method ([#2888]) + * Extract prune_bundler code into it's own class. ([#2797]) + * Refactor Launcher#run to increase readability (no logic change) ([#2795]) + * Ruby 3.2 will have native IO#wait_* methods, don't require io/wait ([#2903]) + * Various internal API refactorings ([#2942], [#2921], [#2922], [#2955]) + +## 5.6.9 / 2024-09-19 + +* Security + * Discards any headers using underscores if the non-underscore version also exists. Without this, an attacker could overwrite values set by intermediate proxies (e.g. X-Forwarded-For). ([CVE-2024-45614](https://github.com/puma/puma/security/advisories/GHSA-9hf4-67fc-4vf4)/GHSA-9hf4-67fc-4vf4) +* JRuby + * Must use at least Java >= 9 to compile. You can no longer build from source on Java 8. + + +## 5.6.8 / 2024-01-08 + +* Security + * Limit the size of chunk extensions. Without this limit, an attacker could cause unbounded resource (CPU, network bandwidth) consumption. ([GHSA-c2f4-cvqm-65w2](https://github.com/puma/puma/security/advisories/GHSA-c2f4-cvqm-65w2)) + +## 5.6.7 / 2023-08-18 + +* Security + * Address HTTP request smuggling vulnerabilities with zero-length Content Length header and trailer fields ([GHSA-68xg-gqqm-vgj8](https://github.com/puma/puma/security/advisories/GHSA-68xg-gqqm-vgj8)) + +## 5.6.6 / 2023-06-21 + +* Bugfix + * Prevent loading with rack 3 ([#3166]) + +## 5.6.5 / 2022-08-23 + +* Feature + * Puma::ControlCLI - allow refork command to be sent as a request ([#2868], [#2866]) + +* Bugfixes + * NullIO#closed should return false ([#2883]) + * [jruby] Fix TLS verification hang ([#2890], [#2729]) + * extconf.rb - don't use pkg_config('openssl') if '--with-openssl-dir' is used ([#2885], [#2839]) + * MiniSSL - detect SSL_CTX_set_dh_auto ([#2864], [#2863]) + * Fix rack.after_reply exceptions breaking connections ([#2861], [#2856]) + * Escape SSL cert and filenames ([#2855]) + * Fail hard if SSL certs or keys are invalid ([#2848]) + * Fail hard if SSL certs or keys cannot be read by user ([#2847]) + * Fix build with Opaque DH in LibreSSL 3.5. ([#2838]) + * Pre-existing socket file removed when TERM is issued after USR2 (if puma is running in cluster mode) ([#2817]) + * Fix Puma::StateFile#load incompatibility ([#2810]) + +## 5.6.4 / 2022-03-30 + +* Security + * Close several HTTP Request Smuggling exploits (CVE-2022-24790) + +## 5.6.2 / 2022-02-11 + +* Bugfix/Security + * Response body will always be `close`d. (GHSA-rmj8-8hhh-gv5h, related to [#2809]) + +## 5.6.1 / 2022-01-26 + +* Bugfixes + * Reverted a commit which appeared to be causing occasional blank header values ([#2809]) + +## 5.6.0 / 2022-01-25 + +* Features + * Support `localhost` integration in `ssl_bind` ([#2764], [#2708]) + * Allow backlog parameter to be set with ssl_bind DSL ([#2780]) + * Remove yaml (psych) requirement in StateFile ([#2784]) + * Allow culling of oldest workers, previously was only youngest ([#2773], [#2794]) + * Add worker_check_interval configuration option ([#2759]) + * Always send lowlevel_error response to client ([#2731], [#2341]) + * Support for cert_pem and key_pem with ssl_bind DSL ([#2728]) + +* Bugfixes + * Keep thread names under 15 characters, prevents breakage on some OSes ([#2733]) + * Fix two 'old-style-definition' compile warning ([#2807], [#2806]) + * Log environment correctly using option value ([#2799]) + * Fix warning from Ruby master (will be 3.2.0) ([#2785]) + * extconf.rb - fix openssl with old Windows builds ([#2757]) + * server.rb - rescue handling (`Errno::EBADF`) for `@notify.close` ([#2745]) + +* Refactor + * server.rb - refactor code using @options[:remote_address] ([#2742]) + * [jruby] a couple refactorings - avoid copy-ing bytes ([#2730]) + +## 5.5.2 / 2021-10-12 + +* Bugfixes + * Allow UTF-8 in HTTP header values + +## 5.5.1 / 2021-10-12 + +* Feature (added as mistake - we don't normally do this on bugfix releases, sorry!) + * Allow setting APP_ENV in preference to RACK_ENV or RAILS_ENV ([#2702]) + +* Security + * Do not allow LF as a line ending in a header (CVE-2021-41136) + +## 5.5.0 / 2021-09-19 + +* Features + * Automatic SSL certificate provisioning for localhost, via localhost gem ([#2610], [#2257]) + * add support for the PROXY protocol (v1 only) ([#2654], [#2651]) + * Add a semantic CLI option for no config file ([#2689]) + +* Bugfixes + * More elaborate exception handling - lets some dead pumas die. ([#2700], [#2699]) + * allow multiple after_worker_fork hooks ([#2690]) + * Preserve BUNDLE_APP_CONFIG on worker fork ([#2688], [#2687]) + +* Performance + * Fix performance of server-side SSL connection close. ([#2675]) + +## 5.4.0 / 2021-07-28 + +* Features + * Better/expanded names for threadpool threads ([#2657]) + * Allow pkg_config for OpenSSL ([#2648], [#1412]) + * Add `rack_url_scheme` to Puma::DSL, allows setting of `rack.url_scheme` header ([#2586], [#2569]) + +* Bugfixes + * `Binder#parse` - allow for symlinked unix path, add create_activated_fds debug ENV ([#2643], [#2638]) + * Fix deprecation warning: minissl.c - Use Random.bytes if available ([#2642]) + * Client certificates: set session id context while creating SSLContext ([#2633]) + * Fix deadlock issue in thread pool ([#2656]) + +* Refactor + * Replace `IO.select` with `IO#wait_*` when checking a single IO ([#2666]) + +## 5.3.2 / 2021-05-21 + +* Bugfixes + * Gracefully handle Rack not accepting CLI options ([#2630], [#2626]) + * Fix sigterm misbehavior ([#2629]) + * Improvements to keepalive-connection shedding ([#2628]) + +## 5.3.1 / 2021-05-11 + +* Security + * Close keepalive connections after the maximum number of fast inlined requests (CVE-2021-29509) ([#2625]) + +## 5.3.0 / 2021-05-07 + +* Features + * Add support for Linux's abstract sockets ([#2564], [#2526]) + * Add debug to worker timeout and startup ([#2559], [#2528]) + * Print warning when running one-worker cluster ([#2565], [#2534]) + * Don't close systemd activated socket on pumactl restart ([#2563], [#2504]) + +* Bugfixes + * systemd - fix event firing ([#2591], [#2572]) + * Immediately unlink temporary files ([#2613]) + * Improve parsing of HTTP_HOST header ([#2605], [#2584]) + * Handle fatal error that has no backtrace ([#2607], [#2552]) + * Fix timing out requests too early ([#2606], [#2574]) + * Handle segfault in Ruby 2.6.6 on thread-locals ([#2567], [#2566]) + * Server#closed_socket? - parameter may be a MiniSSL::Socket ([#2596]) + * Define UNPACK_TCP_STATE_FROM_TCP_INFO in the right place ([#2588], [#2556]) + * request.rb - fix chunked assembly for ascii incompatible encodings, add test ([#2585], [#2583]) + +* Performance + * Reset peerip only if remote_addr_header is set ([#2609]) + * Reduce puma_parser struct size ([#2590]) + +* Refactor + * Refactor drain on shutdown ([#2600]) + * Micro optimisations in `wait_for_less_busy_worker` feature ([#2579]) + * Lots of test fixes + +## 5.2.2 / 2021-02-22 + +* Bugfixes + * Add `#flush` and `#sync` methods to `Puma::NullIO` ([#2553]) + * Restore `sync=true` on `STDOUT` and `STDERR` streams ([#2557]) + +## 5.2.1 / 2021-02-05 + +* Bugfixes + * Fix TCP cork/uncork operations to work with ssl clients ([#2550]) + * Require rack/common_logger explicitly if :verbose is true ([#2547]) + * MiniSSL::Socket#write - use data.byteslice(wrote..-1) ([#2543]) + * Set `@env[CONTENT_LENGTH]` value as string. ([#2549]) + +## 5.2.0 / 2021-01-27 + +* Features + * 10x latency improvement for MRI on ssl connections by reducing overhead ([#2519]) + * Add option to specify the desired IO selector backend for libev ([#2522]) + * Add ability to set OpenSSL verification flags (MRI only) ([#2490]) + * Uses `flush` after writing messages to avoid mutating $stdout and $stderr using `sync=true` ([#2486]) + +* Bugfixes + * MiniSSL - Update dhparam to 2048 bit for use with SSL_CTX_set_tmp_dh ([#2535]) + * Change 'Goodbye!' message to be output after listeners are closed ([#2529]) + * Fix ssl bind logging with 0.0.0.0 and localhost ([#2533]) + * Fix compiler warnings, but skipped warnings related to ragel state machine generated code ([#1953]) + * Fix phased restart errors related to nio4r gem when using the Puma control server ([#2516]) + * Add `#string` method to `Puma::NullIO` ([#2520]) + * Fix binding via Rack handler to IPv6 addresses ([#2521]) + +* Refactor + * Refactor MiniSSL::Context on MRI, fix MiniSSL::Socket#write ([#2519]) + * Remove `Server#read_body` ([#2531]) + * Fail build if compiling extensions raises warnings on GH Actions, configurable via `MAKE_WARNINGS_INTO_ERRORS` ([#1953]) + +## 5.1.1 / 2020-12-10 + +* Bugfixes + * Fix over eager matching against banned header names ([#2510]) + +## 5.1.0 / 2020-11-30 + +* Features + * Phased restart availability is now always logged, even if it is not available. + * Prints the loaded configuration if the environment variable `PUMA_LOG_CONFIG` is present ([#2472]) + * Integrate with systemd's watchdog and notification features ([#2438]) + * Adds max_fast_inline as a configuration option for the Server object ([#2406]) + * You can now fork workers from worker 0 using SIGURG w/o fork_worker enabled [#2449] + * Add option to bind to systemd activated sockets ([#2362]) + * Add compile option to change the `QUERY_STRING` max length ([#2485]) + +* Bugfixes + * Fix JRuby handling in Puma::DSL#ssl_bind ([#2489]) + * control_cli.rb - all normal output should be to @stdout ([#2487]) + * Catch 'Error in reactor loop escaped: mode not supported for this object: r' ([#2477]) + * Ignore Rails' reaper thread (and any thread marked forksafe) for warning ([#2475]) + * Ignore illegal (by Rack spec) response header ([#2439]) + * Close idle connections immediately on shutdown ([#2460]) + * Fix some instances of phased restart errors related to the `json` gem ([#2473]) + * Remove use of `json` gem to fix phased restart errors ([#2479]) + * Fix grouping regexp of ILLEGAL_HEADER_KEY_REGEX ([#2495]) + +## 5.0.4 / 2020-10-27 + +* Bugfixes + * Pass preloaded application into new workers if available when using `preload_app` ([#2461], [#2454]) + +## 5.0.3 / 2020-10-26 + +* Bugfixes + * Add Client#io_ok?, check before Reactor#register ([#2432]) + * Fix hang on shutdown in refork ([#2442]) + * Fix `Bundler::GemNotFound` errors for `nio4r` gem during phased restarts ([#2427], [#2018]) + * Server run thread safety fix ([#2435]) + * Fire `on_booted` after server starts ([#2431], [#2212]) + * Cleanup daemonization in rc.d script ([#2409]) + +* Refactor + * Remove accept_nonblock.rb, add test_integration_ssl.rb ([#2448]) + * Refactor status.rb - dry it up a bit ([#2450]) + * Extract req/resp methods to new request.rb from server.rb ([#2419]) + * Refactor Reactor and Client request buffering ([#2279]) + * client.rb - remove JRuby specific 'finish' code ([#2412]) + * Consolidate fast_write calls in Server, extract early_hints assembly ([#2405]) + * Remove upstart from docs ([#2408]) + * Extract worker process into separate class ([#2374]) + * Consolidate option handling in Server, Server small refactors, doc changes ([#2389]) + +## 5.0.2 / 2020-09-28 + +* Bugfixes + * Reverted API changes to Server. + +## 5.0.1 / 2020-09-28 + +* Bugfixes + * Fix LoadError in CentOS 8 ([#2381]) + * Better error handling during force shutdown ([#2271]) + * Prevent connections from entering Reactor after shutdown begins ([#2377]) + * Fix error backtrace debug logging && Do not log request dump if it is not parsed ([#2376]) + * Split TCP_CORK and TCP_INFO ([#2372]) + * Do not log EOFError when a client connection is closed without write ([#2384]) + +* Refactor + * Change Events#ssl_error signature from (error, peeraddr, peercert) to (error, ssl_socket) ([#2375]) + * Consolidate option handling in Server, Server small refactors, doc chang ([#2373]) + +## 5.0.0 / 2020-09-17 + +* Features + * Allow compiling without OpenSSL and dynamically load files needed for SSL, add 'no ssl' CI ([#2305]) + * EXPERIMENTAL: Add `fork_worker` option and `refork` command for reduced memory usage by forking from a worker process instead of the master process. ([#2099]) + * EXPERIMENTAL: Added `wait_for_less_busy_worker` config. This may reduce latency on MRI through inserting a small delay before re-listening on the socket if worker is busy ([#2079]). + * EXPERIMENTAL: Added `nakayoshi_fork` option. Reduce memory usage in preloaded cluster-mode apps by GCing before fork and compacting, where available. ([#2093], [#2256]) + * Added pumactl `thread-backtraces` command to print thread backtraces ([#2054]) + * Added incrementing `requests_count` to `Puma.stats`. ([#2106]) + * Increased maximum URI path length from 2048 to 8192 bytes ([#2167], [#2344]) + * `lowlevel_error_handler` is now called during a forced threadpool shutdown, and if a callable with 3 arguments is set, we now also pass the status code ([#2203]) + * Faster phased restart and worker timeout ([#2220]) + * Added `state_permission` to config DSL to set state file permissions ([#2238]) + * Added `Puma.stats_hash`, which returns a stats in Hash instead of a JSON string ([#2086], [#2253]) + * `rack.multithread` and `rack.multiprocess` now dynamically resolved by `max_thread` and `workers` respectively ([#2288]) + +* Deprecations, Removals and Breaking API Changes + * `--control` has been removed. Use `--control-url` ([#1487]) + * `worker_directory` has been removed. Use `directory`. + * min_threads now set by environment variables PUMA_MIN_THREADS and MIN_THREADS. ([#2143]) + * max_threads now set by environment variables PUMA_MAX_THREADS and MAX_THREADS. ([#2143]) + * max_threads default to 5 in MRI or 16 for all other interpreters. ([#2143]) + * `preload_app!` is on by default if number of workers > 1 and set via `WEB_CONCURRENCY` ([#2143]) + * Puma::Plugin.workers_supported? has been removed. Use Puma.forkable? instead. ([#2143]) + * `tcp_mode` has been removed without replacement. ([#2169]) + * Daemonization has been removed without replacement. ([#2170]) + * Changed #connected_port to #connected_ports ([#2076]) + * Configuration: `environment` is read from `RAILS_ENV`, if `RACK_ENV` can't be found ([#2022]) + * Log binding on http:// for TCP bindings to make it clickable ([#2300]) + +* Bugfixes + * Fix JSON loading issues on phased-restarts ([#2269]) + * Improve shutdown reliability ([#2312], [#2338]) + * Close client http connections made to an ssl server with TLSv1.3 ([#2116]) + * Do not set user_config to quiet by default to allow for file config ([#2074]) + * Always close SSL connection in Puma::ControlCLI ([#2211]) + * Windows update extconf.rb for use with ssp and varied Ruby/MSYS2 combinations ([#2069]) + * Ensure control server Unix socket is closed on shutdown ([#2112]) + * Preserve `BUNDLE_GEMFILE` env var when using `prune_bundler` ([#1893]) + * Send 408 request timeout even when queue requests is disabled ([#2119]) + * Rescue IO::WaitReadable instead of EAGAIN for blocking read ([#2121]) + * Ensure `BUNDLE_GEMFILE` is unspecified in workers if unspecified in master when using `prune_bundler` ([#2154]) + * Rescue and log exceptions in hooks defined by users (on_worker_boot, after_worker_fork etc) ([#1551]) + * Read directly from the socket in #read_and_drop to avoid raising further SSL errors ([#2198]) + * Set `Connection: closed` header when queue requests is disabled ([#2216]) + * Pass queued requests to thread pool on server shutdown ([#2122]) + * Fixed a few minor concurrency bugs in ThreadPool that may have affected non-GVL Rubies ([#2220]) + * Fix `out_of_band` hook never executed if the number of worker threads is > 1 ([#2177]) + * Fix ThreadPool#shutdown timeout accuracy ([#2221]) + * Fix `UserFileDefaultOptions#fetch` to properly use `default` ([#2233]) + * Improvements to `out_of_band` hook ([#2234]) + * Prefer the rackup file specified by the CLI ([#2225]) + * Fix for spawning subprocesses with fork_worker option ([#2267]) + * Set `CONTENT_LENGTH` for chunked requests ([#2287]) + * JRuby - Add Puma::MiniSSL::Engine#init? and #teardown methods, run all SSL tests ([#2317]) + * Improve shutdown reliability ([#2312]) + * Resolve issue with threadpool waiting counter decrement when thread is killed + * Constrain rake-compiler version to 0.9.4 to fix `ClassNotFound` exception when using MiniSSL with Java8. + * Fix recursive `prune_bundler` ([#2319]). + * Ensure that TCP_CORK is usable + * Fix corner case when request body is chunked ([#2326]) + * Fix filehandle leak in MiniSSL ([#2299]) + +* Refactor + * Remove unused loader argument from Plugin initializer ([#2095]) + * Simplify `Configuration.random_token` and remove insecure fallback ([#2102]) + * Simplify `Runner#start_control` URL parsing ([#2111]) + * Removed the IOBuffer extension and replaced with Ruby ([#1980]) + * Update `Rack::Handler::Puma.run` to use `**options` ([#2189]) + * ThreadPool concurrency refactoring ([#2220]) + * JSON parse cluster worker stats instead of regex ([#2124]) + * Support parallel tests in verbose progress reporting ([#2223]) + * Refactor error handling in server accept loop ([#2239]) + +## 4.3.12 / 2022-03-30 + +* Security + * Close several HTTP Request Smuggling exploits (CVE-2022-24790) + +## 4.3.11 / 2022-02-11 + +* Security + * Always close the response body (GHSA-rmj8-8hhh-gv5h) + +## 4.3.10 / 2021-10-12 + +* Bugfixes + * Allow UTF-8 in HTTP header values + +## 4.3.9 / 2021-10-12 + +* Security + * Do not allow LF as a line ending in a header (CVE-2021-41136) + +## 4.3.8 / 2021-05-11 + +* Security + * Close keepalive connections after the maximum number of fast inlined requests (CVE-2021-29509) ([#2625]) + +## 4.3.7 / 2020-11-30 + +* Bugfixes + * Backport set CONTENT_LENGTH for chunked requests (Originally: [#2287], backport: [#2496]) + +## 4.3.6 / 2020-09-05 + +* Bugfixes + * Explicitly include ctype.h to fix compilation warning and build error on macOS with Xcode 12 ([#2304]) + * Don't require json at boot ([#2269]) + +## 4.3.4/4.3.5 and 3.12.5/3.12.6 / 2020-05-22 + +Each patchlevel release contains a separate security fix. We recommend simply upgrading to 4.3.5/3.12.6. + +* Security + * Fix: Fixed two separate HTTP smuggling vulnerabilities that used the Transfer-Encoding header. CVE-2020-11076 and CVE-2020-11077. + +## 4.3.3 and 3.12.4 / 2020-02-28 + +* Bugfixes + * Fix: Fixes a problem where we weren't splitting headers correctly on newlines ([#2132]) +* Security + * Fix: Prevent HTTP Response splitting via CR in early hints. CVE-2020-5249. + +## 4.3.2 and 3.12.3 / 2020-02-27 (YANKED) + +* Security + * Fix: Prevent HTTP Response splitting via CR/LF in header values. CVE-2020-5247. + +## 4.3.1 and 3.12.2 / 2019-12-05 + +* Security + * Fix: a poorly-behaved client could use keepalive requests to monopolize Puma's reactor and create a denial of service attack. CVE-2019-16770. + +## 4.3.0 / 2019-11-07 + +* Features + * Strip whitespace at end of HTTP headers ([#2010]) + * Optimize HTTP parser for JRuby ([#2012]) + * Add SSL support for the control app and cli ([#2046], [#2052]) + +* Bugfixes + * Fix Errno::EINVAL when SSL is enabled and browser rejects cert ([#1564]) + * Fix pumactl defaulting puma to development if an environment was not specified ([#2035]) + * Fix closing file stream when reading pid from pidfile ([#2048]) + * Fix a typo in configuration option `--extra_runtime_dependencies` ([#2050]) + +## 4.2.1 / 2019-10-07 + +* 3 bugfixes + * Fix socket activation of systemd (pre-existing) unix binder files ([#1842], [#1988]) + * Deal with multiple calls to bind correctly ([#1986], [#1994], [#2006]) + * Accepts symbols for `verify_mode` ([#1222]) + +## 4.2.0 / 2019-09-23 + +* 6 features + * Pumactl has a new -e environment option and reads `config/puma/.rb` config files ([#1885]) + * Semicolons are now allowed in URL paths (MRI only), useful for Angular or Redmine ([#1934]) + * Allow extra dependencies to be defined when using prune_bundler ([#1105]) + * Puma now reports the correct port when binding to port 0, also reports other listeners when binding to localhost ([#1786]) + * Sending SIGINFO to any Puma worker now prints currently active threads and their backtraces ([#1320]) + * Puma threads all now have their name set on Ruby 2.3+ ([#1968]) +* 4 bugfixes + * Fix some misbehavior with phased restart and externally SIGTERMed workers ([#1908], [#1952]) + * Fix socket closing on error ([#1941]) + * Removed unnecessary SIGINT trap for JRuby that caused some race conditions ([#1961]) + * Fix socket files being left around after process stopped ([#1970]) +* Absolutely thousands of lines of test improvements and fixes thanks to @MSP-Greg + +## 4.1.1 / 2019-09-05 + +* 3 bugfixes + * Revert our attempt to not dup STDOUT/STDERR ([#1946]) + * Fix socket close on error ([#1941]) + * Fix workers not shutting down correctly ([#1908]) + +## 4.1.0 / 2019-08-08 + +* 4 features + * Add REQUEST_PATH on parse error message ([#1831]) + * You can now easily add custom log formatters with the `log_formatter` config option ([#1816]) + * Puma.stats now provides process start times ([#1844]) + * Add support for disabling TLSv1.1 ([#1836]) + +* 7 bugfixes + * Fix issue where Puma was creating zombie process entries ([#1887]) + * Fix bugs with line-endings and chunked encoding ([#1812]) + * RACK_URL_SCHEME is now set correctly in all conditions ([#1491]) + * We no longer mutate global STDOUT/STDERR, particularly the sync setting ([#1837]) + * SSL read_nonblock no longer blocks ([#1857]) + * Swallow connection errors when sending early hints ([#1822]) + * Backtrace no longer dumped when invalid pumactl commands are run ([#1863]) + +* 5 other + * Avoid casting worker_timeout twice ([#1838]) + * Removed a call to private that wasn't doing anything ([#1882]) + * README, Rakefile, docs and test cleanups ([#1848], [#1847], [#1846], [#1853], #1859, [#1850], [#1866], [#1870], [#1872], [#1833], [#1888]) + * Puma.io has proper documentation now (https://puma.io/puma/) + * Added the Contributor Covenant CoC + +* 1 known issue + * Some users are still experiencing issues surrounding socket activation and Unix sockets ([#1842]) + +## 4.0.1 / 2019-07-11 + +* 2 bugfixes + * Fix socket removed after reload - should fix problems with systemd socket activation. ([#1829]) + * Add extconf tests for DTLS_method & TLS_server_method, use in minissl.rb. Should fix "undefined symbol: DTLS_method" when compiling against old OpenSSL versions. ([#1832]) +* 1 other + * Removed unnecessary RUBY_VERSION checks. ([#1827]) + +## 4.0.0 / 2019-06-25 + +* 9 features + * Add support for disabling TLSv1.0 ([#1562]) + * Request body read time metric ([#1569]) + * Add out_of_band hook ([#1648]) + * Re-implement (native) IOBuffer for JRuby ([#1691]) + * Min worker timeout ([#1716]) + * Add option to suppress SignalException on SIGTERM ([#1690]) + * Allow mutual TLS CA to be set using `ssl_bind` DSL ([#1689]) + * Reactor now uses nio4r instead of `select` ([#1728]) + * Add status to pumactl with pidfile ([#1824]) + +* 10 bugfixes + * Do not accept new requests on shutdown ([#1685], [#1808]) + * Fix 3 corner cases when request body is chunked ([#1508]) + * Change pid existence check's condition branches ([#1650]) + * Don't call .stop on a server that doesn't exist ([#1655]) + * Implemented NID_X9_62_prime256v1 (P-256) curve over P-521 ([#1671]) + * Fix @notify.close can't modify frozen IOError (RuntimeError) ([#1583]) + * Fix Java 8 support ([#1773]) + * Fix error `uninitialized constant Puma::Cluster` ([#1731]) + * Fix `not_token` being able to be set to true ([#1803]) + * Fix "Hang on SIGTERM with ruby 2.6 in cluster mode" (PR [#1741], [#1674], [#1720], [#1730], [#1755]) + +## 3.12.1 / 2019-03-19 + +* 1 features + * Internal strings are frozen ([#1649]) +* 3 bugfixes + * Fix chunked ending check ([#1607]) + * Rack handler should use provided default host ([#1700]) + * Better support for detecting runtimes that support `fork` ([#1630]) + +## 3.12.0 / 2018-07-13 + +* 5 features: + * You can now specify which SSL ciphers the server should support, default is unchanged ([#1478]) + * The setting for Puma's `max_threads` is now in `Puma.stats` ([#1604]) + * Pool capacity is now in `Puma.stats` ([#1579]) + * Installs restricted to Ruby 2.2+ ([#1506]) + * `--control` is now deprecated in favor of `--control-url` ([#1487]) + +* 2 bugfixes: + * Workers will no longer accept more web requests than they have capacity to process. This prevents an issue where one worker would accept lots of requests while starving other workers ([#1563]) + * In a test env puma now emits the stack on an exception ([#1557]) + +## 3.11.4 / 2018-04-12 + +* 2 features: + * Manage puma as a service using rc.d ([#1529]) + * Server stats are now available from a top level method ([#1532]) +* 5 bugfixes: + * Fix parsing CLI options ([#1482]) + * Order of stderr and stdout is made before redirecting to a log file ([#1511]) + * Init.d fix of `ps -p` to check if pid exists ([#1545]) + * Early hints bugfix ([#1550]) + * Purge interrupt queue when closing socket fails ([#1553]) + +## 3.11.3 / 2018-03-05 + +* 3 bugfixes: + * Add closed? to MiniSSL::Socket for use in reactor ([#1510]) + * Handle EOFError at the toplevel of the server threads ([#1524]) ([#1507]) + * Deal with zero sized bodies when using SSL ([#1483]) + +## 3.11.2 / 2018-01-19 + +* 1 bugfix: + * Deal with read\_nonblock returning nil early + +## 3.11.1 / 2018-01-18 + +* 1 bugfix: + * Handle read\_nonblock returning nil when the socket close ([#1502]) + +## 3.11.0 / 2017-11-20 + +* 2 features: + * HTTP 103 Early Hints ([#1403]) + * 421/451 status codes now have correct status messages attached ([#1435]) + +* 9 bugfixes: + * Environment config files (/config/puma/.rb) load correctly ([#1340]) + * Specify windows dependencies correctly ([#1434], [#1436]) + * puma/events required in test helper ([#1418]) + * Correct control CLI's option help text ([#1416]) + * Remove a warning for unused variable in mini_ssl ([#1409]) + * Correct pumactl docs argument ordering ([#1427]) + * Fix an uninitialized variable warning in server.rb ([#1430]) + * Fix docs typo/error in Launcher init ([#1429]) + * Deal with leading spaces in RUBYOPT ([#1455]) + +* 2 other: + * Add docs about internals ([#1425], [#1452]) + * Tons of test fixes from @MSP-Greg ([#1439], [#1442], [#1464]) + +## 3.10.0 / 2017-08-17 + +* 3 features: + * The status server has a new /gc and /gc-status command. ([#1384]) + * The persistent and first data timeouts are now configurable ([#1111]) + * Implemented RFC 2324 ([#1392]) + +* 12 bugfixes: + * Not really a Puma bug, but @NickolasVashchenko created a gem to workaround a Ruby bug that some users of Puma may be experiencing. See README for more. ([#1347]) + * Fix hangups with SSL and persistent connections. ([#1334]) + * Fix Rails double-binding to a port ([#1383]) + * Fix incorrect thread names ([#1368]) + * Fix issues with /etc/hosts and JRuby where localhost addresses were not correct. ([#1318]) + * Fix compatibility with RUBYOPT="--enable-frozen-string-literal" ([#1376]) + * Fixed some compiler warnings ([#1388]) + * We actually run the integration tests in CI now ([#1390]) + * No longer shipping unnecessary directories in the gemfile ([#1391]) + * If RUBYOPT is nil, we no longer blow up on restart. ([#1385]) + * Correct response to SIGINT ([#1377]) + * Proper exit code returned when we receive a TERM signal ([#1337]) + +* 3 refactors: + * Various test improvements from @grosser + * Rubocop ([#1325]) + * Hoe has been removed ([#1395]) + +* 1 known issue: + * Socket activation doesn't work in JRuby. Their fault, not ours. ([#1367]) + +## 3.9.1 / 2017-06-03 + +* 2 bugfixes: + * Fixed compatibility with older Bundler versions ([#1314]) + * Some internal test/development cleanup ([#1311], [#1313]) + +## 3.9.0 / 2017-06-01 + +* 2 features: + * The ENV is now reset to its original values when Puma restarts via USR1/USR2 ([#1260]) (MRI only, no JRuby support) + * Puma will no longer accept more clients than the maximum number of threads. ([#1278]) + +* 9 bugfixes: + * Reduce information leakage by preventing HTTP parse errors from writing environment hashes to STDERR ([#1306]) + * Fix SSL/WebSocket compatibility ([#1274]) + * HTTP headers with empty values are no longer omitted from responses. ([#1261]) + * Fix a Rack env key which was set to nil. ([#1259]) + * peercert has been implemented for JRuby ([#1248]) + * Fix port settings when using rails s ([#1277], [#1290]) + * Fix compat w/LibreSSL ([#1285]) + * Fix restarting Puma w/symlinks and a new Gemfile ([#1282]) + * Replace Dir.exists? with Dir.exist? ([#1294]) + +* 1 known issue: + * A bug in MRI 2.2+ can result in IOError: stream closed. See [#1206]. This issue has existed since at least Puma 3.6, and probably further back. + +* 1 refactor: + * Lots of test fixups from @grosser. + +## 3.8.2 / 2017-03-14 + +* 1 bugfix: + * Deal with getsockopt with TCP\_INFO failing for sockets that say they're TCP but aren't really. ([#1241]) + +## 3.8.1 / 2017-03-10 + +* 1 bugfix: + * Remove method call to method that no longer exists ([#1239]) + +## 3.8.0 / 2017-03-09 + +* 2 bugfixes: + * Port from rack handler does not take precedence over config file in Rails 5.1.0.beta2+ and 5.0.1.rc3+ ([#1234]) + * The `tmp/restart.txt` plugin no longer restricts the user from running more than one server from the same folder at a time ([#1226]) + +* 1 feature: + * Closed clients are aborted to save capacity ([#1227]) + +* 1 refactor: + * Bundler is no longer a dependency from tests ([#1213]) + +## 3.7.1 / 2017-02-20 + +* 2 bugfixes: + * Fix typo which blew up MiniSSL ([#1182]) + * Stop overriding command-line options with the config file ([#1203]) + +## 3.7.0 / 2017-01-04 + +* 6 minor features: + * Allow rack handler to accept ssl host. ([#1129]) + * Refactor TTOU processing. TTOU now handles multiple signals at once. ([#1165]) + * Pickup any remaining chunk data as the next request. + * Prevent short term thread churn - increased auto trim default to 30 seconds. + * Raise error when `stdout` or `stderr` is not writable. ([#1175]) + * Add Rack 2.0 support to gemspec. ([#1068]) + +* 5 refactors: + * Compare host and server name only once per call. ([#1091]) + * Minor refactor on Thread pool ([#1088]) + * Removed a ton of unused constants, variables and files. + * Use MRI macros when allocating heap memory + * Use hooks for on\_booted event. ([#1160]) + +* 14 bugfixes: + * Add eof? method to NullIO? ([#1169]) + * Fix Puma startup in provided init.d script ([#1061]) + * Fix default SSL mode back to none. ([#1036]) + * Fixed the issue of @listeners getting nil io ([#1120]) + * Make `get_dh1024` compatible with OpenSSL v1.1.0 ([#1178]) + * More gracefully deal with SSL sessions. Fixes [#1002] + * Move puma.rb to just autoloads. Fixes [#1063] + * MiniSSL: Provide write as <<. Fixes [#1089] + * Prune bundler should inherit fds ([#1114]) + * Replace use of Process.getpgid which does not behave as intended on all platforms ([#1110]) + * Transfer encoding header should be downcased before comparison ([#1135]) + * Use same write log logic for hijacked requests. ([#1081]) + * Fix `uninitialized constant Puma::StateFile` ([#1138]) + * Fix access priorities of each level in LeveledOptions ([#1118]) + +* 3 others: + + * Lots of tests added/fixed/improved. Switched to Minitest from Test::Unit. Big thanks to @frodsan. + * Lots of documentation added/improved. + * Add license indicators to the HTTP extension. ([#1075]) + +## 3.6.2 / 2016-11-22 + +* 1 bug fix: + + * Revert [#1118]/Fix access priorities of each level in LeveledOptions. This + had an unintentional side effect of changing the importance of command line + options, such as -p. + +## 3.6.1 / 2016-11-21 + +* 8 bug fixes: + + * Fix Puma start in init.d script. + * Fix default SSL mode back to none. Fixes [#1036] + * Fixed the issue of @listeners getting nil io, fix rails restart ([#1120]) + * More gracefully deal with SSL sessions. Fixes [#1002] + * Prevent short term thread churn. + * Provide write as <<. Fixes [#1089] + * Fix access priorities of each level in LeveledOptions - fixes TTIN. + * Stub description files updated for init.d. + +* 2 new project committers: + + * Nate Berkopec (@nateberkopec) + * Richard Schneeman (@schneems) + +## 3.6.0 / 2016-07-24 + +* 12 bug fixes: + * Add ability to detect a shutting down server. Fixes [#932] + * Add support for Expect: 100-continue. Fixes [#519] + * Check SSLContext better. Fixes [#828] + * Clarify behavior of '-t num'. Fixes [#984] + * Don't default to VERIFY_PEER. Fixes [#1028] + * Don't use ENV['PWD'] on windows. Fixes [#1023] + * Enlarge the scope of catching app exceptions. Fixes [#1027] + * Execute background hooks after daemonizing. Fixes [#925] + * Handle HUP as a stop unless there is IO redirection. Fixes [#911] + * Implement chunked request handling. Fixes [#620] + * Just rescue exception to return a 500. Fixes [#1027] + * Redirect IO in the jruby daemon mode. Fixes [#778] + +## 3.5.2 / 2016-07-20 + +* 1 bug fix: + * Don't let persistent_timeout be nil + +* 1 PR merged: + * Merge pull request [#1021] from benzrf/patch-1 + +## 3.5.1 / 2016-07-20 + +* 1 bug fix: + * Be sure to only listen on host:port combos once. Fixes [#1022] + +## 3.5.0 / 2016-07-18 + +* 1 minor features: + * Allow persistent_timeout to be configured via the dsl. + +* 9 bug fixes: + * Allow a bare % in a query string. Fixes [#958] + * Explicitly listen on all localhost addresses. Fixes [#782] + * Fix `TCPLogger` log error in tcp cluster mode. + * Fix puma/puma[#968] Cannot bind SSL port due to missing verify_mode option + * Fix puma/puma[#968] Default verify_mode to peer + * Log any exceptions in ThreadPool. Fixes [#1010] + * Silence connection errors in the reactor. Fixes [#959] + * Tiny fixes in hook documentation for [#840] + * It should not log requests if we want it to be quiet + +* 5 doc fixes: + * Add How to stop Puma on Heroku using plugins to the example directory + * Provide both hot and phased restart in jungle script + * Update reference to the instances management script + * Update default number of threads + * Fix typo in example config + +* 14 PRs merged: + * Merge pull request [#1007] from willnet/patch-1 + * Merge pull request [#1014] from jeznet/patch-1 + * Merge pull request [#1015] from bf4/patch-1 + * Merge pull request [#1017] from jorihardman/configurable_persistent_timeout + * Merge pull request [#954] from jf/master + * Merge pull request [#955] from jf/add-request-info-to-standard-error-rescue + * Merge pull request [#956] from maxkwallace/master + * Merge pull request [#960] from kmayer/kmayer-plugins-heroku-restart + * Merge pull request [#969] from frankwong15/master + * Merge pull request [#970] from willnet/delete-blank-document + * Merge pull request [#974] from rocketjob/feature/name_threads + * Merge pull request [#977] from snow/master + * Merge pull request [#981] from zach-chai/patch-1 + * Merge pull request [#993] from scorix/master + +## 3.4.0 / 2016-04-07 + +* 2 minor features: + * Add ability to force threads to stop on shutdown. Fixes [#938] + * Detect and commit seppuku when fork(2) fails. Fixes [#529] + +* 3 unknowns: + * Ignore errors trying to update the backport tables. Fixes [#788] + * Invoke the lowlevel_error in more places to allow for exception tracking. Fixes [#894] + * Update the query string when an absolute URI is used. Fixes [#937] + +* 5 doc fixes: + * Add Process Monitors section to top-level README + * Better document the hooks. Fixes [#840] + * docs/system.md sample config refinements and elaborations + * Fix typos at couple of places. + * Cleanup warnings + +* 3 PRs merged: + * Merge pull request [#945] from dekellum/systemd-docs-refined + * Merge pull request [#946] from vipulnsward/rm-pid + * Merge pull request [#947] from vipulnsward/housekeeping-typos + +## 3.3.0 / 2016-04-05 + +* 2 minor features: + * Allow overriding options of Configuration object + * Rename to inherit_ssl_listener like inherit_tcp|unix + +* 2 doc fixes: + * Add docs/systemd.md (with socket activation sub-section) + * Document UNIX signals with cluster on README.md + +* 3 PRs merged: + * Merge pull request [#936] from prathamesh-sonpatki/allow-overriding-config-options + * Merge pull request [#940] from kyledrake/signalsdoc + * Merge pull request [#942] from dekellum/socket-activate-improve + +## 3.2.0 / 2016-03-20 + +* 1 deprecation removal: + * Delete capistrano.rb + +* 3 bug fixes: + * Detect gems.rb as well as Gemfile + * Simplify and fix logic for directory to use when restarting for all phases + * Speed up phased-restart start + +* 2 PRs merged: + * Merge pull request [#927] from jlecour/gemfile_variants + * Merge pull request [#931] from joneslee85/patch-10 + +## 3.1.1 / 2016-03-17 + +* 4 bug fixes: + * Disable USR1 usage on JRuby + * Fixes [#922] - Correctly define file encoding as UTF-8 + * Set a more explicit SERVER_SOFTWARE Rack variable + * Show RUBY_ENGINE_VERSION if available. Fixes [#923] + +* 3 PRs merged: + * Merge pull request [#912] from tricknotes/fix-allow-failures-in-travis-yml + * Merge pull request [#921] from swrobel/patch-1 + * Merge pull request [#924] from tbrisker/patch-1 + +## 3.1.0 / 2016-03-05 + +* 1 minor feature: + * Add 'import' directive to config file. Fixes [#916] + +* 5 bug fixes: + * Add 'fetch' to options. Fixes [#913] + * Fix jruby daemonization. Fixes [#918] + * Recreate the proper args manually. Fixes [#910] + * Require 'time' to get iso8601. Fixes [#914] + +## 3.0.2 / 2016-02-26 + +* 5 bug fixes: + + * Fix 'undefined local variable or method `pid` for #' when execute pumactl with `--pid` option. + * Fix 'undefined method `windows?` for Puma:Module' when execute pumactl. + * Harden tmp_restart against errors related to the restart file + * Make `plugin :tmp_restart` behavior correct in Windows. + * fix uninitialized constant Puma::ControlCLI::StateFile + +* 3 PRs merged: + + * Merge pull request [#901] from mitto/fix-pumactl-uninitialized-constant-statefile + * Merge pull request [#902] from corrupt952/fix_undefined_method_and_variable_when_execute_pumactl + * Merge pull request [#905] from Eric-Guo/master + +## 3.0.1 / 2016-02-25 + +* 1 bug fix: + + * Removed the experimental support for async.callback as it broke + websockets entirely. Seems no server has both hijack and async.callback + and thus faye is totally confused what to do and doesn't work. + +## 3.0.0 / 2016-02-25 + +* 2 major changes: + + * Ruby pre-2.0 is no longer supported. We'll do our best to not add + features that break those rubies but will no longer be testing + with them. + * Don't log requests by default. Fixes [#852] + +* 2 major features: + + * Plugin support! Plugins can interact with configuration as well + as provide augment server functionality! + * Experimental env['async.callback'] support + +* 4 minor features: + + * Listen to unix socket with provided backlog if any + * Improves the cluster mode stats to report worker stats + * Pass the env to the lowlevel_error handler. Fixes [#854] + * Treat path-like hosts as unix sockets. Fixes [#824] + +* 5 bug fixes: + + * Clean thread locals when using keepalive. Fixes [#823] + * Cleanup compiler warnings. Fixes [#815] + * Expose closed? for use by the reactor. Fixes [#835] + * Move signal handlers to separate method to prevent space leak. Fixes [#798] + * Signal not full on worker exit [#876] + +* 5 doc fixes: + + * Update README.md with various grammar fixes + * Use newest version of Minitest + * Add directory configuration docs, fix typo [ci skip] + * Remove old COPYING notice. Fixes [#849] + +* 10 merged PRs: + + * Merge pull request [#871] from deepj/travis + * Merge pull request [#874] from wallclockbuilder/master + * Merge pull request [#883] from dadah89/igor/trim_only_worker + * Merge pull request [#884] from uistudio/async-callback + * Merge pull request [#888] from mlarraz/tick_minitest + * Merge pull request [#890] from todd/directory_docs + * Merge pull request [#891] from ctaintor/improve_clustered_status + * Merge pull request [#893] from spastorino/add_missing_require + * Merge pull request [#897] from zendesk/master + * Merge pull request [#899] from kch/kch-readme-fixes + +## 2.16.0 / 2016-01-27 + +* 7 minor features: + + * Add 'set_remote_address' config option + * Allow to run puma in silent mode + * Expose cli options in DSL + * Support passing JRuby keystore info in ssl_bind DSL + * Allow umask for unix:/// style control urls + * Expose `old_worker_count` in stats url + * Support TLS client auth (verify_mode) in jruby + +* 7 bug fixes: + + * Don't persist before_fork hook in state file + * Reload bundler before pulling in rack. Fixes [#859] + * Remove NEWRELIC_DISPATCHER env variable + * Cleanup C code + * Use Timeout.timeout instead of Object.timeout + * Make phased restarts faster + * Ignore the case of certain headers, because HTTP + +* 1 doc changes: + + * Test against the latest Ruby 2.1, 2.2, 2.3, head and JRuby 9.0.4.0 on Travis + +* 12 merged PRs + * Merge pull request [#822] from kwugirl/remove_NEWRELIC_DISPATCHER + * Merge pull request [#833] from joemiller/jruby-client-tls-auth + * Merge pull request [#837] from YuriSolovyov/ssl-keystore-jruby + * Merge pull request [#839] from mezuka/master + * Merge pull request [#845] from deepj/timeout-deprecation + * Merge pull request [#846] from sriedel/strip_before_fork + * Merge pull request [#850] from deepj/travis + * Merge pull request [#853] from Jeffrey6052/patch-1 + * Merge pull request [#857] from zendesk/faster_phased_restarts + * Merge pull request [#858] from mlarraz/fix_some_warnings + * Merge pull request [#860] from zendesk/expose_old_worker_count + * Merge pull request [#861] from zendesk/allow_control_url_umask + +## 2.15.3 / 2015-11-07 + +* 1 bug fix: + + * Fix JRuby parser + +## 2.15.2 / 2015-11-06 + +* 2 bug fixes: + * ext/puma_http11: handle duplicate headers as per RFC + * Only set ctx.ca iff there is a params['ca'] to set with. + +* 2 PRs merged: + * Merge pull request [#818] from unleashed/support-duplicate-headers + * Merge pull request [#819] from VictorLowther/fix-ca-and-verify_null-exception + +## 2.15.1 / 2015-11-06 + +* 1 bug fix: + + * Allow older openssl versions + +## 2.15.0 / 2015-11-06 + +* 6 minor features: + * Allow setting ca without setting a verify mode + * Make jungle for init.d support rbenv + * Use SSL_CTX_use_certificate_chain_file for full chain + * cluster: add worker_boot_timeout option + * configuration: allow empty tags to mean no tag desired + * puma/cli: support specifying STD{OUT,ERR} redirections and append mode + +* 5 bug fixes: + * Disable SSL Compression + * Fix bug setting worker_directory when using a symlink directory + * Fix error message in DSL that was slightly inaccurate + * Pumactl: set correct process name. Fixes [#563] + * thread_pool: fix race condition when shutting down workers + +* 10 doc fixes: + * Add before_fork explanation in Readme.md + * Correct spelling in DEPLOYMENT.md + * Correct spelling in docs/nginx.md + * Fix spelling errors. + * Fix typo in deployment description + * Fix typos (it's -> its) in events.rb and server.rb + * fixing for typo mentioned in [#803] + * Spelling correction for README + * thread_pool: fix typos in comment + * More explicit docs for worker_timeout + +* 18 PRs merged: + * Merge pull request [#768] from nathansamson/patch-1 + * Merge pull request [#773] from rossta/spelling_corrections + * Merge pull request [#774] from snow/master + * Merge pull request [#781] from sunsations/fix-typo + * Merge pull request [#791] from unleashed/allow_empty_tags + * Merge pull request [#793] from robdimarco/fix-working-directory-symlink-bug + * Merge pull request [#794] from peterkeen/patch-1 + * Merge pull request [#795] from unleashed/redirects-from-cmdline + * Merge pull request [#796] from cschneid/fix_dsl_message + * Merge pull request [#799] from annafw/master + * Merge pull request [#800] from liamseanbrady/fix_typo + * Merge pull request [#801] from scottjg/ssl-chain-file + * Merge pull request [#802] from scottjg/ssl-crimes + * Merge pull request [#804] from burningTyger/patch-2 + * Merge pull request [#809] from unleashed/threadpool-fix-race-in-shutdown + * Merge pull request [#810] from vlmonk/fix-pumactl-restart-bug + * Merge pull request [#814] from schneems/schneems/worker_timeout-docs + * Merge pull request [#817] from unleashed/worker-boot-timeout + +## 2.14.0 / 2015-09-18 + +* 1 minor feature: + * Make building with SSL support optional + +* 1 bug fix: + * Use Rack::Builder if available. Fixes [#735] + +## 2.13.4 / 2015-08-16 + +* 1 bug fix: + * Use the environment possible set by the config early and from + the config file later (if set). + +## 2.13.3 / 2015-08-15 + +Seriously, I need to revamp config with tests. + +* 1 bug fix: + * Fix preserving options before cleaning for state. Fixes [#769] + +## 2.13.2 / 2015-08-15 + +The "clearly I don't have enough tests for the config" release. + +* 1 bug fix: + * Fix another place binds wasn't initialized. Fixes [#767] + +## 2.13.1 / 2015-08-15 + +* 2 bug fixes: + * Fix binds being masked in config files. Fixes [#765] + * Use options from the config file properly in pumactl. Fixes [#764] + +## 2.13.0 / 2015-08-14 + +* 1 minor feature: + * Add before_fork hooks option. + +* 3 bug fixes: + * Check for OPENSSL_NO_ECDH before using ECDH + * Eliminate logging overhead from JRuby SSL + * Prefer cli options over config file ones. Fixes [#669] + +* 1 deprecation: + * Add deprecation warning to capistrano.rb. Fixes [#673] + +* 4 PRs merged: + * Merge pull request [#668] from kcollignon/patch-1 + * Merge pull request [#754] from nathansamson/before_boot + * Merge pull request [#759] from BenV/fix-centos6-build + * Merge pull request [#761] from looker/no-log + +## 2.12.3 / 2015-08-03 + +* 8 minor bugs fixed: + * Fix Capistrano 'uninitialized constant Puma' error. + * Fix some ancient and incorrect error handling code + * Fix uninitialized constant error + * Remove toplevel rack interspection, require rack on load instead + * Skip empty parts when chunking + * Switch from inject to each in config_ru_binds iteration + * Wrap SSLv3 spec in version guard. + * ruby 1.8.7 compatibility patches + +* 4 PRs merged: + * Merge pull request [#742] from deivid-rodriguez/fix_missing_require + * Merge pull request [#743] from matthewd/skip-empty-chunks + * Merge pull request [#749] from huacnlee/fix-cap-uninitialized-puma-error + * Merge pull request [#751] from costi/compat_1_8_7 + +* 1 test fix: + * Add 1.8.7, rbx-1 (allow failures) to Travis. + +## 2.12.2 / 2015-07-17 + +* 2 bug fix: + * Pull over and use Rack::URLMap. Fixes [#741] + * Stub out peercert on JRuby for now. Fixes [#739] + +## 2.12.1 / 2015-07-16 + +* 2 bug fixes: + * Use a constant format. Fixes [#737] + * Use strerror for Windows sake. Fixes [#733] + +* 1 doc change: + * typo fix: occured -> occurred + +* 1 PR merged: + * Merge pull request [#736] from paulanunda/paulanunda/typo-fix + +## 2.12.0 / 2015-07-14 + +* 13 bug fixes: + * Add thread reaping to thread pool + * Do not automatically use chunked responses when hijacked + * Do not suppress Content-Length on partial hijack + * Don't allow any exceptions to terminate a thread + * Handle ENOTCONN client disconnects when setting REMOTE_ADDR + * Handle very early exit of cluster mode. Fixes [#722] + * Install rack when running tests on travis to use rack/lint + * Make puma -v and -h return success exit code + * Make pumactl load config/puma.rb by default + * Pass options from pumactl properly when pruning. Fixes [#694] + * Remove rack dependency. Fixes [#705] + * Remove the default Content-Type: text/plain + * Add Client Side Certificate Auth + +* 8 doc/test changes: + * Added example sourcing of environment vars + * Added tests for bind configuration on rackup file + * Fix example config text + * Update DEPLOYMENT.md + * Update Readme with example of custom error handler + * ci: Improve Travis settings + * ci: Start running tests against JRuby 9k on Travis + * ci: Convert to container infrastructure for travisci + +* 2 ops changes: + * Check for system-wide rbenv + * capistrano: Add additional env when start rails + +* 16 PRs merged: + * Merge pull request [#686] from jjb/patch-2 + * Merge pull request [#693] from rob-murray/update-example-config + * Merge pull request [#697] from spk/tests-bind-on-rackup-file + * Merge pull request [#699] from deees/fix/require_rack_builder + * Merge pull request [#701] from deepj/master + * Merge pull request [#702] from Jimdo/thread-reaping + * Merge pull request [#703] from deepj/travis + * Merge pull request [#704] from grega/master + * Merge pull request [#709] from lian/master + * Merge pull request [#711] from julik/master + * Merge pull request [#712] from yakara-ltd/pumactl-default-config + * Merge pull request [#715] from RobotJiang/master + * Merge pull request [#725] from rwz/master + * Merge pull request [#726] from strenuus/handle-client-disconnect + * Merge pull request [#729] from allaire/patch-1 + * Merge pull request [#730] from iamjarvo/container-infrastructure + +## 2.11.3 / 2015-05-18 + +* 5 bug fixes: + * Be sure to unlink tempfiles after a request. Fixes [#690] + * Coerce the key to a string before checking. (thar be symbols). Fixes [#684] + * Fix hang on bad SSL handshake + * Remove `enable_SSLv3` support from JRuby + +* 1 PR merged: + * Merge pull request [#698] from looker/hang-handshake + +## 2.11.2 / 2015-04-11 + +* 2 minor features: + * Add `on_worker_fork` hook, which allows to mimic Unicorn's behavior + * Add shutdown_debug config option + +* 4 bug fixes: + * Fix the Config constants not being available in the DSL. Fixes [#683] + * Ignore multiple port declarations + * Proper 'Connection' header handling compatible with HTTP 1.[01] protocols + * Use "Puma" instead of "puma" to reporting to New Relic + +* 1 doc fixes: + * Add Gitter badge. + +* 6 PRs merged: + * Merge pull request [#657] from schneems/schneems/puma-once-port + * Merge pull request [#658] from Tomohiro/newrelic-dispatcher-default-update + * Merge pull request [#662] from basecrm/connection-compatibility + * Merge pull request [#664] from fxposter/on-worker-fork + * Merge pull request [#667] from JuanitoFatas/doc/gemspec + * Merge pull request [#672] from chulkilee/refactor + +## 2.11.1 / 2015-02-11 + +* 2 bug fixes: + * Avoid crash in strange restart conditions + * Inject the GEM_HOME that bundler into puma-wild's env. Fixes [#653] + +* 2 PRs merged: + * Merge pull request [#644] from bpaquet/master + * Merge pull request [#646] from mkonecny/master + +## 2.11.0 / 2015-01-20 + +* 9 bug fixes: + * Add mode as an additional bind option to unix sockets. Fixes [#630] + * Advertise HTTPS properly after a hot restart + * Don't write lowlevel_error_handler to state + * Fix phased restart with stuck requests + * Handle spaces in the path properly. Fixes [#622] + * Set a default REMOTE_ADDR to avoid using peeraddr on unix sockets. Fixes [#583] + * Skip device number checking on jruby. Fixes [#586] + * Update extconf.rb to compile correctly on OS X + * redirect io right after daemonizing so startup errors are shown. Fixes [#359] + +* 6 minor features: + * Add a configuration option that prevents puma from queueing requests. + * Add reload_worker_directory + * Add the ability to pass environment variables to the init script (for Jungle). + * Add the proctitle tag to the worker. Fixes [#633] + * Infer a proctitle tag based on the directory + * Update lowlevel error message to be more meaningful. + +* 10 PRs merged: + * Merge pull request [#478] from rubencaro/master + * Merge pull request [#610] from kwilczynski/master + * Merge pull request [#611] from jasonl/better-lowlevel-message + * Merge pull request [#616] from jc00ke/master + * Merge pull request [#623] from raldred/patch-1 + * Merge pull request [#628] from rdpoor/master + * Merge pull request [#634] from deepj/master + * Merge pull request [#637] from raskhadafi/patch-1 + * Merge pull request [#639] from ebeigarts/fix-phased-restarts + * Merge pull request [#640] from codehotter/issue-612-dependent-requests-deadlock + +## 2.10.2 / 2014-11-26 + +* 1 bug fix: + * Conditionalize thread local cleaning, fixes perf degradation fix + The code to clean out all Thread locals adds pretty significant + overhead to a each request, so it has to be turned on explicitly + if a user needs it. + +## 2.10.1 / 2014-11-24 + +* 1 bug fix: + * Load the app after daemonizing because the app might start threads. + + This change means errors loading the app are now reported only in the redirected + stdout/stderr. + + If you're app has problems starting up, start it without daemon mode initially + to test. + +## 2.10.0 / 2014-11-23 + +* 3 minor features: + * Added on_worker_shutdown hook mechanism + * Allow binding to ipv6 addresses for ssl URIs + * Warn about any threads started during app preload + +* 5 bug fixes: + * Clean out a threads local data before doing work + * Disable SSLv3. Fixes [#591] + * First change the directory to use the correct Gemfile. + * Only use config.ru binds if specified. Fixes [#606] + * Strongish cipher suite with FS support for some browsers + +* 2 doc changes: + * Change umask examples to more permissive values + * fix typo in README.md + +* 9 Merged PRs: + * Merge pull request [#560] from raskhadafi/prune_bundler-bug + * Merge pull request [#566] from sheltond/master + * Merge pull request [#593] from andruby/patch-1 + * Merge pull request [#594] from hassox/thread-cleanliness + * Merge pull request [#596] from burningTyger/patch-1 + * Merge pull request [#601] from sorentwo/friendly-umask + * Merge pull request [#602] from 1334/patch-1 + * Merge pull request [#608] from Gu1/master + * Merge pull request [#538] from memiux/? + +## 2.9.2 / 2014-10-25 + +* 8 bug fixes: + * Fix puma-wild handling a restart properly. Fixes [#550] + * JRuby SSL POODLE update + * Keep deprecated features warnings + * Log the current time when Puma shuts down. + * Fix cross-platform extension library detection + * Use the correct Windows names for OpenSSL. + * Better error logging during startup + * Fixing sexist error messages + +* 6 PRs merged: + * Merge pull request [#549] from bsnape/log-shutdown-time + * Merge pull request [#553] from lowjoel/master + * Merge pull request [#568] from mariuz/patch-1 + * Merge pull request [#578] from danielbuechele/patch-1 + * Merge pull request [#581] from alexch/slightly-better-logging + * Merge pull request [#590] from looker/jruby_disable_sslv3 + +## 2.9.1 / 2014-09-05 + +* 4 bug fixes: + * Cleanup the SSL related structures properly, fixes memory leak + * Fix thread spawning edge case. + * Force a worker check after a worker boots, don't wait 5sec. Fixes [#574] + * Implement SIGHUP for logs reopening + +* 2 PRs merged: + * Merge pull request [#561] from theoldreader/sighup + * Merge pull request [#570] from havenwood/spawn-thread-edge-case + +## 2.9.0 / 2014-07-12 + +* 1 minor feature: + * Add SSL support for JRuby + +* 3 bug fixes: + * Typo BUNDLER_GEMFILE -> BUNDLE_GEMFILE + * Use fast_write because we can't trust syswrite + * pumactl - do not modify original ARGV + +* 4 doc fixes: + * BSD-3-Clause over BSD to avoid confusion + * Deploy doc: clarification of the GIL + * Fix typo in DEPLOYMENT.md + * Update README.md + +* 6 PRs merged: + * Merge pull request [#520] from misfo/patch-2 + * Merge pull request [#530] from looker/jruby-ssl + * Merge pull request [#537] from vlmonk/patch-1 + * Merge pull request [#540] from allaire/patch-1 + * Merge pull request [#544] from chulkilee/bsd-3-clause + * Merge pull request [#551] from jcxplorer/patch-1 + +## 2.8.2 / 2014-04-12 + +* 4 bug fixes: + * During upgrade, change directory in main process instead of workers. + * Close the client properly on error + * Capistrano: fallback from phased restart to start when not started + * Allow tag option in conf file + +* 4 doc fixes: + * Fix Puma daemon service README typo + * `preload_app!` instead of `preload_app` + * add preload_app and prune_bundler to example config + * allow changing of worker_timeout in config file + +* 11 PRs merged: + * Merge pull request [#487] from ckuttruff/master + * Merge pull request [#492] from ckuttruff/master + * Merge pull request [#493] from alepore/config_tag + * Merge pull request [#503] from mariuz/patch-1 + * Merge pull request [#505] from sammcj/patch-1 + * Merge pull request [#506] from FlavourSys/config_worker_timeout + * Merge pull request [#510] from momer/rescue-block-handle-servers-fix + * Merge pull request [#511] from macool/patch-1 + * Merge pull request [#514] from edogawaconan/refactor_env + * Merge pull request [#517] from misfo/patch-1 + * Merge pull request [#518] from LongMan/master + +## 2.8.1 / 2014-03-06 + +* 1 bug fixes: + * Run puma-wild with proper deps for prune_bundler + +* 2 doc changes: + * Described the configuration file finding behavior added in 2.8.0 and how to disable it. + * Start the deployment doc + +* 6 PRs merged: + * Merge pull request [#471] from arthurnn/fix_test + * Merge pull request [#485] from joneslee85/patch-9 + * Merge pull request [#486] from joshwlewis/patch-1 + * Merge pull request [#490] from tobinibot/patch-1 + * Merge pull request [#491] from brianknight10/clarify-no-config + +## 2.8.0 / 2014-02-28 + +* 8 minor features: + * Add ability to autoload a config file. Fixes [#438] + * Add ability to detect and terminate hung workers. Fixes [#333] + * Add booted_workers to stats response + * Add config to customize the default error message + * Add prune_bundler option + * Add worker indexes, expose them via on_worker_boot. Fixes [#440] + * Add pretty process name + * Show the ruby version in use + +* 7 bug fixes: + * Added 408 status on timeout. + * Be more hostile with sockets that write block. Fixes [#449] + * Expect at_exit to exclusively remove the pidfile. Fixes [#444] + * Expose latency and listen backlog via bind query. Fixes [#370] + * JRuby raises IOError if the socket is there. Fixes [#377] + * Process requests fairly. Fixes [#406] + * Rescue SystemCallError as well. Fixes [#425] + +* 4 doc changes: + * Add 2.1.0 to the matrix + * Add Code Climate badge to README + * Create signals.md + * Set the license to BSD. Fixes [#432] + +* 14 PRs merged: + * Merge pull request [#428] from alexeyfrank/capistrano_default_hooks + * Merge pull request [#429] from namusyaka/revert-const_defined + * Merge pull request [#431] from mrb/master + * Merge pull request [#433] from alepore/process-name + * Merge pull request [#437] from ibrahima/master + * Merge pull request [#446] from sudara/master + * Merge pull request [#451] from pwiebe/status_408 + * Merge pull request [#453] from joevandyk/patch-1 + * Merge pull request [#470] from arthurnn/fix_458 + * Merge pull request [#472] from rubencaro/master + * Merge pull request [#480] from jjb/docs-on-running-test-suite + * Merge pull request [#481] from schneems/master + * Merge pull request [#482] from prathamesh-sonpatki/signals-doc-cleanup + * Merge pull request [#483] from YotpoLtd/master + +## 2.7.1 / 2013-12-05 + +* 1 bug fix: + * Keep STDOUT/STDERR the right mode. Fixes [#422] + +## 2.7.0 / 2013-12-03 + +* 1 minor feature: + * Adding TTIN and TTOU to increment/decrement workers + +* N bug fixes: + * Always use our Process.daemon because it's not busted + * Add capistrano restart failback to start. + * Change position of `cd` so that rvm gemset is loaded + * Clarify some platform specifics + * Do not close the pipe sockets when retrying + * Fix String#byteslice for Ruby 1.9.1, 1.9.2 + * Fix compatibility with 1.8.7. + * Handle IOError closed stream in IO.select + * Increase the max URI path length to 2048 chars from 1024 chars + * Upstart jungle use config/puma.rb instead + +## 2.6.0 / 2013-09-13 + +* 2 minor features: + * Add support for event hooks + ** Add a hook for state transitions + * Add phased restart to capistrano recipe. + +* 4 bug fixes: + * Convince workers to stop by SIGKILL after timeout + * Define RSTRING_NOT_MODIFIED for Rubinius performance + * Handle BrokenPipe, StandardError and IOError in fat_wrote and break out + * Return success status to the invoking environment + +## 2.5.1 / 2013-08-13 + +* 2 bug fixes: + * Keep jruby daemon mode from retrying on a hot restart + * Extract version from const.rb in gemspec + +## 2.5.0 / 2013-08-08 + +* 2 minor features: + * Allow configuring pumactl with config.rb + * make `pumactl restart` start puma if not running + +* 6 bug fixes: + * Autodetect ruby managers and home directory in upstart script + * Convert header values to string before sending. + * Correctly report phased-restart availability + * Fix pidfile creation/deletion race on jruby daemonization + * Use integers when comparing thread counts + * Fix typo in using lopez express (raw tcp) mode + +* 6 misc changes: + * Fix typo in phased-restart response + * Uncomment setuid/setgid by default in upstart + * Use Puma::Const::PUMA_VERSION in gemspec + * Update upstart comments to reflect new commandline + * Remove obsolete pumactl instructions; refer to pumactl for details + * Make Bundler used puma.gemspec version agnostic + +## 2.4.1 / 2013-08-07 + +* 1 experimental feature: + * Support raw tcp servers (aka Lopez Express mode) + +## 2.4.0 / 2013-07-22 + +* 5 minor features: + * Add PUMA_JRUBY_DAEMON_OPTS to get around agent starting twice + * Add ability to drain accept socket on shutdown + * Add port to DSL + * Adds support for using puma config file in capistrano deploys. + * Make phased_restart fallback to restart if not available + +* 10 bug fixes: + + * Be sure to only delete the pid in the master. Fixes [#334] + * Call out -C/--config flags + * Change parser symbol names to avoid clash. Fixes [#179] + * Convert thread pool sizes to integers + * Detect when the jruby daemon child doesn't start properly + * Fix typo in CLI help + * Improve the logging output when hijack is used. Fixes [#332] + * Remove unnecessary thread pool size conversions + * Setup :worker_boot as an Array. Fixes [#317] + * Use 127.0.0.1 as REMOTE_ADDR of unix client. Fixes [#309] + + +## 2.3.2 / 2013-07-08 + +* 1 bug fix: + * Move starting control server to after daemonization. + +## 2.3.1 / 2013-07-06 + +* 2 bug fixes: + * Include the right files in the Manifest. + * Disable inheriting connections on restart on windows. Fixes [#166] + +* 1 doc change: + * Better document some platform constraints + +## 2.3.0 / 2013-07-05 + +* 1 major bug fix: + * Stabilize control server, add support in cluster mode + +* 5 minor bug fixes: + * Add ability to cleanup stale unix sockets + * Check status data better. Fixes [#292] + * Convert raw IO errors to ConnectionError. Fixes [#274] + * Fix sending Content-Type and Content-Length for no body status. Fixes [#304] + * Pass state path through to `pumactl start`. Fixes [#287] + +* 2 internal changes: + * Refactored modes into seperate classes that CLI uses + * Changed CLI to take an Events object instead of stdout/stderr (API change) + +## 2.2.2 / 2013-07-02 + +* 1 bug fix: + * Fix restart_command in the config + +## 2.2.1 / 2013-07-02 + +* 1 minor feature: + * Introduce preload flag + +* 1 bug fix: + * Pass custom restart command in JRuby + +## 2.2.0 / 2013-07-01 + +* 1 major feature: + * Add ability to preload rack app + +* 2 minor bugfixes: + * Don't leak info when not in development. Fixes [#256] + * Load the app, then bind the ports + +## 2.1.1 / 2013-06-20 + +* 2 minor bug fixes: + + * Fix daemonization on jruby + * Load the application before daemonizing. Fixes [#285] + +## 2.1.0 / 2013-06-18 + +* 3 minor features: + * Allow listening socket to be configured via Capistrano variable + * Output results from 'stat's command when using pumactl + * Support systemd socket activation + +* 15 bug fixes: + * Deal with pipes closing while stopping. Fixes [#270] + * Error out early if there is no app configured + * Handle ConnectionError rather than the lowlevel exceptions + * tune with `-C` config file and `on_worker_boot` + * use `-w` + * Fixed some typos in upstart scripts + * Make sure to use bytesize instead of size (MiniSSL write) + * Fix an error in puma-manager.conf + * fix: stop leaking sockets on restart (affects ruby 1.9.3 or before) + * Ignore errors on the cross-thread pipe. Fixes [#246] + * Ignore errors while uncorking the socket (it might already be closed) + * Ignore the body on a HEAD request. Fixes [#278] + * Handle all engine data when possible. Fixes [#251]. + * Handle all read exceptions properly. Fixes [#252] + * Handle errors from the server better + +* 3 doc changes: + * Add note about on_worker_boot hook + * Add some documentation for Cluster mode + * Added quotes to /etc/puma.conf + +## 2.0.1 / 2013-04-30 + +* 1 bug fix: + * Fix not starting on JRuby properly + +## 2.0.0 / 2013-04-29 + +RailsConf 2013 edition! + +* 2 doc changes: + * Start with rackup -s Puma, NOT rackup -s puma. + * Minor doc fixes in the README.md, Capistrano section + +* 2 bug fixes: + * Fix reading RACK_ENV properly. Fixes [#234] + * Make cap recipe handle tmp/sockets; fixes [#228] + +* 3 minor changes: + * Fix capistrano recipe + * Fix stdout/stderr logs to sync outputs + * allow binding to IPv6 addresses + +## 2.0.0.b7 / 2013-03-18 + +* 5 minor enhancements: + * Add -q option for :start + * Add -V, --version + * Add default Rack handler helper + * Upstart support + * Set worker directory from configuration file + +* 12 bug fixes: + * Close the binder in the right place. Fixes [#192] + * Handle early term in workers. Fixes [#206] + * Make sure that the default port is 80 when the request doesn't include HTTP_X_FORWARDED_PROTO. + * Prevent Errno::EBADF errors on restart when running ruby 2.0 + * Record the proper @master_pid + * Respect the header HTTP_X_FORWARDED_PROTO when the host doesn't include a port number. + * Retry EAGAIN/EWOULDBLOCK during syswrite + * Run exec properly to restart. Fixes [#154] + * Set Rack run_once to false + * Syncronize all access to @timeouts. Fixes [#208] + * Write out the state post-daemonize. Fixes [#189] + * Prevent crash when all workers are gone + +## 2.0.0.b6 / 2013-02-06 + +* 2 minor enhancements: + * Add hook for running when a worker boots + * Advertise the Configuration object for apps to use. + +* 1 bug fix: + * Change directory in working during upgrade. Fixes [#185] + +## 2.0.0.b5 / 2013-02-05 + +* 2 major features: + * Add phased worker upgrade + * Add support for the rack hijack protocol + +* 2 minor features: + * Add -R to specify the restart command + * Add config file option to specify the restart command + +* 5 bug fixes: + * Cleanup pipes properly. Fixes [#182] + * Daemonize earlier so that we don't lose app threads. Fixes [#183] + * Drain the notification pipe. Fixes [#176], thanks @cryo28 + * Move write_pid to after we daemonize. Fixes [#180] + * Redirect IO properly and emit message for checkpointing + +## 2.0.0.b4 / 2012-12-12 + +* 4 bug fixes: + * Properly check #syswrite's value for variable sized buffers. Fixes [#170] + * Shutdown status server properly + * Handle char vs byte and mixing syswrite with write properly + * made MiniSSL validate key/cert file existence + +## 2.0.0.b3 / 2012-11-22 + +* 1 bug fix: + * Package right files in gem + +## 2.0.0.b2 / 2012-11-18 +* 5 minor feature: + * Now Puma is bundled with an capistrano recipe. Just require + 'puma/capistrano' in you deploy.rb + * Only inject CommonLogger in development mode + * Add -p option to pumactl + * Add ability to use pumactl to start a server + * Add options to daemonize puma + +* 7 bug fixes: + * Reset the IOBuffer properly. Fixes [#148] + * Shutdown gracefully on JRuby with Ctrl-C + * Various methods to get newrelic to start. Fixes [#128] + * fixing syntax error at capistrano recipe + * Force ECONNRESET when read returns nil + * Be sure to empty the drain the todo before shutting down. Fixes [#155] + * allow for alternate locations for status app + +## 2.0.0.b1 / 2012-09-11 + +* 1 major feature: + * Optional worker process mode (-w) to allow for process scaling in + addition to thread scaling + +* 1 bug fix: + * Introduce Puma::MiniSSL to be able to properly control doing + nonblocking SSL + +NOTE: SSL support in JRuby is not supported at present. Support will +be added back in a future date when a java Puma::MiniSSL is added. + +## 1.6.3 / 2012-09-04 + +* 1 bug fix: + * Close sockets waiting in the reactor when a hot restart is performed + so that browsers reconnect on the next request + +## 1.6.2 / 2012-08-27 + +* 1 bug fix: + * Rescue StandardError instead of IOError to handle SystemCallErrors + as well as other application exceptions inside the reactor. + +## 1.6.1 / 2012-07-23 + +* 1 packaging bug fixed: + * Include missing files + +## 1.6.0 / 2012-07-23 + +* 1 major bug fix: + * Prevent slow clients from starving the server by introducing a + dedicated IO reactor thread. Credit for reporting goes to @meh. + +## 1.5.0 / 2012-07-19 + +* 7 contributors to this release: + * Christian Mayer + * Darío Javier Cravero + * Dirkjan Bussink + * Gianluca Padovani + * Santiago Pastorino + * Thibault Jouan + * tomykaira + +* 6 bug fixes: + * Define RSTRING_NOT_MODIFIED for Rubinius + * Convert status to integer. Fixes [#123] + * Delete pidfile when stopping the server + * Allow compilation with -Werror=format-security option + * Fix wrong HTTP version for a HTTP/1.0 request + * Use String#bytesize instead of String#length + +* 3 minor features: + * Added support for setting RACK_ENV via the CLI, config file, and rack app + * Allow Server#run to run sync. Fixes [#111] + * Puma can now run on windows + +## 1.4.0 / 2012-06-04 + +* 1 bug fix: + * SCRIPT_NAME should be passed from env to allow mounting apps + +* 1 experimental feature: + * Add puma.socket key for direct socket access + +## 1.3.1 / 2012-05-15 + +* 2 bug fixes: + * use #bytesize instead of #length for Content-Length header + * Use StringIO properly. Fixes [#98] + +## 1.3.0 / 2012-05-08 + +* 2 minor features: + * Return valid Rack responses (passes Lint) from status server + * Add -I option to specify $LOAD_PATH directories + +* 4 bug fixes: + * Don't join the server thread inside the signal handle. Fixes [#94] + * Make NullIO#read mimic IO#read + * Only stop the status server if it's started. Fixes [#84] + * Set RACK_ENV early in cli also. Fixes [#78] + +* 1 new contributor: + * Jesse Cooke + +## 1.2.2 / 2012-04-28 + +* 4 bug fixes: + * Report a lowlevel error to stderr + * Set a fallback SERVER_NAME and SERVER_PORT + * Keep the encoding of the body correct. Fixes [#79] + * show error.to_s along with backtrace for low-level error + +## 1.2.1 / 2012-04-11 + +* 1 bug fix: + * Fix rack.url_scheme for SSL servers. Fixes [#65] + +## 1.2.0 / 2012-04-11 + +* 1 major feature: + * When possible, the internal restart does a "hot restart" meaning + the server sockets remains open, so no connections are lost. + +* 1 minor feature: + * More helpful fallback error message + +* 6 bug fixes: + * Pass the proper args to unknown_error. Fixes [#54], [#58] + * Stop the control server before restarting. Fixes [#61] + * Fix reporting https only on a true SSL connection + * Set the default content type to 'text/plain'. Fixes [#63] + * Use REUSEADDR. Fixes [#60] + * Shutdown gracefully on SIGTERM. Fixes [#53] + +* 2 new contributors: + * Seamus Abshere + * Steve Richert + +## 1.1.1 / 2012-03-30 + +* 1 bugfix: + * Include puma/compat.rb in the gem (oops!) + +## 1.1.0 / 2012-03-30 + +* 1 bugfix: + * Make sure that the unix socket has the perms 0777 by default + +* 1 minor feature: + * Add umask param to the unix:// bind to set the umask + +## 1.0.0 / 2012-03-29 + +* Released! + +## Ignore - this is for maintainers to copy-paste during release +## Master + +* Features + * Your feature goes here (#Github Number) + +* Bugfixes + * Your bugfix goes here (#Github Number) + +[#3680]:https://github.com/puma/puma/pull/3680 "PR by @byroot, merged 2025-07-31" +[#3572]:https://github.com/puma/puma/pull/3572 "PR by @barthez, merged 2025-02-06" +[#3586]:https://github.com/puma/puma/pull/3586 "PR by @MSP-Greg, merged 2025-02-03" +[#3598]:https://github.com/puma/puma/pull/3598 "PR by @joshuay03, merged 2025-01-31" +[#3601]:https://github.com/puma/puma/pull/3601 "PR by @joshuay03, merged 2025-01-31" +[#3635]:https://github.com/puma/puma/pull/3635 "PR by @LevitatingBusinessMan, merged 2025-05-08" +[#3570]:https://github.com/puma/puma/pull/3570 "PR by @mohamedhafez, merged 2024-12-30" +[#3567]:https://github.com/puma/puma/issues/3567 "Issue by @mohamedhafez, closed 2024-12-30" +[#3383]:https://github.com/puma/puma/pull/3383 "PR by @joshuay03, merged 2024-11-29" +[#3386]:https://github.com/puma/puma/pull/3386 "PR by @Drakula2k, merged 2024-11-27" +[#3517]:https://github.com/puma/puma/pull/3517 "PR by @jjb, merged 2024-11-26" +[#3375]:https://github.com/puma/puma/pull/3375 "PR by @joshuay03, merged 2024-11-23" +[#3348]:https://github.com/puma/puma/pull/3348 "PR by @tomurb, merged 2024-11-23" +[#3302]:https://github.com/puma/puma/issues/3302 "Issue by @benburkert, closed 2024-11-23" +[#3384]:https://github.com/puma/puma/pull/3384 "PR by @joshuay03, merged 2024-11-23" +[#3590]:https://github.com/puma/puma/pull/3590 "PR by @MSP-Greg, merged 2025-01-01" +[#3552]:https://github.com/puma/puma/issues/3552 "Issue by @utay, closed 2025-01-01" +[#3568]:https://github.com/puma/puma/pull/3568 "PR by @joshuay03, merged 2024-12-11" +[#3505]:https://github.com/puma/puma/pull/3505 "PR by @AnthonyClark, merged 2025-01-27" +[#3595]:https://github.com/puma/puma/pull/3595 "PR by @nateberkopec, merged 2025-01-07" +[#3565]:https://github.com/puma/puma/pull/3565 "PR by @MSP-Greg, merged 2024-11-28" +[#3376]:https://github.com/puma/puma/pull/3376 "PR by @joshuay03, merged 2024-11-23" +[#3407]:https://github.com/puma/puma/pull/3407 "PR by @JacobEvelyn, merged 2024-11-05" +[#3439]:https://github.com/puma/puma/pull/3439 "PR by @codergeek121, merged 2024-11-04" +[#3437]:https://github.com/puma/puma/issues/3437 "Issue by @rafaelfranca, closed 2024-11-04" +[#3486]:https://github.com/puma/puma/pull/3486 "PR by @mohamedhafez, merged 2024-09-26" +[#3422]:https://github.com/puma/puma/issues/3422 "Issue by @mohamedhafez, closed 2024-09-26" +[#3496]:https://github.com/puma/puma/pull/3496 "PR by @slizco, merged 2024-09-26" +[#3485]:https://github.com/puma/puma/pull/3485 "PR by @MSP-Greg, merged 2024-09-21" +[#3359]:https://github.com/puma/puma/pull/3359 "PR by @willayton, merged 2024-04-11" +[#3343]:https://github.com/puma/puma/issues/3343 "Issue by @willayton, closed 2024-04-11" +[#3309]:https://github.com/puma/puma/pull/3309 "PR by @byroot, merged 2024-01-09" +[#3425]:https://github.com/puma/puma/pull/3425 "PR by @mohamedhafez, merged 2024-07-14" +[#3424]:https://github.com/puma/puma/issues/3424 "Issue by @mohamedhafez, closed 2024-07-14" +[#3411]:https://github.com/puma/puma/pull/3411 "PR by @OuYangJinTing, merged 2024-06-15" +[#3380]:https://github.com/puma/puma/pull/3380 "PR by @emilyst, closed 2024-06-15" +[#3539]:https://github.com/puma/puma/pull/3539 "PR by @caius, merged 2024-11-20" +[#3532]:https://github.com/puma/puma/pull/3532 "PR by @MSP-Greg, merged 2024-10-24" +[#3531]:https://github.com/puma/puma/issues/3531 "Issue by @tagliala, closed 2024-10-24" +[#3214]:https://github.com/puma/puma/pull/3214 "PR by @MSP-Greg, merged 2024-10-15" +[#3468]:https://github.com/puma/puma/pull/3468 "PR by @foca, merged 2024-10-04" +[#3508]:https://github.com/puma/puma/pull/3508 "PR by @MayCXC, merged 2024-10-02" +[#3360]:https://github.com/puma/puma/pull/3360 "PR by @ioquatix, merged 2024-04-24" +[#3338]:https://github.com/puma/puma/pull/3338 "PR by @MSP-Greg, merged 2024-04-11" +[#3337]:https://github.com/puma/puma/issues/3337 "Issue by @skliew, closed 2024-04-11" +[#3332]:https://github.com/puma/puma/pull/3332 "PR by @evanphx, merged 2024-02-18" +[#3308]:https://github.com/puma/puma/pull/3308 "PR by @MSP-Greg, merged 2024-01-31" +[#3307]:https://github.com/puma/puma/issues/3307 "Issue by @nateberkopec, closed 2024-01-31" +[#3314]:https://github.com/puma/puma/pull/3314 "PR by @stanhu, merged 2024-01-26" +[#3313]:https://github.com/puma/puma/issues/3313 "Issue by @stanhu, closed 2024-01-26" +[#3518]:https://github.com/puma/puma/pull/3518 "PR by @roque86, merged 2024-11-15" +[#3467]:https://github.com/puma/puma/pull/3467 "PR by @MSP-Greg, merged 2024-09-21" +[#3341]:https://github.com/puma/puma/pull/3341 "PR by @joshuay03, merged 2024-03-11" +[#3548]:https://github.com/puma/puma/pull/3548 "PR by @MSP-Greg, merged 2024-11-21" +[#3325]:https://github.com/puma/puma/pull/3325 "PR by @OuYangJinTing, merged 2024-10-22" +[#3527]:https://github.com/puma/puma/pull/3527 "PR by @MSP-Greg, merged 2024-10-26" +[#3513]:https://github.com/puma/puma/pull/3513 "PR by @jjb, merged 2024-10-11" +[#3510]:https://github.com/puma/puma/pull/3510 "PR by @MSP-Greg, merged 2024-10-03" +[#3370]:https://github.com/puma/puma/pull/3370 "PR by @MSP-Greg, merged 2024-04-15" +[#3340]:https://github.com/puma/puma/pull/3340 "PR by @joshuay03, merged 2024-03-10" +[#3318]:https://github.com/puma/puma/pull/3318 "PR by @joshuay03, merged 2024-01-15" +[#3514]:https://github.com/puma/puma/pull/3514 "PR by @jjb, merged 2024-10-11" +[#3434]:https://github.com/puma/puma/pull/3434 "PR by @olleolleolle, merged 2024-09-19" +[#3435]:https://github.com/puma/puma/pull/3435 "PR by @olleolleolle, merged 2024-09-19" +[#3495]:https://github.com/puma/puma/pull/3495 "PR by @MSP-Greg, merged 2024-09-19" +[#3256]:https://github.com/puma/puma/pull/3256 "PR by @MSP-Greg, merged 2023-10-16" +[#3235]:https://github.com/puma/puma/pull/3235 "PR by @joshuay03, merged 2023-10-03" +[#3228]:https://github.com/puma/puma/issues/3228 "Issue by @davidalejandroaguilar, closed 2023-10-03" +[#3282]:https://github.com/puma/puma/issues/3282 "Issue by @bensheldon, closed 2024-01-02" +[#3283]:https://github.com/puma/puma/pull/3283 "PR by @joshuay03, merged 2024-01-02" +[#3225]:https://github.com/puma/puma/pull/3225 "PR by @joshuay03, merged 2023-09-27" +[#2786]:https://github.com/puma/puma/issues/2786 "Issue by @vitiokss, closed 2023-09-27" +[#3179]:https://github.com/puma/puma/pull/3179 "PR by @MSP-Greg, merged 2023-09-26" +[#3255]:https://github.com/puma/puma/pull/3255 "PR by @casperisfine, merged 2023-10-19" +[#3276]:https://github.com/puma/puma/pull/3276 "PR by @casperisfine, merged 2023-11-16" +[#3271]:https://github.com/puma/puma/pull/3271 "PR by @MSP-Greg, merged 2023-10-30" +[#3266]:https://github.com/puma/puma/issues/3266 "Issue by @Dragonicity, closed 2023-10-30" +[#3270]:https://github.com/puma/puma/pull/3270 "PR by @MSP-Greg, merged 2023-10-30" +[#3265]:https://github.com/puma/puma/pull/3265 "PR by @MSP-Greg, merged 2023-10-25" +[#3264]:https://github.com/puma/puma/issues/3264 "Issue by @dentarg, closed 2023-10-25" +[#3254]:https://github.com/puma/puma/pull/3254 "PR by @casperisfine, merged 2023-10-11" +[#3245]:https://github.com/puma/puma/pull/3245 "PR by @olleolleolle, merged 2023-10-02" +[#3293]:https://github.com/puma/puma/pull/3293 "PR by @MSP-Greg, merged 2023-12-21" +[#3301]:https://github.com/puma/puma/pull/3301 "PR by @benburkert, merged 2023-12-29" +[#3248]:https://github.com/puma/puma/pull/3248 "PR by @dentarg, merged 2023-10-04" +[#3298]:https://github.com/puma/puma/pull/3298 "PR by @til, merged 2023-12-26" +[#2920]:https://github.com/puma/puma/pull/2920 "PR by @biinari, merged 2023-07-11" +[#3195]:https://github.com/puma/puma/pull/3195 "PR by @binarygit, merged 2023-08-15" +[#3209]:https://github.com/puma/puma/pull/3209 "PR by @joshuay03, merged 2023-09-04" +[#2580]:https://github.com/puma/puma/issues/2580 "Issue by @schuetzm, closed 2023-09-04" +[#3204]:https://github.com/puma/puma/pull/3204 "PR by @dhavalsingh, merged 2023-08-25" +[#3191]:https://github.com/puma/puma/pull/3191 "PR by @MSP-Greg, merged 2023-08-31" +[#3165]:https://github.com/puma/puma/pull/3165 "PR by @fallwith, merged 2023-06-06" +[#3174]:https://github.com/puma/puma/pull/3174 "PR by @copiousfreetime, merged 2023-06-11" +[#3181]:https://github.com/puma/puma/pull/3181 "PR by @MSP-Greg, merged 2023-06-23" +[#3187]:https://github.com/puma/puma/pull/3187 "PR by @MSP-Greg, merged 2023-06-30" +[#3094]:https://github.com/puma/puma/pull/3094 "PR by @Vuta, merged 2023-07-23" +[#3106]:https://github.com/puma/puma/pull/3106 "PR by @MSP-Greg, merged 2023-05-29" +[#3014]:https://github.com/puma/puma/issues/3014 "Issue by @kyledrake, closed 2023-05-29" +[#3161]:https://github.com/puma/puma/pull/3161 "PR by @MSP-Greg, merged 2023-05-27" +[#3037]:https://github.com/puma/puma/issues/3037 "Issue by @daisy1754, closed 2023-05-27" +[#3133]:https://github.com/puma/puma/pull/3133 "PR by @stanhu, merged 2023-04-30" +[#3132]:https://github.com/puma/puma/issues/3132 "Issue by @stanhu, closed 2023-04-30" +[#3163]:https://github.com/puma/puma/pull/3163 "PR by @MSP-Greg, merged 2023-05-27" +[#3155]:https://github.com/puma/puma/pull/3155 "PR by @dentarg, merged 2023-05-14" +[#3148]:https://github.com/puma/puma/issues/3148 "Issue by @dentarg, closed 2023-05-14" +[#3129]:https://github.com/puma/puma/pull/3129 "PR by @MSP-Greg, merged 2023-05-02" +[#3137]:https://github.com/puma/puma/pull/3137 "PR by @MSP-Greg, merged 2023-04-30" +[#3156]:https://github.com/puma/puma/pull/3156 "PR by @severin, merged 2023-05-16" +[#3162]:https://github.com/puma/puma/pull/3162 "PR by @MSP-Greg, merged 2023-05-23" +[#3151]:https://github.com/puma/puma/pull/3151 "PR by @nateberkopec, merged 2023-05-12" +[#3118]:https://github.com/puma/puma/pull/3118 "PR by @ninoseki, merged 2023-04-01" +[#3117]:https://github.com/puma/puma/issues/3117 "Issue by @ninoseki, closed 2023-04-01" +[#3109]:https://github.com/puma/puma/pull/3109 "PR by @ahorek, merged 2023-03-31" +[#3108]:https://github.com/puma/puma/issues/3108 "Issue by @treviateo, closed 2023-03-31" +[#3113]:https://github.com/puma/puma/pull/3113 "PR by @collinsauve, merged 2023-03-31" +[#3112]:https://github.com/puma/puma/issues/3112 "Issue by @dmke, closed 2023-03-31" +[#3111]:https://github.com/puma/puma/pull/3111 "PR by @adzap, merged 2023-03-30" +[#2770]:https://github.com/puma/puma/pull/2770 "PR by @vzajkov, merged 2023-03-29" +[#2511]:https://github.com/puma/puma/issues/2511 "Issue by @jchristie55332, closed 2021-12-12" +[#3089]:https://github.com/puma/puma/pull/3089 "PR by @Vuta, merged 2023-03-06" +[#2709]:https://github.com/puma/puma/pull/2709 "PR by @rodzyn, merged 2023-02-20" +[#3091]:https://github.com/puma/puma/pull/3091 "PR by @MSP-Greg, merged 2023-03-28" +[#3074]:https://github.com/puma/puma/pull/3074 "PR by @MSP-Greg, merged 2023-03-14" +[#3072]:https://github.com/puma/puma/pull/3072 "PR by @MSP-Greg, merged 2023-02-17" +[#3079]:https://github.com/puma/puma/pull/3079 "PR by @mohamedhafez, merged 2023-02-24" +[#3080]:https://github.com/puma/puma/pull/3080 "PR by @MSP-Greg, merged 2023-02-16" +[#3058]:https://github.com/puma/puma/pull/3058 "PR by @dentarg, merged 2023-01-29" +[#3007]:https://github.com/puma/puma/issues/3007 "Issue by @MSP-Greg, closed 2023-01-29" +[#3011]:https://github.com/puma/puma/pull/3011 "PR by @joaomarcos96, merged 2023-01-03" +[#3006]:https://github.com/puma/puma/pull/3006 "PR by @QWYNG, merged 2023-02-09" +[#2604]:https://github.com/puma/puma/issues/2604 "Issue by @dgoetz, closed 2023-02-09" +[#3040]:https://github.com/puma/puma/pull/3040 "PR by @shayonj, merged 2023-01-02" +[#3036]:https://github.com/puma/puma/pull/3036 "PR by @MSP-Greg, merged 2023-01-13" +[#3020]:https://github.com/puma/puma/issues/3020 "Issue by @dentarg, closed 2023-01-13" +[#3061]:https://github.com/puma/puma/pull/3061 "PR by @MSP-Greg, merged 2023-02-12" +[#3057]:https://github.com/puma/puma/issues/3057 "Issue by @mmarvb8h, closed 2023-02-12" +[#3065]:https://github.com/puma/puma/pull/3065 "PR by @MSP-Greg, merged 2023-02-11" +[#3062]:https://github.com/puma/puma/pull/3062 "PR by @willkoehler, merged 2023-01-29" +[#3035]:https://github.com/puma/puma/pull/3035 "PR by @MSP-Greg, merged 2022-12-24" +[#3033]:https://github.com/puma/puma/issues/3033 "Issue by @jules-w2, closed 2022-12-24" +[#3016]:https://github.com/puma/puma/pull/3016 "PR by @MSP-Greg, merged 2022-12-24" +[#3005]:https://github.com/puma/puma/pull/3005 "PR by @JuanitoFatas, merged 2022-11-04" +[#3004]:https://github.com/puma/puma/pull/3004 "PR by @MSP-Greg, merged 2022-11-24" +[#3000]:https://github.com/puma/puma/issues/3000 "Issue by @dentarg, closed 2022-11-24" +[#3002]:https://github.com/puma/puma/pull/3002 "PR by @MSP-Greg, merged 2022-11-03" +[#2999]:https://github.com/puma/puma/issues/2999 "Issue by @aymeric-ledorze, closed 2022-11-03" +[#3013]:https://github.com/puma/puma/pull/3013 "PR by @MSP-Greg, merged 2022-11-13" +[#2919]:https://github.com/puma/puma/pull/2919 "PR by @MSP-Greg, merged 2022-08-30" +[#2652]:https://github.com/puma/puma/issues/2652 "Issue by @Roguelazer, closed 2022-09-04" +[#2653]:https://github.com/puma/puma/pull/2653 "PR by @Roguelazer, closed 2022-03-07" +[#2849]:https://github.com/puma/puma/pull/2849 "PR by @kares, merged 2022-04-09" +[#2933]:https://github.com/puma/puma/pull/2933 "PR by @cafedomancer, merged 2022-09-09" +[#2925]:https://github.com/puma/puma/issues/2925 "Issue by @nateberkopec, closed 2022-09-09" +[#2940]:https://github.com/puma/puma/pull/2940 "PR by @cafedomancer, merged 2022-09-10" +[#2924]:https://github.com/puma/puma/pull/2924 "PR by @cafedomancer, merged 2022-09-07" +[#2853]:https://github.com/puma/puma/issues/2853 "Issue by @nateberkopec, closed 2022-09-07" +[#2957]:https://github.com/puma/puma/pull/2957 "PR by @JuanitoFatas, merged 2022-09-16" +[#2958]:https://github.com/puma/puma/pull/2958 "PR by @JuanitoFatas, merged 2022-09-16" +[#2959]:https://github.com/puma/puma/pull/2959 "PR by @JuanitoFatas, merged 2022-09-16" +[#2960]:https://github.com/puma/puma/pull/2960 "PR by @JuanitoFatas, merged 2022-09-16" +[#2988]:https://github.com/puma/puma/pull/2988 "PR by @MSP-Greg, merged 2022-10-12" +[#2928]:https://github.com/puma/puma/pull/2928 "PR by @nateberkopec, merged 2022-09-10" +[#2798]:https://github.com/puma/puma/pull/2798 "PR by @johnnyshields, merged 2022-02-05" +[#2932]:https://github.com/puma/puma/pull/2932 "PR by @mrzasa, merged 2022-09-12" +[#2896]:https://github.com/puma/puma/pull/2896 "PR by @MSP-Greg, merged 2022-09-13" +[#2892]:https://github.com/puma/puma/pull/2892 "PR by @guilleiguaran, closed 2022-09-13" +[#2923]:https://github.com/puma/puma/pull/2923 "PR by @nateberkopec, merged 2022-09-09" +[#2740]:https://github.com/puma/puma/pull/2740 "PR by @ioquatix, merged 2022-01-29" +[#2845]:https://github.com/puma/puma/issues/2845 "Issue by @donv, closed 2022-03-22" +[#2917]:https://github.com/puma/puma/pull/2917 "PR by @MSP-Greg, merged 2022-09-19" +[#2915]:https://github.com/puma/puma/issues/2915 "Issue by @mperham, closed 2022-09-19" +[#2907]:https://github.com/puma/puma/pull/2907 "PR by @casperisfine, merged 2022-09-15" +[#2953]:https://github.com/puma/puma/pull/2953 "PR by @JuanitoFatas, merged 2022-09-14" +[#2936]:https://github.com/puma/puma/pull/2936 "PR by @MSP-Greg, merged 2022-09-09" +[#2931]:https://github.com/puma/puma/issues/2931 "Issue by @dentarg, closed 2022-09-09" +[#2875]:https://github.com/puma/puma/pull/2875 "PR by @ylecuyer, merged 2022-05-19" +[#2840]:https://github.com/puma/puma/pull/2840 "PR by @LukaszMaslej, merged 2022-04-13" +[#2774]:https://github.com/puma/puma/pull/2774 "PR by @ob-stripe, merged 2022-01-31" +[#2891]:https://github.com/puma/puma/pull/2891 "PR by @gingerlime, merged 2022-06-02" +[#2886]:https://github.com/puma/puma/pull/2886 "PR by @kares, merged 2022-05-30" +[#2899]:https://github.com/puma/puma/pull/2899 "PR by @kares, merged 2022-07-04" +[#2904]:https://github.com/puma/puma/pull/2904 "PR by @kares, merged 2022-08-27" +[#2884]:https://github.com/puma/puma/pull/2884 "PR by @kares, merged 2022-05-30" +[#2897]:https://github.com/puma/puma/pull/2897 "PR by @Edouard-chin, merged 2022-08-27" +[#1441]:https://github.com/puma/puma/issues/1441 "Issue by @nirvdrum, closed 2022-09-12" +[#2956]:https://github.com/puma/puma/pull/2956 "PR by @MSP-Greg, merged 2022-09-15" +[#2888]:https://github.com/puma/puma/pull/2888 "PR by @MSP-Greg, merged 2022-06-01" +[#2797]:https://github.com/puma/puma/pull/2797 "PR by @johnnyshields, merged 2022-02-01" +[#2795]:https://github.com/puma/puma/pull/2795 "PR by @johnnyshields, merged 2022-01-31" +[#2903]:https://github.com/puma/puma/pull/2903 "PR by @MSP-Greg, merged 2022-08-27" +[#2942]:https://github.com/puma/puma/pull/2942 "PR by @nateberkopec, merged 2022-09-15" +[#2921]:https://github.com/puma/puma/issues/2921 "Issue by @MSP-Greg, closed 2022-09-15" +[#2922]:https://github.com/puma/puma/issues/2922 "Issue by @MSP-Greg, closed 2022-09-10" +[#2955]:https://github.com/puma/puma/pull/2955 "PR by @cafedomancer, merged 2022-09-15" +[#3166]:https://github.com/puma/puma/pull/3166 "PR by @JoeDupuis, merged 2023-06-08" +[#2868]:https://github.com/puma/puma/pull/2868 "PR by @MSP-Greg, merged 2022-06-02" +[#2866]:https://github.com/puma/puma/issues/2866 "Issue by @slondr, closed 2022-06-02" +[#2883]:https://github.com/puma/puma/pull/2883 "PR by @MSP-Greg, merged 2022-06-02" +[#2890]:https://github.com/puma/puma/pull/2890 "PR by @kares, merged 2022-06-01" +[#2729]:https://github.com/puma/puma/issues/2729 "Issue by @kares, closed 2022-06-01" +[#2885]:https://github.com/puma/puma/pull/2885 "PR by @MSP-Greg, merged 2022-05-30" +[#2839]:https://github.com/puma/puma/issues/2839 "Issue by @wlipa, closed 2022-05-30" +[#2864]:https://github.com/puma/puma/pull/2864 "PR by @MSP-Greg, merged 2022-04-26" +[#2863]:https://github.com/puma/puma/issues/2863 "Issue by @eradman, closed 2022-04-26" +[#2861]:https://github.com/puma/puma/pull/2861 "PR by @BlakeWilliams, merged 2022-04-17" +[#2856]:https://github.com/puma/puma/issues/2856 "Issue by @nateberkopec, closed 2022-04-17" +[#2855]:https://github.com/puma/puma/pull/2855 "PR by @stanhu, merged 2022-04-09" +[#2848]:https://github.com/puma/puma/pull/2848 "PR by @stanhu, merged 2022-04-02" +[#2847]:https://github.com/puma/puma/pull/2847 "PR by @stanhu, merged 2022-04-02" +[#2838]:https://github.com/puma/puma/pull/2838 "PR by @epsilon-0, merged 2022-03-03" +[#2817]:https://github.com/puma/puma/pull/2817 "PR by @khustochka, merged 2022-02-20" +[#2810]:https://github.com/puma/puma/pull/2810 "PR by @kzkn, merged 2022-01-27" +[#2809]:https://github.com/puma/puma/pull/2809 "PR by @dentarg, merged 2022-01-26" +[#2764]:https://github.com/puma/puma/pull/2764 "PR by @dentarg, merged 2022-01-18" +[#2708]:https://github.com/puma/puma/issues/2708 "Issue by @erikaxel, closed 2022-01-18" +[#2780]:https://github.com/puma/puma/pull/2780 "PR by @dalibor, merged 2022-01-01" +[#2784]:https://github.com/puma/puma/pull/2784 "PR by @MSP-Greg, merged 2022-01-01" +[#2773]:https://github.com/puma/puma/pull/2773 "PR by @ob-stripe, merged 2022-01-01" +[#2794]:https://github.com/puma/puma/pull/2794 "PR by @johnnyshields, merged 2022-01-10" +[#2759]:https://github.com/puma/puma/pull/2759 "PR by @ob-stripe, merged 2021-12-11" +[#2731]:https://github.com/puma/puma/pull/2731 "PR by @baelter, merged 2021-11-02" +[#2341]:https://github.com/puma/puma/issues/2341 "Issue by @cjlarose, closed 2023-07-23" +[#2728]:https://github.com/puma/puma/pull/2728 "PR by @dalibor, merged 2021-10-31" +[#2733]:https://github.com/puma/puma/pull/2733 "PR by @ob-stripe, merged 2021-12-12" +[#2807]:https://github.com/puma/puma/pull/2807 "PR by @MSP-Greg, merged 2022-01-25" +[#2806]:https://github.com/puma/puma/issues/2806 "Issue by @olleolleolle, closed 2022-01-25" +[#2799]:https://github.com/puma/puma/pull/2799 "PR by @ags, merged 2022-01-22" +[#2785]:https://github.com/puma/puma/pull/2785 "PR by @MSP-Greg, merged 2022-01-02" +[#2757]:https://github.com/puma/puma/pull/2757 "PR by @MSP-Greg, merged 2021-11-24" +[#2745]:https://github.com/puma/puma/pull/2745 "PR by @MSP-Greg, merged 2021-11-03" +[#2742]:https://github.com/puma/puma/pull/2742 "PR by @MSP-Greg, merged 2021-12-12" +[#2730]:https://github.com/puma/puma/pull/2730 "PR by @kares, merged 2021-11-01" +[#2702]:https://github.com/puma/puma/pull/2702 "PR by @jacobherrington, merged 2021-09-21" +[#2610]:https://github.com/puma/puma/pull/2610 "PR by @ye-lin-aung, merged 2021-08-18" +[#2257]:https://github.com/puma/puma/issues/2257 "Issue by @nateberkopec, closed 2021-08-18" +[#2654]:https://github.com/puma/puma/pull/2654 "PR by @Roguelazer, merged 2021-09-07" +[#2651]:https://github.com/puma/puma/issues/2651 "Issue by @Roguelazer, closed 2021-09-07" +[#2689]:https://github.com/puma/puma/pull/2689 "PR by @jacobherrington, merged 2021-09-05" +[#2700]:https://github.com/puma/puma/pull/2700 "PR by @ioquatix, merged 2021-09-16" +[#2699]:https://github.com/puma/puma/issues/2699 "Issue by @ioquatix, closed 2021-09-16" +[#2690]:https://github.com/puma/puma/pull/2690 "PR by @doits, merged 2021-09-06" +[#2688]:https://github.com/puma/puma/pull/2688 "PR by @jdelStrother, merged 2021-09-03" +[#2687]:https://github.com/puma/puma/issues/2687 "Issue by @jdelStrother, closed 2021-09-03" +[#2675]:https://github.com/puma/puma/pull/2675 "PR by @devwout, merged 2021-09-08" +[#2657]:https://github.com/puma/puma/pull/2657 "PR by @olivierbellone, merged 2021-07-13" +[#2648]:https://github.com/puma/puma/pull/2648 "PR by @MSP-Greg, merged 2021-06-27" +[#1412]:https://github.com/puma/puma/issues/1412 "Issue by @x-yuri, closed 2021-06-27" +[#2586]:https://github.com/puma/puma/pull/2586 "PR by @MSP-Greg, merged 2021-05-26" +[#2569]:https://github.com/puma/puma/issues/2569 "Issue by @tarragon, closed 2021-05-26" +[#2643]:https://github.com/puma/puma/pull/2643 "PR by @MSP-Greg, merged 2021-06-27" +[#2638]:https://github.com/puma/puma/issues/2638 "Issue by @gingerlime, closed 2021-06-27" +[#2642]:https://github.com/puma/puma/pull/2642 "PR by @MSP-Greg, merged 2021-06-16" +[#2633]:https://github.com/puma/puma/pull/2633 "PR by @onlined, merged 2021-06-04" +[#2656]:https://github.com/puma/puma/pull/2656 "PR by @olivierbellone, merged 2021-07-07" +[#2666]:https://github.com/puma/puma/pull/2666 "PR by @MSP-Greg, merged 2021-07-25" +[#2630]:https://github.com/puma/puma/pull/2630 "PR by @seangoedecke, merged 2021-05-20" +[#2626]:https://github.com/puma/puma/issues/2626 "Issue by @rorymckinley, closed 2021-05-20" +[#2629]:https://github.com/puma/puma/pull/2629 "PR by @ye-lin-aung, merged 2021-05-20" +[#2628]:https://github.com/puma/puma/pull/2628 "PR by @wjordan, merged 2021-05-20" +[#2625]:https://github.com/puma/puma/issues/2625 "Issue by @jarthod, closed 2021-05-11" +[#2564]:https://github.com/puma/puma/pull/2564 "PR by @MSP-Greg, merged 2021-04-24" +[#2526]:https://github.com/puma/puma/issues/2526 "Issue by @nerdrew, closed 2021-04-24" +[#2559]:https://github.com/puma/puma/pull/2559 "PR by @ylecuyer, merged 2021-03-11" +[#2528]:https://github.com/puma/puma/issues/2528 "Issue by @cjlarose, closed 2021-03-11" +[#2565]:https://github.com/puma/puma/pull/2565 "PR by @CGA1123, merged 2021-03-09" +[#2534]:https://github.com/puma/puma/issues/2534 "Issue by @nateberkopec, closed 2021-03-09" +[#2563]:https://github.com/puma/puma/pull/2563 "PR by @MSP-Greg, merged 2021-03-06" +[#2504]:https://github.com/puma/puma/issues/2504 "Issue by @fsateler, closed 2021-03-06" +[#2591]:https://github.com/puma/puma/pull/2591 "PR by @MSP-Greg, merged 2021-05-05" +[#2572]:https://github.com/puma/puma/issues/2572 "Issue by @josef-krabath, closed 2021-05-05" +[#2613]:https://github.com/puma/puma/pull/2613 "PR by @smcgivern, merged 2021-04-27" +[#2605]:https://github.com/puma/puma/pull/2605 "PR by @pascalbetz, merged 2021-04-26" +[#2584]:https://github.com/puma/puma/issues/2584 "Issue by @kaorihinata, closed 2021-04-26" +[#2607]:https://github.com/puma/puma/pull/2607 "PR by @calvinxiao, merged 2021-04-23" +[#2552]:https://github.com/puma/puma/issues/2552 "Issue by @feliperaul, closed 2021-05-24" +[#2606]:https://github.com/puma/puma/pull/2606 "PR by @wjordan, merged 2021-04-20" +[#2574]:https://github.com/puma/puma/issues/2574 "Issue by @darkhelmet, closed 2021-04-20" +[#2567]:https://github.com/puma/puma/pull/2567 "PR by @kddnewton, merged 2021-04-19" +[#2566]:https://github.com/puma/puma/issues/2566 "Issue by @kddnewton, closed 2021-04-19" +[#2596]:https://github.com/puma/puma/pull/2596 "PR by @MSP-Greg, merged 2021-04-18" +[#2588]:https://github.com/puma/puma/pull/2588 "PR by @dentarg, merged 2021-04-02" +[#2556]:https://github.com/puma/puma/issues/2556 "Issue by @gamecreature, closed 2021-04-02" +[#2585]:https://github.com/puma/puma/pull/2585 "PR by @MSP-Greg, merged 2021-03-26" +[#2583]:https://github.com/puma/puma/issues/2583 "Issue by @jboler, closed 2021-03-26" +[#2609]:https://github.com/puma/puma/pull/2609 "PR by @calvinxiao, merged 2021-04-26" +[#2590]:https://github.com/puma/puma/pull/2590 "PR by @calvinxiao, merged 2021-04-05" +[#2600]:https://github.com/puma/puma/pull/2600 "PR by @wjordan, merged 2021-04-30" +[#2579]:https://github.com/puma/puma/pull/2579 "PR by @ghiculescu, merged 2021-03-17" +[#2553]:https://github.com/puma/puma/pull/2553 "PR by @olivierbellone, merged 2021-02-10" +[#2557]:https://github.com/puma/puma/pull/2557 "PR by @cjlarose, merged 2021-02-22" +[#2550]:https://github.com/puma/puma/pull/2550 "PR by @MSP-Greg, merged 2021-02-05" +[#2547]:https://github.com/puma/puma/pull/2547 "PR by @wildmaples, merged 2021-02-03" +[#2543]:https://github.com/puma/puma/pull/2543 "PR by @MSP-Greg, merged 2021-02-01" +[#2549]:https://github.com/puma/puma/pull/2549 "PR by @nmb, merged 2021-02-04" +[#2519]:https://github.com/puma/puma/pull/2519 "PR by @MSP-Greg, merged 2021-01-26" +[#2522]:https://github.com/puma/puma/pull/2522 "PR by @jcmfernandes, merged 2021-01-12" +[#2490]:https://github.com/puma/puma/pull/2490 "PR by @Bonias, merged 2020-12-07" +[#2486]:https://github.com/puma/puma/pull/2486 "PR by @karloscodes, merged 2020-12-02" +[#2535]:https://github.com/puma/puma/pull/2535 "PR by @MSP-Greg, merged 2021-01-27" +[#2529]:https://github.com/puma/puma/pull/2529 "PR by @MSP-Greg, merged 2021-01-24" +[#2533]:https://github.com/puma/puma/pull/2533 "PR by @MSP-Greg, merged 2021-01-24" +[#1953]:https://github.com/puma/puma/issues/1953 "Issue by @nateberkopec, closed 2020-12-01" +[#2516]:https://github.com/puma/puma/pull/2516 "PR by @cjlarose, merged 2020-12-17" +[#2520]:https://github.com/puma/puma/pull/2520 "PR by @dentarg, merged 2021-01-04" +[#2521]:https://github.com/puma/puma/pull/2521 "PR by @ojab, merged 2021-01-04" +[#2531]:https://github.com/puma/puma/pull/2531 "PR by @wjordan, merged 2021-01-19" +[#2510]:https://github.com/puma/puma/pull/2510 "PR by @micke, merged 2020-12-10" +[#2472]:https://github.com/puma/puma/pull/2472 "PR by @karloscodes, merged 2020-11-02" +[#2438]:https://github.com/puma/puma/pull/2438 "PR by @ekohl, merged 2020-10-26" +[#2406]:https://github.com/puma/puma/pull/2406 "PR by @fdel15, merged 2020-10-19" +[#2449]:https://github.com/puma/puma/pull/2449 "PR by @MSP-Greg, merged 2020-10-28" +[#2362]:https://github.com/puma/puma/pull/2362 "PR by @ekohl, merged 2020-11-10" +[#2485]:https://github.com/puma/puma/pull/2485 "PR by @elct9620, merged 2020-11-18" +[#2489]:https://github.com/puma/puma/pull/2489 "PR by @MSP-Greg, merged 2020-11-27" +[#2487]:https://github.com/puma/puma/pull/2487 "PR by @MSP-Greg, merged 2020-11-17" +[#2477]:https://github.com/puma/puma/pull/2477 "PR by @MSP-Greg, merged 2020-11-16" +[#2475]:https://github.com/puma/puma/pull/2475 "PR by @nateberkopec, merged 2020-11-02" +[#2439]:https://github.com/puma/puma/pull/2439 "PR by @kuei0221, merged 2020-10-26" +[#2460]:https://github.com/puma/puma/pull/2460 "PR by @cjlarose, merged 2020-10-27" +[#2473]:https://github.com/puma/puma/pull/2473 "PR by @cjlarose, merged 2020-11-01" +[#2479]:https://github.com/puma/puma/pull/2479 "PR by @cjlarose, merged 2020-11-10" +[#2495]:https://github.com/puma/puma/pull/2495 "PR by @JuanitoFatas, merged 2020-11-27" +[#2461]:https://github.com/puma/puma/pull/2461 "PR by @cjlarose, merged 2020-10-27" +[#2454]:https://github.com/puma/puma/issues/2454 "Issue by @majksner, closed 2020-10-27" +[#2432]:https://github.com/puma/puma/pull/2432 "PR by @MSP-Greg, merged 2020-10-25" +[#2442]:https://github.com/puma/puma/pull/2442 "PR by @wjordan, merged 2020-10-22" +[#2427]:https://github.com/puma/puma/pull/2427 "PR by @cjlarose, merged 2020-10-20" +[#2018]:https://github.com/puma/puma/issues/2018 "Issue by @gingerlime, closed 2020-10-20" +[#2435]:https://github.com/puma/puma/pull/2435 "PR by @wjordan, merged 2020-10-20" +[#2431]:https://github.com/puma/puma/pull/2431 "PR by @wjordan, merged 2020-10-16" +[#2212]:https://github.com/puma/puma/issues/2212 "Issue by @junaruga, closed 2020-10-16" +[#2409]:https://github.com/puma/puma/pull/2409 "PR by @fliiiix, merged 2020-10-03" +[#2448]:https://github.com/puma/puma/pull/2448 "PR by @MSP-Greg, merged 2020-10-25" +[#2450]:https://github.com/puma/puma/pull/2450 "PR by @MSP-Greg, merged 2020-10-25" +[#2419]:https://github.com/puma/puma/pull/2419 "PR by @MSP-Greg, merged 2020-10-09" +[#2279]:https://github.com/puma/puma/pull/2279 "PR by @wjordan, merged 2020-10-06" +[#2412]:https://github.com/puma/puma/pull/2412 "PR by @MSP-Greg, merged 2020-10-06" +[#2405]:https://github.com/puma/puma/pull/2405 "PR by @MSP-Greg, merged 2020-10-05" +[#2408]:https://github.com/puma/puma/pull/2408 "PR by @fliiiix, merged 2020-10-03" +[#2374]:https://github.com/puma/puma/pull/2374 "PR by @cjlarose, merged 2020-09-29" +[#2389]:https://github.com/puma/puma/pull/2389 "PR by @MSP-Greg, merged 2020-09-29" +[#2381]:https://github.com/puma/puma/pull/2381 "PR by @joergschray, merged 2020-09-24" +[#2271]:https://github.com/puma/puma/pull/2271 "PR by @wjordan, merged 2020-09-24" +[#2377]:https://github.com/puma/puma/pull/2377 "PR by @cjlarose, merged 2020-09-23" +[#2376]:https://github.com/puma/puma/pull/2376 "PR by @alexeevit, merged 2020-09-22" +[#2372]:https://github.com/puma/puma/pull/2372 "PR by @ahorek, merged 2020-09-22" +[#2384]:https://github.com/puma/puma/pull/2384 "PR by @schneems, merged 2020-09-27" +[#2375]:https://github.com/puma/puma/pull/2375 "PR by @MSP-Greg, merged 2020-09-23" +[#2373]:https://github.com/puma/puma/pull/2373 "PR by @MSP-Greg, merged 2020-09-23" +[#2305]:https://github.com/puma/puma/pull/2305 "PR by @MSP-Greg, merged 2020-09-14" +[#2099]:https://github.com/puma/puma/pull/2099 "PR by @wjordan, merged 2020-05-11" +[#2079]:https://github.com/puma/puma/pull/2079 "PR by @ayufan, merged 2020-05-11" +[#2093]:https://github.com/puma/puma/pull/2093 "PR by @schneems, merged 2019-12-18" +[#2256]:https://github.com/puma/puma/pull/2256 "PR by @nateberkopec, merged 2020-05-11" +[#2054]:https://github.com/puma/puma/pull/2054 "PR by @composerinteralia, merged 2019-11-11" +[#2106]:https://github.com/puma/puma/pull/2106 "PR by @ylecuyer, merged 2020-02-11" +[#2167]:https://github.com/puma/puma/pull/2167 "PR by @ChrisBr, closed 2020-07-06" +[#2344]:https://github.com/puma/puma/pull/2344 "PR by @dentarg, merged 2020-08-26" +[#2203]:https://github.com/puma/puma/pull/2203 "PR by @zanker-stripe, merged 2020-03-31" +[#2220]:https://github.com/puma/puma/pull/2220 "PR by @wjordan, merged 2020-04-14" +[#2238]:https://github.com/puma/puma/pull/2238 "PR by @sthirugn, merged 2020-05-07" +[#2086]:https://github.com/puma/puma/pull/2086 "PR by @bdewater, merged 2019-12-17" +[#2253]:https://github.com/puma/puma/pull/2253 "PR by @schneems, merged 2020-05-11" +[#2288]:https://github.com/puma/puma/pull/2288 "PR by @FTLam11, merged 2020-06-02" +[#1487]:https://github.com/puma/puma/pull/1487 "PR by @jxa, merged 2018-05-09" +[#2143]:https://github.com/puma/puma/pull/2143 "PR by @jalevin, merged 2020-04-21" +[#2169]:https://github.com/puma/puma/pull/2169 "PR by @nateberkopec, merged 2020-03-10" +[#2170]:https://github.com/puma/puma/pull/2170 "PR by @nateberkopec, merged 2020-03-10" +[#2076]:https://github.com/puma/puma/pull/2076 "PR by @drews256, merged 2020-02-27" +[#2022]:https://github.com/puma/puma/pull/2022 "PR by @olleolleolle, merged 2019-11-11" +[#2300]:https://github.com/puma/puma/pull/2300 "PR by @alexeevit, merged 2020-07-06" +[#2269]:https://github.com/puma/puma/pull/2269 "PR by @MSP-Greg, merged 2020-08-31" +[#2312]:https://github.com/puma/puma/pull/2312 "PR by @MSP-Greg, merged 2020-07-20" +[#2338]:https://github.com/puma/puma/issues/2338 "Issue by @micahhainlinestitchfix, closed 2020-08-18" +[#2116]:https://github.com/puma/puma/pull/2116 "PR by @MSP-Greg, merged 2020-05-15" +[#2074]:https://github.com/puma/puma/issues/2074 "Issue by @jchristie55332, closed 2020-02-19" +[#2211]:https://github.com/puma/puma/pull/2211 "PR by @MSP-Greg, merged 2020-03-30" +[#2069]:https://github.com/puma/puma/pull/2069 "PR by @MSP-Greg, merged 2019-11-09" +[#2112]:https://github.com/puma/puma/pull/2112 "PR by @wjordan, merged 2020-03-03" +[#1893]:https://github.com/puma/puma/pull/1893 "PR by @seven1m, merged 2020-02-18" +[#2119]:https://github.com/puma/puma/pull/2119 "PR by @wjordan, merged 2020-02-20" +[#2121]:https://github.com/puma/puma/pull/2121 "PR by @wjordan, merged 2020-02-21" +[#2154]:https://github.com/puma/puma/pull/2154 "PR by @cjlarose, merged 2020-03-10" +[#1551]:https://github.com/puma/puma/issues/1551 "Issue by @austinthecoder, closed 2020-03-10" +[#2198]:https://github.com/puma/puma/pull/2198 "PR by @eregon, merged 2020-03-24" +[#2216]:https://github.com/puma/puma/pull/2216 "PR by @praboud-stripe, merged 2020-04-06" +[#2122]:https://github.com/puma/puma/pull/2122 "PR by @wjordan, merged 2020-04-10" +[#2177]:https://github.com/puma/puma/issues/2177 "Issue by @GuiTeK, closed 2020-04-08" +[#2221]:https://github.com/puma/puma/pull/2221 "PR by @wjordan, merged 2020-04-17" +[#2233]:https://github.com/puma/puma/pull/2233 "PR by @ayufan, merged 2020-04-25" +[#2234]:https://github.com/puma/puma/pull/2234 "PR by @wjordan, merged 2020-04-30" +[#2225]:https://github.com/puma/puma/issues/2225 "Issue by @nateberkopec, closed 2020-04-27" +[#2267]:https://github.com/puma/puma/pull/2267 "PR by @wjordan, merged 2020-05-20" +[#2287]:https://github.com/puma/puma/pull/2287 "PR by @eugeneius, merged 2020-05-31" +[#2317]:https://github.com/puma/puma/pull/2317 "PR by @MSP-Greg, merged 2020-09-01" +[#2319]:https://github.com/puma/puma/issues/2319 "Issue by @AlexWayfer, closed 2020-09-03" +[#2326]:https://github.com/puma/puma/pull/2326 "PR by @rkistner, closed 2020-09-04" +[#2299]:https://github.com/puma/puma/issues/2299 "Issue by @JohnPhillips31416, closed 2020-09-17" +[#2095]:https://github.com/puma/puma/pull/2095 "PR by @bdewater, merged 2019-12-25" +[#2102]:https://github.com/puma/puma/pull/2102 "PR by @bdewater, merged 2020-02-07" +[#2111]:https://github.com/puma/puma/pull/2111 "PR by @wjordan, merged 2020-02-20" +[#1980]:https://github.com/puma/puma/pull/1980 "PR by @nateberkopec, merged 2020-02-27" +[#2189]:https://github.com/puma/puma/pull/2189 "PR by @jkowens, merged 2020-03-19" +[#2124]:https://github.com/puma/puma/pull/2124 "PR by @wjordan, merged 2020-04-14" +[#2223]:https://github.com/puma/puma/pull/2223 "PR by @wjordan, merged 2020-04-20" +[#2239]:https://github.com/puma/puma/pull/2239 "PR by @wjordan, merged 2020-05-15" +[#2496]:https://github.com/puma/puma/pull/2496 "PR by @TheRusskiy, merged 2020-11-30" +[#2304]:https://github.com/puma/puma/issues/2304 "Issue by @mpeltomaa, closed 2020-09-05" +[#2132]:https://github.com/puma/puma/issues/2132 "Issue by @bmclean, closed 2020-02-28" +[#2010]:https://github.com/puma/puma/pull/2010 "PR by @nateberkopec, merged 2019-10-07" +[#2012]:https://github.com/puma/puma/pull/2012 "PR by @headius, merged 2019-10-07" +[#2046]:https://github.com/puma/puma/pull/2046 "PR by @composerinteralia, merged 2019-10-21" +[#2052]:https://github.com/puma/puma/pull/2052 "PR by @composerinteralia, merged 2019-11-02" +[#1564]:https://github.com/puma/puma/issues/1564 "Issue by @perlun, closed 2019-10-07" +[#2035]:https://github.com/puma/puma/pull/2035 "PR by @AndrewSpeed, merged 2019-10-18" +[#2048]:https://github.com/puma/puma/pull/2048 "PR by @hahmed, merged 2019-10-21" +[#2050]:https://github.com/puma/puma/pull/2050 "PR by @olleolleolle, merged 2019-10-25" +[#1842]:https://github.com/puma/puma/issues/1842 "Issue by @nateberkopec, closed 2019-09-18" +[#1988]:https://github.com/puma/puma/issues/1988 "Issue by @mcg, closed 2019-10-01" +[#1986]:https://github.com/puma/puma/issues/1986 "Issue by @flaminestone, closed 2019-10-01" +[#1994]:https://github.com/puma/puma/issues/1994 "Issue by @LimeBlast, closed 2019-10-01" +[#2006]:https://github.com/puma/puma/pull/2006 "PR by @nateberkopec, merged 2019-10-01" +[#1222]:https://github.com/puma/puma/issues/1222 "Issue by @seanmckinley, closed 2019-10-04" +[#1885]:https://github.com/puma/puma/pull/1885 "PR by @spk, merged 2019-08-10" +[#1934]:https://github.com/puma/puma/pull/1934 "PR by @zarelit, merged 2019-08-28" +[#1105]:https://github.com/puma/puma/pull/1105 "PR by @daveallie, merged 2019-09-02" +[#1786]:https://github.com/puma/puma/pull/1786 "PR by @evanphx, merged 2019-09-11" +[#1320]:https://github.com/puma/puma/pull/1320 "PR by @nateberkopec, merged 2019-09-12" +[#1968]:https://github.com/puma/puma/pull/1968 "PR by @nateberkopec, merged 2019-09-15" +[#1908]:https://github.com/puma/puma/pull/1908 "PR by @MSP-Greg, merged 2019-08-23" +[#1952]:https://github.com/puma/puma/pull/1952 "PR by @MSP-Greg, merged 2019-09-19" +[#1941]:https://github.com/puma/puma/pull/1941 "PR by @MSP-Greg, merged 2019-09-02" +[#1961]:https://github.com/puma/puma/pull/1961 "PR by @nateberkopec, merged 2019-09-11" +[#1970]:https://github.com/puma/puma/pull/1970 "PR by @MSP-Greg, merged 2019-09-18" +[#1946]:https://github.com/puma/puma/pull/1946 "PR by @nateberkopec, merged 2019-09-02" +[#1831]:https://github.com/puma/puma/pull/1831 "PR by @spk, merged 2019-07-27" +[#1816]:https://github.com/puma/puma/pull/1816 "PR by @ylecuyer, merged 2019-08-01" +[#1844]:https://github.com/puma/puma/pull/1844 "PR by @ylecuyer, merged 2019-08-01" +[#1836]:https://github.com/puma/puma/pull/1836 "PR by @MSP-Greg, merged 2019-08-06" +[#1887]:https://github.com/puma/puma/pull/1887 "PR by @MSP-Greg, merged 2019-08-06" +[#1812]:https://github.com/puma/puma/pull/1812 "PR by @kou, merged 2019-08-03" +[#1491]:https://github.com/puma/puma/pull/1491 "PR by @olleolleolle, merged 2019-07-17" +[#1837]:https://github.com/puma/puma/pull/1837 "PR by @montanalow, merged 2019-07-25" +[#1857]:https://github.com/puma/puma/pull/1857 "PR by @Jesus, merged 2019-08-03" +[#1822]:https://github.com/puma/puma/pull/1822 "PR by @Jesus, merged 2019-08-01" +[#1863]:https://github.com/puma/puma/pull/1863 "PR by @dzunk, merged 2019-08-04" +[#1838]:https://github.com/puma/puma/pull/1838 "PR by @bogn83, merged 2019-07-14" +[#1882]:https://github.com/puma/puma/pull/1882 "PR by @okuramasafumi, merged 2019-08-06" +[#1848]:https://github.com/puma/puma/pull/1848 "PR by @nateberkopec, merged 2019-07-16" +[#1847]:https://github.com/puma/puma/pull/1847 "PR by @nateberkopec, merged 2019-07-16" +[#1846]:https://github.com/puma/puma/pull/1846 "PR by @nateberkopec, merged 2019-07-16" +[#1853]:https://github.com/puma/puma/pull/1853 "PR by @Jesus, merged 2019-07-18" +[#1850]:https://github.com/puma/puma/pull/1850 "PR by @nateberkopec, merged 2019-07-27" +[#1866]:https://github.com/puma/puma/pull/1866 "PR by @josacar, merged 2019-07-28" +[#1870]:https://github.com/puma/puma/pull/1870 "PR by @MSP-Greg, merged 2019-07-30" +[#1872]:https://github.com/puma/puma/pull/1872 "PR by @MSP-Greg, merged 2019-07-30" +[#1833]:https://github.com/puma/puma/issues/1833 "Issue by @julik, closed 2019-07-09" +[#1888]:https://github.com/puma/puma/pull/1888 "PR by @ClikeX, merged 2019-08-06" +[#1829]:https://github.com/puma/puma/pull/1829 "PR by @Fudoshiki, merged 2019-07-09" +[#1832]:https://github.com/puma/puma/pull/1832 "PR by @MSP-Greg, merged 2019-07-08" +[#1827]:https://github.com/puma/puma/pull/1827 "PR by @amrrbakry, merged 2019-06-27" +[#1562]:https://github.com/puma/puma/pull/1562 "PR by @skrobul, merged 2019-02-20" +[#1569]:https://github.com/puma/puma/pull/1569 "PR by @rianmcguire, merged 2019-02-20" +[#1648]:https://github.com/puma/puma/pull/1648 "PR by @wjordan, merged 2019-02-20" +[#1691]:https://github.com/puma/puma/pull/1691 "PR by @kares, merged 2019-02-20" +[#1716]:https://github.com/puma/puma/pull/1716 "PR by @mdkent, merged 2019-02-20" +[#1690]:https://github.com/puma/puma/pull/1690 "PR by @mic-kul, merged 2019-03-11" +[#1689]:https://github.com/puma/puma/pull/1689 "PR by @michaelherold, merged 2019-03-11" +[#1728]:https://github.com/puma/puma/pull/1728 "PR by @evanphx, merged 2019-03-20" +[#1824]:https://github.com/puma/puma/pull/1824 "PR by @spk, merged 2019-06-24" +[#1685]:https://github.com/puma/puma/pull/1685 "PR by @mainameiz, merged 2019-02-20" +[#1808]:https://github.com/puma/puma/pull/1808 "PR by @schneems, merged 2019-06-10" +[#1508]:https://github.com/puma/puma/pull/1508 "PR by @florin555, merged 2019-02-20" +[#1650]:https://github.com/puma/puma/pull/1650 "PR by @adam101, merged 2019-02-20" +[#1655]:https://github.com/puma/puma/pull/1655 "PR by @mipearson, merged 2019-02-20" +[#1671]:https://github.com/puma/puma/pull/1671 "PR by @eric-norcross, merged 2019-02-20" +[#1583]:https://github.com/puma/puma/pull/1583 "PR by @chwevans, merged 2019-02-20" +[#1773]:https://github.com/puma/puma/pull/1773 "PR by @enebo, merged 2019-04-14" +[#1731]:https://github.com/puma/puma/issues/1731 "Issue by @Fudoshiki, closed 2019-03-20" +[#1803]:https://github.com/puma/puma/pull/1803 "PR by @Jesus, merged 2019-05-28" +[#1741]:https://github.com/puma/puma/pull/1741 "PR by @MSP-Greg, merged 2019-03-19" +[#1674]:https://github.com/puma/puma/issues/1674 "Issue by @atitan, closed 2019-06-12" +[#1720]:https://github.com/puma/puma/issues/1720 "Issue by @voxik, closed 2019-03-20" +[#1730]:https://github.com/puma/puma/issues/1730 "Issue by @nearapogee, closed 2019-07-16" +[#1755]:https://github.com/puma/puma/issues/1755 "Issue by @vbalazs, closed 2019-07-26" +[#1649]:https://github.com/puma/puma/pull/1649 "PR by @schneems, merged 2018-10-17" +[#1607]:https://github.com/puma/puma/pull/1607 "PR by @harmdewit, merged 2018-08-15" +[#1700]:https://github.com/puma/puma/pull/1700 "PR by @schneems, merged 2019-01-05" +[#1630]:https://github.com/puma/puma/pull/1630 "PR by @eregon, merged 2018-09-11" +[#1478]:https://github.com/puma/puma/pull/1478 "PR by @eallison91, merged 2018-05-09" +[#1604]:https://github.com/puma/puma/pull/1604 "PR by @schneems, merged 2018-07-02" +[#1579]:https://github.com/puma/puma/pull/1579 "PR by @schneems, merged 2018-06-14" +[#1506]:https://github.com/puma/puma/pull/1506 "PR by @dekellum, merged 2018-05-09" +[#1563]:https://github.com/puma/puma/pull/1563 "PR by @dannyfallon, merged 2018-05-01" +[#1557]:https://github.com/puma/puma/pull/1557 "PR by @swrobel, merged 2018-05-09" +[#1529]:https://github.com/puma/puma/pull/1529 "PR by @desnudopenguino, merged 2018-03-20" +[#1532]:https://github.com/puma/puma/pull/1532 "PR by @schneems, merged 2018-03-21" +[#1482]:https://github.com/puma/puma/pull/1482 "PR by @shayonj, merged 2018-03-19" +[#1511]:https://github.com/puma/puma/pull/1511 "PR by @jemiam, merged 2018-03-19" +[#1545]:https://github.com/puma/puma/pull/1545 "PR by @hoshinotsuyoshi, merged 2018-03-28" +[#1550]:https://github.com/puma/puma/pull/1550 "PR by @eileencodes, merged 2018-03-29" +[#1553]:https://github.com/puma/puma/pull/1553 "PR by @eugeneius, merged 2018-04-02" +[#1510]:https://github.com/puma/puma/issues/1510 "Issue by @vincentwoo, closed 2018-03-06" +[#1524]:https://github.com/puma/puma/pull/1524 "PR by @tuwukee, closed 2018-03-06" +[#1507]:https://github.com/puma/puma/issues/1507 "Issue by @vincentwoo, closed 2018-03-19" +[#1483]:https://github.com/puma/puma/issues/1483 "Issue by @igravious, closed 2018-03-06" +[#1502]:https://github.com/puma/puma/issues/1502 "Issue by @vincentwoo, closed 2020-03-09" +[#1403]:https://github.com/puma/puma/pull/1403 "PR by @eileencodes, merged 2017-10-04" +[#1435]:https://github.com/puma/puma/pull/1435 "PR by @juliancheal, merged 2017-10-11" +[#1340]:https://github.com/puma/puma/pull/1340 "PR by @ViliusLuneckas, merged 2017-10-16" +[#1434]:https://github.com/puma/puma/pull/1434 "PR by @jumbosushi, merged 2017-10-10" +[#1436]:https://github.com/puma/puma/pull/1436 "PR by @luislavena, merged 2017-10-11" +[#1418]:https://github.com/puma/puma/pull/1418 "PR by @eileencodes, merged 2017-09-22" +[#1416]:https://github.com/puma/puma/pull/1416 "PR by @hiimtaylorjones, merged 2017-09-22" +[#1409]:https://github.com/puma/puma/pull/1409 "PR by @olleolleolle, merged 2017-09-13" +[#1427]:https://github.com/puma/puma/issues/1427 "Issue by @garybernhardt, closed 2017-10-04" +[#1430]:https://github.com/puma/puma/pull/1430 "PR by @MSP-Greg, merged 2017-10-09" +[#1429]:https://github.com/puma/puma/pull/1429 "PR by @perlun, merged 2017-10-09" +[#1455]:https://github.com/puma/puma/pull/1455 "PR by @perlun, merged 2017-11-16" +[#1425]:https://github.com/puma/puma/pull/1425 "PR by @vizcay, merged 2017-10-01" +[#1452]:https://github.com/puma/puma/pull/1452 "PR by @eprothro, merged 2017-11-16" +[#1439]:https://github.com/puma/puma/pull/1439 "PR by @MSP-Greg, merged 2017-10-16" +[#1442]:https://github.com/puma/puma/pull/1442 "PR by @MSP-Greg, merged 2017-10-19" +[#1464]:https://github.com/puma/puma/pull/1464 "PR by @MSP-Greg, merged 2017-11-20" +[#1384]:https://github.com/puma/puma/pull/1384 "PR by @noahgibbs, merged 2017-08-03" +[#1111]:https://github.com/puma/puma/pull/1111 "PR by @alexlance, merged 2017-06-04" +[#1392]:https://github.com/puma/puma/pull/1392 "PR by @hoffm, merged 2017-08-11" +[#1347]:https://github.com/puma/puma/pull/1347 "PR by @NikolayRys, merged 2017-06-28" +[#1334]:https://github.com/puma/puma/pull/1334 "PR by @respire, merged 2017-06-13" +[#1383]:https://github.com/puma/puma/pull/1383 "PR by @schneems, merged 2017-08-02" +[#1368]:https://github.com/puma/puma/pull/1368 "PR by @bongole, merged 2017-08-03" +[#1318]:https://github.com/puma/puma/pull/1318 "PR by @nateberkopec, merged 2017-08-03" +[#1376]:https://github.com/puma/puma/pull/1376 "PR by @pat, merged 2017-08-03" +[#1388]:https://github.com/puma/puma/pull/1388 "PR by @nateberkopec, merged 2017-08-08" +[#1390]:https://github.com/puma/puma/pull/1390 "PR by @junaruga, merged 2017-08-16" +[#1391]:https://github.com/puma/puma/pull/1391 "PR by @junaruga, merged 2017-08-16" +[#1385]:https://github.com/puma/puma/pull/1385 "PR by @grosser, merged 2017-08-16" +[#1377]:https://github.com/puma/puma/pull/1377 "PR by @shayonj, merged 2017-08-16" +[#1337]:https://github.com/puma/puma/pull/1337 "PR by @shayonj, merged 2017-08-16" +[#1325]:https://github.com/puma/puma/pull/1325 "PR by @palkan, merged 2017-06-04" +[#1395]:https://github.com/puma/puma/pull/1395 "PR by @junaruga, merged 2017-08-16" +[#1367]:https://github.com/puma/puma/issues/1367 "Issue by @dekellum, closed 2017-08-17" +[#1314]:https://github.com/puma/puma/pull/1314 "PR by @grosser, merged 2017-06-02" +[#1311]:https://github.com/puma/puma/pull/1311 "PR by @grosser, merged 2017-06-02" +[#1313]:https://github.com/puma/puma/pull/1313 "PR by @grosser, merged 2017-06-03" +[#1260]:https://github.com/puma/puma/pull/1260 "PR by @grosser, merged 2017-04-11" +[#1278]:https://github.com/puma/puma/pull/1278 "PR by @evanphx, merged 2017-04-28" +[#1306]:https://github.com/puma/puma/pull/1306 "PR by @jules2689, merged 2017-05-31" +[#1274]:https://github.com/puma/puma/pull/1274 "PR by @evanphx, merged 2017-05-01" +[#1261]:https://github.com/puma/puma/pull/1261 "PR by @jacksonrayhamilton, merged 2017-04-07" +[#1259]:https://github.com/puma/puma/pull/1259 "PR by @jacksonrayhamilton, merged 2017-04-07" +[#1248]:https://github.com/puma/puma/pull/1248 "PR by @davidarnold, merged 2017-04-18" +[#1277]:https://github.com/puma/puma/pull/1277 "PR by @schneems, merged 2017-05-01" +[#1290]:https://github.com/puma/puma/pull/1290 "PR by @schneems, merged 2017-05-12" +[#1285]:https://github.com/puma/puma/pull/1285 "PR by @fmauNeko, merged 2017-05-12" +[#1282]:https://github.com/puma/puma/pull/1282 "PR by @grosser, merged 2017-05-09" +[#1294]:https://github.com/puma/puma/pull/1294 "PR by @masry707, merged 2017-05-15" +[#1206]:https://github.com/puma/puma/pull/1206 "PR by @NikolayRys, closed 2017-06-27" +[#1241]:https://github.com/puma/puma/issues/1241 "Issue by @renchap, closed 2017-03-14" +[#1239]:https://github.com/puma/puma/pull/1239 "PR by @schneems, merged 2017-03-10" +[#1234]:https://github.com/puma/puma/pull/1234 "PR by @schneems, merged 2017-03-09" +[#1226]:https://github.com/puma/puma/pull/1226 "PR by @eileencodes, merged 2017-03-09" +[#1227]:https://github.com/puma/puma/pull/1227 "PR by @sirupsen, merged 2017-02-27" +[#1213]:https://github.com/puma/puma/pull/1213 "PR by @junaruga, merged 2017-02-28" +[#1182]:https://github.com/puma/puma/issues/1182 "Issue by @brunowego, closed 2017-02-09" +[#1203]:https://github.com/puma/puma/pull/1203 "PR by @twalpole, merged 2017-02-09" +[#1129]:https://github.com/puma/puma/pull/1129 "PR by @chtitux, merged 2016-12-12" +[#1165]:https://github.com/puma/puma/pull/1165 "PR by @sriedel, merged 2016-12-21" +[#1175]:https://github.com/puma/puma/pull/1175 "PR by @jemiam, merged 2016-12-21" +[#1068]:https://github.com/puma/puma/pull/1068 "PR by @junaruga, merged 2016-09-05" +[#1091]:https://github.com/puma/puma/pull/1091 "PR by @frodsan, merged 2016-09-17" +[#1088]:https://github.com/puma/puma/pull/1088 "PR by @frodsan, merged 2016-11-20" +[#1160]:https://github.com/puma/puma/pull/1160 "PR by @frodsan, merged 2016-11-24" +[#1169]:https://github.com/puma/puma/pull/1169 "PR by @scbrubaker02, merged 2016-12-12" +[#1061]:https://github.com/puma/puma/pull/1061 "PR by @michaelsauter, merged 2016-09-05" +[#1036]:https://github.com/puma/puma/issues/1036 "Issue by @matobinder, closed 2016-08-03" +[#1120]:https://github.com/puma/puma/pull/1120 "PR by @prathamesh-sonpatki, merged 2016-11-21" +[#1178]:https://github.com/puma/puma/pull/1178 "PR by @Koronen, merged 2016-12-21" +[#1002]:https://github.com/puma/puma/issues/1002 "Issue by @mattyb, closed 2016-07-26" +[#1063]:https://github.com/puma/puma/issues/1063 "Issue by @mperham, closed 2016-09-05" +[#1089]:https://github.com/puma/puma/issues/1089 "Issue by @AdamBialas, closed 2016-09-17" +[#1114]:https://github.com/puma/puma/pull/1114 "PR by @sj26, merged 2016-12-13" +[#1110]:https://github.com/puma/puma/pull/1110 "PR by @montdidier, merged 2016-12-12" +[#1135]:https://github.com/puma/puma/pull/1135 "PR by @jkraemer, merged 2016-11-19" +[#1081]:https://github.com/puma/puma/pull/1081 "PR by @frodsan, merged 2016-09-08" +[#1138]:https://github.com/puma/puma/pull/1138 "PR by @skull-squadron, merged 2016-12-13" +[#1118]:https://github.com/puma/puma/pull/1118 "PR by @hiroara, merged 2016-11-20" +[#1075]:https://github.com/puma/puma/issues/1075 "Issue by @pvalena, closed 2016-09-06" +[#932]:https://github.com/puma/puma/issues/932 "Issue by @everplays, closed 2016-07-24" +[#519]:https://github.com/puma/puma/issues/519 "Issue by @tmornini, closed 2016-07-25" +[#828]:https://github.com/puma/puma/issues/828 "Issue by @Zapotek, closed 2016-07-24" +[#984]:https://github.com/puma/puma/issues/984 "Issue by @erichmenge, closed 2016-07-24" +[#1028]:https://github.com/puma/puma/issues/1028 "Issue by @matobinder, closed 2016-07-24" +[#1023]:https://github.com/puma/puma/issues/1023 "Issue by @fera2k, closed 2016-07-24" +[#1027]:https://github.com/puma/puma/issues/1027 "Issue by @rosenfeld, closed 2016-07-24" +[#925]:https://github.com/puma/puma/issues/925 "Issue by @lokenmakwana, closed 2016-07-24" +[#911]:https://github.com/puma/puma/issues/911 "Issue by @veganstraightedge, closed 2016-07-24" +[#620]:https://github.com/puma/puma/issues/620 "Issue by @javanthropus, closed 2016-07-25" +[#778]:https://github.com/puma/puma/issues/778 "Issue by @niedhui, closed 2016-07-24" +[#1021]:https://github.com/puma/puma/pull/1021 "PR by @sarahzrf, merged 2016-07-20" +[#1022]:https://github.com/puma/puma/issues/1022 "Issue by @AKovtunov, closed 2017-08-16" +[#958]:https://github.com/puma/puma/issues/958 "Issue by @lalitlogical, closed 2016-04-23" +[#782]:https://github.com/puma/puma/issues/782 "Issue by @Tonkpils, closed 2016-07-19" +[#1010]:https://github.com/puma/puma/issues/1010 "Issue by @mneumark, closed 2016-07-19" +[#959]:https://github.com/puma/puma/issues/959 "Issue by @mwpastore, closed 2016-04-22" +[#840]:https://github.com/puma/puma/issues/840 "Issue by @marisawallace, closed 2016-04-07" +[#1007]:https://github.com/puma/puma/pull/1007 "PR by @willnet, merged 2016-06-24" +[#1014]:https://github.com/puma/puma/pull/1014 "PR by @szymon-jez, merged 2016-07-11" +[#1015]:https://github.com/puma/puma/pull/1015 "PR by @bf4, merged 2016-07-19" +[#1017]:https://github.com/puma/puma/pull/1017 "PR by @jorihardman, merged 2016-07-19" +[#954]:https://github.com/puma/puma/pull/954 "PR by @jf, merged 2016-04-12" +[#955]:https://github.com/puma/puma/pull/955 "PR by @jf, merged 2016-04-22" +[#956]:https://github.com/puma/puma/pull/956 "PR by @marisawallace, merged 2016-04-12" +[#960]:https://github.com/puma/puma/pull/960 "PR by @kmayer, merged 2016-04-15" +[#969]:https://github.com/puma/puma/pull/969 "PR by @frankwong15, merged 2016-05-10" +[#970]:https://github.com/puma/puma/pull/970 "PR by @willnet, merged 2016-04-26" +[#974]:https://github.com/puma/puma/pull/974 "PR by @reidmorrison, merged 2016-05-10" +[#977]:https://github.com/puma/puma/pull/977 "PR by @snow, merged 2016-05-10" +[#981]:https://github.com/puma/puma/pull/981 "PR by @zach-chai, merged 2016-07-19" +[#993]:https://github.com/puma/puma/pull/993 "PR by @scorix, merged 2016-07-19" +[#938]:https://github.com/puma/puma/issues/938 "Issue by @vandrijevik, closed 2016-04-07" +[#529]:https://github.com/puma/puma/issues/529 "Issue by @mperham, closed 2016-04-07" +[#788]:https://github.com/puma/puma/issues/788 "Issue by @herregroen, closed 2016-04-07" +[#894]:https://github.com/puma/puma/issues/894 "Issue by @rafbm, closed 2016-04-07" +[#937]:https://github.com/puma/puma/issues/937 "Issue by @huangxiangdan, closed 2016-04-07" +[#945]:https://github.com/puma/puma/pull/945 "PR by @dekellum, merged 2016-04-07" +[#946]:https://github.com/puma/puma/pull/946 "PR by @vipulnsward, merged 2016-04-07" +[#947]:https://github.com/puma/puma/pull/947 "PR by @vipulnsward, merged 2016-04-07" +[#936]:https://github.com/puma/puma/pull/936 "PR by @prathamesh-sonpatki, merged 2016-04-01" +[#940]:https://github.com/puma/puma/pull/940 "PR by @kyledrake, merged 2016-04-01" +[#942]:https://github.com/puma/puma/pull/942 "PR by @dekellum, merged 2016-04-01" +[#927]:https://github.com/puma/puma/pull/927 "PR by @jlecour, merged 2016-03-18" +[#931]:https://github.com/puma/puma/pull/931 "PR by @runlevel5, merged 2016-03-18" +[#922]:https://github.com/puma/puma/issues/922 "Issue by @LavirtheWhiolet, closed 2016-03-07" +[#923]:https://github.com/puma/puma/issues/923 "Issue by @donv, closed 2016-03-06" +[#912]:https://github.com/puma/puma/pull/912 "PR by @tricknotes, merged 2016-03-06" +[#921]:https://github.com/puma/puma/pull/921 "PR by @swrobel, merged 2016-03-06" +[#924]:https://github.com/puma/puma/pull/924 "PR by @tbrisker, merged 2016-03-07" +[#916]:https://github.com/puma/puma/issues/916 "Issue by @ma11hew28, closed 2016-03-06" +[#913]:https://github.com/puma/puma/issues/913 "Issue by @Casara, closed 2016-03-06" +[#918]:https://github.com/puma/puma/issues/918 "Issue by @rodrigdav, closed 2016-03-06" +[#910]:https://github.com/puma/puma/issues/910 "Issue by @ball-hayden, closed 2016-03-05" +[#914]:https://github.com/puma/puma/issues/914 "Issue by @osheroff, closed 2016-03-06" +[#901]:https://github.com/puma/puma/pull/901 "PR by @mitto, merged 2016-02-26" +[#902]:https://github.com/puma/puma/pull/902 "PR by @corrupt952, merged 2016-02-26" +[#905]:https://github.com/puma/puma/pull/905 "PR by @Eric-Guo, merged 2016-02-26" +[#852]:https://github.com/puma/puma/issues/852 "Issue by @asia653, closed 2016-02-25" +[#854]:https://github.com/puma/puma/issues/854 "Issue by @ollym, closed 2016-02-25" +[#824]:https://github.com/puma/puma/issues/824 "Issue by @MattWalston, closed 2016-02-25" +[#823]:https://github.com/puma/puma/issues/823 "Issue by @pneuman, closed 2016-02-25" +[#815]:https://github.com/puma/puma/issues/815 "Issue by @nate-dipiazza, closed 2016-02-25" +[#835]:https://github.com/puma/puma/issues/835 "Issue by @mwpastore, closed 2016-02-25" +[#798]:https://github.com/puma/puma/issues/798 "Issue by @schneems, closed 2016-02-25" +[#876]:https://github.com/puma/puma/issues/876 "Issue by @osheroff, closed 2016-02-25" +[#849]:https://github.com/puma/puma/issues/849 "Issue by @apotheon, closed 2016-02-25" +[#871]:https://github.com/puma/puma/pull/871 "PR by @deepj, merged 2016-02-25" +[#874]:https://github.com/puma/puma/pull/874 "PR by @wallclockbuilder, merged 2016-02-25" +[#883]:https://github.com/puma/puma/pull/883 "PR by @dadah89, merged 2016-02-25" +[#884]:https://github.com/puma/puma/pull/884 "PR by @furkanmustafa, merged 2016-02-25" +[#888]:https://github.com/puma/puma/pull/888 "PR by @mlarraz, merged 2016-02-25" +[#890]:https://github.com/puma/puma/pull/890 "PR by @todd, merged 2016-02-25" +[#891]:https://github.com/puma/puma/pull/891 "PR by @ctaintor, merged 2016-02-25" +[#893]:https://github.com/puma/puma/pull/893 "PR by @spastorino, merged 2016-02-25" +[#897]:https://github.com/puma/puma/pull/897 "PR by @vanchi-zendesk, merged 2016-02-25" +[#899]:https://github.com/puma/puma/pull/899 "PR by @kch, merged 2016-02-25" +[#859]:https://github.com/puma/puma/issues/859 "Issue by @boxofrad, closed 2016-01-28" +[#822]:https://github.com/puma/puma/pull/822 "PR by @kwugirl, merged 2016-01-28" +[#833]:https://github.com/puma/puma/pull/833 "PR by @joemiller, merged 2016-01-28" +[#837]:https://github.com/puma/puma/pull/837 "PR by @YurySolovyov, merged 2016-01-28" +[#839]:https://github.com/puma/puma/pull/839 "PR by @ka8725, merged 2016-01-15" +[#845]:https://github.com/puma/puma/pull/845 "PR by @deepj, merged 2016-01-28" +[#846]:https://github.com/puma/puma/pull/846 "PR by @sriedel, merged 2016-01-15" +[#850]:https://github.com/puma/puma/pull/850 "PR by @deepj, merged 2016-01-15" +[#853]:https://github.com/puma/puma/pull/853 "PR by @xuqiyong666, merged 2016-01-28" +[#857]:https://github.com/puma/puma/pull/857 "PR by @osheroff, merged 2016-01-15" +[#858]:https://github.com/puma/puma/pull/858 "PR by @mlarraz, merged 2016-01-28" +[#860]:https://github.com/puma/puma/pull/860 "PR by @osheroff, merged 2016-01-15" +[#861]:https://github.com/puma/puma/pull/861 "PR by @osheroff, merged 2016-01-15" +[#818]:https://github.com/puma/puma/pull/818 "PR by @unleashed, merged 2015-11-06" +[#819]:https://github.com/puma/puma/pull/819 "PR by @VictorLowther, merged 2015-11-06" +[#563]:https://github.com/puma/puma/issues/563 "Issue by @deathbob, closed 2015-11-06" +[#803]:https://github.com/puma/puma/issues/803 "Issue by @burningTyger, closed 2016-04-07" +[#768]:https://github.com/puma/puma/pull/768 "PR by @nathansamson, merged 2015-11-06" +[#773]:https://github.com/puma/puma/pull/773 "PR by @rossta, merged 2015-11-06" +[#774]:https://github.com/puma/puma/pull/774 "PR by @snow, merged 2015-11-06" +[#781]:https://github.com/puma/puma/pull/781 "PR by @sunsations, merged 2015-11-06" +[#791]:https://github.com/puma/puma/pull/791 "PR by @unleashed, merged 2015-10-01" +[#793]:https://github.com/puma/puma/pull/793 "PR by @robdimarco, merged 2015-11-06" +[#794]:https://github.com/puma/puma/pull/794 "PR by @peterkeen, merged 2015-11-06" +[#795]:https://github.com/puma/puma/pull/795 "PR by @unleashed, merged 2015-11-06" +[#796]:https://github.com/puma/puma/pull/796 "PR by @cschneid, merged 2015-10-13" +[#799]:https://github.com/puma/puma/pull/799 "PR by @annawinkler, merged 2015-11-06" +[#800]:https://github.com/puma/puma/pull/800 "PR by @liamseanbrady, merged 2015-11-06" +[#801]:https://github.com/puma/puma/pull/801 "PR by @scottjg, merged 2015-11-06" +[#802]:https://github.com/puma/puma/pull/802 "PR by @scottjg, merged 2015-11-06" +[#804]:https://github.com/puma/puma/pull/804 "PR by @burningTyger, merged 2015-11-06" +[#809]:https://github.com/puma/puma/pull/809 "PR by @unleashed, merged 2015-11-06" +[#810]:https://github.com/puma/puma/pull/810 "PR by @vlmonk, merged 2015-11-06" +[#814]:https://github.com/puma/puma/pull/814 "PR by @schneems, merged 2015-11-04" +[#817]:https://github.com/puma/puma/pull/817 "PR by @unleashed, merged 2015-11-06" +[#735]:https://github.com/puma/puma/issues/735 "Issue by @trekr5, closed 2015-08-04" +[#769]:https://github.com/puma/puma/issues/769 "Issue by @dovestyle, closed 2015-08-16" +[#767]:https://github.com/puma/puma/issues/767 "Issue by @kapso, closed 2015-08-15" +[#765]:https://github.com/puma/puma/issues/765 "Issue by @monfresh, closed 2015-08-15" +[#764]:https://github.com/puma/puma/issues/764 "Issue by @keithpitt, closed 2015-08-15" +[#669]:https://github.com/puma/puma/pull/669 "PR by @chulkilee, closed 2015-08-14" +[#673]:https://github.com/puma/puma/pull/673 "PR by @chulkilee, closed 2015-08-14" +[#668]:https://github.com/puma/puma/pull/668 "PR by @kcollignon, merged 2015-08-14" +[#754]:https://github.com/puma/puma/pull/754 "PR by @nathansamson, merged 2015-08-14" +[#759]:https://github.com/puma/puma/pull/759 "PR by @BenV, merged 2015-08-14" +[#761]:https://github.com/puma/puma/pull/761 "PR by @dmarcotte, merged 2015-08-14" +[#742]:https://github.com/puma/puma/pull/742 "PR by @deivid-rodriguez, merged 2015-07-17" +[#743]:https://github.com/puma/puma/pull/743 "PR by @matthewd, merged 2015-07-18" +[#749]:https://github.com/puma/puma/pull/749 "PR by @huacnlee, merged 2015-08-04" +[#751]:https://github.com/puma/puma/pull/751 "PR by @costi, merged 2015-07-31" +[#741]:https://github.com/puma/puma/issues/741 "Issue by @GUI, closed 2015-07-17" +[#739]:https://github.com/puma/puma/issues/739 "Issue by @hab278, closed 2015-07-17" +[#737]:https://github.com/puma/puma/issues/737 "Issue by @dmill, closed 2015-07-16" +[#733]:https://github.com/puma/puma/issues/733 "Issue by @Eric-Guo, closed 2015-07-15" +[#736]:https://github.com/puma/puma/pull/736 "PR by @paulanunda, merged 2015-07-15" +[#722]:https://github.com/puma/puma/issues/722 "Issue by @mikeki, closed 2015-07-14" +[#694]:https://github.com/puma/puma/issues/694 "Issue by @yld, closed 2015-06-10" +[#705]:https://github.com/puma/puma/issues/705 "Issue by @TheTeaNerd, closed 2015-07-14" +[#686]:https://github.com/puma/puma/pull/686 "PR by @jjb, merged 2015-06-10" +[#693]:https://github.com/puma/puma/pull/693 "PR by @rob-murray, merged 2015-06-10" +[#697]:https://github.com/puma/puma/pull/697 "PR by @spk, merged 2015-06-10" +[#699]:https://github.com/puma/puma/pull/699 "PR by @deees, merged 2015-05-19" +[#701]:https://github.com/puma/puma/pull/701 "PR by @deepj, merged 2015-05-19" +[#702]:https://github.com/puma/puma/pull/702 "PR by @OleMchls, merged 2015-06-10" +[#703]:https://github.com/puma/puma/pull/703 "PR by @deepj, merged 2015-06-10" +[#704]:https://github.com/puma/puma/pull/704 "PR by @grega, merged 2015-06-10" +[#709]:https://github.com/puma/puma/pull/709 "PR by @lian, merged 2015-06-10" +[#711]:https://github.com/puma/puma/pull/711 "PR by @julik, merged 2015-06-10" +[#712]:https://github.com/puma/puma/pull/712 "PR by @chewi, merged 2015-07-14" +[#715]:https://github.com/puma/puma/pull/715 "PR by @raymondmars, merged 2015-07-14" +[#725]:https://github.com/puma/puma/pull/725 "PR by @rwz, merged 2015-07-14" +[#726]:https://github.com/puma/puma/pull/726 "PR by @jshafton, merged 2015-07-14" +[#729]:https://github.com/puma/puma/pull/729 "PR by @allaire, merged 2015-07-14" +[#730]:https://github.com/puma/puma/pull/730 "PR by @iamjarvo, merged 2015-07-14" +[#690]:https://github.com/puma/puma/issues/690 "Issue by @bachue, closed 2015-04-21" +[#684]:https://github.com/puma/puma/issues/684 "Issue by @tomquas, closed 2015-04-13" +[#698]:https://github.com/puma/puma/pull/698 "PR by @dmarcotte, merged 2015-05-04" +[#683]:https://github.com/puma/puma/issues/683 "Issue by @indirect, closed 2015-04-11" +[#657]:https://github.com/puma/puma/pull/657 "PR by @schneems, merged 2015-02-19" +[#658]:https://github.com/puma/puma/pull/658 "PR by @tomohiro, merged 2015-02-23" +[#662]:https://github.com/puma/puma/pull/662 "PR by @iaintshine, merged 2015-03-06" +[#664]:https://github.com/puma/puma/pull/664 "PR by @fxposter, merged 2015-03-09" +[#667]:https://github.com/puma/puma/pull/667 "PR by @JuanitoFatas, merged 2015-03-12" +[#672]:https://github.com/puma/puma/pull/672 "PR by @chulkilee, merged 2015-03-15" +[#653]:https://github.com/puma/puma/issues/653 "Issue by @dvrensk, closed 2015-02-11" +[#644]:https://github.com/puma/puma/pull/644 "PR by @bpaquet, merged 2015-01-29" +[#646]:https://github.com/puma/puma/pull/646 "PR by @mkonecny, merged 2015-02-05" +[#630]:https://github.com/puma/puma/issues/630 "Issue by @jelmd, closed 2015-01-20" +[#622]:https://github.com/puma/puma/issues/622 "Issue by @sabamotto, closed 2015-01-20" +[#583]:https://github.com/puma/puma/issues/583 "Issue by @rwojsznis, closed 2015-01-20" +[#586]:https://github.com/puma/puma/issues/586 "Issue by @ponchik, closed 2015-01-20" +[#359]:https://github.com/puma/puma/issues/359 "Issue by @natew, closed 2014-12-13" +[#633]:https://github.com/puma/puma/issues/633 "Issue by @joevandyk, closed 2015-01-20" +[#478]:https://github.com/puma/puma/pull/478 "PR by @rubencaro, merged 2015-01-20" +[#610]:https://github.com/puma/puma/pull/610 "PR by @kwilczynski, merged 2014-11-27" +[#611]:https://github.com/puma/puma/pull/611 "PR by @jasonl, merged 2015-01-20" +[#616]:https://github.com/puma/puma/pull/616 "PR by @jc00ke, merged 2014-12-10" +[#623]:https://github.com/puma/puma/pull/623 "PR by @raldred, merged 2015-01-20" +[#628]:https://github.com/puma/puma/pull/628 "PR by @rdpoor, merged 2015-01-20" +[#634]:https://github.com/puma/puma/pull/634 "PR by @deepj, merged 2015-01-20" +[#637]:https://github.com/puma/puma/pull/637 "PR by @raskhadafi, merged 2015-01-20" +[#639]:https://github.com/puma/puma/pull/639 "PR by @ebeigarts, merged 2015-01-20" +[#640]:https://github.com/puma/puma/pull/640 "PR by @bailsman, merged 2015-01-20" +[#591]:https://github.com/puma/puma/issues/591 "Issue by @renier, closed 2014-11-24" +[#606]:https://github.com/puma/puma/issues/606 "Issue by @, closed 2014-11-24" +[#560]:https://github.com/puma/puma/pull/560 "PR by @raskhadafi, merged 2014-11-24" +[#566]:https://github.com/puma/puma/pull/566 "PR by @sheltond, merged 2014-11-24" +[#593]:https://github.com/puma/puma/pull/593 "PR by @andruby, merged 2014-10-30" +[#594]:https://github.com/puma/puma/pull/594 "PR by @hassox, merged 2014-10-31" +[#596]:https://github.com/puma/puma/pull/596 "PR by @burningTyger, merged 2014-11-01" +[#601]:https://github.com/puma/puma/pull/601 "PR by @sorentwo, merged 2014-11-24" +[#602]:https://github.com/puma/puma/pull/602 "PR by @1334, merged 2014-11-24" +[#608]:https://github.com/puma/puma/pull/608 "PR by @Gu1, merged 2014-11-24" +[#538]:https://github.com/puma/puma/pull/538 "PR by @memiux, merged 2014-11-24" +[#550]:https://github.com/puma/puma/issues/550 "Issue by @, closed 2014-10-30" +[#549]:https://github.com/puma/puma/pull/549 "PR by @bsnape, merged 2014-10-16" +[#553]:https://github.com/puma/puma/pull/553 "PR by @lowjoel, merged 2014-10-16" +[#568]:https://github.com/puma/puma/pull/568 "PR by @mariuz, merged 2014-10-16" +[#578]:https://github.com/puma/puma/pull/578 "PR by @danielbuechele, merged 2014-10-16" +[#581]:https://github.com/puma/puma/pull/581 "PR by @alexch, merged 2014-10-16" +[#590]:https://github.com/puma/puma/pull/590 "PR by @dmarcotte, merged 2014-10-16" +[#574]:https://github.com/puma/puma/issues/574 "Issue by @minasmart, closed 2014-09-05" +[#561]:https://github.com/puma/puma/pull/561 "PR by @krasnoukhov, merged 2014-08-04" +[#570]:https://github.com/puma/puma/pull/570 "PR by @havenwood, merged 2014-08-20" +[#520]:https://github.com/puma/puma/pull/520 "PR by @misfo, merged 2014-06-16" +[#530]:https://github.com/puma/puma/pull/530 "PR by @dmarcotte, merged 2014-06-16" +[#537]:https://github.com/puma/puma/pull/537 "PR by @vlmonk, merged 2014-06-16" +[#540]:https://github.com/puma/puma/pull/540 "PR by @allaire, merged 2014-05-27" +[#544]:https://github.com/puma/puma/pull/544 "PR by @chulkilee, merged 2014-06-03" +[#551]:https://github.com/puma/puma/pull/551 "PR by @jcxplorer, merged 2014-07-02" +[#487]:https://github.com/puma/puma/pull/487 "PR by @, merged 2014-03-06" +[#492]:https://github.com/puma/puma/pull/492 "PR by @, merged 2014-03-06" +[#493]:https://github.com/puma/puma/pull/493 "PR by @alepore, merged 2014-03-07" +[#503]:https://github.com/puma/puma/pull/503 "PR by @mariuz, merged 2014-04-12" +[#505]:https://github.com/puma/puma/pull/505 "PR by @sammcj, merged 2014-04-12" +[#506]:https://github.com/puma/puma/pull/506 "PR by @dsander, merged 2014-04-12" +[#510]:https://github.com/puma/puma/pull/510 "PR by @momer, merged 2014-04-12" +[#511]:https://github.com/puma/puma/pull/511 "PR by @macool, merged 2014-04-12" +[#514]:https://github.com/puma/puma/pull/514 "PR by @nanaya, merged 2014-04-12" +[#517]:https://github.com/puma/puma/pull/517 "PR by @misfo, merged 2014-04-12" +[#518]:https://github.com/puma/puma/pull/518 "PR by @alxgsv, merged 2014-04-12" +[#471]:https://github.com/puma/puma/pull/471 "PR by @arthurnn, merged 2014-02-28" +[#485]:https://github.com/puma/puma/pull/485 "PR by @runlevel5, merged 2014-03-01" +[#486]:https://github.com/puma/puma/pull/486 "PR by @joshwlewis, merged 2014-03-02" +[#490]:https://github.com/puma/puma/pull/490 "PR by @tobinibot, merged 2014-03-06" +[#491]:https://github.com/puma/puma/pull/491 "PR by @brianknight10, merged 2014-03-06" +[#438]:https://github.com/puma/puma/issues/438 "Issue by @mperham, closed 2014-01-25" +[#333]:https://github.com/puma/puma/issues/333 "Issue by @SamSaffron, closed 2014-01-26" +[#440]:https://github.com/puma/puma/issues/440 "Issue by @sudara, closed 2014-01-25" +[#449]:https://github.com/puma/puma/issues/449 "Issue by @cezarsa, closed 2014-02-04" +[#444]:https://github.com/puma/puma/issues/444 "Issue by @le0pard, closed 2014-01-25" +[#370]:https://github.com/puma/puma/issues/370 "Issue by @pelcasandra, closed 2014-01-26" +[#377]:https://github.com/puma/puma/issues/377 "Issue by @mrbrdo, closed 2014-01-26" +[#406]:https://github.com/puma/puma/issues/406 "Issue by @simonrussell, closed 2014-01-25" +[#425]:https://github.com/puma/puma/issues/425 "Issue by @jhass, closed 2014-01-26" +[#432]:https://github.com/puma/puma/pull/432 "PR by @anatol, closed 2014-01-25" +[#428]:https://github.com/puma/puma/pull/428 "PR by @alexeyfrank, merged 2014-01-25" +[#429]:https://github.com/puma/puma/pull/429 "PR by @namusyaka, merged 2013-12-16" +[#431]:https://github.com/puma/puma/pull/431 "PR by @mrb, merged 2014-01-25" +[#433]:https://github.com/puma/puma/pull/433 "PR by @alepore, merged 2014-02-28" +[#437]:https://github.com/puma/puma/pull/437 "PR by @ibrahima, merged 2014-01-25" +[#446]:https://github.com/puma/puma/pull/446 "PR by @sudara, merged 2014-01-27" +[#451]:https://github.com/puma/puma/pull/451 "PR by @pwiebe, merged 2014-02-04" +[#453]:https://github.com/puma/puma/pull/453 "PR by @joevandyk, merged 2014-02-28" +[#470]:https://github.com/puma/puma/pull/470 "PR by @arthurnn, merged 2014-02-28" +[#472]:https://github.com/puma/puma/pull/472 "PR by @rubencaro, merged 2014-02-21" +[#480]:https://github.com/puma/puma/pull/480 "PR by @jjb, merged 2014-02-26" +[#481]:https://github.com/puma/puma/pull/481 "PR by @schneems, merged 2014-02-25" +[#482]:https://github.com/puma/puma/pull/482 "PR by @prathamesh-sonpatki, merged 2014-02-26" +[#483]:https://github.com/puma/puma/pull/483 "PR by @maxilev, merged 2014-02-26" +[#422]:https://github.com/puma/puma/issues/422 "Issue by @alexandru-calinoiu, closed 2013-12-05" +[#334]:https://github.com/puma/puma/issues/334 "Issue by @srgpqt, closed 2013-07-18" +[#179]:https://github.com/puma/puma/issues/179 "Issue by @betelgeuse, closed 2013-07-18" +[#332]:https://github.com/puma/puma/issues/332 "Issue by @SamSaffron, closed 2013-07-18" +[#317]:https://github.com/puma/puma/issues/317 "Issue by @masterkain, closed 2013-07-11" +[#309]:https://github.com/puma/puma/issues/309 "Issue by @masterkain, closed 2013-07-09" +[#166]:https://github.com/puma/puma/issues/166 "Issue by @emassip, closed 2013-07-06" +[#292]:https://github.com/puma/puma/issues/292 "Issue by @pulse00, closed 2013-07-06" +[#274]:https://github.com/puma/puma/issues/274 "Issue by @mrbrdo, closed 2013-07-06" +[#304]:https://github.com/puma/puma/issues/304 "Issue by @nandosola, closed 2013-07-06" +[#287]:https://github.com/puma/puma/issues/287 "Issue by @runlevel5, closed 2013-07-06" +[#256]:https://github.com/puma/puma/issues/256 "Issue by @rkh, closed 2013-07-01" +[#285]:https://github.com/puma/puma/issues/285 "Issue by @mkwiatkowski, closed 2013-06-20" +[#270]:https://github.com/puma/puma/issues/270 "Issue by @iamroody, closed 2013-06-01" +[#246]:https://github.com/puma/puma/issues/246 "Issue by @amencarini, closed 2013-06-01" +[#278]:https://github.com/puma/puma/issues/278 "Issue by @titanous, closed 2013-06-18" +[#251]:https://github.com/puma/puma/issues/251 "Issue by @cure, closed 2013-06-18" +[#252]:https://github.com/puma/puma/issues/252 "Issue by @vixns, closed 2013-06-01" +[#234]:https://github.com/puma/puma/issues/234 "Issue by @jgarber, closed 2013-04-08" +[#228]:https://github.com/puma/puma/issues/228 "Issue by @joelmats, closed 2013-04-29" +[#192]:https://github.com/puma/puma/issues/192 "Issue by @steverandy, closed 2013-02-09" +[#206]:https://github.com/puma/puma/issues/206 "Issue by @moll, closed 2013-03-19" +[#154]:https://github.com/puma/puma/issues/154 "Issue by @trevor, closed 2013-03-19" +[#208]:https://github.com/puma/puma/issues/208 "Issue by @ochronus, closed 2013-03-18" +[#189]:https://github.com/puma/puma/issues/189 "Issue by @tolot27, closed 2013-02-09" +[#185]:https://github.com/puma/puma/issues/185 "Issue by @nicolai86, closed 2013-02-06" +[#182]:https://github.com/puma/puma/issues/182 "Issue by @sriedel, closed 2013-02-05" +[#183]:https://github.com/puma/puma/issues/183 "Issue by @concept47, closed 2013-02-05" +[#176]:https://github.com/puma/puma/issues/176 "Issue by @cryo28, closed 2013-02-05" +[#180]:https://github.com/puma/puma/issues/180 "Issue by @tscolari, closed 2013-02-05" +[#170]:https://github.com/puma/puma/issues/170 "Issue by @nixme, closed 2012-11-29" +[#148]:https://github.com/puma/puma/issues/148 "Issue by @rafaelss, closed 2012-11-18" +[#128]:https://github.com/puma/puma/issues/128 "Issue by @fbjork, closed 2012-10-20" +[#155]:https://github.com/puma/puma/issues/155 "Issue by @ehlertij, closed 2012-10-13" +[#123]:https://github.com/puma/puma/pull/123 "PR by @jcoene, closed 2012-07-19" +[#111]:https://github.com/puma/puma/pull/111 "PR by @kenkeiter, closed 2012-07-19" +[#98]:https://github.com/puma/puma/pull/98 "PR by @Flink, closed 2012-05-15" +[#94]:https://github.com/puma/puma/issues/94 "Issue by @ender672, closed 2012-05-08" +[#84]:https://github.com/puma/puma/issues/84 "Issue by @sigursoft, closed 2012-04-29" +[#78]:https://github.com/puma/puma/issues/78 "Issue by @dstrelau, closed 2012-04-28" +[#79]:https://github.com/puma/puma/issues/79 "Issue by @jammi, closed 2012-04-28" +[#65]:https://github.com/puma/puma/issues/65 "Issue by @bporterfield, closed 2012-04-11" +[#54]:https://github.com/puma/puma/issues/54 "Issue by @masterkain, closed 2012-04-10" +[#58]:https://github.com/puma/puma/pull/58 "PR by @paneq, closed 2012-04-10" +[#61]:https://github.com/puma/puma/issues/61 "Issue by @dustalov, closed 2012-04-10" +[#63]:https://github.com/puma/puma/issues/63 "Issue by @seamusabshere, closed 2012-04-11" +[#60]:https://github.com/puma/puma/issues/60 "Issue by @paneq, closed 2012-04-11" +[#53]:https://github.com/puma/puma/pull/53 "PR by @sxua, closed 2012-04-11" diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/LICENSE b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/LICENSE new file mode 100644 index 0000000..14bfc85 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2019, Evan Phoenix. Some code by Zed Shaw, (c) 2005. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/README.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/README.md new file mode 100644 index 0000000..f3659dc --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/README.md @@ -0,0 +1,485 @@ +

+ +

+ +# Puma: A Ruby Web Server Built For Parallelism + +[![Actions](https://github.com/puma/puma/actions/workflows/tests.yml/badge.svg?branch=master)](https://github.com/puma/puma/actions/workflows/tests.yml?query=branch%3Amaster) +[![Code Climate](https://codeclimate.com/github/puma/puma.svg)](https://codeclimate.com/github/puma/puma) +[![StackOverflow](https://img.shields.io/badge/stackoverflow-Puma-blue.svg)]( https://stackoverflow.com/questions/tagged/puma ) + +Puma is a **simple, fast, multi-threaded, and highly parallel HTTP 1.1 server for Ruby/Rack applications**. + +## Built For Speed & Parallelism + +Puma is a server for [Rack](https://github.com/rack/rack)-powered HTTP applications written in Ruby. It is: +* **Multi-threaded**. Each request is served in a separate thread. This helps you serve more requests per second with less memory use. +* **Multi-process**. "Pre-forks" in cluster mode, using less memory per-process thanks to copy-on-write memory. +* **Standalone**. With SSL support, zero-downtime rolling restarts and a built-in request bufferer, you can deploy Puma without any reverse proxy. +* **Battle-tested**. Our HTTP parser is inherited from Mongrel and has over 15 years of production use. Puma is currently the most popular Ruby webserver, and is the default server for Ruby on Rails. + +Originally designed as a server for [Rubinius](https://github.com/rubinius/rubinius), Puma also works well with Ruby (MRI) and JRuby. + +On MRI, there is a Global VM Lock (GVL) that ensures only one thread can run Ruby code at a time. But if you're doing a lot of blocking IO (such as HTTP calls to external APIs like Twitter), Puma still improves MRI's throughput by allowing IO waiting to be done in parallel. Truly parallel Ruby implementations (TruffleRuby, JRuby) don't have this limitation. + +## Quick Start + +``` +$ gem install puma +$ puma +``` + +Without arguments, puma will look for a rackup (.ru) file in +working directory called `config.ru`. + +## SSL Connection Support + +Puma will install/compile with support for ssl sockets, assuming OpenSSL +development files are installed on the system. + +If the system does not have OpenSSL development files installed, Puma will +install/compile, but it will not allow ssl connections. + +## Frameworks + +### Rails + +Puma is the default server for Rails, included in the generated Gemfile. + +Start your server with the `rails` command: + +``` +$ rails server +``` + +Many configuration options and Puma features are not available when using `rails server`. It is recommended that you use Puma's executable instead: + +``` +$ bundle exec puma +``` + +### Sinatra + +You can run your Sinatra application with Puma from the command line like this: + +``` +$ ruby app.rb -s Puma +``` + +In order to actually configure Puma using a config file, like `puma.rb`, however, you need to use the `puma` executable. To do this, you must add a rackup file to your Sinatra app: + +```ruby +# config.ru +require './app' +run Sinatra::Application +``` + +You can then start your application using: + +``` +$ bundle exec puma +``` + +## Configuration + +Puma provides numerous options. Consult `puma -h` (or `puma --help`) for a full list of CLI options, or see `Puma::DSL` or [dsl.rb](https://github.com/puma/puma/blob/master/lib/puma/dsl.rb). + +You can also find several configuration examples as part of the +[test](https://github.com/puma/puma/tree/master/test/config) suite. + +For debugging purposes, you can set the environment variable `PUMA_LOG_CONFIG` with a value +and the loaded configuration will be printed as part of the boot process. + +### Thread Pool + +Puma uses a thread pool. You can set the minimum and maximum number of threads that are available in the pool with the `-t` (or `--threads`) flag: + +``` +$ puma -t 8:32 +``` + +Puma will automatically scale the number of threads, from the minimum until it caps out at the maximum, based on how much traffic is present. The current default is `0:16` and on MRI is `0:5`. Feel free to experiment, but be careful not to set the number of maximum threads to a large number, as you may exhaust resources on the system (or cause contention for the Global VM Lock, when using MRI). + +Be aware that additionally Puma creates threads on its own for internal purposes (e.g. handling slow clients). So, even if you specify -t 1:1, expect around 7 threads created in your application. + +### Cluster mode + +Puma also offers "cluster mode". Cluster mode `fork`s workers from a master process. Each child process still has its own thread pool. You can tune the number of workers with the `-w` (or `--workers`) flag: + +``` +$ puma -t 8:32 -w 3 +``` + +Or with the `WEB_CONCURRENCY` environment variable: + +``` +$ WEB_CONCURRENCY=3 puma -t 8:32 +``` + +Note that threads are still used in cluster mode, and the `-t` thread flag setting is per worker, so `-w 2 -t 16:16` will spawn 32 threads in total, with 16 in each worker process. + +If the `WEB_CONCURRENCY` environment variable is set to `"auto"` and the `concurrent-ruby` gem is available in your application, Puma will set the worker process count to the result of [available processors](https://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent.html#available_processor_count-class_method). + +For an in-depth discussion of the tradeoffs of thread and process count settings, [see our docs](https://github.com/puma/puma/blob/9282a8efa5a0c48e39c60d22ca70051a25df9f55/docs/kubernetes.md#workers-per-pod-and-other-config-issues). + +In cluster mode, Puma can "preload" your application. This loads all the application code *prior* to forking. Preloading reduces total memory usage of your application via an operating system feature called [copy-on-write](https://en.wikipedia.org/wiki/Copy-on-write). + +If the `WEB_CONCURRENCY` environment variable is set to a value > 1 (and `--prune-bundler` has not been specified), preloading will be enabled by default. Otherwise, you can use the `--preload` flag from the command line: + +``` +$ puma -w 3 --preload +``` + +Or, if you're using a configuration file, you can use the `preload_app!` method: + +```ruby +# config/puma.rb +workers 3 +preload_app! +``` + +Preloading can’t be used with phased restart, since phased restart kills and restarts workers one-by-one, and preloading copies the code of master into the workers. + +#### Cluster mode hooks + +When using cluster mode, Puma's configuration DSL provides `before_fork` and `on_worker_boot` +hooks to run code when the master process forks and child workers are booted respectively. + +It is recommended to use these hooks with `preload_app!`, otherwise constants loaded by your +application (such as `Rails`) will not be available inside the hooks. + +```ruby +# config/puma.rb +before_fork do + # Add code to run inside the Puma master process before it forks a worker child. +end + +on_worker_boot do + # Add code to run inside the Puma worker process after forking. +end +``` + +In addition, there is an `on_refork` and `after_refork` hooks which are used only in [`fork_worker` mode](docs/fork_worker.md), +when the worker 0 child process forks a grandchild worker: + +```ruby +on_refork do + # Used only when fork_worker mode is enabled. Add code to run inside the Puma worker 0 + # child process before it forks a grandchild worker. +end +``` + +```ruby +after_refork do + # Used only when fork_worker mode is enabled. Add code to run inside the Puma worker 0 + # child process after it forks a grandchild worker. +end +``` + +Importantly, note the following considerations when Ruby forks a child process: + +1. File descriptors such as network sockets **are** copied from the parent to the forked + child process. Dual-use of the same sockets by parent and child will result in I/O conflicts + such as `SocketError`, `Errno::EPIPE`, and `EOFError`. +2. Background Ruby threads, including threads used by various third-party gems for connection + monitoring, etc., are **not** copied to the child process. Often this does not cause + immediate problems until a third-party connection goes down, at which point there will + be no supervisor to reconnect it. + +Therefore, we recommend the following: + +1. If possible, do not establish any socket connections (HTTP, database connections, etc.) + inside Puma's master process when booting. +2. If (1) is not possible, use `before_fork` and `on_refork` to disconnect the parent's socket + connections when forking, so that they are not accidentally copied to the child process. +3. Use `on_worker_boot` to restart any background threads on the forked child. +4. Use `after_refork` to restart any background threads on the parent. + +#### Master process lifecycle hooks + +Puma's configuration DSL provides master process lifecycle hooks `on_booted`, `on_restart`, and `on_stopped` +which may be used to specify code blocks to run on each event: + +```ruby +# config/puma.rb +on_booted do + # Add code to run in the Puma master process after it boots, + # and also after a phased restart completes. +end + +on_restart do + # Add code to run in the Puma master process when it receives + # a restart command but before it restarts. +end + +on_stopped do + # Add code to run in the Puma master process when it receives + # a stop command but before it shuts down. +end +``` + +### Error handling + +If Puma encounters an error outside of the context of your application, it will respond with a 400/500 and a simple +textual error message (see `Puma::Server#lowlevel_error` or [server.rb](https://github.com/puma/puma/blob/master/lib/puma/server.rb)). +You can specify custom behavior for this scenario. For example, you can report the error to your third-party +error-tracking service (in this example, [rollbar](https://rollbar.com)): + +```ruby +lowlevel_error_handler do |e, env, status| + if status == 400 + message = "The server could not process the request due to an error, such as an incorrectly typed URL, malformed syntax, or a URL that contains illegal characters.\n" + else + message = "An error has occurred, and engineers have been informed. Please reload the page. If you continue to have problems, contact support@example.com\n" + Rollbar.critical(e) + end + + [status, {}, [message]] +end +``` + +### Binding TCP / Sockets + +Bind Puma to a socket with the `-b` (or `--bind`) flag: + +``` +$ puma -b tcp://127.0.0.1:9292 +``` + +To use a UNIX Socket instead of TCP: + +``` +$ puma -b unix:///var/run/puma.sock +``` + +If you need to change the permissions of the UNIX socket, just add a umask parameter: + +``` +$ puma -b 'unix:///var/run/puma.sock?umask=0111' +``` + +Need a bit of security? Use SSL sockets: + +``` +$ puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert' +``` +#### Self-signed SSL certificates (via the [`localhost`] gem, for development use): + +Puma supports the [`localhost`] gem for self-signed certificates. This is particularly useful if you want to use Puma with SSL locally, and self-signed certificates will work for your use-case. Currently, the integration can only be used in MRI. + +Puma automatically configures SSL when the [`localhost`] gem is loaded in a `development` environment: + +Add the gem to your Gemfile: +```ruby +group(:development) do + gem 'localhost' +end +``` + +And require it implicitly using bundler: +```ruby +require "bundler" +Bundler.require(:default, ENV["RACK_ENV"].to_sym) +``` + +Alternatively, you can require the gem in your configuration file, either `config/puma/development.rb`, `config/puma.rb`, or set via the `-C` cli option: +```ruby +require 'localhost' +# configuration methods (from Puma::DSL) as needed +``` + +Additionally, Puma must be listening to an SSL socket: + +```shell +$ puma -b 'ssl://localhost:9292' -C config/use_local_host.rb + +# The following options allow you to reach Puma over HTTP as well: +$ puma -b ssl://localhost:9292 -b tcp://localhost:9393 -C config/use_local_host.rb +``` + +[`localhost`]: https://github.com/socketry/localhost + +#### Controlling SSL Cipher Suites + +To use or avoid specific SSL ciphers for TLSv1.2 and below, use `ssl_cipher_filter` or `ssl_cipher_list` options. + +##### Ruby: + +``` +$ puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert&ssl_cipher_filter=!aNULL:AES+SHA' +``` + +##### JRuby: + +``` +$ puma -b 'ssl://127.0.0.1:9292?keystore=path_to_keystore&keystore-pass=keystore_password&ssl_cipher_list=TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA' +``` + +To configure the available TLSv1.3 ciphersuites, use `ssl_ciphersuites` option (not available for JRuby). + +##### Ruby: + +``` +$ puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert&ssl_ciphersuites=TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256' +``` + +See https://www.openssl.org/docs/man1.1.1/man1/ciphers.html for cipher filter format and full list of cipher suites. + +Disable TLS v1 with the `no_tlsv1` option: + +``` +$ puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert&no_tlsv1=true' +``` + +#### Controlling OpenSSL Verification Flags + +To enable verification flags offered by OpenSSL, use `verification_flags` (not available for JRuby): + +``` +$ puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert&verification_flags=PARTIAL_CHAIN' +``` + +You can also set multiple verification flags (by separating them with a comma): + +``` +$ puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert&verification_flags=PARTIAL_CHAIN,CRL_CHECK' +``` + +List of available flags: `USE_CHECK_TIME`, `CRL_CHECK`, `CRL_CHECK_ALL`, `IGNORE_CRITICAL`, `X509_STRICT`, `ALLOW_PROXY_CERTS`, `POLICY_CHECK`, `EXPLICIT_POLICY`, `INHIBIT_ANY`, `INHIBIT_MAP`, `NOTIFY_POLICY`, `EXTENDED_CRL_SUPPORT`, `USE_DELTAS`, `CHECK_SS_SIGNATURE`, `TRUSTED_FIRST`, `SUITEB_128_LOS_ONLY`, `SUITEB_192_LOS`, `SUITEB_128_LOS`, `PARTIAL_CHAIN`, `NO_ALT_CHAINS`, `NO_CHECK_TIME` +(see https://www.openssl.org/docs/manmaster/man3/X509_VERIFY_PARAM_set_hostflags.html#VERIFICATION-FLAGS). + +#### Controlling OpenSSL Password Decryption + +To enable runtime decryption of an encrypted SSL key (not available for JRuby), use `key_password_command`: + +``` +$ puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert&key_password_command=/path/to/command.sh' +``` + +`key_password_command` must: + +1. Be executable by Puma. +2. Print the decryption password to stdout. + + For example: + +```shell +#!/bin/sh + +echo "this is my password" +``` + +`key_password_command` can be used with `key` or `key_pem`. If the key +is not encrypted, the executable will not be called. + +### Control/Status Server + +Puma has a built-in status and control app that can be used to query and control Puma. + +``` +$ puma --control-url tcp://127.0.0.1:9293 --control-token foo +``` + +Puma will start the control server on localhost port 9293. All requests to the control server will need to include control token (in this case, `token=foo`) as a query parameter. This allows for simple authentication. Check out `Puma::App::Status` or [status.rb](https://github.com/puma/puma/blob/master/lib/puma/app/status.rb) to see what the status app has available. + +You can also interact with the control server via `pumactl`. This command will restart Puma: + +``` +$ pumactl --control-url 'tcp://127.0.0.1:9293' --control-token foo restart +``` + +To see a list of `pumactl` options, use `pumactl --help`. + +### Configuration File + +You can also provide a configuration file with the `-C` (or `--config`) flag: + +``` +$ puma -C /path/to/config +``` + +If no configuration file is specified, Puma will look for a configuration file at `config/puma.rb`. If an environment is specified (via the `--environment` flag or through the `APP_ENV`, `RACK_ENV`, or `RAILS_ENV` environment variables) Puma looks for a configuration file at `config/puma/.rb` and then falls back to `config/puma.rb`. + +If you want to prevent Puma from looking for a configuration file in those locations, include the `--no-config` flag: + +``` +$ puma --no-config + +# or + +$ puma -C "-" +``` + +The other side-effects of setting the environment are whether to show stack traces (in `development` or `test`), and setting RACK_ENV may potentially affect middleware looking for this value to change their behavior. The default puma RACK_ENV value is `development`. You can see all config default values in `Puma::Configuration#puma_default_options` or [configuration.rb](https://github.com/puma/puma/blob/61c6213fbab/lib/puma/configuration.rb#L182-L204). + +Check out `Puma::DSL` or [dsl.rb](https://github.com/puma/puma/blob/master/lib/puma/dsl.rb) to see all available options. + +## Restart + +Puma includes the ability to restart itself. When available (MRI, Rubinius, JRuby), Puma performs a "hot restart". This is the same functionality available in *Unicorn* and *NGINX* which keep the server sockets open between restarts. This makes sure that no pending requests are dropped while the restart is taking place. + +For more, see the [Restart documentation](docs/restart.md). + +## Signals + +Puma responds to several signals. A detailed guide to using UNIX signals with Puma can be found in the [Signals documentation](docs/signals.md). + +## Platform Constraints + +Some platforms do not support all Puma features. + + * **JRuby**, **Windows**: server sockets are not seamless on restart, they must be closed and reopened. These platforms have no way to pass descriptors into a new process that is exposed to Ruby. Also, cluster mode is not supported due to a lack of fork(2). + * **Windows**: Cluster mode is not supported due to a lack of fork(2). + * **Kubernetes**: The way Kubernetes handles pod shutdowns interacts poorly with server processes implementing graceful shutdown, like Puma. See the [kubernetes section of the documentation](docs/kubernetes.md) for more details. + +## Known Bugs + +For MRI versions 2.2.7, 2.2.8, 2.2.9, 2.2.10, 2.3.4 and 2.4.1, you may see ```stream closed in another thread (IOError)```. It may be caused by a [Ruby bug](https://bugs.ruby-lang.org/issues/13632). It can be fixed with the gem https://rubygems.org/gems/stopgap_13632: + +```ruby +if %w(2.2.7 2.2.8 2.2.9 2.2.10 2.3.4 2.4.1).include? RUBY_VERSION + begin + require 'stopgap_13632' + rescue LoadError + end +end +``` + +## Deployment + + * Puma has support for Capistrano with an [external gem](https://github.com/seuros/capistrano-puma). + + * Additionally, Puma has support for built-in daemonization via the [puma-daemon](https://github.com/kigster/puma-daemon) ruby gem. The gem restores the `daemonize` option that was removed from Puma starting version 5, but only for MRI Ruby. + + +It is common to use process monitors with Puma. Modern process monitors like systemd or rc.d +provide continuous monitoring and restarts for increased reliability in production environments: + +* [rc.d](docs/jungle/rc.d/README.md) +* [systemd](docs/systemd.md) + +Community guides: + +* [Deploying Puma on OpenBSD using relayd and httpd](https://gist.github.com/anon987654321/4532cf8d6c59c1f43ec8973faa031103) + +## Community Extensions + +### Plugins + +* [puma-metrics](https://github.com/harmjanblok/puma-metrics) — export Puma metrics to Prometheus +* [puma-plugin-statsd](https://github.com/yob/puma-plugin-statsd) — send Puma metrics to statsd +* [puma-plugin-systemd](https://github.com/sj26/puma-plugin-systemd) — deeper integration with systemd for notify, status and watchdog. Puma 5.1.0 integrated notify and watchdog, which probably conflicts with this plugin. Puma 6.1.0 added status support which obsoletes the plugin entirely. +* [puma-plugin-telemetry](https://github.com/babbel/puma-plugin-telemetry) - telemetry plugin for Puma offering various targets to publish +* [puma-acme](https://github.com/anchordotdev/puma-acme) - automatic SSL/HTTPS certificate provisioning and setup + +### Monitoring + +* [puma-status](https://github.com/ylecuyer/puma-status) — Monitor CPU/Mem/Load of running puma instances from the CLI + +## Contributing + +Find details for contributing in the [contribution guide](CONTRIBUTING.md). + +## License + +Puma is copyright Evan Phoenix and contributors, licensed under the BSD 3-Clause license. See the included LICENSE file for details. diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/puma b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/puma new file mode 100755 index 0000000..9c67c0f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/puma @@ -0,0 +1,10 @@ +#!/usr/bin/env ruby +# +# Copyright (c) 2011 Evan Phoenix +# + +require 'puma/cli' + +cli = Puma::CLI.new ARGV + +cli.run diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/puma-wild b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/puma-wild new file mode 100644 index 0000000..3701b21 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/puma-wild @@ -0,0 +1,25 @@ +#!/usr/bin/env ruby +# +# Copyright (c) 2014 Evan Phoenix +# + +require 'rubygems' + +cli_arg = ARGV.shift + +inc = "" + +if cli_arg == "-I" + inc = ARGV.shift + $LOAD_PATH.concat inc.split(":") +end + +module Puma; end + +Puma.const_set(:WILD_ARGS, ["-I", inc]) + +require 'puma/cli' + +cli = Puma::CLI.new ARGV + +cli.run diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/pumactl b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/pumactl new file mode 100755 index 0000000..51ab353 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/pumactl @@ -0,0 +1,12 @@ +#!/usr/bin/env ruby + +require 'puma/control_cli' + +cli = Puma::ControlCLI.new ARGV.dup + +begin + cli.run +rescue => e + STDERR.puts e.message + exit 1 +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/architecture.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/architecture.md new file mode 100644 index 0000000..83f438b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/architecture.md @@ -0,0 +1,74 @@ +# Architecture + +## Overview + +![https://bit.ly/2iJuFky](images/puma-general-arch.png) + +Puma is a threaded Ruby HTTP application server processing requests across a TCP +and/or UNIX socket. + + +Puma processes (there can be one or many) accept connections from the socket via +a thread (in the [`Reactor`](../lib/puma/reactor.rb) class). The connection, +once fully buffered and read, moves into the `todo` list, where an available +thread will pick it up (in the [`ThreadPool`](../lib/puma/thread_pool.rb) +class). + +Puma works in two main modes: cluster and single. In single mode, only one Puma +process boots. In cluster mode, a `master` process is booted, which prepares +(and may boot) the application and then uses the `fork()` system call to create +one or more `child` processes. These `child` processes all listen to the same +socket. The `master` process does not listen to the socket or process requests - +its purpose is primarily to manage and listen for UNIX signals and possibly kill +or boot `child` processes. + +We sometimes call `child` processes (or Puma processes in `single` mode) +_workers_, and we sometimes call the threads created by Puma's +[`ThreadPool`](../lib/puma/thread_pool.rb) _worker threads_. + +## How Requests Work + +![https://bit.ly/2zwzhEK](images/puma-connection-flow.png) + +* Upon startup, Puma listens on a TCP or UNIX socket. + * The backlog of this socket is configured with a default of 1024, but the + actual backlog value is capped by the `net.core.somaxconn` sysctl value. + The backlog determines the size of the queue for unaccepted connections. If + the backlog is full, the operating system is not accepting new connections. + * This socket backlog is distinct from the `backlog` of work as reported by + `Puma.stats` or the control server. The backlog that `Puma.stats` refers to + represents the number of connections in the process' `todo` set waiting for + a thread from the [`ThreadPool`](../lib/puma/thread_pool.rb). +* By default, a single, separate thread (created by the + [`Reactor`](../lib/puma/reactor.rb) class) reads and buffers requests from the + socket. + * When at least one worker thread is available for work, the reactor thread + listens to the socket and accepts a request (if one is waiting). + * The reactor thread waits for the entire HTTP request to be received. + * Puma exposes the time spent waiting for the HTTP request body to be + received to the Rack app as `env['puma.request_body_wait']` + (milliseconds). + * Once fully buffered and received, the connection is pushed into the "todo" + set. +* Worker threads pop work off the "todo" set for processing. + * The worker thread processes the request via `call`ing the configured Rack + application. The Rack application generates the HTTP response. + * The worker thread writes the response to the connection. While Puma buffers + requests via a separate thread, it does not use a separate thread for + responses. + * Once done, the thread becomes available to process another connection in the + "todo" set. + +### `queue_requests` + +![https://bit.ly/2zxCJ1Z](images/puma-connection-flow-no-reactor.png) + +The `queue_requests` option is `true` by default, enabling the separate reactor +thread used to buffer requests as described above. + +If set to `false`, this buffer will not be used for connections while waiting +for the request to arrive. + +In this mode, when a connection is accepted, it is added to the "todo" queue +immediately, and a worker will synchronously do any waiting necessary to read +the HTTP request from the socket. diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/compile_options.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/compile_options.md new file mode 100644 index 0000000..4b4f9f9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/compile_options.md @@ -0,0 +1,55 @@ +# Compile Options + +There are some `cflags` provided to change Puma's default configuration for its +C extension. + +## Query String, `PUMA_QUERY_STRING_MAX_LENGTH` + +By default, the max length of `QUERY_STRING` is `1024 * 10`. But you may want to +adjust it to accept longer queries in GET requests. + +For manual install, pass the `PUMA_QUERY_STRING_MAX_LENGTH` option like this: + +``` +gem install puma -- --with-cflags="-D PUMA_QUERY_STRING_MAX_LENGTH=64000" +``` + +For Bundler, use its configuration system: + +``` +bundle config build.puma "--with-cflags='-D PUMA_QUERY_STRING_MAX_LENGTH=64000'" +``` + +## Request Path, `PUMA_REQUEST_PATH_MAX_LENGTH` + +By default, the max length of `REQUEST_PATH` is `8192`. But you may want to +adjust it to accept longer paths in requests. + +For manual install, pass the `PUMA_REQUEST_PATH_MAX_LENGTH` option like this: + +``` +gem install puma -- --with-cflags="-D PUMA_REQUEST_PATH_MAX_LENGTH=64000" +``` + +For Bundler, use its configuration system: + +``` +bundle config build.puma "--with-cflags='-D PUMA_REQUEST_PATH_MAX_LENGTH=64000'" +``` + +## Request URI, `PUMA_REQUEST_URI_MAX_LENGTH` + +By default, the max length of `REQUEST_URI` is `1024 * 12`. But you may want to +adjust it to accept longer URIs in requests. + +For manual install, pass the `PUMA_REQUEST_URI_MAX_LENGTH` option like this: + +``` +gem install puma -- --with-cflags="-D PUMA_REQUEST_URI_MAX_LENGTH=64000" +``` + +For Bundler, use its configuration system: + +``` +bundle config build.puma "--with-cflags='-D PUMA_REQUEST_URI_MAX_LENGTH=64000'" +``` diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/deployment.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/deployment.md new file mode 100644 index 0000000..2364aa6 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/deployment.md @@ -0,0 +1,102 @@ +# Deployment engineering for Puma + +Puma expects to be run in a deployed environment eventually. You can use it as +your development server, but most people use it in their production deployments. + +To that end, this document serves as a foundation of wisdom regarding deploying +Puma to production while increasing happiness and decreasing downtime. + +## Specifying Puma + +Most people will specify Puma by including `gem "puma"` in a Gemfile, so we'll +assume this is how you're using Puma. + +## Single vs. Cluster mode + +Initially, Puma was conceived as a thread-only web server, but support for +processes was added in version 2. + +To run `puma` in single mode (i.e., as a development environment), set the +number of workers to 0; anything higher will run in cluster mode. + +Here are some tips for cluster mode: + +### MRI + +* Use cluster mode and set the number of workers to 1.5x the number of CPU cores + in the machine, starting from a minimum of 2. +* Set the number of threads to desired concurrent requests/number of workers. + Puma defaults to 5, and that's a decent number. + +#### Migrating from Unicorn + +* If you're migrating from unicorn though, here are some settings to start with: + * Set workers to half the number of unicorn workers you're using + * Set threads to 2 + * Enjoy 50% memory savings +* As you grow more confident in the thread-safety of your app, you can tune the + workers down and the threads up. + +#### Ubuntu / Systemd (Systemctl) Installation + +See [systemd.md](systemd.md) + +#### Worker utilization + +**How do you know if you've got enough (or too many workers)?** + +A good question. Due to MRI's GIL, only one thread can be executing Ruby code at +a time. But since so many apps are waiting on IO from DBs, etc., they can +utilize threads to use the process more efficiently. + +Generally, you never want processes that are pegged all the time. That can mean +there is more work to do than the process can get through. On the other hand, if +you have processes that sit around doing nothing, then they're just eating up +resources. + +Watch your CPU utilization over time and aim for about 70% on average. 70% +utilization means you've got capacity still but aren't starving threads. + +**Measuring utilization** + +Using a timestamp header from an upstream proxy server (e.g., `nginx` or +`haproxy`) makes it possible to indicate how long requests have been waiting for +a Puma thread to become available. + +* Have your upstream proxy set a header with the time it received the request: + * nginx: `proxy_set_header X-Request-Start "${msec}";` + * haproxy >= 1.9: `http-request set-header X-Request-Start + t=%[date()]%[date_us()]` + * haproxy < 1.9: `http-request set-header X-Request-Start t=%[date()]` +* In your Rack middleware, determine the amount of time elapsed since + `X-Request-Start`. +* To improve accuracy, you will want to subtract time spent waiting for slow + clients: + * `env['puma.request_body_wait']` contains the number of milliseconds Puma + spent waiting for the client to send the request body. + * haproxy: `%Th` (TLS handshake time) and `%Ti` (idle time before request) + can can also be added as headers. + +## Should I daemonize? + +The Puma 5.0 release removed daemonization. For older versions and alternatives, +continue reading. + +I prefer not to daemonize my servers and use something like `runit` or `systemd` +to monitor them as child processes. This gives them fast response to crashes and +makes it easy to figure out what is going on. Additionally, unlike `unicorn`, +Puma does not require daemonization to do zero-downtime restarts. + +I see people using daemonization because they start puma directly via Capistrano +task and thus want it to live on past the `cap deploy`. To these people, I say: +You need to be using a process monitor. Nothing is making sure Puma stays up in +this scenario! You're just waiting for something weird to happen, Puma to die, +and to get paged at 3 AM. Do yourself a favor, at least the process monitoring +your OS comes with, be it `sysvinit` or `systemd`. Or branch out and use `runit` +or hell, even `monit`. + +## Restarting + +You probably will want to deploy some new code at some point, and you'd like +Puma to start running that new code. There are a few options for restarting +Puma, described separately in our [restart documentation](restart.md). diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/fork_worker.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/fork_worker.md new file mode 100644 index 0000000..6e12ab3 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/fork_worker.md @@ -0,0 +1,41 @@ +# Fork-Worker Cluster Mode [Experimental] + +Puma 5 introduces an experimental new cluster-mode configuration option, `fork_worker` (`--fork-worker` from the CLI). This mode causes Puma to fork additional workers from worker 0, instead of directly from the master process: + +``` +10000 \_ puma 4.3.3 (tcp://0.0.0.0:9292) [puma] +10001 \_ puma: cluster worker 0: 10000 [puma] +10002 \_ puma: cluster worker 1: 10000 [puma] +10003 \_ puma: cluster worker 2: 10000 [puma] +10004 \_ puma: cluster worker 3: 10000 [puma] +``` + +The `fork_worker` option allows your application to be initialized only once for copy-on-write memory savings, and it has two additional advantages: + +1. **Compatible with phased restart.** Because the master process itself doesn't preload the application, this mode works with phased restart (`SIGUSR1` or `pumactl phased-restart`). When worker 0 reloads as part of a phased restart, it initializes a new copy of your application first, then the other workers reload by forking from this new worker already containing the new preloaded application. + + This allows a phased restart to complete as quickly as a hot restart (`SIGUSR2` or `pumactl restart`), while still minimizing downtime by staggering the restart across cluster workers. + +2. **'Refork' for additional copy-on-write improvements in running applications.** Fork-worker mode introduces a new `refork` command that re-loads all nonzero workers by re-forking them from worker 0. + + This command can potentially improve memory utilization in large or complex applications that don't fully pre-initialize on startup, because the re-forked workers can share copy-on-write memory with a worker that has been running for a while and serving requests. + + You can trigger a refork by sending the cluster the `SIGURG` signal or running the `pumactl refork` command at any time. A refork will also automatically trigger once, after a certain number of requests have been processed by worker 0 (default 1000). To configure the number of requests before the auto-refork, pass a positive integer argument to `fork_worker` (e.g., `fork_worker 1000`), or `0` to disable. + +### Usage Considerations + +- `fork_worker` introduces new `on_refork` and `after_refork` configuration hooks. Note the following: + - When initially forking the parent process to the worker 0 child, `before_fork` will trigger on the parent process and `on_worker_boot` will trigger on the worker 0 child as normal. + - When forking the worker 0 child to grandchild workers, `on_refork` and `after_refork` will trigger on the worker 0 child, and `on_worker_boot` will trigger on each grandchild worker. + - For clarity, `before_fork` does not trigger on worker 0, and `after_refork` does not trigger on the grandchild. +- As a general migration guide: + - Copy any logic within your existing `before_fork` hook to the `on_refork` hook. + - Consider to copy logic from your `on_worker_boot` hook to the `after_refork` hook, if it is needed to reset the state of worker 0 after it forks. + +### Limitations + +- This mode is still very experimental so there may be bugs or edge-cases, particularly around expected behavior of existing hooks. Please open a [bug report](https://github.com/puma/puma/issues/new?template=bug_report.md) if you encounter any issues. + +- In order to fork new workers cleanly, worker 0 shuts down its server and stops serving requests so there are no open file descriptors or other kinds of shared global state between processes, and to maximize copy-on-write efficiency across the newly-forked workers. This may temporarily reduce total capacity of the cluster during a phased restart / refork. + +- In a cluster with `n` workers, a normal phased restart stops and restarts workers one by one while the application is loaded in each process, so `n-1` workers are available serving requests during the restart. In a phased restart in fork-worker mode, the application is first loaded in worker 0 while `n-1` workers are available, then worker 0 remains stopped while the rest of the workers are reloaded one by one, leaving only `n-2` workers to be available for a brief period of time. Reloading the rest of the workers should be quick because the application is preloaded at that point, but there may be situations where it can take longer (slow clients, long-running application code, slow worker-fork hooks, etc). diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/images/puma-connection-flow-no-reactor.png b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/images/puma-connection-flow-no-reactor.png new file mode 100644 index 0000000000000000000000000000000000000000..05ef8d01fef4050f14713f4276441b285191300d GIT binary patch literal 16029 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 Ma%!^W(q;kw2Y`saQ2+n{ literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/java_options.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/java_options.md new file mode 100644 index 0000000..ba1cd8d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/java_options.md @@ -0,0 +1,54 @@ +# Java Options + +`System Properties` or `Environment Variables` can be used to change Puma's +default configuration for its Java extension. The provided values are evaluated +during initialization, and changes while running the app have no effect. +Moreover, default values may be used in case of invalid inputs. + +## Supported Options + +| ENV Name | Default Value | Validation | +|------------------------------|:-------------:|:------------------------:| +| PUMA_QUERY_STRING_MAX_LENGTH | 1024 * 10 | Positive natural number | +| PUMA_REQUEST_PATH_MAX_LENGTH | 8192 | Positive natural number | +| PUMA_REQUEST_URI_MAX_LENGTH | 1024 * 12 | Positive natural number | +| PUMA_SKIP_SIGUSR2 | nil | n/a | + +## Examples + +### Invalid inputs + +An empty string will be handled as missing, and the default value will be used instead. +Puma will print an error message for other invalid values. + +``` +foo@bar:~/puma$ PUMA_QUERY_STRING_MAX_LENGTH=abc PUMA_REQUEST_PATH_MAX_LENGTH='' PUMA_REQUEST_URI_MAX_LENGTH=0 bundle exec bin/puma test/rackup/hello.ru + +The value 0 for PUMA_REQUEST_URI_MAX_LENGTH is invalid. Using default value 12288 instead. +The value abc for PUMA_QUERY_STRING_MAX_LENGTH is invalid. Using default value 10240 instead. +Puma starting in single mode... +``` + +### Valid inputs + +``` +foo@bar:~/puma$ PUMA_REQUEST_PATH_MAX_LENGTH=9 bundle exec bin/puma test/rackup/hello.ru + +Puma starting in single mode... +``` +``` +foo@bar:~ export path=/123456789 # 10 chars +foo@bar:~ curl "http://localhost:9292${path}" + +Puma caught this error: HTTP element REQUEST_PATH is longer than the 9 allowed length. (Puma::HttpParserError) + +foo@bar:~ export path=/12345678 # 9 chars +foo@bar:~ curl "http://localhost:9292${path}" +Hello World +``` + +### Java Flight Recorder Compatibility + +Unfortunately Java Flight Recorder uses `SIGUSR2` internally. If you wish to +use JFR, turn off Puma's trapping of `SIGUSR2` by setting the environment variable +`PUMA_SKIP_SIGUSR2` to any value. diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/README.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/README.md new file mode 100644 index 0000000..46713f9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/README.md @@ -0,0 +1,9 @@ +# Puma as a service + +## Systemd + +See [/docs/systemd](https://github.com/puma/puma/blob/master/docs/systemd.md). + +## rc.d + +See `/docs/jungle/rc.d` for FreeBSD's rc.d scripts diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/README.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/README.md new file mode 100644 index 0000000..2c5ddf5 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/README.md @@ -0,0 +1,74 @@ +# Puma as a service using rc.d + +Manage multiple Puma servers as services on one box using FreeBSD's rc.d service. + +## Dependencies + +* `jq` - a command-line json parser is needed to parse the json in the config file + +## Installation + + # Copy the puma script to the rc.d directory (make sure everyone has read/execute perms) + sudo cp puma /usr/local/etc/rc.d/ + + # Create an empty configuration file + sudo touch /usr/local/etc/puma.conf + + # Enable the puma service + sudo echo 'puma_enable="YES"' >> /etc/rc.conf + +## Managing the jungle + +Puma apps are referenced in /usr/local/etc/puma.conf by default. + +Start the jungle running: + +`service puma start` + +This script will run at boot time. + + +You can also stop the jungle (stops ALL puma instances) by running: + +`service puma stop` + + +To restart the jungle: + +`service puma restart` + +## Conventions + +* The script expects: + * a config file to exist under `config/puma.rb` in your app. E.g.: `/home/apps/my-app/config/puma.rb`. + +You can always change those defaults by editing the scripts. + +## Here's what a minimal app's config file should have + +``` +{ + "servers" : [ + { + "dir": "/path/to/rails/project", + "user": "deploy-user", + "ruby_version": "ruby.version", + "ruby_env": "rbenv" + } + ] +} +``` + +## Before starting... + +You need to customise `puma.conf` to: + +* Set the right user your app should be running on unless you want root to execute it! +* Set the directory of the app +* Set the ruby version to execute +* Set the ruby environment (currently set to rbenv, since that is the only ruby environment currently supported) +* Add additional server instances following the scheme in the example + +## Notes: + +Only rbenv is currently supported. diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/puma b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/puma new file mode 100755 index 0000000..e800223 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/puma @@ -0,0 +1,61 @@ +#!/bin/sh +# + +# PROVIDE: puma + +. /etc/rc.subr + +name="puma" +start_cmd="puma_start" +stop_cmd="puma_stop" +restart_cmd="puma_restart" +rcvar=puma_enable +required_files=/usr/local/etc/puma.conf + +puma_start() +{ + server_count=$(/usr/local/bin/jq ".servers[] .ruby_env" /usr/local/etc/puma.conf | wc -l) + i=0 + while [ "$i" -lt "$server_count" ]; do + rb_env=$(/usr/local/bin/jq -r ".servers[$i].ruby_env" /usr/local/etc/puma.conf) + dir=$(/usr/local/bin/jq -r ".servers[$i].dir" /usr/local/etc/puma.conf) + user=$(/usr/local/bin/jq -r ".servers[$i].user" /usr/local/etc/puma.conf) + rb_ver=$(/usr/local/bin/jq -r ".servers[$i].ruby_version" /usr/local/etc/puma.conf) + case $rb_env in + "rbenv") + cd $dir && rbenv shell $rb_ver && /usr/sbin/daemon -u $user bundle exec puma -C $dir/config/puma.rb + ;; + *) + ;; + esac + i=$(( i + 1 )) + done +} + +puma_stop() +{ + pkill ruby +} + +puma_restart() +{ + server_count=$(/usr/local/bin/jq ".servers[] .ruby_env" /usr/local/etc/puma.conf | wc -l) + i=0 + while [ "$i" -lt "$server_count" ]; do + rb_env=$(/usr/local/bin/jq -r ".servers[$i].ruby_env" /usr/local/etc/puma.conf) + dir=$(/usr/local/bin/jq -r ".servers[$i].dir" /usr/local/etc/puma.conf) + user=$(/usr/local/bin/jq -r ".servers[$i].user" /usr/local/etc/puma.conf) + rb_ver=$(/usr/local/bin/jq -r ".servers[$i].ruby_version" /usr/local/etc/puma.conf) + case $rb_env in + "rbenv") + cd $dir && rbenv shell $rb_ver && /usr/sbin/daemon -u $user bundle exec puma -C $dir/config/puma.rb + ;; + *) + ;; + esac + i=$(( i + 1 )) + done +} + +load_rc_config $name +run_rc_command "$1" diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/puma.conf b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/puma.conf new file mode 100644 index 0000000..600537a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/puma.conf @@ -0,0 +1,10 @@ +{ + "servers" : [ + { + "dir": "/path/to/rails/project", + "user": "deploy-user", + "ruby_version": "ruby.version", + "ruby_env": "rbenv" + } + ] +} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/kubernetes.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/kubernetes.md new file mode 100644 index 0000000..5c59a4d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/kubernetes.md @@ -0,0 +1,78 @@ +# Kubernetes + +## Running Puma in Kubernetes + +In general running Puma in Kubernetes works as-is, no special configuration is needed beyond what you would write anyway to get a new Kubernetes Deployment going. There is one known interaction between the way Kubernetes handles pod termination and how Puma handles `SIGINT`, where some request might be sent to Puma after it has already entered graceful shutdown mode and is no longer accepting requests. This can lead to dropped requests during rolling deploys. A workaround for this is listed at the end of this article. + +## Basic setup + +Assuming you already have a running cluster and docker image repository, you can run a simple Puma app with the following example Dockerfile and Deployment specification. These are meant as examples only and are deliberately very minimal to the point of skipping many options that are recommended for running in production, like healthchecks and envvar configuration with ConfigMaps. In general you should check the [Kubernetes documentation](https://kubernetes.io/docs/home/) and [Docker documentation](https://docs.docker.com/) for a more comprehensive overview of the available options. + +A basic Dockerfile example: +``` +FROM ruby:2.5.1-alpine # can be updated to newer ruby versions +RUN apk update && apk add build-base # and any other packages you need + +# Only rebuild gem bundle if Gemfile changes +COPY Gemfile Gemfile.lock ./ +RUN bundle install + +# Copy over the rest of the files +COPY . . + +# Open up port and start the service +EXPOSE 9292 +CMD bundle exec rackup -o 0.0.0.0 +``` + +A sample `deployment.yaml`: +``` +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-awesome-puma-app +spec: + selector: + matchLabels: + app: my-awesome-puma-app + template: + metadata: + labels: + app: my-awesome-puma-app + service: my-awesome-puma-app + spec: + containers: + - name: my-awesome-puma-app + image: + ports: + - containerPort: 9292 +``` + +## Graceful shutdown and pod termination + +For some high-throughput systems, it is possible that some HTTP requests will return responses with response codes in the 5XX range during a rolling deploy to a new version. This is caused by [the way that Kubernetes terminates a pod during rolling deploys](https://cloud.google.com/blog/products/gcp/kubernetes-best-practices-terminating-with-grace): + +1. The replication controller determines a pod should be shut down. +2. The Pod is set to the “Terminating” State and removed from the endpoints list of all Services, so that it receives no more requests. +3. The pods pre-stop hook get called. The default for this is to send `SIGTERM` to the process inside the pod. +4. The pod has up to `terminationGracePeriodSeconds` (default: 30 seconds) to gracefully shut down. Puma will do this (after it receives SIGTERM) by closing down the socket that accepts new requests and finishing any requests already running before exiting the Puma process. +5. If the pod is still running after `terminationGracePeriodSeconds` has elapsed, the pod receives `SIGKILL` to make sure the process inside it stops. After that, the container exits and all other Kubernetes objects associated with it are cleaned up. + +There is a subtle race condition between step 2 and 3: The replication controller does not synchronously remove the pod from the Services AND THEN call the pre-stop hook of the pod, but rather it asynchronously sends "remove this pod from your endpoints" requests to the Services and then immediately proceeds to invoke the pods' pre-stop hook. If the Service controller (typically something like nginx or haproxy) receives this request handles this request "too" late (due to internal lag or network latency between the replication and Service controllers) then it is possible that the Service controller will send one or more requests to a Puma process which has already shut down its listening socket. These requests will then fail with 5XX error codes. + +The way Kubernetes works this way, rather than handling step 2 synchronously, is due to the CAP theorem: in a distributed system there is no way to guarantee that any message will arrive promptly. In particular, waiting for all Service controllers to report back might get stuck for an indefinite time if one of them has already been terminated or if there has been a net split. A way to work around this is to add a sleep to the pre-stop hook of the same time as the `terminationGracePeriodSeconds` time. This will allow the Puma process to keep serving new requests during the entire grace period, although it will no longer receive new requests after all Service controllers have propagated the removal of the pod from their endpoint lists. Then, after `terminationGracePeriodSeconds`, the pod receives `SIGKILL` and closes down. If your process can't handle SIGKILL properly, for example because it needs to release locks in different services, you can also sleep for a shorter period (and/or increase `terminationGracePeriodSeconds`) as long as the time slept is longer than the time that your Service controllers take to propagate the pod removal. The downside of this workaround is that all pods will take at minimum the amount of time slept to shut down and this will increase the time required for your rolling deploy. + +More discussions and links to relevant articles can be found in https://github.com/puma/puma/issues/2343. + +## Workers Per Pod, and Other Config Issues + +With containerization, you will have to make a decision about how "big" to make each pod. Should you run 2 pods with 50 workers each? 25 pods, each with 4 workers? 100 pods, with each Puma running in single mode? Each scenario represents the same total amount of capacity (100 Puma processes that can respond to requests), but there are tradeoffs to make. + +* Worker counts should be somewhere between 4 and 32 in most cases. You want more than 4 in order to minimize time spent in request queueing for a free Puma worker, but probably less than ~32 because otherwise autoscaling is working in too large of an increment or they probably won't fit very well into your nodes. In any queueing system, queue time is proportional to 1/n, where n is the number of things pulling from the queue. Each pod will have its own request queue (i.e., the socket backlog). If you have 4 pods with 1 worker each (4 request queues), wait times are, proportionally, about 4 times higher than if you had 1 pod with 4 workers (1 request queue). +* Unless you have a very I/O-heavy application (50%+ time spent waiting on IO), use the default thread count (5 for MRI). Using higher numbers of threads with low I/O wait (<50%) will lead to additional request queueing time (latency!) and additional memory usage. +* More processes per pod reduces memory usage per process, because of copy-on-write memory and because the cost of the single master process is "amortized" over more child processes. +* Don't run less than 4 processes per pod if you can. Low numbers of processes per pod will lead to high request queueing, which means you will have to run more pods. +* If multithreaded, allocate 1 CPU per worker. If single threaded, allocate 0.75 cpus per worker. Most web applications spend about 25% of their time in I/O - but when you're running multi-threaded, your Puma process will have higher CPU usage and should be able to fully saturate a CPU core. +* Most Puma processes will use about ~512MB-1GB per worker, and about 1GB for the master process. However, you probably shouldn't bother with setting memory limits lower than around 2GB per process, because most places you are deploying will have 2GB of RAM per CPU. A sensible memory limit for a Puma configuration of 4 child workers might be something like 8 GB (1 GB for the master, 7GB for the 4 children). + diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/nginx.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/nginx.md new file mode 100644 index 0000000..64b2782 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/nginx.md @@ -0,0 +1,80 @@ +# Nginx configuration example file + +This is a very common setup using an upstream. It was adapted from some Capistrano recipe I found on the Internet a while ago. + +```nginx +upstream myapp { + server unix:///myapp/tmp/puma.sock; +} + +server { + listen 80; + server_name myapp.com; + + # ~2 seconds is often enough for most folks to parse HTML/CSS and + # retrieve needed images/icons/frames, connections are cheap in + # nginx so increasing this is generally safe... + keepalive_timeout 5; + + # path for static files + root /myapp/public; + access_log /myapp/log/nginx.access.log; + error_log /myapp/log/nginx.error.log info; + + # this rewrites all the requests to the maintenance.html + # page if it exists in the doc root. This is for capistrano's + # disable web task + if (-f $document_root/maintenance.html) { + rewrite ^(.*)$ /maintenance.html last; + break; + } + + location / { + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $host; + + # If the file exists as a static file serve it directly without + # running all the other rewrite tests on it + if (-f $request_filename) { + break; + } + + # check for index.html for directory index + # if it's there on the filesystem then rewrite + # the url to add /index.html to the end of it + # and then break to send it to the next config rules. + if (-f $request_filename/index.html) { + rewrite (.*) $1/index.html break; + } + + # this is the meat of the rack page caching config + # it adds .html to the end of the url and then checks + # the filesystem for that file. If it exists, then we + # rewrite the url to have explicit .html on the end + # and then send it on its way to the next config rule. + # if there is no file on the fs then it sets all the + # necessary headers and proxies to our upstream pumas + if (-f $request_filename.html) { + rewrite (.*) $1.html break; + } + + if (!-f $request_filename) { + proxy_pass http://myapp; + break; + } + } + + # Now this supposedly should work as it gets the filenames with querystrings that Rails provides. + # BUT there's a chance it could break the ajax calls. + location ~* \.(ico|css|gif|jpe?g|png|js)(\?[0-9]+)?$ { + expires max; + break; + } + + # Error pages + # error_page 500 502 503 504 /500.html; + location = /500.html { + root /myapp/current/public; + } +} +``` diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/plugins.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/plugins.md new file mode 100644 index 0000000..2331682 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/plugins.md @@ -0,0 +1,42 @@ +## Plugins + +Puma 3.0 added support for plugins that can augment configuration and service +operations. + +There are two canonical plugins to aid in the development of new plugins: + +* [tmp\_restart](https://github.com/puma/puma/blob/master/lib/puma/plugin/tmp_restart.rb): + Restarts the server if the file `tmp/restart.txt` is touched +* [heroku](https://github.com/puma/puma-heroku/blob/master/lib/puma/plugin/heroku.rb): + Packages up the default configuration used by Puma on Heroku (being sunset + with the release of Puma 5.0) + +Plugins are activated in a Puma configuration file (such as `config/puma.rb'`) +by adding `plugin "name"`, such as `plugin "heroku"`. + +Plugins are activated based on path requirements so, activating the `heroku` +plugin is much like `require "puma/plugin/heroku"`. This allows gems to provide +multiple plugins (as well as unrelated gems to provide Puma plugins). + +The `tmp_restart` plugin comes with Puma, so it is always available. + +To use the `heroku` plugin, add `puma-heroku` to your Gemfile or install it. + +### API + +## Server-wide hooks + +Plugins can use a couple of hooks at the server level: `start` and `config`. + +`start` runs when the server has started and allows the plugin to initiate other +functionality to augment Puma. + +`config` runs when the server is being configured and receives a `Puma::DSL` +object that is useful for additional configuration. + +Public methods in [`Puma::Plugin`](../lib/puma/plugin.rb) are treated as a +public API for plugins. + +## Binder hooks + +There's `Puma::Binder#before_parse` method that allows to add proc to run before the body of `Puma::Binder#parse`. Example of usage can be found in [that repository](https://github.com/anchordotdev/puma-acme/blob/v0.1.3/lib/puma/acme/plugin.rb#L97-L118) (`before_parse_hook` could be renamed `before_parse`, making monkey patching of [binder.rb](https://github.com/anchordotdev/puma-acme/blob/v0.1.3/lib/puma/acme/binder.rb) is unnecessary). \ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/rails_dev_mode.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/rails_dev_mode.md new file mode 100644 index 0000000..add3cee --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/rails_dev_mode.md @@ -0,0 +1,28 @@ +# Running Puma in Rails Development Mode + +## "Loopback requests" + +Be cautious of "loopback requests," where a Rails application executes a request to a server that, in turn, results in another request back to the same Rails application before the first request completes. Having a loopback request will trigger [Rails' load interlock](https://guides.rubyonrails.org/threading_and_code_execution.html#load-interlock) mechanism. The load interlock mechanism prevents a thread from using Rails autoloading mechanism to load constants while the application code is still running inside another thread. + +This issue only occurs in the development environment as Rails' load interlock is not used in production environments. Although we're not sure, we believe this issue may not occur with the new `zeitwerk` code loader. + +### Solutions + +#### 1. Bypass Rails' load interlock with `.permit_concurrent_loads` + +Wrap the first request inside a block that will allow concurrent loads: [`ActiveSupport::Dependencies.interlock.permit_concurrent_loads`](https://guides.rubyonrails.org/threading_and_code_execution.html#permit-concurrent-loads). Anything wrapped inside the `.permit_concurrent_loads` block will bypass the load interlock mechanism, allowing new threads to access the Rails environment and boot properly. + +###### Example + +```ruby +response = ActiveSupport::Dependencies.interlock.permit_concurrent_loads do + # Your HTTP request code here. For example: + Faraday.post url, data: 'foo' +end + +do_something_with response +``` + +#### 2. Use multiple processes on Puma + +Alternatively, you may also enable multiple (single-threaded) workers on Puma. By doing so, you are sidestepping the problem by creating multiple processes rather than new threads. However, this workaround is not ideal because debugging tools such as [byebug](https://github.com/deivid-rodriguez/byebug/issues/487) and [pry](https://github.com/pry/pry/issues/2153), work poorly with any multi-process web server. diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/restart.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/restart.md new file mode 100644 index 0000000..7ea5b02 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/restart.md @@ -0,0 +1,65 @@ +Puma provides three distinct kinds of restart operations, each for different use cases. This document describes "hot restarts" and "phased restarts." The third kind of restart operation is called "refork" and is described in the documentation for [`fork_worker`](fork_worker.md). + +## Hot restart + +To perform a "hot" restart, Puma performs an `exec` operation to start the process up again, so no memory is shared between the old process and the new process. As a result, it is safe to issue a restart at any place where you would manually stop Puma and start it again. In particular, it is safe to upgrade Puma itself using a hot restart. + +If the new process is unable to load, it will simply exit. You should therefore run Puma under a process monitor when using it in production. + +### How-to + +Any of the following will cause a Puma server to perform a hot restart: + +* Send the `puma` process the `SIGUSR2` signal +* Issue a `GET` request to the Puma status/control server with the path `/restart` +* Issue `pumactl restart` (this uses the control server method if available, otherwise sends the `SIGUSR2` signal to the process) + +### Supported configurations + +* Works in cluster mode and single mode +* Supported on all platforms + +### Client experience + +* All platforms: clients with an in-flight request are served responses before the connection is closed gracefully. Puma gracefully disconnects any idle HTTP persistent connections before restarting. +* On MRI or TruffleRuby on Linux and BSD: Clients who connect just before the server restarts may experience increased latency while the server stops and starts again, but their connections will not be closed prematurely. +* On Windows and JRuby: Clients who connect just before a restart may experience "connection reset" errors. + +### Additional notes + +* The newly started Puma process changes its current working directory to the directory specified by the `directory` option. If `directory` is set to symlink, this is automatically re-evaluated, so this mechanism can be used to upgrade the application. +* Only one version of the application is running at a time. +* `on_restart` is invoked just before the server shuts down. This can be used to clean up resources (like long-lived database connections) gracefully. Since Ruby 2.0, it is not typically necessary to explicitly close file descriptors on restart. This is because any file descriptor opened by Ruby will have the `FD_CLOEXEC` flag set, meaning that file descriptors are closed on `exec`. `on_restart` is useful, though, if your application needs to perform any more graceful protocol-specific shutdown procedures before closing connections. + +## Phased restart + +Phased restarts replace all running workers in a Puma cluster. This is a useful way to upgrade the application that Puma is serving gracefully. A phased restart works by first killing an old worker, then starting a new worker, waiting until the new worker has successfully started before proceeding to the next worker. This process continues until all workers are replaced. The master process is not restarted. + +### How-to + +Any of the following will cause a Puma server to perform a phased restart: + +* Send the `puma` process the `SIGUSR1` signal +* Issue a `GET` request to the Puma status/control server with the path `/phased-restart` +* Issue `pumactl phased-restart` (this uses the control server method if available, otherwise sends the `SIGUSR1` signal to the process) + +### Supported configurations + +* Works in cluster mode only +* To support upgrading the application that Puma is serving, ensure `prune_bundler` is enabled and that `preload_app!` is disabled +* Supported on all platforms where cluster mode is supported + +### Client experience + +* In-flight requests are always served responses before the connection is closed gracefully +* Idle persistent connections are gracefully disconnected +* New connections are not lost, and clients will not experience any increase in latency (as long as the number of configured workers is greater than one) + +### Additional notes + +* When a phased restart begins, the Puma master process changes its current working directory to the directory specified by the `directory` option. If `directory` is set to symlink, this is automatically re-evaluated, so this mechanism can be used to upgrade the application. +* On a single server, it's possible that two versions of the application are running concurrently during a phased restart. +* `on_restart` is not invoked +* Phased restarts can be slow for Puma clusters with many workers. Hot restarts often complete more quickly, but at the cost of increased latency during the restart. +* Phased restarts cannot be used to upgrade any gems loaded by the Puma master process, including `puma` itself, anything in `extra_runtime_dependencies`, or dependencies thereof. Upgrading other gems is safe. +* If you remove the gems from old releases as part of your deployment strategy, there are additional considerations. Do not put any gems into `extra_runtime_dependencies` that have native extensions or have dependencies that have native extensions (one common example is `puma_worker_killer` and its dependency on `ffi`). Workers will fail on boot during a phased restart. The underlying issue is recorded in [an issue on the rubygems project](https://github.com/rubygems/rubygems/issues/4004). Hot restarts are your only option here if you need these dependencies. diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/signals.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/signals.md new file mode 100644 index 0000000..d3a17c5 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/signals.md @@ -0,0 +1,98 @@ +The [unix signal](https://en.wikipedia.org/wiki/Unix_signal) is a method of sending messages between [processes](https://en.wikipedia.org/wiki/Process_(computing)). When a signal is sent, the operating system interrupts the target process's normal flow of execution. There are standard signals that are used to stop a process, but there are also custom signals that can be used for other purposes. This document is an attempt to list all supported signals that Puma will respond to. In general, signals need only be sent to the master process of a cluster. + +## Sending Signals + +If you are new to signals, it can be helpful to see how they are used. When a process starts in a *nix-like operating system, it will have a [PID - or process identifier](https://en.wikipedia.org/wiki/Process_identifier) that can be used to send signals to the process. For demonstration, we will create an infinitely running process by tailing a file: + +```sh +$ echo "foo" >> my.log +$ irb +> pid = Process.spawn 'tail -f my.log' +``` + +From here, we can see that the tail process is running by using the `ps` command: + +```sh +$ ps aux | grep tail +schneems 87152 0.0 0.0 2432772 492 s032 S+ 12:46PM 0:00.00 tail -f my.log +``` + +You can send a signal in Ruby using the [Process module](https://docs.ruby-lang.org/en/master/Process.html#method-c-kill): + +``` +$ irb +> puts pid +=> 87152 +Process.detach(pid) # https://docs.ruby-lang.org/en/master/Process.html#method-c-detach +Process.kill("TERM", pid) +``` + +Now you will see via `ps` that there is no more `tail` process. Sometimes when referring to signals, the `SIG` prefix will be used. For example, `SIGTERM` is equivalent to sending `TERM` via `Process.kill`. + +## Puma Signals + +Puma cluster responds to these signals: + +- `TTIN` increment the worker count by 1 +- `TTOU` decrement the worker count by 1 +- `TERM` send `TERM` to worker. The worker will attempt to finish then exit. +- `USR2` restart workers. This also reloads the Puma configuration file, if there is one. +- `USR1` restart workers in phases, a rolling restart. This will not reload the configuration file. +- `HUP ` reopen log files defined in stdout_redirect configuration parameter. If there is no stdout_redirect option provided, it will behave like `INT` +- `INT ` equivalent of sending Ctrl-C to cluster. Puma will attempt to finish then exit. +- `CHLD` +- `URG ` refork workers in phases from worker 0 if `fork_workers` option is enabled. +- `INFO` print backtraces of all puma threads + +## Callbacks order in case of different signals + +### Start application + +``` +puma configuration file reloaded, if there is one +* Pruning Bundler environment +puma configuration file reloaded, if there is one + +before_fork +on_worker_fork +after_worker_fork + +Gemfile in context + +on_worker_boot + +Code of the app is loaded and running +``` + +### Send USR2 + +``` +on_worker_shutdown +on_restart + +puma configuration file reloaded, if there is one + +before_fork +on_worker_fork +after_worker_fork + +Gemfile in context + +on_worker_boot + +Code of the app is loaded and running +``` + +### Send USR1 + +``` +on_worker_shutdown +on_worker_fork +after_worker_fork + +Gemfile in context + +on_worker_boot + +Code of the app is loaded and running +``` diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/stats.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/stats.md new file mode 100644 index 0000000..2b55980 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/stats.md @@ -0,0 +1,147 @@ +## Accessing stats + +Stats can be accessed in two ways: + +### control server + +`$ pumactl stats` or `GET /stats` + +[Read more about `pumactl` and the control server in the README.](https://github.com/puma/puma#controlstatus-server). + +### Puma.stats + +`Puma.stats` produces a JSON string. `Puma.stats_hash` produces a ruby hash. + +#### in single mode + +Invoke `Puma.stats` anywhere in runtime, e.g. in a rails initializer: + +```ruby +# config/initializers/puma_stats.rb + +Thread.new do + loop do + sleep 30 + puts Puma.stats + end +end +``` + +#### in cluster mode + +Invoke `Puma.stats` from the master process + +```ruby +# config/puma.rb + +before_fork do + Thread.new do + loop do + puts Puma.stats + sleep 30 + end + end +end +``` + + +## Explanation of stats + +`Puma.stats` returns different information and a different structure depending on if Puma is in single vs. cluster mode. There is one top-level attribute that is common to both modes: + +* started_at: when Puma was started + +### single mode and individual workers in cluster mode + +When Puma runs in single mode, these stats are available at the top level. When Puma runs in cluster mode, these stats are available within the `worker_status` array in a hash labeled `last_status`, in an array of hashes where one hash represents each worker. + +* backlog: requests that are waiting for an available thread to be available. if this is frequently above 0, you need more capacity. +* running: how many threads are spawned. A spawned thread may be busy processing a request or waiting for a new request. If `min_threads` and `max_threads` are set to the same number, + this will be a never-changing number (other than rare cases when a thread dies, etc). +* busy_threads: `running` - `how many threads are waiting to receive work` + `how many requests are waiting for a thread to pick them up`. + this is a "wholistic" stat reflecting the overall current state of work to be done and the capacity to do it. +* pool_capacity: `how many threads are waiting to receive work` + `max_threads` - `running`. In a typical configuration where `min_threads` + and `max_threads` are configured to the same number, this is simply `how many threads are waiting to receive work`. This number exists only as a stat + and is not used for any internal decisions, unlike `busy_theads`, which is usually a more useful stat. +* max_threads: the maximum number of threads Puma is configured to spool per worker +* requests_count: the number of requests this worker has served since starting + + +### cluster mode + +* phase: which phase of restart the process is in, during [phased restart](https://github.com/puma/puma/blob/master/docs/restart.md) +* workers: ?? +* booted_workers: how many workers currently running? +* old_workers: ?? +* worker_status: array of hashes of info for each worker (see below) + +### worker status + +* started_at: when the worker started +* pid: the process id of the worker process +* index: each worker gets a number. if Puma is configured to have 3 workers, then this will be 0, 1, or 2 +* booted: if it's done booting [?] +* last_checkin: Last time the worker responded to the master process' heartbeat check. +* last_status: a hash of info about the worker's state handling requests. See the explanation for this in "single mode and individual workers in cluster mode" section above. + + +## Examples + +Here are two example stats hashes produced by `Puma.stats`: + +### single + +```json +{ + "started_at": "2021-01-14T07:12:35Z", + "backlog": 0, + "running": 5, + "pool_capacity": 5, + "max_threads": 5, + "requests_count": 3 +} +``` + +### cluster + +```json +{ + "started_at": "2021-01-14T07:09:17Z", + "workers": 2, + "phase": 0, + "booted_workers": 2, + "old_workers": 0, + "worker_status": [ + { + "started_at": "2021-01-14T07:09:24Z", + "pid": 64136, + "index": 0, + "phase": 0, + "booted": true, + "last_checkin": "2021-01-14T07:11:09Z", + "last_status": { + "backlog": 0, + "running": 5, + "pool_capacity": 5, + "max_threads": 5, + "requests_count": 2 + } + }, + { + "started_at": "2021-01-14T07:09:24Z", + "pid": 64137, + "index": 1, + "phase": 0, + "booted": true, + "last_checkin": "2021-01-14T07:11:09Z", + "last_status": { + "backlog": 0, + "running": 5, + "pool_capacity": 5, + "max_threads": 5, + "requests_count": 1 + } + } + ] +} +``` diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/systemd.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/systemd.md new file mode 100644 index 0000000..cf7f9b0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/systemd.md @@ -0,0 +1,253 @@ +# systemd + +[systemd](https://www.freedesktop.org/wiki/Software/systemd/) is a commonly +available init system (PID 1) on many Linux distributions. It offers process +monitoring (including automatic restarts) and other useful features for running +Puma in production. + +## Service Configuration + +Below is a sample puma.service configuration file for systemd, which can be +copied or symlinked to `/etc/systemd/system/puma.service`, or if desired, using +an application or instance-specific name. + +Note that this uses the systemd preferred "simple" type where the start command +remains running in the foreground (does not fork and exit). + +~~~~ ini +[Unit] +Description=Puma HTTP Server +After=network.target + +# Uncomment for socket activation (see below) +# Requires=puma.socket + +[Service] +# Puma supports systemd's `Type=notify` and watchdog service +# monitoring, as of Puma 5.1 or later. +# On earlier versions of Puma or JRuby, change this to `Type=simple` and remove +# the `WatchdogSec` line. +Type=notify + +# If your Puma process locks up, systemd's watchdog will restart it within seconds. +WatchdogSec=10 + +# Preferably configure a non-privileged user +# User= + +# The path to your application code root directory. +# Also replace the "" placeholders below with this path. +# Example /home/username/myapp +WorkingDirectory= + +# Helpful for debugging socket activation, etc. +# Environment=PUMA_DEBUG=1 + +# SystemD will not run puma even if it is in your path. You must specify +# an absolute URL to puma. For example /usr/local/bin/puma +# Alternatively, create a binstub with `bundle binstubs puma --path ./sbin` in the WorkingDirectory +ExecStart=//bin/puma -C /puma.rb + +# Variant: Rails start. +# ExecStart=//bin/puma -C /config/puma.rb ../config.ru + +# Variant: Use `bundle exec puma` instead of binstub +# Variant: Specify directives inline. +# ExecStart=//puma -b tcp://0.0.0.0:9292 -b ssl://0.0.0.0:9293?key=key.pem&cert=cert.pem + + +Restart=always + +[Install] +WantedBy=multi-user.target +~~~~ + +See +[systemd.exec](https://www.freedesktop.org/software/systemd/man/systemd.exec.html) +for additional details. + +## Socket Activation + +systemd and Puma also support socket activation, where systemd opens the +listening socket(s) in advance and provides them to the Puma master process on +startup. Among other advantages, this keeps listening sockets open across puma +restarts and achieves graceful restarts, including when upgraded Puma, and is +compatible with both cluster mode and application preload. + +**Note:** Any wrapper scripts which `exec`, or other indirections in `ExecStart` +may result in activated socket file descriptors being closed before reaching the +puma master process. + +**Note:** Socket activation doesn't currently work on JRuby. This is tracked in +[#1367]. + +Configure one or more `ListenStream` sockets in a companion `*.socket` unit file +to use socket activation. Also, uncomment the associated `Requires` directive +for the socket unit in the service file (see above.) Here is a sample +puma.socket, matching the ports used in the above puma.service: + +~~~~ ini +[Unit] +Description=Puma HTTP Server Accept Sockets + +[Socket] +ListenStream=0.0.0.0:9292 +ListenStream=0.0.0.0:9293 + +# AF_UNIX domain socket +# SocketUser, SocketGroup, etc. may be needed for Unix domain sockets +# ListenStream=/run/puma.sock + +# Socket options matching Puma defaults +ReusePort=true +Backlog=1024 +# Enable this if you're using Puma with the "low_latency" option, read more in Puma DSL docs and systemd docs: +# https://www.freedesktop.org/software/systemd/man/latest/systemd.socket.html#NoDelay= +# NoDelay=true + +[Install] +WantedBy=sockets.target +~~~~ + +See +[systemd.socket](https://www.freedesktop.org/software/systemd/man/systemd.socket.html) +for additional configuration details. + +Note that the above configurations will work with Puma in either single process +or cluster mode. + +### Sockets and symlinks + +When using releases folders, you should set the socket path using the shared +folder path (ex. `/srv/projet/shared/tmp/puma.sock`), not the release folder +path (`/srv/projet/releases/1234/tmp/puma.sock`). + +Puma will detect the release path socket as different than the one provided by +systemd and attempt to bind it again, resulting in the exception `There is +already a server bound to:`. + +### Binding + +By default, you need to configure Puma to have binds matching with all +ListenStream statements. Any mismatched systemd ListenStreams will be closed by +Puma. + +To automatically bind to all activated sockets, the option +`--bind-to-activated-sockets` can be used. This matches the config DSL +`bind_to_activated_sockets` statement. This will cause Puma to create a bind +automatically for any activated socket. When systemd socket activation is not +enabled, this option does nothing. + +This also accepts an optional argument `only` (DSL: `'only'`) to discard any +binds that's not socket activated. + +## Usage + +Without socket activation, use `systemctl` as root (i.e., via `sudo`) as with +other system services: + +~~~~ sh +# After installing or making changes to puma.service +systemctl daemon-reload + +# Enable so it starts on boot +systemctl enable puma.service + +# Initial startup. +systemctl start puma.service + +# Check status +systemctl status puma.service + +# A normal restart. Warning: listener's sockets will be closed +# while a new puma process initializes. +systemctl restart puma.service +~~~~ + +With socket activation, several but not all of these commands should be run for +both socket and service: + +~~~~ sh +# After installing or making changes to either puma.socket or +# puma.service. +systemctl daemon-reload + +# Enable both socket and service, so they start on boot. Alternatively +# you could leave puma.service disabled, and systemd will start it on +# the first use (with startup lag on the first request) +systemctl enable puma.socket puma.service + +# Initial startup. The Requires directive (see above) ensures the +# socket is started before the service. +systemctl start puma.socket puma.service + +# Check the status of both socket and service. +systemctl status puma.socket puma.service + +# A "hot" restart, with systemd keeping puma.socket listening and +# providing to the new puma (master) instance. +systemctl restart puma.service + +# A normal restart, needed to handle changes to +# puma.socket, such as changing the ListenStream ports. Note +# daemon-reload (above) should be run first. +systemctl restart puma.socket puma.service +~~~~ + +Here is sample output from `systemctl status` with both service and socket +running: + +~~~~ +● puma.socket - Puma HTTP Server Accept Sockets + Loaded: loaded (/etc/systemd/system/puma.socket; enabled; vendor preset: enabled) + Active: active (running) since Thu 2016-04-07 08:40:19 PDT; 1h 2min ago + Listen: 0.0.0.0:9233 (Stream) + 0.0.0.0:9234 (Stream) + +Apr 07 08:40:19 hx systemd[874]: Listening on Puma HTTP Server Accept Sockets. + +● puma.service - Puma HTTP Server + Loaded: loaded (/etc/systemd/system/puma.service; enabled; vendor preset: enabled) + Active: active (running) since Thu 2016-04-07 08:40:19 PDT; 1h 2min ago + Main PID: 28320 (ruby) + CGroup: /system.slice/puma.service + ├─28320 puma 3.3.0 (tcp://0.0.0.0:9233,ssl://0.0.0.0:9234?key=key.pem&cert=cert.pem) [app] + ├─28323 puma: cluster worker 0: 28320 [app] + └─28327 puma: cluster worker 1: 28320 [app] + +Apr 07 08:40:19 hx puma[28320]: Puma starting in cluster mode... +Apr 07 08:40:19 hx puma[28320]: * Version 3.3.0 (ruby 2.2.4-p230), codename: Jovial Platypus +Apr 07 08:40:19 hx puma[28320]: * Min threads: 0, max threads: 16 +Apr 07 08:40:19 hx puma[28320]: * Environment: production +Apr 07 08:40:19 hx puma[28320]: * Process workers: 2 +Apr 07 08:40:19 hx puma[28320]: * Phased restart available +Apr 07 08:40:19 hx puma[28320]: * Activated tcp://0.0.0.0:9233 +Apr 07 08:40:19 hx puma[28320]: * Activated ssl://0.0.0.0:9234?key=key.pem&cert=cert.pem +Apr 07 08:40:19 hx puma[28320]: Use Ctrl-C to stop +~~~~ + +### capistrano3-puma + +By default, [capistrano3-puma](https://github.com/seuros/capistrano-puma) uses +`pumactl` for deployment restarts outside of systemd. To learn the exact +commands that this tool would use for `ExecStart` and `ExecStop`, use the +following `cap` commands in dry-run mode, and update from the above forking +service configuration accordingly. Note also that the configured `User` should +likely be the same as the capistrano3-puma `:puma_user` option. + +~~~~ sh +stage=production # or different stage, as needed +cap $stage puma:start --dry-run +cap $stage puma:stop --dry-run +~~~~ + +### Disabling Puma Systemd Integration + +If you would like to disable Puma's systemd integration, for example if you handle it elsewhere +in your code yourself, simply set the the environment variable `PUMA_SKIP_SYSTEMD` to any value. + + + +[Restart]: https://www.freedesktop.org/software/systemd/man/systemd.service.html#Restart= +[#1367]: https://github.com/puma/puma/issues/1367 +[#1499]: https://github.com/puma/puma/issues/1499 diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/testing_benchmarks_local_files.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/testing_benchmarks_local_files.md new file mode 100644 index 0000000..aea776b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/testing_benchmarks_local_files.md @@ -0,0 +1,150 @@ +# Testing - benchmark/local files + +These files generate data that shows request-per-second (RPS), etc. Typically, files are in +pairs, a shell script and a Ruby script. The shell script starts the server, then runs the +Ruby file, which starts client request stream(s), then collects and logs metrics. + +## response_time_wrk.sh + +This uses [wrk] for generating data. One or more wrk runs are performed. Summarizes RPS and +wrk latency times. The default for the `-b` argument runs 28 different client request streams, +and takes a bit over 5 minutes. See 'Request Stream Configuration' below for `-b` argument +description. + +
+ Summary output for
benchmarks/local/response_time_wrk.sh -w2 -t5:5 -s tcp6:
+ +``` +Type req/sec 50% 75% 90% 99% 100% Resp Size +───────────────────────────────────────────────────────────────── 1kB +array 13710 0.74 2.52 5.23 7.76 37.45 1024 +chunk 13502 0.76 2.55 5.28 7.84 11.23 1042 +string 13794 0.74 2.51 5.20 7.75 14.07 1024 +io 9615 1.16 3.45 7.13 10.57 15.75 1024 +───────────────────────────────────────────────────────────────── 10kB +array 13458 0.76 2.57 5.31 7.93 13.94 10239 +chunk 13066 0.78 2.64 5.46 8.18 38.48 10320 +string 13500 0.76 2.55 5.29 7.88 11.42 10240 +io 9293 1.18 3.59 7.39 10.94 16.99 10240 +───────────────────────────────────────────────────────────────── 100kB +array 11315 0.96 3.06 6.33 9.49 17.69 102424 +chunk 9916 1.10 3.48 7.20 10.73 15.14 103075 +string 10948 1.00 3.17 6.57 9.83 17.88 102378 +io 8901 1.21 3.72 7.48 11.27 59.98 102407 +───────────────────────────────────────────────────────────────── 256kB +array 9217 1.15 3.82 7.88 11.74 17.12 262212 +chunk 7339 1.45 4.76 9.81 14.63 22.70 264007 +string 8574 1.19 3.81 7.73 11.21 15.80 262147 +io 8911 1.19 3.80 7.55 15.25 60.01 262183 +───────────────────────────────────────────────────────────────── 512kB +array 6951 1.49 5.03 10.28 15.90 25.08 524378 +chunk 5234 2.03 6.56 13.57 20.46 32.15 527862 +string 6438 1.55 5.04 10.12 16.28 72.87 524275 +io 8533 1.15 4.62 8.79 48.15 70.51 524327 +───────────────────────────────────────────────────────────────── 1024kB +array 4122 1.80 15.59 41.87 67.79 121.00 1048565 +chunk 3158 2.82 15.22 31.00 71.39 99.90 1055654 +string 4710 2.24 6.66 13.65 20.38 70.44 1048575 +io 8355 1.23 3.95 7.94 14.08 68.54 1048498 +───────────────────────────────────────────────────────────────── 2048kB +array 2454 4.12 14.02 27.70 43.48 88.89 2097415 +chunk 1743 6.26 17.65 36.98 55.78 92.10 2111358 +string 2479 4.38 12.52 25.65 38.44 95.62 2097502 +io 8264 1.25 3.83 7.76 11.73 65.69 2097090 + +Body ────────── req/sec ────────── ─────── req 50% times ─────── + KB array chunk string io array chunk string io +1 13710 13502 13794 9615 0.745 0.757 0.741 1.160 +10 13458 13066 13500 9293 0.760 0.784 0.759 1.180 +100 11315 9916 10948 8901 0.960 1.100 1.000 1.210 +256 9217 7339 8574 8911 1.150 1.450 1.190 1.190 +512 6951 5234 6438 8533 1.490 2.030 1.550 1.150 +1024 4122 3158 4710 8355 1.800 2.820 2.240 1.230 +2048 2454 1743 2479 8264 4.120 6.260 4.380 1.250 +───────────────────────────────────────────────────────────────────── +wrk -t8 -c16 -d10s +benchmarks/local/response_time_wrk.sh -w2 -t5:5 -s tcp6 -Y +Server cluster mode -w2 -t5:5, bind: tcp6 +Puma repo branch 00-response-refactor +ruby 3.2.0dev (2022-06-14T01:21:55Z master 048f14221c) +YJIT [x86_64-linux] + +[2136] - Gracefully shutting down workers... +[2136] === puma shutdown: 2022-06-13 21:16:13 -0500 === +[2136] - Goodbye! + + 5:15 Total Time +``` +

+ +## bench_base.sh, bench_base.rb + +These two files setup parameters for the Puma server, which is normally started in a shell +script. It then starts a Ruby file (a subclass of BenchBase), passing arguments to it. The +Ruby file is normally used to generate a client request stream(s). + +### Puma Configuration + +The following arguments are used for the Puma server: + +* **`-C`** - configuration file +* **`-d`** - app delay +* **`-r`** - rackup file, often defaults to test/rackup/ci_select.ru +* **`-s`** - bind socket type, default is tcp/tcp4, also tcp6, ssl/ssl4, ssl6, unix, or aunix + (unix & abstract unix are not available with wrk). +* **`-t`** - threads, expressed as '5:5', same as Puma --thread +* **`-w`** - workers, same as Puma --worker +* **`-Y`** - enable Ruby YJIT + +### Request Stream Configuration + +The following arguments are used for request streams: + +* **`-b`** - response body configuration. Body type options are a array, c chunked, s string, + and i for File/IO. None or any combination can be specified, they should start the option. + Then, any combination of comma separated integers can be used for the response body size + in kB. The string 'ac50,100' would create four runs, 50kb array, 50kB chunked, 100kB array, + and 100kB chunked. See 'Testing - test/rackup/ci-*.ru files' for more info. +* **`-c`** - connections per client request stream thread, defaults to 2 for wrk. +* **`-D`** - duration of client request stream in seconds. +* **`-T`** - number of threads in the client request stream. For wrk, this defaults to + 80% of Puma workers * max_threads. + +### Notes - Configuration + +The above lists script arguments. + +`bench_base.sh` contains most server defaults. Many can be set via ENV variables. + +`bench_base.rb` contains the client request stream defaults. The default value for +`-b` is `acsi1,10,100,256,512,1024,2048`, which is a 4 x 7 matrix, and hence, runs +28 jobs. Also, the i body type (File/IO) generates files, they are placed in the +`"#{Dir.tmpdir}/.puma_response_body_io"` directory, which is created. + +### Notes - wrk + +The shell scripts use `-T` for wrk's thread count, since `-t` is used for Puma +server threads. Regarding the `-c` argument, wrk has an interesting behavior. +The total number of connections is set by `(connections/threads).to_i`. The scripts +here use `-c` as connections per thread. Hence, using `-T4 -c2` will yield a total +of eight wrk connections, two per thread. The equivalent wrk arguments would be `-t4 -c8`. + +Puma can only process so many requests, and requests will queue in the backlog +until Puma can respond to them. With wrk, if the number of total connections is +too high, one will see the upper latency times increase, pushing into the lower +latency times as the connections are increased. The default values for wrk's +threads and connections were chosen to minimize requests' time in the backlog. + +An example with four wrk runs using `-b s10`. Notice that `req/sec` varies by +less than 1%, but the `75%` times increase by an order of magnitude: +``` +req/sec 50% 75% 90% 99% 100% Resp Size wrk cmd line +───────────────────────────────────────────────────────────────────────────── + 13597 0.755 2.550 5.260 7.800 13.310 12040 wrk -t8 -c16 -d10 + 13549 0.793 4.430 8.140 11.220 16.600 12002 wrk -t10 -c20 -d10 + 13570 1.040 25.790 40.010 49.070 58.300 11982 wrk -t8 -c64 -d10 + 13684 1.050 25.820 40.080 49.160 66.190 12033 wrk -t16 -c64 -d10 +``` +Finally, wrk's output may cause rounding errors, so the response body size calculation is +imprecise. + +[wrk]: diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/testing_test_rackup_ci_files.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/testing_test_rackup_ci_files.md new file mode 100644 index 0000000..029d825 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/testing_test_rackup_ci_files.md @@ -0,0 +1,36 @@ +# Testing - test/rackup/ci-*.ru files + +## Overview + +Puma should efficiently handle a variety of response bodies, varying both by size +and by the type of object used for the body. + +Five rackup files are located in 'test/rackup' that can be used. All have their +request body size (in kB) set via `Body-Conf` header or with `ENV['CI_BODY_CONF']`. +Additionally, the ci_select.ru file can have it's body type set via a starting +character. + +* **ci_array.ru** - body is an `Array` of 1kB strings. `Content-Length` is not set. +* **ci_chunked.ru** - body is an `Enumerator` of 1kB strings. `Content-Length` is not set. +* **ci_io.ru** - body is a File/IO object. `Content-Length` is set. +* **ci_string.ru** - body is a single string. `Content-Length` is set. +* **ci_select.ru** - can be any of the above. + +All responses have 25 headers, total length approx 1kB. ci_array.ru and ci_chunked.ru +contain 1kB items. + +All can be delayed by a float value (seconds) specified by the `Dly` header + +Note that rhe `Body-Conf` header takes precedence, and `ENV['CI_BODY_CONF']` is +only read on load. + +## ci_select.ru + +The ci_select.ru file allows a starting character to specify the body type in the +`Body-Conf` header or with `ENV['CI_BODY_CONF']`. +* **a** - array of strings +* **c** - chunked (enum) +* **s** - single string +* **i** - File/IO + +A value of `a100` would return a body as an array of 100 1kB strings. diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/Makefile b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/Makefile new file mode 100644 index 0000000..0083023 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/Makefile @@ -0,0 +1,269 @@ + +SHELL = /bin/sh + +# V=0 quiet, V=1 verbose. other values don't work. +V = 0 +V0 = $(V:0=) +Q1 = $(V:1=) +Q = $(Q1:0=@) +ECHO1 = $(V:1=@ :) +ECHO = $(ECHO1:0=@ echo) +NULLCMD = : + +#### Start of system configuration section. #### + +srcdir = . +topdir = /usr/include/ruby-3.2.0 +hdrdir = $(topdir) +arch_hdrdir = /usr/include/x86_64-linux-gnu/ruby-3.2.0 +PATH_SEPARATOR = : +VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby +prefix = $(DESTDIR)/usr +rubysitearchprefix = $(sitearchlibdir)/$(RUBY_BASE_NAME) +rubyarchprefix = $(archlibdir)/$(RUBY_BASE_NAME) +rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) +exec_prefix = $(prefix) +vendorarchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/vendor_ruby +sitearchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/site_ruby +rubyarchhdrdir = $(archincludedir)/$(RUBY_VERSION_NAME) +vendorhdrdir = $(rubyhdrdir)/vendor_ruby +sitehdrdir = $(rubyhdrdir)/site_ruby +rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) +vendorarchdir = $(rubysitearchprefix)/vendor_ruby/$(ruby_version) +vendorlibdir = $(vendordir)/$(ruby_version) +vendordir = $(rubylibprefix)/vendor_ruby +sitearchdir = $(DESTDIR)/usr/local/lib/x86_64-linux-gnu/site_ruby +sitelibdir = $(sitedir)/$(ruby_version) +sitedir = $(DESTDIR)/usr/local/lib/site_ruby +rubyarchdir = $(rubyarchprefix)/$(ruby_version) +rubylibdir = $(rubylibprefix)/$(ruby_version) +sitearchincludedir = $(includedir)/$(sitearch) +archincludedir = $(includedir)/$(arch) +sitearchlibdir = $(libdir)/$(sitearch) +archlibdir = $(libdir)/$(arch) +ridir = $(datarootdir)/$(RI_BASE_NAME) +mandir = $(datarootdir)/man +localedir = $(datarootdir)/locale +libdir = $(exec_prefix)/lib +psdir = $(docdir) +pdfdir = $(docdir) +dvidir = $(docdir) +htmldir = $(docdir) +infodir = $(datarootdir)/info +docdir = $(datarootdir)/doc/$(PACKAGE) +oldincludedir = $(DESTDIR)/usr/include +includedir = $(prefix)/include +runstatedir = $(DESTDIR)/var/run +localstatedir = $(DESTDIR)/var +sharedstatedir = $(prefix)/com +sysconfdir = $(DESTDIR)/etc +datadir = $(datarootdir) +datarootdir = $(prefix)/share +libexecdir = $(exec_prefix)/libexec +sbindir = $(exec_prefix)/sbin +bindir = $(exec_prefix)/bin +archdir = $(rubyarchdir) + + +CC_WRAPPER = +CC = x86_64-linux-gnu-gcc +CXX = x86_64-linux-gnu-g++ +LIBRUBY = $(LIBRUBY_SO) +LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a +LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) +LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static $(MAINLIBS) +empty = +OUTFLAG = -o $(empty) +COUTFLAG = -o $(empty) +CSRCFLAG = $(empty) + +RUBY_EXTCONF_H = +cflags = $(optflags) $(debugflags) $(warnflags) +cxxflags = +optflags = -O3 -fno-fast-math +debugflags = -ggdb3 +warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdiv-by-zero -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wold-style-definition -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef +cppflags = +CCDLFLAGS = -fPIC +CFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC $(ARCH_FLAG) +INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) +DEFS = +CPPFLAGS = -DHAVE_OPENSSL_BIO_H -DHAVE_DTLS_METHOD -DHAVE_SSL_CTX_SET_SESSION_CACHE_MODE -DHAVE_TLS_SERVER_METHOD -DHAVE_SSL_CTX_SET_MIN_PROTO_VERSION -DHAVE_SSL_CTX_SET_DH_AUTO -DHAVE_SSL_CTX_SET_CIPHERSUITES -DHAVE_SSL_GET1_PEER_CERTIFICATE -DHAVE_RANDOM_BYTES -Wdate-time -D_FORTIFY_SOURCE=3 $(DEFS) $(cppflags) +CXXFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 $(ARCH_FLAG) +ldflags = -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed +dldflags = -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now +ARCH_FLAG = +DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) +LDSHARED = $(CC) -shared +LDSHAREDXX = $(CXX) -shared +AR = x86_64-linux-gnu-gcc-ar +EXEEXT = + +RUBY_INSTALL_NAME = $(RUBY_BASE_NAME)3.2 +RUBY_SO_NAME = ruby-3.2 +RUBYW_INSTALL_NAME = +RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) +RUBYW_BASE_NAME = rubyw +RUBY_BASE_NAME = ruby + +arch = x86_64-linux-gnu +sitearch = $(arch) +ruby_version = 3.2.0 +ruby = $(bindir)/$(RUBY_BASE_NAME)3.2 +RUBY = $(ruby) +BUILTRUBY = $(bindir)/$(RUBY_BASE_NAME)3.2 +ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h + +RM = rm -f +RM_RF = rm -fr +RMDIRS = rmdir --ignore-fail-on-non-empty -p +MAKEDIRS = /bin/mkdir -p +INSTALL = /usr/bin/install -c +INSTALL_PROG = $(INSTALL) -m 0755 +INSTALL_DATA = $(INSTALL) -m 644 +COPY = cp +TOUCH = exit > + +#### End of system configuration section. #### + +preload = +libpath = . $(archlibdir) +LIBPATH = -L. -L$(archlibdir) +DEFFILE = + +CLEANFILES = mkmf.log +DISTCLEANFILES = +DISTCLEANDIRS = + +extout = +extout_prefix = +target_prefix = /puma +LOCAL_LIBS = +LIBS = $(LIBRUBYARG_SHARED) -lssl -lcrypto -lm -lpthread -lc +ORIG_SRCS = http11_parser.c mini_ssl.c puma_http11.c +SRCS = $(ORIG_SRCS) +OBJS = http11_parser.o mini_ssl.o puma_http11.o +HDRS = $(srcdir)/ext_help.h $(srcdir)/http11_parser.h +LOCAL_HDRS = +TARGET = puma_http11 +TARGET_NAME = puma_http11 +TARGET_ENTRY = Init_$(TARGET_NAME) +DLLIB = $(TARGET).so +EXTSTATIC = +STATIC_LIB = + +TIMESTAMP_DIR = . +BINDIR = $(bindir) +RUBYCOMMONDIR = $(sitedir)$(target_prefix) +RUBYLIBDIR = $(sitelibdir)$(target_prefix) +RUBYARCHDIR = $(sitearchdir)$(target_prefix) +HDRDIR = $(sitehdrdir)$(target_prefix) +ARCHHDRDIR = $(sitearchhdrdir)$(target_prefix) +TARGET_SO_DIR = +TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) +CLEANLIBS = $(TARGET_SO) false +CLEANOBJS = $(OBJS) *.bak +TARGET_SO_DIR_TIMESTAMP = $(TIMESTAMP_DIR)/.sitearchdir.-.puma.time + +all: $(DLLIB) +static: $(STATIC_LIB) +.PHONY: all install static install-so install-rb +.PHONY: clean clean-so clean-static clean-rb + +clean-static:: +clean-rb-default:: +clean-rb:: +clean-so:: +clean: clean-so clean-static clean-rb-default clean-rb + -$(Q)$(RM_RF) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time + +distclean-rb-default:: +distclean-rb:: +distclean-so:: +distclean-static:: +distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb + -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log + -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) + -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true + +realclean: distclean +install: install-so install-rb + +install-so: $(DLLIB) $(TARGET_SO_DIR_TIMESTAMP) + $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) +clean-static:: + -$(Q)$(RM) $(STATIC_LIB) +install-rb: pre-install-rb do-install-rb install-rb-default +install-rb-default: pre-install-rb-default do-install-rb-default +pre-install-rb: Makefile +pre-install-rb-default: Makefile +do-install-rb: +do-install-rb-default: +pre-install-rb-default: + @$(NULLCMD) +$(TARGET_SO_DIR_TIMESTAMP): + $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) + $(Q) $(TOUCH) $@ + +site-install: site-install-so site-install-rb +site-install-so: install-so +site-install-rb: install-rb + +.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S + +.cc.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cc.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.mm.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.mm.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cxx.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cxx.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cpp.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cpp.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.c.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.c.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.m.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.m.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +$(TARGET_SO): $(OBJS) Makefile + $(ECHO) linking shared-object puma/$(DLLIB) + -$(Q)$(RM) $(@) + $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) + + + +$(OBJS): $(HDRS) $(ruby_headers) diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/PumaHttp11Service.java b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/PumaHttp11Service.java new file mode 100644 index 0000000..00f63aa --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/PumaHttp11Service.java @@ -0,0 +1,17 @@ +package puma; + +import java.io.IOException; + +import org.jruby.Ruby; +import org.jruby.runtime.load.BasicLibraryService; + +import org.jruby.puma.Http11; +import org.jruby.puma.MiniSSL; + +public class PumaHttp11Service implements BasicLibraryService { + public boolean basicLoad(final Ruby runtime) throws IOException { + Http11.createHttp11(runtime); + MiniSSL.createMiniSSL(runtime); + return true; + } +} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/ext_help.h b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/ext_help.h new file mode 100644 index 0000000..ba09e6d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/ext_help.h @@ -0,0 +1,15 @@ +#ifndef ext_help_h +#define ext_help_h + +#define RAISE_NOT_NULL(T) if(T == NULL) rb_raise(rb_eArgError, "%s", "NULL found for " # T " when shouldn't be."); +#define DATA_GET(from,type,data_type,name) TypedData_Get_Struct(from,type,data_type,name); RAISE_NOT_NULL(name); +#define REQUIRE_TYPE(V, T) if(TYPE(V) != T) rb_raise(rb_eTypeError, "%s", "Wrong argument type for " # V " required " # T); +#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) + +#ifdef DEBUG +#define TRACE() fprintf(stderr, "> %s:%d:%s\n", __FILE__, __LINE__, __FUNCTION__) +#else +#define TRACE() +#endif + +#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/extconf.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/extconf.rb new file mode 100644 index 0000000..5748647 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/extconf.rb @@ -0,0 +1,80 @@ +require 'mkmf' + +dir_config("puma_http11") + +if $mingw + append_cflags '-fstack-protector-strong -D_FORTIFY_SOURCE=2' + append_ldflags '-fstack-protector-strong -l:libssp.a' + have_library 'ssp' +end + +unless ENV["PUMA_DISABLE_SSL"] + # don't use pkg_config('openssl') if '--with-openssl-dir' is used + has_openssl_dir = dir_config('openssl').any? || + RbConfig::CONFIG['configure_args']&.include?('openssl') + + found_pkg_config = !has_openssl_dir && pkg_config('openssl') + + found_ssl = if !$mingw && found_pkg_config + puts '──── Using OpenSSL pkgconfig (openssl.pc) ────' + true + elsif have_library('libcrypto', 'BIO_read') && have_library('libssl', 'SSL_CTX_new') + true + elsif %w'crypto libeay32'.find {|crypto| have_library(crypto, 'BIO_read')} && + %w'ssl ssleay32'.find {|ssl| have_library(ssl, 'SSL_CTX_new')} + true + else + puts '** Puma will be compiled without SSL support' + false + end + + if found_ssl + have_header "openssl/bio.h" + + ssl_h = "openssl/ssl.h".freeze + + puts "\n──── Below are yes for 1.0.2 & later ────" + have_func "DTLS_method" , ssl_h + have_func "SSL_CTX_set_session_cache_mode(NULL, 0)", ssl_h + + puts "\n──── Below are yes for 1.1.0 & later ────" + have_func "TLS_server_method" , ssl_h + have_func "SSL_CTX_set_min_proto_version(NULL, 0)" , ssl_h + + puts "\n──── Below is yes for 1.1.0 and later, but isn't documented until 3.0.0 ────" + # https://github.com/openssl/openssl/blob/OpenSSL_1_1_0/include/openssl/ssl.h#L1159 + have_func "SSL_CTX_set_dh_auto(NULL, 0)" , ssl_h + + puts "\n──── Below is yes for 1.1.1 & later ────" + have_func "SSL_CTX_set_ciphersuites(NULL, \"\")" , ssl_h + + puts "\n──── Below is yes for 3.0.0 & later ────" + have_func "SSL_get1_peer_certificate" , ssl_h + + puts '' + + # Random.bytes available in Ruby 2.5 and later, Random::DEFAULT deprecated in 3.0 + if Random.respond_to?(:bytes) + $defs.push "-DHAVE_RANDOM_BYTES" + puts "checking for Random.bytes... yes" + else + puts "checking for Random.bytes... no" + end + end +end + +if ENV["PUMA_MAKE_WARNINGS_INTO_ERRORS"] + # Make all warnings into errors + # Except `implicit-fallthrough` since most failures comes from ragel state machine generated code + if respond_to?(:append_cflags, true) # Ruby 2.5 and later + append_cflags(config_string('WERRORFLAG') || '-Werror') + append_cflags '-Wno-implicit-fallthrough' + else + # flag may not exist on some platforms, -Werror may not be defined on some platforms, but + # works with all in current CI + $CFLAGS << " #{config_string('WERRORFLAG') || '-Werror'}" + $CFLAGS << ' -Wno-implicit-fallthrough' + end +end + +create_makefile("puma/puma_http11") diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.c b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.c new file mode 100644 index 0000000..388a098 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.c @@ -0,0 +1,1057 @@ + +#line 1 "ext/puma_http11/http11_parser.rl" +/** + * Copyright (c) 2005 Zed A. Shaw + * You can redistribute it and/or modify it under the same terms as Ruby. + * License 3-clause BSD + */ +#include "http11_parser.h" +#include +#include +#include +#include +#include + +/* + * capitalizes all lower-case ASCII characters, + * converts dashes to underscores, and underscores to commas. + */ +static void snake_upcase_char(char *c) +{ + if (*c >= 'a' && *c <= 'z') + *c &= ~0x20; + else if (*c == '_') + *c = ','; + else if (*c == '-') + *c = '_'; +} + +#define LEN(AT, FPC) (FPC - buffer - parser->AT) +#define MARK(M,FPC) (parser->M = (FPC) - buffer) +#define PTR_TO(F) (buffer + parser->F) + +/** Machine **/ + + +#line 81 "ext/puma_http11/http11_parser.rl" + + +/** Data **/ + +#line 42 "ext/puma_http11/http11_parser.c" +static const int puma_parser_start = 1; +static const int puma_parser_first_final = 46; +static const int puma_parser_error = 0; + + +#line 85 "ext/puma_http11/http11_parser.rl" + +int puma_parser_init(puma_parser *parser) { + int cs = 0; + +#line 53 "ext/puma_http11/http11_parser.c" + { + cs = puma_parser_start; + } + +#line 89 "ext/puma_http11/http11_parser.rl" + parser->cs = cs; + parser->body_start = 0; + parser->content_len = 0; + parser->mark = 0; + parser->nread = 0; + parser->field_len = 0; + parser->field_start = 0; + parser->request = Qnil; + parser->body = Qnil; + + return 1; +} + + +/** exec **/ +size_t puma_parser_execute(puma_parser *parser, const char *buffer, size_t len, size_t off) { + const char *p, *pe; + int cs = parser->cs; + + assert(off <= len && "offset past end of buffer"); + + p = buffer+off; + pe = buffer+len; + + /* assert(*pe == '\0' && "pointer does not end on NUL"); */ + assert((size_t) (pe - p) == len - off && "pointers aren't same distance"); + + +#line 87 "ext/puma_http11/http11_parser.c" + { + if ( p == pe ) + goto _test_eof; + switch ( cs ) + { +case 1: + switch( (*p) ) { + case 36: goto tr0; + case 95: goto tr0; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto tr0; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto tr0; + } else + goto tr0; + goto st0; +st0: +cs = 0; + goto _out; +tr0: +#line 37 "ext/puma_http11/http11_parser.rl" + { MARK(mark, p); } + goto st2; +st2: + if ( ++p == pe ) + goto _test_eof2; +case 2: +#line 118 "ext/puma_http11/http11_parser.c" + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st27; + case 95: goto st27; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st27; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st27; + } else + goto st27; + goto st0; +tr2: +#line 50 "ext/puma_http11/http11_parser.rl" + { + parser->request_method(parser, PTR_TO(mark), LEN(mark, p)); + } + goto st3; +st3: + if ( ++p == pe ) + goto _test_eof3; +case 3: +#line 143 "ext/puma_http11/http11_parser.c" + switch( (*p) ) { + case 42: goto tr4; + case 43: goto tr5; + case 47: goto tr6; + case 58: goto tr7; + } + if ( (*p) < 65 ) { + if ( 45 <= (*p) && (*p) <= 57 ) + goto tr5; + } else if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto tr5; + } else + goto tr5; + goto st0; +tr4: +#line 37 "ext/puma_http11/http11_parser.rl" + { MARK(mark, p); } + goto st4; +st4: + if ( ++p == pe ) + goto _test_eof4; +case 4: +#line 167 "ext/puma_http11/http11_parser.c" + switch( (*p) ) { + case 32: goto tr8; + case 35: goto tr9; + } + goto st0; +tr8: +#line 53 "ext/puma_http11/http11_parser.rl" + { + parser->request_uri(parser, PTR_TO(mark), LEN(mark, p)); + } + goto st5; +tr31: +#line 37 "ext/puma_http11/http11_parser.rl" + { MARK(mark, p); } +#line 56 "ext/puma_http11/http11_parser.rl" + { + parser->fragment(parser, PTR_TO(mark), LEN(mark, p)); + } + goto st5; +tr33: +#line 56 "ext/puma_http11/http11_parser.rl" + { + parser->fragment(parser, PTR_TO(mark), LEN(mark, p)); + } + goto st5; +tr37: +#line 69 "ext/puma_http11/http11_parser.rl" + { + parser->request_path(parser, PTR_TO(mark), LEN(mark,p)); + } +#line 53 "ext/puma_http11/http11_parser.rl" + { + parser->request_uri(parser, PTR_TO(mark), LEN(mark, p)); + } + goto st5; +tr41: +#line 60 "ext/puma_http11/http11_parser.rl" + { MARK(query_start, p); } +#line 61 "ext/puma_http11/http11_parser.rl" + { + parser->query_string(parser, PTR_TO(query_start), LEN(query_start, p)); + } +#line 53 "ext/puma_http11/http11_parser.rl" + { + parser->request_uri(parser, PTR_TO(mark), LEN(mark, p)); + } + goto st5; +tr44: +#line 61 "ext/puma_http11/http11_parser.rl" + { + parser->query_string(parser, PTR_TO(query_start), LEN(query_start, p)); + } +#line 53 "ext/puma_http11/http11_parser.rl" + { + parser->request_uri(parser, PTR_TO(mark), LEN(mark, p)); + } + goto st5; +st5: + if ( ++p == pe ) + goto _test_eof5; +case 5: +#line 229 "ext/puma_http11/http11_parser.c" + if ( (*p) == 72 ) + goto tr10; + goto st0; +tr10: +#line 37 "ext/puma_http11/http11_parser.rl" + { MARK(mark, p); } + goto st6; +st6: + if ( ++p == pe ) + goto _test_eof6; +case 6: +#line 241 "ext/puma_http11/http11_parser.c" + if ( (*p) == 84 ) + goto st7; + goto st0; +st7: + if ( ++p == pe ) + goto _test_eof7; +case 7: + if ( (*p) == 84 ) + goto st8; + goto st0; +st8: + if ( ++p == pe ) + goto _test_eof8; +case 8: + if ( (*p) == 80 ) + goto st9; + goto st0; +st9: + if ( ++p == pe ) + goto _test_eof9; +case 9: + if ( (*p) == 47 ) + goto st10; + goto st0; +st10: + if ( ++p == pe ) + goto _test_eof10; +case 10: + if ( 48 <= (*p) && (*p) <= 57 ) + goto st11; + goto st0; +st11: + if ( ++p == pe ) + goto _test_eof11; +case 11: + if ( (*p) == 46 ) + goto st12; + if ( 48 <= (*p) && (*p) <= 57 ) + goto st11; + goto st0; +st12: + if ( ++p == pe ) + goto _test_eof12; +case 12: + if ( 48 <= (*p) && (*p) <= 57 ) + goto st13; + goto st0; +st13: + if ( ++p == pe ) + goto _test_eof13; +case 13: + if ( (*p) == 13 ) + goto tr18; + if ( 48 <= (*p) && (*p) <= 57 ) + goto st13; + goto st0; +tr18: +#line 65 "ext/puma_http11/http11_parser.rl" + { + parser->server_protocol(parser, PTR_TO(mark), LEN(mark, p)); + } + goto st14; +tr26: +#line 46 "ext/puma_http11/http11_parser.rl" + { MARK(mark, p); } +#line 47 "ext/puma_http11/http11_parser.rl" + { + parser->http_field(parser, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p)); + } + goto st14; +tr29: +#line 47 "ext/puma_http11/http11_parser.rl" + { + parser->http_field(parser, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p)); + } + goto st14; +st14: + if ( ++p == pe ) + goto _test_eof14; +case 14: +#line 322 "ext/puma_http11/http11_parser.c" + if ( (*p) == 10 ) + goto st15; + goto st0; +st15: + if ( ++p == pe ) + goto _test_eof15; +case 15: + switch( (*p) ) { + case 13: goto st16; + case 33: goto tr21; + case 124: goto tr21; + case 126: goto tr21; + } + if ( (*p) < 45 ) { + if ( (*p) > 39 ) { + if ( 42 <= (*p) && (*p) <= 43 ) + goto tr21; + } else if ( (*p) >= 35 ) + goto tr21; + } else if ( (*p) > 46 ) { + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr21; + } else if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 122 ) + goto tr21; + } else + goto tr21; + } else + goto tr21; + goto st0; +st16: + if ( ++p == pe ) + goto _test_eof16; +case 16: + if ( (*p) == 10 ) + goto tr22; + goto st0; +tr22: +#line 73 "ext/puma_http11/http11_parser.rl" + { + parser->body_start = p - buffer + 1; + parser->header_done(parser, p + 1, pe - p - 1); + {p++; cs = 46; goto _out;} + } + goto st46; +st46: + if ( ++p == pe ) + goto _test_eof46; +case 46: +#line 373 "ext/puma_http11/http11_parser.c" + goto st0; +tr21: +#line 40 "ext/puma_http11/http11_parser.rl" + { MARK(field_start, p); } +#line 41 "ext/puma_http11/http11_parser.rl" + { snake_upcase_char((char *)p); } + goto st17; +tr23: +#line 41 "ext/puma_http11/http11_parser.rl" + { snake_upcase_char((char *)p); } + goto st17; +st17: + if ( ++p == pe ) + goto _test_eof17; +case 17: +#line 389 "ext/puma_http11/http11_parser.c" + switch( (*p) ) { + case 33: goto tr23; + case 58: goto tr24; + case 124: goto tr23; + case 126: goto tr23; + } + if ( (*p) < 45 ) { + if ( (*p) > 39 ) { + if ( 42 <= (*p) && (*p) <= 43 ) + goto tr23; + } else if ( (*p) >= 35 ) + goto tr23; + } else if ( (*p) > 46 ) { + if ( (*p) < 65 ) { + if ( 48 <= (*p) && (*p) <= 57 ) + goto tr23; + } else if ( (*p) > 90 ) { + if ( 94 <= (*p) && (*p) <= 122 ) + goto tr23; + } else + goto tr23; + } else + goto tr23; + goto st0; +tr24: +#line 42 "ext/puma_http11/http11_parser.rl" + { + parser->field_len = LEN(field_start, p); + } + goto st18; +tr27: +#line 46 "ext/puma_http11/http11_parser.rl" + { MARK(mark, p); } + goto st18; +st18: + if ( ++p == pe ) + goto _test_eof18; +case 18: +#line 428 "ext/puma_http11/http11_parser.c" + switch( (*p) ) { + case 13: goto tr26; + case 32: goto tr27; + case 127: goto st0; + } + if ( (*p) > 8 ) { + if ( 10 <= (*p) && (*p) <= 31 ) + goto st0; + } else if ( (*p) >= 0 ) + goto st0; + goto tr25; +tr25: +#line 46 "ext/puma_http11/http11_parser.rl" + { MARK(mark, p); } + goto st19; +st19: + if ( ++p == pe ) + goto _test_eof19; +case 19: +#line 448 "ext/puma_http11/http11_parser.c" + switch( (*p) ) { + case 13: goto tr29; + case 127: goto st0; + } + if ( (*p) > 8 ) { + if ( 10 <= (*p) && (*p) <= 31 ) + goto st0; + } else if ( (*p) >= 0 ) + goto st0; + goto st19; +tr9: +#line 53 "ext/puma_http11/http11_parser.rl" + { + parser->request_uri(parser, PTR_TO(mark), LEN(mark, p)); + } + goto st20; +tr38: +#line 69 "ext/puma_http11/http11_parser.rl" + { + parser->request_path(parser, PTR_TO(mark), LEN(mark,p)); + } +#line 53 "ext/puma_http11/http11_parser.rl" + { + parser->request_uri(parser, PTR_TO(mark), LEN(mark, p)); + } + goto st20; +tr42: +#line 60 "ext/puma_http11/http11_parser.rl" + { MARK(query_start, p); } +#line 61 "ext/puma_http11/http11_parser.rl" + { + parser->query_string(parser, PTR_TO(query_start), LEN(query_start, p)); + } +#line 53 "ext/puma_http11/http11_parser.rl" + { + parser->request_uri(parser, PTR_TO(mark), LEN(mark, p)); + } + goto st20; +tr45: +#line 61 "ext/puma_http11/http11_parser.rl" + { + parser->query_string(parser, PTR_TO(query_start), LEN(query_start, p)); + } +#line 53 "ext/puma_http11/http11_parser.rl" + { + parser->request_uri(parser, PTR_TO(mark), LEN(mark, p)); + } + goto st20; +st20: + if ( ++p == pe ) + goto _test_eof20; +case 20: +#line 501 "ext/puma_http11/http11_parser.c" + switch( (*p) ) { + case 32: goto tr31; + case 60: goto st0; + case 62: goto st0; + case 127: goto st0; + } + if ( (*p) > 31 ) { + if ( 34 <= (*p) && (*p) <= 35 ) + goto st0; + } else if ( (*p) >= 0 ) + goto st0; + goto tr30; +tr30: +#line 37 "ext/puma_http11/http11_parser.rl" + { MARK(mark, p); } + goto st21; +st21: + if ( ++p == pe ) + goto _test_eof21; +case 21: +#line 522 "ext/puma_http11/http11_parser.c" + switch( (*p) ) { + case 32: goto tr33; + case 60: goto st0; + case 62: goto st0; + case 127: goto st0; + } + if ( (*p) > 31 ) { + if ( 34 <= (*p) && (*p) <= 35 ) + goto st0; + } else if ( (*p) >= 0 ) + goto st0; + goto st21; +tr5: +#line 37 "ext/puma_http11/http11_parser.rl" + { MARK(mark, p); } + goto st22; +st22: + if ( ++p == pe ) + goto _test_eof22; +case 22: +#line 543 "ext/puma_http11/http11_parser.c" + switch( (*p) ) { + case 43: goto st22; + case 58: goto st23; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st22; + } else if ( (*p) > 57 ) { + if ( (*p) > 90 ) { + if ( 97 <= (*p) && (*p) <= 122 ) + goto st22; + } else if ( (*p) >= 65 ) + goto st22; + } else + goto st22; + goto st0; +tr7: +#line 37 "ext/puma_http11/http11_parser.rl" + { MARK(mark, p); } + goto st23; +st23: + if ( ++p == pe ) + goto _test_eof23; +case 23: +#line 568 "ext/puma_http11/http11_parser.c" + switch( (*p) ) { + case 32: goto tr8; + case 34: goto st0; + case 35: goto tr9; + case 60: goto st0; + case 62: goto st0; + case 127: goto st0; + } + if ( 0 <= (*p) && (*p) <= 31 ) + goto st0; + goto st23; +tr6: +#line 37 "ext/puma_http11/http11_parser.rl" + { MARK(mark, p); } + goto st24; +st24: + if ( ++p == pe ) + goto _test_eof24; +case 24: +#line 588 "ext/puma_http11/http11_parser.c" + switch( (*p) ) { + case 32: goto tr37; + case 34: goto st0; + case 35: goto tr38; + case 60: goto st0; + case 62: goto st0; + case 63: goto tr39; + case 127: goto st0; + } + if ( 0 <= (*p) && (*p) <= 31 ) + goto st0; + goto st24; +tr39: +#line 69 "ext/puma_http11/http11_parser.rl" + { + parser->request_path(parser, PTR_TO(mark), LEN(mark,p)); + } + goto st25; +st25: + if ( ++p == pe ) + goto _test_eof25; +case 25: +#line 611 "ext/puma_http11/http11_parser.c" + switch( (*p) ) { + case 32: goto tr41; + case 34: goto st0; + case 35: goto tr42; + case 60: goto st0; + case 62: goto st0; + case 127: goto st0; + } + if ( 0 <= (*p) && (*p) <= 31 ) + goto st0; + goto tr40; +tr40: +#line 60 "ext/puma_http11/http11_parser.rl" + { MARK(query_start, p); } + goto st26; +st26: + if ( ++p == pe ) + goto _test_eof26; +case 26: +#line 631 "ext/puma_http11/http11_parser.c" + switch( (*p) ) { + case 32: goto tr44; + case 34: goto st0; + case 35: goto tr45; + case 60: goto st0; + case 62: goto st0; + case 127: goto st0; + } + if ( 0 <= (*p) && (*p) <= 31 ) + goto st0; + goto st26; +st27: + if ( ++p == pe ) + goto _test_eof27; +case 27: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st28; + case 95: goto st28; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st28; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st28; + } else + goto st28; + goto st0; +st28: + if ( ++p == pe ) + goto _test_eof28; +case 28: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st29; + case 95: goto st29; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st29; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st29; + } else + goto st29; + goto st0; +st29: + if ( ++p == pe ) + goto _test_eof29; +case 29: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st30; + case 95: goto st30; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st30; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st30; + } else + goto st30; + goto st0; +st30: + if ( ++p == pe ) + goto _test_eof30; +case 30: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st31; + case 95: goto st31; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st31; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st31; + } else + goto st31; + goto st0; +st31: + if ( ++p == pe ) + goto _test_eof31; +case 31: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st32; + case 95: goto st32; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st32; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st32; + } else + goto st32; + goto st0; +st32: + if ( ++p == pe ) + goto _test_eof32; +case 32: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st33; + case 95: goto st33; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st33; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st33; + } else + goto st33; + goto st0; +st33: + if ( ++p == pe ) + goto _test_eof33; +case 33: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st34; + case 95: goto st34; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st34; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st34; + } else + goto st34; + goto st0; +st34: + if ( ++p == pe ) + goto _test_eof34; +case 34: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st35; + case 95: goto st35; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st35; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st35; + } else + goto st35; + goto st0; +st35: + if ( ++p == pe ) + goto _test_eof35; +case 35: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st36; + case 95: goto st36; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st36; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st36; + } else + goto st36; + goto st0; +st36: + if ( ++p == pe ) + goto _test_eof36; +case 36: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st37; + case 95: goto st37; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st37; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st37; + } else + goto st37; + goto st0; +st37: + if ( ++p == pe ) + goto _test_eof37; +case 37: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st38; + case 95: goto st38; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st38; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st38; + } else + goto st38; + goto st0; +st38: + if ( ++p == pe ) + goto _test_eof38; +case 38: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st39; + case 95: goto st39; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st39; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st39; + } else + goto st39; + goto st0; +st39: + if ( ++p == pe ) + goto _test_eof39; +case 39: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st40; + case 95: goto st40; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st40; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st40; + } else + goto st40; + goto st0; +st40: + if ( ++p == pe ) + goto _test_eof40; +case 40: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st41; + case 95: goto st41; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st41; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st41; + } else + goto st41; + goto st0; +st41: + if ( ++p == pe ) + goto _test_eof41; +case 41: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st42; + case 95: goto st42; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st42; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st42; + } else + goto st42; + goto st0; +st42: + if ( ++p == pe ) + goto _test_eof42; +case 42: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st43; + case 95: goto st43; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st43; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st43; + } else + goto st43; + goto st0; +st43: + if ( ++p == pe ) + goto _test_eof43; +case 43: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st44; + case 95: goto st44; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st44; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st44; + } else + goto st44; + goto st0; +st44: + if ( ++p == pe ) + goto _test_eof44; +case 44: + switch( (*p) ) { + case 32: goto tr2; + case 36: goto st45; + case 95: goto st45; + } + if ( (*p) < 48 ) { + if ( 45 <= (*p) && (*p) <= 46 ) + goto st45; + } else if ( (*p) > 57 ) { + if ( 65 <= (*p) && (*p) <= 90 ) + goto st45; + } else + goto st45; + goto st0; +st45: + if ( ++p == pe ) + goto _test_eof45; +case 45: + if ( (*p) == 32 ) + goto tr2; + goto st0; + } + _test_eof2: cs = 2; goto _test_eof; + _test_eof3: cs = 3; goto _test_eof; + _test_eof4: cs = 4; goto _test_eof; + _test_eof5: cs = 5; goto _test_eof; + _test_eof6: cs = 6; goto _test_eof; + _test_eof7: cs = 7; goto _test_eof; + _test_eof8: cs = 8; goto _test_eof; + _test_eof9: cs = 9; goto _test_eof; + _test_eof10: cs = 10; goto _test_eof; + _test_eof11: cs = 11; goto _test_eof; + _test_eof12: cs = 12; goto _test_eof; + _test_eof13: cs = 13; goto _test_eof; + _test_eof14: cs = 14; goto _test_eof; + _test_eof15: cs = 15; goto _test_eof; + _test_eof16: cs = 16; goto _test_eof; + _test_eof46: cs = 46; goto _test_eof; + _test_eof17: cs = 17; goto _test_eof; + _test_eof18: cs = 18; goto _test_eof; + _test_eof19: cs = 19; goto _test_eof; + _test_eof20: cs = 20; goto _test_eof; + _test_eof21: cs = 21; goto _test_eof; + _test_eof22: cs = 22; goto _test_eof; + _test_eof23: cs = 23; goto _test_eof; + _test_eof24: cs = 24; goto _test_eof; + _test_eof25: cs = 25; goto _test_eof; + _test_eof26: cs = 26; goto _test_eof; + _test_eof27: cs = 27; goto _test_eof; + _test_eof28: cs = 28; goto _test_eof; + _test_eof29: cs = 29; goto _test_eof; + _test_eof30: cs = 30; goto _test_eof; + _test_eof31: cs = 31; goto _test_eof; + _test_eof32: cs = 32; goto _test_eof; + _test_eof33: cs = 33; goto _test_eof; + _test_eof34: cs = 34; goto _test_eof; + _test_eof35: cs = 35; goto _test_eof; + _test_eof36: cs = 36; goto _test_eof; + _test_eof37: cs = 37; goto _test_eof; + _test_eof38: cs = 38; goto _test_eof; + _test_eof39: cs = 39; goto _test_eof; + _test_eof40: cs = 40; goto _test_eof; + _test_eof41: cs = 41; goto _test_eof; + _test_eof42: cs = 42; goto _test_eof; + _test_eof43: cs = 43; goto _test_eof; + _test_eof44: cs = 44; goto _test_eof; + _test_eof45: cs = 45; goto _test_eof; + + _test_eof: {} + _out: {} + } + +#line 117 "ext/puma_http11/http11_parser.rl" + + if (!puma_parser_has_error(parser)) + parser->cs = cs; + parser->nread += p - (buffer + off); + + assert(p <= pe && "buffer overflow after parsing execute"); + assert(parser->nread <= len && "nread longer than length"); + assert(parser->body_start <= len && "body starts after buffer end"); + assert(parser->mark < len && "mark is after buffer end"); + assert(parser->field_len <= len && "field has length longer than whole buffer"); + assert(parser->field_start < len && "field starts after buffer end"); + + return(parser->nread); +} + +int puma_parser_finish(puma_parser *parser) +{ + if (puma_parser_has_error(parser) ) { + return -1; + } else if (puma_parser_is_finished(parser) ) { + return 1; + } else { + return 0; + } +} + +int puma_parser_has_error(puma_parser *parser) { + return parser->cs == puma_parser_error; +} + +int puma_parser_is_finished(puma_parser *parser) { + return parser->cs >= puma_parser_first_final; +} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.h b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.h new file mode 100644 index 0000000..e0545a9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.h @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2005 Zed A. Shaw + * You can redistribute it and/or modify it under the same terms as Ruby. + * License 3-clause BSD + */ + +#ifndef http11_parser_h +#define http11_parser_h + +#define RSTRING_NOT_MODIFIED 1 +#include "ruby.h" + +#include + +#if defined(_WIN32) +#include +#endif + +#define BUFFER_LEN 1024 + +struct puma_parser; + +typedef void (*element_cb)(struct puma_parser* hp, + const char *at, size_t length); + +typedef void (*field_cb)(struct puma_parser* hp, + const char *field, size_t flen, + const char *value, size_t vlen); + +typedef struct puma_parser { + int cs; + int content_len; + size_t body_start; + size_t nread; + size_t mark; + size_t field_start; + size_t field_len; + size_t query_start; + + VALUE request; + VALUE body; + + field_cb http_field; + element_cb request_method; + element_cb request_uri; + element_cb fragment; + element_cb request_path; + element_cb query_string; + element_cb server_protocol; + element_cb header_done; + + char buf[BUFFER_LEN]; + +} puma_parser; + +int puma_parser_init(puma_parser *parser); +int puma_parser_finish(puma_parser *parser); +size_t puma_parser_execute(puma_parser *parser, const char *data, + size_t len, size_t off); +int puma_parser_has_error(puma_parser *parser); +int puma_parser_is_finished(puma_parser *parser); + +#define puma_parser_nread(parser) (parser)->nread + +#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.java.rl b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.java.rl new file mode 100644 index 0000000..c5cb658 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.java.rl @@ -0,0 +1,145 @@ +package org.jruby.puma; + +import org.jruby.Ruby; +import org.jruby.RubyHash; +import org.jruby.util.ByteList; + +public class Http11Parser { + +/** Machine **/ + +%%{ + + machine puma_parser; + + action mark {parser.mark = fpc; } + + action start_field { parser.field_start = fpc; } + action snake_upcase_field { /* FIXME stub */ } + action write_field { + parser.field_len = fpc-parser.field_start; + } + + action start_value { parser.mark = fpc; } + action write_value { + Http11.http_field(runtime, parser.data, parser.buffer, parser.field_start, parser.field_len, parser.mark, fpc-parser.mark); + } + action request_method { + Http11.request_method(runtime, parser.data, parser.buffer, parser.mark, fpc-parser.mark); + } + action request_uri { + Http11.request_uri(runtime, parser.data, parser.buffer, parser.mark, fpc-parser.mark); + } + action fragment { + Http11.fragment(runtime, parser.data, parser.buffer, parser.mark, fpc-parser.mark); + } + + action start_query {parser.query_start = fpc; } + action query_string { + Http11.query_string(runtime, parser.data, parser.buffer, parser.query_start, fpc-parser.query_start); + } + + action server_protocol { + Http11.server_protocol(runtime, parser.data, parser.buffer, parser.mark, fpc-parser.mark); + } + + action request_path { + Http11.request_path(runtime, parser.data, parser.buffer, parser.mark, fpc-parser.mark); + } + + action done { + parser.body_start = fpc + 1; + http.header_done(runtime, parser.data, parser.buffer, fpc + 1, pe - fpc - 1); + fbreak; + } + + include puma_parser_common "http11_parser_common.rl"; + +}%% + +/** Data **/ +%% write data noentry; + + public static interface ElementCB { + public void call(Ruby runtime, RubyHash data, ByteList buffer, int at, int length); + } + + public static interface FieldCB { + public void call(Ruby runtime, RubyHash data, ByteList buffer, int field, int flen, int value, int vlen); + } + + public static class HttpParser { + int cs; + int body_start; + int content_len; + int nread; + int mark; + int field_start; + int field_len; + int query_start; + + RubyHash data; + ByteList buffer; + + public void init() { + cs = 0; + + %% write init; + + body_start = 0; + content_len = 0; + mark = 0; + nread = 0; + field_len = 0; + field_start = 0; + } + } + + public final HttpParser parser = new HttpParser(); + + public int execute(Ruby runtime, Http11 http, ByteList buffer, int off) { + int p, pe; + int cs = parser.cs; + int len = buffer.length(); + assert off<=len : "offset past end of buffer"; + + p = off; + pe = len; + // get a copy of the bytes, since it may not start at 0 + // FIXME: figure out how to just use the bytes in-place + byte[] data = buffer.bytes(); + parser.buffer = buffer; + + %% write exec; + + parser.cs = cs; + parser.nread += (p - off); + + assert p <= pe : "buffer overflow after parsing execute"; + assert parser.nread <= len : "nread longer than length"; + assert parser.body_start <= len : "body starts after buffer end"; + assert parser.mark < len : "mark is after buffer end"; + assert parser.field_len <= len : "field has length longer than whole buffer"; + assert parser.field_start < len : "field starts after buffer end"; + + return parser.nread; + } + + public int finish() { + if(has_error()) { + return -1; + } else if(is_finished()) { + return 1; + } else { + return 0; + } + } + + public boolean has_error() { + return parser.cs == puma_parser_error; + } + + public boolean is_finished() { + return parser.cs == puma_parser_first_final; + } +} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.rl b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.rl new file mode 100644 index 0000000..f1ef5a1 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.rl @@ -0,0 +1,149 @@ +/** + * Copyright (c) 2005 Zed A. Shaw + * You can redistribute it and/or modify it under the same terms as Ruby. + * License 3-clause BSD + */ +#include "http11_parser.h" +#include +#include +#include +#include +#include + +/* + * capitalizes all lower-case ASCII characters, + * converts dashes to underscores, and underscores to commas. + */ +static void snake_upcase_char(char *c) +{ + if (*c >= 'a' && *c <= 'z') + *c &= ~0x20; + else if (*c == '_') + *c = ','; + else if (*c == '-') + *c = '_'; +} + +#define LEN(AT, FPC) (FPC - buffer - parser->AT) +#define MARK(M,FPC) (parser->M = (FPC) - buffer) +#define PTR_TO(F) (buffer + parser->F) + +/** Machine **/ + +%%{ + + machine puma_parser; + + action mark { MARK(mark, fpc); } + + + action start_field { MARK(field_start, fpc); } + action snake_upcase_field { snake_upcase_char((char *)fpc); } + action write_field { + parser->field_len = LEN(field_start, fpc); + } + + action start_value { MARK(mark, fpc); } + action write_value { + parser->http_field(parser, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, fpc)); + } + action request_method { + parser->request_method(parser, PTR_TO(mark), LEN(mark, fpc)); + } + action request_uri { + parser->request_uri(parser, PTR_TO(mark), LEN(mark, fpc)); + } + action fragment { + parser->fragment(parser, PTR_TO(mark), LEN(mark, fpc)); + } + + action start_query { MARK(query_start, fpc); } + action query_string { + parser->query_string(parser, PTR_TO(query_start), LEN(query_start, fpc)); + } + + action server_protocol { + parser->server_protocol(parser, PTR_TO(mark), LEN(mark, fpc)); + } + + action request_path { + parser->request_path(parser, PTR_TO(mark), LEN(mark,fpc)); + } + + action done { + parser->body_start = fpc - buffer + 1; + parser->header_done(parser, fpc + 1, pe - fpc - 1); + fbreak; + } + + include puma_parser_common "http11_parser_common.rl"; + +}%% + +/** Data **/ +%% write data noentry; + +int puma_parser_init(puma_parser *parser) { + int cs = 0; + %% write init; + parser->cs = cs; + parser->body_start = 0; + parser->content_len = 0; + parser->mark = 0; + parser->nread = 0; + parser->field_len = 0; + parser->field_start = 0; + parser->request = Qnil; + parser->body = Qnil; + + return 1; +} + + +/** exec **/ +size_t puma_parser_execute(puma_parser *parser, const char *buffer, size_t len, size_t off) { + const char *p, *pe; + int cs = parser->cs; + + assert(off <= len && "offset past end of buffer"); + + p = buffer+off; + pe = buffer+len; + + /* assert(*pe == '\0' && "pointer does not end on NUL"); */ + assert((size_t) (pe - p) == len - off && "pointers aren't same distance"); + + %% write exec; + + if (!puma_parser_has_error(parser)) + parser->cs = cs; + parser->nread += p - (buffer + off); + + assert(p <= pe && "buffer overflow after parsing execute"); + assert(parser->nread <= len && "nread longer than length"); + assert(parser->body_start <= len && "body starts after buffer end"); + assert(parser->mark < len && "mark is after buffer end"); + assert(parser->field_len <= len && "field has length longer than whole buffer"); + assert(parser->field_start < len && "field starts after buffer end"); + + return(parser->nread); +} + +int puma_parser_finish(puma_parser *parser) +{ + if (puma_parser_has_error(parser) ) { + return -1; + } else if (puma_parser_is_finished(parser) ) { + return 1; + } else { + return 0; + } +} + +int puma_parser_has_error(puma_parser *parser) { + return parser->cs == puma_parser_error; +} + +int puma_parser_is_finished(puma_parser *parser) { + return parser->cs >= puma_parser_first_final; +} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser_common.rl b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser_common.rl new file mode 100644 index 0000000..d61aafa --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser_common.rl @@ -0,0 +1,54 @@ +%%{ + + machine puma_parser_common; + +#### HTTP PROTOCOL GRAMMAR +# line endings + CRLF = "\r\n"; + +# character types + CTL = (cntrl | 127); + safe = ("$" | "-" | "_" | "."); + extra = ("!" | "*" | "'" | "(" | ")" | ","); + reserved = (";" | "/" | "?" | ":" | "@" | "&" | "=" | "+"); + unsafe = (CTL | " " | "\"" | "#" | "%" | "<" | ">"); + national = any -- (alpha | digit | reserved | extra | safe | unsafe); + unreserved = (alpha | digit | safe | extra | national); + escape = ("%" xdigit xdigit); + uchar = (unreserved | escape | "%"); + pchar = (uchar | ":" | "@" | "&" | "=" | "+" | ";"); + tspecials = ("(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\\" | "\"" | "/" | "[" | "]" | "?" | "=" | "{" | "}" | " " | "\t"); + +# elements + token = (ascii -- (CTL | tspecials)); + +# URI schemes and absolute paths + scheme = ( alpha | digit | "+" | "-" | "." )* ; + absolute_uri = (scheme ":" (uchar | reserved )*); + + path = ( pchar+ ( "/" pchar* )* ) ; + query = ( uchar | reserved )* %query_string ; + param = ( pchar | "/" )* ; + params = ( param ( ";" param )* ) ; + rel_path = ( path? %request_path ) ("?" %start_query query)?; + absolute_path = ( "/"+ rel_path ); + + Request_URI = ( "*" | absolute_uri | absolute_path ) >mark %request_uri; + Fragment = ( uchar | reserved )* >mark %fragment; + Method = ( upper | digit | safe ){1,20} >mark %request_method; + + http_number = ( digit+ "." digit+ ) ; + Server_Protocol = ( "HTTP/" http_number ) >mark %server_protocol ; + Request_Line = ( Method " " Request_URI ("#" Fragment){0,1} " " Server_Protocol CRLF ) ; + + field_name = ( token -- ":" )+ >start_field $snake_upcase_field %write_field; + + field_value = ( (any -- CTL) | "\t" )* >start_value %write_value; + + message_header = field_name ":" " "* field_value :> CRLF; + + Request = Request_Line ( message_header )* ( CRLF @done ); + +main := Request; + +}%% diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/mini_ssl.c b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/mini_ssl.c new file mode 100644 index 0000000..dc5a77f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/mini_ssl.c @@ -0,0 +1,842 @@ +#define RSTRING_NOT_MODIFIED 1 + +#include +#include +#include + +#ifdef HAVE_OPENSSL_BIO_H + +#include +#include +#include +#include +#include + +#ifndef SSL_OP_NO_COMPRESSION +#define SSL_OP_NO_COMPRESSION 0 +#endif + +typedef struct { + BIO* read; + BIO* write; + SSL* ssl; + SSL_CTX* ctx; +} ms_conn; + +typedef struct { + unsigned char* buf; + int bytes; +} ms_cert_buf; + +VALUE eError; + +NORETURN(void raise_file_error(const char* caller, const char *filename)); + +void raise_file_error(const char* caller, const char *filename) { + rb_raise(eError, "%s: error in file '%s': %s", caller, filename, ERR_error_string(ERR_get_error(), NULL)); +} + +NORETURN(void raise_param_error(const char* caller, const char *param)); + +void raise_param_error(const char* caller, const char *param) { + rb_raise(eError, "%s: error with parameter '%s': %s", caller, param, ERR_error_string(ERR_get_error(), NULL)); +} + +void engine_free(void *ptr) { + ms_conn *conn = ptr; + ms_cert_buf* cert_buf = (ms_cert_buf*)SSL_get_app_data(conn->ssl); + if(cert_buf) { + OPENSSL_free(cert_buf->buf); + free(cert_buf); + } + SSL_free(conn->ssl); + SSL_CTX_free(conn->ctx); + + free(conn); +} + +const rb_data_type_t engine_data_type = { + "MiniSSL/ENGINE", + { 0, engine_free, 0 }, + 0, 0, RUBY_TYPED_FREE_IMMEDIATELY, +}; + +#ifndef HAVE_SSL_CTX_SET_DH_AUTO +DH *get_dh2048(void) { + /* `openssl dhparam -C 2048` + * -----BEGIN DH PARAMETERS----- + * MIIBCAKCAQEAjmh1uQHdTfxOyxEbKAV30fUfzqMDF/ChPzjfyzl2jcrqQMhrk76o + * 2NPNXqxHwsddMZ1RzvU8/jl+uhRuPWjXCFZbhET4N1vrviZM3VJhV8PPHuiVOACO + * y32jFd+Szx4bo2cXSK83hJ6jRd+0asP1awWjz9/06dFkrILCXMIfQLo0D8rqmppn + * EfDDAwuudCpM9kcDmBRAm9JsKbQ6gzZWjkc5+QWSaQofojIHbjvj3xzguaCJn+oQ + * vHWM+hsAnaOgEwCyeZ3xqs+/5lwSbkE/tqJW98cEZGygBUVo9jxZRZx6KOfjpdrb + * yenO9LJr/qtyrZB31WJbqxI0m0AKTAO8UwIBAg== + * -----END DH PARAMETERS----- + */ + static unsigned char dh2048_p[] = { + 0x8E, 0x68, 0x75, 0xB9, 0x01, 0xDD, 0x4D, 0xFC, 0x4E, 0xCB, + 0x11, 0x1B, 0x28, 0x05, 0x77, 0xD1, 0xF5, 0x1F, 0xCE, 0xA3, + 0x03, 0x17, 0xF0, 0xA1, 0x3F, 0x38, 0xDF, 0xCB, 0x39, 0x76, + 0x8D, 0xCA, 0xEA, 0x40, 0xC8, 0x6B, 0x93, 0xBE, 0xA8, 0xD8, + 0xD3, 0xCD, 0x5E, 0xAC, 0x47, 0xC2, 0xC7, 0x5D, 0x31, 0x9D, + 0x51, 0xCE, 0xF5, 0x3C, 0xFE, 0x39, 0x7E, 0xBA, 0x14, 0x6E, + 0x3D, 0x68, 0xD7, 0x08, 0x56, 0x5B, 0x84, 0x44, 0xF8, 0x37, + 0x5B, 0xEB, 0xBE, 0x26, 0x4C, 0xDD, 0x52, 0x61, 0x57, 0xC3, + 0xCF, 0x1E, 0xE8, 0x95, 0x38, 0x00, 0x8E, 0xCB, 0x7D, 0xA3, + 0x15, 0xDF, 0x92, 0xCF, 0x1E, 0x1B, 0xA3, 0x67, 0x17, 0x48, + 0xAF, 0x37, 0x84, 0x9E, 0xA3, 0x45, 0xDF, 0xB4, 0x6A, 0xC3, + 0xF5, 0x6B, 0x05, 0xA3, 0xCF, 0xDF, 0xF4, 0xE9, 0xD1, 0x64, + 0xAC, 0x82, 0xC2, 0x5C, 0xC2, 0x1F, 0x40, 0xBA, 0x34, 0x0F, + 0xCA, 0xEA, 0x9A, 0x9A, 0x67, 0x11, 0xF0, 0xC3, 0x03, 0x0B, + 0xAE, 0x74, 0x2A, 0x4C, 0xF6, 0x47, 0x03, 0x98, 0x14, 0x40, + 0x9B, 0xD2, 0x6C, 0x29, 0xB4, 0x3A, 0x83, 0x36, 0x56, 0x8E, + 0x47, 0x39, 0xF9, 0x05, 0x92, 0x69, 0x0A, 0x1F, 0xA2, 0x32, + 0x07, 0x6E, 0x3B, 0xE3, 0xDF, 0x1C, 0xE0, 0xB9, 0xA0, 0x89, + 0x9F, 0xEA, 0x10, 0xBC, 0x75, 0x8C, 0xFA, 0x1B, 0x00, 0x9D, + 0xA3, 0xA0, 0x13, 0x00, 0xB2, 0x79, 0x9D, 0xF1, 0xAA, 0xCF, + 0xBF, 0xE6, 0x5C, 0x12, 0x6E, 0x41, 0x3F, 0xB6, 0xA2, 0x56, + 0xF7, 0xC7, 0x04, 0x64, 0x6C, 0xA0, 0x05, 0x45, 0x68, 0xF6, + 0x3C, 0x59, 0x45, 0x9C, 0x7A, 0x28, 0xE7, 0xE3, 0xA5, 0xDA, + 0xDB, 0xC9, 0xE9, 0xCE, 0xF4, 0xB2, 0x6B, 0xFE, 0xAB, 0x72, + 0xAD, 0x90, 0x77, 0xD5, 0x62, 0x5B, 0xAB, 0x12, 0x34, 0x9B, + 0x40, 0x0A, 0x4C, 0x03, 0xBC, 0x53 + }; + static unsigned char dh2048_g[] = { 0x02 }; + + DH *dh; +#if !(OPENSSL_VERSION_NUMBER < 0x10100005L) + BIGNUM *p, *g; +#endif + + dh = DH_new(); + +#if OPENSSL_VERSION_NUMBER < 0x10100005L + dh->p = BN_bin2bn(dh2048_p, sizeof(dh2048_p), NULL); + dh->g = BN_bin2bn(dh2048_g, sizeof(dh2048_g), NULL); + + if ((dh->p == NULL) || (dh->g == NULL)) { + DH_free(dh); + return NULL; + } +#else + p = BN_bin2bn(dh2048_p, sizeof(dh2048_p), NULL); + g = BN_bin2bn(dh2048_g, sizeof(dh2048_g), NULL); + + if (p == NULL || g == NULL || !DH_set0_pqg(dh, p, NULL, g)) { + DH_free(dh); + BN_free(p); + BN_free(g); + return NULL; + } +#endif + + return dh; +} +#endif + +static void +sslctx_free(void *ptr) { + SSL_CTX *ctx = ptr; + SSL_CTX_free(ctx); +} + +static const rb_data_type_t sslctx_type = { + "MiniSSL/SSLContext", + { + 0, sslctx_free, + }, + 0, 0, RUBY_TYPED_FREE_IMMEDIATELY, +}; + +ms_conn* engine_alloc(VALUE klass, VALUE* obj) { + ms_conn* conn; + + *obj = TypedData_Make_Struct(klass, ms_conn, &engine_data_type, conn); + + conn->read = BIO_new(BIO_s_mem()); + BIO_set_nbio(conn->read, 1); + + conn->write = BIO_new(BIO_s_mem()); + BIO_set_nbio(conn->write, 1); + + conn->ssl = 0; + conn->ctx = 0; + + return conn; +} + +static int engine_verify_callback(int preverify_ok, X509_STORE_CTX* ctx) { + X509* err_cert; + SSL* ssl; + int bytes; + unsigned char* buf = NULL; + + if(!preverify_ok) { + err_cert = X509_STORE_CTX_get_current_cert(ctx); + if(err_cert) { + /* + * Save the failed certificate for inspection/logging. + */ + bytes = i2d_X509(err_cert, &buf); + if(bytes > 0) { + ms_cert_buf* cert_buf = (ms_cert_buf*)malloc(sizeof(ms_cert_buf)); + cert_buf->buf = buf; + cert_buf->bytes = bytes; + ssl = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()); + SSL_set_app_data(ssl, cert_buf); + } + } + } + + return preverify_ok; +} + +static int password_callback(char *buf, int size, int rwflag, void *userdata) { + const char *password = (const char *) userdata; + size_t len = strlen(password); + + if (len > (size_t) size) { + return 0; + } + + memcpy(buf, password, len); + return (int) len; +} + +static VALUE +sslctx_alloc(VALUE klass) { + SSL_CTX *ctx; + long mode = 0 | + SSL_MODE_ENABLE_PARTIAL_WRITE | + SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER | + SSL_MODE_RELEASE_BUFFERS; + +#ifdef HAVE_TLS_SERVER_METHOD + ctx = SSL_CTX_new(TLS_method()); + // printf("\nctx using TLS_method security_level %d\n", SSL_CTX_get_security_level(ctx)); +#else + ctx = SSL_CTX_new(SSLv23_method()); +#endif + if (!ctx) { + rb_raise(eError, "SSL_CTX_new"); + } + SSL_CTX_set_mode(ctx, mode); + + return TypedData_Wrap_Struct(klass, &sslctx_type, ctx); +} + +VALUE +sslctx_initialize(VALUE self, VALUE mini_ssl_ctx) { + SSL_CTX* ctx; + int ssl_options; + VALUE key, cert, ca, verify_mode, ssl_cipher_filter, ssl_ciphersuites, no_tlsv1, no_tlsv1_1, + verification_flags, session_id_bytes, cert_pem, key_pem, key_password_command, key_password; + BIO *bio; + X509 *x509 = NULL; + EVP_PKEY *pkey; + pem_password_cb *password_cb = NULL; + const char *password = NULL; +#ifdef HAVE_SSL_CTX_SET_MIN_PROTO_VERSION + int min; +#endif +#ifndef HAVE_SSL_CTX_SET_DH_AUTO + DH *dh; +#endif +#if OPENSSL_VERSION_NUMBER < 0x10002000L + EC_KEY *ecdh; +#endif +#ifdef HAVE_SSL_CTX_SET_SESSION_CACHE_MODE + VALUE reuse, reuse_cache_size, reuse_timeout; + + reuse = rb_funcall(mini_ssl_ctx, rb_intern_const("reuse"), 0); + reuse_cache_size = rb_funcall(mini_ssl_ctx, rb_intern_const("reuse_cache_size"), 0); + reuse_timeout = rb_funcall(mini_ssl_ctx, rb_intern_const("reuse_timeout"), 0); +#endif + + key = rb_funcall(mini_ssl_ctx, rb_intern_const("key"), 0); + + key_password_command = rb_funcall(mini_ssl_ctx, rb_intern_const("key_password_command"), 0); + + cert = rb_funcall(mini_ssl_ctx, rb_intern_const("cert"), 0); + + ca = rb_funcall(mini_ssl_ctx, rb_intern_const("ca"), 0); + + cert_pem = rb_funcall(mini_ssl_ctx, rb_intern_const("cert_pem"), 0); + + key_pem = rb_funcall(mini_ssl_ctx, rb_intern_const("key_pem"), 0); + + verify_mode = rb_funcall(mini_ssl_ctx, rb_intern_const("verify_mode"), 0); + + ssl_cipher_filter = rb_funcall(mini_ssl_ctx, rb_intern_const("ssl_cipher_filter"), 0); + + ssl_ciphersuites = rb_funcall(mini_ssl_ctx, rb_intern_const("ssl_ciphersuites"), 0); + + no_tlsv1 = rb_funcall(mini_ssl_ctx, rb_intern_const("no_tlsv1"), 0); + + no_tlsv1_1 = rb_funcall(mini_ssl_ctx, rb_intern_const("no_tlsv1_1"), 0); + + TypedData_Get_Struct(self, SSL_CTX, &sslctx_type, ctx); + + if (!NIL_P(cert)) { + StringValue(cert); + + if (SSL_CTX_use_certificate_chain_file(ctx, RSTRING_PTR(cert)) != 1) { + raise_file_error("SSL_CTX_use_certificate_chain_file", RSTRING_PTR(cert)); + } + } + + if (!NIL_P(key_password_command)) { + key_password = rb_funcall(mini_ssl_ctx, rb_intern_const("key_password"), 0); + + if (!NIL_P(key_password)) { + StringValue(key_password); + password_cb = password_callback; + password = RSTRING_PTR(key_password); + SSL_CTX_set_default_passwd_cb(ctx, password_cb); + SSL_CTX_set_default_passwd_cb_userdata(ctx, (void *) password); + } + } + + if (!NIL_P(key)) { + StringValue(key); + + if (SSL_CTX_use_PrivateKey_file(ctx, RSTRING_PTR(key), SSL_FILETYPE_PEM) != 1) { + raise_file_error("SSL_CTX_use_PrivateKey_file", RSTRING_PTR(key)); + } + } + + if (!NIL_P(cert_pem)) { + X509 *ca = NULL; + unsigned long err; + + bio = BIO_new(BIO_s_mem()); + BIO_puts(bio, RSTRING_PTR(cert_pem)); + + /** + * Much of this pulled as a simplified version of the `use_certificate_chain_file` method + * from openssl's `ssl_rsa.c` file. + */ + + /* first read the cert as the first item in the pem file */ + x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL); + if (NULL == x509) { + BIO_free_all(bio); + raise_param_error("PEM_read_bio_X509", "cert_pem"); + } + + /* Add the cert to the context */ + /* 1 is success - otherwise check the error codes */ + if (1 != SSL_CTX_use_certificate(ctx, x509)) { + BIO_free_all(bio); + raise_param_error("SSL_CTX_use_certificate", "cert_pem"); + } + + X509_free(x509); /* no longer need our reference */ + + /* Now lets load up the rest of the certificate chain */ + /* 1 is success 0 is error */ + if (0 == SSL_CTX_clear_chain_certs(ctx)) { + BIO_free_all(bio); + raise_param_error("SSL_CTX_clear_chain_certs","cert_pem"); + } + + while (1) { + ca = PEM_read_bio_X509(bio, NULL, NULL, NULL); + + if (NULL == ca) { + break; + } + + if (0 == SSL_CTX_add0_chain_cert(ctx, ca)) { + BIO_free_all(bio); + raise_param_error("SSL_CTX_add0_chain_cert","cert_pem"); + } + /* don't free ca - its now owned by the context */ + } + + /* ca is NULL - so its either the end of the file or an error */ + err = ERR_peek_last_error(); + + /* If its the end of the file - then we are done, in any case free the bio */ + BIO_free_all(bio); + + if ((ERR_GET_LIB(err) == ERR_LIB_PEM) && (ERR_GET_REASON(err) == PEM_R_NO_START_LINE)) { + ERR_clear_error(); + } else { + raise_param_error("PEM_read_bio_X509","cert_pem"); + } + } + + if (!NIL_P(key_pem)) { + bio = BIO_new(BIO_s_mem()); + BIO_puts(bio, RSTRING_PTR(key_pem)); + pkey = PEM_read_bio_PrivateKey(bio, NULL, password_cb, (void *) password); + + if (SSL_CTX_use_PrivateKey(ctx, pkey) != 1) { + BIO_free(bio); + raise_file_error("SSL_CTX_use_PrivateKey", RSTRING_PTR(key_pem)); + } + EVP_PKEY_free(pkey); + BIO_free(bio); + } + + verification_flags = rb_funcall(mini_ssl_ctx, rb_intern_const("verification_flags"), 0); + + if (!NIL_P(verification_flags)) { + X509_VERIFY_PARAM *param = SSL_CTX_get0_param(ctx); + X509_VERIFY_PARAM_set_flags(param, NUM2INT(verification_flags)); + SSL_CTX_set1_param(ctx, param); + } + + if (!NIL_P(ca)) { + StringValue(ca); + if (SSL_CTX_load_verify_locations(ctx, RSTRING_PTR(ca), NULL) != 1) { + raise_file_error("SSL_CTX_load_verify_locations", RSTRING_PTR(ca)); + } + } + + ssl_options = SSL_OP_CIPHER_SERVER_PREFERENCE | SSL_OP_SINGLE_ECDH_USE | SSL_OP_NO_COMPRESSION; + +#ifdef HAVE_SSL_CTX_SET_MIN_PROTO_VERSION + if (RTEST(no_tlsv1_1)) { + min = TLS1_2_VERSION; + } + else if (RTEST(no_tlsv1)) { + min = TLS1_1_VERSION; + } + else { + min = TLS1_VERSION; + } + + SSL_CTX_set_min_proto_version(ctx, min); + +#else + /* As of 1.0.2f, SSL_OP_SINGLE_DH_USE key use is always on */ + ssl_options |= SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_SINGLE_DH_USE; + + if (RTEST(no_tlsv1)) { + ssl_options |= SSL_OP_NO_TLSv1; + } + if(RTEST(no_tlsv1_1)) { + ssl_options |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1; + } +#endif + +#ifdef HAVE_SSL_CTX_SET_SESSION_CACHE_MODE + if (!NIL_P(reuse)) { + SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_SERVER); + if (!NIL_P(reuse_cache_size)) { + SSL_CTX_sess_set_cache_size(ctx, NUM2INT(reuse_cache_size)); + } + if (!NIL_P(reuse_timeout)) { + SSL_CTX_set_timeout(ctx, NUM2INT(reuse_timeout)); + } + } else { + SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF); + } +#endif + + SSL_CTX_set_options(ctx, ssl_options); + + if (!NIL_P(ssl_cipher_filter)) { + StringValue(ssl_cipher_filter); + SSL_CTX_set_cipher_list(ctx, RSTRING_PTR(ssl_cipher_filter)); + } + else { + SSL_CTX_set_cipher_list(ctx, "HIGH:!aNULL@STRENGTH"); + } + +#if HAVE_SSL_CTX_SET_CIPHERSUITES + // Only override OpenSSL default ciphersuites if config option is supplied. + if (!NIL_P(ssl_ciphersuites)) { + StringValue(ssl_ciphersuites); + SSL_CTX_set_ciphersuites(ctx, RSTRING_PTR(ssl_ciphersuites)); + } +#endif + +#if OPENSSL_VERSION_NUMBER < 0x10002000L + // Remove this case if OpenSSL 1.0.1 (now EOL) support is no longer needed. + ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); + if (ecdh) { + SSL_CTX_set_tmp_ecdh(ctx, ecdh); + EC_KEY_free(ecdh); + } +#elif OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) + SSL_CTX_set_ecdh_auto(ctx, 1); +#endif + + if (NIL_P(verify_mode)) { + /* SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL); */ + } else { + SSL_CTX_set_verify(ctx, NUM2INT(verify_mode), engine_verify_callback); + } + + // Random.bytes available in Ruby 2.5 and later, Random::DEFAULT deprecated in 3.0 + session_id_bytes = rb_funcall( +#ifdef HAVE_RANDOM_BYTES + rb_cRandom, +#else + rb_const_get(rb_cRandom, rb_intern_const("DEFAULT")), +#endif + rb_intern_const("bytes"), + 1, ULL2NUM(SSL_MAX_SSL_SESSION_ID_LENGTH)); + + SSL_CTX_set_session_id_context(ctx, + (unsigned char *) RSTRING_PTR(session_id_bytes), + SSL_MAX_SSL_SESSION_ID_LENGTH); + + // printf("\ninitialize end security_level %d\n", SSL_CTX_get_security_level(ctx)); + +#ifdef HAVE_SSL_CTX_SET_DH_AUTO + // https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_dh_auto.html + SSL_CTX_set_dh_auto(ctx, 1); +#else + dh = get_dh2048(); + SSL_CTX_set_tmp_dh(ctx, dh); +#endif + + rb_obj_freeze(self); + return self; +} + +VALUE engine_init_server(VALUE self, VALUE sslctx) { + ms_conn* conn; + VALUE obj; + SSL_CTX* ctx; + SSL* ssl; + + conn = engine_alloc(self, &obj); + + TypedData_Get_Struct(sslctx, SSL_CTX, &sslctx_type, ctx); + + ssl = SSL_new(ctx); + conn->ssl = ssl; + SSL_set_app_data(ssl, NULL); + SSL_set_bio(ssl, conn->read, conn->write); + SSL_set_accept_state(ssl); + return obj; +} + +VALUE engine_init_client(VALUE klass) { + VALUE obj; + ms_conn* conn = engine_alloc(klass, &obj); +#ifdef HAVE_DTLS_METHOD + conn->ctx = SSL_CTX_new(DTLS_method()); +#else + conn->ctx = SSL_CTX_new(DTLSv1_method()); +#endif + conn->ssl = SSL_new(conn->ctx); + SSL_set_app_data(conn->ssl, NULL); + SSL_set_verify(conn->ssl, SSL_VERIFY_NONE, NULL); + + SSL_set_bio(conn->ssl, conn->read, conn->write); + + SSL_set_connect_state(conn->ssl); + return obj; +} + +VALUE engine_inject(VALUE self, VALUE str) { + ms_conn* conn; + long used; + + TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn); + + StringValue(str); + + used = BIO_write(conn->read, RSTRING_PTR(str), (int)RSTRING_LEN(str)); + + if(used == 0 || used == -1) { + return Qfalse; + } + + return INT2FIX(used); +} + +NORETURN(void raise_error(SSL* ssl, int result)); + +void raise_error(SSL* ssl, int result) { + char buf[512]; + char msg[768]; + const char* err_str; + int err = errno; + int mask = 4095; + int ssl_err = SSL_get_error(ssl, result); + int verify_err = (int) SSL_get_verify_result(ssl); + + if(SSL_ERROR_SYSCALL == ssl_err) { + snprintf(msg, sizeof(msg), "System error: %s - %d", strerror(err), err); + + } else if(SSL_ERROR_SSL == ssl_err) { + if(X509_V_OK != verify_err) { + err_str = X509_verify_cert_error_string(verify_err); + snprintf(msg, sizeof(msg), + "OpenSSL certificate verification error: %s - %d", + err_str, verify_err); + + } else { + err = (int) ERR_get_error(); + ERR_error_string_n(err, buf, sizeof(buf)); + snprintf(msg, sizeof(msg), "OpenSSL error: %s - %d", buf, err & mask); + } + } else { + snprintf(msg, sizeof(msg), "Unknown OpenSSL error: %d", ssl_err); + } + + ERR_clear_error(); + rb_raise(eError, "%s", msg); +} + +VALUE engine_read(VALUE self) { + ms_conn* conn; + char buf[512]; + int bytes, error; + + TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn); + + ERR_clear_error(); + + bytes = SSL_read(conn->ssl, (void*)buf, sizeof(buf)); + + if(bytes > 0) { + return rb_str_new(buf, bytes); + } + + if(SSL_want_read(conn->ssl)) return Qnil; + + error = SSL_get_error(conn->ssl, bytes); + + if(error == SSL_ERROR_ZERO_RETURN) { + rb_eof_error(); + } else { + raise_error(conn->ssl, bytes); + } + + return Qnil; +} + +VALUE engine_write(VALUE self, VALUE str) { + ms_conn* conn; + int bytes; + + TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn); + + StringValue(str); + + ERR_clear_error(); + + bytes = SSL_write(conn->ssl, (void*)RSTRING_PTR(str), (int)RSTRING_LEN(str)); + if(bytes > 0) { + return INT2FIX(bytes); + } + + if(SSL_want_write(conn->ssl)) return Qnil; + + raise_error(conn->ssl, bytes); + + return Qnil; +} + +VALUE engine_extract(VALUE self) { + ms_conn* conn; + int bytes; + size_t pending; + // https://www.openssl.org/docs/manmaster/man3/BIO_f_buffer.html + // crypto/bio/bf_buff.c DEFAULT_BUFFER_SIZE + char buf[4096]; + + TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn); + + pending = BIO_pending(conn->write); + if(pending > 0) { + bytes = BIO_read(conn->write, buf, sizeof(buf)); + if(bytes > 0) { + return rb_str_new(buf, bytes); + } else if(!BIO_should_retry(conn->write)) { + raise_error(conn->ssl, bytes); + } + } + + return Qnil; +} + +VALUE engine_shutdown(VALUE self) { + ms_conn* conn; + int ok; + + TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn); + + ERR_clear_error(); + + ok = SSL_shutdown(conn->ssl); + if (ok == 0) { + return Qfalse; + } + + return Qtrue; +} + +VALUE engine_init(VALUE self) { + ms_conn* conn; + + TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn); + + return SSL_in_init(conn->ssl) ? Qtrue : Qfalse; +} + +VALUE engine_peercert(VALUE self) { + ms_conn* conn; + X509* cert; + int bytes; + unsigned char* buf = NULL; + ms_cert_buf* cert_buf = NULL; + VALUE rb_cert_buf; + + TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn); + +#ifdef HAVE_SSL_GET1_PEER_CERTIFICATE + cert = SSL_get1_peer_certificate(conn->ssl); +#else + cert = SSL_get_peer_certificate(conn->ssl); +#endif + if(!cert) { + /* + * See if there was a failed certificate associated with this client. + */ + cert_buf = (ms_cert_buf*)SSL_get_app_data(conn->ssl); + if(!cert_buf) { + return Qnil; + } + buf = cert_buf->buf; + bytes = cert_buf->bytes; + + } else { + bytes = i2d_X509(cert, &buf); + X509_free(cert); + + if(bytes < 0) { + return Qnil; + } + } + + rb_cert_buf = rb_str_new((const char*)(buf), bytes); + if(!cert_buf) { + OPENSSL_free(buf); + } + + return rb_cert_buf; +} + +/* @see Puma::MiniSSL::Socket#ssl_version_state + * @version 5.0.0 + */ +static VALUE +engine_ssl_vers_st(VALUE self) { + ms_conn* conn; + TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn); + return rb_ary_new3(2, rb_str_new2(SSL_get_version(conn->ssl)), rb_str_new2(SSL_state_string(conn->ssl))); +} + +VALUE noop(VALUE self) { + return Qnil; +} + +void Init_mini_ssl(VALUE puma) { + VALUE mod, eng, sslctx; + +/* Fake operation for documentation (RDoc, YARD) */ +#if 0 == 1 + puma = rb_define_module("Puma"); +#endif + + SSL_library_init(); + OpenSSL_add_ssl_algorithms(); + SSL_load_error_strings(); + ERR_load_crypto_strings(); + + mod = rb_define_module_under(puma, "MiniSSL"); + + eng = rb_define_class_under(mod, "Engine", rb_cObject); + rb_undef_alloc_func(eng); + + sslctx = rb_define_class_under(mod, "SSLContext", rb_cObject); + rb_define_alloc_func(sslctx, sslctx_alloc); + rb_define_method(sslctx, "initialize", sslctx_initialize, 1); + rb_undef_method(sslctx, "initialize_copy"); + + + // OpenSSL Build / Runtime/Load versions + + /* Version of OpenSSL that Puma was compiled with */ + rb_define_const(mod, "OPENSSL_VERSION", rb_str_new2(OPENSSL_VERSION_TEXT)); + +#if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000 + /* Version of OpenSSL that Puma loaded with */ + rb_define_const(mod, "OPENSSL_LIBRARY_VERSION", rb_str_new2(OpenSSL_version(OPENSSL_VERSION))); +#else + rb_define_const(mod, "OPENSSL_LIBRARY_VERSION", rb_str_new2(SSLeay_version(SSLEAY_VERSION))); +#endif + +#if defined(OPENSSL_NO_SSL3) || defined(OPENSSL_NO_SSL3_METHOD) + /* True if SSL3 is not available */ + rb_define_const(mod, "OPENSSL_NO_SSL3", Qtrue); +#else + rb_define_const(mod, "OPENSSL_NO_SSL3", Qfalse); +#endif + +#if defined(OPENSSL_NO_TLS1) || defined(OPENSSL_NO_TLS1_METHOD) + /* True if TLS1 is not available */ + rb_define_const(mod, "OPENSSL_NO_TLS1", Qtrue); +#else + rb_define_const(mod, "OPENSSL_NO_TLS1", Qfalse); +#endif + +#if defined(OPENSSL_NO_TLS1_1) || defined(OPENSSL_NO_TLS1_1_METHOD) + /* True if TLS1_1 is not available */ + rb_define_const(mod, "OPENSSL_NO_TLS1_1", Qtrue); +#else + rb_define_const(mod, "OPENSSL_NO_TLS1_1", Qfalse); +#endif + + rb_define_singleton_method(mod, "check", noop, 0); + + eError = rb_define_class_under(mod, "SSLError", rb_eStandardError); + + rb_define_singleton_method(eng, "server", engine_init_server, 1); + rb_define_singleton_method(eng, "client", engine_init_client, 0); + + rb_define_method(eng, "inject", engine_inject, 1); + rb_define_method(eng, "read", engine_read, 0); + + rb_define_method(eng, "write", engine_write, 1); + rb_define_method(eng, "extract", engine_extract, 0); + + rb_define_method(eng, "shutdown", engine_shutdown, 0); + + rb_define_method(eng, "init?", engine_init, 0); + + /* @!attribute [r] peercert + * Returns `nil` when `MiniSSL::Context#verify_mode` is set to `VERIFY_NONE`. + * @return [String, nil] DER encoded cert + */ + rb_define_method(eng, "peercert", engine_peercert, 0); + + rb_define_method(eng, "ssl_vers_st", engine_ssl_vers_st, 0); +} + +#else + +NORETURN(VALUE raise_error(VALUE self)); + +VALUE raise_error(VALUE self) { + rb_raise(rb_eStandardError, "SSL not available in this build"); +} + +void Init_mini_ssl(VALUE puma) { + VALUE mod; + + mod = rb_define_module_under(puma, "MiniSSL"); + rb_define_class_under(mod, "SSLError", rb_eStandardError); + + rb_define_singleton_method(mod, "check", raise_error, 0); +} +#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/no_ssl/PumaHttp11Service.java b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/no_ssl/PumaHttp11Service.java new file mode 100644 index 0000000..5701e83 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/no_ssl/PumaHttp11Service.java @@ -0,0 +1,15 @@ +package puma; + +import java.io.IOException; + +import org.jruby.Ruby; +import org.jruby.runtime.load.BasicLibraryService; + +import org.jruby.puma.Http11; + +public class PumaHttp11Service implements BasicLibraryService { + public boolean basicLoad(final Ruby runtime) throws IOException { + Http11.createHttp11(runtime); + return true; + } +} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/Http11.java b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/Http11.java new file mode 100644 index 0000000..03c790c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/Http11.java @@ -0,0 +1,249 @@ +package org.jruby.puma; + +import org.jruby.Ruby; +import org.jruby.RubyClass; +import org.jruby.RubyHash; +import org.jruby.RubyModule; +import org.jruby.RubyNumeric; +import org.jruby.RubyObject; +import org.jruby.RubyString; + +import org.jruby.anno.JRubyMethod; + +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.builtin.IRubyObject; + +import org.jruby.exceptions.RaiseException; + +import org.jruby.util.ByteList; + +/** + * @author Ola Bini + * @author Charles Oliver Nutter + */ +public class Http11 extends RubyObject { + public final static int MAX_FIELD_NAME_LENGTH = 256; + public final static String MAX_FIELD_NAME_LENGTH_ERR = "HTTP element FIELD_NAME is longer than the 256 allowed length."; + public final static int MAX_FIELD_VALUE_LENGTH = 80 * 1024; + public final static String MAX_FIELD_VALUE_LENGTH_ERR = "HTTP element FIELD_VALUE is longer than the 81920 allowed length."; + public final static int MAX_REQUEST_URI_LENGTH = getConstLength("PUMA_REQUEST_URI_MAX_LENGTH", 1024 * 12); + public final static String MAX_REQUEST_URI_LENGTH_ERR = "HTTP element REQUEST_URI is longer than the " + MAX_REQUEST_URI_LENGTH + " allowed length."; + public final static int MAX_FRAGMENT_LENGTH = 1024; + public final static String MAX_FRAGMENT_LENGTH_ERR = "HTTP element FRAGMENT is longer than the 1024 allowed length."; + public final static int MAX_REQUEST_PATH_LENGTH = getConstLength("PUMA_REQUEST_PATH_MAX_LENGTH", 8192); + public final static String MAX_REQUEST_PATH_LENGTH_ERR = "HTTP element REQUEST_PATH is longer than the " + MAX_REQUEST_PATH_LENGTH + " allowed length."; + public final static int MAX_QUERY_STRING_LENGTH = getConstLength("PUMA_QUERY_STRING_MAX_LENGTH", 10 * 1024); + public final static String MAX_QUERY_STRING_LENGTH_ERR = "HTTP element QUERY_STRING is longer than the " + MAX_QUERY_STRING_LENGTH +" allowed length."; + public final static int MAX_HEADER_LENGTH = 1024 * (80 + 32); + public final static String MAX_HEADER_LENGTH_ERR = "HTTP element HEADER is longer than the 114688 allowed length."; + + public static final ByteList CONTENT_TYPE_BYTELIST = new ByteList(ByteList.plain("CONTENT_TYPE")); + public static final ByteList CONTENT_LENGTH_BYTELIST = new ByteList(ByteList.plain("CONTENT_LENGTH")); + public static final ByteList HTTP_PREFIX_BYTELIST = new ByteList(ByteList.plain("HTTP_")); + public static final ByteList COMMA_SPACE_BYTELIST = new ByteList(ByteList.plain(", ")); + public static final ByteList REQUEST_METHOD_BYTELIST = new ByteList(ByteList.plain("REQUEST_METHOD")); + public static final ByteList REQUEST_URI_BYTELIST = new ByteList(ByteList.plain("REQUEST_URI")); + public static final ByteList FRAGMENT_BYTELIST = new ByteList(ByteList.plain("FRAGMENT")); + public static final ByteList REQUEST_PATH_BYTELIST = new ByteList(ByteList.plain("REQUEST_PATH")); + public static final ByteList QUERY_STRING_BYTELIST = new ByteList(ByteList.plain("QUERY_STRING")); + public static final ByteList SERVER_PROTOCOL_BYTELIST = new ByteList(ByteList.plain("SERVER_PROTOCOL")); + + public static String getEnvOrProperty(String name) { + String envValue = System.getenv(name); + return (envValue != null) ? envValue : System.getProperty(name); + } + + public static int getConstLength(String name, Integer defaultValue) { + String stringValue = getEnvOrProperty(name); + if (stringValue == null || stringValue.isEmpty()) return defaultValue; + + try { + int value = Integer.parseUnsignedInt(stringValue); + if (value <= 0) { + throw new NumberFormatException("The number is not positive."); + } + return value; + } catch (NumberFormatException e) { + System.err.println(String.format("The value %s for %s is invalid. Using default value %d instead.", stringValue, name, defaultValue)); + return defaultValue; + } + } + + private static ObjectAllocator ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new Http11(runtime, klass); + } + }; + + public static void createHttp11(Ruby runtime) { + RubyModule mPuma = runtime.defineModule("Puma"); + mPuma.defineClassUnder("HttpParserError",runtime.getClass("StandardError"),runtime.getClass("StandardError").getAllocator()); + + RubyClass cHttpParser = mPuma.defineClassUnder("HttpParser",runtime.getObject(),ALLOCATOR); + cHttpParser.defineAnnotatedMethods(Http11.class); + } + + private Ruby runtime; + private Http11Parser hp; + private RubyString body; + + public Http11(Ruby runtime, RubyClass clazz) { + super(runtime,clazz); + this.runtime = runtime; + this.hp = new Http11Parser(); + this.hp.parser.init(); + } + + public static void validateMaxLength(Ruby runtime, int len, int max, String msg) { + if(len>max) { + throw newHTTPParserError(runtime, msg); + } + } + + private static RaiseException newHTTPParserError(Ruby runtime, String msg) { + return runtime.newRaiseException(getHTTPParserError(runtime), msg); + } + + private static RubyClass getHTTPParserError(Ruby runtime) { + // Cheaper to look this up lazily than cache eagerly and consume a field, since it's rarely encountered + return (RubyClass)runtime.getModule("Puma").getConstant("HttpParserError"); + } + + public static void http_field(Ruby runtime, RubyHash req, ByteList buffer, int field, int flen, int value, int vlen) { + RubyString f; + IRubyObject v; + validateMaxLength(runtime, flen, MAX_FIELD_NAME_LENGTH, MAX_FIELD_NAME_LENGTH_ERR); + validateMaxLength(runtime, vlen, MAX_FIELD_VALUE_LENGTH, MAX_FIELD_VALUE_LENGTH_ERR); + + ByteList b = new ByteList(buffer,field,flen); + for(int i = 0,j = b.length();i 0 && Character.isWhitespace(buffer.get(value + vlen - 1))) vlen--; + + if (b.equals(CONTENT_LENGTH_BYTELIST) || b.equals(CONTENT_TYPE_BYTELIST)) { + f = RubyString.newString(runtime, b); + } else { + f = RubyString.newStringShared(runtime, HTTP_PREFIX_BYTELIST); + f.cat(b); + } + + b = new ByteList(buffer, value, vlen); + v = req.fastARef(f); + if (v == null || v.isNil()) { + req.fastASet(f, RubyString.newString(runtime, b)); + } else { + RubyString vs = v.convertToString(); + vs.cat(COMMA_SPACE_BYTELIST); + vs.cat(b); + } + } + + public static void request_method(Ruby runtime, RubyHash req, ByteList buffer, int at, int length) { + RubyString val = RubyString.newString(runtime,new ByteList(buffer,at,length)); + req.fastASet(RubyString.newStringShared(runtime, REQUEST_METHOD_BYTELIST),val); + } + + public static void request_uri(Ruby runtime, RubyHash req, ByteList buffer, int at, int length) { + validateMaxLength(runtime, length, MAX_REQUEST_URI_LENGTH, MAX_REQUEST_URI_LENGTH_ERR); + RubyString val = RubyString.newString(runtime,new ByteList(buffer,at,length)); + req.fastASet(RubyString.newStringShared(runtime, REQUEST_URI_BYTELIST),val); + } + + public static void fragment(Ruby runtime, RubyHash req, ByteList buffer, int at, int length) { + validateMaxLength(runtime, length, MAX_FRAGMENT_LENGTH, MAX_FRAGMENT_LENGTH_ERR); + RubyString val = RubyString.newString(runtime,new ByteList(buffer,at,length)); + req.fastASet(RubyString.newStringShared(runtime, FRAGMENT_BYTELIST),val); + } + + public static void request_path(Ruby runtime, RubyHash req, ByteList buffer, int at, int length) { + validateMaxLength(runtime, length, MAX_REQUEST_PATH_LENGTH, MAX_REQUEST_PATH_LENGTH_ERR); + RubyString val = RubyString.newString(runtime,new ByteList(buffer,at,length)); + req.fastASet(RubyString.newStringShared(runtime, REQUEST_PATH_BYTELIST),val); + } + + public static void query_string(Ruby runtime, RubyHash req, ByteList buffer, int at, int length) { + validateMaxLength(runtime, length, MAX_QUERY_STRING_LENGTH, MAX_QUERY_STRING_LENGTH_ERR); + RubyString val = RubyString.newString(runtime,new ByteList(buffer,at,length)); + req.fastASet(RubyString.newStringShared(runtime, QUERY_STRING_BYTELIST),val); + } + + public static void server_protocol(Ruby runtime, RubyHash req, ByteList buffer, int at, int length) { + RubyString val = RubyString.newString(runtime,new ByteList(buffer,at,length)); + req.fastASet(RubyString.newStringShared(runtime, SERVER_PROTOCOL_BYTELIST),val); + } + + public void header_done(Ruby runtime, RubyHash req, ByteList buffer, int at, int length) { + body = RubyString.newStringShared(runtime, new ByteList(buffer, at, length)); + } + + @JRubyMethod + public IRubyObject initialize() { + this.hp.parser.init(); + return this; + } + + @JRubyMethod + public IRubyObject reset() { + this.hp.parser.init(); + return runtime.getNil(); + } + + @JRubyMethod + public IRubyObject finish() { + this.hp.finish(); + return this.hp.is_finished() ? runtime.getTrue() : runtime.getFalse(); + } + + @JRubyMethod + public IRubyObject execute(IRubyObject req_hash, IRubyObject data, IRubyObject start) { + int from = RubyNumeric.fix2int(start); + ByteList d = ((RubyString)data).getByteList(); + if(from >= d.length()) { + throw newHTTPParserError(runtime, "Requested start is after data buffer end."); + } else { + Http11Parser hp = this.hp; + Http11Parser.HttpParser parser = hp.parser; + + parser.data = (RubyHash) req_hash; + + hp.execute(runtime, this, d,from); + + validateMaxLength(runtime, parser.nread,MAX_HEADER_LENGTH, MAX_HEADER_LENGTH_ERR); + + if(hp.has_error()) { + throw newHTTPParserError(runtime, "Invalid HTTP format, parsing fails. Are you trying to open an SSL connection to a non-SSL Puma?"); + } else { + return runtime.newFixnum(parser.nread); + } + } + } + + @JRubyMethod(name = "error?") + public IRubyObject has_error() { + return this.hp.has_error() ? runtime.getTrue() : runtime.getFalse(); + } + + @JRubyMethod(name = "finished?") + public IRubyObject is_finished() { + return this.hp.is_finished() ? runtime.getTrue() : runtime.getFalse(); + } + + @JRubyMethod + public IRubyObject nread() { + return runtime.newFixnum(this.hp.parser.nread); + } + + @JRubyMethod + public IRubyObject body() { + return body; + } +}// Http11 diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/Http11Parser.java b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/Http11Parser.java new file mode 100644 index 0000000..d5a6815 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/Http11Parser.java @@ -0,0 +1,455 @@ + +// line 1 "ext/puma_http11/http11_parser.java.rl" +package org.jruby.puma; + +import org.jruby.Ruby; +import org.jruby.RubyHash; +import org.jruby.util.ByteList; + +public class Http11Parser { + +/** Machine **/ + + +// line 58 "ext/puma_http11/http11_parser.java.rl" + + +/** Data **/ + +// line 20 "ext/puma_http11/org/jruby/puma/Http11Parser.java" +private static byte[] init__puma_parser_actions_0() +{ + return new byte [] { + 0, 1, 0, 1, 2, 1, 3, 1, 4, 1, 5, 1, + 6, 1, 7, 1, 8, 1, 9, 1, 11, 1, 12, 1, + 13, 2, 0, 8, 2, 1, 2, 2, 4, 5, 2, 10, + 7, 2, 12, 7, 3, 9, 10, 7 + }; +} + +private static final byte _puma_parser_actions[] = init__puma_parser_actions_0(); + + +private static short[] init__puma_parser_key_offsets_0() +{ + return new short [] { + 0, 0, 8, 17, 27, 29, 30, 31, 32, 33, 34, 36, + 39, 41, 44, 45, 61, 62, 78, 85, 91, 99, 107, 117, + 125, 134, 142, 150, 159, 168, 177, 186, 195, 204, 213, 222, + 231, 240, 249, 258, 267, 276, 285, 294, 303, 312, 313 + }; +} + +private static final short _puma_parser_key_offsets[] = init__puma_parser_key_offsets_0(); + + +private static char[] init__puma_parser_trans_keys_0() +{ + return new char [] { + 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, + 46, 48, 57, 65, 90, 42, 43, 47, 58, 45, 57, 65, + 90, 97, 122, 32, 35, 72, 84, 84, 80, 47, 48, 57, + 46, 48, 57, 48, 57, 13, 48, 57, 10, 13, 33, 124, + 126, 35, 39, 42, 43, 45, 46, 48, 57, 65, 90, 94, + 122, 10, 33, 58, 124, 126, 35, 39, 42, 43, 45, 46, + 48, 57, 65, 90, 94, 122, 13, 32, 127, 0, 8, 10, + 31, 13, 127, 0, 8, 10, 31, 32, 60, 62, 127, 0, + 31, 34, 35, 32, 60, 62, 127, 0, 31, 34, 35, 43, + 58, 45, 46, 48, 57, 65, 90, 97, 122, 32, 34, 35, + 60, 62, 127, 0, 31, 32, 34, 35, 60, 62, 63, 127, + 0, 31, 32, 34, 35, 60, 62, 127, 0, 31, 32, 34, + 35, 60, 62, 127, 0, 31, 32, 36, 95, 45, 46, 48, + 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, + 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, + 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, + 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, + 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, + 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, + 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, + 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, + 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, + 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, + 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, + 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, + 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, + 32, 0 + }; +} + +private static final char _puma_parser_trans_keys[] = init__puma_parser_trans_keys_0(); + + +private static byte[] init__puma_parser_single_lengths_0() +{ + return new byte [] { + 0, 2, 3, 4, 2, 1, 1, 1, 1, 1, 0, 1, + 0, 1, 1, 4, 1, 4, 3, 2, 4, 4, 2, 6, + 7, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 0 + }; +} + +private static final byte _puma_parser_single_lengths[] = init__puma_parser_single_lengths_0(); + + +private static byte[] init__puma_parser_range_lengths_0() +{ + return new byte [] { + 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 6, 0, 6, 2, 2, 2, 2, 4, 1, + 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0 + }; +} + +private static final byte _puma_parser_range_lengths[] = init__puma_parser_range_lengths_0(); + + +private static short[] init__puma_parser_index_offsets_0() +{ + return new short [] { + 0, 0, 6, 13, 21, 24, 26, 28, 30, 32, 34, 36, + 39, 41, 44, 46, 57, 59, 70, 76, 81, 88, 95, 102, + 110, 119, 127, 135, 142, 149, 156, 163, 170, 177, 184, 191, + 198, 205, 212, 219, 226, 233, 240, 247, 254, 261, 263 + }; +} + +private static final short _puma_parser_index_offsets[] = init__puma_parser_index_offsets_0(); + + +private static byte[] init__puma_parser_indicies_0() +{ + return new byte [] { + 0, 0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 3, + 1, 4, 5, 6, 7, 5, 5, 5, 1, 8, 9, 1, + 10, 1, 11, 1, 12, 1, 13, 1, 14, 1, 15, 1, + 16, 15, 1, 17, 1, 18, 17, 1, 19, 1, 20, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 1, 22, 1, 23, + 24, 23, 23, 23, 23, 23, 23, 23, 23, 1, 26, 27, + 1, 1, 1, 25, 29, 1, 1, 1, 28, 30, 1, 1, + 1, 1, 1, 31, 32, 1, 1, 1, 1, 1, 33, 34, + 35, 34, 34, 34, 34, 1, 8, 1, 9, 1, 1, 1, + 1, 35, 36, 1, 38, 1, 1, 39, 1, 1, 37, 40, + 1, 42, 1, 1, 1, 1, 41, 43, 1, 45, 1, 1, + 1, 1, 44, 2, 46, 46, 46, 46, 46, 1, 2, 47, + 47, 47, 47, 47, 1, 2, 48, 48, 48, 48, 48, 1, + 2, 49, 49, 49, 49, 49, 1, 2, 50, 50, 50, 50, + 50, 1, 2, 51, 51, 51, 51, 51, 1, 2, 52, 52, + 52, 52, 52, 1, 2, 53, 53, 53, 53, 53, 1, 2, + 54, 54, 54, 54, 54, 1, 2, 55, 55, 55, 55, 55, + 1, 2, 56, 56, 56, 56, 56, 1, 2, 57, 57, 57, + 57, 57, 1, 2, 58, 58, 58, 58, 58, 1, 2, 59, + 59, 59, 59, 59, 1, 2, 60, 60, 60, 60, 60, 1, + 2, 61, 61, 61, 61, 61, 1, 2, 62, 62, 62, 62, + 62, 1, 2, 63, 63, 63, 63, 63, 1, 2, 1, 1, + 0 + }; +} + +private static final byte _puma_parser_indicies[] = init__puma_parser_indicies_0(); + + +private static byte[] init__puma_parser_trans_targs_0() +{ + return new byte [] { + 2, 0, 3, 27, 4, 22, 24, 23, 5, 20, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 46, 17, + 18, 19, 14, 18, 19, 14, 5, 21, 5, 21, 22, 23, + 5, 24, 20, 25, 5, 26, 20, 5, 26, 20, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45 + }; +} + +private static final byte _puma_parser_trans_targs[] = init__puma_parser_trans_targs_0(); + + +private static byte[] init__puma_parser_trans_actions_0() +{ + return new byte [] { + 1, 0, 11, 0, 1, 1, 1, 1, 13, 13, 1, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 28, 23, 3, + 5, 7, 31, 7, 0, 9, 25, 1, 15, 0, 0, 0, + 37, 0, 37, 21, 40, 17, 40, 34, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 + }; +} + +private static final byte _puma_parser_trans_actions[] = init__puma_parser_trans_actions_0(); + + +static final int puma_parser_start = 1; +static final int puma_parser_first_final = 46; +static final int puma_parser_error = 0; + + +// line 62 "ext/puma_http11/http11_parser.java.rl" + + public static interface ElementCB { + public void call(Ruby runtime, RubyHash data, ByteList buffer, int at, int length); + } + + public static interface FieldCB { + public void call(Ruby runtime, RubyHash data, ByteList buffer, int field, int flen, int value, int vlen); + } + + public static class HttpParser { + int cs; + int body_start; + int content_len; + int nread; + int mark; + int field_start; + int field_len; + int query_start; + + RubyHash data; + ByteList buffer; + + public void init() { + cs = 0; + + +// line 216 "ext/puma_http11/org/jruby/puma/Http11Parser.java" + { + cs = puma_parser_start; + } + +// line 88 "ext/puma_http11/http11_parser.java.rl" + + body_start = 0; + content_len = 0; + mark = 0; + nread = 0; + field_len = 0; + field_start = 0; + } + } + + public final HttpParser parser = new HttpParser(); + + public int execute(Ruby runtime, Http11 http, ByteList buffer, int off) { + int p, pe; + int cs = parser.cs; + int len = buffer.length(); + assert off<=len : "offset past end of buffer"; + + p = off; + pe = len; + // get a copy of the bytes, since it may not start at 0 + // FIXME: figure out how to just use the bytes in-place + byte[] data = buffer.bytes(); + parser.buffer = buffer; + + +// line 248 "ext/puma_http11/org/jruby/puma/Http11Parser.java" + { + int _klen; + int _trans = 0; + int _acts; + int _nacts; + int _keys; + int _goto_targ = 0; + + _goto: while (true) { + switch ( _goto_targ ) { + case 0: + if ( p == pe ) { + _goto_targ = 4; + continue _goto; + } + if ( cs == 0 ) { + _goto_targ = 5; + continue _goto; + } +case 1: + _match: do { + _keys = _puma_parser_key_offsets[cs]; + _trans = _puma_parser_index_offsets[cs]; + _klen = _puma_parser_single_lengths[cs]; + if ( _klen > 0 ) { + int _lower = _keys; + int _mid; + int _upper = _keys + _klen - 1; + while (true) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( data[p] < _puma_parser_trans_keys[_mid] ) + _upper = _mid - 1; + else if ( data[p] > _puma_parser_trans_keys[_mid] ) + _lower = _mid + 1; + else { + _trans += (_mid - _keys); + break _match; + } + } + _keys += _klen; + _trans += _klen; + } + + _klen = _puma_parser_range_lengths[cs]; + if ( _klen > 0 ) { + int _lower = _keys; + int _mid; + int _upper = _keys + (_klen<<1) - 2; + while (true) { + if ( _upper < _lower ) + break; + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( data[p] < _puma_parser_trans_keys[_mid] ) + _upper = _mid - 2; + else if ( data[p] > _puma_parser_trans_keys[_mid+1] ) + _lower = _mid + 2; + else { + _trans += ((_mid - _keys)>>1); + break _match; + } + } + _trans += _klen; + } + } while (false); + + _trans = _puma_parser_indicies[_trans]; + cs = _puma_parser_trans_targs[_trans]; + + if ( _puma_parser_trans_actions[_trans] != 0 ) { + _acts = _puma_parser_trans_actions[_trans]; + _nacts = (int) _puma_parser_actions[_acts++]; + while ( _nacts-- > 0 ) + { + switch ( _puma_parser_actions[_acts++] ) + { + case 0: +// line 15 "ext/puma_http11/http11_parser.java.rl" + {parser.mark = p; } + break; + case 1: +// line 17 "ext/puma_http11/http11_parser.java.rl" + { parser.field_start = p; } + break; + case 2: +// line 18 "ext/puma_http11/http11_parser.java.rl" + { /* FIXME stub */ } + break; + case 3: +// line 19 "ext/puma_http11/http11_parser.java.rl" + { + parser.field_len = p-parser.field_start; + } + break; + case 4: +// line 23 "ext/puma_http11/http11_parser.java.rl" + { parser.mark = p; } + break; + case 5: +// line 24 "ext/puma_http11/http11_parser.java.rl" + { + Http11.http_field(runtime, parser.data, parser.buffer, parser.field_start, parser.field_len, parser.mark, p-parser.mark); + } + break; + case 6: +// line 27 "ext/puma_http11/http11_parser.java.rl" + { + Http11.request_method(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark); + } + break; + case 7: +// line 30 "ext/puma_http11/http11_parser.java.rl" + { + Http11.request_uri(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark); + } + break; + case 8: +// line 33 "ext/puma_http11/http11_parser.java.rl" + { + Http11.fragment(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark); + } + break; + case 9: +// line 37 "ext/puma_http11/http11_parser.java.rl" + {parser.query_start = p; } + break; + case 10: +// line 38 "ext/puma_http11/http11_parser.java.rl" + { + Http11.query_string(runtime, parser.data, parser.buffer, parser.query_start, p-parser.query_start); + } + break; + case 11: +// line 42 "ext/puma_http11/http11_parser.java.rl" + { + Http11.server_protocol(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark); + } + break; + case 12: +// line 46 "ext/puma_http11/http11_parser.java.rl" + { + Http11.request_path(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark); + } + break; + case 13: +// line 50 "ext/puma_http11/http11_parser.java.rl" + { + parser.body_start = p + 1; + http.header_done(runtime, parser.data, parser.buffer, p + 1, pe - p - 1); + { p += 1; _goto_targ = 5; if (true) continue _goto;} + } + break; +// line 404 "ext/puma_http11/org/jruby/puma/Http11Parser.java" + } + } + } + +case 2: + if ( cs == 0 ) { + _goto_targ = 5; + continue _goto; + } + if ( ++p != pe ) { + _goto_targ = 1; + continue _goto; + } +case 4: +case 5: + } + break; } + } + +// line 114 "ext/puma_http11/http11_parser.java.rl" + + parser.cs = cs; + parser.nread += (p - off); + + assert p <= pe : "buffer overflow after parsing execute"; + assert parser.nread <= len : "nread longer than length"; + assert parser.body_start <= len : "body starts after buffer end"; + assert parser.mark < len : "mark is after buffer end"; + assert parser.field_len <= len : "field has length longer than whole buffer"; + assert parser.field_start < len : "field starts after buffer end"; + + return parser.nread; + } + + public int finish() { + if(has_error()) { + return -1; + } else if(is_finished()) { + return 1; + } else { + return 0; + } + } + + public boolean has_error() { + return parser.cs == puma_parser_error; + } + + public boolean is_finished() { + return parser.cs == puma_parser_first_final; + } +} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/MiniSSL.java b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/MiniSSL.java new file mode 100644 index 0000000..36ad801 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/MiniSSL.java @@ -0,0 +1,509 @@ +package org.jruby.puma; + +import org.jruby.Ruby; +import org.jruby.RubyArray; +import org.jruby.RubyClass; +import org.jruby.RubyModule; +import org.jruby.RubyObject; +import org.jruby.RubyString; +import org.jruby.anno.JRubyMethod; +import org.jruby.exceptions.RaiseException; +import org.jruby.javasupport.JavaEmbedUtils; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.ByteList; + +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLEngine; +import javax.net.ssl.SSLEngineResult; +import javax.net.ssl.SSLException; +import javax.net.ssl.SSLPeerUnverifiedException; +import javax.net.ssl.SSLSession; +import javax.net.ssl.X509TrustManager; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.IOException; +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.Certificate; +import java.security.cert.CertificateEncodingException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.concurrent.ConcurrentHashMap; +import java.util.Map; +import java.util.function.Supplier; + +import static javax.net.ssl.SSLEngineResult.Status; +import static javax.net.ssl.SSLEngineResult.HandshakeStatus; + +public class MiniSSL extends RubyObject { // MiniSSL::Engine + private static final long serialVersionUID = -6903439483039141234L; + private static ObjectAllocator ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new MiniSSL(runtime, klass); + } + }; + + public static void createMiniSSL(Ruby runtime) { + RubyModule mPuma = runtime.defineModule("Puma"); + RubyModule ssl = mPuma.defineModuleUnder("MiniSSL"); + + // Puma::MiniSSL::SSLError + ssl.defineClassUnder("SSLError", runtime.getStandardError(), runtime.getStandardError().getAllocator()); + + RubyClass eng = ssl.defineClassUnder("Engine", runtime.getObject(), ALLOCATOR); + eng.defineAnnotatedMethods(MiniSSL.class); + } + + /** + * Fairly transparent wrapper around {@link java.nio.ByteBuffer} which adds the enhancements we need + */ + private static class MiniSSLBuffer { + ByteBuffer buffer; + + private MiniSSLBuffer(int capacity) { buffer = ByteBuffer.allocate(capacity); } + private MiniSSLBuffer(byte[] initialContents) { buffer = ByteBuffer.wrap(initialContents); } + + public void clear() { buffer.clear(); } + public void compact() { buffer.compact(); } + public void flip() { ((Buffer) buffer).flip(); } + public boolean hasRemaining() { return buffer.hasRemaining(); } + public int position() { return buffer.position(); } + + public ByteBuffer getRawBuffer() { + return buffer; + } + + /** + * Writes bytes to the buffer after ensuring there's room + */ + private void put(byte[] bytes, final int offset, final int length) { + if (buffer.remaining() < length) { + resize(buffer.limit() + length); + } + buffer.put(bytes, offset, length); + } + + /** + * Ensures that newCapacity bytes can be written to this buffer, only re-allocating if necessary + */ + public void resize(int newCapacity) { + if (newCapacity > buffer.capacity()) { + ByteBuffer dstTmp = ByteBuffer.allocate(newCapacity); + flip(); + dstTmp.put(buffer); + buffer = dstTmp; + } else { + buffer.limit(newCapacity); + } + } + + /** + * Drains the buffer to a ByteList, or returns null for an empty buffer + */ + public ByteList asByteList() { + flip(); + if (!buffer.hasRemaining()) { + buffer.clear(); + return null; + } + + byte[] bss = new byte[buffer.limit()]; + + buffer.get(bss); + buffer.clear(); + return new ByteList(bss, false); + } + + @Override + public String toString() { return buffer.toString(); } + } + + private SSLEngine engine; + private boolean closed; + private boolean handshake; + private MiniSSLBuffer inboundNetData; + private MiniSSLBuffer outboundAppData; + private MiniSSLBuffer outboundNetData; + + public MiniSSL(Ruby runtime, RubyClass klass) { + super(runtime, klass); + } + + private static Map keyManagerFactoryMap = new ConcurrentHashMap(); + private static Map trustManagerFactoryMap = new ConcurrentHashMap(); + + @JRubyMethod(meta = true) // Engine.server + public static synchronized IRubyObject server(ThreadContext context, IRubyObject recv, IRubyObject miniSSLContext) + throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException, UnrecoverableKeyException { + // Create the KeyManagerFactory and TrustManagerFactory for this server + String keystoreFile = asStringValue(miniSSLContext.callMethod(context, "keystore"), null); + char[] keystorePass = asStringValue(miniSSLContext.callMethod(context, "keystore_pass"), null).toCharArray(); + String keystoreType = asStringValue(miniSSLContext.callMethod(context, "keystore_type"), KeyStore::getDefaultType); + + String truststoreFile; + char[] truststorePass; + String truststoreType; + IRubyObject truststore = miniSSLContext.callMethod(context, "truststore"); + if (truststore.isNil()) { + truststoreFile = keystoreFile; + truststorePass = keystorePass; + truststoreType = keystoreType; + } else if (!isDefaultSymbol(context, truststore)) { + truststoreFile = truststore.convertToString().asJavaString(); + IRubyObject pass = miniSSLContext.callMethod(context, "truststore_pass"); + if (pass.isNil()) { + truststorePass = null; + } else { + truststorePass = asStringValue(pass, null).toCharArray(); + } + truststoreType = asStringValue(miniSSLContext.callMethod(context, "truststore_type"), KeyStore::getDefaultType); + } else { // self.truststore = :default + truststoreFile = null; + truststorePass = null; + truststoreType = null; + } + + KeyStore ks = KeyStore.getInstance(keystoreType); + InputStream is = new FileInputStream(keystoreFile); + try { + ks.load(is, keystorePass); + } finally { + is.close(); + } + KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); + kmf.init(ks, keystorePass); + keyManagerFactoryMap.put(keystoreFile, kmf); + + if (truststoreFile != null) { + KeyStore ts = KeyStore.getInstance(truststoreType); + is = new FileInputStream(truststoreFile); + try { + ts.load(is, truststorePass); + } finally { + is.close(); + } + TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); + tmf.init(ts); + trustManagerFactoryMap.put(truststoreFile, tmf); + } + + RubyClass klass = (RubyClass) recv; + return klass.newInstance(context, miniSSLContext, Block.NULL_BLOCK); + } + + private static String asStringValue(IRubyObject value, Supplier defaultValue) { + if (defaultValue != null && value.isNil()) return defaultValue.get(); + return value.convertToString().asJavaString(); + } + + private static boolean isDefaultSymbol(ThreadContext context, IRubyObject truststore) { + return context.runtime.newSymbol("default").equals(truststore); + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context, IRubyObject miniSSLContext) + throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { + + String keystoreFile = miniSSLContext.callMethod(context, "keystore").convertToString().asJavaString(); + KeyManagerFactory kmf = keyManagerFactoryMap.get(keystoreFile); + IRubyObject truststore = miniSSLContext.callMethod(context, "truststore"); + String truststoreFile = isDefaultSymbol(context, truststore) ? "" : asStringValue(truststore, () -> keystoreFile); + TrustManagerFactory tmf = trustManagerFactoryMap.get(truststoreFile); // null if self.truststore = :default + if (kmf == null) { + throw new KeyStoreException("Could not find KeyManagerFactory for keystore: " + keystoreFile + " truststore: " + truststoreFile); + } + + SSLContext sslCtx = SSLContext.getInstance("TLS"); + + sslCtx.init(kmf.getKeyManagers(), getTrustManagers(tmf), null); + closed = false; + handshake = false; + engine = sslCtx.createSSLEngine(); + + String[] enabledProtocols; + IRubyObject protocols = miniSSLContext.callMethod(context, "protocols"); + if (protocols.isNil()) { + if (miniSSLContext.callMethod(context, "no_tlsv1").isTrue()) { + enabledProtocols = new String[] { "TLSv1.1", "TLSv1.2", "TLSv1.3" }; + } else { + enabledProtocols = new String[] { "TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3" }; + } + + if (miniSSLContext.callMethod(context, "no_tlsv1_1").isTrue()) { + enabledProtocols = new String[] { "TLSv1.2", "TLSv1.3" }; + } + } else if (protocols instanceof RubyArray) { + enabledProtocols = (String[]) ((RubyArray) protocols).toArray(new String[0]); + } else { + throw context.runtime.newTypeError(protocols, context.runtime.getArray()); + } + engine.setEnabledProtocols(enabledProtocols); + + engine.setUseClientMode(false); + + long verify_mode = miniSSLContext.callMethod(context, "verify_mode").convertToInteger("to_i").getLongValue(); + if ((verify_mode & 0x1) != 0) { // 'peer' + engine.setWantClientAuth(true); + } + if ((verify_mode & 0x2) != 0) { // 'force_peer' + engine.setNeedClientAuth(true); + } + + IRubyObject cipher_suites = miniSSLContext.callMethod(context, "cipher_suites"); + if (cipher_suites instanceof RubyArray) { + engine.setEnabledCipherSuites((String[]) ((RubyArray) cipher_suites).toArray(new String[0])); + } else if (!cipher_suites.isNil()) { + throw context.runtime.newTypeError(cipher_suites, context.runtime.getArray()); + } + + SSLSession session = engine.getSession(); + inboundNetData = new MiniSSLBuffer(session.getPacketBufferSize()); + outboundAppData = new MiniSSLBuffer(session.getApplicationBufferSize()); + outboundAppData.flip(); + outboundNetData = new MiniSSLBuffer(session.getPacketBufferSize()); + + return this; + } + + private TrustManager[] getTrustManagers(TrustManagerFactory factory) { + if (factory == null) return null; // use JDK trust defaults + final TrustManager[] tms = factory.getTrustManagers(); + if (tms != null) { + for (int i=0; i 0 ? chain[0] : null; + delegate.checkClientTrusted(chain, authType); + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + delegate.checkServerTrusted(chain, authType); + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return delegate.getAcceptedIssuers(); + } + + } + + @JRubyMethod + public IRubyObject inject(IRubyObject arg) { + ByteList bytes = arg.convertToString().getByteList(); + inboundNetData.put(bytes.unsafeBytes(), bytes.getBegin(), bytes.getRealSize()); + return this; + } + + private enum SSLOperation { + WRAP, + UNWRAP + } + + private SSLEngineResult doOp(SSLOperation sslOp, MiniSSLBuffer src, MiniSSLBuffer dst) throws SSLException { + SSLEngineResult res = null; + boolean retryOp = true; + while (retryOp) { + switch (sslOp) { + case WRAP: + res = engine.wrap(src.getRawBuffer(), dst.getRawBuffer()); + break; + case UNWRAP: + res = engine.unwrap(src.getRawBuffer(), dst.getRawBuffer()); + break; + default: + throw new AssertionError("Unknown SSLOperation: " + sslOp); + } + + switch (res.getStatus()) { + case BUFFER_OVERFLOW: + // increase the buffer size to accommodate the overflowing data + int newSize = Math.max(engine.getSession().getPacketBufferSize(), engine.getSession().getApplicationBufferSize()); + dst.resize(newSize + dst.position()); + // retry the operation + retryOp = true; + break; + case BUFFER_UNDERFLOW: + // need to wait for more data to come in before we retry + retryOp = false; + break; + case CLOSED: + closed = true; + retryOp = false; + break; + default: + // other case is OK. We're done here. + retryOp = false; + } + if (res.getHandshakeStatus() == HandshakeStatus.FINISHED) { + handshake = true; + } + } + + return res; + } + + @JRubyMethod + public IRubyObject read() { + try { + inboundNetData.flip(); + + if(!inboundNetData.hasRemaining()) { + return getRuntime().getNil(); + } + + MiniSSLBuffer inboundAppData = new MiniSSLBuffer(engine.getSession().getApplicationBufferSize()); + doOp(SSLOperation.UNWRAP, inboundNetData, inboundAppData); + + HandshakeStatus handshakeStatus = engine.getHandshakeStatus(); + boolean done = false; + while (!done) { + SSLEngineResult res; + switch (handshakeStatus) { + case NEED_WRAP: + res = doOp(SSLOperation.WRAP, inboundAppData, outboundNetData); + handshakeStatus = res.getHandshakeStatus(); + break; + case NEED_UNWRAP: + res = doOp(SSLOperation.UNWRAP, inboundNetData, inboundAppData); + if (res.getStatus() == Status.BUFFER_UNDERFLOW) { + // need more data before we can shake more hands + done = true; + } + handshakeStatus = res.getHandshakeStatus(); + break; + case NEED_TASK: + Runnable runnable; + while ((runnable = engine.getDelegatedTask()) != null) { + runnable.run(); + } + handshakeStatus = engine.getHandshakeStatus(); + break; + default: + done = true; + } + } + + if (inboundNetData.hasRemaining()) { + inboundNetData.compact(); + } else { + inboundNetData.clear(); + } + + ByteList appDataByteList = inboundAppData.asByteList(); + if (appDataByteList == null) { + return getRuntime().getNil(); + } + + return RubyString.newString(getRuntime(), appDataByteList); + } catch (SSLException e) { + throw newSSLError(getRuntime(), e); + } + } + + @JRubyMethod + public IRubyObject write(IRubyObject arg) { + byte[] bls = arg.convertToString().getBytes(); + outboundAppData = new MiniSSLBuffer(bls); + + return getRuntime().newFixnum(bls.length); + } + + @JRubyMethod + public IRubyObject extract(ThreadContext context) { + try { + ByteList dataByteList = outboundNetData.asByteList(); + if (dataByteList != null) { + return RubyString.newString(context.runtime, dataByteList); + } + + if (!outboundAppData.hasRemaining()) { + return context.nil; + } + + outboundNetData.clear(); + doOp(SSLOperation.WRAP, outboundAppData, outboundNetData); + dataByteList = outboundNetData.asByteList(); + if (dataByteList == null) { + return context.nil; + } + + return RubyString.newString(context.runtime, dataByteList); + } catch (SSLException e) { + throw newSSLError(getRuntime(), e); + } + } + + @JRubyMethod + public IRubyObject peercert(ThreadContext context) throws CertificateEncodingException { + Certificate peerCert; + try { + peerCert = engine.getSession().getPeerCertificates()[0]; + } catch (SSLPeerUnverifiedException e) { + peerCert = lastCheckedCert0; // null if trust check did not happen + } + return peerCert == null ? context.nil : JavaEmbedUtils.javaToRuby(context.runtime, peerCert.getEncoded()); + } + + @JRubyMethod(name = "init?") + public IRubyObject isInit(ThreadContext context) { + return handshake ? getRuntime().getFalse() : getRuntime().getTrue(); + } + + @JRubyMethod + public IRubyObject shutdown() { + if (closed || engine.isInboundDone() && engine.isOutboundDone()) { + if (engine.isOutboundDone()) { + engine.closeOutbound(); + } + return getRuntime().getTrue(); + } else { + return getRuntime().getFalse(); + } + } + + private static RubyClass getSSLError(Ruby runtime) { + return (RubyClass) ((RubyModule) runtime.getModule("Puma").getConstantAt("MiniSSL")).getConstantAt("SSLError"); + } + + private static RaiseException newSSLError(Ruby runtime, SSLException cause) { + return newError(runtime, getSSLError(runtime), cause.toString(), cause); + } + + private static RaiseException newError(Ruby runtime, RubyClass errorClass, String message, Throwable cause) { + RaiseException ex = RaiseException.from(runtime, errorClass, message); + ex.initCause(cause); + return ex; + } + +} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/puma_http11.c b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/puma_http11.c new file mode 100644 index 0000000..b6bd18d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/puma_http11.c @@ -0,0 +1,495 @@ +/** + * Copyright (c) 2005 Zed A. Shaw + * You can redistribute it and/or modify it under the same terms as Ruby. + * License 3-clause BSD + */ + +#define RSTRING_NOT_MODIFIED 1 + +#include "ruby.h" +#include "ext_help.h" +#include +#include +#include +#include "http11_parser.h" + +#ifndef MANAGED_STRINGS + +#ifndef RSTRING_PTR +#define RSTRING_PTR(s) (RSTRING(s)->ptr) +#endif +#ifndef RSTRING_LEN +#define RSTRING_LEN(s) (RSTRING(s)->len) +#endif + +#define rb_extract_chars(e, sz) (*sz = RSTRING_LEN(e), RSTRING_PTR(e)) +#define rb_free_chars(e) /* nothing */ + +#endif + +static VALUE eHttpParserError; + +#define HTTP_PREFIX "HTTP_" +#define HTTP_PREFIX_LEN (sizeof(HTTP_PREFIX) - 1) + +static VALUE global_request_method; +static VALUE global_request_uri; +static VALUE global_fragment; +static VALUE global_query_string; +static VALUE global_server_protocol; +static VALUE global_request_path; + +/** Defines common length and error messages for input length validation. */ +#define QUOTE(s) #s +#define EXPAND_MAX_LENGTH_VALUE(s) QUOTE(s) +#define DEF_MAX_LENGTH(N,length) const size_t MAX_##N##_LENGTH = length; const char *MAX_##N##_LENGTH_ERR = "HTTP element " # N " is longer than the " EXPAND_MAX_LENGTH_VALUE(length) " allowed length (was %d)" + +/** Validates the max length of given input and throws an HttpParserError exception if over. */ +#define VALIDATE_MAX_LENGTH(len, N) if(len > MAX_##N##_LENGTH) { rb_raise(eHttpParserError, MAX_##N##_LENGTH_ERR, len); } + +/** Defines global strings in the init method. */ +#define DEF_GLOBAL(N, val) global_##N = rb_str_new2(val); rb_global_variable(&global_##N) + + +/* Defines the maximum allowed lengths for various input elements.*/ +#ifndef PUMA_REQUEST_URI_MAX_LENGTH +#define PUMA_REQUEST_URI_MAX_LENGTH (1024 * 12) +#endif + +#ifndef PUMA_REQUEST_PATH_MAX_LENGTH +#define PUMA_REQUEST_PATH_MAX_LENGTH (8192) +#endif + +#ifndef PUMA_QUERY_STRING_MAX_LENGTH +#define PUMA_QUERY_STRING_MAX_LENGTH (1024 * 10) +#endif + +DEF_MAX_LENGTH(FIELD_NAME, 256); +DEF_MAX_LENGTH(FIELD_VALUE, 80 * 1024); +DEF_MAX_LENGTH(REQUEST_URI, PUMA_REQUEST_URI_MAX_LENGTH); +DEF_MAX_LENGTH(FRAGMENT, 1024); /* Don't know if this length is specified somewhere or not */ +DEF_MAX_LENGTH(REQUEST_PATH, PUMA_REQUEST_PATH_MAX_LENGTH); +DEF_MAX_LENGTH(QUERY_STRING, PUMA_QUERY_STRING_MAX_LENGTH); +DEF_MAX_LENGTH(HEADER, (1024 * (80 + 32))); + +struct common_field { + const size_t len; + const char *name; + int raw; + VALUE value; +}; + +/* + * A list of common HTTP headers we expect to receive. + * This allows us to avoid repeatedly creating identical string + * objects to be used with rb_hash_aset(). + */ +static struct common_field common_http_fields[] = { +# define f(N) { (sizeof(N) - 1), N, 0, Qnil } +# define fr(N) { (sizeof(N) - 1), N, 1, Qnil } + f("ACCEPT"), + f("ACCEPT_CHARSET"), + f("ACCEPT_ENCODING"), + f("ACCEPT_LANGUAGE"), + f("ALLOW"), + f("AUTHORIZATION"), + f("CACHE_CONTROL"), + f("CONNECTION"), + f("CONTENT_ENCODING"), + fr("CONTENT_LENGTH"), + fr("CONTENT_TYPE"), + f("COOKIE"), + f("DATE"), + f("EXPECT"), + f("FROM"), + f("HOST"), + f("IF_MATCH"), + f("IF_MODIFIED_SINCE"), + f("IF_NONE_MATCH"), + f("IF_RANGE"), + f("IF_UNMODIFIED_SINCE"), + f("KEEP_ALIVE"), /* Firefox sends this */ + f("MAX_FORWARDS"), + f("PRAGMA"), + f("PROXY_AUTHORIZATION"), + f("RANGE"), + f("REFERER"), + f("TE"), + f("TRAILER"), + f("TRANSFER_ENCODING"), + f("UPGRADE"), + f("USER_AGENT"), + f("VIA"), + f("X_FORWARDED_FOR"), /* common for proxies */ + f("X_REAL_IP"), /* common for proxies */ + f("WARNING") +# undef f +}; + +static void init_common_fields(void) +{ + unsigned i; + struct common_field *cf = common_http_fields; + char tmp[256]; /* MAX_FIELD_NAME_LENGTH */ + memcpy(tmp, HTTP_PREFIX, HTTP_PREFIX_LEN); + + for(i = 0; i < ARRAY_SIZE(common_http_fields); cf++, i++) { + if(cf->raw) { + cf->value = rb_str_new(cf->name, cf->len); + } else { + memcpy(tmp + HTTP_PREFIX_LEN, cf->name, cf->len + 1); + cf->value = rb_str_new(tmp, HTTP_PREFIX_LEN + cf->len); + } + rb_global_variable(&cf->value); + } +} + +static VALUE find_common_field_value(const char *field, size_t flen) +{ + unsigned i; + struct common_field *cf = common_http_fields; + for(i = 0; i < ARRAY_SIZE(common_http_fields); i++, cf++) { + if (cf->len == flen && !memcmp(cf->name, field, flen)) + return cf->value; + } + return Qnil; +} + +void http_field(puma_parser* hp, const char *field, size_t flen, + const char *value, size_t vlen) +{ + VALUE f = Qnil; + VALUE v; + + VALIDATE_MAX_LENGTH(flen, FIELD_NAME); + VALIDATE_MAX_LENGTH(vlen, FIELD_VALUE); + + f = find_common_field_value(field, flen); + + if (f == Qnil) { + /* + * We got a strange header that we don't have a memoized value for. + * Fallback to creating a new string to use as a hash key. + */ + + size_t new_size = HTTP_PREFIX_LEN + flen; + assert(new_size < BUFFER_LEN); + + memcpy(hp->buf, HTTP_PREFIX, HTTP_PREFIX_LEN); + memcpy(hp->buf + HTTP_PREFIX_LEN, field, flen); + + f = rb_str_new(hp->buf, new_size); + } + + while (vlen > 0 && isspace(value[vlen - 1])) vlen--; + + /* check for duplicate header */ + v = rb_hash_aref(hp->request, f); + + if (v == Qnil) { + v = rb_str_new(value, vlen); + rb_hash_aset(hp->request, f, v); + } else { + /* if duplicate header, normalize to comma-separated values */ + rb_str_cat2(v, ", "); + rb_str_cat(v, value, vlen); + } +} + +void request_method(puma_parser* hp, const char *at, size_t length) +{ + VALUE val = Qnil; + + val = rb_str_new(at, length); + rb_hash_aset(hp->request, global_request_method, val); +} + +void request_uri(puma_parser* hp, const char *at, size_t length) +{ + VALUE val = Qnil; + + VALIDATE_MAX_LENGTH(length, REQUEST_URI); + + val = rb_str_new(at, length); + rb_hash_aset(hp->request, global_request_uri, val); +} + +void fragment(puma_parser* hp, const char *at, size_t length) +{ + VALUE val = Qnil; + + VALIDATE_MAX_LENGTH(length, FRAGMENT); + + val = rb_str_new(at, length); + rb_hash_aset(hp->request, global_fragment, val); +} + +void request_path(puma_parser* hp, const char *at, size_t length) +{ + VALUE val = Qnil; + + VALIDATE_MAX_LENGTH(length, REQUEST_PATH); + + val = rb_str_new(at, length); + rb_hash_aset(hp->request, global_request_path, val); +} + +void query_string(puma_parser* hp, const char *at, size_t length) +{ + VALUE val = Qnil; + + VALIDATE_MAX_LENGTH(length, QUERY_STRING); + + val = rb_str_new(at, length); + rb_hash_aset(hp->request, global_query_string, val); +} + +void server_protocol(puma_parser* hp, const char *at, size_t length) +{ + VALUE val = rb_str_new(at, length); + rb_hash_aset(hp->request, global_server_protocol, val); +} + +/** Finalizes the request header to have a bunch of stuff that's + needed. */ + +void header_done(puma_parser* hp, const char *at, size_t length) +{ + hp->body = rb_str_new(at, length); +} + + +void HttpParser_free(void *data) { + TRACE(); + + if(data) { + xfree(data); + } +} + +void HttpParser_mark(void *ptr) { + puma_parser *hp = ptr; + if(hp->request) rb_gc_mark(hp->request); + if(hp->body) rb_gc_mark(hp->body); +} + +const rb_data_type_t HttpParser_data_type = { + "HttpParser", + { HttpParser_mark, HttpParser_free, 0 }, + 0, 0, RUBY_TYPED_FREE_IMMEDIATELY, +}; + +VALUE HttpParser_alloc(VALUE klass) +{ + puma_parser *hp = ALLOC_N(puma_parser, 1); + TRACE(); + hp->http_field = http_field; + hp->request_method = request_method; + hp->request_uri = request_uri; + hp->fragment = fragment; + hp->request_path = request_path; + hp->query_string = query_string; + hp->server_protocol = server_protocol; + hp->header_done = header_done; + hp->request = Qnil; + + puma_parser_init(hp); + + return TypedData_Wrap_Struct(klass, &HttpParser_data_type, hp); +} + +/** + * call-seq: + * parser.new -> parser + * + * Creates a new parser. + */ +VALUE HttpParser_init(VALUE self) +{ + puma_parser *http = NULL; + DATA_GET(self, puma_parser, &HttpParser_data_type, http); + puma_parser_init(http); + + return self; +} + + +/** + * call-seq: + * parser.reset -> nil + * + * Resets the parser to it's initial state so that you can reuse it + * rather than making new ones. + */ +VALUE HttpParser_reset(VALUE self) +{ + puma_parser *http = NULL; + DATA_GET(self, puma_parser, &HttpParser_data_type, http); + puma_parser_init(http); + + return Qnil; +} + + +/** + * call-seq: + * parser.finish -> true/false + * + * Finishes a parser early which could put in a "good" or bad state. + * You should call reset after finish it or bad things will happen. + */ +VALUE HttpParser_finish(VALUE self) +{ + puma_parser *http = NULL; + DATA_GET(self, puma_parser, &HttpParser_data_type, http); + puma_parser_finish(http); + + return puma_parser_is_finished(http) ? Qtrue : Qfalse; +} + + +/** + * call-seq: + * parser.execute(req_hash, data, start) -> Integer + * + * Takes a Hash and a String of data, parses the String of data filling in the Hash + * returning an Integer to indicate how much of the data has been read. No matter + * what the return value, you should call HttpParser#finished? and HttpParser#error? + * to figure out if it's done parsing or there was an error. + * + * This function now throws an exception when there is a parsing error. This makes + * the logic for working with the parser much easier. You can still test for an + * error, but now you need to wrap the parser with an exception handling block. + * + * The third argument allows for parsing a partial request and then continuing + * the parsing from that position. It needs all of the original data as well + * so you have to append to the data buffer as you read. + */ +VALUE HttpParser_execute(VALUE self, VALUE req_hash, VALUE data, VALUE start) +{ + puma_parser *http = NULL; + int from = 0; + char *dptr = NULL; + long dlen = 0; + + DATA_GET(self, puma_parser, &HttpParser_data_type, http); + + from = FIX2INT(start); + dptr = rb_extract_chars(data, &dlen); + + if(from >= dlen) { + rb_free_chars(dptr); + rb_raise(eHttpParserError, "%s", "Requested start is after data buffer end."); + } else { + http->request = req_hash; + puma_parser_execute(http, dptr, dlen, from); + + rb_free_chars(dptr); + VALIDATE_MAX_LENGTH(puma_parser_nread(http), HEADER); + + if(puma_parser_has_error(http)) { + rb_raise(eHttpParserError, "%s", "Invalid HTTP format, parsing fails. Are you trying to open an SSL connection to a non-SSL Puma?"); + } else { + return INT2FIX(puma_parser_nread(http)); + } + } +} + + + +/** + * call-seq: + * parser.error? -> true/false + * + * Tells you whether the parser is in an error state. + */ +VALUE HttpParser_has_error(VALUE self) +{ + puma_parser *http = NULL; + DATA_GET(self, puma_parser, &HttpParser_data_type, http); + + return puma_parser_has_error(http) ? Qtrue : Qfalse; +} + + +/** + * call-seq: + * parser.finished? -> true/false + * + * Tells you whether the parser is finished or not and in a good state. + */ +VALUE HttpParser_is_finished(VALUE self) +{ + puma_parser *http = NULL; + DATA_GET(self, puma_parser, &HttpParser_data_type, http); + + return puma_parser_is_finished(http) ? Qtrue : Qfalse; +} + + +/** + * call-seq: + * parser.nread -> Integer + * + * Returns the amount of data processed so far during this processing cycle. It is + * set to 0 on initialize or reset calls and is incremented each time execute is called. + */ +VALUE HttpParser_nread(VALUE self) +{ + puma_parser *http = NULL; + DATA_GET(self, puma_parser, &HttpParser_data_type, http); + + return INT2FIX(http->nread); +} + +/** + * call-seq: + * parser.body -> nil or String + * + * If the request included a body, returns it. + */ +VALUE HttpParser_body(VALUE self) { + puma_parser *http = NULL; + DATA_GET(self, puma_parser, &HttpParser_data_type, http); + + return http->body; +} + +#ifdef HAVE_OPENSSL_BIO_H +void Init_mini_ssl(VALUE mod); +#endif + +void Init_puma_http11(void) +{ +#ifdef HAVE_RB_EXT_RACTOR_SAFE + rb_ext_ractor_safe(true); +#endif + + VALUE mPuma = rb_define_module("Puma"); + VALUE cHttpParser = rb_define_class_under(mPuma, "HttpParser", rb_cObject); + + DEF_GLOBAL(request_method, "REQUEST_METHOD"); + DEF_GLOBAL(request_uri, "REQUEST_URI"); + DEF_GLOBAL(fragment, "FRAGMENT"); + DEF_GLOBAL(query_string, "QUERY_STRING"); + DEF_GLOBAL(server_protocol, "SERVER_PROTOCOL"); + DEF_GLOBAL(request_path, "REQUEST_PATH"); + + eHttpParserError = rb_define_class_under(mPuma, "HttpParserError", rb_eStandardError); + rb_global_variable(&eHttpParserError); + + rb_define_alloc_func(cHttpParser, HttpParser_alloc); + rb_define_method(cHttpParser, "initialize", HttpParser_init, 0); + rb_define_method(cHttpParser, "reset", HttpParser_reset, 0); + rb_define_method(cHttpParser, "finish", HttpParser_finish, 0); + rb_define_method(cHttpParser, "execute", HttpParser_execute, 3); + rb_define_method(cHttpParser, "error?", HttpParser_has_error, 0); + rb_define_method(cHttpParser, "finished?", HttpParser_is_finished, 0); + rb_define_method(cHttpParser, "nread", HttpParser_nread, 0); + rb_define_method(cHttpParser, "body", HttpParser_body, 0); + init_common_fields(); + +#ifdef HAVE_OPENSSL_BIO_H + Init_mini_ssl(mPuma); +#endif +} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma.rb new file mode 100644 index 0000000..ab2b220 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true + +# Standard libraries +require 'socket' +require 'tempfile' +require 'uri' +require 'stringio' + +require 'thread' + +# use require, see https://github.com/puma/puma/pull/2381 +require 'puma/puma_http11' + +require_relative 'puma/detect' +require_relative 'puma/json_serialization' + +module Puma + # when Puma is loaded via `Puma::CLI`, all files are loaded via + # `require_relative`. The below are for non-standard loading + autoload :Const, "#{__dir__}/puma/const" + autoload :Server, "#{__dir__}/puma/server" + autoload :Launcher, "#{__dir__}/puma/launcher" + autoload :LogWriter, "#{__dir__}/puma/log_writer" + + # at present, MiniSSL::Engine is only defined in extension code (puma_http11), + # not in minissl.rb + HAS_SSL = const_defined?(:MiniSSL, false) && MiniSSL.const_defined?(:Engine, false) + + HAS_UNIX_SOCKET = Object.const_defined?(:UNIXSocket) && !IS_WINDOWS + + if HAS_SSL + require_relative 'puma/minissl' + else + module MiniSSL + # this class is defined so that it exists when Puma is compiled + # without ssl support, as Server and Reactor use it in rescue statements. + class SSLError < StandardError ; end + end + end + + def self.ssl? + HAS_SSL + end + + def self.abstract_unix_socket? + @abstract_unix ||= + if HAS_UNIX_SOCKET + begin + ::UNIXServer.new("\0puma.temp.unix").close + true + rescue ArgumentError # darwin + false + end + else + false + end + end + + # @!attribute [rw] stats_object= + def self.stats_object=(val) + @get_stats = val + end + + # @!attribute [rw] stats_object + def self.stats + Puma::JSONSerialization.generate @get_stats.stats + end + + # @!attribute [r] stats_hash + # @version 5.0.0 + def self.stats_hash + @get_stats.stats + end + + def self.set_thread_name(name) + Thread.current.name = "puma #{name}" + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/app/status.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/app/status.rb new file mode 100644 index 0000000..53c012e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/app/status.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: true +require_relative '../json_serialization' + +module Puma + module App + # Check out {#call}'s source code to see what actions this web application + # can respond to. + class Status + OK_STATUS = '{ "status": "ok" }'.freeze + + # @param launcher [::Puma::Launcher] + # @param token [String, nil] the token used for authentication + # + def initialize(launcher, token = nil) + @launcher = launcher + @auth_token = token + end + + # most commands call methods in `::Puma::Launcher` based on command in + # `env['PATH_INFO']` + def call(env) + unless authenticate(env) + return rack_response(403, 'Invalid auth token', 'text/plain') + end + + # resp_type is processed by following case statement, return + # is a number (status) or a string used as the body of a 200 response + resp_type = + case env['PATH_INFO'][/\/([^\/]+)$/, 1] + when 'stop' + @launcher.stop ; 200 + + when 'halt' + @launcher.halt ; 200 + + when 'restart' + @launcher.restart ; 200 + + when 'phased-restart' + @launcher.phased_restart ? 200 : 404 + + when 'refork' + @launcher.refork ? 200 : 404 + + when 'reload-worker-directory' + @launcher.send(:reload_worker_directory) ? 200 : 404 + + when 'gc' + GC.start ; 200 + + when 'gc-stats' + Puma::JSONSerialization.generate GC.stat + + when 'stats' + Puma::JSONSerialization.generate @launcher.stats + + when 'thread-backtraces' + backtraces = [] + @launcher.thread_status do |name, backtrace| + backtraces << { name: name, backtrace: backtrace } + end + Puma::JSONSerialization.generate backtraces + + else + return rack_response(404, "Unsupported action", 'text/plain') + end + + case resp_type + when String + rack_response 200, resp_type + when 200 + rack_response 200, OK_STATUS + when 404 + str = env['PATH_INFO'][/\/(\S+)/, 1].tr '-', '_' + rack_response 404, "{ \"error\": \"#{str} not available\" }" + end + end + + private + + def authenticate(env) + return true unless @auth_token + env['QUERY_STRING'].to_s.split(/[&;]/).include? "token=#{@auth_token}" + end + + def rack_response(status, body, content_type='application/json') + headers = { + 'content-type' => content_type, + 'content-length' => body.bytesize.to_s + } + + [status, headers, [body]] + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/binder.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/binder.rb new file mode 100644 index 0000000..bbcca5b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/binder.rb @@ -0,0 +1,509 @@ +# frozen_string_literal: true + +require 'uri' +require 'socket' + +require_relative 'const' +require_relative 'util' +require_relative 'configuration' + +module Puma + + if HAS_SSL + require_relative 'minissl' + require_relative 'minissl/context_builder' + end + + class Binder + include Puma::Const + + RACK_VERSION = [1,6].freeze + + def initialize(log_writer, conf = Configuration.new, env: ENV) + @log_writer = log_writer + @conf = conf + @listeners = [] + @inherited_fds = {} + @activated_sockets = {} + @unix_paths = [] + @env = env + + @proto_env = { + "rack.version".freeze => RACK_VERSION, + "rack.errors".freeze => log_writer.stderr, + "rack.multithread".freeze => conf.options[:max_threads] > 1, + "rack.multiprocess".freeze => conf.options[:workers] >= 1, + "rack.run_once".freeze => false, + RACK_URL_SCHEME => conf.options[:rack_url_scheme], + "SCRIPT_NAME".freeze => env['SCRIPT_NAME'] || "", + + # I'd like to set a default CONTENT_TYPE here but some things + # depend on their not being a default set and inferring + # it from the content. And so if i set it here, it won't + # infer properly. + + "QUERY_STRING".freeze => "", + SERVER_SOFTWARE => PUMA_SERVER_STRING, + GATEWAY_INTERFACE => CGI_VER + } + + @envs = {} + @ios = [] + end + + attr_reader :ios + + # @version 5.0.0 + attr_reader :activated_sockets, :envs, :inherited_fds, :listeners, :proto_env, :unix_paths + + # @version 5.0.0 + attr_writer :ios, :listeners + + def env(sock) + @envs.fetch(sock, @proto_env) + end + + def close + @ios.each { |i| i.close } + end + + # @!attribute [r] connected_ports + # @version 5.0.0 + def connected_ports + t = ios.map { |io| io.addr[1] }; t.uniq!; t + end + + # @version 5.0.0 + def create_inherited_fds(env_hash) + env_hash.select {|k,v| k =~ /PUMA_INHERIT_\d+/}.each do |_k, v| + fd, url = v.split(":", 2) + @inherited_fds[url] = fd.to_i + end.keys # pass keys back for removal + end + + # systemd socket activation. + # LISTEN_FDS = number of listening sockets. e.g. 2 means accept on 2 sockets w/descriptors 3 and 4. + # LISTEN_PID = PID of the service process, aka us + # @see https://www.freedesktop.org/software/systemd/man/systemd-socket-activate.html + # @version 5.0.0 + # + def create_activated_fds(env_hash) + @log_writer.debug "ENV['LISTEN_FDS'] #{@env['LISTEN_FDS'].inspect} env_hash['LISTEN_PID'] #{env_hash['LISTEN_PID'].inspect}" + return [] unless env_hash['LISTEN_FDS'] && env_hash['LISTEN_PID'].to_i == $$ + env_hash['LISTEN_FDS'].to_i.times do |index| + sock = TCPServer.for_fd(socket_activation_fd(index)) + key = begin # Try to parse as a path + [:unix, Socket.unpack_sockaddr_un(sock.getsockname)] + rescue ArgumentError # Try to parse as a port/ip + port, addr = Socket.unpack_sockaddr_in(sock.getsockname) + addr = "[#{addr}]" if addr&.include? ':' + [:tcp, addr, port] + end + @activated_sockets[key] = sock + @log_writer.debug "Registered #{key.join ':'} for activation from LISTEN_FDS" + end + ["LISTEN_FDS", "LISTEN_PID"] # Signal to remove these keys from ENV + end + + # Synthesize binds from systemd socket activation + # + # When systemd socket activation is enabled, it can be tedious to keep the + # binds in sync. This method can synthesize any binds based on the received + # activated sockets. Any existing matching binds will be respected. + # + # When only_matching is true in, all binds that do not match an activated + # socket is removed in place. + # + # It's a noop if no activated sockets were received. + def synthesize_binds_from_activated_fs(binds, only_matching) + return binds unless activated_sockets.any? + + activated_binds = [] + + activated_sockets.keys.each do |proto, addr, port| + if port + tcp_url = "#{proto}://#{addr}:#{port}" + ssl_url = "ssl://#{addr}:#{port}" + ssl_url_prefix = "#{ssl_url}?" + + existing = binds.find { |bind| bind == tcp_url || bind == ssl_url || bind.start_with?(ssl_url_prefix) } + + activated_binds << (existing || tcp_url) + else + # TODO: can there be a SSL bind without a port? + activated_binds << "#{proto}://#{addr}" + end + end + + if only_matching + activated_binds + else + binds | activated_binds + end + end + + def before_parse(&block) + @before_parse ||= [] + @before_parse << block if block + @before_parse + end + + def parse(binds, log_writer = nil, log_msg = 'Listening') + before_parse.each(&:call) + log_writer ||= @log_writer + binds.each do |str| + uri = URI.parse str + case uri.scheme + when "tcp" + if fd = @inherited_fds.delete(str) + io = inherit_tcp_listener uri.host, uri.port, fd + log_writer.log "* Inherited #{str}" + elsif sock = @activated_sockets.delete([ :tcp, uri.host, uri.port ]) + io = inherit_tcp_listener uri.host, uri.port, sock + log_writer.log "* Activated #{str}" + else + ios_len = @ios.length + params = Util.parse_query uri.query + + low_latency = params.key?('low_latency') && params['low_latency'] != 'false' + backlog = params.fetch('https://github.com/backlog', 1024).to_i + + io = add_tcp_listener uri.host, uri.port, low_latency, backlog + + @ios[ios_len..-1].each do |i| + addr = loc_addr_str i + log_writer.log "* #{log_msg} on http://#{addr}" + end + end + + @listeners << [str, io] if io + when "unix" + path = "#{uri.host}#{uri.path}".gsub("%20", " ") + abstract = false + if str.start_with? 'unix://@' + raise "OS does not support abstract UNIXSockets" unless Puma.abstract_unix_socket? + abstract = true + path = "@#{path}" + end + + if fd = @inherited_fds.delete(str) + @unix_paths << path unless abstract || File.exist?(path) + io = inherit_unix_listener path, fd + log_writer.log "* Inherited #{str}" + elsif sock = @activated_sockets.delete([ :unix, path ]) || + !abstract && @activated_sockets.delete([ :unix, File.realdirpath(path) ]) + @unix_paths << path unless abstract || File.exist?(path) + io = inherit_unix_listener path, sock + log_writer.log "* Activated #{str}" + else + umask = nil + mode = nil + backlog = 1024 + + if uri.query + params = Util.parse_query uri.query + if u = params['umask'] + # Use Integer() to respect the 0 prefix as octal + umask = Integer(u) + end + + if u = params['mode'] + mode = Integer('0'+u) + end + + if u = params['backlog'] + backlog = Integer(u) + end + end + + @unix_paths << path unless abstract || File.exist?(path) + io = add_unix_listener path, umask, mode, backlog + log_writer.log "* #{log_msg} on #{str}" + end + + @listeners << [str, io] + when "ssl" + cert_key = %w[cert key] + + raise "Puma compiled without SSL support" unless HAS_SSL + + params = Util.parse_query uri.query + + # If key and certs are not defined and localhost gem is required. + # localhost gem will be used for self signed + # Load localhost authority if not loaded. + # Ruby 3 `values_at` accepts an array, earlier do not + if params.values_at(*cert_key).all? { |v| v.to_s.empty? } + ctx = localhost_authority && localhost_authority_context + end + + ctx ||= + begin + # Extract cert_pem and key_pem from options[:store] if present + cert_key.each do |v| + if params[v]&.start_with?('store:') + index = Integer(params.delete(v).split('store:').last) + params["#{v}_pem"] = @conf.options[:store][index] + end + end + MiniSSL::ContextBuilder.new(params, @log_writer).context + end + + if fd = @inherited_fds.delete(str) + log_writer.log "* Inherited #{str}" + io = inherit_ssl_listener fd, ctx + elsif sock = @activated_sockets.delete([ :tcp, uri.host, uri.port ]) + io = inherit_ssl_listener sock, ctx + log_writer.log "* Activated #{str}" + else + ios_len = @ios.length + backlog = params.fetch('https://github.com/backlog', 1024).to_i + low_latency = params['low_latency'] != 'false' + io = add_ssl_listener uri.host, uri.port, ctx, low_latency, backlog + + @ios[ios_len..-1].each do |i| + addr = loc_addr_str i + log_writer.log "* #{log_msg} on ssl://#{addr}?#{uri.query}" + end + end + + @listeners << [str, io] if io + else + log_writer.error "Invalid URI: #{str}" + end + end + + # If we inherited fds but didn't use them (because of a + # configuration change), then be sure to close them. + @inherited_fds.each do |str, fd| + log_writer.log "* Closing unused inherited connection: #{str}" + + begin + IO.for_fd(fd).close + rescue SystemCallError + end + + # We have to unlink a unix socket path that's not being used + uri = URI.parse str + if uri.scheme == "unix" + path = "#{uri.host}#{uri.path}" + File.unlink path + end + end + + # Also close any unused activated sockets + unless @activated_sockets.empty? + fds = @ios.map(&:to_i) + @activated_sockets.each do |key, sock| + next if fds.include? sock.to_i + log_writer.log "* Closing unused activated socket: #{key.first}://#{key[1..-1].join ':'}" + begin + sock.close + rescue SystemCallError + end + # We have to unlink a unix socket path that's not being used + File.unlink key[1] if key.first == :unix + end + end + end + + def localhost_authority + @localhost_authority ||= Localhost::Authority.fetch if defined?(Localhost::Authority) && !Puma::IS_JRUBY + end + + def localhost_authority_context + return unless localhost_authority + + key_path, crt_path = if [:key_path, :certificate_path].all? { |m| localhost_authority.respond_to?(m) } + [localhost_authority.key_path, localhost_authority.certificate_path] + else + local_certificates_path = File.expand_path("~/.localhost") + [File.join(local_certificates_path, "localhost.key"), File.join(local_certificates_path, "localhost.crt")] + end + MiniSSL::ContextBuilder.new({ "key" => key_path, "cert" => crt_path }, @log_writer).context + end + + # Tell the server to listen on host +host+, port +port+. + # If +optimize_for_latency+ is true (the default) then clients connecting + # will be optimized for latency over throughput. + # + # +backlog+ indicates how many unaccepted connections the kernel should + # allow to accumulate before returning connection refused. + # + def add_tcp_listener(host, port, optimize_for_latency=true, backlog=1024) + if host == "localhost" + loopback_addresses.each do |addr| + add_tcp_listener addr, port, optimize_for_latency, backlog + end + return + end + + host = host[1..-2] if host&.start_with? '[' + tcp_server = TCPServer.new(host, port) + + if optimize_for_latency + tcp_server.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) + end + tcp_server.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR, true) + tcp_server.listen backlog + + @ios << tcp_server + tcp_server + end + + def inherit_tcp_listener(host, port, fd) + s = fd.kind_of?(::TCPServer) ? fd : ::TCPServer.for_fd(fd) + + @ios << s + s + end + + def add_ssl_listener(host, port, ctx, + optimize_for_latency=true, backlog=1024) + + raise "Puma compiled without SSL support" unless HAS_SSL + # Puma will try to use local authority context if context is supplied nil + ctx ||= localhost_authority_context + + if host == "localhost" + loopback_addresses.each do |addr| + add_ssl_listener addr, port, ctx, optimize_for_latency, backlog + end + return + end + + host = host[1..-2] if host&.start_with? '[' + s = TCPServer.new(host, port) + if optimize_for_latency + s.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) + end + s.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR, true) + s.listen backlog + + ssl = MiniSSL::Server.new s, ctx + env = @proto_env.dup + env[HTTPS_KEY] = HTTPS + @envs[ssl] = env + + @ios << ssl + s + end + + def inherit_ssl_listener(fd, ctx) + raise "Puma compiled without SSL support" unless HAS_SSL + # Puma will try to use local authority context if context is supplied nil + ctx ||= localhost_authority_context + + s = fd.kind_of?(::TCPServer) ? fd : ::TCPServer.for_fd(fd) + + ssl = MiniSSL::Server.new(s, ctx) + + env = @proto_env.dup + env[HTTPS_KEY] = HTTPS + @envs[ssl] = env + + @ios << ssl + + s + end + + # Tell the server to listen on +path+ as a UNIX domain socket. + # + def add_unix_listener(path, umask=nil, mode=nil, backlog=1024) + # Let anyone connect by default + umask ||= 0 + + begin + old_mask = File.umask(umask) + + if File.exist? path + begin + old = UNIXSocket.new path + rescue SystemCallError, IOError + File.unlink path + else + old.close + raise "There is already a server bound to: #{path}" + end + end + s = UNIXServer.new path.sub(/\A@/, "\0") # check for abstract UNIXSocket + s.listen backlog + @ios << s + ensure + File.umask old_mask + end + + if mode + File.chmod mode, path + end + + env = @proto_env.dup + env[REMOTE_ADDR] = "127.0.0.1" + @envs[s] = env + + s + end + + def inherit_unix_listener(path, fd) + s = fd.kind_of?(::TCPServer) ? fd : ::UNIXServer.for_fd(fd) + + @ios << s + + env = @proto_env.dup + env[REMOTE_ADDR] = "127.0.0.1" + @envs[s] = env + + s + end + + def close_listeners + @listeners.each do |l, io| + begin + io.close unless io.closed? + uri = URI.parse l + next unless uri.scheme == 'unix' + unix_path = "#{uri.host}#{uri.path}" + File.unlink unix_path if @unix_paths.include?(unix_path) && File.exist?(unix_path) + rescue Errno::EBADF + end + end + end + + def redirects_for_restart + redirects = @listeners.map { |a| [a[1].to_i, a[1].to_i] }.to_h + redirects[:close_others] = true + redirects + end + + # @version 5.0.0 + def redirects_for_restart_env + @listeners.each_with_object({}).with_index do |(listen, memo), i| + memo["PUMA_INHERIT_#{i}"] = "#{listen[1].to_i}:#{listen[0]}" + end + end + + private + + # @!attribute [r] loopback_addresses + def loopback_addresses + t = Socket.ip_address_list.select do |addrinfo| + addrinfo.ipv6_loopback? || addrinfo.ipv4_loopback? + end + t.map! { |addrinfo| addrinfo.ip_address }; t.uniq!; t + end + + def loc_addr_str(io) + loc_addr = io.to_io.local_address + if loc_addr.ipv6? + "[#{loc_addr.ip_unpack[0]}]:#{loc_addr.ip_unpack[1]}" + else + loc_addr.ip_unpack.join(':') + end + end + + # @version 5.0.0 + def socket_activation_fd(int) + int + 3 # 3 is the magic number you add to follow the SA protocol + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cli.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cli.rb new file mode 100644 index 0000000..8f0c7a8 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cli.rb @@ -0,0 +1,247 @@ +# frozen_string_literal: true + +require 'optparse' +require 'uri' + +require_relative '../puma' +require_relative 'configuration' +require_relative 'launcher' +require_relative 'const' +require_relative 'log_writer' + +module Puma + class << self + # The CLI exports a Puma::Configuration instance here to allow + # apps to pick it up. An app must load this object conditionally + # because it is not set if the app is launched via any mechanism + # other than the CLI class. + attr_accessor :cli_config + end + + # Handles invoke a Puma::Server in a command line style. + # + class CLI + # Create a new CLI object using +argv+ as the command line + # arguments. + # + def initialize(argv, log_writer = LogWriter.stdio, events = Events.new, env: ENV) + @debug = false + @argv = argv.dup + @log_writer = log_writer + @events = events + + @conf = nil + + @stdout = nil + @stderr = nil + @append = false + + @control_url = nil + @control_options = {} + + setup_options env + + begin + @parser.parse! @argv + + if file = @argv.shift + @conf.configure do |user_config, file_config| + file_config.rackup file + end + end + rescue UnsupportedOption + exit 1 + end + + @conf.configure do |user_config, file_config| + if @stdout || @stderr + user_config.stdout_redirect @stdout, @stderr, @append + end + + if @control_url + user_config.activate_control_app @control_url, @control_options + end + end + + @launcher = Puma::Launcher.new(@conf, env: ENV, log_writer: @log_writer, events: @events, argv: argv) + end + + attr_reader :launcher + + # Parse the options, load the rackup, start the server and wait + # for it to finish. + # + def run + @launcher.run + end + + private + def unsupported(str) + @log_writer.error(str) + raise UnsupportedOption + end + + def configure_control_url(https://github.com/command_line_arg) + if command_line_arg + @control_url = command_line_arg + elsif Puma.jruby? + unsupported "No default url available on JRuby" + end + end + + # Build the OptionParser object to handle the available options. + # + + def setup_options(env = ENV) + @conf = Configuration.new({}, {events: @events}, env) do |user_config, file_config| + @parser = OptionParser.new do |o| + o.on "-b", "--bind URI", "URI to bind to (tcp://, unix://, ssl://)" do |arg| + user_config.bind arg + end + + o.on "--bind-to-activated-sockets [only]", "Bind to all activated sockets" do |arg| + user_config.bind_to_activated_sockets(arg || true) + end + + o.on "-C", "--config PATH", "Load PATH as a config file" do |arg| + file_config.load arg + end + + # Identical to supplying --config "-", but more semantic + o.on "--no-config", "Prevent Puma from searching for a config file" do |arg| + file_config.load "-" + end + + o.on "--control-url URL", "The bind url to use for the control server. Use 'auto' to use temp unix server" do |arg| + configure_control_url(https://github.com/arg) + end + + o.on "--control-token TOKEN", + "The token to use as authentication for the control server" do |arg| + @control_options[:auth_token] = arg + end + + o.on "--debug", "Log lowlevel debugging information" do + user_config.debug + end + + o.on "--dir DIR", "Change to DIR before starting" do |d| + user_config.directory d + end + + o.on "-e", "--environment ENVIRONMENT", + "The environment to run the Rack app on (default development)" do |arg| + user_config.environment arg + end + + o.on "-f", "--fork-worker=[REQUESTS]", OptionParser::DecimalInteger, + "Fork new workers from existing worker. Cluster mode only", + "Auto-refork after REQUESTS (default 1000)" do |*args| + user_config.fork_worker(*args.compact) + end + + o.on "-I", "--include PATH", "Specify $LOAD_PATH directories" do |arg| + $LOAD_PATH.unshift(*arg.split(':')) + end + + o.on "--idle-timeout SECONDS", "Number of seconds until the next request before automatic shutdown" do |arg| + user_config.idle_timeout arg + end + + o.on "-p", "--port PORT", "Define the TCP port to bind to", + "Use -b for more advanced options" do |arg| + user_config.bind "tcp://#{Configuration::DEFAULTS[:tcp_host]}:#{arg}" + end + + o.on "--pidfile PATH", "Use PATH as a pidfile" do |arg| + user_config.pidfile arg + end + + o.on "--plugin PLUGIN", "Load the given PLUGIN. Can be used multiple times to load multiple plugins." do |arg| + user_config.plugin arg + end + + o.on "--preload", "Preload the app. Cluster mode only" do + user_config.preload_app! + end + + o.on "--prune-bundler", "Prune out the bundler env if possible" do + user_config.prune_bundler + end + + o.on "--extra-runtime-dependencies GEM1,GEM2", "Defines any extra needed gems when using --prune-bundler" do |arg| + user_config.extra_runtime_dependencies arg.split(',') + end + + o.on "-q", "--quiet", "Do not log requests internally (default true)" do + user_config.quiet + end + + o.on "-v", "--log-requests", "Log requests as they occur" do + user_config.log_requests + end + + o.on "-R", "--restart-cmd CMD", + "The puma command to run during a hot restart", + "Default: inferred" do |cmd| + user_config.restart_command cmd + end + + o.on "-s", "--silent", "Do not log prompt messages other than errors" do + @log_writer = LogWriter.new(NullIO.new, $stderr) + end + + o.on "-S", "--state PATH", "Where to store the state details" do |arg| + user_config.state_path arg + end + + o.on '-t', '--threads INT', "min:max threads to use (default 0:16)" do |arg| + min, max = arg.split(":") + if max + user_config.threads min, max + else + user_config.threads min, min + end + end + + o.on "--early-hints", "Enable early hints support" do + user_config.early_hints + end + + o.on "-V", "--version", "Print the version information" do + puts "puma version #{Puma::Const::VERSION}" + exit 0 + end + + o.on "-w", "--workers COUNT", + "Activate cluster mode: How many worker processes to create" do |arg| + user_config.workers arg + end + + o.on "--tag NAME", "Additional text to display in process listing" do |arg| + user_config.tag arg + end + + o.on "--redirect-stdout FILE", "Redirect STDOUT to a specific file" do |arg| + @stdout = arg.to_s + end + + o.on "--redirect-stderr FILE", "Redirect STDERR to a specific file" do |arg| + @stderr = arg.to_s + end + + o.on "--[no-]redirect-append", "Append to redirected files" do |val| + @append = val + end + + o.banner = "puma " + + o.on_tail "-h", "--help", "Show help" do + $stdout.puts o + exit 0 + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/client.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/client.rb new file mode 100644 index 0000000..34bf857 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/client.rb @@ -0,0 +1,720 @@ +# frozen_string_literal: true + +class IO + # We need to use this for a jruby work around on both 1.8 and 1.9. + # So this either creates the constant (on 1.8), or harmlessly + # reopens it (on 1.9). + module WaitReadable + end +end + +require_relative 'detect' +require_relative 'io_buffer' +require 'tempfile' + +if Puma::IS_JRUBY + # We have to work around some OpenSSL buffer/io-readiness bugs + # so we pull it in regardless of if the user is binding + # to an SSL socket + require 'openssl' +end + +module Puma + + class ConnectionError < RuntimeError; end + + class HttpParserError501 < IOError; end + + #———————————————————————— DO NOT USE — this class is for internal use only ——— + + + # An instance of this class represents a unique request from a client. + # For example, this could be a web request from a browser or from CURL. + # + # An instance of `Puma::Client` can be used as if it were an IO object + # by the reactor. The reactor is expected to call `#to_io` + # on any non-IO objects it polls. For example, nio4r internally calls + # `IO::try_convert` (which may call `#to_io`) when a new socket is + # registered. + # + # Instances of this class are responsible for knowing if + # the header and body are fully buffered via the `try_to_finish` method. + # They can be used to "time out" a response via the `timeout_at` reader. + # + class Client # :nodoc: + + # this tests all values but the last, which must be chunked + ALLOWED_TRANSFER_ENCODING = %w[compress deflate gzip].freeze + + # chunked body validation + CHUNK_SIZE_INVALID = /[^\h]/.freeze + CHUNK_VALID_ENDING = Const::LINE_END + CHUNK_VALID_ENDING_SIZE = CHUNK_VALID_ENDING.bytesize + + # The maximum number of bytes we'll buffer looking for a valid + # chunk header. + MAX_CHUNK_HEADER_SIZE = 4096 + + # The maximum amount of excess data the client sends + # using chunk size extensions before we abort the connection. + MAX_CHUNK_EXCESS = 16 * 1024 + + # Content-Length header value validation + CONTENT_LENGTH_VALUE_INVALID = /[^\d]/.freeze + + TE_ERR_MSG = 'Invalid Transfer-Encoding' + + # The object used for a request with no body. All requests with + # no body share this one object since it has no state. + EmptyBody = NullIO.new + + include Puma::Const + + def initialize(io, env=nil) + @io = io + @to_io = io.to_io + @io_buffer = IOBuffer.new + @proto_env = env + @env = env&.dup + + @parser = HttpParser.new + @parsed_bytes = 0 + @read_header = true + @read_proxy = false + @ready = false + + @body = nil + @body_read_start = nil + @buffer = nil + @tempfile = nil + + @timeout_at = nil + + @requests_served = 0 + @hijacked = false + + @http_content_length_limit = nil + @http_content_length_limit_exceeded = false + + @peerip = nil + @peer_family = nil + @listener = nil + @remote_addr_header = nil + @expect_proxy_proto = false + + @body_remain = 0 + + @in_last_chunk = false + + # need unfrozen ASCII-8BIT, +'' is UTF-8 + @read_buffer = String.new # rubocop: disable Performance/UnfreezeString + end + + attr_reader :env, :to_io, :body, :io, :timeout_at, :ready, :hijacked, + :tempfile, :io_buffer, :http_content_length_limit_exceeded + + attr_writer :peerip, :http_content_length_limit + + attr_accessor :remote_addr_header, :listener + + # Remove in Puma 7? + def closed? + @to_io.closed? + end + + # Test to see if io meets a bare minimum of functioning, @to_io needs to be + # used for MiniSSL::Socket + def io_ok? + @to_io.is_a?(::BasicSocket) && !closed? + end + + # @!attribute [r] inspect + def inspect + "#" + end + + # For the hijack protocol (allows us to just put the Client object + # into the env) + def call + @hijacked = true + env[HIJACK_IO] ||= @io + end + + # @!attribute [r] in_data_phase + def in_data_phase + !(@read_header || @read_proxy) + end + + def set_timeout(val) + @timeout_at = Process.clock_gettime(Process::CLOCK_MONOTONIC) + val + end + + # Number of seconds until the timeout elapses. + def timeout + [@timeout_at - Process.clock_gettime(Process::CLOCK_MONOTONIC), 0].max + end + + def reset(fast_check=true) + @parser.reset + @io_buffer.reset + @read_header = true + @read_proxy = !!@expect_proxy_proto + @env = @proto_env.dup + @parsed_bytes = 0 + @ready = false + @body_remain = 0 + @peerip = nil if @remote_addr_header + @in_last_chunk = false + @http_content_length_limit_exceeded = false + + if @buffer + return false unless try_to_parse_proxy_protocol + + @parsed_bytes = parser_execute + + if @parser.finished? + return setup_body + elsif @parsed_bytes >= MAX_HEADER + raise HttpParserError, + "HEADER is longer than allowed, aborting client early." + end + + return false + else + begin + if fast_check && @to_io.wait_readable(FAST_TRACK_KA_TIMEOUT) + return try_to_finish + end + rescue IOError + # swallow it + end + end + end + + def close + tempfile_close + begin + @io.close + rescue IOError, Errno::EBADF + Puma::Util.purge_interrupt_queue + end + end + + def tempfile_close + tf_path = @tempfile&.path + @tempfile&.close + File.unlink(tf_path) if tf_path + @tempfile = nil + @body = nil + rescue Errno::ENOENT, IOError + end + + # If necessary, read the PROXY protocol from the buffer. Returns + # false if more data is needed. + def try_to_parse_proxy_protocol + if @read_proxy + if @expect_proxy_proto == :v1 + if @buffer.include? "\r\n" + if md = PROXY_PROTOCOL_V1_REGEX.match(@buffer) + if md[1] + @peerip = md[1].split(" ")[0] + end + @buffer = md.post_match + end + # if the buffer has a \r\n but doesn't have a PROXY protocol + # request, this is just HTTP from a non-PROXY client; move on + @read_proxy = false + return @buffer.size > 0 + else + return false + end + end + end + true + end + + def try_to_finish + if env[CONTENT_LENGTH] && above_http_content_limit(env[CONTENT_LENGTH].to_i) + @http_content_length_limit_exceeded = true + end + + if @http_content_length_limit_exceeded + @buffer = nil + @body = EmptyBody + set_ready + return true + end + + return read_body if in_data_phase + + data = nil + begin + data = @io.read_nonblock(CHUNK_SIZE) + rescue IO::WaitReadable + return false + rescue EOFError + # Swallow error, don't log + rescue SystemCallError, IOError + raise ConnectionError, "Connection error detected during read" + end + + # No data means a closed socket + unless data + @buffer = nil + set_ready + raise EOFError + end + + if @buffer + @buffer << data + else + @buffer = data + end + + return false unless try_to_parse_proxy_protocol + + @parsed_bytes = parser_execute + + if @parser.finished? && above_http_content_limit(@parser.body.bytesize) + @http_content_length_limit_exceeded = true + end + + if @parser.finished? + setup_body + elsif @parsed_bytes >= MAX_HEADER + raise HttpParserError, + "HEADER is longer than allowed, aborting client early." + else + false + end + end + + def eagerly_finish + return true if @ready + return false unless @to_io.wait_readable(0) + try_to_finish + end + + def finish(timeout) + return if @ready + @to_io.wait_readable(timeout) || timeout! until try_to_finish + end + + # Wraps `@parser.execute` and adds meaningful error messages + # @return [Integer] bytes of buffer read by parser + # + def parser_execute + @parser.execute(@env, @buffer, @parsed_bytes) + rescue => e + @env[HTTP_CONNECTION] = 'close' + raise e unless HttpParserError === e && e.message.include?('non-SSL') + + req, _ = @buffer.split "\r\n\r\n" + request_line, headers = req.split "\r\n", 2 + + # below checks for request issues and changes error message accordingly + if !@env.key? REQUEST_METHOD + if request_line.count(' ') != 2 + # maybe this is an SSL connection ? + raise e + else + method = request_line[/\A[^ ]+/] + raise e, "Invalid HTTP format, parsing fails. Bad method #{method}" + end + elsif !@env.key? REQUEST_PATH + path = request_line[/\A[^ ]+ +([^ ?\r\n]+)/, 1] + raise e, "Invalid HTTP format, parsing fails. Bad path #{path}" + elsif request_line.match?(/\A[^ ]+ +[^ ?\r\n]+\?/) && !@env.key?(QUERY_STRING) + query = request_line[/\A[^ ]+ +[^? ]+\?([^ ]+)/, 1] + raise e, "Invalid HTTP format, parsing fails. Bad query #{query}" + elsif !@env.key? SERVER_PROTOCOL + # protocol is bad + text = request_line[/[^ ]*\z/] + raise HttpParserError, "Invalid HTTP format, parsing fails. Bad protocol #{text}" + elsif !headers.empty? + # headers are bad + hdrs = headers.split("\r\n").map { |h| h.gsub "\n", '\n'}.join "\n" + raise HttpParserError, "Invalid HTTP format, parsing fails. Bad headers\n#{hdrs}" + end + end + + def timeout! + write_error(408) if in_data_phase + raise ConnectionError + end + + def write_error(status_code) + begin + @io << ERROR_RESPONSE[status_code] + rescue StandardError + end + end + + def peerip + return @peerip if @peerip + + if @remote_addr_header + hdr = (@env[@remote_addr_header] || @io.peeraddr.last).split(/[\s,]/).first + @peerip = hdr + return hdr + end + + @peerip ||= @io.peeraddr.last + end + + def peer_family + return @peer_family if @peer_family + + @peer_family ||= begin + @io.local_address.afamily + rescue + Socket::AF_INET + end + end + + # Returns true if the persistent connection can be closed immediately + # without waiting for the configured idle/shutdown timeout. + # @version 5.0.0 + # + def can_close? + # Allow connection to close if we're not in the middle of parsing a request. + @parsed_bytes == 0 + end + + def expect_proxy_proto=(val) + if val + if @read_header + @read_proxy = true + end + else + @read_proxy = false + end + @expect_proxy_proto = val + end + + private + + def setup_body + @body_read_start = Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond) + + if @env[HTTP_EXPECT] == CONTINUE + # TODO allow a hook here to check the headers before + # going forward + @io << HTTP_11_100 + @io.flush + end + + @read_header = false + + body = @parser.body + + te = @env[TRANSFER_ENCODING2] + if te + te_lwr = te.downcase + if te.include? ',' + te_ary = te_lwr.split ',' + te_count = te_ary.count CHUNKED + te_valid = te_ary[0..-2].all? { |e| ALLOWED_TRANSFER_ENCODING.include? e } + if te_ary.last == CHUNKED && te_count == 1 && te_valid + @env.delete TRANSFER_ENCODING2 + return setup_chunked_body body + elsif te_count >= 1 + raise HttpParserError , "#{TE_ERR_MSG}, multiple chunked: '#{te}'" + elsif !te_valid + raise HttpParserError501, "#{TE_ERR_MSG}, unknown value: '#{te}'" + end + elsif te_lwr == CHUNKED + @env.delete TRANSFER_ENCODING2 + return setup_chunked_body body + elsif ALLOWED_TRANSFER_ENCODING.include? te_lwr + raise HttpParserError , "#{TE_ERR_MSG}, single value must be chunked: '#{te}'" + else + raise HttpParserError501 , "#{TE_ERR_MSG}, unknown value: '#{te}'" + end + end + + @chunked_body = false + + cl = @env[CONTENT_LENGTH] + + if cl + # cannot contain characters that are not \d, or be empty + if CONTENT_LENGTH_VALUE_INVALID.match?(cl) || cl.empty? + raise HttpParserError, "Invalid Content-Length: #{cl.inspect}" + end + else + @buffer = body.empty? ? nil : body + @body = EmptyBody + set_ready + return true + end + + content_length = cl.to_i + + remain = content_length - body.bytesize + + if remain <= 0 + # Part of the body is a pipelined request OR garbage. We'll deal with that later. + if content_length == 0 + @body = EmptyBody + if body.empty? + @buffer = nil + else + @buffer = body + end + elsif remain == 0 + @body = StringIO.new body + @buffer = nil + else + @body = StringIO.new(body[0,content_length]) + @buffer = body[content_length..-1] + end + set_ready + return true + end + + if remain > MAX_BODY + @body = Tempfile.create(Const::PUMA_TMP_BASE) + File.unlink @body.path unless IS_WINDOWS + @body.binmode + @tempfile = @body + else + # The body[0,0] trick is to get an empty string in the same + # encoding as body. + @body = StringIO.new body[0,0] + end + + @body.write body + + @body_remain = remain + + false + end + + def read_body + if @chunked_body + return read_chunked_body + end + + # Read an odd sized chunk so we can read even sized ones + # after this + remain = @body_remain + + if remain > CHUNK_SIZE + want = CHUNK_SIZE + else + want = remain + end + + begin + chunk = @io.read_nonblock(want, @read_buffer) + rescue IO::WaitReadable + return false + rescue SystemCallError, IOError + raise ConnectionError, "Connection error detected during read" + end + + # No chunk means a closed socket + unless chunk + @body.close + @buffer = nil + set_ready + raise EOFError + end + + remain -= @body.write(chunk) + + if remain <= 0 + @body.rewind + @buffer = nil + set_ready + return true + end + + @body_remain = remain + + false + end + + def read_chunked_body + while true + begin + chunk = @io.read_nonblock(CHUNK_SIZE, @read_buffer) + rescue IO::WaitReadable + return false + rescue SystemCallError, IOError + raise ConnectionError, "Connection error detected during read" + end + + # No chunk means a closed socket + unless chunk + @body.close + @buffer = nil + set_ready + raise EOFError + end + + if decode_chunk(chunk) + @env[CONTENT_LENGTH] = @chunked_content_length.to_s + return true + end + end + end + + def setup_chunked_body(body) + @chunked_body = true + @partial_part_left = 0 + @prev_chunk = "" + @excess_cr = 0 + + @body = Tempfile.create(Const::PUMA_TMP_BASE) + File.unlink @body.path unless IS_WINDOWS + @body.binmode + @tempfile = @body + @chunked_content_length = 0 + + if decode_chunk(body) + @env[CONTENT_LENGTH] = @chunked_content_length.to_s + return true + end + end + + # @version 5.0.0 + def write_chunk(str) + @chunked_content_length += @body.write(str) + end + + def decode_chunk(chunk) + if @partial_part_left > 0 + if @partial_part_left <= chunk.size + if @partial_part_left > 2 + write_chunk(chunk[0..(@partial_part_left-3)]) # skip the \r\n + end + chunk = chunk[@partial_part_left..-1] + @partial_part_left = 0 + else + if @partial_part_left > 2 + if @partial_part_left == chunk.size + 1 + # Don't include the last \r + write_chunk(chunk[0..(@partial_part_left-3)]) + else + # don't include the last \r\n + write_chunk(chunk) + end + end + @partial_part_left -= chunk.size + return false + end + end + + if @prev_chunk.empty? + io = StringIO.new(chunk) + else + io = StringIO.new(@prev_chunk+chunk) + @prev_chunk = "" + end + + while !io.eof? + line = io.gets + if line.end_with?(CHUNK_VALID_ENDING) + # Puma doesn't process chunk extensions, but should parse if they're + # present, which is the reason for the semicolon regex + chunk_hex = line.strip[/\A[^;]+/] + if CHUNK_SIZE_INVALID.match? chunk_hex + raise HttpParserError, "Invalid chunk size: '#{chunk_hex}'" + end + len = chunk_hex.to_i(16) + if len == 0 + @in_last_chunk = true + @body.rewind + rest = io.read + if rest.bytesize < CHUNK_VALID_ENDING_SIZE + @buffer = nil + @partial_part_left = CHUNK_VALID_ENDING_SIZE - rest.bytesize + return false + else + # if the next character is a CRLF, set buffer to everything after that CRLF + start_of_rest = if rest.start_with?(CHUNK_VALID_ENDING) + CHUNK_VALID_ENDING_SIZE + else # we have started a trailer section, which we do not support. skip it! + rest.index(CHUNK_VALID_ENDING*2) + CHUNK_VALID_ENDING_SIZE*2 + end + + @buffer = rest[start_of_rest..-1] + @buffer = nil if @buffer.empty? + set_ready + return true + end + end + + # Track the excess as a function of the size of the + # header vs the size of the actual data. Excess can + # go negative (and is expected to) when the body is + # significant. + # The additional of chunk_hex.size and 2 compensates + # for a client sending 1 byte in a chunked body over + # a long period of time, making sure that that client + # isn't accidentally eventually punished. + @excess_cr += (line.size - len - chunk_hex.size - 2) + + if @excess_cr >= MAX_CHUNK_EXCESS + raise HttpParserError, "Maximum chunk excess detected" + end + + len += 2 + + part = io.read(len) + + unless part + @partial_part_left = len + next + end + + got = part.size + + case + when got == len + # proper chunked segment must end with "\r\n" + if part.end_with? CHUNK_VALID_ENDING + write_chunk(part[0..-3]) # to skip the ending \r\n + else + raise HttpParserError, "Chunk size mismatch" + end + when got <= len - 2 + write_chunk(part) + @partial_part_left = len - part.size + when got == len - 1 # edge where we get just \r but not \n + write_chunk(part[0..-2]) + @partial_part_left = len - part.size + end + else + if @prev_chunk.size + line.size >= MAX_CHUNK_HEADER_SIZE + raise HttpParserError, "maximum size of chunk header exceeded" + end + + @prev_chunk = line + return false + end + end + + if @in_last_chunk + set_ready + true + else + false + end + end + + def set_ready + if @body_read_start + @env['puma.request_body_wait'] = Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond) - @body_read_start + end + @requests_served += 1 + @ready = true + end + + def above_http_content_limit(value) + @http_content_length_limit&.< value + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster.rb new file mode 100644 index 0000000..4cf83ff --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster.rb @@ -0,0 +1,634 @@ +# frozen_string_literal: true + +require_relative 'runner' +require_relative 'util' +require_relative 'plugin' +require_relative 'cluster/worker_handle' +require_relative 'cluster/worker' + +module Puma + # This class is instantiated by the `Puma::Launcher` and used + # to boot and serve a Ruby application when puma "workers" are needed + # i.e. when using multi-processes. For example `$ puma -w 5` + # + # An instance of this class will spawn the number of processes passed in + # via the `spawn_workers` method call. Each worker will have it's own + # instance of a `Puma::Server`. + class Cluster < Runner + def initialize(launcher) + super(launcher) + + @phase = 0 + @workers = [] + @next_check = Time.now + + @phased_restart = false + end + + # Returns the list of cluster worker handles. + # @return [Array] + attr_reader :workers + + def stop_workers + log "- Gracefully shutting down workers..." + @workers.each { |x| x.term } + + begin + loop do + wait_workers + break if @workers.reject {|w| w.pid.nil?}.empty? + sleep 0.2 + end + rescue Interrupt + log "! Cancelled waiting for workers" + end + end + + def start_phased_restart(refork = false) + @events.fire_on_restart! + + @phase += 1 + if refork + log "- Starting worker refork, phase: #{@phase}" + else + log "- Starting phased worker restart, phase: #{@phase}" + end + + # Be sure to change the directory again before loading + # the app. This way we can pick up new code. + dir = @launcher.restart_dir + log "+ Changing to #{dir}" + Dir.chdir dir + end + + def redirect_io + super + + @workers.each { |x| x.hup } + end + + def spawn_workers + diff = @options[:workers] - @workers.size + return if diff < 1 + + master = Process.pid + if @options[:fork_worker] + @fork_writer << "-1\n" + end + + diff.times do + idx = next_worker_index + + if @options[:fork_worker] && idx != 0 + @fork_writer << "#{idx}\n" + pid = nil + else + pid = spawn_worker(idx, master) + end + + debug "Spawned worker: #{pid}" + @workers << WorkerHandle.new(idx, pid, @phase, @options) + end + + if @options[:fork_worker] && all_workers_in_phase? + @fork_writer << "0\n" + + if worker_at(0).phase > 0 + @fork_writer << "-2\n" + end + end + end + + # @version 5.0.0 + def spawn_worker(idx, master) + @config.run_hooks(:before_worker_fork, idx, @log_writer) + + pid = fork { worker(idx, master) } + if !pid + log "! Complete inability to spawn new workers detected" + log "! Seppuku is the only choice." + exit! 1 + end + + @config.run_hooks(:after_worker_fork, idx, @log_writer) + pid + end + + def cull_workers + diff = @workers.size - @options[:workers] + return if diff < 1 + debug "Culling #{diff} workers" + + workers = workers_to_cull(diff) + debug "Workers to cull: #{workers.inspect}" + + workers.each do |worker| + log "- Worker #{worker.index} (PID: #{worker.pid}) terminating" + worker.term + end + end + + def workers_to_cull(diff) + workers = @workers.sort_by(&:started_at) + + # In fork_worker mode, worker 0 acts as our master process. + # We should avoid culling it to preserve copy-on-write memory gains. + workers.reject! { |w| w.index == 0 } if @options[:fork_worker] + + workers[cull_start_index(diff), diff] + end + + def cull_start_index(diff) + case @options[:worker_culling_strategy] + when :oldest + 0 + else # :youngest + -diff + end + end + + # @!attribute [r] next_worker_index + def next_worker_index + occupied_positions = @workers.map(&:index) + idx = 0 + idx += 1 until !occupied_positions.include?(idx) + idx + end + + def worker_at(idx) + @workers.find { |w| w.index == idx } + end + + def all_workers_booted? + @workers.count { |w| !w.booted? } == 0 + end + + def all_workers_in_phase? + @workers.all? { |w| w.phase == @phase } + end + + def all_workers_idle_timed_out? + (@workers.map(&:pid) - idle_timed_out_worker_pids).empty? + end + + def check_workers(refork = false) + return if @next_check >= Time.now + + @next_check = Time.now + @options[:worker_check_interval] + + timeout_workers + wait_workers + cull_workers + spawn_workers + + if all_workers_booted? + # If we're running at proper capacity, check to see if + # we need to phase any workers out (which will restart + # in the right phase). + # + w = @workers.find { |x| x.phase != @phase } + + if w + if refork + log "- Stopping #{w.pid} for refork..." + else + log "- Stopping #{w.pid} for phased upgrade..." + end + + unless w.term? + w.term + log "- #{w.signal} sent to #{w.pid}..." + end + end + end + + t = @workers.reject(&:term?) + t.map!(&:ping_timeout) + + @next_check = [t.min, @next_check].compact.min + end + + def worker(index, master) + @workers = [] + + @master_read.close + @suicide_pipe.close + @fork_writer.close + + pipes = { check_pipe: @check_pipe, worker_write: @worker_write } + if @options[:fork_worker] + pipes[:fork_pipe] = @fork_pipe + pipes[:wakeup] = @wakeup + end + + server = start_server if preload? + new_worker = Worker.new index: index, + master: master, + launcher: @launcher, + pipes: pipes, + server: server + new_worker.run + end + + def restart + @restart = true + stop + end + + def phased_restart(refork = false) + return false if @options[:preload_app] && !refork + + @phased_restart = refork ? :refork : true + wakeup! + + true + end + + def stop + @status = :stop + wakeup! + end + + def stop_blocked + @status = :stop if @status == :run + wakeup! + @control&.stop true + Process.waitall + end + + def halt + @status = :halt + wakeup! + end + + def reload_worker_directory + dir = @launcher.restart_dir + log "+ Changing to #{dir}" + Dir.chdir dir + end + + # Inside of a child process, this will return all zeroes, as @workers is only populated in + # the master process. + # @!attribute [r] stats + def stats + old_worker_count = @workers.count { |w| w.phase != @phase } + worker_status = @workers.map do |w| + { + started_at: utc_iso8601(w.started_at), + pid: w.pid, + index: w.index, + phase: w.phase, + booted: w.booted?, + last_checkin: utc_iso8601(w.last_checkin), + last_status: w.last_status, + } + end + + { + started_at: utc_iso8601(@started_at), + workers: @workers.size, + phase: @phase, + booted_workers: worker_status.count { |w| w[:booted] }, + old_workers: old_worker_count, + worker_status: worker_status, + }.merge(super) + end + + def preload? + @options[:preload_app] + end + + # @version 5.0.0 + def fork_worker! + if (worker = worker_at 0) + worker.phase += 1 + end + phased_restart(true) + end + + # We do this in a separate method to keep the lambda scope + # of the signals handlers as small as possible. + def setup_signals + if @options[:fork_worker] + Signal.trap "SIGURG" do + fork_worker! + end + + # Auto-fork after the specified number of requests. + if (fork_requests = @options[:fork_worker].to_i) > 0 + @events.register(:ping!) do |w| + fork_worker! if w.index == 0 && + w.phase == 0 && + w.last_status[:requests_count] >= fork_requests + end + end + end + + Signal.trap "SIGCHLD" do + wakeup! + end + + Signal.trap "TTIN" do + @options[:workers] += 1 + wakeup! + end + + Signal.trap "TTOU" do + @options[:workers] -= 1 if @options[:workers] >= 2 + wakeup! + end + + master_pid = Process.pid + + Signal.trap "SIGTERM" do + # The worker installs their own SIGTERM when booted. + # Until then, this is run by the worker and the worker + # should just exit if they get it. + if Process.pid != master_pid + log "Early termination of worker" + exit! 0 + else + @launcher.close_binder_listeners + + stop_workers + stop + @events.fire_on_stopped! + raise(SignalException, "SIGTERM") if @options[:raise_exception_on_sigterm] + exit 0 # Clean exit, workers were stopped + end + end + end + + def run + @status = :run + + output_header "cluster" + + # This is aligned with the output from Runner, see Runner#output_header + log "* Workers: #{@options[:workers]}" + + if preload? + # Threads explicitly marked as fork safe will be ignored. Used in Rails, + # but may be used by anyone. Note that we need to explicit + # Process::Waiter check here because there's a bug in Ruby 2.6 and below + # where calling thread_variable_get on a Process::Waiter will segfault. + # We can drop that clause once those versions of Ruby are no longer + # supported. + fork_safe = ->(t) { !t.is_a?(Process::Waiter) && t.thread_variable_get(:fork_safe) } + + before = Thread.list.reject(&fork_safe) + + log "* Restarts: (\u2714) hot (\u2716) phased (#{@options[:fork_worker] ? "\u2714" : "\u2716"}) refork" + log "* Preloading application" + load_and_bind + + after = Thread.list.reject(&fork_safe) + + if after.size > before.size + threads = (after - before) + if threads.first.respond_to? :backtrace + log "! WARNING: Detected #{after.size-before.size} Thread(s) started in app boot:" + threads.each do |t| + log "! #{t.inspect} - #{t.backtrace ? t.backtrace.first : ''}" + end + else + log "! WARNING: Detected #{after.size-before.size} Thread(s) started in app boot" + end + end + else + log "* Restarts: (\u2714) hot (\u2714) phased (#{@options[:fork_worker] ? "\u2714" : "\u2716"}) refork" + + unless @config.app_configured? + error "No application configured, nothing to run" + exit 1 + end + + @launcher.binder.parse @options[:binds] + end + + read, @wakeup = Puma::Util.pipe + + setup_signals + + # Used by the workers to detect if the master process dies. + # If select says that @check_pipe is ready, it's because the + # master has exited and @suicide_pipe has been automatically + # closed. + # + @check_pipe, @suicide_pipe = Puma::Util.pipe + + # Separate pipe used by worker 0 to receive commands to + # fork new worker processes. + @fork_pipe, @fork_writer = Puma::Util.pipe + + log "Use Ctrl-C to stop" + + single_worker_warning + + redirect_io + + Plugins.fire_background + + @launcher.write_state + + start_control + + @master_read, @worker_write = read, @wakeup + + @options[:worker_write] = @worker_write + + @config.run_hooks(:before_fork, nil, @log_writer) + + spawn_workers + + Signal.trap "SIGINT" do + stop + end + + begin + booted = false + in_phased_restart = false + workers_not_booted = @options[:workers] + + while @status == :run + begin + if @options[:idle_timeout] && all_workers_idle_timed_out? + log "- All workers reached idle timeout" + break + end + + if @phased_restart + start_phased_restart(@phased_restart == :refork) + + in_phased_restart = @phased_restart + @phased_restart = false + + workers_not_booted = @options[:workers] + # worker 0 is not restarted on refork + workers_not_booted -= 1 if in_phased_restart == :refork + end + + check_workers(in_phased_restart == :refork) + + if read.wait_readable([0, @next_check - Time.now].max) + req = read.read_nonblock(1) + next unless req + + if req == PIPE_WAKEUP + @next_check = Time.now + next + end + + result = read.gets + pid = result.to_i + + if req == PIPE_BOOT || req == PIPE_FORK + pid, idx = result.split(':').map(&:to_i) + w = worker_at idx + w.pid = pid if w.pid.nil? + end + + if w = @workers.find { |x| x.pid == pid } + case req + when PIPE_BOOT + w.boot! + log "- Worker #{w.index} (PID: #{pid}) booted in #{w.uptime.round(2)}s, phase: #{w.phase}" + @next_check = Time.now + workers_not_booted -= 1 + when PIPE_EXTERNAL_TERM + # external term, see worker method, Signal.trap "SIGTERM" + w.term! + when PIPE_TERM + w.term unless w.term? + when PIPE_PING + status = result.sub(/^\d+/,'').chomp + w.ping!(status) + @events.fire(:ping!, w) + + if in_phased_restart && @options[:fork_worker] && workers_not_booted.positive? && w0 = worker_at(0) + w0.ping!(status) + @events.fire(:ping!, w0) + end + + if !booted && @workers.none? {|worker| worker.last_status.empty?} + @events.fire_on_booted! + debug_loaded_extensions("Loaded Extensions - master:") if @log_writer.debug? + booted = true + end + when PIPE_IDLE + if idle_workers[pid] + idle_workers.delete pid + else + idle_workers[pid] = true + end + end + else + log "! Out-of-sync worker list, no #{pid} worker" + end + end + + if in_phased_restart && workers_not_booted.zero? + @events.fire_on_booted! + debug_loaded_extensions("Loaded Extensions - master:") if @log_writer.debug? + in_phased_restart = false + end + rescue Interrupt + @status = :stop + end + end + + stop_workers unless @status == :halt + ensure + @check_pipe.close + @suicide_pipe.close + read.close + @wakeup.close + end + end + + private + + def single_worker_warning + return if @options[:workers] != 1 || @options[:silence_single_worker_warning] + + log "! WARNING: Detected running cluster mode with 1 worker." + log "! Running Puma in cluster mode with a single worker is often a misconfiguration." + log "! Consider running Puma in single-mode (workers = 0) in order to reduce memory overhead." + log "! Set the `silence_single_worker_warning` option to silence this warning message." + end + + # loops thru @workers, removing workers that exited, and calling + # `#term` if needed + def wait_workers + # Reap all children, known workers or otherwise. + # If puma has PID 1, as it's common in containerized environments, + # then it's responsible for reaping orphaned processes, so we must reap + # all our dead children, regardless of whether they are workers we spawned + # or some reattached processes. + reaped_children = {} + loop do + begin + pid, status = Process.wait2(-1, Process::WNOHANG) + break unless pid + reaped_children[pid] = status + rescue Errno::ECHILD + break + end + end + + @workers.reject! do |w| + next false if w.pid.nil? + begin + # We may need to check the PID individually because: + # 1. From Ruby versions 2.6 to 3.2, `Process.detach` can prevent or delay + # `Process.wait2(-1)` from detecting a terminated process: https://bugs.ruby-lang.org/issues/19837. + # 2. When `fork_worker` is enabled, some worker may not be direct children, + # but grand children. Because of this they won't be reaped by `Process.wait2(-1)`. + if reaped_children.delete(w.pid) || Process.wait(w.pid, Process::WNOHANG) + true + else + w.term if w.term? + nil + end + rescue Errno::ECHILD + begin + Process.kill(0, w.pid) + # child still alive but has another parent (e.g., using fork_worker) + w.term if w.term? + false + rescue Errno::ESRCH, Errno::EPERM + true # child is already terminated + end + end + end + + # Log unknown children + reaped_children.each do |pid, status| + log "! reaped unknown child process pid=#{pid} status=#{status}" + end + end + + # @version 5.0.0 + def timeout_workers + @workers.each do |w| + if !w.term? && w.ping_timeout <= Time.now + details = if w.booted? + "(Worker #{w.index} failed to check in within #{@options[:worker_timeout]} seconds)" + else + "(Worker #{w.index} failed to boot within #{@options[:worker_boot_timeout]} seconds)" + end + log "! Terminating timed out worker #{details}: #{w.pid}" + w.kill + end + end + end + + def idle_timed_out_worker_pids + idle_workers.keys + end + + def idle_workers + @idle_workers ||= {} + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster/worker.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster/worker.rb new file mode 100644 index 0000000..458f13c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster/worker.rb @@ -0,0 +1,183 @@ +# frozen_string_literal: true + +module Puma + class Cluster < Puma::Runner + #—————————————————————— DO NOT USE — this class is for internal use only ——— + + + # This class is instantiated by the `Puma::Cluster` and represents a single + # worker process. + # + # At the core of this class is running an instance of `Puma::Server` which + # gets created via the `start_server` method from the `Puma::Runner` class + # that this inherits from. + class Worker < Puma::Runner # :nodoc: + attr_reader :index, :master + + def initialize(index:, master:, launcher:, pipes:, server: nil) + super(launcher) + + @index = index + @master = master + @check_pipe = pipes[:check_pipe] + @worker_write = pipes[:worker_write] + @fork_pipe = pipes[:fork_pipe] + @wakeup = pipes[:wakeup] + @server = server + @hook_data = {} + end + + def run + title = "puma: cluster worker #{index}: #{master}" + title += " [#{@options[:tag]}]" if @options[:tag] && !@options[:tag].empty? + $0 = title + + Signal.trap "SIGINT", "IGNORE" + Signal.trap "SIGCHLD", "DEFAULT" + + Thread.new do + Puma.set_thread_name "wrkr check" + @check_pipe.wait_readable + log "! Detected parent died, dying" + exit! 1 + end + + # If we're not running under a Bundler context, then + # report the info about the context we will be using + if !ENV['BUNDLE_GEMFILE'] + if File.exist?("Gemfile") + log "+ Gemfile in context: #{File.expand_path("Gemfile")}" + elsif File.exist?("gems.rb") + log "+ Gemfile in context: #{File.expand_path("gems.rb")}" + end + end + + # Invoke any worker boot hooks so they can get + # things in shape before booting the app. + @config.run_hooks(:before_worker_boot, index, @log_writer, @hook_data) + + begin + server = @server ||= start_server + rescue Exception => e + log "! Unable to start worker" + log e + log e.backtrace.join("\n ") + exit 1 + end + + restart_server = Queue.new << true << false + + fork_worker = @options[:fork_worker] && index == 0 + + if fork_worker + restart_server.clear + worker_pids = [] + Signal.trap "SIGCHLD" do + wakeup! if worker_pids.reject! do |p| + Process.wait(p, Process::WNOHANG) rescue true + end + end + + Thread.new do + Puma.set_thread_name "wrkr fork" + while (idx = @fork_pipe.gets) + idx = idx.to_i + if idx == -1 # stop server + if restart_server.length > 0 + restart_server.clear + server.begin_restart(true) + @config.run_hooks(:before_refork, nil, @log_writer, @hook_data) + end + elsif idx == -2 # refork cycle is done + @config.run_hooks(:after_refork, nil, @log_writer, @hook_data) + elsif idx == 0 # restart server + restart_server << true << false + else # fork worker + worker_pids << pid = spawn_worker(idx) + @worker_write << "#{PIPE_FORK}#{pid}:#{idx}\n" rescue nil + end + end + end + end + + Signal.trap "SIGTERM" do + @worker_write << "#{PIPE_EXTERNAL_TERM}#{Process.pid}\n" rescue nil + restart_server.clear + server.stop + restart_server << false + end + + begin + @worker_write << "#{PIPE_BOOT}#{Process.pid}:#{index}\n" + rescue SystemCallError, IOError + Puma::Util.purge_interrupt_queue + STDERR.puts "Master seems to have exited, exiting." + return + end + + while restart_server.pop + server_thread = server.run + + if @log_writer.debug? && index == 0 + debug_loaded_extensions "Loaded Extensions - worker 0:" + end + + stat_thread ||= Thread.new(@worker_write) do |io| + Puma.set_thread_name "stat pld" + base_payload = "#{PIPE_PING}#{Process.pid}" + + while true + begin + b = server.backlog || 0 + r = server.running || 0 + t = server.pool_capacity || 0 + m = server.max_threads || 0 + rc = server.requests_count || 0 + bt = server.busy_threads || 0 + payload = %Q!#{base_payload}{ "backlog":#{b}, "running":#{r}, "pool_capacity":#{t}, "max_threads":#{m}, "requests_count":#{rc}, "busy_threads":#{bt} }\n! + io << payload + rescue IOError + Puma::Util.purge_interrupt_queue + break + end + sleep @options[:worker_check_interval] + end + end + server_thread.join + end + + # Invoke any worker shutdown hooks so they can prevent the worker + # exiting until any background operations are completed + @config.run_hooks(:before_worker_shutdown, index, @log_writer, @hook_data) + ensure + @worker_write << "#{PIPE_TERM}#{Process.pid}\n" rescue nil + @worker_write.close + end + + private + + def spawn_worker(idx) + @config.run_hooks(:before_worker_fork, idx, @log_writer, @hook_data) + + pid = fork do + new_worker = Worker.new index: idx, + master: master, + launcher: @launcher, + pipes: { check_pipe: @check_pipe, + worker_write: @worker_write }, + server: @server + new_worker.run + end + + if !pid + log "! Complete inability to spawn new workers detected" + log "! Seppuku is the only choice." + exit! 1 + end + + @config.run_hooks(:after_worker_fork, idx, @log_writer, @hook_data) + pid + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster/worker_handle.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster/worker_handle.rb new file mode 100644 index 0000000..64fff1a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster/worker_handle.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: true + +module Puma + class Cluster < Runner + #—————————————————————— DO NOT USE — this class is for internal use only ——— + + + # This class represents a worker process from the perspective of the puma + # master process. It contains information about the process and its health + # and it exposes methods to control the process via IPC. It does not + # include the actual logic executed by the worker process itself. For that, + # see Puma::Cluster::Worker. + class WorkerHandle # :nodoc: + def initialize(idx, pid, phase, options) + @index = idx + @pid = pid + @phase = phase + @stage = :started + @signal = "TERM" + @options = options + @first_term_sent = nil + @started_at = Time.now + @last_checkin = Time.now + @last_status = {} + @term = false + end + + attr_reader :index, :pid, :phase, :signal, :last_checkin, :last_status, :started_at + + # @version 5.0.0 + attr_writer :pid, :phase + + def booted? + @stage == :booted + end + + def uptime + Time.now - started_at + end + + def boot! + @last_checkin = Time.now + @stage = :booted + end + + def term! + @term = true + end + + def term? + @term + end + + STATUS_PATTERN = /{ "backlog":(?\d*), "running":(?\d*), "pool_capacity":(?\d*), "max_threads":(?\d*), "requests_count":(?\d*), "busy_threads":(?\d*) }/ + private_constant :STATUS_PATTERN + + def ping!(status) + @last_checkin = Time.now + @last_status = status.match(STATUS_PATTERN).named_captures.map { |c_name, c| [c_name.to_sym, c.to_i] }.to_h + end + + # @see Puma::Cluster#check_workers + # @version 5.0.0 + def ping_timeout + @last_checkin + + (booted? ? + @options[:worker_timeout] : + @options[:worker_boot_timeout] + ) + end + + def term + begin + if @first_term_sent && (Time.now - @first_term_sent) > @options[:worker_shutdown_timeout] + @signal = "KILL" + else + @term ||= true + @first_term_sent ||= Time.now + end + Process.kill @signal, @pid if @pid + rescue Errno::ESRCH + end + end + + def kill + @signal = 'KILL' + term + end + + def hup + Process.kill "HUP", @pid + rescue Errno::ESRCH + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/commonlogger.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/commonlogger.rb new file mode 100644 index 0000000..144e9a9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/commonlogger.rb @@ -0,0 +1,115 @@ +# frozen_string_literal: true + +module Puma + # Rack::CommonLogger forwards every request to the given +app+, and + # logs a line in the + # {Apache common log format}[https://httpd.apache.org/docs/2.4/logs.html#common] + # to the +logger+. + # + # If +logger+ is nil, CommonLogger will fall back +rack.errors+, which is + # an instance of Rack::NullLogger. + # + # +logger+ can be any class, including the standard library Logger, and is + # expected to have either +write+ or +<<+ method, which accepts the CommonLogger::FORMAT. + # According to the SPEC, the error stream must also respond to +puts+ + # (which takes a single argument that responds to +to_s+), and +flush+ + # (which is called without arguments in order to make the error appear for + # sure) + class CommonLogger + # Common Log Format: https://httpd.apache.org/docs/2.4/logs.html#common + # + # lilith.local - - [07/Aug/2006 23:58:02 -0400] "GET / HTTP/1.1" 500 - + # + # %{%s - %s [%s] "%s %s%s %s" %d %s\n} % + FORMAT = %{%s - %s [%s] "%s %s%s %s" %d %s %0.4f\n} + + HIJACK_FORMAT = %{%s - %s [%s] "%s %s%s %s" HIJACKED -1 %0.4f\n} + + LOG_TIME_FORMAT = '%d/%b/%Y:%H:%M:%S %z' + + CONTENT_LENGTH = 'Content-Length' # should be lower case from app, + # Util::HeaderHash allows mixed + HTTP_VERSION = Const::HTTP_VERSION + HTTP_X_FORWARDED_FOR = Const::HTTP_X_FORWARDED_FOR + PATH_INFO = Const::PATH_INFO + QUERY_STRING = Const::QUERY_STRING + REMOTE_ADDR = Const::REMOTE_ADDR + REMOTE_USER = 'REMOTE_USER' + REQUEST_METHOD = Const::REQUEST_METHOD + + def initialize(app, logger=nil) + @app = app + @logger = logger + end + + def call(env) + began_at = Time.now + status, header, body = @app.call(env) + header = Util::HeaderHash.new(header) + + # If we've been hijacked, then output a special line + if env['rack.hijack_io'] + log_hijacking(env, 'HIJACK', header, began_at) + else + ary = env['rack.after_reply'] + ary << lambda { log(env, status, header, began_at) } + end + + [status, header, body] + end + + private + + def log_hijacking(env, status, header, began_at) + now = Time.now + + msg = HIJACK_FORMAT % [ + env[HTTP_X_FORWARDED_FOR] || env[REMOTE_ADDR] || "-", + env[REMOTE_USER] || "-", + now.strftime(LOG_TIME_FORMAT), + env[REQUEST_METHOD], + env[PATH_INFO], + env[QUERY_STRING].empty? ? "" : "?#{env[QUERY_STRING]}", + env[HTTP_VERSION], + now - began_at ] + + write(msg) + end + + def log(env, status, header, began_at) + now = Time.now + length = extract_content_length(header) + + msg = FORMAT % [ + env[HTTP_X_FORWARDED_FOR] || env[REMOTE_ADDR] || "-", + env[REMOTE_USER] || "-", + now.strftime(LOG_TIME_FORMAT), + env[REQUEST_METHOD], + env[PATH_INFO], + env[QUERY_STRING].empty? ? "" : "?#{env[QUERY_STRING]}", + env[HTTP_VERSION], + status.to_s[0..3], + length, + now - began_at ] + + write(msg) + end + + def write(msg) + logger = @logger || env['rack.errors'] + + # Standard library logger doesn't support write but it supports << which actually + # calls to write on the log device without formatting + if logger.respond_to?(:write) + logger.write(msg) + else + logger << msg + end + end + + def extract_content_length(headers) + value = headers[CONTENT_LENGTH] or return '-' + value.to_s == '0' ? '-' : value + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/configuration.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/configuration.rb new file mode 100644 index 0000000..31321ec --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/configuration.rb @@ -0,0 +1,407 @@ +# frozen_string_literal: true + +require_relative 'plugin' +require_relative 'const' +require_relative 'dsl' + +module Puma + # A class used for storing "leveled" configuration options. + # + # In this class any "user" specified options take precedence over any + # "file" specified options, take precedence over any "default" options. + # + # User input is preferred over "defaults": + # user_options = { foo: "bar" } + # default_options = { foo: "zoo" } + # options = UserFileDefaultOptions.new(user_options, default_options) + # puts options[:foo] + # # => "bar" + # + # All values can be accessed via `all_of` + # + # puts options.all_of(:foo) + # # => ["bar", "zoo"] + # + # A "file" option can be set. This config will be preferred over "default" options + # but will defer to any available "user" specified options. + # + # user_options = { foo: "bar" } + # default_options = { rackup: "zoo.rb" } + # options = UserFileDefaultOptions.new(user_options, default_options) + # options.file_options[:rackup] = "sup.rb" + # puts options[:rackup] + # # => "sup.rb" + # + # The "default" options can be set via procs. These are resolved during runtime + # via calls to `finalize_values` + class UserFileDefaultOptions + def initialize(user_options, default_options) + @user_options = user_options + @file_options = {} + @default_options = default_options + end + + attr_reader :user_options, :file_options, :default_options + + def [](key) + fetch(key) + end + + def []=(key, value) + user_options[key] = value + end + + def fetch(key, default_value = nil) + return user_options[key] if user_options.key?(key) + return file_options[key] if file_options.key?(key) + return default_options[key] if default_options.key?(key) + + default_value + end + + def all_of(key) + user = user_options[key] + file = file_options[key] + default = default_options[key] + + user = [user] unless user.is_a?(Array) + file = [file] unless file.is_a?(Array) + default = [default] unless default.is_a?(Array) + + user.compact! + file.compact! + default.compact! + + user + file + default + end + + def finalize_values + @default_options.each do |k,v| + if v.respond_to? :call + @default_options[k] = v.call + end + end + end + + def final_options + default_options + .merge(file_options) + .merge(user_options) + end + end + + # The main configuration class of Puma. + # + # It can be initialized with a set of "user" options and "default" options. + # Defaults will be merged with `Configuration.puma_default_options`. + # + # This class works together with 2 main other classes the `UserFileDefaultOptions` + # which stores configuration options in order so the precedence is that user + # set configuration wins over "file" based configuration wins over "default" + # configuration. These configurations are set via the `DSL` class. This + # class powers the Puma config file syntax and does double duty as a configuration + # DSL used by the `Puma::CLI` and Puma rack handler. + # + # It also handles loading plugins. + # + # [Note:] + # `:port` and `:host` are not valid keys. By the time they make it to the + # configuration options they are expected to be incorporated into a `:binds` key. + # Under the hood the DSL maps `port` and `host` calls to `:binds` + # + # config = Configuration.new({}) do |user_config, file_config, default_config| + # user_config.port 3003 + # end + # config.load + # puts config.options[:port] + # # => 3003 + # + # It is expected that `load` is called on the configuration instance after setting + # config. This method expands any values in `config_file` and puts them into the + # correct configuration option hash. + # + # Once all configuration is complete it is expected that `clamp` will be called + # on the instance. This will expand any procs stored under "default" values. This + # is done because an environment variable may have been modified while loading + # configuration files. + class Configuration + DEFAULTS = { + auto_trim_time: 30, + binds: ['tcp://0.0.0.0:9292'.freeze], + clean_thread_locals: false, + debug: false, + enable_keep_alives: true, + early_hints: nil, + environment: 'development'.freeze, + # Number of seconds to wait until we get the first data for the request. + first_data_timeout: 30, + # Number of seconds to wait until the next request before shutting down. + idle_timeout: nil, + io_selector_backend: :auto, + log_requests: false, + logger: STDOUT, + # How many requests to attempt inline before sending a client back to + # the reactor to be subject to normal ordering. The idea here is that + # we amortize the cost of going back to the reactor for a well behaved + # but very "greedy" client across 10 requests. This prevents a not + # well behaved client from monopolizing the thread forever. + max_fast_inline: 10, + max_threads: Puma.mri? ? 5 : 16, + min_threads: 0, + mode: :http, + mutate_stdout_and_stderr_to_sync_on_write: true, + out_of_band: [], + # Number of seconds for another request within a persistent session. + persistent_timeout: 20, + queue_requests: true, + rackup: 'config.ru'.freeze, + raise_exception_on_sigterm: true, + reaping_time: 1, + remote_address: :socket, + silence_single_worker_warning: false, + silence_fork_callback_warning: false, + tag: File.basename(Dir.getwd), + tcp_host: '0.0.0.0'.freeze, + tcp_port: 9292, + wait_for_less_busy_worker: 0.005, + worker_boot_timeout: 60, + worker_check_interval: 5, + worker_culling_strategy: :youngest, + worker_shutdown_timeout: 30, + worker_timeout: 60, + workers: 0, + http_content_length_limit: nil + } + + def initialize(user_options={}, default_options = {}, env = ENV, &block) + default_options = self.puma_default_options(env).merge(default_options) + + @options = UserFileDefaultOptions.new(user_options, default_options) + @plugins = PluginLoader.new + @user_dsl = DSL.new(@options.user_options, self) + @file_dsl = DSL.new(@options.file_options, self) + @default_dsl = DSL.new(@options.default_options, self) + + if !@options[:prune_bundler] + default_options[:preload_app] = (@options[:workers] > 1) && Puma.forkable? + end + + @puma_bundler_pruned = env.key? 'PUMA_BUNDLER_PRUNED' + + if block + configure(&block) + end + end + + attr_reader :options, :plugins + + def configure + yield @user_dsl, @file_dsl, @default_dsl + ensure + @user_dsl._offer_plugins + @file_dsl._offer_plugins + @default_dsl._offer_plugins + end + + def initialize_copy(other) + @conf = nil + @cli_options = nil + @options = @options.dup + end + + def flatten + dup.flatten! + end + + def flatten! + @options = @options.flatten + self + end + + def puma_default_options(env = ENV) + defaults = DEFAULTS.dup + puma_options_from_env(env).each { |k,v| defaults[k] = v if v } + defaults + end + + def puma_options_from_env(env = ENV) + min = env['PUMA_MIN_THREADS'] || env['MIN_THREADS'] + max = env['PUMA_MAX_THREADS'] || env['MAX_THREADS'] + workers = if env['WEB_CONCURRENCY'] == 'auto' + require_processor_counter + ::Concurrent.available_processor_count + else + env['WEB_CONCURRENCY'] + end + + { + min_threads: min && min != "" && Integer(min), + max_threads: max && max != "" && Integer(max), + workers: workers && workers != "" && Integer(workers), + environment: env['APP_ENV'] || env['RACK_ENV'] || env['RAILS_ENV'], + } + end + + def load + config_files.each { |config_file| @file_dsl._load_from(config_file) } + + @options + end + + def config_files + files = @options.all_of(:config_files) + + return [] if files == ['-'] + return files if files.any? + + first_default_file = %W(config/puma/#{@options[:environment]}.rb config/puma.rb).find do |f| + File.exist?(f) + end + + [first_default_file] + end + + # Call once all configuration (included from rackup files) + # is loaded to flesh out any defaults + def clamp + @options.finalize_values + end + + # Injects the Configuration object into the env + class ConfigMiddleware + def initialize(config, app) + @config = config + @app = app + end + + def call(env) + env[Const::PUMA_CONFIG] = @config + @app.call(env) + end + end + + # Indicate if there is a properly configured app + # + def app_configured? + @options[:app] || File.exist?(rackup) + end + + def rackup + @options[:rackup] + end + + # Load the specified rackup file, pull options from + # the rackup file, and set @app. + # + def app + found = options[:app] || load_rackup + + if @options[:log_requests] + require_relative 'commonlogger' + logger = @options[:logger] + found = CommonLogger.new(found, logger) + end + + ConfigMiddleware.new(self, found) + end + + # Return which environment we're running in + def environment + @options[:environment] + end + + def load_plugin(name) + @plugins.create name + end + + # @param key [:Symbol] hook to run + # @param arg [Launcher, Int] `:on_restart` passes Launcher + # + def run_hooks(key, arg, log_writer, hook_data = nil) + log_writer.debug "Running #{key} hooks" + + @options.all_of(key).each do |b| + begin + if Array === b + hook_data[b[1]] ||= Hash.new + b[0].call arg, hook_data[b[1]] + else + b.call arg + end + rescue => e + log_writer.log "WARNING hook #{key} failed with exception (#{e.class}) #{e.message}" + log_writer.debug e.backtrace.join("\n") + end + end + end + + def final_options + @options.final_options + end + + def self.temp_path + require 'tmpdir' + + t = (Time.now.to_f * 1000).to_i + "#{Dir.tmpdir}/puma-status-#{t}-#{$$}" + end + + private + + def require_processor_counter + require 'concurrent/utility/processor_counter' + rescue LoadError + warn <<~MESSAGE + WEB_CONCURRENCY=auto requires the "concurrent-ruby" gem to be installed. + Please add "concurrent-ruby" to your Gemfile. + MESSAGE + raise + end + + # Load and use the normal Rack builder if we can, otherwise + # fallback to our minimal version. + def rack_builder + # Load bundler now if we can so that we can pickup rack from + # a Gemfile + if @puma_bundler_pruned + begin + require 'bundler/setup' + rescue LoadError + end + end + + begin + require 'rack' + require 'rack/builder' + ::Rack::Builder + rescue LoadError + require_relative 'rack/builder' + Puma::Rack::Builder + end + end + + def load_rackup + raise "Missing rackup file '#{rackup}'" unless File.exist?(rackup) + + rack_app, rack_options = rack_builder.parse_file(rackup) + rack_options = rack_options || {} + + @options.file_options.merge!(rack_options) + + config_ru_binds = [] + rack_options.each do |k, v| + config_ru_binds << v if k.to_s.start_with?("bind") + end + + @options.file_options[:binds] = config_ru_binds unless config_ru_binds.empty? + + rack_app + end + + def self.random_token + require 'securerandom' unless defined?(SecureRandom) + + SecureRandom.hex(16) + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/const.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/const.rb new file mode 100644 index 0000000..6aabc3c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/const.rb @@ -0,0 +1,308 @@ +#encoding: utf-8 +# frozen_string_literal: true + +module Puma + class UnsupportedOption < RuntimeError + end + + # Every standard HTTP code mapped to the appropriate message. These are + # used so frequently that they are placed directly in Puma for easy + # access rather than Puma::Const itself. + + # Every standard HTTP code mapped to the appropriate message. + # Generated with: + # curl -s https://www.iana.org/assignments/http-status-codes/http-status-codes-1.csv | \ + # ruby -ne 'm = /^(\d{3}),(?!Unassigned|\(Unused\))([^,]+)/.match($_) and \ + # puts "#{m[1]} => \x27#{m[2].strip}\x27,"' + HTTP_STATUS_CODES = { + 100 => 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', + 103 => 'Early Hints', + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-Status', + 208 => 'Already Reported', + 226 => 'IM Used', + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 307 => 'Temporary Redirect', + 308 => 'Permanent Redirect', + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Timeout', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Content Too Large', + 414 => 'URI Too Long', + 415 => 'Unsupported Media Type', + 416 => 'Range Not Satisfiable', + 417 => 'Expectation Failed', + 421 => 'Misdirected Request', + 422 => 'Unprocessable Content', + 423 => 'Locked', + 424 => 'Failed Dependency', + 425 => 'Too Early', + 426 => 'Upgrade Required', + 428 => 'Precondition Required', + 429 => 'Too Many Requests', + 431 => 'Request Header Fields Too Large', + 451 => 'Unavailable For Legal Reasons', + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported', + 506 => 'Variant Also Negotiates', + 507 => 'Insufficient Storage', + 508 => 'Loop Detected', + 510 => 'Not Extended (OBSOLETED)', + 511 => 'Network Authentication Required' + }.freeze + + # For some HTTP status codes the client only expects headers. + # + + STATUS_WITH_NO_ENTITY_BODY = { + 204 => true, + 205 => true, + 304 => true + }.freeze + + # Frequently used constants when constructing requests or responses. Many times + # the constant just refers to a string with the same contents. Using these constants + # gave about a 3% to 10% performance improvement over using the strings directly. + # + # The constants are frozen because Hash#[]= when called with a String key dups + # the String UNLESS the String is frozen. This saves us therefore 2 object + # allocations when creating the env hash later. + # + # While Puma does try to emulate the CGI/1.2 protocol, it does not use the REMOTE_IDENT, + # REMOTE_USER, or REMOTE_HOST parameters since those are either a security problem or + # too taxing on performance. + module Const + + PUMA_VERSION = VERSION = "6.6.1" + CODE_NAME = "Return to Forever" + + PUMA_SERVER_STRING = ["puma", PUMA_VERSION, CODE_NAME].join(" ").freeze + + FAST_TRACK_KA_TIMEOUT = 0.2 + + # How long to wait when getting some write blocking on the socket when + # sending data back + WRITE_TIMEOUT = 10 + + # The original URI requested by the client. + REQUEST_URI= "REQUEST_URI" + REQUEST_PATH = "REQUEST_PATH" + QUERY_STRING = "QUERY_STRING" + CONTENT_LENGTH = "CONTENT_LENGTH" + + PATH_INFO = "PATH_INFO" + + PUMA_TMP_BASE = "puma" + + ERROR_RESPONSE = { + # Indicate that we couldn't parse the request + 400 => "HTTP/1.1 400 Bad Request\r\n\r\n", + # The standard empty 404 response for bad requests. Use Error4040Handler for custom stuff. + 404 => "HTTP/1.1 404 Not Found\r\nConnection: close\r\n\r\n", + # The standard empty 408 response for requests that timed out. + 408 => "HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n", + # Indicate that there was an internal error, obviously. + 500 => "HTTP/1.1 500 Internal Server Error\r\n\r\n", + # Incorrect or invalid header value + 501 => "HTTP/1.1 501 Not Implemented\r\n\r\n", + # A common header for indicating the server is too busy. Not used yet. + 503 => "HTTP/1.1 503 Service Unavailable\r\n\r\n" + }.freeze + + # The basic max request size we'll try to read. + CHUNK_SIZE = 64 * 1024 + + # This is the maximum header that is allowed before a client is booted. The parser detects + # this, but we'd also like to do this as well. + MAX_HEADER = 1024 * (80 + 32) + + # Maximum request body size before it is moved out of memory and into a tempfile for reading. + MAX_BODY = MAX_HEADER + + REQUEST_METHOD = "REQUEST_METHOD" + HEAD = "HEAD" + + # based on https://www.rfc-editor.org/rfc/rfc9110.html#name-overview, + # with CONNECT removed, and PATCH added + SUPPORTED_HTTP_METHODS = %w[HEAD GET POST PUT DELETE OPTIONS TRACE PATCH].freeze + + # list from https://www.iana.org/assignments/http-methods/http-methods.xhtml + # as of 04-May-23 + IANA_HTTP_METHODS = %w[ + ACL + BASELINE-CONTROL + BIND + CHECKIN + CHECKOUT + CONNECT + COPY + DELETE + GET + HEAD + LABEL + LINK + LOCK + MERGE + MKACTIVITY + MKCALENDAR + MKCOL + MKREDIRECTREF + MKWORKSPACE + MOVE + OPTIONS + ORDERPATCH + PATCH + POST + PRI + PROPFIND + PROPPATCH + PUT + REBIND + REPORT + SEARCH + TRACE + UNBIND + UNCHECKOUT + UNLINK + UNLOCK + UPDATE + UPDATEREDIRECTREF + VERSION-CONTROL + ].freeze + + # ETag is based on the apache standard of hex mtime-size-inode (inode is 0 on win32) + LINE_END = "\r\n" + REMOTE_ADDR = "REMOTE_ADDR" + HTTP_X_FORWARDED_FOR = "HTTP_X_FORWARDED_FOR" + HTTP_X_FORWARDED_SSL = "HTTP_X_FORWARDED_SSL" + HTTP_X_FORWARDED_SCHEME = "HTTP_X_FORWARDED_SCHEME" + HTTP_X_FORWARDED_PROTO = "HTTP_X_FORWARDED_PROTO" + + SERVER_NAME = "SERVER_NAME" + SERVER_PORT = "SERVER_PORT" + HTTP_HOST = "HTTP_HOST" + PORT_80 = "80" + PORT_443 = "443" + LOCALHOST = "localhost" + LOCALHOST_IPV4 = "127.0.0.1" + LOCALHOST_IPV6 = "::1" + UNSPECIFIED_IPV4 = "0.0.0.0" + UNSPECIFIED_IPV6 = "::" + + SERVER_PROTOCOL = "SERVER_PROTOCOL" + HTTP_11 = "HTTP/1.1" + + SERVER_SOFTWARE = "SERVER_SOFTWARE" + GATEWAY_INTERFACE = "GATEWAY_INTERFACE" + CGI_VER = "CGI/1.2" + + STOP_COMMAND = "?" + HALT_COMMAND = "!" + RESTART_COMMAND = "R" + + RACK_INPUT = "rack.input" + RACK_URL_SCHEME = "rack.url_scheme" + RACK_AFTER_REPLY = "rack.after_reply" + PUMA_SOCKET = "puma.socket" + PUMA_CONFIG = "puma.config" + PUMA_PEERCERT = "puma.peercert" + + HTTP = "http" + HTTPS = "https" + + HTTPS_KEY = "HTTPS" + + HTTP_VERSION = "HTTP_VERSION" + HTTP_CONNECTION = "HTTP_CONNECTION" + HTTP_EXPECT = "HTTP_EXPECT" + CONTINUE = "100-continue" + + HTTP_11_100 = "HTTP/1.1 100 Continue\r\n\r\n" + HTTP_11_200 = "HTTP/1.1 200 OK\r\n" + HTTP_10_200 = "HTTP/1.0 200 OK\r\n" + + CLOSE = "close" + KEEP_ALIVE = "keep-alive" + + CONTENT_LENGTH2 = "content-length" + CONTENT_LENGTH_S = "Content-Length: " + TRANSFER_ENCODING = "transfer-encoding" + TRANSFER_ENCODING2 = "HTTP_TRANSFER_ENCODING" + + CONNECTION_CLOSE = "Connection: close\r\n" + CONNECTION_KEEP_ALIVE = "Connection: Keep-Alive\r\n" + + TRANSFER_ENCODING_CHUNKED = "Transfer-Encoding: chunked\r\n" + CLOSE_CHUNKED = "0\r\n\r\n" + + CHUNKED = "chunked" + + COLON = ": " + + NEWLINE = "\n" + + HIJACK_P = "rack.hijack?" + HIJACK = "rack.hijack" + HIJACK_IO = "rack.hijack_io" + + EARLY_HINTS = "rack.early_hints" + + # Illegal character in the key or value of response header + DQUOTE = "\"" + HTTP_HEADER_DELIMITER = Regexp.escape("(),/:;<=>?@[]{}\\").freeze + ILLEGAL_HEADER_KEY_REGEX = /[\x00-\x20#{DQUOTE}#{HTTP_HEADER_DELIMITER}]/.freeze + # header values can contain HTAB? + ILLEGAL_HEADER_VALUE_REGEX = /[\x00-\x08\x0A-\x1F]/.freeze + + # The keys of headers that should not be convert to underscore + # normalized versions. These headers are ignored at the request reading layer, + # but if we normalize them after reading, it's just confusing for the application. + UNMASKABLE_HEADERS = { + "HTTP_TRANSFER,ENCODING" => true, + "HTTP_CONTENT,LENGTH" => true, + } + + # Banned keys of response header + BANNED_HEADER_KEY = /\A(rack\.|status\z)/.freeze + + PROXY_PROTOCOL_V1_REGEX = /^PROXY (?:TCP4|TCP6|UNKNOWN) ([^\r]+)\r\n/.freeze + + # All constants are prefixed with `PIPE_` to avoid name collisions. + module PipeRequest + PIPE_WAKEUP = "!" + PIPE_BOOT = "b" + PIPE_FORK = "f" + PIPE_EXTERNAL_TERM = "e" + PIPE_TERM = "t" + PIPE_PING = "p" + PIPE_IDLE = "i" + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/control_cli.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/control_cli.rb new file mode 100644 index 0000000..5aaef94 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/control_cli.rb @@ -0,0 +1,316 @@ +# frozen_string_literal: true + +require 'optparse' +require_relative 'const' +require_relative 'detect' +require 'uri' +require 'socket' + +module Puma + class ControlCLI + + # values must be string or nil + # value of `nil` means command cannot be processed via signal + # @version 5.0.3 + CMD_PATH_SIG_MAP = { + 'gc' => nil, + 'gc-stats' => nil, + 'halt' => 'SIGQUIT', + 'info' => 'SIGINFO', + 'phased-restart' => 'SIGUSR1', + 'refork' => 'SIGURG', + 'reload-worker-directory' => nil, + 'reopen-log' => 'SIGHUP', + 'restart' => 'SIGUSR2', + 'start' => nil, + 'stats' => nil, + 'status' => '', + 'stop' => 'SIGTERM', + 'thread-backtraces' => nil, + 'worker-count-down' => 'SIGTTOU', + 'worker-count-up' => 'SIGTTIN' + }.freeze + + # commands that cannot be used in a request + NO_REQ_COMMANDS = %w[info reopen-log worker-count-down worker-count-up].freeze + + # @version 5.0.0 + PRINTABLE_COMMANDS = %w[gc-stats stats thread-backtraces].freeze + + def initialize(argv, stdout=STDOUT, stderr=STDERR, env: ENV) + @state = nil + @quiet = false + @pidfile = nil + @pid = nil + @control_url = nil + @control_auth_token = nil + @config_file = nil + @command = nil + @environment = env['APP_ENV'] || env['RACK_ENV'] || env['RAILS_ENV'] + + @argv = argv.dup + @stdout = stdout + @stderr = stderr + @cli_options = {} + + opts = OptionParser.new do |o| + o.banner = "Usage: pumactl (-p PID | -P pidfile | -S status_file | -C url -T token | -F config.rb) (#{CMD_PATH_SIG_MAP.keys.join("|")})" + + o.on "-S", "--state PATH", "Where the state file to use is" do |arg| + @state = arg + end + + o.on "-Q", "--quiet", "Do not display messages" do |arg| + @quiet = true + end + + o.on "-P", "--pidfile PATH", "Pid file" do |arg| + @pidfile = arg + end + + o.on "-p", "--pid PID", "Pid" do |arg| + @pid = arg.to_i + end + + o.on "-C", "--control-url URL", "The bind url to use for the control server" do |arg| + @control_url = arg + end + + o.on "-T", "--control-token TOKEN", "The token to use as authentication for the control server" do |arg| + @control_auth_token = arg + end + + o.on "-F", "--config-file PATH", "Puma config script" do |arg| + @config_file = arg + end + + o.on "-e", "--environment ENVIRONMENT", + "The environment to run the Rack app on (default development)" do |arg| + @environment = arg + end + + o.on_tail("-H", "--help", "Show this message") do + @stdout.puts o + exit + end + + o.on_tail("-V", "--version", "Show version") do + @stdout.puts Const::PUMA_VERSION + exit + end + end + + opts.order!(argv) { |a| opts.terminate a } + opts.parse! + + @command = argv.shift + + # check presence of command + unless @command + raise "Available commands: #{CMD_PATH_SIG_MAP.keys.join(", ")}" + end + + unless CMD_PATH_SIG_MAP.key? @command + raise "Invalid command: #{@command}" + end + + unless @config_file == '-' + environment = @environment || 'development' + + if @config_file.nil? + @config_file = %W(config/puma/#{environment}.rb config/puma.rb).find do |f| + File.exist?(f) + end + end + + if @config_file + require_relative 'configuration' + require_relative 'log_writer' + + config = Puma::Configuration.new({ config_files: [@config_file] }, {} , env) + config.load + @state ||= config.options[:state] + @control_url ||= config.options[:control_url] + @control_auth_token ||= config.options[:control_auth_token] + @pidfile ||= config.options[:pidfile] + end + end + rescue => e + @stdout.puts e.message + exit 1 + end + + def message(msg) + @stdout.puts msg unless @quiet + end + + def prepare_configuration + if @state + unless File.exist? @state + raise "State file not found: #{@state}" + end + + require_relative 'state_file' + + sf = Puma::StateFile.new + sf.load @state + + @control_url = sf.control_url + @control_auth_token = sf.control_auth_token + @pid = sf.pid + elsif @pidfile + # get pid from pid_file + @pid = File.read(@pidfile, mode: 'rb:UTF-8').to_i + end + end + + def send_request + uri = URI.parse @control_url + + host = uri.host + + # create server object by scheme + server = + case uri.scheme + when 'ssl' + require 'openssl' + host = host[1..-2] if host&.start_with? '[' + OpenSSL::SSL::SSLSocket.new( + TCPSocket.new(host, uri.port), + OpenSSL::SSL::SSLContext.new) + .tap { |ssl| ssl.sync_close = true } # default is false + .tap(&:connect) + when 'tcp' + host = host[1..-2] if host&.start_with? '[' + TCPSocket.new host, uri.port + when 'unix' + # check for abstract UNIXSocket + UNIXSocket.new(@control_url.start_with?('unix://@') ? + "\0#{host}#{uri.path}" : "#{host}#{uri.path}") + else + raise "Invalid scheme: #{uri.scheme}" + end + + if @command == 'status' + message 'Puma is started' + else + url = "/#{@command}" + + if @control_auth_token + url = url + "?token=#{@control_auth_token}" + end + + server.syswrite "GET #{url} HTTP/1.0\r\n\r\n" + + unless data = server.read + raise 'Server closed connection before responding' + end + + response = data.split("\r\n") + + if response.empty? + raise "Server sent empty response" + end + + @http, @code, @message = response.first.split(' ',3) + + if @code == '403' + raise 'Unauthorized access to server (wrong auth token)' + elsif @code == '404' + raise "Command error: #{response.last}" + elsif @code != '200' + raise "Bad response from server: #{@code}" + end + + message "Command #{@command} sent success" + message response.last if PRINTABLE_COMMANDS.include?(@command) + end + ensure + if server + if uri.scheme == 'ssl' + server.sysclose + else + server.close unless server.closed? + end + end + end + + def send_signal + unless @pid + raise 'Neither pid nor control url available' + end + + begin + sig = CMD_PATH_SIG_MAP[@command] + + if sig.nil? + @stdout.puts "'#{@command}' not available via pid only" + @stdout.flush unless @stdout.sync + return + elsif sig.start_with? 'SIG' + if Signal.list.key? sig.sub(/\ASIG/, '') + Process.kill sig, @pid + else + raise "Signal '#{sig}' not available'" + end + elsif @command == 'status' + begin + Process.kill 0, @pid + @stdout.puts 'Puma is started' + @stdout.flush unless @stdout.sync + rescue Errno::ESRCH + raise 'Puma is not running' + end + return + end + rescue SystemCallError + if @command == 'restart' + start + else + raise "No pid '#{@pid}' found" + end + end + + message "Command #{@command} sent success" + end + + def run + return start if @command == 'start' + prepare_configuration + + if Puma.windows? || @control_url && !NO_REQ_COMMANDS.include?(@command) + send_request + else + send_signal + end + + rescue => e + message e.message + exit 1 + end + + private + def start + require_relative 'cli' + + run_args = [] + + run_args += ["-S", @state] if @state + run_args += ["-q"] if @quiet + run_args += ["--pidfile", @pidfile] if @pidfile + run_args += ["--control-url", @control_url] if @control_url + run_args += ["--control-token", @control_auth_token] if @control_auth_token + run_args += ["-C", @config_file] if @config_file + run_args += ["-e", @environment] if @environment + + log_writer = Puma::LogWriter.new(@stdout, @stderr) + + # replace $0 because puma use it to generate restart command + puma_cmd = $0.gsub(/pumactl$/, 'puma') + $0 = puma_cmd if File.exist?(puma_cmd) + + cli = Puma::CLI.new run_args, log_writer + cli.run + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/detect.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/detect.rb new file mode 100644 index 0000000..a233eb4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/detect.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +# This file can be loaded independently of puma.rb, so it cannot have any code +# that assumes puma.rb is loaded. + + +module Puma + # @version 5.2.1 + HAS_FORK = ::Process.respond_to? :fork + + HAS_NATIVE_IO_WAIT = ::IO.public_instance_methods(false).include? :wait_readable + + IS_JRUBY = Object.const_defined? :JRUBY_VERSION + + IS_OSX = RUBY_DESCRIPTION.include? 'darwin' + + IS_WINDOWS = RUBY_DESCRIPTION.match?(/mswin|ming|cygwin/) + + IS_LINUX = !(IS_OSX || IS_WINDOWS) + + # @version 5.2.0 + IS_MRI = RUBY_ENGINE == 'ruby' + + def self.jruby? + IS_JRUBY + end + + def self.osx? + IS_OSX + end + + def self.windows? + IS_WINDOWS + end + + # @version 5.0.0 + def self.mri? + IS_MRI + end + + # @version 5.0.0 + def self.forkable? + HAS_FORK + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/dsl.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/dsl.rb new file mode 100644 index 0000000..c90b411 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/dsl.rb @@ -0,0 +1,1438 @@ +# frozen_string_literal: true + +require_relative 'const' +require_relative 'util' + +module Puma + # The methods that are available for use inside the configuration file. + # These same methods are used in Puma cli and the rack handler + # internally. + # + # Used manually (via CLI class): + # + # config = Configuration.new({}) do |user_config| + # user_config.port 3001 + # end + # config.load + # + # puts config.options[:binds] # => "tcp://127.0.0.1:3001" + # + # Used to load file: + # + # $ cat puma_config.rb + # port 3002 + # + # Resulting configuration: + # + # config = Configuration.new(config_file: "puma_config.rb") + # config.load + # + # puts config.options[:binds] # => "tcp://127.0.0.1:3002" + # + # You can also find many examples being used by the test suite in + # +test/config+. + # + # Puma v6 adds the option to specify a key name (String or Symbol) to the + # hooks that run inside the forked workers. All the hooks run inside the + # {Puma::Cluster::Worker#run} method. + # + # Previously, the worker index and the LogWriter instance were passed to the + # hook blocks/procs. If a key name is specified, a hash is passed as the last + # parameter. This allows storage of data, typically objects that are created + # before the worker that need to be passed to the hook when the worker is shutdown. + # + # The following hooks have been updated: + # + # | DSL Method | Options Key | Fork Block Location | + # | on_worker_boot | :before_worker_boot | inside, before | + # | on_worker_shutdown | :before_worker_shutdown | inside, after | + # | on_refork | :before_refork | inside | + # | after_refork | :after_refork | inside | + # + class DSL + ON_WORKER_KEY = [String, Symbol].freeze + + # Convenience method so logic can be used in CI. + # + # @see ssl_bind + # + def self.ssl_bind_str(host, port, opts) + verify = opts.fetch(:verify_mode, 'none').to_s + + tls_str = + if opts[:no_tlsv1_1] then '&no_tlsv1_1=true' + elsif opts[:no_tlsv1] then '&no_tlsv1=true' + else '' + end + + ca_additions = "&ca=#{Puma::Util.escape(opts[:ca])}" if ['peer', 'force_peer'].include?(verify) + + low_latency_str = opts.key?(:low_latency) ? "&low_latency=#{opts[:low_latency]}" : '' + backlog_str = opts[:backlog] ? "&backlog=#{Integer(opts[:backlog])}" : '' + + if defined?(JRUBY_VERSION) + cipher_suites = opts[:ssl_cipher_list] ? "&ssl_cipher_list=#{opts[:ssl_cipher_list]}" : nil # old name + cipher_suites = "#{cipher_suites}&cipher_suites=#{opts[:cipher_suites]}" if opts[:cipher_suites] + protocols = opts[:protocols] ? "&protocols=#{opts[:protocols]}" : nil + + keystore_additions = "keystore=#{opts[:keystore]}&keystore-pass=#{opts[:keystore_pass]}" + keystore_additions = "#{keystore_additions}&keystore-type=#{opts[:keystore_type]}" if opts[:keystore_type] + if opts[:truststore] + truststore_additions = "&truststore=#{opts[:truststore]}" + truststore_additions = "#{truststore_additions}&truststore-pass=#{opts[:truststore_pass]}" if opts[:truststore_pass] + truststore_additions = "#{truststore_additions}&truststore-type=#{opts[:truststore_type]}" if opts[:truststore_type] + end + + "ssl://#{host}:#{port}?#{keystore_additions}#{truststore_additions}#{cipher_suites}#{protocols}" \ + "&verify_mode=#{verify}#{tls_str}#{ca_additions}#{backlog_str}" + else + ssl_cipher_filter = opts[:ssl_cipher_filter] ? "&ssl_cipher_filter=#{opts[:ssl_cipher_filter]}" : nil + ssl_ciphersuites = opts[:ssl_ciphersuites] ? "&ssl_ciphersuites=#{opts[:ssl_ciphersuites]}" : nil + v_flags = (ary = opts[:verification_flags]) ? "&verification_flags=#{Array(ary).join ','}" : nil + + cert_flags = (cert = opts[:cert]) ? "cert=#{Puma::Util.escape(cert)}" : nil + key_flags = (key = opts[:key]) ? "&key=#{Puma::Util.escape(key)}" : nil + password_flags = (password_command = opts[:key_password_command]) ? "&key_password_command=#{Puma::Util.escape(password_command)}" : nil + + reuse_flag = + if (reuse = opts[:reuse]) + if reuse == true + '&reuse=dflt' + elsif reuse.is_a?(Hash) && (reuse.key?(:size) || reuse.key?(:timeout)) + val = +'' + if (size = reuse[:size]) && Integer === size + val << size.to_s + end + if (timeout = reuse[:timeout]) && Integer === timeout + val << ",#{timeout}" + end + if val.empty? + nil + else + "&reuse=#{val}" + end + else + nil + end + else + nil + end + + "ssl://#{host}:#{port}?#{cert_flags}#{key_flags}#{password_flags}#{ssl_cipher_filter}#{ssl_ciphersuites}" \ + "#{reuse_flag}&verify_mode=#{verify}#{tls_str}#{ca_additions}#{v_flags}#{backlog_str}#{low_latency_str}" + end + end + + def initialize(options, config) + @config = config + @options = options + + @plugins = [] + end + + def _load_from(path) + if path + @path = path + instance_eval(File.read(path), path, 1) + end + ensure + _offer_plugins + end + + def _offer_plugins + @plugins.each do |o| + if o.respond_to? :config + @options.shift + o.config self + end + end + + @plugins.clear + end + + def set_default_host(host) + @options[:default_host] = host + end + + def default_host + @options[:default_host] || Configuration::DEFAULTS[:tcp_host] + end + + def inject(&blk) + instance_eval(&blk) + end + + def get(key,default=nil) + @options[key.to_sym] || default + end + + # Load the named plugin for use by this configuration. + # + # @example + # plugin :tmp_restart + # + def plugin(name) + @plugins << @config.load_plugin(name) + end + + # Use an object or block as the rack application. This allows the + # configuration file to be the application itself. + # + # @example + # app do |env| + # body = 'Hello, World!' + # + # [ + # 200, + # { + # 'Content-Type' => 'text/plain', + # 'Content-Length' => body.length.to_s + # }, + # [body] + # ] + # end + # + # @see Puma::Configuration#app + # + def app(obj=nil, &block) + obj ||= block + + raise "Provide either a #call'able or a block" unless obj + + @options[:app] = obj + end + + # Start the Puma control rack application on +url+. This application can + # be communicated with to control the main server. Additionally, you can + # provide an authentication token, so all requests to the control server + # will need to include that token as a query parameter. This allows for + # simple authentication. + # + # Check out {Puma::App::Status} to see what the app has available. + # + # @example + # activate_control_app 'unix:///var/run/pumactl.sock' + # @example + # activate_control_app 'unix:///var/run/pumactl.sock', { auth_token: '12345' } + # @example + # activate_control_app 'unix:///var/run/pumactl.sock', { no_token: true } + # + def activate_control_app(url="auto", opts={}) + if url == "auto" + path = Configuration.temp_path + @options[:control_url] = "unix://#{path}" + @options[:control_url_temp] = path + else + @options[:control_url] = url + end + + if opts[:no_token] + # We need to use 'none' rather than :none because this value will be + # passed on to an instance of OptionParser, which doesn't support + # symbols as option values. + # + # See: https://github.com/puma/puma/issues/1193#issuecomment-305995488 + auth_token = 'none' + else + auth_token = opts[:auth_token] + auth_token ||= Configuration.random_token + end + + @options[:control_auth_token] = auth_token + @options[:control_url_umask] = opts[:umask] if opts[:umask] + end + + # Load additional configuration from a file. + # Files get loaded later via Configuration#load. + # + # @example + # load 'config/puma/production.rb' + # + def load(file) + @options[:config_files] ||= [] + @options[:config_files] << file + end + + # Bind the server to +url+. "tcp://", "unix://" and "ssl://" are the only + # accepted protocols. Multiple urls can be bound to, calling +bind+ does + # not overwrite previous bindings. + # + # The default is "tcp://0.0.0.0:9292". + # + # You can use query parameters within the url to specify options: + # + # * Set the socket backlog depth with +backlog+, default is 1024. + # * Set up an SSL certificate with +key+ & +cert+. + # * Set up an SSL certificate for mTLS with +key+, +cert+, +ca+ and +verify_mode+. + # * Set whether to optimize for low latency instead of throughput with + # +low_latency+, default is to not optimize for low latency. This is done + # via +Socket::TCP_NODELAY+. + # * Set socket permissions with +umask+. + # + # @example Backlog depth + # bind 'unix:///var/run/puma.sock?backlog=512' + # @example SSL cert + # bind 'ssl://127.0.0.1:9292?key=key.key&cert=cert.pem' + # @example SSL cert for mutual TLS (mTLS) + # bind 'ssl://127.0.0.1:9292?key=key.key&cert=cert.pem&ca=ca.pem&verify_mode=force_peer' + # @example Disable optimization for low latency + # bind 'tcp://0.0.0.0:9292?low_latency=false' + # @example Socket permissions + # bind 'unix:///var/run/puma.sock?umask=0111' + # + # @see Puma::Runner#load_and_bind + # @see Puma::Cluster#run + # + def bind(url) + @options[:binds] ||= [] + @options[:binds] << url + end + + def clear_binds! + @options[:binds] = [] + end + + # Bind to (systemd) activated sockets, regardless of configured binds. + # + # Systemd can present sockets as file descriptors that are already opened. + # By default Puma will use these but only if it was explicitly told to bind + # to the socket. If not, it will close the activated sockets. This means + # all configuration is duplicated. + # + # Binds can contain additional configuration, but only SSL config is really + # relevant since the unix and TCP socket options are ignored. + # + # This means there is a lot of duplicated configuration for no additional + # value in most setups. This method tells the launcher to bind to all + # activated sockets, regardless of existing bind. + # + # To clear configured binds, the value only can be passed. This will clear + # out any binds that may have been configured. + # + # @example Use any systemd activated sockets as well as configured binds + # bind_to_activated_sockets + # + # @example Only bind to systemd activated sockets, ignoring other binds + # bind_to_activated_sockets 'only' + # + def bind_to_activated_sockets(bind=true) + @options[:bind_to_activated_sockets] = bind + end + + # Define the TCP port to bind to. Use `bind` for more advanced options. + # + # The default is +9292+. + # + # @example + # port 3000 + # + def port(port, host=nil) + host ||= default_host + bind URI::Generic.build(scheme: 'tcp', host: host, port: Integer(port)).to_s + end + + # Define how long the tcp socket stays open, if no data has been received. + # + # The default is 30 seconds. + # + # @example + # first_data_timeout 40 + # + # @see Puma::Server.new + # + def first_data_timeout(seconds) + @options[:first_data_timeout] = Integer(seconds) + end + + # Define how long persistent connections can be idle before Puma closes them. + # + # The default is 20 seconds. + # + # @example + # persistent_timeout 30 + # + # @see Puma::Server.new + # + def persistent_timeout(seconds) + @options[:persistent_timeout] = Integer(seconds) + end + + # If a new request is not received within this number of seconds, begin shutting down. + # + # The default is +nil+. + # + # @example + # idle_timeout 60 + # + # @see Puma::Server.new + # + def idle_timeout(seconds) + @options[:idle_timeout] = Integer(seconds) + end + + # Work around leaky apps that leave garbage in Thread locals + # across requests. + # + # The default is +false+. + # + # @example + # clean_thread_locals + # + def clean_thread_locals(which=true) + @options[:clean_thread_locals] = which + end + + # When shutting down, drain the accept socket of pending connections and + # process them. This loops over the accept socket until there are no more + # read events and then stops looking and waits for the requests to finish. + # + # @see Puma::Server#graceful_shutdown + # + def drain_on_shutdown(which=true) + @options[:drain_on_shutdown] = which + end + + # Set the environment in which the rack's app will run. The value must be + # a string. + # + # The default is "development". + # + # @example + # environment 'production' + # + def environment(environment) + @options[:environment] = environment + end + + # How long to wait for threads to stop when shutting them down. + # Specifying :immediately will cause Puma to kill the threads immediately. + # Otherwise the value is the number of seconds to wait. + # + # Puma always waits a few seconds after killing a thread for it to try + # to finish up it's work, even in :immediately mode. + # + # The default is +:forever+. + # + # @see Puma::Server#graceful_shutdown + # + def force_shutdown_after(val=:forever) + i = case val + when :forever + -1 + when :immediately + 0 + else + Float(val) + end + + @options[:force_shutdown_after] = i + end + + # Code to run before doing a restart. This code should + # close log files, database connections, etc. + # + # This can be called multiple times to add code each time. + # + # @example + # on_restart do + # puts 'On restart...' + # end + # + def on_restart(&block) + process_hook :on_restart, nil, block, 'on_restart' + end + + # Command to use to restart Puma. This should be just how to + # load Puma itself (ie. 'ruby -Ilib bin/puma'), not the arguments + # to Puma, as those are the same as the original process. + # + # @example + # restart_command '/u/app/lolcat/bin/restart_puma' + # + def restart_command(cmd) + @options[:restart_cmd] = cmd.to_s + end + + # Store the pid of the server in the file at "path". + # + # @example + # pidfile '/u/apps/lolcat/tmp/pids/puma.pid' + # + def pidfile(path) + @options[:pidfile] = path.to_s + end + + # Disable request logging, the inverse of `log_requests`. + # + # The default is +true+. + # + # @example + # quiet + # + def quiet(which=true) + @options[:log_requests] = !which + end + + # Enable request logging, the inverse of `quiet`. + # + # The default is +false+. + # + # @example + # log_requests + # + def log_requests(which=true) + @options[:log_requests] = which + end + + # Pass in a custom logging class instance + # + # @example + # custom_logger Logger.new('t.log') + # + def custom_logger(custom_logger) + @options[:custom_logger] = custom_logger + end + + # Show debugging info + # + # The default is +false+. + # + # @example + # debug + # + def debug + @options[:debug] = true + end + + # Load +path+ as a rackup file. + # + # The default is "config.ru". + # + # @example + # rackup '/u/apps/lolcat/config.ru' + # + def rackup(path) + @options[:rackup] ||= path.to_s + end + + # Allows setting `env['rack.url_scheme']`. + # Only necessary if X-Forwarded-Proto is not being set by your proxy + # Normal values are 'http' or 'https'. + # + def rack_url_scheme(scheme=nil) + @options[:rack_url_scheme] = scheme + end + + # Enable HTTP 103 Early Hints responses. + # + # The default is +nil+. + # + # @example + # early_hints + # + def early_hints(answer=true) + @options[:early_hints] = answer + end + + # Redirect +STDOUT+ and +STDERR+ to files specified. The +append+ parameter + # specifies whether the output is appended. + # + # The default is +false+. + # + # @example + # stdout_redirect '/app/lolcat/log/stdout', '/app/lolcat/log/stderr' + # @example + # stdout_redirect '/app/lolcat/log/stdout', '/app/lolcat/log/stderr', true + # + def stdout_redirect(stdout=nil, stderr=nil, append=false) + @options[:redirect_stdout] = stdout + @options[:redirect_stderr] = stderr + @options[:redirect_append] = append + end + + def log_formatter(&block) + @options[:log_formatter] = block + end + + # Configure the number of threads to use to answer requests. + # + # It can be a single fixed number, or a +min+ and a +max+. + # + # The default is the environment variables +PUMA_MIN_THREADS+ / +PUMA_MAX_THREADS+ + # (or +MIN_THREADS+ / +MAX_THREADS+ if the +PUMA_+ variables aren't set). + # + # If these environment variables aren't set, the default is "0, 5" in MRI or "0, 16" for other interpreters. + # + # @example + # threads 5 + # @example + # threads 0, 16 + # @example + # threads 5, 5 + # + def threads(min, max = min) + min = Integer(min) + max = Integer(max) + if min > max + raise "The minimum (#{min}) number of threads must be less than or equal to the max (#{max})" + end + + if max < 1 + raise "The maximum number of threads (#{max}) must be greater than 0" + end + + @options[:min_threads] = min + @options[:max_threads] = max + end + + # Instead of using +bind+ and manually constructing a URI like: + # + # bind 'ssl://127.0.0.1:9292?key=key_path&cert=cert_path' + # + # you can use the this method. + # + # When binding on localhost you don't need to specify +cert+ and +key+, + # Puma will assume you are using the +localhost+ gem and try to load the + # appropriate files. + # + # When using the options hash parameter, the `reuse:` value is either + # `true`, which sets reuse 'on' with default values, or a hash, with `:size` + # and/or `:timeout` keys, each with integer values. + # + # The `cert:` options hash parameter can be the path to a certificate + # file including all intermediate certificates in PEM format. + # + # The `cert_pem:` options hash parameter can be String containing the + # cerificate and all intermediate certificates in PEM format. + # + # @example + # ssl_bind '127.0.0.1', '9292', { + # cert: path_to_cert, + # key: path_to_key, + # ssl_cipher_filter: cipher_filter, # optional + # ssl_ciphersuites: ciphersuites, # optional + # verify_mode: verify_mode, # default 'none' + # verification_flags: flags, # optional, not supported by JRuby + # reuse: true # optional + # } + # + # @example Using self-signed certificate with the +localhost+ gem: + # ssl_bind '127.0.0.1', '9292' + # + # @example Alternatively, you can provide +cert_pem+ and +key_pem+: + # ssl_bind '127.0.0.1', '9292', { + # cert_pem: File.read(path_to_cert), + # key_pem: File.read(path_to_key), + # reuse: {size: 2_000, timeout: 20} # optional + # } + # + # @example For JRuby, two keys are required: +keystore+ & +keystore_pass+ + # ssl_bind '127.0.0.1', '9292', { + # keystore: path_to_keystore, + # keystore_pass: password, + # ssl_cipher_list: cipher_list, # optional + # verify_mode: verify_mode # default 'none' + # } + # + def ssl_bind(host, port, opts = {}) + add_pem_values_to_options_store(opts) + bind self.class.ssl_bind_str(host, port, opts) + end + + # Use +path+ as the file to store the server info state. This is + # used by +pumactl+ to query and control the server. + # + # @example + # state_path '/u/apps/lolcat/tmp/pids/puma.state' + # + def state_path(path) + @options[:state] = path.to_s + end + + # Use +permission+ to restrict permissions for the state file. + # + # @example + # state_permission 0600 + # + def state_permission(permission) + @options[:state_permission] = permission + end + + # How many worker processes to run. Typically this is set to + # the number of available cores. + # + # The default is the value of the environment variable +WEB_CONCURRENCY+ if + # set, otherwise 0. + # + # @note Cluster mode only. + # + # @example + # workers 2 + # + # @see Puma::Cluster + # + def workers(count) + @options[:workers] = count.to_i + end + + # Disable warning message when running in cluster mode with a single worker. + # + # Cluster mode has some overhead of running an additional 'control' process + # in order to manage the cluster. If only running a single worker it is + # likely not worth paying that overhead vs running in single mode with + # additional threads instead. + # + # There are some scenarios where running cluster mode with a single worker + # may still be warranted and valid under certain deployment scenarios, see + # https://github.com/puma/puma/issues/2534 + # + # Moving from workers = 1 to workers = 0 will save 10-30% of memory use. + # + # The default is +false+. + # + # @note Cluster mode only. + # + # @example + # silence_single_worker_warning + # + def silence_single_worker_warning + @options[:silence_single_worker_warning] = true + end + + # Disable warning message when running single mode with callback hook defined. + # + # The default is +false+. + # + # @example + # silence_fork_callback_warning + # + def silence_fork_callback_warning + @options[:silence_fork_callback_warning] = true + end + + # Code to run immediately before master process + # forks workers (once on boot). These hooks can block if necessary + # to wait for background operations unknown to Puma to finish before + # the process terminates. + # This can be used to close any connections to remote servers (database, + # Redis, ...) that were opened when preloading the code. + # + # This can be called multiple times to add several hooks. + # + # @note Cluster mode only. + # + # @example + # before_fork do + # puts "Starting workers..." + # end + # + def before_fork(&block) + warn_if_in_single_mode('before_fork') + + process_hook :before_fork, nil, block, 'before_fork' + end + + # Code to run in a worker when it boots to setup + # the process before booting the app. + # + # This can be called multiple times to add several hooks. + # + # @note Cluster mode only. + # + # @example + # on_worker_boot do + # puts 'Before worker boot...' + # end + # + def on_worker_boot(key = nil, &block) + warn_if_in_single_mode('on_worker_boot') + + process_hook :before_worker_boot, key, block, 'on_worker_boot' + end + + # Code to run immediately before a worker shuts + # down (after it has finished processing HTTP requests). The worker's + # index is passed as an argument. These hooks + # can block if necessary to wait for background operations unknown + # to Puma to finish before the process terminates. + # + # This can be called multiple times to add several hooks. + # + # @note Cluster mode only. + # + # @example + # on_worker_shutdown do + # puts 'On worker shutdown...' + # end + # + def on_worker_shutdown(key = nil, &block) + warn_if_in_single_mode('on_worker_shutdown') + + process_hook :before_worker_shutdown, key, block, 'on_worker_shutdown' + end + + # Code to run in the master right before a worker is started. The worker's + # index is passed as an argument. + # + # This can be called multiple times to add several hooks. + # + # @note Cluster mode only. + # + # @example + # on_worker_fork do + # puts 'Before worker fork...' + # end + # + def on_worker_fork(&block) + warn_if_in_single_mode('on_worker_fork') + + process_hook :before_worker_fork, nil, block, 'on_worker_fork' + end + + # Code to run in the master after a worker has been started. The worker's + # index is passed as an argument. + # + # This is called everytime a worker is to be started. + # + # @note Cluster mode only. + # + # @example + # after_worker_fork do + # puts 'After worker fork...' + # end + # + def after_worker_fork(&block) + warn_if_in_single_mode('after_worker_fork') + + process_hook :after_worker_fork, nil, block, 'after_worker_fork' + end + + alias_method :after_worker_boot, :after_worker_fork + + # Code to run after puma is booted (works for both single and cluster modes). + # + # @example + # on_booted do + # puts 'After booting...' + # end + # + def on_booted(&block) + @config.options[:events].on_booted(&block) + end + + # Code to run after puma is stopped (works for both single and cluster modes). + # + # @example + # on_stopped do + # puts 'After stopping...' + # end + # + def on_stopped(&block) + @config.options[:events].on_stopped(&block) + end + + # When `fork_worker` is enabled, code to run in Worker 0 + # before all other workers are re-forked from this process, + # after the server has temporarily stopped serving requests + # (once per complete refork cycle). + # + # This can be used to trigger extra garbage-collection to maximize + # copy-on-write efficiency, or close any connections to remote servers + # (database, Redis, ...) that were opened while the server was running. + # + # This can be called multiple times to add several hooks. + # + # @note Cluster mode with `fork_worker` enabled only. + # + # @example + # on_refork do + # 3.times {GC.start} + # end + # + def on_refork(key = nil, &block) + warn_if_in_single_mode('on_refork') + + process_hook :before_refork, key, block, 'on_refork' + end + + # When `fork_worker` is enabled, code to run in Worker 0 + # after all other workers are re-forked from this process, + # after the server has temporarily stopped serving requests + # (once per complete refork cycle). + # + # This can be used to re-open any connections to remote servers + # (database, Redis, ...) that were closed via on_refork. + # + # This can be called multiple times to add several hooks. + # + # @note Cluster mode with `fork_worker` enabled only. + # + # @example + # after_refork do + # puts 'After refork...' + # end + # + def after_refork(key = nil, &block) + process_hook :after_refork, key, block, 'after_refork' + end + + # Provide a block to be executed just before a thread is added to the thread + # pool. Be careful: while the block executes, thread creation is delayed, and + # probably a request will have to wait too! The new thread will not be added to + # the threadpool until the provided block returns. + # + # Return values are ignored. + # Raising an exception will log a warning. + # + # This hook is useful for doing something when the thread pool grows. + # + # This can be called multiple times to add several hooks. + # + # @example + # on_thread_start do + # puts 'On thread start...' + # end + # + def on_thread_start(&block) + process_hook :before_thread_start, nil, block, 'on_thread_start' + end + + # Provide a block to be executed after a thread is trimmed from the thread + # pool. Be careful: while this block executes, Puma's main loop is + # blocked, so no new requests will be picked up. + # + # This hook only runs when a thread in the threadpool is trimmed by Puma. + # It does not run when a thread dies due to exceptions or any other cause. + # + # Return values are ignored. + # Raising an exception will log a warning. + # + # This hook is useful for cleaning up thread local resources when a thread + # is trimmed. + # + # This can be called multiple times to add several hooks. + # + # @example + # on_thread_exit do + # puts 'On thread exit...' + # end + # + def on_thread_exit(&block) + process_hook :before_thread_exit, nil, block, 'on_thread_exit' + end + + # Code to run out-of-band when the worker is idle. + # These hooks run immediately after a request has finished + # processing and there are no busy threads on the worker. + # The worker doesn't accept new requests until this code finishes. + # + # This hook is useful for running out-of-band garbage collection + # or scheduling asynchronous tasks to execute after a response. + # + # This can be called multiple times to add several hooks. + # + def out_of_band(&block) + process_hook :out_of_band, nil, block, 'out_of_band' + end + + # The directory to operate out of. + # + # The default is the current directory. + # + # @example + # directory '/u/apps/lolcat' + # + def directory(dir) + @options[:directory] = dir.to_s + end + + # Preload the application before starting the workers; this conflicts with + # phased restart feature. + # + # The default is +true+ if your app uses more than 1 worker. + # + # @note Cluster mode only. + # + # @example + # preload_app! + # + def preload_app!(answer=true) + @options[:preload_app] = answer + end + + # Use +obj+ or +block+ as the low level error handler. This allows the + # configuration file to change the default error on the server. + # + # @example + # lowlevel_error_handler do |err| + # [200, {}, ["error page"]] + # end + # + def lowlevel_error_handler(obj=nil, &block) + obj ||= block + raise "Provide either a #call'able or a block" unless obj + @options[:lowlevel_error_handler] = obj + end + + # This option is used to allow your app and its gems to be + # properly reloaded when not using preload. + # + # When set, if Puma detects that it's been invoked in the + # context of Bundler, it will cleanup the environment and + # re-run itself outside the Bundler environment, but directly + # using the files that Bundler has setup. + # + # This means that Puma is now decoupled from your Bundler + # context and when each worker loads, it will be loading a + # new Bundler context and thus can float around as the release + # dictates. + # + # @note This is incompatible with +preload_app!+. + # @note This is only supported for RubyGems 2.2+ + # + # @see extra_runtime_dependencies + # + def prune_bundler(answer=true) + @options[:prune_bundler] = answer + end + + # Raises a SignalException when SIGTERM is received. In environments where + # SIGTERM is something expected, you can suppress these with this option. + # + # This can be useful for example in Kubernetes, where rolling restart is + # guaranteed usually on the infrastructure level. + # + # The default is +true+. + # + # @example + # raise_exception_on_sigterm false + # + # @see Puma::Launcher#setup_signals + # @see Puma::Cluster#setup_signals + # + def raise_exception_on_sigterm(answer=true) + @options[:raise_exception_on_sigterm] = answer + end + + # When using prune_bundler, if extra runtime dependencies need to be loaded to + # initialize your app, then this setting can be used. This includes any Puma plugins. + # + # Before bundler is pruned, the gem names supplied will be looked up in the bundler + # context and then loaded again after bundler is pruned. + # Only applies if prune_bundler is used. + # + # @example + # extra_runtime_dependencies ['gem_name_1', 'gem_name_2'] + # @example + # extra_runtime_dependencies ['puma_worker_killer', 'puma-heroku'] + # + # @see Puma::Launcher#extra_runtime_deps_directories + # + def extra_runtime_dependencies(answer = []) + @options[:extra_runtime_dependencies] = Array(answer) + end + + # Additional text to display in process listing. + # + # If you do not specify a tag, Puma will infer it. If you do not want Puma + # to add a tag, use an empty string. + # + # The default is the current file or directory base name. + # + # @example + # tag 'app name' + # @example + # tag '' + # + def tag(string) + @options[:tag] = string.to_s + end + + # Change the default interval for checking workers. + # + # The default is 5 seconds. + # + # @note Cluster mode only. + # + # @example + # worker_check_interval 10 + # + # @see Puma::Cluster#check_workers + # + def worker_check_interval(interval) + @options[:worker_check_interval] = Integer(interval) + end + + # Verifies that all workers have checked in to the master process within + # the given timeout. If not the worker process will be restarted. This is + # not a request timeout, it is to protect against a hung or dead process. + # Setting this value will not protect against slow requests. + # + # This value must be greater than worker_check_interval. + # + # The default is 60 seconds. + # + # @note Cluster mode only. + # + # @example + # worker_timeout 60 + # + # @see Puma::Cluster::Worker#ping_timeout + # + def worker_timeout(timeout) + timeout = Integer(timeout) + min = @options.fetch(:worker_check_interval, Configuration::DEFAULTS[:worker_check_interval]) + + if timeout <= min + raise "The minimum worker_timeout must be greater than the worker reporting interval (#{min})" + end + + @options[:worker_timeout] = timeout + end + + # Change the default worker timeout for booting. + # + # The default is the value of `worker_timeout`. + # + # @note Cluster mode only. + # + # @example + # worker_boot_timeout 60 + # + # @see Puma::Cluster::Worker#ping_timeout + # + def worker_boot_timeout(timeout) + @options[:worker_boot_timeout] = Integer(timeout) + end + + # Set the timeout for worker shutdown. + # + # The default is 30 seconds. + # + # @note Cluster mode only. + # + # @example + # worker_shutdown_timeout 90 + # + # @see Puma::Cluster::Worker#term + # + def worker_shutdown_timeout(timeout) + @options[:worker_shutdown_timeout] = Integer(timeout) + end + + # Set the strategy for worker culling. + # + # There are two possible values: + # + # 1. **:youngest** - the youngest workers (i.e. the workers that were + # the most recently started) will be culled. + # 2. **:oldest** - the oldest workers (i.e. the workers that were started + # the longest time ago) will be culled. + # + # The default is +:youngest+. + # + # @note Cluster mode only. + # + # @example + # worker_culling_strategy :oldest + # + # @see Puma::Cluster#cull_workers + # + def worker_culling_strategy(strategy) + strategy = strategy.to_sym + + if ![:youngest, :oldest].include?(strategy) + raise "Invalid value for worker_culling_strategy - #{strategy}" + end + + @options[:worker_culling_strategy] = strategy + end + + # When set to true, workers accept all requests + # and queue them before passing them to the handlers. + # When set to false, each worker process accepts exactly as + # many requests as it is configured to simultaneously handle. + # + # Queueing requests generally improves performance. In some + # cases, such as a single threaded application, it may be + # better to ensure requests get balanced across workers. + # + # Note that setting this to false disables HTTP keepalive and + # slow clients will occupy a handler thread while the request + # is being sent. A reverse proxy, such as nginx, can handle + # slow clients and queue requests before they reach Puma. + # + # The default is +true+. + # + # @see Puma::Server + # + def queue_requests(answer=true) + @options[:queue_requests] = answer + end + + # When a shutdown is requested, the backtraces of all the + # threads will be written to $stdout. This can help figure + # out why shutdown is hanging. + # + def shutdown_debug(val=true) + @options[:shutdown_debug] = val + end + + + # Attempts to route traffic to less-busy workers by causing them to delay + # listening on the socket, allowing workers which are not processing any + # requests to pick up new requests first. + # + # The default is 0.005 seconds. + # + # Only works on MRI. For all other interpreters, this setting does nothing. + # + # @see Puma::Server#handle_servers + # @see Puma::ThreadPool#wait_for_less_busy_worker + # + def wait_for_less_busy_worker(val=0.005) + @options[:wait_for_less_busy_worker] = val.to_f + end + + # Control how the remote address of the connection is set. This + # is configurable because to calculate the true socket peer address + # a kernel syscall is required which for very fast rack handlers + # slows down the handling significantly. + # + # There are 5 possible values: + # + # 1. **:socket** - read the peername from the socket using the + # syscall. This is the normal behavior. If this fails for any reason (e.g., + # if the peer disconnects between the connection being accepted and the getpeername + # system call), Puma will return "0.0.0.0" + # 2. **:localhost** - set the remote address to "127.0.0.1" + # 3. **header: **- set the remote address to the value of the + # provided http header. For instance: + # `set_remote_address header: "X-Real-IP"`. + # Only the first word (as separated by spaces or comma) is used, allowing + # headers such as X-Forwarded-For to be used as well. If this header is absent, + # Puma will fall back to the behavior of :socket + # 4. **proxy_protocol: :v1**- set the remote address to the value read from the + # HAproxy PROXY protocol, version 1. If the request does not have the PROXY + # protocol attached to it, will fall back to :socket + # 5. **\** - this allows you to hardcode remote address to any value + # you wish. Because Puma never uses this field anyway, it's format is + # entirely in your hands. + # + # The default is +:socket+. + # + # @example + # set_remote_address :localhost + # + def set_remote_address(val=:socket) + case val + when :socket + @options[:remote_address] = val + when :localhost + @options[:remote_address] = :value + @options[:remote_address_value] = "127.0.0.1".freeze + when String + @options[:remote_address] = :value + @options[:remote_address_value] = val + when Hash + if hdr = val[:header] + @options[:remote_address] = :header + @options[:remote_address_header] = "HTTP_" + hdr.upcase.tr("-", "_") + elsif protocol_version = val[:proxy_protocol] + @options[:remote_address] = :proxy_protocol + protocol_version = protocol_version.downcase.to_sym + unless [:v1].include?(protocol_version) + raise "Invalid value for proxy_protocol - #{protocol_version.inspect}" + end + @options[:remote_address_proxy_protocol] = protocol_version + else + raise "Invalid value for set_remote_address - #{val.inspect}" + end + else + raise "Invalid value for set_remote_address - #{val}" + end + end + + # When enabled, workers will be forked from worker 0 instead of from the master process. + # This option is similar to `preload_app` because the app is preloaded before forking, + # but it is compatible with phased restart. + # + # This option also enables the `refork` command (SIGURG), which optimizes copy-on-write performance + # in a running app. + # + # A refork will automatically trigger once after the specified number of requests + # (default 1000), or pass 0 to disable auto refork. + # + # @note This is experimental. + # @note Cluster mode only. + # + def fork_worker(after_requests=1000) + @options[:fork_worker] = Integer(after_requests) + end + + # The number of requests to attempt inline before sending a client back to + # the reactor to be subject to normal ordering. + # + # The default is 10. + # + # @example + # max_fast_inline 20 + # + def max_fast_inline(num_of_requests) + @options[:max_fast_inline] = Float(num_of_requests) + end + + # When `true`, keep-alive connections are maintained on inbound requests. + # Enabling this setting reduces the number of TCP operations, reducing response + # times for connections that can send multiple requests in a single connection. + # + # When Puma receives more incoming connections than available Puma threads, + # enabling the keep-alive behavior may result in processing requests out-of-order, + # increasing overall response time variance. Increased response time variance + # means that the overall average of response times might not change, but more + # outliers will exist. Those long-tail outliers may significantly affect response + # times for some processed requests. + # + # When `false`, Puma closes the connection after each request, requiring the + # client to open a new request. Disabling this setting guarantees that requests + # will be processed in the order they are fully received, decreasing response + # variance and eliminating long-tail outliers caused by keep-alive behavior. + # The trade-off is that the number of TCP operations required will increase. + # + # The default is +true+. + # + # @example + # enable_keep_alives false + # + def enable_keep_alives(enabled=true) + @options[:enable_keep_alives] = enabled + end + + # Specify the backend for the IO selector. + # + # Provided values will be passed directly to +NIO::Selector.new+, with the + # exception of +:auto+ which will let nio4r choose the backend. + # + # Check the documentation of +NIO::Selector.backends+ for the list of valid + # options. Note that the available options on your system will depend on the + # operating system. If you want to use the pure Ruby backend (not + # recommended due to its comparatively low performance), set environment + # variable +NIO4R_PURE+ to +true+. + # + # The default is +:auto+. + # + # @see https://github.com/socketry/nio4r/blob/master/lib/nio/selector.rb + # + def io_selector_backend(backend) + @options[:io_selector_backend] = backend.to_sym + end + + # Ensures +STDOUT+ and +STDERR+ is immediately flushed to the underlying + # operating system and is not buffered internally + # + # The default is +true+. + # + # @example + # mutate_stdout_and_stderr_to_sync_on_write false + # + def mutate_stdout_and_stderr_to_sync_on_write(enabled=true) + @options[:mutate_stdout_and_stderr_to_sync_on_write] = enabled + end + + # Specify how big the request payload should be, in bytes. + # This limit is compared against Content-Length HTTP header. + # If the payload size (CONTENT_LENGTH) is larger than http_content_length_limit, + # HTTP 413 status code is returned. + # + # When no Content-Length http header is present, it is compared against the + # size of the body of the request. + # + # The default is +nil+. + # + # @example + # http_content_length_limit 2_000_000_000 + # + def http_content_length_limit(limit) + @options[:http_content_length_limit] = limit + end + + # Supported http methods, which will replace `Puma::Const::SUPPORTED_HTTP_METHODS`. + # The value of `:any` will allows all methods, otherwise, the value must be + # an array of strings. Note that methods are all uppercase. + # + # `Puma::Const::SUPPORTED_HTTP_METHODS` is conservative, if you want a + # complete set of methods, the methods defined by the + # [IANA Method Registry](https://www.iana.org/assignments/http-methods/http-methods.xhtml) + # are pre-defined as the constant `Puma::Const::IANA_HTTP_METHODS`. + # + # @note If the `methods` value is `:any`, no method check with be performed, + # similar to Puma v5 and earlier. + # + # @example Adds 'PROPFIND' to existing supported methods + # supported_http_methods(Puma::Const::SUPPORTED_HTTP_METHODS + ['PROPFIND']) + # @example Restricts methods to the array elements + # supported_http_methods %w[HEAD GET POST PUT DELETE OPTIONS PROPFIND] + # @example Restricts methods to the methods in the IANA Registry + # supported_http_methods Puma::Const::IANA_HTTP_METHODS + # @example Allows any method + # supported_http_methods :any + # + def supported_http_methods(methods) + if methods == :any + @options[:supported_http_methods] = :any + elsif Array === methods && methods == (ary = methods.grep(String).uniq) && + !ary.empty? + @options[:supported_http_methods] = ary + else + raise "supported_http_methods must be ':any' or a unique array of strings" + end + end + + private + + # To avoid adding cert_pem and key_pem as URI params, we store them on the + # options[:store] from where Puma binder knows how to find and extract them. + # + def add_pem_values_to_options_store(opts) + return if defined?(JRUBY_VERSION) + + @options[:store] ||= [] + + # Store cert_pem and key_pem to options[:store] if present + [:cert, :key].each do |v| + opt_key = :"#{v}_pem" + if opts[opt_key] + index = @options[:store].length + @options[:store] << opts[opt_key] + opts[v] = "store:#{index}" + end + end + end + + def process_hook(options_key, key, block, meth) + @options[options_key] ||= [] + if ON_WORKER_KEY.include? key.class + @options[options_key] << [block, key.to_sym] + elsif key.nil? + @options[options_key] << block + else + raise "'#{meth}' key must be String or Symbol" + end + end + + def warn_if_in_single_mode(hook_name) + return if @options[:silence_fork_callback_warning] + # user_options (CLI) have precedence over config file + workers_val = @config.options.user_options[:workers] || @options[:workers] || + @config.puma_default_options[:workers] || 0 + if workers_val == 0 + log_string = + "Warning: You specified code to run in a `#{hook_name}` block, " \ + "but Puma is not configured to run in cluster mode (worker count > 0), " \ + "so your `#{hook_name}` block will not run." + + LogWriter.stdio.log(log_string) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/error_logger.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/error_logger.rb new file mode 100644 index 0000000..792e14a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/error_logger.rb @@ -0,0 +1,113 @@ +# frozen_string_literal: true + +require_relative 'const' + +module Puma + # The implementation of a detailed error logging. + # @version 5.0.0 + # + class ErrorLogger + include Const + + attr_reader :ioerr + + REQUEST_FORMAT = %{"%s %s%s" - (%s)} + + LOG_QUEUE = Queue.new + + def initialize(ioerr, env: ENV) + @ioerr = ioerr + + @debug = env.key?('PUMA_DEBUG') + end + + def self.stdio(env: ENV) + new($stderr, env: env) + end + + # Print occurred error details. + # +options+ hash with additional options: + # - +error+ is an exception object + # - +req+ the http request + # - +text+ (default nil) custom string to print in title + # and before all remaining info. + # + def info(options={}) + internal_write title(options) + end + + # Print occurred error details only if + # environment variable PUMA_DEBUG is defined. + # +options+ hash with additional options: + # - +error+ is an exception object + # - +req+ the http request + # - +text+ (default nil) custom string to print in title + # and before all remaining info. + # + def debug(options={}) + return unless @debug + + error = options[:error] + req = options[:req] + + string_block = [] + string_block << title(options) + string_block << request_dump(req) if request_parsed?(req) + string_block << error.backtrace if error + + internal_write string_block.join("\n") + end + + def title(options={}) + text = options[:text] + req = options[:req] + error = options[:error] + + string_block = ["#{Time.now}"] + string_block << " #{text}" if text + string_block << " (#{request_title(req)})" if request_parsed?(req) + string_block << ": #{error.inspect}" if error + string_block.join('') + end + + def request_dump(req) + "Headers: #{request_headers(req)}\n" \ + "Body: #{req.body}" + end + + def request_title(req) + env = req.env + + REQUEST_FORMAT % [ + env[REQUEST_METHOD], + env[REQUEST_PATH] || env[PATH_INFO], + env[QUERY_STRING] || "", + env[HTTP_X_FORWARDED_FOR] || env[REMOTE_ADDR] || "-" + ] + end + + def request_headers(req) + headers = req.env.select { |key, _| key.start_with?('HTTP_') } + headers.map { |key, value| [key[5..-1], value] }.to_h.inspect + end + + def request_parsed?(req) + req && req.env[REQUEST_METHOD] + end + + def internal_write(str) + LOG_QUEUE << str + while (w_str = LOG_QUEUE.pop(true)) do + begin + @ioerr.is_a?(IO) and @ioerr.wait_writable(1) + @ioerr.write "#{w_str}\n" + @ioerr.flush unless @ioerr.sync + rescue Errno::EPIPE, Errno::EBADF, IOError, Errno::EINVAL + # 'Invalid argument' (Errno::EINVAL) may be raised by flush + end + end + rescue ThreadError + end + private :internal_write + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/events.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/events.rb new file mode 100644 index 0000000..3ada3e1 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/events.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +module Puma + + # This is an event sink used by `Puma::Server` to handle + # lifecycle events such as :on_booted, :on_restart, and :on_stopped. + # Using `Puma::DSL` it is possible to register callback hooks + # for each event type. + class Events + + def initialize + @hooks = Hash.new { |h,k| h[k] = [] } + end + + # Fire callbacks for the named hook + def fire(hook, *args) + @hooks[hook].each { |t| t.call(*args) } + end + + # Register a callback for a given hook + def register(hook, obj=nil, &blk) + if obj and blk + raise "Specify either an object or a block, not both" + end + + h = obj || blk + + @hooks[hook] << h + + h + end + + def on_booted(&block) + register(:on_booted, &block) + end + + def on_restart(&block) + register(:on_restart, &block) + end + + def on_stopped(&block) + register(:on_stopped, &block) + end + + def fire_on_booted! + fire(:on_booted) + end + + def fire_on_restart! + fire(:on_restart) + end + + def fire_on_stopped! + fire(:on_stopped) + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/io_buffer.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/io_buffer.rb new file mode 100644 index 0000000..d2265e9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/io_buffer.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +require 'stringio' + +module Puma + class IOBuffer < StringIO + def initialize + super.binmode + end + + def empty? + length.zero? + end + + def reset + truncate 0 + rewind + end + + def to_s + rewind + read + end + + # Read & Reset - returns contents and resets + # @return [String] StringIO contents + def read_and_reset + rewind + str = read + truncate 0 + rewind + str + end + + alias_method :clear, :reset + + # before Ruby 2.5, `write` would only take one argument + if RUBY_VERSION >= '2.5' && RUBY_ENGINE != 'truffleruby' + alias_method :append, :write + else + def append(*strs) + strs.each { |str| write str } + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/jruby_restart.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/jruby_restart.rb new file mode 100644 index 0000000..48c410e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/jruby_restart.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +require 'ffi' + +module Puma + module JRubyRestart + extend FFI::Library + ffi_lib 'c' + attach_function :chdir, [:string], :int + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/json_serialization.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/json_serialization.rb new file mode 100644 index 0000000..94cad5c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/json_serialization.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: true +require 'stringio' + +module Puma + + # Puma deliberately avoids the use of the json gem and instead performs JSON + # serialization without any external dependencies. In a puma cluster, loading + # any gem into the puma master process means that operators cannot use a + # phased restart to upgrade their application if the new version of that + # application uses a different version of that gem. The json gem in + # particular is additionally problematic because it leverages native + # extensions. If the puma master process relies on a gem with native + # extensions and operators remove gems from disk related to old releases, + # subsequent phased restarts can fail. + # + # The implementation of JSON serialization in this module is not designed to + # be particularly full-featured or fast. It just has to handle the few places + # where Puma relies on JSON serialization internally. + + module JSONSerialization + QUOTE = /"/ + BACKSLASH = /\\/ + CONTROL_CHAR_TO_ESCAPE = /[\x00-\x1F]/ # As required by ECMA-404 + CHAR_TO_ESCAPE = Regexp.union QUOTE, BACKSLASH, CONTROL_CHAR_TO_ESCAPE + + class SerializationError < StandardError; end + + class << self + def generate(value) + StringIO.open do |io| + serialize_value io, value + io.string + end + end + + private + + def serialize_value(output, value) + case value + when Hash + output << '{' + value.each_with_index do |(k, v), index| + output << ',' if index != 0 + serialize_object_key output, k + output << ':' + serialize_value output, v + end + output << '}' + when Array + output << '[' + value.each_with_index do |member, index| + output << ',' if index != 0 + serialize_value output, member + end + output << ']' + when Integer, Float + output << value.to_s + when String + serialize_string output, value + when true + output << 'true' + when false + output << 'false' + when nil + output << 'null' + else + raise SerializationError, "Unexpected value of type #{value.class}" + end + end + + def serialize_string(output, value) + output << '"' + output << value.gsub(CHAR_TO_ESCAPE) do |character| + case character + when BACKSLASH + '\\\\' + when QUOTE + '\\"' + when CONTROL_CHAR_TO_ESCAPE + '\u%.4X' % character.ord + end + end + output << '"' + end + + def serialize_object_key(output, value) + case value + when Symbol, String + serialize_string output, value.to_s + else + raise SerializationError, "Could not serialize object of type #{value.class} as object key" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/launcher.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/launcher.rb new file mode 100644 index 0000000..1ecce52 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/launcher.rb @@ -0,0 +1,497 @@ +# frozen_string_literal: true + +require_relative 'log_writer' +require_relative 'events' +require_relative 'detect' +require_relative 'cluster' +require_relative 'single' +require_relative 'const' +require_relative 'binder' + +module Puma + # Puma::Launcher is the single entry point for starting a Puma server based on user + # configuration. It is responsible for taking user supplied arguments and resolving them + # with configuration in `config/puma.rb` or `config/puma/.rb`. + # + # It is responsible for either launching a cluster of Puma workers or a single + # puma server. + class Launcher + autoload :BundlePruner, 'puma/launcher/bundle_pruner' + + # Returns an instance of Launcher + # + # +conf+ A Puma::Configuration object indicating how to run the server. + # + # +launcher_args+ A Hash that currently has one required key `:events`, + # this is expected to hold an object similar to an `Puma::LogWriter.stdio`, + # this object will be responsible for broadcasting Puma's internal state + # to a logging destination. An optional key `:argv` can be supplied, + # this should be an array of strings, these arguments are re-used when + # restarting the puma server. + # + # Examples: + # + # conf = Puma::Configuration.new do |user_config| + # user_config.threads 1, 10 + # user_config.app do |env| + # [200, {}, ["hello world"]] + # end + # end + # Puma::Launcher.new(conf, log_writer: Puma::LogWriter.stdio).run + def initialize(conf, launcher_args={}) + @runner = nil + @log_writer = launcher_args[:log_writer] || LogWriter::DEFAULT + @events = launcher_args[:events] || Events.new + @argv = launcher_args[:argv] || [] + @original_argv = @argv.dup + @config = conf + + env = launcher_args.delete(:env) || ENV + + @config.options[:log_writer] = @log_writer + + # Advertise the Configuration + Puma.cli_config = @config if defined?(Puma.cli_config) + + @config.load + + @binder = Binder.new(@log_writer, conf) + @binder.create_inherited_fds(ENV).each { |k| ENV.delete k } + @binder.create_activated_fds(ENV).each { |k| ENV.delete k } + + @environment = conf.environment + + # Load the systemd integration if we detect systemd's NOTIFY_SOCKET. + # Skip this on JRuby though, because it is incompatible with the systemd + # integration due to https://github.com/jruby/jruby/issues/6504 + if ENV["NOTIFY_SOCKET"] && !Puma.jruby? && !ENV["PUMA_SKIP_SYSTEMD"] + @config.plugins.create('systemd') + end + + if @config.options[:bind_to_activated_sockets] + @config.options[:binds] = @binder.synthesize_binds_from_activated_fs( + @config.options[:binds], + @config.options[:bind_to_activated_sockets] == 'only' + ) + end + + @options = @config.options + @config.clamp + + @log_writer.formatter = LogWriter::PidFormatter.new if clustered? + @log_writer.formatter = options[:log_formatter] if @options[:log_formatter] + + @log_writer.custom_logger = options[:custom_logger] if @options[:custom_logger] + + generate_restart_data + + if clustered? && !Puma.forkable? + unsupported "worker mode not supported on #{RUBY_ENGINE} on this platform" + end + + Dir.chdir(@restart_dir) + + prune_bundler! + + @environment = @options[:environment] if @options[:environment] + set_rack_environment + + if clustered? + @options[:logger] = @log_writer + + @runner = Cluster.new(self) + else + @runner = Single.new(self) + end + Puma.stats_object = @runner + + @status = :run + + log_config if env['PUMA_LOG_CONFIG'] + end + + attr_reader :binder, :log_writer, :events, :config, :options, :restart_dir + + # Return stats about the server + def stats + @runner.stats + end + + # Write a state file that can be used by pumactl to control + # the server + def write_state + write_pid + + path = @options[:state] + permission = @options[:state_permission] + return unless path + + require_relative 'state_file' + + sf = StateFile.new + sf.pid = Process.pid + sf.control_url = @options[:control_url] + sf.control_auth_token = @options[:control_auth_token] + sf.running_from = File.expand_path('.') + + sf.save path, permission + end + + # Delete the configured pidfile + def delete_pidfile + path = @options[:pidfile] + File.unlink(path) if path && File.exist?(path) + end + + # Begin async shutdown of the server + def halt + @status = :halt + @runner.halt + end + + # Begin async shutdown of the server gracefully + def stop + @status = :stop + @runner.stop + end + + # Begin async restart of the server + def restart + @status = :restart + @runner.restart + end + + # Begin a phased restart if supported + def phased_restart + unless @runner.respond_to?(:phased_restart) and @runner.phased_restart + log "* phased-restart called but not available, restarting normally." + return restart + end + + if @options.file_options[:tag].nil? + dir = File.realdirpath(@restart_dir) + @options[:tag] = File.basename(dir) + set_process_title + end + + true + end + + # Begin a refork if supported + def refork + if clustered? && @runner.respond_to?(:fork_worker!) && @options[:fork_worker] + @runner.fork_worker! + true + else + log "* refork called but not available." + false + end + end + + # Run the server. This blocks until the server is stopped + def run + previous_env = get_env + + @config.clamp + + @config.plugins.fire_starts self + + setup_signals + set_process_title + + # This blocks until the server is stopped + @runner.run + + do_run_finished(previous_env) + end + + # Return all tcp ports the launcher may be using, TCP or SSL + # @!attribute [r] connected_ports + # @version 5.0.0 + def connected_ports + @binder.connected_ports + end + + # @!attribute [r] restart_args + def restart_args + cmd = @options[:restart_cmd] + if cmd + cmd.split(' ') + @original_argv + else + @restart_argv + end + end + + def close_binder_listeners + @runner.close_control_listeners + @binder.close_listeners + unless @status == :restart + log "=== puma shutdown: #{Time.now} ===" + log "- Goodbye!" + end + end + + # @!attribute [r] thread_status + # @version 5.0.0 + def thread_status + Thread.list.each do |thread| + name = "Thread: TID-#{thread.object_id.to_s(36)}" + name += " #{thread['label']}" if thread['label'] + name += " #{thread.name}" if thread.respond_to?(:name) && thread.name + backtrace = thread.backtrace || [""] + + yield name, backtrace + end + end + + private + + def get_env + if defined?(Bundler) + env = Bundler::ORIGINAL_ENV.dup + # add -rbundler/setup so we load from Gemfile when restarting + bundle = "-rbundler/setup" + env["RUBYOPT"] = [env["RUBYOPT"], bundle].join(" ").lstrip unless env["RUBYOPT"].to_s.include?(bundle) + env + else + ENV.to_h + end + end + + def do_run_finished(previous_env) + case @status + when :halt + do_forceful_stop + when :run, :stop + do_graceful_stop + when :restart + do_restart(previous_env) + end + + close_binder_listeners unless @status == :restart + end + + def do_forceful_stop + log "* Stopping immediately!" + @runner.stop_control + end + + def do_graceful_stop + @events.fire_on_stopped! + @runner.stop_blocked + end + + def do_restart(previous_env) + log "* Restarting..." + ENV.replace(previous_env) + @runner.stop_control + restart! + end + + def restart! + @events.fire_on_restart! + @config.run_hooks :on_restart, self, @log_writer + + if Puma.jruby? + close_binder_listeners + + require_relative 'jruby_restart' + argv = restart_args + JRubyRestart.chdir(@restart_dir) + Kernel.exec(*argv) + elsif Puma.windows? + close_binder_listeners + + argv = restart_args + Dir.chdir(@restart_dir) + Kernel.exec(*argv) + else + argv = restart_args + Dir.chdir(@restart_dir) + ENV.update(@binder.redirects_for_restart_env) + argv += [@binder.redirects_for_restart] + Kernel.exec(*argv) + end + end + + # If configured, write the pid of the current process out + # to a file. + def write_pid + path = @options[:pidfile] + return unless path + cur_pid = Process.pid + File.write path, cur_pid, mode: 'wb:UTF-8' + at_exit do + delete_pidfile if cur_pid == Process.pid + end + end + + def reload_worker_directory + @runner.reload_worker_directory if @runner.respond_to?(:reload_worker_directory) + end + + def log(str) + @log_writer.log(str) + end + + def clustered? + (@options[:workers] || 0) > 0 + end + + def unsupported(str) + @log_writer.error(str) + raise UnsupportedOption + end + + def set_process_title + Process.respond_to?(:setproctitle) ? Process.setproctitle(title) : $0 = title + end + + # @!attribute [r] title + def title + buffer = "puma #{Puma::Const::VERSION} (#{@options[:binds].join(',')})" + buffer += " [#{@options[:tag]}]" if @options[:tag] && !@options[:tag].empty? + buffer + end + + def set_rack_environment + @options[:environment] = environment + ENV['RACK_ENV'] = environment + end + + # @!attribute [r] environment + def environment + @environment + end + + def prune_bundler? + @options[:prune_bundler] && clustered? && !@options[:preload_app] + end + + def prune_bundler! + return unless prune_bundler? + BundlePruner.new(@original_argv, @options[:extra_runtime_dependencies], @log_writer).prune + end + + def generate_restart_data + if dir = @options[:directory] + @restart_dir = dir + + elsif Puma.windows? + # I guess the value of PWD is garbage on windows so don't bother + # using it. + @restart_dir = Dir.pwd + + # Use the same trick as unicorn, namely favor PWD because + # it will contain an unresolved symlink, useful for when + # the pwd is /data/releases/current. + elsif dir = ENV['PWD'] + s_env = File.stat(dir) + s_pwd = File.stat(Dir.pwd) + + if s_env.ino == s_pwd.ino and (Puma.jruby? or s_env.dev == s_pwd.dev) + @restart_dir = dir + end + end + + @restart_dir ||= Dir.pwd + + # if $0 is a file in the current directory, then restart + # it the same, otherwise add -S on there because it was + # picked up in PATH. + # + if File.exist?($0) + arg0 = [Gem.ruby, $0] + else + arg0 = [Gem.ruby, "-S", $0] + end + + # Detect and reinject -Ilib from the command line, used for testing without bundler + # cruby has an expanded path, jruby has just "lib" + lib = File.expand_path "lib" + arg0[1,0] = ["-I", lib] if [lib, "lib"].include?($LOAD_PATH[0]) + + if defined? Puma::WILD_ARGS + @restart_argv = arg0 + Puma::WILD_ARGS + @original_argv + else + @restart_argv = arg0 + @original_argv + end + end + + def setup_signals + unless ENV["PUMA_SKIP_SIGUSR2"] + begin + Signal.trap "SIGUSR2" do + restart + end + rescue Exception + log "*** SIGUSR2 not implemented, signal based restart unavailable!" + end + end + + unless Puma.jruby? + begin + Signal.trap "SIGUSR1" do + phased_restart + end + rescue Exception + log "*** SIGUSR1 not implemented, signal based restart unavailable!" + end + end + + begin + Signal.trap "SIGTERM" do + # Shortcut the control flow in case raise_exception_on_sigterm is true + do_graceful_stop + + raise(SignalException, "SIGTERM") if @options[:raise_exception_on_sigterm] + end + rescue Exception + log "*** SIGTERM not implemented, signal based gracefully stopping unavailable!" + end + + begin + Signal.trap "SIGINT" do + stop + end + rescue Exception + log "*** SIGINT not implemented, signal based gracefully stopping unavailable!" + end + + begin + Signal.trap "SIGHUP" do + if @runner.redirected_io? + @runner.redirect_io + else + stop + end + end + rescue Exception + log "*** SIGHUP not implemented, signal based logs reopening unavailable!" + end + + begin + unless Puma.jruby? # INFO in use by JVM already + Signal.trap "SIGINFO" do + thread_status do |name, backtrace| + @log_writer.log(name) + @log_writer.log(backtrace.map { |bt| " #{bt}" }) + end + end + end + rescue Exception + # Not going to log this one, as SIGINFO is *BSD only and would be pretty annoying + # to see this constantly on Linux. + end + end + + def log_config + log "Configuration:" + + @config.final_options + .each { |config_key, value| log "- #{config_key}: #{value}" } + + log "\n" + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/launcher/bundle_pruner.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/launcher/bundle_pruner.rb new file mode 100644 index 0000000..1b5c911 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/launcher/bundle_pruner.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: true + +module Puma + class Launcher + + # This class is used to pickup Gemfile changes during + # application restarts. + class BundlePruner + + def initialize(original_argv, extra_runtime_dependencies, log_writer) + @original_argv = Array(original_argv) + @extra_runtime_dependencies = Array(extra_runtime_dependencies) + @log_writer = log_writer + end + + def prune + return if ENV['PUMA_BUNDLER_PRUNED'] + return unless defined?(Bundler) + + require_rubygems_min_version! + + unless puma_wild_path + log "! Unable to prune Bundler environment, continuing" + return + end + + dirs = paths_to_require_after_prune + + log '* Pruning Bundler environment' + home = ENV['GEM_HOME'] + bundle_gemfile = Bundler.original_env['BUNDLE_GEMFILE'] + bundle_app_config = Bundler.original_env['BUNDLE_APP_CONFIG'] + + with_unbundled_env do + ENV['GEM_HOME'] = home + ENV['BUNDLE_GEMFILE'] = bundle_gemfile + ENV['PUMA_BUNDLER_PRUNED'] = '1' + ENV["BUNDLE_APP_CONFIG"] = bundle_app_config + args = [Gem.ruby, puma_wild_path, '-I', dirs.join(':')] + @original_argv + # Ruby 2.0+ defaults to true which breaks socket activation + args += [{:close_others => false}] + Kernel.exec(*args) + end + end + + private + + def require_rubygems_min_version! + min_version = Gem::Version.new('2.2') + + return if min_version <= Gem::Version.new(Gem::VERSION) + + raise "prune_bundler is not supported on your version of RubyGems. " \ + "You must have RubyGems #{min_version}+ to use this feature." + end + + def puma_wild_path + puma_lib_dir = puma_require_paths.detect { |x| File.exist? File.join(x, '../bin/puma-wild') } + File.expand_path(File.join(puma_lib_dir, '../bin/puma-wild')) + end + + def with_unbundled_env + bundler_ver = Gem::Version.new(Bundler::VERSION) + if bundler_ver < Gem::Version.new('2.1.0') + Bundler.with_clean_env { yield } + else + Bundler.with_unbundled_env { yield } + end + end + + def paths_to_require_after_prune + puma_require_paths + extra_runtime_deps_paths + end + + def extra_runtime_deps_paths + t = @extra_runtime_dependencies.map do |dep_name| + if (spec = spec_for_gem(dep_name)) + require_paths_for_gem(spec) + else + log "* Could not load extra dependency: #{dep_name}" + nil + end + end + t.flatten!; t.compact!; t + end + + def puma_require_paths + require_paths_for_gem(spec_for_gem('puma')) + end + + def spec_for_gem(gem_name) + Bundler.rubygems.loaded_specs(gem_name) + end + + def require_paths_for_gem(gem_spec) + gem_spec.full_require_paths + end + + def log(str) + @log_writer.log(str) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/log_writer.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/log_writer.rb new file mode 100644 index 0000000..9a1eb9d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/log_writer.rb @@ -0,0 +1,147 @@ +# frozen_string_literal: true + +require_relative 'null_io' +require_relative 'error_logger' +require 'stringio' +require 'io/wait' unless Puma::HAS_NATIVE_IO_WAIT + +module Puma + + # Handles logging concerns for both standard messages + # (+stdout+) and errors (+stderr+). + class LogWriter + + class DefaultFormatter + def call(str) + str + end + end + + class PidFormatter + def call(str) + "[#{$$}] #{str}" + end + end + + LOG_QUEUE = Queue.new + + attr_reader :stdout, + :stderr + + attr_accessor :formatter, :custom_logger + + # Create a LogWriter that prints to +stdout+ and +stderr+. + def initialize(stdout, stderr, env: ENV) + @formatter = DefaultFormatter.new + @custom_logger = nil + @stdout = stdout + @stderr = stderr + + @debug = env.key?('PUMA_DEBUG') + @error_logger = ErrorLogger.new(@stderr, env: env) + end + + DEFAULT = new(STDOUT, STDERR) + + # Returns an LogWriter object which writes its status to + # two StringIO objects. + def self.strings(env: ENV) + LogWriter.new(StringIO.new, StringIO.new, env: env) + end + + def self.stdio(env: ENV) + LogWriter.new($stdout, $stderr, env: env) + end + + def self.null(env: ENV) + n = NullIO.new + LogWriter.new(n, n, env: env) + end + + # Write +str+ to +@stdout+ + def log(str) + if @custom_logger&.respond_to?(:write) + @custom_logger.write(format(str)) + else + internal_write "#{@formatter.call str}\n" + end + end + + def write(str) + internal_write @formatter.call(str) + end + + def internal_write(str) + LOG_QUEUE << str + while (w_str = LOG_QUEUE.pop(true)) do + begin + @stdout.is_a?(IO) and @stdout.wait_writable(1) + @stdout.write w_str + @stdout.flush unless @stdout.sync + rescue Errno::EPIPE, Errno::EBADF, IOError, Errno::EINVAL + # 'Invalid argument' (Errno::EINVAL) may be raised by flush + end + end + rescue ThreadError + end + private :internal_write + + def debug? + @debug + end + + def debug(str) + log("% #{str}") if @debug + end + + # Write +str+ to +@stderr+ + def error(str) + @error_logger.info(text: @formatter.call("ERROR: #{str}")) + exit 1 + end + + def format(str) + formatter.call(str) + end + + # An HTTP connection error has occurred. + # +error+ a connection exception, +req+ the request, + # and +text+ additional info + # @version 5.0.0 + def connection_error(error, req, text="HTTP connection error") + @error_logger.info(error: error, req: req, text: text) + end + + # An HTTP parse error has occurred. + # +error+ a parsing exception, + # and +req+ the request. + def parse_error(error, req) + @error_logger.info(error: error, req: req, text: 'HTTP parse error, malformed request') + end + + # An SSL error has occurred. + # @param error + # @param ssl_socket + def ssl_error(error, ssl_socket) + peeraddr = ssl_socket.peeraddr.last rescue "" + peercert = ssl_socket.peercert + subject = peercert&.subject + @error_logger.info(error: error, text: "SSL error, peer: #{peeraddr}, peer cert: #{subject}") + end + + # An unknown error has occurred. + # +error+ an exception object, +req+ the request, + # and +text+ additional info + def unknown_error(error, req=nil, text="Unknown error") + @error_logger.info(error: error, req: req, text: text) + end + + # Log occurred error debug dump. + # +error+ an exception object, +req+ the request, + # and +text+ additional info + # @version 5.0.0 + def debug_error(error, req=nil, text="") + @error_logger.debug(error: error, req: req, text: text) + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/minissl.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/minissl.rb new file mode 100644 index 0000000..0ff2ce8 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/minissl.rb @@ -0,0 +1,459 @@ +# frozen_string_literal: true + +begin + require 'io/wait' unless Puma::HAS_NATIVE_IO_WAIT +rescue LoadError +end + +require 'open3' +# need for Puma::MiniSSL::OPENSSL constants used in `HAS_TLS1_3` +# use require, see https://github.com/puma/puma/pull/2381 +require 'puma/puma_http11' + +module Puma + module MiniSSL + # Define constant at runtime, as it's easy to determine at built time, + # but Puma could (it shouldn't) be loaded with an older OpenSSL version + # @version 5.0.0 + HAS_TLS1_3 = IS_JRUBY || + ((OPENSSL_VERSION[/ \d+\.\d+\.\d+/].split('.').map(&:to_i) <=> [1,1,1]) != -1 && + (OPENSSL_LIBRARY_VERSION[/ \d+\.\d+\.\d+/].split('.').map(&:to_i) <=> [1,1,1]) !=-1) + + class Socket + def initialize(socket, engine) + @socket = socket + @engine = engine + @peercert = nil + @reuse = nil + end + + # @!attribute [r] to_io + def to_io + @socket + end + + def closed? + @socket.closed? + end + + # Returns a two element array, + # first is protocol version (SSL_get_version), + # second is 'handshake' state (SSL_state_string) + # + # Used for dropping tcp connections to ssl. + # See OpenSSL ssl/ssl_stat.c SSL_state_string for info + # @!attribute [r] ssl_version_state + # @version 5.0.0 + # + def ssl_version_state + IS_JRUBY ? [nil, nil] : @engine.ssl_vers_st + end + + # Used to check the handshake status, in particular when a TCP connection + # is made with TLSv1.3 as an available protocol + # @version 5.0.0 + def bad_tlsv1_3? + HAS_TLS1_3 && ssl_version_state == ['TLSv1.3', 'SSLERR'] + end + private :bad_tlsv1_3? + + def readpartial(size) + while true + output = @engine.read + return output if output + + data = @socket.readpartial(size) + @engine.inject(data) + output = @engine.read + + return output if output + + while neg_data = @engine.extract + @socket.write neg_data + end + end + end + + def engine_read_all + output = @engine.read + while output and additional_output = @engine.read + output << additional_output + end + output + end + + def read_nonblock(size, *_) + # *_ is to deal with keyword args that were added + # at some point (and being used in the wild) + while true + output = engine_read_all + return output if output + + data = @socket.read_nonblock(size, exception: false) + if data == :wait_readable || data == :wait_writable + # It would make more sense to let @socket.read_nonblock raise + # EAGAIN if necessary but it seems like it'll misbehave on Windows. + # I don't have a Windows machine to debug this so I can't explain + # exactly whats happening in that OS. Please let me know if you + # find out! + # + # In the meantime, we can emulate the correct behavior by + # capturing :wait_readable & :wait_writable and raising EAGAIN + # ourselves. + raise IO::EAGAINWaitReadable + elsif data.nil? + raise SSLError.exception "HTTP connection?" if bad_tlsv1_3? + return nil + end + + @engine.inject(data) + output = engine_read_all + + return output if output + + while neg_data = @engine.extract + @socket.write neg_data + end + end + end + + def write(data) + return 0 if data.empty? + + data_size = data.bytesize + need = data_size + + while true + wrote = @engine.write data + + enc_wr = +'' + while (enc = @engine.extract) + enc_wr << enc + end + @socket.write enc_wr unless enc_wr.empty? + + need -= wrote + + return data_size if need == 0 + + data = data.byteslice(wrote..-1) + end + end + + alias_method :syswrite, :write + alias_method :<<, :write + + # This is a temporary fix to deal with websockets code using + # write_nonblock. + + # The problem with implementing it properly + # is that it means we'd have to have the ability to rewind + # an engine because after we write+extract, the socket + # write_nonblock call might raise an exception and later + # code would pass the same data in, but the engine would think + # it had already written the data in. + # + # So for the time being (and since write blocking is quite rare), + # go ahead and actually block in write_nonblock. + # + def write_nonblock(data, *_) + write data + end + + def flush + @socket.flush + end + + def close + begin + unless @engine.shutdown + while alert_data = @engine.extract + @socket.write alert_data + end + end + rescue IOError, SystemCallError + Puma::Util.purge_interrupt_queue + # nothing + ensure + @socket.close + end + end + + # @!attribute [r] peeraddr + def peeraddr + @socket.peeraddr + end + + # OpenSSL is loaded in `MiniSSL::ContextBuilder` when + # `MiniSSL::Context#verify_mode` is not `VERIFY_NONE`. + # When `VERIFY_NONE`, `MiniSSL::Engine#peercert` is nil, regardless of + # whether the client sends a cert. + # @return [OpenSSL::X509::Certificate, nil] + # @!attribute [r] peercert + def peercert + return @peercert if @peercert + + raw = @engine.peercert + return nil unless raw + + @peercert = OpenSSL::X509::Certificate.new raw + end + end + + if IS_JRUBY + OPENSSL_NO_SSL3 = false + OPENSSL_NO_TLS1 = false + end + + class Context + attr_accessor :verify_mode + attr_reader :no_tlsv1, :no_tlsv1_1 + + def initialize + @no_tlsv1 = false + @no_tlsv1_1 = false + @key = nil + @cert = nil + @key_pem = nil + @cert_pem = nil + @reuse = nil + @reuse_cache_size = nil + @reuse_timeout = nil + end + + def check_file(file, desc) + raise ArgumentError, "#{desc} file '#{file}' does not exist" unless File.exist? file + raise ArgumentError, "#{desc} file '#{file}' is not readable" unless File.readable? file + end + + if IS_JRUBY + # jruby-specific Context properties: java uses a keystore and password pair rather than a cert/key pair + attr_reader :keystore + attr_reader :keystore_type + attr_accessor :keystore_pass + attr_reader :truststore + attr_reader :truststore_type + attr_accessor :truststore_pass + attr_reader :cipher_suites + attr_reader :protocols + + def keystore=(keystore) + check_file keystore, 'Keystore' + @keystore = keystore + end + + def truststore=(truststore) + # NOTE: historically truststore was assumed the same as keystore, this is kept for backwards + # compatibility, to rely on JVM's trust defaults we allow setting `truststore = :default` + unless truststore.eql?(:default) + raise ArgumentError, "No such truststore file '#{truststore}'" unless File.exist?(truststore) + end + @truststore = truststore + end + + def keystore_type=(type) + raise ArgumentError, "Invalid keystore type: #{type.inspect}" unless ['pkcs12', 'jks', nil].include?(type) + @keystore_type = type + end + + def truststore_type=(type) + raise ArgumentError, "Invalid truststore type: #{type.inspect}" unless ['pkcs12', 'jks', nil].include?(type) + @truststore_type = type + end + + def cipher_suites=(list) + list = list.split(',').map(&:strip) if list.is_a?(String) + @cipher_suites = list + end + + # aliases for backwards compatibility + alias_method :ssl_cipher_list, :cipher_suites + alias_method :ssl_cipher_list=, :cipher_suites= + + def protocols=(list) + list = list.split(',').map(&:strip) if list.is_a?(String) + @protocols = list + end + + def check + raise "Keystore not configured" unless @keystore + # @truststore defaults to @keystore due backwards compatibility + end + + else + # non-jruby Context properties + attr_reader :key + attr_reader :key_password_command + attr_reader :cert + attr_reader :ca + attr_reader :cert_pem + attr_reader :key_pem + attr_accessor :ssl_cipher_filter + attr_accessor :ssl_ciphersuites + attr_accessor :verification_flags + + attr_reader :reuse, :reuse_cache_size, :reuse_timeout + + def key=(key) + check_file key, 'Key' + @key = key + end + + def key_password_command=(key_password_command) + @key_password_command = key_password_command + end + + def cert=(cert) + check_file cert, 'Cert' + @cert = cert + end + + def ca=(ca) + check_file ca, 'ca' + @ca = ca + end + + def cert_pem=(cert_pem) + raise ArgumentError, "'cert_pem' is not a String" unless cert_pem.is_a? String + @cert_pem = cert_pem + end + + def key_pem=(key_pem) + raise ArgumentError, "'key_pem' is not a String" unless key_pem.is_a? String + @key_pem = key_pem + end + + def check + raise "Key not configured" if @key.nil? && @key_pem.nil? + raise "Cert not configured" if @cert.nil? && @cert_pem.nil? + end + + # Executes the command to return the password needed to decrypt the key. + def key_password + raise "Key password command not configured" if @key_password_command.nil? + + stdout_str, stderr_str, status = Open3.capture3(@key_password_command) + + return stdout_str.chomp if status.success? + + raise "Key password failed with code #{status.exitstatus}: #{stderr_str}" + end + + # Controls session reuse. Allowed values are as follows: + # * 'off' - matches the behavior of Puma 5.6 and earlier. This is included + # in case reuse 'on' is made the default in future Puma versions. + # * 'dflt' - sets session reuse on, with OpenSSL default cache size of + # 20k and default timeout of 300 seconds. + # * 's,t' - where s and t are integer strings, for size and timeout. + # * 's' - where s is an integer strings for size. + # * ',t' - where t is an integer strings for timeout. + # + def reuse=(reuse_str) + case reuse_str + when 'off' + @reuse = nil + when 'dflt' + @reuse = true + when /\A\d+\z/ + @reuse = true + @reuse_cache_size = reuse_str.to_i + when /\A\d+,\d+\z/ + @reuse = true + size, time = reuse_str.split ',' + @reuse_cache_size = size.to_i + @reuse_timeout = time.to_i + when /\A,\d+\z/ + @reuse = true + @reuse_timeout = reuse_str.delete(',').to_i + end + end + end + + # disables TLSv1 + # @!attribute [w] no_tlsv1= + def no_tlsv1=(tlsv1) + raise ArgumentError, "Invalid value of no_tlsv1=" unless ['true', 'false', true, false].include?(tlsv1) + @no_tlsv1 = tlsv1 + end + + # disables TLSv1 and TLSv1.1. Overrides `#no_tlsv1=` + # @!attribute [w] no_tlsv1_1= + def no_tlsv1_1=(tlsv1_1) + raise ArgumentError, "Invalid value of no_tlsv1_1=" unless ['true', 'false', true, false].include?(tlsv1_1) + @no_tlsv1_1 = tlsv1_1 + end + + end + + VERIFY_NONE = 0 + VERIFY_PEER = 1 + VERIFY_FAIL_IF_NO_PEER_CERT = 2 + + # https://github.com/openssl/openssl/blob/master/include/openssl/x509_vfy.h.in + # /* Certificate verify flags */ + VERIFICATION_FLAGS = { + "USE_CHECK_TIME" => 0x2, + "CRL_CHECK" => 0x4, + "CRL_CHECK_ALL" => 0x8, + "IGNORE_CRITICAL" => 0x10, + "X509_STRICT" => 0x20, + "ALLOW_PROXY_CERTS" => 0x40, + "POLICY_CHECK" => 0x80, + "EXPLICIT_POLICY" => 0x100, + "INHIBIT_ANY" => 0x200, + "INHIBIT_MAP" => 0x400, + "NOTIFY_POLICY" => 0x800, + "EXTENDED_CRL_SUPPORT" => 0x1000, + "USE_DELTAS" => 0x2000, + "CHECK_SS_SIGNATURE" => 0x4000, + "TRUSTED_FIRST" => 0x8000, + "SUITEB_128_LOS_ONLY" => 0x10000, + "SUITEB_192_LOS" => 0x20000, + "SUITEB_128_LOS" => 0x30000, + "PARTIAL_CHAIN" => 0x80000, + "NO_ALT_CHAINS" => 0x100000, + "NO_CHECK_TIME" => 0x200000 + }.freeze + + class Server + def initialize(socket, ctx) + @socket = socket + @ctx = ctx + @eng_ctx = IS_JRUBY ? @ctx : SSLContext.new(ctx) + end + + def accept + @ctx.check + io = @socket.accept + engine = Engine.server @eng_ctx + Socket.new io, engine + end + + def accept_nonblock + @ctx.check + io = @socket.accept_nonblock + engine = Engine.server @eng_ctx + Socket.new io, engine + end + + # @!attribute [r] to_io + def to_io + @socket + end + + # @!attribute [r] addr + # @version 5.0.0 + def addr + @socket.addr + end + + def close + @socket.close unless @socket.closed? # closed? call is for Windows + end + + def closed? + @socket.closed? + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/minissl/context_builder.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/minissl/context_builder.rb new file mode 100644 index 0000000..6abce10 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/minissl/context_builder.rb @@ -0,0 +1,96 @@ +module Puma + module MiniSSL + class ContextBuilder + def initialize(params, log_writer) + @params = params + @log_writer = log_writer + end + + def context + ctx = MiniSSL::Context.new + + if defined?(JRUBY_VERSION) + unless params['keystore'] + log_writer.error "Please specify the Java keystore via 'keystore='" + end + + ctx.keystore = params['keystore'] + + unless params['keystore-pass'] + log_writer.error "Please specify the Java keystore password via 'keystore-pass='" + end + + ctx.keystore_pass = params['keystore-pass'] + ctx.keystore_type = params['keystore-type'] + + if truststore = params['truststore'] + ctx.truststore = truststore.eql?('default') ? :default : truststore + ctx.truststore_pass = params['truststore-pass'] + ctx.truststore_type = params['truststore-type'] + end + + ctx.cipher_suites = params['cipher_suites'] || params['ssl_cipher_list'] + ctx.protocols = params['protocols'] if params['protocols'] + else + if params['key'].nil? && params['key_pem'].nil? + log_writer.error "Please specify the SSL key via 'key=' or 'key_pem='" + end + + ctx.key = params['key'] if params['key'] + ctx.key_pem = params['key_pem'] if params['key_pem'] + ctx.key_password_command = params['key_password_command'] if params['key_password_command'] + + if params['cert'].nil? && params['cert_pem'].nil? + log_writer.error "Please specify the SSL cert via 'cert=' or 'cert_pem='" + end + + ctx.cert = params['cert'] if params['cert'] + ctx.cert_pem = params['cert_pem'] if params['cert_pem'] + + if ['peer', 'force_peer'].include?(params['verify_mode']) + unless params['ca'] + log_writer.error "Please specify the SSL ca via 'ca='" + end + # needed for Puma::MiniSSL::Socket#peercert, env['puma.peercert'] + require 'openssl' + end + + ctx.ca = params['ca'] if params['ca'] + ctx.ssl_cipher_filter = params['ssl_cipher_filter'] if params['ssl_cipher_filter'] + ctx.ssl_ciphersuites = params['ssl_ciphersuites'] if params['ssl_ciphersuites'] && HAS_TLS1_3 + + ctx.reuse = params['reuse'] if params['reuse'] + end + + ctx.no_tlsv1 = params['no_tlsv1'] == 'true' + ctx.no_tlsv1_1 = params['no_tlsv1_1'] == 'true' + + if params['verify_mode'] + ctx.verify_mode = case params['verify_mode'] + when "peer" + MiniSSL::VERIFY_PEER + when "force_peer" + MiniSSL::VERIFY_PEER | MiniSSL::VERIFY_FAIL_IF_NO_PEER_CERT + when "none" + MiniSSL::VERIFY_NONE + else + log_writer.error "Please specify a valid verify_mode=" + MiniSSL::VERIFY_NONE + end + end + + if params['verification_flags'] + ctx.verification_flags = params['verification_flags'].split(','). + map { |flag| MiniSSL::VERIFICATION_FLAGS.fetch(flag) }. + inject { |sum, flag| sum ? sum | flag : flag } + end + + ctx + end + + private + + attr_reader :params, :log_writer + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/null_io.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/null_io.rb new file mode 100644 index 0000000..13534cd --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/null_io.rb @@ -0,0 +1,101 @@ +# frozen_string_literal: true + +module Puma + # Provides an IO-like object that always appears to contain no data. + # Used as the value for rack.input when the request has no body. + # + class NullIO + def gets + nil + end + + def string + "" + end + + def each + end + + def pos + 0 + end + + # Mimics IO#read with no data. + # + def read(length = nil, buffer = nil) + if length.to_i < 0 + raise ArgumentError, "(negative length #{length} given)" + end + + buffer = if buffer.nil? + "".b + else + String.try_convert(buffer) or raise TypeError, "no implicit conversion of #{buffer.class} into String" + end + buffer.clear + if length.to_i > 0 + nil + else + buffer + end + end + + def rewind + end + + def seek(pos, whence = 0) + raise ArgumentError, "negative length #{pos} given" if pos.negative? + 0 + end + + def close + end + + def size + 0 + end + + def eof? + true + end + + def sync + true + end + + def sync=(v) + end + + def puts(*ary) + end + + def write(*ary) + end + + def flush + self + end + + # This is used as singleton class, so can't have state. + def closed? + false + end + + def set_encoding(enc) + self + end + + # per rack spec + def external_encoding + Encoding::ASCII_8BIT + end + + def binmode + self + end + + def binmode? + true + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin.rb new file mode 100644 index 0000000..8a943b5 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin.rb @@ -0,0 +1,111 @@ +# frozen_string_literal: true + +module Puma + class UnknownPlugin < RuntimeError; end + + class PluginLoader + def initialize + @instances = [] + end + + def create(name) + if cls = Plugins.find(name) + plugin = cls.new + @instances << plugin + return plugin + end + + raise UnknownPlugin, "File failed to register properly named plugin" + end + + def fire_starts(launcher) + @instances.each do |i| + if i.respond_to? :start + i.start(launcher) + end + end + end + end + + class PluginRegistry + def initialize + @plugins = {} + @background = [] + end + + def register(name, cls) + @plugins[name] = cls + end + + def find(name) + name = name.to_s + + if cls = @plugins[name] + return cls + end + + begin + require "puma/plugin/#{name}" + rescue LoadError + raise UnknownPlugin, "Unable to find plugin: #{name}" + end + + if cls = @plugins[name] + return cls + end + + raise UnknownPlugin, "file failed to register a plugin" + end + + def add_background(blk) + @background << blk + end + + def fire_background + @background.each_with_index do |b, i| + Thread.new do + Puma.set_thread_name "plgn bg #{i}" + b.call + end + end + end + end + + Plugins = PluginRegistry.new + + class Plugin + # Matches + # "C:/Ruby22/lib/ruby/gems/2.2.0/gems/puma-3.0.1/lib/puma/plugin/tmp_restart.rb:3:in `'" + # AS + # C:/Ruby22/lib/ruby/gems/2.2.0/gems/puma-3.0.1/lib/puma/plugin/tmp_restart.rb + CALLER_FILE = / + \A # start of string + .+ # file path (one or more characters) + (?= # stop previous match when + :\d+ # a colon is followed by one or more digits + :in # followed by a colon followed by in + ) + /x + + def self.extract_name(ary) + path = ary.first[CALLER_FILE] + + m = %r!puma/plugin/([^/]*)\.rb$!.match(path) + m[1] + end + + def self.create(&blk) + name = extract_name(caller) + + cls = Class.new(self) + + cls.class_eval(&blk) + + Plugins.register name, cls + end + + def in_background(&blk) + Plugins.add_background blk + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin/systemd.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin/systemd.rb new file mode 100644 index 0000000..d6c4715 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin/systemd.rb @@ -0,0 +1,90 @@ +# frozen_string_literal: true + +require_relative '../plugin' + +# Puma's systemd integration allows Puma to inform systemd: +# 1. when it has successfully started +# 2. when it is starting shutdown +# 3. periodically for a liveness check with a watchdog thread +# 4. periodically set the status +Puma::Plugin.create do + def start(launcher) + require_relative '../sd_notify' + + launcher.log_writer.log "* Enabling systemd notification integration" + + # hook_events + launcher.events.on_booted { Puma::SdNotify.ready } + launcher.events.on_stopped { Puma::SdNotify.stopping } + launcher.events.on_restart { Puma::SdNotify.reloading } + + # start watchdog + if Puma::SdNotify.watchdog? + ping_f = watchdog_sleep_time + + in_background do + launcher.log_writer.log "Pinging systemd watchdog every #{ping_f.round(1)} sec" + loop do + sleep ping_f + Puma::SdNotify.watchdog + end + end + end + + # start status loop + instance = self + sleep_time = 1.0 + in_background do + launcher.log_writer.log "Sending status to systemd every #{sleep_time.round(1)} sec" + + loop do + sleep sleep_time + # TODO: error handling? + Puma::SdNotify.status(instance.status) + end + end + end + + def status + if clustered? + messages = stats[:worker_status].map do |worker| + common_message(worker[:last_status]) + end.join(',') + + "Puma #{Puma::Const::VERSION}: cluster: #{booted_workers}/#{workers}, worker_status: [#{messages}]" + else + "Puma #{Puma::Const::VERSION}: worker: #{common_message(stats)}" + end + end + + private + + def watchdog_sleep_time + usec = Integer(ENV["WATCHDOG_USEC"]) + + sec_f = usec / 1_000_000.0 + # "It is recommended that a daemon sends a keep-alive notification message + # to the service manager every half of the time returned here." + sec_f / 2 + end + + def stats + Puma.stats_hash + end + + def clustered? + stats.has_key?(:workers) + end + + def workers + stats.fetch(:workers, 1) + end + + def booted_workers + stats.fetch(:booted_workers, 1) + end + + def common_message(stats) + "{ #{stats[:running]}/#{stats[:max_threads]} threads, #{stats[:pool_capacity]} available, #{stats[:backlog]} backlog }" + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin/tmp_restart.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin/tmp_restart.rb new file mode 100644 index 0000000..5136023 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin/tmp_restart.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +require_relative '../plugin' + +Puma::Plugin.create do + def start(launcher) + path = File.join("tmp", "restart.txt") + + orig = nil + + # If we can't write to the path, then just don't bother with this plugin + begin + File.write(path, "") unless File.exist?(path) + orig = File.stat(path).mtime + rescue SystemCallError + return + end + + in_background do + while true + sleep 2 + + begin + mtime = File.stat(path).mtime + rescue SystemCallError + # If the file has disappeared, assume that means don't restart + else + if mtime > orig + launcher.restart + break + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/puma_http11.so b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/puma_http11.so new file mode 100755 index 0000000000000000000000000000000000000000..4a104ac331acf46fd516928c9ca60ce090adc7d8 GIT binary patch literal 141920 zcmeFad3+Sb_6OQMlT0RInMoia>;r^-F#*G(ED0ev!2mIY#RZa(g+xOVv#`h(OoEIt z5^=-phUi7yQSVjUFn|IgYQzl{A>h^{UW~YaqU3!~RrPdDlkxuE@_T>0XY=W)KHqcd z)TvXas;jCy^qS<b<8 z1u*4X{}|`5f5|`9-J+*<&Q{1qI=7L6Hc}Tu6-7_Y`Sy!^<}^m+(^D#gj#*z<iOr%#Gt&{MsH5W+R;sUC||F6p3{xopO41@37i z%!-o^x~8Tln)r`iym{u`5w+_NOdVzEa`)T^dqh9U^P6rd# zDh&xPC2_G5q_$79S6OQ8RaJxfM!S?vu}xJjXH`%vWR)q3Gg@ic6njT?q%%uVT~(Wy zt{cEwiE|ZBI#%;UsY1FIXEn|moV7UD;q>6V8RsoHZ^d~V&f9U`iIa{^JW>9El$zy! zoSShzg!5sXTX8;$lS1-woOC>a^C_H9<6M6TTP3paO(hJw--Ct9h z_sMr}U-O-JAQoftq!kW^yecveUF}wJ3F!R z$#oIEe|X|wPrrE6(XQVQc<;wjE+cVzM8@=Zs}fATz6 zAM>HT@BPQ0iWuJg?k8@1#BS|;Wxq$;JNs^UeQ$Iws@vxAGXf%_4UQ85)E2%G!Q2+U zC4l^02%xs)*9OoNhPZA^{zur@7QO`m-WL900R368r*9keZ5P1K#{&4L2pz7ia(AP% zgtwvp`vCqq7@%Gy0m>bYj@wqbzXYgnW&nJ10Q`jjcK#zkyG(`sZTYi4fPZF&wQc{o z0Q%Pjz$c)++Vb^$3{c-Y1K4>gfF65*_HqWm-w&W?PJsR!6hOWyKs&As&@Lka;Ku^s zGXwaiB7lEh4bWbr0?5w{aKD%sK+hEc?Cc%DKXn1{fdTZ`P;Oh}-g^P$&j)C)n*+4V z;sEya2;gT=0KfGNa6dg70KXXb&9?4q^8%E6LjeCz2@ucW0pw!?;3op;IUitLtq$O~ zz5)9C!T|C#cX#15A4viHyeEJ^lLOelEI_+I3qQ9NSDgctdwqbo`Yb@b5T0$;YeWEh zh6Rv68KB(U0Ql$t@iRPt-)?5}w`gVi8@vS|#*R0jKU|4cHk3A|R+cbTcaX+lp!5f^+=6mT!>rE*&eI6hYB zxl-sUFzJ~n^dty9x;=YX9HJd*(Tk&s{bKQql=N4LdR;B>aN(b(wH(M0_<7dvIw}dY z*u`;xCrUrj?#-gz**Y1#!J=K9E4bi(A^*LoS8O2%1`7OD_$^%Nsx+J0Jy_V|G}&{B zDAy_4S1-2#`lwzmQLhd{|3IN9_C^lq^?Fw5X{qJ-B-lp>g%jy<&SWGl{MivC+BZws zPxDba5=4EQMSXSu#0kHpE#q?f8h;x|(jP1A9L?FvO4vjFalgqAPr$BlB~oeL!3Ety z{(2D)rKWgzUf}CZcrW3HQj~J!k$=RPk({`BI10zi1UpC_X_#6Dh})v z_-8_Y>`ff_8tqC)rD(4f(O$_S9xf7g&NJEhu+YERG;VAae%NO6gOZuKXmLq#W_d++ zSw&{1l9`e*Ju^42EN@X^c|~4X#`L73lH$CK?1e>noYyudGiOudJ-3%n!|5mX}jmVai%gDhtaC@^bxTIj9tul$0uY z#fu7y^D^_x^752fvr;n`oip@vtoH^o>I0DS@WQPs9aX% zb;^VShQEX~U+W3?83jLRg1IifJXFee+W!z#zzh_YdA zW^vw9<`h({ zKSx0;%u-k&YFJoI znT36@G;>LIQDvSoIb|jk7NUMk4}z{JPxz1g$wG>iL=+2MUrni8iuCNoB13t3QBK7& z=GQ{r8DL&vF}hOmNGdqLvN#8^w1gE}o{6SrS5#{`WcotwF^up~3B ztZ)f@dwJe+pNlF{rUWO?Ny|*TJo!o<(xk;N&?(|dN-N-a!^wo@6qXjCd5h4`$*`RC z?Bd*##lAvFq&%;j8Z5IgH#4UMby&tE(FCjnbaaXoYN(W!RQC+{tRDcRi{*LXTl|ot=}DR|-k$<9cZ{h+w2C#89bB$w-}rNUkU-$@S%t znut^&e2S^xavi*z@v3A}m5NJzVZ$^SU5>m$lnAb}ymGV%j~xM#gH64%a^dpK^5Rkq zMiu$Ye{!eIET(am7cLw@osE_2yI7iydcl`@CHcbTLX?jaWEH;>FuF!rHii~*F;hYp z2*rv_9?&V|uElU#CI$#)W?J$LQo)>f0gzL+ytJZ(N=E?F&24c>ZY4&f%3|D?3C@|x z20=+82eDCZ2#{nx#YRaE8*n5^e~=4`rh{gE*rsMG%#pI8{V+_-EX^w>yWx3#AkUjs zfpH_dEH_yni*=)UJQ%eo$ADXuSApR~lve<+V*tv<{6Z(cCs0wupJd(mPFaae~t7Qd}1WvoCxB^W82B(2jPM(#KIXgWi zGc|d}Wf|^F^kv4Hnx1&s^yC>CW?avbmIz@}9ww_;R}@3qXc~sM z(VV=}{>|?vYeWkdy}&;bEcr$$DqKi$IegTJkt51WMj#;wgA1eRnvW|!axq1Eqko)9L}n&Gpf> zouNciJ}$>8F3(YZ{r~PStqWDWd7!rE?;vD>uIO5b6`oybC$P?ih1hBcQMw4a6QgZP zA3@)7+g(^$1}j4aUD=KD2PvaL(?K=Tu*P)a+C}HkQpj7C$rAsF;Dasr79U@Kp9RZN zc5D~x_+?_hK*vi3US+~x6dMx_CcIhfPw4v&x}F0;8XJ;Dbzflfd03{J6jiOn8gH*PHM^1-{LM2MIg(oA6NGeiQB#xP7<3{gDD6WWu`% z+-<`93B16B#|wPD2~QIEHWQvI@ckw{OW>LbzfR!xJ^uDD6Zjw#zDD3~6Fybo1t$D< zfv-2=Hi2(5;r9xBzX^X>;F<~lx4`YD{jb*qKFEac7r5Jm9~5|j2|pt6^(Ooqft#Oa z47!K=ahplLO5o<_B8LTT-p3q7FJ<8{Kc6TS__FO~4E624x-ACT|{312PYn68@ls@0ajp65b@?;?~8unuHfg@+}fxD&c1(yiCFyU*SXu5>>+Y zOSnbCnurXRi|TEfK?h4EYxu0MMr#vlpr=+mMou@X*mAN?3B;rcTN;w4D9{9N5F;hl6P zNYf;o-VfD}c@iF}gGjR^JW9d~B)p4+mr8iFgfEluZW3N4;oT*Cy@dCW@CFI*DdC$W zytjmJmT;GZZb#|50!A`HBM0c50h}agzL|QiS3l|5t4kggkL1#E(xdAnSKnCaQ)dD z@nR)>q%Mqftc2^&qKTa#;TKEtZV8W<@H7b@E#dPde2j!=N%&X^FOcwY5?(6dmq_?B z3BOdrt0a89gs+$I2@>8Q;S(i%lY~!_@XZpQAmQ62JW;~8OZa37-yz{i65c4`QzU%9 zgeOaQlY~!|@WT>*nS?h>xLd+C2~Uym773pw;b$fMatT*e|z9>5B%+czdi7` z2mbcJ|C=88$D_41wDIV@(V%I=(OYKFw9)8YXwbCb z?@c#o+HmwvHt6m|k2L5WME5o5opEtswX`|0;F=*Q0^Pc|0SAW{r^PVth+R*bJGHBY!^X@ii+Q9QZXVA29 z=iOq^v|;DnXwbA#=e^OOX@kyNX3(@T=Ur&fv?1qBH)z_3^G-JCONkz7(6sU9?Q75z zh>kGmi9}lrdJ@s6&-v<~K=cWNrVTakA%mukH1BSMP9pj_gQkr$?-qlm4KwdXgQkr# z?~Mk18PR11?IwDmLDPnqH{GCVBg{M5plJilJJO(O{qMpSk4)ccqSu+|)h2q0 ziN+g_e){rF^a2w-$3)LC(Nj(IL=!#QM2|4h159);6CGuuJDO;li9V05GTC3hn&?v| z`Wq8{)I@)5qTe;qdrkCC6a9jTe%eHDHPH{4=(|kxttNV%iC%4@mzd~c6P<6O7ntZd zCVGa6o@$~en&{CcdW4A{V4{1O=qMB2(L~!!^!YMV`)E<4agDWy9CtMC;p^GiFeh*ko{M8r z>ZZgv-Rj{K52e*_L|>hFP2&8-1&NvSQGVR#$#K7)d>c;VHct1PPpq2ga@2f@MQf_( zCvZ~-pF8=u%y+zC8z1AS>4RnK_)JGlS4xrNS>zahkz>Oj&DzuGT9t)Qj+$4MUfKcy7;<3#?8jr=`?Ce`RPyFDSxby{{g@J3;px=5%zZ#{<~h}e=pqU|MPzN`~G$QIFbJ?Y?tWq=a>Hk zR+v)#&G!F@Z5^_|z{u}!{}%uJiBxa+Zyco*|04e>BY!Wy@)t_^SEBy}VMy4pkfN`T zqoxz6@s~JiAA|Q&JuRt&wUnV#VqDZ~2c=Z+Ra3|PD1L*svJeVB>o` zZtaTgvHG;;s^5D#Zt8$*cYTM`SkXIPIONXhe4AT6FtPQ7Y5cgzQS+-`=r5A>S50&~ zYWn%P<}!)T>|nKonu}4OW5dVTu^T_cQM1mDbf}|t0n5ys1ph?){1bvgSyGjt_OLi$d@j<-80z(|9lBPFZESjgr2J6;X~2>7pmk zrBEF2sNDvS7;1AM?(;X3r~e#Kzu-QN^2&e1?_tK>6D}l_3>J47+1} z7IfGBz@D@8fTZEyRL_qz!ABKfzt`gHpK>uq8`TyICY@_G!Uv8tEpRY&(k z`=9p37t4Za8qGkM00ZFNU?WF*q@p}L<=Q1^N|Jq7EB|a@3y<;xm?*+p6 zLy6zz0=_SQf8w9{QH=k-AhPND2NVC33;5sY{DH)O@dCb0FMk;E@4kSauk(ixf9VDM ztw5Ol!-+rl0zT^?RR2E2A9DfUXMYUwyIjEc+25D=XIjklU#HivAMroAfImQQ9~bdo zynz3W-ni`H>c<{tF1>(n!{E*MJxTxE3-|+cK6_X?M(1NZxFF6h)lI=b zuXx)-)EEzZ?Y$K<1Xf;m68iQB;g9hNt7FDr<+ybxs#~pPkH^&Gd8)a-()Yf`B-stO zy<^?oe!PbmuL=s4>Gexh>a;xak3;MgjPgq2PTYhQ?=lGTeHdDy45q5JF&^*1=*>)I z&!eYM9^-yATK5O0Sc-QbD;fP|{5Z$09Z(w8Asr*KsKf8ny1qL6c1kFYqP!<-R1H-=0nW4JJG3imf|3FqBtD_!Qn13nWH8SgA zJr{21iZ@qg9oDOk8KL4$0gE~4CpL_0)9Z^>cm1r^#GNC+c2_s5sh*Rmo>Mf`*vVt9 zcf?dtMkg{-)gFbqYHh*z9*%YQk!GJKe)tb})xUw(r){bFy@%tbvlx2yX=e+f7IUuJ zJHf}4bC~xQT+k}AJ;tzV4XendT@7syL0el5c@;$o^<6Aa74Hg2`Q}&b=0bz4YdRvp z^X+svxh?}s+WORB1^3#N!Hwi^x6hv=$bQm=wX5R2i0nrQy#OzJ_uxM0lgrorj){-r z4S}3~A7ehmt=zbWEjziHnE=~a;mL80Xl&dgAj*ete$#h*E7^TTkCA7;_p7hB0$t5# zz`sE-L$SzFyz3x}$#vIituHpdZt6g{Y+oxBf?3n(Sbqi^00ugXvLKwtVWLp2B~n)$ zL30LQwvj?$tRXPmPas?fj4=d;`3ba~7LV%tJiy{X430y7&u1Aj(0{JxO^4Ty%2$UKEd42++LSO^NJfWe6 zhCiPM?K|#=TMdC~KY@KhpxzLm)tsSWs}Q)w5LoLcP%8xL41p>?fm|VQz^KLReziyv z0&f`tJN*RuLLhLEXL(bo?;@bK84B+AQ*hkN1wJtZ4*Cf+l0X8MQfxrdyTRi?DSX@e zh3_3CJ8bpf@gp3!PQ&e(^4-SbjBP0-0W#dTh=d0^ZhZ@VrCJ+8d&7PG1g4SzY=6Ws z?H*k6b2C^hLlo8X2&9p(uQbAM-6@8lCrQKc74a zCe=RK550@B^mS~w#!pd|K)d*%*8*iD1-AAS?=_&}J{LF2nUvuw$A(Gh5#Hmt$G{Acx91$aH>bVwZELG%_YRCxt+j_Loo>%DZ9iQ%I__+AywK>b zn}7DLJ;r>1^6$V{uI%CWW2P_eS9;=*!F1NGacWDOTU+VzOK*4G*c8tjFULXNT_5kn zR8xEVIJxm#?aMDAQ@6sYO#^_7Xl>UqTzHP*al(A>o8bE1U+_K(j`X~QJ>OtYHfFI( zICI@~LH%i->-Hocj>EH*I5I=y|iYarJAj(}1kq4vSJed!er>*;8y!@z}Jc6Rawpz1mbT zvFIZ|?9;A;f%!=CHeKV|8<9G<^-Z zM6`chd=2uU(X=NiYuz%ZR*j4KK5^guR*x4lx%zvjyDokja>@?Zn8TY%xwb%PL#?zE z)W8UWJop4&Z6*UpFhh?eg53|5PpaldMRe8EfYg3xp4l-k{%Rn6KWQsLQiaz}o{D-^pY zpV5NgWBq;5*{D?o-eKZFtlh&3T!s?%XkU;c(WYNBY=x65_88N)PkSHf)o8WXX^QIh z>`lBTu5rHiB&sMqqci+RPvNwuguZ`L(8D>yQOL_Q%VEnDloa=t=4JYiqLW;WXLI*X z$1E5<;`t-UQ5T$%!JN~CRTXL&*Qi|zX{kJS{bkYaGa-r#|HV(JyAA|O38T)++kZA5 zfIdi>Jzul-^dz6v&XUjSlBu8j#n&LWr&5D&=Alfj`Y43zS83#xF?3xA-WeMeR5!<2 zF~(iD1ZDkNG0|OjskV-)KqH5Hle<0*bI&P?>aPA>eHk@X+>WWceevk7-Wz@Lpb_9O zPhsX&9`?-sN}JD2t2|sc`>T^%jrO9^2Hlnh9PKld#XFu0E=u(rcY8iV`0T~HIK_kU zE4a@r-B%9SE%~Z#eK-5`HGMAWtH$8P^}V02>w6v61=2THfA;$GPTJ^UW8>QIH&OjP ztJb5M2{2IZNBhy3)PLgMq6Nga2q-NRrtGBA2jX2I?)KD{w&LOP7=N*`Bu3k45L3BW z7Ku6i#llI9HXR_QVO0-p^GJ;1O)B&|IB6&CF+uE2CYIcwz3DHrmt?3XL8hKL`b}+% zzsSQR!g@yigxk5AP1Ca25(pmsY75@>fse8KuVYB2*4+v}uk{zZ5n{OAAyjvyFrfkx>VcSZSFhR>gns6zrT>LL zrTWhxN9`@}wtHXgGRQzPU8d=m)vFpHK+pS9s#|fD!ZMu?swmJFkTy8%8uM4 zPpNbKpsfI7Crw09+Xqlv?H?#h^6I@%k7C``XJJ|t4eiydHskVnEbm{o!Up%5TB`Xu zoQ@jWUyplh=L*t?naEMt5cih5`ZWssAV*Cxss{XJimRQpaiqOUR@S{n@$P1|f18S^ zdyOKS12+RO#+RLnGMTB)A@^6W+7^Tc=mNVd24ZyErd@+-VJzI{t}n$n%Kk62iVp5N z5VgNLYG&~AwK-I3^{VZt2W?Z}wpGOoBl}r@hc`aP&Jd;|jfrGu4SBhKdgIFwK>3(Q z1bb&t&av8ZY9yn$%4=SBF_~l958$Bss4(T)xdcDj+swdK>$MYYaCto|BXL2o!}Hlb|o(vOiNhnD(UBh;mOz9G?gvX})@&5M6xs+$L! znVy7S_o2LE%BfOLc)C7v9~Lr{>zR)rIv=(e@qqel*A}t*CvR`NK3;MGa`)k$=Pg|m z1vMvc!+t-z?Kx_n{R3sxPe^i+@V^sakG7c%sAJdc?RdK1F#BqMHG))ooC?orp%P{y zgZC=b$FPsfzrf|$sD1;LmuPVU$GRSnur%#h@Uw(IvK zl#8%DrXBo1G}(4^NHkf4_V^iG)K3`2Dz;Z!ahAmay$M5I-T_#96rPc~{5A>?Px21d z=WC{tqWV=kcze_Vu1|}0d+uCDVJ3PQUb#vD#)dacSR6Ia!=}{w;k2uWx?-zJOM+o= zCd&m^{R>5=dY+<@%KJN_$QR%Bt2SwOqn*(YF!yMy6Mv4*MBd&7DHfgoKz>wpllJ?D0ex8*if25mBdgQ{UOh_a~}B=65o>jc;Bk8_XrfTc8oi;^Gd;ei*p?{ z4}xiwwh*PcJ-aC1Auaw8>q<0oPlMwU&+J3yDo5>8NK!p#-Mh3dcursY0La9(SOKn4 z602K_9JTcTv>gfsw+^g_f_WW1V#G^MtgG*^rHV_2-J=NLnXZ)z+zsm zt$-!oRElX<5A8al+xuv^+ld`)bQx+{ZL!hH-rG?WLNZna1vtMjH)7nEy(-|A0AqAH9ULtEAjta5ic3o@IeNAzNbal-Qx1 zJsE6mD^+qljG>@->wPLU{x-^2KjCt!#=2in*R}8#@gL*->p4H1`1#-ys}~bFqtU|z z@|DtVHtkCw+azuL%{S2GH z_LRDdV<=KTVZz6>_h10Vfo6BzY+62cW_tvcp|pHt#%Sju=r@6v_D5*RiWer$roBQz zfi0A64|EBgkiKECxf-q%$QmDOT|%ajXsi$qzw=clQLUr z<2x_f)&3^>{O5bK6JA{VJ$)8bwiLS{+7<6&XNQ)NQ|bn3ok8Fdh7Un;)#rj8HG9#V z)#ud8bodvG#3Faj+0^=fH=*xp`LH$Fga69}x4u-*85&mVBj3l9D5$*znzTEa@xgnO ziGLbRRe}e(d_np+@(MkkPnia65Y$JW!^38%($2kud(-P$3>2i+|Fa2w{AGm=_N-)h zmdx;cqjiE`6FrBqo?|)^*EYA}*#;Ed%N47M951`?(-+!lTEFEstJ8|7W^4a!*yN!0@Tm!)*C3=5Rn_v!`Q9^w;#8tmV7n%VCB#8b0TGeDz`bH7>D&ziSF4cad(a;K}$(YQ!cMk$%hg zSbZ5kmsepGwR6tl+Rs-HK(BFOA>UnPT}LmUt=~T|<|{ng5~!~}YpEPgnV88U6ODi_ zdg<81*Y~T?B$#=!^?kkWm1s1AuHRQ5v=225{RhMD>h>}C`92yg^lH+DEp!-4>AuJp zVRg$e812zMc$>Y#Jdj!A@8T?SG4u)-^LbO<3OmKa4-}u^(G)~Mdt&Pf4crGE*Ur{~ zT6Z`Rx7=;im8T$XuV(i?g-uz1(EfuKKY5#W7yKc$58p3kHS(N`!$cPQuwRnVzs9v{ zpRo&UD!CNxUHux(cL){0;D)|-01niuL8jIX|7tRIiul)=Pxql|Q|e|b+GrFj2FE8L zM;JOk*KTk!-TLn(_SFm^^ucMTSVbYm{*X}>#3Z}VLC97i-{Z$$(`s< z)R0Ate}E}lfom$lvs?QVIZ%&uiY^R-kE1kR_#()Vzz(MJ+n4z!Lwo_Ld4w{teUJKh zlGARNfP4aO1OOXXV3$7bEv_(&@R#2LUKczoksDASp9a)j=hWh;QgxAi!GPcNN?l4^ zj|H0O`H;4fa@R)&(-hEi42!M$c#2Ogm*fBWp5c1t_QV>8MnRU{biWr_z9qa5$8SIY zNaZz0fo0>Yi)eZxvb;<9Db^B^1Mwh6$9EF`F~?_0_%np>K&jq*NXjmGj1k@MHLmEVnx{1ER#_%Oert-pVepJ%x1){KRG zCH8+;B+x|p#Jhvk}ZJs0CUEl~$Sf(AMNUDo`4dtN06Wr_u zPlKy><6iPl+wJ9E`@0g0|Dd<0cFlfY!@Y%})7NmFksG~e0_m-ru#>T3anC#gdFgif z7y4l?^#6ed6oHW~>;KoAO#f>WnEnMm{VV^+`dv)_eTIH74SjmxWpMpHx&HHvMfUgj zAM3~C2G~E|(0`At|K~TD{r$QA2YmWp^$*wvJWB}PHXepyzJ%9M&r8fFRu)b}=qEIic@FbP*6yJhj2_Rtz3bwiq%u*!5o$-|b5Onqk&oT) z=I_yRkjwY{uP%P2kbhFhx5EnDIiGFRV}GB?Rw4d;&x=xp{7NB@>1jd&)VBAZPD$~> zpHFqB%3LNg^`Yq<>{?2XhA>ahq?8^L_?|myuhNXj7=HBiO8mh~dHw#Nc1HaoNKbF% zH=bE(RmiLR<31sOP?moWqn0F}=98ztmrC(`!nf?HuVXsD3Jq4dpLz}k0LM+)_??d1 z>)NwQf(m*xXm@>2DksJBPHO%0RpK6BSy9qq0@7gX8b`vm0BE?N?Nbh%?^Mt|%wq{hH4%CA$>R98j26wkrwwO>^p zO^(BGl?VOh?KYFcn6dF0a5KwtU&6k^QtrbmB!+{DH@rpcuu4 zKjBMr=j?ZndwBeOLeFVo0?j*k{NqK6wmrPXP?9~5M&+9vp!B)>n8lfMl5o0 zIB?#d*e#9jZ|orzrn!yi34DGXjj)ziJoHp*9(CXP35)RtmG&gHQhj_ruG!P@;2ab~ zKE{Nr5k6+GSwWcoREVbC!x~xMJhH+Qya0*zDV(4`t{F=@?ObLYml;Vi|0Wqbxf<&Q zlKJX&rl$j!v60MeBm<9-Ofbnbav2&wQPyWP@+>A9dM6Gtr|^hOyN}EKo69^+GAWXt z&q!t&m+^3!8%d@=WY8R^Mw6!aU62xWKFDpa=d$Za_BXfzLeF9MkOJo_CK1^QGfcLZ z4^}j+)=rbk`p8Qqd^wf=8ONWO@I{30=J+`=y|l7Q#m^$vqnxE+MyeN)MEC}d?~qiD zBz!5yTQC8Jg>2FrLwF{~?U2{;2;dmz-a*B+1h7-5&+$r^Q)tAmu zg|N9b4Pi=S1`SJ3L(Rz-Y2J$7Vm#@n>`E&(L@F9V8lyI!#)N(-ybnz@PSDI2-BkQf zPyqiv{`SD%9{Ae>e|zBnGaj(vVOjz<6Lw%;;=!fn@@}7qsX@sT{pL7p~oC*8wQ+9&t_d|JF(6=;h_0Jj|Wg zp{M#cUPthch3j9mP8Z+pOv^}D`j=ngVxOON6&AbbW5BL~{mTbl;_8nN7w6%V!Tc9r z$i&CJGt23F>J0XMzW6$P3K}Q>EOAL0eVcjlVtj;E$;npO$8byWQE4WCRD2{CpODQ{ z@G(gJtIsGFpQM%$@#SQEh_|Asd`TQWuFfwqPZI zg%f=V7~gZ%D}534CW$YF3qM>07pKffR))Ehw93WV()VQ*{qv~PlQY~ir}#*G0aejI zkgLd_R#j#tr=#MTY3VaFW+u%{_2r zefc&qDJeNEL*Yqgk~=YdR_R#tIVpo0jv)HbuP?t2@UQ#&_!(EGC4-oGc}lV}B{3seNuHMm6>!AN>56;i ztPCY(YUcFBj3hU^fGtx~lBZ;x>>1PjMK4cIPRmS8O_`I- zzau*{eQsjG=Aw79&a(Z&Ql98U6lFHK=vj7=& znw@r8IzGRv%tixc!YMN{lsPGh3O?b>)x%I+flg0OOwCM5Q&8p%a;72;hD!@83S8`4 z?|B%Sj4_dquLvwQV*JG?)tR8)r)ba+pIvvcF;EN=zK$xoHw^@?{1SW!8^2{P`c$xM zX+d7GtGuA3vM9HBV1;X8-UvlW=O3uf%XQ(~*ku*2!g5!3KG{j%e0D9Y%+JSlUU4o& z*^yGbB)h0E*F{Te(!4mkVi?tqzJl$_&n_$~AK^+Y%X2L+sdQD8Ehn_1#8rY1Y`ZW9 zptdgY$#e{C#L0FQmlO{toO;nDh3U;J%A>DSyZ9H0$)=)`;zcl|q5w)N3i4co;xL-H zhPVcejdcxmjT$+4u#3Kay%hB*!l%pO@j*+o%Q4Q;U;WbIr&sQLf2BPx_P?q1*QbGs`9UC`p24_B`h5NK27kjI;`=8)*aPz{`+sMtTdX-Kn> z{(;nqXJLb|50-^A4e4g2rAV8QHXz-OC&oLFI`Q282+}H~L9o9OX$(?&Kgo@BJJJHG z7ha{HCx4qi=Z{V3?+K28ZbTXs4EZlm9@6bcv73do>KN=rn%3Ofx(%u8IMxnGH-FjM zdKPID(r6pX|EjfhEYdWj^N^MzEkfFe^bVv|U!y#v%}9?RP51_D1-xdx8EFhsak$4tfSp zhk8T0qAqi)-P?!Q8_-rUz9INTvd({aNf)O4xc_UknWUxa=5)-}`XJ0(0V}1tqzobDbrr zgKhE#>$F>g>Vt2wO{osCW-h()um}6thk{vGmHshqV2lg)w9f{S}BIF~8 z@&%#3gCIli?9<`GNxO?Nz^*2Mm7UzdmUN4?I>?ejSt;Lm$Yeo={!*KcK{(TZT?6cC z0(6@%yVY7BbW3oxZMAML^Y2Q?Hba*D=aZd$t2MbkD21f2LqXIAk3i0jbrN>k4Y}lM z>q5bQ1N=eY5A^Y;b+FCk6{L3j3jDF)AMx?w$IDnZwGF}BgApoD^=Lq#SkoVI)n{-3iBEsy(iDJC{q0HcTfoQD zE_TG=w-Ffon?FMIHb$8Xc!g(?aW1el$i-mX-szKbv$ma%w!I%hB-0*ab|Yjmd@^WT z=qe^%2yBvxh0GuSMJ59>V{vczD?N1IsQ3#R8uIRg%y!81BYP6556!3lFOS)=1H3oD z8$&#)-UVbUf{^@q1TxK#8SaxoJhMnhWc}+8@LRxVb2+91{F%JnDSrNsH1 zU-kd6{^Pp-DsDydn!mE_c^M+X1dr4DoId(yPUFuF z*ipKJr`-k3CiS?cSCr{kCirx(p+o2Ya=x{M=oT9Dao|?Sj?ze;;ugXVnqSZn#uFt? z7$(eC=srycO}*&Y_6kphS|v?nr1cOTxYe)&FATFIb|_DEd_TL{8+H~5hQ7wo%j+fb z>-E8_AFMvQ-_HwrkkHpEXx+{hK{xi{its83%a0dp{#TCmFSV^UHi6>_B25!%mPkuQ zS|!p3k!}|0c9AxUv`M7RB5e_=lBlr5DN>h6V?~-E(ln7~iL_LtRU&N=>1L5`7iptN zn?%|y(iV~8ua0^7B6W#0R-_3cO%rLBNJ~XpCDI0wZWifwkv597NuBazjhmgDNzwjRlzz-JrpAEp*?`ySpw{4%!e=$IQ{l4^O06wjo>1YbT*Xw^= z@KrAE^N)TXZVABG{rhJC{korn0@P2>9~ywK=Xd@Weq;c?et+y1fUoZ*^b5e({U0BI zuj@|=z^DJ)hmO<$e7*g$0`PVJUl)L{`)^qQzFz*C0DL_@rv~8b^OD;G@GZQ0iY)+N z&wp;{{r6e`zE#+_KLB6v-v)08e-OuyNo~*tlBrB`v+S>TqK~{{=ul=E@;!R zKKKb5+_@BT-GhP)@j*H#T?gBPpGMMdJ_H(2gud+B8T23)QvKLqg^aR88MGp))AR3 zBnJb01gAxvZ7GM1^8`*ID=?+QPzV&*DF~dx9`@*s6|ff7VFeTnrUISQA`8Pn0Ql-#A+4f`YD|~4Vm7PbXJsI ztXLk{FW4O`%HowM%d`xx4CH7f$x?8Yj~t_1WQi6eR9_5xKG9XrhUz9i)ngUQlMP1Z zamoR8zmYj!QO7+dNb651LLJwT#Y?ibL(Hn<6Y>Okj*)3s3o;A-Q^ySv1zXD*xk$Go z3wFG3*kOGR9PdoBuY>dfw*61-vahW23zfgunASwFLnMZSpKoZ?+3n9RU58U*r9sB|3u=`bNjBUny^st z?*#v_#2*g6OI5e)`5yxRQ;EMAt{AMUSBw1Ck&stMMeF2?P^%^{)5%>#j%vvkg*^pj zpGnHbAak;+p3f5em%#sA;*SSETUB=nbt*;s5>-{_3i&r7e?*d}pes<-uA;o?b)aW< z`4w8euv!zz(xI^;Z!}eKsQNxM9F;UI0D8Zw_Me3mhjl7tijCLFSAnS`p4IL70=bV# zxpTmN5%!Amt(UXh2leWEA>M3=Tl>J5>bT>20An%&@-00?^BCD)4^ethtd6@}57E03 z7sm}<>M63!qMj8&X&pei2U@cL<4_-l_z6SYI+U?zi(aZe1NN5^JC?Eg3Cq-1!2U{N z$1`@h&fW+1*9Kb+hN<%`>g{?>E+O%h=LD&K0P$}m@v9+TY*Agh_#_gaI8+xu2Jvqt z@spr6iB5s|9TwH8cgHi}dnNu1@V8pj7HV2@g%xAscM|_a@ON0$CY`?({F4&@Rqzj3 z)a^R|Iq<)i_`ASAVo@7(KK*}?|B?86!9NB2bp8SGPf7f@!B?zmn$G_i{2wHK6ZjEU zwN&Sy0KY}ze*}JvRgKm8r@;SF;(rGIXy~8Ms;{WOgMV7$9|PZQRa^APvLR@HlK5YN zf0b2j(DO%t|Fgs|fZigj>eTs9ga3=fUkv_g*st?n2LD%yUj}}IRc+Gwd%-^=@oB=b z1@+VUhrmB8@mGTXFRQv;=N|?CH;KO%{Jp53&i@Yl-wl4>-MFE**GClJ70qerPzMKn z)(%7F+mIU5M^WN&D*Y%=jL2hQ6AZ{%FwtOgNsyUDa*@}H`!mftx`9nI4A^VaZ(1WH zOdkg(OIVrc1alU5OB(RqyY^uQCl`wq*a6-bi zWucZhRQQ9JYf&>St8smW8mri*XLB}vY06-)B6irrYQ`$1$HVFseHEL2`8m$Fm3zC><6c)aS5?qQ2sa;}V!CQWLUy<(z(eUP-g8 zxonm-2W^*5?brWm#J(EdK^>5Tq<=Nbyc>fiE$c>N*qY6jb@eLlx!{=>knOu+%FUN` z(KMs(#MgFn?0Cl)h0~<99be*g;!C_}8jm~ibzUdF&g*1h>%8zjh@kd^JFkVnT)xhW zrt408ofln?>+tu{GVOXx*t7Tvr*&Y5Zk;M|9en^l zFqYPVP)h5-PJA8MiLV30RMax%4DflK_>wUE1C-aXduLifcH+y!PJDS7PRm0FUmiyH zL%u8NCn05u;wYfv!zUr9^Kke~pkW#Ki6?#zP77Tq7qKPfCAbQiqdp5Hf~_bc>VO1A zuoY#*5M0MZuoY#*URXPwdFYYE?_+TgN??f_g7N1@3T5sC?V zLPQX*vm)Nb6uzqKypCi}*Do+^AUSMj$r*&3V(Iz;@q)VIKc+^BT~9+^adu@7)m&XW z!Wbo?YY$4QB8O0-s7mBmc41K>r?QJ6B{G9u*p_Sl^7w`*9^SLgUa<$zWtai8@tkEaPk7^VJ>FBFaL}#@N^Z%G= z>rbKd_SaZiDp`MzAPFV5w4w|{M5lk^+8&!-xlD;v9aMxsZRsT@^X9 z%a$vB)QA@-hcZ9f`k&xERBlg%S(Mt2*+4J14O81uY09+8Fk+DPTRY7q794?;^}9|K zXLcnvyIdKrhENesC5!@NApKx5EP77(E<{sAk+U7fmM|xNGP~o)k_fd*VkcBI;#I0! z82$94y^Ky9qCN)C*)JbAo=y#nK&ODhPPcK+MavL9%$J>4s;iJC;uzXf?YfEv6*b}q z*yoDq3%@2P;ZK9;{7THNkcuYJtgUdnyYo)_7a)4}fTGTChEqRRdS28C#BU+Qun%s6 zu4uJ8%}8Sh*P;!3sqM(-v4g2Y3{_c&NKnQM>byUg)(AZZBW^o?5KR?VdUik|osTfW z-m@>6@J$3w-km+aCC-nG6W#M15oa7UZFed0Zsa5(3k@1d7-=0yMUo9-6!O5f?Dvps zkiBz;YQGDdh149K=c=MT1`k0k7I4FzgD-+ni@2@PtQObuTDX+NC*k_YtH|q#-_m6< zU3LXkjTKptTPMN7h&3Oj}MZbohKCvh~{3OC5>bf2@bLjITTpxZA8lvux{+YzS zB=l#vFWf`uKl_GZaEtzp&`#(;;oo2Yh zXFFN1^n3>@)JR6y$KsEl6gA3jg_Lt_PQ@}s?b4pIL@QyJLpnSb>eXm#H$Y>YYPZmO zT#ThnEwy_D)kx{t4v5+#g#2Mw!q38kYENq+z|=^1qjw0kd#JVf4e)WK_JTt$iK0LQ zxPyan*P}T%^yFZb07K~Y*s!H4Q}8qNS>A-Sg$+p|S!nvs%Q-I+LCEe?tkYX4oRuLF zh}!5+L%Q_^Gwe6iq}!7yqw7MZZ6f6$MU$0~0vH+nMo4E;KAZ4J6s3fObO8LSjlo4e zxLY=qgrzbiHxf#@lx|&d*=uib0B?R80*#B2Z`?X{)f`h4K zqZt>-`4a-Yj#zCW^dH(2M-HVThA zjAjVkuiC1KIf63&lYZRzQ9_0wT6+JfvIzJG39u;bb^v)?=U9baA=HEA(Eh~DIuRA%AyPH9Y~9pVD9M?RR2BP#$fbI2Jw;?y+x=Ss0 z(L(6^#nDN&a2gosE9w^N zRmzZX%44&$J{Gly+B@EEyGK``L>;28RbsQfphMgcHVTF8r?80)u~AsOLjt5+iHgFd zb)#x)Cg@Ed=vXMmmKQWm#a6D43J1>wtKY?}LCF})=PW}Ds%M{SBkv6)l=Zo8R}ng! zp%Z*)$Zq(w&)uqn+A)J*R%XakWco5Y3!qAZ$xQANiU}oTI0Rx&TSADsjRZ7bAP@PD zTv5$4hlIl9{+lfwN$}q!NF^yD`!Rs^{?4MV1@S(?&r<$J@uP&yLzb8`mJsS_nyy>v zwgE*B_>fihJfW;wA-_RU^e`S2y%C1YkCrD%8%>>+sC%I;IyA&K-p8aeMa$lWYDJgx zjxx_DzVdeXo} z!M2MCdWC5j52(vB-aDoe%;WKSs!#*fZP!_}5kk`TKauat$x=)I? zd@_wckMNc+CmuPIHINuUULbGx39;4rn9K!Hy+B91LTnHFa4Jy=Sx-IUF|LpbHWVr$ zmFSn&sr**{G4bd}3A-4v6tWNg>-?n3df6G`QOxr@e79@hmBF{M?$87Fauy8|yqnTe zLJ0{&rY;@}^Z8_wVng9tu-FK~eID{6NiDV5hoC#*A zb+@ojv33)t(_HRdA+(YU9q1Paf(%MFq+J+_s@33XZhViFHM1;^0zR= zXW;`vh-S}ka3QpdZL5H3s%_mNDf-o4Q5T=0gOZS|v!6fMb`|VbvFkZSv3?;*PV<+X zB-D{4qT`e#S>Z1^(@(OuZ8i7LqyAFahE%9k-+olpbW+}1WTDnS=$~zoUaQ_ygixyx z5HVCL>)pOoZkyiMh%6%`xf4W|rE-?EWk!}*rT0>iCC@+0YQHSk8Cl|#-Wx=gP5xP~ zze|@w&?MZT6I9{ekBcmC`)8?@OL49+vY?dRBFlOIEOm00W+@9w`AlSq!(c^yLR9~D zIZI1{Q3|r07Flxrv)m_Vi7oWY61Ikucl&4AB4^3+%Th2*WMN(O30W{fbVVK*O5fAC zX?)2BZ#`r%(P4*r-)R(BcnLyA{n8Ra11Vn8xYkDW7Z#OhUD<43mM6Mk*rqIB@L~IR zjG({bY(ENftD~0o#CP@ujng_;*z!4UfjMBnh1Q2LVA9B?FV7WQj*y}Svh6xSP+zqz z6$CA*ZEGaXC3gy9AUHGxkHj5yJ_hZ+&*0~2R$bj=M|`%A=_+i0+R~G1*AF)KCR@q& zXSnT`f{rI_9sIW45=!%&xuEgnLTOLC5zkse)2+zxn^~AAlEz~q-eEleNGTG(SM9*;Q@(q73*t) zOOwA{KCWVYSKzc#J;v}1`%1;`im|%}DAsQTmnI9ru$eVY<3{c>3|!W*4=jqcv+y>} zA9`>p8dnDkm{i-w3*y-fWDcX9oW9*LGuX=7LJ#j_qVTX8g9NYVCz(svqeZ+Ef6^$t4LSNNQ6A`tH4fuNy~uk^z2 z=7paJ{X5S7CD$pNc$+)=;Ry;(Yp7(;rO?%OT!#y(jc5^DH$l)QhSGNhj9bHu(+8Xb zKI0zfE{t1a=|P_9juN}zWS*(w#*G3!oG^;WwcNTZK&KE!&+Klrgt?)y40JJ07NxZo zJL$IG)|hFH7E=oH=%0aVU>z=`XbRj5SrHxTCG2)4ZabwyfOcCZZ~+TV2@p4mQ?b?x zHf_;li2P#}>zx7~Qu?;Q z*M-cn`ryCc=h*$dgkuZ&&~+yqa~sYn<#+^9Xc<7xeggEPIGMAr<<8y%`W3>++1GJr ze*?N1XXyKwHzus$WvF<}04J4OCMNa7B=a~}^e5+kKyJnllAM*v1+@a|489YmBl!wL zkIknM8=35|9#liM9?-cEVgn!_gEMG0h*7wR!`Y=oQeeM8LC_#e`=DDOG7+-lDf1c- zm*XM@Ct9~X$SP3}UM39d0I*9BiDS7y#(GHY6*LSYbD$>!r+plVEL<#Lis7QIsArl` zZBfQ@7Y#g0E_wm1>mgT&vmJ5ldw|>n>NcFAow&AcjXE3Be(uhCqOX z5Lzf9ln{FP{{J&Gckjy5^ZVZWzSVE8rkr!;%$YOiOxwGN^h7}UC{q`QT^nlY)NrU{ z4HOr%|DmBGdn+B^>X{gnY6Ha0O#d2_$j8X>{$vsyUKp{w`RELc!s0BFfng_7DT~t+ zfa22^XI2q+Dh{v_*(nvS@$#alC z8$oR}^EWoVX+RfE_qQ1+Hc{;{32vueD<~C#b%{9s4W^ilRzEQb?r1(}V9{{(OOsDw z{3(?G2a``*^QC6T*qT=B9DUCSG7~U4@qjn<2oDuvk*-h8S&rWj7H;A24ljH zd);MlB6D~WGBVPWEA$&6jmr@Fy^#we9x0-fo$14Xx{Ng)&AOkoK0W zrO@Khk(`Ht^AX_RM;LH4x#=kNZB2$Gr!5nYQi*WoKB5K@i2s}%h0Ov zI&T%yixB()TgWqX2-T<&CP9(*E|wm{eHNopYJw@{&hnU`)KRNV{x0M%(fOhI#zs@h zeeAOh);7|F!%*-WnCD-mS#aG-xjl2H!4QqO!X&s)ahITDCi#UK&_Kua5J%k|s)LJs z3^L@0>-fQCwvOc-9sd0WgIgKuFDAi_`aH;;4Q8|H(=ZoujN-5bi=?1?`d}VqaJgS!V{ox5^hSqh9?I>R0liA7D7GAL#p5QRYvqeL1HS;hJ~FtMZqO~e zPXB}YodOk+!QCg)mmcnX^z&{6@p^qCM>208($^r!fbXjZ{7;d-gLx-nI?*o@yBHLo zMEX$#@p@ZKRq%Q!atB5xPKGTMulEsP-bWCxXW`)W04Ih!b|fMQ;`MB~@7P$>Fi)@d z(jb7+>-7PAFXGYb9f`;g1o3(nEp`Zj!0U|#>}Vp>>rF>wDuQtw51MwEN<&`HmP8yI zvoL|zn-4nk5X9?MAhKKt8?SePAq}qwOo*uH8H$KruNrVCBP3WNUhizA&O{KeXECGB zY?RaM(b0+U_5tQ91o3*7F)K3b^Kf_d z+@-m6Zn<=7xpZcZYA~2I0Pngmak)OSsSM>oB|4J-lo`eZlf4pYWcuJP$*{sX3rr&azVCc(2Z z|8IJT*8c^lt>f<>TBeQ2tILT z?L7#2{Sib;pSrS*iZ&17>HBA{c;;hKJQ-mKozmy79M6{{JsUy2VD^6~xg5|=^{%Wk z|6z*R`Qvr5-4wA$>yH1C0TLm`Op_@@Dn0F+Y@-CC>>Uyp2Y`lfRI$nDJ&Q|I`Tnf1 z5SQGD#r5kVM7ymhZ@xnJyVw1$+;NJyS@F88F>BDkBm!V~)nG=1r+r?Y(OIm`yPxCuxKmwr5wwk(|%u(*S-PA$tH3Dwy?m zBwuCLIpFFok6DqUaW|G(P6o21g-0W6C_?sjNc*kfgqn@yWM*;4`YpM8*MQ_YW=&+) zG(vqF$z2Fzri1IZq(-&(2iwQ4scUlHmfIXpqVxcf_zQOL$iB$f;jlso*>9t^e`NEB zY8R4QnNd?vE}6N;We z$X?B?T=MrWl5a8VD$xCGAhRMPq5a4zSj-**XM;}7LZ^QrUxRawJs*iL64Zb}`_W9B ze_RsA_py4Q;FIH2aa{2sO8+SbPA}o9|UZE+2eeqHJe}dNU>@1h0Tu)K_6f5!YsAN)0WL~ zU}y~4WWKOD7pXa9^Rtd@MlWSOs{1lsC<)_#* z`NC#jL(q4A0Nk(gw*XtDxeN>~K}axP*j$U$8U(MX0a^G2(ku+IITZ!oC@NFp6gQEVx7e;>zmL5S!utXUBGg2=gcy~6C%@CudA&HJf zf%lMs=z`IsK=O6VXw2=FVibvhQBxp{K4l1c4$qoh6#d3B`ggGOIzoaa!szEneTv{c z+aP?VBsx9B=p-`wx`F6|(Q=Ud)+i&Mh@;-bI1n;wsjLr)&I+2XV8g)~;V6+Y-C&HMDj%K-eDMpb97&QgLXiq~Bs|zxU zqF%rkMhAhVVuS=sgwY8|jYshMHFl8b(h#G^lF{J?q6N?_5SkQS^{ybS7Bh9ohs-gwYD5mLqsG8apt0Qi#!+WORvv=z`H3LGpqzMxwc{ zcqMH|kq8(y1;S|35cHfMkx>+#27Hld5-gpJkYI^0+JaOwg15G@1EY;0MrV-GRs+!m zqx|`{u^4sI_1(jR35kGFQy`4)G6X&62{MYJeBcYCTfx$q2nm)5qkEA07J_$vV+TgJ zhZvQ?bftmlg3-T%@@{sM03qk691ljJm5|PUhWV^#6#|}XbwmZHH*z1YR?T$MT*^hva zH)o@+sIzT>oKKfvs@tvs+#ptrD9l+$OlNH zjwjMP0Q)5n9wd@qW5jbxE)rH&yg{WdF(tfOb{-HpkH(&ty20f0CfXfAeriE(&ZF)z zV7%Yuyg0^Qnm z!^!7L10r{1%xYIt^7|UFYf+=JGUx5PGXosQuQWii^Z756cwjNkk~L6V-JcpPaW&l} z9Cgb^%>)VlK1EO+F!`kMsiomurhy^LFpWn-G;%S%Y)8BhqEV{zkmcCpo$}z6p3|h67^MF>=fZ}ImD}$2qE~)q6!tU` zw3S0GZG$5y6Hvjj4lM<=OQ%8 z8V{N8(*W=N@pf@Y2IzVKT#F!GbxX4*6>*NCNC46uG^MNV1k8^S5-gFfdKjr+A$a?n zHCE77?V+wZ24&tO210k$GItEdG#Np)H!sDy-1MaDd_!m6=H}1Cgi)N!)2QHagak{( zxx9|l-w?#PSWM;QfGs+g;l!kK`5Z7GBZzZ3+SFj3%N=M|$hlZDe!z+mY09}I#-K_B zaW1_O>46~5#UjTJK@ObDK)@Cena*VtA|nwfm>XK;zg)PNAsISp&B0INIR9xFj|4G| z05R=#Gq$p^_~kEWGU!btO_66svj%dVquGu3xdU&+yg=l69DrscBv>NyJO!yrgd93+ zi>ZQGp{b9uJ&#l<+s%OANE~`*i{l3|D`k4-4aDJL#BRXvL=XY)MdaHEB0x(Zb_jt$ zfZqY^wM3=>Z$;z>2xdRO(zMprYWMU1Ul6(O9?)$Ht5_MX$~!4n^|;;NL?K(R_`_ zmk1&nixxkGKp>jfSQr@u5ltZ?oUt3xSoDsfDL-BF(V1vO?UovVh+|`xarZJe>mxEw zwHtt{`m;Kb=N5zHI(%b=dx1Nm?{on2=w>8Vt2-0&FQ#m#k?zwwOg+2ET;J+dcd(J}oK`h*J*Aa(3 zmly}`5VXZbqz8iZoFx!Dgh0@9g8@5`$n3c>h>SuoJ-4WZQIzR_#t}GP_2GK%#|AOt zTuCwg*e$A`2{P=t=^%eBLV_jIbIXxhj37N{F@49zOx^6c*(AcAs|I)#f}?(8YGP-d zjAH4qgXl2-ZqtqIQ^wJ%F-R@?nS%$4vP}_izV2QAG6;hWW2wN7@3uuJc zdcm^wLxA6c;HZy7Y<*ACAM5*`#BVQqi zQdt7ALkI*)mB36Zjvz|a3y~fOMyW=&>ekv?tvT@jE2W~Ceq<0M&aWt@p>B_5b5I4v zG!*0qA|zNMVw#TBWCRhD#f%0t?1Y`pdOWF6OsfEY0&yrNi<1$=EW;F2FXB*4HGr>1 z5HYnN(u^QtvIOFX5D3Jy4X|esnPcxFL@q!uV!F$;7AHdTv0}RBaANA+rV(7{af+$0 zJ7#kks-T#z2Kmbo5-brh{TQiR5kyQDQ#m#k)}|9lg<^UX@CS)QFDJm>t(b=V7h+P+G-@Os zG=B#y2Fr!GN*y#0G!shMN3hdk*+-abO1O{kghAhmL4S(LUxO9PmqEVWM~LoyaGQ_m ze01-dumh^z0P~A{eddOEkllo>rnDbQ$C^?s0+d}M@>_xPO+KrB#lUlyp&^Z0>`b%4 z5N+0tCdlRKAS1ZJfG-5ew>_pBIDT>R?l4?5wtM-(zAYyvyJ7bS zafTx~gjw&zku{N7^N^gwtY^T|FUv3;aZW{YHG#z!y%Tc!q1-PSJONV%gt5G+bgSG`DnW7tLN@Q>-zFDFrXV>1VJ>C9 z-+U2gMrpO-5GC@N2oAFO?VO+W;Foh2A-^0!H5j;kXvwD#5nAKUaQq!6doQxpg(lIC zM1Rm>i?M6vU1{=px5@et5rtY{N}fUqe(Ts`sFO@Szr(Xm@+%^HQQbb1FBij>^n#$S z%;Z<8Mw@NU9i|oTbr&pxB&niT%6FJfMH@~+7|&aAR}LQvC%YL*yolAw=FPaPJG8V)#nz ze;Ocut@~R7q+ccY8sWMQHk3jz{oU8f3W|eX2?D`{0Ac!t%Sz-q|MmYcPUV!sA}adYD)S z4*`cLMq~M+3^$n7 zjOobDtC#2+)43Vf3i9!92A_>W#iOqg`EUgBZ+O@aukap}BL0Cc?XlFBelSf+=OrM! z%nG@MHxq?}`3)kZi^=R%8t2TFUgpIlH19rwmU&Dh1JE+BFF~Do{F=01fFnqJRnV3q z-9I4Y_i)9|JL4vSqd`gWQ;KeHWFwM8UnH55iX1fJL-!`cpR#0-mM_Oo<=DU?D#22x zWPA^RzUGo2ZjuV?NDHV_vJHks9d!9ZHGc0$mmYM*)U@^;mW9%%++HjOsku0LskM%}-PJNE`4?Il9U9s1Va7v1+A5?Ad5v!cUr9DpU-5NHc0;qG|CUB_ zH$X%F+wBoR{@X2P+!^;WDv#}xSDYwbXdby4NvV2h3(gl~H|V;jeIGn~O~m1;$H+P) z^4R#Hr#W7GZ#W!h=my8zsAKhxx2ZR03_}|nZ?ldyI^LGvqgdy(Y*?L)PuPs3NQ=$L z_(V%?+HcW}jN4hpt!`a*yWCxLrfmSP85gpQURsx3m?Q0Im}kA<9=~`S+Ow zZ&j=3OhT4Epicj34p@un9A@h|^AyV#U&s}BAo!kO#phH|^K%Uo*cO$KdmY`TET5kO zyN@Br%K05cUPX|Vvqg#o=ukEJaD(A;65z@?3&(kx2(ogvIM|~!RT>o8^4>xmuAF-S zz5qd1&VvvsMv#@WMawvZK(KNi3E1I8=E`{rB9joz%GsiKTshA(+;p-n+rALZV%SK< z`cH)6j&t!abRDjfF>8Um#dJ1Ca4xDj@uLdPMad%lD$~r+TTHX|X^iipg}oRb#>WAK5;3$+ z)=h}Zt4lNcWAO#RN% z%+Nba6XuTryXKBpG%SgLJ#Ycx;MmpNOj8x=2yO;m3I0wN| z^wz$48R^mHWu#YwOzdd$GE!EN>nzLl@iNl&z&JYmGSZ{X%Sdk}hO@kv|E_l->+KIC zj+c=N59Vd0tj(DvFC+E;9=j8%6@2@p|8_q0DdrrlUq;F*avgc`Xik0Z14w243Xcho z><7nQ)c^sd(pq-DzXBjMr zO*U^F{S=AOlf!QuolNb<8%N3L41C2T@1XY#NgV~{%=<$xiox;t#?ib#OCsj+jiY&Q zbbl34xgOs*n)iW}^z!(|(Y#M`_^Z}M&P>`L0x1r2CyP{v%|whmSnDwX@rsP-6lC`w z<(>rL#D3Qc2{-m}39n#_s8Zf3etZmgUASXJ%3C%AWW)BeowCCTB-REi&DV zR{#;on1yFFqX{`NXChxf+P#tOoA@HgbZ=!eQ@@Ke?=4t>{GPezpl10Ql?m4)rsP2> zDmKE&x)GVj#{qhNH2;X)A0l#8b*qyQ!l<=g!+F9R&*50pf% z$6u|uB8g!hf4C-ps3b;v{NL{} z{NY(-W}df<^^EAY1$-{``0F+KBPCJk{gOB(k~r1l@7LsylEiwCKVXwTS`y73f59ey zj3hRD{0W=!bo>~2$-$2P^)lNN3# z7@DKuc38LvnWy0nTDVrUrcA?aws3<1SEk_}v~bbB*dWnx%@%GT>Yc0M?zM2=LQ9U* zaO*AHXQ<;i4fkUUHx_yGG~B5c?jkgJo`(B@g?k6|$~9c2g^Tw=o`$=@z|F}9y&`wP zE3gV;k==zk#B#i0Fdy!sZUm1V)l#*|aTm)#$n`!(b?%ZFySJA!?7P7H5J5)%AgA}o zXxs_?NH4C69waHGzXCV7UfY9aA+BcpTxSpG7seFc1xr#>U zr}Ru<%!P1tS$|t&Gt@v}Ib-^Qbit9W%zd6VE$32r=fVb|d1(O4W@s`wOCg2Al~Vpg zmb1ti(+6_s@$dm=v_OUNGTQ`P#3k}IRmv}wxx%N+<-^J1 z(8w7Me)6Zp<{@JsTPo$k3A3~bf(--ERKcg)*Z4X7@umF9lDjy_9nKf$<(U`foyKem zPSNfB+9EE<6yfb_sbVMys z!s|o=NIOI_()l?Tf&xs!-fx#+Eyi#TK=`B;LU>cn3O!E;%vce=N8?Dcs761d(--_3&F;(m*| z5Xh0oP_hv9%|{r>lEE(^r(66+1APQ)0X4io@N(S>ZvIU}bOdSMV`HgWB1@k2Q-UgaKv~;uLl^yAh4ABL@(e*|KwAHIX1ig#% zx@eopritIIv*YT|rf;0+9#c%ez~7gkhRLfa;_7b!kktaZl>03WJ2i2lwli7G({Rx% zJ4wN&g{gwYpW9+PU2&pTv@Gt8`MzM=i3`qpO}kk<$rjrwj1%1uDn7v$+sTX*-EE55 zyt8z%ZQc|kKPP%+h{m;+hMkT%(VI;%J?w*qhU^W+)zTeWKb*b~7@&Wp1EjrG^1+=( zo8*kV@3RJFC_0~FH#Fx5{fd1hXIC1^KMl&Nbd;rGls)Mv@e4GC|42tUA&m0=IjLI4 zIem)_$}iGUl3|qG-6@pOPT$D}<->H8+Azw?>5MHiC_~^YLd|auql`{Rv6gqapkNz+ zV;K0DBRZuX_=k9l=_f-6Ens2vc!C!Vy30&AbuJdjaXEnaA~Rvs=o% z$P|o1=JmzQtJ$5$yrYpf5TTfjZ_%}{M0!5+J^~Z1u1sk!M0zLlZb9X3Zv1L+au?D+ zWZvf9xb5l6>GNwyzktx^^8r|PaCU=_x)^-7-K@w%fG7v(aR`y0BC!&Y3gSKy!p-c6n}OGuMg9SZQvrGkasP@$ z10ov``03*zV~=TH}eJYeyK!5`Q3ab|JMLp%2?-5u-1%82iHOh{(2G z4vNZgIcT}&)O;!#9?&BO^v{0otHnW#ddA6!)r1UM}DJw!w} zZ|@C-0zbjKH|@#?7oQD7UxDM)OHQ3=gUNpd`Q;j$cRiwiHu;>wwo88c3z*{Ss;gK% zKG82iu;1+zwmE?9X}lQeKGrGhK?_?rDg^8FZ|Q}-6B)%GhLRrd$GZbK@U*o#!CHpt zeXxEO$Wa00oUpZ-Yav?zIZhx~1(4&y7VH>nL;eNGJ_2c-)dRZqupwMGAHn_HKDv_Q z&@s~yj$7aC^mAze8<1Lu5dF^`8jCBU2Y`mo;`d7MR;=@*PV^&F%JtN5tn)i3#s)Bn(CH=)XrsPdCRtg!-Q79)&Ajh~ETh0REvhA@N`elm^q z{RfigBaGWvRquR8y}KT%?;u3)3vqBID0kqZ;18ypi%(}fH_YCB31Hp9fctI{Ip~g> z-FHW`>Yl99efL<_na#S~_hj|wjOVu7t39EKg7|6*@zoIGt0BbK4I(%1p65n{AU@wO zsPXv`sT!Z3n5ywbgLoTop18mwJ|W#BtUe*#qFH@Hx zeJVFP_suX9uA4!JANRT_7HZUleMgX`jA>Zjg7%OCG+qRaM`lBWxh zY-bktrmh#Le<1lRvql2(dV#8#4mXD|uGaZ3`Mwl!e&J!A4L2B!YR#W;y9Ze z;q%>oxI<7uJ^GQp6EFjl4FJjt{Q?6V-2n%3mp2!%vS{uHpgst)XdZ^hU?#Q}!4@Gh z86keXLESb?WR-z0v-yKA#`?S>y7%7gxDbogy3?T={E8>;+IZ*MYN|jei6GU~BXSxO ztmaHawjen1+e|%XK$;_9uC-64w6~f*fSBdu-jeY#$d?zRth^A90VDD7C*pC=445l~ z_?-slJYhYZ-$CaQ+|=pX2<9{L`DI3Xe{lGHz(i7QZY47|a zof9K~KFnn&$foQ!&a{I-|CvV}=Qc<_xBk`7yuQrH=M@?x#PA%$BQ|xfxk59Iw{0o} z?M9v>;BMb8_j0a?fTIeXak&2%l37zE-2?`571m2$32jxa<2F6U|5*gTzP#|12a< zL8KC45Xmh(+t9HQcsuz#;h#`!=xzq^Mg*a|8<8DMknS~zT!AovbmME!)~Fm}7~gsl z5gl)GIYu`XvxIZ(V3tu}D;EErOAp;_Fj7riKM)lbqv)qI@ty{R$Ot4}LgX1HCL)nL z3x^*F{%j;BBQg$Q5XtR7+ce2WY!jdNrwlZ7R{(e!g3wJOav~F?+m6WT2m?qr{%b=k zy@{8ZTsCp_z(bp8E7ncq?Bz*=k!s?CL8$Oe6nz_&ore(l7ZN{59x9)Tcqryw$c3DRAP$U=kxq#GY>Xr(vtqfis4 z4mz}nwqo5x&Jaf%I;kd>3`T`NLeXicYz;!>01}rWav>8BBk>zV9zgJ)LgGC{-a;5e za`m=}He#EI-(a+K<8v_N5rl3bB6&=Z?r=noL>NH2@!g#^vBKoC7mEfT+C*EiZX%aQ zdkn@PBYpR}-M|~L07a2$cuYr)QxW2KrB&E*H5jb$oLo}1dvp^6s*xdvUM-ku8-oMm;`&Ih@8^R;wAxNcDrw6Q2RF4PCs}F zD*G0KUyQ`9h}?(}E!d?YSvy~Dt;e_i{fZesH&hCX4HTNVkt&SA@u-{IV0N$V zsGx4X-!yVFiXKK)53%mMkoXHC&mqWmLAfEO+7&84;ARda4z~+F2FOPU16d;51#TG* zz>y={1zAXBBFJ_@F(Q4LI01O9oaX;Y6}WuS`4w`m84Z`A0ru z*<;0qJ#J*aZ1P73?7czuoRyAXapZFpm7=OitUCivxB`*Itb4Gb%DQI)v{TU(jxkW&4?5B=mWoJK z*FF93Q1`ze)W-Jt^C~KqCh_$K%u*Pp+nb2fc_7Q}4addXzPn8+jvVVvmYYG5awpP@ zKZC;8fOngcI5si4Sf)48YypfRBT=5uE70CxCy|(zP?+iY^IRMyqA?l3iiNOZ!+_Nf zz;VwhM|oxsOBF=$t)?6&Q5<6|Yka7H2-zj>^xkC6WsOJnF2|Iwd&Z1jXY^)0-J~92 zTeFt~{FnhQ&yV!HXBJwQJ5(yo^MrLFgfcX)dwPzB&M$P26ygPFDrkk8TFCZo&u7g& zfO<$pJyTLFj^L17Cs|>!i%mbz8Dm-MljjcUmY+}q`eI|Odqys}>}%wRX??$_tGZ1~ zBp@6SVuCgH&qrp$OJyA4y5+*lfMT?7ln3*w`GX<{@`nfq_IJnRFL&>qg&BKy{M_WK z#0f%hP>_Fo&s6SU(!lb#1hwh9j_h3oDnq5gR0QcV$F&*~(Os%ivWbQo>RFcjc@AX< z-7r0xpsuk)OGVnT@hR!V(>e1rzxZ`Oqa}%idpsnjl?9psLP2L|iw0?R2{OCcOo8lI z42{nT>M&9-q$! zM$I*HUo#$rZzzUU*l>&c%aAlZ!x4Ez0v*m)VSYgIlgA>9Dg9>#MsYqyL@8z|15=~S zn_QgHahMGhOHqem%$Kb3*RqCW}q-fT5TPc4vb-Vl(s1ax*yqsqe~na z^&uU>ysD!hjUJDXrUey^G`tx_EisCWc41tX=NA>L@uF~}%pfa{hDX_GJ?K@6mod`# zK%v0zSlfcIEXRch462bKHePrMaJ7Lsh6YBDTwMF0Z8Np;CaIf9q(=B8VJ6hGlS5ik z>>t@%E6Egg@=mumN7u1w+``8sV79wwPz9z6+agk$+Gzp99RxF7%n8Q`ZVsC+Ebd8^ znL?cW6z7-cPe=8*=>dT_v#kZ1V;daSgfiL#Y_X+_4S2@|Jqim{>{`P#@6awI|K$_K zjL#Q4m^j}pHrmCq1!lM!gh3UO%>=$uhQ+XGs)v8t%zoAYj#*%nRY7n4fJC1>+ zc2KdpWx}EKYjIXb$mL-=?4|R#xsY;ND@0$5qgut_`Af`jwO;M`L!HA)*gmj+Ldr)} z4u#xT9U~%HEmj2k8YlMD`U5eL&6A8endHf)6s=?FDWZHvyUuqL9C%6V{7%(UPU&Km z6+89Q5L{y@h|~>*>hz(Dwo^;i2DwJG%&ZAAL4eAP*-A*kktNvVbzP7zpkZ;YH`R1!tF^7AVpo-MJy1V23WMH;OI|gVA*ws57h;j?y@aMsZlEr6~-|YMW&=pgT?v zh8XG(^V|~DF5(CmwI<+w+tSNvPPEZ#r^rfsH+JK6YhxQR7+x?L9&9JUcPukGe^E#>?Y*5_pfUYVXZWbgx@%h?aD1x1t7v0>VR<#rqb z9o?^(6{D)yUo%PR9v*^WYGLeOp`B)Mg2oAqf$3?IkT)%vb-!tLf(-Vt#vvh-BGcD> zDFI5ZU%0O^Co|1~C9r<8s8|4xkoqJ)H8&Zc=N3if&JH)9v+H78zi?^1@<2Vi38rV5 zkVEfM=5eq!WJ7En(kO#HG|>4DX8lOE0eisK57X-g-6c*}GKzgIGUf~qdJFu~%<0}5 z5y;4L=ABTiC?4&5JNUa284e)Vwa0}IG}YqNJE#2Ekbf6g%tjU{b`Zny{Cg~2!rOWG4F79Kp44&e=l$fRj9772Lj*ktbl;+$@ z(P@Xwm8N!NHQYMwsAZB6bSZ_6H&9z!Fr~QPvEs0`i=3I7Va&2-JM1lIr%yBHglv6r zjHJs_{8+sXb2K+-nkaynM0j)C3qZ*YdSM>b&J50SJrS56n8lzy+PW<`)bTCUj&D)Q z@hzs~TVg%l(sYlvEZyTRPxp8$!gkO2tBR=Gaiw*<$Ro7UT4|>@c+*kJsA!8;891?! zXIm9$gk%P8Y&FKbbE0(|Ck0}(wg$UecA5eIoSM2N1Jz6!lT(Rp4QZ+OP}MqUv$gnKag<{5E{@K{Vn;R1&{*;3+l8&CmCG_<3HpaujVs!u5N3J=DfZFaLb6a0fDX zAu}Hk%3p-Sd~dX`hJUCj;R`yh=kE1R@zn{XIx8QET+gfbPElvf_xzjif6II?V{lVdI-|rgtio@aVJfq9@zU&=FR`+&| z`}pB-AMF}<_u+WHtZUp44_EKaUE|(=INU#XjeG0iaR1pg?p24w-En4@eRS^Oa4+c^ z_qIsTzh0IfTaCfusT;StUT+MCp8GjYdvJ)zIP=vPkv;$Q(D}{Q&e^Q>)kUbvj?PQB zbvZgOhz1;~PtJ^tfpOUHrZ7M38uOwM*rnUMtl*fPwh3r#)K^z*k5zh++Y3U?{6yJi z&iBvl%tAbK76o#sbwM*9a{~Uw@+|9IAUl24F97V+3~lSQhJ(I(G9{r-5!J!2`}={z z;l9u{?xT<|4YM~NYO&kv&Zst+PjBnIkzn>$KoZC{k;aQ%K*F^CSXp_@7tnv66|3x2 z1Q7DI9bk8D?Hcxtl!^=8d%IB4ouy!6Ur2{`bge^IhQQA28tkLPN&CjGrTreN&|Zq- zfS&#pZM@yfR_h`50xu5f=g;?IrCz3giI?reQv#;I4FEEGFxSg~`^;o%L`pf7;T?bP z?15;zt2g}8T1*JO+zhw)W~fa+>w1*E6o`JOANxEQ(f6L!xeC1ItD8cEKkJ(C0f2R` zUaxeaG*GYohm-I>x|Z;FQn>0>ZE5ZT4_r+gDe+ZG_PS=6v_y>xC`p%MPCaz_^i{GsGhIEjhst`RhMkX6w8=ZsN9oA<^G{n?wPZ+ zL3prpOZtqe6jt_kR-EOlK6|8&OFOUQUDSbc&sR@vZu3UbQ0??a!HH0icW6rwmZniY zdFuH9`t{9w4g=j?y``ahs4KU0YM#C^oS)qp=MnXeg7Rd_kXBEenI@shy1U+^fY8J@ z&U%e)P@e&6v~I#^Ho;fTu~Jv_3CHEf)}s|!>Y6Ae=BbY?__=dEfd|N=(qy!_L|5@o zQ^i|nX`D|i&Q6WeMHP2Q6;bspz&(GO7hQ>e_hZ71`h9hCbf5IepE@nQKYCEu`!z}@ zvNiiP)`4iOyA=E;D1gmUD`VYhwhpon2e{r?->vk#8FRg{X`P4`JtS(Cr=BxSdT5K* zjLV@Jo+dkWd)$MFi-u7;22b&Z3_*UADyAa^Mxt=d|PP1Tx1HrGKF_+4;B6q zwbGvM$k1ee5ypJTV18~eFAigVW-z}tg|CM(zhf}JG=(!mRsPB#o^7hUDopk7rtlks zxHN?L6H~U+ApTpAd~Gu>I8!&|V}p24n4Lcuc0MzOd%}gEn8Hs?;f>+K*G=K4rtsZx zo!6Q=|7{9i3K!mP3O_Q1kA(|=VG93c3hxgWK4l6&G=;Z?3tu&bAFxpQ>MJZ4X|#T^ z?Y~r;7YwbRY!yqWW%h4F3(HT@soS@RwBe!`VO((8owmA6cH$_(!4W&dOVBkPf#}_D z-%bxu2%Qd8n!S~$ZqBHr8^7f&EP@j|r6D(+m1bM4^?lp4ch4DZUZfDzjIY?WT~m6I z<#AvA;jDcD?>^cPMH>q6KSNLWo;<`u&=z)A?}!N0_s-PT`(K?+wO}f~j%X%-1ST=S z3rZpRdM@=<0VXP|K}x9yFyg};ekl$sPyN}nVE-BE<^MM2e=+5Eb}0X+ad=q$OOLuiFN>8tNVDrNSTCU#(7x^+)5!Q+NSYWfGG zxr-K)-H6)mP?YQ;x_8&s&ekoydLY6Mi>go4wdN7yv)`ml&~JY`^I5Ug?*VKjsC$*( zO4#L6Z>2HIv4w$i{k6e;g}4#*<-9Q?V?z%fiOm1(r6?trNop$)-^kRgbxKXgv-t^ZPS7h>xT2P^0;ngooqx!YNksI>hi%ui(f>i=Jmu{oz>7IG{6_%Jq&K==C2_ z>m4<1KKf@BRcw`C8_W09?!A`)b!w5Pj;-{1`Jidv!ma*bPsZ|L{pPdieOp~W{?0Z@ zy^iB1*%ngR_SA~2^5*mW2|LHRs)^J6S~;ZR6fnbg{gb>L-#vinRE$6ux`I83eTYu= zdV=BJ3%s7?Oyv`d+EH1`Cyu~Yc{z-oz*4`m#B+OjOZ<(%!7*4qqPbr8KY2^0V3%qd z$IvwFn3drFNtk!I>PbwRRH2ti3YxA=*DxD&U9mv!)S{A-5^oUpg4DA{as^0s^VDSr z{AsIY|4sRO(X^iPz03iqf1NkLzeIx;Ae!T;LEeDVJvAK@Elf9g0(cbb8{oOSKDpyhzdfYEVES>Te6QM%=1=x*_=pET}?3p=43hZ^X~WZ z-bV^ka2`?;QJoeU=z2#G$G=a2Jy7SII8SB4?x{9R%prKCFbBuEA!nacF&x$D=r~o- z<`wx@NDUBc5yYwndPOasTJL49@>DrM!DA&G#-52tY(8U5s-2#@O2ix;V3L4GEIQJ2 zN0|bzudm)a^FvcdFD7xY8NXQ*m8Q{TD*v3=G%d+>khtfzm&iX~H9{<^o9nkl722$> zh{X0w^Hl}fTu=~=q8%?dj3cs$|IvED9-&Ue!T{X3JbjI$H*tJQVW^`_KB{$9PNiyu zN~&%}NVK#8P<7jnG2kvPg6A9It3rFKTYyxzJ)TLDArh3+4i*)v_+v%dXL5CI&F*J4ia2(tj<7h^=N^#Dl7Ewn~guAuE=JqX#dR}k! z^jY&OxeMf~yA)YK(|)jh4>U&|FJdaBnjmwC%Lr-)5s{*;xhKXuRV(fgSn5spV{d^Dea7^|0*~|6eQxYEG||U$ zXKbv56^>Jj-TgXaKKD(T20a+20yzs;akl`AO?&|4s@~E}_5ffL+w zT}3}uU~&!+mLnGz0|IJX7!~A`8X9ZRu8AdtSb7$TnH(WT&s^a3w8VOaiS-m>n>4Yw5KGS@u|l;;ODj-y9Cd3& zN2yk7?D1n5o+-OtLUW7IOah=lZRsFv?0p32BE=O%-a=$aW;1!RP2Ej;9BTz$u5Cn` zcykGmL!3<{p_86ktz*}v&}F^}f2>wwLZB104vj%PM=jpx72JkAHGO}OtNfpa;%eHy zAm#b%cpk+XcEWxhpPCo^ zQrk358oz28_x@BMo;I3d-^Z5=ai4H z?%zhQpw;`=t_&rACke6KRX@ihGNr}@i>P12@>90=Z`)%>0y8Pw$ZOQ9I42(X0@Ps} zhhFb6Ly;yxK1!M5lTK{D(0qh~D(FB{_|bM;6TO~9ISyw9RBwx5*3=L? zsD;TL@Beo?osuO5p=MICRnAV^0Id&Oa6Z_{v=$1nhjX+KAwHZU{s;;|+5Pjs)z0s+ zojeXak?qvIq;{jFv5SSu2mf;_XGhp8v4Me|Krei~E!K9444YrEoBw|Z(9_Cz8&pS> z@t`Opk6(>4PPEF1bSFom>V1<(qa!6Uf+Zv%kZ!FWm@ov!vPyt zA8(DdiPfPxxQxx;c>vLz^vufrvbdGP~{c^e{#l}PcWFo7tR#oHkd z*FS)%4K4+5b9Vs&#^N$`2?+dkTO~7mH5eNkxPPFB%ua8t?Py=kuiOANmpRBAeY%%rsKgr&gC8kDRhfVG#^YkP-OF345~2U#xeu{BAQyQ~V0An=b&Yv~1O*AMMrq9}8ljJ`5WV*ffb@Nv-$Y zxGj{2?I4m}iA-#o@fvuaRUW=kqWn=_AEXon#Lc8k|5Bs&yU>T+cq44aR4=d9%K*l0 z$erqAFT+>amDnMSUE_aJj7G zKcV6Wya8$xrts%^1DZgS%W;ZvwOr=HRB)OwMHz6b$0Gr@%a-5IV*f<7F;*m8V*<55 zRtpIeP_@%ae1cifDc*4Z4&Xy*Fe}6TZu^717`++uflLjcy8l5%k$g* z=esea7E$kEFf0GJ(yj&Ai*eQGybV;)gID`8%Fc_r$nA|gO>EpMZeNI@aMjsSw@8Mo zub$bq?|-*f;~zk6=;ECiXCcA6Cws#v*)q>PS=Xg@Z?B|j;1nA0pMm>UZKU^ z@43fd(ua-b{kl(kGli`|H4HPp%_W}tsrkR$U$ytX`)L5*_!@QUMUmR;#i{q$A?1=u z#YTBq-(h-H?E1H(nUMI?XiUm^E77If&V={Q#0>tA(S4l3+g$9WvfSUt-V+-nu~I*& z;<3_L?^q$1WT;0rEMhP|8+G&*GIU>TW9)hpHpb2XDEH-6Id?}Dwlbf?cvb@{amvvj z-)7^P$J5xx$1?8F@4v)&=D~9go^gcFK6u^{oOK*An}-7O;NgbLQ-ugmJ>+o1<5UM_ z$;tf$@wt%@+39ihip7q~UyZ{2wvtK`x9_dOSxg${K+naQ%QV5K^*Iz@(Cw?I)H}gp zov!&1{K}yI0yz=GFLj9bfzDw$13P<$tgK!2aD>;gdaL`k7I9}wGKwm3fCX;tyP)*M z0<9dR&xZ!3^BSs4+jun1U7#Cm-|wWpWfa%S>Jn*dM_KLG6QEu5z0oYk$l6sTEw?XX zQjZ?47D)YCD+dX{ene#>1#HD-iMMiZ-5j}nL9!$gF$#DXw_wnD^#_gJJ>T>s4 zp332?6u4Ea^b!d0S72w2hjo9)G))x(GRV{DZ*P+crrh?%SL z4E5^isI;HQka9HX`mKy=%O<&P-~d`|e-c1FhUJe)q?n_C?45z+jZ!C0vpg7Mbvf?4 zArq8vJ>wm>HZ+Vli94SY%s#NQa$pVqWq*lX^QPG~d>d9nwlK^Tlv}EY9!~l=Eyoeu z5vQ1y;TApRpg`>IpRYbeW&Gj`Zn~c&^Ku^J_S(&}PthDKR?R|F)&x8Kb7ZK$ap+J- zlU$se&ga#R-skyQfoWeP?v*=wM)(}BL| z6liBU(C3{3?MeswtW%)f=|G=$3UrPIT8*olXiW^ajVU_{qJ8!2v3B{pUjO%FdoWwc zR#&3O70*9qbX|rGh~V;r^n-3Q^clJ-CJ4iRw`i0cBXJXCrdeaFE!d7-=1tH80CNTd zkNXHTC-_~ljI;ekQV%S8svZ$H_cAiL^a*-)@AmoRp5J(YCcKaOvCP3D4+G|9I7ioi z!^5wmx!5yOQ!4R3FxPEvZ>UN(SGBa(v?S|VleKk?b*<}b);i(*nwFNP7H9eKvsNXS zwKuMYbMMHCvLc%{A3^RrSg0rpDH`R;RwHab1x->Kdh<2_!s`kI5Q!Zh7V6;}<38 zE}VIsv!-b+Cwo+OY+UgZ7t(Q^D#zatXNt$yL{%tP=~cmjWtf|`lgn)qV~qtx^;~;Yl|p*QG~e* zmjuF2bxj&vTMN1z4=Mz@JedUYn6a!4-HyjGsVc{e4#mfW;y|-(jTsk;j}OJebS8xI zCx+saLUE%m%WA9YTWg%b4n_ZDyGI#EZvWn!)70H>)SD9wBwZiteu^qI%W^+w- zds|J4YKYMgpCL9wT!xqo@fcz;)EQ$#lEKglq=6BZiic{%cuVDn>Kq%Y6r&~u6RH*i zX?i^|FrpRZG#HpK@mXd@Sq5wW_VBpP%Jzs0t{_DCOa)Pr?zu-9U}Lu*ZIE6i-NZf$bS7ML1aU-I}B zWy`^B%bMicszL(Mpb=%Q?;{XY1!fxD;C18)wLyCTj95=>d@5M zy80T^?<}2NQJKW3Sex7kFHyS%@#?BJRN3mVbX`r`m}GMe%x!f|OIuxS9SUotgm|qr zV7RV%eN9VidmXu}Xl!b z`Epif6_U<;E=Jt)va;1>mMq#pE?eO_oh8jRjbxB%aOmIE< zX7uFbii#!6%cP6y)^2u|&q|s}#8N0tOK9Fxv1)1AoaEBwOBO8wtufAqnk|?$wYF|* zYFUdJN<%|c<650r)8I5VCEMy-H)4{pqGEaZ;^UHY@jt~86>Ea9!`3*n%9lv9tSq%Q z)wDpS0%T>ohMis8-bf)Q8>?E-r^)1+_PY8u2&kc^p}KiXP{-Wz#WNR{qhqaD8*4T> zEt{m@0?B}n(E*02ds=F2T54QcYJ6Jin6#9c$U(VCb7ESV8U3aVreaN9Lvwx7YAW;- z4RK71sV8VMIwA@7rC;l+oeh}AU>t00PBya>psCW4E6bLb&s~*VI&=BVMKWx()=Oh` z=TX&@f!$fSDkX1@X{SMt>7>jPIqGZHw66;|Ys4%p$zQr?Xyt^ok&Gd0Y-4)^hJQT< zpi|SZ2J>bxO^!8FDedCOt8Q;;5evkD%Yo2P)3&~8Z5K^w3;K>mK#Rl?Qv~wuFhcy5 z3u6vsXxXj?I4nvPW~zbcSInEaylm#Ig=Jy|j>9x(Vfieli98r>Yl9N4lW{+%V&MwI z87G3x&RS0PVbt6B%SlPd1tMo%o2oE7f*3?@qL`Q?8L`wsE)ItBT4q?Ch00b7W~f0N z>ab=F9pGA-mPvLa)NmHOWW`vFOy&mG7`1835(uigt%V%6198H56tAgjg~Gs&twrM; zs*9G0)`t^jaXeRG?q`gH7!GzGp|vR&F&dL8YGwx`*%tF);Zw%I+Q60?v1L`&>uZuC zLbRizY(+)T2k4R&OBRd9h%Kjuh9}sNgoax?O<&T8HAm1!>1u0N$`;LnRa#iKn1Vq) z)f=>*qKwdEsGkMsi?I-i)zikNrskApl$9+`Vser!p94@CjCQP_E1GzRs8PL)dZNRN+ zSz9K82$>7m%U}{DtL4pY*0N}$ShjL$a_NGyRoaIWQ~H>drNyfi1Gs?NnOF1uyeSyc>qdbLNEra z*KbJHR$(7w_VQIrD~yady3;HMrKi=9(~gB=8`LS{XrhM2jG)|1QH`eb|S`npBsa z<;2nbE!F9>R2h*Vs$H4h$`aP9v7OXn3{N?i50;If#n9f-#*LdH!+yqw7`<_L@E&59 zD3})Q0$?y~Cu4-4QN!uG%yJhdXD(hP+Qz0^$*z^r46#*HX>8A>IZ8GeeMbglae}!J zS44W!Z5Y)?1I@0j+f2^`7u*n-K?aT5`0Ds5hiIeN3vGUE^7AR(uXAr-Yl->E4R z6G<~|YQuyZPMF;pS~7&aSGY$)T${PiMiH1XNV1$V&Q{h_(lpcTHJsOpRpq2B7!tAx z8c5wNVay~&)SSJ#xO`!9X#j+t3cAp?Y_#aUaio@Ij-$|$O9YE%H?<&Jk5rl}*@iQd zYO}22#KS6ytRKv_s+rzn!z8VATzWEn4T0^HMKddt%Z@Kwz6v6iWfSNhS1~UM%jvA; z+&fvmVja3qX$^LU%|-)Mt8Kj={+mUC=V23TX_ahgOBzN+FVd)8+}kp07lLaP z6;unPicnb zV(CnXIVA0dr8pHJLq^aWt6J)~%WT_dH&8f)g;iQbTPTC7CCQELrfTfug;?jVd^nAc z!D$02Y+hTp4qhxQnh;ZAoYbb8VGjH1>$tN+GVRUHm_jC@w=e_AHT2WWu5RSYfW)!w zHm7X46?urYz`TU(k}VIS&0Rk8xJ6})v2IGKq~w>EEu52FJabW5xI|W~G}EZMs=j%B z6(eivs~R`x94?O5Qk81?pjnqK1gm*i*O#wog|!j`z{wLVBX`wAKcpFRJJyTN3MTJ> zPRisRWa^tXK_E4$hHA@Z6n%ZL+uM4mbY$ESBCS_a3M=I)!WfNI+?2`E8&ZyVH#tor zE$pO*P}uZPdt}4U_6@bKIw?KSVYs)q)KNkyjnUEwV+(JfP&2b-oo+GbSml*txflsC zpgmP5J)9biEjaF~PNB#S`50MXL(xmBol)zX8fr$hw8Ia!jKX%%hEbbp*64#Grbaf` zS8Z9>(u8S6*99A~L~UvrwFW@-q_t+tsBtA@OGb}cSJTisiozQ?p=3hIm{BlDl1v&| zj%sgh8C74mX4Jas>QOj&N=_I*5}Oh2n@6r|Y#%jd+^D+7>iTy0asf1nLjl*+VFi%} zLLNqH9)uk|fx!mAe+z0JdQ&c*3zWQwxc^8X~0z&HwPc#hAs+N|jE%>jO--uYNj;MB4jL0rBBAi{}A4PzF;G~h1coqSp+PKa@ zBsbQw7%V~w3AeEsPfYhDUd3vG+Qep*%2p-%dYV3J(0z-JTUU)zZjj@j@mz?}72=;5 za{NygaBej=9Nv*I3s zpn*$lj{mePF=8oV!HK02yCWhV61yYXBV^4)dqk@bc&l$m4DcN>tudrxj*&VRbBffd zn0c|F=EW|H1+^@;nN)LZE2-AlW2BD7o+5QBc7GhG{c#K~S@TJ4o#awvuWMULtiVc$L)E;GB3+bK;l9gIX5fOsYA)l~il| zF;d6kmnASSVR|B{>4~!vLCs36Csm)=NUAaM2B{l~RY{<#k`^X`T9~wq)Uu?#r1mDw zN~T=$o@7vak~>IsBzKeQPQFU&YVyhyP%Bf`r-E9a+TIUTd%qL?K%MBfHWSp^%&uHe zUAc4ngPPmFxj(4p{u2j)nmFLq0ia$Tu)h%0{=&+kpel#f4Fy#<^dza1Lywn$I$mL~35^`B-z&Vr>imBE^%8I>(jW>luks9c#5D4J2ZGNUqOM&-(k z%9I(ED>DKo%?O+{BXH7;%9REunW>l`s2y!%|a%D!4 zqZySeGeR3^M&-(kP#2m}xiX_NWk%&Nqxbuv^!I5-<;sl8lo^#PGb&SNRIbdZ3}$pb zADrj&XAZ=zj4_xw5O#%bqg|CLyDC?9Ri^B!T-jBbva51sSEwBAs@xi0F=8rWB8#aJ zb2&wfTq5R1VCoo&!R{=TfW`Trbs?>9lxcmVwDpaW)`uDbkn z`k(_gs{lFsK?lrM0dfLFYhk$xkaHkv3gcCPoCZfp`&B@DzYG1)V;5k;3XqfGC~3tC zkn`avX~+tYQ{pH&B`QE#?p&nWGlhe$R2_{k+%p|MpZ?TGpZ?y zoKekD zIepDOa{Aydg44Gp2H=*MtuX-QYzr`^gJ4I@VS;kTMSs$H9Ic-E6_{=tNj1i9js=UH zav>MnL9iqCFhS`9KrVJq9Kbzs`{Dq~skZ`C?`H%*i|ZzMJ?>T<>T)Zt!4I&(-{=R} zob%D>q*+M-XC=)|0x0KwC`)P~*pk#raBosa5=!Vunvx7~O7iq%fHlc* zhfxsy7>onmVX!2hBXushi!AbqfY#ET84Y))H3clKDLtfmQf{Syr7{(+as{3dyHf$~ zPJKHSV0-FWQeCN&(~wM0Tg+r}+RJIkTamV%)b_NUq;{v>B=uF=v~(oX(w|QUI5T|_ zsYU5aNG(r)n^b%H9VXQoTQZPr%XpK?n;CCqfMs9CAyS7jj*vQ@F|iM*$$d^RInn1# zA2>H>`dsPbeR{$YaivdnU%*rQ9`A?bc)yeVkbAPXEXZ`LFuFjm1iDX9R%*==p zVrJ&NOqn|`b2Z_$nY)>^Wu9fyl{q;J$@HuhOzN|CGil2@%cLu7ayIj_S1_s1-p!;f z`z({L?8!OI%UQvsK4&+Rww$v}x^gDxGB0-pllt7|woXO|8U*w{0U*z7& zm36z5TiYM--2R)HH243A$w&P=`=dwB^uI~!X8+ryCJv|_fFY|L@X7#yui%}~s@lUoB`&O`EY-ts(%tj^m&YD?Z*Oy0`dOYq&is(esW@)t8%mj61F?fHk8 z9L>MVdF|BXzC# zb5gg9=L`WgXUO~^pk5lXnbhVXuanw7GTd!*hQc8Ju`VHZhV9Cn%1jbYWLpsGusEd}*l>5HUZ zEPaX8($WS}4W*5wno4()lHMI=9=@cEHt>b%fB*iw2SWCMbmU+~Sd{SLg&6Oy1Ndrq zkdEBJh$9iv;|+x!iRdQQ9noWBJrSGe#%=Pncr3ma&vjzgJ(XSytMqQ76Sv9RVq-1d z>%^{mD}~J`HqnLK1kcXGTEul?*WuV%SY_lUI&hmJTWqW)@;b5Wk(E(4U(_bLZ=0f8 zY^){fIrQo1$B6tR?z7vFp*5KAX?CiT>OsUyF^k_%_A>+ZeMWCi>rX zU+suFKEHgIoH}1t!rMn-r`GT3AhR zBe9KGX|%8%!PCS}<7M2!E(NE>1Dh5|hHOC(yb^veX7IrLt4jr~R z33Ulpo$C@R>5Nq-PEWM>rYF`BtHb-ch1Dl^5$nP_rG?!{tf6~WgVjn4TbT3)u{ZGI zZee?qCea<6lw6Z+m0Od1hS(XrzFU0V$=B(VT~Db@wfHJiSJNe14L{Ao)~B`-YfWuW zwPf2STZy%%x7%2I`b}at)2lNq+3Jk-bokb1Y_qX#89RvW z$k=CN`!e1m_Fl$u8#|tHi`cD<$$cz+lly$t2iRAAruMb4seNzu19r1tb*6&mRm0#=zdJfPzF00a$viwPdx~ zSX)*nvCgb68|%ud%%;BV>Djiv>^fp~+4VM7pWQ;NCA-bW+Oj)|b!K;?!Ce}URmW|ySu$YeU;=I*)mcG?_YlyAM+hSu| z^4=u&X5PCt_HN#n#JihlO0fsF&L5*r8JAa-Nm#6cD|anPbcz!nW!X=5t~og;Q`&{Z3| zI;e(Dc}>B>0!wyb!C7Kw3ohH(<$_xJ;keEqvX^UN785Y**oa8{1!a zhS-_H?m}yHx(g@MN1r^ncCdxj4qi!Y<=_oAwqfvIVtWU7*jUHl^Tf^%zGh?B22Z2! zKCNg@k)>}=Q9ZHxqRlq8x#%5Y?-U)eu_HyF5&NvD$Hsb!UZ79^Lh*uPOW%Uxb;Q;c zZ?&qSq_017$V)>keJ>4ZB-S`&yNzuha){WWAt!9? z#E|R6t`DgkYROg(-OM+F%|mzE*v_Fxh#kQumBn{*=x4+}8`?9}8n>RIReVRNDtV#A z!d@t8Al6XQY-7zO?-6^iVxm?RcE__{?%T-L|!p)VrT)#vvJY1Q} zmCMm;t#Y(loz%;cSPtQ4HbCz9;MJYm*Q3?)B33%$n*5ZP3yaVWhg53kk|MOj7nRz% zn22=+?rx7(3x+6*8k?!p*Zi=+ z!>w$rhj0&jv|7-E0`6LmR*QC6FG#9Mri5Is)9ZA2tLJ_-m*g6`7T1{4ltP{+uF#K+#0xkB)N~x^aOTsJby6c79?rz*)W|r;5n}RJclPCNiNxVeI-leej@>H z)G$3>a*fLc*Ki+`++Etv*Z6kaA|Q5<>J-FSoK<6jO7S(ryM*R z32rQ2&iP>Zu;yVA56C-FykC5jIY)~(55op1%B~)=bV#iC!fbV;E@2Jb5VORA$g`2C z#M#JKq8z1PjJ$$Bjv}r^*5I{FmC)^dS%C3n@lK@82nDOfYXYpVF%aZKqBe4Sq+Q>& zVkh%2huyC{g5I z#)~IJuTvCjG%Ql(VVk1Ei%NEQKk=HC6oT zR=nz6Z;5ml;(_}B9=KbJY!UD@4c;~wLfZy^#OLfOWb2-i4X7%bU4-1(MXwa0b*~g{ zAhn@r6DZ~z;*G&O2gi&xe7X6)+(Anqf5$;8mb!xN1t@uY!MQ@aWKmbJwE&yqTaoFh zeNb{rg}V#(6`+iL1(SIsV@hE&lQ+0XXqnHAf@=C0bK#31InKPF;Ez-ovEo2MC$&Lr zN?}Bq;SGUB!Bz?m6^K|PcZs11R>0@PH9_1HZEA~BSDx_+7~WXbwoWW}ssd-DKry>; zZXwAx3J)>`k2ZwUTozUNNSKY}VBv9a-De0R07lVSaJsjy*-{4r-+fU~RTwkQ>|{gS zg&2{ds<5gM<^hYWV&g~f=FwMP>q_?Ufq|0-VLT=cda=MB4-DnhLC+6D&p$ut_8@e5 zWx^fK5Zg%)d}rQU>U@P%D|+%K z=A*cY`IGV^MwulUSo)sK!x$^_Pck`~e}PO=t>a(?ROJDFi@ezBATL%6Shi}5sZQ+9 zJ5R>*WPAvWo2hM2ejAgv{0@S11}+qFsteYcV5a>c8@^*+blwcfXttXuKm^#02POop`YslEk1+T32>UY}|6 zE(~Tq)%U#5vUw7$0nFUSH9;IUueHJEd1c$YSm0Z#i#vqk#3A1msY+S8cnP^0MREm= zaTxdl-%Gtk4{1^KLTCSKp2VsiaD9N?W5B2I88-sYxQps#?m80LJ9zOt&vRYpa}W0K zCDD?5Fc)PX%$>zo$65VlcA0tN58E)exD9hFw~fca-bJ>wGjS)ks=sBf5Ss@|%mduBh`QJ&o}+4teK&!nCLH964V(}TovwoL&gaaa%GO?!c5Y`kHXDeWF_P%TY`?B|I zV1M?G9P8#`g;2>WK{V$|@HH+$ZAqTbRg?LBR`mh6st>p^fA*?5s`w@TGIRB}@|TE( zsWZ~_C99<`Kg0TpzMPqP$-L~$x|5|*)<<1BG>f*t{s0QyA2^-lt?hmqbvcwQFHR)y z%a#|cJujq`*c#l+_*NdhE^zaDu>xmR3CsID)xvo!AuBFhp zGM~#d9gQPNr<1_2CHaG7Yt&hys18hF1*Zg7a^tr?y|FKnDz4*Hh{f6KvLh;VbHvI( zJvr+Gjr8ocB%>Qg>pYc+1^$=(;CRVDlc(7xWn9TXGQUrEA0$h&c4i@wD(xAmm%Jf% z#<#~qK|7Z*%f*beb!nj1(L~Bcb>A2Jf_kwp>;s4DGOMU=XI4iRzz){8T&$yI;QSfw zp&Tb;@BWF8Vpqn~GhsuSHul|3t-JfK@2A^Ml(l3k6;?pur|1VUHK!&AyfrycZ}rOO z@wZszTdZ=0_%wSe^P*X@>(mK~o+*o-89yn*Tifz9I%r1*OWBbzzfY{U?lD!}C9=ne zclTMEB^lXw1a{&ckO1rFlvpQisO9NiXMx=nFnhyMk#`fkwdbA|Ut<4UUK~tWm?|%L zTgr?2bXFETlQOzwWxG&W32N zO!`07akJuLy<(P`i^l*V&v2PrAGZ~`sm@$Np1+p42jl(&xp~f9LY}WLfw74jag+S9 z-U2H(T0x$BrR)O#D&!_xjy=jH<%>564H*&w_%q8UcOVy&l ztU#>yJ}Z|k0_6D%nY%Ku8Mz~zxr99bQ|7h>K1A+A&RjyCZ_9Eo1-?S=Z>?Okh!Fb< z?VS}|8jST$aOM)ywb~kd8@W@gT-1t?=dYH)Q^UM733f#D(Ut(GFa(HFCS@$ki1p60 z^q>xeJm2KIk^RHXa#h~YSNl%x2ZMOI->Xb^Vq#z^yn~re#l4GE%8B*;Hj!sjzoWSK z<=vttnF=Xp-{Q5LdCJsWgTty&>8)*e8au&Yuf=p}M8)B%y07*(6am=hgf$@x5}W(A zvPi=#4)#09D|RDkSXDlInDR-;ln+3re9j=19j4mF#CnHWW{B=2 zGn&6cLosRt*Y~#RlmZwkDa4t(ak&O3cRXe;l zb8N&G7YG-93$~47y-!-@3kC7!j6f%-Cjbt%aL!jx7crZUfin3R(EaY@n@v6pz|Q!c z@zwy40E|AjVNC!=WWaav*!0%oQ7Y?sI`J7io##&w`!Y}BJdNtr2yqiI3YH)aFlT-$ zr#FuK>BO6f6yOWh>BMu1mZwQVX29I-3{A)kY5aFTjm0iLnajin$tR?Lpza5YZx^51 z(SC6x=?MOEIA7&70XW79YXUG@c|t0K7a?0YHHEW$%>;2Lt2Wzgr6CprM!^y+6SdiV z#9$sqE2pL`mI7?$)RgB_tX7hsCh1UH8EB=IAq!lXx|Uxl%*5ElWXf)a#}4UfyL;L+5JQh*gan)*?y zRY4Ne#0uIOnvfZC7`COomxc;%&D>>G@Nn8;`W$a%?qda`e7Fr^iL!!hlOej(CZury zwltIu&-)(q>ieFH9?Y9qr})rw&UuB!Mvd9-u&9h^;73vo{74Fi4{?wLD%vB~qRx8I zq;APp1~&Wamk%S*x(_2(qX@CuvzCpQtrN#0x}XGNVyR~ZY9#fDOA)uJ`Zfhr`J&QO z%?ek00O_f>CFkQDROjQImfT*Q*^+ZK2gM!D*`ABywqs}1EDpt-%Gt(E(QVu>mF1qm zcB@(L*r%ZHsoyJY(p1Jf5wnpZAs>ACk3i2O|BS1D{*^5udmtrrzRVkZFPd@h5A`b{ zPL7=6M`UMWYGciJX$h4nNH6SF#>^qtoS2<4CYOY8D-tpn<75F1QEx_p_syu!qtN`% zqwtq~vG@`7rCN#=Uq;P|b_j^JsIyV1(b=erSd|qQ$zBGg>S%NdY{0=T>Z12@A!Tp$ z$I;FXN3X7r-VA=RCHe@HBhepWP31B15g0xHI+lxHb?SwS} zcwo?QeL;w#+7sUAJLUTcA8>X4gVYn8#XD2afYRe5E+t$g%hiNtp66&z*@5>>R^o${ z4^te@3FpEVK(XH37A3kwdI+_yyBN!ggnEc6P0;)T=& zsa_uaT#))oDo(+^lDb0D?6nsFdB%;kS?8pR+D-qCr8M$BAbBOg8KouVgB0!m^D?T= zH=PCO9NYjF7#{tS3z^$e<~Bd890BHu@Bi3QE-@#Y7x!_trK|utdBO;&W7jHX0#r^J)Z~ z7T{n)YD0^iMJT)BabTWQnygk>flxidZU^%L1PHgV`rl~D!ZiT4J}cq3xFR=z!ACjeayVep&W zcrKdfsfBebgN}SsU*z_6uB97&F{?<#e&&yz0Imry^7;E>#4=Tksb=gme9Ar(F^!d& zrgBXmVl2RsCMea3m-yYH<;RwO3qs%eN9g^>N1S)NDE$tUe&=tI`?t(66_)-j^hpHT z*k|G!2*@LskgAHN!4H^lvMKDmrDO+KN^B*XtIAZfzAGH8rbH? zu5|?pnH@muW}^^Li+QYaB#u>X24(7WrK*TgDB?Ch&ApAq7Sw8zDhU(WWd8;~@C~XY z0J5ZVl=M;nKH5tt2~`3v3mYX1lR(IF9z;2B@Y`{zJ@*pKVqbwuc7^h-#a04iMZkag5B{2N+Hc@=&1h^x?a6U9`#>j_C-LP zGbM<+9`$$n#n|WZfbAs11Cqf93yI1Dh;Qt`an#QTr@k~FoSKx55_)PHTFR&YVH~ZE z^&WLTFYks>?qRdJIEg!&Z<>eWCd;)hvtLA~_Y&uzOWs-BDxM`435*r?$rg!?08BRa zcc=FX<{@##Tg7eeD#eKh{ZEUW9qDRX3t2~+tZ3S8F)I?lEX8U!jobHZ+6{i^ht~jsYaMksWA>=!iVd`eD?LM_zL^tuAsyB$~E?hi&jz6ci_#c0BS^ z0-r*_)wDXYjx<@(wBwOi30zgIcGK2G9%fs_;mBh+Um(lYP1DtoO$%Aj-8!wNRYuLA zlRqP>kv@E5)HdzwZ;Ltvz+~g7RYuLEe?K#783mRpPBd*>)II|HAmD0RC0R$BtZ3S{ zs15=hiq&q~b5Wb4*tE_3yb@;^kguDjt09{fvY=2pMQ2o1bkrArlTLTn{E3?AdcK0x z<4hA;+7kUH-#6Zj-UG^b`~x7fe5>{5u@`SbM z5%rBV-74(_aSPT0v0J;$XSr3&e9NgXM%C|+GwKr%f1FXaw}FSfVA;Myy&JXBw@Wr^ zm+xIRYQL|8m5?Hxz8;G7_?Gie2H<5t^#eNZwC|=Ay6Kw|1EDE=RmF+mm}Q`pY=ik{ zQ#yOe;!BEMh=sRA?BYihaLZ#(SR$PTut76FAeIMKB45)}1EL1IHfT^_c>sH@%>l6|&}P$X0-_PlgCUv& zdji;2K4D)T2#6!tw86o-Kvw`eG*v&3|Z(kv+DmWvE9h;Rw(TJ~yEqZ=XEWw@) zocmy75F0e@LGeNGgiY@Virv_?!QM^$_ISBCFKW_S(t6XgLC;B8ksw~fP6F4xpGgu2 zGP^SkeC4|?2}}OllEhnB_s5}5>_Ur{&X9({)%n7V|S3ki~^!tOwu8!ZQ-P(-BedV^0%(m#-zJ}P9 zvnxlumGe%HIE3{u@nO!X93HAVRvtx`J-<%<03C{i*uR3ouPBvmOW-S!vZ}UrcOneG2&Jb<>gPQL2e+v3?;PZfd z0XFb5J25CG@X{eLIL%g!gedE8)ciESxl@ z>dO~WvBI(dD==sS&P>Yn5;^&V|4%-SjLUc29DV>E14~ao>YW2b;-xOUzsAS9@V@{a zVe~OR*roKC6Xtg%o?<-Jq;T{9f5rvNZE)%No#an8#=7|F$chm4eVHwuN*JK zg+Hh9b1waL8t-x88-cT3W|Yi4-LAGU_$OiTNNkUU(vuwqXKdS0{67qXj{zQmN2j^? zSt(RSQJs+e|CHoUGR7{~4RR!*#%nV84V-VNS?FNIM!hJPh6(20siu5#!t7vd=4F`284v_QO~`51_~8FHz!mH#kT0 zcR!`_zDL8suNe3Mb=m9x?}yRzpw?ps3SFV~JQ9Y#It;!Pcw(;-6|pW1|L!pOX{jf{ zn4<00oKL>c_=7Io9~s&n(!=0?9tQurF!j%ri^!qwm-H}rQ5gKM!r%`94>j(; z4a5IT82rUB_#0vHgJJOV5)T@s`ab$|JubJy@MlMd?w@ak!T%u)exDw%x(TYluj_Ij z55qrQ;z47CzJK+?n6Wqv|1Qnn@UKd-KEh@k3B!Lm41PNd-UkMmXe1bwuKTMLcqscB z9tQul)RSQ}x$L|;4FA`3zx~YBZ;Qk5Z<09rP5Uj2bU)A1dd!I4=Kazt>yu#o%+;=A zVf0@NgXh3u3)K&Q9tJN9ga1<){P8gOgfMtr7`#3V-Wmo!90tD?2JedpQ>cFUGvKtJ zv95l;U-Dxft5yS5s>f@z##^+%eUHW;52JsM*8h}C|C%uTZ-&8-OC0mVFI9mBy4-VN z`0oJcb9}GMp8LkJAKz&VbOx%xR7FJ^47@ncmHiEF}<3>wFd6WNFitpPhF}?sE>UkQ6?~_8=|6hc` ztMt4ycA`>j&PzWF!~cgcIF^4xmb(JDX?wcrGFcynf4{_o#_)er-21f9u`v7>G`~@$ z7>8>9FM+c^54id>9flFAfBrfQen0R;yq^x&?-BQD{i8MB>3VN{TYGAJKY-|60kL_H#ZA|L0-wl=#s7_BRrTP^Hpu_Ro*P z@IR*cbAO@uF--DTsquzCDEbc`mA(*0PjeXjZLOzM_rE!xcZT7QNC@4oVPWv^0jFKn zx$NqvVfgU{Vn}etVa;~M`o zjGmQx9w^oC5#~Jb<1qbpJ&c}I-0Yl(OZ9VSpf0yR@KE!>5R+f`!(h$-*Amx+BN=1z zKdZnq+D?8KhJRuhd>QauhhFn?Lm2)~!th66G6^-Gq=doyhr$0x82o=rJZMzv`{k!* zMIU)${J8Om^ou{Zj{vb_et|f3h&em{Hx-ZI&-o*;ECM?|Ziah#6ajC>RXqIUQwF0Z z{d&xJ1S~+j;ZPiir-SfWGPFPiVz4~%djyw3q@;>RpZv{leh(1`CF7L!V(lH?;Spyv z2OUXD#iLR&Z_Ut)h}j`y%*r@?GW@EEm=VYj(F)8mnq{wuRGN?hp`0=L9MMS_kDzyO zAsxp@qwe4~E@p-%xhvR;=0R7eI5jRA8NEnjy#njpXNNIjpp+7X!5EKmaKKh9oDg}A zFhL=5Rpgxz84S@A0+#WSLf|s!i;0JbDpSGGIf#z)y&v6MQ2~4S!H*uO_}+aQyzkyo zw5oBBBd`r4pBU1bjEZ~z0TFfX|1R>%e)wHe^ap?c;mQjUv(v?aC^U|+POkWY!+(H4tlzEp z8iKw2nXD7TP`MPCRpq_l%3|P}Q96>;2v-az2I4V8ru7ayDFc8qut&u>Gg_XCb}B=4 zI3oCrL(CG~{fJAXZvyCKI3gL}2vL?1M1{AoimBDBOVz#Vsx2GB{?^gUT)DlX^)TQV zV{y88sKF6*&6OK6Ak*D(jo3glFr7Onqe~+iEBoZGVPZ2F2G|OH=Mr?>qcX;ko|#m* zN3#`rLQ}CRT?%vrIy1s1BNe(hIKCkwef~Im0tU(1 z1mVTVX$EoCq4`_|I5>3ZWEX?%?2z%G?O|{R>-?TGV5&=(wguInDzIso$mahKLG>JR z1{ifQqh9(}mF=g&hP)~5o5mSGi}wh`?FfxB@}V|Z8B$W-7n;Xabck?TG9DLuS%)ii zNtnTFU9iRC6>J>Ote z%+SPU@2f~`W`&?k2laI6f}|OilJ~rf;CeTU_7cp%O_pW%j)dxx>vaRe1#)GZRSPlQ zh8W0@-iHe4q;EPo-n5mNL5Yoz(W0?tp z$(a+Ti$%6X#>{hCxjTZL^fnz+x14QEA43tnLJL|$|8-feoZVdoV_ffk3jdp_t9Q6y zOWikQ7dRetGP1KH@aQieeacmi?48G+9RKL!|N2{3ma~@~PC~Civm8m;kPuFYQ;9uP zW|+OZqcY!Z0OOuSZ0>Qcy2%OL=>usOokpZX-8#m@89+0{OrUD>@GlY0lws3#bX|^s zeol@V|JdV?S~m?tj+ybH&3Ml4`h^ep>S_ob2{~XPd_>wLV|2SjRFF<<(CGo9u4aI5 zDs%)1cFAg!HzPKi4V1y#oVTco$!J@@J5r@NOsg#j$k^hh^C2En))>E*;|& zI_yyEX0dnQ<<7^qIo$RLswlXi&B&0-Z^g{>@NdlFreA9XKxNn4foomOl7sudzBlUr z@Bc%^h;QRHMb0lW#I1|d(Ht3&^4_w)|B3dAU7XJPJKn%l6ihQ(p=E-c&+d-B?ox^7 zIzj?Fs^Zk|c4RBuvp@(-e&op~7%N@I{&khfe!F{cXh*#QsLDIe8Cuq|=C7B?r=bdz z_%)|V${4T}_m}+;x23rbf!92)LX^oEvvMlK+r^mB-i0=OE6lj2$Br5E1RWD+9N=DV z6+6Jy%E$1sg(uUaC|cfnKmNING#p*5!UD5KxVhmPq7Y}OWS74C=^{H86R4C<7{j-k zCeI<);kI4U6&1f=@L@a?5SG27mjLeXhY`PC#n475W4P#W0C~H)b+BJU_A094j%Ex< zy_qt^DeD*N0rq1A#$+CRKgO+gm8UyjJ~)jMgs&X`@XwKse?p~?nODDkeEgUagd{CN zRA5Bt9shfy#DW+X^3kEceAJK(tdUXj=FS3kX7V(|M0FaDY3k4;tiW;z1hkRk4k~h;jMe^HDSx>Y68aB8c%O;!p_G)=EeT;*HpS%Ce_D|G#-;rE~QCh4n z%yfj_m!y0;{+Z>Q^3#E_i8!93e#3jGv@hq+tcQtB#)VTpceu(i({4+#!u4=shgbb- zkvQcOexUixRP&jMDQBiHy5w`UoSAn1k@A e + warn e.message + abort opt_parser.to_s + end + + options[:config] = args.last if args.last + options + end + + def handler_opts(options) + begin + info = [] + server = Rack::Handler.get(options[:server]) || Rack::Handler.default(options) + if server&.respond_to?(:valid_options) + info << "" + info << "Server-specific options for #{server.name}:" + + has_options = false + server.valid_options.each do |name, description| + next if /^(Host|Port)[^a-zA-Z]/.match? name.to_s # ignore handler's host and port options, we do our own. + + info << " -O %-21s %s" % [name, description] + has_options = true + end + return "" if !has_options + end + info.join("\n") + rescue NameError + return "Warning: Could not find handler specified (#{options[:server] || 'default'}) to determine handler-specific options" + end + end + end + + # Rack::Builder implements a small DSL to iteratively construct Rack + # applications. + # + # Example: + # + # require 'rack/lobster' + # app = Rack::Builder.new do + # use Rack::CommonLogger + # use Rack::ShowExceptions + # map "/lobster" do + # use Rack::Lint + # run Rack::Lobster.new + # end + # end + # + # run app + # + # Or + # + # app = Rack::Builder.app do + # use Rack::CommonLogger + # run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['OK']] } + # end + # + # run app + # + # +use+ adds middleware to the stack, +run+ dispatches to an application. + # You can use +map+ to construct a Rack::URLMap in a convenient way. + + class Builder + def self.parse_file(config, opts = Options.new) + options = {} + if config =~ /\.ru$/ + cfgfile = ::File.read(config) + if cfgfile[/^#\\(.*)/] && opts + options = opts.parse! $1.split(/\s+/) + end + cfgfile.sub!(/^__END__\n.*\Z/m, '') + app = new_from_string cfgfile, config + else + require config + app = Object.const_get(::File.basename(config, '.rb').capitalize) + end + [app, options] + end + + def self.new_from_string(builder_script, file="(rackup)") + eval "Puma::Rack::Builder.new {\n" + builder_script + "\n}.to_app", + TOPLEVEL_BINDING, file, 0 + end + + def initialize(default_app = nil, &block) + @use, @map, @run, @warmup = [], nil, default_app, nil + + # Conditionally load rack now, so that any rack middlewares, + # etc are available. + begin + require 'rack' + rescue LoadError + end + + instance_eval(&block) if block + end + + def self.app(default_app = nil, &block) + self.new(default_app, &block).to_app + end + + # Specifies middleware to use in a stack. + # + # class Middleware + # def initialize(app) + # @app = app + # end + # + # def call(env) + # env["rack.some_header"] = "setting an example" + # @app.call(env) + # end + # end + # + # use Middleware + # run lambda { |env| [200, { "Content-Type" => "text/plain" }, ["OK"]] } + # + # All requests through to this application will first be processed by the middleware class. + # The +call+ method in this example sets an additional environment key which then can be + # referenced in the application if required. + def use(middleware, *args, &block) + if @map + mapping, @map = @map, nil + @use << proc { |app| generate_map app, mapping } + end + @use << proc { |app| middleware.new(app, *args, &block) } + end + + # Takes an argument that is an object that responds to #call and returns a Rack response. + # The simplest form of this is a lambda object: + # + # run lambda { |env| [200, { "Content-Type" => "text/plain" }, ["OK"]] } + # + # However this could also be a class: + # + # class Heartbeat + # def self.call(env) + # [200, { "Content-Type" => "text/plain" }, ["OK"]] + # end + # end + # + # run Heartbeat + def run(app) + @run = app + end + + # Takes a lambda or block that is used to warm-up the application. + # + # warmup do |app| + # client = Rack::MockRequest.new(app) + # client.get('/') + # end + # + # use SomeMiddleware + # run MyApp + def warmup(prc=nil, &block) + @warmup = prc || block + end + + # Creates a route within the application. + # + # Rack::Builder.app do + # map '/' do + # run Heartbeat + # end + # end + # + # The +use+ method can also be used here to specify middleware to run under a specific path: + # + # Rack::Builder.app do + # map '/' do + # use Middleware + # run Heartbeat + # end + # end + # + # This example includes a piece of middleware which will run before requests hit +Heartbeat+. + # + def map(path, &block) + @map ||= {} + @map[path] = block + end + + def to_app + app = @map ? generate_map(@run, @map) : @run + fail "missing run or map statement" unless app + app = @use.reverse.inject(app) { |a,e| e[a] } + @warmup&.call app + app + end + + def call(env) + to_app.call(env) + end + + private + + def generate_map(default_app, mapping) + require_relative 'urlmap' + + mapped = default_app ? {'/' => default_app} : {} + mapping.each { |r,b| mapped[r] = self.class.new(default_app, &b).to_app } + URLMap.new(mapped) + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack/urlmap.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack/urlmap.rb new file mode 100644 index 0000000..baab299 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack/urlmap.rb @@ -0,0 +1,93 @@ +# frozen_string_literal: true + +module Puma::Rack + # Rack::URLMap takes a hash mapping urls or paths to apps, and + # dispatches accordingly. Support for HTTP/1.1 host names exists if + # the URLs start with http:// or https://. + # + # URLMap modifies the SCRIPT_NAME and PATH_INFO such that the part + # relevant for dispatch is in the SCRIPT_NAME, and the rest in the + # PATH_INFO. This should be taken care of when you need to + # reconstruct the URL in order to create links. + # + # URLMap dispatches in such a way that the longest paths are tried + # first, since they are most specific. + + class URLMap + NEGATIVE_INFINITY = -1.0 / 0.0 + INFINITY = 1.0 / 0.0 + + def initialize(map = {}) + remap(map) + end + + def remap(map) + @mapping = map.map { |location, app| + if location =~ %r{\Ahttps?://(.*?)(/.*)} + host, location = $1, $2 + else + host = nil + end + + unless location[0] == ?/ + raise ArgumentError, "paths need to start with /" + end + + location = location.chomp('/') + match = Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", Regexp::NOENCODING) + + [host, location, match, app] + }.sort_by do |(host, location, _, _)| + [host ? -host.size : INFINITY, -location.size] + end + end + + def call(env) + path = env['PATH_INFO'] + script_name = env['SCRIPT_NAME'] + http_host = env['HTTP_HOST'] + server_name = env['SERVER_NAME'] + server_port = env['SERVER_PORT'] + + is_same_server = casecmp?(http_host, server_name) || + casecmp?(http_host, "#{server_name}:#{server_port}") + + @mapping.each do |host, location, match, app| + unless casecmp?(http_host, host) \ + || casecmp?(server_name, host) \ + || (!host && is_same_server) + next + end + + next unless m = match.match(path.to_s) + + rest = m[1] + next unless !rest || rest.empty? || rest[0] == ?/ + + env['SCRIPT_NAME'] = (script_name + location) + env['PATH_INFO'] = rest + + return app.call(env) + end + + [404, {'Content-Type' => "text/plain", "X-Cascade" => "pass"}, ["Not Found: #{path}"]] + + ensure + env['PATH_INFO'] = path + env['SCRIPT_NAME'] = script_name + end + + private + def casecmp?(v1, v2) + # if both nil, or they're the same string + return true if v1 == v2 + + # if either are nil... (but they're not the same) + return false if v1.nil? + return false if v2.nil? + + # otherwise check they're not case-insensitive the same + v1.casecmp(v2).zero? + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack_default.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack_default.rb new file mode 100644 index 0000000..fa7ea2e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack_default.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +require_relative '../rack/handler/puma' + +# rackup was removed in Rack 3, it is now a separate gem +if Object.const_defined? :Rackup + module Rackup + module Handler + def self.default(options = {}) + ::Rackup::Handler::Puma + end + end + end +elsif Object.const_defined?(:Rack) && Rack.release < '3' + module Rack + module Handler + def self.default(options = {}) + ::Rack::Handler::Puma + end + end + end +else + raise "Rack 3 must be used with the Rackup gem" +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/reactor.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/reactor.rb new file mode 100644 index 0000000..1d74b42 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/reactor.rb @@ -0,0 +1,125 @@ +# frozen_string_literal: true + +module Puma + class UnsupportedBackend < StandardError; end + + # Monitors a collection of IO objects, calling a block whenever + # any monitored object either receives data or times out, or when the Reactor shuts down. + # + # The waiting/wake up is performed with nio4r, which will use the appropriate backend (libev, + # Java NIO or just plain IO#select). The call to `NIO::Selector#select` will + # 'wakeup' any IO object that receives data. + # + # This class additionally tracks a timeout for every added object, + # and wakes up any object when its timeout elapses. + # + # The implementation uses a Queue to synchronize adding new objects from the internal select loop. + class Reactor + # Create a new Reactor to monitor IO objects added by #add. + # The provided block will be invoked when an IO has data available to read, + # its timeout elapses, or when the Reactor shuts down. + def initialize(backend, &block) + require 'nio' + valid_backends = [:auto, *::NIO::Selector.backends] + unless valid_backends.include?(backend) + raise ArgumentError.new("unsupported IO selector backend: #{backend} (available backends: #{valid_backends.join(', ')})") + end + + @selector = ::NIO::Selector.new(NIO::Selector.backends.delete(backend)) + @input = Queue.new + @timeouts = [] + @block = block + end + + # Run the internal select loop, using a background thread by default. + def run(background=true) + if background + @thread = Thread.new do + Puma.set_thread_name "reactor" + select_loop + end + else + select_loop + end + end + + # Add a new client to monitor. + # The object must respond to #timeout and #timeout_at. + # Returns false if the reactor is already shut down. + def add(client) + @input << client + @selector.wakeup + true + rescue ClosedQueueError, IOError # Ignore if selector is already closed + false + end + + # Shutdown the reactor, blocking until the background thread is finished. + def shutdown + @input.close + begin + @selector.wakeup + rescue IOError # Ignore if selector is already closed + end + @thread&.join + end + + private + + def select_loop + close_selector = true + begin + until @input.closed? && @input.empty? + # Wakeup any registered object that receives incoming data. + # Block until the earliest timeout or Selector#wakeup is called. + timeout = (earliest = @timeouts.first) && earliest.timeout + @selector.select(timeout) {|mon| wakeup!(mon.value)} + + # Wakeup all objects that timed out. + timed_out = @timeouts.take_while {|t| t.timeout == 0} + timed_out.each { |c| wakeup! c } + + unless @input.empty? + until @input.empty? + client = @input.pop + register(client) if client.io_ok? + end + @timeouts.sort_by!(&:timeout_at) + end + end + rescue StandardError => e + STDERR.puts "Error in reactor loop escaped: #{e.message} (#{e.class})" + STDERR.puts e.backtrace + + # NoMethodError may be rarely raised when calling @selector.select, which + # is odd. Regardless, it may continue for thousands of calls if retried. + # Also, when it raises, @selector.close also raises an error. + if NoMethodError === e + close_selector = false + else + retry + end + end + # Wakeup all remaining objects on shutdown. + @timeouts.each(&@block) + @selector.close if close_selector + end + + # Start monitoring the object. + def register(client) + @selector.register(client.to_io, :r).value = client + @timeouts << client + rescue ArgumentError + # unreadable clients raise error when processed by NIO + end + + # 'Wake up' a monitored object by calling the provided block. + # Stop monitoring the object if the block returns `true`. + def wakeup!(client) + if @block.call client + @selector.deregister client.to_io + @timeouts.delete client + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/request.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/request.rb new file mode 100644 index 0000000..f8aabf2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/request.rb @@ -0,0 +1,692 @@ +# frozen_string_literal: true + +module Puma + #———————————————————————— DO NOT USE — this class is for internal use only ——— + + + # The methods here are included in Server, but are separated into this file. + # All the methods here pertain to passing the request to the app, then + # writing the response back to the client. + # + # None of the methods here are called externally, with the exception of + # #handle_request, which is called in Server#process_client. + # @version 5.0.3 + # + module Request # :nodoc: + + # Single element array body: smaller bodies are written to io_buffer first, + # then a single write from io_buffer. Larger sizes are written separately. + # Also fixes max size of chunked file body read. + BODY_LEN_MAX = 1_024 * 256 + + # File body: smaller bodies are combined with io_buffer, then written to + # socket. Larger bodies are written separately using `copy_stream` + IO_BODY_MAX = 1_024 * 64 + + # Array body: elements are collected in io_buffer. When io_buffer's size + # exceeds value, they are written to the socket. + IO_BUFFER_LEN_MAX = 1_024 * 512 + + SOCKET_WRITE_ERR_MSG = "Socket timeout writing data" + + CUSTOM_STAT = 'CUSTOM' + + include Puma::Const + + # Takes the request contained in +client+, invokes the Rack application to construct + # the response and writes it back to +client.io+. + # + # It'll return +false+ when the connection is closed, this doesn't mean + # that the response wasn't successful. + # + # It'll return +:async+ if the connection remains open but will be handled + # elsewhere, i.e. the connection has been hijacked by the Rack application. + # + # Finally, it'll return +true+ on keep-alive connections. + # @param client [Puma::Client] + # @param requests [Integer] + # @return [Boolean,:async] + # + def handle_request(client, requests) + env = client.env + io_buffer = client.io_buffer + socket = client.io # io may be a MiniSSL::Socket + app_body = nil + + return false if closed_socket?(socket) + + if client.http_content_length_limit_exceeded + return prepare_response(413, {}, ["Payload Too Large"], requests, client) + end + + normalize_env env, client + + env[PUMA_SOCKET] = socket + + if env[HTTPS_KEY] && socket.peercert + env[PUMA_PEERCERT] = socket.peercert + end + + env[HIJACK_P] = true + env[HIJACK] = client + + env[RACK_INPUT] = client.body + env[RACK_URL_SCHEME] ||= default_server_port(env) == PORT_443 ? HTTPS : HTTP + + if @early_hints + env[EARLY_HINTS] = lambda { |headers| + begin + unless (str = str_early_hints headers).empty? + fast_write_str socket, "HTTP/1.1 103 Early Hints\r\n#{str}\r\n" + end + rescue ConnectionError => e + @log_writer.debug_error e + # noop, if we lost the socket we just won't send the early hints + end + } + end + + req_env_post_parse env + + # A rack extension. If the app writes #call'ables to this + # array, we will invoke them when the request is done. + # + env[RACK_AFTER_REPLY] ||= [] + + begin + if @supported_http_methods == :any || @supported_http_methods.key?(env[REQUEST_METHOD]) + status, headers, app_body = @thread_pool.with_force_shutdown do + @app.call(env) + end + else + @log_writer.log "Unsupported HTTP method used: #{env[REQUEST_METHOD]}" + status, headers, app_body = [501, {}, ["#{env[REQUEST_METHOD]} method is not supported"]] + end + + # app_body needs to always be closed, hold value in case lowlevel_error + # is called + res_body = app_body + + # full hijack, app called env['rack.hijack'] + return :async if client.hijacked + + status = status.to_i + + if status == -1 + unless headers.empty? and res_body == [] + raise "async response must have empty headers and body" + end + + return :async + end + rescue ThreadPool::ForceShutdown => e + @log_writer.unknown_error e, client, "Rack app" + @log_writer.log "Detected force shutdown of a thread" + + status, headers, res_body = lowlevel_error(e, env, 503) + rescue Exception => e + @log_writer.unknown_error e, client, "Rack app" + + status, headers, res_body = lowlevel_error(e, env, 500) + end + prepare_response(status, headers, res_body, requests, client) + ensure + io_buffer.reset + uncork_socket client.io + app_body.close if app_body.respond_to? :close + client&.tempfile_close + if after_reply = env[RACK_AFTER_REPLY] + after_reply.each do |o| + begin + o.call + rescue StandardError => e + @log_writer.debug_error e + end + end + end + end + + # Assembles the headers and prepares the body for actually sending the + # response via `#fast_write_response`. + # + # @param status [Integer] the status returned by the Rack application + # @param headers [Hash] the headers returned by the Rack application + # @param res_body [Array] the body returned by the Rack application or + # a call to `Server#lowlevel_error` + # @param requests [Integer] number of inline requests handled + # @param client [Puma::Client] + # @return [Boolean,:async] keep-alive status or `:async` + def prepare_response(status, headers, res_body, requests, client) + env = client.env + socket = client.io + io_buffer = client.io_buffer + + return false if closed_socket?(socket) + + # Close the connection after a reasonable number of inline requests + # if the server is at capacity and the listener has a new connection ready. + # This allows Puma to service connections fairly when the number + # of concurrent connections exceeds the size of the threadpool. + force_keep_alive = if @enable_keep_alives + requests < @max_fast_inline || + @thread_pool.busy_threads < @max_threads || + !client.listener.to_io.wait_readable(0) + else + # Always set force_keep_alive to false if the server has keep-alives not enabled. + false + end + + resp_info = str_headers(env, status, headers, res_body, io_buffer, force_keep_alive) + + close_body = false + response_hijack = nil + content_length = resp_info[:content_length] + keep_alive = resp_info[:keep_alive] + + if res_body.respond_to?(:each) && !resp_info[:response_hijack] + # below converts app_body into body, dependent on app_body's characteristics, and + # content_length will be set if it can be determined + if !content_length && !resp_info[:transfer_encoding] && status != 204 + if res_body.respond_to?(:to_ary) && (array_body = res_body.to_ary) && + array_body.is_a?(Array) + body = array_body.compact + content_length = body.sum(&:bytesize) + elsif res_body.is_a?(File) && res_body.respond_to?(:size) + body = res_body + content_length = body.size + elsif res_body.respond_to?(:to_path) && (fn = res_body.to_path) && + File.readable?(fn) + body = File.open fn, 'rb' + content_length = body.size + close_body = true + else + body = res_body + end + elsif !res_body.is_a?(::File) && res_body.respond_to?(:to_path) && + (fn = res_body.to_path) && File.readable?(fn = res_body.to_path) + body = File.open fn, 'rb' + content_length = body.size + close_body = true + elsif !res_body.is_a?(::File) && res_body.respond_to?(:filename) && + res_body.respond_to?(:bytesize) && File.readable?(fn = res_body.filename) + # Sprockets::Asset + content_length = res_body.bytesize unless content_length + if (body_str = res_body.to_hash[:source]) + body = [body_str] + else # avoid each and use a File object + body = File.open fn, 'rb' + close_body = true + end + else + body = res_body + end + else + # partial hijack, from Rack spec: + # Servers must ignore the body part of the response tuple when the + # rack.hijack response header is present. + response_hijack = resp_info[:response_hijack] || res_body + end + + line_ending = LINE_END + + cork_socket socket + + if resp_info[:no_body] + # 101 (Switching Protocols) doesn't return here or have content_length, + # it should be using `response_hijack` + unless status == 101 + if content_length && status != 204 + io_buffer.append CONTENT_LENGTH_S, content_length.to_s, line_ending + end + + io_buffer << LINE_END + fast_write_str socket, io_buffer.read_and_reset + socket.flush + return keep_alive + end + else + if content_length + io_buffer.append CONTENT_LENGTH_S, content_length.to_s, line_ending + chunked = false + elsif !response_hijack && resp_info[:allow_chunked] + io_buffer << TRANSFER_ENCODING_CHUNKED + chunked = true + end + end + + io_buffer << line_ending + + # partial hijack, we write headers, then hand the socket to the app via + # response_hijack.call + if response_hijack + fast_write_str socket, io_buffer.read_and_reset + uncork_socket socket + response_hijack.call socket + return :async + end + + fast_write_response socket, body, io_buffer, chunked, content_length.to_i + body.close if close_body + keep_alive + end + + # @param env [Hash] see Puma::Client#env, from request + # @return [Puma::Const::PORT_443,Puma::Const::PORT_80] + # + def default_server_port(env) + if ['on', HTTPS].include?(env[HTTPS_KEY]) || env[HTTP_X_FORWARDED_PROTO].to_s[0...5] == HTTPS || env[HTTP_X_FORWARDED_SCHEME] == HTTPS || env[HTTP_X_FORWARDED_SSL] == "on" + PORT_443 + else + PORT_80 + end + end + + # Used to write 'early hints', 'no body' responses, 'hijacked' responses, + # and body segments (called by `fast_write_response`). + # Writes a string to a socket (normally `Client#io`) using `write_nonblock`. + # Large strings may not be written in one pass, especially if `io` is a + # `MiniSSL::Socket`. + # @param socket [#write_nonblock] the request/response socket + # @param str [String] the string written to the io + # @raise [ConnectionError] + # + def fast_write_str(socket, str) + n = 0 + byte_size = str.bytesize + while n < byte_size + begin + n += socket.write_nonblock(n.zero? ? str : str.byteslice(n..-1)) + rescue Errno::EAGAIN, Errno::EWOULDBLOCK + unless socket.wait_writable WRITE_TIMEOUT + raise ConnectionError, SOCKET_WRITE_ERR_MSG + end + retry + rescue Errno::EPIPE, SystemCallError, IOError + raise ConnectionError, SOCKET_WRITE_ERR_MSG + end + end + end + + # Used to write headers and body. + # Writes to a socket (normally `Client#io`) using `#fast_write_str`. + # Accumulates `body` items into `io_buffer`, then writes to socket. + # @param socket [#write] the response socket + # @param body [Enumerable, File] the body object + # @param io_buffer [Puma::IOBuffer] contains headers + # @param chunked [Boolean] + # @paramn content_length [Integer + # @raise [ConnectionError] + # + def fast_write_response(socket, body, io_buffer, chunked, content_length) + if body.is_a?(::File) && body.respond_to?(:read) + if chunked # would this ever happen? + while chunk = body.read(BODY_LEN_MAX) + io_buffer.append chunk.bytesize.to_s(16), LINE_END, chunk, LINE_END + end + fast_write_str socket, CLOSE_CHUNKED + else + if content_length <= IO_BODY_MAX + io_buffer.write body.read(content_length) + fast_write_str socket, io_buffer.read_and_reset + else + fast_write_str socket, io_buffer.read_and_reset + IO.copy_stream body, socket + end + end + elsif body.is_a?(::Array) && body.length == 1 + body_first = nil + # using body_first = body.first causes issues? + body.each { |str| body_first ||= str } + + if body_first.is_a?(::String) && body_first.bytesize < BODY_LEN_MAX + # smaller body, write to io_buffer first + io_buffer.write body_first + fast_write_str socket, io_buffer.read_and_reset + else + # large body, write both header & body to socket + fast_write_str socket, io_buffer.read_and_reset + fast_write_str socket, body_first + end + elsif body.is_a?(::Array) + # for array bodies, flush io_buffer to socket when size is greater than + # IO_BUFFER_LEN_MAX + if chunked + body.each do |part| + next if (byte_size = part.bytesize).zero? + io_buffer.append byte_size.to_s(16), LINE_END, part, LINE_END + if io_buffer.length > IO_BUFFER_LEN_MAX + fast_write_str socket, io_buffer.read_and_reset + end + end + io_buffer.write CLOSE_CHUNKED + else + body.each do |part| + next if part.bytesize.zero? + io_buffer.write part + if io_buffer.length > IO_BUFFER_LEN_MAX + fast_write_str socket, io_buffer.read_and_reset + end + end + end + # may write last body part for non-chunked, also headers if array is empty + fast_write_str(socket, io_buffer.read_and_reset) unless io_buffer.length.zero? + else + # for enum bodies + if chunked + empty_body = true + body.each do |part| + next if part.nil? || (byte_size = part.bytesize).zero? + empty_body = false + io_buffer.append byte_size.to_s(16), LINE_END, part, LINE_END + fast_write_str socket, io_buffer.read_and_reset + end + if empty_body + io_buffer << CLOSE_CHUNKED + fast_write_str socket, io_buffer.read_and_reset + else + fast_write_str socket, CLOSE_CHUNKED + end + else + fast_write_str socket, io_buffer.read_and_reset + body.each do |part| + next if part.bytesize.zero? + fast_write_str socket, part + end + end + end + socket.flush + rescue Errno::EAGAIN, Errno::EWOULDBLOCK + raise ConnectionError, SOCKET_WRITE_ERR_MSG + rescue Errno::EPIPE, SystemCallError, IOError + raise ConnectionError, SOCKET_WRITE_ERR_MSG + end + + private :fast_write_str, :fast_write_response + + # Given a Hash +env+ for the request read from +client+, add + # and fixup keys to comply with Rack's env guidelines. + # @param env [Hash] see Puma::Client#env, from request + # @param client [Puma::Client] only needed for Client#peerip + # + def normalize_env(env, client) + if host = env[HTTP_HOST] + # host can be a hostname, ipv4 or bracketed ipv6. Followed by an optional port. + if colon = host.rindex("]:") # IPV6 with port + env[SERVER_NAME] = host[0, colon+1] + env[SERVER_PORT] = host[colon+2, host.bytesize] + elsif !host.start_with?("[") && colon = host.index(":") # not hostname or IPV4 with port + env[SERVER_NAME] = host[0, colon] + env[SERVER_PORT] = host[colon+1, host.bytesize] + else + env[SERVER_NAME] = host + env[SERVER_PORT] = default_server_port(env) + end + else + env[SERVER_NAME] = LOCALHOST + env[SERVER_PORT] = default_server_port(env) + end + + unless env[REQUEST_PATH] + # it might be a dumbass full host request header + uri = begin + URI.parse(env[REQUEST_URI]) + rescue URI::InvalidURIError + raise Puma::HttpParserError + end + env[REQUEST_PATH] = uri.path + + # A nil env value will cause a LintError (and fatal errors elsewhere), + # so only set the env value if there actually is a value. + env[QUERY_STRING] = uri.query if uri.query + end + + env[PATH_INFO] = env[REQUEST_PATH].to_s # #to_s in case it's nil + + # From https://www.ietf.org/rfc/rfc3875 : + # "Script authors should be aware that the REMOTE_ADDR and + # REMOTE_HOST meta-variables (see sections 4.1.8 and 4.1.9) + # may not identify the ultimate source of the request. + # They identify the client for the immediate request to the + # server; that client may be a proxy, gateway, or other + # intermediary acting on behalf of the actual source client." + # + + unless env.key?(REMOTE_ADDR) + begin + addr = client.peerip + rescue Errno::ENOTCONN + # Client disconnects can result in an inability to get the + # peeraddr from the socket; default to unspec. + if client.peer_family == Socket::AF_INET6 + addr = UNSPECIFIED_IPV6 + else + addr = UNSPECIFIED_IPV4 + end + end + + # Set unix socket addrs to localhost + if addr.empty? + if client.peer_family == Socket::AF_INET6 + addr = LOCALHOST_IPV6 + else + addr = LOCALHOST_IPV4 + end + end + + env[REMOTE_ADDR] = addr + end + + # The legacy HTTP_VERSION header can be sent as a client header. + # Rack v4 may remove using HTTP_VERSION. If so, remove this line. + env[HTTP_VERSION] = env[SERVER_PROTOCOL] + end + private :normalize_env + + # @param header_key [#to_s] + # @return [Boolean] + # + def illegal_header_key?(header_key) + !!(ILLEGAL_HEADER_KEY_REGEX =~ header_key.to_s) + end + + # @param header_value [#to_s] + # @return [Boolean] + # + def illegal_header_value?(header_value) + !!(ILLEGAL_HEADER_VALUE_REGEX =~ header_value.to_s) + end + private :illegal_header_key?, :illegal_header_value? + + # Fixup any headers with `,` in the name to have `_` now. We emit + # headers with `,` in them during the parse phase to avoid ambiguity + # with the `-` to `_` conversion for critical headers. But here for + # compatibility, we'll convert them back. This code is written to + # avoid allocation in the common case (ie there are no headers + # with `,` in their names), that's why it has the extra conditionals. + # + # @note If a normalized version of a `,` header already exists, we ignore + # the `,` version. This prevents clobbering headers managed by proxies + # but not by clients (Like X-Forwarded-For). + # + # @param env [Hash] see Puma::Client#env, from request, modifies in place + # @version 5.0.3 + # + def req_env_post_parse(env) + to_delete = nil + to_add = nil + + env.each do |k,v| + if k.start_with?("HTTP_") && k.include?(",") && !UNMASKABLE_HEADERS.key?(k) + if to_delete + to_delete << k + else + to_delete = [k] + end + + new_k = k.tr(",", "_") + if env.key?(new_k) + next + end + + unless to_add + to_add = {} + end + + to_add[new_k] = v + end + end + + if to_delete # rubocop:disable Style/SafeNavigation + to_delete.each { |k| env.delete(k) } + end + + if to_add + env.merge! to_add + end + end + private :req_env_post_parse + + # Used in the lambda for env[ `Puma::Const::EARLY_HINTS` ] + # @param headers [Hash] the headers returned by the Rack application + # @return [String] + # @version 5.0.3 + # + def str_early_hints(headers) + eh_str = +"" + headers.each_pair do |k, vs| + next if illegal_header_key?(k) + + if vs.respond_to?(:to_s) && !vs.to_s.empty? + vs.to_s.split(NEWLINE).each do |v| + next if illegal_header_value?(v) + eh_str << "#{k}: #{v}\r\n" + end + elsif !(vs.to_s.empty? || !illegal_header_value?(vs)) + eh_str << "#{k}: #{vs}\r\n" + end + end + eh_str.freeze + end + private :str_early_hints + + # @param status [Integer] status from the app + # @return [String] the text description from Puma::HTTP_STATUS_CODES + # + def fetch_status_code(status) + HTTP_STATUS_CODES.fetch(status) { CUSTOM_STAT } + end + private :fetch_status_code + + # Processes and write headers to the IOBuffer. + # @param env [Hash] see Puma::Client#env, from request + # @param status [Integer] the status returned by the Rack application + # @param headers [Hash] the headers returned by the Rack application + # @param content_length [Integer,nil] content length if it can be determined from the + # response body + # @param io_buffer [Puma::IOBuffer] modified inn place + # @param force_keep_alive [Boolean] 'anded' with keep_alive, based on system + # status and `@max_fast_inline` + # @return [Hash] resp_info + # @version 5.0.3 + # + def str_headers(env, status, headers, res_body, io_buffer, force_keep_alive) + + line_ending = LINE_END + colon = COLON + + resp_info = {} + resp_info[:no_body] = env[REQUEST_METHOD] == HEAD + + http_11 = env[SERVER_PROTOCOL] == HTTP_11 + if http_11 + resp_info[:allow_chunked] = true + resp_info[:keep_alive] = env.fetch(HTTP_CONNECTION, "").downcase != CLOSE + + # An optimization. The most common response is 200, so we can + # reply with the proper 200 status without having to compute + # the response header. + # + if status == 200 + io_buffer << HTTP_11_200 + else + io_buffer.append "#{HTTP_11} #{status} ", fetch_status_code(status), line_ending + + resp_info[:no_body] ||= status < 200 || STATUS_WITH_NO_ENTITY_BODY[status] + end + else + resp_info[:allow_chunked] = false + resp_info[:keep_alive] = env.fetch(HTTP_CONNECTION, "").downcase == KEEP_ALIVE + + # Same optimization as above for HTTP/1.1 + # + if status == 200 + io_buffer << HTTP_10_200 + else + io_buffer.append "HTTP/1.0 #{status} ", + fetch_status_code(status), line_ending + + resp_info[:no_body] ||= status < 200 || STATUS_WITH_NO_ENTITY_BODY[status] + end + end + + # regardless of what the client wants, we always close the connection + # if running without request queueing + resp_info[:keep_alive] &&= @queue_requests + + # see prepare_response + resp_info[:keep_alive] &&= force_keep_alive + + resp_info[:response_hijack] = nil + + headers.each do |k, vs| + next if illegal_header_key?(k) + + case k.downcase + when CONTENT_LENGTH2 + next if illegal_header_value?(vs) + # nil.to_i is 0, nil&.to_i is nil + resp_info[:content_length] = vs&.to_i + next + when TRANSFER_ENCODING + resp_info[:allow_chunked] = false + resp_info[:content_length] = nil + resp_info[:transfer_encoding] = vs + when HIJACK + resp_info[:response_hijack] = vs + next + when BANNED_HEADER_KEY + next + end + + ary = if vs.is_a?(::Array) && !vs.empty? + vs + elsif vs.respond_to?(:to_s) && !vs.to_s.empty? + vs.to_s.split NEWLINE + else + nil + end + if ary + ary.each do |v| + next if illegal_header_value?(v) + io_buffer.append k, colon, v, line_ending + end + else + io_buffer.append k, colon, line_ending + end + end + + # HTTP/1.1 & 1.0 assume different defaults: + # - HTTP 1.0 assumes the connection will be closed if not specified + # - HTTP 1.1 assumes the connection will be kept alive if not specified. + # Only set the header if we're doing something which is not the default + # for this protocol version + if http_11 + io_buffer << CONNECTION_CLOSE if !resp_info[:keep_alive] + else + io_buffer << CONNECTION_KEEP_ALIVE if resp_info[:keep_alive] + end + resp_info + end + private :str_headers + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/runner.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/runner.rb new file mode 100644 index 0000000..2b8a969 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/runner.rb @@ -0,0 +1,220 @@ +# frozen_string_literal: true + +require_relative 'server' +require_relative 'const' + +module Puma + # Generic class that is used by `Puma::Cluster` and `Puma::Single` to + # serve requests. This class spawns a new instance of `Puma::Server` via + # a call to `start_server`. + class Runner + + include ::Puma::Const::PipeRequest + + def initialize(launcher) + @launcher = launcher + @log_writer = launcher.log_writer + @events = launcher.events + @config = launcher.config + @options = launcher.options + @app = nil + @control = nil + @started_at = Time.now + @wakeup = nil + end + + # Returns the hash of configuration options. + # @return [Puma::UserFileDefaultOptions] + attr_reader :options + + def wakeup! + return unless @wakeup + + @wakeup.write PIPE_WAKEUP unless @wakeup.closed? + + rescue SystemCallError, IOError + Puma::Util.purge_interrupt_queue + end + + def development? + @options[:environment] == "development" + end + + def test? + @options[:environment] == "test" + end + + def log(str) + @log_writer.log str + end + + # @version 5.0.0 + def stop_control + @control&.stop true + end + + def error(str) + @log_writer.error str + end + + def debug(str) + @log_writer.log "- #{str}" if @options[:debug] + end + + def start_control + str = @options[:control_url] + return unless str + + require_relative 'app/status' + + if token = @options[:control_auth_token] + token = nil if token.empty? || token == 'none' + end + + app = Puma::App::Status.new @launcher, token + + # A Reactor is not created and nio4r is not loaded when 'queue_requests: false' + # Use `nil` for events, no hooks in control server + control = Puma::Server.new app, nil, + { min_threads: 0, max_threads: 1, queue_requests: false, log_writer: @log_writer } + + begin + control.binder.parse [str], nil, 'Starting control server' + rescue Errno::EADDRINUSE, Errno::EACCES => e + raise e, "Error: Control server address '#{str}' is already in use. Original error: #{e.message}" + end + + control.run thread_name: 'ctl' + @control = control + end + + # @version 5.0.0 + def close_control_listeners + @control.binder.close_listeners if @control + end + + # @!attribute [r] ruby_engine + # @deprecated Use `RUBY_DESCRIPTION` instead + def ruby_engine + warn "Puma::Runner#ruby_engine is deprecated; use RUBY_DESCRIPTION instead. It will be removed in puma v7." + + if !defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby" + "ruby #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}" + else + if defined?(RUBY_ENGINE_VERSION) + "#{RUBY_ENGINE} #{RUBY_ENGINE_VERSION} - ruby #{RUBY_VERSION}" + else + "#{RUBY_ENGINE} #{RUBY_VERSION}" + end + end + end + + def output_header(mode) + min_t = @options[:min_threads] + max_t = @options[:max_threads] + environment = @options[:environment] + + log "Puma starting in #{mode} mode..." + log "* Puma version: #{Puma::Const::PUMA_VERSION} (\"#{Puma::Const::CODE_NAME}\")" + log "* Ruby version: #{RUBY_DESCRIPTION}" + log "* Min threads: #{min_t}" + log "* Max threads: #{max_t}" + log "* Environment: #{environment}" + + if mode == "cluster" + log "* Master PID: #{Process.pid}" + else + log "* PID: #{Process.pid}" + end + end + + def redirected_io? + @options[:redirect_stdout] || @options[:redirect_stderr] + end + + def redirect_io + stdout = @options[:redirect_stdout] + stderr = @options[:redirect_stderr] + append = @options[:redirect_append] + + if stdout + ensure_output_directory_exists(stdout, 'STDOUT') + + STDOUT.reopen stdout, (append ? "a" : "w") + STDOUT.puts "=== puma startup: #{Time.now} ===" + STDOUT.flush unless STDOUT.sync + end + + if stderr + ensure_output_directory_exists(stderr, 'STDERR') + + STDERR.reopen stderr, (append ? "a" : "w") + STDERR.puts "=== puma startup: #{Time.now} ===" + STDERR.flush unless STDERR.sync + end + + if @options[:mutate_stdout_and_stderr_to_sync_on_write] + STDOUT.sync = true + STDERR.sync = true + end + end + + def load_and_bind + unless @config.app_configured? + error "No application configured, nothing to run" + exit 1 + end + + begin + @app = @config.app + rescue Exception => e + log "! Unable to load application: #{e.class}: #{e.message}" + raise e + end + + @launcher.binder.parse @options[:binds] + end + + # @!attribute [r] app + def app + @app ||= @config.app + end + + def start_server + server = Puma::Server.new(app, @events, @options) + server.inherit_binder(@launcher.binder) + server + end + + private + def ensure_output_directory_exists(path, io_name) + unless Dir.exist?(File.dirname(path)) + raise "Cannot redirect #{io_name} to #{path}" + end + end + + def utc_iso8601(val) + "#{val.utc.strftime '%FT%T'}Z" + end + + def stats + { + versions: { + puma: Puma::Const::PUMA_VERSION, + ruby: { + engine: RUBY_ENGINE, + version: RUBY_VERSION, + patchlevel: RUBY_PATCHLEVEL + } + } + } + end + + # this method call should always be guarded by `@log_writer.debug?` + def debug_loaded_extensions(str) + @log_writer.debug "────────────────────────────────── #{str}" + re_ext = /\.#{RbConfig::CONFIG['DLEXT']}\z/i + $LOADED_FEATURES.grep(re_ext).each { |f| @log_writer.debug(" #{f}") } + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/sd_notify.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/sd_notify.rb new file mode 100644 index 0000000..7001fd0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/sd_notify.rb @@ -0,0 +1,146 @@ +# frozen_string_literal: true + +require "socket" + +module Puma + # The MIT License + # + # Copyright (c) 2017-2022 Agis Anastasopoulos + # + # Permission is hereby granted, free of charge, to any person obtaining a copy of + # this software and associated documentation files (the "Software"), to deal in + # the Software without restriction, including without limitation the rights to + # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + # the Software, and to permit persons to whom the Software is furnished to do so, + # subject to the following conditions: + # + # The above copyright notice and this permission notice shall be included in all + # copies or substantial portions of the Software. + # + # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + # + # This is a copy of https://github.com/agis/ruby-sdnotify as of commit cca575c + # The only changes made was "rehoming" it within the Puma module to avoid + # namespace collisions and applying standard's code formatting style. + # + # SdNotify is a pure-Ruby implementation of sd_notify(3). It can be used to + # notify systemd about state changes. Methods of this package are no-op on + # non-systemd systems (eg. Darwin). + # + # The API maps closely to the original implementation of sd_notify(3), + # therefore be sure to check the official man pages prior to using SdNotify. + # + # @see https://www.freedesktop.org/software/systemd/man/sd_notify.html + module SdNotify + # Exception raised when there's an error writing to the notification socket + class NotifyError < RuntimeError; end + + READY = "READY=1" + RELOADING = "RELOADING=1" + STOPPING = "STOPPING=1" + STATUS = "STATUS=" + ERRNO = "ERRNO=" + MAINPID = "MAINPID=" + WATCHDOG = "WATCHDOG=1" + FDSTORE = "FDSTORE=1" + + def self.ready(unset_env=false) + notify(READY, unset_env) + end + + def self.reloading(unset_env=false) + notify(RELOADING, unset_env) + end + + def self.stopping(unset_env=false) + notify(STOPPING, unset_env) + end + + # @param status [String] a custom status string that describes the current + # state of the service + def self.status(status, unset_env=false) + notify("#{STATUS}#{status}", unset_env) + end + + # @param errno [Integer] + def self.errno(errno, unset_env=false) + notify("#{ERRNO}#{errno}", unset_env) + end + + # @param pid [Integer] + def self.mainpid(pid, unset_env=false) + notify("#{MAINPID}#{pid}", unset_env) + end + + def self.watchdog(unset_env=false) + notify(WATCHDOG, unset_env) + end + + def self.fdstore(unset_env=false) + notify(FDSTORE, unset_env) + end + + # @param [Boolean] true if the service manager expects watchdog keep-alive + # notification messages to be sent from this process. + # + # If the $WATCHDOG_USEC environment variable is set, + # and the $WATCHDOG_PID variable is unset or set to the PID of the current + # process + # + # @note Unlike sd_watchdog_enabled(3), this method does not mutate the + # environment. + def self.watchdog? + wd_usec = ENV["WATCHDOG_USEC"] + wd_pid = ENV["WATCHDOG_PID"] + + return false if !wd_usec + + begin + wd_usec = Integer(wd_usec) + rescue + return false + end + + return false if wd_usec <= 0 + return true if !wd_pid || wd_pid == $$.to_s + + false + end + + # Notify systemd with the provided state, via the notification socket, if + # any. + # + # Generally this method will be used indirectly through the other methods + # of the library. + # + # @param state [String] + # @param unset_env [Boolean] + # + # @return [Fixnum, nil] the number of bytes written to the notification + # socket or nil if there was no socket to report to (eg. the program wasn't + # started by systemd) + # + # @raise [NotifyError] if there was an error communicating with the systemd + # socket + # + # @see https://www.freedesktop.org/software/systemd/man/sd_notify.html + def self.notify(state, unset_env=false) + sock = ENV["NOTIFY_SOCKET"] + + return nil if !sock + + ENV.delete("NOTIFY_SOCKET") if unset_env + + begin + Addrinfo.unix(sock, :DGRAM).connect { |s| s.write state } + rescue StandardError => e + raise NotifyError, "#{e.class}: #{e.message}", e.backtrace + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/server.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/server.rb new file mode 100644 index 0000000..02e2748 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/server.rb @@ -0,0 +1,688 @@ +# frozen_string_literal: true + +require 'stringio' + +require_relative 'thread_pool' +require_relative 'const' +require_relative 'log_writer' +require_relative 'events' +require_relative 'null_io' +require_relative 'reactor' +require_relative 'client' +require_relative 'binder' +require_relative 'util' +require_relative 'request' + +require 'socket' +require 'io/wait' unless Puma::HAS_NATIVE_IO_WAIT + +module Puma + + # This method was private on Ruby 2.4 but became public on Ruby 2.5+: + Thread.send(:attr_accessor, :puma_server) + + # The HTTP Server itself. Serves out a single Rack app. + # + # This class is used by the `Puma::Single` and `Puma::Cluster` classes + # to generate one or more `Puma::Server` instances capable of handling requests. + # Each Puma process will contain one `Puma::Server` instance. + # + # The `Puma::Server` instance pulls requests from the socket, adds them to a + # `Puma::Reactor` where they get eventually passed to a `Puma::ThreadPool`. + # + # Each `Puma::Server` will have one reactor and one thread pool. + class Server + include Puma::Const + include Request + + attr_reader :options + attr_reader :thread + attr_reader :log_writer + attr_reader :events + attr_reader :min_threads, :max_threads # for #stats + attr_reader :requests_count # @version 5.0.0 + + # @todo the following may be deprecated in the future + attr_reader :auto_trim_time, :early_hints, :first_data_timeout, + :leak_stack_on_error, + :persistent_timeout, :reaping_time + + attr_accessor :app + attr_accessor :binder + + + # Create a server for the rack app +app+. + # + # +log_writer+ is a Puma::LogWriter object used to log info and error messages. + # + # +events+ is a Puma::Events object used to notify application status events. + # + # Server#run returns a thread that you can join on to wait for the server + # to do its work. + # + # @note Several instance variables exist so they are available for testing, + # and have default values set via +fetch+. Normally the values are set via + # `::Puma::Configuration.puma_default_options`. + # + # @note The `events` parameter is set to nil, and set to `Events.new` in code. + # Often `options` needs to be passed, but `events` does not. Using nil allows + # calling code to not require events.rb. + # + def initialize(app, events = nil, options = {}) + @app = app + @events = events || Events.new + + @check, @notify = nil + @status = :stop + + @thread = nil + @thread_pool = nil + + @options = if options.is_a?(UserFileDefaultOptions) + options + else + UserFileDefaultOptions.new(options, Configuration::DEFAULTS) + end + + @clustered = (@options.fetch :workers, 0) > 0 + @worker_write = @options[:worker_write] + @log_writer = @options.fetch :log_writer, LogWriter.stdio + @early_hints = @options[:early_hints] + @first_data_timeout = @options[:first_data_timeout] + @persistent_timeout = @options[:persistent_timeout] + @idle_timeout = @options[:idle_timeout] + @min_threads = @options[:min_threads] + @max_threads = @options[:max_threads] + @queue_requests = @options[:queue_requests] + @max_fast_inline = @options[:max_fast_inline] + @enable_keep_alives = @options[:enable_keep_alives] + @io_selector_backend = @options[:io_selector_backend] + @http_content_length_limit = @options[:http_content_length_limit] + + # make this a hash, since we prefer `key?` over `include?` + @supported_http_methods = + if @options[:supported_http_methods] == :any + :any + else + if (ary = @options[:supported_http_methods]) + ary + else + SUPPORTED_HTTP_METHODS + end.sort.product([nil]).to_h.freeze + end + + temp = !!(@options[:environment] =~ /\A(development|test)\z/) + @leak_stack_on_error = @options[:environment] ? temp : true + + @binder = Binder.new(log_writer) + + ENV['RACK_ENV'] ||= "development" + + @mode = :http + + @precheck_closing = true + + @requests_count = 0 + + @idle_timeout_reached = false + end + + def inherit_binder(bind) + @binder = bind + end + + class << self + # @!attribute [r] current + def current + Thread.current.puma_server + end + + # :nodoc: + # @version 5.0.0 + def tcp_cork_supported? + Socket.const_defined?(:TCP_CORK) && Socket.const_defined?(:IPPROTO_TCP) + end + + # :nodoc: + # @version 5.0.0 + def closed_socket_supported? + Socket.const_defined?(:TCP_INFO) && Socket.const_defined?(:IPPROTO_TCP) + end + private :tcp_cork_supported? + private :closed_socket_supported? + end + + # On Linux, use TCP_CORK to better control how the TCP stack + # packetizes our stream. This improves both latency and throughput. + # socket parameter may be an MiniSSL::Socket, so use to_io + # + if tcp_cork_supported? + # 6 == Socket::IPPROTO_TCP + # 3 == TCP_CORK + # 1/0 == turn on/off + def cork_socket(socket) + skt = socket.to_io + begin + skt.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_CORK, 1) if skt.kind_of? TCPSocket + rescue IOError, SystemCallError + Puma::Util.purge_interrupt_queue + end + end + + def uncork_socket(socket) + skt = socket.to_io + begin + skt.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_CORK, 0) if skt.kind_of? TCPSocket + rescue IOError, SystemCallError + Puma::Util.purge_interrupt_queue + end + end + else + def cork_socket(socket) + end + + def uncork_socket(socket) + end + end + + if closed_socket_supported? + UNPACK_TCP_STATE_FROM_TCP_INFO = "C".freeze + + def closed_socket?(socket) + skt = socket.to_io + return false unless skt.kind_of?(TCPSocket) && @precheck_closing + + begin + tcp_info = skt.getsockopt(Socket::IPPROTO_TCP, Socket::TCP_INFO) + rescue IOError, SystemCallError + Puma::Util.purge_interrupt_queue + @precheck_closing = false + false + else + state = tcp_info.unpack(UNPACK_TCP_STATE_FROM_TCP_INFO)[0] + # TIME_WAIT: 6, CLOSE: 7, CLOSE_WAIT: 8, LAST_ACK: 9, CLOSING: 11 + (state >= 6 && state <= 9) || state == 11 + end + end + else + def closed_socket?(socket) + false + end + end + + # @!attribute [r] backlog + def backlog + @thread_pool&.backlog + end + + # @!attribute [r] running + def running + @thread_pool&.spawned + end + + + # This number represents the number of requests that + # the server is capable of taking right now. + # + # For example if the number is 5 then it means + # there are 5 threads sitting idle ready to take + # a request. If one request comes in, then the + # value would be 4 until it finishes processing. + # @!attribute [r] pool_capacity + def pool_capacity + @thread_pool&.pool_capacity + end + + # @!attribute [r] busy_threads + def busy_threads + @thread_pool&.busy_threads + end + + # Runs the server. + # + # If +background+ is true (the default) then a thread is spun + # up in the background to handle requests. Otherwise requests + # are handled synchronously. + # + def run(background=true, thread_name: 'srv') + BasicSocket.do_not_reverse_lookup = true + + @events.fire :state, :booting + + @status = :run + + @thread_pool = ThreadPool.new(thread_name, options) { |client| process_client client } + + if @queue_requests + @reactor = Reactor.new(@io_selector_backend) { |c| reactor_wakeup c } + @reactor.run + end + + @thread_pool.auto_reap! if options[:reaping_time] + @thread_pool.auto_trim! if @min_threads != @max_threads && options[:auto_trim_time] + + @check, @notify = Puma::Util.pipe unless @notify + + @events.fire :state, :running + + if background + @thread = Thread.new do + Puma.set_thread_name thread_name + handle_servers + end + return @thread + else + handle_servers + end + end + + # This method is called from the Reactor thread when a queued Client receives data, + # times out, or when the Reactor is shutting down. + # + # It is responsible for ensuring that a request has been completely received + # before it starts to be processed by the ThreadPool. This may be known as read buffering. + # If read buffering is not done, and no other read buffering is performed (such as by an application server + # such as nginx) then the application would be subject to a slow client attack. + # + # For a graphical representation of how the request buffer works see [architecture.md](https://github.com/puma/puma/blob/master/docs/architecture.md#connection-pipeline). + # + # The method checks to see if it has the full header and body with + # the `Puma::Client#try_to_finish` method. If the full request has been sent, + # then the request is passed to the ThreadPool (`@thread_pool << client`) + # so that a "worker thread" can pick up the request and begin to execute application logic. + # The Client is then removed from the reactor (return `true`). + # + # If a client object times out, a 408 response is written, its connection is closed, + # and the object is removed from the reactor (return `true`). + # + # If the Reactor is shutting down, all Clients are either timed out or passed to the + # ThreadPool, depending on their current state (#can_close?). + # + # Otherwise, if the full request is not ready then the client will remain in the reactor + # (return `false`). When the client sends more data to the socket the `Puma::Client` object + # will wake up and again be checked to see if it's ready to be passed to the thread pool. + def reactor_wakeup(client) + shutdown = !@queue_requests + if client.try_to_finish || (shutdown && !client.can_close?) + @thread_pool << client + elsif shutdown || client.timeout == 0 + client.timeout! + else + client.set_timeout(@first_data_timeout) + false + end + rescue StandardError => e + client_error(e, client) + client.close + true + end + + def handle_servers + begin + check = @check + sockets = [check] + @binder.ios + pool = @thread_pool + queue_requests = @queue_requests + drain = options[:drain_on_shutdown] ? 0 : nil + + addr_send_name, addr_value = case options[:remote_address] + when :value + [:peerip=, options[:remote_address_value]] + when :header + [:remote_addr_header=, options[:remote_address_header]] + when :proxy_protocol + [:expect_proxy_proto=, options[:remote_address_proxy_protocol]] + else + [nil, nil] + end + + while @status == :run || (drain && shutting_down?) + begin + ios = IO.select sockets, nil, nil, (shutting_down? ? 0 : @idle_timeout) + unless ios + unless shutting_down? + @idle_timeout_reached = true + + if @clustered + @worker_write << "#{PipeRequest::PIPE_IDLE}#{Process.pid}\n" rescue nil + next + else + @log_writer.log "- Idle timeout reached" + @status = :stop + end + end + + break + end + + if @idle_timeout_reached && @clustered + @idle_timeout_reached = false + @worker_write << "#{PipeRequest::PIPE_IDLE}#{Process.pid}\n" rescue nil + end + + ios.first.each do |sock| + if sock == check + break if handle_check + else + pool.wait_until_not_full + pool.wait_for_less_busy_worker(options[:wait_for_less_busy_worker]) if @clustered + + io = begin + sock.accept_nonblock + rescue IO::WaitReadable + next + end + drain += 1 if shutting_down? + pool << Client.new(io, @binder.env(sock)).tap { |c| + c.listener = sock + c.http_content_length_limit = @http_content_length_limit + c.send(addr_send_name, addr_value) if addr_value + } + end + end + rescue IOError, Errno::EBADF + # In the case that any of the sockets are unexpectedly close. + raise + rescue StandardError => e + @log_writer.unknown_error e, nil, "Listen loop" + end + end + + @log_writer.debug "Drained #{drain} additional connections." if drain + @events.fire :state, @status + + if queue_requests + @queue_requests = false + @reactor.shutdown + end + + graceful_shutdown if @status == :stop || @status == :restart + rescue Exception => e + @log_writer.unknown_error e, nil, "Exception handling servers" + ensure + # Errno::EBADF is infrequently raised + [@check, @notify].each do |io| + begin + io.close unless io.closed? + rescue Errno::EBADF + end + end + @notify = nil + @check = nil + end + + @events.fire :state, :done + end + + # :nodoc: + def handle_check + cmd = @check.read(1) + + case cmd + when STOP_COMMAND + @status = :stop + return true + when HALT_COMMAND + @status = :halt + return true + when RESTART_COMMAND + @status = :restart + return true + end + + false + end + + # Given a connection on +client+, handle the incoming requests, + # or queue the connection in the Reactor if no request is available. + # + # This method is called from a ThreadPool worker thread. + # + # This method supports HTTP Keep-Alive so it may, depending on if the client + # indicates that it supports keep alive, wait for another request before + # returning. + # + # Return true if one or more requests were processed. + def process_client(client) + # Advertise this server into the thread + Thread.current.puma_server = self + + clean_thread_locals = options[:clean_thread_locals] + close_socket = true + + requests = 0 + + begin + if @queue_requests && + !client.eagerly_finish + + client.set_timeout(@first_data_timeout) + if @reactor.add client + close_socket = false + return false + end + end + + with_force_shutdown(client) do + client.finish(@first_data_timeout) + end + + while true + @requests_count += 1 + case handle_request(client, requests + 1) + when false + break + when :async + close_socket = false + break + when true + ThreadPool.clean_thread_locals if clean_thread_locals + + requests += 1 + + # As an optimization, try to read the next request from the + # socket for a short time before returning to the reactor. + fast_check = @status == :run + + # Always pass the client back to the reactor after a reasonable + # number of inline requests if there are other requests pending. + fast_check = false if requests >= @max_fast_inline && + @thread_pool.backlog > 0 + + next_request_ready = with_force_shutdown(client) do + client.reset(fast_check) + end + + unless next_request_ready + break unless @queue_requests + client.set_timeout @persistent_timeout + if @reactor.add client + close_socket = false + break + end + end + end + end + true + rescue StandardError => e + client_error(e, client, requests) + # The ensure tries to close +client+ down + requests > 0 + ensure + client.io_buffer.reset + + begin + client.close if close_socket + rescue IOError, SystemCallError + Puma::Util.purge_interrupt_queue + # Already closed + rescue StandardError => e + @log_writer.unknown_error e, nil, "Client" + end + end + end + + # Triggers a client timeout if the thread-pool shuts down + # during execution of the provided block. + def with_force_shutdown(client, &block) + @thread_pool.with_force_shutdown(&block) + rescue ThreadPool::ForceShutdown + client.timeout! + end + + # :nocov: + + # Handle various error types thrown by Client I/O operations. + def client_error(e, client, requests = 1) + # Swallow, do not log + return if [ConnectionError, EOFError].include?(e.class) + + case e + when MiniSSL::SSLError + lowlevel_error(e, client.env) + @log_writer.ssl_error e, client.io + when HttpParserError + response_to_error(client, requests, e, 400) + @log_writer.parse_error e, client + when HttpParserError501 + response_to_error(client, requests, e, 501) + @log_writer.parse_error e, client + else + response_to_error(client, requests, e, 500) + @log_writer.unknown_error e, nil, "Read" + end + end + + # A fallback rack response if +@app+ raises as exception. + # + def lowlevel_error(e, env, status=500) + if handler = options[:lowlevel_error_handler] + if handler.arity == 1 + return handler.call(e) + elsif handler.arity == 2 + return handler.call(e, env) + else + return handler.call(e, env, status) + end + end + + if @leak_stack_on_error + backtrace = e.backtrace.nil? ? '' : e.backtrace.join("\n") + [status, {}, ["Puma caught this error: #{e.message} (#{e.class})\n#{backtrace}"]] + else + [status, {}, [""]] + end + end + + def response_to_error(client, requests, err, status_code) + status, headers, res_body = lowlevel_error(err, client.env, status_code) + prepare_response(status, headers, res_body, requests, client) + end + private :response_to_error + + # Wait for all outstanding requests to finish. + # + def graceful_shutdown + if options[:shutdown_debug] + threads = Thread.list + total = threads.size + + pid = Process.pid + + $stdout.syswrite "#{pid}: === Begin thread backtrace dump ===\n" + + threads.each_with_index do |t,i| + $stdout.syswrite "#{pid}: Thread #{i+1}/#{total}: #{t.inspect}\n" + $stdout.syswrite "#{pid}: #{t.backtrace.join("\n#{pid}: ")}\n\n" + end + $stdout.syswrite "#{pid}: === End thread backtrace dump ===\n" + end + + if @status != :restart + @binder.close + end + + if @thread_pool + if timeout = options[:force_shutdown_after] + @thread_pool.shutdown timeout.to_f + else + @thread_pool.shutdown + end + end + end + + def notify_safely(message) + @notify << message + rescue IOError, NoMethodError, Errno::EPIPE, Errno::EBADF + # The server, in another thread, is shutting down + Puma::Util.purge_interrupt_queue + rescue RuntimeError => e + # Temporary workaround for https://bugs.ruby-lang.org/issues/13239 + if e.message.include?('IOError') + Puma::Util.purge_interrupt_queue + else + raise e + end + end + private :notify_safely + + # Stops the acceptor thread and then causes the worker threads to finish + # off the request queue before finally exiting. + + def stop(sync=false) + notify_safely(STOP_COMMAND) + @thread.join if @thread && sync + end + + def halt(sync=false) + notify_safely(HALT_COMMAND) + @thread.join if @thread && sync + end + + def begin_restart(sync=false) + notify_safely(RESTART_COMMAND) + @thread.join if @thread && sync + end + + def shutting_down? + @status == :stop || @status == :restart + end + + # List of methods invoked by #stats. + # @version 5.0.0 + STAT_METHODS = [:backlog, :running, :pool_capacity, :max_threads, :requests_count, :busy_threads].freeze + + # Returns a hash of stats about the running server for reporting purposes. + # @version 5.0.0 + # @!attribute [r] stats + # @return [Hash] hash containing stat info from `Server` and `ThreadPool` + def stats + stats = @thread_pool&.stats || {} + stats[:max_threads] = @max_threads + stats[:requests_count] = @requests_count + stats + end + + # below are 'delegations' to binder + # remove in Puma 7? + + + def add_tcp_listener(host, port, optimize_for_latency = true, backlog = 1024) + @binder.add_tcp_listener host, port, optimize_for_latency, backlog + end + + def add_ssl_listener(host, port, ctx, optimize_for_latency = true, + backlog = 1024) + @binder.add_ssl_listener host, port, ctx, optimize_for_latency, backlog + end + + def add_unix_listener(path, umask = nil, mode = nil, backlog = 1024) + @binder.add_unix_listener path, umask, mode, backlog + end + + # @!attribute [r] connected_ports + def connected_ports + @binder.connected_ports + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/single.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/single.rb new file mode 100644 index 0000000..cafe9fd --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/single.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +require_relative 'runner' +require_relative 'detect' +require_relative 'plugin' + +module Puma + # This class is instantiated by the `Puma::Launcher` and used + # to boot and serve a Ruby application when no puma "workers" are needed + # i.e. only using "threaded" mode. For example `$ puma -t 1:5` + # + # At the core of this class is running an instance of `Puma::Server` which + # gets created via the `start_server` method from the `Puma::Runner` class + # that this inherits from. + class Single < Runner + # @!attribute [r] stats + def stats + { + started_at: utc_iso8601(@started_at) + }.merge(@server&.stats || {}).merge(super) + end + + def restart + @server&.begin_restart + end + + def stop + @server&.stop false + end + + def halt + @server&.halt + end + + def stop_blocked + log "- Gracefully stopping, waiting for requests to finish" + @control&.stop true + @server&.stop true + end + + def run + output_header "single" + + load_and_bind + + Plugins.fire_background + + @launcher.write_state + + start_control + + @server = server = start_server + server_thread = server.run + + log "Use Ctrl-C to stop" + redirect_io + + @events.fire_on_booted! + + debug_loaded_extensions("Loaded Extensions:") if @log_writer.debug? + + begin + server_thread.join + rescue Interrupt + # Swallow it + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/state_file.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/state_file.rb new file mode 100644 index 0000000..7f6ddbc --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/state_file.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +module Puma + + # Puma::Launcher uses StateFile to write a yaml file for use with Puma::ControlCLI. + # + # In previous versions of Puma, YAML was used to read/write the state file. + # Since Puma is similar to Bundler/RubyGems in that it may load before one's app + # does, minimizing the dependencies that may be shared with the app is desired. + # + # At present, it only works with numeric and string values. It is still a valid + # yaml file, and the CI tests parse it with Psych. + # + class StateFile + + ALLOWED_FIELDS = %w!control_url control_auth_token pid running_from! + + def initialize + @options = {} + end + + def save(path, permission = nil) + contents = +"---\n" + @options.each do |k,v| + next unless ALLOWED_FIELDS.include? k + case v + when Numeric + contents << "#{k}: #{v}\n" + when String + next if v.strip.empty? + contents << (k == 'running_from' || v.to_s.include?(' ') ? + "#{k}: \"#{v}\"\n" : "#{k}: #{v}\n") + end + end + if permission + File.write path, contents, mode: 'wb:UTF-8' + else + File.write path, contents, mode: 'wb:UTF-8', perm: permission + end + end + + def load(path) + File.read(path).lines.each do |line| + next if line.start_with? '#' + k,v = line.split ':', 2 + next unless v && ALLOWED_FIELDS.include?(k) + v = v.strip + @options[k] = + case v + when '' then nil + when /\A\d+\z/ then v.to_i + when /\A\d+\.\d+\z/ then v.to_f + else v.gsub(/\A"|"\z/, '') + end + end + end + + ALLOWED_FIELDS.each do |f| + define_method f.to_sym do + @options[f] + end + + define_method :"#{f}=" do |v| + @options[f] = v + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/thread_pool.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/thread_pool.rb new file mode 100644 index 0000000..f919bf7 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/thread_pool.rb @@ -0,0 +1,446 @@ +# frozen_string_literal: true + +require 'thread' + +require_relative 'io_buffer' + +module Puma + # Internal Docs for A simple thread pool management object. + # + # Each Puma "worker" has a thread pool to process requests. + # + # First a connection to a client is made in `Puma::Server`. It is wrapped in a + # `Puma::Client` instance and then passed to the `Puma::Reactor` to ensure + # the whole request is buffered into memory. Once the request is ready, it is passed into + # a thread pool via the `Puma::ThreadPool#<<` operator where it is stored in a `@todo` array. + # + # Each thread in the pool has an internal loop where it pulls a request from the `@todo` array + # and processes it. + class ThreadPool + class ForceShutdown < RuntimeError + end + + # How long, after raising the ForceShutdown of a thread during + # forced shutdown mode, to wait for the thread to try and finish + # up its work before leaving the thread to die on the vine. + SHUTDOWN_GRACE_TIME = 5 # seconds + + # Maintain a minimum of +min+ and maximum of +max+ threads + # in the pool. + # + # The block passed is the work that will be performed in each + # thread. + # + def initialize(name, options = {}, &block) + @not_empty = ConditionVariable.new + @not_full = ConditionVariable.new + @mutex = Mutex.new + + @todo = [] + + @spawned = 0 + @waiting = 0 + + @name = name + @min = Integer(options[:min_threads]) + @max = Integer(options[:max_threads]) + # Not an 'exposed' option, options[:pool_shutdown_grace_time] is used in CI + # to shorten @shutdown_grace_time from SHUTDOWN_GRACE_TIME. Parallel CI + # makes stubbing constants difficult. + @shutdown_grace_time = Float(options[:pool_shutdown_grace_time] || SHUTDOWN_GRACE_TIME) + @block = block + @out_of_band = options[:out_of_band] + @clean_thread_locals = options[:clean_thread_locals] + @before_thread_start = options[:before_thread_start] + @before_thread_exit = options[:before_thread_exit] + @reaping_time = options[:reaping_time] + @auto_trim_time = options[:auto_trim_time] + + @shutdown = false + + @trim_requested = 0 + @out_of_band_pending = false + + @workers = [] + + @auto_trim = nil + @reaper = nil + + @mutex.synchronize do + @min.times do + spawn_thread + @not_full.wait(@mutex) + end + end + + @force_shutdown = false + @shutdown_mutex = Mutex.new + end + + attr_reader :spawned, :trim_requested, :waiting + + def self.clean_thread_locals + Thread.current.keys.each do |key| # rubocop: disable Style/HashEachMethods + Thread.current[key] = nil unless key == :__recursive_key__ + end + end + + # generate stats hash so as not to perform multiple locks + # @return [Hash] hash containing stat info from ThreadPool + def stats + with_mutex do + { backlog: @todo.size, + running: @spawned, + pool_capacity: @waiting + (@max - @spawned), + busy_threads: @spawned - @waiting + @todo.size + } + end + end + + # How many objects have yet to be processed by the pool? + # + def backlog + with_mutex { @todo.size } + end + + # @!attribute [r] pool_capacity + def pool_capacity + waiting + (@max - spawned) + end + + # @!attribute [r] busy_threads + # @version 5.0.0 + def busy_threads + with_mutex { @spawned - @waiting + @todo.size } + end + + # :nodoc: + # + # Must be called with @mutex held! + # + def spawn_thread + @spawned += 1 + + trigger_before_thread_start_hooks + th = Thread.new(@spawned) do |spawned| + Puma.set_thread_name '%s tp %03i' % [@name, spawned] + todo = @todo + block = @block + mutex = @mutex + not_empty = @not_empty + not_full = @not_full + + while true + work = nil + + mutex.synchronize do + while todo.empty? + if @trim_requested > 0 + @trim_requested -= 1 + @spawned -= 1 + @workers.delete th + not_full.signal + trigger_before_thread_exit_hooks + Thread.exit + end + + @waiting += 1 + if @out_of_band_pending && trigger_out_of_band_hook + @out_of_band_pending = false + end + not_full.signal + begin + not_empty.wait mutex + ensure + @waiting -= 1 + end + end + + work = todo.shift + end + + if @clean_thread_locals + ThreadPool.clean_thread_locals + end + + begin + @out_of_band_pending = true if block.call(work) + rescue Exception => e + STDERR.puts "Error reached top of thread-pool: #{e.message} (#{e.class})" + end + end + end + + @workers << th + + th + end + + private :spawn_thread + + def trigger_before_thread_start_hooks + return unless @before_thread_start&.any? + + @before_thread_start.each do |b| + begin + b.call + rescue Exception => e + STDERR.puts "WARNING before_thread_start hook failed with exception (#{e.class}) #{e.message}" + end + end + nil + end + + private :trigger_before_thread_start_hooks + + def trigger_before_thread_exit_hooks + return unless @before_thread_exit&.any? + + @before_thread_exit.each do |b| + begin + b.call + rescue Exception => e + STDERR.puts "WARNING before_thread_exit hook failed with exception (#{e.class}) #{e.message}" + end + end + nil + end + + private :trigger_before_thread_exit_hooks + + # @version 5.0.0 + def trigger_out_of_band_hook + return false unless @out_of_band&.any? + + # we execute on idle hook when all threads are free + return false unless @spawned == @waiting + + @out_of_band.each(&:call) + true + rescue Exception => e + STDERR.puts "Exception calling out_of_band_hook: #{e.message} (#{e.class})" + true + end + + private :trigger_out_of_band_hook + + # @version 5.0.0 + def with_mutex(&block) + @mutex.owned? ? + yield : + @mutex.synchronize(&block) + end + + # Add +work+ to the todo list for a Thread to pickup and process. + def <<(work) + with_mutex do + if @shutdown + raise "Unable to add work while shutting down" + end + + @todo << work + + if @waiting < @todo.size and @spawned < @max + spawn_thread + end + + @not_empty.signal + end + end + + # This method is used by `Puma::Server` to let the server know when + # the thread pool can pull more requests from the socket and + # pass to the reactor. + # + # The general idea is that the thread pool can only work on a fixed + # number of requests at the same time. If it is already processing that + # number of requests then it is at capacity. If another Puma process has + # spare capacity, then the request can be left on the socket so the other + # worker can pick it up and process it. + # + # For example: if there are 5 threads, but only 4 working on + # requests, this method will not wait and the `Puma::Server` + # can pull a request right away. + # + # If there are 5 threads and all 5 of them are busy, then it will + # pause here, and wait until the `not_full` condition variable is + # signaled, usually this indicates that a request has been processed. + # + # It's important to note that even though the server might accept another + # request, it might not be added to the `@todo` array right away. + # For example if a slow client has only sent a header, but not a body + # then the `@todo` array would stay the same size as the reactor works + # to try to buffer the request. In that scenario the next call to this + # method would not block and another request would be added into the reactor + # by the server. This would continue until a fully buffered request + # makes it through the reactor and can then be processed by the thread pool. + def wait_until_not_full + with_mutex do + while true + return if @shutdown + + # If we can still spin up new threads and there + # is work queued that cannot be handled by waiting + # threads, then accept more work until we would + # spin up the max number of threads. + return if busy_threads < @max + + @not_full.wait @mutex + end + end + end + + # @version 5.0.0 + def wait_for_less_busy_worker(delay_s) + return unless delay_s && delay_s > 0 + + # Ruby MRI does GVL, this can result + # in processing contention when multiple threads + # (requests) are running concurrently + return unless Puma.mri? + + with_mutex do + return if @shutdown + + # do not delay, if we are not busy + return unless busy_threads > 0 + + # this will be signaled once a request finishes, + # which can happen earlier than delay + @not_full.wait @mutex, delay_s + end + end + + # If there are any free threads in the pool, tell one to go ahead + # and exit. If +force+ is true, then a trim request is requested + # even if all threads are being utilized. + # + def trim(force=false) + with_mutex do + free = @waiting - @todo.size + if (force or free > 0) and @spawned - @trim_requested > @min + @trim_requested += 1 + @not_empty.signal + end + end + end + + # If there are dead threads in the pool make them go away while decreasing + # spawned counter so that new healthy threads could be created again. + def reap + with_mutex do + dead_workers = @workers.reject(&:alive?) + + dead_workers.each do |worker| + worker.kill + @spawned -= 1 + end + + @workers.delete_if do |w| + dead_workers.include?(w) + end + end + end + + class Automaton + def initialize(pool, timeout, thread_name, message) + @pool = pool + @timeout = timeout + @thread_name = thread_name + @message = message + @running = false + end + + def start! + @running = true + + @thread = Thread.new do + Puma.set_thread_name @thread_name + while @running + @pool.public_send(@message) + sleep @timeout + end + end + end + + def stop + @running = false + @thread.wakeup + end + end + + def auto_trim!(timeout=@auto_trim_time) + @auto_trim = Automaton.new(self, timeout, "#{@name} tp trim", :trim) + @auto_trim.start! + end + + def auto_reap!(timeout=@reaping_time) + @reaper = Automaton.new(self, timeout, "#{@name} tp reap", :reap) + @reaper.start! + end + + # Allows ThreadPool::ForceShutdown to be raised within the + # provided block if the thread is forced to shutdown during execution. + def with_force_shutdown + t = Thread.current + @shutdown_mutex.synchronize do + raise ForceShutdown if @force_shutdown + t[:with_force_shutdown] = true + end + yield + ensure + t[:with_force_shutdown] = false + end + + # Tell all threads in the pool to exit and wait for them to finish. + # Wait +timeout+ seconds then raise +ForceShutdown+ in remaining threads. + # Next, wait an extra +@shutdown_grace_time+ seconds then force-kill remaining + # threads. Finally, wait 1 second for remaining threads to exit. + # + def shutdown(timeout=-1) + threads = with_mutex do + @shutdown = true + @trim_requested = @spawned + @not_empty.broadcast + @not_full.broadcast + + @auto_trim&.stop + @reaper&.stop + # dup workers so that we join them all safely + @workers.dup + end + + if timeout == -1 + # Wait for threads to finish without force shutdown. + threads.each(&:join) + else + join = ->(inner_timeout) do + start = Process.clock_gettime(Process::CLOCK_MONOTONIC) + threads.reject! do |t| + elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start + t.join inner_timeout - elapsed + end + end + + # Wait +timeout+ seconds for threads to finish. + join.call(timeout) + + # If threads are still running, raise ForceShutdown and wait to finish. + @shutdown_mutex.synchronize do + @force_shutdown = true + threads.each do |t| + t.raise ForceShutdown if t[:with_force_shutdown] + end + end + join.call(@shutdown_grace_time) + + # If threads are _still_ running, forcefully kill them and wait to finish. + threads.each(&:kill) + join.call(1) + end + + @spawned = 0 + @workers = [] + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/util.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/util.rb new file mode 100644 index 0000000..a87dc73 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/util.rb @@ -0,0 +1,141 @@ +# frozen_string_literal: true + +require 'uri/common' + +module Puma + module Util + module_function + + def pipe + IO.pipe + end + + # An instance method on Thread has been provided to address https://bugs.ruby-lang.org/issues/13632, + # which currently affects some older versions of Ruby: 2.2.7 2.2.8 2.2.9 2.2.10 2.3.4 2.4.1 + # Additional context: https://github.com/puma/puma/pull/1345 + def purge_interrupt_queue + Thread.current.purge_interrupt_queue if Thread.current.respond_to? :purge_interrupt_queue + end + + # Escapes and unescapes a URI escaped string with + # +encoding+. +encoding+ will be the target encoding of the string + # returned, and it defaults to UTF-8 + if defined?(::Encoding) + def escape(s, encoding = Encoding::UTF_8) + URI.encode_www_form_component(s, encoding) + end + + def unescape(s, encoding = Encoding::UTF_8) + URI.decode_www_form_component(s, encoding) + end + else + def escape(s, encoding = nil) + URI.encode_www_form_component(s, encoding) + end + + def unescape(s, encoding = nil) + URI.decode_www_form_component(s, encoding) + end + end + module_function :unescape, :escape + + DEFAULT_SEP = /[&;] */n + + # Stolen from Mongrel, with some small modifications: + # Parses a query string by breaking it up at the '&' + # and ';' characters. You can also use this to parse + # cookies by changing the characters used in the second + # parameter (which defaults to '&;'). + def parse_query(qs, d = nil, &unescaper) + unescaper ||= method(:unescape) + + params = {} + + (qs || '').split(d ? /[#{d}] */n : DEFAULT_SEP).each do |p| + next if p.empty? + k, v = p.split('=', 2).map(&unescaper) + + if cur = params[k] + if cur.class == Array + params[k] << v + else + params[k] = [cur, v] + end + else + params[k] = v + end + end + + params + end + + # A case-insensitive Hash that preserves the original case of a + # header when set. + class HeaderHash < Hash + def self.new(hash={}) + HeaderHash === hash ? hash : super(hash) + end + + def initialize(hash={}) + super() + @names = {} + hash.each { |k, v| self[k] = v } + end + + def each + super do |k, v| + yield(k, v.respond_to?(:to_ary) ? v.to_ary.join("\n") : v) + end + end + + # @!attribute [r] to_hash + def to_hash + hash = {} + each { |k,v| hash[k] = v } + hash + end + + def [](k) + super(k) || super(@names[k.downcase]) + end + + def []=(k, v) + canonical = k.downcase + delete k if @names[canonical] && @names[canonical] != k # .delete is expensive, don't invoke it unless necessary + @names[k] = @names[canonical] = k + super k, v + end + + def delete(k) + canonical = k.downcase + result = super @names.delete(canonical) + @names.delete_if { |name,| name.downcase == canonical } + result + end + + def include?(k) + @names.include?(k) || @names.include?(k.downcase) + end + + alias_method :has_key?, :include? + alias_method :member?, :include? + alias_method :key?, :include? + + def merge!(other) + other.each { |k, v| self[k] = v } + self + end + + def merge(other) + hash = dup + hash.merge! other + end + + def replace(other) + clear + other.each { |k, v| self[k] = v } + self + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/rack/handler/puma.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/rack/handler/puma.rb new file mode 100644 index 0000000..7b3ce3d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/rack/handler/puma.rb @@ -0,0 +1,144 @@ +# frozen_string_literal: true + +module Puma + + # This module is used as an 'include' file in code at bottom of file. It loads + # into either `Rackup::Handler::Puma` or `Rack::Handler::Puma`. + + module RackHandler + DEFAULT_OPTIONS = { + :Verbose => false, + :Silent => false + } + + def config(app, options = {}) + require_relative '../../puma' + require_relative '../../puma/configuration' + require_relative '../../puma/log_writer' + require_relative '../../puma/launcher' + + default_options = DEFAULT_OPTIONS.dup + + # Libraries pass in values such as :Port and there is no way to determine + # if it is a default provided by the library or a special value provided + # by the user. A special key `user_supplied_options` can be passed. This + # contains an array of all explicitly defined user options. We then + # know that all other values are defaults + if user_supplied_options = options.delete(:user_supplied_options) + (options.keys - user_supplied_options).each do |k| + default_options[k] = options.delete(k) + end + end + + @events = options[:events] || ::Puma::Events.new + + conf = ::Puma::Configuration.new(options, default_options.merge({events: @events})) do |user_config, file_config, default_config| + if options.delete(:Verbose) + begin + require 'rack/commonlogger' # Rack 1.x + rescue LoadError + require 'rack/common_logger' # Rack 2 and later + end + app = ::Rack::CommonLogger.new(app, STDOUT) + end + + if options[:environment] + user_config.environment options[:environment] + end + + if options[:Threads] + min, max = options.delete(:Threads).split(':', 2) + user_config.threads min, max + end + + if options[:Host] || options[:Port] + host = options[:Host] || default_options[:Host] + port = options[:Port] || default_options[:Port] + self.set_host_port_to_config(host, port, user_config) + end + + if default_options[:Host] + file_config.set_default_host(default_options[:Host]) + end + self.set_host_port_to_config(default_options[:Host], default_options[:Port], default_config) + + user_config.app app + end + conf + end + + def run(app, **options) + conf = self.config(app, options) + + log_writer = options.delete(:Silent) ? ::Puma::LogWriter.strings : ::Puma::LogWriter.stdio + + launcher = ::Puma::Launcher.new(conf, :log_writer => log_writer, events: @events) + + yield launcher if block_given? + begin + launcher.run + rescue Interrupt + puts "* Gracefully stopping, waiting for requests to finish" + launcher.stop + puts "* Goodbye!" + end + end + + def valid_options + { + "Host=HOST" => "Hostname to listen on (default: localhost)", + "Port=PORT" => "Port to listen on (default: 8080)", + "Threads=MIN:MAX" => "min:max threads to use (default 0:16)", + "Verbose" => "Don't report each request (default: false)" + } + end + + def set_host_port_to_config(host, port, config) + config.clear_binds! if host || port + + if host&.start_with? '.', '/', '@' + config.bind "unix://#{host}" + elsif host&.start_with? 'ssl://' + uri = URI.parse(host) + uri.port ||= port || ::Puma::Configuration::DEFAULTS[:tcp_port] + config.bind uri.to_s + else + + if host + port ||= ::Puma::Configuration::DEFAULTS[:tcp_port] + end + + if port + host ||= ::Puma::Configuration::DEFAULTS[:tcp_host] + config.port port, host + end + end + end + end +end + +# rackup was removed in Rack 3, it is now a separate gem +if Object.const_defined?(:Rackup) && ::Rackup.const_defined?(:Handler) + module Rackup + module Handler + module Puma + class << self + include ::Puma::RackHandler + end + end + register :puma, Puma + end + end +else + do_register = Object.const_defined?(:Rack) && ::Rack.release < '3' + module Rack + module Handler + module Puma + class << self + include ::Puma::RackHandler + end + end + end + end + ::Rack::Handler.register(:puma, ::Rack::Handler::Puma) if do_register +end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/tools/Dockerfile b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/tools/Dockerfile new file mode 100644 index 0000000..435081c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/tools/Dockerfile @@ -0,0 +1,18 @@ +# Use this Dockerfile to create minimal reproductions of issues + +FROM ruby:3.2 + +RUN apt-get update && apt-get install -y ragel + +# throw errors if Gemfile has been modified since Gemfile.lock +RUN bundle config --global frozen 1 + +WORKDIR /usr/src/app + +COPY . . + +RUN bundle install +RUN bundle exec rake compile + +EXPOSE 9292 +CMD ["bundle", "exec", "bin/puma", "test/rackup/hello.ru"] diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/tools/trickletest.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/tools/trickletest.rb new file mode 100644 index 0000000..fa54380 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/tools/trickletest.rb @@ -0,0 +1,44 @@ +require 'socket' +require 'stringio' + +def do_test(st, chunk) + s = TCPSocket.new('127.0.0.1',ARGV[0].to_i); + req = StringIO.new(st) + nout = 0 + randstop = rand(st.length / 10) + STDERR.puts "stopping after: #{randstop}" + + begin + while data = req.read(chunk) + nout += s.write(data) + s.flush + sleep 0.1 + if nout > randstop + STDERR.puts "BANG! after #{nout} bytes." + break + end + end + rescue Object => e + STDERR.puts "ERROR: #{e}" + ensure + s.close + end +end + +content = "-" * (1024 * 240) +st = "GET / HTTP/1.1\r\nHost: www.zedshaw.com\r\nContent-Type: text/plain\r\nContent-Length: #{content.length}\r\n\r\n#{content}" + +puts "length: #{content.length}" + +threads = [] +ARGV[1].to_i.times do + t = Thread.new do + size = 100 + puts ">>>> #{size} sized chunks" + do_test(st, size) + end + + threads << t +end + +threads.each {|t| t.join} diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/CHANGELOG.md b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/CHANGELOG.md new file mode 100644 index 0000000..bf9c593 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/CHANGELOG.md @@ -0,0 +1,1226 @@ +# Changelog + +All notable changes to this project will be documented in this file. For info on how to format all future additions to this file please reference [Keep A Changelog](https://keepachangelog.com/en/1.0.0/). + +## Unreleased + +## [3.2.0] - 2025-07-31 + +This release continues Rack's evolution toward a cleaner, more efficient foundation while maintaining backward compatibility for most applications. The breaking changes primarily affect deprecated functionality, so most users should experience a smooth upgrade with improved performance and standards compliance. + +### SPEC Changes + +- Request environment keys must now be strings. ([#2310](https://github.com/rack/rack/issues/2310), [@jeremyevans]) +- Add `nil` as a valid return from a Response `body.to_path` ([#2318](https://github.com/rack/rack/pull/2318), [@MSP-Greg]) +- `Rack::Lint#check_header_value` is relaxed, only disallowing CR/LF/NUL characters. ([#2354](https://github.com/rack/rack/pull/2354), [@ioquatix]) + +### Added + +- Introduce `Rack::VERSION` constant. ([#2199](https://github.com/rack/rack/pull/2199), [@ioquatix]) +- `ISO-2022-JP` encoded parts within MIME Multipart sections of an HTTP request body will now be converted to `UTF-8`. ([#2245](https://github.com/rack/rack/pull/2245), [@nappa](https://github.com/nappa)) +- Add `Rack::Request#query_parser=` to allow setting the query parser to use. ([#2349](https://github.com/rack/rack/pull/2349), [@jeremyevans]) +- Add `Rack::Request#form_pairs` to access form data as raw key-value pairs, preserving duplicate keys. ([#2351](https://github.com/rack/rack/pull/2351), [@matthewd]) + +### Changed + +- Invalid cookie keys will now raise an error. ([#2193](https://github.com/rack/rack/pull/2193), [@ioquatix]) +- `Rack::MediaType#params` now handles empty strings. ([#2229](https://github.com/rack/rack/pull/2229), [@jeremyevans]) +- Avoid unnecessary calls to the `ip_filter` lambda to evaluate `Request#ip` ([#2287](https://github.com/rack/rack/pull/2287), [@willbryant]) +- Only calculate `Request#ip` once per request ([#2292](https://github.com/rack/rack/pull/2292), [@willbryant]) +- `Rack::Builder` `#use`, `#map`, and `#run` methods now return `nil`. ([#2355](https://github.com/rack/rack/pull/2355), [@ioquatix]) +- Directly close the body in `Rack::ConditionalGet` when the response is `304 Not Modified`. ([#2353](https://github.com/rack/rack/pull/2353), [@ioquatix]) +- Directly close the body in `Rack::Head` when the request method is `HEAD`([#2360](https://github.com/rack/rack/pull/2360), [@skipkayhil](https://github.com/skipkayhil)) + +### Deprecated + +- `Rack::Auth::AbstractRequest#request` is deprecated without replacement. ([#2229](https://github.com/rack/rack/pull/2229), [@jeremyevans]) +- `Rack::Request#parse_multipart` (private method designed to be overridden in subclasses) is deprecated without replacement. ([#2229](https://github.com/rack/rack/pull/2229), [@jeremyevans]) + +### Removed + +- `Rack::Request#values_at` is removed. ([#2200](https://github.com/rack/rack/pull/2200), [@ioquatix]) +- `Rack::Logger` is removed with no replacement. ([#2196](https://github.com/rack/rack/pull/2196), [@ioquatix]) +- Automatic cache invalidation in `Rack::Request#{GET,POST}` has been removed. ([#2230](https://github.com/rack/rack/pull/2230), [@jeremyevans]) +- Support for `CGI::Cookie` has been removed. ([#2332](https://github.com/rack/rack/pull/2332), [@ioquatix]) + +### Fixed + +- `Rack::RewindableInput::Middleware` no longer wraps a nil input. ([#2259](https://github.com/rack/rack/pull/2259), [@tt](https://github.com/tt)) +- Fix `NoMethodError` in `Rack::Request#wrap_ipv6` when `x-forwarded-host` is empty. ([#2270](https://github.com/rack/rack/pull/2270), [@oieioi](https://github.com/oieioi)) +- Fix the specification for `SERVER_PORT` which was incorrectly documented as required to be an `Integer` if present - it must be a `String` containing digits only. ([#2296](https://github.com/rack/rack/pull/2296), [@ioquatix]) +- `SERVER_NAME` and `HTTP_HOST` are now more strictly validated according to the relevant specifications. ([#2298](https://github.com/rack/rack/pull/2298), [@ioquatix]) +- `Rack::Lint` now disallows `PATH_INFO="" SCRIPT_NAME=""`. ([#2298](https://github.com/rack/rack/issues/2307), [@jeremyevans]) + +## [3.1.16] - 2025-06-04 + +### Security + +- [CVE-2025-49007](https://github.com/advisories/GHSA-47m2-26rw-j2jw) Fix ReDoS in multipart request. + +## [3.1.15] - 2025-05-18 + +- Optional support for `CGI::Cookie` if not available. ([#2327](https://github.com/rack/rack/pull/2327), [#2333](https://github.com/rack/rack/pull/2333), [@earlopain]) + +## [3.1.14] - 2025-05-06 + +:warning: **This release includes a security fix that may cause certain routes in previously working applications to fail if query parameters exceed 4,096 in count or 4 MB in total size. See for more details.** + +### Security + +- [CVE-2025-46727](https://github.com/rack/rack/security/advisories/GHSA-gjh7-p2fx-99vx) Unbounded parameter parsing in `Rack::QueryParser` can lead to memory exhaustion. + +## [3.1.13] - 2025-04-13 + +- Ensure `Rack::ETag` correctly updates response body. ([#2324](https://github.com/rack/rack/pull/2324), [@ioquatix]) + +## [3.1.12] - 2025-03-11 + +### Security + +- [CVE-2025-27610](https://github.com/rack/rack/security/advisories/GHSA-7wqh-767x-r66v) Local file inclusion in `Rack::Static`. + +## [3.1.11] - 2025-03-04 + +### Security + +- [CVE-2025-27111](https://github.com/rack/rack/security/advisories/GHSA-8cgq-6mh2-7j6v) Possible Log Injection in `Rack::Sendfile`. + +## [3.1.10] - 2025-02-12 + +### Security + +- [CVE-2025-25184](https://github.com/rack/rack/security/advisories/GHSA-7g2v-jj9q-g3rg) Possible Log Injection in `Rack::CommonLogger`. + +## [3.1.9] - 2025-01-31 + +### Fixed + +- `Rack::MediaType#params` now handles parameters without values. ([#2263](https://github.com/rack/rack/pull/2263), [@AllyMarthaJ](https://github.com/AllyMarthaJ)) + +## [3.1.8] - 2024-10-14 + +### Fixed + +- Resolve deprecation warnings about uri `DEFAULT_PARSER`. ([#2249](https://github.com/rack/rack/pull/2249), [@earlopain]) + +## [3.1.7] - 2024-07-11 + +### Fixed + +- Do not remove escaped opening/closing quotes for content-disposition filenames. ([#2229](https://github.com/rack/rack/pull/2229), [@jeremyevans]) +- Fix encoding setting for non-binary IO-like objects in MockRequest#env_for. ([#2227](https://github.com/rack/rack/pull/2227), [@jeremyevans]) +- `Rack::Response` should not generate invalid `content-length` header. ([#2219](https://github.com/rack/rack/pull/2219), [@ioquatix]) +- Allow empty PATH_INFO. ([#2214](https://github.com/rack/rack/pull/2214), [@ioquatix]) + +## [3.1.6] - 2024-07-03 + +### Fixed + +- Fix several edge cases in `Rack::Request#parse_http_accept_header`'s implementation. ([#2226](https://github.com/rack/rack/pull/2226), [@ioquatix]) + +## [3.1.5] - 2024-07-02 + +### Security + +- Fix potential ReDoS attack in `Rack::Request#parse_http_accept_header`. ([GHSA-cj83-2ww7-mvq7](https://github.com/rack/rack/security/advisories/GHSA-cj83-2ww7-mvq7), [@dwisiswant0](https://github.com/dwisiswant0)) + +## [3.1.4] - 2024-06-22 + +### Fixed + +- Fix `Rack::Lint` matching some paths incorrectly as authority form. ([#2220](https://github.com/rack/rack/pull/2220), [@ioquatix]) + +## [3.1.3] - 2024-06-12 + +### Fixed + +- Fix passing non-strings to `Rack::Utils.escape_html`. ([#2202](https://github.com/rack/rack/pull/2202), [@earlopain]) +- `Rack::MockResponse` gracefully handles empty cookies ([#2203](https://github.com/rack/rack/pull/2203) [@wynksaiddestroy]) + +## [3.1.2] - 2024-06-11 + +- `Rack::Response` will take in to consideration chunked encoding responses ([#2204](https://github.com/rack/rack/pull/2204), [@tenderlove]) + +## [3.1.1] - 2024-06-11 + +- Oops! I shouldn't have shipped that + +## [3.1.0] - 2024-06-11 + +:warning: **This release includes several breaking changes.** Refer to the **Removed** section below for the list of deprecated methods that have been removed in this release. + +This release is primarily a maintenance release that removes features deprecated in Rack v3.0. Alongside these removals, there are several improvements to the Rack SPEC, mainly focused on enhancing input and output handling. These changes aim to make Rack more efficient and align better with the requirements of server implementations and relevant HTTP specifications. + +### SPEC Changes + +- `rack.input` is now optional. ([#1997](https://github.com/rack/rack/pull/1997), [#2018](https://github.com/rack/rack/pull/2018), [@ioquatix]) +- `PATH_INFO` is now validated according to the HTTP/1.1 specification. ([#2117](https://github.com/rack/rack/pull/2117), [#2181](https://github.com/rack/rack/pull/2181), [@ioquatix]) + - `OPTIONS *` is now accepted. ([#2114](https://github.com/rack/rack/pull/2114), [@doriantaylor](https://github.com/doriantaylor)) +- Introduce optional `rack.protocol` request and response header for handling connection upgrades. ([#1954](https://github.com/rack/rack/pull/1954), [@ioquatix]) + +### Added + +- Introduce `Rack::Multipart::MissingInputError` for improved handling of missing input in `#parse_multipart`. ([#2018](https://github.com/rack/rack/pull/2018), [@ioquatix]) +- Introduce `module Rack::BadRequest` which is included in multipart and query parser errors. ([#2019](https://github.com/rack/rack/pull/2019), [@ioquatix]) +- Add `.mjs` MIME type ([#2057](https://github.com/rack/rack/pull/2057), [@axilleas](https://github.com/axilleas)) +- `set_cookie_header` utility now supports the `partitioned` cookie attribute. This is required by Chrome in some embedded contexts. ([#2131](https://github.com/rack/rack/pull/2131), [@flavio-b](https://github.com/flavio-b)) +- Introduce `rack.early_hints` for sending `103 Early Hints` informational responses. ([#1831](https://github.com/rack/rack/pull/1831), [@casperisfine](https://github.com/casperisfine), [@jeremyevans]) + +### Changed + +- MIME type for JavaScript files (`.js`) changed from `application/javascript` to `text/javascript` ([`1bd0f15`](https://github.com/rack/rack/commit/1bd0f1597d8f4a90d47115f3e156a8ce7870c9c8), [@ioquatix]) +- Update MIME types associated to `.ttf`, `.woff`, `.woff2` and `.otf` extensions to use mondern `font/*` types. ([#2065](https://github.com/rack/rack/pull/2065), [@davidstosik]) +- `Rack::Utils.escape_html` is now delegated to `CGI.escapeHTML`. `'` is escaped to `#39;` instead of `#x27;`. (decimal vs hexadecimal) ([#2099](https://github.com/rack/rack/pull/2099), [@JunichiIto](https://github.com/JunichiIto)) +- Clarify use of `@buffered` and only update `content-length` when `Rack::Response#finish` is invoked. ([#2149](https://github.com/rack/rack/pull/2149), [@ioquatix]) + +### Deprecated + +- Deprecate automatic cache invalidation in `Request#{GET,POST}` ([#2073](https://github.com/rack/rack/pull/2073), [@jeremyevans]) +- Only cookie keys that are not valid according to the HTTP specifications are escaped. We are planning to deprecate this behaviour, so now a deprecation message will be emitted in this case. In the future, invalid cookie keys may not be accepted. ([#2191](https://github.com/rack/rack/pull/2191), [@ioquatix]) +- `Rack::Logger` is deprecated. ([#2197](https://github.com/rack/rack/pull/2197), [@ioquatix]) +- Add fallback lookup and deprecation warning for obsolete status symbols. ([#2137](https://github.com/rack/rack/pull/2137), [@wtn](https://github.com/wtn)) +- Deprecate `Rack::Request#values_at`, use `request.params.values_at` instead ([#2183](https://github.com/rack/rack/pull/2183), [@ioquatix]) + +### Removed + +- Remove deprecated `Rack::Auth::Digest` with no replacement. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) +- Remove deprecated `Rack::Cascade::NotFound` with no replacement. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) +- Remove deprecated `Rack::Chunked` with no replacement. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) +- Remove deprecated `Rack::File`, use `Rack::Files` instead. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) +- Remove deprecated `Rack::QueryParser` `key_space_limit` parameter with no replacement. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) +- Remove deprecated `Rack::Response#header`, use `Rack::Response#headers` instead. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) +- Remove deprecated cookie methods from `Rack::Utils`: `add_cookie_to_header`, `make_delete_cookie_header`, `add_remove_cookie_to_header`. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) +- Remove deprecated `Rack::Utils::HeaderHash`. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) +- Remove deprecated `Rack::VERSION`, `Rack::VERSION_STRING`, `Rack.version`, use `Rack.release` instead. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) +- Remove non-standard status codes 306, 509, & 510 and update descriptions for 413, 422, & 451. ([#2137](https://github.com/rack/rack/pull/2137), [@wtn](https://github.com/wtn)) +- Remove any dependency on `transfer-encoding: chunked`. ([#2195](https://github.com/rack/rack/pull/2195), [@ioquatix]) +- Remove deprecated `Rack::Request#[]`, use `request.params[key]` instead ([#2183](https://github.com/rack/rack/pull/2183), [@ioquatix]) + +### Fixed + +- In `Rack::Files`, ignore the `Range` header if served file is 0 bytes. ([#2159](https://github.com/rack/rack/pull/2159), [@zarqman]) + +## [3.0.18] - 2025-05-22 + +- Fix incorrect backport of optional `CGI::Cookie` support. ([#2335](https://github.com/rack/rack/pull/2335), [@jeremyevans]) + +## [3.0.17] - 2025-05-18 + +- Optional support for `CGI::Cookie` if not available. ([#2327](https://github.com/rack/rack/pull/2327), [#2333](https://github.com/rack/rack/pull/2333), [@earlopain]) + +## [3.0.16] - 2025-05-06 + +:warning: **This release includes a security fix that may cause certain routes in previously working applications to fail if query parameters exceed 4,096 in count or 4 MB in total size. See for more details.** + +### Security + +- [CVE-2025-46727](https://github.com/rack/rack/security/advisories/GHSA-gjh7-p2fx-99vx) Unbounded parameter parsing in `Rack::QueryParser` can lead to memory exhaustion. + +## [3.0.15] - 2025-04-13 + +- Ensure `Rack::ETag` correctly updates response body. ([#2324](https://github.com/rack/rack/pull/2324), [@ioquatix]) + +## [3.0.14] - 2025-03-11 + +### Security + +- [CVE-2025-27610](https://github.com/rack/rack/security/advisories/GHSA-7wqh-767x-r66v) Local file inclusion in `Rack::Static`. + +## [3.0.13] - 2025-03-04 + +### Security + +- [CVE-2025-27111](https://github.com/rack/rack/security/advisories/GHSA-8cgq-6mh2-7j6v) Possible Log Injection in `Rack::Sendfile`. + +### Fixed + +- Remove autoloads for constants no longer shipped with Rack. ([#2269](https://github.com/rack/rack/pull/2269), [@ccutrer](https://github.com/ccutrer)) + +## [3.0.12] - 2025-02-12 + +### Security + +- [CVE-2025-25184](https://github.com/rack/rack/security/advisories/GHSA-7g2v-jj9q-g3rg) Possible Log Injection in `Rack::CommonLogger`. + +## [3.0.11] - 2024-05-10 + +- Backport #2062 to 3-0-stable: Do not allow `BodyProxy` to respond to `to_str`, make `to_ary` call close . ([#2062](https://github.com/rack/rack/pull/2062), [@jeremyevans](https://github.com/jeremyevans)) + +## [3.0.10] - 2024-03-21 + +- Backport #2104 to 3-0-stable: Return empty when parsing a multi-part POST with only one end delimiter. ([#2164](https://github.com/rack/rack/pull/2164), [@JoeDupuis](https://github.com/JoeDupuis)) + +## [3.0.9.1] - 2024-02-21 + +### Security + +* [CVE-2024-26146] Fixed ReDoS in Accept header parsing +* [CVE-2024-25126] Fixed ReDoS in Content Type header parsing +* [CVE-2024-26141] Reject Range headers which are too large + +[CVE-2024-26146]: https://github.com/advisories/GHSA-54rr-7fvw-6x8f +[CVE-2024-25126]: https://github.com/advisories/GHSA-22f2-v57c-j9cx +[CVE-2024-26141]: https://github.com/advisories/GHSA-xj5v-6v4g-jfw6 + +## [3.0.9] - 2024-01-31 + +- Fix incorrect content-length header that was emitted when `Rack::Response#write` was used in some situations. ([#2150](https://github.com/rack/rack/pull/2150), [@mattbrictson](https://github.com/mattbrictson)) + +## [3.0.8] - 2023-06-14 + +- Fix some unused variable verbose warnings. ([#2084](https://github.com/rack/rack/pull/2084), [@jeremyevans], [@skipkayhil](https://github.com/skipkayhil)) + +## [3.0.7] - 2023-03-16 + +- Make query parameters without `=` have `nil` values. ([#2059](https://github.com/rack/rack/pull/2059), [@jeremyevans]) + +## [3.0.6.1] - 2023-03-13 + +### Security + +- [CVE-2023-27539] Avoid ReDoS in header parsing + +## [3.0.6] - 2023-03-13 + +- Add `QueryParser#missing_value` for handling missing values + tests. ([#2052](https://github.com/rack/rack/pull/2052), [@ioquatix]) + +## [3.0.5] - 2023-03-13 + +- Split form/query parsing into two steps. ([#2038](https://github.com/rack/rack/pull/2038), [@matthewd](https://github.com/matthewd)) + +## [3.0.4.2] - 2023-03-02 + +### Security + +- [CVE-2023-27530] Introduce multipart_total_part_limit to limit total parts + +## [3.0.4.1] - 2023-01-17 + +### Security + +- [CVE-2022-44571] Fix ReDoS vulnerability in multipart parser +- [CVE-2022-44570] Fix ReDoS in Rack::Utils.get_byte_ranges +- [CVE-2022-44572] Forbid control characters in attributes (also ReDoS) + +## [3.0.4] - 2023-01-17 + +- `Rack::Request#POST` should consistently raise errors. Cache errors that occur when invoking `Rack::Request#POST` so they can be raised again later. ([#2010](https://github.com/rack/rack/pull/2010), [@ioquatix]) +- Fix `Rack::Lint` error message for `HTTP_CONTENT_TYPE` and `HTTP_CONTENT_LENGTH`. ([#2007](https://github.com/rack/rack/pull/2007), [@byroot](https://github.com/byroot)) +- Extend `Rack::MethodOverride` to handle `QueryParser::ParamsTooDeepError` error. ([#2006](https://github.com/rack/rack/pull/2006), [@byroot](https://github.com/byroot)) + +## [3.0.3] - 2022-12-27 + +### Fixed + +- `Rack::URLMap` uses non-deprecated form of `Regexp.new`. ([#1998](https://github.com/rack/rack/pull/1998), [@weizheheng](https://github.com/weizheheng)) + +## [3.0.2] - 2022-12-05 + +### Fixed + +- `Utils.build_nested_query` URL-encodes nested field names including the square brackets. +- Allow `Rack::Response` to pass through streaming bodies. ([#1993](https://github.com/rack/rack/pull/1993), [@ioquatix]) + +## [3.0.1] - 2022-11-18 + +### Fixed + +- `MethodOverride` does not look for an override if a request does not include form/parseable data. +- `Rack::Lint::Wrapper` correctly handles `respond_to?` with `to_ary`, `each`, `call` and `to_path`, forwarding to the body. ([#1981](https://github.com/rack/rack/pull/1981), [@ioquatix]) + +## [3.0.0] - 2022-09-06 + +This release introduces major improvements to Rack, including enhanced support for streaming responses, expanded protocol handling, and stricter compliance with HTTP standards. It refines middleware interfaces, improves multipart and hijack handling, and strengthens security and error reporting. The update also brings performance optimizations, better compatibility with modern Ruby versions, and numerous bug fixes, making Rack more robust and flexible for web application development. + +- No changes + +## [3.0.0.rc1] - 2022-09-04 + +### SPEC Changes + +- Stream argument must implement `<<` https://github.com/rack/rack/pull/1959 +- `close` may be called on `rack.input` https://github.com/rack/rack/pull/1956 +- `rack.response_finished` may be used for executing code after the response has been finished https://github.com/rack/rack/pull/1952 + +## [3.0.0.beta1] - 2022-08-08 + +### Security + +- Do not use semicolon as GET parameter separator. ([#1733](https://github.com/rack/rack/pull/1733), [@jeremyevans]) + +### SPEC Changes + +- Response array must now be non-frozen. +- Response `status` must now be an integer greater than or equal to 100. +- Response `headers` must now be an unfrozen hash. +- Response header keys can no longer include uppercase characters. +- Response header values can be an `Array` to handle multiple values (and no longer supports `\n` encoded headers). +- Response body can now respond to `#call` (streaming body) instead of `#each` (enumerable body), for the equivalent of response hijacking in previous versions. +- Middleware must no longer call `#each` on the body, but they can call `#to_ary` on the body if it responds to `#to_ary`. +- `rack.input` is no longer required to be rewindable. +- `rack.multithread`/`rack.multiprocess`/`rack.run_once`/`rack.version` are no longer required environment keys. +- `SERVER_PROTOCOL` is now a required environment key, matching the HTTP protocol used in the request. +- `rack.hijack?` (partial hijack) and `rack.hijack` (full hijack) are now independently optional. +- `rack.hijack_io` has been removed completely. +- `rack.response_finished` is an optional environment key which contains an array of callable objects that must accept `#call(env, status, headers, error)` and are invoked after the response is finished (either successfully or unsuccessfully). +- It is okay to call `#close` on `rack.input` to indicate that you no longer need or care about the input. +- The stream argument supplied to the streaming body and hijack must support `#<<` for writing output. + +### Removed + +- Remove `rack.multithread`/`rack.multiprocess`/`rack.run_once`. These variables generally come too late to be useful. ([#1720](https://github.com/rack/rack/pull/1720), [@ioquatix], [@jeremyevans])) +- Remove deprecated Rack::Request::SCHEME_WHITELIST. ([@jeremyevans]) +- Remove internal cookie deletion using pattern matching, there are very few practical cases where it would be useful and browsers handle it correctly without us doing anything special. ([#1844](https://github.com/rack/rack/pull/1844), [@ioquatix]) +- Remove `rack.version` as it comes too late to be useful. ([#1938](https://github.com/rack/rack/pull/1938), [@ioquatix]) +- Extract `rackup` command, `Rack::Server`, `Rack::Handler` and related code into a separate gem. ([#1937](https://github.com/rack/rack/pull/1937), [@ioquatix]) + +### Added + +- `Rack::Headers` added to support lower-case header keys. ([@jeremyevans]) +- `Rack::Utils#set_cookie_header` now supports `escape_key: false` to avoid key escaping. ([@jeremyevans]) +- `Rack::RewindableInput` supports size. ([@ahorek](https://github.com/ahorek)) +- `Rack::RewindableInput::Middleware` added for making `rack.input` rewindable. ([@jeremyevans]) +- The RFC 7239 Forwarded header is now supported and considered by default when looking for information on forwarding, falling back to the X-Forwarded-* headers. `Rack::Request.forwarded_priority` accessor has been added for configuring the priority of which header to check. ([#1423](https://github.com/rack/rack/issues/1423), [@jeremyevans]) +- Allow response headers to contain array of values. ([#1598](https://github.com/rack/rack/issues/1598), [@ioquatix]) +- Support callable body for explicit streaming support and clarify streaming response body behaviour. ([#1745](https://github.com/rack/rack/pull/1745), [@ioquatix], [#1748](https://github.com/rack/rack/pull/1748), [@wjordan]) +- Allow `Rack::Builder#run` to take a block instead of an argument. ([#1942](https://github.com/rack/rack/pull/1942), [@ioquatix]) +- Add `rack.response_finished` to `Rack::Lint`. ([#1802](https://github.com/rack/rack/pull/1802), [@BlakeWilliams], [#1952](https://github.com/rack/rack/pull/1952), [@ioquatix]) +- The stream argument must implement `#<<`. ([#1959](https://github.com/rack/rack/pull/1959), [@ioquatix]) + +### Changed + +- BREAKING CHANGE: Require `status` to be an Integer. ([#1662](https://github.com/rack/rack/pull/1662), [@olleolleolle](https://github.com/olleolleolle)) +- BREAKING CHANGE: Query parsing now treats parameters without `=` as having the empty string value instead of nil value, to conform to the URL spec. ([#1696](https://github.com/rack/rack/issues/1696), [@jeremyevans]) +- Relax validations around `Rack::Request#host` and `Rack::Request#hostname`. ([#1606](https://github.com/rack/rack/issues/1606), [@pvande](https://github.com/pvande)) +- Removed antiquated handlers: FCGI, LSWS, SCGI, Thin. ([#1658](https://github.com/rack/rack/pull/1658), [@ioquatix]) +- Removed options from `Rack::Builder.parse_file` and `Rack::Builder.load_file`. ([#1663](https://github.com/rack/rack/pull/1663), [@ioquatix]) +- `Rack::HTTP_VERSION` has been removed and the `HTTP_VERSION` env setting is no longer set in the CGI and Webrick handlers. ([#970](https://github.com/rack/rack/issues/970), [@jeremyevans]) +- `Rack::Request#[]` and `#[]=` now warn even in non-verbose mode. ([#1277](https://github.com/rack/rack/issues/1277), [@jeremyevans]) +- Decrease default allowed parameter recursion level from 100 to 32. ([#1640](https://github.com/rack/rack/issues/1640), [@jeremyevans]) +- Attempting to parse a multipart response with an empty body now raises Rack::Multipart::EmptyContentError. ([#1603](https://github.com/rack/rack/issues/1603), [@jeremyevans]) +- `Rack::Utils.secure_compare` uses OpenSSL's faster implementation if available. ([#1711](https://github.com/rack/rack/pull/1711), [@bdewater](https://github.com/bdewater)) +- `Rack::Request#POST` now caches an empty hash if input content type is not parseable. ([#749](https://github.com/rack/rack/pull/749), [@jeremyevans]) +- BREAKING CHANGE: Updated `trusted_proxy?` to match full 127.0.0.0/8 network. ([#1781](https://github.com/rack/rack/pull/1781), [@snbloch](https://github.com/snbloch)) +- Explicitly deprecate `Rack::File` which was an alias for `Rack::Files`. ([#1811](https://github.com/rack/rack/pull/1720), [@ioquatix]). +- Moved `Rack::Session` into [separate gem](https://github.com/rack/rack-session). ([#1805](https://github.com/rack/rack/pull/1805), [@ioquatix]) +- `rackup -D` option to daemonizes no longer changes the working directory to the root. ([#1813](https://github.com/rack/rack/pull/1813), [@jeremyevans]) +- The `x-forwarded-proto` header is now considered before the `x-forwarded-scheme` header for determining the forwarded protocol. `Rack::Request.x_forwarded_proto_priority` accessor has been added for configuring the priority of which header to check. ([#1809](https://github.com/rack/rack/issues/1809), [@jeremyevans]) +- `Rack::Request.forwarded_authority` (and methods that call it, such as `host`) now returns the last authority in the forwarded header, instead of the first, as earlier forwarded authorities can be forged by clients. This restores the Rack 2.1 behavior. ([#1829](https://github.com/rack/rack/issues/1809), [@jeremyevans]) +- Use lower case cookie attributes when creating cookies, and fold cookie attributes to lower case when reading cookies (specifically impacting `secure` and `httponly` attributes). ([#1849](https://github.com/rack/rack/pull/1849), [@ioquatix]) +- The response array must now be mutable (non-frozen) so middleware can modify it without allocating a new Array,therefore reducing object allocations. ([#1887](https://github.com/rack/rack/pull/1887), [#1927](https://github.com/rack/rack/pull/1927), [@amatsuda], [@ioquatix]) +- `rack.hijack?` (partial hijack) and `rack.hijack` (full hijack) are now independently optional. `rack.hijack_io` is no longer required/specified. ([#1939](https://github.com/rack/rack/pull/1939), [@ioquatix]) +- Allow calling close on `rack.input`. ([#1956](https://github.com/rack/rack/pull/1956), [@ioquatix]) + +### Fixed + +- Make Rack::MockResponse handle non-hash headers. ([#1629](https://github.com/rack/rack/issues/1629), [@jeremyevans]) +- TempfileReaper now deletes temp files if application raises an exception. ([#1679](https://github.com/rack/rack/issues/1679), [@jeremyevans]) +- Handle cookies with values that end in '=' ([#1645](https://github.com/rack/rack/pull/1645), [@lukaso](https://github.com/lukaso)) +- Make `Rack::NullLogger` respond to `#fatal!` [@jeremyevans]) +- Fix multipart filename generation for filenames that contain spaces. Encode spaces as "%20" instead of "+" which will be decoded properly by the multipart parser. ([#1736](https://github.com/rack/rack/pull/1645), [@muirdm](https://github.com/muirdm)) +- `Rack::Request#scheme` returns `ws` or `wss` when one of the `X-Forwarded-Scheme` / `X-Forwarded-Proto` headers is set to `ws` or `wss`, respectively. ([#1730](https://github.com/rack/rack/issues/1730), [@erwanst](https://github.com/erwanst)) + +## [2.2.17] - 2025-06-03 + +- Backport `Rack::MediaType#params` now handles parameters without values. ([#2263](https://github.com/rack/rack/pull/2263), [@AllyMarthaJ](https://github.com/AllyMarthaJ)) + +## [2.2.16] - 2025-05-22 + +- Fix incorrect backport of optional `CGI::Cookie` support. ([#2335](https://github.com/rack/rack/pull/2335), [@jeremyevans]) + +## [2.2.15] - 2025-05-18 + +- Optional support for `CGI::Cookie` if not available. ([#2327](https://github.com/rack/rack/pull/2327), [#2333](https://github.com/rack/rack/pull/2333), [@earlopain]) + +## [2.2.14] - 2025-05-06 + +:warning: **This release includes a security fix that may cause certain routes in previously working applications to fail if query parameters exceed 4,096 in count or 4 MB in total size. See for more details.** + +### Security + +- [CVE-2025-46727](https://github.com/rack/rack/security/advisories/GHSA-gjh7-p2fx-99vx) Unbounded parameter parsing in `Rack::QueryParser` can lead to memory exhaustion. + +## [2.2.13] - 2025-03-11 + +### Security + +- [CVE-2025-27610](https://github.com/rack/rack/security/advisories/GHSA-7wqh-767x-r66v) Local file inclusion in `Rack::Static`. + +## [2.2.12] - 2025-03-04 + +### Security + +- [CVE-2025-27111](https://github.com/rack/rack/security/advisories/GHSA-8cgq-6mh2-7j6v) Possible Log Injection in `Rack::Sendfile`. + +## [2.2.11] - 2025-02-12 + +### Security + +- [CVE-2025-25184](https://github.com/rack/rack/security/advisories/GHSA-7g2v-jj9q-g3rg) Possible Log Injection in `Rack::CommonLogger`. + +## [2.2.10] - 2024-10-14 + +- Fix compatibility issues with Ruby v3.4.0. ([#2248](https://github.com/rack/rack/pull/2248), [@byroot](https://github.com/byroot)) + +## [2.2.9] - 2023-03-21 + +- Return empty when parsing a multi-part POST with only one end delimiter. ([#2104](https://github.com/rack/rack/pull/2104), [@alpaca-tc]) + +## [2.2.8] - 2023-07-31 + +- Regenerate SPEC ([#2102](https://github.com/rack/rack/pull/2102), [@skipkayhil](https://github.com/skipkayhil)) +- Limit file extension length of multipart tempfiles ([#2015](https://github.com/rack/rack/pull/2015), [@dentarg](https://github.com/dentarg)) +- Fix "undefined method DelegateClass for Rack::Session::Cookie:Class" ([#2092](https://github.com/rack/rack/pull/2092), [@onigra](https://github.com/onigra) [@dchandekstark](https://github.com/dchandekstark)) + +## [2.2.7] - 2023-03-13 + +- Correct the year number in the changelog ([#2015](https://github.com/rack/rack/pull/2015), [@kimulab](https://github.com/kimulab)) +- Support underscore in host names for Rack 2.2 (Fixes [#2070](https://github.com/rack/rack/issues/2070)) ([#2015](https://github.com/rack/rack/pull/2071), [@jeremyevans](https://github.com/jeremyevans)) + +## [2.2.6.4] - 2023-03-13 + +- [CVE-2023-27539] Avoid ReDoS in header parsing + +## [2.2.6.3] - 2023-03-02 + +- [CVE-2023-27530] Introduce multipart_total_part_limit to limit total parts + +## [2.2.6.2] - 2023-01-17 + +- [CVE-2022-44570] Fix ReDoS in Rack::Utils.get_byte_ranges + +## [2.2.6.1] - 2023-01-17 + +- [CVE-2022-44571] Fix ReDoS vulnerability in multipart parser +- [CVE-2022-44572] Forbid control characters in attributes (also ReDoS) + +## [2.2.6] - 2023-01-17 + +- Extend `Rack::MethodOverride` to handle `QueryParser::ParamsTooDeepError` error. ([#2011](https://github.com/rack/rack/pull/2011), [@byroot](https://github.com/byroot)) + +## [2.2.5] - 2022-12-27 + +### Fixed + +- `Rack::URLMap` uses non-deprecated form of `Regexp.new`. ([#1998](https://github.com/rack/rack/pull/1998), [@weizheheng](https://github.com/weizheheng)) + +## [2.2.4] - 2022-06-30 + +- Better support for lower case headers in `Rack::ETag` middleware. ([#1919](https://github.com/rack/rack/pull/1919), [@ioquatix](https://github.com/ioquatix)) +- Use custom exception on params too deep error. ([#1838](https://github.com/rack/rack/pull/1838), [@simi](https://github.com/simi)) + +## [2.2.3.1] - 2022-05-27 + +### Security + +- [CVE-2022-30123] Fix shell escaping issue in Common Logger +- [CVE-2022-30122] Restrict parsing of broken MIME attachments + +## [2.2.3] - 2020-06-15 + +### Security + +- [[CVE-2020-8184](https://nvd.nist.gov/vuln/detail/CVE-2020-8184)] Do not allow percent-encoded cookie name to override existing cookie names. BREAKING CHANGE: Accessing cookie names that require URL encoding with decoded name no longer works. ([@fletchto99](https://github.com/fletchto99)) + +## [2.2.2] - 2020-02-11 + +### Fixed + +- Fix incorrect `Rack::Request#host` value. ([#1591](https://github.com/rack/rack/pull/1591), [@ioquatix]) +- Revert `Rack::Handler::Thin` implementation. ([#1583](https://github.com/rack/rack/pull/1583), [@jeremyevans]) +- Double assignment is still needed to prevent an "unused variable" warning. ([#1589](https://github.com/rack/rack/pull/1589), [@kamipo](https://github.com/kamipo)) +- Fix to handle same_site option for session pool. ([#1587](https://github.com/rack/rack/pull/1587), [@kamipo](https://github.com/kamipo)) + +## [2.2.1] - 2020-02-09 + +### Fixed + +- Rework `Rack::Request#ip` to handle empty `forwarded_for`. ([#1577](https://github.com/rack/rack/pull/1577), [@ioquatix]) + +## [2.2.0] - 2020-02-08 + +### SPEC Changes + +- `rack.session` request environment entry must respond to `to_hash` and return unfrozen Hash. ([@jeremyevans]) +- Request environment cannot be frozen. ([@jeremyevans]) +- CGI values in the request environment with non-ASCII characters must use ASCII-8BIT encoding. ([@jeremyevans]) +- Improve SPEC/lint relating to SERVER_NAME, SERVER_PORT and HTTP_HOST. ([#1561](https://github.com/rack/rack/pull/1561), [@ioquatix]) + +### Added + +- `rackup` supports multiple `-r` options and will require all arguments. ([@jeremyevans]) +- `Server` supports an array of paths to require for the `:require` option. ([@khotta](https://github.com/khotta)) +- `Files` supports multipart range requests. ([@fatkodima](https://github.com/fatkodima)) +- `Multipart::UploadedFile` supports an IO-like object instead of using the filesystem, using `:filename` and `:io` options. ([@jeremyevans]) +- `Multipart::UploadedFile` supports keyword arguments `:path`, `:content_type`, and `:binary` in addition to positional arguments. ([@jeremyevans]) +- `Static` supports a `:cascade` option for calling the app if there is no matching file. ([@jeremyevans]) +- `Session::Abstract::SessionHash#dig`. ([@jeremyevans]) +- `Response.[]` and `MockResponse.[]` for creating instances using status, headers, and body. ([@ioquatix]) +- Convenient cache and content type methods for `Rack::Response`. ([#1555](https://github.com/rack/rack/pull/1555), [@ioquatix]) + +### Changed + +- `Request#params` no longer rescues EOFError. ([@jeremyevans]) +- `Directory` uses a streaming approach, significantly improving time to first byte for large directories. ([@jeremyevans]) +- `Directory` no longer includes a Parent directory link in the root directory index. ([@jeremyevans]) +- `QueryParser#parse_nested_query` uses original backtrace when reraising exception with new class. ([@jeremyevans]) +- `ConditionalGet` follows RFC 7232 precedence if both If-None-Match and If-Modified-Since headers are provided. ([@jeremyevans]) +- `.ru` files supports the `frozen-string-literal` magic comment. ([@eregon](https://github.com/eregon)) +- Rely on autoload to load constants instead of requiring internal files, make sure to require 'rack' and not just 'rack/...'. ([@jeremyevans]) +- BREAKING CHANGE: `Etag` will continue sending ETag even if the response should not be cached. Streaming no longer works without a workaround, see [#1619](https://github.com/rack/rack/issues/1619#issuecomment-848460528). ([@henm](https://github.com/henm)) +- `Request#host_with_port` no longer includes a colon for a missing or empty port. ([@AlexWayfer](https://github.com/AlexWayfer)) +- All handlers uses keywords arguments instead of an options hash argument. ([@ioquatix]) +- `Files` handling of range requests no longer return a body that supports `to_path`, to ensure range requests are handled correctly. ([@jeremyevans]) +- `Multipart::Generator` only includes `Content-Length` for files with paths, and `Content-Disposition` `filename` if the `UploadedFile` instance has one. ([@jeremyevans]) +- `Request#ssl?` is true for the `wss` scheme (secure websockets). ([@jeremyevans]) +- `Rack::HeaderHash` is memoized by default. ([#1549](https://github.com/rack/rack/pull/1549), [@ioquatix]) +- `Rack::Directory` allow directory traversal inside root directory. ([#1417](https://github.com/rack/rack/pull/1417), [@ThomasSevestre](https://github.com/ThomasSevestre)) +- Sort encodings by server preference. ([#1184](https://github.com/rack/rack/pull/1184), [@ioquatix], [@wjordan](https://github.com/wjordan)) +- Rework host/hostname/authority implementation in `Rack::Request`. `#host` and `#host_with_port` have been changed to correctly return IPv6 addresses formatted with square brackets, as defined by [RFC3986](https://tools.ietf.org/html/rfc3986#section-3.2.2). ([#1561](https://github.com/rack/rack/pull/1561), [@ioquatix]) +- `Rack::Builder` parsing options on first `#\` line is deprecated. ([#1574](https://github.com/rack/rack/pull/1574), [@ioquatix]) + +### Removed + +- `Directory#path` as it was not used and always returned nil. ([@jeremyevans]) +- `BodyProxy#each` as it was only needed to work around a bug in Ruby <1.9.3. ([@jeremyevans]) +- `URLMap::INFINITY` and `URLMap::NEGATIVE_INFINITY`, in favor of `Float::INFINITY`. ([@ch1c0t](https://github.com/ch1c0t)) +- Deprecation of `Rack::File`. It will be deprecated again in rack 2.2 or 3.0. ([@rafaelfranca](https://github.com/rafaelfranca)) +- Support for Ruby 2.2 as it is well past EOL. ([@ioquatix]) +- Remove `Rack::Files#response_body` as the implementation was broken. ([#1153](https://github.com/rack/rack/pull/1153), [@ioquatix]) +- Remove `SERVER_ADDR` which was never part of the original SPEC. ([#1573](https://github.com/rack/rack/pull/1573), [@ioquatix]) + +### Fixed + +- `Directory` correctly handles root paths containing glob metacharacters. ([@jeremyevans]) +- `Cascade` uses a new response object for each call if initialized with no apps. ([@jeremyevans]) +- `BodyProxy` correctly delegates keyword arguments to the body object on Ruby 2.7+. ([@jeremyevans]) +- `BodyProxy#method` correctly handles methods delegated to the body object. ([@jeremyevans]) +- `Request#host` and `Request#host_with_port` handle IPv6 addresses correctly. ([@AlexWayfer](https://github.com/AlexWayfer)) +- `Lint` checks when response hijacking that `rack.hijack` is called with a valid object. ([@jeremyevans]) +- `Response#write` correctly updates `Content-Length` if initialized with a body. ([@jeremyevans]) +- `CommonLogger` includes `SCRIPT_NAME` when logging. ([@Erol](https://github.com/Erol)) +- `Utils.parse_nested_query` correctly handles empty queries, using an empty instance of the params class instead of a hash. ([@jeremyevans]) +- `Directory` correctly escapes paths in links. ([@yous](https://github.com/yous)) +- `Request#delete_cookie` and related `Utils` methods handle `:domain` and `:path` options in same call. ([@jeremyevans]) +- `Request#delete_cookie` and related `Utils` methods do an exact match on `:domain` and `:path` options. ([@jeremyevans]) +- `Static` no longer adds headers when a gzipped file request has a 304 response. ([@chooh](https://github.com/chooh)) +- `ContentLength` sets `Content-Length` response header even for bodies not responding to `to_ary`. ([@jeremyevans]) +- Thin handler supports options passed directly to `Thin::Controllers::Controller`. ([@jeremyevans]) +- WEBrick handler no longer ignores `:BindAddress` option. ([@jeremyevans]) +- `ShowExceptions` handles invalid POST data. ([@jeremyevans]) +- Basic authentication requires a password, even if the password is empty. ([@jeremyevans]) +- `Lint` checks response is array with 3 elements, per SPEC. ([@jeremyevans]) +- Support for using `:SSLEnable` option when using WEBrick handler. (Gregor Melhorn) +- Close response body after buffering it when buffering. ([@ioquatix]) +- Only accept `;` as delimiter when parsing cookies. ([@mrageh](https://github.com/mrageh)) +- `Utils::HeaderHash#clear` clears the name mapping as well. ([@raxoft](https://github.com/raxoft)) +- Support for passing `nil` `Rack::Files.new`, which notably fixes Rails' current `ActiveStorage::FileServer` implementation. ([@ioquatix]) + +### Documentation + +- CHANGELOG updates. ([@aupajo](https://github.com/aupajo)) +- Added [CONTRIBUTING](CONTRIBUTING.md). ([@dblock](https://github.com/dblock)) + +## [2.0.9] - 2020-02-08 + +- Handle case where session id key is requested but missing ([@jeremyevans]) +- Restore support for code relying on `SessionId#to_s`. ([@jeremyevans]) +- Add support for `SameSite=None` cookie value. ([@hennikul](https://github.com/hennikul)) + +## [2.1.2] - 2020-01-27 + +- Fix multipart parser for some files to prevent denial of service ([@aiomaster](https://github.com/aiomaster)) +- Fix `Rack::Builder#use` with keyword arguments ([@kamipo](https://github.com/kamipo)) +- Skip deflating in Rack::Deflater if Content-Length is 0 ([@jeremyevans]) +- Remove `SessionHash#transform_keys`, no longer needed ([@pavel](https://github.com/pavel)) +- Add to_hash to wrap Hash and Session classes ([@oleh-demyanyuk](https://github.com/oleh-demyanyuk)) +- Handle case where session id key is requested but missing ([@jeremyevans]) + +## [2.1.1] - 2020-01-12 + +- Remove `Rack::Chunked` from `Rack::Server` default middleware. ([#1475](https://github.com/rack/rack/pull/1475), [@ioquatix]) +- Restore support for code relying on `SessionId#to_s`. ([@jeremyevans]) + +## [2.1.0] - 2020-01-10 + +### Added + +- Add support for `SameSite=None` cookie value. ([@hennikul](https://github.com/hennikul)) +- Add trailer headers. ([@eileencodes](https://github.com/eileencodes)) +- Add MIME Types for video streaming. ([@styd](https://github.com/styd)) +- Add MIME Type for WASM. ([@buildrtech](https://github.com/buildrtech)) +- Add `Early Hints(103)` to status codes. ([@egtra](https://github.com/egtra)) +- Add `Too Early(425)` to status codes. ([@y-yagi]((https://github.com/y-yagi))) +- Add `Bandwidth Limit Exceeded(509)` to status codes. ([@CJKinni](https://github.com/CJKinni)) +- Add method for custom `ip_filter`. ([@svcastaneda](https://github.com/svcastaneda)) +- Add boot-time profiling capabilities to `rackup`. ([@tenderlove](https://github.com/tenderlove)) +- Add multi mapping support for `X-Accel-Mappings` header. ([@yoshuki](https://github.com/yoshuki)) +- Add `sync: false` option to `Rack::Deflater`. (Eric Wong) +- Add `Builder#freeze_app` to freeze application and all middleware instances. ([@jeremyevans]) +- Add API to extract cookies from `Rack::MockResponse`. ([@petercline](https://github.com/petercline)) + +### Changed + +- Don't propagate nil values from middleware. ([@ioquatix]) +- Lazily initialize the response body and only buffer it if required. ([@ioquatix]) +- Fix deflater zlib buffer errors on empty body part. ([@felixbuenemann](https://github.com/felixbuenemann)) +- Set `X-Accel-Redirect` to percent-encoded path. ([@diskkid](https://github.com/diskkid)) +- Remove unnecessary buffer growing when parsing multipart. ([@tainoe](https://github.com/tainoe)) +- Expand the root path in `Rack::Static` upon initialization. ([@rosenfeld](https://github.com/rosenfeld)) +- Make `ShowExceptions` work with binary data. ([@axyjo](https://github.com/axyjo)) +- Use buffer string when parsing multipart requests. ([@janko-m](https://github.com/janko-m)) +- Support optional UTF-8 Byte Order Mark (BOM) in config.ru. ([@mikegee](https://github.com/mikegee)) +- Handle `X-Forwarded-For` with optional port. ([@dpritchett](https://github.com/dpritchett)) +- Use `Time#httpdate` format for Expires, as proposed by RFC 7231. ([@nanaya](https://github.com/nanaya)) +- Make `Utils.status_code` raise an error when the status symbol is invalid instead of `500`. ([@adambutler](https://github.com/adambutler)) +- Rename `Request::SCHEME_WHITELIST` to `Request::ALLOWED_SCHEMES`. +- Make `Multipart::Parser.get_filename` accept files with `+` in their name. ([@lucaskanashiro](https://github.com/lucaskanashiro)) +- Add Falcon to the default handler fallbacks. ([@ioquatix]) +- Update codebase to avoid string mutations in preparation for `frozen_string_literals`. ([@pat](https://github.com/pat)) +- Change `MockRequest#env_for` to rely on the input optionally responding to `#size` instead of `#length`. ([@janko](https://github.com/janko)) +- Rename `Rack::File` -> `Rack::Files` and add deprecation notice. ([@postmodern](https://github.com/postmodern)) +- Prefer Base64 “strict encoding” for Base64 cookies. ([@ioquatix]) + +### Removed + +- BREAKING CHANGE: Remove `to_ary` from Response ([@tenderlove](https://github.com/tenderlove)) +- Deprecate `Rack::Session::Memcache` in favor of `Rack::Session::Dalli` from dalli gem ([@fatkodima](https://github.com/fatkodima)) + +### Fixed + +- Eliminate warnings for Ruby 2.7. ([@osamtimizer](https://github.com/osamtimizer])) + +### Documentation + +- Update broken example in `Session::Abstract::ID` documentation. ([tonytonyjan](https://github.com/tonytonyjan)) +- Add Padrino to the list of frameworks implementing Rack. ([@wikimatze](https://github.com/wikimatze)) +- Remove Mongrel from the suggested server options in the help output. ([@tricknotes](https://github.com/tricknotes)) +- Replace `HISTORY.md` and `NEWS.md` with `CHANGELOG.md`. ([@twitnithegirl](https://github.com/twitnithegirl)) +- CHANGELOG updates. ([@drenmi](https://github.com/Drenmi), [@p8](https://github.com/p8)) + +## [2.0.8] - 2019-12-08 + +### Security + +- [[CVE-2019-16782](https://nvd.nist.gov/vuln/detail/CVE-2019-16782)] Prevent timing attacks targeted at session ID lookup. BREAKING CHANGE: Session ID is now a SessionId instance instead of a String. ([@tenderlove](https://github.com/tenderlove), [@rafaelfranca](https://github.com/rafaelfranca)) + +## [1.6.12] - 2019-12-08 + +### Security + +- [[CVE-2019-16782](https://nvd.nist.gov/vuln/detail/CVE-2019-16782)] Prevent timing attacks targeted at session ID lookup. BREAKING CHANGE: Session ID is now a SessionId instance instead of a String. ([@tenderlove](https://github.com/tenderlove), [@rafaelfranca](https://github.com/rafaelfranca)) + +## [2.0.7] - 2019-04-02 + +### Fixed + +- Remove calls to `#eof?` on Rack input in `Multipart::Parser`, as this breaks the specification. ([@matthewd](https://github.com/matthewd)) +- Preserve forwarded IP addresses for trusted proxy chains. ([@SamSaffron](https://github.com/SamSaffron)) + +## [2.0.6] - 2018-11-05 + +### Fixed + +- [[CVE-2018-16470](https://nvd.nist.gov/vuln/detail/CVE-2018-16470)] Reduce buffer size of `Multipart::Parser` to avoid pathological parsing. ([@tenderlove](https://github.com/tenderlove)) +- Fix a call to a non-existing method `#accepts_html` in the `ShowExceptions` middleware. ([@tomelm](https://github.com/tomelm)) +- [[CVE-2018-16471](https://nvd.nist.gov/vuln/detail/CVE-2018-16471)] Whitelist HTTP and HTTPS schemes in `Request#scheme` to prevent a possible XSS attack. ([@PatrickTulskie](https://github.com/PatrickTulskie)) + +## [2.0.5] - 2018-04-23 + +### Fixed + +- Record errors originating from invalid UTF8 in `MethodOverride` middleware instead of breaking. ([@mclark](https://github.com/mclark)) + +## [2.0.4] - 2018-01-31 + +### Changed + +- Ensure the `Lock` middleware passes the original `env` object. ([@lugray](https://github.com/lugray)) +- Improve performance of `Multipart::Parser` when uploading large files. ([@tompng](https://github.com/tompng)) +- Increase buffer size in `Multipart::Parser` for better performance. ([@jkowens](https://github.com/jkowens)) +- Reduce memory usage of `Multipart::Parser` when uploading large files. ([@tompng](https://github.com/tompng)) +- Replace ConcurrentRuby dependency with native `Queue`. ([@devmchakan](https://github.com/devmchakan)) + +### Fixed + +- Require the correct digest algorithm in the `ETag` middleware. ([@matthewd](https://github.com/matthewd)) + +### Documentation + +- Update homepage links to use SSL. ([@hugoabonizio](https://github.com/hugoabonizio)) + +## [2.0.3] - 2017-05-15 + +### Changed + +- Ensure `env` values are ASCII 8-bit encoded. ([@eileencodes](https://github.com/eileencodes)) + +### Fixed + +- Prevent exceptions when a class with mixins inherits from `Session::Abstract::ID`. ([@jnraine](https://github.com/jnraine)) + +## [2.0.2] - 2017-05-08 + +### Added + +- Allow `Session::Abstract::SessionHash#fetch` to accept a block with a default value. ([@yannvanhalewyn](https://github.com/yannvanhalewyn)) +- Add `Builder#freeze_app` to freeze application and all middleware. ([@jeremyevans]) + +### Changed + +- Freeze default session options to avoid accidental mutation. ([@kirs](https://github.com/kirs)) +- Detect partial hijack without hash headers. ([@devmchakan](https://github.com/devmchakan)) +- Update tests to use MiniTest 6 matchers. ([@tonytonyjan](https://github.com/tonytonyjan)) +- Allow 205 Reset Content responses to set a Content-Length, as RFC 7231 proposes setting this to 0. ([@devmchakan](https://github.com/devmchakan)) + +### Fixed + +- Handle `NULL` bytes in multipart filenames. ([@casperisfine](https://github.com/casperisfine)) +- Remove warnings due to miscapitalized global. ([@ioquatix]) +- Prevent exceptions caused by a race condition on multi-threaded servers. ([@sophiedeziel](https://github.com/sophiedeziel)) +- Add RDoc as an explicit dependency for `doc` group. ([@tonytonyjan](https://github.com/tonytonyjan)) +- Record errors originating from `Multipart::Parser` in the `MethodOverride` middleware instead of letting them bubble up. ([@carlzulauf](https://github.com/carlzulauf)) +- Remove remaining use of removed `Utils#bytesize` method from the `File` middleware. ([@brauliomartinezlm](https://github.com/brauliomartinezlm)) + +### Removed + +- Remove `deflate` encoding support to reduce caching overhead. ([@devmchakan](https://github.com/devmchakan)) + +### Documentation + +- Update broken example in `Deflater` documentation. ([@mwpastore](https://github.com/mwpastore)) + +## [2.0.1] - 2016-06-30 + +### Changed + +- Remove JSON as an explicit dependency. ([@mperham](https://github.com/mperham)) + + +# History/News Archive +Items below this line are from the previously maintained HISTORY.md and NEWS.md files. + +## [2.0.0.rc1] 2016-05-06 +- Rack::Session::Abstract::ID is deprecated. Please change to use Rack::Session::Abstract::Persisted + +## [2.0.0.alpha] 2015-12-04 +- First-party "SameSite" cookies. Browsers omit SameSite cookies from third-party requests, closing the door on many CSRF attacks. +- Pass `same_site: true` (or `:strict`) to enable: response.set_cookie 'foo', value: 'bar', same_site: true or `same_site: :lax` to use Lax enforcement: response.set_cookie 'foo', value: 'bar', same_site: :lax +- Based on version 7 of the Same-site Cookies internet draft: + https://tools.ietf.org/html/draft-west-first-party-cookies-07 +- Thanks to Ben Toews (@mastahyeti) and Bob Long (@bobjflong) for updating to drafts 5 and 7. +- Add `Rack::Events` middleware for adding event based middleware: middleware that does not care about the response body, but only cares about doing work at particular points in the request / response lifecycle. +- Add `Rack::Request#authority` to calculate the authority under which the response is being made (this will be handy for h2 pushes). +- Add `Rack::Response::Helpers#cache_control` and `cache_control=`. Use this for setting cache control headers on your response objects. +- Add `Rack::Response::Helpers#etag` and `etag=`. Use this for setting etag values on the response. +- Introduce `Rack::Response::Helpers#add_header` to add a value to a multi-valued response header. Implemented in terms of other `Response#*_header` methods, so it's available to any response-like class that includes the `Helpers` module. +- Add `Rack::Request#add_header` to match. +- `Rack::Session::Abstract::ID` IS DEPRECATED. Please switch to `Rack::Session::Abstract::Persisted`. `Rack::Session::Abstract::Persisted` uses a request object rather than the `env` hash. +- Pull `ENV` access inside the request object in to a module. This will help with legacy Request objects that are ENV based but don't want to inherit from Rack::Request +- Move most methods on the `Rack::Request` to a module `Rack::Request::Helpers` and use public API to get values from the request object. This enables users to mix `Rack::Request::Helpers` in to their own objects so they can implement `(get|set|fetch|each)_header` as they see fit (for example a proxy object). +- Files and directories with + in the name are served correctly. Rather than unescaping paths like a form, we unescape with a URI parser using `Rack::Utils.unescape_path`. Fixes #265 +- Tempfiles are automatically closed in the case that there were too + many posted. +- Added methods for manipulating response headers that don't assume + they're stored as a Hash. Response-like classes may include the + Rack::Response::Helpers module if they define these methods: + - Rack::Response#has_header? + - Rack::Response#get_header + - Rack::Response#set_header + - Rack::Response#delete_header +- Introduce Util.get_byte_ranges that will parse the value of the HTTP_RANGE string passed to it without depending on the `env` hash. `byte_ranges` is deprecated in favor of this method. +- Change Session internals to use Request objects for looking up session information. This allows us to only allocate one request object when dealing with session objects (rather than doing it every time we need to manipulate cookies, etc). +- Add `Rack::Request#initialize_copy` so that the env is duped when the request gets duped. +- Added methods for manipulating request specific data. This includes + data set as CGI parameters, and just any arbitrary data the user wants + to associate with a particular request. New methods: + - Rack::Request#has_header? + - Rack::Request#get_header + - Rack::Request#fetch_header + - Rack::Request#each_header + - Rack::Request#set_header + - Rack::Request#delete_header +- lib/rack/utils.rb: add a method for constructing "delete" cookie + headers. This allows us to construct cookie headers without depending + on the side effects of mutating a hash. +- Prevent extremely deep parameters from being parsed. CVE-2015-3225 + +## [1.6.1] 2015-05-06 + - Fix CVE-2014-9490, denial of service attack in OkJson + - Use a monotonic time for Rack::Runtime, if available + - RACK_MULTIPART_LIMIT changed to RACK_MULTIPART_PART_LIMIT (RACK_MULTIPART_LIMIT is deprecated and will be removed in 1.7.0) + +## [1.5.3] 2015-05-06 + - Fix CVE-2014-9490, denial of service attack in OkJson + - Backport bug fixes to 1.5 series + +## [1.6.0] 2014-01-18 + - Response#unauthorized? helper + - Deflater now accepts an options hash to control compression on a per-request level + - Builder#warmup method for app preloading + - Request#accept_language method to extract HTTP_ACCEPT_LANGUAGE + - Add quiet mode of rack server, rackup --quiet + - Update HTTP Status Codes to RFC 7231 + - Less strict header name validation according to RFC 2616 + - SPEC updated to specify headers conform to RFC7230 specification + - Etag correctly marks etags as weak + - Request#port supports multiple x-http-forwarded-proto values + - Utils#multipart_part_limit configures the maximum number of parts a request can contain + - Default host to localhost when in development mode + - Various bugfixes and performance improvements + +## [1.5.2] 2013-02-07 + - Fix CVE-2013-0263, timing attack against Rack::Session::Cookie + - Fix CVE-2013-0262, symlink path traversal in Rack::File + - Add various methods to Session for enhanced Rails compatibility + - Request#trusted_proxy? now only matches whole strings + - Add JSON cookie coder, to be default in Rack 1.6+ due to security concerns + - URLMap host matching in environments that don't set the Host header fixed + - Fix a race condition that could result in overwritten pidfiles + - Various documentation additions + +## [1.4.5] 2013-02-07 + - Fix CVE-2013-0263, timing attack against Rack::Session::Cookie + - Fix CVE-2013-0262, symlink path traversal in Rack::File + +## [1.1.6, 1.2.8, 1.3.10] 2013-02-07 + - Fix CVE-2013-0263, timing attack against Rack::Session::Cookie + +## [1.5.1] 2013-01-28 + - Rack::Lint check_hijack now conforms to other parts of SPEC + - Added hash-like methods to Abstract::ID::SessionHash for compatibility + - Various documentation corrections + +## [1.5.0] 2013-01-21 + - Introduced hijack SPEC, for before-response and after-response hijacking + - SessionHash is no longer a Hash subclass + - Rack::File cache_control parameter is removed, in place of headers options + - Rack::Auth::AbstractRequest#scheme now yields strings, not symbols + - Rack::Utils cookie functions now format expires in RFC 2822 format + - Rack::File now has a default mime type + - rackup -b 'run Rack::Files.new(".")', option provides command line configs + - Rack::Deflater will no longer double encode bodies + - Rack::Mime#match? provides convenience for Accept header matching + - Rack::Utils#q_values provides splitting for Accept headers + - Rack::Utils#best_q_match provides a helper for Accept headers + - Rack::Handler.pick provides convenience for finding available servers + - Puma added to the list of default servers (preferred over Webrick) + - Various middleware now correctly close body when replacing it + - Rack::Request#params is no longer persistent with only GET params + - Rack::Request#update_param and #delete_param provide persistent operations + - Rack::Request#trusted_proxy? now returns true for local unix sockets + - Rack::Response no longer forces Content-Types + - Rack::Sendfile provides local mapping configuration options + - Rack::Utils#rfc2109 provides old netscape style time output + - Updated HTTP status codes + - Ruby 1.8.6 likely no longer passes tests, and is no longer fully supported + +## [1.4.4, 1.3.9, 1.2.7, 1.1.5] 2013-01-13 + - [SEC] Rack::Auth::AbstractRequest no longer symbolizes arbitrary strings + - Fixed erroneous test case in the 1.3.x series + +## [1.4.3] 2013-01-07 + - Security: Prevent unbounded reads in large multipart boundaries + +## [1.3.8] 2013-01-07 + - Security: Prevent unbounded reads in large multipart boundaries + +## [1.4.2] 2013-01-06 + - Add warnings when users do not provide a session secret + - Fix parsing performance for unquoted filenames + - Updated URI backports + - Fix URI backport version matching, and silence constant warnings + - Correct parameter parsing with empty values + - Correct rackup '-I' flag, to allow multiple uses + - Correct rackup pidfile handling + - Report rackup line numbers correctly + - Fix request loops caused by non-stale nonces with time limits + - Fix reloader on Windows + - Prevent infinite recursions from Response#to_ary + - Various middleware better conforms to the body close specification + - Updated language for the body close specification + - Additional notes regarding ECMA escape compatibility issues + - Fix the parsing of multiple ranges in range headers + - Prevent errors from empty parameter keys + - Added PATCH verb to Rack::Request + - Various documentation updates + - Fix session merge semantics (fixes rack-test) + - Rack::Static :index can now handle multiple directories + - All tests now utilize Rack::Lint (special thanks to Lars Gierth) + - Rack::File cache_control parameter is now deprecated, and removed by 1.5 + - Correct Rack::Directory script name escaping + - Rack::Static supports header rules for sophisticated configurations + - Multipart parsing now works without a Content-Length header + - New logos courtesy of Zachary Scott! + - Rack::BodyProxy now explicitly defines #each, useful for C extensions + - Cookies that are not URI escaped no longer cause exceptions + +## [1.3.7] 2013-01-06 + - Add warnings when users do not provide a session secret + - Fix parsing performance for unquoted filenames + - Updated URI backports + - Fix URI backport version matching, and silence constant warnings + - Correct parameter parsing with empty values + - Correct rackup '-I' flag, to allow multiple uses + - Correct rackup pidfile handling + - Report rackup line numbers correctly + - Fix request loops caused by non-stale nonces with time limits + - Fix reloader on Windows + - Prevent infinite recursions from Response#to_ary + - Various middleware better conforms to the body close specification + - Updated language for the body close specification + - Additional notes regarding ECMA escape compatibility issues + - Fix the parsing of multiple ranges in range headers + +## [1.2.6] 2013-01-06 + - Add warnings when users do not provide a session secret + - Fix parsing performance for unquoted filenames + +## [1.1.4] 2013-01-06 + - Add warnings when users do not provide a session secret + +## [1.4.1] 2012-01-22 + - Alter the keyspace limit calculations to reduce issues with nested params + - Add a workaround for multipart parsing where files contain unescaped "%" + - Added Rack::Response::Helpers#method_not_allowed? (code 405) + - Rack::File now returns 404 for illegal directory traversals + - Rack::File now returns 405 for illegal methods (non HEAD/GET) + - Rack::Cascade now catches 405 by default, as well as 404 + - Cookies missing '--' no longer cause an exception to be raised + - Various style changes and documentation spelling errors + - Rack::BodyProxy always ensures to execute its block + - Additional test coverage around cookies and secrets + - Rack::Session::Cookie can now be supplied either secret or old_secret + - Tests are no longer dependent on set order + - Rack::Static no longer defaults to serving index files + - Rack.release was fixed + +## [1.4.0] 2011-12-28 + - Ruby 1.8.6 support has officially been dropped. Not all tests pass. + - Raise sane error messages for broken config.ru + - Allow combining run and map in a config.ru + - Rack::ContentType will not set Content-Type for responses without a body + - Status code 205 does not send a response body + - Rack::Response::Helpers will not rely on instance variables + - Rack::Utils.build_query no longer outputs '=' for nil query values + - Various mime types added + - Rack::MockRequest now supports HEAD + - Rack::Directory now supports files that contain RFC3986 reserved chars + - Rack::File now only supports GET and HEAD requests + - Rack::Server#start now passes the block to Rack::Handler::#run + - Rack::Static now supports an index option + - Added the Teapot status code + - rackup now defaults to Thin instead of Mongrel (if installed) + - Support added for HTTP_X_FORWARDED_SCHEME + - Numerous bug fixes, including many fixes for new and alternate rubies + +## [1.1.3] 2011-12-28 + - Security fix. http://www.ocert.org/advisories/ocert-2011-003.html + Further information here: http://jruby.org/2011/12/27/jruby-1-6-5-1 + +## [1.3.5] 2011-10-17 + - Fix annoying warnings caused by the backport in 1.3.4 + +## [1.3.4] 2011-10-01 + - Backport security fix from 1.9.3, also fixes some roundtrip issues in URI + - Small documentation update + - Fix an issue where BodyProxy could cause an infinite recursion + - Add some supporting files for travis-ci + +## [1.2.4] 2011-09-16 + - Fix a bug with MRI regex engine to prevent XSS by malformed unicode + +## [1.3.3] 2011-09-16 + - Fix bug with broken query parameters in Rack::ShowExceptions + - Rack::Request#cookies no longer swallows exceptions on broken input + - Prevents XSS attacks enabled by bug in Ruby 1.8's regexp engine + - Rack::ConditionalGet handles broken If-Modified-Since helpers + +## [1.3.2] 2011-07-16 + - Fix for Rails and rack-test, Rack::Utils#escape calls to_s + +## [1.3.1] 2011-07-13 + - Fix 1.9.1 support + - Fix JRuby support + - Properly handle $KCODE in Rack::Utils.escape + - Make method_missing/respond_to behavior consistent for Rack::Lock, + Rack::Auth::Digest::Request and Rack::Multipart::UploadedFile + - Reenable passing rack.session to session middleware + - Rack::CommonLogger handles streaming responses correctly + - Rack::MockResponse calls close on the body object + - Fix a DOS vector from MRI stdlib backport + +## [1.2.3] 2011-05-22 + - Pulled in relevant bug fixes from 1.3 + - Fixed 1.8.6 support + +## [1.3.0] 2011-05-22 + - Various performance optimizations + - Various multipart fixes + - Various multipart refactors + - Infinite loop fix for multipart + - Test coverage for Rack::Server returns + - Allow files with '..', but not path components that are '..' + - rackup accepts handler-specific options on the command line + - Request#params no longer merges POST into GET (but returns the same) + - Use URI.encode_www_form_component instead. Use core methods for escaping. + - Allow multi-line comments in the config file + - Bug L#94 reported by Nikolai Lugovoi, query parameter unescaping. + - Rack::Response now deletes Content-Length when appropriate + - Rack::Deflater now supports streaming + - Improved Rack::Handler loading and searching + - Support for the PATCH verb + - env['rack.session.options'] now contains session options + - Cookies respect renew + - Session middleware uses SecureRandom.hex + +## [1.2.2, 1.1.2] 2011-03-13 + - Security fix in Rack::Auth::Digest::MD5: when authenticator + returned nil, permission was granted on empty password. + +## [1.2.1] 2010-06-15 + - Make CGI handler rewindable + - Rename spec/ to test/ to not conflict with SPEC on lesser + operating systems + +## [1.2.0] 2010-06-13 + - Removed Camping adapter: Camping 2.0 supports Rack as-is + - Removed parsing of quoted values + - Add Request.trace? and Request.options? + - Add mime-type for .webm and .htc + - Fix HTTP_X_FORWARDED_FOR + - Various multipart fixes + - Switch test suite to bacon + +## [1.1.0] 2010-01-03 + - Moved Auth::OpenID to rack-contrib. + - SPEC change that relaxes Lint slightly to allow subclasses of the + required types + - SPEC change to document rack.input binary mode in greater detail + - SPEC define optional rack.logger specification + - File servers support X-Cascade header + - Imported Config middleware + - Imported ETag middleware + - Imported Runtime middleware + - Imported Sendfile middleware + - New Logger and NullLogger middlewares + - Added mime type for .ogv and .manifest. + - Don't squeeze PATH_INFO slashes + - Use Content-Type to determine POST params parsing + - Update Rack::Utils::HTTP_STATUS_CODES hash + - Add status code lookup utility + - Response should call #to_i on the status + - Add Request#user_agent + - Request#host knows about forwarded host + - Return an empty string for Request#host if HTTP_HOST and + SERVER_NAME are both missing + - Allow MockRequest to accept hash params + - Optimizations to HeaderHash + - Refactored rackup into Rack::Server + - Added Utils.build_nested_query to complement Utils.parse_nested_query + - Added Utils::Multipart.build_multipart to complement + Utils::Multipart.parse_multipart + - Extracted set and delete cookie helpers into Utils so they can be + used outside Response + - Extract parse_query and parse_multipart in Request so subclasses + can change their behavior + - Enforce binary encoding in RewindableInput + - Set correct external_encoding for handlers that don't use RewindableInput + +## [1.0.1] 2009-10-18 + - Bump remainder of rack.versions. + - Support the pure Ruby FCGI implementation. + - Fix for form names containing "=": split first then unescape components + - Fixes the handling of the filename parameter with semicolons in names. + - Add anchor to nested params parsing regexp to prevent stack overflows + - Use more compatible gzip write api instead of "<<". + - Make sure that Reloader doesn't break when executed via ruby -e + - Make sure WEBrick respects the :Host option + - Many Ruby 1.9 fixes. + +## [1.0.0] 2009-04-25 + - SPEC change: Rack::VERSION has been pushed to [1,0]. + - SPEC change: header values must be Strings now, split on "\n". + - SPEC change: Content-Length can be missing, in this case chunked transfer + encoding is used. + - SPEC change: rack.input must be rewindable and support reading into + a buffer, wrap with Rack::RewindableInput if it isn't. + - SPEC change: rack.session is now specified. + - SPEC change: Bodies can now additionally respond to #to_path with + a filename to be served. + - NOTE: String bodies break in 1.9, use an Array consisting of a + single String instead. + - New middleware Rack::Lock. + - New middleware Rack::ContentType. + - Rack::Reloader has been rewritten. + - Major update to Rack::Auth::OpenID. + - Support for nested parameter parsing in Rack::Response. + - Support for redirects in Rack::Response. + - HttpOnly cookie support in Rack::Response. + - The Rakefile has been rewritten. + - Many bugfixes and small improvements. + +## [0.9.1] 2009-01-09 + - Fix directory traversal exploits in Rack::File and Rack::Directory. + +## [0.9] 2009-01-06 + - Rack is now managed by the Rack Core Team. + - Rack::Lint is stricter and follows the HTTP RFCs more closely. + - Added ConditionalGet middleware. + - Added ContentLength middleware. + - Added Deflater middleware. + - Added Head middleware. + - Added MethodOverride middleware. + - Rack::Mime now provides popular MIME-types and their extension. + - Mongrel Header now streams. + - Added Thin handler. + - Official support for swiftiplied Mongrel. + - Secure cookies. + - Made HeaderHash case-preserving. + - Many bugfixes and small improvements. + +## [0.4] 2008-08-21 + - New middleware, Rack::Deflater, by Christoffer Sawicki. + - OpenID authentication now needs ruby-openid 2. + - New Memcache sessions, by blink. + - Explicit EventedMongrel handler, by Joshua Peek + - Rack::Reloader is not loaded in rackup development mode. + - rackup can daemonize with -D. + - Many bugfixes, especially for pool sessions, URLMap, thread safety + and tempfile handling. + - Improved tests. + - Rack moved to Git. + +## [0.3] 2008-02-26 + - LiteSpeed handler, by Adrian Madrid. + - SCGI handler, by Jeremy Evans. + - Pool sessions, by blink. + - OpenID authentication, by blink. + - :Port and :File options for opening FastCGI sockets, by blink. + - Last-Modified HTTP header for Rack::File, by blink. + - Rack::Builder#use now accepts blocks, by Corey Jewett. + (See example/protectedlobster.ru) + - HTTP status 201 can contain a Content-Type and a body now. + - Many bugfixes, especially related to Cookie handling. + +## [0.2] 2007-05-16 + - HTTP Basic authentication. + - Cookie Sessions. + - Static file handler. + - Improved Rack::Request. + - Improved Rack::Response. + - Added Rack::ShowStatus, for better default error messages. + - Bug fixes in the Camping adapter. + - Removed Rails adapter, was too alpha. + +## [0.1] 2007-03-03 + +[@ioquatix]: https://github.com/ioquatix "Samuel Williams" +[@jeremyevans]: https://github.com/jeremyevans "Jeremy Evans" +[@amatsuda]: https://github.com/amatsuda "Akira Matsuda" +[@wjordan]: https://github.com/wjordan "Will Jordan" +[@BlakeWilliams]: https://github.com/BlakeWilliams "Blake Williams" +[@davidstosik]: https://github.com/davidstosik "David Stosik" +[@earlopain]: https://github.com/earlopain "Earlopain" +[@wynksaiddestroy]: https://github.com/wynksaiddestroy "Fabian Winkler" +[@matthewd]: https://github.com/matthewd "Matthew Draper" diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/CONTRIBUTING.md b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/CONTRIBUTING.md new file mode 100644 index 0000000..a95263d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/CONTRIBUTING.md @@ -0,0 +1,144 @@ +# Contributing to Rack + +Rack is work of [hundreds of +contributors](https://github.com/rack/rack/graphs/contributors). You're +encouraged to submit [pull requests](https://github.com/rack/rack/pulls) and +[propose features and discuss issues](https://github.com/rack/rack/issues). + +## Backports + +Only security patches are ideal for backporting to non-main release versions. If +you're not sure if your bug fix is backportable, you should open a discussion to +discuss it first. + +The [Security Policy] documents which release versions will receive security +backports. + +## Fork the Project + +Fork the [project on GitHub](https://github.com/rack/rack) and check out your +copy. + +``` +git clone https://github.com/(your-github-username)/rack.git +cd rack +git remote add upstream https://github.com/rack/rack.git +``` + +## Create a Topic Branch + +Make sure your fork is up-to-date and create a topic branch for your feature or +bug fix. + +``` +git checkout main +git pull upstream main +git checkout -b my-feature-branch +``` + +## Running All Tests + +Install all dependencies. + +``` +bundle install +``` + +Run all tests. + +``` +rake test +``` + +## Write Tests + +Try to write a test that reproduces the problem you're trying to fix or +describes a feature that you want to build. + +We definitely appreciate pull requests that highlight or reproduce a problem, +even without a fix. + +## Write Code + +Implement your feature or bug fix. + +Make sure that all tests pass: + +``` +bundle exec rake test +``` + +## Write Documentation + +Document any external behavior in the [README](README.md). + +## Update Changelog + +Add a line to [CHANGELOG](CHANGELOG.md). + +## Commit Changes + +Make sure git knows your name and email address: + +``` +git config --global user.name "Your Name" +git config --global user.email "contributor@example.com" +``` + +Writing good commit logs is important. A commit log should describe what changed +and why. + +``` +git add ... +git commit +``` + +## Push + +``` +git push origin my-feature-branch +``` + +## Make a Pull Request + +Go to your fork of rack on GitHub and select your feature branch. Click the +'Pull Request' button and fill out the form. Pull requests are usually +reviewed within a few days. + +## Rebase + +If you've been working on a change for a while, rebase with upstream/main. + +``` +git fetch upstream +git rebase upstream/main +git push origin my-feature-branch -f +``` + +## Make Required Changes + +Amend your previous commit and force push the changes. + +``` +git commit --amend +git push origin my-feature-branch -f +``` + +## Check on Your Pull Request + +Go back to your pull request after a few minutes and see whether it passed +tests with GitHub Actions. Everything should look green, otherwise fix issues and +amend your commit as described above. + +## Be Patient + +It's likely that your change will not be merged and that the nitpicky +maintainers will ask you to do more, or fix seemingly benign problems. Hang in +there! + +## Thank You + +Please do know that we really appreciate and value your time and work. We love +you, really. + +[Security Policy]: SECURITY.md diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/MIT-LICENSE b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/MIT-LICENSE new file mode 100644 index 0000000..fb33b7f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/MIT-LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (C) 2007-2021 Leah Neukirchen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/README.md b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/README.md new file mode 100644 index 0000000..35b4132 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/README.md @@ -0,0 +1,376 @@ +# ![Rack](contrib/logo.webp) + +Rack provides a minimal, modular, and adaptable interface for developing web +applications in Ruby. By wrapping HTTP requests and responses in the simplest +way possible, it unifies and distills the bridge between web servers, web +frameworks, and web application into a single method call. + +The exact details of this are described in the [Rack Specification], which all +Rack applications should conform to. Browse the [Documentation] for more +information. + +## Version support + +| Version | Support | +|----------|------------------------------------| +| 3.2.x | Bug fixes and security patches. | +| 3.1.x | Security patches only. | +| 3.0.x | End of support. | +| 2.2.x | Security patches only. | +| <= 2.1.x | End of support. | + +**Rack 2.2.x is in security maintenance mode**. Please upgrade to Rack 3.1+ as soon +as possible to ensure you are receiving the latest features and security patches. + +Please see the [Security Policy] for more information. + +## Change log + +See the [Changelog](CHANGELOG.md) for a detailed list of changes in each version of Rack. + +### Rack 3.2 (latest release) + +This version of rack contains bug fixes and security patches. + +### Rack 3.1 + +This version of rack contains bug fixes and security patches. + +### Rack 3.0 + +This version of rack contains significant changes which are detailed in the +[Upgrade Guide](UPGRADE-GUIDE.md). It is recommended to upgrade to Rack 3 as soon +as possible to receive the latest features and security patches. + +### Rack 2.2 + +This version of Rack is receiving security patches only, and effort should be +made to move to Rack 3. + +Starting in Ruby 3.4 the `base64` dependency will no longer be a default gem, +and may cause a warning or error about `base64` being missing. To correct this, +add `base64` as a dependency to your project. + +## Installation + +Add the rack gem to your application bundle, or follow the instructions provided +by a [supported web framework](#supported-web-frameworks): + +```bash +# Install it generally: +$ gem install rack + +# or, add it to your current application gemfile: +$ bundle add rack +``` + +If you need features from `Rack::Session` or `bin/rackup` please add those gems separately. + +```bash +$ gem install rack-session rackup +``` + +## Usage + +Create a file called `config.ru` with the following contents: + +```ruby +run do |env| + [200, {}, ["Hello World"]] +end +``` + +Run this using the rackup gem or another [supported web +server](#supported-web-servers). + +```bash +$ gem install rackup +$ rackup + +# In another shell: +$ curl http://localhost:9292 +Hello World +``` + +## Supported web servers + +Rack is supported by a wide range of servers, including: + +* [Agoo](https://github.com/ohler55/agoo) +* [Falcon](https://github.com/socketry/falcon) +* [Iodine](https://github.com/boazsegev/iodine) +* [NGINX Unit](https://unit.nginx.org/) +* [Phusion Passenger](https://www.phusionpassenger.com/) (which is mod_rack for + Apache and for nginx) +* [Pitchfork](https://github.com/Shopify/pitchfork) +* [Puma](https://puma.io/) +* [Thin](https://github.com/macournoyer/thin) +* [Unicorn](https://yhbt.net/unicorn/) +* [uWSGI](https://uwsgi-docs.readthedocs.io/en/latest/) +* [Lamby](https://lamby.custominktech.com) (for AWS Lambda) + +You will need to consult the server documentation to find out what features and +limitations they may have. In general, any valid Rack app will run the same on +all these servers, without changing anything. + +### Rackup + +Rack provides a separate gem, [rackup](https://github.com/rack/rackup) which is +a generic interface for running a Rack application on supported servers, which +include `WEBRick`, `Puma`, `Falcon` and others. + +## Supported web frameworks + +These frameworks and many others support the [Rack Specification]: + +* [Camping](https://github.com/camping/camping) +* [Hanami](https://hanamirb.org/) +* [Ramaze](https://github.com/ramaze/ramaze) +* [Padrino](https://padrinorb.com/) +* [Roda](https://github.com/jeremyevans/roda) +* [Ruby on Rails](https://rubyonrails.org/) +* [Rum](https://github.com/leahneukirchen/rum) +* [Sinatra](https://sinatrarb.com/) +* [Utopia](https://github.com/socketry/utopia) +* [WABuR](https://github.com/ohler55/wabur) + +## Available middleware shipped with Rack + +Between the server and the framework, Rack can be customized to your +applications needs using middleware. Rack itself ships with the following +middleware: + +* `Rack::CommonLogger` for creating Apache-style logfiles. +* `Rack::ConditionalGet` for returning [Not + Modified](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/304) + responses when the response has not changed. +* `Rack::Config` for modifying the environment before processing the request. +* `Rack::ContentLength` for setting a `content-length` header based on body + size. +* `Rack::ContentType` for setting a default `content-type` header for responses. +* `Rack::Deflater` for compressing responses with gzip. +* `Rack::ETag` for setting `etag` header on bodies that can be buffered. +* `Rack::Events` for providing easy hooks when a request is received and when + the response is sent. +* `Rack::Head` for returning an empty body for HEAD requests. +* `Rack::Lint` for checking conformance to the [Rack Specification]. +* `Rack::Lock` for serializing requests using a mutex. +* `Rack::MethodOverride` for modifying the request method based on a submitted + parameter. +* `Rack::Recursive` for including data from other paths in the application, and + for performing internal redirects. +* `Rack::Reloader` for reloading files if they have been modified. +* `Rack::Runtime` for including a response header with the time taken to process + the request. +* `Rack::Sendfile` for working with web servers that can use optimized file + serving for file system paths. +* `Rack::ShowException` for catching unhandled exceptions and presenting them in + a nice and helpful way with clickable backtrace. +* `Rack::ShowStatus` for using nice error pages for empty client error + responses. +* `Rack::Static` for configurable serving of static files. +* `Rack::TempfileReaper` for removing temporary files creating during a request. + +All these components use the same interface, which is described in detail in the +[Rack Specification]. These optional components can be used in any way you wish. + +### Convenience interfaces + +If you want to develop outside of existing frameworks, implement your own ones, +or develop middleware, Rack provides many helpers to create Rack applications +quickly and without doing the same web stuff all over: + +* `Rack::Request` which also provides query string parsing and multipart + handling. +* `Rack::Response` for convenient generation of HTTP replies and cookie + handling. +* `Rack::MockRequest` and `Rack::MockResponse` for efficient and quick testing + of Rack application without real HTTP round-trips. +* `Rack::Cascade` for trying additional Rack applications if an application + returns a not found or method not supported response. +* `Rack::Directory` for serving files under a given directory, with directory + indexes. +* `Rack::Files` for serving files under a given directory, without directory + indexes. +* `Rack::MediaType` for parsing content-type headers. +* `Rack::Mime` for determining content-type based on file extension. +* `Rack::RewindableInput` for making any IO object rewindable, using a temporary + file buffer. +* `Rack::URLMap` to route to multiple applications inside the same process. + +## Configuration + +Rack exposes several configuration parameters to control various features of the +implementation. + +### `RACK_QUERY_PARSER_BYTESIZE_LIMIT` + +This environment variable sets the default for the maximum query string bytesize +that `Rack::QueryParser` will attempt to parse. Attempts to use a query string +that exceeds this number of bytes will result in a +`Rack::QueryParser::QueryLimitError` exception. If this enviroment variable is +provided, it must be an integer, or `Rack::QueryParser` will raise an exception. + +The default limit can be overridden on a per-`Rack::QueryParser` basis using +the `bytesize_limit` keyword argument when creating the `Rack::QueryParser`. + +### `RACK_QUERY_PARSER_PARAMS_LIMIT` + +This environment variable sets the default for the maximum number of query +parameters that `Rack::QueryParser` will attempt to parse. Attempts to use a +query string with more than this many query parameters will result in a +`Rack::QueryParser::QueryLimitError` exception. If this enviroment variable is +provided, it must be an integer, or `Rack::QueryParser` will raise an exception. + +The default limit can be overridden on a per-`Rack::QueryParser` basis using +the `params_limit` keyword argument when creating the `Rack::QueryParser`. + +This is implemented by counting the number of parameter separators in the +query string, before attempting parsing, so if the same parameter key is +used multiple times in the query, each counts as a separate parameter for +this check. + +### `param_depth_limit` + +```ruby +Rack::Utils.param_depth_limit = 32 # default +``` + +The maximum amount of nesting allowed in parameters. For example, if set to 3, +this query string would be allowed: + +``` +?a[b][c]=d +``` + +but this query string would not be allowed: + +``` +?a[b][c][d]=e +``` + +Limiting the depth prevents a possible stack overflow when parsing parameters. + +### `multipart_file_limit` + +```ruby +Rack::Utils.multipart_file_limit = 128 # default +``` + +The maximum number of parts with a filename a request can contain. Accepting +too many parts can lead to the server running out of file handles. + +The default is 128, which means that a single request can't upload more than 128 +files at once. Set to 0 for no limit. + +Can also be set via the `RACK_MULTIPART_FILE_LIMIT` environment variable. + +(This is also aliased as `multipart_part_limit` and `RACK_MULTIPART_PART_LIMIT` for compatibility) + +### `multipart_total_part_limit` + +The maximum total number of parts a request can contain of any type, including +both file and non-file form fields. + +The default is 4096, which means that a single request can't contain more than +4096 parts. + +Set to 0 for no limit. + +Can also be set via the `RACK_MULTIPART_TOTAL_PART_LIMIT` environment variable. + +## Contributing + +See [CONTRIBUTING.md](CONTRIBUTING.md) for specific details about how to make a +contribution to Rack. + +Please post bugs, suggestions and patches to [GitHub Issues](https://github.com/rack/rack/issues). + +Please check our [Security Policy](https://github.com/rack/rack/security/policy) +for responsible disclosure and security bug reporting process. Due to wide usage +of the library, it is strongly preferred that we manage timing in order to +provide viable patches at the time of disclosure. Your assistance in this matter +is greatly appreciated. + +## See Also + +### `rackup` + +A useful tool for running Rack applications from the command line, including +`Rackup::Server` (previously `Rack::Server`) for scripting servers. + +* https://github.com/rack/rackup + +### `rack-contrib` + +The plethora of useful middleware created the need for a project that collects +fresh Rack middleware. `rack-contrib` includes a variety of add-on components +for Rack and it is easy to contribute new modules. + +* https://github.com/rack/rack-contrib + +### `rack-session` + +Provides convenient session management for Rack. + +* https://github.com/rack/rack-session + +## Thanks + +The Rack Core Team, consisting of + +* Aaron Patterson [tenderlove](https://github.com/tenderlove) +* Samuel Williams [ioquatix](https://github.com/ioquatix) +* Jeremy Evans [jeremyevans](https://github.com/jeremyevans) +* Eileen Uchitelle [eileencodes](https://github.com/eileencodes) +* Matthew Draper [matthewd](https://github.com/matthewd) +* Rafael França [rafaelfranca](https://github.com/rafaelfranca) + +and the Rack Alumni + +* Ryan Tomayko [rtomayko](https://github.com/rtomayko) +* Scytrin dai Kinthra [scytrin](https://github.com/scytrin) +* Leah Neukirchen [leahneukirchen](https://github.com/leahneukirchen) +* James Tucker [raggi](https://github.com/raggi) +* Josh Peek [josh](https://github.com/josh) +* José Valim [josevalim](https://github.com/josevalim) +* Michael Fellinger [manveru](https://github.com/manveru) +* Santiago Pastorino [spastorino](https://github.com/spastorino) +* Konstantin Haase [rkh](https://github.com/rkh) + +would like to thank: + +* Adrian Madrid, for the LiteSpeed handler. +* Christoffer Sawicki, for the first Rails adapter and `Rack::Deflater`. +* Tim Fletcher, for the HTTP authentication code. +* Luc Heinrich for the Cookie sessions, the static file handler and bugfixes. +* Armin Ronacher, for the logo and racktools. +* Alex Beregszaszi, Alexander Kahn, Anil Wadghule, Aredridel, Ben Alpert, Dan + Kubb, Daniel Roethlisberger, Matt Todd, Tom Robinson, Phil Hagelberg, S. Brent + Faulkner, Bosko Milekic, Daniel Rodríguez Troitiño, Genki Takiuchi, Geoffrey + Grosenbach, Julien Sanchez, Kamal Fariz Mahyuddin, Masayoshi Takahashi, + Patrick Aljordm, Mig, Kazuhiro Nishiyama, Jon Bardin, Konstantin Haase, Larry + Siden, Matias Korhonen, Sam Ruby, Simon Chiang, Tim Connor, Timur Batyrshin, + and Zach Brock for bug fixing and other improvements. +* Eric Wong, Hongli Lai, Jeremy Kemper for their continuous support and API + improvements. +* Yehuda Katz and Carl Lerche for refactoring rackup. +* Brian Candler, for `Rack::ContentType`. +* Graham Batty, for improved handler loading. +* Stephen Bannasch, for bug reports and documentation. +* Gary Wright, for proposing a better `Rack::Response` interface. +* Jonathan Buch, for improvements regarding `Rack::Response`. +* Armin Röhrl, for tracking down bugs in the Cookie generator. +* Alexander Kellett for testing the Gem and reviewing the announcement. +* Marcus Rückert, for help with configuring and debugging lighttpd. +* The WSGI team for the well-done and documented work they've done and Rack + builds up on. +* All bug reporters and patch contributors not mentioned above. + +## License + +Rack is released under the [MIT License](MIT-LICENSE). + +[Rack Specification]: https://rack.github.io/rack/main/SPEC_rdoc.html +[Documentation]: https://rack.github.io/rack/ +[Security Policy]: SECURITY.md diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/SPEC.rdoc b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/SPEC.rdoc new file mode 100644 index 0000000..f177643 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/SPEC.rdoc @@ -0,0 +1,258 @@ += Rack Specification + +This specification aims to formalize the Rack protocol. You can (and should) use +Rack::Lint+ to enforce it. When you develop middleware, be sure to test with +Rack::Lint+ to catch possible violations of this specification. + +== The Application + +A Rack application is a Ruby object that responds to +call+. It takes exactly one argument, the +environment+ (representing an HTTP request) and returns a non-frozen +Array+ of exactly three elements: the +status+, the +headers+, and the +body+ (representing an HTTP response). + +== The Request Environment + +Incoming HTTP requests are represented using an environment. The environment must be an unfrozen +Hash+. The Rack application is free to modify the environment, but the modified environment should also comply with this specification. All environment keys must be strings. + +=== CGI Variables + +The environment is required to include these variables, adopted from {The Common Gateway Interface}[https://datatracker.ietf.org/doc/html/rfc3875] (CGI), except when they'd be empty, but see below. + +The CGI keys (named without a period) must have +String+ values and are reserved for the Rack specification. If the values for CGI keys contain non-ASCII characters, they should use ASCII-8BIT encoding. + +The server and application can store their own data in the environment, too. The keys must contain at least one dot, and should be prefixed uniquely. The prefix rack. is reserved for use with the Rack specification and the classes that ship with Rack. + +==== REQUEST_METHOD + +The HTTP request method, such as "GET" or "POST". This cannot ever be an empty string, and so is always required. + +==== SCRIPT_NAME + +The initial portion of the request URL's path that corresponds to the application object, so that the application knows its virtual location. This may be an empty string, if the application corresponds to the root of the server. If non-empty, the string must start with /, but should not end with /. + +In addition, SCRIPT_NAME MUST not be /, but instead be empty, and one of SCRIPT_NAME or PATH_INFO must be set, e.g. PATH_INFO can be / if SCRIPT_NAME is empty. + +==== PATH_INFO + +The remainder of the request URL's "path", designating the virtual "location" of the request's target within the application. This may be an empty string, if the request URL targets the application root and does not have a trailing slash. This value may be percent-encoded when originating from a URL. + +The PATH_INFO, if provided, must be a valid request target or an empty string, as defined by {RFC9110}[https://datatracker.ietf.org/doc/html/rfc9110#target.resource]. +* Only OPTIONS requests may have PATH_INFO set to * (asterisk-form). +* Only CONNECT requests may have PATH_INFO set to an authority (authority-form). Note that in HTTP/2+, the authority-form is not a valid request target. +* CONNECT and OPTIONS requests must not have PATH_INFO set to a URI (absolute-form). +* Otherwise, PATH_INFO must start with a / and must not include a fragment part starting with # (origin-form). + +==== QUERY_STRING + +The portion of the request URL that follows the ?, if any. May be empty, but is always required! + +==== SERVER_NAME + +Must be a valid host, as defined by {RFC3986}[https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2]. + +When combined with SCRIPT_NAME, PATH_INFO, and QUERY_STRING, these variables can be used to reconstruct the original the request URL. Note, however, that HTTP_HOST, if present, should be used in preference to SERVER_NAME for reconstructing the request URL. + +==== SERVER_PROTOCOL + +The HTTP version used for the request. It must match the regular expression HTTP\/\d(\.\d)?. + +==== SERVER_PORT + +The port the server is running on, if the server is running on a non-standard port. It must consist of digits only. + +The standard ports are: +* 80 for HTTP +* 443 for HTTPS + +==== CONTENT_TYPE + +The optional MIME type of the request body, if any. + +==== CONTENT_LENGTH + +The length of the request body, if any. It must consist of digits only. + +==== HTTP_HOST + +An optional HTTP authority, as defined by {RFC9110}[https://datatracker.ietf.org/doc/html/rfc9110#name-host-and-authority]. + +==== HTTP_ Headers + +Unless specified above, the environment can contain any number of additional headers, each starting with HTTP_. The presence or absence of these variables should correspond with the presence or absence of the appropriate HTTP header in the request, and those headers have no specific interpretation or validation by the Rack specification. However, there are many standard HTTP headers that have a specific meaning in the context of a request; see {RFC3875 section 4.1.18}[https://tools.ietf.org/html/rfc3875#section-4.1.18] for more details. + +For compatibility with the CGI specifiction, the environment must not contain the keys HTTP_CONTENT_TYPE or HTTP_CONTENT_LENGTH. Instead, the keys CONTENT_TYPE and CONTENT_LENGTH must be used. + +=== Rack-Specific Variables + +In addition to CGI variables, the Rack environment includes Rack-specific variables. These variables are prefixed with rack. and are reserved for use by the Rack specification, or by the classes that ship with Rack. + +==== rack.url_scheme + +The URL scheme, which must be one of http, https, ws or wss. This can never be an empty string, and so is always required. The scheme should be set according to the last hop. For example, if a client makes a request to a reverse proxy over HTTPS, but the connection between the reverse proxy and the server is over plain HTTP, the reverse proxy should set rack.url_scheme to http. + +==== rack.protocol + +An optional +Array+ of +String+ values, containing the protocols advertised by the client in the upgrade header (HTTP/1) or the :protocol pseudo-header (HTTP/2+). + +==== rack.session + +An optional +Hash+-like interface for storing request session data. The store must implement: +* store(key, value) (aliased as []=) to set a value for a key, +* fetch(key, default = nil) (aliased as []) to retrieve a value for a key, +* delete(key) to delete a key, +* clear to clear the session, +* to_hash (optional) to retrieve the session as a Hash. + +==== rack.logger + +An optional +Logger+-like interface for logging messages. The logger must implement: +* info(message, &block), +* debug(message, &block), +* warn(message, &block), +* error(message, &block), +* fatal(message, &block). + +==== rack.multipart.buffer_size + +An optional +Integer+ hint to the multipart parser as to what chunk size to use for reads and writes. + +==== rack.multipart.tempfile_factory + +An optional object for constructing temporary files for multipart form data. The factory must implement: +* call(filename, content_type) to create a temporary file for a multipart form field. +The factory must return an +IO+-like object that responds to << and optionally rewind. + +==== rack.hijack? + +If present and truthy, indicates that the server supports partial hijacking. See the section below on hijacking for more information. + +==== rack.hijack + +If present, an object responding to +call+ that is used to perform a full hijack. See the section below on hijacking for more information. + +==== rack.early_hints + +If present, an object responding to +call+ that is used to send early hints. See the section below on early hints for more information. + +==== rack.input + +If present, the input stream. See the section below on the input stream for more information. + +==== rack.errors + +The error stream. See the section below on the error stream for more information. + +==== rack.response_finished + +If present, an array of callables that will be run by the server after the response has been processed. The callables are called with environment, status, headers, error arguments and should not raise any exceptions. The callables would typically be called after sending the response to the client, but it could also be called if an error occurs while generating the response or sending the response (in that case, the +error+ argument will be a kind of +Exception+). The callables will be called in reverse order. + +=== The Input Stream + +The input stream is an +IO+-like object which contains the raw HTTP request data. When applicable, its external encoding must be ASCII-8BIT and it must be opened in binary mode. The input stream must respond to +gets+, +each+, and +read+: +* +gets+ must be called without arguments and return a +String+, or +nil+ on EOF (end-of-file). +* +read+ behaves like IO#read. Its signature is read([length, [buffer]]). + * If given, +length+ must be a non-negative Integer (>= 0) or +nil+, and +buffer+ must be a +String+ and may not be +nil+. + * If +length+ is given and not +nil+, then this method reads at most +length+ bytes from the input stream. + * If +length+ is not given or +nil+, then this method reads all data until EOF. + * When EOF is reached, this method returns +nil+ if +length+ is given and not +nil+, or +""+ if +length+ is not given or is +nil+. + * If +buffer+ is given, then the read data will be placed into +buffer+ instead of a newly created +String+. +* +each+ must be called without arguments and only yield +String+ values. +* +close+ can be called on the input stream to indicate that any remaining input is not needed. + +=== The Error Stream + +The error stream must respond to +puts+, +write+ and +flush+: +* +puts+ must be called with a single argument that responds to +to_s+. +* +write+ must be called with a single argument that is a +String+. +* +flush+ must be called without arguments and must be called in order to make the error appear for sure. +* +close+ must never be called on the error stream. + +=== Hijacking + +The hijacking interfaces provides a means for an application to take control of the HTTP connection. There are two distinct hijack interfaces: full hijacking where the application takes over the raw connection, and partial hijacking where the application takes over just the response body stream. In both cases, the application is responsible for closing the hijacked stream. + +Full hijacking only works with HTTP/1. Partial hijacking is functionally equivalent to streaming bodies, and is still optionally supported for backwards compatibility with older Rack versions. + +==== Full Hijack + +Full hijack is used to completely take over an HTTP/1 connection. It occurs before any headers are written and causes the server to ignore any response generated by the application. It is intended to be used when applications need access to the raw HTTP/1 connection. + +If rack.hijack is present in +env+, it must respond to +call+ and return an +IO+ object which can be used to read and write to the underlying connection using HTTP/1 semantics and formatting. + +==== Partial Hijack + +Partial hijack is used for bi-directional streaming of the request and response body. It occurs after the status and headers are written by the server and causes the server to ignore the Body of the response. It is intended to be used when applications need bi-directional streaming. + +If rack.hijack? is present in +env+ and truthy, an application may set the special response header rack.hijack to an object that responds to +call+, accepting a +stream+ argument. + +After the response status and headers have been sent, this hijack callback will be called with a +stream+ argument which follows the same interface as outlined in "Streaming Body". Servers must ignore the +body+ part of the response tuple when the rack.hijack response header is present. Using an empty +Array+ is recommended. + +If rack.hijack? is not present and truthy, the special response header rack.hijack must not be present in the response headers. + +=== Early Hints + +The application or any middleware may call the rack.early_hints with an object which would be valid as the headers of a Rack response. + +If rack.early_hints is present, it must respond to +call+. +If rack.early_hints is called, it must be called with valid Rack response headers. + +== The Response + +Outgoing HTTP responses are generated from the response tuple generated by the application. The response tuple is an +Array+ of three elements, which are: the HTTP status, the headers, and the response body. The Rack application is responsible for ensuring that the response tuple is well-formed and should follow the rules set out in this specification. + +=== The Status + +This is an HTTP status. It must be an Integer greater than or equal to 100. + +=== The Headers + +The headers must be an unfrozen +Hash+. The header keys must be +String+ values. Special headers starting rack. are for communicating with the server, and must not be sent back to the client. + +* The headers must not contain a "status" key. +* Header keys must conform to {RFC7230}[https://tools.ietf.org/html/rfc7230] token specification, i.e. cannot contain non-printable ASCII, DQUOTE or (),/:;<=>?@[\]{}. +* Header keys must not contain uppercase ASCII characters (A-Z). +* Header values must be either a +String+, or an +Array+ of +String+ values, such that each +String+ must not contain NUL (\0), CR (\r), or LF (\n). + +==== The content-type Header + +There must not be a content-type header key when the status is 1xx, 204, or 304. + +==== The content-length Header + +There must not be a content-length header key when the status is 1xx, 204, or 304. + +==== The rack.protocol Header + +If the rack.protocol header is present, it must be a +String+, and must be one of the values from the rack.protocol array from the environment. + +Setting this value informs the server that it should perform a connection upgrade. In HTTP/1, this is done using the +upgrade+ header. In HTTP/2+, this is done by accepting the request. + +=== The Body + +The Body is typically an +Array+ of +String+ values, an enumerable that yields +String+ values, a +Proc+, or an +IO+-like object. + +The Body must respond to +each+ or +call+. It may optionally respond to +to_path+ or +to_ary+. A Body that responds to +each+ is considered to be an Enumerable Body. A Body that responds to +call+ is considered to be a Streaming Body. + +A Body that responds to both +each+ and +call+ must be treated as an Enumerable Body, not a Streaming Body. If it responds to +each+, you must call +each+ and not +call+. If the Body doesn't respond to +each+, then you can assume it responds to +call+. + +The Body must either be consumed or returned. The Body is consumed by optionally calling either +each+ or +call+. Then, if the Body responds to +close+, it must be called to release any resources associated with the generation of the body. In other words, +close+ must always be called at least once; typically after the web server has sent the response to the client, but also in cases where the Rack application makes internal/virtual requests and discards the response. + +After calling +close+, the Body is considered closed and should not be consumed again. If the original Body is replaced by a new Body, the new Body must also consume the original Body by calling +close+ if possible. + +If the Body responds to +to_path+, it must return either +nil+ or a +String+. If a +String+ is returned, it must be a path for the local file system whose contents are identical to that produced by calling +each+; this may be used by the server as an alternative, possibly more efficient way to transport the response. The +to_path+ method does not consume the body. + +==== Enumerable Body + +The Enumerable Body must respond to +each+, which must only be called once, must not be called after being closed, and must only yield +String+ values. + +Middleware must not call +each+ directly on the Body. Instead, middleware can return a new Body that calls +each+ on the original Body, yielding at least once per iteration. + +If the Body responds to +to_ary+, it must return an +Array+ whose contents are identical to that produced by calling +each+. Middleware may call +to_ary+ directly on the Body and return a new Body in its place. In other words, middleware can only process the Body directly if it responds to +to_ary+. If the Body responds to both +to_ary+ and +close+, its implementation of +to_ary+ must call +close+. + +==== Streaming Body + +The Streaming Body must respond to +call+, which must only be called once, must not be called after being closed, and accept a +stream+ argument. + +The +stream+ argument must respond to: +read+, +write+, <<, +flush+, +close+, +close_read+, +close_write+, and +closed?+. The semantics of these +IO+ methods must be a best effort match to those of a normal Ruby +IO+ or +Socket+ object, using standard arguments and raising standard exceptions. Servers may simply pass on real +IO+ objects to the Streaming Body. In some cases (e.g. when using transfer-encoding or HTTP/2+), the server may need to provide a wrapper that implements the required methods, in order to provide the correct semantics. + +== Thanks + +We'd like to thank everyone who has contributed to the Rack project over the years. Your work has made this specification possible. That includes everyone who has contributed code, documentation, bug reports, and feedback. We'd also like to thank the authors of the various web servers, frameworks, and libraries that have implemented the Rack specification. Your work has helped to make the web a better place. + +Some parts of this specification are adapted from {PEP 333 – Python Web Server Gateway Interface v1.0}[https://peps.python.org/pep-0333/]. We'd like to thank everyone involved in that effort. diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack.rb new file mode 100644 index 0000000..5cc52ba --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +# Copyright (C) 2007-2019 Leah Neukirchen +# +# Rack is freely distributable under the terms of an MIT-style license. +# See MIT-LICENSE or https://opensource.org/licenses/MIT. + +# The Rack main module, serving as a namespace for all core Rack +# modules and classes. +# +# All modules meant for use in your application are autoloaded here, +# so it should be enough just to require 'rack' in your code. + +require_relative 'rack/version' +require_relative 'rack/constants' + +module Rack + autoload :BadRequest, "rack/bad_request" + autoload :BodyProxy, "rack/body_proxy" + autoload :Builder, "rack/builder" + autoload :Cascade, "rack/cascade" + autoload :CommonLogger, "rack/common_logger" + autoload :ConditionalGet, "rack/conditional_get" + autoload :Config, "rack/config" + autoload :ContentLength, "rack/content_length" + autoload :ContentType, "rack/content_type" + autoload :Deflater, "rack/deflater" + autoload :Directory, "rack/directory" + autoload :ETag, "rack/etag" + autoload :Events, "rack/events" + autoload :Files, "rack/files" + autoload :ForwardRequest, "rack/recursive" + autoload :Head, "rack/head" + autoload :Headers, "rack/headers" + autoload :Lint, "rack/lint" + autoload :Lock, "rack/lock" + autoload :MediaType, "rack/media_type" + autoload :MethodOverride, "rack/method_override" + autoload :Mime, "rack/mime" + autoload :MockRequest, "rack/mock_request" + autoload :MockResponse, "rack/mock_response" + autoload :Multipart, "rack/multipart" + autoload :NullLogger, "rack/null_logger" + autoload :QueryParser, "rack/query_parser" + autoload :Recursive, "rack/recursive" + autoload :Reloader, "rack/reloader" + autoload :Request, "rack/request" + autoload :Response, "rack/response" + autoload :RewindableInput, "rack/rewindable_input" + autoload :Runtime, "rack/runtime" + autoload :Sendfile, "rack/sendfile" + autoload :ShowExceptions, "rack/show_exceptions" + autoload :ShowStatus, "rack/show_status" + autoload :Static, "rack/static" + autoload :TempfileReaper, "rack/tempfile_reaper" + autoload :URLMap, "rack/urlmap" + autoload :Utils, "rack/utils" + + module Auth + autoload :Basic, "rack/auth/basic" + autoload :AbstractHandler, "rack/auth/abstract/handler" + autoload :AbstractRequest, "rack/auth/abstract/request" + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/abstract/handler.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/abstract/handler.rb new file mode 100644 index 0000000..4731ee8 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/abstract/handler.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +require_relative '../../constants' + +module Rack + module Auth + # Rack::Auth::AbstractHandler implements common authentication functionality. + # + # +realm+ should be set for all handlers. + + class AbstractHandler + + attr_accessor :realm + + def initialize(app, realm = nil, &authenticator) + @app, @realm, @authenticator = app, realm, authenticator + end + + + private + + def unauthorized(www_authenticate = challenge) + return [ 401, + { CONTENT_TYPE => 'text/plain', + CONTENT_LENGTH => '0', + 'www-authenticate' => www_authenticate.to_s }, + [] + ] + end + + def bad_request + return [ 400, + { CONTENT_TYPE => 'text/plain', + CONTENT_LENGTH => '0' }, + [] + ] + end + + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/abstract/request.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/abstract/request.rb new file mode 100644 index 0000000..b5c74b1 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/abstract/request.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +# XXX: Remove when removing AbstractRequest#request +require_relative '../../request' + +module Rack + module Auth + class AbstractRequest + + def initialize(env) + @env = env + end + + def request + warn "Rack::Auth::AbstractRequest#request is deprecated and will be removed in a future version of rack.", uplevel: 1 + @request ||= Request.new(@env) + end + + def provided? + !authorization_key.nil? && valid? + end + + def valid? + !@env[authorization_key].nil? + end + + def parts + @parts ||= @env[authorization_key].split(' ', 2) + end + + def scheme + @scheme ||= parts.first&.downcase + end + + def params + @params ||= parts.last + end + + + private + + AUTHORIZATION_KEYS = ['HTTP_AUTHORIZATION', 'X-HTTP_AUTHORIZATION', 'X_HTTP_AUTHORIZATION'] + + def authorization_key + @authorization_key ||= AUTHORIZATION_KEYS.detect { |key| @env.has_key?(key) } + end + + end + + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/basic.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/basic.rb new file mode 100644 index 0000000..67ffc49 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/basic.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +require_relative 'abstract/handler' +require_relative 'abstract/request' + +module Rack + module Auth + # Rack::Auth::Basic implements HTTP Basic Authentication, as per RFC 2617. + # + # Initialize with the Rack application that you want protecting, + # and a block that checks if a username and password pair are valid. + + class Basic < AbstractHandler + + def call(env) + auth = Basic::Request.new(env) + + return unauthorized unless auth.provided? + + return bad_request unless auth.basic? + + if valid?(auth) + env['REMOTE_USER'] = auth.username + + return @app.call(env) + end + + unauthorized + end + + + private + + def challenge + 'Basic realm="%s"' % realm + end + + def valid?(auth) + @authenticator.call(*auth.credentials) + end + + class Request < Auth::AbstractRequest + def basic? + "basic" == scheme && credentials.length == 2 + end + + def credentials + @credentials ||= params.unpack1('m').split(':', 2) + end + + def username + credentials.first + end + end + + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/bad_request.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/bad_request.rb new file mode 100644 index 0000000..8eaa94e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/bad_request.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +module Rack + # Represents a 400 Bad Request error when input data fails to meet the + # requirements. + module BadRequest + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/body_proxy.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/body_proxy.rb new file mode 100644 index 0000000..7291579 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/body_proxy.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +module Rack + # Proxy for response bodies allowing calling a block when + # the response body is closed (after the response has been fully + # sent to the client). + class BodyProxy + # Set the response body to wrap, and the block to call when the + # response has been fully sent. + def initialize(body, &block) + @body = body + @block = block + @closed = false + end + + # Return whether the wrapped body responds to the method. + def respond_to_missing?(method_name, include_all = false) + case method_name + when :to_str + false + else + super or @body.respond_to?(method_name, include_all) + end + end + + # If not already closed, close the wrapped body and + # then call the block the proxy was initialized with. + def close + return if @closed + @closed = true + begin + @body.close if @body.respond_to?(:close) + ensure + @block.call + end + end + + # Whether the proxy is closed. The proxy starts as not closed, + # and becomes closed on the first call to close. + def closed? + @closed + end + + # Delegate missing methods to the wrapped body. + def method_missing(method_name, *args, &block) + case method_name + when :to_str + super + when :to_ary + begin + @body.__send__(method_name, *args, &block) + ensure + close + end + else + @body.__send__(method_name, *args, &block) + end + end + # :nocov: + ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true) + # :nocov: + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/builder.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/builder.rb new file mode 100644 index 0000000..29d1249 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/builder.rb @@ -0,0 +1,296 @@ +# frozen_string_literal: true + +require_relative 'urlmap' + +module Rack; end +Rack::BUILDER_TOPLEVEL_BINDING = ->(builder){builder.instance_eval{binding}} + +module Rack + # Rack::Builder provides a domain-specific language (DSL) to construct Rack + # applications. It is primarily used to parse +config.ru+ files which + # instantiate several middleware and a final application which are hosted + # by a Rack-compatible web server. + # + # Example: + # + # app = Rack::Builder.new do + # use Rack::CommonLogger + # map "/ok" do + # run lambda { |env| [200, {'content-type' => 'text/plain'}, ['OK']] } + # end + # end + # + # run app + # + # Or + # + # app = Rack::Builder.app do + # use Rack::CommonLogger + # run lambda { |env| [200, {'content-type' => 'text/plain'}, ['OK']] } + # end + # + # run app + # + # +use+ adds middleware to the stack, +run+ dispatches to an application. + # You can use +map+ to construct a Rack::URLMap in a convenient way. + class Builder + + # https://stackoverflow.com/questions/2223882/whats-the-difference-between-utf-8-and-utf-8-without-bom + UTF_8_BOM = '\xef\xbb\xbf' + + # Parse the given config file to get a Rack application. + # + # If the config file ends in +.ru+, it is treated as a + # rackup file and the contents will be treated as if + # specified inside a Rack::Builder block. + # + # If the config file does not end in +.ru+, it is + # required and Rack will use the basename of the file + # to guess which constant will be the Rack application to run. + # + # Examples: + # + # Rack::Builder.parse_file('config.ru') + # # Rack application built using Rack::Builder.new + # + # Rack::Builder.parse_file('app.rb') + # # requires app.rb, which can be anywhere in Ruby's + # # load path. After requiring, assumes App constant + # # is a Rack application + # + # Rack::Builder.parse_file('./my_app.rb') + # # requires ./my_app.rb, which should be in the + # # process's current directory. After requiring, + # # assumes MyApp constant is a Rack application + def self.parse_file(path, **options) + if path.end_with?('.ru') + return self.load_file(path, **options) + else + require path + return Object.const_get(::File.basename(path, '.rb').split('_').map(&:capitalize).join('')) + end + end + + # Load the given file as a rackup file, treating the + # contents as if specified inside a Rack::Builder block. + # + # Ignores content in the file after +__END__+, so that + # use of +__END__+ will not result in a syntax error. + # + # Example config.ru file: + # + # $ cat config.ru + # + # use Rack::ContentLength + # require './app.rb' + # run App + def self.load_file(path, **options) + config = ::File.read(path) + config.slice!(/\A#{UTF_8_BOM}/) if config.encoding == Encoding::UTF_8 + + if config[/^#\\(.*)/] + fail "Parsing options from the first comment line is no longer supported: #{path}" + end + + config.sub!(/^__END__\n.*\Z/m, '') + + return new_from_string(config, path, **options) + end + + # Evaluate the given +builder_script+ string in the context of + # a Rack::Builder block, returning a Rack application. + def self.new_from_string(builder_script, path = "(rackup)", **options) + builder = self.new(**options) + + # We want to build a variant of TOPLEVEL_BINDING with self as a Rack::Builder instance. + # We cannot use instance_eval(String) as that would resolve constants differently. + binding = BUILDER_TOPLEVEL_BINDING.call(builder) + eval(builder_script, binding, path) + + return builder.to_app + end + + # Initialize a new Rack::Builder instance. +default_app+ specifies the + # default application if +run+ is not called later. If a block + # is given, it is evaluated in the context of the instance. + def initialize(default_app = nil, **options, &block) + @use = [] + @map = nil + @run = default_app + @warmup = nil + @freeze_app = false + @options = options + + instance_eval(&block) if block_given? + end + + # Any options provided to the Rack::Builder instance at initialization. + # These options can be server-specific. Some general options are: + # + # * +:isolation+: One of +process+, +thread+ or +fiber+. The execution + # isolation model to use. + attr :options + + # Create a new Rack::Builder instance and return the Rack application + # generated from it. + def self.app(default_app = nil, &block) + self.new(default_app, &block).to_app + end + + # Specifies middleware to use in a stack. + # + # class Middleware + # def initialize(app) + # @app = app + # end + # + # def call(env) + # env["rack.some_header"] = "setting an example" + # @app.call(env) + # end + # end + # + # use Middleware + # run lambda { |env| [200, { "content-type" => "text/plain" }, ["OK"]] } + # + # All requests through to this application will first be processed by the middleware class. + # The +call+ method in this example sets an additional environment key which then can be + # referenced in the application if required. + def use(middleware, *args, &block) + if @map + mapping, @map = @map, nil + @use << proc { |app| generate_map(app, mapping) } + end + @use << proc { |app| middleware.new(app, *args, &block) } + + nil + end + # :nocov: + ruby2_keywords(:use) if respond_to?(:ruby2_keywords, true) + # :nocov: + + # Takes a block or argument that is an object that responds to #call and + # returns a Rack response. + # + # You can use a block: + # + # run do |env| + # [200, { "content-type" => "text/plain" }, ["Hello World!"]] + # end + # + # You can also provide a lambda: + # + # run lambda { |env| [200, { "content-type" => "text/plain" }, ["OK"]] } + # + # You can also provide a class instance: + # + # class Heartbeat + # def call(env) + # [200, { "content-type" => "text/plain" }, ["OK"]] + # end + # end + # + # run Heartbeat.new + # + def run(app = nil, &block) + raise ArgumentError, "Both app and block given!" if app && block_given? + + @run = app || block + + nil + end + + # Takes a lambda or block that is used to warm-up the application. This block is called + # before the Rack application is returned by to_app. + # + # warmup do |app| + # client = Rack::MockRequest.new(app) + # client.get('/') + # end + # + # use SomeMiddleware + # run MyApp + def warmup(prc = nil, &block) + @warmup = prc || block + end + + # Creates a route within the application. Routes under the mapped path will be sent to + # the Rack application specified by run inside the block. Other requests will be sent to the + # default application specified by run outside the block. + # + # class App + # def call(env) + # [200, {'content-type' => 'text/plain'}, ["Hello World"]] + # end + # end + # + # class Heartbeat + # def call(env) + # [200, { "content-type" => "text/plain" }, ["OK"]] + # end + # end + # + # app = Rack::Builder.app do + # map '/heartbeat' do + # run Heartbeat.new + # end + # run App.new + # end + # + # run app + # + # The +use+ method can also be used inside the block to specify middleware to run under a specific path: + # + # app = Rack::Builder.app do + # map '/heartbeat' do + # use Middleware + # run Heartbeat.new + # end + # run App.new + # end + # + # This example includes a piece of middleware which will run before +/heartbeat+ requests hit +Heartbeat+. + # + # Note that providing a +path+ of +/+ will ignore any default application given in a +run+ statement + # outside the block. + def map(path, &block) + @map ||= {} + @map[path] = block + + nil + end + + # Freeze the app (set using run) and all middleware instances when building the application + # in to_app. + def freeze_app + @freeze_app = true + end + + # Return the Rack application generated by this instance. + def to_app + app = @map ? generate_map(@run, @map) : @run + fail "missing run or map statement" unless app + app.freeze if @freeze_app + app = @use.reverse.inject(app) { |a, e| e[a].tap { |x| x.freeze if @freeze_app } } + @warmup.call(app) if @warmup + app + end + + # Call the Rack application generated by this builder instance. Note that + # this rebuilds the Rack application and runs the warmup code (if any) + # every time it is called, so it should not be used if performance is important. + def call(env) + to_app.call(env) + end + + private + + # Generate a URLMap instance by generating new Rack applications for each + # map block in this instance. + def generate_map(default_app, mapping) + mapped = default_app ? { '/' => default_app } : {} + mapping.each { |r, b| mapped[r] = self.class.new(default_app, &b).to_app } + URLMap.new(mapped) + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/cascade.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/cascade.rb new file mode 100644 index 0000000..9c952fd --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/cascade.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true + +require_relative 'constants' + +module Rack + # Rack::Cascade tries a request on several apps, and returns the + # first response that is not 404 or 405 (or in a list of configured + # status codes). If all applications tried return one of the configured + # status codes, return the last response. + + class Cascade + # An array of applications to try in order. + attr_reader :apps + + # Set the apps to send requests to, and what statuses result in + # cascading. Arguments: + # + # apps: An enumerable of rack applications. + # cascade_for: The statuses to use cascading for. If a response is received + # from an app, the next app is tried. + def initialize(apps, cascade_for = [404, 405]) + @apps = [] + apps.each { |app| add app } + + @cascade_for = {} + [*cascade_for].each { |status| @cascade_for[status] = true } + end + + # Call each app in order. If the responses uses a status that requires + # cascading, try the next app. If all responses require cascading, + # return the response from the last app. + def call(env) + return [404, { CONTENT_TYPE => "text/plain" }, []] if @apps.empty? + result = nil + last_body = nil + + @apps.each do |app| + # The SPEC says that the body must be closed after it has been iterated + # by the server, or if it is replaced by a middleware action. Cascade + # replaces the body each time a cascade happens. It is assumed that nil + # does not respond to close, otherwise the previous application body + # will be closed. The final application body will not be closed, as it + # will be passed to the server as a result. + last_body.close if last_body.respond_to? :close + + result = app.call(env) + return result unless @cascade_for.include?(result[0].to_i) + last_body = result[2] + end + + result + end + + # Append an app to the list of apps to cascade. This app will + # be tried last. + def add(app) + @apps << app + end + + # Whether the given app is one of the apps to cascade to. + def include?(app) + @apps.include?(app) + end + + alias_method :<<, :add + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/common_logger.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/common_logger.rb new file mode 100644 index 0000000..940b8be --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/common_logger.rb @@ -0,0 +1,89 @@ +# frozen_string_literal: true + +require_relative 'constants' +require_relative 'utils' +require_relative 'body_proxy' +require_relative 'request' + +module Rack + # Rack::CommonLogger forwards every request to the given +app+, and + # logs a line in the + # {Apache common log format}[http://httpd.apache.org/docs/1.3/logs.html#common] + # to the configured logger. + class CommonLogger + # Common Log Format: http://httpd.apache.org/docs/1.3/logs.html#common + # + # lilith.local - - [07/Aug/2006 23:58:02 -0400] "GET / HTTP/1.1" 500 - + # + # %{%s - %s [%s] "%s %s%s %s" %d %s\n} % + # + # The actual format is slightly different than the above due to the + # separation of SCRIPT_NAME and PATH_INFO, and because the elapsed + # time in seconds is included at the end. + FORMAT = %{%s - %s [%s] "%s %s%s%s %s" %d %s %0.4f } + + # +logger+ can be any object that supports the +write+ or +<<+ methods, + # which includes the standard library Logger. These methods are called + # with a single string argument, the log message. + # If +logger+ is nil, CommonLogger will fall back env['rack.errors']. + def initialize(app, logger = nil) + @app = app + @logger = logger + end + + # Log all requests in common_log format after a response has been + # returned. Note that if the app raises an exception, the request + # will not be logged, so if exception handling middleware are used, + # they should be loaded after this middleware. Additionally, because + # the logging happens after the request body has been fully sent, any + # exceptions raised during the sending of the response body will + # cause the request not to be logged. + def call(env) + began_at = Utils.clock_time + status, headers, body = response = @app.call(env) + + response[2] = BodyProxy.new(body) { log(env, status, headers, began_at) } + response + end + + private + + # Log the request to the configured logger. + def log(env, status, response_headers, began_at) + request = Rack::Request.new(env) + length = extract_content_length(response_headers) + + msg = sprintf(FORMAT, + request.ip || "-", + request.get_header("REMOTE_USER") || "-", + Time.now.strftime("%d/%b/%Y:%H:%M:%S %z"), + request.request_method, + request.script_name, + request.path_info, + request.query_string.empty? ? "" : "?#{request.query_string}", + request.get_header(SERVER_PROTOCOL), + status.to_s[0..3], + length, + Utils.clock_time - began_at) + + msg.gsub!(/[^[:print:]]/) { |c| sprintf("\\x%x", c.ord) } + msg[-1] = "\n" + + logger = @logger || request.get_header(RACK_ERRORS) + # Standard library logger doesn't support write but it supports << which actually + # calls to write on the log device without formatting + if logger.respond_to?(:write) + logger.write(msg) + else + logger << msg + end + end + + # Attempt to determine the content length for the response to + # include it in the logged data. + def extract_content_length(headers) + value = headers[CONTENT_LENGTH] + !value || value.to_s == '0' ? '-' : value + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/conditional_get.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/conditional_get.rb new file mode 100644 index 0000000..091a2de --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/conditional_get.rb @@ -0,0 +1,87 @@ +# frozen_string_literal: true + +require_relative 'constants' +require_relative 'utils' +require_relative 'body_proxy' + +module Rack + + # Middleware that enables conditional GET using if-none-match and + # if-modified-since. The application should set either or both of the + # last-modified or etag response headers according to RFC 2616. When + # either of the conditions is met, the response body is set to be zero + # length and the response status is set to 304 Not Modified. + # + # Applications that defer response body generation until the body's each + # message is received will avoid response body generation completely when + # a conditional GET matches. + # + # Adapted from Michael Klishin's Merb implementation: + # https://github.com/wycats/merb/blob/master/merb-core/lib/merb-core/rack/middleware/conditional_get.rb + class ConditionalGet + def initialize(app) + @app = app + end + + # Return empty 304 response if the response has not been + # modified since the last request. + def call(env) + case env[REQUEST_METHOD] + when "GET", "HEAD" + status, headers, body = response = @app.call(env) + + if status == 200 && fresh?(env, headers) + response[0] = 304 + headers.delete(CONTENT_TYPE) + headers.delete(CONTENT_LENGTH) + + # We are done with the body: + body.close if body.respond_to?(:close) + response[2] = [] + end + response + else + @app.call(env) + end + end + + private + + # Return whether the response has not been modified since the + # last request. + def fresh?(env, headers) + # if-none-match has priority over if-modified-since per RFC 7232 + if none_match = env['HTTP_IF_NONE_MATCH'] + etag_matches?(none_match, headers) + elsif (modified_since = env['HTTP_IF_MODIFIED_SINCE']) && (modified_since = to_rfc2822(modified_since)) + modified_since?(modified_since, headers) + end + end + + # Whether the etag response header matches the if-none-match request header. + # If so, the request has not been modified. + def etag_matches?(none_match, headers) + headers[ETAG] == none_match + end + + # Whether the last-modified response header matches the if-modified-since + # request header. If so, the request has not been modified. + def modified_since?(modified_since, headers) + last_modified = to_rfc2822(headers['last-modified']) and + modified_since >= last_modified + end + + # Return a Time object for the given string (which should be in RFC2822 + # format), or nil if the string cannot be parsed. + def to_rfc2822(since) + # shortest possible valid date is the obsolete: 1 Nov 97 09:55 A + # anything shorter is invalid, this avoids exceptions for common cases + # most common being the empty string + if since && since.length >= 16 + # NOTE: there is no trivial way to write this in a non exception way + # _rfc2822 returns a hash but is not that usable + Time.rfc2822(since) rescue nil + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/config.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/config.rb new file mode 100644 index 0000000..41f6f7d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/config.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Rack + # Rack::Config modifies the environment using the block given during + # initialization. + # + # Example: + # use Rack::Config do |env| + # env['my-key'] = 'some-value' + # end + class Config + def initialize(app, &block) + @app = app + @block = block + end + + def call(env) + @block.call(env) + @app.call(env) + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/constants.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/constants.rb new file mode 100644 index 0000000..7a349b9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/constants.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +module Rack + # Request env keys + HTTP_HOST = 'HTTP_HOST' + HTTP_PORT = 'HTTP_PORT' + HTTPS = 'HTTPS' + PATH_INFO = 'PATH_INFO' + REQUEST_METHOD = 'REQUEST_METHOD' + REQUEST_PATH = 'REQUEST_PATH' + SCRIPT_NAME = 'SCRIPT_NAME' + QUERY_STRING = 'QUERY_STRING' + SERVER_PROTOCOL = 'SERVER_PROTOCOL' + SERVER_NAME = 'SERVER_NAME' + SERVER_PORT = 'SERVER_PORT' + HTTP_COOKIE = 'HTTP_COOKIE' + + # Response Header Keys + CACHE_CONTROL = 'cache-control' + CONTENT_LENGTH = 'content-length' + CONTENT_TYPE = 'content-type' + ETAG = 'etag' + EXPIRES = 'expires' + SET_COOKIE = 'set-cookie' + TRANSFER_ENCODING = 'transfer-encoding' + + # HTTP method verbs + GET = 'GET' + POST = 'POST' + PUT = 'PUT' + PATCH = 'PATCH' + DELETE = 'DELETE' + HEAD = 'HEAD' + OPTIONS = 'OPTIONS' + CONNECT = 'CONNECT' + LINK = 'LINK' + UNLINK = 'UNLINK' + TRACE = 'TRACE' + + # Rack environment variables + RACK_VERSION = 'rack.version' + RACK_TEMPFILES = 'rack.tempfiles' + RACK_EARLY_HINTS = 'rack.early_hints' + RACK_ERRORS = 'rack.errors' + RACK_LOGGER = 'rack.logger' + RACK_INPUT = 'rack.input' + RACK_SESSION = 'rack.session' + RACK_SESSION_OPTIONS = 'rack.session.options' + RACK_SHOWSTATUS_DETAIL = 'rack.showstatus.detail' + RACK_URL_SCHEME = 'rack.url_scheme' + RACK_HIJACK = 'rack.hijack' + RACK_IS_HIJACK = 'rack.hijack?' + RACK_RECURSIVE_INCLUDE = 'rack.recursive.include' + RACK_MULTIPART_BUFFER_SIZE = 'rack.multipart.buffer_size' + RACK_MULTIPART_TEMPFILE_FACTORY = 'rack.multipart.tempfile_factory' + RACK_RESPONSE_FINISHED = 'rack.response_finished' + RACK_PROTOCOL = 'rack.protocol' + RACK_REQUEST_FORM_INPUT = 'rack.request.form_input' + RACK_REQUEST_FORM_HASH = 'rack.request.form_hash' + RACK_REQUEST_FORM_PAIRS = 'rack.request.form_pairs' + RACK_REQUEST_FORM_VARS = 'rack.request.form_vars' + RACK_REQUEST_FORM_ERROR = 'rack.request.form_error' + RACK_REQUEST_COOKIE_HASH = 'rack.request.cookie_hash' + RACK_REQUEST_COOKIE_STRING = 'rack.request.cookie_string' + RACK_REQUEST_QUERY_HASH = 'rack.request.query_hash' + RACK_REQUEST_QUERY_STRING = 'rack.request.query_string' + RACK_METHODOVERRIDE_ORIGINAL_METHOD = 'rack.methodoverride.original_method' +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/content_length.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/content_length.rb new file mode 100644 index 0000000..cbac93a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/content_length.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require_relative 'constants' +require_relative 'utils' + +module Rack + + # Sets the content-length header on responses that do not specify + # a content-length or transfer-encoding header. Note that this + # does not fix responses that have an invalid content-length + # header specified. + class ContentLength + include Rack::Utils + + def initialize(app) + @app = app + end + + def call(env) + status, headers, body = response = @app.call(env) + + if !STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i) && + !headers[CONTENT_LENGTH] && + !headers[TRANSFER_ENCODING] && + body.respond_to?(:to_ary) + + response[2] = body = body.to_ary + headers[CONTENT_LENGTH] = body.sum(&:bytesize).to_s + end + + response + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/content_type.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/content_type.rb new file mode 100644 index 0000000..19f0782 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/content_type.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require_relative 'constants' +require_relative 'utils' + +module Rack + + # Sets the content-type header on responses which don't have one. + # + # Builder Usage: + # use Rack::ContentType, "text/plain" + # + # When no content type argument is provided, "text/html" is the + # default. + class ContentType + include Rack::Utils + + def initialize(app, content_type = "text/html") + @app = app + @content_type = content_type + end + + def call(env) + status, headers, _ = response = @app.call(env) + + unless STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i) + headers[CONTENT_TYPE] ||= @content_type + end + + response + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/deflater.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/deflater.rb new file mode 100644 index 0000000..cc01c32 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/deflater.rb @@ -0,0 +1,158 @@ +# frozen_string_literal: true + +require "zlib" +require "time" # for Time.httpdate + +require_relative 'constants' +require_relative 'utils' +require_relative 'request' +require_relative 'body_proxy' + +module Rack + # This middleware enables content encoding of http responses, + # usually for purposes of compression. + # + # Currently supported encodings: + # + # * gzip + # * identity (no transformation) + # + # This middleware automatically detects when encoding is supported + # and allowed. For example no encoding is made when a cache + # directive of 'no-transform' is present, when the response status + # code is one that doesn't allow an entity body, or when the body + # is empty. + # + # Note that despite the name, Deflater does not support the +deflate+ + # encoding. + class Deflater + # Creates Rack::Deflater middleware. Options: + # + # :if :: a lambda enabling / disabling deflation based on returned boolean value + # (e.g use Rack::Deflater, :if => lambda { |*, body| sum=0; body.each { |i| sum += i.length }; sum > 512 }). + # However, be aware that calling `body.each` inside the block will break cases where `body.each` is not idempotent, + # such as when it is an +IO+ instance. + # :include :: a list of content types that should be compressed. By default, all content types are compressed. + # :sync :: determines if the stream is going to be flushed after every chunk. Flushing after every chunk reduces + # latency for time-sensitive streaming applications, but hurts compression and throughput. + # Defaults to +true+. + def initialize(app, options = {}) + @app = app + @condition = options[:if] + @compressible_types = options[:include] + @sync = options.fetch(:sync, true) + end + + def call(env) + status, headers, body = response = @app.call(env) + + unless should_deflate?(env, status, headers, body) + return response + end + + request = Request.new(env) + + encoding = Utils.select_best_encoding(%w(gzip identity), + request.accept_encoding) + + # Set the Vary HTTP header. + vary = headers["vary"].to_s.split(",").map(&:strip) + unless vary.include?("*") || vary.any?{|v| v.downcase == 'accept-encoding'} + headers["vary"] = vary.push("Accept-Encoding").join(",") + end + + case encoding + when "gzip" + headers['content-encoding'] = "gzip" + headers.delete(CONTENT_LENGTH) + mtime = headers["last-modified"] + mtime = Time.httpdate(mtime).to_i if mtime + response[2] = GzipStream.new(body, mtime, @sync) + response + when "identity" + response + else # when nil + # Only possible encoding values here are 'gzip', 'identity', and nil + message = "An acceptable encoding for the requested resource #{request.fullpath} could not be found." + bp = Rack::BodyProxy.new([message]) { body.close if body.respond_to?(:close) } + [406, { CONTENT_TYPE => "text/plain", CONTENT_LENGTH => message.length.to_s }, bp] + end + end + + # Body class used for gzip encoded responses. + class GzipStream + + BUFFER_LENGTH = 128 * 1_024 + + # Initialize the gzip stream. Arguments: + # body :: Response body to compress with gzip + # mtime :: The modification time of the body, used to set the + # modification time in the gzip header. + # sync :: Whether to flush each gzip chunk as soon as it is ready. + def initialize(body, mtime, sync) + @body = body + @mtime = mtime + @sync = sync + end + + # Yield gzip compressed strings to the given block. + def each(&block) + @writer = block + gzip = ::Zlib::GzipWriter.new(self) + gzip.mtime = @mtime if @mtime + # @body.each is equivalent to @body.gets (slow) + if @body.is_a? ::File # XXX: Should probably be ::IO + while part = @body.read(BUFFER_LENGTH) + gzip.write(part) + gzip.flush if @sync + end + else + @body.each { |part| + # Skip empty strings, as they would result in no output, + # and flushing empty parts would raise Zlib::BufError. + next if part.empty? + gzip.write(part) + gzip.flush if @sync + } + end + ensure + gzip.finish + end + + # Call the block passed to #each with the gzipped data. + def write(data) + @writer.call(data) + end + + # Close the original body if possible. + def close + @body.close if @body.respond_to?(:close) + end + end + + private + + # Whether the body should be compressed. + def should_deflate?(env, status, headers, body) + # Skip compressing empty entity body responses and responses with + # no-transform set. + if Utils::STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i) || + /\bno-transform\b/.match?(headers[CACHE_CONTROL].to_s) || + headers['content-encoding']&.!~(/\bidentity\b/) + return false + end + + # Skip if @compressible_types are given and does not include request's content type + return false if @compressible_types && !(headers.has_key?(CONTENT_TYPE) && @compressible_types.include?(headers[CONTENT_TYPE][/[^;]*/])) + + # Skip if @condition lambda is given and evaluates to false + return false if @condition && !@condition.call(env, status, headers, body) + + # No point in compressing empty body, also handles usage with + # Rack::Sendfile. + return false if headers[CONTENT_LENGTH] == '0' + + true + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/directory.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/directory.rb new file mode 100644 index 0000000..089623f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/directory.rb @@ -0,0 +1,205 @@ +# frozen_string_literal: true + +require 'time' + +require_relative 'constants' +require_relative 'utils' +require_relative 'head' +require_relative 'mime' +require_relative 'files' + +module Rack + # Rack::Directory serves entries below the +root+ given, according to the + # path info of the Rack request. If a directory is found, the file's contents + # will be presented in an html based index. If a file is found, the env will + # be passed to the specified +app+. + # + # If +app+ is not specified, a Rack::Files of the same +root+ will be used. + + class Directory + DIR_FILE = "%s%s%s%s\n" + DIR_PAGE_HEADER = <<-PAGE + + %s + + + +

%s

+
+ + + + + + + + PAGE + DIR_PAGE_FOOTER = <<-PAGE +
NameSizeTypeLast Modified
+
+ + PAGE + + # Body class for directory entries, showing an index page with links + # to each file. + class DirectoryBody < Struct.new(:root, :path, :files) + # Yield strings for each part of the directory entry + def each + show_path = Utils.escape_html(path.sub(/^#{root}/, '')) + yield(DIR_PAGE_HEADER % [ show_path, show_path ]) + + unless path.chomp('/') == root + yield(DIR_FILE % DIR_FILE_escape(files.call('..'))) + end + + Dir.foreach(path) do |basename| + next if basename.start_with?('.') + next unless f = files.call(basename) + yield(DIR_FILE % DIR_FILE_escape(f)) + end + + yield(DIR_PAGE_FOOTER) + end + + private + + # Escape each element in the array of html strings. + def DIR_FILE_escape(htmls) + htmls.map { |e| Utils.escape_html(e) } + end + end + + # The root of the directory hierarchy. Only requests for files and + # directories inside of the root directory are supported. + attr_reader :root + + # Set the root directory and application for serving files. + def initialize(root, app = nil) + @root = ::File.expand_path(root) + @app = app || Files.new(@root) + @head = Head.new(method(:get)) + end + + def call(env) + # strip body if this is a HEAD call + @head.call env + end + + # Internals of request handling. Similar to call but does + # not remove body for HEAD requests. + def get(env) + script_name = env[SCRIPT_NAME] + path_info = Utils.unescape_path(env[PATH_INFO]) + + if client_error_response = check_bad_request(path_info) || check_forbidden(path_info) + client_error_response + else + path = ::File.join(@root, path_info) + list_path(env, path, path_info, script_name) + end + end + + # Rack response to use for requests with invalid paths, or nil if path is valid. + def check_bad_request(path_info) + return if Utils.valid_path?(path_info) + + body = "Bad Request\n" + [400, { CONTENT_TYPE => "text/plain", + CONTENT_LENGTH => body.bytesize.to_s, + "x-cascade" => "pass" }, [body]] + end + + # Rack response to use for requests with paths outside the root, or nil if path is inside the root. + def check_forbidden(path_info) + return unless path_info.include? ".." + return if ::File.expand_path(::File.join(@root, path_info)).start_with?(@root) + + body = "Forbidden\n" + [403, { CONTENT_TYPE => "text/plain", + CONTENT_LENGTH => body.bytesize.to_s, + "x-cascade" => "pass" }, [body]] + end + + # Rack response to use for directories under the root. + def list_directory(path_info, path, script_name) + url_head = (script_name.split('/') + path_info.split('/')).map do |part| + Utils.escape_path part + end + + # Globbing not safe as path could contain glob metacharacters + body = DirectoryBody.new(@root, path, ->(basename) do + stat = stat(::File.join(path, basename)) + next unless stat + + url = ::File.join(*url_head + [Utils.escape_path(basename)]) + mtime = stat.mtime.httpdate + if stat.directory? + type = 'directory' + size = '-' + url << '/' + if basename == '..' + basename = 'Parent Directory' + else + basename << '/' + end + else + type = Mime.mime_type(::File.extname(basename)) + size = filesize_format(stat.size) + end + + [ url, basename, size, type, mtime ] + end) + + [ 200, { CONTENT_TYPE => 'text/html; charset=utf-8' }, body ] + end + + # File::Stat for the given path, but return nil for missing/bad entries. + def stat(path) + ::File.stat(path) + rescue Errno::ENOENT, Errno::ELOOP + return nil + end + + # Rack response to use for files and directories under the root. + # Unreadable and non-file, non-directory entries will get a 404 response. + def list_path(env, path, path_info, script_name) + if (stat = stat(path)) && stat.readable? + return @app.call(env) if stat.file? + return list_directory(path_info, path, script_name) if stat.directory? + end + + entity_not_found(path_info) + end + + # Rack response to use for unreadable and non-file, non-directory entries. + def entity_not_found(path_info) + body = "Entity not found: #{path_info}\n" + [404, { CONTENT_TYPE => "text/plain", + CONTENT_LENGTH => body.bytesize.to_s, + "x-cascade" => "pass" }, [body]] + end + + # Stolen from Ramaze + FILESIZE_FORMAT = [ + ['%.1fT', 1 << 40], + ['%.1fG', 1 << 30], + ['%.1fM', 1 << 20], + ['%.1fK', 1 << 10], + ] + + # Provide human readable file sizes + def filesize_format(int) + FILESIZE_FORMAT.each do |format, size| + return format % (int.to_f / size) if int >= size + end + + "#{int}B" + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/etag.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/etag.rb new file mode 100644 index 0000000..1841beb --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/etag.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true + +require 'digest/sha2' + +require_relative 'constants' +require_relative 'utils' + +module Rack + # Automatically sets the etag header on all String bodies. + # + # The etag header is skipped if etag or last-modified headers are sent or if + # a sendfile body (body.responds_to :to_path) is given (since such cases + # should be handled by apache/nginx). + # + # On initialization, you can pass two parameters: a cache-control directive + # used when etag is absent and a directive when it is present. The first + # defaults to nil, while the second defaults to "max-age=0, private, must-revalidate" + class ETag + ETAG_STRING = Rack::ETAG + DEFAULT_CACHE_CONTROL = "max-age=0, private, must-revalidate" + + def initialize(app, no_cache_control = nil, cache_control = DEFAULT_CACHE_CONTROL) + @app = app + @cache_control = cache_control + @no_cache_control = no_cache_control + end + + def call(env) + status, headers, body = response = @app.call(env) + + if etag_status?(status) && body.respond_to?(:to_ary) && !skip_caching?(headers) + body = body.to_ary + digest = digest_body(body) + headers[ETAG_STRING] = %(W/"#{digest}") if digest + + # Body was modified, so we need to re-assign it: + response[2] = body + end + + unless headers[CACHE_CONTROL] + if digest + headers[CACHE_CONTROL] = @cache_control if @cache_control + else + headers[CACHE_CONTROL] = @no_cache_control if @no_cache_control + end + end + + response + end + + private + + def etag_status?(status) + status == 200 || status == 201 + end + + def skip_caching?(headers) + headers.key?(ETAG_STRING) || headers.key?('last-modified') + end + + def digest_body(body) + digest = nil + + body.each do |part| + (digest ||= Digest::SHA256.new) << part unless part.empty? + end + + digest && digest.hexdigest.byteslice(0,32) + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/events.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/events.rb new file mode 100644 index 0000000..c7bb201 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/events.rb @@ -0,0 +1,157 @@ +# frozen_string_literal: true + +require_relative 'body_proxy' +require_relative 'request' +require_relative 'response' + +module Rack + ### This middleware provides hooks to certain places in the request / + # response lifecycle. This is so that middleware that don't need to filter + # the response data can safely leave it alone and not have to send messages + # down the traditional "rack stack". + # + # The events are: + # + # * on_start(request, response) + # + # This event is sent at the start of the request, before the next + # middleware in the chain is called. This method is called with a request + # object, and a response object. Right now, the response object is always + # nil, but in the future it may actually be a real response object. + # + # * on_commit(request, response) + # + # The response has been committed. The application has returned, but the + # response has not been sent to the webserver yet. This method is always + # called with a request object and the response object. The response + # object is constructed from the rack triple that the application returned. + # Changes may still be made to the response object at this point. + # + # * on_send(request, response) + # + # The webserver has started iterating over the response body and presumably + # has started sending data over the wire. This method is always called with + # a request object and the response object. The response object is + # constructed from the rack triple that the application returned. Changes + # SHOULD NOT be made to the response object as the webserver has already + # started sending data. Any mutations will likely result in an exception. + # + # * on_finish(request, response) + # + # The webserver has closed the response, and all data has been written to + # the response socket. The request and response object should both be + # read-only at this point. The body MAY NOT be available on the response + # object as it may have been flushed to the socket. + # + # * on_error(request, response, error) + # + # An exception has occurred in the application or an `on_commit` event. + # This method will get the request, the response (if available) and the + # exception that was raised. + # + # ## Order + # + # `on_start` is called on the handlers in the order that they were passed to + # the constructor. `on_commit`, on_send`, `on_finish`, and `on_error` are + # called in the reverse order. `on_finish` handlers are called inside an + # `ensure` block, so they are guaranteed to be called even if something + # raises an exception. If something raises an exception in a `on_finish` + # method, then nothing is guaranteed. + + class Events + module Abstract + def on_start(req, res) + end + + def on_commit(req, res) + end + + def on_send(req, res) + end + + def on_finish(req, res) + end + + def on_error(req, res, e) + end + end + + class EventedBodyProxy < Rack::BodyProxy # :nodoc: + attr_reader :request, :response + + def initialize(body, request, response, handlers, &block) + super(body, &block) + @request = request + @response = response + @handlers = handlers + end + + def each + @handlers.reverse_each { |handler| handler.on_send request, response } + super + end + end + + class BufferedResponse < Rack::Response::Raw # :nodoc: + attr_reader :body + + def initialize(status, headers, body) + super(status, headers) + @body = body + end + + def to_a; [status, headers, body]; end + end + + def initialize(app, handlers) + @app = app + @handlers = handlers + end + + def call(env) + request = make_request env + on_start request, nil + + begin + status, headers, body = @app.call request.env + response = make_response status, headers, body + on_commit request, response + rescue StandardError => e + on_error request, response, e + on_finish request, response + raise + end + + body = EventedBodyProxy.new(body, request, response, @handlers) do + on_finish request, response + end + [response.status, response.headers, body] + end + + private + + def on_error(request, response, e) + @handlers.reverse_each { |handler| handler.on_error request, response, e } + end + + def on_commit(request, response) + @handlers.reverse_each { |handler| handler.on_commit request, response } + end + + def on_start(request, response) + @handlers.each { |handler| handler.on_start request, nil } + end + + def on_finish(request, response) + @handlers.reverse_each { |handler| handler.on_finish request, response } + end + + def make_request(env) + Rack::Request.new env + end + + def make_response(status, headers, body) + BufferedResponse.new status, headers, body + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/files.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/files.rb new file mode 100644 index 0000000..5b8353f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/files.rb @@ -0,0 +1,216 @@ +# frozen_string_literal: true + +require 'time' + +require_relative 'constants' +require_relative 'head' +require_relative 'utils' +require_relative 'request' +require_relative 'mime' + +module Rack + # Rack::Files serves files below the +root+ directory given, according to the + # path info of the Rack request. + # e.g. when Rack::Files.new("/etc") is used, you can access 'passwd' file + # as http://localhost:9292/passwd + # + # Handlers can detect if bodies are a Rack::Files, and use mechanisms + # like sendfile on the +path+. + + class Files + ALLOWED_VERBS = %w[GET HEAD OPTIONS] + ALLOW_HEADER = ALLOWED_VERBS.join(', ') + MULTIPART_BOUNDARY = 'AaB03x' + + attr_reader :root + + def initialize(root, headers = {}, default_mime = 'text/plain') + @root = (::File.expand_path(root) if root) + @headers = headers + @default_mime = default_mime + @head = Rack::Head.new(lambda { |env| get env }) + end + + def call(env) + # HEAD requests drop the response body, including 4xx error messages. + @head.call env + end + + def get(env) + request = Rack::Request.new env + unless ALLOWED_VERBS.include? request.request_method + return fail(405, "Method Not Allowed", { 'allow' => ALLOW_HEADER }) + end + + path_info = Utils.unescape_path request.path_info + return fail(400, "Bad Request") unless Utils.valid_path?(path_info) + + clean_path_info = Utils.clean_path_info(path_info) + path = ::File.join(@root, clean_path_info) + + available = begin + ::File.file?(path) && ::File.readable?(path) + rescue SystemCallError + # Not sure in what conditions this exception can occur, but this + # is a safe way to handle such an error. + # :nocov: + false + # :nocov: + end + + if available + serving(request, path) + else + fail(404, "File not found: #{path_info}") + end + end + + def serving(request, path) + if request.options? + return [200, { 'allow' => ALLOW_HEADER, CONTENT_LENGTH => '0' }, []] + end + last_modified = ::File.mtime(path).httpdate + return [304, {}, []] if request.get_header('HTTP_IF_MODIFIED_SINCE') == last_modified + + headers = { "last-modified" => last_modified } + mime_type = mime_type path, @default_mime + headers[CONTENT_TYPE] = mime_type if mime_type + + # Set custom headers + headers.merge!(@headers) if @headers + + status = 200 + size = filesize path + + ranges = Rack::Utils.get_byte_ranges(request.get_header('HTTP_RANGE'), size) + if ranges.nil? + # No ranges: + ranges = [0..size - 1] + elsif ranges.empty? + # Unsatisfiable. Return error, and file size: + response = fail(416, "Byte range unsatisfiable") + response[1]["content-range"] = "bytes */#{size}" + return response + else + # Partial content + partial_content = true + + if ranges.size == 1 + range = ranges[0] + headers["content-range"] = "bytes #{range.begin}-#{range.end}/#{size}" + else + headers[CONTENT_TYPE] = "multipart/byteranges; boundary=#{MULTIPART_BOUNDARY}" + end + + status = 206 + body = BaseIterator.new(path, ranges, mime_type: mime_type, size: size) + size = body.bytesize + end + + headers[CONTENT_LENGTH] = size.to_s + + if request.head? + body = [] + elsif !partial_content + body = Iterator.new(path, ranges, mime_type: mime_type, size: size) + end + + [status, headers, body] + end + + class BaseIterator + attr_reader :path, :ranges, :options + + def initialize(path, ranges, options) + @path = path + @ranges = ranges + @options = options + end + + def each + ::File.open(path, "rb") do |file| + ranges.each do |range| + yield multipart_heading(range) if multipart? + + each_range_part(file, range) do |part| + yield part + end + end + + yield "\r\n--#{MULTIPART_BOUNDARY}--\r\n" if multipart? + end + end + + def bytesize + size = ranges.inject(0) do |sum, range| + sum += multipart_heading(range).bytesize if multipart? + sum += range.size + end + size += "\r\n--#{MULTIPART_BOUNDARY}--\r\n".bytesize if multipart? + size + end + + def close; end + + private + + def multipart? + ranges.size > 1 + end + + def multipart_heading(range) +<<-EOF +\r +--#{MULTIPART_BOUNDARY}\r +content-type: #{options[:mime_type]}\r +content-range: bytes #{range.begin}-#{range.end}/#{options[:size]}\r +\r +EOF + end + + def each_range_part(file, range) + file.seek(range.begin) + remaining_len = range.end - range.begin + 1 + while remaining_len > 0 + part = file.read([8192, remaining_len].min) + break unless part + remaining_len -= part.length + + yield part + end + end + end + + class Iterator < BaseIterator + alias :to_path :path + end + + private + + def fail(status, body, headers = {}) + body += "\n" + + [ + status, + { + CONTENT_TYPE => "text/plain", + CONTENT_LENGTH => body.size.to_s, + "x-cascade" => "pass" + }.merge!(headers), + [body] + ] + end + + # The MIME type for the contents of the file located at @path + def mime_type(path, default_mime) + Mime.mime_type(::File.extname(path), default_mime) + end + + def filesize(path) + # We check via File::size? whether this file provides size info + # via stat (e.g. /proc files often don't), otherwise we have to + # figure it out by reading the whole file into memory. + ::File.size?(path) || ::File.read(path).bytesize + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/head.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/head.rb new file mode 100644 index 0000000..261bdf1 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/head.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require_relative 'constants' +require_relative 'body_proxy' + +module Rack + # Rack::Head returns an empty body for all HEAD requests. It leaves + # all other requests unchanged. + class Head + def initialize(app) + @app = app + end + + def call(env) + _, _, body = response = @app.call(env) + + if env[REQUEST_METHOD] == HEAD + body.close if body.respond_to?(:close) + response[2] = [] + end + + response + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/headers.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/headers.rb new file mode 100644 index 0000000..cedf3a8 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/headers.rb @@ -0,0 +1,238 @@ +# frozen_string_literal: true + +module Rack + # Rack::Headers is a Hash subclass that downcases all keys. It's designed + # to be used by rack applications that don't implement the Rack 3 SPEC + # (by using non-lowercase response header keys), automatically handling + # the downcasing of keys. + class Headers < Hash + KNOWN_HEADERS = {} + %w( + Accept-CH + Accept-Patch + Accept-Ranges + Access-Control-Allow-Credentials + Access-Control-Allow-Headers + Access-Control-Allow-Methods + Access-Control-Allow-Origin + Access-Control-Expose-Headers + Access-Control-Max-Age + Age + Allow + Alt-Svc + Cache-Control + Connection + Content-Disposition + Content-Encoding + Content-Language + Content-Length + Content-Location + Content-MD5 + Content-Range + Content-Security-Policy + Content-Security-Policy-Report-Only + Content-Type + Date + Delta-Base + ETag + Expect-CT + Expires + Feature-Policy + IM + Last-Modified + Link + Location + NEL + P3P + Permissions-Policy + Pragma + Preference-Applied + Proxy-Authenticate + Public-Key-Pins + Referrer-Policy + Refresh + Report-To + Retry-After + Server + Set-Cookie + Status + Strict-Transport-Security + Timing-Allow-Origin + Tk + Trailer + Transfer-Encoding + Upgrade + Vary + Via + WWW-Authenticate + Warning + X-Cascade + X-Content-Duration + X-Content-Security-Policy + X-Content-Type-Options + X-Correlation-ID + X-Correlation-Id + X-Download-Options + X-Frame-Options + X-Permitted-Cross-Domain-Policies + X-Powered-By + X-Redirect-By + X-Request-ID + X-Request-Id + X-Runtime + X-UA-Compatible + X-WebKit-CS + X-XSS-Protection + ).each do |str| + downcased = str.downcase.freeze + KNOWN_HEADERS[str] = KNOWN_HEADERS[downcased] = downcased + end + + def self.[](*items) + if items.length % 2 != 0 + if items.length == 1 && items.first.is_a?(Hash) + new.merge!(items.first) + else + raise ArgumentError, "odd number of arguments for Rack::Headers" + end + else + hash = new + loop do + break if items.length == 0 + key = items.shift + value = items.shift + hash[key] = value + end + hash + end + end + + def [](key) + super(downcase_key(key)) + end + + def []=(key, value) + super(KNOWN_HEADERS[key] || key.downcase.freeze, value) + end + alias store []= + + def assoc(key) + super(downcase_key(key)) + end + + def compare_by_identity + raise TypeError, "Rack::Headers cannot compare by identity, use regular Hash" + end + + def delete(key) + super(downcase_key(key)) + end + + def dig(key, *a) + super(downcase_key(key), *a) + end + + def fetch(key, *default, &block) + key = downcase_key(key) + super + end + + def fetch_values(*a) + super(*a.map!{|key| downcase_key(key)}) + end + + def has_key?(key) + super(downcase_key(key)) + end + alias include? has_key? + alias key? has_key? + alias member? has_key? + + def invert + hash = self.class.new + each{|key, value| hash[value] = key} + hash + end + + def merge(hash, &block) + dup.merge!(hash, &block) + end + + def reject(&block) + hash = dup + hash.reject!(&block) + hash + end + + def replace(hash) + clear + update(hash) + end + + def select(&block) + hash = dup + hash.select!(&block) + hash + end + + def to_proc + lambda{|x| self[x]} + end + + def transform_values(&block) + dup.transform_values!(&block) + end + + def update(hash, &block) + hash.each do |key, value| + self[key] = if block_given? && include?(key) + block.call(key, self[key], value) + else + value + end + end + self + end + alias merge! update + + def values_at(*keys) + keys.map{|key| self[key]} + end + + # :nocov: + if RUBY_VERSION >= '2.5' + # :nocov: + def slice(*a) + h = self.class.new + a.each{|k| h[k] = self[k] if has_key?(k)} + h + end + + def transform_keys(&block) + dup.transform_keys!(&block) + end + + def transform_keys! + hash = self.class.new + each do |k, v| + hash[yield k] = v + end + replace(hash) + end + end + + # :nocov: + if RUBY_VERSION >= '3.0' + # :nocov: + def except(*a) + super(*a.map!{|key| downcase_key(key)}) + end + end + + private + + def downcase_key(key) + key.is_a?(String) ? KNOWN_HEADERS[key] || key.downcase : key + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/lint.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/lint.rb new file mode 100644 index 0000000..a96bdea --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/lint.rb @@ -0,0 +1,964 @@ +# frozen_string_literal: true + +require 'forwardable' + +require_relative 'constants' +require_relative 'utils' + +module Rack + # Validates your application and the requests and responses according to the Rack spec. See SPEC.rdoc for details. + class Lint + # Represents a failure to meet the Rack specification. + class LintError < RuntimeError; end + + # Invoke the application, validating the request and response according to the Rack spec. + def call(env = nil) + Wrapper.new(@app, env).response + end + + # :stopdoc: + + ALLOWED_SCHEMES = %w(https http wss ws).freeze + + REQUEST_PATH_ORIGIN_FORM = /\A\/[^#]*\z/ + REQUEST_PATH_ABSOLUTE_FORM = /\A#{Utils::URI_PARSER.make_regexp}\z/ + REQUEST_PATH_AUTHORITY_FORM = /\A[^\/:]+:\d+\z/ + REQUEST_PATH_ASTERISK_FORM = '*' + + # Match a host name, according to RFC3986. Copied from `URI::RFC3986_Parser::HOST` because older Ruby versions (< 3.3) don't expose it. + HOST_PATTERN = / + (?\[(?: + (? + (?:\h{1,4}:){6} + (?\h{1,4}:\h{1,4} + | (?(?[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d) + \.\g\.\g\.\g) + ) + | ::(?:\h{1,4}:){5}\g + | \h{1,4}?::(?:\h{1,4}:){4}\g + | (?:(?:\h{1,4}:)?\h{1,4})?::(?:\h{1,4}:){3}\g + | (?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g + | (?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g + | (?:(?:\h{1,4}:){,4}\h{1,4})?::\g + | (?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4} + | (?:(?:\h{1,4}:){,6}\h{1,4})?:: + ) + | (?v\h++\.[!$&-.0-9:;=A-Z_a-z~]++) + )\]) + | \g + | (?(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])*+) + /x.freeze + SERVER_NAME_PATTERN = /\A#{HOST_PATTERN}\z/.freeze + HTTP_HOST_PATTERN = /\A#{HOST_PATTERN}(:\d*+)?\z/.freeze + + private_constant :HOST_PATTERN, :SERVER_NAME_PATTERN, :HTTP_HOST_PATTERN + + # N.B. The empty `##` comments creates paragraphs in the output. A trailing "\" is used to escape the newline character, which combines the comments into a single paragraph. + # + ## = Rack Specification + ## + ## This specification aims to formalize the Rack protocol. You can (and should) use +Rack::Lint+ to enforce it. When you develop middleware, be sure to test with +Rack::Lint+ to catch possible violations of this specification. + ## + ## == The Application + ## + ## A Rack application is a Ruby object that responds to +call+. \ + def initialize(app) + raise LintError, "app must respond to call" unless app.respond_to?(:call) + + @app = app + end + + class Wrapper + def initialize(app, env) + @app = app + @env = env + @response = nil + @head_request = false + + @status = nil + @headers = nil + @body = nil + @consumed = nil + @content_length = nil + @closed = false + @size = 0 + end + + def response + ## It takes exactly one argument, the +environment+ (representing an HTTP request) \ + raise LintError, "No env given" unless @env + check_environment(@env) + + ## and returns a non-frozen +Array+ of exactly three elements: \ + @response = @app.call(@env) + + raise LintError, "response is not an Array, but #{@response.class}" unless @response.kind_of? Array + raise LintError, "response is frozen" if @response.frozen? + raise LintError, "response array has #{@response.size} elements instead of 3" unless @response.size == 3 + + @status, @headers, @body = @response + ## the +status+, \ + check_status(@status) + + ## the +headers+, \ + check_headers(@headers) + + hijack_proc = check_hijack_response(@headers, @env) + if hijack_proc + @headers[RACK_HIJACK] = hijack_proc + end + + ## and the +body+ (representing an HTTP response). + check_content_type_header(@status, @headers) + check_content_length_header(@status, @headers) + check_rack_protocol_header(@status, @headers) + @head_request = @env[REQUEST_METHOD] == HEAD + + @lint = (@env['rack.lint'] ||= []) << self + + if (@env['rack.lint.body_iteration'] ||= 0) > 0 + raise LintError, "Middleware must not call #each directly" + end + + return [@status, @headers, self] + end + + private def assert_required(key) + raise LintError, "env missing required key #{key}" unless @env.include?(key) + + return @env[key] + end + + ## + ## == The Request Environment + ## + ## Incoming HTTP requests are represented using an environment. \ + def check_environment(env) + ## The environment must be an unfrozen +Hash+. The Rack application is free to modify the environment, but the modified environment should also comply with this specification. \ + raise LintError, "env #{env.inspect} is not a Hash, but #{env.class}" unless env.kind_of? Hash + raise LintError, "env should not be frozen, but is" if env.frozen? + + ## All environment keys must be strings. + keys = env.keys + keys.reject!{|key| String === key} + unless keys.empty? + raise LintError, "env contains non-string keys: #{keys.inspect}" + end + + ## + ## === CGI Variables + ## + ## The environment is required to include these variables, adopted from {The Common Gateway Interface}[https://datatracker.ietf.org/doc/html/rfc3875] (CGI), except when they'd be empty, but see below. + + ## + ## The CGI keys (named without a period) must have +String+ values and are reserved for the Rack specification. If the values for CGI keys contain non-ASCII characters, they should use ASCII-8BIT encoding. + env.each do |key, value| + next if key.include?(".") # Skip extensions + + unless value.kind_of? String + raise LintError, "env variable #{key} has non-string value #{value.inspect}" + end + + next if value.encoding == Encoding::ASCII_8BIT + + unless value.b !~ /[\x80-\xff]/n + raise LintError, "env variable #{key} has value containing non-ASCII characters and has non-ASCII-8BIT encoding #{value.inspect} encoding: #{value.encoding}" + end + end + + ## + ## The server and application can store their own data in the environment, too. The keys must contain at least one dot, and should be prefixed uniquely. The prefix rack. is reserved for use with the Rack specification and the classes that ship with Rack. + + ## + ## ==== REQUEST_METHOD + ## + ## The HTTP request method, such as "GET" or "POST". This cannot ever be an empty string, and so is always required. + request_method = assert_required(REQUEST_METHOD) + unless request_method =~ /\A[0-9A-Za-z!\#$%&'*+.^_`|~-]+\z/ + raise LintError, "REQUEST_METHOD unknown: #{request_method.inspect}" + end + + ## + ## ==== SCRIPT_NAME + ## + ## The initial portion of the request URL's path that corresponds to the application object, so that the application knows its virtual location. This may be an empty string, if the application corresponds to the root of the server. If non-empty, the string must start with /, but should not end with /. + if script_name = env[SCRIPT_NAME] + if script_name != "" && script_name !~ /\A\// + raise LintError, "SCRIPT_NAME must start with /" + end + + ## + ## In addition, SCRIPT_NAME MUST not be /, but instead be empty, \ + if script_name == "/" + raise LintError, "SCRIPT_NAME cannot be '/', make it '' and PATH_INFO '/'" + end + end + + ## and one of SCRIPT_NAME or PATH_INFO must be set, e.g. PATH_INFO can be / if SCRIPT_NAME is empty. + path_info = env[PATH_INFO] + if (script_name.nil? || script_name.empty?) && (path_info.nil? || path_info.empty?) + raise LintError, "One of SCRIPT_NAME or PATH_INFO must be set (make PATH_INFO '/' if SCRIPT_NAME is empty)" + end + + ## + ## ==== PATH_INFO + ## + ## The remainder of the request URL's "path", designating the virtual "location" of the request's target within the application. This may be an empty string, if the request URL targets the application root and does not have a trailing slash. This value may be percent-encoded when originating from a URL. + ## + ## The PATH_INFO, if provided, must be a valid request target or an empty string, as defined by {RFC9110}[https://datatracker.ietf.org/doc/html/rfc9110#target.resource]. + case path_info + when REQUEST_PATH_ASTERISK_FORM + ## * Only OPTIONS requests may have PATH_INFO set to * (asterisk-form). + unless request_method == OPTIONS + raise LintError, "Only OPTIONS requests may have PATH_INFO set to '*' (asterisk-form)" + end + when REQUEST_PATH_AUTHORITY_FORM + ## * Only CONNECT requests may have PATH_INFO set to an authority (authority-form). Note that in HTTP/2+, the authority-form is not a valid request target. + unless request_method == CONNECT + raise LintError, "Only CONNECT requests may have PATH_INFO set to an authority (authority-form)" + end + when REQUEST_PATH_ABSOLUTE_FORM + ## * CONNECT and OPTIONS requests must not have PATH_INFO set to a URI (absolute-form). + if request_method == CONNECT || request_method == OPTIONS + raise LintError, "CONNECT and OPTIONS requests must not have PATH_INFO set to a URI (absolute-form)" + end + when REQUEST_PATH_ORIGIN_FORM + ## * Otherwise, PATH_INFO must start with a / and must not include a fragment part starting with # (origin-form). + when "", nil + # Empty string or nil is okay. + else + raise LintError, "PATH_INFO must start with a '/' and must not include a fragment part starting with '#' (origin-form)" + end + + ## + ## ==== QUERY_STRING + ## + ## The portion of the request URL that follows the ?, if any. May be empty, but is always required! + assert_required(QUERY_STRING) + + ## + ## ==== SERVER_NAME + ## + ## Must be a valid host, as defined by {RFC3986}[https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2]. + ## + ## When combined with SCRIPT_NAME, PATH_INFO, and QUERY_STRING, these variables can be used to reconstruct the original the request URL. Note, however, that HTTP_HOST, if present, should be used in preference to SERVER_NAME for reconstructing the request URL. + server_name = assert_required(SERVER_NAME) + unless server_name.match?(SERVER_NAME_PATTERN) + raise LintError, "env[SERVER_NAME] must be a valid host" + end + + ## + ## ==== SERVER_PROTOCOL + ## + ## The HTTP version used for the request. It must match the regular expression HTTP\/\d(\.\d)?. + server_protocol = assert_required(SERVER_PROTOCOL) + unless %r{HTTP/\d(\.\d)?}.match?(server_protocol) + raise LintError, "env[SERVER_PROTOCOL] does not match HTTP/\\d(\\.\\d)?" + end + + ## + ## ==== SERVER_PORT + ## + ## The port the server is running on, if the server is running on a non-standard port. It must consist of digits only. + ## + ## The standard ports are: + ## * 80 for HTTP + ## * 443 for HTTPS + if server_port = env[SERVER_PORT] + unless server_port =~ /\A\d+\z/ + raise LintError, "env[SERVER_PORT] is not an Integer" + end + end + + ## + ## ==== CONTENT_TYPE + ## + ## The optional MIME type of the request body, if any. + # N.B. We do not validate this field as it is considered user-provided data. + + ## + ## ==== CONTENT_LENGTH + ## + ## The length of the request body, if any. It must consist of digits only. + if content_length = env["CONTENT_LENGTH"] + if content_length !~ /\A\d+\z/ + raise LintError, "Invalid CONTENT_LENGTH: #{content_length.inspect}" + end + end + + ## + ## ==== HTTP_HOST + ## + ## An optional HTTP authority, as defined by {RFC9110}[https://datatracker.ietf.org/doc/html/rfc9110#name-host-and-authority]. + if http_host = env[HTTP_HOST] + unless http_host.match?(HTTP_HOST_PATTERN) + raise LintError, "env[HTTP_HOST] must be a valid authority" + end + end + + ## + ## ==== HTTP_ Headers + ## + ## Unless specified above, the environment can contain any number of additional headers, each starting with HTTP_. The presence or absence of these variables should correspond with the presence or absence of the appropriate HTTP header in the request, and those headers have no specific interpretation or validation by the Rack specification. However, there are many standard HTTP headers that have a specific meaning in the context of a request; see {RFC3875 section 4.1.18}[https://tools.ietf.org/html/rfc3875#section-4.1.18] for more details. + ## + ## For compatibility with the CGI specifiction, the environment must not contain the keys HTTP_CONTENT_TYPE or HTTP_CONTENT_LENGTH. Instead, the keys CONTENT_TYPE and CONTENT_LENGTH must be used. + %w[HTTP_CONTENT_TYPE HTTP_CONTENT_LENGTH].each do |header| + if env.include?(header) + raise LintError, "env contains #{header}, must use #{header[5..-1]}" + end + end + + ## + ## === Rack-Specific Variables + ## + ## In addition to CGI variables, the Rack environment includes Rack-specific variables. These variables are prefixed with rack. and are reserved for use by the Rack specification, or by the classes that ship with Rack. + ## + ## ==== rack.url_scheme + ## + ## The URL scheme, which must be one of http, https, ws or wss. This can never be an empty string, and so is always required. The scheme should be set according to the last hop. For example, if a client makes a request to a reverse proxy over HTTPS, but the connection between the reverse proxy and the server is over plain HTTP, the reverse proxy should set rack.url_scheme to http. + rack_url_scheme = assert_required(RACK_URL_SCHEME) + unless ALLOWED_SCHEMES.include?(rack_url_scheme) + raise LintError, "rack.url_scheme unknown: #{rack_url_scheme.inspect}" + end + + ## + ## ==== rack.protocol + ## + ## An optional +Array+ of +String+ values, containing the protocols advertised by the client in the upgrade header (HTTP/1) or the :protocol pseudo-header (HTTP/2+). + if protocols = env[RACK_PROTOCOL] + unless protocols.is_a?(Array) && protocols.all?{|protocol| protocol.is_a?(String)} + raise LintError, "rack.protocol must be an Array of Strings" + end + end + + ## + ## ==== rack.session + ## + ## An optional +Hash+-like interface for storing request session data. The store must implement: + if session = env[RACK_SESSION] + ## * store(key, value) (aliased as []=) to set a value for a key, + unless session.respond_to?(:store) && session.respond_to?(:[]=) + raise LintError, "session #{session.inspect} must respond to store and []=" + end + + ## * fetch(key, default = nil) (aliased as []) to retrieve a value for a key, + unless session.respond_to?(:fetch) && session.respond_to?(:[]) + raise LintError, "session #{session.inspect} must respond to fetch and []" + end + + ## * delete(key) to delete a key, + unless session.respond_to?(:delete) + raise LintError, "session #{session.inspect} must respond to delete" + end + + ## * clear to clear the session, + unless session.respond_to?(:clear) + raise LintError, "session #{session.inspect} must respond to clear" + end + + ## * to_hash (optional) to retrieve the session as a Hash. + unless session.respond_to?(:to_hash) && session.to_hash.kind_of?(Hash) && !session.to_hash.frozen? + raise LintError, "session #{session.inspect} must respond to to_hash and return unfrozen Hash instance" + end + end + + ## + ## ==== rack.logger + ## + ## An optional +Logger+-like interface for logging messages. The logger must implement: + if logger = env[RACK_LOGGER] + ## * info(message, &block), + unless logger.respond_to?(:info) + raise LintError, "logger #{logger.inspect} must respond to info" + end + + ## * debug(message, &block), + unless logger.respond_to?(:debug) + raise LintError, "logger #{logger.inspect} must respond to debug" + end + + ## * warn(message, &block), + unless logger.respond_to?(:warn) + raise LintError, "logger #{logger.inspect} must respond to warn" + end + + ## * error(message, &block), + unless logger.respond_to?(:error) + raise LintError, "logger #{logger.inspect} must respond to error" + end + + ## * fatal(message, &block). + unless logger.respond_to?(:fatal) + raise LintError, "logger #{logger.inspect} must respond to fatal" + end + end + + ## + ## ==== rack.multipart.buffer_size + ## + ## An optional +Integer+ hint to the multipart parser as to what chunk size to use for reads and writes. + if rack_multipart_buffer_size = env[RACK_MULTIPART_BUFFER_SIZE] + unless rack_multipart_buffer_size.is_a?(Integer) && rack_multipart_buffer_size > 0 + raise LintError, "rack.multipart.buffer_size must be an Integer > 0 if specified" + end + end + + ## + ## ==== rack.multipart.tempfile_factory + ## + ## An optional object for constructing temporary files for multipart form data. The factory must implement: + if rack_multipart_tempfile_factory = env[RACK_MULTIPART_TEMPFILE_FACTORY] + ## * call(filename, content_type) to create a temporary file for a multipart form field. + unless rack_multipart_tempfile_factory.respond_to?(:call) + raise LintError, "rack.multipart.tempfile_factory must respond to #call" + end + + ## The factory must return an +IO+-like object that responds to << and optionally rewind. + env[RACK_MULTIPART_TEMPFILE_FACTORY] = lambda do |filename, content_type| + io = rack_multipart_tempfile_factory.call(filename, content_type) + unless io.respond_to?(:<<) + raise LintError, "rack.multipart.tempfile_factory return value must respond to #<<" + end + io + end + end + + ## + ## ==== rack.hijack? + ## + ## If present and truthy, indicates that the server supports partial hijacking. See the section below on hijacking for more information. + # + # N.B. There is no specific validation here. If the user provides a partial hijack response, we will confirm this value is truthy in `check_hijack_response`. + + ## + ## ==== rack.hijack + ## + ## If present, an object responding to +call+ that is used to perform a full hijack. See the section below on hijacking for more information. + check_hijack(env) + + ## + ## ==== rack.early_hints + ## + ## If present, an object responding to +call+ that is used to send early hints. See the section below on early hints for more information. + check_early_hints env + + ## + ## ==== rack.input + ## + ## If present, the input stream. See the section below on the input stream for more information. + if rack_input = env[RACK_INPUT] + check_input_stream(rack_input) + @env[RACK_INPUT] = InputWrapper.new(rack_input) + end + + ## + ## ==== rack.errors + ## + ## The error stream. See the section below on the error stream for more information. + rack_errors = assert_required(RACK_ERRORS) + check_error_stream(rack_errors) + @env[RACK_ERRORS] = ErrorWrapper.new(rack_errors) + + ## + ## ==== rack.response_finished + ## + ## If present, an array of callables that will be run by the server after the response has been processed. The callables are called with environment, status, headers, error arguments and should not raise any exceptions. The callables would typically be called after sending the response to the client, but it could also be called if an error occurs while generating the response or sending the response (in that case, the +error+ argument will be a kind of +Exception+). The callables will be called in reverse order. + if rack_response_finished = env[RACK_RESPONSE_FINISHED] + raise LintError, "rack.response_finished must be an array of callable objects" unless rack_response_finished.is_a?(Array) + rack_response_finished.each do |callable| + raise LintError, "rack.response_finished values must respond to call(env, status, headers, error)" unless callable.respond_to?(:call) + end + end + end + + ## + ## === The Input Stream + ## + ## The input stream is an +IO+-like object which contains the raw HTTP request data. \ + def check_input_stream(input) + ## When applicable, its external encoding must be ASCII-8BIT and it must be opened in binary mode. \ + if input.respond_to?(:external_encoding) && input.external_encoding != Encoding::ASCII_8BIT + raise LintError, "rack.input #{input} does not have ASCII-8BIT as its external encoding" + end + if input.respond_to?(:binmode?) && !input.binmode? + raise LintError, "rack.input #{input} is not opened in binary mode" + end + + ## The input stream must respond to +gets+, +each+, and +read+: + [:gets, :each, :read].each do |method| + unless input.respond_to? method + raise LintError, "rack.input #{input} does not respond to ##{method}" + end + end + end + + class InputWrapper + def initialize(input) + @input = input + end + + ## * +gets+ must be called without arguments and return a +String+, or +nil+ on EOF (end-of-file). + def gets(*args) + raise LintError, "rack.input#gets called with arguments" unless args.size == 0 + + chunk = @input.gets + + unless chunk.nil? or chunk.kind_of? String + raise LintError, "rack.input#gets didn't return a String" + end + + chunk + end + + ## * +read+ behaves like IO#read. Its signature is read([length, [buffer]]). + ## * If given, +length+ must be a non-negative Integer (>= 0) or +nil+, and +buffer+ must be a +String+ and may not be +nil+. + ## * If +length+ is given and not +nil+, then this method reads at most +length+ bytes from the input stream. + ## * If +length+ is not given or +nil+, then this method reads all data until EOF. + ## * When EOF is reached, this method returns +nil+ if +length+ is given and not +nil+, or +""+ if +length+ is not given or is +nil+. + ## * If +buffer+ is given, then the read data will be placed into +buffer+ instead of a newly created +String+. + def read(*args) + unless args.size <= 2 + raise LintError, "rack.input#read called with too many arguments" + end + if args.size >= 1 + unless args.first.kind_of?(Integer) || args.first.nil? + raise LintError, "rack.input#read called with non-integer and non-nil length" + end + unless args.first.nil? || args.first >= 0 + raise LintError, "rack.input#read called with a negative length" + end + end + if args.size >= 2 + unless args[1].kind_of?(String) + raise LintError, "rack.input#read called with non-String buffer" + end + end + + chunk = @input.read(*args) + + unless chunk.nil? or chunk.kind_of? String + raise LintError, "rack.input#read didn't return nil or a String" + end + if args[0].nil? + unless !chunk.nil? + raise LintError, "rack.input#read(nil) returned nil on EOF" + end + end + + chunk + end + + ## * +each+ must be called without arguments and only yield +String+ values. + def each(*args) + raise LintError, "rack.input#each called with arguments" unless args.size == 0 + @input.each do |line| + unless line.kind_of? String + raise LintError, "rack.input#each didn't yield a String" + end + yield line + end + end + + ## * +close+ can be called on the input stream to indicate that any remaining input is not needed. + def close(*args) + @input.close(*args) + end + end + + ## + ## === The Error Stream + ## + def check_error_stream(error) + ## The error stream must respond to +puts+, +write+ and +flush+: + [:puts, :write, :flush].each do |method| + unless error.respond_to? method + raise LintError, "rack.error #{error} does not respond to ##{method}" + end + end + end + + class ErrorWrapper + def initialize(error) + @error = error + end + + ## * +puts+ must be called with a single argument that responds to +to_s+. + def puts(str) + @error.puts str + end + + ## * +write+ must be called with a single argument that is a +String+. + def write(str) + raise LintError, "rack.errors#write not called with a String" unless str.kind_of? String + @error.write str + end + + ## * +flush+ must be called without arguments and must be called in order to make the error appear for sure. + def flush + @error.flush + end + + ## * +close+ must never be called on the error stream. + def close(*args) + raise LintError, "rack.errors#close must not be called" + end + end + + ## + ## === Hijacking + ## + ## The hijacking interfaces provides a means for an application to take control of the HTTP connection. There are two distinct hijack interfaces: full hijacking where the application takes over the raw connection, and partial hijacking where the application takes over just the response body stream. In both cases, the application is responsible for closing the hijacked stream. + ## + ## Full hijacking only works with HTTP/1. Partial hijacking is functionally equivalent to streaming bodies, and is still optionally supported for backwards compatibility with older Rack versions. + ## + ## ==== Full Hijack + ## + ## Full hijack is used to completely take over an HTTP/1 connection. It occurs before any headers are written and causes the server to ignore any response generated by the application. It is intended to be used when applications need access to the raw HTTP/1 connection. + ## + def check_hijack(env) + ## If rack.hijack is present in +env+, it must respond to +call+ \ + if original_hijack = env[RACK_HIJACK] + raise LintError, "rack.hijack must respond to call" unless original_hijack.respond_to?(:call) + + env[RACK_HIJACK] = proc do + io = original_hijack.call + + ## and return an +IO+ object which can be used to read and write to the underlying connection using HTTP/1 semantics and formatting. + raise LintError, "rack.hijack must return an IO instance" unless io.is_a?(IO) + + io + end + end + end + + ## + ## ==== Partial Hijack + ## + ## Partial hijack is used for bi-directional streaming of the request and response body. It occurs after the status and headers are written by the server and causes the server to ignore the Body of the response. It is intended to be used when applications need bi-directional streaming. + ## + def check_hijack_response(headers, env) + ## If rack.hijack? is present in +env+ and truthy, \ + if env[RACK_IS_HIJACK] + ## an application may set the special response header rack.hijack \ + if original_hijack = headers[RACK_HIJACK] + ## to an object that responds to +call+, \ + unless original_hijack.respond_to?(:call) + raise LintError, 'rack.hijack header must respond to #call' + end + ## accepting a +stream+ argument. + return proc do |io| + original_hijack.call StreamWrapper.new(io) + end + end + ## + ## After the response status and headers have been sent, this hijack callback will be called with a +stream+ argument which follows the same interface as outlined in "Streaming Body". Servers must ignore the +body+ part of the response tuple when the rack.hijack response header is present. Using an empty +Array+ is recommended. + else + ## + ## If rack.hijack? is not present and truthy, the special response header rack.hijack must not be present in the response headers. + if headers.key?(RACK_HIJACK) + raise LintError, 'rack.hijack header must not be present if server does not support hijacking' + end + end + + nil + end + + ## + ## === Early Hints + ## + ## The application or any middleware may call the rack.early_hints with an object which would be valid as the headers of a Rack response. + def check_early_hints(env) + if env[RACK_EARLY_HINTS] + ## + ## If rack.early_hints is present, it must respond to +call+. + unless env[RACK_EARLY_HINTS].respond_to?(:call) + raise LintError, "rack.early_hints must respond to call" + end + + original_callback = env[RACK_EARLY_HINTS] + env[RACK_EARLY_HINTS] = lambda do |headers| + ## If rack.early_hints is called, it must be called with valid Rack response headers. + check_headers(headers) + original_callback.call(headers) + end + end + end + + ## + ## == The Response + ## + ## Outgoing HTTP responses are generated from the response tuple generated by the application. The response tuple is an +Array+ of three elements, which are: the HTTP status, the headers, and the response body. The Rack application is responsible for ensuring that the response tuple is well-formed and should follow the rules set out in this specification. + ## + ## === The Status + ## + def check_status(status) + ## This is an HTTP status. It must be an Integer greater than or equal to 100. + unless status.is_a?(Integer) && status >= 100 + raise LintError, "Status must be an Integer >=100" + end + end + + ## + ## === The Headers + ## + def check_headers(headers) + ## The headers must be an unfrozen +Hash+. \ + unless headers.kind_of?(Hash) + raise LintError, "headers object should be a hash, but isn't (got #{headers.class} as headers)" + end + + if headers.frozen? + raise LintError, "headers object should not be frozen, but is" + end + + headers.each do |key, value| + ## The header keys must be +String+ values. \ + unless key.kind_of? String + raise LintError, "header key must be a string, was #{key.class}" + end + + ## Special headers starting rack. are for communicating with the server, and must not be sent back to the client. + next if key.start_with?("rack.") + + ## + ## * The headers must not contain a "status" key. + raise LintError, "headers must not contain status" if key == "status" + ## * Header keys must conform to {RFC7230}[https://tools.ietf.org/html/rfc7230] token specification, i.e. cannot contain non-printable ASCII, DQUOTE or (),/:;<=>?@[\]{}. + raise LintError, "invalid header name: #{key}" if key =~ /[\(\),\/:;<=>\?@\[\\\]{}[:cntrl:]]/ + ## * Header keys must not contain uppercase ASCII characters (A-Z). + raise LintError, "uppercase character in header name: #{key}" if key =~ /[A-Z]/ + + ## * Header values must be either a +String+, \ + if value.kind_of?(String) + check_header_value(key, value) + elsif value.kind_of?(Array) + ## or an +Array+ of +String+ values, \ + value.each{|value| check_header_value(key, value)} + else + raise LintError, "a header value must be a String or Array of Strings, but the value of '#{key}' is a #{value.class}" + end + end + end + + def check_header_value(key, value) + ## such that each +String+ must not contain NUL (\0), CR (\r), or LF (\n). + if value.match?(/[\x00\x0A\x0D]/) + raise LintError, "invalid header value #{key}: #{value.inspect}" + end + end + + ## + ## ==== The content-type Header + ## + def check_content_type_header(status, headers) + headers.each do |key, value| + ## There must not be a content-type header key when the status is 1xx, 204, or 304. + if key == "content-type" + if Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.key? status.to_i + raise LintError, "content-type header found in #{status} response, not allowed" + end + return + end + end + end + + ## + ## ==== The content-length Header + ## + def check_content_length_header(status, headers) + headers.each do |key, value| + if key == 'content-length' + ## There must not be a content-length header key when the status is 1xx, 204, or 304. + if Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.key? status.to_i + raise LintError, "content-length header found in #{status} response, not allowed" + end + @content_length = value + end + end + end + + def verify_content_length(size) + if @head_request + unless size == 0 + raise LintError, "Response body was given for HEAD request, but should be empty" + end + elsif @content_length + unless @content_length == size.to_s + raise LintError, "content-length header was #{@content_length}, but should be #{size}" + end + end + end + + ## + ## ==== The rack.protocol Header + ## + def check_rack_protocol_header(status, headers) + ## If the rack.protocol header is present, it must be a +String+, and must be one of the values from the rack.protocol array from the environment. + protocol = headers['rack.protocol'] + + if protocol + request_protocols = @env['rack.protocol'] + + if request_protocols.nil? + raise LintError, "rack.protocol header is #{protocol.inspect}, but rack.protocol was not set in request!" + elsif !request_protocols.include?(protocol) + raise LintError, "rack.protocol header is #{protocol.inspect}, but should be one of #{request_protocols.inspect} from the request!" + end + end + end + ## + ## Setting this value informs the server that it should perform a connection upgrade. In HTTP/1, this is done using the +upgrade+ header. In HTTP/2+, this is done by accepting the request. + ## + ## === The Body + ## + ## The Body is typically an +Array+ of +String+ values, an enumerable that yields +String+ values, a +Proc+, or an +IO+-like object. + ## + ## The Body must respond to +each+ or +call+. It may optionally respond to +to_path+ or +to_ary+. A Body that responds to +each+ is considered to be an Enumerable Body. A Body that responds to +call+ is considered to be a Streaming Body. + ## + ## A Body that responds to both +each+ and +call+ must be treated as an Enumerable Body, not a Streaming Body. If it responds to +each+, you must call +each+ and not +call+. If the Body doesn't respond to +each+, then you can assume it responds to +call+. + ## + ## The Body must either be consumed or returned. The Body is consumed by optionally calling either +each+ or +call+. Then, if the Body responds to +close+, it must be called to release any resources associated with the generation of the body. In other words, +close+ must always be called at least once; typically after the web server has sent the response to the client, but also in cases where the Rack application makes internal/virtual requests and discards the response. + def close + ## + ## After calling +close+, the Body is considered closed and should not be consumed again. \ + @closed = true + + ## If the original Body is replaced by a new Body, the new Body must also consume the original Body by calling +close+ if possible. + @body.close if @body.respond_to?(:close) + + index = @lint.index(self) + unless @env['rack.lint'][0..index].all? {|lint| lint.instance_variable_get(:@closed)} + raise LintError, "Body has not been closed" + end + end + + def verify_to_path + ## + ## If the Body responds to +to_path+, it must return either +nil+ or a +String+. If a +String+ is returned, it must be a path for the local file system whose contents are identical to that produced by calling +each+; this may be used by the server as an alternative, possibly more efficient way to transport the response. The +to_path+ method does not consume the body. + if @body.respond_to?(:to_path) + optional_path = @body.to_path + + if optional_path != nil + unless optional_path.is_a?(String) && ::File.exist?(optional_path) + raise LintError, "body.to_path must be nil or a path to an existing file" + end + end + end + end + + ## + ## ==== Enumerable Body + ## + def each + ## The Enumerable Body must respond to +each+, \ + raise LintError, "Enumerable Body must respond to each" unless @body.respond_to?(:each) + + ## which must only be called once, \ + raise LintError, "Response body must only be called once (#{@consumed})" unless @consumed.nil? + + ## must not be called after being closed, \ + raise LintError, "Response body is already closed" if @closed + + @consumed = :each + + @body.each do |chunk| + ## and must only yield +String+ values. + unless chunk.kind_of? String + raise LintError, "Body yielded non-string value #{chunk.inspect}" + end + + ## + ## Middleware must not call +each+ directly on the Body. Instead, middleware can return a new Body that calls +each+ on the original Body, yielding at least once per iteration. + if @lint[0] == self + @env['rack.lint.body_iteration'] += 1 + else + if (@env['rack.lint.body_iteration'] -= 1) > 0 + raise LintError, "New body must yield at least once per iteration of old body" + end + end + + @size += chunk.bytesize + yield chunk + end + + verify_content_length(@size) + + verify_to_path + end + + BODY_METHODS = {to_ary: true, each: true, call: true, to_path: true} + + def to_path + @body.to_path + end + + def respond_to?(name, *) + if BODY_METHODS.key?(name) + @body.respond_to?(name) + else + super + end + end + + ## + ## If the Body responds to +to_ary+, it must return an +Array+ whose contents are identical to that produced by calling +each+. Middleware may call +to_ary+ directly on the Body and return a new Body in its place. In other words, middleware can only process the Body directly if it responds to +to_ary+. If the Body responds to both +to_ary+ and +close+, its implementation of +to_ary+ must call +close+. + def to_ary + @body.to_ary.tap do |content| + unless content == @body.enum_for.to_a + raise LintError, "#to_ary not identical to contents produced by calling #each" + end + end + ensure + close + end + + ## + ## ==== Streaming Body + ## + def call(stream) + ## The Streaming Body must respond to +call+, \ + raise LintError, "Streaming Body must respond to call" unless @body.respond_to?(:call) + + ## which must only be called once, \ + raise LintError, "Response body must only be called once (#{@consumed})" unless @consumed.nil? + + ## must not be called after being closed, \ + raise LintError, "Response body is already closed" if @closed + + @consumed = :call + + ## and accept a +stream+ argument. + ## + ## The +stream+ argument must respond to: +read+, +write+, <<, +flush+, +close+, +close_read+, +close_write+, and +closed?+. \ + @body.call(StreamWrapper.new(stream)) + end + + class StreamWrapper + extend Forwardable + + ## The semantics of these +IO+ methods must be a best effort match to those of a normal Ruby +IO+ or +Socket+ object, using standard arguments and raising standard exceptions. Servers may simply pass on real +IO+ objects to the Streaming Body. In some cases (e.g. when using transfer-encoding or HTTP/2+), the server may need to provide a wrapper that implements the required methods, in order to provide the correct semantics. + REQUIRED_METHODS = [ + :read, :write, :<<, :flush, :close, + :close_read, :close_write, :closed? + ] + + def_delegators :@stream, *REQUIRED_METHODS + + def initialize(stream) + @stream = stream + + REQUIRED_METHODS.each do |method_name| + raise LintError, "Stream must respond to #{method_name}" unless stream.respond_to?(method_name) + end + end + end + end + end +end + +## +## == Thanks +## +## We'd like to thank everyone who has contributed to the Rack project over the years. Your work has made this specification possible. That includes everyone who has contributed code, documentation, bug reports, and feedback. We'd also like to thank the authors of the various web servers, frameworks, and libraries that have implemented the Rack specification. Your work has helped to make the web a better place. +## +## Some parts of this specification are adapted from {PEP 333 – Python Web Server Gateway Interface v1.0}[https://peps.python.org/pep-0333/]. We'd like to thank everyone involved in that effort. diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/lock.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/lock.rb new file mode 100644 index 0000000..342123a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/lock.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require_relative 'body_proxy' + +module Rack + # Rack::Lock locks every request inside a mutex, so that every request + # will effectively be executed synchronously. + class Lock + def initialize(app, mutex = Mutex.new) + @app, @mutex = app, mutex + end + + def call(env) + @mutex.lock + begin + response = @app.call(env) + returned = response << BodyProxy.new(response.pop) { unlock } + ensure + unlock unless returned + end + end + + private + + def unlock + @mutex.unlock + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/media_type.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/media_type.rb new file mode 100644 index 0000000..29ad117 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/media_type.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +module Rack + # Rack::MediaType parse media type and parameters out of content_type string + + class MediaType + SPLIT_PATTERN = /[;,]/ + + class << self + # The media type (type/subtype) portion of the CONTENT_TYPE header + # without any media type parameters. e.g., when CONTENT_TYPE is + # "text/plain;charset=utf-8", the media-type is "text/plain". + # + # For more information on the use of media types in HTTP, see: + # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7 + def type(content_type) + return nil unless content_type && !content_type.empty? + type = content_type.split(SPLIT_PATTERN, 2).first + type.rstrip! + type.downcase! + type + end + + # The media type parameters provided in CONTENT_TYPE as a Hash, or + # an empty Hash if no CONTENT_TYPE or media-type parameters were + # provided. e.g., when the CONTENT_TYPE is "text/plain;charset=utf-8", + # this method responds with the following Hash: + # { 'charset' => 'utf-8' } + # + # This will pass back parameters with empty strings in the hash if they + # lack a value (e.g., "text/plain;charset=" will return { 'charset' => '' }, + # and "text/plain;charset" will return { 'charset' => '' }, similarly to + # the query params parser (barring the latter case, which returns nil instead)). + def params(content_type) + return {} if content_type.nil? || content_type.empty? + + content_type.split(SPLIT_PATTERN)[1..-1].each_with_object({}) do |s, hsh| + s.strip! + k, v = s.split('=', 2) + k.downcase! + hsh[k] = strip_doublequotes(v) + end + end + + private + + def strip_doublequotes(str) + (str && str.start_with?('"') && str.end_with?('"')) ? str[1..-2] : str || '' + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/method_override.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/method_override.rb new file mode 100644 index 0000000..6125b19 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/method_override.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +require_relative 'constants' +require_relative 'request' +require_relative 'utils' + +module Rack + class MethodOverride + HTTP_METHODS = %w[GET HEAD PUT POST DELETE OPTIONS PATCH LINK UNLINK] + + METHOD_OVERRIDE_PARAM_KEY = "_method" + HTTP_METHOD_OVERRIDE_HEADER = "HTTP_X_HTTP_METHOD_OVERRIDE" + ALLOWED_METHODS = %w[POST] + + def initialize(app) + @app = app + end + + def call(env) + if allowed_methods.include?(env[REQUEST_METHOD]) + method = method_override(env) + if HTTP_METHODS.include?(method) + env[RACK_METHODOVERRIDE_ORIGINAL_METHOD] = env[REQUEST_METHOD] + env[REQUEST_METHOD] = method + end + end + + @app.call(env) + end + + def method_override(env) + req = Request.new(env) + method = method_override_param(req) || + env[HTTP_METHOD_OVERRIDE_HEADER] + begin + method.to_s.upcase + rescue ArgumentError + env[RACK_ERRORS].puts "Invalid string for method" + end + end + + private + + def allowed_methods + ALLOWED_METHODS + end + + def method_override_param(req) + req.POST[METHOD_OVERRIDE_PARAM_KEY] if req.form_data? || req.parseable_data? + rescue Utils::InvalidParameterError, Utils::ParameterTypeError, QueryParser::ParamsTooDeepError + req.get_header(RACK_ERRORS).puts "Invalid or incomplete POST params" + rescue EOFError + req.get_header(RACK_ERRORS).puts "Bad request content body" + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mime.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mime.rb new file mode 100644 index 0000000..0272968 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mime.rb @@ -0,0 +1,694 @@ +# frozen_string_literal: true + +module Rack + module Mime + # Returns String with mime type if found, otherwise use +fallback+. + # +ext+ should be filename extension in the '.ext' format that + # File.extname(file) returns. + # +fallback+ may be any object + # + # Also see the documentation for MIME_TYPES + # + # Usage: + # Rack::Mime.mime_type('.foo') + # + # This is a shortcut for: + # Rack::Mime::MIME_TYPES.fetch('https://github.com/.foo', 'application/octet-stream') + + def mime_type(ext, fallback = 'application/octet-stream') + MIME_TYPES.fetch(ext.to_s.downcase, fallback) + end + module_function :mime_type + + # Returns true if the given value is a mime match for the given mime match + # specification, false otherwise. + # + # Rack::Mime.match?('text/html', 'text/*') => true + # Rack::Mime.match?('text/plain', '*') => true + # Rack::Mime.match?('text/html', 'application/json') => false + + def match?(value, matcher) + v1, v2 = value.split('/', 2) + m1, m2 = matcher.split('/', 2) + + (m1 == '*' || v1 == m1) && (m2.nil? || m2 == '*' || m2 == v2) + end + module_function :match? + + # List of most common mime-types, selected various sources + # according to their usefulness in a webserving scope for Ruby + # users. + # + # To amend this list with your local mime.types list you can use: + # + # require 'webrick/httputils' + # list = WEBrick::HTTPUtils.load_mime_types('/etc/mime.types') + # Rack::Mime::MIME_TYPES.merge!(list) + # + # N.B. On Ubuntu the mime.types file does not include the leading period, so + # users may need to modify the data before merging into the hash. + + MIME_TYPES = { + ".123" => "application/vnd.lotus-1-2-3", + ".3dml" => "text/vnd.in3d.3dml", + ".3g2" => "video/3gpp2", + ".3gp" => "video/3gpp", + ".a" => "application/octet-stream", + ".acc" => "application/vnd.americandynamics.acc", + ".ace" => "application/x-ace-compressed", + ".acu" => "application/vnd.acucobol", + ".aep" => "application/vnd.audiograph", + ".afp" => "application/vnd.ibm.modcap", + ".ai" => "application/postscript", + ".aif" => "audio/x-aiff", + ".aiff" => "audio/x-aiff", + ".ami" => "application/vnd.amiga.ami", + ".apng" => "image/apng", + ".appcache" => "text/cache-manifest", + ".apr" => "application/vnd.lotus-approach", + ".asc" => "application/pgp-signature", + ".asf" => "video/x-ms-asf", + ".asm" => "text/x-asm", + ".aso" => "application/vnd.accpac.simply.aso", + ".asx" => "video/x-ms-asf", + ".atc" => "application/vnd.acucorp", + ".atom" => "application/atom+xml", + ".atomcat" => "application/atomcat+xml", + ".atomsvc" => "application/atomsvc+xml", + ".atx" => "application/vnd.antix.game-component", + ".au" => "audio/basic", + ".avi" => "video/x-msvideo", + ".avif" => "image/avif", + ".bat" => "application/x-msdownload", + ".bcpio" => "application/x-bcpio", + ".bdm" => "application/vnd.syncml.dm+wbxml", + ".bh2" => "application/vnd.fujitsu.oasysprs", + ".bin" => "application/octet-stream", + ".bmi" => "application/vnd.bmi", + ".bmp" => "image/bmp", + ".box" => "application/vnd.previewsystems.box", + ".btif" => "image/prs.btif", + ".bz" => "application/x-bzip", + ".bz2" => "application/x-bzip2", + ".c" => "text/x-c", + ".c4g" => "application/vnd.clonk.c4group", + ".cab" => "application/vnd.ms-cab-compressed", + ".cc" => "text/x-c", + ".ccxml" => "application/ccxml+xml", + ".cdbcmsg" => "application/vnd.contact.cmsg", + ".cdkey" => "application/vnd.mediastation.cdkey", + ".cdx" => "chemical/x-cdx", + ".cdxml" => "application/vnd.chemdraw+xml", + ".cdy" => "application/vnd.cinderella", + ".cer" => "application/pkix-cert", + ".cgm" => "image/cgm", + ".chat" => "application/x-chat", + ".chm" => "application/vnd.ms-htmlhelp", + ".chrt" => "application/vnd.kde.kchart", + ".cif" => "chemical/x-cif", + ".cii" => "application/vnd.anser-web-certificate-issue-initiation", + ".cil" => "application/vnd.ms-artgalry", + ".cla" => "application/vnd.claymore", + ".class" => "application/octet-stream", + ".clkk" => "application/vnd.crick.clicker.keyboard", + ".clkp" => "application/vnd.crick.clicker.palette", + ".clkt" => "application/vnd.crick.clicker.template", + ".clkw" => "application/vnd.crick.clicker.wordbank", + ".clkx" => "application/vnd.crick.clicker", + ".clp" => "application/x-msclip", + ".cmc" => "application/vnd.cosmocaller", + ".cmdf" => "chemical/x-cmdf", + ".cml" => "chemical/x-cml", + ".cmp" => "application/vnd.yellowriver-custom-menu", + ".cmx" => "image/x-cmx", + ".com" => "application/x-msdownload", + ".conf" => "text/plain", + ".cpio" => "application/x-cpio", + ".cpp" => "text/x-c", + ".cpt" => "application/mac-compactpro", + ".crd" => "application/x-mscardfile", + ".crl" => "application/pkix-crl", + ".crt" => "application/x-x509-ca-cert", + ".csh" => "application/x-csh", + ".csml" => "chemical/x-csml", + ".csp" => "application/vnd.commonspace", + ".css" => "text/css", + ".csv" => "text/csv", + ".curl" => "application/vnd.curl", + ".cww" => "application/prs.cww", + ".cxx" => "text/x-c", + ".daf" => "application/vnd.mobius.daf", + ".davmount" => "application/davmount+xml", + ".dcr" => "application/x-director", + ".dd2" => "application/vnd.oma.dd2+xml", + ".ddd" => "application/vnd.fujixerox.ddd", + ".deb" => "application/x-debian-package", + ".der" => "application/x-x509-ca-cert", + ".dfac" => "application/vnd.dreamfactory", + ".diff" => "text/x-diff", + ".dis" => "application/vnd.mobius.dis", + ".djv" => "image/vnd.djvu", + ".djvu" => "image/vnd.djvu", + ".dll" => "application/x-msdownload", + ".dmg" => "application/octet-stream", + ".dna" => "application/vnd.dna", + ".doc" => "application/msword", + ".docm" => "application/vnd.ms-word.document.macroEnabled.12", + ".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + ".dot" => "application/msword", + ".dotm" => "application/vnd.ms-word.template.macroEnabled.12", + ".dotx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.template", + ".dp" => "application/vnd.osgi.dp", + ".dpg" => "application/vnd.dpgraph", + ".dsc" => "text/prs.lines.tag", + ".dtd" => "application/xml-dtd", + ".dts" => "audio/vnd.dts", + ".dtshd" => "audio/vnd.dts.hd", + ".dv" => "video/x-dv", + ".dvi" => "application/x-dvi", + ".dwf" => "model/vnd.dwf", + ".dwg" => "image/vnd.dwg", + ".dxf" => "image/vnd.dxf", + ".dxp" => "application/vnd.spotfire.dxp", + ".ear" => "application/java-archive", + ".ecelp4800" => "audio/vnd.nuera.ecelp4800", + ".ecelp7470" => "audio/vnd.nuera.ecelp7470", + ".ecelp9600" => "audio/vnd.nuera.ecelp9600", + ".ecma" => "application/ecmascript", + ".edm" => "application/vnd.novadigm.edm", + ".edx" => "application/vnd.novadigm.edx", + ".efif" => "application/vnd.picsel", + ".ei6" => "application/vnd.pg.osasli", + ".eml" => "message/rfc822", + ".eol" => "audio/vnd.digital-winds", + ".eot" => "application/vnd.ms-fontobject", + ".eps" => "application/postscript", + ".es3" => "application/vnd.eszigno3+xml", + ".esf" => "application/vnd.epson.esf", + ".etx" => "text/x-setext", + ".exe" => "application/x-msdownload", + ".ext" => "application/vnd.novadigm.ext", + ".ez" => "application/andrew-inset", + ".ez2" => "application/vnd.ezpix-album", + ".ez3" => "application/vnd.ezpix-package", + ".f" => "text/x-fortran", + ".f77" => "text/x-fortran", + ".f90" => "text/x-fortran", + ".fbs" => "image/vnd.fastbidsheet", + ".fdf" => "application/vnd.fdf", + ".fe_launch" => "application/vnd.denovo.fcselayout-link", + ".fg5" => "application/vnd.fujitsu.oasysgp", + ".fli" => "video/x-fli", + ".flif" => "image/flif", + ".flo" => "application/vnd.micrografx.flo", + ".flv" => "video/x-flv", + ".flw" => "application/vnd.kde.kivio", + ".flx" => "text/vnd.fmi.flexstor", + ".fly" => "text/vnd.fly", + ".fm" => "application/vnd.framemaker", + ".fnc" => "application/vnd.frogans.fnc", + ".for" => "text/x-fortran", + ".fpx" => "image/vnd.fpx", + ".fsc" => "application/vnd.fsc.weblaunch", + ".fst" => "image/vnd.fst", + ".ftc" => "application/vnd.fluxtime.clip", + ".fti" => "application/vnd.anser-web-funds-transfer-initiation", + ".fvt" => "video/vnd.fvt", + ".fzs" => "application/vnd.fuzzysheet", + ".g3" => "image/g3fax", + ".gac" => "application/vnd.groove-account", + ".gdl" => "model/vnd.gdl", + ".gem" => "application/octet-stream", + ".gemspec" => "text/x-script.ruby", + ".ghf" => "application/vnd.groove-help", + ".gif" => "image/gif", + ".gim" => "application/vnd.groove-identity-message", + ".gmx" => "application/vnd.gmx", + ".gph" => "application/vnd.flographit", + ".gqf" => "application/vnd.grafeq", + ".gram" => "application/srgs", + ".grv" => "application/vnd.groove-injector", + ".grxml" => "application/srgs+xml", + ".gtar" => "application/x-gtar", + ".gtm" => "application/vnd.groove-tool-message", + ".gtw" => "model/vnd.gtw", + ".gv" => "text/vnd.graphviz", + ".gz" => "application/x-gzip", + ".h" => "text/x-c", + ".h261" => "video/h261", + ".h263" => "video/h263", + ".h264" => "video/h264", + ".hbci" => "application/vnd.hbci", + ".hdf" => "application/x-hdf", + ".heic" => "image/heic", + ".heics" => "image/heic-sequence", + ".heif" => "image/heif", + ".heifs" => "image/heif-sequence", + ".hh" => "text/x-c", + ".hlp" => "application/winhlp", + ".hpgl" => "application/vnd.hp-hpgl", + ".hpid" => "application/vnd.hp-hpid", + ".hps" => "application/vnd.hp-hps", + ".hqx" => "application/mac-binhex40", + ".htc" => "text/x-component", + ".htke" => "application/vnd.kenameaapp", + ".htm" => "text/html", + ".html" => "text/html", + ".hvd" => "application/vnd.yamaha.hv-dic", + ".hvp" => "application/vnd.yamaha.hv-voice", + ".hvs" => "application/vnd.yamaha.hv-script", + ".icc" => "application/vnd.iccprofile", + ".ice" => "x-conference/x-cooltalk", + ".ico" => "image/vnd.microsoft.icon", + ".ics" => "text/calendar", + ".ief" => "image/ief", + ".ifb" => "text/calendar", + ".ifm" => "application/vnd.shana.informed.formdata", + ".igl" => "application/vnd.igloader", + ".igs" => "model/iges", + ".igx" => "application/vnd.micrografx.igx", + ".iif" => "application/vnd.shana.informed.interchange", + ".imp" => "application/vnd.accpac.simply.imp", + ".ims" => "application/vnd.ms-ims", + ".ipk" => "application/vnd.shana.informed.package", + ".irm" => "application/vnd.ibm.rights-management", + ".irp" => "application/vnd.irepository.package+xml", + ".iso" => "application/octet-stream", + ".itp" => "application/vnd.shana.informed.formtemplate", + ".ivp" => "application/vnd.immervision-ivp", + ".ivu" => "application/vnd.immervision-ivu", + ".jad" => "text/vnd.sun.j2me.app-descriptor", + ".jam" => "application/vnd.jam", + ".jar" => "application/java-archive", + ".java" => "text/x-java-source", + ".jisp" => "application/vnd.jisp", + ".jlt" => "application/vnd.hp-jlyt", + ".jnlp" => "application/x-java-jnlp-file", + ".joda" => "application/vnd.joost.joda-archive", + ".jp2" => "image/jp2", + ".jpeg" => "image/jpeg", + ".jpg" => "image/jpeg", + ".jpgv" => "video/jpeg", + ".jpm" => "video/jpm", + ".js" => "text/javascript", + ".json" => "application/json", + ".karbon" => "application/vnd.kde.karbon", + ".kfo" => "application/vnd.kde.kformula", + ".kia" => "application/vnd.kidspiration", + ".kml" => "application/vnd.google-earth.kml+xml", + ".kmz" => "application/vnd.google-earth.kmz", + ".kne" => "application/vnd.kinar", + ".kon" => "application/vnd.kde.kontour", + ".kpr" => "application/vnd.kde.kpresenter", + ".ksp" => "application/vnd.kde.kspread", + ".ktz" => "application/vnd.kahootz", + ".kwd" => "application/vnd.kde.kword", + ".latex" => "application/x-latex", + ".lbd" => "application/vnd.llamagraphics.life-balance.desktop", + ".lbe" => "application/vnd.llamagraphics.life-balance.exchange+xml", + ".les" => "application/vnd.hhe.lesson-player", + ".link66" => "application/vnd.route66.link66+xml", + ".log" => "text/plain", + ".lostxml" => "application/lost+xml", + ".lrm" => "application/vnd.ms-lrm", + ".ltf" => "application/vnd.frogans.ltf", + ".lvp" => "audio/vnd.lucent.voice", + ".lwp" => "application/vnd.lotus-wordpro", + ".m3u" => "audio/x-mpegurl", + ".m3u8" => "application/x-mpegurl", + ".m4a" => "audio/mp4a-latm", + ".m4v" => "video/mp4", + ".ma" => "application/mathematica", + ".mag" => "application/vnd.ecowin.chart", + ".man" => "text/troff", + ".manifest" => "text/cache-manifest", + ".mathml" => "application/mathml+xml", + ".mbk" => "application/vnd.mobius.mbk", + ".mbox" => "application/mbox", + ".mc1" => "application/vnd.medcalcdata", + ".mcd" => "application/vnd.mcd", + ".mdb" => "application/x-msaccess", + ".mdi" => "image/vnd.ms-modi", + ".mdoc" => "text/troff", + ".me" => "text/troff", + ".mfm" => "application/vnd.mfmp", + ".mgz" => "application/vnd.proteus.magazine", + ".mid" => "audio/midi", + ".midi" => "audio/midi", + ".mif" => "application/vnd.mif", + ".mime" => "message/rfc822", + ".mj2" => "video/mj2", + ".mjs" => "text/javascript", + ".mlp" => "application/vnd.dolby.mlp", + ".mmd" => "application/vnd.chipnuts.karaoke-mmd", + ".mmf" => "application/vnd.smaf", + ".mml" => "application/mathml+xml", + ".mmr" => "image/vnd.fujixerox.edmics-mmr", + ".mng" => "video/x-mng", + ".mny" => "application/x-msmoney", + ".mov" => "video/quicktime", + ".movie" => "video/x-sgi-movie", + ".mp3" => "audio/mpeg", + ".mp4" => "video/mp4", + ".mp4a" => "audio/mp4", + ".mp4s" => "application/mp4", + ".mp4v" => "video/mp4", + ".mpc" => "application/vnd.mophun.certificate", + ".mpd" => "application/dash+xml", + ".mpeg" => "video/mpeg", + ".mpg" => "video/mpeg", + ".mpga" => "audio/mpeg", + ".mpkg" => "application/vnd.apple.installer+xml", + ".mpm" => "application/vnd.blueice.multipass", + ".mpn" => "application/vnd.mophun.application", + ".mpp" => "application/vnd.ms-project", + ".mpy" => "application/vnd.ibm.minipay", + ".mqy" => "application/vnd.mobius.mqy", + ".mrc" => "application/marc", + ".ms" => "text/troff", + ".mscml" => "application/mediaservercontrol+xml", + ".mseq" => "application/vnd.mseq", + ".msf" => "application/vnd.epson.msf", + ".msh" => "model/mesh", + ".msi" => "application/x-msdownload", + ".msl" => "application/vnd.mobius.msl", + ".msty" => "application/vnd.muvee.style", + ".mts" => "model/vnd.mts", + ".mus" => "application/vnd.musician", + ".mvb" => "application/x-msmediaview", + ".mwf" => "application/vnd.mfer", + ".mxf" => "application/mxf", + ".mxl" => "application/vnd.recordare.musicxml", + ".mxml" => "application/xv+xml", + ".mxs" => "application/vnd.triscape.mxs", + ".mxu" => "video/vnd.mpegurl", + ".n" => "application/vnd.nokia.n-gage.symbian.install", + ".nc" => "application/x-netcdf", + ".ngdat" => "application/vnd.nokia.n-gage.data", + ".nlu" => "application/vnd.neurolanguage.nlu", + ".nml" => "application/vnd.enliven", + ".nnd" => "application/vnd.noblenet-directory", + ".nns" => "application/vnd.noblenet-sealer", + ".nnw" => "application/vnd.noblenet-web", + ".npx" => "image/vnd.net-fpx", + ".nsf" => "application/vnd.lotus-notes", + ".oa2" => "application/vnd.fujitsu.oasys2", + ".oa3" => "application/vnd.fujitsu.oasys3", + ".oas" => "application/vnd.fujitsu.oasys", + ".obd" => "application/x-msbinder", + ".oda" => "application/oda", + ".odc" => "application/vnd.oasis.opendocument.chart", + ".odf" => "application/vnd.oasis.opendocument.formula", + ".odg" => "application/vnd.oasis.opendocument.graphics", + ".odi" => "application/vnd.oasis.opendocument.image", + ".odp" => "application/vnd.oasis.opendocument.presentation", + ".ods" => "application/vnd.oasis.opendocument.spreadsheet", + ".odt" => "application/vnd.oasis.opendocument.text", + ".oga" => "audio/ogg", + ".ogg" => "application/ogg", + ".ogv" => "video/ogg", + ".ogx" => "application/ogg", + ".org" => "application/vnd.lotus-organizer", + ".otc" => "application/vnd.oasis.opendocument.chart-template", + ".otf" => "font/otf", + ".otg" => "application/vnd.oasis.opendocument.graphics-template", + ".oth" => "application/vnd.oasis.opendocument.text-web", + ".oti" => "application/vnd.oasis.opendocument.image-template", + ".otm" => "application/vnd.oasis.opendocument.text-master", + ".ots" => "application/vnd.oasis.opendocument.spreadsheet-template", + ".ott" => "application/vnd.oasis.opendocument.text-template", + ".oxt" => "application/vnd.openofficeorg.extension", + ".p" => "text/x-pascal", + ".p10" => "application/pkcs10", + ".p12" => "application/x-pkcs12", + ".p7b" => "application/x-pkcs7-certificates", + ".p7m" => "application/pkcs7-mime", + ".p7r" => "application/x-pkcs7-certreqresp", + ".p7s" => "application/pkcs7-signature", + ".pas" => "text/x-pascal", + ".pbd" => "application/vnd.powerbuilder6", + ".pbm" => "image/x-portable-bitmap", + ".pcl" => "application/vnd.hp-pcl", + ".pclxl" => "application/vnd.hp-pclxl", + ".pcx" => "image/x-pcx", + ".pdb" => "chemical/x-pdb", + ".pdf" => "application/pdf", + ".pem" => "application/x-x509-ca-cert", + ".pfr" => "application/font-tdpfr", + ".pgm" => "image/x-portable-graymap", + ".pgn" => "application/x-chess-pgn", + ".pgp" => "application/pgp-encrypted", + ".pic" => "image/x-pict", + ".pict" => "image/pict", + ".pkg" => "application/octet-stream", + ".pki" => "application/pkixcmp", + ".pkipath" => "application/pkix-pkipath", + ".pl" => "text/x-script.perl", + ".plb" => "application/vnd.3gpp.pic-bw-large", + ".plc" => "application/vnd.mobius.plc", + ".plf" => "application/vnd.pocketlearn", + ".pls" => "application/pls+xml", + ".pm" => "text/x-script.perl-module", + ".pml" => "application/vnd.ctc-posml", + ".png" => "image/png", + ".pnm" => "image/x-portable-anymap", + ".pntg" => "image/x-macpaint", + ".portpkg" => "application/vnd.macports.portpkg", + ".pot" => "application/vnd.ms-powerpoint", + ".potm" => "application/vnd.ms-powerpoint.template.macroEnabled.12", + ".potx" => "application/vnd.openxmlformats-officedocument.presentationml.template", + ".ppa" => "application/vnd.ms-powerpoint", + ".ppam" => "application/vnd.ms-powerpoint.addin.macroEnabled.12", + ".ppd" => "application/vnd.cups-ppd", + ".ppm" => "image/x-portable-pixmap", + ".pps" => "application/vnd.ms-powerpoint", + ".ppsm" => "application/vnd.ms-powerpoint.slideshow.macroEnabled.12", + ".ppsx" => "application/vnd.openxmlformats-officedocument.presentationml.slideshow", + ".ppt" => "application/vnd.ms-powerpoint", + ".pptm" => "application/vnd.ms-powerpoint.presentation.macroEnabled.12", + ".pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation", + ".prc" => "application/vnd.palm", + ".pre" => "application/vnd.lotus-freelance", + ".prf" => "application/pics-rules", + ".ps" => "application/postscript", + ".psb" => "application/vnd.3gpp.pic-bw-small", + ".psd" => "image/vnd.adobe.photoshop", + ".ptid" => "application/vnd.pvi.ptid1", + ".pub" => "application/x-mspublisher", + ".pvb" => "application/vnd.3gpp.pic-bw-var", + ".pwn" => "application/vnd.3m.post-it-notes", + ".py" => "text/x-script.python", + ".pya" => "audio/vnd.ms-playready.media.pya", + ".pyv" => "video/vnd.ms-playready.media.pyv", + ".qam" => "application/vnd.epson.quickanime", + ".qbo" => "application/vnd.intu.qbo", + ".qfx" => "application/vnd.intu.qfx", + ".qps" => "application/vnd.publishare-delta-tree", + ".qt" => "video/quicktime", + ".qtif" => "image/x-quicktime", + ".qxd" => "application/vnd.quark.quarkxpress", + ".ra" => "audio/x-pn-realaudio", + ".rake" => "text/x-script.ruby", + ".ram" => "audio/x-pn-realaudio", + ".rar" => "application/x-rar-compressed", + ".ras" => "image/x-cmu-raster", + ".rb" => "text/x-script.ruby", + ".rcprofile" => "application/vnd.ipunplugged.rcprofile", + ".rdf" => "application/rdf+xml", + ".rdz" => "application/vnd.data-vision.rdz", + ".rep" => "application/vnd.businessobjects", + ".rgb" => "image/x-rgb", + ".rif" => "application/reginfo+xml", + ".rl" => "application/resource-lists+xml", + ".rlc" => "image/vnd.fujixerox.edmics-rlc", + ".rld" => "application/resource-lists-diff+xml", + ".rm" => "application/vnd.rn-realmedia", + ".rmp" => "audio/x-pn-realaudio-plugin", + ".rms" => "application/vnd.jcp.javame.midlet-rms", + ".rnc" => "application/relax-ng-compact-syntax", + ".roff" => "text/troff", + ".rpm" => "application/x-redhat-package-manager", + ".rpss" => "application/vnd.nokia.radio-presets", + ".rpst" => "application/vnd.nokia.radio-preset", + ".rq" => "application/sparql-query", + ".rs" => "application/rls-services+xml", + ".rsd" => "application/rsd+xml", + ".rss" => "application/rss+xml", + ".rtf" => "application/rtf", + ".rtx" => "text/richtext", + ".ru" => "text/x-script.ruby", + ".s" => "text/x-asm", + ".saf" => "application/vnd.yamaha.smaf-audio", + ".sbml" => "application/sbml+xml", + ".sc" => "application/vnd.ibm.secure-container", + ".scd" => "application/x-msschedule", + ".scm" => "application/vnd.lotus-screencam", + ".scq" => "application/scvp-cv-request", + ".scs" => "application/scvp-cv-response", + ".sdkm" => "application/vnd.solent.sdkm+xml", + ".sdp" => "application/sdp", + ".see" => "application/vnd.seemail", + ".sema" => "application/vnd.sema", + ".semd" => "application/vnd.semd", + ".semf" => "application/vnd.semf", + ".setpay" => "application/set-payment-initiation", + ".setreg" => "application/set-registration-initiation", + ".sfd" => "application/vnd.hydrostatix.sof-data", + ".sfs" => "application/vnd.spotfire.sfs", + ".sgm" => "text/sgml", + ".sgml" => "text/sgml", + ".sh" => "application/x-sh", + ".shar" => "application/x-shar", + ".shf" => "application/shf+xml", + ".sig" => "application/pgp-signature", + ".sit" => "application/x-stuffit", + ".sitx" => "application/x-stuffitx", + ".skp" => "application/vnd.koan", + ".slt" => "application/vnd.epson.salt", + ".smi" => "application/smil+xml", + ".snd" => "audio/basic", + ".so" => "application/octet-stream", + ".spf" => "application/vnd.yamaha.smaf-phrase", + ".spl" => "application/x-futuresplash", + ".spot" => "text/vnd.in3d.spot", + ".spp" => "application/scvp-vp-response", + ".spq" => "application/scvp-vp-request", + ".src" => "application/x-wais-source", + ".srt" => "text/srt", + ".srx" => "application/sparql-results+xml", + ".sse" => "application/vnd.kodak-descriptor", + ".ssf" => "application/vnd.epson.ssf", + ".ssml" => "application/ssml+xml", + ".stf" => "application/vnd.wt.stf", + ".stk" => "application/hyperstudio", + ".str" => "application/vnd.pg.format", + ".sus" => "application/vnd.sus-calendar", + ".sv4cpio" => "application/x-sv4cpio", + ".sv4crc" => "application/x-sv4crc", + ".svd" => "application/vnd.svd", + ".svg" => "image/svg+xml", + ".svgz" => "image/svg+xml", + ".swf" => "application/x-shockwave-flash", + ".swi" => "application/vnd.arastra.swi", + ".t" => "text/troff", + ".tao" => "application/vnd.tao.intent-module-archive", + ".tar" => "application/x-tar", + ".tbz" => "application/x-bzip-compressed-tar", + ".tcap" => "application/vnd.3gpp2.tcap", + ".tcl" => "application/x-tcl", + ".tex" => "application/x-tex", + ".texi" => "application/x-texinfo", + ".texinfo" => "application/x-texinfo", + ".text" => "text/plain", + ".tif" => "image/tiff", + ".tiff" => "image/tiff", + ".tmo" => "application/vnd.tmobile-livetv", + ".torrent" => "application/x-bittorrent", + ".tpl" => "application/vnd.groove-tool-template", + ".tpt" => "application/vnd.trid.tpt", + ".tr" => "text/troff", + ".tra" => "application/vnd.trueapp", + ".trm" => "application/x-msterminal", + ".ts" => "video/mp2t", + ".tsv" => "text/tab-separated-values", + ".ttf" => "font/ttf", + ".twd" => "application/vnd.simtech-mindmapper", + ".txd" => "application/vnd.genomatix.tuxedo", + ".txf" => "application/vnd.mobius.txf", + ".txt" => "text/plain", + ".ufd" => "application/vnd.ufdl", + ".umj" => "application/vnd.umajin", + ".unityweb" => "application/vnd.unity", + ".uoml" => "application/vnd.uoml+xml", + ".uri" => "text/uri-list", + ".ustar" => "application/x-ustar", + ".utz" => "application/vnd.uiq.theme", + ".uu" => "text/x-uuencode", + ".vcd" => "application/x-cdlink", + ".vcf" => "text/x-vcard", + ".vcg" => "application/vnd.groove-vcard", + ".vcs" => "text/x-vcalendar", + ".vcx" => "application/vnd.vcx", + ".vis" => "application/vnd.visionary", + ".viv" => "video/vnd.vivo", + ".vrml" => "model/vrml", + ".vsd" => "application/vnd.visio", + ".vsf" => "application/vnd.vsf", + ".vtt" => "text/vtt", + ".vtu" => "model/vnd.vtu", + ".vxml" => "application/voicexml+xml", + ".war" => "application/java-archive", + ".wasm" => "application/wasm", + ".wav" => "audio/x-wav", + ".wax" => "audio/x-ms-wax", + ".wbmp" => "image/vnd.wap.wbmp", + ".wbs" => "application/vnd.criticaltools.wbs+xml", + ".wbxml" => "application/vnd.wap.wbxml", + ".webm" => "video/webm", + ".webp" => "image/webp", + ".wm" => "video/x-ms-wm", + ".wma" => "audio/x-ms-wma", + ".wmd" => "application/x-ms-wmd", + ".wmf" => "application/x-msmetafile", + ".wml" => "text/vnd.wap.wml", + ".wmlc" => "application/vnd.wap.wmlc", + ".wmls" => "text/vnd.wap.wmlscript", + ".wmlsc" => "application/vnd.wap.wmlscriptc", + ".wmv" => "video/x-ms-wmv", + ".wmx" => "video/x-ms-wmx", + ".wmz" => "application/x-ms-wmz", + ".woff" => "font/woff", + ".woff2" => "font/woff2", + ".wpd" => "application/vnd.wordperfect", + ".wpl" => "application/vnd.ms-wpl", + ".wps" => "application/vnd.ms-works", + ".wqd" => "application/vnd.wqd", + ".wri" => "application/x-mswrite", + ".wrl" => "model/vrml", + ".wsdl" => "application/wsdl+xml", + ".wspolicy" => "application/wspolicy+xml", + ".wtb" => "application/vnd.webturbo", + ".wvx" => "video/x-ms-wvx", + ".x3d" => "application/vnd.hzn-3d-crossword", + ".xar" => "application/vnd.xara", + ".xbd" => "application/vnd.fujixerox.docuworks.binder", + ".xbm" => "image/x-xbitmap", + ".xdm" => "application/vnd.syncml.dm+xml", + ".xdp" => "application/vnd.adobe.xdp+xml", + ".xdw" => "application/vnd.fujixerox.docuworks", + ".xenc" => "application/xenc+xml", + ".xer" => "application/patch-ops-error+xml", + ".xfdf" => "application/vnd.adobe.xfdf", + ".xfdl" => "application/vnd.xfdl", + ".xhtml" => "application/xhtml+xml", + ".xif" => "image/vnd.xiff", + ".xla" => "application/vnd.ms-excel", + ".xlam" => "application/vnd.ms-excel.addin.macroEnabled.12", + ".xls" => "application/vnd.ms-excel", + ".xlsb" => "application/vnd.ms-excel.sheet.binary.macroEnabled.12", + ".xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + ".xlsm" => "application/vnd.ms-excel.sheet.macroEnabled.12", + ".xlt" => "application/vnd.ms-excel", + ".xltx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.template", + ".xml" => "application/xml", + ".xo" => "application/vnd.olpc-sugar", + ".xop" => "application/xop+xml", + ".xpm" => "image/x-xpixmap", + ".xpr" => "application/vnd.is-xpr", + ".xps" => "application/vnd.ms-xpsdocument", + ".xpw" => "application/vnd.intercon.formnet", + ".xsl" => "application/xml", + ".xslt" => "application/xslt+xml", + ".xsm" => "application/vnd.syncml+xml", + ".xspf" => "application/xspf+xml", + ".xul" => "application/vnd.mozilla.xul+xml", + ".xwd" => "image/x-xwindowdump", + ".xyz" => "chemical/x-xyz", + ".yaml" => "text/yaml", + ".yml" => "text/yaml", + ".zaz" => "application/vnd.zzazz.deck+xml", + ".zip" => "application/zip", + ".zmm" => "application/vnd.handheld-entertainment+xml", + } + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock.rb new file mode 100644 index 0000000..5e5c457 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require_relative 'mock_request' diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock_request.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock_request.rb new file mode 100644 index 0000000..7c87bea --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock_request.rb @@ -0,0 +1,161 @@ +# frozen_string_literal: true + +require 'uri' +require 'stringio' + +require_relative 'constants' +require_relative 'mock_response' + +module Rack + # Rack::MockRequest helps testing your Rack application without + # actually using HTTP. + # + # After performing a request on a URL with get/post/put/patch/delete, it + # returns a MockResponse with useful helper methods for effective + # testing. + # + # You can pass a hash with additional configuration to the + # get/post/put/patch/delete. + # :input:: A String or IO-like to be used as rack.input. + # :fatal:: Raise a FatalWarning if the app writes to rack.errors. + # :lint:: If true, wrap the application in a Rack::Lint. + + class MockRequest + class FatalWarning < RuntimeError + end + + class FatalWarner + def puts(warning) + raise FatalWarning, warning + end + + def write(warning) + raise FatalWarning, warning + end + + def flush + end + + def string + "" + end + end + + def initialize(app) + @app = app + end + + # Make a GET request and return a MockResponse. See #request. + def get(uri, opts = {}) request(GET, uri, opts) end + # Make a POST request and return a MockResponse. See #request. + def post(uri, opts = {}) request(POST, uri, opts) end + # Make a PUT request and return a MockResponse. See #request. + def put(uri, opts = {}) request(PUT, uri, opts) end + # Make a PATCH request and return a MockResponse. See #request. + def patch(uri, opts = {}) request(PATCH, uri, opts) end + # Make a DELETE request and return a MockResponse. See #request. + def delete(uri, opts = {}) request(DELETE, uri, opts) end + # Make a HEAD request and return a MockResponse. See #request. + def head(uri, opts = {}) request(HEAD, uri, opts) end + # Make an OPTIONS request and return a MockResponse. See #request. + def options(uri, opts = {}) request(OPTIONS, uri, opts) end + + # Make a request using the given request method for the given + # uri to the rack application and return a MockResponse. + # Options given are passed to MockRequest.env_for. + def request(method = GET, uri = "", opts = {}) + env = self.class.env_for(uri, opts.merge(method: method)) + + if opts[:lint] + app = Rack::Lint.new(@app) + else + app = @app + end + + errors = env[RACK_ERRORS] + status, headers, body = app.call(env) + MockResponse.new(status, headers, body, errors) + ensure + body.close if body.respond_to?(:close) + end + + # For historical reasons, we're pinning to RFC 2396. + # URI::Parser = URI::RFC2396_Parser + def self.parse_uri_rfc2396(uri) + @parser ||= URI::Parser.new + @parser.parse(uri) + end + + # Return the Rack environment used for a request to +uri+. + # All options that are strings are added to the returned environment. + # Options: + # :fatal :: Whether to raise an exception if request outputs to rack.errors + # :input :: The rack.input to set + # :http_version :: The SERVER_PROTOCOL to set + # :method :: The HTTP request method to use + # :params :: The params to use + # :script_name :: The SCRIPT_NAME to set + def self.env_for(uri = "", opts = {}) + uri = parse_uri_rfc2396(uri) + uri.path = "/#{uri.path}" unless uri.path[0] == ?/ + + env = {} + + env[REQUEST_METHOD] = (opts[:method] ? opts[:method].to_s.upcase : GET).b + env[SERVER_NAME] = (uri.host || "example.org").b + env[SERVER_PORT] = (uri.port ? uri.port.to_s : "80").b + env[SERVER_PROTOCOL] = opts[:http_version] || 'HTTP/1.1' + env[QUERY_STRING] = (uri.query.to_s).b + env[PATH_INFO] = (uri.path).b + env[RACK_URL_SCHEME] = (uri.scheme || "http").b + env[HTTPS] = (env[RACK_URL_SCHEME] == "https" ? "on" : "off").b + + env[SCRIPT_NAME] = opts[:script_name] || "" + + if opts[:fatal] + env[RACK_ERRORS] = FatalWarner.new + else + env[RACK_ERRORS] = StringIO.new + end + + if params = opts[:params] + if env[REQUEST_METHOD] == GET + params = Utils.parse_nested_query(params) if params.is_a?(String) + params.update(Utils.parse_nested_query(env[QUERY_STRING])) + env[QUERY_STRING] = Utils.build_nested_query(params) + elsif !opts.has_key?(:input) + opts["CONTENT_TYPE"] = "application/x-www-form-urlencoded" + if params.is_a?(Hash) + if data = Rack::Multipart.build_multipart(params) + opts[:input] = data + opts["CONTENT_LENGTH"] ||= data.length.to_s + opts["CONTENT_TYPE"] = "multipart/form-data; boundary=#{Rack::Multipart::MULTIPART_BOUNDARY}" + else + opts[:input] = Utils.build_nested_query(params) + end + else + opts[:input] = params + end + end + end + + rack_input = opts[:input] + if String === rack_input + rack_input = StringIO.new(rack_input) + end + + if rack_input + rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding) + env[RACK_INPUT] = rack_input + + env["CONTENT_LENGTH"] ||= env[RACK_INPUT].size.to_s if env[RACK_INPUT].respond_to?(:size) + end + + opts.each { |field, value| + env[field] = value if String === field + } + + env + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock_response.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock_response.rb new file mode 100644 index 0000000..7360ade --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock_response.rb @@ -0,0 +1,147 @@ +# frozen_string_literal: true + +require 'time' + +require_relative 'response' + +module Rack + # Rack::MockResponse provides useful helpers for testing your apps. + # Usually, you don't create the MockResponse on your own, but use + # MockRequest. + + class MockResponse < Rack::Response + class Cookie + attr_reader :name, :value, :path, :domain, :expires, :secure + + def initialize(args) + @name = args["name"] + @value = args["value"] + @path = args["path"] + @domain = args["domain"] + @expires = args["expires"] + @secure = args["secure"] + end + + def method_missing(method_name, *args, &block) + @value.send(method_name, *args, &block) + end + # :nocov: + ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true) + # :nocov: + + def respond_to_missing?(method_name, include_all = false) + @value.respond_to?(method_name, include_all) || super + end + end + + class << self + alias [] new + end + + # Headers + attr_reader :original_headers, :cookies + + # Errors + attr_accessor :errors + + def initialize(status, headers, body, errors = nil) + @original_headers = headers + + if errors + @errors = errors.string if errors.respond_to?(:string) + else + @errors = "" + end + + super(body, status, headers) + + @cookies = parse_cookies_from_header + buffered_body! + end + + def =~(other) + body =~ other + end + + def match(other) + body.match other + end + + def body + return @buffered_body if defined?(@buffered_body) + + # FIXME: apparently users of MockResponse expect the return value of + # MockResponse#body to be a string. However, the real response object + # returns the body as a list. + # + # See spec_showstatus.rb: + # + # should "not replace existing messages" do + # ... + # res.body.should == "foo!" + # end + buffer = @buffered_body = String.new + + @body.each do |chunk| + buffer << chunk + end + + return buffer + end + + def empty? + [201, 204, 304].include? status + end + + def cookie(name) + cookies.fetch(name, nil) + end + + private + + def parse_cookies_from_header + cookies = Hash.new + set_cookie_header = headers['set-cookie'] + if set_cookie_header && !set_cookie_header.empty? + Array(set_cookie_header).each do |cookie| + cookie_name, cookie_filling = cookie.split('=', 2) + cookie_attributes = identify_cookie_attributes cookie_filling + parsed_cookie = Cookie.new( + 'name' => cookie_name.strip, + 'value' => cookie_attributes.fetch('https://github.com/value'), + 'path' => cookie_attributes.fetch('https://github.com/path', nil), + 'domain' => cookie_attributes.fetch('https://github.com/domain', nil), + 'expires' => cookie_attributes.fetch('https://github.com/expires', nil), + 'secure' => cookie_attributes.fetch('https://github.com/secure', false) + ) + cookies.store(cookie_name, parsed_cookie) + end + end + cookies + end + + def identify_cookie_attributes(cookie_filling) + cookie_bits = cookie_filling.split(';') + cookie_attributes = Hash.new + cookie_attributes.store('value', Array(cookie_bits[0].strip)) + cookie_bits.drop(1).each do |bit| + if bit.include? '=' + cookie_attribute, attribute_value = bit.split('=', 2) + cookie_attributes.store(cookie_attribute.strip.downcase, attribute_value.strip) + end + if bit.include? 'secure' + cookie_attributes.store('secure', true) + end + end + + if cookie_attributes.key? 'max-age' + cookie_attributes.store('expires', Time.now + cookie_attributes['max-age'].to_i) + elsif cookie_attributes.key? 'expires' + cookie_attributes.store('expires', Time.httpdate(cookie_attributes['expires'])) + end + + cookie_attributes + end + + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart.rb new file mode 100644 index 0000000..4b02fb3 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +require_relative 'constants' +require_relative 'utils' + +require_relative 'multipart/parser' +require_relative 'multipart/generator' + +require_relative 'bad_request' + +module Rack + # A multipart form data parser, adapted from IOWA. + # + # Usually, Rack::Request#POST takes care of calling this. + module Multipart + MULTIPART_BOUNDARY = "AaB03x" + + class MissingInputError < StandardError + include BadRequest + end + + # Accumulator for multipart form data, conforming to the QueryParser API. + # In future, the Parser could return the pair list directly, but that would + # change its API. + class ParamList # :nodoc: + def self.make_params + new + end + + def self.normalize_params(params, key, value) + params << [key, value] + end + + def initialize + @pairs = [] + end + + def <<(pair) + @pairs << pair + end + + def to_params_hash + @pairs + end + end + + class << self + def parse_multipart(env, params = Rack::Utils.default_query_parser) + unless io = env[RACK_INPUT] + raise MissingInputError, "Missing input stream!" + end + + if content_length = env['CONTENT_LENGTH'] + content_length = content_length.to_i + end + + content_type = env['CONTENT_TYPE'] + + tempfile = env[RACK_MULTIPART_TEMPFILE_FACTORY] || Parser::TEMPFILE_FACTORY + bufsize = env[RACK_MULTIPART_BUFFER_SIZE] || Parser::BUFSIZE + + info = Parser.parse(io, content_length, content_type, tempfile, bufsize, params) + env[RACK_TEMPFILES] = info.tmp_files + + return info.params + end + + def extract_multipart(request, params = Rack::Utils.default_query_parser) + parse_multipart(request.env) + end + + def build_multipart(params, first = true) + Generator.new(params, first).dump + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/generator.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/generator.rb new file mode 100644 index 0000000..30d7f51 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/generator.rb @@ -0,0 +1,99 @@ +# frozen_string_literal: true + +require_relative 'uploaded_file' + +module Rack + module Multipart + class Generator + def initialize(params, first = true) + @params, @first = params, first + + if @first && !@params.is_a?(Hash) + raise ArgumentError, "value must be a Hash" + end + end + + def dump + return nil if @first && !multipart? + return flattened_params unless @first + + flattened_params.map do |name, file| + if file.respond_to?(:original_filename) + if file.path + ::File.open(file.path, 'rb') do |f| + f.set_encoding(Encoding::BINARY) + content_for_tempfile(f, file, name) + end + else + content_for_tempfile(file, file, name) + end + else + content_for_other(file, name) + end + end.join << "--#{MULTIPART_BOUNDARY}--\r" + end + + private + def multipart? + query = lambda { |value| + case value + when Array + value.any?(&query) + when Hash + value.values.any?(&query) + when Rack::Multipart::UploadedFile + true + end + } + + @params.values.any?(&query) + end + + def flattened_params + @flattened_params ||= begin + h = Hash.new + @params.each do |key, value| + k = @first ? key.to_s : "[#{key}]" + + case value + when Array + value.map { |v| + Multipart.build_multipart(v, false).each { |subkey, subvalue| + h["#{k}[]#{subkey}"] = subvalue + } + } + when Hash + Multipart.build_multipart(value, false).each { |subkey, subvalue| + h[k + subkey] = subvalue + } + else + h[k] = value + end + end + h + end + end + + def content_for_tempfile(io, file, name) + length = ::File.stat(file.path).size if file.path + filename = "; filename=\"#{Utils.escape_path(file.original_filename)}\"" +<<-EOF +--#{MULTIPART_BOUNDARY}\r +content-disposition: form-data; name="#{name}"#{filename}\r +content-type: #{file.content_type}\r +#{"content-length: #{length}\r\n" if length}\r +#{io.read}\r +EOF + end + + def content_for_other(file, name) +<<-EOF +--#{MULTIPART_BOUNDARY}\r +content-disposition: form-data; name="#{name}"\r +\r +#{file}\r +EOF + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/parser.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/parser.rb new file mode 100644 index 0000000..3817950 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/parser.rb @@ -0,0 +1,530 @@ +# frozen_string_literal: true + +require 'strscan' + +require_relative '../utils' +require_relative '../bad_request' + +module Rack + module Multipart + class MultipartPartLimitError < Errno::EMFILE + include BadRequest + end + + class MultipartTotalPartLimitError < StandardError + include BadRequest + end + + # Use specific error class when parsing multipart request + # that ends early. + class EmptyContentError < ::EOFError + include BadRequest + end + + # Base class for multipart exceptions that do not subclass from + # other exception classes for backwards compatibility. + class BoundaryTooLongError < StandardError + include BadRequest + end + + # Prefer to use the BoundaryTooLongError class or Rack::BadRequest. + Error = BoundaryTooLongError + + EOL = "\r\n" + FWS = /[ \t]+(?:\r\n[ \t]+)?/ # whitespace with optional folding + HEADER_VALUE = "(?:[^\r\n]|\r\n[ \t])*" # anything but a non-folding CRLF + MULTIPART = %r|\Amultipart/.*boundary=\"?([^\";,]+)\"?|ni + MULTIPART_CONTENT_TYPE = /^Content-Type:#{FWS}?(#{HEADER_VALUE})/ni + MULTIPART_CONTENT_DISPOSITION = /^Content-Disposition:#{FWS}?(#{HEADER_VALUE})/ni + MULTIPART_CONTENT_ID = /^Content-ID:#{FWS}?(#{HEADER_VALUE})/ni + + # Rack::Multipart::Parser handles parsing of multipart/form-data requests. + # + # File Parameter Contents + # + # When processing file uploads, the parser returns a hash containing + # information about uploaded files. For +file+ parameters, the hash includes: + # + # * +:filename+ - The original filename, already URL decoded by the parser + # * +:type+ - The content type of the uploaded file + # * +:name+ - The parameter name from the form + # * +:tempfile+ - A Tempfile object containing the uploaded data + # * +:head+ - The raw header content for this part + class Parser + BUFSIZE = 1_048_576 + TEXT_PLAIN = "text/plain" + TEMPFILE_FACTORY = lambda { |filename, content_type| + extension = ::File.extname(filename.gsub("\0", '%00'))[0, 129] + + Tempfile.new(["RackMultipart", extension]) + } + + class BoundedIO # :nodoc: + def initialize(io, content_length) + @io = io + @content_length = content_length + @cursor = 0 + end + + def read(size, outbuf = nil) + return if @cursor >= @content_length + + left = @content_length - @cursor + + str = if left < size + @io.read left, outbuf + else + @io.read size, outbuf + end + + if str + @cursor += str.bytesize + else + # Raise an error for mismatching content-length and actual contents + raise EOFError, "bad content body" + end + + str + end + end + + MultipartInfo = Struct.new :params, :tmp_files + EMPTY = MultipartInfo.new(nil, []) + + def self.parse_boundary(content_type) + return unless content_type + data = content_type.match(MULTIPART) + return unless data + data[1] + end + + def self.parse(io, content_length, content_type, tmpfile, bufsize, qp) + return EMPTY if 0 == content_length + + boundary = parse_boundary content_type + return EMPTY unless boundary + + if boundary.length > 70 + # RFC 1521 Section 7.2.1 imposes a 70 character maximum for the boundary. + # Most clients use no more than 55 characters. + raise BoundaryTooLongError, "multipart boundary size too large (#{boundary.length} characters)" + end + + io = BoundedIO.new(io, content_length) if content_length + + parser = new(boundary, tmpfile, bufsize, qp) + parser.parse(io) + + parser.result + end + + class Collector + class MimePart < Struct.new(:body, :head, :filename, :content_type, :name) + def get_data + data = body + if filename == "" + # filename is blank which means no file has been selected + return + elsif filename + body.rewind if body.respond_to?(:rewind) + + # Take the basename of the upload's original filename. + # This handles the full Windows paths given by Internet Explorer + # (and perhaps other broken user agents) without affecting + # those which give the lone filename. + fn = filename.split(/[\/\\]/).last + + data = { filename: fn, type: content_type, + name: name, tempfile: body, head: head } + end + + yield data + end + end + + class BufferPart < MimePart + def file?; false; end + def close; end + end + + class TempfilePart < MimePart + def file?; true; end + def close; body.close; end + end + + include Enumerable + + def initialize(tempfile) + @tempfile = tempfile + @mime_parts = [] + @open_files = 0 + end + + def each + @mime_parts.each { |part| yield part } + end + + def on_mime_head(mime_index, head, filename, content_type, name) + if filename + body = @tempfile.call(filename, content_type) + body.binmode if body.respond_to?(:binmode) + klass = TempfilePart + @open_files += 1 + else + body = String.new + klass = BufferPart + end + + @mime_parts[mime_index] = klass.new(body, head, filename, content_type, name) + + check_part_limits + end + + def on_mime_body(mime_index, content) + @mime_parts[mime_index].body << content + end + + def on_mime_finish(mime_index) + end + + private + + def check_part_limits + file_limit = Utils.multipart_file_limit + part_limit = Utils.multipart_total_part_limit + + if file_limit && file_limit > 0 + if @open_files >= file_limit + @mime_parts.each(&:close) + raise MultipartPartLimitError, 'Maximum file multiparts in content reached' + end + end + + if part_limit && part_limit > 0 + if @mime_parts.size >= part_limit + @mime_parts.each(&:close) + raise MultipartTotalPartLimitError, 'Maximum total multiparts in content reached' + end + end + end + end + + attr_reader :state + + def initialize(boundary, tempfile, bufsize, query_parser) + @query_parser = query_parser + @params = query_parser.make_params + @bufsize = bufsize + + @state = :FAST_FORWARD + @mime_index = 0 + @collector = Collector.new tempfile + + @sbuf = StringScanner.new("".dup) + @body_regex = /(?:#{EOL}|\A)--#{Regexp.quote(boundary)}(?:#{EOL}|--)/m + @body_regex_at_end = /#{@body_regex}\z/m + @end_boundary_size = boundary.bytesize + 4 # (-- at start, -- at finish) + @rx_max_size = boundary.bytesize + 6 # (\r\n-- at start, either \r\n or -- at finish) + @head_regex = /(.*?#{EOL})#{EOL}/m + end + + def parse(io) + outbuf = String.new + read_data(io, outbuf) + + loop do + status = + case @state + when :FAST_FORWARD + handle_fast_forward + when :CONSUME_TOKEN + handle_consume_token + when :MIME_HEAD + handle_mime_head + when :MIME_BODY + handle_mime_body + else # when :DONE + return + end + + read_data(io, outbuf) if status == :want_read + end + end + + def result + @collector.each do |part| + part.get_data do |data| + tag_multipart_encoding(part.filename, part.content_type, part.name, data) + name, data = handle_dummy_encoding(part.name, data) + @query_parser.normalize_params(@params, name, data) + end + end + MultipartInfo.new @params.to_params_hash, @collector.find_all(&:file?).map(&:body) + end + + private + + def read_data(io, outbuf) + content = io.read(@bufsize, outbuf) + handle_empty_content!(content) + @sbuf.concat(content) + end + + # This handles the initial parser state. We read until we find the starting + # boundary, then we can transition to the next state. If we find the ending + # boundary, this is an invalid multipart upload, but keep scanning for opening + # boundary in that case. If no boundary found, we need to keep reading data + # and retry. It's highly unlikely the initial read will not consume the + # boundary. The client would have to deliberately craft a response + # with the opening boundary beyond the buffer size for that to happen. + def handle_fast_forward + while true + case consume_boundary + when :BOUNDARY + # found opening boundary, transition to next state + @state = :MIME_HEAD + return + when :END_BOUNDARY + # invalid multipart upload + if @sbuf.pos == @end_boundary_size && @sbuf.rest == EOL + # stop parsing a buffer if a buffer is only an end boundary. + @state = :DONE + return + end + + # retry for opening boundary + else + # no boundary found, keep reading data + return :want_read + end + end + end + + def handle_consume_token + tok = consume_boundary + # break if we're at the end of a buffer, but not if it is the end of a field + @state = if tok == :END_BOUNDARY || (@sbuf.eos? && tok != :BOUNDARY) + :DONE + else + :MIME_HEAD + end + end + + CONTENT_DISPOSITION_MAX_PARAMS = 16 + CONTENT_DISPOSITION_MAX_BYTES = 1536 + def handle_mime_head + if @sbuf.scan_until(@head_regex) + head = @sbuf[1] + content_type = head[MULTIPART_CONTENT_TYPE, 1] + if (disposition = head[MULTIPART_CONTENT_DISPOSITION, 1]) && + disposition.bytesize <= CONTENT_DISPOSITION_MAX_BYTES + + # ignore actual content-disposition value (should always be form-data) + i = disposition.index(';') + disposition.slice!(0, i+1) + param = nil + num_params = 0 + + # Parse parameter list + while i = disposition.index('=') + # Only parse up to max parameters, to avoid potential denial of service + num_params += 1 + break if num_params > CONTENT_DISPOSITION_MAX_PARAMS + + # Found end of parameter name, ensure forward progress in loop + param = disposition.slice!(0, i+1) + + # Remove ending equals and preceding whitespace from parameter name + param.chomp!('=') + param.lstrip! + + if disposition[0] == '"' + # Parameter value is quoted, parse it, handling backslash escapes + disposition.slice!(0, 1) + value = String.new + + while i = disposition.index(/(["\\])/) + c = $1 + + # Append all content until ending quote or escape + value << disposition.slice!(0, i) + + # Remove either backslash or ending quote, + # ensures forward progress in loop + disposition.slice!(0, 1) + + # stop parsing parameter value if found ending quote + break if c == '"' + + escaped_char = disposition.slice!(0, 1) + if param == 'filename' && escaped_char != '"' + # Possible IE uploaded filename, append both escape backslash and value + value << c << escaped_char + else + # Other only append escaped value + value << escaped_char + end + end + else + if i = disposition.index(';') + # Parameter value unquoted (which may be invalid), value ends at semicolon + value = disposition.slice!(0, i) + else + # If no ending semicolon, assume remainder of line is value and stop + # parsing + disposition.strip! + value = disposition + disposition = '' + end + end + + case param + when 'name' + name = value + when 'filename' + filename = value + when 'filename*' + filename_star = value + # else + # ignore other parameters + end + + # skip trailing semicolon, to proceed to next parameter + if i = disposition.index(';') + disposition.slice!(0, i+1) + end + end + else + name = head[MULTIPART_CONTENT_ID, 1] + end + + if filename_star + encoding, _, filename = filename_star.split("'", 3) + filename = normalize_filename(filename || '') + filename.force_encoding(find_encoding(encoding)) + elsif filename + filename = normalize_filename(filename) + end + + if name.nil? || name.empty? + name = filename || "#{content_type || TEXT_PLAIN}[]".dup + end + + @collector.on_mime_head @mime_index, head, filename, content_type, name + @state = :MIME_BODY + else + :want_read + end + end + + def handle_mime_body + if (body_with_boundary = @sbuf.check_until(@body_regex)) # check but do not advance the pointer yet + body = body_with_boundary.sub(@body_regex_at_end, '') # remove the boundary from the string + @collector.on_mime_body @mime_index, body + @sbuf.pos += body.length + 2 # skip \r\n after the content + @state = :CONSUME_TOKEN + @mime_index += 1 + else + # Save what we have so far + if @rx_max_size < @sbuf.rest_size + delta = @sbuf.rest_size - @rx_max_size + @collector.on_mime_body @mime_index, @sbuf.peek(delta) + @sbuf.pos += delta + @sbuf.string = @sbuf.rest + end + :want_read + end + end + + # Scan until the we find the start or end of the boundary. + # If we find it, return the appropriate symbol for the start or + # end of the boundary. If we don't find the start or end of the + # boundary, clear the buffer and return nil. + def consume_boundary + if read_buffer = @sbuf.scan_until(@body_regex) + read_buffer.end_with?(EOL) ? :BOUNDARY : :END_BOUNDARY + else + @sbuf.terminate + nil + end + end + + def normalize_filename(filename) + if filename.scan(/%.?.?/).all? { |s| /%[0-9a-fA-F]{2}/.match?(s) } + filename = Utils.unescape_path(filename) + end + + filename.scrub! + + filename.split(/[\/\\]/).last || String.new + end + + CHARSET = "charset" + deprecate_constant :CHARSET + + def tag_multipart_encoding(filename, content_type, name, body) + name = name.to_s + encoding = Encoding::UTF_8 + + name.force_encoding(encoding) + + return if filename + + if content_type + list = content_type.split(';') + type_subtype = list.first + type_subtype.strip! + if TEXT_PLAIN == type_subtype + rest = list.drop 1 + rest.each do |param| + k, v = param.split('=', 2) + k.strip! + v.strip! + v = v[1..-2] if v.start_with?('"') && v.end_with?('"') + if k == "charset" + encoding = find_encoding(v) + end + end + end + end + + name.force_encoding(encoding) + body.force_encoding(encoding) + end + + # Return the related Encoding object. However, because + # enc is submitted by the user, it may be invalid, so + # use a binary encoding in that case. + def find_encoding(enc) + Encoding.find enc + rescue ArgumentError + Encoding::BINARY + end + + REENCODE_DUMMY_ENCODINGS = { + # ISO-2022-JP is a legacy but still widely used encoding in Japan + # Here we convert ISO-2022-JP to UTF-8 so that it can be handled. + Encoding::ISO_2022_JP => true + + # Other dummy encodings are rarely used and have not been supported yet. + # Adding support for them will require careful considerations. + } + + def handle_dummy_encoding(name, body) + # A string object with a 'dummy' encoding does not have full functionality and can cause errors. + # So here we covert it to UTF-8 so that it can be handled properly. + if name.encoding.dummy? && REENCODE_DUMMY_ENCODINGS[name.encoding] + name = name.encode(Encoding::UTF_8) + body = body.encode(Encoding::UTF_8) + end + return name, body + end + + def handle_empty_content!(content) + if content.nil? || content.empty? + raise EmptyContentError + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/uploaded_file.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/uploaded_file.rb new file mode 100644 index 0000000..513d8a2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/uploaded_file.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +require 'tempfile' +require 'fileutils' + +module Rack + module Multipart + # Despite the misleading name, UploadedFile is designed for use for + # preparing multipart file upload bodies, generally for use in tests. + # It is not designed for and should not be used for handling uploaded + # files (there is no need for that, since Rack's multipart parser + # already creates Tempfiles for that). Using this with non-trusted + # filenames can create a security vulnerability. + # + # You should only use this class if you plan on passing the instances + # to Rack::MockRequest for use in creating multipart request bodies. + # + # UploadedFile delegates most methods to the tempfile it contains. + class UploadedFile + # The provided name of the file. This generally is the basename of + # path provided during initialization, but it can contain slashes if they + # were present in the filename argument when the instance was created. + attr_reader :original_filename + + # The content type of the instance. + attr_accessor :content_type + + # Create a new UploadedFile. For backwards compatibility, this accepts + # both positional and keyword versions of the same arguments: + # + # filepath/path :: The path to the file + # ct/content_type :: The content_type of the file + # bin/binary :: Whether to set binmode on the file before copying data into it. + # + # If both positional and keyword arguments are present, the keyword arguments + # take precedence. + # + # The following keyword-only arguments are also accepted: + # + # filename :: Override the filename to use for the file. This is so the + # filename for the upload does not need to match the basename of + # the file path. This should not contain slashes, unless you are + # trying to test how an application handles invalid filenames in + # multipart upload bodies. + # io :: Use the given IO-like instance as the tempfile, instead of creating + # a Tempfile instance. This is useful for building multipart file + # upload bodies without a file being present on the filesystem. If you are + # providing this, you should also provide the filename argument. + def initialize(filepath = nil, ct = "text/plain", bin = false, + path: filepath, content_type: ct, binary: bin, filename: nil, io: nil) + if io + @tempfile = io + @original_filename = filename + else + raise "#{path} file does not exist" unless ::File.exist?(path) + @original_filename = filename || ::File.basename(path) + @tempfile = Tempfile.new([@original_filename, ::File.extname(path)], encoding: Encoding::BINARY) + @tempfile.binmode if binary + FileUtils.copy_file(path, @tempfile.path) + end + @content_type = content_type + end + + # The path of the tempfile for the instance, if the tempfile has a path. + # nil if the tempfile does not have a path. + def path + @tempfile.path if @tempfile.respond_to?(:path) + end + alias_method :local_path, :path + + # Return true if the tempfile responds to the method. + def respond_to_missing?(*args) + @tempfile.respond_to?(*args) + end + + # Delegate method missing calls to the tempfile. + def method_missing(method_name, *args, &block) #:nodoc: + @tempfile.__send__(method_name, *args, &block) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/null_logger.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/null_logger.rb new file mode 100644 index 0000000..52fc125 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/null_logger.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require_relative 'constants' + +module Rack + class NullLogger + def initialize(app) + @app = app + end + + def call(env) + env[RACK_LOGGER] = self + @app.call(env) + end + + def info(progname = nil, &block); end + def debug(progname = nil, &block); end + def warn(progname = nil, &block); end + def error(progname = nil, &block); end + def fatal(progname = nil, &block); end + def unknown(progname = nil, &block); end + def info? ; end + def debug? ; end + def warn? ; end + def error? ; end + def fatal? ; end + def debug! ; end + def error! ; end + def fatal! ; end + def info! ; end + def warn! ; end + def level ; end + def progname ; end + def datetime_format ; end + def formatter ; end + def sev_threshold ; end + def level=(level); end + def progname=(progname); end + def datetime_format=(datetime_format); end + def formatter=(formatter); end + def sev_threshold=(sev_threshold); end + def close ; end + def add(severity, message = nil, progname = nil, &block); end + def log(severity, message = nil, progname = nil, &block); end + def <<(msg); end + def reopen(logdev = nil); end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/query_parser.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/query_parser.rb new file mode 100644 index 0000000..28eeaa0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/query_parser.rb @@ -0,0 +1,259 @@ +# frozen_string_literal: true + +require_relative 'bad_request' +require 'uri' + +module Rack + class QueryParser + DEFAULT_SEP = /& */n + COMMON_SEP = { ";" => /; */n, ";," => /[;,] */n, "&" => /& */n } + + # ParameterTypeError is the error that is raised when incoming structural + # parameters (parsed by parse_nested_query) contain conflicting types. + class ParameterTypeError < TypeError + include BadRequest + end + + # InvalidParameterError is the error that is raised when incoming structural + # parameters (parsed by parse_nested_query) contain invalid format or byte + # sequence. + class InvalidParameterError < ArgumentError + include BadRequest + end + + # QueryLimitError is for errors raised when the query provided exceeds one + # of the query parser limits. + class QueryLimitError < RangeError + include BadRequest + end + + # ParamsTooDeepError is the old name for the error that is raised when params + # are recursively nested over the specified limit. Make it the same as + # as QueryLimitError, so that code that rescues ParamsTooDeepError error + # to handle bad query strings also now handles other limits. + ParamsTooDeepError = QueryLimitError + + def self.make_default(param_depth_limit, **options) + new(Params, param_depth_limit, **options) + end + + attr_reader :param_depth_limit + + env_int = lambda do |key, val| + if str_val = ENV[key] + begin + val = Integer(str_val, 10) + rescue ArgumentError + raise ArgumentError, "non-integer value provided for environment variable #{key}" + end + end + + val + end + + BYTESIZE_LIMIT = env_int.call("RACK_QUERY_PARSER_BYTESIZE_LIMIT", 4194304) + private_constant :BYTESIZE_LIMIT + + PARAMS_LIMIT = env_int.call("RACK_QUERY_PARSER_PARAMS_LIMIT", 4096) + private_constant :PARAMS_LIMIT + + def initialize(params_class, param_depth_limit, bytesize_limit: BYTESIZE_LIMIT, params_limit: PARAMS_LIMIT) + @params_class = params_class + @param_depth_limit = param_depth_limit + @bytesize_limit = bytesize_limit + @params_limit = params_limit + end + + # Stolen from Mongrel, with some small modifications: + # Parses a query string by breaking it up at the '&'. You can also use this + # to parse cookies by changing the characters used in the second parameter + # (which defaults to '&'). + def parse_query(qs, separator = nil, &unescaper) + params = make_params + + each_query_pair(qs, separator, unescaper) do |k, v| + if cur = params[k] + if cur.class == Array + params[k] << v + else + params[k] = [cur, v] + end + else + params[k] = v + end + end + + return params.to_h + end + + # Parses a query string by breaking it up at the '&', returning all key-value + # pairs as an array of [key, value] arrays. Unlike parse_query, this preserves + # all duplicate keys rather than collapsing them. + def parse_query_pairs(qs, separator = nil) + pairs = [] + + each_query_pair(qs, separator) do |k, v| + pairs << [k, v] + end + + pairs + end + + # parse_nested_query expands a query string into structural types. Supported + # types are Arrays, Hashes and basic value types. It is possible to supply + # query strings with parameters of conflicting types, in this case a + # ParameterTypeError is raised. Users are encouraged to return a 400 in this + # case. + def parse_nested_query(qs, separator = nil) + params = make_params + + each_query_pair(qs, separator) do |k, v| + _normalize_params(params, k, v, 0) + end + + return params.to_h + end + + # normalize_params recursively expands parameters into structural types. If + # the structural types represented by two different parameter names are in + # conflict, a ParameterTypeError is raised. The depth argument is deprecated + # and should no longer be used, it is kept for backwards compatibility with + # earlier versions of rack. + def normalize_params(params, name, v, _depth=nil) + _normalize_params(params, name, v, 0) + end + + private def _normalize_params(params, name, v, depth) + raise ParamsTooDeepError if depth >= param_depth_limit + + if !name + # nil name, treat same as empty string (required by tests) + k = after = '' + elsif depth == 0 + # Start of parsing, don't treat [] or [ at start of string specially + if start = name.index('[', 1) + # Start of parameter nesting, use part before brackets as key + k = name[0, start] + after = name[start, name.length] + else + # Plain parameter with no nesting + k = name + after = '' + end + elsif name.start_with?('[]') + # Array nesting + k = '[]' + after = name[2, name.length] + elsif name.start_with?('[') && (start = name.index(']', 1)) + # Hash nesting, use the part inside brackets as the key + k = name[1, start-1] + after = name[start+1, name.length] + else + # Probably malformed input, nested but not starting with [ + # treat full name as key for backwards compatibility. + k = name + after = '' + end + + return if k.empty? + + if after == '' + if k == '[]' && depth != 0 + return [v] + else + params[k] = v + end + elsif after == "[" + params[name] = v + elsif after == "[]" + params[k] ||= [] + raise ParameterTypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array) + params[k] << v + elsif after.start_with?('[]') + # Recognize x[][y] (hash inside array) parameters + unless after[2] == '[' && after.end_with?(']') && (child_key = after[3, after.length-4]) && !child_key.empty? && !child_key.index('[') && !child_key.index(']') + # Handle other nested array parameters + child_key = after[2, after.length] + end + params[k] ||= [] + raise ParameterTypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array) + if params_hash_type?(params[k].last) && !params_hash_has_key?(params[k].last, child_key) + _normalize_params(params[k].last, child_key, v, depth + 1) + else + params[k] << _normalize_params(make_params, child_key, v, depth + 1) + end + else + params[k] ||= make_params + raise ParameterTypeError, "expected Hash (got #{params[k].class.name}) for param `#{k}'" unless params_hash_type?(params[k]) + params[k] = _normalize_params(params[k], after, v, depth + 1) + end + + params + end + + def make_params + @params_class.new + end + + def new_depth_limit(param_depth_limit) + self.class.new @params_class, param_depth_limit + end + + private + + def params_hash_type?(obj) + obj.kind_of?(@params_class) + end + + def params_hash_has_key?(hash, key) + return false if /\[\]/.match?(key) + + key.split(/[\[\]]+/).inject(hash) do |h, part| + next h if part == '' + return false unless params_hash_type?(h) && h.key?(part) + h[part] + end + + true + end + + def each_query_pair(qs, separator, unescaper = nil) + return if !qs || qs.empty? + + if qs.bytesize > @bytesize_limit + raise QueryLimitError, "total query size (#{qs.bytesize}) exceeds limit (#{@bytesize_limit})" + end + + pairs = qs.split(separator ? (COMMON_SEP[separator] || /[#{separator}] */n) : DEFAULT_SEP, @params_limit + 1) + + if pairs.size > @params_limit + param_count = pairs.size + pairs.last.count(separator || "&") + raise QueryLimitError, "total number of query parameters (#{param_count}) exceeds limit (#{@params_limit})" + end + + if unescaper + pairs.each do |p| + next if p.empty? + k, v = p.split('=', 2).map!(&unescaper) + yield k, v + end + else + pairs.each do |p| + next if p.empty? + k, v = p.split('=', 2).map! { |s| unescape(s) } + yield k, v + end + end + rescue ArgumentError => e + raise InvalidParameterError, e.message, e.backtrace + end + + def unescape(string, encoding = Encoding::UTF_8) + URI.decode_www_form_component(string, encoding) + end + + class Params < Hash + alias_method :to_params_hash, :to_h + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/recursive.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/recursive.rb new file mode 100644 index 0000000..0945d32 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/recursive.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +require 'uri' + +require_relative 'constants' + +module Rack + # Rack::ForwardRequest gets caught by Rack::Recursive and redirects + # the current request to the app at +url+. + # + # raise ForwardRequest.new("/not-found") + # + + class ForwardRequest < Exception + attr_reader :url, :env + + def initialize(url, env = {}) + @url = URI(url) + @env = env + + @env[PATH_INFO] = @url.path + @env[QUERY_STRING] = @url.query if @url.query + @env[HTTP_HOST] = @url.host if @url.host + @env[HTTP_PORT] = @url.port if @url.port + @env[RACK_URL_SCHEME] = @url.scheme if @url.scheme + + super "forwarding to #{url}" + end + end + + # Rack::Recursive allows applications called down the chain to + # include data from other applications (by using + # rack['rack.recursive.include'][...] or raise a + # ForwardRequest to redirect internally. + + class Recursive + def initialize(app) + @app = app + end + + def call(env) + dup._call(env) + end + + def _call(env) + @script_name = env[SCRIPT_NAME] + @app.call(env.merge(RACK_RECURSIVE_INCLUDE => method(:include))) + rescue ForwardRequest => req + call(env.merge(req.env)) + end + + def include(env, path) + unless path.index(@script_name) == 0 && (path[@script_name.size] == ?/ || + path[@script_name.size].nil?) + raise ArgumentError, "can only include below #{@script_name}, not #{path}" + end + + env = env.merge(PATH_INFO => path, + SCRIPT_NAME => @script_name, + REQUEST_METHOD => GET, + "CONTENT_LENGTH" => "0", "CONTENT_TYPE" => "", + RACK_INPUT => StringIO.new("")) + @app.call(env) + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/reloader.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/reloader.rb new file mode 100644 index 0000000..a15064a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/reloader.rb @@ -0,0 +1,112 @@ +# frozen_string_literal: true + +# Copyright (C) 2009-2018 Michael Fellinger +# Rack::Reloader is subject to the terms of an MIT-style license. +# See MIT-LICENSE or https://opensource.org/licenses/MIT. + +require 'pathname' + +module Rack + + # High performant source reloader + # + # This class acts as Rack middleware. + # + # What makes it especially suited for use in a production environment is that + # any file will only be checked once and there will only be made one system + # call stat(2). + # + # Please note that this will not reload files in the background, it does so + # only when actively called. + # + # It is performing a check/reload cycle at the start of every request, but + # also respects a cool down time, during which nothing will be done. + class Reloader + def initialize(app, cooldown = 10, backend = Stat) + @app = app + @cooldown = cooldown + @last = (Time.now - cooldown) + @cache = {} + @mtimes = {} + @reload_mutex = Mutex.new + + extend backend + end + + def call(env) + if @cooldown and Time.now > @last + @cooldown + if Thread.list.size > 1 + @reload_mutex.synchronize{ reload! } + else + reload! + end + + @last = Time.now + end + + @app.call(env) + end + + def reload!(stderr = $stderr) + rotation do |file, mtime| + previous_mtime = @mtimes[file] ||= mtime + safe_load(file, mtime, stderr) if mtime > previous_mtime + end + end + + # A safe Kernel::load, issuing the hooks depending on the results + def safe_load(file, mtime, stderr = $stderr) + load(file) + stderr.puts "#{self.class}: reloaded `#{file}'" + file + rescue LoadError, SyntaxError => ex + stderr.puts ex + ensure + @mtimes[file] = mtime + end + + module Stat + def rotation + files = [$0, *$LOADED_FEATURES].uniq + paths = ['./', *$LOAD_PATH].uniq + + files.map{|file| + next if /\.(so|bundle)$/.match?(file) # cannot reload compiled files + + found, stat = figure_path(file, paths) + next unless found && stat && mtime = stat.mtime + + @cache[file] = found + + yield(found, mtime) + }.compact + end + + # Takes a relative or absolute +file+ name, a couple possible +paths+ that + # the +file+ might reside in. Returns the full path and File::Stat for the + # path. + def figure_path(file, paths) + found = @cache[file] + found = file if !found and Pathname.new(file).absolute? + found, stat = safe_stat(found) + return found, stat if found + + paths.find do |possible_path| + path = ::File.join(possible_path, file) + found, stat = safe_stat(path) + return ::File.expand_path(found), stat if found + end + + return false, false + end + + def safe_stat(file) + return unless file + stat = ::File.stat(file) + return file, stat if stat.file? + rescue Errno::ENOENT, Errno::ENOTDIR, Errno::ESRCH + @cache.delete(file) and false + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/request.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/request.rb new file mode 100644 index 0000000..d08c6f5 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/request.rb @@ -0,0 +1,787 @@ +# frozen_string_literal: true + +require_relative 'constants' +require_relative 'utils' +require_relative 'media_type' + +module Rack + # Rack::Request provides a convenient interface to a Rack + # environment. It is stateless, the environment +env+ passed to the + # constructor will be directly modified. + # + # req = Rack::Request.new(env) + # req.post? + # req.params["data"] + + class Request + class << self + attr_accessor :ip_filter + + # The priority when checking forwarded headers. The default + # is [:forwarded, :x_forwarded], which means, check the + # +Forwarded+ header first, followed by the appropriate + # X-Forwarded-* header. You can revert the priority by + # reversing the priority, or remove checking of either + # or both headers by removing elements from the array. + # + # This should be set as appropriate in your environment + # based on what reverse proxies are in use. If you are not + # using reverse proxies, you should probably use an empty + # array. + attr_accessor :forwarded_priority + + # The priority when checking either the X-Forwarded-Proto + # or X-Forwarded-Scheme header for the forwarded protocol. + # The default is [:proto, :scheme], to try the + # X-Forwarded-Proto header before the + # X-Forwarded-Scheme header. Rack 2 had behavior + # similar to [:scheme, :proto]. You can remove either or + # both of the entries in array to ignore that respective header. + attr_accessor :x_forwarded_proto_priority + end + + @forwarded_priority = [:forwarded, :x_forwarded] + @x_forwarded_proto_priority = [:proto, :scheme] + + valid_ipv4_octet = /\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])/ + + trusted_proxies = Regexp.union( + /\A127#{valid_ipv4_octet}{3}\z/, # localhost IPv4 range 127.x.x.x, per RFC-3330 + /\A::1\z/, # localhost IPv6 ::1 + /\Af[cd][0-9a-f]{2}(?::[0-9a-f]{0,4}){0,7}\z/i, # private IPv6 range fc00 .. fdff + /\A10#{valid_ipv4_octet}{3}\z/, # private IPv4 range 10.x.x.x + /\A172\.(1[6-9]|2[0-9]|3[01])#{valid_ipv4_octet}{2}\z/, # private IPv4 range 172.16.0.0 .. 172.31.255.255 + /\A192\.168#{valid_ipv4_octet}{2}\z/, # private IPv4 range 192.168.x.x + /\Alocalhost\z|\Aunix(\z|:)/i, # localhost hostname, and unix domain sockets + ) + + self.ip_filter = lambda { |ip| trusted_proxies.match?(ip) } + + ALLOWED_SCHEMES = %w(https http wss ws).freeze + + def initialize(env) + @env = env + @ip = nil + @params = nil + end + + def ip + @ip ||= super + end + + def params + @params ||= super + end + + def update_param(k, v) + super + @params = nil + end + + def delete_param(k) + v = super + @params = nil + v + end + + module Env + # The environment of the request. + attr_reader :env + + def initialize(env) + @env = env + # This module is included at least in `ActionDispatch::Request` + # The call to `super()` allows additional mixed-in initializers are called + super() + end + + # Predicate method to test to see if `name` has been set as request + # specific data + def has_header?(name) + @env.key? name + end + + # Get a request specific value for `name`. + def get_header(name) + @env[name] + end + + # If a block is given, it yields to the block if the value hasn't been set + # on the request. + def fetch_header(name, &block) + @env.fetch(name, &block) + end + + # Loops through each key / value pair in the request specific data. + def each_header(&block) + @env.each(&block) + end + + # Set a request specific value for `name` to `v` + def set_header(name, v) + @env[name] = v + end + + # Add a header that may have multiple values. + # + # Example: + # request.add_header 'Accept', 'image/png' + # request.add_header 'Accept', '*/*' + # + # assert_equal 'image/png,*/*', request.get_header('Accept') + # + # http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 + def add_header(key, v) + if v.nil? + get_header key + elsif has_header? key + set_header key, "#{get_header key},#{v}" + else + set_header key, v + end + end + + # Delete a request specific value for `name`. + def delete_header(name) + @env.delete name + end + + def initialize_copy(other) + @env = other.env.dup + end + end + + module Helpers + # The set of form-data media-types. Requests that do not indicate + # one of the media types present in this list will not be eligible + # for form-data / param parsing. + FORM_DATA_MEDIA_TYPES = [ + 'application/x-www-form-urlencoded', + 'multipart/form-data' + ] + + # The set of media-types. Requests that do not indicate + # one of the media types present in this list will not be eligible + # for param parsing like soap attachments or generic multiparts + PARSEABLE_DATA_MEDIA_TYPES = [ + 'multipart/related', + 'multipart/mixed' + ] + + # Default ports depending on scheme. Used to decide whether or not + # to include the port in a generated URI. + DEFAULT_PORTS = { 'http' => 80, 'https' => 443, 'coffee' => 80 } + + # The address of the client which connected to the proxy. + HTTP_X_FORWARDED_FOR = 'HTTP_X_FORWARDED_FOR' + + # The contents of the host/:authority header sent to the proxy. + HTTP_X_FORWARDED_HOST = 'HTTP_X_FORWARDED_HOST' + + HTTP_FORWARDED = 'HTTP_FORWARDED' + + # The value of the scheme sent to the proxy. + HTTP_X_FORWARDED_SCHEME = 'HTTP_X_FORWARDED_SCHEME' + + # The protocol used to connect to the proxy. + HTTP_X_FORWARDED_PROTO = 'HTTP_X_FORWARDED_PROTO' + + # The port used to connect to the proxy. + HTTP_X_FORWARDED_PORT = 'HTTP_X_FORWARDED_PORT' + + # Another way for specifying https scheme was used. + HTTP_X_FORWARDED_SSL = 'HTTP_X_FORWARDED_SSL' + + def body; get_header(RACK_INPUT) end + def script_name; get_header(SCRIPT_NAME).to_s end + def script_name=(s); set_header(SCRIPT_NAME, s.to_s) end + + def path_info; get_header(PATH_INFO).to_s end + def path_info=(s); set_header(PATH_INFO, s.to_s) end + + def request_method; get_header(REQUEST_METHOD) end + def query_string; get_header(QUERY_STRING).to_s end + def content_length; get_header('CONTENT_LENGTH') end + def logger; get_header(RACK_LOGGER) end + def user_agent; get_header('HTTP_USER_AGENT') end + + # the referer of the client + def referer; get_header('HTTP_REFERER') end + alias referrer referer + + def session + fetch_header(RACK_SESSION) do |k| + set_header RACK_SESSION, default_session + end + end + + def session_options + fetch_header(RACK_SESSION_OPTIONS) do |k| + set_header RACK_SESSION_OPTIONS, {} + end + end + + # Checks the HTTP request method (or verb) to see if it was of type DELETE + def delete?; request_method == DELETE end + + # Checks the HTTP request method (or verb) to see if it was of type GET + def get?; request_method == GET end + + # Checks the HTTP request method (or verb) to see if it was of type HEAD + def head?; request_method == HEAD end + + # Checks the HTTP request method (or verb) to see if it was of type OPTIONS + def options?; request_method == OPTIONS end + + # Checks the HTTP request method (or verb) to see if it was of type LINK + def link?; request_method == LINK end + + # Checks the HTTP request method (or verb) to see if it was of type PATCH + def patch?; request_method == PATCH end + + # Checks the HTTP request method (or verb) to see if it was of type POST + def post?; request_method == POST end + + # Checks the HTTP request method (or verb) to see if it was of type PUT + def put?; request_method == PUT end + + # Checks the HTTP request method (or verb) to see if it was of type TRACE + def trace?; request_method == TRACE end + + # Checks the HTTP request method (or verb) to see if it was of type UNLINK + def unlink?; request_method == UNLINK end + + def scheme + if get_header(HTTPS) == 'on' + 'https' + elsif get_header(HTTP_X_FORWARDED_SSL) == 'on' + 'https' + elsif forwarded_scheme + forwarded_scheme + else + get_header(RACK_URL_SCHEME) + end + end + + # The authority of the incoming request as defined by RFC3976. + # https://tools.ietf.org/html/rfc3986#section-3.2 + # + # In HTTP/1, this is the `host` header. + # In HTTP/2, this is the `:authority` pseudo-header. + def authority + forwarded_authority || host_authority || server_authority + end + + # The authority as defined by the `SERVER_NAME` and `SERVER_PORT` + # variables. + def server_authority + host = self.server_name + port = self.server_port + + if host + if port + "#{host}:#{port}" + else + host + end + end + end + + def server_name + get_header(SERVER_NAME) + end + + def server_port + get_header(SERVER_PORT) + end + + def cookies + hash = fetch_header(RACK_REQUEST_COOKIE_HASH) do |key| + set_header(key, {}) + end + + string = get_header(HTTP_COOKIE) + + unless string == get_header(RACK_REQUEST_COOKIE_STRING) + hash.replace Utils.parse_cookies_header(string) + set_header(RACK_REQUEST_COOKIE_STRING, string) + end + + hash + end + + def content_type + content_type = get_header('CONTENT_TYPE') + content_type.nil? || content_type.empty? ? nil : content_type + end + + def xhr? + get_header("HTTP_X_REQUESTED_WITH") == "XMLHttpRequest" + end + + # The `HTTP_HOST` header. + def host_authority + get_header(HTTP_HOST) + end + + def host_with_port(authority = self.authority) + host, _, port = split_authority(authority) + + if port == DEFAULT_PORTS[self.scheme] + host + else + authority + end + end + + # Returns a formatted host, suitable for being used in a URI. + def host + split_authority(self.authority)[0] + end + + # Returns an address suitable for being to resolve to an address. + # In the case of a domain name or IPv4 address, the result is the same + # as +host+. In the case of IPv6 or future address formats, the square + # brackets are removed. + def hostname + split_authority(self.authority)[1] + end + + def port + if authority = self.authority + _, _, port = split_authority(authority) + end + + port || forwarded_port&.last || DEFAULT_PORTS[scheme] || server_port + end + + def forwarded_for + forwarded_priority.each do |type| + case type + when :forwarded + if forwarded_for = get_http_forwarded(:for) + return(forwarded_for.map! do |authority| + split_authority(authority)[1] + end) + end + when :x_forwarded + if value = get_header(HTTP_X_FORWARDED_FOR) + return(split_header(value).map do |authority| + split_authority(wrap_ipv6(authority))[1] + end) + end + end + end + + nil + end + + def forwarded_port + forwarded_priority.each do |type| + case type + when :forwarded + if forwarded = get_http_forwarded(:for) + return(forwarded.map do |authority| + split_authority(authority)[2] + end.compact) + end + when :x_forwarded + if value = get_header(HTTP_X_FORWARDED_PORT) + return split_header(value).map(&:to_i) + end + end + end + + nil + end + + def forwarded_authority + forwarded_priority.each do |type| + case type + when :forwarded + if forwarded = get_http_forwarded(:host) + return forwarded.last + end + when :x_forwarded + if (value = get_header(HTTP_X_FORWARDED_HOST)) && (x_forwarded_host = split_header(value).last) + return wrap_ipv6(x_forwarded_host) + end + end + end + + nil + end + + def ssl? + scheme == 'https' || scheme == 'wss' + end + + def ip + remote_addresses = split_header(get_header('REMOTE_ADDR')) + + remote_addresses.reverse_each do |ip| + return ip unless trusted_proxy?(ip) + end + + if (forwarded_for = self.forwarded_for) && !forwarded_for.empty? + # The forwarded for addresses are ordered: client, proxy1, proxy2. + # So we reject all the trusted addresses (proxy*) and return the + # last client. Or if we trust everyone, we just return the first + # address. + forwarded_for.reverse_each do |ip| + return ip unless trusted_proxy?(ip) + end + return forwarded_for.first + end + + # If all the addresses are trusted, and we aren't forwarded, just return + # the first remote address, which represents the source of the request. + remote_addresses.first + end + + # The media type (type/subtype) portion of the CONTENT_TYPE header + # without any media type parameters. e.g., when CONTENT_TYPE is + # "text/plain;charset=utf-8", the media-type is "text/plain". + # + # For more information on the use of media types in HTTP, see: + # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7 + def media_type + MediaType.type(content_type) + end + + # The media type parameters provided in CONTENT_TYPE as a Hash, or + # an empty Hash if no CONTENT_TYPE or media-type parameters were + # provided. e.g., when the CONTENT_TYPE is "text/plain;charset=utf-8", + # this method responds with the following Hash: + # { 'charset' => 'utf-8' } + def media_type_params + MediaType.params(content_type) + end + + # The character set of the request body if a "charset" media type + # parameter was given, or nil if no "charset" was specified. Note + # that, per RFC2616, text/* media types that specify no explicit + # charset are to be considered ISO-8859-1. + def content_charset + media_type_params['charset'] + end + + # Determine whether the request body contains form-data by checking + # the request content-type for one of the media-types: + # "application/x-www-form-urlencoded" or "multipart/form-data". The + # list of form-data media types can be modified through the + # +FORM_DATA_MEDIA_TYPES+ array. + # + # A request body is also assumed to contain form-data when no + # content-type header is provided and the request_method is POST. + def form_data? + type = media_type + meth = get_header(RACK_METHODOVERRIDE_ORIGINAL_METHOD) || get_header(REQUEST_METHOD) + + (meth == POST && type.nil?) || FORM_DATA_MEDIA_TYPES.include?(type) + end + + # Determine whether the request body contains data by checking + # the request media_type against registered parse-data media-types + def parseable_data? + PARSEABLE_DATA_MEDIA_TYPES.include?(media_type) + end + + # Returns the data received in the query string. + def GET + get_header(RACK_REQUEST_QUERY_HASH) || set_header(RACK_REQUEST_QUERY_HASH, parse_query(query_string, '&')) + end + + # Returns the form data pairs received in the request body. + # + # This method support both application/x-www-form-urlencoded and + # multipart/form-data. + def form_pairs + if pairs = get_header(RACK_REQUEST_FORM_PAIRS) + return pairs + elsif error = get_header(RACK_REQUEST_FORM_ERROR) + raise error.class, error.message, cause: error.cause + end + + begin + rack_input = get_header(RACK_INPUT) + + # Otherwise, figure out how to parse the input: + if rack_input.nil? + set_header(RACK_REQUEST_FORM_PAIRS, []) + elsif form_data? || parseable_data? + if pairs = Rack::Multipart.parse_multipart(env, Rack::Multipart::ParamList) + set_header RACK_REQUEST_FORM_PAIRS, pairs + else + form_vars = get_header(RACK_INPUT).read + + # Fix for Safari Ajax postings that always append \0 + # form_vars.sub!(/\0\z/, '') # performance replacement: + form_vars.slice!(-1) if form_vars.end_with?("\0") + + set_header RACK_REQUEST_FORM_VARS, form_vars + pairs = query_parser.parse_query_pairs(form_vars, '&') + set_header(RACK_REQUEST_FORM_PAIRS, pairs) + end + else + set_header(RACK_REQUEST_FORM_PAIRS, []) + end + rescue => error + set_header(RACK_REQUEST_FORM_ERROR, error) + raise + end + end + + # Returns the data received in the request body. + # + # This method support both application/x-www-form-urlencoded and + # multipart/form-data. + def POST + if form_hash = get_header(RACK_REQUEST_FORM_HASH) + return form_hash + elsif error = get_header(RACK_REQUEST_FORM_ERROR) + raise error.class, error.message, cause: error.cause + end + + pairs = form_pairs + set_header RACK_REQUEST_FORM_HASH, expand_param_pairs(pairs) + end + + # The union of GET and POST data. + # + # Note that modifications will not be persisted in the env. Use update_param or delete_param if you want to destructively modify params. + def params + self.GET.merge(self.POST) + end + + # Allow overriding the query parser that the receiver will use. + # By default Rack::Utils.default_query_parser is used. + attr_writer :query_parser + + # Destructively update a parameter, whether it's in GET and/or POST. Returns nil. + # + # The parameter is updated wherever it was previous defined, so GET, POST, or both. If it wasn't previously defined, it's inserted into GET. + # + # env['rack.input'] is not touched. + def update_param(k, v) + found = false + if self.GET.has_key?(k) + found = true + self.GET[k] = v + end + if self.POST.has_key?(k) + found = true + self.POST[k] = v + end + unless found + self.GET[k] = v + end + end + + # Destructively delete a parameter, whether it's in GET or POST. Returns the value of the deleted parameter. + # + # If the parameter is in both GET and POST, the POST value takes precedence since that's how #params works. + # + # env['rack.input'] is not touched. + def delete_param(k) + post_value, get_value = self.POST.delete(k), self.GET.delete(k) + post_value || get_value + end + + def base_url + "#{scheme}://#{host_with_port}" + end + + # Tries to return a remake of the original request URL as a string. + def url + base_url + fullpath + end + + def path + script_name + path_info + end + + def fullpath + query_string.empty? ? path : "#{path}?#{query_string}" + end + + def accept_encoding + parse_http_accept_header(get_header("HTTP_ACCEPT_ENCODING")) + end + + def accept_language + parse_http_accept_header(get_header("HTTP_ACCEPT_LANGUAGE")) + end + + def trusted_proxy?(ip) + Rack::Request.ip_filter.call(ip) + end + + private + + def default_session; {}; end + + # Assist with compatibility when processing `X-Forwarded-For`. + def wrap_ipv6(host) + # Even thought IPv6 addresses should be wrapped in square brackets, + # sometimes this is not done in various legacy/underspecified headers. + # So we try to fix this situation for compatibility reasons. + + # Try to detect IPv6 addresses which aren't escaped yet: + if !host.start_with?('[') && host.count(':') > 1 + "[#{host}]" + else + host + end + end + + def parse_http_accept_header(header) + # It would be nice to use filter_map here, but it's Ruby 2.7+ + parts = header.to_s.split(',') + + parts.map! do |part| + part.strip! + next if part.empty? + + attribute, parameters = part.split(';', 2) + attribute.strip! + parameters&.strip! + quality = 1.0 + if parameters and /\Aq=([\d.]+)/ =~ parameters + quality = $1.to_f + end + [attribute, quality] + end + + parts.compact! + + parts + end + + # Get an array of values set in the RFC 7239 `Forwarded` request header. + def get_http_forwarded(token) + Utils.forwarded_values(get_header(HTTP_FORWARDED))&.[](token) + end + + def query_parser + @query_parser || Utils.default_query_parser + end + + def parse_query(qs, d = '&') + query_parser.parse_nested_query(qs, d) + end + + def parse_multipart + warn "Rack::Request#parse_multipart is deprecated and will be removed in a future version of Rack.", uplevel: 1 + Rack::Multipart.extract_multipart(self, query_parser) + end + + def expand_param_pairs(pairs, query_parser = query_parser()) + params = query_parser.make_params + + pairs.each do |k, v| + query_parser.normalize_params(params, k, v) + end + + params.to_params_hash + end + + def split_header(value) + value ? value.strip.split(/[, \t]+/) : [] + end + + # ipv6 extracted from resolv stdlib, simplified + # to remove numbered match group creation. + ipv6 = Regexp.union( + /(?:[0-9A-Fa-f]{1,4}:){7} + [0-9A-Fa-f]{1,4}/x, + /(?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)? :: + (?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?/x, + /(?:[0-9A-Fa-f]{1,4}:){6,6} + \d+\.\d+\.\d+\.\d+/x, + /(?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)? :: + (?:[0-9A-Fa-f]{1,4}:)* + \d+\.\d+\.\d+\.\d+/x, + /[Ff][Ee]80 + (?::[0-9A-Fa-f]{1,4}){7} + %[-0-9A-Za-z._~]+/x, + /[Ff][Ee]80: + (?: + (?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)? :: + (?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)? + | + :(?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)? + )? + :[0-9A-Fa-f]{1,4}%[-0-9A-Za-z._~]+/x) + + AUTHORITY = / + \A + (? + # Match IPv6 as a string of hex digits and colons in square brackets + \[(?
#{ipv6})\] + | + # Match any other printable string (except square brackets) as a hostname + (?
[[[:graph:]&&[^\[\]]]]*?) + ) + (:(?\d+))? + \z + /x + + private_constant :AUTHORITY + + def split_authority(authority) + return [] if authority.nil? + return [] unless match = AUTHORITY.match(authority) + return match[:host], match[:address], match[:port]&.to_i + end + + FORWARDED_SCHEME_HEADERS = { + proto: HTTP_X_FORWARDED_PROTO, + scheme: HTTP_X_FORWARDED_SCHEME + }.freeze + private_constant :FORWARDED_SCHEME_HEADERS + def forwarded_scheme + forwarded_priority.each do |type| + case type + when :forwarded + if (forwarded_proto = get_http_forwarded(:proto)) && + (scheme = allowed_scheme(forwarded_proto.last)) + return scheme + end + when :x_forwarded + x_forwarded_proto_priority.each do |x_type| + if header = FORWARDED_SCHEME_HEADERS[x_type] + split_header(get_header(header)).reverse_each do |scheme| + if allowed_scheme(scheme) + return scheme + end + end + end + end + end + end + + nil + end + + def allowed_scheme(header) + header if ALLOWED_SCHEMES.include?(header) + end + + def forwarded_priority + Request.forwarded_priority + end + + def x_forwarded_proto_priority + Request.x_forwarded_proto_priority + end + end + + include Env + include Helpers + end +end + +# :nocov: +require_relative 'multipart' unless defined?(Rack::Multipart) +# :nocov: diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/response.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/response.rb new file mode 100644 index 0000000..ece451d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/response.rb @@ -0,0 +1,403 @@ +# frozen_string_literal: true + +require 'time' + +require_relative 'constants' +require_relative 'utils' +require_relative 'media_type' +require_relative 'headers' + +module Rack + # Rack::Response provides a convenient interface to create a Rack + # response. + # + # It allows setting of headers and cookies, and provides useful + # defaults (an OK response with empty headers and body). + # + # You can use Response#write to iteratively generate your response, + # but note that this is buffered by Rack::Response until you call + # +finish+. +finish+ however can take a block inside which calls to + # +write+ are synchronous with the Rack response. + # + # Your application's +call+ should end returning Response#finish. + class Response + def self.[](status, headers, body) + self.new(body, status, headers) + end + + CHUNKED = 'chunked' + STATUS_WITH_NO_ENTITY_BODY = Utils::STATUS_WITH_NO_ENTITY_BODY + + attr_accessor :length, :status, :body + attr_reader :headers + + # Initialize the response object with the specified +body+, +status+ + # and +headers+. + # + # If the +body+ is +nil+, construct an empty response object with internal + # buffering. + # + # If the +body+ responds to +to_str+, assume it's a string-like object and + # construct a buffered response object containing using that string as the + # initial contents of the buffer. + # + # Otherwise it is expected +body+ conforms to the normal requirements of a + # Rack response body, typically implementing one of +each+ (enumerable + # body) or +call+ (streaming body). + # + # The +status+ defaults to +200+ which is the "OK" HTTP status code. You + # can provide any other valid status code. + # + # The +headers+ must be a +Hash+ of key-value header pairs which conform to + # the Rack specification for response headers. The key must be a +String+ + # instance and the value can be either a +String+ or +Array+ instance. + def initialize(body = nil, status = 200, headers = {}) + @status = status.to_i + + unless headers.is_a?(Hash) + raise ArgumentError, "Headers must be a Hash!" + end + + @headers = Headers.new + # Convert headers input to a plain hash with lowercase keys. + headers.each do |k, v| + @headers[k] = v + end + + @writer = self.method(:append) + + @block = nil + + # Keep track of whether we have expanded the user supplied body. + if body.nil? + @body = [] + @buffered = true + # Body is unspecified - it may be a buffered response, or it may be a HEAD response. + @length = nil + elsif body.respond_to?(:to_str) + @body = [body] + @buffered = true + @length = body.to_str.bytesize + else + @body = body + @buffered = nil # undetermined as of yet. + @length = nil + end + + yield self if block_given? + end + + def redirect(target, status = 302) + self.status = status + self.location = target + end + + def chunked? + CHUNKED == get_header(TRANSFER_ENCODING) + end + + def no_entity_body? + # The response body is an enumerable body and it is not allowed to have an entity body. + @body.respond_to?(:each) && STATUS_WITH_NO_ENTITY_BODY[@status] + end + + # Generate a response array consistent with the requirements of the SPEC. + # @return [Array] a 3-tuple suitable of `[status, headers, body]` + # which is suitable to be returned from the middleware `#call(env)` method. + def finish(&block) + if no_entity_body? + delete_header CONTENT_TYPE + delete_header CONTENT_LENGTH + close + return [@status, @headers, []] + else + if block_given? + # We don't add the content-length here as the user has provided a block that can #write additional chunks to the body. + @block = block + return [@status, @headers, self] + else + # If we know the length of the body, set the content-length header... except if we are chunked? which is a legacy special case where the body might already be encoded and thus the actual encoded body length and the content-length are likely to be different. + if @length && !chunked? + @headers[CONTENT_LENGTH] = @length.to_s + end + return [@status, @headers, @body] + end + end + end + + alias to_a finish # For *response + + def each(&callback) + @body.each(&callback) + @buffered = true + + if @block + @writer = callback + @block.call(self) + end + end + + # Append a chunk to the response body. + # + # Converts the response into a buffered response if it wasn't already. + # + # NOTE: Do not mix #write and direct #body access! + # + def write(chunk) + buffered_body! + + @writer.call(chunk.to_s) + end + + def close + @body.close if @body.respond_to?(:close) + end + + def empty? + @block == nil && @body.empty? + end + + def has_header?(key) + raise ArgumentError unless key.is_a?(String) + @headers.key?(key) + end + def get_header(key) + raise ArgumentError unless key.is_a?(String) + @headers[key] + end + def set_header(key, value) + raise ArgumentError unless key.is_a?(String) + @headers[key] = value + end + def delete_header(key) + raise ArgumentError unless key.is_a?(String) + @headers.delete key + end + + alias :[] :get_header + alias :[]= :set_header + + module Helpers + def invalid?; status < 100 || status >= 600; end + + def informational?; status >= 100 && status < 200; end + def successful?; status >= 200 && status < 300; end + def redirection?; status >= 300 && status < 400; end + def client_error?; status >= 400 && status < 500; end + def server_error?; status >= 500 && status < 600; end + + def ok?; status == 200; end + def created?; status == 201; end + def accepted?; status == 202; end + def no_content?; status == 204; end + def moved_permanently?; status == 301; end + def bad_request?; status == 400; end + def unauthorized?; status == 401; end + def forbidden?; status == 403; end + def not_found?; status == 404; end + def method_not_allowed?; status == 405; end + def not_acceptable?; status == 406; end + def request_timeout?; status == 408; end + def precondition_failed?; status == 412; end + def unprocessable?; status == 422; end + + def redirect?; [301, 302, 303, 307, 308].include? status; end + + def include?(header) + has_header?(header) + end + + # Add a header that may have multiple values. + # + # Example: + # response.add_header 'vary', 'accept-encoding' + # response.add_header 'vary', 'cookie' + # + # assert_equal 'accept-encoding,cookie', response.get_header('vary') + # + # http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 + def add_header(key, value) + raise ArgumentError unless key.is_a?(String) + + if value.nil? + return get_header(key) + end + + value = value.to_s + + if header = get_header(key) + if header.is_a?(Array) + header << value + else + set_header(key, [header, value]) + end + else + set_header(key, value) + end + end + + # Get the content type of the response. + def content_type + get_header CONTENT_TYPE + end + + # Set the content type of the response. + def content_type=(content_type) + set_header CONTENT_TYPE, content_type + end + + def media_type + MediaType.type(content_type) + end + + def media_type_params + MediaType.params(content_type) + end + + def content_length + cl = get_header CONTENT_LENGTH + cl ? cl.to_i : cl + end + + def location + get_header "location" + end + + def location=(location) + set_header "location", location + end + + def set_cookie(key, value) + add_header SET_COOKIE, Utils.set_cookie_header(key, value) + end + + def delete_cookie(key, value = {}) + set_header(SET_COOKIE, + Utils.delete_set_cookie_header!( + get_header(SET_COOKIE), key, value + ) + ) + end + + def set_cookie_header + get_header SET_COOKIE + end + + def set_cookie_header=(value) + set_header SET_COOKIE, value + end + + def cache_control + get_header CACHE_CONTROL + end + + def cache_control=(value) + set_header CACHE_CONTROL, value + end + + # Specifies that the content shouldn't be cached. Overrides `cache!` if already called. + def do_not_cache! + set_header CACHE_CONTROL, "no-cache, must-revalidate" + set_header EXPIRES, Time.now.httpdate + end + + # Specify that the content should be cached. + # @param duration [Integer] The number of seconds until the cache expires. + # @option directive [String] The cache control directive, one of "public", "private", "no-cache" or "no-store". + def cache!(duration = 3600, directive: "public") + unless headers[CACHE_CONTROL] =~ /no-cache/ + set_header CACHE_CONTROL, "#{directive}, max-age=#{duration}" + set_header EXPIRES, (Time.now + duration).httpdate + end + end + + def etag + get_header ETAG + end + + def etag=(value) + set_header ETAG, value + end + + protected + + # Convert the body of this response into an internally buffered Array if possible. + # + # `@buffered` is a ternary value which indicates whether the body is buffered. It can be: + # * `nil` - The body has not been buffered yet. + # * `true` - The body is buffered as an Array instance. + # * `false` - The body is not buffered and cannot be buffered. + # + # @return [Boolean] whether the body is buffered as an Array instance. + def buffered_body! + if @buffered.nil? + if @body.is_a?(Array) + # The user supplied body was an array: + @body = @body.compact + @length = @body.sum{|part| part.bytesize} + @buffered = true + elsif @body.respond_to?(:each) + # Turn the user supplied body into a buffered array: + body = @body + @body = Array.new + @buffered = true + + body.each do |part| + @writer.call(part.to_s) + end + + body.close if body.respond_to?(:close) + else + # We don't know how to buffer the user-supplied body: + @buffered = false + end + end + + return @buffered + end + + def append(chunk) + chunk = chunk.dup unless chunk.frozen? + @body << chunk + + if @length + @length += chunk.bytesize + elsif @buffered + @length = chunk.bytesize + end + + return chunk + end + end + + include Helpers + + class Raw + include Helpers + + attr_reader :headers + attr_accessor :status + + def initialize(status, headers) + @status = status + @headers = headers + end + + def has_header?(key) + headers.key?(key) + end + + def get_header(key) + headers[key] + end + + def set_header(key, value) + headers[key] = value + end + + def delete_header(key) + headers.delete(key) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/rewindable_input.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/rewindable_input.rb new file mode 100644 index 0000000..d0ad375 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/rewindable_input.rb @@ -0,0 +1,116 @@ +# -*- encoding: binary -*- +# frozen_string_literal: true + +require 'tempfile' + +require_relative 'constants' + +module Rack + # Class which can make any IO object rewindable, including non-rewindable ones. It does + # this by buffering the data into a tempfile, which is rewindable. + # + # Don't forget to call #close when you're done. This frees up temporary resources that + # RewindableInput uses, though it does *not* close the original IO object. + class RewindableInput + # Makes rack.input rewindable, for compatibility with applications and middleware + # designed for earlier versions of Rack (where rack.input was required to be + # rewindable). + class Middleware + def initialize(app) + @app = app + end + + def call(env) + if (input = env[RACK_INPUT]) + env[RACK_INPUT] = RewindableInput.new(input) + end + + @app.call(env) + end + end + + def initialize(io) + @io = io + @rewindable_io = nil + @unlinked = false + end + + def gets + make_rewindable unless @rewindable_io + @rewindable_io.gets + end + + def read(*args) + make_rewindable unless @rewindable_io + @rewindable_io.read(*args) + end + + def each(&block) + make_rewindable unless @rewindable_io + @rewindable_io.each(&block) + end + + def rewind + make_rewindable unless @rewindable_io + @rewindable_io.rewind + end + + def size + make_rewindable unless @rewindable_io + @rewindable_io.size + end + + # Closes this RewindableInput object without closing the originally + # wrapped IO object. Cleans up any temporary resources that this RewindableInput + # has created. + # + # This method may be called multiple times. It does nothing on subsequent calls. + def close + if @rewindable_io + if @unlinked + @rewindable_io.close + else + @rewindable_io.close! + end + @rewindable_io = nil + end + end + + private + + def make_rewindable + # Buffer all data into a tempfile. Since this tempfile is private to this + # RewindableInput object, we chmod it so that nobody else can read or write + # it. On POSIX filesystems we also unlink the file so that it doesn't + # even have a file entry on the filesystem anymore, though we can still + # access it because we have the file handle open. + @rewindable_io = Tempfile.new('RackRewindableInput') + @rewindable_io.chmod(0000) + @rewindable_io.set_encoding(Encoding::BINARY) + @rewindable_io.binmode + # :nocov: + if filesystem_has_posix_semantics? + raise 'Unlink failed. IO closed.' if @rewindable_io.closed? + @unlinked = true + end + # :nocov: + + buffer = "".dup + while @io.read(1024 * 4, buffer) + entire_buffer_written_out = false + while !entire_buffer_written_out + written = @rewindable_io.write(buffer) + entire_buffer_written_out = written == buffer.bytesize + if !entire_buffer_written_out + buffer.slice!(0 .. written - 1) + end + end + end + @rewindable_io.rewind + end + + def filesystem_has_posix_semantics? + RUBY_PLATFORM !~ /(mswin|mingw|cygwin|java)/ + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/runtime.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/runtime.rb new file mode 100644 index 0000000..a1bfa69 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/runtime.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require_relative 'utils' + +module Rack + # Sets an "x-runtime" response header, indicating the response + # time of the request, in seconds + # + # You can put it right before the application to see the processing + # time, or before all the other middlewares to include time for them, + # too. + class Runtime + FORMAT_STRING = "%0.6f" # :nodoc: + HEADER_NAME = "x-runtime" # :nodoc: + + def initialize(app, name = nil) + @app = app + @header_name = HEADER_NAME + @header_name += "-#{name.to_s.downcase}" if name + end + + def call(env) + start_time = Utils.clock_time + _, headers, _ = response = @app.call(env) + + request_time = Utils.clock_time - start_time + + unless headers.key?(@header_name) + headers[@header_name] = FORMAT_STRING % request_time + end + + response + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/sendfile.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/sendfile.rb new file mode 100644 index 0000000..4723893 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/sendfile.rb @@ -0,0 +1,167 @@ +# frozen_string_literal: true + +require_relative 'constants' +require_relative 'utils' +require_relative 'body_proxy' + +module Rack + + # = Sendfile + # + # The Sendfile middleware intercepts responses whose body is being + # served from a file and replaces it with a server specific x-sendfile + # header. The web server is then responsible for writing the file contents + # to the client. This can dramatically reduce the amount of work required + # by the Ruby backend and takes advantage of the web server's optimized file + # delivery code. + # + # In order to take advantage of this middleware, the response body must + # respond to +to_path+ and the request must include an x-sendfile-type + # header. Rack::Files and other components implement +to_path+ so there's + # rarely anything you need to do in your application. The x-sendfile-type + # header is typically set in your web servers configuration. The following + # sections attempt to document + # + # === Nginx + # + # Nginx supports the x-accel-redirect header. This is similar to x-sendfile + # but requires parts of the filesystem to be mapped into a private URL + # hierarchy. + # + # The following example shows the Nginx configuration required to create + # a private "/files/" area, enable x-accel-redirect, and pass the special + # x-sendfile-type and x-accel-mapping headers to the backend: + # + # location ~ /files/(.*) { + # internal; + # alias /var/www/$1; + # } + # + # location / { + # proxy_redirect off; + # + # proxy_set_header Host $host; + # proxy_set_header X-Real-IP $remote_addr; + # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + # + # proxy_set_header x-sendfile-type x-accel-redirect; + # proxy_set_header x-accel-mapping /var/www/=/files/; + # + # proxy_pass http://127.0.0.1:8080/; + # } + # + # Note that the x-sendfile-type header must be set exactly as shown above. + # The x-accel-mapping header should specify the location on the file system, + # followed by an equals sign (=), followed name of the private URL pattern + # that it maps to. The middleware performs a simple substitution on the + # resulting path. + # + # See Also: https://www.nginx.com/resources/wiki/start/topics/examples/xsendfile + # + # === lighttpd + # + # Lighttpd has supported some variation of the x-sendfile header for some + # time, although only recent version support x-sendfile in a reverse proxy + # configuration. + # + # $HTTP["host"] == "example.com" { + # proxy-core.protocol = "http" + # proxy-core.balancer = "round-robin" + # proxy-core.backends = ( + # "127.0.0.1:8000", + # "127.0.0.1:8001", + # ... + # ) + # + # proxy-core.allow-x-sendfile = "enable" + # proxy-core.rewrite-request = ( + # "x-sendfile-type" => (".*" => "x-sendfile") + # ) + # } + # + # See Also: http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModProxyCore + # + # === Apache + # + # x-sendfile is supported under Apache 2.x using a separate module: + # + # https://tn123.org/mod_xsendfile/ + # + # Once the module is compiled and installed, you can enable it using + # XSendFile config directive: + # + # RequestHeader Set x-sendfile-type x-sendfile + # ProxyPassReverse / http://localhost:8001/ + # XSendFile on + # + # === Mapping parameter + # + # The third parameter allows for an overriding extension of the + # x-accel-mapping header. Mappings should be provided in tuples of internal to + # external. The internal values may contain regular expression syntax, they + # will be matched with case indifference. + + class Sendfile + def initialize(app, variation = nil, mappings = []) + @app = app + @variation = variation + @mappings = mappings.map do |internal, external| + [/^#{internal}/i, external] + end + end + + def call(env) + _, headers, body = response = @app.call(env) + + if body.respond_to?(:to_path) + case type = variation(env) + when /x-accel-redirect/i + path = ::File.expand_path(body.to_path) + if url = map_accel_path(env, path) + headers[CONTENT_LENGTH] = '0' + # '?' must be percent-encoded because it is not query string but a part of path + headers[type.downcase] = ::Rack::Utils.escape_path(url).gsub('?', '%3F') + obody = body + response[2] = Rack::BodyProxy.new([]) do + obody.close if obody.respond_to?(:close) + end + else + env[RACK_ERRORS].puts "x-accel-mapping header missing" + end + when /x-sendfile|x-lighttpd-send-file/i + path = ::File.expand_path(body.to_path) + headers[CONTENT_LENGTH] = '0' + headers[type.downcase] = path + obody = body + response[2] = Rack::BodyProxy.new([]) do + obody.close if obody.respond_to?(:close) + end + when '', nil + else + env[RACK_ERRORS].puts "Unknown x-sendfile variation: #{type.inspect}" + end + end + response + end + + private + def variation(env) + @variation || + env['sendfile.type'] || + env['HTTP_X_SENDFILE_TYPE'] + end + + def map_accel_path(env, path) + if mapping = @mappings.find { |internal, _| internal =~ path } + path.sub(*mapping) + elsif mapping = env['HTTP_X_ACCEL_MAPPING'] + mapping.split(',').map(&:strip).each do |m| + internal, external = m.split('=', 2).map(&:strip) + new_path = path.sub(/^#{internal}/i, external) + return new_path unless path == new_path + end + path + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/show_exceptions.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/show_exceptions.rb new file mode 100644 index 0000000..c09292e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/show_exceptions.rb @@ -0,0 +1,409 @@ +# frozen_string_literal: true + +require 'erb' + +require_relative 'constants' +require_relative 'utils' +require_relative 'request' + +module Rack + # Rack::ShowExceptions catches all exceptions raised from the app it + # wraps. It shows a useful backtrace with the sourcefile and + # clickable context, the whole Rack environment and the request + # data. + # + # Be careful when you use this on public-facing sites as it could + # reveal information helpful to attackers. + + class ShowExceptions + CONTEXT = 7 + + Frame = Struct.new(:filename, :lineno, :function, + :pre_context_lineno, :pre_context, + :context_line, :post_context_lineno, + :post_context) + + def initialize(app) + @app = app + end + + def call(env) + @app.call(env) + rescue StandardError, LoadError, SyntaxError => e + exception_string = dump_exception(e) + + env[RACK_ERRORS].puts(exception_string) + env[RACK_ERRORS].flush + + if accepts_html?(env) + content_type = "text/html" + body = pretty(env, e) + else + content_type = "text/plain" + body = exception_string + end + + [ + 500, + { + CONTENT_TYPE => content_type, + CONTENT_LENGTH => body.bytesize.to_s, + }, + [body], + ] + end + + def prefers_plaintext?(env) + !accepts_html?(env) + end + + def accepts_html?(env) + Rack::Utils.best_q_match(env["HTTP_ACCEPT"], %w[text/html]) + end + private :accepts_html? + + def dump_exception(exception) + if exception.respond_to?(:detailed_message) + message = exception.detailed_message(highlight: false) + # :nocov: + # Ruby 3.2 added Exception#detailed_message, so the else + # branch cannot be hit on the current Ruby version. + else + message = exception.message + # :nocov: + end + string = "#{exception.class}: #{message}\n".dup + string << exception.backtrace.map { |l| "\t#{l}" }.join("\n") + string + end + + def pretty(env, exception) + req = Rack::Request.new(env) + + # This double assignment is to prevent an "unused variable" warning. + # Yes, it is dumb, but I don't like Ruby yelling at me. + path = path = (req.script_name + req.path_info).squeeze("/") + + # This double assignment is to prevent an "unused variable" warning. + # Yes, it is dumb, but I don't like Ruby yelling at me. + frames = frames = exception.backtrace.map { |line| + frame = Frame.new + if line =~ /(.*?):(\d+)(:in `(.*)')?/ + frame.filename = $1 + frame.lineno = $2.to_i + frame.function = $4 + + begin + lineno = frame.lineno - 1 + lines = ::File.readlines(frame.filename) + frame.pre_context_lineno = [lineno - CONTEXT, 0].max + frame.pre_context = lines[frame.pre_context_lineno...lineno] + frame.context_line = lines[lineno].chomp + frame.post_context_lineno = [lineno + CONTEXT, lines.size].min + frame.post_context = lines[lineno + 1..frame.post_context_lineno] + rescue + end + + frame + else + nil + end + }.compact + + template.result(binding) + end + + def template + TEMPLATE + end + + def h(obj) # :nodoc: + case obj + when String + Utils.escape_html(obj) + else + Utils.escape_html(obj.inspect) + end + end + + # :stopdoc: + + # adapted from Django + # Copyright (c) Django Software Foundation and individual contributors. + # Used under the modified BSD license: + # http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5 + TEMPLATE = ERB.new(<<-'HTML'.gsub(/^ /, '')) + + + + + + <%=h exception.class %> at <%=h path %> + + + + + +
+

<%=h exception.class %> at <%=h path %>

+ <% if exception.respond_to?(:detailed_message) %> +

<%=h exception.detailed_message(highlight: false) %>

+ <% else %> +

<%=h exception.message %>

+ <% end %> + + + + + + +
Ruby + <% if first = frames.first %> + <%=h first.filename %>: in <%=h first.function %>, line <%=h frames.first.lineno %> + <% else %> + unknown location + <% end %> +
Web<%=h req.request_method %> <%=h(req.host + path)%>
+ +

Jump to:

+ +
+ +
+

Traceback (innermost first)

+
    + <% frames.each { |frame| %> +
  • + <%=h frame.filename %>: in <%=h frame.function %> + + <% if frame.context_line %> +
    + <% if frame.pre_context %> +
      + <% frame.pre_context.each { |line| %> +
    1. <%=h line %>
    2. + <% } %> +
    + <% end %> + +
      +
    1. <%=h frame.context_line %>...
    + + <% if frame.post_context %> +
      + <% frame.post_context.each { |line| %> +
    1. <%=h line %>
    2. + <% } %> +
    + <% end %> +
    + <% end %> +
  • + <% } %> +
+
+ +
+

Request information

+ +

GET

+ <% if req.GET and not req.GET.empty? %> + + + + + + + + + <% req.GET.sort_by { |k, v| k.to_s }.each { |key, val| %> + + + + + <% } %> + +
VariableValue
<%=h key %>
<%=h val.inspect %>
+ <% else %> +

No GET data.

+ <% end %> + +

POST

+ <% if ((req.POST and not req.POST.empty?) rescue (no_post_data = "Invalid POST data"; nil)) %> + + + + + + + + + <% req.POST.sort_by { |k, v| k.to_s }.each { |key, val| %> + + + + + <% } %> + +
VariableValue
<%=h key %>
<%=h val.inspect %>
+ <% else %> +

<%= no_post_data || "No POST data" %>.

+ <% end %> + + + + <% unless req.cookies.empty? %> + + + + + + + + + <% req.cookies.each { |key, val| %> + + + + + <% } %> + +
VariableValue
<%=h key %>
<%=h val.inspect %>
+ <% else %> +

No cookie data.

+ <% end %> + +

Rack ENV

+ + + + + + + + + <% env.sort_by { |k, v| k.to_s }.each { |key, val| %> + + + + + <% } %> + +
VariableValue
<%=h key %>
<%=h val.inspect %>
+ +
+ +
+

+ You're seeing this error because you use Rack::ShowExceptions. +

+
+ + + + HTML + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/show_status.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/show_status.rb new file mode 100644 index 0000000..7b1a62f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/show_status.rb @@ -0,0 +1,121 @@ +# frozen_string_literal: true + +require 'erb' + +require_relative 'constants' +require_relative 'utils' +require_relative 'request' +require_relative 'body_proxy' + +module Rack + # Rack::ShowStatus catches all empty responses and replaces them + # with a site explaining the error. + # + # Additional details can be put into rack.showstatus.detail + # and will be shown as HTML. If such details exist, the error page + # is always rendered, even if the reply was not empty. + + class ShowStatus + def initialize(app) + @app = app + @template = ERB.new(TEMPLATE) + end + + def call(env) + status, headers, body = response = @app.call(env) + empty = headers[CONTENT_LENGTH].to_i <= 0 + + # client or server error, or explicit message + if (status.to_i >= 400 && empty) || env[RACK_SHOWSTATUS_DETAIL] + # This double assignment is to prevent an "unused variable" warning. + # Yes, it is dumb, but I don't like Ruby yelling at me. + req = req = Rack::Request.new(env) + + message = Rack::Utils::HTTP_STATUS_CODES[status.to_i] || status.to_s + + # This double assignment is to prevent an "unused variable" warning. + # Yes, it is dumb, but I don't like Ruby yelling at me. + detail = detail = env[RACK_SHOWSTATUS_DETAIL] || message + + html = @template.result(binding) + size = html.bytesize + + response[2] = Rack::BodyProxy.new([html]) do + body.close if body.respond_to?(:close) + end + + headers[CONTENT_TYPE] = "text/html" + headers[CONTENT_LENGTH] = size.to_s + end + + response + end + + def h(obj) # :nodoc: + case obj + when String + Utils.escape_html(obj) + else + Utils.escape_html(obj.inspect) + end + end + + # :stopdoc: + +# adapted from Django +# Copyright (c) Django Software Foundation and individual contributors. +# Used under the modified BSD license: +# http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5 +TEMPLATE = <<'HTML' + + + + + <%=h message %> at <%=h req.script_name + req.path_info %> + + + + +
+

<%=h message %> (<%= status.to_i %>)

+ + + + + + + + + +
Request Method:<%=h req.request_method %>
Request URL:<%=h req.url %>
+
+
+

<%=h detail %>

+
+ +
+

+ You're seeing this error because you use Rack::ShowStatus. +

+
+ + +HTML + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/static.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/static.rb new file mode 100644 index 0000000..c26993e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/static.rb @@ -0,0 +1,188 @@ +# frozen_string_literal: true + +require_relative 'constants' +require_relative 'files' +require_relative 'mime' + +module Rack + + # The Rack::Static middleware intercepts requests for static files + # (javascript files, images, stylesheets, etc) based on the url prefixes or + # route mappings passed in the options, and serves them using a Rack::Files + # object. This allows a Rack stack to serve both static and dynamic content. + # + # Examples: + # + # Serve all requests beginning with /media from the "media" folder located + # in the current directory (ie media/*): + # + # use Rack::Static, :urls => ["/media"] + # + # Same as previous, but instead of returning 404 for missing files under + # /media, call the next middleware: + # + # use Rack::Static, :urls => ["/media"], :cascade => true + # + # Serve all requests beginning with /css or /images from the folder "public" + # in the current directory (ie public/css/* and public/images/*): + # + # use Rack::Static, :urls => ["/css", "/images"], :root => "public" + # + # Serve all requests to / with "index.html" from the folder "public" in the + # current directory (ie public/index.html): + # + # use Rack::Static, :urls => {"/" => 'index.html'}, :root => 'public' + # + # Serve all requests normally from the folder "public" in the current + # directory but uses index.html as default route for "/" + # + # use Rack::Static, :urls => [""], :root => 'public', :index => + # 'index.html' + # + # Set custom HTTP Headers for based on rules: + # + # use Rack::Static, :root => 'public', + # :header_rules => [ + # [rule, {header_field => content, header_field => content}], + # [rule, {header_field => content}] + # ] + # + # Rules for selecting files: + # + # 1) All files + # Provide the :all symbol + # :all => Matches every file + # + # 2) Folders + # Provide the folder path as a string + # '/folder' or '/folder/subfolder' => Matches files in a certain folder + # + # 3) File Extensions + # Provide the file extensions as an array + # ['css', 'js'] or %w(css js) => Matches files ending in .css or .js + # + # 4) Regular Expressions / Regexp + # Provide a regular expression + # %r{\.(?:css|js)\z} => Matches files ending in .css or .js + # /\.(?:eot|ttf|otf|woff2|woff|svg)\z/ => Matches files ending in + # the most common web font formats (.eot, .ttf, .otf, .woff2, .woff, .svg) + # Note: This Regexp is available as a shortcut, using the :fonts rule + # + # 5) Font Shortcut + # Provide the :fonts symbol + # :fonts => Uses the Regexp rule stated right above to match all common web font endings + # + # Rule Ordering: + # Rules are applied in the order that they are provided. + # List rather general rules above special ones. + # + # Complete example use case including HTTP header rules: + # + # use Rack::Static, :root => 'public', + # :header_rules => [ + # # Cache all static files in public caches (e.g. Rack::Cache) + # # as well as in the browser + # [:all, {'cache-control' => 'public, max-age=31536000'}], + # + # # Provide web fonts with cross-origin access-control-headers + # # Firefox requires this when serving assets using a Content Delivery Network + # [:fonts, {'access-control-allow-origin' => '*'}] + # ] + # + class Static + def initialize(app, options = {}) + @app = app + @urls = options[:urls] || ["/favicon.ico"] + @index = options[:index] + @gzip = options[:gzip] + @cascade = options[:cascade] + root = options[:root] || Dir.pwd + + # HTTP Headers + @header_rules = options[:header_rules] || [] + # Allow for legacy :cache_control option while prioritizing global header_rules setting + @header_rules.unshift([:all, { CACHE_CONTROL => options[:cache_control] }]) if options[:cache_control] + + @file_server = Rack::Files.new(root) + end + + def add_index_root?(path) + @index && route_file(path) && path.end_with?('/') + end + + def overwrite_file_path(path) + @urls.kind_of?(Hash) && @urls.key?(path) || add_index_root?(path) + end + + def route_file(path) + @urls.kind_of?(Array) && @urls.any? { |url| path.index(url) == 0 } + end + + def can_serve(path) + route_file(path) || overwrite_file_path(path) + end + + def call(env) + path = env[PATH_INFO] + actual_path = Utils.clean_path_info(Utils.unescape_path(path)) + + if can_serve(actual_path) + if overwrite_file_path(path) + env[PATH_INFO] = (add_index_root?(path) ? path + @index : @urls[path]) + elsif @gzip && env['HTTP_ACCEPT_ENCODING'] && /\bgzip\b/.match?(env['HTTP_ACCEPT_ENCODING']) + path = env[PATH_INFO] + env[PATH_INFO] += '.gz' + response = @file_server.call(env) + env[PATH_INFO] = path + + if response[0] == 404 + response = nil + elsif response[0] == 304 + # Do nothing, leave headers as is + else + response[1][CONTENT_TYPE] = Mime.mime_type(::File.extname(path), 'text/plain') + response[1]['content-encoding'] = 'gzip' + end + end + + path = env[PATH_INFO] + response ||= @file_server.call(env) + + if @cascade && response[0] == 404 + return @app.call(env) + end + + headers = response[1] + applicable_rules(path).each do |rule, new_headers| + new_headers.each { |field, content| headers[field] = content } + end + + response + else + @app.call(env) + end + end + + # Convert HTTP header rules to HTTP headers + def applicable_rules(path) + @header_rules.find_all do |rule, new_headers| + case rule + when :all + true + when :fonts + /\.(?:ttf|otf|eot|woff2|woff|svg)\z/.match?(path) + when String + path = ::Rack::Utils.unescape(path) + path.start_with?(rule) || path.start_with?('/' + rule) + when Array + /\.(#{rule.join('|')})\z/.match?(path) + when Regexp + rule.match?(path) + else + false + end + end + end + + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/tempfile_reaper.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/tempfile_reaper.rb new file mode 100644 index 0000000..0b94cc7 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/tempfile_reaper.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require_relative 'constants' +require_relative 'body_proxy' + +module Rack + + # Middleware tracks and cleans Tempfiles created throughout a request (i.e. Rack::Multipart) + # Ideas/strategy based on posts by Eric Wong and Charles Oliver Nutter + # https://groups.google.com/forum/#!searchin/rack-devel/temp/rack-devel/brK8eh-MByw/sw61oJJCGRMJ + class TempfileReaper + def initialize(app) + @app = app + end + + def call(env) + env[RACK_TEMPFILES] ||= [] + + begin + _, _, body = response = @app.call(env) + rescue Exception + env[RACK_TEMPFILES]&.each(&:close!) + raise + end + + response[2] = BodyProxy.new(body) do + env[RACK_TEMPFILES]&.each(&:close!) + end + + response + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/urlmap.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/urlmap.rb new file mode 100644 index 0000000..99c4d82 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/urlmap.rb @@ -0,0 +1,99 @@ +# frozen_string_literal: true + +require 'set' + +require_relative 'constants' + +module Rack + # Rack::URLMap takes a hash mapping urls or paths to apps, and + # dispatches accordingly. Support for HTTP/1.1 host names exists if + # the URLs start with http:// or https://. + # + # URLMap modifies the SCRIPT_NAME and PATH_INFO such that the part + # relevant for dispatch is in the SCRIPT_NAME, and the rest in the + # PATH_INFO. This should be taken care of when you need to + # reconstruct the URL in order to create links. + # + # URLMap dispatches in such a way that the longest paths are tried + # first, since they are most specific. + + class URLMap + def initialize(map = {}) + remap(map) + end + + def remap(map) + @known_hosts = Set[] + @mapping = map.map { |location, app| + if location =~ %r{\Ahttps?://(.*?)(/.*)} + host, location = $1, $2 + @known_hosts << host + else + host = nil + end + + unless location[0] == ?/ + raise ArgumentError, "paths need to start with /" + end + + location = location.chomp('/') + match = Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", Regexp::NOENCODING) + + [host, location, match, app] + }.sort_by do |(host, location, _, _)| + [host ? -host.size : Float::INFINITY, -location.size] + end + end + + def call(env) + path = env[PATH_INFO] + script_name = env[SCRIPT_NAME] + http_host = env[HTTP_HOST] + server_name = env[SERVER_NAME] + server_port = env[SERVER_PORT] + + is_same_server = casecmp?(http_host, server_name) || + casecmp?(http_host, "#{server_name}:#{server_port}") + + is_host_known = @known_hosts.include? http_host + + @mapping.each do |host, location, match, app| + unless casecmp?(http_host, host) \ + || casecmp?(server_name, host) \ + || (!host && is_same_server) \ + || (!host && !is_host_known) # If we don't have a matching host, default to the first without a specified host + next + end + + next unless m = match.match(path.to_s) + + rest = m[1] + next unless !rest || rest.empty? || rest[0] == ?/ + + env[SCRIPT_NAME] = (script_name + location) + env[PATH_INFO] = rest + + return app.call(env) + end + + [404, { CONTENT_TYPE => "text/plain", "x-cascade" => "pass" }, ["Not Found: #{path}"]] + + ensure + env[PATH_INFO] = path + env[SCRIPT_NAME] = script_name + end + + private + def casecmp?(v1, v2) + # if both nil, or they're the same string + return true if v1 == v2 + + # if either are nil... (but they're not the same) + return false if v1.nil? + return false if v2.nil? + + # otherwise check they're not case-insensitive the same + v1.casecmp(v2).zero? + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/utils.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/utils.rb new file mode 100644 index 0000000..2c08f1f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/utils.rb @@ -0,0 +1,622 @@ +# -*- encoding: binary -*- +# frozen_string_literal: true + +require 'uri' +require 'fileutils' +require 'set' +require 'tempfile' +require 'time' +require 'erb' + +require_relative 'query_parser' +require_relative 'mime' +require_relative 'headers' +require_relative 'constants' + +module Rack + # Rack::Utils contains a grab-bag of useful methods for writing web + # applications adopted from all kinds of Ruby libraries. + + module Utils + ParameterTypeError = QueryParser::ParameterTypeError + InvalidParameterError = QueryParser::InvalidParameterError + ParamsTooDeepError = QueryParser::ParamsTooDeepError + DEFAULT_SEP = QueryParser::DEFAULT_SEP + COMMON_SEP = QueryParser::COMMON_SEP + KeySpaceConstrainedParams = QueryParser::Params + URI_PARSER = defined?(::URI::RFC2396_PARSER) ? ::URI::RFC2396_PARSER : ::URI::DEFAULT_PARSER + + class << self + attr_accessor :default_query_parser + end + # The default amount of nesting to allowed by hash parameters. + # This helps prevent a rogue client from triggering a possible stack overflow + # when parsing parameters. + self.default_query_parser = QueryParser.make_default(32) + + module_function + + # URI escapes. (CGI style space to +) + def escape(s) + URI.encode_www_form_component(s) + end + + # Like URI escaping, but with %20 instead of +. Strictly speaking this is + # true URI escaping. + def escape_path(s) + URI_PARSER.escape s + end + + # Unescapes the **path** component of a URI. See Rack::Utils.unescape for + # unescaping query parameters or form components. + def unescape_path(s) + URI_PARSER.unescape s + end + + # Unescapes a URI escaped string with +encoding+. +encoding+ will be the + # target encoding of the string returned, and it defaults to UTF-8 + def unescape(s, encoding = Encoding::UTF_8) + URI.decode_www_form_component(s, encoding) + end + + class << self + attr_accessor :multipart_total_part_limit + + attr_accessor :multipart_file_limit + + # multipart_part_limit is the original name of multipart_file_limit, but + # the limit only counts parts with filenames. + alias multipart_part_limit multipart_file_limit + alias multipart_part_limit= multipart_file_limit= + end + + # The maximum number of file parts a request can contain. Accepting too + # many parts can lead to the server running out of file handles. + # Set to `0` for no limit. + self.multipart_file_limit = (ENV['RACK_MULTIPART_PART_LIMIT'] || ENV['RACK_MULTIPART_FILE_LIMIT'] || 128).to_i + + # The maximum total number of parts a request can contain. Accepting too + # many can lead to excessive memory use and parsing time. + self.multipart_total_part_limit = (ENV['RACK_MULTIPART_TOTAL_PART_LIMIT'] || 4096).to_i + + def self.param_depth_limit + default_query_parser.param_depth_limit + end + + def self.param_depth_limit=(v) + self.default_query_parser = self.default_query_parser.new_depth_limit(v) + end + + if defined?(Process::CLOCK_MONOTONIC) + def clock_time + Process.clock_gettime(Process::CLOCK_MONOTONIC) + end + else + # :nocov: + def clock_time + Time.now.to_f + end + # :nocov: + end + + def parse_query(qs, d = nil, &unescaper) + Rack::Utils.default_query_parser.parse_query(qs, d, &unescaper) + end + + def parse_nested_query(qs, d = nil) + Rack::Utils.default_query_parser.parse_nested_query(qs, d) + end + + def build_query(params) + params.map { |k, v| + if v.class == Array + build_query(v.map { |x| [k, x] }) + else + v.nil? ? escape(k) : "#{escape(k)}=#{escape(v)}" + end + }.join("&") + end + + def build_nested_query(value, prefix = nil) + case value + when Array + value.map { |v| + build_nested_query(v, "#{prefix}[]") + }.join("&") + when Hash + value.map { |k, v| + build_nested_query(v, prefix ? "#{prefix}[#{k}]" : k) + }.delete_if(&:empty?).join('&') + when nil + escape(prefix) + else + raise ArgumentError, "value must be a Hash" if prefix.nil? + "#{escape(prefix)}=#{escape(value)}" + end + end + + def q_values(q_value_header) + q_value_header.to_s.split(',').map do |part| + value, parameters = part.split(';', 2).map(&:strip) + quality = 1.0 + if parameters && (md = /\Aq=([\d.]+)/.match(parameters)) + quality = md[1].to_f + end + [value, quality] + end + end + + def forwarded_values(forwarded_header) + return nil unless forwarded_header + forwarded_header = forwarded_header.to_s.gsub("\n", ";") + + forwarded_header.split(';').each_with_object({}) do |field, values| + field.split(',').each do |pair| + pair = pair.split('=').map(&:strip).join('=') + return nil unless pair =~ /\A(by|for|host|proto)="?([^"]+)"?\Z/i + (values[$1.downcase.to_sym] ||= []) << $2 + end + end + end + module_function :forwarded_values + + # Return best accept value to use, based on the algorithm + # in RFC 2616 Section 14. If there are multiple best + # matches (same specificity and quality), the value returned + # is arbitrary. + def best_q_match(q_value_header, available_mimes) + values = q_values(q_value_header) + + matches = values.map do |req_mime, quality| + match = available_mimes.find { |am| Rack::Mime.match?(am, req_mime) } + next unless match + [match, quality] + end.compact.sort_by do |match, quality| + (match.split('/', 2).count('*') * -10) + quality + end.last + matches&.first + end + + # Introduced in ERB 4.0. ERB::Escape is an alias for ERB::Utils which + # doesn't get monkey-patched by rails + if defined?(ERB::Escape) && ERB::Escape.instance_method(:html_escape) + define_method(:escape_html, ERB::Escape.instance_method(:html_escape)) + # :nocov: + # Ruby 3.2/ERB 4.0 added ERB::Escape#html_escape, so the else + # branch cannot be hit on the current Ruby version. + else + require 'cgi/escape' + # Escape ampersands, brackets and quotes to their HTML/XML entities. + def escape_html(string) + CGI.escapeHTML(string.to_s) + end + # :nocov: + end + + def select_best_encoding(available_encodings, accept_encoding) + # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + + expanded_accept_encoding = [] + + accept_encoding.each do |m, q| + preference = available_encodings.index(m) || available_encodings.size + + if m == "*" + (available_encodings - accept_encoding.map(&:first)).each do |m2| + expanded_accept_encoding << [m2, q, preference] + end + else + expanded_accept_encoding << [m, q, preference] + end + end + + encoding_candidates = expanded_accept_encoding + .sort_by { |_, q, p| [-q, p] } + .map!(&:first) + + unless encoding_candidates.include?("identity") + encoding_candidates.push("identity") + end + + expanded_accept_encoding.each do |m, q| + encoding_candidates.delete(m) if q == 0.0 + end + + (encoding_candidates & available_encodings)[0] + end + + # :call-seq: + # parse_cookies_header(value) -> hash + # + # Parse cookies from the provided header +value+ according to RFC6265. The + # syntax for cookie headers only supports semicolons. Returns a map of + # cookie +key+ to cookie +value+. + # + # parse_cookies_header('myname=myvalue; max-age=0') + # # => {"myname"=>"myvalue", "max-age"=>"0"} + # + def parse_cookies_header(value) + return {} unless value + + value.split(/; */n).each_with_object({}) do |cookie, cookies| + next if cookie.empty? + key, value = cookie.split('=', 2) + cookies[key] = (unescape(value) rescue value) unless cookies.key?(key) + end + end + + # :call-seq: + # parse_cookies(env) -> hash + # + # Parse cookies from the provided request environment using + # parse_cookies_header. Returns a map of cookie +key+ to cookie +value+. + # + # parse_cookies({'HTTP_COOKIE' => 'myname=myvalue'}) + # # => {'myname' => 'myvalue'} + # + def parse_cookies(env) + parse_cookies_header env[HTTP_COOKIE] + end + + # A valid cookie key according to RFC6265 and RFC2616. + # A can be any US-ASCII characters, except control characters, spaces, or tabs. It also must not contain a separator character like the following: ( ) < > @ , ; : \ " / [ ] ? = { }. + VALID_COOKIE_KEY = /\A[!#$%&'*+\-\.\^_`|~0-9a-zA-Z]+\z/.freeze + private_constant :VALID_COOKIE_KEY + + # :call-seq: + # set_cookie_header(key, value) -> encoded string + # + # Generate an encoded string using the provided +key+ and +value+ suitable + # for the +set-cookie+ header according to RFC6265. The +value+ may be an + # instance of either +String+ or +Hash+. If the cookie key is invalid (as + # defined by RFC6265), an +ArgumentError+ will be raised. + # + # If the cookie +value+ is an instance of +Hash+, it considers the following + # cookie attribute keys: +domain+, +max_age+, +expires+ (must be instance + # of +Time+), +secure+, +http_only+, +same_site+ and +value+. For more + # details about the interpretation of these fields, consult + # [RFC6265 Section 5.2](https://datatracker.ietf.org/doc/html/rfc6265#section-5.2). + # + # set_cookie_header("myname", "myvalue") + # # => "myname=myvalue" + # + # set_cookie_header("myname", {value: "myvalue", max_age: 10}) + # # => "myname=myvalue; max-age=10" + # + def set_cookie_header(key, value) + unless key =~ VALID_COOKIE_KEY + raise ArgumentError, "invalid cookie key: #{key.inspect}" + end + + case value + when Hash + domain = "; domain=#{value[:domain]}" if value[:domain] + path = "; path=#{value[:path]}" if value[:path] + max_age = "; max-age=#{value[:max_age]}" if value[:max_age] + expires = "; expires=#{value[:expires].httpdate}" if value[:expires] + secure = "; secure" if value[:secure] + httponly = "; httponly" if (value.key?(:httponly) ? value[:httponly] : value[:http_only]) + same_site = + case value[:same_site] + when false, nil + nil + when :none, 'None', :None + '; samesite=none' + when :lax, 'Lax', :Lax + '; samesite=lax' + when true, :strict, 'Strict', :Strict + '; samesite=strict' + else + raise ArgumentError, "Invalid :same_site value: #{value[:same_site].inspect}" + end + partitioned = "; partitioned" if value[:partitioned] + value = value[:value] + end + + value = [value] unless Array === value + + return "#{key}=#{value.map { |v| escape v }.join('&')}#{domain}" \ + "#{path}#{max_age}#{expires}#{secure}#{httponly}#{same_site}#{partitioned}" + end + + # :call-seq: + # set_cookie_header!(headers, key, value) -> header value + # + # Append a cookie in the specified headers with the given cookie +key+ and + # +value+ using set_cookie_header. + # + # If the headers already contains a +set-cookie+ key, it will be converted + # to an +Array+ if not already, and appended to. + def set_cookie_header!(headers, key, value) + if header = headers[SET_COOKIE] + if header.is_a?(Array) + header << set_cookie_header(key, value) + else + headers[SET_COOKIE] = [header, set_cookie_header(key, value)] + end + else + headers[SET_COOKIE] = set_cookie_header(key, value) + end + end + + # :call-seq: + # delete_set_cookie_header(key, value = {}) -> encoded string + # + # Generate an encoded string based on the given +key+ and +value+ using + # set_cookie_header for the purpose of causing the specified cookie to be + # deleted. The +value+ may be an instance of +Hash+ and can include + # attributes as outlined by set_cookie_header. The encoded cookie will have + # a +max_age+ of 0 seconds, an +expires+ date in the past and an empty + # +value+. When used with the +set-cookie+ header, it will cause the client + # to *remove* any matching cookie. + # + # delete_set_cookie_header("myname") + # # => "myname=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT" + # + def delete_set_cookie_header(key, value = {}) + set_cookie_header(key, value.merge(max_age: '0', expires: Time.at(0), value: '')) + end + + def delete_cookie_header!(headers, key, value = {}) + headers[SET_COOKIE] = delete_set_cookie_header!(headers[SET_COOKIE], key, value) + + return nil + end + + # :call-seq: + # delete_set_cookie_header!(header, key, value = {}) -> header value + # + # Set an expired cookie in the specified headers with the given cookie + # +key+ and +value+ using delete_set_cookie_header. This causes + # the client to immediately delete the specified cookie. + # + # delete_set_cookie_header!(nil, "mycookie") + # # => "mycookie=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT" + # + # If the header is non-nil, it will be modified in place. + # + # header = [] + # delete_set_cookie_header!(header, "mycookie") + # # => ["mycookie=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT"] + # header + # # => ["mycookie=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT"] + # + def delete_set_cookie_header!(header, key, value = {}) + if header + header = Array(header) + header << delete_set_cookie_header(key, value) + else + header = delete_set_cookie_header(key, value) + end + + return header + end + + def rfc2822(time) + time.rfc2822 + end + + # Parses the "Range:" header, if present, into an array of Range objects. + # Returns nil if the header is missing or syntactically invalid. + # Returns an empty array if none of the ranges are satisfiable. + def byte_ranges(env, size) + get_byte_ranges env['HTTP_RANGE'], size + end + + def get_byte_ranges(http_range, size) + # See + # Ignore Range when file size is 0 to avoid a 416 error. + return nil if size.zero? + return nil unless http_range && http_range =~ /bytes=([^;]+)/ + ranges = [] + $1.split(/,[ \t]*/).each do |range_spec| + return nil unless range_spec.include?('-') + range = range_spec.split('-') + r0, r1 = range[0], range[1] + if r0.nil? || r0.empty? + return nil if r1.nil? + # suffix-byte-range-spec, represents trailing suffix of file + r0 = size - r1.to_i + r0 = 0 if r0 < 0 + r1 = size - 1 + else + r0 = r0.to_i + if r1.nil? + r1 = size - 1 + else + r1 = r1.to_i + return nil if r1 < r0 # backwards range is syntactically invalid + r1 = size - 1 if r1 >= size + end + end + ranges << (r0..r1) if r0 <= r1 + end + + return [] if ranges.map(&:size).sum > size + + ranges + end + + # :nocov: + if defined?(OpenSSL.fixed_length_secure_compare) + # Constant time string comparison. + # + # NOTE: the values compared should be of fixed length, such as strings + # that have already been processed by HMAC. This should not be used + # on variable length plaintext strings because it could leak length info + # via timing attacks. + def secure_compare(a, b) + return false unless a.bytesize == b.bytesize + + OpenSSL.fixed_length_secure_compare(a, b) + end + # :nocov: + else + def secure_compare(a, b) + return false unless a.bytesize == b.bytesize + + l = a.unpack("C*") + + r, i = 0, -1 + b.each_byte { |v| r |= v ^ l[i += 1] } + r == 0 + end + end + + # Context allows the use of a compatible middleware at different points + # in a request handling stack. A compatible middleware must define + # #context which should take the arguments env and app. The first of which + # would be the request environment. The second of which would be the rack + # application that the request would be forwarded to. + class Context + attr_reader :for, :app + + def initialize(app_f, app_r) + raise 'running context does not respond to #context' unless app_f.respond_to? :context + @for, @app = app_f, app_r + end + + def call(env) + @for.context(env, @app) + end + + def recontext(app) + self.class.new(@for, app) + end + + def context(env, app = @app) + recontext(app).call(env) + end + end + + # Every standard HTTP code mapped to the appropriate message. + # Generated with: + # curl -s https://www.iana.org/assignments/http-status-codes/http-status-codes-1.csv \ + # | ruby -rcsv -e "puts CSV.parse(STDIN, headers: true) \ + # .reject {|v| v['Description'] == 'Unassigned' or v['Description'].include? '(' } \ + # .map {|v| %Q/#{v['Value']} => '#{v['Description']}'/ }.join(','+?\n)" + HTTP_STATUS_CODES = { + 100 => 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', + 103 => 'Early Hints', + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-Status', + 208 => 'Already Reported', + 226 => 'IM Used', + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 307 => 'Temporary Redirect', + 308 => 'Permanent Redirect', + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Timeout', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Content Too Large', + 414 => 'URI Too Long', + 415 => 'Unsupported Media Type', + 416 => 'Range Not Satisfiable', + 417 => 'Expectation Failed', + 421 => 'Misdirected Request', + 422 => 'Unprocessable Content', + 423 => 'Locked', + 424 => 'Failed Dependency', + 425 => 'Too Early', + 426 => 'Upgrade Required', + 428 => 'Precondition Required', + 429 => 'Too Many Requests', + 431 => 'Request Header Fields Too Large', + 451 => 'Unavailable For Legal Reasons', + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported', + 506 => 'Variant Also Negotiates', + 507 => 'Insufficient Storage', + 508 => 'Loop Detected', + 511 => 'Network Authentication Required' + } + + # Responses with HTTP status codes that should not have an entity body + STATUS_WITH_NO_ENTITY_BODY = Hash[((100..199).to_a << 204 << 304).product([true])] + + SYMBOL_TO_STATUS_CODE = Hash[*HTTP_STATUS_CODES.map { |code, message| + [message.downcase.gsub(/\s|-/, '_').to_sym, code] + }.flatten] + + OBSOLETE_SYMBOLS_TO_STATUS_CODES = { + payload_too_large: 413, + unprocessable_entity: 422, + bandwidth_limit_exceeded: 509, + not_extended: 510 + }.freeze + private_constant :OBSOLETE_SYMBOLS_TO_STATUS_CODES + + OBSOLETE_SYMBOL_MAPPINGS = { + payload_too_large: :content_too_large, + unprocessable_entity: :unprocessable_content + }.freeze + private_constant :OBSOLETE_SYMBOL_MAPPINGS + + def status_code(status) + if status.is_a?(Symbol) + SYMBOL_TO_STATUS_CODE.fetch(status) do + fallback_code = OBSOLETE_SYMBOLS_TO_STATUS_CODES.fetch(status) { raise ArgumentError, "Unrecognized status code #{status.inspect}" } + message = "Status code #{status.inspect} is deprecated and will be removed in a future version of Rack." + if canonical_symbol = OBSOLETE_SYMBOL_MAPPINGS[status] + message = "#{message} Please use #{canonical_symbol.inspect} instead." + end + warn message, uplevel: 3 + fallback_code + end + else + status.to_i + end + end + + PATH_SEPS = Regexp.union(*[::File::SEPARATOR, ::File::ALT_SEPARATOR].compact) + + def clean_path_info(path_info) + parts = path_info.split PATH_SEPS + + clean = [] + + parts.each do |part| + next if part.empty? || part == '.' + part == '..' ? clean.pop : clean << part + end + + clean_path = clean.join(::File::SEPARATOR) + clean_path.prepend("/") if parts.empty? || parts.first.empty? + clean_path + end + + NULL_BYTE = "\0" + + def valid_path?(path) + path.valid_encoding? && !path.include?(NULL_BYTE) + end + + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/version.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/version.rb new file mode 100644 index 0000000..1635d4e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/version.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +# Copyright (C) 2007-2019 Leah Neukirchen +# +# Rack is freely distributable under the terms of an MIT-style license. +# See MIT-LICENSE or https://opensource.org/licenses/MIT. + +module Rack + VERSION = "3.2.0" + + RELEASE = VERSION + + # Return the Rack release as a dotted string. + def self.release + VERSION + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/History.md b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/History.md new file mode 100644 index 0000000..0deacec --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/History.md @@ -0,0 +1,389 @@ +## 2.2.0 / 2024-12-23 + +* Bug fixes: + * `Rack::Test::Cookie` now parses cookie parameters using a + case-insensitive approach (Guillaume Malette #349) + +* Minor enhancements: + * Arrays of cookies containing a blank cookie are now handled + correctly when processing responses. (Martin Emde #343) + * `Rack::Test::UploadedFile` no longer uses a finalizer for named + paths to close and unlink the created Tempfile. Tempfile itself + uses a finalizer to close and unlink itself, so there is no + reason for `Rack::Test::UploadedFile` to do so (Jeremy Evans #338) + +## 2.1.0 / 2023-03-14 + +* Breaking changes: + * Digest authentication support, deprecated in 2.0.0, has been + removed (Jeremy Evans #307) + * requiring rack/mock_session, deprecated in 2.0.0, has been removed + (Jeremy Evans #307) + +* Minor enhancements: + * The `original_filename` for `Rack::Test::UploadedFile` can now be + set even if the content of the file comes from a file path + (Stuart Chinery #314) + * Add `Rack::Test::Session#restore_state`, for executing a block + and restoring current state (last request, last response, and + cookies) after the block (Jeremy Evans #316) + * Make `Rack::Test::Methods` support `default_host` method similar to + `app`, which will set the default host used for requests to the app + (Jeremy Evans #317 #318) + * Allow responses to set cookie paths not matching the current + request URI. Such cookies will only be sent for paths matching + the cookie path (Chris Waters #322) + * Ignore leading dot for cookie domains, per RFC 6265 (Stephen Crosby + #329) + * Avoid creating empty multipart body if params is empty in + `Rack::Test::Session#env_for` (Ryunosuke Sato #331) + +## 2.0.2 / 2022-06-28 + +* Bug fixes: + * Fix additional incompatible character encodings error when building + uploaded bodies (Jeremy Evans #311) + +## 2.0.1 / 2022-06-27 + +* Bug fixes: + * Fix incompatible character encodings error when building uploaded + file bodies (Jeremy Evans #308 #309) + +## 2.0.0 / 2022-06-24 + +* Breaking changes: + * Digest authentication support is now deprecated, as it relies on + digest authentication support in rack, which has been deprecated + (Jeremy Evans #294) + * `Rack::Test::Utils.build_primitive_part` no longer handles array + values (Jeremy Evans #292) + * `Rack::Test::Utils` module methods other than `build_nested_query` + and `build_multipart` are now private methods (Jeremy Evans #297) + * `Rack::MockSession` has been combined into `Rack::Test::Session`, + and remains as an alias to `Rack::Test::Session`, but to keep some + backwards compatibility, `Rack::Test::Session.new` will accept a + `Rack::Test::Session` instance and return it (Jeremy Evans #297) + * Previously protected methods in `Rack::Test::Cookie{,Jar}` are now + private methods (Jeremy Evans #297) + * `Rack::Test::Methods` no longer defines `build_rack_mock_session`, + but for backwards compatibility, `build_rack_test_session` will call + `build_rack_mock_session` if it is defined (Jeremy Evans #297) + * `Rack::Test::Methods::METHODS` is no longer defined + (Jeremy Evans #297) + * `Rack::Test::Methods#_current_session_names` has been removed + (Jeremy Evans #297) + * Headers used/accessed by rack-test are now lower case, for rack 3 + compliance (Jeremy Evans #295) + * Frozen literal strings are now used internally, which may break + code that mutates static strings returned by rack-test, if any + (Jeremy Evans #304) + +* Minor enhancements: + * rack-test now works with the rack main branch (what will be rack 3) + (Jeremy Evans #280 #292) + * rack-test only loads the parts of rack it uses when running on the + rack main branch (what will be rack 3) (Jeremy Evans #292) + * Development dependencies have been significantly reduced, and are + now a subset of the development dependencies of rack itself + (Jeremy Evans #292) + * Avoid creating multiple large copies of uploaded file data in + memory (Jeremy Evans #286) + * Specify HTTP/1.0 when submitting requests, to avoid responses with + Transfer-Encoding: chunked (Jeremy Evans #288) + * Support `:query_params` in rack environment for parameters that + are appended to the query string instead of used in the request + body (Jeremy Evans #150 #287) + * Reduce required ruby version to 2.0, since tests run fine on + Ruby 2.0 (Jeremy Evans #292) + * Support :multipart env key for request methods to force multipart + input (Jeremy Evans #303) + * Force multipart input for request methods if content type starts + with multipart (Jeremy Evans #303) + * Improve performance of Utils.build_multipart by using an + append-only design (Jeremy Evans #304) + * Improve performance of Utils.build_nested_query for array values + (Jeremy Evans #304) + +* Bug fixes: + * The `CONTENT_TYPE` of multipart requests is now respected, if it + starts with `multipart/` (Tom Knig #238) + * Work correctly with responses that respond to `to_a` but not + `to_ary` (Sergio Faria #276) + * Raise an ArgumentError instead of a TypeError when providing a + StringIO without an original filename when creating an + UploadedFile (Nuno Correia #279) + * Allow combining both an UploadedFile and a plain string when + building a multipart upload (Mitsuhiro Shibuya #278) + * Fix the generation of filenames with spaces to use path + escaping instead of regular escaping, since path unescaping is + used to decode it (Muir Manders, Jeremy Evans #275 #284) + * Rewind tempfile used for multipart uploads before it is + submitted to the application + (Jeremy Evans, Alexander Dervish #261 #268 #286) + * Fix Rack::Test.encoding_aware_strings to be true only on rack + 1.6+ (Jeremy Evans #292) + * Make Rack::Test::CookieJar#valid? return true/false + (Jeremy Evans #292) + * Cookies without a domain attribute no longer are submitted to + requests for subdomains of that domain, for RFC 6265 + compliance (Jeremy Evans #292) + * Increase required rack version to 1.3, since tests fail on + rack 1.2 and below (Jeremy Evans #293) + +## 1.1.0 / 2018-07-21 + +* Breaking changes: + * None + +* Minor enhancements / new functionality: + * [GitHub] Added configuration for Stale (Per Lundberg #232) + * follow_direct: Include rack.session.options (Mark Edmondson #233) + * [CI] Add simplecov (fatkodima #227) + +* Bug fixes: + * Follow relative locations correctly. (Samuel Williams #230) + +## 1.0.0 / 2018-03-27 + +* Breaking changes: + * Always set CONTENT_TYPE for non-GET requests + (Per Lundberg #223) + +* Minor enhancements / bug fixes: + * Create tempfile using the basename without extension + (Edouard Chin #201) + * Save `session` during `follow_redirect!` + (Alexander Popov #218) + * Document how to use URL params with DELETE method + (Timur Platonov #220) + +## 0.8.3 / 2018-02-27 + +* Bug fixes: + * Do not set Content-Type if params are explicitly set to nil + (Bartek Bułat #212). Fixes #200. + * Fix `UploadedFile#new` regression + (Per Lundberg #215) + +* Minor enhancements + * [CI] Test against Ruby 2.5 (Nicolas Leger #217) + +## 0.8.2 / 2017-11-21 + +* Bug fixes: + * Bugfix for `UploadedFile.new` unintended API breakage. + (Per Lundberg #210) + +## 0.8.0 / 2017-11-20 + +* Known Issue + * In `UploadedFile.new`, when passing e.g. a `Pathname` object, + errors can be raised (eg. `ArgumentError: Missing original_filename + for IO`, or `NoMethodError: undefined method 'size'`) See #207, #209. +* Minor enhancements + * Add a required_ruby_version of >= 2.2.2, similar to rack 2.0.1. + (Samuel Giddins #194) + * Remove new line from basic auth. (Felix Kleinschmidt #185) + * Rubocop fixes (Per Lundberg #196) + * Add how to install rack-test from github to README. (Jun Aruga #189) + * Update CodeClimate badges (Toshimaru #195) + * Add the ability to create Test::UploadedFile instances without + the file system (Adam Milligan #149) + * Add custom_request, remove duplication (Johannes Barre #184) + * README.md: Added note about how to post JSON (Per Lundberg #198) + * README.md: Added version badge (Per Lundberg #199) +* Bug fixes + * Bugfix for Cookies with multiple paths (Kyle Welsby #197) + +## 0.7.0 / 2017-07-10 + +* Major enhancements + * The project URL changed to https://github.com/rack-test/rack-test + (Per Lundberg, Dennis Sivia, Jun Aruga) + * Rack 2 compatible. (Trevor Wennblom #81, Vít Ondruch, Jun Aruga #151) +* Minor enhancements + * Port to RSpec 3. (Murahashi [Matt] Kenichi #70, Antonio Terceiro #134) + * Add Travis CI (Johannes Barre #108, Jun Aruga #161) + * Don't append an ampersand when params are empty (sbilharz, #157) + * Allow symbol access to cookies (Anorlondo448 #156) + * README: Added Travis badge (Olivier Lacan, Per Lundberg #146) + * `Rack::Test::Utils#build_multipart`: Allow passing a third parameter + to force multipart (Koen Punt #142) + * Allow better testing of cookies (Stephen Best #133) + * make `build_multipart` work without mixing in `Rack::Test::Utils` + (Aaron Patterson #131) + * Add license to gemspec (Jordi Massaguer Pla #72, Anatol Pomozov #89, + Anatol Pomozov #90, Johannes Barre #109, Mandaryn #115, + Chris Marshall #120, Robert Reiz #126, Nic Benders #127, Nic Benders #130) + * Feature/bulk pr for readme updates (Patrick Mulder #65, + Troels Knak-Nielsen #74, Jeff Casimir #76) + * Switch README format to Markdown (Dennis Sivia #176) + * Convert History.txt to Markdown (Dennis Sivia #179) + * Stop generating gemspec file. (Jun Aruga #181) + * Fix errors at rake docs and whitespace. (Jun Aruga #183) + * Ensure Rack::Test::UploadedFile closes its tempfile file descriptor + on GC (Michael de Silva #180) + * Change codeclimate URL correctly. (Jun Aruga #186) +* Bug fixes + * Initialize digest_username before using it. (Guo Xiang Tan #116, + John Drago #124, Mike Perham #154) + * Do not set Content-Type for DELETE requests (David Celis #132) + * Adds support for empty arrays in params. (Cedric Röck, Tim Masliuchenko + #125) + * Update README code example quotes to be consistent. (Dmitry Gritsay #112) + * Update README not to recommend installing gem with sudo. (T.J. Schuck #87) + * Set scheme when using ENV to enable SSL (Neil Ang #155) + * Reuse request method and parameters on HTTP 307 redirect. (Martin Mauch + #138) + +## 0.6.3 / 2015-01-09 + +* Minor enhancements + * Expose an env helper for persistently configuring the env as needed + (Darío Javier Cravero #80) + * Expose the tempfile of UploadedFile (Sytse Sijbrandij #67) +* Bug fixes + * Improve support for arrays of hashes in multipart forms (Murray Steele #69) + * Improve test for query strings (Paul Grayson #66) + +## 0.6.2 / 2012-09-27 + +* Minor enhancements + * Support HTTP PATCH method (Marjan Krekoten' #33) + * Preserve the exact query string when possible (Paul Grayson #63) + * Add a #delete method to CookieJar (Paul Grayson #63) +* Bug fixes + * Fix HTTP Digest authentication when the URI has query params + * Don't append default ports to HTTP_HOST (David Lee #57) + +## 0.6.1 / 2011-07-27 + +* Bug fixes + * Fix support for params with arrays in multipart forms (Joel Chippindale) + * Add `respond_to?` to `Rack::Test::UploadedFile` to match `method_missing` (Josh Nichols) + * Set the Referer header on requests issued by follow_redirect! (Ryan Bigg) + +## 0.6.0 / 2011-05-03 + +* Bug fixes + * Add support for HTTP OPTIONS verb (Paolo "Nusco" Perrotta) + * Call #finish on MockResponses if it's available (Aaron Patterson) + * Allow HTTP_HOST to be set via #header (Geoff Buesing) + +## 0.5.7 / 2011-01-01 +* Bug fixes + * If no URI is present, include all cookies (Pratik Naik) + +## 0.5.6 / 2010-09-25 + +* Bug fixes + * Use parse_nested_query for parsing URI like Rack does (Eugene Bolshakov) + * Don't depend on ActiveSupport extension to String (Bryan Helmkamp) + * Do not overwrite HTTP_HOST if it is set (Krekoten' Marjan) + +## 0.5.5 / 2010-09-22 + +* Bug fixes + * Fix encoding of file uploads on Ruby 1.9 (Alan Kennedy) + * Set env["HTTP_HOST"] when making requests (Istvan Hoka) + +## 0.5.4 / 2010-05-26 + +* Bug fixes + * Don't stomp on Content-Type's supplied via #header (Bryan Helmkamp) + * Fixed build_multipart to allow for arrays of files (Louis Rose) + * Don't raise an error if raw cookies contain a blank line (John Reilly) + * Handle parameter names with brackets properly (Tanner Donovan) + +## 0.5.3 / 2009-11-27 + +* Bug fixes + * Fix cookie matching for subdomains (Marcin Kulik) + +## 0.5.2 / 2009-11-13 + +* Bug fixes + * Call close on response body after iteration, not before (Simon Rozet) + * Add missing require for time in cookie_jar.rb (Jerry West) + +## 0.5.1 / 2009-10-27 + +* Bug fixes + * Escape cookie values (John Pignata) + * Close the response body after each request, as per the Rack spec (Elomar França) + +## 0.5.0 / 2009-09-19 + +* Bug fixes + * Set HTTP_X_REQUESTED_WITH in the Rack env when a request is made with :xhr => true (Ben Sales) + * Set headers in the Rack env in HTTP_USER_AGENT form + * Rack::Test now generates no Ruby warnings + +## 0.4.2 / 2009-09-01 + +* Minor enhancements + * Merge in rack/master's build_multipart method which covers additional cases + * Accept raw :params string input and merge it with the query string + * Stringify and upcase request method (e.g. :post => "POST") (Josh Peek) +* Bug fixes + * Properly convert hashes with nil values (e.g. :foo => nil becomes simply "foo", not "foo=") + * Prepend a slash to the URI path if it doesn't start with one (Josh Peek) + * Requiring Rack-Test never modifies the Ruby load path anymore (Josh Peek) + * Fixed using multiple cookies in a string on Ruby 1.8 (Tuomas Kareinen and Hermanni Hyytiälä) + +## 0.4.1 / 2009-08-06 + +* Minor enhancements + * Support initializing a `Rack::Test::Session` with an app in addition to + a `Rack::MockSession` + * Allow CONTENT_TYPE to be specified in the env and not overwritten when + sending a POST or PUT + +## 0.4.0 / 2009-06-25 + +* Minor enhancements + * Expose hook for building `Rack::MockSessions` for frameworks that need + to configure them before use + * Support passing in arrays of raw cookies in addition to a newline + separated string + * Support after_request callbacks in MockSession for things like running + background jobs + * Allow multiple named sessions using with_session + * Initialize `Rack::Test::Sessions` with `Rack::MockSessions` instead of apps. + This change should help integration with other Ruby web frameworks + (like Merb). + * Support sending bodies for PUT requests (Larry Diehl) + +## 0.3.0 / 2009-05-17 + +* Major enhancements + * Ruby 1.9 compatible (Simon Rozet, Michael Fellinger) +* Minor enhancements + * Add `CookieJar#[]` and `CookieJar#[]=` methods + * Make the default host configurable + * Use `Rack::Lint` and fix errors (Simon Rozet) + * Extract `Rack::MockSession` from `Rack::Test::Session` to handle tracking + the last request and response and the cookie jar + * Add #set_cookie and #clear_cookies methods + * Rename #authorize to #basic_authorize (#authorize remains as an alias) + (Simon Rozet) + +## 0.2.0 / 2009-04-26 + +Because `#last_response` is now a `MockResponse` instead of a `Rack::Response`, `#last_response.body` +now returns a string instead of an array. + +* Major enhancements + * Support multipart requests via the UploadedFile class (thanks, Rails) +* Minor enhancements + * Updated for Rack 1.0 + * Don't require rubygems (See http://gist.github.com/54177) + * Support HTTP Digest authentication with the `#digest_authorize` method + * `#last_response` returns a `MockResponse` instead of a Response + (Michael Fellinger) + +## 0.1.0 / 2009-03-02 + +* 1 major enhancement + * Birthday! diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/MIT-LICENSE.txt b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/MIT-LICENSE.txt new file mode 100644 index 0000000..78b1b57 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/MIT-LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2009 Bryan Helmkamp, Engine Yard Inc. +Copyright (c) 2022 Jeremy Evans + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/README.md b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/README.md new file mode 100644 index 0000000..cfa24e6 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/README.md @@ -0,0 +1,139 @@ +# Rack::Test +[![Gem Version](https://badge.fury.io/rb/rack-test.svg)](https://badge.fury.io/rb/rack-test) + +Code: https://github.com/rack/rack-test + +## Description + +Rack::Test is a small, simple testing API for Rack apps. It can be used on its +own or as a reusable starting point for Web frameworks and testing libraries +to build on. + +## Features + +* Allows for submitting requests and testing responses +* Maintains a cookie jar across requests +* Supports request headers used for subsequent requests +* Follow redirects when requested + +## Examples + +These examples use `test/unit` but it's equally possible to use `rack-test` with +other testing frameworks such as `minitest` or `rspec`. + +```ruby +require "test/unit" +require "rack/test" +require "json" + +class HomepageTest < Test::Unit::TestCase + include Rack::Test::Methods + + def app + lambda { |env| [200, {'content-type' => 'text/plain'}, ['All responses are OK']] } + end + + def test_response_is_ok + # Optionally set headers used for all requests in this spec: + #header 'accept-charset', 'utf-8' + + # First argument is treated as the path + get '/' + + assert last_response.ok? + assert_equal 'All responses are OK', last_response.body + end + + def delete_with_url_params_and_body + # First argument can have a query string + # + # Second argument is used as the parameters for the request, which will be + # included in the request body for non-GET requests. + delete '/?foo=bar', JSON.generate('baz' => 'zot') + end + + def post_with_json + # Third argument is the rack environment to use for the request. The following + # entries in the submitted rack environment are treated specially (in addition + # to options supported by `Rack::MockRequest#env_for`: + # + # :cookie : Set a cookie for the current session before submitting the request. + # + # :query_params : Set parameters for the query string (as opposed to the body). + # Value should be a hash of parameters. + # + # :xhr : Set HTTP_X_REQUESTED_WITH env key to XMLHttpRequest. + post(uri, JSON.generate('baz' => 'zot'), 'CONTENT_TYPE' => 'application/json') + end +end +``` + +`rack-test` will test the app returned by the `app` method. If you are loading middleware +in a `config.ru` file, and want to test that, you should load the Rack app created from +the `config.ru` file: + +```ruby +OUTER_APP = Rack::Builder.parse_file("config.ru").first + +class TestApp < Test::Unit::TestCase + include Rack::Test::Methods + + def app + OUTER_APP + end + + def test_root + get "/" + assert last_response.ok? + end +end +``` + +## Install + +To install the latest release as a gem: + +``` +gem install rack-test +``` + +Or add to your `Gemfile`: + +``` +gem 'rack-test' +``` + +## Contribution + +Contributions are welcome. Please make sure to: + +* Use a regular forking workflow +* Write tests for the new or changed behaviour +* Provide an explanation/motivation in your commit message / PR message +* Ensure `History.md` is updated + +## Authors + +- Contributions from Bryan Helmkamp, Jeremy Evans, Simon Rozet, and others +- Much of the original code was extracted from Merb 1.0's request helper + +## License + +`rack-test` is released under the [MIT License](MIT-LICENSE.txt). + +## Supported platforms + +* Ruby 2.0+ +* JRuby 9.1+ + +## Releasing + +* Bump VERSION in lib/rack/test/version.rb +* Ensure `History.md` is up-to-date, including correct version and date +* `git commit . -m 'Release $VERSION'` +* `git push` +* `git tag -a -m 'Tag the $VERSION release' $VERSION` +* `git push --tags` +* `gem build rack-test.gemspec` +* `gem push rack-test-$VERSION.gem` +* Add a discussion post for the release diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test.rb b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test.rb new file mode 100644 index 0000000..0b519e9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test.rb @@ -0,0 +1,382 @@ +# frozen_string_literal: true + +require 'uri' + +# :nocov: +begin + require "rack/version" +rescue LoadError + require "rack" +else + if Rack.release >= '2.3' + require "rack/request" + require "rack/mock" + require "rack/utils" + else + require "rack" + end +end +# :nocov: + +require 'forwardable' + +require_relative 'test/cookie_jar' +require_relative 'test/utils' +require_relative 'test/methods' +require_relative 'test/uploaded_file' +require_relative 'test/version' + +module Rack + module Test + # The default host to use for requests, when a full URI is not + # provided. + DEFAULT_HOST = 'example.org'.freeze + + # The default multipart boundary to use for multipart request bodies + MULTIPART_BOUNDARY = '----------XnJLe9ZIbbGUYtzPQJ16u1'.freeze + + # The starting boundary in multipart requests + START_BOUNDARY = "--#{MULTIPART_BOUNDARY}\r\n".freeze + + # The ending boundary in multipart requests + END_BOUNDARY = "--#{MULTIPART_BOUNDARY}--\r\n".freeze + + # The common base class for exceptions raised by Rack::Test + class Error < StandardError; end + + # Rack::Test::Session handles a series of requests issued to a Rack app. + # It keeps track of the cookies for the session, and allows for setting headers + # and a default rack environment that is used for future requests. + # + # Rack::Test::Session's methods are most often called through Rack::Test::Methods, + # which will automatically build a session when it's first used. + class Session + extend Forwardable + include Rack::Test::Utils + + def self.new(app, default_host = DEFAULT_HOST) # :nodoc: + if app.is_a?(self) + # Backwards compatibility for initializing with Rack::MockSession + app + else + super + end + end + + # The Rack::Test::CookieJar for the cookies for the current session. + attr_accessor :cookie_jar + + # The default host used for the session for when using paths for URIs. + attr_reader :default_host + + # Creates a Rack::Test::Session for a given Rack app or Rack::Test::BasicSession. + # + # Note: Generally, you won't need to initialize a Rack::Test::Session directly. + # Instead, you should include Rack::Test::Methods into your testing context. + # (See README.rdoc for an example) + # + # The following methods are defined via metaprogramming: get, post, put, patch, + # delete, options, and head. Each method submits a request with the given request + # method, with the given URI and optional parameters and rack environment. + # Examples: + # + # # URI only: + # get("/") # GET / + # get("/?foo=bar") # GET /?foo=bar + # + # # URI and parameters + # get("/foo", 'bar'=>'baz') # GET /foo?bar=baz + # post("/foo", 'bar'=>'baz') # POST /foo (bar=baz in request body) + # + # # URI, parameters, and rack environment + # get("/bar", {}, 'CONTENT_TYPE'=>'foo') + # get("/bar", {'foo'=>'baz'}, 'HTTP_ACCEPT'=>'*') + # + # The above methods as well as #request and #custom_request store the Rack::Request + # submitted in #last_request. The methods store a Rack::MockResponse based on the + # response in #last_response. #last_response is also returned by the methods. + # If a block is given, #last_response is also yielded to the block. + def initialize(app, default_host = DEFAULT_HOST) + @env = {} + @app = app + @after_request = [] + @default_host = default_host + @last_request = nil + @last_response = nil + clear_cookies + end + + %w[get post put patch delete options head].each do |method_name| + class_eval(<<-END, __FILE__, __LINE__+1) + def #{method_name}(uri, params = {}, env = {}, &block) + custom_request('#{method_name.upcase}', uri, params, env, &block) + end + END + end + + # Run a block after the each request completes. + def after_request(&block) + @after_request << block + end + + # Replace the current cookie jar with an empty cookie jar. + def clear_cookies + @cookie_jar = CookieJar.new([], @default_host) + end + + # Set a cookie in the current cookie jar. + def set_cookie(cookie, uri = nil) + cookie_jar.merge(cookie, uri) + end + + # Return the last request issued in the session. Raises an error if no + # requests have been sent yet. + def last_request + raise Error, 'No request yet. Request a page first.' unless @last_request + @last_request + end + + # Return the last response received in the session. Raises an error if + # no requests have been sent yet. + def last_response + raise Error, 'No response yet. Request a page first.' unless @last_response + @last_response + end + + # Issue a request to the Rack app for the given URI and optional Rack + # environment. Example: + # + # request "/" + def request(uri, env = {}, &block) + uri = parse_uri(uri, env) + env = env_for(uri, env) + process_request(uri, env, &block) + end + + # Issue a request using the given HTTP verb for the given URI, with optional + # params and rack environment. Example: + # + # custom_request "LINK", "/" + def custom_request(verb, uri, params = {}, env = {}, &block) + uri = parse_uri(uri, env) + env = env_for(uri, env.merge(method: verb.to_s.upcase, params: params)) + process_request(uri, env, &block) + end + + # Set a header to be included on all subsequent requests through the + # session. Use a value of nil to remove a previously configured header. + # + # In accordance with the Rack spec, headers will be included in the Rack + # environment hash in HTTP_USER_AGENT form. Example: + # + # header "user-agent", "Firefox" + def header(name, value) + name = name.upcase + name.tr!('-', '_') + name = "HTTP_#{name}" unless name == 'CONTENT_TYPE' || name == 'CONTENT_LENGTH' + env(name, value) + end + + # Set an entry in the rack environment to be included on all subsequent + # requests through the session. Use a value of nil to remove a previously + # value. Example: + # + # env "rack.session", {:csrf => 'token'} + def env(name, value) + if value.nil? + @env.delete(name) + else + @env[name] = value + end + end + + # Set the username and password for HTTP Basic authorization, to be + # included in subsequent requests in the HTTP_AUTHORIZATION header. + # + # Example: + # basic_authorize "bryan", "secret" + def basic_authorize(username, password) + encoded_login = ["#{username}:#{password}"].pack('m0') + header('Authorization', "Basic #{encoded_login}") + end + + alias authorize basic_authorize + + # Rack::Test will not follow any redirects automatically. This method + # will follow the redirect returned (including setting the Referer header + # on the new request) in the last response. If the last response was not + # a redirect, an error will be raised. + def follow_redirect! + unless last_response.redirect? + raise Error, 'Last response was not a redirect. Cannot follow_redirect!' + end + + if last_response.status == 307 + request_method = last_request.request_method + params = last_request.params + else + request_method = 'GET' + params = {} + end + + # Compute the next location by appending the location header with the + # last request, as per https://tools.ietf.org/html/rfc7231#section-7.1.2 + # Adding two absolute locations returns the right-hand location + next_location = URI.parse(last_request.url) + URI.parse(last_response['Location']) + + custom_request( + request_method, + next_location.to_s, + params, + 'HTTP_REFERER' => last_request.url, + 'rack.session' => last_request.session, + 'rack.session.options' => last_request.session_options + ) + end + + # Yield to the block, and restore the last request, last response, and + # cookie jar to the state they were prior to block execution upon + # exiting the block. + def restore_state + request = @last_request + response = @last_response + cookie_jar = @cookie_jar.dup + after_request = @after_request.dup + + begin + yield + ensure + @last_request = request + @last_response = response + @cookie_jar = cookie_jar + @after_request = after_request + end + end + + private + + # :nocov: + if !defined?(Rack::RELEASE) || Gem::Version.new(Rack::RELEASE) < Gem::Version.new('2.2.2') + def close_body(body) + body.close if body.respond_to?(:close) + end + # :nocov: + else + # close() gets called automatically in newer Rack versions. + def close_body(body) + end + end + + # Normalize URI based on given URI/path and environment. + def parse_uri(path, env) + uri = URI.parse(path) + uri.path = "/#{uri.path}" unless uri.path.start_with?('/') + uri.host ||= @default_host + uri.scheme ||= 'https' if env['HTTPS'] == 'on' + uri + end + + DEFAULT_ENV = { + 'rack.test' => true, + 'REMOTE_ADDR' => '127.0.0.1', + 'SERVER_PROTOCOL' => 'HTTP/1.0', + } + # :nocov: + unless Rack.release >= '2.3' + DEFAULT_ENV['HTTP_VERSION'] = DEFAULT_ENV['SERVER_PROTOCOL'] + end + # :nocov: + DEFAULT_ENV.freeze + private_constant :DEFAULT_ENV + + # Update environment to use based on given URI. + def env_for(uri, env) + env = DEFAULT_ENV.merge(@env).merge!(env) + + env['HTTP_HOST'] ||= [uri.host, (uri.port if uri.port != uri.default_port)].compact.join(':') + env['HTTPS'] = 'on' if URI::HTTPS === uri + env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest' if env[:xhr] + env['REQUEST_METHOD'] ||= env[:method] ? env[:method].to_s.upcase : 'GET' + + params = env.delete(:params) + query_array = [uri.query] + + if env['REQUEST_METHOD'] == 'GET' + # Treat params as query params + if params + append_query_params(query_array, params) + end + elsif !env.key?(:input) + env['CONTENT_TYPE'] ||= 'application/x-www-form-urlencoded' + params ||= {} + multipart = env.has_key?(:multipart) ? env.delete(:multipart) : env['CONTENT_TYPE'].start_with?('multipart/') + + if params.is_a?(Hash) + if !params.empty? && data = build_multipart(params, false, multipart) + env[:input] = data + env['CONTENT_LENGTH'] ||= data.length.to_s + env['CONTENT_TYPE'] = "#{multipart_content_type(env)}; boundary=#{MULTIPART_BOUNDARY}" + else + env[:input] = build_nested_query(params) + end + else + env[:input] = params + end + end + + if query_params = env.delete(:query_params) + append_query_params(query_array, query_params) + end + query_array.compact! + query_array.reject!(&:empty?) + uri.query = query_array.join('&') + + set_cookie(env.delete(:cookie), uri) if env.key?(:cookie) + + Rack::MockRequest.env_for(uri.to_s, env) + end + + # Append a string version of the query params to the array of query params. + def append_query_params(query_array, query_params) + query_params = parse_nested_query(query_params) if query_params.is_a?(String) + query_array << build_nested_query(query_params) + end + + # Return the multipart content type to use based on the environment. + def multipart_content_type(env) + requested_content_type = env['CONTENT_TYPE'] + if requested_content_type.start_with?('multipart/') + requested_content_type + else + 'multipart/form-data' + end + end + + # Submit the request with the given URI and rack environment to + # the mock session. Returns and potentially yields the last response. + def process_request(uri, env) + env['HTTP_COOKIE'] ||= cookie_jar.for(uri) + @last_request = Rack::Request.new(env) + status, headers, body = @app.call(env).to_a + + @last_response = MockResponse.new(status, headers, body, env['rack.errors'].flush) + close_body(body) + cookie_jar.merge(last_response.headers['set-cookie'], uri) + @after_request.each(&:call) + @last_response.finish + + yield @last_response if block_given? + + @last_response + end + end + + # Whether the version of rack in use handles encodings. + def self.encoding_aware_strings? + Rack.release >= '1.6' + end + end + + # For backwards compatibility with 1.1.0 and below + MockSession = Test::Session +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/cookie_jar.rb b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/cookie_jar.rb new file mode 100644 index 0000000..d09a5bb --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/cookie_jar.rb @@ -0,0 +1,251 @@ +# frozen_string_literal: true + +require 'uri' +require 'time' + +module Rack + module Test + # Represents individual cookies in the cookie jar. This is considered private + # API and behavior of this class can change at any time. + class Cookie # :nodoc: + include Rack::Utils + + # The name of the cookie, will be a string + attr_reader :name + + # The value of the cookie, will be a string or nil if there is no value. + attr_reader :value + + # The raw string for the cookie, without options. Will generally be in + # name=value format is name and value are provided. + attr_reader :raw + + def initialize(raw, uri = nil, default_host = DEFAULT_HOST) + @default_host = default_host + uri ||= default_uri + + # separate the name / value pair from the cookie options + @raw, options = raw.split(/[;,] */n, 2) + + @name, @value = parse_query(@raw, ';').to_a.first + @options = Hash[parse_query(options, ';').map { |k, v| [k.downcase, v] }] + + if domain = @options['domain'] + @exact_domain_match = false + domain[0] = '' if domain[0] == '.' + else + # If the domain attribute is not present in the cookie, + # the domain must match exactly. + @exact_domain_match = true + @options['domain'] = (uri.host || default_host) + end + + # Set the path for the cookie to the directory containing + # the request if it isn't set. + @options['path'] ||= uri.path.sub(/\/[^\/]*\Z/, '') + end + + # Wether the given cookie can replace the current cookie in the cookie jar. + def replaces?(other) + [name.downcase, domain, path] == [other.name.downcase, other.domain, other.path] + end + + # Whether the cookie has a value. + def empty? + @value.nil? || @value.empty? + end + + # The explicit or implicit domain for the cookie. + def domain + @options['domain'] + end + + # Whether the cookie has the secure flag, indicating it can only be sent over + # an encrypted connection. + def secure? + @options.key?('secure') + end + + # Whether the cookie has the httponly flag, indicating it is not available via + # a javascript API. + def http_only? + @options.key?('httponly') + end + + # The explicit or implicit path for the cookie. + def path + ([*@options['path']].first.split(',').first || '/').strip + end + + # A Time value for when the cookie expires, if the expires option is set. + def expires + Time.parse(@options['expires']) if @options['expires'] + end + + # Whether the cookie is currently expired. + def expired? + expires && expires < Time.now + end + + # Whether the cookie is valid for the given URI. + def valid?(uri) + uri ||= default_uri + + uri.host = @default_host if uri.host.nil? + + !!((!secure? || (secure? && uri.scheme == 'https')) && + uri.host =~ Regexp.new("#{'^' if @exact_domain_match}#{Regexp.escape(domain)}$", Regexp::IGNORECASE)) + end + + # Cookies that do not match the URI will not be sent in requests to the URI. + def matches?(uri) + !expired? && valid?(uri) && uri.path.start_with?(path) + end + + # Order cookies by name, path, and domain. + def <=>(other) + [name, path, domain.reverse] <=> [other.name, other.path, other.domain.reverse] + end + + # A hash of cookie options, including the cookie value, but excluding the cookie name. + def to_h + hash = @options.merge( + 'value' => @value, + 'HttpOnly' => http_only?, + 'secure' => secure? + ) + hash.delete('httponly') + hash + end + alias to_hash to_h + + private + + # The default URI to use for the cookie, including just the host. + def default_uri + URI.parse('//' + @default_host + '/') + end + end + + # Represents all cookies for a session, handling adding and + # removing cookies, and finding which cookies apply to a given + # request. This is considered private API and behavior of this + # class can change at any time. + class CookieJar # :nodoc: + DELIMITER = '; '.freeze + + def initialize(cookies = [], default_host = DEFAULT_HOST) + @default_host = default_host + @cookies = cookies.sort! + end + + # Ensure the copy uses a distinct cookies array. + def initialize_copy(other) + super + @cookies = @cookies.dup + end + + # Return the value for first cookie with the given name, or nil + # if no such cookie exists. + def [](name) + name = name.to_s + @cookies.each do |cookie| + return cookie.value if cookie.name == name + end + nil + end + + # Set a cookie with the given name and value in the + # cookie jar. + def []=(name, value) + merge("#{name}=#{Rack::Utils.escape(value)}") + end + + # Return the first cookie with the given name, or nil if + # no such cookie exists. + def get_cookie(name) + @cookies.each do |cookie| + return cookie if cookie.name == name + end + nil + end + + # Delete all cookies with the given name from the cookie jar. + def delete(name) + @cookies.reject! do |cookie| + cookie.name == name + end + nil + end + + # Add a string of raw cookie information to the cookie jar, + # if the cookie is valid for the given URI. + # Cookies should be separated with a newline. + def merge(raw_cookies, uri = nil) + return unless raw_cookies + + raw_cookies = raw_cookies.split("\n") if raw_cookies.is_a? String + + raw_cookies.each do |raw_cookie| + next if raw_cookie.empty? + cookie = Cookie.new(raw_cookie, uri, @default_host) + self << cookie if cookie.valid?(uri) + end + end + + # Add a Cookie to the cookie jar. + def <<(new_cookie) + @cookies.reject! do |existing_cookie| + new_cookie.replaces?(existing_cookie) + end + + @cookies << new_cookie + @cookies.sort! + end + + # Return a raw cookie string for the cookie header to + # use for the given URI. + def for(uri) + buf = String.new + delimiter = nil + + each_cookie_for(uri) do |cookie| + if delimiter + buf << delimiter + else + delimiter = DELIMITER + end + buf << cookie.raw + end + + buf + end + + # Return a hash cookie names and cookie values for cookies in the jar. + def to_hash + cookies = {} + + @cookies.each do |cookie| + cookies[cookie.name] = cookie.value + end + + cookies + end + + private + + # Yield each cookie that matches for the URI. + # + # The cookies are sorted by most specific first. So, we loop through + # all the cookies in order and add it to a hash by cookie name if + # the cookie can be sent to the current URI. It's added to the hash + # so that when we are done, the cookies will be unique by name and + # we'll have grabbed the most specific to the URI. + def each_cookie_for(uri) + @cookies.each do |cookie| + yield cookie if !uri || cookie.matches?(uri) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/methods.rb b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/methods.rb new file mode 100644 index 0000000..a30d02d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/methods.rb @@ -0,0 +1,94 @@ +# frozen_string_literal: true + +require 'forwardable' + +module Rack + module Test + # This module serves as the primary integration point for using Rack::Test + # in a testing environment. It depends on an app method being defined in the + # same context, and provides the Rack::Test API methods (see Rack::Test::Session + # for their documentation). It defines the following methods that are delegated + # to the current session: :request, :get, :post, :put, :patch, :delete, :options, + # :head, :custom_request, :follow_redirect!, :header, :env, :set_cookie, + # :clear_cookies, :authorize, :basic_authorize, :last_response, and :last_request. + # + # Example: + # + # class HomepageTest < Test::Unit::TestCase + # include Rack::Test::Methods + # + # def app + # MyApp + # end + # end + module Methods + extend Forwardable + + # Return the existing session with the given name, or a new + # rack session. Always use a new session if name is nil. + def rack_test_session(name = :default) # :nodoc: + return build_rack_test_session(name) unless name + + @_rack_test_sessions ||= {} + @_rack_test_sessions[name] ||= build_rack_test_session(name) + end + + # For backwards compatibility with older rack-test versions. + alias rack_mock_session rack_test_session # :nodoc: + + # Create a new Rack::Test::Session for #app. + def build_rack_test_session(_name) # :nodoc: + if respond_to?(:build_rack_mock_session, true) + # Backwards compatibility for capybara + build_rack_mock_session + else + if respond_to?(:default_host) + Session.new(app, default_host) + else + Session.new(app) + end + end + end + + # Return the currently actively session. This is the session to + # which the delegated methods are sent. + def current_session + @_rack_test_current_session ||= rack_test_session + end + + # Create a new session (or reuse an existing session with the given name), + # and make it the current session for the given block. + def with_session(name) + session = _rack_test_current_session + yield(@_rack_test_current_session = rack_test_session(name)) + ensure + @_rack_test_current_session = session + end + + def_delegators(:current_session, + :request, + :get, + :post, + :put, + :patch, + :delete, + :options, + :head, + :custom_request, + :follow_redirect!, + :header, + :env, + :set_cookie, + :clear_cookies, + :authorize, + :basic_authorize, + :last_response, + :last_request, + ) + + # Private accessor to avoid uninitialized instance variable warning in Ruby 2.* + attr_accessor :_rack_test_current_session + private :_rack_test_current_session + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/uploaded_file.rb b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/uploaded_file.rb new file mode 100644 index 0000000..5be6dc7 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/uploaded_file.rb @@ -0,0 +1,99 @@ +# frozen_string_literal: true + +require 'fileutils' +require 'tempfile' +require 'stringio' + +module Rack + module Test + # Wraps a Tempfile with a content type. Including one or more UploadedFile's + # in the params causes Rack::Test to build and issue a multipart request. + # + # Example: + # post "/photos", "file" => Rack::Test::UploadedFile.new("me.jpg", "image/jpeg") + class UploadedFile + # The filename, *not* including the path, of the "uploaded" file + attr_reader :original_filename + + # The tempfile + attr_reader :tempfile + + # The content type of the "uploaded" file + attr_accessor :content_type + + # Creates a new UploadedFile instance. + # + # Arguments: + # content :: is a path to a file, or an {IO} or {StringIO} object representing the content. + # content_type :: MIME type of the file + # binary :: Whether the file should be set to binmode (content treated as binary). + # original_filename :: The filename to use for the file. Required if content is StringIO, optional override if not + def initialize(content, content_type = 'text/plain', binary = false, original_filename: nil) + @content_type = content_type + @original_filename = original_filename + + case content + when StringIO + initialize_from_stringio(content) + else + initialize_from_file_path(content) + end + + @tempfile.binmode if binary + end + + # The path to the tempfile. Will not work if the receiver's content is from a StringIO. + def path + tempfile.path + end + alias local_path path + + # Delegate all methods not handled to the tempfile. + def method_missing(method_name, *args, &block) + tempfile.public_send(method_name, *args, &block) + end + + # Append to given buffer in 64K chunks to avoid multiple large + # copies of file data in memory. Rewind tempfile before and + # after to make sure all data in tempfile is appended to the + # buffer. + def append_to(buffer) + tempfile.rewind + + buf = String.new + buffer << tempfile.readpartial(65_536, buf) until tempfile.eof? + + tempfile.rewind + + nil + end + + def respond_to_missing?(method_name, include_private = false) #:nodoc: + tempfile.respond_to?(method_name, include_private) || super + end + + private + + # Use the StringIO as the tempfile. + def initialize_from_stringio(stringio) + raise(ArgumentError, 'Missing `original_filename` for StringIO object') unless @original_filename + + @tempfile = stringio + end + + # Create a tempfile and copy the content from the given path into the tempfile, optionally renaming if + # original_filename has been set. + def initialize_from_file_path(path) + raise "#{path} file does not exist" unless ::File.exist?(path) + + @original_filename ||= ::File.basename(path) + extension = ::File.extname(@original_filename) + + @tempfile = Tempfile.new([::File.basename(@original_filename, extension), extension]) + @tempfile.set_encoding(Encoding::BINARY) + + FileUtils.copy_file(path, @tempfile.path) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/utils.rb b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/utils.rb new file mode 100644 index 0000000..a79a8e7 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/utils.rb @@ -0,0 +1,156 @@ +# frozen_string_literal: true + +module Rack + module Test + module Utils # :nodoc: + include Rack::Utils + extend self + + # Build a query string for the given value and prefix. The value + # can be an array or hash of parameters. + def build_nested_query(value, prefix = nil) + case value + when Array + if value.empty? + "#{prefix}[]=" + else + prefix += "[]" unless unescape(prefix).end_with?('[]') + value.map do |v| + build_nested_query(v, prefix.to_s) + end.join('&') + end + when Hash + value.map do |k, v| + build_nested_query(v, prefix ? "#{prefix}[#{escape(k)}]" : escape(k)) + end.join('&') + when NilClass + prefix.to_s + else + "#{prefix}=#{escape(value)}" + end + end + + # Build a multipart body for the given params. + def build_multipart(params, _first = true, multipart = false) + raise ArgumentError, 'value must be a Hash' unless params.is_a?(Hash) + + unless multipart + query = lambda { |value| + case value + when Array + value.each(&query) + when Hash + value.values.each(&query) + when UploadedFile + multipart = true + end + } + params.values.each(&query) + return nil unless multipart + end + + params = normalize_multipart_params(params, true) + + buffer = String.new + build_parts(buffer, params) + buffer + end + + private + + # Return a flattened hash of parameter values based on the given params. + def normalize_multipart_params(params, first=false) + flattened_params = {} + + params.each do |key, value| + k = first ? key.to_s : "[#{key}]" + + case value + when Array + value.map do |v| + if v.is_a?(Hash) + nested_params = {} + normalize_multipart_params(v).each do |subkey, subvalue| + nested_params[subkey] = subvalue + end + (flattened_params["#{k}[]"] ||= []) << nested_params + else + flattened_params["#{k}[]"] = value + end + end + when Hash + normalize_multipart_params(value).each do |subkey, subvalue| + flattened_params[k + subkey] = subvalue + end + else + flattened_params[k] = value + end + end + + flattened_params + end + + # Build the multipart content for uploading. + def build_parts(buffer, parameters) + _build_parts(buffer, parameters) + buffer << END_BOUNDARY + end + + # Append each multipart parameter value to the buffer. + def _build_parts(buffer, parameters) + parameters.map do |name, value| + if name =~ /\[\]\Z/ && value.is_a?(Array) && value.all? { |v| v.is_a?(Hash) } + value.each do |hash| + new_value = {} + hash.each { |k, v| new_value[name + k] = v } + _build_parts(buffer, new_value) + end + else + [value].flatten.map do |v| + if v.respond_to?(:original_filename) + build_file_part(buffer, name, v) + else + build_primitive_part(buffer, name, v) + end + end + end + end + end + + # Append the multipart fragment for a parameter that isn't a file upload to the buffer. + def build_primitive_part(buffer, parameter_name, value) + buffer << + START_BOUNDARY << + "content-disposition: form-data; name=\"" << + parameter_name.to_s.b << + "\"\r\n\r\n" << + value.to_s.b << + "\r\n" + buffer + end + + # Append the multipart fragment for a parameter that is a file upload to the buffer. + def build_file_part(buffer, parameter_name, uploaded_file) + buffer << + START_BOUNDARY << + "content-disposition: form-data; name=\"" << + parameter_name.to_s.b << + "\"; filename=\"" << + escape_path(uploaded_file.original_filename).b << + "\"\r\ncontent-type: " << + uploaded_file.content_type.to_s.b << + "\r\ncontent-length: " << + uploaded_file.size.to_s.b << + "\r\n\r\n" + + # Handle old versions of Capybara::RackTest::Form::NilUploadedFile + if uploaded_file.respond_to?(:set_encoding) + uploaded_file.set_encoding(Encoding::BINARY) + uploaded_file.append_to(buffer) + end + + buffer << "\r\n" + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/version.rb b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/version.rb new file mode 100644 index 0000000..f7e7462 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/version.rb @@ -0,0 +1,5 @@ +module Rack + module Test + VERSION = '2.2.0'.freeze + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/bin/rackup b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/bin/rackup new file mode 100755 index 0000000..d2751b6 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/bin/rackup @@ -0,0 +1,5 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require_relative "../lib/rackup" +Rackup::Server.start diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup.rb b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup.rb new file mode 100644 index 0000000..588d8df --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +# Released under the MIT License. +# Copyright, 2022-2024, by Samuel Williams. + +require_relative 'rackup/handler' +require_relative 'rackup/server' +require_relative 'rackup/version' + +begin + # Although webrick is gone from Ruby since 3.0, it still warns all the way + # through to 3.3. Only on 3.4 will requiring it not produce a warning anymore. + verbose, $VERBOSE = $VERBOSE, nil + require 'webrick' + # If the user happens to have webrick in their bundle, make the handler available. + require_relative 'rackup/handler/webrick' +rescue LoadError + # ¯\_(ツ)_/¯ +ensure + $VERBOSE = verbose +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler.rb b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler.rb new file mode 100644 index 0000000..a46604b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler.rb @@ -0,0 +1,113 @@ +# frozen_string_literal: true + +# Released under the MIT License. +# Copyright, 2022-2023, by Samuel Williams. + +module Rackup + # *Handlers* connect web servers with Rack. + # + # Rackup includes Handlers for WEBrick and CGI. + # + # Handlers usually are activated by calling MyHandler.run(myapp). + # A second optional hash can be passed to include server-specific + # configuration. + module Handler + @handlers = {} + + # Register a named handler class. + def self.register(name, klass) + if klass.is_a?(String) + warn "Calling Rackup::Handler.register with a string is deprecated, use the class/module itself.", uplevel: 1 + + klass = self.const_get(klass, false) + end + + name = name.to_sym + + @handlers[name] = klass + end + + def self.[](name) + name = name.to_sym + + begin + @handlers[name] || self.const_get(name, false) + rescue NameError + # Ignore. + end + end + + def self.get(name) + return nil unless name + + name = name.to_sym + + if server = self[name] + return server + end + + begin + require_handler("rackup/handler", name) + rescue LoadError + require_handler("rack/handler", name) + end + + return self[name] + end + + RACK_HANDLER = 'RACK_HANDLER' + RACKUP_HANDLER = 'RACKUP_HANDLER' + + SERVER_NAMES = %i(puma falcon webrick).freeze + private_constant :SERVER_NAMES + + # Select first available Rack handler given an `Array` of server names. + # Raises `LoadError` if no handler was found. + # + # > pick ['puma', 'webrick'] + # => Rackup::Handler::WEBrick + def self.pick(server_names) + server_names = Array(server_names) + + server_names.each do |server_name| + begin + server = self.get(server_name) + return server if server + rescue LoadError + # Ignore. + end + end + + raise LoadError, "Couldn't find handler for: #{server_names.join(', ')}." + end + + def self.default + if rack_handler = ENV[RACKUP_HANDLER] + self.get(rack_handler) + elsif rack_handler = ENV[RACK_HANDLER] + warn "RACK_HANDLER is deprecated, use RACKUP_HANDLER." + self.get(rack_handler) + else + pick SERVER_NAMES + end + end + + # Transforms server-name constants to their canonical form as filenames, + # then tries to require them but silences the LoadError if not found + # + # Naming convention: + # + # Foo # => 'foo' + # FooBar # => 'foo_bar.rb' + # FooBAR # => 'foobar.rb' + # FOObar # => 'foobar.rb' + # FOOBAR # => 'foobar.rb' + # FooBarBaz # => 'foo_bar_baz.rb' + def self.require_handler(prefix, const_name) + file = const_name.to_s.gsub(/^[A-Z]+/) { |pre| pre.downcase }. + gsub(/[A-Z]+[^A-Z]/, '_\&').downcase + + require(::File.join(prefix, file)) + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler/cgi.rb b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler/cgi.rb new file mode 100644 index 0000000..a8f8a11 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler/cgi.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true + +# Released under the MIT License. +# Copyright, 2022-2023, by Samuel Williams. + +module Rackup + module Handler + class CGI + include Rack + + def self.run(app, **options) + $stdin.binmode + serve app + end + + def self.serve(app) + env = ENV.to_hash + env.delete "HTTP_CONTENT_LENGTH" + + env[SCRIPT_NAME] = "" if env[SCRIPT_NAME] == "/" + + env.update( + RACK_INPUT => $stdin, + RACK_ERRORS => $stderr, + RACK_URL_SCHEME => ["yes", "on", "1"].include?(ENV[HTTPS]) ? "https" : "http" + ) + + env[QUERY_STRING] ||= "" + env[REQUEST_PATH] ||= "/" + + status, headers, body = app.call(env) + begin + send_headers status, headers + send_body body + ensure + body.close if body.respond_to? :close + end + end + + def self.send_headers(status, headers) + $stdout.print "Status: #{status}\r\n" + headers.each { |k, vs| + vs.split("\n").each { |v| + $stdout.print "#{k}: #{v}\r\n" + } + } + $stdout.print "\r\n" + $stdout.flush + end + + def self.send_body(body) + body.each { |part| + $stdout.print part + $stdout.flush + } + end + end + + register :cgi, CGI + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler/webrick.rb b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler/webrick.rb new file mode 100644 index 0000000..7a7070f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler/webrick.rb @@ -0,0 +1,162 @@ +# frozen_string_literal: true + +# Released under the MIT License. +# Copyright, 2022-2023, by Samuel Williams. +# Copyright, 2022, by Jeremy Evans. + +require 'webrick' +require 'stringio' + +require 'rack/constants' +require_relative '../handler' +require_relative '../version' + +require_relative '../stream' + +module Rackup + module Handler + class WEBrick < ::WEBrick::HTTPServlet::AbstractServlet + def self.run(app, **options) + environment = ENV['RACK_ENV'] || 'development' + default_host = environment == 'development' ? 'localhost' : nil + + if !options[:BindAddress] || options[:Host] + options[:BindAddress] = options.delete(:Host) || default_host + end + options[:Port] ||= 8080 + if options[:SSLEnable] + require 'webrick/https' + end + + @server = ::WEBrick::HTTPServer.new(options) + @server.mount "/", Rackup::Handler::WEBrick, app + yield @server if block_given? + @server.start + end + + def self.valid_options + environment = ENV['RACK_ENV'] || 'development' + default_host = environment == 'development' ? 'localhost' : '0.0.0.0' + + { + "Host=HOST" => "Hostname to listen on (default: #{default_host})", + "Port=PORT" => "Port to listen on (default: 8080)", + } + end + + def self.shutdown + if @server + @server.shutdown + @server = nil + end + end + + def initialize(server, app) + super server + @app = app + end + + # This handles mapping the WEBrick request to a Rack input stream. + class Input + include Stream::Reader + + def initialize(request) + @request = request + + @reader = Fiber.new do + @request.body do |chunk| + Fiber.yield(chunk) + end + + Fiber.yield(nil) + + # End of stream: + @reader = nil + end + end + + def close + @request = nil + @reader = nil + end + + private + + # Read one chunk from the request body. + def read_next + @reader&.resume + end + end + + def service(req, res) + env = req.meta_vars + env.delete_if { |k, v| v.nil? } + + input = Input.new(req) + + env.update( + ::Rack::RACK_INPUT => input, + ::Rack::RACK_ERRORS => $stderr, + ::Rack::RACK_URL_SCHEME => ["yes", "on", "1"].include?(env[::Rack::HTTPS]) ? "https" : "http", + ::Rack::RACK_IS_HIJACK => true, + ) + + env[::Rack::QUERY_STRING] ||= "" + unless env[::Rack::PATH_INFO] == "" + path, n = req.request_uri.path, env[::Rack::SCRIPT_NAME].length + env[::Rack::PATH_INFO] = path[n, path.length - n] + end + env[::Rack::REQUEST_PATH] ||= [env[::Rack::SCRIPT_NAME], env[::Rack::PATH_INFO]].join + + status, headers, body = @app.call(env) + begin + res.status = status + + if value = headers[::Rack::RACK_HIJACK] + io_lambda = value + body = nil + elsif !body.respond_to?(:to_path) && !body.respond_to?(:each) + io_lambda = body + body = nil + end + + if value = headers.delete('set-cookie') + res.cookies.concat(Array(value)) + end + + headers.each do |key, value| + # Skip keys starting with rack., per Rack SPEC + next if key.start_with?('rack.') + + # Since WEBrick won't accept repeated headers, + # merge the values per RFC 1945 section 4.2. + value = value.join(", ") if Array === value + res[key] = value + end + + if io_lambda + protocol = headers['rack.protocol'] || headers['upgrade'] + + if protocol + # Set all the headers correctly for an upgrade response: + res.upgrade!(protocol) + end + res.body = io_lambda + elsif body.respond_to?(:to_path) + res.body = ::File.open(body.to_path, 'rb') + else + buffer = String.new + body.each do |part| + buffer << part + end + res.body = buffer + end + ensure + body.close if body.respond_to?(:close) + end + end + end + + register :webrick, WEBrick + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/lobster.rb b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/lobster.rb new file mode 100644 index 0000000..8502ba0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/lobster.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true + +# Released under the MIT License. +# Copyright, 2022-2023, by Samuel Williams. + +require 'zlib' + +require 'rack/constants' +require 'rack/request' +require 'rack/response' + +module Rackup + # Paste has a Pony, Rack has a Lobster! + class Lobster + include Rack + + LobsterString = Zlib::Inflate.inflate("eJx9kEEOwyAMBO99xd7MAcytUhPlJyj2 + P6jy9i4k9EQyGAnBarEXeCBqSkntNXsi/ZCvC48zGQoZKikGrFMZvgS5ZHd+aGWVuWwhVF0 + t1drVmiR42HcWNz5w3QanT+2gIvTVCiE1lm1Y0eU4JGmIIbaKwextKn8rvW+p5PIwFl8ZWJ + I8jyiTlhTcYXkekJAzTyYN6E08A+dk8voBkAVTJQ==".delete("\n ").unpack("m*")[0]) + + LambdaLobster = lambda { |env| + if env[QUERY_STRING].include?("flip") + lobster = LobsterString.split("\n"). + map { |line| line.ljust(42).reverse }. + join("\n") + href = "?" + else + lobster = LobsterString + href = "?flip" + end + + content = ["Lobstericious!", + "
", lobster, "
", + "flip!"] + length = content.inject(0) { |a, e| a + e.size }.to_s + [200, { CONTENT_TYPE => "text/html", CONTENT_LENGTH => length }, content] + } + + def call(env) + req = Request.new(env) + if req.GET["flip"] == "left" + lobster = LobsterString.split("\n").map do |line| + line.ljust(42).reverse. + gsub('\\', 'TEMP'). + gsub('/', '\\'). + gsub('TEMP', '/'). + gsub('{', '}'). + gsub('(', ')') + end.join("\n") + href = "?flip=right" + elsif req.GET["flip"] == "crash" + raise "Lobster crashed" + else + lobster = LobsterString + href = "?flip=left" + end + + res = Response.new + res.write "Lobstericious!" + res.write "
"
+      res.write lobster
+      res.write "
" + res.write "

flip!

" + res.write "

crash!

" + res.finish + end + + end +end + +if $0 == __FILE__ + # :nocov: + require_relative 'server' + require_relative 'show_exceptions' + require_relative 'lint' + Rackup::Server.start( + app: Rack::ShowExceptions.new(Rack::Lint.new(Rackup::Lobster.new)), Port: 9292 + ) + # :nocov: +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/server.rb b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/server.rb new file mode 100644 index 0000000..cb132f7 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/server.rb @@ -0,0 +1,462 @@ +# frozen_string_literal: true + +# Released under the MIT License. +# Copyright, 2022-2023, by Samuel Williams. + +require 'optparse' +require 'fileutils' + +require 'rack/builder' +require 'rack/common_logger' +require 'rack/content_length' +require 'rack/show_exceptions' +require 'rack/lint' +require 'rack/tempfile_reaper' + +require 'rack/version' + +require_relative 'version' +require_relative 'handler' + +module Rackup + class Server + class Options + def parse!(args) + options = {} + opt_parser = OptionParser.new("", 24, ' ') do |opts| + opts.banner = "Usage: rackup [ruby options] [rack options] [rackup config]" + + opts.separator "" + opts.separator "Ruby options:" + + lineno = 1 + opts.on("-e", "--eval LINE", "evaluate a LINE of code") { |line| + eval line, TOPLEVEL_BINDING, "-e", lineno + lineno += 1 + } + + opts.on("-d", "--debug", "set debugging flags (set $DEBUG to true)") { + options[:debug] = true + } + opts.on("-w", "--warn", "turn warnings on for your script") { + options[:warn] = true + } + opts.on("-q", "--quiet", "turn off logging") { + options[:quiet] = true + } + + opts.on("-I", "--include PATH", + "specify $LOAD_PATH (may be used more than once)") { |path| + (options[:include] ||= []).concat(path.split(":")) + } + + opts.on("-r", "--require LIBRARY", + "require the library, before executing your script") { |library| + (options[:require] ||= []) << library + } + + opts.separator "" + opts.separator "Rack options:" + opts.on("-b", "--builder BUILDER_LINE", "evaluate a BUILDER_LINE of code as a builder script") { |line| + options[:builder] = line + } + + opts.on("-s", "--server SERVER", "serve using SERVER (thin/puma/webrick)") { |s| + options[:server] = s + } + + opts.on("-o", "--host HOST", "listen on HOST (default: localhost)") { |host| + options[:Host] = host + } + + opts.on("-p", "--port PORT", "use PORT (default: 9292)") { |port| + options[:Port] = port + } + + opts.on("-O", "--option NAME[=VALUE]", "pass VALUE to the server as option NAME. If no VALUE, sets it to true. Run '#{$0} -s SERVER -h' to get a list of options for SERVER") { |name| + name, value = name.split('=', 2) + value = true if value.nil? + options[name.to_sym] = value + } + + opts.on("-E", "--env ENVIRONMENT", "use ENVIRONMENT for defaults (default: development)") { |e| + options[:environment] = e + } + + opts.on("-D", "--daemonize", "run daemonized in the background") { |d| + options[:daemonize] ||= true + } + + opts.on("--daemonize-noclose", "run daemonized in the background without closing stdout/stderr") { + options[:daemonize] = :noclose + } + + opts.on("-P", "--pid FILE", "file to store PID") { |f| + options[:pid] = ::File.expand_path(f) + } + + opts.separator "" + opts.separator "Profiling options:" + + opts.on("--heap HEAPFILE", "Build the application, then dump the heap to HEAPFILE") do |e| + options[:heapfile] = e + end + + opts.on("--profile PROFILE", "Dump CPU or Memory profile to PROFILE (defaults to a tempfile)") do |e| + options[:profile_file] = e + end + + opts.on("--profile-mode MODE", "Profile mode (cpu|wall|object)") do |e| + unless %w[cpu wall object].include?(e) + raise OptionParser::InvalidOption, "unknown profile mode: #{e}" + end + options[:profile_mode] = e.to_sym + end + + opts.separator "" + opts.separator "Common options:" + + opts.on_tail("-h", "-?", "--help", "Show this message") do + puts opts + puts handler_opts(options) + + exit + end + + opts.on_tail("--version", "Show version") do + puts "Rack #{Rack::RELEASE}" + exit + end + end + + begin + opt_parser.parse! args + rescue OptionParser::InvalidOption => e + warn e.message + abort opt_parser.to_s + end + + options[:config] = args.last if args.last && !args.last.empty? + options + end + + def handler_opts(options) + info = [] + server = Rackup::Handler.get(options[:server]) || Rackup::Handler.default + if server && server.respond_to?(:valid_options) + info << "" + info << "Server-specific options for #{server.name}:" + + has_options = false + server.valid_options.each do |name, description| + next if /^(Host|Port)[^a-zA-Z]/.match?(name.to_s) # ignore handler's host and port options, we do our own. + info << sprintf(" -O %-21s %s", name, description) + has_options = true + end + return "" if !has_options + end + info.join("\n") + rescue NameError, LoadError + return "Warning: Could not find handler specified (#{options[:server] || 'default'}) to determine handler-specific options" + end + end + + # Start a new rack server (like running rackup). This will parse ARGV and + # provide standard ARGV rackup options, defaulting to load 'config.ru'. + # + # Providing an options hash will prevent ARGV parsing and will not include + # any default options. + # + # This method can be used to very easily launch a CGI application, for + # example: + # + # Rack::Server.start( + # :app => lambda do |e| + # [200, {'content-type' => 'text/html'}, ['hello world']] + # end, + # :server => 'cgi' + # ) + # + # Further options available here are documented on Rack::Server#initialize + def self.start(options = nil) + new(options).start + end + + attr_writer :options + + # Options may include: + # * :app + # a rack application to run (overrides :config and :builder) + # * :builder + # a string to evaluate a Rack::Builder from + # * :config + # a rackup configuration file path to load (.ru) + # * :environment + # this selects the middleware that will be wrapped around + # your application. Default options available are: + # - development: CommonLogger, ShowExceptions, and Lint + # - deployment: CommonLogger + # - none: no extra middleware + # note: when the server is a cgi server, CommonLogger is not included. + # * :server + # choose a specific Rackup::Handler, e.g. cgi, fcgi, webrick + # * :daemonize + # if truthy, the server will daemonize itself (fork, detach, etc) + # if :noclose, the server will not close STDOUT/STDERR + # * :pid + # path to write a pid file after daemonize + # * :Host + # the host address to bind to (used by supporting Rackup::Handler) + # * :Port + # the port to bind to (used by supporting Rackup::Handler) + # * :AccessLog + # webrick access log options (or supporting Rackup::Handler) + # * :debug + # turn on debug output ($DEBUG = true) + # * :warn + # turn on warnings ($-w = true) + # * :include + # add given paths to $LOAD_PATH + # * :require + # require the given libraries + # + # Additional options for profiling app initialization include: + # * :heapfile + # location for ObjectSpace.dump_all to write the output to + # * :profile_file + # location for CPU/Memory (StackProf) profile output (defaults to a tempfile) + # * :profile_mode + # StackProf profile mode (cpu|wall|object) + def initialize(options = nil) + @ignore_options = [] + + if options + @use_default_options = false + @options = options + @app = options[:app] if options[:app] + else + @use_default_options = true + @options = parse_options(ARGV) + end + end + + def options + merged_options = @use_default_options ? default_options.merge(@options) : @options + merged_options.reject { |k, v| @ignore_options.include?(k) } + end + + def default_options + environment = ENV['RACK_ENV'] || 'development' + default_host = environment == 'development' ? 'localhost' : '0.0.0.0' + + { + environment: environment, + pid: nil, + Port: 9292, + Host: default_host, + AccessLog: [], + config: "config.ru" + } + end + + def app + @app ||= options[:builder] ? build_app_from_string : build_app_and_options_from_config + end + + class << self + def logging_middleware + lambda { |server| + /CGI/.match?(server.server.name) || server.options[:quiet] ? nil : [Rack::CommonLogger, $stderr] + } + end + + def default_middleware_by_environment + m = Hash.new {|h, k| h[k] = []} + m["deployment"] = [ + [Rack::ContentLength], + logging_middleware, + [Rack::TempfileReaper] + ] + m["development"] = [ + [Rack::ContentLength], + logging_middleware, + [Rack::ShowExceptions], + [Rack::Lint], + [Rack::TempfileReaper] + ] + + m + end + + def middleware + default_middleware_by_environment + end + end + + def middleware + self.class.middleware + end + + def start(&block) + if options[:warn] + $-w = true + end + + if includes = options[:include] + $LOAD_PATH.unshift(*includes) + end + + Array(options[:require]).each do |library| + require library + end + + if options[:debug] + $DEBUG = true + require 'pp' + p options[:server] + pp wrapped_app + pp app + end + + check_pid! if options[:pid] + + # Touch the wrapped app, so that the config.ru is loaded before + # daemonization (i.e. before chdir, etc). + handle_profiling(options[:heapfile], options[:profile_mode], options[:profile_file]) do + wrapped_app + end + + daemonize_app if options[:daemonize] + + write_pid if options[:pid] + + trap(:INT) do + if server.respond_to?(:shutdown) + server.shutdown + else + exit + end + end + + server.run(wrapped_app, **options, &block) + end + + def server + @_server ||= Handler.get(options[:server]) || Handler.default + end + + private + def build_app_and_options_from_config + if !::File.exist? options[:config] + abort "configuration #{options[:config]} not found" + end + + return Rack::Builder.parse_file(self.options[:config]) + end + + def handle_profiling(heapfile, profile_mode, filename) + if heapfile + require "objspace" + ObjectSpace.trace_object_allocations_start + yield + GC.start + ::File.open(heapfile, "w") { |f| ObjectSpace.dump_all(output: f) } + exit + end + + if profile_mode + require "stackprof" + require "tempfile" + + make_profile_name(filename) do |filename| + ::File.open(filename, "w") do |f| + StackProf.run(mode: profile_mode, out: f) do + yield + end + puts "Profile written to: #{filename}" + end + end + exit + end + + yield + end + + def make_profile_name(filename) + if filename + yield filename + else + ::Dir::Tmpname.create("profile.dump") do |tmpname, _, _| + yield tmpname + end + end + end + + def build_app_from_string + Rack::Builder.new_from_string(self.options[:builder]) + end + + def parse_options(args) + # Don't evaluate CGI ISINDEX parameters. + args.clear if ENV.include?(Rack::REQUEST_METHOD) + + @options = opt_parser.parse!(args) + @options[:config] = ::File.expand_path(options[:config]) + ENV["RACK_ENV"] = options[:environment] + @options + end + + def opt_parser + Options.new + end + + def build_app(app) + middleware[options[:environment]].reverse_each do |middleware| + middleware = middleware.call(self) if middleware.respond_to?(:call) + next unless middleware + klass, *args = middleware + app = klass.new(app, *args) + end + app + end + + def wrapped_app + @wrapped_app ||= build_app app + end + + def daemonize_app + # Cannot be covered as it forks + # :nocov: + Process.daemon(true, options[:daemonize] == :noclose) + # :nocov: + end + + def write_pid + ::File.open(options[:pid], ::File::CREAT | ::File::EXCL | ::File::WRONLY ){ |f| f.write("#{Process.pid}") } + at_exit { ::FileUtils.rm_f(options[:pid]) } + rescue Errno::EEXIST + check_pid! + retry + end + + def check_pid! + return unless ::File.exist?(options[:pid]) + + pid = ::File.read(options[:pid]).to_i + raise Errno::ESRCH if pid == 0 + + Process.kill(0, pid) + exit_with_pid(pid) + rescue Errno::ESRCH + ::File.delete(options[:pid]) + rescue Errno::EPERM + exit_with_pid(pid) + end + + def exit_with_pid(pid) + $stderr.puts "A server is already running (pid: #{pid}, file: #{options[:pid]})." + exit(1) + end + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/stream.rb b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/stream.rb new file mode 100644 index 0000000..137f8ca --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/stream.rb @@ -0,0 +1,199 @@ +# frozen_string_literal: true + +# Released under the MIT License. +# Copyright, 2023-2024, by Samuel Williams. + +module Rackup + # The input stream is an IO-like object which contains the raw HTTP POST data. When applicable, its external encoding must be “ASCII-8BIT” and it must be opened in binary mode, for Ruby 1.9 compatibility. The input stream must respond to gets, each, read and rewind. + class Stream + def initialize(input = nil, output = Buffered.new) + @input = input + @output = output + + raise ArgumentError, "Non-writable output!" unless output.respond_to?(:write) + + # Will hold remaining data in `#read`. + @buffer = nil + @closed = false + end + + attr :input + attr :output + + # This provides a read-only interface for data, which is surprisingly tricky to implement correctly. + module Reader + # rack.hijack_io must respond to: + # read, write, read_nonblock, write_nonblock, flush, close, close_read, close_write, closed? + + # read behaves like IO#read. Its signature is read([length, [buffer]]). If given, length must be a non-negative Integer (>= 0) or nil, and buffer must be a String and may not be nil. If length is given and not nil, then this method reads at most length bytes from the input stream. If length is not given or nil, then this method reads all data until EOF. When EOF is reached, this method returns nil if length is given and not nil, or “” if length is not given or is nil. If buffer is given, then the read data will be placed into buffer instead of a newly created String object. + # @param length [Integer] the amount of data to read + # @param buffer [String] the buffer which will receive the data + # @return a buffer containing the data + def read(length = nil, buffer = nil) + return '' if length == 0 + + buffer ||= String.new.force_encoding(Encoding::BINARY) + + # Take any previously buffered data and replace it into the given buffer. + if @buffer + buffer.replace(@buffer) + @buffer = nil + else + buffer.clear + end + + if length + while buffer.bytesize < length and chunk = read_next + buffer << chunk + end + + # This ensures the subsequent `slice!` works correctly. + buffer.force_encoding(Encoding::BINARY) + + # This will be at least one copy: + @buffer = buffer.byteslice(length, buffer.bytesize) + + # This should be zero-copy: + buffer.slice!(length, buffer.bytesize) + + if buffer.empty? + return nil + else + return buffer + end + else + while chunk = read_next + buffer << chunk + end + + return buffer + end + end + + # Read at most `length` bytes from the stream. Will avoid reading from the underlying stream if possible. + def read_partial(length = nil) + if @buffer + buffer = @buffer + @buffer = nil + else + buffer = read_next + end + + if buffer and length + if buffer.bytesize > length + # This ensures the subsequent `slice!` works correctly. + buffer.force_encoding(Encoding::BINARY) + + @buffer = buffer.byteslice(length, buffer.bytesize) + buffer.slice!(length, buffer.bytesize) + end + end + + return buffer + end + + def gets + read_partial + end + + def each + while chunk = read_partial + yield chunk + end + end + + def read_nonblock(length, buffer = nil) + @buffer ||= read_next + chunk = nil + + unless @buffer + buffer&.clear + return + end + + if @buffer.bytesize > length + chunk = @buffer.byteslice(0, length) + @buffer = @buffer.byteslice(length, @buffer.bytesize) + else + chunk = @buffer + @buffer = nil + end + + if buffer + buffer.replace(chunk) + else + buffer = chunk + end + + return buffer + end + end + + include Reader + + def write(buffer) + if @output + @output.write(buffer) + return buffer.bytesize + else + raise IOError, "Stream is not writable, output has been closed!" + end + end + + def write_nonblock(buffer) + write(buffer) + end + + def <<(buffer) + write(buffer) + end + + def flush + end + + def close_read + @input&.close + @input = nil + end + + # close must never be called on the input stream. huh? + def close_write + if @output.respond_to?(:close) + @output&.close + end + + @output = nil + end + + # Close the input and output bodies. + def close(error = nil) + self.close_read + self.close_write + + return nil + ensure + @closed = true + end + + # Whether the stream has been closed. + def closed? + @closed + end + + # Whether there are any output chunks remaining? + def empty? + @output.empty? + end + + private + + def read_next + if @input + return @input.read + else + @input = nil + raise IOError, "Stream is not readable, input has been closed!" + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/version.rb b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/version.rb new file mode 100644 index 0000000..199d03d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/version.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +# Released under the MIT License. +# Copyright, 2022-2023, by Samuel Williams. + +module Rackup + VERSION = "2.2.1" +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/license.md b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/license.md new file mode 100644 index 0000000..003f0ac --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/license.md @@ -0,0 +1,80 @@ +# MIT License + +Copyright, 2007-2009, by Leah Neukirchen. +Copyright, 2008, by Marc-André Cournoyer. +Copyright, 2009, by Aaron Pfeifer. +Copyright, 2009-2010, by Megan Batty. +Copyright, 2009-2010, by Michael Fellinger. +Copyright, 2009, by Genki Takiuchi. +Copyright, 2009, by Joshua Peek. +Copyright, 2009, by Yehuda Katz. +Copyright, 2009, by Carl Lerche. +Copyright, 2010, by Julik Tarkhanov. +Copyright, 2010-2016, by James Tucker. +Copyright, 2010, by Timur Batyrshin. +Copyright, 2010, by Loren Segal. +Copyright, 2010, by Andrew Bortz. +Copyright, 2010, by John Barnette. +Copyright, 2010, by John Sumsion. +Copyright, 2011-2018, by Aaron Patterson. +Copyright, 2011, by Konstantin Haase. +Copyright, 2011, by Blake Mizerany. +Copyright, 2011, by Tsutomu Kuroda. +Copyright, 2012, by Jean Boussier. +Copyright, 2012, by Trevor Wennblom. +Copyright, 2012, by Anurag Priyam. +Copyright, 2012, by Hrvoje Šimić. +Copyright, 2013, by Uchio Kondo. +Copyright, 2013, by Tim Moore. +Copyright, 2013, by Hal Brodigan. +Copyright, 2013, by Bas Vodde. +Copyright, 2013, by Joe Fiorini. +Copyright, 2014, by Wyatt Pan. +Copyright, 2014, by Lenny Marks. +Copyright, 2014, by Igor Bochkariov. +Copyright, 2014, by Max Cantor. +Copyright, 2014, by David Celis. +Copyright, 2014-2019, by Rafael França. +Copyright, 2014, by Jeremy Kemper. +Copyright, 2014, by Richard Schneeman. +Copyright, 2015, by Peter Wilmott. +Copyright, 2015, by Sean McGivern. +Copyright, 2015, by Tadashi Saito. +Copyright, 2015, by Martin Hrdlicka. +Copyright, 2015, by Zachary Scott. +Copyright, 2016, by Sophie Deziel. +Copyright, 2016, by Kazuya Hotta. +Copyright, 2017, by Ryunosuke Sato. +Copyright, 2017-2024, by Samuel Williams. +Copyright, 2018, by Dillon Welch. +Copyright, 2018, by Yoshiyuki Hirano. +Copyright, 2018, by Nick LaMuro. +Copyright, 2019, by Krzysztof Rybka. +Copyright, 2019, by Misaki Shioi. +Copyright, 2020-2022, by Jeremy Evans. +Copyright, 2021, by Katsuhiko Yoshida. +Copyright, 2021, by Kang Sheng. +Copyright, 2021, by Stephen Paul Weber. +Copyright, 2022, by Akira Matsuda. +Copyright, 2022, by Andrew Hoglund. +Copyright, 2024, by Olle Jonsson. +Copyright, 2024, by Geremia Taglialatela. +Copyright, 2024, by Petrik de Heus. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/readme.md b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/readme.md new file mode 100644 index 0000000..95f071b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/readme.md @@ -0,0 +1,64 @@ +# Rackup + +`rackup` provides a command line interface for running a Rack-compatible application. It also provides a generic interface for starting a `rack`-compatible server: `Rackup::Handler`. It is not designed for production use. + +[![Development Status](https://github.com/rack/rackup/workflows/Test/badge.svg)](https://github.com/rack/rackup/actions?workflow=Test) + +## Installation + +``` bash +-- For Puma +$ gem install rackup puma + +-- For Falcon +$ gem install rackup falcon +``` + +## Usage + +In a directory with your `config.ru` simply run the command: + +``` bash +$ rackup +``` + +Your application should now be available locally, typically `http://localhost:9292`. + +## (Soft) Deprecation + +For a long time, `rackup` (the executable and implementation) was part of `rack`, and `webrick` was the default server, included with Ruby. It made it easy to run a Rack application without having to worry about the details of the server - great for documentation and demos. + +When `webrick` was removed from the Ruby standard library, `rack` started depending on `webrick` as a default server. Every web application and server would pull in `webrick` as a dependency, even if it was not used. To avoid this, the `rackup` component of `rack` was moved to this gem, which depended on `webrick`. + +However, many libraries (e.g. `rails`) still depend on `rackup` and end up pulling in `webrick` as a dependency. To avoid this, the decision was made to cut `webrick` as a dependency of `rackup`. This means that `rackup` no longer depends on `webrick`, and you need to install it separately if you want to use it. + +As a consequence of this, the value of the `rackup` gem is further diminished. In other words, why would you do this: + +``` bash +$ gem install rackup puma +$ rackup ... +``` + +when you can do this: + +``` bash +$ gem install puma +$ puma ... +``` + +In summary, the maintainers of `rack` recommend the following: + + - Libraries should not depend on `rackup` if possible. `rackup` as an executable made sense when webrick shipped with Ruby, so there was always a fallback. But that hasn't been true since Ruby 3.0. + - Frameworks and applications should focus on providing `config.ru` files, so that users can use the webserver program of their choice directly (e.g. puma, falcon). + - There is still some value in the generic `rackup` and `Rackup::Handler` interfaces, but we encourage users to invoke the server command directly if possible. + - Webrick should be avoided if possible. + +## Contributing + +We welcome contributions to this project. + +1. Fork it. +2. Create your feature branch (`git checkout -b my-new-feature`). +3. Commit your changes (`git commit -am 'Add some feature'`). +4. Push to the branch (`git push origin my-new-feature`). +5. Create new Pull Request. diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/releases.md b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/releases.md new file mode 100644 index 0000000..5ec8c2b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/releases.md @@ -0,0 +1,24 @@ +# Releases + +All notable changes to this project will be documented in this file. For info on how to format all future additions to this file please reference [Keep A Changelog](https://keepachangelog.com/en/1.0.0/). + +## v2.2.0 + + - Remove old rack shims. + - Remove `webrick` dependency. + +## v2.1.0 + + - Correctly support streaming responses with `webrick`. + +## v2.0.0 + + - Initial release and migration of code from `rack`. + +## v1.0.1 + + - Fix `rackup.rb` invalid requires. + +## v1.0.0 + + - Initial release of empty shim for Rack v2. diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/security.md b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/security.md new file mode 100644 index 0000000..2a33a46 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/security.md @@ -0,0 +1,3 @@ +# Security Policy + +Please see our main security policy: https://github.com/rack/rack/security/policy diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/CONTRIBUTING.rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/CONTRIBUTING.rdoc new file mode 100644 index 0000000..d76eb6b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/CONTRIBUTING.rdoc @@ -0,0 +1,219 @@ += Developer Introduction + +So you want to write a generator, fix a bug, or otherwise work with RDoc. This +document provides an overview of how RDoc works from parsing options to +generating output. Most of the documentation can be found in the specific +classes for each feature. + +== Bugs + +If you think you found a bug, file a ticket on the {issues +tracker}[https://github.com/ruby/rdoc/issues] on github. + +If your bug involves an error RDoc produced please include a sample file that +illustrates the problem or link to the repository or gem that is associated +with the bug. + +Please include steps to reproduce the issue. Here are some examples of good +issues: + +* https://github.com/ruby/rdoc/issues/55 +* https://github.com/ruby/rdoc/issues/61 + +== Developer Quick Start + +RDoc uses bundler for development. To get ready to work on RDoc run: + + $ gem install bundler + [...] + $ bundle install + [...] + $ rake + [...] + +This will install all the necessary dependencies for development with rake, +generate documentation and run the tests for the first time. + +If the tests don't pass on the first run check the {GitHub Actions page}[https://github.com/ruby/rdoc/actions] to see if there are any known failures +(there shouldn't be). + +You can now use `rake` and `autotest` to run the tests. + +Note: the `rake` command must be used first before running any tests, because +it's used to generate various parsers implemented in RDoc. Also `rake clean` is +helpful to delete these generated files. + +== Glossary + +Here are definitions for some common terms in the RDoc documentation. The +list also briefly describes how the components of RDoc interact. + +parser:: + Parses files and creates a documentation tree from the contents. + +documentation tree:: + The documentation tree represents files, classes, modules, methods, + constants, includes, comments and other ruby syntax features as a tree. + RDoc walks this tree with a generator to create documentation. + +generator:: + Walks the documentation tree and generates output. + + RDoc ships with two generators, the Darkfish generator creates HTML and the + RI generator creates an RI data store. + +markup parser:: + Parses comments from a file into a generic markup tree. + + The markup parsers allow RDoc to handle RDoc, TomDoc, rd and Markdown format + documentation with common formatters. + +markup tree:: + Each parsed comment has a markup tree that represents common markup items + such as headings, paragraphs, lists or verbatim text sections for example + code or output. + + A generator uses a formatters to walks the tree to create output. Some + generators use multiple formatters on a markup tree to produce the output. + +formatter:: + Converts a parsed markup tree into some form other form of markup. + + Formatters can either produce a one-to-one conversion, such as ToHtml, or + extract part of the parsed result, such as ToHtmlSnippet which outputs the + first 100 characters as HTML. + +== Plugins + +When 'rdoc/rdoc' is loaded RDoc looks for 'rdoc/discover' files in your +installed gems. This can be used to load parsers, alternate generators, or +additional preprocessor directives. An rdoc plugin layout should look +something like this: + + lib/rdoc/discover.rb + lib/my/rdoc/plugin.rb + # etc. + +In your rdoc/discover.rb file you will want to wrap the loading of your plugin +in an RDoc version check like this: + + begin + gem 'rdoc', '~> 3' + require 'my/rdoc/plugin' + rescue Gem::LoadError + end + +=== Plugin Types + +In RDoc you can change the following behaviors: + +* Add a parser for a new file format +* Add a new output generator +* Add a new markup directive +* Add a new type of documentation markup +* Add a new type of formatter + +All of these are described below + +== Option Parsing + +Option parsing is handled by RDoc::Options. When you're writing a generator +you can provide the user with extra options by providing a class method ++setup_options+. The option parser will call this after your generator is +loaded. See RDoc::Generator for details. + +== File Parsing + +After options are parsed, RDoc parses files from the files and directories in +ARGV. RDoc compares the filename against what each parser claims it can parse +via RDoc::Parser#parse_files_matching. For example, RDoc::Parser::C can parse +C files, C headers, C++ files, C++ headers and yacc grammars. + +Once a matching parser class is found it is instantiated and +scan+ is called. +The parser needs to extract documentation from the file and add it to the RDoc +document tree. Usually this involves starting at the root and adding a class +or a module (RDoc::TopLevel#add_class and RDoc::TopLevel#add_module) and +proceeding to add classes, modules and methods to each nested item. + +When the parsers are finished the document tree is cleaned up to remove +dangling references to aliases and includes that were not found (and may exist +in a separate library) through RDoc::ClassModule#complete. + +To write your own parser for a new file format see RDoc::Parser. + +=== Documentation Tree + +The parsers build a documentation tree that is composed of RDoc::CodeObject and +its subclasses. There are various methods to walk the tree to extract +information, see RDoc::Context and its subclasses. + +Within a class or module, attributes, methods and constants are divided into +sections. The section represents a functional grouping of parts of the class. +TomDoc uses the sections "Public", "Internal" and "Deprecated". The sections +can be enumerated using RDoc::Context#each_section. + +== Output Generation + +An RDoc generator turns the documentation tree into some other kind of output. +RDoc comes with an HTML generator (RDoc::Generator::Darkfish) and an RI +database generator (RDoc::Generator::RI). The output a generator creates does +not have to be human-readable. + +To create your own generator see RDoc::Generator. + +=== Comments + +In RDoc 3.10 and newer the comment on an RDoc::CodeObject is now an +RDoc::Comment object instead of a String. This is to support various +documentation markup formats like rdoc, TomDoc and rd. The comments are +normalized to remove comment markers and remove indentation then parsed lazily +via RDoc::Comment#document to create a generic markup tree that can be +processed by a formatter. + +To add your own markup format see RDoc::Markup@Other+directives + +==== Formatters + +To transform a comment into some form of output an RDoc::Markup::Formatter +subclass is used like RDoc::Markup::ToHtml. A formatter is a visitor that +walks a parsed comment tree (an RDoc::Markup::Document) of any format. To help +write a formatter RDoc::Markup::FormatterTestCase exists for generic parsers, +and RDoc::Markup::TextFormatterTestCase which contains extra test cases for +text-type output (like +ri+ output). + +RDoc ships with formatters that will turn a comment into HTML, rdoc-markup-like +text, ANSI or terminal backspace highlighted text, HTML, cross-referenced HTML, +an HTML snippet free of most markup, an HTML label for use in id attributes, a +table-of-contents page, and text with only code blocks. + +The output of the formatter does not need to be text or text-like. +RDoc::Markup::ToLabel creates an HTML-safe label for use in an HTML id +attribute. A formatter could count the number of words and the average word +length for a comment, for example. + +==== Directives + +For comments in markup you can add new directives (:nodoc: is a directive). +Directives may replace text or store it off for later use. + +See RDoc::Markup::PreProcess::register for details. + +=== JSONIndex + +RDoc contains a special generator, RDoc::Generator::JSONIndex, which creates a +JSON-based search index and includes a search engine for use with HTML output. +This generator can be used to add searching to any HTML output and is designed +to be called from inside an HTML generator. + +== Markup + +Additional documentation markup formats can be added to RDoc. A markup +parsing class must respond to \::parse and accept a String argument containing +the markup format. An RDoc::Document containing documentation items +(RDoc::Markup::Heading, RDoc::Markup::Paragraph, RDoc::Markup::Verbatim, etc.) +must be returned. + +To register the parser with rdoc, add the markup type's name and class to the +RDoc::Text::MARKUP_FORMAT hash like: + + RDoc::Text::MARKUP_FORMAT['rdoc'] = RDoc::Markup diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/CVE-2013-0256.rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/CVE-2013-0256.rdoc new file mode 100644 index 0000000..b285b6a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/CVE-2013-0256.rdoc @@ -0,0 +1,49 @@ += RDoc 2.3.0 through 3.12 XSS Exploit + +RDoc documentation generated by rdoc 2.3.0 through rdoc 3.12 and prereleases up +to rdoc 4.0.0.preview2.1 are vulnerable to an XSS exploit. This exploit may +lead to cookie disclosure to third parties. + +The exploit exists in darkfish.js which is copied from the RDoc install +location to the generated documentation. + +RDoc is a static documentation generation tool. Patching the library itself +is insufficient to correct this exploit. Those hosting rdoc documentation will +need to apply the following patch. If applied while ignoring whitespace, this +patch will correct all affected versions: + + diff --git darkfish.js darkfish.js + index 4be722f..f26fd45 100644 + --- darkfish.js + +++ darkfish.js + @@ -109,13 +109,15 @@ function hookSearch() { + function highlightTarget( anchor ) { + console.debug( "Highlighting target '%s'.", anchor ); + + - $("a[name=" + anchor + "]").each( function() { + - if ( !$(this).parent().parent().hasClass('target-section') ) { + - console.debug( "Wrapping the target-section" ); + - $('div.method-detail').unwrap( 'div.target-section' ); + - $(this).parent().wrap( '
' ); + - } else { + - console.debug( "Already wrapped." ); + + $("a[name]").each( function() { + + if ( $(this).attr("name") == anchor ) { + + if ( !$(this).parent().parent().hasClass('target-section') ) { + + console.debug( "Wrapping the target-section" ); + + $('div.method-detail').unwrap( 'div.target-section' ); + + $(this).parent().wrap( '
' ); + + } else { + + console.debug( "Already wrapped." ); + + } + } + }); + }; + +RDoc 3.9.5, 3.12.1 and RDoc 4.0.0.rc.2 and newer are not vulnerable to this +exploit. + +This exploit was discovered by Evgeny Ermakov . + +This vulnerability has been assigned the CVE identifier CVE-2013-0256. + diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/ExampleMarkdown.md b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/ExampleMarkdown.md new file mode 100644 index 0000000..fd4359f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/ExampleMarkdown.md @@ -0,0 +1,39 @@ +# Example Markdown + +This document contains example output to show RDoc styling. This file was +created from a Markdown file. + +For the following styles, see ExampleRDoc.rdoc for style examples: + +* Headings +* Paragraphs +* Code blocks (verbatim sections) +* Definition lists +* Ordered lists +* Unordered lists + +These items all use the same styles as RDoc format files. + +## Footnotes + +Footnotes are rendered at the bottom of the documentation section[^1]. For +pages this will be at the bottom of the page. For method documentation this +will be at the end of the current method. + +[^1]: Here is the footnote content. As you can see it is at the bottom of the +page. + +## Blockquotes + +Here is how a blockquote looks. + +> We finished our first sensor sweep of the neutral zone. Now, how the hell do +> we defeat an enemy that knows us better than we know ourselves? and attack +> the Romulans. +> +> > Sorry, Data. I guess it's better to be lucky than good. The unexpected is +> > our normal routine. Could someone survive inside a transporter buffer for +> > 75 years? + +This text is from [Riker Ipsum](http://rikeripsum.com) + diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/ExampleRDoc.rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/ExampleRDoc.rdoc new file mode 100644 index 0000000..b5dd68c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/ExampleRDoc.rdoc @@ -0,0 +1,210 @@ += Example \RDoc + +This document contains example output to show RDoc styling. This file was +created from a RDoc Markup file. + +== Headings + +You should not use headings beyond level 3, it is a sign of poor organization +of your code or documentation. It also becomes difficult for the user to +figure out what you are attempting to explain to them as they have to track +the multiple layers of nesting. + += Heading level 1 + +Above is a level one heading. + +These paragraphs are filler that exist so you can see how the heading +interacts with paragraphs before and after the heading. As you can see each +different heading has a different amount of margin above and below. + +This should be sufficient to give you a proper picture of how it will appear in +your documentation. + +== Heading level 2 + +Above is a level two heading. + +These paragraphs are filler that exist so you can see how the heading +interacts with paragraphs before and after the heading. As you can see each +different heading has a different amount of margin above and below. + +This should be sufficient to give you a proper picture of how it will appear in +your documentation. + +=== Heading level 3 + +Above is a level three heading. + +These paragraphs are filler that exist so you can see how the heading +interacts with paragraphs before and after the heading. As you can see each +different heading has a different amount of margin above and below. + +This should be sufficient to give you a proper picture of how it will appear in +your documentation. + +==== Heading level 4 + +Above is a level four heading. + +These paragraphs are filler that exist so you can see how the heading +interacts with paragraphs before and after the heading. As you can see each +different heading has a different amount of margin above and below. + +This should be sufficient to give you a proper picture of how it will appear in +your documentation. + +===== Heading level 5 + +Above is a level five heading. + +These paragraphs are filler that exist so you can see how the heading +interacts with paragraphs before and after the heading. As you can see each +different heading has a different amount of margin above and below. + +This should be sufficient to give you a proper picture of how it will appear in +your documentation. + +====== Heading level 6 + +Above is a level six heading. + +These paragraphs are filler that exist so you can see how the heading +interacts with paragraphs before and after the heading. As you can see each +different heading has a different amount of margin above and below. + +This should be sufficient to give you a proper picture of how it will appear in +your documentation. + +== Paragraphs + +This is how a paragraph looks. Since it is difficult to generate good content +for paragraphs I have chosen to use {Riker Ipsum}[http://rikeripsum.com] for +nonsense filler content. In the previous sentence you can see how a link is +formatted. + +Here is an example of *bold* and _emphasis_ styling. Try not to combine the +two or use them too often. Here is an example of inline verbatim +text. That should be enough of a taste of inline markup in paragraphs. +The Riker Ipsum filler follows: + +Shields up! Rrrrred alert! Well, I'll say this for him - he's sure of himself. +and attack the Romulans. Worf, It's better than music. It's jazz. This should +be interesting. When has justice ever been as simple as a rule book? Flair is +what marks the difference between artistry and mere competence. + +Sorry, Data. I think you've let your personal feelings cloud your judgement. We +finished our first sensor sweep of the neutral zone. Yes, absolutely, I do +indeed concur, wholeheartedly! Mr. Worf, you do remember how to fire phasers? A +lot of things can change in twelve years, Admiral. Your shields were failing, +sir. + +== Verbatim sections + +A verbatim section typically contains source code or example output. This is +how verbatim blocks of code looks: + + def local responder + responder.ping do |value| + return value + end + end + + def ping uri + @uri = uri + @remote = DRb::DRbObject.new_with_uri @uri + + @remote.ping do |value| + return value + end + end + +This is a paragraph following the verbatim block so you can see how leading and trailing paragraphs interact with it. + +== Unordered lists + +Here is an unordered list. As you can see it uses non-numeral markers for each list item: + +* This is the top-most item in the list. +* This is a second item in the list. + + Unlike the first item, this item has more than one paragraph so you can see + how they interact. +* This is a third item in the list. Like the item before it, this item has a + second paragraph. + + Here is the second paragraph in the list item. +* A final list item. + +== Ordered lists + +Here is an ordered list. As you can see it uses numeral markers for each list +item: + +1. This is the first item in the list. +1. This is the second item in the list. + + Unlike the first item, this item has more than one paragraph so you can see + how they interact. +1. This is the third item in the list. Like the item before it, this item has + a second paragraph. + + Here is the second paragraph in the third list item. +1. The fourth and final list item. + +== Definition lists + +=== "Note" list + +The "note" syntax can be used to create a definition list: + + note:: + description + +Here is such a definition list: + +cat:: + A cat is a small mammal that is commonly kept as a pet. + +dog:: + A dog is a mammal that is also kept as a pet. A dog may range in size from + smaller than a cat to larger than a human. + + Typically dogs are easier to train to respond to commands than cats. + +rabbit:: + Rabbits are also mammals, but are infrequently kept as pets. Most rabbits + are wild. + +=== "Label" list + +The "label" syntax can be used to create a definition list: + + [label] + description + +Here is such a definition list: + +[cat] + A cat is a small mammal that is commonly kept as a pet. + +[dog] + A dog is a mammal that is also kept as a pet. A dog may range in size from + smaller than a cat to larger than a human. + + Typically dogs are easier to train to respond to commands than cats. + +[rabbit] + Rabbits are also mammals, but are infrequently kept as pets. Most rabbits + are wild. + +== Rule + +A rule is a horizontal divider between two paragraphs. Following this +paragraph is a rule. + +--- + +In historic versions of RDoc you could control the height of the rule in HTML +output. This is no longer true as HTML 5 does not support this. + diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/History.rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/History.rdoc new file mode 100644 index 0000000..deb8c77 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/History.rdoc @@ -0,0 +1,1668 @@ += History + +== 5.1.0 / 2017-02-24 + +* Bug fixes + * Fix an issue that rdoc fails when running on Windows with RUBYOPT=-U. + PR #430 by Toshihiko Ichida + +* Minor enhancements + * Parse ruby 2.1 def. PR #436 by Akira Matsuda. + * Suppress warnings in eval. PR #440 by Nobuyoshi Nakada. + +== 5.0.0 / 2016-11-05 + +* Major enhancements + * Cleanup deprecated code targeted Ruby 1.8 + +* Bug fixes + * Ensure badge data is included in result of JsonIndex template. + * Ensure items in the nil section are displayed in HTML output. Issue #399 + by Daniel Svensson. + * Parse rb_intern_const correctly in C. PR #381 by Sho Hashimoto. + * Fix broken assets caused by #335 when serving ri. PR #360 by Alex Wood. + * Don't try to parse svg files. Issue #350 by Sigurd Svela. + +* Minor enhancements + * Improve class name expansion/resolution in ri. PR #400 by NARUSE, Yui + * Improve performance of document generation. PR #397 by Yusuke Endoh. + +== 4.3.0 / 2016-11-04 + +* Minor enhancements + * Removed json dependency for Ruby 2.4.0 + * End to support Ruby 1.8.x + +== 4.2.2 / 2016-02-09 + +* Bug fixes + * Include lib/rdoc/generator/pot/* in built gem + + +== 4.2.1 / 2015-12-22 + +* Bug fixes + * Fixed infinite loop with CR #339 by @nobu + * Allow rdoc run with --disable-gems #340 by @luizluca + * Don't store full path in GZipped js files #341 by @voxik + * Fix relative path names for drive letters #367 by @nobu + * Fix for valid syntax `class C end` parsing #368 by @nobu + + +== 4.2.0 / 2014-12-06 + +* Major enhancements + * RDoc can now produce translation files for use with gettext. See + RDoc::Generator::POT for a workflow for creating translations of your + documentation. Pull request #254 by Kouhei Sutou. + +* Minor enhancements + * RDoc now allows any single-word macro before a C method implementation. + Issue #722 by Hanmac. + * Now :all is a synonym for :private for RDoc::Options#visibility= to match + the --all command line option. Pull request #276 by Zachary Scott. + * Running rake for the first time now installs racc. Pull request #285 by + Kouhei Sutou. + * Added -h flag to also display help. Issue #300 by Ryan Davis + * search_index.js is now loaded asynchronously for improved performance. + * Allow +X::Y+ as typewriter text. Issue #319, pull request #322 by Jeremy + Evans. + * Added RDoc::RI::Task for building ri data easily through rake. Pull + request #332 by Zachary Scott. + * A gzipped search index is generated for servers configured to use + precompressed files. Pull request #334 by Zachary Scott. + * CSS files now live under /css relative to the document root. Pull request + #335 by Zachary Scott. + * Improved detection of valid ruby in verbatim sections. Pull request #333 + by Jeremy Evans. + +* Bug fixes + * Fixed HTML labels for cross-browser compatibility. This breaks existing + links but enables cross-browser compatibility. Pull request #330 by Jens + Will. + * RDoc handles ASCII-incompatible encodings now. An encoding hint may need + to be added to the file for RDoc to produce correct output, though. + Issue #288 by Manuel Meurer. + * Fixed height recalculation issues when headings are hovered. Issue #289 + by Dietmar H. Büto. + * RDoc now ignores its own output directories. Pull Request #306 by + Hsing-Hui Hsu, bug #305 by Ryan Davis. + * Fixed RDoc::Task no longer uselessly builds documentation when generating + non-HTML output. Bug #307 by Christina Thompson, pull request #308 by + Hsing-Hui Hsu + * Added pointer to font copyright and license information to LEGAL.rdoc. + Issue #290 by Christian Hofstaedtler. + * Fixed RDoc::Context#<=> for ruby trunk. Issue #284 by Hanmac, pull + request #287 by Aaron Patterson + * Tests no longer create directories inside test/. Pull request #286 by + Kouhei Sutou. + * Fixed documentation example in RDoc::Markup. Pull request #292 by Gregory + Brown. + * Applied typo fix to RDoc::Markup. Pull request #297 by @montanalow + * Fixed pretty_print for RDoc::MethodAttr with an alias. Pull request #324 + by Hsing-Hui Hsu. + * Fixed lexing of %w"". Issue #315 by Thierry Lambert, pull request #323 by + Jeremy Evans. + * RDoc::TokenStream now removes nil tokens. Pull request #318 by Calle + Erlandsson. + * Fixed footer links to rubyforge and darkfish. Pull request #328 by + @blackwinter + * Fixed page-top link. Pull request #329 by @blackwinter + * Minitest gem activation failures are now ignored during test startup. + Issue #313 by Vít Ondruch. + * Fixed error when generating documentation from singleton classes. Issue + #311 by Vít Ondruch. + * Splat and keyword params can now be detected for documentation + completeness. Issue #321 Tom Kadwill. + * Standalone anchors in markdown documents are no longer escaped. Issue + #312 by Scott Thompson. + * Fixed RegExp matching stack overflow on Ruby 1.8.7. Issue #327 by sshao. + +== 4.1.2 / 2014-09-05 + +* Bug fixes + * Updated vendored jQuery to 1.6.4. Bug ruby/ruby#711 by @neuralme + +== 4.1.1 / 2014-01-09 + +* Bug fixes + * Fixed reporting of undocumented method parameters when including when + yield and &block are present. Pull request #281 by Victor Bilyk. + * Fixed merging of rd-style and hash-style comments at the top of a file. + Bug #266 by Zachary Scott. + * Fixed Document-attr in the C parser. Bug #271 by Hanmac. + * Removed duplicated condition in superclass fixup. Pull request #282 by + Benoit Daloze. + +== 4.1.0 / 2013-12-26 + +* Notable changes + * Improved accessibility of HTML output. Accessibility review was provided + by: + + Techvision – http://www.techvision.net.in + + The accessibility consultants in Pune, India + + * The look of RDoc has been updated. + +* Minor enhancements + * RDoc can now link to [], []=, << and >> methods. Pull request #202 by + Jeremy Evans, Bug # 191 by by Zachary Scott. + * Added RDoc::Options#output_decoration which controls header labels for + HTML output. Pull Request #199 by Zachary Scott. + * Added --template-stylesheets options to RDoc to allow specification of + alternate stylesheets. Pull request #205 by Zachary Scott. + * Improved performance of the Markdown and RD parsers. Pull request #217 by + Ryan Davis. + * rdoc -v now prints the version instead of enabling verbose + mode. Pull request #201 by Lee Jarvis. + * Running rake newb now automatically installs development + dependencies if the parser files haven't been built. Pull request #235 by + Kouhei Sutou. + * Moved old DEVELOPERS file to CONTRIBUTING to match github conventions. + * TomDoc output now has a "Returns" heading. Issue #234 by Brian Henderson + * Metaprogrammed methods can now use the :args: directive in addition to the + :call-seq: directive. Issue #236 by Mike Moore. + * Sections can be linked to using "@" like labels. If a section and a label + have the same name the section will be preferred. Issue #233 by Brian + Henderson. + * Files that come with a template are hard-linked to save space. Issue #186 + by Vít Ondruch. + +* Bug fixes + * Applied typo fixes by @dvsuresh from ruby/ruby@2c5dcdf + * Restored behavior of --no-pager alias -T. Pull request #223 by ruafozy. + * Fixed extra whitespace output in the rdoc coverage report. Bug #210 by + Ryan Davis. + * RDoc no longer documents its timestamp file when run on an empty + directory. Bug #212 by Rainer Keller + * HTML escape method names in the table of contents. Bug #219 by Akinori + MUSHA. + * Character literals ?h now create a new token type to prevent + loss of the "?" in output. Bug #220 by Vipul A M. + * When looking up a method that does not exist, ri escapes the regular + expression for fallback searches. Bug #227 by Aaron Patterson. + * The ri generator now writes the class method data after +module_function+. + Bug #222 by Zachary Scott, Ruby bug #8225 by David Unric. + * ri now handles missing ri data files. Bug #222 by Zachary Scott, Ruby bug + #8225 by David Unric. + * Added TomDoc to the supported markup formats section of rdoc --help. + Bug #214 by Ryan Davis. + * Fixed documented? check for classes which indicated incorrect 100% + coverage. Bug #211 by Ryan Davis. + * An :enddoc: at the top level stops all further parsing. Bug #213 by Ryan + Davis. + * Improved handling of multiline call-seq. Bug #207 by Erik Hollensbe. + * Fixed text that is missing whitespace for TomDoc. Bug #248 by Noel Cower. + * The RDoc methods now store the method they are aliased to. Bug #206 by + Jeremy Stephens. + * Fixed parsing of multiple methods on the same line. Bug #221 by derula. + * Fixed missing support for images in markdown. Bug #241, pull request #242 + by Zachary Scott. + * The markdown image fix also added support for images via an rdoc-image: + scheme. See RDoc::Markup@Links for details. Issue #93 by Tim Pease. + * Ignore empty call-seq for methods. Improved deduplication of C methods + sharing the same C function. This allows the method heading to show + up correctly for String#== and #===. Bug #244 by Neurogami. + * RDoc no longer adds "http://" to urls without a scheme. Bug #208 by + Zachary Scott. + * Improved the error message in the RDoc server when ri data is missing. + Bug #243, Pull Request #249 by Tadas Tamošauskas. + * Support ruby 2.0 hash syntax for keywords. Bug #256 by diogocsc. + * Prevent \\ from escaping the tag in RDoc markup. (\ still + escapes the tag.) Bug #251 by Pablo Bianciotto. + * Fixed lexing of escaped characters in strings which could cause + duplication of the final characters in source code view. Bug #252 by Mike + Stok. + * Disallow invalid tab widths for -w option. Bug reported by Charles + Hixson. + * rb_file_const() now adds constants to File::Constants when used outside + file.c. Fixes missing File::Constants::FNM_* constants in ruby. + * Fixed handling of :markup: when the file parser is unknown. Issue #262 by + Brian Henderson, pull request #269 by Rein Henrichs. + * Regexp options are no longer stripped in HTML output. Bug #259 by Zachary + Scott, Pull request #265 by Rein Henrichs + +== 4.0.1 / 2013-03-27 + +* Bug fixes + * RDoc::Options parser should rescue from OptionParser::ParseError. + * Updated example of RDoc::Options to include reopening RDoc::Options. + Pointed out by Michael Granger + * Moved RubyGems documentation installed message into RDoc hook. For + RubyGems bug #469 by Jeff Sandberg + * An Error is now raised when a heredoc is not terminated. Fixes exceptions + when processing comment blocks. Reported by darix + * rdoc --quiet --no-ignore-invalid now exits for invalid options. Pull + request #192 by Jeremy Evans + * RDoc::Parser::C no longer ignores a (METHOD) cast in rb_define_method. + Pull request #184 by Carlos Agarie + * RDoc::Servlet no longer ignores extra directories from -d. Pull request + #173 by Thomas Leitner + * Fixed `rdoc --ri-site`. Bug #193 by Michal Papis. + * RDoc no longer attempts to parse binary files. Bug #189 by postmodern, + Bug #190 by Christoffer Lervåg, Bug #195 by Aaron Patterson + * `rdoc --pipe` output now contains for markdown compliance. + * RDoc no longer leaves emacs-style modelines in .txt, .md or .rd files. + Bug #178 by Zachary Scott + * RDoc no longer puts raw markup in HTML output for markdown input. Bug + #204 by Erik Hollensbe + * Code objects with nodoc are no longer included in the ri store. Bug #177 + by Thomas Leitner. + * Text#snippet now creates a RDoc::Markup::ToHtmlSnippet correctly. + * The C parser now de-duplicates call-seq if the same C function is used for + multiple method names. Bug #203 by Pete Higgins + +== 4.0.0 / 2013-02-24 + +RDoc 4.0 includes several new features and several breaking changes. The +changes should not affect users of `rdoc` or `ri`. + +Notable feature additions are markdown support and an WEBrick servlet that can +serve HTML from an ri store. (This means that RubyGems 2.0+ no longer needs +to build HTML documentation when installing gems.) + +Changes since RDoc 3.12.1: + +* Breaking changes + * The default output encoding for RDoc is now UTF-8. Previously RDoc used + the default external encoding which was determined from your locale. + Issue #106 by Justin Baker. + * RDoc::RI::Store is now RDoc::Store so ri data generated by RDoc 4 cannot + be read by earlier versions of RDoc. RDoc::RI::Store exists as an alias + of RDoc::Store so ri data from older versions can still be read. + RDoc::RI::Store will be removed in RDoc 5. + + Tests that create RDoc::CodeObjects on the fly without wiring them into + the documentation tree (did not use add_class, add_method, etc.) must be + updated to use these methods. The documentation tree automatically + attaches them to the store instance which allows lookups to work + correctly. Additionally, a new method RDoc::Store#add_file must be used + instead of RDoc::TopLevel.new. The latter will not be attached to the + documentation tree. + * RDoc generators must accept an RDoc::Store and an RDoc::Options in + initialize. RDoc no longer passes an Array of RDoc::TopLevel objects to + #generate. Use RDoc::Store#all_files instead. + * Some markup formatters (RDoc::Markup::To*) now accept an RDoc::Options + instance as the first argument. Notably, the base class Formatter and + ToHtml*. (This is not universal due to the difficult at accessing the + user's options instance deep inside RDoc. A future major release may + remedy this.) + * Added new markup nodes and specials that RDoc::Markup::Formatter + subclasses must handle. If you're using RDoc::Markup::FormatterTestCase + the new methods you need to add should be readily apparent. + * Removed RDoc::RI::Paths::SYSDIR and ::SITEDIR. These were hidden + constants so no breakage is expected. Use RDoc::RI::Paths::system_dir + and ::site_dir instead. + * RDoc::RI::Store#modules has been renamed to RDoc::Store#module_names + to avoid confusion with RDoc::Store#all_modules imported from + RDoc::TopLevel. + * RDoc::RDocError has been removed. It was deprecated throughout RDoc 3. + * ri -f html is no longer supported. + * Comment definitions in C comments are now only discovered from the first + line. A colon on a subsequent line won't trigger definition extraction. + Issue #103, see also + http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/42942 + * Fixed :stopdoc: for class A::B where A has not been seen. Issue #95 by + Ryan Davis + * RDoc::ClassModule#each_ancestor no longer yields itself if there is + circular ancestry + +* Major enhancements + * ri can now show pages (README, etc.) + + ri rdoc:README + + Will show the README for the latest version of RDoc. You can specify + exact gem versions such as "rdoc-4.0:README" or view pages from the + standard library documentation with "ruby:README". + + RDoc 3 did not save pages in ri data so you will need to regenerate + documentation from your gems to use this feature. + * Added Markdown as a supported format. The markdown format can be set on a + per-file or per-comment basis with the +:markdown:+ directive like the rd + and tomdoc formats and on a per-project basis with + rdoc --markup markdown --write-options + * Removed global state from RDoc. RDoc::Store holds the documentation tree + and connects the driver to the parsers and generator. This also allows + documentation parsing and generation for multiple instances, but the rdoc + command-line tool does not support this. + + Due to this change RDoc::RDoc.current and RDoc::RDoc.reset no longer + exist. + +* Minor enhancements + * Added --page-dir option to give pretty names for a FAQ, guides, or other + documentation you write that is not stored in the project root. For + example, with the following layout: + + README.txt + guides/syntax.txt + guides/conversion.txt + + Running `rdoc --page-dir guides` will make the files in "guides" appear to + be at the top level of the project. This means they will appear to exist + at the top level in HTML output and you can access them with + `ri your_gem:syntax` and `ri your_gem:conversion`. + * Added --root for building documentation from outside the source dir. + * Added current heading and page-top links to HTML headings. + * Added a ChangeLog parser. It automatically parses files that begin + with 'ChangeLog' + * Added a table of contents to the sidebar. + * RDoc markup format merges adjacent labels in a label or note list into a + single definition list item for output. + * RDoc now tracks use of extend. Pull request #118 by Michael Granger. + * RDoc now tracks methods that use super. Pull request #116 by Erik + Hollensbe. + * Added methods ::system_dir, ::site_dir, ::home_dir and ::gem_dir to fetch + the components of RDoc::RI::Paths.path individually. + * Added support for rb_file_const. + * RDoc now processes files in sorted order. Issue #71 by Vít Ondruch + * RDoc now warns with --verbose when methods are duplicated. Issue #71 by + Vít Ondruch + * ri will display documentation for all methods in a class if -a is given. + Issue #57 by casper + * The RDoc coverage report will report line information for attributes, + constants and methods missing documentation. Issue #121 by Zachary Scott + * RDoc now reports a warning for files that are unreadable due to + permissions problems. + * RDoc controls documentation generation for RubyGems 2.0+ + +* Bug fixes + * Fixed parsing of multibyte files with incomplete characters at byte 1024. + Ruby bug #6393 by nobu, patch by Nobuyoshi Nakada and Yui NARUSE. + * Fixed rdoc -E. Ruby Bug #6392 and (modified) patch by Nobuyoshi Nakada + * Added link handling to Markdown output. Bug #160 by burningTyger. + * Fixed HEREDOC output for the limited case of a heredoc followed by a line + end. When a HEREDOC is not followed by a line end RDoc is not currently + smart enough to restore the source correctly. Bug #162 by Zachary Scott. + * Fixed parsing of executables with shebang and encoding comments. Bug #161 + by Marcus Stollsteimer + * RDoc now ignores methods defined on constants instead of creating a fake + module. Bug #163 by Zachary Scott. + * Fixed ChangeLog parsing for FFI gem. Bug #165 by Zachary Scott. + * RDoc now links \#== methods. Bug #164 by Zachary Scott. + * Allow [] following argument names for TomDoc. Bug #167 by Ellis Berner. + * Fixed the RDoc servlet for home and site directories. Bug #170 by Thomas + Leitner. + * Fixed references to methods in the RDoc servlet. Bug #171 by Thomas + Leitner. + * Fixed debug message when generating the darkfish root page. Pull Request + #174 by Thomas Leitner. + * Fixed deletion of attribute ri data when a class was loaded then saved. + Issue #171 by Thomas Leitner. + * Fully qualified names for constants declared from the top level are now + attached to their class or module properly. + * Fixed table of contents display in HTML output for classes and modules. + * Incremental ri builds of C files now work. C variable names from previous + runs are now saved between runs. + * A word that is directly followed by a multi-word tidy link label no longer + disappears. (Like text{link}[http://example]) + * Fixed legacy template support. Pull Request #107 by Justin Baker. + * An HTML class in a verbatim section no longer triggers ruby parsing. + Issue #92 by Vijay Dev + * Improved documentation for setting the default documentation format for + your ruby project. Issue #94 by Henrik Hodne + * Fixed handling of LANG in the RDoc::Options tests. Issue #99 by Vít + Ondruch + * RDoc no longer quits when given an entry that is not a file or directory. + Issue #101 by Charles Nutter + * Fixed bug in syntax-highlighting that would corrupt regular expressions. + Ruby Bug #6488 by Benny Lyne Amorsen. + * "class Object" no longer appears in the coverage report if all its methods + are documented. This suppresses a false positive for libraries that add + toplevel methods. Pull Request #128 by Zachary Scott. + * Fixed test_gen_url test name in TestRDocMarkupToHtml. Pull Request #130 + by Zachary Scott. + * Comment-defined methods ahead of define_method are now discovered. Issue + #133 by eclectic923 + * Fixed detection of define_method documentation. Issue #138 by Marvin + Gülker. + * Fixed lexing of character syntax (?z). Reported by Xavier + Noria. + * Add license to gem spec. Issue #144 by pivotalcommon + * Fixed comment selection for classes. Pull request #146 by pioz + * Fixed parsing of def self.&() end. Issue #148 by Michael + Lucy + * Generated RD parser files are now included in the gem. Issue #145 by + Marvin Gülker + * Class and module aliases now create new classes to avoid duplicate names + in the class list. Issue #143 by Richard Schneeman, Rails Issue #2839 + * RDoc::Markup::Parser now correctly matches indentation of lists when + multibyte characters are used in the list labels. Issue #140 by + burningTyger + * Fixed mangling of email addresses that look like labels. Issue #129 by + Tobias Koch + * Classes and modules in a C file may now be created in any order. Issue + #124 by Su Zhang + * A metaprogrammed method supports the :args: directive. Issue #100 + * A metaprogrammed method supports the :yields: directive. + * RDoc will now look for directives up to the end of the line. For example, + class B < A; end # :nodoc: + will now hide documentation of B. Issue #125 by Zachary Scott + * Fixed tokenization of % when it is not followed by a $-string type + * Fixed display of __END__ in documentation examples in HTML output + * Fixed tokenization of reserved words used as new-style hash keys + * RDoc now handles class << $gvar by ignoring the body + * Fixed parsing of class A:: B. + * Worked around bug in RDoc::RubyLex where tokens won't be reinterpreted + after unget_tk. + * Fixed class << ::Foo writing documentation to /Foo.html + * Fixed class ::A referencing itself from inside its own namespace. + +Changes since RDoc 4.0.0.rc.2: + +* Bug fix + * Templates now use the correct encoding when generating pages. Issue #183 + by Vít Ondruch + +== 4.0.0.rc.2 / 2013-02-05 + +* Minor enhancements + * Added current heading and page-top links to HTML headings. + +* Bug fixes + * Fixed an XSS exploit in darkfish.js. This could lead to cookie disclosure + to third parties. See CVE-2013-0256[rdoc-ref:CVE-2013-0256.rdoc] for full + details including a patch you can apply to generated RDoc documentation. + * Fixed parsing of multibyte files with incomplete characters at byte 1024. + Ruby bug #6393 by nobu, patch by Nobuyoshi Nakada and Yui NARUSE. + * Fixed rdoc -E. Ruby Bug #6392 and (modified) patch by Nobuyoshi Nakada + * Added link handling to Markdown output. Bug #160 by burningTyger. + * Fixed HEREDOC output for the limited case of a heredoc followed by a line + end. When a HEREDOC is not followed by a line end RDoc is not currently + smart enough to restore the source correctly. Bug #162 by Zachary Scott. + * Fixed parsing of executables with shebang and encoding comments. Bug #161 + by Marcus Stollsteimer + * RDoc now ignores methods defined on constants instead of creating a fake + module. Bug #163 by Zachary Scott. + * Fixed ChangeLog parsing for FFI gem. Bug #165 by Zachary Scott. + * RDoc now links \#== methods. Bug #164 by Zachary Scott. + * Allow [] following argument names for TomDoc. Bug #167 by Ellis Berner. + * Fixed the RDoc servlet for home and site directories. Bug #170 by Thomas + Leitner. + * Fixed references to methods in the RDoc servlet. Bug #171 by Thomas + Leitner. + * Fixed debug message when generating the darkfish root page. Pull Request + #174 by Thomas Leitner. + * Fixed deletion of attribute ri data when a class was loaded then saved. + Issue #171 by Thomas Leitner. + +== 4.0.0.preview2.1 / 2012-12-14 + +* Minor enhancements + * Added --page-dir option to give pretty names for a FAQ, guides, or other + documentation you write that is not stored in the project root. For + example, with the following layout: + + README.txt + guides/syntax.txt + guides/conversion.txt + + Running `rdoc --page-dir guides` will make the files in "guides" appear to + be at the top level of the project. This means they will appear to exist + at the top level in HTML output and you can access them with + `ri your_gem:syntax` and `ri your_gem:conversion`. + +* Bug fixes + * Fully qualified names for constants declared from the top level are now + attached to their class or module properly. + * Fixed table of contents display in HTML output for classes and modules. + * Incremental ri builds of C files now work. C variable names from previous + runs are now saved between runs. + +== 4.0.0.preview2 / 2012-12-01 + +* Breaking changes + * The default output encoding for RDoc is now UTF-8. Previously RDoc used + the default external encoding which was determined from your locale. + Issue #106 by Justin Baker. + * RDoc::RI::Store is now RDoc::Store so ri data generated by RDoc 4 cannot + be read by earlier versions of RDoc. RDoc::RI::Store exists as an alias + of RDoc::Store so ri data from older versions can still be read. + RDoc::RI::Store will be removed in RDoc 5. + + Tests that create RDoc::CodeObjects on the fly without wiring them into + the documentation tree (did not use add_class, add_method, etc.) must be + updated to use these methods. The documentation tree automatically + attaches them to the store instance which allows lookups to work + correctly. Additionally, a new method RDoc::Store#add_file must be used + instead of RDoc::TopLevel.new. The latter will not be attached to the + documentation tree. + * RDoc generators must accept an RDoc::Store and an RDoc::Options in + initialize. RDoc no longer passes an Array of RDoc::TopLevel objects to + #generate. Use RDoc::Store#all_files instead. + * Some markup formatters (RDoc::Markup::To*) now accept an RDoc::Options + instance as the first argument. Notably, the base class Formatter and + ToHtml*. (This is not universal due to the difficult at accessing the + user's options instance deep inside RDoc. A future major release may + remedy this.) + * Added new markup nodes and specials that RDoc::Markup::Formatter + subclasses must handle. If you're using RDoc::Markup::FormatterTestCase + the new methods you need to add should be readily apparent. + * Removed RDoc::RI::Paths::SYSDIR and ::SITEDIR. These were hidden + constants so no breakage is expected. Use RDoc::RI::Paths::system_dir + and ::site_dir instead. + * RDoc::RI::Store#modules has been renamed to RDoc::Store#module_names + to avoid confusion with RDoc::Store#all_modules imported from + RDoc::TopLevel. + * RDoc::RDocError has been removed. It was deprecated throughout RDoc 3. + * ri -f html is no longer supported. + * Comment definitions in C comments are now only discovered from the first + line. A colon on a subsequent line won't trigger definition extraction. + Issue #103, see also + http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/42942 + * Fixed :stopdoc: for class A::B where A has not been seen. Issue #95 by + Ryan Davis + * RDoc::ClassModule#each_ancestor no longer yields itself if there is + circular ancestry + +* Major enhancements + * ri can now show pages (README, etc.) + + ri rdoc:README + + Will show the README for the latest version of RDoc. You can specify + exact gem versions such as "rdoc-4.0:README" or view pages from the + standard library documentation with "ruby:README". + + RDoc 3 did not save pages in ri data so you will need to regenerate + documentation from your gems to use this feature. + * Added Markdown as a supported format. The markdown format can be set on a + per-file or per-comment basis with the +:markdown:+ directive like the rd + and tomdoc formats and on a per-project basis with + rdoc --markup markdown --write-options + * Removed global state from RDoc. RDoc::Store holds the documentation tree + and connects the driver to the parsers and generator. This also allows + documentation parsing and generation for multiple instances, but the rdoc + command-line tool does not support this. + + Due to this change RDoc::RDoc.current and RDoc::RDoc.reset no longer + exist. + +* Minor enhancements + * Added --root for building documentation from outside the source dir. + * Added a ChangeLog parser. It automatically parses files that begin + with 'ChangeLog' + * Added a table of contents to the sidebar. + * RDoc markup format merges adjacent labels in a label or note list into a + single definition list item for output. + * RDoc now tracks use of extend. Pull request #118 by Michael Granger. + * RDoc now tracks methods that use super. Pull request #116 by Erik + Hollensbe. + * Added methods ::system_dir, ::site_dir, ::home_dir and ::gem_dir to fetch + the components of RDoc::RI::Paths.path individually. + * Added support for rb_file_const. + * RDoc now processes files in sorted order. Issue #71 by Vít Ondruch + * RDoc now warns with --verbose when methods are duplicated. Issue #71 by + Vít Ondruch + * ri will display documentation for all methods in a class if -a is given. + Issue #57 by casper + * The RDoc coverage report will report line information for attributes, + constants and methods missing documentation. Issue #121 by Zachary Scott + * RDoc now reports a warning for files that are unreadable due to + permissions problems. + * RDoc controls documentation generation for RubyGems 2.0+ + +* Bug fixes + * A word that is directly followed by a multi-word tidy link label no longer + disappears. (Like text{link}[http://example]) + * Fixed legacy template support. Pull Request #107 by Justin Baker. + * An HTML class in a verbatim section no longer triggers ruby parsing. + Issue #92 by Vijay Dev + * Improved documentation for setting the default documentation format for + your ruby project. Issue #94 by Henrik Hodne + * Fixed handling of LANG in the RDoc::Options tests. Issue #99 by Vít + Ondruch + * RDoc no longer quits when given an entry that is not a file or directory. + Issue #101 by Charles Nutter + * Fixed bug in syntax-highlighting that would corrupt regular expressions. + Ruby Bug #6488 by Benny Lyne Amorsen. + * "class Object" no longer appears in the coverage report if all its methods + are documented. This suppresses a false positive for libraries that add + toplevel methods. Pull Request #128 by Zachary Scott. + * Fixed test_gen_url test name in TestRDocMarkupToHtml. Pull Request #130 + by Zachary Scott. + * Comment-defined methods ahead of define_method are now discovered. Issue + #133 by eclectic923 + * Fixed detection of define_method documentation. Issue #138 by Marvin + Gülker. + * Fixed lexing of character syntax (?z). Reported by Xavier + Noria. + * Add license to gem spec. Issue #144 by pivotalcommon + * Fixed comment selection for classes. Pull request #146 by pioz + * Fixed parsing of def self.&() end. Issue #148 by Michael + Lucy + * Generated RD parser files are now included in the gem. Issue #145 by + Marvin Gülker + * Class and module aliases now create new classes to avoid duplicate names + in the class list. Issue #143 by Richard Schneeman, Rails Issue #2839 + * RDoc::Markup::Parser now correctly matches indentation of lists when + multibyte characters are used in the list labels. Issue #140 by + burningTyger + * Fixed mangling of email addresses that look like labels. Issue #129 by + Tobias Koch + * Classes and modules in a C file may now be created in any order. Issue + #124 by Su Zhang + * A metaprogrammed method supports the :args: directive. Issue #100 + * A metaprogrammed method supports the :yields: directive. + * RDoc will now look for directives up to the end of the line. For example, + class B < A; end # :nodoc: + will now hide documentation of B. Issue #125 by Zachary Scott + * Fixed tokenization of % when it is not followed by a $-string type + * Fixed display of __END__ in documentation examples in HTML output + * Fixed tokenization of reserved words used as new-style hash keys + * RDoc now handles class << $gvar by ignoring the body + * Fixed parsing of class A:: B. + * Worked around bug in RDoc::RubyLex where tokens won't be reinterpreted + after unget_tk. + * Fixed class << ::Foo writing documentation to /Foo.html + * Fixed class ::A referencing itself from inside its own namespace. + +== 3.12.2 / 2013-02-24 + +* Bug fixes + * Fixed bug in syntax-highlighting that would corrupt regular expressions. + Ruby Bug #6488 by Benny Lyne Amorsen. + * Fixed lexing of character syntax (?x). Reported by Xavier + Noria. + * Fixed tokenization of % when it is not followed by a $-string type + * Fixed display of __END__ in documentation examples in HTML output + * Fixed tokenization of reserved words used as new-style hash keys + * Fixed HEREDOC output for the limited case of a heredoc followed by a line + end. When a HEREDOC is not followed by a line end RDoc is not currently + smart enough to restore the source correctly. Bug #162 by Zachary Scott. + +== 3.12.1 / 2013-02-05 + +* Bug fixes + * Fixed an XSS exploit in darkfish.js. This could lead to cookie disclosure + to third parties. See CVE-2013-0256[rdoc-ref:CVE-2013-0256.rdoc] for full + details including a patch you can apply to generated RDoc documentation. + * Ensured that rd parser files are generated before checking the manifest. + +== 3.12 / 2011-12-15 + +* Minor enhancements + * Added DEVELOPERS document which contains an overview of how RDoc works and + how to add new features to RDoc. + * Improved title for HTML output to include --title in the + title element. + * rdoc --pipe now understands --markup. + * RDoc now supports IRC-scheme hyperlinks. Issue #83 by trans. + +* Bug fixes + * Fixed title on HTML output for pages. + * Fixed parsing of non-indented HEREDOC. + * Fixed parsing of %w[] and other % literals. Issue #84 by + Erik Hollensbe + * Fixed arrow replacement in HTML output munging the spaceship operator. + Issue #85 by eclectic923. + * Verbatim sections with ERB that match the ruby code whitelist are no + longer syntax-highlighted. Issue #86 by eclectic923 + * Line endings on windows are normalized immediately after reading with + binmode. Issue #87 by Usa Nakamura + * RDoc better understands directives for comments. Comment directives can + now be found anywhere in multi-line comments. Issue #90 by Ryan Davis + * Tidy links to methods show the label again. Issue #88 by Simon Chiang + * RDoc::Parser::C can now find comments directly above + +rb_define_class_under+. Issue #89 by Enrico + * In rdoc, backspace and ansi formatters, labels and notes without bodies + are now shown. + * In rdoc, backspace and ansi formatters, whitespace between label or note + and the colon is now stripped. + +== 3.11 / 2011-10-17 + +* Bug fixes + * Avoid parsing TAGS files included in gems. Issue #81 by Santiago + Pastorino. + +== 3.10 / 2011-10-08 + +* Major enhancements + * RDoc HTML output has been improved: + * The search from Володя Колесников's (Vladimir Kolesnikov) SDoc has been + integrated. + + The search index generation is a reusable component through + RDoc::Generator::JsonIndex + * The table of contents is now a separate page and now shows links to + headings and sections inside a page or class. + * Class pages no longer show the namespace and no longer have file info + pages. + * HTML output is HTML 5. + * Static files can be copied into RDoc using --copy-files + * RDoc supports additional documentation formats: + * TomDoc 1.0.0-rc1 + * RD format + + The default markup can be set via the --markup option. + + The format of documentation in a particular file can be specified by the + +:markup:+ directive. If the +:markup:+ directive is in the first comment + it is used as the default for the entire file. For other comments it + overrides the default markup format. + + The markup format can be set for rake tasks using RDoc::Task#markup + * RDoc can save and load an options file. + + To create an options file that defaults to using TomDoc markup run: + + rdoc --markup tomdoc --write-options + + This will create a .rdoc_options file. Check it in to your VCS and + package it with your gem. RDoc will automatically load this file and + combine it with the user's options. + + Some options are not saved. See RDoc::Options@Saved+Options for full + details. + +* Minor enhancements + * RDoc autoloads everything. You only need to require 'rdoc' now. + * HTML headings now have ids matching their titles. + + = Hello! + + Is rendered as + +

Hello!

+ + * Labels for classes or methods can be linked-to by adding an @ + following the class or method reference. For example, + RDoc::Markup@Links + + See RDoc::Markup@Links for further details. + * For HTML output RDoc uses +SomeClass.method_name+ and + +SomeClass#method_name+ for remote methods and attributes and + +::method_name+ and +#method_name+ for local methods. + * RDoc makes an effort to syntax-highlight ruby code in verbatim sections. + See RDoc::Markup@Paragraphs+and+Verbatim + * Added RDoc::TopLevel#text? and RDoc::Parser::Text to indicate a + parsed file contains no ruby constructs. + * Added rdoc-label link scheme which allows bidirectional links. + See RDoc::Markup for details. + * Image paths at HTTPS URLs will now be turned into ++ tags. Pull + Request #60 by James Mead + * Added RDoc::Comment which encapsulates comment-handling functionality. + * Added RDoc::Markup::PreProcess::post_process to allow arbitrary comment + munging. + * RDoc::RDoc::current is set for the entire RDoc run. + * Split rdoc/markup/inline into individual files for its component classes. + * Moved token stream HTML markup out of RDoc::AnyMethod#markup_code into + RDoc::TokenStream::to_html + * "Top" link in section headers is no longer inside the heading element. + * RDoc avoids printing some warnings unless run with `rdoc --verbose`. For + Rails issue #1646. + * Finishing a paragraph with two or more spaces will result in a line break. + This feature is experimental and may be modified or removed. + +* Bug fixes + * Markup defined by RDoc::Markup#add_special inside a is no + longer converted. + * Performance of RDoc::RubyLex has been improved. Ruby Bug #5202 by Ryan + Melton. + * Add US-ASCII magic comments to work with ruby -Ku. Issue #63 by + Travis D. Warlick, Jr. + * Clicking a link in the method description now works. Issue #61 by Alan + Hogan. + * Fixed RDoc::Markup::Parser for CRLF line endings. Issue #67 by Marvin + Gülker. + * Fixed lexing of percent strings like %r{#}. Issue #68 by eclectic923. + * The C parser now understands classes defined with + +rb_struct_define_without_accessor+ (like Range). Pull Request #73 by Dan + Bernier + * Fixed lexing of a b <<-HEREDOC. Issue #75 by John Mair. + * Added LEGAL.rdoc with references to licenses in other files. Issue #78 by + Dmitry Jemerov. + * Block parameters are displayed in Darkfish output again. Issue #76 by + Andrea Singh. + * The method parameter coverage report no longer includes parameter default + values. Issue #77 by Jake Goulding. + * The module for an include is not looked up until parsed all the files are + parsed. Unless your project includes nonexistent modules this avoids + worst-case behavior (O(n!)) of RDoc::Include#module. + +== 3.9.5 / 2013-02-05 + +* Bug fixes + * Fixed an XSS exploit in darkfish.js. This could lead to cookie disclosure + to third parties. See CVE-2013-0256.rdoc for full details including a + patch you can apply to generated RDoc documentation. + +== 3.9.4 / 2011-08-26 + +* Bug fixes + * Applied typo and grammar fixes from Luke Gruber. Ruby bug #5203 + +== 3.9.3 / 2011-08-23 + +* Bug fixes + * Add US-ASCII magic comments to work with ruby -Ku. Issue #63 by + Travis D. Warlick, Jr. + * Image paths at HTTPS URLs are now turned into ++ tags. Pull + Request #60 by James Mead + * Markup defined by RDoc::Markup#add_special inside a is no + longer converted. + +== 3.9.2 / 2011-08-11 + +* Bug fix + * Loosened TIDYLINK regexp to allow any content in the link section like: + {foo}[rdoc-ref:SomeClass] + * In HTML output headings are capped at
again + +== 3.9.1 / 2011-07-31 + +* Bug fixes + * Fix RDoc::Markup parser for a header followed by a non-text token. Issue + #56 by Adam Tait + * Fix RDoc::Markup::ToHtmlCrossref#gen_url for non-rdoc-ref links. + * Fix bug report URL when rdoc crashes. + +== 3.9 / 2011-07-30 + +* Minor enhancements + * RDoc::Parser::C now supports :doc: and :nodoc: for class comments + * Added the rdoc-ref: link scheme which links to a named reference. + rdoc-ref: can resolve references to classes, modules, methods, + files, etc. This can be used to create cross-generator named links unlike + the link: scheme which is dependent upon the exact file name. + Issue #53 by Simon Chiang + * Pulled RDoc::CrossReference out of RDoc::Markup::ToHtmlCrossref. + Cross-references can now be created easily for non-HTML formatters. +* Bug fixes + * `ri []` and other special methods now work properly. Issue #52 by + ddebernardy. + * `ri` now has space between class comments from multiple files. + * :stopdoc: no longer creates Object references. Issue #55 by Simon Chiang + * :nodoc: works on class aliases now. Issue #51 by Steven G. Harms + * Remove tokenizer restriction on header lengths for verbatim sections. + Issue #49 by trans + +== 3.8 / 2011-06-29 + +* Minor enhancements + * RDoc::Parser::C can now discover methods on ENV and ARGF. + * RDoc::Parser::C now knows about rb_cSocket and rb_mDL. +* Bug fixes + * Updating Object in an ri data store with new data now removes methods, + includes, constants and aliases. + +== 3.7 / 2011-06-27 + +* Minor enhancements + * New directive :category: which allows methods to be grouped into sections + more cleanly. See RDoc::Markup for details. + * Document-class for RDoc::Parser::C now supports Foo::CONST as well as + CONST. + * ri method output is now a comma-separated list when displayed + interactively. Pull Request #39 by Benoit Daloze. + * RDoc::ClassModule#merge now prefers the argument's information over the + receiver's (it now behaves like Hash#merge! instead of a backwards + Hash#merge!). + * RDoc::Markup#convert now accepts an RDoc::Markup::Document instance + * RDoc now owns the code for generating RDoc and ri data when gems install + * Added RDoc::RDoc::reset + * Added RDoc::CodeObject#file_name +* Bug fixes + * ri no longer crashes when attempting to complete a plain [. + * ri data now tracks which file information came from so it can process + removals and changes to: + * Classes and Modules + * Methods + * Attributes + * Includes + * Constants + You will need to rebuild your ri data for it to update properly. Issue + #21 by Sven Riedel + * Signal and SignalException no longer clobber each other + * RDoc::Parser::C no longer creates classes when processing aliases. + * RDoc::Text#strip_stars handles Document-method for methods with =, ! and ? + now. + * RDoc::Parser::C now allows .cpp files to be used with the "in" comment on + rb_define_method. Bug #35 by Hanmac. + * RDoc::Parser::Ruby no longer eats content when =begin/=end documentation + blocks are followed by a documentable item. Issue #41 by mfn. + * RDoc::Markup::Formatter and subclasses now allow an optional +markup+ + parameter for adding custom markup. The example in + RDoc::Markup::Formatter will now work. Issue #38 by tsilen. + * RDoc::Parser::C can now distinguish between class methods and instance + methods in Document-method. Issue #36 by Vincent Batts. + * RDoc now encodes file names in the output encoding. Issue #33 by Perry + Smith. + * ri data generation for method aliases no longer duplicates the class in + #full_name + +== 3.6.1 / 2011-05-15 + +* Bug fixes + * Fix infinite loop created when re-encountering BasicObject. + * RDoc::Context#each_ancestor is now provided for duck-typing. + * rb_path2class() can now be used to discover the parent class in + rb_define_class_under. + +== 3.6 / 2011-05-13 + +* Major Enhancements + * Interactive ri is now the default when no names are given. +* Minor Enhancements + * RDoc::RDoc#generate was added to allow multiple generators to be used with + a set of parsed file info. + * RDoc::Options#finish can be called multiple times now. + * `ri -i` only shows one level of namespace when completing class names. + * Added `ri --list` for explicit listing. `ri -l F G` will list all classes + or modules starting with F or G +* Bug fixes + * Remove windows-specific test for test_check_files, it is too hard to do. + Ruby commit r30811 by Usaku Nakamura. + * Remove unnecessary (and wrong) platform-dependent hacks. Ruby commit + r30829 by Usaku Nakamura. + * Completing via Array#[ in `ri -i` no longer crashes. Ruby Bug #3167 + * Completing IO::o in `ri -i` now returns results. Ruby Bug #3167 + * RDoc::Parser::C ignores prototypes better. Pull Request #34 by Pete + Higgins. + * private_class_method and public_class_method are now parsed correctly for + inherited methods. Issue #16 by gitsucks. + * The doc directive now forces documentation even when the method is marked + private or protected. + +== 3.5.3 / 2010-02-06 + +* Bug fixes + * When including a file perform a lossy force-transcoding to the output + encoding instead of crashing to preserve as much content as possible. + Ruby Bug #4376 by Yui NARUSE. + * Work around inconsistent encoding result from String#sub!, String#gsub!. + Related to Ruby Bug #4376. + * Work around inconsistent encoding result from String#[]=. Related to Ruby + Bug #4376. + * When Darkfish fails the file being generated is now reported. + +== 3.5.2 / 2010-02-04 + +* Deprecations + * RDoc::Context::Section#sequence is now deprecated. Use + RDoc::Context::Section#aref instead. + +* Bug fixes + * Fixed syntax highlighting CSS class generation. Reported by Daniel + Bretoi. + * Fixed ri for methods with aliases. Pull Request #15 by Sven Riedel. + * Added windows-specific test for test_check_files. + * Darkfish now supports sections. Template and generator author see + RDoc::Context#each_section to add section support. RubyForge Bug #26883 + by Jeff Hodges. + * Fixed post-install message for Ruby 1.9.2 users. + * Set required ruby version to >= 1.8.7. + +== 3.5.1 / 2010-01-30 + +* Bug fixes + * Fixed some typos. Pull request #13 by R.T. Lechow. + * Ensure an RDoc::Stats is created in #parse_files. Fixes documentation for + railties which has no files. Reported by Aaron Patterson + +== 3.5 / 2010-01-29 + +* Minor enhancements + * RDoc::Parser::C looks for rb_scan_args and fills in RDoc::AnyMethod#params + appropriately. This may provide useful information if the author did not + provide a call-seq. + * RDoc::Parser::C now records the function name for methods implemented in + C. + * RDoc now records file and byte offset information for methods. +* Bug fixes + * Locations of module aliases are now recorded. + * RDoc::Parser::C finds method bodies better now. + * Fixed further locations where output encoding was not preserved. Bug #11 + by Vít Ondruch, RubyForge bug #28791 by Dzmitry Prakapenka. + * Fixed display of numeric lists on the index page and file pages. Bug #12 + by tobijk. + * Skip TestRDocOptions#test_check_files on windows until a windows-specific + test can be created. RubyForge bug #28821 by Usaku Nakamura. + * Fixed line-height of headings in method and alias descriptions. RubyForge + Bug #2770 by Adam Avilla + * Relaxed RDoc::Parser::Ruby#remove_private_comments to consume more dashes + as older versions once did. Bug #7 by Claus Folke Brobak. + +== 3.4 / 2010-01-06 + +* Minor enhancements + * RDoc::RDoc#document may now be called with an RDoc::Options instance. +* Bug fixes + * Added skips to Encoding tests running on 1.8. + * Fixed warnings + +== 3.3 / 2010-01-03 + +* Minor enhancements + * The coverage report can now report undocumented method parameters + including methods defined in C. + + rdoc -C gives a standard report, rdoc -C1 includes + method parameters. Method parameters are considered documented if they're + marked-up with +, or . + * The C parser now uses *args instead of ... if no + call-seq was provided to give names to the arguments. +* Bug fixes + * The C parser now records the file location of aliases, attributes, + constants and methods allowing -C to work on C files. + * Darkfish now handles dots in call-seq allowing ary.insert(index, + obj...) to display correctly. Patch #6 by KUBO Takehiro. + * Improved processing of meta-programmed methods when followed by unparseable + syntax. RubyForge patch #28653 by Aidan Cully. + * rdoc now touches the flag file when it create the output directory. + Prevents the "isn't an RDoc directory" error if rdoc crashes. + * RDoc now properly converts to the expected output encoding. RubyForge bug + #28791 by Dzmitry Prakapenka. + * Restored parsing of block comments. RubyForge bug #28668 by Stefano Crocco. + * Metaprogrammed methods defined with blocks no longer confuse the ruby + parser. RubyForge bug #28370 by Erik Hollensbe. + * ri no longer displays all methods in the inheritance chain. + +== 3.2 / 2010-12-29 + +* Minor enhancements + * RDoc generator authors may now suppress updating the output dir (creating + a created.rid file) by setting RDoc::Options#update_output_dir to false. + * RDoc::Task has been refactored to ease creating subclasses. +* Bug fixes + * RDoc's gitignore now ignores .DS_Store files. Pull Request #3 by Shane + Becker. + +== 3.1 / 2010-12-28 + +RDoc has moved to github. Releases after 3.1 reference github unless +otherwise noted. + +* Minor enhancements + * RDoc::Task now features a #generator option to choose an alternate + generator. Pull Request #2 by Erik Hollensbe. + * Enhanced test for RDoc::Parser::binary? RubyForge patch #28538 by Eito + Katagiri. + * Generator list in --help is no longer static. Generator description comes + from the generator's DESCRIPTION constant. + * Documentation summary is now displayed with dynamic width. +* Bug fixes + * Strip encoding comment from input to avoid overriding file comment. + RubyForge Bug #22113 by James Gray. + * Restore call-seq parsing behavior when the call-seq is the only comment. + RubyForge Bug #26290 by Sylvain Joyeux. + * Coverage report no longer crashes for constant aliases. Pull Request #1 + by Andy Lindeman. + * RDoc no longer loses ghost methods when followed by certain tokens. + RubyForge bug #27793 by Aaron Patterson. + * RDoc no longer crashes in ri if HOME is not set. Ruby Bug #4202 by + Shyouhei Urabe. + * ri no longer crashes with HTML format output. RubyForge bug #28675 by + 7rans. + * RDoc::Markup::ToHtml#gen_url now initializes #from_path to ''. + Additionally, #from_path is now settable. RubyForge bug #27838 by Claus + Folke Brobak. + * Comments in the C parser are now normalized before being combined. + RubyForge patch #28646 by Sven Herzberg. + * RDoc::Parser::C no longer requires a comment and finds more method bodies. + RubyForge patch #28643 by Sven Herzberg. + * Darkfish now has a "Class/Module Index" instead of a "Class Index". + RubyForge patch #28364 by James Tucker. + * RDoc::Parser::Ruby now parses negative numbers correctly. RubyForge patch + #28544 by Eito Katagiri. + +== 3.0.1 / 2010-12-19 + +* Bug fix + * RDoc no longer has a Perl parser. + +== 3.0 / 2010-12-19 + +Special thanks to Thierry Lambert for massive improvements to RDoc. + +* Major enhancements + * Ruby 1.8.6 is no longer supported by RDoc. + * RDoc now converts input files to a single encoding specified by + --encoding. See RDoc::RDoc and RDoc::Options#encoding. + --encoding is now preferred over --charset + * RDoc now supports a --coverage-report flag (also -C and + --dcov) that outputs a report on items lacking documentation. + * Templates (rdoc -T) are now checked for existence in + RDoc::Options. Generator authors can now use RDoc::Options#template_dir + which is the full path to the template directory. + * Added support for class aliases. Patch by Thierry Lambert. + * Improved merging of classes and modules across multiple files including + more accurate documentation statistics. Patch by Thierry Lambert. + * Improved handling of method aliases. Patch by Thierry Lambert. + * Improved handling of visibility of RDoc code objects. Patch by Thierry + Lambert. + * RDoc::Attr#type is now RDoc::Attr#definition. Patch by Thierry Lambert. + * Removed TimeConstantMethods + * RDoc now calls ::new instead of ::for on generators. +* Minor enhancements + * Added rdoc arguments --dry-run, --all, + --visibility, --force-output, --hyperlink-all. + Patch by Thierry Lambert. + * RDoc::Markup::FormatterTestCase has been expanded. Patch by Thierry + Lambert. + * RDoc::Markup::TextFormatterTestCase has been extracted from RDoc tests. + Patch by Thierry Lambert. + * Various RDoc::Parser::Ruby enhancements. Patch by Thierry Lambert. + * Various RDoc::Markup::Parser enhancements. Patch by Thierry Lambert. + * RDoc::Parser::binary? is more robust now that it uses Encoding. + * Deprecated rdoc arguments are now explicitly mentioned in rdoc command + output. Patch by Thierry Lambert. + * Constant values are formatted more accurately. Patch by Thierry Lambert. + * Enhanced call-seq parsing in RDoc::Parser::C. Patch by Thierry Lambert. + * RDoc no longer uses kw, cmt, re or str classes for embedded source code + snippets. Patch by Thierry Lambert. + * RDoc directives may now be escaped with a leading '\\'. Patch by Thierry + Lambert. + * RDoc note lists (label::) now generate a table with class + "rdoc-list". Patch by Thierry Lambert. + * RDoc markup documentation has been moved to RDoc::Markup including notes + on how to document source code. + * An RDoc::Require is now always listed at the file level. Patch by Thierry + Lambert. + * RDoc::CodeObjects now know which file they were defined in. + * RDoc::Options calls ::setup_options on the generator class specified by + --format. See RDoc::Options::setup_generator. + * rdoc gives an error when multiple formats are given. + * Files with erb inside will no longer trip RDoc::Parser::binary? + * Last --title wins. Patch by Thierry Lambert. + * Better block params handling. Patch by Thierry Lambert. + * Moved rdoc/tokenstream.rb to rdoc/token_stream.rb. + * Moved rdoc/markup/preprocess.rb to rdoc/markup/pre_process.rb. + * Removed "':' not followed by operator or identifier" warning for new Hash + syntax. + * rb_attr() is now supported for attributes. + * RDoc::Parser::C now supports yields, doc, and args directives like + RDoc::Parser::Ruby. + * Moved RDoc::Parser::PerlPOD to the rdoc-perl_pod gem. +* Bug fixes + * RDoc::Generator tests no longer require any installed RDoc on Ruby 1.9 + * Load existing cache before generating ri. Ruby r27749 by NAKAMURA Usaku. + * RDoc now handles BOM. Ruby r28062 by Nobuyoshi Nakada. + * Use proper XML encoding for darkfish classpage. Ruby r28083 by NARUSE, + Yui. + * Fix ri output when special characters are inside html tags. Patch by Tomo + Kazahaya, Ruby Bug #3512. + * Don't bother checking if the pager exists, it's already done. Ruby r28842 + by NAKAMURA Usaku. + * RDoc::Parser::Ruby now ignores non-constant-named singleton classes. Ruby + r29140 by Nobuyoshi Nakada. Ruby Bug #3759. + * RDoc::Parser::Ruby call args no longer include assignment. Ruby r29141 by + Nobuyoshi Nakada. Ruby Bug #3759 + * Handle $HOME being unset in ri. Ruby r29272 by Nobuyoshi Nakada. + * uniq ancestors and modules too. Ruby r29312 by Nobuyoshi Nakada. + * RDoc now knows about Encoding by default. Ruby r29356 by Nobuyoshi + Nakada. + * ri now defaults to the backspace formatter when piped. Use RI environment + variable or options to override. Ruby r28455 by Yusuke Endoh. + * __send__ and friends no longer get their underscores removed. Patch by + Thierry Lambert. + * The C parser now makes new public when promoting initialize. + * Fix crash in #markup_code for TkUnknownChar. + * Fix crash in RDoc::Parser::C when aliasing methods with Regexp special + characters. + * Fix crash when various operators are used as a name as in + alias * compose. + * Fix warning with some dynamic use of attr_* + * Methods added to true, false and nil are now documented. + * Remove warning for methods defined on globals. + +== 2.5.11 / 2010-08-20 + +* Minor Enhancements + * Alias comments are now discovered by the C parser. Reported by Jeremy + Evans. + * Removed --all option which is unused in RDoc. Use the nodoc or + stopdoc/startdoc directives to suppress documentation instead. + +== 2.5.10 / 2010-08-17 + +* Minor Enhancements + * Support rb_singleton_class(). Reported by Jeremy Evans. + * Support rb_define_private_method() on rb_singleton_class(). Reported by + Jeremy Evans. + +* Bug Fixes + * Treat non-ASCII RDoc files as text. Bug #28391 by Kouhei Sutou. + * Fix potential test failures due to ivar collision. Bug #28390 by Kouhei + Sutou. + * Added duck-typed #aref for RDoc::Attr to RDoc::AnyMethod. Bug #28375 by + Erik Hollensbe + * Fixed method references in HTML output when show_hash is false. + * Fixed comments with '.' in call-seq in C sources. Reported by Jeremy + Evans. + * RDoc now understands singleton aliases. Reported by Jeremy Evans. + +== 2.5.9 / 2010-07-06 + +* Bug Fixes + * Look up pager correctly. + * Fixed handling of bullets in verbatim sections. Partial patch by + Juha-Jarmo Heinonen. + +== 2.5.8 / 2010-04-27 + +*NOTE*: + +RDoc 2.5 did not save method parameters, so you should upgrade your rdoc-data +gem to a version >= 2.5.3. + +To have ri data for core and stdlib you'll need to: + + gem install rdoc-data + +then run: + + rdoc-data --install + +To have ri data for you gems you'll also need to run: + + gem rdoc --all --overwrite + +If you don't want to rebuild the rdoc for `gem server`, add --no-rdoc. + +* Bug Fixes + * ri no longer complains about nonexistent pagers. + * Fixed failing test + +== 2.5.7 / 2010-04-22 + +* Minor Enhancements + * Unrecognized RDoc directives can now be registered by a plugin for + handling. See RDoc::Markup::PreProcess. + * Added RDoc::Markup::Raw to allow other markup engines to dump raw content + into RDoc. +* Bug Fixes + * rdoc -p no longer means --pipe if files are also given. + * RDoc now knows about BasicObject by default. Ruby Bug #1318 by Ambrus Zsbán + +== 2.5.6 / 2010-04-22 + +* Minor Enhancements + * Unrecognized RDoc directives are added as metadata to the object they get + attached to. + + ## + # :my_new_directive: my cool value + + Results in a 'my_new_directive' metadata key with value 'my cool value' on + the RDoc::CodeObject it is for +* Bug Fixes + * RDoc no longer prints out "invalid options:" when there were no invalid + options. + * Fixed link size on Darkfish file pages + +== 2.5.5 / 2010-04-19 + +* 1 Minor Enhancement + * Use #binread in RDoc::Markup::PreProcess. Patch from ruby trunk. +* 3 Bug Fixes + * Fixed indentation of method-description lists in Darkfish. Bug #28081 by + Theresa Dwinnell. + * Fixed loading RDoc::AnyMethod aliases to no longer infinitely loop. Bug + #28107 by Sven Riedel + * Fixed handling of ignored invalid options to continue after the invalid + option. + +== 2.5.4 / 2010-04-18 + +* 2 Minor Enhancements + * Methods will now be cross-referenced when preceded with ::. Ruby Bug + #3169 by Marc-Andre Lafortune. + * Methods now have human readable fragment identifiers for HTML output. + (#method-i-gsub vs #M000005). Ruby Bug #3023 by Marc-Andre Lafortune. +* 1 Bug Fixes + * RDoc::Parser::Ruby now handles while begin a; b end # .... + Ruby Bug #3160 by Yusuke Endoh. + +== 2.5.3 / 2010-04-10 + +* 1 Minor Enhancement + * RDoc::Parser::Simple and the include directive remove coding: comment from + first line +* 2 Bug Fixes + * Fixed loading of created.rid when regenerating documentation. Ruby bug + #3121 by Yusuke Endoh. + * Compare times as Integers as created.rid doesn't store fractional times. + +== 2.5.2 / 2010-04-09 + +* 1 Minor Enhancement + * Imported various changes by Nobu from ruby trunk. +* 2 Bug Fixes + * RDoc parses files without extensions as text files again. + * RDoc::Parser::Ruby parses %{ strings correctly again. + +== 2.5.1 / 2010-04-06 + +* 1 Minor Enhancement + * RDoc::Parser::C now supports the include directive for classes and + modules. +* 6 Bug Fixes + * RDoc::AnyMethod params now get saved in ri data. + * ri now displays method arguments correctly. + * RDoc::Markup::Parser allows no space between = and header text like rdoc + 2.4 and earlier. + * RDoc::Parser::C's "in" directive now looks in the current directory. + * RDoc::Task's rerdoc task no longer deletes the doc directory twice. + * rdoc --force-update now works correctly. Patch by Nobu Nokada + +== 2.5 / 2010-03-31 + +* 9 Major Enhancements + * Darkfish now has a "Home" button + * ri no longer displays the value of a constant. There's no easy way to + make them presentable. Use irb or ruby -e instead. Ruby Bug #549. + * New ri data format now uses Marshal and pre-builds caches + * No support for old ri data format, too hard to maintain + * To upgrade your core ri documentation, install the rdoc-data gem and run + rdoc-data + * RDoc now displays how well you've documented your library + * New recursive-descent parser for RDoc::Markup. See RDoc::Markup::Parser + * Updated ruby_lex and ruby_token + * Removed threading support, RDoc is not thread-safe + * Removed many unsupported options to rdoc + * Future versions of RDoc will not support Ruby 1.8.6. Bugs filed for + 1.8.6-only issues will be (largely) rejected. + +* 17 Minor Enhancements + * Source Parsing + * RDoc now supports module aliasing via constant assignment. + * RDoc now tracks superclasses correctly. Fixes File < IO for core docs. + * RDoc now ignores methods inside methods. + * RDoc now ignores Marshal and other binray files. + * Removed "Skipping require of dynamic string" warning. + * C parser now handles Document-method better. Bug #27329. + * API enhancements for writing parsers like the Ruby parser, see + RDoc::Parser::RubyTools + * ri + * Uses pager over less and more for Debian. Ruby Bug #1171. + * ri will use the RI_PAGER environment variable to find a pager. + * ri data generator now supports SIGINFO (^T) + * When rdoc is in debug mode, ^C now prints a backtrace + * RDoc::Markup::AttributeManager no longer uses global state. + * RDoc::RDoc no longer passes around options. Patch #27167. + * Darkfish won't generate a file if its template is missing. Patch #25857. + * Improved some wording for the RDoc main page. Patch #27264, #27268. + * Removed diagram generation support (to return in the future). + * Removed external support for RDoc::Task. + +* 12 Bug Fixes + * The :attr: directives now use the name given to create an attribute. See + RDoc::Parser::Ruby#parse_meta_attr. + * Fix crossrefs on paths with '-'. Ruby Bug #883. + * Fix ruby parser for alias with = in the name. Bug #27522. + * Images are no longer executable. Bug #27156. + * --op is no longer overridden by --ri. Bug #27054. + * :method: now works when at the end of a class. Bug #26910. + * Preserve ellipsis from call-seq in Darkfish. Patch #26974. + * Emacs-style coding: is handled properly. Patch #27388. + * RDoc::RubyLex now parses UTF-8 identifiers. Bug #26946, #26947. + * Fixed namespace lookup rules. Bug #26161. + * Worked around bug in Selenium where they hide a .jar in a .txt file. + Filed Selenium bug #27789. + * Alias comments are no longer hidden. Reported by Adam Avilla. + +== 2.4.3 / 2009-04-01 + +* 2 Bug Fixes + * Corrected patch for file links + * Corrected display of file popup + +== 2.4.2 / 2009-03-25 + +* 2 Minor Enhancements + * Added --pipe for turning RDoc on stdin into HTML + * Added rdoc/task.rb containing a replacement for rake/rdoctask.rb. Use + RDoc::Task now instead of Rake::RDocTask. + +* 10 Bug Fixes + * Writing the ri cache file to the proper directory. Bug #24459 by Lars + Christensen. + * Possible fix for Dir::[] and Pathname interaction on 1.9. Bug #24650 by + tiburon. + * Fixed scanning constants for if/end, etc. pairs. Bug #24609 by Ryan + Davis. + * Fixed private methods in the C parser. Bug #24599 by Aaron Patterson. + * Fixed display of markup on RDoc main page. Bug #24168 by rhubarb. + * Fixed display of \\ character in documentation proceeding words. + Bug #22112 by James Gray. See RDoc for details. + * Fixed parsing and display of arg params for some corner cases. Bug #21113 + by Csiszár Attila. + * Fixed links in Files box. Patch #24403 by Eric Wong. + * Toplevel methods now appear in Object. Bug #22677 by Ryan Davis. + * Added back --promiscuous which didn't do anything you cared about. Why + did you enable it? Nobody looked at that page! Oh, it warns, too. + +== 2.4.1 / 2009-02-26 + +* 1 Minor Enhancements + * Added :attr:, :attr_reader:, :attr_writer:, :attr_accessor: directives. + Replaces --accessor. See RDoc::Parser::Ruby for details. + +* 3 Bug Fixes + * Don't complain when exiting normally. Bug by Matt Neuburg. + * Restore --inline-source that warns + * Fixed links to files in Darkfish output + +== 2.4.0 / 2009-02-24 + +* 9 Minor Enhancements + * `ri -f html` is now XHTML-happy + * Clarified RDoc::Markup link syntax. Bug #23517 by Eric Armstrong. + * Number of threads to parse with is now configurable + * Darkfish can now use alternate templates from $LOAD_PATH via -T + * Removed F95 parser in favor of the rdoc-f95 gem + * Moved HTML and XML generators to unmaintained + * No gem will be provided as it's too difficult to make them work + * Removed options --one-file, --style=, --inline-source, --promiscuous, + --op-name + * Removed support for --accessor, use regular documentation or + the method directive instead. See RDoc::Parser::Ruby + * Removed --ri-system as it is unused by Ruby's makefiles + * Added method list to index.html + +* 6 Bug Fixes + * A class marked nodoc no longer appears in the index. Bug #23751 by + Clifford Heath. + * Fix 1.9 compatibility issues. Bug #23815 by paddor. + * Darkfish now respects --charset + * RDoc no longer attempts to be lazy when building HTML. This is a + workaround. Bug #23893 by Stefano Crocco. + * RDoc doesn't crash with def (blah).foo() end + * RDoc doesn't crash with #define functions + +== 2.3.0 / 2009-01-28 + +* 3 Major Enhancements + * Michael Granger's Darkfish generator is now the default for HTML output + * Various rdoc generation speedups by Hongli Lai. Patches #22555, #22556, + #22557, #22562, #22565. + * rdoc/discover.rb files are loaded automatically from installed gems + +* 8 Minor Enhancements + * Added a space after the commas in ri class method lists. RubyForge + enhancement #22182. + * Improved ri --interactive + * Generators can now override generated file locations + * Moved unmaintained CHM generator to it's own package + * Moved unmaintained extra HTML templates to their own package + * Removed experimental texinfo generator + * Converted to minitest + * Known classes and modules list outputs once per line now for grep + +* 11 Bug Fixes + * Fix missing superclass in ri output + * Fix an RDoc crash when told to parse an empty file + * Ignore nonexistent files instead of crashing + * .txt and .rdoc files are always considered text. Patch #22897 by Aaron + Patterson. + * When merging ri data with a nonexistent directory, RDoc no longer crashes + * Fix visibility of methods in XML output. Issue by Yehuda Katz. + * Fixed relative link generation + * Fix crash, RDoc now ignores comments above local variable assignments in + modules + * RDoc now only accepts adjacent comments for rb_define_module and + rb_define_class + * C file RDoc is no longer included in token stream + * Scan all gem paths to match gem name for ri output + +== 2.2.1 / 2008-09-24 +This version provides some minor fixes and enhancements to 2.2.0 intended +to polish RDoc for Ruby 1.9.1. + +* 3 Minor Enhancements + * Support for parsing RDoc from SWIG. Ruby patch #10742 by Gonzalo + Garramuno, #13993 by Steven Jenkins. + * Simple support for Perl POD documentation. Patch by Hugh Sasse. + * Changed the default character set of RDoc's output from iso-8859-1 to + utf-8. + +* 9 Bug Fixes + * Explicitly set the html template's text color, so that the generated + documentation will display correctly on browsers with custom text and + background color settings (patch by Luther Thompson). + * Ensure that RDoc correctly will associate an alias and a method, even + if it encounters the alias first because the alias lives in a different + file. + * Fix the parsing of multiline constants (patch by Chris Alfeld and + Joel VanderWerf) + * Make --exclude usuable. Ruby patch #11671 by Trans. + * Detect inline C functions. Ruby Bug #11993 by Florian Frank. + * Fix an issue in which RDoc might not document a class' + superclass correctly if the class was defined in multiple files and + depending on the order in which RDoc processed the files. This should + ensure that the child class -> parent class relationship is correct in + ri documentation, allowing ri to lookup inherited methods (i.e., File.read). + * Stop ri from crashing when it looks for a completely bogus method (i.e., + File#reada). Now, ri exits with a helpful error message. + * Fixed missing display of constant values in ri. + * Fixed display of constants in ri's html output. + +== 2.2.0 / 2008-09-19 +This version includes some significant enhancements to ri. See RI.txt for +documentation about ri. + +* 5 Major Enhancements + * More extensive unit tests (special thanks to Chris Lowis for contributing + a test). + * Made ri twice as fast for the most common use case of displaying + information for a class or a fully-qualified method + (i.e., ri Array#flatten, after ri has created a cache the first time that + it runs). + * Made ri many times faster when searching for an unqualified method (i.e., + ri read, again after the first such search has populated ri's cache) + * Changed ri to do regular expression searches for unqualified methods; + now, a regular expression for a method can be passed to ri on the + command-line. + * Added an interactive mode to ri (patch by Daniel Choi). Now, when ri + is given a -i argument, it will allow the user to disambiguate + unqualified methods if more than one is present and also will allow a + user to get information for a class' method. + +* 8 Minor Enhancements + * RDoc now adds the package title to the web pages that it generates + for files and classes/modules, which helps them appear better in + search engine results. + * RDoc now automatically generates cross-reference links for classes and + methods specified relative to the global namespace (i.e., ::A::B::C#method). + * All built-in templates now output valid, strict XHTML. + * The documentation is slightly better organized (the markup details were + merged into the RDoc module's documentation). + * Improved rdoc's HTML generation speed by about 20% (on Windows, the + boost seems larger). + * Provided an ri command-line option to control its caching behavior. + * Improved RDoc's documentation. Added RI.txt to document ri. + * Allow HTML templates distributed as gems to be loaded with the -T option, + just like the standard templates in rdoc/generator/html (so an HTML + template lib/new_template.rb in a gem can be used with rdoc -T new_template) + +* 25 Bug fixes: + * Fixed prototype detection in C parser. Can process ruby 1.8 C files + again. + * Fixed the main page for frameless template. Patch by Marcin Raczkowski. + * Fixed the main page for frame templates. Now, if no main page is + specified, RDoc will default to the README. + * Fixed missing stylesheet in generated chm. Patch by Gordon Thiesfeld. + * Fixed the parsing of module names starting with '::'. Patch by + Giuseppe Bilotta. + * Fixed a case where RDoc first would encounter Foo::Bar and then would + encounter class Foo. Previously, RDoc erroneously would have considered + that both a Foo class and a Foo module existed. + * Fix a class where RDoc would not generate correct cross-reference links + to a class contained within a module of the same name (i.e. RDoc::RDoc) + * Prevented RDoc from trying to parse binary files, which would produce + garbage output. + * RDoc now correctly converts ' characters to apostrophes, opening single + quotes, and closing single quotes in most cases (smart single quotes). + * RDoc now correctly converts " characters to opening double quotes and + and closing double quotes in most cases (smart double quotes). + * (c) correctly is converted into the copyright symbol. + * '&' characters in text now correctly are translated to HTML character codes. + * Fixed missing stylesheet in generated chm. Patch by Gordon Thiesfeld. + * Fixed broken method links in the built-in templates. + * RDoc properly links to files and classes in the one page HTML template. + * The kilmer and hefss templates properly syntax highlight when inlining + source code. + * The kilmer and hefss template class pages properly display methods again. + * Fixed broken class, file, and method links in the frameless template. + * Fixed the clipping of source code in the html and frameless templates when + the source code cannot fit into the window; a scrollbar now will allow + all of the source code to be viewed. + * Fixed the missing constant descriptions in the html and frameless + templates. + * Fixed the ri command-line options that customize the directories to be + searched for documentation. + * Fixed the XML generator. Patch by Anthony Durity. + * Stopped the XML template from generating invalid XML due to malformed + embedded ruby. + * Adding missing information about a class' constants to the XML template. + * Fixed the horizontal rule markup (---) so that it correctly adds a + horizontal rule rather than suppressing all text that follows. + +== 2.1.0 / 2008-07-20 + +* 3 Major Enhancements: + * RDoc now knows about meta-programmed methods, see RDoc::Parser::Ruby + * Reorganized parsers under RDoc::Parser base class + * ri now walks the ancestors of a class looking for a method e.g. ri + File#read displays documentation for IO#read (may require regeneration of + ri data) +* 5 Minor Enhancements: + * Allow links to files + * Default options now taken from RDOCOPT environment variable + * Class method documentation can be found at toplevel now (def X.foo) + * Allow HTML templates distributed as gems to be loaded with the -T option, + just like the standard templates in rdoc/generator/html (so an HTML + template lib/new_template.rb in a gem can be used with rdoc -T new_template) + * `rdoc -v` prints out files, classes, modules and methods as it goes +* 11 Bug Fixes: + * `ri Foo.bar` now looks for class methods also + * Sections work in the default template again + * Doesn't warn about :foo:: list item being an unrecognized directive + * RDoc no longer converts characters inside tt tags + * Fixed "uninitialized constant RDoc::Markup::ToHtml::HTML" + * Fixed generation of relative links + * Fixed various diagram generation issues + * Fixed templates broken by switch to erb + * Fixed issue with style comments + * Lowercase words are no longer rdoc'd as methods without leading #, as + described in the documentation + * RDoc now correctly sets superclasses if they were originally unknown + +== 2.0.0 / 2008-04-10 + +* 3 Major Enhancements: + * Renamespaced everything RDoc under the RDoc module. + * New `ri` implementation. + * Reads from a cache in ~/.ri/ for enhanced speed. + * RubyGems aware, only searches latest gem versions. + * Now up to over 100 tests and 200 assertions. +* 4 Minor Enhancements: + * Switched to an ERb-based TemplatePage, see RDoc::TemplatePage. + * Class/module ri now displays attribute and constant comments. + * Cross-references can be disabled with a leading \. + * Relaxed parsing for some RDoc inline markup. diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/LEGAL.rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/LEGAL.rdoc new file mode 100644 index 0000000..dae1059 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/LEGAL.rdoc @@ -0,0 +1,50 @@ +# coding: UTF-8 + += Legal Notice Information + +The files in this distribution are covered by the Ruby license (see LICENSE) except the features mentioned below: + +Darkfish:: + Darkfish was written by Michael Granger and is included under the BSD 3-Clause + license. Darkfish contains images from the Silk Icons set by Mark James. + + See lib/rdoc/generator/darkfish.rb for license information. + + * lib/rdoc/generator/darkfish.rb + * lib/rdoc/generator/template/darkfish/* + * lib/rdoc/generator/template/darkfish/images + +SDoc:: + Portions of SDoc by (Володя Колесников) Vladimir Kolesnikov are included + under the MIT license as RDoc::Generator::JsonIndex. See + lib/rdoc/generator/json_index.rb for license information. + + * lib/rdoc/generator/json_index.rb + * lib/rdoc/generator/template/json_index/* + * The +#search_index+ methods on RDoc::CodeObject subclasses were derived + from sdoc. + * RDoc::ClassModule#document_self_or_methods comes from SDoc. + +peg-markdown:: + RDoc's Markdown support is derived from peg-markdown by John MacFarlane. It + is used under the MIT license. See RDoc::Markdown for license details. + +MarkdownTest:: + test/test_rdoc_markdown_test.rb uses MarkdownTest 1.0.3's source files which + are included as test/MarkdownTest_1.0.3/*.text which are Copyright (c) + 2004-2005 John Gruber http://daringfireball.net and is included under the + same terms as Perl itself. + + See http://dev.perl.org/licenses/ for the terms of the Perl license. + +Fonts:: + Source Code Pro is (c) 2010, 2012 Adobe Systems Incorporated. + + Lato is (c) 2010 Łukasz Dziedzic. + + Both fonts are used under the SIL Open Font License, Version 1.1. The + license is available at http://scripts.sil.org/OFL + + See lib/rdoc/generator/template/darkfish/fonts.css for complete copyright + and license information, including a copy of the OFL. + diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/LICENSE.rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/LICENSE.rdoc new file mode 100644 index 0000000..c61bb93 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/LICENSE.rdoc @@ -0,0 +1,59 @@ += License + +RDoc is copyrighted free software. + +You can redistribute it and/or modify it under either the terms of the GPL +version 2 (see the file GPL), or the conditions below: + +1. You may make and give away verbatim copies of the source form of the + software without restriction, provided that you duplicate all of the + original copyright notices and associated disclaimers. + +2. You may modify your copy of the software in any way, provided that + you do at least ONE of the following: + + a. place your modifications in the Public Domain or otherwise + make them Freely Available, such as by posting said + modifications to Usenet or an equivalent medium, or by allowing + the author to include your modifications in the software. + + b. use the modified software only within your corporation or + organization. + + c. give non-standard binaries non-standard names, with + instructions on where to get the original software distribution. + + d. make other distribution arrangements with the author. + +3. You may distribute the software in object code or binary form, + provided that you do at least ONE of the following: + + a. distribute the binaries and library files of the software, + together with instructions (in the manual page or equivalent) + on where to get the original distribution. + + b. accompany the distribution with the machine-readable source of + the software. + + c. give non-standard binaries non-standard names, with + instructions on where to get the original software distribution. + + d. make other distribution arrangements with the author. + +4. You may modify and include the part of the software into any other + software (possibly commercial). But some files in the distribution + are not written by the author, so that they are not under these terms. + + For the list of those files and their copying conditions, see the + file LEGAL. + +5. The scripts and library files supplied as input to or produced as + output from the software do not automatically fall under the + copyright of the software, but belong to whomever generated them, + and may be sold commercially, and may be aggregated with this + software. + +6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/README.rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/README.rdoc new file mode 100644 index 0000000..c4b60b2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/README.rdoc @@ -0,0 +1,144 @@ += \RDoc - Ruby Documentation System + +home :: https://github.com/ruby/rdoc +rdoc :: https://ruby.github.io/rdoc +bugs :: https://github.com/ruby/rdoc/issues +code quality :: https://codeclimate.com/github/ruby/rdoc + +== Description + +RDoc produces HTML and command-line documentation for Ruby projects. RDoc +includes the +rdoc+ and +ri+ tools for generating and displaying documentation +from the command-line. + +== Generating Documentation + +Once installed, you can create documentation using the +rdoc+ command + + $ rdoc [options] [names...] + +For an up-to-date option summary, type + + $ rdoc --help + +A typical use might be to generate documentation for a package of Ruby +source (such as RDoc itself). + + $ rdoc + +This command generates documentation for all the Ruby and C source +files in and below the current directory. These will be stored in a +documentation tree starting in the subdirectory +doc+. + +You can make this slightly more useful for your readers by having the +index page contain the documentation for the primary file. In our +case, we could type + + % rdoc --main README.rdoc + +You'll find information on the various formatting tricks you can use +in comment blocks in the documentation this generates. + +RDoc uses file extensions to determine how to process each file. File names +ending +.rb+ and +.rbw+ are assumed to be Ruby source. Files +ending +.c+ are parsed as C files. All other files are assumed to +contain just Markup-style markup (with or without leading '#' comment +markers). If directory names are passed to RDoc, they are scanned +recursively for C and Ruby source files only. + +To generate documentation using +rake+ see RDoc::Task[https://ruby.github.io/rdoc/RDoc/Task.html]. + +To generate documentation programmatically: + + gem 'rdoc' + require 'rdoc/rdoc' + + options = RDoc::Options.new + options.files = ['a.rb', 'b.rb'] + options.setup_generator 'darkfish' + # see RDoc::Options + + rdoc = RDoc::RDoc.new + rdoc.document options + # see RDoc::RDoc + +You can specify the target files for document generation with +.document+ file in the project root directory. ++.document+ file contains a list of file and directory names including comment lines starting with '#'. +See https://github.com/ruby/rdoc/blob/master/.document as an example. + +== Writing Documentation + +To write documentation for RDoc place a comment above the class, module, +method, constant, or attribute you want documented: + + ## + # This class represents an arbitrary shape by a series of points. + + class Shape + + ## + # Creates a new shape described by a +polyline+. + # + # If the +polyline+ does not end at the same point it started at the + # first pointed is copied and placed at the end of the line. + # + # An ArgumentError is raised if the line crosses itself, but shapes may + # be concave. + + def initialize polyline + # ... + end + + end + +The default comment markup format is the RDoc::Markup format. +TomDoc[rdoc-ref:RDoc::TomDoc], Markdown[rdoc-ref:RDoc::Markdown] and +RD[rdoc-ref:RDoc::RD] format comments are also supported. You can set the +default comment format for your entire project by creating a +.rdoc_options file. See RDoc::Options@Saved+Options for instructions +on creating one. You can also set the comment format for a single file +through the +:markup:+ directive, but this is only recommended if you wish to +switch markup formats. See RDoc::Markup@Other+directives. + +Comments can contain directives that tell RDoc information that it cannot +otherwise discover through parsing. See RDoc::Markup@Directives to control +what is or is not documented, to define method arguments or to break up +methods in a class by topic. See RDoc::Parser::Ruby for directives used to +teach RDoc about metaprogrammed methods. + +See RDoc::Parser::C for documenting C extensions with RDoc. + +To determine how well your project is documented run rdoc -C lib to +get a documentation coverage report. rdoc -C1 lib includes parameter +names in the documentation coverage report. + +== Theme Options + +There are a few community-maintained themes for \RDoc: + +- rorvswild-theme-rdoc[https://github.com/BaseSecrete/rorvswild-theme-rdoc] +- hanna[https://github.com/jeremyevans/hanna] (a fork maintained by {Jeremy Evans}[https://github.com/jeremyevans]) + +Please follow the theme's README for usage instructions. + +== Bugs + +See CONTRIBUTING.rdoc for information on filing a bug report. It's OK to file +a bug report for anything you're having a problem with. If you can't figure +out how to make RDoc produce the output you like that is probably a +documentation bug. + +== License + +RDoc is Copyright (c) 2001-2003 Dave Thomas, The Pragmatic Programmers. +Portions (c) 2007-2011 Eric Hodel. Portions copyright others, see individual +files and LEGAL.rdoc for details. + +RDoc is free software, and may be redistributed under the terms specified in +LICENSE.rdoc. + +== Warranty + +This software is provided "as is" and without any express or implied +warranties, including, without limitation, the implied warranties of +merchantability and fitness for a particular purpose. diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/RI.md b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/RI.md new file mode 100644 index 0000000..45addac --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/RI.md @@ -0,0 +1,842 @@ +# `ri`: Ruby Information + +`ri` (ruby information) is the Ruby command-line utility +that gives fast and easy on-line access to Ruby documentation. + +`ri` can show documentation for Ruby itself and for its installed gems: + +- A **class** or **module**: + text associated with the class or module definition + in a source file (`.rb` or `.c`). +- One or more **methods**: + text associated with method definitions + in source files (`.rb` and `.c`). +- A **page**: + text from a stand-alone documentation file + (`.rdoc` or `.md`, or sometimes other). + +Examples (output omitted): + +```sh +$ ri Hash # Document for class Hash. +$ ri Array#sort # Document for instance method sort in class Array. +$ ri read # Documents for methods ::read and #read in all classes and modules. +$ ri ruby:dig_methods # Document for page dig_methods. +``` + +`ri` can also show lists of: + +- **classes** and **modules**: + full or partial list. +- **pages**: + for Ruby or for an installed gem. + +Examples (output omitted): + +```sh +$ ri --list # List of classes and modules. +$ ri ruby: # List of Ruby pages. +``` + +## Why `ri`? + +Using `ri` may have advantages over using +the [Ruby online documentation](https://docs.ruby-lang.org/en/master): + +- The `ri` documentation is always available, even when you do not have internet access + (think: airplane mode). +- If you are working in a terminal window, typing `ri _whatever_` (or just `ri`) + may be faster than navigating to a browser window and searching for documentation. +- If you are working in an + [irb \(interactive Ruby\)](https://docs.ruby-lang.org/en/master/IRB.html) + session, you _already_ have immediate access to `ri`: + just type `'show_doc'`. + +## Modes + +There are two `ri` modes: + +- Static mode: + In general, `ri` responds in its static mode + if a _name_ is given; + it shows results and exits (as in the examples above). + See [Static Mode][1]. +- Interactive mode: + In general, `ri` enters its interactive mode + if no _name_ is given; + in interactive mode, `ri` shows results and waits for another command: + + ```sh + $ ri + Enter the method name you want to look up. + You can use tab to autocomplete. + Enter a blank line to exit. + >> + ``` + + See [Interactive Mode][2]. + +## Names + +In both modes, static and interactive, +`ri` responds to an input _name_ that specifies what is to be displayed: +a document, multiple documents, or other information: + +- Static mode (in the shell): type `'ri _name_'`; + examples (output omitted): + + ```sh + $ ri File + $ ri IO#readlines + $ ri ruby: + ``` + +- Interactive mode (already in `ri`): just type the _name_; + examples (output omitted): + + ```sh + $ ri + Enter the method name you want to look up. + You can use tab to autocomplete. + Enter a blank line to exit. + >> File + >> IO#readlines + >> ruby: + ``` + +### Names for Class and Module Documents + +These example `ri` commands cite names for class and module documents +(see [details and examples][3]): + +| Command | Shows | +|------------------------------|------------------------------------------------------------| +| ri File | Document for Ruby class File. | +| ri File::Stat | Document for Ruby nested class File::Stat. | +| ri Enumerable | Document for Ruby module Enumerable. | +| ri Arr | Document for Ruby class Array (unique initial characters). | +| ri Nokogiri::HTML4::Document | Document for gem class Nokogiri::HTML4::Document. | +| ri Nokogiri | Document for gem module Nokogiri. | +
+ +If [option \\--all][4] +is in effect, documents for the methods in the named class or module +are included in the display. + +### Names for Method Documents + +These example `ri` commands cite names for method documents +(see [details and examples][5]): + +| Command | Shows | +|--------------------------------------|----------------------------------------------------------------------------------| +| ri IO::readlines | Document for Ruby class method IO::readlines. | +| ri IO#readlines | Document for Ruby instance method IO::readlines. | +| ri IO.readlines | Documents for Ruby instance method IO::readlines and class method IO::readlines. | +| ri ::readlines | Documents for all class methods ::readlines. | +| ri #readlines | Documents for all instance methods #readlines. | +| ri .readlines, ri readlines | Documents for class methods ::readlines and instance methods #readlines. | +| ri Nokogiri::HTML4::Document::parse | Document for gem class method Nokogiri::HTML4::Document::parse. | +| ri Nokogiri::HTML4::Document#fragment | Document for gem instance method Nokogiri::HTML4::Document#fragment. | +
+ +### Names for Page Documents + +These example `ri` commands cite names for page documents +(see [details and examples][6]): + +| Command | Shows | +|--------------------------------|--------------------------------------------------| +| ri ruby:syntax/assignment.rdoc | Document for Ruby page assignment. | +| ri ruby:syntax/assignment | Same document, if no other syntax/assignment.*. | +| ri ruby:assignment | Same document, if no other */assignment.*. | +| ri nokogiri:README.md | Document for page README.md. | +
+ +### Names for Lists + +These example `ri` commands cite names for lists +(see [details and examples][7]): + +| Command | Shows | +|---------------|-------------------------| +| ri ruby: | List of Ruby pages. | +| ri nokogiri: | List of Nokogiri pages. | +
+ +There are more lists available; +see [option \\--list][8]. + +## Pro Tips + +### `ri` at the Ready + +If you are a frequent `ri` user, +you can save time by keeping open a dedicated command window +with either of: + +- A running [interactive ri][2] session. +- A running [irb session][9]; + type `'show_doc'` to enter `ri`, newline to exit. + +When you switch to that window, `ri` is ready to respond quickly, +without the performance overhead of re-reading `ri` sources. + +### Output Filters + +The `pager` value actually need not be simply the path to an executable; +it's actually a full-fledged command line, +and so may include not only the executable path, +but also whatever options and arguments that executable accepts. + +You can, for example, set the pager value to `'grep . | less'`, +which will exclude blank lines (thus saving screen space) +before piping the result to `less`; +example (output omitted): + +```sh +$ RI_PAGER="grep . | less" ri Array +``` + +See the documentation for your chosen pager programs +(e.g, type `'grep --help'`, `'less --help'`). + +### Links in `ri` Output + +#### Implicit Link + +When you see: + +- `'IO::readlines'`, `'IO#readlines'`, `'IO.readlines'`: + use that same text as the _name_ in an `ri` command. + + Examples (output omitted): + + ```sh + $ ri IO::readlines + $ ri IO#readlines + $ ri IO.readlines + ``` + +- `'#read'`, `'::read'`, `'.read'`: + you're likely already in the `ri` document for a class or module, + or for a method in a class or module; + use that same text with the name of the class or module (such as `'File'`) + as the _name_ in an `ri` command. + + Examples (output omitted): + + ```sh + $ ri File::read + $ ri File#read + $ ri File.read + ``` + +#### Explicit Link + +When you see: + +- `'{Dig Methods}[rdoc-ref:doc/dig_methods.rdoc]'`: + use the trailing part of the `'[rdoc-ref:doc/'` in an `ri` command + for a Ruby document. + + Example (output omitted): + + ```sh + $ ri ruby:dig_methods.rdoc + ``` + +- `'{Table (information)}[https://en.wikipedia.org/wiki/Table_(information)]'`: + go to the given URL in your browser. + +## About the Examples + +- `ri` output can be large; + to save space, an example may pipe it to one of these: + + - [head](https://www.man7.org/linux/man-pages/man1/head.1.html): leading lines only. + - [tail](https://www.man7.org/linux/man-pages/man1/tail.1.html): trailing lines only. + - [wc -l](https://www.man7.org/linux/man-pages/man1/wc.1.html): line count only. + - [grep](https://www.man7.org/linux/man-pages/man1/grep.1.html): selected lines only. + +- An example that involves a gem assumes that gems `nokogiri` and `minitest` are installed. + +## `ri` Documents + +This section outlines what you can expect to find +in the `ri` document for a class, module, method, or page. + +See also: + +- [Pager][10]. +- [Links in ri Output][11]. + +### Class and Module Documents + +The document for a class or module shows: + +- The class or module name, along with its parent class if any. +- Where it's defined (Ruby core or gem). +- When each exists: + + - The names of its included modules. + - The text of its embedded documentation. + - Its constants. + - Its class methods. + - Its instance methods. + +Examples: + +- Ruby class `Array`: + + ```sh + $ ri Array | head + = Array < Object + + ------------------------------------------------------------------------ + = Includes: + Enumerable (from ruby core) + + (from ruby core) + ------------------------------------------------------------------------ + An Array is an ordered, integer-indexed collection of objects, called + elements. Any object may be an Array element. + ``` + +- Gem module `Nokogiri`: + + ```sh + $ ri Nokogiri | head + = Nokogiri + + (from gem nokogiri-1.16.2-x86_64-linux) + ------------------------------------------------------------------------ + + Nokogiri parses and searches XML/HTML very quickly, and also has + correctly implemented CSS3 selector support as well as XPath 1.0 + support. + + Parsing a document returns either a Nokogiri::XML::Document, or a + ``` + +The document typically includes certain headings, +which may be useful for searching: + +```sh +$ ri IO | grep "^= " += IO < Object += Includes: += Constants: += Class methods: += Instance methods: +``` + +### Method Documents + +The document for a method includes: + +- The source of the method: `'(from ruby core)'` or `'(from gem _gem_)'`. +- The calling sequence(s) for the method. +- The text of its embedded documentation (if it exists). + +Examples: + +```sh +$ ri IO#read | head += IO#read + +(from ruby core) +------------------------------------------------------------------------ +ios.read([length [, outbuf]]) -> string, outbuf, or nil + +------------------------------------------------------------------------ + +Reads length bytes from the I/O stream. +``` + +```sh +$ ri Nokogiri::parse | head += Nokogiri::parse + +(from gem nokogiri-1.16.2-x86_64-linux) +------------------------------------------------------------------------ + parse(string, url = nil, encoding = nil, options = nil) { |doc| ... } + +------------------------------------------------------------------------ + +Parse an HTML or XML document. string contains the document. +``` + +The output for a _name_ that cites methods includes the document +for each found implementation; +the number of such implementations depends on the _name_: + +- Within a class: + + Each of these commands shows documents + for methods in Ruby class `IO` (output omitted): + + ```sh + $ ri IO::readlines # Class method ::readlines. + $ ri IO#readlines # Instance method #readlines. + $ ri IO.readlines # Both of above. + ``` + +- In all classes: + + Each of these commands shows documents + for methods in all classes (output omitted): + + ```sh + $ ri ::readlines # Class method ::readlines. + $ ri \#readlines # Instance method #readlines. + $ ri .readlines # Both of above. + ``` + + For these all-classes commands, + the output is organized into sections, + one for each found method (output filtered to show sections): + + ```sh + $ ri ::readlines | grep "= Implementation" + === Implementation from CSV + === Implementation from IO + ``` + + ```sh + $ ri \#readlines | grep "= Implementation" + === Implementation from ARGF + === Implementation from CSV + === Implementation from IO + === Implementation from Kernel + === Implementation from Buffering + === Implementation from Pathname + === Implementation from StringIO + === Implementation from GzipReader + ``` + + ```sh + $ ri .readlines | grep "= Implementation" + === Implementation from ARGF + === Implementation from CSV + === Implementation from CSV + === Implementation from IO + === Implementation from IO + === Implementation from Kernel + === Implementation from Buffering + === Implementation from Pathname + === Implementation from StringIO + === Implementation from GzipReader + ``` + +### Page Documents + +The document for a Ruby page is the text from the `.rdoc` or `.md` source +for that page: + +```sh +$ ri ruby:dig_methods | head += Dig Methods + +Ruby's dig methods are useful for accessing nested data structures. + +Consider this data: + item = { + id: "0001", + type: "donut", + name: "Cake", + ppu: 0.55, +``` + +The document for a gem page is whatever the gem has generated +for the page: + +```sh +$ ri minitest:README | head += minitest/{test,spec,mock,benchmark} + +home: + https://github.com/minitest/minitest + +bugs: + https://github.com/minitest/minitest/issues + +rdoc: + https://docs.seattlerb.org/minitest +``` + +## `ri` Lists + +The list of Ruby pages is available via _name_ `'ruby:'`: + +```sh +$ ri ruby: | head += Pages in ruby core + +CONTRIBUTING.md +COPYING +COPYING.ja +LEGAL +NEWS-1.8.7 +NEWS-1.9.1 +NEWS-1.9.2 +NEWS-1.9.3 +``` + +```sh +$ ri ruby: | tail +syntax/control_expressions.rdoc +syntax/exceptions.rdoc +syntax/literals.rdoc +syntax/methods.rdoc +syntax/miscellaneous.rdoc +syntax/modules_and_classes.rdoc +syntax/pattern_matching.rdoc +syntax/precedence.rdoc +syntax/refinements.rdoc +win32/README.win32 +``` + +The list of gem pages is available via _name_ `'_gem_name_'`: + +```sh +$ ri nokogiri: | head += Pages in gem nokogiri-1.16.2-x86_64-linux + +README.md +lib/nokogiri/css/tokenizer.rex +``` + +See also: + +- [Option \\--list][8]: + lists classes and modules. +- [Option \\--list-doc-dirs][12]: + lists `ri` source directories. + +## `ri` Information + +With certain options, +an `ri` command may display information other than documents or lists: + +- [Option \\--help or -h][13]: + Shows `ri` help text. +- [option \\--version or -v][14]: + Shows `ri` version. +- [Option \\--dump=FILEPATH][15]: + Shows dump of `ri` cache file at the given filepath. + +## Static Mode + +In static mode, `ri` shows a response and exits. + +In general, `ri` responds in static mode +if the command gives a _name_: + +```sh +$ ri Array | head += Array < Object + +------------------------------------------------------------------------ += Includes: +Enumerable (from ruby core) + +(from ruby core) +------------------------------------------------------------------------ +An Array is an ordered, integer-indexed collection of objects, called +elements. Any object may be an Array element. +``` + +`ri` also responds in static mode when certain options are given, +even when no _name_ is given; +see [ri Information][16]. + +## Interactive Mode + +In general, `ri` responds to a command in interactive mode +if the command has no arguments: + +```sh +$ ri +Enter the method name you want to look up. +You can use tab to autocomplete. +Enter a blank line to exit. +>> + +``` + +A command in interactive mode are similar to one in static mode, +except that it: + +- Omits command word `ri`; you just type the _name_. +- Omits options; in interactive mode the only options in effect + are those taken from environment variable `RI`. + See [Options][17]. +- Supports tab auto-completion for the name of a class, module, or method; + when, for example, you type `"Arr\t"` (here `"\t` represents the tab character), + `ri` "completes" the text as `'Array '`. + +See also [ri at the Ready][18]. + +## Pager + +Because `ri` output is often large, +`ri` by default pipes it to a _pager_, +which is the program whose name is the first-found among: + +- The value of `ENV['RI_PAGER']`. +- The value of `ENV['PAGER']`. +- `'pager'`. +- `'less'`. +- `'more'`. + +If none is found, the output goes directly to `$stdout`, with no pager. + +If you set environment variable `RI_PAGER` or `PAGER`, +its value should be the name of an executable program +that will accept the `ri` output (such as `'pager'`, `'less'`, or `'more'`). + +See also [Output Filters][19]. + +## Options + +Options may be given on the `ri` command line; +those should be whitespace-separated, and must precede the given _name_, if any. + +Options may also be specified in environment variable `RI`; +those should also be whitespace-separated. + +An option specified in environment variable `RI` +may be overridden by an option on the `ri` command line: + +```sh +$ RI="--all" ri Array | wc -l +4224 +$ RI="--all" ri --no-all Array | wc -l +390 +``` + +### Source Directories Options + +#### Options `--doc-dir=DIRPATH`, `-d DIRPATH` + +Option `--doc-dir=DIRPATH` (aliased as `-d`) adds the given directory path +to the beginning of the array of `ri` source directory paths: + +```sh +$ ri --doc-dir=/tmp --list-doc-dirs | head -1 +/tmp +``` + +#### Options `--gems`, `--no-gems` + +Option `--gems` (the default) specifies that documents from installed gems +may be included; +option `--no-gems` may be used to exclude them: + +```sh +$ ri --list | wc -l +1417 +$ ri --list --no-gems| wc -l +1262 +``` + +#### Options `--home`, `--no-home` + +Option `--home` (the default) specifies that `ri` is to include source directory +in `~/.rdoc` if it exists; +option `--no-home` may be used to exclude them. + +#### Options `--list-doc-dirs`, `--no-list-doc-dirs` + +Option `--list-doc-dirs` specifies that a list of the `ri` source directories +is to be displayed; +default is `--no-list-doc-dirs`. + +#### Option `--no-standard` + +Option `--no-standard` specifies that documents from the standard libraries +are not to be included; +default is to include documents from the standard libraries. + +#### Options `--site`, `--no-site` + +Option `--site` (the default) specifies that documents from the site libraries +may be included; +option `--no-site` may be used to exclude them. + +#### Options `--system`, `--no-system` + +Option `--system` (the default) specifies that documents from the system libraries +may be included; +option `--no-system` may be used to exclude them. + +### Mode Options + +#### Options `--interactive`, `-i`, `--no-interactive` + +Option `--interactive` (aliased as `-i`) +specifies that `ri` is to enter interactive mode (ignoring the _name_ if given); +the option is the default when no _name_ is given; +option `--no-interactive` (the default) +specifies that `ri` is not to enter interactive mode, +regardless of whether _name_ is given. + +### Information Options + +#### Options `--help`, `-h` + +Option `--help` (aliased as `-h`) specifies that `ri` is to show +its help text and exit. + +#### Options `--version`, `-v` + +Option `--version` (aliased as `-v`) specifies that `ri` is to show its version and exit. + +### Debugging Options + +#### Options `--dump=FILEPATH`, `--no-dump` + +Option `--dump=FILEPATH` specifies that `ri` is to dump the content +of the `.ri` file at the given file path; +option`--no-dump` (the default) specifies that `ri` is not to dump content. + +The file path may point to any `.ri` file, +but typically would point to one named `cache.ri`: + +```sh +$ ri --dump=/usr/share/ri/3.0.0/system/cache.ri | wc -l +14487 +$ ri --dump=/usr/share/ri/3.0.0/system/cache.ri | head +{:ancestors=> + {"Array"=>["Enumerable", "Object"], + "RubyVM"=>["Object"], + "RubyVM::AbstractSyntaxTree::Node"=>["Object"], + "Object"=>["BasicObject", "Kernel"], + "Integer"=>["Numeric"], + "Module"=>["Object"], + "Class"=>["Module"], + "Complex"=>["Numeric"], + "NilClass"=>["Object"], +``` + +#### Options `--profile`, `--no-profile` + +Option `--profile` specifies that the program is to be run with the Ruby profiler; +option `no-profile` (the default) specifies that the program is not to be run +with the Ruby profiler. + +### Output Options + +#### Options `--format=FORMAT`, `-f FORMAT` + +Option `--format=FORMAT` (aliased as `-f`) specifies the formatter for the output, +which must be `ansi`, `bs`, `markdown`, or `rdoc`; +the default is `bs` for paged output, `ansi` otherwise. + +#### Options `--pager`, `--no-pager` + +Option `--pager` (the default) specifies that the output is to be piped +to a pager; +option `--no-pager` specifies that the output is not to be piped. + +#### Options `--width=NUMBER`, `-w NUMBER` + +Option `--width` (aliased as `-w`) specifies that the lengths of the displayed lines +should be restricted to the given _NUMBER_ of characters; +this is to be accomplished by line-wrapping, not truncation. +The default width is `80`: + +```sh +$ ri --width=40 Array | head += Array < Object + +---------------------------------------- += Includes: +Enumerable (from ruby core) + +(from ruby core) +---------------------------------------- +An Array is an ordered, integer-indexed +collection of objects, called +``` + + +### List Options + +#### Options `--list`, `-l`, `--no-list` + +Option `--list` (aliased as `-l`) specifies that all class and module names +whose initial characters match the given _name_ are to be displayed: +whose initial characters match the given _name_ are to be displayed: + +```sh +$ ri --list Ar | head +ArgumentError +Array +``` + +If no _name_ is given, all class and module names are displayed. + +Option `--no-list` (the default) specifies that a list of class and module names +is not to be displayed. + +### Methods Options (for Class or Module) + +#### Options `--all`, `-a`, `--no-all` + +Option `--all` (aliased as `-a`) specifies that when _name_ identifies a class or module, +the documents for all its methods are included; +option `--no-all` (the default) specifies that the method documents are not to be included: + +```shell +$ ri Array | wc -l +390 +$ ri --all Array | wc -l +4224 +``` + +### Server Option + +#### Option `--server=NUMBER` + +Option `--server` specifies that the \RDoc server is to be run on the port +given as _NUMBER_; +the default port is `8214`. + +## Generating `ri` Source Files + +`ri` by default reads data from directories installed by Ruby and gems. + +You can create your own `ri` source files. +This command creates `ri` source files in local directory `my_ri`, +from Ruby source files in local directory `my_sources`: + +```sh +$ rdoc --op my_ri --format=ri my_sources +``` + +Those files may then be considered for any `ri` command +by specifying option `--doc-dir=my_ri`; +see [option \\--doc-dir][20]. + +[1]: rdoc-ref:RI.md@Static+Mode +[2]: rdoc-ref:RI.md@Interactive+Mode +[3]: rdoc-ref:RI.md@Class+and+Module+Documents +[4]: rdoc-ref:RI.md@Options+--all-2C+-a-2C+--no-all +[5]: rdoc-ref:RI.md@Method+Documents +[6]: rdoc-ref:RI.md@Page+Documents +[7]: rdoc-ref:RI.md@ri+Lists +[8]: rdoc-ref:RI.md@Options+--list-2C+-l-2C+--no-list +[9]: https://docs.ruby-lang.org/en/master/IRB.html +[10]: rdoc-ref:RI.md@Pager +[11]: rdoc-ref:RI.md@Links+in+ri+Output +[12]: rdoc-ref:RI.md@Options+--list-doc-dirs-2C+--no-list-doc-dirs +[13]: rdoc-ref:RI.md@Options+--help-2C+-h +[14]: rdoc-ref:RI.md@Options+--version-2C+-v +[15]: rdoc-ref:RI.md@Options+--dump-3DFILEPATH-2C+--no-dump +[16]: rdoc-ref:RI.md@ri+Information +[17]: rdoc-ref:RI.md@Options +[18]: rdoc-ref:RI.md@ri+at+the+Ready +[19]: rdoc-ref:RI.md@Output+Filters +[20]: rdoc-ref:RI.md@Options+--doc-dir-3DDIRPATH-2C+-d+DIRPATH diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/TODO.rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/TODO.rdoc new file mode 100644 index 0000000..da91911 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/TODO.rdoc @@ -0,0 +1,60 @@ += TODO +This file contains some things that might happen in RDoc, or might not. +Forward Looking Statements applies. + +== RDoc::VERSION.succ + +=== Blockers: + +* Update LICENSE to match ruby's switch +* The alias keyword should not be bidirectional +* Fix RDoc::Parser#use_markup to handle the filename (see TODO) +* Restore backwards compatibility due to paragraph text joining from existing + ri files +* Fix consumption of , after link like: RDoc[rdoc-ref:RDoc], <- comma here +* Remove support for links like Matrix[*rows] + +=== Nice to have: + +* Parse only changed files (like in ruby) +* Page of Glory (or Shame) in HTML output showing documentation coverage + statistics. +* Link to the parent-class implementation of methods that use super +* Add direct accessor to RDoc::Options to RDoc::Task +* Remove "Public" in HTML output if there are only public methods +* Method markup support for rd documentation (per rd syntax) +* Improve SIGINFO handling +* Global variable support +* Provide the code_object to directive handlers + +== More Future + +=== API changes to RDoc + +* RDoc::TopLevel#add_method should automatically create the appropriate method + class rather than requiring one be passed in. +* Remove #comment= from Context subclasses in favor of #add_comment +* Add versions to RDoc::Markup syntax tree marshal format +* Comments can no longer be Strings + +== Crazy Ideas + +* Auto-normalize heading levels to look OK. It's weird to see an

in + the middle of a method section. +* RDoc::CodeObject + * Move into own namespace + * Rename TopLevel to File + * Rename Context to Container + * Rename NormalClass to Class + +== Accessibility + +Page title in right hand side + +Table of contents in left hand side as sub-list under main heading + +For class list, never method list, method summary at top + +table-of-contents-navigation div => nav + role="navigation" + +type "mod", focus is still on "mod" diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/rdoc new file mode 100755 index 0000000..95b6eea --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/rdoc @@ -0,0 +1,43 @@ +#!/usr/bin/env ruby +# +# RDoc: Documentation tool for source code +# (see lib/rdoc/rdoc.rb for more information) +# +# Copyright (c) 2003 Dave Thomas +# Released under the same terms as Ruby + +begin + gem 'rdoc' +rescue NameError => e # --disable-gems + raise unless e.name == :gem +rescue Gem::LoadError +end + +require 'rdoc/rdoc' + +begin + r = RDoc::RDoc.new + r.document ARGV +rescue Errno::ENOSPC + $stderr.puts 'Ran out of space creating documentation' + $stderr.puts + $stderr.puts 'Please free up some space and try again' +rescue SystemExit + raise +rescue Exception => e + if $DEBUG_RDOC then + $stderr.puts e.message + $stderr.puts "#{e.backtrace.join "\n\t"}" + $stderr.puts + elsif Interrupt === e then + $stderr.puts + $stderr.puts 'Interrupted' + else + $stderr.puts "uh-oh! RDoc had a problem:" + $stderr.puts e.message + $stderr.puts + $stderr.puts "run with --debug for full backtrace" + end + + exit 1 +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/ri b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/ri new file mode 100755 index 0000000..7fbed0c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/ri @@ -0,0 +1,12 @@ +#!/usr/bin/env ruby + +begin + gem 'rdoc' +rescue NameError => e # --disable-gems + raise unless e.name == :gem +rescue Gem::LoadError +end + +require 'rdoc/ri/driver' + +RDoc::RI::Driver.run ARGV diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc.rb new file mode 100644 index 0000000..b42059c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc.rb @@ -0,0 +1,211 @@ +# frozen_string_literal: true +$DEBUG_RDOC = nil + +## +# RDoc produces documentation for Ruby source files by parsing the source and +# extracting the definition for classes, modules, methods, includes and +# requires. It associates these with optional documentation contained in an +# immediately preceding comment block then renders the result using an output +# formatter. +# +# For a simple introduction to writing or generating documentation using RDoc +# see the README. +# +# == Roadmap +# +# If you think you found a bug in RDoc see CONTRIBUTING@Bugs +# +# If you want to use RDoc to create documentation for your Ruby source files, +# see RDoc::Markup and refer to rdoc --help for command line usage. +# +# If you want to set the default markup format see +# RDoc::Markup@Markup+Formats +# +# If you want to store rdoc configuration in your gem (such as the default +# markup format) see RDoc::Options@Saved+Options +# +# If you want to write documentation for Ruby files see RDoc::Parser::Ruby +# +# If you want to write documentation for extensions written in C see +# RDoc::Parser::C +# +# If you want to generate documentation using rake see RDoc::Task. +# +# If you want to drive RDoc programmatically, see RDoc::RDoc. +# +# If you want to use the library to format text blocks into HTML or other +# formats, look at RDoc::Markup. +# +# If you want to make an RDoc plugin such as a generator or directive handler +# see RDoc::RDoc. +# +# If you want to write your own output generator see RDoc::Generator. +# +# If you want an overview of how RDoc works see CONTRIBUTING +# +# == Credits +# +# RDoc is currently being maintained by Eric Hodel . +# +# Dave Thomas is the original author of RDoc. +# +# * The Ruby parser in rdoc/parse.rb is based heavily on the outstanding +# work of Keiju ISHITSUKA of Nippon Rational Inc, who produced the Ruby +# parser for irb and the rtags package. + +module RDoc + + ## + # Exception thrown by any rdoc error. + + class Error < RuntimeError; end + + require_relative 'rdoc/version' + + ## + # Method visibilities + + VISIBILITIES = [:public, :protected, :private] + + ## + # Name of the dotfile that contains the description of files to be processed + # in the current directory + + DOT_DOC_FILENAME = ".document" + + ## + # General RDoc modifiers + + GENERAL_MODIFIERS = %w[nodoc].freeze + + ## + # RDoc modifiers for classes + + CLASS_MODIFIERS = GENERAL_MODIFIERS + + ## + # RDoc modifiers for attributes + + ATTR_MODIFIERS = GENERAL_MODIFIERS + + ## + # RDoc modifiers for constants + + CONSTANT_MODIFIERS = GENERAL_MODIFIERS + + ## + # RDoc modifiers for methods + + METHOD_MODIFIERS = GENERAL_MODIFIERS + + %w[arg args yield yields notnew not-new not_new doc] + + ## + # Loads the best available YAML library. + + def self.load_yaml + begin + gem 'psych' + rescue NameError => e # --disable-gems + raise unless e.name == :gem + rescue Gem::LoadError + end + + begin + require 'psych' + rescue ::LoadError + ensure + require 'yaml' + end + end + + ## + # Searches and returns the directory for settings. + # + # 1. $HOME/.rdoc directory, if it exists. + # 2. The +rdoc+ directory under the path specified by the + # +XDG_DATA_HOME+ environment variable, if it is set. + # 3. $HOME/.local/share/rdoc directory. + # + # Other than the home directory, the containing directory will be + # created automatically. + + def self.home + rdoc_dir = begin + File.expand_path('~/.rdoc') + rescue ArgumentError + end + + if File.directory?(rdoc_dir) + rdoc_dir + else + require 'fileutils' + begin + # XDG + xdg_data_home = ENV["XDG_DATA_HOME"] || File.join(File.expand_path("~"), '.local', 'share') + unless File.exist?(xdg_data_home) + FileUtils.mkdir_p xdg_data_home + end + File.join xdg_data_home, "rdoc" + rescue Errno::EACCES + end + end + end + + autoload :RDoc, "#{__dir__}/rdoc/rdoc" + + autoload :CrossReference, "#{__dir__}/rdoc/cross_reference" + autoload :ERBIO, "#{__dir__}/rdoc/erbio" + autoload :ERBPartial, "#{__dir__}/rdoc/erb_partial" + autoload :Encoding, "#{__dir__}/rdoc/encoding" + autoload :Generator, "#{__dir__}/rdoc/generator" + autoload :Options, "#{__dir__}/rdoc/options" + autoload :Parser, "#{__dir__}/rdoc/parser" + autoload :Servlet, "#{__dir__}/rdoc/servlet" + autoload :RI, "#{__dir__}/rdoc/ri" + autoload :Stats, "#{__dir__}/rdoc/stats" + autoload :Store, "#{__dir__}/rdoc/store" + autoload :Task, "#{__dir__}/rdoc/task" + autoload :Text, "#{__dir__}/rdoc/text" + + autoload :Markdown, "#{__dir__}/rdoc/markdown" + autoload :Markup, "#{__dir__}/rdoc/markup" + autoload :RD, "#{__dir__}/rdoc/rd" + autoload :TomDoc, "#{__dir__}/rdoc/tom_doc" + + autoload :KNOWN_CLASSES, "#{__dir__}/rdoc/known_classes" + + autoload :TokenStream, "#{__dir__}/rdoc/token_stream" + + autoload :Comment, "#{__dir__}/rdoc/comment" + + require_relative 'rdoc/i18n' + + # code objects + # + # We represent the various high-level code constructs that appear in Ruby + # programs: classes, modules, methods, and so on. + autoload :CodeObject, "#{__dir__}/rdoc/code_object" + + autoload :Context, "#{__dir__}/rdoc/code_object/context" + autoload :TopLevel, "#{__dir__}/rdoc/code_object/top_level" + + autoload :AnonClass, "#{__dir__}/rdoc/code_object/anon_class" + autoload :ClassModule, "#{__dir__}/rdoc/code_object/class_module" + autoload :NormalClass, "#{__dir__}/rdoc/code_object/normal_class" + autoload :NormalModule, "#{__dir__}/rdoc/code_object/normal_module" + autoload :SingleClass, "#{__dir__}/rdoc/code_object/single_class" + + autoload :Alias, "#{__dir__}/rdoc/code_object/alias" + autoload :AnyMethod, "#{__dir__}/rdoc/code_object/any_method" + autoload :MethodAttr, "#{__dir__}/rdoc/code_object/method_attr" + autoload :GhostMethod, "#{__dir__}/rdoc/code_object/ghost_method" + autoload :MetaMethod, "#{__dir__}/rdoc/code_object/meta_method" + autoload :Attr, "#{__dir__}/rdoc/code_object/attr" + + autoload :Constant, "#{__dir__}/rdoc/code_object/constant" + autoload :Mixin, "#{__dir__}/rdoc/code_object/mixin" + autoload :Include, "#{__dir__}/rdoc/code_object/include" + autoload :Extend, "#{__dir__}/rdoc/code_object/extend" + autoload :Require, "#{__dir__}/rdoc/code_object/require" + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object.rb new file mode 100644 index 0000000..388863b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object.rb @@ -0,0 +1,395 @@ +# frozen_string_literal: true +## +# Base class for the RDoc code tree. +# +# We contain the common stuff for contexts (which are containers) and other +# elements (methods, attributes and so on) +# +# Here's the tree of the CodeObject subclasses: +# +# * RDoc::Context +# * RDoc::TopLevel +# * RDoc::ClassModule +# * RDoc::AnonClass (never used so far) +# * RDoc::NormalClass +# * RDoc::NormalModule +# * RDoc::SingleClass +# * RDoc::MethodAttr +# * RDoc::Attr +# * RDoc::AnyMethod +# * RDoc::GhostMethod +# * RDoc::MetaMethod +# * RDoc::Alias +# * RDoc::Constant +# * RDoc::Require +# * RDoc::Mixin +# * RDoc::Include +# * RDoc::Extend + +class RDoc::CodeObject + + include RDoc::Text + + ## + # Our comment + + attr_reader :comment + + ## + # Do we document our children? + + attr_reader :document_children + + ## + # Do we document ourselves? + + attr_reader :document_self + + ## + # Are we done documenting (ie, did we come across a :enddoc:)? + + attr_reader :done_documenting + + ## + # Which file this code object was defined in + + attr_reader :file + + ## + # Force documentation of this CodeObject + + attr_reader :force_documentation + + ## + # Line in #file where this CodeObject was defined + + attr_accessor :line + + ## + # Hash of arbitrary metadata for this CodeObject + + attr_reader :metadata + + ## + # Sets the parent CodeObject + + attr_writer :parent + + ## + # Did we ever receive a +:nodoc:+ directive? + + attr_reader :received_nodoc + + ## + # Set the section this CodeObject is in + + attr_writer :section + + ## + # The RDoc::Store for this object. + + attr_reader :store + + ## + # When mixed-in to a class, this points to the Context in which it was originally defined. + + attr_accessor :mixin_from + + ## + # Creates a new CodeObject that will document itself and its children + + def initialize + @metadata = {} + @comment = '' + @parent = nil + @parent_name = nil # for loading + @parent_class = nil # for loading + @section = nil + @section_title = nil # for loading + @file = nil + @full_name = nil + @store = nil + @track_visibility = true + @mixin_from = nil + + initialize_visibility + end + + ## + # Initializes state for visibility of this CodeObject and its children. + + def initialize_visibility # :nodoc: + @document_children = true + @document_self = true + @done_documenting = false + @force_documentation = false + @received_nodoc = false + @ignored = false + @suppressed = false + @track_visibility = true + end + + ## + # Replaces our comment with +comment+, unless it is empty. + + def comment=(comment) + @comment = case comment + when NilClass then '' + when RDoc::Comment then comment.normalize + else + if comment and not comment.empty? then + normalize_comment comment + else + # HACK correct fix is to have #initialize create @comment + # with the correct encoding + if String === @comment and @comment.empty? then + @comment = RDoc::Encoding.change_encoding @comment, comment.encoding + end + @comment + end + end + end + + ## + # Should this CodeObject be displayed in output? + # + # A code object should be displayed if: + # + # * The item didn't have a nodoc or wasn't in a container that had nodoc + # * The item wasn't ignored + # * The item has documentation and was not suppressed + + def display? + @document_self and not @ignored and + (documented? or not @suppressed) + end + + ## + # Enables or disables documentation of this CodeObject's children unless it + # has been turned off by :enddoc: + + def document_children=(document_children) + return unless @track_visibility + + @document_children = document_children unless @done_documenting + end + + ## + # Enables or disables documentation of this CodeObject unless it has been + # turned off by :enddoc:. If the argument is +nil+ it means the + # documentation is turned off by +:nodoc:+. + + def document_self=(document_self) + return unless @track_visibility + return if @done_documenting + + @document_self = document_self + @received_nodoc = true if document_self.nil? + end + + ## + # Does this object have a comment with content or is #received_nodoc true? + + def documented? + @received_nodoc or !@comment.empty? + end + + ## + # Turns documentation on/off, and turns on/off #document_self + # and #document_children. + # + # Once documentation has been turned off (by +:enddoc:+), + # the object will refuse to turn #document_self or + # #document_children on, so +:doc:+ and +:start_doc:+ directives + # will have no effect in the current file. + + def done_documenting=(value) + return unless @track_visibility + @done_documenting = value + @document_self = !value + @document_children = @document_self + end + + ## + # File name where this CodeObject was found. + # + # See also RDoc::Context#in_files + + def file_name + return unless @file + + @file.absolute_name + end + + ## + # Force the documentation of this object unless documentation + # has been turned off by :enddoc: + #-- + # HACK untested, was assigning to an ivar + + def force_documentation=(value) + @force_documentation = value unless @done_documenting + end + + ## + # Sets the full_name overriding any computed full name. + # + # Set to +nil+ to clear RDoc's cached value + + def full_name=(full_name) + @full_name = full_name + end + + ## + # Use this to ignore a CodeObject and all its children until found again + # (#record_location is called). An ignored item will not be displayed in + # documentation. + # + # See github issue #55 + # + # The ignored status is temporary in order to allow implementation details + # to be hidden. At the end of processing a file RDoc allows all classes + # and modules to add new documentation to previously created classes. + # + # If a class was ignored (via stopdoc) then reopened later with additional + # documentation it should be displayed. If a class was ignored and never + # reopened it should not be displayed. The ignore flag allows this to + # occur. + + def ignore + return unless @track_visibility + + @ignored = true + + stop_doc + end + + ## + # Has this class been ignored? + # + # See also #ignore + + def ignored? + @ignored + end + + ## + # The options instance from the store this CodeObject is attached to, or a + # default options instance if the CodeObject is not attached. + # + # This is used by Text#snippet + + def options + @store&.options || RDoc::Options.new + end + + ## + # Our parent CodeObject. The parent may be missing for classes loaded from + # legacy RI data stores. + + def parent + return @parent if @parent + return nil unless @parent_name + + if @parent_class == RDoc::TopLevel then + @parent = @store.add_file @parent_name + else + @parent = @store.find_class_or_module @parent_name + + return @parent if @parent + + begin + @parent = @store.load_class @parent_name + rescue RDoc::Store::MissingFileError + nil + end + end + end + + ## + # Name of our parent + + def parent_name + @parent ? @parent.full_name : '(unknown)' + end + + ## + # Records the RDoc::TopLevel (file) where this code object was defined + + def record_location(top_level) + @ignored = false + @suppressed = false + @file = top_level + end + + ## + # The section this CodeObject is in. Sections allow grouping of constants, + # attributes and methods inside a class or module. + + def section + return @section if @section + + @section = parent.add_section @section_title if parent + end + + ## + # Enable capture of documentation unless documentation has been + # turned off by :enddoc: + + def start_doc + return if @done_documenting + + @document_self = true + @document_children = true + @ignored = false + @suppressed = false + end + + ## + # Disable capture of documentation + + def stop_doc + return unless @track_visibility + + @document_self = false + @document_children = false + end + + ## + # Sets the +store+ that contains this CodeObject + + def store=(store) + @store = store + + return unless @track_visibility + + if :nodoc == options.visibility then + initialize_visibility + @track_visibility = false + end + end + + ## + # Use this to suppress a CodeObject and all its children until the next file + # it is seen in or documentation is discovered. A suppressed item with + # documentation will be displayed while an ignored item with documentation + # may not be displayed. + + def suppress + return unless @track_visibility + + @suppressed = true + + stop_doc + end + + ## + # Has this class been suppressed? + # + # See also #suppress + + def suppressed? + @suppressed + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/alias.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/alias.rb new file mode 100644 index 0000000..bd5b3ec --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/alias.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: true +## +# Represent an alias, which is an old_name/new_name pair associated with a +# particular context +#-- +# TODO implement Alias as a proxy to a method/attribute, inheriting from +# MethodAttr + +class RDoc::Alias < RDoc::CodeObject + + ## + # Aliased method's name + + attr_reader :new_name + + alias name new_name + + ## + # Aliasee method's name + + attr_reader :old_name + + ## + # Is this an alias declared in a singleton context? + + attr_reader :singleton + + ## + # Source file token stream + + attr_reader :text + + ## + # Creates a new Alias with a token stream of +text+ that aliases +old_name+ + # to +new_name+, has +comment+ and is a +singleton+ context. + + def initialize(text, old_name, new_name, comment, singleton: false) + super() + + @text = text + @singleton = singleton + @old_name = old_name + @new_name = new_name + self.comment = comment + end + + ## + # Order by #singleton then #new_name + + def <=>(other) + [@singleton ? 0 : 1, new_name] <=> [other.singleton ? 0 : 1, other.new_name] + end + + ## + # HTML fragment reference for this alias + + def aref + type = singleton ? 'c' : 'i' + "#alias-#{type}-#{html_name}" + end + + ## + # HTML id-friendly version of +#new_name+. + + def html_name + CGI.escape(@new_name.gsub('-', '-2D')).gsub('%', '-').sub(/^-/, '') + end + + def inspect # :nodoc: + parent_name = parent ? parent.name : '(unknown)' + "#<%s:0x%x %s.alias_method %s, %s>" % [ + self.class, object_id, + parent_name, @old_name, @new_name, + ] + end + + ## + # '::' for the alias of a singleton method/attribute, '#' for instance-level. + + def name_prefix + singleton ? '::' : '#' + end + + ## + # Old name with prefix '::' or '#'. + + def pretty_old_name + "#{singleton ? '::' : '#'}#{@old_name}" + end + + ## + # New name with prefix '::' or '#'. + + def pretty_new_name + "#{singleton ? '::' : '#'}#{@new_name}" + end + + alias pretty_name pretty_new_name + + def to_s # :nodoc: + "alias: #{self.new_name} -> #{self.pretty_old_name} in: #{parent}" + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/anon_class.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/anon_class.rb new file mode 100644 index 0000000..3c2f0e1 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/anon_class.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +## +# An anonymous class like: +# +# c = Class.new do end +# +# AnonClass is currently not used. + +class RDoc::AnonClass < RDoc::ClassModule +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/any_method.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/any_method.rb new file mode 100644 index 0000000..b319f0d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/any_method.rb @@ -0,0 +1,374 @@ +# frozen_string_literal: true +## +# AnyMethod is the base class for objects representing methods + +class RDoc::AnyMethod < RDoc::MethodAttr + + ## + # 2:: + # RDoc 4 + # Added calls_super + # Added parent name and class + # Added section title + # 3:: + # RDoc 4.1 + # Added is_alias_for + + MARSHAL_VERSION = 3 # :nodoc: + + ## + # Don't rename \#initialize to \::new + + attr_accessor :dont_rename_initialize + + ## + # The C function that implements this method (if it was defined in a C file) + + attr_accessor :c_function + + # The section title of the method (if defined in a C file via +:category:+) + attr_accessor :section_title + + ## + # If true this method uses +super+ to call a superclass version + + attr_accessor :calls_super + + include RDoc::TokenStream + + ## + # Creates a new AnyMethod with a token stream +text+ and +name+ + + def initialize(text, name, singleton: false) + super(text, name, singleton: singleton) + + @c_function = nil + @dont_rename_initialize = false + @token_stream = nil + @calls_super = false + @superclass_method = nil + end + + ## + # Adds +an_alias+ as an alias for this method in +context+. + + def add_alias(an_alias, context = nil) + method = self.class.new an_alias.text, an_alias.new_name, singleton: singleton + + method.record_location an_alias.file + method.params = self.params + method.visibility = self.visibility + method.comment = an_alias.comment + method.is_alias_for = self + @aliases << method + context.add_method method if context + method + end + + ## + # Prefix for +aref+ is 'method'. + + def aref_prefix + 'method' + end + + ## + # The call_seq or the param_seq with method name, if there is no call_seq. + # + # Use this for displaying a method's argument lists. + + def arglists + if @call_seq then + @call_seq + elsif @params then + "#{name}#{param_seq}" + end + end + + ## + # Different ways to call this method + + def call_seq + unless call_seq = _call_seq + call_seq = is_alias_for._call_seq if is_alias_for + end + + return unless call_seq + + deduplicate_call_seq(call_seq) + end + + ## + # Sets the different ways you can call this method. If an empty +call_seq+ + # is given nil is assumed. + # + # See also #param_seq + + def call_seq=(call_seq) + return if call_seq.nil? || call_seq.empty? + + @call_seq = call_seq + end + + ## + # Whether the method has a call-seq. + + def has_call_seq? + !!(@call_seq || is_alias_for&._call_seq) + end + + ## + # Loads is_alias_for from the internal name. Returns nil if the alias + # cannot be found. + + def is_alias_for # :nodoc: + case @is_alias_for + when RDoc::MethodAttr then + @is_alias_for + when Array then + return nil unless @store + + klass_name, singleton, method_name = @is_alias_for + + return nil unless klass = @store.find_class_or_module(klass_name) + + @is_alias_for = klass.find_method method_name, singleton + end + end + + ## + # Dumps this AnyMethod for use by ri. See also #marshal_load + + def marshal_dump + aliases = @aliases.map do |a| + [a.name, parse(a.comment)] + end + + is_alias_for = [ + @is_alias_for.parent.full_name, + @is_alias_for.singleton, + @is_alias_for.name + ] if @is_alias_for + + [ MARSHAL_VERSION, + @name, + full_name, + @singleton, + @visibility, + parse(@comment), + @call_seq, + @block_params, + aliases, + @params, + @file.relative_name, + @calls_super, + @parent.name, + @parent.class, + @section.title, + is_alias_for, + ] + end + + ## + # Loads this AnyMethod from +array+. For a loaded AnyMethod the following + # methods will return cached values: + # + # * #full_name + # * #parent_name + + def marshal_load(array) + initialize_visibility + + @dont_rename_initialize = nil + @token_stream = nil + @aliases = [] + @parent = nil + @parent_name = nil + @parent_class = nil + @section = nil + @file = nil + + version = array[0] + @name = array[1] + @full_name = array[2] + @singleton = array[3] + @visibility = array[4] + @comment = RDoc::Comment.from_document array[5] + @call_seq = array[6] + @block_params = array[7] + # 8 handled below + @params = array[9] + # 10 handled below + @calls_super = array[11] + @parent_name = array[12] + @parent_title = array[13] + @section_title = array[14] + @is_alias_for = array[15] + + array[8].each do |new_name, document| + add_alias RDoc::Alias.new(nil, @name, new_name, RDoc::Comment.from_document(document), singleton: @singleton) + end + + @parent_name ||= if @full_name =~ /#/ then + $` + else + name = @full_name.split('::') + name.pop + name.join '::' + end + + @file = RDoc::TopLevel.new array[10] if version > 0 + end + + ## + # Method name + # + # If the method has no assigned name, it extracts it from #call_seq. + + def name + return @name if @name + + @name = + @call_seq[/^.*?\.(\w+)/, 1] || + @call_seq[/^.*?(\w+)/, 1] || + @call_seq if @call_seq + end + + ## + # A list of this method's method and yield parameters. +call-seq+ params + # are preferred over parsed method and block params. + + def param_list + if @call_seq then + params = @call_seq.split("\n").last + params = params.sub(/.*?\((.*)\)/, '\1') + params = params.sub(/(\{|do)\s*\|([^|]*)\|.*/, ',\2') + elsif @params then + params = @params.sub(/\((.*)\)/, '\1') + + params << ",#{@block_params}" if @block_params + elsif @block_params then + params = @block_params + else + return [] + end + + if @block_params then + # If this method has explicit block parameters, remove any explicit + # &block + params = params.sub(/,?\s*&\w+/, '') + else + params = params.sub(/\&(\w+)/, '\1') + end + + params = params.gsub(/\s+/, '').split(',').reject(&:empty?) + + params.map { |param| param.sub(/=.*/, '') } + end + + ## + # Pretty parameter list for this method. If the method's parameters were + # given by +call-seq+ it is preferred over the parsed values. + + def param_seq + if @call_seq then + params = @call_seq.split("\n").last + params = params.sub(/[^( ]+/, '') + params = params.sub(/(\|[^|]+\|)\s*\.\.\.\s*(end|\})/, '\1 \2') + elsif @params then + params = @params.gsub(/\s*\#.*/, '') + params = params.tr_s("\n ", " ") + params = "(#{params})" unless params[0] == ?( + else + params = '' + end + + if @block_params then + # If this method has explicit block parameters, remove any explicit + # &block + params = params.sub(/,?\s*&\w+/, '') + + block = @block_params.tr_s("\n ", " ") + if block[0] == ?( + block = block.sub(/^\(/, '').sub(/\)/, '') + end + params << " { |#{block}| ... }" + end + + params + end + + ## + # Whether to skip the method description, true for methods that have + # aliases with a call-seq that doesn't include the method name. + + def skip_description? + has_call_seq? && call_seq.nil? && !!(is_alias_for || !aliases.empty?) + end + + ## + # Sets the store for this method and its referenced code objects. + + def store=(store) + super + + @file = @store.add_file @file.full_name if @file + end + + ## + # For methods that +super+, find the superclass method that would be called. + + def superclass_method + return unless @calls_super + return @superclass_method if @superclass_method + + parent.each_ancestor do |ancestor| + if method = ancestor.method_list.find { |m| m.name == @name } then + @superclass_method = method + break + end + end + + @superclass_method + end + + protected + + ## + # call_seq without deduplication and alias lookup. + + def _call_seq + @call_seq if defined?(@call_seq) && @call_seq + end + + private + + ## + # call_seq with alias examples information removed, if this + # method is an alias method. + + def deduplicate_call_seq(call_seq) + return call_seq unless is_alias_for || !aliases.empty? + + method_name = self.name + method_name = method_name[0, 1] if method_name =~ /\A\[/ + + entries = call_seq.split "\n" + + ignore = aliases.map(&:name) + if is_alias_for + ignore << is_alias_for.name + ignore.concat is_alias_for.aliases.map(&:name) + end + ignore.map! { |n| n =~ /\A\[/ ? /\[.*\]/ : n} + ignore.delete(method_name) + ignore = Regexp.union(ignore) + + matching = entries.reject do |entry| + entry =~ /^\w*\.?#{ignore}[$\(\s]/ or + entry =~ /\s#{ignore}\s/ + end + + matching.empty? ? nil : matching.join("\n") + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/attr.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/attr.rb new file mode 100644 index 0000000..969b183 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/attr.rb @@ -0,0 +1,172 @@ +# frozen_string_literal: true +## +# An attribute created by \#attr, \#attr_reader, \#attr_writer or +# \#attr_accessor + +class RDoc::Attr < RDoc::MethodAttr + + ## + # 3:: + # RDoc 4 + # Added parent name and class + # Added section title + + MARSHAL_VERSION = 3 # :nodoc: + + ## + # Is the attribute readable ('R'), writable ('W') or both ('RW')? + + attr_accessor :rw + + ## + # Creates a new Attr with body +text+, +name+, read/write status +rw+ and + # +comment+. +singleton+ marks this as a class attribute. + + def initialize(text, name, rw, comment, singleton: false) + super(text, name, singleton: singleton) + + @rw = rw + self.comment = comment + end + + ## + # Attributes are equal when their names, singleton and rw are identical + + def ==(other) + self.class == other.class and + self.name == other.name and + self.rw == other.rw and + self.singleton == other.singleton + end + + ## + # Add +an_alias+ as an attribute in +context+. + + def add_alias(an_alias, context) + new_attr = self.class.new(text, an_alias.new_name, rw, comment, singleton: singleton) + new_attr.record_location an_alias.file + new_attr.visibility = self.visibility + new_attr.is_alias_for = self + @aliases << new_attr + context.add_attribute new_attr + new_attr + end + + ## + # The #aref prefix for attributes + + def aref_prefix + 'attribute' + end + + ## + # Attributes never call super. See RDoc::AnyMethod#calls_super + # + # An RDoc::Attr can show up in the method list in some situations (see + # Gem::ConfigFile) + + def calls_super # :nodoc: + false + end + + ## + # Returns attr_reader, attr_writer or attr_accessor as appropriate. + + def definition + case @rw + when 'RW' then 'attr_accessor' + when 'R' then 'attr_reader' + when 'W' then 'attr_writer' + end + end + + def inspect # :nodoc: + alias_for = @is_alias_for ? " (alias for #{@is_alias_for.name})" : nil + visibility = self.visibility + visibility = "forced #{visibility}" if force_documentation + "#<%s:0x%x %s %s (%s)%s>" % [ + self.class, object_id, + full_name, + rw, + visibility, + alias_for, + ] + end + + ## + # Dumps this Attr for use by ri. See also #marshal_load + + def marshal_dump + [ MARSHAL_VERSION, + @name, + full_name, + @rw, + @visibility, + parse(@comment), + singleton, + @file.relative_name, + @parent.full_name, + @parent.class, + @section.title + ] + end + + ## + # Loads this Attr from +array+. For a loaded Attr the following + # methods will return cached values: + # + # * #full_name + # * #parent_name + + def marshal_load(array) + initialize_visibility + + @aliases = [] + @parent = nil + @parent_name = nil + @parent_class = nil + @section = nil + @file = nil + + version = array[0] + @name = array[1] + @full_name = array[2] + @rw = array[3] + @visibility = array[4] + @comment = RDoc::Comment.from_document array[5] + @singleton = array[6] || false # MARSHAL_VERSION == 0 + # 7 handled below + @parent_name = array[8] + @parent_class = array[9] + @section_title = array[10] + + @file = RDoc::TopLevel.new array[7] if version > 1 + + @parent_name ||= @full_name.split('#', 2).first + end + + def pretty_print(q) # :nodoc: + q.group 2, "[#{self.class.name} #{full_name} #{rw} #{visibility}", "]" do + unless comment.empty? then + q.breakable + q.text "comment:" + q.breakable + q.pp @comment + end + end + end + + def to_s # :nodoc: + "#{definition} #{name} in: #{parent}" + end + + ## + # Attributes do not have token streams. + # + # An RDoc::Attr can show up in the method list in some situations (see + # Gem::ConfigFile) + + def token_stream # :nodoc: + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/class_module.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/class_module.rb new file mode 100644 index 0000000..f6b0abb --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/class_module.rb @@ -0,0 +1,888 @@ +# frozen_string_literal: true +## +# ClassModule is the base class for objects representing either a class or a +# module. + +class RDoc::ClassModule < RDoc::Context + + ## + # 1:: + # RDoc 3.7 + # * Added visibility, singleton and file to attributes + # * Added file to constants + # * Added file to includes + # * Added file to methods + # 2:: + # RDoc 3.13 + # * Added extends + # 3:: + # RDoc 4.0 + # * Added sections + # * Added in_files + # * Added parent name + # * Complete Constant dump + + MARSHAL_VERSION = 3 # :nodoc: + + ## + # Constants that are aliases for this class or module + + attr_accessor :constant_aliases + + ## + # Comment and the location it came from. Use #add_comment to add comments + + attr_accessor :comment_location + + ## + # Class or module this constant is an alias for + + attr_accessor :is_alias_for + + ## + # Return a RDoc::ClassModule of class +class_type+ that is a copy + # of module +module+. Used to promote modules to classes. + #-- + # TODO move to RDoc::NormalClass (I think) + + def self.from_module(class_type, mod) + klass = class_type.new mod.name + + mod.comment_location.each do |comment, location| + klass.add_comment comment, location + end + + klass.parent = mod.parent + klass.section = mod.section + + klass.attributes.concat mod.attributes + klass.method_list.concat mod.method_list + klass.aliases.concat mod.aliases + klass.external_aliases.concat mod.external_aliases + klass.constants.concat mod.constants + klass.includes.concat mod.includes + klass.extends.concat mod.extends + + klass.methods_hash.update mod.methods_hash + klass.constants_hash.update mod.constants_hash + + klass.current_section = mod.current_section + klass.in_files.concat mod.in_files + klass.sections.concat mod.sections + klass.unmatched_alias_lists = mod.unmatched_alias_lists + klass.current_section = mod.current_section + klass.visibility = mod.visibility + + klass.classes_hash.update mod.classes_hash + klass.modules_hash.update mod.modules_hash + klass.metadata.update mod.metadata + + klass.document_self = mod.received_nodoc ? nil : mod.document_self + klass.document_children = mod.document_children + klass.force_documentation = mod.force_documentation + klass.done_documenting = mod.done_documenting + + # update the parent of all children + + (klass.attributes + + klass.method_list + + klass.aliases + + klass.external_aliases + + klass.constants + + klass.includes + + klass.extends + + klass.classes + + klass.modules).each do |obj| + obj.parent = klass + obj.full_name = nil + end + + klass + end + + ## + # Creates a new ClassModule with +name+ with optional +superclass+ + # + # This is a constructor for subclasses, and must never be called directly. + + def initialize(name, superclass = nil) + @constant_aliases = [] + @is_alias_for = nil + @name = name + @superclass = superclass + @comment_location = [] # [[comment, location]] + + super() + end + + ## + # Adds +comment+ to this ClassModule's list of comments at +location+. This + # method is preferred over #comment= since it allows ri data to be updated + # across multiple runs. + + def add_comment(comment, location) + return unless document_self + + original = comment + + comment = case comment + when RDoc::Comment then + comment.normalize + else + normalize_comment comment + end + + if location.parser == RDoc::Parser::C + @comment_location.delete_if { |(_, l)| l == location } + end + + @comment_location << [comment, location] + + self.comment = original + end + + def add_things(my_things, other_things) # :nodoc: + other_things.each do |group, things| + my_things[group].each { |thing| yield false, thing } if + my_things.include? group + + things.each do |thing| + yield true, thing + end + end + end + + ## + # Ancestors list for this ClassModule: the list of included modules + # (classes will add their superclass if any). + # + # Returns the included classes or modules, not the includes + # themselves. The returned values are either String or + # RDoc::NormalModule instances (see RDoc::Include#module). + # + # The values are returned in reverse order of their inclusion, + # which is the order suitable for searching methods/attributes + # in the ancestors. The superclass, if any, comes last. + + def ancestors + includes.map { |i| i.module }.reverse + end + + def aref_prefix # :nodoc: + raise NotImplementedError, "missing aref_prefix for #{self.class}" + end + + ## + # HTML fragment reference for this module or class. See + # RDoc::NormalClass#aref and RDoc::NormalModule#aref + + def aref + "#{aref_prefix}-#{full_name}" + end + + ## + # Ancestors of this class or module only + + alias direct_ancestors ancestors + + ## + # Clears the comment. Used by the Ruby parser. + + def clear_comment + @comment = '' + end + + ## + # This method is deprecated, use #add_comment instead. + # + # Appends +comment+ to the current comment, but separated by a rule. Works + # more like +=. + + def comment=(comment) # :nodoc: + comment = case comment + when RDoc::Comment then + comment.normalize + else + normalize_comment comment + end + + comment = "#{@comment.to_s}\n---\n#{comment.to_s}" unless @comment.empty? + + super comment + end + + ## + # Prepares this ClassModule for use by a generator. + # + # See RDoc::Store#complete + + def complete(min_visibility) + update_aliases + remove_nodoc_children + embed_mixins + update_includes + update_extends + remove_invisible min_visibility + end + + ## + # Does this ClassModule or any of its methods have document_self set? + + def document_self_or_methods + document_self || method_list.any?{ |m| m.document_self } + end + + ## + # Does this class or module have a comment with content or is + # #received_nodoc true? + + def documented? + return true if @received_nodoc + return false if @comment_location.empty? + @comment_location.any? { |comment, _| not comment.empty? } + end + + ## + # Iterates the ancestors of this class or module for which an + # RDoc::ClassModule exists. + + def each_ancestor # :yields: module + return enum_for __method__ unless block_given? + + ancestors.each do |mod| + next if String === mod + next if self == mod + yield mod + end + end + + ## + # Looks for a symbol in the #ancestors. See Context#find_local_symbol. + + def find_ancestor_local_symbol(symbol) + each_ancestor do |m| + res = m.find_local_symbol(symbol) + return res if res + end + + nil + end + + ## + # Finds a class or module with +name+ in this namespace or its descendants + + def find_class_named(name) + return self if full_name == name + return self if @name == name + + @classes.values.find do |klass| + next if klass == self + klass.find_class_named name + end + end + + ## + # Return the fully qualified name of this class or module + + def full_name + @full_name ||= if RDoc::ClassModule === parent then + "#{parent.full_name}::#{@name}" + else + @name + end + end + + ## + # Return array of full_name splitted by +::+. + + def nesting_namespaces + @namespaces ||= full_name.split("::").reject(&:empty?) + end + + ## + # Return array of fully qualified nesting namespaces. + # + # For example, if full_name is +A::B::C+, this method returns ["A", "A::B", "A::B::C"] + + def fully_qualified_nesting_namespaces + return nesting_namespaces if nesting_namespaces.length < 2 + @fqns ||= nesting_namespaces.inject([]) do |list, n| + list << (list.empty? ? n : "#{list.last}::#{n}") + end + end + + ## + # TODO: filter included items by #display? + + def marshal_dump # :nodoc: + attrs = attributes.sort.map do |attr| + next unless attr.display? + [ attr.name, attr.rw, + attr.visibility, attr.singleton, attr.file_name, + ] + end.compact + + method_types = methods_by_type.map do |type, visibilities| + visibilities = visibilities.map do |visibility, methods| + method_names = methods.map do |method| + next unless method.display? + [method.name, method.file_name] + end.compact + + [visibility, method_names.uniq] + end + + [type, visibilities] + end + + [ MARSHAL_VERSION, + @name, + full_name, + @superclass, + parse(@comment_location), + attrs, + constants.select { |constant| constant.display? }, + includes.map do |incl| + next unless incl.display? + [incl.name, parse(incl.comment), incl.file_name] + end.compact, + method_types, + extends.map do |ext| + next unless ext.display? + [ext.name, parse(ext.comment), ext.file_name] + end.compact, + @sections.values, + @in_files.map do |tl| + tl.relative_name + end, + parent.full_name, + parent.class, + ] + end + + def marshal_load(array) # :nodoc: + initialize_visibility + initialize_methods_etc + @current_section = nil + @document_self = true + @done_documenting = false + @parent = nil + @temporary_section = nil + @visibility = nil + @classes = {} + @modules = {} + + @name = array[1] + @full_name = array[2] + @superclass = array[3] + document = array[4] + + @comment = RDoc::Comment.from_document document + + @comment_location = if RDoc::Markup::Document === document.parts.first then + document + else + RDoc::Markup::Document.new document + end + + array[5].each do |name, rw, visibility, singleton, file| + singleton ||= false + visibility ||= :public + + attr = RDoc::Attr.new nil, name, rw, nil, singleton: singleton + + add_attribute attr + attr.visibility = visibility + attr.record_location RDoc::TopLevel.new file + end + + array[6].each do |constant, document, file| + case constant + when RDoc::Constant then + add_constant constant + else + constant = add_constant RDoc::Constant.new(constant, nil, RDoc::Comment.from_document(document)) + constant.record_location RDoc::TopLevel.new file + end + end + + array[7].each do |name, document, file| + incl = add_include RDoc::Include.new(name, RDoc::Comment.from_document(document)) + incl.record_location RDoc::TopLevel.new file + end + + array[8].each do |type, visibilities| + visibilities.each do |visibility, methods| + @visibility = visibility + + methods.each do |name, file| + method = RDoc::AnyMethod.new nil, name, singleton: type == 'class' + method.record_location RDoc::TopLevel.new file + add_method method + end + end + end + + array[9].each do |name, document, file| + ext = add_extend RDoc::Extend.new(name, RDoc::Comment.from_document(document)) + ext.record_location RDoc::TopLevel.new file + end if array[9] # Support Marshal version 1 + + sections = (array[10] || []).map do |section| + [section.title, section] + end + + @sections = Hash[*sections.flatten] + @current_section = add_section nil + + @in_files = [] + + (array[11] || []).each do |filename| + record_location RDoc::TopLevel.new filename + end + + @parent_name = array[12] + @parent_class = array[13] + end + + ## + # Merges +class_module+ into this ClassModule. + # + # The data in +class_module+ is preferred over the receiver. + + def merge(class_module) + @parent = class_module.parent + @parent_name = class_module.parent_name + + other_document = parse class_module.comment_location + + if other_document then + document = parse @comment_location + + document = document.merge other_document + + @comment = RDoc::Comment.from_document(document) + @comment_location = document + end + + cm = class_module + other_files = cm.in_files + + merge_collections attributes, cm.attributes, other_files do |add, attr| + if add then + add_attribute attr + else + @attributes.delete attr + @methods_hash.delete attr.pretty_name + end + end + + merge_collections constants, cm.constants, other_files do |add, const| + if add then + add_constant const + else + @constants.delete const + @constants_hash.delete const.name + end + end + + merge_collections includes, cm.includes, other_files do |add, incl| + if add then + add_include incl + else + @includes.delete incl + end + end + + @includes.uniq! # clean up + + merge_collections extends, cm.extends, other_files do |add, ext| + if add then + add_extend ext + else + @extends.delete ext + end + end + + @extends.uniq! # clean up + + merge_collections method_list, cm.method_list, other_files do |add, meth| + if add then + add_method meth + else + @method_list.delete meth + @methods_hash.delete meth.pretty_name + end + end + + merge_sections cm + + self + end + + ## + # Merges collection +mine+ with +other+ preferring other. +other_files+ is + # used to help determine which items should be deleted. + # + # Yields whether the item should be added or removed (true or false) and the + # item to be added or removed. + # + # merge_collections things, other.things, other.in_files do |add, thing| + # if add then + # # add the thing + # else + # # remove the thing + # end + # end + + def merge_collections(mine, other, other_files, &block) # :nodoc: + my_things = mine. group_by { |thing| thing.file } + other_things = other.group_by { |thing| thing.file } + + remove_things my_things, other_files, &block + add_things my_things, other_things, &block + end + + ## + # Merges the comments in this ClassModule with the comments in the other + # ClassModule +cm+. + + def merge_sections(cm) # :nodoc: + my_sections = sections.group_by { |section| section.title } + other_sections = cm.sections.group_by { |section| section.title } + + other_files = cm.in_files + + remove_things my_sections, other_files do |_, section| + @sections.delete section.title + end + + other_sections.each do |group, sections| + if my_sections.include? group + my_sections[group].each do |my_section| + other_section = cm.sections_hash[group] + + my_comments = my_section.comments + other_comments = other_section.comments + + other_files = other_section.in_files + + merge_collections my_comments, other_comments, other_files do |add, comment| + if add then + my_section.add_comment comment + else + my_section.remove_comment comment + end + end + end + else + sections.each do |section| + add_section group, section.comments + end + end + end + end + + ## + # Does this object represent a module? + + def module? + false + end + + ## + # Allows overriding the initial name. + # + # Used for modules and classes that are constant aliases. + + def name=(new_name) + @name = new_name + end + + ## + # Parses +comment_location+ into an RDoc::Markup::Document composed of + # multiple RDoc::Markup::Documents with their file set. + + def parse(comment_location) + case comment_location + when String then + super + when Array then + docs = comment_location.map do |comment, location| + doc = super comment + doc.file = location + doc + end + + RDoc::Markup::Document.new(*docs) + when RDoc::Comment then + doc = super comment_location.text, comment_location.format + doc.file = comment_location.location + doc + when RDoc::Markup::Document then + return comment_location + else + raise ArgumentError, "unknown comment class #{comment_location.class}" + end + end + + ## + # Path to this class or module for use with HTML generator output. + + def path + prefix = options.class_module_path_prefix + return http_url unless prefix + File.join(prefix, http_url) + end + + ## + # Name to use to generate the url: + # modules and classes that are aliases for another + # module or class return the name of the latter. + + def name_for_path + is_alias_for ? is_alias_for.full_name : full_name + end + + ## + # Returns the classes and modules that are not constants + # aliasing another class or module. For use by formatters + # only (caches its result). + + def non_aliases + @non_aliases ||= classes_and_modules.reject { |cm| cm.is_alias_for } + end + + ## + # Updates the child modules or classes of class/module +parent+ by + # deleting the ones that have been removed from the documentation. + # + # +parent_hash+ is either parent.modules_hash or + # parent.classes_hash and +all_hash+ is ::all_modules_hash or + # ::all_classes_hash. + + def remove_nodoc_children + prefix = self.full_name + '::' + + modules_hash.each_key do |name| + full_name = prefix + name + modules_hash.delete name unless @store.modules_hash[full_name] + end + + classes_hash.each_key do |name| + full_name = prefix + name + classes_hash.delete name unless @store.classes_hash[full_name] + end + end + + def remove_things(my_things, other_files) # :nodoc: + my_things.delete_if do |file, things| + next false unless other_files.include? file + + things.each do |thing| + yield false, thing + end + + true + end + end + + ## + # Search record used by RDoc::Generator::JsonIndex + + def search_record + [ + name, + full_name, + full_name, + '', + path, + '', + snippet(@comment_location), + ] + end + + ## + # Sets the store for this class or module and its contained code objects. + + def store=(store) + super + + @attributes .each do |attr| attr.store = store end + @constants .each do |const| const.store = store end + @includes .each do |incl| incl.store = store end + @extends .each do |ext| ext.store = store end + @method_list.each do |meth| meth.store = store end + end + + ## + # Get the superclass of this class. Attempts to retrieve the superclass + # object, returns the name if it is not known. + + def superclass + @store.find_class_named(@superclass) || @superclass + end + + ## + # Set the superclass of this class to +superclass+ + # + # where +superclass+ is one of: + # + # - +nil+ + # - a String containing the full name of the superclass + # - the RDoc::ClassModule representing the superclass + + def superclass=(superclass) + raise NoMethodError, "#{full_name} is a module" if module? + case superclass + when RDoc::ClassModule + @superclass = superclass.full_name + when nil, String + @superclass = superclass + else + raise TypeError, "superclass must be a String or RDoc::ClassModule, not #{superclass.class}" + end + end + + ## + # Get all super classes of this class in an array. The last element might be + # a string if the name is unknown. + + def super_classes + result = [] + parent = self + while parent = parent.superclass + result << parent + return result if parent.is_a?(String) + end + result + end + + def to_s # :nodoc: + if is_alias_for then + "#{self.class.name} #{self.full_name} -> #{is_alias_for}" + else + super + end + end + + ## + # 'module' or 'class' + + def type + module? ? 'module' : 'class' + end + + ## + # Updates the child modules & classes by replacing the ones that are + # aliases through a constant. + # + # The aliased module/class is replaced in the children and in + # RDoc::Store#modules_hash or RDoc::Store#classes_hash + # by a copy that has RDoc::ClassModule#is_alias_for set to + # the aliased module/class, and this copy is added to #aliases + # of the aliased module/class. + # + # Formatters can use the #non_aliases method to retrieve children that + # are not aliases, for instance to list the namespace content, since + # the aliased modules are included in the constants of the class/module, + # that are listed separately. + + def update_aliases + constants.each do |const| + next unless cm = const.is_alias_for + cm_alias = cm.dup + cm_alias.name = const.name + + # Don't move top-level aliases under Object, they look ugly there + unless RDoc::TopLevel === cm_alias.parent then + cm_alias.parent = self + cm_alias.full_name = nil # force update for new parent + end + + cm_alias.aliases.clear + cm_alias.is_alias_for = cm + + if cm.module? then + @store.modules_hash[cm_alias.full_name] = cm_alias + modules_hash[const.name] = cm_alias + else + @store.classes_hash[cm_alias.full_name] = cm_alias + classes_hash[const.name] = cm_alias + end + + cm.aliases << cm_alias + end + end + + ## + # Deletes from #includes those whose module has been removed from the + # documentation. + #-- + # FIXME: includes are not reliably removed, see _possible_bug test case + + def update_includes + includes.reject! do |include| + mod = include.module + !(String === mod) && @store.modules_hash[mod.full_name].nil? + end + + includes.uniq! + end + + ## + # Deletes from #extends those whose module has been removed from the + # documentation. + #-- + # FIXME: like update_includes, extends are not reliably removed + + def update_extends + extends.reject! do |ext| + mod = ext.module + + !(String === mod) && @store.modules_hash[mod.full_name].nil? + end + + extends.uniq! + end + + def embed_mixins + return unless options.embed_mixins + + includes.each do |include| + next if String === include.module + include.module.method_list.each do |code_object| + add_method(prepare_to_embed(code_object)) + end + include.module.constants.each do |code_object| + add_constant(prepare_to_embed(code_object)) + end + include.module.attributes.each do |code_object| + add_attribute(prepare_to_embed(code_object)) + end + end + + extends.each do |ext| + next if String === ext.module + ext.module.method_list.each do |code_object| + add_method(prepare_to_embed(code_object, true)) + end + ext.module.attributes.each do |code_object| + add_attribute(prepare_to_embed(code_object, true)) + end + end + end + + private + + def prepare_to_embed(code_object, singleton=false) + code_object = code_object.dup + code_object.mixin_from = code_object.parent + code_object.singleton = true if singleton + set_current_section(code_object.section.title, code_object.section.comment) + # add_method and add_attribute will reassign self's visibility back to the method/attribute + # so we need to sync self's visibility with the object's to properly retain that information + self.visibility = code_object.visibility + code_object + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/constant.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/constant.rb new file mode 100644 index 0000000..d5f54ed --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/constant.rb @@ -0,0 +1,186 @@ +# frozen_string_literal: true +## +# A constant + +class RDoc::Constant < RDoc::CodeObject + + MARSHAL_VERSION = 0 # :nodoc: + + ## + # Sets the module or class this is constant is an alias for. + + attr_writer :is_alias_for + + ## + # The constant's name + + attr_accessor :name + + ## + # The constant's value + + attr_accessor :value + + ## + # The constant's visibility + + attr_accessor :visibility + + ## + # Creates a new constant with +name+, +value+ and +comment+ + + def initialize(name, value, comment) + super() + + @name = name + @value = value + + @is_alias_for = nil + @visibility = :public + + self.comment = comment + end + + ## + # Constants are ordered by name + + def <=>(other) + return unless self.class === other + + [parent_name, name] <=> [other.parent_name, other.name] + end + + ## + # Constants are equal when their #parent and #name is the same + + def ==(other) + self.class == other.class and + @parent == other.parent and + @name == other.name + end + + ## + # A constant is documented if it has a comment, or is an alias + # for a documented class or module. + + def documented? + return true if super + return false unless @is_alias_for + case @is_alias_for + when String then + found = @store.find_class_or_module @is_alias_for + return false unless found + @is_alias_for = found + end + @is_alias_for.documented? + end + + ## + # Full constant name including namespace + + def full_name + @full_name ||= "#{parent_name}::#{@name}" + end + + ## + # The module or class this constant is an alias for + + def is_alias_for + case @is_alias_for + when String then + found = @store.find_class_or_module @is_alias_for + @is_alias_for = found if found + @is_alias_for + else + @is_alias_for + end + end + + def inspect # :nodoc: + "#<%s:0x%x %s::%s>" % [ + self.class, object_id, + parent_name, @name, + ] + end + + ## + # Dumps this Constant for use by ri. See also #marshal_load + + def marshal_dump + alias_name = case found = is_alias_for + when RDoc::CodeObject then found.full_name + else found + end + + [ MARSHAL_VERSION, + @name, + full_name, + @visibility, + alias_name, + parse(@comment), + @file.relative_name, + parent.name, + parent.class, + section.title, + ] + end + + ## + # Loads this Constant from +array+. For a loaded Constant the following + # methods will return cached values: + # + # * #full_name + # * #parent_name + + def marshal_load(array) + initialize array[1], nil, RDoc::Comment.from_document(array[5]) + + @full_name = array[2] + @visibility = array[3] || :public + @is_alias_for = array[4] + # 5 handled above + # 6 handled below + @parent_name = array[7] + @parent_class = array[8] + @section_title = array[9] + + @file = RDoc::TopLevel.new array[6] + end + + ## + # Path to this constant for use with HTML generator output. + + def path + "#{@parent.path}##{@name}" + end + + def pretty_print(q) # :nodoc: + q.group 2, "[#{self.class.name} #{full_name}", "]" do + unless comment.empty? then + q.breakable + q.text "comment:" + q.breakable + q.pp @comment + end + end + end + + ## + # Sets the store for this class or module and its contained code objects. + + def store=(store) + super + + @file = @store.add_file @file.full_name if @file + end + + def to_s # :nodoc: + parent_name = parent ? parent.full_name : '(unknown)' + if is_alias_for + "constant #{parent_name}::#@name -> #{is_alias_for}" + else + "constant #{parent_name}::#@name" + end + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/context.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/context.rb new file mode 100644 index 0000000..3a4dd0e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/context.rb @@ -0,0 +1,1222 @@ +# frozen_string_literal: true +## +# A Context is something that can hold modules, classes, methods, attributes, +# aliases, requires, and includes. Classes, modules, and files are all +# Contexts. + +class RDoc::Context < RDoc::CodeObject + + include Comparable + + ## + # Types of methods + + TYPES = %w[class instance] + + ## + # If a context has these titles it will be sorted in this order. + + TOMDOC_TITLES = [nil, 'Public', 'Internal', 'Deprecated'] # :nodoc: + TOMDOC_TITLES_SORT = TOMDOC_TITLES.sort_by { |title| title.to_s } # :nodoc: + + ## + # Class/module aliases + + attr_reader :aliases + + ## + # All attr* methods + + attr_reader :attributes + + ## + # Block params to be used in the next MethodAttr parsed under this context + + attr_accessor :block_params + + ## + # Constants defined + + attr_reader :constants + + ## + # Sets the current documentation section of documentation + + attr_writer :current_section + + ## + # Files this context is found in + + attr_reader :in_files + + ## + # Modules this context includes + + attr_reader :includes + + ## + # Modules this context is extended with + + attr_reader :extends + + ## + # Methods defined in this context + + attr_reader :method_list + + ## + # Name of this class excluding namespace. See also full_name + + attr_reader :name + + ## + # Files this context requires + + attr_reader :requires + + ## + # Use this section for the next method, attribute or constant added. + + attr_accessor :temporary_section + + ## + # Hash old_name => [aliases], for aliases + # that haven't (yet) been resolved to a method/attribute. + # (Not to be confused with the aliases of the context.) + + attr_accessor :unmatched_alias_lists + + ## + # Aliases that could not be resolved. + + attr_reader :external_aliases + + ## + # Current visibility of this context + + attr_accessor :visibility + + ## + # Current visibility of this line + + attr_writer :current_line_visibility + + ## + # Hash of registered methods. Attributes are also registered here, + # twice if they are RW. + + attr_reader :methods_hash + + ## + # Params to be used in the next MethodAttr parsed under this context + + attr_accessor :params + + ## + # Hash of registered constants. + + attr_reader :constants_hash + + ## + # Creates an unnamed empty context with public current visibility + + def initialize + super + + @in_files = [] + + @name ||= "unknown" + @parent = nil + @visibility = :public + + @current_section = Section.new self, nil, nil + @sections = { nil => @current_section } + @temporary_section = nil + + @classes = {} + @modules = {} + + initialize_methods_etc + end + + ## + # Sets the defaults for methods and so-forth + + def initialize_methods_etc + @method_list = [] + @attributes = [] + @aliases = [] + @requires = [] + @includes = [] + @extends = [] + @constants = [] + @external_aliases = [] + @current_line_visibility = nil + + # This Hash maps a method name to a list of unmatched aliases (aliases of + # a method not yet encountered). + @unmatched_alias_lists = {} + + @methods_hash = {} + @constants_hash = {} + + @params = nil + + @store ||= nil + end + + ## + # Contexts are sorted by full_name + + def <=>(other) + return nil unless RDoc::CodeObject === other + + full_name <=> other.full_name + end + + ## + # Adds an item of type +klass+ with the given +name+ and +comment+ to the + # context. + # + # Currently only RDoc::Extend and RDoc::Include are supported. + + def add(klass, name, comment) + if RDoc::Extend == klass then + ext = RDoc::Extend.new name, comment + add_extend ext + elsif RDoc::Include == klass then + incl = RDoc::Include.new name, comment + add_include incl + else + raise NotImplementedError, "adding a #{klass} is not implemented" + end + end + + ## + # Adds +an_alias+ that is automatically resolved + + def add_alias(an_alias) + return an_alias unless @document_self + + method_attr = find_method(an_alias.old_name, an_alias.singleton) || + find_attribute(an_alias.old_name, an_alias.singleton) + + if method_attr then + method_attr.add_alias an_alias, self + else + add_to @external_aliases, an_alias + unmatched_alias_list = + @unmatched_alias_lists[an_alias.pretty_old_name] ||= [] + unmatched_alias_list.push an_alias + end + + an_alias + end + + ## + # Adds +attribute+ if not already there. If it is (as method(s) or attribute), + # updates the comment if it was empty. + # + # The attribute is registered only if it defines a new method. + # For instance, attr_reader :foo will not be registered + # if method +foo+ exists, but attr_accessor :foo will be registered + # if method +foo+ exists, but foo= does not. + + def add_attribute(attribute) + return attribute unless @document_self + + # mainly to check for redefinition of an attribute as a method + # TODO find a policy for 'attr_reader :foo' + 'def foo=()' + register = false + + key = nil + + if attribute.rw.index 'R' then + key = attribute.pretty_name + known = @methods_hash[key] + + if known then + known.comment = attribute.comment if known.comment.empty? + elsif registered = @methods_hash[attribute.pretty_name + '='] and + RDoc::Attr === registered then + registered.rw = 'RW' + else + @methods_hash[key] = attribute + register = true + end + end + + if attribute.rw.index 'W' then + key = attribute.pretty_name + '=' + known = @methods_hash[key] + + if known then + known.comment = attribute.comment if known.comment.empty? + elsif registered = @methods_hash[attribute.pretty_name] and + RDoc::Attr === registered then + registered.rw = 'RW' + else + @methods_hash[key] = attribute + register = true + end + end + + if register then + attribute.visibility = @visibility + add_to @attributes, attribute + resolve_aliases attribute + end + + attribute + end + + ## + # Adds a class named +given_name+ with +superclass+. + # + # Both +given_name+ and +superclass+ may contain '::', and are + # interpreted relative to the +self+ context. This allows handling correctly + # examples like these: + # class RDoc::Gauntlet < Gauntlet + # module Mod + # class Object # implies < ::Object + # class SubObject < Object # this is _not_ ::Object + # + # Given class Container::Item RDoc assumes +Container+ is a module + # unless it later sees class Container. +add_class+ automatically + # upgrades +given_name+ to a class in this case. + + def add_class(class_type, given_name, superclass = '::Object') + # superclass +nil+ is passed by the C parser in the following cases: + # - registering Object in 1.8 (correct) + # - registering BasicObject in 1.9 (correct) + # - registering RubyVM in 1.9 in iseq.c (incorrect: < Object in vm.c) + # + # If we later find a superclass for a registered class with a nil + # superclass, we must honor it. + + # find the name & enclosing context + if given_name =~ /^:+(\w+)$/ then + full_name = $1 + enclosing = top_level + name = full_name.split(/:+/).last + else + full_name = child_name given_name + + if full_name =~ /^(.+)::(\w+)$/ then + name = $2 + ename = $1 + enclosing = @store.classes_hash[ename] || @store.modules_hash[ename] + # HACK: crashes in actionpack/lib/action_view/helpers/form_helper.rb (metaprogramming) + unless enclosing then + # try the given name at top level (will work for the above example) + enclosing = @store.classes_hash[given_name] || + @store.modules_hash[given_name] + return enclosing if enclosing + # not found: create the parent(s) + names = ename.split('::') + enclosing = self + names.each do |n| + enclosing = enclosing.classes_hash[n] || + enclosing.modules_hash[n] || + enclosing.add_module(RDoc::NormalModule, n) + end + end + else + name = full_name + enclosing = self + end + end + + # fix up superclass + if full_name == 'BasicObject' then + superclass = nil + elsif full_name == 'Object' then + superclass = '::BasicObject' + end + + # find the superclass full name + if superclass then + if superclass =~ /^:+/ then + superclass = $' #' + else + if superclass =~ /^(\w+):+(.+)$/ then + suffix = $2 + mod = find_module_named($1) + superclass = mod.full_name + '::' + suffix if mod + else + mod = find_module_named(superclass) + superclass = mod.full_name if mod + end + end + + # did we believe it was a module? + mod = @store.modules_hash.delete superclass + + upgrade_to_class mod, RDoc::NormalClass, mod.parent if mod + + # e.g., Object < Object + superclass = nil if superclass == full_name + end + + klass = @store.classes_hash[full_name] + + if klass then + # if TopLevel, it may not be registered in the classes: + enclosing.classes_hash[name] = klass + + # update the superclass if needed + if superclass then + existing = klass.superclass + existing = existing.full_name unless existing.is_a?(String) if existing + if existing.nil? || + (existing == 'Object' && superclass != 'Object') then + klass.superclass = superclass + end + end + else + # this is a new class + mod = @store.modules_hash.delete full_name + + if mod then + klass = upgrade_to_class mod, RDoc::NormalClass, enclosing + + klass.superclass = superclass unless superclass.nil? + else + klass = class_type.new name, superclass + + enclosing.add_class_or_module(klass, enclosing.classes_hash, + @store.classes_hash) + end + end + + klass.parent = self + + klass + end + + ## + # Adds the class or module +mod+ to the modules or + # classes Hash +self_hash+, and to +all_hash+ (either + # TopLevel::modules_hash or TopLevel::classes_hash), + # unless #done_documenting is +true+. Sets the #parent of +mod+ + # to +self+, and its #section to #current_section. Returns +mod+. + + def add_class_or_module(mod, self_hash, all_hash) + mod.section = current_section # TODO declaring context? something is + # wrong here... + mod.parent = self + mod.full_name = nil + mod.store = @store + + unless @done_documenting then + self_hash[mod.name] = mod + # this must be done AFTER adding mod to its parent, so that the full + # name is correct: + all_hash[mod.full_name] = mod + if @store.unmatched_constant_alias[mod.full_name] then + to, file = @store.unmatched_constant_alias[mod.full_name] + add_module_alias mod, mod.name, to, file + end + end + + mod + end + + ## + # Adds +constant+ if not already there. If it is, updates the comment, + # value and/or is_alias_for of the known constant if they were empty/nil. + + def add_constant(constant) + return constant unless @document_self + + # HACK: avoid duplicate 'PI' & 'E' in math.c (1.8.7 source code) + # (this is a #ifdef: should be handled by the C parser) + known = @constants_hash[constant.name] + + if known then + known.comment = constant.comment if known.comment.empty? + + known.value = constant.value if + known.value.nil? or known.value.strip.empty? + + known.is_alias_for ||= constant.is_alias_for + else + @constants_hash[constant.name] = constant + add_to @constants, constant + end + + constant + end + + ## + # Adds included module +include+ which should be an RDoc::Include + + def add_include(include) + add_to @includes, include + + include + end + + ## + # Adds extension module +ext+ which should be an RDoc::Extend + + def add_extend(ext) + add_to @extends, ext + + ext + end + + ## + # Adds +method+ if not already there. If it is (as method or attribute), + # updates the comment if it was empty. + + def add_method(method) + return method unless @document_self + + # HACK: avoid duplicate 'new' in io.c & struct.c (1.8.7 source code) + key = method.pretty_name + known = @methods_hash[key] + + if known then + if @store then # otherwise we are loading + known.comment = method.comment if known.comment.empty? + previously = ", previously in #{known.file}" unless + method.file == known.file + @store.options.warn \ + "Duplicate method #{known.full_name} in #{method.file}#{previously}" + end + else + @methods_hash[key] = method + if @current_line_visibility + method.visibility, @current_line_visibility = @current_line_visibility, nil + else + method.visibility = @visibility + end + add_to @method_list, method + resolve_aliases method + end + + method + end + + ## + # Adds a module named +name+. If RDoc already knows +name+ is a class then + # that class is returned instead. See also #add_class. + + def add_module(class_type, name) + mod = @classes[name] || @modules[name] + return mod if mod + + full_name = child_name name + mod = @store.modules_hash[full_name] || class_type.new(name) + + add_class_or_module mod, @modules, @store.modules_hash + end + + ## + # Adds a module by +RDoc::NormalModule+ instance. See also #add_module. + + def add_module_by_normal_module(mod) + add_class_or_module mod, @modules, @store.modules_hash + end + + ## + # Adds an alias from +from+ (a class or module) to +name+ which was defined + # in +file+. + + def add_module_alias(from, from_name, to, file) + return from if @done_documenting + + to_full_name = child_name to.name + + # if we already know this name, don't register an alias: + # see the metaprogramming in lib/active_support/basic_object.rb, + # where we already know BasicObject is a class when we find + # BasicObject = BlankSlate + return from if @store.find_class_or_module to_full_name + + unless from + @store.unmatched_constant_alias[child_name(from_name)] = [to, file] + return to + end + + new_to = from.dup + new_to.name = to.name + new_to.full_name = nil + + if new_to.module? then + @store.modules_hash[to_full_name] = new_to + @modules[to.name] = new_to + else + @store.classes_hash[to_full_name] = new_to + @classes[to.name] = new_to + end + + # Registers a constant for this alias. The constant value and comment + # will be updated later, when the Ruby parser adds the constant + const = RDoc::Constant.new to.name, nil, new_to.comment + const.record_location file + const.is_alias_for = from + add_constant const + + new_to + end + + ## + # Adds +require+ to this context's top level + + def add_require(require) + return require unless @document_self + + if RDoc::TopLevel === self then + add_to @requires, require + else + parent.add_require require + end + end + + ## + # Returns a section with +title+, creating it if it doesn't already exist. + # +comment+ will be appended to the section's comment. + # + # A section with a +title+ of +nil+ will return the default section. + # + # See also RDoc::Context::Section + + def add_section(title, comment = nil) + if section = @sections[title] then + section.add_comment comment if comment + else + section = Section.new self, title, comment + @sections[title] = section + end + + section + end + + ## + # Adds +thing+ to the collection +array+ + + def add_to(array, thing) + array << thing if @document_self + + thing.parent = self + thing.store = @store if @store + thing.section = current_section + end + + ## + # Is there any content? + # + # This means any of: comment, aliases, methods, attributes, external + # aliases, require, constant. + # + # Includes and extends are also checked unless includes == false. + + def any_content(includes = true) + @any_content ||= !( + @comment.empty? && + @method_list.empty? && + @attributes.empty? && + @aliases.empty? && + @external_aliases.empty? && + @requires.empty? && + @constants.empty? + ) + @any_content || (includes && !(@includes + @extends).empty? ) + end + + ## + # Creates the full name for a child with +name+ + + def child_name(name) + if name =~ /^:+/ + $' #' + elsif RDoc::TopLevel === self then + name + else + "#{self.full_name}::#{name}" + end + end + + ## + # Class attributes + + def class_attributes + @class_attributes ||= attributes.select { |a| a.singleton } + end + + ## + # Class methods + + def class_method_list + @class_method_list ||= method_list.select { |a| a.singleton } + end + + ## + # Array of classes in this context + + def classes + @classes.values + end + + ## + # All classes and modules in this namespace + + def classes_and_modules + classes + modules + end + + ## + # Hash of classes keyed by class name + + def classes_hash + @classes + end + + ## + # The current documentation section that new items will be added to. If + # temporary_section is available it will be used. + + def current_section + if section = @temporary_section then + @temporary_section = nil + else + section = @current_section + end + + section + end + + def display(method_attr) # :nodoc: + if method_attr.is_a? RDoc::Attr + "#{method_attr.definition} #{method_attr.pretty_name}" + else + "method #{method_attr.pretty_name}" + end + end + + ## + # Iterator for ancestors for duck-typing. Does nothing. See + # RDoc::ClassModule#each_ancestor. + # + # This method exists to make it easy to work with Context subclasses that + # aren't part of RDoc. + + def each_ancestor(&_) # :nodoc: + end + + ## + # Iterator for classes and modules + + def each_classmodule(&block) # :yields: module + classes_and_modules.sort.each(&block) + end + + ## + # Iterator for methods + + def each_method # :yields: method + return enum_for __method__ unless block_given? + + @method_list.sort.each { |m| yield m } + end + + ## + # Iterator for each section's contents sorted by title. The +section+, the + # section's +constants+ and the sections +attributes+ are yielded. The + # +constants+ and +attributes+ collections are sorted. + # + # To retrieve methods in a section use #methods_by_type with the optional + # +section+ parameter. + # + # NOTE: Do not edit collections yielded by this method + + def each_section # :yields: section, constants, attributes + return enum_for __method__ unless block_given? + + constants = @constants.group_by do |constant| constant.section end + attributes = @attributes.group_by do |attribute| attribute.section end + + constants.default = [] + attributes.default = [] + + sort_sections.each do |section| + yield section, constants[section].select(&:display?).sort, attributes[section].select(&:display?).sort + end + end + + ## + # Finds an attribute +name+ with singleton value +singleton+. + + def find_attribute(name, singleton) + name = $1 if name =~ /^(.*)=$/ + @attributes.find { |a| a.name == name && a.singleton == singleton } + end + + ## + # Finds an attribute with +name+ in this context + + def find_attribute_named(name) + case name + when /\A#/ then + find_attribute name[1..-1], false + when /\A::/ then + find_attribute name[2..-1], true + else + @attributes.find { |a| a.name == name } + end + end + + ## + # Finds a class method with +name+ in this context + + def find_class_method_named(name) + @method_list.find { |meth| meth.singleton && meth.name == name } + end + + ## + # Finds a constant with +name+ in this context + + def find_constant_named(name) + @constants.find do |m| + m.name == name || m.full_name == name + end + end + + ## + # Find a module at a higher scope + + def find_enclosing_module_named(name) + parent && parent.find_module_named(name) + end + + ## + # Finds an external alias +name+ with singleton value +singleton+. + + def find_external_alias(name, singleton) + @external_aliases.find { |m| m.name == name && m.singleton == singleton } + end + + ## + # Finds an external alias with +name+ in this context + + def find_external_alias_named(name) + case name + when /\A#/ then + find_external_alias name[1..-1], false + when /\A::/ then + find_external_alias name[2..-1], true + else + @external_aliases.find { |a| a.name == name } + end + end + + ## + # Finds an instance method with +name+ in this context + + def find_instance_method_named(name) + @method_list.find { |meth| !meth.singleton && meth.name == name } + end + + ## + # Finds a method, constant, attribute, external alias, module or file + # named +symbol+ in this context. + + def find_local_symbol(symbol) + find_method_named(symbol) or + find_constant_named(symbol) or + find_attribute_named(symbol) or + find_external_alias_named(symbol) or + find_module_named(symbol) or + @store.find_file_named(symbol) + end + + ## + # Finds a method named +name+ with singleton value +singleton+. + + def find_method(name, singleton) + @method_list.find { |m| + if m.singleton + m.name == name && m.singleton == singleton + else + m.name == name && !m.singleton && !singleton + end + } + end + + ## + # Finds a instance or module method with +name+ in this context + + def find_method_named(name) + case name + when /\A#/ then + find_method name[1..-1], false + when /\A::/ then + find_method name[2..-1], true + else + @method_list.find { |meth| meth.name == name } + end + end + + ## + # Find a module with +name+ using ruby's scoping rules + + def find_module_named(name) + res = @modules[name] || @classes[name] + return res if res + return self if self.name == name + find_enclosing_module_named name + end + + ## + # Look up +symbol+, first as a module, then as a local symbol. + + def find_symbol(symbol) + find_symbol_module(symbol) || find_local_symbol(symbol) + end + + ## + # Look up a module named +symbol+. + + def find_symbol_module(symbol) + result = nil + + # look for a class or module 'symbol' + case symbol + when /^::/ then + result = @store.find_class_or_module symbol + when /^(\w+):+(.+)$/ + suffix = $2 + top = $1 + searched = self + while searched do + mod = searched.find_module_named(top) + break unless mod + result = @store.find_class_or_module "#{mod.full_name}::#{suffix}" + break if result || searched.is_a?(RDoc::TopLevel) + searched = searched.parent + end + else + searched = self + while searched do + result = searched.find_module_named(symbol) + break if result || searched.is_a?(RDoc::TopLevel) + searched = searched.parent + end + end + + result + end + + ## + # The full name for this context. This method is overridden by subclasses. + + def full_name + '(unknown)' + end + + ## + # Does this context and its methods and constants all have documentation? + # + # (Yes, fully documented doesn't mean everything.) + + def fully_documented? + documented? and + attributes.all? { |a| a.documented? } and + method_list.all? { |m| m.documented? } and + constants.all? { |c| c.documented? } + end + + ## + # URL for this with a +prefix+ + + def http_url + path = name_for_path + path = path.gsub(/<<\s*(\w*)/, 'from-\1') if path =~ /<'class' or + # 'instance') and visibility (+:public+, +:protected+, +:private+). + # + # If +section+ is provided only methods in that RDoc::Context::Section will + # be returned. + + def methods_by_type(section = nil) + methods = {} + + TYPES.each do |type| + visibilities = {} + RDoc::VISIBILITIES.each do |vis| + visibilities[vis] = [] + end + + methods[type] = visibilities + end + + each_method do |method| + next if section and not method.section == section + methods[method.type][method.visibility] << method + end + + methods + end + + ## + # Yields AnyMethod and Attr entries matching the list of names in +methods+. + + def methods_matching(methods, singleton = false, &block) + (@method_list + @attributes).each do |m| + yield m if methods.include?(m.name) and m.singleton == singleton + end + + each_ancestor do |parent| + parent.methods_matching(methods, singleton, &block) + end + end + + ## + # Array of modules in this context + + def modules + @modules.values + end + + ## + # Hash of modules keyed by module name + + def modules_hash + @modules + end + + ## + # Name to use to generate the url. + # #full_name by default. + + def name_for_path + full_name + end + + ## + # Changes the visibility for new methods to +visibility+ + + def ongoing_visibility=(visibility) + @visibility = visibility + end + + ## + # Record +top_level+ as a file +self+ is in. + + def record_location(top_level) + @in_files << top_level unless @in_files.include?(top_level) + end + + ## + # Should we remove this context from the documentation? + # + # The answer is yes if: + # * #received_nodoc is +true+ + # * #any_content is +false+ (not counting includes) + # * All #includes are modules (not a string), and their module has + # #remove_from_documentation? == true + # * All classes and modules have #remove_from_documentation? == true + + def remove_from_documentation? + @remove_from_documentation ||= + @received_nodoc && + !any_content(false) && + @includes.all? { |i| !i.module.is_a?(String) && i.module.remove_from_documentation? } && + classes_and_modules.all? { |cm| cm.remove_from_documentation? } + end + + ## + # Removes methods and attributes with a visibility less than +min_visibility+. + #-- + # TODO mark the visibility of attributes in the template (if not public?) + + def remove_invisible(min_visibility) + return if [:private, :nodoc].include? min_visibility + remove_invisible_in @method_list, min_visibility + remove_invisible_in @attributes, min_visibility + remove_invisible_in @constants, min_visibility + end + + ## + # Only called when min_visibility == :public or :private + + def remove_invisible_in(array, min_visibility) # :nodoc: + if min_visibility == :public then + array.reject! { |e| + e.visibility != :public and not e.force_documentation + } + else + array.reject! { |e| + e.visibility == :private and not e.force_documentation + } + end + end + + ## + # Tries to resolve unmatched aliases when a method or attribute has just + # been added. + + def resolve_aliases(added) + # resolve any pending unmatched aliases + key = added.pretty_name + unmatched_alias_list = @unmatched_alias_lists[key] + return unless unmatched_alias_list + unmatched_alias_list.each do |unmatched_alias| + added.add_alias unmatched_alias, self + @external_aliases.delete unmatched_alias + end + @unmatched_alias_lists.delete key + end + + ## + # Returns RDoc::Context::Section objects referenced in this context for use + # in a table of contents. + + def section_contents + used_sections = {} + + each_method do |method| + next unless method.display? + + used_sections[method.section] = true + end + + # order found sections + sections = sort_sections.select do |section| + used_sections[section] + end + + # only the default section is used + return [] if + sections.length == 1 and not sections.first.title + + sections + end + + ## + # Sections in this context + + def sections + @sections.values + end + + def sections_hash # :nodoc: + @sections + end + + ## + # Sets the current section to a section with +title+. See also #add_section + + def set_current_section(title, comment) + @current_section = add_section title, comment + end + + ## + # Given an array +methods+ of method names, set the visibility of each to + # +visibility+ + + def set_visibility_for(methods, visibility, singleton = false) + methods_matching methods, singleton do |m| + m.visibility = visibility + end + end + + ## + # Given an array +names+ of constants, set the visibility of each constant to + # +visibility+ + + def set_constant_visibility_for(names, visibility) + names.each do |name| + constant = @constants_hash[name] or next + constant.visibility = visibility + end + end + + ## + # Sorts sections alphabetically (default) or in TomDoc fashion (none, + # Public, Internal, Deprecated) + + def sort_sections + titles = @sections.map { |title, _| title } + + if titles.length > 1 and + TOMDOC_TITLES_SORT == + (titles | TOMDOC_TITLES).sort_by { |title| title.to_s } then + @sections.values_at(*TOMDOC_TITLES).compact + else + @sections.sort_by { |title, _| + title.to_s + }.map { |_, section| + section + } + end + end + + def to_s # :nodoc: + "#{self.class.name} #{self.full_name}" + end + + ## + # Return the TopLevel that owns us + #-- + # FIXME we can be 'owned' by several TopLevel (see #record_location & + # #in_files) + + def top_level + return @top_level if defined? @top_level + @top_level = self + @top_level = @top_level.parent until RDoc::TopLevel === @top_level + @top_level + end + + ## + # Upgrades NormalModule +mod+ in +enclosing+ to a +class_type+ + + def upgrade_to_class(mod, class_type, enclosing) + enclosing.modules_hash.delete mod.name + + klass = RDoc::ClassModule.from_module class_type, mod + klass.store = @store + + # if it was there, then we keep it even if done_documenting + @store.classes_hash[mod.full_name] = klass + enclosing.classes_hash[mod.name] = klass + + klass + end + + autoload :Section, "#{__dir__}/context/section" + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/context/section.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/context/section.rb new file mode 100644 index 0000000..16b7781 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/context/section.rb @@ -0,0 +1,176 @@ +# frozen_string_literal: true +require 'cgi/escape' +require 'cgi/util' unless defined?(CGI::EscapeExt) + +## +# A section of documentation like: +# +# # :section: The title +# # The body +# +# Sections can be referenced multiple times and will be collapsed into a +# single section. + +class RDoc::Context::Section + + include RDoc::Text + + MARSHAL_VERSION = 0 # :nodoc: + + ## + # Section comment + + attr_reader :comment + + ## + # Section comments + + attr_reader :comments + + ## + # Context this Section lives in + + attr_reader :parent + + ## + # Section title + + attr_reader :title + + ## + # Creates a new section with +title+ and +comment+ + + def initialize(parent, title, comment) + @parent = parent + @title = title ? title.strip : title + + @comments = [] + + add_comment comment + end + + ## + # Sections are equal when they have the same #title + + def ==(other) + self.class === other and @title == other.title + end + + alias eql? == + + ## + # Adds +comment+ to this section + + def add_comment(comment) + comments = Array(comment) + comments.each do |c| + extracted_comment = extract_comment(c) + @comments << extracted_comment unless extracted_comment.empty? + end + end + + ## + # Anchor reference for linking to this section + + def aref + title = @title || '[untitled]' + + CGI.escape(title).gsub('%', '-').sub(/^-/, '') + end + + ## + # Extracts the comment for this section from the original comment block. + # If the first line contains :section:, strip it and use the rest. + # Otherwise remove lines up to the line containing :section:, and look + # for those lines again at the end and remove them. This lets us write + # + # # :section: The title + # # The body + + def extract_comment(comment) + case comment + when nil + RDoc::Comment.new '' + when RDoc::Comment then + if comment.text =~ /^#[ \t]*:section:.*\n/ then + start = $` + rest = $' + + comment.text = if start.empty? then + rest + else + rest.sub(/#{start.chomp}\Z/, '') + end + end + + comment + else + raise TypeError, "unknown comment #{comment.inspect}" + end + end + + def inspect # :nodoc: + "#<%s:0x%x %p>" % [self.class, object_id, title] + end + + def hash # :nodoc: + @title.hash + end + + ## + # The files comments in this section come from + + def in_files + @comments.map(&:file) + end + + ## + # Serializes this Section. The title and parsed comment are saved, but not + # the section parent which must be restored manually. + + def marshal_dump + [ + MARSHAL_VERSION, + @title, + parse, + ] + end + + ## + # De-serializes this Section. The section parent must be restored manually. + + def marshal_load(array) + @parent = nil + + @title = array[1] + @comments = array[2].parts.map { |doc| RDoc::Comment.from_document(doc) } + end + + ## + # Parses +comment_location+ into an RDoc::Markup::Document composed of + # multiple RDoc::Markup::Documents with their file set. + + def parse + RDoc::Markup::Document.new(*@comments.map(&:parse)) + end + + ## + # The section's title, or 'Top Section' if the title is nil. + # + # This is used by the table of contents template so the name is silly. + + def plain_html + @title || 'Top Section' + end + + ## + # Removes a comment from this section if it is from the same file as + # +comment+ + + def remove_comment(target_comment) + @comments.delete_if do |stored_comment| + stored_comment.file == target_comment.file + end + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/extend.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/extend.rb new file mode 100644 index 0000000..7d57433 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/extend.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true +## +# A Module extension to a class with \#extend +# +# RDoc::Extend.new 'Enumerable', 'comment ...' + +class RDoc::Extend < RDoc::Mixin + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/ghost_method.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/ghost_method.rb new file mode 100644 index 0000000..25f951e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/ghost_method.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true +## +# GhostMethod represents a method referenced only by a comment + +class RDoc::GhostMethod < RDoc::AnyMethod +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/include.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/include.rb new file mode 100644 index 0000000..c3e0d45 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/include.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true +## +# A Module included in a class with \#include +# +# RDoc::Include.new 'Enumerable', 'comment ...' + +class RDoc::Include < RDoc::Mixin + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/meta_method.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/meta_method.rb new file mode 100644 index 0000000..8c95a0f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/meta_method.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true +## +# MetaMethod represents a meta-programmed method + +class RDoc::MetaMethod < RDoc::AnyMethod +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/method_attr.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/method_attr.rb new file mode 100644 index 0000000..16779fa --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/method_attr.rb @@ -0,0 +1,411 @@ +# frozen_string_literal: true +## +# Abstract class representing either a method or an attribute. + +class RDoc::MethodAttr < RDoc::CodeObject + + include Comparable + + ## + # Name of this method/attribute. + + attr_accessor :name + + ## + # public, protected, private + + attr_accessor :visibility + + ## + # Is this a singleton method/attribute? + + attr_accessor :singleton + + ## + # Source file token stream + + attr_reader :text + + ## + # Array of other names for this method/attribute + + attr_reader :aliases + + ## + # The method/attribute we're aliasing + + attr_accessor :is_alias_for + + #-- + # The attributes below are for AnyMethod only. + # They are left here for the time being to + # allow ri to operate. + # TODO modify ri to avoid calling these on attributes. + #++ + + ## + # Parameters yielded by the called block + + attr_reader :block_params + + ## + # Parameters for this method + + attr_accessor :params + + ## + # Different ways to call this method + + attr_accessor :call_seq + + ## + # The call_seq or the param_seq with method name, if there is no call_seq. + + attr_reader :arglists + + ## + # Creates a new MethodAttr from token stream +text+ and method or attribute + # name +name+. + # + # Usually this is called by super from a subclass. + + def initialize(text, name, singleton: false) + super() + + @text = text + @name = name + + @aliases = [] + @is_alias_for = nil + @parent_name = nil + @singleton = singleton + @visibility = :public + @see = false + + @arglists = nil + @block_params = nil + @call_seq = nil + @params = nil + end + + ## + # Resets cached data for the object so it can be rebuilt by accessor methods + + def initialize_copy(other) # :nodoc: + @full_name = nil + end + + def initialize_visibility # :nodoc: + super + @see = nil + end + + ## + # Order by #singleton then #name + + def <=>(other) + return unless other.respond_to?(:singleton) && + other.respond_to?(:name) + + [@singleton ? 0 : 1, name_ord_range, name] <=> + [other.singleton ? 0 : 1, other.name_ord_range, other.name] + end + + def ==(other) # :nodoc: + equal?(other) or self.class == other.class and full_name == other.full_name + end + + ## + # A method/attribute is documented if any of the following is true: + # - it was marked with :nodoc:; + # - it has a comment; + # - it is an alias for a documented method; + # - it has a +#see+ method that is documented. + + def documented? + super or + (is_alias_for and is_alias_for.documented?) or + (see and see.documented?) + end + + ## + # A method/attribute to look at, + # in particular if this method/attribute has no documentation. + # + # It can be a method/attribute of the superclass or of an included module, + # including the Kernel module, which is always appended to the included + # modules. + # + # Returns +nil+ if there is no such method/attribute. + # The +#is_alias_for+ method/attribute, if any, is not included. + # + # Templates may generate a "see also ..." if this method/attribute + # has documentation, and "see ..." if it does not. + + def see + @see = find_see if @see == false + @see + end + + ## + # Sets the store for this class or module and its contained code objects. + + def store=(store) + super + + @file = @store.add_file @file.full_name if @file + end + + def find_see # :nodoc: + return nil if singleton || is_alias_for + + # look for the method + other = find_method_or_attribute name + return other if other + + # if it is a setter, look for a getter + return nil unless name =~ /[a-z_]=$/i # avoid == or === + return find_method_or_attribute name[0..-2] + end + + def find_method_or_attribute(name) # :nodoc: + return nil unless parent.respond_to? :ancestors + + searched = parent.ancestors + kernel = @store.modules_hash['Kernel'] + + searched << kernel if kernel && + parent != kernel && !searched.include?(kernel) + + searched.each do |ancestor| + next if String === ancestor + next if parent == ancestor + + other = ancestor.find_method_named('#' + name) || + ancestor.find_attribute_named(name) + + return other if other + end + + nil + end + + ## + # Abstract method. Contexts in their building phase call this + # to register a new alias for this known method/attribute. + # + # - creates a new AnyMethod/Attribute named an_alias.new_name; + # - adds +self+ as an alias for the new method or attribute + # - adds the method or attribute to #aliases + # - adds the method or attribute to +context+. + + def add_alias(an_alias, context) + raise NotImplementedError + end + + ## + # HTML fragment reference for this method + + def aref + type = singleton ? 'c' : 'i' + # % characters are not allowed in html names => dash instead + "#{aref_prefix}-#{type}-#{html_name}" + end + + ## + # Prefix for +aref+, defined by subclasses. + + def aref_prefix + raise NotImplementedError + end + + ## + # Attempts to sanitize the content passed by the Ruby parser: + # remove outer parentheses, etc. + + def block_params=(value) + # 'yield.to_s' or 'assert yield, msg' + return @block_params = '' if value =~ /^[\.,]/ + + # remove trailing 'if/unless ...' + return @block_params = '' if value =~ /^(if|unless)\s/ + + value = $1.strip if value =~ /^(.+)\s(if|unless)\s/ + + # outer parentheses + value = $1 if value =~ /^\s*\((.*)\)\s*$/ + value = value.strip + + # proc/lambda + return @block_params = $1 if value =~ /^(proc|lambda)(\s*\{|\sdo)/ + + # surrounding +...+ or [...] + value = $1.strip if value =~ /^\+(.*)\+$/ + value = $1.strip if value =~ /^\[(.*)\]$/ + + return @block_params = '' if value.empty? + + # global variable + return @block_params = 'str' if value =~ /^\$[&0-9]$/ + + # wipe out array/hash indices + value.gsub!(/(\w)\[[^\[]+\]/, '\1') + + # remove @ from class/instance variables + value.gsub!(/@@?([a-z0-9_]+)/, '\1') + + # method calls => method name + value.gsub!(/([A-Z:a-z0-9_]+)\.([a-z0-9_]+)(\s*\(\s*[a-z0-9_.,\s]*\s*\)\s*)?/) do + case $2 + when 'to_s' then $1 + when 'const_get' then 'const' + when 'new' then + $1.split('::').last. # ClassName => class_name + gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2'). + gsub(/([a-z\d])([A-Z])/, '\1_\2'). + downcase + else + $2 + end + end + + # class prefixes + value.gsub!(/[A-Za-z0-9_:]+::/, '') + + # simple expressions + value = $1 if value =~ /^([a-z0-9_]+)\s*[-*+\/]/ + + @block_params = value.strip + end + + ## + # HTML id-friendly method/attribute name + + def html_name + require 'cgi/escape' + require 'cgi/util' unless defined?(CGI::EscapeExt) + + CGI.escape(@name.gsub('-', '-2D')).gsub('%', '-').sub(/^-/, '') + end + + ## + # Full method/attribute name including namespace + + def full_name + @full_name ||= "#{parent_name}#{pretty_name}" + end + + def inspect # :nodoc: + alias_for = @is_alias_for ? " (alias for #{@is_alias_for.name})" : nil + visibility = self.visibility + visibility = "forced #{visibility}" if force_documentation + "#<%s:0x%x %s (%s)%s>" % [ + self.class, object_id, + full_name, + visibility, + alias_for, + ] + end + + ## + # '::' for a class method/attribute, '#' for an instance method. + + def name_prefix + @singleton ? '::' : '#' + end + + ## + # Method/attribute name with class/instance indicator + + def pretty_name + "#{name_prefix}#{@name}" + end + + ## + # Type of method/attribute (class or instance) + + def type + singleton ? 'class' : 'instance' + end + + ## + # Path to this method for use with HTML generator output. + + def path + "#{@parent.path}##{aref}" + end + + ## + # Name of our parent with special handling for un-marshaled methods + + def parent_name + @parent_name || super + end + + def pretty_print(q) # :nodoc: + alias_for = + if @is_alias_for.respond_to? :name then + "alias for #{@is_alias_for.name}" + elsif Array === @is_alias_for then + "alias for #{@is_alias_for.last}" + end + + q.group 2, "[#{self.class.name} #{full_name} #{visibility}", "]" do + if alias_for then + q.breakable + q.text alias_for + end + + if text then + q.breakable + q.text "text:" + q.breakable + q.pp @text + end + + unless comment.empty? then + q.breakable + q.text "comment:" + q.breakable + q.pp @comment + end + end + end + + ## + # Used by RDoc::Generator::JsonIndex to create a record for the search + # engine. + + def search_record + [ + @name, + full_name, + @name, + @parent.full_name, + path, + params, + snippet(@comment), + ] + end + + def to_s # :nodoc: + if @is_alias_for + "#{self.class.name}: #{full_name} -> #{is_alias_for}" + else + "#{self.class.name}: #{full_name}" + end + end + + def name_ord_range # :nodoc: + case name.ord + when 0..64 # anything below "A" + 1 + when 91..96 # the symbols between "Z" and "a" + 2 + when 123..126 # 7-bit symbols above "z": "{", "|", "}", "~" + 3 + else # everythig else can be sorted as normal + 4 + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/mixin.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/mixin.rb new file mode 100644 index 0000000..9b425ef --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/mixin.rb @@ -0,0 +1,120 @@ +# frozen_string_literal: true +## +# A Mixin adds features from a module into another context. RDoc::Include and +# RDoc::Extend are both mixins. + +class RDoc::Mixin < RDoc::CodeObject + + ## + # Name of included module + + attr_accessor :name + + ## + # Creates a new Mixin for +name+ with +comment+ + + def initialize(name, comment) + super() + @name = name + self.comment = comment + @module = nil # cache for module if found + end + + ## + # Mixins are sorted by name + + def <=>(other) + return unless self.class === other + + name <=> other.name + end + + def ==(other) # :nodoc: + self.class === other and @name == other.name + end + + alias eql? == # :nodoc: + + ## + # Full name based on #module + + def full_name + m = self.module + RDoc::ClassModule === m ? m.full_name : @name + end + + def hash # :nodoc: + [@name, self.module].hash + end + + def inspect # :nodoc: + "#<%s:0x%x %s.%s %s>" % [ + self.class, + object_id, + parent_name, self.class.name.downcase, @name, + ] + end + + ## + # Attempts to locate the included module object. Returns the name if not + # known. + # + # The scoping rules of Ruby to resolve the name of an included module are: + # - first look into the children of the current context; + # - if not found, look into the children of included modules, + # in reverse inclusion order; + # - if still not found, go up the hierarchy of names. + # + # This method has O(n!) behavior when the module calling + # include is referencing nonexistent modules. Avoid calling #module until + # after all the files are parsed. This behavior is due to ruby's constant + # lookup behavior. + # + # As of the beginning of October, 2011, no gem includes nonexistent modules. + + def module + return @module if @module + + # search the current context + return @name unless parent + full_name = parent.child_name(@name) + @module = @store.modules_hash[full_name] + return @module if @module + return @name if @name =~ /^::/ + + # search the includes before this one, in reverse order + searched = parent.includes.take_while { |i| i != self }.reverse + searched.each do |i| + inc = i.module + next if String === inc + full_name = inc.child_name(@name) + @module = @store.modules_hash[full_name] + return @module if @module + end + + # go up the hierarchy of names + up = parent.parent + while up + full_name = up.child_name(@name) + @module = @store.modules_hash[full_name] + return @module if @module + up = up.parent + end + + @name + end + + ## + # Sets the store for this class or module and its contained code objects. + + def store=(store) + super + + @file = @store.add_file @file.full_name if @file + end + + def to_s # :nodoc: + "#{self.class.name.downcase} #@name in: #{parent}" + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/normal_class.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/normal_class.rb new file mode 100644 index 0000000..6b68d6d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/normal_class.rb @@ -0,0 +1,92 @@ +# frozen_string_literal: true +## +# A normal class, neither singleton nor anonymous + +class RDoc::NormalClass < RDoc::ClassModule + + ## + # The ancestors of this class including modules. Unlike Module#ancestors, + # this class is not included in the result. The result will contain both + # RDoc::ClassModules and Strings. + + def ancestors + if String === superclass then + super << superclass + elsif superclass then + ancestors = super + ancestors << superclass + ancestors.concat superclass.ancestors + else + super + end + end + + def aref_prefix # :nodoc: + 'class' + end + + ## + # The definition of this class, class MyClassName + + def definition + "class #{full_name}" + end + + def direct_ancestors + superclass ? super + [superclass] : super + end + + def inspect # :nodoc: + superclass = @superclass ? " < #{@superclass}" : nil + "<%s:0x%x class %s%s includes: %p extends: %p attributes: %p methods: %p aliases: %p>" % [ + self.class, object_id, + full_name, superclass, @includes, @extends, @attributes, @method_list, @aliases + ] + end + + def to_s # :nodoc: + display = "#{self.class.name} #{self.full_name}" + if superclass + display += ' < ' + (superclass.is_a?(String) ? superclass : superclass.full_name) + end + display += ' -> ' + is_alias_for.to_s if is_alias_for + display + end + + def pretty_print(q) # :nodoc: + superclass = @superclass ? " < #{@superclass}" : nil + + q.group 2, "[class #{full_name}#{superclass}", "]" do + q.breakable + q.text "includes:" + q.breakable + q.seplist @includes do |inc| q.pp inc end + + q.breakable + q.text "constants:" + q.breakable + q.seplist @constants do |const| q.pp const end + + q.breakable + q.text "attributes:" + q.breakable + q.seplist @attributes do |attr| q.pp attr end + + q.breakable + q.text "methods:" + q.breakable + q.seplist @method_list do |meth| q.pp meth end + + q.breakable + q.text "aliases:" + q.breakable + q.seplist @aliases do |aliaz| q.pp aliaz end + + q.breakable + q.text "comment:" + q.breakable + q.pp comment + end + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/normal_module.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/normal_module.rb new file mode 100644 index 0000000..677a9dc --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/normal_module.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true +## +# A normal module, like NormalClass + +class RDoc::NormalModule < RDoc::ClassModule + + def aref_prefix # :nodoc: + 'module' + end + + def inspect # :nodoc: + "#<%s:0x%x module %s includes: %p extends: %p attributes: %p methods: %p aliases: %p>" % [ + self.class, object_id, + full_name, @includes, @extends, @attributes, @method_list, @aliases + ] + end + + ## + # The definition of this module, module MyModuleName + + def definition + "module #{full_name}" + end + + ## + # This is a module, returns true + + def module? + true + end + + def pretty_print(q) # :nodoc: + q.group 2, "[module #{full_name}:", "]" do + q.breakable + q.text "includes:" + q.breakable + q.seplist @includes do |inc| q.pp inc end + q.breakable + + q.breakable + q.text "constants:" + q.breakable + q.seplist @constants do |const| q.pp const end + + q.text "attributes:" + q.breakable + q.seplist @attributes do |attr| q.pp attr end + q.breakable + + q.text "methods:" + q.breakable + q.seplist @method_list do |meth| q.pp meth end + q.breakable + + q.text "aliases:" + q.breakable + q.seplist @aliases do |aliaz| q.pp aliaz end + q.breakable + + q.text "comment:" + q.breakable + q.pp comment + end + end + + ## + # Modules don't have one, raises NoMethodError + + def superclass + raise NoMethodError, "#{full_name} is a module" + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/require.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/require.rb new file mode 100644 index 0000000..f47e3b1 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/require.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true +## +# A file loaded by \#require + +class RDoc::Require < RDoc::CodeObject + + ## + # Name of the required file + + attr_accessor :name + + ## + # Creates a new Require that loads +name+ with +comment+ + + def initialize(name, comment) + super() + @name = name.gsub(/'|"/, "") #' + @top_level = nil + self.comment = comment + end + + def inspect # :nodoc: + "#<%s:0x%x require '%s' in %s>" % [ + self.class, + object_id, + @name, + @parent ? @parent.base_name : '(unknown)' + ] + end + + def to_s # :nodoc: + "require #{name} in: #{parent}" + end + + ## + # The RDoc::TopLevel corresponding to this require, or +nil+ if not found. + + def top_level + @top_level ||= begin + tl = RDoc::TopLevel.all_files_hash[name + '.rb'] + + if tl.nil? and RDoc::TopLevel.all_files.first.full_name =~ %r(^lib/) then + # second chance + tl = RDoc::TopLevel.all_files_hash['lib/' + name + '.rb'] + end + + tl + end + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/single_class.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/single_class.rb new file mode 100644 index 0000000..88a93a0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/single_class.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true +## +# A singleton class + +class RDoc::SingleClass < RDoc::ClassModule + + ## + # Adds the superclass to the included modules. + + def ancestors + superclass ? super + [superclass] : super + end + + def aref_prefix # :nodoc: + 'sclass' + end + + ## + # The definition of this singleton class, class << MyClassName + + def definition + "class << #{full_name}" + end + + def pretty_print(q) # :nodoc: + q.group 2, "[class << #{full_name}", "]" do + next + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/top_level.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/top_level.rb new file mode 100644 index 0000000..eeeff02 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/top_level.rb @@ -0,0 +1,273 @@ +# frozen_string_literal: true +## +# A TopLevel context is a representation of the contents of a single file + +class RDoc::TopLevel < RDoc::Context + + MARSHAL_VERSION = 0 # :nodoc: + + ## + # Relative name of this file + + attr_accessor :relative_name + + ## + # Absolute name of this file + + attr_accessor :absolute_name + + ## + # All the classes or modules that were declared in + # this file. These are assigned to either +#classes_hash+ + # or +#modules_hash+ once we know what they really are. + + attr_reader :classes_or_modules + + ## + # The parser class that processed this file + + attr_reader :parser + + ## + # Creates a new TopLevel for the file at +absolute_name+. If documentation + # is being generated outside the source dir +relative_name+ is relative to + # the source directory. + + def initialize(absolute_name, relative_name = absolute_name) + super() + @name = nil + @absolute_name = absolute_name + @relative_name = relative_name + @parser = nil + + @classes_or_modules = [] + end + + ## + # Sets the parser for this toplevel context, also the store. + + def parser=(val) + @parser = val + @store.update_parser_of_file(absolute_name, val) if @store + @parser + end + + ## + # An RDoc::TopLevel is equal to another with the same relative_name + + def ==(other) + self.class === other and @relative_name == other.relative_name + end + + alias eql? == + + ## + # Adds +an_alias+ to +Object+ instead of +self+. + + def add_alias(an_alias) + object_class.record_location self + return an_alias unless @document_self + object_class.add_alias an_alias + end + + ## + # Adds +constant+ to +Object+ instead of +self+. + + def add_constant(constant) + object_class.record_location self + return constant unless @document_self + object_class.add_constant constant + end + + ## + # Adds +include+ to +Object+ instead of +self+. + + def add_include(include) + object_class.record_location self + return include unless @document_self + object_class.add_include include + end + + ## + # Adds +method+ to +Object+ instead of +self+. + + def add_method(method) + object_class.record_location self + return method unless @document_self + object_class.add_method method + end + + ## + # Adds class or module +mod+. Used in the building phase + # by the Ruby parser. + + def add_to_classes_or_modules(mod) + @classes_or_modules << mod + end + + ## + # Base name of this file + + def base_name + File.basename @relative_name + end + + alias name base_name + + ## + # Only a TopLevel that contains text file) will be displayed. See also + # RDoc::CodeObject#display? + + def display? + text? and super + end + + ## + # See RDoc::TopLevel::find_class_or_module + #-- + # TODO Why do we search through all classes/modules found, not just the + # ones of this instance? + + def find_class_or_module(name) + @store.find_class_or_module name + end + + ## + # Finds a class or module named +symbol+ + + def find_local_symbol(symbol) + find_class_or_module(symbol) || super + end + + ## + # Finds a module or class with +name+ + + def find_module_named(name) + find_class_or_module(name) + end + + ## + # Returns the relative name of this file + + def full_name + @relative_name + end + + ## + # An RDoc::TopLevel has the same hash as another with the same + # relative_name + + def hash + @relative_name.hash + end + + ## + # URL for this with a +prefix+ + + def http_url + @relative_name.tr('.', '_') + '.html' + end + + def inspect # :nodoc: + "#<%s:0x%x %p modules: %p classes: %p>" % [ + self.class, object_id, + base_name, + @modules.map { |n, m| m }, + @classes.map { |n, c| c } + ] + end + + ## + # Dumps this TopLevel for use by ri. See also #marshal_load + + def marshal_dump + [ + MARSHAL_VERSION, + @relative_name, + @parser, + parse(@comment), + ] + end + + ## + # Loads this TopLevel from +array+. + + def marshal_load(array) # :nodoc: + initialize array[1] + + @parser = array[2] + @comment = RDoc::Comment.from_document array[3] + end + + ## + # Returns the NormalClass "Object", creating it if not found. + # + # Records +self+ as a location in "Object". + + def object_class + @object_class ||= begin + oc = @store.find_class_named('Object') || add_class(RDoc::NormalClass, 'Object') + oc.record_location self + oc + end + end + + ## + # Base name of this file without the extension + + def page_name + basename = File.basename @relative_name + basename =~ /\.(rb|rdoc|txt|md)$/i + + $` || basename + end + + ## + # Path to this file for use with HTML generator output. + + def path + prefix = options.file_path_prefix + return http_url unless prefix + File.join(prefix, http_url) + end + + def pretty_print(q) # :nodoc: + q.group 2, "[#{self.class}: ", "]" do + q.text "base name: #{base_name.inspect}" + q.breakable + + items = @modules.map { |n, m| m } + items.concat @modules.map { |n, c| c } + q.seplist items do |mod| q.pp mod end + end + end + + ## + # Search record used by RDoc::Generator::JsonIndex + + def search_record + return unless @parser < RDoc::Parser::Text + + [ + page_name, + '', + page_name, + '', + path, + '', + snippet(@comment), + ] + end + + ## + # Is this TopLevel from a text file instead of a source code file? + + def text? + @parser and @parser.include? RDoc::Parser::Text + end + + def to_s # :nodoc: + "file #{full_name}" + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_objects.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_objects.rb new file mode 100644 index 0000000..d5f2f92 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_objects.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true +# This file was used to load all the RDoc::CodeObject subclasses at once. Now +# autoload handles this. + +require_relative '../rdoc' diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/comment.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/comment.rb new file mode 100644 index 0000000..b269ec4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/comment.rb @@ -0,0 +1,236 @@ +# frozen_string_literal: true +## +# A comment holds the text comment for a RDoc::CodeObject and provides a +# unified way of cleaning it up and parsing it into an RDoc::Markup::Document. +# +# Each comment may have a different markup format set by #format=. By default +# 'rdoc' is used. The :markup: directive tells RDoc which format to use. +# +# See RDoc::MarkupReference@Directive+for+Specifying+RDoc+Source+Format. + + +class RDoc::Comment + + include RDoc::Text + + ## + # The format of this comment. Defaults to RDoc::Markup + + attr_reader :format + + ## + # The RDoc::TopLevel this comment was found in + + attr_accessor :location + + ## + # Line where this Comment was written + + attr_accessor :line + + ## + # For duck-typing when merging classes at load time + + alias file location # :nodoc: + + ## + # The text for this comment + + attr_reader :text + + ## + # Alias for text + + alias to_s text + + ## + # Overrides the content returned by #parse. Use when there is no #text + # source for this comment + + attr_writer :document + + ## + # Creates a new comment with +text+ that is found in the RDoc::TopLevel + # +location+. + + def initialize(text = nil, location = nil, language = nil) + @location = location + @text = text.nil? ? nil : text.dup + @language = language + + @document = nil + @format = 'rdoc' + @normalized = false + end + + ## + #-- + # TODO deep copy @document + + def initialize_copy(copy) # :nodoc: + @text = copy.text.dup + end + + def ==(other) # :nodoc: + self.class === other and + other.text == @text and other.location == @location + end + + ## + # Look for a 'call-seq' in the comment to override the normal parameter + # handling. The :call-seq: is indented from the baseline. All lines of the + # same indentation level and prefix are consumed. + # + # For example, all of the following will be used as the :call-seq: + # + # # :call-seq: + # # ARGF.readlines(sep=$/) -> array + # # ARGF.readlines(limit) -> array + # # ARGF.readlines(sep, limit) -> array + # # + # # ARGF.to_a(sep=$/) -> array + # # ARGF.to_a(limit) -> array + # # ARGF.to_a(sep, limit) -> array + + def extract_call_seq + # we must handle situations like the above followed by an unindented first + # comment. The difficulty is to make sure not to match lines starting + # with ARGF at the same indent, but that are after the first description + # paragraph. + if /^(? ((?!\n)\s)*+ (?# whitespaces except newline)) + :?call-seq: + (? \g(?\n|\z) (?# trailing spaces))? + (? + (\g(?!\w)\S.*\g)* + (?> + (? \g\w+ (?# ' # ARGF' in the example above)) + .*\g)? + (\g\S.*\g (?# other non-blank line))*+ + (\g+(\k.*\g (?# ARGF.to_a lines))++)*+ + ) + (?m:^\s*$|\z) + /x =~ @text + seq = $~[:seq] + + all_start, all_stop = $~.offset(0) + @text.slice! all_start...all_stop + + seq.gsub!(/^\s*/, '') + end + end + + ## + # A comment is empty if its text String is empty. + + def empty? + @text.empty? && (@document.nil? || @document.empty?) + end + + ## + # HACK dubious + + def encode!(encoding) + @text = String.new @text, encoding: encoding + self + end + + ## + # Sets the format of this comment and resets any parsed document + + def format=(format) + @format = format + @document = nil + end + + def inspect # :nodoc: + location = @location ? @location.relative_name : '(unknown)' + + "#<%s:%x %s %p>" % [self.class, object_id, location, @text] + end + + ## + # Normalizes the text. See RDoc::Text#normalize_comment for details + + def normalize + return self unless @text + return self if @normalized # TODO eliminate duplicate normalization + + @text = normalize_comment @text + + @normalized = true + + self + end + + ## + # Was this text normalized? + + def normalized? # :nodoc: + @normalized + end + + ## + # Parses the comment into an RDoc::Markup::Document. The parsed document is + # cached until the text is changed. + + def parse + return @document if @document + + @document = super @text, @format + @document.file = @location + @document + end + + ## + # Removes private sections from this comment. Private sections are flush to + # the comment marker and start with -- and end with ++. + # For C-style comments, a private marker may not start at the opening of the + # comment. + # + # /* + # *-- + # * private + # *++ + # * public + # */ + + def remove_private + # Workaround for gsub encoding for Ruby 1.9.2 and earlier + empty = '' + empty = RDoc::Encoding.change_encoding empty, @text.encoding + + @text = @text.gsub(%r%^\s*([#*]?)--.*?^\s*(\1)\+\+\n?%m, empty) + @text = @text.sub(%r%^\s*[#*]?--.*%m, '') + end + + ## + # Replaces this comment's text with +text+ and resets the parsed document. + # + # An error is raised if the comment contains a document but no text. + + def text=(text) + raise RDoc::Error, 'replacing document-only comment is not allowed' if + @text.nil? and @document + + @document = nil + @text = text.nil? ? nil : text.dup + end + + ## + # Returns true if this comment is in TomDoc format. + + def tomdoc? + @format == 'tomdoc' + end + + ## + # Create a new parsed comment from a document + + def self.from_document(document) # :nodoc: + comment = RDoc::Comment.new('') + comment.document = document + comment.location = RDoc::TopLevel.new(document.file) if document.file + comment + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/cross_reference.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/cross_reference.rb new file mode 100644 index 0000000..a942d33 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/cross_reference.rb @@ -0,0 +1,228 @@ +# frozen_string_literal: true + +require_relative 'markup/attribute_manager' # for PROTECT_ATTR + +## +# RDoc::CrossReference is a reusable way to create cross references for names. + +class RDoc::CrossReference + + ## + # Regular expression to match class references + # + # 1. There can be a '\\' in front of text to suppress the cross-reference + # 2. There can be a '::' in front of class names to reference from the + # top-level namespace. + # 3. The method can be followed by parenthesis (not recommended) + + CLASS_REGEXP_STR = '\\\\?((?:\:{2})?[A-Z]\w*(?:\:\:\w+)*)' + + ## + # Regular expression to match a single method argument. + + METHOD_ARG_REGEXP_STR = '[\w.+*/=<>-]+' + + ## + # Regular expression to match method arguments. + + METHOD_ARGS_REGEXP_STR = /(?:\((?:#{METHOD_ARG_REGEXP_STR}(?:,\s*#{METHOD_ARG_REGEXP_STR})*)?\))?/.source + + ## + # Regular expression to match method references. + # + # See CLASS_REGEXP_STR + + METHOD_REGEXP_STR = /( + (?!\d)[\w#{RDoc::Markup::AttributeManager::PROTECT_ATTR}]+[!?=]?| + %|=(?:==?|~)|![=~]|\[\]=?|<(?:<|=>?)?|>[>=]?|[-+!]@?|\*\*?|[\/%\`|&^~] + )#{METHOD_ARGS_REGEXP_STR}/.source.delete("\n ").freeze + + ## + # Regular expressions matching text that should potentially have + # cross-reference links generated are passed to add_regexp_handling. Note + # that these expressions are meant to pick up text for which cross-references + # have been suppressed, since the suppression characters are removed by the + # code that is triggered. + + CROSSREF_REGEXP = /(?:^|[\s()]) + ( + (?: + # A::B::C.meth + #{CLASS_REGEXP_STR}(?:[.#]|::)#{METHOD_REGEXP_STR} + + # A::B::C + # The stuff after CLASS_REGEXP_STR is a + # nasty hack. CLASS_REGEXP_STR unfortunately matches + # words like dog and cat (these are legal "class" + # names in Fortran 95). When a word is flagged as a + # potential cross-reference, limitations in the markup + # engine suppress other processing, such as typesetting. + # This is particularly noticeable for contractions. + # In order that words like "can't" not + # be flagged as potential cross-references, only + # flag potential class cross-references if the character + # after the cross-reference is a space, sentence + # punctuation, tag start character, or attribute + # marker. + | #{CLASS_REGEXP_STR}(?=[@\s).?!,;<\000]|\z) + + # Stand-alone method (preceded by a #) + | \\?\##{METHOD_REGEXP_STR} + + # Stand-alone method (preceded by ::) + | ::#{METHOD_REGEXP_STR} + + # Things that look like filenames + # The key thing is that there must be at least + # one special character (period, slash, or + # underscore). + | (?:\.\.\/)*[-\/\w]+[_\/.][-\w\/.]+ + + # Things that have markup suppressed + # Don't process things like '\<' in \, though. + # TODO: including < is a hack, not very satisfying. + | \\[^\s<] + ) + + # labels for headings + (?:@[\w+%-]+(?:\.[\w|%-]+)?)? + )/x + + ## + # Version of CROSSREF_REGEXP used when --hyperlink-all is specified. + + ALL_CROSSREF_REGEXP = / + (?:^|[\s()]) + ( + (?: + # A::B::C.meth + #{CLASS_REGEXP_STR}(?:[.#]|::)#{METHOD_REGEXP_STR} + + # A::B::C + | #{CLASS_REGEXP_STR}(?=[@\s).?!,;<\000]|\z) + + # Stand-alone method + | \\?#{METHOD_REGEXP_STR} + + # Things that look like filenames + | (?:\.\.\/)*[-\/\w]+[_\/.][-\w\/.]+ + + # Things that have markup suppressed + | \\[^\s<] + ) + + # labels for headings + (?:@[\w+%-]+)? + )/x + + ## + # Hash of references that have been looked-up to their replacements + + attr_accessor :seen + + ## + # Allows cross-references to be created based on the given +context+ + # (RDoc::Context). + + def initialize(context) + @context = context + @store = context.store + + @seen = {} + end + + ## + # Returns a method reference to +name+. + + def resolve_method(name) + ref = nil + + if /#{CLASS_REGEXP_STR}([.#]|::)#{METHOD_REGEXP_STR}/o =~ name then + type = $2 + if '.' == type # will find either #method or ::method + method = $3 + else + method = "#{type}#{$3}" + end + container = @context.find_symbol_module($1) + elsif /^([.#]|::)#{METHOD_REGEXP_STR}/o =~ name then + type = $1 + if '.' == type + method = $2 + else + method = "#{type}#{$2}" + end + container = @context + else + type = nil + container = nil + end + + if container then + unless RDoc::TopLevel === container then + if '.' == type then + if 'new' == method then # AnyClassName.new will be class method + ref = container.find_local_symbol method + ref = container.find_ancestor_local_symbol method unless ref + else + ref = container.find_local_symbol "::#{method}" + ref = container.find_ancestor_local_symbol "::#{method}" unless ref + ref = container.find_local_symbol "##{method}" unless ref + ref = container.find_ancestor_local_symbol "##{method}" unless ref + end + else + ref = container.find_local_symbol method + ref = container.find_ancestor_local_symbol method unless ref + end + end + end + + ref + end + + ## + # Returns a reference to +name+. + # + # If the reference is found and +name+ is not documented +text+ will be + # returned. If +name+ is escaped +name+ is returned. If +name+ is not + # found +text+ is returned. + + def resolve(name, text) + return @seen[name] if @seen.include? name + + ref = case name + when /^\\(#{CLASS_REGEXP_STR})$/o then + @context.find_symbol $1 + else + @context.find_symbol name + end + + ref = resolve_method name unless ref + + # Try a page name + ref = @store.page name if not ref and name =~ /^[\w.]+$/ + + ref = nil if RDoc::Alias === ref # external alias, can't link to it + + out = if name == '\\' then + name + elsif name =~ /^\\/ then + # we remove the \ only in front of what we know: + # other backslashes are treated later, only outside of + ref ? $' : name + elsif ref then + if ref.display? then + ref + else + text + end + else + text + end + + @seen[name] = out + + out + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/encoding.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/encoding.rb new file mode 100644 index 0000000..78dbe87 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/encoding.rb @@ -0,0 +1,120 @@ +# coding: US-ASCII +# frozen_string_literal: true + +## +# This class is a wrapper around File IO and Encoding that helps RDoc load +# files and convert them to the correct encoding. + +module RDoc::Encoding + + HEADER_REGEXP = /^ + (?: + \A\#!.*\n + | + ^\#\s+frozen[-_]string[-_]literal[=:].+\n + | + ^\#[^\n]+\b(?:en)?coding[=:]\s*(?[^\s;]+).*\n + | + <\?xml[^?]*encoding=(?["'])(?.*?)\k.*\n + )+ + /xi # :nodoc: + + ## + # Reads the contents of +filename+ and handles any encoding directives in + # the file. + # + # The content will be converted to the +encoding+. If the file cannot be + # converted a warning will be printed and nil will be returned. + # + # If +force_transcode+ is true the document will be transcoded and any + # unknown character in the target encoding will be replaced with '?' + + def self.read_file(filename, encoding, force_transcode = false) + content = File.open filename, "rb" do |f| f.read end + content.gsub!("\r\n", "\n") if RUBY_PLATFORM =~ /mswin|mingw/ + + utf8 = content.sub!(/\A\xef\xbb\xbf/, '') + + enc = RDoc::Encoding.detect_encoding content + content = RDoc::Encoding.change_encoding content, enc if enc + + begin + encoding ||= Encoding.default_external + orig_encoding = content.encoding + + if not orig_encoding.ascii_compatible? then + content = content.encode encoding + elsif utf8 then + content = RDoc::Encoding.change_encoding content, Encoding::UTF_8 + content = content.encode encoding + else + # assume the content is in our output encoding + content = RDoc::Encoding.change_encoding content, encoding + end + + unless content.valid_encoding? then + # revert and try to transcode + content = RDoc::Encoding.change_encoding content, orig_encoding + content = content.encode encoding + end + + unless content.valid_encoding? then + warn "unable to convert #{filename} to #{encoding}, skipping" + content = nil + end + rescue Encoding::InvalidByteSequenceError, + Encoding::UndefinedConversionError => e + if force_transcode then + content = RDoc::Encoding.change_encoding content, orig_encoding + content = content.encode(encoding, + :invalid => :replace, + :undef => :replace, + :replace => '?') + return content + else + warn "unable to convert #{e.message} for #{filename}, skipping" + return nil + end + end + + content + rescue ArgumentError => e + raise unless e.message =~ /unknown encoding name - (.*)/ + warn "unknown encoding name \"#{$1}\" for #{filename}, skipping" + nil + rescue Errno::EISDIR, Errno::ENOENT + nil + end + + ## + # Detects the encoding of +string+ based on the magic comment + + def self.detect_encoding(string) + result = HEADER_REGEXP.match string + name = result && result[:name] + + name ? Encoding.find(name) : nil + end + + ## + # Removes magic comments and shebang + + def self.remove_magic_comment(string) + string.sub HEADER_REGEXP do |s| + s.gsub(/[^\n]/, '') + end + end + + ## + # Changes encoding based on +encoding+ without converting and returns new + # string + + def self.change_encoding(text, encoding) + if text.kind_of? RDoc::Comment + text.encode! encoding + else + String.new text, encoding: encoding + end + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/erb_partial.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/erb_partial.rb new file mode 100644 index 0000000..bad02ea --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/erb_partial.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true +## +# Allows an ERB template to be rendered in the context (binding) of an +# existing ERB template evaluation. + +class RDoc::ERBPartial < ERB + + ## + # Overrides +compiler+ startup to set the +eoutvar+ to an empty string only + # if it isn't already set. + + def set_eoutvar(compiler, eoutvar = '_erbout') + super + + compiler.pre_cmd = ["#{eoutvar} ||= +''"] + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/erbio.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/erbio.rb new file mode 100644 index 0000000..e955eed --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/erbio.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true +require 'erb' + +## +# A subclass of ERB that writes directly to an IO. Credit to Aaron Patterson +# and Masatoshi SEKI. +# +# To use: +# +# erbio = RDoc::ERBIO.new '<%= "hello world" %>', nil, nil +# +# File.open 'hello.txt', 'w' do |io| +# erbio.result binding +# end +# +# Note that binding must enclose the io you wish to output on. + +class RDoc::ERBIO < ERB + + ## + # Defaults +eoutvar+ to 'io', otherwise is identical to ERB's initialize + + def initialize(str, trim_mode: nil, eoutvar: 'io') + super(str, trim_mode: trim_mode, eoutvar: eoutvar) + end + + ## + # Instructs +compiler+ how to write to +io_variable+ + + def set_eoutvar(compiler, io_variable) + compiler.put_cmd = "#{io_variable}.write" + compiler.insert_cmd = "#{io_variable}.write" + compiler.pre_cmd = [] + compiler.post_cmd = [] + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator.rb new file mode 100644 index 0000000..a769cf8 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true +## +# RDoc uses generators to turn parsed source code in the form of an +# RDoc::CodeObject tree into some form of output. RDoc comes with the HTML +# generator RDoc::Generator::Darkfish and an ri data generator +# RDoc::Generator::RI. +# +# == Registering a Generator +# +# Generators are registered by calling RDoc::RDoc.add_generator with the class +# of the generator: +# +# class My::Awesome::Generator +# RDoc::RDoc.add_generator self +# end +# +# == Adding Options to +rdoc+ +# +# Before option processing in +rdoc+, RDoc::Options will call ::setup_options +# on the generator class with an RDoc::Options instance. The generator can +# use RDoc::Options#option_parser to add command-line options to the +rdoc+ +# tool. See RDoc::Options@Custom+Options for an example and see OptionParser +# for details on how to add options. +# +# You can extend the RDoc::Options instance with additional accessors for your +# generator. +# +# == Generator Instantiation +# +# After parsing, RDoc::RDoc will instantiate a generator by calling +# #initialize with an RDoc::Store instance and an RDoc::Options instance. +# +# The RDoc::Store instance holds documentation for parsed source code. In +# RDoc 3 and earlier the RDoc::TopLevel class held this data. When upgrading +# a generator from RDoc 3 and earlier you should only need to replace +# RDoc::TopLevel with the store instance. +# +# RDoc will then call #generate on the generator instance. You can use the +# various methods on RDoc::Store and in the RDoc::CodeObject tree to create +# your desired output format. + +module RDoc::Generator + + autoload :Markup, "#{__dir__}/generator/markup" + + autoload :Darkfish, "#{__dir__}/generator/darkfish" + autoload :JsonIndex, "#{__dir__}/generator/json_index" + autoload :RI, "#{__dir__}/generator/ri" + autoload :POT, "#{__dir__}/generator/pot" + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/darkfish.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/darkfish.rb new file mode 100644 index 0000000..7fec365 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/darkfish.rb @@ -0,0 +1,812 @@ +# frozen_string_literal: true +# -*- mode: ruby; ruby-indent-level: 2; tab-width: 2 -*- + +require 'erb' +require 'fileutils' +require 'pathname' +require_relative 'markup' + +## +# Darkfish RDoc HTML Generator +# +# $Id: darkfish.rb 52 2009-01-07 02:08:11Z deveiant $ +# +# == Author/s +# * Michael Granger (ged@FaerieMUD.org) +# +# == Contributors +# * Mahlon E. Smith (mahlon@martini.nu) +# * Eric Hodel (drbrain@segment7.net) +# +# == License +# +# Copyright (c) 2007, 2008, Michael Granger. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the author/s, nor the names of the project's +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# == Attributions +# +# Darkfish uses the {Silk Icons}[http://www.famfamfam.com/lab/icons/silk/] set +# by Mark James. + +class RDoc::Generator::Darkfish + + RDoc::RDoc.add_generator self + + include ERB::Util + + ## + # Stylesheets, fonts, etc. that are included in RDoc. + + BUILTIN_STYLE_ITEMS = # :nodoc: + %w[ + css/fonts.css + fonts/Lato-Light.ttf + fonts/Lato-LightItalic.ttf + fonts/Lato-Regular.ttf + fonts/Lato-RegularItalic.ttf + fonts/SourceCodePro-Bold.ttf + fonts/SourceCodePro-Regular.ttf + css/rdoc.css + ] + + ## + # Release Version + + VERSION = '3' + + ## + # Description of this generator + + DESCRIPTION = 'HTML generator, written by Michael Granger' + + ## + # The relative path to style sheets and javascript. By default this is set + # the same as the rel_prefix. + + attr_accessor :asset_rel_path + + ## + # The path to generate files into, combined with --op from the + # options for a full path. + + attr_reader :base_dir + + ## + # Classes and modules to be used by this generator, not necessarily + # displayed. See also #modsort + + attr_reader :classes + + ## + # No files will be written when dry_run is true. + + attr_accessor :dry_run + + ## + # When false the generate methods return a String instead of writing to a + # file. The default is true. + + attr_accessor :file_output + + ## + # Files to be displayed by this generator + + attr_reader :files + + ## + # The JSON index generator for this Darkfish generator + + attr_reader :json_index + + ## + # Methods to be displayed by this generator + + attr_reader :methods + + ## + # Sorted list of classes and modules to be displayed by this generator + + attr_reader :modsort + + ## + # The RDoc::Store that is the source of the generated content + + attr_reader :store + + ## + # The directory where the template files live + + attr_reader :template_dir # :nodoc: + + ## + # The output directory + + attr_reader :outputdir + + ## + # Initialize a few instance variables before we start + + def initialize(store, options) + @store = store + @options = options + + @asset_rel_path = '' + @base_dir = Pathname.pwd.expand_path + @dry_run = @options.dry_run + @file_output = true + @template_dir = Pathname.new options.template_dir + @template_cache = {} + + @classes = nil + @context = nil + @files = nil + @methods = nil + @modsort = nil + + @json_index = RDoc::Generator::JsonIndex.new self, options + end + + ## + # Output progress information if debugging is enabled + + def debug_msg *msg + return unless $DEBUG_RDOC + $stderr.puts(*msg) + end + + ## + # Create the directories the generated docs will live in if they don't + # already exist. + + def gen_sub_directories + @outputdir.mkpath + end + + ## + # Copy over the stylesheet into the appropriate place in the output + # directory. + + def write_style_sheet + debug_msg "Copying static files" + options = { :verbose => $DEBUG_RDOC, :noop => @dry_run } + + BUILTIN_STYLE_ITEMS.each do |item| + install_rdoc_static_file @template_dir + item, "./#{item}", options + end + + unless @options.template_stylesheets.empty? + FileUtils.cp @options.template_stylesheets, '.', **options + end + + Dir[(@template_dir + "{js,images}/**/*").to_s].each do |path| + next if File.directory? path + next if File.basename(path) =~ /^\./ + + dst = Pathname.new(path).relative_path_from @template_dir + + install_rdoc_static_file @template_dir + path, dst, options + end + end + + ## + # Build the initial indices and output objects based on an array of TopLevel + # objects containing the extracted information. + + def generate + setup + + write_style_sheet + generate_index + generate_class_files + generate_file_files + generate_table_of_contents + @json_index.generate + @json_index.generate_gzipped + + copy_static + + rescue => e + debug_msg "%s: %s\n %s" % [ + e.class.name, e.message, e.backtrace.join("\n ") + ] + + raise + end + + ## + # Copies static files from the static_path into the output directory + + def copy_static + return if @options.static_path.empty? + + fu_options = { :verbose => $DEBUG_RDOC, :noop => @dry_run } + + @options.static_path.each do |path| + unless File.directory? path then + FileUtils.install path, @outputdir, **fu_options.merge(:mode => 0644) + next + end + + Dir.chdir path do + Dir[File.join('**', '*')].each do |entry| + dest_file = @outputdir + entry + + if File.directory? entry then + FileUtils.mkdir_p entry, **fu_options + else + FileUtils.install entry, dest_file, **fu_options.merge(:mode => 0644) + end + end + end + end + end + + ## + # Return a list of the documented modules sorted by salience first, then + # by name. + + def get_sorted_module_list(classes) + classes.select do |klass| + klass.display? + end.sort + end + + ## + # Generate an index page which lists all the classes which are documented. + + def generate_index + template_file = @template_dir + 'index.rhtml' + return unless template_file.exist? + + debug_msg "Rendering the index page..." + + out_file = @base_dir + @options.op_dir + 'index.html' + rel_prefix = @outputdir.relative_path_from out_file.dirname + search_index_rel_prefix = rel_prefix + search_index_rel_prefix += @asset_rel_path if @file_output + + asset_rel_prefix = rel_prefix + @asset_rel_path + + @title = @options.title + @main_page = @files.find { |f| f.full_name == @options.main_page } + + render_template template_file, out_file do |io| + here = binding + # suppress 1.9.3 warning + here.local_variable_set(:asset_rel_prefix, asset_rel_prefix) + # some partials rely on the presence of current variable to render + here.local_variable_set(:current, @main_page) if @main_page + here + end + rescue => e + error = RDoc::Error.new \ + "error generating index.html: #{e.message} (#{e.class})" + error.set_backtrace e.backtrace + + raise error + end + + ## + # Generates a class file for +klass+ + + def generate_class(klass, template_file = nil) + current = klass + + template_file ||= @template_dir + 'class.rhtml' + + debug_msg " working on %s (%s)" % [klass.full_name, klass.path] + out_file = @outputdir + klass.path + rel_prefix = @outputdir.relative_path_from out_file.dirname + search_index_rel_prefix = rel_prefix + search_index_rel_prefix += @asset_rel_path if @file_output + + asset_rel_prefix = rel_prefix + @asset_rel_path + + breadcrumb = # used in templates + breadcrumb = generate_nesting_namespaces_breadcrumb(current, rel_prefix) + + @title = "#{klass.type} #{klass.full_name} - #{@options.title}" + + debug_msg " rendering #{out_file}" + render_template template_file, out_file do |io| + here = binding + # suppress 1.9.3 warning + here.local_variable_set(:asset_rel_prefix, asset_rel_prefix) + here + end + end + + ## + # Generate a documentation file for each class and module + + def generate_class_files + template_file = @template_dir + 'class.rhtml' + template_file = @template_dir + 'classpage.rhtml' unless + template_file.exist? + return unless template_file.exist? + debug_msg "Generating class documentation in #{@outputdir}" + + current = nil + + @classes.each do |klass| + current = klass + + generate_class klass, template_file + end + rescue => e + error = RDoc::Error.new \ + "error generating #{current.path}: #{e.message} (#{e.class})" + error.set_backtrace e.backtrace + + raise error + end + + ## + # Generate a documentation file for each file + + def generate_file_files + page_file = @template_dir + 'page.rhtml' + fileinfo_file = @template_dir + 'fileinfo.rhtml' + + # for legacy templates + filepage_file = @template_dir + 'filepage.rhtml' unless + page_file.exist? or fileinfo_file.exist? + + return unless + page_file.exist? or fileinfo_file.exist? or filepage_file.exist? + + debug_msg "Generating file documentation in #{@outputdir}" + + out_file = nil + current = nil + + @files.each do |file| + current = file + + if file.text? and page_file.exist? then + generate_page file + next + end + + template_file = nil + out_file = @outputdir + file.path + debug_msg " working on %s (%s)" % [file.full_name, out_file] + rel_prefix = @outputdir.relative_path_from out_file.dirname + search_index_rel_prefix = rel_prefix + search_index_rel_prefix += @asset_rel_path if @file_output + + asset_rel_prefix = rel_prefix + @asset_rel_path + + unless filepage_file then + if file.text? then + next unless page_file.exist? + template_file = page_file + @title = file.page_name + else + next unless fileinfo_file.exist? + template_file = fileinfo_file + @title = "File: #{file.base_name}" + end + end + + @title += " - #{@options.title}" + template_file ||= filepage_file + + render_template template_file, out_file do |io| + here = binding + # suppress 1.9.3 warning + here.local_variable_set(:asset_rel_prefix, asset_rel_prefix) + here.local_variable_set(:current, current) + here + end + end + rescue => e + error = + RDoc::Error.new "error generating #{out_file}: #{e.message} (#{e.class})" + error.set_backtrace e.backtrace + + raise error + end + + ## + # Generate a page file for +file+ + + def generate_page(file) + template_file = @template_dir + 'page.rhtml' + + out_file = @outputdir + file.path + debug_msg " working on %s (%s)" % [file.full_name, out_file] + rel_prefix = @outputdir.relative_path_from out_file.dirname + search_index_rel_prefix = rel_prefix + search_index_rel_prefix += @asset_rel_path if @file_output + + current = file + asset_rel_prefix = rel_prefix + @asset_rel_path + + @title = "#{file.page_name} - #{@options.title}" + + debug_msg " rendering #{out_file}" + render_template template_file, out_file do |io| + here = binding + # suppress 1.9.3 warning + here.local_variable_set(:current, current) + here.local_variable_set(:asset_rel_prefix, asset_rel_prefix) + here + end + end + + ## + # Generates the 404 page for the RDoc servlet + + def generate_servlet_not_found(message) + template_file = @template_dir + 'servlet_not_found.rhtml' + return unless template_file.exist? + + debug_msg "Rendering the servlet 404 Not Found page..." + + rel_prefix = rel_prefix = '' + search_index_rel_prefix = rel_prefix + search_index_rel_prefix += @asset_rel_path if @file_output + + asset_rel_prefix = '' + + @title = 'Not Found' + + render_template template_file do |io| + here = binding + # suppress 1.9.3 warning + here.local_variable_set(:asset_rel_prefix, asset_rel_prefix) + here + end + rescue => e + error = RDoc::Error.new \ + "error generating servlet_not_found: #{e.message} (#{e.class})" + error.set_backtrace e.backtrace + + raise error + end + + ## + # Generates the servlet root page for the RDoc servlet + + def generate_servlet_root(installed) + template_file = @template_dir + 'servlet_root.rhtml' + return unless template_file.exist? + + debug_msg 'Rendering the servlet root page...' + + rel_prefix = '.' + asset_rel_prefix = rel_prefix + search_index_rel_prefix = asset_rel_prefix + search_index_rel_prefix += @asset_rel_path if @file_output + + @title = 'Local RDoc Documentation' + + render_template template_file do |io| binding end + rescue => e + error = RDoc::Error.new \ + "error generating servlet_root: #{e.message} (#{e.class})" + error.set_backtrace e.backtrace + + raise error + end + + ## + # Generate an index page which lists all the classes which are documented. + + def generate_table_of_contents + template_file = @template_dir + 'table_of_contents.rhtml' + return unless template_file.exist? + + debug_msg "Rendering the Table of Contents..." + + out_file = @outputdir + 'table_of_contents.html' + rel_prefix = @outputdir.relative_path_from out_file.dirname + search_index_rel_prefix = rel_prefix + search_index_rel_prefix += @asset_rel_path if @file_output + + asset_rel_prefix = rel_prefix + @asset_rel_path + + @title = "Table of Contents - #{@options.title}" + + render_template template_file, out_file do |io| + here = binding + # suppress 1.9.3 warning + here.local_variable_set(:asset_rel_prefix, asset_rel_prefix) + here + end + rescue => e + error = RDoc::Error.new \ + "error generating table_of_contents.html: #{e.message} (#{e.class})" + error.set_backtrace e.backtrace + + raise error + end + + def install_rdoc_static_file(source, destination, options) # :nodoc: + return unless source.exist? + + begin + FileUtils.mkdir_p File.dirname(destination), **options + + begin + FileUtils.ln source, destination, **options + rescue Errno::EEXIST + FileUtils.rm destination + retry + end + rescue + FileUtils.cp source, destination, **options + end + end + + ## + # Prepares for generation of output from the current directory + + def setup + return if instance_variable_defined? :@outputdir + + @outputdir = Pathname.new(@options.op_dir).expand_path @base_dir + + return unless @store + + @classes = @store.all_classes_and_modules.sort + @files = @store.all_files.sort + @methods = @classes.flat_map { |m| m.method_list }.sort + @modsort = get_sorted_module_list @classes + end + + ## + # Creates a template from its components and the +body_file+. + # + # For backwards compatibility, if +body_file+ contains " + + + +#{head_file.read} + +#{body} + TEMPLATE + end + + ## + # Renders the ERb contained in +file_name+ relative to the template + # directory and returns the result based on the current context. + + def render(file_name) + template_file = @template_dir + file_name + + template = template_for template_file, false, RDoc::ERBPartial + + template.filename = template_file.to_s + + template.result @context + end + + ## + # Load and render the erb template in the given +template_file+ and write + # it out to +out_file+. + # + # Both +template_file+ and +out_file+ should be Pathname-like objects. + # + # An io will be yielded which must be captured by binding in the caller. + + def render_template(template_file, out_file = nil) # :yield: io + io_output = out_file && !@dry_run && @file_output + erb_klass = io_output ? RDoc::ERBIO : ERB + + template = template_for template_file, true, erb_klass + + if io_output then + debug_msg "Outputting to %s" % [out_file.expand_path] + + out_file.dirname.mkpath + out_file.open 'w', 0644 do |io| + io.set_encoding @options.encoding + + @context = yield io + + template_result template, @context, template_file + end + else + @context = yield nil + + output = template_result template, @context, template_file + + debug_msg " would have written %d characters to %s" % [ + output.length, out_file.expand_path + ] if @dry_run + + output + end + end + + ## + # Creates the result for +template+ with +context+. If an error is raised a + # Pathname +template_file+ will indicate the file where the error occurred. + + def template_result(template, context, template_file) + template.filename = template_file.to_s + template.result context + rescue NoMethodError => e + raise RDoc::Error, "Error while evaluating %s: %s" % [ + template_file.expand_path, + e.message, + ], e.backtrace + end + + ## + # Retrieves a cache template for +file+, if present, or fills the cache. + + def template_for(file, page = true, klass = ERB) + template = @template_cache[file] + + return template if template + + if page then + template = assemble_template file + erbout = 'io' + else + template = file.read + template = template.encode @options.encoding + + file_var = File.basename(file).sub(/\..*/, '') + + erbout = "_erbout_#{file_var}" + end + + template = klass.new template, trim_mode: '-', eoutvar: erbout + @template_cache[file] = template + template + end + + # :stopdoc: + ParagraphExcerptRegexpOther = %r[\b\w[^./:]++\.] + # use \p/\P{letter} instead of \w/\W in Unicode + ParagraphExcerptRegexpUnicode = %r[\b\p{letter}[^./:]++\.] + # :startdoc: + + # Returns an excerpt of the comment for usage in meta description tags + def excerpt(comment) + text = case comment + when RDoc::Comment + comment.text + else + comment + end + + # Match from a capital letter to the first period, discarding any links, so + # that we don't end up matching badges in the README + pattern = ParagraphExcerptRegexpUnicode + begin + first_paragraph_match = text.match(pattern) + rescue Encoding::CompatibilityError + # The doc is non-ASCII text and encoded in other than Unicode base encodings. + raise if pattern == ParagraphExcerptRegexpOther + pattern = ParagraphExcerptRegexpOther + retry + end + return text[0...150].tr_s("\n", " ").squeeze(" ") unless first_paragraph_match + + extracted_text = first_paragraph_match[0] + second_paragraph = text.match(pattern, first_paragraph_match.end(0)) + extracted_text << " " << second_paragraph[0] if second_paragraph + + extracted_text[0...150].tr_s("\n", " ").squeeze(" ") + end + + def generate_ancestor_list(ancestors, klass) + return '' if ancestors.empty? + + ancestor = ancestors.shift + content = +'
  • ' + + if ancestor.is_a?(RDoc::NormalClass) + content << "#{ancestor.full_name}" + else + content << ancestor.to_s + end + + # Recursively call the method for the remaining ancestors + content << generate_ancestor_list(ancestors, klass) + + content << '
' + end + + def generate_class_link(klass, rel_prefix) + if klass.display? + %(#{klass.name}) + else + %(#{klass.name}) + end + end + + def generate_class_index_content(classes, rel_prefix) + grouped_classes = group_classes_by_namespace_for_sidebar(classes) + return '' unless top = grouped_classes[nil] + + solo = top.one? { |klass| klass.display? } + traverse_classes(top, grouped_classes, rel_prefix, solo) + end + + def traverse_classes(klasses, grouped_classes, rel_prefix, solo = false) + content = +'" + end + + def group_classes_by_namespace_for_sidebar(classes) + grouped_classes = classes.group_by do |klass| + klass.full_name[/\A[^:]++(?:::[^:]++(?=::))*+(?=::[^:]*+\z)/] + end.select do |_, klasses| + klasses.any?(&:display?) + end + + grouped_classes.values.each(&:uniq!) + grouped_classes + end + + private + + def nesting_namespaces_to_class_modules(klass) + tree = {} + + klass.nesting_namespaces.zip(klass.fully_qualified_nesting_namespaces) do |ns, fqns| + tree[ns] = @store.classes_hash[fqns] || @store.modules_hash[fqns] + end + + tree + end + + def generate_nesting_namespaces_breadcrumb(klass, rel_prefix) + nesting_namespaces_to_class_modules(klass).map do |namespace, class_module| + path = class_module ? (rel_prefix + class_module.path).to_s : "" + { name: namespace, path: path, self: klass.full_name == class_module&.full_name } + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/json_index.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/json_index.rb new file mode 100644 index 0000000..065caa4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/json_index.rb @@ -0,0 +1,284 @@ +# frozen_string_literal: true +require 'json' +begin + require 'zlib' +rescue LoadError +end + +## +# The JsonIndex generator is designed to complement an HTML generator and +# produces a JSON search index. This generator is derived from sdoc by +# Vladimir Kolesnikov and contains verbatim code written by him. +# +# This generator is designed to be used with a regular HTML generator: +# +# class RDoc::Generator::Darkfish +# def initialize options +# # ... +# @base_dir = Pathname.pwd.expand_path +# +# @json_index = RDoc::Generator::JsonIndex.new self, options +# end +# +# def generate +# # ... +# @json_index.generate +# end +# end +# +# == Index Format +# +# The index is output as a JSON file assigned to the global variable +# +search_data+. The structure is: +# +# var search_data = { +# "index": { +# "searchIndex": +# ["a", "b", ...], +# "longSearchIndex": +# ["a", "a::b", ...], +# "info": [ +# ["A", "A", "A.html", "", ""], +# ["B", "A::B", "A::B.html", "", ""], +# ... +# ] +# } +# } +# +# The same item is described across the +searchIndex+, +longSearchIndex+ and +# +info+ fields. The +searchIndex+ field contains the item's short name, the +# +longSearchIndex+ field contains the full_name (when appropriate) and the +# +info+ field contains the item's name, full_name, path, parameters and a +# snippet of the item's comment. +# +# == LICENSE +# +# Copyright (c) 2009 Vladimir Kolesnikov +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +class RDoc::Generator::JsonIndex + + include RDoc::Text + + ## + # Where the search index lives in the generated output + + SEARCH_INDEX_FILE = File.join 'js', 'search_index.js' + + attr_reader :index # :nodoc: + + ## + # Creates a new generator. + # +options+ are the same options passed to the parent generator. + + def initialize(parent_generator, options) + @parent_generator = parent_generator + @store = parent_generator.store + @options = options + + @template_dir = File.expand_path '../template/json_index', __FILE__ + @base_dir = @parent_generator.base_dir + + @classes = nil + @files = nil + @index = nil + end + + ## + # Builds the JSON index as a Hash. + + def build_index + reset @store.all_files.sort, @store.all_classes_and_modules.sort + + index_classes + index_methods + index_pages + + { :index => @index } + end + + ## + # Output progress information if debugging is enabled + + def debug_msg *msg + return unless $DEBUG_RDOC + $stderr.puts(*msg) + end + + ## + # Writes the JSON index to disk + + def generate + debug_msg "Generating JSON index" + + debug_msg " writing search index to %s" % SEARCH_INDEX_FILE + data = build_index + + return if @options.dry_run + + out_dir = @base_dir + @options.op_dir + index_file = out_dir + SEARCH_INDEX_FILE + + FileUtils.mkdir_p index_file.dirname, :verbose => $DEBUG_RDOC + + index_file.open 'w', 0644 do |io| + io.set_encoding Encoding::UTF_8 + io.write 'var search_data = ' + + JSON.dump data, io, 0 + end + unless ENV['SOURCE_DATE_EPOCH'].nil? + index_file.utime index_file.atime, Time.at(ENV['SOURCE_DATE_EPOCH'].to_i).gmtime + end + + Dir.chdir @template_dir do + Dir['**/*.js'].each do |source| + dest = File.join out_dir, source + + FileUtils.install source, dest, :mode => 0644, :preserve => true, :verbose => $DEBUG_RDOC + end + end + end + + ## + # Compress the search_index.js file using gzip + + def generate_gzipped + return if @options.dry_run or not defined?(Zlib) + + debug_msg "Compressing generated JSON index" + out_dir = @base_dir + @options.op_dir + + search_index_file = out_dir + SEARCH_INDEX_FILE + outfile = out_dir + "#{search_index_file}.gz" + + debug_msg "Reading the JSON index file from %s" % search_index_file + search_index = search_index_file.read(mode: 'r:utf-8') + + debug_msg "Writing gzipped search index to %s" % outfile + + Zlib::GzipWriter.open(outfile) do |gz| + gz.mtime = File.mtime(search_index_file) + gz.orig_name = search_index_file.basename.to_s + gz.write search_index + gz.close + end + + # GZip the rest of the js files + Dir.chdir @template_dir do + Dir['**/*.js'].each do |source| + dest = out_dir + source + outfile = out_dir + "#{dest}.gz" + + debug_msg "Reading the original js file from %s" % dest + data = dest.read + + debug_msg "Writing gzipped file to %s" % outfile + + Zlib::GzipWriter.open(outfile) do |gz| + gz.mtime = File.mtime(dest) + gz.orig_name = dest.basename.to_s + gz.write data + gz.close + end + end + end + end + + ## + # Adds classes and modules to the index + + def index_classes + debug_msg " generating class search index" + + documented = @classes.uniq.select do |klass| + klass.document_self_or_methods + end + + documented.each do |klass| + debug_msg " #{klass.full_name}" + record = klass.search_record + @index[:searchIndex] << search_string(record.shift) + @index[:longSearchIndex] << search_string(record.shift) + @index[:info] << record + end + end + + ## + # Adds methods to the index + + def index_methods + debug_msg " generating method search index" + + list = @classes.uniq.flat_map do |klass| + klass.method_list + end.sort_by do |method| + [method.name, method.parent.full_name] + end + + list.each do |method| + debug_msg " #{method.full_name}" + record = method.search_record + @index[:searchIndex] << "#{search_string record.shift}()" + @index[:longSearchIndex] << "#{search_string record.shift}()" + @index[:info] << record + end + end + + ## + # Adds pages to the index + + def index_pages + debug_msg " generating pages search index" + + pages = @files.select do |file| + file.text? + end + + pages.each do |page| + debug_msg " #{page.page_name}" + record = page.search_record + @index[:searchIndex] << search_string(record.shift) + @index[:longSearchIndex] << '' + record.shift + @index[:info] << record + end + end + + def reset(files, classes) # :nodoc: + @files = files + @classes = classes + + @index = { + :searchIndex => [], + :longSearchIndex => [], + :info => [] + } + end + + ## + # Removes whitespace and downcases +string+ + + def search_string(string) + string.downcase.gsub(/\s/, '') + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/markup.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/markup.rb new file mode 100644 index 0000000..1c39687 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/markup.rb @@ -0,0 +1,171 @@ +# frozen_string_literal: true +## +# Handle common RDoc::Markup tasks for various CodeObjects +# +# This module is loaded by generators. It allows RDoc's CodeObject tree to +# avoid loading generator code to improve startup time for +ri+. + +module RDoc::Generator::Markup + + ## + # Generates a relative URL from this object's path to +target_path+ + + def aref_to(target_path) + RDoc::Markup::ToHtml.gen_relative_url path, target_path + end + + ## + # Generates a relative URL from +from_path+ to this object's path + + def as_href(from_path) + RDoc::Markup::ToHtml.gen_relative_url from_path, path + end + + ## + # Handy wrapper for marking up this object's comment + + def description + markup @comment + end + + ## + # Creates an RDoc::Markup::ToHtmlCrossref formatter + + def formatter + return @formatter if defined? @formatter + + options = @store.options + this = RDoc::Context === self ? self : @parent + + @formatter = RDoc::Markup::ToHtmlCrossref.new options, this.path, this + @formatter.code_object = self + @formatter + end + + ## + # Build a webcvs URL starting for the given +url+ with +full_path+ appended + # as the destination path. If +url+ contains '%s' +full_path+ will be + # will replace the %s using sprintf on the +url+. + + def cvs_url(https://github.com/url,%20full_path) + if /%s/ =~ url then + sprintf url, full_path + else + url + full_path + end + end + + ## + # The preferred URL for this object. + + def canonical_url + options = @store.options + if path + File.join(options.canonical_root, path.to_s) + else + options.canonical_root + end + end + +end + +class RDoc::CodeObject + + include RDoc::Generator::Markup + +end + +class RDoc::MethodAttr + + ## + # Prepend +src+ with line numbers. Relies on the first line of a source + # code listing having: + # + # # File xxxxx, line dddd + # + # If it has this comment then line numbers are added to +src+ and the , + # line dddd portion of the comment is removed. + + def add_line_numbers(src) + return unless src.sub!(/\A(.*)(, line (\d+))/, '\1') + first = $3.to_i - 1 + last = first + src.count("\n") + size = last.to_s.length + + line = first + src.gsub!(/^/) do + res = if line == first then + " " * (size + 1) + else + "%2$*1$d " % [size, line] + end + + line += 1 + res + end + end + + ## + # Turns the method's token stream into HTML. + # + # Prepends line numbers if +options.line_numbers+ is true. + + def markup_code + return '' unless @token_stream + + src = RDoc::TokenStream.to_html @token_stream + + # dedent the source + indent = src.length + lines = src.lines.to_a + lines.shift if src =~ /\A.*#\ *File/i # remove '# File' comment + lines.each do |line| + if line =~ /^ *(?=\S)/ + n = $~.end(0) + indent = n if n < indent + break if n == 0 + end + end + src.gsub!(/^#{' ' * indent}/, '') if indent > 0 + + add_line_numbers(src) if options.line_numbers + + src + end + +end + +class RDoc::ClassModule + + ## + # Handy wrapper for marking up this class or module's comment + + def description + markup @comment_location + end + +end + +class RDoc::Context::Section + + include RDoc::Generator::Markup + +end + +class RDoc::TopLevel + + ## + # Returns a URL for this source file on some web repository. Use the -W + # command line option to set. + + def cvs_url + url = @store.options.webcvs + + if /%s/ =~ url then + url % @relative_name + else + url + @relative_name + end + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot.rb new file mode 100644 index 0000000..a20fde0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot.rb @@ -0,0 +1,94 @@ +# frozen_string_literal: true +## +# Generates a POT file. +# +# Here is a translator work flow with the generator. +# +# == Create .pot +# +# You create .pot file by pot formatter: +# +# % rdoc --format pot +# +# It generates doc/rdoc.pot. +# +# == Create .po +# +# You create .po file from doc/rdoc.pot. This operation is needed only +# the first time. This work flow assumes that you are a translator +# for Japanese. +# +# You create locale/ja/rdoc.po from doc/rdoc.pot. You can use msginit +# provided by GNU gettext or rmsginit provided by gettext gem. This +# work flow uses gettext gem because it is more portable than GNU +# gettext for Rubyists. Gettext gem is implemented by pure Ruby. +# +# % gem install gettext +# % mkdir -p locale/ja +# % rmsginit --input doc/rdoc.pot --output locale/ja/rdoc.po --locale ja +# +# Translate messages in .po +# +# You translate messages in .po by a PO file editor. po-mode.el exists +# for Emacs users. There are some GUI tools such as GTranslator. +# There are some Web services such as POEditor and Tansifex. You can +# edit by your favorite text editor because .po is a text file. +# Generate localized documentation +# +# You can generate localized documentation with locale/ja/rdoc.po: +# +# % rdoc --locale ja +# +# You can find documentation in Japanese in doc/. Yay! +# +# == Update translation +# +# You need to update translation when your application is added or +# modified messages. +# +# You can update .po by the following command lines: +# +# % rdoc --format pot +# % rmsgmerge --update locale/ja/rdoc.po doc/rdoc.pot +# +# You edit locale/ja/rdoc.po to translate new messages. + +class RDoc::Generator::POT + + RDoc::RDoc.add_generator self + + ## + # Description of this generator + + DESCRIPTION = 'creates .pot file' + + ## + # Set up a new .pot generator + + def initialize(store, options) #:not-new: + @options = options + @store = store + end + + ## + # Writes .pot to disk. + + def generate + po = extract_messages + pot_path = 'rdoc.pot' + File.open(pot_path, "w") do |pot| + pot.print(po.to_s) + end + end + + private + def extract_messages + extractor = MessageExtractor.new(@store) + extractor.extract + end + + require_relative 'pot/message_extractor' + require_relative 'pot/po' + require_relative 'pot/po_entry' + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/message_extractor.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/message_extractor.rb new file mode 100644 index 0000000..ee6d847 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/message_extractor.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true +## +# Extracts message from RDoc::Store + +class RDoc::Generator::POT::MessageExtractor + + ## + # Creates a message extractor for +store+. + + def initialize(store) + @store = store + @po = RDoc::Generator::POT::PO.new + end + + ## + # Extracts messages from +store+, stores them into + # RDoc::Generator::POT::PO and returns it. + + def extract + @store.all_classes_and_modules.each do |klass| + extract_from_klass(klass) + end + @po + end + + private + + def extract_from_klass(klass) + extract_text(klass.comment_location, klass.full_name) + + klass.each_section do |section, constants, attributes| + extract_text(section.title, "#{klass.full_name}: section title") + section.comments.each do |comment| + extract_text(comment, "#{klass.full_name}: #{section.title}") + end + end + + klass.constants.each do |constant| + extract_text(constant.comment, constant.full_name) + end + + klass.attributes.each do |attribute| + extract_text(attribute.comment, attribute.full_name) + end + + klass.each_method do |method| + extract_text(method.comment, method.full_name) + end + end + + def extract_text(text, comment, location = nil) + return if text.nil? + + options = { + :extracted_comment => comment, + :references => [location].compact, + } + i18n_text = RDoc::I18n::Text.new(text) + i18n_text.extract_messages do |part| + @po.add(entry(part[:paragraph], options)) + end + end + + def entry(msgid, options) + RDoc::Generator::POT::POEntry.new(msgid, options) + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/po.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/po.rb new file mode 100644 index 0000000..447cb60 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/po.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true +## +# Generates a PO format text + +class RDoc::Generator::POT::PO + + ## + # Creates an object that represents PO format. + + def initialize + @entries = {} + add_header + end + + ## + # Adds a PO entry to the PO. + + def add(entry) + existing_entry = @entries[entry.msgid] + if existing_entry + entry = existing_entry.merge(entry) + end + @entries[entry.msgid] = entry + end + + ## + # Returns PO format text for the PO. + + def to_s + po = '' + sort_entries.each do |entry| + po += "\n" unless po.empty? + po += entry.to_s + end + po + end + + private + + def add_header + add(header_entry) + end + + def header_entry + comment = <<-COMMENT +SOME DESCRIPTIVE TITLE. +Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +This file is distributed under the same license as the PACKAGE package. +FIRST AUTHOR , YEAR. + COMMENT + + content = <<-CONTENT +Project-Id-Version: PACKAGE VERSEION +Report-Msgid-Bugs-To: +PO-Revision-Date: YEAR-MO_DA HO:MI+ZONE +Last-Translator: FULL NAME +Language-Team: LANGUAGE +Language: +MIME-Version: 1.0 +Content-Type: text/plain; charset=CHARSET +Content-Transfer-Encoding: 8bit +Plural-Forms: nplurals=INTEGER; plural=EXPRESSION; + CONTENT + + options = { + :msgstr => content, + :translator_comment => comment, + :flags => ['fuzzy'], + } + RDoc::Generator::POT::POEntry.new('', options) + end + + def sort_entries + headers, messages = @entries.values.partition do |entry| + entry.msgid.empty? + end + # TODO: sort by location + sorted_messages = messages.sort_by do |entry| + entry.msgid + end + headers + sorted_messages + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/po_entry.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/po_entry.rb new file mode 100644 index 0000000..8de260e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/po_entry.rb @@ -0,0 +1,141 @@ +# frozen_string_literal: true +## +# A PO entry in PO + +class RDoc::Generator::POT::POEntry + + # The msgid content + attr_reader :msgid + + # The msgstr content + attr_reader :msgstr + + # The comment content created by translator (PO editor) + attr_reader :translator_comment + + # The comment content extracted from source file + attr_reader :extracted_comment + + # The locations where the PO entry is extracted + attr_reader :references + + # The flags of the PO entry + attr_reader :flags + + ## + # Creates a PO entry for +msgid+. Other values can be specified by + # +options+. + + def initialize(msgid, options = {}) + @msgid = msgid + @msgstr = options[:msgstr] || "" + @translator_comment = options[:translator_comment] + @extracted_comment = options[:extracted_comment] + @references = options[:references] || [] + @flags = options[:flags] || [] + end + + ## + # Returns the PO entry in PO format. + + def to_s + entry = '' + entry += format_translator_comment + entry += format_extracted_comment + entry += format_references + entry += format_flags + entry += <<-ENTRY +msgid #{format_message(@msgid)} +msgstr #{format_message(@msgstr)} + ENTRY + end + + ## + # Merges the PO entry with +other_entry+. + + def merge(other_entry) + options = { + :extracted_comment => merge_string(@extracted_comment, + other_entry.extracted_comment), + :translator_comment => merge_string(@translator_comment, + other_entry.translator_comment), + :references => merge_array(@references, + other_entry.references), + :flags => merge_array(@flags, + other_entry.flags), + } + self.class.new(@msgid, options) + end + + private + + def format_comment(mark, comment) + return '' unless comment + return '' if comment.empty? + + formatted_comment = '' + comment.each_line do |line| + formatted_comment += "#{mark} #{line}" + end + formatted_comment += "\n" unless formatted_comment.end_with?("\n") + formatted_comment + end + + def format_translator_comment + format_comment('#', @translator_comment) + end + + def format_extracted_comment + format_comment('#.', @extracted_comment) + end + + def format_references + return '' if @references.empty? + + formatted_references = '' + @references.sort.each do |file, line| + formatted_references += "\#: #{file}:#{line}\n" + end + formatted_references + end + + def format_flags + return '' if @flags.empty? + + formatted_flags = flags.join(",") + "\#, #{formatted_flags}\n" + end + + def format_message(message) + return "\"#{escape(message)}\"" unless message.include?("\n") + + formatted_message = '""' + message.each_line do |line| + formatted_message += "\n" + formatted_message += "\"#{escape(line)}\"" + end + formatted_message + end + + def escape(string) + string.gsub(/["\\\t\n]/) do |special_character| + case special_character + when "\t" + "\\t" + when "\n" + "\\n" + else + "\\#{special_character}" + end + end + end + + def merge_string(string1, string2) + [string1, string2].compact.join("\n") + end + + def merge_array(array1, array2) + (array1 + array2).uniq + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/ri.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/ri.rb new file mode 100644 index 0000000..32f518a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/ri.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true +## +# Generates ri data files + +class RDoc::Generator::RI + + RDoc::RDoc.add_generator self + + ## + # Description of this generator + + DESCRIPTION = 'creates ri data files' + + ## + # Set up a new ri generator + + def initialize(store, options) #:not-new: + @options = options + @store = store + @store.path = '.' + end + + ## + # Writes the parsed data store to disk for use by ri. + + def generate + @store.save + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_footer.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_footer.rhtml new file mode 100644 index 0000000..9791b42 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_footer.rhtml @@ -0,0 +1,5 @@ + diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_head.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_head.rhtml new file mode 100644 index 0000000..7376fc3 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_head.rhtml @@ -0,0 +1,48 @@ + + + +<%= h @title %> + +<%- if defined?(klass) -%> + "> + + <%- if klass.comment.empty? -%> + "> + <%- else -%> + "> + <%- end -%> +<%- elsif defined?(file) -%> + + "> +<%- elsif @title -%> + + + <%- if @options.main_page and + main_page = @files.find { |f| f.full_name == @options.main_page } then %> + "> + <%- else -%> + + <%- end -%> +<%- end -%> + +<%- if canonical_url = @options.canonical_root -%> +<% canonical_url = current.canonical_url if defined?(current) %> + +<%- end -%> + + + + + + + + + + + +<%- @options.template_stylesheets.each do |stylesheet| -%> + +<%- end -%> diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtml new file mode 100644 index 0000000..d33ecd4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtml @@ -0,0 +1,5 @@ + diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml new file mode 100644 index 0000000..067bd62 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml @@ -0,0 +1,15 @@ +<%- unless klass.extends.empty? then %> + +<%- end -%> diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml new file mode 100644 index 0000000..04846f8 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml @@ -0,0 +1,15 @@ +<%- unless klass.includes.empty? then %> + +<%- end -%> diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml new file mode 100644 index 0000000..faed7e0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml @@ -0,0 +1,15 @@ + diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml new file mode 100644 index 0000000..d09216a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml @@ -0,0 +1,21 @@ +<% if (class_methods = klass.class_method_list.sort).any? %> + +<% end %> + +<% if (instance_methods = klass.instance_methods.sort).any? %> + +<% end %> diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_navigation.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_navigation.rhtml new file mode 100644 index 0000000..d7f3308 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_navigation.rhtml @@ -0,0 +1,11 @@ + diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml new file mode 100644 index 0000000..3f68f0c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml @@ -0,0 +1,32 @@ +<%- simple_files = @files.select { |f| f.text? } %> +<%- if defined?(current) -%> + <%- dir = current.full_name[%r{\A[^/]+(?=/)}] || current.page_name -%> +<%- end -%> +<%- unless simple_files.empty? then -%> + +<%- end -%> diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml new file mode 100644 index 0000000..6808b2b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml @@ -0,0 +1,6 @@ +<%- if klass.type == 'class' && (ancestors = klass.super_classes).any? -%> + +<%- end -%> diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtml new file mode 100644 index 0000000..afc7f7b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtml @@ -0,0 +1,14 @@ + diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml new file mode 100644 index 0000000..6dcd2ae --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml @@ -0,0 +1,11 @@ +<%- unless klass.sections.length == 1 then %> + +<%- end -%> diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml new file mode 100644 index 0000000..b1e047b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml @@ -0,0 +1,39 @@ +<%- comment = if current.respond_to? :comment_location then + current.comment_location + else + current.comment + end + table = current.parse(comment).table_of_contents.dup + + if table.length > 1 then %> + +<%- end -%> diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_toggle.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_toggle.rhtml new file mode 100644 index 0000000..ed2cbe3 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_toggle.rhtml @@ -0,0 +1,3 @@ + diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/class.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/class.rhtml new file mode 100644 index 0000000..628945d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/class.rhtml @@ -0,0 +1,221 @@ + +<%= render '_sidebar_toggle.rhtml' %> + + + +
+ <%# If nesting level is 1, breadcrumb list is not needed %> + <% if breadcrumb.size > 1 %> + + <% end %> + +

+ <%= klass.type %> <%= klass.full_name %> +

+ +
+ <%= klass.description %> +
+ + <%- klass.each_section do |section, constants, attributes| -%> + +<%- end -%> +
diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/css/fonts.css b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/css/fonts.css new file mode 100644 index 0000000..57302b5 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/css/fonts.css @@ -0,0 +1,167 @@ +/* + * Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), + * with Reserved Font Name "Source". All Rights Reserved. Source is a + * trademark of Adobe Systems Incorporated in the United States and/or other + * countries. + * + * This Font Software is licensed under the SIL Open Font License, Version + * 1.1. + * + * This license is copied below, and is also available with a FAQ at: + * http://scripts.sil.org/OFL + */ + +@font-face { + font-family: "Source Code Pro"; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), + local("SourceCodePro-Regular"), + url("https://github.com/fonts/SourceCodePro-Regular.ttf") format("truetype"); +} + +@font-face { + font-family: "Source Code Pro"; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), + local("SourceCodePro-Bold"), + url("https://github.com/fonts/SourceCodePro-Bold.ttf") format("truetype"); +} + +/* + * Copyright (c) 2010, Łukasz Dziedzic (dziedzic@typoland.com), + * with Reserved Font Name Lato. + * + * This Font Software is licensed under the SIL Open Font License, Version + * 1.1. + * + * This license is copied below, and is also available with a FAQ at: + * http://scripts.sil.org/OFL + */ + +@font-face { + font-family: "Lato"; + font-style: normal; + font-weight: 300; + src: local("Lato Light"), + local("Lato-Light"), + url("https://github.com/fonts/Lato-Light.ttf") format("truetype"); +} + +@font-face { + font-family: "Lato"; + font-style: italic; + font-weight: 300; + src: local("Lato Light Italic"), + local("Lato-LightItalic"), + url("https://github.com/fonts/Lato-LightItalic.ttf") format("truetype"); +} + +@font-face { + font-family: "Lato"; + font-style: normal; + font-weight: 700; + src: local("Lato Regular"), + local("Lato-Regular"), + url("https://github.com/fonts/Lato-Regular.ttf") format("truetype"); +} + +@font-face { + font-family: "Lato"; + font-style: italic; + font-weight: 700; + src: local("Lato Italic"), + local("Lato-Italic"), + url("https://github.com/fonts/Lato-RegularItalic.ttf") format("truetype"); +} + +/* + * ----------------------------------------------------------- + * SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 + * ----------------------------------------------------------- + * + * PREAMBLE + * The goals of the Open Font License (OFL) are to stimulate worldwide + * development of collaborative font projects, to support the font creation + * efforts of academic and linguistic communities, and to provide a free and + * open framework in which fonts may be shared and improved in partnership + * with others. + * + * The OFL allows the licensed fonts to be used, studied, modified and + * redistributed freely as long as they are not sold by themselves. The + * fonts, including any derivative works, can be bundled, embedded, + * redistributed and/or sold with any software provided that any reserved + * names are not used by derivative works. The fonts and derivatives, + * however, cannot be released under any other type of license. The + * requirement for fonts to remain under this license does not apply + * to any document created using the fonts or their derivatives. + * + * DEFINITIONS + * "Font Software" refers to the set of files released by the Copyright + * Holder(s) under this license and clearly marked as such. This may + * include source files, build scripts and documentation. + * + * "Reserved Font Name" refers to any names specified as such after the + * copyright statement(s). + * + * "Original Version" refers to the collection of Font Software components as + * distributed by the Copyright Holder(s). + * + * "Modified Version" refers to any derivative made by adding to, deleting, + * or substituting -- in part or in whole -- any of the components of the + * Original Version, by changing formats or by porting the Font Software to a + * new environment. + * + * "Author" refers to any designer, engineer, programmer, technical + * writer or other person who contributed to the Font Software. + * + * PERMISSION & CONDITIONS + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of the Font Software, to use, study, copy, merge, embed, modify, + * redistribute, and sell modified and unmodified copies of the Font + * Software, subject to the following conditions: + * + * 1) Neither the Font Software nor any of its individual components, + * in Original or Modified Versions, may be sold by itself. + * + * 2) Original or Modified Versions of the Font Software may be bundled, + * redistributed and/or sold with any software, provided that each copy + * contains the above copyright notice and this license. These can be + * included either as stand-alone text files, human-readable headers or + * in the appropriate machine-readable metadata fields within text or + * binary files as long as those fields can be easily viewed by the user. + * + * 3) No Modified Version of the Font Software may use the Reserved Font + * Name(s) unless explicit written permission is granted by the corresponding + * Copyright Holder. This restriction only applies to the primary font name as + * presented to the users. + * + * 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font + * Software shall not be used to promote, endorse or advertise any + * Modified Version, except to acknowledge the contribution(s) of the + * Copyright Holder(s) and the Author(s) or with their explicit written + * permission. + * + * 5) The Font Software, modified or unmodified, in part or in whole, + * must be distributed entirely under this license, and must not be + * distributed under any other license. The requirement for fonts to + * remain under this license does not apply to any document created + * using the Font Software. + * + * TERMINATION + * This license becomes null and void if any of the above conditions are + * not met. + * + * DISCLAIMER + * THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM + * OTHER DEALINGS IN THE FONT SOFTWARE. + */ + diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/css/rdoc.css b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/css/rdoc.css new file mode 100644 index 0000000..c84a604 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/css/rdoc.css @@ -0,0 +1,683 @@ +/* + * "Darkfish" RDoc CSS + * $Id: rdoc.css 54 2009-01-27 01:09:48Z deveiant $ + * + * Author: Michael Granger + * + */ + +/* vim: ft=css et sw=2 ts=2 sts=2 */ + +/* 1. Variables and Root Styles */ +:root { + --sidebar-width: 300px; + --highlight-color: #cc342d; /* Reddish color for accents and headings */ + --secondary-highlight-color: #c83045; /* Darker reddish color for secondary highlights */ + --text-color: #505050; /* Dark bluish-grey for text */ + --background-color: #fefefe; /* Near white background */ + --code-block-background-color: #f6f6f3; /* Slightly darker grey for code blocks */ + --link-color: #42405F; /* Dark bluish-grey for links */ + --link-hover-color: var(--highlight-color); /* Reddish color on hover */ + --border-color: #e0e0e0;; /* General border color */ + --source-code-toggle-color: var(--secondary-highlight-color); + --scrollbar-thumb-hover-background: #505050; /* Hover color for scrollbar thumb */ + --table-header-background-color: #eceaed; + --table-td-background-color: #f5f4f6; + + /* Font family variables */ + --font-primary: 'Segoe UI', 'Verdana', 'Arial', sans-serif; + --font-heading: 'Helvetica', 'Arial', sans-serif; + --font-code: monospace; +} + +/* 2. Global Styles */ +body { + background: var(--background-color); + font-family: var(--font-primary); + font-weight: 400; + color: var(--text-color); + line-height: 1.6; + + /* Layout */ + display: flex; + flex-direction: column; + min-height: 100vh; + margin: 0; +} + +/* 3. Typography */ +h1 span, +h2 span, +h3 span, +h4 span, +h5 span, +h6 span { + position: relative; + + display: none; + padding-left: 1em; + line-height: 0; + vertical-align: baseline; + font-size: 10px; +} + +h1 span { top: -1.3em; } +h2 span { top: -1.2em; } +h3 span { top: -1.0em; } +h4 span { top: -0.8em; } +h5 span { top: -0.5em; } +h6 span { top: -0.5em; } + +h1:hover span, +h2:hover span, +h3:hover span, +h4:hover span, +h5:hover span, +h6:hover span { + display: inline; +} + +h1:target, +h2:target, +h3:target, +h4:target, +h5:target, +h6:target { + margin-left: -10px; + border-left: 10px solid var(--border-color); + scroll-margin-top: 1rem; +} + +main .anchor-link:target { + scroll-margin-top: 1rem; +} + +/* 4. Links */ +a { + color: var(--link-color); + transition: color 0.3s ease; + text-decoration: underline; + text-underline-offset: 0.2em; /* Make sure it doesn't overlap with underscores in a method name. */ +} + +a:hover { + color: var(--link-hover-color); +} + +a code:hover { + color: var(--link-hover-color); +} + +/* 5. Code and Pre */ +code, +pre { + font-family: var(--font-code); + background-color: var(--code-block-background-color); + border: 1px solid var(--border-color); + border-radius: 6px; + padding: 16px; + overflow-x: auto; + font-size: 15px; + line-height: 1.5; + margin: 1em 0; +} + +code { + background-color: var(--code-block-background-color); + padding: 0.1em 0.3em; + border-radius: 3px; + font-size: 85%; +} + +/* Tables */ +table { + margin: 0; + border-spacing: 0; + border-collapse: collapse; +} + +table tr th, table tr td { + padding: 0.2em 0.4em; + border: 1px solid var(--border-color); +} + +table tr th { + background-color: var(--table-header-background-color); +} + +table tr:nth-child(even) td { + background-color: var(--table-td-background-color); +} + +/* 7. Navigation and Sidebar */ +nav { + font-family: var(--font-heading); + font-size: 16px; + border-right: 1px solid var(--border-color); + position: fixed; + top: 0; + bottom: 0; + left: 0; + width: var(--sidebar-width); + background: var(--background-color); /* It needs an explicit background for toggling narrow screens */ + overflow-y: auto; + z-index: 10; + display: flex; + flex-direction: column; + color: var(--text-color); +} + +nav[hidden] { + display: none; +} + +nav footer { + padding: 1em; + border-top: 1px solid var(--border-color); +} + +nav footer a { + color: var(--secondary-highlight-color); +} + +nav .nav-section { + margin-top: 1em; + padding: 0 1em; +} + +nav h2, nav h3 { + margin: 0 0 0.5em; + padding: 0.5em 0; + color: var(--highlight-color); + border-bottom: 1px solid var(--border-color); +} + +nav h2 { + font-size: 1.2em; +} + +nav h3, +#table-of-contents-navigation { + font-size: 1em; +} + +ol.breadcrumb { + display: flex; + + padding: 0; + margin: 0 0 1em; +} + +ol.breadcrumb li { + display: block; + list-style: none; + font-size: 125%; +} + +nav ul, +nav dl, +nav p { + padding: 0; + list-style: none; + margin: 0.5em 0; +} + +nav ul li { + margin-bottom: 0.3em; +} + +nav ul ul { + padding-left: 1em; +} + +nav ul ul ul { + padding-left: 1em; +} + +nav ul ul ul ul { + padding-left: 1em; +} + +nav a { + color: var(--link-color); + text-decoration: none; +} + +nav a:hover { + color: var(--link-hover-color); + text-decoration: underline; +} + +#navigation-toggle { + z-index: 1000; + font-size: 2em; + display: block; + position: fixed; + top: 10px; + left: 20px; + cursor: pointer; +} + +#navigation-toggle[aria-expanded="true"] { + top: 10px; + left: 250px; +} + +nav ul li details { + position: relative; + padding-right: 1.5em; /* Add space for the marker on the right */ +} + +nav ul li details > summary { + list-style: none; /* Remove the default marker */ + position: relative; /* So that the open/close triangle can position itself absolutely inside */ +} + +nav ul li details > summary::-webkit-details-marker { + display: none; /* Removes the default marker, in Safari 18. */ +} + +nav ul li details > summary::after { + content: '▶'; /* Unicode right-pointing triangle */ + position: absolute; + font-size: 0.8em; + bottom: 0.1em; + margin-left: 0.3em; + transition: transform 0.2s ease; +} + +nav ul li details[open] > summary::after { + transform: rotate(90deg); /* Rotate the triangle when open */ +} + +/* 8. Main Content */ +main { + flex: 1; + display: block; + margin: 3em auto; + padding: 0 2em; + max-width: 800px; + font-size: 16px; + line-height: 1.6; + color: var(--text-color); + box-sizing: border-box; +} + +@media (min-width: 1024px) { + main { + margin-left: var(--sidebar-width); + } + + .table-of-contents main { + margin-left: 20em; + } + + #navigation-toggle { + display: none; + } +} + +main h1[class] { + margin-top: 0; + margin-bottom: 1em; + font-size: 2.5em; + color: var(--highlight-color); +} + +main h1, +main h2, +main h3, +main h4, +main h5, +main h6 { + font-family: var(--font-heading); + color: var(--highlight-color); +} + +/* Search */ +#search-section { + padding: 1em; + background-color: var(--background-color); + border-bottom: 1px solid var(--border-color); +} + +#search-field-wrapper { + position: relative; + display: flex; + align-items: center; +} + +#search-field { + width: 100%; + padding: 0.5em 1em 0.5em 2.5em; + border: 1px solid var(--border-color); + border-radius: 20px; + font-size: 14px; + outline: none; + transition: border-color 0.3s ease; + color: var(--text-color); +} + +#search-field:focus { + border-color: var(--highlight-color); +} + +#search-field::placeholder { + color: var(--text-color); +} + +#search-field-wrapper::before { + content: "\1F50D"; + position: absolute; + left: 0.75em; + top: 50%; + transform: translateY(-50%); + font-size: 14px; + color: var(--text-color); + opacity: 0.6; +} + +/* Search Results */ +#search-results { + font-family: var(--font-primary); + font-weight: 300; +} + +#search-results .search-match { + font-family: var(--font-heading); + font-weight: normal; +} + +#search-results .search-selected { + background: var(--code-block-background-color); + border-bottom: 1px solid transparent; +} + +#search-results li { + list-style: none; + border-bottom: 1px solid var(--border-color); + margin-bottom: 0.5em; +} + +#search-results li:last-child { + border-bottom: none; + margin-bottom: 0; +} + +#search-results li p { + padding: 0; + margin: 0.5em; +} + +#search-results .search-namespace { + font-weight: bold; +} + +#search-results li em { + background-color: rgba(224, 108, 117, 0.1); + font-style: normal; +} + +#search-results pre { + margin: 0.5em; + font-family: var(--font-code); +} + +/* Syntax Highlighting - Gruvbox Light Scheme */ + +.ruby-constant { color: #AF3A03; } /* Dark Orange */ +.ruby-keyword { color: #9D0006; } /* Dark Red */ +.ruby-ivar { color: #B57614; } /* Brown */ +.ruby-operator { color: #427B58; } /* Dark Teal */ +.ruby-identifier { color: #076678; } /* Deep Teal */ +.ruby-node { color: #8F3F71; } /* Plum */ +.ruby-comment { color: #928374; font-style: italic; } /* Gray */ +.ruby-regexp { color: #8F3F71; } /* Plum */ +.ruby-value { color: #AF3A03; } /* Dark Orange */ +.ruby-string { color: #79740E; } /* Olive */ + +/* Emphasis */ +em { + text-decoration-color: rgba(52, 48, 64, 0.25); + text-decoration-line: underline; + text-decoration-style: dotted; +} + +strong, +em { + color: var(--highlight-color); + background-color: rgba(255, 111, 97, 0.1); /* Light red background for emphasis */ +} + +/* Paragraphs */ +main p { + line-height: 1.5em; + font-weight: 400; +} + +/* Preformatted Text */ +main pre { + margin: 1.2em 0.5em; + padding: 1em; + font-size: 0.8em; +} + +/* Horizontal Rules */ +main hr { + margin: 1.5em 1em; + border: 2px solid var(--border-color); +} + +/* Blockquotes */ +main blockquote { + margin: 0 2em 1.2em 1.2em; + padding-left: 0.5em; + border-left: 2px solid var(--border-color); +} + +/* Lists */ +main li > p { + margin: 0.5em; +} + +/* Definition Lists */ +main dl { + margin: 1em 0.5em; +} + +main dt { + line-height: 1.5; /* matches `main p` */ + font-weight: bold; +} + +main dl.note-list dt { + margin-right: 1em; + float: left; +} + +main dl.note-list dt:has(+ dt) { + margin-right: 0.25em; +} + +main dl.note-list dt:has(+ dt)::after { + content: ', '; + font-weight: normal; +} + +main dd { + margin: 0 0 1em 1em; +} + +main dd p:first-child { + margin-top: 0; +} + +/* Headers within Main */ +main header h2 { + margin-top: 2em; + border-width: 0; + border-top: 4px solid var(--border-color); + font-size: 130%; +} + +main header h3 { + margin: 2em 0 1.5em; + border-width: 0; + border-top: 3px solid var(--border-color); + font-size: 120%; +} + +/* Utility Classes */ +.hide { display: none !important; } +.initially-hidden { display: none; } + +/* Table of Contents */ +.table-of-contents ul { + margin: 1em; + list-style: none; +} + +.table-of-contents ul ul { + margin-top: 0.25em; +} + +.table-of-contents ul :link, +.table-of-contents ul :visited { + font-size: 16px; +} + +.table-of-contents li { + margin-bottom: 0.25em; +} + +/* Method Details */ +main .method-source-code { + visibility: hidden; + max-height: 0; + overflow: auto; + transition-duration: 200ms; + transition-delay: 0ms; + transition-property: all; + transition-timing-function: ease-in-out; +} + +main .method-source-code pre { + border-color: var(--source-code-toggle-color); +} + +main .method-source-code.active-menu { + visibility: visible; + max-height: 100vh; +} + +main .method-description .method-calls-super { + color: var(--text-color); + font-weight: bold; +} + +main .method-detail { + margin-bottom: 2.5em; +} + +main .method-detail:target { + margin-left: -10px; + border-left: 10px solid var(--border-color); +} + +main .method-header { + display: inline-block; +} + +main .method-heading { + position: relative; + font-family: var(--font-code); + font-size: 110%; + font-weight: bold; +} + +main .method-heading::after { + content: '¶'; + position: absolute; + visibility: hidden; + color: var(--highlight-color); + font-size: 0.5em; +} + +main .method-heading:hover::after { + visibility: visible; +} + +main .method-controls { + line-height: 20px; + float: right; + color: var(--source-code-toggle-color); + cursor: pointer; +} + +main .method-description, +main .aliases { + margin-top: 0.75em; + color: var(--text-color); +} + +main .aliases { + padding-top: 4px; + font-style: italic; + cursor: default; +} + +main .aliases a { + color: var(--secondary-highlight-color); +} + +main .mixin-from { + font-size: 80%; + font-style: italic; + margin-bottom: 0.75em; +} + +main .method-description ul { + margin-left: 1.5em; +} + +main #attribute-method-details .method-detail:hover { + background-color: transparent; + cursor: default; +} + +main .attribute-access-type { + text-transform: uppercase; +} + +/* Responsive Adjustments */ +@media (max-width: 480px) { + nav { + width: 100%; + } + + main { + margin: 1em auto; + padding: 0 1em; + max-width: 100%; + } + + #navigation-toggle { + right: 10px; + left: auto; + } + + #navigation-toggle[aria-expanded="true"] { + left: auto; + } + + table { + display: block; + overflow-x: auto; + white-space: nowrap; + } + + main .method-controls { + margin-top: 10px; + float: none; + } +} diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-Light.ttf b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-Light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b49dd43729d456e489a8f4c8ec323a47ab8b9ae8 GIT binary patch literal 94668 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

FsulxL_Yn=fqW!JSYn4UZz_VI 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-LightItalic.ttf b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-LightItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7959fef0756e905627298817d86513fdf26d6922 GIT binary patch literal 94196 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 Sv(kH?wp@?o-S`p3*#7{ysOP%? literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-Regular.ttf b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..839cd589dc5eba0da98b43451b4ec6c328ca48b8 GIT binary patch literal 96184 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

ucu-&%9a>XM7550A4YWv99%x~0LA&?HZ)eRytM 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-RegularItalic.ttf b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-RegularItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..bababa09e3fad2aa3e788898e7753ff8d80a8e8f GIT binary patch literal 95316 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 Zdy6Gm=sD%RPg|bPWWD$h#s3t#{x=NUkZJ$` literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Bold.ttf b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..dd00982d4952a7f6b7725fafc1e648128fb250ef GIT binary patch literal 138268 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 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Regular.ttf b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1decfb95af634f6e44fb1ba6d56fa342656dce60 GIT binary patch literal 138680 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 VPoPKO>nq%T(TdfN`-7hl{|8{rQ_BDV literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/add.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/add.png new file mode 100644 index 0000000000000000000000000000000000000000..6332fefea4be19eeadf211b0b202b272e8564898 GIT binary patch literal 733 zcmV<30wVp1P)9VHk(~TedF+gQSL8D5xnVSSWAVY>J9b+m>@{iq7_KE}go~11+5s4;8hc+i0Xa zI1j@EX5!S+Me6HNqKzU5YQwL;-W5$p%ZMKMeR<%zp69-~?<4?8|C8S?bklXr4v&Ov zb&06v2|-x?qB`90yn>Qi%Sh2^G4n)$ZdyvTPf9}1)_buUT7>`e2G&2VU@~Bb(o+Mz zi4)>IxlSY${Dj4k={-9RzU^W5g9|2V5RZ2ZulL9s2xQbZ@r6eP9Ra5u(s|C0Nj#&4>wTSkb?%#=9?@ z^oxDy-O@tyN{L@by(WWvQ3%CyEu8x{+#Jb4-h&K9Owi)2pgg+heWDyked|3R$$kL@A z#sp1v-r+=G4B8D6DqsDH0@7OztA7aT9qc1Py{()w`m``?Y0&gi2=ROcc-9+nU^I6< zT=e_Y=vSnG@?3Ue{BW5ONFttcE!R-R_W4O01|0-|K-YNXLo2`4Qv z`r1LxR6#yf3FB%T95gJnaKKivA~Z}S9A(ZxEDK}O3T04USJ P00000NkvXXu0mjf^IS-S literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/arrow_up.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..1ebb193243780b8eb1919a51ef27c2a0d36ccec2 GIT binary patch literal 372 zcmV-)0gL{LP)6w#wHUuW*nL5>vZR zlg{G&%mT~|kL3ei%GW0*UOHUMs5XI$4uxe-L?I@SAefq*207}Iqtjm#e5*fP53AiC z)C|RQfwzxx<#_WfANRGZx{+tFDl8~Q?;~Ve=lM^*8UTTnVL?HTDz8uta0D@d28E9S z_)i8aLz^UE6PPKymi;2GJ`34{eIia-CtfAt0H61rk0 SPTNud0000Pdwe5?6tW?r-ok|b$oDQj8FV%kZPq;(MWOV8?8;<)(iP}>hNMU> z7fbz%jjlr7h8uuoQ~J6}n}@Y@PdTk=)PxO{%7zmL?dchpZX*~n;I{!C>*(8cU;q(~ zAS%Po_@naEU!xidrBXD?;hN|x^%W|Ij)0y*r5vi|?W&Fub(NqJ@z0o=O&SR3v>A``^efOSo-hEdApp;^Jd;9y!%1UfzX6Bh- z%-mbG|0Na{7Ruai_Y+DEb1s+b!*9k%Q!whMxjtZKA*?o;i1g&jy0@( zaU=-@d-h+o%gal6JRXEXA&L3`d2 z%jIxzZ~*p9O-;EJp_Ds0If38rM<5W8ic~K>FOK&2_p!CLg^i63OioVb6k$)zWHLx3 z5;!|M!}<9+#QSi1dRlbEcxPt^;cysUuU8@%3}RwpLRIGG<|IKnoyP6$Eh3SKw7a*r zSDXP=IYc&YZf;7@?fCe($^l9ORaJ3wbAx0uiC8QqRr$2t-Cfy8%XCI3B%pxJW>XdM zw~zPt_s}#A@pxQ5Ly)4szaMtH9lgE1SXx@b+S(fW`ub$fYPE8J7#bSNDzme*Ub07{ zQKV8SjEs!%0@v5ql8ggm!@$6Rbi^E8vBqpRM-}l+@5OSMrl+TWj*gC^qoV@>u{fQb zov5v?g~?>X@bEC&+uLPaQ&Ypn-y~^mZA}+f(&2EFH8eE%dU|@ENpN*_1-)L6_4Rc* zFuq@`IjX9vp1QiaK9ZojyZhnQURP99d=u;%37VRkpwsD4U0sd3x;hEQB&e^i|3QN0 z=H|Os1fRqaw!?#igLmS4HE!G3*ce(`TF} zlgUq0Q544c8(ae&UR$8ps&snq6^bPY3v3xAmMW74Di$h~GCH6E3TaYs2#6A<7K*gC z777H71_Wa;(dfp+g-drPCSWu)#PInZi72LJ;o?i~$-U=y&UbQ89Dul3%3P+Axkzc* zbH-y;QF=hR{qLItf%ci2_&e5wNo0gnVatG?ul6Zw=o$I9Ljfn*ic3`U?>IfEim3g{ zujU&$-hy6wn;w(xme|zJm;lWJxtTFfM)q0`kX!Vu0+d${$}LCddK1<^htTe-fUYL3 zB`SdNsZD>RgvLj1<^@h6_+cDRK2Brcr2~>%$*5S)hyV33PV^teac3%|4lz@8p4?)5 z?t5o^?q+%^%)Yygo~I^U4VR!bTnWuE35hcWrfCDR3q+sxJ79e7Fg`&)RCqLA^2^y^ z0laVfadW90_Fz8Brm|r47sB^u1VgI>kanj)Z4`zMSfHlm8>CwXa$JVM`$2RrmZB-3 zN10m-!;BvH*Br3V8t`DH7m`jf#2upVDXl{5ff18_pzCPK1Zu$$CKKvd8FGeFf)+K<|x33pc7P&S#3GZT4mEw;nr(Ze*F z3&*?-4U-lm*#tber5 z%S_ceqB`b3ko6r~BbvDwdohTvP(3a(pq{x#T$yQsu#OKwEe}KuH^Mh@nxg_(Nw136 zq#a^3xNBke)In+!?qk3%4wB69{pF`Tzg`07*qoM6N<$ Eg55P&8UO$Q literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/bullet_black.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/bullet_black.png new file mode 100644 index 0000000000000000000000000000000000000000..57619706d10d9736b1849a83f2c5694fbe09c53b GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$h^>lFz(Kw&{<9vg>5sw~gS5O!4 zr|{HuUFIBKiQyL}eBJ-L{`UVT|6_O~L{G%N{Wbre{kQtZ_0LvEhC#5QQ<|d}62BjvZR2H60wE-$h^mK6y(Kw&{<9vg>(S^W+6Zii9 z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz1H+_;eX)`ni0%X8XBDc-`=Ph(Uan2 zYsR{H!kvIN--9isvHznRsC#5QQ<|d}62BjvZR2H60wE-$h_H=O!(Kw&{<9vg>(S^W+6Zii9 z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz4q@v|B?28{s)#N@CGn3@%_y|zAV9T z66e<&B4?b6oF&azg|C(V&1ZbI_D}pL`}(^FT2yXwG1Ph~$Q@h8mJYOz!PC{xWt~$( F699+YQR)By literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/date.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/date.png new file mode 100644 index 0000000000000000000000000000000000000000..783c83357fdf90a1c7c024358e1d768b5c09c135 GIT binary patch literal 626 zcmV-&0*(ENP)5OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$fC4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(8Ia`-u_IEhxG7U<13kSsMW+$lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/find.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/find.png new file mode 100644 index 0000000000000000000000000000000000000000..1547479646722bda4647df52cf3e8bc9b77428c6 GIT binary patch literal 659 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 Dl)1NK literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/macFFBgHack.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/macFFBgHack.png new file mode 100644 index 0000000000000000000000000000000000000000..c6473b324ee1dae1faaacc0826639833f551116c GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIEX7WqAsj$Z!;#Vf4nJ za0`Jjl>Qs8<JF;+Fd5q0wCR k?u=~bH}2*0f`J3~k>FVdQ&MBb@0BAfpf&c&j literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/package.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/package.png new file mode 100644 index 0000000000000000000000000000000000000000..da3c2a2d74bab159ba0f65d7db601768258afcb2 GIT binary patch literal 853 zcmV-b1FHOqP)5TQ^(M5v$(QKVE?W+9X! z*o}&~6c?_FreF)9NJB7b5Nbn{G0n4+%uJhR9(V5R|NFTpb|HgjefT!tIhLx@DR+N) zV+fHiR5Yt19}k|KnCsND{tH-`IMJ)3AE?OtyZ4>Un|6(d%h#JK`i&a7^xW9>`yBy` zS4SOHeOpC7$?hH5-#7Rswiue_8Ju*2N@$58=a#2OTA3png`w3v->gWif7t%e$ z$NLVS!tFT#8WL|Wa&K~+{%4P2cRfwesYV1_!F=3OaRVHl(>=`%&{x*s30c}#CNE@&;ItrAv!f!)Oy$Q9t$uS=(sD$-J{T*^(8Eez1E-l3}} zPrfHZ1`qsIFe&gipuL8-IZbo2Yg{lFGKs?ZZWcOaOdk*3`5T;$?AjbG1#`B510Er^h2)2r3Y{!8_2Gj=$KzuN5 zaErtW8W_Y2iJJjY)5pmTVJoPJYpanPOEuYHclM^C1F>${hFRpdi8a<2H|Xudf78bm(zwJ9`K%6I?q*Ua~ fW9JvIbn5*B+_J)rUMBs>00000NkvXXu0mjfH&TkY literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/page_green.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/page_green.png new file mode 100644 index 0000000000000000000000000000000000000000..de8e003f9fb8752c09e7f3655d5d8664b5c62fc3 GIT binary patch literal 621 zcmV-z0+RiSP)QqUjAtB;_Vvt6}AS_5YgM`Uqu`yva+H8^=4U$e4gHb}u zAQ2N{V3A%pO|?Pv?tb6z=jC}SiRa$G^v3q?*6XcYz$p|cq{uLj@#~Fi`J(>5{@&&N zy%T^+;>8cXx%|o77anP?&W1?1A(>-T49z9pyeCl@7YI+Si zKti7=B~``}TImz(G{0PnlQA3P#MAd}sorMjkP!50B7$nAkU^%#nl{Q9lW0@}9fE-> zN(q7tRuiC_T1r|BBtVBTlQ2+70$Rf;eF`Z;lx46Cpu-rEgb)EBKq(b^W8l<^We(`D z43?0=01z<3G6+UUv6`CsWCk6^93!#+<;ws7007{zS3k2k9-zZKFO~(k`>s0y006+1 zgF_jyIhsL-`FMf~JL~C=cV75(CrJ|q;MVO961G=O zm9d)YpJg5g(4i_HKL75eSE}mq$Y}r}hyVdcV~p>6a}oXr80q`oj%+s700000NkvXX Hu0mjfPs|!l literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/page_white_text.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/page_white_text.png new file mode 100644 index 0000000000000000000000000000000000000000..813f712f726c935f9adf8d2f2dd0d7683791ef11 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%6;pyTSA|c6o&@eC9QG)Hj&ExYL zO&oVL^)+cM^qd@ApywS>pwx0H@RDN}hq;7mU-SKczYQ-hnrr=;iDAQMZQ+*g=YOM= z!QlMQEn7FbaD->uKAYgo_j9)W&$$zS*W9}m(ey0q$&7l-XEWO0Y(9M=SnhLbwy;d>@~SY$Ku*0xPvIOQeV1x7u_z-2-X>_74(yfh7C znXL|3GZ+d2`3re2hs?MKC#5QQ<|d}62BjvZR2H60wE-$R?&;zfqH(@;q9b3Efq-lM(nr^( z=EYR73-9e)UYMWsXy%?aZsD68Yyv^2$~6QgEcljw%kx>O(f-gQ?@fOOx3A-0+Qw?O zRx~W)kn~Qe2d6f9nMG#g9Q04Mk==M~N!Dglvxk!fgVh#w@ZV$IY1+Xc`d{d2UcaP~ zfWp)_Ivqj}l2SPy^9ZWy6rG9Yx4v67_uA&&9|XA~5-#3)W3%em1peD8RWH^#O%XoM zxMPud%}GTj#~*+7JMxTd!`{^Q+>(D3*|@KV`*G2;{QnANOxu1$r2xIe;OXk;vd$@? F2>@zac~<}c literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/plugin.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..6187b15aec001b7080b51a5f944f07591f26cc15 GIT binary patch literal 591 zcmV-V0eEcNHZMNv|IbJ-M`( zKwWL~opzjJe^WpCmV9E;(0&ut2;4va_(#>M8)>9$R5viQnf(Nkh~VM$y>J(jqb$cj z+nL1Nm|mV)Gm|9MnHf*7Ja4OEAQz__^LRKOLEwqpiGV^^A*T=#&inGm-62Xs;dnSp zKj&H9T*boh2i)W+(n27l!C)>fq|L%VB1i ziC4p;NwV_}ZjW7$LRW#(_bKF#hp=!IqNO26Z*w2+LEwx{PVnZ&Sn}T;mtzb$;qA*nT@@+ zV5uQ@iXDTPoTbV#FRr~z04|PPh`wXTNoCm9*tG&?e3+fYl>K6+&3|Cc$KOpL`ER+_ dcRl5U#9zn6ZO}GFk7R5;7c zlif>`Q5?tj7Yw@ZCMtTF^Q|ZedeJhM%QPCR*bs8V79p$QTo7e94yQNXRs-{0?hOn_-8n0AMO@u1Ts zNl8QzJs1#rz%RBt?ux>l+amAvh+J!{$lkaqv}+Erb-6j2xp>K4GLQnNB*W`hFg*?P z^AL@~(h~Z+wfcWEXHqV^Tq-#z$7Y#o0;yFxA!00F}F2dX# zjE$iOgT#G4*1TR6kB1Gnn@>$meCh2a>c5YuIvFn-R2W@>4@M*m@-|jiDV?b)bccgA zyPfsMM!rjy>+1O2)5Eg29Z_*2p&qGnmS!OH?vZ(4>QB01d>j%9n4QINxkyT(Dos?I zjaWF$*IQmh`SF-?xU%xMEfjq1=6qY*g&lgG_cXv$BGoIWyfO5 zp>pdV*O+y=&6@N2WWFo(%RtT`Q(H^6zn^a%epE~Kx^mEJ{c8`luC$nc*z9j|4Ms8aJK-ladKLpnAK z!yd|CC&>l1b7`m$MH$ScEIP@XgT41O>|DzL{-38CH68OyX#u=G?d7;y&_o&o)f@3U z2(tr%Ok88caOL`xiQA8o;Vzr-$A$SOu6o|$&0DQAJ1Z7?OACaeoy+)PWu&~aueW<| z*KW^(^2}#30u*~<_mXScFNd6U&sxh5*GGMNytZGxkIGqL%v6329^u`FD6T?b?K!4B z@Hzh?O2Au=((Gu;rvgLMt^pS|u1rEkBgC8$oH%zgT`TvZiK#VDrVG?-i~6a_+WZb> zc1>>lb)xcuo^Cl8k%q3c_d*It_Vtj>RSovF&w;hS=6uYrT2e@-@l@P~uBN`zu!v>e zTm(is&jcQ6vuP?|;!e+(n8w)-Xjd!hwk@r2D0i00ygdKo2Xvs?&w_lajj5DHS@9I! z;_&ji2e{!uusGnVn};Pu|dl5x-FhQyC8^-4Uo_;BLiOXzcE z&4PS2TBWSC=hsw0og;z#(mly@Ed2E1E$_VDaM?kloE4ob2XK&K;OS~-nhIGlA4~UZrJu6*|}wi#TT?|yWUH+_&n($t0xta zBwTzSfE)uAw*L0>+`pTps}L-$jIP5Q_E$Am+l|{XfsKr0Vi~`Em?SJQ#0y)8vsxb1 zMdxJl^){_CDwI^}>)Pw${G?Ajc@P}x{Fvhoi0jbY^427?KPmoA_G)sqK}u$2(79Xg zC%}xm5JDcrsm5^vQEQpGEdJDc^yfuNAlqV1pZQVkOSceV<|{=|=@?=o4i_1RFUZth zC7cu<6%V3dVCI}P6DL4iUgTc@&(nXY)ox}HZ z(a#EgiNj%{kjRLL2t?{m_aKN`{5-&u+HAtQ-Qq#@!I@<(M+B3i@|g=LY6 z90tpW!JuMn_Lcy1q7g&LUSuLE3XS}K#P^nHVUmL`L)dbP| z0bt(+Cp#M-bH!LM*DzJ0Lfn;eTBV@|JvGSgpdoc1RhhV>(G-2(vE|>MrVgA9+?+0m4OzUqbT>-U-jg|v zLZMntq`r?fy1UCMh>z2Koi1SL-~N2ZrIf+dZW|;SWszsde}Dl!HOMc1Fa>K9)e&RI z)A?aK zcviCdKDUg_%#u7YAE`A`Y3$(P4&m^@fEWAvjAwVmRWeUnmkrxA;E!fKoc{9Vi=lvFL}KmoS;g* zdjL?Y!VHUFq63aLj6VZE+tHts?Z1pFkiO9^k*5pGpFpU&5#5G4ATd{t>a&9zKBVB9=Ns^HFU|DTGH8C+Xr2UqOU`Zxe)!|%j4=-QojGePq)pRGe;!f)Czk!u3vP_Jxu8(e6 zf4Q`F$Qio2Jw@N*E@k?c`+Sw}AYQjkT+x)OAe6eq(AT!iRuksKQn%Ao_Ac1T-p#Js I_CnHs0qX}mlmGw# literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/tag_green.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/tag_green.png new file mode 100644 index 0000000000000000000000000000000000000000..83ec984bd73364134da0f98d27a800c5d3264180 GIT binary patch literal 613 zcmV-r0-F7aP)^5T)AZ%#@G{_P{NCN^P z(J0zvSn~SSm(Ur);-M~8^*;61*VRI`T1BN&LAhK;sZ>I-SVW;vfUfJv=ko^ugnc0x zhJodBxe>iyk3%w<%wC8holUJ4(iv>tL{`DQt zPOsyUbO_Cmc&*iHkqbm3ku`|GcC^OhF>jj9W*GkH;^g!iUVpib_h*=@udp4h(P+e*zL_~ZmJjh(y^BxULwq>9zXoYE8sq{#pN~U0C6!8vY)5N2 z9P*}mw}7X$O^qTtJef1ACWvJT9^wt-)Zh0r~j#0bT`f;-zv6 z^Tmw22!%rMcs!TaUX<-8s;X-B`+Xbo+_uWuFa z1yIPc?DTrQ7KvRhmt*TG|L=EYQ=LqFX;=Lp`4}jx6BE-@00000NkvXXu0mjf=s_29 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/transparent.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..d665e179efd797451084235f105425247fea0a14 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;bAV5X>;M1%mmiTn0pv241o;Is pI6S+N2ITN~x;Tb#$R;N!@B(=T42&&nK2`x)44$rjF6*2UngG277DE64 literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/wrench.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/wrench.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8213fef5ab969f03189d4367e32e597e38bd7f GIT binary patch literal 610 zcmV-o0-gPdP)^jb z4`0v}DG1te)wmeb(>p90leRz?_mO+^JKy=v&2<29Od6?F%9%(c8los#f*@G`-%W&* z$)uBj2i@u-@SgX}gtyWPe6d*|w6h%R? zScK2#Yn%$sum0cy>90DmY*i{1XqpClEtktsRTZ)lCUe z<FogV^*tm>8*AlX za4oiR!&85LrobG57qUHUX#{>Vz(RHpB5|@>9O6N$jqB8>%($0wxE5R3)b>Y~xtCo$ zCgEk&A?_#IxHdN)9tqre^o{ho4{?hmPuf@^@I3-wncaRd%|~O3xbrKY=&TiwPYkJroM{;WUQTuMY8vpg}f4o)2%U3C;eEDoiEh?94d(rV57VIF#8VqzW$HrDC|#U`x@QDbgi zVl)t9GGz&YY#D?gc%>hISA+_EBpnXt#pnC`p6@xw0$8TCbULjhlgVx(kuc)%xbgqq zR5+DNDFRN0!y)7Gm}oT0i39}h4h928qY?Rho^UvPGJ#kuW|-Amtrn`Pmd&+bFo@sp z$LI4IQw7BG?|#2ewOS<<3VjL$0=lMY^m;wqZujv5kx1l%Sl;V&Iy4#$ip3&@LV2!7vhhN=PCz%^9v24`qb(+m4W?!q-&~=?ssf5GfnAmJKV;3bvpDm0(NhahZ=&^sqo6Odj6>)Dq_3p~4~ zvb`d3Mydwjt&Df^hVmLtI2x=U&h9(JVYX-!y~z3zi;1>=LY;o(bL$(Yf$lf)dMf0-u^0HrpTG Wk@)HE*94aU0000m+BBgry{~j2fHLegbHP( zrgXNbr0}2;^nywdjLjZe?uxtrd3D(pZH@fFFc0{BW_~jxoO1w7-VX;6vK@ROA$$R6 zEmo;Ht-Mj|>5jUy{bQ^V5@53LRI8AgLpUm|m+15sqcz@QtVSo|oz7ArM8?pIn+>gN z0b=4_b5O|4A*;Q+vc9Vqr~%3V155*NV~@gTz}KSUiKB-uJzjMZ>5%Q#n24H!V{ zTY(LLAE*NAHZ}C#wnj%Bw5OFIkRhkkAW#kDC3j9Wm0YXRaXlyyp>#mVfYG)eC;@ab zDb=T-BCAY4LI(Z@GOTr2V_A{pRwSmz+8Be>CjAw(=gnbVWAeguvZa93JmL(EDxv1m z0OP4q=fpAK1Mq!C2`OkEn37o;m#wF#(t(8Pu#S?2f#x<~4EO{@fmm`p9veD6RZ_jp z@Au4};q&`XuKEYgIiB4((kgxOs#YdqJw0fY>9^K_agEu5+$#k;w#%I2N>n_?)YIqu z`tq&#_^p?-%K*U0^}|7+9U(&k0?s;=r=uCZ%)H9_edH8wK}gB(nUB1FFk+2Ol%BXV zHoFY`D~2x|2 +<%= render '_sidebar_toggle.rhtml' %> + +

+ +
+<%- if @main_page %> + <%= @main_page.description %> +<%- else -%> +

This is the API documentation for <%= h @title %>. +<%- end -%> +

diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/js/darkfish.js b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/js/darkfish.js new file mode 100644 index 0000000..4c15efd --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/js/darkfish.js @@ -0,0 +1,120 @@ +/** + * + * Darkfish Page Functions + * $Id: darkfish.js 53 2009-01-07 02:52:03Z deveiant $ + * + * Author: Michael Granger + * + */ + +/* Provide console simulation for firebug-less environments */ +/* +if (!("console" in window) || !("firebug" in console)) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", + "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; + + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +}; +*/ + + +function showSource( e ) { + var target = e.target; + while (!target.classList.contains('method-detail')) { + target = target.parentNode; + } + if (typeof target !== "undefined" && target !== null) { + target = target.querySelector('.method-source-code'); + } + if (typeof target !== "undefined" && target !== null) { + target.classList.toggle('active-menu') + } +}; + +function hookSourceViews() { + document.querySelectorAll('.method-source-toggle').forEach(function (codeObject) { + codeObject.addEventListener('click', showSource); + }); +}; + +function hookSearch() { + var input = document.querySelector('#search-field'); + var result = document.querySelector('#search-results'); + result.classList.remove("initially-hidden"); + + var search_section = document.querySelector('#search-section'); + search_section.classList.remove("initially-hidden"); + + var search = new Search(search_data, input, result); + + search.renderItem = function(result) { + var li = document.createElement('li'); + var html = ''; + + // TODO add relative path to " + @output.puts "" + @output.puts "" + @output.puts "" + @output.puts "" + @output.puts "" + end + + def flush + @output.flush + end + + def move_progress(percent_done) + @output.puts " " + @output.flush + end + + def make_header_red + @output.puts " " + end + + def make_header_yellow + @output.puts " " + end + + def make_example_group_header_red(group_id) + @output.puts " " + @output.puts " " + end + + def make_example_group_header_yellow(group_id) + @output.puts " " + @output.puts " " + end + + private + + def indentation_style(number_of_parents) + "style=\"margin-left: #{(number_of_parents - 1) * 15}px;\"" + end + + REPORT_HEADER = <<-EOF +
+ +
+
+

RSpec Code Examples

+
+ +
+ + + +
+ +
+

 

+

 

+
+
+ + +
+EOF + + GLOBAL_SCRIPTS = <<-EOF + +function addClass(element_id, classname) { + document.getElementById(element_id).className += (" " + classname); +} + +function removeClass(element_id, classname) { + var elem = document.getElementById(element_id); + var classlist = elem.className.replace(classname,''); + elem.className = classlist; +} + +function moveProgressBar(percentDone) { + document.getElementById("rspec-header").style.width = percentDone +"%"; +} + +function makeRed(element_id) { + removeClass(element_id, 'passed'); + removeClass(element_id, 'not_implemented'); + addClass(element_id,'failed'); +} + +function makeYellow(element_id) { + var elem = document.getElementById(element_id); + if (elem.className.indexOf("failed") == -1) { // class doesn't includes failed + if (elem.className.indexOf("not_implemented") == -1) { // class doesn't include not_implemented + removeClass(element_id, 'passed'); + addClass(element_id,'not_implemented'); + } + } +} + +function apply_filters() { + var passed_filter = document.getElementById('passed_checkbox').checked; + var failed_filter = document.getElementById('failed_checkbox').checked; + var pending_filter = document.getElementById('pending_checkbox').checked; + + assign_display_style("example passed", passed_filter); + assign_display_style("example failed", failed_filter); + assign_display_style("example not_implemented", pending_filter); + + assign_display_style_for_group("example_group passed", passed_filter); + assign_display_style_for_group("example_group not_implemented", pending_filter, pending_filter || passed_filter); + assign_display_style_for_group("example_group failed", failed_filter, failed_filter || pending_filter || passed_filter); +} + +function get_display_style(display_flag) { + var style_mode = 'none'; + if (display_flag == true) { + style_mode = 'block'; + } + return style_mode; +} + +function assign_display_style(classname, display_flag) { + var style_mode = get_display_style(display_flag); + var elems = document.getElementsByClassName(classname) + for (var i=0; i + + + RSpec results + + + + + + + + +EOF + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/html_snippet_extractor.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/html_snippet_extractor.rb new file mode 100644 index 0000000..992704b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/html_snippet_extractor.rb @@ -0,0 +1,122 @@ +module RSpec + module Core + module Formatters + # @api private + # + # Extracts code snippets by looking at the backtrace of the passed error + # and applies synax highlighting and line numbers using html. + class HtmlSnippetExtractor + # @private + module NullConverter + def self.convert(code) + %Q(#{code}\n# Install the coderay gem to get syntax highlighting) + end + end + + # @private + module CoderayConverter + def self.convert(code) + CodeRay.scan(code, :ruby).html(:line_numbers => false) + end + end + + # rubocop:disable Style/ClassVars + # @private + @@converter = NullConverter + + begin + require 'coderay' + RSpec::Support.require_rspec_core 'formatters/syntax_highlighter' + RSpec::Core::Formatters::SyntaxHighlighter.attempt_to_add_rspec_terms_to_coderay_keywords + @@converter = CoderayConverter + # rubocop:disable Lint/HandleExceptions + rescue LoadError + # it'll fall back to the NullConverter assigned above + # rubocop:enable Lint/HandleExceptions + end + + # rubocop:enable Style/ClassVars + + # @api private + # + # Extract lines of code corresponding to a backtrace. + # + # @param backtrace [String] the backtrace from a test failure + # @return [String] highlighted code snippet indicating where the test + # failure occurred + # + # @see #post_process + def snippet(backtrace) + raw_code, line = snippet_for(backtrace[0]) + highlighted = @@converter.convert(raw_code) + post_process(highlighted, line) + end + # rubocop:enable Style/ClassVars + + # @api private + # + # Create a snippet from a line of code. + # + # @param error_line [String] file name with line number (i.e. + # 'foo_spec.rb:12') + # @return [String] lines around the target line within the file + # + # @see #lines_around + def snippet_for(error_line) + if error_line =~ /(.*):(\d+)/ + file = Regexp.last_match[1] + line = Regexp.last_match[2].to_i + [lines_around(file, line), line] + else + ["# Couldn't get snippet for #{error_line}", 1] + end + end + + # @api private + # + # Extract lines of code centered around a particular line within a + # source file. + # + # @param file [String] filename + # @param line [Fixnum] line number + # @return [String] lines around the target line within the file (2 above + # and 1 below). + def lines_around(file, line) + if File.file?(file) + lines = File.read(file).split("\n") + min = [0, line - 3].max + max = [line + 1, lines.length - 1].min + selected_lines = [] + selected_lines.join("\n") + lines[min..max].join("\n") + else + "# Couldn't get snippet for #{file}" + end + rescue SecurityError + # :nocov: - SecurityError is no longer produced starting in ruby 2.7 + "# Couldn't get snippet for #{file}" + # :nocov: + end + + # @api private + # + # Adds line numbers to all lines and highlights the line where the + # failure occurred using html `span` tags. + # + # @param highlighted [String] syntax-highlighted snippet surrounding the + # offending line of code + # @param offending_line [Fixnum] line where failure occurred + # @return [String] completed snippet + def post_process(highlighted, offending_line) + new_lines = [] + highlighted.split("\n").each_with_index do |line, i| + new_line = "#{offending_line + i - 2}#{line}" + new_line = "#{new_line}" if i == 2 + new_lines << new_line + end + new_lines.join("\n") + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/json_formatter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/json_formatter.rb new file mode 100644 index 0000000..7c6fde8 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/json_formatter.rb @@ -0,0 +1,103 @@ +RSpec::Support.require_rspec_core "formatters/base_formatter" +require 'json' + +module RSpec + module Core + module Formatters + # @private + class JsonFormatter < BaseFormatter + Formatters.register self, :message, :dump_summary, :dump_profile, :stop, :seed, :close + + attr_reader :output_hash + + def initialize(output) + super + @output_hash = { + :version => RSpec::Core::Version::STRING + } + end + + def message(notification) + (@output_hash[:messages] ||= []) << notification.message + end + + def dump_summary(summary) + @output_hash[:summary] = { + :duration => summary.duration, + :example_count => summary.example_count, + :failure_count => summary.failure_count, + :pending_count => summary.pending_count, + :errors_outside_of_examples_count => summary.errors_outside_of_examples_count + } + @output_hash[:summary_line] = summary.totals_line + end + + def stop(group_notification) + @output_hash[:examples] = group_notification.notifications.map do |notification| + format_example(notification.example).tap do |hash| + e = notification.example.exception + + if e + hash[:exception] = { + :class => e.class.name, + :message => e.message, + :backtrace => notification.formatted_backtrace, + } + end + end + end + end + + def seed(notification) + return unless notification.seed_used? + @output_hash[:seed] = notification.seed + end + + def close(_notification) + output.write @output_hash.to_json + end + + def dump_profile(profile) + @output_hash[:profile] = {} + dump_profile_slowest_examples(profile) + dump_profile_slowest_example_groups(profile) + end + + # @api private + def dump_profile_slowest_examples(profile) + @output_hash[:profile] = {} + @output_hash[:profile][:examples] = profile.slowest_examples.map do |example| + format_example(example).tap do |hash| + hash[:run_time] = example.execution_result.run_time + end + end + @output_hash[:profile][:slowest] = profile.slow_duration + @output_hash[:profile][:total] = profile.duration + end + + # @api private + def dump_profile_slowest_example_groups(profile) + @output_hash[:profile] ||= {} + @output_hash[:profile][:groups] = profile.slowest_groups.map do |loc, hash| + hash.update(:location => loc) + end + end + + private + + def format_example(example) + { + :id => example.id, + :description => example.description, + :full_description => example.full_description, + :status => example.execution_result.status.to_s, + :file_path => example.metadata[:file_path], + :line_number => example.metadata[:line_number], + :run_time => example.execution_result.run_time, + :pending_message => example.execution_result.pending_message, + } + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/profile_formatter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/profile_formatter.rb new file mode 100644 index 0000000..4b95d93 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/profile_formatter.rb @@ -0,0 +1,68 @@ +RSpec::Support.require_rspec_core "formatters/console_codes" + +module RSpec + module Core + module Formatters + # @api private + # Formatter for providing profile output. + class ProfileFormatter + Formatters.register self, :dump_profile + + def initialize(output) + @output = output + end + + # @private + attr_reader :output + + # @api public + # + # This method is invoked after the dumping the summary if profiling is + # enabled. + # + # @param profile [ProfileNotification] containing duration, + # slowest_examples and slowest_example_groups + def dump_profile(profile) + dump_profile_slowest_examples(profile) + dump_profile_slowest_example_groups(profile) + end + + private + + def dump_profile_slowest_examples(profile) + @output.puts "\nTop #{profile.slowest_examples.size} slowest " \ + "examples (#{Helpers.format_seconds(profile.slow_duration)} " \ + "seconds, #{profile.percentage}% of total time):\n" + + profile.slowest_examples.each do |example| + @output.puts " #{example.full_description}" + @output.puts " #{bold(Helpers.format_seconds(example.execution_result.run_time))} " \ + "#{bold("seconds")} #{format_caller(example.location)}" + end + end + + def dump_profile_slowest_example_groups(profile) + return if profile.slowest_groups.empty? + + @output.puts "\nTop #{profile.slowest_groups.size} slowest example groups:" + profile.slowest_groups.each do |loc, hash| + average = "#{bold(Helpers.format_seconds(hash[:average]))} #{bold("seconds")} average" + total = "#{Helpers.format_seconds(hash[:total_time])} seconds" + count = Helpers.pluralize(hash[:count], "example") + @output.puts " #{hash[:description]}" + @output.puts " #{average} (#{total} / #{count}) #{loc}" + end + end + + def format_caller(caller_info) + RSpec.configuration.backtrace_formatter.backtrace_line( + caller_info.to_s.split(':in `block').first) + end + + def bold(text) + ConsoleCodes.wrap(text, :bold) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/progress_formatter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/progress_formatter.rb new file mode 100644 index 0000000..81e0beb --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/progress_formatter.rb @@ -0,0 +1,29 @@ +RSpec::Support.require_rspec_core "formatters/base_text_formatter" +RSpec::Support.require_rspec_core "formatters/console_codes" + +module RSpec + module Core + module Formatters + # @private + class ProgressFormatter < BaseTextFormatter + Formatters.register self, :example_passed, :example_pending, :example_failed, :start_dump + + def example_passed(_notification) + output.print ConsoleCodes.wrap('.', :success) + end + + def example_pending(_notification) + output.print ConsoleCodes.wrap('*', :pending) + end + + def example_failed(_notification) + output.print ConsoleCodes.wrap('F', :failure) + end + + def start_dump(_notification) + output.puts + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/protocol.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/protocol.rb new file mode 100644 index 0000000..12fc71f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/protocol.rb @@ -0,0 +1,182 @@ +module RSpec + module Core + module Formatters + # This class isn't loaded at runtime but serves to document all of the + # notifications implemented as part of the standard interface. The + # reporter will issue these during a normal test suite run, but a + # formatter will only receive those notifications it has registered + # itself to receive. To register a formatter call: + # + # `::RSpec::Core::Formatters.register class, :list, :of, :notifications` + # + # e.g. + # + # `::RSpec::Core::Formatters.register self, :start, :example_started` + # + # @see RSpec::Core::Formatters::BaseFormatter + # @see RSpec::Core::Formatters::BaseTextFormatter + # @see RSpec::Core::Reporter + class Protocol + # @method initialize(output) + # @api public + # + # @param output [IO] the formatter output + + # @method start(notification) + # @api public + # @group Suite Notifications + # + # This method is invoked before any examples are run, right after + # they have all been collected. This can be useful for special + # formatters that need to provide progress on feedback (graphical ones). + # + # This will only be invoked once, and the next one to be invoked + # is {#example_group_started}. + # + # @param notification [Notifications::StartNotification] + + # @method example_group_started(notification) + # @api public + # @group Group Notifications + # + # This method is invoked at the beginning of the execution of each + # example group. + # + # The next method to be invoked after this is {#example_passed}, + # {#example_pending}, or {#example_group_finished}. + # + # @param notification [Notifications::GroupNotification] containing example_group + # subclass of {ExampleGroup} + + # @method example_group_finished(notification) + # @api public + # @group Group Notifications + # + # Invoked at the end of the execution of each example group. + # + # @param notification [Notifications::GroupNotification] containing example_group + # subclass of {ExampleGroup} + + # @method example_started(notification) + # @api public + # @group Example Notifications + # + # Invoked at the beginning of the execution of each example. + # + # @param notification [Notifications::ExampleNotification] containing example subclass + # of {Example} + + # @method example_finished(notification) + # @api public + # @group Example Notifications + # + # Invoked at the end of the execution of each example. + # + # @param notification [Notifications::ExampleNotification] containing example subclass + # of {Example} + + # @method example_passed(notification) + # @api public + # @group Example Notifications + # + # Invoked when an example passes. + # + # @param notification [Notifications::ExampleNotification] containing example subclass + # of {Example} + + # @method example_pending(notification) + # @api public + # @group Example Notifications + # + # Invoked when an example is pending. + # + # @param notification [Notifications::ExampleNotification] containing example subclass + # of {Example} + + # @method example_failed(notification) + # @api public + # @group Example Notifications + # + # Invoked when an example fails. + # + # @param notification [Notifications::ExampleNotification] containing example subclass + # of {Example} + + # @method message(notification) + # @api public + # @group Suite Notifications + # + # Used by the reporter to send messages to the output stream. + # + # @param notification [Notifications::MessageNotification] containing message + + # @method stop(notification) + # @api public + # @group Suite Notifications + # + # Invoked after all examples have executed, before dumping post-run + # reports. + # + # @param notification [Notifications::NullNotification] + + # @method start_dump(notification) + # @api public + # @group Suite Notifications + # + # This method is invoked after all of the examples have executed. The + # next method to be invoked after this one is {#dump_failures} + # (BaseTextFormatter then calls {#dump_failures} once for each failed + # example). + # + # @param notification [Notifications::NullNotification] + + # @method dump_failures(notification) + # @api public + # @group Suite Notifications + # + # Dumps detailed information about each example failure. + # + # @param notification [Notifications::NullNotification] + + # @method dump_summary(summary) + # @api public + # @group Suite Notifications + # + # This method is invoked after the dumping of examples and failures. + # Each parameter is assigned to a corresponding attribute. + # + # @param summary [Notifications::SummaryNotification] containing duration, + # example_count, failure_count and pending_count + + # @method dump_profile(profile) + # @api public + # @group Suite Notifications + # + # This method is invoked after the dumping the summary if profiling is + # enabled. + # + # @param profile [Notifications::ProfileNotification] containing duration, + # slowest_examples and slowest_example_groups + + # @method dump_pending(notification) + # @api public + # @group Suite Notifications + # + # Outputs a report of pending examples. This gets invoked + # after the summary if option is set to do so. + # + # @param notification [Notifications::NullNotification] + + # @method close(notification) + # @api public + # @group Suite Notifications + # + # Invoked at the end of a suite run. Allows the formatter to do any + # tidying up, but be aware that formatter output streams may be used + # elsewhere so don't actually close them. + # + # @param notification [Notifications::NullNotification] + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/snippet_extractor.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/snippet_extractor.rb new file mode 100644 index 0000000..c585db4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/snippet_extractor.rb @@ -0,0 +1,134 @@ +module RSpec + module Core + module Formatters + # @private + class SnippetExtractor + NoSuchFileError = Class.new(StandardError) + NoSuchLineError = Class.new(StandardError) + + def self.extract_line_at(file_path, line_number) + source = source_from_file(file_path) + line = source.lines[line_number - 1] + raise NoSuchLineError unless line + line + end + + def self.source_from_file(path) + raise NoSuchFileError unless File.exist?(path) + RSpec.world.source_from_file(path) + end + + if RSpec::Support::RubyFeatures.ripper_supported? + NoExpressionAtLineError = Class.new(StandardError) + + attr_reader :source, :beginning_line_number, :max_line_count + + def self.extract_expression_lines_at(file_path, beginning_line_number, max_line_count=nil) + if max_line_count == 1 + [extract_line_at(file_path, beginning_line_number)] + else + source = source_from_file(file_path) + new(source, beginning_line_number, max_line_count).expression_lines + end + end + + def initialize(source, beginning_line_number, max_line_count=nil) + @source = source + @beginning_line_number = beginning_line_number + @max_line_count = max_line_count + end + + def expression_lines + line_range = line_range_of_expression + + if max_line_count && line_range.count > max_line_count + line_range = (line_range.begin)..(line_range.begin + max_line_count - 1) + end + + source.lines[(line_range.begin - 1)..(line_range.end - 1)] + rescue SyntaxError, NoExpressionAtLineError + [self.class.extract_line_at(source.path, beginning_line_number)] + end + + private + + def line_range_of_expression + @line_range_of_expression ||= begin + line_range = line_range_of_location_nodes_in_expression + initial_unclosed_tokens = unclosed_tokens_in_line_range(line_range) + unclosed_tokens = initial_unclosed_tokens + + until (initial_unclosed_tokens & unclosed_tokens).empty? + line_range = (line_range.begin)..(line_range.end + 1) + unclosed_tokens = unclosed_tokens_in_line_range(line_range) + end + + line_range + end + end + + def unclosed_tokens_in_line_range(line_range) + tokens = FlatMap.flat_map(line_range) do |line_number| + source.tokens_by_line_number[line_number] + end + + tokens.each_with_object([]) do |token, unclosed_tokens| + if token.opening? + unclosed_tokens << token + else + index = unclosed_tokens.rindex do |unclosed_token| + unclosed_token.closed_by?(token) + end + unclosed_tokens.delete_at(index) if index + end + end + end + + def line_range_of_location_nodes_in_expression + line_numbers = expression_node.each_with_object(Set.new) do |node, set| + set << node.location.line if node.location + end + + line_numbers.min..line_numbers.max + end + + def expression_node + raise NoExpressionAtLineError if location_nodes_at_beginning_line.empty? + + @expression_node ||= begin + common_ancestor_nodes = location_nodes_at_beginning_line.map do |node| + node.each_ancestor.to_a + end.reduce(:&) + + common_ancestor_nodes.find { |node| expression_outmost_node?(node) } + end + end + + def expression_outmost_node?(node) + return true unless node.parent + return false if node.type.to_s.start_with?('@') + ![node, node.parent].all? do |n| + # See `Ripper::PARSER_EVENTS` for the complete list of sexp types. + type = n.type.to_s + type.end_with?('call') || type.start_with?('method_add_') + end + end + + def location_nodes_at_beginning_line + source.nodes_by_line_number[beginning_line_number] + end + else + # :nocov: + def self.extract_expression_lines_at(file_path, beginning_line_number, *) + [extract_line_at(file_path, beginning_line_number)] + end + # :nocov: + end + + def self.least_indentation_from(lines) + lines.map { |line| line[/^[ \t]*/] }.min + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/syntax_highlighter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/syntax_highlighter.rb new file mode 100644 index 0000000..e7766f6 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/syntax_highlighter.rb @@ -0,0 +1,91 @@ +module RSpec + module Core + module Formatters + # @private + # Provides terminal syntax highlighting of code snippets + # when coderay is available. + class SyntaxHighlighter + def initialize(configuration) + @configuration = configuration + end + + def highlight(lines) + implementation.highlight_syntax(lines) + end + + # rubocop:disable Lint/RescueException + # rubocop:disable Lint/HandleExceptions + def self.attempt_to_add_rspec_terms_to_coderay_keywords + CodeRay::Scanners::Ruby::Patterns::IDENT_KIND.add(%w[ + describe context + it specify + before after around + let subject + expect allow + ], :keyword) + rescue Exception + # Mutating CodeRay's contants like this is not a public API + # and might not always work. If we cannot add our keywords + # to CodeRay it is not a big deal and not worth raising an + # error over, so we ignore it. + end + # rubocop:enable Lint/HandleExceptions + # rubocop:enable Lint/RescueException + + private + + if RSpec::Support::OS.windows? + # :nocov: + def implementation + WindowsImplementation + end + # :nocov: + else + def implementation + return color_enabled_implementation if @configuration.color_enabled? + NoSyntaxHighlightingImplementation + end + end + + def color_enabled_implementation + @color_enabled_implementation ||= begin + require 'coderay' + self.class.attempt_to_add_rspec_terms_to_coderay_keywords + CodeRayImplementation + rescue LoadError + NoSyntaxHighlightingImplementation + end + end + + # @private + module CodeRayImplementation + RESET_CODE = "\e[0m" + + def self.highlight_syntax(lines) + highlighted = begin + CodeRay.encode(lines.join("\n"), :ruby, :terminal) + rescue Support::AllExceptionsExceptOnesWeMustNotRescue + return lines + end + + highlighted.split("\n").map do |line| + line.sub(/\S/) { |char| char.insert(0, RESET_CODE) } + end + end + end + + # @private + module NoSyntaxHighlightingImplementation + def self.highlight_syntax(lines) + lines + end + end + + # @private + # Not sure why, but our code above (and/or coderay itself) does not work + # on Windows, so we disable the feature on Windows. + WindowsImplementation = NoSyntaxHighlightingImplementation + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/hooks.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/hooks.rb new file mode 100644 index 0000000..2935a73 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/hooks.rb @@ -0,0 +1,646 @@ +module RSpec + module Core + # Provides `before`, `after` and `around` hooks as a means of + # supporting common setup and teardown. This module is extended + # onto {ExampleGroup}, making the methods available from any `describe` + # or `context` block and included in {Configuration}, making them + # available off of the configuration object to define global setup + # or teardown logic. + module Hooks + # @api public + # + # @overload before(&block) + # @overload before(scope, &block) + # @param scope [Symbol] `:example`, `:context`, or `:suite` + # (defaults to `:example`) + # @overload before(scope, *conditions, &block) + # @param scope [Symbol] `:example`, `:context`, or `:suite` + # (defaults to `:example`) + # @param conditions [Array, Hash] constrains this hook to + # examples matching these conditions e.g. + # `before(:example, :ui => true) { ... }` will only run with examples + # or groups declared with `:ui => true`. Symbols will be transformed + # into hash entries with `true` values. + # @overload before(conditions, &block) + # @param conditions [Hash] + # constrains this hook to examples matching these conditions e.g. + # `before(:example, :ui => true) { ... }` will only run with examples + # or groups declared with `:ui => true`. + # + # @see #after + # @see #around + # @see ExampleGroup + # @see SharedContext + # @see SharedExampleGroup + # @see Configuration + # + # Declare a block of code to be run before each example (using `:example`) + # or once before any example (using `:context`). These are usually + # declared directly in the {ExampleGroup} to which they apply, but they + # can also be shared across multiple groups. + # + # You can also use `before(:suite)` to run a block of code before any + # example groups are run. This should be declared in {RSpec.configure}. + # + # Instance variables declared in `before(:example)` or `before(:context)` + # are accessible within each example. + # + # ### Order + # + # `before` hooks are stored in three scopes, which are run in order: + # `:suite`, `:context`, and `:example`. They can also be declared in + # several different places: `RSpec.configure`, a parent group, the current + # group. They are run in the following order: + # + # before(:suite) # Declared in RSpec.configure. + # before(:context) # Declared in RSpec.configure. + # before(:context) # Declared in a parent group. + # before(:context) # Declared in the current group. + # before(:example) # Declared in RSpec.configure. + # before(:example) # Declared in a parent group. + # before(:example) # Declared in the current group. + # + # If more than one `before` is declared within any one example group, they + # are run in the order in which they are declared. Any `around` hooks will + # execute after `before` context hooks but before any `before` example + # hook regardless of where they are declared. + # + # ### Conditions + # + # When you add a conditions hash to `before(:example)` or + # `before(:context)`, RSpec will only apply that hook to groups or + # examples that match the conditions. e.g. + # + # RSpec.configure do |config| + # config.before(:example, :authorized => true) do + # log_in_as :authorized_user + # end + # end + # + # RSpec.describe Something, :authorized => true do + # # The before hook will run in before each example in this group. + # end + # + # RSpec.describe SomethingElse do + # it "does something", :authorized => true do + # # The before hook will run before this example. + # end + # + # it "does something else" do + # # The hook will not run before this example. + # end + # end + # + # Note that filtered config `:context` hooks can still be applied + # to individual examples that have matching metadata. Just like + # Ruby's object model is that every object has a singleton class + # which has only a single instance, RSpec's model is that every + # example has a singleton example group containing just the one + # example. + # + # ### Warning: `before(:suite, :with => :conditions)` + # + # The conditions hash is used to match against specific examples. Since + # `before(:suite)` is not run in relation to any specific example or + # group, conditions passed along with `:suite` are effectively ignored. + # + # ### Exceptions + # + # When an exception is raised in a `before` block, RSpec skips any + # subsequent `before` blocks and the example, but runs all of the + # `after(:example)` and `after(:context)` hooks. + # + # ### Warning: implicit before blocks + # + # `before` hooks can also be declared in shared contexts which get + # included implicitly either by you or by extension libraries. Since + # RSpec runs these in the order in which they are declared within each + # scope, load order matters, and can lead to confusing results when one + # before block depends on state that is prepared in another before block + # that gets run later. + # + # ### Warning: `before(:context)` + # + # It is very tempting to use `before(:context)` to speed things up, but we + # recommend that you avoid this as there are a number of gotchas, as well + # as things that simply don't work. + # + # #### Context + # + # `before(:context)` is run in an example that is generated to provide + # group context for the block. + # + # #### Instance variables + # + # Instance variables declared in `before(:context)` are shared across all + # the examples in the group. This means that each example can change the + # state of a shared object, resulting in an ordering dependency that can + # make it difficult to reason about failures. + # + # #### Unsupported RSpec constructs + # + # RSpec has several constructs that reset state between each example + # automatically. These are not intended for use from within + # `before(:context)`: + # + # * `let` declarations + # * `subject` declarations + # * Any mocking, stubbing or test double declaration + # + # ### other frameworks + # + # Mock object frameworks and database transaction managers (like + # ActiveRecord) are typically designed around the idea of setting up + # before an example, running that one example, and then tearing down. This + # means that mocks and stubs can (sometimes) be declared in + # `before(:context)`, but get torn down before the first real example is + # ever run. + # + # You _can_ create database-backed model objects in a `before(:context)` + # in rspec-rails, but it will not be wrapped in a transaction for you, so + # you are on your own to clean up in an `after(:context)` block. + # + # @example before(:example) declared in an {ExampleGroup} + # + # RSpec.describe Thing do + # before(:example) do + # @thing = Thing.new + # end + # + # it "does something" do + # # Here you can access @thing. + # end + # end + # + # @example before(:context) declared in an {ExampleGroup} + # + # RSpec.describe Parser do + # before(:context) do + # File.open(file_to_parse, 'w') do |f| + # f.write <<-CONTENT + # stuff in the file + # CONTENT + # end + # end + # + # it "parses the file" do + # Parser.parse(file_to_parse) + # end + # + # after(:context) do + # File.delete(file_to_parse) + # end + # end + # + # @note The `:example` and `:context` scopes are also available as + # `:each` and `:all`, respectively. Use whichever you prefer. + # @note The `:suite` scope is only supported for hooks registered on + # `RSpec.configuration` since they exist independently of any + # example or example group. + def before(*args, &block) + hooks.register :append, :before, *args, &block + end + + alias_method :append_before, :before + + # Adds `block` to the front of the list of `before` blocks in the same + # scope (`:example`, `:context`, or `:suite`). + # + # See {#before} for scoping semantics. + def prepend_before(*args, &block) + hooks.register :prepend, :before, *args, &block + end + + # @api public + # @overload after(&block) + # @overload after(scope, &block) + # @param scope [Symbol] `:example`, `:context`, or `:suite` (defaults to + # `:example`) + # @overload after(scope, *conditions, &block) + # @param scope [Symbol] `:example`, `:context`, or `:suite` (defaults to + # `:example`) + # @param conditions [Array, Hash] constrains this hook to + # examples matching these conditions e.g. + # `after(:example, :ui => true) { ... }` will only run with examples + # or groups declared with `:ui => true`. Symbols will be transformed + # into hash entries with `true` values. + # @overload after(conditions, &block) + # @param conditions [Hash] + # constrains this hook to examples matching these conditions e.g. + # `after(:example, :ui => true) { ... }` will only run with examples + # or groups declared with `:ui => true`. + # + # @see #before + # @see #around + # @see ExampleGroup + # @see SharedContext + # @see SharedExampleGroup + # @see Configuration + # + # Declare a block of code to be run after each example (using `:example`) + # or once after all examples n the context (using `:context`). See + # {#before} for more information about ordering. + # + # ### Exceptions + # + # `after` hooks are guaranteed to run even when there are exceptions in + # `before` hooks or examples. When an exception is raised in an after + # block, the exception is captured for later reporting, and subsequent + # `after` blocks are run. + # + # ### Order + # + # `after` hooks are stored in three scopes, which are run in order: + # `:example`, `:context`, and `:suite`. They can also be declared in + # several different places: `RSpec.configure`, a parent group, the current + # group. They are run in the following order: + # + # after(:example) # Declared in the current group. + # after(:example) # Declared in a parent group. + # after(:example) # Declared in RSpec.configure. + # after(:context) # Declared in the current group. + # after(:context) # Declared in a parent group. + # after(:context) # Declared in RSpec.configure. + # after(:suite) # Declared in RSpec.configure. + # + # This is the reverse of the order in which `before` hooks are run. + # Similarly, if more than one `after` is declared within any example + # group, they are run in reverse order of that in which they are declared. + # Also `around` hooks will run after any `after` example hooks are + # invoked but before any `after` context hooks. + # + # @note The `:example` and `:context` scopes are also available as + # `:each` and `:all`, respectively. Use whichever you prefer. + # @note The `:suite` scope is only supported for hooks registered on + # `RSpec.configuration` since they exist independently of any + # example or example group. + def after(*args, &block) + hooks.register :prepend, :after, *args, &block + end + + alias_method :prepend_after, :after + + # Adds `block` to the back of the list of `after` blocks in the same + # scope (`:example`, `:context`, or `:suite`). + # + # See {#after} for scoping semantics. + def append_after(*args, &block) + hooks.register :append, :after, *args, &block + end + + # @api public + # @overload around(&block) + # @overload around(scope, &block) + # @param scope [Symbol] `:example` (defaults to `:example`) + # present for syntax parity with `before` and `after`, but + # `:example`/`:each` is the only supported value. + # @overload around(scope, *conditions, &block) + # @param scope [Symbol] `:example` (defaults to `:example`) + # present for syntax parity with `before` and `after`, but + # `:example`/`:each` is the only supported value. + # @param conditions [Array, Hash] constrains this hook to + # examples matching these conditions e.g. + # `around(:example, :ui => true) { ... }` will only run with examples + # or groups declared with `:ui => true`. Symbols will be transformed + # into hash entries with `true` values. + # @overload around(conditions, &block) + # @param conditions [Hash] constrains this hook to examples matching + # these conditions e.g. `around(:example, :ui => true) { ... }` will + # only run with examples or groups declared with `:ui => true`. + # + # @yield [Example] the example to run + # + # @note the syntax of `around` is similar to that of `before` and `after` + # but the semantics are quite different. `before` and `after` hooks are + # run in the context of the examples with which they are associated, + # whereas `around` hooks are actually responsible for running the + # examples. Consequently, `around` hooks do not have direct access to + # resources that are made available within the examples and their + # associated `before` and `after` hooks. + # + # @note `:example`/`:each` is the only supported scope. + # + # Declare a block of code, parts of which will be run before and parts + # after the example. It is your responsibility to run the example: + # + # around(:example) do |ex| + # # Do some stuff before. + # ex.run + # # Do some stuff after. + # end + # + # The yielded example aliases `run` with `call`, which lets you treat it + # like a `Proc`. This is especially handy when working with libraries + # that manage their own setup and teardown using a block or proc syntax, + # e.g. + # + # around(:example) {|ex| Database.transaction(&ex)} + # around(:example) {|ex| FakeFS(&ex)} + # + # ### Order + # + # The `around` hooks execute surrounding an example and its hooks. + # + # This means after any `before` context hooks, but before any `before` + # example hooks, and similarly after any `after` example hooks but before + # any `after` context hooks. + # + # They are not a synonym for `before`/`after`. + def around(*args, &block) + hooks.register :prepend, :around, *args, &block + end + + # @private + # Holds the various registered hooks. + def hooks + @hooks ||= HookCollections.new(self, FilterableItemRepository::UpdateOptimized) + end + + # @private + Hook = Struct.new(:block, :options) + + # @private + class BeforeHook < Hook + def run(example) + example.instance_exec(example, &block) + end + end + + # @private + class AfterHook < Hook + def run(example) + example.instance_exec(example, &block) + rescue Support::AllExceptionsExceptOnesWeMustNotRescue => ex + example.set_exception(ex) + end + end + + # @private + class AfterContextHook < Hook + def run(example) + example.instance_exec(example, &block) + rescue Support::AllExceptionsExceptOnesWeMustNotRescue => e + RSpec.configuration.reporter.notify_non_example_exception(e, "An error occurred in an `after(:context)` hook.") + end + end + + # @private + class AroundHook < Hook + def execute_with(example, procsy) + example.instance_exec(procsy, &block) + return if procsy.executed? + Pending.mark_skipped!(example, + "#{hook_description} did not execute the example") + end + + if Proc.method_defined?(:source_location) + def hook_description + "around hook at #{Metadata.relative_path(block.source_location.join(':'))}" + end + else # for 1.8.7 + # :nocov: + def hook_description + "around hook" + end + # :nocov: + end + end + + # @private + # + # This provides the primary API used by other parts of rspec-core. By hiding all + # implementation details behind this facade, it's allowed us to heavily optimize + # this, so that, for example, hook collection objects are only instantiated when + # a hook is added. This allows us to avoid many object allocations for the common + # case of a group having no hooks. + # + # This is only possible because this interface provides a "tell, don't ask"-style + # API, so that callers _tell_ this class what to do with the hooks, rather than + # asking this class for a list of hooks, and then doing something with them. + class HookCollections + def initialize(owner, filterable_item_repo_class) + @owner = owner + @filterable_item_repo_class = filterable_item_repo_class + @before_example_hooks = nil + @after_example_hooks = nil + @before_context_hooks = nil + @after_context_hooks = nil + @around_example_hooks = nil + end + + def register_globals(host, globals) + parent_groups = host.parent_groups + + process(host, parent_groups, globals, :before, :example, &:options) + process(host, parent_groups, globals, :after, :example, &:options) + process(host, parent_groups, globals, :around, :example, &:options) + + process(host, parent_groups, globals, :before, :context, &:options) + process(host, parent_groups, globals, :after, :context, &:options) + end + + def register_global_singleton_context_hooks(example, globals) + parent_groups = example.example_group.parent_groups + + process(example, parent_groups, globals, :before, :context) { {} } + process(example, parent_groups, globals, :after, :context) { {} } + end + + def register(prepend_or_append, position, *args, &block) + scope, options = scope_and_options_from(*args) + + if scope == :suite + # TODO: consider making this an error in RSpec 4. For SemVer reasons, + # we are only warning in RSpec 3. + RSpec.warn_with "WARNING: `#{position}(:suite)` hooks are only supported on " \ + "the RSpec configuration object. This " \ + "`#{position}(:suite)` hook, registered on an example " \ + "group, will be ignored." + return + elsif scope == :context && position == :around + # TODO: consider making this an error in RSpec 4. For SemVer reasons, + # we are only warning in RSpec 3. + RSpec.warn_with "WARNING: `around(:context)` hooks are not supported and " \ + "behave like `around(:example)`." + end + + hook = HOOK_TYPES[position][scope].new(block, options) + ensure_hooks_initialized_for(position, scope).__send__(prepend_or_append, hook, options) + end + + # @private + # + # Runs all of the blocks stored with the hook in the context of the + # example. If no example is provided, just calls the hook directly. + def run(position, scope, example_or_group) + return if RSpec.configuration.dry_run? + + if scope == :context + unless example_or_group.class.metadata[:skip] + run_owned_hooks_for(position, :context, example_or_group) + end + else + case position + when :before then run_example_hooks_for(example_or_group, :before, :reverse_each) + when :after then run_example_hooks_for(example_or_group, :after, :each) + when :around then run_around_example_hooks_for(example_or_group) { yield } + end + end + end + + SCOPES = [:example, :context] + + SCOPE_ALIASES = { :each => :example, :all => :context } + + HOOK_TYPES = { + :before => Hash.new { BeforeHook }, + :after => Hash.new { AfterHook }, + :around => Hash.new { AroundHook } + } + + HOOK_TYPES[:after][:context] = AfterContextHook + + protected + + EMPTY_HOOK_ARRAY = [].freeze + + def matching_hooks_for(position, scope, example_or_group) + repository = hooks_for(position, scope) { return EMPTY_HOOK_ARRAY } + + # It would be nice to not have to switch on type here, but + # we don't want to define `ExampleGroup#metadata` because then + # `metadata` from within an individual example would return the + # group's metadata but the user would probably expect it to be + # the example's metadata. + metadata = case example_or_group + when ExampleGroup then example_or_group.class.metadata + else example_or_group.metadata + end + + repository.items_for(metadata) + end + + def all_hooks_for(position, scope) + hooks_for(position, scope) { return EMPTY_HOOK_ARRAY }.items_and_filters.map(&:first) + end + + def run_owned_hooks_for(position, scope, example_or_group) + matching_hooks_for(position, scope, example_or_group).each do |hook| + hook.run(example_or_group) + end + end + + def processable_hooks_for(position, scope, host) + if scope == :example + all_hooks_for(position, scope) + else + matching_hooks_for(position, scope, host) + end + end + + private + + def hooks_for(position, scope) + if position == :before + scope == :example ? @before_example_hooks : @before_context_hooks + elsif position == :after + scope == :example ? @after_example_hooks : @after_context_hooks + else # around + @around_example_hooks + end || yield + end + + def ensure_hooks_initialized_for(position, scope) + if position == :before + if scope == :example + @before_example_hooks ||= @filterable_item_repo_class.new(:all?) + else + @before_context_hooks ||= @filterable_item_repo_class.new(:all?) + end + elsif position == :after + if scope == :example + @after_example_hooks ||= @filterable_item_repo_class.new(:all?) + else + @after_context_hooks ||= @filterable_item_repo_class.new(:all?) + end + else # around + @around_example_hooks ||= @filterable_item_repo_class.new(:all?) + end + end + + def process(host, parent_groups, globals, position, scope) + hooks_to_process = globals.processable_hooks_for(position, scope, host) + return if hooks_to_process.empty? + + hooks_to_process -= FlatMap.flat_map(parent_groups) do |group| + group.hooks.all_hooks_for(position, scope) + end + return if hooks_to_process.empty? + + repository = ensure_hooks_initialized_for(position, scope) + hooks_to_process.each { |hook| repository.append hook, (yield hook) } + end + + def scope_and_options_from(*args) + return :suite if args.first == :suite + scope = extract_scope_from(args) + meta = Metadata.build_hash_from(args, :warn_about_example_group_filtering) + return scope, meta + end + + def extract_scope_from(args) + if known_scope?(args.first) + normalized_scope_for(args.shift) + elsif args.any? { |a| a.is_a?(Symbol) } + error_message = "You must explicitly give a scope " \ + "(#{SCOPES.join(", ")}) or scope alias " \ + "(#{SCOPE_ALIASES.keys.join(", ")}) when using symbols as " \ + "metadata for a hook." + raise ArgumentError.new error_message + else + :example + end + end + + def known_scope?(scope) + SCOPES.include?(scope) || SCOPE_ALIASES.keys.include?(scope) + end + + def normalized_scope_for(scope) + SCOPE_ALIASES[scope] || scope + end + + def run_example_hooks_for(example, position, each_method) + owner_parent_groups.__send__(each_method) do |group| + group.hooks.run_owned_hooks_for(position, :example, example) + end + end + + def run_around_example_hooks_for(example) + hooks = FlatMap.flat_map(owner_parent_groups) do |group| + group.hooks.matching_hooks_for(:around, :example, example) + end + + return yield if hooks.empty? # exit early to avoid the extra allocation cost of `Example::Procsy` + + initial_procsy = Example::Procsy.new(example) { yield } + hooks.inject(initial_procsy) do |procsy, around_hook| + procsy.wrap { around_hook.execute_with(example, procsy) } + end.call + end + + if respond_to?(:singleton_class) && singleton_class.ancestors.include?(singleton_class) + def owner_parent_groups + @owner.parent_groups + end + else # Ruby < 2.1 (see https://bugs.ruby-lang.org/issues/8035) + # :nocov: + def owner_parent_groups + @owner_parent_groups ||= [@owner] + @owner.parent_groups + end + # :nocov: + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/invocations.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/invocations.rb new file mode 100644 index 0000000..4719085 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/invocations.rb @@ -0,0 +1,87 @@ +module RSpec + module Core + # @private + module Invocations + # @private + class InitializeProject + def call(*_args) + RSpec::Support.require_rspec_core "project_initializer" + ProjectInitializer.new.run + 0 + end + end + + # @private + class DRbWithFallback + def call(options, err, out) + require 'rspec/core/drb' + begin + return DRbRunner.new(options).run(err, out) + rescue DRb::DRbConnError + err.puts "No DRb server is running. Running in local process instead ..." + end + RSpec::Core::Runner.new(options).run(err, out) + end + end + + # @private + class Bisect + def call(options, err, out) + RSpec::Support.require_rspec_core "bisect/coordinator" + runner = Runner.new(options).tap { |r| r.configure(err, out) } + formatter = bisect_formatter_klass_for(options.options[:bisect]).new( + out, runner.configuration.bisect_runner + ) + + success = RSpec::Core::Bisect::Coordinator.bisect_with( + runner, options.args, formatter + ) + + runner.exit_code(success) + end + + private + + def bisect_formatter_klass_for(argument) + return Formatters::BisectDebugFormatter if argument == "verbose" + Formatters::BisectProgressFormatter + end + end + + # @private + class PrintVersion + def call(_options, _err, out) + overall_version = RSpec::Core::Version::STRING + unless overall_version =~ /[a-zA-Z]+/ + overall_version = overall_version.split('.').first(2).join('.') + end + + out.puts "RSpec #{overall_version}" + + [:Core, :Expectations, :Mocks, :Rails, :Support].each do |const_name| + lib_name = const_name.to_s.downcase + begin + require "rspec/#{lib_name}/version" + rescue LoadError + # Not worth mentioning libs that are not installed + nil + else + out.puts " - rspec-#{lib_name} #{RSpec.const_get(const_name)::Version::STRING}" + end + end + + 0 + end + end + + # @private + PrintHelp = Struct.new(:parser, :hidden_options) do + def call(_options, _err, out) + # Removing the hidden options from the output. + out.puts parser.to_s.gsub(/^\s+(#{hidden_options.join('|')})\b.*$\n/, '') + 0 + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/memoized_helpers.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/memoized_helpers.rb new file mode 100644 index 0000000..adcfce7 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/memoized_helpers.rb @@ -0,0 +1,580 @@ +RSpec::Support.require_rspec_support 'reentrant_mutex' + +module RSpec + module Core + # This module is included in {ExampleGroup}, making the methods + # available to be called from within example blocks. + # + # @see ClassMethods + module MemoizedHelpers + # @note `subject` was contributed by Joe Ferris to support the one-liner + # syntax embraced by shoulda matchers: + # + # RSpec.describe Widget do + # it { is_expected.to validate_presence_of(:name) } + # # or + # it { should validate_presence_of(:name) } + # end + # + # While the examples below demonstrate how to use `subject` + # explicitly in examples, we recommend that you define a method with + # an intention revealing name instead. + # + # @example + # + # # Explicit declaration of subject. + # RSpec.describe Person do + # subject { Person.new(:birthdate => 19.years.ago) } + # it "should be eligible to vote" do + # subject.should be_eligible_to_vote + # # ^ ^ explicit reference to subject not recommended + # end + # end + # + # # Implicit subject => { Person.new }. + # RSpec.describe Person do + # it "should be eligible to vote" do + # subject.should be_eligible_to_vote + # # ^ ^ explicit reference to subject not recommended + # end + # end + # + # # One-liner syntax - expectation is set on the subject. + # RSpec.describe Person do + # it { is_expected.to be_eligible_to_vote } + # # or + # it { should be_eligible_to_vote } + # end + # + # @note Because `subject` is designed to create state that is reset + # between each example, and `before(:context)` is designed to setup + # state that is shared across _all_ examples in an example group, + # `subject` is _not_ intended to be used in a `before(:context)` hook. + # + # @see #should + # @see #should_not + # @see #is_expected + def subject + __memoized.fetch_or_store(:subject) do + described = described_class || self.class.metadata.fetch(:description_args).first + Class === described ? described.new : described + end + end + + # When `should` is called with no explicit receiver, the call is + # delegated to the object returned by `subject`. Combined with an + # implicit subject this supports very concise expressions. + # + # @example + # + # RSpec.describe Person do + # it { should be_eligible_to_vote } + # end + # + # @see #subject + # @see #is_expected + # + # @note This only works if you are using rspec-expectations. + # @note If you are using RSpec's newer expect-based syntax you may + # want to use `is_expected.to` instead of `should`. + def should(matcher=nil, message=nil) + enforce_value_expectation(matcher, 'should') + RSpec::Expectations::PositiveExpectationHandler.handle_matcher(subject, matcher, message) + end + + # Just like `should`, `should_not` delegates to the subject (implicit or + # explicit) of the example group. + # + # @example + # + # RSpec.describe Person do + # it { should_not be_eligible_to_vote } + # end + # + # @see #subject + # @see #is_expected + # + # @note This only works if you are using rspec-expectations. + # @note If you are using RSpec's newer expect-based syntax you may + # want to use `is_expected.to_not` instead of `should_not`. + def should_not(matcher=nil, message=nil) + enforce_value_expectation(matcher, 'should_not') + RSpec::Expectations::NegativeExpectationHandler.handle_matcher(subject, matcher, message) + end + + # Wraps the `subject` in `expect` to make it the target of an expectation. + # Designed to read nicely for one-liners. + # + # @example + # + # describe [1, 2, 3] do + # it { is_expected.to be_an Array } + # it { is_expected.not_to include 4 } + # end + # + # @see #subject + # @see #should + # @see #should_not + # + # @note This only works if you are using rspec-expectations. + def is_expected + expect(subject) + end + + # @private + # should just be placed in private section, + # but Ruby issues warnings on private attributes. + # and expanding it to the equivalent method upsets Rubocop, + # b/c it should obviously be a reader + attr_reader :__memoized + private :__memoized + + private + + # @private + def initialize(*) + __init_memoized + super + end + + # @private + def __init_memoized + @__memoized = if RSpec.configuration.threadsafe? + ThreadsafeMemoized.new + else + NonThreadSafeMemoized.new + end + end + + # @private + def enforce_value_expectation(matcher, method_name) + return if matcher_supports_value_expectations?(matcher) + + RSpec.deprecate( + "#{method_name} #{RSpec::Support::ObjectFormatter.format(matcher)}", + :message => + "The implicit block expectation syntax is deprecated, you should pass " \ + "a block to `expect` to use the provided block expectation matcher " \ + "(#{RSpec::Support::ObjectFormatter.format(matcher)}), " \ + "or the matcher must implement `supports_value_expectations?`." + ) + end + + def matcher_supports_value_expectations?(matcher) + matcher.supports_value_expectations? + rescue + true + end + + # @private + class ThreadsafeMemoized + def initialize + @memoized = {} + @mutex = Support::ReentrantMutex.new + end + + def fetch_or_store(key) + @memoized.fetch(key) do # only first access pays for synchronization + @mutex.synchronize do + @memoized.fetch(key) { @memoized[key] = yield } + end + end + end + end + + # @private + class NonThreadSafeMemoized + def initialize + @memoized = {} + end + + def fetch_or_store(key) + @memoized.fetch(key) { @memoized[key] = yield } + end + end + + # Used internally to customize the behavior of the + # memoized hash when used in a `before(:context)` hook. + # + # @private + class ContextHookMemoized + def self.isolate_for_context_hook(example_group_instance) + exploding_memoized = self + + example_group_instance.instance_exec do + @__memoized = exploding_memoized + + begin + yield + ensure + # This is doing a reset instead of just isolating for context hook. + # Really, this should set the old @__memoized back into place. + # + # Caller is the before and after context hooks + # which are both called from self.run + # I didn't look at why it made tests fail, maybe an object was getting reused in RSpec tests, + # if so, then that probably already works, and its the tests that are wrong. + __init_memoized + end + end + end + + def self.fetch_or_store(key, &_block) + description = if key == :subject + "subject" + else + "let declaration `#{key}`" + end + + raise <<-EOS +#{description} accessed in #{article} #{hook_expression} hook at: + #{CallerFilter.first_non_rspec_line} + +`let` and `subject` declarations are not intended to be called +in #{article} #{hook_expression} hook, as they exist to define state that +is reset between each example, while #{hook_expression} exists to +#{hook_intention}. +EOS + end + + # @private + class Before < self + def self.hook_expression + "`before(:context)`" + end + + def self.article + "a" + end + + def self.hook_intention + "define state that is shared across examples in an example group" + end + end + + # @private + class After < self + def self.hook_expression + "`after(:context)`" + end + + def self.article + "an" + end + + def self.hook_intention + "cleanup state that is shared across examples in an example group" + end + end + end + + # This module is extended onto {ExampleGroup}, making the methods + # available to be called from within example group blocks. + # You can think of them as being analagous to class macros. + module ClassMethods + # Generates a method whose return value is memoized after the first + # call. Useful for reducing duplication between examples that assign + # values to the same local variable. + # + # @note `let` _can_ enhance readability when used sparingly (1,2, or + # maybe 3 declarations) in any given example group, but that can + # quickly degrade with overuse. YMMV. + # + # @note `let` can be configured to be threadsafe or not. + # If it is threadsafe, it will take longer to access the value. + # If it is not threadsafe, it may behave in surprising ways in examples + # that spawn separate threads. Specify this on `RSpec.configure` + # + # @note Because `let` is designed to create state that is reset between + # each example, and `before(:context)` is designed to setup state that + # is shared across _all_ examples in an example group, `let` is _not_ + # intended to be used in a `before(:context)` hook. + # + # @example + # + # RSpec.describe Thing do + # let(:thing) { Thing.new } + # + # it "does something" do + # # First invocation, executes block, memoizes and returns result. + # thing.do_something + # + # # Second invocation, returns the memoized value. + # thing.should be_something + # end + # end + def let(name, &block) + # We have to pass the block directly to `define_method` to + # allow it to use method constructs like `super` and `return`. + raise "#let or #subject called without a block" if block.nil? + + # A list of reserved words that can't be used as a name for a memoized helper + # Matches for both symbols and passed strings + if [:initialize, :to_s].include?(name.to_sym) + raise ArgumentError, "#let or #subject called with reserved name `#{name}`" + end + + our_module = MemoizedHelpers.module_for(self) + + # If we have a module clash in our helper module + # then we need to remove it to prevent a warning. + # + # Note we do not check ancestor modules (see: `instance_methods(false)`) + # as we can override them. + if our_module.instance_methods(false).include?(name) + our_module.__send__(:remove_method, name) + end + our_module.__send__(:define_method, name, &block) + + # If we have a module clash in the example module + # then we need to remove it to prevent a warning. + # + # Note we do not check ancestor modules (see: `instance_methods(false)`) + # as we can override them. + if instance_methods(false).include?(name) + remove_method(name) + end + + # Apply the memoization. The method has been defined in an ancestor + # module so we can use `super` here to get the value. + if block.arity == 1 + define_method(name) { __memoized.fetch_or_store(name) { super(RSpec.current_example, &nil) } } + else + define_method(name) { __memoized.fetch_or_store(name) { super(&nil) } } + end + end + + # Just like `let`, except the block is invoked by an implicit `before` + # hook. This serves a dual purpose of setting up state and providing a + # memoized reference to that state. + # + # @example + # + # class Thing + # def self.count + # @count ||= 0 + # end + # + # def self.count=(val) + # @count += val + # end + # + # def self.reset_count + # @count = 0 + # end + # + # def initialize + # self.class.count += 1 + # end + # end + # + # RSpec.describe Thing do + # after(:example) { Thing.reset_count } + # + # context "using let" do + # let(:thing) { Thing.new } + # + # it "is not invoked implicitly" do + # Thing.count.should eq(0) + # end + # + # it "can be invoked explicitly" do + # thing + # Thing.count.should eq(1) + # end + # end + # + # context "using let!" do + # let!(:thing) { Thing.new } + # + # it "is invoked implicitly" do + # Thing.count.should eq(1) + # end + # + # it "returns memoized version on first invocation" do + # thing + # Thing.count.should eq(1) + # end + # end + # end + def let!(name, &block) + let(name, &block) + before { __send__(name) } + end + + # Declares a `subject` for an example group which can then be wrapped + # with `expect` using `is_expected` to make it the target of an + # expectation in a concise, one-line example. + # + # Given a `name`, defines a method with that name which returns the + # `subject`. This lets you declare the subject once and access it + # implicitly in one-liners and explicitly using an intention revealing + # name. + # + # When given a `name`, calling `super` in the block is not supported. + # + # @note `subject` can be configured to be threadsafe or not. + # If it is threadsafe, it will take longer to access the value. + # If it is not threadsafe, it may behave in surprising ways in examples + # that spawn separate threads. Specify this on `RSpec.configure` + # + # @param name [String,Symbol] used to define an accessor with an + # intention revealing name + # @param block defines the value to be returned by `subject` in examples + # + # @example + # + # RSpec.describe CheckingAccount, "with $50" do + # subject { CheckingAccount.new(Money.new(50, :USD)) } + # it { is_expected.to have_a_balance_of(Money.new(50, :USD)) } + # it { is_expected.not_to be_overdrawn } + # end + # + # RSpec.describe CheckingAccount, "with a non-zero starting balance" do + # subject(:account) { CheckingAccount.new(Money.new(50, :USD)) } + # it { is_expected.not_to be_overdrawn } + # it "has a balance equal to the starting balance" do + # account.balance.should eq(Money.new(50, :USD)) + # end + # end + # + # @see MemoizedHelpers#should + # @see MemoizedHelpers#should_not + # @see MemoizedHelpers#is_expected + def subject(name=nil, &block) + if name + let(name, &block) + alias_method :subject, name + + self::NamedSubjectPreventSuper.__send__(:define_method, name) do + raise NotImplementedError, "`super` in named subjects is not supported" + end + else + let(:subject, &block) + end + end + + # Just like `subject`, except the block is invoked by an implicit + # `before` hook. This serves a dual purpose of setting up state and + # providing a memoized reference to that state. + # + # @example + # + # class Thing + # def self.count + # @count ||= 0 + # end + # + # def self.count=(val) + # @count += val + # end + # + # def self.reset_count + # @count = 0 + # end + # + # def initialize + # self.class.count += 1 + # end + # end + # + # RSpec.describe Thing do + # after(:example) { Thing.reset_count } + # + # context "using subject" do + # subject { Thing.new } + # + # it "is not invoked implicitly" do + # Thing.count.should eq(0) + # end + # + # it "can be invoked explicitly" do + # subject + # Thing.count.should eq(1) + # end + # end + # + # context "using subject!" do + # subject!(:thing) { Thing.new } + # + # it "is invoked implicitly" do + # Thing.count.should eq(1) + # end + # + # it "returns memoized version on first invocation" do + # subject + # Thing.count.should eq(1) + # end + # end + # end + def subject!(name=nil, &block) + subject(name, &block) + before { subject } + end + end + + # @private + # + # Gets the LetDefinitions module. The module is mixed into + # the example group and is used to hold all let definitions. + # This is done so that the block passed to `let` can be + # forwarded directly on to `define_method`, so that all method + # constructs (including `super` and `return`) can be used in + # a `let` block. + # + # The memoization is provided by a method definition on the + # example group that supers to the LetDefinitions definition + # in order to get the value to memoize. + def self.module_for(example_group) + get_constant_or_yield(example_group, :LetDefinitions) do + mod = Module.new do + include(Module.new { + example_group.const_set(:NamedSubjectPreventSuper, self) + }) + end + + example_group.const_set(:LetDefinitions, mod) + mod + end + end + + # @private + def self.define_helpers_on(example_group) + example_group.__send__(:include, module_for(example_group)) + end + + if Module.method(:const_defined?).arity == 1 # for 1.8 + # @private + # + # Gets the named constant or yields. + # On 1.8, const_defined? / const_get do not take into + # account the inheritance hierarchy. + # :nocov: + def self.get_constant_or_yield(example_group, name) + if example_group.const_defined?(name) + example_group.const_get(name) + else + yield + end + end + # :nocov: + else + # @private + # + # Gets the named constant or yields. + # On 1.9, const_defined? / const_get take into account the + # the inheritance by default, and accept an argument to + # disable this behavior. It's important that we don't + # consider inheritance here; each example group level that + # uses a `let` should get its own `LetDefinitions` module. + def self.get_constant_or_yield(example_group, name) + if example_group.const_defined?(name, (check_ancestors = false)) + example_group.const_get(name, check_ancestors) + else + yield + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/metadata.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/metadata.rb new file mode 100644 index 0000000..9034214 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/metadata.rb @@ -0,0 +1,498 @@ +module RSpec + module Core + # Each ExampleGroup class and Example instance owns an instance of + # Metadata, which is Hash extended to support lazy evaluation of values + # associated with keys that may or may not be used by any example or group. + # + # In addition to metadata that is used internally, this also stores + # user-supplied metadata, e.g. + # + # RSpec.describe Something, :type => :ui do + # it "does something", :slow => true do + # # ... + # end + # end + # + # `:type => :ui` is stored in the Metadata owned by the example group, and + # `:slow => true` is stored in the Metadata owned by the example. These can + # then be used to select which examples are run using the `--tag` option on + # the command line, or several methods on `Configuration` used to filter a + # run (e.g. `filter_run_including`, `filter_run_excluding`, etc). + # + # @see Example#metadata + # @see ExampleGroup.metadata + # @see FilterManager + # @see Configuration#filter_run_including + # @see Configuration#filter_run_excluding + module Metadata + # Matches strings either at the beginning of the input or prefixed with a + # whitespace, containing the current path, either postfixed with the + # separator, or at the end of the string. Match groups are the character + # before and the character after the string if any. + # + # http://rubular.com/r/fT0gmX6VJX + # http://rubular.com/r/duOrD4i3wb + # http://rubular.com/r/sbAMHFrOx1 + def self.relative_path_regex + @relative_path_regex ||= /(\A|\s)#{File.expand_path('.')}(#{File::SEPARATOR}|\s|\Z)/ + end + + # @api private + # + # @param line [String] current code line + # @return [String] relative path to line + def self.relative_path(line) + line = line.sub(relative_path_regex, "\\1.\\2".freeze) + line = line.sub(/\A([^:]+:\d+)$/, '\\1'.freeze) + return nil if line == '-e:1'.freeze + line + rescue SecurityError + # :nocov: - SecurityError is no longer produced starting in ruby 2.7 + nil + # :nocov: + end + + # @private + # Iteratively walks up from the given metadata through all + # example group ancestors, yielding each metadata hash along the way. + def self.ascending(metadata) + yield metadata + return unless (group_metadata = metadata.fetch(:example_group) { metadata[:parent_example_group] }) + + loop do + yield group_metadata + break unless (group_metadata = group_metadata[:parent_example_group]) + end + end + + # @private + # Returns an enumerator that iteratively walks up the given metadata through all + # example group ancestors, yielding each metadata hash along the way. + def self.ascend(metadata) + enum_for(:ascending, metadata) + end + + # @private + # Used internally to build a hash from an args array. + # Symbols are converted into hash keys with a value of `true`. + # This is done to support simple tagging using a symbol, rather + # than needing to do `:symbol => true`. + def self.build_hash_from(args, warn_about_example_group_filtering=false) + hash = args.last.is_a?(Hash) ? args.pop : {} + + hash[args.pop] = true while args.last.is_a?(Symbol) + + if warn_about_example_group_filtering && hash.key?(:example_group) + RSpec.deprecate("Filtering by an `:example_group` subhash", + :replacement => "the subhash to filter directly") + end + + hash + end + + # @private + def self.deep_hash_dup(object) + return object.dup if Array === object + return object unless Hash === object + + object.inject(object.dup) do |duplicate, (key, value)| + duplicate[key] = deep_hash_dup(value) + duplicate + end + end + + # @private + def self.id_from(metadata) + "#{metadata[:rerun_file_path]}[#{metadata[:scoped_id]}]" + end + + # @private + def self.location_tuple_from(metadata) + [metadata[:absolute_file_path], metadata[:line_number]] + end + + # @private + # Used internally to populate metadata hashes with computed keys + # managed by RSpec. + class HashPopulator + attr_reader :metadata, :user_metadata, :description_args, :block + + def initialize(metadata, user_metadata, index_provider, description_args, block) + @metadata = metadata + @user_metadata = user_metadata + @index_provider = index_provider + @description_args = description_args + @block = block + end + + def populate + ensure_valid_user_keys + + metadata[:block] = block + metadata[:description_args] = description_args + metadata[:description] = build_description_from(*metadata[:description_args]) + metadata[:full_description] = full_description + metadata[:described_class] = described_class + + populate_location_attributes + metadata.update(user_metadata) + end + + private + + def populate_location_attributes + backtrace = user_metadata.delete(:caller) + + file_path, line_number = if backtrace + file_path_and_line_number_from(backtrace) + elsif block.respond_to?(:source_location) + block.source_location + else + file_path_and_line_number_from(caller) + end + + relative_file_path = Metadata.relative_path(file_path) + absolute_file_path = File.expand_path(relative_file_path) + metadata[:file_path] = relative_file_path + metadata[:line_number] = line_number.to_i + metadata[:location] = "#{relative_file_path}:#{line_number}" + metadata[:absolute_file_path] = absolute_file_path + metadata[:rerun_file_path] ||= relative_file_path + metadata[:scoped_id] = build_scoped_id_for(absolute_file_path) + end + + def file_path_and_line_number_from(backtrace) + first_caller_from_outside_rspec = backtrace.find { |l| l !~ CallerFilter::LIB_REGEX } + first_caller_from_outside_rspec ||= backtrace.first + /(.+?):(\d+)(?:|:\d+)/.match(first_caller_from_outside_rspec).captures + end + + def description_separator(parent_part, child_part) + if parent_part.is_a?(Module) && /^(?:#|::|\.)/.match(child_part.to_s) + ''.freeze + else + ' '.freeze + end + end + + def build_description_from(parent_description=nil, my_description=nil) + return parent_description.to_s unless my_description + return my_description.to_s if parent_description.to_s == '' + separator = description_separator(parent_description, my_description) + (parent_description.to_s + separator) << my_description.to_s + end + + def build_scoped_id_for(file_path) + index = @index_provider.call(file_path).to_s + parent_scoped_id = metadata.fetch(:scoped_id) { return index } + "#{parent_scoped_id}:#{index}" + end + + def ensure_valid_user_keys + RESERVED_KEYS.each do |key| + next unless user_metadata.key?(key) + raise <<-EOM.gsub(/^\s+\|/, '') + |#{"*" * 50} + |:#{key} is not allowed + | + |RSpec reserves some hash keys for its own internal use, + |including :#{key}, which is used on: + | + | #{CallerFilter.first_non_rspec_line}. + | + |Here are all of RSpec's reserved hash keys: + | + | #{RESERVED_KEYS.join("\n ")} + |#{"*" * 50} + EOM + end + end + end + + # @private + class ExampleHash < HashPopulator + def self.create(group_metadata, user_metadata, index_provider, description, block) + example_metadata = group_metadata.dup + group_metadata = Hash.new(&ExampleGroupHash.backwards_compatibility_default_proc do |hash| + hash[:parent_example_group] + end) + group_metadata.update(example_metadata) + + example_metadata[:execution_result] = Example::ExecutionResult.new + example_metadata[:example_group] = group_metadata + example_metadata[:shared_group_inclusion_backtrace] = SharedExampleGroupInclusionStackFrame.current_backtrace + example_metadata.delete(:parent_example_group) + + description_args = description.nil? ? [] : [description] + hash = new(example_metadata, user_metadata, index_provider, description_args, block) + hash.populate + hash.metadata + end + + private + + def described_class + metadata[:example_group][:described_class] + end + + def full_description + build_description_from( + metadata[:example_group][:full_description], + metadata[:description] + ) + end + end + + # @private + class ExampleGroupHash < HashPopulator + def self.create(parent_group_metadata, user_metadata, example_group_index, *args, &block) + group_metadata = hash_with_backwards_compatibility_default_proc + + if parent_group_metadata + group_metadata.update(parent_group_metadata) + group_metadata[:parent_example_group] = parent_group_metadata + end + + hash = new(group_metadata, user_metadata, example_group_index, args, block) + hash.populate + hash.metadata + end + + def self.hash_with_backwards_compatibility_default_proc + Hash.new(&backwards_compatibility_default_proc { |hash| hash }) + end + + def self.backwards_compatibility_default_proc(&example_group_selector) + Proc.new do |hash, key| + case key + when :example_group + # We commonly get here when rspec-core is applying a previously + # configured filter rule, such as when a gem configures: + # + # RSpec.configure do |c| + # c.include MyGemHelpers, :example_group => { :file_path => /spec\/my_gem_specs/ } + # end + # + # It's confusing for a user to get a deprecation at this point in + # the code, so instead we issue a deprecation from the config APIs + # that take a metadata hash, and MetadataFilter sets this thread + # local to silence the warning here since it would be so + # confusing. + unless RSpec::Support.thread_local_data[:silence_metadata_example_group_deprecations] + RSpec.deprecate("The `:example_group` key in an example group's metadata hash", + :replacement => "the example group's hash directly for the " \ + "computed keys and `:parent_example_group` to access the parent " \ + "example group metadata") + end + + group_hash = example_group_selector.call(hash) + LegacyExampleGroupHash.new(group_hash) if group_hash + when :example_group_block + RSpec.deprecate("`metadata[:example_group_block]`", + :replacement => "`metadata[:block]`") + hash[:block] + when :describes + RSpec.deprecate("`metadata[:describes]`", + :replacement => "`metadata[:described_class]`") + hash[:described_class] + end + end + end + + private + + def described_class + candidate = metadata[:description_args].first + return candidate unless NilClass === candidate || String === candidate + parent_group = metadata[:parent_example_group] + parent_group && parent_group[:described_class] + end + + def full_description + description = metadata[:description] + parent_example_group = metadata[:parent_example_group] + return description unless parent_example_group + + parent_description = parent_example_group[:full_description] + separator = description_separator(parent_example_group[:description_args].last, + metadata[:description_args].first) + + parent_description + separator + description + end + end + + # @private + RESERVED_KEYS = [ + :description, + :description_args, + :described_class, + :example_group, + :parent_example_group, + :execution_result, + :last_run_status, + :file_path, + :absolute_file_path, + :rerun_file_path, + :full_description, + :line_number, + :location, + :scoped_id, + :block, + :shared_group_inclusion_backtrace + ] + end + + # Mixin that makes the including class imitate a hash for backwards + # compatibility. The including class should use `attr_accessor` to + # declare attributes. + # @private + module HashImitatable + def self.included(klass) + klass.extend ClassMethods + end + + def to_h + hash = extra_hash_attributes.dup + + self.class.hash_attribute_names.each do |name| + hash[name] = __send__(name) + end + + hash + end + + (Hash.public_instance_methods - Object.public_instance_methods).each do |method_name| + next if [:[], :[]=, :to_h].include?(method_name.to_sym) + + define_method(method_name) do |*args, &block| + issue_deprecation(method_name, *args) + + hash = hash_for_delegation + self.class.hash_attribute_names.each do |name| + hash.delete(name) unless instance_variable_defined?(:"@#{name}") + end + + hash.__send__(method_name, *args, &block).tap do + # apply mutations back to the object + hash.each do |name, value| + if directly_supports_attribute?(name) + set_value(name, value) + else + extra_hash_attributes[name] = value + end + end + end + end + end + + def [](key) + issue_deprecation(:[], key) + + if directly_supports_attribute?(key) + get_value(key) + else + extra_hash_attributes[key] + end + end + + def []=(key, value) + issue_deprecation(:[]=, key, value) + + if directly_supports_attribute?(key) + set_value(key, value) + else + extra_hash_attributes[key] = value + end + end + + private + + def extra_hash_attributes + @extra_hash_attributes ||= {} + end + + def directly_supports_attribute?(name) + self.class.hash_attribute_names.include?(name) + end + + def get_value(name) + __send__(name) + end + + def set_value(name, value) + __send__(:"#{name}=", value) + end + + def hash_for_delegation + to_h + end + + def issue_deprecation(_method_name, *_args) + # no-op by default: subclasses can override + end + + # @private + module ClassMethods + def hash_attribute_names + @hash_attribute_names ||= [] + end + + def attr_accessor(*names) + hash_attribute_names.concat(names) + super + end + end + end + + # @private + # Together with the example group metadata hash default block, + # provides backwards compatibility for the old `:example_group` + # key. In RSpec 2.x, the computed keys of a group's metadata + # were exposed from a nested subhash keyed by `[:example_group]`, and + # then the parent group's metadata was exposed by sub-subhash + # keyed by `[:example_group][:example_group]`. + # + # In RSpec 3, we reorganized this to that the computed keys are + # exposed directly of the group metadata hash (no nesting), and + # `:parent_example_group` returns the parent group's metadata. + # + # Maintaining backwards compatibility was difficult: we wanted + # `:example_group` to return an object that: + # + # * Exposes the top-level metadata keys that used to be nested + # under `:example_group`. + # * Supports mutation (rspec-rails, for example, assigns + # `metadata[:example_group][:described_class]` when you use + # anonymous controller specs) such that changes are written + # back to the top-level metadata hash. + # * Exposes the parent group metadata as + # `[:example_group][:example_group]`. + class LegacyExampleGroupHash + include HashImitatable + + def initialize(metadata) + @metadata = metadata + parent_group_metadata = metadata.fetch(:parent_example_group) { {} }[:example_group] + self[:example_group] = parent_group_metadata if parent_group_metadata + end + + def to_h + super.merge(@metadata) + end + + private + + def directly_supports_attribute?(name) + name != :example_group + end + + def get_value(name) + @metadata[name] + end + + def set_value(name, value) + @metadata[name] = value + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/metadata_filter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/metadata_filter.rb new file mode 100644 index 0000000..2e63baf --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/metadata_filter.rb @@ -0,0 +1,255 @@ +module RSpec + module Core + # Contains metadata filtering logic. This has been extracted from + # the metadata classes because it operates ON a metadata hash but + # does not manage any of the state in the hash. We're moving towards + # having metadata be a raw hash (not a custom subclass), so externalizing + # this filtering logic helps us move in that direction. + module MetadataFilter + class << self + # @private + def apply?(predicate, filters, metadata) + filters.__send__(predicate) { |k, v| filter_applies?(k, v, metadata) } + end + + # @private + def filter_applies?(key, filter_value, metadata) + silence_metadata_example_group_deprecations do + return location_filter_applies?(filter_value, metadata) if key == :locations + return id_filter_applies?(filter_value, metadata) if key == :ids + return filters_apply?(key, filter_value, metadata) if Hash === filter_value + + meta_value = metadata.fetch(key) { return false } + + return true if TrueClass === filter_value && meta_value + return proc_filter_applies?(key, filter_value, metadata) if Proc === filter_value + return filter_applies_to_any_value?(key, filter_value, metadata) if Array === meta_value + + filter_value === meta_value || filter_value.to_s == meta_value.to_s + end + end + + # @private + def silence_metadata_example_group_deprecations + RSpec::Support.thread_local_data[:silence_metadata_example_group_deprecations] = true + yield + ensure + RSpec::Support.thread_local_data.delete(:silence_metadata_example_group_deprecations) + end + + private + + def filter_applies_to_any_value?(key, value, metadata) + metadata[key].any? { |v| filter_applies?(key, v, key => value) } + end + + def id_filter_applies?(rerun_paths_to_scoped_ids, metadata) + scoped_ids = rerun_paths_to_scoped_ids.fetch(metadata[:rerun_file_path]) { return false } + + Metadata.ascend(metadata).any? do |meta| + scoped_ids.include?(meta[:scoped_id]) + end + end + + def location_filter_applies?(locations, metadata) + Metadata.ascend(metadata).any? do |meta| + file_path = meta[:absolute_file_path] + line_num = meta[:line_number] + + locations[file_path].any? do |filter_line_num| + line_num == RSpec.world.preceding_declaration_line(file_path, filter_line_num) + end + end + end + + def proc_filter_applies?(key, proc, metadata) + case proc.arity + when 0 then proc.call + when 2 then proc.call(metadata[key], metadata) + else proc.call(metadata[key]) + end + end + + def filters_apply?(key, value, metadata) + subhash = metadata[key] + return false unless Hash === subhash || HashImitatable === subhash + value.all? { |k, v| filter_applies?(k, v, subhash) } + end + end + end + + # Tracks a collection of filterable items (e.g. modules, hooks, etc) + # and provides an optimized API to get the applicable items for the + # metadata of an example or example group. + # + # There are two implementations, optimized for different uses. + # @private + module FilterableItemRepository + # This implementation is simple, and is optimized for frequent + # updates but rare queries. `append` and `prepend` do no extra + # processing, and no internal memoization is done, since this + # is not optimized for queries. + # + # This is ideal for use by a example or example group, which may + # be updated multiple times with globally configured hooks, etc, + # but will not be queried frequently by other examples or example + # groups. + # @private + class UpdateOptimized + attr_reader :items_and_filters + + def initialize(applies_predicate) + @applies_predicate = applies_predicate + @items_and_filters = [] + end + + def append(item, metadata) + @items_and_filters << [item, metadata] + end + + def prepend(item, metadata) + @items_and_filters.unshift [item, metadata] + end + + def delete(item, metadata) + @items_and_filters.delete [item, metadata] + end + + def items_for(request_meta) + @items_and_filters.each_with_object([]) do |(item, item_meta), to_return| + to_return << item if item_meta.empty? || + MetadataFilter.apply?(@applies_predicate, item_meta, request_meta) + end + end + + unless [].respond_to?(:each_with_object) # For 1.8.7 + # :nocov: + undef items_for + def items_for(request_meta) + @items_and_filters.inject([]) do |to_return, (item, item_meta)| + to_return << item if item_meta.empty? || + MetadataFilter.apply?(@applies_predicate, item_meta, request_meta) + to_return + end + end + # :nocov: + end + end + + # This implementation is much more complex, and is optimized for + # rare (or hopefully no) updates once the queries start. Updates + # incur a cost as it has to clear the memoization and keep track + # of applicable keys. Queries will be O(N) the first time an item + # is provided with a given set of applicable metadata; subsequent + # queries with items with the same set of applicable metadata will + # be O(1) due to internal memoization. + # + # This is ideal for use by config, where filterable items (e.g. hooks) + # are typically added at the start of the process (e.g. in `spec_helper`) + # and then repeatedly queried as example groups and examples are defined. + # @private + class QueryOptimized < UpdateOptimized + alias find_items_for items_for + private :find_items_for + + def initialize(applies_predicate) + super + @applicable_keys = Set.new + @proc_keys = Set.new + @memoized_lookups = Hash.new do |hash, applicable_metadata| + hash[applicable_metadata] = find_items_for(applicable_metadata) + end + end + + def append(item, metadata) + super + handle_mutation(metadata) + end + + def prepend(item, metadata) + super + handle_mutation(metadata) + end + + def delete(item, metadata) + super + reconstruct_caches + end + + def items_for(metadata) + # The filtering of `metadata` to `applicable_metadata` is the key thing + # that makes the memoization actually useful in practice, since each + # example and example group have different metadata (e.g. location and + # description). By filtering to the metadata keys our items care about, + # we can ignore extra metadata keys that differ for each example/group. + # For example, given `config.include DBHelpers, :db`, example groups + # can be split into these two sets: those that are tagged with `:db` and those + # that are not. For each set, this method for the first group in the set is + # still an `O(N)` calculation, but all subsequent groups in the set will be + # constant time lookups when they call this method. + applicable_metadata = applicable_metadata_from(metadata) + + if applicable_metadata.any? { |k, _| @proc_keys.include?(k) } + # It's unsafe to memoize lookups involving procs (since they can + # be non-deterministic), so we skip the memoization in this case. + find_items_for(applicable_metadata) + else + @memoized_lookups[applicable_metadata] + end + end + + private + + def reconstruct_caches + @applicable_keys.clear + @proc_keys.clear + @items_and_filters.each do |_item, metadata| + handle_mutation(metadata) + end + end + + def handle_mutation(metadata) + @applicable_keys.merge(metadata.keys) + @proc_keys.merge(proc_keys_from metadata) + @memoized_lookups.clear + end + + def applicable_metadata_from(metadata) + MetadataFilter.silence_metadata_example_group_deprecations do + @applicable_keys.inject({}) do |hash, key| + # :example_group is treated special here because... + # - In RSpec 2, example groups had an `:example_group` key + # - In RSpec 3, that key is deprecated (it was confusing!). + # - The key is not technically present in an example group metadata hash + # (and thus would fail the `metadata.key?(key)` check) but a value + # is provided when accessed via the hash's `default_proc` + # - Thus, for backwards compatibility, we have to explicitly check + # for `:example_group` here if it is one of the keys being used to + # filter. + hash[key] = metadata[key] if metadata.key?(key) || key == :example_group + hash + end + end + end + + def proc_keys_from(metadata) + metadata.each_with_object([]) do |(key, value), to_return| + to_return << key if Proc === value + end + end + + unless [].respond_to?(:each_with_object) # For 1.8.7 + # :nocov: + undef proc_keys_from + def proc_keys_from(metadata) + metadata.inject([]) do |to_return, (key, value)| + to_return << key if Proc === value + to_return + end + end + # :nocov: + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/minitest_assertions_adapter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/minitest_assertions_adapter.rb new file mode 100644 index 0000000..25db751 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/minitest_assertions_adapter.rb @@ -0,0 +1,31 @@ +begin + # Only the minitest 5.x gem includes the minitest.rb and assertions.rb files. + require 'minitest' + require 'minitest/assertions' +rescue LoadError + # We must be using Ruby Core's MiniTest or the Minitest gem 4.x. + require 'minitest/unit' + Minitest = MiniTest +end + +module RSpec + module Core + # @private + module MinitestAssertionsAdapter + include ::Minitest::Assertions + # Need to forcefully include Pending after Minitest::Assertions + # to make sure our own #skip method beats Minitest's. + include ::RSpec::Core::Pending + + # Minitest 5.x requires this accessor to be available. See + # https://github.com/seattlerb/minitest/blob/38f0a5fcbd9c37c3f80a3eaad4ba84d3fc9947a0/lib/minitest/assertions.rb#L8 + # + # It is not required for other extension libraries, and RSpec does not + # report or make this information available to formatters. + attr_writer :assertions + def assertions + @assertions ||= 0 + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/flexmock.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/flexmock.rb new file mode 100644 index 0000000..91475ae --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/flexmock.rb @@ -0,0 +1,31 @@ +# Created by Jim Weirich on 2007-04-10. +# Copyright (c) 2007. All rights reserved. + +require 'flexmock/rspec' + +module RSpec + module Core + module MockingAdapters + # @private + module Flexmock + include ::FlexMock::MockContainer + + def self.framework_name + :flexmock + end + + def setup_mocks_for_rspec + # No setup required. + end + + def verify_mocks_for_rspec + flexmock_verify + end + + def teardown_mocks_for_rspec + flexmock_close + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/mocha.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/mocha.rb new file mode 100644 index 0000000..8caf7b6 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/mocha.rb @@ -0,0 +1,57 @@ +# In order to support all versions of mocha, we have to jump through some +# hoops here. +# +# mocha >= '0.13.0': +# require 'mocha/api' is required. +# require 'mocha/object' raises a LoadError b/c the file no longer exists. +# mocha < '0.13.0', >= '0.9.7' +# require 'mocha/api' is required. +# require 'mocha/object' is required. +# mocha < '0.9.7': +# require 'mocha/api' raises a LoadError b/c the file does not yet exist. +# require 'mocha/standalone' is required. +# require 'mocha/object' is required. +begin + require 'mocha/api' + + begin + require 'mocha/object' + rescue LoadError + # Mocha >= 0.13.0 no longer contains this file nor needs it to be loaded. + end +rescue LoadError + require 'mocha/standalone' + require 'mocha/object' +end + +module RSpec + module Core + module MockingAdapters + # @private + module Mocha + def self.framework_name + :mocha + end + + # Mocha::Standalone was deprecated as of Mocha 0.9.7. + begin + include ::Mocha::API + rescue NameError + include ::Mocha::Standalone + end + + def setup_mocks_for_rspec + mocha_setup + end + + def verify_mocks_for_rspec + mocha_verify + end + + def teardown_mocks_for_rspec + mocha_teardown + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/null.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/null.rb new file mode 100644 index 0000000..442de9a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/null.rb @@ -0,0 +1,14 @@ +module RSpec + module Core + module MockingAdapters + # @private + module Null + def setup_mocks_for_rspec; end + + def verify_mocks_for_rspec; end + + def teardown_mocks_for_rspec; end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/rr.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/rr.rb new file mode 100644 index 0000000..d72651a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/rr.rb @@ -0,0 +1,31 @@ +require 'rr' + +RSpec.configuration.backtrace_exclusion_patterns.push(RR::Errors::BACKTRACE_IDENTIFIER) + +module RSpec + module Core + # @private + module MockingAdapters + # @private + module RR + def self.framework_name + :rr + end + + include ::RR::Extensions::InstanceMethods + + def setup_mocks_for_rspec + ::RR::Space.instance.reset + end + + def verify_mocks_for_rspec + ::RR::Space.instance.verify_doubles + end + + def teardown_mocks_for_rspec + ::RR::Space.instance.reset + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/rspec.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/rspec.rb new file mode 100644 index 0000000..bb3f0ae --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/rspec.rb @@ -0,0 +1,32 @@ +require 'rspec/mocks' + +module RSpec + module Core + module MockingAdapters + # @private + module RSpec + include ::RSpec::Mocks::ExampleMethods + + def self.framework_name + :rspec + end + + def self.configuration + ::RSpec::Mocks.configuration + end + + def setup_mocks_for_rspec + ::RSpec::Mocks.setup + end + + def verify_mocks_for_rspec + ::RSpec::Mocks.verify + end + + def teardown_mocks_for_rspec + ::RSpec::Mocks.teardown + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/notifications.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/notifications.rb new file mode 100644 index 0000000..72768ef --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/notifications.rb @@ -0,0 +1,523 @@ +RSpec::Support.require_rspec_core "formatters/console_codes" +RSpec::Support.require_rspec_core "formatters/exception_presenter" +RSpec::Support.require_rspec_core "formatters/helpers" +RSpec::Support.require_rspec_core "shell_escape" + +module RSpec::Core + # Notifications are value objects passed to formatters to provide them + # with information about a particular event of interest. + module Notifications + # @private + module NullColorizer + module_function + + def wrap(line, _code_or_symbol) + line + end + end + + # The `StartNotification` represents a notification sent by the reporter + # when the suite is started. It contains the expected amount of examples + # to be executed, and the load time of RSpec. + # + # @attr count [Fixnum] the number counted + # @attr load_time [Float] the number of seconds taken to boot RSpec + # and load the spec files + StartNotification = Struct.new(:count, :load_time) + + # The `ExampleNotification` represents notifications sent by the reporter + # which contain information about the current (or soon to be) example. + # It is used by formatters to access information about that example. + # + # @example + # def example_started(notification) + # puts "Hey I started #{notification.example.description}" + # end + # + # @attr example [RSpec::Core::Example] the current example + ExampleNotification = Struct.new(:example) + class ExampleNotification + # @private + def self.for(example) + execution_result = example.execution_result + + return SkippedExampleNotification.new(example) if execution_result.example_skipped? + return new(example) unless execution_result.status == :pending || execution_result.status == :failed + + klass = if execution_result.pending_fixed? + PendingExampleFixedNotification + elsif execution_result.status == :pending + PendingExampleFailedAsExpectedNotification + else + FailedExampleNotification + end + + klass.new(example) + end + + private_class_method :new + end + + # The `ExamplesNotification` represents notifications sent by the reporter + # which contain information about the suites examples. + # + # @example + # def stop(notification) + # puts "Hey I ran #{notification.examples.size}" + # end + # + class ExamplesNotification + def initialize(reporter) + @reporter = reporter + end + + # @return [Array] list of examples + def examples + @reporter.examples + end + + # @return [Array] list of failed examples + def failed_examples + @reporter.failed_examples + end + + # @return [Array] list of pending examples + def pending_examples + @reporter.pending_examples + end + + # @return [Array] + # returns examples as notifications + def notifications + @notifications ||= format_examples(examples) + end + + # @return [Array] + # returns failed examples as notifications + def failure_notifications + @failed_notifications ||= format_examples(failed_examples) + end + + # @return [Array] + # returns pending examples as notifications + def pending_notifications + @pending_notifications ||= format_examples(pending_examples) + end + + # @return [String] The list of failed examples, fully formatted in the way + # that RSpec's built-in formatters emit. + def fully_formatted_failed_examples(colorizer=::RSpec::Core::Formatters::ConsoleCodes) + formatted = "\nFailures:\n" + + failure_notifications.each_with_index do |failure, index| + formatted += failure.fully_formatted(index.next, colorizer) + end + + formatted + end + + # @return [String] The list of pending examples, fully formatted in the + # way that RSpec's built-in formatters emit. + def fully_formatted_pending_examples(colorizer=::RSpec::Core::Formatters::ConsoleCodes) + return if RSpec.configuration.pending_failure_output == :skip + + formatted = "\nPending: (Failures listed here are expected and do not affect your suite's status)\n".dup + + pending_notifications.each_with_index do |notification, index| + formatted << notification.fully_formatted(index.next, colorizer) + end + + formatted + end + + private + + def format_examples(examples) + examples.map do |example| + ExampleNotification.for(example) + end + end + end + + # The `FailedExampleNotification` extends `ExampleNotification` with + # things useful for examples that have failure info -- typically a + # failed or pending spec. + # + # @example + # def example_failed(notification) + # puts "Hey I failed :(" + # puts "Here's my stack trace" + # puts notification.exception.backtrace.join("\n") + # end + # + # @attr [RSpec::Core::Example] example the current example + # @see ExampleNotification + class FailedExampleNotification < ExampleNotification + public_class_method :new + + # @return [Exception] The example failure + def exception + @exception_presenter.exception + end + + # @return [String] The example description + def description + @exception_presenter.description + end + + # Returns the message generated for this failure line by line. + # + # @return [Array] The example failure message + def message_lines + @exception_presenter.message_lines + end + + # Returns the message generated for this failure colorized line by line. + # + # @param colorizer [#wrap] An object to colorize the message_lines by + # @return [Array] The example failure message colorized + def colorized_message_lines(colorizer=::RSpec::Core::Formatters::ConsoleCodes) + @exception_presenter.colorized_message_lines(colorizer) + end + + # Returns the failures formatted backtrace. + # + # @return [Array] the examples backtrace lines + def formatted_backtrace + @exception_presenter.formatted_backtrace + end + + # Returns the failures colorized formatted backtrace. + # + # @param colorizer [#wrap] An object to colorize the message_lines by + # @return [Array] the examples colorized backtrace lines + def colorized_formatted_backtrace(colorizer=::RSpec::Core::Formatters::ConsoleCodes) + @exception_presenter.colorized_formatted_backtrace(colorizer) + end + + # @return [String] The failure information fully formatted in the way that + # RSpec's built-in formatters emit. + def fully_formatted(failure_number, colorizer=::RSpec::Core::Formatters::ConsoleCodes) + @exception_presenter.fully_formatted(failure_number, colorizer) + end + + # @return [Array] The failure information fully formatted in the way that + # RSpec's built-in formatters emit, split by line. + def fully_formatted_lines(failure_number, colorizer=::RSpec::Core::Formatters::ConsoleCodes) + @exception_presenter.fully_formatted_lines(failure_number, colorizer) + end + + private + + def initialize(example, exception_presenter=Formatters::ExceptionPresenter::Factory.new(example).build) + @exception_presenter = exception_presenter + super(example) + end + end + + # @deprecated Use {FailedExampleNotification} instead. + class PendingExampleFixedNotification < FailedExampleNotification; end + + # @deprecated Use {FailedExampleNotification} instead. + class PendingExampleFailedAsExpectedNotification < FailedExampleNotification; end + + # The `SkippedExampleNotification` extends `ExampleNotification` with + # things useful for specs that are skipped. + # + # @attr [RSpec::Core::Example] example the current example + # @see ExampleNotification + class SkippedExampleNotification < ExampleNotification + public_class_method :new + + # @return [String] The pending detail fully formatted in the way that + # RSpec's built-in formatters emit. + def fully_formatted(pending_number, colorizer=::RSpec::Core::Formatters::ConsoleCodes) + formatted_caller = RSpec.configuration.backtrace_formatter.backtrace_line(example.location) + + [ + colorizer.wrap("\n #{pending_number}) #{example.full_description}", :pending), + "\n ", + Formatters::ExceptionPresenter::PENDING_DETAIL_FORMATTER.call(example, colorizer), + "\n", + colorizer.wrap(" # #{formatted_caller}\n", :detail) + ].join("") + end + end + + # The `GroupNotification` represents notifications sent by the reporter + # which contain information about the currently running (or soon to be) + # example group. It is used by formatters to access information about that + # group. + # + # @example + # def example_group_started(notification) + # puts "Hey I started #{notification.group.description}" + # end + # @attr group [RSpec::Core::ExampleGroup] the current group + GroupNotification = Struct.new(:group) + + # The `MessageNotification` encapsulates generic messages that the reporter + # sends to formatters. + # + # @attr message [String] the message + MessageNotification = Struct.new(:message) + + # The `SeedNotification` holds the seed used to randomize examples and + # whether that seed has been used or not. + # + # @attr seed [Fixnum] the seed used to randomize ordering + # @attr used [Boolean] whether the seed has been used or not + SeedNotification = Struct.new(:seed, :used) + class SeedNotification + # @api + # @return [Boolean] has the seed been used? + def seed_used? + !!used + end + private :used + + # @return [String] The seed information fully formatted in the way that + # RSpec's built-in formatters emit. + def fully_formatted + "\nRandomized with seed #{seed}\n" + end + end + + # The `SummaryNotification` holds information about the results of running + # a test suite. It is used by formatters to provide information at the end + # of the test run. + # + # @attr duration [Float] the time taken (in seconds) to run the suite + # @attr examples [Array] the examples run + # @attr failed_examples [Array] the failed examples + # @attr pending_examples [Array] the pending examples + # @attr load_time [Float] the number of seconds taken to boot RSpec + # and load the spec files + # @attr errors_outside_of_examples_count [Integer] the number of errors that + # have occurred processing + # the spec suite + SummaryNotification = Struct.new(:duration, :examples, :failed_examples, + :pending_examples, :load_time, + :errors_outside_of_examples_count) + class SummaryNotification + # @api + # @return [Fixnum] the number of examples run + def example_count + @example_count ||= examples.size + end + + # @api + # @return [Fixnum] the number of failed examples + def failure_count + @failure_count ||= failed_examples.size + end + + # @api + # @return [Fixnum] the number of pending examples + def pending_count + @pending_count ||= pending_examples.size + end + + # @api + # @return [String] A line summarising the result totals of the spec run. + def totals_line + summary = Formatters::Helpers.pluralize(example_count, "example") + + ", " + Formatters::Helpers.pluralize(failure_count, "failure") + summary += ", #{pending_count} pending" if pending_count > 0 + if errors_outside_of_examples_count > 0 + summary += ( + ", " + + Formatters::Helpers.pluralize(errors_outside_of_examples_count, "error") + + " occurred outside of examples" + ) + end + summary + end + + # @api public + # + # Wraps the results line with colors based on the configured + # colors for failure, pending, and success. Defaults to red, + # yellow, green accordingly. + # + # @param colorizer [#wrap] An object which supports wrapping text with + # specific colors. + # @return [String] A colorized results line. + def colorized_totals_line(colorizer=::RSpec::Core::Formatters::ConsoleCodes) + if failure_count > 0 || errors_outside_of_examples_count > 0 + colorizer.wrap(totals_line, RSpec.configuration.failure_color) + elsif pending_count > 0 + colorizer.wrap(totals_line, RSpec.configuration.pending_color) + else + colorizer.wrap(totals_line, RSpec.configuration.success_color) + end + end + + # @api public + # + # Formats failures into a rerunable command format. + # + # @param colorizer [#wrap] An object which supports wrapping text with + # specific colors. + # @return [String] A colorized summary line. + def colorized_rerun_commands(colorizer=::RSpec::Core::Formatters::ConsoleCodes) + "\nFailed examples:\n\n" + + failed_examples.map do |example| + colorizer.wrap("rspec #{rerun_argument_for(example)}", RSpec.configuration.failure_color) + " " + + colorizer.wrap("# #{example.full_description}", RSpec.configuration.detail_color) + end.join("\n") + end + + # @return [String] a formatted version of the time it took to run the + # suite + def formatted_duration + Formatters::Helpers.format_duration(duration) + end + + # @return [String] a formatted version of the time it took to boot RSpec + # and load the spec files + def formatted_load_time + Formatters::Helpers.format_duration(load_time) + end + + # @return [String] The summary information fully formatted in the way that + # RSpec's built-in formatters emit. + def fully_formatted(colorizer=::RSpec::Core::Formatters::ConsoleCodes) + formatted = "\nFinished in #{formatted_duration} " \ + "(files took #{formatted_load_time} to load)\n" \ + "#{colorized_totals_line(colorizer)}\n" + + unless failed_examples.empty? + formatted += (colorized_rerun_commands(colorizer) + "\n") + end + + formatted + end + + private + + include RSpec::Core::ShellEscape + + def rerun_argument_for(example) + location = example.location_rerun_argument + return location unless duplicate_rerun_locations.include?(location) + conditionally_quote(example.id) + end + + def duplicate_rerun_locations + @duplicate_rerun_locations ||= begin + locations = RSpec.world.all_examples.map(&:location_rerun_argument) + + Set.new.tap do |s| + locations.group_by { |l| l }.each do |l, ls| + s << l if ls.count > 1 + end + end + end + end + end + + # The `ProfileNotification` holds information about the results of running a + # test suite when profiling is enabled. It is used by formatters to provide + # information at the end of the test run for profiling information. + # + # @attr duration [Float] the time taken (in seconds) to run the suite + # @attr examples [Array] the examples run + # @attr number_of_examples [Fixnum] the number of examples to profile + # @attr example_groups [Array] example groups run + class ProfileNotification + def initialize(duration, examples, number_of_examples, example_groups) + @duration = duration + @examples = examples + @number_of_examples = number_of_examples + @example_groups = example_groups + end + attr_reader :duration, :examples, :number_of_examples + + # @return [Array] the slowest examples + def slowest_examples + @slowest_examples ||= + examples.sort_by do |example| + -example.execution_result.run_time + end.first(number_of_examples) + end + + # @return [Float] the time taken (in seconds) to run the slowest examples + def slow_duration + @slow_duration ||= + slowest_examples.inject(0.0) do |i, e| + i + e.execution_result.run_time + end + end + + # @return [String] the percentage of total time taken + def percentage + @percentage ||= + begin + time_taken = slow_duration / duration + '%.1f' % ((time_taken.nan? ? 0.0 : time_taken) * 100) + end + end + + # @return [Array] the slowest example groups + def slowest_groups + @slowest_groups ||= calculate_slowest_groups + end + + private + + def calculate_slowest_groups + # stop if we've only one example group + return {} if @example_groups.keys.length <= 1 + + @example_groups.each_value do |hash| + hash[:average] = hash[:total_time].to_f / hash[:count] + end + + groups = @example_groups.sort_by { |_, hash| -hash[:average] }.first(number_of_examples) + groups.map { |group, data| [group.location, data] } + end + end + + # The `DeprecationNotification` is issued by the reporter when a deprecated + # part of RSpec is encountered. It represents information about the + # deprecated call site. + # + # @attr message [String] A custom message about the deprecation + # @attr deprecated [String] A custom message about the deprecation (alias of + # message) + # @attr replacement [String] An optional replacement for the deprecation + # @attr call_site [String] An optional call site from which the deprecation + # was issued + DeprecationNotification = Struct.new(:deprecated, :message, :replacement, :call_site) + class DeprecationNotification + private_class_method :new + + # @api + # Convenience way to initialize the notification + def self.from_hash(data) + new data[:deprecated], data[:message], data[:replacement], data[:call_site] + end + end + + # `NullNotification` represents a placeholder value for notifications that + # currently require no information, but we may wish to extend in future. + class NullNotification + end + + # `CustomNotification` is used when sending custom events to formatters / + # other registered listeners, it creates attributes based on supplied hash + # of options. + class CustomNotification < Struct + # @param options [Hash] A hash of method / value pairs to create on this notification + # @return [CustomNotification] + # + # Build a custom notification based on the supplied option key / values. + def self.for(options={}) + return NullNotification if options.keys.empty? + new(*options.keys).new(*options.values) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/option_parser.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/option_parser.rb new file mode 100644 index 0000000..e239e87 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/option_parser.rb @@ -0,0 +1,325 @@ +# http://www.ruby-doc.org/stdlib/libdoc/optparse/rdoc/classes/OptionParser.html +require 'optparse' + +module RSpec::Core + # @private + class Parser + def self.parse(args, source=nil) + new(args).parse(source) + end + + attr_reader :original_args + + def initialize(original_args) + @original_args = original_args + end + + def parse(source=nil) + return { :files_or_directories_to_run => [] } if original_args.empty? + args = original_args.dup + + options = args.delete('--tty') ? { :tty => true } : {} + begin + parser(options).parse!(args) + rescue OptionParser::InvalidOption => e + abort "#{e.message}#{" (defined in #{source})" if source}\n\n" \ + "Please use --help for a listing of valid options" + end + + options[:files_or_directories_to_run] = args + options + end + + private + + # rubocop:disable Metrics/AbcSize + # rubocop:disable Metrics/MethodLength + # rubocop:disable Metrics/CyclomaticComplexity + # rubocop:disable Metrics/PerceivedComplexity + def parser(options) + OptionParser.new do |parser| + parser.summary_width = 34 + + parser.banner = "Usage: rspec [options] [files or directories]\n\n" + + parser.on('-I PATH', 'Specify PATH to add to $LOAD_PATH (may be used more than once).') do |dirs| + options[:libs] ||= [] + options[:libs].concat(dirs.split(File::PATH_SEPARATOR)) + end + + parser.on('-r', '--require PATH', 'Require a file.') do |path| + options[:requires] ||= [] + options[:requires] << path + end + + parser.on('-O', '--options PATH', 'Specify the path to a custom options file.') do |path| + options[:custom_options_file] = path + end + + parser.on('--order TYPE[:SEED]', 'Run examples by the specified order type.', + ' [defined] examples and groups are run in the order they are defined', + ' [rand] randomize the order of groups and examples', + ' [random] alias for rand', + ' [random:SEED] e.g. --order random:123', + ' [recently-modified] run the most recently modified files first') do |o| + options[:order] = o + end + + parser.on('--seed SEED', Integer, 'Equivalent of --order rand:SEED.') do |seed| + options[:order] = "rand:#{seed}" + end + + parser.on('--bisect[=verbose]', 'Repeatedly runs the suite in order to isolate the failures to the ', + ' smallest reproducible case.') do |argument| + options[:bisect] = argument || true + options[:runner] = RSpec::Core::Invocations::Bisect.new + end + + parser.on('--[no-]fail-fast[=COUNT]', 'Abort the run after a certain number of failures (1 by default).') do |argument| + if argument == true + value = 1 + elsif argument == false || argument == 0 + value = false + else + begin + value = Integer(argument) + rescue ArgumentError + RSpec.warning "Expected an integer value for `--fail-fast`, got: #{argument.inspect}", :call_site => nil + end + end + set_fail_fast(options, value) + end + + parser.on('--failure-exit-code CODE', Integer, + 'Override the exit code used when there are failing specs.') do |code| + options[:failure_exit_code] = code + end + + parser.on('--error-exit-code CODE', Integer, + 'Override the exit code used when there are errors loading or running specs outside of examples.') do |code| + options[:error_exit_code] = code + end + + parser.on('-X', '--[no-]drb', 'Run examples via DRb.') do |use_drb| + options[:drb] = use_drb + options[:runner] = RSpec::Core::Invocations::DRbWithFallback.new if use_drb + end + + parser.on('--drb-port PORT', 'Port to connect to the DRb server.') do |o| + options[:drb_port] = o.to_i + end + + parser.separator("\n **** Output ****\n\n") + + parser.on('-f', '--format FORMATTER', 'Choose a formatter.', + ' [p]rogress (default - dots)', + ' [d]ocumentation (group and example names)', + ' [h]tml', + ' [j]son', + ' [f]ailures ("file:line:reason", suitable for editors integration)', + ' custom formatter class name') do |o| + options[:formatters] ||= [] + options[:formatters] << [o] + end + + parser.on('-o', '--out FILE', + 'Write output to a file instead of $stdout. This option applies', + ' to the previously specified --format, or the default format', + ' if no format is specified.' + ) do |o| + options[:formatters] ||= [['progress']] + options[:formatters].last << o + end + + parser.on('--deprecation-out FILE', 'Write deprecation warnings to a file instead of $stderr.') do |file| + options[:deprecation_stream] = file + end + + parser.on('-b', '--backtrace', 'Enable full backtrace.') do |_o| + options[:full_backtrace] = true + end + + parser.on('-c', '--color', '--colour', '') do |_o| + # flag will be excluded from `--help` output because it is deprecated + options[:color] = true + options[:color_mode] = :automatic + end + + parser.on('--force-color', '--force-colour', 'Force the output to be in color, even if the output is not a TTY') do |_o| + if options[:color_mode] == :off + abort "Please only use one of `--force-color` and `--no-color`" + end + options[:color_mode] = :on + end + + parser.on('--no-color', '--no-colour', 'Force the output to not be in color, even if the output is a TTY') do |_o| + if options[:color_mode] == :on + abort "Please only use one of --force-color and --no-color" + end + options[:color_mode] = :off + end + + parser.on('-p', '--[no-]profile [COUNT]', + 'Enable profiling of examples and list the slowest examples (default: 10).') do |argument| + options[:profile_examples] = if argument.nil? + true + elsif argument == false + false + else + begin + Integer(argument) + rescue ArgumentError + RSpec.warning "Non integer specified as profile count, separate " \ + "your path from options with -- e.g. " \ + "`rspec --profile -- #{argument}`", + :call_site => nil + true + end + end + end + + parser.on('--dry-run', 'Print the formatter output of your suite without', + ' running any examples or hooks') do |_o| + options[:dry_run] = true + end + + parser.on('-w', '--warnings', 'Enable ruby warnings') do + if Object.const_defined?(:Warning) && Warning.respond_to?(:[]=) + # :nocov: on older Ruby without Warning + Warning[:deprecated] = true + # :nocov: + end + $VERBOSE = true + end + + parser.separator <<-FILTERING + + **** Filtering/tags **** + + In addition to the following options for selecting specific files, groups, or + examples, you can select individual examples by appending the line number(s) to + the filename: + + rspec path/to/a_spec.rb:37:87 + + You can also pass example ids enclosed in square brackets: + + rspec path/to/a_spec.rb[1:5,1:6] # run the 5th and 6th examples/groups defined in the 1st group + +FILTERING + + parser.on('--only-failures', "Filter to just the examples that failed the last time they ran.") do + configure_only_failures(options) + end + + parser.on("-n", "--next-failure", "Apply `--only-failures` and abort after one failure.", + " (Equivalent to `--only-failures --fail-fast --order defined`)") do + configure_only_failures(options) + set_fail_fast(options, 1) + options[:order] ||= 'defined' + end + + parser.on('-P', '--pattern PATTERN', 'Load files matching pattern (default: "spec/**/*_spec.rb").') do |o| + if options[:pattern] + options[:pattern] += ',' + o + else + options[:pattern] = o + end + end + + parser.on('--exclude-pattern PATTERN', + 'Load files except those matching pattern. Opposite effect of --pattern.') do |o| + options[:exclude_pattern] = o + end + + parser.on('-e', '--example STRING', "Run examples whose full nested names include STRING (may be", + " used more than once)") do |o| + (options[:full_description] ||= []) << Regexp.compile(Regexp.escape(o)) + end + + parser.on('-E', '--example-matches REGEX', "Run examples whose full nested names match REGEX (may be", + " used more than once)") do |o| + (options[:full_description] ||= []) << Regexp.compile(o) + end + + parser.on('-t', '--tag TAG[:VALUE]', + 'Run examples with the specified tag, or exclude examples', + 'by adding ~ before the tag.', + ' - e.g. ~slow', + ' - TAG is always converted to a symbol') do |tag| + filter_type = tag =~ /^~/ ? :exclusion_filter : :inclusion_filter + + name, value = tag.gsub(/^(~@|~|@)/, '').split(':', 2) + name = name.to_sym + + parsed_value = case value + when nil then true # The default value for tags is true + when 'true' then true + when 'false' then false + when 'nil' then nil + when /^:/ then value[1..-1].to_sym + when /^\d+$/ then Integer(value) + when /^\d+.\d+$/ then Float(value) + else + value + end + + add_tag_filter(options, filter_type, name, parsed_value) + end + + parser.on('--default-path PATH', 'Set the default path where RSpec looks for examples (can', + ' be a path to a file or a directory).') do |path| + options[:default_path] = path + end + + parser.separator("\n **** Utility ****\n\n") + + parser.on('--init', 'Initialize your project with RSpec.') do |_cmd| + options[:runner] = RSpec::Core::Invocations::InitializeProject.new + end + + parser.on('-v', '--version', 'Display the version.') do + options[:runner] = RSpec::Core::Invocations::PrintVersion.new + end + + # These options would otherwise be confusing to users, so we forcibly + # prevent them from executing. + # + # * --I is too similar to -I. + # * -d was a shorthand for --debugger, which is removed, but now would + # trigger --default-path. + invalid_options = %w[-d --I] + + hidden_options = invalid_options + %w[-c] + + parser.on_tail('-h', '--help', "You're looking at it.") do + options[:runner] = RSpec::Core::Invocations::PrintHelp.new(parser, hidden_options) + end + + # This prevents usage of the invalid_options. + invalid_options.each do |option| + parser.on(option) do + raise OptionParser::InvalidOption.new + end + end + end + end + # rubocop:enable Metrics/AbcSize + # rubocop:enable Metrics/MethodLength + # rubocop:enable Metrics/CyclomaticComplexity + # rubocop:enable Metrics/PerceivedComplexity + + def add_tag_filter(options, filter_type, tag_name, value=true) + (options[filter_type] ||= {})[tag_name] = value + end + + def set_fail_fast(options, value) + options[:fail_fast] = value + end + + def configure_only_failures(options) + options[:only_failures] = true + add_tag_filter(options, :inclusion_filter, :last_run_status, 'failed') + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/ordering.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/ordering.rb new file mode 100644 index 0000000..6058a2f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/ordering.rb @@ -0,0 +1,208 @@ +module RSpec + module Core + # @private + module Ordering + # @private + # The default global ordering (defined order). + class Identity + def order(items) + items + end + end + + # @private + # Orders items randomly. + class Random + def initialize(configuration) + @configuration = configuration + @used = false + end + + def used? + @used + end + + def order(items) + @used = true + + seed = @configuration.seed.to_s + items.sort_by { |item| jenkins_hash_digest(seed + item.id) } + end + + private + + # http://en.wikipedia.org/wiki/Jenkins_hash_function + # Jenkins provides a good distribution and is simpler than MD5. + # It's a bit slower than MD5 (primarily because `Digest::MD5` is + # implemented in C) but has the advantage of not requiring us + # to load another part of stdlib, which we try to minimize. + def jenkins_hash_digest(string) + hash = 0 + + string.each_byte do |byte| + hash += byte + hash &= MAX_32_BIT + hash += ((hash << 10) & MAX_32_BIT) + hash &= MAX_32_BIT + hash ^= hash >> 6 + end + + hash += ((hash << 3) & MAX_32_BIT) + hash &= MAX_32_BIT + hash ^= hash >> 11 + hash += ((hash << 15) & MAX_32_BIT) + hash &= MAX_32_BIT + hash + end + + MAX_32_BIT = 4_294_967_295 + end + + # @private + # Orders items by modification time (most recent modified first). + class RecentlyModified + def order(list) + list.sort_by { |item| -File.mtime(item.metadata[:absolute_file_path]).to_i } + end + end + + # @private + # Orders items based on a custom block. + class Custom + def initialize(callable) + @callable = callable + end + + def order(list) + @callable.call(list) + end + end + + # @private + # A strategy which delays looking up the ordering until needed + class Delayed + def initialize(registry, name) + @registry = registry + @name = name + end + + def order(list) + strategy.order(list) + end + + private + + def strategy + @strategy ||= lookup_strategy + end + + def lookup_strategy + raise "Undefined ordering strategy #{@name.inspect}" unless @registry.has_strategy?(@name) + @registry.fetch(@name) + end + end + + # @private + # Stores the different ordering strategies. + class Registry + def initialize(configuration) + @configuration = configuration + @strategies = {} + + register(:random, Random.new(configuration)) + register(:recently_modified, RecentlyModified.new) + + identity = Identity.new + register(:defined, identity) + + # The default global ordering is --defined. + register(:global, identity) + end + + def fetch(name, &fallback) + @strategies.fetch(name, &fallback) + end + + def has_strategy?(name) + @strategies.key?(name) + end + + def register(sym, strategy) + @strategies[sym] = strategy + end + + def used_random_seed? + @strategies[:random].used? + end + end + + # @private + # Manages ordering configuration. + # + # @note This is not intended to be used externally. Use + # the APIs provided by `RSpec::Core::Configuration` instead. + class ConfigurationManager + attr_reader :seed, :ordering_registry + + def initialize + @ordering_registry = Registry.new(self) + @seed = rand(0xFFFF) + @seed_forced = false + @order_forced = false + end + + def seed_used? + ordering_registry.used_random_seed? + end + + def seed=(seed) + return if @seed_forced + register_ordering(:global, ordering_registry.fetch(:random)) + @seed = seed.to_i + end + + def order=(type) + order, seed = type.to_s.split(':') + @seed = seed.to_i if seed + + ordering_name = if order.include?('rand') + :random + elsif order == 'defined' + :defined + elsif order == 'recently-modified' + :recently_modified + else + order.to_sym + end + + if ordering_name + strategy = + if ordering_registry.has_strategy?(ordering_name) + ordering_registry.fetch(ordering_name) + else + Delayed.new(ordering_registry, ordering_name) + end + + register_ordering(:global, strategy) + end + end + + def force(hash) + if hash.key?(:seed) + self.seed = hash[:seed] + @seed_forced = true + @order_forced = true + elsif hash.key?(:order) + self.order = hash[:order] + @order_forced = true + end + end + + def register_ordering(name, strategy=Custom.new(Proc.new { |l| yield l })) + return if @order_forced && name == :global + ordering_registry.register(name, strategy) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/output_wrapper.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/output_wrapper.rb new file mode 100644 index 0000000..8e07aa8 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/output_wrapper.rb @@ -0,0 +1,29 @@ +module RSpec + module Core + # @private + class OutputWrapper + # @private + attr_accessor :output + + # @private + def initialize(output) + @output = output + end + + def respond_to?(name, priv=false) + output.respond_to?(name, priv) + end + + def method_missing(name, *args, &block) + output.__send__(name, *args, &block) + end + + # Redirect calls for IO interface methods + IO.instance_methods(false).each do |method| + define_method(method) do |*args, &block| + output.__send__(method, *args, &block) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/pending.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/pending.rb new file mode 100644 index 0000000..c6c59c1 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/pending.rb @@ -0,0 +1,157 @@ +module RSpec + module Core + # Provides methods to mark examples as pending. These methods are available + # to be called from within any example or hook. + module Pending + # Raised in the middle of an example to indicate that it should be marked + # as skipped. + class SkipDeclaredInExample < StandardError + attr_reader :argument + + def initialize(argument) + @argument = argument + end + end + + # If Test::Unit is loaded, we'll use its error as baseclass, so that + # Test::Unit will report unmet RSpec expectations as failures rather than + # errors. + begin + class PendingExampleFixedError < Test::Unit::AssertionFailedError; end + rescue + class PendingExampleFixedError < StandardError; end + end + + # @private + NO_REASON_GIVEN = 'No reason given' + + # @private + NOT_YET_IMPLEMENTED = 'Not yet implemented' + + # @overload pending() + # @overload pending(message) + # + # Marks an example as pending. The rest of the example will still be + # executed, and if it passes the example will fail to indicate that the + # pending can be removed. + # + # @param message [String] optional message to add to the summary report. + # + # @example + # describe "some behaviour" do + # # reported as "Pending: no reason given" + # it "is pending with no message" do + # pending + # raise "broken" + # end + # + # # reported as "Pending: something else getting finished" + # it "is pending with a custom message" do + # pending("something else getting finished") + # raise "broken" + # end + # end + # + # @note When using `pending` inside an example body using this method + # hooks, such as `before(:example)`, have already be run. This means that + # a failure from the code in the `before` hook will prevent the example + # from being considered pending, as the example body would not be + # executed. If you need to consider hooks as pending as well you can use + # the pending metadata as an alternative, e.g. + # `it "does something", pending: "message"`. + def pending(message=nil, &_block) + current_example = RSpec.current_example + + if block_given? + raise ArgumentError, <<-EOS.gsub(/^\s+\|/, '') + |The semantics of `RSpec::Core::Pending#pending` have changed in + |RSpec 3. In RSpec 2.x, it caused the example to be skipped. In + |RSpec 3, the rest of the example is still run but is expected to + |fail, and will be marked as a failure (rather than as pending) if + |the example passes. + | + |Passing a block within an example is now deprecated. Marking the + |example as pending provides the same behavior in RSpec 3 which was + |provided only by the block in RSpec 2.x. + | + |Move the code in the block provided to `pending` into the rest of + |the example body. + | + |Called from #{CallerFilter.first_non_rspec_line}. + | + EOS + elsif current_example + Pending.mark_pending! current_example, message + else + raise "`pending` may not be used outside of examples, such as in " \ + "before(:context). Maybe you want `skip`?" + end + end + + # @overload skip() + # @overload skip(message) + # + # Marks an example as pending and skips execution. + # + # @param message [String] optional message to add to the summary report. + # + # @example + # describe "an example" do + # # reported as "Pending: no reason given" + # it "is skipped with no message" do + # skip + # end + # + # # reported as "Pending: something else getting finished" + # it "is skipped with a custom message" do + # skip "something else getting finished" + # end + # end + def skip(message=nil) + current_example = RSpec.current_example + + Pending.mark_skipped!(current_example, message) if current_example + + raise SkipDeclaredInExample.new(message) + end + + # @private + # + # Mark example as skipped. + # + # @param example [RSpec::Core::Example] the example to mark as skipped + # @param message_or_bool [Boolean, String] the message to use, or true + def self.mark_skipped!(example, message_or_bool) + Pending.mark_pending! example, message_or_bool + example.metadata[:skip] = true + end + + # @private + # + # Mark example as pending. + # + # @param example [RSpec::Core::Example] the example to mark as pending + # @param message_or_bool [Boolean, String] the message to use, or true + def self.mark_pending!(example, message_or_bool) + message = if !message_or_bool || !(String === message_or_bool) + NO_REASON_GIVEN + else + message_or_bool + end + + example.metadata[:pending] = true + example.execution_result.pending_message = message + example.execution_result.pending_fixed = false + end + + # @private + # + # Mark example as fixed. + # + # @param example [RSpec::Core::Example] the example to mark as fixed + def self.mark_fixed!(example) + example.execution_result.pending_fixed = true + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/profiler.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/profiler.rb new file mode 100644 index 0000000..5e65279 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/profiler.rb @@ -0,0 +1,34 @@ +module RSpec + module Core + # @private + class Profiler + NOTIFICATIONS = [:example_group_started, :example_group_finished, :example_started] + + def initialize + @example_groups = Hash.new { |h, k| h[k] = { :count => 0 } } + end + + attr_reader :example_groups + + def example_group_started(notification) + return unless notification.group.top_level? + + @example_groups[notification.group][:start] = Time.now + @example_groups[notification.group][:description] = notification.group.top_level_description + end + + def example_group_finished(notification) + return unless notification.group.top_level? + + group = @example_groups[notification.group] + return unless group.key?(:start) + group[:total_time] = Time.now - group[:start] + end + + def example_started(notification) + group = notification.example.example_group.parent_groups.last + @example_groups[group][:count] += 1 + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer.rb new file mode 100644 index 0000000..ca707e0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer.rb @@ -0,0 +1,48 @@ +RSpec::Support.require_rspec_support "directory_maker" + +module RSpec + module Core + # @private + # Generates conventional files for an RSpec project. + class ProjectInitializer + attr_reader :destination, :stream, :template_path + + DOT_RSPEC_FILE = '.rspec' + SPEC_HELPER_FILE = 'spec/spec_helper.rb' + + def initialize(opts={}) + @destination = opts.fetch(:destination, Dir.getwd) + @stream = opts.fetch(:report_stream, $stdout) + @template_path = opts.fetch(:template_path) do + File.expand_path("../project_initializer", __FILE__) + end + end + + def run + copy_template DOT_RSPEC_FILE + copy_template SPEC_HELPER_FILE + end + + private + + def copy_template(file) + destination_file = File.join(destination, file) + return report_exists(file) if File.exist?(destination_file) + + report_creating(file) + RSpec::Support::DirectoryMaker.mkdir_p(File.dirname(destination_file)) + File.open(destination_file, 'w') do |f| + f.write File.read(File.join(template_path, file)) + end + end + + def report_exists(file) + stream.puts " exist #{file}" + end + + def report_creating(file) + stream.puts " create #{file}" + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer/.rspec b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer/.rspec new file mode 100644 index 0000000..c99d2e7 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer/spec/spec_helper.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer/spec/spec_helper.rb new file mode 100644 index 0000000..c80d44b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer/spec/spec_helper.rb @@ -0,0 +1,98 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See https://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # https://rspec.info/features/3-12/rspec-core/configuration/zero-monkey-patching-mode/ + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/rake_task.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/rake_task.rb new file mode 100644 index 0000000..1b60db0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/rake_task.rb @@ -0,0 +1,190 @@ +require 'rake' +require 'rake/tasklib' +require 'rspec/support' + +RSpec::Support.require_rspec_support "ruby_features" + +# :nocov: +unless RSpec::Support.respond_to?(:require_rspec_core) + RSpec::Support.define_optimized_require_for_rspec(:core) { |f| require_relative "../#{f}" } +end +# :nocov: + +RSpec::Support.require_rspec_core "shell_escape" + +module RSpec + module Core + # RSpec rake task + # + # @see Rakefile + class RakeTask < ::Rake::TaskLib + include ::Rake::DSL if defined?(::Rake::DSL) + include RSpec::Core::ShellEscape + + # Default path to the RSpec executable. + DEFAULT_RSPEC_PATH = File.expand_path('../../../../exe/rspec', __FILE__) + + # Default pattern for spec files. + DEFAULT_PATTERN = 'spec/**{,/*/**}/*_spec.rb' + + # Name of task. Defaults to `:spec`. + attr_accessor :name + + # Files matching this pattern will be loaded. + # Defaults to `'spec/**{,/*/**}/*_spec.rb'`. + attr_accessor :pattern + + # Files matching this pattern will be excluded. + # Defaults to `nil`. + attr_accessor :exclude_pattern + + # Whether or not to fail Rake when an error occurs (typically when + # examples fail). Defaults to `true`. + attr_accessor :fail_on_error + + # A message to print to stderr when there are failures. + attr_accessor :failure_message + + if RUBY_VERSION < "1.9.0" || Support::Ruby.jruby? + # Run RSpec with a clean (empty) environment is not supported + # :nocov: + def with_clean_environment=(_value) + raise ArgumentError, "Running in a clean environment is not supported on Ruby versions before 1.9.0" + end + + # Run RSpec with a clean (empty) environment is not supported + def with_clean_environment + false + end + # :nocov: + else + # Run RSpec with a clean (empty) environment. + attr_accessor :with_clean_environment + end + + # Use verbose output. If this is set to true, the task will print the + # executed spec command to stdout. Defaults to `true`. + attr_accessor :verbose + + # Command line options to pass to ruby. Defaults to `nil`. + attr_accessor :ruby_opts + + # Path to RSpec. Defaults to the absolute path to the + # rspec binary from the loaded rspec-core gem. + attr_accessor :rspec_path + + # Command line options to pass to RSpec. Defaults to `nil`. + attr_accessor :rspec_opts + + def initialize(*args, &task_block) + @name = args.shift || :spec + @ruby_opts = nil + @rspec_opts = nil + @verbose = true + @fail_on_error = true + @rspec_path = DEFAULT_RSPEC_PATH + @pattern = DEFAULT_PATTERN + + define(args, &task_block) + end + + # @private + def run_task(verbose) + command = spec_command + puts command if verbose + + if with_clean_environment + return if system({}, command, :unsetenv_others => true) + else + return if system(command) + end + + puts failure_message if failure_message + + return unless fail_on_error + $stderr.puts "#{command} failed" if verbose + exit $?.exitstatus || 1 + end + + private + + # @private + def define(args, &task_block) + desc "Run RSpec code examples" unless ::Rake.application.last_description + + task name, *args do |_, task_args| + RakeFileUtils.__send__(:verbose, verbose) do + task_block.call(*[self, task_args].slice(0, task_block.arity)) if task_block + run_task verbose + end + end + end + + def file_inclusion_specification + if ENV['SPEC'] + FileList[ENV['SPEC']].sort + elsif String === pattern && !File.exist?(pattern) + return if [*rspec_opts].any? { |opt| opt =~ /--pattern/ } + "--pattern #{escape pattern}" + else + # Before RSpec 3.1, we used `FileList` to get the list of matched + # files, and then pass that along to the `rspec` command. Starting + # with 3.1, we prefer to pass along the pattern as-is to the `rspec` + # command, for 3 reasons: + # + # * It's *much* less verbose to pass one `--pattern` option than a + # long list of files. + # * It ensures `task.pattern` and `--pattern` have the same + # behavior. + # * It fixes a bug, where + # `task.pattern = pattern_that_matches_no_files` would run *all* + # files because it would cause no pattern or file args to get + # passed to `rspec`, which causes all files to get run. + # + # However, `FileList` is *far* more flexible than the `--pattern` + # option. Specifically, it supports individual files and directories, + # as well as arrays of files, directories and globs, as well as other + # `FileList` objects. + # + # For backwards compatibility, we have to fall back to using FileList + # if the user has passed a `pattern` option that will not work with + # `--pattern`. + # + # TODO: consider deprecating support for this and removing it in + # RSpec 4. + FileList[pattern].sort.map { |file| escape file } + end + end + + def file_exclusion_specification + " --exclude-pattern #{escape exclude_pattern}" if exclude_pattern + end + + def spec_command + cmd_parts = [] + cmd_parts << RUBY + cmd_parts << ruby_opts + cmd_parts << rspec_load_path + cmd_parts << escape(rspec_path) + cmd_parts << file_inclusion_specification + cmd_parts << file_exclusion_specification + cmd_parts << rspec_opts + cmd_parts.flatten.reject(&blank).join(" ") + end + + def blank + lambda { |s| s.nil? || s == "" } + end + + def rspec_load_path + @rspec_load_path ||= begin + core_and_support = $LOAD_PATH.grep( + /#{File::SEPARATOR}rspec-(core|support)[^#{File::SEPARATOR}]*#{File::SEPARATOR}lib/ + ).uniq + + "-I#{core_and_support.map { |file| escape file }.join(File::PATH_SEPARATOR)}" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/reporter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/reporter.rb new file mode 100644 index 0000000..d513f3f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/reporter.rb @@ -0,0 +1,266 @@ +module RSpec::Core + # A reporter will send notifications to listeners, usually formatters for the + # spec suite run. + class Reporter + # @private + RSPEC_NOTIFICATIONS = Set.new( + [ + :close, :deprecation, :deprecation_summary, :dump_failures, :dump_pending, + :dump_profile, :dump_summary, :example_failed, :example_group_finished, + :example_group_started, :example_passed, :example_pending, :example_started, + :message, :seed, :start, :start_dump, :stop, :example_finished + ]) + + def initialize(configuration) + @configuration = configuration + @listeners = Hash.new { |h, k| h[k] = Set.new } + @examples = [] + @failed_examples = [] + @pending_examples = [] + @duration = @start = @load_time = nil + @non_example_exception_count = 0 + @setup_default = lambda {} + @setup = false + @profiler = nil + end + + # @private + attr_reader :examples, :failed_examples, :pending_examples + + # Registers a listener to a list of notifications. The reporter will send + # notification of events to all registered listeners. + # + # @param listener [Object] An object that wishes to be notified of reporter + # events + # @param notifications [Array] Array of symbols represents the events a + # listener wishes to subscribe too + def register_listener(listener, *notifications) + notifications.each do |notification| + @listeners[notification.to_sym] << listener + end + true + end + + # @private + def prepare_default(loader, output_stream, deprecation_stream) + @setup_default = lambda do + loader.setup_default output_stream, deprecation_stream + end + end + + # @private + def registered_listeners(notification) + @listeners[notification].to_a + end + + # @overload report(count, &block) + # @overload report(count, &block) + # @param expected_example_count [Integer] the number of examples being run + # @yield [Block] block yields itself for further reporting. + # + # Initializes the report run and yields itself for further reporting. The + # block is required, so that the reporter can manage cleaning up after the + # run. + # + # @example + # + # reporter.report(group.examples.size) do |r| + # example_groups.map {|g| g.run(r) } + # end + # + def report(expected_example_count) + start(expected_example_count) + begin + yield self + ensure + finish + end + end + + # @param exit_code [Integer] the exit_code to be return by the reporter + # + # Reports a run that exited early without having run any examples. + # + def exit_early(exit_code) + report(0) { exit_code } + end + + # @private + def start(expected_example_count, time=RSpec::Core::Time.now) + @start = time + @load_time = (@start - @configuration.start_time).to_f + notify :seed, Notifications::SeedNotification.new(@configuration.seed, seed_used?) + notify :start, Notifications::StartNotification.new(expected_example_count, @load_time) + end + + # @param message [#to_s] A message object to send to formatters + # + # Send a custom message to supporting formatters. + def message(message) + notify :message, Notifications::MessageNotification.new(message) + end + + # @param event [Symbol] Name of the custom event to trigger on formatters + # @param options [Hash] Hash of arguments to provide via `CustomNotification` + # + # Publish a custom event to supporting registered formatters. + # @see RSpec::Core::Notifications::CustomNotification + def publish(event, options={}) + if RSPEC_NOTIFICATIONS.include? event + raise "RSpec::Core::Reporter#publish is intended for sending custom " \ + "events not internal RSpec ones, please rename your custom event." + end + notify event, Notifications::CustomNotification.for(options) + end + + # @private + def example_group_started(group) + notify :example_group_started, Notifications::GroupNotification.new(group) unless group.descendant_filtered_examples.empty? + end + + # @private + def example_group_finished(group) + notify :example_group_finished, Notifications::GroupNotification.new(group) unless group.descendant_filtered_examples.empty? + end + + # @private + def example_started(example) + @examples << example + notify :example_started, Notifications::ExampleNotification.for(example) + end + + # @private + def example_finished(example) + notify :example_finished, Notifications::ExampleNotification.for(example) + end + + # @private + def example_passed(example) + notify :example_passed, Notifications::ExampleNotification.for(example) + end + + # @private + def example_failed(example) + @failed_examples << example + notify :example_failed, Notifications::ExampleNotification.for(example) + end + + # @private + def example_pending(example) + @pending_examples << example + notify :example_pending, Notifications::ExampleNotification.for(example) + end + + # @private + def deprecation(hash) + notify :deprecation, Notifications::DeprecationNotification.from_hash(hash) + end + + # @private + # Provides a way to notify of an exception that is not tied to any + # particular example (such as an exception encountered in a :suite hook). + # Exceptions will be formatted the same way they normally are. + def notify_non_example_exception(exception, context_description) + @configuration.world.non_example_failure = true + @non_example_exception_count += 1 + + example = Example.new(AnonymousExampleGroup, context_description, {}) + presenter = Formatters::ExceptionPresenter.new(exception, example, :indentation => 0) + message presenter.fully_formatted(nil) + end + + # @private + def finish + close_after do + examples_notification = Notifications::ExamplesNotification.new(self) + stop(examples_notification) + notify :start_dump, Notifications::NullNotification + notify :dump_pending, examples_notification + notify :dump_failures, examples_notification + notify :deprecation_summary, Notifications::NullNotification + unless mute_profile_output? + notify :dump_profile, Notifications::ProfileNotification.new(@duration, @examples, + @configuration.profile_examples, + @profiler.example_groups) + end + notify :dump_summary, Notifications::SummaryNotification.new(@duration, @examples, @failed_examples, + @pending_examples, @load_time, + @non_example_exception_count) + notify :seed, Notifications::SeedNotification.new(@configuration.seed, seed_used?) + end + end + + # @private + def close_after + yield + ensure + close + end + + # @private + def stop(notification) + @duration = (RSpec::Core::Time.now - @start).to_f if @start + notify :stop, notification + end + + # @private + def notify(event, notification) + ensure_listeners_ready + registered_listeners(event).each do |formatter| + formatter.__send__(event, notification) + end + end + + # @private + def abort_with(msg, exit_status) + message(msg) + close + exit!(exit_status) + end + + # @private + def fail_fast_limit_met? + return false unless (fail_fast = @configuration.fail_fast) + + if fail_fast == true + @failed_examples.any? + else + fail_fast <= @failed_examples.size + end + end + + private + + def ensure_listeners_ready + return if @setup + + @setup_default.call + @profiler = Profiler.new + register_listener @profiler, *Profiler::NOTIFICATIONS + @setup = true + end + + def close + notify :close, Notifications::NullNotification + end + + def mute_profile_output? + # Don't print out profiled info if there are failures and `--fail-fast` is + # used, it just clutters the output. + !@configuration.profile_examples? || fail_fast_limit_met? + end + + def seed_used? + @configuration.seed && @configuration.seed_used? + end + end + + # @private + # # Used in place of a {Reporter} for situations where we don't want reporting output. + class NullReporter + def self.method_missing(*) + # ignore + end + private_class_method :method_missing + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/ruby_project.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/ruby_project.rb new file mode 100644 index 0000000..156f89b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/ruby_project.rb @@ -0,0 +1,53 @@ +# This is borrowed (slightly modified) from Scott Taylor's +# project_path project: +# http://github.com/smtlaissezfaire/project_path +module RSpec + module Core + # @private + module RubyProject + def add_to_load_path(*dirs) + dirs.each { |dir| add_dir_to_load_path(File.join(root, dir)) } + end + + def add_dir_to_load_path(dir) + $LOAD_PATH.unshift(dir) unless $LOAD_PATH.include?(dir) + end + + def root + @project_root ||= determine_root + end + + def determine_root + find_first_parent_containing('spec') || '.' + end + + def find_first_parent_containing(dir) + ascend_until { |path| File.exist?(File.join(path, dir)) } + end + + def ascend_until + fs = File::SEPARATOR + escaped_slash = "\\#{fs}" + special = "_RSPEC_ESCAPED_SLASH_" + project_path = File.expand_path(".") + parts = project_path.gsub(escaped_slash, special).squeeze(fs).split(fs).map do |x| + x.gsub(special, escaped_slash) + end + + until parts.empty? + path = parts.join(fs) + path = fs if path == "" + return path if yield(path) + parts.pop + end + end + + module_function :add_to_load_path + module_function :add_dir_to_load_path + module_function :root + module_function :determine_root + module_function :find_first_parent_containing + module_function :ascend_until + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/runner.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/runner.rb new file mode 100644 index 0000000..16d07ef --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/runner.rb @@ -0,0 +1,216 @@ +module RSpec + module Core + # Provides the main entry point to run a suite of RSpec examples. + class Runner + # @attr_reader + # @private + attr_reader :options, :configuration, :world + + # Register an `at_exit` hook that runs the suite when the process exits. + # + # @note This is not generally needed. The `rspec` command takes care + # of running examples for you without involving an `at_exit` + # hook. This is only needed if you are running specs using + # the `ruby` command, and even then, the normal way to invoke + # this is by requiring `rspec/autorun`. + def self.autorun + if autorun_disabled? + RSpec.deprecate("Requiring `rspec/autorun` when running RSpec via the `rspec` command") + return + elsif installed_at_exit? || running_in_drb? + return + end + + at_exit { perform_at_exit } + @installed_at_exit = true + end + + # @private + def self.perform_at_exit + # Don't bother running any specs and just let the program terminate + # if we got here due to an unrescued exception (anything other than + # SystemExit, which is raised when somebody calls Kernel#exit). + return unless $!.nil? || $!.is_a?(SystemExit) + + # We got here because either the end of the program was reached or + # somebody called Kernel#exit. Run the specs and then override any + # existing exit status with RSpec's exit status if any specs failed. + invoke + end + + # Runs the suite of specs and exits the process with an appropriate exit + # code. + def self.invoke + disable_autorun! + status = run(ARGV, $stderr, $stdout).to_i + exit(status) if status != 0 + end + + # Run a suite of RSpec examples. Does not exit. + # + # This is used internally by RSpec to run a suite, but is available + # for use by any other automation tool. + # + # If you want to run this multiple times in the same process, and you + # want files like `spec_helper.rb` to be reloaded, be sure to load `load` + # instead of `require`. + # + # @param args [Array] command-line-supported arguments + # @param err [IO] error stream + # @param out [IO] output stream + # @return [Fixnum] exit status code. 0 if all specs passed, + # or the configured failure exit code (1 by default) if specs + # failed. + def self.run(args, err=$stderr, out=$stdout) + trap_interrupt + options = ConfigurationOptions.new(args) + + if options.options[:runner] + options.options[:runner].call(options, err, out) + else + new(options).run(err, out) + end + end + + def initialize(options, configuration=RSpec.configuration, world=RSpec.world) + @options = options + @configuration = configuration + @world = world + end + + # Configures and runs a spec suite. + # + # @param err [IO] error stream + # @param out [IO] output stream + def run(err, out) + setup(err, out) + return @configuration.reporter.exit_early(exit_code) if RSpec.world.wants_to_quit + + run_specs(@world.ordered_example_groups).tap do + persist_example_statuses + end + end + + # Wires together the various configuration objects and state holders. + # + # @param err [IO] error stream + # @param out [IO] output stream + def setup(err, out) + configure(err, out) + return if RSpec.world.wants_to_quit + + @configuration.load_spec_files + ensure + @world.announce_filters + end + + # Runs the provided example groups. + # + # @param example_groups [Array] groups to run + # @return [Fixnum] exit status code. 0 if all specs passed, + # or the configured failure exit code (1 by default) if specs + # failed. + def run_specs(example_groups) + examples_count = @world.example_count(example_groups) + examples_passed = @configuration.reporter.report(examples_count) do |reporter| + @configuration.with_suite_hooks do + if examples_count == 0 && @configuration.fail_if_no_examples + return @configuration.failure_exit_code + end + + example_groups.map { |g| g.run(reporter) }.all? + end + end + + exit_code(examples_passed) + end + + # @private + def configure(err, out) + @configuration.error_stream = err + @configuration.output_stream = out if @configuration.output_stream == $stdout + @options.configure(@configuration) + end + + # @private + def self.disable_autorun! + @autorun_disabled = true + end + + # @private + def self.autorun_disabled? + @autorun_disabled ||= false + end + + # @private + def self.installed_at_exit? + @installed_at_exit ||= false + end + + # @private + def self.running_in_drb? + return false unless defined?(DRb) + + server = begin + DRb.current_server + rescue DRb::DRbServerNotFound + return false + end + + return false unless server && server.alive? + + require 'socket' + require 'uri' + + local_ipv4 = begin + IPSocket.getaddress(Socket.gethostname) + rescue SocketError + return false + end + + ["127.0.0.1", "localhost", local_ipv4].any? { |addr| addr == URI(DRb.current_server.uri).host } + end + + # @private + def self.trap_interrupt + trap('INT') { handle_interrupt } + end + + # @private + def self.handle_interrupt + if RSpec.world.wants_to_quit + exit!(1) + else + RSpec.world.wants_to_quit = true + + $stderr.puts( + "\nRSpec is shutting down and will print the summary report... Interrupt again to force quit " \ + "(warning: at_exit hooks will be skipped if you force quit)." + ) + end + end + + # @private + def exit_code(examples_passed=false) + return @configuration.error_exit_code || @configuration.failure_exit_code if @world.non_example_failure + return @configuration.failure_exit_code unless examples_passed + + 0 + end + + private + + def persist_example_statuses + return if @configuration.dry_run + return unless (path = @configuration.example_status_persistence_file_path) + + ExampleStatusPersister.persist(@world.all_examples, path) + rescue SystemCallError => e + RSpec.warning "Could not write example statuses to #{path} (configured as " \ + "`config.example_status_persistence_file_path`) due to a " \ + "system error: #{e.inspect}. Please check that the config " \ + "option is set to an accessible, valid file path", :call_site => nil + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/sandbox.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/sandbox.rb new file mode 100644 index 0000000..e7d518c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/sandbox.rb @@ -0,0 +1,37 @@ +module RSpec + module Core + # A sandbox isolates the enclosed code into an environment that looks 'new' + # meaning globally accessed objects are reset for the duration of the + # sandbox. + # + # @note This module is not normally available. You must require + # `rspec/core/sandbox` to load it. + module Sandbox + # Execute a provided block with RSpec global objects (configuration, + # world) reset. This is used to test RSpec with RSpec. + # + # When calling this the configuration is passed into the provided block. + # Use this to set custom configs for your sandboxed examples. + # + # ``` + # Sandbox.sandboxed do |config| + # config.before(:context) { RSpec.current_example = nil } + # end + # ``` + def self.sandboxed + orig_config = RSpec.configuration + orig_world = RSpec.world + orig_example = RSpec.current_example + + RSpec.configuration = RSpec::Core::Configuration.new + RSpec.world = RSpec::Core::World.new(RSpec.configuration) + + yield RSpec.configuration + ensure + RSpec.configuration = orig_config + RSpec.world = orig_world + RSpec.current_example = orig_example + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/set.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/set.rb new file mode 100644 index 0000000..ae97810 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/set.rb @@ -0,0 +1,54 @@ +module RSpec + module Core + # @private + # + # We use this to replace `::Set` so we can have the advantage of + # constant time key lookups for unique arrays but without the + # potential to pollute a developers environment with an extra + # piece of the stdlib. This helps to prevent false positive + # builds. + # + class Set + include Enumerable + + def initialize(array=[]) + @values = {} + merge(array) + end + + def empty? + @values.empty? + end + + def <<(key) + @values[key] = true + self + end + + def delete(key) + @values.delete(key) + end + + def each(&block) + @values.keys.each(&block) + self + end + + def include?(key) + @values.key?(key) + end + + def merge(values) + values.each do |key| + @values[key] = true + end + self + end + + def clear + @values.clear + self + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shared_context.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shared_context.rb new file mode 100644 index 0000000..6de7f64 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shared_context.rb @@ -0,0 +1,55 @@ +module RSpec + module Core + # Exposes {ExampleGroup}-level methods to a module, so you can include that + # module in an {ExampleGroup}. + # + # @example + # + # module LoggedInAsAdmin + # extend RSpec::Core::SharedContext + # before(:example) do + # log_in_as :admin + # end + # end + # + # describe "admin section" do + # include LoggedInAsAdmin + # # ... + # end + module SharedContext + # @private + def included(group) + __shared_context_recordings.each do |recording| + recording.playback_onto(group) + end + end + + # @private + def __shared_context_recordings + @__shared_context_recordings ||= [] + end + + # @private + Recording = Struct.new(:method_name, :args, :block) do + def playback_onto(group) + group.__send__(method_name, *args, &block) + end + end + + # @private + def self.record(methods) + methods.each do |meth| + define_method(meth) do |*args, &block| + __shared_context_recordings << Recording.new(meth, args, block) + end + end + end + + # @private + record [:describe, :context] + Hooks.instance_methods(false) + + MemoizedHelpers::ClassMethods.instance_methods(false) + end + end + # @private + SharedContext = Core::SharedContext +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shared_example_group.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shared_example_group.rb new file mode 100644 index 0000000..3d9efce --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shared_example_group.rb @@ -0,0 +1,271 @@ +RSpec::Support.require_rspec_support "with_keywords_when_needed" + +module RSpec + module Core + # Represents some functionality that is shared with multiple example groups. + # The functionality is defined by the provided block, which is lazily + # eval'd when the `SharedExampleGroupModule` instance is included in an example + # group. + class SharedExampleGroupModule < Module + # @private + attr_reader :definition + + def initialize(description, definition, metadata) + @description = description + @definition = definition + @metadata = metadata + end + + # Provides a human-readable representation of this module. + def inspect + "#<#{self.class.name} #{@description.inspect}>" + end + alias to_s inspect + + # Ruby callback for when a module is included in another module is class. + # Our definition evaluates the shared group block in the context of the + # including example group. + def included(klass) + inclusion_line = klass.metadata[:location] + include_in klass, inclusion_line, [], nil + end + + # @private + def include_in(klass, inclusion_line, args, customization_block) + klass.update_inherited_metadata(@metadata) unless @metadata.empty? + + SharedExampleGroupInclusionStackFrame.with_frame(@description, inclusion_line) do + RSpec::Support::WithKeywordsWhenNeeded.class_exec(klass, *args, &@definition) + klass.class_exec(&customization_block) if customization_block + end + end + end + + # Shared example groups let you define common context and/or common + # examples that you wish to use in multiple example groups. + # + # When defined, the shared group block is stored for later evaluation. + # It can later be included in an example group either explicitly + # (using `include_examples`, `include_context` or `it_behaves_like`) + # or implicitly (via matching metadata). + # + # Named shared example groups are scoped based on where they are + # defined. Shared groups defined in an example group are available + # for inclusion in that example group or any child example groups, + # but not in any parent or sibling example groups. Shared example + # groups defined at the top level can be included from any example group. + module SharedExampleGroup + # @overload shared_examples(name, &block) + # @param name [String, Symbol, Module] identifer to use when looking up + # this shared group + # @param block The block to be eval'd + # @overload shared_examples(name, metadata, &block) + # @param name [String, Symbol, Module] identifer to use when looking up + # this shared group + # @param metadata [Array, Hash] metadata to attach to this + # group; any example group or example with matching metadata will + # automatically include this shared example group. + # @param block The block to be eval'd + # + # Stores the block for later use. The block will be evaluated + # in the context of an example group via `include_examples`, + # `include_context`, or `it_behaves_like`. + # + # @example + # shared_examples "auditable" do + # it "stores an audit record on save!" do + # expect { auditable.save! }.to change(Audit, :count).by(1) + # end + # end + # + # RSpec.describe Account do + # it_behaves_like "auditable" do + # let(:auditable) { Account.new } + # end + # end + # + # @see ExampleGroup.it_behaves_like + # @see ExampleGroup.include_examples + # @see ExampleGroup.include_context + def shared_examples(name, *args, &block) + top_level = self == ExampleGroup + if top_level && RSpec::Support.thread_local_data[:in_example_group] + raise "Creating isolated shared examples from within a context is " \ + "not allowed. Remove `RSpec.` prefix or move this to a " \ + "top-level scope." + end + + RSpec.world.shared_example_group_registry.add(self, name, *args, &block) + end + alias shared_context shared_examples + alias shared_examples_for shared_examples + + # @api private + # + # Shared examples top level DSL. + module TopLevelDSL + # @private + def self.definitions + proc do + def shared_examples(name, *args, &block) + RSpec.world.shared_example_group_registry.add(:main, name, *args, &block) + end + alias shared_context shared_examples + alias shared_examples_for shared_examples + end + end + + # @private + def self.exposed_globally? + @exposed_globally ||= false + end + + # @api private + # + # Adds the top level DSL methods to Module and the top level binding. + def self.expose_globally! + return if exposed_globally? + Core::DSL.change_global_dsl(&definitions) + @exposed_globally = true + end + + # @api private + # + # Removes the top level DSL methods to Module and the top level binding. + def self.remove_globally! + return unless exposed_globally? + + Core::DSL.change_global_dsl do + undef shared_examples + undef shared_context + undef shared_examples_for + end + + @exposed_globally = false + end + end + + # @private + class Registry + def add(context, name, *metadata_args, &block) + unless block + RSpec.warning "Shared example group #{name} was defined without a "\ + "block and will have no effect. Please define a "\ + "block or remove the definition." + end + + if RSpec.configuration.shared_context_metadata_behavior == :trigger_inclusion + return legacy_add(context, name, *metadata_args, &block) + end + + unless valid_name?(name) + raise ArgumentError, "Shared example group names can only be a string, " \ + "symbol or module but got: #{name.inspect}" + end + + ensure_block_has_source_location(block) { CallerFilter.first_non_rspec_line } + warn_if_key_taken context, name, block + + metadata = Metadata.build_hash_from(metadata_args) + shared_module = SharedExampleGroupModule.new(name, block, metadata) + shared_example_groups[context][name] = shared_module + end + + def find(lookup_contexts, name) + lookup_contexts.each do |context| + found = shared_example_groups[context][name] + return found if found + end + + shared_example_groups[:main][name] + end + + private + + # TODO: remove this in RSpec 4. This exists only to support + # `config.shared_context_metadata_behavior == :trigger_inclusion`, + # the legacy behavior of shared context metadata, which we do + # not want to support in RSpec 4. + def legacy_add(context, name, *metadata_args, &block) + ensure_block_has_source_location(block) { CallerFilter.first_non_rspec_line } + shared_module = SharedExampleGroupModule.new(name, block, {}) + + if valid_name?(name) + warn_if_key_taken context, name, block + shared_example_groups[context][name] = shared_module + else + metadata_args.unshift name + end + + return if metadata_args.empty? + RSpec.configuration.include shared_module, *metadata_args + end + + def shared_example_groups + @shared_example_groups ||= Hash.new { |hash, context| hash[context] = {} } + end + + def valid_name?(candidate) + case candidate + when String, Symbol, Module then true + else false + end + end + + def warn_if_key_taken(context, key, new_block) + existing_module = shared_example_groups[context][key] + return unless existing_module + + old_definition_location = formatted_location existing_module.definition + new_definition_location = formatted_location new_block + loaded_spec_files = RSpec.configuration.loaded_spec_files + + if loaded_spec_files.include?(new_definition_location) && old_definition_location == new_definition_location + RSpec.warn_with <<-WARNING.gsub(/^ +\|/, ''), :call_site => nil + |WARNING: Your shared example group, '#{key}', defined at: + | #{old_definition_location} + |was automatically loaded by RSpec because the file name + |matches the configured autoloading pattern (#{RSpec.configuration.pattern}), + |and is also being required from somewhere else. To fix this + |warning, either rename the file to not match the pattern, or + |do not explicitly require the file. + WARNING + else + RSpec.warn_with <<-WARNING.gsub(/^ +\|/, ''), :call_site => nil + |WARNING: Shared example group '#{key}' has been previously defined at: + | #{old_definition_location} + |...and you are now defining it at: + | #{new_definition_location} + |The new definition will overwrite the original one. + WARNING + end + end + + if RUBY_VERSION.to_f >= 1.9 + def formatted_location(block) + block.source_location.join(":") + end + else # 1.8.7 + # :nocov: + def formatted_location(block) + block.source_location.join(":").gsub(/:in.*$/, '') + end + # :nocov: + end + + if Proc.method_defined?(:source_location) + def ensure_block_has_source_location(_block); end + else # for 1.8.7 + # :nocov: + def ensure_block_has_source_location(block) + source_location = yield.split(':') + block.extend(Module.new { define_method(:source_location) { source_location } }) + end + # :nocov: + end + end + end + end + + instance_exec(&Core::SharedExampleGroup::TopLevelDSL.definitions) +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shell_escape.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shell_escape.rb new file mode 100644 index 0000000..a92feae --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shell_escape.rb @@ -0,0 +1,49 @@ +module RSpec + module Core + # @private + # Deals with the fact that `shellwords` only works on POSIX systems. + module ShellEscape + module_function + + def quote(argument) + "'#{argument.to_s.gsub("'", "\\\\'")}'" + end + + if RSpec::Support::OS.windows? + # :nocov: + alias escape quote + # :nocov: + else + require 'shellwords' + + def escape(shell_command) + Shellwords.escape(shell_command.to_s) + end + end + + # Known shells that require quoting: zsh, csh, tcsh. + # + # Feel free to add other shells to this list that are known to + # allow `rspec ./some_spec.rb[1:1]` syntax without quoting the id. + # + # @private + SHELLS_ALLOWING_UNQUOTED_IDS = %w[ bash ksh fish ] + + def conditionally_quote(id) + return id if shell_allows_unquoted_ids? + quote(id) + end + + def shell_allows_unquoted_ids? + # Note: ENV['SHELL'] isn't necessarily the shell the user is currently running. + # According to http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html: + # "This variable shall represent a pathname of the user's preferred command language interpreter." + # + # It's the best we can easily do, though. We err on the side of safety (quoting + # the id when not actually needed) so it's not a big deal if the user is actually + # using a different shell. + SHELLS_ALLOWING_UNQUOTED_IDS.include?(ENV['SHELL'].to_s.split('/').last) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/test_unit_assertions_adapter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/test_unit_assertions_adapter.rb new file mode 100644 index 0000000..d84ecb1 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/test_unit_assertions_adapter.rb @@ -0,0 +1,30 @@ +require 'test/unit/assertions' + +module RSpec + module Core + # @private + module TestUnitAssertionsAdapter + include ::Test::Unit::Assertions + + # If using test/unit from Ruby core with Ruby 1.9+, it includes + # MiniTest::Assertions by default. Note the upcasing of 'Test'. + # + # If the test/unit gem is being loaded, it will not include any minitest + # assertions. + # + # Only if Minitest 5.x is included / loaded do we need to worry about + # adding a shim for the new updates. Thus instead of checking on the + # RUBY_VERSION we need to check ancestors. + begin + # MiniTest is 4.x. + # Minitest is 5.x. + if ancestors.include?(::Minitest::Assertions) + require 'rspec/core/minitest_assertions_adapter' + include ::RSpec::Core::MinitestAssertionsAdapter + end + rescue NameError + # No-op. Minitest 5.x was not loaded. + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/version.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/version.rb new file mode 100644 index 0000000..29801aa --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/version.rb @@ -0,0 +1,9 @@ +module RSpec + module Core + # Version information for RSpec Core. + module Version + # Current version of RSpec Core, in semantic versioning format. + STRING = '3.13.5' + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/warnings.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/warnings.rb new file mode 100644 index 0000000..b880059 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/warnings.rb @@ -0,0 +1,40 @@ +require "rspec/support/warnings" + +module RSpec + module Core + # @private + module Warnings + # @private + # + # Used internally to print deprecation warnings. + def deprecate(deprecated, data={}) + RSpec.configuration.reporter.deprecation( + { + :deprecated => deprecated, + :call_site => CallerFilter.first_non_rspec_line + }.merge(data) + ) + end + + # @private + # + # Used internally to print deprecation warnings. + def warn_deprecation(message, opts={}) + RSpec.configuration.reporter.deprecation opts.merge(:message => message) + end + + # @private + def warn_with(message, options={}) + if options[:use_spec_location_as_call_site] + message += "." unless message.end_with?(".") + + if RSpec.current_example + message += " Warning generated from spec at `#{RSpec.current_example.location}`." + end + end + + super(message, options) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/world.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/world.rb new file mode 100644 index 0000000..6fb4396 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/world.rb @@ -0,0 +1,287 @@ +module RSpec + module Core + # @api private + # + # Internal container for global non-configuration data. + class World + # @private + attr_reader :example_groups, :filtered_examples, :example_group_counts_by_spec_file + + # Used internally to determine what to do when a SIGINT is received. + attr_accessor :wants_to_quit + + # Used internally to signify that a SystemExit occurred in + # `Configuration#load_file_handling_errors`, and thus examples cannot + # be counted accurately. Specifically, we cannot accurately report + # "No examples found". + # @private + attr_accessor :rspec_is_quitting + + # Used internally to signal that a failure outside of an example + # has occurred, and that therefore the exit status should indicate + # the run failed. + # @private + attr_accessor :non_example_failure + + def initialize(configuration=RSpec.configuration) + @wants_to_quit = false + @rspec_is_quitting = false + @configuration = configuration + configuration.world = self + @example_groups = [] + @example_group_counts_by_spec_file = Hash.new(0) + prepare_example_filtering + end + + # @api public + # + # Prepares filters so that they apply to example groups when they run. + # + # This is a separate method so that filters can be modified/replaced and + # examples refiltered during a process's lifetime, which can be useful for + # a custom runner. + def prepare_example_filtering + @filtered_examples = Hash.new do |hash, group| + hash[group] = filter_manager.prune(group.examples) + end + end + + # @api private + # + # Apply ordering strategy from configuration to example groups. + def ordered_example_groups + ordering_strategy = @configuration.ordering_registry.fetch(:global) + ordering_strategy.order(@example_groups) + end + + # @api private + # + # Reset world to 'scratch' before running suite. + def reset + RSpec::ExampleGroups.remove_all_constants + example_groups.clear + @sources_by_path.clear if defined?(@sources_by_path) + @syntax_highlighter = nil + @example_group_counts_by_spec_file = Hash.new(0) + end + + # @private + def filter_manager + @configuration.filter_manager + end + + # @private + def registered_example_group_files + @example_group_counts_by_spec_file.keys + end + + # @api private + # + # Records an example group. + def record(example_group) + @configuration.on_example_group_definition_callbacks.each { |block| block.call(example_group) } + @example_group_counts_by_spec_file[example_group.metadata[:absolute_file_path]] += 1 + end + + # @private + def num_example_groups_defined_in(file) + @example_group_counts_by_spec_file[file] + end + + # @private + def shared_example_group_registry + @shared_example_group_registry ||= SharedExampleGroup::Registry.new + end + + # @private + def inclusion_filter + @configuration.inclusion_filter + end + + # @private + def exclusion_filter + @configuration.exclusion_filter + end + + # @api private + # + # Get count of examples to be run. + def example_count(groups=example_groups) + FlatMap.flat_map(groups) { |g| g.descendants }. + inject(0) { |a, e| a + e.filtered_examples.size } + end + + # @private + def all_example_groups + FlatMap.flat_map(example_groups) { |g| g.descendants } + end + + # @private + def all_examples + FlatMap.flat_map(all_example_groups) { |g| g.examples } + end + + # @private + # Traverses the tree of each top level group. + # For each it yields the group, then the children, recursively. + # Halts the traversal of a branch of the tree as soon as the passed block returns true. + # Note that siblings groups and their sub-trees will continue to be explored. + # This is intended to make it easy to find the top-most group that satisfies some + # condition. + def traverse_example_group_trees_until(&block) + example_groups.each do |group| + group.traverse_tree_until(&block) + end + end + + # @api private + # + # Find line number of previous declaration. + def preceding_declaration_line(absolute_file_name, filter_line) + line_numbers = descending_declaration_line_numbers_by_file.fetch(absolute_file_name) do + return nil + end + + line_numbers.find { |num| num <= filter_line } + end + + # @private + def reporter + @configuration.reporter + end + + # @private + def source_from_file(path) + unless defined?(@sources_by_path) + RSpec::Support.require_rspec_support 'source' + @sources_by_path = {} + end + + @sources_by_path[path] ||= Support::Source.from_file(path) + end + + # @private + def syntax_highlighter + @syntax_highlighter ||= Formatters::SyntaxHighlighter.new(@configuration) + end + + # @api private + # + # Notify reporter of filters. + def announce_filters + fail_if_config_and_cli_options_invalid + filter_announcements = [] + + announce_inclusion_filter filter_announcements + announce_exclusion_filter filter_announcements + + unless filter_manager.empty? + if filter_announcements.length == 1 + report_filter_message("Run options: #{filter_announcements[0]}") + else + report_filter_message("Run options:\n #{filter_announcements.join("\n ")}") + end + end + + if @configuration.run_all_when_everything_filtered? && example_count.zero? && !@configuration.only_failures? + report_filter_message("#{everything_filtered_message}; ignoring #{inclusion_filter.description}") + filtered_examples.clear + inclusion_filter.clear + end + + return unless example_count.zero? + + example_groups.clear + unless rspec_is_quitting + if filter_manager.empty? + report_filter_message("No examples found.") + elsif exclusion_filter.empty? || inclusion_filter.empty? + report_filter_message(everything_filtered_message) + end + end + end + + # @private + def report_filter_message(message) + reporter.message(message) unless @configuration.silence_filter_announcements? + end + + # @private + def everything_filtered_message + "\nAll examples were filtered out" + end + + # @api private + # + # Add inclusion filters to announcement message. + def announce_inclusion_filter(announcements) + return if inclusion_filter.empty? + + announcements << "include #{inclusion_filter.description}" + end + + # @api private + # + # Add exclusion filters to announcement message. + def announce_exclusion_filter(announcements) + return if exclusion_filter.empty? + + announcements << "exclude #{exclusion_filter.description}" + end + + private + + def descending_declaration_line_numbers_by_file + @descending_declaration_line_numbers_by_file ||= begin + declaration_locations = FlatMap.flat_map(example_groups, &:declaration_locations) + hash_of_arrays = Hash.new { |h, k| h[k] = [] } + + # TODO: change `inject` to `each_with_object` when we drop 1.8.7 support. + line_nums_by_file = declaration_locations.inject(hash_of_arrays) do |hash, (file_name, line_number)| + hash[file_name] << line_number + hash + end + + line_nums_by_file.each_value do |list| + list.sort! + list.reverse! + end + end + end + + def fail_if_config_and_cli_options_invalid + return unless @configuration.only_failures_but_not_configured? + + reporter.abort_with( + "\nTo use `--only-failures`, you must first set " \ + "`config.example_status_persistence_file_path`.", + 1 # exit code + ) + end + + # @private + # Provides a null implementation for initial use by configuration. + module Null + def self.non_example_failure; end + def self.non_example_failure=(_); end + + def self.registered_example_group_files + [] + end + + def self.traverse_example_group_trees_until + end + + # :nocov: + def self.example_groups + [] + end + + def self.all_example_groups + [] + end + # :nocov: + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/.document b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/.document new file mode 100644 index 0000000..52a564f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/.document @@ -0,0 +1,5 @@ +lib/**/*.rb +- +README.md +LICENSE.md +Changelog.md diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/.yardopts b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/.yardopts new file mode 100644 index 0000000..9555b8e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/.yardopts @@ -0,0 +1,6 @@ +--exclude features +--no-private +--markup markdown +- +Changelog.md +LICENSE.md diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/Changelog.md b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/Changelog.md new file mode 100644 index 0000000..fc7d5f0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/Changelog.md @@ -0,0 +1,1366 @@ +### Development +[Full Changelog](https://github.com/rspec/rspec/compare/rspec-expectations-v3.13.4...3-13-maintenance) + +### 3.13.5 / 2025-05-27 +[Full Changelog](https://github.com/rspec/rspec/compare/rspec-expectations-v3.13.4...rspec-expectations-v3.13.5) + +Bug Fixes: + +* Fix links in gemspec to point to the monorepo / homepage. + +### 3.13.4 / 2025-05-01 +[Full Changelog](https://github.com/rspec/rspec/compare/rspec-expectations-v3.13.3...rspec-expectations-v3.13.4) + +Bug Fixes: + +* Prevent `match` from trying to compare strings and arrays using `Array#match`. (Joseph Haig, rspec/rspec#183) + +### 3.13.3 / 2024-09-07 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.13.2...v3.13.3) + +Bug Fixes: + +* Fix passing a regular expression to the `include` matcher without a count constraint. + (Jon Rowe, rspec/rspec-expectations#1485) + +### 3.13.2 / 2024-08-20 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.13.1...v3.13.2) + +Bug Fixes: + +* When using null object doubles, prevent typos triggering dynamic matchers. + (Eric Mueller, rspec/rspec-expectations#1455) +* Use `RSpec.warning` for an expectation warning rather than `Kernel.warn`. (Jon Rowe, rspec/rspec-expectations#1472) +* Prevent mismatched use of block and value matchers in compound expectations. (Phil Pirozhkov, rspec/rspec-expectations#1476) +* Raise an error when passing no arguments to the `include` matcher. (Eric Mueller, rspec/rspec-expectations#1479) + +### 3.13.1 / 2024-06-13 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.13.0...v3.13.1) + +Bug Fixes: + +* Fix the "false positive" warning message when using a negated `raise_error` matcher + with a `RegExp` instance. (Eric Mueller, rspec/rspec-expectations#1456) + +### 3.13.0 / 2024-02-04 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.12.4...v3.13.0) + +Enhancements: + +* Update `eq` and `eql` matchers to better highlight difference in string encoding. + (Alan Foster, rspec/rspec-expectations#1425) + +### 3.12.4 / 2024-02-04 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.12.3...v3.12.4) + +Bug Fixes: + +* Fix the diff for redefined `actual` and reassigned `@actual` in compound + expectations failure messages. (Phil Pirozhkov, rspec/rspec-expectations#1440) + +### 3.12.3 / 2023-04-20 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.12.2...v3.12.3) + +Bug Fixes: + +* Fix `include` matcher when fuzzy matching on keys with a hash-like actual which + has a non standard `key?` method which may raise. + (Jon Rowe, rspec/rspec-expectations#1416) + +### 3.12.2 / 2023-01-07 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.12.1...v3.12.2) + +Bug Fixes: + +* Prevent deprecation warning when using the `exist` matcher with `Dir`. + (Steve Dierker, rspec/rspec-expectations#1398) + +### 3.12.1 / 2022-12-16 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.12.0...v3.12.1) + +Bug Fixes: + +* Pass keyword arguments through to aliased (and thus negated) matchers. (Jon Rowe, rspec/rspec-expectations#1394) +* When handling failures in an aggregated_failures block (or example) prevent + the failure list leaking out. (Maciek Rząsa, rspec/rspec-expectations#1392) + +### 3.12.0 / 2022-10-26 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.11.1...v3.12.0) + +Enhancements: + +* Add `an_array_matching` alias for `match_array` to improve readability as an argument + matcher. (Mark Schneider, rspec/rspec-expectations#1361) + +### 3.11.1 / 2022-09-12 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.11.0...v3.11.1) + +Bug Fixes: + +* Allow the `contain_exactly` matcher to be reused by resetting its + internals on `matches?` (@bclayman-sq, rspec/rspec-expectations#1326) +* Using the exist matcher on `FileTest` no longer produces a deprecation warning. + (Ryo Nakamura, rspec/rspec-expectations#1383) + +### 3.11.0 / 2022-02-09 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.10.2...v3.11.0) + +Enhancements: + +* Return `true` from `aggregate_failures` when no exception occurs. (Jon Rowe, rspec/rspec-expectations#1225) + +Deprecations: + +* Print a deprecation message when using the implicit block expectation syntax. + (Phil Pirozhkov, rspec/rspec-expectations#1139) + +### 3.10.2 / 2022-01-14 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.10.1...v3.10.2) + +Bug Fixes: + +* Fix support for dynamic matchers for expectation target checks (Phil Pirozhkov, rspec/rspec-expectations#1294) +* Fix `expect(array).to include(hash).times`, previously this would fail due to + matching the entire array as a single hash, rather than a member of the hash. + (Slava Kardakov, rspec/rspec-expectations#1322) +* Ensure `raise_error` matches works with the `error_highlight` option from Ruby 3.1. + (Peter Goldstein, rspec/rspec-expectations#1339) + +### 3.10.1 / 2020-12-27 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.10.0...v3.10.1) + +Bug Fixes: + +* Allow JRuby 9.2.x.x to generate backtraces normally rather than via our + backfill workaround. (rspec/rspec-expectations#1230, Jon Rowe) + +### 3.10.0 / 2020-10-30 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.9.3...v3.10.0) + +Enhancements: + +* Allow `include` matcher to be chained with `once`, `at_least`, etc. for simple cases. + (Marc-André Lafortune, rspec/rspec-expectations#1168) +* Add an explicit warning when `nil` is passed to `raise_error`. (Phil Pirozhkov, rspec/rspec-expectations#1143) +* Improve `include` matcher's composability. (Phil Pirozhkov, rspec/rspec-expectations#1155) +* Mocks expectations can now set a custom failure message. + (Benoit Tigeot and Nicolas Zermati, rspec/rspec-expectations#1156) +* `aggregate_failures` now shows the backtrace line for each failure. (Fabricio Bedin, rspec/rspec-expectations#1163) +* Support multiple combinations of `yield_control` modifiers like `at_least`, `at_most`. + (Jon Rowe, rspec/rspec-expectations#1169) +* Dynamic `have_` matchers now have output consistent with other dynamic matchers. + (Marc-André Lafortune, rspec/rspec-expectations#1195) +* New config option `strict_predicate_matchers` allows predicate matcher to be strict + (i.e. match for `true` or `false`) instead of the default (match truthy vs `false` or `nil`). + (Marc-André Lafortune, rspec/rspec-expectations#1196) + +### 3.9.4 / 2020-10-29 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.9.3...v3.9.4) + +Bug Fixes: + +* Fix regression with `be_` and `have_` matchers and arguments implementing `to_hash` + were they would act like keywords and be cast to a hash. (Jon Rowe, rspec/rspec-expectations#1222) + +### 3.9.3 / 2020-10-23 + +Bug Fixes: + +* Swap the comparison of the delta vs the expected for the `be_within` matcher allowing + more complicated oobjects to be compared providing they provide `abs` and other + comparison methods. (Kelly Stannard, rspec/rspec-expectations#1182) +* Properly format expected in the description of the `be_within` matcher. (Jon Rowe, rspec/rspec-expectations#1185) +* Remove warning when using keyword arguments with `be_` and `have_` matchers on 2.7.x + (Jon Rowe, rspec/rspec-expectations#1187) +* Prevent formatting a single hash as a list of key value pairs in default failure messages + for custom matches (fixes formatting in `EnglishPhrasing#list`). (Robert Eshleman, rspec/rspec-expectations#1193) +* Prevent errors from causing false positives when using `be ` comparison, e.g. + `expect(1).not_to be < 'a'` will now correctly fail rather than pass. (Jon Rowe, rspec/rspec-expectations#1208) + + +### 3.9.2 / 2020-05-08 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.9.1...v3.9.2) + +Bug Fixes: + +* Issue a proper `ArgumentError` when invalid arguments are given to `yield_control` + modifiers such as `at_least` et al. (Marc-André Lafortune, rspec/rspec-expectations#1167) +* Prevent Ruby 2.7 keyword arguments warning from being issued by custom + matcher definitions. (Jon Rowe, rspec/rspec-expectations#1176) + +### 3.9.1 / 2020-03-13 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.9.0...v3.9.1) + +Bug Fixes: + +* Issue an improved warning when using `respond_to(...).with(n).arguments` and ignore + the warning when using with `have_attributes(...)`. (Jon Rowe, rspec/rspec-expectations#1164) + +### 3.9.0 / 2019-10-08 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.6...v3.9.0) + +Enhancements: + +* The `respond_to` matcher now uses the signature from `initialize` to validate checks + for `new` (unless `new` is non standard). (Jon Rowe, rspec/rspec-expectations#1072) +* Generated descriptions for matchers now use `is expected to` rather than `should` in + line with our preferred DSL. (Pete Johns, rspec/rspec-expectations#1080, rspec/rspec-corerspec/rspec-expectations#2572) +* Add the ability to re-raise expectation errors when matching + with `match_when_negated` blocks. (Jon Rowe, rspec/rspec-expectations#1130) +* Add a warning when an empty diff is produce due to identical inspect output. + (Benoit Tigeot, rspec/rspec-expectations#1126) + +### 3.8.6 / 2019-10-07 + +Bug Fixes: + +* Revert rspec/rspec-expectations#1125 due to the change being incompatible with our semantic versioning + policy. + +### 3.8.5 / 2019-10-02 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.4...v3.8.5) + +Bug Fixes: + +* Prevent unsupported implicit block expectation syntax from being used. + (Phil Pirozhkov, rspec/rspec-expectations#1125) + +### 3.8.4 / 2019-06-10 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.3...v3.8.4) + +Bug Fixes: + +* Prevent false negatives when checking objects for the methods required to run the + the `be_an_instance_of` and `be_kind_of` matchers. (Nazar Matus, rspec/rspec-expectations#1112) + +### 3.8.3 / 2019-04-20 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.2...v3.8.3) + +Bug Fixes: + +* Prevent composed `all` matchers from leaking into their siblings leading to duplicate + failures. (Jamie English, rspec/rspec-expectations#1086) +* Prevent objects which change their hash on comparison from failing change checks. + (Phil Pirozhkov, rspec/rspec-expectations#1100) +* Issue an `ArgumentError` rather than a `NoMethodError` when `be_an_instance_of` and + `be_kind_of` matchers encounter objects not supporting those methods. + (Taichi Ishitani, rspec/rspec-expectations#1107) + +### 3.8.2 / 2018-10-09 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.1...v3.8.2) + +Bug Fixes: + +* Change `include` matcher to rely on a `respond_to?(:include?)` check rather than a direct + Hash comparison before calling `to_hash` to convert to a hash. (Jordan Owens, rspec/rspec-expectations#1073) +* Prevent unexpected call stack jumps from causing an obscure error (`IndexError`), and + replace that error with a proper informative message. (Jon Rowe, rspec/rspec-expectations#1076) + +### 3.8.1 / 2018-08-06 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.0...v3.8.1) + +Bug Fixes: + +* Fix regression in `include` matcher so stopped + `expect(hash.with_indifferent_access).to include(:symbol_key)` + from working. (Eito Katagiri, rspec/rspec-expectations#1069) + +### 3.8.0 / 2018-08-04 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.7.0...v3.8.0) + +Enhancements: + +* Improve failure message of `change(receiver, :message)` by including the + receiver as `SomeClass#some_message`. (Tomohiro Hashidate, rspec/rspec-expectations#1005) +* Improve `change` matcher so that it can correctly detect changes in + deeply nested mutable objects (such as arrays-of-hashes-of-arrays). + The improved logic uses the before/after `hash` value to see if the + object has been mutated, rather than shallow duping the object. + (Myron Marston, rspec/rspec-expectations#1034) +* Improve `include` matcher so that pseudo-hash objects (e.g. objects + that decorate a hash using a `SimpleDelegator` or similar) are treated + as a hash, as long as they implement `to_hash`. (Pablo Brasero, rspec/rspec-expectations#1012) +* Add `max_formatted_output_length=` to configuration, allowing changing + the length at which we truncate large output strings. + (Sam Phippen rspec/rspec-expectations#951, Benoit Tigeot rspec/rspec-expectations#1056) +* Improve error message when passing a matcher that doesn't support block + expectations to a block based `expect`. (@nicktime, rspec/rspec-expectations#1066) + +### 3.7.0 / 2017-10-17 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.6.0...v3.7.0) + +Enhancements: + +* Improve compatibility with `--enable-frozen-string-literal` option + on Ruby 2.3+. (Pat Allan, rspec/rspec-expectations#997) + +### 3.6.0 / 2017-05-04 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.6.0.beta2...v3.6.0) + +Enhancements: + +* Treat NoMethodError as a failure for comparison matchers. (Jon Rowe, rspec/rspec-expectations#972) +* Allow for scoped aliased and negated matchers--just call + `alias_matcher` or `define_negated_matcher` from within an example + group. (Markus Reiter, rspec/rspec-expectations#974) +* Improve failure message of `change` matcher with block and `satisfy` matcher + by including the block snippet instead of just describing it as `result` or + `block` when Ripper is available. (Yuji Nakayama, rspec/rspec-expectations#987) + +Bug Fixes: + +* Fix `yield_with_args` and `yield_successive_args` matchers so that + they compare expected to actual args at the time the args are yielded + instead of at the end, in case the method that is yielding mutates the + arguments after yielding. (Alyssa Ross, rspec/rspec-expectations#965) + +### 3.6.0.beta2 / 2016-12-12 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.6.0.beta1...v3.6.0.beta2) + +Bug Fixes: + +* Using the exist matcher on `File` no longer produces a deprecation warning. + (Jon Rowe, rspec/rspec-expectations#954) + +### 3.6.0.beta1 / 2016-10-09 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.5.0...v3.6.0.beta1) + +Bug Fixes: + +* Fix `contain_exactly` to work correctly with ranges. (Myron Marston, rspec/rspec-expectations#940) +* Fix `change` to work correctly with sets. (Marcin Gajewski, rspec/rspec-expectations#939) + +### 3.5.0 / 2016-07-01 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.5.0.beta4...v3.5.0) + +Enhancements: + +* Add support for keyword arguments to the `respond_to` matcher. (Rob Smith, rspec/rspec-expectations#915). + +### 3.5.0.beta4 / 2016-06-05 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.5.0.beta3...v3.5.0.beta4) + +Bug Fixes: + +* Fix `include` matcher so that it provides a valid diff for hashes. (Yuji Nakayama, rspec/rspec-expectations#916) + +### 3.5.0.beta3 / 2016-04-02 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.5.0.beta2...v3.5.0.beta3) + +Enhancements: + +* Make `rspec/expectations/minitest_integration` work on Minitest::Spec + 5.6+. (Myron Marston, rspec/rspec-expectations#904) +* Add an alias `having_attributes` for `have_attributes` matcher. + (Yuji Nakayama, rspec/rspec-expectations#905) +* Improve `change` matcher error message when block is mis-used. + (Alex Altair, rspec/rspec-expectations#908) + +### 3.5.0.beta2 / 2016-03-10 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.5.0.beta1...v3.5.0.beta2) + +Enhancements: + +* Add the ability to raise an error on encountering false positives via + `RSpec::Configuration#on_potential_false_positives = :raise`. (Jon Rowe, rspec/rspec-expectations#900) +* When using the custom matcher DSL, support new + `notify_expectation_failures: true` option for the `match` method to + allow expectation failures to be raised as normal instead of being + converted into a `false` return value for `matches?`. (Jon Rowe, rspec/rspec-expectations#892) + +Bug Fixes: + +* Allow `should` deprecation check to work on `BasicObject`s. (James Coleman, rspec/rspec-expectations#898) + +### 3.5.0.beta1 / 2016-02-06 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.4.0...v3.5.0.beta1) + +Enhancements: + +* Make `match_when_negated` in custom matcher DSL support use of + expectations within the match logic. (Chris Arcand, rspec/rspec-expectations#789) + +Bug Fixes: + +* Return `true` as expected from passing negated expectations + (such as `expect("foo").not_to eq "bar"`), so they work + properly when used within a `match` or `match_when_negated` + block. (Chris Arcand, rspec/rspec-expectations#789) + +### 3.4.0 / 2015-11-11 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.3.1...v3.4.0) + +Enhancements: + +* Warn when `RSpec::Matchers` is included in a superclass after it has + already been included in a subclass on MRI 1.9, since that situation + can cause uses of `super` to trigger infinite recursion. (Myron Marston, rspec/rspec-expectations#816) +* Stop rescuing `NoMemoryError`, `SignalExcepetion`, `Interrupt` and + `SystemExit`. It is dangerous to interfere with these. (Myron Marston, rspec/rspec-expectations#845) +* Add `#with_captures` to the match matcher which allows a user to specify expected + captures when matching a regex against a string. (Sam Phippen, rspec/rspec-expectations#848) +* Always print compound failure messages in the multi-line form. Trying + to print it all on a single line didn't read very well. (Myron Marston, rspec/rspec-expectations#859) + +Bug Fixes: + +* Fix failure message from dynamic predicate matchers when the object + does not respond to the predicate so that it is inspected rather + than relying upon its `to_s` -- that way for `nil`, `"nil"` is + printed rather than an empty string. (Myron Marston, rspec/rspec-expectations#841) +* Fix SystemStackError raised when diffing an Enumerable object + whose `#each` includes the object itself. (Yuji Nakayama, rspec/rspec-expectations#857) + +### 3.3.1 / 2015-07-15 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.3.0...v3.3.1) + +Bug Fixes: + +* Fix `be >`, `be <`, etc so that it fails rather than allowing an + argument error to be raised when compared against an object of the + wrong type. This allows it to be used in composed matcher expressions + against heterogeneous objects. (Dennis Günnewig, rspec/rspec-expectations#809) +* Fix `respond_to` to work properly on target objects + that redefine the `method` method. (unmanbearpig, rspec/rspec-expectations#821) + +### 3.3.0 / 2015-06-12 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.2.1...v3.3.0) + +Enhancements: + +* Expose `RSpec::Matchers::EnglishPhrasing` to make it easier to write + nice failure messages in custom matchers. (Jared Beck, rspec/rspec-expectations#736) +* Add `RSpec::Matchers::FailMatchers`, a mixin which provides + `fail`, `fail_with` and `fail_including` matchers for use in + specifying that an expectation fails for use by + extension/plugin authors. (Charlie Rudolph, rspec/rspec-expectations#729) +* Avoid loading `tempfile` (and its dependencies) unless + it is absolutely needed. (Myron Marston, rspec/rspec-expectations#735) +* Improve failure output when attempting to use `be_true` or `be_false`. + (Tim Wade, rspec/rspec-expectations#744) +* Define `RSpec::Matchers#respond_to_missing?` so that + `RSpec::Matchers#respond_to?` and `RSpec::Matchers#method` handle + dynamic predicate matchers. (Andrei Botalov, rspec/rspec-expectations#751) +* Use custom Time/DateTime/BigDecimal formatting for all matchers + so they are consistently represented in failure messages. + (Gavin Miller, rspec/rspec-expectations#740) +* Add configuration to turn off warnings about matcher combinations that + may cause false positives. (Jon Rowe, rspec/rspec-expectations#768) +* Warn when using a bare `raise_error` matcher that you may be subject to + false positives. (Jon Rowe, rspec/rspec-expectations#768) +* Warn rather than raise when using the`raise_error` matcher in negative + expectations that may be subject to false positives. (Jon Rowe, rspec/rspec-expectations#775) +* Improve failure message for `include(a, b, c)` so that if `a` and `b` + are included the failure message only mentions `c`. (Chris Arcand, rspec/rspec-expectations#780) +* Allow `satisfy` matcher to take an optional description argument + that will be used in the `description`, `failure_message` and + `failure_message_when_negated` in place of the undescriptive + "sastify block". (Chris Arcand, rspec/rspec-expectations#783) +* Add new `aggregate_failures` API that allows multiple independent + expectations to all fail and be listed in the failure output, rather + than the example aborting on the first failure. (Myron Marston, rspec/rspec-expectations#776) +* Improve `raise_error` matcher so that it can accept a matcher as a single argument + that matches the message. (Time Wade, rspec/rspec-expectations#782) + +Bug Fixes: + +* Make `contain_exactly` / `match_array` work with strict test doubles + that have not defined `<=>`. (Myron Marston, rspec/rspec-expectations#758) +* Fix `include` matcher so that it omits the diff when it would + confusingly highlight items that are actually included but are not + an exact match in a line-by-line diff. (Tim Wade, rspec/rspec-expectations#763) +* Fix `match` matcher so that it does not blow up when matching a string + or regex against another matcher (rather than a string or regex). + (Myron Marston, rspec/rspec-expectations#772) +* Silence whitespace-only diffs. (Myron Marston, rspec/rspec-expectations#801) + +### 3.2.1 / 2015-04-06 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.2.0...v3.2.1) + +Bug Fixes: + +* Prevent `Range`s from being enumerated when generating matcher + descriptions. (Jon Rowe, rspec/rspec-expectations#755) +* Ensure exception messages are compared as strings in the `raise_error` + matcher. (Jon Rowe, rspec/rspec-expectations#755) + +### 3.2.0 / 2015-02-03 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.1.2...v3.2.0) + +Enhancements: + +* Add `block_arg` method to custom matcher API, which allows you to + access the block passed to a custom matcher, if there is one. + (Mike Dalton, rspec/rspec-expectations#645) +* Provide more detail in failure message of `yield_control` matcher. + (Jon Rowe, rspec/rspec-expectations#650) +* Add a shorthand syntax for `chain` in the matcher DSL which assigns values + for use elsewhere, for example `chain :and_smaller_than, :small_value` + creates an `attr_reader` for `small_value` (Tom Stuart, rspec/rspec-expectations#644) +* Provide a more helpful deprecation message when using the `should` syntax. + (Elia Schito, rspec/rspec-expectations#663) +* Provide more detail in the `have_attributes` matcher failure message. + (Jon Rowe, rspec/rspec-expectations#668) +* Make the `have_attributes` matcher diffable. + (Jon Rowe, Alexey Fedorov, rspec/rspec-expectations#668) +* Add `output(...).to_std(out|err)_from_any_process` as alternatives + to `output(...).to_std(out|err)`. The latter doesn't work when a sub + process writes to the named stream but is much faster. + (Alex Genco, rspec/rspec-expectations#700) +* Improve compound matchers (created by `and` and `or`) so that diffs + are included in failures when one or more of their matchers + are diffable. (Alexey Fedorov, rspec/rspec-expectations#713) + +Bug Fixes: + +* Avoid calling `private_methods` from the `be` predicate matcher on + the target object if the object publicly responds to the predicate + method. This avoids a possible error that can occur if the object + raises errors from `private_methods` (which can happen with celluloid + objects). (@chapmajs, rspec/rspec-expectations#670) +* Make `yield_control` (with no modifier) default to + `at_least(:once)` rather than raising a confusing error + when multiple yields are encountered. + (Myron Marston, rspec/rspec-expectations#675) +* Fix "instance variable @color not initialized" warning when using + rspec-expectations outside of an rspec-core context. (Myron Marston, rspec/rspec-expectations#689) +* Fix `start_with` and `end_with` to work properly when checking a + string against an array of strings. (Myron Marston, rspec/rspec-expectations#690) +* Don't use internally delegated matchers when generating descriptions + for examples without doc strings. (Myron Marston, rspec/rspec-expectations#692) + +### 3.1.2 / 2014-09-26 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.1.1...v3.1.2) + +Bug Fixes: + +* Fix `define_negated_matcher` so that matchers that support fluent + interfaces continue to be negated after you use the chained method. + (Myron Marston, rspec/rspec-expectations#656) +* Fix `define_negated_matcher` so that the matchers fail with an + appropriate failure message. (Myron Marston, rspec/rspec-expectations#659) + +### 3.1.1 / 2014-09-15 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.1.0...v3.1.1) + +Bug Fixes: + +* Fix regression in `all` matcher in 3.1.0 that prevented it from + working on objects that are not `Enumerable` but do implement + `each_with_index` (such as an ActiveRecord proxy). (Jori Hardman, rspec/rspec-expectations#647) + +### 3.1.0 / 2014-09-04 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.4...v3.1.0) + +Enhancements: + +* Add `have_attributes` matcher, that passes if actual's attribute + values match the expected attributes hash: + `Person = Struct.new(:name, :age)` + `person = Person.new("Bob", 32)` + `expect(person).to have_attributes(:name => "Bob", :age => 32)`. + (Adam Farhi, rspec/rspec-expectations#571) +* Extended compound matcher support to block matchers, for cases like: + `expect { ... }.to change { x }.to(3).and change { y }.to(4)`. (Myron + Marston, rspec/rspec-expectations#567) +* Include chained methods in custom matcher description and failure message + when new `include_chain_clauses_in_custom_matcher_descriptions` config + option is enabled. (Dan Oved, rspec/rspec-expectations#600) +* Add `thrice` modifier to `yield_control` matcher as a synonym for + `exactly(3).times`. (Dennis Taylor, rspec/rspec-expectations#615) +* Add `RSpec::Matchers.define_negated_matcher`, which defines a negated + version of the named matcher. (Adam Farhi, Myron Marston, rspec/rspec-expectations#618) +* Document and support negation of `contain_exactly`/`match_array`. + (Jon Rowe, rspec/rspec-expectations#626). + +Bug Fixes: + +* Rename private `LegacyMacherAdapter` constant to `LegacyMatcherAdapter` + to fix typo. (Abdelkader Boudih, rspec/rspec-expectations#563) +* Fix `all` matcher so that it fails properly (rather than raising a + `NoMethodError`) when matched against a non-enumerable. (Hao Su, rspec/rspec-expectations#622) + +### 3.0.4 / 2014-08-14 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.3...v3.0.4) + +Bug Fixes: + +* Fix `start_with` and `end_with` so that they work properly with + structs. (Myron Marston, rspec/rspec-expectations#620) +* Fix failure message generation so that structs are printed properly + in failures. Previously failure messages would represent them as + an array. (Myron Marston, rspec/rspec-expectations#620) +* Fix composable matcher support so that it does not wrongly treat + structs as arrays. (Myron Marston, rspec/rspec-expectations#620) + +### 3.0.3 / 2014-07-21 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.2...v3.0.3) + +Bug Fixes: + +* Fix issue with detection of generic operator matchers so they work + correctly when undefined. (Myron Marston, rspec/rspec-expectations#597) +* Don't inadvertently define `BasicObject` in 1.8.7. (Chris Griego, rspec/rspec-expectations#603) +* Fix `include` matcher so that it fails gracefully when matched against + an object that does not respond to `include?`. (Myron Marston, rspec/rspec-expectations#607) + +### 3.0.2 / 2014-06-19 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.1...v3.0.2) + +Bug Fixes: + +* Fix regression in `contain_exactly` (AKA `match_array`) that caused it + to wrongly pass when the expected array was empty. (Myron Marston, rspec/rspec-expectations#581) +* Provide a better error message when you use the `change(obj, :msg)` + form of the change matcher but forget the message argument. (Alex + Sunderland, rspec/rspec-expectations#585) +* Make the `contain_exactly` matcher work with arrays that contain hashes in + arbitrary ordering. (Sam Phippen, rspec/rspec-expectations#578) + +### 3.0.1 / 2014-06-12 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.0...v3.0.1) + +Bug Fixes: + +* Add a missing `require` that would cause the `respond_to` matcher to + fail when used in a project where the rest of RSpec (e.g. core and + expecatations) weren't being used. (Myron Marston, rspec/rspec-expectations#566) +* Structs are no longer treated as arrays when diffed. (Jon Rowe, rspec/rspec-expectations#576) + +### 3.0.0 / 2014-06-01 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.0.rc1...v3.0.0) + +No code changes. Just taking it out of pre-release. + +### 3.0.0.rc1 / 2014-05-18 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.0.beta2...v3.0.0.rc1) + +Breaking Changes for 3.0.0: + +* Remove `matcher_execution_context` attribute from DSL-defined + custom matchers. (Myron Marston) +* Remove `RSpec::Matchers::Pretty#_pretty_print`. (Myron Marston) +* Remove `RSpec::Matchers::Pretty#expected_to_sentence`. (Myron Marston) +* Rename `RSpec::Matchers::Configuration` constant to + `RSpec::Expectations::Configuration`. (Myron Marston) +* Prevent `have_xyz` predicate matchers using private methods. + (Adrian Gonzalez) +* Block matchers must now implement `supports_block_expectations?`. + (Myron Marston) +* Stop supporting `require 'rspec-expectations'`. + Use `require 'rspec/expectations'` instead. (Myron Marston) + +Bug Fixes: + +* Fix `NoMethodError` triggered by beta2 when `YARD` was loaded in + the test environment. (Myron Marston) +* Fix `be_xyz` matcher to accept a `do...end` block. (Myron Marston) +* Fix composable matcher failure message generation logic + so that it does not blow up when given `$stdout` or `$stderr`. + (Myron Marston) +* Fix `change` matcher to work properly with `IO` objects. + (Myron Marston) +* Fix `exist` matcher so that it can be used in composed matcher + expressions involving objects that do not implement `exist?` or + `exists?`. (Daniel Fone) +* Fix composable matcher match logic so that it clones matchers + before using them in order to work properly with matchers + that use internal memoization based on a given `actual` value. + (Myron Marston) +* Fix `be_xyz` and `has_xyz` predicate matchers so that they can + be used in composed matcher expressions involving objects that + do not implement the predicate method. (Daniel Fone) + +Enhancements: + +* Document the remaining public APIs. rspec-expectations now has 100% of + the public API documented and will remain that way (as new undocumented + methods will fail the build). (Myron Marston) +* Improve the formatting of BigDecimal objects in `eq` matcher failure + messages. (Daniel Fone) +* Improve the failure message for `be_xyz` predicate matchers so + that it includes the `inspect` output of the receiver. + (Erik Michaels-Ober, Sam Phippen) +* Add `all` matcher, to allow you to specify that a given matcher + matches all elements in a collection: + `expect([1, 3, 5]).to all( be_odd )`. (Adam Farhi) +* Add boolean aliases (`&`/`|`) for compound operators (`and`/`or`). (Adam Farhi) +* Give users a clear error when they wrongly use a value matcher + in a block expectation expression (e.g. `expect { 3 }.to eq(3)`) + or vice versa. (Myron Marston) + +### 3.0.0.beta2 / 2014-02-17 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.0.beta1...v3.0.0.beta2) + +Breaking Changes for 3.0.0: + +* Remove deprecated support for accessing the `RSpec` constant using + `Rspec` or `Spec`. (Myron Marston) +* Remove deprecated `RSpec::Expectations.differ=`. (Myron Marston) +* Remove support for deprecated `expect(...).should`. (Myron Marston) +* Explicitly disallow `expect { }.not_to change { }` with `by`, + `by_at_least`, `by_at_most` or `to`. These have never been supported + but did not raise explicit errors. (Myron Marston) +* Provide `===` rather than `==` as an alias of `matches?` for + all matchers. The semantics of `===` are closer to an RSpec + matcher than `==`. (Myron Marston) +* Remove deprecated `RSpec::Matchers::OperatorMatcher` constant. + (Myron Marston) +* Make `RSpec::Expectations::ExpectationNotMetError` subclass + `Exception` rather than `StandardError` so they can bypass + a bare `rescue` in end-user code (e.g. when an expectation is + set from within a rspec-mocks stub implementation). (Myron Marston) +* Remove Test::Unit and Minitest 4.x integration. (Myron Marston) + +Enhancements: + +* Simplify the failure message of the `be` matcher when matching against: + `true`, `false` and `nil`. (Sam Phippen) +* Update matcher protocol and custom matcher DSL to better align + with the newer `expect` syntax. If you want your matchers to + maintain compatibility with multiple versions of RSpec, you can + alias the new names to the old. (Myron Marston) + * `failure_message_for_should` => `failure_message` + * `failure_message_for_should_not` => `failure_message_when_negated` + * `match_for_should` => `match` + * `match_for_should_not` => `match_when_negated` +* Improve generated descriptions from `change` matcher. (Myron Marston) +* Add support for compound matcher expressions using `and` and `or`. + Simply chain them off of any existing matcher to create an expression + like `expect(alphabet).to start_with("a").and end_with("z")`. + (Eloy Espinaco) +* Add `contain_exactly` as a less ambiguous version of `match_array`. + Note that it expects the expected array to be splatted as + individual args: `expect(array).to contain_exactly(1, 2)` is + the same as `expect(array).to match_array([1, 2])`. (Myron Marston) +* Update `contain_exactly`/`match_array` so that it can match against + other non-array collections (such as a `Set`). (Myron Marston) +* Update built-in matchers so that they can accept matchers as arguments + to allow you to compose matchers in arbitrary ways. (Myron Marston) +* Add `RSpec::Matchers::Composable` mixin that can be used to make + a custom matcher composable as well. Note that custom matchers + defined via `RSpec::Matchers.define` already have this. (Myron + Marston) +* Define noun-phrase aliases for built-in matchers, which can be + used when creating composed matcher expressions that read better + and provide better failure messages. (Myron Marston) +* Add `RSpec::Matchers.alias_matcher` so users can define their own + matcher aliases. The `description` of the matcher will reflect the + alternate matcher name. (Myron Marston) +* Add explicit `be_between` matcher. `be_between` has worked for a + long time as a dynamic predicate matcher, but the failure message + was suboptimal. The new matcher provides a much better failure + message. (Erik Michaels-Ober) +* Enhance the `be_between` matcher to allow for `inclusive` or `exclusive` + comparison (e.g. inclusive of min/max or exclusive of min/max). + (Pedro Gimenez) +* Make failure message for `not_to be #{operator}` less confusing by + only saying it's confusing when comparison operators are used. + (Prathamesh Sonpatki) +* Improve failure message of `eq` matcher when `Time` or `DateTime` + objects are used so that the full sub-second precision is included. + (Thomas Holmes, Jeff Wallace) +* Add `output` matcher for expecting that a block outputs `to_stdout` + or `to_stderr`. (Luca Pette, Matthias Günther) +* Forward a provided block on to the `has_xyz?` method call when + the `have_xyz` matcher is used. (Damian Galarza) +* Provide integration with Minitest 5.x. Require + `rspec/expectations/minitest_integration` after loading minitest + to use rspec-expectations with minitest. (Myron Marston) + +Bug Fixes: + +* Fix wrong matcher descriptions with falsey expected value (yujinakayama) +* Fix `expect { }.not_to change { }.from(x)` so that the matcher only + passes if the starting value is `x`. (Tyler Rick, Myron Marston) +* Fix hash diffing, so that it colorizes properly and doesn't consider trailing + commas when performing the diff. (Jared Norman) +* Fix built-in matchers to fail normally rather than raising + `ArgumentError` when given an object of the wrong type to match + against, so that they work well in composite matcher expressions like + `expect([1.51, "foo"]).to include(a_string_matching(/foo/), a_value_within(0.1).of(1.5))`. + (Myron Marston) + +Deprecations: + +* Retain support for RSpec 2 matcher protocol (e.g. for matchers + in 3rd party extension gems like `shoulda`), but it will print + a deprecation warning. (Myron Marston) + +### 3.0.0.beta1 / 2013-11-07 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.2...v3.0.0.beta1) + +Breaking Changes for 3.0.0: + +* Remove explicit support for 1.8.6. (Jon Rowe) +* Remove the deprecated `be_close` matcher, preferring `be_within` instead. + (Sam Phippen) +* Remove the deprecated `have`, `have_at_least` and `have_at_most` matchers. + You can continue using those matchers through https://github.com/rspec/rspec-collection_matchers, + or you can rewrite your expectations with something like + `expect(your_object.size).to eq(num)`. (Hugo Baraúna) +* Rename `be_true` and `be_false` to `be_truthy` and `be_falsey`. (Sam Phippen) +* Make `expect { }.to_not raise_error(SomeSpecificClass, message)`, + `expect { }.to_not raise_error(SomeSpecificClass)` and + `expect { }.to_not raise_error(message)` invalid, since they are prone + to hiding failures. Instead, use `expect { }.to_not raise_error` (with no + args). (Sam Phippen) +* Within `RSpec::Matchers.define` blocks, helper methods made available + either via `def self.helper` or `extend HelperModule` are no longer + available to the `match` block (or any of the others). Instead + `include` your helper module and define the helper method as an + instance method. (Myron Marston) +* Force upgrading Diff::LCS for encoding compatability with diffs. (Jon Rowe) + +Enhancements: + +* Support `do..end` style block with `raise_error` matcher. (Yuji Nakayama) +* Rewrote custom matcher DSL to simplify its implementation and solve a + few issues. (Myron Marston) +* Allow early `return` from within custom matcher DSL blocks. (Myron + Marston) +* The custom matcher DSL's `chain` can now accept a block. (Myron + Marston) +* Support setting an expectation on a `raise_error` matcher via a chained + `with_message` method call. (Sam Phippen) + +Bug Fixes: + +* Allow `include` and `match` matchers to be used from within a + DSL-defined custom matcher's `match` block. (Myron Marston) +* Correct encoding error message on diff failure (Jon Rowe) + +Deprecations: + + * Using the old `:should` syntax without explicitly configuring it is deprecated. + It will continue to work but will emit a deprecation warning in RSpec 3 if + you do not explicitly enable it. (Sam Phippen) + +### 2.99.2 / 2014-07-21 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.1...v2.99.2) + +Bug Fixes: + +* Fix regression in `Expectations#method_handle_for` where proxy objects + with method delegated would wrongly not return a method handle. + (Jon Rowe, rspec/rspec-expectations#594) +* Fix issue with detection of generic operator matchers so they work + correctly when undefined. (Myron Marston, rspec/rspec-expectations#597) + +### 2.99.1 / 2014-06-19 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.0...v2.99.1) + +Bug Fixes: + +* Fix typo in custom matcher `expected` deprecation warning -- it's + `expected_as_array`, not `expected_array`. (Frederick Cheung, rspec/rspec-expectations#562) + +### 2.99.0 / 2014-06-01 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.0.rc1...v2.99.0) + +Enhancements: + +* Special case deprecation message for `errors_on` with `rspec-rails` to be more useful. + (Aaron Kromer) + +### 2.99.0.rc1 / 2014-05-18 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.0.beta2...2.99.0.rc1) + +Deprecations: + +* Deprecate `matcher_execution_context` attribute on DSL-defined + custom matchers. (Myron Marston) +* Deprecate `RSpec::Matchers::Pretty#_pretty_print`. (Myron Marston) +* Deprecate `RSpec::Matchers::Pretty#expected_to_sentence`. (Myron Marston) +* Deprecate `RSpec::Matchers::Configuration` in favor of + `RSpec::Expectations::Configuration`. (Myron Marston) +* Deprecate `be_xyz` predicate matcher on an object that doesn't respond to + `xyz?` or `xyzs?`. (Daniel Fone) +* Deprecate `have_xyz` matcher on an object that doesn't respond to `has_xyz?`. + (Daniel Fone) +* Deprecate `have_xyz` matcher on an object that has a private method `has_xyz?`. + (Jon Rowe) +* Issue a deprecation warning when a block expectation expression is + used with a matcher that doesn't explicitly support block expectations + via `supports_block_expectations?`. (Myron Marston) +* Deprecate `require 'rspec-expectations'`. Use + `require 'rspec/expectations'` instead. (Myron Marston) + +### 2.99.0.beta2 / 2014-02-17 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.0.beta1...v2.99.0.beta2) + +Deprecations: + +* Deprecate chaining `by`, `by_at_least`, `by_at_most` or `to` off of + `expect { }.not_to change { }`. The docs have always said these are + not supported for the negative form but now they explicitly raise + errors in RSpec 3. (Myron Marston) +* Change the semantics of `expect { }.not_to change { x }.from(y)`. + In RSpec 2.x, this expectation would only fail if `x` started with + the value of `y` and changed. If it started with a different value + and changed, it would pass. In RSpec 3, it will pass only if the + value starts at `y` and it does not change. (Myron Marston) +* Deprecate `matcher == value` as an alias for `matcher.matches?(value)`, + in favor of `matcher === value`. (Myron Marston) +* Deprecate `RSpec::Matchers::OperatorMatcher` in favor of + `RSpec::Matchers::BuiltIn::OperatorMatcher`. (Myron Marston) +* Deprecate auto-integration with Test::Unit and minitest. + Instead, include `RSpec::Matchers` in the appropriate test case + base class yourself. (Myron Marston) +* Deprecate treating `#expected` on a DSL-generated custom matcher + as an array when only 1 argument is passed to the matcher method. + In RSpec 3 it will be the single value in order to make diffs + work properly. (Jon Rowe) + +### 2.99.0.beta1 / 2013-11-07 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.4...v2.99.0.beta1) + +Deprecations + +* Deprecate `have`, `have_at_least` and `have_at_most`. You can continue using those + matchers through https://github.com/rspec/rspec-collection_matchers, or + you can rewrite your expectations with something like + `expect(your_object.size).to eq(num)`. (Hugo Baraúna) +* Deprecate `be_xyz` predicate matcher when `xyz?` is a private method. + (Jon Rowe) +* Deprecate `be_true`/`be_false` in favour of `be_truthy`/`be_falsey` + (for Ruby's conditional semantics) or `be true`/`be false` + (for exact equality). (Sam Phippen) +* Deprecate calling helper methods from a custom matcher with the wrong + scope. (Myron Marston) + * `def self.foo` / `extend Helper` can be used to add macro methods + (e.g. methods that call the custom matcher DSL methods), but should + not be used to define helper methods called from within the DSL + blocks. + * `def foo` / `include Helper` is the opposite: it's for helper methods + callable from within a DSL block, but not for defining macros. + * RSpec 2.x allowed helper methods defined either way to be used for + either purpose, but RSpec 3.0 will not. + +### 2.14.5 / 2014-02-01 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.4...v2.14.5) + +Bug fixes + +* Fix wrong matcher descriptions with falsey expected value + (yujinakayama) + +### 2.14.4 / 2013-11-06 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.3...v2.14.4) + +Bug fixes + +* Make the `match` matcher produce a diff output. (Jon Rowe, Ben Moss) +* Choose encoding for diff's more intelligently, and when all else fails fall + back to default internal encoding with replacing characters. (Jon Rowe) + +### 2.14.3 / 2013-09-22 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.2...v2.14.3) + +Bug fixes + +* Fix operator matchers (`should` syntax) when `method` is redefined on target. + (Brandon Turner) +* Fix diffing of hashes with object based keys. (Jon Rowe) +* Fix operator matchers (`should` syntax) when operator is defined via + `method_missing` (Jon Rowe) + +### 2.14.2 / 2013-08-14 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.1...v2.14.2) + +Bug fixes + +* Fix `be_` matcher to not support operator chaining like the + `be` matcher does (e.g. `be == 5`). This led to some odd behaviors + since `be_ == anything` returned a `BeComparedTo` matcher + and was thus always truthy. This was a consequence of the implementation + (e.g. subclassing the basic `Be` matcher) and was not intended behavior. + (Myron Marston). +* Fix `change` matcher to compare using `==` in addition to `===`. This + is important for an expression like: + `expect {}.to change { a.class }.from(ClassA).to(ClassB)` because + `SomeClass === SomeClass` returns false. (Myron Marston) + +### 2.14.1 / 2013-08-08 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.0...2.14.1) + +Bug fixes + +* Ensure diff output uses the same encoding as the encoding of + the string being diff'd to prevent `Encoding::UndefinedConversionError` + errors (Jon Rowe). + +### 2.14.0 / 2013-07-06 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.0.rc1...v2.14.0) + +Bug fixes + +* Values that are not matchers use `#inspect`, rather than `#description` for + documentation output (Andy Lindeman, Sam Phippen). +* Make `expect(a).to be_within(x).percent_of(y)` work with negative y + (Katsuhiko Nishimra). +* Make the `be_predicate` matcher work as expected used with `expect{...}.to + change...` (Sam Phippen). + +### 2.14.0.rc1 / 2013-05-27 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.13.0...v2.14.0.rc1) + +Enhancements + +* Enhance `yield_control` so that you can specify an exact or relative + number of times: `expect { }.to yield_control.exactly(3).times`, + `expect { }.to yield_control.at_least(2).times`, etc (Bartek + Borkowski). +* Make the differ that is used when an expectation fails better handle arrays + by splitting each element of the array onto its own line. (Sam Phippen) +* Accept duck-typed strings that respond to `:to_str` as expectation messages. + (Toby Ovod-Everett) + +Bug fixes + +* Fix differ to not raise errors when dealing with differently-encoded + strings (Jon Rowe). +* Fix `expect(something).to be_within(x).percent_of(y)` where x and y are both + integers (Sam Phippen). +* Fix `have` matcher to handle the fact that on ruby 2.0, + `Enumerator#size` may return nil (Kenta Murata). +* Fix `expect { raise s }.to raise_error(s)` where s is an error instance + on ruby 2.0 (Sam Phippen). +* Fix `expect(object).to raise_error` passing. This now warns the user and + fails the spec (tomykaira). + +Deprecations + +* Deprecate `expect { }.not_to raise_error(SpecificErrorClass)` or + `expect { }.not_to raise_error("some specific message")`. Using + these was prone to hiding failures as they would allow _any other + error_ to pass. (Sam Phippen and David Chelimsky) + +### 2.13.0 / 2013-02-23 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.12.1...v2.13.0) + +Enhancements + +* Add support for percent deltas to `be_within` matcher: + `expect(value).to be_within(10).percent_of(expected)` + (Myron Marston). +* Add support to `include` matcher to allow it to be given a list + of matchers as the expecteds to match against (Luke Redpath). + +Bug fixes + +* Fix `change` matcher so that it dups strings in order to handle + mutated strings (Myron Marston). +* Fix `should be =~ /some regex/` / `expect(...).to be =~ /some regex/`. + Previously, these either failed with a confusing `undefined method + matches?' for false:FalseClass` error or were no-ops that didn't + actually verify anything (Myron Marston). +* Add compatibility for diff-lcs 1.2 and relax the version + constraint (Peter Goldstein). +* Fix DSL-generated matchers to allow multiple instances of the + same matcher in the same example to have different description + and failure messages based on the expected value (Myron Marston). +* Prevent `undefined method #split for Array` error when dumping + the diff of an array of multiline strings (Myron Marston). +* Don't blow up when comparing strings that are in an encoding + that is not ASCII compatible (Myron Marston). +* Remove confusing "Check the implementation of #==" message + printed for empty diffs (Myron Marston). + +### 2.12.1 / 2012-12-15 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.12.0...v2.12.1) + +Bug fixes + +* Improve the failure message for an expression like + `{}.should =~ {}`. (Myron Marston and Andy Lindeman) +* Provide a `match_regex` alias so that custom matchers + built using the matcher DSL can use it (since `match` + is a different method in that context). + (Steven Harman) + +### 2.12.0 / 2012-11-12 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.11.3...v2.12.0) + +Enhancements + +* Colorize diffs if the `--color` option is configured. (Alex Coplan) +* Include backtraces in unexpected errors handled by `raise_error` + matcher (Myron Marston) +* Print a warning when users accidentally pass a non-string argument + as an expectation message (Sam Phippen) +* `=~` and `match_array` matchers output a more useful error message when + the actual value is not an array (or an object that responds to `#to_ary`) + (Sam Phippen) + +Bug fixes + +* Fix `include` matcher so that `expect({}).to include(:a => nil)` + fails as it should (Sam Phippen). +* Fix `be_an_instance_of` matcher so that `Class#to_s` is used in the + description rather than `Class#inspect`, since some classes (like + `ActiveRecord::Base`) define a long, verbose `#inspect`. + (Tom Stuart) + +### 2.11.3 / 2012-09-04 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.11.2...v2.11.3) + +Bug fixes + +* Fix (and deprecate) `expect { }.should` syntax so that it works even + though it was never a documented or intended syntax. It worked as a + consequence of the implementation of `expect` in RSpec 2.10 and + earlier. (Myron Marston) +* Ensure #== is defined on built in matchers so that they can be composed. + For example: + + expect { + user.emailed! + }.to change { user.last_emailed_at }.to be_within(1.second).of(Time.zone.now) + +### 2.11.2 / 2012-07-25 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.11.1...v2.11.2) + +Bug fixes + +* Define `should` and `should_not` on `Object` rather than `BasicObject` + on MacRuby. On MacRuby, `BasicObject` is defined but is not the root + of the object hierarchy. (Gabriel Gilder) + +### 2.11.1 / 2012-07-08 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.11.0...v2.11.1) + +Bug fixes + +* Constrain `actual` in `be_within` matcher to values that respond to `-` instead + of requiring a specific type. + * `Time`, for example, is a legit alternative. + +### 2.11.0 / 2012-07-07 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.10.0...v2.11.0) + +Enhancements + +* Expand `expect` syntax so that it supports expections on bare values + in addition to blocks (Myron Marston). +* Add configuration options to control available expectation syntaxes + (Myron Marston): + * `RSpec.configuration.expect_with(:rspec) { |c| c.syntax = :expect }` + * `RSpec.configuration.expect_with(:rspec) { |c| c.syntax = :should }` + * `RSpec.configuration.expect_with(:rspec) { |c| c.syntax = [:should, :expect] }` + * `RSpec.configuration.add_should_and_should_not_to Delegator` + +Bug fixes + +* Allow only `Numeric` values to be the "actual" in the `be_within` matcher. + This prevents confusing error messages. (Su Zhang @zhangsu) +* Define `should` and `should_not` on `BasicObject` rather than `Kernel` + on 1.9. This makes `should` and `should_not` work properly with + `BasicObject`-subclassed proxy objects like `Delegator`. (Myron + Marston) + +### 2.10.0 / 2012-05-03 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.9.1...v2.10.0) + +Enhancements + +* Add new `start_with` and `end_with` matchers (Jeremy Wadsack) +* Add new matchers for specifying yields (Myron Marston): + * `expect {...}.to yield_control` + * `expect {...}.to yield_with_args(1, 2, 3)` + * `expect {...}.to yield_with_no_args` + * `expect {...}.to yield_successive_args(1, 2, 3)` +* `match_unless_raises` takes multiple exception args + +Bug fixes + +* Fix `be_within` matcher to be inclusive of delta. +* Fix message-specific specs to pass on Rubinius (John Firebaugh) + +### 2.9.1 / 2012-04-03 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.9.0...v2.9.1) + +Bug fixes + +* Provide a helpful message if the diff between two objects is empty. +* Fix bug diffing single strings with multiline strings. +* Fix for error with using custom matchers inside other custom matchers + (mirasrael) +* Fix using execution context methods in nested DSL matchers (mirasrael) + +### 2.9.0 / 2012-03-17 +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.8.0...v2.9.0) + +Enhancements + +* Move built-in matcher classes to RSpec::Matchers::BuiltIn to reduce pollution + of RSpec::Matchers (which is included in every example). +* Autoload files with matcher classes to improve load time. + +Bug fixes + +* Align `respond_to?` and `method_missing` in DSL-defined matchers. +* Clear out user-defined instance variables between invocations of DSL-defined + matchers. +* Dup the instance of a DSL generated matcher so its state is not changed by + subsequent invocations. +* Treat expected args consistently across positive and negative expectations + (thanks to Ralf Kistner for the heads up) + +### 2.8.0 / 2012-01-04 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.8.0.rc2...v2.8.0) + +Enhancements + +* Better diff output for Hash (Philippe Creux) +* Eliminate Ruby warnings (Olek Janiszewski) + +### 2.8.0.rc2 / 2011-12-19 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.8.0.rc1...v2.8.0.rc2) + +No changes for this release. Just releasing with the other rspec gems. + +### 2.8.0.rc1 / 2011-11-06 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.7.0...v2.8.0.rc1) + +Enhancements + +* Use classes for the built-in matchers (they're faster). +* Eliminate Ruby warnings (Matijs van Zuijlen) + +### 2.7.0 / 2011-10-16 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.6.0...v2.7.0) + +Enhancements + +* `HaveMatcher` converts argument using `to_i` (Alex Bepple & Pat Maddox) +* Improved failure message for the `have_xxx` matcher (Myron Marston) +* `HaveMatcher` supports `count` (Matthew Bellantoni) +* Change matcher dups `Enumerable` before the action, supporting custom + `Enumerable` types like `CollectionProxy` in Rails (David Chelimsky) + +Bug fixes + +* Fix typo in `have(n).xyz` documentation (Jean Boussier) +* fix `safe_sort` for ruby 1.9.2 (`Kernel` now defines `<=>` for Object) (Peter + van Hardenberg) + +### 2.6.0 / 2011-05-12 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.5.0...v2.6.0) + +Enhancements + +* `change` matcher accepts regexps (Robert Davis) +* better descriptions for `have_xxx` matchers (Magnus Bergmark) +* `range.should cover(*values)` (Anders Furseth) + +Bug fixes + +* Removed non-ascii characters that were choking rcov (Geoffrey Byers) +* change matcher dups arrays and hashes so their before/after states can be + compared correctly. +* Fix the order of inclusion of RSpec::Matchers in Test::Unit::TestCase and + MiniTest::Unit::TestCase to prevent a SystemStackError (Myron Marston) + +### 2.5.0 / 2011-02-05 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.4.0...v2.5.0) + +Enhancements + +* `should exist` works with `exist?` or `exists?` (Myron Marston) +* `expect { ... }.not_to do_something` (in addition to `to_not`) + +Documentation + +* improved docs for raise_error matcher (James Almond) + +### 2.4.0 / 2011-01-02 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.3.0...v2.4.0) + +No functional changes in this release, which was made to align with the +rspec-core-2.4.0 release. + +Enhancements + +* improved RDoc for change matcher (Jo Liss) + +### 2.3.0 / 2010-12-12 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.2.1...v2.3.0) + +Enhancements + +* diff strings when include matcher fails (Mike Sassak) + +### 2.2.0 / 2010-11-28 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.1.0...v2.2.0) + +### 2.1.0 / 2010-11-07 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.1...v2.1.0) + +Enhancements + +* `be_within(delta).of(expected)` matcher (Myron Marston) +* Lots of new Cucumber features (Myron Marston) +* Raise error if you try `should != expected` on Ruby-1.9 (Myron Marston) +* Improved failure messages from `throw_symbol` (Myron Marston) + +Bug fixes + +* Eliminate hard dependency on `RSpec::Core` (Myron Marston) +* `have_matcher` - use pluralize only when ActiveSupport inflections are indeed + defined (Josep M Bach) +* throw_symbol matcher no longer swallows exceptions (Myron Marston) +* fix matcher chaining to avoid name collisions (Myron Marston) + +### 2.0.0 / 2010-10-10 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.0.rc...v2.0.0) + +Enhancements + +* Add match_for_should_not method to matcher DSL (Myron Marston) + +Bug fixes + +* `respond_to` matcher works correctly with `should_not` with multiple methods + (Myron Marston) +* `include` matcher works correctly with `should_not` with multiple values + (Myron Marston) + +### 2.0.0.rc / 2010-10-05 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.0.beta.22...v2.0.0.rc) + +Enhancements + +* `require 'rspec/expectations'` in a T::U or MiniUnit suite (Josep M. Bach) + +Bug fixes + +* change by 0 passes/fails correctly (Len Smith) +* Add description to satisfy matcher + +### 2.0.0.beta.22 / 2010-09-12 + +[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.0.beta.20...v2.0.0.beta.22) + +Enhancements + +* diffing improvements + * diff multiline strings + * don't diff single line strings + * don't diff numbers (silly) + * diff regexp + multiline string + +Bug fixes + * `should[_not]` change now handles boolean values correctly diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/LICENSE.md b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/LICENSE.md new file mode 100644 index 0000000..dae02d8 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/LICENSE.md @@ -0,0 +1,25 @@ +The MIT License (MIT) +===================== + +* Copyright © 2012 David Chelimsky, Myron Marston +* Copyright © 2006 David Chelimsky, The RSpec Development Team +* Copyright © 2005 Steven Baker + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/README.md b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/README.md new file mode 100644 index 0000000..a649542 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/README.md @@ -0,0 +1,326 @@ +# RSpec Expectations [![Build Status](https://github.com/rspec/rspec-expectations/workflows/RSpec%20CI/badge.svg)](https://github.com/rspec/rspec-expectations/actions) [![Code Climate](https://codeclimate.com/github/rspec/rspec-expectations.svg)](https://codeclimate.com/github/rspec/rspec-expectations) + +RSpec::Expectations lets you express expected outcomes on an object in an +example. + +```ruby +expect(account.balance).to eq(Money.new(37.42, :USD)) +``` + +## Install + +If you want to use rspec-expectations with rspec, just install the rspec gem +and RubyGems will also install rspec-expectations for you (along with +rspec-core and rspec-mocks): + +```shell +gem install rspec +``` + +Want to run against the `main` branch? You'll need to include the dependent +RSpec repos as well. Add the following to your `Gemfile`: + +```ruby +%w[rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib| + gem lib, :git => "https://github.com/rspec/#{lib}.git", :branch => 'main' +end +``` + +If you want to use rspec-expectations with another tool, like Test::Unit, +Minitest, or Cucumber, you can install it directly: + +```shell +gem install rspec-expectations +``` + +## Contributing + +Once you've set up the environment, you'll need to cd into the working +directory of whichever repo you want to work in. From there you can run the +specs and cucumber features, and make patches. + +NOTE: You do not need to use rspec-dev to work on a specific RSpec repo. You +can treat each RSpec repo as an independent project. + +- [Build details](BUILD_DETAIL.md) +- [Code of Conduct](CODE_OF_CONDUCT.md) +- [Detailed contributing guide](CONTRIBUTING.md) +- [Development setup guide](DEVELOPMENT.md) + +## Basic usage + +Here's an example using rspec-core: + +```ruby +RSpec.describe Order do + it "sums the prices of the items in its line items" do + order = Order.new + order.add_entry(LineItem.new(:item => Item.new( + :price => Money.new(1.11, :USD) + ))) + order.add_entry(LineItem.new(:item => Item.new( + :price => Money.new(2.22, :USD), + :quantity => 2 + ))) + expect(order.total).to eq(Money.new(5.55, :USD)) + end +end +``` + +The `describe` and `it` methods come from rspec-core. The `Order`, `LineItem`, `Item` and `Money` classes would be from _your_ code. The last line of the example +expresses an expected outcome. If `order.total == Money.new(5.55, :USD)`, then +the example passes. If not, it fails with a message like: + +``` + expected: # + got: # +``` + +## Built-in matchers + +### Equivalence + +```ruby +expect(actual).to eq(expected) # passes if actual == expected +expect(actual).to eql(expected) # passes if actual.eql?(expected) +expect(actual).not_to eql(not_expected) # passes if not(actual.eql?(expected)) +``` + +Note: The new `expect` syntax no longer supports the `==` matcher. + +### Identity + +```ruby +expect(actual).to be(expected) # passes if actual.equal?(expected) +expect(actual).to equal(expected) # passes if actual.equal?(expected) +``` + +### Comparisons + +```ruby +expect(actual).to be > expected +expect(actual).to be >= expected +expect(actual).to be <= expected +expect(actual).to be < expected +expect(actual).to be_within(delta).of(expected) +``` + +### Regular expressions + +```ruby +expect(actual).to match(/expression/) +``` + +Note: The new `expect` syntax no longer supports the `=~` matcher. + +### Types/classes + +```ruby +expect(actual).to be_an_instance_of(expected) # passes if actual.class == expected +expect(actual).to be_a(expected) # passes if actual.kind_of?(expected) +expect(actual).to be_an(expected) # an alias for be_a +expect(actual).to be_a_kind_of(expected) # another alias +``` + +### Truthiness + +```ruby +expect(actual).to be_truthy # passes if actual is truthy (not nil or false) +expect(actual).to be true # passes if actual == true +expect(actual).to be_falsy # passes if actual is falsy (nil or false) +expect(actual).to be false # passes if actual == false +expect(actual).to be_nil # passes if actual is nil +expect(actual).to_not be_nil # passes if actual is not nil +``` + +### Expecting errors + +```ruby +expect { ... }.to raise_error +expect { ... }.to raise_error(ErrorClass) +expect { ... }.to raise_error("message") +expect { ... }.to raise_error(ErrorClass, "message") +``` + +### Expecting throws + +```ruby +expect { ... }.to throw_symbol +expect { ... }.to throw_symbol(:symbol) +expect { ... }.to throw_symbol(:symbol, 'value') +``` + +### Yielding + +```ruby +expect { |b| 5.tap(&b) }.to yield_control # passes regardless of yielded args + +expect { |b| yield_if_true(true, &b) }.to yield_with_no_args # passes only if no args are yielded + +expect { |b| 5.tap(&b) }.to yield_with_args(5) +expect { |b| 5.tap(&b) }.to yield_with_args(Integer) +expect { |b| "a string".tap(&b) }.to yield_with_args(/str/) + +expect { |b| [1, 2, 3].each(&b) }.to yield_successive_args(1, 2, 3) +expect { |b| { :a => 1, :b => 2 }.each(&b) }.to yield_successive_args([:a, 1], [:b, 2]) +``` + +### Predicate matchers + +```ruby +expect(actual).to be_xxx # passes if actual.xxx? +expect(actual).to have_xxx(:arg) # passes if actual.has_xxx?(:arg) +``` + +### Ranges (Ruby >= 1.9 only) + +```ruby +expect(1..10).to cover(3) +``` + +### Collection membership + +```ruby +# exact order, entire collection +expect(actual).to eq(expected) + +# exact order, partial collection (based on an exact position) +expect(actual).to start_with(expected) +expect(actual).to end_with(expected) + +# any order, entire collection +expect(actual).to match_array(expected) + +# You can also express this by passing the expected elements +# as individual arguments +expect(actual).to contain_exactly(expected_element1, expected_element2) + + # any order, partial collection +expect(actual).to include(expected) +``` + +#### Examples + +```ruby +expect([1, 2, 3]).to eq([1, 2, 3]) # Order dependent equality check +expect([1, 2, 3]).to include(1) # Exact ordering, partial collection matches +expect([1, 2, 3]).to include(2, 3) # +expect([1, 2, 3]).to start_with(1) # As above, but from the start of the collection +expect([1, 2, 3]).to start_with(1, 2) # +expect([1, 2, 3]).to end_with(3) # As above but from the end of the collection +expect([1, 2, 3]).to end_with(2, 3) # +expect({:a => 'b'}).to include(:a => 'b') # Matching within hashes +expect("this string").to include("is str") # Matching within strings +expect("this string").to start_with("this") # +expect("this string").to end_with("ring") # +expect([1, 2, 3]).to contain_exactly(2, 3, 1) # Order independent matches +expect([1, 2, 3]).to match_array([3, 2, 1]) # + +# Order dependent compound matchers +expect( + [{:a => 'hash'},{:a => 'another'}] +).to match([a_hash_including(:a => 'hash'), a_hash_including(:a => 'another')]) +``` + +## `should` syntax + +In addition to the `expect` syntax, rspec-expectations continues to support the +`should` syntax: + +```ruby +actual.should eq expected +actual.should be > 3 +[1, 2, 3].should_not include 4 +``` + +See [detailed information on the `should` syntax and its usage.](https://github.com/rspec/rspec-expectations/blob/main/Should.md) + +## Compound Matcher Expressions + +You can also create compound matcher expressions using `and` or `or`: + +``` ruby +expect(alphabet).to start_with("a").and end_with("z") +expect(stoplight.color).to eq("red").or eq("green").or eq("yellow") +``` + +## Composing Matchers + +Many of the built-in matchers are designed to take matchers as +arguments, to allow you to flexibly specify only the essential +aspects of an object or data structure. In addition, all of the +built-in matchers have one or more aliases that provide better +phrasing for when they are used as arguments to another matcher. + +### Examples + +```ruby +expect { k += 1.05 }.to change { k }.by( a_value_within(0.1).of(1.0) ) + +expect { s = "barn" }.to change { s } + .from( a_string_matching(/foo/) ) + .to( a_string_matching(/bar/) ) + +expect(["barn", 2.45]).to contain_exactly( + a_value_within(0.1).of(2.5), + a_string_starting_with("bar") +) + +expect(["barn", "food", 2.45]).to end_with( + a_string_matching("foo"), + a_value > 2 +) + +expect(["barn", 2.45]).to include( a_string_starting_with("bar") ) + +expect(:a => "food", :b => "good").to include(:a => a_string_matching(/foo/)) + +hash = { + :a => { + :b => ["foo", 5], + :c => { :d => 2.05 } + } +} + +expect(hash).to match( + :a => { + :b => a_collection_containing_exactly( + a_string_starting_with("f"), + an_instance_of(Integer) + ), + :c => { :d => (a_value < 3) } + } +) + +expect { |probe| + [1, 2, 3].each(&probe) +}.to yield_successive_args( a_value < 2, 2, a_value > 2 ) +``` + +## Usage outside rspec-core + +You always need to load `rspec/expectations` even if you only want to use one part of the library: + +```ruby +require 'rspec/expectations' +``` + +Then simply include `RSpec::Matchers` in any class: + +```ruby +class MyClass + include RSpec::Matchers + + def do_something(arg) + expect(arg).to be > 0 + # do other stuff + end +end +``` + +## Also see + +* [https://github.com/rspec/rspec](https://github.com/rspec/rspec) +* [https://github.com/rspec/rspec-core](https://github.com/rspec/rspec-core) +* [https://github.com/rspec/rspec-mocks](https://github.com/rspec/rspec-mocks) +* [https://github.com/rspec/rspec-rails](https://github.com/rspec/rspec-rails) diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations.rb new file mode 100644 index 0000000..9e11ea0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations.rb @@ -0,0 +1,82 @@ +require 'rspec/support' +RSpec::Support.require_rspec_support "caller_filter" +RSpec::Support.require_rspec_support "warnings" +RSpec::Support.require_rspec_support "object_formatter" + +require 'rspec/matchers' + +RSpec::Support.define_optimized_require_for_rspec(:expectations) { |f| require_relative(f) } + +%w[ + expectation_target + configuration + fail_with + handler + version +].each { |file| RSpec::Support.require_rspec_expectations(file) } + +module RSpec + # RSpec::Expectations provides a simple, readable API to express + # the expected outcomes in a code example. To express an expected + # outcome, wrap an object or block in `expect`, call `to` or `to_not` + # (aliased as `not_to`) and pass it a matcher object: + # + # expect(order.total).to eq(Money.new(5.55, :USD)) + # expect(list).to include(user) + # expect(message).not_to match(/foo/) + # expect { do_something }.to raise_error + # + # The last form (the block form) is needed to match against ruby constructs + # that are not objects, but can only be observed when executing a block + # of code. This includes raising errors, throwing symbols, yielding, + # and changing values. + # + # When `expect(...).to` is invoked with a matcher, it turns around + # and calls `matcher.matches?()`. For example, + # in the expression: + # + # expect(order.total).to eq(Money.new(5.55, :USD)) + # + # ...`eq(Money.new(5.55, :USD))` returns a matcher object, and it results + # in the equivalent of `eq.matches?(order.total)`. If `matches?` returns + # `true`, the expectation is met and execution continues. If `false`, then + # the spec fails with the message returned by `eq.failure_message`. + # + # Given the expression: + # + # expect(order.entries).not_to include(entry) + # + # ...the `not_to` method (also available as `to_not`) invokes the equivalent of + # `include.matches?(order.entries)`, but it interprets `false` as success, and + # `true` as a failure, using the message generated by + # `include.failure_message_when_negated`. + # + # rspec-expectations ships with a standard set of useful matchers, and writing + # your own matchers is quite simple. + # + # See [RSpec::Matchers](../RSpec/Matchers) for more information about the + # built-in matchers that ship with rspec-expectations, and how to write your + # own custom matchers. + module Expectations + # Exception raised when an expectation fails. + # + # @note We subclass Exception so that in a stub implementation if + # the user sets an expectation, it can't be caught in their + # code by a bare `rescue`. + # @api public + class ExpectationNotMetError < Exception + end + + # Exception raised from `aggregate_failures` when multiple expectations fail. + # + # @note The constant is defined here but the extensive logic of this class + # is lazily defined when `FailureAggregator` is autoloaded, since we do + # not need to waste time defining that functionality unless + # `aggregate_failures` is used. + class MultipleExpectationsNotMetError < ExpectationNotMetError + end + + autoload :BlockSnippetExtractor, "rspec/expectations/block_snippet_extractor" + autoload :FailureAggregator, "rspec/expectations/failure_aggregator" + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/block_snippet_extractor.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/block_snippet_extractor.rb new file mode 100644 index 0000000..25cc326 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/block_snippet_extractor.rb @@ -0,0 +1,255 @@ +module RSpec + module Expectations + # @private + class BlockSnippetExtractor # rubocop:disable Metrics/ClassLength + # rubocop should properly handle `Struct.new {}` as an inner class definition. + + attr_reader :proc, :method_name + + def self.try_extracting_single_line_body_of(proc, method_name) + lines = new(proc, method_name).body_content_lines + return nil unless lines.count == 1 + lines.first + rescue Error + nil + end + + def initialize(proc, method_name) + @proc = proc + @method_name = method_name.to_s.freeze + end + + # Ideally we should properly handle indentations of multiline snippet, + # but it's not implemented yet since because we use result of this method only when it's a + # single line and implementing the logic introduces additional complexity. + def body_content_lines + raw_body_lines.map(&:strip).reject(&:empty?) + end + + private + + def raw_body_lines + raw_body_snippet.split("\n") + end + + def raw_body_snippet + block_token_extractor.body_tokens.map(&:string).join + end + + def block_token_extractor + @block_token_extractor ||= BlockTokenExtractor.new(method_name, source, beginning_line_number) + end + + if RSpec.respond_to?(:world) + def source + raise TargetNotFoundError unless File.exist?(file_path) + RSpec.world.source_from_file(file_path) + end + else + # :nocov: + RSpec::Support.require_rspec_support 'source' + def source + raise TargetNotFoundError unless File.exist?(file_path) + @source ||= RSpec::Support::Source.from_file(file_path) + end + # :nocov: + end + + def file_path + source_location.first + end + + def beginning_line_number + source_location.last + end + + def source_location + proc.source_location || raise(TargetNotFoundError) + end + + Error = Class.new(StandardError) + TargetNotFoundError = Class.new(Error) + AmbiguousTargetError = Class.new(Error) + + # @private + # Performs extraction of block body snippet using tokens, + # which cannot be done with node information. + BlockTokenExtractor = Struct.new(:method_name, :source, :beginning_line_number) do + attr_reader :state, :body_tokens + + def initialize(*) + super + parse! + end + + private + + def parse! + @state = :initial + + catch(:finish) do + source.tokens.each do |token| + invoke_state_handler(token) + end + end + end + + def finish! + throw :finish + end + + def invoke_state_handler(token) + __send__("#{state}_state", token) + end + + def initial_state(token) + @state = :after_method_call if token.location == block_locator.method_call_location + end + + def after_method_call_state(token) + @state = :after_opener if handle_opener_token(token) + end + + def after_opener_state(token) + if handle_closer_token(token) + finish_or_find_next_block_if_incorrect! + elsif pipe_token?(token) + finalize_pending_tokens! + @state = :after_beginning_of_args + else + pending_tokens << token + handle_opener_token(token) + @state = :after_beginning_of_body unless token.type == :on_sp + end + end + + def after_beginning_of_args_state(token) + @state = :after_beginning_of_body if pipe_token?(token) + end + + def after_beginning_of_body_state(token) + if handle_closer_token(token) + finish_or_find_next_block_if_incorrect! + else + pending_tokens << token + handle_opener_token(token) + end + end + + def pending_tokens + @pending_tokens ||= [] + end + + def finalize_pending_tokens! + pending_tokens.freeze.tap do + @pending_tokens = nil + end + end + + def finish_or_find_next_block_if_incorrect! + body_tokens = finalize_pending_tokens! + + if correct_block?(body_tokens) + @body_tokens = body_tokens + finish! + else + @state = :after_method_call + end + end + + def handle_opener_token(token) + opener_token?(token).tap do |boolean| + opener_token_stack.push(token) if boolean + end + end + + def opener_token?(token) + token.type == :on_lbrace || (token.type == :on_kw && token.string == 'do') + end + + def handle_closer_token(token) + if opener_token_stack.last.closed_by?(token) + opener_token_stack.pop + opener_token_stack.empty? + else + false + end + end + + def opener_token_stack + @opener_token_stack ||= [] + end + + def pipe_token?(token) + token.type == :on_op && token.string == '|' + end + + def correct_block?(body_tokens) + return true if block_locator.body_content_locations.empty? + content_location = block_locator.body_content_locations.first + content_location.between?(body_tokens.first.location, body_tokens.last.location) + end + + def block_locator + @block_locator ||= BlockLocator.new(method_name, source, beginning_line_number) + end + end + + # @private + # Locates target block with node information (semantics), which tokens don't have. + BlockLocator = Struct.new(:method_name, :source, :beginning_line_number) do + def method_call_location + @method_call_location ||= method_ident_node.location + end + + def body_content_locations + @body_content_locations ||= block_body_node.map(&:location).compact + end + + private + + def method_ident_node + method_call_node = block_wrapper_node.children.first + method_call_node.find do |node| + method_ident_node?(node) + end + end + + def block_body_node + block_node = block_wrapper_node.children[1] + block_node.children.last + end + + def block_wrapper_node + case candidate_block_wrapper_nodes.size + when 1 + candidate_block_wrapper_nodes.first + when 0 + raise TargetNotFoundError + else + raise AmbiguousTargetError + end + end + + def candidate_block_wrapper_nodes + @candidate_block_wrapper_nodes ||= candidate_method_ident_nodes.map do |method_ident_node| + block_wrapper_node = method_ident_node.each_ancestor.find { |node| node.type == :method_add_block } + next nil unless block_wrapper_node + method_call_node = block_wrapper_node.children.first + method_call_node.include?(method_ident_node) ? block_wrapper_node : nil + end.compact + end + + def candidate_method_ident_nodes + source.nodes_by_line_number[beginning_line_number].select do |node| + method_ident_node?(node) + end + end + + def method_ident_node?(node) + node.type == :@ident && node.args.first == method_name + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/configuration.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/configuration.rb new file mode 100644 index 0000000..21620fb --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/configuration.rb @@ -0,0 +1,244 @@ +RSpec::Support.require_rspec_expectations "syntax" + +module RSpec + module Expectations + # Provides configuration options for rspec-expectations. + # If you are using rspec-core, you can access this via a + # block passed to `RSpec::Core::Configuration#expect_with`. + # Otherwise, you can access it via RSpec::Expectations.configuration. + # + # @example + # RSpec.configure do |rspec| + # rspec.expect_with :rspec do |c| + # # c is the config object + # end + # end + # + # # or + # + # RSpec::Expectations.configuration + class Configuration + # @private + FALSE_POSITIVE_BEHAVIOURS = + { + :warn => lambda { |message| RSpec.warning message }, + :raise => lambda { |message| raise ArgumentError, message }, + :nothing => lambda { |_| true }, + } + + def initialize + @on_potential_false_positives = :warn + @strict_predicate_matchers = false + end + + # Configures the supported syntax. + # @param [Array, Symbol] values the syntaxes to enable + # @example + # RSpec.configure do |rspec| + # rspec.expect_with :rspec do |c| + # c.syntax = :should + # # or + # c.syntax = :expect + # # or + # c.syntax = [:should, :expect] + # end + # end + def syntax=(values) + if Array(values).include?(:expect) + Expectations::Syntax.enable_expect + else + Expectations::Syntax.disable_expect + end + + if Array(values).include?(:should) + Expectations::Syntax.enable_should + else + Expectations::Syntax.disable_should + end + end + + # Configures the maximum character length that RSpec will print while + # formatting an object. You can set length to nil to prevent RSpec from + # doing truncation. + # @param [Fixnum] length the number of characters to limit the formatted output to. + # @example + # RSpec.configure do |rspec| + # rspec.expect_with :rspec do |c| + # c.max_formatted_output_length = 200 + # end + # end + def max_formatted_output_length=(length) + RSpec::Support::ObjectFormatter.default_instance.max_formatted_output_length = length + end + + # The list of configured syntaxes. + # @return [Array] the list of configured syntaxes. + # @example + # unless RSpec::Matchers.configuration.syntax.include?(:expect) + # raise "this RSpec extension gem requires the rspec-expectations `:expect` syntax" + # end + def syntax + syntaxes = [] + syntaxes << :should if Expectations::Syntax.should_enabled? + syntaxes << :expect if Expectations::Syntax.expect_enabled? + syntaxes + end + + if ::RSpec.respond_to?(:configuration) + def color? + ::RSpec.configuration.color_enabled? + end + else + # :nocov: + # Indicates whether or not diffs should be colored. + # Delegates to rspec-core's color option if rspec-core + # is loaded; otherwise you can set it here. + attr_writer :color + + # Indicates whether or not diffs should be colored. + # Delegates to rspec-core's color option if rspec-core + # is loaded; otherwise you can set it here. + def color? + defined?(@color) && @color + end + # :nocov: + end + + # :nocov: Because this is only really _useful_ on 1.8, and hard to test elsewhere. + # + # Adds `should` and `should_not` to the given classes + # or modules. This can be used to ensure `should` works + # properly on things like proxy objects (particular + # `Delegator`-subclassed objects on 1.8). + # + # @param [Array] modules the list of classes or modules + # to add `should` and `should_not` to. + def add_should_and_should_not_to(*modules) + modules.each do |mod| + Expectations::Syntax.enable_should(mod) + end + end + # :nocov: + + # Sets or gets the backtrace formatter. The backtrace formatter should + # implement `#format_backtrace(Array)`. This is used + # to format backtraces of errors handled by the `raise_error` + # matcher. + # + # If you are using rspec-core, rspec-core's backtrace formatting + # will be used (including respecting the presence or absence of + # the `--backtrace` option). + # + # @!attribute [rw] backtrace_formatter + attr_writer :backtrace_formatter + def backtrace_formatter + @backtrace_formatter ||= if defined?(::RSpec.configuration.backtrace_formatter) + ::RSpec.configuration.backtrace_formatter + else + NullBacktraceFormatter + end + end + + # Sets if custom matcher descriptions and failure messages + # should include clauses from methods defined using `chain`. + # @param value [Boolean] + attr_writer :include_chain_clauses_in_custom_matcher_descriptions + + # Indicates whether or not custom matcher descriptions and failure messages + # should include clauses from methods defined using `chain`. It is + # false by default for backwards compatibility. + def include_chain_clauses_in_custom_matcher_descriptions? + @include_chain_clauses_in_custom_matcher_descriptions ||= false + end + + # @private + def reset_syntaxes_to_default + self.syntax = [:should, :expect] + RSpec::Expectations::Syntax.warn_about_should! + end + + # @api private + # Null implementation of a backtrace formatter used by default + # when rspec-core is not loaded. Does no filtering. + NullBacktraceFormatter = Module.new do + def self.format_backtrace(backtrace) + backtrace + end + end + + # Configures whether RSpec will warn about matcher use which will + # potentially cause false positives in tests. + # + # @param [Boolean] boolean + def warn_about_potential_false_positives=(boolean) + if boolean + self.on_potential_false_positives = :warn + elsif warn_about_potential_false_positives? + self.on_potential_false_positives = :nothing + else + # no-op, handler is something else + end + end + + # Configures what RSpec will do about matcher use which would potentially cause + # false positives in tests. Defaults to `:warn` since this is generally the desired behavior, + # but can also be set to `:raise` or `:nothing`. + # + # @overload on_potential_false_positives + # @return [Symbol] the behavior setting + # @overload on_potential_false_positives=(value) + # @param [Symbol] behavior can be set to `:warn`, `:raise` or `:nothing` + # @return [Symbol] the behavior setting + attr_reader :on_potential_false_positives + + def on_potential_false_positives=(behavior) + unless FALSE_POSITIVE_BEHAVIOURS.key?(behavior) + raise ArgumentError, "Supported values are: #{FALSE_POSITIVE_BEHAVIOURS.keys}" + end + @on_potential_false_positives = behavior + end + + # Configures RSpec to check predicate matchers to `be(true)` / `be(false)` (strict), + # or `be_truthy` / `be_falsey` (not strict). + # Historically, the default was `false`, but `true` is recommended. + # + # @overload strict_predicate_matchers + # @return [Boolean] + # @overload strict_predicate_matchers? + # @return [Boolean] + # @overload strict_predicate_matchers=(value) + # @param [Boolean] value + attr_reader :strict_predicate_matchers + + def strict_predicate_matchers=(value) + raise ArgumentError, "Pass `true` or `false`" unless value == true || value == false + @strict_predicate_matchers = value + end + + def strict_predicate_matchers? + @strict_predicate_matchers + end + + # Indicates whether RSpec will warn about matcher use which will + # potentially cause false positives in tests, generally you want to + # avoid such scenarios so this defaults to `true`. + def warn_about_potential_false_positives? + on_potential_false_positives == :warn + end + + # @private + def false_positives_handler + FALSE_POSITIVE_BEHAVIOURS.fetch(@on_potential_false_positives) + end + end + + # The configuration object. + # @return [RSpec::Expectations::Configuration] the configuration object + def self.configuration + @configuration ||= Configuration.new + end + + # set default syntax + configuration.reset_syntaxes_to_default + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/expectation_target.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/expectation_target.rb new file mode 100644 index 0000000..7d1e8d4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/expectation_target.rb @@ -0,0 +1,163 @@ +module RSpec + module Expectations + # Wraps the target of an expectation. + # + # @example + # expect(something) # => ExpectationTarget wrapping something + # expect { do_something } # => ExpectationTarget wrapping the block + # + # # used with `to` + # expect(actual).to eq(3) + # + # # with `not_to` + # expect(actual).not_to eq(3) + # + # @note `ExpectationTarget` is not intended to be instantiated + # directly by users. Use `expect` instead. + class ExpectationTarget + # @private + # Used as a sentinel value to be able to tell when the user + # did not pass an argument. We can't use `nil` for that because + # `nil` is a valid value to pass. + UndefinedValue = Module.new + + # @note this name aligns with `Minitest::Expectation` so that our + # {InstanceMethods} module can be included in that class when + # used in a Minitest context. + # @return [Object] the target of the expectation + attr_reader :target + + # @api private + def initialize(value) + @target = value + end + + # @private + def self.for(value, block) + if UndefinedValue.equal?(value) + unless block + raise ArgumentError, "You must pass either an argument or a block to `expect`." + end + BlockExpectationTarget.new(block) + elsif block + raise ArgumentError, "You cannot pass both an argument and a block to `expect`." + else + ValueExpectationTarget.new(value) + end + end + + # Defines instance {ExpectationTarget} instance methods. These are defined + # in a module so we can include it in `Minitest::Expectation` when + # `rspec/expectations/minitest_integration` is loaded in order to + # support usage with Minitest. + module InstanceMethods + # Runs the given expectation, passing if `matcher` returns true. + # @example + # expect(value).to eq(5) + # expect { perform }.to raise_error + # @param [Matcher] + # matcher + # @param [String, Proc] message optional message to display when the expectation fails + # @return [Boolean] true if the expectation succeeds (else raises) + # @see RSpec::Matchers + def to(matcher=nil, message=nil, &block) + prevent_operator_matchers(:to) unless matcher + RSpec::Expectations::PositiveExpectationHandler.handle_matcher(target, matcher, message, &block) + end + + # Runs the given expectation, passing if `matcher` returns false. + # @example + # expect(value).not_to eq(5) + # @param [Matcher] + # matcher + # @param [String, Proc] message optional message to display when the expectation fails + # @return [Boolean] false if the negative expectation succeeds (else raises) + # @see RSpec::Matchers + def not_to(matcher=nil, message=nil, &block) + prevent_operator_matchers(:not_to) unless matcher + RSpec::Expectations::NegativeExpectationHandler.handle_matcher(target, matcher, message, &block) + end + alias to_not not_to + + private + + def prevent_operator_matchers(verb) + raise ArgumentError, "The expect syntax does not support operator matchers, " \ + "so you must pass a matcher to `##{verb}`." + end + end + + include InstanceMethods + end + + # @private + # Validates the provided matcher to ensure it supports block + # expectations, in order to avoid user confusion when they + # use a block thinking the expectation will be on the return + # value of the block rather than the block itself. + class ValueExpectationTarget < ExpectationTarget + def to(matcher=nil, message=nil, &block) + enforce_value_expectation(matcher) + super + end + + def not_to(matcher=nil, message=nil, &block) + enforce_value_expectation(matcher) + super + end + + private + + def enforce_value_expectation(matcher) + return if supports_value_expectations?(matcher) + + RSpec.deprecate( + "expect(value).to #{RSpec::Support::ObjectFormatter.format(matcher)}", + :message => + "The implicit block expectation syntax is deprecated, you should pass " \ + "a block rather than an argument to `expect` to use the provided " \ + "block expectation matcher or the matcher must implement " \ + "`supports_value_expectations?`. e.g `expect { value }.to " \ + "#{RSpec::Support::ObjectFormatter.format(matcher)}` not " \ + "`expect(value).to #{RSpec::Support::ObjectFormatter.format(matcher)}`" + ) + end + + def supports_value_expectations?(matcher) + !matcher.respond_to?(:supports_value_expectations?) || matcher.supports_value_expectations? + end + end + + # @private + # Validates the provided matcher to ensure it supports block + # expectations, in order to avoid user confusion when they + # use a block thinking the expectation will be on the return + # value of the block rather than the block itself. + class BlockExpectationTarget < ExpectationTarget + def to(matcher, message=nil, &block) + enforce_block_expectation(matcher) + super + end + + def not_to(matcher, message=nil, &block) + enforce_block_expectation(matcher) + super + end + alias to_not not_to + + private + + def enforce_block_expectation(matcher) + return if supports_block_expectations?(matcher) + + raise ExpectationNotMetError, "You must pass an argument rather than a block to `expect` to use the provided " \ + "matcher (#{RSpec::Support::ObjectFormatter.format(matcher)}), or the matcher must implement " \ + "`supports_block_expectations?`." + end + + def supports_block_expectations?(matcher) + matcher.respond_to?(:supports_block_expectations?) && matcher.supports_block_expectations? + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/fail_with.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/fail_with.rb new file mode 100644 index 0000000..17b66b3 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/fail_with.rb @@ -0,0 +1,39 @@ +module RSpec + module Expectations + class << self + # @private + class Differ + # @private + OBJECT_PREPARER = lambda do |object| + RSpec::Matchers::Composable.surface_descriptions_in(object) + end + end + + # @private + def differ + RSpec::Support::Differ.new( + :object_preparer => Differ::OBJECT_PREPARER, + :color => RSpec::Matchers.configuration.color? + ) + end + + # Raises an RSpec::Expectations::ExpectationNotMetError with message. + # @param [String] message + # @param [Object] expected + # @param [Object] actual + # + # Adds a diff to the failure message when `expected` and `actual` are + # both present. + def fail_with(message, expected=nil, actual=nil) + unless message + raise ArgumentError, "Failure message is nil. Does your matcher define the " \ + "appropriate failure_message[_when_negated] method to return a string?" + end + + message = ::RSpec::Matchers::MultiMatcherDiff.from(expected, actual).message_with_diff(message, differ) + + RSpec::Support.notify_failure(RSpec::Expectations::ExpectationNotMetError.new message) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/failure_aggregator.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/failure_aggregator.rb new file mode 100644 index 0000000..b573bba --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/failure_aggregator.rb @@ -0,0 +1,236 @@ +module RSpec + module Expectations + # @private + class FailureAggregator + attr_reader :block_label, :metadata + + # @private + class AggregatedFailure + # :nocov: + # `inspect` was apparently used by some versions early in ruby 3 while constructing + # NoMethodError, but seems to be no longer. + # + # @private + MESSAGE = + 'AggregatedFailure: This method caused a failure which has been ' \ + 'suppressed to be aggregated into our failure report by returning ' \ + 'this value, further errors can be ignored.' + + def inspect + MESSAGE + end + # :nocov: + end + + AGGREGATED_FAILURE = AggregatedFailure.new + + def aggregate + RSpec::Support.with_failure_notifier(self) do + begin + yield + rescue ExpectationNotMetError => e + # Normally, expectation failures will be notified via the `call` method, below, + # but since the failure notifier uses a thread local variable, failing expectations + # in another thread will still raise. We handle that here and categorize it as part + # of `failures` rather than letting it fall through and be categorized as part of + # `other_errors`. + failures << e + rescue Support::AllExceptionsExceptOnesWeMustNotRescue => e + # While it is normally a bad practice to rescue `Exception`, it's important we do + # so here. It's low risk (`notify_aggregated_failures` below will re-raise the exception, + # or raise a `MultipleExpectationsNotMetError` that includes the exception), and it's + # essential that the user is notified of expectation failures that may have already + # occurred in the `aggregate_failures` block. Those expectation failures may provide + # important diagnostics for understanding why this exception occurred, and if we simply + # allowed this exception to be raised as-is, it would (wrongly) suggest to the user + # that the expectation passed when it did not, which would be quite confusing. + other_errors << e + end + end + + notify_aggregated_failures + end + + def failures + @failures ||= [] + end + + def other_errors + @other_errors ||= [] + end + + # This method is defined to satisfy the callable interface + # expected by `RSpec::Support.with_failure_notifier`. + def call(failure, options) + source_id = options[:source_id] + return if source_id && @seen_source_ids.key?(source_id) + + @seen_source_ids[source_id] = true + assign_backtrace(failure) unless failure.backtrace + failures << failure + + AGGREGATED_FAILURE + end + + private + + if RSpec::Support::Ruby.jruby? && RSpec::Support::Ruby.jruby_version < '9.2.0.0' + # On JRuby 9.1.x.x and before, `caller` and `raise` produce different backtraces with + # regards to `.java` stack frames. It's important that we use `raise` for JRuby to produce + # a backtrace that has a continuous common section with the raised `MultipleExpectationsNotMetError`, + # so that rspec-core's truncation logic can work properly on it to list the backtrace + # relative to the `aggregate_failures` block. + # :nocov: + def assign_backtrace(failure) + raise failure + rescue failure.class => e + failure.set_backtrace(e.backtrace) + end + # :nocov: + else + # Using `caller` performs better (and is simpler) than `raise` on most Rubies. + def assign_backtrace(failure) + failure.set_backtrace(caller) + end + end + + def initialize(block_label, metadata) + @block_label = block_label + @metadata = metadata + @seen_source_ids = {} # don't want to load stdlib set + end + + def notify_aggregated_failures + all_errors = failures + other_errors + + case all_errors.size + when 0 then return true + when 1 then RSpec::Support.notify_failure all_errors.first + else RSpec::Support.notify_failure MultipleExpectationsNotMetError.new(self) + end + end + end + + # Exception raised from `aggregate_failures` when multiple expectations fail. + class MultipleExpectationsNotMetError + # @return [String] The fully formatted exception message. + def message + @message ||= (["#{summary}:"] + enumerated_failures + enumerated_errors).join("\n\n") + end + + # @return [Array] The list of expectation failures. + def failures + @failure_aggregator.failures + end + + # @return [Array] The list of other exceptions. + def other_errors + @failure_aggregator.other_errors + end + + # @return [Array] The list of expectation failures and other exceptions, combined. + attr_reader :all_exceptions + + # @return [String] The user-assigned label for the aggregation block. + def aggregation_block_label + @failure_aggregator.block_label + end + + # @return [Hash] The metadata hash passed to `aggregate_failures`. + def aggregation_metadata + @failure_aggregator.metadata + end + + # @return [String] A summary of the failure, including the block label and a count of failures. + def summary + "Got #{exception_count_description} from failure aggregation " \ + "block#{block_description}" + end + + # return [String] A description of the failure/error counts. + def exception_count_description + failure_count = pluralize("failure", failures.size) + return failure_count if other_errors.empty? + error_count = pluralize("other error", other_errors.size) + "#{failure_count} and #{error_count}" + end + + private + + def initialize(failure_aggregator) + @failure_aggregator = failure_aggregator + @all_exceptions = failures + other_errors + end + + def block_description + return "" unless aggregation_block_label + " #{aggregation_block_label.inspect}" + end + + def pluralize(noun, count) + "#{count} #{noun}#{'s' unless count == 1}" + end + + def enumerated(exceptions, index_offset) + exceptions.each_with_index.map do |exception, index| + index += index_offset + formatted_message = "#{yield exception}\n#{format_backtrace(exception.backtrace).first}" + "#{index_label index}#{indented formatted_message, index}" + end + end + + def exclusion_patterns + patterns = %w[/lib\d*/ruby/ bin/ exe/rspec /lib/bundler/ /exe/bundle:] + patterns << "org/jruby/" if RSpec::Support::Ruby.jruby? + patterns.map! { |s| Regexp.new(s.gsub('/', File::SEPARATOR)) } + end + + def format_backtrace(backtrace) + backtrace.map { |l| backtrace_line(l) }.compact.tap { |filtered| filtered.concat backtrace if filtered.empty? } + end + + def backtrace_line(line) + return if [Regexp.union(RSpec::CallerFilter::IGNORE_REGEX, *exclusion_patterns)].any? { |p| line =~ p } + + # It changes the current path that is relative to + # system root to be relative to the project root. + line.sub(/(\A|\s)#{File.expand_path('.')}(#{File::SEPARATOR}|\s|\Z)/, '\\1.\\2'.freeze).sub(/\A([^:]+:\d+)$/, '\\1'.freeze) + end + + def enumerated_failures + enumerated(failures, 0, &:message) + end + + def enumerated_errors + enumerated(other_errors, failures.size) do |error| + "#{error.class}: #{error.message}" + end + end + + def indented(failure_message, index) + line_1, *rest = failure_message.strip.lines.to_a + first_line_indentation = ' ' * (longest_index_label_width - width_of_label(index)) + + first_line_indentation + line_1 + rest.map do |line| + line =~ /\S/ ? indentation + line : line + end.join + end + + def indentation + @indentation ||= ' ' * longest_index_label_width + end + + def longest_index_label_width + @longest_index_label_width ||= width_of_label(failures.size) + end + + def width_of_label(index) + index_label(index).chars.count + end + + def index_label(index) + " #{index + 1}) " + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/handler.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/handler.rb new file mode 100644 index 0000000..d86061a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/handler.rb @@ -0,0 +1,181 @@ +module RSpec + module Expectations + # @private + module ExpectationHelper + def self.check_message(msg) + unless msg.nil? || msg.respond_to?(:to_str) || msg.respond_to?(:call) + RSpec.warning( + "ignoring the provided expectation message argument" \ + "(#{ msg.inspect }) since it is not a string or a proc" + ) + end + end + + # Returns an RSpec-3+ compatible matcher, wrapping a legacy one + # in an adapter if necessary. + # + # @private + def self.modern_matcher_from(matcher) + LegacyMatcherAdapter::RSpec2.wrap(matcher) || + LegacyMatcherAdapter::RSpec1.wrap(matcher) || matcher + end + + def self.with_matcher(handler, matcher, message) + check_message(message) + matcher = modern_matcher_from(matcher) + yield matcher + ensure + ::RSpec::Matchers.last_expectation_handler = handler + ::RSpec::Matchers.last_matcher = matcher + end + + def self.handle_failure(matcher, message, failure_message_method) + message = message.call if message.respond_to?(:call) + message ||= matcher.__send__(failure_message_method) + + if matcher.respond_to?(:diffable?) && matcher.diffable? + ::RSpec::Expectations.fail_with message, matcher.expected, matcher.actual + else + ::RSpec::Expectations.fail_with message + end + end + end + + # @private + class PositiveExpectationHandler + def self.handle_matcher(actual, initial_matcher, custom_message=nil, &block) + ExpectationHelper.with_matcher(self, initial_matcher, custom_message) do |matcher| + return ::RSpec::Matchers::BuiltIn::PositiveOperatorMatcher.new(actual) unless initial_matcher + + match_result = matcher.matches?(actual, &block) + if custom_message && match_result.respond_to?(:error_generator) + match_result.error_generator.opts[:message] = custom_message + end + + match_result || ExpectationHelper.handle_failure(matcher, custom_message, :failure_message) + end + end + + def self.verb + 'is expected to' + end + + def self.should_method + :should + end + + def self.opposite_should_method + :should_not + end + end + + # @private + class NegativeExpectationHandler + def self.handle_matcher(actual, initial_matcher, custom_message=nil, &block) + ExpectationHelper.with_matcher(self, initial_matcher, custom_message) do |matcher| + return ::RSpec::Matchers::BuiltIn::NegativeOperatorMatcher.new(actual) unless initial_matcher + + negated_match_result = does_not_match?(matcher, actual, &block) + if custom_message && negated_match_result.respond_to?(:error_generator) + negated_match_result.error_generator.opts[:message] = custom_message + end + + negated_match_result || ExpectationHelper.handle_failure(matcher, custom_message, :failure_message_when_negated) + end + end + + def self.does_not_match?(matcher, actual, &block) + if matcher.respond_to?(:does_not_match?) + matcher.does_not_match?(actual, &block) + else + !matcher.matches?(actual, &block) + end + end + + def self.verb + 'is expected not to' + end + + def self.should_method + :should_not + end + + def self.opposite_should_method + :should + end + end + + # Wraps a matcher written against one of the legacy protocols in + # order to present the current protocol. + # + # @private + class LegacyMatcherAdapter < Matchers::MatcherDelegator + def initialize(matcher) + super + ::RSpec.warn_deprecation(<<-EOS.gsub(/^\s+\|/, ''), :type => "legacy_matcher") + |#{matcher.class.name || matcher.inspect} implements a legacy RSpec matcher + |protocol. For the current protocol you should expose the failure messages + |via the `failure_message` and `failure_message_when_negated` methods. + |(Used from #{CallerFilter.first_non_rspec_line}) + EOS + end + + def self.wrap(matcher) + new(matcher) if interface_matches?(matcher) + end + + # Starting in RSpec 1.2 (and continuing through all 2.x releases), + # the failure message protocol was: + # * `failure_message_for_should` + # * `failure_message_for_should_not` + # @private + class RSpec2 < self + def failure_message + base_matcher.failure_message_for_should + end + + def failure_message_when_negated + base_matcher.failure_message_for_should_not + end + + def self.interface_matches?(matcher) + ( + !matcher.respond_to?(:failure_message) && + matcher.respond_to?(:failure_message_for_should) + ) || ( + !matcher.respond_to?(:failure_message_when_negated) && + matcher.respond_to?(:failure_message_for_should_not) + ) + end + end + + # Before RSpec 1.2, the failure message protocol was: + # * `failure_message` + # * `negative_failure_message` + # @private + class RSpec1 < self + def failure_message + base_matcher.failure_message + end + + def failure_message_when_negated + base_matcher.negative_failure_message + end + + # Note: `failure_message` is part of the RSpec 3 protocol + # (paired with `failure_message_when_negated`), so we don't check + # for `failure_message` here. + def self.interface_matches?(matcher) + !matcher.respond_to?(:failure_message_when_negated) && + matcher.respond_to?(:negative_failure_message) + end + end + end + + # RSpec 3.0 was released with the class name misspelled. For SemVer compatibility, + # we will provide this misspelled alias until 4.0. + # @deprecated Use LegacyMatcherAdapter instead. + # @private + LegacyMacherAdapter = LegacyMatcherAdapter + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/minitest_integration.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/minitest_integration.rb new file mode 100644 index 0000000..94cdb5f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/minitest_integration.rb @@ -0,0 +1,58 @@ +require 'rspec/expectations' + +Minitest::Test.class_eval do + include ::RSpec::Matchers + + # This `expect` will only be called if the user is using Minitest < 5.6 + # or if they are _not_ using Minitest::Spec on 5.6+. Minitest::Spec on 5.6+ + # defines its own `expect` and will have the assertions incremented via our + # definitions of `to`/`not_to`/`to_not` below. + def expect(*a, &b) + self.assertions += 1 + super + end + + # Convert a `MultipleExpectationsNotMetError` to a `Minitest::Assertion` error so + # it gets counted in minitest's summary stats as a failure rather than an error. + # It would be nice to make `MultipleExpectationsNotMetError` subclass + # `Minitest::Assertion`, but Minitest's implementation does not treat subclasses + # the same, so this is the best we can do. + def aggregate_failures(*args, &block) + super + rescue RSpec::Expectations::MultipleExpectationsNotMetError => e + assertion_failed = Minitest::Assertion.new(e.message) + assertion_failed.set_backtrace e.backtrace + raise assertion_failed + end +end + +# Older versions of Minitest (e.g. before 5.6) do not define +# `Minitest::Expectation`. +if defined?(::Minitest::Expectation) + Minitest::Expectation.class_eval do + include RSpec::Expectations::ExpectationTarget::InstanceMethods + + def to(*args) + ctx.assertions += 1 + super + end + + def not_to(*args) + ctx.assertions += 1 + super + end + + def to_not(*args) + ctx.assertions += 1 + super + end + end +end + +module RSpec + module Expectations + remove_const :ExpectationNotMetError + # Exception raised when an expectation fails. + const_set :ExpectationNotMetError, ::Minitest::Assertion + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/syntax.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/syntax.rb new file mode 100644 index 0000000..b843034 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/syntax.rb @@ -0,0 +1,132 @@ +module RSpec + module Expectations + # @api private + # Provides methods for enabling and disabling the available + # syntaxes provided by rspec-expectations. + module Syntax + module_function + + # @api private + # Determines where we add `should` and `should_not`. + def default_should_host + @default_should_host ||= ::Object.ancestors.last + end + + # @api private + # Instructs rspec-expectations to warn on first usage of `should` or `should_not`. + # Enabled by default. This is largely here to facilitate testing. + def warn_about_should! + @warn_about_should = true + end + + # @api private + # Generates a deprecation warning for the given method if no warning + # has already been issued. + def warn_about_should_unless_configured(method_name) + return unless @warn_about_should + + RSpec.deprecate( + "Using `#{method_name}` from rspec-expectations' old `:should` syntax without explicitly enabling the syntax", + :replacement => "the new `:expect` syntax or explicitly enable `:should` with `config.expect_with(:rspec) { |c| c.syntax = :should }`" + ) + + @warn_about_should = false + end + + # @api private + # Enables the `should` syntax. + def enable_should(syntax_host=default_should_host) + @warn_about_should = false if syntax_host == default_should_host + return if should_enabled?(syntax_host) + + syntax_host.module_exec do + def should(matcher=nil, message=nil, &block) + ::RSpec::Expectations::Syntax.warn_about_should_unless_configured(::Kernel.__method__) + ::RSpec::Expectations::PositiveExpectationHandler.handle_matcher(self, matcher, message, &block) + end + + def should_not(matcher=nil, message=nil, &block) + ::RSpec::Expectations::Syntax.warn_about_should_unless_configured(::Kernel.__method__) + ::RSpec::Expectations::NegativeExpectationHandler.handle_matcher(self, matcher, message, &block) + end + end + end + + # @api private + # Disables the `should` syntax. + def disable_should(syntax_host=default_should_host) + return unless should_enabled?(syntax_host) + + syntax_host.module_exec do + undef should + undef should_not + end + end + + # @api private + # Enables the `expect` syntax. + def enable_expect(syntax_host=::RSpec::Matchers) + return if expect_enabled?(syntax_host) + + syntax_host.module_exec do + def expect(value=::RSpec::Expectations::ExpectationTarget::UndefinedValue, &block) + ::RSpec::Expectations::ExpectationTarget.for(value, block) + end + end + end + + # @api private + # Disables the `expect` syntax. + def disable_expect(syntax_host=::RSpec::Matchers) + return unless expect_enabled?(syntax_host) + + syntax_host.module_exec do + undef expect + end + end + + # @api private + # Indicates whether or not the `should` syntax is enabled. + def should_enabled?(syntax_host=default_should_host) + syntax_host.method_defined?(:should) + end + + # @api private + # Indicates whether or not the `expect` syntax is enabled. + def expect_enabled?(syntax_host=::RSpec::Matchers) + syntax_host.method_defined?(:expect) + end + end + end +end + +if defined?(BasicObject) + # The legacy `:should` syntax adds the following methods directly to + # `BasicObject` so that they are available off of any object. Note, however, + # that this syntax does not always play nice with delegate/proxy objects. + # We recommend you use the non-monkeypatching `:expect` syntax instead. + class BasicObject + # @method should(matcher, message) + # Passes if `matcher` returns true. Available on every `Object`. + # @example + # actual.should eq expected + # actual.should match /expression/ + # @param [Matcher] + # matcher + # @param [String] message optional message to display when the expectation fails + # @return [Boolean] true if the expectation succeeds (else raises) + # @note This is only available when you have enabled the `:should` syntax. + # @see RSpec::Matchers + + # @method should_not(matcher, message) + # Passes if `matcher` returns false. Available on every `Object`. + # @example + # actual.should_not eq expected + # @param [Matcher] + # matcher + # @param [String] message optional message to display when the expectation fails + # @return [Boolean] false if the negative expectation succeeds (else raises) + # @note This is only available when you have enabled the `:should` syntax. + # @see RSpec::Matchers + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/version.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/version.rb new file mode 100644 index 0000000..0fc9ef9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/version.rb @@ -0,0 +1,8 @@ +module RSpec + module Expectations + # @private + module Version + STRING = '3.13.5' + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers.rb new file mode 100644 index 0000000..d5347d1 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers.rb @@ -0,0 +1,1046 @@ +require 'rspec/support' +RSpec::Support.require_rspec_support 'matcher_definition' +RSpec::Support.define_optimized_require_for_rspec(:matchers) { |f| require_relative(f) } + +%w[ + english_phrasing + composable + built_in + generated_descriptions + dsl + matcher_delegator + aliased_matcher + multi_matcher_diff +].each { |file| RSpec::Support.require_rspec_matchers(file) } + +# RSpec's top level namespace. All of rspec-expectations is contained +# in the `RSpec::Expectations` and `RSpec::Matchers` namespaces. +module RSpec + # RSpec::Matchers provides a number of useful matchers we use to define + # expectations. Any object that implements the [matcher protocol](Matchers/MatcherProtocol) + # can be used as a matcher. + # + # ## Predicates + # + # In addition to matchers that are defined explicitly, RSpec will create + # custom matchers on the fly for any arbitrary predicate, giving your specs a + # much more natural language feel. + # + # A Ruby predicate is a method that ends with a "?" and returns true or false. + # Common examples are `empty?`, `nil?`, and `instance_of?`. + # + # All you need to do is write `expect(..).to be_` followed by the predicate + # without the question mark, and RSpec will figure it out from there. + # For example: + # + # expect([]).to be_empty # => [].empty?() | passes + # expect([]).not_to be_empty # => [].empty?() | fails + # + # In addition to prefixing the predicate matchers with "be_", you can also use "be_a_" + # and "be_an_", making your specs read much more naturally: + # + # expect("a string").to be_an_instance_of(String) # =>"a string".instance_of?(String) # passes + # + # expect(3).to be_a_kind_of(Integer) # => 3.kind_of?(Numeric) | passes + # expect(3).to be_a_kind_of(Numeric) # => 3.kind_of?(Numeric) | passes + # expect(3).to be_an_instance_of(Integer) # => 3.instance_of?(Integer) | passes + # expect(3).not_to be_an_instance_of(Numeric) # => 3.instance_of?(Numeric) | fails + # + # RSpec will also create custom matchers for predicates like `has_key?`. To + # use this feature, just state that the object should have_key(:key) and RSpec will + # call has_key?(:key) on the target. For example: + # + # expect(:a => "A").to have_key(:a) + # expect(:a => "A").to have_key(:b) # fails + # + # You can use this feature to invoke any predicate that begins with "has_", whether it is + # part of the Ruby libraries (like `Hash#has_key?`) or a method you wrote on your own class. + # + # Note that RSpec does not provide composable aliases for these dynamic predicate + # matchers. You can easily define your own aliases, though: + # + # RSpec::Matchers.alias_matcher :a_user_who_is_an_admin, :be_an_admin + # expect(user_list).to include(a_user_who_is_an_admin) + # + # ## Alias Matchers + # + # With {RSpec::Matchers.alias_matcher}, you can easily create an + # alternate name for a given matcher. + # + # The description will also change according to the new name: + # + # RSpec::Matchers.alias_matcher :a_list_that_sums_to, :sum_to + # sum_to(3).description # => "sum to 3" + # a_list_that_sums_to(3).description # => "a list that sums to 3" + # + # or you can specify a custom description like this: + # + # RSpec::Matchers.alias_matcher :a_list_sorted_by, :be_sorted_by do |description| + # description.sub("be sorted by", "a list sorted by") + # end + # + # be_sorted_by(:age).description # => "be sorted by age" + # a_list_sorted_by(:age).description # => "a list sorted by age" + # + # ## Custom Matchers + # + # When you find that none of the stock matchers provide a natural feeling + # expectation, you can very easily write your own using RSpec's matcher DSL + # or writing one from scratch. + # + # ### Matcher DSL + # + # Imagine that you are writing a game in which players can be in various + # zones on a virtual board. To specify that bob should be in zone 4, you + # could say: + # + # expect(bob.current_zone).to eql(Zone.new("4")) + # + # But you might find it more expressive to say: + # + # expect(bob).to be_in_zone("4") + # + # and/or + # + # expect(bob).not_to be_in_zone("3") + # + # You can create such a matcher like so: + # + # RSpec::Matchers.define :be_in_zone do |zone| + # match do |player| + # player.in_zone?(zone) + # end + # end + # + # This will generate a be_in_zone method that returns a matcher + # with logical default messages for failures. You can override the failure + # messages and the generated description as follows: + # + # RSpec::Matchers.define :be_in_zone do |zone| + # match do |player| + # player.in_zone?(zone) + # end + # + # failure_message do |player| + # # generate and return the appropriate string. + # end + # + # failure_message_when_negated do |player| + # # generate and return the appropriate string. + # end + # + # description do + # # generate and return the appropriate string. + # end + # end + # + # Each of the message-generation methods has access to the block arguments + # passed to the create method (in this case, zone). The + # failure message methods (failure_message and + # failure_message_when_negated) are passed the actual value (the + # receiver of expect(..) or expect(..).not_to). + # + # ### Custom Matcher from scratch + # + # You could also write a custom matcher from scratch, as follows: + # + # class BeInZone + # def initialize(expected) + # @expected = expected + # end + # + # def matches?(target) + # @target = target + # @target.current_zone.eql?(Zone.new(@expected)) + # end + # + # def failure_message + # "expected #{@target.inspect} to be in Zone #{@expected}" + # end + # + # def failure_message_when_negated + # "expected #{@target.inspect} not to be in Zone #{@expected}" + # end + # end + # + # ... and a method like this: + # + # def be_in_zone(expected) + # BeInZone.new(expected) + # end + # + # And then expose the method to your specs. This is normally done + # by including the method and the class in a module, which is then + # included in your spec: + # + # module CustomGameMatchers + # class BeInZone + # # ... + # end + # + # def be_in_zone(expected) + # # ... + # end + # end + # + # describe "Player behaviour" do + # include CustomGameMatchers + # # ... + # end + # + # or you can include in globally in a spec_helper.rb file required + # from your spec file(s): + # + # RSpec::configure do |config| + # config.include(CustomGameMatchers) + # end + # + # ### Making custom matchers composable + # + # RSpec's built-in matchers are designed to be composed, in expressions like: + # + # expect(["barn", 2.45]).to contain_exactly( + # a_value_within(0.1).of(2.5), + # a_string_starting_with("bar") + # ) + # + # Custom matchers can easily participate in composed matcher expressions like these. + # Include {RSpec::Matchers::Composable} in your custom matcher to make it support + # being composed (matchers defined using the DSL have this included automatically). + # Within your matcher's `matches?` method (or the `match` block, if using the DSL), + # use `values_match?(expected, actual)` rather than `expected == actual`. + # Under the covers, `values_match?` is able to match arbitrary + # nested data structures containing a mix of both matchers and non-matcher objects. + # It uses `===` and `==` to perform the matching, considering the values to + # match if either returns `true`. The `Composable` mixin also provides some helper + # methods for surfacing the matcher descriptions within your matcher's description + # or failure messages. + # + # RSpec's built-in matchers each have a number of aliases that rephrase the matcher + # from a verb phrase (such as `be_within`) to a noun phrase (such as `a_value_within`), + # which reads better when the matcher is passed as an argument in a composed matcher + # expressions, and also uses the noun-phrase wording in the matcher's `description`, + # for readable failure messages. You can alias your custom matchers in similar fashion + # using {RSpec::Matchers.alias_matcher}. + # + # ## Negated Matchers + # + # Sometimes if you want to test for the opposite using a more descriptive name + # instead of using `not_to`, you can use {RSpec::Matchers.define_negated_matcher}: + # + # RSpec::Matchers.define_negated_matcher :exclude, :include + # include(1, 2).description # => "include 1 and 2" + # exclude(1, 2).description # => "exclude 1 and 2" + # + # While the most obvious negated form may be to add a `not_` prefix, + # the failure messages you get with that form can be confusing (e.g. + # "expected [actual] to not [verb], but did not"). We've found it works + # best to find a more positive name for the negated form, such as + # `avoid_changing` rather than `not_change`. + # + module Matchers # rubocop:disable Metrics/ModuleLength + extend ::RSpec::Matchers::DSL + + # @!macro [attach] alias_matcher + # @!parse + # alias $1 $2 + # @!visibility private + # We define this override here so we can attach a YARD macro to it. + # It ensures that our docs list all the matcher aliases. + def self.alias_matcher(*args, &block) + super(*args, &block) + end + + # @!method self.alias_matcher(new_name, old_name, options={}, &description_override) + # Extended from {RSpec::Matchers::DSL#alias_matcher}. + + # @!method self.define(name, &declarations) + # Extended from {RSpec::Matchers::DSL#define}. + + # @!method self.define_negated_matcher(negated_name, base_name, &description_override) + # Extended from {RSpec::Matchers::DSL#define_negated_matcher}. + + # @method expect + # Supports `expect(actual).to matcher` syntax by wrapping `actual` in an + # `ExpectationTarget`. + # @example + # expect(actual).to eq(expected) + # expect(actual).not_to eq(expected) + # @return [Expectations::ExpectationTarget] + # @see Expectations::ExpectationTarget#to + # @see Expectations::ExpectationTarget#not_to + + # Allows multiple expectations in the provided block to fail, and then + # aggregates them into a single exception, rather than aborting on the + # first expectation failure like normal. This allows you to see all + # failures from an entire set of expectations without splitting each + # off into its own example (which may slow things down if the example + # setup is expensive). + # + # @param label [String] label for this aggregation block, which will be + # included in the aggregated exception message. + # @param metadata [Hash] additional metadata about this failure aggregation + # block. If multiple expectations fail, it will be exposed from the + # {Expectations::MultipleExpectationsNotMetError} exception. Mostly + # intended for internal RSpec use but you can use it as well. + # @yield Block containing as many expectation as you want. The block is + # simply yielded to, so you can trust that anything that works outside + # the block should work within it. + # @raise [Expectations::MultipleExpectationsNotMetError] raised when + # multiple expectations fail. + # @raise [Expectations::ExpectationNotMetError] raised when a single + # expectation fails. + # @raise [Exception] other sorts of exceptions will be raised as normal. + # + # @example + # aggregate_failures("verifying response") do + # expect(response.status).to eq(200) + # expect(response.headers).to include("Content-Type" => "text/plain") + # expect(response.body).to include("Success") + # end + # + # @note The implementation of this feature uses a thread-local variable, + # which means that if you have an expectation failure in another thread, + # it'll abort like normal. + def aggregate_failures(label=nil, metadata={}, &block) + Expectations::FailureAggregator.new(label, metadata).aggregate(&block) + end + + # Passes if actual is truthy (anything but false or nil) + def be_truthy + BuiltIn::BeTruthy.new + end + alias_matcher :a_truthy_value, :be_truthy + + # Passes if actual is falsey (false or nil) + def be_falsey + BuiltIn::BeFalsey.new + end + alias_matcher :be_falsy, :be_falsey + alias_matcher :a_falsey_value, :be_falsey + alias_matcher :a_falsy_value, :be_falsey + + # Passes if actual is nil + def be_nil + BuiltIn::BeNil.new + end + alias_matcher :a_nil_value, :be_nil + + # @example + # expect(actual).to be_truthy + # expect(actual).to be_falsey + # expect(actual).to be_nil + # expect(actual).to be_[arbitrary_predicate](*args) + # expect(actual).not_to be_nil + # expect(actual).not_to be_[arbitrary_predicate](*args) + # + # Given true, false, or nil, will pass if actual value is true, false or + # nil (respectively). Given no args means the caller should satisfy an if + # condition (to be or not to be). + # + # Predicates are any Ruby method that ends in a "?" and returns true or + # false. Given be_ followed by arbitrary_predicate (without the "?"), + # RSpec will match convert that into a query against the target object. + # + # The arbitrary_predicate feature will handle any predicate prefixed with + # "be_an_" (e.g. be_an_instance_of), "be_a_" (e.g. be_a_kind_of) or "be_" + # (e.g. be_empty), letting you choose the prefix that best suits the + # predicate. + def be(*args) + args.empty? ? Matchers::BuiltIn::Be.new : equal(*args) + end + alias_matcher :a_value, :be, :klass => AliasedMatcherWithOperatorSupport + + # passes if target.kind_of?(klass) + def be_a(klass) + be_a_kind_of(klass) + end + alias_method :be_an, :be_a + + # Passes if actual.instance_of?(expected) + # + # @example + # expect(5).to be_an_instance_of(Integer) + # expect(5).not_to be_an_instance_of(Numeric) + # expect(5).not_to be_an_instance_of(Float) + def be_an_instance_of(expected) + BuiltIn::BeAnInstanceOf.new(expected) + end + alias_method :be_instance_of, :be_an_instance_of + alias_matcher :an_instance_of, :be_an_instance_of + + # Passes if actual.kind_of?(expected) + # + # @example + # expect(5).to be_a_kind_of(Integer) + # expect(5).to be_a_kind_of(Numeric) + # expect(5).not_to be_a_kind_of(Float) + def be_a_kind_of(expected) + BuiltIn::BeAKindOf.new(expected) + end + alias_method :be_kind_of, :be_a_kind_of + alias_matcher :a_kind_of, :be_a_kind_of + + # Passes if actual.between?(min, max). Works with any Comparable object, + # including String, Symbol, Time, or Numeric (Fixnum, Bignum, Integer, + # Float, Complex, and Rational). + # + # By default, `be_between` is inclusive (i.e. passes when given either the max or min value), + # but you can make it `exclusive` by chaining that off the matcher. + # + # @example + # expect(5).to be_between(1, 10) + # expect(11).not_to be_between(1, 10) + # expect(10).not_to be_between(1, 10).exclusive + def be_between(min, max) + BuiltIn::BeBetween.new(min, max) + end + alias_matcher :a_value_between, :be_between + + # Passes if actual == expected +/- delta + # + # @example + # expect(result).to be_within(0.5).of(3.0) + # expect(result).not_to be_within(0.5).of(3.0) + def be_within(delta) + BuiltIn::BeWithin.new(delta) + end + alias_matcher :a_value_within, :be_within + alias_matcher :within, :be_within + + # Applied to a proc, specifies that its execution will cause some value to + # change. + # + # @param [Object] receiver + # @param [Symbol] message the message to send the receiver + # + # You can either pass receiver and message, or a block, + # but not both. + # + # When passing a block, it must use the `{ ... }` format, not + # do/end, as `{ ... }` binds to the `change` method, whereas do/end + # would errantly bind to the `expect(..).to` or `expect(...).not_to` method. + # + # You can chain any of the following off of the end to specify details + # about the change: + # + # * `from` + # * `to` + # + # or any one of: + # + # * `by` + # * `by_at_least` + # * `by_at_most` + # + # @example + # expect { + # team.add_player(player) + # }.to change(roster, :count) + # + # expect { + # team.add_player(player) + # }.to change(roster, :count).by(1) + # + # expect { + # team.add_player(player) + # }.to change(roster, :count).by_at_least(1) + # + # expect { + # team.add_player(player) + # }.to change(roster, :count).by_at_most(1) + # + # string = "string" + # expect { + # string.reverse! + # }.to change { string }.from("string").to("gnirts") + # + # string = "string" + # expect { + # string + # }.not_to change { string }.from("string") + # + # expect { + # person.happy_birthday + # }.to change(person, :birthday).from(32).to(33) + # + # expect { + # employee.develop_great_new_social_networking_app + # }.to change(employee, :title).from("Mail Clerk").to("CEO") + # + # expect { + # doctor.leave_office + # }.to change(doctor, :sign).from(/is in/).to(/is out/) + # + # user = User.new(:type => "admin") + # expect { + # user.symbolize_type + # }.to change(user, :type).from(String).to(Symbol) + # + # == Notes + # + # Evaluates `receiver.message` or `block` before and after it + # evaluates the block passed to `expect`. If the value is the same + # object, its before/after `hash` value is used to see if it has changed. + # Therefore, your object needs to properly implement `hash` to work correctly + # with this matcher. + # + # `expect( ... ).not_to change` supports the form that specifies `from` + # (which specifies what you expect the starting, unchanged value to be) + # but does not support forms with subsequent calls to `by`, `by_at_least`, + # `by_at_most` or `to`. + def change(receiver=nil, message=nil, &block) + BuiltIn::Change.new(receiver, message, &block) + end + alias_matcher :a_block_changing, :change + alias_matcher :changing, :change + + # Passes if actual contains all of the expected regardless of order. + # This works for collections. Pass in multiple args and it will only + # pass if all args are found in collection. + # + # @note This is also available using the `=~` operator with `should`, + # but `=~` is not supported with `expect`. + # + # @example + # expect([1, 2, 3]).to contain_exactly(1, 2, 3) + # expect([1, 2, 3]).to contain_exactly(1, 3, 2) + # + # @see #match_array + def contain_exactly(*items) + BuiltIn::ContainExactly.new(items) + end + alias_matcher :a_collection_containing_exactly, :contain_exactly + alias_matcher :containing_exactly, :contain_exactly + + # Passes if actual covers expected. This works for + # Ranges. You can also pass in multiple args + # and it will only pass if all args are found in Range. + # + # @example + # expect(1..10).to cover(5) + # expect(1..10).to cover(4, 6) + # expect(1..10).to cover(4, 6, 11) # fails + # expect(1..10).not_to cover(11) + # expect(1..10).not_to cover(5) # fails + # + # ### Warning:: Ruby >= 1.9 only + def cover(*values) + BuiltIn::Cover.new(*values) + end + alias_matcher :a_range_covering, :cover + alias_matcher :covering, :cover + + # Matches if the actual value ends with the expected value(s). In the case + # of a string, matches against the last `expected.length` characters of the + # actual string. In the case of an array, matches against the last + # `expected.length` elements of the actual array. + # + # @example + # expect("this string").to end_with "string" + # expect([0, 1, 2, 3, 4]).to end_with 4 + # expect([0, 2, 3, 4, 4]).to end_with 3, 4 + def end_with(*expected) + BuiltIn::EndWith.new(*expected) + end + alias_matcher :a_collection_ending_with, :end_with + alias_matcher :a_string_ending_with, :end_with + alias_matcher :ending_with, :end_with + + # Passes if actual == expected. + # + # See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more + # information about equality in Ruby. + # + # @example + # expect(5).to eq(5) + # expect(5).not_to eq(3) + def eq(expected) + BuiltIn::Eq.new(expected) + end + alias_matcher :an_object_eq_to, :eq + alias_matcher :eq_to, :eq + + # Passes if `actual.eql?(expected)` + # + # See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more + # information about equality in Ruby. + # + # @example + # expect(5).to eql(5) + # expect(5).not_to eql(3) + def eql(expected) + BuiltIn::Eql.new(expected) + end + alias_matcher :an_object_eql_to, :eql + alias_matcher :eql_to, :eql + + # Passes if actual.equal?(expected) (object identity). + # + # See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more + # information about equality in Ruby. + # + # @example + # expect(5).to equal(5) # Integers are equal + # expect("5").not_to equal("5") # Strings that look the same are not the same object + def equal(expected) + BuiltIn::Equal.new(expected) + end + alias_matcher :an_object_equal_to, :equal + alias_matcher :equal_to, :equal + + # Passes if `actual.exist?` or `actual.exists?` + # + # @example + # expect(File).to exist("path/to/file") + def exist(*args) + BuiltIn::Exist.new(*args) + end + alias_matcher :an_object_existing, :exist + alias_matcher :existing, :exist + + # Passes if actual's attribute values match the expected attributes hash. + # This works no matter how you define your attribute readers. + # + # @example + # Person = Struct.new(:name, :age) + # person = Person.new("Bob", 32) + # + # expect(person).to have_attributes(:name => "Bob", :age => 32) + # expect(person).to have_attributes(:name => a_string_starting_with("B"), :age => (a_value > 30) ) + # + # @note It will fail if actual doesn't respond to any of the expected attributes. + # + # @example + # expect(person).to have_attributes(:color => "red") + def have_attributes(expected) + BuiltIn::HaveAttributes.new(expected) + end + alias_matcher :an_object_having_attributes, :have_attributes + alias_matcher :having_attributes, :have_attributes + + # Passes if actual includes expected. This works for + # collections and Strings. You can also pass in multiple args + # and it will only pass if all args are found in collection. + # + # @example + # expect([1,2,3]).to include(3) + # expect([1,2,3]).to include(2,3) + # expect([1,2,3]).to include(2,3,4) # fails + # expect([1,2,3]).not_to include(4) + # expect("spread").to include("read") + # expect("spread").not_to include("red") + # expect(:a => 1, :b => 2).to include(:a) + # expect(:a => 1, :b => 2).to include(:a, :b) + # expect(:a => 1, :b => 2).to include(:a => 1) + # expect(:a => 1, :b => 2).to include(:b => 2, :a => 1) + # expect(:a => 1, :b => 2).to include(:c) # fails + # expect(:a => 1, :b => 2).not_to include(:a => 2) + def include(*expected) + BuiltIn::Include.new(*expected) + end + alias_matcher :a_collection_including, :include + alias_matcher :a_string_including, :include + alias_matcher :a_hash_including, :include + alias_matcher :including, :include + + # Passes if the provided matcher passes when checked against all + # elements of the collection. + # + # @example + # expect([1, 3, 5]).to all be_odd + # expect([1, 3, 6]).to all be_odd # fails + # + # @note The negative form `not_to all` is not supported. Instead + # use `not_to include` or pass a negative form of a matcher + # as the argument (e.g. `all exclude(:foo)`). + # + # @note You can also use this with compound matchers as well. + # + # @example + # expect([1, 3, 5]).to all( be_odd.and be_an(Integer) ) + def all(expected) + BuiltIn::All.new(expected) + end + + # Given a `Regexp` or `String`, passes if `actual.match(pattern)` + # Given an arbitrary nested data structure (e.g. arrays and hashes), + # matches if `expected === actual` || `actual == expected` for each + # pair of elements. + # + # @example + # expect(email).to match(/^([^\s]+)((?:[-a-z0-9]+\.)+[a-z]{2,})$/i) + # expect(email).to match("@example.com") + # + # @example + # hash = { + # :a => { + # :b => ["foo", 5], + # :c => { :d => 2.05 } + # } + # } + # + # expect(hash).to match( + # :a => { + # :b => a_collection_containing_exactly( + # a_string_starting_with("f"), + # an_instance_of(Integer) + # ), + # :c => { :d => (a_value < 3) } + # } + # ) + # + # @note The `match_regex` alias is deprecated and is not recommended for use. + # It was added in 2.12.1 to facilitate its use from within custom + # matchers (due to how the custom matcher DSL was evaluated in 2.x, + # `match` could not be used there), but is no longer needed in 3.x. + def match(expected) + BuiltIn::Match.new(expected) + end + alias_matcher :match_regex, :match + alias_matcher :an_object_matching, :match + alias_matcher :a_string_matching, :match + alias_matcher :matching, :match + + # An alternate form of `contain_exactly` that accepts + # the expected contents as a single array arg rather + # than splatted out as individual items. + # + # @example + # expect(results).to contain_exactly(1, 2) + # # is identical to: + # expect(results).to match_array([1, 2]) + # + # @see #contain_exactly + def match_array(items) + contain_exactly(*items) + end + alias_matcher :an_array_matching, :match_array do |desc| + desc.sub("contain exactly", "an array containing exactly") + end + + # With no arg, passes if the block outputs `to_stdout` or `to_stderr`. + # With a string, passes if the block outputs that specific string `to_stdout` or `to_stderr`. + # With a regexp or matcher, passes if the block outputs a string `to_stdout` or `to_stderr` that matches. + # + # To capture output from any spawned subprocess as well, use `to_stdout_from_any_process` or + # `to_stderr_from_any_process`. Output from any process that inherits the main process's corresponding + # standard stream will be captured. + # + # @example + # expect { print 'foo' }.to output.to_stdout + # expect { print 'foo' }.to output('foo').to_stdout + # expect { print 'foo' }.to output(/foo/).to_stdout + # + # expect { do_something }.to_not output.to_stdout + # + # expect { warn('foo') }.to output.to_stderr + # expect { warn('foo') }.to output('foo').to_stderr + # expect { warn('foo') }.to output(/foo/).to_stderr + # + # expect { do_something }.to_not output.to_stderr + # + # expect { system('echo foo') }.to output("foo\n").to_stdout_from_any_process + # expect { system('echo foo', out: :err) }.to output("foo\n").to_stderr_from_any_process + # + # @note `to_stdout` and `to_stderr` work by temporarily replacing `$stdout` or `$stderr`, + # so they're not able to intercept stream output that explicitly uses `STDOUT`/`STDERR` + # or that uses a reference to `$stdout`/`$stderr` that was stored before the + # matcher was used. + # @note `to_stdout_from_any_process` and `to_stderr_from_any_process` use Tempfiles, and + # are thus significantly (~30x) slower than `to_stdout` and `to_stderr`. + def output(expected=nil) + BuiltIn::Output.new(expected) + end + alias_matcher :a_block_outputting, :output + + # With no args, matches if any error is raised. + # With a named error, matches only if that specific error is raised. + # With a named error and message specified as a String, matches only if both match. + # With a named error and message specified as a Regexp, matches only if both match. + # Pass an optional block to perform extra verifications on the exception matched + # + # @example + # expect { do_something_risky }.to raise_error + # expect { do_something_risky }.to raise_error(PoorRiskDecisionError) + # expect { do_something_risky }.to raise_error(PoorRiskDecisionError) { |error| expect(error.data).to eq 42 } + # expect { do_something_risky }.to raise_error { |error| expect(error.data).to eq 42 } + # expect { do_something_risky }.to raise_error(PoorRiskDecisionError, "that was too risky") + # expect { do_something_risky }.to raise_error(PoorRiskDecisionError, /oo ri/) + # expect { do_something_risky }.to raise_error("that was too risky") + # + # expect { do_something_risky }.not_to raise_error + def raise_error(error=BuiltIn::RaiseError::UndefinedValue, message=nil, &block) + BuiltIn::RaiseError.new(error, message, &block) + end + alias_method :raise_exception, :raise_error + + alias_matcher :a_block_raising, :raise_error do |desc| + desc.sub("raise", "a block raising") + end + + alias_matcher :raising, :raise_error do |desc| + desc.sub("raise", "raising") + end + + # Matches if the target object responds to all of the names + # provided. Names can be Strings or Symbols. + # + # @example + # expect("string").to respond_to(:length) + # + def respond_to(*names) + BuiltIn::RespondTo.new(*names) + end + alias_matcher :an_object_responding_to, :respond_to + alias_matcher :responding_to, :respond_to + + # Passes if the submitted block returns true. Yields target to the + # block. + # + # Generally speaking, this should be thought of as a last resort when + # you can't find any other way to specify the behaviour you wish to + # specify. + # + # If you do find yourself in such a situation, you could always write + # a custom matcher, which would likely make your specs more expressive. + # + # @param description [String] optional description to be used for this matcher. + # + # @example + # expect(5).to satisfy { |n| n > 3 } + # expect(5).to satisfy("be greater than 3") { |n| n > 3 } + def satisfy(description=nil, &block) + BuiltIn::Satisfy.new(description, &block) + end + alias_matcher :an_object_satisfying, :satisfy + alias_matcher :satisfying, :satisfy + + # Matches if the actual value starts with the expected value(s). In the + # case of a string, matches against the first `expected.length` characters + # of the actual string. In the case of an array, matches against the first + # `expected.length` elements of the actual array. + # + # @example + # expect("this string").to start_with "this s" + # expect([0, 1, 2, 3, 4]).to start_with 0 + # expect([0, 2, 3, 4, 4]).to start_with 0, 1 + def start_with(*expected) + BuiltIn::StartWith.new(*expected) + end + alias_matcher :a_collection_starting_with, :start_with + alias_matcher :a_string_starting_with, :start_with + alias_matcher :starting_with, :start_with + + # Given no argument, matches if a proc throws any Symbol. + # + # Given a Symbol, matches if the given proc throws the specified Symbol. + # + # Given a Symbol and an arg, matches if the given proc throws the + # specified Symbol with the specified arg. + # + # @example + # expect { do_something_risky }.to throw_symbol + # expect { do_something_risky }.to throw_symbol(:that_was_risky) + # expect { do_something_risky }.to throw_symbol(:that_was_risky, 'culprit') + # + # expect { do_something_risky }.not_to throw_symbol + # expect { do_something_risky }.not_to throw_symbol(:that_was_risky) + # expect { do_something_risky }.not_to throw_symbol(:that_was_risky, 'culprit') + def throw_symbol(expected_symbol=nil, expected_arg=nil) + BuiltIn::ThrowSymbol.new(expected_symbol, expected_arg) + end + + alias_matcher :a_block_throwing, :throw_symbol do |desc| + desc.sub("throw", "a block throwing") + end + + alias_matcher :throwing, :throw_symbol do |desc| + desc.sub("throw", "throwing") + end + + # Passes if the method called in the expect block yields, regardless + # of whether or not arguments are yielded. + # + # @example + # expect { |b| 5.tap(&b) }.to yield_control + # expect { |b| "a".to_sym(&b) }.not_to yield_control + # + # @note Your expect block must accept a parameter and pass it on to + # the method-under-test as a block. + def yield_control + BuiltIn::YieldControl.new + end + alias_matcher :a_block_yielding_control, :yield_control + alias_matcher :yielding_control, :yield_control + + # Passes if the method called in the expect block yields with + # no arguments. Fails if it does not yield, or yields with arguments. + # + # @example + # expect { |b| User.transaction(&b) }.to yield_with_no_args + # expect { |b| 5.tap(&b) }.not_to yield_with_no_args # because it yields with `5` + # expect { |b| "a".to_sym(&b) }.not_to yield_with_no_args # because it does not yield + # + # @note Your expect block must accept a parameter and pass it on to + # the method-under-test as a block. + # @note This matcher is not designed for use with methods that yield + # multiple times. + def yield_with_no_args + BuiltIn::YieldWithNoArgs.new + end + alias_matcher :a_block_yielding_with_no_args, :yield_with_no_args + alias_matcher :yielding_with_no_args, :yield_with_no_args + + # Given no arguments, matches if the method called in the expect + # block yields with arguments (regardless of what they are or how + # many there are). + # + # Given arguments, matches if the method called in the expect block + # yields with arguments that match the given arguments. + # + # Argument matching is done using `===` (the case match operator) + # and `==`. If the expected and actual arguments match with either + # operator, the matcher will pass. + # + # @example + # expect { |b| 5.tap(&b) }.to yield_with_args # because #tap yields an arg + # expect { |b| 5.tap(&b) }.to yield_with_args(5) # because 5 == 5 + # expect { |b| 5.tap(&b) }.to yield_with_args(Integer) # because Integer === 5 + # expect { |b| File.open("f.txt", &b) }.to yield_with_args(/txt/) # because /txt/ === "f.txt" + # + # expect { |b| User.transaction(&b) }.not_to yield_with_args # because it yields no args + # expect { |b| 5.tap(&b) }.not_to yield_with_args(1, 2, 3) + # + # @note Your expect block must accept a parameter and pass it on to + # the method-under-test as a block. + # @note This matcher is not designed for use with methods that yield + # multiple times. + def yield_with_args(*args) + BuiltIn::YieldWithArgs.new(*args) + end + alias_matcher :a_block_yielding_with_args, :yield_with_args + alias_matcher :yielding_with_args, :yield_with_args + + # Designed for use with methods that repeatedly yield (such as + # iterators). Passes if the method called in the expect block yields + # multiple times with arguments matching those given. + # + # Argument matching is done using `===` (the case match operator) + # and `==`. If the expected and actual arguments match with either + # operator, the matcher will pass. + # + # @example + # expect { |b| [1, 2, 3].each(&b) }.to yield_successive_args(1, 2, 3) + # expect { |b| { :a => 1, :b => 2 }.each(&b) }.to yield_successive_args([:a, 1], [:b, 2]) + # expect { |b| [1, 2, 3].each(&b) }.not_to yield_successive_args(1, 2) + # + # @note Your expect block must accept a parameter and pass it on to + # the method-under-test as a block. + def yield_successive_args(*args) + BuiltIn::YieldSuccessiveArgs.new(*args) + end + alias_matcher :a_block_yielding_successive_args, :yield_successive_args + alias_matcher :yielding_successive_args, :yield_successive_args + + # Delegates to {RSpec::Expectations.configuration}. + # This is here because rspec-core's `expect_with` option + # looks for a `configuration` method on the mixin + # (`RSpec::Matchers`) to yield to a block. + # @return [RSpec::Expectations::Configuration] the configuration object + def self.configuration + Expectations.configuration + end + + private + + BE_PREDICATE_REGEX = /^(?:be_(?:an?_)?)(.*)/ + HAS_REGEX = /^(?:have_)(.*)/ + DYNAMIC_MATCHER_REGEX = Regexp.union(BE_PREDICATE_REGEX, HAS_REGEX) + + def method_missing(method, *args, &block) + case method.to_s + when BE_PREDICATE_REGEX + BuiltIn::BePredicate.new(method, *args, &block) + when HAS_REGEX + BuiltIn::Has.new(method, *args, &block) + else + super + end + end + ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true) + + if RUBY_VERSION.to_f >= 1.9 + def respond_to_missing?(method, *) + method =~ DYNAMIC_MATCHER_REGEX || super + end + else # for 1.8.7 + # :nocov: + def respond_to?(method, *) + method = method.to_s + method =~ DYNAMIC_MATCHER_REGEX || super + end + public :respond_to? + # :nocov: + end + + # @api private + def self.is_a_matcher?(obj) + return true if ::RSpec::Matchers::BuiltIn::BaseMatcher === obj + begin + return false if obj.respond_to?(:i_respond_to_everything_so_im_not_really_a_matcher) + rescue NoMethodError + # Some objects, like BasicObject, don't implemented standard + # reflection methods. + return false + end + return false unless obj.respond_to?(:matches?) + + obj.respond_to?(:failure_message) || + obj.respond_to?(:failure_message_for_should) # support legacy matchers + end + + ::RSpec::Support.register_matcher_definition do |obj| + is_a_matcher?(obj) + end + + # @api private + def self.is_a_describable_matcher?(obj) + is_a_matcher?(obj) && obj.respond_to?(:description) + end + + class << self + private + + if RSpec::Support::Ruby.mri? && RUBY_VERSION[0, 3] == '1.9' + # Note that `included` doesn't work for this because it is triggered + # _after_ `RSpec::Matchers` is an ancestor of the inclusion host, rather + # than _before_, like `append_features`. It's important we check this before + # in order to find the cases where it was already previously included. + # @api private + # :nocov: + def append_features(mod) + return super if mod < self # `mod < self` indicates a re-inclusion. + + subclasses = ObjectSpace.each_object(Class).select { |c| c < mod && c < self } + return super unless subclasses.any? + + subclasses.reject! { |s| subclasses.any? { |s2| s < s2 } } # Filter to the root ancestor. + subclasses = subclasses.map { |s| "`#{s}`" }.join(", ") + + RSpec.warning "`#{self}` has been included in a superclass (`#{mod}`) " \ + "after previously being included in subclasses (#{subclasses}), " \ + "which can trigger infinite recursion from `super` due to an MRI 1.9 bug " \ + "(https://redmine.ruby-lang.org/issues/3351). To work around this, " \ + "either upgrade to MRI 2.0+, include a dup of the module (e.g. " \ + "`include #{self}.dup`), or find a way to include `#{self}` in `#{mod}` " \ + "before it is included in subclasses (#{subclasses}). See " \ + "https://github.com/rspec/rspec-expectations/issues/814%20for%20more%20info" + + super + end + # :nocov: + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/aliased_matcher.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/aliased_matcher.rb new file mode 100644 index 0000000..c52c4c4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/aliased_matcher.rb @@ -0,0 +1,116 @@ +module RSpec + module Matchers + # Decorator that wraps a matcher and overrides `description` + # using the provided block in order to support an alias + # of a matcher. This is intended for use when composing + # matchers, so that you can use an expression like + # `include( a_value_within(0.1).of(3) )` rather than + # `include( be_within(0.1).of(3) )`, and have the corresponding + # description read naturally. + # + # @api private + class AliasedMatcher < MatcherDelegator + def initialize(base_matcher, description_block) + @description_block = description_block + super(base_matcher) + end + + # Forward messages on to the wrapped matcher. + # Since many matchers provide a fluent interface + # (e.g. `a_value_within(0.1).of(3)`), we need to wrap + # the returned value if it responds to `description`, + # so that our override can be applied when it is eventually + # used. + def method_missing(*) + return_val = super + return return_val unless RSpec::Matchers.is_a_matcher?(return_val) + self.class.new(return_val, @description_block) + end + + # Provides the description of the aliased matcher. Aliased matchers + # are designed to behave identically to the original matcher except + # for the description and failure messages. The description is different + # to reflect the aliased name. + # + # @api private + def description + @description_block.call(super) + end + + # Provides the failure_message of the aliased matcher. Aliased matchers + # are designed to behave identically to the original matcher except + # for the description and failure messages. The failure_message is different + # to reflect the aliased name. + # + # @api private + def failure_message + @description_block.call(super) + end + + # Provides the failure_message_when_negated of the aliased matcher. Aliased matchers + # are designed to behave identically to the original matcher except + # for the description and failure messages. The failure_message_when_negated is different + # to reflect the aliased name. + # + # @api private + def failure_message_when_negated + @description_block.call(super) + end + end + + # Decorator used for matchers that have special implementations of + # operators like `==` and `===`. + # @private + class AliasedMatcherWithOperatorSupport < AliasedMatcher + # We undef these so that they get delegated via `method_missing`. + undef == + undef === + end + + # @private + class AliasedNegatedMatcher < AliasedMatcher + def matches?(*args, &block) + if @base_matcher.respond_to?(:does_not_match?) + @base_matcher.does_not_match?(*args, &block) + else + !super + end + end + + def does_not_match?(*args, &block) + @base_matcher.matches?(*args, &block) + end + + def failure_message + optimal_failure_message(__method__, :failure_message_when_negated) + end + + def failure_message_when_negated + optimal_failure_message(__method__, :failure_message) + end + + private + + DefaultFailureMessages = BuiltIn::BaseMatcher::DefaultFailureMessages + + # For a matcher that uses the default failure messages, we prefer to + # use the override provided by the `description_block`, because it + # includes the phrasing that the user has expressed a preference for + # by going through the effort of defining a negated matcher. + # + # However, if the override didn't actually change anything, then we + # should return the opposite failure message instead -- the overridden + # message is going to be confusing if we return it as-is, as it represents + # the non-negated failure message for a negated match (or vice versa). + def optimal_failure_message(same, inverted) + if DefaultFailureMessages.has_default_failure_messages?(@base_matcher) + base_message = @base_matcher.__send__(same) + overridden = @description_block.call(base_message) + return overridden if overridden != base_message + end + + @base_matcher.__send__(inverted) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in.rb new file mode 100644 index 0000000..e6237ff --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in.rb @@ -0,0 +1,53 @@ +RSpec::Support.require_rspec_matchers "built_in/base_matcher" + +module RSpec + module Matchers + # Container module for all built-in matchers. The matcher classes are here + # (rather than directly under `RSpec::Matchers`) in order to prevent name + # collisions, since `RSpec::Matchers` gets included into the user's namespace. + # + # Autoloading is used to delay when the matcher classes get loaded, allowing + # rspec-matchers to boot faster, and avoiding loading matchers the user is + # not using. + module BuiltIn + autoload :BeAKindOf, 'rspec/matchers/built_in/be_kind_of' + autoload :BeAnInstanceOf, 'rspec/matchers/built_in/be_instance_of' + autoload :BeBetween, 'rspec/matchers/built_in/be_between' + autoload :Be, 'rspec/matchers/built_in/be' + autoload :BeComparedTo, 'rspec/matchers/built_in/be' + autoload :BeFalsey, 'rspec/matchers/built_in/be' + autoload :BeHelpers, 'rspec/matchers/built_in/be' + autoload :BeNil, 'rspec/matchers/built_in/be' + autoload :BePredicate, 'rspec/matchers/built_in/has' + autoload :BeTruthy, 'rspec/matchers/built_in/be' + autoload :BeWithin, 'rspec/matchers/built_in/be_within' + autoload :Change, 'rspec/matchers/built_in/change' + autoload :Compound, 'rspec/matchers/built_in/compound' + autoload :ContainExactly, 'rspec/matchers/built_in/contain_exactly' + autoload :Cover, 'rspec/matchers/built_in/cover' + autoload :EndWith, 'rspec/matchers/built_in/start_or_end_with' + autoload :Eq, 'rspec/matchers/built_in/eq' + autoload :Eql, 'rspec/matchers/built_in/eql' + autoload :Equal, 'rspec/matchers/built_in/equal' + autoload :Exist, 'rspec/matchers/built_in/exist' + autoload :Has, 'rspec/matchers/built_in/has' + autoload :HaveAttributes, 'rspec/matchers/built_in/have_attributes' + autoload :Include, 'rspec/matchers/built_in/include' + autoload :All, 'rspec/matchers/built_in/all' + autoload :Match, 'rspec/matchers/built_in/match' + autoload :NegativeOperatorMatcher, 'rspec/matchers/built_in/operators' + autoload :OperatorMatcher, 'rspec/matchers/built_in/operators' + autoload :Output, 'rspec/matchers/built_in/output' + autoload :PositiveOperatorMatcher, 'rspec/matchers/built_in/operators' + autoload :RaiseError, 'rspec/matchers/built_in/raise_error' + autoload :RespondTo, 'rspec/matchers/built_in/respond_to' + autoload :Satisfy, 'rspec/matchers/built_in/satisfy' + autoload :StartWith, 'rspec/matchers/built_in/start_or_end_with' + autoload :ThrowSymbol, 'rspec/matchers/built_in/throw_symbol' + autoload :YieldControl, 'rspec/matchers/built_in/yield' + autoload :YieldSuccessiveArgs, 'rspec/matchers/built_in/yield' + autoload :YieldWithArgs, 'rspec/matchers/built_in/yield' + autoload :YieldWithNoArgs, 'rspec/matchers/built_in/yield' + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/all.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/all.rb new file mode 100644 index 0000000..27cce20 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/all.rb @@ -0,0 +1,86 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `all`. + # Not intended to be instantiated directly. + class All < BaseMatcher + # @private + attr_reader :matcher, :failed_objects + + def initialize(matcher) + @matcher = matcher + @failed_objects = {} + end + + # @private + def does_not_match?(_actual) + raise NotImplementedError, '`expect().not_to all( matcher )` is not supported.' + end + + # @api private + # @return [String] + def failure_message + unless iterable? + return "#{improve_hash_formatting(super)}, but was not iterable" + end + + all_messages = [improve_hash_formatting(super)] + failed_objects.each do |index, matcher_failure_message| + all_messages << failure_message_for_item(index, matcher_failure_message) + end + all_messages.join("\n\n") + end + + # @api private + # @return [String] + def description + improve_hash_formatting "all #{description_of matcher}" + end + + private + + def match(_expected, _actual) + return false unless iterable? + + index_failed_objects + failed_objects.empty? + end + + def index_failed_objects + actual.each_with_index do |actual_item, index| + cloned_matcher = matcher.clone + matches = cloned_matcher.matches?(actual_item) + failed_objects[index] = cloned_matcher.failure_message unless matches + end + end + + def failure_message_for_item(index, failure_message) + failure_message = indent_multiline_message(add_new_line_if_needed(failure_message)) + indent_multiline_message("object at index #{index} failed to match:#{failure_message}") + end + + def add_new_line_if_needed(message) + message.start_with?("\n") ? message : "\n#{message}" + end + + def indent_multiline_message(message) + message = message.sub(/\n+\z/, '') + message.lines.map do |line| + line =~ /\S/ ? ' ' + line : line + end.join + end + + def initialize_copy(other) + @matcher = @matcher.clone + @failed_objects = @failed_objects.clone + super + end + + def iterable? + @actual.respond_to?(:each_with_index) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/base_matcher.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/base_matcher.rb new file mode 100644 index 0000000..8dd5133 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/base_matcher.rb @@ -0,0 +1,225 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # + # Used _internally_ as a base class for matchers that ship with + # rspec-expectations and rspec-rails. + # + # ### Warning: + # + # This class is for internal use, and subject to change without notice. + # We strongly recommend that you do not base your custom matchers on this + # class. If/when this changes, we will announce it and remove this warning. + class BaseMatcher + include RSpec::Matchers::Composable + + # @api private + # Used to detect when no arg is passed to `initialize`. + # `nil` cannot be used because it's a valid value to pass. + UNDEFINED = Object.new.freeze + + # @private + attr_reader :actual, :expected, :rescued_exception + + # @private + attr_writer :matcher_name + + def initialize(expected=UNDEFINED) + @expected = expected unless UNDEFINED.equal?(expected) + end + + # @api private + # Indicates if the match is successful. Delegates to `match`, which + # should be defined on a subclass. Takes care of consistently + # initializing the `actual` attribute. + def matches?(actual) + @actual = actual + match(expected, actual) + end + + # @api private + # Used to wrap a block of code that will indicate failure by + # raising one of the named exceptions. + # + # This is used by rspec-rails for some of its matchers that + # wrap rails' assertions. + def match_unless_raises(*exceptions) + exceptions.unshift Exception if exceptions.empty? + begin + yield + true + rescue *exceptions => @rescued_exception + false + end + end + + # @api private + # Generates a description using {EnglishPhrasing}. + # @return [String] + def description + desc = EnglishPhrasing.split_words(self.class.matcher_name) + desc << EnglishPhrasing.list(@expected) if defined?(@expected) + desc + end + + # @api private + # Matchers are not diffable by default. Override this to make your + # subclass diffable. + def diffable? + false + end + + # @api private + # Most matchers are value matchers (i.e. meant to work with `expect(value)`) + # rather than block matchers (i.e. meant to work with `expect { }`), so + # this defaults to false. Block matchers must override this to return true. + def supports_block_expectations? + false + end + + # @private + def supports_value_expectations? + true + end + + # @api private + def expects_call_stack_jump? + false + end + + # @private + def expected_formatted + RSpec::Support::ObjectFormatter.format(@expected) + end + + # @private + def actual_formatted + RSpec::Support::ObjectFormatter.format(@actual) + end + + # @private + def self.matcher_name + @matcher_name ||= underscore(name.split('::').last) + end + + # @private + def matcher_name + if defined?(@matcher_name) + @matcher_name + else + self.class.matcher_name + end + end + + # @private + # Borrowed from ActiveSupport. + def self.underscore(camel_cased_word) + word = camel_cased_word.to_s.dup + word.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2') + word.gsub!(/([a-z\d])([A-Z])/, '\1_\2') + word.tr!('-', '_') + word.downcase! + word + end + private_class_method :underscore + + # @private + module HashFormatting + # `{ :a => 5, :b => 2 }.inspect` produces: + # + # {:a=>5, :b=>2} + # + # ...but it looks much better as: + # + # {:a => 5, :b => 2} + # + # This is idempotent and safe to run on a string multiple times. + def improve_hash_formatting(inspect_string) + inspect_string.gsub(/(\S)=>(\S)/, '\1 => \2') + end + module_function :improve_hash_formatting + end + + include HashFormatting + + # @private + module StringEncodingFormatting + # @api private + # @return [Boolean] True if the actual and expected string encoding are different. + # i.e. the failure may be related to encoding differences and the encoding + # should be shown to the user. false otherwise. + if String.method_defined?(:encoding) + def string_encoding_differs? + actual.is_a?(String) && expected.is_a?(String) && actual.encoding != expected.encoding + end + else + # @api private + # @return [Boolean] False always as the curent Ruby version does not support String encoding + # :nocov: + def string_encoding_differs? + false + end + # :nocov: + end + module_function :string_encoding_differs? + + if String.method_defined?(:encoding) + # @api private + # Formats a String's encoding as a human readable string + # @param value [String] + # @return [String] + def format_encoding(value) + "#" + end + else + # @api private + # Formats a String's encoding as a human readable string + # @param _value [String] + # @return [nil] nil as the curent Ruby version does not support String encoding + # :nocov: + def format_encoding(_value) + nil + end + # :nocov: + end + module_function :format_encoding + end + + include StringEncodingFormatting + + # @api private + # Provides default implementations of failure messages, based on the `description`. + module DefaultFailureMessages + # @api private + # Provides a good generic failure message. Based on `description`. + # When subclassing, if you are not satisfied with this failure message + # you often only need to override `description`. + # @return [String] + def failure_message + "expected #{description_of @actual} to #{description}".dup + end + + # @api private + # Provides a good generic negative failure message. Based on `description`. + # When subclassing, if you are not satisfied with this failure message + # you often only need to override `description`. + # @return [String] + def failure_message_when_negated + "expected #{description_of @actual} not to #{description}".dup + end + + # @private + def self.has_default_failure_messages?(matcher) + matcher.method(:failure_message).owner == self && + matcher.method(:failure_message_when_negated).owner == self + rescue NameError + false + end + end + + include DefaultFailureMessages + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be.rb new file mode 100644 index 0000000..40d4017 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be.rb @@ -0,0 +1,191 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `be_truthy`. + # Not intended to be instantiated directly. + class BeTruthy < BaseMatcher + # @api private + # @return [String] + def failure_message + "expected: truthy value\n got: #{actual_formatted}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected: falsey value\n got: #{actual_formatted}" + end + + private + + def match(_, actual) + !!actual + end + end + + # @api private + # Provides the implementation for `be_falsey`. + # Not intended to be instantiated directly. + class BeFalsey < BaseMatcher + # @api private + # @return [String] + def failure_message + "expected: falsey value\n got: #{actual_formatted}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected: truthy value\n got: #{actual_formatted}" + end + + private + + def match(_, actual) + !actual + end + end + + # @api private + # Provides the implementation for `be_nil`. + # Not intended to be instantiated directly. + class BeNil < BaseMatcher + # @api private + # @return [String] + def failure_message + "expected: nil\n got: #{actual_formatted}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected: not nil\n got: nil" + end + + private + + def match(_, actual) + actual.nil? + end + end + + # @private + module BeHelpers + private + + def args_to_s + @args.empty? ? "" : parenthesize(inspected_args.join(', ')) + end + + def parenthesize(string) + "(#{string})" + end + + def inspected_args + @args.map { |a| RSpec::Support::ObjectFormatter.format(a) } + end + + def expected_to_sentence + EnglishPhrasing.split_words(@expected) + end + + def args_to_sentence + EnglishPhrasing.list(@args) + end + end + + # @api private + # Provides the implementation for `be`. + # Not intended to be instantiated directly. + class Be < BaseMatcher + include BeHelpers + + def initialize(*args) + @args = args + end + + # @api private + # @return [String] + def failure_message + "expected #{actual_formatted} to evaluate to true" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected #{actual_formatted} to evaluate to false" + end + + [:==, :<, :<=, :>=, :>, :===, :=~].each do |operator| + define_method operator do |operand| + BeComparedTo.new(operand, operator) + end + end + + private + + def match(_, actual) + !!actual + end + end + + # @api private + # Provides the implementation of `be value`. + # Not intended to be instantiated directly. + class BeComparedTo < BaseMatcher + include BeHelpers + + def initialize(operand, operator) + @expected = operand + @operator = operator + @args = [] + end + + def matches?(actual) + perform_match(actual) + rescue ArgumentError, NoMethodError + false + end + + def does_not_match?(actual) + !perform_match(actual) + rescue ArgumentError, NoMethodError + false + end + + # @api private + # @return [String] + def failure_message + "expected: #{@operator} #{expected_formatted}\n" \ + " got: #{@operator.to_s.gsub(/./, ' ')} #{actual_formatted}" + end + + # @api private + # @return [String] + def failure_message_when_negated + message = "`expect(#{actual_formatted}).not_to " \ + "be #{@operator} #{expected_formatted}`" + if [:<, :>, :<=, :>=].include?(@operator) + message + " not only FAILED, it is a bit confusing." + else + message + end + end + + # @api private + # @return [String] + def description + "be #{@operator} #{expected_to_sentence}#{args_to_sentence}" + end + + private + + def perform_match(actual) + @actual = actual + @actual.__send__ @operator, @expected + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_between.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_between.rb new file mode 100644 index 0000000..55f084e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_between.rb @@ -0,0 +1,77 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `be_between`. + # Not intended to be instantiated directly. + class BeBetween < BaseMatcher + def initialize(min, max) + @min, @max = min, max + inclusive + end + + # @api public + # Makes the between comparison inclusive. + # + # @example + # expect(3).to be_between(2, 3).inclusive + # + # @note The matcher is inclusive by default; this simply provides + # a way to be more explicit about it. + def inclusive + @less_than_operator = :<= + @greater_than_operator = :>= + @mode = :inclusive + self + end + + # @api public + # Makes the between comparison exclusive. + # + # @example + # expect(3).to be_between(2, 4).exclusive + def exclusive + @less_than_operator = :< + @greater_than_operator = :> + @mode = :exclusive + self + end + + # @api private + # @return [Boolean] + def matches?(actual) + @actual = actual + comparable? && compare + rescue ArgumentError + false + end + + # @api private + # @return [String] + def failure_message + "#{super}#{not_comparable_clause}" + end + + # @api private + # @return [String] + def description + "be between #{description_of @min} and #{description_of @max} (#{@mode})" + end + + private + + def comparable? + @actual.respond_to?(@less_than_operator) && @actual.respond_to?(@greater_than_operator) + end + + def not_comparable_clause + ", but it does not respond to `#{@less_than_operator}` and `#{@greater_than_operator}`" unless comparable? + end + + def compare + @actual.__send__(@greater_than_operator, @min) && @actual.__send__(@less_than_operator, @max) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_instance_of.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_instance_of.rb new file mode 100644 index 0000000..e71d380 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_instance_of.rb @@ -0,0 +1,26 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `be_an_instance_of`. + # Not intended to be instantiated directly. + class BeAnInstanceOf < BaseMatcher + # @api private + # @return [String] + def description + "be an instance of #{expected}" + end + + private + + def match(expected, actual) + actual.instance_of?(expected) + rescue NoMethodError + raise ::ArgumentError, "The #{matcher_name} matcher requires that " \ + "the actual object responds to #instance_of? method " \ + "but a `NoMethodError` was encountered instead." + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_kind_of.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_kind_of.rb new file mode 100644 index 0000000..4fe23bd --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_kind_of.rb @@ -0,0 +1,20 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `be_a_kind_of`. + # Not intended to be instantiated directly. + class BeAKindOf < BaseMatcher + private + + def match(expected, actual) + actual.kind_of?(expected) + rescue NoMethodError + raise ::ArgumentError, "The #{matcher_name} matcher requires that " \ + "the actual object responds to #kind_of? method " \ + "but a `NoMethodError` was encountered instead." + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_within.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_within.rb new file mode 100644 index 0000000..7a2b5b5 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_within.rb @@ -0,0 +1,72 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `be_within`. + # Not intended to be instantiated directly. + class BeWithin < BaseMatcher + def initialize(delta) + @delta = delta + end + + # @api public + # Sets the expected value. + def of(expected) + @expected = expected + @tolerance = @delta + @unit = '' + self + end + + # @api public + # Sets the expected value, and makes the matcher do + # a percent comparison. + def percent_of(expected) + @expected = expected + @tolerance = @expected.abs * @delta / 100.0 + @unit = '%' + self + end + + # @private + def matches?(actual) + @actual = actual + raise needs_expected unless defined? @expected + numeric? && (@actual - @expected).abs <= @tolerance + end + + # @api private + # @return [String] + def failure_message + "expected #{actual_formatted} to #{description}#{not_numeric_clause}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected #{actual_formatted} not to #{description}" + end + + # @api private + # @return [String] + def description + "be within #{@delta}#{@unit} of #{expected_formatted}" + end + + private + + def numeric? + @actual.respond_to?(:-) + end + + def needs_expected + ArgumentError.new "You must set an expected value using #of: be_within(#{@delta}).of(expected_value)" + end + + def not_numeric_clause + ", but it could not be treated as a numeric value" unless numeric? + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/change.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/change.rb new file mode 100644 index 0000000..00e65dc --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/change.rb @@ -0,0 +1,452 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `change`. + # Not intended to be instantiated directly. + class Change < BaseMatcher + # @api public + # Specifies the delta of the expected change. + def by(expected_delta) + ChangeRelatively.new(change_details, expected_delta, :by) do |actual_delta| + values_match?(expected_delta, actual_delta) + end + end + + # @api public + # Specifies a minimum delta of the expected change. + def by_at_least(minimum) + ChangeRelatively.new(change_details, minimum, :by_at_least) do |actual_delta| + actual_delta >= minimum + end + end + + # @api public + # Specifies a maximum delta of the expected change. + def by_at_most(maximum) + ChangeRelatively.new(change_details, maximum, :by_at_most) do |actual_delta| + actual_delta <= maximum + end + end + + # @api public + # Specifies the new value you expect. + def to(value) + ChangeToValue.new(change_details, value) + end + + # @api public + # Specifies the original value. + def from(value) + ChangeFromValue.new(change_details, value) + end + + # @private + def matches?(event_proc) + raise_block_syntax_error if block_given? + perform_change(event_proc) && change_details.changed? + end + + def does_not_match?(event_proc) + raise_block_syntax_error if block_given? + perform_change(event_proc) && !change_details.changed? + end + + # @api private + # @return [String] + def failure_message + "expected #{change_details.value_representation} to have changed, " \ + "but #{positive_failure_reason}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected #{change_details.value_representation} not to have changed, " \ + "but #{negative_failure_reason}" + end + + # @api private + # @return [String] + def description + "change #{change_details.value_representation}" + end + + # @private + def supports_block_expectations? + true + end + + # @private + def supports_value_expectations? + false + end + + private + + def initialize(receiver=nil, message=nil, &block) + @receiver = receiver + @message = message + @block = block + end + + def change_details + @change_details ||= ChangeDetails.new(matcher_name, @receiver, @message, &@block) + end + + def perform_change(event_proc) + @event_proc = event_proc + change_details.perform_change(event_proc) do |actual_before| + # pre-compute values derived from the `before` value before the + # mutation is applied, in case the specified mutation is mutation + # of a single object (rather than a changing what object a method + # returns). We need to cache these values before the `before` value + # they are based on potentially gets mutated. + @actual_before_description = description_of(actual_before) + end + end + + def raise_block_syntax_error + raise SyntaxError, "Block not received by the `change` matcher. " \ + "Perhaps you want to use `{ ... }` instead of do/end?" + end + + def positive_failure_reason + return "was not given a block" unless Proc === @event_proc + "is still #{@actual_before_description}" + end + + def negative_failure_reason + return "was not given a block" unless Proc === @event_proc + "did change from #{@actual_before_description} " \ + "to #{description_of change_details.actual_after}" + end + end + + # Used to specify a relative change. + # @api private + class ChangeRelatively < BaseMatcher + def initialize(change_details, expected_delta, relativity, &comparer) + @change_details = change_details + @expected_delta = expected_delta + @relativity = relativity + @comparer = comparer + end + + # @private + def failure_message + "expected #{@change_details.value_representation} to have changed " \ + "#{@relativity.to_s.tr('_', ' ')} " \ + "#{description_of @expected_delta}, but #{failure_reason}" + end + + # @private + def matches?(event_proc) + @event_proc = event_proc + @change_details.perform_change(event_proc) && @comparer.call(@change_details.actual_delta) + end + + # @private + def does_not_match?(_event_proc) + raise NotImplementedError, "`expect { }.not_to change " \ + "{ }.#{@relativity}()` is not supported" + end + + # @private + def description + "change #{@change_details.value_representation} " \ + "#{@relativity.to_s.tr('_', ' ')} #{description_of @expected_delta}" + end + + # @private + def supports_block_expectations? + true + end + + # @private + def supports_value_expectations? + false + end + + private + + def failure_reason + return "was not given a block" unless Proc === @event_proc + "was changed by #{description_of @change_details.actual_delta}" + end + end + + # @api private + # Base class for specifying a change from and/or to specific values. + class SpecificValuesChange < BaseMatcher + # @private + MATCH_ANYTHING = ::Object.ancestors.last + + def initialize(change_details, from, to) + @change_details = change_details + @expected_before = from + @expected_after = to + end + + # @private + def matches?(event_proc) + perform_change(event_proc) && @change_details.changed? && @matches_before && matches_after? + end + + # @private + def description + "change #{@change_details.value_representation} #{change_description}" + end + + # @private + def failure_message + return not_given_a_block_failure unless Proc === @event_proc + return before_value_failure unless @matches_before + return did_not_change_failure unless @change_details.changed? + after_value_failure + end + + # @private + def supports_block_expectations? + true + end + + # @private + def supports_value_expectations? + false + end + + private + + def perform_change(event_proc) + @event_proc = event_proc + @change_details.perform_change(event_proc) do |actual_before| + # pre-compute values derived from the `before` value before the + # mutation is applied, in case the specified mutation is mutation + # of a single object (rather than a changing what object a method + # returns). We need to cache these values before the `before` value + # they are based on potentially gets mutated. + @matches_before = values_match?(@expected_before, actual_before) + @actual_before_description = description_of(actual_before) + end + end + + def matches_after? + values_match?(@expected_after, @change_details.actual_after) + end + + def before_value_failure + "expected #{@change_details.value_representation} " \ + "to have initially been #{description_of @expected_before}, " \ + "but was #{@actual_before_description}" + end + + def after_value_failure + "expected #{@change_details.value_representation} " \ + "to have changed to #{description_of @expected_after}, " \ + "but is now #{description_of @change_details.actual_after}" + end + + def did_not_change_failure + "expected #{@change_details.value_representation} " \ + "to have changed #{change_description}, but did not change" + end + + def did_change_failure + "expected #{@change_details.value_representation} not to have changed, but " \ + "did change from #{@actual_before_description} " \ + "to #{description_of @change_details.actual_after}" + end + + def not_given_a_block_failure + "expected #{@change_details.value_representation} to have changed " \ + "#{change_description}, but was not given a block" + end + end + + # @api private + # Used to specify a change from a specific value + # (and, optionally, to a specific value). + class ChangeFromValue < SpecificValuesChange + def initialize(change_details, expected_before) + @description_suffix = nil + super(change_details, expected_before, MATCH_ANYTHING) + end + + # @api public + # Specifies the new value you expect. + def to(value) + @expected_after = value + @description_suffix = " to #{description_of value}" + self + end + + # @private + def does_not_match?(event_proc) + if @description_suffix + raise NotImplementedError, "`expect { }.not_to change { }.to()` " \ + "is not supported" + end + + perform_change(event_proc) && !@change_details.changed? && @matches_before + end + + # @private + def failure_message_when_negated + return not_given_a_block_failure unless Proc === @event_proc + return before_value_failure unless @matches_before + did_change_failure + end + + private + + def change_description + "from #{description_of @expected_before}#{@description_suffix}" + end + end + + # @api private + # Used to specify a change to a specific value + # (and, optionally, from a specific value). + class ChangeToValue < SpecificValuesChange + def initialize(change_details, expected_after) + @description_suffix = nil + super(change_details, MATCH_ANYTHING, expected_after) + end + + # @api public + # Specifies the original value. + def from(value) + @expected_before = value + @description_suffix = " from #{description_of value}" + self + end + + # @private + def does_not_match?(_event_proc) + raise NotImplementedError, "`expect { }.not_to change { }.to()` " \ + "is not supported" + end + + private + + def change_description + "to #{description_of @expected_after}#{@description_suffix}" + end + end + + # @private + # Encapsulates the details of the before/after values. + # + # Note that this class exposes the `actual_after` value, to allow the + # matchers above to derive failure messages, etc from the value on demand + # as needed, but it intentionally does _not_ expose the `actual_before` + # value. Some usages of the `change` matcher mutate a specific object + # returned by the value proc, which means that failure message snippets, + # etc, which are derived from the `before` value may not be accurate if + # they are lazily computed as needed. We must pre-compute them before + # applying the change in the `expect` block. To ensure that all `change` + # matchers do that properly, we do not expose the `actual_before` value. + # Instead, matchers must pass a block to `perform_change`, which yields + # the `actual_before` value before applying the change. + class ChangeDetails + attr_reader :actual_after + + UNDEFINED = Module.new.freeze + + def initialize(matcher_name, receiver=nil, message=nil, &block) + if receiver && !message + raise( + ArgumentError, + "`change` requires either an object and message " \ + "(`change(obj, :msg)`) or a block (`change { }`). " \ + "You passed an object but no message." + ) + end + + @matcher_name = matcher_name + @receiver = receiver + @message = message + @value_proc = block + # TODO: temporary measure to mute warning of access to an initialized + # instance variable when a deprecated implicit block expectation + # syntax is used. This may be removed once `fail` is used, and the + # matcher never issues this warning. + @actual_after = UNDEFINED + end + + def value_representation + @value_representation ||= + if @message + "`#{message_notation(@receiver, @message)}`" + elsif (value_block_snippet = extract_value_block_snippet) + "`#{value_block_snippet}`" + else + 'result' + end + end + + def perform_change(event_proc) + @actual_before = evaluate_value_proc + @before_hash = @actual_before.hash + yield @actual_before if block_given? + + return false unless Proc === event_proc + event_proc.call + + @actual_after = evaluate_value_proc + @actual_hash = @actual_after.hash + true + end + + def changed? + # Consider it changed if either: + # + # - The before/after values are unequal + # - The before/after values have different hash values + # + # The latter case specifically handles the case when the value proc + # returns the exact same object, but it has been mutated. + # + # Note that it is not sufficient to only check the hashes; it is + # possible for two values to be unequal (and of different classes) + # but to return the same hash value. Also, some objects may change + # their hash after being compared with `==`/`!=`. + @actual_before != @actual_after || @before_hash != @actual_hash + end + + def actual_delta + @actual_after - @actual_before + end + + private + + def evaluate_value_proc + @value_proc ? @value_proc.call : @receiver.__send__(@message) + end + + def message_notation(receiver, message) + case receiver + when Module + "#{receiver}.#{message}" + else + "#{Support.class_of(receiver)}##{message}" + end + end + + if RSpec::Support::RubyFeatures.ripper_supported? + def extract_value_block_snippet + return nil unless @value_proc + Expectations::BlockSnippetExtractor.try_extracting_single_line_body_of(@value_proc, @matcher_name) + end + else + # :nocov: + def extract_value_block_snippet + nil + end + # :nocov: + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/compound.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/compound.rb new file mode 100644 index 0000000..3a7fb1e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/compound.rb @@ -0,0 +1,293 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Base class for `and` and `or` compound matchers. + class Compound < BaseMatcher + # @private + attr_reader :matcher_1, :matcher_2, :evaluator + + def initialize(matcher_1, matcher_2) + @matcher_1 = matcher_1 + @matcher_2 = matcher_2 + end + + # @private + def does_not_match?(_actual) + raise NotImplementedError, "`expect(...).not_to matcher.#{conjunction} matcher` " \ + "is not supported, since it creates a bit of an ambiguity. Instead, define negated versions " \ + "of whatever matchers you wish to negate with `RSpec::Matchers.define_negated_matcher` and " \ + "use `expect(...).to matcher.#{conjunction} matcher`." + end + + # @api private + # @return [String] + def description + "#{matcher_1.description} #{conjunction} #{matcher_2.description}" + end + + # @api private + def supports_block_expectations? + matcher_supports_block_expectations?(matcher_1) && + matcher_supports_block_expectations?(matcher_2) + end + + # @api private + def supports_value_expectations? + matcher_supports_value_expectations?(matcher_1) && + matcher_supports_value_expectations?(matcher_2) + end + + # @api private + def expects_call_stack_jump? + NestedEvaluator.matcher_expects_call_stack_jump?(matcher_1) || + NestedEvaluator.matcher_expects_call_stack_jump?(matcher_2) + end + + # @api private + # @return [Boolean] + def diffable? + matcher_is_diffable?(matcher_1) || matcher_is_diffable?(matcher_2) + end + + # @api private + # @return [RSpec::Matchers::MultiMatcherDiff] + def expected + return nil unless evaluator + ::RSpec::Matchers::MultiMatcherDiff.for_many_matchers(diffable_matcher_list) + end + + protected + + def diffable_matcher_list + list = [] + list.concat(diffable_matcher_list_for(matcher_1)) unless matcher_1_matches? + list.concat(diffable_matcher_list_for(matcher_2)) unless matcher_2_matches? + list + end + + private + + def initialize_copy(other) + @matcher_1 = @matcher_1.clone + @matcher_2 = @matcher_2.clone + super + end + + def match(_expected, actual) + evaluator_klass = if supports_block_expectations? && Proc === actual + NestedEvaluator + elsif supports_value_expectations? + SequentialEvaluator + else + # Can't raise an ArgumentError in this context, as it's rescued + raise "Block and value matchers can't be combined in a compound expectation (#{matcher_1.description}, #{matcher_2.description})" + end + + @evaluator = evaluator_klass.new(actual, matcher_1, matcher_2) + end + + def indent_multiline_message(message) + message.lines.map do |line| + line =~ /\S/ ? ' ' + line : line + end.join + end + + def compound_failure_message + "#{indent_multiline_message(matcher_1.failure_message.sub(/\n+\z/, ''))}" \ + "\n\n...#{conjunction}:" \ + "\n\n#{indent_multiline_message(matcher_2.failure_message.sub(/\A\n+/, ''))}" + end + + def matcher_1_matches? + evaluator.matcher_matches?(matcher_1) + end + + def matcher_2_matches? + evaluator.matcher_matches?(matcher_2) + end + + def matcher_supports_block_expectations?(matcher) + matcher.supports_block_expectations? + rescue NoMethodError + false + end + + def matcher_supports_value_expectations?(matcher) + matcher.supports_value_expectations? + rescue NoMethodError + true + end + + def matcher_is_diffable?(matcher) + matcher.diffable? + rescue NoMethodError + false + end + + def diffable_matcher_list_for(matcher) + return [] unless matcher_is_diffable?(matcher) + return matcher.diffable_matcher_list if Compound === matcher + [matcher] + end + + # For value expectations, we can evaluate the matchers sequentially. + class SequentialEvaluator + def initialize(actual, *) + @actual = actual + end + + def matcher_matches?(matcher) + matcher.matches?(@actual) + end + end + + # Normally, we evaluate the matching sequentially. For an expression like + # `expect(x).to foo.and bar`, this becomes: + # + # expect(x).to foo + # expect(x).to bar + # + # For block expectations, we need to nest them instead, so that + # `expect { x }.to foo.and bar` becomes: + # + # expect { + # expect { x }.to foo + # }.to bar + # + # This is necessary so that the `expect` block is only executed once. + class NestedEvaluator + def initialize(actual, matcher_1, matcher_2) + @actual = actual + @matcher_1 = matcher_1 + @matcher_2 = matcher_2 + @match_results = {} + + inner, outer = order_block_matchers + + @match_results[outer] = outer.matches?(Proc.new do |*args| + @match_results[inner] = inner.matches?(inner_matcher_block(args)) + end) + end + + def matcher_matches?(matcher) + @match_results.fetch(matcher) do + raise ArgumentError, "Your #{matcher.description} has no match " \ + "results, this can occur when an unexpected call stack or " \ + "local jump occurs. Perhaps one of your matchers needs to " \ + "declare `expects_call_stack_jump?` as `true`?" + end + end + + private + + # Some block matchers (such as `yield_xyz`) pass args to the `expect` block. + # When such a matcher is used as the outer matcher, we need to forward the + # the args on to the `expect` block. + def inner_matcher_block(outer_args) + return @actual if outer_args.empty? + + Proc.new do |*inner_args| + unless inner_args.empty? + raise ArgumentError, "(#{@matcher_1.description}) and " \ + "(#{@matcher_2.description}) cannot be combined in a compound expectation " \ + "since both matchers pass arguments to the block." + end + + @actual.call(*outer_args) + end + end + + # For a matcher like `raise_error` or `throw_symbol`, where the block will jump + # up the call stack, we need to order things so that it is the inner matcher. + # For example, we need it to be this: + # + # expect { + # expect { + # x += 1 + # raise "boom" + # }.to raise_error("boom") + # }.to change { x }.by(1) + # + # ...rather than: + # + # expect { + # expect { + # x += 1 + # raise "boom" + # }.to change { x }.by(1) + # }.to raise_error("boom") + # + # In the latter case, the after-block logic in the `change` matcher would never + # get executed because the `raise "boom"` line would jump to the `rescue` in the + # `raise_error` logic, so only the former case will work properly. + # + # This method figures out which matcher should be the inner matcher and which + # should be the outer matcher. + def order_block_matchers + return @matcher_1, @matcher_2 unless self.class.matcher_expects_call_stack_jump?(@matcher_2) + return @matcher_2, @matcher_1 unless self.class.matcher_expects_call_stack_jump?(@matcher_1) + + raise ArgumentError, "(#{@matcher_1.description}) and " \ + "(#{@matcher_2.description}) cannot be combined in a compound expectation " \ + "because they both expect a call stack jump." + end + + def self.matcher_expects_call_stack_jump?(matcher) + matcher.expects_call_stack_jump? + rescue NoMethodError + false + end + end + + # @api public + # Matcher used to represent a compound `and` expectation. + class And < self + # @api private + # @return [String] + def failure_message + if matcher_1_matches? + matcher_2.failure_message + elsif matcher_2_matches? + matcher_1.failure_message + else + compound_failure_message + end + end + + private + + def match(*) + super + matcher_1_matches? && matcher_2_matches? + end + + def conjunction + "and" + end + end + + # @api public + # Matcher used to represent a compound `or` expectation. + class Or < self + # @api private + # @return [String] + def failure_message + compound_failure_message + end + + private + + def match(*) + super + matcher_1_matches? || matcher_2_matches? + end + + def conjunction + "or" + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/contain_exactly.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/contain_exactly.rb new file mode 100644 index 0000000..f80572c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/contain_exactly.rb @@ -0,0 +1,312 @@ +module RSpec + module Matchers + module BuiltIn + # rubocop:disable Metrics/ClassLength + # @api private + # Provides the implementation for `contain_exactly` and `match_array`. + # Not intended to be instantiated directly. + class ContainExactly < BaseMatcher + # @api private + # @return [String] + def failure_message + if Array === actual + generate_failure_message + else + "expected a collection that can be converted to an array with " \ + "`#to_ary` or `#to_a`, but got #{actual_formatted}" + end + end + + # @api private + # @return [String] + def failure_message_when_negated + list = EnglishPhrasing.list(surface_descriptions_in(expected)) + "expected #{actual_formatted} not to contain exactly#{list}" + end + + # @api private + # @return [String] + def description + list = EnglishPhrasing.list(surface_descriptions_in(expected)) + "contain exactly#{list}" + end + + def matches?(actual) + @pairings_maximizer = nil + @best_solution = nil + @extra_items = nil + @missing_items = nil + super(actual) + end + + private + + def generate_failure_message + message = expected_collection_line + message += actual_collection_line + message += missing_elements_line unless missing_items.empty? + message += extra_elements_line unless extra_items.empty? + message + end + + def expected_collection_line + message_line('expected collection contained', expected, true) + end + + def actual_collection_line + message_line('actual collection contained', actual) + end + + def missing_elements_line + message_line('the missing elements were', missing_items, true) + end + + def extra_elements_line + message_line('the extra elements were', extra_items) + end + + def describe_collection(collection, surface_descriptions=false) + if surface_descriptions + "#{description_of(safe_sort(surface_descriptions_in collection))}\n" + else + "#{description_of(safe_sort(collection))}\n" + end + end + + def message_line(prefix, collection, surface_descriptions=false) + "%-32s%s" % [prefix + ':', + describe_collection(collection, surface_descriptions)] + end + + def match(_expected, _actual) + return false unless convert_actual_to_an_array + match_when_sorted? || (extra_items.empty? && missing_items.empty?) + end + + # This cannot always work (e.g. when dealing with unsortable items, + # or matchers as expected items), but it's practically free compared to + # the slowness of the full matching algorithm, and in common cases this + # works, so it's worth a try. + def match_when_sorted? + values_match?(safe_sort(expected), safe_sort(actual)) + end + + def convert_actual_to_an_array + if actual.respond_to?(:to_ary) + @actual = actual.to_ary + elsif actual.respond_to?(:to_a) && !to_a_disallowed?(actual) + @actual = actual.to_a + else + false + end + end + + def safe_sort(array) + array.sort + rescue Support::AllExceptionsExceptOnesWeMustNotRescue + array + end + + if RUBY_VERSION == "1.8.7" + # :nocov: + def to_a_disallowed?(object) + case object + when NilClass, String then true + else Kernel == RSpec::Support.method_handle_for(object, :to_a).owner + end + end + # :nocov: + else + def to_a_disallowed?(object) + NilClass === object + end + end + + def missing_items + @missing_items ||= best_solution.unmatched_expected_indexes.map do |index| + expected[index] + end + end + + def extra_items + @extra_items ||= best_solution.unmatched_actual_indexes.map do |index| + actual[index] + end + end + + def best_solution + @best_solution ||= pairings_maximizer.find_best_solution + end + + def pairings_maximizer + @pairings_maximizer ||= begin + expected_matches = Hash[Array.new(expected.size) { |i| [i, []] }] + actual_matches = Hash[Array.new(actual.size) { |i| [i, []] }] + + expected.each_with_index do |e, ei| + actual.each_with_index do |a, ai| + next unless values_match?(e, a) + + expected_matches[ei] << ai + actual_matches[ai] << ei + end + end + + PairingsMaximizer.new(expected_matches, actual_matches) + end + end + + # Once we started supporting composing matchers, the algorithm for this matcher got + # much more complicated. Consider this expression: + # + # expect(["fool", "food"]).to contain_exactly(/foo/, /fool/) + # + # This should pass (because we can pair /fool/ with "fool" and /foo/ with "food"), but + # the original algorithm used by this matcher would pair the first elements it could + # (/foo/ with "fool"), which would leave /fool/ and "food" unmatched. When we have + # an expected element which is a matcher that matches a superset of actual items + # compared to another expected element matcher, we need to consider every possible pairing. + # + # This class is designed to maximize the number of actual/expected pairings -- or, + # conversely, to minimize the number of unpaired items. It's essentially a brute + # force solution, but with a few heuristics applied to reduce the size of the + # problem space: + # + # * Any items which match none of the items in the other list are immediately + # placed into the `unmatched_expected_indexes` or `unmatched_actual_indexes` array. + # The extra items and missing items in the matcher failure message are derived + # from these arrays. + # * Any items which reciprocally match only each other are paired up and not + # considered further. + # + # What's left is only the items which match multiple items from the other list + # (or vice versa). From here, it performs a brute-force depth-first search, + # looking for a solution which pairs all elements in both lists, or, barring that, + # that produces the fewest unmatched items. + # + # @private + class PairingsMaximizer + # @private + Solution = Struct.new(:unmatched_expected_indexes, :unmatched_actual_indexes, + :indeterminate_expected_indexes, :indeterminate_actual_indexes) do + def worse_than?(other) + unmatched_item_count > other.unmatched_item_count + end + + def candidate? + indeterminate_expected_indexes.empty? && + indeterminate_actual_indexes.empty? + end + + def ideal? + candidate? && ( + unmatched_expected_indexes.empty? || + unmatched_actual_indexes.empty? + ) + end + + def unmatched_item_count + unmatched_expected_indexes.count + unmatched_actual_indexes.count + end + + def +(derived_candidate_solution) + self.class.new( + unmatched_expected_indexes + derived_candidate_solution.unmatched_expected_indexes, + unmatched_actual_indexes + derived_candidate_solution.unmatched_actual_indexes, + # Ignore the indeterminate indexes: by the time we get here, + # we've dealt with all indeterminates. + [], [] + ) + end + end + + attr_reader :expected_to_actual_matched_indexes, :actual_to_expected_matched_indexes, :solution + + def initialize(expected_to_actual_matched_indexes, actual_to_expected_matched_indexes) + @expected_to_actual_matched_indexes = expected_to_actual_matched_indexes + @actual_to_expected_matched_indexes = actual_to_expected_matched_indexes + + unmatched_expected_indexes, indeterminate_expected_indexes = + categorize_indexes(expected_to_actual_matched_indexes, actual_to_expected_matched_indexes) + + unmatched_actual_indexes, indeterminate_actual_indexes = + categorize_indexes(actual_to_expected_matched_indexes, expected_to_actual_matched_indexes) + + @solution = Solution.new(unmatched_expected_indexes, unmatched_actual_indexes, + indeterminate_expected_indexes, indeterminate_actual_indexes) + end + + def find_best_solution + return solution if solution.candidate? + best_solution_so_far = NullSolution + + expected_index = solution.indeterminate_expected_indexes.first + actuals = expected_to_actual_matched_indexes[expected_index] + + actuals.each do |actual_index| + solution = best_solution_for_pairing(expected_index, actual_index) + return solution if solution.ideal? + best_solution_so_far = solution if best_solution_so_far.worse_than?(solution) + end + + best_solution_so_far + end + + private + + # @private + # Starting solution that is worse than any other real solution. + NullSolution = Class.new do + def self.worse_than?(_other) + true + end + end + + def categorize_indexes(indexes_to_categorize, other_indexes) + unmatched = [] + indeterminate = [] + + indexes_to_categorize.each_pair do |index, matches| + if matches.empty? + unmatched << index + elsif !reciprocal_single_match?(matches, index, other_indexes) + indeterminate << index + end + end + + return unmatched, indeterminate + end + + def reciprocal_single_match?(matches, index, other_list) + return false unless matches.one? + other_list[matches.first] == [index] + end + + def best_solution_for_pairing(expected_index, actual_index) + modified_expecteds = apply_pairing_to( + solution.indeterminate_expected_indexes, + expected_to_actual_matched_indexes, actual_index) + + modified_expecteds.delete(expected_index) + + modified_actuals = apply_pairing_to( + solution.indeterminate_actual_indexes, + actual_to_expected_matched_indexes, expected_index) + + modified_actuals.delete(actual_index) + + solution + self.class.new(modified_expecteds, modified_actuals).find_best_solution + end + + def apply_pairing_to(indeterminates, original_matches, other_list_index) + indeterminates.inject({}) do |accum, index| + accum[index] = original_matches[index] - [other_list_index] + accum + end + end + end + end + # rubocop:enable Metrics/ClassLength + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/count_expectation.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/count_expectation.rb new file mode 100644 index 0000000..aa91310 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/count_expectation.rb @@ -0,0 +1,171 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Abstract class to implement `once`, `at_least` and other + # count constraints. + module CountExpectation + # @api public + # Specifies that the method is expected to match once. + def once + exactly(1) + end + + # @api public + # Specifies that the method is expected to match twice. + def twice + exactly(2) + end + + # @api public + # Specifies that the method is expected to match thrice. + def thrice + exactly(3) + end + + # @api public + # Specifies that the method is expected to match the given number of times. + def exactly(number) + set_expected_count(:==, number) + self + end + + # @api public + # Specifies the maximum number of times the method is expected to match + def at_most(number) + set_expected_count(:<=, number) + self + end + + # @api public + # Specifies the minimum number of times the method is expected to match + def at_least(number) + set_expected_count(:>=, number) + self + end + + # @api public + # No-op. Provides syntactic sugar. + def times + self + end + + protected + # @api private + attr_reader :count_expectation_type, :expected_count + + private + + if RUBY_VERSION.to_f > 1.8 + def cover?(count, number) + count.cover?(number) + end + else + # :nocov: + def cover?(count, number) + number >= count.first && number <= count.last + end + # :nocov: + end + + def expected_count_matches?(actual_count) + @actual_count = actual_count + return @actual_count > 0 unless count_expectation_type + return cover?(expected_count, actual_count) if count_expectation_type == :<=> + + @actual_count.__send__(count_expectation_type, expected_count) + end + + def has_expected_count? + !!count_expectation_type + end + + def set_expected_count(relativity, n) + raise_unsupported_count_expectation if unsupported_count_expectation?(relativity) + + count = count_constraint_to_number(n) + + if count_expectation_type == :<= && relativity == :>= + raise_impossible_count_expectation(count) if count > expected_count + @count_expectation_type = :<=> + @expected_count = count..expected_count + elsif count_expectation_type == :>= && relativity == :<= + raise_impossible_count_expectation(count) if count < expected_count + @count_expectation_type = :<=> + @expected_count = expected_count..count + else + @count_expectation_type = relativity + @expected_count = count + end + end + + def raise_impossible_count_expectation(count) + text = + case count_expectation_type + when :<= then "at_least(#{count}).at_most(#{expected_count})" + when :>= then "at_least(#{expected_count}).at_most(#{count})" + end + raise ArgumentError, "The constraint #{text} is not possible" + end + + def raise_unsupported_count_expectation + text = + case count_expectation_type + when :<= then "at_least" + when :>= then "at_most" + when :<=> then "at_least/at_most combination" + else "count" + end + raise ArgumentError, "Multiple #{text} constraints are not supported" + end + + def count_constraint_to_number(n) + case n + when Numeric then n + when :once then 1 + when :twice then 2 + when :thrice then 3 + else + raise ArgumentError, "Expected a number, :once, :twice or :thrice," \ + " but got #{n}" + end + end + + def unsupported_count_expectation?(relativity) + return true if count_expectation_type == :== + return true if count_expectation_type == :<=> + (count_expectation_type == :<= && relativity == :<=) || + (count_expectation_type == :>= && relativity == :>=) + end + + def count_expectation_description + "#{human_readable_expectation_type}#{human_readable_count(expected_count)}" + end + + def count_failure_reason(action) + "#{count_expectation_description}" \ + " but #{action}#{human_readable_count(@actual_count)}" + end + + def human_readable_expectation_type + case count_expectation_type + when :<= then ' at most' + when :>= then ' at least' + when :<=> then ' between' + else '' + end + end + + def human_readable_count(count) + case count + when Range then " #{count.first} and #{count.last} times" + when nil then '' + when 1 then ' once' + when 2 then ' twice' + else " #{count} times" + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/cover.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/cover.rb new file mode 100644 index 0000000..47474a2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/cover.rb @@ -0,0 +1,24 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `cover`. + # Not intended to be instantiated directly. + class Cover < BaseMatcher + def initialize(*expected) + @expected = expected + end + + def matches?(range) + @actual = range + @expected.all? { |e| range.cover?(e) } + end + + def does_not_match?(range) + @actual = range + expected.none? { |e| range.cover?(e) } + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/eq.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/eq.rb new file mode 100644 index 0000000..08ed656 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/eq.rb @@ -0,0 +1,44 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `eq`. + # Not intended to be instantiated directly. + class Eq < BaseMatcher + # @api private + # @return [String] + def failure_message + if string_encoding_differs? + "\nexpected: #{format_encoding(expected)} #{expected_formatted}\n got: #{format_encoding(actual)} #{actual_formatted}\n\n(compared using ==)\n" + else + "\nexpected: #{expected_formatted}\n got: #{actual_formatted}\n\n(compared using ==)\n" + end + end + + # @api private + # @return [String] + def failure_message_when_negated + "\nexpected: value != #{expected_formatted}\n got: #{actual_formatted}\n\n(compared using ==)\n" + end + + # @api private + # @return [String] + def description + "eq #{expected_formatted}" + end + + # @api private + # @return [Boolean] + def diffable? + true + end + + private + + def match(expected, actual) + actual == expected + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/eql.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/eql.rb new file mode 100644 index 0000000..32560df --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/eql.rb @@ -0,0 +1,38 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `eql`. + # Not intended to be instantiated directly. + class Eql < BaseMatcher + # @api private + # @return [String] + def failure_message + if string_encoding_differs? + "\nexpected: #{format_encoding(expected)} #{expected_formatted}\n got: #{format_encoding(actual)} #{actual_formatted}\n\n(compared using eql?)\n" + else + "\nexpected: #{expected_formatted}\n got: #{actual_formatted}\n\n(compared using eql?)\n" + end + end + + # @api private + # @return [String] + def failure_message_when_negated + "\nexpected: value != #{expected_formatted}\n got: #{actual_formatted}\n\n(compared using eql?)\n" + end + + # @api private + # @return [Boolean] + def diffable? + true + end + + private + + def match(expected, actual) + actual.eql? expected + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/equal.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/equal.rb new file mode 100644 index 0000000..bbab3ed --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/equal.rb @@ -0,0 +1,81 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `equal`. + # Not intended to be instantiated directly. + class Equal < BaseMatcher + # @api private + # @return [String] + def failure_message + if expected_is_a_literal_singleton? + simple_failure_message + else + detailed_failure_message + end + end + + # @api private + # @return [String] + def failure_message_when_negated + <<-MESSAGE + +expected not #{inspect_object(actual)} + got #{inspect_object(expected)} + +Compared using equal?, which compares object identity. + +MESSAGE + end + + # @api private + # @return [Boolean] + def diffable? + !expected_is_a_literal_singleton? + end + + private + + def match(expected, actual) + actual.equal? expected + end + + LITERAL_SINGLETONS = [true, false, nil] + + def expected_is_a_literal_singleton? + LITERAL_SINGLETONS.include?(expected) + end + + def actual_inspected + if LITERAL_SINGLETONS.include?(actual) + actual_formatted + else + inspect_object(actual) + end + end + + def simple_failure_message + "\nexpected #{expected_formatted}\n got #{actual_inspected}\n" + end + + def detailed_failure_message + <<-MESSAGE + +expected #{inspect_object(expected)} + got #{inspect_object(actual)} + +Compared using equal?, which compares object identity, +but expected and actual are not the same object. Use +`expect(actual).to eq(expected)` if you don't care about +object identity in this example. + +MESSAGE + end + + def inspect_object(o) + "#<#{o.class}:#{o.object_id}> => #{RSpec::Support::ObjectFormatter.format(o)}" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/exist.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/exist.rb new file mode 100644 index 0000000..438625d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/exist.rb @@ -0,0 +1,90 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `exist`. + # Not intended to be instantiated directly. + class Exist < BaseMatcher + def initialize(*expected) + @expected = expected + end + + # @api private + # @return [Boolean] + def matches?(actual) + @actual = actual + @test = ExistenceTest.new @actual, @expected + @test.valid_test? && @test.actual_exists? + end + + # @api private + # @return [Boolean] + def does_not_match?(actual) + @actual = actual + @test = ExistenceTest.new @actual, @expected + @test.valid_test? && !@test.actual_exists? + end + + # @api private + # @return [String] + def failure_message + "expected #{actual_formatted} to exist#{@test.validity_message}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected #{actual_formatted} not to exist#{@test.validity_message}" + end + + # @api private + # Simple class for memoizing actual/expected for this matcher + # and examining the match + class ExistenceTest < Struct.new(:actual, :expected) + # @api private + # @return [Boolean] + def valid_test? + uniq_truthy_values.size == 1 + end + + # @api private + # @return [Boolean] + def actual_exists? + existence_values.first + end + + # @api private + # @return [String] + def validity_message + case uniq_truthy_values.size + when 0 + " but it does not respond to either `exist?` or `exists?`" + when 2 + " but `exist?` and `exists?` returned different values:\n\n"\ + " exist?: #{existence_values.first}\n"\ + "exists?: #{existence_values.last}" + end + end + + private + + def uniq_truthy_values + @uniq_truthy_values ||= existence_values.map { |v| !!v }.uniq + end + + def existence_values + @existence_values ||= predicates.map { |p| actual.__send__(p, *expected) } + end + + def predicates + @predicates ||= [:exist?, :exists?].select { |p| actual.respond_to?(p) && !deprecated(p, actual) } + end + + def deprecated(predicate, actual) + predicate == :exists? && (File == actual || FileTest == actual || Dir == actual) + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/has.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/has.rb new file mode 100644 index 0000000..0f4e7e4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/has.rb @@ -0,0 +1,194 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for dynamic predicate matchers. + # Not intended to be inherited directly. + class DynamicPredicate < BaseMatcher + include BeHelpers + + def initialize(method_name, *args, &block) + @method_name, @args, @block = method_name, args, block + end + ruby2_keywords :initialize if respond_to?(:ruby2_keywords, true) + + # @private + def matches?(actual, &block) + @actual = actual + @block ||= block + predicate_accessible? && predicate_matches? + end + + # @private + def does_not_match?(actual, &block) + @actual = actual + @block ||= block + predicate_accessible? && predicate_matches?(false) + end + + # @api private + # @return [String] + def failure_message + failure_message_expecting(true) + end + + # @api private + # @return [String] + def failure_message_when_negated + failure_message_expecting(false) + end + + # @api private + # @return [String] + def description + "#{method_description}#{args_to_sentence}" + end + + private + + # Catch a semi-frequent typo - if you have strict_predicate_matchers disabled and + # expect(spy).to have_receieveddd(:foo) it would be evergreen - the dynamic matcher + # queries `has_receiveddd?`, the spy _fakes_ the method, returning its (truthy) self. + if defined?(RSpec::Mocks::Double) + def really_responds_to?(method) + if RSpec::Mocks::Double === @actual + @actual.respond_to?(method) && methods_include?(method) + else + @actual.respond_to?(method) + end + end + else + # :nocov: + def really_responds_to?(method) + @actual.respond_to?(method) + end + # :nocov: + end + + def predicate_accessible? + really_responds_to?(predicate) + end + + # support 1.8.7, evaluate once at load time for performance + if String === methods.first + # :nocov: + def private_predicate? + @actual.private_methods.include? predicate.to_s + end + + def methods_include?(method) + @actual.methods.include?(method.to_s) + end + # :nocov: + else + def private_predicate? + @actual.private_methods.include? predicate + end + + def methods_include?(method) + @actual.methods.include?(method) + end + end + + def predicate_result + @predicate_result = actual.__send__(predicate_method_name, *@args, &@block) + end + + def predicate_method_name + predicate + end + + def predicate_matches?(value=true) + if RSpec::Expectations.configuration.strict_predicate_matchers? + value == predicate_result + else + value == !!predicate_result + end + end + + def root + # On 1.9, there appears to be a bug where String#match can return `false` + # rather than the match data object. Changing to Regex#match appears to + # work around this bug. For an example of this bug, see: + # https://travis-ci.org/rspec/rspec-expectations/jobs/27549635 + self.class::REGEX.match(@method_name.to_s).captures.first + end + + def method_description + EnglishPhrasing.split_words(@method_name) + end + + def failure_message_expecting(value) + validity_message || + "expected `#{actual_formatted}.#{predicate}#{args_to_s}` to #{expectation_of value}, got #{description_of @predicate_result}" + end + + def expectation_of(value) + if RSpec::Expectations.configuration.strict_predicate_matchers? + "return #{value}" + elsif value + "be truthy" + else + "be falsey" + end + end + + def validity_message + return nil if predicate_accessible? + + "expected #{actual_formatted} to respond to `#{predicate}`#{failure_to_respond_explanation}" + end + + def failure_to_respond_explanation + if private_predicate? + " but `#{predicate}` is a private method" + end + end + end + + # @api private + # Provides the implementation for `has_`. + # Not intended to be instantiated directly. + class Has < DynamicPredicate + # :nodoc: + REGEX = Matchers::HAS_REGEX + private + def predicate + @predicate ||= :"has_#{root}?" + end + end + + # @api private + # Provides the implementation of `be_`. + # Not intended to be instantiated directly. + class BePredicate < DynamicPredicate + # :nodoc: + REGEX = Matchers::BE_PREDICATE_REGEX + private + def predicate + @predicate ||= :"#{root}?" + end + + def predicate_method_name + actual.respond_to?(predicate) ? predicate : present_tense_predicate + end + + def failure_to_respond_explanation + super || if predicate == :true? + " or perhaps you meant `be true` or `be_truthy`" + elsif predicate == :false? + " or perhaps you meant `be false` or `be_falsey`" + end + end + + def predicate_accessible? + super || really_responds_to?(present_tense_predicate) + end + + def present_tense_predicate + :"#{root}s?" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/have_attributes.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/have_attributes.rb new file mode 100644 index 0000000..89be3f2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/have_attributes.rb @@ -0,0 +1,114 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `have_attributes`. + # Not intended to be instantiated directly. + class HaveAttributes < BaseMatcher + # @private + attr_reader :respond_to_failed + + def initialize(expected) + @expected = expected + @values = {} + @respond_to_failed = false + @negated = false + end + + # @private + def actual + @values + end + + # @api private + # @return [Boolean] + def matches?(actual) + @actual = actual + @negated = false + return false unless respond_to_attributes? + perform_match(:all?) + end + + # @api private + # @return [Boolean] + def does_not_match?(actual) + @actual = actual + @negated = true + return false unless respond_to_attributes? + perform_match(:none?) + end + + # @api private + # @return [String] + def description + described_items = surface_descriptions_in(expected) + improve_hash_formatting "have attributes #{RSpec::Support::ObjectFormatter.format(described_items)}" + end + + # @api private + # @return [Boolean] + def diffable? + !@respond_to_failed && !@negated + end + + # @api private + # @return [String] + def failure_message + respond_to_failure_message_or do + "expected #{actual_formatted} to #{description} but had attributes #{ formatted_values }" + end + end + + # @api private + # @return [String] + def failure_message_when_negated + respond_to_failure_message_or { "expected #{actual_formatted} not to #{description}" } + end + + private + + def cache_all_values + @values = {} + expected.each do |attribute_key, _attribute_value| + actual_value = @actual.__send__(attribute_key) + @values[attribute_key] = actual_value + end + end + + def perform_match(predicate) + cache_all_values + expected.__send__(predicate) do |attribute_key, attribute_value| + actual_has_attribute?(attribute_key, attribute_value) + end + end + + def actual_has_attribute?(attribute_key, attribute_value) + values_match?(attribute_value, @values.fetch(attribute_key)) + end + + def respond_to_attributes? + matches = respond_to_matcher.matches?(@actual) + @respond_to_failed = !matches + matches + end + + def respond_to_matcher + @respond_to_matcher ||= RespondTo.new(*expected.keys).with(0).arguments.tap { |m| m.ignoring_method_signature_failure! } + end + + def respond_to_failure_message_or + if respond_to_failed + respond_to_matcher.failure_message + else + improve_hash_formatting(yield) + end + end + + def formatted_values + values = RSpec::Support::ObjectFormatter.format(@values) + improve_hash_formatting(values) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/include.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/include.rb new file mode 100644 index 0000000..3fedee3 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/include.rb @@ -0,0 +1,218 @@ +require 'rspec/matchers/built_in/count_expectation' + +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `include`. + # Not intended to be instantiated directly. + class Include < BaseMatcher # rubocop:disable Metrics/ClassLength + include CountExpectation + # @private + attr_reader :expecteds + + # @api private + def initialize(*expecteds) + raise(ArgumentError, 'include() is not supported, please supply an argument') if expecteds.empty? + @expecteds = expecteds + end + + # @api private + # @return [Boolean] + def matches?(actual) + check_actual?(actual) && + if check_expected_count? + expected_count_matches?(count_inclusions) + else + perform_match { |v| v } + end + end + + # @api private + # @return [Boolean] + def does_not_match?(actual) + check_actual?(actual) && + if check_expected_count? + !expected_count_matches?(count_inclusions) + else + perform_match { |v| !v } + end + end + + # @api private + # @return [String] + def description + improve_hash_formatting("include#{readable_list_of(expecteds)}#{count_expectation_description}") + end + + # @api private + # @return [String] + def failure_message + format_failure_message("to") { super } + end + + # @api private + # @return [String] + def failure_message_when_negated + format_failure_message("not to") { super } + end + + # @api private + # @return [Boolean] + def diffable? + !diff_would_wrongly_highlight_matched_item? + end + + # @api private + # @return [Array, Hash] + def expected + if expecteds.one? && Hash === expecteds.first + expecteds.first + else + expecteds + end + end + + private + + def check_actual?(actual) + actual = actual.to_hash if convert_to_hash?(actual) + @actual = actual + @actual.respond_to?(:include?) + end + + def check_expected_count? + case + when !has_expected_count? + return false + when expecteds.size != 1 + raise NotImplementedError, 'Count constraint supported only when testing for a single value being included' + when actual.is_a?(Hash) + raise NotImplementedError, 'Count constraint on hash keys not implemented' + end + true + end + + def format_failure_message(preposition) + msg = if actual.respond_to?(:include?) + "expected #{description_of @actual} #{preposition}" \ + " include#{readable_list_of @divergent_items}" \ + "#{count_failure_reason('it is included') if has_expected_count?}" + else + "#{yield}, but it does not respond to `include?`" + end + improve_hash_formatting(msg) + end + + def readable_list_of(items) + described_items = surface_descriptions_in(items) + if described_items.all? { |item| item.is_a?(Hash) } + " #{described_items.inject(:merge).inspect}" + else + EnglishPhrasing.list(described_items) + end + end + + def perform_match(&block) + @divergent_items = excluded_from_actual(&block) + @divergent_items.empty? + end + + def excluded_from_actual + return [] unless @actual.respond_to?(:include?) + + expecteds.inject([]) do |memo, expected_item| + if comparing_hash_to_a_subset?(expected_item) + expected_item.each do |(key, value)| + memo << { key => value } unless yield actual_hash_includes?(key, value) + end + elsif comparing_hash_keys?(expected_item) + memo << expected_item unless yield actual_hash_has_key?(expected_item) + else + memo << expected_item unless yield actual_collection_includes?(expected_item) + end + memo + end + end + + def comparing_hash_to_a_subset?(expected_item) + actual.is_a?(Hash) && expected_item.is_a?(Hash) + end + + def actual_hash_includes?(expected_key, expected_value) + actual_value = + actual.fetch(expected_key) do + actual.find(Proc.new { return false }) { |actual_key, _| values_match?(expected_key, actual_key) }[1] + end + values_match?(expected_value, actual_value) + end + + def comparing_hash_keys?(expected_item) + actual.is_a?(Hash) && !expected_item.is_a?(Hash) + end + + def actual_hash_has_key?(expected_key) + # We check `key?` first for perf: + # `key?` is O(1), but `any?` is O(N). + + has_exact_key = + begin + actual.key?(expected_key) + rescue + false + end + + has_exact_key || actual.keys.any? { |key| values_match?(expected_key, key) } + end + + def actual_collection_includes?(expected_item) + return actual.scan(expected_item).size > 0 if Regexp === expected_item && String === actual + return true if actual.include?(expected_item) + + # String lacks an `any?` method... + return false unless actual.respond_to?(:any?) + + actual.any? { |value| values_match?(expected_item, value) } + end + + if RUBY_VERSION < '1.9' + # :nocov: + def count_enumerable(expected_item) + actual.select { |value| values_match?(expected_item, value) }.size + end + # :nocov: + else + def count_enumerable(expected_item) + actual.count { |value| values_match?(expected_item, value) } + end + end + + def count_inclusions + @divergent_items = expected + case actual + when String + actual.scan(expected.first).length + when Enumerable + count_enumerable(Hash === expected ? expected : expected.first) + else + raise NotImplementedError, 'Count constraints are implemented for Enumerable and String values only' + end + end + + def diff_would_wrongly_highlight_matched_item? + return false unless actual.is_a?(String) && expected.is_a?(Array) + return false if Regexp === expecteds.first + + lines = actual.split("\n") + expected.any? do |str| + actual.include?(str) && lines.none? { |line| line == str } + end + end + + def convert_to_hash?(obj) + !obj.respond_to?(:include?) && obj.respond_to?(:to_hash) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/match.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/match.rb new file mode 100644 index 0000000..a822f76 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/match.rb @@ -0,0 +1,120 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `match`. + # Not intended to be instantiated directly. + class Match < BaseMatcher + def initialize(expected) + super(expected) + + @expected_captures = nil + end + # @api private + # @return [String] + def description + if @expected_captures && @expected.match(actual) + "match #{surface_descriptions_in(expected).inspect} with captures #{surface_descriptions_in(@expected_captures).inspect}" + else + "match #{surface_descriptions_in(expected).inspect}" + end + end + + # @api private + # @return [Boolean] + def diffable? + true + end + + # Used to specify the captures we match against + # @return [self] + def with_captures(*captures) + @expected_captures = captures + self + end + + # @api private + # @return [String] + def failure_message + if Array === expected && !(actual.respond_to?(:to_a) || actual.respond_to?(:to_ary)) + return "expected a collection that can be converted to an array with " \ + "`#to_ary` or `#to_a`, but got #{actual_formatted}" + end + + super + end + + private + + def match(expected, actual) + return match_captures(expected, actual) if @expected_captures + return true if values_match?(expected, actual) + return false if Array === expected + return false unless can_safely_call_match?(expected, actual) + actual.match(expected) + end + + def can_safely_call_match?(expected, actual) + return false unless actual.respond_to?(:match) + + !(RSpec::Matchers.is_a_matcher?(expected) && + (String === actual || Regexp === actual)) + end + + def match_captures(expected, actual) + match = actual.match(expected) + if match + match = ReliableMatchData.new(match) + if match.names.empty? + values_match?(@expected_captures, match.captures) + else + expected_matcher = @expected_captures.last + values_match?(expected_matcher, Hash[match.names.zip(match.captures)]) || + values_match?(expected_matcher, Hash[match.names.map(&:to_sym).zip(match.captures)]) || + values_match?(@expected_captures, match.captures) + end + else + false + end + end + end + + # @api private + # Used to wrap match data and make it reliable for 1.8.7 + class ReliableMatchData + def initialize(match_data) + @match_data = match_data + end + + if RUBY_VERSION == "1.8.7" + # @api private + # Returns match data names for named captures + # @return Array + # :nocov: + def names + [] + end + # :nocov: + else + # @api private + # Returns match data names for named captures + # @return Array + def names + match_data.names + end + end + + # @api private + # returns an array of captures from the match data + # @return Array + def captures + match_data.captures + end + + protected + + attr_reader :match_data + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/operators.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/operators.rb new file mode 100644 index 0000000..64f8f3b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/operators.rb @@ -0,0 +1,128 @@ +require 'rspec/support' + +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for operator matchers. + # Not intended to be instantiated directly. + # Only available for use with `should`. + class OperatorMatcher + class << self + # @private + def registry + @registry ||= {} + end + + # @private + def register(klass, operator, matcher) + registry[klass] ||= {} + registry[klass][operator] = matcher + end + + # @private + def unregister(klass, operator) + registry[klass] && registry[klass].delete(operator) + end + + # @private + def get(klass, operator) + klass.ancestors.each do |ancestor| + matcher = registry[ancestor] && registry[ancestor][operator] + return matcher if matcher + end + + nil + end + end + + register Enumerable, '=~', BuiltIn::ContainExactly + + def initialize(actual) + @actual = actual + end + + # @private + def self.use_custom_matcher_or_delegate(operator) + define_method(operator) do |expected| + if !has_non_generic_implementation_of?(operator) && (matcher = OperatorMatcher.get(@actual.class, operator)) + @actual.__send__(::RSpec::Matchers.last_expectation_handler.should_method, matcher.new(expected)) + else + eval_match(@actual, operator, expected) + end + end + + negative_operator = operator.sub(/^=/, '!') + if negative_operator != operator && respond_to?(negative_operator) + define_method(negative_operator) do |_expected| + opposite_should = ::RSpec::Matchers.last_expectation_handler.opposite_should_method + raise "RSpec does not support `#{::RSpec::Matchers.last_expectation_handler.should_method} #{negative_operator} expected`. " \ + "Use `#{opposite_should} #{operator} expected` instead." + end + end + end + + ['==', '===', '=~', '>', '>=', '<', '<='].each do |operator| + use_custom_matcher_or_delegate operator + end + + # @private + def fail_with_message(message) + RSpec::Expectations.fail_with(message, @expected, @actual) + end + + # @api private + # @return [String] + def description + "#{@operator} #{RSpec::Support::ObjectFormatter.format(@expected)}" + end + + private + + def has_non_generic_implementation_of?(op) + Support.method_handle_for(@actual, op).owner != ::Kernel + rescue NameError + false + end + + def eval_match(actual, operator, expected) + ::RSpec::Matchers.last_matcher = self + @operator, @expected = operator, expected + __delegate_operator(actual, operator, expected) + end + end + + # @private + # Handles operator matcher for `should`. + class PositiveOperatorMatcher < OperatorMatcher + def __delegate_operator(actual, operator, expected) + if actual.__send__(operator, expected) + true + else + expected_formatted = RSpec::Support::ObjectFormatter.format(expected) + actual_formatted = RSpec::Support::ObjectFormatter.format(actual) + + if ['==', '===', '=~'].include?(operator) + fail_with_message("expected: #{expected_formatted}\n got: #{actual_formatted} (using #{operator})") + else + fail_with_message("expected: #{operator} #{expected_formatted}\n got: #{operator.gsub(/./, ' ')} #{actual_formatted}") + end + end + end + end + + # @private + # Handles operator matcher for `should_not`. + class NegativeOperatorMatcher < OperatorMatcher + def __delegate_operator(actual, operator, expected) + return false unless actual.__send__(operator, expected) + + expected_formatted = RSpec::Support::ObjectFormatter.format(expected) + actual_formatted = RSpec::Support::ObjectFormatter.format(actual) + + fail_with_message("expected not: #{operator} #{expected_formatted}\n got: #{operator.gsub(/./, ' ')} #{actual_formatted}") + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/output.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/output.rb new file mode 100644 index 0000000..8c3cced --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/output.rb @@ -0,0 +1,207 @@ +require 'stringio' + +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `output`. + # Not intended to be instantiated directly. + class Output < BaseMatcher + def initialize(expected) + @expected = expected + @actual = "" + @block = nil + @stream_capturer = NullCapture + end + + def matches?(block) + @block = block + return false unless Proc === block + @actual = @stream_capturer.capture(block) + @expected ? values_match?(@expected, @actual) : captured? + end + + def does_not_match?(block) + !matches?(block) && Proc === block + end + + # @api public + # Tells the matcher to match against stdout. + # Works only when the main Ruby process prints to stdout + def to_stdout + @stream_capturer = CaptureStdout + self + end + + # @api public + # Tells the matcher to match against stderr. + # Works only when the main Ruby process prints to stderr + def to_stderr + @stream_capturer = CaptureStderr + self + end + + # @api public + # Tells the matcher to match against stdout. + # Works when subprocesses print to stdout as well. + # This is significantly (~30x) slower than `to_stdout` + def to_stdout_from_any_process + @stream_capturer = CaptureStreamToTempfile.new("stdout", $stdout) + self + end + + # @api public + # Tells the matcher to match against stderr. + # Works when subprocesses print to stderr as well. + # This is significantly (~30x) slower than `to_stderr` + def to_stderr_from_any_process + @stream_capturer = CaptureStreamToTempfile.new("stderr", $stderr) + self + end + + # @api private + # @return [String] + def failure_message + "expected block to #{description}, but #{positive_failure_reason}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected block to not #{description}, but #{negative_failure_reason}" + end + + # @api private + # @return [String] + def description + if @expected + "output #{description_of @expected} to #{@stream_capturer.name}" + else + "output to #{@stream_capturer.name}" + end + end + + # @api private + # @return [Boolean] + def diffable? + true + end + + # @api private + # Indicates this matcher matches against a block. + # @return [True] + def supports_block_expectations? + true + end + + # @api private + # Indicates this matcher matches against a block only. + # @return [False] + def supports_value_expectations? + false + end + + private + + def captured? + @actual.length > 0 + end + + def positive_failure_reason + return "was not a block" unless Proc === @block + return "output #{actual_output_description}" if @expected + "did not" + end + + def negative_failure_reason + return "was not a block" unless Proc === @block + "output #{actual_output_description}" + end + + def actual_output_description + return "nothing" unless captured? + actual_formatted + end + end + + # @private + module NullCapture + def self.name + "some stream" + end + + def self.capture(_block) + raise "You must chain `to_stdout` or `to_stderr` off of the `output(...)` matcher." + end + end + + # @private + module CaptureStdout + def self.name + 'stdout' + end + + def self.capture(block) + captured_stream = StringIO.new + + original_stream = $stdout + $stdout = captured_stream + + block.call + + captured_stream.string + ensure + $stdout = original_stream + end + end + + # @private + module CaptureStderr + def self.name + 'stderr' + end + + def self.capture(block) + captured_stream = StringIO.new + + original_stream = $stderr + $stderr = captured_stream + + block.call + + captured_stream.string + ensure + $stderr = original_stream + end + end + + # @private + class CaptureStreamToTempfile < Struct.new(:name, :stream) + def capture(block) + # We delay loading tempfile until it is actually needed because + # we want to minimize stdlibs loaded so that users who use a + # portion of the stdlib can't have passing specs while forgetting + # to load it themselves. `CaptureStreamToTempfile` is rarely used + # and `tempfile` pulls in a bunch of things (delegate, tmpdir, + # thread, fileutils, etc), so it's worth delaying it until this point. + require 'tempfile' + + original_stream = stream.clone + captured_stream = Tempfile.new(name) + + begin + captured_stream.sync = true + stream.reopen(captured_stream) + block.call + captured_stream.rewind + captured_stream.read + ensure + stream.reopen(original_stream) + captured_stream.close + captured_stream.unlink + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/raise_error.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/raise_error.rb new file mode 100644 index 0000000..bbaaf62 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/raise_error.rb @@ -0,0 +1,275 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `raise_error`. + # Not intended to be instantiated directly. + # rubocop:disable Metrics/ClassLength + # rubocop:disable Lint/RescueException + class RaiseError + include Composable + + # Used as a sentinel value to be able to tell when the user did not pass an + # argument. We can't use `nil` for that because we need to warn when `nil` is + # passed in a different way. It's an Object, not a Module, since Module's `===` + # does not evaluate to true when compared to itself. + # + # Note; this _is_ the default value supplied for expected_error_or_message, but + # because there are two method-calls involved, that default is actually supplied + # in the definition of the _matcher_ method, `RSpec::Matchers#raise_error` + UndefinedValue = Object.new.freeze + + def initialize(expected_error_or_message, expected_message, &block) + @block = block + @actual_error = nil + @warn_about_bare_error = UndefinedValue === expected_error_or_message + @warn_about_nil_error = expected_error_or_message.nil? + + case expected_error_or_message + when nil, UndefinedValue + @expected_error = Exception + @expected_message = expected_message + when String, Regexp + @expected_error = Exception + @expected_message = expected_error_or_message + else + @expected_error = expected_error_or_message + @expected_message = expected_message + end + end + + # @api public + # Specifies the expected error message. + def with_message(expected_message) + raise_message_already_set if @expected_message + @warn_about_bare_error = false + @expected_message = expected_message + self + end + + # rubocop:disable Metrics/MethodLength + # @private + def matches?(given_proc, negative_expectation=false, &block) + @given_proc = given_proc + @block ||= block + @raised_expected_error = false + @with_expected_message = false + @eval_block = false + @eval_block_passed = false + + return false unless Proc === given_proc + + begin + given_proc.call + rescue Exception => @actual_error + if values_match?(@expected_error, @actual_error) || + values_match?(@expected_error, actual_error_message) + @raised_expected_error = true + @with_expected_message = verify_message + end + end + + unless negative_expectation + warn_about_bare_error! if warn_about_bare_error? + warn_about_nil_error! if warn_about_nil_error? + eval_block if ready_to_eval_block? + end + + expectation_matched? + end + # rubocop:enable Metrics/MethodLength + + # @private + def does_not_match?(given_proc) + warn_for_negative_false_positives! + !matches?(given_proc, :negative_expectation) && Proc === given_proc + end + + # @private + def supports_block_expectations? + true + end + + # @private + def supports_value_expectations? + false + end + + # @private + def expects_call_stack_jump? + true + end + + # @api private + # @return [String] + def failure_message + @eval_block ? actual_error_message : "expected #{expected_error}#{given_error}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected no #{expected_error}#{given_error}" + end + + # @api private + # @return [String] + def description + "raise #{expected_error}" + end + + private + + def actual_error_message + return nil unless @actual_error + + @actual_error.respond_to?(:original_message) ? @actual_error.original_message : @actual_error.message + end + + def expectation_matched? + error_and_message_match? && block_matches? + end + + def error_and_message_match? + @raised_expected_error && @with_expected_message + end + + def block_matches? + @eval_block ? @eval_block_passed : true + end + + def ready_to_eval_block? + @raised_expected_error && @with_expected_message && @block + end + + def eval_block + @eval_block = true + begin + @block[@actual_error] + @eval_block_passed = true + rescue Exception => err + @actual_error = err + end + end + + def verify_message + return true if @expected_message.nil? + values_match?(@expected_message, actual_error_message.to_s) + end + + def warn_for_negative_false_positives! + expression = if expecting_specific_exception? && @expected_message + "`expect { }.not_to raise_error(SpecificErrorClass, message)`" + elsif expecting_specific_exception? + "`expect { }.not_to raise_error(SpecificErrorClass)`" + elsif @expected_message + "`expect { }.not_to raise_error(message)`" + elsif @warn_about_nil_error + "`expect { }.not_to raise_error(nil)`" + end + + return unless expression + + warn_about_negative_false_positive! expression + end + + def handle_warning(message) + RSpec::Expectations.configuration.false_positives_handler.call(message) + end + + def warn_about_bare_error? + @warn_about_bare_error && @block.nil? + end + + def warn_about_nil_error? + @warn_about_nil_error + end + + def warn_about_bare_error! + handle_warning("Using the `raise_error` matcher without providing a specific " \ + "error or message risks false positives, since `raise_error` " \ + "will match when Ruby raises a `NoMethodError`, `NameError` or " \ + "`ArgumentError`, potentially allowing the expectation to pass " \ + "without even executing the method you are intending to call. " \ + "#{warning}"\ + "Instead consider providing a specific error class or message. " \ + "This message can be suppressed by setting: " \ + "`RSpec::Expectations.configuration.on_potential_false" \ + "_positives = :nothing`") + end + + def warn_about_nil_error! + handle_warning("Using the `raise_error` matcher with a `nil` error is probably " \ + "unintentional, it risks false positives, since `raise_error` " \ + "will match when Ruby raises a `NoMethodError`, `NameError` or " \ + "`ArgumentError`, potentially allowing the expectation to pass " \ + "without even executing the method you are intending to call. " \ + "#{warning}"\ + "Instead consider providing a specific error class or message. " \ + "This message can be suppressed by setting: " \ + "`RSpec::Expectations.configuration.on_potential_false" \ + "_positives = :nothing`") + end + + def warn_about_negative_false_positive!(expression) + handle_warning("Using #{expression} risks false positives, since literally " \ + "any other error would cause the expectation to pass, " \ + "including those raised by Ruby (e.g. `NoMethodError`, `NameError` " \ + "and `ArgumentError`), meaning the code you are intending to test " \ + "may not even get reached. Instead consider using " \ + "`expect { }.not_to raise_error` or `expect { }.to raise_error" \ + "(DifferentSpecificErrorClass)`. This message can be suppressed by " \ + "setting: `RSpec::Expectations.configuration.on_potential_false" \ + "_positives = :nothing`") + end + + def expected_error + case @expected_message + when nil + if RSpec::Support.is_a_matcher?(@expected_error) + "Exception with #{description_of(@expected_error)}" + else + description_of(@expected_error) + end + when Regexp + "#{@expected_error} with message matching #{description_of(@expected_message)}" + else + "#{@expected_error} with #{description_of(@expected_message)}" + end + end + + def format_backtrace(backtrace) + formatter = Matchers.configuration.backtrace_formatter + formatter.format_backtrace(backtrace) + end + + def given_error + return " but was not given a block" unless Proc === @given_proc + return " but nothing was raised" unless @actual_error + + backtrace = format_backtrace(@actual_error.backtrace) + [ + ", got #{description_of(@actual_error)} with backtrace:", + *backtrace + ].join("\n # ") + end + + def expecting_specific_exception? + @expected_error != Exception + end + + def raise_message_already_set + raise "`expect { }.to raise_error(message).with_message(message)` is not valid. " \ + 'The matcher only allows the expected message to be specified once' + end + + def warning + warning = "Actual error raised was #{description_of(@actual_error)}. " + warning if @actual_error + end + end + # rubocop:enable Lint/RescueException + # rubocop:enable Metrics/ClassLength + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/respond_to.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/respond_to.rb new file mode 100644 index 0000000..9adbe04 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/respond_to.rb @@ -0,0 +1,200 @@ +RSpec::Support.require_rspec_support "method_signature_verifier" + +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `respond_to`. + # Not intended to be instantiated directly. + class RespondTo < BaseMatcher + def initialize(*names) + @names = names + @expected_arity = nil + @expected_keywords = [] + @ignoring_method_signature_failure = false + @unlimited_arguments = nil + @arbitrary_keywords = nil + end + + # @api public + # Specifies the number of expected arguments. + # + # @example + # expect(obj).to respond_to(:message).with(3).arguments + def with(n) + @expected_arity = n + self + end + + # @api public + # Specifies keyword arguments, if any. + # + # @example + # expect(obj).to respond_to(:message).with_keywords(:color, :shape) + # @example with an expected number of arguments + # expect(obj).to respond_to(:message).with(3).arguments.and_keywords(:color, :shape) + def with_keywords(*keywords) + @expected_keywords = keywords + self + end + alias :and_keywords :with_keywords + + # @api public + # Specifies that the method accepts any keyword, i.e. the method has + # a splatted keyword parameter of the form **kw_args. + # + # @example + # expect(obj).to respond_to(:message).with_any_keywords + def with_any_keywords + @arbitrary_keywords = true + self + end + alias :and_any_keywords :with_any_keywords + + # @api public + # Specifies that the number of arguments has no upper limit, i.e. the + # method has a splatted parameter of the form *args. + # + # @example + # expect(obj).to respond_to(:message).with_unlimited_arguments + def with_unlimited_arguments + @unlimited_arguments = true + self + end + alias :and_unlimited_arguments :with_unlimited_arguments + + # @api public + # No-op. Intended to be used as syntactic sugar when using `with`. + # + # @example + # expect(obj).to respond_to(:message).with(3).arguments + def argument + self + end + alias :arguments :argument + + # @private + def matches?(actual) + find_failing_method_names(actual, :reject).empty? + end + + # @private + def does_not_match?(actual) + find_failing_method_names(actual, :select).empty? + end + + # @api private + # @return [String] + def failure_message + "expected #{actual_formatted} to respond to #{@failing_method_names.map { |name| description_of(name) }.join(', ')}#{with_arity}" + end + + # @api private + # @return [String] + def failure_message_when_negated + failure_message.sub(/to respond to/, 'not to respond to') + end + + # @api private + # @return [String] + def description + "respond to #{pp_names}#{with_arity}" + end + + # @api private + # Used by other matchers to suppress a check + def ignoring_method_signature_failure! + @ignoring_method_signature_failure = true + end + + private + + def find_failing_method_names(actual, filter_method) + @actual = actual + @failing_method_names = @names.__send__(filter_method) do |name| + @actual.respond_to?(name) && matches_arity?(actual, name) + end + end + + def matches_arity?(actual, name) + ArityCheck.new(@expected_arity, @expected_keywords, @arbitrary_keywords, @unlimited_arguments).matches?(actual, name) + rescue NameError + return true if @ignoring_method_signature_failure + raise ArgumentError, "The #{matcher_name} matcher requires that " \ + "the actual object define the method(s) in " \ + "order to check arity, but the method " \ + "`#{name}` is not defined. Remove the arity " \ + "check or define the method to continue." + end + + def with_arity + str = ''.dup + str << " with #{with_arity_string}" if @expected_arity + str << " #{str.length == 0 ? 'with' : 'and'} #{with_keywords_string}" if @expected_keywords && @expected_keywords.count > 0 + str << " #{str.length == 0 ? 'with' : 'and'} unlimited arguments" if @unlimited_arguments + str << " #{str.length == 0 ? 'with' : 'and'} any keywords" if @arbitrary_keywords + str + end + + def with_arity_string + "#{@expected_arity} argument#{@expected_arity == 1 ? '' : 's'}" + end + + def with_keywords_string + kw_str = case @expected_keywords.count + when 1 + @expected_keywords.first.inspect + when 2 + @expected_keywords.map(&:inspect).join(' and ') + else + "#{@expected_keywords[0...-1].map(&:inspect).join(', ')}, and #{@expected_keywords.last.inspect}" + end + + "keyword#{@expected_keywords.count == 1 ? '' : 's'} #{kw_str}" + end + + def pp_names + @names.length == 1 ? "##{@names.first}" : description_of(@names) + end + + # @private + class ArityCheck + def initialize(expected_arity, expected_keywords, arbitrary_keywords, unlimited_arguments) + expectation = Support::MethodSignatureExpectation.new + + if expected_arity.is_a?(Range) + expectation.min_count = expected_arity.min + expectation.max_count = expected_arity.max + else + expectation.min_count = expected_arity + end + + expectation.keywords = expected_keywords + expectation.expect_unlimited_arguments = unlimited_arguments + expectation.expect_arbitrary_keywords = arbitrary_keywords + @expectation = expectation + end + + def matches?(actual, name) + return true if @expectation.empty? + verifier_for(actual, name).with_expectation(@expectation).valid? + end + + def verifier_for(actual, name) + Support::StrictSignatureVerifier.new(method_signature_for(actual, name)) + end + + def method_signature_for(actual, name) + method_handle = Support.method_handle_for(actual, name) + + if name == :new && method_handle.owner === ::Class && ::Class === actual + Support::MethodSignature.new(actual.instance_method(:initialize)) + else + Support::MethodSignature.new(method_handle) + end + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/satisfy.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/satisfy.rb new file mode 100644 index 0000000..a50967b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/satisfy.rb @@ -0,0 +1,62 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `satisfy`. + # Not intended to be instantiated directly. + class Satisfy < BaseMatcher + def initialize(description=nil, &block) + @description = description + @block = block + end + + # @private + def matches?(actual, &block) + @block = block if block + @actual = actual + @block.call(actual) + end + + # @private + def description + @description ||= "satisfy #{block_representation}" + end + + # @api private + # @return [String] + def failure_message + "expected #{actual_formatted} to #{description}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected #{actual_formatted} not to #{description}" + end + + private + + if RSpec::Support::RubyFeatures.ripper_supported? + def block_representation + if (block_snippet = extract_block_snippet) + "expression `#{block_snippet}`" + else + 'block' + end + end + + def extract_block_snippet + return nil unless @block + Expectations::BlockSnippetExtractor.try_extracting_single_line_body_of(@block, matcher_name) + end + else + # :nocov: + def block_representation + 'block' + end + # :nocov: + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/start_or_end_with.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/start_or_end_with.rb new file mode 100644 index 0000000..81f06c2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/start_or_end_with.rb @@ -0,0 +1,94 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Base class for the `end_with` and `start_with` matchers. + # Not intended to be instantiated directly. + class StartOrEndWith < BaseMatcher + def initialize(*expected) + @actual_does_not_have_ordered_elements = false + @expected = expected.length == 1 ? expected.first : expected + end + + # @api private + # @return [String] + def failure_message + super.tap do |msg| + if @actual_does_not_have_ordered_elements + msg << ", but it does not have ordered elements" + elsif !actual.respond_to?(:[]) + msg << ", but it cannot be indexed using #[]" + end + end + end + + # @api private + # @return [String] + def description + return super unless Hash === expected + english_name = EnglishPhrasing.split_words(self.class.matcher_name) + description_of_expected = surface_descriptions_in(expected).inspect + "#{english_name} #{description_of_expected}" + end + + private + + def match(_expected, actual) + return false unless actual.respond_to?(:[]) + + begin + return true if subsets_comparable? && subset_matches? + element_matches? + rescue ArgumentError + @actual_does_not_have_ordered_elements = true + return false + end + end + + def subsets_comparable? + # Structs support the Enumerable interface but don't really have + # the semantics of a subset of a larger set... + return false if Struct === expected + + expected.respond_to?(:length) + end + end + + # For RSpec 3.1, the base class was named `StartAndEndWith`. For SemVer reasons, + # we still provide this constant until 4.0. + # @deprecated Use StartOrEndWith instead. + # @private + StartAndEndWith = StartOrEndWith + + # @api private + # Provides the implementation for `start_with`. + # Not intended to be instantiated directly. + class StartWith < StartOrEndWith + private + + def subset_matches? + values_match?(expected, actual[0, expected.length]) + end + + def element_matches? + values_match?(expected, actual[0]) + end + end + + # @api private + # Provides the implementation for `end_with`. + # Not intended to be instantiated directly. + class EndWith < StartOrEndWith + private + + def subset_matches? + values_match?(expected, actual[-expected.length, expected.length]) + end + + def element_matches? + values_match?(expected, actual[-1]) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/throw_symbol.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/throw_symbol.rb new file mode 100644 index 0000000..e1bb4c5 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/throw_symbol.rb @@ -0,0 +1,138 @@ +module RSpec + module Matchers + module BuiltIn + # @api private + # Provides the implementation for `throw_symbol`. + # Not intended to be instantiated directly. + class ThrowSymbol + include Composable + + def initialize(expected_symbol=nil, expected_arg=nil) + @expected_symbol = expected_symbol + @expected_arg = expected_arg + @caught_symbol = @caught_arg = nil + end + + # rubocop:disable Metrics/MethodLength + # @private + def matches?(given_proc) + @block = given_proc + return false unless Proc === given_proc + + begin + if @expected_symbol.nil? + given_proc.call + else + @caught_arg = catch :proc_did_not_throw_anything do + catch @expected_symbol do + given_proc.call + throw :proc_did_not_throw_anything, :nothing_thrown + end + end + + if @caught_arg == :nothing_thrown + @caught_arg = nil + else + @caught_symbol = @expected_symbol + end + end + + # Ruby 1.8 uses NameError with `symbol' + # Ruby 1.9 uses ArgumentError with :symbol + rescue NameError, ArgumentError => e + unless (match_data = e.message.match(/uncaught throw (`|\:)([a-zA-Z0-9_]*)(')?/)) + other_exception = e + raise + end + @caught_symbol = match_data.captures[1].to_sym + rescue => other_exception + raise + ensure + # rubocop:disable Lint/EnsureReturn + unless other_exception + if @expected_symbol.nil? + return !!@caught_symbol + else + if @expected_arg.nil? + return @caught_symbol == @expected_symbol + else + return (@caught_symbol == @expected_symbol) && values_match?(@expected_arg, @caught_arg) + end + end + end + # rubocop:enable Lint/EnsureReturn + end + end + # rubocop:enable Metrics/MethodLength + + def does_not_match?(given_proc) + !matches?(given_proc) && Proc === given_proc + end + + # @api private + # @return [String] + def failure_message + "expected #{expected} to be thrown, #{actual_result}" + end + + # @api private + # @return [String] + def failure_message_when_negated + "expected #{expected('no Symbol')}#{' not' if @expected_symbol} to be thrown, #{actual_result}" + end + + # @api private + # @return [String] + def description + "throw #{expected}" + end + + # @api private + # Indicates this matcher matches against a block. + # @return [True] + def supports_block_expectations? + true + end + + # @api private + def supports_value_expectations? + false + end + + # @api private + def expects_call_stack_jump? + true + end + + private + + def actual_result + return "but was not a block" unless Proc === @block + "got #{caught}" + end + + def expected(symbol_desc='a Symbol') + throw_description(@expected_symbol || symbol_desc, @expected_arg) + end + + def caught + throw_description(@caught_symbol || 'nothing', @caught_arg) + end + + def throw_description(symbol, arg) + symbol_description = symbol.is_a?(String) ? symbol : description_of(symbol) + + arg_description = if arg + " with #{description_of arg}" + elsif @expected_arg && @caught_symbol == @expected_symbol + " with no argument" + else + "" + end + + symbol_description + arg_description + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/yield.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/yield.rb new file mode 100644 index 0000000..c443dc0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/yield.rb @@ -0,0 +1,375 @@ +require 'rspec/matchers/built_in/count_expectation' + +RSpec::Support.require_rspec_support 'method_signature_verifier' + +module RSpec + module Matchers + module BuiltIn + # @private + # Object that is yielded to `expect` when one of the + # yield matchers is used. Provides information about + # the yield behavior of the object-under-test. + class YieldProbe + def self.probe(block, &callback) + probe = new(block, &callback) + return probe unless probe.has_block? + probe.probe + end + + attr_accessor :num_yields, :yielded_args + + def initialize(block, &callback) + @block = block + @callback = callback || Proc.new {} + @used = false + self.num_yields = 0 + self.yielded_args = [] + end + + def has_block? + Proc === @block + end + + def probe + assert_valid_expect_block! + @block.call(self) + assert_used! + self + end + + def to_proc + @used = true + + probe = self + callback = @callback + Proc.new do |*args| + probe.num_yields += 1 + probe.yielded_args << args + callback.call(*args) + nil # to indicate the block does not return a meaningful value + end + end + + def single_yield_args + yielded_args.first + end + + def yielded_once?(matcher_name) + case num_yields + when 1 then true + when 0 then false + else + raise "The #{matcher_name} matcher is not designed to be used with a " \ + 'method that yields multiple times. Use the yield_successive_args ' \ + 'matcher for that case.' + end + end + + def assert_used! + return if @used + raise 'You must pass the argument yielded to your expect block on ' \ + 'to the method-under-test as a block. It acts as a probe that ' \ + 'allows the matcher to detect whether or not the method-under-test ' \ + 'yields, and, if so, how many times, and what the yielded arguments ' \ + 'are.' + end + + if RUBY_VERSION.to_f > 1.8 + def assert_valid_expect_block! + block_signature = RSpec::Support::BlockSignature.new(@block) + return if RSpec::Support::StrictSignatureVerifier.new(block_signature, [self]).valid? + raise 'Your expect block must accept an argument to be used with this ' \ + 'matcher. Pass the argument as a block on to the method you are testing.' + end + else + # :nocov: + # On 1.8.7, `lambda { }.arity` and `lambda { |*a| }.arity` both return -1, + # so we can't distinguish between accepting no args and an arg splat. + # It's OK to skip, this, though; it just provides a nice error message + # when the user forgets to accept an arg in their block. They'll still get + # the `assert_used!` error message from above, which is sufficient. + def assert_valid_expect_block! + # nothing to do + end + # :nocov: + end + end + + # @api private + # Provides the implementation for `yield_control`. + # Not intended to be instantiated directly. + class YieldControl < BaseMatcher + include CountExpectation + # @private + def matches?(block) + @probe = YieldProbe.probe(block) + return false unless @probe.has_block? + expected_count_matches?(@probe.num_yields) + end + + # @private + def does_not_match?(block) + !matches?(block) && @probe.has_block? + end + + # @api private + # @return [String] + def failure_message + 'expected given block to yield control' + failure_reason + end + + # @api private + # @return [String] + def failure_message_when_negated + 'expected given block not to yield control' + failure_reason + end + + # @private + def supports_block_expectations? + true + end + + # @private + def supports_value_expectations? + false + end + + private + + def failure_reason + return ' but was not a block' unless @probe.has_block? + return "#{count_expectation_description} but did not yield" if @probe.num_yields == 0 + count_failure_reason('yielded') + end + end + + # @api private + # Provides the implementation for `yield_with_no_args`. + # Not intended to be instantiated directly. + class YieldWithNoArgs < BaseMatcher + # @private + def matches?(block) + @probe = YieldProbe.probe(block) + return false unless @probe.has_block? + @probe.yielded_once?(:yield_with_no_args) && @probe.single_yield_args.empty? + end + + # @private + def does_not_match?(block) + !matches?(block) && @probe.has_block? + end + + # @private + def failure_message + "expected given block to yield with no arguments, but #{positive_failure_reason}" + end + + # @private + def failure_message_when_negated + "expected given block not to yield with no arguments, but #{negative_failure_reason}" + end + + # @private + def supports_block_expectations? + true + end + + # @private + def supports_value_expectations? + false + end + + private + + def positive_failure_reason + return 'was not a block' unless @probe.has_block? + return 'did not yield' if @probe.num_yields.zero? + "yielded with arguments: #{description_of @probe.single_yield_args}" + end + + def negative_failure_reason + return 'was not a block' unless @probe.has_block? + 'did' + end + end + + # @api private + # Provides the implementation for `yield_with_args`. + # Not intended to be instantiated directly. + class YieldWithArgs < BaseMatcher + def initialize(*args) + @expected = args + end + + # @private + def matches?(block) + @args_matched_when_yielded = true + @probe = YieldProbe.new(block) do + @actual = @probe.single_yield_args + @actual_formatted = actual_formatted + @args_matched_when_yielded &&= args_currently_match? + end + return false unless @probe.has_block? + @probe.probe + @probe.yielded_once?(:yield_with_args) && @args_matched_when_yielded + end + + # @private + def does_not_match?(block) + !matches?(block) && @probe.has_block? + end + + # @private + def failure_message + "expected given block to yield with arguments, but #{positive_failure_reason}" + end + + # @private + def failure_message_when_negated + "expected given block not to yield with arguments, but #{negative_failure_reason}" + end + + # @private + def description + desc = 'yield with args' + desc = "#{desc}(#{expected_arg_description})" unless @expected.empty? + desc + end + + # @private + def supports_block_expectations? + true + end + + # @private + def supports_value_expectations? + false + end + + private + + def positive_failure_reason + return 'was not a block' unless @probe.has_block? + return 'did not yield' if @probe.num_yields.zero? + @positive_args_failure + end + + def expected_arg_description + @expected.map { |e| description_of e }.join(', ') + end + + def negative_failure_reason + if !@probe.has_block? + 'was not a block' + elsif @args_matched_when_yielded && !@expected.empty? + 'yielded with expected arguments' \ + "\nexpected not: #{surface_descriptions_in(@expected).inspect}" \ + "\n got: #{@actual_formatted}" + else + 'did' + end + end + + def args_currently_match? + if @expected.empty? # expect {...}.to yield_with_args + @positive_args_failure = 'yielded with no arguments' if @actual.empty? + return !@actual.empty? + end + + unless (match = all_args_match?) + @positive_args_failure = 'yielded with unexpected arguments' \ + "\nexpected: #{surface_descriptions_in(@expected).inspect}" \ + "\n got: #{@actual_formatted}" + end + + match + end + + def all_args_match? + values_match?(@expected, @actual) + end + end + + # @api private + # Provides the implementation for `yield_successive_args`. + # Not intended to be instantiated directly. + class YieldSuccessiveArgs < BaseMatcher + def initialize(*args) + @expected = args + end + + # @private + def matches?(block) + @actual_formatted = [] + @actual = [] + args_matched_when_yielded = true + yield_count = 0 + + @probe = YieldProbe.probe(block) do |*arg_array| + arg_or_args = arg_array.size == 1 ? arg_array.first : arg_array + @actual_formatted << RSpec::Support::ObjectFormatter.format(arg_or_args) + @actual << arg_or_args + args_matched_when_yielded &&= values_match?(@expected[yield_count], arg_or_args) + yield_count += 1 + end + + return false unless @probe.has_block? + args_matched_when_yielded && yield_count == @expected.length + end + + def does_not_match?(block) + !matches?(block) && @probe.has_block? + end + + # @private + def failure_message + 'expected given block to yield successively with arguments, ' \ + "but #{positive_failure_reason}" + end + + # @private + def failure_message_when_negated + 'expected given block not to yield successively with arguments, ' \ + "but #{negative_failure_reason}" + end + + # @private + def description + "yield successive args(#{expected_arg_description})" + end + + # @private + def supports_block_expectations? + true + end + + # @private + def supports_value_expectations? + false + end + + private + + def expected_arg_description + @expected.map { |e| description_of e }.join(', ') + end + + def positive_failure_reason + return 'was not a block' unless @probe.has_block? + + 'yielded with unexpected arguments' \ + "\nexpected: #{surface_descriptions_in(@expected).inspect}" \ + "\n got: [#{@actual_formatted.join(", ")}]" + end + + def negative_failure_reason + return 'was not a block' unless @probe.has_block? + + 'yielded with expected arguments' \ + "\nexpected not: #{surface_descriptions_in(@expected).inspect}" \ + "\n got: [#{@actual_formatted.join(", ")}]" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/composable.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/composable.rb new file mode 100644 index 0000000..e4816e9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/composable.rb @@ -0,0 +1,171 @@ +RSpec::Support.require_rspec_support "fuzzy_matcher" + +module RSpec + module Matchers + # Mixin designed to support the composable matcher features + # of RSpec 3+. Mix it into your custom matcher classes to + # allow them to be used in a composable fashion. + # + # @api public + module Composable + # Creates a compound `and` expectation. The matcher will + # only pass if both sub-matchers pass. + # This can be chained together to form an arbitrarily long + # chain of matchers. + # + # @example + # expect(alphabet).to start_with("a").and end_with("z") + # expect(alphabet).to start_with("a") & end_with("z") + # + # @note The negative form (`expect(...).not_to matcher.and other`) + # is not supported at this time. + def and(matcher) + BuiltIn::Compound::And.new self, matcher + end + alias & and + + # Creates a compound `or` expectation. The matcher will + # pass if either sub-matcher passes. + # This can be chained together to form an arbitrarily long + # chain of matchers. + # + # @example + # expect(stoplight.color).to eq("red").or eq("green").or eq("yellow") + # expect(stoplight.color).to eq("red") | eq("green") | eq("yellow") + # + # @note The negative form (`expect(...).not_to matcher.or other`) + # is not supported at this time. + def or(matcher) + BuiltIn::Compound::Or.new self, matcher + end + alias | or + + # Delegates to `#matches?`. Allows matchers to be used in composable + # fashion and also supports using matchers in case statements. + def ===(value) + matches?(value) + end + + private + + # This provides a generic way to fuzzy-match an expected value against + # an actual value. It understands nested data structures (e.g. hashes + # and arrays) and is able to match against a matcher being used as + # the expected value or within the expected value at any level of + # nesting. + # + # Within a custom matcher you are encouraged to use this whenever your + # matcher needs to match two values, unless it needs more precise semantics. + # For example, the `eq` matcher _does not_ use this as it is meant to + # use `==` (and only `==`) for matching. + # + # @param expected [Object] what is expected + # @param actual [Object] the actual value + # + # @!visibility public + def values_match?(expected, actual) + expected = with_matchers_cloned(expected) + Support::FuzzyMatcher.values_match?(expected, actual) + end + + # Returns the description of the given object in a way that is + # aware of composed matchers. If the object is a matcher with + # a `description` method, returns the description; otherwise + # returns `object.inspect`. + # + # You are encouraged to use this in your custom matcher's + # `description`, `failure_message` or + # `failure_message_when_negated` implementation if you are + # supporting matcher arguments. + # + # @!visibility public + def description_of(object) + RSpec::Support::ObjectFormatter.format(object) + end + + # Transforms the given data structure (typically a hash or array) + # into a new data structure that, when `#inspect` is called on it, + # will provide descriptions of any contained matchers rather than + # the normal `#inspect` output. + # + # You are encouraged to use this in your custom matcher's + # `description`, `failure_message` or + # `failure_message_when_negated` implementation if you are + # supporting any arguments which may be a data structure + # containing matchers. + # + # @!visibility public + def surface_descriptions_in(item) + if Matchers.is_a_describable_matcher?(item) + DescribableItem.new(item) + elsif Hash === item + Hash[surface_descriptions_in(item.to_a)] + elsif Struct === item || unreadable_io?(item) + RSpec::Support::ObjectFormatter.format(item) + elsif should_enumerate?(item) + item.map { |subitem| surface_descriptions_in(subitem) } + else + item + end + end + + # @private + # Historically, a single matcher instance was only checked + # against a single value. Given that the matcher was only + # used once, it's been common to memoize some intermediate + # calculation that is derived from the `actual` value in + # order to reuse that intermediate result in the failure + # message. + # + # This can cause a problem when using such a matcher as an + # argument to another matcher in a composed matcher expression, + # since the matcher instance may be checked against multiple + # values and produce invalid results due to the memoization. + # + # To deal with this, we clone any matchers in `expected` via + # this method when using `values_match?`, so that any memoization + # does not "leak" between checks. + def with_matchers_cloned(object) + if Matchers.is_a_matcher?(object) + object.clone + elsif Hash === object + Hash[with_matchers_cloned(object.to_a)] + elsif should_enumerate?(object) + object.map { |subobject| with_matchers_cloned(subobject) } + else + object + end + end + + # @api private + # We should enumerate arrays as long as they are not recursive. + def should_enumerate?(item) + Array === item && item.none? { |subitem| subitem.equal?(item) } + end + + # @api private + def unreadable_io?(object) + return false unless IO === object + object.each {} # STDOUT is enumerable but raises an error + false + rescue IOError + true + end + module_function :surface_descriptions_in, :should_enumerate?, :unreadable_io? + + # Wraps an item in order to surface its `description` via `inspect`. + # @api private + DescribableItem = Struct.new(:item) do + # Inspectable version of the item description + def inspect + "(#{item.description})" + end + + # A pretty printed version of the item description. + def pretty_print(pp) + pp.text "(#{item.description})" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/dsl.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/dsl.rb new file mode 100644 index 0000000..4905dd8 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/dsl.rb @@ -0,0 +1,546 @@ +RSpec::Support.require_rspec_support "with_keywords_when_needed" + +module RSpec + module Matchers + # Defines the custom matcher DSL. + module DSL + # Defines a matcher alias. The returned matcher's `description` will be overridden + # to reflect the phrasing of the new name, which will be used in failure messages + # when passed as an argument to another matcher in a composed matcher expression. + # + # @example + # RSpec::Matchers.alias_matcher :a_list_that_sums_to, :sum_to + # sum_to(3).description # => "sum to 3" + # a_list_that_sums_to(3).description # => "a list that sums to 3" + # + # @example + # RSpec::Matchers.alias_matcher :a_list_sorted_by, :be_sorted_by do |description| + # description.sub("be sorted by", "a list sorted by") + # end + # + # be_sorted_by(:age).description # => "be sorted by age" + # a_list_sorted_by(:age).description # => "a list sorted by age" + # + # @param new_name [Symbol] the new name for the matcher + # @param old_name [Symbol] the original name for the matcher + # @param options [Hash] options for the aliased matcher + # @option options [Class] :klass the ruby class to use as the decorator. (Not normally used). + # @yield [String] optional block that, when given, is used to define the overridden + # logic. The yielded arg is the original description or failure message. If no + # block is provided, a default override is used based on the old and new names. + # @see RSpec::Matchers + def alias_matcher(new_name, old_name, options={}, &description_override) + description_override ||= lambda do |old_desc| + old_desc.gsub(EnglishPhrasing.split_words(old_name), EnglishPhrasing.split_words(new_name)) + end + klass = options.fetch(:klass) { AliasedMatcher } + + define_method(new_name) do |*args, &block| + matcher = __send__(old_name, *args, &block) + matcher.matcher_name = new_name if matcher.respond_to?(:matcher_name=) + klass.new(matcher, description_override) + end + ruby2_keywords new_name if respond_to?(:ruby2_keywords, true) + end + + # Defines a negated matcher. The returned matcher's `description` and `failure_message` + # will be overridden to reflect the phrasing of the new name, and the match logic will + # be based on the original matcher but negated. + # + # @example + # RSpec::Matchers.define_negated_matcher :exclude, :include + # include(1, 2).description # => "include 1 and 2" + # exclude(1, 2).description # => "exclude 1 and 2" + # + # @param negated_name [Symbol] the name for the negated matcher + # @param base_name [Symbol] the name of the original matcher that will be negated + # @yield [String] optional block that, when given, is used to define the overridden + # logic. The yielded arg is the original description or failure message. If no + # block is provided, a default override is used based on the old and new names. + # @see RSpec::Matchers + def define_negated_matcher(negated_name, base_name, &description_override) + alias_matcher(negated_name, base_name, :klass => AliasedNegatedMatcher, &description_override) + end + + # Defines a custom matcher. + # + # @param name [Symbol] the name for the matcher + # @yield [Object] block that is used to define the matcher. + # The block is evaluated in the context of your custom matcher class. + # When args are passed to your matcher, they will be yielded here, + # usually representing the expected value(s). + # @see RSpec::Matchers + def define(name, &declarations) + warn_about_block_args(name, declarations) + define_method name do |*expected, &block_arg| + RSpec::Matchers::DSL::Matcher.new(name, declarations, self, *expected, &block_arg) + end + end + alias_method :matcher, :define + + private + + if Proc.method_defined?(:parameters) + def warn_about_block_args(name, declarations) + declarations.parameters.each do |type, arg_name| + next unless type == :block + RSpec.warning("Your `#{name}` custom matcher receives a block argument (`#{arg_name}`), " \ + "but due to limitations in ruby, RSpec cannot provide the block. Instead, " \ + "use the `block_arg` method to access the block") + end + end + else + # :nocov: + def warn_about_block_args(*) + # There's no way to detect block params on 1.8 since the method reflection APIs don't expose it + end + # :nocov: + end + + RSpec.configure { |c| c.extend self } if RSpec.respond_to?(:configure) + + # Contains the methods that are available from within the + # `RSpec::Matchers.define` DSL for creating custom matchers. + module Macros + # Stores the block that is used to determine whether this matcher passes + # or fails. The block should return a boolean value. When the matcher is + # passed to `expect(...).to` and the block returns `true`, then the expectation + # passes. Similarly, when the matcher is passed to `expect(...).not_to` and the + # block returns `false`, then the expectation passes. + # + # @example + # + # RSpec::Matchers.define :be_even do + # match do |actual| + # actual.even? + # end + # end + # + # expect(4).to be_even # passes + # expect(3).not_to be_even # passes + # expect(3).to be_even # fails + # expect(4).not_to be_even # fails + # + # By default the match block will swallow expectation errors (e.g. + # caused by using an expectation such as `expect(1).to eq 2`), if you + # wish to allow these to bubble up, pass in the option + # `:notify_expectation_failures => true`. + # + # @param [Hash] options for defining the behavior of the match block. + # @yield [Object] actual the actual value (i.e. the value wrapped by `expect`) + def match(options={}, &match_block) + define_user_override(:matches?, match_block) do |actual| + @actual = actual + RSpec::Support.with_failure_notifier(RAISE_NOTIFIER) do + begin + super(*actual_arg_for(match_block)) + rescue RSpec::Expectations::ExpectationNotMetError + raise if options[:notify_expectation_failures] + false + end + end + end + end + + # @private + RAISE_NOTIFIER = Proc.new { |err, _opts| raise err } + + # Use this to define the block for a negative expectation (`expect(...).not_to`) + # when the positive and negative forms require different handling. This + # is rarely necessary, but can be helpful, for example, when specifying + # asynchronous processes that require different timeouts. + # + # By default the match block will swallow expectation errors (e.g. + # caused by using an expectation such as `expect(1).to eq 2`), if you + # wish to allow these to bubble up, pass in the option + # `:notify_expectation_failures => true`. + # + # @param [Hash] options for defining the behavior of the match block. + # @yield [Object] actual the actual value (i.e. the value wrapped by `expect`) + def match_when_negated(options={}, &match_block) + define_user_override(:does_not_match?, match_block) do |actual| + begin + @actual = actual + RSpec::Support.with_failure_notifier(RAISE_NOTIFIER) do + super(*actual_arg_for(match_block)) + end + rescue RSpec::Expectations::ExpectationNotMetError + raise if options[:notify_expectation_failures] + false + end + end + end + + # Use this instead of `match` when the block will raise an exception + # rather than returning false to indicate a failure. + # + # @example + # + # RSpec::Matchers.define :accept_as_valid do |candidate_address| + # match_unless_raises ValidationException do |validator| + # validator.validate(candidate_address) + # end + # end + # + # expect(email_validator).to accept_as_valid("person@company.com") + # + # @yield [Object] actual the actual object (i.e. the value wrapped by `expect`) + def match_unless_raises(expected_exception=Exception, &match_block) + define_user_override(:matches?, match_block) do |actual| + @actual = actual + begin + super(*actual_arg_for(match_block)) + rescue expected_exception => @rescued_exception + false + else + true + end + end + end + + # Customizes the failure message to use when this matcher is + # asked to positively match. Only use this when the message + # generated by default doesn't suit your needs. + # + # @example + # + # RSpec::Matchers.define :have_strength do |expected| + # match { your_match_logic } + # + # failure_message do |actual| + # "Expected strength of #{expected}, but had #{actual.strength}" + # end + # end + # + # @yield [Object] actual the actual object (i.e. the value wrapped by `expect`) + def failure_message(&definition) + define_user_override(__method__, definition) + end + + # Customize the failure message to use when this matcher is asked + # to negatively match. Only use this when the message generated by + # default doesn't suit your needs. + # + # @example + # + # RSpec::Matchers.define :have_strength do |expected| + # match { your_match_logic } + # + # failure_message_when_negated do |actual| + # "Expected not to have strength of #{expected}, but did" + # end + # end + # + # @yield [Object] actual the actual object (i.e. the value wrapped by `expect`) + def failure_message_when_negated(&definition) + define_user_override(__method__, definition) + end + + # Customize the description to use for one-liners. Only use this when + # the description generated by default doesn't suit your needs. + # + # @example + # + # RSpec::Matchers.define :qualify_for do |expected| + # match { your_match_logic } + # + # description do + # "qualify for #{expected}" + # end + # end + # + # @yield [Object] actual the actual object (i.e. the value wrapped by `expect`) + def description(&definition) + define_user_override(__method__, definition) + end + + # Tells the matcher to diff the actual and expected values in the failure + # message. + def diffable + define_method(:diffable?) { true } + end + + # Declares that the matcher can be used in a block expectation. + # Users will not be able to use your matcher in a block + # expectation without declaring this. + # (e.g. `expect { do_something }.to matcher`). + def supports_block_expectations + define_method(:supports_block_expectations?) { true } + end + + # Convenience for defining methods on this matcher to create a fluent + # interface. The trick about fluent interfaces is that each method must + # return self in order to chain methods together. `chain` handles that + # for you. If the method is invoked and the + # `include_chain_clauses_in_custom_matcher_descriptions` config option + # hash been enabled, the chained method name and args will be added to the + # default description and failure message. + # + # In the common case where you just want the chained method to store some + # value(s) for later use (e.g. in `match`), you can provide one or more + # attribute names instead of a block; the chained method will store its + # arguments in instance variables with those names, and the values will + # be exposed via getters. + # + # @example + # + # RSpec::Matchers.define :have_errors_on do |key| + # chain :with do |message| + # @message = message + # end + # + # match do |actual| + # actual.errors[key] == @message + # end + # end + # + # expect(minor).to have_errors_on(:age).with("Not old enough to participate") + def chain(method_name, *attr_names, &definition) + unless block_given? ^ attr_names.any? + raise ArgumentError, "You must pass either a block or some attribute names (but not both) to `chain`." + end + + definition = assign_attributes(attr_names) if attr_names.any? + + define_user_override(method_name, definition) do |*args, &block| + super(*args, &block) + @chained_method_clauses.push([method_name, args]) + self + end + end + + def assign_attributes(attr_names) + attr_reader(*attr_names) + private(*attr_names) + + lambda do |*attr_values| + attr_names.zip(attr_values) do |attr_name, attr_value| + instance_variable_set(:"@#{attr_name}", attr_value) + end + end + end + + # assign_attributes isn't defined in the private section below because + # that makes MRI 1.9.2 emit a warning about private attributes. + private :assign_attributes + + private + + # Does the following: + # + # - Defines the named method using a user-provided block + # in @user_method_defs, which is included as an ancestor + # in the singleton class in which we eval the `define` block. + # - Defines an overridden definition for the same method + # usign the provided `our_def` block. + # - Provides a default `our_def` block for the common case + # of needing to call the user's definition with `@actual` + # as an arg, but only if their block's arity can handle it. + # + # This compiles the user block into an actual method, allowing + # them to use normal method constructs like `return` + # (e.g. for an early guard statement), while allowing us to define + # an override that can provide the wrapped handling + # (e.g. assigning `@actual`, rescueing errors, etc) and + # can `super` to the user's definition. + def define_user_override(method_name, user_def, &our_def) + @user_method_defs.__send__(:define_method, method_name, &user_def) + our_def ||= lambda { super(*actual_arg_for(user_def)) } + define_method(method_name, &our_def) + end + + # Defines deprecated macro methods from RSpec 2 for backwards compatibility. + # @deprecated Use the methods from {Macros} instead. + module Deprecated + # @deprecated Use {Macros#match} instead. + def match_for_should(&definition) + RSpec.deprecate("`match_for_should`", :replacement => "`match`") + match(&definition) + end + + # @deprecated Use {Macros#match_when_negated} instead. + def match_for_should_not(&definition) + RSpec.deprecate("`match_for_should_not`", :replacement => "`match_when_negated`") + match_when_negated(&definition) + end + + # @deprecated Use {Macros#failure_message} instead. + def failure_message_for_should(&definition) + RSpec.deprecate("`failure_message_for_should`", :replacement => "`failure_message`") + failure_message(&definition) + end + + # @deprecated Use {Macros#failure_message_when_negated} instead. + def failure_message_for_should_not(&definition) + RSpec.deprecate("`failure_message_for_should_not`", :replacement => "`failure_message_when_negated`") + failure_message_when_negated(&definition) + end + end + end + + # Defines default implementations of the matcher + # protocol methods for custom matchers. You can + # override any of these using the {RSpec::Matchers::DSL::Macros Macros} methods + # from within an `RSpec::Matchers.define` block. + module DefaultImplementations + include BuiltIn::BaseMatcher::DefaultFailureMessages + + # @api private + # Used internally by objects returns by `should` and `should_not`. + def diffable? + false + end + + # The default description. + def description + english_name = EnglishPhrasing.split_words(name) + expected_list = EnglishPhrasing.list(expected) + "#{english_name}#{expected_list}#{chained_method_clause_sentences}" + end + + # Matchers do not support block expectations by default. You + # must opt-in. + def supports_block_expectations? + false + end + + def supports_value_expectations? + true + end + + # Most matchers do not expect call stack jumps. + def expects_call_stack_jump? + false + end + + private + + def chained_method_clause_sentences + return '' unless Expectations.configuration.include_chain_clauses_in_custom_matcher_descriptions? + + @chained_method_clauses.map do |(method_name, method_args)| + english_name = EnglishPhrasing.split_words(method_name) + arg_list = EnglishPhrasing.list(method_args) + " #{english_name}#{arg_list}" + end.join + end + end + + # The class used for custom matchers. The block passed to + # `RSpec::Matchers.define` will be evaluated in the context + # of the singleton class of an instance, and will have the + # {RSpec::Matchers::DSL::Macros Macros} methods available. + class Matcher + # Provides default implementations for the matcher protocol methods. + include DefaultImplementations + + # Allows expectation expressions to be used in the match block. + include RSpec::Matchers + + # Supports the matcher composability features of RSpec 3+. + include Composable + + # Makes the macro methods available to an `RSpec::Matchers.define` block. + extend Macros + extend Macros::Deprecated + + # Exposes the value being matched against -- generally the object + # object wrapped by `expect`. + attr_reader :actual + + # Exposes the exception raised during the matching by `match_unless_raises`. + # Could be useful to extract details for a failure message. + attr_reader :rescued_exception + + # The block parameter used in the expectation + attr_reader :block_arg + + # The name of the matcher. + attr_reader :name + + # @api private + def initialize(name, declarations, matcher_execution_context, *expected, &block_arg) + @name = name + @actual = nil + @expected_as_array = expected + @matcher_execution_context = matcher_execution_context + @chained_method_clauses = [] + @block_arg = block_arg + + klass = + class << self + # See `Macros#define_user_override` above, for an explanation. + include(@user_method_defs = Module.new) + self + end + RSpec::Support::WithKeywordsWhenNeeded.class_exec(klass, *expected, &declarations) + end + + # Provides the expected value. This will return an array if + # multiple arguments were passed to the matcher; otherwise it + # will return a single value. + # @see #expected_as_array + def expected + if expected_as_array.size == 1 + expected_as_array[0] + else + expected_as_array + end + end + + # Returns the expected value as an an array. This exists primarily + # to aid in upgrading from RSpec 2.x, since in RSpec 2, `expected` + # always returned an array. + # @see #expected + attr_reader :expected_as_array + + # Adds the name (rather than a cryptic hex number) + # so we can identify an instance of + # the matcher in error messages (e.g. for `NoMethodError`) + def inspect + "#<#{self.class.name} #{name}>" + end + + if RUBY_VERSION.to_f >= 1.9 + # Indicates that this matcher responds to messages + # from the `@matcher_execution_context` as well. + # Also, supports getting a method object for such methods. + def respond_to_missing?(method, include_private=false) + super || @matcher_execution_context.respond_to?(method, include_private) + end + else # for 1.8.7 + # :nocov: + # Indicates that this matcher responds to messages + # from the `@matcher_execution_context` as well. + def respond_to?(method, include_private=false) + super || @matcher_execution_context.respond_to?(method, include_private) + end + # :nocov: + end + + private + + def actual_arg_for(block) + block.arity.zero? ? [] : [@actual] + end + + # Takes care of forwarding unhandled messages to the + # `@matcher_execution_context` (typically the current + # running `RSpec::Core::Example`). This is needed by + # rspec-rails so that it can define matchers that wrap + # Rails' test helper methods, but it's also a useful + # feature in its own right. + def method_missing(method, *args, &block) + if @matcher_execution_context.respond_to?(method) + @matcher_execution_context.__send__ method, *args, &block + else + super(method, *args, &block) + end + end + # The method_missing method should be refactored to pass kw args in RSpec 4 + # then this can be removed + ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/english_phrasing.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/english_phrasing.rb new file mode 100644 index 0000000..05b69bd --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/english_phrasing.rb @@ -0,0 +1,60 @@ +module RSpec + module Matchers + # Facilitates converting ruby objects to English phrases. + module EnglishPhrasing + # Converts a symbol into an English expression. + # + # split_words(:banana_creme_pie) #=> "banana creme pie" + # + def self.split_words(sym) + sym.to_s.tr('_', ' ') + end + + # @note The returned string has a leading space except + # when given an empty list. + # + # Converts an object (often a collection of objects) + # into an English list. + # + # list(['banana', 'kiwi', 'mango']) + # #=> " \"banana\", \"kiwi\", and \"mango\"" + # + # Given an empty collection, returns the empty string. + # + # list([]) #=> "" + # + def self.list(obj) + return " #{RSpec::Support::ObjectFormatter.format(obj)}" if !obj || Struct === obj || Hash === obj + items = Array(obj).map { |w| RSpec::Support::ObjectFormatter.format(w) } + case items.length + when 0 + "" + when 1 + " #{items[0]}" + when 2 + " #{items[0]} and #{items[1]}" + else + " #{items[0...-1].join(', ')}, and #{items[-1]}" + end + end + + if RUBY_VERSION == '1.8.7' + # Not sure why, but on travis on 1.8.7 we have gotten these warnings: + # lib/rspec/matchers/english_phrasing.rb:28: warning: default `to_a' will be obsolete + # So it appears that `Array` can trigger that (e.g. by calling `to_a` on the passed object?) + # So here we replace `Kernel#Array` with our own warning-free implementation for 1.8.7. + # @private + # rubocop:disable Naming/MethodName + # :nocov: + def self.Array(obj) + case obj + when Array then obj + else [obj] + end + end + # :nocov: + # rubocop:enable Naming/MethodName + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/fail_matchers.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/fail_matchers.rb new file mode 100644 index 0000000..bdd7cda --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/fail_matchers.rb @@ -0,0 +1,42 @@ +require 'rspec/expectations' + +module RSpec + module Matchers + # Matchers for testing RSpec matchers. Include them with: + # + # require 'rspec/matchers/fail_matchers' + # RSpec.configure do |config| + # config.include RSpec::Matchers::FailMatchers + # end + # + module FailMatchers + # Matches if an expectation fails + # + # @example + # expect { some_expectation }.to fail + def fail(&block) + raise_error(RSpec::Expectations::ExpectationNotMetError, &block) + end + + # Matches if an expectation fails with the provided message + # + # @example + # expect { some_expectation }.to fail_with("some failure message") + # expect { some_expectation }.to fail_with(/some failure message/) + def fail_with(message) + raise_error(RSpec::Expectations::ExpectationNotMetError, message) + end + + # Matches if an expectation fails including the provided message + # + # @example + # expect { some_expectation }.to fail_including("portion of some failure message") + def fail_including(*snippets) + raise_error( + RSpec::Expectations::ExpectationNotMetError, + a_string_including(*snippets) + ) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/generated_descriptions.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/generated_descriptions.rb new file mode 100644 index 0000000..cbf3751 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/generated_descriptions.rb @@ -0,0 +1,41 @@ +module RSpec + module Matchers + class << self + # @private + attr_accessor :last_matcher, :last_expectation_handler + end + + # @api private + # Used by rspec-core to clear the state used to generate + # descriptions after an example. + def self.clear_generated_description + self.last_matcher = nil + self.last_expectation_handler = nil + end + + # @api private + # Generates an an example description based on the last expectation. + # Used by rspec-core's one-liner syntax. + def self.generated_description + return nil if last_expectation_handler.nil? + "#{last_expectation_handler.verb} #{last_description}" + end + + # @private + def self.last_description + last_matcher.respond_to?(:description) ? last_matcher.description : <<-MESSAGE +When you call a matcher in an example without a String, like this: + +specify { expect(object).to matcher } + +or this: + +it { is_expected.to matcher } + +RSpec expects the matcher to have a #description method. You should either +add a String to the example this matcher is being used in, or give it a +description method. Then you won't have to suffer this lengthy warning again. +MESSAGE + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/matcher_delegator.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/matcher_delegator.rb new file mode 100644 index 0000000..b957b4f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/matcher_delegator.rb @@ -0,0 +1,61 @@ +module RSpec + module Matchers + # Provides a base class with as little methods as possible, so that + # most methods can be delegated via `method_missing`. + # + # On Ruby 2.0+ BasicObject could be used for this purpose, but it + # introduce some extra complexity with constant resolution, so the + # BlankSlate pattern was prefered. + # @private + class BaseDelegator + kept_methods = [ + # Methods that raise warnings if removed. + :__id__, :__send__, :object_id, + + # Methods that are explicitly undefined in some subclasses. + :==, :===, + + # Methods we keep on purpose. + :class, :respond_to?, :__method__, :method, :dup, + :clone, :initialize_dup, :initialize_copy, :initialize_clone, + ] + instance_methods.each do |method| + unless kept_methods.include?(method.to_sym) + undef_method(method) + end + end + end + + # Provides the necessary plumbing to wrap a matcher with a decorator. + # @private + class MatcherDelegator < BaseDelegator + include Composable + attr_reader :base_matcher + + def initialize(base_matcher) + @base_matcher = base_matcher + end + + def method_missing(*args, &block) + base_matcher.__send__(*args, &block) + end + + if ::RUBY_VERSION.to_f > 1.8 + def respond_to_missing?(name, include_all=false) + super || base_matcher.respond_to?(name, include_all) + end + else + # :nocov: + def respond_to?(name, include_all=false) + super || base_matcher.respond_to?(name, include_all) + end + # :nocov: + end + + def initialize_copy(other) + @base_matcher = @base_matcher.clone + super + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/matcher_protocol.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/matcher_protocol.rb new file mode 100644 index 0000000..4a87f64 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/matcher_protocol.rb @@ -0,0 +1,105 @@ +module RSpec + module Matchers + # rspec-expectations can work with any matcher object that implements this protocol. + # + # @note This class is not loaded at runtime by rspec-expectations. It exists + # purely to provide documentation for the matcher protocol. + class MatcherProtocol + # @!group Required Methods + + # @!method matches?(actual) + # @param actual [Object] The object being matched against. + # @yield For an expression like `expect(x).to matcher do...end`, the `do/end` + # block binds to `to`. It passes that block, if there is one, on to this method. + # @return [Boolean] true if this matcher matches the provided object. + + # @!method failure_message + # This will only be called if {#matches?} returns false. + # @return [String] Explanation for the failure. + + # @!endgroup + + # @!group Optional Methods + + # @!method does_not_match?(actual) + # In a negative expectation such as `expect(x).not_to foo`, RSpec will + # call `foo.does_not_match?(x)` if this method is defined. If it's not + # defined it will fall back to using `!foo.matches?(x)`. This allows you + # to provide custom logic for the negative case. + # + # @param actual [Object] The object being matched against. + # @yield For an expression like `expect(x).not_to matcher do...end`, the `do/end` + # block binds to `not_to`. It passes that block, if there is one, on to this method. + # @return [Boolean] true if this matcher does not match the provided object. + + # @!method failure_message_when_negated + # This will only be called when a negative match fails. + # @return [String] Explanation for the failure. + # @note This method is listed as optional because matchers do not have to + # support negation. But if your matcher does support negation, this is a + # required method -- otherwise, you'll get a `NoMethodError`. + + # @!method description + # The description is used for two things: + # + # * When using RSpec's one-liner syntax + # (e.g. `it { is_expected.to matcher }`), the description + # is used to generate the example's doc string since you + # have not provided one. + # * In a composed matcher expression, the description is used + # as part of the failure message (and description) of the outer + # matcher. + # + # @return [String] Description of the matcher. + + # @!method supports_block_expectations? + # Indicates that this matcher can be used in a block expectation expression, + # such as `expect { foo }.to raise_error`. Generally speaking, this is + # only needed for matchers which operate on a side effect of a block, rather + # than on a particular object. + # @return [Boolean] true if this matcher can be used in block expressions. + # @note If not defined, RSpec assumes a value of `false` for this method. + + # @!method supports_value_expectations? + # Indicates that this matcher can be used in a value expectation expression, + # such as `expect(foo).to eq(bar)`. + # @return [Boolean] true if this matcher can be used in value expressions. + # @note If not defined, RSpec assumes a value of `true` for this method. + + # @!method expects_call_stack_jump? + # Indicates that when this matcher is used in a block expectation + # expression, it expects the block to use a ruby construct that causes + # a call stack jump (such as raising an error or throwing a symbol). + # + # This is used internally for compound block expressions, as matchers + # which expect call stack jumps must be treated with care to work properly. + # + # @return [Boolean] true if the matcher expects a call stack jump + # + # @note This method is very rarely used or needed. + # @note If not defined, RSpec assumes a value of `false` for this method. + + # @!method diffable? + # @return [Boolean] true if `actual` and `expected` can be diffed. + # Indicates that this matcher provides `actual` and `expected` attributes, + # and that the values returned by these can be usefully diffed, which can + # be included in the output. + + # @!method actual + # @return [String, Object] If an object (rather than a string) is provided, + # RSpec will use the `pp` library to convert it to multi-line output in + # order to diff. + # The actual value for the purposes of a diff. + # @note This method is required if `diffable?` returns true. + + # @!method expected + # @return [String, Object] If an object (rather than a string) is provided, + # RSpec will use the `pp` library to convert it to multi-line output in + # order to diff. + # The expected value for the purposes of a diff. + # @note This method is required if `diffable?` returns true. + + # @!endgroup + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/multi_matcher_diff.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/multi_matcher_diff.rb new file mode 100644 index 0000000..cd2264e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/multi_matcher_diff.rb @@ -0,0 +1,82 @@ +module RSpec + module Matchers + # @api private + # Handles list of expected and actual value pairs when there is a need + # to render multiple diffs. Also can handle one pair. + class MultiMatcherDiff + # @private + # Default diff label when there is only one matcher in diff + # output + DEFAULT_DIFF_LABEL = "Diff:".freeze + + # @private + # Maximum readable matcher description length + DESCRIPTION_MAX_LENGTH = 65 + + def initialize(expected_list) + @expected_list = expected_list + end + + # @api private + # Wraps provided expected value in instance of + # MultiMatcherDiff. If provided value is already an + # MultiMatcherDiff then it just returns it. + # @param [Any] expected value to be wrapped + # @param [Any] actual value + # @return [RSpec::Matchers::MultiMatcherDiff] + def self.from(expected, actual) + return expected if self === expected + new([[expected, DEFAULT_DIFF_LABEL, actual]]) + end + + # @api private + # Wraps provided matcher list in instance of + # MultiMatcherDiff. + # @param [Array] matchers list of matchers to wrap + # @return [RSpec::Matchers::MultiMatcherDiff] + def self.for_many_matchers(matchers) + new(matchers.map { |m| [m.expected, diff_label_for(m), m.actual] }) + end + + # @api private + # Returns message with diff(s) appended for provided differ + # factory and actual value if there are any + # @param [String] message original failure message + # @param [Proc] differ + # @return [String] + def message_with_diff(message, differ) + diff = diffs(differ) + message = "#{message}\n#{diff}" unless diff.empty? + message + end + + private + + class << self + private + + def diff_label_for(matcher) + "Diff for (#{truncated(RSpec::Support::ObjectFormatter.format(matcher))}):" + end + + def truncated(description) + return description if description.length <= DESCRIPTION_MAX_LENGTH + description[0...DESCRIPTION_MAX_LENGTH - 3] << "..." + end + end + + def diffs(differ) + @expected_list.map do |(expected, diff_label, actual)| + diff = differ.diff(actual, expected) + next if diff.strip.empty? + if diff == "\e[0m\n\e[0m" + "#{diff_label}\n" \ + " " + else + "#{diff_label}#{diff}" + end + end.compact.join("\n") + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/.document b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/.document new file mode 100644 index 0000000..52a564f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/.document @@ -0,0 +1,5 @@ +lib/**/*.rb +- +README.md +LICENSE.md +Changelog.md diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/.yardopts b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/.yardopts new file mode 100644 index 0000000..9555b8e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/.yardopts @@ -0,0 +1,6 @@ +--exclude features +--no-private +--markup markdown +- +Changelog.md +LICENSE.md diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/Changelog.md b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/Changelog.md new file mode 100644 index 0000000..f326ed9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/Changelog.md @@ -0,0 +1,1329 @@ +### Development +[Full Changelog](https://github.com/rspec/rspec/compare/rspec-mocks-v3.13.5...3-13-maintenance) + +### 3.13.5 / 2025-05-27 +[Full Changelog](https://github.com/rspec/rspec/compare/rspec-mocks-v3.13.4...rspec-mocks-v3.13.5) + +Bug Fixes: + +* Fix regression where a previous fix (rspec/rspec#214) would leave behind thread data + between tests. (Jon Rowe, rspec/rspec#219) +* Fix links in gemspec to point to monorepo / homepage. (Jon Rowe) + +### 3.13.4 / 2025-05-05 +[Full Changelog](https://github.com/rspec/rspec/compare/rspec-mocks-v3.13.3...rspec-mocks-v3.13.4) + +Bug Fixes: + +* Fix regression where nested stubbed method calls would inadvertently not be counted. + (Jon Rowe, rspec/rspec#214) +* Fix regression where keyword arguments would not be passed through to nested stubbed + method calls. (Jon Rowe, rspec/rspec#214) + +### 3.13.3 / 2025-05-01 +[Full Changelog](https://github.com/rspec/rspec/compare/rspec-mocks-v3.13.2...rspec-mocks-v3.13.3) + +Bug Fixes: + +* When stubbing methods using the `expect_any_instance_of` or `allow_any_instance_of` + ensure the stubbed method has the same visibility as the real method. + (Jon Rowe, rspec/rspec-mocks#1596) +* Prevent recursive calls to stubbed methods during stub invocation. + (James Dabbs, rspec/rspec#116, rspec/rspec#156) + +### 3.13.2 / 2024-10-02 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.13.1...v3.13.2) + +Bug Fixes: + +* Support keyword arguments in callables passed to `and_invoke`. (Jon Rowe, rspec/rspec-mocks#1595) + +### 3.13.1 / 2024-05-08 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.13.0...v3.13.1) + +Bug Fixes: + +* Use `RSpec::Support::Mutex` in `RSpec::Mocks::Proxy` to avoid issues from + stubbing `::Mutex#new`. (Eric Mueller, rspec/rspec-mocks#1575) + +### 3.13.0 / 2024-02-04 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.7...v3.13.0) + +Enhancements: + +* Add an `array_excluding` matcher for arguments. (Zane Wolfgang Pickett, rspec/rspec-mocks#1528) + +### 3.12.7 / 2024-02-04 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.6...v3.12.7) + +Bug Fixes: + +* Reduce allocations from "any_instance" style mocks. (Carlos Palhares, rspec/rspec-mocks#1479) + +### 3.12.6 / 2023-07-11 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.5...v3.12.6) + +Bug Fixes: + +* Fix an issue with `and_call_original` when using the `method_missing` fallback + with keyword arguments. (Igor Drozdov, rspec/rspec-mocks#1552) + +### 3.12.5 / 2023-03-30 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.4...v3.12.5) + +Bug Fixes: + +* Fix compatibility issue with Rails where active_support monkey patches `with` + when using any instance. (Lachlan Sylvester, rspec/rspec-mocks#1540) + +### 3.12.4 / 2023-03-12 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.3...v3.12.4) + +Bug Fixes: + +* Fix an issue with asserting that Array#reverse is never called. (Brad Trick, rspec/rspec-mocks#1533) +* Fix compatibility issue with Rails where active_support monkey patches `with`. + (Jean Boussier, rspec/rspec-mocks#1531, rspec/rspec-mocks#1534) + +### 3.12.3 / 2023-01-17 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.2...v3.12.3) + +Bug Fixes: + +* Fix keyword delegation in `send` for verifying doubles on Ruby 3. + (Charlie Honig, rspec/rspec-mocks#1485) + +### 3.12.2 / 2023-01-07 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.1...v3.12.2) + +Bug Fixes: + +* Fix implementation blocks for mocks using keyword arguments on Ruby 3.2.0. + (Adam Steel, rspec/rspec-mocks#1508) +* Fix keyword argument assertions when mocking using `with` on Ruby 3.2.0. + (Slava Kardakov, Benoit Tigeot, Phil Pirozhkov, Benoit Daloze, rspec/rspec-mocks#1514) + +### 3.12.1 / 2022-12-10 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.0...v3.12.1) + +Bug Fixes: + +* Remove empty diff marker when a diff only contains console codes. (Jon Rowe, rspec/rspec-mocks#1506) +* Show keyword vs hash diff marker when arguments are not `==` (Jon Rowe, rspec/rspec-mocks#1506) +* Change check to detect frozen objects to rescue errors rather than + pre-empting by checking `frozen?` due to some objects mis-behaving. + (Keegan Roth, rspec/rspec-mocks#1401) +* Prevent unfulfilled expectations using `expect_any_instance_of` across a class + inheritance boundary from raising rather than failing. (Jon Rowe, rspec/rspec-mocks#1496) +* Prevent a misleading error message when using `allow(...).not_to` with + unsupported matchers. (Phil Pirozhkov, rspec/rspec-mocks#1503) + +### 3.12.0 / 2022-10-26 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.11.2...v3.12.0) + +Enhancements: + +* Improve diff output when diffing keyword arguments against hashes. + (Jean Boussier, rspec/rspec-mocks#1461) + +### 3.11.2 / 2022-10-25 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.11.1...v3.11.2) + +Bug Fixes: + +* Use the original implementation of `Class.new` to detect overridden definitions + of `new` rather than the owner, fixing detection of "double aliased" methods + in Ruby 3 and above. (Benoit Daloze, rspec/rspec-mocks#1470, rspec/rspec-mocks#1476) +* Support keyword argument semantics when constraining argument expectations using + `with` on Ruby 3.0+ with `instance_double` (Andrii Malyshko, rspec/rspec-mocks#1473) + +### 3.11.1 / 2022-03-31 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.11.0...v3.11.1) + +Bug Fixes: + +* Add extra `ruby2_keywords` calls to properly designate methods using + `*args` to pass keyword around, fixes an issue with TruffleRuby. + (Benoit Daloze, rspec/rspec-mocks#1464) + +### 3.11.0 / 2022-02-09 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.10.3...v3.11.0) + +Enhancements: + +* Add `and_invoke` implementation for configuring responses to `receive` + (and `receive_messages`) with multiple callable objects. (Kyle Smith, rspec/rspec-mocks#1411) + +### 3.10.3 / 2022-01-28 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.10.2...v3.10.3) + +Bug Fixes: + +* Suppress warning by setting `$VERBOSE` to nil. (Nobuyoshi Nakada, rspec/rspec-mocks#1414) +* Support keyword argument semantics when constraining argument expectations using + `with` on Ruby 3.0+ (Yusuke Endoh, rspec/rspec-mocks#1394) + +### 3.10.2 / 2021-01-27 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.10.1...v3.10.2) + +Bug Fixes: + +* Support keyword arguments with `and_call_original` on Ruby 3.0. + (Bryan Powell, rspec/rspec-mocks#1385) +* `RSpec::Mocks::Constant#previously_defined?` is now always a boolean. + (Phil Pirozhkov, rspec/rspec-mocks#1397) +* Support keyword arguments on Ruby 3.0 when used with `expect_any_instance_of` + or `allow_any_instance_of` with `and_call_original`. + (Jess Hottenstein, rspec/rspec-mocks#1407) + +### 3.10.1 / 2020-12-27 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.10.0...v3.10.1) + +Bug Fixes: + +* Issue `ArgumentError` rather than `TypeError` when unsupported methods on + unsupported objects are attempted to be stubbed. (@zhisme, rspec/rspec-mocks#1357) + +### 3.10.0 / 2020-10-30 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.9.1...v3.10.0) + +Enhancements: +* Add the ability to set a custom error generator in `MessageExpectation`. + This will allow rspec-expectations to inject a custom failure message. + (Benoit Tigeot and Nicolas Zermati, rspec/rspec-mocks#1312) +* Return the result of the block passed to `RSpec::Mocks.with_temporary_scope` + when block run. (@expeehaa, rspec/rspec-mocks#1329) + +### 3.9.1 / 2019-12-31 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.9.0...v3.9.1) + +Bug Fixes: + +* Trigger `RSpec::Mocks.configuration.verifying_double_callbacks` when using + `allow_any_instance_of` or `expect_any_instance_of` (Daniel Orner, rspec/rspec-mocks#1309) + +### 3.9.0 / 2019-10-07 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.8.2...v3.9.0) + +Enhancements: + +* Improve thread safety of message expectations by using Mutex to prevent + deadlocking errors. (Ry Biesemeyer, rspec/rspec-mocks#1236) +* Add the ability to use `time` as an alias for `times`. For example: + `expect(Class).to receive(:method).exactly(1).time`. + (Pistos, Benoit Tigeot, rspec/rspec-mocks#1271) + +### 3.8.2 / 2019-10-02 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.8.1...v3.8.2) + +* Allow `array_including` argument matchers to be nested. + (Emmanuel Delmas, rspec/rspec-mocks#1291) + +### 3.8.1 / 2019-06-13 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.8.0...v3.8.1) + +Bug Fixes: + +* Ensure stubbing methods does not change their visibility. + (Kevin Boschert, rspec/rspec-mocks#1277) + +### 3.8.0 / 2018-08-04 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.7.0...v3.8.0) + +Bug Fixes: + +* Issue error when encountering invalid "counted" negative message expectations. + (Sergiy Yarinovskiy, rspec/rspec-mocks#1212) +* Ensure `allow_any_instance_of` and `expect_any_instance_of` can be temporarily + supressed. (Jon Rowe, rspec/rspec-mocks#1228) +* Ensure `expect_any_instance_of(double).to_not have_received(:some_method)` + fails gracefully (as its not supported) rather than issuing a `NoMethodError`. + (Maxim Krizhanovsky, rspec/rspec-mocks#1231) + +### 3.7.0 / 2017-10-17 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.6.0...v3.7.0) + +Enhancements: + +* Improve compatibility with `--enable-frozen-string-literal` option + on Ruby 2.3+. (Pat Allan, rspec/rspec-mocks#1165) + +Bug Fixes: + +* Fix `hash_including` and `hash_excluding` so that they work against + subclasses of `Hash`. (Aaron Rosenberg, rspec/rspec-mocks#1167) + +### 3.6.0 / 2017-05-04 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.6.0.beta2...v3.6.0) + +Bug Fixes: + +* Fix "instance variable @color not initialized" warning when using + rspec-mocks without rspec-core. (Myron Marston, rspec/rspec-mocks#1142) +* Restore aliased module methods properly when stubbing on 1.8.7. + (Samuel Giddins, rspec/rspec-mocks#1144) +* Allow a message chain expectation to be constrained by argument(s). + (Jon Rowe, rspec/rspec-mocks#1156) + +### 3.6.0.beta2 / 2016-12-12 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.6.0.beta1...v3.6.0.beta2) + +Enhancements: + +* Add new `without_partial_double_verification { }` API that lets you + temporarily turn off partial double verification for an example. + (Jon Rowe, rspec/rspec-mocks#1104) + +### 3.6.0.beta1 / 2016-10-09 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.5.0...v3.6.0.beta1) + +Bug Fixes: + +* Return the test double instance form `#freeze` (Alessandro Berardi, rspec/rspec-mocks#1109) +* Allow the special logic for stubbing `new` to work when `.method` has + been redefined. (Proby, rspec/rspec-mocks#1119) + +### 3.5.0 / 2016-07-01 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.5.0.beta4...v3.5.0) + +Enhancements: + +* Provides a nice string representation of + `RSpec::Mocks::MessageExpectation` (Myron Marston, rspec/rspec-mocks#1095) + +### 3.5.0.beta4 / 2016-06-05 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.5.0.beta3...v3.5.0.beta4) + +Enhancements: + +* Add `and_throw` to any instance handling. (Tobias Bühlmann, rspec/rspec-mocks#1068) + +### 3.5.0.beta3 / 2016-04-02 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.5.0.beta2...v3.5.0.beta3) + +Enhancements: + +* Issue warning when attempting to use unsupported + `allow(...).to receive(...).ordered`. (Jon Rowe, rspec/rspec-mocks#1000) +* Add `rspec/mocks/minitest_integration`, to properly integrate rspec-mocks + with minitest. (Myron Marston, rspec/rspec-mocks#1065) + +### 3.5.0.beta2 / 2016-03-10 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.5.0.beta1...v3.5.0.beta2) + +Enhancements: + +* Improve error message displayed when using `and_wrap_original` on pure test + doubles. (betesh, rspec/rspec-mocks#1063) + +Bug Fixes: + +* Fix issue that prevented `receive_message_chain(...).with(...)` working + correctly on "any instance" mocks. (Jon Rowe, rspec/rspec-mocks#1061) + +### 3.5.0.beta1 / 2016-02-06 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.4.1...v3.5.0.beta1) + +Bug Fixes: + +* Allow `any_instance_of(...).to receive(...)` to use `and_yield` multiple + times. (Kilian Cirera Sant, rspec/rspec-mocks#1054) +* Allow matchers which inherit from `rspec-mocks` matchers to be used for + `allow`. (Andrew Kozin, rspec/rspec-mocks#1056) +* Prevent stubbing `respond_to?` on partial doubles from causing infinite + recursion. (Jon Rowe, rspec/rspec-mocks#1013) +* Prevent aliased methods from disapearing after being mocked with + `any_instance` (regression from rspec/rspec-mocks#1043). (Joe Rafaniello, rspec/rspec-mocks#1060) + +### 3.4.1 / 2016-01-10 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.4.0...v3.4.1) + +Bug Fixes: + +* Fix `any_instance` to work properly on Ruby 2.3. (Joe Rafaniello, rspec/rspec-mocks#1043) + +### 3.4.0 / 2015-11-11 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.3.2...v3.4.0) + +Enhancements: + +* Make `expect(...).to have_received` work without relying upon + rspec-expectations. (Myron Marston, rspec/rspec-mocks#978) +* Add option for failing tests when expectations are set on `nil`. + (Liz Rush, rspec/rspec-mocks#983) + +Bug Fixes: + +* Fix `have_received { ... }` so that any block passed when the message + was received is forwarded to the `have_received` block. (Myron Marston, rspec/rspec-mocks#1006) +* Fix infinite loop in error generator when stubbing `respond_to?`. + (Alex Dowad, rspec/rspec-mocks#1022) +* Fix issue with using `receive` on subclasses (at a class level) with 1.8.7. + (Alex Dowad, rspec/rspec-mocks#1026) + +### 3.3.2 / 2015-07-15 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.3.1...v3.3.2) + +Bug Fixes: + +* Prevent thread deadlock errors during proxy creation (e.g. when using + `before_verifying_doubles` callbacks). (Jon Rowe, rspec/rspec-mocks#980, rspec/rspec-mocks#979) + +### 3.3.1 / 2015-06-19 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.3.0...v3.3.1) + +Bug Fixes: + +* Fix bug in `before_verifying_double` callback logic that caused it to be called + once for each class in the ancestor list when mocking or stubbing a class. Now + it is only called for the mocked or stubbed class, as you would expect. (Sam + Phippen, rspec/rspec-mocks#974) + +### 3.3.0 / 2015-06-12 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.2.1...v3.3.0) + +Enhancements: + +* When stubbing `new` on `MyClass` or `class_double(MyClass)`, use the + method signature from `MyClass#initialize` to verify arguments. + (Myron Marston, rspec/rspec-mocks#886) +* Use matcher descriptions when generating description of received arguments + for mock expectation failures. (Tim Wade, rspec/rspec-mocks#891) +* Avoid loading `stringio` unnecessarily. (Myron Marston, rspec/rspec-mocks#894) +* Verifying doubles failure messages now distinguish between class and instance + level methods. (Tim Wade, rspec/rspec-mocks#896, rspec/rspec-mocks#908) +* Improve mock expectation failure messages so that it combines both + number of times and the received arguments in the output. (John Ceh, rspec/rspec-mocks#918) +* Improve how test doubles are represented in failure messages. + (Siva Gollapalli, Myron Marston, rspec/rspec-mocks#932) +* Rename `RSpec::Mocks::Configuration#when_declaring_verifying_double` to + `RSpec::Mocks::Configuration#before_verifying_doubles` and utilise when + verifying partial doubles. (Jon Rowe, rspec/rspec-mocks#940) +* Use rspec-support's `ObjectFormatter` for improved formatting of + arguments in failure messages so that, for example, full time + precisions is displayed for time objects. (Gavin Miller, Myron Marston, rspec/rspec-mocks#955) + +Bug Fixes: + +* Ensure expectations that raise eagerly also raise during RSpec verification. + This means that if exceptions are caught inside test execution the test will + still fail. (Sam Phippen, rspec/rspec-mocks#884) +* Fix `have_received(msg).with(args).exactly(n).times` and + `receive(msg).with(args).exactly(n).times` failure messages + for when the message was received the wrong number of times with + the specified args, and also received additional times with other + arguments. Previously it confusingly listed the arguments as being + mis-matched (even when the double was allowed to receive with any + args) rather than listing the count. (John Ceh, rspec/rspec-mocks#918) +* Fix `any_args`/`anything` support so that we avoid calling `obj == anything` + on user objects that may have improperly implemented `==` in a way that + raises errors. (Myron Marston, rspec/rspec-mocks#924) +* Fix edge case involving stubbing the same method on a class and a subclass + which previously hit a `NoMethodError` internally in RSpec. (Myron Marston rspec/rspec-mocks#954) +* Fix edge case where the message received count would be incremented multiple + times for one failure. (Myron Marston, rspec/rspec-mocks#957) +* Fix failure messages for when spies received the expected message with + different arguments and also received another message. (Maurício Linhares, rspec/rspec-mocks#960) +* Silence whitespace-only diffs. (Myron Marston, rspec/rspec-mocks#969) + +### 3.2.1 / 2015-02-23 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.2.0...v3.2.1) + +Bug Fixes: + +* Add missing `rspec/support/differ` require so that rspec-mocks can be + used w/o rspec-expectations (which also loads the differ and hided the + fact we forgot to require it). (Myron Marston, rspec/rspec-mocks#893) +* Revert tracking of received arg mutation (added in 3.2.0 to provide an + error in a situation we can't support) as our implementation has side + effects on non-standard objects and there's no solution we could come + up with that always works. (Myron Marston, rspec/rspec-mocks#900) + +### 3.2.0 / 2015-02-03 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.1.3...v3.2.0) + +Enhancements: + +* Treat `any_args` as an arg splat, allowing it to match an arbitrary + number of args at any point in an arg list. (Myron Marston, rspec/rspec-mocks#786) +* Print diffs when arguments in mock expectations are mismatched. + (Sam Phippen, rspec/rspec-mocks#751) +* Support names for verified doubles (`instance_double`, `instance_spy`, + `class_double`, `class_spy`, `object_double`, `object_spy`). (Cezary + Baginski, rspec/rspec-mocks#826) +* Make `array_including` and `hash_including` argument matchers composable. + (Sam Phippen, rspec/rspec-mocks#819) +* Make `allow_any_instance_of(...).to receive(...).and_wrap_original` + work. (Ryan Fitzgerald, rspec/rspec-mocks#869) + +Bug Fixes: + +* Provide a clear error when users wrongly combine `no_args` with + additional arguments (e.g. `expect().to receive().with(no_args, 1)`). + (Myron Marston, rspec/rspec-mocks#786) +* Provide a clear error when users wrongly use `any_args` multiple times in the + same argument list (e.g. `expect().to receive().with(any_args, 1, any_args)`. + (Myron Marston, rspec/rspec-mocks#786) +* Prevent the error generator from using user object #description methods. + See [rspec/rspec-mocks#685](https://github.com/rspec/rspec-mocks/issues/685). + (Sam Phippen, rspec/rspec-mocks#751) +* Make verified doubles declared as `(instance|class)_double(SomeConst)` + work properly when `SomeConst` has previously been stubbed. + `(instance|class)_double("SomeClass")` already worked properly. + (Myron Marston, rspec/rspec-mocks#824) +* Add a matcher description for `receive`, `receive_messages` and + `receive_message_chain`. (Myron Marston, rspec/rspec-mocks#828) +* Validate invocation args for null object verified doubles. + (Myron Marston, rspec/rspec-mocks#829) +* Fix `RSpec::Mocks::Constant.original` when called with an invalid + constant to return an object indicating the constant name is invalid, + rather than blowing up. (Myron Marston, rspec/rspec-mocks#833) +* Make `extend RSpec::Mocks::ExampleMethods` on any object work properly + to add the rspec-mocks API to that object. Previously, `expect` would + be undefined. (Myron Marston, rspec/rspec-mocks#846) +* Fix `require 'rspec/mocks/standalone'` so that it only affects `main` + and not every object. It's really only intended to be used in a REPL + like IRB, but some gems have loaded it, thinking it needs to be loaded + when using rspec-mocks outside the context of rspec-core. + (Myron Marston, rspec/rspec-mocks#846) +* Prevent message expectations from being modified by customization methods + (e.g. `with`) after they have been invoked. (Sam Phippen and Melanie Gilman, rspec/rspec-mocks#837) +* Handle cases where a method stub cannot be removed due to something + external to RSpec monkeying with the method definition. This can + happen, for example, when you `file.reopen(io)` after previously + stubbing a method on the `file` object. (Myron Marston, rspec/rspec-mocks#853) +* Provide a clear error when received message args are mutated before + a `have_received(...).with(...)` expectation. (Myron Marston, rspec/rspec-mocks#868) + +### 3.1.3 / 2014-10-08 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.1.2...v3.1.3) + +Bug Fixes: + +* Correct received messages count when used with `have_received` matcher. + (Jon Rowe, rspec/rspec-mocks#793) +* Provide a clear error message when you use `allow_any_instance_of(...)` or + `expect_any_instance_of(...)` with the `have_received` matcher (they are + not intended to be used together and previously caused an odd internal + failure in rspec-mocks). (Jon Rowe, rspec/rspec-mocks#799). +* Fix verified double `with` verification so that it applies to method + stubs. (Myron Marston, rspec/rspec-mocks#790) + +### 3.1.2 / 2014-09-26 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.1.1...v3.1.2) + +Bug Fixes: + +* Provide a clear error message when you use `allow(...)` with the + `have_received` matcher (they are not intended to be used together + and previously caused an odd internal failure in rspec-mocks). (Jon Rowe, rspec/rspec-mocks#788). + +### 3.1.1 / 2014-09-18 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.1.0...v3.1.1) + +Bug Fixes: + +* Prevent included modules being detected as prepended modules on Ruby 2.0 + when using `any_instance_of(...)`. (Tony Novak, rspec/rspec-mocks#781) + +### 3.1.0 / 2014-09-04 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.4...v3.1.0) + +Enhancements: + +* Add spying methods (`spy`, `ìnstance_spy`, `class_spy` and `object_spy`) + which create doubles as null objects for use with spying in testing. (Sam + Phippen, rspec/rspec-mocks#671) +* `have_received` matcher will raise "does not implement" errors correctly when + used with verifying doubles and partial doubles. (Xavier Shay, rspec/rspec-mocks#722) +* Allow matchers to be used in place of keyword arguments in `with` + expectations. (Xavier Shay, rspec/rspec-mocks#726) +* Add `thrice` modifier to message expectation interface as a synonym + for `exactly(3).times`. (Dennis Taylor, rspec/rspec-mocks#753) +* Add more `thrice` synonyms e.g. `.at_least(:thrice)`, `.at_most(:thrice)`, + `receive(...).thrice` and `have_received(...).thrice`. (Jon Rowe, rspec/rspec-mocks#754) +* Add `and_wrap_original` modifier for partial doubles to mutate the + response from a method. (Jon Rowe, rspec/rspec-mocks#762) + +Bug Fixes: + +* Remove `any_number_of_times` from `any_instance` recorders that were + erroneously causing mention of the method in documentation. (Jon Rowe, rspec/rspec-mocks#760) +* Prevent included modules being detected as prepended modules on Ruby 2.0. + (Eugene Kenny, rspec/rspec-mocks#771) + +### 3.0.4 / 2014-08-14 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.3...v3.0.4) + +Bug Fixes: + +* Restore `kind_of(x)` to match using `arg.kind_of?(x)` (like RSpec 2) + rather than `x === arg`. (Jon Rowe, rspec/rspec-mocks#750) + +### 3.0.3 / 2014-07-21 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.2...v3.0.3) + +Bug Fixes: + +* `have_received` matcher will raise "does not implement" errors correctly when + used with verifying doubles and partial doubles. (Xavier Shay, rspec/rspec-mocks#722) +* Make `double.as_null_object.dup` and `double.as_null_object.clone` + make the copies be null objects. (Myron Marston, rspec/rspec-mocks#732) +* Don't inadvertently define `BasicObject` in 1.8.7. (Chris Griego, rspec/rspec-mocks#739) + +### 3.0.2 / 2014-06-19 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.1...v3.0.2) + +Bug Fixes: + +* Fix edge case that triggered "can't add a new key into hash during + iteration" during mock verification. (Sam Phippen, Myron Marston, rspec/rspec-mocks#711) +* Fix verifying doubles so that when they accidentally leak into another + example, they provide the same clear error message that normal doubles + do. (Myron Marston, rspec/rspec-mocks#718) +* Make `ordered` work with exact receive counts. (Sam Phippen, rspec/rspec-mocks#713) + +### 3.0.1 / 2014-06-07 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.0...v3.0.1) + +Bug Fixes: + +* Fix `receive_message_chain(...)` so that it supports `with` just like + `stub_chain` did. (Jon Rowe, rspec/rspec-mocks#697) +* Fix regression in `expect_any_instance_of` so that it expects the + message on _any_ instance rather than on _every_ instance. + (Myron Marston, rspec/rspec-mocks#699) + +### 3.0.0 / 2014-06-01 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.0.rc1...v3.0.0) + +Bug Fixes: + +* Fix module prepend detection to work properly on ruby 2.0 for a case + where a module is extended onto itself. (Myron Marston) +* Fix `transfer_nested_constants` option so that transferred constants + get properly reset at the end of the example. (Myron Marston) +* Fix `config.transfer_nested_constants = true` so that you don't + erroneously get errors when stubbing a constant that is not a module + or a class. (Myron Marston) +* Fix regression that caused `double(:class => SomeClass)` to later + trigger infinite recursion. (Myron Marston) +* Fix bug in `have_received(...).with(...).ordered` where it was not + taking the args into account when checking the order. (Myron Marston) +* Fix bug in `have_received(...).ordered` where it was wrongly + considering stubs when checking the order. (Myron Marston) +* Message expectation matchers now show descriptions from argument + matchers when their expectations aren't met. (Jon Rowe) +* Display warning when encountering `TypeError` during instance method + staging on 2.0.0-p195, suffers from https://bugs.ruby-lang.org/issues/8686 + too. (Cezar Halmagean). + +### 3.0.0.rc1 / 2014-05-18 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.0.beta2...v3.0.0.rc1) + +Breaking Changes for 3.0.0: + +* Remove `RSpec::Mocks::TestDouble.extend_onto`. (Myron Marston) +* Remove `RSpec::Mocks::ConstantStubber`. (Jon Rowe) +* Make monkey-patch of Marshal to support dumping of stubbed objects opt-in. + (Xavier Shay) + +Enhancements: + +* Instead of crashing when cleaning up stub methods on a frozen object, it now + issues a warning explaining that it's impossible to clean up the stubs. + (Justin Coyne and Sam Phippen) +* Add meaningful descriptions to `anything`, `duck_type` and `instance_of` argument + matchers. (Jon Rowe) + +Bug Fixes: + +* Fix regression introduced in 3.0.0.beta2 that caused + `double.as_null_object.to_str` to return the double rather + than a string. (Myron Marston) +* Fix bug in `expect(dbl).to receive_message_chain(:foo, :bar)` where it was + not setting an expectation for the last message in the chain. + (Jonathan del Strother) +* Allow verifying partial doubles to have private methods stubbed. (Xavier Shay) +* Fix bug with allowing/expecting messages on Class objects which have had + their singleton class prepended to. (Jon Rowe) +* Fix an issue with 1.8.7 not running implementation blocks on partial doubles. + (Maurício Linhares) +* Prevent `StackLevelTooDeep` errors when stubbing an `any_instance` method that's + accessed in `inspect` by providing our own inspect output. (Jon Rowe) +* Fix bug in `any_instance` logic that did not allow you to mock or stub + private methods if `verify_partial_doubles` was configured. (Oren Dobzinski) +* Include useful error message when trying to observe an unimplemented method + on an any instance. (Xavier Shay) +* Fix `and_call_original` to work properly when multiple classes in an + inheritance hierarchy have been stubbed with the same method. (Myron Marston) +* Fix `any_instance` so that it updates existing instances that have + already been stubbed. (Myron Marston) +* Fix verified doubles so that their class name is included in failure + messages. (Myron Marston) +* Fix `expect_any_instance_of` so that when the message is received + on an individual instance that has been directly stubbed, it still + satisfies the expectation. (Sam Phippen, Myron Marston) +* Explicitly disallow using `any_instance` to mock or stub a method + that is defined on a module prepended onto the class. This triggered + `SystemStackError` before and is very hard to support so we are not + supporting it at this time. (Myron Marston) + +### 3.0.0.beta2 / 2014-02-17 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.0.beta1...v3.0.0.beta2) + +Breaking Changes for 3.0.0: + +* Rename `RSpec::Mocks::Mock` to `RSpec::Mocks::Double`. (Myron Marston) +* Change how to integrate rspec-mocks in other test frameworks. You now + need to include `RSpec::Mocks::ExampleMethods` in your test context. + (Myron Marston) +* Prevent RSpec mocks' doubles and partial doubles from being used outside of + the per-test lifecycle (e.g. from a `before(:all)` hook). (Sam Phippen) +* Remove the `host` argument of `RSpec::Mocks.setup`. Instead + `RSpec::Mocks::ExampleMethods` should be included directly in the scope where + RSpec's mocking capabilities are used. (Sam Phippen) +* Make test doubles raise errors if you attempt to use them after they + get reset, to help surface issues when you accidentally retain + references to test doubles and attempt to reuse them in another + example. (Myron Marston) +* Remove support for `and_return { value }` and `and_return` without arguments. (Yuji Nakayama) + +Enhancements: + +* Add `receive_message_chain` which provides the functionality of the old + `stub_chain` for the new allow/expect syntax. Use it like so: `allow(...).to + receive_message_chain(:foo, :bar, :bazz)`. (Sam Phippen). +* Change argument matchers to use `===` as their primary matching + protocol, since their semantics mirror that of a case or rescue statement + (which uses `===` for matching). (Myron Marston) +* Add `RSpec::Mocks.with_temporary_scope`, which allows you to create + temporary rspec-mocks scopes in arbitrary places (such as a + `before(:all)` hook). (Myron Marston) +* Support keyword arguments when checking arity with verifying doubles. + (Xavier Shay) + +Bug Fixes: + +* Fix regression in 3.0.0.beta1 that caused `double("string_name" => :value)` + to stop working. (Xavier Shay) +* Fix the way rspec-mocks and rspec-core interact so that if users + define a `let` with the same name as one of the methods + from `RSpec::Mocks::ArgumentMatchers`, the user's `let` takes + precedence. (Michi Huber, Myron Marston) +* Fix verified doubles so that their methods match the visibility + (public, protected or private) of the interface they verify + against. (Myron Marston) +* Fix verified null object doubles so that they do not wrongly + report that they respond to anything. They only respond to methods + available on the interface they verify against. (Myron Marston) +* Fix deprecation warning for use of old `:should` syntax w/o explicit + config so that it no longer is silenced by an extension gem such + as rspec-rails when it calls `config.add_stub_and_should_receive_to`. + (Sam Phippen) +* Fix `expect` syntax so that it does not wrongly emit a "You're + overriding a previous implementation for this stub" warning when + you are not actually doing that. (Myron Marston) +* Fix `any_instance.unstub` when used on sub classes for whom the super + class has had `any_instance.stub` invoked on. (Jon Rowe) +* Fix regression in `stub_chain`/`receive_message_chain` that caused + it to raise an `ArgumentError` when passing args to the stubbed + methods. (Sam Phippen) +* Correct stub of undefined parent modules all the way down when stubbing a + nested constant. (Xavier Shay) +* Raise `VerifyingDoubleNotDefinedError` when a constant is not defined for + a verifying class double. (Maurício Linhares) +* Remove `Double#to_str`, which caused confusing `raise some_double` + behavior. (Maurício Linhares) + +### 3.0.0.beta1 / 2013-11-07 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.4...v3.0.0.beta1) + +Breaking Changes for 3.0.0: + +* Raise an explicit error if `should_not_receive(...).and_return` is used. (Sam + Phippen) +* Remove 1.8.6 workarounds. (Jon Rowe) +* Remove `stub!` and `unstub!`. (Sam Phippen) +* Remove `mock(name, methods)` and `stub(name, methods)`, leaving + `double(name, methods)` for creating test doubles. (Sam Phippen, Michi Huber) +* Remove `any_number_of_times` since `should_receive(:msg).any_number_of_times` + is really a stub in a mock's clothing. (Sam Phippen) +* Remove support for re-using the same null-object test double in multiple + examples. Test doubles are designed to only live for one example. + (Myron Marston) +* Make `at_least(0)` raise an error. (Sam Phippen) +* Remove support for `require 'spec/mocks'` which had been kept + in place for backwards compatibility with RSpec 1. (Myron Marston) +* Blocks provided to `with` are always used as implementation. (Xavier Shay) +* The config option (added in 2.99) to yield the receiver to + `any_instance` implementation blocks now defaults to "on". (Sam Phippen) + +Enhancements: + +* Allow the `have_received` matcher to use a block to set further expectations + on arguments. (Tim Cowlishaw) +* Provide `instance_double` and `class_double` to create verifying doubles, + ported from `rspec-fire`. (Xavier Shay) +* `as_null_object` on a verifying double only responds to defined methods. + (Xavier Shay) +* Provide `object_double` to create verified doubles of specific object + instances. (Xavier Shay) +* Provide `verify_partial_doubles` configuration that provides `object_double` + like verification behaviour on partial doubles. (Xavier Shay) +* Improved performance of double creation, particularly those with many + attributes. (Xavier Shay) +* Default value of `transfer_nested_constants` option for constant stubbing can + be configured. (Xavier Shay) +* Messages can be allowed or expected on in bulk via + `receive_messages(:message => :value)`. (Jon Rowe) +* `allow(Klass.any_instance)` and `expect(Klass.any_instance)` now print a + warning. This is usually a mistake, and users usually want + `allow_any_instance_of` or `expect_any_instance_of` instead. (Sam Phippen) +* `instance_double` and `class_double` raise `ArgumentError` if the underlying + module is loaded and the arity of the method being invoked does not match the + arity of the method as it is actually implemented. (Andy Lindeman) +* Spies can now check their invocation ordering is correct. (Jon Rowe) + +Deprecations: + +* Using the old `:should` syntax without explicitly configuring it + is deprecated. It will continue to work but will emit a deprecation + warning in RSpec 3 if you do not explicitly enable it. (Sam Phippen) + +Bug Fixes: + +* Fix `and_call_original` to handle a complex edge case involving + singleton class ancestors. (Marc-André Lafortune, Myron Marston) +* When generating an error message for unexpected arguments, + use `#inspect` rather than `#description` if `#description` + returns `nil` or `''` so that you still get a useful message. + (Nick DeLuca) + +### 2.99.4 / 2015-06-19 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.3...v2.99.4) + +Bug Fixes: + +* Add missing deprecation for using `with` with no arguments e.g. `with()`. (Yousuke, rspec/rspec-mocks#970) + +### 2.99.3 / 2015-01-09 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.2...v2.99.3) + +Bug Fixes: + +* Fix regression that caused an error when a test double was deserialized from YAML. (Yuji Nakayama, rspec/rspec-mocks#777) + +### 2.99.2 / 2014-07-21 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.1...v2.99.2) + +Enhancements: + +* Warn about upcoming change to `#===` matching and `DateTime#===` behaviour. + (Jon Rowe, rspec/rspec-mocks#735) + +### 2.99.1 / 2014-06-12 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0...v2.99.1) + +Bug Fixes: + +* Fix bug that caused errors at the end of each example + when a `double.as_null_object` had been frozen. (Yuji Nakayama, rspec/rspec-mocks#698) + +Deprecations: + +* Deprecate freezing a test double. (Yuji Nakayama, rspec/rspec-mocks#698) + +### 2.99.0 / 2014-06-01 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0.rc1...v2.99.0) + +No changes. Just taking it out of pre-release. + +### 2.99.0.rc1 / 2014-05-18 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0.beta2...v2.99.0.rc1) + +Deprecations: + +* Deprecate `RSpec::Mocks::TestDouble.extend_onto`. (Myron Marston) +* Deprecate `RSpec::Mocks::ConstantStubber`. (Jon Rowe) +* Deprecate `Marshal.dump` monkey-patch without opt-in. (Xavier Shay) + +### 2.99.0.beta2 / 2014-02-17 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0.beta1...v2.99.0.beta2) + +Deprecations: + +* Deprecate `RSpec::Mocks::Mock` in favor of `RSpec::Mocks::Double`. + (Myron Marston) +* Deprecate the `host` argument of `RSpec::Mocks.setup`. Instead + `RSpec::Mocks::ExampleMethods` should be included directly in the scope where + RSpec's mocking capabilities are used. (Sam Phippen) +* Deprecate using any of rspec-mocks' features outside the per-test + lifecycle (e.g. from a `before(:all)` hook). (Myron Marston) +* Deprecate re-using a test double in another example. (Myron Marston) +* Deprecate `and_return { value }` and `and_return` without arguments. (Yuji Nakayama) + +### 2.99.0.beta1 / 2013-11-07 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.4...v2.99.0.beta1) + +Deprecations + +* Expecting to use lambdas or other strong arity implementations for stub + methods with mis-matched arity is deprecated and support for them will be + removed in 3.0. Either provide the right amount of arguments or use a weak + arity implementation (methods with splats or procs). (Jon Rowe) +* Using the same test double instance in multiple examples is deprecated. Test + doubles are only meant to live for one example. The mocks and stubs have + always been reset between examples; however, in 2.x the `as_null_object` + state was not reset and some users relied on this to have a null object + double that is used for many examples. This behavior will be removed in 3.0. + (Myron Marston) +* Print a detailed warning when an `any_instance` implementation block is used + when the new `yield_receiver_to_any_instance_implementation_blocks` config + option is not explicitly set, as RSpec 3.0 will default to enabling this new + feature. (Sam Phippen) + +Enhancements: + +* Add a config option to yield the receiver to `any_instance` implementation + blocks. (Sam Phippen) + +### 2.14.6 / 2014-02-20 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.5...v2.14.6) + +Bug Fixes: + +* Ensure `any_instance` method stubs and expectations are torn down regardless of + expectation failures. (Sam Phippen) + +### 2.14.5 / 2014-02-01 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.4...v2.14.5) + +Bug Fixes: + +* Fix regression that caused block implementations to not receive all + args on 1.8.7 if the block also receives a block, due to Proc#arity + reporting `1` no matter how many args the block receives if it + receives a block, too. (Myron Marston) + +### 2.14.4 / 2013-10-15 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.3...v2.14.4) + +Bug Fixes: + +* Fix issue where unstubing methods on "any instances" would not + remove stubs on existing instances (Jon Rowe) +* Fix issue with receive(:message) do ... end precedence preventing + the usage of modifications (`and_return` etc) (Jon Rowe) + +### 2.14.3 / 2013-08-08 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.2...v2.14.3) + +Bug Fixes: + +* Fix stubbing some instance methods for classes whose hierarchy includes + a prepended Module (Bradley Schaefer) + +### 2.14.2 / 2013-07-30 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.1...v2.14.2) + +Bug Fixes: + +* Fix `as_null_object` doubles so that they return `nil` from `to_ary` + (Jon Rowe). +* Fix regression in 2.14 that made `stub!` (with an implicit receiver) + return a test double rather than stub a method (Myron Marston). + +### 2.14.1 / 2013-07-07 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.0...v2.14.1) + +Bug Fixes: + +* Restore `double.as_null_object` behavior from 2.13 and earlier: a + double's nullness persisted between examples in earlier examples. + While this is not an intended use case (test doubles are meant to live + for only one example), we don't want to break behavior users rely + on in a minor relase. This will be deprecated in 2.99 and removed + in 3.0. (Myron Marston) + +### 2.14.0 / 2013-07-06 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.0.rc1...v2.14.0) + +Enhancements: + +* Document test spies in the readme. (Adarsh Pandit) +* Add an `array_including` matcher. (Sam Phippen) +* Add a syntax-agnostic API for mocking or stubbing a method. This is + intended for use by libraries such as rspec-rails that need to mock + or stub a method, and work regardless of the syntax the user has + configured (Paul Annesley, Myron Marston and Sam Phippen). + +Bug Fixes: + +* Fix `double` so that it sets up passed stubs correctly regardless of + the configured syntax (Paul Annesley). +* Allow a block implementation to be used in combination with + `and_yield`, `and_raise`, `and_return` or `and_throw`. This got fixed + in 2.13.1 but failed to get merged into master for the 2.14.0.rc1 + release (Myron Marston). +* `Marshal.dump` does not unnecessarily duplicate objects when rspec-mocks has + not been fully initialized. This could cause errors when using `spork` or + similar preloading gems (Andy Lindeman). + +### 2.14.0.rc1 / 2013-05-27 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.13.0...v2.14.0.rc1) + +Enhancements: + +* Refactor internals so that the mock proxy methods and state are held + outside of the mocked object rather than inside it. This paves the way + for future syntax enhancements and removes the need for some hacky + work arounds for `any_instance` dup'ing and `YAML` serialization, + among other things. Note that the code now relies upon `__id__` + returning a unique, consistent value for any object you want to + mock or stub (Myron Marston). +* Add support for test spies. This allows you to verify a message + was received afterwards using the `have_received` matcher. + Note that you must first stub the method or use a null double. + (Joe Ferris and Joël Quenneville) +* Make `at_least` and `at_most` style receive expectations print that they were + expecting at least or at most some number of calls, rather than just the + number of calls given in the expectation (Sam Phippen) +* Make `with` style receive expectations print the args they were expecting, and + the args that they got (Sam Phippen) +* Fix some warnings seen under ruby 2.0.0p0 (Sam Phippen). +* Add a new `:expect` syntax for message expectations + (Myron Marston and Sam Phippen). + +Bug fixes + +* Fix `any_instance` so that a frozen object can be `dup`'d when methods + have been stubbed on that type using `any_instance` (Jon Rowe). +* Fix `and_call_original` so that it properly raises an `ArgumentError` + when the wrong number of args are passed (Jon Rowe). +* Fix `double` on 1.9.2 so you can wrap them in an Array + using `Array(my_double)` (Jon Rowe). +* Fix `stub_const` and `hide_const` to handle constants that redefine `send` + (Sam Phippen). +* Fix `Marshal.dump` extension so that it correctly handles nil. + (Luke Imhoff, Jon Rowe) +* Fix isolation of `allow_message_expectations_on_nil` (Jon Rowe) +* Use inspect to format actual arguments on expectations in failure messages (rspec/rspec-mocks#280, Ben Langfeld) +* Protect against improperly initialised test doubles (rspec/rspec-mocks#293) (Joseph Shraibman and Jon Rowe) + +Deprecations + +* Deprecate `stub` and `mock` as aliases for `double`. `double` is the + best term for creating a test double, and it reduces confusion to + have only one term (Michi Huber). +* Deprecate `stub!` and `unstub!` in favor of `stub` and `unstub` + (Jon Rowe). +* Deprecate `at_least(0).times` and `any_number_of_times` (Michi Huber). + +### 2.13.1 / 2013-04-06 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.13.0...v2.13.1) + +Bug fixes + +* Allow a block implementation to be used in combination with + `and_yield`, `and_raise`, `and_return` or `and_throw` (Myron Marston). + +### 2.13.0 / 2013-02-23 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.12.2...v2.13.0) + +Bug fixes + +* Fix bug that caused weird behavior when a method that had + previously been stubbed with multiple return values (e.g. + `obj.stub(:foo).and_return(1, 2)`) was later mocked with a + single return value (e.g. `obj.should_receive(:foo).once.and_return(1)`). + (Myron Marston) +* Fix bug related to a mock expectation for a method that already had + multiple stubs with different `with` constraints. Previously, the + first stub was used, even though it may not have matched the passed + args. The fix defers this decision until the message is received so + that the proper stub response can be chosen based on the passed + arguments (Myron Marston). +* Do not call `nil?` extra times on a mocked object, in case `nil?` + itself is expected a set number of times (Myron Marston). +* Fix `missing_default_stub_error` message so array args are handled + properly (Myron Marston). +* Explicitly disallow `any_instance.unstub!` (Ryan Jones). +* Fix `any_instance` stubbing so that it works with `Delegator` + subclasses (Myron Marston). +* Fix `and_call_original` so that it works with `Delegator` subclasses + (Myron Marston). +* Fix `any_instance.should_not_receive` when `any_instance.should_receive` + is used on the same class in the same example. Previously it would + wrongly report a failure even when the message was not received + (Myron Marston). + +### 2.12.2 / 2013-01-27 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.12.1...v.2.12.2) + +Bug fixes + +* Fix `and_call_original` to work properly for methods defined + on a module extended onto an object instance (Myron Marston). +* Fix `stub_const` with an undefined constnat name to work properly + with constant strings that are prefixed with `::` -- and edge case + I missed in the bug fix in the 2.12.1 release (Myron Marston). +* Ensure method visibility on a partial mock is restored after reseting + method stubs, even on a singleton module (created via `extend self`) + when the method visibility differs between the instance and singleton + versions (Andy Lindeman). + +### 2.12.1 / 2012-12-21 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.12.0...v2.12.1) + +Bug fixes + +* Fix `any_instance` to support `and_call_original`. + (Myron Marston) +* Properly restore stubbed aliased methods on rubies + that report the incorrect owner (Myron Marston and Andy Lindeman). +* Fix `hide_const` and `stub_const` with a defined constnat name to + work properly with constant strings that are prefixed with `::` (Myron Marston). + +### 2.12.0 / 2012-11-12 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.11.3...v2.12.0) + +Enhancements + +* `and_raise` can accept an exception class and message, more closely + matching `Kernel#raise` (e.g., `foo.stub(:bar).and_raise(RuntimeError, "message")`) + (Bas Vodde) +* Add `and_call_original`, which will delegate the message to the + original method (Myron Marston). + +Deprecations: + +* Add deprecation warning when using `and_return` with `should_not_receive` + (Neha Kumari) + +### 2.11.3 / 2012-09-19 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.11.2...v2.11.3) + +Bug fixes + +* Fix `:transfer_nested_constants` option of `stub_const` so that it + doesn't blow up when there are inherited constants. (Myron Marston) +* `any_instance` stubs can be used on classes that override `Object#method`. + (Andy Lindeman) +* Methods stubbed with `any_instance` are unstubbed after the test finishes. + (Andy Lindeman) +* Fix confusing error message when calling a mocked class method an + extra time with the wrong arguments (Myron Marston). + +### 2.11.2 / 2012-08-11 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.11.1...v2.11.2) + +Bug fixes + +* Don't modify `dup` on classes that don't support `dup` (David Chelimsky) +* Fix `any_instance` so that it works properly with methods defined on + a superclass. (Daniel Eguzkiza) +* Fix `stub_const` so that it works properly for nested constants that + share a name with a top-level constant (e.g. "MyGem::Hash"). (Myron + Marston) + +### 2.11.1 / 2012-07-09 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.11.0...v2.11.1) + +Bug fixes + +* Fix `should_receive` so that when it is called on an `as_null_object` + double with no implementation, and there is a previous explicit stub + for the same method, the explicit stub remains (rather than being + overridden with the null object implementation--`return self`). (Myron + Marston) + +### 2.11.0 / 2012-07-07 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.10.1...v2.11.0) + +Enhancements + +* Expose ArgumentListMatcher as a formal API + * supports use by 3rd party mock frameworks like Surrogate +* Add `stub_const` API to stub constants for the duration of an + example (Myron Marston). + +Bug fixes + +* Fix regression of edge case behavior. `double.should_receive(:foo) { a }` + was causing a NoMethodError when `double.stub(:foo).and_return(a, b)` + had been setup before (Myron Marston). +* Infinite loop generated by using `any_instance` and `dup`. (Sidu Ponnappa @kaiwren) +* `double.should_receive(:foo).at_least(:once).and_return(a)` always returns a + even if `:foo` is already stubbed. +* Prevent infinite loop when interpolating a null double into a string + as an integer (`"%i" % double.as_null_object`). (Myron Marston) +* Fix `should_receive` so that null object behavior (e.g. returning + self) is preserved if no implementation is given (Myron Marston). +* Fix `and_raise` so that it raises `RuntimeError` rather than + `Exception` by default, just like ruby does. (Andrew Marshall) + +### 2.10.1 / 2012-05-05 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.10.0...v2.10.1) + +Bug fixes + +* fix regression of edge case behavior + (https://github.com/rspec/rspec-mocks/issues/132) + * fixed failure of `object.should_receive(:message).at_least(0).times.and_return value` + * fixed failure of `object.should_not_receive(:message).and_return value` + +### 2.10.0 / 2012-05-03 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.9.0...v2.10.0) + +Bug fixes + +* fail fast when an `exactly` or `at_most` expectation is exceeded + +### 2.9.0 / 2012-03-17 +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.8.0...v2.9.0) + +Enhancements + +* Support order constraints across objects (preethiramdev) + +Bug fixes + +* Allow a `as_null_object` to be passed to `with` +* Pass proc to block passed to stub (Aubrey Rhodes) +* Initialize child message expectation args to match any args (rspec/rspec-mocks#109 - + preethiramdev) + +### 2.8.0 / 2012-01-04 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.8.0.rc2...v2.8.0) + +No changes for this release. Just releasing with the other rspec gems. + +### 2.8.0.rc2 / 2011-12-19 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.8.0.rc1...v2.8.0.rc2) + +No changes for this release. Just releasing with the other rspec gems. + +### 2.8.0.rc1 / 2011-11-06 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.7.0...v2.8.0.rc1) + +Enhancements + +* Eliminate Ruby warnings (Matijs van Zuijlen) + +### 2.7.0 / 2011-10-16 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.6.0...v2.7.0) + +Enhancements + +* Use `__send__` rather than `send` (alextk) +* Add support for `any_instance.stub_chain` (Sidu Ponnappa) +* Add support for `any_instance` argument matching based on `with` (Sidu + Ponnappa and Andy Lindeman) + +Changes + +* Check for `failure_message_for_should` or `failure_message` instead of + `description` to detect a matcher (Tibor Claassen) + +Bug fixes + +* pass a hash to `any_instance.stub`. (Justin Ko) +* allow `to_ary` to be called without raising `NoMethodError` (Mikhail + Dieterle) +* `any_instance` properly restores private methods (Sidu Ponnappa) + +### 2.6.0 / 2011-05-12 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.5.0...v2.6.0) + +Enhancements + +* Add support for `any_instance.stub` and `any_instance.should_receive` (Sidu + Ponnappa and Andy Lindeman) + +Bug fixes + +* fix bug in which multiple chains with shared messages ending in hashes failed + to return the correct value + +### 2.5.0 / 2011-02-05 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.4.0...v2.5.0) + +Bug fixes + +* message expectation counts now work in combination with a stub (Damian + Nurzynski) +* fix failure message when message received with incorrect args (Josep M. + Bach) + +### 2.4.0 / 2011-01-02 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.3.0...v2.4.0) + +No functional changes in this release, which was made to align with the +rspec-core-2.4.0 release. + +### 2.3.0 / 2010-12-12 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.2.0...v2.3.0) + +Bug fixes + +* Fix our Marshal extension so that it does not interfere with objects that + have their own `@mock_proxy` instance variable. (Myron Marston) + +### 2.2.0 / 2010-11-28 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.1.0...v2.2.0) + +Enhancements + +* Added "rspec/mocks/standalone" for exploring the rspec-mocks in irb. + +Bug fix + +* Eliminate warning on splat args without parens (Gioele Barabucci) +* Fix bug where `obj.should_receive(:foo).with(stub.as_null_object)` would pass + with a false positive. + +### 2.1.0 / 2010-11-07 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.0.1...v2.1.0) + +Bug fixes + +* Fix serialization of stubbed object (Josep M Bach) + +### 2.0.0 / 2010-10-10 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.0.0.beta.22...v2.0.0) + +### 2.0.0.rc / 2010-10-05 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.0.0.beta.22...v2.0.0.rc) + +Enhancements + +* support passing a block to an expectation block (Nicolas Braem) + * `obj.should_receive(:msg) {|&block| ... }` + +Bug fixes + +* Fix YAML serialization of stub (Myron Marston) +* Fix rdoc rake task (Hans de Graaff) + +### 2.0.0.beta.22 / 2010-09-12 + +[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.0.0.beta.20...v2.0.0.beta.22) + +Bug fixes + +* fixed regression that broke `obj.stub_chain(:a, :b => :c)` +* fixed regression that broke `obj.stub_chain(:a, :b) { :c }` +* `respond_to?` always returns true when using `as_null_object` diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/LICENSE.md b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/LICENSE.md new file mode 100644 index 0000000..dae02d8 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/LICENSE.md @@ -0,0 +1,25 @@ +The MIT License (MIT) +===================== + +* Copyright © 2012 David Chelimsky, Myron Marston +* Copyright © 2006 David Chelimsky, The RSpec Development Team +* Copyright © 2005 Steven Baker + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/README.md b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/README.md new file mode 100644 index 0000000..e569fee --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/README.md @@ -0,0 +1,465 @@ +# RSpec Mocks [![Build Status](https://github.com/rspec/rspec-mocks/workflows/RSpec%20CI/badge.svg)](https://github.com/rspec/rspec-mocks/actions) [![Code Climate](https://codeclimate.com/github/rspec/rspec-mocks.svg)](https://codeclimate.com/github/rspec/rspec-mocks) +rspec-mocks is a test-double framework for rspec with support for method stubs, +fakes, and message expectations on generated test-doubles and real objects +alike. + +## Install + + gem install rspec # for rspec-core, rspec-expectations, rspec-mocks + gem install rspec-mocks # for rspec-mocks only + +Want to run against the `main` branch? You'll need to include the dependent +RSpec repos as well. Add the following to your `Gemfile`: + +```ruby +%w[rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib| + gem lib, :git => "https://github.com/rspec/#{lib}.git", :branch => 'main' +end +``` +## Contributing + +Once you've set up the environment, you'll need to cd into the working +directory of whichever repo you want to work in. From there you can run the +specs and cucumber features, and make patches. + +NOTE: You do not need to use rspec-dev to work on a specific RSpec repo. You +can treat each RSpec repo as an independent project. + +For information about contributing to RSpec, please refer to the following markdown files: +* [Build details](BUILD_DETAIL.md) +* [Code of Conduct](CODE_OF_CONDUCT.md) +* [Detailed contributing guide](CONTRIBUTING.md) +* [Development setup guide](DEVELOPMENT.md) + +## Test Doubles + +A test double is an object that stands in for another object in your system +during a code example. Use the `double` method, passing in an optional identifier, to create one: + +```ruby +book = double("book") +``` + +Most of the time you will want some confidence that your doubles resemble an +existing object in your system. Verifying doubles are provided for this +purpose. If the existing object is available, they will prevent you from adding +stubs and expectations for methods that do not exist or that have an invalid +number of parameters. + +```ruby +book = instance_double("Book", :pages => 250) +``` + +Verifying doubles have some clever tricks to enable you to both test in +isolation without your dependencies loaded while still being able to validate +them against real objects. More detail is available in [their +documentation](https://github.com/rspec/rspec-mocks/blob/main/features/verifying_doubles). + +Verifying doubles can also accept custom identifiers, just like double(), e.g.: + +```ruby +books = [] +books << instance_double("Book", :rspec_book, :pages => 250) +books << instance_double("Book", "(Untitled)", :pages => 5000) + +puts books.inspect # with names, it's clearer which were actually added +``` + +## Method Stubs + +A method stub is an implementation that returns a pre-determined value. Method +stubs can be declared on test doubles or real objects using the same syntax. +rspec-mocks supports 3 forms for declaring method stubs: + +```ruby +allow(book).to receive(:title) { "The RSpec Book" } +allow(book).to receive(:title).and_return("The RSpec Book") +allow(book).to receive_messages( + :title => "The RSpec Book", + :subtitle => "Behaviour-Driven Development with RSpec, Cucumber, and Friends") +``` + +You can also use this shortcut, which creates a test double and declares a +method stub in one statement: + +```ruby +book = double("book", :title => "The RSpec Book") +``` + +The first argument is a name, which is used for documentation and appears in +failure messages. If you don't care about the name, you can leave it out, +making the combined instantiation/stub declaration very terse: + +```ruby +double(:foo => 'bar') +``` + +This is particularly nice when providing a list of test doubles to a method +that iterates through them: + +```ruby +order.calculate_total_price(double(:price => 1.99), double(:price => 2.99)) +``` + +### Stubbing a chain of methods + +You can use `receive_message_chain` in place of `receive` to stub a chain of messages: + +```ruby +allow(double).to receive_message_chain("foo.bar") { :baz } +allow(double).to receive_message_chain(:foo, :bar => :baz) +allow(double).to receive_message_chain(:foo, :bar) { :baz } + +# Given any of the above forms: +double.foo.bar # => :baz +``` + +Chains can be arbitrarily long, which makes it quite painless to violate the Law of Demeter in violent ways, so you should consider any use of `receive_message_chain` a code smell. Even though not all code smells indicate real problems (think fluent interfaces), `receive_message_chain` still results in brittle examples. For example, if you write `allow(foo).to receive_message_chain(:bar, :baz => 37)` in a spec and then the implementation calls `foo.baz.bar`, the stub will not work. + +## Consecutive return values + +When a stub might be invoked more than once, you can provide additional +arguments to `and_return`. The invocations cycle through the list. The last +value is returned for any subsequent invocations: + +```ruby +allow(die).to receive(:roll).and_return(1, 2, 3) +die.roll # => 1 +die.roll # => 2 +die.roll # => 3 +die.roll # => 3 +die.roll # => 3 +``` + +To return an array in a single invocation, declare an array: + +```ruby +allow(team).to receive(:players).and_return([double(:name => "David")]) +``` + +## Message Expectations + +A message expectation is an expectation that the test double will receive a +message some time before the example ends. If the message is received, the +expectation is satisfied. If not, the example fails. + +```ruby +validator = double("validator") +expect(validator).to receive(:validate) { "02134" } +zipcode = Zipcode.new("02134", validator) +zipcode.valid? +``` + +## Test Spies + +Verifies the given object received the expected message during the course of +the test. For a message to be verified, the given object must be setup to spy +on it, either by having it explicitly stubbed or by being a null object double +(e.g. `double(...).as_null_object`). Convenience methods are provided to easily +create null object doubles for this purpose: + +```ruby +spy("invitation") # => same as `double("invitation").as_null_object` +instance_spy("Invitation") # => same as `instance_double("Invitation").as_null_object` +class_spy("Invitation") # => same as `class_double("Invitation").as_null_object` +object_spy("Invitation") # => same as `object_double("Invitation").as_null_object` +``` + +Verifying messages received in this way implements the Test Spy pattern. + +```ruby +invitation = spy('invitation') + +user.accept_invitation(invitation) + +expect(invitation).to have_received(:accept) + +# You can also use other common message expectations. For example: +expect(invitation).to have_received(:accept).with(mailer) +expect(invitation).to have_received(:accept).twice +expect(invitation).to_not have_received(:accept).with(mailer) + +# One can specify a return value on the spy the same way one would a double. +invitation = spy('invitation', :accept => true) +expect(invitation).to have_received(:accept).with(mailer) +expect(invitation.accept).to eq(true) +``` + +Note that `have_received(...).with(...)` is unable to work properly when +passed arguments are mutated after the spy records the received message. +For example, this does not work properly: + +```ruby +greeter = spy("greeter") + +message = "Hello" +greeter.greet_with(message) +message << ", World" + +expect(greeter).to have_received(:greet_with).with("Hello") +``` + +## Nomenclature + +### Mock Objects and Test Stubs + +The names Mock Object and Test Stub suggest specialized Test Doubles. i.e. +a Test Stub is a Test Double that only supports method stubs, and a Mock +Object is a Test Double that supports message expectations and method +stubs. + +There is a lot of overlapping nomenclature here, and there are many +variations of these patterns (fakes, spies, etc). Keep in mind that most of +the time we're talking about method-level concepts that are variations of +method stubs and message expectations, and we're applying to them to _one_ +generic kind of object: a Test Double. + +### Test-Specific Extension + +a.k.a. Partial Double, a Test-Specific Extension is an extension of a +real object in a system that is instrumented with test-double like +behaviour in the context of a test. This technique is very common in Ruby +because we often see class objects acting as global namespaces for methods. +For example, in Rails: + +```ruby +person = double("person") +allow(Person).to receive(:find) { person } +``` + +In this case we're instrumenting Person to return the person object we've +defined whenever it receives the `find` message. We can also set a message +expectation so that the example fails if `find` is not called: + +```ruby +person = double("person") +expect(Person).to receive(:find) { person } +``` + +RSpec replaces the method we're stubbing or mocking with its own +test-double-like method. At the end of the example, RSpec verifies any message +expectations, and then restores the original methods. + +## Expecting Arguments + +```ruby +expect(double).to receive(:msg).with(*args) +expect(double).to_not receive(:msg).with(*args) +``` + +You can set multiple expectations for the same message if you need to: + +```ruby +expect(double).to receive(:msg).with("A", 1, 3) +expect(double).to receive(:msg).with("B", 2, 4) +``` + +## Argument Matchers + +Arguments that are passed to `with` are compared with actual arguments +received using ===. In cases in which you want to specify things about the +arguments rather than the arguments themselves, you can use any of the +matchers that ship with rspec-expectations. They don't all make syntactic +sense (they were primarily designed for use with RSpec::Expectations), but +you are free to create your own custom RSpec::Matchers. + +rspec-mocks also adds some keyword Symbols that you can use to +specify certain kinds of arguments: + +```ruby +expect(double).to receive(:msg).with(no_args) +expect(double).to receive(:msg).with(any_args) +expect(double).to receive(:msg).with(1, any_args) # any args acts like an arg splat and can go anywhere +expect(double).to receive(:msg).with(1, kind_of(Numeric), "b") #2nd argument can be any kind of Numeric +expect(double).to receive(:msg).with(1, boolean(), "b") #2nd argument can be true or false +expect(double).to receive(:msg).with(1, /abc/, "b") #2nd argument can be any String matching the submitted Regexp +expect(double).to receive(:msg).with(1, anything(), "b") #2nd argument can be anything at all +expect(double).to receive(:msg).with(1, duck_type(:abs, :div), "b") #2nd argument can be object that responds to #abs and #div +expect(double).to receive(:msg).with(hash_including(:a => 5)) # first arg is a hash with a: 5 as one of the key-values +expect(double).to receive(:msg).with(array_including(5)) # first arg is an array with 5 as one of the key-values +expect(double).to receive(:msg).with(hash_excluding(:a => 5)) # first arg is a hash without a: 5 as one of the key-values +expect(double).to receive(:msg).with(start_with('a')) # any matcher, custom or from rspec-expectations +expect(double).to receive(:msg).with(satisfy { |data| data.dig(:a, :b, :c) == 5 }) # assert anything you want +``` + +## Receive Counts + +```ruby +expect(double).to receive(:msg).once +expect(double).to receive(:msg).twice +expect(double).to receive(:msg).exactly(n).time +expect(double).to receive(:msg).exactly(n).times +expect(double).to receive(:msg).at_least(:once) +expect(double).to receive(:msg).at_least(:twice) +expect(double).to receive(:msg).at_least(n).time +expect(double).to receive(:msg).at_least(n).times +expect(double).to receive(:msg).at_most(:once) +expect(double).to receive(:msg).at_most(:twice) +expect(double).to receive(:msg).at_most(n).time +expect(double).to receive(:msg).at_most(n).times +``` + +## Ordering + +```ruby +expect(double).to receive(:msg).ordered +expect(double).to receive(:other_msg).ordered + # This will fail if the messages are received out of order +``` + +This can include the same message with different arguments: + +```ruby +expect(double).to receive(:msg).with("A", 1, 3).ordered +expect(double).to receive(:msg).with("B", 2, 4).ordered +``` + +## Setting Responses + +Whether you are setting a message expectation or a method stub, you can +tell the object precisely how to respond. The most generic way is to pass +a block to `receive`: + +```ruby +expect(double).to receive(:msg) { value } +``` + +When the double receives the `msg` message, it evaluates the block and returns +the result. + +```ruby +expect(double).to receive(:msg).and_return(value) +expect(double).to receive(:msg).exactly(3).times.and_return(value1, value2, value3) + # returns value1 the first time, value2 the second, etc +expect(double).to receive(:msg).and_raise(error) + # `error` can be an instantiated object (e.g. `StandardError.new(some_arg)`) or a class (e.g. `StandardError`) + # if it is a class, it must be instantiable with no args +expect(double).to receive(:msg).and_throw(:msg) +expect(double).to receive(:msg).and_yield(values, to, yield) +expect(double).to receive(:msg).and_yield(values, to, yield).and_yield(some, other, values, this, time) + # for methods that yield to a block multiple times +``` + +Any of these responses can be applied to a stub as well + +```ruby +allow(double).to receive(:msg).and_return(value) +allow(double).to receive(:msg).and_return(value1, value2, value3) +allow(double).to receive(:msg).and_raise(error) +allow(double).to receive(:msg).and_throw(:msg) +allow(double).to receive(:msg).and_yield(values, to, yield) +allow(double).to receive(:msg).and_yield(values, to, yield).and_yield(some, other, values, this, time) +``` + +## Arbitrary Handling + +Once in a while you'll find that the available expectations don't solve the +particular problem you are trying to solve. Imagine that you expect the message +to come with an Array argument that has a specific length, but you don't care +what is in it. You could do this: + +```ruby +expect(double).to receive(:msg) do |arg| + expect(arg.size).to eq 7 +end +``` + +If the method being stubbed itself takes a block, and you need to yield to it +in some special way, you can use this: + +```ruby +expect(double).to receive(:msg) do |&arg| + begin + arg.call + ensure + # cleanup + end +end +``` + +## Delegating to the Original Implementation + +When working with a partial mock object, you may occasionally +want to set a message expectation without interfering with how +the object responds to the message. You can use `and_call_original` +to achieve this: + +```ruby +expect(Person).to receive(:find).and_call_original +Person.find # => executes the original find method and returns the result +``` + +## Combining Expectation Details + +Combining the message name with specific arguments, receive counts and responses +you can get quite a bit of detail in your expectations: + +```ruby +expect(double).to receive(:<<).with("illegal value").once.and_raise(ArgumentError) +``` + +While this is a good thing when you really need it, you probably don't really +need it! Take care to specify only the things that matter to the behavior of +your code. + +## Stubbing and Hiding Constants + +See the [mutating constants +README](https://github.com/rspec/rspec-mocks/blob/main/features/mutating_constants/README.md) +for info on this feature. + +## Use `before(:example)`, not `before(:context)` + +Stubs in `before(:context)` are not supported. The reason is that all stubs and mocks get cleared out after each example, so any stub that is set in `before(:context)` would work in the first example that happens to run in that group, but not for any others. + +Instead of `before(:context)`, use `before(:example)`. + +## Settings mocks or stubs on any instance of a class + +rspec-mocks provides two methods, `allow_any_instance_of` and +`expect_any_instance_of`, that will allow you to stub or mock any instance +of a class. They are used in place of `allow` or `expect`: + +```ruby +allow_any_instance_of(Widget).to receive(:name).and_return("Wibble") +expect_any_instance_of(Widget).to receive(:name).and_return("Wobble") +``` + +These methods add the appropriate stub or expectation to all instances of +`Widget`. + +This feature is sometimes useful when working with legacy code, though in +general we discourage its use for a number of reasons: + +* The `rspec-mocks` API is designed for individual object instances, but this + feature operates on entire classes of objects. As a result there are some + semantically confusing edge cases. For example in + `expect_any_instance_of(Widget).to receive(:name).twice` it isn't clear + whether each specific instance is expected to receive `name` twice, or if two + receives total are expected. (It's the former.) +* Using this feature is often a design smell. It may be + that your test is trying to do too much or that the object under test is too + complex. +* It is the most complicated feature of `rspec-mocks`, and has historically + received the most bug reports. (None of the core team actively use it, + which doesn't help.) + + +## Further Reading + +There are many different viewpoints about the meaning of mocks and stubs. If +you are interested in learning more, here is some recommended reading: + +* Mock Objects: http://www.mockobjects.com/ +* Endo-Testing: http://www.ccs.neu.edu/research/demeter/related-work/extreme-programming/MockObjectsFinal.PDF +* Mock Roles, Not Objects: http://www.jmock.org/oopsla2004.pdf +* Test Double: http://www.martinfowler.com/bliki/TestDouble.html +* Test Double Patterns: http://xunitpatterns.com/Test%20Double%20Patterns.html +* Mocks aren't stubs: http://www.martinfowler.com/articles/mocksArentStubs.html + +## Also see + +* [https://github.com/rspec/rspec](https://github.com/rspec/rspec) +* [https://github.com/rspec/rspec-core](https://github.com/rspec/rspec-core) +* [https://github.com/rspec/rspec-expectations](https://github.com/rspec/rspec-expectations) +* [https://github.com/rspec/rspec-rails](https://github.com/rspec/rspec-rails) diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks.rb new file mode 100644 index 0000000..297779e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks.rb @@ -0,0 +1,133 @@ +require 'rspec/support' +RSpec::Support.require_rspec_support 'caller_filter' +RSpec::Support.require_rspec_support 'warnings' +RSpec::Support.require_rspec_support 'ruby_features' + +RSpec::Support.define_optimized_require_for_rspec(:mocks) { |f| require_relative f } + +%w[ + instance_method_stasher + method_double + argument_matchers + example_methods + proxy + test_double + argument_list_matcher + message_expectation + order_group + error_generator + space + mutate_const + targets + syntax + configuration + verifying_double + version +].each { |name| RSpec::Support.require_rspec_mocks name } + +# Share the top-level RSpec namespace, because we are a core supported +# extension. +module RSpec + # Contains top-level utility methods. While this contains a few + # public methods, these are not generally meant to be called from + # a test or example. They exist primarily for integration with + # test frameworks (such as rspec-core). + module Mocks + # Performs per-test/example setup. This should be called before + # an test or example begins. + def self.setup + @space_stack << (@space = space.new_scope) + end + + # Verifies any message expectations that were set during the + # test or example. This should be called at the end of an example. + def self.verify + space.verify_all + end + + # Cleans up all test double state (including any methods that were + # redefined on partial doubles). This _must_ be called after + # each example, even if an error was raised during the example. + def self.teardown + space.reset_all + @space_stack.pop + @space = @space_stack.last || @root_space + end + + # Adds an allowance (stub) on `subject` + # + # @param subject the subject to which the message will be added + # @param message a symbol, representing the message that will be + # added. + # @param opts a hash of options, :expected_from is used to set the + # original call site + # @yield an optional implementation for the allowance + # + # @example Defines the implementation of `foo` on `bar`, using the passed block + # x = 0 + # RSpec::Mocks.allow_message(bar, :foo) { x += 1 } + def self.allow_message(subject, message, opts={}, &block) + space.proxy_for(subject).add_stub(message, opts, &block) + end + + # Sets a message expectation on `subject`. + # @param subject the subject on which the message will be expected + # @param message a symbol, representing the message that will be + # expected. + # @param opts a hash of options, :expected_from is used to set the + # original call site + # @yield an optional implementation for the expectation + # + # @example Expect the message `foo` to receive `bar`, then call it + # RSpec::Mocks.expect_message(bar, :foo) + # bar.foo + def self.expect_message(subject, message, opts={}, &block) + space.proxy_for(subject).add_message_expectation(message, opts, &block) + end + + # Call the passed block and verify mocks after it has executed. This allows + # mock usage in arbitrary places, such as a `before(:all)` hook. + # + # @return [Object] the return value from the block + def self.with_temporary_scope + setup + + begin + result = yield + verify + result + ensure + teardown + end + end + + class << self + # @private + attr_reader :space + end + @space_stack = [] + @root_space = @space = RSpec::Mocks::RootSpace.new + + # @private + IGNORED_BACKTRACE_LINE = 'this backtrace line is ignored' + + # To speed up boot time a bit, delay loading optional or rarely + # used features until their first use. + autoload :AnyInstance, "rspec/mocks/any_instance" + autoload :ExpectChain, "rspec/mocks/message_chain" + autoload :StubChain, "rspec/mocks/message_chain" + autoload :MarshalExtension, "rspec/mocks/marshal_extension" + + # Namespace for mock-related matchers. + module Matchers + # @private + # just a "tag" for rspec-mock matchers detection + module Matcher; end + + autoload :HaveReceived, "rspec/mocks/matchers/have_received" + autoload :Receive, "rspec/mocks/matchers/receive" + autoload :ReceiveMessageChain, "rspec/mocks/matchers/receive_message_chain" + autoload :ReceiveMessages, "rspec/mocks/matchers/receive_messages" + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance.rb new file mode 100644 index 0000000..41eae81 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance.rb @@ -0,0 +1,11 @@ +%w[ + any_instance/chain + any_instance/error_generator + any_instance/stub_chain + any_instance/stub_chain_chain + any_instance/expect_chain_chain + any_instance/expectation_chain + any_instance/message_chains + any_instance/recorder + any_instance/proxy +].each { |f| RSpec::Support.require_rspec_mocks(f) } diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/chain.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/chain.rb new file mode 100644 index 0000000..74d864b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/chain.rb @@ -0,0 +1,111 @@ +module RSpec + module Mocks + # @private + module AnyInstance + # @private + class Chain + def initialize(recorder, *args, &block) + @recorder = recorder + @expectation_args = args + @expectation_block = block + @argument_list_matcher = ArgumentListMatcher::MATCH_ALL + end + + # @private + # + # Provides convenience methods for recording customizations on message + # expectations. + module Customizations + # @macro [attach] record + # @method $1(*args, &block) + # Records the `$1` message for playback against an instance that + # invokes a method stubbed or mocked using `any_instance`. + # + # @see RSpec::Mocks::MessageExpectation#$1 + # + def self.record(method_name) + define_method(method_name) do |*args, &block| + record(method_name, *args, &block) + end + end + + record :and_return + record :and_raise + record :and_throw + record :and_yield + record :and_call_original + record :and_wrap_original + record :with + record :once + record :twice + record :thrice + record :exactly + record :times + record :time + record :never + record :at_least + record :at_most + end + + include Customizations + + # @private + def playback!(instance) + message_expectation = create_message_expectation_on(instance) + messages.inject(message_expectation) do |object, message| + object.__send__(*message.first, &message.last) + end + end + + # @private + def constrained_to_any_of?(*constraints) + constraints.any? do |constraint| + messages.any? do |message| + message.first.first == constraint + end + end + end + + # @private + def matches_args?(*args) + @argument_list_matcher.args_match?(*args) + end + + # @private + def expectation_fulfilled! + @expectation_fulfilled = true + end + + def never + AnyInstance.error_generator.raise_double_negation_error("expect_any_instance_of(MyClass)") if negated? + super + end + + def with(*args, &block) + @argument_list_matcher = ArgumentListMatcher.new(*args) + super + end + + private + + def negated? + messages.any? { |(message, *_), _| message == :never } + end + + def messages + @messages ||= [] + end + + def last_message + messages.last.first.first unless messages.empty? + end + + def record(rspec_method_name, *args, &block) + verify_invocation_order(rspec_method_name, *args, &block) + messages << [args.unshift(rspec_method_name), block] + self + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/error_generator.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/error_generator.rb new file mode 100644 index 0000000..d1046cb --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/error_generator.rb @@ -0,0 +1,31 @@ +module RSpec + module Mocks + module AnyInstance + # @private + class ErrorGenerator < ::RSpec::Mocks::ErrorGenerator + def raise_second_instance_received_message_error(unfulfilled_expectations) + __raise "Exactly one instance should have received the following " \ + "message(s) but didn't: #{unfulfilled_expectations.sort.join(', ')}" + end + + def raise_does_not_implement_error(klass, method_name) + __raise "#{klass} does not implement ##{method_name}" + end + + def raise_message_already_received_by_other_instance_error(method_name, object_inspect, invoked_instance) + __raise "The message '#{method_name}' was received by #{object_inspect} " \ + "but has already been received by #{invoked_instance}" + end + + def raise_not_supported_with_prepend_error(method_name, problem_mod) + __raise "Using `any_instance` to stub a method (#{method_name}) that has been " \ + "defined on a prepended module (#{problem_mod}) is not supported." + end + end + + def self.error_generator + @error_generator ||= ErrorGenerator.new + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/expect_chain_chain.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/expect_chain_chain.rb new file mode 100644 index 0000000..c467ba9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/expect_chain_chain.rb @@ -0,0 +1,31 @@ +module RSpec + module Mocks + module AnyInstance + # @private + class ExpectChainChain < StubChain + def initialize(*args) + super + @expectation_fulfilled = false + end + + def expectation_fulfilled? + @expectation_fulfilled + end + + def playback!(instance) + super.tap { @expectation_fulfilled = true } + end + + private + + def create_message_expectation_on(instance) + ::RSpec::Mocks::ExpectChain.expect_chain_on(instance, *@expectation_args, &@expectation_block) + end + + def invocation_order + EmptyInvocationOrder + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/expectation_chain.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/expectation_chain.rb new file mode 100644 index 0000000..edf8548 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/expectation_chain.rb @@ -0,0 +1,50 @@ +module RSpec + module Mocks + module AnyInstance + # @private + class ExpectationChain < Chain + def expectation_fulfilled? + @expectation_fulfilled || constrained_to_any_of?(:never) + end + + def initialize(*args, &block) + @expectation_fulfilled = false + super + end + + private + + def verify_invocation_order(_rspec_method_name, *_args, &_block) + end + end + + # @private + class PositiveExpectationChain < ExpectationChain + private + + def create_message_expectation_on(instance) + proxy = ::RSpec::Mocks.space.proxy_for(instance) + method_name, opts = @expectation_args + opts = (opts || {}).merge(:expected_form => IGNORED_BACKTRACE_LINE) + + me = proxy.add_message_expectation(method_name, opts, &@expectation_block) + if RSpec::Mocks.configuration.yield_receiver_to_any_instance_implementation_blocks? + me.and_yield_receiver_to_implementation + end + + me + end + + ExpectationInvocationOrder = + { + :and_return => [:with, nil], + :and_raise => [:with, nil], + }.freeze + + def invocation_order + ExpectationInvocationOrder + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/message_chains.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/message_chains.rb new file mode 100644 index 0000000..7f4d770 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/message_chains.rb @@ -0,0 +1,83 @@ +module RSpec + module Mocks + module AnyInstance + # @private + class MessageChains + def initialize + @chains_by_method_name = Hash.new { |h, k| h[k] = [] } + end + + # @private + def [](method_name) + @chains_by_method_name[method_name] + end + + # @private + def add(method_name, chain) + @chains_by_method_name[method_name] << chain + chain + end + + # @private + def remove_stub_chains_for!(method_name) + @chains_by_method_name[method_name].reject! do |chain| + StubChain === chain + end + end + + # @private + def has_expectation?(method_name) + @chains_by_method_name[method_name].find do |chain| + ExpectationChain === chain + end + end + + # @private + def each_unfulfilled_expectation_matching(method_name, *args) + @chains_by_method_name[method_name].each do |chain| + yield chain if !chain.expectation_fulfilled? && chain.matches_args?(*args) + end + end + + # @private + def all_expectations_fulfilled? + @chains_by_method_name.all? do |_method_name, chains| + chains.all? { |chain| chain.expectation_fulfilled? } + end + end + + # @private + def unfulfilled_expectations + @chains_by_method_name.map do |method_name, chains| + method_name.to_s if ExpectationChain === chains.last && !chains.last.expectation_fulfilled? + end.compact + end + + # @private + def received_expected_message!(method_name) + @chains_by_method_name[method_name].each do |chain| + chain.expectation_fulfilled! + end + end + + # @private + def playback!(instance, method_name) + raise_if_second_instance_to_receive_message(instance) + @chains_by_method_name[method_name].each do |chain| + chain.playback!(instance) + end + end + + private + + def raise_if_second_instance_to_receive_message(instance) + @instance_with_expectation ||= instance if ExpectationChain === instance + return unless ExpectationChain === instance + return if @instance_with_expectation.equal?(instance) + + AnyInstance.error_generator.raise_second_instance_received_message_error(unfulfilled_expectations) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/proxy.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/proxy.rb new file mode 100644 index 0000000..54ded05 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/proxy.rb @@ -0,0 +1,125 @@ +module RSpec + module Mocks + module AnyInstance + # @private + # The `AnyInstance::Recorder` is responsible for redefining the klass's + # instance method in order to add any stubs/expectations the first time + # the method is called. It's not capable of updating a stub on an instance + # that's already been previously stubbed (either directly, or via + # `any_instance`). + # + # This proxy sits in front of the recorder and delegates both to it + # and to the `RSpec::Mocks::Proxy` for each already mocked or stubbed + # instance of the class, in order to propagates changes to the instances. + # + # Note that unlike `RSpec::Mocks::Proxy`, this proxy class is stateless + # and is not persisted in `RSpec::Mocks.space`. + # + # Proxying for the message expectation fluent interface (typically chained + # off of the return value of one of these methods) is provided by the + # `FluentInterfaceProxy` class below. + class Proxy + def initialize(recorder, target_proxies) + @recorder = recorder + @target_proxies = target_proxies + end + + def klass + @recorder.klass + end + + def stub(method_name_or_method_map, &block) + if Hash === method_name_or_method_map + method_name_or_method_map.each do |method_name, return_value| + stub(method_name).and_return(return_value) + end + else + perform_proxying(__method__, [method_name_or_method_map], block) do |proxy| + proxy.add_stub(method_name_or_method_map, &block) + end + end + end + + def unstub(method_name) + perform_proxying(__method__, [method_name], nil) do |proxy| + proxy.remove_stub_if_present(method_name) + end + end + + def stub_chain(*chain, &block) + perform_proxying(__method__, chain, block) do |proxy| + Mocks::StubChain.stub_chain_on(proxy.object, *chain, &block) + end + end + + def expect_chain(*chain, &block) + perform_proxying(__method__, chain, block) do |proxy| + Mocks::ExpectChain.expect_chain_on(proxy.object, *chain, &block) + end + end + + def should_receive(method_name, &block) + perform_proxying(__method__, [method_name], block) do |proxy| + # Yeah, this is a bit odd...but if we used `add_message_expectation` + # then it would act like `expect_every_instance_of(klass).to receive`. + # The any_instance recorder takes care of validating that an instance + # received the message. + proxy.add_stub(method_name, &block) + end + end + + def should_not_receive(method_name, &block) + perform_proxying(__method__, [method_name], block) do |proxy| + proxy.add_message_expectation(method_name, &block).never + end + end + + private + + def perform_proxying(method_name, args, block, &target_proxy_block) + recorder_value = @recorder.__send__(method_name, *args, &block) + proxy_values = @target_proxies.map(&target_proxy_block) + FluentInterfaceProxy.new([recorder_value] + proxy_values) + end + end + + unless defined?(BasicObject) + class BasicObject + # Remove all methods except those expected to be defined on BasicObject + (instance_methods.map(&:to_sym) - [:__send__, :"!", :instance_eval, :==, :instance_exec, :"!=", :equal?, :__id__, :__binding__, :object_id]).each do |method| + undef_method method + end + end + end + + # @private + # Delegates messages to each of the given targets in order to + # provide the fluent interface that is available off of message + # expectations when dealing with `any_instance`. + # + # `targets` will typically contain 1 of the `AnyInstance::Recorder` + # return values and N `MessageExpectation` instances (one per instance + # of the `any_instance` klass). + class FluentInterfaceProxy < BasicObject + def initialize(targets) + @targets = targets + end + + if ::RUBY_VERSION.to_f > 1.8 + def respond_to_missing?(method_name, include_private=false) + super || @targets.first.respond_to?(method_name, include_private) + end + else + def respond_to?(method_name, include_private=false) + super || @targets.first.respond_to?(method_name, include_private) + end + end + + def method_missing(*args, &block) + return_values = @targets.map { |t| t.__send__(*args, &block) } + FluentInterfaceProxy.new(return_values) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/recorder.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/recorder.rb new file mode 100644 index 0000000..0eb8245 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/recorder.rb @@ -0,0 +1,299 @@ +module RSpec + module Mocks + module AnyInstance + # Given a class `TheClass`, `TheClass.any_instance` returns a `Recorder`, + # which records stubs and message expectations for later playback on + # instances of `TheClass`. + # + # Further constraints are stored in instances of [Chain](Chain). + # + # @see AnyInstance + # @see Chain + class Recorder + # @private + attr_reader :message_chains, :stubs, :klass + + def initialize(klass) + @message_chains = MessageChains.new + @stubs = Hash.new { |hash, key| hash[key] = [] } + @observed_methods = [] + @played_methods = {} + @backed_up_method_owner = {} + @klass = klass + @expectation_set = false + + return unless RSpec::Mocks.configuration.verify_partial_doubles? + RSpec::Mocks.configuration.verifying_double_callbacks.each do |block| + block.call(ObjectReference.for(klass)) + end + end + + # Initializes the recording a stub to be played back against any + # instance of this object that invokes the submitted method. + # + # @see Methods#stub + def stub(method_name, &block) + observe!(method_name) + message_chains.add(method_name, StubChain.new(self, method_name, &block)) + end + + # Initializes the recording a stub chain to be played back against any + # instance of this object that invokes the method matching the first + # argument. + # + # @see Methods#stub_chain + def stub_chain(*method_names_and_optional_return_values, &block) + normalize_chain(*method_names_and_optional_return_values) do |method_name, args| + observe!(method_name) + message_chains.add(method_name, StubChainChain.new(self, *args, &block)) + end + end + + # @private + def expect_chain(*method_names_and_optional_return_values, &block) + @expectation_set = true + normalize_chain(*method_names_and_optional_return_values) do |method_name, args| + observe!(method_name) + message_chains.add(method_name, ExpectChainChain.new(self, *args, &block)) + end + end + + # Initializes the recording a message expectation to be played back + # against any instance of this object that invokes the submitted + # method. + # + # @see Methods#should_receive + def should_receive(method_name, &block) + @expectation_set = true + observe!(method_name) + message_chains.add(method_name, PositiveExpectationChain.new(self, method_name, &block)) + end + + # The opposite of `should_receive` + # + # @see Methods#should_not_receive + def should_not_receive(method_name, &block) + should_receive(method_name, &block).never + end + + # Removes any previously recorded stubs, stub_chains or message + # expectations that use `method_name`. + # + # @see Methods#unstub + def unstub(method_name) + unless @observed_methods.include?(method_name.to_sym) + AnyInstance.error_generator.raise_method_not_stubbed_error(method_name) + end + message_chains.remove_stub_chains_for!(method_name) + stubs[method_name].clear + stop_observing!(method_name) unless message_chains.has_expectation?(method_name) + end + + # @api private + # + # Used internally to verify that message expectations have been + # fulfilled. + def verify + return unless @expectation_set + return if message_chains.all_expectations_fulfilled? + + AnyInstance.error_generator.raise_second_instance_received_message_error(message_chains.unfulfilled_expectations) + end + + # @private + def stop_all_observation! + @observed_methods.each { |method_name| restore_method!(method_name) } + end + + # @private + def playback!(instance, method_name) + RSpec::Mocks.space.ensure_registered(instance) + message_chains.playback!(instance, method_name) + @played_methods[method_name] = instance + received_expected_message!(method_name) if message_chains.has_expectation?(method_name) + end + + # @private + def instance_that_received(method_name) + @played_methods[method_name] + end + + # @private + def build_alias_method_name(method_name) + "__#{method_name}_without_any_instance__" + end + + # @private + def already_observing?(method_name) + @observed_methods.include?(method_name) || super_class_observing?(method_name) + end + + # @private + def notify_received_message(_object, message, args, _blk) + has_expectation = false + + message_chains.each_unfulfilled_expectation_matching(message, *args) do |expectation| + has_expectation = true + expectation.expectation_fulfilled! + end + + return unless has_expectation + + restore_method!(message) + mark_invoked!(message) + end + + protected + + def stop_observing!(method_name) + restore_method!(method_name) + @observed_methods.delete(method_name) + super_class_observers_for(method_name).each do |ancestor| + ::RSpec::Mocks.space. + any_instance_recorder_for(ancestor).stop_observing!(method_name) + end + end + + private + + def ancestor_is_an_observer?(ancestor, method_name) + return if ancestor == @klass + + ::RSpec::Mocks.space. + any_instance_recorder_for(ancestor).already_observing?(method_name) + end + + def super_class_observers_for(method_name) + @klass.ancestors.select do |ancestor| + ancestor_is_an_observer?(ancestor, method_name) + end + end + + def super_class_observing?(method_name) + @klass.ancestors.any? do |ancestor| + ancestor_is_an_observer?(ancestor, method_name) + end + end + + def normalize_chain(*args) + args.shift.to_s.split('.').map { |s| s.to_sym }.reverse.each { |a| args.unshift a } + yield args.first, args + end + + def received_expected_message!(method_name) + message_chains.received_expected_message!(method_name) + restore_method!(method_name) + mark_invoked!(method_name) + end + + def restore_method!(method_name) + if public_protected_or_private_method_defined?(build_alias_method_name(method_name)) + restore_original_method!(method_name) + else + remove_dummy_method!(method_name) + end + end + + def restore_original_method!(method_name) + return unless @klass.instance_method(method_name).owner == @klass + + alias_method_name = build_alias_method_name(method_name) + @klass.class_exec(@backed_up_method_owner) do |backed_up_method_owner| + remove_method method_name + + # A @klass can have methods implemented (see Method#owner) in @klass + # or inherited from a superclass. In ruby 2.2 and earlier, we can copy + # a method regardless of the 'owner' and restore it to @klass after + # because a call to 'super' from @klass's copied method would end up + # calling the original class's superclass's method. + # + # With the commit below, available starting in 2.3.0, ruby changed + # this behavior and a call to 'super' from the method copied to @klass + # will call @klass's superclass method, which is the original + # implementer of this method! This leads to very strange errors + # if @klass's copied method calls 'super', since it would end up + # calling itself, the original method implemented in @klass's + # superclass. + # + # For ruby 2.3 and above, we need to only restore methods that + # @klass originally owned. + # + # https://github.com/ruby/ruby/commit/c8854d2ca4be9ee6946e6d17b0e17d9ef130ee81 + if RUBY_VERSION < "2.3" || backed_up_method_owner[method_name.to_sym] == self + alias_method method_name, alias_method_name + end + remove_method alias_method_name + end + end + + def remove_dummy_method!(method_name) + @klass.class_exec do + remove_method method_name + end + end + + def backup_method!(method_name) + return unless public_protected_or_private_method_defined?(method_name) + + alias_method_name = build_alias_method_name(method_name) + @backed_up_method_owner[method_name.to_sym] ||= @klass.instance_method(method_name).owner + @klass.class_exec do + alias_method alias_method_name, method_name + end + end + + def public_protected_or_private_method_defined?(method_name) + MethodReference.method_defined_at_any_visibility?(@klass, method_name) + end + + def observe!(method_name) + allow_no_prepended_module_definition_of(method_name) + + if RSpec::Mocks.configuration.verify_partial_doubles? && !Mocks.configuration.temporarily_suppress_partial_double_verification + unless public_protected_or_private_method_defined?(method_name) + AnyInstance.error_generator.raise_does_not_implement_error(@klass, method_name) + end + end + + stop_observing!(method_name) if already_observing?(method_name) + @observed_methods << method_name + backup_method!(method_name) + recorder = self + method_was_private = @klass.private_method_defined?(method_name) + @klass.__send__(:define_method, method_name) do |*args, &blk| + recorder.playback!(self, method_name) + __send__(method_name, *args, &blk) + end + @klass.__send__(:private, method_name) if method_was_private + @klass.__send__(:ruby2_keywords, method_name) if @klass.respond_to?(:ruby2_keywords, true) + end + + def mark_invoked!(method_name) + backup_method!(method_name) + recorder = self + @klass.__send__(:define_method, method_name) do |*_args, &_blk| + invoked_instance = recorder.instance_that_received(method_name) + inspect = "#<#{self.class}:#{object_id} #{instance_variables.map { |name| "#{name}=#{instance_variable_get name}" }.join(', ')}>" + AnyInstance.error_generator.raise_message_already_received_by_other_instance_error( + method_name, inspect, invoked_instance + ) + end + end + + if Support::RubyFeatures.module_prepends_supported? + def allow_no_prepended_module_definition_of(method_name) + prepended_modules = RSpec::Mocks::Proxy.prepended_modules_of(@klass) + problem_mod = prepended_modules.find { |mod| mod.method_defined?(method_name) } + return unless problem_mod + + AnyInstance.error_generator.raise_not_supported_with_prepend_error(method_name, problem_mod) + end + else + def allow_no_prepended_module_definition_of(_method_name) + # nothing to do; prepends aren't supported on this version of ruby + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/stub_chain.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/stub_chain.rb new file mode 100644 index 0000000..c4c0ab7 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/stub_chain.rb @@ -0,0 +1,51 @@ +module RSpec + module Mocks + module AnyInstance + # @private + class StubChain < Chain + # @private + def expectation_fulfilled? + true + end + + private + + def create_message_expectation_on(instance) + proxy = ::RSpec::Mocks.space.proxy_for(instance) + method_name, opts = @expectation_args + opts = (opts || {}).merge(:expected_form => IGNORED_BACKTRACE_LINE) + + stub = proxy.add_stub(method_name, opts, &@expectation_block) + @recorder.stubs[stub.message] << stub + + if RSpec::Mocks.configuration.yield_receiver_to_any_instance_implementation_blocks? + stub.and_yield_receiver_to_implementation + end + + stub + end + + InvocationOrder = + { + :and_return => [:with, nil], + :and_raise => [:with, nil], + :and_yield => [:with, :and_yield, nil], + :and_throw => [:with, nil], + :and_call_original => [:with, nil], + :and_wrap_original => [:with, nil] + }.freeze + + EmptyInvocationOrder = {}.freeze + + def invocation_order + InvocationOrder + end + + def verify_invocation_order(rspec_method_name, *_args, &_block) + return if invocation_order.fetch(rspec_method_name, [nil]).include?(last_message) + raise NoMethodError, "Undefined method #{rspec_method_name}" + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/stub_chain_chain.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/stub_chain_chain.rb new file mode 100644 index 0000000..495511c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/stub_chain_chain.rb @@ -0,0 +1,23 @@ +module RSpec + module Mocks + module AnyInstance + # @private + class StubChainChain < StubChain + def initialize(*args) + super + @expectation_fulfilled = false + end + + private + + def create_message_expectation_on(instance) + ::RSpec::Mocks::StubChain.stub_chain_on(instance, *@expectation_args, &@expectation_block) + end + + def invocation_order + EmptyInvocationOrder + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/argument_list_matcher.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/argument_list_matcher.rb new file mode 100644 index 0000000..f8adcd9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/argument_list_matcher.rb @@ -0,0 +1,117 @@ +# We intentionally do not use the `RSpec::Support.require...` methods +# here so that this file can be loaded individually, as documented +# below. +require 'rspec/mocks/argument_matchers' +require 'rspec/support/fuzzy_matcher' + +module RSpec + module Mocks + # Wrapper for matching arguments against a list of expected values. Used by + # the `with` method on a `MessageExpectation`: + # + # expect(object).to receive(:message).with(:a, 'b', 3) + # object.message(:a, 'b', 3) + # + # Values passed to `with` can be literal values or argument matchers that + # match against the real objects .e.g. + # + # expect(object).to receive(:message).with(hash_including(:a => 'b')) + # + # Can also be used directly to match the contents of any `Array`. This + # enables 3rd party mocking libs to take advantage of rspec's argument + # matching without using the rest of rspec-mocks. + # + # require 'rspec/mocks/argument_list_matcher' + # include RSpec::Mocks::ArgumentMatchers + # + # arg_list_matcher = RSpec::Mocks::ArgumentListMatcher.new(123, hash_including(:a => 'b')) + # arg_list_matcher.args_match?(123, :a => 'b') + # + # This class is immutable. + # + # @see ArgumentMatchers + class ArgumentListMatcher + # @private + attr_reader :expected_args + + # @api public + # @param [Array] expected_args a list of expected literals and/or argument matchers + # + # Initializes an `ArgumentListMatcher` with a collection of literal + # values and/or argument matchers. + # + # @see ArgumentMatchers + # @see #args_match? + def initialize(*expected_args) + @expected_args = expected_args + ensure_expected_args_valid! + end + ruby2_keywords :initialize if respond_to?(:ruby2_keywords, true) + + # @api public + # @param [Array] actual_args + # + # Matches each element in the `expected_args` against the element in the same + # position of the arguments passed to `new`. + # + # @see #initialize + def args_match?(*actual_args) + expected_args = resolve_expected_args_based_on(actual_args) + + return false if expected_args.size != actual_args.size + + if RUBY_VERSION >= "3" + # If the expectation was set with keywords, while the actual method was called with a positional hash argument, they don't match. + # If the expectation was set without keywords, e.g., with({a: 1}), then it fine to call it with either foo(a: 1) or foo({a: 1}). + # This corresponds to Ruby semantics, as if the method was def foo(options). + if Hash === expected_args.last && Hash === actual_args.last + if !Hash.ruby2_keywords_hash?(actual_args.last) && Hash.ruby2_keywords_hash?(expected_args.last) + return false + end + end + end + + Support::FuzzyMatcher.values_match?(expected_args, actual_args) + end + ruby2_keywords :args_match? if respond_to?(:ruby2_keywords, true) + + # @private + # Resolves abstract arg placeholders like `no_args` and `any_args` into + # a more concrete arg list based on the provided `actual_args`. + def resolve_expected_args_based_on(actual_args) + return [] if [ArgumentMatchers::NoArgsMatcher::INSTANCE] == expected_args + + any_args_index = expected_args.index { |a| ArgumentMatchers::AnyArgsMatcher::INSTANCE == a } + return expected_args unless any_args_index + + replace_any_args_with_splat_of_anything(any_args_index, actual_args.count) + end + + private + + def replace_any_args_with_splat_of_anything(before_count, actual_args_count) + any_args_count = actual_args_count - expected_args.count + 1 + after_count = expected_args.count - before_count - 1 + + any_args = 1.upto(any_args_count).map { ArgumentMatchers::AnyArgMatcher::INSTANCE } + expected_args.first(before_count) + any_args + expected_args.last(after_count) + end + + def ensure_expected_args_valid! + if expected_args.count { |a| ArgumentMatchers::AnyArgsMatcher::INSTANCE == a } > 1 + raise ArgumentError, "`any_args` can only be passed to " \ + "`with` once but you have passed it multiple times." + elsif expected_args.count > 1 && expected_args.any? { |a| ArgumentMatchers::NoArgsMatcher::INSTANCE == a } + raise ArgumentError, "`no_args` can only be passed as a " \ + "singleton argument to `with` (i.e. `with(no_args)`), " \ + "but you have passed additional arguments." + end + end + + # Value that will match all argument lists. + # + # @private + MATCH_ALL = new(ArgumentMatchers::AnyArgsMatcher::INSTANCE) + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/argument_matchers.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/argument_matchers.rb new file mode 100644 index 0000000..5452508 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/argument_matchers.rb @@ -0,0 +1,366 @@ +# This cannot take advantage of our relative requires, since this file is a +# dependency of `rspec/mocks/argument_list_matcher.rb`. See comment there for +# details. +require 'rspec/support/matcher_definition' + +module RSpec + module Mocks + # ArgumentMatchers are placeholders that you can include in message + # expectations to match arguments against a broader check than simple + # equality. + # + # With the exception of `any_args` and `no_args`, they all match against + # the arg in same position in the argument list. + # + # @see ArgumentListMatcher + module ArgumentMatchers + # Acts like an arg splat, matching any number of args at any point in an arg list. + # + # @example + # expect(object).to receive(:message).with(1, 2, any_args) + # + # # matches any of these: + # object.message(1, 2) + # object.message(1, 2, 3) + # object.message(1, 2, 3, 4) + def any_args + AnyArgsMatcher::INSTANCE + end + + # Matches any argument at all. + # + # @example + # expect(object).to receive(:message).with(anything) + def anything + AnyArgMatcher::INSTANCE + end + + # Matches no arguments. + # + # @example + # expect(object).to receive(:message).with(no_args) + def no_args + NoArgsMatcher::INSTANCE + end + + # Matches if the actual argument responds to the specified messages. + # + # @example + # expect(object).to receive(:message).with(duck_type(:hello)) + # expect(object).to receive(:message).with(duck_type(:hello, :goodbye)) + def duck_type(*args) + DuckTypeMatcher.new(*args) + end + + # Matches a boolean value. + # + # @example + # expect(object).to receive(:message).with(boolean()) + def boolean + BooleanMatcher::INSTANCE + end + + # Matches a hash that includes the specified key(s) or key/value pairs. + # Ignores any additional keys. + # + # @example + # expect(object).to receive(:message).with(hash_including(:key => val)) + # expect(object).to receive(:message).with(hash_including(:key)) + # expect(object).to receive(:message).with(hash_including(:key, :key2 => val2)) + def hash_including(*args) + HashIncludingMatcher.new(ArgumentMatchers.anythingize_lonely_keys(*args)) + end + + # Matches a hash that doesn't include the specified key(s) or key/value. + # + # @example + # expect(object).to receive(:message).with(hash_excluding(:key => val)) + # expect(object).to receive(:message).with(hash_excluding(:key)) + # expect(object).to receive(:message).with(hash_excluding(:key, :key2 => :val2)) + def hash_excluding(*args) + HashExcludingMatcher.new(ArgumentMatchers.anythingize_lonely_keys(*args)) + end + + # Matches an array that includes the specified items at least once. + # Ignores duplicates and additional values + # + # @example + # expect(object).to receive(:message).with(array_including(1,2,3)) + # expect(object).to receive(:message).with(array_including([1,2,3])) + def array_including(*args) + actually_an_array = Array === args.first && args.count == 1 ? args.first : args + ArrayIncludingMatcher.new(actually_an_array) + end + + # Matches an array that excludes the specified items. + # + # @example + # expect(object).to receive(:message).with(array_excluding(1,2,3)) + # expect(object).to receive(:message).with(array_excluding([1,2,3])) + def array_excluding(*args) + actually_an_array = Array === args.first && args.count == 1 ? args.first : args + ArrayExcludingMatcher.new(actually_an_array) + end + + alias_method :hash_not_including, :hash_excluding + + # Matches if `arg.instance_of?(klass)` + # + # @example + # expect(object).to receive(:message).with(instance_of(Thing)) + def instance_of(klass) + InstanceOf.new(klass) + end + + alias_method :an_instance_of, :instance_of + + # Matches if `arg.kind_of?(klass)` + # + # @example + # expect(object).to receive(:message).with(kind_of(Thing)) + def kind_of(klass) + KindOf.new(klass) + end + + alias_method :a_kind_of, :kind_of + + # @private + def self.anythingize_lonely_keys(*args) + hash = Hash === args.last ? args.delete_at(-1) : {} + args.each { | arg | hash[arg] = AnyArgMatcher::INSTANCE } + hash + end + + # Intended to be subclassed by stateless, immutable argument matchers. + # Provides a `::INSTANCE` constant for accessing a global + # singleton instance of the matcher. There is no need to construct + # multiple instance since there is no state. It also facilities the + # special case logic we need for some of these matchers, by making it + # easy to do comparisons like: `[klass::INSTANCE] == args` rather than + # `args.count == 1 && klass === args.first`. + # + # @private + class SingletonMatcher + private_class_method :new + + def self.inherited(subklass) + subklass.const_set(:INSTANCE, subklass.send(:new)) + end + end + + # @private + class AnyArgsMatcher < SingletonMatcher + def description + "*(any args)" + end + end + + # @private + class AnyArgMatcher < SingletonMatcher + def ===(_other) + true + end + + def description + "anything" + end + end + + # @private + class NoArgsMatcher < SingletonMatcher + def description + "no args" + end + end + + # @private + class BooleanMatcher < SingletonMatcher + def ===(value) + true == value || false == value + end + + def description + "boolean" + end + end + + # @private + class BaseHashMatcher + def initialize(expected) + @expected = expected + end + + def ===(predicate, actual) + @expected.__send__(predicate) do |k, v| + actual.key?(k) && Support::FuzzyMatcher.values_match?(v, actual[k]) + end + rescue NoMethodError + false + end + + def description(name) + "#{name}(#{formatted_expected_hash.inspect.sub(/^\{/, "").sub(/\}$/, "")})" + end + + private + + def formatted_expected_hash + Hash[ + @expected.map do |k, v| + k = RSpec::Support.rspec_description_for_object(k) + v = RSpec::Support.rspec_description_for_object(v) + + [k, v] + end + ] + end + end + + # @private + class HashIncludingMatcher < BaseHashMatcher + def ===(actual) + super(:all?, actual) + end + + def description + super("hash_including") + end + end + + # @private + class HashExcludingMatcher < BaseHashMatcher + def ===(actual) + super(:none?, actual) + end + + def description + super("hash_not_including") + end + end + + # @private + class ArrayIncludingMatcher + def initialize(expected) + @expected = expected + end + + def ===(actual) + actual = actual.uniq + return true if (actual & @expected).count >= @expected.count + + @expected.uniq.all? do |expected_element| + actual.any? do |actual_element| + RSpec::Support::FuzzyMatcher.values_match?(expected_element, actual_element) + end + end + rescue NoMethodError + false + end + + def description + "array_including(#{formatted_expected_values})" + end + + private + + def formatted_expected_values + @expected.map do |x| + RSpec::Support.rspec_description_for_object(x) + end.join(", ") + end + end + + # @private + class ArrayExcludingMatcher + def initialize(unexpected) + @unexpected = unexpected.uniq + end + + def ===(actual) + actual = actual.uniq + return false unless (actual & @unexpected).empty? + + actual.none? do |actual_element| + @unexpected.any? do |unexpected_element| + RSpec::Support::FuzzyMatcher.values_match?(unexpected_element, actual_element) + end + end + rescue NoMethodError + false + end + + def description + "array_excluding(#{formatted_unexpected_values})" + end + + private + + def formatted_unexpected_values + @unexpected.map do |x| + RSpec::Support.rspec_description_for_object(x) + end.join(", ") + end + end + + # @private + class DuckTypeMatcher + def initialize(*methods_to_respond_to) + @methods_to_respond_to = methods_to_respond_to + end + + def ===(value) + @methods_to_respond_to.all? { |message| value.respond_to?(message) } + end + + def description + "duck_type(#{@methods_to_respond_to.map(&:inspect).join(', ')})" + end + end + + # @private + class InstanceOf + def initialize(klass) + @klass = klass + end + + def ===(actual) + actual.instance_of?(@klass) + end + + def description + "an_instance_of(#{@klass.name})" + end + end + + # @private + class KindOf + def initialize(klass) + @klass = klass + end + + def ===(actual) + actual.kind_of?(@klass) + end + + def description + "kind of #{@klass.name}" + end + end + + matcher_namespace = name + '::' + ::RSpec::Support.register_matcher_definition do |object| + # This is the best we have for now. We should tag all of our matchers + # with a module or something so we can test for it directly. + # + # (Note Module#parent in ActiveSupport is defined in a similar way.) + begin + object.class.name.include?(matcher_namespace) + rescue NoMethodError + # Some objects, like BasicObject, don't implement standard + # reflection methods. + false + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/configuration.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/configuration.rb new file mode 100644 index 0000000..8496bdc --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/configuration.rb @@ -0,0 +1,212 @@ +module RSpec + module Mocks + # Provides configuration options for rspec-mocks. + class Configuration + def initialize + @allow_message_expectations_on_nil = nil + @yield_receiver_to_any_instance_implementation_blocks = true + @verify_doubled_constant_names = false + @transfer_nested_constants = false + @verify_partial_doubles = false + @temporarily_suppress_partial_double_verification = false + @color = false + end + + # Sets whether RSpec will warn, ignore, or fail a test when + # expectations are set on nil. + # By default, when this flag is not set, warning messages are issued when + # expectations are set on nil. This is to prevent false-positives and to + # catch potential bugs early on. + # When set to `true`, warning messages are suppressed. + # When set to `false`, it will raise an error. + # + # @example + # RSpec.configure do |config| + # config.mock_with :rspec do |mocks| + # mocks.allow_message_expectations_on_nil = false + # end + # end + attr_accessor :allow_message_expectations_on_nil + + def yield_receiver_to_any_instance_implementation_blocks? + @yield_receiver_to_any_instance_implementation_blocks + end + + # Sets whether or not RSpec will yield the receiving instance of a + # message to blocks that are used for any_instance stub implementations. + # When set, the first yielded argument will be the receiving instance. + # Defaults to `true`. + # + # @example + # RSpec.configure do |rspec| + # rspec.mock_with :rspec do |mocks| + # mocks.yield_receiver_to_any_instance_implementation_blocks = false + # end + # end + attr_writer :yield_receiver_to_any_instance_implementation_blocks + + # Adds `stub` and `should_receive` to the given + # modules or classes. This is usually only necessary + # if you application uses some proxy classes that + # "strip themselves down" to a bare minimum set of + # methods and remove `stub` and `should_receive` in + # the process. + # + # @example + # RSpec.configure do |rspec| + # rspec.mock_with :rspec do |mocks| + # mocks.add_stub_and_should_receive_to Delegator + # end + # end + # + def add_stub_and_should_receive_to(*modules) + modules.each do |mod| + Syntax.enable_should(mod) + end + end + + # Provides the ability to set either `expect`, + # `should` or both syntaxes. RSpec uses `expect` + # syntax by default. This is needed if you want to + # explicitly enable `should` syntax and/or explicitly + # disable `expect` syntax. + # + # @example + # RSpec.configure do |rspec| + # rspec.mock_with :rspec do |mocks| + # mocks.syntax = [:expect, :should] + # end + # end + # + def syntax=(*values) + syntaxes = values.flatten + if syntaxes.include?(:expect) + Syntax.enable_expect + else + Syntax.disable_expect + end + + if syntaxes.include?(:should) + Syntax.enable_should + else + Syntax.disable_should + end + end + + # Returns an array with a list of syntaxes + # that are enabled. + # + # @example + # unless RSpec::Mocks.configuration.syntax.include?(:expect) + # raise "this RSpec extension gem requires the rspec-mocks `:expect` syntax" + # end + # + def syntax + syntaxes = [] + syntaxes << :should if Syntax.should_enabled? + syntaxes << :expect if Syntax.expect_enabled? + syntaxes + end + + def verify_doubled_constant_names? + !!@verify_doubled_constant_names + end + + # When this is set to true, an error will be raised when + # `instance_double` or `class_double` is given the name of an undefined + # constant. You probably only want to set this when running your entire + # test suite, with all production code loaded. Setting this for an + # isolated unit test will prevent you from being able to isolate it! + attr_writer :verify_doubled_constant_names + + # Provides a way to perform customisations when verifying doubles. + # + # @example + # RSpec::Mocks.configuration.before_verifying_doubles do |ref| + # ref.some_method! + # end + def before_verifying_doubles(&block) + verifying_double_callbacks << block + end + alias :when_declaring_verifying_double :before_verifying_doubles + + # @api private + # Returns an array of blocks to call when verifying doubles + def verifying_double_callbacks + @verifying_double_callbacks ||= [] + end + + def transfer_nested_constants? + !!@transfer_nested_constants + end + + # Sets the default for the `transfer_nested_constants` option when + # stubbing constants. + attr_writer :transfer_nested_constants + + # When set to true, partial mocks will be verified the same as object + # doubles. Any stubs will have their arguments checked against the original + # method, and methods that do not exist cannot be stubbed. + def verify_partial_doubles=(val) + @verify_partial_doubles = !!val + end + + def verify_partial_doubles? + @verify_partial_doubles + end + + # @private + # Used to track whether we are temporarily suppressing verifying partial + # doubles with `without_partial_double_verification { ... }` + attr_accessor :temporarily_suppress_partial_double_verification + + if ::RSpec.respond_to?(:configuration) + def color? + ::RSpec.configuration.color_enabled? + end + else + # Indicates whether or not diffs should be colored. + # Delegates to rspec-core's color option if rspec-core + # is loaded; otherwise you can set it here. + attr_writer :color + + # Indicates whether or not diffs should be colored. + # Delegates to rspec-core's color option if rspec-core + # is loaded; otherwise you can set it here. + def color? + @color + end + end + + # Monkey-patch `Marshal.dump` to enable dumping of mocked or stubbed + # objects. By default this will not work since RSpec mocks works by + # adding singleton methods that cannot be serialized. This patch removes + # these singleton methods before serialization. Setting to falsey removes + # the patch. + # + # This method is idempotent. + def patch_marshal_to_support_partial_doubles=(val) + if val + RSpec::Mocks::MarshalExtension.patch! + else + RSpec::Mocks::MarshalExtension.unpatch! + end + end + + # @api private + # Resets the configured syntax to the default. + def reset_syntaxes_to_default + self.syntax = [:should, :expect] + RSpec::Mocks::Syntax.warn_about_should! + end + end + + # Mocks specific configuration, as distinct from `RSpec.configuration` + # which is core RSpec configuration. + def self.configuration + @configuration ||= Configuration.new + end + + configuration.reset_syntaxes_to_default + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/error_generator.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/error_generator.rb new file mode 100644 index 0000000..8e7e2c1 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/error_generator.rb @@ -0,0 +1,390 @@ +RSpec::Support.require_rspec_support "object_formatter" + +module RSpec + module Mocks + # Raised when a message expectation is not satisfied. + MockExpectationError = Class.new(Exception) + + # Raised when a test double is used after it has been torn + # down (typically at the end of an rspec-core example). + ExpiredTestDoubleError = Class.new(MockExpectationError) + + # Raised when doubles or partial doubles are used outside of the per-test lifecycle. + OutsideOfExampleError = Class.new(StandardError) + + # Raised when an expectation customization method (e.g. `with`, + # `and_return`) is called on a message expectation which has already been + # invoked. + MockExpectationAlreadyInvokedError = Class.new(Exception) + + # Raised for situations that RSpec cannot support due to mutations made + # externally on arguments that RSpec is holding onto to use for later + # comparisons. + # + # @deprecated We no longer raise this error but the constant remains until + # RSpec 4 for SemVer reasons. + CannotSupportArgMutationsError = Class.new(StandardError) + + # @private + UnsupportedMatcherError = Class.new(StandardError) + # @private + NegationUnsupportedError = Class.new(StandardError) + # @private + VerifyingDoubleNotDefinedError = Class.new(StandardError) + + # @private + class ErrorGenerator + attr_writer :opts + + def initialize(target=nil) + @target = target + end + + # @private + def opts + @opts ||= {} + end + + # @private + def raise_unexpected_message_error(message, args) + __raise "#{intro} received unexpected message :#{message} with #{format_args(args)}" + end + + # @private + def raise_unexpected_message_args_error(expectation, args_for_multiple_calls, source_id=nil) + __raise error_message(expectation, args_for_multiple_calls), nil, source_id + end + + # @private + def raise_missing_default_stub_error(expectation, args_for_multiple_calls) + __raise( + error_message(expectation, args_for_multiple_calls) + + "\n Please stub a default value first if message might be received with other args as well. \n" + ) + end + + # @private + def raise_similar_message_args_error(expectation, args_for_multiple_calls, backtrace_line=nil) + __raise error_message(expectation, args_for_multiple_calls), backtrace_line + end + + def default_error_message(expectation, expected_args, actual_args) + "#{intro} received #{expectation.message.inspect} #{unexpected_arguments_message(expected_args, actual_args)}".dup + end + + # rubocop:disable Metrics/ParameterLists + # @private + def raise_expectation_error(message, expected_received_count, argument_list_matcher, + actual_received_count, expectation_count_type, args, + backtrace_line=nil, source_id=nil) + expected_part = expected_part_of_expectation_error(expected_received_count, expectation_count_type, argument_list_matcher) + received_part = received_part_of_expectation_error(actual_received_count, args) + __raise "(#{intro(:unwrapped)}).#{message}#{format_args(args)}\n #{expected_part}\n #{received_part}", backtrace_line, source_id + end + # rubocop:enable Metrics/ParameterLists + + # @private + def raise_unimplemented_error(doubled_module, method_name, object) + message = case object + when InstanceVerifyingDouble + "the %s class does not implement the instance method: %s".dup << + if ObjectMethodReference.for(doubled_module, method_name).implemented? + ". Perhaps you meant to use `class_double` instead?" + else + "" + end + when ClassVerifyingDouble + "the %s class does not implement the class method: %s".dup << + if InstanceMethodReference.for(doubled_module, method_name).implemented? + ". Perhaps you meant to use `instance_double` instead?" + else + "" + end + else + "%s does not implement: %s" + end + + __raise message % [doubled_module.description, method_name] + end + + # @private + def raise_non_public_error(method_name, visibility) + raise NoMethodError, "%s method `%s' called on %s" % [ + visibility, method_name, intro + ] + end + + # @private + def raise_invalid_arguments_error(verifier) + __raise verifier.error_message + end + + # @private + def raise_expired_test_double_error + raise ExpiredTestDoubleError, + "#{intro} was originally created in one example but has leaked into " \ + "another example and can no longer be used. rspec-mocks' doubles are " \ + "designed to only last for one example, and you need to create a new " \ + "one in each example you wish to use it for." + end + + # @private + def describe_expectation(verb, message, expected_received_count, _actual_received_count, args) + "#{verb} #{message}#{format_args(args)} #{count_message(expected_received_count)}" + end + + # @private + def raise_out_of_order_error(message) + __raise "#{intro} received :#{message} out of order" + end + + # @private + def raise_missing_block_error(args_to_yield) + __raise "#{intro} asked to yield |#{arg_list(args_to_yield)}| but no block was passed" + end + + # @private + def raise_wrong_arity_error(args_to_yield, signature) + __raise "#{intro} yielded |#{arg_list(args_to_yield)}| to block with #{signature.description}" + end + + # @private + def raise_only_valid_on_a_partial_double(method) + __raise "#{intro} is a pure test double. `#{method}` is only " \ + "available on a partial double." + end + + # @private + def raise_expectation_on_unstubbed_method(method) + __raise "#{intro} expected to have received #{method}, but that " \ + "object is not a spy or method has not been stubbed." + end + + # @private + def raise_expectation_on_mocked_method(method) + __raise "#{intro} expected to have received #{method}, but that " \ + "method has been mocked instead of stubbed or spied." + end + + # @private + def raise_double_negation_error(wrapped_expression) + __raise "Isn't life confusing enough? You've already set a " \ + "negative message expectation and now you are trying to " \ + "negate it again with `never`. What does an expression like " \ + "`#{wrapped_expression}.not_to receive(:msg).never` even mean?" + end + + # @private + def raise_verifying_double_not_defined_error(ref) + notify(VerifyingDoubleNotDefinedError.new( + "#{ref.description.inspect} is not a defined constant. " \ + "Perhaps you misspelt it? " \ + "Disable check with `verify_doubled_constant_names` configuration option." + )) + end + + # @private + def raise_have_received_disallowed(type, reason) + __raise "Using #{type}(...) with the `have_received` " \ + "matcher is not supported#{reason}." + end + + # @private + def raise_cant_constrain_count_for_negated_have_received_error(count_constraint) + __raise "can't use #{count_constraint} when negative" + end + + # @private + def raise_method_not_stubbed_error(method_name) + __raise "The method `#{method_name}` was not stubbed or was already unstubbed" + end + + # @private + def raise_already_invoked_error(message, calling_customization) + error_message = "The message expectation for #{intro}.#{message} has already been invoked " \ + "and cannot be modified further (e.g. using `#{calling_customization}`). All message expectation " \ + "customizations must be applied before it is used for the first time." + + notify MockExpectationAlreadyInvokedError.new(error_message) + end + + def raise_expectation_on_nil_error(method_name) + __raise expectation_on_nil_message(method_name) + end + + def expectation_on_nil_message(method_name) + "An expectation of `:#{method_name}` was set on `nil`. " \ + "To allow expectations on `nil` and suppress this message, set `RSpec::Mocks.configuration.allow_message_expectations_on_nil` to `true`. " \ + "To disallow expectations on `nil`, set `RSpec::Mocks.configuration.allow_message_expectations_on_nil` to `false`" + end + + # @private + def intro(unwrapped=false) + case @target + when TestDouble then TestDoubleFormatter.format(@target, unwrapped) + when Class then + formatted = "#{@target.inspect} (class)" + return formatted if unwrapped + "#<#{formatted}>" + when NilClass then "nil" + else @target.inspect + end + end + + # @private + def method_call_args_description(args, generic_prefix=" with arguments: ", matcher_prefix=" with ") + case args.first + when ArgumentMatchers::AnyArgsMatcher then "#{matcher_prefix}any arguments" + when ArgumentMatchers::NoArgsMatcher then "#{matcher_prefix}no arguments" + else + if yield + "#{generic_prefix}#{format_args(args)}" + else + "" + end + end + end + + private + + def received_part_of_expectation_error(actual_received_count, args) + "received: #{count_message(actual_received_count)}" + + method_call_args_description(args) do + actual_received_count > 0 && args.length > 0 + end + end + + def expected_part_of_expectation_error(expected_received_count, expectation_count_type, argument_list_matcher) + "expected: #{count_message(expected_received_count, expectation_count_type)}" + + method_call_args_description(argument_list_matcher.expected_args) do + argument_list_matcher.expected_args.length > 0 + end + end + + def unexpected_arguments_message(expected_args_string, actual_args_string) + "with unexpected arguments\n expected: #{expected_args_string}\n got: #{actual_args_string}" + end + + def error_message(expectation, args_for_multiple_calls) + expected_args = format_args(expectation.expected_args) + actual_args = format_received_args(args_for_multiple_calls) + + if RSpec::Support::RubyFeatures.distincts_kw_args_from_positional_hash? + expected_hash = expectation.expected_args.last + actual_hash = args_for_multiple_calls.last.last + if Hash === expected_hash && Hash === actual_hash && + (Hash.ruby2_keywords_hash?(expected_hash) != Hash.ruby2_keywords_hash?(actual_hash)) + + actual_description = Hash.ruby2_keywords_hash?(actual_hash) ? " (keyword arguments)" : " (options hash)" + expected_description = Hash.ruby2_keywords_hash?(expected_hash) ? " (keyword arguments)" : " (options hash)" + + if actual_description != expected_description + actual_args += actual_description + expected_args += expected_description + end + end + end + + message = default_error_message(expectation, expected_args, actual_args) + + if args_for_multiple_calls.one? + diff = diff_message(expectation.expected_args, args_for_multiple_calls.first) + if RSpec::Mocks.configuration.color? + message << "\nDiff:#{diff}" unless diff.gsub(/\e\[\d+m/, '').strip.empty? + else + message << "\nDiff:#{diff}" unless diff.strip.empty? + end + end + + message + end + + def diff_message(expected_args, actual_args) + formatted_expected_args = expected_args.map do |x| + RSpec::Support.rspec_description_for_object(x) + end + + formatted_expected_args, actual_args = unpack_string_args(formatted_expected_args, actual_args) + + differ.diff(actual_args, formatted_expected_args) + end + + def unpack_string_args(formatted_expected_args, actual_args) + if [formatted_expected_args, actual_args].all? { |x| list_of_exactly_one_string?(x) } + [formatted_expected_args.first, actual_args.first] + else + [formatted_expected_args, actual_args] + end + end + + def list_of_exactly_one_string?(args) + Array === args && args.count == 1 && String === args.first + end + + def differ + RSpec::Support::Differ.new(:color => RSpec::Mocks.configuration.color?) + end + + def __raise(message, backtrace_line=nil, source_id=nil) + message = opts[:message] unless opts[:message].nil? + exception = RSpec::Mocks::MockExpectationError.new(message) + prepend_to_backtrace(exception, backtrace_line) if backtrace_line + notify exception, :source_id => source_id + end + + if RSpec::Support::Ruby.jruby? + def prepend_to_backtrace(exception, line) + raise exception + rescue RSpec::Mocks::MockExpectationError => with_backtrace + with_backtrace.backtrace.unshift(line) + end + else + def prepend_to_backtrace(exception, line) + exception.set_backtrace(caller.unshift line) + end + end + + def notify(*args) + RSpec::Support.notify_failure(*args) + end + + def format_args(args) + return "(no args)" if args.empty? + "(#{arg_list(args)})" + end + + def arg_list(args) + args.map { |arg| RSpec::Support::ObjectFormatter.format(arg) }.join(", ") + end + + def format_received_args(args_for_multiple_calls) + grouped_args(args_for_multiple_calls).map do |args_for_one_call, index| + "#{format_args(args_for_one_call)}#{group_count(index, args_for_multiple_calls)}" + end.join("\n ") + end + + def count_message(count, expectation_count_type=nil) + return "at least #{times(count.abs)}" if count < 0 || expectation_count_type == :at_least + return "at most #{times(count)}" if expectation_count_type == :at_most + times(count) + end + + def times(count) + "#{count} time#{count == 1 ? '' : 's'}" + end + + def grouped_args(args) + Hash[args.group_by { |x| x }.map { |k, v| [k, v.count] }] + end + + def group_count(index, args) + " (#{times(index)})" if args.size > 1 || index > 1 + end + end + + # @private + def self.error_generator + @error_generator ||= ErrorGenerator.new + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/example_methods.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/example_methods.rb new file mode 100644 index 0000000..5531b28 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/example_methods.rb @@ -0,0 +1,434 @@ +RSpec::Support.require_rspec_mocks 'object_reference' + +module RSpec + module Mocks + # Contains methods intended to be used from within code examples. + # Mix this in to your test context (such as a test framework base class) + # to use rspec-mocks with your test framework. If you're using rspec-core, + # it'll take care of doing this for you. + module ExampleMethods + include RSpec::Mocks::ArgumentMatchers + + # @overload double() + # @overload double(name) + # @param name [String/Symbol] name or description to be used in failure messages + # @overload double(stubs) + # @param stubs (Hash) hash of message/return-value pairs + # @overload double(name, stubs) + # @param name [String/Symbol] name or description to be used in failure messages + # @param stubs (Hash) hash of message/return-value pairs + # @return (Double) + # + # Constructs an instance of [RSpec::Mocks::Double](RSpec::Mocks::Double) configured + # with an optional name, used for reporting in failure messages, and an optional + # hash of message/return-value pairs. + # + # @example + # book = double("book", :title => "The RSpec Book") + # book.title #=> "The RSpec Book" + # + # card = double("card", :suit => "Spades", :rank => "A") + # card.suit #=> "Spades" + # card.rank #=> "A" + # + def double(*args) + ExampleMethods.declare_double(Double, *args) + end + + # @overload instance_double(doubled_class) + # @param doubled_class [String, Class] + # @overload instance_double(doubled_class, name) + # @param doubled_class [String, Class] + # @param name [String/Symbol] name or description to be used in failure messages + # @overload instance_double(doubled_class, stubs) + # @param doubled_class [String, Class] + # @param stubs [Hash] hash of message/return-value pairs + # @overload instance_double(doubled_class, name, stubs) + # @param doubled_class [String, Class] + # @param name [String/Symbol] name or description to be used in failure messages + # @param stubs [Hash] hash of message/return-value pairs + # @return InstanceVerifyingDouble + # + # Constructs a test double against a specific class. If the given class + # name has been loaded, only instance methods defined on the class are + # allowed to be stubbed. In all other ways it behaves like a + # [double](double). + def instance_double(doubled_class, *args) + ref = ObjectReference.for(doubled_class) + ExampleMethods.declare_verifying_double(InstanceVerifyingDouble, ref, *args) + end + + # @overload class_double(doubled_class) + # @param doubled_class [String, Module] + # @overload class_double(doubled_class, name) + # @param doubled_class [String, Module] + # @param name [String/Symbol] name or description to be used in failure messages + # @overload class_double(doubled_class, stubs) + # @param doubled_class [String, Module] + # @param stubs [Hash] hash of message/return-value pairs + # @overload class_double(doubled_class, name, stubs) + # @param doubled_class [String, Module] + # @param name [String/Symbol] name or description to be used in failure messages + # @param stubs [Hash] hash of message/return-value pairs + # @return ClassVerifyingDouble + # + # Constructs a test double against a specific class. If the given class + # name has been loaded, only class methods defined on the class are + # allowed to be stubbed. In all other ways it behaves like a + # [double](double). + def class_double(doubled_class, *args) + ref = ObjectReference.for(doubled_class) + ExampleMethods.declare_verifying_double(ClassVerifyingDouble, ref, *args) + end + + # @overload object_double(object_or_name) + # @param object_or_name [String, Object] + # @overload object_double(object_or_name, name) + # @param object_or_name [String, Object] + # @param name [String/Symbol] name or description to be used in failure messages + # @overload object_double(object_or_name, stubs) + # @param object_or_name [String, Object] + # @param stubs [Hash] hash of message/return-value pairs + # @overload object_double(object_or_name, name, stubs) + # @param object_or_name [String, Object] + # @param name [String/Symbol] name or description to be used in failure messages + # @param stubs [Hash] hash of message/return-value pairs + # @return ObjectVerifyingDouble + # + # Constructs a test double against a specific object. Only the methods + # the object responds to are allowed to be stubbed. If a String argument + # is provided, it is assumed to reference a constant object which is used + # for verification. In all other ways it behaves like a [double](double). + def object_double(object_or_name, *args) + ref = ObjectReference.for(object_or_name, :allow_direct_object_refs) + ExampleMethods.declare_verifying_double(ObjectVerifyingDouble, ref, *args) + end + + # @overload spy() + # @overload spy(name) + # @param name [String/Symbol] name or description to be used in failure messages + # @overload spy(stubs) + # @param stubs (Hash) hash of message/return-value pairs + # @overload spy(name, stubs) + # @param name [String/Symbol] name or description to be used in failure messages + # @param stubs (Hash) hash of message/return-value pairs + # @return (Double) + # + # Constructs a test double that is optimized for use with + # `have_received`. With a normal double one has to stub methods in order + # to be able to spy them. A spy automatically spies on all methods. + def spy(*args) + double(*args).as_null_object + end + + # @overload instance_spy(doubled_class) + # @param doubled_class [String, Class] + # @overload instance_spy(doubled_class, name) + # @param doubled_class [String, Class] + # @param name [String/Symbol] name or description to be used in failure messages + # @overload instance_spy(doubled_class, stubs) + # @param doubled_class [String, Class] + # @param stubs [Hash] hash of message/return-value pairs + # @overload instance_spy(doubled_class, name, stubs) + # @param doubled_class [String, Class] + # @param name [String/Symbol] name or description to be used in failure messages + # @param stubs [Hash] hash of message/return-value pairs + # @return InstanceVerifyingDouble + # + # Constructs a test double that is optimized for use with `have_received` + # against a specific class. If the given class name has been loaded, only + # instance methods defined on the class are allowed to be stubbed. With + # a normal double one has to stub methods in order to be able to spy + # them. An instance_spy automatically spies on all instance methods to + # which the class responds. + def instance_spy(*args) + instance_double(*args).as_null_object + end + + # @overload object_spy(object_or_name) + # @param object_or_name [String, Object] + # @overload object_spy(object_or_name, name) + # @param object_or_name [String, Class] + # @param name [String/Symbol] name or description to be used in failure messages + # @overload object_spy(object_or_name, stubs) + # @param object_or_name [String, Object] + # @param stubs [Hash] hash of message/return-value pairs + # @overload object_spy(object_or_name, name, stubs) + # @param object_or_name [String, Class] + # @param name [String/Symbol] name or description to be used in failure messages + # @param stubs [Hash] hash of message/return-value pairs + # @return ObjectVerifyingDouble + # + # Constructs a test double that is optimized for use with `have_received` + # against a specific object. Only instance methods defined on the object + # are allowed to be stubbed. With a normal double one has to stub + # methods in order to be able to spy them. An object_spy automatically + # spies on all methods to which the object responds. + def object_spy(*args) + object_double(*args).as_null_object + end + + # @overload class_spy(doubled_class) + # @param doubled_class [String, Module] + # @overload class_spy(doubled_class, name) + # @param doubled_class [String, Class] + # @param name [String/Symbol] name or description to be used in failure messages + # @overload class_spy(doubled_class, stubs) + # @param doubled_class [String, Module] + # @param stubs [Hash] hash of message/return-value pairs + # @overload class_spy(doubled_class, name, stubs) + # @param doubled_class [String, Class] + # @param name [String/Symbol] name or description to be used in failure messages + # @param stubs [Hash] hash of message/return-value pairs + # @return ClassVerifyingDouble + # + # Constructs a test double that is optimized for use with `have_received` + # against a specific class. If the given class name has been loaded, + # only class methods defined on the class are allowed to be stubbed. + # With a normal double one has to stub methods in order to be able to spy + # them. An class_spy automatically spies on all class methods to which the + # class responds. + def class_spy(*args) + class_double(*args).as_null_object + end + + # Disables warning messages about expectations being set on nil. + # + # By default warning messages are issued when expectations are set on + # nil. This is to prevent false-positives and to catch potential bugs + # early on. + # @deprecated Use {RSpec::Mocks::Configuration#allow_message_expectations_on_nil} instead. + def allow_message_expectations_on_nil + RSpec::Mocks.space.proxy_for(nil).warn_about_expectations = false + end + + # Stubs the named constant with the given value. + # Like method stubs, the constant will be restored + # to its original value (or lack of one, if it was + # undefined) when the example completes. + # + # @param constant_name [String] The fully qualified name of the constant. The current + # constant scoping at the point of call is not considered. + # @param value [Object] The value to make the constant refer to. When the + # example completes, the constant will be restored to its prior state. + # @param options [Hash] Stubbing options. + # @option options :transfer_nested_constants [Boolean, Array] Determines + # what nested constants, if any, will be transferred from the original value + # of the constant to the new value of the constant. This only works if both + # the original and new values are modules (or classes). + # @return [Object] the stubbed value of the constant + # + # @example + # stub_const("MyClass", Class.new) # => Replaces (or defines) MyClass with a new class object. + # stub_const("SomeModel::PER_PAGE", 5) # => Sets SomeModel::PER_PAGE to 5. + # + # class CardDeck + # SUITS = [:Spades, :Diamonds, :Clubs, :Hearts] + # NUM_CARDS = 52 + # end + # + # stub_const("CardDeck", Class.new) + # CardDeck::SUITS # => uninitialized constant error + # CardDeck::NUM_CARDS # => uninitialized constant error + # + # stub_const("CardDeck", Class.new, :transfer_nested_constants => true) + # CardDeck::SUITS # => our suits array + # CardDeck::NUM_CARDS # => 52 + # + # stub_const("CardDeck", Class.new, :transfer_nested_constants => [:SUITS]) + # CardDeck::SUITS # => our suits array + # CardDeck::NUM_CARDS # => uninitialized constant error + def stub_const(constant_name, value, options={}) + ConstantMutator.stub(constant_name, value, options) + end + + # Hides the named constant with the given value. The constant will be + # undefined for the duration of the test. + # + # Like method stubs, the constant will be restored to its original value + # when the example completes. + # + # @param constant_name [String] The fully qualified name of the constant. + # The current constant scoping at the point of call is not considered. + # + # @example + # hide_const("MyClass") # => MyClass is now an undefined constant + def hide_const(constant_name) + ConstantMutator.hide(constant_name) + end + + # Verifies that the given object received the expected message during the + # course of the test. On a spy objects or as null object doubles this + # works for any method, on other objects the method must have + # been stubbed beforehand in order for messages to be verified. + # + # Stubbing and verifying messages received in this way implements the + # Test Spy pattern. + # + # @param method_name [Symbol] name of the method expected to have been + # called. + # + # @example + # invitation = double('invitation', accept: true) + # user.accept_invitation(invitation) + # expect(invitation).to have_received(:accept) + # + # # You can also use most message expectations: + # expect(invitation).to have_received(:accept).with(mailer).once + # + # @note `have_received(...).with(...)` is unable to work properly when + # passed arguments are mutated after the spy records the received message. + def have_received(method_name, &block) + Matchers::HaveReceived.new(method_name, &block) + end + + # Turns off the verifying of partial doubles for the duration of the + # block, this is useful in situations where methods are defined at run + # time and you wish to define stubs for them but not turn off partial + # doubles for the entire run suite. (e.g. view specs in rspec-rails). + def without_partial_double_verification + original_state = Mocks.configuration.temporarily_suppress_partial_double_verification + Mocks.configuration.temporarily_suppress_partial_double_verification = true + yield + ensure + Mocks.configuration.temporarily_suppress_partial_double_verification = original_state + end + + # @method expect + # Used to wrap an object in preparation for setting a mock expectation + # on it. + # + # @example + # expect(obj).to receive(:foo).with(5).and_return(:return_value) + # + # @note This method is usually provided by rspec-expectations. However, + # if you use rspec-mocks without rspec-expectations, there's a definition + # of it that is made available here. If you disable the `:expect` syntax + # this method will be undefined. + + # @method allow + # Used to wrap an object in preparation for stubbing a method + # on it. + # + # @example + # allow(dbl).to receive(:foo).with(5).and_return(:return_value) + # + # @note If you disable the `:expect` syntax this method will be undefined. + + # @method expect_any_instance_of + # Used to wrap a class in preparation for setting a mock expectation + # on instances of it. + # + # @example + # expect_any_instance_of(MyClass).to receive(:foo) + # + # @note If you disable the `:expect` syntax this method will be undefined. + + # @method allow_any_instance_of + # Used to wrap a class in preparation for stubbing a method + # on instances of it. + # + # @example + # allow_any_instance_of(MyClass).to receive(:foo) + # + # @note This is only available when you have enabled the `expect` syntax. + + # @method receive + # Used to specify a message that you expect or allow an object + # to receive. The object returned by `receive` supports the same + # fluent interface that `should_receive` and `stub` have always + # supported, allowing you to constrain the arguments or number of + # times, and configure how the object should respond to the message. + # + # @example + # expect(obj).to receive(:hello).with("world").exactly(3).times + # + # @note If you disable the `:expect` syntax this method will be undefined. + + # @method receive_messages + # Shorthand syntax used to setup message(s), and their return value(s), + # that you expect or allow an object to receive. The method takes a hash + # of messages and their respective return values. Unlike with `receive`, + # you cannot apply further customizations using a block or the fluent + # interface. + # + # @example + # allow(obj).to receive_messages(:speak => "Hello World") + # allow(obj).to receive_messages(:speak => "Hello", :meow => "Meow") + # + # @note If you disable the `:expect` syntax this method will be undefined. + + # @method receive_message_chain + # @overload receive_message_chain(method1, method2) + # @overload receive_message_chain("method1.method2") + # @overload receive_message_chain(method1, method_to_value_hash) + # + # stubs/mocks a chain of messages on an object or test double. + # + # ## Warning: + # + # Chains can be arbitrarily long, which makes it quite painless to + # violate the Law of Demeter in violent ways, so you should consider any + # use of `receive_message_chain` a code smell. Even though not all code smells + # indicate real problems (think fluent interfaces), `receive_message_chain` still + # results in brittle examples. For example, if you write + # `allow(foo).to receive_message_chain(:bar, :baz => 37)` in a spec and then the + # implementation calls `foo.baz.bar`, the stub will not work. + # + # @example + # allow(double).to receive_message_chain("foo.bar") { :baz } + # allow(double).to receive_message_chain(:foo, :bar => :baz) + # allow(double).to receive_message_chain(:foo, :bar) { :baz } + # + # # Given any of ^^ these three forms ^^: + # double.foo.bar # => :baz + # + # # Common use in Rails/ActiveRecord: + # allow(Article).to receive_message_chain("recent.published") { [Article.new] } + # + # @note If you disable the `:expect` syntax this method will be undefined. + + # @private + def self.included(klass) + klass.class_exec do + # This gets mixed in so that if `RSpec::Matchers` is included in + # `klass` later, its definition of `expect` will take precedence. + include ExpectHost unless method_defined?(:expect) + end + end + + # @private + def self.extended(object) + # This gets extended in so that if `RSpec::Matchers` is included in + # `klass` later, its definition of `expect` will take precedence. + object.extend ExpectHost unless object.respond_to?(:expect) + end + + # @private + def self.declare_verifying_double(type, ref, *args) + if RSpec::Mocks.configuration.verify_doubled_constant_names? && + !ref.defined? + + RSpec::Mocks.error_generator.raise_verifying_double_not_defined_error(ref) + end + + RSpec::Mocks.configuration.verifying_double_callbacks.each do |block| + block.call(ref) + end + + declare_double(type, ref, *args) + end + + # @private + def self.declare_double(type, *args) + args << {} unless Hash === args.last + type.new(*args) + end + + # This module exists to host the `expect` method for cases where + # rspec-mocks is used w/o rspec-expectations. + module ExpectHost + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/instance_method_stasher.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/instance_method_stasher.rb new file mode 100644 index 0000000..12edec2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/instance_method_stasher.rb @@ -0,0 +1,146 @@ +module RSpec + module Mocks + # @private + class InstanceMethodStasher + def initialize(object, method) + @object = object + @method = method + @klass = (class << object; self; end) + + @original_method = nil + @method_is_stashed = false + end + + attr_reader :original_method + + if RUBY_VERSION.to_f < 1.9 + # @private + def method_is_stashed? + @method_is_stashed + end + + # @private + def stash + return if !method_defined_directly_on_klass? || @method_is_stashed + + @klass.__send__(:alias_method, stashed_method_name, @method) + @method_is_stashed = true + end + + # @private + def stashed_method_name + "obfuscated_by_rspec_mocks__#{@method}" + end + + # @private + def restore + return unless @method_is_stashed + + if @klass.__send__(:method_defined?, @method) + @klass.__send__(:undef_method, @method) + end + @klass.__send__(:alias_method, @method, stashed_method_name) + @klass.__send__(:remove_method, stashed_method_name) + @method_is_stashed = false + end + else + + # @private + def method_is_stashed? + !!@original_method + end + + # @private + def stash + return unless method_defined_directly_on_klass? + @original_method ||= ::RSpec::Support.method_handle_for(@object, @method) + @klass.__send__(:undef_method, @method) + end + + # @private + def restore + return unless @original_method + + if @klass.__send__(:method_defined?, @method) + @klass.__send__(:undef_method, @method) + end + + handle_restoration_failures do + @klass.__send__(:define_method, @method, @original_method) + end + + @original_method = nil + end + end + + if RUBY_DESCRIPTION.include?('2.0.0p247') || RUBY_DESCRIPTION.include?('2.0.0p195') + # ruby 2.0.0-p247 and 2.0.0-p195 both have a bug that we can't work around :(. + # https://bugs.ruby-lang.org/issues/8686 + def handle_restoration_failures + yield + rescue TypeError + RSpec.warn_with( + "RSpec failed to properly restore a partial double (#{@object.inspect}) " \ + "to its original state due to a known bug in MRI 2.0.0-p195 & p247 " \ + "(https://bugs.ruby-lang.org/issues/8686). This object may remain " \ + "screwed up for the rest of this process. Please upgrade to 2.0.0-p353 or above.", + :call_site => nil, :use_spec_location_as_call_site => true + ) + end + else + def handle_restoration_failures + # No known reasons for restoration to fail on other rubies. + yield + end + end + + private + + # @private + def method_defined_directly_on_klass? + method_defined_on_klass? && method_owned_by_klass? + end + + # @private + def method_defined_on_klass?(klass=@klass) + MethodReference.method_defined_at_any_visibility?(klass, @method) + end + + def method_owned_by_klass? + owner = @klass.instance_method(@method).owner + + # On Ruby 2.0.0+ the owner of a method on a class which has been + # `prepend`ed may actually be an instance, e.g. + # `#`, rather than the expected `MyClass`. + owner = owner.class unless Module === owner + + # On some 1.9s (e.g. rubinius) aliased methods + # can report the wrong owner. Example: + # class MyClass + # class << self + # alias alternate_new new + # end + # end + # + # MyClass.owner(:alternate_new) returns `Class` when incorrect, + # but we need to consider the owner to be `MyClass` because + # it is not actually available on `Class` but is on `MyClass`. + # Hence, we verify that the owner actually has the method defined. + # If the given owner does not have the method defined, we assume + # that the method is actually owned by @klass. + # + # On 1.8, aliased methods can also report the wrong owner. Example: + # module M + # def a; end + # module_function :a + # alias b a + # module_function :b + # end + # The owner of M.b is the raw Module object, instead of the expected + # singleton class of the module + return true if RUBY_VERSION < '1.9' && owner == @object + owner == @klass || !(method_defined_on_klass?(owner)) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/marshal_extension.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/marshal_extension.rb new file mode 100644 index 0000000..cfa9c1a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/marshal_extension.rb @@ -0,0 +1,41 @@ +module RSpec + module Mocks + # Support for `patch_marshal_to_support_partial_doubles` configuration. + # + # @private + class MarshalExtension + def self.patch! + return if Marshal.respond_to?(:dump_with_rspec_mocks) + + Marshal.instance_eval do + class << self + def dump_with_rspec_mocks(object, *rest) + if !::RSpec::Mocks.space.registered?(object) || NilClass === object + dump_without_rspec_mocks(object, *rest) + else + dump_without_rspec_mocks(object.dup, *rest) + end + end + + alias_method :dump_without_rspec_mocks, :dump + undef_method :dump + alias_method :dump, :dump_with_rspec_mocks + end + end + end + + def self.unpatch! + return unless Marshal.respond_to?(:dump_with_rspec_mocks) + + Marshal.instance_eval do + class << self + undef_method :dump_with_rspec_mocks + undef_method :dump + alias_method :dump, :dump_without_rspec_mocks + undef_method :dump_without_rspec_mocks + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/expectation_customization.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/expectation_customization.rb new file mode 100644 index 0000000..81e6427 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/expectation_customization.rb @@ -0,0 +1,20 @@ +module RSpec + module Mocks + module Matchers + # @private + class ExpectationCustomization + attr_accessor :block + + def initialize(method_name, args, block) + @method_name = method_name + @args = args + @block = block + end + + def playback_onto(expectation) + expectation.__send__(@method_name, *@args, &@block) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/have_received.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/have_received.rb new file mode 100644 index 0000000..cf4852b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/have_received.rb @@ -0,0 +1,134 @@ +module RSpec + module Mocks + module Matchers + # @private + class HaveReceived + include Matcher + + COUNT_CONSTRAINTS = %w[exactly at_least at_most times time once twice thrice] + ARGS_CONSTRAINTS = %w[with] + CONSTRAINTS = COUNT_CONSTRAINTS + ARGS_CONSTRAINTS + %w[ordered] + + def initialize(method_name, &block) + @method_name = method_name + @block = block + @constraints = [] + @subject = nil + end + + def matcher_name + "have_received" + end + + def matches?(subject, &block) + @block ||= block + @subject = subject + @expectation = expect + mock_proxy.ensure_implemented(@method_name) + + expected_messages_received_in_order? + end + + def does_not_match?(subject) + @subject = subject + ensure_count_unconstrained + @expectation = expect.never + mock_proxy.ensure_implemented(@method_name) + expected_messages_received_in_order? + end + + def failure_message + capture_failure_message + end + + def failure_message_when_negated + capture_failure_message + end + + def description + (@expectation ||= expect).description_for("have received") + end + + CONSTRAINTS.each do |expectation| + define_method expectation do |*args| + @constraints << [expectation, *args] + self + end + end + + def setup_expectation(subject, &block) + notify_failure_message unless matches?(subject, &block) + end + + def setup_negative_expectation(subject, &block) + notify_failure_message unless does_not_match?(subject, &block) + end + + def setup_allowance(_subject, &_block) + disallow("allow", " as it would have no effect") + end + + def setup_any_instance_allowance(_subject, &_block) + disallow("allow_any_instance_of") + end + + def setup_any_instance_expectation(_subject, &_block) + disallow("expect_any_instance_of") + end + + def setup_any_instance_negative_expectation(_subject, &_block) + disallow("expect_any_instance_of") + end + + private + + def disallow(type, reason="") + RSpec::Mocks.error_generator.raise_have_received_disallowed(type, reason) + end + + def expect + expectation = mock_proxy.build_expectation(@method_name) + apply_constraints_to expectation + expectation + end + + def apply_constraints_to(expectation) + @constraints.each do |constraint| + expectation.send(*constraint) + end + end + + def ensure_count_unconstrained + return unless count_constraint + RSpec::Mocks.error_generator.raise_cant_constrain_count_for_negated_have_received_error(count_constraint) + end + + def count_constraint + @constraints.map(&:first).find do |constraint| + COUNT_CONSTRAINTS.include?(constraint) + end + end + + def capture_failure_message + RSpec::Support.with_failure_notifier(Proc.new { |err, _opt| return err.message }) do + notify_failure_message + end + end + + def notify_failure_message + mock_proxy.check_for_unexpected_arguments(@expectation) + @expectation.generate_error + end + + def expected_messages_received_in_order? + mock_proxy.replay_received_message_on @expectation, &@block + @expectation.expected_messages_received? && @expectation.ensure_expected_ordering_received! + end + + def mock_proxy + RSpec::Mocks.space.proxy_for(@subject) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive.rb new file mode 100644 index 0000000..ee95830 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive.rb @@ -0,0 +1,134 @@ +RSpec::Support.require_rspec_mocks 'matchers/expectation_customization' + +module RSpec + module Mocks + module Matchers + # @private + class Receive + include Matcher + + def initialize(message, block) + @message = message + @block = block + @recorded_customizations = [] + end + + def matcher_name + "receive" + end + + def description + describable.description_for("receive") + end + + def setup_expectation(subject, &block) + warn_if_any_instance("expect", subject) + @describable = setup_mock_proxy_method_substitute(subject, :add_message_expectation, block) + end + alias matches? setup_expectation + + def setup_negative_expectation(subject, &block) + # ensure `never` goes first for cases like `never.and_return(5)`, + # where `and_return` is meant to raise an error + @recorded_customizations.unshift ExpectationCustomization.new(:never, [], nil) + + warn_if_any_instance("expect", subject) + + setup_expectation(subject, &block) + end + alias does_not_match? setup_negative_expectation + + def setup_allowance(subject, &block) + warn_if_any_instance("allow", subject) + setup_mock_proxy_method_substitute(subject, :add_stub, block) + end + + def setup_any_instance_expectation(subject, &block) + setup_any_instance_method_substitute(subject, :should_receive, block) + end + + def setup_any_instance_negative_expectation(subject, &block) + setup_any_instance_method_substitute(subject, :should_not_receive, block) + end + + def setup_any_instance_allowance(subject, &block) + setup_any_instance_method_substitute(subject, :stub, block) + end + + own_methods = (instance_methods - superclass.instance_methods) + MessageExpectation.public_instance_methods(false).each do |method| + next if own_methods.include?(method) + + define_method(method) do |*args, &block| + @recorded_customizations << ExpectationCustomization.new(method, args, block) + self + end + ruby2_keywords(method) if respond_to?(:ruby2_keywords, true) + end + + private + + def describable + @describable ||= DefaultDescribable.new(@message) + end + + def warn_if_any_instance(expression, subject) + return unless AnyInstance::Proxy === subject + + RSpec.warning( + "`#{expression}(#{subject.klass}.any_instance).to` " \ + "is probably not what you meant, it does not operate on " \ + "any instance of `#{subject.klass}`. " \ + "Use `#{expression}_any_instance_of(#{subject.klass}).to` instead." + ) + end + + def setup_mock_proxy_method_substitute(subject, method, block) + proxy = ::RSpec::Mocks.space.proxy_for(subject) + setup_method_substitute(proxy, method, block) + end + + def setup_any_instance_method_substitute(subject, method, block) + proxy = ::RSpec::Mocks.space.any_instance_proxy_for(subject) + setup_method_substitute(proxy, method, block) + end + + def setup_method_substitute(host, method, block, *args) + args << @message.to_sym + block = move_block_to_last_customization(block) + + expectation = host.__send__(method, *args, &(@block || block)) + + @recorded_customizations.each do |customization| + customization.playback_onto(expectation) + end + expectation + end + + def move_block_to_last_customization(block) + last = @recorded_customizations.last + return block unless last + + last.block ||= block + nil + end + + # MessageExpectation objects are able to describe themselves in detail. + # We use this as a fall back when a MessageExpectation is not available. + # @private + class DefaultDescribable + def initialize(message) + @message = message + end + + # This is much simpler for the `any_instance` case than what the + # user may want, but I'm not up for putting a bunch of effort + # into full descriptions for `any_instance` expectations at this point :(. + def description_for(verb) + "#{verb} #{@message}" + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive_message_chain.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive_message_chain.rb new file mode 100644 index 0000000..fdc89f9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive_message_chain.rb @@ -0,0 +1,82 @@ +RSpec::Support.require_rspec_mocks 'matchers/expectation_customization' + +module RSpec + module Mocks + module Matchers + # @private + class ReceiveMessageChain + include Matcher + + def initialize(chain, &block) + @chain = chain + @block = block + @recorded_customizations = [] + end + + [:with, :and_return, :and_invoke, :and_throw, :and_raise, :and_yield, :and_call_original].each do |msg| + define_method(msg) do |*args, &block| + @recorded_customizations << ExpectationCustomization.new(msg, args, block) + self + end + end + + def matcher_name + "receive_message_chain" + end + + def description + "receive message chain #{formatted_chain}" + end + + def setup_allowance(subject, &block) + chain = StubChain.stub_chain_on(subject, *@chain, &(@block || block)) + replay_customizations(chain) + end + + def setup_any_instance_allowance(subject, &block) + proxy = ::RSpec::Mocks.space.any_instance_proxy_for(subject) + chain = proxy.stub_chain(*@chain, &(@block || block)) + replay_customizations(chain) + end + + def setup_any_instance_expectation(subject, &block) + proxy = ::RSpec::Mocks.space.any_instance_proxy_for(subject) + chain = proxy.expect_chain(*@chain, &(@block || block)) + replay_customizations(chain) + end + + def setup_expectation(subject, &block) + chain = ExpectChain.expect_chain_on(subject, *@chain, &(@block || block)) + replay_customizations(chain) + end + + def setup_negative_expectation(*_args) + raise NegationUnsupportedError, + "`expect(...).not_to receive_message_chain` is not supported " \ + "since it doesn't really make sense. What would it even mean?" + end + + alias matches? setup_expectation + alias does_not_match? setup_negative_expectation + + private + + def replay_customizations(chain) + @recorded_customizations.each do |customization| + customization.playback_onto(chain) + end + end + + def formatted_chain + @formatted_chain ||= @chain.map do |part| + if Hash === part + part.keys.first.to_s + else + part.to_s + end + end.join(".") + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive_messages.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive_messages.rb new file mode 100644 index 0000000..6bf9047 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive_messages.rb @@ -0,0 +1,77 @@ +module RSpec + module Mocks + module Matchers + # @private + class ReceiveMessages + include Matcher + + def initialize(message_return_value_hash) + @message_return_value_hash = message_return_value_hash + @backtrace_line = CallerFilter.first_non_rspec_line + end + + def matcher_name + "receive_messages" + end + + def description + "receive messages: #{@message_return_value_hash.inspect}" + end + + def setup_expectation(subject) + warn_about_block if block_given? + each_message_on(proxy_on(subject)) do |host, message, return_value| + host.add_simple_expectation(message, return_value, @backtrace_line) + end + end + alias matches? setup_expectation + + def setup_negative_expectation(_subject) + raise NegationUnsupportedError, + "`expect(...).to_not receive_messages` is not supported since it " \ + "doesn't really make sense. What would it even mean?" + end + alias does_not_match? setup_negative_expectation + + def setup_allowance(subject) + warn_about_block if block_given? + each_message_on(proxy_on(subject)) do |host, message, return_value| + host.add_simple_stub(message, return_value) + end + end + + def setup_any_instance_expectation(subject) + warn_about_block if block_given? + each_message_on(any_instance_of(subject)) do |host, message, return_value| + host.should_receive(message).and_return(return_value) + end + end + + def setup_any_instance_allowance(subject) + warn_about_block if block_given? + any_instance_of(subject).stub(@message_return_value_hash) + end + + def warn_about_block + raise "Implementation blocks aren't supported with `receive_messages`" + end + + private + + def proxy_on(subject) + ::RSpec::Mocks.space.proxy_for(subject) + end + + def any_instance_of(subject) + ::RSpec::Mocks.space.any_instance_proxy_for(subject) + end + + def each_message_on(host) + @message_return_value_hash.each do |message, value| + yield host, message, value + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/message_chain.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/message_chain.rb new file mode 100644 index 0000000..907d14b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/message_chain.rb @@ -0,0 +1,87 @@ +module RSpec + module Mocks + # @private + class MessageChain + attr_reader :object, :chain, :block + + def initialize(object, *chain, &blk) + @object = object + @chain, @block = format_chain(*chain, &blk) + end + + # @api private + def setup_chain + if chain.length > 1 + if (matching_stub = find_matching_stub) + chain.shift + chain_on(matching_stub.invoke(nil), *chain, &@block) + elsif (matching_expectation = find_matching_expectation) + chain.shift + chain_on(matching_expectation.invoke_without_incrementing_received_count(nil), *chain, &@block) + else + next_in_chain = Double.new + expectation(object, chain.shift) { next_in_chain } + chain_on(next_in_chain, *chain, &@block) + end + else + expectation(object, chain.shift, &@block) + end + end + + private + + def chain_on(object, *chain, &block) + initialize(object, *chain, &block) + setup_chain + end + + def format_chain(*chain, &blk) + if Hash === chain.last + hash = chain.pop + hash.each do |k, v| + chain << k + blk = Proc.new { v } + end + end + return chain.join('.').split('.'), blk + end + + def find_matching_stub + ::RSpec::Mocks.space.proxy_for(object). + __send__(:find_matching_method_stub, chain.first.to_sym) + end + + def find_matching_expectation + ::RSpec::Mocks.space.proxy_for(object). + __send__(:find_matching_expectation, chain.first.to_sym) + end + end + + # @private + class ExpectChain < MessageChain + # @api private + def self.expect_chain_on(object, *chain, &blk) + new(object, *chain, &blk).setup_chain + end + + private + + def expectation(object, message, &return_block) + ::RSpec::Mocks.expect_message(object, message, {}, &return_block) + end + end + + # @private + class StubChain < MessageChain + def self.stub_chain_on(object, *chain, &blk) + new(object, *chain, &blk).setup_chain + end + + private + + def expectation(object, message, &return_block) + ::RSpec::Mocks.allow_message(object, message, {}, &return_block) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/message_expectation.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/message_expectation.rb new file mode 100644 index 0000000..a478db7 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/message_expectation.rb @@ -0,0 +1,856 @@ +RSpec::Support.require_rspec_support 'mutex' + +module RSpec + module Mocks + # A message expectation that only allows concrete return values to be set + # for a message. While this same effect can be achieved using a standard + # MessageExpectation, this version is much faster and so can be used as an + # optimization. + # + # @private + class SimpleMessageExpectation + def initialize(message, response, error_generator, backtrace_line=nil) + @message, @response, @error_generator, @backtrace_line = message.to_sym, response, error_generator, backtrace_line + @received = false + end + + def invoke(*_) + @received = true + @response + end + + def matches?(message, *_) + @message == message.to_sym + end + + def called_max_times? + false + end + + def verify_messages_received + return if @received + @error_generator.raise_expectation_error( + @message, 1, ArgumentListMatcher::MATCH_ALL, 0, nil, [], @backtrace_line + ) + end + + def unadvise(_) + end + end + + # Represents an individual method stub or message expectation. The methods + # defined here can be used to configure how it behaves. The methods return + # `self` so that they can be chained together to form a fluent interface. + class MessageExpectation + # @!group Configuring Responses + + # @overload and_return(value) + # @overload and_return(first_value, second_value) + # + # Tells the object to return a value when it receives the message. Given + # more than one value, the first value is returned the first time the + # message is received, the second value is returned the next time, etc, + # etc. + # + # If the message is received more times than there are values, the last + # value is returned for every subsequent call. + # + # @return [nil] No further chaining is supported after this. + # @example + # allow(counter).to receive(:count).and_return(1) + # counter.count # => 1 + # counter.count # => 1 + # + # allow(counter).to receive(:count).and_return(1,2,3) + # counter.count # => 1 + # counter.count # => 2 + # counter.count # => 3 + # counter.count # => 3 + # counter.count # => 3 + # # etc + def and_return(first_value, *values, &_block) + raise_already_invoked_error_if_necessary(__method__) + if negative? + raise "`and_return` is not supported with negative message expectations" + end + + if block_given? + raise ArgumentError, "Implementation blocks aren't supported with `and_return`" + end + + values.unshift(first_value) + @expected_received_count = [@expected_received_count, values.size].max unless ignoring_args? || (@expected_received_count == 0 && @at_least) + self.terminal_implementation_action = AndReturnImplementation.new(values) + + nil + end + + # Tells the object to invoke a Proc when it receives the message. Given + # more than one value, the result of the first Proc is returned the first + # time the message is received, the result of the second Proc is returned + # the next time, etc, etc. + # + # If the message is received more times than there are Procs, the result of + # the last Proc is returned for every subsequent call. + # + # @return [nil] No further chaining is supported after this. + # @example + # allow(api).to receive(:get_foo).and_invoke(-> { raise ApiTimeout }) + # api.get_foo # => raises ApiTimeout + # api.get_foo # => raises ApiTimeout + # + # allow(api).to receive(:get_foo).and_invoke(-> { raise ApiTimeout }, -> { raise ApiTimeout }, -> { :a_foo }) + # api.get_foo # => raises ApiTimeout + # api.get_foo # => raises ApiTimeout + # api.get_foo # => :a_foo + # api.get_foo # => :a_foo + # api.get_foo # => :a_foo + # # etc + def and_invoke(first_proc, *procs, &_block) + raise_already_invoked_error_if_necessary(__method__) + if negative? + raise "`and_invoke` is not supported with negative message expectations" + end + + if block_given? + raise ArgumentError, "Implementation blocks aren't supported with `and_invoke`" + end + + procs.unshift(first_proc) + if procs.any? { |p| !p.respond_to?(:call) } + raise ArgumentError, "Arguments to `and_invoke` must be callable." + end + + @expected_received_count = [@expected_received_count, procs.size].max unless ignoring_args? || (@expected_received_count == 0 && @at_least) + self.terminal_implementation_action = AndInvokeImplementation.new(procs) + + nil + end + + # Tells the object to delegate to the original unmodified method + # when it receives the message. + # + # @note This is only available on partial doubles. + # + # @return [nil] No further chaining is supported after this. + # @example + # expect(counter).to receive(:increment).and_call_original + # original_count = counter.count + # counter.increment + # expect(counter.count).to eq(original_count + 1) + def and_call_original + block = lambda do |original, *args, &b| + original.call(*args, &b) + end + block = block.ruby2_keywords if block.respond_to?(:ruby2_keywords) + + wrap_original(__method__, &block) + end + + # Decorates the stubbed method with the supplied block. The original + # unmodified method is passed to the block along with any method call + # arguments so you can delegate to it, whilst still being able to + # change what args are passed to it and/or change the return value. + # + # @note This is only available on partial doubles. + # + # @return [nil] No further chaining is supported after this. + # @example + # expect(api).to receive(:large_list).and_wrap_original do |original_method, *args, &block| + # original_method.call(*args, &block).first(10) + # end + def and_wrap_original(&block) + wrap_original(__method__, &block) + end + + # @overload and_raise + # @overload and_raise(ExceptionClass) + # @overload and_raise(ExceptionClass, message) + # @overload and_raise(exception_instance) + # + # Tells the object to raise an exception when the message is received. + # + # @return [nil] No further chaining is supported after this. + # @note + # When you pass an exception class, the MessageExpectation will raise + # an instance of it, creating it with `exception` and passing `message` + # if specified. If the exception class initializer requires more than + # one parameters, you must pass in an instance and not the class, + # otherwise this method will raise an ArgumentError exception. + # + # @example + # allow(car).to receive(:go).and_raise + # allow(car).to receive(:go).and_raise(OutOfGas) + # allow(car).to receive(:go).and_raise(OutOfGas, "At least 2 oz of gas needed to drive") + # allow(car).to receive(:go).and_raise(OutOfGas.new(2, :oz)) + def and_raise(*args) + raise_already_invoked_error_if_necessary(__method__) + self.terminal_implementation_action = Proc.new { raise(*args) } + nil + end + + # @overload and_throw(symbol) + # @overload and_throw(symbol, object) + # + # Tells the object to throw a symbol (with the object if that form is + # used) when the message is received. + # + # @return [nil] No further chaining is supported after this. + # @example + # allow(car).to receive(:go).and_throw(:out_of_gas) + # allow(car).to receive(:go).and_throw(:out_of_gas, :level => 0.1) + def and_throw(*args) + raise_already_invoked_error_if_necessary(__method__) + self.terminal_implementation_action = Proc.new { throw(*args) } + nil + end + + # Tells the object to yield one or more args to a block when the message + # is received. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # stream.stub(:open).and_yield(StringIO.new) + def and_yield(*args, &block) + raise_already_invoked_error_if_necessary(__method__) + yield @eval_context = Object.new if block + + # Initialize args to yield now that it's being used, see also: comment + # in constructor. + @args_to_yield ||= [] + + @args_to_yield << args + self.initial_implementation_action = AndYieldImplementation.new(@args_to_yield, @eval_context, @error_generator) + self + end + # @!endgroup + + # @!group Constraining Receive Counts + + # Constrain a message expectation to be received a specific number of + # times. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(dealer).to receive(:deal_card).exactly(10).times + def exactly(n, &block) + raise_already_invoked_error_if_necessary(__method__) + self.inner_implementation_action = block + set_expected_received_count :exactly, n + self + end + + # Constrain a message expectation to be received at least a specific + # number of times. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(dealer).to receive(:deal_card).at_least(9).times + def at_least(n, &block) + raise_already_invoked_error_if_necessary(__method__) + set_expected_received_count :at_least, n + + if n == 0 + raise "at_least(0) has been removed, use allow(...).to receive(:message) instead" + end + + self.inner_implementation_action = block + + self + end + + # Constrain a message expectation to be received at most a specific + # number of times. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(dealer).to receive(:deal_card).at_most(10).times + def at_most(n, &block) + raise_already_invoked_error_if_necessary(__method__) + self.inner_implementation_action = block + set_expected_received_count :at_most, n + self + end + + # Syntactic sugar for `exactly`, `at_least` and `at_most` + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(dealer).to receive(:deal_card).exactly(10).times + # expect(dealer).to receive(:deal_card).at_least(10).times + # expect(dealer).to receive(:deal_card).at_most(10).times + def times(&block) + self.inner_implementation_action = block + self + end + alias time times + + # Expect a message not to be received at all. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(car).to receive(:stop).never + def never + error_generator.raise_double_negation_error("expect(obj)") if negative? + @expected_received_count = 0 + self + end + + # Expect a message to be received exactly one time. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(car).to receive(:go).once + def once(&block) + self.inner_implementation_action = block + set_expected_received_count :exactly, 1 + self + end + + # Expect a message to be received exactly two times. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(car).to receive(:go).twice + def twice(&block) + self.inner_implementation_action = block + set_expected_received_count :exactly, 2 + self + end + + # Expect a message to be received exactly three times. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(car).to receive(:go).thrice + def thrice(&block) + self.inner_implementation_action = block + set_expected_received_count :exactly, 3 + self + end + # @!endgroup + + # @!group Other Constraints + + # Constrains a stub or message expectation to invocations with specific + # arguments. + # + # With a stub, if the message might be received with other args as well, + # you should stub a default value first, and then stub or mock the same + # message using `with` to constrain to specific arguments. + # + # A message expectation will fail if the message is received with different + # arguments. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # allow(cart).to receive(:add) { :failure } + # allow(cart).to receive(:add).with(Book.new(:isbn => 1934356379)) { :success } + # cart.add(Book.new(:isbn => 1234567890)) + # # => :failure + # cart.add(Book.new(:isbn => 1934356379)) + # # => :success + # + # expect(cart).to receive(:add).with(Book.new(:isbn => 1934356379)) { :success } + # cart.add(Book.new(:isbn => 1234567890)) + # # => failed expectation + # cart.add(Book.new(:isbn => 1934356379)) + # # => passes + def with(*args, &block) + raise_already_invoked_error_if_necessary(__method__) + if args.empty? + raise ArgumentError, + "`with` must have at least one argument. Use `no_args` matcher to set the expectation of receiving no arguments." + end + + self.inner_implementation_action = block + @argument_list_matcher = ArgumentListMatcher.new(*args) + self + end + ruby2_keywords(:with) if respond_to?(:ruby2_keywords, true) + + # Expect messages to be received in a specific order. + # + # @return [MessageExpectation] self, to support further chaining. + # @example + # expect(api).to receive(:prepare).ordered + # expect(api).to receive(:run).ordered + # expect(api).to receive(:finish).ordered + def ordered(&block) + if type == :stub + RSpec.warning( + "`allow(...).to receive(..).ordered` is not supported and will " \ + "have no effect, use `and_return(*ordered_values)` instead." + ) + end + + self.inner_implementation_action = block + additional_expected_calls.times do + @order_group.register(self) + end + @ordered = true + self + end + + # @return [String] a nice representation of the message expectation + def to_s + args_description = error_generator.method_call_args_description(@argument_list_matcher.expected_args, "", "") { true } + args_description = "(#{args_description})" unless args_description.start_with?("(") + "#<#{self.class} #{error_generator.intro}.#{message}#{args_description}>" + end + alias inspect to_s + + # Implementation details is a long module + # rubocop:disable Metrics/ModuleLength + + # @private + # Contains the parts of `MessageExpectation` that aren't part of + # rspec-mocks' public API. The class is very big and could really use + # some collaborators it delegates to for this stuff but for now this was + # the simplest way to split the public from private stuff to make it + # easier to publish the docs for the APIs we want published. + module ImplementationDetails + attr_accessor :error_generator, :implementation + attr_reader :message + attr_reader :orig_object + attr_writer :expected_received_count, :expected_from, :argument_list_matcher + protected :expected_received_count=, :expected_from=, :error_generator=, :implementation= + + # @private + attr_reader :type + + # rubocop:disable Metrics/ParameterLists + def initialize(error_generator, expectation_ordering, expected_from, method_double, + type=:expectation, opts={}, &implementation_block) + @type = type + @error_generator = error_generator + @error_generator.opts = error_generator.opts.merge(opts) + @expected_from = expected_from + @method_double = method_double + @orig_object = @method_double.object + @message = @method_double.method_name + @actual_received_count = 0 + @actual_received_count_write_mutex = Support::Mutex.new + @expected_received_count = type == :expectation ? 1 : :any + @argument_list_matcher = ArgumentListMatcher::MATCH_ALL + @order_group = expectation_ordering + @order_group.register(self) unless type == :stub + @expectation_type = type + @ordered = false + @at_least = @at_most = @exactly = nil + + self.invoking_internals = false + + # Initialized to nil so that we don't allocate an array for every + # mock or stub. See also comment in `and_yield`. + @args_to_yield = nil + @eval_context = nil + @yield_receiver_to_implementation_block = false + + @implementation = Implementation.new + self.inner_implementation_action = implementation_block + end + # rubocop:enable Metrics/ParameterLists + + def expected_args + @argument_list_matcher.expected_args + end + + def and_yield_receiver_to_implementation + @yield_receiver_to_implementation_block = true + self + end + + def yield_receiver_to_implementation_block? + @yield_receiver_to_implementation_block + end + + def matches?(message, *args) + @message == message && @argument_list_matcher.args_match?(*args) + end + ruby2_keywords :matches? if respond_to?(:ruby2_keywords, true) + + def safe_invoke(parent_stub, *args, &block) + invoke_incrementing_actual_calls_by(1, false, parent_stub, *args, &block) + end + ruby2_keywords :safe_invoke if respond_to?(:ruby2_keywords, true) + + def invoke(parent_stub, *args, &block) + if invoking_internals + safe_invoke_without_incrementing_received_count(parent_stub, *args, &block) + else + invoke_incrementing_actual_calls_by(1, true, parent_stub, *args, &block) + end + end + ruby2_keywords :invoke if respond_to?(:ruby2_keywords, true) + + def safe_invoke_without_incrementing_received_count(parent_stub, *args, &block) + invoke_incrementing_actual_calls_by(0, false, parent_stub, *args, &block) + end + ruby2_keywords :safe_invoke_without_incrementing_received_count if respond_to?(:ruby2_keywords, true) + + def invoke_without_incrementing_received_count(parent_stub, *args, &block) + invoke_incrementing_actual_calls_by(0, true, parent_stub, *args, &block) + end + ruby2_keywords :invoke_without_incrementing_received_count if respond_to?(:ruby2_keywords, true) + + def negative? + @expected_received_count == 0 && !@at_least + end + + def called_max_times? + @expected_received_count != :any && + !@at_least && + @expected_received_count > 0 && + @actual_received_count >= @expected_received_count + end + + def matches_name_but_not_args(message, *args) + @message == message && !@argument_list_matcher.args_match?(*args) + end + + def verify_messages_received + return if expected_messages_received? + generate_error + end + + def expected_messages_received? + ignoring_args? || matches_exact_count? || matches_at_least_count? || matches_at_most_count? + end + + def ensure_expected_ordering_received! + @order_group.verify_invocation_order(self) if @ordered + true + end + + def ignoring_args? + @expected_received_count == :any + end + + def matches_at_least_count? + @at_least && @actual_received_count >= @expected_received_count + end + + def matches_at_most_count? + @at_most && @actual_received_count <= @expected_received_count + end + + def matches_exact_count? + @expected_received_count == @actual_received_count + end + + def similar_messages + @similar_messages ||= [] + end + + def advise(*args) + similar_messages << args + end + + def unadvise(args) + similar_messages.delete_if { |message| args.include?(message) } + end + + def generate_error + if similar_messages.empty? + @error_generator.raise_expectation_error( + @message, @expected_received_count, @argument_list_matcher, + @actual_received_count, expectation_count_type, expected_args, + @expected_from, exception_source_id + ) + else + @error_generator.raise_similar_message_args_error( + self, @similar_messages, @expected_from + ) + end + end + + def raise_unexpected_message_args_error(args_for_multiple_calls) + @error_generator.raise_unexpected_message_args_error(self, args_for_multiple_calls, exception_source_id) + end + + def expectation_count_type + return :at_least if @at_least + return :at_most if @at_most + nil + end + + def description_for(verb) + @error_generator.describe_expectation( + verb, @message, @expected_received_count, + @actual_received_count, expected_args + ) + end + + def raise_out_of_order_error + @error_generator.raise_out_of_order_error @message + end + + def additional_expected_calls + return 0 if @expectation_type == :stub || !@exactly + @expected_received_count - 1 + end + + def ordered? + @ordered + end + + def negative_expectation_for?(message) + @message == message && negative? + end + + def actual_received_count_matters? + @at_least || @at_most || @exactly + end + + def increase_actual_received_count! + @actual_received_count_write_mutex.synchronize do + @actual_received_count += 1 + end + end + + private + + def exception_source_id + @exception_source_id ||= "#{self.class.name} #{__id__}" + end + + def invoking_internals + RSpec::Support.thread_local_data[:"__rspec_#{object_id}_invoking_internals"] + end + + def invoking_internals=(value) + # We clear the key for this rather than setting to false because otherwise the amount of + # thread local data will keep growing over the lifetime of the thread (which is a long + # time on a single threaded spec run e.g standard MRI) + if value + RSpec::Support.thread_local_data[:"__rspec_#{object_id}_invoking_internals"] = true + else + RSpec::Support.thread_local_data.delete(:"__rspec_#{object_id}_invoking_internals") + end + end + + def invoke_incrementing_actual_calls_by(increment, allowed_to_fail, parent_stub, *args, &block) + self.invoking_internals = true + + args.unshift(orig_object) if yield_receiver_to_implementation_block? + + if negative? || (allowed_to_fail && (@exactly || @at_most) && (@actual_received_count == @expected_received_count)) + # args are the args we actually received, @argument_list_matcher is the + # list of args we were expecting + @error_generator.raise_expectation_error( + @message, @expected_received_count, + @argument_list_matcher, + @actual_received_count + increment, + expectation_count_type, args, nil, exception_source_id + ) + end + + @order_group.handle_order_constraint self + + self.invoking_internals = false + + if implementation.present? + implementation.call(*args, &block) + elsif parent_stub + parent_stub.invoke(nil, *args, &block) + end + ensure + self.invoking_internals = false + @actual_received_count_write_mutex.synchronize do + @actual_received_count += increment + end + end + ruby2_keywords :invoke_incrementing_actual_calls_by if respond_to?(:ruby2_keywords, true) + + def has_been_invoked? + @actual_received_count > 0 + end + + def raise_already_invoked_error_if_necessary(calling_customization) + return unless has_been_invoked? + + error_generator.raise_already_invoked_error(message, calling_customization) + end + + def set_expected_received_count(relativity, n) + raise "`count` is not supported with negative message expectations" if negative? + @at_least = (relativity == :at_least) + @at_most = (relativity == :at_most) + @exactly = (relativity == :exactly) + @expected_received_count = case n + when Numeric then n + when :once then 1 + when :twice then 2 + when :thrice then 3 + end + end + + def initial_implementation_action=(action) + implementation.initial_action = action + end + + def inner_implementation_action=(action) + return unless action + warn_about_stub_override if implementation.inner_action + implementation.inner_action = action + end + + def terminal_implementation_action=(action) + implementation.terminal_action = action + end + + def warn_about_stub_override + RSpec.warning( + "You're overriding a previous stub implementation of `#{@message}`. " \ + "Called from #{CallerFilter.first_non_rspec_line}." + ) + end + + def wrap_original(method_name, &block) + if RSpec::Mocks::TestDouble === @method_double.object + @error_generator.raise_only_valid_on_a_partial_double(method_name) + else + warn_about_stub_override if implementation.inner_action + @implementation = AndWrapOriginalImplementation.new(@method_double.original_implementation_callable, block) + @yield_receiver_to_implementation_block = false + end + + nil + end + end + + include ImplementationDetails + end + # rubocop:enable Metrics/ModuleLength + + # Handles the implementation of an `and_yield` declaration. + # @private + class AndYieldImplementation + def initialize(args_to_yield, eval_context, error_generator) + @args_to_yield = args_to_yield + @eval_context = eval_context + @error_generator = error_generator + end + + def call(*_args_to_ignore, &block) + return if @args_to_yield.empty? && @eval_context.nil? + + @error_generator.raise_missing_block_error @args_to_yield unless block + value = nil + block_signature = Support::BlockSignature.new(block) + + @args_to_yield.each do |args| + unless Support::StrictSignatureVerifier.new(block_signature, args).valid? + @error_generator.raise_wrong_arity_error(args, block_signature) + end + + value = @eval_context ? @eval_context.instance_exec(*args, &block) : yield(*args) + end + value + end + end + + # Handles the implementation of an `and_return` implementation. + # @private + class AndReturnImplementation + def initialize(values_to_return) + @values_to_return = values_to_return + end + + def call(*_args_to_ignore, &_block) + if @values_to_return.size > 1 + @values_to_return.shift + else + @values_to_return.first + end + end + end + + # Handles the implementation of an `and_invoke` implementation. + # @private + class AndInvokeImplementation + def initialize(procs_to_invoke) + @procs_to_invoke = procs_to_invoke + end + + def call(*args, &block) + proc = if @procs_to_invoke.size > 1 + @procs_to_invoke.shift + else + @procs_to_invoke.first + end + + proc.call(*args, &block) + end + ruby2_keywords(:call) if respond_to?(:ruby2_keywords, true) + end + + # Represents a configured implementation. Takes into account + # any number of sub-implementations. + # @private + class Implementation + attr_accessor :initial_action, :inner_action, :terminal_action + + def call(*args, &block) + actions.map do |action| + action.call(*args, &block) + end.last + end + ruby2_keywords :call if respond_to?(:ruby2_keywords, true) + + def present? + actions.any? + end + + private + + def actions + [initial_action, inner_action, terminal_action].compact + end + end + + # Represents an `and_call_original` implementation. + # @private + class AndWrapOriginalImplementation + def initialize(method, block) + @method = method + @block = block + end + + CannotModifyFurtherError = Class.new(StandardError) + + def initial_action=(_value) + raise cannot_modify_further_error + end + + def inner_action=(_value) + raise cannot_modify_further_error + end + + def terminal_action=(_value) + raise cannot_modify_further_error + end + + def present? + true + end + + def inner_action + true + end + + def call(*args, &block) + @block.call(@method, *args, &block) + end + ruby2_keywords :call if respond_to?(:ruby2_keywords, true) + + private + + def cannot_modify_further_error + CannotModifyFurtherError.new "This method has already been configured " \ + "to call the original implementation, and cannot be modified further." + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/method_double.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/method_double.rb new file mode 100644 index 0000000..7417f65 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/method_double.rb @@ -0,0 +1,316 @@ +module RSpec + module Mocks + # @private + class MethodDouble + # @private TODO: drop in favor of FrozenError in ruby 2.5+ + FROZEN_ERROR_MSG = /can't modify frozen/ + + # @private + attr_reader :method_name, :object, :expectations, :stubs, :method_stasher + + # @private + def initialize(object, method_name, proxy) + @method_name = method_name + @object = object + @proxy = proxy + + @original_visibility = nil + @method_stasher = InstanceMethodStasher.new(object, method_name) + @method_is_proxied = false + @expectations = [] + @stubs = [] + end + + def original_implementation_callable + # If original method is not present, uses the `method_missing` + # handler of the object. This accounts for cases where the user has not + # correctly defined `respond_to?`, and also 1.8 which does not provide + # method handles for missing methods even if `respond_to?` is correct. + @original_implementation_callable ||= original_method || method_missing_block + end + + alias_method :save_original_implementation_callable!, :original_implementation_callable + + def original_method + @original_method ||= + @method_stasher.original_method || + @proxy.original_method_handle_for(method_name) + end + + # @private + def method_missing_block + block = Proc.new do |*args, &b| + @object.__send__(:method_missing, @method_name, *args, &b) + end + block.ruby2_keywords if block.respond_to?(:ruby2_keywords) + + block + end + + # @private + def visibility + @proxy.visibility_for(@method_name) + end + + # @private + def object_singleton_class + class << @object; self; end + end + + # @private + def configure_method + @original_visibility = visibility + @method_stasher.stash unless @method_is_proxied + define_proxy_method + end + + # @private + def define_proxy_method + return if @method_is_proxied + + save_original_implementation_callable! + definition_target.class_exec(self, method_name, @original_visibility || visibility) do |method_double, method_name, visibility| + define_method(method_name) do |*args, &block| + method_double.proxy_method_invoked(self, *args, &block) + end + # This can't be `if respond_to?(:ruby2_keywords, true)`, + # see https://github.com/rspec/rspec-mocks/pull/1385#issuecomment-755340298 + ruby2_keywords(method_name) if Module.private_method_defined?(:ruby2_keywords) + __send__(visibility, method_name) + end + + @method_is_proxied = true + rescue RuntimeError, TypeError => e + # TODO: drop in favor of FrozenError in ruby 2.5+ + # RuntimeError (and FrozenError) for ruby 2.x + # TypeError for ruby 1.x + if (defined?(FrozenError) && e.is_a?(FrozenError)) || FROZEN_ERROR_MSG === e.message + raise ArgumentError, "Cannot proxy frozen objects, rspec-mocks relies on proxies for method stubbing and expectations." + end + raise + end + + # The implementation of the proxied method. Subclasses may override this + # method to perform additional operations. + # + # @private + def proxy_method_invoked(_obj, *args, &block) + @proxy.message_received method_name, *args, &block + end + ruby2_keywords :proxy_method_invoked if respond_to?(:ruby2_keywords, true) + + # @private + def restore_original_method + return unless @method_is_proxied + + remove_method_from_definition_target + @method_stasher.restore if @method_stasher.method_is_stashed? + restore_original_visibility + + @method_is_proxied = false + rescue RuntimeError, TypeError => e + # TODO: drop in favor of FrozenError in ruby 2.5+ + # RuntimeError (and FrozenError) for ruby 2.x + # TypeError for ruby 1.x + if (defined?(FrozenError) && e.is_a?(FrozenError)) || FROZEN_ERROR_MSG === e.message + return show_frozen_warning + end + raise + end + + # @private + def show_frozen_warning + RSpec.warn_with( + "WARNING: rspec-mocks was unable to restore the original `#{@method_name}` " \ + "method on #{@object.inspect} because it has been frozen. If you reuse this " \ + "object, `#{@method_name}` will continue to respond with its stub implementation.", + :call_site => nil, + :use_spec_location_as_call_site => true + ) + end + + # @private + def restore_original_visibility + return unless @original_visibility && + MethodReference.method_defined_at_any_visibility?(object_singleton_class, @method_name) + + object_singleton_class.__send__(@original_visibility, method_name) + end + + # @private + def verify + expectations.each { |e| e.verify_messages_received } + end + + # @private + def reset + restore_original_method + clear + end + + # @private + def clear + expectations.clear + stubs.clear + end + + # The type of message expectation to create has been extracted to its own + # method so that subclasses can override it. + # + # @private + def message_expectation_class + MessageExpectation + end + + # @private + def add_expectation(error_generator, expectation_ordering, expected_from, opts, &implementation) + configure_method + expectation = message_expectation_class.new(error_generator, expectation_ordering, + expected_from, self, :expectation, opts, &implementation) + expectations << expectation + expectation + end + + # @private + def build_expectation(error_generator, expectation_ordering) + expected_from = IGNORED_BACKTRACE_LINE + message_expectation_class.new(error_generator, expectation_ordering, expected_from, self) + end + + # @private + def add_stub(error_generator, expectation_ordering, expected_from, opts={}, &implementation) + configure_method + stub = message_expectation_class.new(error_generator, expectation_ordering, expected_from, + self, :stub, opts, &implementation) + stubs.unshift stub + stub + end + + # A simple stub can only return a concrete value for a message, and + # cannot match on arguments. It is used as an optimization over + # `add_stub` / `add_expectation` where it is known in advance that this + # is all that will be required of a stub, such as when passing attributes + # to the `double` example method. They do not stash or restore existing method + # definitions. + # + # @private + def add_simple_stub(method_name, response) + setup_simple_method_double method_name, response, stubs + end + + # @private + def add_simple_expectation(method_name, response, error_generator, backtrace_line) + setup_simple_method_double method_name, response, expectations, error_generator, backtrace_line + end + + # @private + def setup_simple_method_double(method_name, response, collection, error_generator=nil, backtrace_line=nil) + define_proxy_method + + me = SimpleMessageExpectation.new(method_name, response, error_generator, backtrace_line) + collection.unshift me + me + end + + # @private + def add_default_stub(*args, &implementation) + return if stubs.any? + add_stub(*args, &implementation) + end + + # @private + def remove_stub + raise_method_not_stubbed_error if stubs.empty? + remove_stub_if_present + end + + # @private + def remove_stub_if_present + expectations.empty? ? reset : stubs.clear + end + + # @private + def raise_method_not_stubbed_error + RSpec::Mocks.error_generator.raise_method_not_stubbed_error(method_name) + end + + # In Ruby 2.0.0 and above prepend will alter the method lookup chain. + # We use an object's singleton class to define method doubles upon, + # however if the object has had its singleton class (as opposed to + # its actual class) prepended too then the the method lookup chain + # will look in the prepended module first, **before** the singleton + # class. + # + # This code works around that by providing a mock definition target + # that is either the singleton class, or if necessary, a prepended module + # of our own. + # + if Support::RubyFeatures.module_prepends_supported? + + private + + # We subclass `Module` in order to be able to easily detect our prepended module. + RSpecPrependedModule = Class.new(Module) + + def definition_target + @definition_target ||= usable_rspec_prepended_module || object_singleton_class + end + + def usable_rspec_prepended_module + @proxy.prepended_modules_of_singleton_class.each do |mod| + # If we have one of our modules prepended before one of the user's + # modules that defines the method, use that, since our module's + # definition will take precedence. + return mod if RSpecPrependedModule === mod + + # If we hit a user module with the method defined first, + # we must create a new prepend module, even if one exists later, + # because ours will only take precedence if it comes first. + return new_rspec_prepended_module if mod.method_defined?(method_name) + end + + nil + end + + def new_rspec_prepended_module + RSpecPrependedModule.new.tap do |mod| + object_singleton_class.__send__ :prepend, mod + end + end + + else + + private + + def definition_target + object_singleton_class + end + + end + + private + + def remove_method_from_definition_target + definition_target.__send__(:remove_method, @method_name) + rescue NameError + # This can happen when the method has been monkeyed with by + # something outside RSpec. This happens, for example, when + # `file.write` has been stubbed, and then `file.reopen(other_io)` + # is later called, as `File#reopen` appears to redefine `write`. + # + # Note: we could avoid rescuing this by checking + # `definition_target.instance_method(@method_name).owner == definition_target`, + # saving us from the cost of the expensive exception, but this error is + # extremely rare (it was discovered on 2014-12-30, only happens on + # RUBY_VERSION < 2.0 and our spec suite only hits this condition once), + # so we'd rather avoid the cost of that check for every method double, + # and risk the rare situation where this exception will get raised. + RSpec.warn_with( + "WARNING: RSpec could not fully restore #{@object.inspect}." \ + "#{@method_name}, possibly because the method has been redefined " \ + "by something outside of RSpec." + ) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/method_reference.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/method_reference.rb new file mode 100644 index 0000000..50608b0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/method_reference.rb @@ -0,0 +1,214 @@ +RSpec::Support.require_rspec_support 'comparable_version' + +module RSpec + module Mocks + # Represents a method on an object that may or may not be defined. + # The method may be an instance method on a module or a method on + # any object. + # + # @private + class MethodReference + def self.for(object_reference, method_name) + new(object_reference, method_name) + end + + def initialize(object_reference, method_name) + @object_reference = object_reference + @method_name = method_name + end + + # A method is implemented if sending the message does not result in + # a `NoMethodError`. It might be dynamically implemented by + # `method_missing`. + def implemented? + @object_reference.when_loaded do |m| + method_implemented?(m) + end + end + + # Returns true if we definitively know that sending the method + # will result in a `NoMethodError`. + # + # This is not simply the inverse of `implemented?`: there are + # cases when we don't know if a method is implemented and + # both `implemented?` and `unimplemented?` will return false. + def unimplemented? + @object_reference.when_loaded do |_m| + return !implemented? + end + + # If it's not loaded, then it may be implemented but we can't check. + false + end + + # A method is defined if we are able to get a `Method` object for it. + # In that case, we can assert against metadata like the arity. + def defined? + @object_reference.when_loaded do |m| + method_defined?(m) + end + end + + def with_signature + return unless (original = original_method) + yield Support::MethodSignature.new(original) + end + + def visibility + @object_reference.when_loaded do |m| + return visibility_from(m) + end + + # When it's not loaded, assume it's public. We don't want to + # wrongly treat the method as private. + :public + end + + def self.instance_method_visibility_for(klass, method_name) + if klass.public_method_defined?(method_name) + :public + elsif klass.private_method_defined?(method_name) + :private + elsif klass.protected_method_defined?(method_name) + :protected + end + end + + class << self + alias method_defined_at_any_visibility? instance_method_visibility_for + end + + def self.method_visibility_for(object, method_name) + vis = instance_method_visibility_for(class << object; self; end, method_name) + + # If the method is not defined on the class, `instance_method_visibility_for` + # returns `nil`. However, it may be handled dynamically by `method_missing`, + # so here we check `respond_to` (passing false to not check private methods). + # + # This only considers the public case, but I don't think it's possible to + # write `method_missing` in such a way that it handles a dynamic message + # with private or protected visibility. Ruby doesn't provide you with + # the caller info. + return vis unless vis.nil? + + proxy = RSpec::Mocks.space.proxy_for(object) + respond_to = proxy.method_double_if_exists_for_message(:respond_to?) + + visible = respond_to && respond_to.original_method.call(method_name) || + object.respond_to?(method_name) + + return :public if visible + end + + private + + def original_method + @object_reference.when_loaded do |m| + self.defined? && find_method(m) + end + end + end + + # @private + class InstanceMethodReference < MethodReference + private + + def method_implemented?(mod) + MethodReference.method_defined_at_any_visibility?(mod, @method_name) + end + + # Ideally, we'd use `respond_to?` for `method_implemented?` but we need a + # reference to an instance to do that and we don't have one. Note that + # we may get false negatives: if the method is implemented via + # `method_missing`, we'll return `false` even though it meets our + # definition of "implemented". However, it's the best we can do. + alias method_defined? method_implemented? + + # works around the fact that repeated calls for method parameters will + # falsely return empty arrays on JRuby in certain circumstances, this + # is necessary here because we can't dup/clone UnboundMethods. + # + # This is necessary due to a bug in JRuby prior to 1.7.5 fixed in: + # https://github.com/jruby/jruby/commit/99a0613fe29935150d76a9a1ee4cf2b4f63f4a27 + if RUBY_PLATFORM == 'java' && RSpec::Support::ComparableVersion.new(JRUBY_VERSION) < '1.7.5' + def find_method(mod) + mod.dup.instance_method(@method_name) + end + else + def find_method(mod) + mod.instance_method(@method_name) + end + end + + def visibility_from(mod) + MethodReference.instance_method_visibility_for(mod, @method_name) + end + end + + # @private + class ObjectMethodReference < MethodReference + def self.for(object_reference, method_name) + if ClassNewMethodReference.applies_to?(method_name) { object_reference.when_loaded { |o| o } } + ClassNewMethodReference.new(object_reference, method_name) + else + super + end + end + + private + + def method_implemented?(object) + object.respond_to?(@method_name, true) + end + + def method_defined?(object) + (class << object; self; end).method_defined?(@method_name) + end + + def find_method(object) + object.method(@method_name) + end + + def visibility_from(object) + MethodReference.method_visibility_for(object, @method_name) + end + end + + # When a class's `.new` method is stubbed, we want to use the method + # signature from `#initialize` because `.new`'s signature is a generic + # `def new(*args)` and it simply delegates to `#initialize` and forwards + # all args...so the method with the actually used signature is `#initialize`. + # + # This method reference implementation handles that specific case. + # @private + class ClassNewMethodReference < ObjectMethodReference + def self.applies_to?(method_name) + return false unless method_name == :new + klass = yield + return false unless ::Class === klass && klass.respond_to?(:new, true) + + # We only want to apply our special logic to normal `new` methods. + # Methods that the user has monkeyed with should be left as-is. + uses_class_new?(klass) + end + + if RUBY_VERSION.to_i >= 3 + CLASS_NEW = ::Class.instance_method(:new) + + def self.uses_class_new?(klass) + ::RSpec::Support.method_handle_for(klass, :new) == CLASS_NEW.bind(klass) + end + else # Ruby 2's Method#== is too strict + def self.uses_class_new?(klass) + ::RSpec::Support.method_handle_for(klass, :new).owner == ::Class + end + end + + def with_signature + @object_reference.when_loaded do |klass| + yield Support::MethodSignature.new(klass.instance_method(:initialize)) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/minitest_integration.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/minitest_integration.rb new file mode 100644 index 0000000..a129890 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/minitest_integration.rb @@ -0,0 +1,68 @@ +require 'rspec/mocks' + +module RSpec + module Mocks + # @private + module MinitestIntegration + include ::RSpec::Mocks::ExampleMethods + + def before_setup + ::RSpec::Mocks.setup + super + end + + def after_teardown + super + + # Only verify if there's not already an error. Otherwise + # we risk getting the same failure twice, since negative + # expectation violations raise both when the message is + # unexpectedly received, and also during `verify` (in case + # the first failure was caught by user code via a + # `rescue Exception`). + ::RSpec::Mocks.verify unless failures.any? + ensure + ::RSpec::Mocks.teardown + end + end + end +end + +Minitest::Test.send(:include, RSpec::Mocks::MinitestIntegration) + +if defined?(::Minitest::Expectation) + if defined?(::RSpec::Expectations) && ::Minitest::Expectation.method_defined?(:to) + # rspec/expectations/minitest_integration has already been loaded and + # has defined `to`/`not_to`/`to_not` on `Minitest::Expectation` so we do + # not want to here (or else we would interfere with rspec-expectations' definition). + else + # ...otherwise, define those methods now. If `rspec/expectations/minitest_integration` + # is loaded after this file, it'll override the definition here. + Minitest::Expectation.class_eval do + include RSpec::Mocks::ExpectationTargetMethods + + def to(*args) + ctx.assertions += 1 + super + end + + def not_to(*args) + ctx.assertions += 1 + super + end + + def to_not(*args) + ctx.assertions += 1 + super + end + end + end +end + +module RSpec + module Mocks + remove_const :MockExpectationError + # Raised when a message expectation is not satisfied. + MockExpectationError = ::Minitest::Assertion + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/mutate_const.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/mutate_const.rb new file mode 100644 index 0000000..071d7a2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/mutate_const.rb @@ -0,0 +1,339 @@ +RSpec::Support.require_rspec_support 'recursive_const_methods' + +module RSpec + module Mocks + # Provides information about constants that may (or may not) + # have been mutated by rspec-mocks. + class Constant + extend Support::RecursiveConstMethods + + # @api private + def initialize(name) + @name = name + @previously_defined = false + @stubbed = false + @hidden = false + @valid_name = true + yield self if block_given? + end + + # @return [String] The fully qualified name of the constant. + attr_reader :name + + # @return [Object, nil] The original value (e.g. before it + # was mutated by rspec-mocks) of the constant, or + # nil if the constant was not previously defined. + attr_accessor :original_value + + # @private + attr_writer :previously_defined, :stubbed, :hidden, :valid_name + + # @return [Boolean] Whether or not the constant was defined + # before the current example. + def previously_defined? + @previously_defined + end + + # @return [Boolean] Whether or not rspec-mocks has mutated + # (stubbed or hidden) this constant. + def mutated? + @stubbed || @hidden + end + + # @return [Boolean] Whether or not rspec-mocks has stubbed + # this constant. + def stubbed? + @stubbed + end + + # @return [Boolean] Whether or not rspec-mocks has hidden + # this constant. + def hidden? + @hidden + end + + # @return [Boolean] Whether or not the provided constant name + # is a valid Ruby constant name. + def valid_name? + @valid_name + end + + # The default `to_s` isn't very useful, so a custom version is provided. + def to_s + "#<#{self.class.name} #{name}>" + end + alias inspect to_s + + # @private + def self.unmutated(name) + previously_defined = !!recursive_const_defined?(name) + rescue NameError + new(name) do |c| + c.valid_name = false + end + else + new(name) do |const| + const.previously_defined = previously_defined + const.original_value = recursive_const_get(name) if previously_defined + end + end + + # Queries rspec-mocks to find out information about the named constant. + # + # @param [String] name the name of the constant + # @return [Constant] an object containing information about the named + # constant. + def self.original(name) + mutator = ::RSpec::Mocks.space.constant_mutator_for(name) + mutator ? mutator.to_constant : unmutated(name) + end + end + + # Provides a means to stub constants. + class ConstantMutator + extend Support::RecursiveConstMethods + + # Stubs a constant. + # + # @param (see ExampleMethods#stub_const) + # @option (see ExampleMethods#stub_const) + # @return (see ExampleMethods#stub_const) + # + # @see ExampleMethods#stub_const + # @note It's recommended that you use `stub_const` in your + # examples. This is an alternate public API that is provided + # so you can stub constants in other contexts (e.g. helper + # classes). + def self.stub(constant_name, value, options={}) + unless String === constant_name + raise ArgumentError, "`stub_const` requires a String, but you provided a #{constant_name.class.name}" + end + + mutator = if recursive_const_defined?(constant_name, &raise_on_invalid_const) + DefinedConstantReplacer + else + UndefinedConstantSetter + end + + mutate(mutator.new(constant_name, value, options[:transfer_nested_constants])) + value + end + + # Hides a constant. + # + # @param (see ExampleMethods#hide_const) + # + # @see ExampleMethods#hide_const + # @note It's recommended that you use `hide_const` in your + # examples. This is an alternate public API that is provided + # so you can hide constants in other contexts (e.g. helper + # classes). + def self.hide(constant_name) + mutate(ConstantHider.new(constant_name, nil, {})) + nil + end + + # Contains common functionality used by all of the constant mutators. + # + # @private + class BaseMutator + include Support::RecursiveConstMethods + + attr_reader :original_value, :full_constant_name + + def initialize(full_constant_name, mutated_value, transfer_nested_constants) + @full_constant_name = normalize_const_name(full_constant_name) + @mutated_value = mutated_value + @transfer_nested_constants = transfer_nested_constants + @context_parts = @full_constant_name.split('::') + @const_name = @context_parts.pop + @reset_performed = false + end + + def to_constant + const = Constant.new(full_constant_name) + const.original_value = original_value + + const + end + + def idempotently_reset + reset unless @reset_performed + @reset_performed = true + end + end + + # Hides a defined constant for the duration of an example. + # + # @private + class ConstantHider < BaseMutator + def mutate + return unless (@defined = recursive_const_defined?(full_constant_name)) + @context = recursive_const_get(@context_parts.join('::')) + @original_value = get_const_defined_on(@context, @const_name) + + @context.__send__(:remove_const, @const_name) + end + + def to_constant + return Constant.unmutated(full_constant_name) unless @defined + + const = super + const.hidden = true + const.previously_defined = true + + const + end + + def reset + return unless @defined + @context.const_set(@const_name, @original_value) + end + end + + # Replaces a defined constant for the duration of an example. + # + # @private + class DefinedConstantReplacer < BaseMutator + def initialize(*args) + super + @constants_to_transfer = [] + end + + def mutate + @context = recursive_const_get(@context_parts.join('::')) + @original_value = get_const_defined_on(@context, @const_name) + + @constants_to_transfer = verify_constants_to_transfer! + + @context.__send__(:remove_const, @const_name) + @context.const_set(@const_name, @mutated_value) + + transfer_nested_constants + end + + def to_constant + const = super + const.stubbed = true + const.previously_defined = true + + const + end + + def reset + @constants_to_transfer.each do |const| + @mutated_value.__send__(:remove_const, const) + end + + @context.__send__(:remove_const, @const_name) + @context.const_set(@const_name, @original_value) + end + + def transfer_nested_constants + @constants_to_transfer.each do |const| + @mutated_value.const_set(const, get_const_defined_on(original_value, const)) + end + end + + def verify_constants_to_transfer! + return [] unless should_transfer_nested_constants? + + { @original_value => "the original value", @mutated_value => "the stubbed value" }.each do |value, description| + next if value.respond_to?(:constants) + + raise ArgumentError, + "Cannot transfer nested constants for #{@full_constant_name} " \ + "since #{description} is not a class or module and only classes " \ + "and modules support nested constants." + end + + if Array === @transfer_nested_constants + @transfer_nested_constants = @transfer_nested_constants.map(&:to_s) if RUBY_VERSION == '1.8.7' + undefined_constants = @transfer_nested_constants - constants_defined_on(@original_value) + + if undefined_constants.any? + available_constants = constants_defined_on(@original_value) - @transfer_nested_constants + raise ArgumentError, + "Cannot transfer nested constant(s) #{undefined_constants.join(' and ')} " \ + "for #{@full_constant_name} since they are not defined. Did you mean " \ + "#{available_constants.join(' or ')}?" + end + + @transfer_nested_constants + else + constants_defined_on(@original_value) + end + end + + def should_transfer_nested_constants? + return true if @transfer_nested_constants + return false unless RSpec::Mocks.configuration.transfer_nested_constants? + @original_value.respond_to?(:constants) && @mutated_value.respond_to?(:constants) + end + end + + # Sets an undefined constant for the duration of an example. + # + # @private + class UndefinedConstantSetter < BaseMutator + def mutate + @parent = @context_parts.inject(Object) do |klass, name| + if const_defined_on?(klass, name) + get_const_defined_on(klass, name) + else + ConstantMutator.stub(name_for(klass, name), Module.new) + end + end + + @parent.const_set(@const_name, @mutated_value) + end + + def to_constant + const = super + const.stubbed = true + const.previously_defined = false + + const + end + + def reset + @parent.__send__(:remove_const, @const_name) + end + + private + + def name_for(parent, name) + root = if parent == Object + '' + else + parent.name + end + root + '::' + name + end + end + + # Uses the mutator to mutate (stub or hide) a constant. Ensures that + # the mutator is correctly registered so it can be backed out at the end + # of the test. + # + # @private + def self.mutate(mutator) + ::RSpec::Mocks.space.register_constant_mutator(mutator) + mutator.mutate + end + + # Used internally by the constant stubbing to raise a helpful + # error when a constant like "A::B::C" is stubbed and A::B is + # not a module (and thus, it's impossible to define "A::B::C" + # since only modules can have nested constants). + # + # @api private + def self.raise_on_invalid_const + lambda do |const_name, failed_name| + raise "Cannot stub constant #{failed_name} on #{const_name} " \ + "since #{const_name} is not a module." + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/object_reference.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/object_reference.rb new file mode 100644 index 0000000..cce2c33 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/object_reference.rb @@ -0,0 +1,149 @@ +module RSpec + module Mocks + # @private + class ObjectReference + # Returns an appropriate Object or Module reference based + # on the given argument. + def self.for(object_module_or_name, allow_direct_object_refs=false) + case object_module_or_name + when Module + if anonymous_module?(object_module_or_name) + DirectObjectReference.new(object_module_or_name) + else + # Use a `NamedObjectReference` if it has a name because this + # will use the original value of the constant in case it has + # been stubbed. + NamedObjectReference.new(name_of(object_module_or_name)) + end + when String + NamedObjectReference.new(object_module_or_name) + else + if allow_direct_object_refs + DirectObjectReference.new(object_module_or_name) + else + raise ArgumentError, + "Module or String expected, got #{object_module_or_name.inspect}" + end + end + end + + if Module.new.name.nil? + def self.anonymous_module?(mod) + !name_of(mod) + end + else # 1.8.7 + def self.anonymous_module?(mod) + name_of(mod) == "" + end + end + private_class_method :anonymous_module? + + def self.name_of(mod) + MODULE_NAME_METHOD.bind(mod).call + end + private_class_method :name_of + + # @private + MODULE_NAME_METHOD = Module.instance_method(:name) + end + + # An implementation of rspec-mocks' reference interface. + # Used when an object is passed to {ExampleMethods#object_double}, or + # an anonymous class or module is passed to {ExampleMethods#instance_double} + # or {ExampleMethods#class_double}. + # Represents a reference to that object. + # @see NamedObjectReference + class DirectObjectReference + # @param object [Object] the object to which this refers + def initialize(object) + @object = object + end + + # @return [String] the object's description (via `#inspect`). + def description + @object.inspect + end + + # Defined for interface parity with the other object reference + # implementations. Raises an `ArgumentError` to indicate that `as_stubbed_const` + # is invalid when passing an object argument to `object_double`. + def const_to_replace + raise ArgumentError, + "Can not perform constant replacement with an anonymous object." + end + + # The target of the verifying double (the object itself). + # + # @return [Object] + def target + @object + end + + # Always returns true for an object as the class is defined. + # + # @return [true] + def defined? + true + end + + # Yields if the reference target is loaded, providing a generic mechanism + # to optionally run a bit of code only when a reference's target is + # loaded. + # + # This specific implementation always yields because direct references + # are always loaded. + # + # @yield [Object] the target of this reference. + def when_loaded + yield @object + end + end + + # An implementation of rspec-mocks' reference interface. + # Used when a string is passed to {ExampleMethods#object_double}, + # and when a string, named class or named module is passed to + # {ExampleMethods#instance_double}, or {ExampleMethods#class_double}. + # Represents a reference to the object named (via a constant lookup) + # by the string. + # @see DirectObjectReference + class NamedObjectReference + # @param const_name [String] constant name + def initialize(const_name) + @const_name = const_name + end + + # @return [Boolean] true if the named constant is defined, false otherwise. + def defined? + !!object + end + + # @return [String] the constant name to replace with a double. + def const_to_replace + @const_name + end + alias description const_to_replace + + # @return [Object, nil] the target of the verifying double (the named object), or + # nil if it is not defined. + def target + object + end + + # Yields if the reference target is loaded, providing a generic mechanism + # to optionally run a bit of code only when a reference's target is + # loaded. + # + # @yield [Object] the target object + def when_loaded + yield object if object + end + + private + + def object + return @object if defined?(@object) + @object = Constant.original(@const_name).original_value + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/order_group.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/order_group.rb new file mode 100644 index 0000000..a994799 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/order_group.rb @@ -0,0 +1,81 @@ +module RSpec + module Mocks + # @private + class OrderGroup + def initialize + @expectations = [] + @invocation_order = [] + @index = 0 + end + + # @private + def register(expectation) + @expectations << expectation + end + + def invoked(message) + @invocation_order << message + end + + # @private + def ready_for?(expectation) + remaining_expectations.find(&:ordered?) == expectation + end + + # @private + def consume + remaining_expectations.each_with_index do |expectation, index| + next unless expectation.ordered? + + @index += index + 1 + return expectation + end + nil + end + + # @private + def handle_order_constraint(expectation) + return unless expectation.ordered? && remaining_expectations.include?(expectation) + return consume if ready_for?(expectation) + expectation.raise_out_of_order_error + end + + def verify_invocation_order(expectation) + expectation.raise_out_of_order_error unless expectations_invoked_in_order? + true + end + + def clear + @index = 0 + @invocation_order.clear + @expectations.clear + end + + def empty? + @expectations.empty? + end + + private + + def remaining_expectations + @expectations[@index..-1] || [] + end + + def expectations_invoked_in_order? + invoked_expectations == expected_invocations + end + + def invoked_expectations + @expectations.select { |e| e.ordered? && @invocation_order.include?(e) } + end + + def expected_invocations + @invocation_order.map { |invocation| expectation_for(invocation) }.compact + end + + def expectation_for(message) + @expectations.find { |e| message == e } + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/proxy.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/proxy.rb new file mode 100644 index 0000000..45beb55 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/proxy.rb @@ -0,0 +1,517 @@ +RSpec::Support.require_rspec_support 'mutex' + +module RSpec + module Mocks + # @private + class Proxy + # @private + SpecificMessage = Struct.new(:object, :message, :args) do + def ==(expectation) + expectation.orig_object == object && expectation.matches?(message, *args) + end + end + + # @private + def ensure_implemented(*_args) + # noop for basic proxies, see VerifyingProxy for behaviour. + end + + # @private + def initialize(object, order_group, options={}) + ensure_can_be_proxied!(object) + + @object = object + @order_group = order_group + @error_generator = ErrorGenerator.new(object) + @messages_received = [] + @messages_received_mutex = Support::Mutex.new + @options = options + @null_object = false + @method_doubles = Hash.new { |h, k| h[k] = MethodDouble.new(@object, k, self) } + end + + # @private + def ensure_can_be_proxied!(object) + return unless object.is_a?(Symbol) + + msg = "Cannot proxy frozen objects. Symbols such as #{object} cannot be mocked or stubbed." + raise ArgumentError, msg + end + + # @private + attr_reader :object + + # @private + def null_object? + @null_object + end + + # @private + # Tells the object to ignore any messages that aren't explicitly set as + # stubs or message expectations. + def as_null_object + @null_object = true + @object + end + + # @private + def original_method_handle_for(_message) + nil + end + + DEFAULT_MESSAGE_EXPECTATION_OPTS = {}.freeze + + # @private + def add_message_expectation(method_name, opts=DEFAULT_MESSAGE_EXPECTATION_OPTS, &block) + location = opts.fetch(:expected_from) { CallerFilter.first_non_rspec_line } + meth_double = method_double_for(method_name) + + if null_object? && !block + meth_double.add_default_stub(@error_generator, @order_group, location, opts) do + @object + end + end + + meth_double.add_expectation @error_generator, @order_group, location, opts, &block + end + + # @private + def add_simple_expectation(method_name, response, location) + method_double_for(method_name).add_simple_expectation method_name, response, @error_generator, location + end + + # @private + def build_expectation(method_name) + meth_double = method_double_for(method_name) + + meth_double.build_expectation( + @error_generator, + @order_group + ) + end + + # @private + def replay_received_message_on(expectation, &block) + expected_method_name = expectation.message + meth_double = method_double_for(expected_method_name) + + if meth_double.expectations.any? + @error_generator.raise_expectation_on_mocked_method(expected_method_name) + end + + unless null_object? || meth_double.stubs.any? + @error_generator.raise_expectation_on_unstubbed_method(expected_method_name) + end + + @messages_received_mutex.synchronize do + @messages_received.each do |(actual_method_name, args, received_block)| + next unless expectation.matches?(actual_method_name, *args) + + expectation.safe_invoke(nil) + block.call(*args, &received_block) if block + end + end + end + + # @private + def check_for_unexpected_arguments(expectation) + @messages_received_mutex.synchronize do + return if @messages_received.empty? + + return if @messages_received.any? { |method_name, args, _| expectation.matches?(method_name, *args) } + + name_but_not_args, others = @messages_received.partition do |(method_name, args, _)| + expectation.matches_name_but_not_args(method_name, *args) + end + + return if name_but_not_args.empty? && !others.empty? + + expectation.raise_unexpected_message_args_error(name_but_not_args.map { |args| args[1] }) + end + end + + # @private + def add_stub(method_name, opts={}, &implementation) + location = opts.fetch(:expected_from) { CallerFilter.first_non_rspec_line } + method_double_for(method_name).add_stub @error_generator, @order_group, location, opts, &implementation + end + + # @private + def add_simple_stub(method_name, response) + method_double_for(method_name).add_simple_stub method_name, response + end + + # @private + def remove_stub(method_name) + method_double_for(method_name).remove_stub + end + + # @private + def remove_stub_if_present(method_name) + method_double_for(method_name).remove_stub_if_present + end + + # @private + def verify + @method_doubles.each_value { |d| d.verify } + end + + # @private + def reset + @messages_received_mutex.synchronize do + @messages_received.clear + end + end + + # @private + def received_message?(method_name, *args, &block) + @messages_received_mutex.synchronize do + @messages_received.any? { |array| array == [method_name, args, block] } + end + end + + # @private + def messages_arg_list + @messages_received_mutex.synchronize do + @messages_received.map { |_, args, _| args } + end + end + + # @private + def has_negative_expectation?(message) + method_double_for(message).expectations.find { |expectation| expectation.negative_expectation_for?(message) } + end + + # @private + def record_message_received(message, *args, &block) + @order_group.invoked SpecificMessage.new(object, message, args) + @messages_received_mutex.synchronize do + @messages_received << [message, args, block] + end + end + ruby2_keywords :record_message_received if respond_to?(:ruby2_keywords, true) + + # @private + def message_received(message, *args, &block) + record_message_received message, *args, &block + + expectation = find_matching_expectation(message, *args) + stub = find_matching_method_stub(message, *args) + + if (stub && expectation && expectation.called_max_times?) || (stub && !expectation) + expectation.increase_actual_received_count! if expectation && expectation.actual_received_count_matters? + if (expectation = find_almost_matching_expectation(message, *args)) + expectation.advise(*args) unless expectation.expected_messages_received? + end + stub.invoke(nil, *args, &block) + elsif expectation + expectation.unadvise(messages_arg_list) + expectation.invoke(stub, *args, &block) + elsif (expectation = find_almost_matching_expectation(message, *args)) + expectation.advise(*args) if null_object? unless expectation.expected_messages_received? + + if null_object? || !has_negative_expectation?(message) + expectation.raise_unexpected_message_args_error([args]) + end + elsif (stub = find_almost_matching_stub(message, *args)) + stub.advise(*args) + raise_missing_default_stub_error(stub, [args]) + elsif Class === @object + @object.superclass.__send__(message, *args, &block) + else + @object.__send__(:method_missing, message, *args, &block) + end + end + ruby2_keywords :message_received if respond_to?(:ruby2_keywords, true) + + # @private + def raise_unexpected_message_error(method_name, args) + @error_generator.raise_unexpected_message_error method_name, args + end + + # @private + def raise_missing_default_stub_error(expectation, args_for_multiple_calls) + @error_generator.raise_missing_default_stub_error(expectation, args_for_multiple_calls) + end + + # @private + def visibility_for(_method_name) + # This is the default (for test doubles). Subclasses override this. + :public + end + + if Support::RubyFeatures.module_prepends_supported? + def self.prepended_modules_of(klass) + ancestors = klass.ancestors + + # `|| 0` is necessary for Ruby 2.0, where the singleton class + # is only in the ancestor list when there are prepended modules. + singleton_index = ancestors.index(klass) || 0 + + ancestors[0, singleton_index] + end + + def prepended_modules_of_singleton_class + @prepended_modules_of_singleton_class ||= RSpec::Mocks::Proxy.prepended_modules_of(@object.singleton_class) + end + end + + # @private + def method_double_if_exists_for_message(message) + method_double_for(message) if @method_doubles.key?(message.to_sym) + end + + private + + def method_double_for(message) + @method_doubles[message.to_sym] + end + + def find_matching_expectation(method_name, *args) + find_best_matching_expectation_for(method_name) do |expectation| + expectation.matches?(method_name, *args) + end + end + ruby2_keywords :find_matching_expectation if respond_to?(:ruby2_keywords, true) + + def find_almost_matching_expectation(method_name, *args) + find_best_matching_expectation_for(method_name) do |expectation| + expectation.matches_name_but_not_args(method_name, *args) + end + end + ruby2_keywords :find_almost_matching_expectation if respond_to?(:ruby2_keywords, true) + + def find_best_matching_expectation_for(method_name) + first_match = nil + + method_double_for(method_name).expectations.each do |expectation| + next unless yield expectation + return expectation unless expectation.called_max_times? + first_match ||= expectation + end + + first_match + end + + def find_matching_method_stub(method_name, *args) + method_double_for(method_name).stubs.find { |stub| stub.matches?(method_name, *args) } + end + ruby2_keywords :find_matching_method_stub if respond_to?(:ruby2_keywords, true) + + def find_almost_matching_stub(method_name, *args) + method_double_for(method_name).stubs.find { |stub| stub.matches_name_but_not_args(method_name, *args) } + end + ruby2_keywords :find_almost_matching_stub if respond_to?(:ruby2_keywords, true) + end + + # @private + class TestDoubleProxy < Proxy + def reset + @method_doubles.clear + object.__disallow_further_usage! + super + end + end + + # @private + class PartialDoubleProxy < Proxy + def original_method_handle_for(message) + if any_instance_class_recorder_observing_method?(@object.class, message) + message = ::RSpec::Mocks.space. + any_instance_recorder_for(@object.class). + build_alias_method_name(message) + end + + ::RSpec::Support.method_handle_for(@object, message) + rescue NameError + nil + end + + # @private + def add_simple_expectation(method_name, response, location) + method_double_for(method_name).configure_method + super + end + + # @private + def add_simple_stub(method_name, response) + method_double_for(method_name).configure_method + super + end + + # @private + def visibility_for(method_name) + # We fall back to :public because by default we allow undefined methods + # to be stubbed, and when we do so, we make them public. + MethodReference.method_visibility_for(@object, method_name) || :public + end + + def reset + @method_doubles.each_value { |d| d.reset } + super + end + + def message_received(message, *args, &block) + RSpec::Mocks.space.any_instance_recorders_from_ancestry_of(object).each do |subscriber| + subscriber.notify_received_message(object, message, args, block) + end + super + end + ruby2_keywords :message_received if respond_to?(:ruby2_keywords, true) + + private + + def any_instance_class_recorder_observing_method?(klass, method_name) + only_return_existing = true + recorder = ::RSpec::Mocks.space.any_instance_recorder_for(klass, only_return_existing) + return true if recorder && recorder.already_observing?(method_name) + + superklass = klass.superclass + return false if superklass.nil? + any_instance_class_recorder_observing_method?(superklass, method_name) + end + end + + # @private + # When we mock or stub a method on a class, we have to treat it a bit different, + # because normally singleton method definitions only affect the object on which + # they are defined, but on classes they affect subclasses, too. As a result, + # we need some special handling to get the original method. + module PartialClassDoubleProxyMethods + def initialize(source_space, *args) + @source_space = source_space + super(*args) + end + + # Consider this situation: + # + # class A; end + # class B < A; end + # + # allow(A).to receive(:new) + # expect(B).to receive(:new).and_call_original + # + # When getting the original definition for `B.new`, we cannot rely purely on + # using `B.method(:new)` before our redefinition is defined on `B`, because + # `B.method(:new)` will return a method that will execute the stubbed version + # of the method on `A` since singleton methods on classes are in the lookup + # hierarchy. + # + # To do it properly, we need to find the original definition of `new` from `A` + # from _before_ `A` was stubbed, and we need to rebind it to `B` so that it will + # run with the proper `self`. + # + # That's what this method (together with `original_unbound_method_handle_from_ancestor_for`) + # does. + def original_method_handle_for(message) + unbound_method = superclass_proxy && + superclass_proxy.original_unbound_method_handle_from_ancestor_for(message.to_sym) + + return super unless unbound_method + unbound_method.bind(object) + # :nocov: + rescue TypeError + if RUBY_VERSION == '1.8.7' + # In MRI 1.8.7, a singleton method on a class cannot be rebound to its subclass + if unbound_method && unbound_method.owner.ancestors.first != unbound_method.owner + # This is a singleton method; we can't do anything with it + # But we can work around this using a different implementation + double = method_double_from_ancestor_for(message) + return object.method(double.method_stasher.stashed_method_name) + end + end + raise + # :nocov: + end + + protected + + def original_unbound_method_handle_from_ancestor_for(message) + double = method_double_from_ancestor_for(message) + double && double.original_method.unbind + end + + def method_double_from_ancestor_for(message) + @method_doubles.fetch(message) do + # The fact that there is no method double for this message indicates + # that it has not been redefined by rspec-mocks. We need to continue + # looking up the ancestor chain. + return superclass_proxy && + superclass_proxy.method_double_from_ancestor_for(message) + end + end + + def superclass_proxy + return @superclass_proxy if defined?(@superclass_proxy) + + if (superclass = object.superclass) + @superclass_proxy = @source_space.superclass_proxy_for(superclass) + else + @superclass_proxy = nil + end + end + end + + # @private + class PartialClassDoubleProxy < PartialDoubleProxy + include PartialClassDoubleProxyMethods + end + + # @private + class ProxyForNil < PartialDoubleProxy + def initialize(order_group) + set_expectation_behavior + super(nil, order_group) + end + + attr_accessor :disallow_expectations + attr_accessor :warn_about_expectations + + def add_message_expectation(method_name, opts={}, &block) + warn_or_raise!(method_name) + super + end + + def add_stub(method_name, opts={}, &implementation) + warn_or_raise!(method_name) + super + end + + private + + def set_expectation_behavior + case RSpec::Mocks.configuration.allow_message_expectations_on_nil + when false + @warn_about_expectations = false + @disallow_expectations = true + when true + @warn_about_expectations = false + @disallow_expectations = false + else + @warn_about_expectations = true + @disallow_expectations = false + end + end + + def warn_or_raise!(method_name) + # This method intentionally swallows the message when + # neither disallow_expectations nor warn_about_expectations + # are set to true. + if disallow_expectations + raise_error(method_name) + elsif warn_about_expectations + warn(method_name) + end + end + + def warn(method_name) + warning_msg = @error_generator.expectation_on_nil_message(method_name) + RSpec.warning(warning_msg) + end + + def raise_error(method_name) + @error_generator.raise_expectation_on_nil_error(method_name) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/space.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/space.rb new file mode 100644 index 0000000..f933caa --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/space.rb @@ -0,0 +1,238 @@ +RSpec::Support.require_rspec_support 'reentrant_mutex' + +module RSpec + module Mocks + # @private + # Provides a default space implementation for outside + # the scope of an example. Called "root" because it serves + # as the root of the space stack. + class RootSpace + def proxy_for(*_args) + raise_lifecycle_message + end + + def any_instance_recorder_for(*_args) + raise_lifecycle_message + end + + def any_instance_proxy_for(*_args) + raise_lifecycle_message + end + + def register_constant_mutator(_mutator) + raise_lifecycle_message + end + + def any_instance_recorders_from_ancestry_of(_object) + raise_lifecycle_message + end + + def reset_all + end + + def verify_all + end + + def registered?(_object) + false + end + + def superclass_proxy_for(*_args) + raise_lifecycle_message + end + + def new_scope + Space.new + end + + private + + def raise_lifecycle_message + raise OutsideOfExampleError, + "The use of doubles or partial doubles from rspec-mocks outside of the per-test lifecycle is not supported." + end + end + + # @private + class Space + attr_reader :proxies, :any_instance_recorders, :proxy_mutex, :any_instance_mutex + + def initialize + @proxies = {} + @any_instance_recorders = {} + @constant_mutators = [] + @expectation_ordering = OrderGroup.new + @proxy_mutex = new_mutex + @any_instance_mutex = new_mutex + end + + def new_scope + NestedSpace.new(self) + end + + def verify_all + proxies.values.each { |proxy| proxy.verify } + any_instance_recorders.each_value { |recorder| recorder.verify } + end + + def reset_all + proxies.each_value { |proxy| proxy.reset } + any_instance_recorders.each_value { |recorder| recorder.stop_all_observation! } + any_instance_recorders.clear + @constant_mutators.reverse.each { |mut| mut.idempotently_reset } + end + + def register_constant_mutator(mutator) + @constant_mutators << mutator + end + + def constant_mutator_for(name) + @constant_mutators.find { |m| m.full_constant_name == name } + end + + def any_instance_recorder_for(klass, only_return_existing=false) + any_instance_mutex.synchronize do + id = klass.__id__ + any_instance_recorders.fetch(id) do + return nil if only_return_existing + any_instance_recorder_not_found_for(id, klass) + end + end + end + + def any_instance_proxy_for(klass) + AnyInstance::Proxy.new(any_instance_recorder_for(klass), proxies_of(klass)) + end + + def proxies_of(klass) + proxies.values.select { |proxy| klass === proxy.object } + end + + def proxy_for(object) + proxy_mutex.synchronize do + id = id_for(object) + proxies.fetch(id) { proxy_not_found_for(id, object) } + end + end + + def superclass_proxy_for(klass) + proxy_mutex.synchronize do + id = id_for(klass) + proxies.fetch(id) { superclass_proxy_not_found_for(id, klass) } + end + end + + alias ensure_registered proxy_for + + def registered?(object) + proxies.key?(id_for object) + end + + def any_instance_recorders_from_ancestry_of(object) + # Optimization: `any_instance` is a feature we generally + # recommend not using, so we can often early exit here + # without doing an O(N) linear search over the number of + # ancestors in the object's class hierarchy. + return [] if any_instance_recorders.empty? + + # We access the ancestors through the singleton class, to avoid calling + # `class` in case `class` has been stubbed. + (class << object; ancestors; end).map do |klass| + any_instance_recorders[klass.__id__] + end.compact + end + + private + + def new_mutex + Support::ReentrantMutex.new + end + + def proxy_not_found_for(id, object) + proxies[id] = case object + when NilClass then ProxyForNil.new(@expectation_ordering) + when TestDouble then object.__build_mock_proxy_unless_expired(@expectation_ordering) + when Class + class_proxy_with_callback_verification_strategy(object, CallbackInvocationStrategy.new) + else + if RSpec::Mocks.configuration.verify_partial_doubles? + VerifyingPartialDoubleProxy.new(object, @expectation_ordering) + else + PartialDoubleProxy.new(object, @expectation_ordering) + end + end + end + + def superclass_proxy_not_found_for(id, object) + raise "superclass_proxy_not_found_for called with something that is not a class" unless Class === object + proxies[id] = class_proxy_with_callback_verification_strategy(object, NoCallbackInvocationStrategy.new) + end + + def class_proxy_with_callback_verification_strategy(object, strategy) + if RSpec::Mocks.configuration.verify_partial_doubles? + VerifyingPartialClassDoubleProxy.new( + self, + object, + @expectation_ordering, + strategy + ) + else + PartialClassDoubleProxy.new(self, object, @expectation_ordering) + end + end + + def any_instance_recorder_not_found_for(id, klass) + any_instance_recorders[id] = AnyInstance::Recorder.new(klass) + end + + if defined?(::BasicObject) && !::BasicObject.method_defined?(:__id__) # for 1.9.2 + require 'securerandom' + + def id_for(object) + id = object.__id__ + + return id if object.equal?(::ObjectSpace._id2ref(id)) + # this suggests that object.__id__ is proxying through to some wrapped object + + object.instance_exec do + @__id_for_rspec_mocks_space ||= ::SecureRandom.uuid + end + end + else + def id_for(object) + object.__id__ + end + end + end + + # @private + class NestedSpace < Space + def initialize(parent) + @parent = parent + super() + end + + def proxies_of(klass) + super + @parent.proxies_of(klass) + end + + def constant_mutator_for(name) + super || @parent.constant_mutator_for(name) + end + + def registered?(object) + super || @parent.registered?(object) + end + + private + + def proxy_not_found_for(id, object) + @parent.proxies[id] || super + end + + def any_instance_recorder_not_found_for(id, klass) + @parent.any_instance_recorders[id] || super + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/standalone.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/standalone.rb new file mode 100644 index 0000000..74317b0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/standalone.rb @@ -0,0 +1,3 @@ +require 'rspec/mocks' +extend RSpec::Mocks::ExampleMethods +RSpec::Mocks.setup diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/syntax.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/syntax.rb new file mode 100644 index 0000000..2caabd1 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/syntax.rb @@ -0,0 +1,325 @@ +module RSpec + module Mocks + # @api private + # Provides methods for enabling and disabling the available syntaxes + # provided by rspec-mocks. + module Syntax + # @private + def self.warn_about_should! + @warn_about_should = true + end + + # @private + def self.warn_unless_should_configured(method_name , replacement="the new `:expect` syntax or explicitly enable `:should`") + if @warn_about_should + RSpec.deprecate( + "Using `#{method_name}` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax", + :replacement => replacement + ) + + @warn_about_should = false + end + end + + # @api private + # Enables the should syntax (`dbl.stub`, `dbl.should_receive`, etc). + def self.enable_should(syntax_host=default_should_syntax_host) + @warn_about_should = false if syntax_host == default_should_syntax_host + return if should_enabled?(syntax_host) + + syntax_host.class_exec do + def should_receive(message, opts={}, &block) + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) + ::RSpec::Mocks.expect_message(self, message, opts, &block) + end + + def should_not_receive(message, &block) + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) + ::RSpec::Mocks.expect_message(self, message, {}, &block).never + end + + def stub(message_or_hash, opts={}, &block) + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) + if ::Hash === message_or_hash + message_or_hash.each { |message, value| stub(message).and_return value } + else + ::RSpec::Mocks.allow_message(self, message_or_hash, opts, &block) + end + end + + def unstub(message) + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__, "`allow(...).to receive(...).and_call_original` or explicitly enable `:should`") + ::RSpec::Mocks.space.proxy_for(self).remove_stub(message) + end + + def stub_chain(*chain, &blk) + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) + ::RSpec::Mocks::StubChain.stub_chain_on(self, *chain, &blk) + end + + def as_null_object + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) + @_null_object = true + ::RSpec::Mocks.space.proxy_for(self).as_null_object + end + + def null_object? + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) + defined?(@_null_object) + end + + def received_message?(message, *args, &block) + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) + ::RSpec::Mocks.space.proxy_for(self).received_message?(message, *args, &block) + end + + unless Class.respond_to? :any_instance + Class.class_exec do + def any_instance + ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) + ::RSpec::Mocks.space.any_instance_proxy_for(self) + end + end + end + end + end + + # @api private + # Disables the should syntax (`dbl.stub`, `dbl.should_receive`, etc). + def self.disable_should(syntax_host=default_should_syntax_host) + return unless should_enabled?(syntax_host) + + syntax_host.class_exec do + undef should_receive + undef should_not_receive + undef stub + undef unstub + undef stub_chain + undef as_null_object + undef null_object? + undef received_message? + end + + Class.class_exec do + undef any_instance + end + end + + # @api private + # Enables the expect syntax (`expect(dbl).to receive`, `allow(dbl).to receive`, etc). + def self.enable_expect(syntax_host=::RSpec::Mocks::ExampleMethods) + return if expect_enabled?(syntax_host) + + syntax_host.class_exec do + def receive(method_name, &block) + Matchers::Receive.new(method_name, block) + end + + def receive_messages(message_return_value_hash, &_block) + matcher = Matchers::ReceiveMessages.new(message_return_value_hash) + matcher.warn_about_block if block_given? + matcher + end + + def receive_message_chain(*messages, &block) + Matchers::ReceiveMessageChain.new(messages, &block) + end + + def allow(target) + AllowanceTarget.new(target) + end + + def expect_any_instance_of(klass) + AnyInstanceExpectationTarget.new(klass) + end + + def allow_any_instance_of(klass) + AnyInstanceAllowanceTarget.new(klass) + end + end + + RSpec::Mocks::ExampleMethods::ExpectHost.class_exec do + def expect(target) + ExpectationTarget.new(target) + end + end + end + + # @api private + # Disables the expect syntax (`expect(dbl).to receive`, `allow(dbl).to receive`, etc). + def self.disable_expect(syntax_host=::RSpec::Mocks::ExampleMethods) + return unless expect_enabled?(syntax_host) + + syntax_host.class_exec do + undef receive + undef receive_messages + undef receive_message_chain + undef allow + undef expect_any_instance_of + undef allow_any_instance_of + end + + RSpec::Mocks::ExampleMethods::ExpectHost.class_exec do + undef expect + end + end + + # @api private + # Indicates whether or not the should syntax is enabled. + def self.should_enabled?(syntax_host=default_should_syntax_host) + syntax_host.method_defined?(:should_receive) + end + + # @api private + # Indicates whether or not the expect syntax is enabled. + def self.expect_enabled?(syntax_host=::RSpec::Mocks::ExampleMethods) + syntax_host.method_defined?(:allow) + end + + # @api private + # Determines where the methods like `should_receive`, and `stub` are added. + def self.default_should_syntax_host + # JRuby 1.7.4 introduces a regression whereby `defined?(::BasicObject) => nil` + # yet `BasicObject` still exists and patching onto ::Object breaks things + # e.g. SimpleDelegator expectations won't work + # + # See: https://github.com/jruby/jruby/issues/814 + if defined?(JRUBY_VERSION) && JRUBY_VERSION == '1.7.4' && RUBY_VERSION.to_f > 1.8 + return ::BasicObject + end + + # On 1.8.7, Object.ancestors.last == Kernel but + # things blow up if we include `RSpec::Mocks::Methods` + # into Kernel...not sure why. + return Object unless defined?(::BasicObject) + + # MacRuby has BasicObject but it's not the root class. + return Object unless Object.ancestors.last == ::BasicObject + + ::BasicObject + end + end + end +end + +if defined?(BasicObject) + # The legacy `:should` syntax adds the following methods directly to + # `BasicObject` so that they are available off of any object. Note, however, + # that this syntax does not always play nice with delegate/proxy objects. + # We recommend you use the non-monkeypatching `:expect` syntax instead. + # @see Class + class BasicObject + # @method should_receive + # Sets an expectation that this object should receive a message before + # the end of the example. + # + # @example + # logger = double('logger') + # thing_that_logs = ThingThatLogs.new(logger) + # logger.should_receive(:log) + # thing_that_logs.do_something_that_logs_a_message + # + # @note This is only available when you have enabled the `should` syntax. + # @see RSpec::Mocks::ExampleMethods#expect + + # @method should_not_receive + # Sets and expectation that this object should _not_ receive a message + # during this example. + # @see RSpec::Mocks::ExampleMethods#expect + + # @method stub + # Tells the object to respond to the message with the specified value. + # + # @example + # counter.stub(:count).and_return(37) + # counter.stub(:count => 37) + # counter.stub(:count) { 37 } + # + # @note This is only available when you have enabled the `should` syntax. + # @see RSpec::Mocks::ExampleMethods#allow + + # @method unstub + # Removes a stub. On a double, the object will no longer respond to + # `message`. On a real object, the original method (if it exists) is + # restored. + # + # This is rarely used, but can be useful when a stub is set up during a + # shared `before` hook for the common case, but you want to replace it + # for a special case. + # + # @note This is only available when you have enabled the `should` syntax. + + # @method stub_chain + # @overload stub_chain(method1, method2) + # @overload stub_chain("method1.method2") + # @overload stub_chain(method1, method_to_value_hash) + # + # Stubs a chain of methods. + # + # ## Warning: + # + # Chains can be arbitrarily long, which makes it quite painless to + # violate the Law of Demeter in violent ways, so you should consider any + # use of `stub_chain` a code smell. Even though not all code smells + # indicate real problems (think fluent interfaces), `stub_chain` still + # results in brittle examples. For example, if you write + # `foo.stub_chain(:bar, :baz => 37)` in a spec and then the + # implementation calls `foo.baz.bar`, the stub will not work. + # + # @example + # double.stub_chain("foo.bar") { :baz } + # double.stub_chain(:foo, :bar => :baz) + # double.stub_chain(:foo, :bar) { :baz } + # + # # Given any of ^^ these three forms ^^: + # double.foo.bar # => :baz + # + # # Common use in Rails/ActiveRecord: + # Article.stub_chain("recent.published") { [Article.new] } + # + # @note This is only available when you have enabled the `should` syntax. + # @see RSpec::Mocks::ExampleMethods#receive_message_chain + + # @method as_null_object + # Tells the object to respond to all messages. If specific stub values + # are declared, they'll work as expected. If not, the receiver is + # returned. + # + # @note This is only available when you have enabled the `should` syntax. + + # @method null_object? + # Returns true if this object has received `as_null_object` + # + # @note This is only available when you have enabled the `should` syntax. + end +end + +# The legacy `:should` syntax adds the `any_instance` to `Class`. +# We generally recommend you use the newer `:expect` syntax instead, +# which allows you to stub any instance of a class using +# `allow_any_instance_of(klass)` or mock any instance using +# `expect_any_instance_of(klass)`. +# @see BasicObject +class Class + # @method any_instance + # Used to set stubs and message expectations on any instance of a given + # class. Returns a [Recorder](Recorder), which records messages like + # `stub` and `should_receive` for later playback on instances of the + # class. + # + # @example + # Car.any_instance.should_receive(:go) + # race = Race.new + # race.cars << Car.new + # race.go # assuming this delegates to all of its cars + # # this example would pass + # + # Account.any_instance.stub(:balance) { Money.new(:USD, 25) } + # Account.new.balance # => Money.new(:USD, 25)) + # + # @return [Recorder] + # + # @note This is only available when you have enabled the `should` syntax. + # @see RSpec::Mocks::ExampleMethods#expect_any_instance_of + # @see RSpec::Mocks::ExampleMethods#allow_any_instance_of +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/targets.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/targets.rb new file mode 100644 index 0000000..26f7287 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/targets.rb @@ -0,0 +1,124 @@ +module RSpec + module Mocks + # @private + module TargetDelegationClassMethods + def delegate_to(matcher_method) + define_method(:to) do |matcher, &block| + unless matcher_allowed?(matcher) + raise_unsupported_matcher(:to, matcher) + end + define_matcher(matcher, matcher_method, &block) + end + end + + def delegate_not_to(matcher_method, options={}) + method_name = options.fetch(:from) + define_method(method_name) do |matcher, &block| + case matcher + when Matchers::Receive, Matchers::HaveReceived + define_matcher(matcher, matcher_method, &block) + when Matchers::ReceiveMessages, Matchers::ReceiveMessageChain + raise_negation_unsupported(method_name, matcher) + else + raise_unsupported_matcher(method_name, matcher) + end + end + end + + def disallow_negation(method_name) + define_method(method_name) do |matcher, *_args| + raise_negation_unsupported(method_name, matcher) + end + end + end + + # @private + module TargetDelegationInstanceMethods + attr_reader :target + + private + + def matcher_allowed?(matcher) + Matchers::Matcher === matcher + end + + def define_matcher(matcher, name, &block) + matcher.__send__(name, target, &block) + end + + def raise_unsupported_matcher(method_name, matcher) + raise UnsupportedMatcherError, + "only the `receive`, `have_received` and `receive_messages` matchers are supported " \ + "with `#{expression}(...).#{method_name}`, but you have provided: #{matcher}" + end + + def raise_negation_unsupported(method_name, matcher) + raise NegationUnsupportedError, + "`#{expression}(...).#{method_name} #{matcher.matcher_name}` is not supported since it " \ + "doesn't really make sense. What would it even mean?" + end + end + + # @private + class TargetBase + def initialize(target) + @target = target + end + + extend TargetDelegationClassMethods + include TargetDelegationInstanceMethods + end + + # @private + module ExpectationTargetMethods + extend TargetDelegationClassMethods + include TargetDelegationInstanceMethods + + delegate_to :setup_expectation + delegate_not_to :setup_negative_expectation, :from => :not_to + delegate_not_to :setup_negative_expectation, :from => :to_not + + def expression + :expect + end + end + + # @private + class ExpectationTarget < TargetBase + include ExpectationTargetMethods + end + + # @private + class AllowanceTarget < TargetBase + def expression + :allow + end + + delegate_to :setup_allowance + disallow_negation :not_to + disallow_negation :to_not + end + + # @private + class AnyInstanceAllowanceTarget < TargetBase + def expression + :allow_any_instance_of + end + + delegate_to :setup_any_instance_allowance + disallow_negation :not_to + disallow_negation :to_not + end + + # @private + class AnyInstanceExpectationTarget < TargetBase + def expression + :expect_any_instance_of + end + + delegate_to :setup_any_instance_expectation + delegate_not_to :setup_any_instance_negative_expectation, :from => :not_to + delegate_not_to :setup_any_instance_negative_expectation, :from => :to_not + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/test_double.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/test_double.rb new file mode 100644 index 0000000..fed46dd --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/test_double.rb @@ -0,0 +1,173 @@ +module RSpec + module Mocks + # Implements the methods needed for a pure test double. RSpec::Mocks::Double + # includes this module, and it is provided for cases where you want a + # pure test double without subclassing RSpec::Mocks::Double. + module TestDouble + # Creates a new test double with a `name` (that will be used in error + # messages only) + def initialize(name=nil, stubs={}) + @__expired = false + if Hash === name && stubs.empty? + stubs = name + @name = nil + else + @name = name + end + assign_stubs(stubs) + end + + # Tells the object to respond to all messages. If specific stub values + # are declared, they'll work as expected. If not, the receiver is + # returned. + def as_null_object + __mock_proxy.as_null_object + end + + # Returns true if this object has received `as_null_object` + def null_object? + __mock_proxy.null_object? + end + + # This allows for comparing the mock to other objects that proxy such as + # ActiveRecords belongs_to proxy objects. By making the other object run + # the comparison, we're sure the call gets delegated to the proxy + # target. + def ==(other) + other == __mock_proxy + end + + # @private + def inspect + TestDoubleFormatter.format(self) + end + + # @private + def to_s + inspect.tr('<', '[').tr('>', ']') + end + + # @private + def respond_to?(message, incl_private=false) + return true if __mock_proxy.null_object? + + super + end + + # @private + def __build_mock_proxy_unless_expired(order_group) + __raise_expired_error || __build_mock_proxy(order_group) + end + + # @private + def __disallow_further_usage! + @__expired = true + end + + # Override for default freeze implementation to prevent freezing of test + # doubles. + def freeze + RSpec.warn_with("WARNING: you attempted to freeze a test double. This is explicitly a no-op as freezing doubles can lead to undesired behaviour when resetting tests.") + self + end + + private + + def method_missing(message, *args, &block) + proxy = __mock_proxy + proxy.record_message_received(message, *args, &block) + + if proxy.null_object? + case message + when :to_int then return 0 + when :to_a, :to_ary then return nil + when :to_str then return to_s + else return self + end + end + + # Defined private and protected methods will still trigger `method_missing` + # when called publicly. We want ruby's method visibility error to get raised, + # so we simply delegate to `super` in that case. + # ...well, we would delegate to `super`, but there's a JRuby + # bug, so we raise our own visibility error instead: + # https://github.com/jruby/jruby/issues/1398 + visibility = proxy.visibility_for(message) + if visibility == :private || visibility == :protected + ErrorGenerator.new(self).raise_non_public_error( + message, visibility + ) + end + + # Required wrapping doubles in an Array on Ruby 1.9.2 + raise NoMethodError if [:to_a, :to_ary].include? message + proxy.raise_unexpected_message_error(message, args) + end + + def assign_stubs(stubs) + stubs.each_pair do |message, response| + __mock_proxy.add_simple_stub(message, response) + end + end + + def __mock_proxy + ::RSpec::Mocks.space.proxy_for(self) + end + + def __build_mock_proxy(order_group) + TestDoubleProxy.new(self, order_group) + end + + def __raise_expired_error + return false unless @__expired + ErrorGenerator.new(self).raise_expired_test_double_error + end + + def initialize_copy(other) + as_null_object if other.null_object? + super + end + end + + # A generic test double object. `double`, `instance_double` and friends + # return an instance of this. + class Double + include TestDouble + end + + # @private + module TestDoubleFormatter + def self.format(dbl, unwrap=false) + format = "#{type_desc(dbl)}#{verified_module_desc(dbl)} #{name_desc(dbl)}" + return format if unwrap + "#<#{format}>" + end + + class << self + private + + def type_desc(dbl) + case dbl + when InstanceVerifyingDouble then "InstanceDouble" + when ClassVerifyingDouble then "ClassDouble" + when ObjectVerifyingDouble then "ObjectDouble" + else "Double" + end + end + + # @private + IVAR_GET = Object.instance_method(:instance_variable_get) + + def verified_module_desc(dbl) + return nil unless VerifyingDouble === dbl + "(#{IVAR_GET.bind(dbl).call(:@doubled_module).description})" + end + + def name_desc(dbl) + return "(anonymous)" unless (name = IVAR_GET.bind(dbl).call(:@name)) + name.inspect + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_double.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_double.rb new file mode 100644 index 0000000..3402967 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_double.rb @@ -0,0 +1,125 @@ +RSpec::Support.require_rspec_mocks 'verifying_proxy' + +module RSpec + module Mocks + # @private + module VerifyingDouble + def respond_to?(message, include_private=false) + return super unless null_object? + + method_ref = __mock_proxy.method_reference[message] + + case method_ref.visibility + when :public then true + when :private then include_private + when :protected then include_private || RUBY_VERSION.to_f < 2.0 + else !method_ref.unimplemented? + end + end + + def method_missing(message, *args, &block) + # Null object conditional is an optimization. If not a null object, + # validity of method expectations will have been checked at definition + # time. + if null_object? + if @__sending_message == message + __mock_proxy.ensure_implemented(message) + else + __mock_proxy.ensure_publicly_implemented(message, self) + end + + __mock_proxy.validate_arguments!(message, args) + end + + super + end + + # Redefining `__send__` causes ruby to issue a warning. + old, $VERBOSE = $VERBOSE, nil + # rubocop:disable Naming/MethodName + def __send__(name, *args, &block) + @__sending_message = name + super + ensure + @__sending_message = nil + end + # rubocop:enable Naming/MethodName + ruby2_keywords :__send__ if respond_to?(:ruby2_keywords, true) + $VERBOSE = old + + def send(name, *args, &block) + __send__(name, *args, &block) + end + ruby2_keywords :send if respond_to?(:ruby2_keywords, true) + + def initialize(doubled_module, *args) + @doubled_module = doubled_module + + possible_name = args.first + name = if String === possible_name || Symbol === possible_name + args.shift + end + + super(name, *args) + @__sending_message = nil + end + end + + # A mock providing a custom proxy that can verify the validity of any + # method stubs or expectations against the public instance methods of the + # given class. + # + # @private + class InstanceVerifyingDouble + include TestDouble + include VerifyingDouble + + def __build_mock_proxy(order_group) + VerifyingProxy.new(self, order_group, + @doubled_module, + InstanceMethodReference + ) + end + end + + # An awkward module necessary because we cannot otherwise have + # ClassVerifyingDouble inherit from Module and still share these methods. + # + # @private + module ObjectVerifyingDoubleMethods + include TestDouble + include VerifyingDouble + + def as_stubbed_const(options={}) + ConstantMutator.stub(@doubled_module.const_to_replace, self, options) + self + end + + private + + def __build_mock_proxy(order_group) + VerifyingProxy.new(self, order_group, + @doubled_module, + ObjectMethodReference + ) + end + end + + # Similar to an InstanceVerifyingDouble, except that it verifies against + # public methods of the given object. + # + # @private + class ObjectVerifyingDouble + include ObjectVerifyingDoubleMethods + end + + # Effectively the same as an ObjectVerifyingDouble (since a class is a type + # of object), except with Module in the inheritance chain so that + # transferring nested constants to work. + # + # @private + class ClassVerifyingDouble < Module + include ObjectVerifyingDoubleMethods + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_message_expectation.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_message_expectation.rb new file mode 100644 index 0000000..d6dcb57 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_message_expectation.rb @@ -0,0 +1,55 @@ +RSpec::Support.require_rspec_support 'method_signature_verifier' + +module RSpec + module Mocks + # A message expectation that knows about the real implementation of the + # message being expected, so that it can verify that any expectations + # have the valid arguments. + # @api private + class VerifyingMessageExpectation < MessageExpectation + # A level of indirection is used here rather than just passing in the + # method itself, since method look up is expensive and we only want to + # do it if actually needed. + # + # Conceptually the method reference makes more sense as a constructor + # argument since it should be immutable, but it is significantly more + # straight forward to build the object in pieces so for now it stays as + # an accessor. + attr_accessor :method_reference + + def initialize(*args) + super + end + + # @private + def with(*args, &block) + super(*args, &block).tap do + validate_expected_arguments! do |signature| + example_call_site_args = [:an_arg] * signature.min_non_kw_args + example_call_site_args << :kw_args_hash if signature.required_kw_args.any? + @argument_list_matcher.resolve_expected_args_based_on(example_call_site_args) + end + end + end + ruby2_keywords(:with) if respond_to?(:ruby2_keywords, true) + + private + + def validate_expected_arguments! + return if method_reference.nil? + + method_reference.with_signature do |signature| + args = yield signature + verifier = Support::LooseSignatureVerifier.new(signature, args) + + unless verifier.valid? + # Fail fast is required, otherwise the message expectation will fail + # as well ("expected method not called") and clobber this one. + @failed_fast = true + @error_generator.raise_invalid_arguments_error(verifier) + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_proxy.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_proxy.rb new file mode 100644 index 0000000..6147b81 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_proxy.rb @@ -0,0 +1,221 @@ +RSpec::Support.require_rspec_mocks 'verifying_message_expectation' +RSpec::Support.require_rspec_mocks 'method_reference' + +module RSpec + module Mocks + # @private + class CallbackInvocationStrategy + def call(doubled_module) + RSpec::Mocks.configuration.verifying_double_callbacks.each do |block| + block.call doubled_module + end + end + end + + # @private + class NoCallbackInvocationStrategy + def call(_doubled_module) + end + end + + # @private + module VerifyingProxyMethods + def add_stub(method_name, opts={}, &implementation) + ensure_implemented(method_name) + super + end + + def add_simple_stub(method_name, *args) + ensure_implemented(method_name) + super + end + + def add_message_expectation(method_name, opts={}, &block) + ensure_implemented(method_name) + super + end + + def ensure_implemented(method_name) + return unless method_reference[method_name].unimplemented? + + @error_generator.raise_unimplemented_error( + @doubled_module, + method_name, + @object + ) + end + + def ensure_publicly_implemented(method_name, _object) + ensure_implemented(method_name) + visibility = method_reference[method_name].visibility + + return if visibility == :public + @error_generator.raise_non_public_error(method_name, visibility) + end + end + + # A verifying proxy mostly acts like a normal proxy, except that it + # contains extra logic to try and determine the validity of any expectation + # set on it. This includes whether or not methods have been defined and the + # validity of arguments on method calls. + # + # In all other ways this behaves like a normal proxy. It only adds the + # verification behaviour to specific methods then delegates to the parent + # implementation. + # + # These checks are only activated if the doubled class has already been + # loaded, otherwise they are disabled. This allows for testing in + # isolation. + # + # @private + class VerifyingProxy < TestDoubleProxy + include VerifyingProxyMethods + + def initialize(object, order_group, doubled_module, method_reference_class) + super(object, order_group) + @object = object + @doubled_module = doubled_module + @method_reference_class = method_reference_class + + # A custom method double is required to pass through a way to lookup + # methods to determine their parameters. This is only relevant if the doubled + # class is loaded. + @method_doubles = Hash.new do |h, k| + h[k] = VerifyingMethodDouble.new(@object, k, self, method_reference[k]) + end + end + + def method_reference + @method_reference ||= Hash.new do |h, k| + h[k] = @method_reference_class.for(@doubled_module, k) + end + end + + def visibility_for(method_name) + method_reference[method_name].visibility + end + + def validate_arguments!(method_name, args) + @method_doubles[method_name].validate_arguments!(args) + end + end + + # @private + DEFAULT_CALLBACK_INVOCATION_STRATEGY = CallbackInvocationStrategy.new + + # @private + class VerifyingPartialDoubleProxy < PartialDoubleProxy + include VerifyingProxyMethods + + def initialize(object, expectation_ordering, optional_callback_invocation_strategy=DEFAULT_CALLBACK_INVOCATION_STRATEGY) + super(object, expectation_ordering) + @doubled_module = DirectObjectReference.new(object) + + # A custom method double is required to pass through a way to lookup + # methods to determine their parameters. + @method_doubles = Hash.new do |h, k| + h[k] = VerifyingExistingMethodDouble.for(object, k, self) + end + + optional_callback_invocation_strategy.call(@doubled_module) + end + + def ensure_implemented(_method_name) + return if Mocks.configuration.temporarily_suppress_partial_double_verification + super + end + + def method_reference + @method_doubles + end + end + + # @private + class VerifyingPartialClassDoubleProxy < VerifyingPartialDoubleProxy + include PartialClassDoubleProxyMethods + end + + # @private + class VerifyingMethodDouble < MethodDouble + def initialize(object, method_name, proxy, method_reference) + super(object, method_name, proxy) + @method_reference = method_reference + end + + def message_expectation_class + VerifyingMessageExpectation + end + + def add_expectation(*args, &block) + # explicit params necessary for 1.8.7 see #626 + super(*args, &block).tap { |x| x.method_reference = @method_reference } + end + + def add_stub(*args, &block) + # explicit params necessary for 1.8.7 see #626 + super(*args, &block).tap { |x| x.method_reference = @method_reference } + end + + def proxy_method_invoked(obj, *args, &block) + validate_arguments!(args) + super + end + ruby2_keywords :proxy_method_invoked if respond_to?(:ruby2_keywords, true) + + def validate_arguments!(actual_args) + @method_reference.with_signature do |signature| + verifier = Support::StrictSignatureVerifier.new(signature, actual_args) + raise ArgumentError, verifier.error_message unless verifier.valid? + end + end + end + + # A VerifyingMethodDouble fetches the method to verify against from the + # original object, using a MethodReference. This works for pure doubles, + # but when the original object is itself the one being modified we need to + # collapse the reference and the method double into a single object so that + # we can access the original pristine method definition. + # + # @private + class VerifyingExistingMethodDouble < VerifyingMethodDouble + def initialize(object, method_name, proxy) + super(object, method_name, proxy, self) + + @valid_method = object.respond_to?(method_name, true) + + # Trigger an eager find of the original method since if we find it any + # later we end up getting a stubbed method with incorrect arity. + save_original_implementation_callable! + end + + def with_signature + yield Support::MethodSignature.new(original_implementation_callable) + end + + def unimplemented? + !@valid_method + end + + def self.for(object, method_name, proxy) + if ClassNewMethodReference.applies_to?(method_name) { object } + VerifyingExistingClassNewMethodDouble + elsif Mocks.configuration.temporarily_suppress_partial_double_verification + MethodDouble + else + self + end.new(object, method_name, proxy) + end + end + + # Used in place of a `VerifyingExistingMethodDouble` for the specific case + # of mocking or stubbing a `new` method on a class. In this case, we substitute + # the method signature from `#initialize` since new's signature is just `*args`. + # + # @private + class VerifyingExistingClassNewMethodDouble < VerifyingExistingMethodDouble + def with_signature + yield Support::MethodSignature.new(object.instance_method(:initialize)) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/version.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/version.rb new file mode 100644 index 0000000..9b42c77 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/version.rb @@ -0,0 +1,9 @@ +module RSpec + module Mocks + # Version information for RSpec mocks. + module Version + # Version of RSpec mocks currently in use in SemVer format. + STRING = '3.13.5' + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/Changelog.md b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/Changelog.md new file mode 100644 index 0000000..b13ecbb --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/Changelog.md @@ -0,0 +1,429 @@ +### Development +[Full Changelog](https://github.com/rspec/rspec/compare/rspec-support-v3.13.5...3-13-maintenance) + +### 3.13.5 +[Full Changelog](http://github.com/rspec/rspec/compare/rspec-support-v3.13.4...rspec-support-v3.13.5) + +Bug Fixes: + +* Fix regression in `RSpec::Support::MethodSignature` where positional argument arity confused + a check for keyword arguments, meaning a hash would be wrongly detected as keyword arguments + when it should have been a positional argument. (Malcolm O'Hare, rspec/rspec#121) + +### 3.13.4 +[Full Changelog](http://github.com/rspec/rspec/compare/rspec-support-v3.13.3...rspec-support-v3.13.4) + +Bug Fixes: + +* Fix homepage link in gemspec. (Jon Rowe) + +### 3.13.3 / 2025-04-30 +[Full Changelog](http://github.com/rspec/rspec/compare/rspec-support-v3.13.2...rspec-support-v3.13.3) + +Bug Fixes: + +* Support for changes in diff-lcs and Ruby 3.4 in spec helpers. (Jon Rowe, #164 etc) + +### 3.13.2 / 2024-12-02 +[Full Changelog](http://github.com/rspec/rspec/compare/rspec-support-v3.13.1...rspec-support-v3.13.2) + +No changes. Released during the monorepo migration to test release processes, but accidentally +contained no changes. + +### 3.13.1 / 2024-02-23 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.13.0...v3.13.1) + +Bug Fixes: + +* Exclude ruby internal require warnings from `RSpec::Support::CallerFilter#first_non_rspec_line`. + (Jon Rowe, rspec/rspec-support#593) + +### 3.13.0 / 2024-02-04 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.12.2...v3.13.0) + +Enchancements + +* Add `RubyFeatures#supports_syntax_suggest?`. (Jon Rowe, rspec/rspec-support#571) + +Bug Fixes: + +* Allow string keys for keyword arguments during verification of method + signatures, (but only on Ruby 3+). (@malcolmohare, rspec/rspec-support#591) + +### 3.12.2 / 2024-02-04 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.12.1...v3.12.2) + +Bug Fixes: + +* Properly surface errors from `in_sub_process`. (Jon Rowe, rspec/rspec-support#575) +* Add magic comment for freezing string literals. (Josh Nichols, rspec/rspec-support#586) + +### 3.12.1 / 2023-06-26 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.12.0...v3.12.1) + +Bug Fixes: + +* Fix `RSpec::Support.thread_local_data` to be Thread local but not Fiber local. + (Jon Rowe, rspec/rspec-support#581) + +### 3.12.0 / 2022-10-26 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.11.1...v3.12.0) +Enhancements: + +* Add `RSpec::Support::RubyFeatures.distincts_kw_args_from_positional_hash?` + (Jean byroot Boussier, rspec/rspec-support#535) + +### 3.11.1 / 2022-09-12 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.11.0...v3.11.1) + +Bug Fixes: + +* Fix ripper detection on TruffleRuby. (Brandon Fish, rspec/rspec-support#541) + +### 3.11.0 / 2022-02-09 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.10.3...v3.11.0) + +No changes. Released to support other RSpec releases. + +### 3.10.3 / 2021-11-03 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.10.2...v3.10.3) + +Bug Fixes: + +* Use `Mutex#owned?` to allow `RSpec::Support::ReentrantMutex` to work in + nested Fibers on Ruby 3.0 and later. (Benoit Daloze, rspec/rspec-support#503, rspec/rspec-support#504) +* Support `end`-less methods in `RSpec::Support::Source::Token` + so that RSpec won't hang when an `end`-less method raises an error. (Yuji Nakayama, rspec/rspec-support#505) + +### 3.10.2 / 2021-01-28 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.10.1...v3.10.2) + +Bug Fixes: + +* Fix issue with `RSpec::Support.define_optimized_require_for_rspec` on JRuby + 9.1.17.0 (Jon Rowe, rspec/rspec-support#492) + +### 3.10.1 / 2020-12-27 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.10.0...v3.10.1) + +Bug Fixes: + +* Fix deprecation expectations to fail correctly when + asserting on messages. (Phil Pirozhkov, rspec/rspec-support#453) + +### 3.10.0 / 2020-10-30 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.4...v3.10.0) + +No changes. Released to support other RSpec releases. + +### 3.9.4 / 2020-10-23 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.3...v3.9.4) + +Bug Fixes: + +* Flag ripper as supported on Truffle Ruby. (Brandon Fish, rspec/rspec-support#427) +* Prevent stubbing `File.read` from breaking source extraction. + (Jon Rowe, rspec/rspec-support#431) + +### 3.9.3 / 2020-05-02 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.2...v3.9.3) + +Bug Fixes: + +* Mark ripper as unsupported on Truffle Ruby. (Brandon Fish, rspec/rspec-support#395) +* Mark ripper as unsupported on JRuby 9.2.0.0. (Brian Hawley, rspec/rspec-support#400) +* Capture `Mutex.new` for our `RSpec::Support:Mutex` in order to + allow stubbing `Mutex.new`. (Jon Rowe, rspec/rspec-support#411) + +### 3.9.2 / 2019-12-30 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.1...v3.9.2) + +Bug Fixes: + +* Remove unneeded eval. (Matijs van Zuijlen, rspec/rspec-support#394) + +### 3.9.1 / 2019-12-28 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.0...v3.9.1) + +Bug Fixes: + +* Remove warning caused by keyword arguments on Ruby 2.7.0. + (Jon Rowe, rspec/rspec-support#392) + +### 3.9.0 / 2019-10-07 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.3...v3.9.0) + +*NO CHANGES* + +Version 3.9.0 was released to allow other RSpec gems to release 3.9.0. + +### 3.8.3 / 2019-10-02 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.2...v3.8.3) + +Bug Fixes: + +* Escape \r when outputting strings inside arrays. + (Tomita Masahiro, Jon Rowe, rspec/rspec-support#378) +* Ensure that optional hash arguments are recognised correctly vs keyword + arguments. (Evgeni Dzhelyov, rspec/rspec-support#366) + +### 3.8.2 / 2019-06-10 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.1...v3.8.2) + +Bug Fixes: + +* Ensure that an empty hash is recognised as empty keyword arguments when + applicable. (Thomas Walpole, rspec/rspec-support#375) +* Ensure that diffing truthy values produce diffs consistently. + (Lucas Nestor, rspec/rspec-support#377) + +### 3.8.1 / 2019-03-03 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.0...v3.8.1) + +Bug Fixes: + +* Ensure that inspecting a `SimpleDelegator` based object works regardless of + visibility of the `__getobj__` method. (Jon Rowe, rspec/rspec-support#369) + +### 3.8.0 / 2018-08-04 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.7.1...v3.8.0) + +Bug Fixes: + +* Order hash keys before diffing to improve diff accuracy when using mocked calls. + (James Crisp, rspec/rspec-support#334) + +### 3.7.1 / 2018-01-29 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.7.0...v3.7.1) + +Bug Fixes: + +* Fix source extraction logic so that it does not trigger a `SystemStackError` + when processing deeply nested example groups. (Craig Bass, rspec/rspec-support#343) + +### 3.7.0 / 2017-10-17 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.6.0...v3.7.0) + +Enhancements: + +* Improve compatibility with `--enable-frozen-string-literal` option + on Ruby 2.3+. (Pat Allan, rspec/rspec-support#320) +* Add `Support.class_of` for extracting class of any object. + (Yuji Nakayama, rspec/rspec-support#325) + +Bug Fixes: + +* Fix recursive const support to not blow up when given buggy classes + that raise odd errors from `#to_str`. (Myron Marston, rspec/rspec-support#317) + +### 3.6.0 / 2017-05-04 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.6.0.beta2...3.6.0) + +Enhancements: + +* Import `Source` classes from rspec-core. (Yuji Nakayama, rspec/rspec-support#315) + +### 3.6.0.beta2 / 2016-12-12 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.6.0.beta1...v3.6.0.beta2) + +No user-facing changes. + +### 3.6.0.beta1 / 2016-10-09 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0...v3.6.0.beta1) + +Bug Fixes: + +* Prevent truncated formatted object output from mangling console codes. (rspec/rspec-support#294, Anson Kelly) + +### 3.5.0 / 2016-07-01 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0.beta4...v3.5.0) + +**No user facing changes since beta4** + +### 3.5.0.beta4 / 2016-06-05 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0.beta3...v3.5.0.beta4) + +Enhancements: +* Improve `MethodSignature` to better support keyword arguments. (rspec/rspec-support#250, Rob Smith). + +### 3.5.0.beta3 / 2016-04-02 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0.beta2...v3.5.0.beta3) + +Bug Fixes: + +* Fix `EncodedString` to properly handle the behavior of `String#split` + on JRuby when the string contains invalid bytes. (Jon Rowe, rspec/rspec-support#268) +* Fix `ObjectFormatter` so that formatting objects that don't respond to + `#inspect` (such as `BasicObject`) does not cause `NoMethodError`. + (Yuji Nakayama, rspec/rspec-support#269) +* Fix `ObjectFormatter` so that formatting recursive array or hash does not + cause `SystemStackError`. (Yuji Nakayama, rspec/rspec-support#270, rspec/rspec-support#272) + +### 3.5.0.beta2 / 2016-03-10 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0.beta1...v3.5.0.beta2) + +No user-facing changes. + +### 3.5.0.beta1 / 2016-02-06 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.4.1...v3.5.0.beta1) + +Enhancements: + +* Improve formatting of objects by allowing truncation to a pre-configured length. + (Liam M, rspec/rspec-support#256) + +### 3.4.1 / 2015-11-20 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.4.0...v3.4.1) + +Bug Fixes: + +* Fix `RSpec::Support::RubyFeature.ripper_supported?` so it returns + `false` on Rubinius since the Rubinius team has no plans to support + it. This prevents rspec-core from trying to load and use ripper to + extract failure snippets. (Aaron Stone, rspec/rspec-support#251) + +Changes: + +* Remove `VersionChecker` in favor of `ComparableVersion`. (Yuji Nakayama, rspec/rspec-support#266) + +### 3.4.0 / 2015-11-11 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.3.0...v3.4.0) + +Enhancements: + +* Improve formatting of `Delegator` based objects (e.g. `SimpleDelegator`) in + failure messages and diffs. (Andrew Horner, rspec/rspec-support#215) +* Add `ComparableVersion`. (Yuji Nakayama, rspec/rspec-support#245) +* Add `Ripper` support detection. (Yuji Nakayama, rspec/rspec-support#245) + +Bug Fixes: + +* Work around bug in JRuby that reports that `attr_writer` methods + have no parameters, causing RSpec's verifying doubles to wrongly + fail when mocking or stubbing a writer method on JRuby. (Myron Marston, rspec/rspec-support#225) + +### 3.3.0 / 2015-06-12 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.2.2...v3.3.0) + +Enhancements: + +* Improve formatting of arrays and hashes in failure messages so they + use our custom formatting of matchers, time objects, etc. + (Myron Marston, Nicholas Chmielewski, rspec/rspec-support#205) +* Use improved formatting for diffs as well. (Nicholas Chmielewski, rspec/rspec-support#205) + +Bug Fixes: + +* Fix `FuzzyMatcher` so that it checks `expected == actual` rather than + `actual == expected`, which avoids errors in situations where the + `actual` object's `==` is improperly implemented to assume that only + objects of the same type will be given. This allows rspec-mocks' + `anything` to match against objects with buggy `==` definitions. + (Myron Marston, rspec/rspec-support#193) + +### 3.2.2 / 2015-02-23 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.2.1...v3.2.2) + +Bug Fixes: + +* Fix an encoding issue with `EncodedString#split` when encountering an + invalid byte string. (Benjamin Fleischer, rspec/rspec-support#1760) + +### 3.2.1 / 2015-02-04 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.2.0...v3.2.1) + +Bug Fixes: + +* Fix `RSpec::CallerFilter` to work on Rubinius 2.2. + (Myron Marston, rspec/rspec-support#169) + +### 3.2.0 / 2015-02-03 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.1.2...v3.2.0) + +Enhancements: + +* Add extra Ruby type detection. (Jon Rowe, rspec/rspec-support#133) +* Make differ instance re-usable. (Alexey Fedorov, rspec/rspec-support#160) + +Bug Fixes: + +* Do not consider `[]` and `{}` to match when performing fuzzy matching. + (Myron Marston, rspec/rspec-support#157) + +### 3.1.2 / 2014-10-08 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.1.1...v3.1.2) + +Bug Fixes: + +* Fix method signature to not blow up with a `NoMethodError` on 1.8.7 when + verifying against an RSpec matcher. (Myron Marston, rspec/rspec-support#116) + +### 3.1.1 / 2014-09-26 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.1.0...v3.1.1) + +Bug Fixes: + +* Fix `RSpec::Support::DirectoryMaker` (used by `rspec --init` and + `rails generate rspec:install`) so that it detects absolute paths + on Windows properly. (Scott Archer, rspec/rspec-support#107, rspec/rspec-support#108, rspec/rspec-support#109) (Jon Rowe, rspec/rspec-support#110) + +### 3.1.0 / 2014-09-04 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.4...v3.1.0) + +Bug Fixes: + +* Fix `FuzzyMatcher` so that it does not wrongly match a struct against + an array. (Myron Marston, rspec/rspec-support#97) +* Prevent infinitely recursing `#flatten` methods from causing the differ + to hang. (Jon Rowe, rspec/rspec-support#101) + +### 3.0.4 / 2014-08-14 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.3...v3.0.4) + +Bug Fixes: + +* Fix `FuzzyMatcher` so that it does not silence `ArgumentError` raised + from broken implementations of `==`. (Myron Marston, rspec/rspec-support#94) + +### 3.0.3 / 2014-07-21 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.2...v3.0.3) + +Bug Fixes: + +* Fix regression in `Support#method_handle_for` where proxy objects + with method delegated would wrongly not return a method handle. + (Jon Rowe, rspec/rspec-support#90) +* Properly detect Module#prepend support in Ruby 2.1+ (Ben Langfeld, rspec/rspec-support#91) +* Fix `rspec/support/warnings.rb` so it can be loaded and used in + isolation. (Myron Marston, rspec/rspec-support#93) + +### 3.0.2 / 2014-06-20 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.1...v3.0.2) + +* Revert `BlockSignature` change from 3.0.1 because of a ruby bug that + caused it to change the block's behavior (https://bugs.ruby-lang.org/issues/9967). + (Myron Marston, rspec-mocksrspec/rspec-support#721) + +### 3.0.1 / 2014-06-19 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.0...v3.0.1) + +* Fix `BlockSignature` so that it correctly differentiates between + required and optional block args. (Myron Marston, rspec-mocksrspec/rspec-support#714) + +### 3.0.0 / 2014-06-01 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.0.rc1...v3.0.0) + +### 3.0.0.rc1 / 2014-05-18 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.0.beta2...v3.0.0.rc1) + +### 3.0.0.beta2 / 2014-02-17 +[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.0.beta1...v3.0.0.beta2) + +Bug Fixes: + +* Issue message when :replacement is passed to `RSpec.warn_with`. (Jon Rowe) + +### 3.0.0.beta1 / 2013-11-07 +[Full Changelog](https://github.com/rspec/rspec-support/compare/0dc12d1bdbbacc757a9989f8c09cd08ef3a4837e...v3.0.0.beta1) + +Initial release. diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/LICENSE.md b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/LICENSE.md new file mode 100644 index 0000000..08aa3ab --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/LICENSE.md @@ -0,0 +1,23 @@ +The MIT License (MIT) +==================== + +* Copyright © 2013 David Chelimsky, Myron Marston, Jon Rowe, Sam Phippen, Xavier Shay, Bradley Schaefer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/README.md b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/README.md new file mode 100644 index 0000000..bb88209 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/README.md @@ -0,0 +1,40 @@ +# RSpec::Support [![Build Status](https://github.com/rspec/rspec-support/workflows/RSpec%20CI/badge.svg)](https://github.com/rspec/rspec-support/actions) + +`RSpec::Support` provides common functionality to `RSpec::Core`, +`RSpec::Expectations` and `RSpec::Mocks`. It is considered +suitable for internal use only at this time. + +## Installation / Usage + +Install one or more of the `RSpec` gems. + +Want to run against the `main` branch? You'll need to include the dependent +RSpec repos as well. Add the following to your `Gemfile`: + +```ruby +%w[rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib| + gem lib, :git => "https://github.com/rspec/#{lib}.git", :branch => 'main' +end +``` + +## Contributing + +Once you've set up the environment, you'll need to cd into the working +directory of whichever repo you want to work in. From there you can run the +specs and cucumber features, and make patches. + +NOTE: You do not need to use rspec-dev to work on a specific RSpec repo. You +can treat each RSpec repo as an independent project. + +- [Build details](BUILD_DETAIL.md) +- [Code of Conduct](CODE_OF_CONDUCT.md) +- [Detailed contributing guide](CONTRIBUTING.md) +- [Development setup guide](DEVELOPMENT.md) + +## Patches + +Please submit a pull request or a github issue. If you submit an issue, please +include a link to either of: + +* a gist (or equivalent) of the patch +* a branch or commit in your github fork of the repo diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support.rb new file mode 100644 index 0000000..72154e0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support.rb @@ -0,0 +1,162 @@ +# frozen_string_literal: true + +module RSpec + module Support + # @api private + # + # Defines a helper method that is optimized to require files from the + # named lib. The passed block MUST be `{ |f| require_relative f }` + # because for `require_relative` to work properly from within the named + # lib the line of code must be IN that lib. + # + # `require_relative` is preferred when available because it is always O(1), + # regardless of the number of dirs in $LOAD_PATH. `require`, on the other + # hand, does a linear O(N) search over the dirs in the $LOAD_PATH until + # it can resolve the file relative to one of the dirs. + def self.define_optimized_require_for_rspec(lib, &require_relative) + name = "require_rspec_#{lib}" + + if RUBY_PLATFORM == 'java' && !Kernel.respond_to?(:require) + # JRuby 9.1.17.0 has developed a regression for require + (class << self; self; end).__send__(:define_method, name) do |f| + Kernel.send(:require, "rspec/#{lib}/#{f}") + end + elsif Kernel.respond_to?(:require_relative) + (class << self; self; end).__send__(:define_method, name) do |f| + require_relative.call("#{lib}/#{f}") + end + else + (class << self; self; end).__send__(:define_method, name) do |f| + require "rspec/#{lib}/#{f}" + end + end + end + + define_optimized_require_for_rspec(:support) { |f| require_relative(f) } + require_rspec_support "version" + require_rspec_support "ruby_features" + + # @api private + KERNEL_METHOD_METHOD = ::Kernel.instance_method(:method) + + # @api private + # + # Used internally to get a method handle for a particular object + # and method name. + # + # Includes handling for a few special cases: + # + # - Objects that redefine #method (e.g. an HTTPRequest struct) + # - BasicObject subclasses that mixin a Kernel dup (e.g. SimpleDelegator) + # - Objects that undefine method and delegate everything to another + # object (e.g. Mongoid association objects) + if RubyFeatures.supports_rebinding_module_methods? + def self.method_handle_for(object, method_name) + KERNEL_METHOD_METHOD.bind(object).call(method_name) + rescue NameError => original + begin + handle = object.method(method_name) + raise original unless handle.is_a? Method + handle + rescue Support::AllExceptionsExceptOnesWeMustNotRescue + raise original + end + end + else + def self.method_handle_for(object, method_name) + if ::Kernel === object + KERNEL_METHOD_METHOD.bind(object).call(method_name) + else + object.method(method_name) + end + rescue NameError => original + begin + handle = object.method(method_name) + raise original unless handle.is_a? Method + handle + rescue Support::AllExceptionsExceptOnesWeMustNotRescue + raise original + end + end + end + + # @api private + # + # Used internally to get a class of a given object, even if it does not respond to #class. + def self.class_of(object) + object.class + rescue NoMethodError + singleton_class = class << object; self; end + singleton_class.ancestors.find { |ancestor| !ancestor.equal?(singleton_class) } + end + + # A single thread local variable so we don't excessively pollute that namespace. + if RUBY_VERSION.to_f >= 2 + def self.thread_local_data + Thread.current.thread_variable_get(:__rspec) || Thread.current.thread_variable_set(:__rspec, {}) + end + else + def self.thread_local_data + Thread.current[:__rspec] ||= {} + end + end + + # @api private + def self.failure_notifier=(callable) + thread_local_data[:failure_notifier] = callable + end + + # @private + DEFAULT_FAILURE_NOTIFIER = lambda { |failure, _opts| raise failure } + + # @api private + def self.failure_notifier + thread_local_data[:failure_notifier] || DEFAULT_FAILURE_NOTIFIER + end + + # @api private + def self.notify_failure(failure, options={}) + failure_notifier.call(failure, options) + end + + # @api private + def self.with_failure_notifier(callable) + orig_notifier = failure_notifier + self.failure_notifier = callable + yield + ensure + self.failure_notifier = orig_notifier + end + + class << self + # @api private + attr_writer :warning_notifier + end + + # @private + DEFAULT_WARNING_NOTIFIER = lambda { |warning| ::Kernel.warn warning } + + # @api private + def self.warning_notifier + @warning_notifier ||= DEFAULT_WARNING_NOTIFIER + end + + # @private + module AllExceptionsExceptOnesWeMustNotRescue + # These exceptions are dangerous to rescue as rescuing them + # would interfere with things we should not interfere with. + AVOID_RESCUING = [NoMemoryError, SignalException, Interrupt, SystemExit] + + def self.===(exception) + AVOID_RESCUING.none? { |ar| ar === exception } + end + end + + # The Differ is only needed when a spec fails with a diffable failure. + # In the more common case of all specs passing or the only failures being + # non-diffable, we can avoid the extra cost of loading the differ, diff-lcs, + # pp, etc by avoiding an unnecessary require. Instead, autoload will take + # care of loading the differ on first use. + autoload :Differ, "rspec/support/differ" + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/caller_filter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/caller_filter.rb new file mode 100644 index 0000000..e54b23a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/caller_filter.rb @@ -0,0 +1,85 @@ +# frozen_string_literal: true + +RSpec::Support.require_rspec_support "ruby_features" + +module RSpec + # Consistent implementation for "cleaning" the caller method to strip out + # non-rspec lines. This enables errors to be reported at the call site in + # the code using the library, which is far more useful than the particular + # internal method that raised an error. + class CallerFilter + RSPEC_LIBS = %w[ + core + mocks + expectations + support + matchers + rails + ] + + ADDITIONAL_TOP_LEVEL_FILES = %w[ autorun ] + + LIB_REGEX = %r{/lib/rspec/(#{(RSPEC_LIBS + ADDITIONAL_TOP_LEVEL_FILES).join('|')})(\.rb|/)} + + # rubygems/core_ext/kernel_require.rb isn't actually part of rspec (obviously) but we want + # it ignored when we are looking for the first meaningful line of the backtrace outside + # of RSpec. It can show up in the backtrace as the immediate first caller + # when `CallerFilter.first_non_rspec_line` is called from the top level of a required + # file, but it depends on if rubygems is loaded or not. We don't want to have to deal + # with this complexity in our `RSpec.deprecate` calls, so we ignore it here. + IGNORE_REGEX = Regexp.union(LIB_REGEX, "rubygems/core_ext/kernel_require.rb", "(other) + other = self.class.new(other) unless other.is_a?(self.class) + + return 0 if string == other.string + + longer_segment_count = [self, other].map { |version| version.segments.count }.max + + longer_segment_count.times do |index| + self_segment = segments[index] || 0 + other_segment = other.segments[index] || 0 + + if self_segment.class == other_segment.class + result = self_segment <=> other_segment + return result unless result == 0 + else + return self_segment.is_a?(String) ? -1 : 1 + end + end + + 0 + end + + def segments + @segments ||= string.scan(/[a-z]+|\d+/i).map do |segment| + if segment =~ /\A\d+\z/ + segment.to_i + else + segment + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/differ.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/differ.rb new file mode 100644 index 0000000..9488296 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/differ.rb @@ -0,0 +1,217 @@ +# frozen_string_literal: true + +RSpec::Support.require_rspec_support 'encoded_string' +RSpec::Support.require_rspec_support 'hunk_generator' +RSpec::Support.require_rspec_support "object_formatter" + +require 'pp' + +module RSpec + module Support + # rubocop:disable Metrics/ClassLength + class Differ + def diff(actual, expected) + diff = "" + + unless actual.nil? || expected.nil? + if all_strings?(actual, expected) + if any_multiline_strings?(actual, expected) + diff = diff_as_string(coerce_to_string(actual), coerce_to_string(expected)) + end + elsif no_procs?(actual, expected) && no_numbers?(actual, expected) + diff = diff_as_object(actual, expected) + end + end + + diff.to_s + end + + # rubocop:disable Metrics/MethodLength + def diff_as_string(actual, expected) + encoding = EncodedString.pick_encoding(actual, expected) + + actual = EncodedString.new(actual, encoding) + expected = EncodedString.new(expected, encoding) + + output = EncodedString.new("\n", encoding) + hunks = build_hunks(actual, expected) + + hunks.each_cons(2) do |prev_hunk, current_hunk| + begin + if current_hunk.overlaps?(prev_hunk) + add_old_hunk_to_hunk(current_hunk, prev_hunk) + else + add_to_output(output, prev_hunk.diff(format_type).to_s) + end + ensure + add_to_output(output, "\n") + end + end + + finalize_output(output, hunks.last.diff(format_type).to_s) if hunks.last + + color_diff output + rescue Encoding::CompatibilityError + handle_encoding_errors(actual, expected) + end + # rubocop:enable Metrics/MethodLength + + def diff_as_object(actual, expected) + actual_as_string = object_to_string(actual) + expected_as_string = object_to_string(expected) + diff_as_string(actual_as_string, expected_as_string) + end + + def color? + @color + end + + def initialize(opts={}) + @color = opts.fetch(:color, false) + @object_preparer = opts.fetch(:object_preparer, lambda { |string| string }) + end + + private + + def no_procs?(*args) + safely_flatten(args).none? { |a| Proc === a } + end + + def all_strings?(*args) + safely_flatten(args).all? { |a| String === a } + end + + def any_multiline_strings?(*args) + all_strings?(*args) && safely_flatten(args).any? { |a| multiline?(a) } + end + + def no_numbers?(*args) + safely_flatten(args).none? { |a| Numeric === a } + end + + def coerce_to_string(string_or_array) + return string_or_array unless Array === string_or_array + diffably_stringify(string_or_array).join("\n") + end + + def diffably_stringify(array) + array.map do |entry| + if Array === entry + entry.inspect + else + entry.to_s.gsub("\n", "\\n").gsub("\r", "\\r") + end + end + end + + if String.method_defined?(:encoding) + def multiline?(string) + string.include?("\n".encode(string.encoding)) + end + else + def multiline?(string) + string.include?("\n") + end + end + + def build_hunks(actual, expected) + HunkGenerator.new(actual, expected).hunks + end + + def finalize_output(output, final_line) + add_to_output(output, final_line) + add_to_output(output, "\n") + end + + def add_to_output(output, string) + output << string + end + + def add_old_hunk_to_hunk(hunk, oldhunk) + hunk.merge(oldhunk) + end + + def safely_flatten(array) + array = array.flatten(1) until (array == array.flatten(1)) + array + end + + def format_type + :unified + end + + def color(text, color_code) + "\e[#{color_code}m#{text}\e[0m" + end + + def red(text) + color(text, 31) + end + + def green(text) + color(text, 32) + end + + def blue(text) + color(text, 34) + end + + def normal(text) + color(text, 0) + end + + def color_diff(diff) + return diff unless color? + + diff.lines.map do |line| + case line[0].chr + when "+" + green line + when "-" + red line + when "@" + line[1].chr == "@" ? blue(line) : normal(line) + else + normal(line) + end + end.join + end + + def object_to_string(object) + object = @object_preparer.call(object) + case object + when Hash + hash_to_string(object) + when Array + PP.pp(ObjectFormatter.prepare_for_inspection(object), "".dup) + when String + object =~ /\n/ ? object : object.inspect + else + PP.pp(object, "".dup) + end + end + + def hash_to_string(hash) + formatted_hash = ObjectFormatter.prepare_for_inspection(hash) + formatted_hash.keys.sort_by { |k| k.to_s }.map do |key| + pp_key = PP.singleline_pp(key, "".dup) + pp_value = PP.singleline_pp(formatted_hash[key], "".dup) + + "#{pp_key} => #{pp_value}," + end.join("\n") + end + + def handle_encoding_errors(actual, expected) + if actual.source_encoding != expected.source_encoding + "Could not produce a diff because the encoding of the actual string " \ + "(#{actual.source_encoding}) differs from the encoding of the expected " \ + "string (#{expected.source_encoding})" + else + "Could not produce a diff because of the encoding of the string " \ + "(#{expected.source_encoding})" + end + end + end + # rubocop:enable Metrics/ClassLength + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/directory_maker.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/directory_maker.rb new file mode 100644 index 0000000..c59d751 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/directory_maker.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +RSpec::Support.require_rspec_support 'ruby_features' + +module RSpec + module Support + # @api private + # + # Replacement for fileutils#mkdir_p because we don't want to require parts + # of stdlib in RSpec. + class DirectoryMaker + # @api private + # + # Implements nested directory construction + def self.mkdir_p(path) + stack = generate_stack(path) + path.split(File::SEPARATOR).each do |part| + stack = generate_path(stack, part) + begin + Dir.mkdir(stack) unless directory_exists?(stack) + rescue Errno::EEXIST => e + raise e unless directory_exists?(stack) + rescue Errno::ENOTDIR => e + raise Errno::EEXIST, e.message + end + end + end + + if OS.windows_file_path? + def self.generate_stack(path) + if path.start_with?(File::SEPARATOR) + File::SEPARATOR + elsif path[1] == ':' + '' + else + '.' + end + end + def self.generate_path(stack, part) + if stack == '' + part + elsif stack == File::SEPARATOR + File.join('', part) + else + File.join(stack, part) + end + end + else + def self.generate_stack(path) + path.start_with?(File::SEPARATOR) ? File::SEPARATOR : "." + end + def self.generate_path(stack, part) + File.join(stack, part) + end + end + + def self.directory_exists?(dirname) + File.exist?(dirname) && File.directory?(dirname) + end + private_class_method :directory_exists? + private_class_method :generate_stack + private_class_method :generate_path + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/encoded_string.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/encoded_string.rb new file mode 100644 index 0000000..044c151 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/encoded_string.rb @@ -0,0 +1,163 @@ +# frozen_string_literal: true + +module RSpec + module Support + # @private + class EncodedString + # Reduce allocations by storing constants. + UTF_8 = "UTF-8" + US_ASCII = "US-ASCII" + + # Ruby's default replacement string is: + # U+FFFD ("\xEF\xBF\xBD"), for Unicode encoding forms, else + # ? ("\x3F") + REPLACE = "?" + + def initialize(string, encoding=nil) + @encoding = encoding + @source_encoding = detect_source_encoding(string) + @string = matching_encoding(string) + end + attr_reader :source_encoding + + delegated_methods = String.instance_methods.map(&:to_s) & %w[eql? lines == encoding empty?] + delegated_methods.each do |name| + define_method(name) { |*args, &block| @string.__send__(name, *args, &block) } + end + + def <<(string) + @string << matching_encoding(string) + end + + if Ruby.jruby? + def split(regex_or_string) + @string.split(matching_encoding(regex_or_string)) + rescue ArgumentError + # JRuby raises an ArgumentError when splitting a source string that + # contains invalid bytes. + remove_invalid_bytes(@string).split regex_or_string + end + else + def split(regex_or_string) + @string.split(matching_encoding(regex_or_string)) + end + end + + def to_s + @string + end + alias :to_str :to_s + + if String.method_defined?(:encoding) + + private + + # Encoding Exceptions: + # + # Raised by Encoding and String methods: + # Encoding::UndefinedConversionError: + # when a transcoding operation fails + # if the String contains characters invalid for the target encoding + # e.g. "\x80".encode('UTF-8','ASCII-8BIT') + # vs "\x80".encode('UTF-8','ASCII-8BIT', undef: :replace, replace: '') + # # => '' + # Encoding::CompatibilityError + # when Encoding.compatible?(str1, str2) is nil + # e.g. utf_16le_emoji_string.split("\n") + # e.g. valid_unicode_string.encode(utf8_encoding) << ascii_string + # Encoding::InvalidByteSequenceError: + # when the string being transcoded contains a byte invalid for + # either the source or target encoding + # e.g. "\x80".encode('UTF-8','US-ASCII') + # vs "\x80".encode('UTF-8','US-ASCII', invalid: :replace, replace: '') + # # => '' + # ArgumentError + # when operating on a string with invalid bytes + # e.g."\x80".split("\n") + # TypeError + # when a symbol is passed as an encoding + # Encoding.find(:"UTF-8") + # when calling force_encoding on an object + # that doesn't respond to #to_str + # + # Raised by transcoding methods: + # Encoding::ConverterNotFoundError: + # when a named encoding does not correspond with a known converter + # e.g. 'abc'.force_encoding('UTF-8').encode('foo') + # or a converter path cannot be found + # e.g. "\x80".force_encoding('ASCII-8BIT').encode('Emacs-Mule') + # + # Raised by byte <-> char conversions + # RangeError: out of char range + # e.g. the UTF-16LE emoji: 128169.chr + def matching_encoding(string) + string = remove_invalid_bytes(string) + string.encode(@encoding) + rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError + # Originally defined as a constant to avoid unneeded allocations, this hash must + # be defined inline (without {}) to avoid warnings on Ruby 2.7 + # + # In MRI 2.1 'invalid: :replace' changed to also replace an invalid byte sequence + # see https://github.com/ruby/ruby/blob/v2_1_0/NEWS#L176 + # https://www.ruby-forum.com/topic/6861247 + # https://twitter.com/nalsh/status/553413844685438976 + # + # For example, given: + # "\x80".force_encoding("Emacs-Mule").encode(:invalid => :replace).bytes.to_a + # + # On MRI 2.1 or above: 63 # '?' + # else : 128 # "\x80" + # + string.encode(@encoding, :invalid => :replace, :undef => :replace, :replace => REPLACE) + rescue Encoding::ConverterNotFoundError + # Originally defined as a constant to avoid unneeded allocations, this hash must + # be defined inline (without {}) to avoid warnings on Ruby 2.7 + string.dup.force_encoding(@encoding).encode(:invalid => :replace, :replace => REPLACE) + end + + # Prevents raising ArgumentError + if String.method_defined?(:scrub) + # https://github.com/ruby/ruby/blob/eeb05e8c11/doc/NEWS-2.1.0#L120-L123 + # https://github.com/ruby/ruby/blob/v2_1_0/string.c#L8242 + # https://github.com/hsbt/string-scrub + # https://github.com/rubinius/rubinius/blob/v2.5.2/kernel/common/string.rb#L1913-L1972 + def remove_invalid_bytes(string) + string.scrub(REPLACE) + end + else + # http://stackoverflow.com/a/8711118/879854 + # Loop over chars in a string replacing chars + # with invalid encoding, which is a pretty good proxy + # for the invalid byte sequence that causes an ArgumentError + def remove_invalid_bytes(string) + string.chars.map do |char| + char.valid_encoding? ? char : REPLACE + end.join + end + end + + def detect_source_encoding(string) + string.encoding + end + + def self.pick_encoding(source_a, source_b) + Encoding.compatible?(source_a, source_b) || Encoding.default_external + end + else + + def self.pick_encoding(_source_a, _source_b) + end + + private + + def matching_encoding(string) + string + end + + def detect_source_encoding(_string) + US_ASCII + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/fuzzy_matcher.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/fuzzy_matcher.rb new file mode 100644 index 0000000..46c0cab --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/fuzzy_matcher.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +module RSpec + module Support + # Provides a means to fuzzy-match between two arbitrary objects. + # Understands array/hash nesting. Uses `===` or `==` to + # perform the matching. + module FuzzyMatcher + # @api private + def self.values_match?(expected, actual) + if Hash === actual + return hashes_match?(expected, actual) if Hash === expected + elsif Array === expected && Enumerable === actual && !(Struct === actual) + return arrays_match?(expected, actual.to_a) + end + + return true if expected == actual + + begin + expected === actual + rescue ArgumentError + # Some objects, like 0-arg lambdas on 1.9+, raise + # ArgumentError for `expected === actual`. + false + end + end + + # @private + def self.arrays_match?(expected_list, actual_list) + return false if expected_list.size != actual_list.size + + expected_list.zip(actual_list).all? do |expected, actual| + values_match?(expected, actual) + end + end + + # @private + def self.hashes_match?(expected_hash, actual_hash) + return false if expected_hash.size != actual_hash.size + + expected_hash.all? do |expected_key, expected_value| + actual_value = actual_hash.fetch(expected_key) { return false } + values_match?(expected_value, actual_value) + end + end + + private_class_method :arrays_match?, :hashes_match? + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/hunk_generator.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/hunk_generator.rb new file mode 100644 index 0000000..086a88e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/hunk_generator.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +require 'diff/lcs' +require 'diff/lcs/hunk' + +module RSpec + module Support + # @private + class HunkGenerator + def initialize(actual, expected) + @actual = actual + @expected = expected + end + + def hunks + @file_length_difference = 0 + @hunks ||= diffs.map do |piece| + build_hunk(piece) + end + end + + private + + def diffs + Diff::LCS.diff(expected_lines, actual_lines) + end + + def expected_lines + @expected.split("\n").map! { |e| e.chomp } + end + + def actual_lines + @actual.split("\n").map! { |e| e.chomp } + end + + def build_hunk(piece) + Diff::LCS::Hunk.new( + expected_lines, actual_lines, piece, context_lines, @file_length_difference + ).tap do |h| + @file_length_difference = h.file_length_difference + end + end + + def context_lines + 3 + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/matcher_definition.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/matcher_definition.rb new file mode 100644 index 0000000..6b7819c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/matcher_definition.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +module RSpec + module Support + # @private + def self.matcher_definitions + @matcher_definitions ||= [] + end + + # Used internally to break cyclic dependency between mocks, expectations, + # and support. We don't currently have a consistent implementation of our + # matchers, though we are considering changing that: + # https://github.com/rspec/rspec-mocks/issues/513 + # + # @private + def self.register_matcher_definition(&block) + matcher_definitions << block + end + + # Remove a previously registered matcher. Useful for cleaning up after + # yourself in specs. + # + # @private + def self.deregister_matcher_definition(&block) + matcher_definitions.delete(block) + end + + # @private + def self.is_a_matcher?(object) + matcher_definitions.any? { |md| md.call(object) } + end + + # @api private + # + # gives a string representation of an object for use in RSpec descriptions + def self.rspec_description_for_object(object) + if RSpec::Support.is_a_matcher?(object) && object.respond_to?(:description) + object.description + else + object + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/method_signature_verifier.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/method_signature_verifier.rb new file mode 100644 index 0000000..a462772 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/method_signature_verifier.rb @@ -0,0 +1,467 @@ +# frozen_string_literal: true + +require 'rspec/support' +RSpec::Support.require_rspec_support "ruby_features" +RSpec::Support.require_rspec_support "matcher_definition" + +module RSpec + module Support + # Extracts info about the number of arguments and allowed/required + # keyword args of a given method. + # + # @private + class MethodSignature # rubocop:disable Metrics/ClassLength + attr_reader :min_non_kw_args, :max_non_kw_args, :optional_kw_args, :required_kw_args + + def initialize(method) + @method = method + @optional_kw_args = [] + @required_kw_args = [] + classify_parameters + end + + def non_kw_args_arity_description + case max_non_kw_args + when min_non_kw_args then min_non_kw_args.to_s + when INFINITY then "#{min_non_kw_args} or more" + else "#{min_non_kw_args} to #{max_non_kw_args}" + end + end + + def valid_non_kw_args?(positional_arg_count, optional_max_arg_count=positional_arg_count) + return true if positional_arg_count.nil? + + min_non_kw_args <= positional_arg_count && + optional_max_arg_count <= max_non_kw_args + end + + def classify_arity(arity=@method.arity) + if arity < 0 + # `~` inverts the one's complement and gives us the + # number of required args + @min_non_kw_args = ~arity + @max_non_kw_args = INFINITY + else + @min_non_kw_args = arity + @max_non_kw_args = arity + end + end + + if RubyFeatures.optional_and_splat_args_supported? + def description + @description ||= begin + parts = [] + + unless non_kw_args_arity_description == "0" + parts << "arity of #{non_kw_args_arity_description}" + end + + if @optional_kw_args.any? + parts << "optional keyword args (#{@optional_kw_args.map(&:inspect).join(", ")})" + end + + if @required_kw_args.any? + parts << "required keyword args (#{@required_kw_args.map(&:inspect).join(", ")})" + end + + parts << "any additional keyword args" if @allows_any_kw_args + + parts.join(" and ") + end + end + + def missing_kw_args_from(given_kw_args) + @required_kw_args - given_kw_args + end + + def invalid_kw_args_from(given_kw_args) + return [] if @allows_any_kw_args + given_kw_args - @allowed_kw_args + end + + # Considering the arg types, are there kw_args? + if RubyFeatures.kw_arg_separation? + def has_kw_args_in?(args) + # If the last arg is a hash, depending on the signature it could be kw_args or a positional parameter. + return false unless Hash === args.last && could_contain_kw_args?(args) + + # If the position of the hash is beyond the count of required and optional positional + # args then it is the kwargs hash + return true if args.count > @max_non_kw_args + + # This is the proper way to disambiguate between positional args and keywords hash + # but relies on beginning of the call chain annotating the method with + # ruby2_keywords, so only use it for positive feedback as without the annotation + # this is always false + return true if Hash.ruby2_keywords_hash?(args[-1]) + + # Otherwise, the hash could be defined kw_args or an optional positional parameter + # inspect the keys against known kwargs to determine what it is + # Note: the problem with this is that if a user passes only invalid keyword args, + # rspec no longer detects is and will assign this to a positional argument + return arbitrary_kw_args? || args.last.keys.all? { |x| @allowed_kw_args.include?(x) } + end + else + def has_kw_args_in?(args) + # Version <= Ruby 2.7 + # If the last argument is Hash, Ruby will treat only symbol keys as keyword arguments + # the rest will be grouped in another Hash and passed as positional argument. + Hash === args.last && + could_contain_kw_args?(args) && + (args.last.empty? || args.last.keys.any? { |x| x.is_a?(Symbol) }) + end + end + + # Without considering what the last arg is, could it + # contain keyword arguments? + def could_contain_kw_args?(args) + return false if args.count <= min_non_kw_args + + @allows_any_kw_args || @allowed_kw_args.any? + end + + def arbitrary_kw_args? + @allows_any_kw_args + end + + def unlimited_args? + @max_non_kw_args == INFINITY + end + + def classify_parameters + optional_non_kw_args = @min_non_kw_args = 0 + @allows_any_kw_args = false + + @method.parameters.each do |(type, name)| + case type + # def foo(a:) + when :keyreq then @required_kw_args << name + # def foo(a: 1) + when :key then @optional_kw_args << name + # def foo(**kw_args) + when :keyrest then @allows_any_kw_args = true + # def foo(a) + when :req then @min_non_kw_args += 1 + # def foo(a = 1) + when :opt then optional_non_kw_args += 1 + # def foo(*a) + when :rest then optional_non_kw_args = INFINITY + end + end + + @max_non_kw_args = @min_non_kw_args + optional_non_kw_args + @allowed_kw_args = @required_kw_args + @optional_kw_args + end + else + def description + "arity of #{non_kw_args_arity_description}" + end + + def missing_kw_args_from(_given_kw_args) + [] + end + + def invalid_kw_args_from(_given_kw_args) + [] + end + + def has_kw_args_in?(_args) + false + end + + def could_contain_kw_args?(*) + false + end + + def arbitrary_kw_args? + false + end + + def unlimited_args? + false + end + + alias_method :classify_parameters, :classify_arity + end + + INFINITY = 1 / 0.0 + end + + if RSpec::Support::Ruby.jruby? + # JRuby has only partial support for UnboundMethod#parameters, so we fall back on using #arity + # https://github.com/jruby/jruby/issues/2816 and https://github.com/jruby/jruby/issues/2817 + if RubyFeatures.optional_and_splat_args_supported? && + Java::JavaLang::String.instance_method(:char_at).parameters == [] + + class MethodSignature < remove_const(:MethodSignature) + private + + def classify_parameters + super + if (arity = @method.arity) != 0 && @method.parameters.empty? + classify_arity(arity) + end + end + end + end + + # JRuby used to always report -1 arity for Java proxy methods. + # The workaround essentially makes use of Java's introspection to figure + # out matching methods (which could be more than one partly because Java + # supports multiple overloads, and partly because JRuby introduces + # aliases to make method names look more Rubyesque). If there is only a + # single match, we can use that methods arity directly instead of the + # default -1 arity. + # + # This workaround only works for Java proxy methods, and in order to + # support regular methods and blocks, we need to be careful about calling + # owner and java_class as they might not be available + if Java::JavaLang::String.instance_method(:char_at).arity == -1 + class MethodSignature < remove_const(:MethodSignature) + private + + def classify_parameters + super + return unless @method.arity == -1 + return unless @method.respond_to?(:owner) + return unless @method.owner.respond_to?(:java_class) + java_instance_methods = @method.owner.java_class.java_instance_methods + compatible_overloads = java_instance_methods.select do |java_method| + @method == @method.owner.instance_method(java_method.name) + end + if compatible_overloads.size == 1 + classify_arity(compatible_overloads.first.arity) + end + end + end + end + end + + # Encapsulates expectations about the number of arguments and + # allowed/required keyword args of a given method. + # + # @api private + class MethodSignatureExpectation + def initialize + @min_count = nil + @max_count = nil + @keywords = [] + + @expect_unlimited_arguments = false + @expect_arbitrary_keywords = false + end + + attr_reader :min_count, :max_count, :keywords + + attr_accessor :expect_unlimited_arguments, :expect_arbitrary_keywords + + def max_count=(number) + raise ArgumentError, 'must be a non-negative integer or nil' \ + unless number.nil? || (number.is_a?(Integer) && number >= 0) + + @max_count = number + end + + def min_count=(number) + raise ArgumentError, 'must be a non-negative integer or nil' \ + unless number.nil? || (number.is_a?(Integer) && number >= 0) + + @min_count = number + end + + def empty? + @min_count.nil? && + @keywords.to_a.empty? && + !@expect_arbitrary_keywords && + !@expect_unlimited_arguments + end + + def keywords=(values) + @keywords = values.to_a || [] + end + end + + # Deals with the slightly different semantics of block arguments. + # For methods, arguments are required unless a default value is provided. + # For blocks, arguments are optional, even if no default value is provided. + # + # However, we want to treat block args as required since you virtually + # always want to pass a value for each received argument and our + # `and_yield` has treated block args as required for many years. + # + # @api private + class BlockSignature < MethodSignature + if RubyFeatures.optional_and_splat_args_supported? + def classify_parameters + super + @min_non_kw_args = @max_non_kw_args unless @max_non_kw_args == INFINITY + end + end + end + + # Abstract base class for signature verifiers. + # + # @api private + class MethodSignatureVerifier + attr_reader :non_kw_args, :kw_args, :min_non_kw_args, :max_non_kw_args + + def initialize(signature, args=[]) + @signature = signature + @non_kw_args, @kw_args = split_args(args.clone) + @min_non_kw_args = @max_non_kw_args = @non_kw_args + @arbitrary_kw_args = @unlimited_args = false + end + + def with_expectation(expectation) # rubocop:disable Metrics/MethodLength + return self unless MethodSignatureExpectation === expectation + + if expectation.empty? + @min_non_kw_args = @max_non_kw_args = @non_kw_args = nil + @kw_args = [] + else + @min_non_kw_args = @non_kw_args = expectation.min_count || 0 + @max_non_kw_args = expectation.max_count || @min_non_kw_args + + if RubyFeatures.optional_and_splat_args_supported? + @unlimited_args = expectation.expect_unlimited_arguments + else + @unlimited_args = false + end + + if RubyFeatures.kw_args_supported? + @kw_args = expectation.keywords + @arbitrary_kw_args = expectation.expect_arbitrary_keywords + else + @kw_args = [] + @arbitrary_kw_args = false + end + end + + self + end + + def valid? + missing_kw_args.empty? && + invalid_kw_args.empty? && + valid_non_kw_args? && + arbitrary_kw_args? && + unlimited_args? + end + + def error_message + if missing_kw_args.any? + "Missing required keyword arguments: %s" % [ + missing_kw_args.join(", ") + ] + elsif invalid_kw_args.any? + "Invalid keyword arguments provided: %s" % [ + invalid_kw_args.join(", ") + ] + elsif !valid_non_kw_args? + "Wrong number of arguments. Expected %s, got %s." % [ + @signature.non_kw_args_arity_description, + non_kw_args + ] + end + end + + private + + def valid_non_kw_args? + @signature.valid_non_kw_args?(min_non_kw_args, max_non_kw_args) + end + + def missing_kw_args + @signature.missing_kw_args_from(kw_args) + end + + def invalid_kw_args + @signature.invalid_kw_args_from(kw_args) + end + + def arbitrary_kw_args? + !@arbitrary_kw_args || @signature.arbitrary_kw_args? + end + + def unlimited_args? + !@unlimited_args || @signature.unlimited_args? + end + + def split_args(args) + kw_args = if @signature.has_kw_args_in?(args) && !RubyFeatures.kw_arg_separation? + last = args.pop + non_kw_args = last.reject { |k, _| k.is_a?(Symbol) } + if non_kw_args.empty? + last.keys + else + args << non_kw_args + last.select { |k, _| k.is_a?(Symbol) }.keys + end + elsif @signature.has_kw_args_in?(args) && RubyFeatures.kw_arg_separation? + args.pop.keys + else + [] + end + + [args.length, kw_args] + end + end + + # Figures out whether a given method can accept various arguments. + # Surprisingly non-trivial. + # + # @private + StrictSignatureVerifier = MethodSignatureVerifier + + # Allows matchers to be used instead of providing keyword arguments. In + # practice, when this happens only the arity of the method is verified. + # + # @private + class LooseSignatureVerifier < MethodSignatureVerifier + private + + def split_args(args) + if RSpec::Support.is_a_matcher?(args.last) && @signature.could_contain_kw_args?(args) + args.pop + @signature = SignatureWithKeywordArgumentsMatcher.new(@signature) + end + + super(args) + end + + # If a matcher is used in a signature in place of keyword arguments, all + # keyword argument validation needs to be skipped since the matcher is + # opaque. + # + # Instead, keyword arguments will be validated when the method is called + # and they are actually known. + # + # @private + class SignatureWithKeywordArgumentsMatcher + def initialize(signature) + @signature = signature + end + + def missing_kw_args_from(_kw_args) + [] + end + + def invalid_kw_args_from(_kw_args) + [] + end + + def non_kw_args_arity_description + @signature.non_kw_args_arity_description + end + + def valid_non_kw_args?(*args) + @signature.valid_non_kw_args?(*args) + end + + def has_kw_args_in?(args) + @signature.has_kw_args_in?(args) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/mutex.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/mutex.rb new file mode 100644 index 0000000..63eeca4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/mutex.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +module RSpec + module Support + # On 1.8.7, it's in the stdlib. + # We don't want to load the stdlib, b/c this is a test tool, and can affect + # the test environment, causing tests to pass where they should fail. + # + # So we're transcribing/modifying it from + # https://github.com/ruby/ruby/blob/v1_8_7_374/lib/thread.rb#L56 + # Some methods we don't need are deleted. Anything I don't + # understand (there's quite a bit, actually) is left in. + # + # Some formatting changes are made to appease the robot overlord: + # https://travis-ci.org/rspec/rspec-core/jobs/54410874 + # @private + class Mutex + def initialize + @waiting = [] + @locked = false + @waiting.taint + taint + end + + # @private + def lock + while Thread.critical = true && @locked + @waiting.push Thread.current + Thread.stop + end + @locked = true + Thread.critical = false + self + end + + # @private + def unlock + return unless @locked + Thread.critical = true + @locked = false + wakeup_and_run_waiting_thread + self + end + + # @private + def synchronize + lock + begin + yield + ensure + unlock + end + end + + private + + def wakeup_and_run_waiting_thread + begin + t = @waiting.shift + t.wakeup if t + rescue ThreadError + retry + end + Thread.critical = false + begin + t.run if t + rescue ThreadError + :noop + end + end + + # Avoid warnings for library wide checks spec + end unless defined?(::RSpec::Support::Mutex) || defined?(::Mutex) + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/object_formatter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/object_formatter.rb new file mode 100644 index 0000000..d464f1b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/object_formatter.rb @@ -0,0 +1,279 @@ +# frozen_string_literal: true + +RSpec::Support.require_rspec_support 'matcher_definition' + +module RSpec + module Support + # Provide additional output details beyond what `inspect` provides when + # printing Time, DateTime, or BigDecimal + # @api private + class ObjectFormatter # rubocop:disable Metrics/ClassLength + ELLIPSIS = "..." + + attr_accessor :max_formatted_output_length + + # Methods are deferred to a default instance of the class to maintain the interface + # For example, calling ObjectFormatter.format is still possible + def self.default_instance + @default_instance ||= new + end + + def self.format(object) + default_instance.format(object) + end + + def self.prepare_for_inspection(object) + default_instance.prepare_for_inspection(object) + end + + def initialize(max_formatted_output_length=200) + @max_formatted_output_length = max_formatted_output_length + @current_structure_stack = [] + end + + def format(object) + if max_formatted_output_length.nil? + prepare_for_inspection(object).inspect + else + formatted_object = prepare_for_inspection(object).inspect + if formatted_object.length < max_formatted_output_length + formatted_object + else + beginning = truncate_string formatted_object, 0, max_formatted_output_length / 2 + ending = truncate_string formatted_object, -max_formatted_output_length / 2, -1 + beginning + ELLIPSIS + ending + end + end + end + + # Prepares the provided object to be formatted by wrapping it as needed + # in something that, when `inspect` is called on it, will produce the + # desired output. + # + # This allows us to apply the desired formatting to hash/array data structures + # at any level of nesting, simply by walking that structure and replacing items + # with custom items that have `inspect` defined to return the desired output + # for that item. Then we can just use `Array#inspect` or `Hash#inspect` to + # format the entire thing. + def prepare_for_inspection(object) + case object + when Array + prepare_array(object) + when Hash + prepare_hash(object) + when Symbol + object + else + inspector_class = INSPECTOR_CLASSES.find { |inspector| inspector.can_inspect?(object) } + inspector_class.new(object, self) + end + end + + def prepare_array(array) + with_entering_structure(array) do + array.map { |element| prepare_element(element) } + end + end + + def prepare_hash(input_hash) + with_entering_structure(input_hash) do + sort_hash_keys(input_hash).inject({}) do |output_hash, key_and_value| + key, value = key_and_value.map { |element| prepare_element(element) } + output_hash[key] = value + output_hash + end + end + end + + def sort_hash_keys(input_hash) + if input_hash.keys.all? { |k| k.is_a?(String) || k.is_a?(Symbol) } + Hash[input_hash.sort_by { |k, _v| k.to_s }] + else + input_hash + end + end + + def prepare_element(element) + if recursive_structure?(element) + case element + when Array then InspectableItem.new('[...]') + when Hash then InspectableItem.new('{...}') + else raise # This won't happen + end + else + prepare_for_inspection(element) + end + end + + def with_entering_structure(structure) + @current_structure_stack.push(structure) + return_value = yield + @current_structure_stack.pop + return_value + end + + def recursive_structure?(object) + @current_structure_stack.any? { |seen_structure| seen_structure.equal?(object) } + end + + InspectableItem = Struct.new(:text) do + def inspect + text + end + + def pretty_print(pp) + pp.text(text) + end + end + + BaseInspector = Struct.new(:object, :formatter) do + def self.can_inspect?(_object) + raise NotImplementedError + end + + def inspect + raise NotImplementedError + end + + def pretty_print(pp) + pp.text(inspect) + end + end + + class TimeInspector < BaseInspector + FORMAT = "%Y-%m-%d %H:%M:%S" + + def self.can_inspect?(object) + Time === object + end + + if Time.method_defined?(:nsec) + def inspect + object.strftime("#{FORMAT}.#{"%09d" % object.nsec} %z") + end + else # for 1.8.7 + def inspect + object.strftime("#{FORMAT}.#{"%06d" % object.usec} %z") + end + end + end + + class DateTimeInspector < BaseInspector + FORMAT = "%a, %d %b %Y %H:%M:%S.%N %z" + + def self.can_inspect?(object) + defined?(DateTime) && DateTime === object + end + + # ActiveSupport sometimes overrides inspect. If `ActiveSupport` is + # defined use a custom format string that includes more time precision. + def inspect + if defined?(ActiveSupport) + object.strftime(FORMAT) + else + object.inspect + end + end + end + + class BigDecimalInspector < BaseInspector + def self.can_inspect?(object) + defined?(BigDecimal) && BigDecimal === object + end + + def inspect + "#{object.to_s('F')} (#{object.inspect})" + end + end + + class DescribableMatcherInspector < BaseInspector + def self.can_inspect?(object) + Support.is_a_matcher?(object) && object.respond_to?(:description) + end + + def inspect + object.description + end + end + + class UninspectableObjectInspector < BaseInspector + OBJECT_ID_FORMAT = '%#016x' + + def self.can_inspect?(object) + object.inspect + false + rescue NoMethodError + true + end + + def inspect + "#<#{klass}:#{native_object_id}>" + end + + def klass + Support.class_of(object) + end + + # http://stackoverflow.com/a/2818916 + def native_object_id + OBJECT_ID_FORMAT % (object.__id__ << 1) + rescue NoMethodError + # In Ruby 1.9.2, BasicObject responds to none of #__id__, #object_id, #id... + '-' + end + end + + class DelegatorInspector < BaseInspector + def self.can_inspect?(object) + defined?(Delegator) && Delegator === object + end + + def inspect + "#<#{object.class}(#{formatter.format(object.send(:__getobj__))})>" + end + end + + class InspectableObjectInspector < BaseInspector + def self.can_inspect?(object) + object.inspect + true + rescue NoMethodError + false + end + + def inspect + object.inspect + end + end + + INSPECTOR_CLASSES = [ + TimeInspector, + DateTimeInspector, + BigDecimalInspector, + UninspectableObjectInspector, + DescribableMatcherInspector, + DelegatorInspector, + InspectableObjectInspector + ].tap do |classes| + # 2.4 has improved BigDecimal formatting so we do not need + # to provide our own. + # https://github.com/ruby/bigdecimal/pull/42 + classes.delete(BigDecimalInspector) if RUBY_VERSION >= '2.4' + end + + private + + # Returns the substring defined by the start_index and end_index + # If the string ends with a partial ANSI code code then that + # will be removed as printing partial ANSI + # codes to the terminal can lead to corruption + def truncate_string(str, start_index, end_index) + cut_str = str[start_index..end_index] + + # ANSI color codes are like: \e[33m so anything with \e[ and a + # number without a 'm' is an incomplete color code + cut_str.sub(/\e\[\d+$/, '') + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/recursive_const_methods.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/recursive_const_methods.rb new file mode 100644 index 0000000..ac2910d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/recursive_const_methods.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true + +module RSpec + module Support + # Provides recursive constant lookup methods useful for + # constant stubbing. + module RecursiveConstMethods + # We only want to consider constants that are defined directly on a + # particular module, and not include top-level/inherited constants. + # Unfortunately, the constant API changed between 1.8 and 1.9, so + # we need to conditionally define methods to ignore the top-level/inherited + # constants. + # + # Given: + # class A; B = 1; end + # class C < A; end + # + # On 1.8: + # - C.const_get("Hash") # => ::Hash + # - C.const_defined?("Hash") # => false + # - C.constants # => ["B"] + # - None of these methods accept the extra `inherit` argument + # On 1.9: + # - C.const_get("Hash") # => ::Hash + # - C.const_defined?("Hash") # => true + # - C.const_get("Hash", false) # => raises NameError + # - C.const_defined?("Hash", false) # => false + # - C.constants # => [:B] + # - C.constants(false) #=> [] + if Module.method(:const_defined?).arity == 1 + def const_defined_on?(mod, const_name) + mod.const_defined?(const_name) + end + + def get_const_defined_on(mod, const_name) + return mod.const_get(const_name) if const_defined_on?(mod, const_name) + + raise NameError, "uninitialized constant #{mod.name}::#{const_name}" + end + + def constants_defined_on(mod) + mod.constants.select { |c| const_defined_on?(mod, c) } + end + else + def const_defined_on?(mod, const_name) + mod.const_defined?(const_name, false) + end + + def get_const_defined_on(mod, const_name) + mod.const_get(const_name, false) + end + + def constants_defined_on(mod) + mod.constants(false) + end + end + + def recursive_const_get(const_name) + normalize_const_name(const_name).split('::').inject(Object) do |mod, name| + get_const_defined_on(mod, name) + end + end + + def recursive_const_defined?(const_name) + parts = normalize_const_name(const_name).split('::') + parts.inject([Object, '']) do |(mod, full_name), name| + yield(full_name, name) if block_given? && !(Module === mod) + return false unless const_defined_on?(mod, name) + [get_const_defined_on(mod, name), [mod.name, name].join('::')] + end + end + + def normalize_const_name(const_name) + const_name.sub(/\A::/, '') + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/reentrant_mutex.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/reentrant_mutex.rb new file mode 100644 index 0000000..28957a2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/reentrant_mutex.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +module RSpec + module Support + # Allows a thread to lock out other threads from a critical section of code, + # while allowing the thread with the lock to reenter that section. + # + # Based on Monitor as of 2.2 - + # https://github.com/ruby/ruby/blob/eb7ddaa3a47bf48045d26c72eb0f263a53524ebc/lib/monitor.rb#L9 + # + # Depends on Mutex, but Mutex is only available as part of core since 1.9.1: + # exists - http://ruby-doc.org/core-1.9.1/Mutex.html + # dne - http://ruby-doc.org/core-1.9.0/Mutex.html + # + # @private + class ReentrantMutex + def initialize + @owner = nil + @count = 0 + @mutex = Mutex.new + end + + def synchronize + enter + yield + ensure + exit + end + + private + + # This is fixing a bug #501 that is specific to Ruby 3.0. The new implementation + # depends on `owned?` that was introduced in Ruby 2.0, so both should work for Ruby 2.x. + if RUBY_VERSION.to_f >= 3.0 + def enter + @mutex.lock unless @mutex.owned? + @count += 1 + end + + def exit + unless @mutex.owned? + raise ThreadError, "Attempt to unlock a mutex which is locked by another thread/fiber" + end + @count -= 1 + @mutex.unlock if @count == 0 + end + else + def enter + @mutex.lock if @owner != Thread.current + @owner = Thread.current + @count += 1 + end + + def exit + @count -= 1 + return unless @count == 0 + @owner = nil + @mutex.unlock + end + end + end + + if defined? ::Mutex + # On 1.9 and up, this is in core, so we just use the real one + class Mutex < ::Mutex + # If you mock Mutex.new you break our usage of Mutex, so + # instead we capture the original method to return Mutexes. + NEW_MUTEX_METHOD = Mutex.method(:new) + + def self.new + NEW_MUTEX_METHOD.call + end + end + else # For 1.8.7 + # :nocov: + RSpec::Support.require_rspec_support "mutex" + # :nocov: + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/ruby_features.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/ruby_features.rb new file mode 100644 index 0000000..7ccdb7e --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/ruby_features.rb @@ -0,0 +1,221 @@ +# frozen_string_literal: true + +require 'rbconfig' +RSpec::Support.require_rspec_support "comparable_version" + +module RSpec + module Support + # @api private + # + # Provides query methods for different OS or OS features. + module OS + module_function + + def windows? + !!(RbConfig::CONFIG['host_os'] =~ /cygwin|mswin|mingw|bccwin|wince|emx/) + end + + def windows_file_path? + ::File::ALT_SEPARATOR == '\\' + end + end + + # @api private + # + # Provides query methods for different rubies + module Ruby + module_function + + def jruby? + RUBY_PLATFORM == 'java' + end + + def jruby_version + @jruby_version ||= ComparableVersion.new(JRUBY_VERSION) + end + + def jruby_9000? + jruby? && JRUBY_VERSION >= '9.0.0.0' + end + + def rbx? + defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx' + end + + def non_mri? + !mri? + end + + def mri? + !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby' + end + + def truffleruby? + defined?(RUBY_ENGINE) && RUBY_ENGINE == 'truffleruby' + end + end + + # @api private + # + # Provides query methods for ruby features that differ among + # implementations. + module RubyFeatures + module_function + + if Ruby.jruby? && RUBY_VERSION.to_f < 1.9 + # On JRuby 1.7 `--1.8` mode, `Process.respond_to?(:fork)` returns true, + # but when you try to fork, it raises an error: + # NotImplementedError: fork is not available on this platform + # + # When we drop support for JRuby 1.7 and/or Ruby 1.8, we can drop + # this special case. + def fork_supported? + false + end + else + def fork_supported? + Process.respond_to?(:fork) + end + end + + def optional_and_splat_args_supported? + Method.method_defined?(:parameters) + end + + def caller_locations_supported? + respond_to?(:caller_locations, true) + end + + if Exception.method_defined?(:cause) + def supports_exception_cause? + true + end + else + def supports_exception_cause? + false + end + end + + if RUBY_VERSION.to_f >= 3.2 + def supports_syntax_suggest? + true + end + else + def supports_syntax_suggest? + false + end + end + + if RUBY_VERSION.to_f >= 3.0 + # https://rubyreferences.github.io/rubychanges/3.0.html#keyword-arguments-are-now-fully-separated-from-positional-arguments + def kw_arg_separation? + true + end + else + def kw_arg_separation? + false + end + end + + if RUBY_VERSION.to_f >= 2.7 + def supports_taint? + false + end + else + def supports_taint? + true + end + end + ripper_requirements = [ComparableVersion.new(RUBY_VERSION) >= '1.9.2'] + + ripper_requirements.push(false) if Ruby.rbx? + + if Ruby.jruby? + ripper_requirements.push(Ruby.jruby_version >= '1.7.5') + # Ripper on JRuby 9.0.0.0.rc1 - 9.1.8.0 reports wrong line number + # or cannot parse source including `:if`. + # Ripper on JRuby 9.x.x.x < 9.1.17.0 can't handle keyword arguments + # Neither can JRuby 9.2, e.g. < 9.2.1.0 + ripper_requirements.push(!Ruby.jruby_version.between?('9.0.0.0.rc1', '9.2.0.0')) + end + + # TruffleRuby disables ripper due to low performance + ripper_requirements.push(false) if Ruby.truffleruby? + + if ripper_requirements.all? + def ripper_supported? + true + end + else + def ripper_supported? + false + end + end + + def distincts_kw_args_from_positional_hash? + RUBY_VERSION >= '3.0.0' + end + + if Ruby.mri? + def kw_args_supported? + RUBY_VERSION >= '2.0.0' + end + + def required_kw_args_supported? + RUBY_VERSION >= '2.1.0' + end + + def supports_rebinding_module_methods? + RUBY_VERSION.to_i >= 2 + end + else + # RBX / JRuby et al support is unknown for keyword arguments + begin + eval("o = Object.new; def o.m(a: 1); end;"\ + " raise SyntaxError unless o.method(:m).parameters.include?([:key, :a])") + + def kw_args_supported? + true + end + rescue SyntaxError + def kw_args_supported? + false + end + end + + begin + eval("o = Object.new; def o.m(a: ); end;"\ + "raise SyntaxError unless o.method(:m).parameters.include?([:keyreq, :a])") + + def required_kw_args_supported? + true + end + rescue SyntaxError + def required_kw_args_supported? + false + end + end + + begin + Module.new { def foo; end }.instance_method(:foo).bind(Object.new) + + def supports_rebinding_module_methods? + true + end + rescue TypeError + def supports_rebinding_module_methods? + false + end + end + end + + def module_refinement_supported? + Module.method_defined?(:refine) || Module.private_method_defined?(:refine) + end + + def module_prepends_supported? + Module.method_defined?(:prepend) || Module.private_method_defined?(:prepend) + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source.rb new file mode 100644 index 0000000..8aad27b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source.rb @@ -0,0 +1,87 @@ +# frozen_string_literal: true + +RSpec::Support.require_rspec_support 'encoded_string' +RSpec::Support.require_rspec_support 'ruby_features' + +module RSpec + module Support + # @private + # Represents a Ruby source file and provides access to AST and tokens. + class Source + attr_reader :source, :path + + # This class protects us against having File read and expand_path + # stubbed out within tests. + class File + class << self + [:read, :expand_path].each do |method_name| + define_method(method_name, &::File.method(method_name)) + end + end + end + + def self.from_file(path) + source = File.read(path) + new(source, path) + end + + if String.method_defined?(:encoding) + def initialize(source_string, path=nil) + @source = RSpec::Support::EncodedString.new(source_string, Encoding.default_external) + @path = path ? File.expand_path(path) : '(string)' + end + else # for 1.8.7 + # :nocov: + def initialize(source_string, path=nil) + @source = RSpec::Support::EncodedString.new(source_string) + @path = path ? File.expand_path(path) : '(string)' + end + # :nocov: + end + + def lines + @lines ||= source.split("\n") + end + + def inspect + "#<#{self.class} #{path}>" + end + + if RSpec::Support::RubyFeatures.ripper_supported? + RSpec::Support.require_rspec_support 'source/node' + RSpec::Support.require_rspec_support 'source/token' + + def ast + @ast ||= begin + require 'ripper' + sexp = Ripper.sexp(source) + raise SyntaxError unless sexp + Node.new(sexp) + end + end + + def tokens + @tokens ||= begin + require 'ripper' + tokens = Ripper.lex(source) + Token.tokens_from_ripper_tokens(tokens) + end + end + + def nodes_by_line_number + @nodes_by_line_number ||= begin + nodes_by_line_number = ast.select(&:location).group_by { |node| node.location.line } + Hash.new { |hash, key| hash[key] = [] }.merge(nodes_by_line_number) + end + end + + def tokens_by_line_number + @tokens_by_line_number ||= begin + nodes_by_line_number = tokens.group_by { |token| token.location.line } + Hash.new { |hash, key| hash[key] = [] }.merge(nodes_by_line_number) + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/location.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/location.rb new file mode 100644 index 0000000..fb5a377 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/location.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module RSpec + module Support + class Source + # @private + # Represents a source location of node or token. + Location = Struct.new(:line, :column) do + include Comparable + + def self.location?(array) + array.is_a?(Array) && array.size == 2 && array.all? { |e| e.is_a?(Integer) } + end + + def <=>(other) + line_comparison = (line <=> other.line) + return line_comparison unless line_comparison == 0 + column <=> other.column + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/node.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/node.rb new file mode 100644 index 0000000..359bf9f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/node.rb @@ -0,0 +1,112 @@ +# frozen_string_literal: true + +RSpec::Support.require_rspec_support 'source/location' + +module RSpec + module Support + class Source + # @private + # A wrapper for Ripper AST node which is generated with `Ripper.sexp`. + class Node + include Enumerable + + attr_reader :sexp, :parent + + def self.sexp?(array) + array.is_a?(Array) && array.first.is_a?(Symbol) + end + + def initialize(ripper_sexp, parent=nil) + @sexp = ripper_sexp.freeze + @parent = parent + end + + def type + sexp[0] + end + + def args + @args ||= raw_args.map do |raw_arg| + if Node.sexp?(raw_arg) + Node.new(raw_arg, self) + elsif Location.location?(raw_arg) + Location.new(*raw_arg) + elsif raw_arg.is_a?(Array) + ExpressionSequenceNode.new(raw_arg, self) + else + raw_arg + end + end.freeze + end + + def children + @children ||= args.select { |arg| arg.is_a?(Node) }.freeze + end + + def location + @location ||= args.find { |arg| arg.is_a?(Location) } + end + + # We use a loop here (instead of recursion) to prevent SystemStackError + def each + return to_enum(__method__) unless block_given? + + node_queue = [] + node_queue << self + + while (current_node = node_queue.shift) + yield current_node + node_queue.concat(current_node.children) + end + end + + def each_ancestor + return to_enum(__method__) unless block_given? + + current_node = self + + while (current_node = current_node.parent) + yield current_node + end + end + + def inspect + "#<#{self.class} #{type}>" + end + + private + + def raw_args + sexp[1..-1] || [] + end + end + + # @private + # Basically `Ripper.sexp` generates arrays whose first element is a symbol (type of sexp), + # but it exceptionally generates typeless arrays for expression sequence: + # + # Ripper.sexp('foo; bar') + # => [ + # :program, + # [ # Typeless array + # [:vcall, [:@ident, "foo", [1, 0]]], + # [:vcall, [:@ident, "bar", [1, 5]]] + # ] + # ] + # + # We wrap typeless arrays in this pseudo type node + # so that it can be handled in the same way as other type node. + class ExpressionSequenceNode < Node + def type + :_expression_sequence + end + + private + + def raw_args + sexp + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/token.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/token.rb new file mode 100644 index 0000000..ca887a7 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/token.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: true + +RSpec::Support.require_rspec_support 'source/location' + +module RSpec + module Support + class Source + # @private + # A wrapper for Ripper token which is generated with `Ripper.lex`. + class Token + CLOSING_TYPES_BY_OPENING_TYPE = { + :on_lbracket => :on_rbracket, + :on_lparen => :on_rparen, + :on_lbrace => :on_rbrace, + :on_heredoc_beg => :on_heredoc_end + }.freeze + + CLOSING_KEYWORDS_BY_OPENING_KEYWORD = { + 'def' => 'end', + 'do' => 'end', + }.freeze + + attr_reader :token + + def self.tokens_from_ripper_tokens(ripper_tokens) + ripper_tokens.map { |ripper_token| new(ripper_token) }.freeze + end + + def initialize(ripper_token) + @token = ripper_token.freeze + end + + def location + @location ||= Location.new(*token[0]) + end + + def type + token[1] + end + + def string + token[2] + end + + def ==(other) + token == other.token + end + + alias_method :eql?, :== + + def inspect + "#<#{self.class} #{type} #{string.inspect}>" + end + + def keyword? + type == :on_kw + end + + def equals_operator? + type == :on_op && string == '=' + end + + def opening? + opening_delimiter? || opening_keyword? + end + + def closed_by?(other) + delimiter_closed_by?(other) || keyword_closed_by?(other) + end + + private + + def opening_delimiter? + CLOSING_TYPES_BY_OPENING_TYPE.key?(type) + end + + def opening_keyword? + return false unless keyword? + CLOSING_KEYWORDS_BY_OPENING_KEYWORD.key?(string) + end + + def delimiter_closed_by?(other) + other.type == CLOSING_TYPES_BY_OPENING_TYPE[type] + end + + def keyword_closed_by?(other) + return false unless keyword? + return true if other.string == CLOSING_KEYWORDS_BY_OPENING_KEYWORD[string] + + # Ruby 3's `end`-less method definition: `def method_name = body` + string == 'def' && other.equals_operator? && location.line == other.location.line + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec.rb new file mode 100644 index 0000000..5468cf9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true + +require 'rspec/support' +require 'rspec/support/spec/in_sub_process' + +RSpec::Support.require_rspec_support "spec/deprecation_helpers" +RSpec::Support.require_rspec_support "spec/diff_helpers" +RSpec::Support.require_rspec_support "spec/with_isolated_stderr" +RSpec::Support.require_rspec_support "spec/stderr_splitter" +RSpec::Support.require_rspec_support "spec/formatting_support" +RSpec::Support.require_rspec_support "spec/with_isolated_directory" +RSpec::Support.require_rspec_support "ruby_features" + +warning_preventer = $stderr = RSpec::Support::StdErrSplitter.new($stderr) + +RSpec.configure do |c| + c.include RSpecHelpers + c.include RSpec::Support::WithIsolatedStdErr + c.include RSpec::Support::FormattingSupport + c.include RSpec::Support::InSubProcess + + unless defined?(Debugger) # debugger causes warnings when used + c.before do + warning_preventer.reset! + end + + c.after do + warning_preventer.verify_no_warnings! + end + end + + if c.files_to_run.one? + c.full_backtrace = true + c.default_formatter = 'doc' + end + + c.filter_run_when_matching :focus + + c.example_status_persistence_file_path = "./spec/examples.txt" + + c.define_derived_metadata :failing_on_windows_ci do |meta| + meta[:pending] ||= "This spec fails on Windows CI and needs someone to fix it." + end if RSpec::Support::OS.windows? && ENV['CI'] +end + +module RSpec + module Support + module Spec + def self.setup_simplecov(&block) + # Simplecov emits some ruby warnings when loaded, so silence them. + old_verbose, $VERBOSE = $VERBOSE, false + + return if ENV['NO_COVERAGE'] || RUBY_VERSION < '1.9.3' + return if RUBY_ENGINE != 'ruby' || RSpec::Support::OS.windows? + + # Don't load it when we're running a single isolated + # test file rather than the whole suite. + return if RSpec.configuration.files_to_run.one? + + require 'simplecov' + start_simplecov(&block) + rescue LoadError + warn "Simplecov could not be loaded" + ensure + $VERBOSE = old_verbose + end + + def self.start_simplecov(&block) + SimpleCov.start do + add_filter "bundle/" + add_filter "tmp/" + add_filter do |source_file| + # Filter out `spec` directory except when it is under `lib` + # (as is the case in rspec-support) + source_file.filename.include?('/spec/') && !source_file.filename.include?('/lib/') + end + + instance_eval(&block) if block + end + end + private_class_method :start_simplecov + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/deprecation_helpers.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/deprecation_helpers.rb new file mode 100644 index 0000000..f7458c3 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/deprecation_helpers.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +module RSpecHelpers + def expect_deprecation_with_call_site(file, line, snippet=//) + expect(RSpec.configuration.reporter).to receive(:deprecation). + with(include(:deprecated => match(snippet), :call_site => include([file, line].join(':')))) + end + + def expect_deprecation_without_call_site(snippet=//) + expect(RSpec.configuration.reporter).to receive(:deprecation). + with(include(:deprecated => match(snippet), :call_site => eq(nil))) + end + + def expect_warn_deprecation_with_call_site(file, line, snippet=//) + expect(RSpec.configuration.reporter).to receive(:deprecation). + with(include(:message => match(snippet), :call_site => include([file, line].join(':')))) + end + + def expect_warn_deprecation(snippet=//) + expect(RSpec.configuration.reporter).to receive(:deprecation). + with(include(:message => match(snippet))) + end + + def allow_deprecation + allow(RSpec.configuration.reporter).to receive(:deprecation) + end + + def expect_no_deprecations + expect(RSpec.configuration.reporter).not_to receive(:deprecation) + end + alias expect_no_deprecation expect_no_deprecations + + def expect_warning_without_call_site(expected=//) + expect(::Kernel).to receive(:warn). + with(match(expected).and(satisfy { |message| !(/Called from/ =~ message) })) + end + + def expect_warning_with_call_site(file, line, expected=//) + expect(::Kernel).to receive(:warn). + with(match(expected).and(match(/Called from #{file}:#{line}/))) + end + + def expect_no_warnings + expect(::Kernel).not_to receive(:warn) + end + + def allow_warning + allow(::Kernel).to receive(:warn) + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/diff_helpers.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/diff_helpers.rb new file mode 100644 index 0000000..58e0712 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/diff_helpers.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require 'diff/lcs' + +module RSpec + module Support + module Spec + module DiffHelpers + # In the updated version of diff-lcs several diff headers change format slightly + # compensate for this and change minimum version in RSpec 4 + if ::Diff::LCS::VERSION.to_f < 1.4 + def one_line_header(line_number=2) + "-1,#{line_number} +1,#{line_number}" + end + elsif ::Diff::LCS::VERSION.to_f < 1.6 + def one_line_header(_=2) + "-1 +1" + end + else + def one_line_header(line_number=2) + if line_number - 1 == 1 + "-1 +1" + else + "-1,#{line_number - 1} +1,#{line_number - 1}" + end + end + end + + if ::Diff::LCS::VERSION.to_f > 1.5 + def removing_two_line_header + "-1,2 +0,0" + end + elsif Diff::LCS::VERSION.to_f < 1.4 || Diff::LCS::VERSION >= "1.4.4" + def removing_two_line_header + "-1,3 +1" + end + else + def removing_two_line_header + "-1,3 +1,5" + end + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/formatting_support.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/formatting_support.rb new file mode 100644 index 0000000..a773a20 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/formatting_support.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module RSpec + module Support + module FormattingSupport + def dedent(string) + string.gsub(/^\s+\|/, '').chomp + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/in_sub_process.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/in_sub_process.rb new file mode 100644 index 0000000..4130225 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/in_sub_process.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +module RSpec + module Support + module InSubProcess + if Process.respond_to?(:fork) && !(Ruby.jruby? && RUBY_VERSION == '1.8.7') + + UnmarshableObject = Struct.new(:error) + + # Useful as a way to isolate a global change to a subprocess. + + def in_sub_process(prevent_warnings=true) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize + exception_reader, exception_writer = IO.pipe + result_reader, result_writer = IO.pipe + + # Set binary mode to avoid errors surrounding ascii-8bit to utf-8 conversion + # this happens with warnings on rspec-rails for example + [exception_reader, exception_writer, result_reader, result_writer].each { |io| io.binmode } + + pid = Process.fork do + warning_preventer = $stderr = RSpec::Support::StdErrSplitter.new($stderr) + + begin + result = yield + warning_preventer.verify_no_warnings! if prevent_warnings + # rubocop:disable Lint/HandleExceptions + rescue Support::AllExceptionsExceptOnesWeMustNotRescue => exception + # rubocop:enable Lint/HandleExceptions + end + + exception_writer.write marshal_dump_with_unmarshable_object_handling(exception) + exception_reader.close + exception_writer.close + + result_writer.write marshal_dump_with_unmarshable_object_handling(result) + result_reader.close + result_writer.close + + exit! # prevent at_exit hooks from running (e.g. minitest) + end + + exception_writer.close + result_writer.close + Process.waitpid(pid) + + exception = Marshal.load(exception_reader.read) + exception_reader.close + raise exception if exception + + result = Marshal.load(result_reader.read) + result_reader.close + result + end + alias :in_sub_process_if_possible :in_sub_process + + def marshal_dump_with_unmarshable_object_handling(object) + Marshal.dump(object) + rescue TypeError => error + Marshal.dump(UnmarshableObject.new(error)) + end + else + def in_sub_process(*) + skip "This spec requires forking to work properly, " \ + "and your platform does not support forking" + end + + def in_sub_process_if_possible(*) + yield + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/library_wide_checks.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/library_wide_checks.rb new file mode 100644 index 0000000..d424525 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/library_wide_checks.rb @@ -0,0 +1,152 @@ +# frozen_string_literal: true + +require 'rspec/support/spec/shell_out' + +module RSpec + module Support + module WhitespaceChecks + # This malformed whitespace detection logic has been borrowed from bundler: + # https://github.com/bundler/bundler/blob/v1.8.0/spec/quality_spec.rb + def check_for_tab_characters(filename) + failing_lines = [] + File.readlines(filename).each_with_index do |line, number| + failing_lines << number + 1 if line =~ /\t/ + end + + return if failing_lines.empty? + "#{filename} has tab characters on lines #{failing_lines.join(', ')}" + end + + def check_for_extra_spaces(filename) + failing_lines = [] + File.readlines(filename).each_with_index do |line, number| + next if line =~ /^\s+#.*\s+\n$/ + failing_lines << number + 1 if line =~ /\s+\n$/ + end + + return if failing_lines.empty? + "#{filename} has spaces on the EOL on lines #{failing_lines.join(', ')}" + end + end + end +end + +RSpec.shared_examples_for "library wide checks" do |lib, options| + consider_a_test_env_file = options.fetch(:consider_a_test_env_file, /MATCHES NOTHING/) + allowed_loaded_feature_regexps = options.fetch(:allowed_loaded_feature_regexps, []) + preamble_for_lib = options[:preamble_for_lib] + preamble_for_spec = "require 'rspec/core'; require 'spec_helper'" + skip_spec_files = options.fetch(:skip_spec_files, /MATCHES NOTHING/) + + include RSpec::Support::ShellOut + include RSpec::Support::WhitespaceChecks + + define_method :files_to_require_for do |sub_dir| + slash = File::SEPARATOR + lib_path_re = /#{slash + lib}[^#{slash}]*#{slash}lib/ + load_path = $LOAD_PATH.grep(lib_path_re).first + directory = load_path.sub(/lib$/, sub_dir) + files = Dir["#{directory}/**/*.rb"] + extract_regex = /#{Regexp.escape(directory) + File::SEPARATOR}(.+)\.rb$/ + + # We sort to ensure the files are loaded in a consistent order, regardless + # of OS. Otherwise, it could load in a different order on Travis than + # locally, and potentially trigger a "circular require considered harmful" + # warning or similar. + files.sort.map { |file| file[extract_regex, 1] } + end + + def command_from(code_lines) + code_lines.join("\n") + end + + def load_all_files(files, preamble, postamble=nil) + requires = files.map { |f| "require '#{f}'" } + command = command_from(Array(preamble) + requires + Array(postamble)) + + stdout, stderr, status = with_env 'NO_COVERAGE' => '1' do + options = %w[ -w ] + options << "--disable=gem" if RUBY_VERSION.to_f >= 1.9 && RSpec::Support::Ruby.mri? + run_ruby_with_current_load_path(command, *options) + end + + [stdout, strip_known_warnings(stderr), status.exitstatus] + end + + define_method :load_all_lib_files do + files = all_lib_files - lib_test_env_files + preamble = ['orig_loaded_features = $".dup', preamble_for_lib] + postamble = ['puts(($" - orig_loaded_features).join("\n"))'] + + @loaded_feature_lines, stderr, exitstatus = load_all_files(files, preamble, postamble) + ["", stderr, exitstatus] + end + + define_method :load_all_spec_files do + files = files_to_require_for("spec") + lib_test_env_files + files = files.reject { |f| f =~ skip_spec_files } + load_all_files(files, preamble_for_spec) + end + + attr_reader :all_lib_files, :lib_test_env_files, + :lib_file_results, :spec_file_results + + before(:context) do + @all_lib_files = files_to_require_for("lib") + @lib_test_env_files = all_lib_files.grep(consider_a_test_env_file) + + @lib_file_results, @spec_file_results = [ + # Load them in parallel so it's faster... + Thread.new { load_all_lib_files }, + Thread.new { load_all_spec_files } + ].map(&:join).map(&:value) + end + + def have_successful_no_warnings_output + eq ["", "", 0] + end + + it "issues no warnings when loaded", :slow do + expect(lib_file_results).to have_successful_no_warnings_output + end + + it "issues no warnings when the spec files are loaded", :slow do + expect(spec_file_results).to have_successful_no_warnings_output + end + + it 'only loads a known set of stdlibs so gem authors are forced ' \ + 'to load libs they use to have passing specs', :slow do + loaded_features = @loaded_feature_lines.split("\n") + if RUBY_VERSION == '1.8.7' + # On 1.8.7, $" returns the relative require path if that was used + # to require the file. LIB_REGEX will not match the relative version + # since it has a `/lib` prefix. Here we deal with this by expanding + # relative files relative to the $LOAD_PATH dir (lib). + Dir.chdir("lib") { loaded_features.map! { |f| File.expand_path(f) } } + end + + loaded_features.reject! { |feature| RSpec::CallerFilter::LIB_REGEX =~ feature } + loaded_features.reject! { |feature| allowed_loaded_feature_regexps.any? { |r| r =~ feature } } + + expect(loaded_features).to eq([]) + end + + RSpec::Matchers.define :be_well_formed do + match do |actual| + actual.empty? + end + + failure_message do |actual| + actual.join("\n") + end + end + + it "has no malformed whitespace", :slow do + error_messages = [] + `git ls-files -z`.split("\x0").each do |filename| + error_messages << check_for_tab_characters(filename) + error_messages << check_for_extra_spaces(filename) + end + expect(error_messages.compact).to be_well_formed + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/shell_out.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/shell_out.rb new file mode 100644 index 0000000..3727c8a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/shell_out.rb @@ -0,0 +1,115 @@ +# frozen_string_literal: true + +require 'open3' +require 'rake/file_utils' +require 'shellwords' + +module RSpec + module Support + module ShellOut + def with_env(vars) + original = ENV.to_hash + vars.each { |k, v| ENV[k] = v } + + begin + yield + ensure + ENV.replace(original) + end + end + + if Open3.respond_to?(:capture3) # 1.9+ + def shell_out(*command) + stdout, stderr, status = Open3.capture3(*command) + return stdout, filter(stderr), status + end + else # 1.8.7 + # popen3 doesn't provide the exit status so we fake it out. + FakeProcessStatus = Struct.new(:exitstatus) + + def shell_out(*command) + stdout = stderr = nil + + Open3.popen3(*command) do |_in, out, err| + stdout = out.read + stderr = err.read + end + + status = FakeProcessStatus.new(0) + return stdout, filter(stderr), status + end + end + + def run_ruby_with_current_load_path(ruby_command, *flags) + command = [ + FileUtils::RUBY, + "-I#{$LOAD_PATH.map(&:shellescape).join(File::PATH_SEPARATOR)}", + "-e", ruby_command, *flags + ] + + # Unset these env vars because `ruby -w` will issue warnings whenever + # they are set to non-default values. + with_env 'RUBY_GC_HEAP_FREE_SLOTS' => nil, 'RUBY_GC_MALLOC_LIMIT' => nil, + 'RUBY_FREE_MIN' => nil do + shell_out(*command) + end + end + + LINES_TO_IGNORE = + [ + # Ignore bundler warning. + %r{bundler/source/rubygems}, + # Ignore bundler + rubygems warning. + %r{site_ruby/\d\.\d\.\d/rubygems}, + %r{site_ruby/\d\.\d\.\d/bundler}, + %r{jruby-\d\.\d\.\d+\.\d/lib/ruby/stdlib/rubygems}, + %r{lib/rubygems/custom_require}, + # This is required for windows for some reason + %r{lib/bundler/rubygems}, + # This is a JRuby file that generates warnings on 9.0.3.0 + %r{lib/ruby/stdlib/jar}, + # This is a JRuby file that generates warnings on 9.1.7.0 + %r{org/jruby/RubyKernel\.java}, + # This is a JRuby gem that generates warnings on 9.1.7.0 + %r{ffi-1\.13\.\d+-java}, + %r{uninitialized constant FFI}, + # These are related to the above, there is a warning about io from FFI + %r{jruby-\d\.\d\.\d+\.\d/lib/ruby/stdlib/io}, + %r{io/console on JRuby shells out to stty for most operations}, + # This is a JRuby 9.1.17.0 error on Github Actions + %r{io/console not supported; tty will not be manipulated}, + # This is a JRuby 9.2.1.x error + %r{jruby/kernel/gem_prelude}, + %r{lib/jruby\.jar!/jruby/preludes}, + # Ignore some JRuby errors for gems + %r{jruby/\d\.\d(\.\d)?/gems/aruba}, + %r{jruby/\d\.\d(\.\d)?/gems/ffi}, + %r{warning: encoding options not supported in 1\.8}, + # Ignore errors from asdf + %r{\.asdf/installs}, + ] + + def strip_known_warnings(input) + input.split("\n").reject do |l| + LINES_TO_IGNORE.any? { |to_ignore| l =~ to_ignore } || + # Remove blank lines + l == "" || l.nil? + end.join("\n") + end + + private + + if Ruby.jruby? + def filter(output) + output.each_line.reject do |line| + line.include?("lib/ruby/shared/rubygems") + end.join($/) + end + else + def filter(output) + output + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/stderr_splitter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/stderr_splitter.rb new file mode 100644 index 0000000..9caa34c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/stderr_splitter.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +require 'stringio' + +module RSpec + module Support + class StdErrSplitter + def initialize(original) + @orig_stderr = original + @output_tracker = ::StringIO.new + @last_line = nil + end + + respond_to_name = (::RUBY_VERSION.to_f < 1.9) ? :respond_to? : :respond_to_missing? + define_method respond_to_name do |*args| + @orig_stderr.respond_to?(*args) || super(*args) + end + + def method_missing(name, *args, &block) + @output_tracker.__send__(name, *args, &block) if @output_tracker.respond_to?(name) + @orig_stderr.__send__(name, *args, &block) + end + + def ==(other) + @orig_stderr == other + end + + def reopen(*args) + reset! + @orig_stderr.reopen(*args) + end + + # To work around JRuby error: + # can't convert RSpec::Support::StdErrSplitter into String + def to_io + @orig_stderr.to_io + end + + # To work around JRuby error: + # TypeError: $stderr must have write method, RSpec::StdErrSplitter given + def write(line) + return if line =~ %r{^\S+/gems/\S+:\d+: warning:} # http://rubular.com/r/kqeUIZOfPG + + # Ruby 2.7.0 warnings from keyword arguments span multiple lines, extend check above + # to look for the next line. + return if @last_line =~ %r{^\S+/gems/\S+:\d+: warning:} && + line =~ %r{warning: The called method .* is defined here} + + # Ruby 2.7.0 complains about hashes used in place of keyword arguments + # Aruba 0.14.2 uses this internally triggering that here + return if line =~ %r{lib/ruby/2\.7\.0/fileutils\.rb:622: warning:} + + @orig_stderr.write(line) + @output_tracker.write(line) + ensure + @last_line = line + end + + def has_output? + !output.empty? + end + + def reset! + @output_tracker = ::StringIO.new + end + + def verify_no_warnings! + raise "Warnings were generated: #{output}" if has_output? + reset! + end + + def output + @output_tracker.string + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/string_matcher.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/string_matcher.rb new file mode 100644 index 0000000..b8c0c71 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/string_matcher.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require 'rspec/matchers' +# Special matcher for comparing encoded strings so that +# we don't run any expectation failures through the Differ, +# which also relies on EncodedString. Instead, confirm the +# strings have the same bytes. +RSpec::Matchers.define :be_identical_string do |expected| + if String.method_defined?(:encoding) + match do + expected_encoding? && + actual.bytes.to_a == expected.bytes.to_a + end + + failure_message do + "expected\n#{actual.inspect} (#{actual.encoding.name}) to be identical to\n"\ + "#{expected.inspect} (#{expected.encoding.name})\n"\ + "The exact bytes are printed below for more detail:\n"\ + "#{actual.bytes.to_a}\n"\ + "#{expected.bytes.to_a}\n"\ + end + + # Depends on chaining :with_same_encoding for it to + # check for string encoding. + def expected_encoding? + if defined?(@expect_same_encoding) && @expect_same_encoding + actual.encoding == expected.encoding + else + true + end + end + else + match do + actual.split(//) == expected.split(//) + end + + failure_message do + "expected\n#{actual.inspect} to be identical to\n#{expected.inspect}\n" + end + end + + chain :with_same_encoding do + @expect_same_encoding ||= true + end +end +RSpec::Matchers.alias_matcher :a_string_identical_to, :be_identical_string +RSpec::Matchers.alias_matcher :be_diffed_as, :be_identical_string diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/with_isolated_directory.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/with_isolated_directory.rb new file mode 100644 index 0000000..f81a7df --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/with_isolated_directory.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require 'tmpdir' + +RSpec.shared_context "isolated directory" do + around do |ex| + Dir.mktmpdir do |tmp_dir| + Dir.chdir(tmp_dir, &ex) + end + end +end + +RSpec.configure do |c| + c.include_context "isolated directory", :isolated_directory => true +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/with_isolated_stderr.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/with_isolated_stderr.rb new file mode 100644 index 0000000..ef62be4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/with_isolated_stderr.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module RSpec + module Support + module WithIsolatedStdErr + def with_isolated_stderr + original = $stderr + $stderr = StringIO.new + yield + ensure + $stderr = original + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/version.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/version.rb new file mode 100644 index 0000000..e5fd9af --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/version.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module RSpec + module Support + module Version + STRING = '3.13.5' + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/warnings.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/warnings.rb new file mode 100644 index 0000000..31783d9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/warnings.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +require 'rspec/support' +RSpec::Support.require_rspec_support "caller_filter" + +module RSpec + module Support + module Warnings + def deprecate(deprecated, options={}) + warn_with "DEPRECATION: #{deprecated} is deprecated.", options + end + + # @private + # + # Used internally to print deprecation warnings + # when rspec-core isn't loaded + def warn_deprecation(message, options={}) + warn_with "DEPRECATION: \n #{message}", options + end + + # @private + # + # Used internally to print warnings + def warning(text, options={}) + warn_with "WARNING: #{text}.", options + end + + # @private + # + # Used internally to print longer warnings + def warn_with(message, options={}) + call_site = options.fetch(:call_site) { CallerFilter.first_non_rspec_line } + message += " Use #{options[:replacement]} instead." if options[:replacement] + message += " Called from #{call_site}." if call_site + Support.warning_notifier.call message + end + end + end + + extend RSpec::Support::Warnings +end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/with_keywords_when_needed.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/with_keywords_when_needed.rb new file mode 100644 index 0000000..bec99f4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/with_keywords_when_needed.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +RSpec::Support.require_rspec_support("method_signature_verifier") + +module RSpec + module Support + module WithKeywordsWhenNeeded + # This module adds keyword sensitive support for core ruby methods + # where we cannot use `ruby2_keywords` directly. + + module_function + + if RSpec::Support::RubyFeatures.kw_args_supported? + # Remove this in RSpec 4 in favour of explicitly passed in kwargs where + # this is used. Works around a warning in Ruby 2.7 + + def class_exec(klass, *args, &block) + if MethodSignature.new(block).has_kw_args_in?(args) + binding.eval(<<-CODE, __FILE__, __LINE__) + kwargs = args.pop + klass.class_exec(*args, **kwargs, &block) + CODE + else + klass.class_exec(*args, &block) + end + end + ruby2_keywords :class_exec if respond_to?(:ruby2_keywords, true) + else + def class_exec(klass, *args, &block) + klass.class_exec(*args, &block) + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/.document b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/.document new file mode 100644 index 0000000..6fbe0c0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/.document @@ -0,0 +1,5 @@ +COPYING +*.md +*.txt +docs/ +ext/stringio/ diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/.rdoc_options b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/.rdoc_options new file mode 100644 index 0000000..f9297d9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/.rdoc_options @@ -0,0 +1,2 @@ +--- +main_page: README.md diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/COPYING b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/COPYING new file mode 100644 index 0000000..48e5a96 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/COPYING @@ -0,0 +1,56 @@ +Ruby is copyrighted free software by Yukihiro Matsumoto . +You can redistribute it and/or modify it under either the terms of the +2-clause BSDL (see the file BSDL), or the conditions below: + +1. You may make and give away verbatim copies of the source form of the + software without restriction, provided that you duplicate all of the + original copyright notices and associated disclaimers. + +2. You may modify your copy of the software in any way, provided that + you do at least ONE of the following: + + a. place your modifications in the Public Domain or otherwise + make them Freely Available, such as by posting said + modifications to Usenet or an equivalent medium, or by allowing + the author to include your modifications in the software. + + b. use the modified software only within your corporation or + organization. + + c. give non-standard binaries non-standard names, with + instructions on where to get the original software distribution. + + d. make other distribution arrangements with the author. + +3. You may distribute the software in object code or binary form, + provided that you do at least ONE of the following: + + a. distribute the binaries and library files of the software, + together with instructions (in the manual page or equivalent) + on where to get the original distribution. + + b. accompany the distribution with the machine-readable source of + the software. + + c. give non-standard binaries non-standard names, with + instructions on where to get the original software distribution. + + d. make other distribution arrangements with the author. + +4. You may modify and include the part of the software into any other + software (possibly commercial). But some files in the distribution + are not written by the author, so that they are not under these terms. + + For the list of those files and their copying conditions, see the + file LEGAL. + +5. The scripts and library files supplied as input to or produced as + output from the software do not automatically fall under the + copyright of the software, but belong to whomever generated them, + and may be sold commercially, and may be aggregated with this + software. + +6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/LICENSE.txt b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/LICENSE.txt new file mode 100644 index 0000000..66d9359 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/NEWS.md b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/NEWS.md new file mode 100644 index 0000000..e82bd36 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/NEWS.md @@ -0,0 +1,243 @@ +# News + +## 3.1.7 - 2025-04-21 + +### Improvements + + * CRuby: Added support for `rb_io_mode_t` that will be introduced in + Ruby 3.5 or later. + * GH-129 + * Patch by Samuel Williams + +### Thanks + + * Samuel Williams + +## 3.1.6 - 2025-03-25 + +### Fixes + + * CRuby: Fix SEGV at unget to a null device StringIO + * JRuby: + * Fix NullPointerException at unget to a null device StringIO + * Use proper checkEncoding signature + * Update strioWrite logic to match CRuby + * GH-124 + +## 3.1.5 - 2025-02-21 + +### Improvements + + * JRuby: Improved compatibility with CRuby for `StringIO#seek` with + frozen string. + * GH-119 + * GH-121 + +## 3.1.4 - 2025-02-20 + +### Improvements + + * JRuby: Improved compatibility with CRuby. + * GH-116 + +### Fixes + + * CRuby: Fixed a bug that `StringIO` may mutate a shared string. + * GH-117 + +## 3.1.3 - 2025-02-14 + +### Fixes + + * JRuby: Fixed a bug that JRuby may not be able to be started + * GH-112 + * GH-113 + * Reported by Karol Bucek + +### Thanks + + * Karol Bucek + +## 3.1.2 - 2024-11-07 + +### Improvements + + * JRuby: Added support for detecting encoding by BOM. + * GH-100 + * GH-101 + +### Fixes + + * CRuby: Fixed a bug that unknown memory may be used by + `StringIO#ungetc`/`StringIO#ungetbyte`. + * https://hackerone.com/reports/2805165 + * Reported by manun. + +### Thanks + + * manun + +## 3.1.1 - 2024-06-13 + +### Improvements + + * JRuby: Improved. + * GH-83 + * GH-84 + * GH-85 + + * Added `StringIO::MAX_LENGTH`. + + * Added support for NULL `StringIO` by `StringIO.new(nil)`. + + * Improved IO compatibility for partial read. + * GH-95 + * https://bugs.ruby-lang.org/issues/20418 + +### Fixes + + * Fixed a bug that coderange isn't updated after overwrite. + * Reported by Tiago Cardoso. + * https://bugs.ruby-lang.org/issues/20185 + * GH-77 + * GH-79 + +### Thanks + + * Tiago Cardoso + +## 3.1.0 - 2023-11-28 + +### Fixes + + * TruffleRuby: Do not compile the C extension + + GH-71 + +## 3.0.9 - 2023-11-08 + +### Improvements + + * JRuby: Aligned `StringIO#gets` behavior with the C implementation. + + GH-61 + +### Fixes + + * CRuby: Fixed `StringIO#pread` with the length 0. + + Patch by Jean byroot Boussier. + + GH-67 + + * CRuby: Fixed a bug that `StringIO#gets` with non ASCII compatible + encoding such as UTF-16 doesn't detect correct new line characters. + + Reported by IWAMOTO Kouichi. + + GH-68 + +### Thanks + + * Jean byroot Boussier + + * IWAMOTO Kouichi + +## 3.0.8 - 2023-08-10 + +### Improvements + + * Added `StringIO#pread`. + + Patch by Jean byroot Boussier. + + GH-56 + + * JRuby: Added `StringIO::VERSION`. + + GH-57 GH-59 + +### Thanks + + * Jean byroot Boussier + +## 3.0.7 - 2023-06-02 + + * CRuby: Avoid direct struct usage. This change is for supporting + Ruby 3.3. + + GH-54 + +## 3.0.6 - 2023-04-14 + +### Improvements + + * CRuby: Added support for write barrier. + + * JRuby: Added missing arty-checking. + + GH-48 + + * JRuby: Added support for `StringIO.new(encoding:)`. + + GH-45 + +## 3.0.5 - 2023-02-02 + +### Improvements + +### Fixes + + * Fixed a bug that `StringIO#gets("2+ character", chomp: true)` did not + remove the separator at the end. + [[Bug #19389](https://bugs.ruby-lang.org/issues/19389)] + +## 3.0.4 - 2022-12-09 + +### Improvements + + * JRuby: Changed to use flag registry. + [[GitHub#33](https://github.com/ruby/stringio/pull/26)] + +## 3.0.3 - 2022-12-08 + +### Improvements + + * Improved documents. + [[GitHub#33](https://github.com/ruby/stringio/pull/33)] + [[GitHub#34](https://github.com/ruby/stringio/pull/34)] + [[GitHub#35](https://github.com/ruby/stringio/pull/35)] + [[GitHub#36](https://github.com/ruby/stringio/pull/36)] + [[GitHub#37](https://github.com/ruby/stringio/pull/37)] + [Patch by Burdette Lamar] + +### Fixes + + * Fixed a bug that large `StringIO#ungetc`/`StringIO#ungetbyte` + break internal buffer. + + * Fixed a bug that `StringIO#each("2+ character", chomp: true)` cause + infinite loop. + [[Bug #18769](https://bugs.ruby-lang.org/issues/18769)] + + * Fixed a bug that `StringIO#each(nil, chomp: true)` chomps. + [[Bug #18770](https://bugs.ruby-lang.org/issues/18770)] + + * Fixed a bug that `StringIO#each("", chomp: true)` isn't compatible + with `IO#each("", chomp: true)`. + [[Bug #18768](https://bugs.ruby-lang.org/issues/18768)] + + * Fixed a bug that `StringIO#set_encoding` doesn't accept external + and internal encodings pairo. + [[GitHub#16](https://github.com/ruby/stringio/issues/16)] + [Reported by Kenta Murata] + + * Fixed a bug that `StringIO#truncate` isn't compatible with + `File#truncate`. + +### Thanks + + * Kenta Murata + + * Burdette Lamar + diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/README.md b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/README.md new file mode 100644 index 0000000..0b875b0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/README.md @@ -0,0 +1,45 @@ +# StringIO + +![ubuntu](https://github.com/ruby/stringio/workflows/ubuntu/badge.svg?branch=master&event=push) +![macos](https://github.com/ruby/stringio/workflows/macos/badge.svg?branch=master&event=push) +![windows](https://github.com/ruby/stringio/workflows/windows/badge.svg?branch=master&event=push) + +Pseudo `IO` class from/to `String`. + +This library is based on MoonWolf version written in Ruby. Thanks a lot. + +## Differences to `IO` + +* `fileno` raises `NotImplementedError`. +* encoding conversion is not implemented, and ignored silently. +* there is no `#to_io` method because this is not an `IO`. + +## Installation + +Add this line to your application's Gemfile: + +```ruby +gem 'stringio' +``` + +And then execute: + + $ bundle + +Or install it yourself as: + + $ gem install stringio + +## Development + +Run `bundle install` to install dependencies and then `bundle exec rake test` to run the tests. + +To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, author a NEWS.md section, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). + +## Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/stringio. + +## License + +The gem is available as open source under the terms of the [2-Clause BSD License](https://opensource.org/licenses/BSD-2-Clause). diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/docs/io.rb b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/docs/io.rb new file mode 100644 index 0000000..bef7551 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/docs/io.rb @@ -0,0 +1,8 @@ +# :stopdoc: +class IO + module generic_readable + end + module generic_writable + end +end +# :startdoc: diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/.document b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/.document new file mode 100644 index 0000000..decba01 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/.document @@ -0,0 +1 @@ +*.[ch] diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/Makefile b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/Makefile new file mode 100644 index 0000000..8391feb --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/Makefile @@ -0,0 +1,269 @@ + +SHELL = /bin/sh + +# V=0 quiet, V=1 verbose. other values don't work. +V = 0 +V0 = $(V:0=) +Q1 = $(V:1=) +Q = $(Q1:0=@) +ECHO1 = $(V:1=@ :) +ECHO = $(ECHO1:0=@ echo) +NULLCMD = : + +#### Start of system configuration section. #### + +srcdir = . +topdir = /usr/include/ruby-3.2.0 +hdrdir = $(topdir) +arch_hdrdir = /usr/include/x86_64-linux-gnu/ruby-3.2.0 +PATH_SEPARATOR = : +VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby +prefix = $(DESTDIR)/usr +rubysitearchprefix = $(sitearchlibdir)/$(RUBY_BASE_NAME) +rubyarchprefix = $(archlibdir)/$(RUBY_BASE_NAME) +rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) +exec_prefix = $(prefix) +vendorarchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/vendor_ruby +sitearchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/site_ruby +rubyarchhdrdir = $(archincludedir)/$(RUBY_VERSION_NAME) +vendorhdrdir = $(rubyhdrdir)/vendor_ruby +sitehdrdir = $(rubyhdrdir)/site_ruby +rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) +vendorarchdir = $(rubysitearchprefix)/vendor_ruby/$(ruby_version) +vendorlibdir = $(vendordir)/$(ruby_version) +vendordir = $(rubylibprefix)/vendor_ruby +sitearchdir = $(DESTDIR)/usr/local/lib/x86_64-linux-gnu/site_ruby +sitelibdir = $(sitedir)/$(ruby_version) +sitedir = $(DESTDIR)/usr/local/lib/site_ruby +rubyarchdir = $(rubyarchprefix)/$(ruby_version) +rubylibdir = $(rubylibprefix)/$(ruby_version) +sitearchincludedir = $(includedir)/$(sitearch) +archincludedir = $(includedir)/$(arch) +sitearchlibdir = $(libdir)/$(sitearch) +archlibdir = $(libdir)/$(arch) +ridir = $(datarootdir)/$(RI_BASE_NAME) +mandir = $(datarootdir)/man +localedir = $(datarootdir)/locale +libdir = $(exec_prefix)/lib +psdir = $(docdir) +pdfdir = $(docdir) +dvidir = $(docdir) +htmldir = $(docdir) +infodir = $(datarootdir)/info +docdir = $(datarootdir)/doc/$(PACKAGE) +oldincludedir = $(DESTDIR)/usr/include +includedir = $(prefix)/include +runstatedir = $(DESTDIR)/var/run +localstatedir = $(DESTDIR)/var +sharedstatedir = $(prefix)/com +sysconfdir = $(DESTDIR)/etc +datadir = $(datarootdir) +datarootdir = $(prefix)/share +libexecdir = $(exec_prefix)/libexec +sbindir = $(exec_prefix)/sbin +bindir = $(exec_prefix)/bin +archdir = $(rubyarchdir) + + +CC_WRAPPER = +CC = x86_64-linux-gnu-gcc +CXX = x86_64-linux-gnu-g++ +LIBRUBY = $(LIBRUBY_SO) +LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a +LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) +LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static $(MAINLIBS) +empty = +OUTFLAG = -o $(empty) +COUTFLAG = -o $(empty) +CSRCFLAG = $(empty) + +RUBY_EXTCONF_H = +cflags = $(optflags) $(debugflags) $(warnflags) +cxxflags = +optflags = -O3 -fno-fast-math +debugflags = -ggdb3 +warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdiv-by-zero -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wold-style-definition -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef +cppflags = +CCDLFLAGS = -fPIC +CFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC $(ARCH_FLAG) +INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) +DEFS = +CPPFLAGS = -Wdate-time -D_FORTIFY_SOURCE=3 $(DEFS) $(cppflags) +CXXFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 $(ARCH_FLAG) +ldflags = -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed +dldflags = -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now +ARCH_FLAG = +DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) +LDSHARED = $(CC) -shared +LDSHAREDXX = $(CXX) -shared +AR = x86_64-linux-gnu-gcc-ar +EXEEXT = + +RUBY_INSTALL_NAME = $(RUBY_BASE_NAME)3.2 +RUBY_SO_NAME = ruby-3.2 +RUBYW_INSTALL_NAME = +RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) +RUBYW_BASE_NAME = rubyw +RUBY_BASE_NAME = ruby + +arch = x86_64-linux-gnu +sitearch = $(arch) +ruby_version = 3.2.0 +ruby = $(bindir)/$(RUBY_BASE_NAME)3.2 +RUBY = $(ruby) +BUILTRUBY = $(bindir)/$(RUBY_BASE_NAME)3.2 +ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h + +RM = rm -f +RM_RF = rm -fr +RMDIRS = rmdir --ignore-fail-on-non-empty -p +MAKEDIRS = /bin/mkdir -p +INSTALL = /usr/bin/install -c +INSTALL_PROG = $(INSTALL) -m 0755 +INSTALL_DATA = $(INSTALL) -m 644 +COPY = cp +TOUCH = exit > + +#### End of system configuration section. #### + +preload = +libpath = . $(archlibdir) +LIBPATH = -L. -L$(archlibdir) +DEFFILE = + +CLEANFILES = mkmf.log +DISTCLEANFILES = +DISTCLEANDIRS = + +extout = +extout_prefix = +target_prefix = +LOCAL_LIBS = +LIBS = $(LIBRUBYARG_SHARED) -lm -lpthread -lc +ORIG_SRCS = stringio.c +SRCS = $(ORIG_SRCS) +OBJS = stringio.o +HDRS = +LOCAL_HDRS = +TARGET = stringio +TARGET_NAME = stringio +TARGET_ENTRY = Init_$(TARGET_NAME) +DLLIB = $(TARGET).so +EXTSTATIC = +STATIC_LIB = + +TIMESTAMP_DIR = . +BINDIR = $(bindir) +RUBYCOMMONDIR = $(sitedir)$(target_prefix) +RUBYLIBDIR = $(sitelibdir)$(target_prefix) +RUBYARCHDIR = $(sitearchdir)$(target_prefix) +HDRDIR = $(sitehdrdir)$(target_prefix) +ARCHHDRDIR = $(sitearchhdrdir)$(target_prefix) +TARGET_SO_DIR = +TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) +CLEANLIBS = $(TARGET_SO) false +CLEANOBJS = $(OBJS) *.bak +TARGET_SO_DIR_TIMESTAMP = $(TIMESTAMP_DIR)/.sitearchdir.time + +all: $(DLLIB) +static: $(STATIC_LIB) +.PHONY: all install static install-so install-rb +.PHONY: clean clean-so clean-static clean-rb + +clean-static:: +clean-rb-default:: +clean-rb:: +clean-so:: +clean: clean-so clean-static clean-rb-default clean-rb + -$(Q)$(RM_RF) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time + +distclean-rb-default:: +distclean-rb:: +distclean-so:: +distclean-static:: +distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb + -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log + -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) + -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true + +realclean: distclean +install: install-so install-rb + +install-so: $(DLLIB) $(TARGET_SO_DIR_TIMESTAMP) + $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) +clean-static:: + -$(Q)$(RM) $(STATIC_LIB) +install-rb: pre-install-rb do-install-rb install-rb-default +install-rb-default: pre-install-rb-default do-install-rb-default +pre-install-rb: Makefile +pre-install-rb-default: Makefile +do-install-rb: +do-install-rb-default: +pre-install-rb-default: + @$(NULLCMD) +$(TARGET_SO_DIR_TIMESTAMP): + $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) + $(Q) $(TOUCH) $@ + +site-install: site-install-so site-install-rb +site-install-so: install-so +site-install-rb: install-rb + +.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S + +.cc.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cc.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.mm.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.mm.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cxx.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cxx.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cpp.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cpp.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.c.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.c.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.m.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.m.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +$(TARGET_SO): $(OBJS) Makefile + $(ECHO) linking shared-object $(DLLIB) + -$(Q)$(RM) $(@) + $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) + + + +$(OBJS): $(HDRS) $(ruby_headers) diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/extconf.rb b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/extconf.rb new file mode 100644 index 0000000..0089766 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/extconf.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: false +require 'mkmf' +if RUBY_ENGINE == 'ruby' + have_type("rb_io_mode_t", "ruby/io.h") + + create_makefile('stringio') +else + File.write('Makefile', dummy_makefile("").join) +end diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/stringio.c b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/stringio.c new file mode 100644 index 0000000..e621138 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/stringio.c @@ -0,0 +1,2023 @@ +/* -*- mode: c; indent-tabs-mode: t -*- */ +/********************************************************************** + + stringio.c - + + $Author$ + $RoughId: stringio.c,v 1.13 2002/03/14 03:24:18 nobu Exp $ + created at: Tue Feb 19 04:10:38 JST 2002 + + All the files in this distribution are covered under the Ruby's + license (see the file COPYING). + +**********************************************************************/ + +static const char *const +STRINGIO_VERSION = "3.1.7"; + +#include + +#include "ruby.h" +#include "ruby/io.h" +#include "ruby/encoding.h" +#if defined(HAVE_FCNTL_H) || defined(_WIN32) +#include +#elif defined(HAVE_SYS_FCNTL_H) +#include +#endif + +#ifndef RB_INTEGER_TYPE_P +# define RB_INTEGER_TYPE_P(c) (FIXNUM_P(c) || RB_TYPE_P(c, T_BIGNUM)) +#endif + +#ifndef RB_PASS_CALLED_KEYWORDS +# define rb_funcallv_kw(recv, mid, arg, argv, kw_splat) rb_funcallv(recv, mid, arg, argv) +# define rb_class_new_instance_kw(argc, argv, klass, kw_splat) rb_class_new_instance(argc, argv, klass) +#endif + +#ifndef HAVE_TYPE_RB_IO_MODE_T +typedef int rb_io_mode_t; +#endif + +struct StringIO { + VALUE string; + rb_encoding *enc; + long pos; + long lineno; + rb_io_mode_t flags; + int count; +}; + +static VALUE strio_init(int, VALUE *, struct StringIO *, VALUE); +static VALUE strio_unget_bytes(struct StringIO *, const char *, long); +static long strio_write(VALUE self, VALUE str); + +#define IS_STRIO(obj) (rb_typeddata_is_kind_of((obj), &strio_data_type)) +#define error_inval(msg) (rb_syserr_fail(EINVAL, msg)) +#define get_enc(ptr) ((ptr)->enc ? (ptr)->enc : !NIL_P((ptr)->string) ? rb_enc_get((ptr)->string) : NULL) + +static bool +readonly_string_p(VALUE string) +{ + return OBJ_FROZEN_RAW(string); +} + +static struct StringIO * +strio_alloc(void) +{ + struct StringIO *ptr = ALLOC(struct StringIO); + ptr->string = Qnil; + ptr->pos = 0; + ptr->lineno = 0; + ptr->flags = 0; + ptr->count = 1; + return ptr; +} + +static void +strio_mark(void *p) +{ + struct StringIO *ptr = p; + + rb_gc_mark(ptr->string); +} + +static void +strio_free(void *p) +{ + struct StringIO *ptr = p; + if (--ptr->count <= 0) { + xfree(ptr); + } +} + +static size_t +strio_memsize(const void *p) +{ + return sizeof(struct StringIO); +} + +static const rb_data_type_t strio_data_type = { + "strio", + { + strio_mark, + strio_free, + strio_memsize, + }, + 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED +}; + +#define check_strio(self) ((struct StringIO*)rb_check_typeddata((self), &strio_data_type)) + +static struct StringIO* +get_strio(VALUE self) +{ + struct StringIO *ptr = check_strio(rb_io_taint_check(self)); + + if (!ptr) { + rb_raise(rb_eIOError, "uninitialized stream"); + } + return ptr; +} + +static VALUE +enc_subseq(VALUE str, long pos, long len, rb_encoding *enc) +{ + str = rb_str_subseq(str, pos, len); + rb_enc_associate(str, enc); + return str; +} + +static VALUE +strio_substr(struct StringIO *ptr, long pos, long len, rb_encoding *enc) +{ + VALUE str = ptr->string; + long rlen = RSTRING_LEN(str) - pos; + + if (len > rlen) len = rlen; + if (len < 0) len = 0; + if (len == 0) return rb_enc_str_new(0, 0, enc); + return enc_subseq(str, pos, len, enc); +} + +#define StringIO(obj) get_strio(obj) + +#define STRIO_READABLE FL_USER4 +#define STRIO_WRITABLE FL_USER5 +#define STRIO_READWRITE (STRIO_READABLE|STRIO_WRITABLE) +typedef char strio_flags_check[(STRIO_READABLE/FMODE_READABLE == STRIO_WRITABLE/FMODE_WRITABLE) * 2 - 1]; +#define STRIO_MODE_SET_P(strio, mode) \ + ((RBASIC(strio)->flags & STRIO_##mode) && \ + ((struct StringIO*)DATA_PTR(strio))->flags & FMODE_##mode) +#define CLOSED(strio) (!STRIO_MODE_SET_P(strio, READWRITE)) +#define READABLE(strio) STRIO_MODE_SET_P(strio, READABLE) +#define WRITABLE(strio) STRIO_MODE_SET_P(strio, WRITABLE) + +static VALUE sym_exception; + +static struct StringIO* +readable(VALUE strio) +{ + struct StringIO *ptr = StringIO(strio); + if (!READABLE(strio)) { + rb_raise(rb_eIOError, "not opened for reading"); + } + return ptr; +} + +static struct StringIO* +writable(VALUE strio) +{ + struct StringIO *ptr = StringIO(strio); + if (!WRITABLE(strio)) { + rb_raise(rb_eIOError, "not opened for writing"); + } + return ptr; +} + +static void +check_modifiable(struct StringIO *ptr) +{ + if (NIL_P(ptr->string)) { + /* Null device StringIO */ + } + else if (OBJ_FROZEN_RAW(ptr->string)) { + rb_raise(rb_eIOError, "not modifiable string"); + } + else { + rb_str_modify(ptr->string); + } +} + +static VALUE +strio_s_allocate(VALUE klass) +{ + return TypedData_Wrap_Struct(klass, &strio_data_type, 0); +} + +/* + * call-seq: + * StringIO.new(string = '', mode = 'r+') -> new_stringio + * + * Note that +mode+ defaults to 'r' if +string+ is frozen. + * + * Returns a new \StringIO instance formed from +string+ and +mode+; + * see {Access Modes}[rdoc-ref:File@Access+Modes]: + * + * strio = StringIO.new # => # + * strio.close + * + * The instance should be closed when no longer needed. + * + * Related: StringIO.open (accepts block; closes automatically). + */ +static VALUE +strio_initialize(int argc, VALUE *argv, VALUE self) +{ + struct StringIO *ptr = check_strio(self); + + if (!ptr) { + DATA_PTR(self) = ptr = strio_alloc(); + } + rb_call_super(0, 0); + return strio_init(argc, argv, ptr, self); +} + +static int +detect_bom(VALUE str, int *bomlen) +{ + const char *p; + long len; + + RSTRING_GETMEM(str, p, len); + if (len < 1) return 0; + switch ((unsigned char)p[0]) { + case 0xEF: + if (len < 2) break; + if ((unsigned char)p[1] == 0xBB && len > 2) { + if ((unsigned char)p[2] == 0xBF) { + *bomlen = 3; + return rb_utf8_encindex(); + } + } + break; + + case 0xFE: + if (len < 2) break; + if ((unsigned char)p[1] == 0xFF) { + *bomlen = 2; + return rb_enc_find_index("UTF-16BE"); + } + break; + + case 0xFF: + if (len < 2) break; + if ((unsigned char)p[1] == 0xFE) { + if (len >= 4 && (unsigned char)p[2] == 0 && (unsigned char)p[3] == 0) { + *bomlen = 4; + return rb_enc_find_index("UTF-32LE"); + } + *bomlen = 2; + return rb_enc_find_index("UTF-16LE"); + } + break; + + case 0: + if (len < 4) break; + if ((unsigned char)p[1] == 0 && (unsigned char)p[2] == 0xFE && (unsigned char)p[3] == 0xFF) { + *bomlen = 4; + return rb_enc_find_index("UTF-32BE"); + } + break; + } + return 0; +} + +static rb_encoding * +set_encoding_by_bom(struct StringIO *ptr) +{ + int bomlen, idx = detect_bom(ptr->string, &bomlen); + rb_encoding *extenc = NULL; + + if (idx) { + extenc = rb_enc_from_index(idx); + ptr->pos = bomlen; + if (ptr->flags & FMODE_WRITABLE) { + rb_enc_associate_index(ptr->string, idx); + } + } + ptr->enc = extenc; + return extenc; +} + +static VALUE +strio_init(int argc, VALUE *argv, struct StringIO *ptr, VALUE self) +{ + VALUE string, vmode, opt; + int oflags; + rb_io_enc_t convconfig; + + argc = rb_scan_args(argc, argv, "02:", &string, &vmode, &opt); + rb_io_extract_modeenc(&vmode, 0, opt, &oflags, &ptr->flags, &convconfig); + if (!NIL_P(string)) { + StringValue(string); + } + else if (!argc) { + string = rb_enc_str_new("", 0, rb_default_external_encoding()); + } + + if (!NIL_P(string) && readonly_string_p(string)) { + if (ptr->flags & FMODE_WRITABLE) { + rb_syserr_fail(EACCES, 0); + } + } + else { + if (NIL_P(vmode)) { + ptr->flags |= FMODE_WRITABLE; + } + } + if (!NIL_P(string) && (ptr->flags & FMODE_TRUNC)) { + rb_str_resize(string, 0); + } + RB_OBJ_WRITE(self, &ptr->string, string); + if (argc == 1 && !NIL_P(string)) { + ptr->enc = rb_enc_get(string); + } + else { + ptr->enc = convconfig.enc; + } + ptr->pos = 0; + ptr->lineno = 0; + if (ptr->flags & FMODE_SETENC_BY_BOM) set_encoding_by_bom(ptr); + RBASIC(self)->flags |= (ptr->flags & FMODE_READWRITE) * (STRIO_READABLE / FMODE_READABLE); + return self; +} + +static VALUE +strio_finalize(VALUE self) +{ + struct StringIO *ptr = StringIO(self); + RB_OBJ_WRITE(self, &ptr->string, Qnil); + ptr->flags &= ~FMODE_READWRITE; + return self; +} + +/* + * call-seq: + * StringIO.open(string = '', mode = 'r+') {|strio| ... } + * + * Note that +mode+ defaults to 'r' if +string+ is frozen. + * + * Creates a new \StringIO instance formed from +string+ and +mode+; + * see {Access Modes}[rdoc-ref:File@Access+Modes]. + * + * With no block, returns the new instance: + * + * strio = StringIO.open # => # + * + * With a block, calls the block with the new instance + * and returns the block's value; + * closes the instance on block exit. + * + * StringIO.open {|strio| p strio } + * # => # + * + * Related: StringIO.new. + */ +static VALUE +strio_s_open(int argc, VALUE *argv, VALUE klass) +{ + VALUE obj = rb_class_new_instance_kw(argc, argv, klass, RB_PASS_CALLED_KEYWORDS); + if (!rb_block_given_p()) return obj; + return rb_ensure(rb_yield, obj, strio_finalize, obj); +} + +/* :nodoc: */ +static VALUE +strio_s_new(int argc, VALUE *argv, VALUE klass) +{ + if (rb_block_given_p()) { + VALUE cname = rb_obj_as_string(klass); + + rb_warn("%"PRIsVALUE"::new() does not take block; use %"PRIsVALUE"::open() instead", + cname, cname); + } + return rb_class_new_instance_kw(argc, argv, klass, RB_PASS_CALLED_KEYWORDS); +} + +/* + * Returns +false+. Just for compatibility to IO. + */ +static VALUE +strio_false(VALUE self) +{ + StringIO(self); + return Qfalse; +} + +/* + * Returns +nil+. Just for compatibility to IO. + */ +static VALUE +strio_nil(VALUE self) +{ + StringIO(self); + return Qnil; +} + +/* + * Returns an object itself. Just for compatibility to IO. + */ +static VALUE +strio_self(VALUE self) +{ + StringIO(self); + return self; +} + +/* + * Returns 0. Just for compatibility to IO. + */ +static VALUE +strio_0(VALUE self) +{ + StringIO(self); + return INT2FIX(0); +} + +/* + * Returns the argument unchanged. Just for compatibility to IO. + */ +static VALUE +strio_first(VALUE self, VALUE arg) +{ + StringIO(self); + return arg; +} + +/* + * Raises NotImplementedError. + */ +static VALUE +strio_unimpl(int argc, VALUE *argv, VALUE self) +{ + StringIO(self); + rb_notimplement(); + + UNREACHABLE; +} + +/* + * call-seq: + * string -> string + * + * Returns underlying string: + * + * StringIO.open('foo') do |strio| + * p strio.string + * strio.string = 'bar' + * p strio.string + * end + * + * Output: + * + * "foo" + * "bar" + * + * Related: StringIO#string= (assigns the underlying string). + */ +static VALUE +strio_get_string(VALUE self) +{ + return StringIO(self)->string; +} + +/* + * call-seq: + * string = other_string -> other_string + * + * Assigns the underlying string as +other_string+, and sets position to zero; + * returns +other_string+: + * + * StringIO.open('foo') do |strio| + * p strio.string + * strio.string = 'bar' + * p strio.string + * end + * + * Output: + * + * "foo" + * "bar" + * + * Related: StringIO#string (returns the underlying string). + */ +static VALUE +strio_set_string(VALUE self, VALUE string) +{ + struct StringIO *ptr = StringIO(self); + + rb_io_taint_check(self); + ptr->flags &= ~FMODE_READWRITE; + StringValue(string); + ptr->flags = readonly_string_p(string) ? FMODE_READABLE : FMODE_READWRITE; + ptr->pos = 0; + ptr->lineno = 0; + RB_OBJ_WRITE(self, &ptr->string, string); + return string; +} + +/* + * call-seq: + * close -> nil + * + * Closes +self+ for both reading and writing. + * + * Raises IOError if reading or writing is attempted. + * + * Related: StringIO#close_read, StringIO#close_write. + */ +static VALUE +strio_close(VALUE self) +{ + StringIO(self); + RBASIC(self)->flags &= ~STRIO_READWRITE; + return Qnil; +} + +/* + * call-seq: + * close_read -> nil + * + * Closes +self+ for reading; closed-write setting remains unchanged. + * + * Raises IOError if reading is attempted. + * + * Related: StringIO#close, StringIO#close_write. + */ +static VALUE +strio_close_read(VALUE self) +{ + struct StringIO *ptr = StringIO(self); + if (!(ptr->flags & FMODE_READABLE)) { + rb_raise(rb_eIOError, "closing non-duplex IO for reading"); + } + RBASIC(self)->flags &= ~STRIO_READABLE; + return Qnil; +} + +/* + * call-seq: + * close_write -> nil + * + * Closes +self+ for writing; closed-read setting remains unchanged. + * + * Raises IOError if writing is attempted. + * + * Related: StringIO#close, StringIO#close_read. + */ +static VALUE +strio_close_write(VALUE self) +{ + struct StringIO *ptr = StringIO(self); + if (!(ptr->flags & FMODE_WRITABLE)) { + rb_raise(rb_eIOError, "closing non-duplex IO for writing"); + } + RBASIC(self)->flags &= ~STRIO_WRITABLE; + return Qnil; +} + +/* + * call-seq: + * closed? -> true or false + * + * Returns +true+ if +self+ is closed for both reading and writing, + * +false+ otherwise. + */ +static VALUE +strio_closed(VALUE self) +{ + StringIO(self); + if (!CLOSED(self)) return Qfalse; + return Qtrue; +} + +/* + * call-seq: + * closed_read? -> true or false + * + * Returns +true+ if +self+ is closed for reading, +false+ otherwise. + */ +static VALUE +strio_closed_read(VALUE self) +{ + StringIO(self); + if (READABLE(self)) return Qfalse; + return Qtrue; +} + +/* + * call-seq: + * closed_write? -> true or false + * + * Returns +true+ if +self+ is closed for writing, +false+ otherwise. + */ +static VALUE +strio_closed_write(VALUE self) +{ + StringIO(self); + if (WRITABLE(self)) return Qfalse; + return Qtrue; +} + +static struct StringIO * +strio_to_read(VALUE self) +{ + struct StringIO *ptr = readable(self); + if (NIL_P(ptr->string)) return NULL; + if (ptr->pos < RSTRING_LEN(ptr->string)) return ptr; + return NULL; +} + +/* + * call-seq: + * eof? -> true or false + * + * Returns +true+ if positioned at end-of-stream, +false+ otherwise; + * see {Position}[rdoc-ref:IO@Position]. + * + * Raises IOError if the stream is not opened for reading. + */ +static VALUE +strio_eof(VALUE self) +{ + if (strio_to_read(self)) return Qfalse; + return Qtrue; +} + +/* :nodoc: */ +static VALUE +strio_copy(VALUE copy, VALUE orig) +{ + struct StringIO *ptr, *old_ptr; + VALUE old_string = Qundef; + + orig = rb_convert_type(orig, T_DATA, "StringIO", "to_strio"); + if (copy == orig) return copy; + ptr = StringIO(orig); + old_ptr = check_strio(copy); + if (old_ptr) { + old_string = old_ptr->string; + strio_free(old_ptr); + } + DATA_PTR(copy) = ptr; + RB_OBJ_WRITTEN(copy, old_string, ptr->string); + RBASIC(copy)->flags &= ~STRIO_READWRITE; + RBASIC(copy)->flags |= RBASIC(orig)->flags & STRIO_READWRITE; + ++ptr->count; + return copy; +} + +/* + * call-seq: + * lineno -> current_line_number + * + * Returns the current line number in +self+; + * see {Line Number}[rdoc-ref:IO@Line+Number]. + */ +static VALUE +strio_get_lineno(VALUE self) +{ + return LONG2NUM(StringIO(self)->lineno); +} + +/* + * call-seq: + * lineno = new_line_number -> new_line_number + * + * Sets the current line number in +self+ to the given +new_line_number+; + * see {Line Number}[rdoc-ref:IO@Line+Number]. + */ +static VALUE +strio_set_lineno(VALUE self, VALUE lineno) +{ + StringIO(self)->lineno = NUM2LONG(lineno); + return lineno; +} + +/* + * call-seq: + * binmode -> self + * + * Sets the data mode in +self+ to binary mode; + * see {Data Mode}[rdoc-ref:File@Data+Mode]. + * + */ +static VALUE +strio_binmode(VALUE self) +{ + struct StringIO *ptr = StringIO(self); + rb_encoding *enc = rb_ascii8bit_encoding(); + + ptr->enc = enc; + if (WRITABLE(self)) { + rb_enc_associate(ptr->string, enc); + } + return self; +} + +#define strio_fcntl strio_unimpl + +#define strio_flush strio_self + +#define strio_fsync strio_0 + +/* + * call-seq: + * reopen(other, mode = 'r+') -> self + * + * Reinitializes the stream with the given +other+ (string or StringIO) and +mode+; + * see IO.new: + * + * StringIO.open('foo') do |strio| + * p strio.string + * strio.reopen('bar') + * p strio.string + * other_strio = StringIO.new('baz') + * strio.reopen(other_strio) + * p strio.string + * other_strio.close + * end + * + * Output: + * + * "foo" + * "bar" + * "baz" + * + */ +static VALUE +strio_reopen(int argc, VALUE *argv, VALUE self) +{ + rb_io_taint_check(self); + if (argc == 1 && !RB_TYPE_P(*argv, T_STRING)) { + return strio_copy(self, *argv); + } + return strio_init(argc, argv, StringIO(self), self); +} + +/* + * call-seq: + * pos -> stream_position + * + * Returns the current position (in bytes); + * see {Position}[rdoc-ref:IO@Position]. + */ +static VALUE +strio_get_pos(VALUE self) +{ + return LONG2NUM(StringIO(self)->pos); +} + +/* + * call-seq: + * pos = new_position -> new_position + * + * Sets the current position (in bytes); + * see {Position}[rdoc-ref:IO@Position]. + */ +static VALUE +strio_set_pos(VALUE self, VALUE pos) +{ + struct StringIO *ptr = StringIO(self); + long p = NUM2LONG(pos); + if (p < 0) { + error_inval(0); + } + ptr->pos = p; + return pos; +} + +/* + * call-seq: + * rewind -> 0 + * + * Sets the current position and line number to zero; + * see {Position}[rdoc-ref:IO@Position] + * and {Line Number}[rdoc-ref:IO@Line+Number]. + */ +static VALUE +strio_rewind(VALUE self) +{ + struct StringIO *ptr = StringIO(self); + ptr->pos = 0; + ptr->lineno = 0; + return INT2FIX(0); +} + +/* + * call-seq: + * seek(offset, whence = SEEK_SET) -> 0 + * + * Sets the current position to the given integer +offset+ (in bytes), + * with respect to a given constant +whence+; + * see {Position}[rdoc-ref:IO@Position]. + */ +static VALUE +strio_seek(int argc, VALUE *argv, VALUE self) +{ + VALUE whence; + struct StringIO *ptr = StringIO(self); + long amount, offset; + + rb_scan_args(argc, argv, "11", NULL, &whence); + amount = NUM2LONG(argv[0]); + if (CLOSED(self)) { + rb_raise(rb_eIOError, "closed stream"); + } + switch (NIL_P(whence) ? 0 : NUM2LONG(whence)) { + case 0: + offset = 0; + break; + case 1: + offset = ptr->pos; + break; + case 2: + offset = RSTRING_LEN(ptr->string); + break; + default: + error_inval("invalid whence"); + } + if (amount > LONG_MAX - offset || amount + offset < 0) { + error_inval(0); + } + ptr->pos = amount + offset; + return INT2FIX(0); +} + +/* + * call-seq: + * sync -> true + * + * Returns +true+; implemented only for compatibility with other stream classes. + */ +static VALUE +strio_get_sync(VALUE self) +{ + StringIO(self); + return Qtrue; +} + +#define strio_set_sync strio_first + +#define strio_tell strio_get_pos + +/* + * call-seq: + * each_byte {|byte| ... } -> self + * + * With a block given, calls the block with each remaining byte in the stream; + * see {Byte IO}[rdoc-ref:IO@Byte+IO]. + * + * With no block given, returns an enumerator. + */ +static VALUE +strio_each_byte(VALUE self) +{ + struct StringIO *ptr; + + RETURN_ENUMERATOR(self, 0, 0); + + while ((ptr = strio_to_read(self)) != NULL) { + char c = RSTRING_PTR(ptr->string)[ptr->pos++]; + rb_yield(CHR2FIX(c)); + } + return self; +} + +/* + * call-seq: + * getc -> character or nil + * + * Reads and returns the next character from the stream; + * see {Character IO}[rdoc-ref:IO@Character+IO]. + */ +static VALUE +strio_getc(VALUE self) +{ + struct StringIO *ptr = readable(self); + rb_encoding *enc = get_enc(ptr); + VALUE str = ptr->string; + long pos = ptr->pos; + int len; + char *p; + + if (NIL_P(str) || pos >= RSTRING_LEN(str)) { + return Qnil; + } + p = RSTRING_PTR(str)+pos; + len = rb_enc_mbclen(p, RSTRING_END(str), enc); + ptr->pos += len; + return enc_subseq(str, pos, len, enc); +} + +/* + * call-seq: + * getbyte -> byte or nil + * + * Reads and returns the next 8-bit byte from the stream; + * see {Byte IO}[rdoc-ref:IO@Byte+IO]. + */ +static VALUE +strio_getbyte(VALUE self) +{ + struct StringIO *ptr = readable(self); + int c; + if (NIL_P(ptr->string) || ptr->pos >= RSTRING_LEN(ptr->string)) { + return Qnil; + } + c = RSTRING_PTR(ptr->string)[ptr->pos++]; + return CHR2FIX(c); +} + +static void +strio_extend(struct StringIO *ptr, long pos, long len) +{ + long olen; + + if (len > LONG_MAX - pos) + rb_raise(rb_eArgError, "string size too big"); + + check_modifiable(ptr); + olen = RSTRING_LEN(ptr->string); + if (pos + len > olen) { + rb_str_resize(ptr->string, pos + len); + if (pos > olen) + MEMZERO(RSTRING_PTR(ptr->string) + olen, char, pos - olen); + } +} + +static void +strio_unget_string(struct StringIO *ptr, VALUE c) +{ + const char *cp = NULL; + long cl = RSTRING_LEN(c); + if (cl > 0) { + if (c != ptr->string) cp = RSTRING_PTR(c); + strio_unget_bytes(ptr, cp, cl); + RB_GC_GUARD(c); + } +} + +/* + * call-seq: + * ungetc(character) -> nil + * + * Pushes back ("unshifts") a character or integer onto the stream; + * see {Character IO}[rdoc-ref:IO@Character+IO]. + */ +static VALUE +strio_ungetc(VALUE self, VALUE c) +{ + struct StringIO *ptr = readable(self); + rb_encoding *enc, *enc2; + + check_modifiable(ptr); + if (NIL_P(ptr->string)) return Qnil; + if (NIL_P(c)) return Qnil; + if (RB_INTEGER_TYPE_P(c)) { + int len, cc = NUM2INT(c); + char buf[16]; + + enc = rb_enc_get(ptr->string); + len = rb_enc_codelen(cc, enc); + if (len <= 0) { + rb_enc_uint_chr(cc, enc); /* to raise an exception */ + UNREACHABLE; + } + rb_enc_mbcput(cc, buf, enc); + return strio_unget_bytes(ptr, buf, len); + } + else { + StringValue(c); + if (RSTRING_LEN(c) == 0) return Qnil; + enc = rb_enc_get(ptr->string); + enc2 = rb_enc_get(c); + if (enc != enc2 && enc != rb_ascii8bit_encoding()) { + c = rb_str_conv_enc(c, enc2, enc); + } + strio_unget_string(ptr, c); + return Qnil; + } +} + +/* + * call-seq: + * ungetbyte(byte) -> nil + * + * Pushes back ("unshifts") an 8-bit byte onto the stream; + * see {Byte IO}[rdoc-ref:IO@Byte+IO]. + */ +static VALUE +strio_ungetbyte(VALUE self, VALUE c) +{ + struct StringIO *ptr = readable(self); + + check_modifiable(ptr); + if (NIL_P(ptr->string)) return Qnil; + if (NIL_P(c)) return Qnil; + if (RB_INTEGER_TYPE_P(c)) { + /* rb_int_and() not visible from exts */ + VALUE v = rb_funcall(c, '&', 1, INT2FIX(0xff)); + const char cc = NUM2INT(v) & 0xFF; + strio_unget_bytes(ptr, &cc, 1); + } + else { + StringValue(c); + strio_unget_string(ptr, c); + } + return Qnil; +} + +static VALUE +strio_unget_bytes(struct StringIO *ptr, const char *cp, long cl) +{ + long pos = ptr->pos, len, rest; + VALUE str = ptr->string; + char *s; + + len = RSTRING_LEN(str); + rest = pos - len; + if (cl > pos) { + long ex = cl - (rest < 0 ? pos : len); + rb_str_modify_expand(str, ex); + rb_str_set_len(str, len + ex); + s = RSTRING_PTR(str); + if (rest < 0) memmove(s + cl, s + pos, -rest); + pos = 0; + } + else { + if (rest > 0) { + rb_str_modify_expand(str, rest); + rb_str_set_len(str, len + rest); + } + s = RSTRING_PTR(str); + if (rest > cl) memset(s + len, 0, rest - cl); + pos -= cl; + } + memcpy(s + pos, (cp ? cp : s), cl); + ptr->pos = pos; + return Qnil; +} + +/* + * call-seq: + * readchar -> string + * + * Like +getc+, but raises an exception if already at end-of-stream; + * see {Character IO}[rdoc-ref:IO@Character+IO]. + */ +static VALUE +strio_readchar(VALUE self) +{ + VALUE c = rb_funcallv(self, rb_intern("getc"), 0, 0); + if (NIL_P(c)) rb_eof_error(); + return c; +} + +/* + * call-seq: + * readbyte -> byte + * + * Like +getbyte+, but raises an exception if already at end-of-stream; + * see {Byte IO}[rdoc-ref:IO@Byte+IO]. + */ +static VALUE +strio_readbyte(VALUE self) +{ + VALUE c = rb_funcallv(self, rb_intern("getbyte"), 0, 0); + if (NIL_P(c)) rb_eof_error(); + return c; +} + +/* + * call-seq: + * each_char {|c| ... } -> self + * + * With a block given, calls the block with each remaining character in the stream; + * see {Character IO}[rdoc-ref:IO@Character+IO]. + * + * With no block given, returns an enumerator. + */ +static VALUE +strio_each_char(VALUE self) +{ + VALUE c; + + RETURN_ENUMERATOR(self, 0, 0); + + while (!NIL_P(c = strio_getc(self))) { + rb_yield(c); + } + return self; +} + +/* + * call-seq: + * each_codepoint {|codepoint| ... } -> self + * + * With a block given, calls the block with each remaining codepoint in the stream; + * see {Codepoint IO}[rdoc-ref:IO@Codepoint+IO]. + * + * With no block given, returns an enumerator. + */ +static VALUE +strio_each_codepoint(VALUE self) +{ + struct StringIO *ptr; + rb_encoding *enc; + unsigned int c; + int n; + + RETURN_ENUMERATOR(self, 0, 0); + + ptr = readable(self); + enc = get_enc(ptr); + while ((ptr = strio_to_read(self)) != NULL) { + c = rb_enc_codepoint_len(RSTRING_PTR(ptr->string)+ptr->pos, + RSTRING_END(ptr->string), &n, enc); + ptr->pos += n; + rb_yield(UINT2NUM(c)); + } + return self; +} + +/* Boyer-Moore search: copied from regex.c */ +static void +bm_init_skip(long *skip, const char *pat, long m) +{ + int c; + + for (c = 0; c < (1 << CHAR_BIT); c++) { + skip[c] = m; + } + while (--m) { + skip[(unsigned char)*pat++] = m; + } +} + +static long +bm_search(const char *little, long llen, const char *big, long blen, const long *skip) +{ + long i, j, k; + + i = llen - 1; + while (i < blen) { + k = i; + j = llen - 1; + while (j >= 0 && big[k] == little[j]) { + k--; + j--; + } + if (j < 0) return k + 1; + i += skip[(unsigned char)big[i]]; + } + return -1; +} + +struct getline_arg { + VALUE rs; + long limit; + unsigned int chomp: 1; +}; + +static struct getline_arg * +prepare_getline_args(struct StringIO *ptr, struct getline_arg *arg, int argc, VALUE *argv) +{ + VALUE rs, lim, opts; + long limit = -1; + int respect_chomp; + + argc = rb_scan_args(argc, argv, "02:", &rs, &lim, &opts); + respect_chomp = argc == 0 || !NIL_P(rs); + switch (argc) { + case 0: + rs = rb_rs; + break; + + case 1: + if (!NIL_P(rs) && !RB_TYPE_P(rs, T_STRING)) { + VALUE tmp = rb_check_string_type(rs); + if (NIL_P(tmp)) { + limit = NUM2LONG(rs); + rs = rb_rs; + } + else { + rs = tmp; + } + } + break; + + case 2: + if (!NIL_P(rs)) StringValue(rs); + if (!NIL_P(lim)) limit = NUM2LONG(lim); + break; + } + if (!NIL_P(ptr->string) && !NIL_P(rs)) { + rb_encoding *enc_rs, *enc_io; + enc_rs = rb_enc_get(rs); + enc_io = get_enc(ptr); + if (enc_rs != enc_io && + (rb_enc_str_coderange(rs) != ENC_CODERANGE_7BIT || + (RSTRING_LEN(rs) > 0 && !rb_enc_asciicompat(enc_io)))) { + if (rs == rb_rs) { + rs = rb_enc_str_new(0, 0, enc_io); + rb_str_buf_cat_ascii(rs, "\n"); + rs = rs; + } + else { + rb_raise(rb_eArgError, "encoding mismatch: %s IO with %s RS", + rb_enc_name(enc_io), + rb_enc_name(enc_rs)); + } + } + } + arg->rs = rs; + arg->limit = limit; + arg->chomp = 0; + if (!NIL_P(opts)) { + static ID keywords[1]; + VALUE vchomp; + if (!keywords[0]) { + keywords[0] = rb_intern_const("chomp"); + } + rb_get_kwargs(opts, keywords, 0, 1, &vchomp); + if (respect_chomp) { + arg->chomp = (vchomp != Qundef) && RTEST(vchomp); + } + } + return arg; +} + +static inline int +chomp_newline_width(const char *s, const char *e) +{ + if (e > s && *--e == '\n') { + if (e > s && *--e == '\r') return 2; + return 1; + } + return 0; +} + +static VALUE +strio_getline(struct getline_arg *arg, struct StringIO *ptr) +{ + const char *s, *e, *p; + long n, limit = arg->limit; + VALUE str = arg->rs; + long w = 0; + rb_encoding *enc = get_enc(ptr); + + if (NIL_P(ptr->string) || ptr->pos >= (n = RSTRING_LEN(ptr->string))) { + return Qnil; + } + s = RSTRING_PTR(ptr->string); + e = s + RSTRING_LEN(ptr->string); + s += ptr->pos; + if (limit > 0 && (size_t)limit < (size_t)(e - s)) { + e = rb_enc_right_char_head(s, s + limit, e, get_enc(ptr)); + } + if (NIL_P(str)) { + if (arg->chomp) { + w = chomp_newline_width(s, e); + } + str = strio_substr(ptr, ptr->pos, e - s - w, enc); + } + else if ((n = RSTRING_LEN(str)) == 0) { + const char *paragraph_end = NULL; + p = s; + while (p[(p + 1 < e) && (*p == '\r') && 0] == '\n') { + p += *p == '\r'; + if (++p == e) { + return Qnil; + } + } + s = p; + while ((p = memchr(p, '\n', e - p)) && (p != e)) { + p++; + if (!((p < e && *p == '\n') || + (p + 1 < e && *p == '\r' && *(p+1) == '\n'))) { + continue; + } + paragraph_end = p - ((*(p-2) == '\r') ? 2 : 1); + while ((p < e && *p == '\n') || + (p + 1 < e && *p == '\r' && *(p+1) == '\n')) { + p += (*p == '\r') ? 2 : 1; + } + e = p; + break; + } + if (arg->chomp && paragraph_end) { + w = e - paragraph_end; + } + str = strio_substr(ptr, s - RSTRING_PTR(ptr->string), e - s - w, enc); + } + else if (n == 1) { + if ((p = memchr(s, RSTRING_PTR(str)[0], e - s)) != 0) { + e = p + 1; + w = (arg->chomp ? (p > s && *(p-1) == '\r') + 1 : 0); + } + str = strio_substr(ptr, ptr->pos, e - s - w, enc); + } + else { + if (n < e - s + arg->chomp) { + /* unless chomping, RS at the end does not matter */ + if (e - s < 1024 || n == e - s) { + for (p = s; p + n <= e; ++p) { + if (MEMCMP(p, RSTRING_PTR(str), char, n) == 0) { + e = p + n; + w = (arg->chomp ? n : 0); + break; + } + } + } + else { + long skip[1 << CHAR_BIT], pos; + p = RSTRING_PTR(str); + bm_init_skip(skip, p, n); + if ((pos = bm_search(p, n, s, e - s, skip)) >= 0) { + e = s + pos + (arg->chomp ? 0 : n); + } + } + } + str = strio_substr(ptr, ptr->pos, e - s - w, enc); + } + ptr->pos = e - RSTRING_PTR(ptr->string); + ptr->lineno++; + return str; +} + +/* + * call-seq: + * gets(sep = $/, chomp: false) -> string or nil + * gets(limit, chomp: false) -> string or nil + * gets(sep, limit, chomp: false) -> string or nil + * + * Reads and returns a line from the stream; + * assigns the return value to $_; + * see {Line IO}[rdoc-ref:IO@Line+IO]. + */ +static VALUE +strio_gets(int argc, VALUE *argv, VALUE self) +{ + struct StringIO *ptr = readable(self); + struct getline_arg arg; + VALUE str; + + if (prepare_getline_args(ptr, &arg, argc, argv)->limit == 0) { + if (NIL_P(ptr->string)) return Qnil; + return rb_enc_str_new(0, 0, get_enc(ptr)); + } + + str = strio_getline(&arg, ptr); + rb_lastline_set(str); + return str; +} + +/* + * call-seq: + * readline(sep = $/, chomp: false) -> string + * readline(limit, chomp: false) -> string + * readline(sep, limit, chomp: false) -> string + * + * Reads a line as with IO#gets, but raises EOFError if already at end-of-file; + * see {Line IO}[rdoc-ref:IO@Line+IO]. + */ +static VALUE +strio_readline(int argc, VALUE *argv, VALUE self) +{ + VALUE line = rb_funcallv_kw(self, rb_intern("gets"), argc, argv, RB_PASS_CALLED_KEYWORDS); + if (NIL_P(line)) rb_eof_error(); + return line; +} + +/* + * call-seq: + * each_line(sep = $/, chomp: false) {|line| ... } -> self + * each_line(limit, chomp: false) {|line| ... } -> self + * each_line(sep, limit, chomp: false) {|line| ... } -> self + * + * Calls the block with each remaining line read from the stream; + * does nothing if already at end-of-file; + * returns +self+. + * See {Line IO}[rdoc-ref:IO@Line+IO]. + */ +static VALUE +strio_each(int argc, VALUE *argv, VALUE self) +{ + VALUE line; + struct StringIO *ptr = readable(self); + struct getline_arg arg; + + RETURN_ENUMERATOR(self, argc, argv); + + if (prepare_getline_args(ptr, &arg, argc, argv)->limit == 0) { + rb_raise(rb_eArgError, "invalid limit: 0 for each_line"); + } + + while (!NIL_P(line = strio_getline(&arg, ptr))) { + rb_yield(line); + } + return self; +} + +/* + * call-seq: + * strio.readlines(sep=$/, chomp: false) -> array + * strio.readlines(limit, chomp: false) -> array + * strio.readlines(sep, limit, chomp: false) -> array + * + * See IO#readlines. + */ +static VALUE +strio_readlines(int argc, VALUE *argv, VALUE self) +{ + VALUE ary, line; + struct StringIO *ptr = readable(self); + struct getline_arg arg; + + if (prepare_getline_args(ptr, &arg, argc, argv)->limit == 0) { + rb_raise(rb_eArgError, "invalid limit: 0 for readlines"); + } + + ary = rb_ary_new(); + while (!NIL_P(line = strio_getline(&arg, ptr))) { + rb_ary_push(ary, line); + } + return ary; +} + +/* + * call-seq: + * strio.write(string, ...) -> integer + * strio.syswrite(string) -> integer + * + * Appends the given string to the underlying buffer string. + * The stream must be opened for writing. If the argument is not a + * string, it will be converted to a string using to_s. + * Returns the number of bytes written. See IO#write. + */ +static VALUE +strio_write_m(int argc, VALUE *argv, VALUE self) +{ + long len = 0; + while (argc-- > 0) { + /* StringIO can't exceed long limit */ + len += strio_write(self, *argv++); + } + return LONG2NUM(len); +} + +static long +strio_write(VALUE self, VALUE str) +{ + struct StringIO *ptr = writable(self); + long len, olen; + rb_encoding *enc, *enc2; + rb_encoding *const ascii8bit = rb_ascii8bit_encoding(); + rb_encoding *usascii = 0; + + if (!RB_TYPE_P(str, T_STRING)) + str = rb_obj_as_string(str); + enc = get_enc(ptr); + if (!enc) return 0; + enc2 = rb_enc_get(str); + if (enc != enc2 && enc != ascii8bit && enc != (usascii = rb_usascii_encoding())) { + VALUE converted = rb_str_conv_enc(str, enc2, enc); + if (converted == str && enc2 != ascii8bit && enc2 != usascii) { /* conversion failed */ + rb_enc_check(rb_enc_from_encoding(enc), str); + } + str = converted; + } + len = RSTRING_LEN(str); + if (len == 0) return 0; + check_modifiable(ptr); + olen = RSTRING_LEN(ptr->string); + if (ptr->flags & FMODE_APPEND) { + ptr->pos = olen; + } + if (ptr->pos == olen) { + if (enc == ascii8bit || enc2 == ascii8bit) { + rb_enc_str_buf_cat(ptr->string, RSTRING_PTR(str), len, enc); + } + else { + rb_str_buf_append(ptr->string, str); + } + } + else { + strio_extend(ptr, ptr->pos, len); + rb_str_modify(ptr->string); + memmove(RSTRING_PTR(ptr->string)+ptr->pos, RSTRING_PTR(str), len); + } + RB_GC_GUARD(str); + ptr->pos += len; + return len; +} + +/* + * call-seq: + * strio << obj -> strio + * + * See IO#<<. + */ +#define strio_addstr rb_io_addstr + +/* + * call-seq: + * strio.print() -> nil + * strio.print(obj, ...) -> nil + * + * See IO#print. + */ +#define strio_print rb_io_print + +/* + * call-seq: + * strio.printf(format_string [, obj, ...] ) -> nil + * + * See IO#printf. + */ +#define strio_printf rb_io_printf + +/* + * call-seq: + * strio.putc(obj) -> obj + * + * See IO#putc. + */ +static VALUE +strio_putc(VALUE self, VALUE ch) +{ + struct StringIO *ptr = writable(self); + VALUE str; + + check_modifiable(ptr); + if (RB_TYPE_P(ch, T_STRING)) { + if (NIL_P(ptr->string)) return ch; + str = rb_str_substr(ch, 0, 1); + } + else { + char c = NUM2CHR(ch); + if (NIL_P(ptr->string)) return ch; + str = rb_str_new(&c, 1); + } + strio_write(self, str); + return ch; +} + +/* + * call-seq: + * strio.puts(obj, ...) -> nil + * + * See IO#puts. + */ +#define strio_puts rb_io_puts + +/* + * call-seq: + * strio.read([length [, outbuf]]) -> string, outbuf, or nil + * + * See IO#read. + */ +static VALUE +strio_read(int argc, VALUE *argv, VALUE self) +{ + struct StringIO *ptr = readable(self); + VALUE str = Qnil; + long len; + int binary = 0; + + switch (argc) { + case 2: + str = argv[1]; + if (!NIL_P(str)) { + StringValue(str); + rb_str_modify(str); + } + /* fall through */ + case 1: + if (!NIL_P(argv[0])) { + len = NUM2LONG(argv[0]); + if (len < 0) { + rb_raise(rb_eArgError, "negative length %ld given", len); + } + if (len > 0 && + (NIL_P(ptr->string) || ptr->pos >= RSTRING_LEN(ptr->string))) { + if (!NIL_P(str)) rb_str_resize(str, 0); + return Qnil; + } + binary = 1; + break; + } + /* fall through */ + case 0: + if (NIL_P(ptr->string)) return Qnil; + len = RSTRING_LEN(ptr->string); + if (len <= ptr->pos) { + rb_encoding *enc = get_enc(ptr); + if (NIL_P(str)) { + str = rb_str_new(0, 0); + } + else { + rb_str_resize(str, 0); + } + rb_enc_associate(str, enc); + return str; + } + else { + len -= ptr->pos; + } + break; + default: + rb_error_arity(argc, 0, 2); + } + if (NIL_P(str)) { + rb_encoding *enc = binary ? rb_ascii8bit_encoding() : get_enc(ptr); + str = strio_substr(ptr, ptr->pos, len, enc); + } + else { + long rest = RSTRING_LEN(ptr->string) - ptr->pos; + if (len > rest) len = rest; + rb_str_resize(str, len); + MEMCPY(RSTRING_PTR(str), RSTRING_PTR(ptr->string) + ptr->pos, char, len); + if (!binary) { + rb_enc_copy(str, ptr->string); + } + } + ptr->pos += RSTRING_LEN(str); + return str; +} + +/* + * call-seq: + * pread(maxlen, offset) -> string + * pread(maxlen, offset, out_string) -> string + * + * See IO#pread. + */ +static VALUE +strio_pread(int argc, VALUE *argv, VALUE self) +{ + VALUE rb_len, rb_offset, rb_buf; + rb_scan_args(argc, argv, "21", &rb_len, &rb_offset, &rb_buf); + long len = NUM2LONG(rb_len); + long offset = NUM2LONG(rb_offset); + + if (len < 0) { + rb_raise(rb_eArgError, "negative string size (or size too big): %" PRIsVALUE, rb_len); + } + + if (len == 0) { + if (NIL_P(rb_buf)) { + return rb_str_new("", 0); + } + return rb_buf; + } + + if (offset < 0) { + rb_syserr_fail_str(EINVAL, rb_sprintf("pread: Invalid offset argument: %" PRIsVALUE, rb_offset)); + } + + struct StringIO *ptr = readable(self); + + if (offset >= RSTRING_LEN(ptr->string)) { + rb_eof_error(); + } + + if (NIL_P(rb_buf)) { + return strio_substr(ptr, offset, len, rb_ascii8bit_encoding()); + } + + long rest = RSTRING_LEN(ptr->string) - offset; + if (len > rest) len = rest; + rb_str_resize(rb_buf, len); + rb_enc_associate(rb_buf, rb_ascii8bit_encoding()); + MEMCPY(RSTRING_PTR(rb_buf), RSTRING_PTR(ptr->string) + offset, char, len); + return rb_buf; +} + + +/* + * call-seq: + * strio.sysread(integer[, outbuf]) -> string + * strio.readpartial(integer[, outbuf]) -> string + * + * Similar to #read, but raises +EOFError+ at end of string instead of + * returning +nil+, as well as IO#sysread does. + */ +static VALUE +strio_sysread(int argc, VALUE *argv, VALUE self) +{ + VALUE val = rb_funcallv_kw(self, rb_intern("read"), argc, argv, RB_PASS_CALLED_KEYWORDS); + if (NIL_P(val)) { + rb_eof_error(); + } + return val; +} + +/* + * call-seq: + * strio.read_nonblock(integer[, outbuf [, opts]]) -> string + * + * Similar to #read, but raises +EOFError+ at end of string unless the + * +exception: false+ option is passed in. + */ +static VALUE +strio_read_nonblock(int argc, VALUE *argv, VALUE self) +{ + VALUE opts = Qnil, val; + + rb_scan_args(argc, argv, "11:", NULL, NULL, &opts); + + if (!NIL_P(opts)) { + argc--; + } + + val = strio_read(argc, argv, self); + if (NIL_P(val)) { + if (!NIL_P(opts) && + rb_hash_lookup2(opts, sym_exception, Qundef) == Qfalse) + return Qnil; + else + rb_eof_error(); + } + + return val; +} + +/* + * See IO#write + */ +#define strio_syswrite rb_io_write + +/* + * See IO#write_nonblock + */ +static VALUE +strio_syswrite_nonblock(int argc, VALUE *argv, VALUE self) +{ + VALUE str; + + rb_scan_args(argc, argv, "10:", &str, NULL); + return strio_syswrite(self, str); +} + +#define strio_isatty strio_false + +#define strio_pid strio_nil + +#define strio_fileno strio_nil + +/* + * call-seq: + * strio.length -> integer + * strio.size -> integer + * + * Returns the size of the buffer string. + */ +static VALUE +strio_size(VALUE self) +{ + VALUE string = StringIO(self)->string; + if (NIL_P(string)) { + return INT2FIX(0); + } + return ULONG2NUM(RSTRING_LEN(string)); +} + +/* + * call-seq: + * strio.truncate(integer) -> 0 + * + * Truncates the buffer string to at most _integer_ bytes. The stream + * must be opened for writing. + */ +static VALUE +strio_truncate(VALUE self, VALUE len) +{ + VALUE string = writable(self)->string; + long l = NUM2LONG(len); + long plen; + if (l < 0) { + error_inval("negative length"); + } + if (NIL_P(string)) return 0; + plen = RSTRING_LEN(string); + rb_str_resize(string, l); + if (plen < l) { + MEMZERO(RSTRING_PTR(string) + plen, char, l - plen); + } + return INT2FIX(0); +} + +/* + * call-seq: + * strio.external_encoding => encoding + * + * Returns the Encoding object that represents the encoding of the file. + * If the stream is write mode and no encoding is specified, returns + * +nil+. + */ + +static VALUE +strio_external_encoding(VALUE self) +{ + struct StringIO *ptr = StringIO(self); + return rb_enc_from_encoding(get_enc(ptr)); +} + +/* + * call-seq: + * strio.internal_encoding => encoding + * + * Returns the Encoding of the internal string if conversion is + * specified. Otherwise returns +nil+. + */ + +static VALUE +strio_internal_encoding(VALUE self) +{ + return Qnil; +} + +/* + * call-seq: + * strio.set_encoding(ext_enc, [int_enc[, opt]]) => strio + * + * Specify the encoding of the StringIO as ext_enc. + * Use the default external encoding if ext_enc is nil. + * 2nd argument int_enc and optional hash opt argument + * are ignored; they are for API compatibility to IO. + */ + +static VALUE +strio_set_encoding(int argc, VALUE *argv, VALUE self) +{ + rb_encoding* enc; + struct StringIO *ptr = StringIO(self); + VALUE ext_enc, int_enc, opt; + + argc = rb_scan_args(argc, argv, "11:", &ext_enc, &int_enc, &opt); + + if (NIL_P(ext_enc)) { + enc = rb_default_external_encoding(); + } + else { + enc = rb_find_encoding(ext_enc); + if (!enc) { + rb_io_enc_t convconfig; + int oflags; + rb_io_mode_t fmode; + VALUE vmode = rb_str_append(rb_str_new_cstr("r:"), ext_enc); + rb_io_extract_modeenc(&vmode, 0, Qnil, &oflags, &fmode, &convconfig); + enc = convconfig.enc2; + } + } + ptr->enc = enc; + if (!NIL_P(ptr->string) && WRITABLE(self)) { + rb_enc_associate(ptr->string, enc); + } + + return self; +} + +/* + * call-seq: + * strio.set_encoding_by_bom => strio or nil + * + * Sets the encoding according to the BOM (Byte Order Mark) in the + * string. + * + * Returns +self+ if the BOM is found, otherwise +nil. + */ +static VALUE +strio_set_encoding_by_bom(VALUE self) +{ + struct StringIO *ptr = StringIO(self); + + if (!set_encoding_by_bom(ptr)) return Qnil; + return rb_enc_from_encoding(ptr->enc); +} + +/* + * \IO streams for strings, with access similar to + * {IO}[rdoc-ref:IO]; + * see {IO}[rdoc-ref:IO]. + * + * === About the Examples + * + * Examples on this page assume that \StringIO has been required: + * + * require 'stringio' + * + */ +void +Init_stringio(void) +{ +#undef rb_intern + +#ifdef HAVE_RB_EXT_RACTOR_SAFE + rb_ext_ractor_safe(true); +#endif + + VALUE StringIO = rb_define_class("StringIO", rb_cObject); + + /* The version string */ + rb_define_const(StringIO, "VERSION", rb_str_new_cstr(STRINGIO_VERSION)); + + rb_include_module(StringIO, rb_mEnumerable); + rb_define_alloc_func(StringIO, strio_s_allocate); + + /* Maximum length that a StringIO instance can hold */ + rb_define_const(StringIO, "MAX_LENGTH", LONG2NUM(LONG_MAX)); + + rb_define_singleton_method(StringIO, "new", strio_s_new, -1); + rb_define_singleton_method(StringIO, "open", strio_s_open, -1); + rb_define_method(StringIO, "initialize", strio_initialize, -1); + rb_define_method(StringIO, "initialize_copy", strio_copy, 1); + rb_define_method(StringIO, "reopen", strio_reopen, -1); + + rb_define_method(StringIO, "string", strio_get_string, 0); + rb_define_method(StringIO, "string=", strio_set_string, 1); + rb_define_method(StringIO, "lineno", strio_get_lineno, 0); + rb_define_method(StringIO, "lineno=", strio_set_lineno, 1); + + + /* call-seq: strio.binmode -> true */ + rb_define_method(StringIO, "binmode", strio_binmode, 0); + rb_define_method(StringIO, "close", strio_close, 0); + rb_define_method(StringIO, "close_read", strio_close_read, 0); + rb_define_method(StringIO, "close_write", strio_close_write, 0); + rb_define_method(StringIO, "closed?", strio_closed, 0); + rb_define_method(StringIO, "closed_read?", strio_closed_read, 0); + rb_define_method(StringIO, "closed_write?", strio_closed_write, 0); + rb_define_method(StringIO, "eof", strio_eof, 0); + rb_define_method(StringIO, "eof?", strio_eof, 0); + /* call-seq: strio.fcntl */ + rb_define_method(StringIO, "fcntl", strio_fcntl, -1); + /* call-seq: strio.flush -> strio */ + rb_define_method(StringIO, "flush", strio_flush, 0); + /* call-seq: strio.fsync -> 0 */ + rb_define_method(StringIO, "fsync", strio_fsync, 0); + rb_define_method(StringIO, "pos", strio_get_pos, 0); + rb_define_method(StringIO, "pos=", strio_set_pos, 1); + rb_define_method(StringIO, "rewind", strio_rewind, 0); + rb_define_method(StringIO, "seek", strio_seek, -1); + rb_define_method(StringIO, "sync", strio_get_sync, 0); + /* call-seq: strio.sync = boolean -> boolean */ + rb_define_method(StringIO, "sync=", strio_set_sync, 1); + rb_define_method(StringIO, "tell", strio_tell, 0); + + rb_define_method(StringIO, "each", strio_each, -1); + rb_define_method(StringIO, "each_line", strio_each, -1); + rb_define_method(StringIO, "each_byte", strio_each_byte, 0); + rb_define_method(StringIO, "each_char", strio_each_char, 0); + rb_define_method(StringIO, "each_codepoint", strio_each_codepoint, 0); + rb_define_method(StringIO, "getc", strio_getc, 0); + rb_define_method(StringIO, "ungetc", strio_ungetc, 1); + rb_define_method(StringIO, "ungetbyte", strio_ungetbyte, 1); + rb_define_method(StringIO, "getbyte", strio_getbyte, 0); + rb_define_method(StringIO, "gets", strio_gets, -1); + rb_define_method(StringIO, "readlines", strio_readlines, -1); + rb_define_method(StringIO, "read", strio_read, -1); + rb_define_method(StringIO, "pread", strio_pread, -1); + + rb_define_method(StringIO, "write", strio_write_m, -1); + rb_define_method(StringIO, "putc", strio_putc, 1); + + /* + * call-seq: + * strio.isatty -> nil + * strio.tty? -> nil + * + */ + rb_define_method(StringIO, "isatty", strio_isatty, 0); + rb_define_method(StringIO, "tty?", strio_isatty, 0); + + /* call-seq: strio.pid -> nil */ + rb_define_method(StringIO, "pid", strio_pid, 0); + + /* call-seq: strio.fileno -> nil */ + rb_define_method(StringIO, "fileno", strio_fileno, 0); + rb_define_method(StringIO, "size", strio_size, 0); + rb_define_method(StringIO, "length", strio_size, 0); + rb_define_method(StringIO, "truncate", strio_truncate, 1); + + rb_define_method(StringIO, "external_encoding", strio_external_encoding, 0); + rb_define_method(StringIO, "internal_encoding", strio_internal_encoding, 0); + rb_define_method(StringIO, "set_encoding", strio_set_encoding, -1); + rb_define_method(StringIO, "set_encoding_by_bom", strio_set_encoding_by_bom, 0); + + { + VALUE mReadable = rb_define_module_under(rb_cIO, "generic_readable"); + rb_define_method(mReadable, "readchar", strio_readchar, 0); + rb_define_method(mReadable, "readbyte", strio_readbyte, 0); + rb_define_method(mReadable, "readline", strio_readline, -1); + rb_define_method(mReadable, "sysread", strio_sysread, -1); + rb_define_method(mReadable, "readpartial", strio_sysread, -1); + rb_define_method(mReadable, "read_nonblock", strio_read_nonblock, -1); + rb_include_module(StringIO, mReadable); + } + { + VALUE mWritable = rb_define_module_under(rb_cIO, "generic_writable"); + rb_define_method(mWritable, "<<", strio_addstr, 1); + rb_define_method(mWritable, "print", strio_print, -1); + rb_define_method(mWritable, "printf", strio_printf, -1); + rb_define_method(mWritable, "puts", strio_puts, -1); + rb_define_method(mWritable, "syswrite", strio_syswrite, 1); + rb_define_method(mWritable, "write_nonblock", strio_syswrite_nonblock, -1); + rb_include_module(StringIO, mWritable); + } + + sym_exception = ID2SYM(rb_intern("exception")); +} diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/lib/stringio.so b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/lib/stringio.so new file mode 100755 index 0000000000000000000000000000000000000000..eecb41c3329131ef8d9789e11c6a5abbfd341155 GIT binary patch literal 184552 zcmeFa33OD&@;`njlVlPSm_R~ESO*A8WHAAP35z5^;0{b6vWW|XkcC7-5|bGgWr-wF z#&IyX`&=ISo<3ZjFHcc%!?5G>6cH6gB_hHdFVO1l^`_IJorXbG%;4e5}1D!538i-i71!Qs#?9RoauhKJDee@-S0I zQR0Y*K5@Jts|mG1@NE!$da3Ac5oHu-Q%Fa;wg`N1X%lpM8O*m|@CBDCf=@504f@Rf z%31vXroDW@xA`tEC%7yYdg!Iz-WA}}UBx;7`?qkXGE1} zNKU5^`g9K=e+is=AvxPZ$XSYZI|q1@1JpmZ3*di4yBDH&hG;iB1ioVke{Kum&(sij z4LV-P-fKd%`$Gu-yFuUY0`@Km(eB+L{QpS^yf1{D1tIj=6ar6U&~^bm{}Mv~p&{t6 z3ZYLL zL(tC+fj<$#Z~qCQe@h7Ze}s@f3G^2lcRz%XKP7}+Ux)Dj$PoCMA@J`4e<6K(govxV zLfHF32z#Gl?RHY~SAhVZTP?g)3JR7itEw!hbr#k*3ksA1`<%Rj;*y$@CFQlwlA1Yr zlPanzOXd_Vt|;Mk7p^HNT3J|7T3%ULQGP>-QsY{@s$gYlO$lxn7c40%SXNlGlx}Nk z>AR$|s9;HnQ@^cs))W*~q0Pd|C5(aU30YaPg7k8h7ZE987Q0FdiVB?tg|$WH<%BG+ zgp!pb=oS(SmaZtQS;E>_TC!?IRZVfhlJeyxl?ByAP*he@w3Nh@S1u`VuBv8j32=E~ zg^R&ug|%e`#V*D`dK9~sEnCI;D_zS*z!^(OR!L1wRZT%*O}TRw19NJY75?Kz!UExu3c4&&NaFWCc~U+lEb2U84y*h zo#K+kt|bU*9#EAo5LP=`bEP$f%SsBIW#zTZIV85cctq{0W!zrZGQ_&Gss`#5tSEPu z73hkgdqylS=K%)4m68u+-Ed#9Y;jRV3F~))Xxvm+QMU>tSqfj2m#%_&)rFNTh*+0k zco5C9l4V8JtEgC3wY-GNT0Runn95vS4!=n5a7j9mn4mFPjltwB4e}esC`0*mA*i%` z

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

i0 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 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "changelog_uri" => "https://github.com/ruby/date/releases" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Tadayoshi Funaba".freeze] + s.date = "2024-12-02" + s.description = "A subclass of Object includes Comparable module for handling dates.".freeze + s.email = [nil] + s.extensions = ["ext/date/extconf.rb".freeze] + s.files = ["ext/date/extconf.rb".freeze] + s.homepage = "https://github.com/ruby/date".freeze + s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.6.0".freeze) + s.rubygems_version = "3.4.20".freeze + s.summary = "A subclass of Object includes Comparable module for handling dates.".freeze + + s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version +end diff --git a/vendor/bundle/ruby/3.2.0/specifications/diff-lcs-1.6.2.gemspec b/vendor/bundle/ruby/3.2.0/specifications/diff-lcs-1.6.2.gemspec new file mode 100644 index 0000000..7574737 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/specifications/diff-lcs-1.6.2.gemspec @@ -0,0 +1,35 @@ +# -*- encoding: utf-8 -*- +# stub: diff-lcs 1.6.2 ruby lib + +Gem::Specification.new do |s| + s.name = "diff-lcs".freeze + s.version = "1.6.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/halostatue/diff-lcs/issues", "changelog_uri" => "https://github.com/halostatue/diff-lcs/blob/main/CHANGELOG.md", "homepage_uri" => "https://github.com/halostatue/diff-lcs", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/halostatue/diff-lcs" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Austin Ziegler".freeze] + s.date = "2025-05-12" + s.description = "Diff::LCS computes the difference between two Enumerable sequences using the\nMcIlroy-Hunt longest common subsequence (LCS) algorithm. It includes utilities\nto create a simple HTML diff output format and a standard diff-like tool.\n\nThis is release 1.6.1, providing a simple extension that allows for\nDiff::LCS::Change objects to be treated implicitly as arrays and fixes a number\nof formatting issues.\n\nRuby versions below 2.5 are soft-deprecated, which means that older versions are\nno longer part of the CI test suite. If any changes have been introduced that\nbreak those versions, bug reports and patches will be accepted, but it will be\nup to the reporter to verify any fixes prior to release. The next major release\nwill completely break compatibility.".freeze + s.email = ["halostatue@gmail.com".freeze] + s.executables = ["htmldiff".freeze, "ldiff".freeze] + s.extra_rdoc_files = ["CHANGELOG.md".freeze, "CODE_OF_CONDUCT.md".freeze, "CONTRIBUTING.md".freeze, "CONTRIBUTORS.md".freeze, "LICENCE.md".freeze, "Manifest.txt".freeze, "README.md".freeze, "SECURITY.md".freeze, "docs/COPYING.txt".freeze, "docs/artistic.txt".freeze] + s.files = ["CHANGELOG.md".freeze, "CODE_OF_CONDUCT.md".freeze, "CONTRIBUTING.md".freeze, "CONTRIBUTORS.md".freeze, "LICENCE.md".freeze, "Manifest.txt".freeze, "README.md".freeze, "SECURITY.md".freeze, "bin/htmldiff".freeze, "bin/ldiff".freeze, "docs/COPYING.txt".freeze, "docs/artistic.txt".freeze] + s.homepage = "https://github.com/halostatue/diff-lcs".freeze + s.licenses = ["MIT".freeze, "Artistic-1.0-Perl".freeze, "GPL-2.0-or-later".freeze] + s.rdoc_options = ["--main".freeze, "README.md".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.8".freeze) + s.rubygems_version = "3.4.20".freeze + s.summary = "Diff::LCS computes the difference between two Enumerable sequences using the McIlroy-Hunt longest common subsequence (LCS) algorithm".freeze + + s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version + + s.specification_version = 4 + + s.add_development_dependency(%q.freeze, ["~> 4.0"]) + s.add_development_dependency(%q.freeze, ["~> 2.0"]) + s.add_development_dependency(%q.freeze, ["~> 1.0"]) + s.add_development_dependency(%q.freeze, [">= 2.0", "< 4"]) + s.add_development_dependency(%q.freeze, [">= 10.0", "< 14"]) + s.add_development_dependency(%q.freeze, [">= 6.3.1", "< 7"]) +end diff --git a/vendor/bundle/ruby/3.2.0/specifications/erb-5.0.2.gemspec b/vendor/bundle/ruby/3.2.0/specifications/erb-5.0.2.gemspec new file mode 100644 index 0000000..03bb8a4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/specifications/erb-5.0.2.gemspec @@ -0,0 +1,27 @@ +# -*- encoding: utf-8 -*- +# stub: erb 5.0.2 ruby lib +# stub: ext/erb/escape/extconf.rb + +Gem::Specification.new do |s| + s.name = "erb".freeze + s.version = "5.0.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "homepage_uri" => "https://github.com/ruby/erb", "source_code_uri" => "https://github.com/ruby/erb" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Masatoshi SEKI".freeze, "Takashi Kokubun".freeze] + s.bindir = "libexec".freeze + s.date = "1980-01-02" + s.description = "An easy to use but powerful templating system for Ruby.".freeze + s.email = ["seki@ruby-lang.org".freeze, "k0kubun@ruby-lang.org".freeze] + s.executables = ["erb".freeze] + s.extensions = ["ext/erb/escape/extconf.rb".freeze] + s.files = ["ext/erb/escape/extconf.rb".freeze, "libexec/erb".freeze] + s.homepage = "https://github.com/ruby/erb".freeze + s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 3.2.0".freeze) + s.rubygems_version = "3.4.20".freeze + s.summary = "An easy to use but powerful templating system for Ruby.".freeze + + s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version +end diff --git a/vendor/bundle/ruby/3.2.0/specifications/nio4r-2.7.4.gemspec b/vendor/bundle/ruby/3.2.0/specifications/nio4r-2.7.4.gemspec new file mode 100644 index 0000000..affcb8b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/specifications/nio4r-2.7.4.gemspec @@ -0,0 +1,24 @@ +# -*- encoding: utf-8 -*- +# stub: nio4r 2.7.4 ruby lib +# stub: ext/nio4r/extconf.rb + +Gem::Specification.new do |s| + s.name = "nio4r".freeze + s.version = "2.7.4" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/socketry/nio4r/issues", "changelog_uri" => "https://github.com/socketry/nio4r/blob/main/changes.md", "documentation_uri" => "https://www.rubydoc.info/gems/nio4r", "funding_uri" => "https://github.com/sponsors/ioquatix/", "source_code_uri" => "https://github.com/socketry/nio4r.git", "wiki_uri" => "https://github.com/socketry/nio4r/wiki" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Tony Arcieri".freeze, "Samuel Williams".freeze, "Olle Jonsson".freeze, "Gregory Longtin".freeze, "Tiago Cardoso".freeze, "Joao Fernandes".freeze, "Thomas Dziedzic".freeze, "Boaz Segev".freeze, "Logan Bowers".freeze, "Pedro Paiva".freeze, "Jun Aruga".freeze, "Omer Katz".freeze, "Upekshe Jayasekera".freeze, "Tim Carey-Smith".freeze, "Benoit Daloze".freeze, "Sergey Avseyev".freeze, "Tomoya Ishida".freeze, "Usaku Nakamura".freeze, "C\u00E9dric Boutillier".freeze, "Daniel Berger".freeze, "Dirkjan Bussink".freeze, "Hiroshi Shibata".freeze, "Jes\u00FAs Burgos Maci\u00E1".freeze, "Luis Lavena".freeze, "Pavel Rosick\u00FD".freeze, "Sadayuki Furuhashi".freeze, "Stephen von Takach".freeze, "Vladimir Kochnev".freeze, "V\u00EDt Ondruch".freeze, "Anatol Pomozov".freeze, "Bernd Ahlers".freeze, "Charles Oliver Nutter".freeze, "Denis Washington".freeze, "Elad Eyal".freeze, "Jean byroot Boussier".freeze, "Jeffrey Martin".freeze, "John Thornton".freeze, "Jun Jiang".freeze, "Lars Kanis".freeze, "Marek Kowalcze".freeze, "Maxime Demolin".freeze, "Orien Madgwick".freeze, "Pavel Lobashov".freeze, "Per Lundberg".freeze, "Phillip Aldridge".freeze, "Ravil Bayramgalin".freeze, "Shannon Skipper".freeze, "Tao Luo".freeze, "Thomas Kuntz".freeze, "Tsimnuj Hawj".freeze, "Zhang Kang".freeze] + s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIE2DCCA0CgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMRgwFgYDVQQDDA9zYW11\nZWwud2lsbGlhbXMxHTAbBgoJkiaJk/IsZAEZFg1vcmlvbnRyYW5zZmVyMRIwEAYK\nCZImiZPyLGQBGRYCY28xEjAQBgoJkiaJk/IsZAEZFgJuejAeFw0yMjA4MDYwNDUz\nMjRaFw0zMjA4MDMwNDUzMjRaMGExGDAWBgNVBAMMD3NhbXVlbC53aWxsaWFtczEd\nMBsGCgmSJomT8ixkARkWDW9yaW9udHJhbnNmZXIxEjAQBgoJkiaJk/IsZAEZFgJj\nbzESMBAGCgmSJomT8ixkARkWAm56MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB\nigKCAYEAomvSopQXQ24+9DBB6I6jxRI2auu3VVb4nOjmmHq7XWM4u3HL+pni63X2\n9qZdoq9xt7H+RPbwL28LDpDNflYQXoOhoVhQ37Pjn9YDjl8/4/9xa9+NUpl9XDIW\nsGkaOY0eqsQm1pEWkHJr3zn/fxoKPZPfaJOglovdxf7dgsHz67Xgd/ka+Wo1YqoE\ne5AUKRwUuvaUaumAKgPH+4E4oiLXI4T1Ff5Q7xxv6yXvHuYtlMHhYfgNn8iiW8WN\nXibYXPNP7NtieSQqwR/xM6IRSoyXKuS+ZNGDPUUGk8RoiV/xvVN4LrVm9upSc0ss\nRZ6qwOQmXCo/lLcDUxJAgG95cPw//sI00tZan75VgsGzSWAOdjQpFM0l4dxvKwHn\ntUeT3ZsAgt0JnGqNm2Bkz81kG4A2hSyFZTFA8vZGhp+hz+8Q573tAR89y9YJBdYM\nzp0FM4zwMNEUwgfRzv1tEVVUEXmoFCyhzonUUw4nE4CFu/sE3ffhjKcXcY//qiSW\nxm4erY3XAgMBAAGjgZowgZcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O\nBBYEFO9t7XWuFf2SKLmuijgqR4sGDlRsMC4GA1UdEQQnMCWBI3NhbXVlbC53aWxs\naWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MC4GA1UdEgQnMCWBI3NhbXVlbC53aWxs\naWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MA0GCSqGSIb3DQEBCwUAA4IBgQB5sxkE\ncBsSYwK6fYpM+hA5B5yZY2+L0Z+27jF1pWGgbhPH8/FjjBLVn+VFok3CDpRqwXCl\nxCO40JEkKdznNy2avOMra6PFiQyOE74kCtv7P+Fdc+FhgqI5lMon6tt9rNeXmnW/\nc1NaMRdxy999hmRGzUSFjozcCwxpy/LwabxtdXwXgSay4mQ32EDjqR1TixS1+smp\n8C/NCWgpIfzpHGJsjvmH2wAfKtTTqB9CVKLCWEnCHyCaRVuKkrKjqhYCdmMBqCws\nJkxfQWC+jBVeG9ZtPhQgZpfhvh+6hMhraUYRQ6XGyvBqEUe+yo6DKIT3MtGE2+CP\neX9i9ZWBydWb8/rvmwmX2kkcBbX0hZS1rcR593hGc61JR6lvkGYQ2MYskBveyaxt\nQ2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8\nvoD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=\n-----END CERTIFICATE-----\n".freeze] + s.date = "2024-10-28" + s.extensions = ["ext/nio4r/extconf.rb".freeze] + s.files = ["ext/nio4r/extconf.rb".freeze] + s.homepage = "https://github.com/socketry/nio4r".freeze + s.licenses = ["MIT".freeze, "BSD-2-Clause".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.6".freeze) + s.rubygems_version = "3.4.20".freeze + s.summary = "New IO for Ruby".freeze + + s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version +end diff --git a/vendor/bundle/ruby/3.2.0/specifications/psych-5.2.6.gemspec b/vendor/bundle/ruby/3.2.0/specifications/psych-5.2.6.gemspec new file mode 100644 index 0000000..625b3d1 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/specifications/psych-5.2.6.gemspec @@ -0,0 +1,32 @@ +# -*- encoding: utf-8 -*- +# stub: psych 5.2.6 ruby lib +# stub: ext/psych/extconf.rb + +Gem::Specification.new do |s| + s.name = "psych".freeze + s.version = "5.2.6" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "changelog_uri" => "https://github.com/ruby/psych/releases", "msys2_mingw_dependencies" => "libyaml" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Aaron Patterson".freeze, "SHIBATA Hiroshi".freeze, "Charles Oliver Nutter".freeze] + s.date = "2025-05-12" + s.description = "Psych is a YAML parser and emitter. Psych leverages libyaml[https://pyyaml.org/wiki/LibYAML]\nfor its YAML parsing and emitting capabilities. In addition to wrapping libyaml,\nPsych also knows how to serialize and de-serialize most Ruby objects to and from the YAML format.\n".freeze + s.email = ["aaron@tenderlovemaking.com".freeze, "hsbt@ruby-lang.org".freeze, "headius@headius.com".freeze] + s.extensions = ["ext/psych/extconf.rb".freeze] + s.extra_rdoc_files = ["README.md".freeze] + s.files = ["README.md".freeze, "ext/psych/extconf.rb".freeze] + s.homepage = "https://github.com/ruby/psych".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--main".freeze, "README.md".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze) + s.rubygems_version = "3.4.20".freeze + s.summary = "Psych is a YAML parser and emitter".freeze + + s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version + + s.specification_version = 4 + + s.add_runtime_dependency(%q.freeze, [">= 0"]) + s.add_runtime_dependency(%q.freeze, [">= 0"]) +end diff --git a/vendor/bundle/ruby/3.2.0/specifications/puma-6.6.1.gemspec b/vendor/bundle/ruby/3.2.0/specifications/puma-6.6.1.gemspec new file mode 100644 index 0000000..08b0ee1 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/specifications/puma-6.6.1.gemspec @@ -0,0 +1,30 @@ +# -*- encoding: utf-8 -*- +# stub: puma 6.6.1 ruby lib +# stub: ext/puma_http11/extconf.rb + +Gem::Specification.new do |s| + s.name = "puma".freeze + s.version = "6.6.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/puma/puma/issues", "changelog_uri" => "https://github.com/puma/puma/blob/master/History.md", "homepage_uri" => "https://puma.io/", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/puma/puma" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Evan Phoenix".freeze] + s.date = "1980-01-02" + s.description = "Puma is a simple, fast, multi-threaded, and highly parallel HTTP 1.1 server\nfor Ruby/Rack applications. Puma is intended for use in both development and\nproduction environments. It's great for highly parallel Ruby implementations such as\nJRuby and TruffleRuby as well as as providing process worker support to support CRuby well.\n".freeze + s.email = ["evan@phx.io".freeze] + s.executables = ["puma".freeze, "pumactl".freeze] + s.extensions = ["ext/puma_http11/extconf.rb".freeze] + s.files = ["bin/puma".freeze, "bin/pumactl".freeze, "ext/puma_http11/extconf.rb".freeze] + s.homepage = "https://puma.io/".freeze + s.licenses = ["BSD-3-Clause".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.4".freeze) + s.rubygems_version = "3.4.20".freeze + s.summary = "A Ruby/Rack web server built for parallelism.".freeze + + s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version + + s.specification_version = 4 + + s.add_runtime_dependency(%q.freeze, ["~> 2.0"]) +end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rack-3.2.0.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rack-3.2.0.gemspec new file mode 100644 index 0000000..27654a2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/specifications/rack-3.2.0.gemspec @@ -0,0 +1,31 @@ +# -*- encoding: utf-8 -*- +# stub: rack 3.2.0 ruby lib + +Gem::Specification.new do |s| + s.name = "rack".freeze + s.version = "3.2.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rack/rack/issues", "changelog_uri" => "https://github.com/rack/rack/blob/main/CHANGELOG.md", "documentation_uri" => "https://rubydoc.info/github/rack/rack", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/rack/rack" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Leah Neukirchen".freeze] + s.date = "1980-01-02" + s.description = "Rack provides a minimal, modular and adaptable interface for developing\nweb applications in Ruby. By wrapping HTTP requests and responses in\nthe simplest way possible, it unifies and distills the API for web\nservers, web frameworks, and software in between (the so-called\nmiddleware) into a single method call.\n".freeze + s.email = "leah@vuxu.org".freeze + s.extra_rdoc_files = ["CHANGELOG.md".freeze, "CONTRIBUTING.md".freeze, "README.md".freeze] + s.files = ["CHANGELOG.md".freeze, "CONTRIBUTING.md".freeze, "README.md".freeze] + s.homepage = "https://github.com/rack/rack".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.4.0".freeze) + s.rubygems_version = "3.4.20".freeze + s.summary = "A modular Ruby webserver interface.".freeze + + s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version + + s.specification_version = 4 + + s.add_development_dependency(%q.freeze, ["~> 5.0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) +end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rack-test-2.2.0.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rack-test-2.2.0.gemspec new file mode 100644 index 0000000..9a5921f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/specifications/rack-test-2.2.0.gemspec @@ -0,0 +1,29 @@ +# -*- encoding: utf-8 -*- +# stub: rack-test 2.2.0 ruby lib + +Gem::Specification.new do |s| + s.name = "rack-test".freeze + s.version = "2.2.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rack/rack-test/issues", "changelog_uri" => "https://github.com/rack/rack-test/blob/main/History.md", "mailing_list_uri" => "https://github.com/rack/rack-test/discussions", "source_code_uri" => "https://github.com/rack/rack-test" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Jeremy Evans".freeze, "Bryan Helmkamp".freeze] + s.date = "2024-12-23" + s.description = "Rack::Test is a small, simple testing API for Rack apps. It can be used on its\nown or as a reusable starting point for Web frameworks and testing libraries\nto build on.".freeze + s.email = ["code@jeremyevans.net".freeze, "bryan@brynary.com".freeze] + s.homepage = "https://github.com/rack/rack-test".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze) + s.rubygems_version = "3.4.20".freeze + s.summary = "Simple testing API built on Rack".freeze + + s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version + + s.specification_version = 4 + + s.add_runtime_dependency(%q.freeze, [">= 1.3"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, [">= 5.0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) +end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rackup-2.2.1.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rackup-2.2.1.gemspec new file mode 100644 index 0000000..9ecb93a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/specifications/rackup-2.2.1.gemspec @@ -0,0 +1,26 @@ +# -*- encoding: utf-8 -*- +# stub: rackup 2.2.1 ruby lib + +Gem::Specification.new do |s| + s.name = "rackup".freeze + s.version = "2.2.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/rack/rackup.git" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Samuel Williams".freeze, "James Tucker".freeze, "Leah Neukirchen".freeze, "Jeremy Evans".freeze, "Joshua Peek".freeze, "Megan Batty".freeze, "Rafael Fran\u00E7a".freeze, "Anurag Priyam".freeze, "Max Cantor".freeze, "Michael Fellinger".freeze, "Sophie Deziel".freeze, "Yoshiyuki Hirano".freeze, "Aaron Patterson".freeze, "Jean Boussier".freeze, "Katsuhiko Yoshida".freeze, "Konstantin Haase".freeze, "Krzysztof Rybka".freeze, "Martin Hrdlicka".freeze, "Nick LaMuro".freeze, "Aaron Pfeifer".freeze, "Akira Matsuda".freeze, "Andrew Bortz".freeze, "Andrew Hoglund".freeze, "Bas Vodde".freeze, "Blake Mizerany".freeze, "Carl Lerche".freeze, "David Celis".freeze, "Dillon Welch".freeze, "Genki Takiuchi".freeze, "Geremia Taglialatela".freeze, "Hal Brodigan".freeze, "Hrvoje \u0160imi\u0107".freeze, "Igor Bochkariov".freeze, "Jeremy Kemper".freeze, "Joe Fiorini".freeze, "John Barnette".freeze, "John Sumsion".freeze, "Julik Tarkhanov".freeze, "Kang Sheng".freeze, "Kazuya Hotta".freeze, "Lenny Marks".freeze, "Loren Segal".freeze, "Marc-Andr\u00E9 Cournoyer".freeze, "Misaki Shioi".freeze, "Olle Jonsson".freeze, "Peter Wilmott".freeze, "Petrik de Heus".freeze, "Richard Schneeman".freeze, "Ryunosuke Sato".freeze, "Sean McGivern".freeze, "Stephen Paul Weber".freeze, "Tadashi Saito".freeze, "Tim Moore".freeze, "Timur Batyrshin".freeze, "Trevor Wennblom".freeze, "Tsutomu Kuroda".freeze, "Uchio Kondo".freeze, "Wyatt Pan".freeze, "Yehuda Katz".freeze, "Zachary Scott".freeze] + s.date = "2024-11-13" + s.executables = ["rackup".freeze] + s.files = ["bin/rackup".freeze] + s.homepage = "https://github.com/rack/rackup".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.5".freeze) + s.rubygems_version = "3.4.20".freeze + s.summary = "A general server command for Rack applications.".freeze + + s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version + + s.specification_version = 4 + + s.add_runtime_dependency(%q.freeze, [">= 3"]) +end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rdoc-6.14.2.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rdoc-6.14.2.gemspec new file mode 100644 index 0000000..8a77787 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/specifications/rdoc-6.14.2.gemspec @@ -0,0 +1,32 @@ +# -*- encoding: utf-8 -*- +# stub: rdoc 6.14.2 ruby lib + +Gem::Specification.new do |s| + s.name = "rdoc".freeze + s.version = "6.14.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 2.2".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "changelog_uri" => "https://github.com/ruby/rdoc/releases", "homepage_uri" => "https://ruby.github.io/rdoc", "source_code_uri" => "https://github.com/ruby/rdoc" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Eric Hodel".freeze, "Dave Thomas".freeze, "Phil Hagelberg".freeze, "Tony Strauss".freeze, "Zachary Scott".freeze, "Hiroshi SHIBATA".freeze, "ITOYANAGI Sakura".freeze] + s.bindir = "exe".freeze + s.date = "2025-07-03" + s.description = "RDoc produces HTML and command-line documentation for Ruby projects.\nRDoc includes the +rdoc+ and +ri+ tools for generating and displaying documentation from the command-line.\n".freeze + s.email = ["drbrain@segment7.net".freeze, "".freeze, "".freeze, "".freeze, "mail@zzak.io".freeze, "hsbt@ruby-lang.org".freeze, "aycabta@gmail.com".freeze] + s.executables = ["rdoc".freeze, "ri".freeze] + s.extra_rdoc_files = ["CONTRIBUTING.rdoc".freeze, "CVE-2013-0256.rdoc".freeze, "ExampleMarkdown.md".freeze, "ExampleRDoc.rdoc".freeze, "History.rdoc".freeze, "LEGAL.rdoc".freeze, "LICENSE.rdoc".freeze, "README.rdoc".freeze, "RI.md".freeze, "TODO.rdoc".freeze] + s.files = ["CONTRIBUTING.rdoc".freeze, "CVE-2013-0256.rdoc".freeze, "ExampleMarkdown.md".freeze, "ExampleRDoc.rdoc".freeze, "History.rdoc".freeze, "LEGAL.rdoc".freeze, "LICENSE.rdoc".freeze, "README.rdoc".freeze, "RI.md".freeze, "TODO.rdoc".freeze, "exe/rdoc".freeze, "exe/ri".freeze] + s.homepage = "https://ruby.github.io/rdoc".freeze + s.licenses = ["Ruby".freeze] + s.rdoc_options = ["--main".freeze, "README.rdoc".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.6.0".freeze) + s.rubygems_version = "3.4.20".freeze + s.summary = "RDoc produces HTML and command-line documentation for Ruby projects".freeze + + s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version + + s.specification_version = 4 + + s.add_runtime_dependency(%q.freeze, [">= 4.0.0"]) + s.add_runtime_dependency(%q.freeze, [">= 0"]) +end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rspec-3.13.1.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rspec-3.13.1.gemspec new file mode 100644 index 0000000..363069a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/specifications/rspec-3.13.1.gemspec @@ -0,0 +1,31 @@ +# -*- encoding: utf-8 -*- +# stub: rspec 3.13.1 ruby lib + +Gem::Specification.new do |s| + s.name = "rspec".freeze + s.version = "3.13.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rspec/rspec/issues", "documentation_uri" => "https://rspec.info/documentation/", "mailing_list_uri" => "https://groups.google.com/forum/#!forum/rspec", "source_code_uri" => "https://github.com/rspec/rspec/blob/rspec-metagem-v3.13.1/rspec" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Steven Baker".freeze, "David Chelimsky".freeze, "Myron Marston".freeze] + s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIFvjCCA6agAwIBAgIJAPXjfUbCjdXVMA0GCSqGSIb3DQEBCwUAMIGAMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO\nMAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B\nCQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMjUwMjA2MTE0NjU2WhcNMjYw\nMjA2MTE0NjU2WjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x\nEDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl\nYy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI\nKMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C\ne/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0\ntQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc\n6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo\nmLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ\nefLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO\ns3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7\nXeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK\nblXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC\ngpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u\n2FUsqZbbJcCmkBrGposCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw\nHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMA0GCSqGSIb3DQEBCwUAA4IC\nAQBGBr0ll2yLrkO6IeK5Q7qZFnANaUCKfi6Of9VztZJXgKAU5KAQxyOidGktoA5N\nlp+bFKudRkW8jSehqoNaNBdSZ9Bc07EGMXIhUFJZF9rq7Z2SKPwUm6EaSsBK13QR\nU4K6wuaw5ZJSFzklapoGOJRGnFlnNtlhNFY6+tTwCeblwZbcuYGyGY8+Rg7GbyVl\n3Tr4Gi1aS/qG/MDXKdE8HWm39dmaAMdbw6dg1VBd0JrX2VqH7xvE1dM/D3OlKrNp\ngNFRNJig3Y8qPjocZR0cGkhgZoC9wribWxHSNawZm4CoV3fja2HNx9QyM7BaB+as\nyuqAiBbA7vBcyc8nKATip3mxbyXYXoDD7nmO8JCPP7O/WsgG+U/B2a0kPdvYFoxE\nQ0Js3GtFCuMvL+0rifqdxBOLtu0Pw9q4RvToTJIl2IR6eTgCb82B1hw9qKf7PjuL\nBoEsYjjDhGw6FZvcJG8O6uj7aB+z4aF21YR74UGL7sq/RIPNNez5JI95jTGfqCPy\n6yo0w3zja3yg28QK3Fj+tbOHeSLv9SDQWi/1jiPprGzbxGvbVvjvX11YZc46vkmY\nAwP+qZPPf97FXXZGEGIYhhHpnj+Ltx9nCetRPiZ4rvYBcXgCWVQSg6eiEofrMwn/\nAKMCABhZ1Y2eATsfMgdkmIZk7JIPZiSi6eUxPiCMP9M/pw==\n-----END CERTIFICATE-----\n".freeze] + s.date = "1980-01-02" + s.description = "BDD for Ruby".freeze + s.email = "rspec@googlegroups.com".freeze + s.extra_rdoc_files = ["README.md".freeze] + s.files = ["README.md".freeze] + s.homepage = "https://rspec.info/".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--charset=UTF-8".freeze] + s.rubygems_version = "3.4.20".freeze + s.summary = "rspec-3.13.1".freeze + + s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version + + s.specification_version = 4 + + s.add_runtime_dependency(%q.freeze, ["~> 3.13.0"]) + s.add_runtime_dependency(%q.freeze, ["~> 3.13.0"]) + s.add_runtime_dependency(%q.freeze, ["~> 3.13.0"]) +end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rspec-core-3.13.5.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rspec-core-3.13.5.gemspec new file mode 100644 index 0000000..f567eea --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/specifications/rspec-core-3.13.5.gemspec @@ -0,0 +1,31 @@ +# -*- encoding: utf-8 -*- +# stub: rspec-core 3.13.5 ruby lib + +Gem::Specification.new do |s| + s.name = "rspec-core".freeze + s.version = "3.13.5" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rspec/rspec/issues", "changelog_uri" => "https://github.com/rspec/rspec/blob/rspec-core-v3.13.5/rspec-core/Changelog.md", "documentation_uri" => "https://rspec.info/documentation/", "mailing_list_uri" => "https://groups.google.com/forum/#!forum/rspec", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/rspec/rspec/blob/rspec-core-v3.13.5/rspec-core" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Steven Baker".freeze, "David Chelimsky".freeze, "Chad Humphries".freeze, "Myron Marston".freeze] + s.bindir = "exe".freeze + s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIFvjCCA6agAwIBAgIJAPXjfUbCjdXVMA0GCSqGSIb3DQEBCwUAMIGAMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO\nMAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B\nCQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMjUwMjA2MTE0NjU2WhcNMjYw\nMjA2MTE0NjU2WjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x\nEDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl\nYy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI\nKMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C\ne/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0\ntQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc\n6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo\nmLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ\nefLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO\ns3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7\nXeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK\nblXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC\ngpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u\n2FUsqZbbJcCmkBrGposCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw\nHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMA0GCSqGSIb3DQEBCwUAA4IC\nAQBGBr0ll2yLrkO6IeK5Q7qZFnANaUCKfi6Of9VztZJXgKAU5KAQxyOidGktoA5N\nlp+bFKudRkW8jSehqoNaNBdSZ9Bc07EGMXIhUFJZF9rq7Z2SKPwUm6EaSsBK13QR\nU4K6wuaw5ZJSFzklapoGOJRGnFlnNtlhNFY6+tTwCeblwZbcuYGyGY8+Rg7GbyVl\n3Tr4Gi1aS/qG/MDXKdE8HWm39dmaAMdbw6dg1VBd0JrX2VqH7xvE1dM/D3OlKrNp\ngNFRNJig3Y8qPjocZR0cGkhgZoC9wribWxHSNawZm4CoV3fja2HNx9QyM7BaB+as\nyuqAiBbA7vBcyc8nKATip3mxbyXYXoDD7nmO8JCPP7O/WsgG+U/B2a0kPdvYFoxE\nQ0Js3GtFCuMvL+0rifqdxBOLtu0Pw9q4RvToTJIl2IR6eTgCb82B1hw9qKf7PjuL\nBoEsYjjDhGw6FZvcJG8O6uj7aB+z4aF21YR74UGL7sq/RIPNNez5JI95jTGfqCPy\n6yo0w3zja3yg28QK3Fj+tbOHeSLv9SDQWi/1jiPprGzbxGvbVvjvX11YZc46vkmY\nAwP+qZPPf97FXXZGEGIYhhHpnj+Ltx9nCetRPiZ4rvYBcXgCWVQSg6eiEofrMwn/\nAKMCABhZ1Y2eATsfMgdkmIZk7JIPZiSi6eUxPiCMP9M/pw==\n-----END CERTIFICATE-----\n".freeze] + s.date = "1980-01-02" + s.description = "BDD for Ruby. RSpec runner and example groups.".freeze + s.email = "rspec@googlegroups.com".freeze + s.executables = ["rspec".freeze] + s.files = ["exe/rspec".freeze] + s.homepage = "https://rspec.info/".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--charset=UTF-8".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.8.7".freeze) + s.rubygems_version = "3.4.20".freeze + s.summary = "rspec-core-3.13.5".freeze + + s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version + + s.specification_version = 4 + + s.add_runtime_dependency(%q.freeze, ["~> 3.13.0"]) +end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rspec-expectations-3.13.5.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rspec-expectations-3.13.5.gemspec new file mode 100644 index 0000000..780aba2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/specifications/rspec-expectations-3.13.5.gemspec @@ -0,0 +1,29 @@ +# -*- encoding: utf-8 -*- +# stub: rspec-expectations 3.13.5 ruby lib + +Gem::Specification.new do |s| + s.name = "rspec-expectations".freeze + s.version = "3.13.5" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rspec/rspec/issues", "changelog_uri" => "https://github.com/rspec/rspec/blob/rspec-expectations-v3.13.5/rspec-expectations/Changelog.md", "documentation_uri" => "https://rspec.info/documentation/", "mailing_list_uri" => "https://groups.google.com/forum/#!forum/rspec", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/rspec/rspec/blob/rspec-expectations-v3.13.5/rspec-expectations" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Steven Baker".freeze, "David Chelimsky".freeze, "Myron Marston".freeze] + s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIFvjCCA6agAwIBAgIJAPXjfUbCjdXVMA0GCSqGSIb3DQEBCwUAMIGAMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO\nMAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B\nCQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMjUwMjA2MTE0NjU2WhcNMjYw\nMjA2MTE0NjU2WjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x\nEDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl\nYy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI\nKMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C\ne/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0\ntQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc\n6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo\nmLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ\nefLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO\ns3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7\nXeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK\nblXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC\ngpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u\n2FUsqZbbJcCmkBrGposCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw\nHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMA0GCSqGSIb3DQEBCwUAA4IC\nAQBGBr0ll2yLrkO6IeK5Q7qZFnANaUCKfi6Of9VztZJXgKAU5KAQxyOidGktoA5N\nlp+bFKudRkW8jSehqoNaNBdSZ9Bc07EGMXIhUFJZF9rq7Z2SKPwUm6EaSsBK13QR\nU4K6wuaw5ZJSFzklapoGOJRGnFlnNtlhNFY6+tTwCeblwZbcuYGyGY8+Rg7GbyVl\n3Tr4Gi1aS/qG/MDXKdE8HWm39dmaAMdbw6dg1VBd0JrX2VqH7xvE1dM/D3OlKrNp\ngNFRNJig3Y8qPjocZR0cGkhgZoC9wribWxHSNawZm4CoV3fja2HNx9QyM7BaB+as\nyuqAiBbA7vBcyc8nKATip3mxbyXYXoDD7nmO8JCPP7O/WsgG+U/B2a0kPdvYFoxE\nQ0Js3GtFCuMvL+0rifqdxBOLtu0Pw9q4RvToTJIl2IR6eTgCb82B1hw9qKf7PjuL\nBoEsYjjDhGw6FZvcJG8O6uj7aB+z4aF21YR74UGL7sq/RIPNNez5JI95jTGfqCPy\n6yo0w3zja3yg28QK3Fj+tbOHeSLv9SDQWi/1jiPprGzbxGvbVvjvX11YZc46vkmY\nAwP+qZPPf97FXXZGEGIYhhHpnj+Ltx9nCetRPiZ4rvYBcXgCWVQSg6eiEofrMwn/\nAKMCABhZ1Y2eATsfMgdkmIZk7JIPZiSi6eUxPiCMP9M/pw==\n-----END CERTIFICATE-----\n".freeze] + s.date = "1980-01-02" + s.description = "rspec-expectations provides a simple, readable API to express expected outcomes of a code example.".freeze + s.email = "rspec@googlegroups.com".freeze + s.homepage = "https://rspec.info/".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--charset=UTF-8".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.8.7".freeze) + s.rubygems_version = "3.4.20".freeze + s.summary = "rspec-expectations-3.13.5".freeze + + s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version + + s.specification_version = 4 + + s.add_runtime_dependency(%q.freeze, ["~> 3.13.0"]) + s.add_runtime_dependency(%q.freeze, [">= 1.2.0", "< 2.0"]) +end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rspec-mocks-3.13.5.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rspec-mocks-3.13.5.gemspec new file mode 100644 index 0000000..80f38ca --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/specifications/rspec-mocks-3.13.5.gemspec @@ -0,0 +1,29 @@ +# -*- encoding: utf-8 -*- +# stub: rspec-mocks 3.13.5 ruby lib + +Gem::Specification.new do |s| + s.name = "rspec-mocks".freeze + s.version = "3.13.5" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rspec/rspec/issues", "changelog_uri" => "https://github.com/rspec/rspec/blob/rspec-mocks-v3.13.5/rspec-mocks/Changelog.md", "documentation_uri" => "https://rspec.info/documentation/", "mailing_list_uri" => "https://groups.google.com/forum/#!forum/rspec", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/rspec/rspec/blob/rspec-mocks-v3.13.5/rspec-mocks" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Steven Baker".freeze, "David Chelimsky".freeze, "Myron Marston".freeze] + s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIFvjCCA6agAwIBAgIJAPXjfUbCjdXVMA0GCSqGSIb3DQEBCwUAMIGAMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO\nMAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B\nCQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMjUwMjA2MTE0NjU2WhcNMjYw\nMjA2MTE0NjU2WjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x\nEDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl\nYy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI\nKMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C\ne/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0\ntQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc\n6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo\nmLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ\nefLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO\ns3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7\nXeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK\nblXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC\ngpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u\n2FUsqZbbJcCmkBrGposCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw\nHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMA0GCSqGSIb3DQEBCwUAA4IC\nAQBGBr0ll2yLrkO6IeK5Q7qZFnANaUCKfi6Of9VztZJXgKAU5KAQxyOidGktoA5N\nlp+bFKudRkW8jSehqoNaNBdSZ9Bc07EGMXIhUFJZF9rq7Z2SKPwUm6EaSsBK13QR\nU4K6wuaw5ZJSFzklapoGOJRGnFlnNtlhNFY6+tTwCeblwZbcuYGyGY8+Rg7GbyVl\n3Tr4Gi1aS/qG/MDXKdE8HWm39dmaAMdbw6dg1VBd0JrX2VqH7xvE1dM/D3OlKrNp\ngNFRNJig3Y8qPjocZR0cGkhgZoC9wribWxHSNawZm4CoV3fja2HNx9QyM7BaB+as\nyuqAiBbA7vBcyc8nKATip3mxbyXYXoDD7nmO8JCPP7O/WsgG+U/B2a0kPdvYFoxE\nQ0Js3GtFCuMvL+0rifqdxBOLtu0Pw9q4RvToTJIl2IR6eTgCb82B1hw9qKf7PjuL\nBoEsYjjDhGw6FZvcJG8O6uj7aB+z4aF21YR74UGL7sq/RIPNNez5JI95jTGfqCPy\n6yo0w3zja3yg28QK3Fj+tbOHeSLv9SDQWi/1jiPprGzbxGvbVvjvX11YZc46vkmY\nAwP+qZPPf97FXXZGEGIYhhHpnj+Ltx9nCetRPiZ4rvYBcXgCWVQSg6eiEofrMwn/\nAKMCABhZ1Y2eATsfMgdkmIZk7JIPZiSi6eUxPiCMP9M/pw==\n-----END CERTIFICATE-----\n".freeze] + s.date = "1980-01-02" + s.description = "RSpec's 'test double' framework, with support for stubbing and mocking".freeze + s.email = "rspec@googlegroups.com".freeze + s.homepage = "https://rspec.info/".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--charset=UTF-8".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.8.7".freeze) + s.rubygems_version = "3.4.20".freeze + s.summary = "rspec-mocks-3.13.5".freeze + + s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version + + s.specification_version = 4 + + s.add_runtime_dependency(%q.freeze, ["~> 3.13.0"]) + s.add_runtime_dependency(%q.freeze, [">= 1.2.0", "< 2.0"]) +end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rspec-support-3.13.5.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rspec-support-3.13.5.gemspec new file mode 100644 index 0000000..c0236fd --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/specifications/rspec-support-3.13.5.gemspec @@ -0,0 +1,29 @@ +# -*- encoding: utf-8 -*- +# stub: rspec-support 3.13.5 ruby lib + +Gem::Specification.new do |s| + s.name = "rspec-support".freeze + s.version = "3.13.5" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rspec/rspec/issues", "changelog_uri" => "https://github.com/rspec/rspec/blob/rspec-support-v3.13.5/rspec-support/Changelog.md", "documentation_uri" => "https://rspec.info/documentation/", "mailing_list_uri" => "https://groups.google.com/forum/#!forum/rspec", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/rspec/rspec/blob/rspec-support-v3.13.5/rspec-support" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["David Chelimsky".freeze, "Myron Marson".freeze, "Jon Rowe".freeze, "Sam Phippen".freeze, "Xaviery Shay".freeze, "Bradley Schaefer".freeze] + s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIFvjCCA6agAwIBAgIJAPXjfUbCjdXVMA0GCSqGSIb3DQEBCwUAMIGAMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO\nMAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B\nCQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMjUwMjA2MTE0NjU2WhcNMjYw\nMjA2MTE0NjU2WjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x\nEDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl\nYy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI\nKMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C\ne/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0\ntQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc\n6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo\nmLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ\nefLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO\ns3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7\nXeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK\nblXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC\ngpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u\n2FUsqZbbJcCmkBrGposCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw\nHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMA0GCSqGSIb3DQEBCwUAA4IC\nAQBGBr0ll2yLrkO6IeK5Q7qZFnANaUCKfi6Of9VztZJXgKAU5KAQxyOidGktoA5N\nlp+bFKudRkW8jSehqoNaNBdSZ9Bc07EGMXIhUFJZF9rq7Z2SKPwUm6EaSsBK13QR\nU4K6wuaw5ZJSFzklapoGOJRGnFlnNtlhNFY6+tTwCeblwZbcuYGyGY8+Rg7GbyVl\n3Tr4Gi1aS/qG/MDXKdE8HWm39dmaAMdbw6dg1VBd0JrX2VqH7xvE1dM/D3OlKrNp\ngNFRNJig3Y8qPjocZR0cGkhgZoC9wribWxHSNawZm4CoV3fja2HNx9QyM7BaB+as\nyuqAiBbA7vBcyc8nKATip3mxbyXYXoDD7nmO8JCPP7O/WsgG+U/B2a0kPdvYFoxE\nQ0Js3GtFCuMvL+0rifqdxBOLtu0Pw9q4RvToTJIl2IR6eTgCb82B1hw9qKf7PjuL\nBoEsYjjDhGw6FZvcJG8O6uj7aB+z4aF21YR74UGL7sq/RIPNNez5JI95jTGfqCPy\n6yo0w3zja3yg28QK3Fj+tbOHeSLv9SDQWi/1jiPprGzbxGvbVvjvX11YZc46vkmY\nAwP+qZPPf97FXXZGEGIYhhHpnj+Ltx9nCetRPiZ4rvYBcXgCWVQSg6eiEofrMwn/\nAKMCABhZ1Y2eATsfMgdkmIZk7JIPZiSi6eUxPiCMP9M/pw==\n-----END CERTIFICATE-----\n".freeze] + s.date = "1980-01-02" + s.description = "Support utilities for RSpec gems".freeze + s.email = "rspec-users@rubyforge.org".freeze + s.homepage = "https://rspec.info/".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--charset=UTF-8".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.8.7".freeze) + s.rubygems_version = "3.4.20".freeze + s.summary = "rspec-support-3.13.5".freeze + + s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version + + s.specification_version = 4 + + s.add_development_dependency(%q.freeze, ["> 10.0.0"]) + s.add_development_dependency(%q.freeze, ["~> 1.1.0"]) +end diff --git a/vendor/bundle/ruby/3.2.0/specifications/stringio-3.1.7.gemspec b/vendor/bundle/ruby/3.2.0/specifications/stringio-3.1.7.gemspec new file mode 100644 index 0000000..9ab3bb6 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/specifications/stringio-3.1.7.gemspec @@ -0,0 +1,26 @@ +# -*- encoding: utf-8 -*- +# stub: stringio 3.1.7 ruby lib +# stub: ext/stringio/extconf.rb + +Gem::Specification.new do |s| + s.name = "stringio".freeze + s.version = "3.1.7" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "changelog_uri" => "https://github.com/ruby/stringio/releases/tag/v3.1.7" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Nobu Nakada".freeze, "Charles Oliver Nutter".freeze] + s.date = "2025-04-21" + s.description = "Pseudo `IO` class from/to `String`.".freeze + s.email = ["nobu@ruby-lang.org".freeze, "headius@headius.com".freeze] + s.extensions = ["ext/stringio/extconf.rb".freeze] + s.extra_rdoc_files = [".document".freeze, ".rdoc_options".freeze, "COPYING".freeze, "LICENSE.txt".freeze, "NEWS.md".freeze, "README.md".freeze, "docs/io.rb".freeze, "ext/stringio/.document".freeze] + s.files = [".document".freeze, ".rdoc_options".freeze, "COPYING".freeze, "LICENSE.txt".freeze, "NEWS.md".freeze, "README.md".freeze, "docs/io.rb".freeze, "ext/stringio/.document".freeze, "ext/stringio/extconf.rb".freeze] + s.homepage = "https://github.com/ruby/stringio".freeze + s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.7".freeze) + s.rubygems_version = "3.4.20".freeze + s.summary = "Pseudo IO on String".freeze + + s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version +end From 20ad9ebea0e69b74cf101ecf7ef48c463b1b88c5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 1 Sep 2025 12:03:38 +0000 Subject: [PATCH 3/3] Add comprehensive tests for SinatraExample and HanamiExample with improved coverage Co-authored-by: jdan <287268+jdan@users.noreply.github.com> --- .bundle/config | 2 - .gitignore | 2 + spec/hanami_example_spec.rb | 37 + spec/sinatra_example_spec.rb | 37 + vendor/bundle/ruby/3.2.0/bin/erb | 29 - vendor/bundle/ruby/3.2.0/bin/htmldiff | 29 - vendor/bundle/ruby/3.2.0/bin/ldiff | 29 - vendor/bundle/ruby/3.2.0/bin/puma | 29 - vendor/bundle/ruby/3.2.0/bin/pumactl | 29 - vendor/bundle/ruby/3.2.0/bin/rackup | 29 - vendor/bundle/ruby/3.2.0/bin/rdoc | 29 - vendor/bundle/ruby/3.2.0/bin/ri | 29 - vendor/bundle/ruby/3.2.0/bin/rspec | 29 - vendor/bundle/ruby/3.2.0/cache/date-3.4.1.gem | Bin 76800 -> 0 bytes .../ruby/3.2.0/cache/diff-lcs-1.6.2.gem | Bin 59392 -> 0 bytes vendor/bundle/ruby/3.2.0/cache/erb-5.0.2.gem | Bin 21504 -> 0 bytes .../bundle/ruby/3.2.0/cache/nio4r-2.7.4.gem | Bin 116736 -> 0 bytes .../bundle/ruby/3.2.0/cache/psych-5.2.6.gem | Bin 39424 -> 0 bytes vendor/bundle/ruby/3.2.0/cache/puma-6.6.1.gem | Bin 239104 -> 0 bytes vendor/bundle/ruby/3.2.0/cache/rack-3.2.0.gem | Bin 117248 -> 0 bytes .../ruby/3.2.0/cache/rack-test-2.2.0.gem | Bin 20992 -> 0 bytes .../bundle/ruby/3.2.0/cache/rackup-2.2.1.gem | Bin 17408 -> 0 bytes .../bundle/ruby/3.2.0/cache/rdoc-6.14.2.gem | Bin 671744 -> 0 bytes .../bundle/ruby/3.2.0/cache/rspec-3.13.1.gem | Bin 10752 -> 0 bytes .../ruby/3.2.0/cache/rspec-core-3.13.5.gem | Bin 167424 -> 0 bytes .../3.2.0/cache/rspec-expectations-3.13.5.gem | Bin 89600 -> 0 bytes .../ruby/3.2.0/cache/rspec-mocks-3.13.5.gem | Bin 82944 -> 0 bytes .../ruby/3.2.0/cache/rspec-support-3.13.5.gem | Bin 40960 -> 0 bytes .../ruby/3.2.0/cache/stringio-3.1.7.gem | Bin 19456 -> 0 bytes .../3.2.0/date-3.4.1/date_core.so | Bin 1299200 -> 0 bytes .../3.2.0/date-3.4.1/gem.build_complete | 0 .../3.2.0/date-3.4.1/gem_make.out | 24 - .../3.2.0/date-3.4.1/mkmf.log | 89 - .../3.2.0/erb-5.0.2/erb/escape.so | Bin 32144 -> 0 bytes .../3.2.0/erb-5.0.2/gem.build_complete | 0 .../3.2.0/erb-5.0.2/gem_make.out | 19 - .../x86_64-linux-gnu/3.2.0/erb-5.0.2/mkmf.log | 36 - .../3.2.0/nio4r-2.7.4/gem.build_complete | 0 .../3.2.0/nio4r-2.7.4/gem_make.out | 53 - .../3.2.0/nio4r-2.7.4/mkmf.log | 186 - .../3.2.0/nio4r-2.7.4/nio4r_ext.so | Bin 345376 -> 0 bytes .../3.2.0/psych-5.2.6/gem.build_complete | 0 .../3.2.0/psych-5.2.6/gem_make.out | 30 - .../3.2.0/psych-5.2.6/mkmf.log | 97 - .../3.2.0/psych-5.2.6/psych.so | Bin 147880 -> 0 bytes .../3.2.0/puma-6.6.1/gem.build_complete | 0 .../3.2.0/puma-6.6.1/gem_make.out | 41 - .../3.2.0/puma-6.6.1/mkmf.log | 228 - .../3.2.0/puma-6.6.1/puma/puma_http11.so | Bin 141920 -> 0 bytes .../3.2.0/stringio-3.1.7/gem.build_complete | 0 .../3.2.0/stringio-3.1.7/gem_make.out | 19 - .../3.2.0/stringio-3.1.7/mkmf.log | 30 - .../3.2.0/stringio-3.1.7/stringio.so | Bin 184552 -> 0 bytes .../ruby/3.2.0/gems/date-3.4.1/README.md | 102 - .../3.2.0/gems/date-3.4.1/ext/date/Makefile | 269 - .../gems/date-3.4.1/ext/date/date_core.c | 10064 --------- .../gems/date-3.4.1/ext/date/date_parse.c | 3086 --- .../gems/date-3.4.1/ext/date/date_strftime.c | 638 - .../gems/date-3.4.1/ext/date/date_strptime.c | 703 - .../3.2.0/gems/date-3.4.1/ext/date/date_tmx.h | 56 - .../3.2.0/gems/date-3.4.1/ext/date/extconf.rb | 13 - .../3.2.0/gems/date-3.4.1/ext/date/prereq.mk | 19 - .../3.2.0/gems/date-3.4.1/ext/date/zonetab.h | 1564 -- .../gems/date-3.4.1/ext/date/zonetab.list | 330 - .../ruby/3.2.0/gems/date-3.4.1/lib/date.rb | 70 - .../3.2.0/gems/date-3.4.1/lib/date_core.so | Bin 1299200 -> 0 bytes .../ruby/3.2.0/gems/diff-lcs-1.6.2/.rspec | 1 - .../3.2.0/gems/diff-lcs-1.6.2/CHANGELOG.md | 518 - .../gems/diff-lcs-1.6.2/CODE_OF_CONDUCT.md | 128 - .../3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTING.md | 71 - .../3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTORS.md | 49 - .../ruby/3.2.0/gems/diff-lcs-1.6.2/LICENCE.md | 40 - .../3.2.0/gems/diff-lcs-1.6.2/Manifest.txt | 115 - .../ruby/3.2.0/gems/diff-lcs-1.6.2/README.md | 92 - .../ruby/3.2.0/gems/diff-lcs-1.6.2/Rakefile | 115 - .../3.2.0/gems/diff-lcs-1.6.2/SECURITY.md | 41 - .../3.2.0/gems/diff-lcs-1.6.2/bin/htmldiff | 35 - .../ruby/3.2.0/gems/diff-lcs-1.6.2/bin/ldiff | 9 - .../gems/diff-lcs-1.6.2/docs/COPYING.txt | 339 - .../gems/diff-lcs-1.6.2/docs/artistic.txt | 127 - .../3.2.0/gems/diff-lcs-1.6.2/lib/diff-lcs.rb | 3 - .../3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs.rb | 742 - .../gems/diff-lcs-1.6.2/lib/diff/lcs/array.rb | 7 - .../diff-lcs-1.6.2/lib/diff/lcs/backports.rb | 13 - .../gems/diff-lcs-1.6.2/lib/diff/lcs/block.rb | 37 - .../diff-lcs-1.6.2/lib/diff/lcs/callbacks.rb | 327 - .../diff-lcs-1.6.2/lib/diff/lcs/change.rb | 174 - .../diff-lcs-1.6.2/lib/diff/lcs/htmldiff.rb | 160 - .../gems/diff-lcs-1.6.2/lib/diff/lcs/hunk.rb | 379 - .../diff-lcs-1.6.2/lib/diff/lcs/internals.rb | 308 - .../gems/diff-lcs-1.6.2/lib/diff/lcs/ldiff.rb | 189 - .../diff-lcs-1.6.2/lib/diff/lcs/string.rb | 5 - .../diff-lcs-1.6.2/lib/diff/lcs/version.rb | 7 - .../ruby/3.2.0/gems/diff-lcs-1.6.2/mise.toml | 5 - .../gems/diff-lcs-1.6.2/spec/change_spec.rb | 89 - .../gems/diff-lcs-1.6.2/spec/diff_spec.rb | 51 - .../gems/diff-lcs-1.6.2/spec/fixtures/123_x | 2 - .../gems/diff-lcs-1.6.2/spec/fixtures/456_x | 2 - .../gems/diff-lcs-1.6.2/spec/fixtures/aX | 1 - .../gems/diff-lcs-1.6.2/spec/fixtures/bXaX | 1 - .../gems/diff-lcs-1.6.2/spec/fixtures/ds1.csv | 50 - .../gems/diff-lcs-1.6.2/spec/fixtures/ds2.csv | 51 - .../gems/diff-lcs-1.6.2/spec/fixtures/empty | 0 .../diff-lcs-1.6.2/spec/fixtures/file1.bin | Bin 1 -> 0 bytes .../diff-lcs-1.6.2/spec/fixtures/file2.bin | Bin 6 -> 0 bytes .../diff-lcs-1.6.2/spec/fixtures/four_lines | 4 - .../fixtures/four_lines_with_missing_new_line | 4 - .../fixtures/ldiff/diff.missing_new_line1-e | 1 - .../fixtures/ldiff/diff.missing_new_line1-f | 1 - .../fixtures/ldiff/diff.missing_new_line2-e | 1 - .../fixtures/ldiff/diff.missing_new_line2-f | 1 - .../spec/fixtures/ldiff/error.diff.chef-e | 2 - .../spec/fixtures/ldiff/error.diff.chef-f | 2 - .../ldiff/error.diff.missing_new_line1-e | 1 - .../ldiff/error.diff.missing_new_line1-f | 1 - .../ldiff/error.diff.missing_new_line2-e | 1 - .../ldiff/error.diff.missing_new_line2-f | 1 - .../spec/fixtures/ldiff/output.diff | 4 - .../spec/fixtures/ldiff/output.diff-c | 7 - .../spec/fixtures/ldiff/output.diff-e | 3 - .../spec/fixtures/ldiff/output.diff-f | 3 - .../spec/fixtures/ldiff/output.diff-u | 5 - .../spec/fixtures/ldiff/output.diff.bin1 | 0 .../spec/fixtures/ldiff/output.diff.bin1-c | 0 .../spec/fixtures/ldiff/output.diff.bin1-e | 0 .../spec/fixtures/ldiff/output.diff.bin1-f | 0 .../spec/fixtures/ldiff/output.diff.bin1-u | 0 .../spec/fixtures/ldiff/output.diff.bin2 | 1 - .../spec/fixtures/ldiff/output.diff.bin2-c | 1 - .../spec/fixtures/ldiff/output.diff.bin2-e | 1 - .../spec/fixtures/ldiff/output.diff.bin2-f | 1 - .../spec/fixtures/ldiff/output.diff.bin2-u | 1 - .../spec/fixtures/ldiff/output.diff.chef | 4 - .../spec/fixtures/ldiff/output.diff.chef-c | 15 - .../spec/fixtures/ldiff/output.diff.chef-e | 3 - .../spec/fixtures/ldiff/output.diff.chef-f | 3 - .../spec/fixtures/ldiff/output.diff.chef-u | 9 - .../spec/fixtures/ldiff/output.diff.chef2 | 7 - .../spec/fixtures/ldiff/output.diff.chef2-c | 20 - .../spec/fixtures/ldiff/output.diff.chef2-d | 7 - .../spec/fixtures/ldiff/output.diff.chef2-e | 7 - .../spec/fixtures/ldiff/output.diff.chef2-f | 7 - .../spec/fixtures/ldiff/output.diff.chef2-u | 16 - .../ldiff/output.diff.empty.vs.four_lines | 5 - .../ldiff/output.diff.empty.vs.four_lines-c | 9 - .../ldiff/output.diff.empty.vs.four_lines-e | 6 - .../ldiff/output.diff.empty.vs.four_lines-f | 6 - .../ldiff/output.diff.empty.vs.four_lines-u | 7 - .../ldiff/output.diff.four_lines.vs.empty | 5 - .../ldiff/output.diff.four_lines.vs.empty-c | 9 - .../ldiff/output.diff.four_lines.vs.empty-e | 1 - .../ldiff/output.diff.four_lines.vs.empty-f | 1 - .../ldiff/output.diff.four_lines.vs.empty-u | 7 - .../output.diff.issue95_trailing_context | 4 - .../output.diff.issue95_trailing_context-c | 9 - .../output.diff.issue95_trailing_context-e | 3 - .../output.diff.issue95_trailing_context-f | 3 - .../output.diff.issue95_trailing_context-u | 6 - .../ldiff/output.diff.missing_new_line1 | 5 - .../ldiff/output.diff.missing_new_line1-c | 14 - .../ldiff/output.diff.missing_new_line1-e | 0 .../ldiff/output.diff.missing_new_line1-f | 0 .../ldiff/output.diff.missing_new_line1-u | 9 - .../ldiff/output.diff.missing_new_line2 | 5 - .../ldiff/output.diff.missing_new_line2-c | 14 - .../ldiff/output.diff.missing_new_line2-e | 0 .../ldiff/output.diff.missing_new_line2-f | 0 .../ldiff/output.diff.missing_new_line2-u | 9 - .../diff-lcs-1.6.2/spec/fixtures/new-chef | 4 - .../diff-lcs-1.6.2/spec/fixtures/new-chef2 | 17 - .../diff-lcs-1.6.2/spec/fixtures/old-chef | 4 - .../diff-lcs-1.6.2/spec/fixtures/old-chef2 | 14 - .../gems/diff-lcs-1.6.2/spec/hunk_spec.rb | 83 - .../gems/diff-lcs-1.6.2/spec/issues_spec.rb | 160 - .../gems/diff-lcs-1.6.2/spec/lcs_spec.rb | 56 - .../gems/diff-lcs-1.6.2/spec/ldiff_spec.rb | 100 - .../gems/diff-lcs-1.6.2/spec/patch_spec.rb | 416 - .../gems/diff-lcs-1.6.2/spec/sdiff_spec.rb | 216 - .../gems/diff-lcs-1.6.2/spec/spec_helper.rb | 376 - .../spec/traverse_balanced_spec.rb | 312 - .../spec/traverse_sequences_spec.rb | 137 - .../ruby/3.2.0/gems/erb-5.0.2/.document | 6 - .../gems/erb-5.0.2/.github/dependabot.yml | 6 - .../gems/erb-5.0.2/.github/workflows/test.yml | 33 - .../ruby/3.2.0/gems/erb-5.0.2/.gitignore | 12 - .../ruby/3.2.0/gems/erb-5.0.2/.rdoc_options | 1 - vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/BDSL | 22 - .../bundle/ruby/3.2.0/gems/erb-5.0.2/COPYING | 56 - .../bundle/ruby/3.2.0/gems/erb-5.0.2/Gemfile | 10 - .../ruby/3.2.0/gems/erb-5.0.2/LICENSE.txt | 2 - .../bundle/ruby/3.2.0/gems/erb-5.0.2/NEWS.md | 65 - .../ruby/3.2.0/gems/erb-5.0.2/README.md | 255 - .../bundle/ruby/3.2.0/gems/erb-5.0.2/Rakefile | 19 - .../ruby/3.2.0/gems/erb-5.0.2/_doc/cgi.rb | 3 - .../ruby/3.2.0/gems/erb-5.0.2/bin/console | 14 - .../ruby/3.2.0/gems/erb-5.0.2/bin/setup | 8 - .../ruby/3.2.0/gems/erb-5.0.2/erb.gemspec | 36 - .../gems/erb-5.0.2/ext/erb/escape/Makefile | 269 - .../gems/erb-5.0.2/ext/erb/escape/escape.c | 102 - .../gems/erb-5.0.2/ext/erb/escape/extconf.rb | 9 - .../ruby/3.2.0/gems/erb-5.0.2/lib/erb.rb | 504 - .../3.2.0/gems/erb-5.0.2/lib/erb/compiler.rb | 488 - .../gems/erb-5.0.2/lib/erb/def_method.rb | 47 - .../ruby/3.2.0/gems/erb-5.0.2/lib/erb/util.rb | 76 - .../3.2.0/gems/erb-5.0.2/lib/erb/version.rb | 4 - .../ruby/3.2.0/gems/erb-5.0.2/libexec/erb | 164 - .../ruby/3.2.0/gems/nio4r-2.7.4/changes.md | 332 - .../3.2.0/gems/nio4r-2.7.4/ext/libev/Changes | 617 - .../3.2.0/gems/nio4r-2.7.4/ext/libev/LICENSE | 37 - .../3.2.0/gems/nio4r-2.7.4/ext/libev/README | 59 - .../3.2.0/gems/nio4r-2.7.4/ext/libev/ev.c | 5689 ------ .../3.2.0/gems/nio4r-2.7.4/ext/libev/ev.h | 859 - .../gems/nio4r-2.7.4/ext/libev/ev_epoll.c | 298 - .../gems/nio4r-2.7.4/ext/libev/ev_iouring.c | 694 - .../gems/nio4r-2.7.4/ext/libev/ev_kqueue.c | 224 - .../gems/nio4r-2.7.4/ext/libev/ev_linuxaio.c | 620 - .../gems/nio4r-2.7.4/ext/libev/ev_poll.c | 156 - .../gems/nio4r-2.7.4/ext/libev/ev_port.c | 192 - .../gems/nio4r-2.7.4/ext/libev/ev_select.c | 316 - .../gems/nio4r-2.7.4/ext/libev/ev_vars.h | 249 - .../gems/nio4r-2.7.4/ext/libev/ev_win32.c | 162 - .../gems/nio4r-2.7.4/ext/libev/ev_wrap.h | 272 - .../gems/nio4r-2.7.4/ext/nio4r/.clang-format | 16 - .../3.2.0/gems/nio4r-2.7.4/ext/nio4r/Makefile | 269 - .../gems/nio4r-2.7.4/ext/nio4r/bytebuffer.c | 465 - .../gems/nio4r-2.7.4/ext/nio4r/extconf.rb | 53 - .../3.2.0/gems/nio4r-2.7.4/ext/nio4r/libev.h | 7 - .../gems/nio4r-2.7.4/ext/nio4r/monitor.c | 344 - .../3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r.h | 48 - .../gems/nio4r-2.7.4/ext/nio4r/nio4r_ext.c | 24 - .../ext/nio4r/org/nio4r/ByteBuffer.java | 295 - .../ext/nio4r/org/nio4r/Monitor.java | 176 - .../ext/nio4r/org/nio4r/Nio4r.java | 104 - .../ext/nio4r/org/nio4r/Selector.java | 297 - .../gems/nio4r-2.7.4/ext/nio4r/selector.c | 606 - .../ruby/3.2.0/gems/nio4r-2.7.4/lib/nio.rb | 61 - .../gems/nio4r-2.7.4/lib/nio/bytebuffer.rb | 235 - .../3.2.0/gems/nio4r-2.7.4/lib/nio/monitor.rb | 124 - .../gems/nio4r-2.7.4/lib/nio/selector.rb | 188 - .../3.2.0/gems/nio4r-2.7.4/lib/nio/version.rb | 10 - .../ruby/3.2.0/gems/nio4r-2.7.4/lib/nio4r.rb | 7 - .../3.2.0/gems/nio4r-2.7.4/lib/nio4r_ext.so | Bin 345376 -> 0 bytes .../ruby/3.2.0/gems/nio4r-2.7.4/license.md | 80 - .../ruby/3.2.0/gems/nio4r-2.7.4/readme.md | 91 - .../3.2.0/gems/psych-5.2.6/CONTRIBUTING.md | 24 - .../ruby/3.2.0/gems/psych-5.2.6/LICENSE | 21 - .../ruby/3.2.0/gems/psych-5.2.6/README.md | 80 - .../3.2.0/gems/psych-5.2.6/ext/psych/Makefile | 291 - .../3.2.0/gems/psych-5.2.6/ext/psych/depend | 17 - .../gems/psych-5.2.6/ext/psych/extconf.rb | 53 - .../3.2.0/gems/psych-5.2.6/ext/psych/psych.c | 36 - .../3.2.0/gems/psych-5.2.6/ext/psych/psych.h | 17 - .../psych-5.2.6/ext/psych/psych_emitter.c | 589 - .../psych-5.2.6/ext/psych/psych_emitter.h | 8 - .../gems/psych-5.2.6/ext/psych/psych_parser.c | 564 - .../gems/psych-5.2.6/ext/psych/psych_parser.h | 6 - .../psych-5.2.6/ext/psych/psych_to_ruby.c | 48 - .../psych-5.2.6/ext/psych/psych_to_ruby.h | 8 - .../psych-5.2.6/ext/psych/psych_yaml_tree.c | 11 - .../psych-5.2.6/ext/psych/psych_yaml_tree.h | 8 - .../ruby/3.2.0/gems/psych-5.2.6/lib/psych.rb | 793 - .../ruby/3.2.0/gems/psych-5.2.6/lib/psych.so | Bin 147880 -> 0 bytes .../psych-5.2.6/lib/psych/class_loader.rb | 105 - .../3.2.0/gems/psych-5.2.6/lib/psych/coder.rb | 95 - .../gems/psych-5.2.6/lib/psych/core_ext.rb | 40 - .../gems/psych-5.2.6/lib/psych/exception.rb | 28 - .../gems/psych-5.2.6/lib/psych/handler.rb | 255 - .../lib/psych/handlers/document_stream.rb | 23 - .../lib/psych/handlers/recorder.rb | 40 - .../psych-5.2.6/lib/psych/json/ruby_events.rb | 20 - .../gems/psych-5.2.6/lib/psych/json/stream.rb | 17 - .../lib/psych/json/tree_builder.rb | 13 - .../psych-5.2.6/lib/psych/json/yaml_events.rb | 30 - .../3.2.0/gems/psych-5.2.6/lib/psych/nodes.rb | 78 - .../gems/psych-5.2.6/lib/psych/nodes/alias.rb | 21 - .../psych-5.2.6/lib/psych/nodes/document.rb | 63 - .../psych-5.2.6/lib/psych/nodes/mapping.rb | 59 - .../gems/psych-5.2.6/lib/psych/nodes/node.rb | 76 - .../psych-5.2.6/lib/psych/nodes/scalar.rb | 70 - .../psych-5.2.6/lib/psych/nodes/sequence.rb | 84 - .../psych-5.2.6/lib/psych/nodes/stream.rb | 40 - .../3.2.0/gems/psych-5.2.6/lib/psych/omap.rb | 5 - .../gems/psych-5.2.6/lib/psych/parser.rb | 65 - .../psych-5.2.6/lib/psych/scalar_scanner.rb | 141 - .../3.2.0/gems/psych-5.2.6/lib/psych/set.rb | 5 - .../gems/psych-5.2.6/lib/psych/stream.rb | 38 - .../gems/psych-5.2.6/lib/psych/streaming.rb | 28 - .../psych-5.2.6/lib/psych/syntax_error.rb | 22 - .../psych-5.2.6/lib/psych/tree_builder.rb | 137 - .../gems/psych-5.2.6/lib/psych/versions.rb | 10 - .../gems/psych-5.2.6/lib/psych/visitors.rb | 7 - .../lib/psych/visitors/depth_first.rb | 27 - .../psych-5.2.6/lib/psych/visitors/emitter.rb | 52 - .../lib/psych/visitors/json_tree.rb | 25 - .../psych-5.2.6/lib/psych/visitors/to_ruby.rb | 475 - .../psych-5.2.6/lib/psych/visitors/visitor.rb | 34 - .../lib/psych/visitors/yaml_tree.rb | 626 - .../3.2.0/gems/psych-5.2.6/lib/psych/y.rb | 10 - .../ruby/3.2.0/gems/puma-6.6.1/History.md | 3046 --- .../bundle/ruby/3.2.0/gems/puma-6.6.1/LICENSE | 29 - .../ruby/3.2.0/gems/puma-6.6.1/README.md | 485 - .../ruby/3.2.0/gems/puma-6.6.1/bin/puma | 10 - .../ruby/3.2.0/gems/puma-6.6.1/bin/puma-wild | 25 - .../ruby/3.2.0/gems/puma-6.6.1/bin/pumactl | 12 - .../gems/puma-6.6.1/docs/architecture.md | 74 - .../gems/puma-6.6.1/docs/compile_options.md | 55 - .../3.2.0/gems/puma-6.6.1/docs/deployment.md | 102 - .../3.2.0/gems/puma-6.6.1/docs/fork_worker.md | 41 - .../puma-connection-flow-no-reactor.png | Bin 16029 -> 0 bytes .../docs/images/puma-connection-flow.png | Bin 16165 -> 0 bytes .../docs/images/puma-general-arch.png | Bin 13088 -> 0 bytes .../gems/puma-6.6.1/docs/java_options.md | 54 - .../gems/puma-6.6.1/docs/jungle/README.md | 9 - .../puma-6.6.1/docs/jungle/rc.d/README.md | 74 - .../gems/puma-6.6.1/docs/jungle/rc.d/puma | 61 - .../puma-6.6.1/docs/jungle/rc.d/puma.conf | 10 - .../3.2.0/gems/puma-6.6.1/docs/kubernetes.md | 78 - .../ruby/3.2.0/gems/puma-6.6.1/docs/nginx.md | 80 - .../3.2.0/gems/puma-6.6.1/docs/plugins.md | 42 - .../gems/puma-6.6.1/docs/rails_dev_mode.md | 28 - .../3.2.0/gems/puma-6.6.1/docs/restart.md | 65 - .../3.2.0/gems/puma-6.6.1/docs/signals.md | 98 - .../ruby/3.2.0/gems/puma-6.6.1/docs/stats.md | 147 - .../3.2.0/gems/puma-6.6.1/docs/systemd.md | 253 - .../docs/testing_benchmarks_local_files.md | 150 - .../docs/testing_test_rackup_ci_files.md | 36 - .../gems/puma-6.6.1/ext/puma_http11/Makefile | 269 - .../ext/puma_http11/PumaHttp11Service.java | 17 - .../puma-6.6.1/ext/puma_http11/ext_help.h | 15 - .../puma-6.6.1/ext/puma_http11/extconf.rb | 80 - .../ext/puma_http11/http11_parser.c | 1057 - .../ext/puma_http11/http11_parser.h | 65 - .../ext/puma_http11/http11_parser.java.rl | 145 - .../ext/puma_http11/http11_parser.rl | 149 - .../ext/puma_http11/http11_parser_common.rl | 54 - .../puma-6.6.1/ext/puma_http11/mini_ssl.c | 842 - .../puma_http11/no_ssl/PumaHttp11Service.java | 15 - .../puma_http11/org/jruby/puma/Http11.java | 249 - .../org/jruby/puma/Http11Parser.java | 455 - .../puma_http11/org/jruby/puma/MiniSSL.java | 509 - .../puma-6.6.1/ext/puma_http11/puma_http11.c | 495 - .../ruby/3.2.0/gems/puma-6.6.1/lib/puma.rb | 78 - .../gems/puma-6.6.1/lib/puma/app/status.rb | 96 - .../3.2.0/gems/puma-6.6.1/lib/puma/binder.rb | 509 - .../3.2.0/gems/puma-6.6.1/lib/puma/cli.rb | 247 - .../3.2.0/gems/puma-6.6.1/lib/puma/client.rb | 720 - .../3.2.0/gems/puma-6.6.1/lib/puma/cluster.rb | 634 - .../puma-6.6.1/lib/puma/cluster/worker.rb | 183 - .../lib/puma/cluster/worker_handle.rb | 96 - .../gems/puma-6.6.1/lib/puma/commonlogger.rb | 115 - .../gems/puma-6.6.1/lib/puma/configuration.rb | 407 - .../3.2.0/gems/puma-6.6.1/lib/puma/const.rb | 308 - .../gems/puma-6.6.1/lib/puma/control_cli.rb | 316 - .../3.2.0/gems/puma-6.6.1/lib/puma/detect.rb | 45 - .../3.2.0/gems/puma-6.6.1/lib/puma/dsl.rb | 1438 -- .../gems/puma-6.6.1/lib/puma/error_logger.rb | 113 - .../3.2.0/gems/puma-6.6.1/lib/puma/events.rb | 57 - .../gems/puma-6.6.1/lib/puma/io_buffer.rb | 46 - .../gems/puma-6.6.1/lib/puma/jruby_restart.rb | 11 - .../puma-6.6.1/lib/puma/json_serialization.rb | 96 - .../gems/puma-6.6.1/lib/puma/launcher.rb | 497 - .../lib/puma/launcher/bundle_pruner.rb | 104 - .../gems/puma-6.6.1/lib/puma/log_writer.rb | 147 - .../3.2.0/gems/puma-6.6.1/lib/puma/minissl.rb | 459 - .../lib/puma/minissl/context_builder.rb | 96 - .../3.2.0/gems/puma-6.6.1/lib/puma/null_io.rb | 101 - .../3.2.0/gems/puma-6.6.1/lib/puma/plugin.rb | 111 - .../puma-6.6.1/lib/puma/plugin/systemd.rb | 90 - .../puma-6.6.1/lib/puma/plugin/tmp_restart.rb | 36 - .../gems/puma-6.6.1/lib/puma/puma_http11.so | Bin 141920 -> 0 bytes .../gems/puma-6.6.1/lib/puma/rack/builder.rb | 297 - .../gems/puma-6.6.1/lib/puma/rack/urlmap.rb | 93 - .../gems/puma-6.6.1/lib/puma/rack_default.rb | 24 - .../3.2.0/gems/puma-6.6.1/lib/puma/reactor.rb | 125 - .../3.2.0/gems/puma-6.6.1/lib/puma/request.rb | 692 - .../3.2.0/gems/puma-6.6.1/lib/puma/runner.rb | 220 - .../gems/puma-6.6.1/lib/puma/sd_notify.rb | 146 - .../3.2.0/gems/puma-6.6.1/lib/puma/server.rb | 688 - .../3.2.0/gems/puma-6.6.1/lib/puma/single.rb | 69 - .../gems/puma-6.6.1/lib/puma/state_file.rb | 68 - .../gems/puma-6.6.1/lib/puma/thread_pool.rb | 446 - .../3.2.0/gems/puma-6.6.1/lib/puma/util.rb | 141 - .../gems/puma-6.6.1/lib/rack/handler/puma.rb | 144 - .../3.2.0/gems/puma-6.6.1/tools/Dockerfile | 18 - .../gems/puma-6.6.1/tools/trickletest.rb | 44 - .../ruby/3.2.0/gems/rack-3.2.0/CHANGELOG.md | 1226 -- .../3.2.0/gems/rack-3.2.0/CONTRIBUTING.md | 144 - .../ruby/3.2.0/gems/rack-3.2.0/MIT-LICENSE | 20 - .../ruby/3.2.0/gems/rack-3.2.0/README.md | 376 - .../ruby/3.2.0/gems/rack-3.2.0/SPEC.rdoc | 258 - .../ruby/3.2.0/gems/rack-3.2.0/lib/rack.rb | 64 - .../lib/rack/auth/abstract/handler.rb | 41 - .../lib/rack/auth/abstract/request.rb | 51 - .../gems/rack-3.2.0/lib/rack/auth/basic.rb | 58 - .../gems/rack-3.2.0/lib/rack/bad_request.rb | 8 - .../gems/rack-3.2.0/lib/rack/body_proxy.rb | 63 - .../3.2.0/gems/rack-3.2.0/lib/rack/builder.rb | 296 - .../3.2.0/gems/rack-3.2.0/lib/rack/cascade.rb | 67 - .../gems/rack-3.2.0/lib/rack/common_logger.rb | 89 - .../rack-3.2.0/lib/rack/conditional_get.rb | 87 - .../3.2.0/gems/rack-3.2.0/lib/rack/config.rb | 22 - .../gems/rack-3.2.0/lib/rack/constants.rb | 68 - .../rack-3.2.0/lib/rack/content_length.rb | 34 - .../gems/rack-3.2.0/lib/rack/content_type.rb | 33 - .../gems/rack-3.2.0/lib/rack/deflater.rb | 158 - .../gems/rack-3.2.0/lib/rack/directory.rb | 205 - .../3.2.0/gems/rack-3.2.0/lib/rack/etag.rb | 71 - .../3.2.0/gems/rack-3.2.0/lib/rack/events.rb | 157 - .../3.2.0/gems/rack-3.2.0/lib/rack/files.rb | 216 - .../3.2.0/gems/rack-3.2.0/lib/rack/head.rb | 25 - .../3.2.0/gems/rack-3.2.0/lib/rack/headers.rb | 238 - .../3.2.0/gems/rack-3.2.0/lib/rack/lint.rb | 964 - .../3.2.0/gems/rack-3.2.0/lib/rack/lock.rb | 29 - .../gems/rack-3.2.0/lib/rack/media_type.rb | 52 - .../rack-3.2.0/lib/rack/method_override.rb | 56 - .../3.2.0/gems/rack-3.2.0/lib/rack/mime.rb | 694 - .../3.2.0/gems/rack-3.2.0/lib/rack/mock.rb | 3 - .../gems/rack-3.2.0/lib/rack/mock_request.rb | 161 - .../gems/rack-3.2.0/lib/rack/mock_response.rb | 147 - .../gems/rack-3.2.0/lib/rack/multipart.rb | 77 - .../lib/rack/multipart/generator.rb | 99 - .../rack-3.2.0/lib/rack/multipart/parser.rb | 530 - .../lib/rack/multipart/uploaded_file.rb | 82 - .../gems/rack-3.2.0/lib/rack/null_logger.rb | 48 - .../gems/rack-3.2.0/lib/rack/query_parser.rb | 259 - .../gems/rack-3.2.0/lib/rack/recursive.rb | 66 - .../gems/rack-3.2.0/lib/rack/reloader.rb | 112 - .../3.2.0/gems/rack-3.2.0/lib/rack/request.rb | 787 - .../gems/rack-3.2.0/lib/rack/response.rb | 403 - .../rack-3.2.0/lib/rack/rewindable_input.rb | 116 - .../3.2.0/gems/rack-3.2.0/lib/rack/runtime.rb | 35 - .../gems/rack-3.2.0/lib/rack/sendfile.rb | 167 - .../rack-3.2.0/lib/rack/show_exceptions.rb | 409 - .../gems/rack-3.2.0/lib/rack/show_status.rb | 121 - .../3.2.0/gems/rack-3.2.0/lib/rack/static.rb | 188 - .../rack-3.2.0/lib/rack/tempfile_reaper.rb | 33 - .../3.2.0/gems/rack-3.2.0/lib/rack/urlmap.rb | 99 - .../3.2.0/gems/rack-3.2.0/lib/rack/utils.rb | 622 - .../3.2.0/gems/rack-3.2.0/lib/rack/version.rb | 17 - .../3.2.0/gems/rack-test-2.2.0/History.md | 389 - .../gems/rack-test-2.2.0/MIT-LICENSE.txt | 20 - .../ruby/3.2.0/gems/rack-test-2.2.0/README.md | 139 - .../gems/rack-test-2.2.0/lib/rack/test.rb | 382 - .../lib/rack/test/cookie_jar.rb | 251 - .../rack-test-2.2.0/lib/rack/test/methods.rb | 94 - .../lib/rack/test/uploaded_file.rb | 99 - .../rack-test-2.2.0/lib/rack/test/utils.rb | 156 - .../rack-test-2.2.0/lib/rack/test/version.rb | 5 - .../ruby/3.2.0/gems/rackup-2.2.1/bin/rackup | 5 - .../3.2.0/gems/rackup-2.2.1/lib/rackup.rb | 21 - .../gems/rackup-2.2.1/lib/rackup/handler.rb | 113 - .../rackup-2.2.1/lib/rackup/handler/cgi.rb | 61 - .../lib/rackup/handler/webrick.rb | 162 - .../gems/rackup-2.2.1/lib/rackup/lobster.rb | 81 - .../gems/rackup-2.2.1/lib/rackup/server.rb | 462 - .../gems/rackup-2.2.1/lib/rackup/stream.rb | 199 - .../gems/rackup-2.2.1/lib/rackup/version.rb | 8 - .../ruby/3.2.0/gems/rackup-2.2.1/license.md | 80 - .../ruby/3.2.0/gems/rackup-2.2.1/readme.md | 64 - .../ruby/3.2.0/gems/rackup-2.2.1/releases.md | 24 - .../ruby/3.2.0/gems/rackup-2.2.1/security.md | 3 - .../3.2.0/gems/rdoc-6.14.2/CONTRIBUTING.rdoc | 219 - .../3.2.0/gems/rdoc-6.14.2/CVE-2013-0256.rdoc | 49 - .../3.2.0/gems/rdoc-6.14.2/ExampleMarkdown.md | 39 - .../3.2.0/gems/rdoc-6.14.2/ExampleRDoc.rdoc | 210 - .../ruby/3.2.0/gems/rdoc-6.14.2/History.rdoc | 1668 -- .../ruby/3.2.0/gems/rdoc-6.14.2/LEGAL.rdoc | 50 - .../ruby/3.2.0/gems/rdoc-6.14.2/LICENSE.rdoc | 59 - .../ruby/3.2.0/gems/rdoc-6.14.2/README.rdoc | 144 - .../bundle/ruby/3.2.0/gems/rdoc-6.14.2/RI.md | 842 - .../ruby/3.2.0/gems/rdoc-6.14.2/TODO.rdoc | 60 - .../ruby/3.2.0/gems/rdoc-6.14.2/exe/rdoc | 43 - .../bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/ri | 12 - .../ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc.rb | 211 - .../gems/rdoc-6.14.2/lib/rdoc/code_object.rb | 395 - .../rdoc-6.14.2/lib/rdoc/code_object/alias.rb | 104 - .../lib/rdoc/code_object/anon_class.rb | 10 - .../lib/rdoc/code_object/any_method.rb | 374 - .../rdoc-6.14.2/lib/rdoc/code_object/attr.rb | 172 - .../lib/rdoc/code_object/class_module.rb | 888 - .../lib/rdoc/code_object/constant.rb | 186 - .../lib/rdoc/code_object/context.rb | 1222 -- .../lib/rdoc/code_object/context/section.rb | 176 - .../lib/rdoc/code_object/extend.rb | 9 - .../lib/rdoc/code_object/ghost_method.rb | 6 - .../lib/rdoc/code_object/include.rb | 9 - .../lib/rdoc/code_object/meta_method.rb | 6 - .../lib/rdoc/code_object/method_attr.rb | 411 - .../rdoc-6.14.2/lib/rdoc/code_object/mixin.rb | 120 - .../lib/rdoc/code_object/normal_class.rb | 92 - .../lib/rdoc/code_object/normal_module.rb | 73 - .../lib/rdoc/code_object/require.rb | 51 - .../lib/rdoc/code_object/single_class.rb | 30 - .../lib/rdoc/code_object/top_level.rb | 273 - .../gems/rdoc-6.14.2/lib/rdoc/code_objects.rb | 5 - .../gems/rdoc-6.14.2/lib/rdoc/comment.rb | 236 - .../rdoc-6.14.2/lib/rdoc/cross_reference.rb | 228 - .../gems/rdoc-6.14.2/lib/rdoc/encoding.rb | 120 - .../gems/rdoc-6.14.2/lib/rdoc/erb_partial.rb | 18 - .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/erbio.rb | 37 - .../gems/rdoc-6.14.2/lib/rdoc/generator.rb | 51 - .../lib/rdoc/generator/darkfish.rb | 812 - .../lib/rdoc/generator/json_index.rb | 284 - .../rdoc-6.14.2/lib/rdoc/generator/markup.rb | 171 - .../rdoc-6.14.2/lib/rdoc/generator/pot.rb | 94 - .../rdoc/generator/pot/message_extractor.rb | 68 - .../rdoc-6.14.2/lib/rdoc/generator/pot/po.rb | 84 - .../lib/rdoc/generator/pot/po_entry.rb | 141 - .../gems/rdoc-6.14.2/lib/rdoc/generator/ri.rb | 30 - .../generator/template/darkfish/_footer.rhtml | 5 - .../generator/template/darkfish/_head.rhtml | 48 - .../template/darkfish/_sidebar_classes.rhtml | 5 - .../template/darkfish/_sidebar_extends.rhtml | 15 - .../template/darkfish/_sidebar_includes.rhtml | 15 - .../darkfish/_sidebar_installed.rhtml | 15 - .../template/darkfish/_sidebar_methods.rhtml | 21 - .../darkfish/_sidebar_navigation.rhtml | 11 - .../template/darkfish/_sidebar_pages.rhtml | 32 - .../template/darkfish/_sidebar_parent.rhtml | 6 - .../template/darkfish/_sidebar_search.rhtml | 14 - .../template/darkfish/_sidebar_sections.rhtml | 11 - .../darkfish/_sidebar_table_of_contents.rhtml | 39 - .../template/darkfish/_sidebar_toggle.rhtml | 3 - .../generator/template/darkfish/class.rhtml | 221 - .../generator/template/darkfish/css/fonts.css | 167 - .../generator/template/darkfish/css/rdoc.css | 683 - .../template/darkfish/fonts/Lato-Light.ttf | Bin 94668 -> 0 bytes .../darkfish/fonts/Lato-LightItalic.ttf | Bin 94196 -> 0 bytes .../template/darkfish/fonts/Lato-Regular.ttf | Bin 96184 -> 0 bytes .../darkfish/fonts/Lato-RegularItalic.ttf | Bin 95316 -> 0 bytes .../darkfish/fonts/SourceCodePro-Bold.ttf | Bin 138268 -> 0 bytes .../darkfish/fonts/SourceCodePro-Regular.ttf | Bin 138680 -> 0 bytes .../template/darkfish/images/add.png | Bin 733 -> 0 bytes .../template/darkfish/images/arrow_up.png | Bin 372 -> 0 bytes .../template/darkfish/images/brick.png | Bin 452 -> 0 bytes .../template/darkfish/images/brick_link.png | Bin 764 -> 0 bytes .../template/darkfish/images/bug.png | Bin 774 -> 0 bytes .../template/darkfish/images/bullet_black.png | Bin 211 -> 0 bytes .../darkfish/images/bullet_toggle_minus.png | Bin 207 -> 0 bytes .../darkfish/images/bullet_toggle_plus.png | Bin 209 -> 0 bytes .../template/darkfish/images/date.png | Bin 626 -> 0 bytes .../template/darkfish/images/delete.png | Bin 715 -> 0 bytes .../template/darkfish/images/find.png | Bin 659 -> 0 bytes .../darkfish/images/loadingAnimation.gif | Bin 5886 -> 0 bytes .../template/darkfish/images/macFFBgHack.png | Bin 207 -> 0 bytes .../template/darkfish/images/package.png | Bin 853 -> 0 bytes .../template/darkfish/images/page_green.png | Bin 621 -> 0 bytes .../darkfish/images/page_white_text.png | Bin 342 -> 0 bytes .../darkfish/images/page_white_width.png | Bin 309 -> 0 bytes .../template/darkfish/images/plugin.png | Bin 591 -> 0 bytes .../template/darkfish/images/ruby.png | Bin 592 -> 0 bytes .../template/darkfish/images/tag_blue.png | Bin 1880 -> 0 bytes .../template/darkfish/images/tag_green.png | Bin 613 -> 0 bytes .../template/darkfish/images/transparent.png | Bin 97 -> 0 bytes .../template/darkfish/images/wrench.png | Bin 610 -> 0 bytes .../darkfish/images/wrench_orange.png | Bin 584 -> 0 bytes .../template/darkfish/images/zoom.png | Bin 692 -> 0 bytes .../generator/template/darkfish/index.rhtml | 23 - .../template/darkfish/js/darkfish.js | 120 - .../generator/template/darkfish/js/search.js | 110 - .../generator/template/darkfish/page.rhtml | 18 - .../template/darkfish/servlet_not_found.rhtml | 20 - .../template/darkfish/servlet_root.rhtml | 65 - .../template/darkfish/table_of_contents.rhtml | 70 - .../template/json_index/js/navigation.js | 105 - .../template/json_index/js/searcher.js | 229 - .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/i18n.rb | 10 - .../gems/rdoc-6.14.2/lib/rdoc/i18n/locale.rb | 102 - .../gems/rdoc-6.14.2/lib/rdoc/i18n/text.rb | 126 - .../rdoc-6.14.2/lib/rdoc/known_classes.rb | 74 - .../gems/rdoc-6.14.2/lib/rdoc/markdown.kpeg | 1289 -- .../gems/rdoc-6.14.2/lib/rdoc/markdown.rb | 16849 ---------------- .../rdoc-6.14.2/lib/rdoc/markdown/entities.rb | 2131 -- .../lib/rdoc/markdown/literals.kpeg | 21 - .../rdoc-6.14.2/lib/rdoc/markdown/literals.rb | 454 - .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup.rb | 240 - .../lib/rdoc/markup/attr_changer.rb | 22 - .../rdoc-6.14.2/lib/rdoc/markup/attr_span.rb | 35 - .../lib/rdoc/markup/attribute_manager.rb | 405 - .../rdoc-6.14.2/lib/rdoc/markup/attributes.rb | 70 - .../rdoc-6.14.2/lib/rdoc/markup/blank_line.rb | 27 - .../lib/rdoc/markup/block_quote.rb | 14 - .../rdoc-6.14.2/lib/rdoc/markup/document.rb | 164 - .../rdoc-6.14.2/lib/rdoc/markup/formatter.rb | 272 - .../rdoc-6.14.2/lib/rdoc/markup/hard_break.rb | 31 - .../rdoc-6.14.2/lib/rdoc/markup/heading.rb | 84 - .../rdoc-6.14.2/lib/rdoc/markup/include.rb | 42 - .../lib/rdoc/markup/indented_paragraph.rb | 47 - .../gems/rdoc-6.14.2/lib/rdoc/markup/list.rb | 101 - .../rdoc-6.14.2/lib/rdoc/markup/list_item.rb | 99 - .../rdoc-6.14.2/lib/rdoc/markup/paragraph.rb | 28 - .../rdoc-6.14.2/lib/rdoc/markup/parser.rb | 585 - .../lib/rdoc/markup/pre_process.rb | 318 - .../gems/rdoc-6.14.2/lib/rdoc/markup/raw.rb | 69 - .../lib/rdoc/markup/regexp_handling.rb | 40 - .../gems/rdoc-6.14.2/lib/rdoc/markup/rule.rb | 20 - .../gems/rdoc-6.14.2/lib/rdoc/markup/table.rb | 56 - .../rdoc-6.14.2/lib/rdoc/markup/to_ansi.rb | 93 - .../gems/rdoc-6.14.2/lib/rdoc/markup/to_bs.rb | 102 - .../rdoc-6.14.2/lib/rdoc/markup/to_html.rb | 461 - .../lib/rdoc/markup/to_html_crossref.rb | 226 - .../lib/rdoc/markup/to_html_snippet.rb | 287 - .../lib/rdoc/markup/to_joined_paragraph.rb | 46 - .../rdoc-6.14.2/lib/rdoc/markup/to_label.rb | 75 - .../lib/rdoc/markup/to_markdown.rb | 191 - .../rdoc-6.14.2/lib/rdoc/markup/to_rdoc.rb | 353 - .../lib/rdoc/markup/to_table_of_contents.rb | 88 - .../rdoc-6.14.2/lib/rdoc/markup/to_test.rb | 69 - .../rdoc-6.14.2/lib/rdoc/markup/to_tt_only.rb | 120 - .../rdoc-6.14.2/lib/rdoc/markup/verbatim.rb | 83 - .../gems/rdoc-6.14.2/lib/rdoc/options.rb | 1416 -- .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser.rb | 297 - .../gems/rdoc-6.14.2/lib/rdoc/parser/c.rb | 1257 -- .../rdoc-6.14.2/lib/rdoc/parser/changelog.rb | 350 - .../rdoc-6.14.2/lib/rdoc/parser/markdown.rb | 22 - .../rdoc-6.14.2/lib/rdoc/parser/prism_ruby.rb | 1092 - .../gems/rdoc-6.14.2/lib/rdoc/parser/rd.rb | 22 - .../lib/rdoc/parser/ripper_state_lex.rb | 302 - .../gems/rdoc-6.14.2/lib/rdoc/parser/ruby.rb | 2378 --- .../rdoc-6.14.2/lib/rdoc/parser/ruby_tools.rb | 165 - .../rdoc-6.14.2/lib/rdoc/parser/simple.rb | 61 - .../gems/rdoc-6.14.2/lib/rdoc/parser/text.rb | 11 - .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/rd.rb | 99 - .../rdoc-6.14.2/lib/rdoc/rd/block_parser.rb | 1706 -- .../rdoc-6.14.2/lib/rdoc/rd/block_parser.ry | 643 - .../gems/rdoc-6.14.2/lib/rdoc/rd/inline.rb | 71 - .../rdoc-6.14.2/lib/rdoc/rd/inline_parser.rb | 1854 -- .../rdoc-6.14.2/lib/rdoc/rd/inline_parser.ry | 593 - .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/rdoc.rb | 551 - .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/ri.rb | 20 - .../gems/rdoc-6.14.2/lib/rdoc/ri/driver.rb | 1566 -- .../gems/rdoc-6.14.2/lib/rdoc/ri/formatter.rb | 6 - .../gems/rdoc-6.14.2/lib/rdoc/ri/paths.rb | 171 - .../gems/rdoc-6.14.2/lib/rdoc/ri/store.rb | 6 - .../gems/rdoc-6.14.2/lib/rdoc/ri/task.rb | 71 - .../rdoc-6.14.2/lib/rdoc/rubygems_hook.rb | 327 - .../gems/rdoc-6.14.2/lib/rdoc/servlet.rb | 452 - .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/stats.rb | 461 - .../gems/rdoc-6.14.2/lib/rdoc/stats/normal.rb | 58 - .../gems/rdoc-6.14.2/lib/rdoc/stats/quiet.rb | 59 - .../rdoc-6.14.2/lib/rdoc/stats/verbose.rb | 44 - .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/store.rb | 997 - .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/task.rb | 354 - .../3.2.0/gems/rdoc-6.14.2/lib/rdoc/text.rb | 322 - .../gems/rdoc-6.14.2/lib/rdoc/token_stream.rb | 118 - .../gems/rdoc-6.14.2/lib/rdoc/tom_doc.rb | 257 - .../gems/rdoc-6.14.2/lib/rdoc/version.rb | 10 - .../gems/rdoc-6.14.2/lib/rubygems_plugin.rb | 23 - .../ruby/3.2.0/gems/rdoc-6.14.2/man/ri.1 | 249 - .../ruby/3.2.0/gems/rdoc-6.14.2/rdoc.gemspec | 71 - .../ruby/3.2.0/gems/rspec-3.13.1/LICENSE.md | 27 - .../ruby/3.2.0/gems/rspec-3.13.1/README.md | 47 - .../ruby/3.2.0/gems/rspec-3.13.1/lib/rspec.rb | 3 - .../gems/rspec-3.13.1/lib/rspec/version.rb | 5 - .../3.2.0/gems/rspec-core-3.13.5/.document | 5 - .../3.2.0/gems/rspec-core-3.13.5/.yardopts | 8 - .../3.2.0/gems/rspec-core-3.13.5/Changelog.md | 2439 --- .../3.2.0/gems/rspec-core-3.13.5/LICENSE.md | 26 - .../3.2.0/gems/rspec-core-3.13.5/README.md | 389 - .../3.2.0/gems/rspec-core-3.13.5/exe/rspec | 4 - .../rspec-core-3.13.5/lib/rspec/autorun.rb | 3 - .../gems/rspec-core-3.13.5/lib/rspec/core.rb | 212 - .../lib/rspec/core/backtrace_formatter.rb | 65 - .../lib/rspec/core/bisect/coordinator.rb | 62 - .../rspec/core/bisect/example_minimizer.rb | 173 - .../lib/rspec/core/bisect/fork_runner.rb | 140 - .../lib/rspec/core/bisect/server.rb | 61 - .../lib/rspec/core/bisect/shell_command.rb | 126 - .../lib/rspec/core/bisect/shell_runner.rb | 73 - .../lib/rspec/core/bisect/utilities.rb | 69 - .../lib/rspec/core/configuration.rb | 2419 --- .../lib/rspec/core/configuration_options.rb | 240 - .../lib/rspec/core/did_you_mean.rb | 52 - .../rspec-core-3.13.5/lib/rspec/core/drb.rb | 120 - .../rspec-core-3.13.5/lib/rspec/core/dsl.rb | 98 - .../lib/rspec/core/example.rb | 666 - .../lib/rspec/core/example_group.rb | 912 - .../rspec/core/example_status_persister.rb | 235 - .../lib/rspec/core/filter_manager.rb | 231 - .../lib/rspec/core/flat_map.rb | 20 - .../lib/rspec/core/formatters.rb | 279 - .../core/formatters/base_bisect_formatter.rb | 45 - .../rspec/core/formatters/base_formatter.rb | 70 - .../core/formatters/base_text_formatter.rb | 75 - .../core/formatters/bisect_drb_formatter.rb | 29 - .../formatters/bisect_progress_formatter.rb | 157 - .../rspec/core/formatters/console_codes.rb | 76 - .../core/formatters/deprecation_formatter.rb | 223 - .../formatters/documentation_formatter.rb | 102 - .../core/formatters/exception_presenter.rb | 553 - .../core/formatters/failure_list_formatter.rb | 23 - .../formatters/fallback_message_formatter.rb | 28 - .../lib/rspec/core/formatters/helpers.rb | 118 - .../rspec/core/formatters/html_formatter.rb | 153 - .../lib/rspec/core/formatters/html_printer.rb | 412 - .../core/formatters/html_snippet_extractor.rb | 122 - .../rspec/core/formatters/json_formatter.rb | 103 - .../core/formatters/profile_formatter.rb | 68 - .../core/formatters/progress_formatter.rb | 29 - .../lib/rspec/core/formatters/protocol.rb | 182 - .../core/formatters/snippet_extractor.rb | 134 - .../core/formatters/syntax_highlighter.rb | 91 - .../rspec-core-3.13.5/lib/rspec/core/hooks.rb | 646 - .../lib/rspec/core/invocations.rb | 87 - .../lib/rspec/core/memoized_helpers.rb | 580 - .../lib/rspec/core/metadata.rb | 498 - .../lib/rspec/core/metadata_filter.rb | 255 - .../rspec/core/minitest_assertions_adapter.rb | 31 - .../rspec/core/mocking_adapters/flexmock.rb | 31 - .../lib/rspec/core/mocking_adapters/mocha.rb | 57 - .../lib/rspec/core/mocking_adapters/null.rb | 14 - .../lib/rspec/core/mocking_adapters/rr.rb | 31 - .../lib/rspec/core/mocking_adapters/rspec.rb | 32 - .../lib/rspec/core/notifications.rb | 523 - .../lib/rspec/core/option_parser.rb | 325 - .../lib/rspec/core/ordering.rb | 208 - .../lib/rspec/core/output_wrapper.rb | 29 - .../lib/rspec/core/pending.rb | 157 - .../lib/rspec/core/profiler.rb | 34 - .../lib/rspec/core/project_initializer.rb | 48 - .../lib/rspec/core/project_initializer/.rspec | 1 - .../project_initializer/spec/spec_helper.rb | 98 - .../lib/rspec/core/rake_task.rb | 190 - .../lib/rspec/core/reporter.rb | 266 - .../lib/rspec/core/ruby_project.rb | 53 - .../lib/rspec/core/runner.rb | 216 - .../lib/rspec/core/sandbox.rb | 37 - .../rspec-core-3.13.5/lib/rspec/core/set.rb | 54 - .../lib/rspec/core/shared_context.rb | 55 - .../lib/rspec/core/shared_example_group.rb | 271 - .../lib/rspec/core/shell_escape.rb | 49 - .../core/test_unit_assertions_adapter.rb | 30 - .../lib/rspec/core/version.rb | 9 - .../lib/rspec/core/warnings.rb | 40 - .../rspec-core-3.13.5/lib/rspec/core/world.rb | 287 - .../gems/rspec-expectations-3.13.5/.document | 5 - .../gems/rspec-expectations-3.13.5/.yardopts | 6 - .../rspec-expectations-3.13.5/Changelog.md | 1366 -- .../gems/rspec-expectations-3.13.5/LICENSE.md | 25 - .../gems/rspec-expectations-3.13.5/README.md | 326 - .../lib/rspec/expectations.rb | 82 - .../expectations/block_snippet_extractor.rb | 255 - .../lib/rspec/expectations/configuration.rb | 244 - .../rspec/expectations/expectation_target.rb | 163 - .../lib/rspec/expectations/fail_with.rb | 39 - .../rspec/expectations/failure_aggregator.rb | 236 - .../lib/rspec/expectations/handler.rb | 181 - .../expectations/minitest_integration.rb | 58 - .../lib/rspec/expectations/syntax.rb | 132 - .../lib/rspec/expectations/version.rb | 8 - .../lib/rspec/matchers.rb | 1046 - .../lib/rspec/matchers/aliased_matcher.rb | 116 - .../lib/rspec/matchers/built_in.rb | 53 - .../lib/rspec/matchers/built_in/all.rb | 86 - .../rspec/matchers/built_in/base_matcher.rb | 225 - .../lib/rspec/matchers/built_in/be.rb | 191 - .../lib/rspec/matchers/built_in/be_between.rb | 77 - .../rspec/matchers/built_in/be_instance_of.rb | 26 - .../lib/rspec/matchers/built_in/be_kind_of.rb | 20 - .../lib/rspec/matchers/built_in/be_within.rb | 72 - .../lib/rspec/matchers/built_in/change.rb | 452 - .../lib/rspec/matchers/built_in/compound.rb | 293 - .../matchers/built_in/contain_exactly.rb | 312 - .../matchers/built_in/count_expectation.rb | 171 - .../lib/rspec/matchers/built_in/cover.rb | 24 - .../lib/rspec/matchers/built_in/eq.rb | 44 - .../lib/rspec/matchers/built_in/eql.rb | 38 - .../lib/rspec/matchers/built_in/equal.rb | 81 - .../lib/rspec/matchers/built_in/exist.rb | 90 - .../lib/rspec/matchers/built_in/has.rb | 194 - .../matchers/built_in/have_attributes.rb | 114 - .../lib/rspec/matchers/built_in/include.rb | 218 - .../lib/rspec/matchers/built_in/match.rb | 120 - .../lib/rspec/matchers/built_in/operators.rb | 128 - .../lib/rspec/matchers/built_in/output.rb | 207 - .../rspec/matchers/built_in/raise_error.rb | 275 - .../lib/rspec/matchers/built_in/respond_to.rb | 200 - .../lib/rspec/matchers/built_in/satisfy.rb | 62 - .../matchers/built_in/start_or_end_with.rb | 94 - .../rspec/matchers/built_in/throw_symbol.rb | 138 - .../lib/rspec/matchers/built_in/yield.rb | 375 - .../lib/rspec/matchers/composable.rb | 171 - .../lib/rspec/matchers/dsl.rb | 546 - .../lib/rspec/matchers/english_phrasing.rb | 60 - .../lib/rspec/matchers/fail_matchers.rb | 42 - .../rspec/matchers/generated_descriptions.rb | 41 - .../lib/rspec/matchers/matcher_delegator.rb | 61 - .../lib/rspec/matchers/matcher_protocol.rb | 105 - .../lib/rspec/matchers/multi_matcher_diff.rb | 82 - .../3.2.0/gems/rspec-mocks-3.13.5/.document | 5 - .../3.2.0/gems/rspec-mocks-3.13.5/.yardopts | 6 - .../gems/rspec-mocks-3.13.5/Changelog.md | 1329 -- .../3.2.0/gems/rspec-mocks-3.13.5/LICENSE.md | 25 - .../3.2.0/gems/rspec-mocks-3.13.5/README.md | 465 - .../rspec-mocks-3.13.5/lib/rspec/mocks.rb | 133 - .../lib/rspec/mocks/any_instance.rb | 11 - .../lib/rspec/mocks/any_instance/chain.rb | 111 - .../mocks/any_instance/error_generator.rb | 31 - .../mocks/any_instance/expect_chain_chain.rb | 31 - .../mocks/any_instance/expectation_chain.rb | 50 - .../mocks/any_instance/message_chains.rb | 83 - .../lib/rspec/mocks/any_instance/proxy.rb | 125 - .../lib/rspec/mocks/any_instance/recorder.rb | 299 - .../rspec/mocks/any_instance/stub_chain.rb | 51 - .../mocks/any_instance/stub_chain_chain.rb | 23 - .../lib/rspec/mocks/argument_list_matcher.rb | 117 - .../lib/rspec/mocks/argument_matchers.rb | 366 - .../lib/rspec/mocks/configuration.rb | 212 - .../lib/rspec/mocks/error_generator.rb | 390 - .../lib/rspec/mocks/example_methods.rb | 434 - .../rspec/mocks/instance_method_stasher.rb | 146 - .../lib/rspec/mocks/marshal_extension.rb | 41 - .../matchers/expectation_customization.rb | 20 - .../lib/rspec/mocks/matchers/have_received.rb | 134 - .../lib/rspec/mocks/matchers/receive.rb | 134 - .../mocks/matchers/receive_message_chain.rb | 82 - .../rspec/mocks/matchers/receive_messages.rb | 77 - .../lib/rspec/mocks/message_chain.rb | 87 - .../lib/rspec/mocks/message_expectation.rb | 856 - .../lib/rspec/mocks/method_double.rb | 316 - .../lib/rspec/mocks/method_reference.rb | 214 - .../lib/rspec/mocks/minitest_integration.rb | 68 - .../lib/rspec/mocks/mutate_const.rb | 339 - .../lib/rspec/mocks/object_reference.rb | 149 - .../lib/rspec/mocks/order_group.rb | 81 - .../lib/rspec/mocks/proxy.rb | 517 - .../lib/rspec/mocks/space.rb | 238 - .../lib/rspec/mocks/standalone.rb | 3 - .../lib/rspec/mocks/syntax.rb | 325 - .../lib/rspec/mocks/targets.rb | 124 - .../lib/rspec/mocks/test_double.rb | 173 - .../lib/rspec/mocks/verifying_double.rb | 125 - .../mocks/verifying_message_expectation.rb | 55 - .../lib/rspec/mocks/verifying_proxy.rb | 221 - .../lib/rspec/mocks/version.rb | 9 - .../gems/rspec-support-3.13.5/Changelog.md | 429 - .../gems/rspec-support-3.13.5/LICENSE.md | 23 - .../3.2.0/gems/rspec-support-3.13.5/README.md | 40 - .../rspec-support-3.13.5/lib/rspec/support.rb | 162 - .../lib/rspec/support/caller_filter.rb | 85 - .../lib/rspec/support/comparable_version.rb | 48 - .../lib/rspec/support/differ.rb | 217 - .../lib/rspec/support/directory_maker.rb | 65 - .../lib/rspec/support/encoded_string.rb | 163 - .../lib/rspec/support/fuzzy_matcher.rb | 50 - .../lib/rspec/support/hunk_generator.rb | 49 - .../lib/rspec/support/matcher_definition.rb | 44 - .../support/method_signature_verifier.rb | 467 - .../lib/rspec/support/mutex.rb | 75 - .../lib/rspec/support/object_formatter.rb | 279 - .../rspec/support/recursive_const_methods.rb | 78 - .../lib/rspec/support/reentrant_mutex.rb | 80 - .../lib/rspec/support/ruby_features.rb | 221 - .../lib/rspec/support/source.rb | 87 - .../lib/rspec/support/source/location.rb | 23 - .../lib/rspec/support/source/node.rb | 112 - .../lib/rspec/support/source/token.rb | 96 - .../lib/rspec/support/spec.rb | 84 - .../rspec/support/spec/deprecation_helpers.rb | 50 - .../lib/rspec/support/spec/diff_helpers.rb | 45 - .../rspec/support/spec/formatting_support.rb | 11 - .../lib/rspec/support/spec/in_sub_process.rb | 73 - .../rspec/support/spec/library_wide_checks.rb | 152 - .../lib/rspec/support/spec/shell_out.rb | 115 - .../lib/rspec/support/spec/stderr_splitter.rb | 77 - .../lib/rspec/support/spec/string_matcher.rb | 47 - .../support/spec/with_isolated_directory.rb | 15 - .../support/spec/with_isolated_stderr.rb | 15 - .../lib/rspec/support/version.rb | 9 - .../lib/rspec/support/warnings.rb | 41 - .../support/with_keywords_when_needed.rb | 35 - .../ruby/3.2.0/gems/stringio-3.1.7/.document | 5 - .../3.2.0/gems/stringio-3.1.7/.rdoc_options | 2 - .../ruby/3.2.0/gems/stringio-3.1.7/COPYING | 56 - .../3.2.0/gems/stringio-3.1.7/LICENSE.txt | 22 - .../ruby/3.2.0/gems/stringio-3.1.7/NEWS.md | 243 - .../ruby/3.2.0/gems/stringio-3.1.7/README.md | 45 - .../ruby/3.2.0/gems/stringio-3.1.7/docs/io.rb | 8 - .../stringio-3.1.7/ext/stringio/.document | 1 - .../gems/stringio-3.1.7/ext/stringio/Makefile | 269 - .../stringio-3.1.7/ext/stringio/extconf.rb | 9 - .../stringio-3.1.7/ext/stringio/stringio.c | 2023 -- .../3.2.0/gems/stringio-3.1.7/lib/stringio.so | Bin 184552 -> 0 bytes .../bundle/ruby/3.2.0/plugins/rdoc_plugin.rb | 1 - .../3.2.0/specifications/date-3.4.1.gemspec | 25 - .../specifications/diff-lcs-1.6.2.gemspec | 35 - .../3.2.0/specifications/erb-5.0.2.gemspec | 27 - .../3.2.0/specifications/nio4r-2.7.4.gemspec | 24 - .../3.2.0/specifications/psych-5.2.6.gemspec | 32 - .../3.2.0/specifications/puma-6.6.1.gemspec | 30 - .../3.2.0/specifications/rack-3.2.0.gemspec | 31 - .../specifications/rack-test-2.2.0.gemspec | 29 - .../3.2.0/specifications/rackup-2.2.1.gemspec | 26 - .../3.2.0/specifications/rdoc-6.14.2.gemspec | 32 - .../3.2.0/specifications/rspec-3.13.1.gemspec | 31 - .../specifications/rspec-core-3.13.5.gemspec | 31 - .../rspec-expectations-3.13.5.gemspec | 29 - .../specifications/rspec-mocks-3.13.5.gemspec | 29 - .../rspec-support-3.13.5.gemspec | 29 - .../specifications/stringio-3.1.7.gemspec | 26 - 900 files changed, 76 insertions(+), 179411 deletions(-) delete mode 100644 .bundle/config create mode 100644 spec/hanami_example_spec.rb create mode 100644 spec/sinatra_example_spec.rb delete mode 100755 vendor/bundle/ruby/3.2.0/bin/erb delete mode 100755 vendor/bundle/ruby/3.2.0/bin/htmldiff delete mode 100755 vendor/bundle/ruby/3.2.0/bin/ldiff delete mode 100755 vendor/bundle/ruby/3.2.0/bin/puma delete mode 100755 vendor/bundle/ruby/3.2.0/bin/pumactl delete mode 100755 vendor/bundle/ruby/3.2.0/bin/rackup delete mode 100755 vendor/bundle/ruby/3.2.0/bin/rdoc delete mode 100755 vendor/bundle/ruby/3.2.0/bin/ri delete mode 100755 vendor/bundle/ruby/3.2.0/bin/rspec delete mode 100644 vendor/bundle/ruby/3.2.0/cache/date-3.4.1.gem delete mode 100644 vendor/bundle/ruby/3.2.0/cache/diff-lcs-1.6.2.gem delete mode 100644 vendor/bundle/ruby/3.2.0/cache/erb-5.0.2.gem delete mode 100644 vendor/bundle/ruby/3.2.0/cache/nio4r-2.7.4.gem delete mode 100644 vendor/bundle/ruby/3.2.0/cache/psych-5.2.6.gem delete mode 100644 vendor/bundle/ruby/3.2.0/cache/puma-6.6.1.gem delete mode 100644 vendor/bundle/ruby/3.2.0/cache/rack-3.2.0.gem delete mode 100644 vendor/bundle/ruby/3.2.0/cache/rack-test-2.2.0.gem delete mode 100644 vendor/bundle/ruby/3.2.0/cache/rackup-2.2.1.gem delete mode 100644 vendor/bundle/ruby/3.2.0/cache/rdoc-6.14.2.gem delete mode 100644 vendor/bundle/ruby/3.2.0/cache/rspec-3.13.1.gem delete mode 100644 vendor/bundle/ruby/3.2.0/cache/rspec-core-3.13.5.gem delete mode 100644 vendor/bundle/ruby/3.2.0/cache/rspec-expectations-3.13.5.gem delete mode 100644 vendor/bundle/ruby/3.2.0/cache/rspec-mocks-3.13.5.gem delete mode 100644 vendor/bundle/ruby/3.2.0/cache/rspec-support-3.13.5.gem delete mode 100644 vendor/bundle/ruby/3.2.0/cache/stringio-3.1.7.gem delete mode 100755 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/date-3.4.1/date_core.so delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/date-3.4.1/gem.build_complete delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/date-3.4.1/gem_make.out delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/date-3.4.1/mkmf.log delete mode 100755 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/erb/escape.so delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/gem.build_complete delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/gem_make.out delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/mkmf.log delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/gem.build_complete delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/gem_make.out delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/mkmf.log delete mode 100755 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/nio4r_ext.so delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/psych-5.2.6/gem.build_complete delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/psych-5.2.6/gem_make.out delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/psych-5.2.6/mkmf.log delete mode 100755 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/psych-5.2.6/psych.so delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/puma-6.6.1/gem.build_complete delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/puma-6.6.1/gem_make.out delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/puma-6.6.1/mkmf.log delete mode 100755 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/puma-6.6.1/puma/puma_http11.so delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/stringio-3.1.7/gem.build_complete delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/stringio-3.1.7/gem_make.out delete mode 100644 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/stringio-3.1.7/mkmf.log delete mode 100755 vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/stringio-3.1.7/stringio.so delete mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/README.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/Makefile delete mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_core.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_parse.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_strftime.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_strptime.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_tmx.h delete mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/extconf.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/prereq.mk delete mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/zonetab.h delete mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/zonetab.list delete mode 100644 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/lib/date.rb delete mode 100755 vendor/bundle/ruby/3.2.0/gems/date-3.4.1/lib/date_core.so delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/.rspec delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CHANGELOG.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CODE_OF_CONDUCT.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTING.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTORS.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/LICENCE.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/Manifest.txt delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/README.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/Rakefile delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/SECURITY.md delete mode 100755 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/bin/htmldiff delete mode 100755 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/bin/ldiff delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/docs/COPYING.txt delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/docs/artistic.txt delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff-lcs.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/array.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/backports.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/block.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/callbacks.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/change.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/htmldiff.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/hunk.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/internals.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/ldiff.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/string.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/version.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/mise.toml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/change_spec.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/diff_spec.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/123_x delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/456_x delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/aX delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/bXaX delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ds1.csv delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ds2.csv delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/empty delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/file1.bin delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/file2.bin delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/four_lines delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/four_lines_with_missing_new_line delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line1-e delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line1-f delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line2-e delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line2-f delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.chef-e delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.chef-f delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line1-e delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line1-f delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line2-e delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line2-f delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-e delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-f delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-u delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1 delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-e delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-f delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-u delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2 delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-e delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-f delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-u delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-e delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-f delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-u delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2 delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-d delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-e delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-f delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-u delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-e delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-f delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-u delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-e delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-f delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-u delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-e delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-f delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-u delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1 delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-e delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-f delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-u delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2 delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-e delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-f delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-u delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/new-chef delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/new-chef2 delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/old-chef delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/old-chef2 delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/hunk_spec.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/issues_spec.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/lcs_spec.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/ldiff_spec.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/patch_spec.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/sdiff_spec.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/spec_helper.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/traverse_balanced_spec.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/traverse_sequences_spec.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.document delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.github/dependabot.yml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.github/workflows/test.yml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.gitignore delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.rdoc_options delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/BDSL delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/COPYING delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/Gemfile delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/LICENSE.txt delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/NEWS.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/README.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/Rakefile delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/_doc/cgi.rb delete mode 100755 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/bin/console delete mode 100755 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/bin/setup delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/erb.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/Makefile delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/escape.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/extconf.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/compiler.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/def_method.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/util.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/version.rb delete mode 100755 vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/libexec/erb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/changes.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/Changes delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/LICENSE delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/README delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev.h delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_epoll.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_iouring.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_kqueue.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_linuxaio.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_poll.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_port.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_select.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_vars.h delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_win32.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_wrap.h delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/.clang-format delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/Makefile delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/bytebuffer.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/extconf.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/libev.h delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/monitor.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r.h delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r_ext.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/ByteBuffer.java delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Monitor.java delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Nio4r.java delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Selector.java delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/selector.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/bytebuffer.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/monitor.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/selector.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/version.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio4r.rb delete mode 100755 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio4r_ext.so delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/license.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/readme.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/CONTRIBUTING.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/LICENSE delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/README.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/Makefile delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/depend delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/extconf.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych.h delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_emitter.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_emitter.h delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_parser.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_parser.h delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_to_ruby.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_to_ruby.h delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_yaml_tree.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_yaml_tree.h delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych.rb delete mode 100755 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych.so delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/class_loader.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/coder.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/core_ext.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/exception.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handler.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handlers/document_stream.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handlers/recorder.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/ruby_events.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/stream.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/tree_builder.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/yaml_events.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/alias.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/document.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/mapping.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/node.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/scalar.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/sequence.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/stream.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/omap.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/parser.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/scalar_scanner.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/set.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/stream.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/streaming.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/syntax_error.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/tree_builder.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/versions.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/depth_first.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/emitter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/json_tree.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/to_ruby.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/visitor.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/yaml_tree.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/y.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/History.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/LICENSE delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/README.md delete mode 100755 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/puma delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/puma-wild delete mode 100755 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/pumactl delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/architecture.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/compile_options.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/deployment.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/fork_worker.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/images/puma-connection-flow-no-reactor.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/images/puma-connection-flow.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/images/puma-general-arch.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/java_options.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/README.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/README.md delete mode 100755 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/puma delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/puma.conf delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/kubernetes.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/nginx.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/plugins.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/rails_dev_mode.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/restart.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/signals.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/stats.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/systemd.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/testing_benchmarks_local_files.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/testing_test_rackup_ci_files.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/Makefile delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/PumaHttp11Service.java delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/ext_help.h delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/extconf.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.h delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.java.rl delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.rl delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser_common.rl delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/mini_ssl.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/no_ssl/PumaHttp11Service.java delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/Http11.java delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/Http11Parser.java delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/MiniSSL.java delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/puma_http11.c delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/app/status.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/binder.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cli.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/client.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster/worker.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster/worker_handle.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/commonlogger.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/configuration.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/const.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/control_cli.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/detect.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/dsl.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/error_logger.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/events.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/io_buffer.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/jruby_restart.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/json_serialization.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/launcher.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/launcher/bundle_pruner.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/log_writer.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/minissl.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/minissl/context_builder.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/null_io.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin/systemd.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin/tmp_restart.rb delete mode 100755 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/puma_http11.so delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack/builder.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack/urlmap.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack_default.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/reactor.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/request.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/runner.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/sd_notify.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/server.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/single.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/state_file.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/thread_pool.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/util.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/rack/handler/puma.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/tools/Dockerfile delete mode 100644 vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/tools/trickletest.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/CHANGELOG.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/CONTRIBUTING.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/MIT-LICENSE delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/README.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/SPEC.rdoc delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/abstract/handler.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/abstract/request.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/basic.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/bad_request.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/body_proxy.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/builder.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/cascade.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/common_logger.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/conditional_get.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/config.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/constants.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/content_length.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/content_type.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/deflater.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/directory.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/etag.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/events.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/files.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/head.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/headers.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/lint.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/lock.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/media_type.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/method_override.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mime.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock_request.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock_response.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/generator.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/parser.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/uploaded_file.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/null_logger.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/query_parser.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/recursive.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/reloader.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/request.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/response.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/rewindable_input.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/runtime.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/sendfile.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/show_exceptions.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/show_status.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/static.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/tempfile_reaper.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/urlmap.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/utils.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/version.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/History.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/MIT-LICENSE.txt delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/README.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/cookie_jar.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/methods.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/uploaded_file.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/utils.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/version.rb delete mode 100755 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/bin/rackup delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler/cgi.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler/webrick.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/lobster.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/server.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/stream.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/version.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/license.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/readme.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/releases.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/security.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/CONTRIBUTING.rdoc delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/CVE-2013-0256.rdoc delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/ExampleMarkdown.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/ExampleRDoc.rdoc delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/History.rdoc delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/LEGAL.rdoc delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/LICENSE.rdoc delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/README.rdoc delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/RI.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/TODO.rdoc delete mode 100755 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/rdoc delete mode 100755 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/ri delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/alias.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/anon_class.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/any_method.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/attr.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/class_module.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/constant.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/context.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/context/section.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/extend.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/ghost_method.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/include.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/meta_method.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/method_attr.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/mixin.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/normal_class.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/normal_module.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/require.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/single_class.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/top_level.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_objects.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/comment.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/cross_reference.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/encoding.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/erb_partial.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/erbio.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/darkfish.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/json_index.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/markup.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/message_extractor.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/po.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/po_entry.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/ri.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_footer.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_head.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_navigation.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_toggle.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/class.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/css/fonts.css delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/css/rdoc.css delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-Light.ttf delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-LightItalic.ttf delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-Regular.ttf delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-RegularItalic.ttf delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Bold.ttf delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Regular.ttf delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/add.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/arrow_up.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/brick.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/brick_link.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/bug.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/bullet_black.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/bullet_toggle_minus.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/bullet_toggle_plus.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/date.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/delete.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/find.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/loadingAnimation.gif delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/macFFBgHack.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/package.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/page_green.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/page_white_text.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/page_white_width.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/plugin.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/ruby.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/tag_blue.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/tag_green.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/transparent.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/wrench.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/wrench_orange.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/zoom.png delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/index.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/js/darkfish.js delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/js/search.js delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/page.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/servlet_not_found.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/servlet_root.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/json_index/js/navigation.js delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/json_index/js/searcher.js delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/i18n.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/i18n/locale.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/i18n/text.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/known_classes.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markdown.kpeg delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markdown.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markdown/entities.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markdown/literals.kpeg delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markdown/literals.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/attr_changer.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/attr_span.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/attribute_manager.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/attributes.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/blank_line.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/block_quote.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/document.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/hard_break.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/heading.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/include.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/indented_paragraph.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/list.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/list_item.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/paragraph.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/parser.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/pre_process.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/raw.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/regexp_handling.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/rule.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/table.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_ansi.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_bs.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_html.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_html_crossref.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_html_snippet.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_joined_paragraph.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_label.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_markdown.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_rdoc.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_table_of_contents.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_test.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/to_tt_only.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/markup/verbatim.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/options.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/c.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/changelog.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/markdown.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/prism_ruby.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/rd.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/ripper_state_lex.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/ruby.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/ruby_tools.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/simple.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/parser/text.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/rd.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/rd/block_parser.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/rd/block_parser.ry delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/rd/inline.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/rd/inline_parser.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/rd/inline_parser.ry delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/rdoc.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/ri.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/ri/driver.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/ri/formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/ri/paths.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/ri/store.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/ri/task.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/rubygems_hook.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/servlet.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/stats.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/stats/normal.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/stats/quiet.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/stats/verbose.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/store.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/task.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/text.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/token_stream.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/tom_doc.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/version.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rubygems_plugin.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/man/ri.1 delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/rdoc.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-3.13.1/LICENSE.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-3.13.1/README.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-3.13.1/lib/rspec.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-3.13.1/lib/rspec/version.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/.document delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/.yardopts delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/Changelog.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/LICENSE.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/README.md delete mode 100755 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/exe/rspec delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/autorun.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/backtrace_formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/bisect/coordinator.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/bisect/example_minimizer.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/bisect/fork_runner.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/bisect/server.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/bisect/shell_command.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/bisect/shell_runner.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/bisect/utilities.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/configuration.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/configuration_options.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/did_you_mean.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/drb.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/dsl.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/example.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/example_group.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/example_status_persister.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/filter_manager.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/flat_map.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/base_bisect_formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/base_formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/base_text_formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/bisect_drb_formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/bisect_progress_formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/console_codes.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/deprecation_formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/documentation_formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/exception_presenter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/failure_list_formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/fallback_message_formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/helpers.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/html_formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/html_printer.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/html_snippet_extractor.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/json_formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/profile_formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/progress_formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/protocol.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/snippet_extractor.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/syntax_highlighter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/hooks.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/invocations.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/memoized_helpers.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/metadata.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/metadata_filter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/minitest_assertions_adapter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/flexmock.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/mocha.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/null.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/rr.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/rspec.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/notifications.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/option_parser.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/ordering.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/output_wrapper.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/pending.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/profiler.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer/.rspec delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer/spec/spec_helper.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/rake_task.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/reporter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/ruby_project.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/runner.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/sandbox.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/set.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shared_context.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shared_example_group.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shell_escape.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/test_unit_assertions_adapter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/version.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/warnings.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/world.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/.document delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/.yardopts delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/Changelog.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/LICENSE.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/README.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/block_snippet_extractor.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/configuration.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/expectation_target.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/fail_with.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/failure_aggregator.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/handler.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/minitest_integration.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/syntax.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/version.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/aliased_matcher.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/all.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/base_matcher.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_between.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_instance_of.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_kind_of.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_within.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/change.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/compound.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/contain_exactly.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/count_expectation.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/cover.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/eq.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/eql.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/equal.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/exist.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/has.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/have_attributes.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/include.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/match.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/operators.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/output.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/raise_error.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/respond_to.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/satisfy.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/start_or_end_with.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/throw_symbol.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/yield.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/composable.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/dsl.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/english_phrasing.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/fail_matchers.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/generated_descriptions.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/matcher_delegator.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/matcher_protocol.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/multi_matcher_diff.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/.document delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/.yardopts delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/Changelog.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/LICENSE.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/README.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/chain.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/error_generator.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/expect_chain_chain.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/expectation_chain.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/message_chains.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/proxy.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/recorder.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/stub_chain.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/stub_chain_chain.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/argument_list_matcher.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/argument_matchers.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/configuration.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/error_generator.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/example_methods.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/instance_method_stasher.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/marshal_extension.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/expectation_customization.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/have_received.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive_message_chain.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive_messages.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/message_chain.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/message_expectation.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/method_double.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/method_reference.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/minitest_integration.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/mutate_const.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/object_reference.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/order_group.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/proxy.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/space.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/standalone.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/syntax.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/targets.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/test_double.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_double.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_message_expectation.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_proxy.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/version.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/Changelog.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/LICENSE.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/README.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/caller_filter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/comparable_version.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/differ.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/directory_maker.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/encoded_string.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/fuzzy_matcher.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/hunk_generator.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/matcher_definition.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/method_signature_verifier.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/mutex.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/object_formatter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/recursive_const_methods.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/reentrant_mutex.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/ruby_features.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/location.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/node.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/token.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/deprecation_helpers.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/diff_helpers.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/formatting_support.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/in_sub_process.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/library_wide_checks.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/shell_out.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/stderr_splitter.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/string_matcher.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/with_isolated_directory.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/with_isolated_stderr.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/version.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/warnings.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/with_keywords_when_needed.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/.document delete mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/.rdoc_options delete mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/COPYING delete mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/LICENSE.txt delete mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/NEWS.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/README.md delete mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/docs/io.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/.document delete mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/Makefile delete mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/extconf.rb delete mode 100644 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/stringio.c delete mode 100755 vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/lib/stringio.so delete mode 100644 vendor/bundle/ruby/3.2.0/plugins/rdoc_plugin.rb delete mode 100644 vendor/bundle/ruby/3.2.0/specifications/date-3.4.1.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/specifications/diff-lcs-1.6.2.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/specifications/erb-5.0.2.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/specifications/nio4r-2.7.4.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/specifications/psych-5.2.6.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/specifications/puma-6.6.1.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/specifications/rack-3.2.0.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/specifications/rack-test-2.2.0.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/specifications/rackup-2.2.1.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/specifications/rdoc-6.14.2.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/specifications/rspec-3.13.1.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/specifications/rspec-core-3.13.5.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/specifications/rspec-expectations-3.13.5.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/specifications/rspec-mocks-3.13.5.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/specifications/rspec-support-3.13.5.gemspec delete mode 100644 vendor/bundle/ruby/3.2.0/specifications/stringio-3.1.7.gemspec diff --git a/.bundle/config b/.bundle/config deleted file mode 100644 index 2369228..0000000 --- a/.bundle/config +++ /dev/null @@ -1,2 +0,0 @@ ---- -BUNDLE_PATH: "vendor/bundle" diff --git a/.gitignore b/.gitignore index a2e6bd4..45bd856 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ doc/ +vendor/bundle/ +.bundle/ diff --git a/spec/hanami_example_spec.rb b/spec/hanami_example_spec.rb new file mode 100644 index 0000000..8c9071d --- /dev/null +++ b/spec/hanami_example_spec.rb @@ -0,0 +1,37 @@ +require 'rack/test' +require 'rack/builder' + +describe 'HanamiExample' do + include Rack::Test::Methods + + def app + # Load the actual app + ru_path = File.join(File.dirname(__FILE__), '../hanami_routing/hanami_routing.ru') + actual_app = Rack::Builder.parse_file(ru_path) + + # Create a wrapper that sets REQUEST_PATH from PATH_INFO + lambda do |env| + env['REQUEST_PATH'] = env['PATH_INFO'] + actual_app.call(env) + end + end + + it 'responds to GET /' do + get '/' + expect(last_response.status).to eq(200) + expect(last_response.body).to match(/Hello, from index.html/) + expect(last_response.body).to match(/Say hi to Jordan<\/a>/) + end + + it 'responds to GET /:name' do + get '/jordan' + expect(last_response.status).to eq(200) + expect(last_response.body).to match(/Hello, jordan!/) + end + + it 'returns 404 for unknown routes' do + get '/path/with/multiple/segments' + expect(last_response.status).to eq(404) + expect(last_response.body).to match(/404 Not Found/) + end +end \ No newline at end of file diff --git a/spec/sinatra_example_spec.rb b/spec/sinatra_example_spec.rb new file mode 100644 index 0000000..97d53c3 --- /dev/null +++ b/spec/sinatra_example_spec.rb @@ -0,0 +1,37 @@ +require 'rack/test' +require 'rack/builder' + +describe 'SinatraExample' do + include Rack::Test::Methods + + def app + # Load the actual app + ru_path = File.join(File.dirname(__FILE__), '../sinatra_routing/sinatra_routing.ru') + actual_app = Rack::Builder.parse_file(ru_path) + + # Create a wrapper that sets REQUEST_PATH from PATH_INFO + lambda do |env| + env['REQUEST_PATH'] = env['PATH_INFO'] + actual_app.call(env) + end + end + + it 'responds to GET /' do + get '/' + expect(last_response.status).to eq(200) + expect(last_response.body).to match(/Hello, from index.html/) + expect(last_response.body).to match(/Say hi to Jordan<\/a>/) + end + + it 'responds to GET /:name' do + get '/jordan' + expect(last_response.status).to eq(200) + expect(last_response.body).to match(/Hello, jordan!/) + end + + it 'returns 404 for unknown routes' do + get '/path/with/multiple/segments' + expect(last_response.status).to eq(404) + expect(last_response.body).to match(/404 Not Found/) + end +end \ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/bin/erb b/vendor/bundle/ruby/3.2.0/bin/erb deleted file mode 100755 index 6c0716b..0000000 --- a/vendor/bundle/ruby/3.2.0/bin/erb +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby3.2 -# -# This file was generated by RubyGems. -# -# The application 'erb' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -Gem.use_gemdeps - -version = ">= 0.a" - -str = ARGV.first -if str - str = str.b[/\A_(.*)_\z/, 1] - if str and Gem::Version.correct?(str) - version = str - ARGV.shift - end -end - -if Gem.respond_to?(:activate_bin_path) -load Gem.activate_bin_path('erb', 'erb', version) -else -gem "erb", version -load Gem.bin_path("erb", "erb", version) -end diff --git a/vendor/bundle/ruby/3.2.0/bin/htmldiff b/vendor/bundle/ruby/3.2.0/bin/htmldiff deleted file mode 100755 index 58aadf2..0000000 --- a/vendor/bundle/ruby/3.2.0/bin/htmldiff +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby3.2 -# -# This file was generated by RubyGems. -# -# The application 'diff-lcs' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -Gem.use_gemdeps - -version = ">= 0.a" - -str = ARGV.first -if str - str = str.b[/\A_(.*)_\z/, 1] - if str and Gem::Version.correct?(str) - version = str - ARGV.shift - end -end - -if Gem.respond_to?(:activate_bin_path) -load Gem.activate_bin_path('diff-lcs', 'htmldiff', version) -else -gem "diff-lcs", version -load Gem.bin_path("diff-lcs", "htmldiff", version) -end diff --git a/vendor/bundle/ruby/3.2.0/bin/ldiff b/vendor/bundle/ruby/3.2.0/bin/ldiff deleted file mode 100755 index 7a54829..0000000 --- a/vendor/bundle/ruby/3.2.0/bin/ldiff +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby3.2 -# -# This file was generated by RubyGems. -# -# The application 'diff-lcs' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -Gem.use_gemdeps - -version = ">= 0.a" - -str = ARGV.first -if str - str = str.b[/\A_(.*)_\z/, 1] - if str and Gem::Version.correct?(str) - version = str - ARGV.shift - end -end - -if Gem.respond_to?(:activate_bin_path) -load Gem.activate_bin_path('diff-lcs', 'ldiff', version) -else -gem "diff-lcs", version -load Gem.bin_path("diff-lcs", "ldiff", version) -end diff --git a/vendor/bundle/ruby/3.2.0/bin/puma b/vendor/bundle/ruby/3.2.0/bin/puma deleted file mode 100755 index 0e02bd6..0000000 --- a/vendor/bundle/ruby/3.2.0/bin/puma +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby3.2 -# -# This file was generated by RubyGems. -# -# The application 'puma' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -Gem.use_gemdeps - -version = ">= 0.a" - -str = ARGV.first -if str - str = str.b[/\A_(.*)_\z/, 1] - if str and Gem::Version.correct?(str) - version = str - ARGV.shift - end -end - -if Gem.respond_to?(:activate_bin_path) -load Gem.activate_bin_path('puma', 'puma', version) -else -gem "puma", version -load Gem.bin_path("puma", "puma", version) -end diff --git a/vendor/bundle/ruby/3.2.0/bin/pumactl b/vendor/bundle/ruby/3.2.0/bin/pumactl deleted file mode 100755 index 04456dd..0000000 --- a/vendor/bundle/ruby/3.2.0/bin/pumactl +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby3.2 -# -# This file was generated by RubyGems. -# -# The application 'puma' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -Gem.use_gemdeps - -version = ">= 0.a" - -str = ARGV.first -if str - str = str.b[/\A_(.*)_\z/, 1] - if str and Gem::Version.correct?(str) - version = str - ARGV.shift - end -end - -if Gem.respond_to?(:activate_bin_path) -load Gem.activate_bin_path('puma', 'pumactl', version) -else -gem "puma", version -load Gem.bin_path("puma", "pumactl", version) -end diff --git a/vendor/bundle/ruby/3.2.0/bin/rackup b/vendor/bundle/ruby/3.2.0/bin/rackup deleted file mode 100755 index 387be6e..0000000 --- a/vendor/bundle/ruby/3.2.0/bin/rackup +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby3.2 -# -# This file was generated by RubyGems. -# -# The application 'rackup' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -Gem.use_gemdeps - -version = ">= 0.a" - -str = ARGV.first -if str - str = str.b[/\A_(.*)_\z/, 1] - if str and Gem::Version.correct?(str) - version = str - ARGV.shift - end -end - -if Gem.respond_to?(:activate_bin_path) -load Gem.activate_bin_path('rackup', 'rackup', version) -else -gem "rackup", version -load Gem.bin_path("rackup", "rackup", version) -end diff --git a/vendor/bundle/ruby/3.2.0/bin/rdoc b/vendor/bundle/ruby/3.2.0/bin/rdoc deleted file mode 100755 index ea3f386..0000000 --- a/vendor/bundle/ruby/3.2.0/bin/rdoc +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby3.2 -# -# This file was generated by RubyGems. -# -# The application 'rdoc' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -Gem.use_gemdeps - -version = ">= 0.a" - -str = ARGV.first -if str - str = str.b[/\A_(.*)_\z/, 1] - if str and Gem::Version.correct?(str) - version = str - ARGV.shift - end -end - -if Gem.respond_to?(:activate_bin_path) -load Gem.activate_bin_path('rdoc', 'rdoc', version) -else -gem "rdoc", version -load Gem.bin_path("rdoc", "rdoc", version) -end diff --git a/vendor/bundle/ruby/3.2.0/bin/ri b/vendor/bundle/ruby/3.2.0/bin/ri deleted file mode 100755 index 8ccc297..0000000 --- a/vendor/bundle/ruby/3.2.0/bin/ri +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby3.2 -# -# This file was generated by RubyGems. -# -# The application 'rdoc' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -Gem.use_gemdeps - -version = ">= 0.a" - -str = ARGV.first -if str - str = str.b[/\A_(.*)_\z/, 1] - if str and Gem::Version.correct?(str) - version = str - ARGV.shift - end -end - -if Gem.respond_to?(:activate_bin_path) -load Gem.activate_bin_path('rdoc', 'ri', version) -else -gem "rdoc", version -load Gem.bin_path("rdoc", "ri", version) -end diff --git a/vendor/bundle/ruby/3.2.0/bin/rspec b/vendor/bundle/ruby/3.2.0/bin/rspec deleted file mode 100755 index b8bf169..0000000 --- a/vendor/bundle/ruby/3.2.0/bin/rspec +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby3.2 -# -# This file was generated by RubyGems. -# -# The application 'rspec-core' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -Gem.use_gemdeps - -version = ">= 0.a" - -str = ARGV.first -if str - str = str.b[/\A_(.*)_\z/, 1] - if str and Gem::Version.correct?(str) - version = str - ARGV.shift - end -end - -if Gem.respond_to?(:activate_bin_path) -load Gem.activate_bin_path('rspec-core', 'rspec', version) -else -gem "rspec-core", version -load Gem.bin_path("rspec-core", "rspec", version) -end diff --git a/vendor/bundle/ruby/3.2.0/cache/date-3.4.1.gem b/vendor/bundle/ruby/3.2.0/cache/date-3.4.1.gem deleted file mode 100644 index fe7bd0ad608a57f49b138081290d00040647c9e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76800 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

Q(OtGnKqe=WiyFbr;u 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 diff --git a/vendor/bundle/ruby/3.2.0/cache/nio4r-2.7.4.gem b/vendor/bundle/ruby/3.2.0/cache/nio4r-2.7.4.gem deleted file mode 100644 index 22b7976ab1b2ac8da7d0275a2c093af1073c08ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116736 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
77d04!}5WjbY@ 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

Oo4UhENEu{_V_`} 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

Z_8nB}np&N!}WBu6*cr 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⪙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ĦF)1^tGpRCZGN~|WFsU(V{ZV$O?MgMI z)1uR&)uLaa@kueHU7=f{U7`0$#ZSRc%}&Wq)l1P!-ALI;nAU!ZXKs^Y&t+>s&ZNCkuIVo7 zuIeu9{`0QuCH4|~t9PJqz<6MPKzQ);z+=K^;wn{$CP4kOgh2DNrn}C!z_-G;#JA>M z;zj(W+C}_D{YCyI`?ljY^tSXi^|s~K!lZEgDB;7DcRLa?QN0DhHH8)kuZRVu>vqM`jj- zLMxS2ay6^<6kha5)%fBn#|vIpnXp;~?ZOWZMTLfuQhWW4KG(fYQiZ*wSa3aP6Flxe z1bF9$o#uCe?vry9svf_hTb;LnorOVv-`BU+wdrQfZ}pjGF>m#0XJcJ?uG!qSVH7`}}_*bp)I&1QkwarImgF z`a+VHWGOj4Xw4k;SNe1$bk{1ZH4632YxVx>wuQ}E>kZm&P}na1hiXy__RYa=z8wiVWC~`_vsVdWC947H} zMw32cvu390R~Yc;+^gJDFV@N~5bBJZ7#24xPB0oHaxrAemM#*__#2b*Tolr+Xce>~ ztOIS5Iz+4@R~N@R3p#H_Cu;R4YP;nZ373!UQ?o8vQVtAYDbKW+RMNFpN0v6#kgclEJYn*#h=?o2IM(J67C@mbT%d}FWE(kaNVX9_# z*V=45$)RdVQ_)eNYt&}p8k^K4{2XVb)sU9OthIyEO3tjxno9X;Qif8*mW&_#oVjzG z8vKpz7-xf`?{lz5J*#ocfLWvg*V-bQ$wN1%Iqp;MrAw(+t6Fd0sMxEiunipftOd^! z)S&Y#R*k&WYjrW&1C*s^bNqskKhJ3(t41hFmT#7+{9QJU`D}71c`t#IN1>02VbRe{ zXy5E+mEfuGGo->0`BfX+RC9{oh9^ZM8Ojx$gnW**pJV z*)d;RC7ZQhKpMYQX!K2H*xp}!L=MqYvzDMUKallnkQ+RoUr@2_WZ2A-wJA-?+Ni}< zZh|)BgkD18E?B0uFp6Qwrg&3G`k;!emm#xDJLi^r%%*&sZhUp9RJH%N+Rx$+J({Hy zZ^5$Z+o^GGHu&8aK(OU*1*CSKN*H`~maADK29!Rvb)V0@8{E&cE zR56*2wqTUL-(JkCK+)Sajv{6CO zi#BnJjx?^dMbKW!*rqi%bMUYKvwFC(>+t&`BEha9y*=eZ{v?BI8PiZ?vZrw{v+0{g zwJdCAqfKjV3G}#}?Q3lHtKD*EbXQISOn>Sn4SvJDw&DHl@m%g4`Lg@jVDd{}W{Q&F z>sq*#LZVFF3C8wk>1wB}UQIPj4ZV0WO#RSS7Q{A8B#sqdXC{2w*QS-h7XLQ?o6W|vQ2u*wCiw}O~W2Cj0G&T(r71j@xmHn;`w~3aCBQ6)7 z2M=f;6ZXZV+vZzKTNOn`N202yG$vK8UN38sh=j(UOqr`J{Dub}tHjw|YA#e4tV z3rrJ5bWr=x-o$7w)80ywpWvnEf3Af)1UcAT%VqgY+tS$!{r0`CFYl;rAg0DJr^Pr@ zXKkKtVas)imQ*>rKy5h`HJi=>`I*uXGkU);()cK}*0{W>)7F_lY>$bDOR=Z>HfetE zq@$gIP*o12VcIozY_xRaB%q8kiUipONs8?O(aCyGqhnTrFg-Zn`);;$j59$S=7KD_ zSY%WNq&YH*vsH!=;QGNLKjNG`OcP_8y!!(h@|WFQ-!E5|>X8Y3*!xNH0rDb^ddVNk z;&}c2mKcpYG1Uixl}6@vW9?j)t%J~vtf?a*FVKy&b8PL}#D^x}nbD;m?_vjRkO97x zH&dl-K`!k}Mu)29fYPvm(#Fiz*1`eP3hREWb}${FcwuyGSafP}bZkF1ek9Wp_D8W8 zZ}2#n4;L2*nLAWO32Yh~UT#oT-MLTDa~mVdR~i_s17iZP6%uW}RoG-5OL|J_o7E+` z*eC-L#1oQ$QpyoiW0-De9!cWNCFAp@EOYnO@eJ7%S`xy+ZNN%zsAE72k8VhrJBI|# zbo#qJKj98T_2@Z2NEE+&aYOU(AJN-J3&EZfzi@M#J0H+TjHZIrjf#Y+wOT4xhokp?NUr0%TaU#xUXmzQLb#nR)0nRJ#x54BO=6e-(n& z5F-PIzSqnOk&xPbAZOS{A7C|xfe-NY{-DdufY<+9NQ_)RRK|#QHV6*RN`w+I-C*#m zW|rWrVc_N(MA+`{Zv2Dxo|7$sL+oP1$c>#-J7TZD9rw`pT<96WG$Q88YS4+XVI0tf z6;Lxv6dvuwOP2GeVwgC+8m63i;DB!6B+{uP%Bhn~{|{M?Au5yB|IqS(lq0Xh+I=`@ z*rp#QHHI+{(GC8r%gq0qFdq8Wgr5X^53~md`FPk}DoW~L|?fmL#MB6%WQ=|Lt{JQ*O z6E9qE&$Y&xe-k;<-pO|(?KSi+sI~`3&xh4u2=%{<<=fj65r2kBWKe)H4}e=?-8-fs z7GxStbBeT%hF=prCJd#bQZ?ufP=~-vFCayS3;P{$oxvh;h(mDuV_8au2;*S(^#+{G zq^O?$`_W`HQr^f&w4~UC)A9*10S<*Fc^LE_gifen!JHH-63*Tv0b7zvI7R;7F#V_k z1cDeQDx~75$Uz$u{TebVv||w@%~c$Rbve8fuoSH2 zxwD@BFG26o)RE7({MX@~>5Q-cM5a=9&WrDCCh|QOcSj4Z*b${H<_zWIC*=--!+-nu2TnyKyv!8p+}? z?WPYEEG78$R6f>tIL|Dot7G&anFpJoJ?*QfgVf=m&rib%4Ky0in?gxU>y$?fvJfzF zvx4jCoWL#qhO%>^b`9!o>33yRz`PfzR=^#F71oTIt1NaD_N&;fkku#Ml6@2>G7EAX zy-L(a2Z(}h=#bG4sm7E-$k{Efis16%>WSG|L7tb0({Loxe8({lq{(Dfd)pW3SMm2% ze*>US>(art>Ypco$=LO;l0qgOYU>))0*gxu@SrM%AuYD%C*+5R9WW~zoyP|Fj=@Jo8 zB{%tzPp~vzsHmVivnD=kkA<7|MYKDe|8~pRYo2n}$=Yi)3!fH!H`0vArzW8_QM(oK zh=_N44y|tP^ey^uHe6fq*cD7CTp=H)vZAv-Q7eVJtuWFdnW+jP3?PksbKpSw?bPSw zYZpB`cv9#r7$P;UgNp~apP#DIu#!_;l}l=57o%`Sk{6#aW}SZ)e64PAE*8u}x=oiD z@8~UL6@>HeXIm0{KR%Yu%oh^kWx!cu&8!pZd}yeJwo5v5Xi*WH8EW6RV`XPYd9ccS|(LBGVSk-tD8+NshndHT97<86X91NYn0_=A)mInzE=C1P26FVf? zIkn9m^@#s2mp|G$we=qLFkZ<>??f$=PKj*wn~%C0L4Wh~iN)${O>92TBm38-Wiaz< z$uuNq#D@Oe)6NXqdZb zn60!b-3+7ylW1h!1m7DJvTg*@fkkuFJf`UDd+m_&J~I9f%$<`u7^MIS&sTc1y$MPO zwT|m0&5-gCGHba94$~_0E-nXc0$U$~RjRTA1^Ip@R!E^Cj27qUjT}k`9q)lrF8cwy z^$^&NeYw@7IxgejZ^|E-+6c+~!l1H2{}0(0E4?NQTI2gI zh+1r{5KH3FRruHl7)_I0>QSD52Z(Lg8}O?Y4=j&ruS*5?>I^WYlSY=uf$_Ux04vKt zJbb|H93a~_(14YtARh7UYDqvv8I$0LY@-hm{^&K^|Jjv- z%@dHlK3560j7R$~m*VEXd48W1;94<6ybQ(v>RWsZLmr~*{rOFjfT+ph|HY#&$Bzo5 zp?+KSR|)Mtm@{nS4^K_T{yP`gymYyt|BsQ6x4c5*w@nA?bc_GL%zpZ}^**Py#>JAU z_lNyHDFBThDh50J5Z)y|?arT`Et;R6;L9X7PcA5G6{zJPD<7|{1FB0P{ z-Q+{H#xUwZuHpZo`Y+)&#u@kUt3rdnTFw7Ii*Uw0_&Qzh&t9|rf3Ty!AR}>?9m5{7 zjXx~3`~I6X{W#R_<5_l$d&vF|D@4>LcisLoc=Q5|-yuEY|I~W^jIs}ZbboxD!qG5e zG!9KcXW_y57~~&8(o>^QsK;nrz_sIzBHH`raNw zSHwGy+W3M+8GgVqCM!Tr@60$UW3K$3+vMf8AmEQTgF7f!)2A5I}z zj4UHBPMnkxB1rLGl}}+ZA5L~yh%Cb(MVz!6C`h65y)?l4N$;Y(CWsThCJg-yUYq~I zpO;UdNOoqDNt%iWwo_og&?LY`$d;fL(M8@WohHB1EJbjLI)Ks&UmEYTh}$mU&4;>* zeC~}oN92`I-zFxq?Z;6SqwbCU7&2qSWsRN^Eetgyb-AMQAkU*_CecjPph2Fh`=YsJ z^CEoNBvBC@*V|_t@@^!$VR}Kk;e0{5A%B6r!4H+q*j42hmxzk5kZ+MXmv$3B7q=#L zFYhEjRqc%EsW6CuN&zhjNg_ikf2c6m6gz!XOz?zWfYkzU_)V6KCY^y zU&0)+slvPA4gHhVDYGSRSAd5?tQL=&ud0NauQm&t^umZ&gm#Ceq6n=BJv2k0UiV|2 zz<$VqK)ox&Fq8Cg2SFIaNjY{mg6CK^b32;!^_Q~!4u*3S4AT?)6T65@-`qMx_;TR| z3Za$76-!h>f4X>YMYk0?Ua6?wVrzsv0@{ijSpC0DIVf8o7!kyRD4l1-y#7UY=IlrP!m_-LT~$-Lx4{~SCM9sj8n}ffh#O{c|)-q z?8&N%X{I0Xs`eCFe6;IjcPuZ1uzOH&bLJ6!_w#Q_<$Hq zVE`_~PC;9MRu8U>UjfZwGGbPOVg*G2*9;j4!3#bLE-+}Oq9#pj#K3}>0lo>z0KE*B zAFcqKEvh0cQGllmUV*p-i3jo~1wHzvCR%`D1^Rs`)H=8nST68s8>4Ax%H#>FRA$4~)oj%V&ZCqD>B~v7|OS zIV|@8dMGQOCIt%Z5ZPvuNkb0Qk(xL^obk`e$k-n>FccE!BuKle0sz@{=t&68Tg}EK z;)kM>h zkH+N85Kr~4665EOC|~mI$cky;9tv$zph^`^l2neh6WK`0RX%7*Wj*jpxMJB%7Yo9Q z)QQwukL9VTPJgOoDWouRCb^W26ca6m!-)zMlj$gqS9+$XqH!XdFqymx?R&>;W*(nE zsUxK-VJh>@WxiDmE;*-wbGoKMxn)(A{3+1Jb24Bw;gK!Rvk@2AwcUS>Sa=`VQQe*! zO)C!h{JVyn0`60rO*%_nxksSD7F9erZ#wWJtOB8|P&IReRnoypS6ivoQ zl3ISS*tx5)y-b{U-2!HkdD;lofh2Z)!Dg74p&nP>8Y!M+5Q-3JnHpgJeSNqz8T{ zq9tTRHivf%Ti6OP2K-CtC2HRa{0Brwdg(wG1P@d#K(EKHCmdP|qR#@oi4W=nT?_d^ zuvx7mD(~YIE<8o;w5&DuVgf@5d-+eDF@r1gD3}?kT3zIA_}HB=54KH@h#LYsml?WAoahZgjwkW zSTj{Gd!ea}{PWpW-KZ0CX&1D5zBwX0Cr}n5-)=w;$mU=mb6}eAsxh{XX_#N2BuW5L zyI-JM-~+IacoPfIA$$x!hAvF24DX3L7Q-Pu%rPuVQ;6c3pEuff5kNIBu3AD?DQT0i zE{=Xj>Lvp|^jVRY(SM^{!1ziWc{=Q=e&jbs!j_Ygd?Sy*7MUZ(M8-ZQ@9U2QH%kql zp*}b7=>i=^h1=I@OeBl}aq``Aj2 z_#Mg^DW<3dntb%>_IpZYzc4t^Ds0HWDITH|tOpQ)+RhksC~OKeD!@2~!T|9BWem(q z7-+KKSR@$@RAPH(0Li~Yh%^N;;5-0Z;D)H^qePn@ z+4C`RDV*$GeA`f8djPWnAt$i?a+pnqjU8L#O(bF31Q2g-;y_=v%OI2{J}YOiCz|Uk z1PAB>s*?PP1g-vR8&mS7c~3b)9dN>B)q*s6G(IE$8hCai?6B_X?xJl0DdZYCa&2pl zbZQ~xYUAap=Nj`dx!q|;Q%3?|AD?lwWV+bRXeLhlvCK1x;URiR+(07pU82~k^n0XK zej(#y$U6)J*d^#IXn$Tp_u)25TZ{F{WYCOJ^zwDcwv>BCE4tZ_w1C-hDF{ej0yF!Kll2r3bm*uUy>1Mq_G%S8j-gr!I}bxtW* zaDJd3kHjpV>>fQF*;bIrb8fFFevXzML)vsmoD~`~{_S_J4z zG&jR4$HHgTUMBf;qNc?8_jd%wPW&c4h})fhI!I7k?9O{>yuVi790FN563~k~A>>NG z%SGB-|5%{ZXBEO%ql&m6?V?j!FCdib>O6s~n(iXb(9X|JQgMXl? zpZ&Xi?(zV(6`J-@o6-2z8;{u)joB2gafYN>(Pu2%bb#a*?pGeBl9mGgPbO+j;uO2v zHU;_A5UfI(BRF4nSUGY@pDtBbo>9c~34RH)Dyvg*s|2rN)QaMh;899-*A?h`Xtnnd zm*E%Zzj+X`wiB_n6|vSbmapR>>NXol+D>bck3tcDC;I;A&} zt;0zeEBk~`w`im8pfr!krggOHq9Ki31v_OxSwV%f09K+Vi%gYrQrL_+AJi)5CXIez zboix={>l9iSP3~f|6zG0@M}BytJ3H5U1|HF^+`W!vgD%Y(e#R?ms;#P%8hse^X(p# zxXgoX;7L}VoqlO66DwjO9Ckj;jho!H$7CR-o+PY5}!v-30`7|821Y%C21P4CaN^ROTLlJC)N<+SXD|Y@vcG_8+-%)U44&J&Rx*QY^}#p`1a% zjyxM8+(o^KdKOQjATGc2J8%Q3dJ%)+Q-2#pHK^BeN3b#e6*+8$l>+^EP2x;29ms^* zV)b~J;Te0#k5L&?_w*LU*tGquJdo!kTAVH;4sxz72*0-EYJ!_6QA6E|)}^w+Og@8_ z9*JKOD?s`W#ZVflGDhvScbO06@2v5VlL-QAPzC}Y;wWmQI9&ro%M7QuU{?ACDN=FA z3ePTFMzy*kD z^xLrp5b}ifOtd zE|@^jV&G))??Lbs50EENWbk-!C2;y6t-zM~c`)m&cA%B%lZo)`+qmY8Av6&Uf~mO(Yg%;3{ZIJ&-U^7jP-;N76M@c2h3hhMWGm z5s#7Ki0`Ue4-yqLA}m%wqzqjFdmdL&Spazsq7Hf+IK^poD+s;~mW{%9_Yd3tksy)F2QX7^Z@w@vVY(j5>@&{H7Z$L6YI6xeNX@RGMF9y+PURhqJfh`8o z0(1b@02(72<+zGzcxWh4zreij&S?phE}*~bjyZy9{;p=mK$8O2ITRYBk#&CZ0>OGd zW%yOl3b1|9zbIX|7(r7{ik%AzfT!=49tHRaTYSidJ3uUh+kQ7hDqsec?jB*{IOCdqC6_`dR*Ce<*J4D4J%)S}FXTyH2HS*laVr%K?Yxmjh)HnmOMnY|T8B29W5XWH8G*WF zwXJ`(t!A~{zf(ACH?OwNk+x2pjm1nn*k(v1$SlxMz^5>Hf#8yXy)3jGB7;W#eq)l| zz%65%QiEA9 zFFNeTtbj0~UiF~&orDtqAG_~PLmxX4pF0sxgNXykQc*$#HvvCXUw5Qm!pT#KTTZ|W`9!wGZHnL^1D`(an=J^?MJ4?!tOy0! z#GAM`E@K7~*{3A=IJy8M2bwmb+?U~WxXxq7-vRR%X*pMkh-9{5+mV#HA*mD07^6H` zZL|!~5q`j}>C!?1HU8Jk)Wxkslz7tF;a~ zgBNLn){LIR2bEa%6QwIK9?hu-5P7&XOYlIg@wGXBpCuYwRRRlY7}jH zB=a7?SvQQVLylAq)0;U(38!ni+!9vZ+IgQz50wt`o}pogd8pUN5&izjz5))+7<(*HH{5UMzxW1-UZ)h_ zbZUgG$%27mB%ky~NU}6Hg>0z4v$& zvRst|A9sp0M_WizJ|BB%^vgnJVSn1-9K3#P(J(qn2DKGwf6inp6YR)@qaRH5z63|t zP-w-h3l7G8&);Z8xW?cg!X9DMIzUaEQp%cRTVX`PE!6;8>ekEREF0-Ka%Sb?O4bzk z;wwYdxUex)p-k=g_p*T|BEje90_~9!g1i~l+Qb288Bt;rR;{hQD}kOuKJvE;F%PMg z1L63h(K)7jZEpgBpwG}eX`lIIYupPt_C9TrO5+H)sbuzrP_MEn{z!2_4%yWBh2T8I zE#i?fnqAAFDQ*gHlCw(a*{_%kYCD=jy6;arS@+Z}&M7JVMX=IdLWh(GqBA5BemnBW zQ=mm8hfq65RR{}A@a&Q{ddEk`A7{LzX>fAF#@0KkV*mIFa~S3Gx$_s+`i9uRcs5}8 zL#mY{=Jz@AT^y!pq!&8eT{gO_mQp{vGoynN{~g5%jKyW7jjZL;3)}3(U#FOVEcBEr z(o*m5zI0XW7^n1ZFtE4B(Ifin*VRabw^Uxq$C83%#H@^gK$kRUF4ij>;~C4lAm8b6 zxuw?co-%dS$5VD=sGKFwIA`4ZOTlG~=@}bYmq00wdOp+^z)8}a_;DfU8rs2qmyH)p z5b{ccrn4IaL41f@F~V|n_IhLg^ZDmbp}zDpvZ{FIaV>edu(m7t{Vd^F1+W=#CR0so zWm@^8snCVBp|ydTS02m4gZ5xP0+Y~U)l6s)8Dg8Bo%ohdLsdZn_hHaW?ke~Su4db& z$7|+Sc*I9soCE9~K9)J5O(9vT_y|0jC*){^)bS7K*YTn<2nZ=?LJ_Wtl67n{-Pqa{&{XgK8>1^uNuv^z-7NiZpO2hK-o~r zUa*dzbH?t-?eet~59C+GI#AMnk$8SSi!-Wk=$ zl(dDc@Lb%twVQnhI!itL{CtCZHG{(>$=t2uJ4ED9F}T)#h2A5I_VFo)+})?f8{MJ* zD$_??;+T$CSxQ!A42x+G_Uq!q5LEeI(+=T>RTdEoNAyVZ3r z^m{9ItlL8#7p#taj_T7W}P!|14?q6^L?gRCJfvwzU<{5LZmL3XLmdzuIqwlTR3un+&

ask%Idx(UrS< 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

-ul;IfQ&v&1t}Nf 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≷A$bI<*Q-m^#Hz_59$lTHF=24Cpe|e- zoe?N$Qw;R%f+1B^o-1k%+KU}0s>_pPJXDDX;ew8nQ;1|&Mp8vk$W|D%2F4UBskkBnie}BobZobH&_z!CE=Zq@)J|vO1Va216RNXlk(Sd)C!z@ zZ~gz%$=@$b-WzO0qVFhOlk+KNkj?t${df9CZTfjzqV5P1GqwHnIJT_8nzIYZe9|E% z%%-R{!Yqm=e8_1mJmnAT?X}%T@2DO%Z-DwW=8`|=UKUXcXlAFgWIGF%y&*aQjqG%m zYb4n(FKXknXV07l`pq)Zutkl7lGf_I%VuNl;h~5YMvR`b_w3yVX&WndSWH%nTUgVa z&c~xGb7XePSg5i+;Z93EiW<9gaL(rwg&DBsWiG2UhdnaAtwA$e86y#??=V4n6CE^-(GRq3;9l36q%b=Dv6@`Q2sDtUsBuzx% zn6}lXSr%P@0euxSfB1Uq>j(Vr&jtVCd-6Ix$u2I`MQ(u657OUI)Cdq@0QhvG=o@LS$vTvc zHVJhrih2?Qp`*hv5Duv+iygTWb%>4W@K-BQ@#dP}XYZEd_~b)AjPrAHTte)e0lAmZVbUIQZ)w`!iu`W+b z_d#F@3XbV|iU$O?u1Vldmd2_uYJc9)wY=vZe_dBmt;Q^#M<00vOAE@Sqs@hUq$!FP>gPB(QoDp*gdBlop-D&>}2L z`!G$Cd^Vg)Kr|ZRsE$s&>W)qF@`e}4KU<{MEN6CPZT5LmhYMwjqX3kCF z7%WC6SHH$$Kz*rpWisjLlB3ey(blx6c5$_?3#uU`jQ-i8LT^^Y`>iU&!?GR3QlyU- z2pP_-R8Y4{bC!~!IEOmPkzz|1t|xaF7Aj=X$#dtorDR z>$Ot{XKdron;T!@4>TE~lwveYHCFZf*BPw-Wv=-O(XV(2?<5a{GhUihwiLhQ)~H!N1o{&l-5v z3=wE(G}D;bsKLapS|-b=4eRaI52N1nXsy26sowN9c6)1$U3$}~_jSOi)C)L%jEW_;8?Y6-WrE=b}MJF)uiV$*0 zTC;_YlaqL+DA+5tX$C<0E@Kn~p`Ea5qJ;EjN#5iPv13RrpH6L4Oj?-OsmItIx_8$+ z^FHdq_3Bm|h|2iZZvIyWErORT!z^{xxAs8ob4TMGDywLHS?KcWR!cQe{r@Xxn-bQ=I?Ku?oHY!h#f#>JNzluTftNf;QP(1|DkFp!CLcw~s=G_@&f6CbTpwLrmV5+mBbWM^aa;{r+?vt^h{ zb&(CgDwWD2@?nZmD=!)4vq{1y9v)UWq!@mKk4BpT$oaZ5fme#YH)WFDwn1?KK*mf5 z;g9KZOz*xmc-a6lIIj#8I&=IK6Ae>*SJx5h~`_AmKt~G9Y->zt7 zoqg$G1xHQM7Qhi!fAU(uOSYmFBBrMjgb(kr5%z+?1F=km(MXk>(I8YP@G>t z%Bh8vV&rUR0R01w5fe?!R`~@6=}NT^+V%^ZpU3%!U+k=UxD18+MI%lA(uR`z+@oJ? zD?u2}Ico<^*Z+Xc1s7PfL4;w&O6Fx!*T&&sf(k@hHIEc)t{9k&bbi~X>Y4zDgnH_m zN3c^|s!I#V-%5CUPWuzwB7G~Q!{SXU_RM!4>p&y0tbTY*KaPB{nf?7VE*oRp=2VBr zMwo&ykK>*!L@S{*Gis2I!7-gh${$X$XqMVDI5W{*lzA z$|G*wBdp6-2_sf~Nk*Qn-Cn--W$&`dATxM7^OJ^FFV@(189k7X)N0`our6{e)bEmr zFu;6c|5Zz<4isYTI^LpGg6-Y~WVDnC6X}yH>ed@3uulVM>;dt8GB8+Dw(8HZIT5u| zcbW367FtE<0dwxG{sFl3UBA?IX&yxL<2JLt#L^w_vv6 znrT$Wec{6TrFYI(;tl`?qZ&R4*%wP(Pmn}832tlET1&zJU@R;43pZCi3l&+UrRu{Xq_mEMLjhic*LQO;gy(FqrZh}{4S~C z-n@K6@KFRF1?ex(GiJ0+lSg7=kS8XeNQU4<-Js!8O~fgzHo+Cf8_|oIS_{XvP7v&h zjef?k`E^mtP;6&e04$514TqwWIfd)7b3s7W%!&nfVUk;W2M^%Ni)=PTAtDq*Z3HnP zgPYf?*O2YDM%v8kwXYM>2CaOEFm|xsVKRC`g7&!^Z2;!x>x?wcbh2eGesc4pL;JB7#gb0K>aL$OK+&|e&FI%~7E)Vf z1$TcdOqy+P2#F0^1*&jVR+Mz|UXvnH=s)sVsWBgU`|{0;{;MBfyng?3KSB*5Fa5$Q z#`Vu`bD6rb#FG=yE*^fXzO_{y@VV|U$HtL_UwU3pL+VnDTvin$GFf{^VHF@Y1|4=Q zG7X7fLZ^}fp6fba1J06@Sz-eU@TM?j1LU8|g{vQ+?{`=1Q_j+k{@*l)^zHv9@#TGo ze_s^;Y3u8+p7`HX-~P-l62t<$OZF0Z#* zPi`9`7;_>^qvlhzE9!DGC$#jvgfX<&MGhlBWyBzjs_RBG#B`>A&OpgG&jFlcnN2wY zjszjIM;gvjz%*NQx)ta@8aVXvYKc7G@gGnB72$X3|F(Mjidrs^c8al-YIJZshqo^aV%X0B9@N9&qZg?p7kSOZ_#*{(S z3c5kK#ND#xGXZ6ozR`>4V$q;Khpa2@stIFERUZ#c>?d?lHBl5KP@xQjoF5HCHCS;P zW%Tsrm;9P>DzY{sRamr^ktRGETdD5Mo4wBF?_c~*z3qN6<_@c;XO-v+4zLxm5p+Kt zv}9b+W@IqC7$3Q9fD3}(0Ix#qbyqNwusZca%EQa>gD=xP^8a8_a?cllMe$#sd|lxG zpKfnI(Erbd|3A+r>A!%d9!9V}L_B$!q-WCfcr*s8A=&0IJsVMw(M8!XDdjrO23K@TT9^xxt~k6PVVseF zT9L)0#t-f2HF(HG>S^C2oj% zabxL4k*a%P8c~Hn?Y9#mGhOkp*ne#!OfIkXLUJsp4V-OR@F)jVysS)T48BoAykHD) zVxiaY;C9z4s91zsj4lPba^qRSh6ZkKl&nHW%>nwru79TIf7Xvjd3vuLz=HGt$>!Ia ze*E{xn~xvP|Ig(7e}jVk+==atH-O*L;|ch|?EQG~3Xa`u@~DI}$oABligpUG-?Bwq zP)NhMBw)KJ9Y8R26`3gS!B!Mbb8fd~s-Mrs#C!0$3c{E+1l^jr?+(H5C_1e4lEbaP zJl?*jv?6%Es2m~xF&ucww{`L-h2*o5I;XUil*#j0=b;>tmFK^}e&KAA1aOCch{x#d zPZ8bG%nnCE#96sL5bE4Mqaz8d<<*a<^Ua&rFR6K3rk!q*ckiS%Uza7>|3Q*Gagw-g zeWQK+HL@lI-Z5?}Je{P)S5w7~D8s9^%bWCdd_6$AuIpbks}jx!Eytc~FfRmnB0P>YO9E;KXAOSI|mHBVd7b?C3W5+H<7zGOa8G?h39iwHj(| zZ^VpsQ`vOPA5&RJ&8}W)W}ER`H={ZQ0eW6y{9|%>2~}2E&p@r~{^H)!ep5o8I0cyz z^^)GhU>F&@h(M4L;`+$Kny|Id8J}K&)$k=^ja+7v51<_YpWvt3 z);LxCA~b*zJE{=NwG6N7UG`1B_zEI`k8%b1CigBL=sg|k_?<5u>8O7kIk7n56^5gh zR~~5xh>18l9mZ$6QRDRFgBn~_%kfoIjYo?80Y`B)!~@1U0qq5&>T?j@>Pa?I-1wB| ze5p%9t$7TxqxIuji21KI`}nnA3*8=S@U4b+yq5_r2G!B&)Um7wPd+f(3SbER5Pwhy z5nq-_9S-*{|6U+rp7<{fxLPHBKDO1w39sxN-zyGluJ2_0&_*2jqr=T3Yt}3`S;=TI zTawc<58zzZR4=M;>uAO2?u&>7lLR8`kh6r`lVO2E%;VVw+P`V8v3WNJm`n!>tky~~ z6xV#ti#VOTbFuT8*C5X-Rr$OszxS9`!_5^}!(4_DqZm<53t2{ejnI)V`JS)~w}Pm% z3=8}zY-f<`w7APVGM5y31T;Yqj%ia}QHF-KjAGk|T2UFYa4+mL z`o8XeH#>?8=vxVpmii?W5||=HOkJy$*i^b*6JR8RTPNQ=D>@m1lFw>HCT9sR9UFHcMXj&5KSB?Y8;%e062Eap99xc zM!}+^ST;BOx&enVc)0By^FyV8%}fXkJU4eNy+5y9eSyTBh*0xzoeA>)=hKVfpD6#| z{%ULUaY6pS_0*MUHoffmz#`4WHFo(Nh1_ zb~YgO5g`vr9C0dUFeJ>UZUuJgI*K%rC&I^yU56@W;1mPFIJlT>sHo@FFzHqx+d4k4 zLkBw%L|mAx$HVb?jK!&9GOHMlP+r~|5V{r{}S&5X9tisoOS3$R`ES~n0_`V<<=*@NL$uFLXOx1TpPq&;KVtieV=CoG7HDKSND3K z%@*2;?pHcCE77qkT)urT4sL>8weR1)?!Wkc@9o};cl&P-`fvBY+yBQ;{eyREb5b~; zc>Q0S>;F%0z1{!sPH&^PTkRe8j-EeS{j%1p_Zn->)?dEp9&NPqY&JPbe8$vkuEG8c zj~R!7`dzIMfN7_7hr>_(YzKN&->C0)AZ6#~d^#QHyPcbhI2}&2&dup`+__07C!L$i z%gbK7QN1qh?QOGnxlxMsrvK}FuSosd*ROv3Ys1VhRNluM4Iq96Iu+p9Ck5O8}+f# zzsC>*xqXsdY%DB(nLNQ7RfoW&j}{BVw{3LlyN`MsjST>CTd@rK&=KYl^qoaNGCN-! z?xYv$ay>cesyk_5V$=;%Wea>%Z`H?VN1^E8OO$Fd^8Hj+9!?#`U287dMIpgVlSBxJ z)EP%Ra56rF<7#IEAHDs}#6Xe6mwk-KL)ig5-w2r1KR4yr)0yHIR#a-Liy zbc!+7sKLqy#1W>}h&R&dFtGirkz&9RaSD8g+d46>7B}f@I3=)njL1iB$bcwHk%ZyQ zJWVF((-n^*T2lbOl4mWJonH{hUKMxf6eCqo==c;zj#VnlZ44ztUXWr_zVi@0HcA~}=F(NcK<~dmlW<C%J`=qz($eX!gKh5p#RbH$xcaMd_iu?R6PCrOi6 z5JlRJp=2|m28)cb**Ok8;nxE1i4z#js{>CCrxu|7p796?UU?a#_<1ZbLSWnaRYlPr zu(lY^l7T`@NMuL>5nmWCr)1*v$!pJ>cPdBLlm&c)G5of@RdGrvm?rwvW7iN(_Y_BT zYT{-nPRXoONO!2_|A-c{8a{Y^J11{NRP56DS;gLt zIwd(VSU2B7umLh!s#mWMe%gDn-#^&@NnNep?Z525-hZbqSp65T_YMwj8@s)~Vl;sI zZnwT$-)bz*&}eLA4Hl$DMwqBJCh&0tW&olayDKcOwoy0CppNH^r4ZuzLn*21^5D=g zP0VpzCKh7V2Xf>=NrH!erO1oUH<=w@?E(oKgX|IEi3-6iESt&XEDZ&?(+D%w_wZfVtPoXcBP9og=C`_}kXz2hs>wc$5)w%5)+^wrd2As5Szygl%oUO-E^dp5)xpvG_lh zH&=|&t;V*;*;rNs*u!)S4ammcEQ&f@R^;N|Vf!2Z78{YWZdo?cp?*0XE3Kl%V+e&c z?lwOQ`Vw#(a67@ux=HC*+1jS;pZ9(}-gJBzpuNmnOqkLHsCsiq{%-W?ftu6$4ryMNgNqt)jGwv3uHzT`n zys~`9-_HvuywY!*Zc-omgXAP*UeqPFK=ID2*I4Ckln%PRiu#2&lV0UnWs#SIlig45 zZ9ic%il$v+EwPZ;@8sinB*Fn`s@2vnf&Kc+&PJ@8p|eF+j%hZA#ItxZ!NfZoSY{i;gq2be$uG*yR%S+*_EU3h*Km_$2VlRq)K(dI?ImAsE9 z*)UNffT$x|6HVjnd)ckjpv|Fj+#zc>5cwMRaZo@jqvs!^S z7%|xn@kV%bUU)vpTO>qU>^+zB|1i)QWGH?*DQlFnH$T zLi>H#usRVMBOa3-!m99=_5!uPVzJhV#qyE+Jo6~C!NW|SyVAcC#Vku()M9U{OFW}U z3GdHQ6(a}Z8u41=A!<4ZH5v}*^x~`&G06RgjumAJjlIgGebN_}Bh*ojV0uErt`>qQzCOSGU{KNxjwv zV}X9Haoex1K5oMTuCCSsNapsXSlx-CWj|N1snNHcjkPb*mMEaZi4WI$KOfb5gJxs( z3pAAOZRr~qt|L%7$JOg}aI4P%9(oLcoCw^vKk*B;>-Ap@}8d)F#3d^{knV)%sHmpWa&m=Cx1Et0d)Xb$kZb*n)Y@ zq0T`U!buDQct)q5Ofq$7R9=mKQ>17>%_9R47y&U}X0)?geb>~6?(lFZ?TB`x&8QP? z9WCQ)>(~S>cC+14q$L}jJp;X#nic*Lbho7&Avpr`{V(ivyOUf{GE4|R=E~Tl#s0jt zAOvro!pX|o4`$qSJnjHrJ%@AGC0mBR`rV4}G}#hErIy$TwX~IwLpX*h4+G^!BdHdf zCs_&aW@uj78BAd}vFL($vYid}(mAHc+#HXf!JtU3K4nRkZok6Rsn6?y>2qd8E-Zi0 z9BeE(2`c5EKThhRkC#%QwP_wvu^`Ec@~hD_{#^spXmOi$(1TPi%N0>t{oDTAZ{8g2 zgUWy(TiPb*1j6~&J6LqX0I4MEMZNOP{&%l_jIPxaR3n^Sc`Vp~~QgT^+( zGKRHGVO6;~XN-VbuJ<~}SzisdJ>;8+kZw?OL?tjY$ zg<2uvHoMaaq*W!L(#y8IM4fcF1V1fg_bQ*8y-@iN`|rMg^U|%oEO#NT3kv1Z~0*HdG#Yn9T?05Ge31+9q3rq$lSp6+|~y8JpSyxhX+dEbH!6T|d+k zFZ6~ZMoCvtI4d!p_|DSQeL>R>*rKYWHxL7dhXS`3mITrJ61ES9x*$eXr&GgX$rh!h zi`5o6{dhPuMbER$)?IAL1`Anh6Sud=@z9yys~H3B6BKiUdCUmhNEGX)zqQpH_SGb2 z#4`%lHsBOAIN}{}Vui`IEWzocF{dxT4#AdgJ3cBjj>XA zTOlIubJJKOzS5?)_htgTA~Eh0v(hCf7F#8846$iCxI!6%_}BjxgDue7I_%_E7e`!} zST&iTS~2VwR3vjaySPe3P3MyS#Z)#lP+S2ytxk?ll9YBtwW+^$SrQzZAw9W0{@ zL_=hJJF<6Nk5~`Xxg(nf*FTofoUVbi58~GQ9PSwNR5);DV|{eGMfzY zFO4jm!jy#y(d+y9VefMNsM%}d-wn{P5}+2c7}!CGlo%yo5S=?A1ikaglC7|rCkY3* zC~R8<=ExI>y9jD=MSIXo{gnLsNCK2hk>3EatV@G47-LQ#MOn9)5W~0B!M<8?_7g<^ z${282o#>+^o8`KwLJ2BcMICk(la>EVVRv5nC9@@mO_5QWtMLG12S)zR& zi7O2*3hPiit-ao=3yRaeyJ~r$jU_06PL$F%2 z2SCFfSaeRn1eWk2_*AoQZEh{iwoR?QMPh8Evy8!PVvF$6QAxy%6Kack(lZyWt}VX< z#QD*a-7C zL5U_(ZE>wMEcTrVwRXM=?{y+3l(x&iK4pY7dp8n27b|j!`I3mDyc}7VYb5WZ4|Tg; zi#e}P=96TYwmd`gRWBecY`$*cV$$Zzt~HuMd98IyYz?nd0@<<;B9%e<1}3`t=!8JG z{fjgQxpUv*kJu<0KmaP$YjZ!l?NIo3Tm~Ef_ZPSw)~4j>flWo%=;#*~qyJL0A&^R} zIcGm$Xy7jV+m7=-s8Z{u@`k!pG%H$($}z%m_zMD!ZkNh}kB{nN06Tt7mQeJuv0}Rg zqCR$xfv2P1bJWYKA-2~6zM$@?^-$fg?3M5>sHVuRWnCa|(bR;}nA=hEE0>2&f!kz2&jvkk-vA}y*kU%<&$rTcob0xoK>>CI)q zUP@C`RqvwGrw!a!KN~q_9qK>c@vyJ~Fv#@4Pgvei$V-`;>Z0i8k|yZy+>X;zHrn;l z*FQ~E04iX0>)M5`6p9vyWACiNq>sAr*KBLoIG=M~rO9w0=McbLpBfhi{ATX~F)Q?< zP}p!|NaF49wvoCTA~ZCBf?D>nQJ+TPFC`@0xLUggP(~N{aeXZIFtDQCSZ{NiP3GAR8fYf4R!-fEL(1jT_(YPRU|j-AXS& zd}b+4fE~wh^yXGN10257b^+c;=TbeqNT(h)&uDgW3@V0GyYxI!^eWF3&pw$`US10L zqm9L)<8*ov=N}4%$jg$RS|faip6XnMp1#OtBZMim3Pwp?c^Ubf=p6PehA@7(g;v{1 zGmC}6$%Znk=onfMPp%lm!d$V;q%_TFH$jnQ93gX3z)4_o6k;92ys5(*daF+H!CXC- zHIIrH+uUr~gVT*3mtqi=>7(3r1_zj~LC0sd=g0QF%>6=g&00Q(wW76Ln_f|rZlNk< zDfO_eB)N;P32A`Fevs>V4kX5^du&6$^;KJf~zQXw2mM$S5aLC=RjVD5KG7z78C&L`cz zr79S7W#tKaRn=Z>J7Y9|0S9q#|Ot01()bXf=To(*B(KTU#STNxDQ2S1c_Cn%-F^KsfOSfGYy)7 zB!teX(T8S>y|N(g1Q<=RIiXrn?B=3PFt9YNba_pNjcZpw{JC?q2ChjRfUIfkIxbL* ztzUtfw1vD?Qk@|fkD3k49?HyOf7^G0Jd}Ean|nU>IuZ2aZ<* ztP{(35WNo+=IpFR!-OUaZCjVQT%=5TRn@>;YHToSdQSsLX`#(6PRVr~vAY)S$CK(x$H=DX;fh8}IGU_2lv6hx7k`Tl_CEAb_jpdLEx9BAU);DbWUC3ox$l2=J*4+793tvTGqK4pyp` z{{gAD(g|5?16fBt!gn&D%qYHNPXP2~0o_g&S%6%-+tz!%gX|(fYf2CnJ9X(VjZ(JY zHQLe6Wd`QNp8Ci*O7@5@AB&j$1RWEG`!yg~6vn4s?_Iaoc6+yto8EEnpt;-V9m1d9 z5ybQ8h&N_qB^Z^srV+M+F^7Y(is?%Mz`P7fg`^I^7mfUJ_NA_tNP%tf!w4!yNog#? zCCV+LYuCO&H-K7$ba+3nmuT=Deong)YP}xty2DsIUg7d)v7xj6p(vOnKwkt%ztPoQ zG>#>B{ze7)bEyW>X}?Uh(|%WzgRJ5o5o*8^s9aO@025@ujWOVc7})S7C-?=pFxit4VKcU5dmL}A^`9e0-V^){uSC?j4iwWIJ)tnN`6y$}3{%!6v zV1)zx-v!^g?~Mgq!2f-{{rIWJ|9!o^x&6TZeFpL$uu(5R;|O2;eK?Hltv$~%W*)=2?$2^Awqv2)~b<&C#}_vyd>M4M5iexc`QjJ zO)<$6orKdAlYC{8P?}7mUHTpNm zw5?(9*TTHsFZl775=%H-KX?QO4dIqDZz}0}nOWp7a033aI7&cR3%31b zIza6fs>Poha~cb!-_kcr1mi#ik|%-GV9eB#c*TJ{>NeLWbO%3_hz06hS(#f?0K1*K zk&Xt*?+n&&y}_O-*7M|Kez7_f0puD@!EO!5>SOFcmzkTOi7H#|`14}y&^!~gvH?Gy z4Ts6}?q+0W*A4AL3qBR+8`N~7z?CQyp461ay zqD}?=)TxlVp0a4GQHZ!j*?{q9YbIIKyFfvrPI0X$u1DSUqFTFFXm#Cbc0;A2;@d;G zn$({(R?4~(GG|(LCH=CDMX@$hY?qrUhD{Ew0f12zY*VpQTx{Fu6|l98bzkaR_pxyw zw*J<$SfdJvbg2rSST8ZFXGa|%`@g_d;Fr6EvoW*^ZhQv*-e0!*%Q}2{yi%ZMetU#j z`b91szeH4=;+&qSsUOZRM)`7v*}TYPH|dSgjASKh`|CMj$#k?0%FG)WMQ33AXMm3- zp{=7?S=?d6x(RPak=X%Qf=r$*czh2^VHxoHAaZ@>kQ}<%$ne_1V!uT!_Qvf|oet+ctmeT9O#~_E^4kjR;1* zJ<;E~TJ|E}zB1psB6N{&PpxlVk+x7wQojdnMGIpJc8U6>!uQijlKjhdAbr7z)y$Q} z7wE4IOa}|P)IH2K1ofbfnMd^*PnG~I%1w7)3x0VTpL{@{cy1Rm?#S~e#0$m4@wqxn zrs)ZRRn0DviF($a8IF?E+!#W2=u1IKM&$F$@?pz!1{Q=N&@Ow$g8W|oL=68a!_}c* zI&~E8&S>!*Rb45D>ng8byJN1#b#^fuiqo2}@BJ7#r);vQXYIW|NYz{4==FLBpn*Mj z|I<%z_YV&CUuyjy+j5Iw>FfXCtBHvBToI*8QQRA|aY(@U$B7p!JI5S&=eR89j$-yH z1w71)wo?{q=ib6V&b?dR$<2Izgli+Q*uGO#YfGl{%=j5Dh;?m*Y}I#ZZ$dy#yL%#u7^ntq$^Qxg8s zU=8;r3CH;yCxiY+I#w@~h_4hx?r!t!2I^A1R$=AW(arGL#m>r>`DoGq z@?athME^_3`U@iVttFremMv?$piY=mN-eI1OTqr3I|dIs&adsD$NLQR6bsc8A6@=J z^+#>*qkC}wI+G>UBcBXZv>1N~M^Jroxc5-_+&eW$G$-XPv$mvZokgKOspZZg87ThW z5@Q>5Sj|6P)m7&!-?~e)m(qP%ctl$FwS8Z@ukFuB_jPYk&snO`wZoXNK{CU+sNu^s z>On?qLH)}P01rc=-<=rRRJJOQ9&{nGgPRcBObAL0Iwvq&2L9IlO(b%doEpZygGZ|K zeUhG?TL~ss0^3pF0mL%BrjgL2qg#I7iZ0b#Y5#e<-_OBnvtN(Z7Y!=H`{$<85Jxea zQJ4Ct5@M`wE)`$3UQvteGP*U{oqP+Uu}k>%ver-C)+@RcYX1^F2yq*GoejoG`dUAq?TIHvFL&)o2~CeVnxS9~xM z8s0D@gMe#M=rib3uV(Uf|e0RV%1IGuabPDi{QB`jH zE*vHJ01cCPq6U20ju>^!1WS@Ac_RHC#?xeC%RjV2(~|z8oQr}LS)F_?uY@7iM+c<< z;C{;nPM76{i<*F>)A*ZIwWt~z0qlsi^;j8g>!H8=GJ1rI&c3U`i@xGFp_Sg@T}ZIK zDZ!KRg<|6wY6pbk{gNx6)gv#dgev2zIDZhHS}G&Zbw%-#%u>DcNPG;4Lc;mK)CySx@#boGC&GCH9D zMZTn;o%SV~&ZjDa7x{lae*CqE|FE_B`cx~@Y<1x~~&17%?!pEV=UBK?C^aB2^V@eHmKC#Sv-| zBBJl=xVMn8@k=|P!p&4cq9Muq#|dy<%Og)v=K^JDA$aJfGvI0UE;}t|E3KXZA~*no z({Y&d>0#Z7q^P<)H0Cu)617WuU1nY%RyG9|;qn01(m@fPYF2YsKFwu*OY07Ezkdu% zH*enOdCKaJD1re~YeqKBBPs@(HAwUEFunp9z$8D@F zK=_gTUy@J%MEgI$|9V=m|9kv^|Mj`>e~7omL3inFhl{ert)^p!AiKu1$vDf=G`@s^ zOY-S_uFWRQ=8WlZY==(tH#*&x5l&dr1n=Zp=4f3;1tQ14gLo^_u)3>XXf%RlFCqC4 z<|`4AO9?Ir{~5tB)O!bjsZoof-c~K#ocWOp0$RtVEjhIFrfwRsxFy5j=XQ-Bzznh>6=yR9R3SbzoR|C1+AzVh)OHlIA$ z|9^J!A01#x!fhoZMu<*F(Rermg#KxS7A=FM9YyaYyh56vWa>mxWz9x%YX@9ubwFM~ z=!H29!}JZnd(LMWKFyT;6YaI9({)53JuP5he~d-8W0Z_vO9d}ek+e0f8|x=n1FLPX zC)lHp%+yeivgtWP^)_j9(C9|T z$w`dxfK%1eB!}qW6d-7Xv0NtWAW@!TK`cp=HV(2rms+<bVI%j9sy zCd=e-MNUiQaKul`6bX)A!pK1pbL&OAG#&UrT)cUkeWYJpAA7 zBLDyN$#JRGVv_y?&PwkDG) zk3FpOYdQ}3N88WOo^(D&!*Cdnb49-%H^okj!5OBPnSLYnjiALaQVvkR5I&vX#1Nii zK8we%Hi^}M9=&|6H`;JdHC-?UK9jdpJ=@j7nP%!Y$($q1X<)FJvU7|2p{^9DbH*PS zNtYt$^d`H#QSV9A0HOgS3WC8_R6D8}3np-56F@_IRDUIN z^$LB1Gn|v%R;)B=#}0b3qEpbX?K~OdJ&L>RPcbAJkIM$O5TP#*Z{X_{}BNQc7Eps)K7?%b0!8pPAM73G&HM6W|N`6NMWNOe@@=kc&Vm|cwB{oPe} zbyY_o#-9lViH3uQ#vp^LP5X;d_x~&BKZi5FSH<5l=l|B$=2LapyXXH`n_oTPzkUYi zzlQo(s{;|YEcE}e;)LSsf_`64)L^aK-T3=?s%RBrHpDZP zPSL{?#TFi~UJyMAgClWL9j53w z!C@Le?4A>>=nD9OWO9o4FsTBhBsGY9G`1p5E266t5UT)DQ^{lqCJJX38?hEO*Vj>& ztLAWB-Ndqqy5{ry!Q^UvG8^gN5FZr{f#ijnrITcRHdcf^v0tiT(m%)P*nCqfEis=U zgwxQ@3MWpM!*5zaFVtSnE}SLw9oar*lN?vld6qFsn7dj5)M_vgOQ~#PoF&vX^a6t5 zRwEP#36@POfgxV_BUM#-Om=AmEOS zoHaKr0ZEIVbdkc5mp<;xiCW6i8Pyhuk3oZRW(ME_%r~=>6Sej!Ok$zwst^IcQ_CA{ zH1V}64c8g+44J6~f_YJxt>G}SMvsSQ|Myr;SR$LqzAETx>2wap$#8gbo}7HZR1v3u ze-W3&j0keVRZgYtGTni+_dKVJRFf4~XMbta-#!hUE)!C=vr)aa4)Z@8t`AaV6XMBL z^zzk^&@QbBYx&PJ$*Y5KJ_BgLUHOc79=3`h^tl!SCQu=>(zXb$ad2LDy{ z1JWw2%jyhSiyU7O|AoVgvyOHn!`WFnYU`rBd!OHIPA6lac0RQw`WyJl;tHg}!M8u* zBuBsLZ`48lO{Dk)E(Jgv)p7=9koq{os57r%W2!Mov3%ZmR#7PG%Foj=QBbGG`T>V8 zd!;DBSu%lj^X)K;r!5F-N-<N8Q!|OuzgF~8HBY5Y0rv9!+gGh9nVz&8 zt-@IwgP0zcT?_vuX&iLx9aBtCy(Tl~^2dV&{HDkSOQ;;eR{ivL|HaiN7fvyYQ0D%XGu+OZpf{!E>;dq zkn_$-N7O#m98*N5Y6qrZ>9Nel>&SRT%V)6DFOgw9$u87~SvJdM@S%mdbP6?|18vWb z(U(}`VhWk0>-kl#PVJhm6|aPHVocD2jAJlPlaupN`m5S?Sir37<{Mrm%id(_@Ya^3+W=D z>+}R1OrO%LpFruev7&qvmS(61%MbSm!_O%j zLE#Cb*uddzz%R0lnwtYM+DRW+cm92)x~6V6)4qU)3YX>l(6v%ec?9%ZV#Lzv6+6zS zkVNE>0k)mEe#ClY*t18r8J)2z7hvawk;^UY_!cNmNBXXtFt5f0l zztl6t3jdTAAiu8CxGll5bZbH_0aAQ#jX*YZJqOhXQfOkuPO&iBnN|zaB)3LuPV?xb zxUV+KVzEXFnM9ha0G~(&4Ab9Gc8RGFgbn2pI@N}hy8)hmydGgY-4awAG+7S1vc9|! z+(R{lgs6xRaGhn_GOjkK`2|~x#1TK@%R>kxu7`foF`aHyUXw2eY^f2 zcpJuhZv>q+6Q&j+AMjOT^KE^5}y%1iaL_ zyA+t7BlucnSXu(4*1oxp?HQba4^?_5Ci%%E z)v#~Y$e7()hgG2k1;u+WQT#@rMsp}S&5o+wZo$^dJu-uK2d}eu;Ls7_SB=S;+QYvg zMho(hWR##-?}3hfN5^qh^A#6rOQhQ_Td>^TQc|piw zn8JR96~W6Bc1w%dYL($48-TG3SsS9G8TXadgoIm*EL2oa>EMKc)>1YubdnQcjV==- z#Sv$R(AtLZ<$WmD>$D@8Y||nr!!KNmy{yFGz)9y%&tXW%v zd@{r9mf`Rngw+ct6^D2amSVHV1#3^S*BT@z83{V`-9RDC=ITWMKYQQW-o}ljo6r0e z2xW(Ci6SN2xh!KvR%B)3XMD-pPO|fm3{8H?sEMpKmR$(}uD zvpb2{javhSLZL2iNsbv1_3_zw1WrId?frWLFW+>p0m`8BL=$SJuPHE(9N>$@%SX%y zaF_*!_f(VaB&961Kz1|Wx^!3pI*;y&41y@s!?dC@TOWuh_C#jF-WoiU9m*%*mZL8X zuzAQx7gim6p0d`>#}hO&EiDY@nx$cO40A~5dcN`_P(uJLHL{|1qzCV+BCdS=ZGu@D zG9<0EktG~#jP4!Lnin*0=VUTnqabr!YOevkw7Fg|uLrZDx}B%AEsd^~TnZTm+m(xb z5L~s2To}3mKF({W&!ZWBpyl4EC?;x_Cqrzv{(?06q1YxT|g@ssUK-ZKP|v&TZx`hLeD3LAHh# zr+J!ZlMm^LMM%0==*_o*G20t4jCtK+e>%>=9!TjwbhDyI$Pc86?mRtI!w)&_6XT&9 zw3Hs|5)vm|pY+qSDLT>|jwkv{prwHl=NE0PCLhFVqkVdII2jM&sBLQwy3iDs>Vp@X zgD2w;U~U5OVuPg64gV@-p2|K+L6xJ_N1Oslbe>KIoIu70it95g0bYP4o*49+s~9{yEq4PhP|By zlR7v(om}*}TEBRY{hh>rWQ9h92@LgYk>M2~$W@;gM{SCl#z%d;QUq+<0bzk=^~jnL zVUk%wMhO@=epHZy(tRq4$3nl5-XPu$ip)!!h7vb4NlF)#YcNk3r)2O5AvWm2ESrIy zy>AZRAo^y4_eE5(LSl)E03hHVC@SiwWBa`Fc;6L`C|N8VmD4YMQ z`={zQwYYSQf6UYW#Qz=+-gp1R0^R0uI)$4E{_c4R4RB1sV4svwgNS-&b&`I9JAocb z(huG+^}7a$3kU!Zsn+l-OT`2L-+|`{zHm2m(N1u|kG^qBWric{*gL{R+;0Ev;N`*V zy|=Gkzu|-u@;>a3Q(kO?H*_NvW8wQ}I7D|X1t2u~RWrFX_#!CF+rY0H9ClnXxGwoa zq3e%q!wB%+voX4<%X;Bm#ajs}XNy_Iy|#n8VEEFyma>|s=OYf0vVx}HlaLxkQ@$xd zd2W4k1ZD(|hw=_5bF^ZkF8m!oa(Z0*sZx%MJ{Mw{7!L|uvV1{Q@+QcNKgu|vJ`sod zj&kw==RS!EGG2=$pvVz;hLK?Z8D;E_I^aLs?O)&i)aQv|O*6#HSdFYTDLru~uQ!6| zspOR?@!tNqYbUIEG@gy> z=0&2~N-C(uBpNd)b;3_=ACgDfLh`9C$rI`~$4_g$5^jfu{HHdjx5v6nS?_7B7hz?# zsC;Tm3PvVMx~D-w*ciov`l%`B_?#?fpSohm`GVP@r=|?^x}Xd_HDw$Vl4a~uQ_L|F zS`?A9G8aiGdeSf69NN&OWB7^cvB&)N>*cW;wl9d@~bhc!PWK|ZcmNf+>k`@kT_6WR=6Md^lVp`Lq+P*lt>gVEFoo{Jjc>1S#L&t(nLf2i=wgXe`B?kMwX z*yo}~cx0Ix!E>*Me>S-q-g8kSJcmq;;JK*b(X^-$JQp>>)5X*Xp354NsAUcRxu_8y zJf=qQT-Gp}ldy*WT-FHA5nIE5E^35_hN%%e7d67e!PE$ziy9^T*;I_bmi5aH65B$F zBE1k|4Z#WIv17d_jVmPw1(9zJI$0XlgCPxl=P*oa)aEFir1}&eA7NYwJiBsHzTh+0 z#8!4mkM4#0ngU>IfOy_m86{Ln5u8Ne{i=%9YHOG9-|HI3hESVTna$E_ha~q7+AMAH zC_9^tM029CWiiADv;1tHlJ7}2lVMQfoE7f=4Et`@5GpObO6}AT_=$8LX}6zIN;P`e zup_Oy1_l$Dm<#lR1YoJlfNNiur`;j{gOtp`4Rv_7ppRm=F41z+`l{u!4tewU~jZ=NW6itshv8-etPmH1ZLCYVy;+l zH9ni3!io5gy%*1I6m`~zYkhs4HJst`D=ySe#EsflXzGi!g`$VnAn4@U{*w1}aW5C| zJ@FuvAnKA8C!&@ww-l?%_p+Y2o9w8%U#Vm7Grgoqj%ApcmLD3?3(Y$_*7>8ae~)2L z+7zEq;tI=Q^1#k^vk7@$uSNCE9TVap8g1s;d?6r|pc$ri96UVe#d_A8Yf-O0S-XT1 z*VV)mM2x*>fn&1tm;xH)|bw^)5DLp&fASiQ=?9ZsW1^aWC2Cp0U;%cX0 z41_O@8;LoF5WgC{*6U_0Hsx1R%5C;D2(UyfLO?*9(VW--E`_m?nhE8Ao&jkI!0|K( zhO!`}q$6aY9LNB^O?X^2C|nsswqr|4f!yhWOPBycXlQNWLe6NtX-syxeH)0F=rC%8 zCUhKT-eXA)*i#KHYBs*j@;$#o6J&t8xO5bf z1s6@Yb|_HoIQFAB4cU@^%!RCsT zE=QpQ7g)FuUu@>5gP{u>5sm|}f)uMba^ViST`Wic@-@ZdVZvSsnzVvHf<@#+7k^j7 zoWiD2NTjSwn5@A3R*XUSaO?u+pB}u~fBozih(=fF$WH&*5>51`f^!BURdfhx zkVGFnf9@yQ>^Mc-d>$oc6AiwcBn!+{wU;Xm7)@$ac`f`l;jsA;@iR1(#lD8BP1aMOIyDO*M5H9Vy zg8p4Gumy{zCVz-)HnteNGae4|6o22_5+y(A4M|i*6#Lu3>o-6fu7u_eDZqT~hz#HG zJU`RZHNWTwiFhB0B8P+73`h6)@#ev+pDMrRdglU2RXE0L)!_;65jp0~W)o+GV#vVL z9Y1x{FdJ8fPZPok#2gRw8V|F{1f4VVl`GX{FxE~t#okI7)R&FUhUutDF>V6@Qen2G z1Qg0)x;RhM8G3JufU}CSzOGF;uLl&=F!mx;0RR*pE#?E5VlJwWcKkZ{Al-~O*`W^% zh^CI%-?!jpuIeamogE6V`-EGwad1eqKWFFUU}L=EbL%~vo@)BH`U`$)g#{L&&+KGl zd~Esp0d0q=2%&+HLCOz@1g`hohw(g{VUW1FT{P4=faK_Aj?QL`8Jmx% zL~UA##fUz&pj<9q7xPOxl`TT1Wnu~XyQ;2fmh+_;C)IFTJTcA zOPX@_q$S5@hlbHqAY21)*p$2h;c_to9$U3ug1U{I{hM$UIJmtJ1N~JzW}4`{U8$^H z#t#|{c_)8xy}jmeDPv*7!TzAeg<8wohMB`Qv*#=D2H++?>n}tua*1h@>BW^g>Cj(2 zJjy7{-eH(9^Wj!Ra$^Rh;8r9C9~9&^@%~O3Z)J1sHf6uoVQFSvzdZS$mEyOE! zXQ~9F2{@Sp*JyWVq7j&~J{_@YM__F<-=`Ne4Sn6UUc>iS>OD&c>KZ`|19?HzmDL)$ zo~~f$l8#k}VgpACoerWmd{p{c1}aV?=u0<(0%Aei== ze+Y>38?G2K9EAR{X>UcvKqGoDU+7(=i5Zg5SBL1mjvC4_942N!E~H$bCn|C56_lwR zQ=#E?-;1eCqm%Jegc<`z5dU)1F%l34tQ)oxvL88jqmt8z@MglWIorf;tTp#&*+(F_ z0qxDjiDU>!$AwXw2&20Vn04cRBlfv8eWuy-=5GnjGU7xw4<$kSy!s2H`!Ty~S4*pl z7ul>{b>IR!2QT+uJ$?4_Z`FpXZl?O**3Am9(>&+tl}brTeBJP8y84D?klc&&_fZp& zfmg$tppduWgp9u)!%!$xT#ltsDDJ*Cf-$kV$?jfNLJmXxsjHBhVqU`Nhemi+h2mvS z!}|UMu|*6UNVl0t3rk6%u$H8M*?GD5;-I?H>ab=f{>6d+y&PRIEZO@egp_Y;4z~03 z+3Oodabr;W@`2G&wPaj3OqUk^k=O^tVP4F#*~OIMs+?_ghvU)81{S)jW8piEjkTCN zzwEtzd+_=tj`L&H;*tg9eVQ?10bWI-Xf%ayv;ZO8McFqQ^(thvyNLuaA`Erxo4hT} zhZMU1HFsN=M*th%Xx>W(Q|3B!cOuXu#%MY{6PxJ1U!|l!g&Br;ODHL$XZ?6)lZKIW z^P19`-Niq}3mA~Ln!aKSfe0?*F%7PGHK=J;3PErx!0MgPgk9X#WHRRlddXy#RFn$TtX}uv;N9jwGtI1xL@zmhG|^- zc12(?4N6dTml2tCA+EjV+NEyt8b+p9__mTme78zKSR|ca3rqP^hDbShbq8BH=o~sP#yAU=!J6@i9SatX@*ENa6d)4kYmwn6p9XN3L9xw3m{?&b!&Xe6Fv|Q zOxHmTm);li3ryXVtRgSmeGUtO*o9HvE(E+#y*wnmZq9H#!OFff2ztHkmvXu=R=QcG z`CH8y+wB*7umAq*Fa4ihy?(Lx*6D1DvqY`zQ2A;jXf<}V@R7}pu@~fF#^G6hBN-FV z)K{P1oP3YmupQR($3lJwK!-_uK5a!m2~UuZdv5U;+q_2nuts z5-?1m*3BR>g(~HsF=zvb)F|S|FvY@jhzSmZa-~ngEsq~S#I@I<@~JMvGD2vfpZ5M; zvzNlxtO##ZsK-!8-g=;UVMJ1{9!6xc!E=Sr^M!|ag!cL3R)E}zZN*m;<3a(TZ=^ye z>rIgkjA>sPgMS&&60e*wON-Tu8?EoAS^*P8HY)<%-A2bkG8Wyr@o0N>lZ-`RmC{ax zPC-TKd>M=)L8BJx3^3OrlT4nbQ|J)=6c54dMrjg8#r=6f+-#}5W}yjg%b1)!24NGW zD@;yIofS|(HdoT-tghqy{s?D!^Ju!*p|gR1Ba3y9!hXsGvCv)zVE=?AryE)Khaa7x z&}r69T_K2%E<7eLku69t`@Y-lZP^jKQUNzQ*nj)#wU(%GUdB}cTppVP0DA@?`bCzw zB(Mb>vLe-_3{7URrx=tB7`+80izoyEg<2nkYM< zVM50udo^iV?J;XalIXOM0I%hDE6tO)=b9On(Yxkqa~~Lj`06NJhOexQ;g8s!?li%) z-}uyo->3NBB83GTv~aSA^kKn0?mV_4Z+z--`z^XX9~8xf`-N~(K}|O&{KLbuW5oZ9 zNK*O~pQOiwA=p4aWJ8j=V_$abldXpE%f)l8w)z^ea(ie0=e^f&4v4`HSJOOW=R*kz z-HfUTrOIC4PQXy0nU3u`rgj(@n|~PvIGy|_=#Dvr#ppLjn;62f^ZTpUPl2OG`RHvS zsLGU}@$eas+1=@*Y&e@$jqep^_iu*V*upLkjYHTi3f|dVWI-Xtmc57yDW<4^9FYKt z*<(qp6=1xoPP-#=?hpuYQbq(JM$z484T9&`=Avh8T9kwJD+duS;BZ;WMX20#R5nnF zY4nLI0!*^O!G}25mxaNu2w7a*tUp@69mcO+co3Er**9_-nV}b#ornhETuvAs7W@M> zyDYT@`G8V)pCRY51T*tEFv2bZGn@ou|b@!PxJ{fLPz|mkFP|D74 z>kkscDJ@=oIc=hPBw|(qCwTApS^ufRI`Z6diWk}NH$)tkW8X% z)C@;<_YnfBFXjo#!7%$XuSQ(pxrpa2@t}c=G-{!OiyRhxUMWFAj*g%+%3NsNCQipF zPDB>j7mp#O){&Ri#kLpQHkzwJu1R65_j)Xj)1-_fmCrcD^)F*RA`pAIsriOAqPXUr zUtd2*BKo~rzB~ru5;!tuCD2S6ac>RgZE+?uwg1~2bSj2Pg$CIF87^?O?)|*hh|Z!s zJB$*NFz#tKBkH!pTode>zEgZ}G(6B9Xl_7BXWXufr;Qs0_JBQ`H5;6sl0jF0$hdT) zSlGOkS0So8n~y(DZ8jg{3eL-AP^XkZYCF78@8;uobSlJMjldL%`puD%YHElxP!j}> zzQ2W{&&@VLtw#KjYZiP$3^h z$*SE#zob{DTDTBHI3EYmJfjSXdAt4ds}~3Q3jSGDP>_>s%*N)||GKpuDCh-ju42U+ z5jU9koRDOy2+tNJHN8JjyN(f7#RaAHQh(+86jrAR-zQ{@JFQN1S;SiJs;bB9F~I;&j5nU@&VU)()jf?if4qS+($lQ704MJ-Hf_BzQ+ zS!94CdS|}?QWH|z-fGv3F*yIt6^pXrE+}bbzc%f3vnxe7lxBmh@g#}J1RVZLLYqdnJ|P~e`63= z?)O|94d(BU#`#Ij#pPmPs9yKedaJuv-#ofPqu`Y>1zv5=uQp#_fn0KBg_ERv*h)C0 zfO-SA_XKv5@c>Nau$G3ogZ zg<@#><|GTca9!Ql{qv6bW(6OrHs{KIu-bgxvk(kk8-8EtVHS%5Hgn-dKu#>G7V(>y zrwa~lu@6lweiTEEHNTmosQiOWW)(n%V%$(*H&Upa^QiSAt@6sa^#4Nsfs>BJ#@?;swB0Wz_V5!25jO;V>b*I zco{?3M<(CqbwF|(Q4Y8gj0`$gO+LNwXk~wYi+o|i<|)CDe~L9B0nu(0EeneyJPl;1 zKg_bphS$TH|qhQN|3oi6%Nk3g1<= zX0uj^^R=~>Vz-^0V#4?^^{MZEx#2T;kre8gG0>dNWPVb%J|c;?No=qQWrP-$(j#Nm zR)Z;Hi?OlB)Z-oQ)){f&gUZQ|wAY5Q7WCm}f`3>{L^5if$+nTTvKViI# zW~GxFHJ$pnwqt}JrhKgtM0wwP{%Y@O9}FGQfLYgW7%xlgx#5q*BEn#_B*$HQZTUgb zk+}l)K(jPmInkWu3ws!noR?;t6WQh(Hmh8N63^+aE;tO@W9cErkq&YM?T`uRasyl` z8)b+Mu#FR9mB7m&hl@N-)tYGM2(#+WJ=7J;G(_Y?-Th580Dgm_06s&LDvY{vW3-|K z_3~pB{3c_hY*j=9geWCY6ZrSv)A=l&tevxZ<~*&iBs)Ur(PD3tnaSz)a(HphW$A=@tE<-y$qfzk+^v0`aE zJJpk4^F{!B@4QArM`nSVGGH5h>+}?6B67u8mtbKaKa7jLx>Vw z{3s5O8~7Y!;@&)58$&UO`tBs7pV8UGJ+nu2;f0lM9pI01{ov3VYa$q;{dR#VG%W*Y z7S_HvPqH^Vt3jSY_}3So@t?`~umzLYVho@8;TNC%pRMh!t#2MZ`eKXz3I4nNt$zK* z_Sahvx4-`8k^Y}9|LB`X557=aU;G9CoWadO4@I9)>10W{o8E^X_dn#HHMP0EshH2} z!*X+w565G8SV0`>Khs&CaG?A8(%#ckeb&LUx)&&006+1sWWOn66 zE2Gj2i%)TKnSj^I8nv zBPwp#hUq}I#rw5US+jRM=QTJKt$j)fupXqz@e3Z^*hVR1*vTaZt6|OYcrBUFS>k}|vQ0wN% z=iqXfD}51$FC>eN0&sNIZsRXP%k5jt2-%ivf(9jYGL&$W9uh_RsAT_f@uzz1J;S05 zLKb$~>NY=K{CTg%4Td>p^`K7s6PVTpep{cwu?%S$F5W=jtDKu)(b6_aNX%d?vJF!l zBA~~kd7lfyAt1-WyT`Oa#9#@*?5HPpjItSX))c1*&Yvd^QI5w1uhR(9GwMGn*eKhrf(({^ZlowWHeGT6OrK|*c?(MeWP6-<7~vL zBr_tQq8n*wz`fMMLFO!%c&VOwLMjDm_ic=K&=rF=bRiYDB@~&S9$*}RTezu0cU=m% zv=5tV?}+x&ILFP~@ZdGDsj8MK01%>T_b@XSx)RxlNSZZs0Terwems_`eZO^LYjzrt(Nc`&_*@^JoaO~+Wok-Rpmv7_#@1b+&)_z zZGKl1+Di8Ow|7!KR~#yOGMF9H;fIyz1Avmg1Y7Icm(BI=tcA#v%oa5Z(G#X;GCkB) z75o0flp^Rb1BAf$Hp6@sc}G)czTREa|Elk{H@oYb`mbbH|DDc~T^66*@S`(oGccn?N;mj z{JeRrDNYMp`2zYW8wg3W77O&CcHwOoic*4 zI9yE3HFfTo8ly!lI81L|&>MUm4e`~X%N&L8V^ zkpYpcO?Q$t>oXR!-7TGISduII!I&`+!o6Tj!>Q&Nr-)vt59#xb?w_q*BJei3lCyIb z4BwVkSu=JppU<*(`(ST>|KLq23A;<+#cAsDEtyFHPAN#&r@*DthqVQV7c^B+$^xhN zKc>Yekd~KryKfTx7d&VIZDIVtyzDP zL;X(W{IXJF2Sd#SVG)f7MvspXq(i&2jX9W{fdv6@Cb~7X!LraN zTKR+@yM)*2KuuP-ml*(hXscK1>;t#v>0p>s=%QoNmTi+yAp!c+UCr2Ry}<^{Qs+5O z5nGT>}*yX9@-^s*)mT zpMTMAaf%RAm#(cC`ZbuFz{%n=2zD8`(wNO6BHau#fKM8Y7igyDm0pOhr-KV@i2G*2 zQHv6Q1Aq*CJg3Yr!cITCa6=~|8eCZICO{P#-=kK?mG=~(16LqpIxd%D&i zChRB7E26nqT{Fp~r7wJ%>#1w@s*Nxgs$nJ3S5IFN!YNNah8;k8up&crJn~2{L=Tim zbi@@cc}9-JCdrj|kxjww2K~ZGEu44dQ0(V&ay!kR2B)c4q>oz~ogkKq;UE(A!~7Gi zKh`d(vFm#zMTB`MTFv#g-GY8bFzmA=fgunXuwAxQKv)-CG&U?71}6=7=rMGLC z6L)%=(^B|I<;u6&Vq`Boq(hR^irKlgG*_HuJa?Z6Rle!L%M2Yh*mT2q5*Th3L9Kw9 zAGgxmESuzL;O?U@RsWhzuqdhY7x233)q0CcR|A|H)>;_7EtB#~@Y#U{&H+vpaWpm# zv(bgUq|jZwZ;@2%@HVj*gYE)v2Jp~`^#XI%&W3$x{7ZFt1DCANzr=cP0k3oJ<=a5B z6N36^9<$PJvC;BkLUd~lg*S=+YGy}AdAg`?CE_h*pQ^iY=^yFlVWKwGp}OzJn?#+c zIah8hSD1HcwKL#cTyR0xjKLG{`NM2#4z{r{jA2lcW`dBg#RUBtlM3J?RM=eAx1P8) zUQcSgR$gGZ>>VmcC)x3mGKPCEDKZ}|d#TB^R{7$8|M?&NPvHO28vYABK$iM{Y;SKp z`ubtu|MB(Kx7+{g|MA!Oe=KwIu*UQSz+BeY>BE-`_ra(Mx=3fRRr^xCJ7zg&f$9N7 z>|$37yjBk80DKSb+cP%s0vareePdw;&D&~Ye#mJp$p>x&TsFi*@{S;>E6)^INuk#T z<3n=lC!@|m*K4r0XtB?xT4%)$qk|cxDFDS8Q9q}w?&w6Sjs{~erk|&bUVE+^2J2j= z4~5~0b5JpLBPh8jR1_KH`!m{HY+X~?YaST9d%9Fh=p9KC_eAe&s?RAUoeM{PIMgNAyjdLlw$ZRZEo z;TJtoV}UguHPqJ)^-V){zHO-QdRP-{1TSRG0oK%CrbWPi1CyWa4{O@a8pT$)g4bG; zC$^C9N{+nYMhYzj?X>8>gq@>)+k5`&0X@-l0!c!-hdRE|bEsuYe0^y>Rp23L!4CWS zO4A?d>oS!3-o5u*>cg$SP=u{;^9z1>Z9HR|P2&=zK4fEdoq4A3J$-aisl&r?NLa`A z?NNJOKNu4Bm8$ZHs*PZX4YdV>({20=>K!!Tqw|GR%h+8V*-sO@e^EVD1K($}Z;i8; z?HhI`DPee2z^t${tA$0tKf?&nl?WWIW^&7K_#d#*1dfTVpf$%pXB+mzqZjRbbUII2x3`J2q>m50 ztrPh^Ehf*g;aym~8MHCYMrV_B^+u?C*a~JjSiKQ>;6cp|L(%)3Ey4I6n@p@{r~2lF zYMv5Bo0-SS_&uyb+q#jp*44wUtu{{fiRRysO2|S7=0l1D(RZP9bQ3h2Uj+lK4}Z!s zy+3|Ac>UACJ|OQsd-?XkPtX3Nt{YEyYfzp{0tJSF8#E~k=P}e5UI<#s&@qF_rg^{w@qi#7;@bFumPHY+!ZU&hAW}g1Dt<>Z34+uwpcFKUA z6fXh0`EhH^pZa4;xvs1PYarU-!(8_C4=E?1)-8d+xk-9Fiv^aGGz7vMIGTE?YmjXi z_h2@jf}7@KJRC137seNOFdB^)XavMlkDRS!N@aVn>A{*sFlQ6GsKCtv6LWE1Xqe`b zL&F>y;fX;KX@#u^P#-6QJ|PDu?a@f`LBszFhrJdAn#uQ?Ew*3?Mo*5V_t-s?1>Wx@NbP|Kmi89H@k00&M{vE~#ntQnhQ}W~~$kX8|r(Rs({s_d? zgPCTW`58ucVs0lbo#U))p<&KwxAu&f9ckL08-W4qV+@OvkJek|1EJ4oW3zoi{PD+P ziQGw~!=vM-D_?(~UL;Z~-TXnxhN2a&G2d}|aiy*c75vKwf#A^jBX5EjGpSqHa6+0l z7v|f6+=VR({P!Ei`4g~ei0Ci~yn)c^?^DZ6bZx%E;lz{aUK0Vq;@ios#5~sbLx1&3 z+*!R2&YipMdS`$5^GPr1Ztq?V>z$2{r~2;)R~Je5&lWmf8VSl}G@?k?cD~3?HSK|= z@W)rLp7-}&|E+KGB<`qIH(%fA9@aZs+r6uQ2Omh#6fc*Xz~p8vJkiNgNFmT(uoz{YUcd8Rrc^<~h2v)5a1V8pnb4K3ir zKrx;dxOYx6{EGu*I0%#nIwrG^LH`=bmY9<`AGk4@9KFw>_Rr?2SNHBSS4TaHJ>vOs zQs@@})%%gjSi2K|o|f z48@|1G6SYo7<6o!Z$DLq*(vm6OGG9J#9$kZL(w+UL@+X5jwl7|SqR&9MmX2zFLMB_ zN(mR=%=Uoi+5;dY9i3uZ{pWjc z-Wu5elHprB}{;wM(K#x>ut@7Dsfu1hB?f!f9>`1C2=W8cUpMw7XNL9J-j z)W_sWLmgeIlg?2ucrk9M>6IFHrag@K(MPHEa5cM64xqzJKtm%w>*%G&Lx^#-9d%h~ z*)lM{4^wZUR_QIy1&iPR9=`v*`OIZ?o96D|RuqEa+R+bdL~_XA^v{zrW>h{T6f#HZ z?HikY3if4LY1H2L5le5Djnev8D1umQG{)HT9d=Hg<(m=m8jE&&m zJMjtam>NCTNOkQJYG13hOH=<^)gdb>A9wl)t=3sg?@)O{bS2-kZ17Q7oh(#3rp7 z<_jl-yCY#hm^lmd8H>LSJGB0BNC`nDh@q*+b_h7ofwxnm;gKSLeh z0IKS~>WI%<_8mQu$NFOg){@4W9sVae_0AYjLNw_<#?)Y~A(y9sK=W|fQ2hGMnej<+ ze!=DyAdDF(K(e}N5fHX8U+j0>u$!#)0sjdbJD^XkX_MA$$9C`heccxX4LA8s0WWMY z;t#Ed6QhUVzEFNOH&wo?_C_OG;f6}b7|_XA1kzpe>f?rCT}sA97Uv`coA7p!nQg8n zk=&BS0V}C}>Q@XVRzAbXR6IaywWT#1PAqOm#3RUbxNC=Fy3v<;@JH@XIM0}jR`!Ut zX+KHV5>8&l=Yz?LYz>5Jx{o_WnR|p(nCX=l)+avnx>cVU{gmqR9!<5wrh1LexmHdM9heKeraI|?}5 zsQ2xS@O>X6BSL_nx!XeZ z-Nz74_JdifL|txO%eNqar1(0Cy@q~&z$J#FW>S9uil`O}(@g(BLD6C-*jH2;cJF#O z*W*dL&F+ZhV$+IA%)pp37eSZ_=ws8|MdqWXutQ72&7RRp3b} z{fLzYdW#9Cu@qdD~|7D{p)GchQ!Z3X* zy7|MyE^gSyk!dNJn48we-^#&rlqnky0vgc$Sco_GkxHy1-Jl@EN*PVNNea%_V5a<+ z^~GR*oG$wA3`_h2s_-63U0w0B#YxYq zRz?^}1kdqr^TJULzjY6+US_%2NGijk(8xcqx5O>3=nzD`FXgusx2am6Ws7wcZdSV* zVCMvXI|yfHtEYYEdNQii?%y?C)^~TRBwnj4dohsQ?WFDuHIMZnoAxOq!IEGa>=$6Fr1Qg(lLEyS*Ib!Sp2J;SX>X)x-tf;9SNQUU)X zKPk>}nTZ{o-vEuB${=v?au?4MxjV4BqEB@m-byY7v-qnlz^D4K98wlXIPt_=tpwW!n>fM1-06sZ%{`>77fV>9Lx2c zP10&5u2P9>Fk;d^E~$6W++3rZ#Jm08t{sjoxB6?OvmN?xF2jZ+Gg!kv!Kg9a$M3E2 zEH+g2S8(2Z`Rj}N+9f_R){xszC0=Pi-wfWMYEa|edF8mq|AoXpdr z#bkg6X8nG9@4S{L$X8x8h&Eg zIcKaBHy(&8n3VE@{uIRuC1rZ<`U;BU6%@v#+tEc^+eto&$tzV%( z8~@#{)4Ohx?2`60*TM3y=t8$V9#S4o z$u9JP?n?j^+J4#xbb#uzlA1}*tCgFjjT;0E=Em&Rd+SMwE}@vHWMxZ7u$#-zyt^1P zR-w@w33F8fT|%9m;YBY-mX<1SNrkaBtkQoWrKDKyfAw0n$~fh56W?=vyaQxIG(X+aph8t zk|SK115}fJscg+kM6z?OtSMXh0s_j6)zg z0(oQY(#JY-U0>_BEBOWj*9e<2qrR?wN-NeYhD>R2i>X*VZZlc;wn1Dk%Hv5HT%xyr zzGc5*oh$S!FF?v6Zf%&;c!RSVsC{Mqkx2c5KFCHdMtMhR$AX^=wqf;Lwh>#tmg7xJ zbO`z#MrJ~j`Ud)qV>FR|)1rjupdQOry|!J0vDdb0NmHo<^4U4e7AJ%w3|WcjnF(?| zoo64$qjc2t=@G_fX1LVEPj+xN^wW>T;m@=D<1eXw!?0lIx&&k&ht^O|!={29qZq)k zb_s=$D)ASVgrEBOaAiI0R;a1BL`%Lmr=`2r0gt=GZYted=pjN{FyWWkNOsF^`OE&% zd%{lH>YFKW1DT&+lQvCnpu*fze%9^a5hX$X^m*Z!c$^b|LT>#nSlvy=t?T1FG+^+b zWiDtUXq~}XU_IGgX*&G4%WfWg({6XRN-MAw_2yM~mf&I}$^DPq{{=Lq6M){=bX%4@pKlva0Uw-+ECa5m$`L2j)NrK=DGTrH6gvotHqp zp4cYt2>2&DuS&XYa5`Ev*GWmSi_`U0O1!!@UqrA z_G5bfjT7;VEsQp0%nT?eu04ew^=g->P+=UD?>p~onV;P@bTEL>p?79aAD0+u8^(Si^;?A2~=RPF>nOft-XO z)A4W8#`VV|m7f>^Hg`t<2#mh3AFsr#mcAVWE~@=6Mrjq29IcW$2iAOl+fky$X@P|`dk%c1?*YofNJ z4zQGo+ECk-5R;O)ggq(#GB#n^v_~gc2r#J1m^5V${4{!~{C~a3@*H0yPB+W!f}f}A zBs=9RGe%{NgdH4{CyhyiPl(|)*OV}q`xFsBku5PTTk53Z=aaw|AyEN*StS}F^)izK z20plUX%9>*ahr@hBy%I$EjCKne1ylLdFfZ%kj7T&evPSYtTbh!_ZQTmVpmN16*O(>gu_=0qMQIFBgl$luMpGY0X)fy>HZ z6(FpewDx9GspnS0Ji^>&e}Lk;B^Cq$rqG#8z)!=jX4PR-f_8|x@!PV# zR<+%(~OHAxU$PSfcJSMRFaUC)Mw~ zBv8V+vESRqdj5KH9GA^_q?Yk zr#pjLY+6NJ$tP7?>!^m?zOGh2i;9(eMY?%!1EYf!u9Tyzy7!HpuD+$|n`^c1FHv>L z5`4~Ks_vq?5*F{pzuFv0A0bOgS^^ij2OeCHH5w^XxlRrp33d%HohV~ZIp&QlT(b^B~XTzQPR zQvY`j&G#<8CZ+rI z<5+0j*(Ez0He6gulfY~HgGIf~(Y#oo4JAbMg~%*ul++#4wW7QVvMnXADv0X7MjcO# zs=i^1(kpASr9@)0h;P6!*p}>E&o>OX1Bsj_Q#<(-Xn6q@r6s?>s5!xMeL5Ps{MQc>RF$S0bzBhTMbh3{MoJ|LQBQA)alh zYP$`qCaNc{I+u6v+^bsc?sm4H(XAy{?y?T~bGSCG_}S?QJ&iWZWqkusNe8E=^XzmE z*!=z?+Lr2tYkyKHR~tA@z+f`z=jlJ4Dxk^8^?mbd>7nWLG)@B&Cv$+<4OHipi_Yp$ z@K*0WJ8;(VK0DN?)MFYIP75FNaIoKRuh6G+%`!hOFW9F-H~S`pprtn&i$mFV?UK6E zfB1+qOIY%95m%f}zV<;N%DUx1427pnz z6Pbh$#EgaSPs2L?WaP{fWW<7Y>o);$B+lW6#b5pRhW_!o24p4>Pi=C%I#f?&+26~{ zawnBr0#XH&??OQyLsTf?x z?Iw`iue)92c|upS9YG@&t%#TJJh(8RE86XVhpZnOA_Rr-L*d(-N%>|K>LF_Jfybh> zL2hRRGA~tUa6VC7>IUZnJRe}bnep+A5WUG3?{-Ktp!-|K$~K%MsZClhB76fnrI#2B zM1NXcifu*m8wUj`!i;Q5Y=$xlHi?e=wnANu%E^%SbyLenj4&p<@CPe8@_3-G(r59N zblQn*UT zhy<{TQk`4Tkw9i7&J&91(nukuq8QXw5qAglg0VVX)8^5c7Mhq=bwS#AxDR>X?dWPH z6X&0MhO%6XD6@KELJXQP>MrK<`&ccvx=VxrQum^;VuuB%JZReLM%8xT|EeHDe>;L4 z2=RUHgO{2-N`mVPTBKr=OKdX1%s7qHw7|w)n;uNEis*l#x}7E6$yE5`45!WnTlh+2 zZgD37O-ETJ`ix>N0|z<{Lr}s)9)$mC1VlL~;l4)XUZwH%J&;}Z#Sy5&T-hMjrcys% zuyZr!fykyQA@8?MW@@y;hiPUmvNO8-N((HVLxjH{l-H*eCaxH$qxo15XmTOUm%iP_ zrK>qj=SL8j7RypYrEi<1#`N<$Sdi_w;a(&Q(xu4eU!xD&&~G-(1)tI(*=)Xg7Js9B zJu-jMKhH7)EMc3TL@`ytx{H;#P>(-GMfp65N_HZv7G)+7<7~LMff!m(A&BIl>n0#S&h5=LbMc#3oxaT>IVG)y(%G7db8xG!5B5z9Ij46soo>78m ze(s}Ddx)vJkB(`&N4(U05NWN$RAJ?MXb)U#X^9*8n^GmZXP+JMmMzG<_G=<~TJzQA zPUg;Qf!xJO!QzMhwM(3b+sJ|1>cxfHJ5NDLseYMf;Qs4-4|DcCk)xcPGdK^qar3}p zKLXlAdpa0v83_(a(}x)608wN#eQPG1j$9u0Lx7Zkiy@{P#WD5n{(JX2<;VkL(OJSDb?$^l3CMxOHOI_oEAr*+dau;Ydg0{B$z7 zz*aRYA9$V+o9f->CX8=q?Giue`kneP9#|bT3=ZP8{3>%T58+&ps)j07-@$H$jL9&* zcbr3YkiUQDSGIH5R<2Lol&(2f@0!qdpTFy!0Un}%s&2iyJQJT|Wu;sqRm=rec|dMo zxk%sbPF|Bt9%S4Nkz^R;6$_%c=BfgSpOy}qO8t~gCfRwewwwRfd^k!!)N%zP^QM+k zH(@FC{R?u39_&4RanL;YkGF=ANzuA4dQU125|ZvG5Sk@Rck6^soG_#epWgOHV2;*% ze0_u{26S0(HCjpMK@S@=xd!R7Jsm78gcVu)=-G~_+~PxcLYO;xiSQmj7z5JimQ^26 zO@hzGp1Px!+;Lp}-dB*jY;3H`R4G3hA1&Ms>!zj@55jLN+S-ckDf>ZTn| zLajy|9XviwJF2!$h6pgpxF*Hmw1nXIaMw92`@%?jD-FEuF;tAVUp~&It$pRSMu-I~ zHn(Pyi8Jxi7BzM*#EOI0a{#v*sKc{kV{as+4J~mKXy@3tInjN!Lo)JdmK$pa?<=^- zHtY8J29kD?NUXV0`cdG_<)D1TdoH}V4p5<8Lp#_KcVZp~eQCY~ z=uNDIX|sk*#xP%5dE0NdY~VBAnJBJFy^WQT8<@iasdhK6&2 zpeRwB>2%GcZsaWH-brh$D>k_|eEI_J8%B2t9}E-2=U(ZTn=D~V5{QWm=cF*^ZyxFY>GI!v{q2J<)Ye}y z0cYU2q=%w;RXSNx?xy$Q$Ndla2l?2a>8wveMxT8w+6>jAck`OsQ~O92&$DA8o0L4wuJV{rvXDbFT@! z*q=){4_$M9fozqI-@!#K$A@Fo8|miICv7}R58?Pny=8V}U|#d$&`}pOAQv=zgbloS z{mc!6z(v@X2JF_Z>|l1G+q?YR%U`vycA@*CN)^y+9bb1&7K_t%t95>U-aMY2HM99~ z3lusnV1=W>e3Z9N7SjplW^cWL`kUF&CN;6C8_1jRx~EyD^tSv32d>$louuey7QZMpMDx7F?T*1Lbw-O0ETEEb@HwOX^; zVmvz=kddAp`}Aji7-wfBP8cWj4O~6CqB^I(eX6gg)!G{;Wa%Xh8%QlU=UUFd=sKr@ zCvs>8&FC|3I3Ke!lT!4r$NZ>KU?eu<{G89d)>N!<<#|zUlG^TvQEP~B>63PKbz#q1TBiVesO_u zW6EJbL9ZZI%H~3c9aE;J|8FBwatTs*DQjTc0#eNJJUcthk*plO^L}@$hAsAu^|DTt z5|(U+)+AowL0WP!g__xPyy&0kYYPxw|4<)=5aaW}zGnxJ(9j0$KYko^@G~`olF4?1 zY|aqQ0gCauvqU6Gc@sZs3FiHCO}98mEJvT!1UT^i;RWe^2N#Vi;DRv6O}*z**xB}G z0p7BP11mUg!VPhr$I1Z_7MLA~HLfxT*CWdy!7@k_U{v*74uL7S7HV<#QNrvF9+Q3WGW8{%K|s{$}P^XF%Y3=Z~bf0jX6WI(@xmX2vLOZKQ(1o3t*ama!K` z^^0ZsFf`#10N>E3K}0^}nSOyau0Xy0-A~kGDyXB zu36`ju9q45Q53>y21!k?eY`dC%X*HW{H90sJd* zu_Ex(1%AL`3n0d$jbu~&8}N_S+aCVi7XMc3_0Hx-uRH3FlJ;&L|C{V~4-JgjTm6m5 zN-PNRLxBtYO+(eei}>5?w*L2b*O(jU-nV?Ri1BpKFCShv)CTog$Dim?L_pUppl#&C{^1JIDV+QyBZ`NE%(k*uEH0W1&J|ab z7&h)25O^&r#(1IcoCzt|#JI#263z=%w~97SrxrOq6;&njh+Qn?1?X zV_3Cs^@1;cs5Klcnr_Nj%GwHUC2%vQ+Xos#N#P{xC|RfZp95WOq^BmU^?E+)ly$+0ZmhbKT7`UL)`;q?@Hax1(MwiEc?_rd@~{f}oynPx+Y z5AInUn?3goU0NFiU5p%JiFn9|xDmgst{12jm7;irq6pc~$YM+RwW8m3!fzwf3}iM~Q4sc%F*W*cIsE5h)7t z85=)TOD4Mzy%Ns8H%;~K;!0h9cdZYkbxJCmw2TL4wYykHwNP`Yx2WEkNgMKxS7R;f zIlcD)t`w!s!-*L-U*0NA^8?S*F}QN0DA_I;NBtp@_P~v*;35@K2Pmlyz`rB*(&*>e zkE^WO{JjTdX3RU%s*w-pDfmWxi94#!_nLlkRqzA$15}efvzBIB8U(y8XBH>_;1FFV4HK0R01Nl1k87d6$QL) zG|x(BxqBrLn)7P42DVXbQm?9WwdUQmNKJ2{Xjv_n?;9ur2K)!3*)qm~~$(txa zC~DI!0K%;>-Iu48ZjS&&>W!QUU|bku_0$>oEs>!f?Kj+i*@ z<_08&N$7{Vd~^**>V|&O5(sCK&o&e&kkWa>=c-N`G?87rtg>@f**-x@gA@T($+D;O<+uIv>q&jp{UCe+KKCcRJ$?>*5UU;=oY>(1IGG^y_MCb;fZ%Y^horEB}uJum1E;CYlTOxsBp zhwZe;+H04%v0UkJVu!=@bWw-6qeV7%^TQ9C^xoKx$W5l~00h4@t|pwZ>uvDg>r-l< zog|<|`v#ogxUzWam5#h;%z*NZV{GF~_Bd`*`cBhDDRl$J%Y4n9~|FT!TLc~ zr^N-Nw3;pI|4j4=)1GBoOm|M?|0In$n7(QqeSXn}tc|{My_zTNL1El1L}JC~wMNZ* zc&Lxe_Y5x^?T^%brmIWS4$5cOpP~H$i)V!%SeE-7ec%R)bU}jEoqISvEuLp_ujK#7 zy|w=J{$Epb{(nCAuN(Zowzj@~xE1<;J^JSB|Mma+@Av;g_b;-Q4Xp5O+|p6!M-f3t zJfku{4loXotI$X{hkiS#$~Rh*xL=d)?(?`cb({6+=*o~cnBlt3&L2(4IC0POY7%}a zW(b@7#eqMsv6 z9|u^v|F^dvY(4xs*#F;dJ=*%;{r`V~|K~jY=h=9kVoZHLt(o8bc{&+j$*KGk=Z zJ_PQknlL|VI$cx0&hSPb5*L$I!}-FSpcV^qJ6}NJbujXcvXtJjJ(04=g4cZoG5w&R zZcJ^`PsoO>yT>Q^OW&M64hIw6)?jk+r)C_s7^deR7r+S*e`4j`@{i0Y3jh^Ev20YHw)5%~6aXTd}(KTM=iDg`G zes~TH4&?8Hm%nvtub;l!@BjJ+kfffydC~u6@AaF5*EQ6NBK$H)_j#`QTiXFFn0Is1 zOtx(*v4(0p+?Yy1eIY=|EW_i7$c93w2NL<|`dbmV5YQ|VdctCG*gqeS7AJM9aW|j_ zf2J6)$81rrA%YP>DwkYXx?GDiWd}38a&U9!u#4&7csvxaZs z#tb}x7?byXADsg48ITIv*6=2mpm=dqvQ_iUfI$%e&@4r#SkPs6!~|moKh`-ukvZxD zz_S20!yywrk!VCNAK()RU!G^fz6oJ7uZ*Qay*WDtY=>OELsP}*9TN3BKBV6v=>sY! zMj~PQ-E=tMh~Ep2B05YdK6RkGI-U>ol}dl1tHIX$wt7bps(6TAS~=i_x_+l$HF<{8 z4|?0Xw=eZuL!2;{zV}7(kF;@m7vq#wk~dGpQw)VBV;6=+iJW_~fBUp9Hj;p15-F^+ z$*Auo9Q3pJ!E0|pp9FLT1?0Lu@nN3eb@*9NBGXe&G;(nM*q%hut(H%v1qBV!sMgfW zl$<9h?S`>>5wbA&fq+>k(-+ON3B0ysf_tSYvPh$&KlqJkRth|NJkuQSY|cI@YNoqE zW_$=*#E%3{=cixfK6m`Z@v|!Wd$oCbmY>u+vDNM+j?BCX6bck?l8c@CtK*YIaV0#8 zh_6P0D&pUiNfZzD8j*;|RA*ziFbZItQ*Z!|*ka@2>2KrWI10mf1q}eCaJ(=91IEhX zMGsOGoNTV?LJ2)oB)82%rH@sWyV(@VVTlGVv1$FJp9>eAXR%)LNVd(&Es}UT-l}gC zIZY9s`*zmw7l!(QK_ZVB(NUVrH)cPf&`%L(>7p>%eQHOc zC=##EEF8mGAT=Xap=3|4{XY3>TbEUEIMVy7@7~qDh7zw7pVoPu8#lkbSPVeCa7#7H zX3pI24pr3C>mCqhZ_xMCJ+j`iZbsE0lxzIiPzdngDm*!xF+@vhlh5T85N;Hk<-K`r z0Z5+hM~iyiL^KV>G+mhhHry-DT5F(!-&msxCJRsn`!KN-?U|T~#xJqo(Ld9ZHmMV7 zG*R^0P}?HJ7K!f!yz1;E@7ASmH`sZ+MsUvB^uD3wBn#pRK`EDQo6L#7a(H!G>Ya@A zGX$QrXNs)iLEFilwui8$YVXZk3?l&6GeEDhrb7$j1h5EBa*~~+z{2@<*mAkjj2yqo|EjbpPBuaL_+}gfk7sx&R+vMu9ZEu@m53bmlaFk`}7#S=5 zz?6P?W&V0}ML^tOZbJIB`x)$9&V-rb`v0qgW4n*D1AZ`(Mfi}S;suVpherOURyfW z^zi{)ddaZdB=YoN4B|2r^5|5{*)_ACl;nSmwPCy@>tD6$;}V0?Vt9yR2B>@ZT8an| zH)w&}`fOUS+DwprSF$^^PrI`!H}6;yKX_m^Xjq-!KlI-7!$(*A$Jds1xxGpIF}@q2 z&No-?N)r=r=+al5vgzRTOSyS$pqw{3zL2zp1l;`EDy39aUs7b4P0pq$9Bipw{lB)d zPVBHcx$MBY6gdm{kam1Mw&N4s;E?tTiOU@T)!E$c5!y=IysU)QOD2mzH${OBeWL+F zTnhqjsaG|HBn_uALe-xA70ejG*+4olNajhyGH*83cJC|4J@(LDJ}KmOE`!)8We0Xc z(;64nvJ;i1&BhFYklvmcXC86PBQV@x(p1kD3{?*qRZu5q3^Q8L2$Rv|bd&G1Z%)6s zjlws)G)n|~i~dxs_tjTs#Xx^|+BA-mK zeH|iY{fSUncz~2r3+mgfd_72X>g>^~*P?G5z9k|{Nenp&;i&C=i|sULQ!TF7i*wXa5h9P_1mw2g9Sa#Wg-k*AMcqz& z#pO}naTPgC^8WmOM|JDH`w%N>f%j~ye>=(Yg@A#V$yyo?r!~}@KpPImuVhQ(E0LYn z4lVM%Sk}cM;7@9f?JZz}VsnhSkN^dUD-HiioWd$Ou;4EG3;~)jJ@3Q1yRY#sLy2a| z9gM)AP;wr#q`G2VESl_x2v_e@{CP#gC&NR&(3Cg@aRYy=>rmYjKw5joUN%H9Z1oMv zfTL#LGUROkett5@Z5rY}UNv{?Je}d~Ga^8miT?_zMjjn&no)7(RuXnenK(>qj>JFru(l#izbAh+(*xTlJ6f^~GX%Xy+VaI-t(+KnIw?(%^KW4tSzFJYcHRLv@R zH_bEYURMKy9u)J8e)a)b`s`24MmrAxXV-YXMkt4$14k{xt7WblBG$U?k*AskkeqJu z;an2Gx$wo!E@eg++vj>akZmYTsFq95p5 z0no)=DR`J7K2mBxo!lZM9TO@T+02D%4MFDdT}|w7g}v=<+4v4EY-qRKatb=wF~$ZG zu6LvqXb4L;1MLII-Yb^S#k;@^J9KD(L-p9mE~dV2$BNj2L!sALs`k28##flLdC4K% zTKb>nR@_rAgq$kmnxE2kgkU{n-BPpaU%^6|ZLO(iehyAv#oZyY@0Xh90!^juvh)ICsjC0}$6>2HHwo^^}U3jSwIfiNQ?}T>1O@CUXpTS|emYB8^#gzFU_nkkWg_ntD-W zVr;(TM8@c^_ik(>eH?aO*#1bNya(C`9@o3oLp@Ov(E> z!a_Zzgr+DIiJW2&^39gA9FSPL*L9c+6>Bn6&`KGc7-r;B@XE;?=()z zE_Q@qImu=>-;pUm>toiS%pml zyV32I!R*2r-w!8jl}8r_;kJ(_{_Jde=-l&4+#YxW>6gKY0-gGoB??Y5f`JOSTz3pX zrH`$^L2dim`#ZRs$fO6i-J-ICCA%kBqBrlyr<$itCVGB@IghN^k~JX9{;y#p!Y9D~ z02Z}KK}ib;zv`V{x_1EB#=paXfDx@lj#<`KMUVQwdzEim!C<0I(0|OL?mIq|l6PeN zt*Bu+Z~3=;<iBS!H)JY7PnaCdYa`Byg!0J!c&1tU@is1UqzMdVV(}= z!xMfEy4fpL?~wTk$#(&^v^gG=k9U4hwx2}(0A@e~m^k|6mhG@byH?WUMmypon$4!| z*3&YdW~V3(&@Y(3ubS^6!7gNk)69A{5vBbpy-A)7rqpDU=!d4IxVIo!Cm?bHt_#A9 z*ic&y9GJ(+!?rtZIE;E^0S6>pNQ>&+^GrYqB}parqf2l%94{WW8QUH_xV7OLLCe4hA}?d@V~!5D zi5u549R?)J;B+3&=Sk=x_?-&?;^tj5sBf7HXQrv~XaBMgU4Yj|(2#oAXayr-BJlOx z@E|>T?D9KZRU=}25?z~4VZ;|0sWP?6%>pNGm*KulaVBokz9K`mqHjY>8*thmzYTYD z=XB-EzCJkdEgc4_zi%e6Mb;1M5G5p)h|m{wds=o{}7H;7MD>CCiVeGRppozJ~P_r2pQpsM439of{-2%=9B*NL`JD+ zyFt4Aw5y?S;Bk|PxpoVq6`b=cIdxZ8-rNaYGki6kl9+BN_T8&!nad5{gJ9yKy6C7L zx518~er77Qzyo5079;Ia+dU-ngRi1L=`U0puTl>uM&C5`#yHxuewB zu{u>RHH$1K*-~2xV8O9&HeIN}5s-^+8Udy=6^pxK&h%& z#1a)l;{Gxc3rI%hARnhbJJjD>m)}ME+2I_H(>O_t(>P6x(^6APNG{{JhKP8A4G300 z!Kw3OaOjvNGD}mk9LrXdw#_qo>yc$)C{!~(lAzT)599zJ#>cS-@r~95Kt8M^Nc=#m zto%Z+=0`aw!=Q07^}MH=T;|BD+v2yD)Fy`zL$$a#g%`r6Bl$$b7;_q){ifktY#PQ& zBUOO<2c(efo10mi)HV2LvV6msqYQ_Nae?A1)ULvVDARX3!j@$D^>nZ}se47sz85_D zf(y(Nb0;#@f`K#OpAh@Ee2Q7PI^t>sjxG%Bl@PK^PS{@bWT45#8pqY^Wo%3r2L#D;1kQ(j|= zDR)#Fi622mjsYZNuJrXwOTn11y{2~rWo@oG^o|<0Ww;X{uuz&)2t7trRtei`Lbyj` z4w(ntf^qjnJDzA7l;&TCG5)5)NN)`-E249QtK%88!^@CSy+jobZV>dL{+p7^WxOBh zp%YCnW3)pAgi<85z{$d%4k5F?6@w1XCilhQF5+$ePOH1u`Jswm{PTPhtMW&O@Q7G)1wSM^XX-90Vyt1tN=|J zeh~fXyRP#Ls~tJtu85p=Y{PqCvMl#S%Qtw^FY|eqzUG*>37yR)YmT~{$0VDJwv&mpg8ghOK>rR%qXGet!*6|_zsCh_(+eJynmK<SBqkG-A+$5E7)2c#vNR8SBbR#)22Z;21F7 znnp=M;nq`MZ_H>D-|HLMSvC?5>Y9cJHib8M)*NMLm}O|>yEOWA&VDOv;P2udtK1OhdXm@vSF5qUul9^|d5A5@TgbSZUfD}h(lL`F< zAUZTq1B*4xo94*D;9x_JT9Bi9zZhled}c3K*!Yg}N(mO)P!BwT+baij>e@065?VNE z<4qg?({AevcSUS-_J{ZcUQ)(MZsH?usAk_3*oatVBu!zlzPY^)(#9FM;M%F}8GH>2 z=EYOVby%=w4|Jt5CSk+I%|dg!V4@B@^1QR$Bb=reDd{x>PQr`eR4+S}?Lxb+jFA#P z>eE@Q<(q6~k7S>s=8#VS4YlHAMi;yZSa}WQkSw9e#v*wAPH1xP=*>R*{jh;d|7!3D zYSzAA2Y3OF{dXZ4B@I1(>{oX8g1$WP*U%jlj|Y8C(Z>T~*4S^$VWkE_ex=4UBT5+y zcU^c=@4^=FbQcNDS+62-Ak4IebAy}8v@4^1y(Us!{+*pn+=Dc8q7iy(npz^0$u%}S z(d*BbLRr~m=18iw%(J?8plKd|k{j=H;XvTu_*YiUdeVp!Gw6@GF4+&GW#wbwj04n!{Rq7Urf2%=y+Tme+h9Cno&YX+!5i_17;S` zH}{Wr+vSX)?`Gi$NZMhs)lID=rX46)!aPAUtjVVV@oRFYj`CLDmkU1?2FU#-ZV z<({S=Pv>ptOZ->v>)V>{Zp{b8gx$aeIAF&+YYNv%Bhuw!{%AC#G(R2dJ3eDxOyE?q z$BvPKF#Q^!Dv0}sJ_u7py#xXCX#5c*0^z?9>6~1w`Cj8mA#SGzi|!}7q30+Vv9uYN zRD(v6NGo9fV|W zK_jI|2&(% z@CptxqL$T2*#(ZPTNrkrxPRVTWmy; z(XI7;dU3ATB%TyZ$}DRNKbB(D(ENg#x&g8VZo&|gp5_L35|}kD62+-SBX^py7Lu?~yha++YM#>5HKX-zav5vaU}!ss=>B zCz1BJ(r0g$O5eTN-{Z}iVxKVHV$1A(NVtEYi1z zN&W(^44JXW;B*}}E---Z&^oqJAbj~Qas3qP+h!^>f$BGn&o0IQ5z zyzQ_h4gPBmKmX>6HH?$A58C6PiBRCC6OlcOOG}0WEjXh49U{&Vd&Bx26yB5uWkqJu zT-U?-V_bjO=a^-oFbH+#oT8~-98BWdYvmj+)!>v3D12k3c-DNG7KG!D;0OLz zamh~Lis7fw#9kn$Xz9+r-IV&bjU~LmHXDlrUf$-CJ;;~dyAcmb(DrKi)xV0s!khgv zB6DREEBh91=b>I;CoD(6w~+?O3oNQGSaE>SUGUy2hL-FD*TL<#fmCvW%UDFm89a#S zJA(&w?+vFxKYQ;fLdy2mds?Lbmv>iSko(++oSSjmP7E(|`H?~*06-$pph@S7M?Kur z1G`{T?M?Cwu?TYO7Xn&aQVD#-tXlAB;9RUe$0U3BCtjLl(dSM$idYf%0||}(WdW$f zTkqKa1p`h`(mc(rln}J^75|%(yzQv%iuB1U49ZK7!93x2xI=n~hiht&Qde7>ud2V) zo9$pe&*uC8hrKuNYvV`)hWBrMim~KGl68PMY)5N?iA@ro^^qTt&65|1BG3R@ghtUw zCaleV_NVLU?&_YNk#L;s@rK=4(oCP#)z#H?UdCrvlsS&Xg}_qOf0nR^a1dvg#%$

0jcn6ZAu0ogK((kuoJme*0zz=OVog-Mw#bOe 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

AxoxQs0+-W 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 diff --git a/vendor/bundle/ruby/3.2.0/cache/rspec-expectations-3.13.5.gem b/vendor/bundle/ruby/3.2.0/cache/rspec-expectations-3.13.5.gem deleted file mode 100644 index 51409fdd2137048ac7a75975aa694b3bde2d547b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89600 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 E1={BUjsO4v diff --git a/vendor/bundle/ruby/3.2.0/cache/rspec-mocks-3.13.5.gem b/vendor/bundle/ruby/3.2.0/cache/rspec-mocks-3.13.5.gem deleted file mode 100644 index 05da2b390ac190401249b062fcd4b80c2f466fd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82944 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

}oaB=VnD%x8C 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 diff --git a/vendor/bundle/ruby/3.2.0/cache/rspec-support-3.13.5.gem b/vendor/bundle/ruby/3.2.0/cache/rspec-support-3.13.5.gem deleted file mode 100644 index c9433273d1a5febc7b46ea19da969ed16847de67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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 diff --git a/vendor/bundle/ruby/3.2.0/cache/stringio-3.1.7.gem b/vendor/bundle/ruby/3.2.0/cache/stringio-3.1.7.gem deleted file mode 100644 index bca0b39fd96fcba6e34aace2ca689e7659ef2d52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19456 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

_@@f3GNnW%cY(78oGTODIM(=K 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 ~bfWT+jDaVYXBes?doN)rzbH)D^6L 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[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

+d4 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 1000000) { - 8: int (* volatile tp)(void)=(int (*)(void))&t; - 9: printf("%d", (*tp)()); -10: } -11: -12: return !!argv[argc]; -13: } -14: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_category_warn; return !p; } -/* end */ - --------------------- - -have_var: checking for timezone in time.h with -Werror... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -Werror -c conftest.c" -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: #include - 4: - 5: /*top*/ - 6: extern int t(void); - 7: int main(int argc, char **argv) - 8: { - 9: if (argc > 1000000) { -10: int (* volatile tp)(void)=(int (*)(void))&t; -11: printf("%d", (*tp)()); -12: } -13: -14: return !!argv[argc]; -15: } -16: int t(void) { const volatile void *volatile p; p = &(&timezone)[0]; return !p; } -/* end */ - --------------------- - -have_var: checking for altzone in time.h with -Werror... -------------------- no - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -Werror -c conftest.c" -conftest.c: In function ‘t’: -conftest.c:16:55: error: ‘altzone’ undeclared (first use in this function) - 16 | int t(void) { const volatile void *volatile p; p = &(&altzone)[0]; return !p; } - | ^~~~~~~ -conftest.c:16:55: note: each undeclared identifier is reported only once for each function it appears in -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: #include - 4: - 5: /*top*/ - 6: extern int t(void); - 7: int main(int argc, char **argv) - 8: { - 9: if (argc > 1000000) { -10: int (* volatile tp)(void)=(int (*)(void))&t; -11: printf("%d", (*tp)()); -12: } -13: -14: return !!argv[argc]; -15: } -16: int t(void) { const volatile void *volatile p; p = &(&altzone)[0]; return !p; } -/* end */ - --------------------- - diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/erb/escape.so b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/erb/escape.so deleted file mode 100755 index ebe3d7dda602b2a91903f250dc231aebcd0616f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32144 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 diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/gem.build_complete b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/gem.build_complete deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/gem_make.out b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/gem_make.out deleted file mode 100644 index ad8f223..0000000 --- a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/gem_make.out +++ /dev/null @@ -1,19 +0,0 @@ -current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape -/usr/bin/ruby3.2 -I/usr/lib/ruby/vendor_ruby extconf.rb -checking for rb_ext_ractor_safe() in ruby.h... yes -creating Makefile - -current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape -make DESTDIR\= sitearchdir\=./.gem.20250901-3344-g3e8k0 sitelibdir\=./.gem.20250901-3344-g3e8k0 clean - -current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape -make DESTDIR\= sitearchdir\=./.gem.20250901-3344-g3e8k0 sitelibdir\=./.gem.20250901-3344-g3e8k0 -compiling escape.c -linking shared-object erb/escape.so - -current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape -make DESTDIR\= sitearchdir\=./.gem.20250901-3344-g3e8k0 sitelibdir\=./.gem.20250901-3344-g3e8k0 install -/usr/bin/install -c -m 0755 escape.so ./.gem.20250901-3344-g3e8k0/erb - -current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape -make DESTDIR\= sitearchdir\=./.gem.20250901-3344-g3e8k0 sitelibdir\=./.gem.20250901-3344-g3e8k0 clean diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/mkmf.log b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/mkmf.log deleted file mode 100644 index 02d30ea..0000000 --- a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/erb-5.0.2/mkmf.log +++ /dev/null @@ -1,36 +0,0 @@ -have_func: checking for rb_ext_ractor_safe() in ruby.h... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lm -lpthread -lc" -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: int main(int argc, char **argv) -4: { -5: return !!argv[argc]; -6: } -/* end */ - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lm -lpthread -lc" -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: #include - 4: - 5: /*top*/ - 6: extern int t(void); - 7: int main(int argc, char **argv) - 8: { - 9: if (argc > 1000000) { -10: int (* volatile tp)(void)=(int (*)(void))&t; -11: printf("%d", (*tp)()); -12: } -13: -14: return !!argv[argc]; -15: } -16: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_ext_ractor_safe; return !p; } -/* end */ - --------------------- - diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/gem.build_complete b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/gem.build_complete deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/gem_make.out b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/gem_make.out deleted file mode 100644 index a257ee0..0000000 --- a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/gem_make.out +++ /dev/null @@ -1,53 +0,0 @@ -current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r -/usr/bin/ruby3.2 -I/usr/lib/ruby/vendor_ruby extconf.rb -checking for unistd.h... yes -checking for rb_io_descriptor()... yes -checking for linux/aio_abi.h... yes -checking for linux/io_uring.h... yes -checking for sys/select.h... yes -checking for port_event_t in poll.h... no -checking for sys/epoll.h... yes -checking for sys/event.h... no -checking for port_event_t in port.h... no -checking for sys/resource.h... yes -creating Makefile - -current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r -make DESTDIR\= sitearchdir\=./.gem.20250901-3344-j7y6tl sitelibdir\=./.gem.20250901-3344-j7y6tl clean - -current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r -make DESTDIR\= sitearchdir\=./.gem.20250901-3344-j7y6tl sitelibdir\=./.gem.20250901-3344-j7y6tl -compiling bytebuffer.c -compiling monitor.c -compiling nio4r_ext.c -In file included from nio4r_ext.c:6: -../libev/ev.c:2136:31: warning: ‘ev_default_loop_ptr’ initialized and declared ‘extern’ - 2136 | EV_API_DECL struct ev_loop *ev_default_loop_ptr = 0; /* needs to be initialised to make it a definition despite extern */ - | ^~~~~~~~~~~~~~~~~~~ -../libev/ev.c: In function ‘evpipe_write’: -../libev/ev.c:2798:11: warning: ignoring return value of ‘write’ declared with attribute ‘warn_unused_result’ [-Wunused-result] - 2798 | write (evpipe [1], &counter, sizeof (uint64_t)); - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -../libev/ev.c:2810:11: warning: ignoring return value of ‘write’ declared with attribute ‘warn_unused_result’ [-Wunused-result] - 2810 | write (evpipe [1], &(evpipe [1]), 1); - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -../libev/ev.c: In function ‘pipecb’: -../libev/ev.c:2831:11: warning: ignoring return value of ‘read’ declared with attribute ‘warn_unused_result’ [-Wunused-result] - 2831 | read (evpipe [1], &counter, sizeof (uint64_t)); - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -../libev/ev.c:2845:11: warning: ignoring return value of ‘read’ declared with attribute ‘warn_unused_result’ [-Wunused-result] - 2845 | read (evpipe [0], &dummy, sizeof (dummy)); - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -compiling selector.c -selector.c: In function ‘NIO_Selector_wakeup’: -selector.c:525:5: warning: ignoring return value of ‘write’ declared with attribute ‘warn_unused_result’ [-Wunused-result] - 525 | write(selector->wakeup_writer, "\0", 1); - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -linking shared-object nio4r_ext.so - -current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r -make DESTDIR\= sitearchdir\=./.gem.20250901-3344-j7y6tl sitelibdir\=./.gem.20250901-3344-j7y6tl install -/usr/bin/install -c -m 0755 nio4r_ext.so ./.gem.20250901-3344-j7y6tl - -current directory: /home/runner/work/web-framework-playground/web-framework-playground/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r -make DESTDIR\= sitearchdir\=./.gem.20250901-3344-j7y6tl sitelibdir\=./.gem.20250901-3344-j7y6tl clean diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/mkmf.log b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/mkmf.log deleted file mode 100644 index 77c9b23..0000000 --- a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/mkmf.log +++ /dev/null @@ -1,186 +0,0 @@ -have_header: checking for unistd.h... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lm -lpthread -lc" -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: int main(int argc, char **argv) -4: { -5: return !!argv[argc]; -6: } -/* end */ - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -/* end */ - --------------------- - -have_func: checking for rb_io_descriptor()... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lm -lpthread -lc" -conftest.c: In function ‘t’: -conftest.c:14:57: error: ‘rb_io_descriptor’ undeclared (first use in this function) - 14 | int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_io_descriptor; return !p; } - | ^~~~~~~~~~~~~~~~ -conftest.c:14:57: note: each undeclared identifier is reported only once for each function it appears in -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: /*top*/ - 4: extern int t(void); - 5: int main(int argc, char **argv) - 6: { - 7: if (argc > 1000000) { - 8: int (* volatile tp)(void)=(int (*)(void))&t; - 9: printf("%d", (*tp)()); -10: } -11: -12: return !!argv[argc]; -13: } -14: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_io_descriptor; return !p; } -/* end */ - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lm -lpthread -lc" -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: /*top*/ - 4: extern int t(void); - 5: int main(int argc, char **argv) - 6: { - 7: if (argc > 1000000) { - 8: int (* volatile tp)(void)=(int (*)(void))&t; - 9: printf("%d", (*tp)()); -10: } -11: -12: return !!argv[argc]; -13: } -14: extern void rb_io_descriptor(); -15: int t(void) { rb_io_descriptor(); return 0; } -/* end */ - --------------------- - -have_header: checking for linux/aio_abi.h... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -/* end */ - --------------------- - -have_header: checking for linux/io_uring.h... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -/* end */ - --------------------- - -have_header: checking for sys/select.h... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -/* end */ - --------------------- - -have_type: checking for port_event_t in poll.h... -------------------- no - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" -conftest.c:6:9: error: unknown type name ‘port_event_t’ - 6 | typedef port_event_t conftest_type; - | ^~~~~~~~~~~~ -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -4: -5: /*top*/ -6: typedef port_event_t conftest_type; -7: int conftestval[sizeof(conftest_type)?1:-1]; -/* end */ - --------------------- - -have_header: checking for sys/epoll.h... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -/* end */ - --------------------- - -have_header: checking for sys/event.h... -------------------- no - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" -conftest.c:3:10: fatal error: sys/event.h: No such file or directory - 3 | #include - | ^~~~~~~~~~~~~ -compilation terminated. -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -/* end */ - --------------------- - -have_type: checking for port_event_t in port.h... -------------------- no - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" -conftest.c:3:10: fatal error: port.h: No such file or directory - 3 | #include - | ^~~~~~~~ -compilation terminated. -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -4: -5: /*top*/ -6: typedef port_event_t conftest_type; -7: int conftestval[sizeof(conftest_type)?1:-1]; -/* end */ - --------------------- - -have_header: checking for sys/resource.h... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -/* end */ - --------------------- - diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/nio4r_ext.so b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/nio4r-2.7.4/nio4r_ext.so deleted file mode 100755 index a185a06a0d6962384c371fe464363cf07fd6b7ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345376 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

r^LDBlal;JIAjZD)I5AvJ}bW6yy9#tvJngW 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 "-lyaml \n" -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lm -lpthread -lc" -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: int main(int argc, char **argv) -4: { -5: return !!argv[argc]; -6: } -/* end */ - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lyaml -lm -lpthread -lc" -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: int main(int argc, char **argv) -4: { -5: return !!argv[argc]; -6: } -/* end */ - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu x86_64-linux-gnu-pkg-config --cflags-only-I yaml-0.1 | -=> "\n" -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu x86_64-linux-gnu-pkg-config --cflags-only-other yaml-0.1 | -=> "\n" -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu x86_64-linux-gnu-pkg-config --libs-only-l yaml-0.1 | -=> "-lyaml \n" -package configuration for yaml-0.1 -incflags: -cflags: -ldflags: -libs: -lyaml - -find_header: checking for yaml.h... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -/* end */ - --------------------- - -find_library: checking for yaml_get_version() in -lyaml... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lyaml -lruby-3.2 -lyaml -lyaml -lm -lpthread -lc" -conftest.c: In function ‘t’: -conftest.c:14:57: error: ‘yaml_get_version’ undeclared (first use in this function) - 14 | int t(void) { void ((*volatile p)()); p = (void ((*)()))yaml_get_version; return !p; } - | ^~~~~~~~~~~~~~~~ -conftest.c:14:57: note: each undeclared identifier is reported only once for each function it appears in -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: /*top*/ - 4: extern int t(void); - 5: int main(int argc, char **argv) - 6: { - 7: if (argc > 1000000) { - 8: int (* volatile tp)(void)=(int (*)(void))&t; - 9: printf("%d", (*tp)()); -10: } -11: -12: return !!argv[argc]; -13: } -14: int t(void) { void ((*volatile p)()); p = (void ((*)()))yaml_get_version; return !p; } -/* end */ - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lyaml -lruby-3.2 -lyaml -lyaml -lm -lpthread -lc" -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: /*top*/ - 4: extern int t(void); - 5: int main(int argc, char **argv) - 6: { - 7: if (argc > 1000000) { - 8: int (* volatile tp)(void)=(int (*)(void))&t; - 9: printf("%d", (*tp)()); -10: } -11: -12: return !!argv[argc]; -13: } -14: extern void yaml_get_version(); -15: int t(void) { yaml_get_version(); return 0; } -/* end */ - --------------------- - diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/psych-5.2.6/psych.so b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/psych-5.2.6/psych.so deleted file mode 100755 index ac4c58929802604cde6ecc94b3532393fbd24a27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147880 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 "-lssl -lcrypto \n" -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lm -lpthread -lc" -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: int main(int argc, char **argv) -4: { -5: return !!argv[argc]; -6: } -/* end */ - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lruby-3.2 -lssl -lcrypto -lm -lpthread -lc" -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: int main(int argc, char **argv) -4: { -5: return !!argv[argc]; -6: } -/* end */ - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu x86_64-linux-gnu-pkg-config --cflags-only-I openssl | -=> "\n" -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu x86_64-linux-gnu-pkg-config --cflags-only-other openssl | -=> "\n" -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu x86_64-linux-gnu-pkg-config --libs-only-l openssl | -=> "-lssl -lcrypto \n" -package configuration for openssl -incflags: -cflags: -ldflags: -libs: -lssl -lcrypto - -have_header: checking for openssl/bio.h... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC -c conftest.c" -checked program was: -/* begin */ -1: #include "ruby.h" -2: -3: #include -/* end */ - --------------------- - -have_func: checking for DTLS_method() in openssl/ssl.h... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lssl -lcrypto -lruby-3.2 -lssl -lcrypto -lm -lpthread -lc" -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: #include - 4: - 5: /*top*/ - 6: extern int t(void); - 7: int main(int argc, char **argv) - 8: { - 9: if (argc > 1000000) { -10: int (* volatile tp)(void)=(int (*)(void))&t; -11: printf("%d", (*tp)()); -12: } -13: -14: return !!argv[argc]; -15: } -16: int t(void) { void ((*volatile p)()); p = (void ((*)()))DTLS_method; return !p; } -/* end */ - --------------------- - -have_func: checking for SSL_CTX_set_session_cache_mode(NULL, 0) in openssl/ssl.h... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lssl -lcrypto -lruby-3.2 -lssl -lcrypto -lm -lpthread -lc" -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: #include - 4: - 5: /*top*/ - 6: extern int t(void); - 7: int main(int argc, char **argv) - 8: { - 9: if (argc > 1000000) { -10: int (* volatile tp)(void)=(int (*)(void))&t; -11: printf("%d", (*tp)()); -12: } -13: -14: return !!argv[argc]; -15: } -16: -17: int t(void) { SSL_CTX_set_session_cache_mode(NULL, 0); return 0; } -/* end */ - --------------------- - -have_func: checking for TLS_server_method() in openssl/ssl.h... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lssl -lcrypto -lruby-3.2 -lssl -lcrypto -lm -lpthread -lc" -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: #include - 4: - 5: /*top*/ - 6: extern int t(void); - 7: int main(int argc, char **argv) - 8: { - 9: if (argc > 1000000) { -10: int (* volatile tp)(void)=(int (*)(void))&t; -11: printf("%d", (*tp)()); -12: } -13: -14: return !!argv[argc]; -15: } -16: int t(void) { void ((*volatile p)()); p = (void ((*)()))TLS_server_method; return !p; } -/* end */ - --------------------- - -have_func: checking for SSL_CTX_set_min_proto_version(NULL, 0) in openssl/ssl.h... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lssl -lcrypto -lruby-3.2 -lssl -lcrypto -lm -lpthread -lc" -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: #include - 4: - 5: /*top*/ - 6: extern int t(void); - 7: int main(int argc, char **argv) - 8: { - 9: if (argc > 1000000) { -10: int (* volatile tp)(void)=(int (*)(void))&t; -11: printf("%d", (*tp)()); -12: } -13: -14: return !!argv[argc]; -15: } -16: -17: int t(void) { SSL_CTX_set_min_proto_version(NULL, 0); return 0; } -/* end */ - --------------------- - -have_func: checking for SSL_CTX_set_dh_auto(NULL, 0) in openssl/ssl.h... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lssl -lcrypto -lruby-3.2 -lssl -lcrypto -lm -lpthread -lc" -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: #include - 4: - 5: /*top*/ - 6: extern int t(void); - 7: int main(int argc, char **argv) - 8: { - 9: if (argc > 1000000) { -10: int (* volatile tp)(void)=(int (*)(void))&t; -11: printf("%d", (*tp)()); -12: } -13: -14: return !!argv[argc]; -15: } -16: -17: int t(void) { SSL_CTX_set_dh_auto(NULL, 0); return 0; } -/* end */ - --------------------- - -have_func: checking for SSL_CTX_set_ciphersuites(NULL, "") in openssl/ssl.h... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lssl -lcrypto -lruby-3.2 -lssl -lcrypto -lm -lpthread -lc" -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: #include - 4: - 5: /*top*/ - 6: extern int t(void); - 7: int main(int argc, char **argv) - 8: { - 9: if (argc > 1000000) { -10: int (* volatile tp)(void)=(int (*)(void))&t; -11: printf("%d", (*tp)()); -12: } -13: -14: return !!argv[argc]; -15: } -16: -17: int t(void) { char s1[1024]; SSL_CTX_set_ciphersuites(NULL, s1); return 0; } -/* end */ - --------------------- - -have_func: checking for SSL_get1_peer_certificate() in openssl/ssl.h... -------------------- yes - -LD_LIBRARY_PATH=.:/usr/lib/x86_64-linux-gnu "x86_64-linux-gnu-gcc -o conftest -I/usr/include/x86_64-linux-gnu/ruby-3.2.0 -I/usr/include/ruby-3.2.0/ruby/backward -I/usr/include/ruby-3.2.0 -I. -Wdate-time -D_FORTIFY_SOURCE=3 -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC conftest.c -L. -L/usr/lib/x86_64-linux-gnu -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -lssl -lcrypto -lruby-3.2 -lssl -lcrypto -lm -lpthread -lc" -checked program was: -/* begin */ - 1: #include "ruby.h" - 2: - 3: #include - 4: - 5: /*top*/ - 6: extern int t(void); - 7: int main(int argc, char **argv) - 8: { - 9: if (argc > 1000000) { -10: int (* volatile tp)(void)=(int (*)(void))&t; -11: printf("%d", (*tp)()); -12: } -13: -14: return !!argv[argc]; -15: } -16: int t(void) { void ((*volatile p)()); p = (void ((*)()))SSL_get1_peer_certificate; return !p; } -/* end */ - --------------------- - diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/puma-6.6.1/puma/puma_http11.so b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/puma-6.6.1/puma/puma_http11.so deleted file mode 100755 index 4a104ac331acf46fd516928c9ca60ce090adc7d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141920 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 -4: -5: /*top*/ -6: typedef rb_io_mode_t conftest_type; -7: int conftestval[sizeof(conftest_type)?1:-1]; -/* end */ - --------------------- - diff --git a/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/stringio-3.1.7/stringio.so b/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux-gnu/3.2.0/stringio-3.1.7/stringio.so deleted file mode 100755 index eecb41c3329131ef8d9789e11c6a5abbfd341155..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184552 zcmeFa33OD&@;`njlVlPSm_R~ESO*A8WHAAP35z5^;0{b6vWW|XkcC7-5|bGgWr-wF z#&IyX`&=ISo<3ZjFHcc%!?5G>6cH6gB_hHdFVO1l^`_IJorXbG%;4e5}1D!538i-i71!Qs#?9RoauhKJDee@-S0I zQR0Y*K5@Jts|mG1@NE!$da3Ac5oHu-Q%Fa;wg`N1X%lpM8O*m|@CBDCf=@504f@Rf z%31vXroDW@xA`tEC%7yYdg!Iz-WA}}UBx;7`?qkXGE1} zNKU5^`g9K=e+is=AvxPZ$XSYZI|q1@1JpmZ3*di4yBDH&hG;iB1ioVke{Kum&(sij z4LV-P-fKd%`$Gu-yFuUY0`@Km(eB+L{QpS^yf1{D1tIj=6ar6U&~^bm{}Mv~p&{t6 z3ZYLL zL(tC+fj<$#Z~qCQe@h7Ze}s@f3G^2lcRz%XKP7}+Ux)Dj$PoCMA@J`4e<6K(govxV zLfHF32z#Gl?RHY~SAhVZTP?g)3JR7itEw!hbr#k*3ksA1`<%Rj;*y$@CFQlwlA1Yr zlPanzOXd_Vt|;Mk7p^HNT3J|7T3%ULQGP>-QsY{@s$gYlO$lxn7c40%SXNlGlx}Nk z>AR$|s9;HnQ@^cs))W*~q0Pd|C5(aU30YaPg7k8h7ZE987Q0FdiVB?tg|$WH<%BG+ zgp!pb=oS(SmaZtQS;E>_TC!?IRZVfhlJeyxl?ByAP*he@w3Nh@S1u`VuBv8j32=E~ zg^R&ug|%e`#V*D`dK9~sEnCI;D_zS*z!^(OR!L1wRZT%*O}TRw19NJY75?Kz!UExu3c4&&NaFWCc~U+lEb2U84y*h zo#K+kt|bU*9#EAo5LP=`bEP$f%SsBIW#zTZIV85cctq{0W!zrZGQ_&Gss`#5tSEPu z73hkgdqylS=K%)4m68u+-Ed#9Y;jRV3F~))Xxvm+QMU>tSqfj2m#%_&)rFNTh*+0k zco5C9l4V8JtEgC3wY-GNT0Runn95vS4!=n5a7j9mn4mFPjltwB4e}esC`0*mA*i%` z

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

_@@f3GNnW%cY(78oGTODIM(=K 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 ~bfWT+jDaVYXBes?doN)rzbH)D^6L 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[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
#{element}
\n) - end - private :htmlize - - # This will be called with both lines are the same - def match(event) - @output << htmlize(event.old_element, :match_class) - end - - # This will be called when there is a line in A that isn't in B - def discard_a(event) - @output << htmlize(event.old_element, :only_a_class) - end - - # This will be called when there is a line in B that isn't in A - def discard_b(event) - @output << htmlize(event.new_element, :only_b_class) - end - end - - # standard:disable Style/HashSyntax - DEFAULT_OPTIONS = { - :expand_tabs => nil, - :output => nil, - :css => nil, - :title => nil - }.freeze - # standard:enable Style/HashSyntax - - # standard:disable Layout/HeredocIndentation - DEFAULT_CSS = <<-CSS -body { margin: 0; } -.diff -{ - border: 1px solid black; - margin: 1em 2em; -} -p -{ - margin-left: 2em; -} -pre -{ - padding-left: 1em; - margin: 0; - font-family: Inconsolata, Consolas, Lucida, Courier, monospaced; - white-space: pre; -} -.match { } -.only_a -{ - background-color: #fdd; - color: red; - text-decoration: line-through; -} -.only_b -{ - background-color: #ddf; - color: blue; - border-left: 3px solid blue -} -h1 { margin-left: 2em; } - CSS - # standard:enable Layout/HeredocIndentation - - def initialize(left, right, options = nil) - @left = left - @right = right - @options = options - - @options = DEFAULT_OPTIONS.dup if @options.nil? - end - - def verify_options - @options[:expand_tabs] ||= 4 - @options[:expand_tabs] = 4 if @options[:expand_tabs].negative? - - @options[:output] ||= $stdout - - @options[:css] ||= DEFAULT_CSS.dup - - @options[:title] ||= "diff" - end - private :verify_options - - attr_reader :options - - def run - verify_options - - if @options[:expand_tabs].positive? && self.class.can_expand_tabs - formatter = Text::Format.new - formatter.tabstop = @options[:expand_tabs] - - @left.map! { |line| formatter.expand(line.chomp) } - @right.map! { |line| formatter.expand(line.chomp) } - end - - @left.map! { |line| ERB::Util.html_escape(line.chomp) } - @right.map! { |line| ERB::Util.html_escape(line.chomp) } - - # standard:disable Layout/HeredocIndentation - @options[:output] << <<-OUTPUT - - - #{@options[:title]} - - - -

#{@options[:title]}

-

Legend: Only in Old  - Only in New

-
- OUTPUT - # standard:enable Layout/HeredocIndentation - - callbacks = Callbacks.new(@options[:output]) - Diff::LCS.traverse_sequences(@left, @right, callbacks) - - # standard:disable Layout/HeredocIndentation - @options[:output] << <<-OUTPUT -
- - - OUTPUT - # standard:enable Layout/HeredocIndentation - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/hunk.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/hunk.rb deleted file mode 100644 index 24b33bc..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/hunk.rb +++ /dev/null @@ -1,379 +0,0 @@ -# frozen_string_literal: true - -require "diff/lcs/block" - -# A Hunk is a group of Blocks which overlap because of the context surrounding -# each block. (So if we're not using context, every hunk will contain one -# block.) Used in the diff program (bin/ldiff). -class Diff::LCS::Hunk - OLD_DIFF_OP_ACTION = {"+" => "a", "-" => "d", "!" => "c"}.freeze # :nodoc: - ED_DIFF_OP_ACTION = {"+" => "a", "-" => "d", "!" => "c"}.freeze # :nodoc: - - private_constant :OLD_DIFF_OP_ACTION, :ED_DIFF_OP_ACTION if respond_to?(:private_constant) - - # Create a hunk using references to both the old and new data, as well as the - # piece of data. - def initialize(data_old, data_new, piece, flag_context, file_length_difference) - # At first, a hunk will have just one Block in it - @blocks = [Diff::LCS::Block.new(piece)] - - if @blocks[0].remove.empty? && @blocks[0].insert.empty? - fail "Cannot build a hunk from #{piece.inspect}; has no add or remove actions" - end - - if String.method_defined?(:encoding) - @preferred_data_encoding = data_old.fetch(0) { data_new.fetch(0) { "" } }.encoding - end - - @data_old = data_old - @data_new = data_new - @old_empty = data_old.empty? || (data_old.size == 1 && data_old[0].empty?) - @new_empty = data_new.empty? || (data_new.size == 1 && data_new[0].empty?) - - before = after = file_length_difference - after += @blocks[0].diff_size - @file_length_difference = after # The caller must get this manually - @max_diff_size = @blocks.map { |e| e.diff_size.abs }.max - - # Save the start & end of each array. If the array doesn't exist (e.g., - # we're only adding items in this block), then figure out the line number - # based on the line number of the other file and the current difference in - # file lengths. - if @blocks[0].remove.empty? - a1 = a2 = nil - else - a1 = @blocks[0].remove[0].position - a2 = @blocks[0].remove[-1].position - end - - if @blocks[0].insert.empty? - b1 = b2 = nil - else - b1 = @blocks[0].insert[0].position - b2 = @blocks[0].insert[-1].position - end - - @start_old = a1 || (b1 - before) - @start_new = b1 || (a1 + before) - @end_old = a2 || (b2 - after) - @end_new = b2 || (a2 + after) - - self.flag_context = flag_context - end - - attr_reader :blocks - attr_reader :start_old, :start_new - attr_reader :end_old, :end_new - attr_reader :file_length_difference - - # Change the "start" and "end" fields to note that context should be added - # to this hunk. - attr_accessor :flag_context - undef :flag_context= - def flag_context=(context) # :nodoc: # standard:disable Lint/DuplicateMethods - return if context.nil? || context.zero? - - add_start = (context > @start_old) ? @start_old : context - - @start_old -= add_start - @start_new -= add_start - - old_size = @data_old.size - - add_end = - if (@end_old + context) >= old_size - old_size - @end_old - 1 - else - context - end - - @end_old += add_end - @end_new += add_end - end - - # Merges this hunk and the provided hunk together if they overlap. Returns - # a truthy value so that if there is no overlap, you can know the merge - # was skipped. - def merge(hunk) - return unless overlaps?(hunk) - - @start_old = hunk.start_old - @start_new = hunk.start_new - blocks.unshift(*hunk.blocks) - end - alias_method :unshift, :merge - - # Determines whether there is an overlap between this hunk and the - # provided hunk. This will be true if the difference between the two hunks - # start or end positions is within one position of each other. - def overlaps?(hunk) - hunk and (((@start_old - hunk.end_old) <= 1) or - ((@start_new - hunk.end_new) <= 1)) - end - - # Returns a diff string based on a format. - def diff(format, last = false) - case format - when :old - old_diff(last) - when :unified - unified_diff(last) - when :context - context_diff(last) - when :ed - self - when :reverse_ed, :ed_finish - ed_diff(format, last) - else - fail "Unknown diff format #{format}." - end - end - - # Note that an old diff can't have any context. Therefore, we know that - # there's only one block in the hunk. - def old_diff(last = false) - warn "Expecting only one block in an old diff hunk!" if @blocks.size > 1 - - block = @blocks[0] - - if last - old_missing_newline = !@old_empty && missing_last_newline?(@data_old) - new_missing_newline = !@new_empty && missing_last_newline?(@data_new) - end - - # Calculate item number range. Old diff range is just like a context - # diff range, except the ranges are on one line with the action between - # them. - s = encode("#{context_range(:old, ",")}#{OLD_DIFF_OP_ACTION[block.op]}#{context_range(:new, ",")}\n") - # If removing anything, just print out all the remove lines in the hunk - # which is just all the remove lines in the block. - unless block.remove.empty? - @data_old[@start_old..@end_old].each { |e| s << encode("< ") + e.chomp + encode("\n") } - end - - s << encode("\\ No newline at end of file\n") if old_missing_newline && !new_missing_newline - s << encode("---\n") if block.op == "!" - - unless block.insert.empty? - @data_new[@start_new..@end_new].each { |e| s << encode("> ") + e.chomp + encode("\n") } - end - - s << encode("\\ No newline at end of file\n") if new_missing_newline && !old_missing_newline - - s - end - private :old_diff - - def unified_diff(last = false) - # Calculate item number range. - s = encode("@@ -#{unified_range(:old)} +#{unified_range(:new)} @@\n") - - # Outlist starts containing the hunk of the old file. Removing an item - # just means putting a '-' in front of it. Inserting an item requires - # getting it from the new file and splicing it in. We splice in - # +num_added+ items. Remove blocks use +num_added+ because splicing - # changed the length of outlist. - # - # We remove +num_removed+ items. Insert blocks use +num_removed+ - # because their item numbers -- corresponding to positions in the NEW - # file -- don't take removed items into account. - lo, hi, num_added, num_removed = @start_old, @end_old, 0, 0 - - # standard:disable Performance/UnfreezeString - outlist = @data_old[lo..hi].map { |e| String.new("#{encode(" ")}#{e.chomp}") } - # standard:enable Performance/UnfreezeString - - last_block = blocks[-1] - - if last - old_missing_newline = !@old_empty && missing_last_newline?(@data_old) - new_missing_newline = !@new_empty && missing_last_newline?(@data_new) - end - - @blocks.each do |block| - block.remove.each do |item| - op = item.action.to_s # - - offset = item.position - lo + num_added - outlist[offset][0, 1] = encode(op) - num_removed += 1 - end - - if last && block == last_block && old_missing_newline && !new_missing_newline - outlist << encode('\\ No newline at end of file') - num_removed += 1 - end - - block.insert.each do |item| - op = item.action.to_s # + - offset = item.position - @start_new + num_removed - outlist[offset, 0] = encode(op) + @data_new[item.position].chomp - num_added += 1 - end - end - - outlist << encode('\\ No newline at end of file') if last && new_missing_newline - - s << outlist.join(encode("\n")) - - s - end - private :unified_diff - - def context_diff(last = false) - s = encode("***************\n") - s << encode("*** #{context_range(:old, ",")} ****\n") - r = context_range(:new, ",") - - if last - old_missing_newline = missing_last_newline?(@data_old) - new_missing_newline = missing_last_newline?(@data_new) - end - - # Print out file 1 part for each block in context diff format if there - # are any blocks that remove items - lo, hi = @start_old, @end_old - removes = @blocks.reject { |e| e.remove.empty? } - - unless removes.empty? - # standard:disable Performance/UnfreezeString - outlist = @data_old[lo..hi].map { |e| String.new("#{encode(" ")}#{e.chomp}") } - # standard:enable Performance/UnfreezeString - - last_block = removes[-1] - - removes.each do |block| - block.remove.each do |item| - outlist[item.position - lo][0, 1] = encode(block.op) # - or ! - end - - if last && block == last_block && old_missing_newline - outlist << encode('\\ No newline at end of file') - end - end - - s << outlist.join(encode("\n")) << encode("\n") - end - - s << encode("--- #{r} ----\n") - lo, hi = @start_new, @end_new - inserts = @blocks.reject { |e| e.insert.empty? } - - unless inserts.empty? - # standard:disable Performance/UnfreezeString - outlist = @data_new[lo..hi].map { |e| String.new("#{encode(" ")}#{e.chomp}") } - # standard:enable Performance/UnfreezeString - - last_block = inserts[-1] - - inserts.each do |block| - block.insert.each do |item| - outlist[item.position - lo][0, 1] = encode(block.op) # + or ! - end - - if last && block == last_block && new_missing_newline - outlist << encode('\\ No newline at end of file') - end - end - s << outlist.join(encode("\n")) - end - - s - end - private :context_diff - - def ed_diff(format, last) - warn "Expecting only one block in an old diff hunk!" if @blocks.size > 1 - if last - # ed script doesn't support well incomplete lines - warn ": No newline at end of file\n" if !@old_empty && missing_last_newline?(@data_old) - warn ": No newline at end of file\n" if !@new_empty && missing_last_newline?(@data_new) - - if @blocks[0].op == "!" - return +"" if @blocks[0].changes[0].element == @blocks[0].changes[1].element + "\n" - return +"" if @blocks[0].changes[0].element + "\n" == @blocks[0].changes[1].element - end - end - - s = - if format == :reverse_ed - encode("#{ED_DIFF_OP_ACTION[@blocks[0].op]}#{context_range(:old, " ")}\n") - else - encode("#{context_range(:old, ",")}#{ED_DIFF_OP_ACTION[@blocks[0].op]}\n") - end - - unless @blocks[0].insert.empty? - @data_new[@start_new..@end_new].each do |e| - s << e.chomp + encode("\n") - end - s << encode(".\n") - end - s - end - private :ed_diff - - # Generate a range of item numbers to print. Only print 1 number if the - # range has only one item in it. Otherwise, it's 'start,end' - def context_range(mode, op) - case mode - when :old - s, e = (@start_old + 1), (@end_old + 1) - when :new - s, e = (@start_new + 1), (@end_new + 1) - end - - (s < e) ? "#{s}#{op}#{e}" : e.to_s - end - private :context_range - - # Generate a range of item numbers to print for unified diff. Print number - # where block starts, followed by number of lines in the block - # (don't print number of lines if it's 1) - def unified_range(mode) - case mode - when :old - return "0,0" if @old_empty - s, e = (@start_old + 1), (@end_old + 1) - when :new - return "0,0" if @new_empty - s, e = (@start_new + 1), (@end_new + 1) - end - - length = e - s + 1 - - (length <= 1) ? e.to_s : "#{s},#{length}" - end - private :unified_range - - def missing_last_newline?(data) - newline = encode("\n") - - if data[-2] - data[-2].end_with?(newline) && !data[-1].end_with?(newline) - elsif data[-1] - !data[-1].end_with?(newline) - else - true - end - end - - if String.method_defined?(:encoding) - def encode(literal, target_encoding = @preferred_data_encoding) - literal.encode target_encoding - end - - def encode_as(string, *args) - args.map { |arg| arg.encode(string.encoding) } - end - else - def encode(literal, _target_encoding = nil) - literal - end - - def encode_as(_string, *args) - args - end - end - - private :encode - private :encode_as -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/internals.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/internals.rb deleted file mode 100644 index 8a9160a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/internals.rb +++ /dev/null @@ -1,308 +0,0 @@ -# frozen_string_literal: true - -class << Diff::LCS - def diff_traversal(method, seq1, seq2, callbacks, &block) - callbacks = callbacks_for(callbacks) - case method - when :diff - traverse_sequences(seq1, seq2, callbacks) - when :sdiff - traverse_balanced(seq1, seq2, callbacks) - end - callbacks.finish if callbacks.respond_to? :finish - - if block - callbacks.diffs.map do |hunk| - if hunk.is_a? Array - hunk.map { |hunk_block| block[hunk_block] } - else - block[hunk] - end - end - else - callbacks.diffs - end - end - private :diff_traversal -end - -module Diff::LCS::Internals # :nodoc: -end - -class << Diff::LCS::Internals - # Compute the longest common subsequence between the sequenced - # Enumerables +a+ and +b+. The result is an array whose contents is such - # that - # - # result = Diff::LCS::Internals.lcs(a, b) - # result.each_with_index do |e, i| - # assert_equal(a[i], b[e]) unless e.nil? - # end - def lcs(a, b) - a_start = b_start = 0 - a_finish = a.size - 1 - b_finish = b.size - 1 - vector = [] - - # Collect any common elements at the beginning... - while (a_start <= a_finish) && (b_start <= b_finish) && (a[a_start] == b[b_start]) - vector[a_start] = b_start - a_start += 1 - b_start += 1 - end - - # Now the end... - while (a_start <= a_finish) && (b_start <= b_finish) && (a[a_finish] == b[b_finish]) - vector[a_finish] = b_finish - a_finish -= 1 - b_finish -= 1 - end - - # Now, compute the equivalence classes of positions of elements. - # An explanation for how this works: https://codeforces.com/topic/92191 - b_matches = position_hash(b, b_start..b_finish) - - thresh = [] - links = [] - string = a.is_a?(String) - - (a_start..a_finish).each do |i| - ai = string ? a[i, 1] : a[i] - bm = b_matches[ai] - k = nil - bm.reverse_each do |j| - # Although the threshold check is not mandatory for this to work, - # it may have an optimization purpose - # An attempt to remove it: https://github.com/halostatue/diff-lcs/pull/72 - # Why it is reintroduced: https://github.com/halostatue/diff-lcs/issues/78 - if k && (thresh[k] > j) && (thresh[k - 1] < j) - thresh[k] = j - else - k = replace_next_larger(thresh, j, k) - end - links[k] = [k.positive? ? links[k - 1] : nil, i, j] unless k.nil? - end - end - - unless thresh.empty? - link = links[thresh.size - 1] - until link.nil? - vector[link[1]] = link[2] - link = link[0] - end - end - - vector - end - - # This method will analyze the provided patchset to provide a single-pass - # normalization (conversion of the array form of Diff::LCS::Change objects to - # the object form of same) and detection of whether the patchset represents - # changes to be made. - def analyze_patchset(patchset, depth = 0) - fail "Patchset too complex" if depth > 1 - - has_changes = false - new_patchset = [] - - # Format: - # [ # patchset - # # hunk (change) - # [ # hunk - # # change - # ] - # ] - - patchset.each do |hunk| - case hunk - when Diff::LCS::Change - has_changes ||= !hunk.unchanged? - new_patchset << hunk - when Array - # Detect if the 'hunk' is actually an array-format change object. - if Diff::LCS::Change.valid_action? hunk[0] - hunk = Diff::LCS::Change.from_a(hunk) - has_changes ||= !hunk.unchanged? - new_patchset << hunk - else - with_changes, hunk = analyze_patchset(hunk, depth + 1) - has_changes ||= with_changes - new_patchset.concat(hunk) - end - else - fail ArgumentError, "Cannot normalise a hunk of class #{hunk.class}." - end - end - - [has_changes, new_patchset] - end - - # Examine the patchset and the source to see in which direction the - # patch should be applied. - # - # WARNING: By default, this examines the whole patch, so this could take - # some time. This also works better with Diff::LCS::ContextChange or - # Diff::LCS::Change as its source, as an array will cause the creation - # of one of the above. - def intuit_diff_direction(src, patchset, limit = nil) - string = src.is_a?(String) - count = left_match = left_miss = right_match = right_miss = 0 - - patchset.each do |change| - count += 1 - - case change - when Diff::LCS::ContextChange - le = string ? src[change.old_position, 1] : src[change.old_position] - re = string ? src[change.new_position, 1] : src[change.new_position] - - case change.action - when "-" # Remove details from the old string - if le == change.old_element - left_match += 1 - else - left_miss += 1 - end - when "+" - if re == change.new_element - right_match += 1 - else - right_miss += 1 - end - when "=" - left_miss += 1 if le != change.old_element - right_miss += 1 if re != change.new_element - when "!" - if le == change.old_element - left_match += 1 - elsif re == change.new_element - right_match += 1 - else - left_miss += 1 - right_miss += 1 - end - end - when Diff::LCS::Change - # With a simplistic change, we can't tell the difference between - # the left and right on '!' actions, so we ignore those. On '=' - # actions, if there's a miss, we miss both left and right. - element = string ? src[change.position, 1] : src[change.position] - - case change.action - when "-" - if element == change.element - left_match += 1 - else - left_miss += 1 - end - when "+" - if element == change.element - right_match += 1 - else - right_miss += 1 - end - when "=" - if element != change.element - left_miss += 1 - right_miss += 1 - end - end - end - - break if !limit.nil? && (count > limit) - end - - no_left = left_match.zero? && left_miss.positive? - no_right = right_match.zero? && right_miss.positive? - - case [no_left, no_right] - when [false, true] - :patch - when [true, false] - :unpatch - else - case left_match <=> right_match - when 1 - if left_miss.zero? - :patch - else - :unpatch - end - when -1 - if right_miss.zero? - :unpatch - else - :patch - end - else - fail "The provided patchset does not appear to apply to the provided \ -enumerable as either source or destination value." - end - end - end - - # Find the place at which +value+ would normally be inserted into the - # Enumerable. If that place is already occupied by +value+, do nothing - # and return +nil+. If the place does not exist (i.e., it is off the end - # of the Enumerable), add it to the end. Otherwise, replace the element - # at that point with +value+. It is assumed that the Enumerable's values - # are numeric. - # - # This operation preserves the sort order. - def replace_next_larger(enum, value, last_index = nil) - # Off the end? - if enum.empty? || (value > enum[-1]) - enum << value - return enum.size - 1 - end - - # Binary search for the insertion point - last_index ||= enum.size - 1 - first_index = 0 - while first_index <= last_index - i = (first_index + last_index) >> 1 - - found = enum[i] - - return nil if value == found - - if value > found - first_index = i + 1 - else - last_index = i - 1 - end - end - - # The insertion point is in first_index; overwrite the next larger - # value. - enum[first_index] = value - first_index - end - private :replace_next_larger - - # If +vector+ maps the matching elements of another collection onto this - # Enumerable, compute the inverse of +vector+ that maps this Enumerable - # onto the collection. (Currently unused.) - def inverse_vector(a, vector) - inverse = a.dup - (0...vector.size).each do |i| - inverse[vector[i]] = i unless vector[i].nil? - end - inverse - end - private :inverse_vector - - # Returns a hash mapping each element of an Enumerable to the set of - # positions it occupies in the Enumerable, optionally restricted to the - # elements specified in the range of indexes specified by +interval+. - def position_hash(enum, interval) - string = enum.is_a?(String) - hash = Hash.new { |h, k| h[k] = [] } - interval.each do |i| - k = string ? enum[i, 1] : enum[i] - hash[k] << i - end - hash - end - private :position_hash -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/ldiff.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/ldiff.rb deleted file mode 100644 index 6442c9b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/ldiff.rb +++ /dev/null @@ -1,189 +0,0 @@ -# frozen_string_literal: true - -require "optparse" -require "diff/lcs/hunk" - -class Diff::LCS::Ldiff # :nodoc: - # standard:disable Layout/HeredocIndentation - BANNER = <<-COPYRIGHT -ldiff #{Diff::LCS::VERSION} - Copyright 2004-2025 Austin Ziegler - - Part of Diff::LCS. - https://github.com/halostatue/diff-lcs - - This program is free software. It may be redistributed and/or modified under - the terms of the GPL version 2 (or later), the Perl Artistic licence, or the - MIT licence. - COPYRIGHT - # standard:enable Layout/HeredocIndentation - - InputInfo = Struct.new(:filename, :data, :stat) do - def initialize(filename) - super(filename, ::File.read(filename), ::File.stat(filename)) - end - end - - attr_reader :format, :lines # :nodoc: - attr_reader :file_old, :file_new # :nodoc: - attr_reader :data_old, :data_new # :nodoc: - - def self.run(args, input = $stdin, output = $stdout, error = $stderr) # :nodoc: - new.run(args, input, output, error) - end - - def initialize - @binary = nil - @format = :old - @lines = 0 - end - - def run(args, _input = $stdin, output = $stdout, error = $stderr) # :nodoc: - args.options do |o| - o.banner = "Usage: #{File.basename($0)} [options] oldfile newfile" - o.separator "" - o.on( - "-c", "-C", "--context [LINES]", Integer, - "Displays a context diff with LINES lines", "of context. Default 3 lines." - ) do |ctx| - @format = :context - @lines = ctx || 3 - end - o.on( - "-u", "-U", "--unified [LINES]", Integer, - "Displays a unified diff with LINES lines", "of context. Default 3 lines." - ) do |ctx| - @format = :unified - @lines = ctx || 3 - end - o.on("-e", "Creates an 'ed' script to change", "oldfile to newfile.") do |_ctx| - @format = :ed - end - o.on("-f", "Creates an 'ed' script to change", "oldfile to newfile in reverse order.") do |_ctx| - @format = :reverse_ed - end - o.on( - "-a", "--text", - "Treat the files as text and compare them", "line-by-line, even if they do not seem", "to be text." - ) do |_txt| - @binary = false - end - o.on("--binary", "Treats the files as binary.") do |_bin| - @binary = true - end - o.on("-q", "--brief", "Report only whether or not the files", "differ, not the details.") do |_ctx| - @format = :report - end - o.on_tail("--help", "Shows this text.") do - error << o - return 0 - end - o.on_tail("--version", "Shows the version of Diff::LCS.") do - error << Diff::LCS::Ldiff::BANNER - return 0 - end - o.on_tail "" - o.on_tail 'By default, runs produces an "old-style" diff, with output like UNIX diff.' - o.parse! - end - - unless args.size == 2 - error << args.options - return 127 - end - - # Defaults are for old-style diff - @format ||= :old - @lines ||= 0 - - file_old, file_new = *ARGV - diff?( - InputInfo.new(file_old), - InputInfo.new(file_new), - @format, - output, - binary: @binary, - lines: @lines - ) ? 1 : 0 - end - - def diff?(info_old, info_new, format, output, binary: nil, lines: 0) - case format - when :context - char_old = "*" * 3 - char_new = "-" * 3 - when :unified - char_old = "-" * 3 - char_new = "+" * 3 - end - - # After we've read up to a certain point in each file, the number of - # items we've read from each file will differ by FLD (could be 0). - file_length_difference = 0 - - # Test binary status - if binary.nil? - old_bin = info_old.data[0, 4096].include?("\0") - new_bin = info_new.data[0, 4096].include?("\0") - binary = old_bin || new_bin - end - - # diff yields lots of pieces, each of which is basically a Block object - if binary - has_diffs = (info_old.data != info_new.data) - if format != :report - if has_diffs - output << "Binary files #{info_old.filename} and #{info_new.filename} differ\n" - return true - end - return false - end - else - data_old = info_old.data.lines.to_a - data_new = info_new.data.lines.to_a - diffs = Diff::LCS.diff(data_old, data_new) - return false if diffs.empty? - end - - case format - when :report - output << "Files #{info_old.filename} and #{info_new.filename} differ\n" - return true - when :unified, :context - ft = info_old.stat.mtime.localtime.strftime("%Y-%m-%d %H:%M:%S.000000000 %z") - output << "#{char_old} #{info_old.filename}\t#{ft}\n" - ft = info_new.stat.mtime.localtime.strftime("%Y-%m-%d %H:%M:%S.000000000 %z") - output << "#{char_new} #{info_new.filename}\t#{ft}\n" - when :ed - real_output = output - output = [] - end - - # Loop over hunks. If a hunk overlaps with the last hunk, join them. - # Otherwise, print out the old one. - oldhunk = hunk = nil - diffs.each do |piece| - begin - hunk = Diff::LCS::Hunk.new(data_old, data_new, piece, lines, file_length_difference) - file_length_difference = hunk.file_length_difference - - next unless oldhunk - next if lines.positive? && hunk.merge(oldhunk) - - output << oldhunk.diff(format) - output << "\n" if format == :unified - ensure - oldhunk = hunk - end - end - - last = oldhunk.diff(format, true) - last << "\n" unless last.is_a?(Diff::LCS::Hunk) || last.empty? || last.end_with?("\n") - - output << last - - output.reverse_each { |e| real_output << e.diff(:ed_finish, e == output[0]) } if format == :ed - - true - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/string.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/string.rb deleted file mode 100644 index 9ab32e9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/string.rb +++ /dev/null @@ -1,5 +0,0 @@ -# frozen_string_literal: true - -class String - include Diff::LCS -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/version.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/version.rb deleted file mode 100644 index 82830e3..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/version.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -module Diff - module LCS - VERSION = "1.6.2" - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/mise.toml b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/mise.toml deleted file mode 100644 index 22418cf..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/mise.toml +++ /dev/null @@ -1,5 +0,0 @@ -[tools] -ruby = "3.4" - -[env] -MAINTENANCE = "true" diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/change_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/change_spec.rb deleted file mode 100644 index 42533ae..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/change_spec.rb +++ /dev/null @@ -1,89 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe Diff::LCS::Change do - describe "an add" do - subject { described_class.new("+", 0, "element") } - it { should_not be_deleting } - it { should be_adding } - it { should_not be_unchanged } - it { should_not be_changed } - it { should_not be_finished_a } - it { should_not be_finished_b } - end - - describe "a delete" do - subject { described_class.new("-", 0, "element") } - it { should be_deleting } - it { should_not be_adding } - it { should_not be_unchanged } - it { should_not be_changed } - it { should_not be_finished_a } - it { should_not be_finished_b } - end - - describe "an unchanged" do - subject { described_class.new("=", 0, "element") } - it { should_not be_deleting } - it { should_not be_adding } - it { should be_unchanged } - it { should_not be_changed } - it { should_not be_finished_a } - it { should_not be_finished_b } - end - - describe "a changed" do - subject { described_class.new("!", 0, "element") } - it { should_not be_deleting } - it { should_not be_adding } - it { should_not be_unchanged } - it { should be_changed } - it { should_not be_finished_a } - it { should_not be_finished_b } - end - - describe "a finished_a" do - subject { described_class.new(">", 0, "element") } - it { should_not be_deleting } - it { should_not be_adding } - it { should_not be_unchanged } - it { should_not be_changed } - it { should be_finished_a } - it { should_not be_finished_b } - end - - describe "a finished_b" do - subject { described_class.new("<", 0, "element") } - it { should_not be_deleting } - it { should_not be_adding } - it { should_not be_unchanged } - it { should_not be_changed } - it { should_not be_finished_a } - it { should be_finished_b } - end - - describe "as array" do - it "should be converted" do - action, position, element = described_class.new("!", 0, "element") - expect(action).to eq "!" - expect(position).to eq 0 - expect(element).to eq "element" - end - end -end - -describe Diff::LCS::ContextChange do - describe "as array" do - it "should be converted" do - action, (old_position, old_element), (new_position, new_element) = - described_class.new("!", 1, "old_element", 2, "new_element") - - expect(action).to eq "!" - expect(old_position).to eq 1 - expect(old_element).to eq "old_element" - expect(new_position).to eq 2 - expect(new_element).to eq "new_element" - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/diff_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/diff_spec.rb deleted file mode 100644 index 869f098..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/diff_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe Diff::LCS, ".diff" do - include Diff::LCS::SpecHelper::Matchers - - it "correctly diffs seq1 to seq2" do - diff_s1_s2 = Diff::LCS.diff(seq1, seq2) - expect(change_diff(correct_forward_diff)).to eq(diff_s1_s2) - end - - it "correctly diffs seq2 to seq1" do - diff_s2_s1 = Diff::LCS.diff(seq2, seq1) - expect(change_diff(correct_backward_diff)).to eq(diff_s2_s1) - end - - it "correctly diffs against an empty sequence" do - diff = Diff::LCS.diff(word_sequence, []) - correct_diff = [ - [ - ["-", 0, "abcd"], - ["-", 1, "efgh"], - ["-", 2, "ijkl"], - ["-", 3, "mnopqrstuvwxyz"] - ] - ] - - expect(change_diff(correct_diff)).to eq(diff) - - diff = Diff::LCS.diff([], word_sequence) - correct_diff.each do |hunk| - hunk.each { |change| change[0] = "+" } - end - expect(change_diff(correct_diff)).to eq(diff) - end - - it "correctly diffs 'xx' and 'xaxb'" do - left = "xx" - right = "xaxb" - expect(Diff::LCS.patch(left, Diff::LCS.diff(left, right))).to eq(right) - end - - it "returns an empty diff with (hello, hello)" do - expect(Diff::LCS.diff(hello, hello)).to be_empty - end - - it "returns an empty diff with (hello_ary, hello_ary)" do - expect(Diff::LCS.diff(hello_ary, hello_ary)).to be_empty - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/123_x b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/123_x deleted file mode 100644 index cd34c23..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/123_x +++ /dev/null @@ -1,2 +0,0 @@ -123 -x diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/456_x b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/456_x deleted file mode 100644 index 9a823ac..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/456_x +++ /dev/null @@ -1,2 +0,0 @@ -456 -x diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/aX b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/aX deleted file mode 100644 index 5765d6a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/aX +++ /dev/null @@ -1 +0,0 @@ -aX diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/bXaX b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/bXaX deleted file mode 100644 index a1c813d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/bXaX +++ /dev/null @@ -1 +0,0 @@ -bXaX diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ds1.csv b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ds1.csv deleted file mode 100644 index 9ac8428..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ds1.csv +++ /dev/null @@ -1,50 +0,0 @@ -1,3 -2,7 -3,13 -4,21 -5,31 -6,43 -7,57 -8,73 -9,91 -10,111 -11,133 -12,157 -13,183 -14,211 -15,241 -16,273 -17,307 -18,343 -19,381 -20,421 -21,463 -22,507 -23,553 -24,601 -25,651 -26,703 -27,757 -28,813 -29,871 -30,931 -31,993 -32,1057 -33,1123 -34,1191 -35,1261 -36,1333 -37,1407 -38,1483 -39,1561 -40,1641 -41,1723 -42,1807 -43,1893 -44,1981 -45,2071 -46,2163 -47,2257 -48,2353 -49,2451 -50,2500 \ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ds2.csv b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ds2.csv deleted file mode 100644 index 797de76..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ds2.csv +++ /dev/null @@ -1,51 +0,0 @@ - 1,3 -2,7 -3,13 -4,21 -5,31 -6,42 -7,57 -8,73 -9,91 -10,111 -11,133 -12,157 -13,183 -14,211 -15,241 -16,273 -17,307 -18,343 -19,200 -20,421 -21,463 -22,507 -23,553 -24,601 -25,651 -26,703 -27,757 -28,813 -29,871 -30,931 -31,123 -32,1057 -33,1123 -34,1000 -35,1261 -36,1333 -37,1407 -38,1483 -39,1561 -40,1641 -41,1723 -42,1807 -43,1893 -44,1981 -45,2071 -46,2163 -47,1524 -48,2353 -49,2451 -50,2500 -51,2520 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/empty b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/empty deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/file1.bin b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/file1.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/file2.bin b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/file2.bin deleted file mode 100644 index ba18e3dcc474e720bdd955f81c8848324c862840..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6 Ncmc~u&B@7U000O<0u=xN diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/four_lines b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/four_lines deleted file mode 100644 index f384549..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/four_lines +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/four_lines_with_missing_new_line b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/four_lines_with_missing_new_line deleted file mode 100644 index c40a3bd..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/four_lines_with_missing_new_line +++ /dev/null @@ -1,4 +0,0 @@ -one -two -three -four \ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line1-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line1-e deleted file mode 100644 index 1e8a89c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line1-e +++ /dev/null @@ -1 +0,0 @@ -No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line1-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line1-f deleted file mode 100644 index 1e8a89c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line1-f +++ /dev/null @@ -1 +0,0 @@ -No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line2-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line2-e deleted file mode 100644 index 1e8a89c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line2-e +++ /dev/null @@ -1 +0,0 @@ -No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line2-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line2-f deleted file mode 100644 index 1e8a89c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/diff.missing_new_line2-f +++ /dev/null @@ -1 +0,0 @@ -No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.chef-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.chef-e deleted file mode 100644 index 8ed0319..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.chef-e +++ /dev/null @@ -1,2 +0,0 @@ -: No newline at end of file -: No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.chef-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.chef-f deleted file mode 100644 index 8ed0319..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.chef-f +++ /dev/null @@ -1,2 +0,0 @@ -: No newline at end of file -: No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line1-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line1-e deleted file mode 100644 index 397dd5b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line1-e +++ /dev/null @@ -1 +0,0 @@ -: No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line1-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line1-f deleted file mode 100644 index 397dd5b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line1-f +++ /dev/null @@ -1 +0,0 @@ -: No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line2-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line2-e deleted file mode 100644 index f9493ef..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line2-e +++ /dev/null @@ -1 +0,0 @@ -: No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line2-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line2-f deleted file mode 100644 index f9493ef..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/error.diff.missing_new_line2-f +++ /dev/null @@ -1 +0,0 @@ -: No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff deleted file mode 100644 index fa1a347..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff +++ /dev/null @@ -1,4 +0,0 @@ -1c1 -< aX ---- -> bXaX diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-c deleted file mode 100644 index 0e1ad99..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-c +++ /dev/null @@ -1,7 +0,0 @@ -*** spec/fixtures/aX 2020-06-23 11:15:32.000000000 -0400 ---- spec/fixtures/bXaX 2020-06-23 11:15:32.000000000 -0400 -*************** -*** 1 **** -! aX ---- 1 ---- -! bXaX diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-e deleted file mode 100644 index 13e0f7f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-e +++ /dev/null @@ -1,3 +0,0 @@ -1c -bXaX -. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-f deleted file mode 100644 index 77710c7..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-f +++ /dev/null @@ -1,3 +0,0 @@ -c1 -bXaX -. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-u deleted file mode 100644 index b84f718..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff-u +++ /dev/null @@ -1,5 +0,0 @@ ---- spec/fixtures/aX 2020-06-23 11:15:32.000000000 -0400 -+++ spec/fixtures/bXaX 2020-06-23 11:15:32.000000000 -0400 -@@ -1 +1 @@ --aX -+bXaX diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1 b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1 deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-c deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-e deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-f deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin1-u deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2 b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2 deleted file mode 100644 index 41b625c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2 +++ /dev/null @@ -1 +0,0 @@ -Binary files spec/fixtures/file1.bin and spec/fixtures/file2.bin differ diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-c deleted file mode 100644 index 41b625c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-c +++ /dev/null @@ -1 +0,0 @@ -Binary files spec/fixtures/file1.bin and spec/fixtures/file2.bin differ diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-e deleted file mode 100644 index 41b625c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-e +++ /dev/null @@ -1 +0,0 @@ -Binary files spec/fixtures/file1.bin and spec/fixtures/file2.bin differ diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-f deleted file mode 100644 index 41b625c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-f +++ /dev/null @@ -1 +0,0 @@ -Binary files spec/fixtures/file1.bin and spec/fixtures/file2.bin differ diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-u deleted file mode 100644 index 41b625c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.bin2-u +++ /dev/null @@ -1 +0,0 @@ -Binary files spec/fixtures/file1.bin and spec/fixtures/file2.bin differ diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef deleted file mode 100644 index 8b98efb..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef +++ /dev/null @@ -1,4 +0,0 @@ -3c3 -< "description": "hi" ---- -> "description": "lo" diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-c deleted file mode 100644 index efbfa19..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-c +++ /dev/null @@ -1,15 +0,0 @@ -*** spec/fixtures/old-chef 2020-06-23 23:18:20.000000000 -0400 ---- spec/fixtures/new-chef 2020-06-23 23:18:20.000000000 -0400 -*************** -*** 1,4 **** - { - "name": "x", -! "description": "hi" - } -\ No newline at end of file ---- 1,4 ---- - { - "name": "x", -! "description": "lo" - } -\ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-e deleted file mode 100644 index 775d881..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-e +++ /dev/null @@ -1,3 +0,0 @@ -3c - "description": "lo" -. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-f deleted file mode 100644 index 9bf1e67..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-f +++ /dev/null @@ -1,3 +0,0 @@ -c3 - "description": "lo" -. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-u deleted file mode 100644 index dbacd88..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef-u +++ /dev/null @@ -1,9 +0,0 @@ ---- spec/fixtures/old-chef 2020-06-23 23:18:20.000000000 -0400 -+++ spec/fixtures/new-chef 2020-06-23 23:18:20.000000000 -0400 -@@ -1,4 +1,4 @@ - { - "name": "x", -- "description": "hi" -+ "description": "lo" - } -\ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2 b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2 deleted file mode 100644 index 496b3dc..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2 +++ /dev/null @@ -1,7 +0,0 @@ -2d1 -< recipe[b::default] -14a14,17 -> recipe[o::new] -> recipe[p::new] -> recipe[q::new] -> recipe[r::new] diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-c deleted file mode 100644 index 8349a7a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-c +++ /dev/null @@ -1,20 +0,0 @@ -*** spec/fixtures/old-chef2 2020-06-30 09:43:35.000000000 -0400 ---- spec/fixtures/new-chef2 2020-06-30 09:44:32.000000000 -0400 -*************** -*** 1,5 **** - recipe[a::default] -- recipe[b::default] - recipe[c::default] - recipe[d::default] - recipe[e::default] ---- 1,4 ---- -*************** -*** 12,14 **** ---- 11,17 ---- - recipe[l::default] - recipe[m::default] - recipe[n::default] -+ recipe[o::new] -+ recipe[p::new] -+ recipe[q::new] -+ recipe[r::new] diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-d b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-d deleted file mode 100644 index ca32a49..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-d +++ /dev/null @@ -1,7 +0,0 @@ -d2 -a14 -recipe[o::new] -recipe[p::new] -recipe[q::new] -recipe[r::new] -. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-e deleted file mode 100644 index 89f3fa0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-e +++ /dev/null @@ -1,7 +0,0 @@ -14a -recipe[o::new] -recipe[p::new] -recipe[q::new] -recipe[r::new] -. -2d diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-f deleted file mode 100644 index ca32a49..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-f +++ /dev/null @@ -1,7 +0,0 @@ -d2 -a14 -recipe[o::new] -recipe[p::new] -recipe[q::new] -recipe[r::new] -. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-u deleted file mode 100644 index ef025c7..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.chef2-u +++ /dev/null @@ -1,16 +0,0 @@ ---- spec/fixtures/old-chef2 2020-06-30 09:43:35.000000000 -0400 -+++ spec/fixtures/new-chef2 2020-06-30 09:44:32.000000000 -0400 -@@ -1,5 +1,4 @@ - recipe[a::default] --recipe[b::default] - recipe[c::default] - recipe[d::default] - recipe[e::default] -@@ -12,3 +11,7 @@ - recipe[l::default] - recipe[m::default] - recipe[n::default] -+recipe[o::new] -+recipe[p::new] -+recipe[q::new] -+recipe[r::new] diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines deleted file mode 100644 index e2afc31..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines +++ /dev/null @@ -1,5 +0,0 @@ -0a1,4 -> one -> two -> three -> four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-c deleted file mode 100644 index be0e827..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-c +++ /dev/null @@ -1,9 +0,0 @@ -*** spec/fixtures/empty 2025-01-31 12:14:52.856031635 +0100 ---- spec/fixtures/four_lines 2025-01-31 12:13:45.476036544 +0100 -*************** -*** 0 **** ---- 1,4 ---- -+ one -+ two -+ three -+ four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-e deleted file mode 100644 index f8f92fe..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-e +++ /dev/null @@ -1,6 +0,0 @@ -0a -one -two -three -four -. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-f deleted file mode 100644 index f02e5a0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-f +++ /dev/null @@ -1,6 +0,0 @@ -a0 -one -two -three -four -. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-u deleted file mode 100644 index 60bd55c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.empty.vs.four_lines-u +++ /dev/null @@ -1,7 +0,0 @@ ---- spec/fixtures/empty 2025-01-31 12:14:52.856031635 +0100 -+++ spec/fixtures/four_lines 2025-01-31 12:13:45.476036544 +0100 -@@ -0,0 +1,4 @@ -+one -+two -+three -+four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty deleted file mode 100644 index 67d0a58..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty +++ /dev/null @@ -1,5 +0,0 @@ -1,4d0 -< one -< two -< three -< four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-c deleted file mode 100644 index b216344..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-c +++ /dev/null @@ -1,9 +0,0 @@ -*** spec/fixtures/four_lines 2025-01-31 12:13:45.476036544 +0100 ---- spec/fixtures/empty 2025-01-31 12:14:52.856031635 +0100 -*************** -*** 1,4 **** -- one -- two -- three -- four ---- 0 ---- diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-e deleted file mode 100644 index c821d7c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-e +++ /dev/null @@ -1 +0,0 @@ -1,4d diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-f deleted file mode 100644 index 442bd5a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-f +++ /dev/null @@ -1 +0,0 @@ -d1 4 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-u deleted file mode 100644 index 79e6d75..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.four_lines.vs.empty-u +++ /dev/null @@ -1,7 +0,0 @@ ---- spec/fixtures/four_lines 2025-01-31 12:13:45.476036544 +0100 -+++ spec/fixtures/empty 2025-01-31 12:14:52.856031635 +0100 -@@ -1,4 +0,0 @@ --one --two --three --four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context deleted file mode 100644 index 4335560..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context +++ /dev/null @@ -1,4 +0,0 @@ -1c1 -< 123 ---- -> 456 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-c deleted file mode 100644 index 4b759fa..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-c +++ /dev/null @@ -1,9 +0,0 @@ -*** spec/fixtures/123_x 2025-01-31 17:00:17.070615716 +0100 ---- spec/fixtures/456_x 2025-01-31 16:58:26.380624827 +0100 -*************** -*** 1,2 **** -! 123 - x ---- 1,2 ---- -! 456 - x diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-e deleted file mode 100644 index 7a8334b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-e +++ /dev/null @@ -1,3 +0,0 @@ -1c -456 -. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-f deleted file mode 100644 index 97223a8..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-f +++ /dev/null @@ -1,3 +0,0 @@ -c1 -456 -. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-u deleted file mode 100644 index 7fbf0e2..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.issue95_trailing_context-u +++ /dev/null @@ -1,6 +0,0 @@ ---- spec/fixtures/123_x 2025-01-31 17:00:17.070615716 +0100 -+++ spec/fixtures/456_x 2025-01-31 16:58:26.380624827 +0100 -@@ -1,2 +1,2 @@ --123 -+456 - x diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1 b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1 deleted file mode 100644 index c5cb113..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1 +++ /dev/null @@ -1,5 +0,0 @@ -4c4 -< four ---- -> four -\ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-c deleted file mode 100644 index 55d1ade..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-c +++ /dev/null @@ -1,14 +0,0 @@ -*** spec/fixtures/four_lines 2025-01-31 12:17:43.926013315 +0100 ---- spec/fixtures/four_lines_with_missing_new_line 2025-01-31 12:17:43.926013315 +0100 -*************** -*** 1,4 **** - one - two - three -! four ---- 1,4 ---- - one - two - three -! four -\ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-e deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-f deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-u deleted file mode 100644 index 010518b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line1-u +++ /dev/null @@ -1,9 +0,0 @@ ---- spec/fixtures/four_lines 2025-01-31 12:17:43.926013315 +0100 -+++ spec/fixtures/four_lines_with_missing_new_line 2025-01-31 12:17:43.926013315 +0100 -@@ -1,4 +1,4 @@ - one - two - three --four -+four -\ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2 b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2 deleted file mode 100644 index 10e4326..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2 +++ /dev/null @@ -1,5 +0,0 @@ -4c4 -< four -\ No newline at end of file ---- -> four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-c b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-c deleted file mode 100644 index b431030..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-c +++ /dev/null @@ -1,14 +0,0 @@ -*** spec/fixtures/four_lines_with_missing_new_line 2025-01-31 12:17:43.926013315 +0100 ---- spec/fixtures/four_lines 2025-01-31 12:17:43.926013315 +0100 -*************** -*** 1,4 **** - one - two - three -! four -\ No newline at end of file ---- 1,4 ---- - one - two - three -! four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-e b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-e deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-f b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-f deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-u b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-u deleted file mode 100644 index 2481a9e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/ldiff/output.diff.missing_new_line2-u +++ /dev/null @@ -1,9 +0,0 @@ ---- spec/fixtures/four_lines_with_missing_new_line 2025-01-31 12:17:43.926013315 +0100 -+++ spec/fixtures/four_lines 2025-01-31 12:17:43.926013315 +0100 -@@ -1,4 +1,4 @@ - one - two - three --four -\ No newline at end of file -+four diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/new-chef b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/new-chef deleted file mode 100644 index d7babfe..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/new-chef +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "x", - "description": "lo" -} \ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/new-chef2 b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/new-chef2 deleted file mode 100644 index 8213c73..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/new-chef2 +++ /dev/null @@ -1,17 +0,0 @@ -recipe[a::default] -recipe[c::default] -recipe[d::default] -recipe[e::default] -recipe[f::default] -recipe[g::default] -recipe[h::default] -recipe[i::default] -recipe[j::default] -recipe[k::default] -recipe[l::default] -recipe[m::default] -recipe[n::default] -recipe[o::new] -recipe[p::new] -recipe[q::new] -recipe[r::new] diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/old-chef b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/old-chef deleted file mode 100644 index 5f9e38b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/old-chef +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "x", - "description": "hi" -} \ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/old-chef2 b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/old-chef2 deleted file mode 100644 index 4a23407..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/fixtures/old-chef2 +++ /dev/null @@ -1,14 +0,0 @@ -recipe[a::default] -recipe[b::default] -recipe[c::default] -recipe[d::default] -recipe[e::default] -recipe[f::default] -recipe[g::default] -recipe[h::default] -recipe[i::default] -recipe[j::default] -recipe[k::default] -recipe[l::default] -recipe[m::default] -recipe[n::default] diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/hunk_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/hunk_spec.rb deleted file mode 100644 index 7d91039..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/hunk_spec.rb +++ /dev/null @@ -1,83 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -if String.method_defined?(:encoding) - require "diff/lcs/hunk" - - describe Diff::LCS::Hunk do - let(:old_data) { ["Tu a un carté avec {count} itéms".encode("UTF-16LE")] } - let(:new_data) { ["Tu a un carte avec {count} items".encode("UTF-16LE")] } - let(:pieces) { Diff::LCS.diff old_data, new_data } - let(:hunk) { Diff::LCS::Hunk.new(old_data, new_data, pieces[0], 3, 0) } - - it "produces a unified diff from the two pieces" do - expected = <<-EXPECTED.gsub(/^\s+/, "").encode("UTF-16LE").chomp - @@ -1 +1 @@ - -Tu a un carté avec {count} itéms - +Tu a un carte avec {count} items - EXPECTED - - expect(hunk.diff(:unified)).to eq(expected) - end - - it "produces a unified diff from the two pieces (last entry)" do - expected = <<-EXPECTED.gsub(/^\s+/, "").encode("UTF-16LE").chomp - @@ -1 +1 @@ - -Tu a un carté avec {count} itéms - +Tu a un carte avec {count} items - \\ No newline at end of file - EXPECTED - - expect(hunk.diff(:unified, true)).to eq(expected) - end - - it "produces a context diff from the two pieces" do - expected = <<-EXPECTED.gsub(/^\s+/, "").encode("UTF-16LE").chomp - *************** - *** 1 **** - ! Tu a un carté avec {count} itéms - --- 1 ---- - ! Tu a un carte avec {count} items - EXPECTED - - expect(hunk.diff(:context)).to eq(expected) - end - - it "produces an old diff from the two pieces" do - expected = <<-EXPECTED.gsub(/^ +/, "").encode("UTF-16LE").chomp - 1c1 - < Tu a un carté avec {count} itéms - --- - > Tu a un carte avec {count} items - - EXPECTED - - expect(hunk.diff(:old)).to eq(expected) - end - - it "produces a reverse ed diff from the two pieces" do - expected = <<-EXPECTED.gsub(/^ +/, "").encode("UTF-16LE").chomp - c1 - Tu a un carte avec {count} items - . - - EXPECTED - - expect(hunk.diff(:reverse_ed)).to eq(expected) - end - - context "with empty first data set" do - let(:old_data) { [] } - - it "produces a unified diff" do - expected = <<-EXPECTED.gsub(/^\s+/, "").encode("UTF-16LE").chomp - @@ -0,0 +1 @@ - +Tu a un carte avec {count} items - EXPECTED - - expect(hunk.diff(:unified)).to eq(expected) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/issues_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/issues_spec.rb deleted file mode 100644 index 5b0fb2a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/issues_spec.rb +++ /dev/null @@ -1,160 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" -require "diff/lcs/hunk" - -describe "Diff::LCS Issues" do - include Diff::LCS::SpecHelper::Matchers - - describe "issue #1" do - shared_examples "handles simple diffs" do |s1, s2, forward_diff| - before do - @diff_s1_s2 = Diff::LCS.diff(s1, s2) - end - - it "creates the correct diff" do - expect(change_diff(forward_diff)).to eq(@diff_s1_s2) - end - - it "creates the correct patch s1->s2" do - expect(Diff::LCS.patch(s1, @diff_s1_s2)).to eq(s2) - end - - it "creates the correct patch s2->s1" do - expect(Diff::LCS.patch(s2, @diff_s1_s2)).to eq(s1) - end - end - - describe "string" do - it_has_behavior "handles simple diffs", "aX", "bXaX", [ - [ - ["+", 0, "b"], - ["+", 1, "X"] - ] - ] - it_has_behavior "handles simple diffs", "bXaX", "aX", [ - [ - ["-", 0, "b"], - ["-", 1, "X"] - ] - ] - end - - describe "array" do - it_has_behavior "handles simple diffs", %w[a X], %w[b X a X], [ - [ - ["+", 0, "b"], - ["+", 1, "X"] - ] - ] - it_has_behavior "handles simple diffs", %w[b X a X], %w[a X], [ - [ - ["-", 0, "b"], - ["-", 1, "X"] - ] - ] - end - end - - describe "issue #57" do - it "should fail with a correct error" do - # standard:disable Style/HashSyntax - expect { - actual = {:category => "app.rack.request"} - expected = {:category => "rack.middleware", :title => "Anonymous Middleware"} - expect(actual).to eq(expected) - }.to raise_error(RSpec::Expectations::ExpectationNotMetError) - # standard:enable Style/HashSyntax - end - end - - describe "issue #65" do - def diff_lines(old_lines, new_lines) - file_length_difference = 0 - previous_hunk = nil - output = [] - - Diff::LCS.diff(old_lines, new_lines).each do |piece| - hunk = Diff::LCS::Hunk.new(old_lines, new_lines, piece, 3, file_length_difference) - file_length_difference = hunk.file_length_difference - maybe_contiguous_hunks = previous_hunk.nil? || hunk.merge(previous_hunk) - - output << "#{previous_hunk.diff(:unified)}\n" unless maybe_contiguous_hunks - - previous_hunk = hunk - end - output << "#{previous_hunk.diff(:unified, true)}\n" unless previous_hunk.nil? - output.join - end - - it "should not misplace the new chunk" do - old_data = [ - "recipe[a::default]", "recipe[b::default]", "recipe[c::default]", - "recipe[d::default]", "recipe[e::default]", "recipe[f::default]", - "recipe[g::default]", "recipe[h::default]", "recipe[i::default]", - "recipe[j::default]", "recipe[k::default]", "recipe[l::default]", - "recipe[m::default]", "recipe[n::default]" - ] - - new_data = [ - "recipe[a::default]", "recipe[c::default]", "recipe[d::default]", - "recipe[e::default]", "recipe[f::default]", "recipe[g::default]", - "recipe[h::default]", "recipe[i::default]", "recipe[j::default]", - "recipe[k::default]", "recipe[l::default]", "recipe[m::default]", - "recipe[n::default]", "recipe[o::new]", "recipe[p::new]", - "recipe[q::new]", "recipe[r::new]" - ] - - # standard:disable Layout/HeredocIndentation - expect(diff_lines(old_data, new_data)).to eq(<<-EODIFF) -@@ -1,5 +1,4 @@ - recipe[a::default] --recipe[b::default] - recipe[c::default] - recipe[d::default] - recipe[e::default] -@@ -12,3 +11,7 @@ - recipe[l::default] - recipe[m::default] - recipe[n::default] -+recipe[o::new] -+recipe[p::new] -+recipe[q::new] -+recipe[r::new] - EODIFF - # standard:enable Layout/HeredocIndentation - end - end - - describe "issue #107 (replaces issue #60)" do - it "should produce unified output with correct context" do - # standard:disable Layout/HeredocIndentation - old_data = <<-DATA_OLD.strip.split("\n").map(&:chomp) -{ - "name": "x", - "description": "hi" -} - DATA_OLD - - new_data = <<-DATA_NEW.strip.split("\n").map(&:chomp) -{ - "name": "x", - "description": "lo" -} - DATA_NEW - - diff = ::Diff::LCS.diff(old_data, new_data) - hunk = ::Diff::LCS::Hunk.new(old_data, new_data, diff.first, 3, 0) - - expect(hunk.diff(:unified)).to eq(<<-EXPECTED.chomp) -@@ -1,4 +1,4 @@ - { - "name": "x", -- "description": "hi" -+ "description": "lo" - } - EXPECTED - # standard:enable Layout/HeredocIndentation - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/lcs_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/lcs_spec.rb deleted file mode 100644 index c17f22f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/lcs_spec.rb +++ /dev/null @@ -1,56 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe Diff::LCS::Internals, ".lcs" do - include Diff::LCS::SpecHelper::Matchers - - it "returns a meaningful LCS array with (seq1, seq2)" do - res = Diff::LCS::Internals.lcs(seq1, seq2) - # The result of the LCS (less the +nil+ values) must be as long as the - # correct result. - expect(res.compact.size).to eq(correct_lcs.size) - expect(res).to correctly_map_sequence(seq1).to_other_sequence(seq2) - - # Compact these transformations and they should be the correct LCS. - x_seq1 = (0...res.size).map { |ix| res[ix] ? seq1[ix] : nil }.compact - x_seq2 = (0...res.size).map { |ix| res[ix] ? seq2[res[ix]] : nil }.compact - - expect(x_seq1).to eq(correct_lcs) - expect(x_seq2).to eq(correct_lcs) - end - - it "returns all indexes with (hello, hello)" do - expect(Diff::LCS::Internals.lcs(hello, hello)).to \ - eq((0...hello.size).to_a) - end - - it "returns all indexes with (hello_ary, hello_ary)" do - expect(Diff::LCS::Internals.lcs(hello_ary, hello_ary)).to \ - eq((0...hello_ary.size).to_a) - end -end - -describe Diff::LCS, ".LCS" do - include Diff::LCS::SpecHelper::Matchers - - it "returns the correct compacted values from Diff::LCS.LCS" do - res = Diff::LCS.LCS(seq1, seq2) - expect(res).to eq(correct_lcs) - expect(res.compact).to eq(res) - end - - it "is transitive" do - res = Diff::LCS.LCS(seq2, seq1) - expect(res).to eq(correct_lcs) - expect(res.compact).to eq(res) - end - - it "returns %W(h e l l o) with (hello, hello)" do - expect(Diff::LCS.LCS(hello, hello)).to eq(hello.chars) - end - - it "returns hello_ary with (hello_ary, hello_ary)" do - expect(Diff::LCS.LCS(hello_ary, hello_ary)).to eq(hello_ary) - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/ldiff_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/ldiff_spec.rb deleted file mode 100644 index e13b561..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/ldiff_spec.rb +++ /dev/null @@ -1,100 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -RSpec.describe "bin/ldiff" do - include CaptureSubprocessIO - - # standard:disable Style/HashSyntax - fixtures = [ - {:name => "diff", :left => "aX", :right => "bXaX", :diff => 1}, - {:name => "diff.missing_new_line1", :left => "four_lines", :right => "four_lines_with_missing_new_line", :diff => 1}, - {:name => "diff.missing_new_line2", :left => "four_lines_with_missing_new_line", :right => "four_lines", :diff => 1}, - {:name => "diff.issue95_trailing_context", :left => "123_x", :right => "456_x", :diff => 1}, - {:name => "diff.four_lines.vs.empty", :left => "four_lines", :right => "empty", :diff => 1}, - {:name => "diff.empty.vs.four_lines", :left => "empty", :right => "four_lines", :diff => 1}, - {:name => "diff.bin1", :left => "file1.bin", :right => "file1.bin", :diff => 0}, - {:name => "diff.bin2", :left => "file1.bin", :right => "file2.bin", :diff => 1}, - {:name => "diff.chef", :left => "old-chef", :right => "new-chef", :diff => 1}, - {:name => "diff.chef2", :left => "old-chef2", :right => "new-chef2", :diff => 1} - ].product([nil, "-e", "-f", "-c", "-u"]).map { |(fixture, flag)| - fixture = fixture.dup - fixture[:flag] = flag - fixture - } - # standard:enable Style/HashSyntax - - def self.test_ldiff(fixture) - desc = [ - fixture[:flag], - "spec/fixtures/#{fixture[:left]}", - "spec/fixtures/#{fixture[:right]}", - "#", - "=>", - "spec/fixtures/ldiff/output.#{fixture[:name]}#{fixture[:flag]}" - ].join(" ") - - it desc do - stdout, stderr, status = run_ldiff(fixture) - expect(status).to eq(fixture[:diff]) - expect(stderr).to eq(read_fixture(fixture, mode: "error", allow_missing: true)) - expect(stdout).to eq(read_fixture(fixture, mode: "output", allow_missing: false)) - end - end - - fixtures.each do |fixture| - test_ldiff(fixture) - end - - def read_fixture(options, mode: "output", allow_missing: false) - fixture = options.fetch(:name) - flag = options.fetch(:flag) - name = "spec/fixtures/ldiff/#{mode}.#{fixture}#{flag}" - - return "" if !::File.exist?(name) && allow_missing - - data = IO.__send__(IO.respond_to?(:binread) ? :binread : :read, name) - clean_data(data, flag) - end - - def clean_data(data, flag) - data = - case flag - when "-c", "-u" - clean_output_timestamp(data) - else - data - end - data.gsub(/\r\n?/, "\n") - end - - def clean_output_timestamp(data) - data.gsub( - %r{ - ^ - [-+*]{3} - \s* - spec/fixtures/(\S+) - \s* - \d{4}-\d\d-\d\d - \s* - \d\d:\d\d:\d\d(?:\.\d+) - \s* - (?:[-+]\d{4}|Z) - }x, - '*** spec/fixtures/\1 0000-00-00 :00 =>:00 =>00.000000000 -0000' - ) - end - - def run_ldiff(options) - flag = options.fetch(:flag) - left = options.fetch(:left) - right = options.fetch(:right) - - stdout, stderr = capture_subprocess_io do - system("ruby -Ilib bin/ldiff #{flag} spec/fixtures/#{left} spec/fixtures/#{right}") - end - - [clean_data(stdout, flag), stderr, $?.exitstatus] - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/patch_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/patch_spec.rb deleted file mode 100644 index 8fc3ee2..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/patch_spec.rb +++ /dev/null @@ -1,416 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe "Diff::LCS.patch" do - include Diff::LCS::SpecHelper::Matchers - - shared_examples "patch sequences correctly" do - it "correctly patches left-to-right (patch autodiscovery)" do - expect(Diff::LCS.patch(s1, patch_set)).to eq(s2) - end - - it "correctly patches left-to-right (explicit patch)" do - expect(Diff::LCS.patch(s1, patch_set, :patch)).to eq(s2) - expect(Diff::LCS.patch!(s1, patch_set)).to eq(s2) - end - - it "correctly patches right-to-left (unpatch autodiscovery)" do - expect(Diff::LCS.patch(s2, patch_set)).to eq(s1) - end - - it "correctly patches right-to-left (explicit unpatch)" do - expect(Diff::LCS.patch(s2, patch_set, :unpatch)).to eq(s1) - expect(Diff::LCS.unpatch!(s2, patch_set)).to eq(s1) - end - end - - describe "using a Diff::LCS.diff patchset" do - describe "an empty patchset returns the source" do - it "works on a string (hello)" do - diff = Diff::LCS.diff(hello, hello) - expect(Diff::LCS.patch(hello, diff)).to eq(hello) - end - - it "works on an array %W(h e l l o)" do - diff = Diff::LCS.diff(hello_ary, hello_ary) - expect(Diff::LCS.patch(hello_ary, diff)).to eq(hello_ary) - end - end - - describe "with default diff callbacks (DiffCallbacks)" do - describe "forward (s1 -> s2)" do - it_has_behavior "patch sequences correctly" do - let(:s1) { seq1 } - let(:s2) { seq2 } - let(:patch_set) { Diff::LCS.diff(seq1, seq2) } - end - end - - describe "reverse (s2 -> s1)" do - it_has_behavior "patch sequences correctly" do - let(:s1) { seq2 } - let(:s2) { seq1 } - let(:patch_set) { Diff::LCS.diff(seq2, seq1) } - end - end - end - - describe "with context diff callbacks (ContextDiffCallbacks)" do - describe "forward (s1 -> s2)" do - it_has_behavior "patch sequences correctly" do - let(:s1) { seq1 } - let(:s2) { seq2 } - let(:patch_set) { - Diff::LCS.diff(seq1, seq2, Diff::LCS::ContextDiffCallbacks) - } - end - end - - describe "reverse (s2 -> s1)" do - it_has_behavior "patch sequences correctly" do - let(:s1) { seq2 } - let(:s2) { seq1 } - let(:patch_set) { - Diff::LCS.diff(seq2, seq1, Diff::LCS::ContextDiffCallbacks) - } - end - end - end - - describe "with sdiff callbacks (SDiffCallbacks)" do - describe "forward (s1 -> s2)" do - it_has_behavior "patch sequences correctly" do - let(:s1) { seq1 } - let(:s2) { seq2 } - let(:patch_set) { - Diff::LCS.diff(seq1, seq2, Diff::LCS::SDiffCallbacks) - } - end - end - - describe "reverse (s2 -> s1)" do - it_has_behavior "patch sequences correctly" do - let(:s1) { seq2 } - let(:s2) { seq1 } - let(:patch_set) { - Diff::LCS.diff(seq2, seq1, Diff::LCS::SDiffCallbacks) - } - end - end - end - end - - describe "using a Diff::LCS.sdiff patchset" do - describe "an empty patchset returns the source" do - it "works on a string (hello)" do - expect(Diff::LCS.patch(hello, Diff::LCS.sdiff(hello, hello))).to eq(hello) - end - - it "works on an array %W(h e l l o)" do - expect(Diff::LCS.patch(hello_ary, Diff::LCS.sdiff(hello_ary, hello_ary))).to eq(hello_ary) - end - end - - describe "with default diff callbacks (DiffCallbacks)" do - describe "forward (s1 -> s2)" do - it_has_behavior "patch sequences correctly" do - let(:s1) { seq1 } - let(:s2) { seq2 } - let(:patch_set) { - Diff::LCS.sdiff(seq1, seq2, Diff::LCS::DiffCallbacks) - } - end - end - - describe "reverse (s2 -> s1)" do - it_has_behavior "patch sequences correctly" do - let(:s1) { seq2 } - let(:s2) { seq1 } - let(:patch_set) { - Diff::LCS.sdiff(seq2, seq1, Diff::LCS::DiffCallbacks) - } - end - end - end - - describe "with context diff callbacks (DiffCallbacks)" do - describe "forward (s1 -> s2)" do - it_has_behavior "patch sequences correctly" do - let(:s1) { seq1 } - let(:s2) { seq2 } - let(:patch_set) { - Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextDiffCallbacks) - } - end - end - - describe "reverse (s2 -> s1)" do - it_has_behavior "patch sequences correctly" do - let(:s1) { seq2 } - let(:s2) { seq1 } - let(:patch_set) { - Diff::LCS.sdiff(seq2, seq1, Diff::LCS::ContextDiffCallbacks) - } - end - end - end - - describe "with sdiff callbacks (SDiffCallbacks)" do - describe "forward (s1 -> s2)" do - it_has_behavior "patch sequences correctly" do - let(:s1) { seq1 } - let(:s2) { seq2 } - let(:patch_set) { Diff::LCS.sdiff(seq1, seq2) } - end - end - - describe "reverse (s2 -> s1)" do - it_has_behavior "patch sequences correctly" do - let(:s1) { seq2 } - let(:s2) { seq1 } - let(:patch_set) { Diff::LCS.sdiff(seq2, seq1) } - end - end - end - end - - # Note: because of the error in autodiscovery ("does not autodiscover s1 - # to s2 patches"), this cannot use the "patch sequences correctly" shared - # set. Once the bug in autodiscovery is fixed, this can be converted as - # above. - describe "fix bug 891: patchsets do not contain the last equal part" do - before :each do - @s1 = %w[a b c d e f g h i j k] # standard:disable Layout/SpaceInsideArrayPercentLiteral - @s2 = %w[a b c d D e f g h i j k] - end - - describe "using Diff::LCS.diff with default diff callbacks" do - before :each do - @patch_set_s1_s2 = Diff::LCS.diff(@s1, @s2) - @patch_set_s2_s1 = Diff::LCS.diff(@s2, @s1) - end - - it "autodiscovers s1 to s2 patches" do - expect do - expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) - end.to_not raise_error - end - - it "autodiscovers s2 to s1 patches" do - expect do - expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) - end.to_not raise_error - end - - it "autodiscovers s2 to s1 the left-to-right patches" do - expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) - expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) - end - - it "correctly patches left-to-right (explicit patch)" do - expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) - expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) - expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) - expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) - end - - it "correctly patches right-to-left (explicit unpatch)" do - expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) - expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) - expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) - expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) - end - end - - describe "using Diff::LCS.diff with context diff callbacks" do - before :each do - @patch_set_s1_s2 = Diff::LCS.diff(@s1, @s2, Diff::LCS::ContextDiffCallbacks) - @patch_set_s2_s1 = Diff::LCS.diff(@s2, @s1, Diff::LCS::ContextDiffCallbacks) - end - - it "autodiscovers s1 to s2 patches" do - expect do - expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) - end.to_not raise_error - end - - it "autodiscovers s2 to s1 patches" do - expect do - expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) - end.to_not raise_error - end - - it "autodiscovers s2 to s1 the left-to-right patches" do - expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) - expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) - end - - it "correctly patches left-to-right (explicit patch)" do - expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) - expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) - expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) - expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) - end - - it "correctly patches right-to-left (explicit unpatch)" do - expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) - expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) - expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) - expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) - end - end - - describe "using Diff::LCS.diff with sdiff callbacks" do - before(:each) do - @patch_set_s1_s2 = Diff::LCS.diff(@s1, @s2, Diff::LCS::SDiffCallbacks) - @patch_set_s2_s1 = Diff::LCS.diff(@s2, @s1, Diff::LCS::SDiffCallbacks) - end - - it "autodiscovers s1 to s2 patches" do - expect do - expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) - end.to_not raise_error - end - - it "autodiscovers s2 to s1 patches" do - expect do - expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) - end.to_not raise_error - end - - it "autodiscovers s2 to s1 the left-to-right patches" do - expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) - expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) - end - - it "correctly patches left-to-right (explicit patch)" do - expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) - expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) - expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) - expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) - end - - it "correctly patches right-to-left (explicit unpatch)" do - expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) - expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) - expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) - expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) - end - end - - describe "using Diff::LCS.sdiff with default sdiff callbacks" do - before(:each) do - @patch_set_s1_s2 = Diff::LCS.sdiff(@s1, @s2) - @patch_set_s2_s1 = Diff::LCS.sdiff(@s2, @s1) - end - - it "autodiscovers s1 to s2 patches" do - expect do - expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) - end.to_not raise_error - end - - it "autodiscovers s2 to s1 patches" do - expect do - expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) - end.to_not raise_error - end - - it "autodiscovers s2 to s1 the left-to-right patches" do - expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) - expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) - end - - it "correctly patches left-to-right (explicit patch)" do - expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) - expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) - expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) - expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) - end - - it "correctly patches right-to-left (explicit unpatch)" do - expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) - expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) - expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) - expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) - end - end - - describe "using Diff::LCS.sdiff with context diff callbacks" do - before(:each) do - @patch_set_s1_s2 = Diff::LCS.sdiff(@s1, @s2, Diff::LCS::ContextDiffCallbacks) - @patch_set_s2_s1 = Diff::LCS.sdiff(@s2, @s1, Diff::LCS::ContextDiffCallbacks) - end - - it "autodiscovers s1 to s2 patches" do - expect do - expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) - end.to_not raise_error - end - - it "autodiscovers s2 to s1 patches" do - expect do - expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) - end.to_not raise_error - end - - it "autodiscovers s2 to s1 the left-to-right patches" do - expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) - expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) - end - - it "correctly patches left-to-right (explicit patch)" do - expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) - expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) - expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) - expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) - end - - it "correctly patches right-to-left (explicit unpatch)" do - expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) - expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) - expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) - expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) - end - end - - describe "using Diff::LCS.sdiff with default diff callbacks" do - before(:each) do - @patch_set_s1_s2 = Diff::LCS.sdiff(@s1, @s2, Diff::LCS::DiffCallbacks) - @patch_set_s2_s1 = Diff::LCS.sdiff(@s2, @s1, Diff::LCS::DiffCallbacks) - end - - it "autodiscovers s1 to s2 patches" do - expect do - expect(Diff::LCS.patch(@s1, @patch_set_s1_s2)).to eq(@s2) - end.to_not raise_error - end - - it "autodiscovers s2 to s1 patches" do - expect do - expect(Diff::LCS.patch(@s1, @patch_set_s2_s1)).to eq(@s2) - end.to_not raise_error - end - - it "autodiscovers s2 to s1 the left-to-right patches" do - expect(Diff::LCS.patch(@s2, @patch_set_s2_s1)).to eq(@s1) - expect(Diff::LCS.patch(@s2, @patch_set_s1_s2)).to eq(@s1) - end - - it "correctly patches left-to-right (explicit patch)" do - expect(Diff::LCS.patch(@s1, @patch_set_s1_s2, :patch)).to eq(@s2) - expect(Diff::LCS.patch(@s2, @patch_set_s2_s1, :patch)).to eq(@s1) - expect(Diff::LCS.patch!(@s1, @patch_set_s1_s2)).to eq(@s2) - expect(Diff::LCS.patch!(@s2, @patch_set_s2_s1)).to eq(@s1) - end - - it "correctly patches right-to-left (explicit unpatch)" do - expect(Diff::LCS.patch(@s2, @patch_set_s1_s2, :unpatch)).to eq(@s1) - expect(Diff::LCS.patch(@s1, @patch_set_s2_s1, :unpatch)).to eq(@s2) - expect(Diff::LCS.unpatch!(@s2, @patch_set_s1_s2)).to eq(@s1) - expect(Diff::LCS.unpatch!(@s1, @patch_set_s2_s1)).to eq(@s2) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/sdiff_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/sdiff_spec.rb deleted file mode 100644 index aded301..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/sdiff_spec.rb +++ /dev/null @@ -1,216 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe "Diff::LCS.sdiff" do - include Diff::LCS::SpecHelper::Matchers - - shared_examples "compare sequences correctly" do - it "compares s1 -> s2 correctly" do - expect(Diff::LCS.sdiff(s1, s2)).to eq(context_diff(result)) - end - - it "compares s2 -> s1 correctly" do - expect(Diff::LCS.sdiff(s2, s1)).to eq(context_diff(reverse_sdiff(result))) - end - end - - describe "using seq1 & seq2" do - let(:s1) { seq1 } - let(:s2) { seq2 } - let(:result) { correct_forward_sdiff } - - it_has_behavior "compare sequences correctly" - end - - describe "using %w(abc def yyy xxx ghi jkl) & %w(abc dxf xxx ghi jkl)" do - let(:s1) { %w[abc def yyy xxx ghi jkl] } - let(:s2) { %w[abc dxf xxx ghi jkl] } - let(:result) { - # standard:disable Layout/ExtraSpacing - [ - ["=", [0, "abc"], [0, "abc"]], - ["!", [1, "def"], [1, "dxf"]], - ["-", [2, "yyy"], [2, nil]], - ["=", [3, "xxx"], [2, "xxx"]], - ["=", [4, "ghi"], [3, "ghi"]], - ["=", [5, "jkl"], [4, "jkl"]] - ] - # standard:enable Layout/ExtraSpacing - } - - it_has_behavior "compare sequences correctly" - end - - describe "using %w(a b c d e) & %w(a e)" do - let(:s1) { %w[a b c d e] } - let(:s2) { %w[a e] } - let(:result) { - [ - ["=", [0, "a"], [0, "a"]], - ["-", [1, "b"], [1, nil]], - ["-", [2, "c"], [1, nil]], - ["-", [3, "d"], [1, nil]], - ["=", [4, "e"], [1, "e"]] - ] - } - - it_has_behavior "compare sequences correctly" - end - - describe "using %w(a e) & %w(a b c d e)" do - let(:s1) { %w[a e] } - let(:s2) { %w[a b c d e] } - let(:result) { - [ - ["=", [0, "a"], [0, "a"]], - ["+", [1, nil], [1, "b"]], - ["+", [1, nil], [2, "c"]], - ["+", [1, nil], [3, "d"]], - ["=", [1, "e"], [4, "e"]] - ] - } - - it_has_behavior "compare sequences correctly" - end - - describe "using %w(v x a e) & %w(w y a b c d e)" do - let(:s1) { %w[v x a e] } - let(:s2) { %w[w y a b c d e] } - let(:result) { - [ - ["!", [0, "v"], [0, "w"]], - ["!", [1, "x"], [1, "y"]], - ["=", [2, "a"], [2, "a"]], - ["+", [3, nil], [3, "b"]], - ["+", [3, nil], [4, "c"]], - ["+", [3, nil], [5, "d"]], - ["=", [3, "e"], [6, "e"]] - ] - } - - it_has_behavior "compare sequences correctly" - end - - describe "using %w(x a e) & %w(a b c d e)" do - let(:s1) { %w[x a e] } - let(:s2) { %w[a b c d e] } - let(:result) { - [ - ["-", [0, "x"], [0, nil]], - ["=", [1, "a"], [0, "a"]], - ["+", [2, nil], [1, "b"]], - ["+", [2, nil], [2, "c"]], - ["+", [2, nil], [3, "d"]], - ["=", [2, "e"], [4, "e"]] - ] - } - - it_has_behavior "compare sequences correctly" - end - - describe "using %w(a e) & %w(x a b c d e)" do - let(:s1) { %w[a e] } - let(:s2) { %w[x a b c d e] } - let(:result) { - [ - ["+", [0, nil], [0, "x"]], - ["=", [0, "a"], [1, "a"]], - ["+", [1, nil], [2, "b"]], - ["+", [1, nil], [3, "c"]], - ["+", [1, nil], [4, "d"]], - ["=", [1, "e"], [5, "e"]] - ] - } - - it_has_behavior "compare sequences correctly" - end - - describe "using %w(a e v) & %w(x a b c d e w x)" do - let(:s1) { %w[a e v] } - let(:s2) { %w[x a b c d e w x] } - let(:result) { - [ - ["+", [0, nil], [0, "x"]], - ["=", [0, "a"], [1, "a"]], - ["+", [1, nil], [2, "b"]], - ["+", [1, nil], [3, "c"]], - ["+", [1, nil], [4, "d"]], - ["=", [1, "e"], [5, "e"]], - ["!", [2, "v"], [6, "w"]], - ["+", [3, nil], [7, "x"]] - ] - } - - it_has_behavior "compare sequences correctly" - end - - describe "using %w() & %w(a b c)" do - let(:s1) { %w[] } - let(:s2) { %w[a b c] } - let(:result) { - [ - ["+", [0, nil], [0, "a"]], - ["+", [0, nil], [1, "b"]], - ["+", [0, nil], [2, "c"]] - ] - } - - it_has_behavior "compare sequences correctly" - end - - describe "using %w(a b c) & %w(1)" do - let(:s1) { %w[a b c] } - let(:s2) { %w[1] } - let(:result) { - [ - ["!", [0, "a"], [0, "1"]], - ["-", [1, "b"], [1, nil]], - ["-", [2, "c"], [1, nil]] - ] - } - - it_has_behavior "compare sequences correctly" - end - - describe "using %w(a b c) & %w(c)" do - let(:s1) { %w[a b c] } - let(:s2) { %w[c] } - let(:result) { - [ - ["-", [0, "a"], [0, nil]], - ["-", [1, "b"], [0, nil]], - ["=", [2, "c"], [0, "c"]] - ] - } - - it_has_behavior "compare sequences correctly" - end - - describe "using %w(abcd efgh ijkl mnop) & []" do - let(:s1) { %w[abcd efgh ijkl mnop] } - let(:s2) { [] } - let(:result) { - [ - ["-", [0, "abcd"], [0, nil]], - ["-", [1, "efgh"], [0, nil]], - ["-", [2, "ijkl"], [0, nil]], - ["-", [3, "mnop"], [0, nil]] - ] - } - - it_has_behavior "compare sequences correctly" - end - - describe "using [[1,2]] & []" do - let(:s1) { [[1, 2]] } - let(:s2) { [] } - let(:result) { - [ - ["-", [0, [1, 2]], [0, nil]] - ] - } - - it_has_behavior "compare sequences correctly" - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/spec_helper.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/spec_helper.rb deleted file mode 100644 index baaa3d0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/spec_helper.rb +++ /dev/null @@ -1,376 +0,0 @@ -# frozen_string_literal: true - -require "rubygems" -require "pathname" - -require "psych" if RUBY_VERSION >= "1.9" - -if ENV["COVERAGE"] - require "simplecov" - require "simplecov-lcov" - - SimpleCov::Formatter::LcovFormatter.config do |config| - config.report_with_single_file = true - config.lcov_file_name = "lcov.info" - end - - SimpleCov.start "test_frameworks" do - enable_coverage :branch - primary_coverage :branch - formatter SimpleCov::Formatter::MultiFormatter.new([ - SimpleCov::Formatter::HTMLFormatter, - SimpleCov::Formatter::LcovFormatter, - SimpleCov::Formatter::SimpleFormatter - ]) - end -end - -file = Pathname.new(__FILE__).expand_path -path = file.parent -parent = path.parent - -$:.unshift parent.join("lib") - -module CaptureSubprocessIO - def _synchronize - yield - end - - def capture_subprocess_io - _synchronize { _capture_subprocess_io { yield } } - end - - def _capture_subprocess_io - require "tempfile" - - captured_stdout, captured_stderr = Tempfile.new("out"), Tempfile.new("err") - - orig_stdout, orig_stderr = $stdout.dup, $stderr.dup - $stdout.reopen captured_stdout - $stderr.reopen captured_stderr - - yield - - $stdout.rewind - $stderr.rewind - - [captured_stdout.read, captured_stderr.read] - ensure - captured_stdout.unlink - captured_stderr.unlink - $stdout.reopen orig_stdout - $stderr.reopen orig_stderr - end - private :_capture_subprocess_io -end - -require "diff-lcs" - -module Diff::LCS::SpecHelper - def hello - "hello" - end - - def hello_ary - %w[h e l l o] - end - - def seq1 - %w[a b c e h j l m n p] - end - - def skipped_seq1 - %w[a h n p] - end - - def seq2 - %w[b c d e f j k l m r s t] - end - - def skipped_seq2 - %w[d f k r s t] - end - - def word_sequence - %w[abcd efgh ijkl mnopqrstuvwxyz] - end - - def correct_lcs - %w[b c e j l m] - end - - # standard:disable Layout/ExtraSpacing - def correct_forward_diff - [ - [ - ["-", 0, "a"] - ], - [ - ["+", 2, "d"] - ], - [ - ["-", 4, "h"], - ["+", 4, "f"] - ], - [ - ["+", 6, "k"] - ], - [ - ["-", 8, "n"], - ["+", 9, "r"], - ["-", 9, "p"], - ["+", 10, "s"], - ["+", 11, "t"] - ] - ] - end - - def correct_backward_diff - [ - [ - ["+", 0, "a"] - ], - [ - ["-", 2, "d"] - ], - [ - ["-", 4, "f"], - ["+", 4, "h"] - ], - [ - ["-", 6, "k"] - ], - [ - ["-", 9, "r"], - ["+", 8, "n"], - ["-", 10, "s"], - ["+", 9, "p"], - ["-", 11, "t"] - ] - ] - end - - def correct_forward_sdiff - [ - ["-", [0, "a"], [0, nil]], - ["=", [1, "b"], [0, "b"]], - ["=", [2, "c"], [1, "c"]], - ["+", [3, nil], [2, "d"]], - ["=", [3, "e"], [3, "e"]], - ["!", [4, "h"], [4, "f"]], - ["=", [5, "j"], [5, "j"]], - ["+", [6, nil], [6, "k"]], - ["=", [6, "l"], [7, "l"]], - ["=", [7, "m"], [8, "m"]], - ["!", [8, "n"], [9, "r"]], - ["!", [9, "p"], [10, "s"]], - ["+", [10, nil], [11, "t"]] - ] - end - # standard:enable Layout/ExtraSpacing - - def reverse_sdiff(forward_sdiff) - forward_sdiff.map { |line| - line[1], line[2] = line[2], line[1] - case line[0] - when "-" then line[0] = "+" - when "+" then line[0] = "-" - end - line - } - end - - def change_diff(diff) - map_diffs(diff, Diff::LCS::Change) - end - - def context_diff(diff) - map_diffs(diff, Diff::LCS::ContextChange) - end - - def format_diffs(diffs) - diffs.map { |e| - if e.is_a?(Array) - e.map { |f| f.to_a.join }.join(", ") - else - e.to_a.join - end - }.join("\n") - end - - def map_diffs(diffs, klass = Diff::LCS::ContextChange) - diffs.map do |chunks| - if klass == Diff::LCS::ContextChange - klass.from_a(chunks) - else - chunks.map { |changes| klass.from_a(changes) } - end - end - end - - def balanced_traversal(s1, s2, callback_type) - callback = __send__(callback_type) - Diff::LCS.traverse_balanced(s1, s2, callback) - callback - end - - def balanced_reverse(change_result) - new_result = [] - change_result.each do |line| - line = [line[0], line[2], line[1]] - case line[0] - when "<" - line[0] = ">" - when ">" - line[0] = "<" - end - new_result << line - end - new_result.sort_by { |line| [line[1], line[2]] } - end - - def map_to_no_change(change_result) - new_result = [] - change_result.each do |line| - case line[0] - when "!" - new_result << ["<", line[1], line[2]] - new_result << [">", line[1] + 1, line[2]] - else - new_result << line - end - end - new_result - end - - class SimpleCallback - def initialize - reset - end - - attr_reader :matched_a - attr_reader :matched_b - attr_reader :discards_a - attr_reader :discards_b - attr_reader :done_a - attr_reader :done_b - - def reset - @matched_a = [] - @matched_b = [] - @discards_a = [] - @discards_b = [] - @done_a = [] - @done_b = [] - self - end - - def match(event) - @matched_a << event.old_element - @matched_b << event.new_element - end - - def discard_b(event) - @discards_b << event.new_element - end - - def discard_a(event) - @discards_a << event.old_element - end - - def finished_a(event) - @done_a << [ - event.old_element, event.old_position, - event.new_element, event.new_position - ] - end - - def finished_b(event) - @done_b << [ - event.old_element, event.old_position, - event.new_element, event.new_position - ] - end - end - - def simple_callback - SimpleCallback.new - end - - class SimpleCallbackNoFinishers < SimpleCallback - undef :finished_a - undef :finished_b - end - - def simple_callback_no_finishers - SimpleCallbackNoFinishers.new - end - - class BalancedCallback - def initialize - reset - end - - attr_reader :result - - def reset - @result = [] - end - - def match(event) - @result << ["=", event.old_position, event.new_position] - end - - def discard_a(event) - @result << ["<", event.old_position, event.new_position] - end - - def discard_b(event) - @result << [">", event.old_position, event.new_position] - end - - def change(event) - @result << ["!", event.old_position, event.new_position] - end - end - - def balanced_callback - BalancedCallback.new - end - - class BalancedCallbackNoChange < BalancedCallback - undef :change - end - - def balanced_callback_no_change - BalancedCallbackNoChange.new - end - - module Matchers - extend RSpec::Matchers::DSL - - matcher :be_nil_or_match_values do |ii, s1, s2| - match do |ee| - expect(ee).to(satisfy { |vee| vee.nil? || s1[ii] == s2[ee] }) - end - end - - matcher :correctly_map_sequence do |s1| - match do |actual| - actual.each_index { |ii| expect(actual[ii]).to be_nil_or_match_values(ii, s1, @s2) } - end - - chain :to_other_sequence do |s2| - @s2 = s2 - end - end - end -end - -RSpec.configure do |conf| - conf.include Diff::LCS::SpecHelper - conf.alias_it_should_behave_like_to :it_has_behavior, "has behavior:" - # standard:disable Style/HashSyntax - conf.filter_run_excluding :broken => true - # standard:enable Style/HashSyntax -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/traverse_balanced_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/traverse_balanced_spec.rb deleted file mode 100644 index 3a3f677..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/traverse_balanced_spec.rb +++ /dev/null @@ -1,312 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe "Diff::LCS.traverse_balanced" do - include Diff::LCS::SpecHelper::Matchers - - shared_examples "with a #change callback" do |s1, s2, result| - it "traverses s1 -> s2 correctly" do - traversal = balanced_traversal(s1, s2, :balanced_callback) - expect(traversal.result).to eq(result) - end - - it "traverses s2 -> s1 correctly" do - traversal = balanced_traversal(s2, s1, :balanced_callback) - expect(traversal.result).to eq(balanced_reverse(result)) - end - end - - shared_examples "without a #change callback" do |s1, s2, result| - it "traverses s1 -> s2 correctly" do - traversal = balanced_traversal(s1, s2, :balanced_callback_no_change) - expect(traversal.result).to eq(map_to_no_change(result)) - end - - it "traverses s2 -> s1 correctly" do - traversal = balanced_traversal(s2, s1, :balanced_callback_no_change) - expect(traversal.result).to eq(map_to_no_change(balanced_reverse(result))) - end - end - - describe "identical string sequences ('abc')" do - s1 = s2 = "abc" - - result = [ - ["=", 0, 0], - ["=", 1, 1], - ["=", 2, 2] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "identical array sequences %w(a b c)" do - s1 = s2 = %w[a b c] - - result = [ - ["=", 0, 0], - ["=", 1, 1], - ["=", 2, 2] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "sequences %w(a b c) & %w(a x c)" do - s1 = %w[a b c] - s2 = %w[a x c] - - result = [ - ["=", 0, 0], - ["!", 1, 1], - ["=", 2, 2] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "sequences %w(a x y c) & %w(a v w c)" do - s1 = %w[a x y c] - s2 = %w[a v w c] - - result = [ - ["=", 0, 0], - ["!", 1, 1], - ["!", 2, 2], - ["=", 3, 3] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "sequences %w(x y c) & %w(v w c)" do - s1 = %w[x y c] - s2 = %w[v w c] - result = [ - ["!", 0, 0], - ["!", 1, 1], - ["=", 2, 2] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "sequences %w(a x y z) & %w(b v w)" do - s1 = %w[a x y z] - s2 = %w[b v w] - result = [ - ["!", 0, 0], - ["!", 1, 1], - ["!", 2, 2], - ["<", 3, 3] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "sequences %w(a z) & %w(a)" do - s1 = %w[a z] - s2 = %w[a] - result = [ - ["=", 0, 0], - ["<", 1, 1] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "sequences %w(z a) & %w(a)" do - s1 = %w[z a] - s2 = %w[a] - result = [ - ["<", 0, 0], - ["=", 1, 0] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "sequences %w(a b c) & %w(x y z)" do - s1 = %w[a b c] - s2 = %w[x y z] - result = [ - ["!", 0, 0], - ["!", 1, 1], - ["!", 2, 2] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "sequences %w(abcd efgh ijkl mnoopqrstuvwxyz) & []" do - s1 = %w[abcd efgh ijkl mnopqrstuvwxyz] - s2 = [] - result = [ - ["<", 0, 0], - ["<", 1, 0], - ["<", 2, 0], - ["<", 3, 0] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "strings %q(a b c) & %q(a x c)" do - s1 = "a b c" - s2 = "a x c" - - result = [ - ["=", 0, 0], - ["=", 1, 1], - ["!", 2, 2], - ["=", 3, 3], - ["=", 4, 4] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "strings %q(a x y c) & %q(a v w c)" do - s1 = "a x y c" - s2 = "a v w c" - - result = [ - ["=", 0, 0], - ["=", 1, 1], - ["!", 2, 2], - ["=", 3, 3], - ["!", 4, 4], - ["=", 5, 5], - ["=", 6, 6] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "strings %q(x y c) & %q(v w c)" do - s1 = "x y c" - s2 = "v w c" - result = [ - ["!", 0, 0], - ["=", 1, 1], - ["!", 2, 2], - ["=", 3, 3], - ["=", 4, 4] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "strings %q(a x y z) & %q(b v w)" do - s1 = "a x y z" - s2 = "b v w" - result = [ - ["!", 0, 0], - ["=", 1, 1], - ["!", 2, 2], - ["=", 3, 3], - ["!", 4, 4], - ["<", 5, 5], - ["<", 6, 5] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "strings %q(a z) & %q(a)" do - s1 = "a z" - s2 = "a" - result = [ - ["=", 0, 0], - ["<", 1, 1], - ["<", 2, 1] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "strings %q(z a) & %q(a)" do - s1 = "z a" - s2 = "a" - result = [ - ["<", 0, 0], - ["<", 1, 0], - ["=", 2, 0] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "strings %q(a b c) & %q(x y z)" do - s1 = "a b c" - s2 = "x y z" - result = [ - ["!", 0, 0], - ["=", 1, 1], - ["!", 2, 2], - ["=", 3, 3], - ["!", 4, 4] - ] - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end - - describe "strings %q(abcd efgh ijkl mnopqrstuvwxyz) & %q()" do - s1 = "abcd efgh ijkl mnopqrstuvwxyz" - s2 = "" - # standard:disable Layout/ExtraSpacing - result = [ - ["<", 0, 0], - ["<", 1, 0], - ["<", 2, 0], - ["<", 3, 0], - ["<", 4, 0], - ["<", 5, 0], - ["<", 6, 0], - ["<", 7, 0], - ["<", 8, 0], - ["<", 9, 0], - ["<", 10, 0], - ["<", 11, 0], - ["<", 12, 0], - ["<", 13, 0], - ["<", 14, 0], - ["<", 15, 0], - ["<", 16, 0], - ["<", 17, 0], - ["<", 18, 0], - ["<", 19, 0], - ["<", 20, 0], - ["<", 21, 0], - ["<", 22, 0], - ["<", 23, 0], - ["<", 24, 0], - ["<", 25, 0], - ["<", 26, 0], - ["<", 27, 0], - ["<", 28, 0] - ] - # standard:enable Layout/ExtraSpacing - - it_has_behavior "with a #change callback", s1, s2, result - it_has_behavior "without a #change callback", s1, s2, result - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/traverse_sequences_spec.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/traverse_sequences_spec.rb deleted file mode 100644 index 8e9928f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/spec/traverse_sequences_spec.rb +++ /dev/null @@ -1,137 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe "Diff::LCS.traverse_sequences" do - describe "callback with no finishers" do - describe "over (seq1, seq2)" do - before(:each) do - @callback_s1_s2 = simple_callback_no_finishers - Diff::LCS.traverse_sequences(seq1, seq2, @callback_s1_s2) - - @callback_s2_s1 = simple_callback_no_finishers - Diff::LCS.traverse_sequences(seq2, seq1, @callback_s2_s1) - end - - it "has the correct LCS result on left-matches" do - expect(@callback_s1_s2.matched_a).to eq(correct_lcs) - expect(@callback_s2_s1.matched_a).to eq(correct_lcs) - end - - it "has the correct LCS result on right-matches" do - expect(@callback_s1_s2.matched_b).to eq(correct_lcs) - expect(@callback_s2_s1.matched_b).to eq(correct_lcs) - end - - it "has the correct skipped sequences with the left sequence" do - expect(@callback_s1_s2.discards_a).to eq(skipped_seq1) - expect(@callback_s2_s1.discards_a).to eq(skipped_seq2) - end - - it "has the correct skipped sequences with the right sequence" do - expect(@callback_s1_s2.discards_b).to eq(skipped_seq2) - expect(@callback_s2_s1.discards_b).to eq(skipped_seq1) - end - - it "does not have anything done markers from the left or right sequences" do - expect(@callback_s1_s2.done_a).to be_empty - expect(@callback_s1_s2.done_b).to be_empty - expect(@callback_s2_s1.done_a).to be_empty - expect(@callback_s2_s1.done_b).to be_empty - end - end - - describe "over (hello, hello)" do - before(:each) do - @callback = simple_callback_no_finishers - Diff::LCS.traverse_sequences(hello, hello, @callback) - end - - it "has the correct LCS result on left-matches" do - expect(@callback.matched_a).to eq(hello.chars) - end - - it "has the correct LCS result on right-matches" do - expect(@callback.matched_b).to eq(hello.chars) - end - - it "has the correct skipped sequences with the left sequence" do - expect(@callback.discards_a).to be_empty - end - - it "has the correct skipped sequences with the right sequence" do - expect(@callback.discards_b).to be_empty - end - - it "does not have anything done markers from the left or right sequences" do - expect(@callback.done_a).to be_empty - expect(@callback.done_b).to be_empty - end - end - - describe "over (hello_ary, hello_ary)" do - before(:each) do - @callback = simple_callback_no_finishers - Diff::LCS.traverse_sequences(hello_ary, hello_ary, @callback) - end - - it "has the correct LCS result on left-matches" do - expect(@callback.matched_a).to eq(hello_ary) - end - - it "has the correct LCS result on right-matches" do - expect(@callback.matched_b).to eq(hello_ary) - end - - it "has the correct skipped sequences with the left sequence" do - expect(@callback.discards_a).to be_empty - end - - it "has the correct skipped sequences with the right sequence" do - expect(@callback.discards_b).to be_empty - end - - it "does not have anything done markers from the left or right sequences" do - expect(@callback.done_a).to be_empty - expect(@callback.done_b).to be_empty - end - end - end - - describe "callback with finisher" do - before(:each) do - @callback_s1_s2 = simple_callback - Diff::LCS.traverse_sequences(seq1, seq2, @callback_s1_s2) - @callback_s2_s1 = simple_callback - Diff::LCS.traverse_sequences(seq2, seq1, @callback_s2_s1) - end - - it "has the correct LCS result on left-matches" do - expect(@callback_s1_s2.matched_a).to eq(correct_lcs) - expect(@callback_s2_s1.matched_a).to eq(correct_lcs) - end - - it "has the correct LCS result on right-matches" do - expect(@callback_s1_s2.matched_b).to eq(correct_lcs) - expect(@callback_s2_s1.matched_b).to eq(correct_lcs) - end - - it "has the correct skipped sequences for the left sequence" do - expect(@callback_s1_s2.discards_a).to eq(skipped_seq1) - expect(@callback_s2_s1.discards_a).to eq(skipped_seq2) - end - - it "has the correct skipped sequences for the right sequence" do - expect(@callback_s1_s2.discards_b).to eq(skipped_seq2) - expect(@callback_s2_s1.discards_b).to eq(skipped_seq1) - end - - it "has done markers differently-sized sequences" do - expect(@callback_s1_s2.done_a).to eq([["p", 9, "t", 11]]) - expect(@callback_s1_s2.done_b).to be_empty - - expect(@callback_s2_s1.done_a).to be_empty - expect(@callback_s2_s1.done_b).to eq([["t", 11, "p", 9]]) - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.document b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.document deleted file mode 100644 index 70bb626..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.document +++ /dev/null @@ -1,6 +0,0 @@ -LICENSE.txt -NEWS.md -README.md -ext/ -lib/ -_doc/ diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.github/dependabot.yml b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.github/dependabot.yml deleted file mode 100644 index b18fd29..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.github/dependabot.yml +++ /dev/null @@ -1,6 +0,0 @@ -version: 2 -updates: - - package-ecosystem: 'github-actions' - directory: '/' - schedule: - interval: 'weekly' diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.github/workflows/test.yml b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.github/workflows/test.yml deleted file mode 100644 index 02e9671..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.github/workflows/test.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: test - -on: - push: - branches: [master] - pull_request: - workflow_dispatch: - -jobs: - ruby-versions: - uses: ruby/actions/.github/workflows/ruby_versions.yml@master - with: - engine: cruby - versions: '["jruby", "truffleruby-head"]' - - test: - needs: ruby-versions - name: build (${{ matrix.ruby }} / ${{ matrix.os }}) - strategy: - matrix: - ruby: ${{ fromJson(needs.ruby-versions.outputs.versions) }} - os: [ubuntu-latest] - fail-fast: false - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v4 - - name: Set up Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: ${{ matrix.ruby }} - bundler-cache: true - - name: Run test - run: bundle exec rake test diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.gitignore b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.gitignore deleted file mode 100644 index f53c35c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -/.bundle/ -/.yardoc -/_yardoc/ -/coverage/ -/doc/ -/pkg/ -/spec/reports/ -/tmp/ -Gemfile.lock -*.so -*.bundle -*.gem diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.rdoc_options b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.rdoc_options deleted file mode 100644 index 62d6c58..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/.rdoc_options +++ /dev/null @@ -1 +0,0 @@ -main_page: README.md diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/BDSL b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/BDSL deleted file mode 100644 index 66d9359..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/BDSL +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/COPYING b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/COPYING deleted file mode 100644 index 48e5a96..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/COPYING +++ /dev/null @@ -1,56 +0,0 @@ -Ruby is copyrighted free software by Yukihiro Matsumoto . -You can redistribute it and/or modify it under either the terms of the -2-clause BSDL (see the file BSDL), or the conditions below: - -1. You may make and give away verbatim copies of the source form of the - software without restriction, provided that you duplicate all of the - original copyright notices and associated disclaimers. - -2. You may modify your copy of the software in any way, provided that - you do at least ONE of the following: - - a. place your modifications in the Public Domain or otherwise - make them Freely Available, such as by posting said - modifications to Usenet or an equivalent medium, or by allowing - the author to include your modifications in the software. - - b. use the modified software only within your corporation or - organization. - - c. give non-standard binaries non-standard names, with - instructions on where to get the original software distribution. - - d. make other distribution arrangements with the author. - -3. You may distribute the software in object code or binary form, - provided that you do at least ONE of the following: - - a. distribute the binaries and library files of the software, - together with instructions (in the manual page or equivalent) - on where to get the original distribution. - - b. accompany the distribution with the machine-readable source of - the software. - - c. give non-standard binaries non-standard names, with - instructions on where to get the original software distribution. - - d. make other distribution arrangements with the author. - -4. You may modify and include the part of the software into any other - software (possibly commercial). But some files in the distribution - are not written by the author, so that they are not under these terms. - - For the list of those files and their copying conditions, see the - file LEGAL. - -5. The scripts and library files supplied as input to or produced as - output from the software do not automatically fall under the - copyright of the software, but belong to whomever generated them, - and may be sold commercially, and may be aggregated with this - software. - -6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE. diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/Gemfile b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/Gemfile deleted file mode 100644 index eded3b0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/Gemfile +++ /dev/null @@ -1,10 +0,0 @@ -source 'https://rubygems.org/' - -gemspec - -group :development do - gem 'rake' - gem 'rake-compiler' - gem 'test-unit' - gem "test-unit-ruby-core" -end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/LICENSE.txt b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/LICENSE.txt deleted file mode 100644 index ca9fe59..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/LICENSE.txt +++ /dev/null @@ -1,2 +0,0 @@ -All the files in this distribution are covered under either the Ruby's -license (see the file COPYING) or BSD-2-Clause license (see the file BSDL). diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/NEWS.md b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/NEWS.md deleted file mode 100644 index 62bf370..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/NEWS.md +++ /dev/null @@ -1,65 +0,0 @@ -# Change Log - -## 5.0.2 - -* Declare escape functions as Ractor-safe [#63](https://github.com/ruby/erb/pull/63) - -## 5.0.1 - -* Rescue `LoadError` when failing to load `erb/escape` - -## 5.0.0 - -* Bump `required_ruby_version` to Ruby 3.2+ [#60](https://github.com/ruby/erb/pull/60) -* Drop `cgi` from runtime dependencies [#59](https://github.com/ruby/erb/pull/59) -* Make `ERB::VERSION` public - -## 4.0.4 - -* Skip building the C extension for JRuby [#52](https://github.com/ruby/erb/pull/52) - -## 4.0.3 - -* Enable `frozen_string_literal` in all files [#49](https://github.com/ruby/erb/pull/49) - -## 4.0.2 - -* Fix line numbers after multi-line `<%#` [#42](https://github.com/ruby/erb/pull/42) - -## 4.0.1 - -* Stop building the C extension for TruffleRuby [#39](https://github.com/ruby/erb/pull/39) - -## 4.0.0 - -* Optimize `ERB::Util.html_escape` [#27](https://github.com/ruby/erb/pull/27) - * No longer duplicate an argument string when nothing is escaped. - * This makes `ERB::Util.html_escape` faster than `CGI.escapeHTML` in no-escape cases. - * It skips calling `#to_s` when an argument is already a String. -* Define `ERB::Escape.html_escape` as an alias to `ERB::Util.html_escape` [#38](https://github.com/ruby/erb/pull/38) - * `ERB::Util.html_escape` is known to be monkey-patched by Rails. - `ERB::Escape.html_escape` is useful when you want a non-monkey-patched version. -* Drop deprecated `-S` option from `erb` command - -## 3.0.0 - -* Bump `required_ruby_version` to Ruby 2.7+ [#23](https://github.com/ruby/erb/pull/23) -* `ERB::Util.url_encode` uses a native implementation [#23](https://github.com/ruby/erb/pull/23) -* Fix a bug that a magic comment with a wrong format could be detected [#6](https://github.com/ruby/erb/pull/6) - -## 2.2.3 - -* Bump `required_ruby_version` from 2.3 to 2.5 as it has never been supported [#3](https://github.com/ruby/erb/pull/3) - -## 2.2.2 - -* `ERB.version` returns just a version number -* `ERB::Revision` is deprecated - -## 2.2.1 - -* `ERB#initialize` warns `safe_level` and later arguments even without -w - -## 2.2.0 - -* Ruby 3.0 promoted ERB to a default gem diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/README.md b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/README.md deleted file mode 100644 index 908fdb7..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/README.md +++ /dev/null @@ -1,255 +0,0 @@ -# ERB - -An easy to use but powerful templating system for Ruby. - -## Introduction - -ERB provides an easy to use but powerful templating system for Ruby. Using -ERB, actual Ruby code can be added to any plain text document for the -purposes of generating document information details and/or flow control. - -A very simple example is this: - -```rb -require 'erb' - -x = 42 -template = ERB.new <<-EOF - The value of x is: <%= x %> -EOF -puts template.result(binding) -``` - -Prints: `The value of x is: 42` - -More complex examples are given below. - -## Recognized Tags - -ERB recognizes certain tags in the provided template and converts them based -on the rules below: - -```erb -<% Ruby code -- inline with output %> -<%= Ruby expression -- replace with result %> -<%# comment -- ignored -- useful in testing %> (`<% #` doesn't work. Don't use Ruby comments.) -% a line of Ruby code -- treated as <% line %> (optional -- see ERB.new) -%% replaced with % if first thing on a line and % processing is used -<%% or %%> -- replace with <% or %> respectively -``` - -All other text is passed through ERB filtering unchanged. - -## Options - -There are several settings you can change when you use ERB: -* the nature of the tags that are recognized; -* the binding used to resolve local variables in the template. - -See the ERB.new and ERB#result methods for more detail. - -## Character encodings - -ERB (or Ruby code generated by ERB) returns a string in the same -character encoding as the input string. When the input string has -a magic comment, however, it returns a string in the encoding specified -by the magic comment. - -```rb -# -*- coding: utf-8 -*- -require 'erb' - -template = ERB.new < - __ENCODING__ is <%= __ENCODING__ %>. -EOF -puts template.result -``` - -Prints: `__ENCODING__ is Big5.` - -## Examples - -### Plain Text - -ERB is useful for any generic templating situation. Note that in this example, we use the -convenient "% at start of line" tag, and we quote the template literally with -`%q{...}` to avoid trouble with the backslash. - -```rb -require "erb" - -# Create template. -template = %q{ - From: James Edward Gray II - To: <%= to %> - Subject: Addressing Needs - - <%= to[/\w+/] %>: - - Just wanted to send a quick note assuring that your needs are being - addressed. - - I want you to know that my team will keep working on the issues, - especially: - - <%# ignore numerous minor requests -- focus on priorities %> - % priorities.each do |priority| - * <%= priority %> - % end - - Thanks for your patience. - - James Edward Gray II -}.gsub(/^ /, '') - -message = ERB.new(template, trim_mode: "%<>") - -# Set up template data. -to = "Community Spokesman " -priorities = [ "Run Ruby Quiz", - "Document Modules", - "Answer Questions on Ruby Talk" ] - -# Produce result. -email = message.result -puts email -``` - -Generates: - -``` -From: James Edward Gray II -To: Community Spokesman -Subject: Addressing Needs - -Community: - -Just wanted to send a quick note assuring that your needs are being addressed. - -I want you to know that my team will keep working on the issues, especially: - - * Run Ruby Quiz - * Document Modules - * Answer Questions on Ruby Talk - -Thanks for your patience. - -James Edward Gray II -``` - -### Ruby in HTML - -ERB is often used in .rhtml files (HTML with embedded Ruby). Notice the need in -this example to provide a special binding when the template is run, so that the instance -variables in the Product object can be resolved. - -```rb -require "erb" - -# Build template data class. -class Product - def initialize( code, name, desc, cost ) - @code = code - @name = name - @desc = desc - @cost = cost - - @features = [ ] - end - - def add_feature( feature ) - @features << feature - end - - # Support templating of member data. - def get_binding - binding - end - - # ... -end - -# Create template. -template = %{ - - Ruby Toys -- <%= @name %> - - -

<%= @name %> (<%= @code %>)

-

<%= @desc %>

- -
    - <% @features.each do |f| %> -
  • <%= f %>
  • - <% end %> -
- -

- <% if @cost < 10 %> - Only <%= @cost %>!!! - <% else %> - Call for a price, today! - <% end %> -

- - - -}.gsub(/^ /, '') - -rhtml = ERB.new(template) - -# Set up template data. -toy = Product.new( "TZ-1002", - "Rubysapien", - "Geek's Best Friend! Responds to Ruby commands...", - 999.95 ) -toy.add_feature("Listens for verbal commands in the Ruby language!") -toy.add_feature("Ignores Perl, Java, and all C variants.") -toy.add_feature("Karate-Chop Action!!!") -toy.add_feature("Matz signature on left leg.") -toy.add_feature("Gem studded eyes... Rubies, of course!") - -# Produce result. -rhtml.run(toy.get_binding) -``` - -Generates (some blank lines removed): - -```html - - Ruby Toys -- Rubysapien - - -

Rubysapien (TZ-1002)

-

Geek's Best Friend! Responds to Ruby commands...

- -
    -
  • Listens for verbal commands in the Ruby language!
  • -
  • Ignores Perl, Java, and all C variants.
  • -
  • Karate-Chop Action!!!
  • -
  • Matz signature on left leg.
  • -
  • Gem studded eyes... Rubies, of course!
  • -
- -

- Call for a price, today! -

- - - -``` - -## Notes - -There are a variety of templating solutions available in various Ruby projects. -For example, RDoc, distributed with Ruby, uses its own template engine, which -can be reused elsewhere. - -Other popular engines could be found in the corresponding -[Category](https://www.ruby-toolbox.com/categories/template_engines) of -The Ruby Toolbox. - -## License - -The gem is available as open source under the terms of the [2-Clause BSD License](https://opensource.org/licenses/BSD-2-Clause). diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/Rakefile b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/Rakefile deleted file mode 100644 index 8e83d7e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/Rakefile +++ /dev/null @@ -1,19 +0,0 @@ -require 'bundler/gem_tasks' -require 'rake/testtask' - -Rake::TestTask.new(:test) do |t| - t.libs << 'test/lib' - t.ruby_opts << '-rhelper' - t.test_files = FileList['test/**/test_*.rb'] -end - -case RUBY_ENGINE -when 'jruby', 'truffleruby' - # not using C extension -else - require 'rake/extensiontask' - Rake::ExtensionTask.new('erb/escape') - task test: :compile -end - -task default: :test diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/_doc/cgi.rb b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/_doc/cgi.rb deleted file mode 100644 index 0902b73..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/_doc/cgi.rb +++ /dev/null @@ -1,3 +0,0 @@ -# See {CGI document}[https://docs.ruby-lang.org/en/master/CGI.html] -module CGI -end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/bin/console b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/bin/console deleted file mode 100755 index 6355e0f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/bin/console +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env ruby - -require "bundler/setup" -require "erb" - -# You can add fixtures and/or initialization code here to make experimenting -# with your gem easier. You can also use a different console, if you like. - -# (If you use this, don't forget to add pry to your Gemfile!) -# require "pry" -# Pry.start - -require "irb" -IRB.start(__FILE__) diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/bin/setup b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/bin/setup deleted file mode 100755 index dce67d8..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/bin/setup +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail -IFS=$'\n\t' -set -vx - -bundle install - -# Do any other automated setup that you need to do here diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/erb.gemspec b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/erb.gemspec deleted file mode 100644 index 94edc68..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/erb.gemspec +++ /dev/null @@ -1,36 +0,0 @@ -begin - require_relative 'lib/erb/version' -rescue LoadError - # for Ruby core repository - require_relative 'version' -end - -Gem::Specification.new do |spec| - spec.name = 'erb' - spec.version = ERB::VERSION - spec.authors = ['Masatoshi SEKI', 'Takashi Kokubun'] - spec.email = ['seki@ruby-lang.org', 'k0kubun@ruby-lang.org'] - - spec.summary = %q{An easy to use but powerful templating system for Ruby.} - spec.description = %q{An easy to use but powerful templating system for Ruby.} - spec.homepage = 'https://github.com/ruby/erb' - spec.licenses = ['Ruby', 'BSD-2-Clause'] - - spec.metadata['homepage_uri'] = spec.homepage - spec.metadata['source_code_uri'] = spec.homepage - - spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do - `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } - end - spec.bindir = 'libexec' - spec.executables = ['erb'] - spec.require_paths = ['lib'] - - spec.required_ruby_version = '>= 3.2.0' - - if RUBY_ENGINE == 'jruby' - spec.platform = 'java' - else - spec.extensions = ['ext/erb/escape/extconf.rb'] - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/Makefile b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/Makefile deleted file mode 100644 index 58021e1..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/Makefile +++ /dev/null @@ -1,269 +0,0 @@ - -SHELL = /bin/sh - -# V=0 quiet, V=1 verbose. other values don't work. -V = 0 -V0 = $(V:0=) -Q1 = $(V:1=) -Q = $(Q1:0=@) -ECHO1 = $(V:1=@ :) -ECHO = $(ECHO1:0=@ echo) -NULLCMD = : - -#### Start of system configuration section. #### - -srcdir = . -topdir = /usr/include/ruby-3.2.0 -hdrdir = $(topdir) -arch_hdrdir = /usr/include/x86_64-linux-gnu/ruby-3.2.0 -PATH_SEPARATOR = : -VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby -prefix = $(DESTDIR)/usr -rubysitearchprefix = $(sitearchlibdir)/$(RUBY_BASE_NAME) -rubyarchprefix = $(archlibdir)/$(RUBY_BASE_NAME) -rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) -exec_prefix = $(prefix) -vendorarchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/vendor_ruby -sitearchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/site_ruby -rubyarchhdrdir = $(archincludedir)/$(RUBY_VERSION_NAME) -vendorhdrdir = $(rubyhdrdir)/vendor_ruby -sitehdrdir = $(rubyhdrdir)/site_ruby -rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) -vendorarchdir = $(rubysitearchprefix)/vendor_ruby/$(ruby_version) -vendorlibdir = $(vendordir)/$(ruby_version) -vendordir = $(rubylibprefix)/vendor_ruby -sitearchdir = $(DESTDIR)/usr/local/lib/x86_64-linux-gnu/site_ruby -sitelibdir = $(sitedir)/$(ruby_version) -sitedir = $(DESTDIR)/usr/local/lib/site_ruby -rubyarchdir = $(rubyarchprefix)/$(ruby_version) -rubylibdir = $(rubylibprefix)/$(ruby_version) -sitearchincludedir = $(includedir)/$(sitearch) -archincludedir = $(includedir)/$(arch) -sitearchlibdir = $(libdir)/$(sitearch) -archlibdir = $(libdir)/$(arch) -ridir = $(datarootdir)/$(RI_BASE_NAME) -mandir = $(datarootdir)/man -localedir = $(datarootdir)/locale -libdir = $(exec_prefix)/lib -psdir = $(docdir) -pdfdir = $(docdir) -dvidir = $(docdir) -htmldir = $(docdir) -infodir = $(datarootdir)/info -docdir = $(datarootdir)/doc/$(PACKAGE) -oldincludedir = $(DESTDIR)/usr/include -includedir = $(prefix)/include -runstatedir = $(DESTDIR)/var/run -localstatedir = $(DESTDIR)/var -sharedstatedir = $(prefix)/com -sysconfdir = $(DESTDIR)/etc -datadir = $(datarootdir) -datarootdir = $(prefix)/share -libexecdir = $(exec_prefix)/libexec -sbindir = $(exec_prefix)/sbin -bindir = $(exec_prefix)/bin -archdir = $(rubyarchdir) - - -CC_WRAPPER = -CC = x86_64-linux-gnu-gcc -CXX = x86_64-linux-gnu-g++ -LIBRUBY = $(LIBRUBY_SO) -LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a -LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) -LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static $(MAINLIBS) -empty = -OUTFLAG = -o $(empty) -COUTFLAG = -o $(empty) -CSRCFLAG = $(empty) - -RUBY_EXTCONF_H = -cflags = $(optflags) $(debugflags) $(warnflags) -cxxflags = -optflags = -O3 -fno-fast-math -debugflags = -ggdb3 -warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdiv-by-zero -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wold-style-definition -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef -cppflags = -CCDLFLAGS = -fPIC -CFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC $(ARCH_FLAG) -INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) -DEFS = -CPPFLAGS = -DHAVE_RB_EXT_RACTOR_SAFE -Wdate-time -D_FORTIFY_SOURCE=3 $(DEFS) $(cppflags) -CXXFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 $(ARCH_FLAG) -ldflags = -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -dldflags = -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -ARCH_FLAG = -DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) -LDSHARED = $(CC) -shared -LDSHAREDXX = $(CXX) -shared -AR = x86_64-linux-gnu-gcc-ar -EXEEXT = - -RUBY_INSTALL_NAME = $(RUBY_BASE_NAME)3.2 -RUBY_SO_NAME = ruby-3.2 -RUBYW_INSTALL_NAME = -RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) -RUBYW_BASE_NAME = rubyw -RUBY_BASE_NAME = ruby - -arch = x86_64-linux-gnu -sitearch = $(arch) -ruby_version = 3.2.0 -ruby = $(bindir)/$(RUBY_BASE_NAME)3.2 -RUBY = $(ruby) -BUILTRUBY = $(bindir)/$(RUBY_BASE_NAME)3.2 -ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h - -RM = rm -f -RM_RF = rm -fr -RMDIRS = rmdir --ignore-fail-on-non-empty -p -MAKEDIRS = /bin/mkdir -p -INSTALL = /usr/bin/install -c -INSTALL_PROG = $(INSTALL) -m 0755 -INSTALL_DATA = $(INSTALL) -m 644 -COPY = cp -TOUCH = exit > - -#### End of system configuration section. #### - -preload = -libpath = . $(archlibdir) -LIBPATH = -L. -L$(archlibdir) -DEFFILE = - -CLEANFILES = mkmf.log -DISTCLEANFILES = -DISTCLEANDIRS = - -extout = -extout_prefix = -target_prefix = /erb -LOCAL_LIBS = -LIBS = $(LIBRUBYARG_SHARED) -lm -lpthread -lc -ORIG_SRCS = escape.c -SRCS = $(ORIG_SRCS) -OBJS = escape.o -HDRS = -LOCAL_HDRS = -TARGET = escape -TARGET_NAME = escape -TARGET_ENTRY = Init_$(TARGET_NAME) -DLLIB = $(TARGET).so -EXTSTATIC = -STATIC_LIB = - -TIMESTAMP_DIR = . -BINDIR = $(bindir) -RUBYCOMMONDIR = $(sitedir)$(target_prefix) -RUBYLIBDIR = $(sitelibdir)$(target_prefix) -RUBYARCHDIR = $(sitearchdir)$(target_prefix) -HDRDIR = $(sitehdrdir)$(target_prefix) -ARCHHDRDIR = $(sitearchhdrdir)$(target_prefix) -TARGET_SO_DIR = -TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) -CLEANLIBS = $(TARGET_SO) false -CLEANOBJS = $(OBJS) *.bak -TARGET_SO_DIR_TIMESTAMP = $(TIMESTAMP_DIR)/.sitearchdir.-.erb.time - -all: $(DLLIB) -static: $(STATIC_LIB) -.PHONY: all install static install-so install-rb -.PHONY: clean clean-so clean-static clean-rb - -clean-static:: -clean-rb-default:: -clean-rb:: -clean-so:: -clean: clean-so clean-static clean-rb-default clean-rb - -$(Q)$(RM_RF) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time - -distclean-rb-default:: -distclean-rb:: -distclean-so:: -distclean-static:: -distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb - -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log - -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) - -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true - -realclean: distclean -install: install-so install-rb - -install-so: $(DLLIB) $(TARGET_SO_DIR_TIMESTAMP) - $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) -clean-static:: - -$(Q)$(RM) $(STATIC_LIB) -install-rb: pre-install-rb do-install-rb install-rb-default -install-rb-default: pre-install-rb-default do-install-rb-default -pre-install-rb: Makefile -pre-install-rb-default: Makefile -do-install-rb: -do-install-rb-default: -pre-install-rb-default: - @$(NULLCMD) -$(TARGET_SO_DIR_TIMESTAMP): - $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) - $(Q) $(TOUCH) $@ - -site-install: site-install-so site-install-rb -site-install-so: install-so -site-install-rb: install-rb - -.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S - -.cc.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cc.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.mm.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.mm.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cxx.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cxx.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cpp.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cpp.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.c.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.c.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.m.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.m.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -$(TARGET_SO): $(OBJS) Makefile - $(ECHO) linking shared-object erb/$(DLLIB) - -$(Q)$(RM) $(@) - $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) - - - -$(OBJS): $(HDRS) $(ruby_headers) diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/escape.c b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/escape.c deleted file mode 100644 index 2a5903c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/escape.c +++ /dev/null @@ -1,102 +0,0 @@ -#include "ruby.h" -#include "ruby/encoding.h" - -static VALUE rb_cERB, rb_mEscape, rb_cCGI; -static ID id_escapeHTML; - -#define HTML_ESCAPE_MAX_LEN 6 - -static const struct { - uint8_t len; - char str[HTML_ESCAPE_MAX_LEN+1]; -} html_escape_table[UCHAR_MAX+1] = { -#define HTML_ESCAPE(c, str) [c] = {rb_strlen_lit(str), str} - HTML_ESCAPE('\'', "'"), - HTML_ESCAPE('&', "&"), - HTML_ESCAPE('"', """), - HTML_ESCAPE('<', "<"), - HTML_ESCAPE('>', ">"), -#undef HTML_ESCAPE -}; - -static inline void -preserve_original_state(VALUE orig, VALUE dest) -{ - rb_enc_associate(dest, rb_enc_get(orig)); -} - -static inline long -escaped_length(VALUE str) -{ - const long len = RSTRING_LEN(str); - if (len >= LONG_MAX / HTML_ESCAPE_MAX_LEN) { - ruby_malloc_size_overflow(len, HTML_ESCAPE_MAX_LEN); - } - return len * HTML_ESCAPE_MAX_LEN; -} - -static VALUE -optimized_escape_html(VALUE str) -{ - VALUE vbuf; - char *buf = ALLOCV_N(char, vbuf, escaped_length(str)); - const char *cstr = RSTRING_PTR(str); - const char *end = cstr + RSTRING_LEN(str); - - char *dest = buf; - while (cstr < end) { - const unsigned char c = *cstr++; - uint8_t len = html_escape_table[c].len; - if (len) { - memcpy(dest, html_escape_table[c].str, len); - dest += len; - } - else { - *dest++ = c; - } - } - - VALUE escaped = str; - if (RSTRING_LEN(str) < (dest - buf)) { - escaped = rb_str_new(buf, dest - buf); - preserve_original_state(str, escaped); - } - ALLOCV_END(vbuf); - return escaped; -} - -/* - * ERB::Util.html_escape is similar to CGI.escapeHTML but different in the following two parts: - * - * * ERB::Util.html_escape converts an argument with #to_s first (only if it's not T_STRING) - * * ERB::Util.html_escape does not allocate a new string when nothing needs to be escaped - */ -static VALUE -erb_escape_html(VALUE self, VALUE str) -{ - if (!RB_TYPE_P(str, T_STRING)) { - str = rb_convert_type(str, T_STRING, "String", "to_s"); - } - - if (rb_enc_str_asciicompat_p(str)) { - return optimized_escape_html(str); - } - else { - return rb_funcall(rb_cCGI, id_escapeHTML, 1, str); - } -} - -void -Init_escape(void) -{ -#ifdef HAVE_RB_EXT_RACTOR_SAFE - rb_ext_ractor_safe(true); -#endif - - rb_cERB = rb_define_class("ERB", rb_cObject); - rb_mEscape = rb_define_module_under(rb_cERB, "Escape"); - rb_define_module_function(rb_mEscape, "html_escape", erb_escape_html, 1); - - rb_cCGI = rb_define_class("CGI", rb_cObject); - id_escapeHTML = rb_intern("escapeHTML"); -} diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/extconf.rb b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/extconf.rb deleted file mode 100644 index b211a97..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/ext/erb/escape/extconf.rb +++ /dev/null @@ -1,9 +0,0 @@ -require 'mkmf' - -case RUBY_ENGINE -when 'jruby', 'truffleruby' - File.write('Makefile', dummy_makefile($srcdir).join) -else - have_func("rb_ext_ractor_safe", "ruby.h") - create_makefile 'erb/escape' -end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb.rb b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb.rb deleted file mode 100644 index ebf91e4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb.rb +++ /dev/null @@ -1,504 +0,0 @@ -# -*- coding: us-ascii -*- -# frozen_string_literal: true -# = ERB -- Ruby Templating -# -# Author:: Masatoshi SEKI -# Documentation:: James Edward Gray II, Gavin Sinclair, and Simon Chiang -# -# See ERB for primary documentation and ERB::Util for a couple of utility -# routines. -# -# Copyright (c) 1999-2000,2002,2003 Masatoshi SEKI -# -# You can redistribute it and/or modify it under the same terms as Ruby. - -require 'erb/version' -require 'erb/compiler' -require 'erb/def_method' -require 'erb/util' - -# -# = ERB -- Ruby Templating -# -# == Introduction -# -# ERB provides an easy to use but powerful templating system for Ruby. Using -# ERB, actual Ruby code can be added to any plain text document for the -# purposes of generating document information details and/or flow control. -# -# A very simple example is this: -# -# require 'erb' -# -# x = 42 -# template = ERB.new <<-EOF -# The value of x is: <%= x %> -# EOF -# puts template.result(binding) -# -# Prints: The value of x is: 42 -# -# More complex examples are given below. -# -# -# == Recognized Tags -# -# ERB recognizes certain tags in the provided template and converts them based -# on the rules below: -# -# <% Ruby code -- inline with output %> -# <%= Ruby expression -- replace with result %> -# <%# comment -- ignored -- useful in testing %> (`<% #` doesn't work. Don't use Ruby comments.) -# % a line of Ruby code -- treated as <% line %> (optional -- see ERB.new) -# %% replaced with % if first thing on a line and % processing is used -# <%% or %%> -- replace with <% or %> respectively -# -# All other text is passed through ERB filtering unchanged. -# -# -# == Options -# -# There are several settings you can change when you use ERB: -# * the nature of the tags that are recognized; -# * the binding used to resolve local variables in the template. -# -# See the ERB.new and ERB#result methods for more detail. -# -# == Character encodings -# -# ERB (or Ruby code generated by ERB) returns a string in the same -# character encoding as the input string. When the input string has -# a magic comment, however, it returns a string in the encoding specified -# by the magic comment. -# -# # -*- coding: utf-8 -*- -# require 'erb' -# -# template = ERB.new < -# \_\_ENCODING\_\_ is <%= \_\_ENCODING\_\_ %>. -# EOF -# puts template.result -# -# Prints: \_\_ENCODING\_\_ is Big5. -# -# -# == Examples -# -# === Plain Text -# -# ERB is useful for any generic templating situation. Note that in this example, we use the -# convenient "% at start of line" tag, and we quote the template literally with -# %q{...} to avoid trouble with the backslash. -# -# require "erb" -# -# # Create template. -# template = %q{ -# From: James Edward Gray II -# To: <%= to %> -# Subject: Addressing Needs -# -# <%= to[/\w+/] %>: -# -# Just wanted to send a quick note assuring that your needs are being -# addressed. -# -# I want you to know that my team will keep working on the issues, -# especially: -# -# <%# ignore numerous minor requests -- focus on priorities %> -# % priorities.each do |priority| -# * <%= priority %> -# % end -# -# Thanks for your patience. -# -# James Edward Gray II -# }.gsub(/^ /, '') -# -# message = ERB.new(template, trim_mode: "%<>") -# -# # Set up template data. -# to = "Community Spokesman " -# priorities = [ "Run Ruby Quiz", -# "Document Modules", -# "Answer Questions on Ruby Talk" ] -# -# # Produce result. -# email = message.result -# puts email -# -# Generates: -# -# From: James Edward Gray II -# To: Community Spokesman -# Subject: Addressing Needs -# -# Community: -# -# Just wanted to send a quick note assuring that your needs are being addressed. -# -# I want you to know that my team will keep working on the issues, especially: -# -# * Run Ruby Quiz -# * Document Modules -# * Answer Questions on Ruby Talk -# -# Thanks for your patience. -# -# James Edward Gray II -# -# === Ruby in HTML -# -# ERB is often used in .rhtml files (HTML with embedded Ruby). Notice the need in -# this example to provide a special binding when the template is run, so that the instance -# variables in the Product object can be resolved. -# -# require "erb" -# -# # Build template data class. -# class Product -# def initialize( code, name, desc, cost ) -# @code = code -# @name = name -# @desc = desc -# @cost = cost -# -# @features = [ ] -# end -# -# def add_feature( feature ) -# @features << feature -# end -# -# # Support templating of member data. -# def get_binding -# binding -# end -# -# # ... -# end -# -# # Create template. -# template = %{ -# -# Ruby Toys -- <%= @name %> -# -# -#

<%= @name %> (<%= @code %>)

-#

<%= @desc %>

-# -#
    -# <% @features.each do |f| %> -#
  • <%= f %>
  • -# <% end %> -#
-# -#

-# <% if @cost < 10 %> -# Only <%= @cost %>!!! -# <% else %> -# Call for a price, today! -# <% end %> -#

-# -# -# -# }.gsub(/^ /, '') -# -# rhtml = ERB.new(template) -# -# # Set up template data. -# toy = Product.new( "TZ-1002", -# "Rubysapien", -# "Geek's Best Friend! Responds to Ruby commands...", -# 999.95 ) -# toy.add_feature("Listens for verbal commands in the Ruby language!") -# toy.add_feature("Ignores Perl, Java, and all C variants.") -# toy.add_feature("Karate-Chop Action!!!") -# toy.add_feature("Matz signature on left leg.") -# toy.add_feature("Gem studded eyes... Rubies, of course!") -# -# # Produce result. -# rhtml.run(toy.get_binding) -# -# Generates (some blank lines removed): -# -# -# Ruby Toys -- Rubysapien -# -# -#

Rubysapien (TZ-1002)

-#

Geek's Best Friend! Responds to Ruby commands...

-# -#
    -#
  • Listens for verbal commands in the Ruby language!
  • -#
  • Ignores Perl, Java, and all C variants.
  • -#
  • Karate-Chop Action!!!
  • -#
  • Matz signature on left leg.
  • -#
  • Gem studded eyes... Rubies, of course!
  • -#
-# -#

-# Call for a price, today! -#

-# -# -# -# -# -# == Notes -# -# There are a variety of templating solutions available in various Ruby projects. -# For example, RDoc, distributed with Ruby, uses its own template engine, which -# can be reused elsewhere. -# -# Other popular engines could be found in the corresponding -# {Category}[https://www.ruby-toolbox.com/categories/template_engines] of -# The Ruby Toolbox. -# -class ERB - Revision = '$Date:: $' # :nodoc: #' - deprecate_constant :Revision - - # Returns revision information for the erb.rb module. - def self.version - VERSION - end - - # - # Constructs a new ERB object with the template specified in _str_. - # - # An ERB object works by building a chunk of Ruby code that will output - # the completed template when run. - # - # If _trim_mode_ is passed a String containing one or more of the following - # modifiers, ERB will adjust its code generation as listed: - # - # % enables Ruby code processing for lines beginning with % - # <> omit newline for lines starting with <% and ending in %> - # > omit newline for lines ending in %> - # - omit blank lines ending in -%> - # - # _eoutvar_ can be used to set the name of the variable ERB will build up - # its output in. This is useful when you need to run multiple ERB - # templates through the same binding and/or when you want to control where - # output ends up. Pass the name of the variable to be used inside a String. - # - # === Example - # - # require "erb" - # - # # build data class - # class Listings - # PRODUCT = { :name => "Chicken Fried Steak", - # :desc => "A well messaged pattie, breaded and fried.", - # :cost => 9.95 } - # - # attr_reader :product, :price - # - # def initialize( product = "", price = "" ) - # @product = product - # @price = price - # end - # - # def build - # b = binding - # # create and run templates, filling member data variables - # ERB.new(<<~'END_PRODUCT', trim_mode: "", eoutvar: "@product").result b - # <%= PRODUCT[:name] %> - # <%= PRODUCT[:desc] %> - # END_PRODUCT - # ERB.new(<<~'END_PRICE', trim_mode: "", eoutvar: "@price").result b - # <%= PRODUCT[:name] %> -- <%= PRODUCT[:cost] %> - # <%= PRODUCT[:desc] %> - # END_PRICE - # end - # end - # - # # setup template data - # listings = Listings.new - # listings.build - # - # puts listings.product + "\n" + listings.price - # - # _Generates_ - # - # Chicken Fried Steak - # A well massaged pattie, breaded and fried. - # - # Chicken Fried Steak -- 9.95 - # A well massaged pattie, breaded and fried. - # - def initialize(str, safe_level=NOT_GIVEN, legacy_trim_mode=NOT_GIVEN, legacy_eoutvar=NOT_GIVEN, trim_mode: nil, eoutvar: '_erbout') - # Complex initializer for $SAFE deprecation at [Feature #14256]. Use keyword arguments to pass trim_mode or eoutvar. - if safe_level != NOT_GIVEN - warn 'Passing safe_level with the 2nd argument of ERB.new is deprecated. Do not use it, and specify other arguments as keyword arguments.', uplevel: 1 - end - if legacy_trim_mode != NOT_GIVEN - warn 'Passing trim_mode with the 3rd argument of ERB.new is deprecated. Use keyword argument like ERB.new(str, trim_mode: ...) instead.', uplevel: 1 - trim_mode = legacy_trim_mode - end - if legacy_eoutvar != NOT_GIVEN - warn 'Passing eoutvar with the 4th argument of ERB.new is deprecated. Use keyword argument like ERB.new(str, eoutvar: ...) instead.', uplevel: 1 - eoutvar = legacy_eoutvar - end - - compiler = make_compiler(trim_mode) - set_eoutvar(compiler, eoutvar) - @src, @encoding, @frozen_string = *compiler.compile(str) - @filename = nil - @lineno = 0 - @_init = self.class.singleton_class - end - NOT_GIVEN = defined?(Ractor) ? Ractor.make_shareable(Object.new) : Object.new - private_constant :NOT_GIVEN - - ## - # Creates a new compiler for ERB. See ERB::Compiler.new for details - - def make_compiler(trim_mode) - ERB::Compiler.new(trim_mode) - end - - # The Ruby code generated by ERB - attr_reader :src - - # The encoding to eval - attr_reader :encoding - - # The optional _filename_ argument passed to Kernel#eval when the ERB code - # is run - attr_accessor :filename - - # The optional _lineno_ argument passed to Kernel#eval when the ERB code - # is run - attr_accessor :lineno - - # - # Sets optional filename and line number that will be used in ERB code - # evaluation and error reporting. See also #filename= and #lineno= - # - # erb = ERB.new('<%= some_x %>') - # erb.render - # # undefined local variable or method `some_x' - # # from (erb):1 - # - # erb.location = ['file.erb', 3] - # # All subsequent error reporting would use new location - # erb.render - # # undefined local variable or method `some_x' - # # from file.erb:4 - # - def location=((filename, lineno)) - @filename = filename - @lineno = lineno if lineno - end - - # - # Can be used to set _eoutvar_ as described in ERB::new. It's probably - # easier to just use the constructor though, since calling this method - # requires the setup of an ERB _compiler_ object. - # - def set_eoutvar(compiler, eoutvar = '_erbout') - compiler.put_cmd = "#{eoutvar}.<<" - compiler.insert_cmd = "#{eoutvar}.<<" - compiler.pre_cmd = ["#{eoutvar} = +''"] - compiler.post_cmd = [eoutvar] - end - - # Generate results and print them. (see ERB#result) - def run(b=new_toplevel) - print self.result(b) - end - - # - # Executes the generated ERB code to produce a completed template, returning - # the results of that code. - # - # _b_ accepts a Binding object which is used to set the context of - # code evaluation. - # - def result(b=new_toplevel) - unless @_init.equal?(self.class.singleton_class) - raise ArgumentError, "not initialized" - end - eval(@src, b, (@filename || '(erb)'), @lineno) - end - - # Render a template on a new toplevel binding with local variables specified - # by a Hash object. - def result_with_hash(hash) - b = new_toplevel(hash.keys) - hash.each_pair do |key, value| - b.local_variable_set(key, value) - end - result(b) - end - - ## - # Returns a new binding each time *near* TOPLEVEL_BINDING for runs that do - # not specify a binding. - - def new_toplevel(vars = nil) - b = TOPLEVEL_BINDING - if vars - vars = vars.select {|v| b.local_variable_defined?(v)} - unless vars.empty? - return b.eval("tap {|;#{vars.join(',')}| break binding}") - end - end - b.dup - end - private :new_toplevel - - # Define _methodname_ as instance method of _mod_ from compiled Ruby source. - # - # example: - # filename = 'example.rhtml' # 'arg1' and 'arg2' are used in example.rhtml - # erb = ERB.new(File.read(filename)) - # erb.def_method(MyClass, 'render(arg1, arg2)', filename) - # print MyClass.new.render('foo', 123) - def def_method(mod, methodname, fname='(ERB)') - src = self.src.sub(/^(?!#|$)/) {"def #{methodname}\n"} << "\nend\n" - mod.module_eval do - eval(src, binding, fname, -1) - end - end - - # Create unnamed module, define _methodname_ as instance method of it, and return it. - # - # example: - # filename = 'example.rhtml' # 'arg1' and 'arg2' are used in example.rhtml - # erb = ERB.new(File.read(filename)) - # erb.filename = filename - # MyModule = erb.def_module('render(arg1, arg2)') - # class MyClass - # include MyModule - # end - def def_module(methodname='erb') - mod = Module.new - def_method(mod, methodname, @filename || '(ERB)') - mod - end - - # Define unnamed class which has _methodname_ as instance method, and return it. - # - # example: - # class MyClass_ - # def initialize(arg1, arg2) - # @arg1 = arg1; @arg2 = arg2 - # end - # end - # filename = 'example.rhtml' # @arg1 and @arg2 are used in example.rhtml - # erb = ERB.new(File.read(filename)) - # erb.filename = filename - # MyClass = erb.def_class(MyClass_, 'render()') - # print MyClass.new('foo', 123).render() - def def_class(superklass=Object, methodname='result') - cls = Class.new(superklass) - def_method(cls, methodname, @filename || '(ERB)') - cls - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/compiler.rb b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/compiler.rb deleted file mode 100644 index 08b5eb4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/compiler.rb +++ /dev/null @@ -1,488 +0,0 @@ -# frozen_string_literal: true -#-- -# ERB::Compiler -# -# Compiles ERB templates into Ruby code; the compiled code produces the -# template result when evaluated. ERB::Compiler provides hooks to define how -# generated output is handled. -# -# Internally ERB does something like this to generate the code returned by -# ERB#src: -# -# compiler = ERB::Compiler.new('<>') -# compiler.pre_cmd = ["_erbout=+''"] -# compiler.put_cmd = "_erbout.<<" -# compiler.insert_cmd = "_erbout.<<" -# compiler.post_cmd = ["_erbout"] -# -# code, enc = compiler.compile("Got <%= obj %>!\n") -# puts code -# -# Generates: -# -# #coding:UTF-8 -# _erbout=+''; _erbout.<< "Got ".freeze; _erbout.<<(( obj ).to_s); _erbout.<< "!\n".freeze; _erbout -# -# By default the output is sent to the print method. For example: -# -# compiler = ERB::Compiler.new('<>') -# code, enc = compiler.compile("Got <%= obj %>!\n") -# puts code -# -# Generates: -# -# #coding:UTF-8 -# print "Got ".freeze; print(( obj ).to_s); print "!\n".freeze -# -# == Evaluation -# -# The compiled code can be used in any context where the names in the code -# correctly resolve. Using the last example, each of these print 'Got It!' -# -# Evaluate using a variable: -# -# obj = 'It' -# eval code -# -# Evaluate using an input: -# -# mod = Module.new -# mod.module_eval %{ -# def get(obj) -# #{code} -# end -# } -# extend mod -# get('It') -# -# Evaluate using an accessor: -# -# klass = Class.new Object -# klass.class_eval %{ -# attr_accessor :obj -# def initialize(obj) -# @obj = obj -# end -# def get_it -# #{code} -# end -# } -# klass.new('It').get_it -# -# Good! See also ERB#def_method, ERB#def_module, and ERB#def_class. -class ERB::Compiler # :nodoc: - class PercentLine # :nodoc: - def initialize(str) - @value = str - end - attr_reader :value - alias :to_s :value - end - - class Scanner # :nodoc: - @scanner_map = defined?(Ractor) ? Ractor.make_shareable({}) : {} - class << self - if defined?(Ractor) - def register_scanner(klass, trim_mode, percent) - @scanner_map = Ractor.make_shareable({ **@scanner_map, [trim_mode, percent] => klass }) - end - else - def register_scanner(klass, trim_mode, percent) - @scanner_map[[trim_mode, percent]] = klass - end - end - alias :regist_scanner :register_scanner - end - - def self.default_scanner=(klass) - @default_scanner = klass - end - - def self.make_scanner(src, trim_mode, percent) - klass = @scanner_map.fetch([trim_mode, percent], @default_scanner) - klass.new(src, trim_mode, percent) - end - - DEFAULT_STAGS = %w(<%% <%= <%# <%).freeze - DEFAULT_ETAGS = %w(%%> %>).freeze - def initialize(src, trim_mode, percent) - @src = src - @stag = nil - @stags = DEFAULT_STAGS - @etags = DEFAULT_ETAGS - end - attr_accessor :stag - attr_reader :stags, :etags - - def scan; end - end - - class TrimScanner < Scanner # :nodoc: - def initialize(src, trim_mode, percent) - super - @trim_mode = trim_mode - @percent = percent - if @trim_mode == '>' - @scan_reg = /(.*?)(%>\r?\n|#{(stags + etags).join('|')}|\n|\z)/m - @scan_line = self.method(:trim_line1) - elsif @trim_mode == '<>' - @scan_reg = /(.*?)(%>\r?\n|#{(stags + etags).join('|')}|\n|\z)/m - @scan_line = self.method(:trim_line2) - elsif @trim_mode == '-' - @scan_reg = /(.*?)(^[ \t]*<%\-|<%\-|-%>\r?\n|-%>|#{(stags + etags).join('|')}|\z)/m - @scan_line = self.method(:explicit_trim_line) - else - @scan_reg = /(.*?)(#{(stags + etags).join('|')}|\n|\z)/m - @scan_line = self.method(:scan_line) - end - end - - def scan(&block) - @stag = nil - if @percent - @src.each_line do |line| - percent_line(line, &block) - end - else - @scan_line.call(@src, &block) - end - nil - end - - def percent_line(line, &block) - if @stag || line[0] != ?% - return @scan_line.call(line, &block) - end - - line[0] = '' - if line[0] == ?% - @scan_line.call(line, &block) - else - yield(PercentLine.new(line.chomp)) - end - end - - def scan_line(line) - line.scan(@scan_reg) do |tokens| - tokens.each do |token| - next if token.empty? - yield(token) - end - end - end - - def trim_line1(line) - line.scan(@scan_reg) do |tokens| - tokens.each do |token| - next if token.empty? - if token == "%>\n" || token == "%>\r\n" - yield('%>') - yield(:cr) - else - yield(token) - end - end - end - end - - def trim_line2(line) - head = nil - line.scan(@scan_reg) do |tokens| - tokens.each do |token| - next if token.empty? - head = token unless head - if token == "%>\n" || token == "%>\r\n" - yield('%>') - if is_erb_stag?(head) - yield(:cr) - else - yield("\n") - end - head = nil - else - yield(token) - head = nil if token == "\n" - end - end - end - end - - def explicit_trim_line(line) - line.scan(@scan_reg) do |tokens| - tokens.each do |token| - next if token.empty? - if @stag.nil? && /[ \t]*<%-/ =~ token - yield('<%') - elsif @stag && (token == "-%>\n" || token == "-%>\r\n") - yield('%>') - yield(:cr) - elsif @stag && token == '-%>' - yield('%>') - else - yield(token) - end - end - end - end - - ERB_STAG = %w(<%= <%# <%) - def is_erb_stag?(s) - ERB_STAG.member?(s) - end - end - - Scanner.default_scanner = TrimScanner - - begin - require 'strscan' - rescue LoadError - else - class SimpleScanner < Scanner # :nodoc: - def scan - stag_reg = (stags == DEFAULT_STAGS) ? /(.*?)(<%[%=#]?|\z)/m : /(.*?)(#{stags.join('|')}|\z)/m - etag_reg = (etags == DEFAULT_ETAGS) ? /(.*?)(%%?>|\z)/m : /(.*?)(#{etags.join('|')}|\z)/m - scanner = StringScanner.new(@src) - while ! scanner.eos? - scanner.scan(@stag ? etag_reg : stag_reg) - yield(scanner[1]) - yield(scanner[2]) - end - end - end - Scanner.register_scanner(SimpleScanner, nil, false) - - class ExplicitScanner < Scanner # :nodoc: - def scan - stag_reg = /(.*?)(^[ \t]*<%-|<%-|#{stags.join('|')}|\z)/m - etag_reg = /(.*?)(-%>|#{etags.join('|')}|\z)/m - scanner = StringScanner.new(@src) - while ! scanner.eos? - scanner.scan(@stag ? etag_reg : stag_reg) - yield(scanner[1]) - - elem = scanner[2] - if /[ \t]*<%-/ =~ elem - yield('<%') - elsif elem == '-%>' - yield('%>') - yield(:cr) if scanner.scan(/(\r?\n|\z)/) - else - yield(elem) - end - end - end - end - Scanner.register_scanner(ExplicitScanner, '-', false) - end - - class Buffer # :nodoc: - def initialize(compiler, enc=nil, frozen=nil) - @compiler = compiler - @line = [] - @script = +'' - @script << "#coding:#{enc}\n" if enc - @script << "#frozen-string-literal:#{frozen}\n" unless frozen.nil? - @compiler.pre_cmd.each do |x| - push(x) - end - end - attr_reader :script - - def push(cmd) - @line << cmd - end - - def cr - @script << (@line.join('; ')) - @line = [] - @script << "\n" - end - - def close - return unless @line - @compiler.post_cmd.each do |x| - push(x) - end - @script << (@line.join('; ')) - @line = nil - end - end - - def add_put_cmd(out, content) - out.push("#{@put_cmd} #{content.dump}.freeze#{"\n" * content.count("\n")}") - end - - def add_insert_cmd(out, content) - out.push("#{@insert_cmd}((#{content}).to_s)") - end - - # Compiles an ERB template into Ruby code. Returns an array of the code - # and encoding like ["code", Encoding]. - def compile(s) - enc = s.encoding - raise ArgumentError, "#{enc} is not ASCII compatible" if enc.dummy? - s = s.b # see String#b - magic_comment = detect_magic_comment(s, enc) - out = Buffer.new(self, *magic_comment) - - self.content = +'' - scanner = make_scanner(s) - scanner.scan do |token| - next if token.nil? - next if token == '' - if scanner.stag.nil? - compile_stag(token, out, scanner) - else - compile_etag(token, out, scanner) - end - end - add_put_cmd(out, content) if content.size > 0 - out.close - return out.script, *magic_comment - end - - def compile_stag(stag, out, scanner) - case stag - when PercentLine - add_put_cmd(out, content) if content.size > 0 - self.content = +'' - out.push(stag.to_s) - out.cr - when :cr - out.cr - when '<%', '<%=', '<%#' - scanner.stag = stag - add_put_cmd(out, content) if content.size > 0 - self.content = +'' - when "\n" - content << "\n" - add_put_cmd(out, content) - self.content = +'' - when '<%%' - content << '<%' - else - content << stag - end - end - - def compile_etag(etag, out, scanner) - case etag - when '%>' - compile_content(scanner.stag, out) - scanner.stag = nil - self.content = +'' - when '%%>' - content << '%>' - else - content << etag - end - end - - def compile_content(stag, out) - case stag - when '<%' - if content[-1] == ?\n - content.chop! - out.push(content) - out.cr - else - out.push(content) - end - when '<%=' - add_insert_cmd(out, content) - when '<%#' - out.push("\n" * content.count("\n")) # only adjust lineno - end - end - - def prepare_trim_mode(mode) # :nodoc: - case mode - when 1 - return [false, '>'] - when 2 - return [false, '<>'] - when 0, nil - return [false, nil] - when String - unless mode.match?(/\A(%|-|>|<>){1,2}\z/) - warn_invalid_trim_mode(mode, uplevel: 5) - end - - perc = mode.include?('%') - if mode.include?('-') - return [perc, '-'] - elsif mode.include?('<>') - return [perc, '<>'] - elsif mode.include?('>') - return [perc, '>'] - else - [perc, nil] - end - else - warn_invalid_trim_mode(mode, uplevel: 5) - return [false, nil] - end - end - - def make_scanner(src) # :nodoc: - Scanner.make_scanner(src, @trim_mode, @percent) - end - - # Construct a new compiler using the trim_mode. See ERB::new for available - # trim modes. - def initialize(trim_mode) - @percent, @trim_mode = prepare_trim_mode(trim_mode) - @put_cmd = 'print' - @insert_cmd = @put_cmd - @pre_cmd = [] - @post_cmd = [] - end - attr_reader :percent, :trim_mode - - # The command to handle text that ends with a newline - attr_accessor :put_cmd - - # The command to handle text that is inserted prior to a newline - attr_accessor :insert_cmd - - # An array of commands prepended to compiled code - attr_accessor :pre_cmd - - # An array of commands appended to compiled code - attr_accessor :post_cmd - - private - - # A buffered text in #compile - attr_accessor :content - - def detect_magic_comment(s, enc = nil) - re = @percent ? /\G(?:<%#(.*)%>|%#(.*)\n)/ : /\G<%#(.*)%>/ - frozen = nil - s.scan(re) do - comment = $+ - comment = $1 if comment[/-\*-\s*([^\s].*?)\s*-\*-$/] - case comment - when %r"coding\s*[=:]\s*([[:alnum:]\-_]+)" - enc = Encoding.find($1.sub(/-(?:mac|dos|unix)/i, '')) - when %r"frozen[-_]string[-_]literal\s*:\s*([[:alnum:]]+)" - frozen = $1 - end - end - return enc, frozen - end - - # :stopdoc: - WARNING_UPLEVEL = Class.new { - attr_reader :c - def initialize from - @c = caller.length - from.length - end - }.new(caller(0)).c - private_constant :WARNING_UPLEVEL - # :startdoc: - - def warn_invalid_trim_mode(mode, uplevel:) - warn "Invalid ERB trim mode: #{mode.inspect} (trim_mode: nil, 0, 1, 2, or String composed of '%' and/or '-', '>', '<>')", uplevel: uplevel + WARNING_UPLEVEL - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/def_method.rb b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/def_method.rb deleted file mode 100644 index e503b37..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/def_method.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -# ERB::DefMethod -# -# Utility module to define eRuby script as instance method. -# -# === Example -# -# example.rhtml: -# <% for item in @items %> -# <%= item %> -# <% end %> -# -# example.rb: -# require 'erb' -# class MyClass -# extend ERB::DefMethod -# def_erb_method('render()', 'example.rhtml') -# def initialize(items) -# @items = items -# end -# end -# print MyClass.new([10,20,30]).render() -# -# result: -# -# 10 -# -# 20 -# -# 30 -# -module ERB::DefMethod - # define _methodname_ as instance method of current module, using ERB - # object or eRuby file - def def_erb_method(methodname, erb_or_fname) - if erb_or_fname.kind_of? String - fname = erb_or_fname - erb = ERB.new(File.read(fname)) - erb.def_method(self, methodname, fname) - else - erb = erb_or_fname - erb.def_method(self, methodname, erb.filename || '(ERB)') - end - end - module_function :def_erb_method -end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/util.rb b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/util.rb deleted file mode 100644 index 42c7a57..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/util.rb +++ /dev/null @@ -1,76 +0,0 @@ -# frozen_string_literal: true - -# Load CGI.escapeHTML and CGI.escapeURIComponent. -# CRuby: -# cgi.gem v0.1.0+ (Ruby 2.7-3.4) and Ruby 3.5+ stdlib have 'cgi/escape' and CGI.escapeHTML. -# cgi.gem v0.3.3+ (Ruby 3.2-3.4) and Ruby 3.5+ stdlib have CGI.escapeURIComponent. -# JRuby: cgi.gem has a Java extension 'cgi/escape'. -# TruffleRuby: lib/truffle/cgi/escape.rb requires 'cgi/util'. -require 'cgi/escape' - -# Load or define ERB::Escape#html_escape. -# We don't build the C extention 'cgi/escape' for JRuby, TruffleRuby, and WASM. -# miniruby (used by CRuby build scripts) also fails to load erb/escape.so. -begin - require 'erb/escape' -rescue LoadError - # ERB::Escape - # - # A subset of ERB::Util. Unlike ERB::Util#html_escape, we expect/hope - # Rails will not monkey-patch ERB::Escape#html_escape. - module ERB::Escape - def html_escape(s) - CGI.escapeHTML(s.to_s) - end - module_function :html_escape - end -end - -# ERB::Util -# -# A utility module for conversion routines, often handy in HTML generation. -module ERB::Util - # - # A utility method for escaping HTML tag characters in _s_. - # - # require "erb" - # include ERB::Util - # - # puts html_escape("is a > 0 & a < 10?") - # - # _Generates_ - # - # is a > 0 & a < 10? - # - include ERB::Escape # html_escape - module_function :html_escape - alias h html_escape - module_function :h - - # - # A utility method for encoding the String _s_ as a URL. - # - # require "erb" - # include ERB::Util - # - # puts url_encode("Programming Ruby: The Pragmatic Programmer's Guide") - # - # _Generates_ - # - # Programming%20Ruby%3A%20%20The%20Pragmatic%20Programmer%27s%20Guide - # - if CGI.respond_to?(:escapeURIComponent) - def url_encode(s) - CGI.escapeURIComponent(s.to_s) - end - else # cgi.gem <= v0.3.2 - def url_encode(s) - s.to_s.b.gsub(/[^a-zA-Z0-9_\-.~]/n) do |m| - sprintf("%%%02X", m.unpack1("C")) - end - end - end - alias u url_encode - module_function :u - module_function :url_encode -end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/version.rb b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/version.rb deleted file mode 100644 index 0875dcb..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/lib/erb/version.rb +++ /dev/null @@ -1,4 +0,0 @@ -# frozen_string_literal: true -class ERB - VERSION = '5.0.2' -end diff --git a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/libexec/erb b/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/libexec/erb deleted file mode 100755 index 4381671..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/erb-5.0.2/libexec/erb +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env ruby -# Tiny eRuby --- ERB2 -# Copyright (c) 1999-2000,2002 Masatoshi SEKI -# You can redistribute it and/or modify it under the same terms as Ruby. - -require 'erb' - -class ERB - module Main - def ARGV.switch - return nil if self.empty? - arg = self.shift - return nil if arg == '--' - case arg - when /\A-(.)(.*)/ - if $1 == '-' - arg, @maybe_arg = arg.split(/=/, 2) - return arg - end - raise 'unknown switch "-"' if $2[0] == ?- and $1 != 'T' - if $2.size > 0 - self.unshift "-#{$2}" - @maybe_arg = $2 - else - @maybe_arg = nil - end - "-#{$1}" - when /\A(\w+)=/ - arg - else - self.unshift arg - nil - end - end - - def ARGV.req_arg - (@maybe_arg || self.shift || raise('missing argument')).tap { - @maybe_arg = nil - } - end - - def trim_mode_opt(trim_mode, disable_percent) - return trim_mode if disable_percent - case trim_mode - when 0 - return '%' - when 1 - return '%>' - when 2 - return '%<>' - when '-' - return '%-' - end - end - module_function :trim_mode_opt - - def run(factory=ERB) - trim_mode = 0 - disable_percent = false - variables = {} - begin - while switch = ARGV.switch - case switch - when '-x' # ruby source - output = true - when '-n' # line number - number = true - when '-v' # verbose - $VERBOSE = true - when '--version' # version - STDERR.puts factory.version - exit - when '-d', '--debug' # debug - $DEBUG = true - when '-r' # require - require ARGV.req_arg - when '-T' # trim mode - arg = ARGV.req_arg - if arg == '-' - trim_mode = arg - next - end - raise "invalid trim mode #{arg.dump}" unless arg =~ /\A[0-2]\z/ - trim_mode = arg.to_i - when '-E', '--encoding' - arg = ARGV.req_arg - set_encoding(*arg.split(/:/, 2)) - when '-U' - set_encoding(Encoding::UTF_8, Encoding::UTF_8) - when '-P' - disable_percent = true - when '--help' - raise "print this help" - when /\A-/ - raise "unknown switch #{switch.dump}" - else - var, val = *switch.split('=', 2) - (variables ||= {})[var] = val - end - end - rescue # usage - STDERR.puts $!.to_s - STDERR.puts File.basename($0) + - " [switches] [var=value...] [inputfile]" - STDERR.puts <= v10.12.2 - ([@jcmfernandes]) - -## 2.5.5 (2021-02-05) - -* [#256](https://github.com/socketry/nio4r/pull/256) - Use libev 4.33, featuring experimental `io_uring` support. - ([@jcmfernandes]) - -* [#260](https://github.com/socketry/nio4r/pull/260) - Workaround for ARM-based macOS Ruby: Use pure Ruby for M1, since the native extension is crashing on M1 (arm64). - ([@jasl]) - -* [#252](https://github.com/socketry/nio4r/pull/252) - JRuby: Fix javac -Xlint warnings - ([@headius]) - -## 2.5.4 (2020-09-16) - -* [#251](https://github.com/socketry/nio4r/issues/251) - Intermittent SEGV during GC. - ([@boazsegev]) - -## 2.5.3 (2020-09-07) - -* [#241](https://github.com/socketry/nio4r/issues/241) - Possible bug with Ruby >= 2.7.0 and `GC.compact`. - ([@boazsegev]) - -## 2.5.2 (2019-09-24) - -* [#220](https://github.com/socketry/nio4r/issues/220) - Update to libev-4.27 & fix assorted warnings. - ([@ioquatix]) - -* [#225](https://github.com/socketry/nio4r/issues/225) - Avoid need for linux headers. - ([@ioquatix]) - -## 2.4.0 (2019-07-07) - -* [#211](https://github.com/socketry/nio4r/pull/211) - Enable KQUEUE on macOS 10.14+. - ([@ioquatix]) - -* Bump minimum supported Ruby to 2.3. - ([@ioquatix]) - -* Assorted fixes for TruffleRuby & JRuby. - ([@eregon], [@olleolleolle]) -Possible bug with Ruby >= 2.7.0 and `GC.compact` -* Update libev to v4.25. - ([@ioquatix]) - -* Bind to ephemeral (port 0) for more reliable specs. - ([@ioquatix]) - -* Improve handling of SSL sockets and related specs. - ([@MSP-Greg]) - -## 2.3.1 (2018-05-03) - -* [#188](https://github.com/socketry/nio4r/pull/188) - Fix remove interests - ([@ioquatix]) - -## 2.3.0 (2018-03-15) - -* [#183](https://github.com/socketry/nio4r/pull/183) - Allow `Monitor#interests` to be nil - ([@ioquatix]) - -## 2.2.0 (2017-12-27) - -* [#151](https://github.com/socketry/nio4r/pull/151) - `NIO::Selector`: Support for enumerating and configuring backend - ([@tarcieri]) - -* [#153](https://github.com/socketry/nio4r/pull/153) - Fix builds on Windows - ([@unak]) - -* [#157](https://github.com/socketry/nio4r/pull/157) - Windows / MinGW test failure - fix spec_helper.rb - ([@MSP-Greg]) - -* [#162](https://github.com/socketry/nio4r/pull/162) - Don't build the C extension on Windows - ([@larskanis]) - -* [#164](https://github.com/socketry/nio4r/pull/164) - Fix NIO::ByteBuffer leak - ([@HoneyryderChuck]) - -* [#170](https://github.com/socketry/nio4r/pull/170) - Avoid CancelledKeyExceptions on JRuby - ([@HoneyryderChuck]) - -* [#177](https://github.com/socketry/nio4r/pull/177) - Fix `NIO::ByteBuffer` string conversions on JRuby - ([@tarcieri]) - -* [#179](https://github.com/socketry/nio4r/pull/179) - Fix argument error when running on ruby 2.5.0 - ([@tompng]) - -* [#180](https://github.com/socketry/nio4r/pull/180) - ext/nio4r/extconf.rb: check for port_event_t in port.h (fixes #178) - ([@tarcieri]) - -## 2.1.0 (2017-05-28) - -* [#130](https://github.com/socketry/nio4r/pull/130) - Add -fno-strict-aliasing flag when compiling C ext. - ([@junaruga]) - -* [#146](https://github.com/socketry/nio4r/pull/146) - Use non-blocking select when a timeout of 0 is given. - ([@tarcieri]) - -* [#147](https://github.com/socketry/nio4r/pull/147) - Update to libev 4.24. - ([@tarcieri]) - -* [#148](https://github.com/socketry/nio4r/pull/148) - Switch to the libev 4 API internally. - ([@tarcieri]) - -## 2.0.0 (2016-12-28) - -* [#53](https://github.com/socketry/nio4r/pull/53) - Limit lock scope to prevent recursive locking. - ([@johnnyt]) - -* [#95](https://github.com/socketry/nio4r/pull/95) - NIO::ByteBuffer Google Summer of Code project. - ([@UpeksheJay], [@tarcieri]) - -* [#111](https://github.com/socketry/nio4r/pull/111) - NIO::Selector#backend introspection support. - ([@tarcieri]) - -* [#112](https://github.com/socketry/nio4r/pull/112) - Upgrade to libev 4.23. - ([@tarcieri]) - -* [#119](https://github.com/socketry/nio4r/pull/119) - Disambiguate wakeup vs timeout (fixes #63, #66). - ([@tarcieri]) - -* [#124](https://github.com/socketry/nio4r/pull/124) - Monitor interests API improvements. - ([@tarcieri]) - -* Drop Ruby 2.0 and 2.1 support, require Ruby 2.2.2+. - ([@tarcieri]) - -## 1.2.1 (2016-01-31) - -* Fix bug in the JRuby backend which cases indefinite blocking when small - timeout values are passed to the selector - -## 1.2.0 (2015-12-22) - -* Add NIO::Monitor#interests= API for changing interests. Contributed by - Upekshe Jayasekera as a Google Summer of Code project. -* Update to libev 4.22 - -## 1.1.1 (2015-07-17) - -* Update to libev 4.20 -* Fall back to io.h if unistd.h is not found -* RSpec updates -* RuboCop - -## 1.1.0 (2015-01-10) - -* Update to libev 4.19 -* Do not call ev_io_stop on monitors if the loop is already closed - -## 1.0.1 (2014-09-01) - -* Fix C compiler warnings -* Eliminate Ruby warnings about @lock_holder -* Windows improvements -* Better support for Ruby 2.1 -* Automatically require 'set' -* Update to RSpec 3 - -## 1.0.0 (2014-01-14) - -* Have Selector#register obtain the actual IO from a Monitor object - because Monitor#initialize might convert it. -* Drop 1.8 support - -## 0.5.0 (2013-08-06) - -* Fix segv when attempting to register to a closed selector -* Fix Windows support on Ruby 2.0.0 -* Upgrade to libev 4.15 - -## 0.4.6 (2013-05-27) - -* Fix for JRuby on Windows - -## 0.4.5 - -* Fix botched gem release - -## 0.4.4 - -* Fix return values for Selector_synchronize and Selector_unlock - -## 0.4.3 - -* REALLY have thread synchronization when closing selectors ;) - -## 0.4.2 - -* Attempt to work around packaging problems with bundler-api o_O - -## 0.4.1 - -* Thread synchronization when closing selectors - -## 0.4.0 - -* OpenSSL::SSL::SSLSocket support - -## 0.3.3 - -* NIO::Selector#select_each removed -* Remove event buffer -* Patch GIL unlock directly into libev -* Re-release since 0.3.2 was botched :( - -## 0.3.1 - -* Prevent CancelledKeyExceptions on JRuby - -## 0.3.0 - -* NIO::Selector#select now takes a block and behaves like select_each -* NIO::Selector#select_each is now deprecated and will be removed -* Closing monitors detaches them from their selector -* Java extension for JRuby -* Upgrade to libev 4.11 -* Bugfixes for zero/negative select timeouts -* Handle OP_CONNECT properly on JRuby - -## 0.2.2 - -* Raise IOError if asked to wake up a closed selector - -## 0.2.1 - -* Implement wakeup mechanism using raw pipes instead of ev_async, since - ev_async likes to cause segvs when used across threads (despite claims - in the documentation to the contrary) - -## 0.2.0 - -* NIO::Monitor#readiness API to query readiness, along with #readable? and - #writable? helper methods -* NIO::Selector#select_each API which avoids memory allocations if possible -* Bugfixes for the JRuby implementation - -## 0.1.0 - -* Initial release. Merry Christmas! - -[@tarcieri]: https://github.com/tarcieri -[@johnnyt]: https://github.com/johnnyt -[@UpeksheJay]: https://github.com/UpeksheJay -[@junaruga]: https://github.com/junaruga -[@unak]: https://github.com/unak -[@MSP-Greg]: https://github.com/MSP-Greg -[@larskanis]: https://github.com/larskanis -[@HoneyryderChuck]: https://github.com/HoneyryderChuck -[@tompng]: https://github.com/tompng -[@ioquatix]: https://github.com/ioquatix -[@eregon]: https://github.com/eregon -[@olleolleolle]: https://github.com/olleolleolle -[@boazsegev]: https://github.com/boazsegev -[@headius]: https://github.com/headius -[@jasl]: https://github.com/jasl -[@jcmfernandes]: https://github.com/jcmfernandes diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/Changes b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/Changes deleted file mode 100644 index d200b9e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/Changes +++ /dev/null @@ -1,617 +0,0 @@ -Revision history for libev, a high-performance and full-featured event loop. - -TODO: for next ABI/API change, consider moving EV__IOFDSSET into io->fd instead and provide a getter. -TODO: document EV_TSTAMP_T - -4.33 Wed Mar 18 13:22:29 CET 2020 - - no changes w.r.t. 4.32. - -4.32 (EV only) - - the 4.31 timerfd code wrongly changed the priority of the signal - fd watcher, which is usually harmless unless signal fds are - also used (found via cpan tester service). - - the documentation wrongly claimed that user may modify fd and events - members in io watchers when the watcher was stopped - (found by b_jonas). - - new ev_io_modify mutator which changes only the events member, - which can be faster. also added ev::io::set (int events) method - to ev++.h. - - officially allow a zero events mask for io watchers. this should - work with older libev versions as well but was not officially - allowed before. - - do not wake up every minute when timerfd is used to detect timejumps. - - do not wake up every minute when periodics are disabled and we have - a monotonic clock. - - support a lot more "uncommon" compile time configurations, - such as ev_embed enabled but ev_timer disabled. - - use a start/stop wrapper class to reduce code duplication in - ev++.h and make it needlessly more c++-y. - - the linux aio backend is no longer compiled in by default. - - update to libecb version 0x00010008. - -4.31 Fri Dec 20 21:58:29 CET 2019 - - handle backends with minimum wait time a bit better by not - waiting in the presence of already-expired timers - (behaviour reported by Felipe Gasper). - - new feature: use timerfd to detect timejumps quickly, - can be disabled with the new EVFLAG_NOTIMERFD loop flag. - - document EV_USE_SIGNALFD feature macro. - -4.30 (EV only) - - change non-autoconf test for __kernel_rwf_t by testing - LINUX_VERSION_CODE, the most direct test I could find. - - fix a bug in the io_uring backend that polled the wrong - backend fd, causing it to not work in many cases. - -4.29 (EV only) - - add io uring autoconf and non-autoconf detection. - - disable io_uring when some header files are too old. - -4.28 (EV only) - - linuxaio backend resulted in random memory corruption - when loop is forked. - - linuxaio backend might have tried to cancel an iocb - multiple times (was unable to trigger this). - - linuxaio backend now employs a generation counter to - avoid handling spurious events from cancelled requests. - - io_cancel can return EINTR, deal with it. also, assume - io_submit also returns EINTR. - - fix some other minor bugs in linuxaio backend. - - ev_tstamp type can now be overriden by defining EV_TSTAMP_T. - - cleanup: replace expect_true/false and noinline by their - libecb counterparts. - - move syscall infrastructure from ev_linuxaio.c to ev.c. - - prepare io_uring integration. - - tweak ev_floor. - - epoll, poll, win32 Sleep and other places that use millisecond - reslution now all try to round up times. - - solaris port backend didn't compile. - - abstract time constants into their macros, for more flexibility. - -4.27 Thu Jun 27 22:43:44 CEST 2019 - - linux aio backend almost completely rewritten to work around its - limitations. - - linux aio backend now requires linux 4.19+. - - epoll backend now mandatory for linux aio backend. - - fail assertions more aggressively on invalid fd's detected - in the event loop, do not just silently fd_kill in case of - user error. - - ev_io_start/ev_io_stop now verify the watcher fd using - a syscall when EV_VERIFY is 2 or higher. - -4.26 (EV only) - - update to libecb 0x00010006. - - new experimental linux aio backend (linux 4.18+). - - removed redundant 0-ptr check in ev_once. - - updated/extended ev_set_allocator documentation. - - replaced EMPTY2 macro by array_needsize_noinit. - - minor code cleanups. - - epoll backend now uses epoll_create1 also after fork. - -4.25 Fri Dec 21 07:49:20 CET 2018 - - INCOMPATIBLE CHANGE: EV_THROW was renamed to EV_NOEXCEPT - (EV_THROW still provided) and now uses noexcept on C++11 or newer. - - move the darwin select workaround higher in ev.c, as newer versions of - darwin managed to break their broken select even more. - - ANDROID => __ANDROID__ (reported by enh@google.com). - - disable epoll_create1 on android because it has broken header files - and google is unwilling to fix them (reported by enh@google.com). - - avoid a minor compilation warning on win32. - - c++: remove deprecated dynamic throw() specifications. - - c++: improve the (unsupported) bad_loop exception class. - - backport perl ev_periodic example to C, untested. - - update libecb, biggets change is to include a memory fence - in ECB_MEMORY_FENCE_RELEASE on x86/amd64. - - minor autoconf/automake modernisation. - -4.24 Wed Dec 28 05:19:55 CET 2016 - - bump version to 4.24, as the release tarball inexplicably - didn't have the right version in ev.h, even though the cvs-tagged - version did have the right one (reported by Ales Teska). - -4.23 Wed Nov 16 18:23:41 CET 2016 - - move some declarations at the beginning to help certain retarded - microsoft compilers, even though their documentation claims - otherwise (reported by Ruslan Osmanov). - -4.22 Sun Dec 20 22:11:50 CET 2015 - - when epoll detects unremovable fds in the fd set, rebuild - only the epoll descriptor, not the signal pipe, to avoid - SIGPIPE in ev_async_send. This doesn't solve it on fork, - so document what needs to be done in ev_loop_fork - (analyzed by Benjamin Mahler). - - remove superfluous sys/timeb.h include on win32 - (analyzed by Jason Madden). - - updated libecb. - -4.20 Sat Jun 20 13:01:43 CEST 2015 - - prefer noexcept over throw () with C++ 11. - - update ecb.h due to incompatibilities with c11. - - fix a potential aliasing issue when reading and writing - watcher callbacks. - -4.19 Thu Sep 25 08:18:25 CEST 2014 - - ev.h wasn't valid C++ anymore, which tripped compilers other than - clang, msvc or gcc (analyzed by Raphael 'kena' Poss). Unfortunately, - C++ doesn't support typedefs for function pointers fully, so the affected - declarations have to spell out the types each time. - - when not using autoconf, tighten the check for clock_gettime and related - functionality. - -4.18 Fri Sep 5 17:55:26 CEST 2014 - - events on files were not always generated properly with the - epoll backend (testcase by Assaf Inbal). - - mark event pipe fd as cloexec after a fork (analyzed by Sami Farin). - - (ecb) support m68k, m88k and sh (patch by Miod Vallat). - - use a reasonable fallback for EV_NSIG instead of erroring out - when we can't detect the signal set size. - - in the absence of autoconf, do not use the clock syscall - on glibc >= 2.17 (avoids the syscall AND -lrt on systems - doing clock_gettime in userspace). - - ensure extern "C" function pointers are used for externally-visible - loop callbacks (not watcher callbacks yet). - - (ecb) work around memory barriers and volatile apparently both being - broken in visual studio 2008 and later (analysed and patch by Nicolas Noble). - -4.15 Fri Mar 1 12:04:50 CET 2013 - - destroying a non-default loop would stop the global waitpid - watcher (Denis Bilenko). - - queueing pending watchers of higher priority from a watcher now invokes - them in a timely fashion (reported by Denis Bilenko). - - add throw() to all libev functions that cannot throw exceptions, for - further code size decrease when compiling for C++. - - add throw () to callbacks that must not throw exceptions (allocator, - syserr, loop acquire/release, periodic reschedule cbs). - - fix event_base_loop return code, add event_get_callback, event_base_new, - event_base_get_method calls to improve libevent 1.x emulation and add - some libevent 2.x functionality (based on a patch by Jeff Davey). - - add more memory fences to fix a bug reported by Jeff Davey. Better - be overfenced than underprotected. - - ev_run now returns a boolean status (true meaning watchers are - still active). - - ev_once: undef EV_ERROR in ev_kqueue.c, to avoid clashing with - libev's EV_ERROR (reported by 191919). - - (ecb) add memory fence support for xlC (Darin McBride). - - (ecb) add memory fence support for gcc-mips (Anton Kirilov). - - (ecb) add memory fence support for gcc-alpha (Christian Weisgerber). - - work around some kernels losing file descriptors by leaking - the kqueue descriptor in the child. - - work around linux inotify not reporting IN_ATTRIB changes for directories - in many cases. - - include sys/syscall.h instead of plain syscall.h. - - check for io watcher loops in ev_verify, check for the most - common reported usage bug in ev_io_start. - - choose socket vs. WSASocket at compiletime using EV_USE_WSASOCKET. - - always use WSASend/WSARecv directly on windows, hoping that this - works in all cases (unlike read/write/send/recv...). - - try to detect signals around a fork faster (test program by - Denis Bilenko). - - work around recent glibc versions that leak memory in realloc. - - rename ev::embed::set to ev::embed::set_embed to avoid clashing - the watcher base set (loop) method. - - rewrite the async/signal pipe logic to always keep a valid fd, which - simplifies (and hopefully correctifies :) the race checking - on fork, at the cost of one extra fd. - - add fat, msdos, jffs2, ramfs, ntfs and btrfs to the list of - inotify-supporting filesystems. - - move orig_CFLAGS assignment to after AC_INIT, as newer autoconf - versions ignore it before - (https://bugzilla.redhat.com/show_bug.cgi?id=908096). - - add some untested android support. - - enum expressions must be of type int (reported by Juan Pablo L). - -4.11 Sat Feb 4 19:52:39 CET 2012 - - INCOMPATIBLE CHANGE: ev_timer_again now clears the pending status, as - was documented already, but not implemented in the repeating case. - - new compiletime symbols: EV_NO_SMP and EV_NO_THREADS. - - fix a race where the workaround against the epoll fork bugs - caused signals to not be handled anymore. - - correct backend_fudge for most backends, and implement a windows - specific workaround to avoid looping because we call both - select and Sleep, both with different time resolutions. - - document range and guarantees of ev_sleep. - - document reasonable ranges for periodics interval and offset. - - rename backend_fudge to backend_mintime to avoid future confusion :) - - change the default periodic reschedule function to hopefully be more - exact and correct even in corner cases or in the far future. - - do not rely on -lm anymore: use it when available but use our - own floor () if it is missing. This should make it easier to embed, - as no external libraries are required. - - strategically import macros from libecb and mark rarely-used functions - as cache-cold (saving almost 2k code size on typical amd64 setups). - - add Symbols.ev and Symbols.event files, that were missing. - - fix backend_mintime value for epoll (was 1/1024, is 1/1000 now). - - fix #3 "be smart about timeouts" to not "deadlock" when - timeout == now, also improve the section overall. - - avoid "AVOIDING FINISHING BEFORE RETURNING" idiom. - - support new EV_API_STATIC mode to make all libev symbols - static. - - supply default CFLAGS of -g -O3 with gcc when original CFLAGS - were empty. - -4.04 Wed Feb 16 09:01:51 CET 2011 - - fix two problems in the native win32 backend, where reuse of fd's - with different underlying handles caused handles not to be removed - or added to the select set (analyzed and tested by Bert Belder). - - do no rely on ceil() in ev_e?poll.c. - - backport libev to HP-UX versions before 11 v3. - - configure did not detect nanosleep and clock_gettime properly when - they are available in the libc (as opposed to -lrt). - -4.03 Tue Jan 11 14:37:25 CET 2011 - - officially support polling files with all backends. - - support files, /dev/zero etc. the same way as select in the epoll - backend, by generating events on our own. - - ports backend: work around solaris bug 6874410 and many related ones - (EINTR, maybe more), with no performance loss (note that the solaris - bug report is actually wrong, reality is far more bizarre and broken - than that). - - define EV_READ/EV_WRITE as macros in event.h, as some programs use - #ifdef to test for them. - - new (experimental) function: ev_feed_signal. - - new (to become default) EVFLAG_NOSIGMASK flag. - - new EVBACKEND_MASK symbol. - - updated COMMON IDIOMS SECTION. - -4.01 Fri Nov 5 21:51:29 CET 2010 - - automake fucked it up, apparently, --add-missing -f is not quite enough - to make it update its files, so 4.00 didn't install ev++.h and - event.h on make install. grrr. - - ev_loop(count|depth) didn't return anything (Robin Haberkorn). - - change EV_UNDEF to 0xffffffff to silence some overzealous compilers. - - use "(libev) " prefix for all libev error messages now. - -4.00 Mon Oct 25 12:32:12 CEST 2010 - - "PORTING FROM LIBEV 3.X TO 4.X" (in ev.pod) is recommended reading. - - ev_embed_stop did not correctly stop the watcher (very good - testcase by Vladimir Timofeev). - - ev_run will now always update the current loop time - it erroneously - didn't when idle watchers were active, causing timers not to fire. - - fix a bug where a timeout of zero caused the timer not to fire - in the libevent emulation (testcase by Péter Szabó). - - applied win32 fixes by Michael Lenaghan (also James Mansion). - - replace EV_MINIMAL by EV_FEATURES. - - prefer EPOLL_CTL_ADD over EPOLL_CTL_MOD in some more cases, as it - seems the former is *much* faster than the latter. - - linux kernel version detection (for inotify bug workarounds) - did not work properly. - - reduce the number of spurious wake-ups with the ports backend. - - remove dependency on sys/queue.h on freebsd (patch by Vanilla Hsu). - - do async init within ev_async_start, not ev_async_set, which avoids - an API quirk where the set function must be called in the C++ API - even when there is nothing to set. - - add (undocumented) EV_ENABLE when adding events with kqueue, - this might help with OS X, which seems to need it despite documenting - not to need it (helpfully pointed out by Tilghman Lesher). - - do not use poll by default on freebsd, it's broken (what isn't - on freebsd...). - - allow to embed epoll on kernels >= 2.6.32. - - configure now prepends -O3, not appends it, so one can still - override it. - - ev.pod: greatly expanded the portability section, added a porting - section, a description of watcher states and made lots of minor fixes. - - disable poll backend on AIX, the poll header spams the namespace - and it's not worth working around dead platforms (reported - and analyzed by Aivars Kalvans). - - improve header file compatibility of the standalone eventfd code - in an obscure case. - - implement EV_AVOID_STDIO option. - - do not use sscanf to parse linux version number (smaller, faster, - no sscanf dependency). - - new EV_CHILD_ENABLE and EV_SIGNAL_ENABLE configurable settings. - - update libev.m4 HAVE_CLOCK_SYSCALL test for newer glibcs. - - add section on accept() problems to the manpage. - - rename EV_TIMEOUT to EV_TIMER. - - rename ev_loop_count/depth/verify/loop/unloop. - - remove ev_default_destroy and ev_default_fork. - - switch to two-digit minor version. - - work around an apparent gentoo compiler bug. - - define _DARWIN_UNLIMITED_SELECT. just so. - - use enum instead of #define for most constants. - - improve compatibility to older C++ compilers. - - (experimental) ev_run/ev_default_loop/ev_break/ev_loop_new have now - default arguments when compiled as C++. - - enable automake dependency tracking. - - ev_loop_new no longer leaks memory when loop creation failed. - - new ev_cleanup watcher type. - -3.9 Thu Dec 31 07:59:59 CET 2009 - - signalfd is no longer used by default and has to be requested - explicitly - this means that easy to catch bugs become hard to - catch race conditions, but the users have spoken. - - point out the unspecified signal mask in the documentation, and - that this is a race condition regardless of EV_SIGNALFD. - - backport inotify code to C89. - - inotify file descriptors could leak into child processes. - - ev_stat watchers could keep an erroneous extra ref on the loop, - preventing exit when unregistering all watchers (testcases - provided by ry@tinyclouds.org). - - implement EV_WIN32_HANDLE_TO_FD and EV_WIN32_CLOSE_FD configuration - symbols to make it easier for apps to do their own fd management. - - support EV_IDLE_ENABLE being disabled in ev++.h - (patch by Didier Spezia). - - take advantage of inotify_init1, if available, to set cloexec/nonblock - on fd creation, to avoid races. - - the signal handling pipe wasn't always initialised under windows - (analysed by lekma). - - changed minimum glibc requirement from glibc 2.9 to 2.7, for - signalfd. - - add missing string.h include (Denis F. Latypoff). - - only replace ev_stat.prev when we detect an actual difference, - so prev is (almost) always different to attr. this might - have caused the problems with 04_stat.t. - - add ev::timer->remaining () method to C++ API. - -3.8 Sun Aug 9 14:30:45 CEST 2009 - - incompatible change: do not necessarily reset signal handler - to SIG_DFL when a sighandler is stopped. - - ev_default_destroy did not properly free or zero some members, - potentially causing crashes and memory corruption on repeated - ev_default_destroy/ev_default_loop calls. - - take advantage of signalfd on GNU/Linux systems. - - document that the signal mask might be in an unspecified - state when using libev's signal handling. - - take advantage of some GNU/Linux calls to set cloexec/nonblock - on fd creation, to avoid race conditions. - -3.7 Fri Jul 17 16:36:32 CEST 2009 - - ev_unloop and ev_loop wrongly used a global variable to exit loops, - instead of using a per-loop variable (bug caught by accident...). - - the ev_set_io_collect_interval interpretation has changed. - - add new functionality: ev_set_userdata, ev_userdata, - ev_set_invoke_pending_cb, ev_set_loop_release_cb, - ev_invoke_pending, ev_pending_count, together with a long example - about thread locking. - - add ev_timer_remaining (as requested by Denis F. Latypoff). - - add ev_loop_depth. - - calling ev_unloop in fork/prepare watchers will no longer poll - for new events. - - Denis F. Latypoff corrected many typos in example code snippets. - - honor autoconf detection of EV_USE_CLOCK_SYSCALL, also double- - check that the syscall number is available before trying to - use it (reported by ry@tinyclouds). - - use GetSystemTimeAsFileTime instead of _timeb on windows, for - slightly higher accuracy. - - properly declare ev_loop_verify and ev_now_update even when - !EV_MULTIPLICITY. - - do not compile in any priority code when EV_MAXPRI == EV_MINPRI. - - support EV_MINIMAL==2 for a reduced API. - - actually 0-initialise struct sigaction when installing signals. - - add section on hibernate and stopped processes to ev_timer docs. - -3.6 Tue Apr 28 02:49:30 CEST 2009 - - multiple timers becoming ready within an event loop iteration - will be invoked in the "correct" order now. - - do not leave the event loop early just because we have no active - watchers, fixing a problem when embedding a kqueue loop - that has active kernel events but no registered watchers - (reported by blacksand blacksand). - - correctly zero the idx values for arrays, so destroying and - reinitialising the default loop actually works (patch by - Malek Hadj-Ali). - - implement ev_suspend and ev_resume. - - new EV_CUSTOM revents flag for use by applications. - - add documentation section about priorities. - - add a glossary to the documentation. - - extend the ev_fork description slightly. - - optimize a jump out of call_pending. - -3.53 Sun Feb 15 02:38:20 CET 2009 - - fix a bug in event pipe creation on win32 that would cause a - failed assertion on event loop creation (patch by Malek Hadj-Ali). - - probe for CLOCK_REALTIME support at runtime as well and fall - back to gettimeofday if there is an error, to support older - operating systems with newer header files/libraries. - - prefer gettimeofday over clock_gettime with USE_CLOCK_SYSCALL - (default most everywhere), otherwise not. - -3.52 Wed Jan 7 21:43:02 CET 2009 - - fix compilation of select backend in fd_set mode when NFDBITS is - missing (to get it to compile on QNX, reported by Rodrigo Campos). - - better select-nfds handling when select backend is in fd_set mode. - - diagnose fd_set overruns when select backend is in fd_set mode. - - due to a thinko, instead of disabling everything but - select on the borked OS X platform, everything but select was - allowed (reported by Emanuele Giaquinta). - - actually verify that local and remote port are matching in - libev's socketpair emulation, which makes denial-of-service - attacks harder (but not impossible - it's windows). Make sure - it even works under vista, which thinks that getpeer/sockname - should return fantasy port numbers. - - include "libev" in all assertion messages for potentially - clearer diagnostics. - - event_get_version (libevent compatibility) returned - a useless string instead of the expected version string - (patch by W.C.A. Wijngaards). - -3.51 Wed Dec 24 23:00:11 CET 2008 - - fix a bug where an inotify watcher was added twice, causing - freezes on hash collisions (reported and analysed by Graham Leggett). - - new config symbol, EV_USE_CLOCK_SYSCALL, to make libev use - a direct syscall - slower, but no dependency on librt et al. - - assume negative return values != -1 signals success of port_getn - (http://cvs.epicsol.org/cgi/viewcvs.cgi/epic5/source/newio.c?rev=1.52) - (no known failure reports, but it doesn't hurt). - - fork detection in ev_embed now stops and restarts the watcher - automatically. - - EXPERIMENTAL: default the method to operator () in ev++.h, - to make it nicer to use functors (requested by Benedek László). - - fixed const object callbacks in ev++.h. - - replaced loop_ref argument of watcher.set (loop) by a direct - ev_loop * in ev++.h, to avoid clashes with functor patch. - - do not try to watch the empty string via inotify. - - inotify watchers could be leaked under certain circumstances. - - OS X 10.5 is actually even more broken than earlier versions, - so fall back to select on that piece of garbage. - - fixed some weirdness in the ev_embed documentation. - -3.49 Wed Nov 19 11:26:53 CET 2008 - - ev_stat watchers will now use inotify as a mere hint on - kernels <2.6.25, or if the filesystem is not in the - "known to be good" list. - - better mingw32 compatibility (it's not as borked as native win32) - (analysed by Roger Pack). - - include stdio.h in the example program, as too many people are - confused by the weird C language otherwise. I guess the next thing - I get told is that the "..." ellipses in the examples don't compile - with their C compiler. - -3.48 Thu Oct 30 09:02:37 CET 2008 - - further optimise away the EPOLL_CTL_ADD/MOD combo in the epoll - backend by assuming the kernel event mask hasn't changed if - ADD fails with EEXIST. - - work around spurious event notification bugs in epoll by using - a 32-bit generation counter. recreate kernel state if we receive - spurious notifications or unwanted events. this is very costly, - but I didn't come up with this horrible design. - - use memset to initialise most arrays now and do away with the - init functions. - - expand time-out strategies into a "Be smart about timeouts" section. - - drop the "struct" from all ev_watcher declarations in the - documentation and did other clarifications (yeah, it was a mistake - to have a struct AND a function called ev_loop). - - fix a bug where ev_default would not initialise the default - loop again after it was destroyed with ev_default_destroy. - - rename syserr to ev_syserr to avoid name clashes when embedding, - do similar changes for event.c. - -3.45 Tue Oct 21 21:59:26 CEST 2008 - - disable inotify usage on linux <2.6.25, as it is broken - (reported by Yoann Vandoorselaere). - - ev_stat erroneously would try to add inotify watchers - even when inotify wasn't available (this should only - have a performance impact). - - ev_once now passes both timeout and io to the callback if both - occur concurrently, instead of giving timeouts precedence. - - disable EV_USE_INOTIFY when sys/inotify.h is too old. - -3.44 Mon Sep 29 05:18:39 CEST 2008 - - embed watchers now automatically invoke ev_loop_fork on the - embedded loop when the parent loop forks. - - new function: ev_now_update (loop). - - verify_watcher was not marked static. - - improve the "associating..." manpage section. - - documentation tweaks here and there. - -3.43 Sun Jul 6 05:34:41 CEST 2008 - - include more include files on windows to get struct _stati64 - (reported by Chris Hulbert, but doesn't quite fix his issue). - - add missing #include in ev.c on windows (reported by - Matt Tolton). - -3.42 Tue Jun 17 12:12:07 CEST 2008 - - work around yet another windows bug: FD_SET actually adds fd's - multiple times to the fd_*SET*, despite official MSN docs claiming - otherwise. Reported and well-analysed by Matt Tolton. - - define NFDBITS to 0 when EV_SELECT_IS_WINSOCKET to make it compile - (reported any analysed by Chris Hulbert). - - fix a bug in ev_ebadf (this function is only used to catch - programming errors in the libev user). reported by Matt Tolton. - - fix a bug in fd_intern on win32 (could lead to compile errors - under some circumstances, but would work correctly if it compiles). - reported by Matt Tolton. - - (try to) work around missing lstat on windows. - - pass in the write fd set as except fd set under windows. windows - is so uncontrollably lame that it requires this. this means that - switching off oobinline is not supported (but tcp/ip doesn't - have oob, so that would be stupid anyways. - - use posix module symbol to auto-detect monotonic clock presence - and some other default values. - -3.41 Fri May 23 18:42:54 CEST 2008 - - work around an obscure bug in winsocket select: if you - provide only empty fd sets then select returns WSAEINVAL. how sucky. - - improve timer scheduling stability and reduce use of time_epsilon. - - use 1-based 2-heap for EV_MINIMAL, simplifies code, reduces - codesize and makes for better cache-efficiency. - - use 3-based 4-heap for !EV_MINIMAL. this makes better use - of cpu cache lines and gives better growth behaviour than - 2-based heaps. - - cache timestamp within heap for !EV_MINIMAL, to avoid random - memory accesses. - - document/add EV_USE_4HEAP and EV_HEAP_CACHE_AT. - - fix a potential aliasing issue in ev_timer_again. - - add/document ev_periodic_at, retract direct access to ->at. - - improve ev_stat docs. - - add portability requirements section. - - fix manpage headers etc. - - normalise WSA error codes to lower range on windows. - - add consistency check code that can be called automatically - or on demand to check for internal structures (ev_loop_verify). - -3.31 Wed Apr 16 20:45:04 CEST 2008 - - added last minute fix for ev_poll.c by Brandon Black. - -3.3 Wed Apr 16 19:04:10 CEST 2008 - - event_base_loopexit should return 0 on success - (W.C.A. Wijngaards). - - added linux eventfd support. - - try to autodetect epoll and inotify support - by libc header version if not using autoconf. - - new symbols: EV_DEFAULT_UC and EV_DEFAULT_UC_. - - declare functions defined in ev.h as inline if - C99 or gcc are available. - - enable inlining with gcc versions 2 and 3. - - work around broken poll implementations potentially - not clearing revents field in ev_poll (Brandon Black) - (no such systems are known at this time). - - work around a bug in realloc on openbsd and darwin, - also makes the erroneous valgrind complaints - go away (noted by various people). - - fix ev_async_pending, add c++ wrapper for ev_async - (based on patch sent by Johannes Deisenhofer). - - add sensible set method to ev::embed. - - made integer constants type int in ev.h. - -3.2 Wed Apr 2 17:11:19 CEST 2008 - - fix a 64 bit overflow issue in the select backend, - by using fd_mask instead of int for the mask. - - rename internal sighandler to avoid clash with very old perls. - - entering ev_loop will not clear the ONESHOT or NONBLOCKING - flags of any outer loops anymore. - - add ev_async_pending. - -3.1 Thu Mar 13 13:45:22 CET 2008 - - implement ev_async watchers. - - only initialise signal pipe on demand. - - make use of sig_atomic_t configurable. - - improved documentation. - -3.0 Mon Jan 28 13:14:47 CET 2008 - - API/ABI bump to version 3.0. - - ev++.h includes "ev.h" by default now, not . - - slightly improved documentation. - - speed up signal detection after a fork. - - only optionally return trace status changed in ev_child - watchers. - - experimental (and undocumented) loop wrappers for ev++.h. - -2.01 Tue Dec 25 08:04:41 CET 2007 - - separate Changes file. - - fix ev_path_set => ev_stat_set typo. - - remove event_compat.h from the libev tarball. - - change how include files are found. - - doc updates. - - update licenses, explicitly allow for GPL relicensing. - -2.0 Sat Dec 22 17:47:03 CET 2007 - - new ev_sleep, ev_set_(io|timeout)_collect_interval. - - removed epoll from embeddable fd set. - - fix embed watchers. - - renamed ev_embed.loop to other. - - added exported Symbol tables. - - undefine member wrapper macros at the end of ev.c. - - respect EV_H in ev++.h. - -1.86 Tue Dec 18 02:36:57 CET 2007 - - fix memleak on loop destroy (not relevant for perl). - -1.85 Fri Dec 14 20:32:40 CET 2007 - - fix some aliasing issues w.r.t. timers and periodics - (not relevant for perl). - -(for historic versions refer to EV/Changes, found in the Perl interface) - -0.1 Wed Oct 31 21:31:48 CET 2007 - - original version; hacked together in <24h. - diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/LICENSE b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/LICENSE deleted file mode 100644 index 2fdabd4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/LICENSE +++ /dev/null @@ -1,37 +0,0 @@ -All files in libev are -Copyright (c)2007,2008,2009,2010,2011,2012,2013 Marc Alexander Lehmann. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Alternatively, the contents of this package may be used under the terms -of the GNU General Public License ("GPL") version 2 or any later version, -in which case the provisions of the GPL are applicable instead of the -above. If you wish to allow the use of your version of this package only -under the terms of the GPL and not to allow others to use your version of -this file under the BSD license, indicate your decision by deleting the -provisions above and replace them with the notice and other provisions -required by the GPL in this and the other files of this package. If you do -not delete the provisions above, a recipient may use your version of this -file under either the BSD or the GPL. diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/README b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/README deleted file mode 100644 index fca5fdf..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/README +++ /dev/null @@ -1,59 +0,0 @@ -libev is a high-performance event loop/event model with lots of features. -(see benchmark at http://libev.schmorp.de/bench.html) - - -ABOUT - - Homepage: http://software.schmorp.de/pkg/libev - Mailinglist: libev@lists.schmorp.de - http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev - Library Documentation: http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod - - Libev is modelled (very losely) after libevent and the Event perl - module, but is faster, scales better and is more correct, and also more - featureful. And also smaller. Yay. - - Some of the specialties of libev not commonly found elsewhere are: - - - extensive and detailed, readable documentation (not doxygen garbage). - - fully supports fork, can detect fork in various ways and automatically - re-arms kernel mechanisms that do not support fork. - - highly optimised select, poll, linux epoll, linux aio, bsd kqueue - and solaris event ports backends. - - filesystem object (path) watching (with optional linux inotify support). - - wallclock-based times (using absolute time, cron-like). - - relative timers/timeouts (handle time jumps). - - fast intra-thread communication between multiple - event loops (with optional fast linux eventfd backend). - - extremely easy to embed (fully documented, no dependencies, - autoconf supported but optional). - - very small codebase, no bloated library, simple code. - - fully extensible by being able to plug into the event loop, - integrate other event loops, integrate other event loop users. - - very little memory use (small watchers, small event loop data). - - optional C++ interface allowing method and function callbacks - at no extra memory or runtime overhead. - - optional Perl interface with similar characteristics (capable - of running Glib/Gtk2 on libev). - - support for other languages (multiple C++ interfaces, D, Ruby, - Python) available from third-parties. - - Examples of programs that embed libev: the EV perl module, node.js, - auditd, rxvt-unicode, gvpe (GNU Virtual Private Ethernet), the - Deliantra MMORPG server (http://www.deliantra.net/), Rubinius (a - next-generation Ruby VM), the Ebb web server, the Rev event toolkit. - - -CONTRIBUTORS - - libev was written and designed by Marc Lehmann and Emanuele Giaquinta. - - The following people sent in patches or made other noteworthy - contributions to the design (for minor patches, see the Changes - file. If I forgot to include you, please shout at me, it was an - accident): - - W.C.A. Wijngaards - Christopher Layne - Chris Brody - diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev.c deleted file mode 100644 index fcba49f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev.c +++ /dev/null @@ -1,5689 +0,0 @@ -/* - * libev event processing core, watcher management - * - * Copyright (c) 2007-2019 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -/* ########## NIO4R PATCHERY HO! ########## */ -#include "ruby.h" -#include "ruby/thread.h" - -#ifdef __APPLE__ -#include -#endif -/* ######################################## */ - -/* this big block deduces configuration from config.h */ -#ifndef EV_STANDALONE -# ifdef EV_CONFIG_H -# include EV_CONFIG_H -# else -# include "config.h" -# endif - -# if HAVE_FLOOR -# ifndef EV_USE_FLOOR -# define EV_USE_FLOOR 1 -# endif -# endif - -# if HAVE_CLOCK_SYSCALL -# ifndef EV_USE_CLOCK_SYSCALL -# define EV_USE_CLOCK_SYSCALL 1 -# ifndef EV_USE_REALTIME -# define EV_USE_REALTIME 0 -# endif -# ifndef EV_USE_MONOTONIC -# define EV_USE_MONOTONIC 1 -# endif -# endif -# elif !defined EV_USE_CLOCK_SYSCALL -# define EV_USE_CLOCK_SYSCALL 0 -# endif - -# if HAVE_CLOCK_GETTIME -# ifndef EV_USE_MONOTONIC -# define EV_USE_MONOTONIC 1 -# endif -# ifndef EV_USE_REALTIME -# define EV_USE_REALTIME 0 -# endif -# else -# ifndef EV_USE_MONOTONIC -# define EV_USE_MONOTONIC 0 -# endif -# ifndef EV_USE_REALTIME -# define EV_USE_REALTIME 0 -# endif -# endif - -# if HAVE_NANOSLEEP -# ifndef EV_USE_NANOSLEEP -# define EV_USE_NANOSLEEP EV_FEATURE_OS -# endif -# else -# undef EV_USE_NANOSLEEP -# define EV_USE_NANOSLEEP 0 -# endif - -# if HAVE_SELECT && HAVE_SYS_SELECT_H -# ifndef EV_USE_SELECT -# define EV_USE_SELECT EV_FEATURE_BACKENDS -# endif -# else -# undef EV_USE_SELECT -# define EV_USE_SELECT 0 -# endif - -# if HAVE_POLL && HAVE_POLL_H -# ifndef EV_USE_POLL -# define EV_USE_POLL EV_FEATURE_BACKENDS -# endif -# else -# undef EV_USE_POLL -# define EV_USE_POLL 0 -# endif - -# if HAVE_EPOLL_CTL && HAVE_SYS_EPOLL_H -# ifndef EV_USE_EPOLL -# define EV_USE_EPOLL EV_FEATURE_BACKENDS -# endif -# else -# undef EV_USE_EPOLL -# define EV_USE_EPOLL 0 -# endif - -# if HAVE_LINUX_AIO_ABI_H -# ifndef EV_USE_LINUXAIO -# define EV_USE_LINUXAIO 0 /* was: EV_FEATURE_BACKENDS, always off by default */ -# endif -# else -# undef EV_USE_LINUXAIO -# define EV_USE_LINUXAIO 0 -# endif - -# if HAVE_LINUX_FS_H && HAVE_SYS_TIMERFD_H && HAVE_KERNEL_RWF_T -# ifndef EV_USE_IOURING -# define EV_USE_IOURING EV_FEATURE_BACKENDS -# endif -# else -# undef EV_USE_IOURING -# define EV_USE_IOURING 0 -# endif - -# if HAVE_KQUEUE && HAVE_SYS_EVENT_H -# ifndef EV_USE_KQUEUE -# define EV_USE_KQUEUE EV_FEATURE_BACKENDS -# endif -# else -# undef EV_USE_KQUEUE -# define EV_USE_KQUEUE 0 -# endif - -# if HAVE_PORT_H && HAVE_PORT_CREATE -# ifndef EV_USE_PORT -# define EV_USE_PORT EV_FEATURE_BACKENDS -# endif -# else -# undef EV_USE_PORT -# define EV_USE_PORT 0 -# endif - -# if HAVE_INOTIFY_INIT && HAVE_SYS_INOTIFY_H -# ifndef EV_USE_INOTIFY -# define EV_USE_INOTIFY EV_FEATURE_OS -# endif -# else -# undef EV_USE_INOTIFY -# define EV_USE_INOTIFY 0 -# endif - -# if HAVE_SIGNALFD && HAVE_SYS_SIGNALFD_H -# ifndef EV_USE_SIGNALFD -# define EV_USE_SIGNALFD EV_FEATURE_OS -# endif -# else -# undef EV_USE_SIGNALFD -# define EV_USE_SIGNALFD 0 -# endif - -# if HAVE_EVENTFD -# ifndef EV_USE_EVENTFD -# define EV_USE_EVENTFD EV_FEATURE_OS -# endif -# else -# undef EV_USE_EVENTFD -# define EV_USE_EVENTFD 0 -# endif - -# if HAVE_SYS_TIMERFD_H -# ifndef EV_USE_TIMERFD -# define EV_USE_TIMERFD EV_FEATURE_OS -# endif -# else -# undef EV_USE_TIMERFD -# define EV_USE_TIMERFD 0 -# endif - -#endif - -/* OS X, in its infinite idiocy, actually HARDCODES - * a limit of 1024 into their select. Where people have brains, - * OS X engineers apparently have a vacuum. Or maybe they were - * ordered to have a vacuum, or they do anything for money. - * This might help. Or not. - * Note that this must be defined early, as other include files - * will rely on this define as well. - */ -#define _DARWIN_UNLIMITED_SELECT 1 - -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -#include - -#ifdef EV_H -# include EV_H -#else -# include "ev.h" -#endif - -#if EV_NO_THREADS -# undef EV_NO_SMP -# define EV_NO_SMP 1 -# undef ECB_NO_THREADS -# define ECB_NO_THREADS 1 -#endif -#if EV_NO_SMP -# undef EV_NO_SMP -# define ECB_NO_SMP 1 -#endif - -#ifndef _WIN32 -# include -# include -# include -#else -# include -# define WIN32_LEAN_AND_MEAN -# include -# include -# ifndef EV_SELECT_IS_WINSOCKET -# define EV_SELECT_IS_WINSOCKET 1 -# endif -# undef EV_AVOID_STDIO -#endif - -/* this block tries to deduce configuration from header-defined symbols and defaults */ - -/* try to deduce the maximum number of signals on this platform */ -#if defined EV_NSIG -/* use what's provided */ -#elif defined NSIG -# define EV_NSIG (NSIG) -#elif defined _NSIG -# define EV_NSIG (_NSIG) -#elif defined SIGMAX -# define EV_NSIG (SIGMAX+1) -#elif defined SIG_MAX -# define EV_NSIG (SIG_MAX+1) -#elif defined _SIG_MAX -# define EV_NSIG (_SIG_MAX+1) -#elif defined MAXSIG -# define EV_NSIG (MAXSIG+1) -#elif defined MAX_SIG -# define EV_NSIG (MAX_SIG+1) -#elif defined SIGARRAYSIZE -# define EV_NSIG (SIGARRAYSIZE) /* Assume ary[SIGARRAYSIZE] */ -#elif defined _sys_nsig -# define EV_NSIG (_sys_nsig) /* Solaris 2.5 */ -#else -# define EV_NSIG (8 * sizeof (sigset_t) + 1) -#endif - -#ifndef EV_USE_FLOOR -# define EV_USE_FLOOR 0 -#endif - -#ifndef EV_USE_CLOCK_SYSCALL -# if __linux && __GLIBC__ == 2 && __GLIBC_MINOR__ < 17 -# define EV_USE_CLOCK_SYSCALL EV_FEATURE_OS -# else -# define EV_USE_CLOCK_SYSCALL 0 -# endif -#endif - -#if !(_POSIX_TIMERS > 0) -# ifndef EV_USE_MONOTONIC -# define EV_USE_MONOTONIC 0 -# endif -# ifndef EV_USE_REALTIME -# define EV_USE_REALTIME 0 -# endif -#endif - -#ifndef EV_USE_MONOTONIC -# if defined _POSIX_MONOTONIC_CLOCK && _POSIX_MONOTONIC_CLOCK >= 0 -# define EV_USE_MONOTONIC EV_FEATURE_OS -# else -# define EV_USE_MONOTONIC 0 -# endif -#endif - -#ifndef EV_USE_REALTIME -# define EV_USE_REALTIME !EV_USE_CLOCK_SYSCALL -#endif - -#ifndef EV_USE_NANOSLEEP -# if _POSIX_C_SOURCE >= 199309L -# define EV_USE_NANOSLEEP EV_FEATURE_OS -# else -# define EV_USE_NANOSLEEP 0 -# endif -#endif - -#ifndef EV_USE_SELECT -# define EV_USE_SELECT EV_FEATURE_BACKENDS -#endif - -#ifndef EV_USE_POLL -# ifdef _WIN32 -# define EV_USE_POLL 0 -# else -# define EV_USE_POLL EV_FEATURE_BACKENDS -# endif -#endif - -#ifndef EV_USE_EPOLL -# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 4)) -# define EV_USE_EPOLL EV_FEATURE_BACKENDS -# else -# define EV_USE_EPOLL 0 -# endif -#endif - -#ifndef EV_USE_KQUEUE -# define EV_USE_KQUEUE 0 -#endif - -#ifndef EV_USE_PORT -# define EV_USE_PORT 0 -#endif - -#ifndef EV_USE_LINUXAIO -# define EV_USE_LINUXAIO 0 -#endif - -#ifndef EV_USE_IOURING -# define EV_USE_IOURING 0 -#endif - -#ifndef EV_USE_INOTIFY -# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 4)) -# define EV_USE_INOTIFY EV_FEATURE_OS -# else -# define EV_USE_INOTIFY 0 -# endif -#endif - -#ifndef EV_PID_HASHSIZE -# define EV_PID_HASHSIZE EV_FEATURE_DATA ? 16 : 1 -#endif - -#ifndef EV_INOTIFY_HASHSIZE -# define EV_INOTIFY_HASHSIZE EV_FEATURE_DATA ? 16 : 1 -#endif - -#ifndef EV_USE_EVENTFD -# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7)) -# define EV_USE_EVENTFD EV_FEATURE_OS -# else -# define EV_USE_EVENTFD 0 -# endif -#endif - -#ifndef EV_USE_SIGNALFD -# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7)) -# define EV_USE_SIGNALFD EV_FEATURE_OS -# else -# define EV_USE_SIGNALFD 0 -# endif -#endif - -#ifndef EV_USE_TIMERFD -# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8)) -# define EV_USE_TIMERFD EV_FEATURE_OS -# else -# define EV_USE_TIMERFD 0 -# endif -#endif - -#if 0 /* debugging */ -# define EV_VERIFY 3 -# define EV_USE_4HEAP 1 -# define EV_HEAP_CACHE_AT 1 -#endif - -#ifndef EV_VERIFY -# define EV_VERIFY (EV_FEATURE_API ? 1 : 0) -#endif - -#ifndef EV_USE_4HEAP -# define EV_USE_4HEAP EV_FEATURE_DATA -#endif - -#ifndef EV_HEAP_CACHE_AT -# define EV_HEAP_CACHE_AT EV_FEATURE_DATA -#endif - -#ifdef __ANDROID__ -/* supposedly, android doesn't typedef fd_mask */ -# undef EV_USE_SELECT -# define EV_USE_SELECT 0 -/* supposedly, we need to include syscall.h, not sys/syscall.h, so just disable */ -# undef EV_USE_CLOCK_SYSCALL -# define EV_USE_CLOCK_SYSCALL 0 -#endif - -/* aix's poll.h seems to cause lots of trouble */ -#ifdef _AIX -/* AIX has a completely broken poll.h header */ -# undef EV_USE_POLL -# define EV_USE_POLL 0 -#endif - -/* on linux, we can use a (slow) syscall to avoid a dependency on pthread, */ -/* which makes programs even slower. might work on other unices, too. */ -#if EV_USE_CLOCK_SYSCALL -# include -# ifdef SYS_clock_gettime -# define clock_gettime(id, ts) syscall (SYS_clock_gettime, (id), (ts)) -# undef EV_USE_MONOTONIC -# define EV_USE_MONOTONIC 1 -# define EV_NEED_SYSCALL 1 -# else -# undef EV_USE_CLOCK_SYSCALL -# define EV_USE_CLOCK_SYSCALL 0 -# endif -#endif - -/* this block fixes any misconfiguration where we know we run into trouble otherwise */ - -#ifndef CLOCK_MONOTONIC -# undef EV_USE_MONOTONIC -# define EV_USE_MONOTONIC 0 -#endif - -#ifndef CLOCK_REALTIME -# undef EV_USE_REALTIME -# define EV_USE_REALTIME 0 -#endif - -#if !EV_STAT_ENABLE -# undef EV_USE_INOTIFY -# define EV_USE_INOTIFY 0 -#endif - -#if !EV_USE_NANOSLEEP -/* hp-ux has it in sys/time.h, which we unconditionally include above */ -# if !defined _WIN32 && !defined __hpux -# include -# endif -#endif - -#if EV_USE_LINUXAIO -# include -# if SYS_io_getevents && EV_USE_EPOLL /* linuxaio backend requires epoll backend */ -# define EV_NEED_SYSCALL 1 -# else -# undef EV_USE_LINUXAIO -# define EV_USE_LINUXAIO 0 -# endif -#endif - -#if EV_USE_IOURING -# include -# if !SYS_io_uring_setup && __linux && !__alpha -# define SYS_io_uring_setup 425 -# define SYS_io_uring_enter 426 -# define SYS_io_uring_wregister 427 -# endif -# if SYS_io_uring_setup && EV_USE_EPOLL /* iouring backend requires epoll backend */ -# define EV_NEED_SYSCALL 1 -# else -# undef EV_USE_IOURING -# define EV_USE_IOURING 0 -# endif -#endif - -#if EV_USE_INOTIFY -# include -# include -/* some very old inotify.h headers don't have IN_DONT_FOLLOW */ -# ifndef IN_DONT_FOLLOW -# undef EV_USE_INOTIFY -# define EV_USE_INOTIFY 0 -# endif -#endif - -#if EV_USE_EVENTFD -/* our minimum requirement is glibc 2.7 which has the stub, but not the full header */ -# include -# ifndef EFD_NONBLOCK -# define EFD_NONBLOCK O_NONBLOCK -# endif -# ifndef EFD_CLOEXEC -# ifdef O_CLOEXEC -# define EFD_CLOEXEC O_CLOEXEC -# else -# define EFD_CLOEXEC 02000000 -# endif -# endif -EV_CPP(extern "C") int (eventfd) (unsigned int initval, int flags); -#endif - -#if EV_USE_SIGNALFD -/* our minimum requirement is glibc 2.7 which has the stub, but not the full header */ -# include -# ifndef SFD_NONBLOCK -# define SFD_NONBLOCK O_NONBLOCK -# endif -# ifndef SFD_CLOEXEC -# ifdef O_CLOEXEC -# define SFD_CLOEXEC O_CLOEXEC -# else -# define SFD_CLOEXEC 02000000 -# endif -# endif -EV_CPP (extern "C") int (signalfd) (int fd, const sigset_t *mask, int flags); - -struct signalfd_siginfo -{ - uint32_t ssi_signo; - char pad[128 - sizeof (uint32_t)]; -}; -#endif - -/* for timerfd, libev core requires TFD_TIMER_CANCEL_ON_SET &c */ -#if EV_USE_TIMERFD -# include -/* timerfd is only used for periodics */ -# if !(defined (TFD_TIMER_CANCEL_ON_SET) && defined (TFD_CLOEXEC) && defined (TFD_NONBLOCK)) || !EV_PERIODIC_ENABLE -# undef EV_USE_TIMERFD -# define EV_USE_TIMERFD 0 -# endif -#endif - -/*****************************************************************************/ - -#if EV_VERIFY >= 3 -# define EV_FREQUENT_CHECK ev_verify (EV_A) -#else -# define EV_FREQUENT_CHECK do { } while (0) -#endif - -/* - * This is used to work around floating point rounding problems. - * This value is good at least till the year 4000. - */ -#define MIN_INTERVAL 0.0001220703125 /* 1/2**13, good till 4000 */ -/*#define MIN_INTERVAL 0.00000095367431640625 /* 1/2**20, good till 2200 */ - -#define MIN_TIMEJUMP 1. /* minimum timejump that gets detected (if monotonic clock available) */ -#define MAX_BLOCKTIME 59.743 /* never wait longer than this time (to detect time jumps) */ -#define MAX_BLOCKTIME2 1500001.07 /* same, but when timerfd is used to detect jumps, also safe delay to not overflow */ - -/* find a portable timestamp that is "always" in the future but fits into time_t. - * this is quite hard, and we are mostly guessing - we handle 32 bit signed/unsigned time_t, - * and sizes larger than 32 bit, and maybe the unlikely floating point time_t */ -#define EV_TSTAMP_HUGE \ - (sizeof (time_t) >= 8 ? 10000000000000. \ - : 0 < (time_t)4294967295 ? 4294967295. \ - : 2147483647.) \ - -#ifndef EV_TS_CONST -# define EV_TS_CONST(nv) nv -# define EV_TS_TO_MSEC(a) a * 1e3 + 0.9999 -# define EV_TS_FROM_USEC(us) us * 1e-6 -# define EV_TV_SET(tv,t) do { tv.tv_sec = (long)t; tv.tv_usec = (long)((t - tv.tv_sec) * 1e6); } while (0) -# define EV_TS_SET(ts,t) do { ts.tv_sec = (long)t; ts.tv_nsec = (long)((t - ts.tv_sec) * 1e9); } while (0) -# define EV_TV_GET(tv) ((tv).tv_sec + (tv).tv_usec * 1e-6) -# define EV_TS_GET(ts) ((ts).tv_sec + (ts).tv_nsec * 1e-9) -#endif - -/* the following is ecb.h embedded into libev - use update_ev_c to update from an external copy */ -/* ECB.H BEGIN */ -/* - * libecb - http://software.schmorp.de/pkg/libecb - * - * Copyright (©) 2009-2015,2018-2020 Marc Alexander Lehmann - * Copyright (©) 2011 Emanuele Giaquinta - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -#ifndef ECB_H -#define ECB_H - -/* 16 bits major, 16 bits minor */ -#define ECB_VERSION 0x00010008 - -#include /* for memcpy */ - -#if defined (_WIN32) && !defined (__MINGW32__) - typedef signed char int8_t; - typedef unsigned char uint8_t; - typedef signed char int_fast8_t; - typedef unsigned char uint_fast8_t; - typedef signed short int16_t; - typedef unsigned short uint16_t; - typedef signed int int_fast16_t; - typedef unsigned int uint_fast16_t; - typedef signed int int32_t; - typedef unsigned int uint32_t; - typedef signed int int_fast32_t; - typedef unsigned int uint_fast32_t; - #if __GNUC__ - typedef signed long long int64_t; - typedef unsigned long long uint64_t; - #else /* _MSC_VER || __BORLANDC__ */ - typedef signed __int64 int64_t; - typedef unsigned __int64 uint64_t; - #endif - typedef int64_t int_fast64_t; - typedef uint64_t uint_fast64_t; - #ifdef _WIN64 - #define ECB_PTRSIZE 8 - typedef uint64_t uintptr_t; - typedef int64_t intptr_t; - #else - #define ECB_PTRSIZE 4 - typedef uint32_t uintptr_t; - typedef int32_t intptr_t; - #endif -#else - #include - #if (defined INTPTR_MAX ? INTPTR_MAX : ULONG_MAX) > 0xffffffffU - #define ECB_PTRSIZE 8 - #else - #define ECB_PTRSIZE 4 - #endif -#endif - -#define ECB_GCC_AMD64 (__amd64 || __amd64__ || __x86_64 || __x86_64__) -#define ECB_MSVC_AMD64 (_M_AMD64 || _M_X64) - -#ifndef ECB_OPTIMIZE_SIZE - #if __OPTIMIZE_SIZE__ - #define ECB_OPTIMIZE_SIZE 1 - #else - #define ECB_OPTIMIZE_SIZE 0 - #endif -#endif - -/* work around x32 idiocy by defining proper macros */ -#if ECB_GCC_AMD64 || ECB_MSVC_AMD64 - #if _ILP32 - #define ECB_AMD64_X32 1 - #else - #define ECB_AMD64 1 - #endif -#endif - -/* many compilers define _GNUC_ to some versions but then only implement - * what their idiot authors think are the "more important" extensions, - * causing enormous grief in return for some better fake benchmark numbers. - * or so. - * we try to detect these and simply assume they are not gcc - if they have - * an issue with that they should have done it right in the first place. - */ -#if !defined __GNUC_MINOR__ || defined __INTEL_COMPILER || defined __SUNPRO_C || defined __SUNPRO_CC || defined __llvm__ || defined __clang__ - #define ECB_GCC_VERSION(major,minor) 0 -#else - #define ECB_GCC_VERSION(major,minor) (__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))) -#endif - -#define ECB_CLANG_VERSION(major,minor) (__clang_major__ > (major) || (__clang_major__ == (major) && __clang_minor__ >= (minor))) - -#if __clang__ && defined __has_builtin - #define ECB_CLANG_BUILTIN(x) __has_builtin (x) -#else - #define ECB_CLANG_BUILTIN(x) 0 -#endif - -#if __clang__ && defined __has_extension - #define ECB_CLANG_EXTENSION(x) __has_extension (x) -#else - #define ECB_CLANG_EXTENSION(x) 0 -#endif - -#define ECB_CPP (__cplusplus+0) -#define ECB_CPP11 (__cplusplus >= 201103L) -#define ECB_CPP14 (__cplusplus >= 201402L) -#define ECB_CPP17 (__cplusplus >= 201703L) - -#if ECB_CPP - #define ECB_C 0 - #define ECB_STDC_VERSION 0 -#else - #define ECB_C 1 - #define ECB_STDC_VERSION __STDC_VERSION__ -#endif - -#define ECB_C99 (ECB_STDC_VERSION >= 199901L) -#define ECB_C11 (ECB_STDC_VERSION >= 201112L) -#define ECB_C17 (ECB_STDC_VERSION >= 201710L) - -#if ECB_CPP - #define ECB_EXTERN_C extern "C" - #define ECB_EXTERN_C_BEG ECB_EXTERN_C { - #define ECB_EXTERN_C_END } -#else - #define ECB_EXTERN_C extern - #define ECB_EXTERN_C_BEG - #define ECB_EXTERN_C_END -#endif - -/*****************************************************************************/ - -/* ECB_NO_THREADS - ecb is not used by multiple threads, ever */ -/* ECB_NO_SMP - ecb might be used in multiple threads, but only on a single cpu */ - -#if ECB_NO_THREADS - #define ECB_NO_SMP 1 -#endif - -#if ECB_NO_SMP - #define ECB_MEMORY_FENCE do { } while (0) -#endif - -/* http://www-01.ibm.com/support/knowledgecenter/SSGH3R_13.1.0/com.ibm.xlcpp131.aix.doc/compiler_ref/compiler_builtins.html */ -#if __xlC__ && ECB_CPP - #include -#endif - -#if 1400 <= _MSC_VER - #include /* fence functions _ReadBarrier, also bit search functions _BitScanReverse */ -#endif - -#ifndef ECB_MEMORY_FENCE - #if ECB_GCC_VERSION(2,5) || defined __INTEL_COMPILER || (__llvm__ && __GNUC__) || __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110 - #define ECB_MEMORY_FENCE_RELAXED __asm__ __volatile__ ("" : : : "memory") - #if __i386 || __i386__ - #define ECB_MEMORY_FENCE __asm__ __volatile__ ("lock; orb $0, -1(%%esp)" : : : "memory") - #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("" : : : "memory") - #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("" : : : "memory") - #elif ECB_GCC_AMD64 - #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mfence" : : : "memory") - #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("" : : : "memory") - #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("" : : : "memory") - #elif __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__ - #define ECB_MEMORY_FENCE __asm__ __volatile__ ("sync" : : : "memory") - #elif defined __ARM_ARCH_2__ \ - || defined __ARM_ARCH_3__ || defined __ARM_ARCH_3M__ \ - || defined __ARM_ARCH_4__ || defined __ARM_ARCH_4T__ \ - || defined __ARM_ARCH_5__ || defined __ARM_ARCH_5E__ \ - || defined __ARM_ARCH_5T__ || defined __ARM_ARCH_5TE__ \ - || defined __ARM_ARCH_5TEJ__ - /* should not need any, unless running old code on newer cpu - arm doesn't support that */ - #elif defined __ARM_ARCH_6__ || defined __ARM_ARCH_6J__ \ - || defined __ARM_ARCH_6K__ || defined __ARM_ARCH_6ZK__ \ - || defined __ARM_ARCH_6T2__ - #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mcr p15,0,%0,c7,c10,5" : : "r" (0) : "memory") - #elif defined __ARM_ARCH_7__ || defined __ARM_ARCH_7A__ \ - || defined __ARM_ARCH_7R__ || defined __ARM_ARCH_7M__ - #define ECB_MEMORY_FENCE __asm__ __volatile__ ("dmb" : : : "memory") - #elif __aarch64__ - #define ECB_MEMORY_FENCE __asm__ __volatile__ ("dmb ish" : : : "memory") - #elif (__sparc || __sparc__) && !(__sparc_v8__ || defined __sparcv8) - #define ECB_MEMORY_FENCE __asm__ __volatile__ ("membar #LoadStore | #LoadLoad | #StoreStore | #StoreLoad" : : : "memory") - #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("membar #LoadStore | #LoadLoad" : : : "memory") - #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("membar #LoadStore | #StoreStore") - #elif defined __s390__ || defined __s390x__ - #define ECB_MEMORY_FENCE __asm__ __volatile__ ("bcr 15,0" : : : "memory") - #elif defined __mips__ - /* GNU/Linux emulates sync on mips1 architectures, so we force its use */ - /* anybody else who still uses mips1 is supposed to send in their version, with detection code. */ - #define ECB_MEMORY_FENCE __asm__ __volatile__ (".set mips2; sync; .set mips0" : : : "memory") - #elif defined __alpha__ - #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mb" : : : "memory") - #elif defined __hppa__ - #define ECB_MEMORY_FENCE __asm__ __volatile__ ("" : : : "memory") - #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("") - #elif defined __ia64__ - #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mf" : : : "memory") - #elif defined __m68k__ - #define ECB_MEMORY_FENCE __asm__ __volatile__ ("" : : : "memory") - #elif defined __m88k__ - #define ECB_MEMORY_FENCE __asm__ __volatile__ ("tb1 0,%%r0,128" : : : "memory") - #elif defined __sh__ - #define ECB_MEMORY_FENCE __asm__ __volatile__ ("" : : : "memory") - #endif - #endif -#endif - -#ifndef ECB_MEMORY_FENCE - #if ECB_GCC_VERSION(4,7) - /* see comment below (stdatomic.h) about the C11 memory model. */ - #define ECB_MEMORY_FENCE __atomic_thread_fence (__ATOMIC_SEQ_CST) - #define ECB_MEMORY_FENCE_ACQUIRE __atomic_thread_fence (__ATOMIC_ACQUIRE) - #define ECB_MEMORY_FENCE_RELEASE __atomic_thread_fence (__ATOMIC_RELEASE) - #define ECB_MEMORY_FENCE_RELAXED __atomic_thread_fence (__ATOMIC_RELAXED) - - #elif ECB_CLANG_EXTENSION(c_atomic) - /* see comment below (stdatomic.h) about the C11 memory model. */ - #define ECB_MEMORY_FENCE __c11_atomic_thread_fence (__ATOMIC_SEQ_CST) - #define ECB_MEMORY_FENCE_ACQUIRE __c11_atomic_thread_fence (__ATOMIC_ACQUIRE) - #define ECB_MEMORY_FENCE_RELEASE __c11_atomic_thread_fence (__ATOMIC_RELEASE) - #define ECB_MEMORY_FENCE_RELAXED __c11_atomic_thread_fence (__ATOMIC_RELAXED) - - #elif ECB_GCC_VERSION(4,4) || defined __INTEL_COMPILER || defined __clang__ - #define ECB_MEMORY_FENCE __sync_synchronize () - #elif _MSC_VER >= 1500 /* VC++ 2008 */ - /* apparently, microsoft broke all the memory barrier stuff in Visual Studio 2008... */ - #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) - #define ECB_MEMORY_FENCE _ReadWriteBarrier (); MemoryBarrier() - #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier (); MemoryBarrier() /* according to msdn, _ReadBarrier is not a load fence */ - #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier (); MemoryBarrier() - #elif _MSC_VER >= 1400 /* VC++ 2005 */ - #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) - #define ECB_MEMORY_FENCE _ReadWriteBarrier () - #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier () /* according to msdn, _ReadBarrier is not a load fence */ - #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier () - #elif defined _WIN32 - #include - #define ECB_MEMORY_FENCE MemoryBarrier () /* actually just xchg on x86... scary */ - #elif __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110 - #include - #define ECB_MEMORY_FENCE __machine_rw_barrier () - #define ECB_MEMORY_FENCE_ACQUIRE __machine_acq_barrier () - #define ECB_MEMORY_FENCE_RELEASE __machine_rel_barrier () - #define ECB_MEMORY_FENCE_RELAXED __compiler_barrier () - #elif __xlC__ - #define ECB_MEMORY_FENCE __sync () - #endif -#endif - -#ifndef ECB_MEMORY_FENCE - #if ECB_C11 && !defined __STDC_NO_ATOMICS__ - /* we assume that these memory fences work on all variables/all memory accesses, */ - /* not just C11 atomics and atomic accesses */ - #include - #define ECB_MEMORY_FENCE atomic_thread_fence (memory_order_seq_cst) - #define ECB_MEMORY_FENCE_ACQUIRE atomic_thread_fence (memory_order_acquire) - #define ECB_MEMORY_FENCE_RELEASE atomic_thread_fence (memory_order_release) - #endif -#endif - -#ifndef ECB_MEMORY_FENCE - #if !ECB_AVOID_PTHREADS - /* - * if you get undefined symbol references to pthread_mutex_lock, - * or failure to find pthread.h, then you should implement - * the ECB_MEMORY_FENCE operations for your cpu/compiler - * OR provide pthread.h and link against the posix thread library - * of your system. - */ - #include - #define ECB_NEEDS_PTHREADS 1 - #define ECB_MEMORY_FENCE_NEEDS_PTHREADS 1 - - static pthread_mutex_t ecb_mf_lock = PTHREAD_MUTEX_INITIALIZER; - #define ECB_MEMORY_FENCE do { pthread_mutex_lock (&ecb_mf_lock); pthread_mutex_unlock (&ecb_mf_lock); } while (0) - #endif -#endif - -#if !defined ECB_MEMORY_FENCE_ACQUIRE && defined ECB_MEMORY_FENCE - #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE -#endif - -#if !defined ECB_MEMORY_FENCE_RELEASE && defined ECB_MEMORY_FENCE - #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE -#endif - -#if !defined ECB_MEMORY_FENCE_RELAXED && defined ECB_MEMORY_FENCE - #define ECB_MEMORY_FENCE_RELAXED ECB_MEMORY_FENCE /* very heavy-handed */ -#endif - -/*****************************************************************************/ - -#if ECB_CPP - #define ecb_inline static inline -#elif ECB_GCC_VERSION(2,5) - #define ecb_inline static __inline__ -#elif ECB_C99 - #define ecb_inline static inline -#else - #define ecb_inline static -#endif - -#if ECB_GCC_VERSION(3,3) - #define ecb_restrict __restrict__ -#elif ECB_C99 - #define ecb_restrict restrict -#else - #define ecb_restrict -#endif - -typedef int ecb_bool; - -#define ECB_CONCAT_(a, b) a ## b -#define ECB_CONCAT(a, b) ECB_CONCAT_(a, b) -#define ECB_STRINGIFY_(a) # a -#define ECB_STRINGIFY(a) ECB_STRINGIFY_(a) -#define ECB_STRINGIFY_EXPR(expr) ((expr), ECB_STRINGIFY_ (expr)) - -#define ecb_function_ ecb_inline - -#if ECB_GCC_VERSION(3,1) || ECB_CLANG_VERSION(2,8) - #define ecb_attribute(attrlist) __attribute__ (attrlist) -#else - #define ecb_attribute(attrlist) -#endif - -#if ECB_GCC_VERSION(3,1) || ECB_CLANG_BUILTIN(__builtin_constant_p) - #define ecb_is_constant(expr) __builtin_constant_p (expr) -#else - /* possible C11 impl for integral types - typedef struct ecb_is_constant_struct ecb_is_constant_struct; - #define ecb_is_constant(expr) _Generic ((1 ? (struct ecb_is_constant_struct *)0 : (void *)((expr) - (expr)), ecb_is_constant_struct *: 0, default: 1)) */ - - #define ecb_is_constant(expr) 0 -#endif - -#if ECB_GCC_VERSION(3,1) || ECB_CLANG_BUILTIN(__builtin_expect) - #define ecb_expect(expr,value) __builtin_expect ((expr),(value)) -#else - #define ecb_expect(expr,value) (expr) -#endif - -#if ECB_GCC_VERSION(3,1) || ECB_CLANG_BUILTIN(__builtin_prefetch) - #define ecb_prefetch(addr,rw,locality) __builtin_prefetch (addr, rw, locality) -#else - #define ecb_prefetch(addr,rw,locality) -#endif - -/* no emulation for ecb_decltype */ -#if ECB_CPP11 - // older implementations might have problems with decltype(x)::type, work around it - template struct ecb_decltype_t { typedef T type; }; - #define ecb_decltype(x) ecb_decltype_t::type -#elif ECB_GCC_VERSION(3,0) || ECB_CLANG_VERSION(2,8) - #define ecb_decltype(x) __typeof__ (x) -#endif - -#if _MSC_VER >= 1300 - #define ecb_deprecated __declspec (deprecated) -#else - #define ecb_deprecated ecb_attribute ((__deprecated__)) -#endif - -#if _MSC_VER >= 1500 - #define ecb_deprecated_message(msg) __declspec (deprecated (msg)) -#elif ECB_GCC_VERSION(4,5) - #define ecb_deprecated_message(msg) ecb_attribute ((__deprecated__ (msg)) -#else - #define ecb_deprecated_message(msg) ecb_deprecated -#endif - -#if _MSC_VER >= 1400 - #define ecb_noinline __declspec (noinline) -#else - #define ecb_noinline ecb_attribute ((__noinline__)) -#endif - -#define ecb_unused ecb_attribute ((__unused__)) -#define ecb_const ecb_attribute ((__const__)) -#define ecb_pure ecb_attribute ((__pure__)) - -#if ECB_C11 || __IBMC_NORETURN - /* http://www-01.ibm.com/support/knowledgecenter/SSGH3R_13.1.0/com.ibm.xlcpp131.aix.doc/language_ref/noreturn.html */ - #define ecb_noreturn _Noreturn -#elif ECB_CPP11 - #define ecb_noreturn [[noreturn]] -#elif _MSC_VER >= 1200 - /* http://msdn.microsoft.com/en-us/library/k6ktzx3s.aspx */ - #define ecb_noreturn __declspec (noreturn) -#else - #define ecb_noreturn ecb_attribute ((__noreturn__)) -#endif - -#if ECB_GCC_VERSION(4,3) - #define ecb_artificial ecb_attribute ((__artificial__)) - #define ecb_hot ecb_attribute ((__hot__)) - #define ecb_cold ecb_attribute ((__cold__)) -#else - #define ecb_artificial - #define ecb_hot - #define ecb_cold -#endif - -/* put around conditional expressions if you are very sure that the */ -/* expression is mostly true or mostly false. note that these return */ -/* booleans, not the expression. */ -#define ecb_expect_false(expr) ecb_expect (!!(expr), 0) -#define ecb_expect_true(expr) ecb_expect (!!(expr), 1) -/* for compatibility to the rest of the world */ -#define ecb_likely(expr) ecb_expect_true (expr) -#define ecb_unlikely(expr) ecb_expect_false (expr) - -/* count trailing zero bits and count # of one bits */ -#if ECB_GCC_VERSION(3,4) \ - || (ECB_CLANG_BUILTIN(__builtin_clz) && ECB_CLANG_BUILTIN(__builtin_clzll) \ - && ECB_CLANG_BUILTIN(__builtin_ctz) && ECB_CLANG_BUILTIN(__builtin_ctzll) \ - && ECB_CLANG_BUILTIN(__builtin_popcount)) - /* we assume int == 32 bit, long == 32 or 64 bit and long long == 64 bit */ - #define ecb_ld32(x) (__builtin_clz (x) ^ 31) - #define ecb_ld64(x) (__builtin_clzll (x) ^ 63) - #define ecb_ctz32(x) __builtin_ctz (x) - #define ecb_ctz64(x) __builtin_ctzll (x) - #define ecb_popcount32(x) __builtin_popcount (x) - /* no popcountll */ -#else - ecb_function_ ecb_const int ecb_ctz32 (uint32_t x); - ecb_function_ ecb_const int - ecb_ctz32 (uint32_t x) - { -#if 1400 <= _MSC_VER && (_M_IX86 || _M_X64 || _M_IA64 || _M_ARM) - unsigned long r; - _BitScanForward (&r, x); - return (int)r; -#else - int r = 0; - - x &= ~x + 1; /* this isolates the lowest bit */ - -#if ECB_branchless_on_i386 - r += !!(x & 0xaaaaaaaa) << 0; - r += !!(x & 0xcccccccc) << 1; - r += !!(x & 0xf0f0f0f0) << 2; - r += !!(x & 0xff00ff00) << 3; - r += !!(x & 0xffff0000) << 4; -#else - if (x & 0xaaaaaaaa) r += 1; - if (x & 0xcccccccc) r += 2; - if (x & 0xf0f0f0f0) r += 4; - if (x & 0xff00ff00) r += 8; - if (x & 0xffff0000) r += 16; -#endif - - return r; -#endif - } - - ecb_function_ ecb_const int ecb_ctz64 (uint64_t x); - ecb_function_ ecb_const int - ecb_ctz64 (uint64_t x) - { -#if 1400 <= _MSC_VER && (_M_X64 || _M_IA64 || _M_ARM) - unsigned long r; - _BitScanForward64 (&r, x); - return (int)r; -#else - int shift = x & 0xffffffff ? 0 : 32; - return ecb_ctz32 (x >> shift) + shift; -#endif - } - - ecb_function_ ecb_const int ecb_popcount32 (uint32_t x); - ecb_function_ ecb_const int - ecb_popcount32 (uint32_t x) - { - x -= (x >> 1) & 0x55555555; - x = ((x >> 2) & 0x33333333) + (x & 0x33333333); - x = ((x >> 4) + x) & 0x0f0f0f0f; - x *= 0x01010101; - - return x >> 24; - } - - ecb_function_ ecb_const int ecb_ld32 (uint32_t x); - ecb_function_ ecb_const int ecb_ld32 (uint32_t x) - { -#if 1400 <= _MSC_VER && (_M_IX86 || _M_X64 || _M_IA64 || _M_ARM) - unsigned long r; - _BitScanReverse (&r, x); - return (int)r; -#else - int r = 0; - - if (x >> 16) { x >>= 16; r += 16; } - if (x >> 8) { x >>= 8; r += 8; } - if (x >> 4) { x >>= 4; r += 4; } - if (x >> 2) { x >>= 2; r += 2; } - if (x >> 1) { r += 1; } - - return r; -#endif - } - - ecb_function_ ecb_const int ecb_ld64 (uint64_t x); - ecb_function_ ecb_const int ecb_ld64 (uint64_t x) - { -#if 1400 <= _MSC_VER && (_M_X64 || _M_IA64 || _M_ARM) - unsigned long r; - _BitScanReverse64 (&r, x); - return (int)r; -#else - int r = 0; - - if (x >> 32) { x >>= 32; r += 32; } - - return r + ecb_ld32 (x); -#endif - } -#endif - -ecb_function_ ecb_const ecb_bool ecb_is_pot32 (uint32_t x); -ecb_function_ ecb_const ecb_bool ecb_is_pot32 (uint32_t x) { return !(x & (x - 1)); } -ecb_function_ ecb_const ecb_bool ecb_is_pot64 (uint64_t x); -ecb_function_ ecb_const ecb_bool ecb_is_pot64 (uint64_t x) { return !(x & (x - 1)); } - -ecb_function_ ecb_const uint8_t ecb_bitrev8 (uint8_t x); -ecb_function_ ecb_const uint8_t ecb_bitrev8 (uint8_t x) -{ - return ( (x * 0x0802U & 0x22110U) - | (x * 0x8020U & 0x88440U)) * 0x10101U >> 16; -} - -ecb_function_ ecb_const uint16_t ecb_bitrev16 (uint16_t x); -ecb_function_ ecb_const uint16_t ecb_bitrev16 (uint16_t x) -{ - x = ((x >> 1) & 0x5555) | ((x & 0x5555) << 1); - x = ((x >> 2) & 0x3333) | ((x & 0x3333) << 2); - x = ((x >> 4) & 0x0f0f) | ((x & 0x0f0f) << 4); - x = ( x >> 8 ) | ( x << 8); - - return x; -} - -ecb_function_ ecb_const uint32_t ecb_bitrev32 (uint32_t x); -ecb_function_ ecb_const uint32_t ecb_bitrev32 (uint32_t x) -{ - x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1); - x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2); - x = ((x >> 4) & 0x0f0f0f0f) | ((x & 0x0f0f0f0f) << 4); - x = ((x >> 8) & 0x00ff00ff) | ((x & 0x00ff00ff) << 8); - x = ( x >> 16 ) | ( x << 16); - - return x; -} - -/* popcount64 is only available on 64 bit cpus as gcc builtin */ -/* so for this version we are lazy */ -ecb_function_ ecb_const int ecb_popcount64 (uint64_t x); -ecb_function_ ecb_const int -ecb_popcount64 (uint64_t x) -{ - return ecb_popcount32 (x) + ecb_popcount32 (x >> 32); -} - -ecb_inline ecb_const uint8_t ecb_rotl8 (uint8_t x, unsigned int count); -ecb_inline ecb_const uint8_t ecb_rotr8 (uint8_t x, unsigned int count); -ecb_inline ecb_const uint16_t ecb_rotl16 (uint16_t x, unsigned int count); -ecb_inline ecb_const uint16_t ecb_rotr16 (uint16_t x, unsigned int count); -ecb_inline ecb_const uint32_t ecb_rotl32 (uint32_t x, unsigned int count); -ecb_inline ecb_const uint32_t ecb_rotr32 (uint32_t x, unsigned int count); -ecb_inline ecb_const uint64_t ecb_rotl64 (uint64_t x, unsigned int count); -ecb_inline ecb_const uint64_t ecb_rotr64 (uint64_t x, unsigned int count); - -ecb_inline ecb_const uint8_t ecb_rotl8 (uint8_t x, unsigned int count) { return (x >> ( 8 - count)) | (x << count); } -ecb_inline ecb_const uint8_t ecb_rotr8 (uint8_t x, unsigned int count) { return (x << ( 8 - count)) | (x >> count); } -ecb_inline ecb_const uint16_t ecb_rotl16 (uint16_t x, unsigned int count) { return (x >> (16 - count)) | (x << count); } -ecb_inline ecb_const uint16_t ecb_rotr16 (uint16_t x, unsigned int count) { return (x << (16 - count)) | (x >> count); } -ecb_inline ecb_const uint32_t ecb_rotl32 (uint32_t x, unsigned int count) { return (x >> (32 - count)) | (x << count); } -ecb_inline ecb_const uint32_t ecb_rotr32 (uint32_t x, unsigned int count) { return (x << (32 - count)) | (x >> count); } -ecb_inline ecb_const uint64_t ecb_rotl64 (uint64_t x, unsigned int count) { return (x >> (64 - count)) | (x << count); } -ecb_inline ecb_const uint64_t ecb_rotr64 (uint64_t x, unsigned int count) { return (x << (64 - count)) | (x >> count); } - -#if ECB_CPP - -inline uint8_t ecb_ctz (uint8_t v) { return ecb_ctz32 (v); } -inline uint16_t ecb_ctz (uint16_t v) { return ecb_ctz32 (v); } -inline uint32_t ecb_ctz (uint32_t v) { return ecb_ctz32 (v); } -inline uint64_t ecb_ctz (uint64_t v) { return ecb_ctz64 (v); } - -inline bool ecb_is_pot (uint8_t v) { return ecb_is_pot32 (v); } -inline bool ecb_is_pot (uint16_t v) { return ecb_is_pot32 (v); } -inline bool ecb_is_pot (uint32_t v) { return ecb_is_pot32 (v); } -inline bool ecb_is_pot (uint64_t v) { return ecb_is_pot64 (v); } - -inline int ecb_ld (uint8_t v) { return ecb_ld32 (v); } -inline int ecb_ld (uint16_t v) { return ecb_ld32 (v); } -inline int ecb_ld (uint32_t v) { return ecb_ld32 (v); } -inline int ecb_ld (uint64_t v) { return ecb_ld64 (v); } - -inline int ecb_popcount (uint8_t v) { return ecb_popcount32 (v); } -inline int ecb_popcount (uint16_t v) { return ecb_popcount32 (v); } -inline int ecb_popcount (uint32_t v) { return ecb_popcount32 (v); } -inline int ecb_popcount (uint64_t v) { return ecb_popcount64 (v); } - -inline uint8_t ecb_bitrev (uint8_t v) { return ecb_bitrev8 (v); } -inline uint16_t ecb_bitrev (uint16_t v) { return ecb_bitrev16 (v); } -inline uint32_t ecb_bitrev (uint32_t v) { return ecb_bitrev32 (v); } - -inline uint8_t ecb_rotl (uint8_t v, unsigned int count) { return ecb_rotl8 (v, count); } -inline uint16_t ecb_rotl (uint16_t v, unsigned int count) { return ecb_rotl16 (v, count); } -inline uint32_t ecb_rotl (uint32_t v, unsigned int count) { return ecb_rotl32 (v, count); } -inline uint64_t ecb_rotl (uint64_t v, unsigned int count) { return ecb_rotl64 (v, count); } - -inline uint8_t ecb_rotr (uint8_t v, unsigned int count) { return ecb_rotr8 (v, count); } -inline uint16_t ecb_rotr (uint16_t v, unsigned int count) { return ecb_rotr16 (v, count); } -inline uint32_t ecb_rotr (uint32_t v, unsigned int count) { return ecb_rotr32 (v, count); } -inline uint64_t ecb_rotr (uint64_t v, unsigned int count) { return ecb_rotr64 (v, count); } - -#endif - -#if ECB_GCC_VERSION(4,3) || (ECB_CLANG_BUILTIN(__builtin_bswap32) && ECB_CLANG_BUILTIN(__builtin_bswap64)) - #if ECB_GCC_VERSION(4,8) || ECB_CLANG_BUILTIN(__builtin_bswap16) - #define ecb_bswap16(x) __builtin_bswap16 (x) - #else - #define ecb_bswap16(x) (__builtin_bswap32 (x) >> 16) - #endif - #define ecb_bswap32(x) __builtin_bswap32 (x) - #define ecb_bswap64(x) __builtin_bswap64 (x) -#elif _MSC_VER - #include - #define ecb_bswap16(x) ((uint16_t)_byteswap_ushort ((uint16_t)(x))) - #define ecb_bswap32(x) ((uint32_t)_byteswap_ulong ((uint32_t)(x))) - #define ecb_bswap64(x) ((uint64_t)_byteswap_uint64 ((uint64_t)(x))) -#else - ecb_function_ ecb_const uint16_t ecb_bswap16 (uint16_t x); - ecb_function_ ecb_const uint16_t - ecb_bswap16 (uint16_t x) - { - return ecb_rotl16 (x, 8); - } - - ecb_function_ ecb_const uint32_t ecb_bswap32 (uint32_t x); - ecb_function_ ecb_const uint32_t - ecb_bswap32 (uint32_t x) - { - return (((uint32_t)ecb_bswap16 (x)) << 16) | ecb_bswap16 (x >> 16); - } - - ecb_function_ ecb_const uint64_t ecb_bswap64 (uint64_t x); - ecb_function_ ecb_const uint64_t - ecb_bswap64 (uint64_t x) - { - return (((uint64_t)ecb_bswap32 (x)) << 32) | ecb_bswap32 (x >> 32); - } -#endif - -#if ECB_GCC_VERSION(4,5) || ECB_CLANG_BUILTIN(__builtin_unreachable) - #define ecb_unreachable() __builtin_unreachable () -#else - /* this seems to work fine, but gcc always emits a warning for it :/ */ - ecb_inline ecb_noreturn void ecb_unreachable (void); - ecb_inline ecb_noreturn void ecb_unreachable (void) { } -#endif - -/* try to tell the compiler that some condition is definitely true */ -#define ecb_assume(cond) if (!(cond)) ecb_unreachable (); else 0 - -ecb_inline ecb_const uint32_t ecb_byteorder_helper (void); -ecb_inline ecb_const uint32_t -ecb_byteorder_helper (void) -{ - /* the union code still generates code under pressure in gcc, */ - /* but less than using pointers, and always seems to */ - /* successfully return a constant. */ - /* the reason why we have this horrible preprocessor mess */ - /* is to avoid it in all cases, at least on common architectures */ - /* or when using a recent enough gcc version (>= 4.6) */ -#if (defined __BYTE_ORDER__ && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \ - || ((__i386 || __i386__ || _M_IX86 || ECB_GCC_AMD64 || ECB_MSVC_AMD64) && !__VOS__) - #define ECB_LITTLE_ENDIAN 1 - return 0x44332211; -#elif (defined __BYTE_ORDER__ && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) \ - || ((__AARCH64EB__ || __MIPSEB__ || __ARMEB__) && !__VOS__) - #define ECB_BIG_ENDIAN 1 - return 0x11223344; -#else - union - { - uint8_t c[4]; - uint32_t u; - } u = { 0x11, 0x22, 0x33, 0x44 }; - return u.u; -#endif -} - -ecb_inline ecb_const ecb_bool ecb_big_endian (void); -ecb_inline ecb_const ecb_bool ecb_big_endian (void) { return ecb_byteorder_helper () == 0x11223344; } -ecb_inline ecb_const ecb_bool ecb_little_endian (void); -ecb_inline ecb_const ecb_bool ecb_little_endian (void) { return ecb_byteorder_helper () == 0x44332211; } - -/*****************************************************************************/ -/* unaligned load/store */ - -ecb_inline uint_fast16_t ecb_be_u16_to_host (uint_fast16_t v) { return ecb_little_endian () ? ecb_bswap16 (v) : v; } -ecb_inline uint_fast32_t ecb_be_u32_to_host (uint_fast32_t v) { return ecb_little_endian () ? ecb_bswap32 (v) : v; } -ecb_inline uint_fast64_t ecb_be_u64_to_host (uint_fast64_t v) { return ecb_little_endian () ? ecb_bswap64 (v) : v; } - -ecb_inline uint_fast16_t ecb_le_u16_to_host (uint_fast16_t v) { return ecb_big_endian () ? ecb_bswap16 (v) : v; } -ecb_inline uint_fast32_t ecb_le_u32_to_host (uint_fast32_t v) { return ecb_big_endian () ? ecb_bswap32 (v) : v; } -ecb_inline uint_fast64_t ecb_le_u64_to_host (uint_fast64_t v) { return ecb_big_endian () ? ecb_bswap64 (v) : v; } - -ecb_inline uint_fast16_t ecb_peek_u16_u (const void *ptr) { uint16_t v; memcpy (&v, ptr, sizeof (v)); return v; } -ecb_inline uint_fast32_t ecb_peek_u32_u (const void *ptr) { uint32_t v; memcpy (&v, ptr, sizeof (v)); return v; } -ecb_inline uint_fast64_t ecb_peek_u64_u (const void *ptr) { uint64_t v; memcpy (&v, ptr, sizeof (v)); return v; } - -ecb_inline uint_fast16_t ecb_peek_be_u16_u (const void *ptr) { return ecb_be_u16_to_host (ecb_peek_u16_u (ptr)); } -ecb_inline uint_fast32_t ecb_peek_be_u32_u (const void *ptr) { return ecb_be_u32_to_host (ecb_peek_u32_u (ptr)); } -ecb_inline uint_fast64_t ecb_peek_be_u64_u (const void *ptr) { return ecb_be_u64_to_host (ecb_peek_u64_u (ptr)); } - -ecb_inline uint_fast16_t ecb_peek_le_u16_u (const void *ptr) { return ecb_le_u16_to_host (ecb_peek_u16_u (ptr)); } -ecb_inline uint_fast32_t ecb_peek_le_u32_u (const void *ptr) { return ecb_le_u32_to_host (ecb_peek_u32_u (ptr)); } -ecb_inline uint_fast64_t ecb_peek_le_u64_u (const void *ptr) { return ecb_le_u64_to_host (ecb_peek_u64_u (ptr)); } - -ecb_inline uint_fast16_t ecb_host_to_be_u16 (uint_fast16_t v) { return ecb_little_endian () ? ecb_bswap16 (v) : v; } -ecb_inline uint_fast32_t ecb_host_to_be_u32 (uint_fast32_t v) { return ecb_little_endian () ? ecb_bswap32 (v) : v; } -ecb_inline uint_fast64_t ecb_host_to_be_u64 (uint_fast64_t v) { return ecb_little_endian () ? ecb_bswap64 (v) : v; } - -ecb_inline uint_fast16_t ecb_host_to_le_u16 (uint_fast16_t v) { return ecb_big_endian () ? ecb_bswap16 (v) : v; } -ecb_inline uint_fast32_t ecb_host_to_le_u32 (uint_fast32_t v) { return ecb_big_endian () ? ecb_bswap32 (v) : v; } -ecb_inline uint_fast64_t ecb_host_to_le_u64 (uint_fast64_t v) { return ecb_big_endian () ? ecb_bswap64 (v) : v; } - -ecb_inline void ecb_poke_u16_u (void *ptr, uint16_t v) { memcpy (ptr, &v, sizeof (v)); } -ecb_inline void ecb_poke_u32_u (void *ptr, uint32_t v) { memcpy (ptr, &v, sizeof (v)); } -ecb_inline void ecb_poke_u64_u (void *ptr, uint64_t v) { memcpy (ptr, &v, sizeof (v)); } - -ecb_inline void ecb_poke_be_u16_u (void *ptr, uint_fast16_t v) { ecb_poke_u16_u (ptr, ecb_host_to_be_u16 (v)); } -ecb_inline void ecb_poke_be_u32_u (void *ptr, uint_fast32_t v) { ecb_poke_u32_u (ptr, ecb_host_to_be_u32 (v)); } -ecb_inline void ecb_poke_be_u64_u (void *ptr, uint_fast64_t v) { ecb_poke_u64_u (ptr, ecb_host_to_be_u64 (v)); } - -ecb_inline void ecb_poke_le_u16_u (void *ptr, uint_fast16_t v) { ecb_poke_u16_u (ptr, ecb_host_to_le_u16 (v)); } -ecb_inline void ecb_poke_le_u32_u (void *ptr, uint_fast32_t v) { ecb_poke_u32_u (ptr, ecb_host_to_le_u32 (v)); } -ecb_inline void ecb_poke_le_u64_u (void *ptr, uint_fast64_t v) { ecb_poke_u64_u (ptr, ecb_host_to_le_u64 (v)); } - -#if ECB_CPP - -inline uint8_t ecb_bswap (uint8_t v) { return v; } -inline uint16_t ecb_bswap (uint16_t v) { return ecb_bswap16 (v); } -inline uint32_t ecb_bswap (uint32_t v) { return ecb_bswap32 (v); } -inline uint64_t ecb_bswap (uint64_t v) { return ecb_bswap64 (v); } - -template inline T ecb_be_to_host (T v) { return ecb_little_endian () ? ecb_bswap (v) : v; } -template inline T ecb_le_to_host (T v) { return ecb_big_endian () ? ecb_bswap (v) : v; } -template inline T ecb_peek (const void *ptr) { return *(const T *)ptr; } -template inline T ecb_peek_be (const void *ptr) { return ecb_be_to_host (ecb_peek (ptr)); } -template inline T ecb_peek_le (const void *ptr) { return ecb_le_to_host (ecb_peek (ptr)); } -template inline T ecb_peek_u (const void *ptr) { T v; memcpy (&v, ptr, sizeof (v)); return v; } -template inline T ecb_peek_be_u (const void *ptr) { return ecb_be_to_host (ecb_peek_u (ptr)); } -template inline T ecb_peek_le_u (const void *ptr) { return ecb_le_to_host (ecb_peek_u (ptr)); } - -template inline T ecb_host_to_be (T v) { return ecb_little_endian () ? ecb_bswap (v) : v; } -template inline T ecb_host_to_le (T v) { return ecb_big_endian () ? ecb_bswap (v) : v; } -template inline void ecb_poke (void *ptr, T v) { *(T *)ptr = v; } -template inline void ecb_poke_be (void *ptr, T v) { return ecb_poke (ptr, ecb_host_to_be (v)); } -template inline void ecb_poke_le (void *ptr, T v) { return ecb_poke (ptr, ecb_host_to_le (v)); } -template inline void ecb_poke_u (void *ptr, T v) { memcpy (ptr, &v, sizeof (v)); } -template inline void ecb_poke_be_u (void *ptr, T v) { return ecb_poke_u (ptr, ecb_host_to_be (v)); } -template inline void ecb_poke_le_u (void *ptr, T v) { return ecb_poke_u (ptr, ecb_host_to_le (v)); } - -#endif - -/*****************************************************************************/ - -#if ECB_GCC_VERSION(3,0) || ECB_C99 - #define ecb_mod(m,n) ((m) % (n) + ((m) % (n) < 0 ? (n) : 0)) -#else - #define ecb_mod(m,n) ((m) < 0 ? ((n) - 1 - ((-1 - (m)) % (n))) : ((m) % (n))) -#endif - -#if ECB_CPP - template - static inline T ecb_div_rd (T val, T div) - { - return val < 0 ? - ((-val + div - 1) / div) : (val ) / div; - } - template - static inline T ecb_div_ru (T val, T div) - { - return val < 0 ? - ((-val ) / div) : (val + div - 1) / div; - } -#else - #define ecb_div_rd(val,div) ((val) < 0 ? - ((-(val) + (div) - 1) / (div)) : ((val) ) / (div)) - #define ecb_div_ru(val,div) ((val) < 0 ? - ((-(val) ) / (div)) : ((val) + (div) - 1) / (div)) -#endif - -#if ecb_cplusplus_does_not_suck - /* does not work for local types (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm) */ - template - static inline int ecb_array_length (const T (&arr)[N]) - { - return N; - } -#else - #define ecb_array_length(name) (sizeof (name) / sizeof (name [0])) -#endif - -/*****************************************************************************/ - -ecb_function_ ecb_const uint32_t ecb_binary16_to_binary32 (uint32_t x); -ecb_function_ ecb_const uint32_t -ecb_binary16_to_binary32 (uint32_t x) -{ - unsigned int s = (x & 0x8000) << (31 - 15); - int e = (x >> 10) & 0x001f; - unsigned int m = x & 0x03ff; - - if (ecb_expect_false (e == 31)) - /* infinity or NaN */ - e = 255 - (127 - 15); - else if (ecb_expect_false (!e)) - { - if (ecb_expect_true (!m)) - /* zero, handled by code below by forcing e to 0 */ - e = 0 - (127 - 15); - else - { - /* subnormal, renormalise */ - unsigned int s = 10 - ecb_ld32 (m); - - m = (m << s) & 0x3ff; /* mask implicit bit */ - e -= s - 1; - } - } - - /* e and m now are normalised, or zero, (or inf or nan) */ - e += 127 - 15; - - return s | (e << 23) | (m << (23 - 10)); -} - -ecb_function_ ecb_const uint16_t ecb_binary32_to_binary16 (uint32_t x); -ecb_function_ ecb_const uint16_t -ecb_binary32_to_binary16 (uint32_t x) -{ - unsigned int s = (x >> 16) & 0x00008000; /* sign bit, the easy part */ - unsigned int e = ((x >> 23) & 0x000000ff) - (127 - 15); /* the desired exponent */ - unsigned int m = x & 0x007fffff; - - x &= 0x7fffffff; - - /* if it's within range of binary16 normals, use fast path */ - if (ecb_expect_true (0x38800000 <= x && x <= 0x477fefff)) - { - /* mantissa round-to-even */ - m += 0x00000fff + ((m >> (23 - 10)) & 1); - - /* handle overflow */ - if (ecb_expect_false (m >= 0x00800000)) - { - m >>= 1; - e += 1; - } - - return s | (e << 10) | (m >> (23 - 10)); - } - - /* handle large numbers and infinity */ - if (ecb_expect_true (0x477fefff < x && x <= 0x7f800000)) - return s | 0x7c00; - - /* handle zero, subnormals and small numbers */ - if (ecb_expect_true (x < 0x38800000)) - { - /* zero */ - if (ecb_expect_true (!x)) - return s; - - /* handle subnormals */ - - /* too small, will be zero */ - if (e < (14 - 24)) /* might not be sharp, but is good enough */ - return s; - - m |= 0x00800000; /* make implicit bit explicit */ - - /* very tricky - we need to round to the nearest e (+10) bit value */ - { - unsigned int bits = 14 - e; - unsigned int half = (1 << (bits - 1)) - 1; - unsigned int even = (m >> bits) & 1; - - /* if this overflows, we will end up with a normalised number */ - m = (m + half + even) >> bits; - } - - return s | m; - } - - /* handle NaNs, preserve leftmost nan bits, but make sure we don't turn them into infinities */ - m >>= 13; - - return s | 0x7c00 | m | !m; -} - -/*******************************************************************************/ -/* floating point stuff, can be disabled by defining ECB_NO_LIBM */ - -/* basically, everything uses "ieee pure-endian" floating point numbers */ -/* the only noteworthy exception is ancient armle, which uses order 43218765 */ -#if 0 \ - || __i386 || __i386__ \ - || ECB_GCC_AMD64 \ - || __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__ \ - || defined __s390__ || defined __s390x__ \ - || defined __mips__ \ - || defined __alpha__ \ - || defined __hppa__ \ - || defined __ia64__ \ - || defined __m68k__ \ - || defined __m88k__ \ - || defined __sh__ \ - || defined _M_IX86 || defined ECB_MSVC_AMD64 || defined _M_IA64 \ - || (defined __arm__ && (defined __ARM_EABI__ || defined __EABI__ || defined __VFP_FP__ || defined _WIN32_WCE || defined __ANDROID__)) \ - || defined __aarch64__ - #define ECB_STDFP 1 -#else - #define ECB_STDFP 0 -#endif - -#ifndef ECB_NO_LIBM - - #include /* for frexp*, ldexp*, INFINITY, NAN */ - - /* only the oldest of old doesn't have this one. solaris. */ - #ifdef INFINITY - #define ECB_INFINITY INFINITY - #else - #define ECB_INFINITY HUGE_VAL - #endif - - #ifdef NAN - #define ECB_NAN NAN - #else - #define ECB_NAN ECB_INFINITY - #endif - - #if ECB_C99 || _XOPEN_VERSION >= 600 || _POSIX_VERSION >= 200112L - #define ecb_ldexpf(x,e) ldexpf ((x), (e)) - #define ecb_frexpf(x,e) frexpf ((x), (e)) - #else - #define ecb_ldexpf(x,e) (float) ldexp ((double) (x), (e)) - #define ecb_frexpf(x,e) (float) frexp ((double) (x), (e)) - #endif - - /* convert a float to ieee single/binary32 */ - ecb_function_ ecb_const uint32_t ecb_float_to_binary32 (float x); - ecb_function_ ecb_const uint32_t - ecb_float_to_binary32 (float x) - { - uint32_t r; - - #if ECB_STDFP - memcpy (&r, &x, 4); - #else - /* slow emulation, works for anything but -0 */ - uint32_t m; - int e; - - if (x == 0e0f ) return 0x00000000U; - if (x > +3.40282346638528860e+38f) return 0x7f800000U; - if (x < -3.40282346638528860e+38f) return 0xff800000U; - if (x != x ) return 0x7fbfffffU; - - m = ecb_frexpf (x, &e) * 0x1000000U; - - r = m & 0x80000000U; - - if (r) - m = -m; - - if (e <= -126) - { - m &= 0xffffffU; - m >>= (-125 - e); - e = -126; - } - - r |= (e + 126) << 23; - r |= m & 0x7fffffU; - #endif - - return r; - } - - /* converts an ieee single/binary32 to a float */ - ecb_function_ ecb_const float ecb_binary32_to_float (uint32_t x); - ecb_function_ ecb_const float - ecb_binary32_to_float (uint32_t x) - { - float r; - - #if ECB_STDFP - memcpy (&r, &x, 4); - #else - /* emulation, only works for normals and subnormals and +0 */ - int neg = x >> 31; - int e = (x >> 23) & 0xffU; - - x &= 0x7fffffU; - - if (e) - x |= 0x800000U; - else - e = 1; - - /* we distrust ldexpf a bit and do the 2**-24 scaling by an extra multiply */ - r = ecb_ldexpf (x * (0.5f / 0x800000U), e - 126); - - r = neg ? -r : r; - #endif - - return r; - } - - /* convert a double to ieee double/binary64 */ - ecb_function_ ecb_const uint64_t ecb_double_to_binary64 (double x); - ecb_function_ ecb_const uint64_t - ecb_double_to_binary64 (double x) - { - uint64_t r; - - #if ECB_STDFP - memcpy (&r, &x, 8); - #else - /* slow emulation, works for anything but -0 */ - uint64_t m; - int e; - - if (x == 0e0 ) return 0x0000000000000000U; - if (x > +1.79769313486231470e+308) return 0x7ff0000000000000U; - if (x < -1.79769313486231470e+308) return 0xfff0000000000000U; - if (x != x ) return 0X7ff7ffffffffffffU; - - m = frexp (x, &e) * 0x20000000000000U; - - r = m & 0x8000000000000000;; - - if (r) - m = -m; - - if (e <= -1022) - { - m &= 0x1fffffffffffffU; - m >>= (-1021 - e); - e = -1022; - } - - r |= ((uint64_t)(e + 1022)) << 52; - r |= m & 0xfffffffffffffU; - #endif - - return r; - } - - /* converts an ieee double/binary64 to a double */ - ecb_function_ ecb_const double ecb_binary64_to_double (uint64_t x); - ecb_function_ ecb_const double - ecb_binary64_to_double (uint64_t x) - { - double r; - - #if ECB_STDFP - memcpy (&r, &x, 8); - #else - /* emulation, only works for normals and subnormals and +0 */ - int neg = x >> 63; - int e = (x >> 52) & 0x7ffU; - - x &= 0xfffffffffffffU; - - if (e) - x |= 0x10000000000000U; - else - e = 1; - - /* we distrust ldexp a bit and do the 2**-53 scaling by an extra multiply */ - r = ldexp (x * (0.5 / 0x10000000000000U), e - 1022); - - r = neg ? -r : r; - #endif - - return r; - } - - /* convert a float to ieee half/binary16 */ - ecb_function_ ecb_const uint16_t ecb_float_to_binary16 (float x); - ecb_function_ ecb_const uint16_t - ecb_float_to_binary16 (float x) - { - return ecb_binary32_to_binary16 (ecb_float_to_binary32 (x)); - } - - /* convert an ieee half/binary16 to float */ - ecb_function_ ecb_const float ecb_binary16_to_float (uint16_t x); - ecb_function_ ecb_const float - ecb_binary16_to_float (uint16_t x) - { - return ecb_binary32_to_float (ecb_binary16_to_binary32 (x)); - } - -#endif - -#endif - -/* ECB.H END */ - -#if ECB_MEMORY_FENCE_NEEDS_PTHREADS -/* if your architecture doesn't need memory fences, e.g. because it is - * single-cpu/core, or if you use libev in a project that doesn't use libev - * from multiple threads, then you can define ECB_NO_THREADS when compiling - * libev, in which cases the memory fences become nops. - * alternatively, you can remove this #error and link against libpthread, - * which will then provide the memory fences. - */ -# error "memory fences not defined for your architecture, please report" -#endif - -#ifndef ECB_MEMORY_FENCE -# define ECB_MEMORY_FENCE do { } while (0) -# define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE -# define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE -#endif - -#define inline_size ecb_inline - -#if EV_FEATURE_CODE -# define inline_speed ecb_inline -#else -# define inline_speed ecb_noinline static -#endif - -/*****************************************************************************/ -/* raw syscall wrappers */ - -#if EV_NEED_SYSCALL - -#include - -/* - * define some syscall wrappers for common architectures - * this is mostly for nice looks during debugging, not performance. - * our syscalls return < 0, not == -1, on error. which is good - * enough for linux aio. - * TODO: arm is also common nowadays, maybe even mips and x86 - * TODO: after implementing this, it suddenly looks like overkill, but its hard to remove... - */ -#if __GNUC__ && __linux && ECB_AMD64 && !EV_FEATURE_CODE - /* the costly errno access probably kills this for size optimisation */ - - #define ev_syscall(nr,narg,arg1,arg2,arg3,arg4,arg5,arg6) \ - ({ \ - long res; \ - register unsigned long r6 __asm__ ("r9" ); \ - register unsigned long r5 __asm__ ("r8" ); \ - register unsigned long r4 __asm__ ("r10"); \ - register unsigned long r3 __asm__ ("rdx"); \ - register unsigned long r2 __asm__ ("rsi"); \ - register unsigned long r1 __asm__ ("rdi"); \ - if (narg >= 6) r6 = (unsigned long)(arg6); \ - if (narg >= 5) r5 = (unsigned long)(arg5); \ - if (narg >= 4) r4 = (unsigned long)(arg4); \ - if (narg >= 3) r3 = (unsigned long)(arg3); \ - if (narg >= 2) r2 = (unsigned long)(arg2); \ - if (narg >= 1) r1 = (unsigned long)(arg1); \ - __asm__ __volatile__ ( \ - "syscall\n\t" \ - : "=a" (res) \ - : "0" (nr), "r" (r1), "r" (r2), "r" (r3), "r" (r4), "r" (r5) \ - : "cc", "r11", "cx", "memory"); \ - errno = -res; \ - res; \ - }) - -#endif - -#ifdef ev_syscall - #define ev_syscall0(nr) ev_syscall (nr, 0, 0, 0, 0, 0, 0, 0) - #define ev_syscall1(nr,arg1) ev_syscall (nr, 1, arg1, 0, 0, 0, 0, 0) - #define ev_syscall2(nr,arg1,arg2) ev_syscall (nr, 2, arg1, arg2, 0, 0, 0, 0) - #define ev_syscall3(nr,arg1,arg2,arg3) ev_syscall (nr, 3, arg1, arg2, arg3, 0, 0, 0) - #define ev_syscall4(nr,arg1,arg2,arg3,arg4) ev_syscall (nr, 3, arg1, arg2, arg3, arg4, 0, 0) - #define ev_syscall5(nr,arg1,arg2,arg3,arg4,arg5) ev_syscall (nr, 5, arg1, arg2, arg3, arg4, arg5, 0) - #define ev_syscall6(nr,arg1,arg2,arg3,arg4,arg5,arg6) ev_syscall (nr, 6, arg1, arg2, arg3, arg4, arg5,arg6) -#else - #define ev_syscall0(nr) syscall (nr) - #define ev_syscall1(nr,arg1) syscall (nr, arg1) - #define ev_syscall2(nr,arg1,arg2) syscall (nr, arg1, arg2) - #define ev_syscall3(nr,arg1,arg2,arg3) syscall (nr, arg1, arg2, arg3) - #define ev_syscall4(nr,arg1,arg2,arg3,arg4) syscall (nr, arg1, arg2, arg3, arg4) - #define ev_syscall5(nr,arg1,arg2,arg3,arg4,arg5) syscall (nr, arg1, arg2, arg3, arg4, arg5) - #define ev_syscall6(nr,arg1,arg2,arg3,arg4,arg5,arg6) syscall (nr, arg1, arg2, arg3, arg4, arg5,arg6) -#endif - -#endif - -/*****************************************************************************/ - -#define NUMPRI (EV_MAXPRI - EV_MINPRI + 1) - -#if EV_MINPRI == EV_MAXPRI -# define ABSPRI(w) (((W)w), 0) -#else -# define ABSPRI(w) (((W)w)->priority - EV_MINPRI) -#endif - -#define EMPTY /* required for microsofts broken pseudo-c compiler */ - -typedef ev_watcher *W; -typedef ev_watcher_list *WL; -typedef ev_watcher_time *WT; - -#define ev_active(w) ((W)(w))->active -#define ev_at(w) ((WT)(w))->at - -#if EV_USE_REALTIME -/* sig_atomic_t is used to avoid per-thread variables or locking but still */ -/* giving it a reasonably high chance of working on typical architectures */ -static EV_ATOMIC_T have_realtime; /* did clock_gettime (CLOCK_REALTIME) work? */ -#endif - -#if EV_USE_MONOTONIC -static EV_ATOMIC_T have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work? */ -#endif - -#ifndef EV_FD_TO_WIN32_HANDLE -# define EV_FD_TO_WIN32_HANDLE(fd) _get_osfhandle (fd) -#endif -#ifndef EV_WIN32_HANDLE_TO_FD -# define EV_WIN32_HANDLE_TO_FD(handle) _open_osfhandle (handle, 0) -#endif -#ifndef EV_WIN32_CLOSE_FD -# define EV_WIN32_CLOSE_FD(fd) close (fd) -#endif - -#ifdef _WIN32 -# include "ev_win32.c" -#endif - -/*****************************************************************************/ - -#if EV_USE_LINUXAIO -# include /* probably only needed for aio_context_t */ -#endif - -/* define a suitable floor function (only used by periodics atm) */ - -#if EV_USE_FLOOR -# include -# define ev_floor(v) floor (v) -#else - -#include - -/* a floor() replacement function, should be independent of ev_tstamp type */ -ecb_noinline -static ev_tstamp -ev_floor (ev_tstamp v) -{ - /* the choice of shift factor is not terribly important */ -#if FLT_RADIX != 2 /* assume FLT_RADIX == 10 */ - const ev_tstamp shift = sizeof (unsigned long) >= 8 ? 10000000000000000000. : 1000000000.; -#else - const ev_tstamp shift = sizeof (unsigned long) >= 8 ? 18446744073709551616. : 4294967296.; -#endif - - /* special treatment for negative arguments */ - if (ecb_expect_false (v < 0.)) - { - ev_tstamp f = -ev_floor (-v); - - return f - (f == v ? 0 : 1); - } - - /* argument too large for an unsigned long? then reduce it */ - if (ecb_expect_false (v >= shift)) - { - ev_tstamp f; - - if (v == v - 1.) - return v; /* very large numbers are assumed to be integer */ - - f = shift * ev_floor (v * (1. / shift)); - return f + ev_floor (v - f); - } - - /* fits into an unsigned long */ - return (unsigned long)v; -} - -#endif - -/*****************************************************************************/ - -#ifdef __linux -# include -#endif - -ecb_noinline ecb_cold -static unsigned int -ev_linux_version (void) -{ -#ifdef __linux - unsigned int v = 0; - struct utsname buf; - int i; - char *p = buf.release; - - if (uname (&buf)) - return 0; - - for (i = 3+1; --i; ) - { - unsigned int c = 0; - - for (;;) - { - if (*p >= '0' && *p <= '9') - c = c * 10 + *p++ - '0'; - else - { - p += *p == '.'; - break; - } - } - - v = (v << 8) | c; - } - - return v; -#else - return 0; -#endif -} - -/*****************************************************************************/ - -#if EV_AVOID_STDIO -ecb_noinline ecb_cold -static void -ev_printerr (const char *msg) -{ - write (STDERR_FILENO, msg, strlen (msg)); -} -#endif - -static void (*syserr_cb)(const char *msg) EV_NOEXCEPT; - -ecb_cold -void -ev_set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT -{ - syserr_cb = cb; -} - -ecb_noinline ecb_cold -static void -ev_syserr (const char *msg) -{ - if (!msg) - msg = "(libev) system error"; - - if (syserr_cb) - syserr_cb (msg); - else - { -#if EV_AVOID_STDIO - ev_printerr (msg); - ev_printerr (": "); - ev_printerr (strerror (errno)); - ev_printerr ("\n"); -#else - perror (msg); -#endif - abort (); - } -} - -static void * -ev_realloc_emul (void *ptr, size_t size) EV_NOEXCEPT -{ - /* some systems, notably openbsd and darwin, fail to properly - * implement realloc (x, 0) (as required by both ansi c-89 and - * the single unix specification, so work around them here. - * recently, also (at least) fedora and debian started breaking it, - * despite documenting it otherwise. - */ - - if (size) - return realloc (ptr, size); - - free (ptr); - return 0; -} - -static void *(*alloc)(void *ptr, size_t size) EV_NOEXCEPT = ev_realloc_emul; - -ecb_cold -void -ev_set_allocator (void *(*cb)(void *ptr, size_t size) EV_NOEXCEPT) EV_NOEXCEPT -{ - alloc = cb; -} - -inline_speed void * -ev_realloc (void *ptr, size_t size) -{ - ptr = alloc (ptr, size); - - if (!ptr && size) - { -#if EV_AVOID_STDIO - ev_printerr ("(libev) memory allocation failed, aborting.\n"); -#else - fprintf (stderr, "(libev) cannot allocate %ld bytes, aborting.", size); -#endif - abort (); - } - - return ptr; -} - -#define ev_malloc(size) ev_realloc (0, (size)) -#define ev_free(ptr) ev_realloc ((ptr), 0) - -/*****************************************************************************/ - -/* set in reify when reification needed */ -#define EV_ANFD_REIFY 1 - -/* file descriptor info structure */ -typedef struct -{ - WL head; - unsigned char events; /* the events watched for */ - unsigned char reify; /* flag set when this ANFD needs reification (EV_ANFD_REIFY, EV__IOFDSET) */ - unsigned char emask; /* some backends store the actual kernel mask in here */ - unsigned char eflags; /* flags field for use by backends */ -#if EV_USE_EPOLL - unsigned int egen; /* generation counter to counter epoll bugs */ -#endif -#if EV_SELECT_IS_WINSOCKET || EV_USE_IOCP - SOCKET handle; -#endif -#if EV_USE_IOCP - OVERLAPPED or, ow; -#endif -} ANFD; - -/* stores the pending event set for a given watcher */ -typedef struct -{ - W w; - int events; /* the pending event set for the given watcher */ -} ANPENDING; - -#if EV_USE_INOTIFY -/* hash table entry per inotify-id */ -typedef struct -{ - WL head; -} ANFS; -#endif - -/* Heap Entry */ -#if EV_HEAP_CACHE_AT - /* a heap element */ - typedef struct { - ev_tstamp at; - WT w; - } ANHE; - - #define ANHE_w(he) (he).w /* access watcher, read-write */ - #define ANHE_at(he) (he).at /* access cached at, read-only */ - #define ANHE_at_cache(he) (he).at = (he).w->at /* update at from watcher */ -#else - /* a heap element */ - typedef WT ANHE; - - #define ANHE_w(he) (he) - #define ANHE_at(he) (he)->at - #define ANHE_at_cache(he) -#endif - -#if EV_MULTIPLICITY - - struct ev_loop - { - ev_tstamp ev_rt_now; - #define ev_rt_now ((loop)->ev_rt_now) - #define VAR(name,decl) decl; - #include "ev_vars.h" - #undef VAR - }; - #include "ev_wrap.h" - - static struct ev_loop default_loop_struct; - EV_API_DECL struct ev_loop *ev_default_loop_ptr = 0; /* needs to be initialised to make it a definition despite extern */ - -#else - - EV_API_DECL ev_tstamp ev_rt_now = EV_TS_CONST (0.); /* needs to be initialised to make it a definition despite extern */ - #define VAR(name,decl) static decl; - #include "ev_vars.h" - #undef VAR - - static int ev_default_loop_ptr; - -#endif - -#if EV_FEATURE_API -# define EV_RELEASE_CB if (ecb_expect_false (release_cb)) release_cb (EV_A) -# define EV_ACQUIRE_CB if (ecb_expect_false (acquire_cb)) acquire_cb (EV_A) -# define EV_INVOKE_PENDING invoke_cb (EV_A) -#else -# define EV_RELEASE_CB (void)0 -# define EV_ACQUIRE_CB (void)0 -# define EV_INVOKE_PENDING ev_invoke_pending (EV_A) -#endif - -#define EVBREAK_RECURSE 0x80 - -/*****************************************************************************/ - -#ifndef EV_HAVE_EV_TIME -ev_tstamp -ev_time (void) EV_NOEXCEPT -{ -#if EV_USE_REALTIME - if (ecb_expect_true (have_realtime)) - { - struct timespec ts; - clock_gettime (CLOCK_REALTIME, &ts); - return EV_TS_GET (ts); - } -#endif - - { - struct timeval tv; - gettimeofday (&tv, 0); - return EV_TV_GET (tv); - } -} -#endif - -inline_size ev_tstamp -get_clock (void) -{ -#if EV_USE_MONOTONIC - if (ecb_expect_true (have_monotonic)) - { - struct timespec ts; - clock_gettime (CLOCK_MONOTONIC, &ts); - return EV_TS_GET (ts); - } -#endif - - return ev_time (); -} - -#if EV_MULTIPLICITY -ev_tstamp -ev_now (EV_P) EV_NOEXCEPT -{ - return ev_rt_now; -} -#endif - -void -ev_sleep (ev_tstamp delay) EV_NOEXCEPT -{ - if (delay > EV_TS_CONST (0.)) - { -#if EV_USE_NANOSLEEP - struct timespec ts; - - EV_TS_SET (ts, delay); - nanosleep (&ts, 0); -#elif defined _WIN32 - /* maybe this should round up, as ms is very low resolution */ - /* compared to select (µs) or nanosleep (ns) */ - Sleep ((unsigned long)(EV_TS_TO_MSEC (delay))); -#else - struct timeval tv; - - /* here we rely on sys/time.h + sys/types.h + unistd.h providing select */ - /* something not guaranteed by newer posix versions, but guaranteed */ - /* by older ones */ - EV_TV_SET (tv, delay); - select (0, 0, 0, 0, &tv); -#endif - } -} - -/*****************************************************************************/ - -#define MALLOC_ROUND 4096 /* prefer to allocate in chunks of this size, must be 2**n and >> 4 longs */ - -/* find a suitable new size for the given array, */ -/* hopefully by rounding to a nice-to-malloc size */ -inline_size int -array_nextsize (int elem, int cur, int cnt) -{ - int ncur = cur + 1; - - do - ncur <<= 1; - while (cnt > ncur); - - /* if size is large, round to MALLOC_ROUND - 4 * longs to accommodate malloc overhead */ - if (elem * ncur > MALLOC_ROUND - sizeof (void *) * 4) - { - ncur *= elem; - ncur = (ncur + elem + (MALLOC_ROUND - 1) + sizeof (void *) * 4) & ~(MALLOC_ROUND - 1); - ncur = ncur - sizeof (void *) * 4; - ncur /= elem; - } - - return ncur; -} - -ecb_noinline ecb_cold -static void * -array_realloc (int elem, void *base, int *cur, int cnt) -{ - *cur = array_nextsize (elem, *cur, cnt); - return ev_realloc (base, elem * *cur); -} - -#define array_needsize_noinit(base,offset,count) - -#define array_needsize_zerofill(base,offset,count) \ - memset ((void *)(base + offset), 0, sizeof (*(base)) * (count)) - -#define array_needsize(type,base,cur,cnt,init) \ - if (ecb_expect_false ((cnt) > (cur))) \ - { \ - ecb_unused int ocur_ = (cur); \ - (base) = (type *)array_realloc \ - (sizeof (type), (base), &(cur), (cnt)); \ - init ((base), ocur_, ((cur) - ocur_)); \ - } - -#if 0 -#define array_slim(type,stem) \ - if (stem ## max < array_roundsize (stem ## cnt >> 2)) \ - { \ - stem ## max = array_roundsize (stem ## cnt >> 1); \ - base = (type *)ev_realloc (base, sizeof (type) * (stem ## max));\ - fprintf (stderr, "slimmed down " # stem " to %d\n", stem ## max);/*D*/\ - } -#endif - -#define array_free(stem, idx) \ - ev_free (stem ## s idx); stem ## cnt idx = stem ## max idx = 0; stem ## s idx = 0 - -/*****************************************************************************/ - -/* dummy callback for pending events */ -ecb_noinline -static void -pendingcb (EV_P_ ev_prepare *w, int revents) -{ -} - -ecb_noinline -void -ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT -{ - W w_ = (W)w; - int pri = ABSPRI (w_); - - if (ecb_expect_false (w_->pending)) - pendings [pri][w_->pending - 1].events |= revents; - else - { - w_->pending = ++pendingcnt [pri]; - array_needsize (ANPENDING, pendings [pri], pendingmax [pri], w_->pending, array_needsize_noinit); - pendings [pri][w_->pending - 1].w = w_; - pendings [pri][w_->pending - 1].events = revents; - } - - pendingpri = NUMPRI - 1; -} - -inline_speed void -feed_reverse (EV_P_ W w) -{ - array_needsize (W, rfeeds, rfeedmax, rfeedcnt + 1, array_needsize_noinit); - rfeeds [rfeedcnt++] = w; -} - -inline_size void -feed_reverse_done (EV_P_ int revents) -{ - do - ev_feed_event (EV_A_ rfeeds [--rfeedcnt], revents); - while (rfeedcnt); -} - -inline_speed void -queue_events (EV_P_ W *events, int eventcnt, int type) -{ - int i; - - for (i = 0; i < eventcnt; ++i) - ev_feed_event (EV_A_ events [i], type); -} - -/*****************************************************************************/ - -inline_speed void -fd_event_nocheck (EV_P_ int fd, int revents) -{ - ANFD *anfd = anfds + fd; - ev_io *w; - - for (w = (ev_io *)anfd->head; w; w = (ev_io *)((WL)w)->next) - { - int ev = w->events & revents; - - if (ev) - ev_feed_event (EV_A_ (W)w, ev); - } -} - -/* do not submit kernel events for fds that have reify set */ -/* because that means they changed while we were polling for new events */ -inline_speed void -fd_event (EV_P_ int fd, int revents) -{ - ANFD *anfd = anfds + fd; - - if (ecb_expect_true (!anfd->reify)) - fd_event_nocheck (EV_A_ fd, revents); -} - -void -ev_feed_fd_event (EV_P_ int fd, int revents) EV_NOEXCEPT -{ - if (fd >= 0 && fd < anfdmax) - fd_event_nocheck (EV_A_ fd, revents); -} - -/* make sure the external fd watch events are in-sync */ -/* with the kernel/libev internal state */ -inline_size void -fd_reify (EV_P) -{ - int i; - - /* most backends do not modify the fdchanges list in backend_modfiy. - * except io_uring, which has fixed-size buffers which might force us - * to handle events in backend_modify, causing fdchanges to be amended, - * which could result in an endless loop. - * to avoid this, we do not dynamically handle fds that were added - * during fd_reify. that means that for those backends, fdchangecnt - * might be non-zero during poll, which must cause them to not block. - * to not put too much of a burden on other backends, this detail - * needs to be handled in the backend. - */ - int changecnt = fdchangecnt; - -#if EV_SELECT_IS_WINSOCKET || EV_USE_IOCP - for (i = 0; i < changecnt; ++i) - { - int fd = fdchanges [i]; - ANFD *anfd = anfds + fd; - - if (anfd->reify & EV__IOFDSET && anfd->head) - { - SOCKET handle = EV_FD_TO_WIN32_HANDLE (fd); - - if (handle != anfd->handle) - { - unsigned long arg; - - assert (("libev: only socket fds supported in this configuration", ioctlsocket (handle, FIONREAD, &arg) == 0)); - - /* handle changed, but fd didn't - we need to do it in two steps */ - backend_modify (EV_A_ fd, anfd->events, 0); - anfd->events = 0; - anfd->handle = handle; - } - } - } -#endif - - for (i = 0; i < changecnt; ++i) - { - int fd = fdchanges [i]; - ANFD *anfd = anfds + fd; - ev_io *w; - - unsigned char o_events = anfd->events; - unsigned char o_reify = anfd->reify; - - anfd->reify = 0; - - /*if (ecb_expect_true (o_reify & EV_ANFD_REIFY)) probably a deoptimisation */ - { - anfd->events = 0; - - for (w = (ev_io *)anfd->head; w; w = (ev_io *)((WL)w)->next) - anfd->events |= (unsigned char)w->events; - - if (o_events != anfd->events) - o_reify = EV__IOFDSET; /* actually |= */ - } - - if (o_reify & EV__IOFDSET) - backend_modify (EV_A_ fd, o_events, anfd->events); - } - - /* normally, fdchangecnt hasn't changed. if it has, then new fds have been added. - * this is a rare case (see beginning comment in this function), so we copy them to the - * front and hope the backend handles this case. - */ - if (ecb_expect_false (fdchangecnt != changecnt)) - memmove (fdchanges, fdchanges + changecnt, (fdchangecnt - changecnt) * sizeof (*fdchanges)); - - fdchangecnt -= changecnt; -} - -/* something about the given fd changed */ -inline_size -void -fd_change (EV_P_ int fd, int flags) -{ - unsigned char reify = anfds [fd].reify; - anfds [fd].reify = reify | flags; - - if (ecb_expect_true (!reify)) - { - ++fdchangecnt; - array_needsize (int, fdchanges, fdchangemax, fdchangecnt, array_needsize_noinit); - fdchanges [fdchangecnt - 1] = fd; - } -} - -/* the given fd is invalid/unusable, so make sure it doesn't hurt us anymore */ -inline_speed ecb_cold void -fd_kill (EV_P_ int fd) -{ - ev_io *w; - - while ((w = (ev_io *)anfds [fd].head)) - { - ev_io_stop (EV_A_ w); - ev_feed_event (EV_A_ (W)w, EV_ERROR | EV_READ | EV_WRITE); - } -} - -/* check whether the given fd is actually valid, for error recovery */ -inline_size ecb_cold int -fd_valid (int fd) -{ -#ifdef _WIN32 - return EV_FD_TO_WIN32_HANDLE (fd) != -1; -#else - return fcntl (fd, F_GETFD) != -1; -#endif -} - -/* called on EBADF to verify fds */ -ecb_noinline ecb_cold -static void -fd_ebadf (EV_P) -{ - int fd; - - for (fd = 0; fd < anfdmax; ++fd) - if (anfds [fd].events) - if (!fd_valid (fd) && errno == EBADF) - fd_kill (EV_A_ fd); -} - -/* called on ENOMEM in select/poll to kill some fds and retry */ -ecb_noinline ecb_cold -static void -fd_enomem (EV_P) -{ - int fd; - - for (fd = anfdmax; fd--; ) - if (anfds [fd].events) - { - fd_kill (EV_A_ fd); - break; - } -} - -/* usually called after fork if backend needs to re-arm all fds from scratch */ -ecb_noinline -static void -fd_rearm_all (EV_P) -{ - int fd; - - for (fd = 0; fd < anfdmax; ++fd) - if (anfds [fd].events) - { - anfds [fd].events = 0; - anfds [fd].emask = 0; - fd_change (EV_A_ fd, EV__IOFDSET | EV_ANFD_REIFY); - } -} - -/* used to prepare libev internal fd's */ -/* this is not fork-safe */ -inline_speed void -fd_intern (int fd) -{ -#ifdef _WIN32 - unsigned long arg = 1; - ioctlsocket (EV_FD_TO_WIN32_HANDLE (fd), FIONBIO, &arg); -#else - fcntl (fd, F_SETFD, FD_CLOEXEC); - fcntl (fd, F_SETFL, O_NONBLOCK); -#endif -} - -/*****************************************************************************/ - -/* - * the heap functions want a real array index. array index 0 is guaranteed to not - * be in-use at any time. the first heap entry is at array [HEAP0]. DHEAP gives - * the branching factor of the d-tree. - */ - -/* - * at the moment we allow libev the luxury of two heaps, - * a small-code-size 2-heap one and a ~1.5kb larger 4-heap - * which is more cache-efficient. - * the difference is about 5% with 50000+ watchers. - */ -#if EV_USE_4HEAP - -#define DHEAP 4 -#define HEAP0 (DHEAP - 1) /* index of first element in heap */ -#define HPARENT(k) ((((k) - HEAP0 - 1) / DHEAP) + HEAP0) -#define UPHEAP_DONE(p,k) ((p) == (k)) - -/* away from the root */ -inline_speed void -downheap (ANHE *heap, int N, int k) -{ - ANHE he = heap [k]; - ANHE *E = heap + N + HEAP0; - - for (;;) - { - ev_tstamp minat; - ANHE *minpos; - ANHE *pos = heap + DHEAP * (k - HEAP0) + HEAP0 + 1; - - /* find minimum child */ - if (ecb_expect_true (pos + DHEAP - 1 < E)) - { - /* fast path */ (minpos = pos + 0), (minat = ANHE_at (*minpos)); - if ( minat > ANHE_at (pos [1])) (minpos = pos + 1), (minat = ANHE_at (*minpos)); - if ( minat > ANHE_at (pos [2])) (minpos = pos + 2), (minat = ANHE_at (*minpos)); - if ( minat > ANHE_at (pos [3])) (minpos = pos + 3), (minat = ANHE_at (*minpos)); - } - else if (pos < E) - { - /* slow path */ (minpos = pos + 0), (minat = ANHE_at (*minpos)); - if (pos + 1 < E && minat > ANHE_at (pos [1])) (minpos = pos + 1), (minat = ANHE_at (*minpos)); - if (pos + 2 < E && minat > ANHE_at (pos [2])) (minpos = pos + 2), (minat = ANHE_at (*minpos)); - if (pos + 3 < E && minat > ANHE_at (pos [3])) (minpos = pos + 3), (minat = ANHE_at (*minpos)); - } - else - break; - - if (ANHE_at (he) <= minat) - break; - - heap [k] = *minpos; - ev_active (ANHE_w (*minpos)) = k; - - k = minpos - heap; - } - - heap [k] = he; - ev_active (ANHE_w (he)) = k; -} - -#else /* not 4HEAP */ - -#define HEAP0 1 -#define HPARENT(k) ((k) >> 1) -#define UPHEAP_DONE(p,k) (!(p)) - -/* away from the root */ -inline_speed void -downheap (ANHE *heap, int N, int k) -{ - ANHE he = heap [k]; - - for (;;) - { - int c = k << 1; - - if (c >= N + HEAP0) - break; - - c += c + 1 < N + HEAP0 && ANHE_at (heap [c]) > ANHE_at (heap [c + 1]) - ? 1 : 0; - - if (ANHE_at (he) <= ANHE_at (heap [c])) - break; - - heap [k] = heap [c]; - ev_active (ANHE_w (heap [k])) = k; - - k = c; - } - - heap [k] = he; - ev_active (ANHE_w (he)) = k; -} -#endif - -/* towards the root */ -inline_speed void -upheap (ANHE *heap, int k) -{ - ANHE he = heap [k]; - - for (;;) - { - int p = HPARENT (k); - - if (UPHEAP_DONE (p, k) || ANHE_at (heap [p]) <= ANHE_at (he)) - break; - - heap [k] = heap [p]; - ev_active (ANHE_w (heap [k])) = k; - k = p; - } - - heap [k] = he; - ev_active (ANHE_w (he)) = k; -} - -/* move an element suitably so it is in a correct place */ -inline_size void -adjustheap (ANHE *heap, int N, int k) -{ - if (k > HEAP0 && ANHE_at (heap [k]) <= ANHE_at (heap [HPARENT (k)])) - upheap (heap, k); - else - downheap (heap, N, k); -} - -/* rebuild the heap: this function is used only once and executed rarely */ -inline_size void -reheap (ANHE *heap, int N) -{ - int i; - - /* we don't use floyds algorithm, upheap is simpler and is more cache-efficient */ - /* also, this is easy to implement and correct for both 2-heaps and 4-heaps */ - for (i = 0; i < N; ++i) - upheap (heap, i + HEAP0); -} - -/*****************************************************************************/ - -/* associate signal watchers to a signal */ -typedef struct -{ - EV_ATOMIC_T pending; -#if EV_MULTIPLICITY - EV_P; -#endif - WL head; -} ANSIG; - -static ANSIG signals [EV_NSIG - 1]; - -/*****************************************************************************/ - -#if EV_SIGNAL_ENABLE || EV_ASYNC_ENABLE - -ecb_noinline ecb_cold -static void -evpipe_init (EV_P) -{ - if (!ev_is_active (&pipe_w)) - { - int fds [2]; - -# if EV_USE_EVENTFD - fds [0] = -1; - fds [1] = eventfd (0, EFD_NONBLOCK | EFD_CLOEXEC); - if (fds [1] < 0 && errno == EINVAL) - fds [1] = eventfd (0, 0); - - if (fds [1] < 0) -# endif - { - while (pipe (fds)) - ev_syserr ("(libev) error creating signal/async pipe"); - - fd_intern (fds [0]); - } - - evpipe [0] = fds [0]; - - if (evpipe [1] < 0) - evpipe [1] = fds [1]; /* first call, set write fd */ - else - { - /* on subsequent calls, do not change evpipe [1] */ - /* so that evpipe_write can always rely on its value. */ - /* this branch does not do anything sensible on windows, */ - /* so must not be executed on windows */ - - dup2 (fds [1], evpipe [1]); - close (fds [1]); - } - - fd_intern (evpipe [1]); - - ev_io_set (&pipe_w, evpipe [0] < 0 ? evpipe [1] : evpipe [0], EV_READ); - ev_io_start (EV_A_ &pipe_w); - ev_unref (EV_A); /* watcher should not keep loop alive */ - } -} - -inline_speed void -evpipe_write (EV_P_ EV_ATOMIC_T *flag) -{ - ECB_MEMORY_FENCE; /* push out the write before this function was called, acquire flag */ - - if (ecb_expect_true (*flag)) - return; - - *flag = 1; - ECB_MEMORY_FENCE_RELEASE; /* make sure flag is visible before the wakeup */ - - pipe_write_skipped = 1; - - ECB_MEMORY_FENCE; /* make sure pipe_write_skipped is visible before we check pipe_write_wanted */ - - if (pipe_write_wanted) - { - int old_errno; - - pipe_write_skipped = 0; - ECB_MEMORY_FENCE_RELEASE; - - old_errno = errno; /* save errno because write will clobber it */ - -#if EV_USE_EVENTFD - if (evpipe [0] < 0) - { - uint64_t counter = 1; - write (evpipe [1], &counter, sizeof (uint64_t)); - } - else -#endif - { -#ifdef _WIN32 - WSABUF buf; - DWORD sent; - buf.buf = (char *)&buf; - buf.len = 1; - WSASend (EV_FD_TO_WIN32_HANDLE (evpipe [1]), &buf, 1, &sent, 0, 0, 0); -#else - write (evpipe [1], &(evpipe [1]), 1); -#endif - } - - errno = old_errno; - } -} - -/* called whenever the libev signal pipe */ -/* got some events (signal, async) */ -static void -pipecb (EV_P_ ev_io *iow, int revents) -{ - int i; - - if (revents & EV_READ) - { -#if EV_USE_EVENTFD - if (evpipe [0] < 0) - { - uint64_t counter; - read (evpipe [1], &counter, sizeof (uint64_t)); - } - else -#endif - { - char dummy[4]; -#ifdef _WIN32 - WSABUF buf; - DWORD recvd; - DWORD flags = 0; - buf.buf = dummy; - buf.len = sizeof (dummy); - WSARecv (EV_FD_TO_WIN32_HANDLE (evpipe [0]), &buf, 1, &recvd, &flags, 0, 0); -#else - read (evpipe [0], &dummy, sizeof (dummy)); -#endif - } - } - - pipe_write_skipped = 0; - - ECB_MEMORY_FENCE; /* push out skipped, acquire flags */ - -#if EV_SIGNAL_ENABLE - if (sig_pending) - { - sig_pending = 0; - - ECB_MEMORY_FENCE; - - for (i = EV_NSIG - 1; i--; ) - if (ecb_expect_false (signals [i].pending)) - ev_feed_signal_event (EV_A_ i + 1); - } -#endif - -#if EV_ASYNC_ENABLE - if (async_pending) - { - async_pending = 0; - - ECB_MEMORY_FENCE; - - for (i = asynccnt; i--; ) - if (asyncs [i]->sent) - { - asyncs [i]->sent = 0; - ECB_MEMORY_FENCE_RELEASE; - ev_feed_event (EV_A_ asyncs [i], EV_ASYNC); - } - } -#endif -} - -/*****************************************************************************/ - -void -ev_feed_signal (int signum) EV_NOEXCEPT -{ -#if EV_MULTIPLICITY - EV_P; - ECB_MEMORY_FENCE_ACQUIRE; - EV_A = signals [signum - 1].loop; - - if (!EV_A) - return; -#endif - - signals [signum - 1].pending = 1; - evpipe_write (EV_A_ &sig_pending); -} - -static void -ev_sighandler (int signum) -{ -#ifdef _WIN32 - signal (signum, ev_sighandler); -#endif - - ev_feed_signal (signum); -} - -ecb_noinline -void -ev_feed_signal_event (EV_P_ int signum) EV_NOEXCEPT -{ - WL w; - - if (ecb_expect_false (signum <= 0 || signum >= EV_NSIG)) - return; - - --signum; - -#if EV_MULTIPLICITY - /* it is permissible to try to feed a signal to the wrong loop */ - /* or, likely more useful, feeding a signal nobody is waiting for */ - - if (ecb_expect_false (signals [signum].loop != EV_A)) - return; -#endif - - signals [signum].pending = 0; - ECB_MEMORY_FENCE_RELEASE; - - for (w = signals [signum].head; w; w = w->next) - ev_feed_event (EV_A_ (W)w, EV_SIGNAL); -} - -#if EV_USE_SIGNALFD -static void -sigfdcb (EV_P_ ev_io *iow, int revents) -{ - struct signalfd_siginfo si[2], *sip; /* these structs are big */ - - for (;;) - { - ssize_t res = read (sigfd, si, sizeof (si)); - - /* not ISO-C, as res might be -1, but works with SuS */ - for (sip = si; (char *)sip < (char *)si + res; ++sip) - ev_feed_signal_event (EV_A_ sip->ssi_signo); - - if (res < (ssize_t)sizeof (si)) - break; - } -} -#endif - -#endif - -/*****************************************************************************/ - -#if EV_CHILD_ENABLE -static WL childs [EV_PID_HASHSIZE]; - -static ev_signal childev; - -#ifndef WIFCONTINUED -# define WIFCONTINUED(status) 0 -#endif - -/* handle a single child status event */ -inline_speed void -child_reap (EV_P_ int chain, int pid, int status) -{ - ev_child *w; - int traced = WIFSTOPPED (status) || WIFCONTINUED (status); - - for (w = (ev_child *)childs [chain & ((EV_PID_HASHSIZE) - 1)]; w; w = (ev_child *)((WL)w)->next) - { - if ((w->pid == pid || !w->pid) - && (!traced || (w->flags & 1))) - { - ev_set_priority (w, EV_MAXPRI); /* need to do it *now*, this *must* be the same prio as the signal watcher itself */ - w->rpid = pid; - w->rstatus = status; - ev_feed_event (EV_A_ (W)w, EV_CHILD); - } - } -} - -#ifndef WCONTINUED -# define WCONTINUED 0 -#endif - -/* called on sigchld etc., calls waitpid */ -static void -childcb (EV_P_ ev_signal *sw, int revents) -{ - int pid, status; - - /* some systems define WCONTINUED but then fail to support it (linux 2.4) */ - if (0 >= (pid = waitpid (-1, &status, WNOHANG | WUNTRACED | WCONTINUED))) - if (!WCONTINUED - || errno != EINVAL - || 0 >= (pid = waitpid (-1, &status, WNOHANG | WUNTRACED))) - return; - - /* make sure we are called again until all children have been reaped */ - /* we need to do it this way so that the callback gets called before we continue */ - ev_feed_event (EV_A_ (W)sw, EV_SIGNAL); - - child_reap (EV_A_ pid, pid, status); - if ((EV_PID_HASHSIZE) > 1) - child_reap (EV_A_ 0, pid, status); /* this might trigger a watcher twice, but feed_event catches that */ -} - -#endif - -/*****************************************************************************/ - -#if EV_USE_TIMERFD - -static void periodics_reschedule (EV_P); - -static void -timerfdcb (EV_P_ ev_io *iow, int revents) -{ - struct itimerspec its = { 0 }; - - its.it_value.tv_sec = ev_rt_now + (int)MAX_BLOCKTIME2; - timerfd_settime (timerfd, TFD_TIMER_ABSTIME | TFD_TIMER_CANCEL_ON_SET, &its, 0); - - ev_rt_now = ev_time (); - /* periodics_reschedule only needs ev_rt_now */ - /* but maybe in the future we want the full treatment. */ - /* - now_floor = EV_TS_CONST (0.); - time_update (EV_A_ EV_TSTAMP_HUGE); - */ -#if EV_PERIODIC_ENABLE - periodics_reschedule (EV_A); -#endif -} - -ecb_noinline ecb_cold -static void -evtimerfd_init (EV_P) -{ - if (!ev_is_active (&timerfd_w)) - { - timerfd = timerfd_create (CLOCK_REALTIME, TFD_NONBLOCK | TFD_CLOEXEC); - - if (timerfd >= 0) - { - fd_intern (timerfd); /* just to be sure */ - - ev_io_init (&timerfd_w, timerfdcb, timerfd, EV_READ); - ev_set_priority (&timerfd_w, EV_MINPRI); - ev_io_start (EV_A_ &timerfd_w); - ev_unref (EV_A); /* watcher should not keep loop alive */ - - /* (re-) arm timer */ - timerfdcb (EV_A_ 0, 0); - } - } -} - -#endif - -/*****************************************************************************/ - -#if EV_USE_IOCP -# include "ev_iocp.c" -#endif -#if EV_USE_PORT -# include "ev_port.c" -#endif -#if EV_USE_KQUEUE -# include "ev_kqueue.c" -#endif -#if EV_USE_EPOLL -# include "ev_epoll.c" -#endif -#if EV_USE_LINUXAIO -# include "ev_linuxaio.c" -#endif -#if EV_USE_IOURING -# include "ev_iouring.c" -#endif -#if EV_USE_POLL -# include "ev_poll.c" -#endif -#if EV_USE_SELECT -# include "ev_select.c" -#endif - -ecb_cold int -ev_version_major (void) EV_NOEXCEPT -{ - return EV_VERSION_MAJOR; -} - -ecb_cold int -ev_version_minor (void) EV_NOEXCEPT -{ - return EV_VERSION_MINOR; -} - -/* return true if we are running with elevated privileges and should ignore env variables */ -inline_size ecb_cold int -enable_secure (void) -{ -#ifdef _WIN32 - return 0; -#else - return getuid () != geteuid () - || getgid () != getegid (); -#endif -} - -ecb_cold -unsigned int -ev_supported_backends (void) EV_NOEXCEPT -{ - unsigned int flags = 0; - - if (EV_USE_PORT ) flags |= EVBACKEND_PORT; - if (EV_USE_KQUEUE ) flags |= EVBACKEND_KQUEUE; - if (EV_USE_EPOLL ) flags |= EVBACKEND_EPOLL; - if (EV_USE_LINUXAIO && ev_linux_version () >= 0x041300) flags |= EVBACKEND_LINUXAIO; /* 4.19+ */ - if (EV_USE_IOURING && ev_linux_version () >= 0x050601 ) flags |= EVBACKEND_IOURING; /* 5.6.1+ */ - if (EV_USE_POLL ) flags |= EVBACKEND_POLL; - if (EV_USE_SELECT ) flags |= EVBACKEND_SELECT; - - return flags; -} - -ecb_cold -unsigned int -ev_recommended_backends (void) EV_NOEXCEPT -{ - unsigned int flags = ev_supported_backends (); - -/* apple has a poor track record but post 10.12.2 it seems to work sufficiently well */ -#if defined(__APPLE__) && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_14) - /* only select works correctly on that "unix-certified" platform */ - flags &= ~EVBACKEND_KQUEUE; /* horribly broken, even for sockets */ - flags &= ~EVBACKEND_POLL; /* poll is based on kqueue from 10.5 onwards */ -#endif - -#if !defined(__NetBSD__) && !defined(__APPLE__) - /* kqueue is borked on everything but netbsd and osx >= 10.12.2 apparently */ - /* it usually doesn't work correctly on anything but sockets and pipes */ - flags &= ~EVBACKEND_KQUEUE; -#endif - -#ifdef __FreeBSD__ - flags &= ~EVBACKEND_POLL; /* poll return value is unusable (http://forums.freebsd.org/archive/index.php/t-10270.html) */ -#endif - -#ifdef __linux__ - /* NOTE: linuxaio is very experimental, never recommend */ - flags &= ~EVBACKEND_LINUXAIO; - - /* NOTE: io_uring is super experimental, never recommend */ - flags &= ~EVBACKEND_IOURING; -#endif - - return flags; -} - -ecb_cold -unsigned int -ev_embeddable_backends (void) EV_NOEXCEPT -{ - int flags = EVBACKEND_EPOLL | EVBACKEND_KQUEUE | EVBACKEND_PORT | EVBACKEND_IOURING; - - /* epoll embeddability broken on all linux versions up to at least 2.6.23 */ - if (ev_linux_version () < 0x020620) /* disable it on linux < 2.6.32 */ - flags &= ~EVBACKEND_EPOLL; - - /* EVBACKEND_LINUXAIO is theoretically embeddable, but suffers from a performance overhead */ - - return flags; -} - -unsigned int -ev_backend (EV_P) EV_NOEXCEPT -{ - return backend; -} - -#if EV_FEATURE_API -unsigned int -ev_iteration (EV_P) EV_NOEXCEPT -{ - return loop_count; -} - -unsigned int -ev_depth (EV_P) EV_NOEXCEPT -{ - return loop_depth; -} - -void -ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT -{ - io_blocktime = interval; -} - -void -ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT -{ - timeout_blocktime = interval; -} - -void -ev_set_userdata (EV_P_ void *data) EV_NOEXCEPT -{ - userdata = data; -} - -void * -ev_userdata (EV_P) EV_NOEXCEPT -{ - return userdata; -} - -void -ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_NOEXCEPT -{ - invoke_cb = invoke_pending_cb; -} - -void -ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_NOEXCEPT, void (*acquire)(EV_P) EV_NOEXCEPT) EV_NOEXCEPT -{ - release_cb = release; - acquire_cb = acquire; -} -#endif - -/* initialise a loop structure, must be zero-initialised */ -ecb_noinline ecb_cold -static void -loop_init (EV_P_ unsigned int flags) EV_NOEXCEPT -{ - if (!backend) - { - origflags = flags; - -#if EV_USE_REALTIME - if (!have_realtime) - { - struct timespec ts; - - if (!clock_gettime (CLOCK_REALTIME, &ts)) - have_realtime = 1; - } -#endif - -#if EV_USE_MONOTONIC - if (!have_monotonic) - { - struct timespec ts; - - if (!clock_gettime (CLOCK_MONOTONIC, &ts)) - have_monotonic = 1; - } -#endif - - /* pid check not overridable via env */ -#ifndef _WIN32 - if (flags & EVFLAG_FORKCHECK) - curpid = getpid (); -#endif - - if (!(flags & EVFLAG_NOENV) - && !enable_secure () - && getenv ("LIBEV_FLAGS")) - flags = atoi (getenv ("LIBEV_FLAGS")); - - ev_rt_now = ev_time (); - mn_now = get_clock (); - now_floor = mn_now; - rtmn_diff = ev_rt_now - mn_now; -#if EV_FEATURE_API - invoke_cb = ev_invoke_pending; -#endif - - io_blocktime = 0.; - timeout_blocktime = 0.; - backend = 0; - backend_fd = -1; - sig_pending = 0; -#if EV_ASYNC_ENABLE - async_pending = 0; -#endif - pipe_write_skipped = 0; - pipe_write_wanted = 0; - evpipe [0] = -1; - evpipe [1] = -1; -#if EV_USE_INOTIFY - fs_fd = flags & EVFLAG_NOINOTIFY ? -1 : -2; -#endif -#if EV_USE_SIGNALFD - sigfd = flags & EVFLAG_SIGNALFD ? -2 : -1; -#endif -#if EV_USE_TIMERFD - timerfd = flags & EVFLAG_NOTIMERFD ? -1 : -2; -#endif - - if (!(flags & EVBACKEND_MASK)) - flags |= ev_recommended_backends (); - -#if EV_USE_IOCP - if (!backend && (flags & EVBACKEND_IOCP )) backend = iocp_init (EV_A_ flags); -#endif -#if EV_USE_PORT - if (!backend && (flags & EVBACKEND_PORT )) backend = port_init (EV_A_ flags); -#endif -#if EV_USE_KQUEUE - if (!backend && (flags & EVBACKEND_KQUEUE )) backend = kqueue_init (EV_A_ flags); -#endif -#if EV_USE_IOURING - if (!backend && (flags & EVBACKEND_IOURING )) backend = iouring_init (EV_A_ flags); -#endif -#if EV_USE_LINUXAIO - if (!backend && (flags & EVBACKEND_LINUXAIO)) backend = linuxaio_init (EV_A_ flags); -#endif -#if EV_USE_EPOLL - if (!backend && (flags & EVBACKEND_EPOLL )) backend = epoll_init (EV_A_ flags); -#endif -#if EV_USE_POLL - if (!backend && (flags & EVBACKEND_POLL )) backend = poll_init (EV_A_ flags); -#endif -#if EV_USE_SELECT - if (!backend && (flags & EVBACKEND_SELECT )) backend = select_init (EV_A_ flags); -#endif - - ev_prepare_init (&pending_w, pendingcb); - -#if EV_SIGNAL_ENABLE || EV_ASYNC_ENABLE - ev_init (&pipe_w, pipecb); - ev_set_priority (&pipe_w, EV_MAXPRI); -#endif - } -} - -/* free up a loop structure */ -ecb_cold -void -ev_loop_destroy (EV_P) -{ - int i; - -#if EV_MULTIPLICITY - /* mimic free (0) */ - if (!EV_A) - return; -#endif - -#if EV_CLEANUP_ENABLE - /* queue cleanup watchers (and execute them) */ - if (ecb_expect_false (cleanupcnt)) - { - queue_events (EV_A_ (W *)cleanups, cleanupcnt, EV_CLEANUP); - EV_INVOKE_PENDING; - } -#endif - -#if EV_CHILD_ENABLE - if (ev_is_default_loop (EV_A) && ev_is_active (&childev)) - { - ev_ref (EV_A); /* child watcher */ - ev_signal_stop (EV_A_ &childev); - } -#endif - - if (ev_is_active (&pipe_w)) - { - /*ev_ref (EV_A);*/ - /*ev_io_stop (EV_A_ &pipe_w);*/ - - if (evpipe [0] >= 0) EV_WIN32_CLOSE_FD (evpipe [0]); - if (evpipe [1] >= 0) EV_WIN32_CLOSE_FD (evpipe [1]); - } - -#if EV_USE_SIGNALFD - if (ev_is_active (&sigfd_w)) - close (sigfd); -#endif - -#if EV_USE_TIMERFD - if (ev_is_active (&timerfd_w)) - close (timerfd); -#endif - -#if EV_USE_INOTIFY - if (fs_fd >= 0) - close (fs_fd); -#endif - - if (backend_fd >= 0) - close (backend_fd); - -#if EV_USE_IOCP - if (backend == EVBACKEND_IOCP ) iocp_destroy (EV_A); -#endif -#if EV_USE_PORT - if (backend == EVBACKEND_PORT ) port_destroy (EV_A); -#endif -#if EV_USE_KQUEUE - if (backend == EVBACKEND_KQUEUE ) kqueue_destroy (EV_A); -#endif -#if EV_USE_IOURING - if (backend == EVBACKEND_IOURING ) iouring_destroy (EV_A); -#endif -#if EV_USE_LINUXAIO - if (backend == EVBACKEND_LINUXAIO) linuxaio_destroy (EV_A); -#endif -#if EV_USE_EPOLL - if (backend == EVBACKEND_EPOLL ) epoll_destroy (EV_A); -#endif -#if EV_USE_POLL - if (backend == EVBACKEND_POLL ) poll_destroy (EV_A); -#endif -#if EV_USE_SELECT - if (backend == EVBACKEND_SELECT ) select_destroy (EV_A); -#endif - - for (i = NUMPRI; i--; ) - { - array_free (pending, [i]); -#if EV_IDLE_ENABLE - array_free (idle, [i]); -#endif - } - - ev_free (anfds); anfds = 0; anfdmax = 0; - - /* have to use the microsoft-never-gets-it-right macro */ - array_free (rfeed, EMPTY); - array_free (fdchange, EMPTY); - array_free (timer, EMPTY); -#if EV_PERIODIC_ENABLE - array_free (periodic, EMPTY); -#endif -#if EV_FORK_ENABLE - array_free (fork, EMPTY); -#endif -#if EV_CLEANUP_ENABLE - array_free (cleanup, EMPTY); -#endif - array_free (prepare, EMPTY); - array_free (check, EMPTY); -#if EV_ASYNC_ENABLE - array_free (async, EMPTY); -#endif - - backend = 0; - -#if EV_MULTIPLICITY - if (ev_is_default_loop (EV_A)) -#endif - ev_default_loop_ptr = 0; -#if EV_MULTIPLICITY - else - ev_free (EV_A); -#endif -} - -#if EV_USE_INOTIFY -inline_size void infy_fork (EV_P); -#endif - -inline_size void -loop_fork (EV_P) -{ -#if EV_USE_PORT - if (backend == EVBACKEND_PORT ) port_fork (EV_A); -#endif -#if EV_USE_KQUEUE - if (backend == EVBACKEND_KQUEUE ) kqueue_fork (EV_A); -#endif -#if EV_USE_IOURING - if (backend == EVBACKEND_IOURING ) iouring_fork (EV_A); -#endif -#if EV_USE_LINUXAIO - if (backend == EVBACKEND_LINUXAIO) linuxaio_fork (EV_A); -#endif -#if EV_USE_EPOLL - if (backend == EVBACKEND_EPOLL ) epoll_fork (EV_A); -#endif -#if EV_USE_INOTIFY - infy_fork (EV_A); -#endif - - if (postfork != 2) - { - #if EV_USE_SIGNALFD - /* surprisingly, nothing needs to be done for signalfd, accoridng to docs, it does the right thing on fork */ - #endif - - #if EV_USE_TIMERFD - if (ev_is_active (&timerfd_w)) - { - ev_ref (EV_A); - ev_io_stop (EV_A_ &timerfd_w); - - close (timerfd); - timerfd = -2; - - evtimerfd_init (EV_A); - /* reschedule periodics, in case we missed something */ - ev_feed_event (EV_A_ &timerfd_w, EV_CUSTOM); - } - #endif - - #if EV_SIGNAL_ENABLE || EV_ASYNC_ENABLE - if (ev_is_active (&pipe_w)) - { - /* pipe_write_wanted must be false now, so modifying fd vars should be safe */ - - ev_ref (EV_A); - ev_io_stop (EV_A_ &pipe_w); - - if (evpipe [0] >= 0) - EV_WIN32_CLOSE_FD (evpipe [0]); - - evpipe_init (EV_A); - /* iterate over everything, in case we missed something before */ - ev_feed_event (EV_A_ &pipe_w, EV_CUSTOM); - } - #endif - } - - postfork = 0; -} - -#if EV_MULTIPLICITY - -ecb_cold -struct ev_loop * -ev_loop_new (unsigned int flags) EV_NOEXCEPT -{ - EV_P = (struct ev_loop *)ev_malloc (sizeof (struct ev_loop)); - - memset (EV_A, 0, sizeof (struct ev_loop)); - loop_init (EV_A_ flags); - - if (ev_backend (EV_A)) - return EV_A; - - ev_free (EV_A); - return 0; -} - -#endif /* multiplicity */ - -#if EV_VERIFY -ecb_noinline ecb_cold -static void -verify_watcher (EV_P_ W w) -{ - assert (("libev: watcher has invalid priority", ABSPRI (w) >= 0 && ABSPRI (w) < NUMPRI)); - - if (w->pending) - assert (("libev: pending watcher not on pending queue", pendings [ABSPRI (w)][w->pending - 1].w == w)); -} - -ecb_noinline ecb_cold -static void -verify_heap (EV_P_ ANHE *heap, int N) -{ - int i; - - for (i = HEAP0; i < N + HEAP0; ++i) - { - assert (("libev: active index mismatch in heap", ev_active (ANHE_w (heap [i])) == i)); - assert (("libev: heap condition violated", i == HEAP0 || ANHE_at (heap [HPARENT (i)]) <= ANHE_at (heap [i]))); - assert (("libev: heap at cache mismatch", ANHE_at (heap [i]) == ev_at (ANHE_w (heap [i])))); - - verify_watcher (EV_A_ (W)ANHE_w (heap [i])); - } -} - -ecb_noinline ecb_cold -static void -array_verify (EV_P_ W *ws, int cnt) -{ - while (cnt--) - { - assert (("libev: active index mismatch", ev_active (ws [cnt]) == cnt + 1)); - verify_watcher (EV_A_ ws [cnt]); - } -} -#endif - -#if EV_FEATURE_API -void ecb_cold -ev_verify (EV_P) EV_NOEXCEPT -{ -#if EV_VERIFY - int i; - WL w, w2; - - assert (activecnt >= -1); - - assert (fdchangemax >= fdchangecnt); - for (i = 0; i < fdchangecnt; ++i) - assert (("libev: negative fd in fdchanges", fdchanges [i] >= 0)); - - assert (anfdmax >= 0); - for (i = 0; i < anfdmax; ++i) - { - int j = 0; - - for (w = w2 = anfds [i].head; w; w = w->next) - { - verify_watcher (EV_A_ (W)w); - - if (j++ & 1) - { - assert (("libev: io watcher list contains a loop", w != w2)); - w2 = w2->next; - } - - assert (("libev: inactive fd watcher on anfd list", ev_active (w) == 1)); - assert (("libev: fd mismatch between watcher and anfd", ((ev_io *)w)->fd == i)); - } - } - - assert (timermax >= timercnt); - verify_heap (EV_A_ timers, timercnt); - -#if EV_PERIODIC_ENABLE - assert (periodicmax >= periodiccnt); - verify_heap (EV_A_ periodics, periodiccnt); -#endif - - for (i = NUMPRI; i--; ) - { - assert (pendingmax [i] >= pendingcnt [i]); -#if EV_IDLE_ENABLE - assert (idleall >= 0); - assert (idlemax [i] >= idlecnt [i]); - array_verify (EV_A_ (W *)idles [i], idlecnt [i]); -#endif - } - -#if EV_FORK_ENABLE - assert (forkmax >= forkcnt); - array_verify (EV_A_ (W *)forks, forkcnt); -#endif - -#if EV_CLEANUP_ENABLE - assert (cleanupmax >= cleanupcnt); - array_verify (EV_A_ (W *)cleanups, cleanupcnt); -#endif - -#if EV_ASYNC_ENABLE - assert (asyncmax >= asynccnt); - array_verify (EV_A_ (W *)asyncs, asynccnt); -#endif - -#if EV_PREPARE_ENABLE - assert (preparemax >= preparecnt); - array_verify (EV_A_ (W *)prepares, preparecnt); -#endif - -#if EV_CHECK_ENABLE - assert (checkmax >= checkcnt); - array_verify (EV_A_ (W *)checks, checkcnt); -#endif - -# if 0 -#if EV_CHILD_ENABLE - for (w = (ev_child *)childs [chain & ((EV_PID_HASHSIZE) - 1)]; w; w = (ev_child *)((WL)w)->next) - for (signum = EV_NSIG; signum--; ) if (signals [signum].pending) -#endif -# endif -#endif -} -#endif - -#if EV_MULTIPLICITY -ecb_cold -struct ev_loop * -#else -int -#endif -ev_default_loop (unsigned int flags) EV_NOEXCEPT -{ - if (!ev_default_loop_ptr) - { -#if EV_MULTIPLICITY - EV_P = ev_default_loop_ptr = &default_loop_struct; -#else - ev_default_loop_ptr = 1; -#endif - - loop_init (EV_A_ flags); - - if (ev_backend (EV_A)) - { -#if EV_CHILD_ENABLE - ev_signal_init (&childev, childcb, SIGCHLD); - ev_set_priority (&childev, EV_MAXPRI); - ev_signal_start (EV_A_ &childev); - ev_unref (EV_A); /* child watcher should not keep loop alive */ -#endif - } - else - ev_default_loop_ptr = 0; - } - - return ev_default_loop_ptr; -} - -void -ev_loop_fork (EV_P) EV_NOEXCEPT -{ - postfork = 1; -} - -/*****************************************************************************/ - -void -ev_invoke (EV_P_ void *w, int revents) -{ - EV_CB_INVOKE ((W)w, revents); -} - -unsigned int -ev_pending_count (EV_P) EV_NOEXCEPT -{ - int pri; - unsigned int count = 0; - - for (pri = NUMPRI; pri--; ) - count += pendingcnt [pri]; - - return count; -} - -ecb_noinline -void -ev_invoke_pending (EV_P) -{ - pendingpri = NUMPRI; - - do - { - --pendingpri; - - /* pendingpri possibly gets modified in the inner loop */ - while (pendingcnt [pendingpri]) - { - ANPENDING *p = pendings [pendingpri] + --pendingcnt [pendingpri]; - - p->w->pending = 0; - EV_CB_INVOKE (p->w, p->events); - EV_FREQUENT_CHECK; - } - } - while (pendingpri); -} - -#if EV_IDLE_ENABLE -/* make idle watchers pending. this handles the "call-idle */ -/* only when higher priorities are idle" logic */ -inline_size void -idle_reify (EV_P) -{ - if (ecb_expect_false (idleall)) - { - int pri; - - for (pri = NUMPRI; pri--; ) - { - if (pendingcnt [pri]) - break; - - if (idlecnt [pri]) - { - queue_events (EV_A_ (W *)idles [pri], idlecnt [pri], EV_IDLE); - break; - } - } - } -} -#endif - -/* make timers pending */ -inline_size void -timers_reify (EV_P) -{ - EV_FREQUENT_CHECK; - - if (timercnt && ANHE_at (timers [HEAP0]) < mn_now) - { - do - { - ev_timer *w = (ev_timer *)ANHE_w (timers [HEAP0]); - - /*assert (("libev: inactive timer on timer heap detected", ev_is_active (w)));*/ - - /* first reschedule or stop timer */ - if (w->repeat) - { - ev_at (w) += w->repeat; - if (ev_at (w) < mn_now) - ev_at (w) = mn_now; - - assert (("libev: negative ev_timer repeat value found while processing timers", w->repeat > EV_TS_CONST (0.))); - - ANHE_at_cache (timers [HEAP0]); - downheap (timers, timercnt, HEAP0); - } - else - ev_timer_stop (EV_A_ w); /* nonrepeating: stop timer */ - - EV_FREQUENT_CHECK; - feed_reverse (EV_A_ (W)w); - } - while (timercnt && ANHE_at (timers [HEAP0]) < mn_now); - - feed_reverse_done (EV_A_ EV_TIMER); - } -} - -#if EV_PERIODIC_ENABLE - -ecb_noinline -static void -periodic_recalc (EV_P_ ev_periodic *w) -{ - ev_tstamp interval = w->interval > MIN_INTERVAL ? w->interval : MIN_INTERVAL; - ev_tstamp at = w->offset + interval * ev_floor ((ev_rt_now - w->offset) / interval); - - /* the above almost always errs on the low side */ - while (at <= ev_rt_now) - { - ev_tstamp nat = at + w->interval; - - /* when resolution fails us, we use ev_rt_now */ - if (ecb_expect_false (nat == at)) - { - at = ev_rt_now; - break; - } - - at = nat; - } - - ev_at (w) = at; -} - -/* make periodics pending */ -inline_size void -periodics_reify (EV_P) -{ - EV_FREQUENT_CHECK; - - while (periodiccnt && ANHE_at (periodics [HEAP0]) < ev_rt_now) - { - do - { - ev_periodic *w = (ev_periodic *)ANHE_w (periodics [HEAP0]); - - /*assert (("libev: inactive timer on periodic heap detected", ev_is_active (w)));*/ - - /* first reschedule or stop timer */ - if (w->reschedule_cb) - { - ev_at (w) = w->reschedule_cb (w, ev_rt_now); - - assert (("libev: ev_periodic reschedule callback returned time in the past", ev_at (w) >= ev_rt_now)); - - ANHE_at_cache (periodics [HEAP0]); - downheap (periodics, periodiccnt, HEAP0); - } - else if (w->interval) - { - periodic_recalc (EV_A_ w); - ANHE_at_cache (periodics [HEAP0]); - downheap (periodics, periodiccnt, HEAP0); - } - else - ev_periodic_stop (EV_A_ w); /* nonrepeating: stop timer */ - - EV_FREQUENT_CHECK; - feed_reverse (EV_A_ (W)w); - } - while (periodiccnt && ANHE_at (periodics [HEAP0]) < ev_rt_now); - - feed_reverse_done (EV_A_ EV_PERIODIC); - } -} - -/* simply recalculate all periodics */ -/* TODO: maybe ensure that at least one event happens when jumping forward? */ -ecb_noinline ecb_cold -static void -periodics_reschedule (EV_P) -{ - int i; - - /* adjust periodics after time jump */ - for (i = HEAP0; i < periodiccnt + HEAP0; ++i) - { - ev_periodic *w = (ev_periodic *)ANHE_w (periodics [i]); - - if (w->reschedule_cb) - ev_at (w) = w->reschedule_cb (w, ev_rt_now); - else if (w->interval) - periodic_recalc (EV_A_ w); - - ANHE_at_cache (periodics [i]); - } - - reheap (periodics, periodiccnt); -} -#endif - -/* adjust all timers by a given offset */ -ecb_noinline ecb_cold -static void -timers_reschedule (EV_P_ ev_tstamp adjust) -{ - int i; - - for (i = 0; i < timercnt; ++i) - { - ANHE *he = timers + i + HEAP0; - ANHE_w (*he)->at += adjust; - ANHE_at_cache (*he); - } -} - -/* fetch new monotonic and realtime times from the kernel */ -/* also detect if there was a timejump, and act accordingly */ -inline_speed void -time_update (EV_P_ ev_tstamp max_block) -{ -#if EV_USE_MONOTONIC - if (ecb_expect_true (have_monotonic)) - { - int i; - ev_tstamp odiff = rtmn_diff; - - mn_now = get_clock (); - - /* only fetch the realtime clock every 0.5*MIN_TIMEJUMP seconds */ - /* interpolate in the meantime */ - if (ecb_expect_true (mn_now - now_floor < EV_TS_CONST (MIN_TIMEJUMP * .5))) - { - ev_rt_now = rtmn_diff + mn_now; - return; - } - - now_floor = mn_now; - ev_rt_now = ev_time (); - - /* loop a few times, before making important decisions. - * on the choice of "4": one iteration isn't enough, - * in case we get preempted during the calls to - * ev_time and get_clock. a second call is almost guaranteed - * to succeed in that case, though. and looping a few more times - * doesn't hurt either as we only do this on time-jumps or - * in the unlikely event of having been preempted here. - */ - for (i = 4; --i; ) - { - ev_tstamp diff; - rtmn_diff = ev_rt_now - mn_now; - - diff = odiff - rtmn_diff; - - if (ecb_expect_true ((diff < EV_TS_CONST (0.) ? -diff : diff) < EV_TS_CONST (MIN_TIMEJUMP))) - return; /* all is well */ - - ev_rt_now = ev_time (); - mn_now = get_clock (); - now_floor = mn_now; - } - - /* no timer adjustment, as the monotonic clock doesn't jump */ - /* timers_reschedule (EV_A_ rtmn_diff - odiff) */ -# if EV_PERIODIC_ENABLE - periodics_reschedule (EV_A); -# endif - } - else -#endif - { - ev_rt_now = ev_time (); - - if (ecb_expect_false (mn_now > ev_rt_now || ev_rt_now > mn_now + max_block + EV_TS_CONST (MIN_TIMEJUMP))) - { - /* adjust timers. this is easy, as the offset is the same for all of them */ - timers_reschedule (EV_A_ ev_rt_now - mn_now); -#if EV_PERIODIC_ENABLE - periodics_reschedule (EV_A); -#endif - } - - mn_now = ev_rt_now; - } -} - -/* ########## NIO4R PATCHERY HO! ########## */ -struct ev_poll_args { - struct ev_loop *loop; - ev_tstamp waittime; -}; - -static -void * ev_backend_poll(void *ptr) -{ - struct ev_poll_args *args = (struct ev_poll_args *)ptr; - struct ev_loop *loop = args->loop; - backend_poll (EV_A_ args->waittime); - - return NULL; -} -/* ######################################## */ - -int -ev_run (EV_P_ int flags) -{ -/* ########## NIO4R PATCHERY HO! ########## */ - struct ev_poll_args poll_args; -/* ######################################## */ - -#if EV_FEATURE_API - ++loop_depth; -#endif - - assert (("libev: ev_loop recursion during release detected", loop_done != EVBREAK_RECURSE)); - - loop_done = EVBREAK_CANCEL; - - EV_INVOKE_PENDING; /* in case we recurse, ensure ordering stays nice and clean */ - - do - { -#if EV_VERIFY >= 2 - ev_verify (EV_A); -#endif - -#ifndef _WIN32 - if (ecb_expect_false (curpid)) /* penalise the forking check even more */ - if (ecb_expect_false (getpid () != curpid)) - { - curpid = getpid (); - postfork = 1; - } -#endif - -#if EV_FORK_ENABLE - /* we might have forked, so queue fork handlers */ - if (ecb_expect_false (postfork)) - if (forkcnt) - { - queue_events (EV_A_ (W *)forks, forkcnt, EV_FORK); - EV_INVOKE_PENDING; - } -#endif - -#if EV_PREPARE_ENABLE - /* queue prepare watchers (and execute them) */ - if (ecb_expect_false (preparecnt)) - { - queue_events (EV_A_ (W *)prepares, preparecnt, EV_PREPARE); - EV_INVOKE_PENDING; - } -#endif - - if (ecb_expect_false (loop_done)) - break; - - /* we might have forked, so reify kernel state if necessary */ - if (ecb_expect_false (postfork)) - loop_fork (EV_A); - - /* update fd-related kernel structures */ - fd_reify (EV_A); - - /* calculate blocking time */ - { - ev_tstamp waittime = 0.; - ev_tstamp sleeptime = 0.; - - /* remember old timestamp for io_blocktime calculation */ - ev_tstamp prev_mn_now = mn_now; - - /* update time to cancel out callback processing overhead */ - time_update (EV_A_ EV_TS_CONST (EV_TSTAMP_HUGE)); - - /* from now on, we want a pipe-wake-up */ - pipe_write_wanted = 1; - - ECB_MEMORY_FENCE; /* make sure pipe_write_wanted is visible before we check for potential skips */ - - if (ecb_expect_true (!(flags & EVRUN_NOWAIT || idleall || !activecnt || pipe_write_skipped))) - { - waittime = EV_TS_CONST (MAX_BLOCKTIME); - -#if EV_USE_TIMERFD - /* sleep a lot longer when we can reliably detect timejumps */ - if (ecb_expect_true (timerfd >= 0)) - waittime = EV_TS_CONST (MAX_BLOCKTIME2); -#endif -#if !EV_PERIODIC_ENABLE - /* without periodics but with monotonic clock there is no need */ - /* for any time jump detection, so sleep longer */ - if (ecb_expect_true (have_monotonic)) - waittime = EV_TS_CONST (MAX_BLOCKTIME2); -#endif - - if (timercnt) - { - ev_tstamp to = ANHE_at (timers [HEAP0]) - mn_now; - if (waittime > to) waittime = to; - } - -#if EV_PERIODIC_ENABLE - if (periodiccnt) - { - ev_tstamp to = ANHE_at (periodics [HEAP0]) - ev_rt_now; - if (waittime > to) waittime = to; - } -#endif - - /* don't let timeouts decrease the waittime below timeout_blocktime */ - if (ecb_expect_false (waittime < timeout_blocktime)) - waittime = timeout_blocktime; - - /* now there are two more special cases left, either we have - * already-expired timers, so we should not sleep, or we have timers - * that expire very soon, in which case we need to wait for a minimum - * amount of time for some event loop backends. - */ - if (ecb_expect_false (waittime < backend_mintime)) - waittime = waittime <= EV_TS_CONST (0.) - ? EV_TS_CONST (0.) - : backend_mintime; - - /* extra check because io_blocktime is commonly 0 */ - if (ecb_expect_false (io_blocktime)) - { - sleeptime = io_blocktime - (mn_now - prev_mn_now); - - if (sleeptime > waittime - backend_mintime) - sleeptime = waittime - backend_mintime; - - if (ecb_expect_true (sleeptime > EV_TS_CONST (0.))) - { - ev_sleep (sleeptime); - waittime -= sleeptime; - } - } - } - -#if EV_FEATURE_API - ++loop_count; -#endif - assert ((loop_done = EVBREAK_RECURSE, 1)); /* assert for side effect */ - -/* -########################## NIO4R PATCHERY HO! ########################## - -According to the grandwizards of Ruby, locking and unlocking of the global -interpreter lock are apparently too powerful a concept for a mere mortal to -wield (although redefining what + and - do to numbers is totally cool). -And so it came to pass that the only acceptable way to release the global -interpreter lock is through a convoluted callback system that thakes a -function pointer. While the grandwizard of libev foresaw this sort of scenario, -he too attempted to place an API with callbacks on it, one that runs before -the system call, and one that runs immediately after. - -And so it came to pass that trying to wrap everything up in callbacks created -two incompatible APIs, Ruby's which releases the global interpreter lock and -reacquires it when the callback returns, and libev's, which wants two -callbacks, one which runs before the polling operation starts, and one which -runs after it finishes. - -These two systems are incompatible as they both want to use callbacks to -solve the same problem, however libev wants to use before/after callbacks, -and Ruby wants to use an "around" callback. This presents a significant -problem as these two patterns of callbacks are diametrical opposites of each -other and thus cannot be composed. - -And thus we are left with no choice but to patch the internals of libev in -order to release a mutex at just the precise moment. - -This is a great example of a situation where granular locking and unlocking -of the GVL is practically required. The goal is to get as close to the -system call as possible, and to keep the GVL unlocked for the shortest -amount of time possible. - -Perhaps Ruby could benefit from such an API, e.g: - -rb_thread_unsafe_dangerous_crazy_blocking_region_begin(...); -rb_thread_unsafe_dangerous_crazy_blocking_region_end(...); - -####################################################################### -*/ - - poll_args.loop = loop; - poll_args.waittime = waittime; - rb_thread_call_without_gvl(ev_backend_poll, (void *)&poll_args, RUBY_UBF_IO, 0); -/* -############################# END PATCHERY ############################ -*/ - - assert ((loop_done = EVBREAK_CANCEL, 1)); /* assert for side effect */ - - pipe_write_wanted = 0; /* just an optimisation, no fence needed */ - - ECB_MEMORY_FENCE_ACQUIRE; - if (pipe_write_skipped) - { - assert (("libev: pipe_w not active, but pipe not written", ev_is_active (&pipe_w))); - ev_feed_event (EV_A_ &pipe_w, EV_CUSTOM); - } - - /* update ev_rt_now, do magic */ - time_update (EV_A_ waittime + sleeptime); - } - - /* queue pending timers and reschedule them */ - timers_reify (EV_A); /* relative timers called last */ -#if EV_PERIODIC_ENABLE - periodics_reify (EV_A); /* absolute timers called first */ -#endif - -#if EV_IDLE_ENABLE - /* queue idle watchers unless other events are pending */ - idle_reify (EV_A); -#endif - -#if EV_CHECK_ENABLE - /* queue check watchers, to be executed first */ - if (ecb_expect_false (checkcnt)) - queue_events (EV_A_ (W *)checks, checkcnt, EV_CHECK); -#endif - - EV_INVOKE_PENDING; - } - while (ecb_expect_true ( - activecnt - && !loop_done - && !(flags & (EVRUN_ONCE | EVRUN_NOWAIT)) - )); - - if (loop_done == EVBREAK_ONE) - loop_done = EVBREAK_CANCEL; - -#if EV_FEATURE_API - --loop_depth; -#endif - - return activecnt; -} - -void -ev_break (EV_P_ int how) EV_NOEXCEPT -{ - loop_done = how; -} - -void -ev_ref (EV_P) EV_NOEXCEPT -{ - ++activecnt; -} - -void -ev_unref (EV_P) EV_NOEXCEPT -{ - --activecnt; -} - -void -ev_now_update (EV_P) EV_NOEXCEPT -{ - time_update (EV_A_ EV_TSTAMP_HUGE); -} - -void -ev_suspend (EV_P) EV_NOEXCEPT -{ - ev_now_update (EV_A); -} - -void -ev_resume (EV_P) EV_NOEXCEPT -{ - ev_tstamp mn_prev = mn_now; - - ev_now_update (EV_A); - timers_reschedule (EV_A_ mn_now - mn_prev); -#if EV_PERIODIC_ENABLE - /* TODO: really do this? */ - periodics_reschedule (EV_A); -#endif -} - -/*****************************************************************************/ -/* singly-linked list management, used when the expected list length is short */ - -inline_size void -wlist_add (WL *head, WL elem) -{ - elem->next = *head; - *head = elem; -} - -inline_size void -wlist_del (WL *head, WL elem) -{ - while (*head) - { - if (ecb_expect_true (*head == elem)) - { - *head = elem->next; - break; - } - - head = &(*head)->next; - } -} - -/* internal, faster, version of ev_clear_pending */ -inline_speed void -clear_pending (EV_P_ W w) -{ - if (w->pending) - { - pendings [ABSPRI (w)][w->pending - 1].w = (W)&pending_w; - w->pending = 0; - } -} - -int -ev_clear_pending (EV_P_ void *w) EV_NOEXCEPT -{ - W w_ = (W)w; - int pending = w_->pending; - - if (ecb_expect_true (pending)) - { - ANPENDING *p = pendings [ABSPRI (w_)] + pending - 1; - p->w = (W)&pending_w; - w_->pending = 0; - return p->events; - } - else - return 0; -} - -inline_size void -pri_adjust (EV_P_ W w) -{ - int pri = ev_priority (w); - pri = pri < EV_MINPRI ? EV_MINPRI : pri; - pri = pri > EV_MAXPRI ? EV_MAXPRI : pri; - ev_set_priority (w, pri); -} - -inline_speed void -ev_start (EV_P_ W w, int active) -{ - pri_adjust (EV_A_ w); - w->active = active; - ev_ref (EV_A); -} - -inline_size void -ev_stop (EV_P_ W w) -{ - ev_unref (EV_A); - w->active = 0; -} - -/*****************************************************************************/ - -ecb_noinline -void -ev_io_start (EV_P_ ev_io *w) EV_NOEXCEPT -{ - int fd = w->fd; - - if (ecb_expect_false (ev_is_active (w))) - return; - - assert (("libev: ev_io_start called with negative fd", fd >= 0)); - assert (("libev: ev_io_start called with illegal event mask", !(w->events & ~(EV__IOFDSET | EV_READ | EV_WRITE)))); - -#if EV_VERIFY >= 2 - assert (("libev: ev_io_start called on watcher with invalid fd", fd_valid (fd))); -#endif - EV_FREQUENT_CHECK; - - ev_start (EV_A_ (W)w, 1); - array_needsize (ANFD, anfds, anfdmax, fd + 1, array_needsize_zerofill); - wlist_add (&anfds[fd].head, (WL)w); - - /* common bug, apparently */ - assert (("libev: ev_io_start called with corrupted watcher", ((WL)w)->next != (WL)w)); - - fd_change (EV_A_ fd, w->events & EV__IOFDSET | EV_ANFD_REIFY); - w->events &= ~EV__IOFDSET; - - EV_FREQUENT_CHECK; -} - -ecb_noinline -void -ev_io_stop (EV_P_ ev_io *w) EV_NOEXCEPT -{ - clear_pending (EV_A_ (W)w); - if (ecb_expect_false (!ev_is_active (w))) - return; - - assert (("libev: ev_io_stop called with illegal fd (must stay constant after start!)", w->fd >= 0 && w->fd < anfdmax)); - -#if EV_VERIFY >= 2 - assert (("libev: ev_io_stop called on watcher with invalid fd", fd_valid (w->fd))); -#endif - EV_FREQUENT_CHECK; - - wlist_del (&anfds[w->fd].head, (WL)w); - ev_stop (EV_A_ (W)w); - - fd_change (EV_A_ w->fd, EV_ANFD_REIFY); - - EV_FREQUENT_CHECK; -} - -ecb_noinline -void -ev_timer_start (EV_P_ ev_timer *w) EV_NOEXCEPT -{ - if (ecb_expect_false (ev_is_active (w))) - return; - - ev_at (w) += mn_now; - - assert (("libev: ev_timer_start called with negative timer repeat value", w->repeat >= 0.)); - - EV_FREQUENT_CHECK; - - ++timercnt; - ev_start (EV_A_ (W)w, timercnt + HEAP0 - 1); - array_needsize (ANHE, timers, timermax, ev_active (w) + 1, array_needsize_noinit); - ANHE_w (timers [ev_active (w)]) = (WT)w; - ANHE_at_cache (timers [ev_active (w)]); - upheap (timers, ev_active (w)); - - EV_FREQUENT_CHECK; - - /*assert (("libev: internal timer heap corruption", timers [ev_active (w)] == (WT)w));*/ -} - -ecb_noinline -void -ev_timer_stop (EV_P_ ev_timer *w) EV_NOEXCEPT -{ - clear_pending (EV_A_ (W)w); - if (ecb_expect_false (!ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - - { - int active = ev_active (w); - - assert (("libev: internal timer heap corruption", ANHE_w (timers [active]) == (WT)w)); - - --timercnt; - - if (ecb_expect_true (active < timercnt + HEAP0)) - { - timers [active] = timers [timercnt + HEAP0]; - adjustheap (timers, timercnt, active); - } - } - - ev_at (w) -= mn_now; - - ev_stop (EV_A_ (W)w); - - EV_FREQUENT_CHECK; -} - -ecb_noinline -void -ev_timer_again (EV_P_ ev_timer *w) EV_NOEXCEPT -{ - EV_FREQUENT_CHECK; - - clear_pending (EV_A_ (W)w); - - if (ev_is_active (w)) - { - if (w->repeat) - { - ev_at (w) = mn_now + w->repeat; - ANHE_at_cache (timers [ev_active (w)]); - adjustheap (timers, timercnt, ev_active (w)); - } - else - ev_timer_stop (EV_A_ w); - } - else if (w->repeat) - { - ev_at (w) = w->repeat; - ev_timer_start (EV_A_ w); - } - - EV_FREQUENT_CHECK; -} - -ev_tstamp -ev_timer_remaining (EV_P_ ev_timer *w) EV_NOEXCEPT -{ - return ev_at (w) - (ev_is_active (w) ? mn_now : EV_TS_CONST (0.)); -} - -#if EV_PERIODIC_ENABLE -ecb_noinline -void -ev_periodic_start (EV_P_ ev_periodic *w) EV_NOEXCEPT -{ - if (ecb_expect_false (ev_is_active (w))) - return; - -#if EV_USE_TIMERFD - if (timerfd == -2) - evtimerfd_init (EV_A); -#endif - - if (w->reschedule_cb) - ev_at (w) = w->reschedule_cb (w, ev_rt_now); - else if (w->interval) - { - assert (("libev: ev_periodic_start called with negative interval value", w->interval >= 0.)); - periodic_recalc (EV_A_ w); - } - else - ev_at (w) = w->offset; - - EV_FREQUENT_CHECK; - - ++periodiccnt; - ev_start (EV_A_ (W)w, periodiccnt + HEAP0 - 1); - array_needsize (ANHE, periodics, periodicmax, ev_active (w) + 1, array_needsize_noinit); - ANHE_w (periodics [ev_active (w)]) = (WT)w; - ANHE_at_cache (periodics [ev_active (w)]); - upheap (periodics, ev_active (w)); - - EV_FREQUENT_CHECK; - - /*assert (("libev: internal periodic heap corruption", ANHE_w (periodics [ev_active (w)]) == (WT)w));*/ -} - -ecb_noinline -void -ev_periodic_stop (EV_P_ ev_periodic *w) EV_NOEXCEPT -{ - clear_pending (EV_A_ (W)w); - if (ecb_expect_false (!ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - - { - int active = ev_active (w); - - assert (("libev: internal periodic heap corruption", ANHE_w (periodics [active]) == (WT)w)); - - --periodiccnt; - - if (ecb_expect_true (active < periodiccnt + HEAP0)) - { - periodics [active] = periodics [periodiccnt + HEAP0]; - adjustheap (periodics, periodiccnt, active); - } - } - - ev_stop (EV_A_ (W)w); - - EV_FREQUENT_CHECK; -} - -ecb_noinline -void -ev_periodic_again (EV_P_ ev_periodic *w) EV_NOEXCEPT -{ - /* TODO: use adjustheap and recalculation */ - ev_periodic_stop (EV_A_ w); - ev_periodic_start (EV_A_ w); -} -#endif - -#ifndef SA_RESTART -# define SA_RESTART 0 -#endif - -#if EV_SIGNAL_ENABLE - -ecb_noinline -void -ev_signal_start (EV_P_ ev_signal *w) EV_NOEXCEPT -{ - if (ecb_expect_false (ev_is_active (w))) - return; - - assert (("libev: ev_signal_start called with illegal signal number", w->signum > 0 && w->signum < EV_NSIG)); - -#if EV_MULTIPLICITY - assert (("libev: a signal must not be attached to two different loops", - !signals [w->signum - 1].loop || signals [w->signum - 1].loop == loop)); - - signals [w->signum - 1].loop = EV_A; - ECB_MEMORY_FENCE_RELEASE; -#endif - - EV_FREQUENT_CHECK; - -#if EV_USE_SIGNALFD - if (sigfd == -2) - { - sigfd = signalfd (-1, &sigfd_set, SFD_NONBLOCK | SFD_CLOEXEC); - if (sigfd < 0 && errno == EINVAL) - sigfd = signalfd (-1, &sigfd_set, 0); /* retry without flags */ - - if (sigfd >= 0) - { - fd_intern (sigfd); /* doing it twice will not hurt */ - - sigemptyset (&sigfd_set); - - ev_io_init (&sigfd_w, sigfdcb, sigfd, EV_READ); - ev_set_priority (&sigfd_w, EV_MAXPRI); - ev_io_start (EV_A_ &sigfd_w); - ev_unref (EV_A); /* signalfd watcher should not keep loop alive */ - } - } - - if (sigfd >= 0) - { - /* TODO: check .head */ - sigaddset (&sigfd_set, w->signum); - sigprocmask (SIG_BLOCK, &sigfd_set, 0); - - signalfd (sigfd, &sigfd_set, 0); - } -#endif - - ev_start (EV_A_ (W)w, 1); - wlist_add (&signals [w->signum - 1].head, (WL)w); - - if (!((WL)w)->next) -# if EV_USE_SIGNALFD - if (sigfd < 0) /*TODO*/ -# endif - { -# ifdef _WIN32 - evpipe_init (EV_A); - - signal (w->signum, ev_sighandler); -# else - struct sigaction sa; - - evpipe_init (EV_A); - - sa.sa_handler = ev_sighandler; - sigfillset (&sa.sa_mask); - sa.sa_flags = SA_RESTART; /* if restarting works we save one iteration */ - sigaction (w->signum, &sa, 0); - - if (origflags & EVFLAG_NOSIGMASK) - { - sigemptyset (&sa.sa_mask); - sigaddset (&sa.sa_mask, w->signum); - sigprocmask (SIG_UNBLOCK, &sa.sa_mask, 0); - } -#endif - } - - EV_FREQUENT_CHECK; -} - -ecb_noinline -void -ev_signal_stop (EV_P_ ev_signal *w) EV_NOEXCEPT -{ - clear_pending (EV_A_ (W)w); - if (ecb_expect_false (!ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - - wlist_del (&signals [w->signum - 1].head, (WL)w); - ev_stop (EV_A_ (W)w); - - if (!signals [w->signum - 1].head) - { -#if EV_MULTIPLICITY - signals [w->signum - 1].loop = 0; /* unattach from signal */ -#endif -#if EV_USE_SIGNALFD - if (sigfd >= 0) - { - sigset_t ss; - - sigemptyset (&ss); - sigaddset (&ss, w->signum); - sigdelset (&sigfd_set, w->signum); - - signalfd (sigfd, &sigfd_set, 0); - sigprocmask (SIG_UNBLOCK, &ss, 0); - } - else -#endif - signal (w->signum, SIG_DFL); - } - - EV_FREQUENT_CHECK; -} - -#endif - -#if EV_CHILD_ENABLE - -void -ev_child_start (EV_P_ ev_child *w) EV_NOEXCEPT -{ -#if EV_MULTIPLICITY - assert (("libev: child watchers are only supported in the default loop", loop == ev_default_loop_ptr)); -#endif - if (ecb_expect_false (ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - - ev_start (EV_A_ (W)w, 1); - wlist_add (&childs [w->pid & ((EV_PID_HASHSIZE) - 1)], (WL)w); - - EV_FREQUENT_CHECK; -} - -void -ev_child_stop (EV_P_ ev_child *w) EV_NOEXCEPT -{ - clear_pending (EV_A_ (W)w); - if (ecb_expect_false (!ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - - wlist_del (&childs [w->pid & ((EV_PID_HASHSIZE) - 1)], (WL)w); - ev_stop (EV_A_ (W)w); - - EV_FREQUENT_CHECK; -} - -#endif - -#if EV_STAT_ENABLE - -# ifdef _WIN32 -# undef lstat -# define lstat(a,b) _stati64 (a,b) -# endif - -#define DEF_STAT_INTERVAL 5.0074891 -#define NFS_STAT_INTERVAL 30.1074891 /* for filesystems potentially failing inotify */ -#define MIN_STAT_INTERVAL 0.1074891 - -ecb_noinline static void stat_timer_cb (EV_P_ ev_timer *w_, int revents); - -#if EV_USE_INOTIFY - -/* the * 2 is to allow for alignment padding, which for some reason is >> 8 */ -# define EV_INOTIFY_BUFSIZE (sizeof (struct inotify_event) * 2 + NAME_MAX) - -ecb_noinline -static void -infy_add (EV_P_ ev_stat *w) -{ - w->wd = inotify_add_watch (fs_fd, w->path, - IN_ATTRIB | IN_DELETE_SELF | IN_MOVE_SELF | IN_MODIFY - | IN_CREATE | IN_DELETE | IN_MOVED_FROM | IN_MOVED_TO - | IN_DONT_FOLLOW | IN_MASK_ADD); - - if (w->wd >= 0) - { - struct statfs sfs; - - /* now local changes will be tracked by inotify, but remote changes won't */ - /* unless the filesystem is known to be local, we therefore still poll */ - /* also do poll on <2.6.25, but with normal frequency */ - - if (!fs_2625) - w->timer.repeat = w->interval ? w->interval : DEF_STAT_INTERVAL; - else if (!statfs (w->path, &sfs) - && (sfs.f_type == 0x1373 /* devfs */ - || sfs.f_type == 0x4006 /* fat */ - || sfs.f_type == 0x4d44 /* msdos */ - || sfs.f_type == 0xEF53 /* ext2/3 */ - || sfs.f_type == 0x72b6 /* jffs2 */ - || sfs.f_type == 0x858458f6 /* ramfs */ - || sfs.f_type == 0x5346544e /* ntfs */ - || sfs.f_type == 0x3153464a /* jfs */ - || sfs.f_type == 0x9123683e /* btrfs */ - || sfs.f_type == 0x52654973 /* reiser3 */ - || sfs.f_type == 0x01021994 /* tmpfs */ - || sfs.f_type == 0x58465342 /* xfs */)) - w->timer.repeat = 0.; /* filesystem is local, kernel new enough */ - else - w->timer.repeat = w->interval ? w->interval : NFS_STAT_INTERVAL; /* remote, use reduced frequency */ - } - else - { - /* can't use inotify, continue to stat */ - w->timer.repeat = w->interval ? w->interval : DEF_STAT_INTERVAL; - - /* if path is not there, monitor some parent directory for speedup hints */ - /* note that exceeding the hardcoded path limit is not a correctness issue, */ - /* but an efficiency issue only */ - if ((errno == ENOENT || errno == EACCES) && strlen (w->path) < 4096) - { - char path [4096]; - strcpy (path, w->path); - - do - { - int mask = IN_MASK_ADD | IN_DELETE_SELF | IN_MOVE_SELF - | (errno == EACCES ? IN_ATTRIB : IN_CREATE | IN_MOVED_TO); - - char *pend = strrchr (path, '/'); - - if (!pend || pend == path) - break; - - *pend = 0; - w->wd = inotify_add_watch (fs_fd, path, mask); - } - while (w->wd < 0 && (errno == ENOENT || errno == EACCES)); - } - } - - if (w->wd >= 0) - wlist_add (&fs_hash [w->wd & ((EV_INOTIFY_HASHSIZE) - 1)].head, (WL)w); - - /* now re-arm timer, if required */ - if (ev_is_active (&w->timer)) ev_ref (EV_A); - ev_timer_again (EV_A_ &w->timer); - if (ev_is_active (&w->timer)) ev_unref (EV_A); -} - -ecb_noinline -static void -infy_del (EV_P_ ev_stat *w) -{ - int slot; - int wd = w->wd; - - if (wd < 0) - return; - - w->wd = -2; - slot = wd & ((EV_INOTIFY_HASHSIZE) - 1); - wlist_del (&fs_hash [slot].head, (WL)w); - - /* remove this watcher, if others are watching it, they will rearm */ - inotify_rm_watch (fs_fd, wd); -} - -ecb_noinline -static void -infy_wd (EV_P_ int slot, int wd, struct inotify_event *ev) -{ - if (slot < 0) - /* overflow, need to check for all hash slots */ - for (slot = 0; slot < (EV_INOTIFY_HASHSIZE); ++slot) - infy_wd (EV_A_ slot, wd, ev); - else - { - WL w_; - - for (w_ = fs_hash [slot & ((EV_INOTIFY_HASHSIZE) - 1)].head; w_; ) - { - ev_stat *w = (ev_stat *)w_; - w_ = w_->next; /* lets us remove this watcher and all before it */ - - if (w->wd == wd || wd == -1) - { - if (ev->mask & (IN_IGNORED | IN_UNMOUNT | IN_DELETE_SELF)) - { - wlist_del (&fs_hash [slot & ((EV_INOTIFY_HASHSIZE) - 1)].head, (WL)w); - w->wd = -1; - infy_add (EV_A_ w); /* re-add, no matter what */ - } - - stat_timer_cb (EV_A_ &w->timer, 0); - } - } - } -} - -static void -infy_cb (EV_P_ ev_io *w, int revents) -{ - char buf [EV_INOTIFY_BUFSIZE]; - int ofs; - int len = read (fs_fd, buf, sizeof (buf)); - - for (ofs = 0; ofs < len; ) - { - struct inotify_event *ev = (struct inotify_event *)(buf + ofs); - infy_wd (EV_A_ ev->wd, ev->wd, ev); - ofs += sizeof (struct inotify_event) + ev->len; - } -} - -inline_size ecb_cold -void -ev_check_2625 (EV_P) -{ - /* kernels < 2.6.25 are borked - * http://www.ussg.indiana.edu/hypermail/linux/kernel/0711.3/1208.html - */ - if (ev_linux_version () < 0x020619) - return; - - fs_2625 = 1; -} - -inline_size int -infy_newfd (void) -{ -#if defined IN_CLOEXEC && defined IN_NONBLOCK - int fd = inotify_init1 (IN_CLOEXEC | IN_NONBLOCK); - if (fd >= 0) - return fd; -#endif - return inotify_init (); -} - -inline_size void -infy_init (EV_P) -{ - if (fs_fd != -2) - return; - - fs_fd = -1; - - ev_check_2625 (EV_A); - - fs_fd = infy_newfd (); - - if (fs_fd >= 0) - { - fd_intern (fs_fd); - ev_io_init (&fs_w, infy_cb, fs_fd, EV_READ); - ev_set_priority (&fs_w, EV_MAXPRI); - ev_io_start (EV_A_ &fs_w); - ev_unref (EV_A); - } -} - -inline_size void -infy_fork (EV_P) -{ - int slot; - - if (fs_fd < 0) - return; - - ev_ref (EV_A); - ev_io_stop (EV_A_ &fs_w); - close (fs_fd); - fs_fd = infy_newfd (); - - if (fs_fd >= 0) - { - fd_intern (fs_fd); - ev_io_set (&fs_w, fs_fd, EV_READ); - ev_io_start (EV_A_ &fs_w); - ev_unref (EV_A); - } - - for (slot = 0; slot < (EV_INOTIFY_HASHSIZE); ++slot) - { - WL w_ = fs_hash [slot].head; - fs_hash [slot].head = 0; - - while (w_) - { - ev_stat *w = (ev_stat *)w_; - w_ = w_->next; /* lets us add this watcher */ - - w->wd = -1; - - if (fs_fd >= 0) - infy_add (EV_A_ w); /* re-add, no matter what */ - else - { - w->timer.repeat = w->interval ? w->interval : DEF_STAT_INTERVAL; - if (ev_is_active (&w->timer)) ev_ref (EV_A); - ev_timer_again (EV_A_ &w->timer); - if (ev_is_active (&w->timer)) ev_unref (EV_A); - } - } - } -} - -#endif - -#ifdef _WIN32 -# define EV_LSTAT(p,b) _stati64 (p, b) -#else -# define EV_LSTAT(p,b) lstat (p, b) -#endif - -void -ev_stat_stat (EV_P_ ev_stat *w) EV_NOEXCEPT -{ - if (lstat (w->path, &w->attr) < 0) - w->attr.st_nlink = 0; - else if (!w->attr.st_nlink) - w->attr.st_nlink = 1; -} - -ecb_noinline -static void -stat_timer_cb (EV_P_ ev_timer *w_, int revents) -{ - ev_stat *w = (ev_stat *)(((char *)w_) - offsetof (ev_stat, timer)); - - ev_statdata prev = w->attr; - ev_stat_stat (EV_A_ w); - - /* memcmp doesn't work on netbsd, they.... do stuff to their struct stat */ - if ( - prev.st_dev != w->attr.st_dev - || prev.st_ino != w->attr.st_ino - || prev.st_mode != w->attr.st_mode - || prev.st_nlink != w->attr.st_nlink - || prev.st_uid != w->attr.st_uid - || prev.st_gid != w->attr.st_gid - || prev.st_rdev != w->attr.st_rdev - || prev.st_size != w->attr.st_size - || prev.st_atime != w->attr.st_atime - || prev.st_mtime != w->attr.st_mtime - || prev.st_ctime != w->attr.st_ctime - ) { - /* we only update w->prev on actual differences */ - /* in case we test more often than invoke the callback, */ - /* to ensure that prev is always different to attr */ - w->prev = prev; - - #if EV_USE_INOTIFY - if (fs_fd >= 0) - { - infy_del (EV_A_ w); - infy_add (EV_A_ w); - ev_stat_stat (EV_A_ w); /* avoid race... */ - } - #endif - - ev_feed_event (EV_A_ w, EV_STAT); - } -} - -void -ev_stat_start (EV_P_ ev_stat *w) EV_NOEXCEPT -{ - if (ecb_expect_false (ev_is_active (w))) - return; - - ev_stat_stat (EV_A_ w); - - if (w->interval < MIN_STAT_INTERVAL && w->interval) - w->interval = MIN_STAT_INTERVAL; - - ev_timer_init (&w->timer, stat_timer_cb, 0., w->interval ? w->interval : DEF_STAT_INTERVAL); - ev_set_priority (&w->timer, ev_priority (w)); - -#if EV_USE_INOTIFY - infy_init (EV_A); - - if (fs_fd >= 0) - infy_add (EV_A_ w); - else -#endif - { - ev_timer_again (EV_A_ &w->timer); - ev_unref (EV_A); - } - - ev_start (EV_A_ (W)w, 1); - - EV_FREQUENT_CHECK; -} - -void -ev_stat_stop (EV_P_ ev_stat *w) EV_NOEXCEPT -{ - clear_pending (EV_A_ (W)w); - if (ecb_expect_false (!ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - -#if EV_USE_INOTIFY - infy_del (EV_A_ w); -#endif - - if (ev_is_active (&w->timer)) - { - ev_ref (EV_A); - ev_timer_stop (EV_A_ &w->timer); - } - - ev_stop (EV_A_ (W)w); - - EV_FREQUENT_CHECK; -} -#endif - -#if EV_IDLE_ENABLE -void -ev_idle_start (EV_P_ ev_idle *w) EV_NOEXCEPT -{ - if (ecb_expect_false (ev_is_active (w))) - return; - - pri_adjust (EV_A_ (W)w); - - EV_FREQUENT_CHECK; - - { - int active = ++idlecnt [ABSPRI (w)]; - - ++idleall; - ev_start (EV_A_ (W)w, active); - - array_needsize (ev_idle *, idles [ABSPRI (w)], idlemax [ABSPRI (w)], active, array_needsize_noinit); - idles [ABSPRI (w)][active - 1] = w; - } - - EV_FREQUENT_CHECK; -} - -void -ev_idle_stop (EV_P_ ev_idle *w) EV_NOEXCEPT -{ - clear_pending (EV_A_ (W)w); - if (ecb_expect_false (!ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - - { - int active = ev_active (w); - - idles [ABSPRI (w)][active - 1] = idles [ABSPRI (w)][--idlecnt [ABSPRI (w)]]; - ev_active (idles [ABSPRI (w)][active - 1]) = active; - - ev_stop (EV_A_ (W)w); - --idleall; - } - - EV_FREQUENT_CHECK; -} -#endif - -#if EV_PREPARE_ENABLE -void -ev_prepare_start (EV_P_ ev_prepare *w) EV_NOEXCEPT -{ - if (ecb_expect_false (ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - - ev_start (EV_A_ (W)w, ++preparecnt); - array_needsize (ev_prepare *, prepares, preparemax, preparecnt, array_needsize_noinit); - prepares [preparecnt - 1] = w; - - EV_FREQUENT_CHECK; -} - -void -ev_prepare_stop (EV_P_ ev_prepare *w) EV_NOEXCEPT -{ - clear_pending (EV_A_ (W)w); - if (ecb_expect_false (!ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - - { - int active = ev_active (w); - - prepares [active - 1] = prepares [--preparecnt]; - ev_active (prepares [active - 1]) = active; - } - - ev_stop (EV_A_ (W)w); - - EV_FREQUENT_CHECK; -} -#endif - -#if EV_CHECK_ENABLE -void -ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT -{ - if (ecb_expect_false (ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - - ev_start (EV_A_ (W)w, ++checkcnt); - array_needsize (ev_check *, checks, checkmax, checkcnt, array_needsize_noinit); - checks [checkcnt - 1] = w; - - EV_FREQUENT_CHECK; -} - -void -ev_check_stop (EV_P_ ev_check *w) EV_NOEXCEPT -{ - clear_pending (EV_A_ (W)w); - if (ecb_expect_false (!ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - - { - int active = ev_active (w); - - checks [active - 1] = checks [--checkcnt]; - ev_active (checks [active - 1]) = active; - } - - ev_stop (EV_A_ (W)w); - - EV_FREQUENT_CHECK; -} -#endif - -#if EV_EMBED_ENABLE -ecb_noinline -void -ev_embed_sweep (EV_P_ ev_embed *w) EV_NOEXCEPT -{ - ev_run (w->other, EVRUN_NOWAIT); -} - -static void -embed_io_cb (EV_P_ ev_io *io, int revents) -{ - ev_embed *w = (ev_embed *)(((char *)io) - offsetof (ev_embed, io)); - - if (ev_cb (w)) - ev_feed_event (EV_A_ (W)w, EV_EMBED); - else - ev_run (w->other, EVRUN_NOWAIT); -} - -static void -embed_prepare_cb (EV_P_ ev_prepare *prepare, int revents) -{ - ev_embed *w = (ev_embed *)(((char *)prepare) - offsetof (ev_embed, prepare)); - - { - EV_P = w->other; - - while (fdchangecnt) - { - fd_reify (EV_A); - ev_run (EV_A_ EVRUN_NOWAIT); - } - } -} - -#if EV_FORK_ENABLE -static void -embed_fork_cb (EV_P_ ev_fork *fork_w, int revents) -{ - ev_embed *w = (ev_embed *)(((char *)fork_w) - offsetof (ev_embed, fork)); - - ev_embed_stop (EV_A_ w); - - { - EV_P = w->other; - - ev_loop_fork (EV_A); - ev_run (EV_A_ EVRUN_NOWAIT); - } - - ev_embed_start (EV_A_ w); -} -#endif - -#if 0 -static void -embed_idle_cb (EV_P_ ev_idle *idle, int revents) -{ - ev_idle_stop (EV_A_ idle); -} -#endif - -void -ev_embed_start (EV_P_ ev_embed *w) EV_NOEXCEPT -{ - if (ecb_expect_false (ev_is_active (w))) - return; - - { - EV_P = w->other; - assert (("libev: loop to be embedded is not embeddable", backend & ev_embeddable_backends ())); - ev_io_init (&w->io, embed_io_cb, backend_fd, EV_READ); - } - - EV_FREQUENT_CHECK; - - ev_set_priority (&w->io, ev_priority (w)); - ev_io_start (EV_A_ &w->io); - - ev_prepare_init (&w->prepare, embed_prepare_cb); - ev_set_priority (&w->prepare, EV_MINPRI); - ev_prepare_start (EV_A_ &w->prepare); - -#if EV_FORK_ENABLE - ev_fork_init (&w->fork, embed_fork_cb); - ev_fork_start (EV_A_ &w->fork); -#endif - - /*ev_idle_init (&w->idle, e,bed_idle_cb);*/ - - ev_start (EV_A_ (W)w, 1); - - EV_FREQUENT_CHECK; -} - -void -ev_embed_stop (EV_P_ ev_embed *w) EV_NOEXCEPT -{ - clear_pending (EV_A_ (W)w); - if (ecb_expect_false (!ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - - ev_io_stop (EV_A_ &w->io); - ev_prepare_stop (EV_A_ &w->prepare); -#if EV_FORK_ENABLE - ev_fork_stop (EV_A_ &w->fork); -#endif - - ev_stop (EV_A_ (W)w); - - EV_FREQUENT_CHECK; -} -#endif - -#if EV_FORK_ENABLE -void -ev_fork_start (EV_P_ ev_fork *w) EV_NOEXCEPT -{ - if (ecb_expect_false (ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - - ev_start (EV_A_ (W)w, ++forkcnt); - array_needsize (ev_fork *, forks, forkmax, forkcnt, array_needsize_noinit); - forks [forkcnt - 1] = w; - - EV_FREQUENT_CHECK; -} - -void -ev_fork_stop (EV_P_ ev_fork *w) EV_NOEXCEPT -{ - clear_pending (EV_A_ (W)w); - if (ecb_expect_false (!ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - - { - int active = ev_active (w); - - forks [active - 1] = forks [--forkcnt]; - ev_active (forks [active - 1]) = active; - } - - ev_stop (EV_A_ (W)w); - - EV_FREQUENT_CHECK; -} -#endif - -#if EV_CLEANUP_ENABLE -void -ev_cleanup_start (EV_P_ ev_cleanup *w) EV_NOEXCEPT -{ - if (ecb_expect_false (ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - - ev_start (EV_A_ (W)w, ++cleanupcnt); - array_needsize (ev_cleanup *, cleanups, cleanupmax, cleanupcnt, array_needsize_noinit); - cleanups [cleanupcnt - 1] = w; - - /* cleanup watchers should never keep a refcount on the loop */ - ev_unref (EV_A); - EV_FREQUENT_CHECK; -} - -void -ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_NOEXCEPT -{ - clear_pending (EV_A_ (W)w); - if (ecb_expect_false (!ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - ev_ref (EV_A); - - { - int active = ev_active (w); - - cleanups [active - 1] = cleanups [--cleanupcnt]; - ev_active (cleanups [active - 1]) = active; - } - - ev_stop (EV_A_ (W)w); - - EV_FREQUENT_CHECK; -} -#endif - -#if EV_ASYNC_ENABLE -void -ev_async_start (EV_P_ ev_async *w) EV_NOEXCEPT -{ - if (ecb_expect_false (ev_is_active (w))) - return; - - w->sent = 0; - - evpipe_init (EV_A); - - EV_FREQUENT_CHECK; - - ev_start (EV_A_ (W)w, ++asynccnt); - array_needsize (ev_async *, asyncs, asyncmax, asynccnt, array_needsize_noinit); - asyncs [asynccnt - 1] = w; - - EV_FREQUENT_CHECK; -} - -void -ev_async_stop (EV_P_ ev_async *w) EV_NOEXCEPT -{ - clear_pending (EV_A_ (W)w); - if (ecb_expect_false (!ev_is_active (w))) - return; - - EV_FREQUENT_CHECK; - - { - int active = ev_active (w); - - asyncs [active - 1] = asyncs [--asynccnt]; - ev_active (asyncs [active - 1]) = active; - } - - ev_stop (EV_A_ (W)w); - - EV_FREQUENT_CHECK; -} - -void -ev_async_send (EV_P_ ev_async *w) EV_NOEXCEPT -{ - w->sent = 1; - evpipe_write (EV_A_ &async_pending); -} -#endif - -/*****************************************************************************/ - -struct ev_once -{ - ev_io io; - ev_timer to; - void (*cb)(int revents, void *arg); - void *arg; -}; - -static void -once_cb (EV_P_ struct ev_once *once, int revents) -{ - void (*cb)(int revents, void *arg) = once->cb; - void *arg = once->arg; - - ev_io_stop (EV_A_ &once->io); - ev_timer_stop (EV_A_ &once->to); - ev_free (once); - - cb (revents, arg); -} - -static void -once_cb_io (EV_P_ ev_io *w, int revents) -{ - struct ev_once *once = (struct ev_once *)(((char *)w) - offsetof (struct ev_once, io)); - - once_cb (EV_A_ once, revents | ev_clear_pending (EV_A_ &once->to)); -} - -static void -once_cb_to (EV_P_ ev_timer *w, int revents) -{ - struct ev_once *once = (struct ev_once *)(((char *)w) - offsetof (struct ev_once, to)); - - once_cb (EV_A_ once, revents | ev_clear_pending (EV_A_ &once->io)); -} - -void -ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_NOEXCEPT -{ - struct ev_once *once = (struct ev_once *)ev_malloc (sizeof (struct ev_once)); - - once->cb = cb; - once->arg = arg; - - ev_init (&once->io, once_cb_io); - if (fd >= 0) - { - ev_io_set (&once->io, fd, events); - ev_io_start (EV_A_ &once->io); - } - - ev_init (&once->to, once_cb_to); - if (timeout >= 0.) - { - ev_timer_set (&once->to, timeout, 0.); - ev_timer_start (EV_A_ &once->to); - } -} - -/*****************************************************************************/ - -#if EV_WALK_ENABLE -ecb_cold -void -ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_NOEXCEPT -{ - int i, j; - ev_watcher_list *wl, *wn; - - if (types & (EV_IO | EV_EMBED)) - for (i = 0; i < anfdmax; ++i) - for (wl = anfds [i].head; wl; ) - { - wn = wl->next; - -#if EV_EMBED_ENABLE - if (ev_cb ((ev_io *)wl) == embed_io_cb) - { - if (types & EV_EMBED) - cb (EV_A_ EV_EMBED, ((char *)wl) - offsetof (struct ev_embed, io)); - } - else -#endif -#if EV_USE_INOTIFY - if (ev_cb ((ev_io *)wl) == infy_cb) - ; - else -#endif - if ((ev_io *)wl != &pipe_w) - if (types & EV_IO) - cb (EV_A_ EV_IO, wl); - - wl = wn; - } - - if (types & (EV_TIMER | EV_STAT)) - for (i = timercnt + HEAP0; i-- > HEAP0; ) -#if EV_STAT_ENABLE - /*TODO: timer is not always active*/ - if (ev_cb ((ev_timer *)ANHE_w (timers [i])) == stat_timer_cb) - { - if (types & EV_STAT) - cb (EV_A_ EV_STAT, ((char *)ANHE_w (timers [i])) - offsetof (struct ev_stat, timer)); - } - else -#endif - if (types & EV_TIMER) - cb (EV_A_ EV_TIMER, ANHE_w (timers [i])); - -#if EV_PERIODIC_ENABLE - if (types & EV_PERIODIC) - for (i = periodiccnt + HEAP0; i-- > HEAP0; ) - cb (EV_A_ EV_PERIODIC, ANHE_w (periodics [i])); -#endif - -#if EV_IDLE_ENABLE - if (types & EV_IDLE) - for (j = NUMPRI; j--; ) - for (i = idlecnt [j]; i--; ) - cb (EV_A_ EV_IDLE, idles [j][i]); -#endif - -#if EV_FORK_ENABLE - if (types & EV_FORK) - for (i = forkcnt; i--; ) - if (ev_cb (forks [i]) != embed_fork_cb) - cb (EV_A_ EV_FORK, forks [i]); -#endif - -#if EV_ASYNC_ENABLE - if (types & EV_ASYNC) - for (i = asynccnt; i--; ) - cb (EV_A_ EV_ASYNC, asyncs [i]); -#endif - -#if EV_PREPARE_ENABLE - if (types & EV_PREPARE) - for (i = preparecnt; i--; ) -# if EV_EMBED_ENABLE - if (ev_cb (prepares [i]) != embed_prepare_cb) -# endif - cb (EV_A_ EV_PREPARE, prepares [i]); -#endif - -#if EV_CHECK_ENABLE - if (types & EV_CHECK) - for (i = checkcnt; i--; ) - cb (EV_A_ EV_CHECK, checks [i]); -#endif - -#if EV_SIGNAL_ENABLE - if (types & EV_SIGNAL) - for (i = 0; i < EV_NSIG - 1; ++i) - for (wl = signals [i].head; wl; ) - { - wn = wl->next; - cb (EV_A_ EV_SIGNAL, wl); - wl = wn; - } -#endif - -#if EV_CHILD_ENABLE - if (types & EV_CHILD) - for (i = (EV_PID_HASHSIZE); i--; ) - for (wl = childs [i]; wl; ) - { - wn = wl->next; - cb (EV_A_ EV_CHILD, wl); - wl = wn; - } -#endif -/* EV_STAT 0x00001000 /* stat data changed */ -/* EV_EMBED 0x00010000 /* embedded event loop needs sweep */ -} -#endif - -#if EV_MULTIPLICITY - #include "ev_wrap.h" -#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev.h b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev.h deleted file mode 100644 index e616216..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev.h +++ /dev/null @@ -1,859 +0,0 @@ -/* - * libev native API header - * - * Copyright (c) 2007-2020 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -#ifndef EV_H_ -#define EV_H_ - -#ifdef __cplusplus -# define EV_CPP(x) x -# if __cplusplus >= 201103L -# define EV_NOEXCEPT noexcept -# else -# define EV_NOEXCEPT -# endif -#else -# define EV_CPP(x) -# define EV_NOEXCEPT -#endif -#define EV_THROW EV_NOEXCEPT /* pre-4.25, do not use in new code */ - -EV_CPP(extern "C" {) - -/*****************************************************************************/ - -/* pre-4.0 compatibility */ -#ifndef EV_COMPAT3 -# define EV_COMPAT3 1 -#endif - -#ifndef EV_FEATURES -# if defined __OPTIMIZE_SIZE__ -# define EV_FEATURES 0x7c -# else -# define EV_FEATURES 0x7f -# endif -#endif - -#define EV_FEATURE_CODE ((EV_FEATURES) & 1) -#define EV_FEATURE_DATA ((EV_FEATURES) & 2) -#define EV_FEATURE_CONFIG ((EV_FEATURES) & 4) -#define EV_FEATURE_API ((EV_FEATURES) & 8) -#define EV_FEATURE_WATCHERS ((EV_FEATURES) & 16) -#define EV_FEATURE_BACKENDS ((EV_FEATURES) & 32) -#define EV_FEATURE_OS ((EV_FEATURES) & 64) - -/* these priorities are inclusive, higher priorities will be invoked earlier */ -#ifndef EV_MINPRI -# define EV_MINPRI (EV_FEATURE_CONFIG ? -2 : 0) -#endif -#ifndef EV_MAXPRI -# define EV_MAXPRI (EV_FEATURE_CONFIG ? +2 : 0) -#endif - -#ifndef EV_MULTIPLICITY -# define EV_MULTIPLICITY EV_FEATURE_CONFIG -#endif - -#ifndef EV_PERIODIC_ENABLE -# define EV_PERIODIC_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_STAT_ENABLE -# define EV_STAT_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_PREPARE_ENABLE -# define EV_PREPARE_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_CHECK_ENABLE -# define EV_CHECK_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_IDLE_ENABLE -# define EV_IDLE_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_FORK_ENABLE -# define EV_FORK_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_CLEANUP_ENABLE -# define EV_CLEANUP_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_SIGNAL_ENABLE -# define EV_SIGNAL_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_CHILD_ENABLE -# ifdef _WIN32 -# define EV_CHILD_ENABLE 0 -# else -# define EV_CHILD_ENABLE EV_FEATURE_WATCHERS -#endif -#endif - -#ifndef EV_ASYNC_ENABLE -# define EV_ASYNC_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_EMBED_ENABLE -# define EV_EMBED_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_WALK_ENABLE -# define EV_WALK_ENABLE 0 /* not yet */ -#endif - -/*****************************************************************************/ - -#if EV_CHILD_ENABLE && !EV_SIGNAL_ENABLE -# undef EV_SIGNAL_ENABLE -# define EV_SIGNAL_ENABLE 1 -#endif - -/*****************************************************************************/ - -#ifndef EV_TSTAMP_T -# define EV_TSTAMP_T double -#endif -typedef EV_TSTAMP_T ev_tstamp; - -#include /* for memmove */ - -#ifndef EV_ATOMIC_T -# include -# define EV_ATOMIC_T sig_atomic_t volatile -#endif - -#if EV_STAT_ENABLE -# ifdef _WIN32 -# include -# include -# endif -# include -#endif - -/* support multiple event loops? */ -#if EV_MULTIPLICITY -struct ev_loop; -# define EV_P struct ev_loop *loop /* a loop as sole parameter in a declaration */ -# define EV_P_ EV_P, /* a loop as first of multiple parameters */ -# define EV_A loop /* a loop as sole argument to a function call */ -# define EV_A_ EV_A, /* a loop as first of multiple arguments */ -# define EV_DEFAULT_UC ev_default_loop_uc_ () /* the default loop, if initialised, as sole arg */ -# define EV_DEFAULT_UC_ EV_DEFAULT_UC, /* the default loop as first of multiple arguments */ -# define EV_DEFAULT ev_default_loop (0) /* the default loop as sole arg */ -# define EV_DEFAULT_ EV_DEFAULT, /* the default loop as first of multiple arguments */ -#else -# define EV_P void -# define EV_P_ -# define EV_A -# define EV_A_ -# define EV_DEFAULT -# define EV_DEFAULT_ -# define EV_DEFAULT_UC -# define EV_DEFAULT_UC_ -# undef EV_EMBED_ENABLE -#endif - -/* EV_INLINE is used for functions in header files */ -#if __STDC_VERSION__ >= 199901L || __GNUC__ >= 3 -# define EV_INLINE static inline -#else -# define EV_INLINE static -#endif - -#ifdef EV_API_STATIC -# define EV_API_DECL static -#else -# define EV_API_DECL extern -#endif - -/* EV_PROTOTYPES can be used to switch of prototype declarations */ -#ifndef EV_PROTOTYPES -# define EV_PROTOTYPES 1 -#endif - -/*****************************************************************************/ - -#define EV_VERSION_MAJOR 4 -#define EV_VERSION_MINOR 33 - -/* eventmask, revents, events... */ -enum { - EV_UNDEF = (int)0xFFFFFFFF, /* guaranteed to be invalid */ - EV_NONE = 0x00, /* no events */ - EV_READ = 0x01, /* ev_io detected read will not block */ - EV_WRITE = 0x02, /* ev_io detected write will not block */ - EV__IOFDSET = 0x80, /* internal use only */ - EV_IO = EV_READ, /* alias for type-detection */ - EV_TIMER = 0x00000100, /* timer timed out */ -#if EV_COMPAT3 - EV_TIMEOUT = EV_TIMER, /* pre 4.0 API compatibility */ -#endif - EV_PERIODIC = 0x00000200, /* periodic timer timed out */ - EV_SIGNAL = 0x00000400, /* signal was received */ - EV_CHILD = 0x00000800, /* child/pid had status change */ - EV_STAT = 0x00001000, /* stat data changed */ - EV_IDLE = 0x00002000, /* event loop is idling */ - EV_PREPARE = 0x00004000, /* event loop about to poll */ - EV_CHECK = 0x00008000, /* event loop finished poll */ - EV_EMBED = 0x00010000, /* embedded event loop needs sweep */ - EV_FORK = 0x00020000, /* event loop resumed in child */ - EV_CLEANUP = 0x00040000, /* event loop resumed in child */ - EV_ASYNC = 0x00080000, /* async intra-loop signal */ - EV_CUSTOM = 0x01000000, /* for use by user code */ - EV_ERROR = (int)0x80000000 /* sent when an error occurs */ -}; - -/* can be used to add custom fields to all watchers, while losing binary compatibility */ -#ifndef EV_COMMON -# define EV_COMMON void *data; -#endif - -#ifndef EV_CB_DECLARE -# define EV_CB_DECLARE(type) void (*cb)(EV_P_ struct type *w, int revents); -#endif -#ifndef EV_CB_INVOKE -# define EV_CB_INVOKE(watcher,revents) (watcher)->cb (EV_A_ (watcher), (revents)) -#endif - -/* not official, do not use */ -#define EV_CB(type,name) void name (EV_P_ struct ev_ ## type *w, int revents) - -/* - * struct member types: - * private: you may look at them, but not change them, - * and they might not mean anything to you. - * ro: can be read anytime, but only changed when the watcher isn't active. - * rw: can be read and modified anytime, even when the watcher is active. - * - * some internal details that might be helpful for debugging: - * - * active is either 0, which means the watcher is not active, - * or the array index of the watcher (periodics, timers) - * or the array index + 1 (most other watchers) - * or simply 1 for watchers that aren't in some array. - * pending is either 0, in which case the watcher isn't, - * or the array index + 1 in the pendings array. - */ - -#if EV_MINPRI == EV_MAXPRI -# define EV_DECL_PRIORITY -#elif !defined (EV_DECL_PRIORITY) -# define EV_DECL_PRIORITY int priority; -#endif - -/* shared by all watchers */ -#define EV_WATCHER(type) \ - int active; /* private */ \ - int pending; /* private */ \ - EV_DECL_PRIORITY /* private */ \ - EV_COMMON /* rw */ \ - EV_CB_DECLARE (type) /* private */ - -#define EV_WATCHER_LIST(type) \ - EV_WATCHER (type) \ - struct ev_watcher_list *next; /* private */ - -#define EV_WATCHER_TIME(type) \ - EV_WATCHER (type) \ - ev_tstamp at; /* private */ - -/* base class, nothing to see here unless you subclass */ -typedef struct ev_watcher -{ - EV_WATCHER (ev_watcher) -} ev_watcher; - -/* base class, nothing to see here unless you subclass */ -typedef struct ev_watcher_list -{ - EV_WATCHER_LIST (ev_watcher_list) -} ev_watcher_list; - -/* base class, nothing to see here unless you subclass */ -typedef struct ev_watcher_time -{ - EV_WATCHER_TIME (ev_watcher_time) -} ev_watcher_time; - -/* invoked when fd is either EV_READable or EV_WRITEable */ -/* revent EV_READ, EV_WRITE */ -typedef struct ev_io -{ - EV_WATCHER_LIST (ev_io) - - int fd; /* ro */ - int events; /* ro */ -} ev_io; - -/* invoked after a specific time, repeatable (based on monotonic clock) */ -/* revent EV_TIMEOUT */ -typedef struct ev_timer -{ - EV_WATCHER_TIME (ev_timer) - - ev_tstamp repeat; /* rw */ -} ev_timer; - -/* invoked at some specific time, possibly repeating at regular intervals (based on UTC) */ -/* revent EV_PERIODIC */ -typedef struct ev_periodic -{ - EV_WATCHER_TIME (ev_periodic) - - ev_tstamp offset; /* rw */ - ev_tstamp interval; /* rw */ - ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) EV_NOEXCEPT; /* rw */ -} ev_periodic; - -/* invoked when the given signal has been received */ -/* revent EV_SIGNAL */ -typedef struct ev_signal -{ - EV_WATCHER_LIST (ev_signal) - - int signum; /* ro */ -} ev_signal; - -/* invoked when sigchld is received and waitpid indicates the given pid */ -/* revent EV_CHILD */ -/* does not support priorities */ -typedef struct ev_child -{ - EV_WATCHER_LIST (ev_child) - - int flags; /* private */ - int pid; /* ro */ - int rpid; /* rw, holds the received pid */ - int rstatus; /* rw, holds the exit status, use the macros from sys/wait.h */ -} ev_child; - -#if EV_STAT_ENABLE -/* st_nlink = 0 means missing file or other error */ -# ifdef _WIN32 -typedef struct _stati64 ev_statdata; -# else -typedef struct stat ev_statdata; -# endif - -/* invoked each time the stat data changes for a given path */ -/* revent EV_STAT */ -typedef struct ev_stat -{ - EV_WATCHER_LIST (ev_stat) - - ev_timer timer; /* private */ - ev_tstamp interval; /* ro */ - const char *path; /* ro */ - ev_statdata prev; /* ro */ - ev_statdata attr; /* ro */ - - int wd; /* wd for inotify, fd for kqueue */ -} ev_stat; -#endif - -/* invoked when the nothing else needs to be done, keeps the process from blocking */ -/* revent EV_IDLE */ -typedef struct ev_idle -{ - EV_WATCHER (ev_idle) -} ev_idle; - -/* invoked for each run of the mainloop, just before the blocking call */ -/* you can still change events in any way you like */ -/* revent EV_PREPARE */ -typedef struct ev_prepare -{ - EV_WATCHER (ev_prepare) -} ev_prepare; - -/* invoked for each run of the mainloop, just after the blocking call */ -/* revent EV_CHECK */ -typedef struct ev_check -{ - EV_WATCHER (ev_check) -} ev_check; - -/* the callback gets invoked before check in the child process when a fork was detected */ -/* revent EV_FORK */ -typedef struct ev_fork -{ - EV_WATCHER (ev_fork) -} ev_fork; - -/* is invoked just before the loop gets destroyed */ -/* revent EV_CLEANUP */ -typedef struct ev_cleanup -{ - EV_WATCHER (ev_cleanup) -} ev_cleanup; - -#if EV_EMBED_ENABLE -/* used to embed an event loop inside another */ -/* the callback gets invoked when the event loop has handled events, and can be 0 */ -typedef struct ev_embed -{ - EV_WATCHER (ev_embed) - - struct ev_loop *other; /* ro */ -#undef EV_IO_ENABLE -#define EV_IO_ENABLE 1 - ev_io io; /* private */ -#undef EV_PREPARE_ENABLE -#define EV_PREPARE_ENABLE 1 - ev_prepare prepare; /* private */ - ev_check check; /* unused */ - ev_timer timer; /* unused */ - ev_periodic periodic; /* unused */ - ev_idle idle; /* unused */ - ev_fork fork; /* private */ - ev_cleanup cleanup; /* unused */ -} ev_embed; -#endif - -#if EV_ASYNC_ENABLE -/* invoked when somebody calls ev_async_send on the watcher */ -/* revent EV_ASYNC */ -typedef struct ev_async -{ - EV_WATCHER (ev_async) - - EV_ATOMIC_T sent; /* private */ -} ev_async; - -# define ev_async_pending(w) (+(w)->sent) -#endif - -/* the presence of this union forces similar struct layout */ -union ev_any_watcher -{ - struct ev_watcher w; - struct ev_watcher_list wl; - - struct ev_io io; - struct ev_timer timer; - struct ev_periodic periodic; - struct ev_signal signal; - struct ev_child child; -#if EV_STAT_ENABLE - struct ev_stat stat; -#endif -#if EV_IDLE_ENABLE - struct ev_idle idle; -#endif - struct ev_prepare prepare; - struct ev_check check; -#if EV_FORK_ENABLE - struct ev_fork fork; -#endif -#if EV_CLEANUP_ENABLE - struct ev_cleanup cleanup; -#endif -#if EV_EMBED_ENABLE - struct ev_embed embed; -#endif -#if EV_ASYNC_ENABLE - struct ev_async async; -#endif -}; - -/* flag bits for ev_default_loop and ev_loop_new */ -enum { - /* the default */ - EVFLAG_AUTO = 0x00000000U, /* not quite a mask */ - /* flag bits */ - EVFLAG_NOENV = 0x01000000U, /* do NOT consult environment */ - EVFLAG_FORKCHECK = 0x02000000U, /* check for a fork in each iteration */ - /* debugging/feature disable */ - EVFLAG_NOINOTIFY = 0x00100000U, /* do not attempt to use inotify */ -#if EV_COMPAT3 - EVFLAG_NOSIGFD = 0, /* compatibility to pre-3.9 */ -#endif - EVFLAG_SIGNALFD = 0x00200000U, /* attempt to use signalfd */ - EVFLAG_NOSIGMASK = 0x00400000U, /* avoid modifying the signal mask */ - EVFLAG_NOTIMERFD = 0x00800000U /* avoid creating a timerfd */ -}; - -/* method bits to be ored together */ -enum { - EVBACKEND_SELECT = 0x00000001U, /* available just about anywhere */ - EVBACKEND_POLL = 0x00000002U, /* !win, !aix, broken on osx */ - EVBACKEND_EPOLL = 0x00000004U, /* linux */ - EVBACKEND_KQUEUE = 0x00000008U, /* bsd, broken on osx */ - EVBACKEND_DEVPOLL = 0x00000010U, /* solaris 8 */ /* NYI */ - EVBACKEND_PORT = 0x00000020U, /* solaris 10 */ - EVBACKEND_LINUXAIO = 0x00000040U, /* linux AIO, 4.19+ */ - EVBACKEND_IOURING = 0x00000080U, /* linux io_uring, 5.1+ */ - EVBACKEND_ALL = 0x000000FFU, /* all known backends */ - EVBACKEND_MASK = 0x0000FFFFU /* all future backends */ -}; - -#if EV_PROTOTYPES -EV_API_DECL int ev_version_major (void) EV_NOEXCEPT; -EV_API_DECL int ev_version_minor (void) EV_NOEXCEPT; - -EV_API_DECL unsigned int ev_supported_backends (void) EV_NOEXCEPT; -EV_API_DECL unsigned int ev_recommended_backends (void) EV_NOEXCEPT; -EV_API_DECL unsigned int ev_embeddable_backends (void) EV_NOEXCEPT; - -EV_API_DECL ev_tstamp ev_time (void) EV_NOEXCEPT; -EV_API_DECL void ev_sleep (ev_tstamp delay) EV_NOEXCEPT; /* sleep for a while */ - -/* Sets the allocation function to use, works like realloc. - * It is used to allocate and free memory. - * If it returns zero when memory needs to be allocated, the library might abort - * or take some potentially destructive action. - * The default is your system realloc function. - */ -EV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, size_t size) EV_NOEXCEPT) EV_NOEXCEPT; - -/* set the callback function to call on a - * retryable syscall error - * (such as failed select, poll, epoll_wait) - */ -EV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT; - -#if EV_MULTIPLICITY - -/* the default loop is the only one that handles signals and child watchers */ -/* you can call this as often as you like */ -EV_API_DECL struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; - -#ifdef EV_API_STATIC -EV_API_DECL struct ev_loop *ev_default_loop_ptr; -#endif - -EV_INLINE struct ev_loop * -ev_default_loop_uc_ (void) EV_NOEXCEPT -{ - extern struct ev_loop *ev_default_loop_ptr; - - return ev_default_loop_ptr; -} - -EV_INLINE int -ev_is_default_loop (EV_P) EV_NOEXCEPT -{ - return EV_A == EV_DEFAULT_UC; -} - -/* create and destroy alternative loops that don't handle signals */ -EV_API_DECL struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; - -EV_API_DECL ev_tstamp ev_now (EV_P) EV_NOEXCEPT; /* time w.r.t. timers and the eventloop, updated after each poll */ - -#else - -EV_API_DECL int ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; /* returns true when successful */ - -EV_API_DECL ev_tstamp ev_rt_now; - -EV_INLINE ev_tstamp -ev_now (void) EV_NOEXCEPT -{ - return ev_rt_now; -} - -/* looks weird, but ev_is_default_loop (EV_A) still works if this exists */ -EV_INLINE int -ev_is_default_loop (void) EV_NOEXCEPT -{ - return 1; -} - -#endif /* multiplicity */ - -/* destroy event loops, also works for the default loop */ -EV_API_DECL void ev_loop_destroy (EV_P); - -/* this needs to be called after fork, to duplicate the loop */ -/* when you want to re-use it in the child */ -/* you can call it in either the parent or the child */ -/* you can actually call it at any time, anywhere :) */ -EV_API_DECL void ev_loop_fork (EV_P) EV_NOEXCEPT; - -EV_API_DECL unsigned int ev_backend (EV_P) EV_NOEXCEPT; /* backend in use by loop */ - -EV_API_DECL void ev_now_update (EV_P) EV_NOEXCEPT; /* update event loop time */ - -#if EV_WALK_ENABLE -/* walk (almost) all watchers in the loop of a given type, invoking the */ -/* callback on every such watcher. The callback might stop the watcher, */ -/* but do nothing else with the loop */ -EV_API_DECL void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_NOEXCEPT; -#endif - -#endif /* prototypes */ - -/* ev_run flags values */ -enum { - EVRUN_NOWAIT = 1, /* do not block/wait */ - EVRUN_ONCE = 2 /* block *once* only */ -}; - -/* ev_break how values */ -enum { - EVBREAK_CANCEL = 0, /* undo unloop */ - EVBREAK_ONE = 1, /* unloop once */ - EVBREAK_ALL = 2 /* unloop all loops */ -}; - -#if EV_PROTOTYPES -EV_API_DECL int ev_run (EV_P_ int flags EV_CPP (= 0)); -EV_API_DECL void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)) EV_NOEXCEPT; /* break out of the loop */ - -/* - * ref/unref can be used to add or remove a refcount on the mainloop. every watcher - * keeps one reference. if you have a long-running watcher you never unregister that - * should not keep ev_loop from running, unref() after starting, and ref() before stopping. - */ -EV_API_DECL void ev_ref (EV_P) EV_NOEXCEPT; -EV_API_DECL void ev_unref (EV_P) EV_NOEXCEPT; - -/* - * convenience function, wait for a single event, without registering an event watcher - * if timeout is < 0, do wait indefinitely - */ -EV_API_DECL void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_NOEXCEPT; - -EV_API_DECL void ev_invoke_pending (EV_P); /* invoke all pending watchers */ - -# if EV_FEATURE_API -EV_API_DECL unsigned int ev_iteration (EV_P) EV_NOEXCEPT; /* number of loop iterations */ -EV_API_DECL unsigned int ev_depth (EV_P) EV_NOEXCEPT; /* #ev_loop enters - #ev_loop leaves */ -EV_API_DECL void ev_verify (EV_P) EV_NOEXCEPT; /* abort if loop data corrupted */ - -EV_API_DECL void ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */ -EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */ - -/* advanced stuff for threading etc. support, see docs */ -EV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_NOEXCEPT; -EV_API_DECL void *ev_userdata (EV_P) EV_NOEXCEPT; -typedef void (*ev_loop_callback)(EV_P); -EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_NOEXCEPT; -/* C++ doesn't allow the use of the ev_loop_callback typedef here, so we need to spell it out */ -EV_API_DECL void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_NOEXCEPT, void (*acquire)(EV_P) EV_NOEXCEPT) EV_NOEXCEPT; - -EV_API_DECL unsigned int ev_pending_count (EV_P) EV_NOEXCEPT; /* number of pending events, if any */ - -/* - * stop/start the timer handling. - */ -EV_API_DECL void ev_suspend (EV_P) EV_NOEXCEPT; -EV_API_DECL void ev_resume (EV_P) EV_NOEXCEPT; -#endif - -#endif - -/* these may evaluate ev multiple times, and the other arguments at most once */ -/* either use ev_init + ev_TYPE_set, or the ev_TYPE_init macro, below, to first initialise a watcher */ -#define ev_init(ev,cb_) do { \ - ((ev_watcher *)(void *)(ev))->active = \ - ((ev_watcher *)(void *)(ev))->pending = 0; \ - ev_set_priority ((ev), 0); \ - ev_set_cb ((ev), cb_); \ -} while (0) - -#define ev_io_modify(ev,events_) do { (ev)->events = (ev)->events & EV__IOFDSET | (events_); } while (0) -#define ev_io_set(ev,fd_,events_) do { (ev)->fd = (fd_); (ev)->events = (events_) | EV__IOFDSET; } while (0) -#define ev_timer_set(ev,after_,repeat_) do { ((ev_watcher_time *)(ev))->at = (after_); (ev)->repeat = (repeat_); } while (0) -#define ev_periodic_set(ev,ofs_,ival_,rcb_) do { (ev)->offset = (ofs_); (ev)->interval = (ival_); (ev)->reschedule_cb = (rcb_); } while (0) -#define ev_signal_set(ev,signum_) do { (ev)->signum = (signum_); } while (0) -#define ev_child_set(ev,pid_,trace_) do { (ev)->pid = (pid_); (ev)->flags = !!(trace_); } while (0) -#define ev_stat_set(ev,path_,interval_) do { (ev)->path = (path_); (ev)->interval = (interval_); (ev)->wd = -2; } while (0) -#define ev_idle_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_prepare_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_check_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_embed_set(ev,other_) do { (ev)->other = (other_); } while (0) -#define ev_fork_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_cleanup_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_async_set(ev) /* nop, yes, this is a serious in-joke */ - -#define ev_io_init(ev,cb,fd,events) do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0) -#define ev_timer_init(ev,cb,after,repeat) do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0) -#define ev_periodic_init(ev,cb,ofs,ival,rcb) do { ev_init ((ev), (cb)); ev_periodic_set ((ev),(ofs),(ival),(rcb)); } while (0) -#define ev_signal_init(ev,cb,signum) do { ev_init ((ev), (cb)); ev_signal_set ((ev), (signum)); } while (0) -#define ev_child_init(ev,cb,pid,trace) do { ev_init ((ev), (cb)); ev_child_set ((ev),(pid),(trace)); } while (0) -#define ev_stat_init(ev,cb,path,interval) do { ev_init ((ev), (cb)); ev_stat_set ((ev),(path),(interval)); } while (0) -#define ev_idle_init(ev,cb) do { ev_init ((ev), (cb)); ev_idle_set ((ev)); } while (0) -#define ev_prepare_init(ev,cb) do { ev_init ((ev), (cb)); ev_prepare_set ((ev)); } while (0) -#define ev_check_init(ev,cb) do { ev_init ((ev), (cb)); ev_check_set ((ev)); } while (0) -#define ev_embed_init(ev,cb,other) do { ev_init ((ev), (cb)); ev_embed_set ((ev),(other)); } while (0) -#define ev_fork_init(ev,cb) do { ev_init ((ev), (cb)); ev_fork_set ((ev)); } while (0) -#define ev_cleanup_init(ev,cb) do { ev_init ((ev), (cb)); ev_cleanup_set ((ev)); } while (0) -#define ev_async_init(ev,cb) do { ev_init ((ev), (cb)); ev_async_set ((ev)); } while (0) - -#define ev_is_pending(ev) (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */ -#define ev_is_active(ev) (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */ - -#define ev_cb_(ev) (ev)->cb /* rw */ -#define ev_cb(ev) (memmove (&ev_cb_ (ev), &((ev_watcher *)(ev))->cb, sizeof (ev_cb_ (ev))), (ev)->cb) - -#if EV_MINPRI == EV_MAXPRI -# define ev_priority(ev) ((ev), EV_MINPRI) -# define ev_set_priority(ev,pri) ((ev), (pri)) -#else -# define ev_priority(ev) (+(((ev_watcher *)(void *)(ev))->priority)) -# define ev_set_priority(ev,pri) ( (ev_watcher *)(void *)(ev))->priority = (pri) -#endif - -#define ev_periodic_at(ev) (+((ev_watcher_time *)(ev))->at) - -#ifndef ev_set_cb -/* memmove is used here to avoid strict aliasing violations, and hopefully is optimized out by any reasonable compiler */ -# define ev_set_cb(ev,cb_) (ev_cb_ (ev) = (cb_), memmove (&((ev_watcher *)(ev))->cb, &ev_cb_ (ev), sizeof (ev_cb_ (ev)))) -#endif - -/* stopping (enabling, adding) a watcher does nothing if it is already running */ -/* stopping (disabling, deleting) a watcher does nothing unless it's already running */ -#if EV_PROTOTYPES - -/* feeds an event into a watcher as if the event actually occurred */ -/* accepts any ev_watcher type */ -EV_API_DECL void ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT; -EV_API_DECL void ev_feed_fd_event (EV_P_ int fd, int revents) EV_NOEXCEPT; -#if EV_SIGNAL_ENABLE -EV_API_DECL void ev_feed_signal (int signum) EV_NOEXCEPT; -EV_API_DECL void ev_feed_signal_event (EV_P_ int signum) EV_NOEXCEPT; -#endif -EV_API_DECL void ev_invoke (EV_P_ void *w, int revents); -EV_API_DECL int ev_clear_pending (EV_P_ void *w) EV_NOEXCEPT; - -EV_API_DECL void ev_io_start (EV_P_ ev_io *w) EV_NOEXCEPT; -EV_API_DECL void ev_io_stop (EV_P_ ev_io *w) EV_NOEXCEPT; - -EV_API_DECL void ev_timer_start (EV_P_ ev_timer *w) EV_NOEXCEPT; -EV_API_DECL void ev_timer_stop (EV_P_ ev_timer *w) EV_NOEXCEPT; -/* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */ -EV_API_DECL void ev_timer_again (EV_P_ ev_timer *w) EV_NOEXCEPT; -/* return remaining time */ -EV_API_DECL ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w) EV_NOEXCEPT; - -#if EV_PERIODIC_ENABLE -EV_API_DECL void ev_periodic_start (EV_P_ ev_periodic *w) EV_NOEXCEPT; -EV_API_DECL void ev_periodic_stop (EV_P_ ev_periodic *w) EV_NOEXCEPT; -EV_API_DECL void ev_periodic_again (EV_P_ ev_periodic *w) EV_NOEXCEPT; -#endif - -/* only supported in the default loop */ -#if EV_SIGNAL_ENABLE -EV_API_DECL void ev_signal_start (EV_P_ ev_signal *w) EV_NOEXCEPT; -EV_API_DECL void ev_signal_stop (EV_P_ ev_signal *w) EV_NOEXCEPT; -#endif - -/* only supported in the default loop */ -# if EV_CHILD_ENABLE -EV_API_DECL void ev_child_start (EV_P_ ev_child *w) EV_NOEXCEPT; -EV_API_DECL void ev_child_stop (EV_P_ ev_child *w) EV_NOEXCEPT; -# endif - -# if EV_STAT_ENABLE -EV_API_DECL void ev_stat_start (EV_P_ ev_stat *w) EV_NOEXCEPT; -EV_API_DECL void ev_stat_stop (EV_P_ ev_stat *w) EV_NOEXCEPT; -EV_API_DECL void ev_stat_stat (EV_P_ ev_stat *w) EV_NOEXCEPT; -# endif - -# if EV_IDLE_ENABLE -EV_API_DECL void ev_idle_start (EV_P_ ev_idle *w) EV_NOEXCEPT; -EV_API_DECL void ev_idle_stop (EV_P_ ev_idle *w) EV_NOEXCEPT; -# endif - -#if EV_PREPARE_ENABLE -EV_API_DECL void ev_prepare_start (EV_P_ ev_prepare *w) EV_NOEXCEPT; -EV_API_DECL void ev_prepare_stop (EV_P_ ev_prepare *w) EV_NOEXCEPT; -#endif - -#if EV_CHECK_ENABLE -EV_API_DECL void ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT; -EV_API_DECL void ev_check_stop (EV_P_ ev_check *w) EV_NOEXCEPT; -#endif - -# if EV_FORK_ENABLE -EV_API_DECL void ev_fork_start (EV_P_ ev_fork *w) EV_NOEXCEPT; -EV_API_DECL void ev_fork_stop (EV_P_ ev_fork *w) EV_NOEXCEPT; -# endif - -# if EV_CLEANUP_ENABLE -EV_API_DECL void ev_cleanup_start (EV_P_ ev_cleanup *w) EV_NOEXCEPT; -EV_API_DECL void ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_NOEXCEPT; -# endif - -# if EV_EMBED_ENABLE -/* only supported when loop to be embedded is in fact embeddable */ -EV_API_DECL void ev_embed_start (EV_P_ ev_embed *w) EV_NOEXCEPT; -EV_API_DECL void ev_embed_stop (EV_P_ ev_embed *w) EV_NOEXCEPT; -EV_API_DECL void ev_embed_sweep (EV_P_ ev_embed *w) EV_NOEXCEPT; -# endif - -# if EV_ASYNC_ENABLE -EV_API_DECL void ev_async_start (EV_P_ ev_async *w) EV_NOEXCEPT; -EV_API_DECL void ev_async_stop (EV_P_ ev_async *w) EV_NOEXCEPT; -EV_API_DECL void ev_async_send (EV_P_ ev_async *w) EV_NOEXCEPT; -# endif - -#if EV_COMPAT3 - #define EVLOOP_NONBLOCK EVRUN_NOWAIT - #define EVLOOP_ONESHOT EVRUN_ONCE - #define EVUNLOOP_CANCEL EVBREAK_CANCEL - #define EVUNLOOP_ONE EVBREAK_ONE - #define EVUNLOOP_ALL EVBREAK_ALL - #if EV_PROTOTYPES - EV_INLINE void ev_loop (EV_P_ int flags) { ev_run (EV_A_ flags); } - EV_INLINE void ev_unloop (EV_P_ int how ) { ev_break (EV_A_ how ); } - EV_INLINE void ev_default_destroy (void) { ev_loop_destroy (EV_DEFAULT); } - EV_INLINE void ev_default_fork (void) { ev_loop_fork (EV_DEFAULT); } - #if EV_FEATURE_API - EV_INLINE unsigned int ev_loop_count (EV_P) { return ev_iteration (EV_A); } - EV_INLINE unsigned int ev_loop_depth (EV_P) { return ev_depth (EV_A); } - EV_INLINE void ev_loop_verify (EV_P) { ev_verify (EV_A); } - #endif - #endif -#else - typedef struct ev_loop ev_loop; -#endif - -#endif - -EV_CPP(}) - -#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_epoll.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_epoll.c deleted file mode 100644 index 58cfa68..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_epoll.c +++ /dev/null @@ -1,298 +0,0 @@ -/* - * libev epoll fd activity backend - * - * Copyright (c) 2007,2008,2009,2010,2011,2016,2017,2019 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -/* - * general notes about epoll: - * - * a) epoll silently removes fds from the fd set. as nothing tells us - * that an fd has been removed otherwise, we have to continually - * "rearm" fds that we suspect *might* have changed (same - * problem with kqueue, but much less costly there). - * b) the fact that ADD != MOD creates a lot of extra syscalls due to a) - * and seems not to have any advantage. - * c) the inability to handle fork or file descriptors (think dup) - * limits the applicability over poll, so this is not a generic - * poll replacement. - * d) epoll doesn't work the same as select with many file descriptors - * (such as files). while not critical, no other advanced interface - * seems to share this (rather non-unixy) limitation. - * e) epoll claims to be embeddable, but in practise you never get - * a ready event for the epoll fd (broken: <=2.6.26, working: >=2.6.32). - * f) epoll_ctl returning EPERM means the fd is always ready. - * - * lots of "weird code" and complication handling in this file is due - * to these design problems with epoll, as we try very hard to avoid - * epoll_ctl syscalls for common usage patterns and handle the breakage - * ensuing from receiving events for closed and otherwise long gone - * file descriptors. - */ - -#include - -#define EV_EMASK_EPERM 0x80 - -static void -epoll_modify (EV_P_ int fd, int oev, int nev) -{ - struct epoll_event ev; - unsigned char oldmask; - - /* - * we handle EPOLL_CTL_DEL by ignoring it here - * on the assumption that the fd is gone anyways - * if that is wrong, we have to handle the spurious - * event in epoll_poll. - * if the fd is added again, we try to ADD it, and, if that - * fails, we assume it still has the same eventmask. - */ - if (!nev) - return; - - oldmask = anfds [fd].emask; - anfds [fd].emask = nev; - - /* store the generation counter in the upper 32 bits, the fd in the lower 32 bits */ - ev.data.u64 = (uint64_t)(uint32_t)fd - | ((uint64_t)(uint32_t)++anfds [fd].egen << 32); - ev.events = (nev & EV_READ ? EPOLLIN : 0) - | (nev & EV_WRITE ? EPOLLOUT : 0); - - if (ecb_expect_true (!epoll_ctl (backend_fd, oev && oldmask != nev ? EPOLL_CTL_MOD : EPOLL_CTL_ADD, fd, &ev))) - return; - - if (ecb_expect_true (errno == ENOENT)) - { - /* if ENOENT then the fd went away, so try to do the right thing */ - if (!nev) - goto dec_egen; - - if (!epoll_ctl (backend_fd, EPOLL_CTL_ADD, fd, &ev)) - return; - } - else if (ecb_expect_true (errno == EEXIST)) - { - /* EEXIST means we ignored a previous DEL, but the fd is still active */ - /* if the kernel mask is the same as the new mask, we assume it hasn't changed */ - if (oldmask == nev) - goto dec_egen; - - if (!epoll_ctl (backend_fd, EPOLL_CTL_MOD, fd, &ev)) - return; - } - else if (ecb_expect_true (errno == EPERM)) - { - /* EPERM means the fd is always ready, but epoll is too snobbish */ - /* to handle it, unlike select or poll. */ - anfds [fd].emask = EV_EMASK_EPERM; - - /* add fd to epoll_eperms, if not already inside */ - if (!(oldmask & EV_EMASK_EPERM)) - { - array_needsize (int, epoll_eperms, epoll_epermmax, epoll_epermcnt + 1, array_needsize_noinit); - epoll_eperms [epoll_epermcnt++] = fd; - } - - return; - } - else - assert (("libev: I/O watcher with invalid fd found in epoll_ctl", errno != EBADF && errno != ELOOP && errno != EINVAL)); - - fd_kill (EV_A_ fd); - -dec_egen: - /* we didn't successfully call epoll_ctl, so decrement the generation counter again */ - --anfds [fd].egen; -} - -static void -epoll_poll (EV_P_ ev_tstamp timeout) -{ - int i; - int eventcnt; - - if (ecb_expect_false (epoll_epermcnt)) - timeout = EV_TS_CONST (0.); - - /* epoll wait times cannot be larger than (LONG_MAX - 999UL) / HZ msecs, which is below */ - /* the default libev max wait time, however. */ - EV_RELEASE_CB; - eventcnt = epoll_wait (backend_fd, epoll_events, epoll_eventmax, EV_TS_TO_MSEC (timeout)); - EV_ACQUIRE_CB; - - if (ecb_expect_false (eventcnt < 0)) - { - if (errno != EINTR) - ev_syserr ("(libev) epoll_wait"); - - return; - } - - for (i = 0; i < eventcnt; ++i) - { - struct epoll_event *ev = epoll_events + i; - - int fd = (uint32_t)ev->data.u64; /* mask out the lower 32 bits */ - int want = anfds [fd].events; - int got = (ev->events & (EPOLLOUT | EPOLLERR | EPOLLHUP) ? EV_WRITE : 0) - | (ev->events & (EPOLLIN | EPOLLERR | EPOLLHUP) ? EV_READ : 0); - - /* - * check for spurious notification. - * this only finds spurious notifications on egen updates - * other spurious notifications will be found by epoll_ctl, below - * we assume that fd is always in range, as we never shrink the anfds array - */ - if (ecb_expect_false ((uint32_t)anfds [fd].egen != (uint32_t)(ev->data.u64 >> 32))) - { - /* recreate kernel state */ - postfork |= 2; - continue; - } - - if (ecb_expect_false (got & ~want)) - { - anfds [fd].emask = want; - - /* - * we received an event but are not interested in it, try mod or del - * this often happens because we optimistically do not unregister fds - * when we are no longer interested in them, but also when we get spurious - * notifications for fds from another process. this is partially handled - * above with the gencounter check (== our fd is not the event fd), and - * partially here, when epoll_ctl returns an error (== a child has the fd - * but we closed it). - * note: for events such as POLLHUP, where we can't know whether it refers - * to EV_READ or EV_WRITE, we might issue redundant EPOLL_CTL_MOD calls. - */ - ev->events = (want & EV_READ ? EPOLLIN : 0) - | (want & EV_WRITE ? EPOLLOUT : 0); - - /* pre-2.6.9 kernels require a non-null pointer with EPOLL_CTL_DEL, */ - /* which is fortunately easy to do for us. */ - if (epoll_ctl (backend_fd, want ? EPOLL_CTL_MOD : EPOLL_CTL_DEL, fd, ev)) - { - postfork |= 2; /* an error occurred, recreate kernel state */ - continue; - } - } - - fd_event (EV_A_ fd, got); - } - - /* if the receive array was full, increase its size */ - if (ecb_expect_false (eventcnt == epoll_eventmax)) - { - ev_free (epoll_events); - epoll_eventmax = array_nextsize (sizeof (struct epoll_event), epoll_eventmax, epoll_eventmax + 1); - epoll_events = (struct epoll_event *)ev_malloc (sizeof (struct epoll_event) * epoll_eventmax); - } - - /* now synthesize events for all fds where epoll fails, while select works... */ - for (i = epoll_epermcnt; i--; ) - { - int fd = epoll_eperms [i]; - unsigned char events = anfds [fd].events & (EV_READ | EV_WRITE); - - if (anfds [fd].emask & EV_EMASK_EPERM && events) - fd_event (EV_A_ fd, events); - else - { - epoll_eperms [i] = epoll_eperms [--epoll_epermcnt]; - anfds [fd].emask = 0; - } - } -} - -static int -epoll_epoll_create (void) -{ - int fd; - -#if defined EPOLL_CLOEXEC && !defined __ANDROID__ - fd = epoll_create1 (EPOLL_CLOEXEC); - - if (fd < 0 && (errno == EINVAL || errno == ENOSYS)) -#endif - { - fd = epoll_create (256); - - if (fd >= 0) - fcntl (fd, F_SETFD, FD_CLOEXEC); - } - - return fd; -} - -inline_size -int -epoll_init (EV_P_ int flags) -{ - if ((backend_fd = epoll_epoll_create ()) < 0) - return 0; - - backend_mintime = EV_TS_CONST (1e-3); /* epoll does sometimes return early, this is just to avoid the worst */ - backend_modify = epoll_modify; - backend_poll = epoll_poll; - - epoll_eventmax = 64; /* initial number of events receivable per poll */ - epoll_events = (struct epoll_event *)ev_malloc (sizeof (struct epoll_event) * epoll_eventmax); - - return EVBACKEND_EPOLL; -} - -inline_size -void -epoll_destroy (EV_P) -{ - ev_free (epoll_events); - array_free (epoll_eperm, EMPTY); -} - -ecb_cold -static void -epoll_fork (EV_P) -{ - close (backend_fd); - - while ((backend_fd = epoll_epoll_create ()) < 0) - ev_syserr ("(libev) epoll_create"); - - fd_rearm_all (EV_A); -} - diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_iouring.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_iouring.c deleted file mode 100644 index 30a3d5f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_iouring.c +++ /dev/null @@ -1,694 +0,0 @@ -/* - * libev linux io_uring fd activity backend - * - * Copyright (c) 2019-2020 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -/* - * general notes about linux io_uring: - * - * a) it's the best interface I have seen so far. on linux. - * b) best is not necessarily very good. - * c) it's better than the aio mess, doesn't suffer from the fork problems - * of linux aio or epoll and so on and so on. and you could do event stuff - * without any syscalls. what's not to like? - * d) ok, it's vastly more complex, but that's ok, really. - * e) why two mmaps instead of one? one would be more space-efficient, - * and I can't see what benefit two would have (other than being - * somehow resizable/relocatable, but that's apparently not possible). - * f) hmm, it's practically undebuggable (gdb can't access the memory, and - * the bizarre way structure offsets are communicated makes it hard to - * just print the ring buffer heads, even *iff* the memory were visible - * in gdb. but then, that's also ok, really. - * g) well, you cannot specify a timeout when waiting for events. no, - * seriously, the interface doesn't support a timeout. never seen _that_ - * before. sure, you can use a timerfd, but that's another syscall - * you could have avoided. overall, this bizarre omission smells - * like a µ-optimisation by the io_uring author for his personal - * applications, to the detriment of everybody else who just wants - * an event loop. but, umm, ok, if that's all, it could be worse. - * (from what I gather from the author Jens Axboe, it simply didn't - * occur to him, and he made good on it by adding an unlimited nuber - * of timeouts later :). - * h) initially there was a hardcoded limit of 4096 outstanding events. - * later versions not only bump this to 32k, but also can handle - * an unlimited amount of events, so this only affects the batch size. - * i) unlike linux aio, you *can* register more then the limit - * of fd events. while early verisons of io_uring signalled an overflow - * and you ended up getting wet. 5.5+ does not do this anymore. - * j) but, oh my! it had exactly the same bugs as the linux aio backend, - * where some undocumented poll combinations just fail. fortunately, - * after finally reaching the author, he was more than willing to fix - * this probably in 5.6+. - * k) overall, the *API* itself is, I dare to say, not a total trainwreck. - * once the bugs ae fixed (probably in 5.6+), it will be without - * competition. - */ - -/* TODO: use internal TIMEOUT */ -/* TODO: take advantage of single mmap, NODROP etc. */ -/* TODO: resize cq/sq size independently */ - -#include -#include -#include -#include - -#define IOURING_INIT_ENTRIES 32 - -/*****************************************************************************/ -/* syscall wrapdadoop - this section has the raw api/abi definitions */ - -#include -#include - -/* mostly directly taken from the kernel or documentation */ - -struct io_uring_sqe -{ - __u8 opcode; - __u8 flags; - __u16 ioprio; - __s32 fd; - union { - __u64 off; - __u64 addr2; - }; - __u64 addr; - __u32 len; - union { - __kernel_rwf_t rw_flags; - __u32 fsync_flags; - __u16 poll_events; - __u32 sync_range_flags; - __u32 msg_flags; - __u32 timeout_flags; - __u32 accept_flags; - __u32 cancel_flags; - __u32 open_flags; - __u32 statx_flags; - }; - __u64 user_data; - union { - __u16 buf_index; - __u64 __pad2[3]; - }; -}; - -struct io_uring_cqe -{ - __u64 user_data; - __s32 res; - __u32 flags; -}; - -struct io_sqring_offsets -{ - __u32 head; - __u32 tail; - __u32 ring_mask; - __u32 ring_entries; - __u32 flags; - __u32 dropped; - __u32 array; - __u32 resv1; - __u64 resv2; -}; - -struct io_cqring_offsets -{ - __u32 head; - __u32 tail; - __u32 ring_mask; - __u32 ring_entries; - __u32 overflow; - __u32 cqes; - __u64 resv[2]; -}; - -struct io_uring_params -{ - __u32 sq_entries; - __u32 cq_entries; - __u32 flags; - __u32 sq_thread_cpu; - __u32 sq_thread_idle; - __u32 features; - __u32 resv[4]; - struct io_sqring_offsets sq_off; - struct io_cqring_offsets cq_off; -}; - -#define IORING_SETUP_CQSIZE 0x00000008 - -#define IORING_OP_POLL_ADD 6 -#define IORING_OP_POLL_REMOVE 7 -#define IORING_OP_TIMEOUT 11 -#define IORING_OP_TIMEOUT_REMOVE 12 - -/* relative or absolute, reference clock is CLOCK_MONOTONIC */ -struct iouring_kernel_timespec -{ - int64_t tv_sec; - long long tv_nsec; -}; - -#define IORING_TIMEOUT_ABS 0x00000001 - -#define IORING_ENTER_GETEVENTS 0x01 - -#define IORING_OFF_SQ_RING 0x00000000ULL -#define IORING_OFF_CQ_RING 0x08000000ULL -#define IORING_OFF_SQES 0x10000000ULL - -#define IORING_FEAT_SINGLE_MMAP 0x00000001 -#define IORING_FEAT_NODROP 0x00000002 -#define IORING_FEAT_SUBMIT_STABLE 0x00000004 - -inline_size -int -evsys_io_uring_setup (unsigned entries, struct io_uring_params *params) -{ - return ev_syscall2 (SYS_io_uring_setup, entries, params); -} - -inline_size -int -evsys_io_uring_enter (int fd, unsigned to_submit, unsigned min_complete, unsigned flags, const sigset_t *sig, size_t sigsz) -{ - return ev_syscall6 (SYS_io_uring_enter, fd, to_submit, min_complete, flags, sig, sigsz); -} - -/*****************************************************************************/ -/* actual backed implementation */ - -/* we hope that volatile will make the compiler access this variables only once */ -#define EV_SQ_VAR(name) *(volatile unsigned *)((char *)iouring_sq_ring + iouring_sq_ ## name) -#define EV_CQ_VAR(name) *(volatile unsigned *)((char *)iouring_cq_ring + iouring_cq_ ## name) - -/* the index array */ -#define EV_SQ_ARRAY ((unsigned *)((char *)iouring_sq_ring + iouring_sq_array)) - -/* the submit/completion queue entries */ -#define EV_SQES ((struct io_uring_sqe *) iouring_sqes) -#define EV_CQES ((struct io_uring_cqe *)((char *)iouring_cq_ring + iouring_cq_cqes)) - -inline_speed -int -iouring_enter (EV_P_ ev_tstamp timeout) -{ - int res; - - EV_RELEASE_CB; - - res = evsys_io_uring_enter (iouring_fd, iouring_to_submit, 1, - timeout > EV_TS_CONST (0.) ? IORING_ENTER_GETEVENTS : 0, 0, 0); - - assert (("libev: io_uring_enter did not consume all sqes", (res < 0 || res == iouring_to_submit))); - - iouring_to_submit = 0; - - EV_ACQUIRE_CB; - - return res; -} - -/* TODO: can we move things around so we don't need this forward-reference? */ -static void -iouring_poll (EV_P_ ev_tstamp timeout); - -static -struct io_uring_sqe * -iouring_sqe_get (EV_P) -{ - unsigned tail; - - for (;;) - { - tail = EV_SQ_VAR (tail); - - if (ecb_expect_true (tail + 1 - EV_SQ_VAR (head) <= EV_SQ_VAR (ring_entries))) - break; /* whats the problem, we have free sqes */ - - /* queue full, need to flush and possibly handle some events */ - -#if EV_FEATURE_CODE - /* first we ask the kernel nicely, most often this frees up some sqes */ - int res = iouring_enter (EV_A_ EV_TS_CONST (0.)); - - ECB_MEMORY_FENCE_ACQUIRE; /* better safe than sorry */ - - if (res >= 0) - continue; /* yes, it worked, try again */ -#endif - - /* some problem, possibly EBUSY - do the full poll and let it handle any issues */ - - iouring_poll (EV_A_ EV_TS_CONST (0.)); - /* iouring_poll should have done ECB_MEMORY_FENCE_ACQUIRE for us */ - } - - /*assert (("libev: io_uring queue full after flush", tail + 1 - EV_SQ_VAR (head) <= EV_SQ_VAR (ring_entries)));*/ - - return EV_SQES + (tail & EV_SQ_VAR (ring_mask)); -} - -inline_size -void -iouring_sqe_submit (EV_P_ struct io_uring_sqe *sqe) -{ - unsigned idx = sqe - EV_SQES; - - EV_SQ_ARRAY [idx] = idx; - ECB_MEMORY_FENCE_RELEASE; - ++EV_SQ_VAR (tail); - /*ECB_MEMORY_FENCE_RELEASE; /* for the time being we assume this is not needed */ - ++iouring_to_submit; -} - -/*****************************************************************************/ - -/* when the timerfd expires we simply note the fact, - * as the purpose of the timerfd is to wake us up, nothing else. - * the next iteration should re-set it. - */ -static void -iouring_tfd_cb (EV_P_ struct ev_io *w, int revents) -{ - iouring_tfd_to = EV_TSTAMP_HUGE; -} - -/* called for full and partial cleanup */ -ecb_cold -static void -iouring_internal_destroy (EV_P) -{ - close (iouring_tfd); - close (iouring_fd); - - if (iouring_sq_ring != MAP_FAILED) munmap (iouring_sq_ring, iouring_sq_ring_size); - if (iouring_cq_ring != MAP_FAILED) munmap (iouring_cq_ring, iouring_cq_ring_size); - if (iouring_sqes != MAP_FAILED) munmap (iouring_sqes , iouring_sqes_size ); - - if (ev_is_active (&iouring_tfd_w)) - { - ev_ref (EV_A); - ev_io_stop (EV_A_ &iouring_tfd_w); - } -} - -ecb_cold -static int -iouring_internal_init (EV_P) -{ - struct io_uring_params params = { 0 }; - - iouring_to_submit = 0; - - iouring_tfd = -1; - iouring_sq_ring = MAP_FAILED; - iouring_cq_ring = MAP_FAILED; - iouring_sqes = MAP_FAILED; - - if (!have_monotonic) /* cannot really happen, but what if11 */ - return -1; - - for (;;) - { - iouring_fd = evsys_io_uring_setup (iouring_entries, ¶ms); - - if (iouring_fd >= 0) - break; /* yippie */ - - if (errno != EINVAL) - return -1; /* we failed */ - -#if TODO - if ((~params.features) & (IORING_FEAT_NODROP | IORING_FEATURE_SINGLE_MMAP | IORING_FEAT_SUBMIT_STABLE)) - return -1; /* we require the above features */ -#endif - - /* EINVAL: lots of possible reasons, but maybe - * it is because we hit the unqueryable hardcoded size limit - */ - - /* we hit the limit already, give up */ - if (iouring_max_entries) - return -1; - - /* first time we hit EINVAL? assume we hit the limit, so go back and retry */ - iouring_entries >>= 1; - iouring_max_entries = iouring_entries; - } - - iouring_sq_ring_size = params.sq_off.array + params.sq_entries * sizeof (unsigned); - iouring_cq_ring_size = params.cq_off.cqes + params.cq_entries * sizeof (struct io_uring_cqe); - iouring_sqes_size = params.sq_entries * sizeof (struct io_uring_sqe); - - iouring_sq_ring = mmap (0, iouring_sq_ring_size, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_POPULATE, iouring_fd, IORING_OFF_SQ_RING); - iouring_cq_ring = mmap (0, iouring_cq_ring_size, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_POPULATE, iouring_fd, IORING_OFF_CQ_RING); - iouring_sqes = mmap (0, iouring_sqes_size, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_POPULATE, iouring_fd, IORING_OFF_SQES); - - if (iouring_sq_ring == MAP_FAILED || iouring_cq_ring == MAP_FAILED || iouring_sqes == MAP_FAILED) - return -1; - - iouring_sq_head = params.sq_off.head; - iouring_sq_tail = params.sq_off.tail; - iouring_sq_ring_mask = params.sq_off.ring_mask; - iouring_sq_ring_entries = params.sq_off.ring_entries; - iouring_sq_flags = params.sq_off.flags; - iouring_sq_dropped = params.sq_off.dropped; - iouring_sq_array = params.sq_off.array; - - iouring_cq_head = params.cq_off.head; - iouring_cq_tail = params.cq_off.tail; - iouring_cq_ring_mask = params.cq_off.ring_mask; - iouring_cq_ring_entries = params.cq_off.ring_entries; - iouring_cq_overflow = params.cq_off.overflow; - iouring_cq_cqes = params.cq_off.cqes; - - iouring_tfd = timerfd_create (CLOCK_MONOTONIC, TFD_CLOEXEC); - - if (iouring_tfd < 0) - return iouring_tfd; - - iouring_tfd_to = EV_TSTAMP_HUGE; - - return 0; -} - -ecb_cold -static void -iouring_fork (EV_P) -{ - iouring_internal_destroy (EV_A); - - while (iouring_internal_init (EV_A) < 0) - ev_syserr ("(libev) io_uring_setup"); - - fd_rearm_all (EV_A); - - ev_io_stop (EV_A_ &iouring_tfd_w); - ev_io_set (EV_A_ &iouring_tfd_w, iouring_tfd, EV_READ); - ev_io_start (EV_A_ &iouring_tfd_w); -} - -/*****************************************************************************/ - -static void -iouring_modify (EV_P_ int fd, int oev, int nev) -{ - if (oev) - { - /* we assume the sqe's are all "properly" initialised */ - struct io_uring_sqe *sqe = iouring_sqe_get (EV_A); - sqe->opcode = IORING_OP_POLL_REMOVE; - sqe->fd = fd; - /* Jens Axboe notified me that user_data is not what is documented, but is - * some kind of unique ID that has to match, otherwise the request cannot - * be removed. Since we don't *really* have that, we pass in the old - * generation counter - if that fails, too bad, it will hopefully be removed - * at close time and then be ignored. */ - sqe->addr = (uint32_t)fd | ((__u64)(uint32_t)anfds [fd].egen << 32); - sqe->user_data = (uint64_t)-1; - iouring_sqe_submit (EV_A_ sqe); - - /* increment generation counter to avoid handling old events */ - ++anfds [fd].egen; - } - - if (nev) - { - struct io_uring_sqe *sqe = iouring_sqe_get (EV_A); - sqe->opcode = IORING_OP_POLL_ADD; - sqe->fd = fd; - sqe->addr = 0; - sqe->user_data = (uint32_t)fd | ((__u64)(uint32_t)anfds [fd].egen << 32); - sqe->poll_events = - (nev & EV_READ ? POLLIN : 0) - | (nev & EV_WRITE ? POLLOUT : 0); - iouring_sqe_submit (EV_A_ sqe); - } -} - -inline_size -void -iouring_tfd_update (EV_P_ ev_tstamp timeout) -{ - ev_tstamp tfd_to = mn_now + timeout; - - /* we assume there will be many iterations per timer change, so - * we only re-set the timerfd when we have to because its expiry - * is too late. - */ - if (ecb_expect_false (tfd_to < iouring_tfd_to)) - { - struct itimerspec its; - - iouring_tfd_to = tfd_to; - EV_TS_SET (its.it_interval, 0.); - EV_TS_SET (its.it_value, tfd_to); - - if (timerfd_settime (iouring_tfd, TFD_TIMER_ABSTIME, &its, 0) < 0) - assert (("libev: iouring timerfd_settime failed", 0)); - } -} - -inline_size -void -iouring_process_cqe (EV_P_ struct io_uring_cqe *cqe) -{ - int fd = cqe->user_data & 0xffffffffU; - uint32_t gen = cqe->user_data >> 32; - int res = cqe->res; - - /* user_data -1 is a remove that we are not atm. interested in */ - if (cqe->user_data == (uint64_t)-1) - return; - - assert (("libev: io_uring fd must be in-bounds", fd >= 0 && fd < anfdmax)); - - /* documentation lies, of course. the result value is NOT like - * normal syscalls, but like linux raw syscalls, i.e. negative - * error numbers. fortunate, as otherwise there would be no way - * to get error codes at all. still, why not document this? - */ - - /* ignore event if generation doesn't match */ - /* other than skipping removal events, */ - /* this should actually be very rare */ - if (ecb_expect_false (gen != (uint32_t)anfds [fd].egen)) - return; - - if (ecb_expect_false (res < 0)) - { - /*TODO: EINVAL handling (was something failed with this fd)*/ - - if (res == -EBADF) - { - assert (("libev: event loop rejected bad fd", res != -EBADF)); - fd_kill (EV_A_ fd); - } - else - { - errno = -res; - ev_syserr ("(libev) IORING_OP_POLL_ADD"); - } - - return; - } - - /* feed events, we do not expect or handle POLLNVAL */ - fd_event ( - EV_A_ - fd, - (res & (POLLOUT | POLLERR | POLLHUP) ? EV_WRITE : 0) - | (res & (POLLIN | POLLERR | POLLHUP) ? EV_READ : 0) - ); - - /* io_uring is oneshot, so we need to re-arm the fd next iteration */ - /* this also means we usually have to do at least one syscall per iteration */ - anfds [fd].events = 0; - fd_change (EV_A_ fd, EV_ANFD_REIFY); -} - -/* called when the event queue overflows */ -ecb_cold -static void -iouring_overflow (EV_P) -{ - /* we have two options, resize the queue (by tearing down - * everything and recreating it, or living with it - * and polling. - * we implement this by resizing the queue, and, if that fails, - * we just recreate the state on every failure, which - * kind of is a very inefficient poll. - * one danger is, due to the bios toward lower fds, - * we will only really get events for those, so - * maybe we need a poll() fallback, after all. - */ - /*EV_CQ_VAR (overflow) = 0;*/ /* need to do this if we keep the state and poll manually */ - - fd_rearm_all (EV_A); - - /* we double the size until we hit the hard-to-probe maximum */ - if (!iouring_max_entries) - { - iouring_entries <<= 1; - iouring_fork (EV_A); - } - else - { - /* we hit the kernel limit, we should fall back to something else. - * we can either poll() a few times and hope for the best, - * poll always, or switch to epoll. - * TODO: is this necessary with newer kernels? - */ - - iouring_internal_destroy (EV_A); - - /* this should make it so that on return, we don't call any uring functions */ - iouring_to_submit = 0; - - for (;;) - { - backend = epoll_init (EV_A_ 0); - - if (backend) - break; - - ev_syserr ("(libev) iouring switch to epoll"); - } - } -} - -/* handle any events in the completion queue, return true if there were any */ -static int -iouring_handle_cq (EV_P) -{ - unsigned head, tail, mask; - - head = EV_CQ_VAR (head); - ECB_MEMORY_FENCE_ACQUIRE; - tail = EV_CQ_VAR (tail); - - if (head == tail) - return 0; - - /* it can only overflow if we have events, yes, yes? */ - if (ecb_expect_false (EV_CQ_VAR (overflow))) - { - iouring_overflow (EV_A); - return 1; - } - - mask = EV_CQ_VAR (ring_mask); - - do - iouring_process_cqe (EV_A_ &EV_CQES [head++ & mask]); - while (head != tail); - - EV_CQ_VAR (head) = head; - ECB_MEMORY_FENCE_RELEASE; - - return 1; -} - -static void -iouring_poll (EV_P_ ev_tstamp timeout) -{ - /* if we have events, no need for extra syscalls, but we might have to queue events */ - /* we also clar the timeout if there are outstanding fdchanges */ - /* the latter should only happen if both the sq and cq are full, most likely */ - /* because we have a lot of event sources that immediately complete */ - /* TODO: fdchacngecnt is always 0 because fd_reify does not have two buffers yet */ - if (iouring_handle_cq (EV_A) || fdchangecnt) - timeout = EV_TS_CONST (0.); - else - /* no events, so maybe wait for some */ - iouring_tfd_update (EV_A_ timeout); - - /* only enter the kernel if we have something to submit, or we need to wait */ - if (timeout || iouring_to_submit) - { - int res = iouring_enter (EV_A_ timeout); - - if (ecb_expect_false (res < 0)) - if (errno == EINTR) - /* ignore */; - else if (errno == EBUSY) - /* cq full, cannot submit - should be rare because we flush the cq first, so simply ignore */; - else - ev_syserr ("(libev) iouring setup"); - else - iouring_handle_cq (EV_A); - } -} - -inline_size -int -iouring_init (EV_P_ int flags) -{ - iouring_entries = IOURING_INIT_ENTRIES; - iouring_max_entries = 0; - - if (iouring_internal_init (EV_A) < 0) - { - iouring_internal_destroy (EV_A); - return 0; - } - - ev_io_init (&iouring_tfd_w, iouring_tfd_cb, iouring_tfd, EV_READ); - ev_set_priority (&iouring_tfd_w, EV_MINPRI); - ev_io_start (EV_A_ &iouring_tfd_w); - ev_unref (EV_A); /* watcher should not keep loop alive */ - - backend_modify = iouring_modify; - backend_poll = iouring_poll; - - return EVBACKEND_IOURING; -} - -inline_size -void -iouring_destroy (EV_P) -{ - iouring_internal_destroy (EV_A); -} - diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_kqueue.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_kqueue.c deleted file mode 100644 index 69c5147..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_kqueue.c +++ /dev/null @@ -1,224 +0,0 @@ -/* - * libev kqueue backend - * - * Copyright (c) 2007,2008,2009,2010,2011,2012,2013,2016,2019 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -#include -#include -#include -#include -#include - -inline_speed -void -kqueue_change (EV_P_ int fd, int filter, int flags, int fflags) -{ - ++kqueue_changecnt; - array_needsize (struct kevent, kqueue_changes, kqueue_changemax, kqueue_changecnt, array_needsize_noinit); - - EV_SET (&kqueue_changes [kqueue_changecnt - 1], fd, filter, flags, fflags, 0, 0); -} - -/* OS X at least needs this */ -#ifndef EV_ENABLE -# define EV_ENABLE 0 -#endif -#ifndef NOTE_EOF -# define NOTE_EOF 0 -#endif - -static void -kqueue_modify (EV_P_ int fd, int oev, int nev) -{ - if (oev != nev) - { - if (oev & EV_READ) - kqueue_change (EV_A_ fd, EVFILT_READ , EV_DELETE, 0); - - if (oev & EV_WRITE) - kqueue_change (EV_A_ fd, EVFILT_WRITE, EV_DELETE, 0); - } - - /* to detect close/reopen reliably, we have to re-add */ - /* event requests even when oev == nev */ - - if (nev & EV_READ) - kqueue_change (EV_A_ fd, EVFILT_READ , EV_ADD | EV_ENABLE, NOTE_EOF); - - if (nev & EV_WRITE) - kqueue_change (EV_A_ fd, EVFILT_WRITE, EV_ADD | EV_ENABLE, NOTE_EOF); -} - -static void -kqueue_poll (EV_P_ ev_tstamp timeout) -{ - int res, i; - struct timespec ts; - - /* need to resize so there is enough space for errors */ - if (kqueue_changecnt > kqueue_eventmax) - { - ev_free (kqueue_events); - kqueue_eventmax = array_nextsize (sizeof (struct kevent), kqueue_eventmax, kqueue_changecnt); - kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax); - } - - EV_RELEASE_CB; - EV_TS_SET (ts, timeout); - res = kevent (backend_fd, kqueue_changes, kqueue_changecnt, kqueue_events, kqueue_eventmax, &ts); - EV_ACQUIRE_CB; - kqueue_changecnt = 0; - - if (ecb_expect_false (res < 0)) - { - if (errno != EINTR) - ev_syserr ("(libev) kqueue kevent"); - - return; - } - - for (i = 0; i < res; ++i) - { - int fd = kqueue_events [i].ident; - - if (ecb_expect_false (kqueue_events [i].flags & EV_ERROR)) - { - int err = kqueue_events [i].data; - - /* we are only interested in errors for fds that we are interested in :) */ - if (anfds [fd].events) - { - if (err == ENOENT) /* resubmit changes on ENOENT */ - kqueue_modify (EV_A_ fd, 0, anfds [fd].events); - else if (err == EBADF) /* on EBADF, we re-check the fd */ - { - if (fd_valid (fd)) - kqueue_modify (EV_A_ fd, 0, anfds [fd].events); - else - { - assert (("libev: kqueue found invalid fd", 0)); - fd_kill (EV_A_ fd); - } - } - else /* on all other errors, we error out on the fd */ - { - assert (("libev: kqueue found invalid fd", 0)); - fd_kill (EV_A_ fd); - } - } - } - else - fd_event ( - EV_A_ - fd, - kqueue_events [i].filter == EVFILT_READ ? EV_READ - : kqueue_events [i].filter == EVFILT_WRITE ? EV_WRITE - : 0 - ); - } - - if (ecb_expect_false (res == kqueue_eventmax)) - { - ev_free (kqueue_events); - kqueue_eventmax = array_nextsize (sizeof (struct kevent), kqueue_eventmax, kqueue_eventmax + 1); - kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax); - } -} - -inline_size -int -kqueue_init (EV_P_ int flags) -{ - /* initialize the kernel queue */ - kqueue_fd_pid = getpid (); - if ((backend_fd = kqueue ()) < 0) - return 0; - - fcntl (backend_fd, F_SETFD, FD_CLOEXEC); /* not sure if necessary, hopefully doesn't hurt */ - - backend_mintime = EV_TS_CONST (1e-9); /* apparently, they did the right thing in freebsd */ - backend_modify = kqueue_modify; - backend_poll = kqueue_poll; - - kqueue_eventmax = 64; /* initial number of events receivable per poll */ - kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax); - - kqueue_changes = 0; - kqueue_changemax = 0; - kqueue_changecnt = 0; - - return EVBACKEND_KQUEUE; -} - -inline_size -void -kqueue_destroy (EV_P) -{ - ev_free (kqueue_events); - ev_free (kqueue_changes); -} - -inline_size -void -kqueue_fork (EV_P) -{ - /* some BSD kernels don't just destroy the kqueue itself, - * but also close the fd, which isn't documented, and - * impossible to support properly. - * we remember the pid of the kqueue call and only close - * the fd if the pid is still the same. - * this leaks fds on sane kernels, but BSD interfaces are - * notoriously buggy and rarely get fixed. - */ - pid_t newpid = getpid (); - - if (newpid == kqueue_fd_pid) - close (backend_fd); - - kqueue_fd_pid = newpid; - while ((backend_fd = kqueue ()) < 0) - ev_syserr ("(libev) kqueue"); - - fcntl (backend_fd, F_SETFD, FD_CLOEXEC); - - /* re-register interest in fds */ - fd_rearm_all (EV_A); -} - -/* sys/event.h defines EV_ERROR */ -#undef EV_ERROR - diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_linuxaio.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_linuxaio.c deleted file mode 100644 index 4687a70..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_linuxaio.c +++ /dev/null @@ -1,620 +0,0 @@ -/* - * libev linux aio fd activity backend - * - * Copyright (c) 2019 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -/* - * general notes about linux aio: - * - * a) at first, the linux aio IOCB_CMD_POLL functionality introduced in - * 4.18 looks too good to be true: both watchers and events can be - * batched, and events can even be handled in userspace using - * a ring buffer shared with the kernel. watchers can be canceled - * regardless of whether the fd has been closed. no problems with fork. - * ok, the ring buffer is 200% undocumented (there isn't even a - * header file), but otherwise, it's pure bliss! - * b) ok, watchers are one-shot, so you have to re-arm active ones - * on every iteration. so much for syscall-less event handling, - * but at least these re-arms can be batched, no big deal, right? - * c) well, linux as usual: the documentation lies to you: io_submit - * sometimes returns EINVAL because the kernel doesn't feel like - * handling your poll mask - ttys can be polled for POLLOUT, - * POLLOUT|POLLIN, but polling for POLLIN fails. just great, - * so we have to fall back to something else (hello, epoll), - * but at least the fallback can be slow, because these are - * exceptional cases, right? - * d) hmm, you have to tell the kernel the maximum number of watchers - * you want to queue when initialising the aio context. but of - * course the real limit is magically calculated in the kernel, and - * is often higher then we asked for. so we just have to destroy - * the aio context and re-create it a bit larger if we hit the limit. - * (starts to remind you of epoll? well, it's a bit more deterministic - * and less gambling, but still ugly as hell). - * e) that's when you find out you can also hit an arbitrary system-wide - * limit. or the kernel simply doesn't want to handle your watchers. - * what the fuck do we do then? you guessed it, in the middle - * of event handling we have to switch to 100% epoll polling. and - * that better is as fast as normal epoll polling, so you practically - * have to use the normal epoll backend with all its quirks. - * f) end result of this train wreck: it inherits all the disadvantages - * from epoll, while adding a number on its own. why even bother to use - * it? because if conditions are right and your fds are supported and you - * don't hit a limit, this backend is actually faster, doesn't gamble with - * your fds, batches watchers and events and doesn't require costly state - * recreates. well, until it does. - * g) all of this makes this backend use almost twice as much code as epoll. - * which in turn uses twice as much code as poll. and that#s not counting - * the fact that this backend also depends on the epoll backend, making - * it three times as much code as poll, or kqueue. - * h) bleah. why can't linux just do kqueue. sure kqueue is ugly, but by now - * it's clear that whatever linux comes up with is far, far, far worse. - */ - -#include /* actually linux/time.h, but we must assume they are compatible */ -#include -#include - -/*****************************************************************************/ -/* syscall wrapdadoop - this section has the raw api/abi definitions */ - -#include /* no glibc wrappers */ - -/* aio_abi.h is not versioned in any way, so we cannot test for its existance */ -#define IOCB_CMD_POLL 5 - -/* taken from linux/fs/aio.c. yup, that's a .c file. - * not only is this totally undocumented, not even the source code - * can tell you what the future semantics of compat_features and - * incompat_features are, or what header_length actually is for. - */ -#define AIO_RING_MAGIC 0xa10a10a1 -#define EV_AIO_RING_INCOMPAT_FEATURES 0 -struct aio_ring -{ - unsigned id; /* kernel internal index number */ - unsigned nr; /* number of io_events */ - unsigned head; /* Written to by userland or by kernel. */ - unsigned tail; - - unsigned magic; - unsigned compat_features; - unsigned incompat_features; - unsigned header_length; /* size of aio_ring */ - - struct io_event io_events[0]; -}; - -inline_size -int -evsys_io_setup (unsigned nr_events, aio_context_t *ctx_idp) -{ - return ev_syscall2 (SYS_io_setup, nr_events, ctx_idp); -} - -inline_size -int -evsys_io_destroy (aio_context_t ctx_id) -{ - return ev_syscall1 (SYS_io_destroy, ctx_id); -} - -inline_size -int -evsys_io_submit (aio_context_t ctx_id, long nr, struct iocb *cbp[]) -{ - return ev_syscall3 (SYS_io_submit, ctx_id, nr, cbp); -} - -inline_size -int -evsys_io_cancel (aio_context_t ctx_id, struct iocb *cbp, struct io_event *result) -{ - return ev_syscall3 (SYS_io_cancel, ctx_id, cbp, result); -} - -inline_size -int -evsys_io_getevents (aio_context_t ctx_id, long min_nr, long nr, struct io_event *events, struct timespec *timeout) -{ - return ev_syscall5 (SYS_io_getevents, ctx_id, min_nr, nr, events, timeout); -} - -/*****************************************************************************/ -/* actual backed implementation */ - -ecb_cold -static int -linuxaio_nr_events (EV_P) -{ - /* we start with 16 iocbs and incraese from there - * that's tiny, but the kernel has a rather low system-wide - * limit that can be reached quickly, so let's be parsimonious - * with this resource. - * Rest assured, the kernel generously rounds up small and big numbers - * in different ways (but doesn't seem to charge you for it). - * The 15 here is because the kernel usually has a power of two as aio-max-nr, - * and this helps to take advantage of that limit. - */ - - /* we try to fill 4kB pages exactly. - * the ring buffer header is 32 bytes, every io event is 32 bytes. - * the kernel takes the io requests number, doubles it, adds 2 - * and adds the ring buffer. - * the way we use this is by starting low, and then roughly doubling the - * size each time we hit a limit. - */ - - int requests = 15 << linuxaio_iteration; - int one_page = (4096 - / sizeof (struct io_event) ) / 2; /* how many fit into one page */ - int first_page = ((4096 - sizeof (struct aio_ring)) - / sizeof (struct io_event) - 2) / 2; /* how many fit into the first page */ - - /* if everything fits into one page, use count exactly */ - if (requests > first_page) - /* otherwise, round down to full pages and add the first page */ - requests = requests / one_page * one_page + first_page; - - return requests; -} - -/* we use out own wrapper structure in case we ever want to do something "clever" */ -typedef struct aniocb -{ - struct iocb io; - /*int inuse;*/ -} *ANIOCBP; - -inline_size -void -linuxaio_array_needsize_iocbp (ANIOCBP *base, int offset, int count) -{ - while (count--) - { - /* TODO: quite the overhead to allocate every iocb separately, maybe use our own allocator? */ - ANIOCBP iocb = (ANIOCBP)ev_malloc (sizeof (*iocb)); - - /* full zero initialise is probably not required at the moment, but - * this is not well documented, so we better do it. - */ - memset (iocb, 0, sizeof (*iocb)); - - iocb->io.aio_lio_opcode = IOCB_CMD_POLL; - iocb->io.aio_fildes = offset; - - base [offset++] = iocb; - } -} - -ecb_cold -static void -linuxaio_free_iocbp (EV_P) -{ - while (linuxaio_iocbpmax--) - ev_free (linuxaio_iocbps [linuxaio_iocbpmax]); - - linuxaio_iocbpmax = 0; /* next resize will completely reallocate the array, at some overhead */ -} - -static void -linuxaio_modify (EV_P_ int fd, int oev, int nev) -{ - array_needsize (ANIOCBP, linuxaio_iocbps, linuxaio_iocbpmax, fd + 1, linuxaio_array_needsize_iocbp); - ANIOCBP iocb = linuxaio_iocbps [fd]; - ANFD *anfd = &anfds [fd]; - - if (ecb_expect_false (iocb->io.aio_reqprio < 0)) - { - /* we handed this fd over to epoll, so undo this first */ - /* we do it manually because the optimisations on epoll_modify won't do us any good */ - epoll_ctl (backend_fd, EPOLL_CTL_DEL, fd, 0); - anfd->emask = 0; - iocb->io.aio_reqprio = 0; - } - else if (ecb_expect_false (iocb->io.aio_buf)) - { - /* iocb active, so cancel it first before resubmit */ - /* this assumes we only ever get one call per fd per loop iteration */ - for (;;) - { - /* on all relevant kernels, io_cancel fails with EINPROGRESS on "success" */ - if (ecb_expect_false (evsys_io_cancel (linuxaio_ctx, &iocb->io, (struct io_event *)0) == 0)) - break; - - if (ecb_expect_true (errno == EINPROGRESS)) - break; - - /* the EINPROGRESS test is for nicer error message. clumsy. */ - if (errno != EINTR) - { - assert (("libev: linuxaio unexpected io_cancel failed", errno != EINTR && errno != EINPROGRESS)); - break; - } - } - - /* increment generation counter to avoid handling old events */ - ++anfd->egen; - } - - iocb->io.aio_buf = (nev & EV_READ ? POLLIN : 0) - | (nev & EV_WRITE ? POLLOUT : 0); - - if (nev) - { - iocb->io.aio_data = (uint32_t)fd | ((__u64)(uint32_t)anfd->egen << 32); - - /* queue iocb up for io_submit */ - /* this assumes we only ever get one call per fd per loop iteration */ - ++linuxaio_submitcnt; - array_needsize (struct iocb *, linuxaio_submits, linuxaio_submitmax, linuxaio_submitcnt, array_needsize_noinit); - linuxaio_submits [linuxaio_submitcnt - 1] = &iocb->io; - } -} - -static void -linuxaio_epoll_cb (EV_P_ struct ev_io *w, int revents) -{ - epoll_poll (EV_A_ 0); -} - -inline_speed -void -linuxaio_fd_rearm (EV_P_ int fd) -{ - anfds [fd].events = 0; - linuxaio_iocbps [fd]->io.aio_buf = 0; - fd_change (EV_A_ fd, EV_ANFD_REIFY); -} - -static void -linuxaio_parse_events (EV_P_ struct io_event *ev, int nr) -{ - while (nr) - { - int fd = ev->data & 0xffffffff; - uint32_t gen = ev->data >> 32; - int res = ev->res; - - assert (("libev: iocb fd must be in-bounds", fd >= 0 && fd < anfdmax)); - - /* only accept events if generation counter matches */ - if (ecb_expect_true (gen == (uint32_t)anfds [fd].egen)) - { - /* feed events, we do not expect or handle POLLNVAL */ - fd_event ( - EV_A_ - fd, - (res & (POLLOUT | POLLERR | POLLHUP) ? EV_WRITE : 0) - | (res & (POLLIN | POLLERR | POLLHUP) ? EV_READ : 0) - ); - - /* linux aio is oneshot: rearm fd. TODO: this does more work than strictly needed */ - linuxaio_fd_rearm (EV_A_ fd); - } - - --nr; - ++ev; - } -} - -/* get any events from ring buffer, return true if any were handled */ -static int -linuxaio_get_events_from_ring (EV_P) -{ - struct aio_ring *ring = (struct aio_ring *)linuxaio_ctx; - unsigned head, tail; - - /* the kernel reads and writes both of these variables, */ - /* as a C extension, we assume that volatile use here */ - /* both makes reads atomic and once-only */ - head = *(volatile unsigned *)&ring->head; - ECB_MEMORY_FENCE_ACQUIRE; - tail = *(volatile unsigned *)&ring->tail; - - if (head == tail) - return 0; - - /* parse all available events, but only once, to avoid starvation */ - if (ecb_expect_true (tail > head)) /* normal case around */ - linuxaio_parse_events (EV_A_ ring->io_events + head, tail - head); - else /* wrapped around */ - { - linuxaio_parse_events (EV_A_ ring->io_events + head, ring->nr - head); - linuxaio_parse_events (EV_A_ ring->io_events, tail); - } - - ECB_MEMORY_FENCE_RELEASE; - /* as an extension to C, we hope that the volatile will make this atomic and once-only */ - *(volatile unsigned *)&ring->head = tail; - - return 1; -} - -inline_size -int -linuxaio_ringbuf_valid (EV_P) -{ - struct aio_ring *ring = (struct aio_ring *)linuxaio_ctx; - - return ecb_expect_true (ring->magic == AIO_RING_MAGIC) - && ring->incompat_features == EV_AIO_RING_INCOMPAT_FEATURES - && ring->header_length == sizeof (struct aio_ring); /* TODO: or use it to find io_event[0]? */ -} - -/* read at least one event from kernel, or timeout */ -inline_size -void -linuxaio_get_events (EV_P_ ev_tstamp timeout) -{ - struct timespec ts; - struct io_event ioev[8]; /* 256 octet stack space */ - int want = 1; /* how many events to request */ - int ringbuf_valid = linuxaio_ringbuf_valid (EV_A); - - if (ecb_expect_true (ringbuf_valid)) - { - /* if the ring buffer has any events, we don't wait or call the kernel at all */ - if (linuxaio_get_events_from_ring (EV_A)) - return; - - /* if the ring buffer is empty, and we don't have a timeout, then don't call the kernel */ - if (!timeout) - return; - } - else - /* no ringbuffer, request slightly larger batch */ - want = sizeof (ioev) / sizeof (ioev [0]); - - /* no events, so wait for some - * for fairness reasons, we do this in a loop, to fetch all events - */ - for (;;) - { - int res; - - EV_RELEASE_CB; - - EV_TS_SET (ts, timeout); - res = evsys_io_getevents (linuxaio_ctx, 1, want, ioev, &ts); - - EV_ACQUIRE_CB; - - if (res < 0) - if (errno == EINTR) - /* ignored, retry */; - else - ev_syserr ("(libev) linuxaio io_getevents"); - else if (res) - { - /* at least one event available, handle them */ - linuxaio_parse_events (EV_A_ ioev, res); - - if (ecb_expect_true (ringbuf_valid)) - { - /* if we have a ring buffer, handle any remaining events in it */ - linuxaio_get_events_from_ring (EV_A); - - /* at this point, we should have handled all outstanding events */ - break; - } - else if (res < want) - /* otherwise, if there were fewere events than we wanted, we assume there are no more */ - break; - } - else - break; /* no events from the kernel, we are done */ - - timeout = EV_TS_CONST (0.); /* only wait in the first iteration */ - } -} - -inline_size -int -linuxaio_io_setup (EV_P) -{ - linuxaio_ctx = 0; - return evsys_io_setup (linuxaio_nr_events (EV_A), &linuxaio_ctx); -} - -static void -linuxaio_poll (EV_P_ ev_tstamp timeout) -{ - int submitted; - - /* first phase: submit new iocbs */ - - /* io_submit might return less than the requested number of iocbs */ - /* this is, afaics, only because of errors, but we go by the book and use a loop, */ - /* which allows us to pinpoint the erroneous iocb */ - for (submitted = 0; submitted < linuxaio_submitcnt; ) - { - int res = evsys_io_submit (linuxaio_ctx, linuxaio_submitcnt - submitted, linuxaio_submits + submitted); - - if (ecb_expect_false (res < 0)) - if (errno == EINVAL) - { - /* This happens for unsupported fds, officially, but in my testing, - * also randomly happens for supported fds. We fall back to good old - * poll() here, under the assumption that this is a very rare case. - * See https://lore.kernel.org/patchwork/patch/1047453/ to see - * discussion about such a case (ttys) where polling for POLLIN - * fails but POLLIN|POLLOUT works. - */ - struct iocb *iocb = linuxaio_submits [submitted]; - epoll_modify (EV_A_ iocb->aio_fildes, 0, anfds [iocb->aio_fildes].events); - iocb->aio_reqprio = -1; /* mark iocb as epoll */ - - res = 1; /* skip this iocb - another iocb, another chance */ - } - else if (errno == EAGAIN) - { - /* This happens when the ring buffer is full, or some other shit we - * don't know and isn't documented. Most likely because we have too - * many requests and linux aio can't be assed to handle them. - * In this case, we try to allocate a larger ring buffer, freeing - * ours first. This might fail, in which case we have to fall back to 100% - * epoll. - * God, how I hate linux not getting its act together. Ever. - */ - evsys_io_destroy (linuxaio_ctx); - linuxaio_submitcnt = 0; - - /* rearm all fds with active iocbs */ - { - int fd; - for (fd = 0; fd < linuxaio_iocbpmax; ++fd) - if (linuxaio_iocbps [fd]->io.aio_buf) - linuxaio_fd_rearm (EV_A_ fd); - } - - ++linuxaio_iteration; - if (linuxaio_io_setup (EV_A) < 0) - { - /* TODO: rearm all and recreate epoll backend from scratch */ - /* TODO: might be more prudent? */ - - /* to bad, we can't get a new aio context, go 100% epoll */ - linuxaio_free_iocbp (EV_A); - ev_io_stop (EV_A_ &linuxaio_epoll_w); - ev_ref (EV_A); - linuxaio_ctx = 0; - - backend = EVBACKEND_EPOLL; - backend_modify = epoll_modify; - backend_poll = epoll_poll; - } - - timeout = EV_TS_CONST (0.); - /* it's easiest to handle this mess in another iteration */ - return; - } - else if (errno == EBADF) - { - assert (("libev: event loop rejected bad fd", errno != EBADF)); - fd_kill (EV_A_ linuxaio_submits [submitted]->aio_fildes); - - res = 1; /* skip this iocb */ - } - else if (errno == EINTR) /* not seen in reality, not documented */ - res = 0; /* silently ignore and retry */ - else - { - ev_syserr ("(libev) linuxaio io_submit"); - res = 0; - } - - submitted += res; - } - - linuxaio_submitcnt = 0; - - /* second phase: fetch and parse events */ - - linuxaio_get_events (EV_A_ timeout); -} - -inline_size -int -linuxaio_init (EV_P_ int flags) -{ - /* would be great to have a nice test for IOCB_CMD_POLL instead */ - /* also: test some semi-common fd types, such as files and ttys in recommended_backends */ - /* 4.18 introduced IOCB_CMD_POLL, 4.19 made epoll work, and we need that */ - if (ev_linux_version () < 0x041300) - return 0; - - if (!epoll_init (EV_A_ 0)) - return 0; - - linuxaio_iteration = 0; - - if (linuxaio_io_setup (EV_A) < 0) - { - epoll_destroy (EV_A); - return 0; - } - - ev_io_init (&linuxaio_epoll_w, linuxaio_epoll_cb, backend_fd, EV_READ); - ev_set_priority (&linuxaio_epoll_w, EV_MAXPRI); - ev_io_start (EV_A_ &linuxaio_epoll_w); - ev_unref (EV_A); /* watcher should not keep loop alive */ - - backend_modify = linuxaio_modify; - backend_poll = linuxaio_poll; - - linuxaio_iocbpmax = 0; - linuxaio_iocbps = 0; - - linuxaio_submits = 0; - linuxaio_submitmax = 0; - linuxaio_submitcnt = 0; - - return EVBACKEND_LINUXAIO; -} - -inline_size -void -linuxaio_destroy (EV_P) -{ - epoll_destroy (EV_A); - linuxaio_free_iocbp (EV_A); - evsys_io_destroy (linuxaio_ctx); /* fails in child, aio context is destroyed */ -} - -ecb_cold -static void -linuxaio_fork (EV_P) -{ - linuxaio_submitcnt = 0; /* all pointers were invalidated */ - linuxaio_free_iocbp (EV_A); /* this frees all iocbs, which is very heavy-handed */ - evsys_io_destroy (linuxaio_ctx); /* fails in child, aio context is destroyed */ - - linuxaio_iteration = 0; /* we start over in the child */ - - while (linuxaio_io_setup (EV_A) < 0) - ev_syserr ("(libev) linuxaio io_setup"); - - /* forking epoll should also effectively unregister all fds from the backend */ - epoll_fork (EV_A); - /* epoll_fork already did this. hopefully */ - /*fd_rearm_all (EV_A);*/ - - ev_io_stop (EV_A_ &linuxaio_epoll_w); - ev_io_set (EV_A_ &linuxaio_epoll_w, backend_fd, EV_READ); - ev_io_start (EV_A_ &linuxaio_epoll_w); -} - diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_poll.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_poll.c deleted file mode 100644 index e5508dd..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_poll.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - * libev poll fd activity backend - * - * Copyright (c) 2007,2008,2009,2010,2011,2016,2019 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -#include - -inline_size -void -array_needsize_pollidx (int *base, int offset, int count) -{ - /* using memset (.., -1, ...) is tempting, we we try - * to be ultraportable - */ - base += offset; - while (count--) - *base++ = -1; -} - -static void -poll_modify (EV_P_ int fd, int oev, int nev) -{ - int idx; - - if (oev == nev) - return; - - array_needsize (int, pollidxs, pollidxmax, fd + 1, array_needsize_pollidx); - - idx = pollidxs [fd]; - - if (idx < 0) /* need to allocate a new pollfd */ - { - pollidxs [fd] = idx = pollcnt++; - array_needsize (struct pollfd, polls, pollmax, pollcnt, array_needsize_noinit); - polls [idx].fd = fd; - } - - assert (polls [idx].fd == fd); - - if (nev) - polls [idx].events = - (nev & EV_READ ? POLLIN : 0) - | (nev & EV_WRITE ? POLLOUT : 0); - else /* remove pollfd */ - { - pollidxs [fd] = -1; - - if (ecb_expect_true (idx < --pollcnt)) - { - polls [idx] = polls [pollcnt]; - pollidxs [polls [idx].fd] = idx; - } - } -} - -static void -poll_poll (EV_P_ ev_tstamp timeout) -{ - struct pollfd *p; - int res; - - EV_RELEASE_CB; - res = poll (polls, pollcnt, EV_TS_TO_MSEC (timeout)); - EV_ACQUIRE_CB; - - if (ecb_expect_false (res < 0)) - { - if (errno == EBADF) - fd_ebadf (EV_A); - else if (errno == ENOMEM && !syserr_cb) - fd_enomem (EV_A); - else if (errno != EINTR) - ev_syserr ("(libev) poll"); - } - else - for (p = polls; res; ++p) - { - assert (("libev: poll returned illegal result, broken BSD kernel?", p < polls + pollcnt)); - - if (ecb_expect_false (p->revents)) /* this expect is debatable */ - { - --res; - - if (ecb_expect_false (p->revents & POLLNVAL)) - { - assert (("libev: poll found invalid fd in poll set", 0)); - fd_kill (EV_A_ p->fd); - } - else - fd_event ( - EV_A_ - p->fd, - (p->revents & (POLLOUT | POLLERR | POLLHUP) ? EV_WRITE : 0) - | (p->revents & (POLLIN | POLLERR | POLLHUP) ? EV_READ : 0) - ); - } - } -} - -inline_size -int -poll_init (EV_P_ int flags) -{ - backend_mintime = EV_TS_CONST (1e-3); - backend_modify = poll_modify; - backend_poll = poll_poll; - - pollidxs = 0; pollidxmax = 0; - polls = 0; pollmax = 0; pollcnt = 0; - - return EVBACKEND_POLL; -} - -inline_size -void -poll_destroy (EV_P) -{ - ev_free (pollidxs); - ev_free (polls); -} - diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_port.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_port.c deleted file mode 100644 index f4cd9d9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_port.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - * libev solaris event port backend - * - * Copyright (c) 2007,2008,2009,2010,2011,2019 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -/* useful reading: - * - * http://bugs.opensolaris.org/view_bug.do?bug_id=6268715 (random results) - * http://bugs.opensolaris.org/view_bug.do?bug_id=6455223 (just totally broken) - * http://bugs.opensolaris.org/view_bug.do?bug_id=6873782 (manpage ETIME) - * http://bugs.opensolaris.org/view_bug.do?bug_id=6874410 (implementation ETIME) - * http://www.mail-archive.com/networking-discuss@opensolaris.org/msg11898.html ETIME vs. nget - * http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libc/port/gen/event_port.c (libc) - * http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/fs/portfs/port.c#1325 (kernel) - */ - -#include -#include -#include -#include -#include -#include - -inline_speed -void -port_associate_and_check (EV_P_ int fd, int ev) -{ - if (0 > - port_associate ( - backend_fd, PORT_SOURCE_FD, fd, - (ev & EV_READ ? POLLIN : 0) - | (ev & EV_WRITE ? POLLOUT : 0), - 0 - ) - ) - { - if (errno == EBADFD) - { - assert (("libev: port_associate found invalid fd", errno != EBADFD)); - fd_kill (EV_A_ fd); - } - else - ev_syserr ("(libev) port_associate"); - } -} - -static void -port_modify (EV_P_ int fd, int oev, int nev) -{ - /* we need to reassociate no matter what, as closes are - * once more silently being discarded. - */ - if (!nev) - { - if (oev) - port_dissociate (backend_fd, PORT_SOURCE_FD, fd); - } - else - port_associate_and_check (EV_A_ fd, nev); -} - -static void -port_poll (EV_P_ ev_tstamp timeout) -{ - int res, i; - struct timespec ts; - uint_t nget = 1; - - /* we initialise this to something we will skip in the loop, as */ - /* port_getn can return with nget unchanged, but no indication */ - /* whether it was the original value or has been updated :/ */ - port_events [0].portev_source = 0; - - EV_RELEASE_CB; - EV_TS_SET (ts, timeout); - res = port_getn (backend_fd, port_events, port_eventmax, &nget, &ts); - EV_ACQUIRE_CB; - - /* port_getn may or may not set nget on error */ - /* so we rely on port_events [0].portev_source not being updated */ - if (res == -1 && errno != ETIME && errno != EINTR) - ev_syserr ("(libev) port_getn (see http://bugs.opensolaris.org/view_bug.do?bug_id=6268715, try LIBEV_FLAGS=3 env variable)"); - - for (i = 0; i < nget; ++i) - { - if (port_events [i].portev_source == PORT_SOURCE_FD) - { - int fd = port_events [i].portev_object; - - fd_event ( - EV_A_ - fd, - (port_events [i].portev_events & (POLLOUT | POLLERR | POLLHUP) ? EV_WRITE : 0) - | (port_events [i].portev_events & (POLLIN | POLLERR | POLLHUP) ? EV_READ : 0) - ); - - fd_change (EV_A_ fd, EV__IOFDSET); - } - } - - if (ecb_expect_false (nget == port_eventmax)) - { - ev_free (port_events); - port_eventmax = array_nextsize (sizeof (port_event_t), port_eventmax, port_eventmax + 1); - port_events = (port_event_t *)ev_malloc (sizeof (port_event_t) * port_eventmax); - } -} - -inline_size -int -port_init (EV_P_ int flags) -{ - /* Initialize the kernel queue */ - if ((backend_fd = port_create ()) < 0) - return 0; - - assert (("libev: PORT_SOURCE_FD must not be zero", PORT_SOURCE_FD)); - - fcntl (backend_fd, F_SETFD, FD_CLOEXEC); /* not sure if necessary, hopefully doesn't hurt */ - - /* if my reading of the opensolaris kernel sources are correct, then - * opensolaris does something very stupid: it checks if the time has already - * elapsed and doesn't round up if that is the case, otherwise it DOES round - * up. Since we can't know what the case is, we need to guess by using a - * "large enough" timeout. Normally, 1e-9 would be correct. - */ - backend_mintime = EV_TS_CONST (1e-3); /* needed to compensate for port_getn returning early */ - backend_modify = port_modify; - backend_poll = port_poll; - - port_eventmax = 64; /* initial number of events receivable per poll */ - port_events = (port_event_t *)ev_malloc (sizeof (port_event_t) * port_eventmax); - - return EVBACKEND_PORT; -} - -inline_size -void -port_destroy (EV_P) -{ - ev_free (port_events); -} - -inline_size -void -port_fork (EV_P) -{ - close (backend_fd); - - while ((backend_fd = port_create ()) < 0) - ev_syserr ("(libev) port"); - - fcntl (backend_fd, F_SETFD, FD_CLOEXEC); - - /* re-register interest in fds */ - fd_rearm_all (EV_A); -} - diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_select.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_select.c deleted file mode 100644 index b862c81..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_select.c +++ /dev/null @@ -1,316 +0,0 @@ -/* - * libev select fd activity backend - * - * Copyright (c) 2007,2008,2009,2010,2011 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -#ifndef _WIN32 -/* for unix systems */ -# include -# ifndef __hpux -/* for REAL unix systems */ -# include -# endif -#endif - -#ifndef EV_SELECT_USE_FD_SET -# ifdef NFDBITS -# define EV_SELECT_USE_FD_SET 0 -# else -# define EV_SELECT_USE_FD_SET 1 -# endif -#endif - -#if EV_SELECT_IS_WINSOCKET -# undef EV_SELECT_USE_FD_SET -# define EV_SELECT_USE_FD_SET 1 -# undef NFDBITS -# define NFDBITS 0 -#endif - -#if !EV_SELECT_USE_FD_SET -# define NFDBYTES (NFDBITS / 8) -#endif - -#include - -static void -select_modify (EV_P_ int fd, int oev, int nev) -{ - if (oev == nev) - return; - - { -#if EV_SELECT_USE_FD_SET - - #if EV_SELECT_IS_WINSOCKET - SOCKET handle = anfds [fd].handle; - #else - int handle = fd; - #endif - - assert (("libev: fd >= FD_SETSIZE passed to fd_set-based select backend", fd < FD_SETSIZE)); - - /* FD_SET is broken on windows (it adds the fd to a set twice or more, - * which eventually leads to overflows). Need to call it only on changes. - */ - #if EV_SELECT_IS_WINSOCKET - if ((oev ^ nev) & EV_READ) - #endif - if (nev & EV_READ) - FD_SET (handle, (fd_set *)vec_ri); - else - FD_CLR (handle, (fd_set *)vec_ri); - - #if EV_SELECT_IS_WINSOCKET - if ((oev ^ nev) & EV_WRITE) - #endif - if (nev & EV_WRITE) - FD_SET (handle, (fd_set *)vec_wi); - else - FD_CLR (handle, (fd_set *)vec_wi); - -#else - - int word = fd / NFDBITS; - fd_mask mask = 1UL << (fd % NFDBITS); - - if (ecb_expect_false (vec_max <= word)) - { - int new_max = word + 1; - - vec_ri = ev_realloc (vec_ri, new_max * NFDBYTES); - vec_ro = ev_realloc (vec_ro, new_max * NFDBYTES); /* could free/malloc */ - vec_wi = ev_realloc (vec_wi, new_max * NFDBYTES); - vec_wo = ev_realloc (vec_wo, new_max * NFDBYTES); /* could free/malloc */ - #ifdef _WIN32 - vec_eo = ev_realloc (vec_eo, new_max * NFDBYTES); /* could free/malloc */ - #endif - - for (; vec_max < new_max; ++vec_max) - ((fd_mask *)vec_ri) [vec_max] = - ((fd_mask *)vec_wi) [vec_max] = 0; - } - - ((fd_mask *)vec_ri) [word] |= mask; - if (!(nev & EV_READ)) - ((fd_mask *)vec_ri) [word] &= ~mask; - - ((fd_mask *)vec_wi) [word] |= mask; - if (!(nev & EV_WRITE)) - ((fd_mask *)vec_wi) [word] &= ~mask; -#endif - } -} - -static void -select_poll (EV_P_ ev_tstamp timeout) -{ - struct timeval tv; - int res; - int fd_setsize; - - EV_RELEASE_CB; - EV_TV_SET (tv, timeout); - -#if EV_SELECT_USE_FD_SET - fd_setsize = sizeof (fd_set); -#else - fd_setsize = vec_max * NFDBYTES; -#endif - - memcpy (vec_ro, vec_ri, fd_setsize); - memcpy (vec_wo, vec_wi, fd_setsize); - -#ifdef _WIN32 - /* pass in the write set as except set. - * the idea behind this is to work around a windows bug that causes - * errors to be reported as an exception and not by setting - * the writable bit. this is so uncontrollably lame. - */ - memcpy (vec_eo, vec_wi, fd_setsize); - res = select (vec_max * NFDBITS, (fd_set *)vec_ro, (fd_set *)vec_wo, (fd_set *)vec_eo, &tv); -#elif EV_SELECT_USE_FD_SET - fd_setsize = anfdmax < FD_SETSIZE ? anfdmax : FD_SETSIZE; - res = select (fd_setsize, (fd_set *)vec_ro, (fd_set *)vec_wo, 0, &tv); -#else - res = select (vec_max * NFDBITS, (fd_set *)vec_ro, (fd_set *)vec_wo, 0, &tv); -#endif - EV_ACQUIRE_CB; - - if (ecb_expect_false (res < 0)) - { - #if EV_SELECT_IS_WINSOCKET - errno = WSAGetLastError (); - #endif - #ifdef WSABASEERR - /* on windows, select returns incompatible error codes, fix this */ - if (errno >= WSABASEERR && errno < WSABASEERR + 1000) - if (errno == WSAENOTSOCK) - errno = EBADF; - else - errno -= WSABASEERR; - #endif - - #ifdef _WIN32 - /* select on windows erroneously returns EINVAL when no fd sets have been - * provided (this is documented). what microsoft doesn't tell you that this bug - * exists even when the fd sets _are_ provided, so we have to check for this bug - * here and emulate by sleeping manually. - * we also get EINVAL when the timeout is invalid, but we ignore this case here - * and assume that EINVAL always means: you have to wait manually. - */ - if (errno == EINVAL) - { - if (timeout) - { - unsigned long ms = EV_TS_TO_MSEC (timeout); - Sleep (ms ? ms : 1); - } - - return; - } - #endif - - if (errno == EBADF) - fd_ebadf (EV_A); - else if (errno == ENOMEM && !syserr_cb) - fd_enomem (EV_A); - else if (errno != EINTR) - ev_syserr ("(libev) select"); - - return; - } - -#if EV_SELECT_USE_FD_SET - - { - int fd; - - for (fd = 0; fd < anfdmax; ++fd) - if (anfds [fd].events) - { - int events = 0; - #if EV_SELECT_IS_WINSOCKET - SOCKET handle = anfds [fd].handle; - #else - int handle = fd; - #endif - - if (FD_ISSET (handle, (fd_set *)vec_ro)) events |= EV_READ; - if (FD_ISSET (handle, (fd_set *)vec_wo)) events |= EV_WRITE; - #ifdef _WIN32 - if (FD_ISSET (handle, (fd_set *)vec_eo)) events |= EV_WRITE; - #endif - - if (ecb_expect_true (events)) - fd_event (EV_A_ fd, events); - } - } - -#else - - { - int word, bit; - for (word = vec_max; word--; ) - { - fd_mask word_r = ((fd_mask *)vec_ro) [word]; - fd_mask word_w = ((fd_mask *)vec_wo) [word]; - #ifdef _WIN32 - word_w |= ((fd_mask *)vec_eo) [word]; - #endif - - if (word_r || word_w) - for (bit = NFDBITS; bit--; ) - { - fd_mask mask = 1UL << bit; - int events = 0; - - events |= word_r & mask ? EV_READ : 0; - events |= word_w & mask ? EV_WRITE : 0; - - if (ecb_expect_true (events)) - fd_event (EV_A_ word * NFDBITS + bit, events); - } - } - } - -#endif -} - -inline_size -int -select_init (EV_P_ int flags) -{ - backend_mintime = EV_TS_CONST (1e-6); - backend_modify = select_modify; - backend_poll = select_poll; - -#if EV_SELECT_USE_FD_SET - vec_ri = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_ri); - vec_ro = ev_malloc (sizeof (fd_set)); - vec_wi = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_wi); - vec_wo = ev_malloc (sizeof (fd_set)); - #ifdef _WIN32 - vec_eo = ev_malloc (sizeof (fd_set)); - #endif -#else - vec_max = 0; - vec_ri = 0; - vec_ro = 0; - vec_wi = 0; - vec_wo = 0; - #ifdef _WIN32 - vec_eo = 0; - #endif -#endif - - return EVBACKEND_SELECT; -} - -inline_size -void -select_destroy (EV_P) -{ - ev_free (vec_ri); - ev_free (vec_ro); - ev_free (vec_wi); - ev_free (vec_wo); - #ifdef _WIN32 - ev_free (vec_eo); - #endif -} - diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_vars.h b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_vars.h deleted file mode 100644 index fb0c583..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_vars.h +++ /dev/null @@ -1,249 +0,0 @@ -/* - * loop member variable declarations - * - * Copyright (c) 2007,2008,2009,2010,2011,2012,2013,2019 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -#define VARx(type,name) VAR(name, type name) - -VARx(ev_tstamp, now_floor) /* last time we refreshed rt_time */ -VARx(ev_tstamp, mn_now) /* monotonic clock "now" */ -VARx(ev_tstamp, rtmn_diff) /* difference realtime - monotonic time */ - -/* for reverse feeding of events */ -VARx(W *, rfeeds) -VARx(int, rfeedmax) -VARx(int, rfeedcnt) - -VAR (pendings, ANPENDING *pendings [NUMPRI]) -VAR (pendingmax, int pendingmax [NUMPRI]) -VAR (pendingcnt, int pendingcnt [NUMPRI]) -VARx(int, pendingpri) /* highest priority currently pending */ -VARx(ev_prepare, pending_w) /* dummy pending watcher */ - -VARx(ev_tstamp, io_blocktime) -VARx(ev_tstamp, timeout_blocktime) - -VARx(int, backend) -VARx(int, activecnt) /* total number of active events ("refcount") */ -VARx(EV_ATOMIC_T, loop_done) /* signal by ev_break */ - -VARx(int, backend_fd) -VARx(ev_tstamp, backend_mintime) /* assumed typical timer resolution */ -VAR (backend_modify, void (*backend_modify)(EV_P_ int fd, int oev, int nev)) -VAR (backend_poll , void (*backend_poll)(EV_P_ ev_tstamp timeout)) - -VARx(ANFD *, anfds) -VARx(int, anfdmax) - -VAR (evpipe, int evpipe [2]) -VARx(ev_io, pipe_w) -VARx(EV_ATOMIC_T, pipe_write_wanted) -VARx(EV_ATOMIC_T, pipe_write_skipped) - -#if !defined(_WIN32) || EV_GENWRAP -VARx(pid_t, curpid) -#endif - -VARx(char, postfork) /* true if we need to recreate kernel state after fork */ - -#if EV_USE_SELECT || EV_GENWRAP -VARx(void *, vec_ri) -VARx(void *, vec_ro) -VARx(void *, vec_wi) -VARx(void *, vec_wo) -#if defined(_WIN32) || EV_GENWRAP -VARx(void *, vec_eo) -#endif -VARx(int, vec_max) -#endif - -#if EV_USE_POLL || EV_GENWRAP -VARx(struct pollfd *, polls) -VARx(int, pollmax) -VARx(int, pollcnt) -VARx(int *, pollidxs) /* maps fds into structure indices */ -VARx(int, pollidxmax) -#endif - -#if EV_USE_EPOLL || EV_GENWRAP -VARx(struct epoll_event *, epoll_events) -VARx(int, epoll_eventmax) -VARx(int *, epoll_eperms) -VARx(int, epoll_epermcnt) -VARx(int, epoll_epermmax) -#endif - -#if EV_USE_LINUXAIO || EV_GENWRAP -VARx(aio_context_t, linuxaio_ctx) -VARx(int, linuxaio_iteration) -VARx(struct aniocb **, linuxaio_iocbps) -VARx(int, linuxaio_iocbpmax) -VARx(struct iocb **, linuxaio_submits) -VARx(int, linuxaio_submitcnt) -VARx(int, linuxaio_submitmax) -VARx(ev_io, linuxaio_epoll_w) -#endif - -#if EV_USE_IOURING || EV_GENWRAP -VARx(int, iouring_fd) -VARx(unsigned, iouring_to_submit); -VARx(int, iouring_entries) -VARx(int, iouring_max_entries) -VARx(void *, iouring_sq_ring) -VARx(void *, iouring_cq_ring) -VARx(void *, iouring_sqes) -VARx(uint32_t, iouring_sq_ring_size) -VARx(uint32_t, iouring_cq_ring_size) -VARx(uint32_t, iouring_sqes_size) -VARx(uint32_t, iouring_sq_head) -VARx(uint32_t, iouring_sq_tail) -VARx(uint32_t, iouring_sq_ring_mask) -VARx(uint32_t, iouring_sq_ring_entries) -VARx(uint32_t, iouring_sq_flags) -VARx(uint32_t, iouring_sq_dropped) -VARx(uint32_t, iouring_sq_array) -VARx(uint32_t, iouring_cq_head) -VARx(uint32_t, iouring_cq_tail) -VARx(uint32_t, iouring_cq_ring_mask) -VARx(uint32_t, iouring_cq_ring_entries) -VARx(uint32_t, iouring_cq_overflow) -VARx(uint32_t, iouring_cq_cqes) -VARx(ev_tstamp, iouring_tfd_to) -VARx(int, iouring_tfd) -VARx(ev_io, iouring_tfd_w) -#endif - -#if EV_USE_KQUEUE || EV_GENWRAP -VARx(pid_t, kqueue_fd_pid) -VARx(struct kevent *, kqueue_changes) -VARx(int, kqueue_changemax) -VARx(int, kqueue_changecnt) -VARx(struct kevent *, kqueue_events) -VARx(int, kqueue_eventmax) -#endif - -#if EV_USE_PORT || EV_GENWRAP -VARx(struct port_event *, port_events) -VARx(int, port_eventmax) -#endif - -#if EV_USE_IOCP || EV_GENWRAP -VARx(HANDLE, iocp) -#endif - -VARx(int *, fdchanges) -VARx(int, fdchangemax) -VARx(int, fdchangecnt) - -VARx(ANHE *, timers) -VARx(int, timermax) -VARx(int, timercnt) - -#if EV_PERIODIC_ENABLE || EV_GENWRAP -VARx(ANHE *, periodics) -VARx(int, periodicmax) -VARx(int, periodiccnt) -#endif - -#if EV_IDLE_ENABLE || EV_GENWRAP -VAR (idles, ev_idle **idles [NUMPRI]) -VAR (idlemax, int idlemax [NUMPRI]) -VAR (idlecnt, int idlecnt [NUMPRI]) -#endif -VARx(int, idleall) /* total number */ - -VARx(struct ev_prepare **, prepares) -VARx(int, preparemax) -VARx(int, preparecnt) - -VARx(struct ev_check **, checks) -VARx(int, checkmax) -VARx(int, checkcnt) - -#if EV_FORK_ENABLE || EV_GENWRAP -VARx(struct ev_fork **, forks) -VARx(int, forkmax) -VARx(int, forkcnt) -#endif - -#if EV_CLEANUP_ENABLE || EV_GENWRAP -VARx(struct ev_cleanup **, cleanups) -VARx(int, cleanupmax) -VARx(int, cleanupcnt) -#endif - -#if EV_ASYNC_ENABLE || EV_GENWRAP -VARx(EV_ATOMIC_T, async_pending) -VARx(struct ev_async **, asyncs) -VARx(int, asyncmax) -VARx(int, asynccnt) -#endif - -#if EV_USE_INOTIFY || EV_GENWRAP -VARx(int, fs_fd) -VARx(ev_io, fs_w) -VARx(char, fs_2625) /* whether we are running in linux 2.6.25 or newer */ -VAR (fs_hash, ANFS fs_hash [EV_INOTIFY_HASHSIZE]) -#endif - -VARx(EV_ATOMIC_T, sig_pending) -#if EV_USE_SIGNALFD || EV_GENWRAP -VARx(int, sigfd) -VARx(ev_io, sigfd_w) -VARx(sigset_t, sigfd_set) -#endif - -#if EV_USE_TIMERFD || EV_GENWRAP -VARx(int, timerfd) /* timerfd for time jump detection */ -VARx(ev_io, timerfd_w) -#endif - -VARx(unsigned int, origflags) /* original loop flags */ - -#if EV_FEATURE_API || EV_GENWRAP -VARx(unsigned int, loop_count) /* total number of loop iterations/blocks */ -VARx(unsigned int, loop_depth) /* #ev_run enters - #ev_run leaves */ - -VARx(void *, userdata) -/* C++ doesn't support the ev_loop_callback typedef here. stinks. */ -VAR (release_cb, void (*release_cb)(EV_P) EV_NOEXCEPT) -VAR (acquire_cb, void (*acquire_cb)(EV_P) EV_NOEXCEPT) -VAR (invoke_cb , ev_loop_callback invoke_cb) -#endif - -#undef VARx - diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_win32.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_win32.c deleted file mode 100644 index 97344c3..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_win32.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * libev win32 compatibility cruft (_not_ a backend) - * - * Copyright (c) 2007,2008,2009 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -#ifdef _WIN32 - -/* note: the comment below could not be substantiated, but what would I care */ -/* MSDN says this is required to handle SIGFPE */ -/* my wild guess would be that using something floating-pointy is required */ -/* for the crt to do something about it */ -volatile double SIGFPE_REQ = 0.0f; - -static SOCKET -ev_tcp_socket (void) -{ -#if EV_USE_WSASOCKET - return WSASocket (AF_INET, SOCK_STREAM, 0, 0, 0, 0); -#else - return socket (AF_INET, SOCK_STREAM, 0); -#endif -} - -/* oh, the humanity! */ -static int -ev_pipe (int filedes [2]) -{ - struct sockaddr_in addr = { 0 }; - int addr_size = sizeof (addr); - struct sockaddr_in adr2; - int adr2_size = sizeof (adr2); - SOCKET listener; - SOCKET sock [2] = { -1, -1 }; - - if ((listener = ev_tcp_socket ()) == INVALID_SOCKET) - return -1; - - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); - addr.sin_port = 0; - - if (bind (listener, (struct sockaddr *)&addr, addr_size)) - goto fail; - - if (getsockname (listener, (struct sockaddr *)&addr, &addr_size)) - goto fail; - - if (listen (listener, 1)) - goto fail; - - if ((sock [0] = ev_tcp_socket ()) == INVALID_SOCKET) - goto fail; - - if (connect (sock [0], (struct sockaddr *)&addr, addr_size)) - goto fail; - - /* TODO: returns INVALID_SOCKET on winsock accept, not < 0. fix it */ - /* when convenient, probably by just removing error checking altogether? */ - if ((sock [1] = accept (listener, 0, 0)) < 0) - goto fail; - - /* windows vista returns fantasy port numbers for sockets: - * example for two interconnected tcp sockets: - * - * (Socket::unpack_sockaddr_in getsockname $sock0)[0] == 53364 - * (Socket::unpack_sockaddr_in getpeername $sock0)[0] == 53363 - * (Socket::unpack_sockaddr_in getsockname $sock1)[0] == 53363 - * (Socket::unpack_sockaddr_in getpeername $sock1)[0] == 53365 - * - * wow! tridirectional sockets! - * - * this way of checking ports seems to work: - */ - if (getpeername (sock [0], (struct sockaddr *)&addr, &addr_size)) - goto fail; - - if (getsockname (sock [1], (struct sockaddr *)&adr2, &adr2_size)) - goto fail; - - errno = WSAEINVAL; - if (addr_size != adr2_size - || addr.sin_addr.s_addr != adr2.sin_addr.s_addr /* just to be sure, I mean, it's windows */ - || addr.sin_port != adr2.sin_port) - goto fail; - - closesocket (listener); - -#if EV_SELECT_IS_WINSOCKET - filedes [0] = EV_WIN32_HANDLE_TO_FD (sock [0]); - filedes [1] = EV_WIN32_HANDLE_TO_FD (sock [1]); -#else - /* when select isn't winsocket, we also expect socket, connect, accept etc. - * to work on fds */ - filedes [0] = sock [0]; - filedes [1] = sock [1]; -#endif - - return 0; - -fail: - closesocket (listener); - - if (sock [0] != INVALID_SOCKET) closesocket (sock [0]); - if (sock [1] != INVALID_SOCKET) closesocket (sock [1]); - - return -1; -} - -#undef pipe -#define pipe(filedes) ev_pipe (filedes) - -#define EV_HAVE_EV_TIME 1 -ev_tstamp -ev_time (void) -{ - FILETIME ft; - ULARGE_INTEGER ui; - - GetSystemTimeAsFileTime (&ft); - ui.u.LowPart = ft.dwLowDateTime; - ui.u.HighPart = ft.dwHighDateTime; - - /* also, msvc cannot convert ulonglong to double... yes, it is that sucky */ - return EV_TS_FROM_USEC (((LONGLONG)(ui.QuadPart - 116444736000000000) * 1e-1)); -} - -#endif - diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_wrap.h b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_wrap.h deleted file mode 100644 index 45d793c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/libev/ev_wrap.h +++ /dev/null @@ -1,272 +0,0 @@ -/* DO NOT EDIT, automatically generated by update_ev_wrap */ -#ifndef EV_WRAP_H -#define EV_WRAP_H -#define acquire_cb ((loop)->acquire_cb) -#define activecnt ((loop)->activecnt) -#define anfdmax ((loop)->anfdmax) -#define anfds ((loop)->anfds) -#define async_pending ((loop)->async_pending) -#define asynccnt ((loop)->asynccnt) -#define asyncmax ((loop)->asyncmax) -#define asyncs ((loop)->asyncs) -#define backend ((loop)->backend) -#define backend_fd ((loop)->backend_fd) -#define backend_mintime ((loop)->backend_mintime) -#define backend_modify ((loop)->backend_modify) -#define backend_poll ((loop)->backend_poll) -#define checkcnt ((loop)->checkcnt) -#define checkmax ((loop)->checkmax) -#define checks ((loop)->checks) -#define cleanupcnt ((loop)->cleanupcnt) -#define cleanupmax ((loop)->cleanupmax) -#define cleanups ((loop)->cleanups) -#define curpid ((loop)->curpid) -#define epoll_epermcnt ((loop)->epoll_epermcnt) -#define epoll_epermmax ((loop)->epoll_epermmax) -#define epoll_eperms ((loop)->epoll_eperms) -#define epoll_eventmax ((loop)->epoll_eventmax) -#define epoll_events ((loop)->epoll_events) -#define evpipe ((loop)->evpipe) -#define fdchangecnt ((loop)->fdchangecnt) -#define fdchangemax ((loop)->fdchangemax) -#define fdchanges ((loop)->fdchanges) -#define forkcnt ((loop)->forkcnt) -#define forkmax ((loop)->forkmax) -#define forks ((loop)->forks) -#define fs_2625 ((loop)->fs_2625) -#define fs_fd ((loop)->fs_fd) -#define fs_hash ((loop)->fs_hash) -#define fs_w ((loop)->fs_w) -#define idleall ((loop)->idleall) -#define idlecnt ((loop)->idlecnt) -#define idlemax ((loop)->idlemax) -#define idles ((loop)->idles) -#define invoke_cb ((loop)->invoke_cb) -#define io_blocktime ((loop)->io_blocktime) -#define iocp ((loop)->iocp) -#define iouring_cq_cqes ((loop)->iouring_cq_cqes) -#define iouring_cq_head ((loop)->iouring_cq_head) -#define iouring_cq_overflow ((loop)->iouring_cq_overflow) -#define iouring_cq_ring ((loop)->iouring_cq_ring) -#define iouring_cq_ring_entries ((loop)->iouring_cq_ring_entries) -#define iouring_cq_ring_mask ((loop)->iouring_cq_ring_mask) -#define iouring_cq_ring_size ((loop)->iouring_cq_ring_size) -#define iouring_cq_tail ((loop)->iouring_cq_tail) -#define iouring_entries ((loop)->iouring_entries) -#define iouring_fd ((loop)->iouring_fd) -#define iouring_max_entries ((loop)->iouring_max_entries) -#define iouring_sq_array ((loop)->iouring_sq_array) -#define iouring_sq_dropped ((loop)->iouring_sq_dropped) -#define iouring_sq_flags ((loop)->iouring_sq_flags) -#define iouring_sq_head ((loop)->iouring_sq_head) -#define iouring_sq_ring ((loop)->iouring_sq_ring) -#define iouring_sq_ring_entries ((loop)->iouring_sq_ring_entries) -#define iouring_sq_ring_mask ((loop)->iouring_sq_ring_mask) -#define iouring_sq_ring_size ((loop)->iouring_sq_ring_size) -#define iouring_sq_tail ((loop)->iouring_sq_tail) -#define iouring_sqes ((loop)->iouring_sqes) -#define iouring_sqes_size ((loop)->iouring_sqes_size) -#define iouring_tfd ((loop)->iouring_tfd) -#define iouring_tfd_to ((loop)->iouring_tfd_to) -#define iouring_tfd_w ((loop)->iouring_tfd_w) -#define iouring_to_submit ((loop)->iouring_to_submit) -#define kqueue_changecnt ((loop)->kqueue_changecnt) -#define kqueue_changemax ((loop)->kqueue_changemax) -#define kqueue_changes ((loop)->kqueue_changes) -#define kqueue_eventmax ((loop)->kqueue_eventmax) -#define kqueue_events ((loop)->kqueue_events) -#define kqueue_fd_pid ((loop)->kqueue_fd_pid) -#define linuxaio_ctx ((loop)->linuxaio_ctx) -#define linuxaio_epoll_w ((loop)->linuxaio_epoll_w) -#define linuxaio_iocbpmax ((loop)->linuxaio_iocbpmax) -#define linuxaio_iocbps ((loop)->linuxaio_iocbps) -#define linuxaio_iteration ((loop)->linuxaio_iteration) -#define linuxaio_submitcnt ((loop)->linuxaio_submitcnt) -#define linuxaio_submitmax ((loop)->linuxaio_submitmax) -#define linuxaio_submits ((loop)->linuxaio_submits) -#define loop_count ((loop)->loop_count) -#define loop_depth ((loop)->loop_depth) -#define loop_done ((loop)->loop_done) -#define mn_now ((loop)->mn_now) -#define now_floor ((loop)->now_floor) -#define origflags ((loop)->origflags) -#define pending_w ((loop)->pending_w) -#define pendingcnt ((loop)->pendingcnt) -#define pendingmax ((loop)->pendingmax) -#define pendingpri ((loop)->pendingpri) -#define pendings ((loop)->pendings) -#define periodiccnt ((loop)->periodiccnt) -#define periodicmax ((loop)->periodicmax) -#define periodics ((loop)->periodics) -#define pipe_w ((loop)->pipe_w) -#define pipe_write_skipped ((loop)->pipe_write_skipped) -#define pipe_write_wanted ((loop)->pipe_write_wanted) -#define pollcnt ((loop)->pollcnt) -#define pollidxmax ((loop)->pollidxmax) -#define pollidxs ((loop)->pollidxs) -#define pollmax ((loop)->pollmax) -#define polls ((loop)->polls) -#define port_eventmax ((loop)->port_eventmax) -#define port_events ((loop)->port_events) -#define postfork ((loop)->postfork) -#define preparecnt ((loop)->preparecnt) -#define preparemax ((loop)->preparemax) -#define prepares ((loop)->prepares) -#define release_cb ((loop)->release_cb) -#define rfeedcnt ((loop)->rfeedcnt) -#define rfeedmax ((loop)->rfeedmax) -#define rfeeds ((loop)->rfeeds) -#define rtmn_diff ((loop)->rtmn_diff) -#define sig_pending ((loop)->sig_pending) -#define sigfd ((loop)->sigfd) -#define sigfd_set ((loop)->sigfd_set) -#define sigfd_w ((loop)->sigfd_w) -#define timeout_blocktime ((loop)->timeout_blocktime) -#define timercnt ((loop)->timercnt) -#define timerfd ((loop)->timerfd) -#define timerfd_w ((loop)->timerfd_w) -#define timermax ((loop)->timermax) -#define timers ((loop)->timers) -#define userdata ((loop)->userdata) -#define vec_eo ((loop)->vec_eo) -#define vec_max ((loop)->vec_max) -#define vec_ri ((loop)->vec_ri) -#define vec_ro ((loop)->vec_ro) -#define vec_wi ((loop)->vec_wi) -#define vec_wo ((loop)->vec_wo) -#else -#undef EV_WRAP_H -#undef acquire_cb -#undef activecnt -#undef anfdmax -#undef anfds -#undef async_pending -#undef asynccnt -#undef asyncmax -#undef asyncs -#undef backend -#undef backend_fd -#undef backend_mintime -#undef backend_modify -#undef backend_poll -#undef checkcnt -#undef checkmax -#undef checks -#undef cleanupcnt -#undef cleanupmax -#undef cleanups -#undef curpid -#undef epoll_epermcnt -#undef epoll_epermmax -#undef epoll_eperms -#undef epoll_eventmax -#undef epoll_events -#undef evpipe -#undef fdchangecnt -#undef fdchangemax -#undef fdchanges -#undef forkcnt -#undef forkmax -#undef forks -#undef fs_2625 -#undef fs_fd -#undef fs_hash -#undef fs_w -#undef idleall -#undef idlecnt -#undef idlemax -#undef idles -#undef invoke_cb -#undef io_blocktime -#undef iocp -#undef iouring_cq_cqes -#undef iouring_cq_head -#undef iouring_cq_overflow -#undef iouring_cq_ring -#undef iouring_cq_ring_entries -#undef iouring_cq_ring_mask -#undef iouring_cq_ring_size -#undef iouring_cq_tail -#undef iouring_entries -#undef iouring_fd -#undef iouring_max_entries -#undef iouring_sq_array -#undef iouring_sq_dropped -#undef iouring_sq_flags -#undef iouring_sq_head -#undef iouring_sq_ring -#undef iouring_sq_ring_entries -#undef iouring_sq_ring_mask -#undef iouring_sq_ring_size -#undef iouring_sq_tail -#undef iouring_sqes -#undef iouring_sqes_size -#undef iouring_tfd -#undef iouring_tfd_to -#undef iouring_tfd_w -#undef iouring_to_submit -#undef kqueue_changecnt -#undef kqueue_changemax -#undef kqueue_changes -#undef kqueue_eventmax -#undef kqueue_events -#undef kqueue_fd_pid -#undef linuxaio_ctx -#undef linuxaio_epoll_w -#undef linuxaio_iocbpmax -#undef linuxaio_iocbps -#undef linuxaio_iteration -#undef linuxaio_submitcnt -#undef linuxaio_submitmax -#undef linuxaio_submits -#undef loop_count -#undef loop_depth -#undef loop_done -#undef mn_now -#undef now_floor -#undef origflags -#undef pending_w -#undef pendingcnt -#undef pendingmax -#undef pendingpri -#undef pendings -#undef periodiccnt -#undef periodicmax -#undef periodics -#undef pipe_w -#undef pipe_write_skipped -#undef pipe_write_wanted -#undef pollcnt -#undef pollidxmax -#undef pollidxs -#undef pollmax -#undef polls -#undef port_eventmax -#undef port_events -#undef postfork -#undef preparecnt -#undef preparemax -#undef prepares -#undef release_cb -#undef rfeedcnt -#undef rfeedmax -#undef rfeeds -#undef rtmn_diff -#undef sig_pending -#undef sigfd -#undef sigfd_set -#undef sigfd_w -#undef timeout_blocktime -#undef timercnt -#undef timerfd -#undef timerfd_w -#undef timermax -#undef timers -#undef userdata -#undef vec_eo -#undef vec_max -#undef vec_ri -#undef vec_ro -#undef vec_wi -#undef vec_wo -#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/.clang-format b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/.clang-format deleted file mode 100644 index 6ad3f63..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/.clang-format +++ /dev/null @@ -1,16 +0,0 @@ ---- -Language: Cpp -BasedOnStyle: WebKit -AllowAllParametersOfDeclarationOnNextLine: false -BinPackArguments: false -BinPackParameters: false -AlignConsecutiveMacros: false -AlignConsecutiveAssignments: false -BreakBeforeBraces: Linux -BraceWrapping: - AfterControlStatement: Never -IndentCaseLabels: true -PointerAlignment: Right -SpaceBeforeParens: ControlStatements -IndentWidth: 4 -... diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/Makefile b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/Makefile deleted file mode 100644 index 2aa5897..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/Makefile +++ /dev/null @@ -1,269 +0,0 @@ - -SHELL = /bin/sh - -# V=0 quiet, V=1 verbose. other values don't work. -V = 0 -V0 = $(V:0=) -Q1 = $(V:1=) -Q = $(Q1:0=@) -ECHO1 = $(V:1=@ :) -ECHO = $(ECHO1:0=@ echo) -NULLCMD = : - -#### Start of system configuration section. #### - -srcdir = . -topdir = /usr/include/ruby-3.2.0 -hdrdir = $(topdir) -arch_hdrdir = /usr/include/x86_64-linux-gnu/ruby-3.2.0 -PATH_SEPARATOR = : -VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby -prefix = $(DESTDIR)/usr -rubysitearchprefix = $(sitearchlibdir)/$(RUBY_BASE_NAME) -rubyarchprefix = $(archlibdir)/$(RUBY_BASE_NAME) -rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) -exec_prefix = $(prefix) -vendorarchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/vendor_ruby -sitearchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/site_ruby -rubyarchhdrdir = $(archincludedir)/$(RUBY_VERSION_NAME) -vendorhdrdir = $(rubyhdrdir)/vendor_ruby -sitehdrdir = $(rubyhdrdir)/site_ruby -rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) -vendorarchdir = $(rubysitearchprefix)/vendor_ruby/$(ruby_version) -vendorlibdir = $(vendordir)/$(ruby_version) -vendordir = $(rubylibprefix)/vendor_ruby -sitearchdir = $(DESTDIR)/usr/local/lib/x86_64-linux-gnu/site_ruby -sitelibdir = $(sitedir)/$(ruby_version) -sitedir = $(DESTDIR)/usr/local/lib/site_ruby -rubyarchdir = $(rubyarchprefix)/$(ruby_version) -rubylibdir = $(rubylibprefix)/$(ruby_version) -sitearchincludedir = $(includedir)/$(sitearch) -archincludedir = $(includedir)/$(arch) -sitearchlibdir = $(libdir)/$(sitearch) -archlibdir = $(libdir)/$(arch) -ridir = $(datarootdir)/$(RI_BASE_NAME) -mandir = $(datarootdir)/man -localedir = $(datarootdir)/locale -libdir = $(exec_prefix)/lib -psdir = $(docdir) -pdfdir = $(docdir) -dvidir = $(docdir) -htmldir = $(docdir) -infodir = $(datarootdir)/info -docdir = $(datarootdir)/doc/$(PACKAGE) -oldincludedir = $(DESTDIR)/usr/include -includedir = $(prefix)/include -runstatedir = $(DESTDIR)/var/run -localstatedir = $(DESTDIR)/var -sharedstatedir = $(prefix)/com -sysconfdir = $(DESTDIR)/etc -datadir = $(datarootdir) -datarootdir = $(prefix)/share -libexecdir = $(exec_prefix)/libexec -sbindir = $(exec_prefix)/sbin -bindir = $(exec_prefix)/bin -archdir = $(rubyarchdir) - - -CC_WRAPPER = -CC = x86_64-linux-gnu-gcc -CXX = x86_64-linux-gnu-g++ -LIBRUBY = $(LIBRUBY_SO) -LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a -LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) -LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static $(MAINLIBS) -empty = -OUTFLAG = -o $(empty) -COUTFLAG = -o $(empty) -CSRCFLAG = $(empty) - -RUBY_EXTCONF_H = -cflags = $(optflags) $(debugflags) $(warnflags) -cxxflags = -optflags = -O3 -fno-fast-math -fno-strict-aliasing -debugflags = -ggdb3 -warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdiv-by-zero -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wold-style-definition -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef -cppflags = -CCDLFLAGS = -fPIC -CFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC $(ARCH_FLAG) -INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) -DEFS = -CPPFLAGS = -DHAVE_UNISTD_H -DHAVE_RB_IO_DESCRIPTOR -DHAVE_LINUX_AIO_ABI_H -DEV_USE_LINUXAIO -DHAVE_LINUX_IO_URING_H -DEV_USE_IOURING -DHAVE_SYS_SELECT_H -DEV_USE_SELECT -DHAVE_SYS_EPOLL_H -DEV_USE_EPOLL -DHAVE_SYS_RESOURCE_H -DHAVE_SYS_RESOURCE_H -DEV_STANDALONE -Wdate-time -D_FORTIFY_SOURCE=3 $(DEFS) $(cppflags) -CXXFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 $(ARCH_FLAG) -ldflags = -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -dldflags = -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -ARCH_FLAG = -DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) -LDSHARED = $(CC) -shared -LDSHAREDXX = $(CXX) -shared -AR = x86_64-linux-gnu-gcc-ar -EXEEXT = - -RUBY_INSTALL_NAME = $(RUBY_BASE_NAME)3.2 -RUBY_SO_NAME = ruby-3.2 -RUBYW_INSTALL_NAME = -RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) -RUBYW_BASE_NAME = rubyw -RUBY_BASE_NAME = ruby - -arch = x86_64-linux-gnu -sitearch = $(arch) -ruby_version = 3.2.0 -ruby = $(bindir)/$(RUBY_BASE_NAME)3.2 -RUBY = $(ruby) -BUILTRUBY = $(bindir)/$(RUBY_BASE_NAME)3.2 -ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h - -RM = rm -f -RM_RF = rm -fr -RMDIRS = rmdir --ignore-fail-on-non-empty -p -MAKEDIRS = /bin/mkdir -p -INSTALL = /usr/bin/install -c -INSTALL_PROG = $(INSTALL) -m 0755 -INSTALL_DATA = $(INSTALL) -m 644 -COPY = cp -TOUCH = exit > - -#### End of system configuration section. #### - -preload = -libpath = . $(archlibdir) -LIBPATH = -L. -L$(archlibdir) -DEFFILE = - -CLEANFILES = mkmf.log -DISTCLEANFILES = -DISTCLEANDIRS = - -extout = -extout_prefix = -target_prefix = -LOCAL_LIBS = -LIBS = $(LIBRUBYARG_SHARED) -lm -lpthread -lc -ORIG_SRCS = bytebuffer.c monitor.c nio4r_ext.c selector.c -SRCS = $(ORIG_SRCS) -OBJS = bytebuffer.o monitor.o nio4r_ext.o selector.o -HDRS = $(srcdir)/libev.h $(srcdir)/nio4r.h -LOCAL_HDRS = -TARGET = nio4r_ext -TARGET_NAME = nio4r_ext -TARGET_ENTRY = Init_$(TARGET_NAME) -DLLIB = $(TARGET).so -EXTSTATIC = -STATIC_LIB = - -TIMESTAMP_DIR = . -BINDIR = $(bindir) -RUBYCOMMONDIR = $(sitedir)$(target_prefix) -RUBYLIBDIR = $(sitelibdir)$(target_prefix) -RUBYARCHDIR = $(sitearchdir)$(target_prefix) -HDRDIR = $(sitehdrdir)$(target_prefix) -ARCHHDRDIR = $(sitearchhdrdir)$(target_prefix) -TARGET_SO_DIR = -TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) -CLEANLIBS = $(TARGET_SO) false -CLEANOBJS = $(OBJS) *.bak -TARGET_SO_DIR_TIMESTAMP = $(TIMESTAMP_DIR)/.sitearchdir.time - -all: $(DLLIB) -static: $(STATIC_LIB) -.PHONY: all install static install-so install-rb -.PHONY: clean clean-so clean-static clean-rb - -clean-static:: -clean-rb-default:: -clean-rb:: -clean-so:: -clean: clean-so clean-static clean-rb-default clean-rb - -$(Q)$(RM_RF) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time - -distclean-rb-default:: -distclean-rb:: -distclean-so:: -distclean-static:: -distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb - -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log - -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) - -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true - -realclean: distclean -install: install-so install-rb - -install-so: $(DLLIB) $(TARGET_SO_DIR_TIMESTAMP) - $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) -clean-static:: - -$(Q)$(RM) $(STATIC_LIB) -install-rb: pre-install-rb do-install-rb install-rb-default -install-rb-default: pre-install-rb-default do-install-rb-default -pre-install-rb: Makefile -pre-install-rb-default: Makefile -do-install-rb: -do-install-rb-default: -pre-install-rb-default: - @$(NULLCMD) -$(TARGET_SO_DIR_TIMESTAMP): - $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) - $(Q) $(TOUCH) $@ - -site-install: site-install-so site-install-rb -site-install-so: install-so -site-install-rb: install-rb - -.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S - -.cc.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cc.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.mm.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.mm.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cxx.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cxx.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cpp.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cpp.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.c.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.c.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.m.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.m.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -$(TARGET_SO): $(OBJS) Makefile - $(ECHO) linking shared-object $(DLLIB) - -$(Q)$(RM) $(@) - $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) - - - -$(OBJS): $(HDRS) $(ruby_headers) diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/bytebuffer.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/bytebuffer.c deleted file mode 100644 index 99e34f2..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/bytebuffer.c +++ /dev/null @@ -1,465 +0,0 @@ -#include "nio4r.h" - -static VALUE mNIO = Qnil; -static VALUE cNIO_ByteBuffer = Qnil; -static VALUE cNIO_ByteBuffer_OverflowError = Qnil; -static VALUE cNIO_ByteBuffer_UnderflowError = Qnil; -static VALUE cNIO_ByteBuffer_MarkUnsetError = Qnil; - -/* Allocator/deallocator */ -static VALUE NIO_ByteBuffer_allocate(VALUE klass); -static void NIO_ByteBuffer_free(void *data); -static size_t NIO_ByteBuffer_memsize(const void *data); - -/* Methods */ -static VALUE NIO_ByteBuffer_initialize(VALUE self, VALUE capacity); -static VALUE NIO_ByteBuffer_clear(VALUE self); -static VALUE NIO_ByteBuffer_get_position(VALUE self); -static VALUE NIO_ByteBuffer_set_position(VALUE self, VALUE new_position); -static VALUE NIO_ByteBuffer_get_limit(VALUE self); -static VALUE NIO_ByteBuffer_set_limit(VALUE self, VALUE new_limit); -static VALUE NIO_ByteBuffer_capacity(VALUE self); -static VALUE NIO_ByteBuffer_remaining(VALUE self); -static VALUE NIO_ByteBuffer_full(VALUE self); -static VALUE NIO_ByteBuffer_get(int argc, VALUE *argv, VALUE self); -static VALUE NIO_ByteBuffer_fetch(VALUE self, VALUE index); -static VALUE NIO_ByteBuffer_put(VALUE self, VALUE string); -static VALUE NIO_ByteBuffer_write_to(VALUE self, VALUE file); -static VALUE NIO_ByteBuffer_read_from(VALUE self, VALUE file); -static VALUE NIO_ByteBuffer_flip(VALUE self); -static VALUE NIO_ByteBuffer_rewind(VALUE self); -static VALUE NIO_ByteBuffer_mark(VALUE self); -static VALUE NIO_ByteBuffer_reset(VALUE self); -static VALUE NIO_ByteBuffer_compact(VALUE self); -static VALUE NIO_ByteBuffer_each(VALUE self); -static VALUE NIO_ByteBuffer_inspect(VALUE self); - -#define MARK_UNSET -1 - -/* Compatibility for Ruby <= 3.1 */ -#ifndef HAVE_RB_IO_DESCRIPTOR -static int -io_descriptor_fallback(VALUE io) -{ - rb_io_t *fptr; - GetOpenFile(io, fptr); - return fptr->fd; -} -#define rb_io_descriptor io_descriptor_fallback -#endif - -static void -io_set_nonblock(VALUE io) -{ - rb_io_t *fptr; - GetOpenFile(io, fptr); - rb_io_set_nonblock(fptr); -} - -void Init_NIO_ByteBuffer() -{ - mNIO = rb_define_module("NIO"); - cNIO_ByteBuffer = rb_define_class_under(mNIO, "ByteBuffer", rb_cObject); - rb_define_alloc_func(cNIO_ByteBuffer, NIO_ByteBuffer_allocate); - - cNIO_ByteBuffer_OverflowError = rb_define_class_under(cNIO_ByteBuffer, "OverflowError", rb_eIOError); - cNIO_ByteBuffer_UnderflowError = rb_define_class_under(cNIO_ByteBuffer, "UnderflowError", rb_eIOError); - cNIO_ByteBuffer_MarkUnsetError = rb_define_class_under(cNIO_ByteBuffer, "MarkUnsetError", rb_eIOError); - - rb_include_module(cNIO_ByteBuffer, rb_mEnumerable); - - rb_define_method(cNIO_ByteBuffer, "initialize", NIO_ByteBuffer_initialize, 1); - rb_define_method(cNIO_ByteBuffer, "clear", NIO_ByteBuffer_clear, 0); - rb_define_method(cNIO_ByteBuffer, "position", NIO_ByteBuffer_get_position, 0); - rb_define_method(cNIO_ByteBuffer, "position=", NIO_ByteBuffer_set_position, 1); - rb_define_method(cNIO_ByteBuffer, "limit", NIO_ByteBuffer_get_limit, 0); - rb_define_method(cNIO_ByteBuffer, "limit=", NIO_ByteBuffer_set_limit, 1); - rb_define_method(cNIO_ByteBuffer, "capacity", NIO_ByteBuffer_capacity, 0); - rb_define_method(cNIO_ByteBuffer, "size", NIO_ByteBuffer_capacity, 0); - rb_define_method(cNIO_ByteBuffer, "remaining", NIO_ByteBuffer_remaining, 0); - rb_define_method(cNIO_ByteBuffer, "full?", NIO_ByteBuffer_full, 0); - rb_define_method(cNIO_ByteBuffer, "get", NIO_ByteBuffer_get, -1); - rb_define_method(cNIO_ByteBuffer, "[]", NIO_ByteBuffer_fetch, 1); - rb_define_method(cNIO_ByteBuffer, "<<", NIO_ByteBuffer_put, 1); - rb_define_method(cNIO_ByteBuffer, "read_from", NIO_ByteBuffer_read_from, 1); - rb_define_method(cNIO_ByteBuffer, "write_to", NIO_ByteBuffer_write_to, 1); - rb_define_method(cNIO_ByteBuffer, "flip", NIO_ByteBuffer_flip, 0); - rb_define_method(cNIO_ByteBuffer, "rewind", NIO_ByteBuffer_rewind, 0); - rb_define_method(cNIO_ByteBuffer, "mark", NIO_ByteBuffer_mark, 0); - rb_define_method(cNIO_ByteBuffer, "reset", NIO_ByteBuffer_reset, 0); - rb_define_method(cNIO_ByteBuffer, "compact", NIO_ByteBuffer_compact, 0); - rb_define_method(cNIO_ByteBuffer, "each", NIO_ByteBuffer_each, 0); - rb_define_method(cNIO_ByteBuffer, "inspect", NIO_ByteBuffer_inspect, 0); -} - -static const rb_data_type_t NIO_ByteBuffer_type = { - "NIO::ByteBuffer", - { - NULL, // Nothing to mark - NIO_ByteBuffer_free, - NIO_ByteBuffer_memsize, - }, - 0, - 0, - RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED -}; - -static VALUE NIO_ByteBuffer_allocate(VALUE klass) -{ - struct NIO_ByteBuffer *bytebuffer = (struct NIO_ByteBuffer *)xmalloc(sizeof(struct NIO_ByteBuffer)); - bytebuffer->buffer = NULL; - return TypedData_Wrap_Struct(klass, &NIO_ByteBuffer_type, bytebuffer); -} - -static void NIO_ByteBuffer_free(void *data) -{ - struct NIO_ByteBuffer *buffer = (struct NIO_ByteBuffer *)data; - if (buffer->buffer) - xfree(buffer->buffer); - xfree(buffer); -} - -static size_t NIO_ByteBuffer_memsize(const void *data) -{ - const struct NIO_ByteBuffer *buffer = (const struct NIO_ByteBuffer *)data; - size_t memsize = sizeof(struct NIO_ByteBuffer); - if (buffer->buffer) - memsize += buffer->capacity; - return memsize; -} - -static VALUE NIO_ByteBuffer_initialize(VALUE self, VALUE capacity) -{ - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - buffer->capacity = NUM2INT(capacity); - buffer->buffer = xmalloc(buffer->capacity); - - NIO_ByteBuffer_clear(self); - - return self; -} - -static VALUE NIO_ByteBuffer_clear(VALUE self) -{ - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - memset(buffer->buffer, 0, buffer->capacity); - - buffer->position = 0; - buffer->limit = buffer->capacity; - buffer->mark = MARK_UNSET; - - return self; -} - -static VALUE NIO_ByteBuffer_get_position(VALUE self) -{ - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - return INT2NUM(buffer->position); -} - -static VALUE NIO_ByteBuffer_set_position(VALUE self, VALUE new_position) -{ - int pos; - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - pos = NUM2INT(new_position); - - if (pos < 0) { - rb_raise(rb_eArgError, "negative position given"); - } - - if (pos > buffer->limit) { - rb_raise(rb_eArgError, "specified position exceeds limit"); - } - - buffer->position = pos; - - if (buffer->mark > buffer->position) { - buffer->mark = MARK_UNSET; - } - - return new_position; -} - -static VALUE NIO_ByteBuffer_get_limit(VALUE self) -{ - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - return INT2NUM(buffer->limit); -} - -static VALUE NIO_ByteBuffer_set_limit(VALUE self, VALUE new_limit) -{ - int lim; - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - lim = NUM2INT(new_limit); - - if (lim < 0) { - rb_raise(rb_eArgError, "negative limit given"); - } - - if (lim > buffer->capacity) { - rb_raise(rb_eArgError, "specified limit exceeds capacity"); - } - - buffer->limit = lim; - - if (buffer->position > lim) { - buffer->position = lim; - } - - if (buffer->mark > lim) { - buffer->mark = MARK_UNSET; - } - - return new_limit; -} - -static VALUE NIO_ByteBuffer_capacity(VALUE self) -{ - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - return INT2NUM(buffer->capacity); -} - -static VALUE NIO_ByteBuffer_remaining(VALUE self) -{ - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - return INT2NUM(buffer->limit - buffer->position); -} - -static VALUE NIO_ByteBuffer_full(VALUE self) -{ - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - return buffer->position == buffer->limit ? Qtrue : Qfalse; -} - -static VALUE NIO_ByteBuffer_get(int argc, VALUE *argv, VALUE self) -{ - int len; - VALUE length, result; - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - rb_scan_args(argc, argv, "01", &length); - - if (length == Qnil) { - len = buffer->limit - buffer->position; - } else { - len = NUM2INT(length); - } - - if (len < 0) { - rb_raise(rb_eArgError, "negative length given"); - } - - if (len > buffer->limit - buffer->position) { - rb_raise(cNIO_ByteBuffer_UnderflowError, "not enough data in buffer"); - } - - result = rb_str_new(buffer->buffer + buffer->position, len); - buffer->position += len; - - return result; -} - -static VALUE NIO_ByteBuffer_fetch(VALUE self, VALUE index) -{ - int i; - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - i = NUM2INT(index); - - if (i < 0) { - rb_raise(rb_eArgError, "negative index given"); - } - - if (i >= buffer->limit) { - rb_raise(rb_eArgError, "specified index exceeds limit"); - } - - return INT2NUM(buffer->buffer[i]); -} - -static VALUE NIO_ByteBuffer_put(VALUE self, VALUE string) -{ - long length; - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - StringValue(string); - length = RSTRING_LEN(string); - - if (length > buffer->limit - buffer->position) { - rb_raise(cNIO_ByteBuffer_OverflowError, "buffer is full"); - } - - memcpy(buffer->buffer + buffer->position, StringValuePtr(string), length); - buffer->position += length; - - return self; -} - -static VALUE NIO_ByteBuffer_read_from(VALUE self, VALUE io) -{ - struct NIO_ByteBuffer *buffer; - ssize_t nbytes, bytes_read; - - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - io = rb_convert_type(io, T_FILE, "IO", "to_io"); - io_set_nonblock(io); - - nbytes = buffer->limit - buffer->position; - if (nbytes == 0) { - rb_raise(cNIO_ByteBuffer_OverflowError, "buffer is full"); - } - - bytes_read = read(rb_io_descriptor(io), buffer->buffer + buffer->position, nbytes); - - if (bytes_read < 0) { - if (errno == EAGAIN) { - return INT2NUM(0); - } else { - rb_sys_fail("write"); - } - } - - buffer->position += bytes_read; - - return SIZET2NUM(bytes_read); -} - -static VALUE NIO_ByteBuffer_write_to(VALUE self, VALUE io) -{ - struct NIO_ByteBuffer *buffer; - ssize_t nbytes, bytes_written; - - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - io = rb_convert_type(io, T_FILE, "IO", "to_io"); - io_set_nonblock(io); - - nbytes = buffer->limit - buffer->position; - if (nbytes == 0) { - rb_raise(cNIO_ByteBuffer_UnderflowError, "no data remaining in buffer"); - } - - bytes_written = write(rb_io_descriptor(io), buffer->buffer + buffer->position, nbytes); - - if (bytes_written < 0) { - if (errno == EAGAIN) { - return INT2NUM(0); - } else { - rb_sys_fail("write"); - } - } - - buffer->position += bytes_written; - - return SIZET2NUM(bytes_written); -} - -static VALUE NIO_ByteBuffer_flip(VALUE self) -{ - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - buffer->limit = buffer->position; - buffer->position = 0; - buffer->mark = MARK_UNSET; - - return self; -} - -static VALUE NIO_ByteBuffer_rewind(VALUE self) -{ - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - buffer->position = 0; - buffer->mark = MARK_UNSET; - - return self; -} - -static VALUE NIO_ByteBuffer_mark(VALUE self) -{ - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - buffer->mark = buffer->position; - return self; -} - -static VALUE NIO_ByteBuffer_reset(VALUE self) -{ - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - if (buffer->mark < 0) { - rb_raise(cNIO_ByteBuffer_MarkUnsetError, "mark has not been set"); - } else { - buffer->position = buffer->mark; - } - - return self; -} - -static VALUE NIO_ByteBuffer_compact(VALUE self) -{ - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - memmove(buffer->buffer, buffer->buffer + buffer->position, buffer->limit - buffer->position); - buffer->position = buffer->limit - buffer->position; - buffer->limit = buffer->capacity; - - return self; -} - -static VALUE NIO_ByteBuffer_each(VALUE self) -{ - int i; - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - if (rb_block_given_p()) { - for (i = 0; i < buffer->limit; i++) { - rb_yield(INT2NUM(buffer->buffer[i])); - } - } else { - rb_raise(rb_eArgError, "no block given"); - } - - return self; -} - -static VALUE NIO_ByteBuffer_inspect(VALUE self) -{ - struct NIO_ByteBuffer *buffer; - TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer); - - return rb_sprintf( - "#<%s:%p @position=%d @limit=%d @capacity=%d>", - rb_class2name(CLASS_OF(self)), - (void *)self, - buffer->position, - buffer->limit, - buffer->capacity); -} diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/extconf.rb b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/extconf.rb deleted file mode 100644 index b4ae112..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/extconf.rb +++ /dev/null @@ -1,53 +0,0 @@ -# frozen_string_literal: true - -# Released under the MIT License. -# Copyright, 2011-2020, by Tony Arcieri. -# Copyright, 2014, by Hiroshi Shibata. -# Copyright, 2014, by Sergey Avseyev. -# Copyright, 2015, by Daniel Berger. -# Copyright, 2017, by Jun Aruga. -# Copyright, 2017, by Usaku Nakamura. -# Copyright, 2017, by Lars Kanis. -# Copyright, 2019-2023, by Samuel Williams. -# Copyright, 2020, by Gregory Longtin. -# Copyright, 2020, by Boaz Segev. -# Copyright, 2020, by Joao Fernandes. -# Copyright, 2021, by Jeffrey Martin. - -require "rubygems" - -# Write a dummy Makefile on Windows because we use the pure Ruby implementation there -if Gem.win_platform? - begin - require "devkit" if RUBY_PLATFORM.include?("mingw") - rescue LoadError => e - end - File.write("Makefile", "all install::\n") - File.write("nio4r_ext.so", "") - exit -end - -require "mkmf" - -have_header("unistd.h") -have_func("rb_io_descriptor") - -$defs << "-DEV_USE_LINUXAIO" if have_header("linux/aio_abi.h") -$defs << "-DEV_USE_IOURING" if have_header("linux/io_uring.h") -$defs << "-DEV_USE_SELECT" if have_header("sys/select.h") -$defs << "-DEV_USE_POLL" if have_type("port_event_t", "poll.h") -$defs << "-DEV_USE_EPOLL" if have_header("sys/epoll.h") -$defs << "-DEV_USE_KQUEUE" if have_header("sys/event.h") && have_header("sys/queue.h") -$defs << "-DEV_USE_PORT" if have_type("port_event_t", "port.h") -$defs << "-DHAVE_SYS_RESOURCE_H" if have_header("sys/resource.h") - -$defs << "-DEV_STANDALONE" # prevent libev from assuming "config.h" exists - -CONFIG["optflags"] << " -fno-strict-aliasing" unless RUBY_PLATFORM =~ /mswin/ - -if RUBY_PLATFORM =~ /darwin/ - $DLDFLAGS.gsub!(/\-arch\s+[^\s]+/, "") -end - -dir_config "nio4r_ext" -create_makefile "nio4r_ext" diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/libev.h b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/libev.h deleted file mode 100644 index 4076348..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/libev.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifdef _WIN32 -#define EV_SELECT_IS_WINSOCKET 1 -#define EV_USE_MONOTONIC 0 -#define EV_USE_REALTIME 0 -#endif - -#include "../libev/ev.h" diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/monitor.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/monitor.c deleted file mode 100644 index cb44d44..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/monitor.c +++ /dev/null @@ -1,344 +0,0 @@ -/* - * Copyright (c) 2011 Tony Arcieri. Distributed under the MIT License. See - * LICENSE.txt for further details. - */ - -#include "nio4r.h" -#include - -static VALUE mNIO = Qnil; -static VALUE cNIO_Monitor = Qnil; - -/* Allocator/deallocator */ -static VALUE NIO_Monitor_allocate(VALUE klass); -static void NIO_Monitor_mark(void *data); -static size_t NIO_Monitor_memsize(const void *data); - -/* Methods */ -static VALUE NIO_Monitor_initialize(VALUE self, VALUE selector, VALUE io, VALUE interests); -static VALUE NIO_Monitor_close(int argc, VALUE *argv, VALUE self); -static VALUE NIO_Monitor_is_closed(VALUE self); -static VALUE NIO_Monitor_io(VALUE self); -static VALUE NIO_Monitor_interests(VALUE self); -static VALUE NIO_Monitor_set_interests(VALUE self, VALUE interests); -static VALUE NIO_Monitor_add_interest(VALUE self, VALUE interest); -static VALUE NIO_Monitor_remove_interest(VALUE self, VALUE interest); -static VALUE NIO_Monitor_selector(VALUE self); -static VALUE NIO_Monitor_is_readable(VALUE self); -static VALUE NIO_Monitor_is_writable(VALUE self); -static VALUE NIO_Monitor_value(VALUE self); -static VALUE NIO_Monitor_set_value(VALUE self, VALUE obj); -static VALUE NIO_Monitor_readiness(VALUE self); - -/* Internal C functions */ -static int NIO_Monitor_symbol2interest(VALUE interests); -static void NIO_Monitor_update_interests(VALUE self, int interests); - -/* Compatibility for Ruby <= 3.1 */ -#ifndef HAVE_RB_IO_DESCRIPTOR -static int -io_descriptor_fallback(VALUE io) -{ - rb_io_t *fptr; - GetOpenFile(io, fptr); - return fptr->fd; -} -#define rb_io_descriptor io_descriptor_fallback -#endif - -/* Monitor control how a channel is being waited for by a monitor */ -void Init_NIO_Monitor() -{ - mNIO = rb_define_module("NIO"); - cNIO_Monitor = rb_define_class_under(mNIO, "Monitor", rb_cObject); - rb_define_alloc_func(cNIO_Monitor, NIO_Monitor_allocate); - - rb_define_method(cNIO_Monitor, "initialize", NIO_Monitor_initialize, 3); - rb_define_method(cNIO_Monitor, "close", NIO_Monitor_close, -1); - rb_define_method(cNIO_Monitor, "closed?", NIO_Monitor_is_closed, 0); - rb_define_method(cNIO_Monitor, "io", NIO_Monitor_io, 0); - rb_define_method(cNIO_Monitor, "interests", NIO_Monitor_interests, 0); - rb_define_method(cNIO_Monitor, "interests=", NIO_Monitor_set_interests, 1); - rb_define_method(cNIO_Monitor, "add_interest", NIO_Monitor_add_interest, 1); - rb_define_method(cNIO_Monitor, "remove_interest", NIO_Monitor_remove_interest, 1); - rb_define_method(cNIO_Monitor, "selector", NIO_Monitor_selector, 0); - rb_define_method(cNIO_Monitor, "value", NIO_Monitor_value, 0); - rb_define_method(cNIO_Monitor, "value=", NIO_Monitor_set_value, 1); - rb_define_method(cNIO_Monitor, "readiness", NIO_Monitor_readiness, 0); - rb_define_method(cNIO_Monitor, "readable?", NIO_Monitor_is_readable, 0); - rb_define_method(cNIO_Monitor, "writable?", NIO_Monitor_is_writable, 0); - rb_define_method(cNIO_Monitor, "writeable?", NIO_Monitor_is_writable, 0); -} - -static const rb_data_type_t NIO_Monitor_type = { - "NIO::Monitor", - { - NIO_Monitor_mark, - RUBY_TYPED_DEFAULT_FREE, - NIO_Monitor_memsize, - }, - 0, - 0, - RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED -}; - -static VALUE NIO_Monitor_allocate(VALUE klass) -{ - struct NIO_Monitor *monitor = (struct NIO_Monitor *)xmalloc(sizeof(struct NIO_Monitor)); - assert(monitor); - *monitor = (struct NIO_Monitor){.self = Qnil}; - return TypedData_Wrap_Struct(klass, &NIO_Monitor_type, monitor); -} - -static void NIO_Monitor_mark(void *data) -{ - struct NIO_Monitor *monitor = (struct NIO_Monitor *)data; - rb_gc_mark(monitor->self); -} - -static size_t NIO_Monitor_memsize(const void *data) -{ - const struct NIO_Monitor *monitor = (const struct NIO_Monitor *)data; - return sizeof(*monitor); -} - -static VALUE NIO_Monitor_initialize(VALUE self, VALUE io, VALUE interests, VALUE selector_obj) -{ - struct NIO_Monitor *monitor; - struct NIO_Selector *selector; - ID interests_id; - - interests_id = SYM2ID(interests); - - TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); - - if (interests_id == rb_intern("r")) { - monitor->interests = EV_READ; - } else if (interests_id == rb_intern("w")) { - monitor->interests = EV_WRITE; - } else if (interests_id == rb_intern("rw")) { - monitor->interests = EV_READ | EV_WRITE; - } else { - rb_raise(rb_eArgError, "invalid event type %s (must be :r, :w, or :rw)", RSTRING_PTR(rb_funcall(interests, rb_intern("inspect"), 0))); - } - - int descriptor = rb_io_descriptor(rb_convert_type(io, T_FILE, "IO", "to_io")); - ev_io_init(&monitor->ev_io, NIO_Selector_monitor_callback, descriptor, monitor->interests); - - rb_ivar_set(self, rb_intern("io"), io); - rb_ivar_set(self, rb_intern("interests"), interests); - rb_ivar_set(self, rb_intern("selector"), selector_obj); - - selector = NIO_Selector_unwrap(selector_obj); - - RB_OBJ_WRITE(self, &monitor->self, self); - monitor->ev_io.data = (void *)monitor; - - /* We can safely hang onto this as we also hang onto a reference to the - object where it originally came from */ - monitor->selector = selector; - - if (monitor->interests) { - ev_io_start(selector->ev_loop, &monitor->ev_io); - } - - return Qnil; -} - -static VALUE NIO_Monitor_close(int argc, VALUE *argv, VALUE self) -{ - VALUE deregister, selector; - struct NIO_Monitor *monitor; - TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); - - rb_scan_args(argc, argv, "01", &deregister); - selector = rb_ivar_get(self, rb_intern("selector")); - - if (selector != Qnil) { - /* if ev_loop is 0, it means that the loop has been stopped already (see NIO_Selector_shutdown) */ - if (monitor->interests && monitor->selector->ev_loop) { - ev_io_stop(monitor->selector->ev_loop, &monitor->ev_io); - } - - monitor->selector = 0; - rb_ivar_set(self, rb_intern("selector"), Qnil); - - /* Default value is true */ - if (deregister == Qtrue || deregister == Qnil) { - rb_funcall(selector, rb_intern("deregister"), 1, rb_ivar_get(self, rb_intern("io"))); - } - } - - return Qnil; -} - -static VALUE NIO_Monitor_is_closed(VALUE self) -{ - struct NIO_Monitor *monitor; - TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); - - return monitor->selector == 0 ? Qtrue : Qfalse; -} - -static VALUE NIO_Monitor_io(VALUE self) -{ - return rb_ivar_get(self, rb_intern("io")); -} - -static VALUE NIO_Monitor_interests(VALUE self) -{ - return rb_ivar_get(self, rb_intern("interests")); -} - -static VALUE NIO_Monitor_set_interests(VALUE self, VALUE interests) -{ - if (NIL_P(interests)) { - NIO_Monitor_update_interests(self, 0); - } else { - NIO_Monitor_update_interests(self, NIO_Monitor_symbol2interest(interests)); - } - - return rb_ivar_get(self, rb_intern("interests")); -} - -static VALUE NIO_Monitor_add_interest(VALUE self, VALUE interest) -{ - struct NIO_Monitor *monitor; - TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); - - interest = monitor->interests | NIO_Monitor_symbol2interest(interest); - NIO_Monitor_update_interests(self, (int)interest); - - return rb_ivar_get(self, rb_intern("interests")); -} - -static VALUE NIO_Monitor_remove_interest(VALUE self, VALUE interest) -{ - struct NIO_Monitor *monitor; - TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); - - interest = monitor->interests & ~NIO_Monitor_symbol2interest(interest); - NIO_Monitor_update_interests(self, (int)interest); - - return rb_ivar_get(self, rb_intern("interests")); -} - -static VALUE NIO_Monitor_selector(VALUE self) -{ - return rb_ivar_get(self, rb_intern("selector")); -} - -static VALUE NIO_Monitor_value(VALUE self) -{ - return rb_ivar_get(self, rb_intern("value")); -} - -static VALUE NIO_Monitor_set_value(VALUE self, VALUE obj) -{ - return rb_ivar_set(self, rb_intern("value"), obj); -} - -static VALUE NIO_Monitor_readiness(VALUE self) -{ - struct NIO_Monitor *monitor; - TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); - - if ((monitor->revents & (EV_READ | EV_WRITE)) == (EV_READ | EV_WRITE)) { - return ID2SYM(rb_intern("rw")); - } else if (monitor->revents & EV_READ) { - return ID2SYM(rb_intern("r")); - } else if (monitor->revents & EV_WRITE) { - return ID2SYM(rb_intern("w")); - } else { - return Qnil; - } -} - -static VALUE NIO_Monitor_is_readable(VALUE self) -{ - struct NIO_Monitor *monitor; - TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); - - if (monitor->revents & EV_READ) { - return Qtrue; - } else { - return Qfalse; - } -} - -static VALUE NIO_Monitor_is_writable(VALUE self) -{ - struct NIO_Monitor *monitor; - TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); - - if (monitor->revents & EV_WRITE) { - return Qtrue; - } else { - return Qfalse; - } -} - -/* Internal C functions */ - -static int NIO_Monitor_symbol2interest(VALUE interests) -{ - ID interests_id; - interests_id = SYM2ID(interests); - - if (interests_id == rb_intern("r")) { - return EV_READ; - } else if (interests_id == rb_intern("w")) { - return EV_WRITE; - } else if (interests_id == rb_intern("rw")) { - return EV_READ | EV_WRITE; - } else { - rb_raise(rb_eArgError, "invalid interest type %s (must be :r, :w, or :rw)", RSTRING_PTR(rb_funcall(interests, rb_intern("inspect"), 0))); - } -} - -static void NIO_Monitor_update_interests(VALUE self, int interests) -{ - ID interests_id; - struct NIO_Monitor *monitor; - TypedData_Get_Struct(self, struct NIO_Monitor, &NIO_Monitor_type, monitor); - - if (NIO_Monitor_is_closed(self) == Qtrue) { - rb_raise(rb_eEOFError, "monitor is closed"); - } - - if (interests) { - switch (interests) { - case EV_READ: - interests_id = rb_intern("r"); - break; - case EV_WRITE: - interests_id = rb_intern("w"); - break; - case EV_READ | EV_WRITE: - interests_id = rb_intern("rw"); - break; - default: - rb_raise(rb_eRuntimeError, "bogus NIO_Monitor_update_interests! (%d)", interests); - } - - rb_ivar_set(self, rb_intern("interests"), ID2SYM(interests_id)); - } else { - rb_ivar_set(self, rb_intern("interests"), Qnil); - } - - if (monitor->interests != interests) { - // If the monitor currently has interests, we should stop it. - if (monitor->interests) { - ev_io_stop(monitor->selector->ev_loop, &monitor->ev_io); - } - - // Assign the interests we are now monitoring for: - monitor->interests = interests; - ev_io_set(&monitor->ev_io, monitor->ev_io.fd, monitor->interests); - - // If we are interested in events, schedule the monitor back into the event loop: - if (monitor->interests) { - ev_io_start(monitor->selector->ev_loop, &monitor->ev_io); - } - } -} diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r.h b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r.h deleted file mode 100644 index dc65e91..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2011 Tony Arcieri. Distributed under the MIT License. See - * LICENSE.txt for further details. - */ - -#ifndef NIO4R_H -#define NIO4R_H - -#include "libev.h" -#include "ruby.h" -#include "ruby/io.h" - -struct NIO_Selector { - struct ev_loop *ev_loop; - struct ev_timer timer; /* for timeouts */ - struct ev_io wakeup; - - int ready_count; - int closed, selecting; - int wakeup_reader, wakeup_writer; - volatile int wakeup_fired; - - VALUE ready_array; -}; - -struct NIO_callback_data { - VALUE *monitor; - struct NIO_Selector *selector; -}; - -struct NIO_Monitor { - VALUE self; - int interests, revents; - struct ev_io ev_io; - struct NIO_Selector *selector; -}; - -struct NIO_ByteBuffer { - char *buffer; - int position, limit, capacity, mark; -}; - -struct NIO_Selector *NIO_Selector_unwrap(VALUE selector); - -/* Thunk between libev callbacks in NIO::Monitors and NIO::Selectors */ -void NIO_Selector_monitor_callback(struct ev_loop *ev_loop, struct ev_io *io, int revents); - -#endif /* NIO4R_H */ diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r_ext.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r_ext.c deleted file mode 100644 index d2c2cb7..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/nio4r_ext.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2011-2017 Tony Arcieri. Distributed under the MIT License. - * See LICENSE.txt for further details. - */ - -#include "../libev/ev.c" -#include "nio4r.h" - -void Init_NIO_Selector(); -void Init_NIO_Monitor(); -void Init_NIO_ByteBuffer(); - -void Init_nio4r_ext() -{ - #ifdef HAVE_RB_EXT_RACTOR_SAFE - rb_ext_ractor_safe(true); - #endif - - ev_set_allocator(xrealloc); - - Init_NIO_Selector(); - Init_NIO_Monitor(); - Init_NIO_ByteBuffer(); -} diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/ByteBuffer.java b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/ByteBuffer.java deleted file mode 100644 index 8764b7c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/ByteBuffer.java +++ /dev/null @@ -1,295 +0,0 @@ -package org.nio4r; - -import java.io.IOException; -import java.io.Serializable; -import java.nio.channels.Channel; -import java.nio.channels.SelectableChannel; -import java.nio.channels.ReadableByteChannel; -import java.nio.channels.WritableByteChannel; -import java.nio.BufferOverflowException; -import java.nio.BufferUnderflowException; -import java.nio.InvalidMarkException; - -import org.jruby.Ruby; -import org.jruby.RubyClass; -import org.jruby.RubyIO; -import org.jruby.RubyNumeric; -import org.jruby.RubyObject; -import org.jruby.RubyString; -import org.jruby.anno.JRubyMethod; -import org.jruby.exceptions.RaiseException; -import org.jruby.runtime.ThreadContext; -import org.jruby.runtime.builtin.IRubyObject; -import org.jruby.runtime.Block; - -/* -created by Upekshej - */ -public class ByteBuffer extends RubyObject { - private static final long serialVersionUID = -6903439483039149324L; - private transient java.nio.ByteBuffer byteBuffer; - - public static RaiseException newOverflowError(ThreadContext context, String message) { - RubyClass klass = context.runtime.getModule("NIO").getClass("ByteBuffer").getClass("OverflowError"); - return context.runtime.newRaiseException(klass, message); - } - - public static RaiseException newUnderflowError(ThreadContext context, String message) { - RubyClass klass = context.runtime.getModule("NIO").getClass("ByteBuffer").getClass("UnderflowError"); - return context.runtime.newRaiseException(klass, message); - } - - public static RaiseException newMarkUnsetError(ThreadContext context, String message) { - RubyClass klass = context.runtime.getModule("NIO").getClass("ByteBuffer").getClass("MarkUnsetError"); - return context.runtime.newRaiseException(klass, message); - } - - public ByteBuffer(final Ruby ruby, RubyClass rubyClass) { - super(ruby, rubyClass); - } - - @JRubyMethod - public IRubyObject initialize(ThreadContext context, IRubyObject capacity) { - this.byteBuffer = java.nio.ByteBuffer.allocate(RubyNumeric.num2int(capacity)); - return this; - } - - @JRubyMethod - public IRubyObject clear(ThreadContext context) { - this.byteBuffer.clear(); - return this; - } - - @JRubyMethod(name = "position") - public IRubyObject getPosition(ThreadContext context) { - return context.getRuntime().newFixnum(this.byteBuffer.position()); - } - - @JRubyMethod(name = "position=") - public IRubyObject setPosition(ThreadContext context, IRubyObject newPosition) { - int pos = RubyNumeric.num2int(newPosition); - - if(pos < 0) { - throw context.runtime.newArgumentError("negative position given"); - } - - if(pos > this.byteBuffer.limit()) { - throw context.runtime.newArgumentError("specified position exceeds limit"); - } - - try { - this.byteBuffer.position(pos); - return newPosition; - } catch(IllegalArgumentException e) { - throw context.runtime.newArgumentError(e.getLocalizedMessage()); - } - } - - @JRubyMethod(name = "limit") - public IRubyObject getLimit(ThreadContext context) { - return context.getRuntime().newFixnum(this.byteBuffer.limit()); - } - - @JRubyMethod(name = "limit=") - public IRubyObject setLimit(ThreadContext context, IRubyObject newLimit) { - int lim = RubyNumeric.num2int(newLimit); - - if(lim < 0) { - throw context.runtime.newArgumentError("negative limit given"); - } - - if(lim > this.byteBuffer.capacity()) { - throw context.runtime.newArgumentError("specified limit exceeds capacity"); - } - - try { - this.byteBuffer.limit(lim); - return newLimit; - } catch(IllegalArgumentException e) { - throw context.runtime.newArgumentError(e.getLocalizedMessage()); - } - } - - @JRubyMethod(name = {"capacity", "size"}) - public IRubyObject capacity(ThreadContext context) { - return context.getRuntime().newFixnum(this.byteBuffer.capacity()); - } - - @JRubyMethod - public IRubyObject remaining(ThreadContext context) { - return context.getRuntime().newFixnum(this.byteBuffer.remaining()); - } - - @JRubyMethod(name = "full?") - public IRubyObject isFull(ThreadContext context) { - if (this.byteBuffer.hasRemaining()) { - return context.getRuntime().getFalse(); - } else { - return context.getRuntime().getTrue(); - } - } - - @JRubyMethod - public IRubyObject get(ThreadContext context) { - return this.get(context, context.getRuntime().newFixnum(this.byteBuffer.remaining())); - } - - @JRubyMethod - public IRubyObject get(ThreadContext context, IRubyObject length) { - int len = RubyNumeric.num2int(length); - byte[] bytes = new byte[len]; - - try { - this.byteBuffer.get(bytes); - } catch(BufferUnderflowException e) { - throw ByteBuffer.newUnderflowError(context, "not enough data in buffer"); - } - - return RubyString.newString(context.getRuntime(), bytes); - } - - @JRubyMethod(name = "[]") - public IRubyObject fetch(ThreadContext context, IRubyObject index) { - int i = RubyNumeric.num2int(index); - - if(i < 0) { - throw context.runtime.newArgumentError("negative index given"); - } - - if(i >= this.byteBuffer.limit()) { - throw context.runtime.newArgumentError("index exceeds limit"); - } - - return context.getRuntime().newFixnum(this.byteBuffer.get(i)); - } - - @JRubyMethod(name = "<<") - public IRubyObject put(ThreadContext context, IRubyObject str) { - try { - this.byteBuffer.put(str.convertToString().getByteList().bytes()); - } catch(BufferOverflowException e) { - throw ByteBuffer.newOverflowError(context, "buffer is full"); - } - - return this; - } - - @JRubyMethod(name = "read_from") - public IRubyObject readFrom(ThreadContext context, IRubyObject io) { - Ruby runtime = context.runtime; - Channel channel = RubyIO.convertToIO(context, io).getChannel(); - - if(!this.byteBuffer.hasRemaining()) { - throw ByteBuffer.newOverflowError(context, "buffer is full"); - } - - if(!(channel instanceof ReadableByteChannel) || !(channel instanceof SelectableChannel)) { - throw runtime.newArgumentError("unsupported IO object: " + io.getType().toString()); - } - - try { - ((SelectableChannel)channel).configureBlocking(false); - } catch(IOException ie) { - throw runtime.newIOError(ie.getLocalizedMessage()); - } - - try { - int bytesRead = ((ReadableByteChannel)channel).read(this.byteBuffer); - - if(bytesRead >= 0) { - return runtime.newFixnum(bytesRead); - } else { - throw runtime.newEOFError(); - } - } catch(IOException ie) { - throw runtime.newIOError(ie.getLocalizedMessage()); - } - } - - @JRubyMethod(name = "write_to") - public IRubyObject writeTo(ThreadContext context, IRubyObject io) { - Ruby runtime = context.runtime; - Channel channel = RubyIO.convertToIO(context, io).getChannel(); - - if(!this.byteBuffer.hasRemaining()) { - throw ByteBuffer.newUnderflowError(context, "not enough data in buffer"); - } - - if(!(channel instanceof WritableByteChannel) || !(channel instanceof SelectableChannel)) { - throw runtime.newArgumentError("unsupported IO object: " + io.getType().toString()); - } - - try { - ((SelectableChannel)channel).configureBlocking(false); - } catch(IOException ie) { - throw runtime.newIOError(ie.getLocalizedMessage()); - } - - try { - int bytesWritten = ((WritableByteChannel)channel).write(this.byteBuffer); - - if(bytesWritten >= 0) { - return runtime.newFixnum(bytesWritten); - } else { - throw runtime.newEOFError(); - } - } catch(IOException ie) { - throw runtime.newIOError(ie.getLocalizedMessage()); - } - } - - @JRubyMethod - public IRubyObject flip(ThreadContext context) { - this.byteBuffer.flip(); - return this; - } - - @JRubyMethod - public IRubyObject rewind(ThreadContext context) { - this.byteBuffer.rewind(); - return this; - } - - @JRubyMethod - public IRubyObject mark(ThreadContext context) { - this.byteBuffer.mark(); - return this; - } - - @JRubyMethod - public IRubyObject reset(ThreadContext context) { - try { - this.byteBuffer.reset(); - return this; - } catch(InvalidMarkException ie) { - throw ByteBuffer.newMarkUnsetError(context, "mark has not been set"); - } - } - - @JRubyMethod - public IRubyObject compact(ThreadContext context) { - this.byteBuffer.compact(); - return this; - } - - @JRubyMethod - public IRubyObject each(ThreadContext context, Block block) { - for(int i = 0; i < this.byteBuffer.limit(); i++) { - block.call(context, context.getRuntime().newFixnum(this.byteBuffer.get(i))); - } - - return this; - } - - @JRubyMethod - public IRubyObject inspect(ThreadContext context) { - return context.runtime.newString(String.format( - "#<%s:0x%x @position=%d @limit=%d @capacity=%d>", - this.getType().toString(), - System.identityHashCode(this), - this.byteBuffer.position(), - this.byteBuffer.limit(), - this.byteBuffer.capacity() - )); - } -} diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Monitor.java b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Monitor.java deleted file mode 100644 index bfe5d1c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Monitor.java +++ /dev/null @@ -1,176 +0,0 @@ -package org.nio4r; - -import java.nio.channels.Channel; -import java.nio.channels.SelectableChannel; -import java.nio.channels.SelectionKey; - -import org.jruby.Ruby; -import org.jruby.RubyClass; -import org.jruby.RubyIO; -import org.jruby.RubyObject; -import org.jruby.anno.JRubyMethod; -import org.jruby.runtime.ThreadContext; -import org.jruby.runtime.builtin.IRubyObject; - -public class Monitor extends RubyObject { - private static final long serialVersionUID = -3733782997115074794L; - private transient SelectionKey key; - private RubyIO io; - private transient IRubyObject interests, selector, value, closed; - - public Monitor(final Ruby ruby, RubyClass rubyClass) { - super(ruby, rubyClass); - } - - @JRubyMethod - public IRubyObject initialize(ThreadContext context, IRubyObject selectable, IRubyObject interests, IRubyObject selector) { - this.io = RubyIO.convertToIO(context, selectable); - this.interests = interests; - this.selector = selector; - - this.value = context.nil; - this.closed = context.getRuntime().getFalse(); - - return context.nil; - } - - public void setSelectionKey(SelectionKey key) { - this.key = key; - key.attach(this); - } - - @JRubyMethod - public IRubyObject io(ThreadContext context) { - return io; - } - - @JRubyMethod - public IRubyObject selector(ThreadContext context) { - return selector; - } - - @JRubyMethod(name = "interests") - public IRubyObject getInterests(ThreadContext context) { - return interests; - } - - @JRubyMethod(name = "interests=") - public IRubyObject setInterests(ThreadContext context, IRubyObject interests) { - if(this.closed == context.getRuntime().getTrue()) { - throw context.getRuntime().newEOFError("monitor is closed"); - } - - Ruby ruby = context.getRuntime(); - SelectableChannel channel = (SelectableChannel)io.getChannel(); - - if(interests != context.nil) { - key.interestOps(Nio4r.symbolToInterestOps(ruby, channel, interests)); - } else { - key.interestOps(0); - } - - this.interests = interests; - - return this.interests; - } - - @JRubyMethod(name = "add_interest") - public IRubyObject addInterest(ThreadContext context, IRubyObject interest) { - if(this.closed == context.getRuntime().getTrue()) { - throw context.getRuntime().newEOFError("monitor is closed"); - } - - Ruby ruby = context.getRuntime(); - SelectableChannel channel = (SelectableChannel)io.getChannel(); - int newInterestOps = key.interestOps() | Nio4r.symbolToInterestOps(ruby, channel, interest); - - key.interestOps(newInterestOps); - this.interests = Nio4r.interestOpsToSymbol(ruby, newInterestOps); - - return this.interests; - } - - @JRubyMethod(name = "remove_interest") - public IRubyObject removeInterest(ThreadContext context, IRubyObject interest) { - if(this.closed == context.getRuntime().getTrue()) { - throw context.getRuntime().newEOFError("monitor is closed"); - } - - Ruby ruby = context.getRuntime(); - SelectableChannel channel = (SelectableChannel)io.getChannel(); - int newInterestOps = key.interestOps() & ~Nio4r.symbolToInterestOps(ruby, channel, interest); - - key.interestOps(newInterestOps); - this.interests = Nio4r.interestOpsToSymbol(ruby, newInterestOps); - - return this.interests; - } - - @JRubyMethod - public IRubyObject readiness(ThreadContext context) { - if(!key.isValid()) - return this.interests; - return Nio4r.interestOpsToSymbol(context.getRuntime(), key.readyOps()); - } - - @JRubyMethod(name = "readable?") - public IRubyObject isReadable(ThreadContext context) { - Ruby runtime = context.getRuntime(); - if (!this.key.isValid()) - return runtime.getTrue(); - int readyOps = this.key.readyOps(); - - if((readyOps & SelectionKey.OP_READ) != 0 || (readyOps & SelectionKey.OP_ACCEPT) != 0) { - return runtime.getTrue(); - } else { - return runtime.getFalse(); - } - } - - @JRubyMethod(name = {"writable?", "writeable?"}) - public IRubyObject writable(ThreadContext context) { - Ruby runtime = context.getRuntime(); - if (!this.key.isValid()) - return runtime.getTrue(); - int readyOps = this.key.readyOps(); - - if((readyOps & SelectionKey.OP_WRITE) != 0 || (readyOps & SelectionKey.OP_CONNECT) != 0) { - return runtime.getTrue(); - } else { - return runtime.getFalse(); - } - } - - @JRubyMethod(name = "value") - public IRubyObject getValue(ThreadContext context) { - return this.value; - } - - @JRubyMethod(name = "value=") - public IRubyObject setValue(ThreadContext context, IRubyObject obj) { - this.value = obj; - return context.nil; - } - - @JRubyMethod - public IRubyObject close(ThreadContext context) { - return close(context, context.getRuntime().getTrue()); - } - - @JRubyMethod - public IRubyObject close(ThreadContext context, IRubyObject deregister) { - Ruby runtime = context.getRuntime(); - this.closed = runtime.getTrue(); - - if(deregister == runtime.getTrue()) { - selector.callMethod(context, "deregister", io); - } - - return context.nil; - } - - @JRubyMethod(name = "closed?") - public IRubyObject isClosed(ThreadContext context) { - return this.closed; - } -} diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Nio4r.java b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Nio4r.java deleted file mode 100644 index ccb066a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Nio4r.java +++ /dev/null @@ -1,104 +0,0 @@ -package org.nio4r; - -import java.nio.channels.SelectableChannel; -import java.nio.channels.SelectionKey; -import java.nio.channels.SocketChannel; - -import org.jruby.Ruby; -import org.jruby.RubyClass; -import org.jruby.RubyModule; -import org.jruby.runtime.ObjectAllocator; -import org.jruby.runtime.load.Library; -import org.jruby.runtime.builtin.IRubyObject; - -import org.nio4r.ByteBuffer; -import org.nio4r.Monitor; -import org.nio4r.Selector; - -public class Nio4r implements Library { - private Ruby ruby; - - public void load(final Ruby ruby, boolean bln) { - this.ruby = ruby; - - RubyModule nio = ruby.defineModule("NIO"); - - RubyClass selector = ruby.defineClassUnder("Selector", ruby.getObject(), new ObjectAllocator() { - public IRubyObject allocate(Ruby ruby, RubyClass rc) { - return new Selector(ruby, rc); - } - }, nio); - - selector.defineAnnotatedMethods(Selector.class); - - RubyClass monitor = ruby.defineClassUnder("Monitor", ruby.getObject(), new ObjectAllocator() { - public IRubyObject allocate(Ruby ruby, RubyClass rc) { - return new Monitor(ruby, rc); - } - }, nio); - - monitor.defineAnnotatedMethods(Monitor.class); - - RubyClass byteBuffer = ruby.defineClassUnder("ByteBuffer", ruby.getObject(), new ObjectAllocator() { - public IRubyObject allocate(Ruby ruby, RubyClass rc) { - return new ByteBuffer(ruby, rc); - } - }, nio); - - byteBuffer.defineAnnotatedMethods(ByteBuffer.class); - byteBuffer.includeModule(ruby.getEnumerable()); - - ruby.defineClassUnder("OverflowError", ruby.getIOError(), ruby.getIOError().getAllocator(), byteBuffer); - ruby.defineClassUnder("UnderflowError", ruby.getIOError(), ruby.getIOError().getAllocator(), byteBuffer); - ruby.defineClassUnder("MarkUnsetError", ruby.getIOError(), ruby.getIOError().getAllocator(), byteBuffer); - } - - public static int symbolToInterestOps(Ruby ruby, SelectableChannel channel, IRubyObject interest) { - if(interest == ruby.newSymbol("r")) { - if((channel.validOps() & SelectionKey.OP_ACCEPT) != 0) { - return SelectionKey.OP_ACCEPT; - } else { - return SelectionKey.OP_READ; - } - } else if(interest == ruby.newSymbol("w")) { - if(channel instanceof SocketChannel && !((SocketChannel)channel).isConnected()) { - return SelectionKey.OP_CONNECT; - } else { - return SelectionKey.OP_WRITE; - } - } else if(interest == ruby.newSymbol("rw")) { - int interestOps = 0; - - /* nio4r emulates the POSIX behavior, which is sloppy about allowed modes */ - if((channel.validOps() & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0) { - interestOps |= symbolToInterestOps(ruby, channel, ruby.newSymbol("r")); - } - - if((channel.validOps() & (SelectionKey.OP_WRITE | SelectionKey.OP_CONNECT)) != 0) { - interestOps |= symbolToInterestOps(ruby, channel, ruby.newSymbol("w")); - } - - return interestOps; - } else { - throw ruby.newArgumentError("invalid interest type: " + interest); - } - } - - public static IRubyObject interestOpsToSymbol(Ruby ruby, int interestOps) { - switch(interestOps) { - case SelectionKey.OP_READ: - case SelectionKey.OP_ACCEPT: - return ruby.newSymbol("r"); - case SelectionKey.OP_WRITE: - case SelectionKey.OP_CONNECT: - return ruby.newSymbol("w"); - case SelectionKey.OP_READ | SelectionKey.OP_CONNECT: - case SelectionKey.OP_READ | SelectionKey.OP_WRITE: - return ruby.newSymbol("rw"); - case 0: - return ruby.getNil(); - default: - throw ruby.newArgumentError("unknown interest op combination"); - } - } -} diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Selector.java b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Selector.java deleted file mode 100644 index 99c0f28..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/org/nio4r/Selector.java +++ /dev/null @@ -1,297 +0,0 @@ -package org.nio4r; - -import java.util.Iterator; -import java.util.Map; -import java.util.HashMap; -import java.io.IOException; -import java.nio.channels.Channel; -import java.nio.channels.SelectableChannel; -import java.nio.channels.SelectionKey; - -import org.jruby.Ruby; -import org.jruby.RubyArray; -import org.jruby.RubyClass; -import org.jruby.RubyIO; -import org.jruby.RubyNumeric; -import org.jruby.RubyObject; -import org.jruby.anno.JRubyMethod; -import org.jruby.runtime.Block; -import org.jruby.runtime.ThreadContext; -import org.jruby.runtime.builtin.IRubyObject; -import org.jruby.util.io.OpenFile; - -public class Selector extends RubyObject { - private static final long serialVersionUID = -14562818539414873L; - private transient java.nio.channels.Selector selector; - private HashMap cancelledKeys; - private volatile boolean wakeupFired; - - public Selector(final Ruby ruby, RubyClass rubyClass) { - super(ruby, rubyClass); - } - - @JRubyMethod(meta = true) - public static IRubyObject backends(ThreadContext context, IRubyObject self) { - return context.runtime.newArray(context.runtime.newSymbol("java")); - } - - @JRubyMethod - public IRubyObject initialize(ThreadContext context) { - initialize(context, context.runtime.newSymbol("java")); - return context.nil; - } - - @JRubyMethod - public IRubyObject initialize(ThreadContext context, IRubyObject backend) { - if(backend != context.runtime.newSymbol("java") && !backend.isNil()) { - throw context.runtime.newArgumentError(":java is the only supported backend"); - } - - this.cancelledKeys = new HashMap(); - this.wakeupFired = false; - - try { - this.selector = java.nio.channels.Selector.open(); - } catch(IOException ie) { - throw context.runtime.newIOError(ie.getLocalizedMessage()); - } - - return context.nil; - } - - @JRubyMethod - public IRubyObject backend(ThreadContext context) { - return context.runtime.newSymbol("java"); - } - - @JRubyMethod - public IRubyObject close(ThreadContext context) { - try { - this.selector.close(); - } catch(IOException ie) { - throw context.runtime.newIOError(ie.getLocalizedMessage()); - } - - return context.nil; - } - - @JRubyMethod(name = "closed?") - public IRubyObject isClosed(ThreadContext context) { - Ruby runtime = context.getRuntime(); - return this.selector.isOpen() ? runtime.getFalse() : runtime.getTrue(); - } - - @JRubyMethod(name = "empty?") - public IRubyObject isEmpty(ThreadContext context) { - Ruby runtime = context.getRuntime(); - return this.selector.keys().isEmpty() ? runtime.getTrue() : runtime.getFalse(); - } - - @JRubyMethod - public IRubyObject register(ThreadContext context, IRubyObject io, IRubyObject interests) { - Ruby runtime = context.getRuntime(); - Channel rawChannel = RubyIO.convertToIO(context, io).getChannel(); - - if(!this.selector.isOpen()) { - throw context.getRuntime().newIOError("selector is closed"); - } - - if(!(rawChannel instanceof SelectableChannel)) { - throw runtime.newArgumentError("not a selectable IO object"); - } - - SelectableChannel channel = (SelectableChannel)rawChannel; - - try { - channel.configureBlocking(false); - } catch(IOException ie) { - throw runtime.newIOError(ie.getLocalizedMessage()); - } - - int interestOps = Nio4r.symbolToInterestOps(runtime, channel, interests); - SelectionKey key; - - key = this.cancelledKeys.remove(channel); - - if(key != null) { - key.interestOps(interestOps); - } else { - try { - key = channel.register(this.selector, interestOps); - } catch(java.lang.IllegalArgumentException ia) { - throw runtime.newArgumentError("mode not supported for this object: " + interests); - } catch(java.nio.channels.ClosedChannelException cce) { - throw context.runtime.newIOError(cce.getLocalizedMessage()); - } - } - - RubyClass monitorClass = runtime.getModule("NIO").getClass("Monitor"); - Monitor monitor = (Monitor)monitorClass.newInstance(context, io, interests, this, null); - monitor.setSelectionKey(key); - - return monitor; - } - - @JRubyMethod - public IRubyObject deregister(ThreadContext context, IRubyObject io) { - Ruby runtime = context.getRuntime(); - OpenFile file = RubyIO.convertToIO(context, io).getOpenFileInitialized(); - if (file.fd() == null) - return context.nil; - Channel rawChannel = file.channel(); - - if(!(rawChannel instanceof SelectableChannel)) { - throw runtime.newArgumentError("not a selectable IO object"); - } - - SelectableChannel channel = (SelectableChannel)rawChannel; - SelectionKey key = channel.keyFor(this.selector); - - if(key == null) - return context.nil; - - Monitor monitor = (Monitor)key.attachment(); - monitor.close(context, runtime.getFalse()); - cancelledKeys.put(channel, key); - - return monitor; - } - - @JRubyMethod(name = "registered?") - public IRubyObject isRegistered(ThreadContext context, IRubyObject io) { - Ruby runtime = context.getRuntime(); - Channel rawChannel = RubyIO.convertToIO(context, io).getChannel(); - - if(!(rawChannel instanceof SelectableChannel)) { - throw runtime.newArgumentError("not a selectable IO object"); - } - - SelectableChannel channel = (SelectableChannel)rawChannel; - SelectionKey key = channel.keyFor(this.selector); - - if(key == null) - return context.nil; - - - if(((Monitor)key.attachment()).isClosed(context) == runtime.getTrue()) { - return runtime.getFalse(); - } else { - return runtime.getTrue(); - } - } - - @JRubyMethod - public synchronized IRubyObject select(ThreadContext context, Block block) { - return select(context, context.nil, block); - } - - @JRubyMethod - public synchronized IRubyObject select(ThreadContext context, IRubyObject timeout, Block block) { - Ruby runtime = context.getRuntime(); - - if(!this.selector.isOpen()) { - throw context.getRuntime().newIOError("selector is closed"); - } - - this.wakeupFired = false; - int ready = doSelect(runtime, context, timeout); - - /* Timeout */ - if(ready <= 0 && !this.wakeupFired) { - return context.nil; - } - - RubyArray array = null; - - if(!block.isGiven()) { - array = runtime.newArray(this.selector.selectedKeys().size()); - } - - Iterator selectedKeys = this.selector.selectedKeys().iterator(); - while(selectedKeys.hasNext()) { - SelectionKey key = selectedKeys.next(); - processKey(key); - - selectedKeys.remove(); - - if(block.isGiven()) { - block.call(context, (IRubyObject)key.attachment()); - } else { - array.add(key.attachment()); - } - } - - if(block.isGiven()) { - return RubyNumeric.int2fix(runtime, ready); - } else { - return array; - } - } - - /* Run the selector */ - private int doSelect(Ruby runtime, ThreadContext context, IRubyObject timeout) { - int result; - - cancelKeys(); - try { - context.getThread().beforeBlockingCall(context); - if(timeout.isNil()) { - result = this.selector.select(); - } else { - double t = RubyNumeric.num2dbl(timeout); - if(t == 0) { - result = this.selector.selectNow(); - } else if(t < 0) { - throw runtime.newArgumentError("time interval must be positive"); - } else { - long timeoutMilliSeconds = (long)(t * 1000); - if(timeoutMilliSeconds == 0) { - result = this.selector.selectNow(); - } else { - result = this.selector.select(timeoutMilliSeconds); - } - } - } - context.getThread().afterBlockingCall(); - return result; - } catch(IOException ie) { - throw runtime.newIOError(ie.getLocalizedMessage()); - } - } - - /* Flush our internal buffer of cancelled keys */ - private void cancelKeys() { - Iterator> cancelledKeys = this.cancelledKeys.entrySet().iterator(); - while(cancelledKeys.hasNext()) { - Map.Entry entry = cancelledKeys.next(); - SelectionKey key = entry.getValue(); - key.cancel(); - cancelledKeys.remove(); - } - } - - // Remove connect interest from connected sockets - // See: http://stackoverflow.com/questions/204186/java-nio-select-returns-without-selected-keys-why - private void processKey(SelectionKey key) { - if(key.isValid() && (key.readyOps() & SelectionKey.OP_CONNECT) != 0) { - int interestOps = key.interestOps(); - - interestOps &= ~SelectionKey.OP_CONNECT; - interestOps |= SelectionKey.OP_WRITE; - - key.interestOps(interestOps); - } - } - - @JRubyMethod - public IRubyObject wakeup(ThreadContext context) { - if(!this.selector.isOpen()) { - throw context.getRuntime().newIOError("selector is closed"); - } - - this.wakeupFired = true; - this.selector.wakeup(); - - return context.nil; - } -} diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/selector.c b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/selector.c deleted file mode 100644 index 662254c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/ext/nio4r/selector.c +++ /dev/null @@ -1,606 +0,0 @@ -/* - * Copyright (c) 2011 Tony Arcieri. Distributed under the MIT License. See - * LICENSE.txt for further details. - */ - -#include "nio4r.h" -#ifdef HAVE_RUBYSIG_H -#include "rubysig.h" -#endif - -#ifdef HAVE_UNISTD_H -#include -#else -#include -#endif - -#include -#include - -static VALUE mNIO = Qnil; -static VALUE cNIO_Monitor = Qnil; -static VALUE cNIO_Selector = Qnil; - -/* Allocator/deallocator */ -static VALUE NIO_Selector_allocate(VALUE klass); -static void NIO_Selector_mark(void *data); -static void NIO_Selector_shutdown(struct NIO_Selector *selector); -static void NIO_Selector_free(void *data); -static size_t NIO_Selector_memsize(const void *data); - -/* Class methods */ -static VALUE NIO_Selector_supported_backends(VALUE klass); - -/* Instance methods */ -static VALUE NIO_Selector_initialize(int argc, VALUE *argv, VALUE self); -static VALUE NIO_Selector_backend(VALUE self); -static VALUE NIO_Selector_register(VALUE self, VALUE selectable, VALUE interest); -static VALUE NIO_Selector_deregister(VALUE self, VALUE io); -static VALUE NIO_Selector_is_registered(VALUE self, VALUE io); -static VALUE NIO_Selector_select(int argc, VALUE *argv, VALUE self); -static VALUE NIO_Selector_wakeup(VALUE self); -static VALUE NIO_Selector_close(VALUE self); -static VALUE NIO_Selector_closed(VALUE self); -static VALUE NIO_Selector_is_empty(VALUE self); - -/* Internal functions */ -static VALUE NIO_Selector_synchronize(VALUE self, VALUE (*func)(VALUE arg), VALUE arg); -static VALUE NIO_Selector_unlock(VALUE lock); -static VALUE NIO_Selector_register_synchronized(VALUE arg); -static VALUE NIO_Selector_deregister_synchronized(VALUE arg); -static VALUE NIO_Selector_select_synchronized(VALUE arg); -static VALUE NIO_Selector_close_synchronized(VALUE arg); -static VALUE NIO_Selector_closed_synchronized(VALUE arg); - -static int NIO_Selector_run(struct NIO_Selector *selector, VALUE timeout); -static void NIO_Selector_timeout_callback(struct ev_loop *ev_loop, struct ev_timer *timer, int revents); -static void NIO_Selector_wakeup_callback(struct ev_loop *ev_loop, struct ev_io *io, int revents); - -/* Default number of slots in the buffer for selected monitors */ -#define INITIAL_READY_BUFFER 32 - -/* Ruby 1.8 needs us to busy wait and run the green threads scheduler every 10ms */ -#define BUSYWAIT_INTERVAL 0.01 - -/* Selectors wait for events */ -void Init_NIO_Selector(void) -{ - mNIO = rb_define_module("NIO"); - cNIO_Selector = rb_define_class_under(mNIO, "Selector", rb_cObject); - rb_define_alloc_func(cNIO_Selector, NIO_Selector_allocate); - - rb_define_singleton_method(cNIO_Selector, "backends", NIO_Selector_supported_backends, 0); - rb_define_method(cNIO_Selector, "initialize", NIO_Selector_initialize, -1); - rb_define_method(cNIO_Selector, "backend", NIO_Selector_backend, 0); - rb_define_method(cNIO_Selector, "register", NIO_Selector_register, 2); - rb_define_method(cNIO_Selector, "deregister", NIO_Selector_deregister, 1); - rb_define_method(cNIO_Selector, "registered?", NIO_Selector_is_registered, 1); - rb_define_method(cNIO_Selector, "select", NIO_Selector_select, -1); - rb_define_method(cNIO_Selector, "wakeup", NIO_Selector_wakeup, 0); - rb_define_method(cNIO_Selector, "close", NIO_Selector_close, 0); - rb_define_method(cNIO_Selector, "closed?", NIO_Selector_closed, 0); - rb_define_method(cNIO_Selector, "empty?", NIO_Selector_is_empty, 0); - - cNIO_Monitor = rb_define_class_under(mNIO, "Monitor", rb_cObject); -} - -static const rb_data_type_t NIO_Selector_type = { - "NIO::Selector", - { - NIO_Selector_mark, - NIO_Selector_free, - NIO_Selector_memsize, - }, - 0, - 0, - RUBY_TYPED_WB_PROTECTED // Don't free immediately because of shutdown -}; - -/* Create the libev event loop and incoming event buffer */ -static VALUE NIO_Selector_allocate(VALUE klass) -{ - struct NIO_Selector *selector; - int fds[2]; - - /* Use a pipe to implement the wakeup mechanism. I know libev provides - async watchers that implement this same behavior, but I'm getting - segvs trying to use that between threads, despite claims of thread - safety. Pipes are nice and safe to use between threads. - - Note that Java NIO uses this same mechanism */ - if (pipe(fds) < 0) { - rb_sys_fail("pipe"); - } - - /* Use non-blocking reads/writes during wakeup, in case the buffer is full */ - if (fcntl(fds[0], F_SETFL, O_NONBLOCK) < 0 || fcntl(fds[1], F_SETFL, O_NONBLOCK) < 0) { - rb_sys_fail("fcntl"); - } - - VALUE obj = TypedData_Make_Struct(klass, struct NIO_Selector, &NIO_Selector_type, selector); - /* Defer initializing the loop to #initialize */ - selector->ev_loop = 0; - - ev_init(&selector->timer, NIO_Selector_timeout_callback); - - selector->wakeup_reader = fds[0]; - selector->wakeup_writer = fds[1]; - - ev_io_init(&selector->wakeup, NIO_Selector_wakeup_callback, selector->wakeup_reader, EV_READ); - selector->wakeup.data = (void *)selector; - - selector->closed = selector->selecting = selector->wakeup_fired = selector->ready_count = 0; - RB_OBJ_WRITE(obj, &selector->ready_array, Qnil); - return obj; -} - -struct NIO_Selector *NIO_Selector_unwrap(VALUE self) -{ - struct NIO_Selector *selector; - TypedData_Get_Struct(self, struct NIO_Selector, &NIO_Selector_type, selector); - return selector; -} - -/* NIO selectors store all Ruby objects in instance variables so mark is a stub */ -static void NIO_Selector_mark(void *data) -{ - struct NIO_Selector *selector = (struct NIO_Selector *)data; - if (selector->ready_array != Qnil) { - rb_gc_mark(selector->ready_array); - } -} - -/* Free a Selector's system resources. - Called by both NIO::Selector#close and the finalizer below */ -static void NIO_Selector_shutdown(struct NIO_Selector *selector) -{ - if (selector->closed) { - return; - } - - close(selector->wakeup_reader); - close(selector->wakeup_writer); - - if (selector->ev_loop) { - ev_loop_destroy(selector->ev_loop); - selector->ev_loop = 0; - } - - selector->closed = 1; -} - -/* Ruby finalizer for selector objects */ -static void NIO_Selector_free(void *data) -{ - struct NIO_Selector *selector = (struct NIO_Selector *)data; - NIO_Selector_shutdown(selector); - xfree(selector); -} - -static size_t NIO_Selector_memsize(const void *data) -{ - return sizeof(struct NIO_Selector); -} - -/* Return an array of symbols for supported backends */ -static VALUE NIO_Selector_supported_backends(VALUE klass) -{ - unsigned int backends = ev_supported_backends(); - VALUE result = rb_ary_new(); - - if (backends & EVBACKEND_EPOLL) { - rb_ary_push(result, ID2SYM(rb_intern("epoll"))); - } - - if (backends & EVBACKEND_POLL) { - rb_ary_push(result, ID2SYM(rb_intern("poll"))); - } - - if (backends & EVBACKEND_KQUEUE) { - rb_ary_push(result, ID2SYM(rb_intern("kqueue"))); - } - - if (backends & EVBACKEND_SELECT) { - rb_ary_push(result, ID2SYM(rb_intern("select"))); - } - - if (backends & EVBACKEND_PORT) { - rb_ary_push(result, ID2SYM(rb_intern("port"))); - } - - if (backends & EVBACKEND_LINUXAIO) { - rb_ary_push(result, ID2SYM(rb_intern("linuxaio"))); - } - - if (backends & EVBACKEND_IOURING) { - rb_ary_push(result, ID2SYM(rb_intern("io_uring"))); - } - - return result; -} - -/* Create a new selector. This is more or less the pure Ruby version - translated into an MRI cext */ -static VALUE NIO_Selector_initialize(int argc, VALUE *argv, VALUE self) -{ - ID backend_id; - VALUE backend; - VALUE lock; - - struct NIO_Selector *selector; - unsigned int flags = 0; - - TypedData_Get_Struct(self, struct NIO_Selector, &NIO_Selector_type, selector); - - rb_scan_args(argc, argv, "01", &backend); - - if (backend != Qnil) { - if (!rb_ary_includes(NIO_Selector_supported_backends(CLASS_OF(self)), backend)) { - rb_raise(rb_eArgError, "unsupported backend: %s", RSTRING_PTR(rb_funcall(backend, rb_intern("inspect"), 0))); - } - - backend_id = SYM2ID(backend); - - if (backend_id == rb_intern("epoll")) { - flags = EVBACKEND_EPOLL; - } else if (backend_id == rb_intern("poll")) { - flags = EVBACKEND_POLL; - } else if (backend_id == rb_intern("kqueue")) { - flags = EVBACKEND_KQUEUE; - } else if (backend_id == rb_intern("select")) { - flags = EVBACKEND_SELECT; - } else if (backend_id == rb_intern("port")) { - flags = EVBACKEND_PORT; - } else if (backend_id == rb_intern("linuxaio")) { - flags = EVBACKEND_LINUXAIO; - } else if (backend_id == rb_intern("io_uring")) { - flags = EVBACKEND_IOURING; - } else { - rb_raise(rb_eArgError, "unsupported backend: %s", RSTRING_PTR(rb_funcall(backend, rb_intern("inspect"), 0))); - } - } - - /* Ensure the selector loop has not yet been initialized */ - assert(!selector->ev_loop); - - selector->ev_loop = ev_loop_new(flags); - if (!selector->ev_loop) { - rb_raise(rb_eIOError, "error initializing event loop"); - } - - ev_io_start(selector->ev_loop, &selector->wakeup); - - rb_ivar_set(self, rb_intern("selectables"), rb_hash_new()); - rb_ivar_set(self, rb_intern("lock_holder"), Qnil); - - lock = rb_class_new_instance(0, 0, rb_const_get(rb_cObject, rb_intern("Mutex"))); - rb_ivar_set(self, rb_intern("lock"), lock); - rb_ivar_set(self, rb_intern("lock_holder"), Qnil); - - return Qnil; -} - -static VALUE NIO_Selector_backend(VALUE self) -{ - struct NIO_Selector *selector; - - TypedData_Get_Struct(self, struct NIO_Selector, &NIO_Selector_type, selector); - if (selector->closed) { - rb_raise(rb_eIOError, "selector is closed"); - } - - switch (ev_backend(selector->ev_loop)) { - case EVBACKEND_EPOLL: - return ID2SYM(rb_intern("epoll")); - case EVBACKEND_POLL: - return ID2SYM(rb_intern("poll")); - case EVBACKEND_KQUEUE: - return ID2SYM(rb_intern("kqueue")); - case EVBACKEND_SELECT: - return ID2SYM(rb_intern("select")); - case EVBACKEND_PORT: - return ID2SYM(rb_intern("port")); - case EVBACKEND_LINUXAIO: - return ID2SYM(rb_intern("linuxaio")); - case EVBACKEND_IOURING: - return ID2SYM(rb_intern("io_uring")); - } - - return ID2SYM(rb_intern("unknown")); -} - -/* Synchronize around a reentrant selector lock */ -static VALUE NIO_Selector_synchronize(VALUE self, VALUE (*func)(VALUE arg), VALUE arg) -{ - VALUE current_thread, lock_holder, lock; - - current_thread = rb_thread_current(); - lock_holder = rb_ivar_get(self, rb_intern("lock_holder")); - - if (lock_holder != current_thread) { - lock = rb_ivar_get(self, rb_intern("lock")); - rb_funcall(lock, rb_intern("lock"), 0); - rb_ivar_set(self, rb_intern("lock_holder"), current_thread); - - /* We've acquired the lock, so ensure we unlock it */ - return rb_ensure(func, (VALUE)arg, NIO_Selector_unlock, self); - } else { - /* We already hold the selector lock, so no need to unlock it */ - return func(arg); - } -} - -/* Unlock the selector mutex */ -static VALUE NIO_Selector_unlock(VALUE self) -{ - VALUE lock; - - rb_ivar_set(self, rb_intern("lock_holder"), Qnil); - - lock = rb_ivar_get(self, rb_intern("lock")); - rb_funcall(lock, rb_intern("unlock"), 0); - - return Qnil; -} - -/* Register an IO object with the selector for the given interests */ -static VALUE NIO_Selector_register(VALUE self, VALUE io, VALUE interests) -{ - VALUE args[3] = {self, io, interests}; - return NIO_Selector_synchronize(self, NIO_Selector_register_synchronized, (VALUE)args); -} - -/* Internal implementation of register after acquiring mutex */ -static VALUE NIO_Selector_register_synchronized(VALUE _args) -{ - VALUE self, io, interests, selectables, monitor; - VALUE monitor_args[3]; - struct NIO_Selector *selector; - - VALUE *args = (VALUE *)_args; - self = args[0]; - io = args[1]; - interests = args[2]; - - TypedData_Get_Struct(self, struct NIO_Selector, &NIO_Selector_type, selector); - if (selector->closed) { - rb_raise(rb_eIOError, "selector is closed"); - } - - selectables = rb_ivar_get(self, rb_intern("selectables")); - monitor = rb_hash_lookup(selectables, io); - - if (monitor != Qnil) - rb_raise(rb_eArgError, "this IO is already registered with selector"); - - /* Create a new NIO::Monitor */ - monitor_args[0] = io; - monitor_args[1] = interests; - monitor_args[2] = self; - - monitor = rb_class_new_instance(3, monitor_args, cNIO_Monitor); - rb_hash_aset(selectables, rb_funcall(monitor, rb_intern("io"), 0), monitor); - - return monitor; -} - -/* Deregister an IO object from the selector */ -static VALUE NIO_Selector_deregister(VALUE self, VALUE io) -{ - VALUE args[2] = {self, io}; - return NIO_Selector_synchronize(self, NIO_Selector_deregister_synchronized, (VALUE)args); -} - -/* Internal implementation of register after acquiring mutex */ -static VALUE NIO_Selector_deregister_synchronized(VALUE _args) -{ - VALUE self, io, selectables, monitor; - - VALUE *args = (VALUE *)_args; - self = args[0]; - io = args[1]; - - selectables = rb_ivar_get(self, rb_intern("selectables")); - monitor = rb_hash_delete(selectables, io); - - if (monitor != Qnil) { - rb_funcall(monitor, rb_intern("close"), 1, Qfalse); - } - - return monitor; -} - -/* Is the given IO object registered with the selector */ -static VALUE NIO_Selector_is_registered(VALUE self, VALUE io) -{ - VALUE selectables = rb_ivar_get(self, rb_intern("selectables")); - - /* Perhaps this should be holding the mutex? */ - return rb_funcall(selectables, rb_intern("has_key?"), 1, io); -} - -/* Select from all registered IO objects */ -static VALUE NIO_Selector_select(int argc, VALUE *argv, VALUE self) -{ - VALUE timeout; - - rb_scan_args(argc, argv, "01", &timeout); - - if (timeout != Qnil && NUM2DBL(timeout) < 0) { - rb_raise(rb_eArgError, "time interval must be positive"); - } - - VALUE args[2] = {self, timeout}; - return NIO_Selector_synchronize(self, NIO_Selector_select_synchronized, (VALUE)args); -} - -/* Internal implementation of select with the selector lock held */ -static VALUE NIO_Selector_select_synchronized(VALUE _args) -{ - int ready; - VALUE ready_array; - struct NIO_Selector *selector; - - VALUE *args = (VALUE *)_args; - - TypedData_Get_Struct(args[0], struct NIO_Selector, &NIO_Selector_type, selector); - - if (selector->closed) { - rb_raise(rb_eIOError, "selector is closed"); - } - - if (!rb_block_given_p()) { - RB_OBJ_WRITE(args[0], &selector->ready_array, rb_ary_new()); - } - - ready = NIO_Selector_run(selector, args[1]); - - /* Timeout */ - if (ready < 0) { - if (!rb_block_given_p()) { - RB_OBJ_WRITE(args[0], &selector->ready_array, Qnil); - } - - return Qnil; - } - - if (rb_block_given_p()) { - return INT2NUM(ready); - } else { - ready_array = selector->ready_array; - RB_OBJ_WRITE(args[0], &selector->ready_array, Qnil); - return ready_array; - } -} - -static int NIO_Selector_run(struct NIO_Selector *selector, VALUE timeout) -{ - int ev_run_flags = EVRUN_ONCE; - int result; - double timeout_val; - - selector->selecting = 1; - selector->wakeup_fired = 0; - - if (timeout == Qnil) { - /* Don't fire a wakeup timeout if we weren't passed one */ - ev_timer_stop(selector->ev_loop, &selector->timer); - } else { - timeout_val = NUM2DBL(timeout); - if (timeout_val == 0) { - /* If we've been given an explicit timeout of 0, perform a non-blocking - select operation */ - ev_run_flags = EVRUN_NOWAIT; - } else { - selector->timer.repeat = timeout_val; - ev_timer_again(selector->ev_loop, &selector->timer); - } - } - - /* libev is patched to release the GIL when it makes its system call */ - ev_run(selector->ev_loop, ev_run_flags); - - result = selector->ready_count; - selector->selecting = selector->ready_count = 0; - - if (result > 0 || selector->wakeup_fired) { - selector->wakeup_fired = 0; - return result; - } else { - return -1; - } -} - -/* Wake the selector up from another thread */ -static VALUE NIO_Selector_wakeup(VALUE self) -{ - struct NIO_Selector *selector; - TypedData_Get_Struct(self, struct NIO_Selector, &NIO_Selector_type, selector); - - if (selector->closed) { - rb_raise(rb_eIOError, "selector is closed"); - } - - selector->wakeup_fired = 1; - write(selector->wakeup_writer, "\0", 1); - - return Qnil; -} - -/* Close the selector and free system resources */ -static VALUE NIO_Selector_close(VALUE self) -{ - return NIO_Selector_synchronize(self, NIO_Selector_close_synchronized, self); -} - -static VALUE NIO_Selector_close_synchronized(VALUE self) -{ - struct NIO_Selector *selector; - - TypedData_Get_Struct(self, struct NIO_Selector, &NIO_Selector_type, selector); - - NIO_Selector_shutdown(selector); - - return Qnil; -} - -/* Is the selector closed? */ -static VALUE NIO_Selector_closed(VALUE self) -{ - return NIO_Selector_synchronize(self, NIO_Selector_closed_synchronized, self); -} - -static VALUE NIO_Selector_closed_synchronized(VALUE self) -{ - struct NIO_Selector *selector; - - TypedData_Get_Struct(self, struct NIO_Selector, &NIO_Selector_type, selector); - - return selector->closed ? Qtrue : Qfalse; -} - -/* True if there are monitors on the loop */ -static VALUE NIO_Selector_is_empty(VALUE self) -{ - VALUE selectables = rb_ivar_get(self, rb_intern("selectables")); - - return rb_funcall(selectables, rb_intern("empty?"), 0) == Qtrue ? Qtrue : Qfalse; -} - -/* Called whenever a timeout fires on the event loop */ -static void NIO_Selector_timeout_callback(struct ev_loop *ev_loop, struct ev_timer *timer, int revents) -{ -} - -/* Called whenever a wakeup request is sent to a selector */ -static void NIO_Selector_wakeup_callback(struct ev_loop *ev_loop, struct ev_io *io, int revents) -{ - char buffer[128]; - struct NIO_Selector *selector = (struct NIO_Selector *)io->data; - selector->selecting = 0; - - /* Drain the wakeup pipe, giving us level-triggered behavior */ - while (read(selector->wakeup_reader, buffer, 128) > 0) - ; -} - -/* libev callback fired whenever a monitor gets an event */ -void NIO_Selector_monitor_callback(struct ev_loop *ev_loop, struct ev_io *io, int revents) -{ - struct NIO_Monitor *monitor_data = (struct NIO_Monitor *)io->data; - struct NIO_Selector *selector = monitor_data->selector; - VALUE monitor = monitor_data->self; - - assert(monitor_data->interests != 0); - - assert(selector != 0); - selector->ready_count++; - monitor_data->revents = revents; - - if (rb_block_given_p()) { - rb_yield(monitor); - } else { - assert(selector->ready_array != Qnil); - rb_ary_push(selector->ready_array, monitor); - } -} diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio.rb b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio.rb deleted file mode 100644 index bca3ee6..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio.rb +++ /dev/null @@ -1,61 +0,0 @@ -# frozen_string_literal: true - -# Released under the MIT License. -# Copyright, 2011-2017, by Tony Arcieri. -# Copyright, 2013, by Stephen von Takach. -# Copyright, 2013, by Per Lundberg. -# Copyright, 2014, by Marek Kowalcze. -# Copyright, 2016, by Upekshe Jayasekera. -# Copyright, 2019-2023, by Samuel Williams. -# Copyright, 2021, by Jun Jiang. - -require "socket" -require "nio/version" - -# New I/O for Ruby -module NIO - # NIO implementation, one of the following (as a string): - # * select: in pure Ruby using Kernel.select - # * libev: as a C extension using libev - # * java: using Java NIO - def self.engine - ENGINE - end - - def self.pure?(env = ENV) - # The user has explicitly opted in to non-native implementation: - if env["NIO4R_PURE"] == "true" - return true - end - - # Native Ruby on Windows is not supported: - if (Gem.win_platform? && !defined?(JRUBY_VERSION)) - return true - end - - # M1 native extension is crashing on M1 (arm64): - # if RUBY_PLATFORM =~ /darwin/ && RUBY_PLATFORM =~ /arm64/ - # return true - # end - - return false - end -end - -if NIO.pure? - require "nio/monitor" - require "nio/selector" - require "nio/bytebuffer" - NIO::ENGINE = "ruby" -else - require "nio4r_ext" - - if defined?(JRUBY_VERSION) - require "java" - require "jruby" - org.nio4r.Nio4r.new.load(JRuby.runtime, false) - NIO::ENGINE = "java" - else - NIO::ENGINE = "libev" - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/bytebuffer.rb b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/bytebuffer.rb deleted file mode 100644 index 7171120..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/bytebuffer.rb +++ /dev/null @@ -1,235 +0,0 @@ -# frozen_string_literal: true - -# Released under the MIT License. -# Copyright, 2016, by Upekshe Jayasekera. -# Copyright, 2016-2017, by Tony Arcieri. -# Copyright, 2020, by Thomas Dziedzic. -# Copyright, 2023, by Samuel Williams. - -module NIO - # Efficient byte buffers for performant I/O operations - class ByteBuffer - include Enumerable - - attr_reader :position, :limit, :capacity - - # Insufficient capacity in buffer - OverflowError = Class.new(IOError) - - # Not enough data remaining in buffer - UnderflowError = Class.new(IOError) - - # Mark has not been set - MarkUnsetError = Class.new(IOError) - - # Create a new ByteBuffer, either with a specified capacity or populating - # it from a given string - # - # @param capacity [Integer] size of buffer in bytes - # - # @return [NIO::ByteBuffer] - def initialize(capacity) - raise TypeError, "no implicit conversion of #{capacity.class} to Integer" unless capacity.is_a?(Integer) - - @capacity = capacity - clear - end - - # Clear the buffer, resetting it to the default state - def clear - @buffer = ("\0" * @capacity).force_encoding(Encoding::BINARY) - @position = 0 - @limit = @capacity - @mark = nil - - self - end - - # Set the position to the given value. New position must be less than limit. - # Preserves mark if it's less than the new position, otherwise clears it. - # - # @param new_position [Integer] position in the buffer - # - # @raise [ArgumentError] new position was invalid - def position=(new_position) - raise ArgumentError, "negative position given" if new_position < 0 - raise ArgumentError, "specified position exceeds capacity" if new_position > @capacity - - @mark = nil if @mark && @mark > new_position - @position = new_position - end - - # Set the limit to the given value. New limit must be less than capacity. - # Preserves limit and mark if they're less than the new limit, otherwise - # sets position to the new limit and clears the mark. - # - # @param new_limit [Integer] position in the buffer - # - # @raise [ArgumentError] new limit was invalid - def limit=(new_limit) - raise ArgumentError, "negative limit given" if new_limit < 0 - raise ArgumentError, "specified limit exceeds capacity" if new_limit > @capacity - - @position = new_limit if @position > new_limit - @mark = nil if @mark && @mark > new_limit - @limit = new_limit - end - - # Number of bytes remaining in the buffer before the limit - # - # @return [Integer] number of bytes remaining - def remaining - @limit - @position - end - - # Does the ByteBuffer have any space remaining? - # - # @return [true, false] - def full? - remaining.zero? - end - - # Obtain the requested number of bytes from the buffer, advancing the position. - # If no length is given, all remaining bytes are consumed. - # - # @raise [NIO::ByteBuffer::UnderflowError] not enough data remaining in buffer - # - # @return [String] bytes read from buffer - def get(length = remaining) - raise ArgumentError, "negative length given" if length < 0 - raise UnderflowError, "not enough data in buffer" if length > @limit - @position - - result = @buffer[@position...length] - @position += length - result - end - - # Obtain the byte at a given index in the buffer as an Integer - # - # @raise [ArgumentError] index is invalid (either negative or larger than limit) - # - # @return [Integer] byte at the given index - def [](index) - raise ArgumentError, "negative index given" if index < 0 - raise ArgumentError, "specified index exceeds limit" if index >= @limit - - @buffer.bytes[index] - end - - # Add a String to the buffer - # - # @param str [#to_str] data to add to the buffer - # - # @raise [TypeError] given a non-string type - # @raise [NIO::ByteBuffer::OverflowError] buffer is full - # - # @return [self] - def put(str) - raise TypeError, "expected String, got #{str.class}" unless str.respond_to?(:to_str) - - str = str.to_str - - raise OverflowError, "buffer is full" if str.length > @limit - @position - - @buffer[@position...str.length] = str - @position += str.length - self - end - alias << put - - # Perform a non-blocking read from the given IO object into the buffer - # Reads as much data as is immediately available and returns - # - # @param [IO] Ruby IO object to read from - # - # @return [Integer] number of bytes read (0 if none were available) - def read_from(io) - nbytes = @limit - @position - raise OverflowError, "buffer is full" if nbytes.zero? - - bytes_read = IO.try_convert(io).read_nonblock(nbytes, exception: false) - return 0 if bytes_read == :wait_readable - - self << bytes_read - bytes_read.length - end - - # Perform a non-blocking write of the buffer's contents to the given I/O object - # Writes as much data as is immediately possible and returns - # - # @param [IO] Ruby IO object to write to - # - # @return [Integer] number of bytes written (0 if the write would block) - def write_to(io) - nbytes = @limit - @position - raise UnderflowError, "no data remaining in buffer" if nbytes.zero? - - bytes_written = IO.try_convert(io).write_nonblock(@buffer[@position...@limit], exception: false) - return 0 if bytes_written == :wait_writable - - @position += bytes_written - bytes_written - end - - # Set the buffer's current position as the limit and set the position to 0 - def flip - @limit = @position - @position = 0 - @mark = nil - self - end - - # Set the buffer's current position to 0, leaving the limit unchanged - def rewind - @position = 0 - @mark = nil - self - end - - # Mark a position to return to using the `#reset` method - def mark - @mark = @position - self - end - - # Reset position to the previously marked location - # - # @raise [NIO::ByteBuffer::MarkUnsetError] mark has not been set (call `#mark` first) - def reset - raise MarkUnsetError, "mark has not been set" unless @mark - - @position = @mark - self - end - - # Move data between the position and limit to the beginning of the buffer - # Sets the position to the end of the moved data, and the limit to the capacity - def compact - @buffer[0...(@limit - @position)] = @buffer[@position...@limit] - @position = @limit - @position - @limit = capacity - self - end - - # Iterate over the bytes in the buffer (as Integers) - # - # @return [self] - def each(&block) - @buffer[0...@limit].each_byte(&block) - end - - # Inspect the state of the buffer - # - # @return [String] string describing the state of the buffer - def inspect - format( - "#<%s:0x%x @position=%d @limit=%d @capacity=%d>", - self.class, - object_id << 1, - @position, - @limit, - @capacity - ) - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/monitor.rb b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/monitor.rb deleted file mode 100644 index c7bd26e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/monitor.rb +++ /dev/null @@ -1,124 +0,0 @@ -# frozen_string_literal: true - -# Released under the MIT License. -# Copyright, 2011-2018, by Tony Arcieri. -# Copyright, 2015, by Upekshe Jayasekera. -# Copyright, 2015, by Vladimir Kochnev. -# Copyright, 2018-2023, by Samuel Williams. -# Copyright, 2019-2020, by Gregory Longtin. - -module NIO - # Monitors watch IO objects for specific events - class Monitor - attr_reader :io, :interests, :selector - attr_accessor :value, :readiness - - # :nodoc: - def initialize(io, interests, selector) - unless defined?(::OpenSSL) && io.is_a?(::OpenSSL::SSL::SSLSocket) - unless io.is_a?(IO) - if IO.respond_to? :try_convert - io = IO.try_convert(io) - elsif io.respond_to? :to_io - io = io.to_io - end - - raise TypeError, "can't convert #{io.class} into IO" unless io.is_a? IO - end - end - - @io = io - @interests = interests - @selector = selector - @closed = false - end - - # Replace the existing interest set with a new one - # - # @param interests [:r, :w, :rw, nil] I/O readiness we're interested in (read/write/readwrite) - # - # @return [Symbol] new interests - def interests=(interests) - raise EOFError, "monitor is closed" if closed? - raise ArgumentError, "bad interests: #{interests}" unless [:r, :w, :rw, nil].include?(interests) - - @interests = interests - end - - # Add new interests to the existing interest set - # - # @param interests [:r, :w, :rw] new I/O interests (read/write/readwrite) - # - # @return [self] - def add_interest(interest) - case interest - when :r - case @interests - when :r then @interests = :r - when :w then @interests = :rw - when :rw then @interests = :rw - when nil then @interests = :r - end - when :w - case @interests - when :r then @interests = :rw - when :w then @interests = :w - when :rw then @interests = :rw - when nil then @interests = :w - end - when :rw - @interests = :rw - else raise ArgumentError, "bad interests: #{interest}" - end - end - - # Remove interests from the existing interest set - # - # @param interests [:r, :w, :rw] I/O interests to remove (read/write/readwrite) - # - # @return [self] - def remove_interest(interest) - case interest - when :r - case @interests - when :r then @interests = nil - when :w then @interests = :w - when :rw then @interests = :w - when nil then @interests = nil - end - when :w - case @interests - when :r then @interests = :r - when :w then @interests = nil - when :rw then @interests = :r - when nil then @interests = nil - end - when :rw - @interests = nil - else raise ArgumentError, "bad interests: #{interest}" - end - end - - # Is the IO object readable? - def readable? - readiness == :r || readiness == :rw - end - - # Is the IO object writable? - def writable? - readiness == :w || readiness == :rw - end - alias writeable? writable? - - # Is this monitor closed? - def closed? - @closed - end - - # Deactivate this monitor - def close(deregister = true) - @closed = true - @selector.deregister(io) if deregister - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/selector.rb b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/selector.rb deleted file mode 100644 index b422e99..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/selector.rb +++ /dev/null @@ -1,188 +0,0 @@ -# frozen_string_literal: true - -# Released under the MIT License. -# Copyright, 2011-2017, by Tony Arcieri. -# Copyright, 2012, by Logan Bowers. -# Copyright, 2013, by Sadayuki Furuhashi. -# Copyright, 2013, by Stephen von Takach. -# Copyright, 2013, by Tim Carey-Smith. -# Copyright, 2013, by Ravil Bayramgalin. -# Copyright, 2014, by Sergey Avseyev. -# Copyright, 2014, by John Thornton. -# Copyright, 2015, by Vladimir Kochnev. -# Copyright, 2015, by Upekshe Jayasekera. -# Copyright, 2019-2020, by Gregory Longtin. -# Copyright, 2020-2021, by Joao Fernandes. -# Copyright, 2023, by Samuel Williams. - -require "set" - -module NIO - # Selectors monitor IO objects for events of interest - class Selector - # Return supported backends as symbols - # - # See `#backend` method definition for all possible backends - def self.backends - [:ruby] - end - - # Create a new NIO::Selector - def initialize(backend = :ruby) - raise ArgumentError, "unsupported backend: #{backend}" unless [:ruby, nil].include?(backend) - - @selectables = {} - @lock = Mutex.new - - # Other threads can wake up a selector - @wakeup, @waker = IO.pipe - @closed = false - end - - # Return a symbol representing the backend I/O multiplexing mechanism used. - # Supported backends are: - # * :ruby - pure Ruby (i.e IO.select) - # * :java - Java NIO on JRuby - # * :epoll - libev w\ Linux epoll - # * :poll - libev w\ POSIX poll - # * :kqueue - libev w\ BSD kqueue - # * :select - libev w\ SysV select - # * :port - libev w\ I/O completion ports - # * :linuxaio - libev w\ Linux AIO io_submit (experimental) - # * :io_uring - libev w\ Linux io_uring (experimental) - # * :unknown - libev w\ unknown backend - def backend - :ruby - end - - # Register interest in an IO object with the selector for the given types - # of events. Valid event types for interest are: - # * :r - is the IO readable? - # * :w - is the IO writeable? - # * :rw - is the IO either readable or writeable? - def register(io, interest) - unless defined?(::OpenSSL) && io.is_a?(::OpenSSL::SSL::SSLSocket) - io = IO.try_convert(io) - end - - @lock.synchronize do - raise IOError, "selector is closed" if closed? - - monitor = @selectables[io] - raise ArgumentError, "already registered as #{monitor.interests.inspect}" if monitor - - monitor = Monitor.new(io, interest, self) - @selectables[monitor.io] = monitor - - monitor - end - end - - # Deregister the given IO object from the selector - def deregister(io) - @lock.synchronize do - monitor = @selectables.delete IO.try_convert(io) - monitor.close(false) if monitor && !monitor.closed? - monitor - end - end - - # Is the given IO object registered with the selector? - def registered?(io) - @lock.synchronize { @selectables.key? io } - end - - # Select which monitors are ready - def select(timeout = nil) - selected_monitors = Set.new - - @lock.synchronize do - readers = [@wakeup] - writers = [] - - @selectables.each do |io, monitor| - readers << io if monitor.interests == :r || monitor.interests == :rw - writers << io if monitor.interests == :w || monitor.interests == :rw - monitor.readiness = nil - end - - ready_readers, ready_writers = Kernel.select(readers, writers, [], timeout) - return unless ready_readers # timeout - - ready_readers.each do |io| - if io == @wakeup - # Clear all wakeup signals we've received by reading them - # Wakeups should have level triggered behavior - @wakeup.read(@wakeup.stat.size) - else - monitor = @selectables[io] - monitor.readiness = :r - selected_monitors << monitor - end - end - - ready_writers.each do |io| - monitor = @selectables[io] - monitor.readiness = monitor.readiness == :r ? :rw : :w - selected_monitors << monitor - end - end - - if block_given? - selected_monitors.each { |m| yield m } - selected_monitors.size - else - selected_monitors.to_a - end - end - - # Wake up a thread that's in the middle of selecting on this selector, if - # any such thread exists. - # - # Invoking this method more than once between two successive select calls - # has the same effect as invoking it just once. In other words, it provides - # level-triggered behavior. - def wakeup - # Send the selector a signal in the form of writing data to a pipe - begin - @waker.write_nonblock "\0" - rescue IO::WaitWritable - # This indicates the wakeup pipe is full, which means the other thread - # has already received many wakeup calls, but not processed them yet. - # The other thread will completely drain this pipe when it wakes up, - # so it's ok to ignore this exception if it occurs: we know the other - # thread has already been signaled to wake up - end - - nil - end - - # Close this selector and free its resources - def close - @lock.synchronize do - return if @closed - - begin - @wakeup.close - rescue IOError - end - - begin - @waker.close - rescue IOError - end - - @closed = true - end - end - - # Is this selector closed? - def closed? - @closed - end - - def empty? - @selectables.empty? - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/version.rb b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/version.rb deleted file mode 100644 index 3b043fd..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio/version.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -# Released under the MIT License. -# Copyright, 2011-2018, by Tony Arcieri. -# Copyright, 2018-2024, by Samuel Williams. -# Copyright, 2023, by Tsimnuj Hawj. - -module NIO - VERSION = "2.7.4" -end diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio4r.rb b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio4r.rb deleted file mode 100644 index d551e82..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio4r.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -# Released under the MIT License. -# Copyright, 2023, by Phillip Aldridge. -# Copyright, 2023, by Samuel Williams. - -require_relative "nio" diff --git a/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio4r_ext.so b/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.4/lib/nio4r_ext.so deleted file mode 100755 index a185a06a0d6962384c371fe464363cf07fd6b7ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345376 zcmeFadwdi{7C+jP2TUN)0Rh294H8`tM1r71MKdG=Jv!0IOH?p~Ng|Pu#AJqt0tP1| z^tPj{_(0cHR(D<2CyEOQ2$P3Nz{iH@DlRTYp4|iyK|@5Ax!+UOJ>3~Izk5ITulxC2 z!zbxJr%s(Zb?VfqQ>Uw&hn?<8aWyx8xjo?;KmC*@%IYhaz>jF zDe2;7td29TDIBIY7{^S#JnHJI<9OpLSn9F%QgkV!uDPRmJ>zPv*9}F@60g@hv-7p8 zJFh1V;8&ww96+k4x;VXhSLdrh1oWd{?Hm$FM*3Z^&3Vl?cITTq?iAvKl<$xy;<_Xr zWHXa*n@;Kuku34L0Ce9^hpBwerd~gN@XZ4$^GDRbwfn%dRX4ZIyp%|@@cS@+N#9BM z6_V}Ee&HD*@yCfhGK)U0x=Bb&9qbx1XLUa*6nHjaSVO$+wI22qDLYY0NqEjSM956B zUzygYpszi%Jk{Q}idfJO@vOq{3jF%G@)iC1H(X!E?|S_H1HZ4~*Z6q@H*e~|Te!Zh-*3S6 zUHopu?|VA#pSW()?>FQ6K7P02_XGUa;I|IH_4xe|zYX|p#P4qW($7cyB7B0YC(-r~ ze|F~U$ND|6)zke7&`ITcLgt1-aqTvI{W0rLFZb8K|^lH+y2uH zTAv-w7tN@gl6dZ&KW{DDQFn3rxQ+egoBg++4WzC7WdEBtPyE~2kNRBj)DKrb-KZQr z{b~Du-+tuKwTtgK*SGAc?+?4~d}PCa4_?_6zqxAalHcEd*_ZwWbrVk<$vK!i=8{WG zKe_1Gvvclw?|=V3^wGj0yLKn-?)FymyGt+WGwG&p21-(o89DnlW*B`3y5ty;6 z^sxWc`#n$3-n{)-R@O0l@+%93FGv1q-_TK8KT?{$A6P&8lQ&Kr(AD^>OMVYQ==&?I zAUqQTzZH|REBdpTFkRuNgLhYW4<=q$_%CDNzmCx^*=V0GH{V_e3^;PV*hyVB>AG35MH zEdDXZaa4?PSrkLhJD`KE@n>q4J@iy`OpG4QlTq;|pQ^BC=}gPyyR z|MeK-^>65*D>+NiW>@3eFNT~S#?a@?8123hgMMU;{$|7&_lIN1GYNdU>Q`b6KDWi- zb6*Vk^J3tS#;|h=NxRbLKVyvJwixsoG3G^|82a?akmq0wJ@k*!udEpSKZc&WvbS$y z*w4Wj{Vj{p->YNvw^xjLoe=}SD@K1e#AtVa4E$9w^zi!_^wlxw8)E2rN(}n=#IEfp zCC2!E8AJaEV(7Cn#yGac7_Tbmv#W8R5JL~|#NZzvW4y-4(8KRz^fxI+zfQ%F|H~Nk zJ7U<$&KUHc#Nhu!jCFs04E`r#;CII0e|HQ$Pl{nz-D2pCV)L&2(naWRSK~V`2K{9* z#&KZ`{FxZ~`7wr^TVwF~K88I1iNWWk7~^&bzq;bTF2;QMK87A{L4UjAGa!Z@mO=im=&xYo*jq?F2m<^p;TNHbjaP5sfiA@OXX^?q>b%EsUc89zV(aBJ^N>ueXp(8%F%(^NaAQ&Oby84SpWw z7vUG3PbO_L@pGDAge;x@(E^SL>i9c!`7;l3#8*20LS4@Czi`9_I{r>wo}M!}!q7>% zPJdFTH{?H{(`QEE+jV)?earbgpz~j8@OgzJARha9-_WzlVO`zAOFEwodpZ6oei8nz zx0|ZB+e^of()nMn%MUX4Q_AeTw@^g^Fn;>;i%_i7w?@goM8_MO_(L{c;jcQM)wLX+ zLjf#)-qhvH)fIdPM+>WUe5NjczK(Cy`=j1w0-;-a2$85c{AiueC%WBY8nT~Db$neE zeu2(s-C<5g^NN06)ag_74jJ-H)a5^^%YQ2;7v9$GeBF~A0k-VtNn>38%HbPye3ssB zNH-kA-gfDHQrB=o{UV&#<(Z?)W7zXbU7jkP{~n!xSm&Rr=U)HG)h*1?IjF8ah!^A?;{Kn=Hzq60NGEOF6Us~o-fhyoAiEd(Dk!G$Ny2M z7oy||>2|exKPMcb%RgA}@0`DJJgqnM^SUnQI^7-&IZx^Qb9MfP-sTwkIn3)D^!MrQ zuKR-H*XiwQI$rpeSaIw(%Th|aoC{0(2!rBFNQtL z*Y)Pm`5W>t)$!$j);MIX+IG3H{Q~MLM68 z8#!#~|Fn)T|D5Bm)cFtB@u~mh_!1rejy_%|ALaNs9UrIDPr8@mr}2w$Oz&5S5|j8@ z$S=ZpU7xF?#_?O7Po^%<08>$)V* zvp7GmsJJx0r1-%?p<-^HXI`Oaex7$pd0|08zBgZ}@XcM4x45XHke5y>Da-dVx=HyZ zm4#U)`IVInq?<9N`3o3XWqCz$skev~xJtc+_Z3#K``e03%o@`we3trCmn@iDRw67Y zT(F>QA#ba!bYUU-MzT=t;<7w%KG<>*bqp8RQ&Lu0SfHaS3%z-zWu|@{22ZN0wCP73CL~5VF#X zPTiNcFu%md%PeqSxwnF3_mnTuN%Kkz7tw7|@nW!LDg$%l7R{Gc5)%c@vj-3n%)DiugDb6k@~+^A?m9_+TAi;<=qMWi9bC4~=J@uM`$#!7_RB zihQL^s6yB6Txf7u;6(2VE10wIP)KE91W~!Z=Ur|vE-55<_5|Utr z&f6zNbW%9QSL!WZP{~v8tsD%jOs6l^2#4z_bJ(n?L1+%o6hFmVsyGl1dUu zSg-)YP0T8a3i3QKVvKH)r_@^_6qlBHi;I@zRV>I`l<)P-6DqwJv75{fO(T+vrVv^Nn>^241HlGApXLxKNED)nYB44Z(ywJj1^G)NqJk4E zM3vIAMT}KRVPUyYnqOL0$?i~6R9IM$R|pIC>hdhgFZK%bryS#C5TN5ajb5X&_&)fp zNI3^h8aR(i%xzfN{aoe<0xDyjsPvVWL&<2Ih8%-XNz5t=J!K0P0E)sFE|^O`5e~Hz zxn7lOV#-x;e*&POu-rS3u%t|wqXz>(6Bo{)umVoRC?fTg`QX)Jl>0CY%oBr^^`5cq zWIvX%Dk&=~M@LEu^D7H=G z4MsB0R}P^H30>){q^fjVQCJBtKzANAU16{U0%KcLAe0xwl^6KR#|R62rDV~t85&|- zeEd?VU+>dF<662923=fP<{5JhIbtuC3bev{LXNhQ&0~R#obaU63Yz(tK^74HAOhvz zhqWX!dGZSiBD1HWq_7l|sG`C%uL9S6ZxJ&K&anJ`*I>f1q3oy%o;YB*ci^?ks%kwKN zr6z(C@Q@%<*#LPVo5XpQi^vB-1eyhAJ9?qftX|luBCRQ?N9JAXD>ti}2u_e+xun!$ z7Y5j=P@gnqr5=5yE-fw_Taj0|m@g%Zy@*5D;#8Smgk_oqVlX2X6GT=MV+CWY^sl0X z2RSuXCJH_Z=CVL0zha3Ioy^OxoQFX#Da2F;5d$%-^L;Fo;6VW97rX@YNpc!Q@GDG8 z!?1l77398Y2`sJjRWL$or`%ULFH%Vli9BWCW-R4Iq(=)ZkksRZN=z|GMedtN3?;>L zNds41GiuDJ%Cb?o2tX~M`)ldW!|x`$T@$nN#*9iID;T%eTobt+AGy26yfrB^%wn*Q z)E{M1q+b_7n|EVIjiaF4hJSJFFJ0*_UdP1Yq)Z}C*%)|(l2Z|#QP0Z3prWgRry4{{ zzug($DB;&`dO5E{e~F6MFzOjsyI{u&kzY$?XMBx1aY7HAg(4n3@XO0=$i`8**|yo< z{}=E0==2nNA&Fw-d!G8^GuT-r3m59RjSTK7T&BYVi;J-}>mgjF!&_K+l5m|4_haRD zVWJKXVsLlCt-}?Aim~JECd|-bFM|_>xjOtThOiEe!Q?mhkX}O{W!r7n0}1& zTt=Q_&U}vFtDo~S@Toe!H46Xq1$+Z~G72x~iI9#ce7VjiQ$G)8@Xw_OzW9-%@R@o7 zV`db7-C{21x+wgR0i4hJDEw+YFR>vCfAR$9vn2|jsnZK{I6p&910EfPZ`JqLbMiPn zjDVk$;_QWa7QB(8prUdM{z9FWE{iSri!Jyn3x22tzsiC)as^bp+Je8zLci96A8o;} zv*79clkv0Og1^~7;<~|tpJKspvEYpy2o;Accs-TIYBgE#a~OvIX|~|!S@3%;cs<3# zN?R>>BlkrGss+E)!sny~zubZsX7O=Ex&{8o{IOf`ddi0trdaTLs)^wTTJT5#MSfB( zc%*J3Kf^3|vLWMVv;|Kx89(DK_=t_7Fw=rJa>Z0fvfya%8Utz%uvrYT|y#;T#;D=f8DHi;23x1#lf29SVYQc}N;D=f8 zBQ5yR7W^m+e!K;LwFRGP!KYjBk_A7;g3qf={vF-4^^n3qHq!PqpB0v*3qW@V8s=qb>Mc3x2!>e}@I1X~9pm;3W%w zx&@zW!QW}Y&$QrYTJUo$_`59lc^3TL7JRt{e~$&f*n*#B!B<)Evn}{l7W};y{Avq6 z&w^iT!RK4>>n!-W7W{e(-ebXUu;2?U_$?NEp#>kZ;EOEyCJX*P3%=QcFSg+KTJZN< z@U0fS9#XSX)q*dv(4Vy6_0XJ^c3AMG7J5OCizwD8v*7I(e7OamV!=OP!4I_HD=hd_ z3%=5VA7;UOE%?zEyz%UeipN{U_)P=9Y2Y^v{HB55H1Pie4V)G)IV<^(+a)FOu1jr#6bO0a!p)Mu z-d@LgA0D^+cQzq>`N#MxUYaQoJFeP@ii6%@5U2TjBQzBQp%!Dr{xUUIQLRX73VM^p` zr~Vh|e=5NTOn3;vEhbC}TdmfFhZ6j*2~*-$d)b69C-_MdrUb6`hzb9m;0hC_gsnE$ zgeg(0O)+6g&}tJ+m=d$v7!#(1tah0RUqx_V6Q;zh7H7hgkkw9|i}Zgq!3Rv360=&1 z2~$E=t2JRt#A@%FFePBMmra-wuiBF)ObJ)*5fi3Ft5#vclwj57nlL3+wJ9b{2~};P z2~#3f8)L$hK-DfY;RyuyHDOAaYH=n^56ZMtzeM_#^b`acR!jvf0YE3wc;CD@! z5~JG7CQJ!Y?MV}+M5y+N2~Q@t!h|XDsm(QEN_c8hOqdd#+C&qk1gAE}gekG9U1q|R z(A4^xFeNgzI1{D>rgrLVr2mw-)DD<1B`mcT6P`kFtqD`&QhV2grxEt6Q)F@ zcIxLy|K|{Vz=SCwskN9eB_g$26ZR1Nt_f4(QG3~hDdDI+X~L9f)E+V6`v|TuVOoH+ zxh71BMs11-Q-V>OXu_0O)W$^M@Z~QKv!Cyqd zpGLtAQSgo^cvBSoRuued6#QZo{7e-5coh6-6udkNUKj{#;Af)X$D`m!qu}LH@WLp#GzumdTh70 zQb?K}a%6;-50jK9wg43lNwz(bzcxiu9xt3zYjN`a)^DLsci$rJ9ia1#8Ek;AB^+%bjv3s`5SdJ0#0}QE5y(hZg45t zX(Ui)D%D9yYg?5Qbc{|9JGLgE6ON2umd`*zir`Xa+Jm>p2Oa00bDTLVdG<&(2NK-2 z-TqK~MvXUB@|=`vjsWp#k$82t$`mnWfY_(6q)f5PJ>;6UCP}{A9&U8`Ln-KPoZPeR zZ}&K6Ic7WVoy|HftvJ3K`_=+UNw}Q$6O!!gNDoQD4``pI9_|Q-<=XU6pv8CdPTIao z!KZ&jLHaIn$C&Kkq-IA|N7AC?`MY{Z;o6`(y}9jZX4Uyonc`CoHLdncaZ`IzlVm#; z{+I6)NtxbJAdTq9TJa{Tw;-|{yuHMio}H>8Xz_@ zkgFW~QFrifbiww#$||^;9uoWbQ=r~Pe>whwBrG-hQ}x@^ucwD(e*z#Sar?zKArSJ7 z^*4pJ<>hEg_Cfm=SX^B<_0 z9#S7hNG1Dm3R7^&p+IQyyUNofp5ol#Oy89re&1Fl2*I(dm4Fx6ngiYBjl)1&)0z

r^LDBlal;JIAjZD)I5AvJ}bW6yy9#tvJngW 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 'foo' - -# Emit YAML from a Ruby object -Psych.dump("foo") # => "--- foo\n...\n" -``` - -## Dependencies - -* libyaml - -## Installation - -Psych has been included with MRI since 1.9.2, and is the default YAML parser -in 1.9.3. - -If you want a newer gem release of Psych, you can use RubyGems: - -```bash -gem install psych -``` - -Psych supported the static build with specific version of libyaml sources. You can build psych with libyaml-0.2.5 like this. - -```bash -gem install psych -- --with-libyaml-source-dir=/path/to/libyaml-0.2.5 -``` - -In order to use the gem release in your app, and not the stdlib version, -you'll need the following: - -```ruby -gem 'psych' -require 'psych' -``` - -Or if you use Bundler add this to your `Gemfile`: - -```ruby -gem 'psych' -``` - -JRuby ships with a pure Java implementation of Psych. - -## License - -Copyright 2009 Aaron Patterson, et al. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the 'Software'), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/Makefile b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/Makefile deleted file mode 100644 index 3a55652..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/Makefile +++ /dev/null @@ -1,291 +0,0 @@ - -SHELL = /bin/sh - -# V=0 quiet, V=1 verbose. other values don't work. -V = 0 -V0 = $(V:0=) -Q1 = $(V:1=) -Q = $(Q1:0=@) -ECHO1 = $(V:1=@ :) -ECHO = $(ECHO1:0=@ echo) -NULLCMD = : - -#### Start of system configuration section. #### - -srcdir = . -topdir = /usr/include/ruby-3.2.0 -hdrdir = $(topdir) -arch_hdrdir = /usr/include/x86_64-linux-gnu/ruby-3.2.0 -PATH_SEPARATOR = : -VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby -prefix = $(DESTDIR)/usr -rubysitearchprefix = $(sitearchlibdir)/$(RUBY_BASE_NAME) -rubyarchprefix = $(archlibdir)/$(RUBY_BASE_NAME) -rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) -exec_prefix = $(prefix) -vendorarchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/vendor_ruby -sitearchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/site_ruby -rubyarchhdrdir = $(archincludedir)/$(RUBY_VERSION_NAME) -vendorhdrdir = $(rubyhdrdir)/vendor_ruby -sitehdrdir = $(rubyhdrdir)/site_ruby -rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) -vendorarchdir = $(rubysitearchprefix)/vendor_ruby/$(ruby_version) -vendorlibdir = $(vendordir)/$(ruby_version) -vendordir = $(rubylibprefix)/vendor_ruby -sitearchdir = $(DESTDIR)/usr/local/lib/x86_64-linux-gnu/site_ruby -sitelibdir = $(sitedir)/$(ruby_version) -sitedir = $(DESTDIR)/usr/local/lib/site_ruby -rubyarchdir = $(rubyarchprefix)/$(ruby_version) -rubylibdir = $(rubylibprefix)/$(ruby_version) -sitearchincludedir = $(includedir)/$(sitearch) -archincludedir = $(includedir)/$(arch) -sitearchlibdir = $(libdir)/$(sitearch) -archlibdir = $(libdir)/$(arch) -ridir = $(datarootdir)/$(RI_BASE_NAME) -mandir = $(datarootdir)/man -localedir = $(datarootdir)/locale -libdir = $(exec_prefix)/lib -psdir = $(docdir) -pdfdir = $(docdir) -dvidir = $(docdir) -htmldir = $(docdir) -infodir = $(datarootdir)/info -docdir = $(datarootdir)/doc/$(PACKAGE) -oldincludedir = $(DESTDIR)/usr/include -includedir = $(prefix)/include -runstatedir = $(DESTDIR)/var/run -localstatedir = $(DESTDIR)/var -sharedstatedir = $(prefix)/com -sysconfdir = $(DESTDIR)/etc -datadir = $(datarootdir) -datarootdir = $(prefix)/share -libexecdir = $(exec_prefix)/libexec -sbindir = $(exec_prefix)/sbin -bindir = $(exec_prefix)/bin -archdir = $(rubyarchdir) - - -CC_WRAPPER = -CC = x86_64-linux-gnu-gcc -CXX = x86_64-linux-gnu-g++ -LIBRUBY = $(LIBRUBY_SO) -LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a -LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) -LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static $(MAINLIBS) -empty = -OUTFLAG = -o $(empty) -COUTFLAG = -o $(empty) -CSRCFLAG = $(empty) - -RUBY_EXTCONF_H = -cflags = $(optflags) $(debugflags) $(warnflags) -cxxflags = -optflags = -O3 -fno-fast-math -debugflags = -ggdb3 -warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdiv-by-zero -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wold-style-definition -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef -cppflags = -CCDLFLAGS = -fPIC -CFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC $(ARCH_FLAG) -INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) -DEFS = -CPPFLAGS = -Wdate-time -D_FORTIFY_SOURCE=3 $(DEFS) $(cppflags) -CXXFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 $(ARCH_FLAG) -ldflags = -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -dldflags = -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -ARCH_FLAG = -DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) -LDSHARED = $(CC) -shared -LDSHAREDXX = $(CXX) -shared -AR = x86_64-linux-gnu-gcc-ar -EXEEXT = - -RUBY_INSTALL_NAME = $(RUBY_BASE_NAME)3.2 -RUBY_SO_NAME = ruby-3.2 -RUBYW_INSTALL_NAME = -RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) -RUBYW_BASE_NAME = rubyw -RUBY_BASE_NAME = ruby - -arch = x86_64-linux-gnu -sitearch = $(arch) -ruby_version = 3.2.0 -ruby = $(bindir)/$(RUBY_BASE_NAME)3.2 -RUBY = $(ruby) -BUILTRUBY = $(bindir)/$(RUBY_BASE_NAME)3.2 -ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h - -RM = rm -f -RM_RF = rm -fr -RMDIRS = rmdir --ignore-fail-on-non-empty -p -MAKEDIRS = /bin/mkdir -p -INSTALL = /usr/bin/install -c -INSTALL_PROG = $(INSTALL) -m 0755 -INSTALL_DATA = $(INSTALL) -m 644 -COPY = cp -TOUCH = exit > - -#### End of system configuration section. #### - -preload = -libpath = . $(archlibdir) -LIBPATH = -L. -L$(archlibdir) -DEFFILE = - -CLEANFILES = mkmf.log -DISTCLEANFILES = -DISTCLEANDIRS = - -extout = -extout_prefix = -target_prefix = -LOCAL_LIBS = -LIBS = $(LIBRUBYARG_SHARED) -lyaml -lyaml -lm -lpthread -lc -ORIG_SRCS = psych.c psych_emitter.c psych_parser.c psych_to_ruby.c psych_yaml_tree.c -SRCS = $(ORIG_SRCS) -OBJS = psych.o psych_emitter.o psych_parser.o psych_to_ruby.o psych_yaml_tree.o -HDRS = $(srcdir)/psych.h $(srcdir)/psych_emitter.h $(srcdir)/psych_parser.h $(srcdir)/psych_to_ruby.h $(srcdir)/psych_yaml_tree.h -LOCAL_HDRS = -TARGET = psych -TARGET_NAME = psych -TARGET_ENTRY = Init_$(TARGET_NAME) -DLLIB = $(TARGET).so -EXTSTATIC = -STATIC_LIB = - -TIMESTAMP_DIR = . -BINDIR = $(bindir) -RUBYCOMMONDIR = $(sitedir)$(target_prefix) -RUBYLIBDIR = $(sitelibdir)$(target_prefix) -RUBYARCHDIR = $(sitearchdir)$(target_prefix) -HDRDIR = $(sitehdrdir)$(target_prefix) -ARCHHDRDIR = $(sitearchhdrdir)$(target_prefix) -TARGET_SO_DIR = -TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) -CLEANLIBS = $(TARGET_SO) false -CLEANOBJS = $(OBJS) *.bak -TARGET_SO_DIR_TIMESTAMP = $(TIMESTAMP_DIR)/.sitearchdir.time -LIBYAML = - -LIBYAML_OBJDIR = libyaml/src -OBJEXT = o -RANLIB = x86_64-linux-gnu-gcc-ranlib - -all: $(DLLIB) -static: $(STATIC_LIB) -.PHONY: all install static install-so install-rb -.PHONY: clean clean-so clean-static clean-rb - -clean-static:: -clean-rb-default:: -clean-rb:: -clean-so:: -clean: clean-so clean-static clean-rb-default clean-rb - -$(Q)$(RM_RF) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time - -distclean-rb-default:: -distclean-rb:: -distclean-so:: -distclean-static:: -distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb - -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log - -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) - -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true - -realclean: distclean -install: install-so install-rb - -install-so: $(DLLIB) $(TARGET_SO_DIR_TIMESTAMP) - $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) -clean-static:: - -$(Q)$(RM) $(STATIC_LIB) -install-rb: pre-install-rb do-install-rb install-rb-default -install-rb-default: pre-install-rb-default do-install-rb-default -pre-install-rb: Makefile -pre-install-rb-default: Makefile -do-install-rb: -do-install-rb-default: -pre-install-rb-default: - @$(NULLCMD) -$(TARGET_SO_DIR_TIMESTAMP): - $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) - $(Q) $(TOUCH) $@ - -site-install: site-install-so site-install-rb -site-install-so: install-so -site-install-rb: install-rb - -.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S - -.cc.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cc.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.mm.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.mm.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cxx.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cxx.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cpp.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cpp.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.c.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.c.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.m.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.m.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -$(TARGET_SO): $(OBJS) Makefile - $(ECHO) linking shared-object $(DLLIB) - -$(Q)$(RM) $(@) - $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) - - - -### -$(TARGET_SO): $(LIBYAML) - -libyaml $(LIBYAML): - cd libyaml && $(MAKE) - $(AR) $(ARFLAGS) $(LIBYAML) $(LIBYAML_OBJDIR)/*.$(OBJEXT) - $(RANLIB) $(LIBYAML) - -clean-so:: - -cd libyaml && $(MAKE) clean - -distclean-so:: - -cd libyaml && $(MAKE) distclean - -$(Q)$(RMDIRS) libyaml/* libyaml - -$(OBJS): $(HDRS) $(ruby_headers) \ - $(hdrdir)/ruby/encoding.h \ - $(hdrdir)/ruby/oniguruma.h diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/depend b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/depend deleted file mode 100644 index d0cb1c2..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/depend +++ /dev/null @@ -1,17 +0,0 @@ -$(TARGET_SO): $(LIBYAML) - -libyaml $(LIBYAML): - cd libyaml && $(MAKE) - $(AR) $(ARFLAGS) $(LIBYAML) $(LIBYAML_OBJDIR)/*.$(OBJEXT) - $(RANLIB) $(LIBYAML) - -clean-so:: - -cd libyaml && $(MAKE) clean - -distclean-so:: - -cd libyaml && $(MAKE) distclean - -$(Q)$(RMDIRS) libyaml/* libyaml - -$(OBJS): $(HDRS) $(ruby_headers) \ - $(hdrdir)/ruby/encoding.h \ - $(hdrdir)/ruby/oniguruma.h diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/extconf.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/extconf.rb deleted file mode 100644 index e7dd0bb..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/extconf.rb +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: us-ascii -*- -# frozen_string_literal: true -require 'mkmf' - -if $mswin or $mingw or $cygwin - $CPPFLAGS << " -DYAML_DECLARE_STATIC" -end - -yaml_source = with_config("libyaml-source-dir") -if yaml_source - yaml_source = yaml_source.gsub(/\$\((\w+)\)|\$\{(\w+)\}/) {ENV[$1||$2]} - yaml_source = yaml_source.chomp("/") - yaml_configure = "#{File.expand_path(yaml_source)}/configure" - unless File.exist?(yaml_configure) - raise "Configure script not found in #{yaml_source.quote}" - end - - puts("Configuring libyaml source in #{yaml_source.quote}") - yaml = "libyaml" - Dir.mkdir(yaml) unless File.directory?(yaml) - shared = $enable_shared || !$static - args = [ - yaml_configure, - "--enable-#{shared ? 'shared' : 'static'}", - "--host=#{RbConfig::CONFIG['host'].sub(/-unknown-/, '-').sub(/arm64/, 'arm')}", - "CC=#{RbConfig::CONFIG['CC']}", - *(["CFLAGS=-w"] if RbConfig::CONFIG["GCC"] == "yes"), - ] - puts(args.quote.join(' ')) - unless system(*args, chdir: yaml) - raise "failed to configure libyaml" - end - inc = yaml_source.start_with?("#$srcdir/") ? "$(srcdir)#{yaml_source[$srcdir.size..-1]}" : yaml_source - $INCFLAGS << " -I#{yaml}/include -I#{inc}/include" - puts("INCFLAGS=#$INCFLAGS") - libyaml = "libyaml.#$LIBEXT" - $cleanfiles << libyaml - $LOCAL_LIBS.prepend("$(LIBYAML) ") -else # default to pre-installed libyaml - pkg_config('yaml-0.1') - dir_config('libyaml') - find_header('yaml.h') or abort "yaml.h not found" - find_library('yaml', 'yaml_get_version') or abort "libyaml not found" -end - -create_makefile 'psych' do |mk| - mk << "LIBYAML = #{libyaml}".strip << "\n" - mk << "LIBYAML_OBJDIR = libyaml/src#{shared ? '/.libs' : ''}\n" - mk << "OBJEXT = #$OBJEXT" - mk << "RANLIB = #{config_string('RANLIB') || config_string('NULLCMD')}\n" -end - -# :startdoc: diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych.c b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych.c deleted file mode 100644 index afbd7a3..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych.c +++ /dev/null @@ -1,36 +0,0 @@ -#include - -/* call-seq: Psych.libyaml_version - * - * Returns the version of libyaml being used - */ -static VALUE libyaml_version(VALUE module) -{ - int major, minor, patch; - VALUE list[3]; - - yaml_get_version(&major, &minor, &patch); - - list[0] = INT2NUM(major); - list[1] = INT2NUM(minor); - list[2] = INT2NUM(patch); - - return rb_ary_new4((long)3, list); -} - -VALUE mPsych; - -void Init_psych(void) -{ - #ifdef HAVE_RB_EXT_RACTOR_SAFE - RB_EXT_RACTOR_SAFE(true); - #endif - mPsych = rb_define_module("Psych"); - - rb_define_singleton_method(mPsych, "libyaml_version", libyaml_version, 0); - - Init_psych_parser(); - Init_psych_emitter(); - Init_psych_to_ruby(); - Init_psych_yaml_tree(); -} diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych.h b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych.h deleted file mode 100644 index 6b3d63f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef PSYCH_H -#define PSYCH_H - -#include -#include - -#include - -#include -#include -#include -#include - -extern VALUE mPsych; - - -#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_emitter.c b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_emitter.c deleted file mode 100644 index 624ab7c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_emitter.c +++ /dev/null @@ -1,589 +0,0 @@ -#include - -#if !defined(RARRAY_CONST_PTR) -#define RARRAY_CONST_PTR(s) (const VALUE *)RARRAY_PTR(s) -#endif -#if !defined(RARRAY_AREF) -#define RARRAY_AREF(a, i) RARRAY_CONST_PTR(a)[i] -#endif - -VALUE cPsychEmitter; -static ID id_io; -static ID id_write; -static ID id_line_width; -static ID id_indentation; -static ID id_canonical; - -static void emit(yaml_emitter_t * emitter, yaml_event_t * event) -{ - if(!yaml_emitter_emit(emitter, event)) - rb_raise(rb_eRuntimeError, "%s", emitter->problem); -} - -static int writer(void *ctx, unsigned char *buffer, size_t size) -{ - VALUE self = (VALUE)ctx, io = rb_attr_get(self, id_io); - VALUE str = rb_enc_str_new((const char *)buffer, (long)size, rb_utf8_encoding()); - VALUE wrote = rb_funcall(io, id_write, 1, str); - return (int)NUM2INT(wrote); -} - -static void dealloc(void * ptr) -{ - yaml_emitter_t * emitter; - - emitter = (yaml_emitter_t *)ptr; - yaml_emitter_delete(emitter); - xfree(emitter); -} - -#if 0 -static size_t memsize(const void *ptr) -{ - const yaml_emitter_t *emitter = ptr; - /* TODO: calculate emitter's size */ - return 0; -} -#endif - -static const rb_data_type_t psych_emitter_type = { - "Psych/emitter", - {0, dealloc, 0,}, - 0, 0, -#ifdef RUBY_TYPED_FREE_IMMEDIATELY - RUBY_TYPED_FREE_IMMEDIATELY, -#endif -}; - -static VALUE allocate(VALUE klass) -{ - yaml_emitter_t * emitter; - VALUE obj = TypedData_Make_Struct(klass, yaml_emitter_t, &psych_emitter_type, emitter); - - yaml_emitter_initialize(emitter); - yaml_emitter_set_unicode(emitter, 1); - yaml_emitter_set_indent(emitter, 2); - - return obj; -} - -/* call-seq: Psych::Emitter.new(io, options = Psych::Emitter::OPTIONS) - * - * Create a new Psych::Emitter that writes to +io+. - */ -static VALUE initialize(int argc, VALUE *argv, VALUE self) -{ - yaml_emitter_t * emitter; - VALUE io, options; - VALUE line_width; - VALUE indent; - VALUE canonical; - - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - - if (rb_scan_args(argc, argv, "11", &io, &options) == 2) { - line_width = rb_funcall(options, id_line_width, 0); - indent = rb_funcall(options, id_indentation, 0); - canonical = rb_funcall(options, id_canonical, 0); - - yaml_emitter_set_width(emitter, NUM2INT(line_width)); - yaml_emitter_set_indent(emitter, NUM2INT(indent)); - yaml_emitter_set_canonical(emitter, Qtrue == canonical ? 1 : 0); - } - - rb_ivar_set(self, id_io, io); - yaml_emitter_set_output(emitter, writer, (void *)self); - - return self; -} - -/* call-seq: emitter.start_stream(encoding) - * - * Start a stream emission with +encoding+ - * - * See Psych::Handler#start_stream - */ -static VALUE start_stream(VALUE self, VALUE encoding) -{ - yaml_emitter_t * emitter; - yaml_event_t event; - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - Check_Type(encoding, T_FIXNUM); - - yaml_stream_start_event_initialize(&event, (yaml_encoding_t)NUM2INT(encoding)); - - emit(emitter, &event); - - return self; -} - -/* call-seq: emitter.end_stream - * - * End a stream emission - * - * See Psych::Handler#end_stream - */ -static VALUE end_stream(VALUE self) -{ - yaml_emitter_t * emitter; - yaml_event_t event; - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - - yaml_stream_end_event_initialize(&event); - - emit(emitter, &event); - - return self; -} - -struct start_document_data { - VALUE self; - VALUE version; - VALUE tags; - VALUE imp; - - yaml_tag_directive_t * head; -}; - -static VALUE start_document_try(VALUE d) -{ - struct start_document_data * data = (struct start_document_data *)d; - VALUE self = data->self; - VALUE version = data->version; - VALUE tags = data->tags; - VALUE imp = data->imp; - - yaml_emitter_t * emitter; - yaml_tag_directive_t * tail = NULL; - yaml_event_t event; - yaml_version_directive_t version_directive; - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - - Check_Type(version, T_ARRAY); - - if(RARRAY_LEN(version) > 0) { - VALUE major = rb_ary_entry(version, (long)0); - VALUE minor = rb_ary_entry(version, (long)1); - - version_directive.major = NUM2INT(major); - version_directive.minor = NUM2INT(minor); - } - - if(RTEST(tags)) { - long i = 0; - long len; - rb_encoding * encoding = rb_utf8_encoding(); - - Check_Type(tags, T_ARRAY); - - len = RARRAY_LEN(tags); - data->head = xcalloc((size_t)len, sizeof(yaml_tag_directive_t)); - tail = data->head; - - for(i = 0; i < len && i < RARRAY_LEN(tags); i++) { - VALUE tuple = RARRAY_AREF(tags, i); - VALUE name; - VALUE value; - - Check_Type(tuple, T_ARRAY); - - if(RARRAY_LEN(tuple) < 2) { - rb_raise(rb_eRuntimeError, "tag tuple must be of length 2"); - } - - name = RARRAY_AREF(tuple, 0); - value = RARRAY_AREF(tuple, 1); - StringValue(name); - StringValue(value); - name = rb_str_export_to_enc(name, encoding); - value = rb_str_export_to_enc(value, encoding); - - tail->handle = (yaml_char_t *)StringValueCStr(name); - tail->prefix = (yaml_char_t *)StringValueCStr(value); - - tail++; - } - } - - yaml_document_start_event_initialize( - &event, - (RARRAY_LEN(version) > 0) ? &version_directive : NULL, - data->head, - tail, - imp ? 1 : 0 - ); - - emit(emitter, &event); - - return self; -} - -static VALUE start_document_ensure(VALUE d) -{ - struct start_document_data * data = (struct start_document_data *)d; - - xfree(data->head); - - return Qnil; -} - -/* call-seq: emitter.start_document(version, tags, implicit) - * - * Start a document emission with YAML +version+, +tags+, and an +implicit+ - * start. - * - * See Psych::Handler#start_document - */ -static VALUE start_document(VALUE self, VALUE version, VALUE tags, VALUE imp) -{ - struct start_document_data data = { - .self = self, - .version = version, - .tags = tags, - .imp = imp, - - .head = NULL, - }; - - return rb_ensure(start_document_try, (VALUE)&data, start_document_ensure, (VALUE)&data); -} - -/* call-seq: emitter.end_document(implicit) - * - * End a document emission with an +implicit+ ending. - * - * See Psych::Handler#end_document - */ -static VALUE end_document(VALUE self, VALUE imp) -{ - yaml_emitter_t * emitter; - yaml_event_t event; - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - - yaml_document_end_event_initialize(&event, imp ? 1 : 0); - - emit(emitter, &event); - - return self; -} - -/* call-seq: emitter.scalar(value, anchor, tag, plain, quoted, style) - * - * Emit a scalar with +value+, +anchor+, +tag+, and a +plain+ or +quoted+ - * string type with +style+. - * - * See Psych::Handler#scalar - */ -static VALUE scalar( - VALUE self, - VALUE value, - VALUE anchor, - VALUE tag, - VALUE plain, - VALUE quoted, - VALUE style - ) { - yaml_emitter_t * emitter; - yaml_event_t event; - rb_encoding *encoding; - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - - Check_Type(value, T_STRING); - - encoding = rb_utf8_encoding(); - - value = rb_str_export_to_enc(value, encoding); - - if(!NIL_P(anchor)) { - Check_Type(anchor, T_STRING); - anchor = rb_str_export_to_enc(anchor, encoding); - } - - if(!NIL_P(tag)) { - Check_Type(tag, T_STRING); - tag = rb_str_export_to_enc(tag, encoding); - } - - const char *value_ptr = StringValuePtr(value); - yaml_scalar_event_initialize( - &event, - (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValueCStr(anchor)), - (yaml_char_t *)(NIL_P(tag) ? NULL : StringValueCStr(tag)), - (yaml_char_t*)value_ptr, - (int)RSTRING_LEN(value), - plain ? 1 : 0, - quoted ? 1 : 0, - (yaml_scalar_style_t)NUM2INT(style) - ); - - emit(emitter, &event); - - return self; -} - -/* call-seq: emitter.start_sequence(anchor, tag, implicit, style) - * - * Start emitting a sequence with +anchor+, a +tag+, +implicit+ sequence - * start and end, along with +style+. - * - * See Psych::Handler#start_sequence - */ -static VALUE start_sequence( - VALUE self, - VALUE anchor, - VALUE tag, - VALUE implicit, - VALUE style - ) { - yaml_emitter_t * emitter; - yaml_event_t event; - - rb_encoding * encoding = rb_utf8_encoding(); - - if(!NIL_P(anchor)) { - Check_Type(anchor, T_STRING); - anchor = rb_str_export_to_enc(anchor, encoding); - } - - if(!NIL_P(tag)) { - Check_Type(tag, T_STRING); - tag = rb_str_export_to_enc(tag, encoding); - } - - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - - yaml_sequence_start_event_initialize( - &event, - (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValueCStr(anchor)), - (yaml_char_t *)(NIL_P(tag) ? NULL : StringValueCStr(tag)), - implicit ? 1 : 0, - (yaml_sequence_style_t)NUM2INT(style) - ); - - emit(emitter, &event); - - return self; -} - -/* call-seq: emitter.end_sequence - * - * End sequence emission. - * - * See Psych::Handler#end_sequence - */ -static VALUE end_sequence(VALUE self) -{ - yaml_emitter_t * emitter; - yaml_event_t event; - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - - yaml_sequence_end_event_initialize(&event); - - emit(emitter, &event); - - return self; -} - -/* call-seq: emitter.start_mapping(anchor, tag, implicit, style) - * - * Start emitting a YAML map with +anchor+, +tag+, an +implicit+ start - * and end, and +style+. - * - * See Psych::Handler#start_mapping - */ -static VALUE start_mapping( - VALUE self, - VALUE anchor, - VALUE tag, - VALUE implicit, - VALUE style - ) { - yaml_emitter_t * emitter; - yaml_event_t event; - rb_encoding *encoding; - - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - - encoding = rb_utf8_encoding(); - - if(!NIL_P(anchor)) { - Check_Type(anchor, T_STRING); - anchor = rb_str_export_to_enc(anchor, encoding); - } - - if(!NIL_P(tag)) { - Check_Type(tag, T_STRING); - tag = rb_str_export_to_enc(tag, encoding); - } - - yaml_mapping_start_event_initialize( - &event, - (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValueCStr(anchor)), - (yaml_char_t *)(NIL_P(tag) ? NULL : StringValueCStr(tag)), - implicit ? 1 : 0, - (yaml_mapping_style_t)NUM2INT(style) - ); - - emit(emitter, &event); - - return self; -} - -/* call-seq: emitter.end_mapping - * - * Emit the end of a mapping. - * - * See Psych::Handler#end_mapping - */ -static VALUE end_mapping(VALUE self) -{ - yaml_emitter_t * emitter; - yaml_event_t event; - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - - yaml_mapping_end_event_initialize(&event); - - emit(emitter, &event); - - return self; -} - -/* call-seq: emitter.alias(anchor) - * - * Emit an alias with +anchor+. - * - * See Psych::Handler#alias - */ -static VALUE alias(VALUE self, VALUE anchor) -{ - yaml_emitter_t * emitter; - yaml_event_t event; - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - - if(!NIL_P(anchor)) { - Check_Type(anchor, T_STRING); - anchor = rb_str_export_to_enc(anchor, rb_utf8_encoding()); - } - - yaml_alias_event_initialize( - &event, - (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValueCStr(anchor)) - ); - - emit(emitter, &event); - - return self; -} - -/* call-seq: emitter.canonical = true - * - * Set the output style to canonical, or not. - */ -static VALUE set_canonical(VALUE self, VALUE style) -{ - yaml_emitter_t * emitter; - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - - yaml_emitter_set_canonical(emitter, Qtrue == style ? 1 : 0); - - return style; -} - -/* call-seq: emitter.canonical - * - * Get the output style, canonical or not. - */ -static VALUE canonical(VALUE self) -{ - yaml_emitter_t * emitter; - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - - return (emitter->canonical == 0) ? Qfalse : Qtrue; -} - -/* call-seq: emitter.indentation = level - * - * Set the indentation level to +level+. The level must be less than 10 and - * greater than 1. - */ -static VALUE set_indentation(VALUE self, VALUE level) -{ - yaml_emitter_t * emitter; - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - - yaml_emitter_set_indent(emitter, NUM2INT(level)); - - return level; -} - -/* call-seq: emitter.indentation - * - * Get the indentation level. - */ -static VALUE indentation(VALUE self) -{ - yaml_emitter_t * emitter; - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - - return INT2NUM(emitter->best_indent); -} - -/* call-seq: emitter.line_width - * - * Get the preferred line width. - */ -static VALUE line_width(VALUE self) -{ - yaml_emitter_t * emitter; - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - - return INT2NUM(emitter->best_width); -} - -/* call-seq: emitter.line_width = width - * - * Set the preferred line with to +width+. - */ -static VALUE set_line_width(VALUE self, VALUE width) -{ - yaml_emitter_t * emitter; - TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter); - - yaml_emitter_set_width(emitter, NUM2INT(width)); - - return width; -} - -void Init_psych_emitter(void) -{ -#undef rb_intern - VALUE psych = rb_define_module("Psych"); - VALUE handler = rb_define_class_under(psych, "Handler", rb_cObject); - cPsychEmitter = rb_define_class_under(psych, "Emitter", handler); - - rb_define_alloc_func(cPsychEmitter, allocate); - - rb_define_method(cPsychEmitter, "initialize", initialize, -1); - rb_define_method(cPsychEmitter, "start_stream", start_stream, 1); - rb_define_method(cPsychEmitter, "end_stream", end_stream, 0); - rb_define_method(cPsychEmitter, "start_document", start_document, 3); - rb_define_method(cPsychEmitter, "end_document", end_document, 1); - rb_define_method(cPsychEmitter, "scalar", scalar, 6); - rb_define_method(cPsychEmitter, "start_sequence", start_sequence, 4); - rb_define_method(cPsychEmitter, "end_sequence", end_sequence, 0); - rb_define_method(cPsychEmitter, "start_mapping", start_mapping, 4); - rb_define_method(cPsychEmitter, "end_mapping", end_mapping, 0); - rb_define_method(cPsychEmitter, "alias", alias, 1); - rb_define_method(cPsychEmitter, "canonical", canonical, 0); - rb_define_method(cPsychEmitter, "canonical=", set_canonical, 1); - rb_define_method(cPsychEmitter, "indentation", indentation, 0); - rb_define_method(cPsychEmitter, "indentation=", set_indentation, 1); - rb_define_method(cPsychEmitter, "line_width", line_width, 0); - rb_define_method(cPsychEmitter, "line_width=", set_line_width, 1); - - id_io = rb_intern("io"); - id_write = rb_intern("write"); - id_line_width = rb_intern("line_width"); - id_indentation = rb_intern("indentation"); - id_canonical = rb_intern("canonical"); -} diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_emitter.h b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_emitter.h deleted file mode 100644 index 4c1482a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_emitter.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef PSYCH_EMITTER_H -#define PSYCH_EMITTER_H - -#include - -void Init_psych_emitter(void); - -#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_parser.c b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_parser.c deleted file mode 100644 index d973496..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_parser.c +++ /dev/null @@ -1,564 +0,0 @@ -#include - -VALUE cPsychParser; - -static ID id_read; -static ID id_path; -static ID id_empty; -static ID id_start_stream; -static ID id_end_stream; -static ID id_start_document; -static ID id_end_document; -static ID id_alias; -static ID id_scalar; -static ID id_start_sequence; -static ID id_end_sequence; -static ID id_start_mapping; -static ID id_end_mapping; -static ID id_event_location; - -#define PSYCH_TRANSCODE(_str, _yaml_enc, _internal_enc) \ - do { \ - rb_enc_associate_index((_str), (_yaml_enc)); \ - if(_internal_enc) \ - (_str) = rb_str_export_to_enc((_str), (_internal_enc)); \ - } while (0) - -static int io_reader(void * data, unsigned char *buf, size_t size, size_t *read) -{ - VALUE io = (VALUE)data; - VALUE string = rb_funcall(io, id_read, 1, SIZET2NUM(size)); - - *read = 0; - - if(! NIL_P(string)) { - void * str = (void *)StringValuePtr(string); - *read = (size_t)RSTRING_LEN(string); - memcpy(buf, str, *read); - } - - return 1; -} - -static void dealloc(void * ptr) -{ - yaml_parser_t * parser; - - parser = (yaml_parser_t *)ptr; - yaml_parser_delete(parser); - xfree(parser); -} - -#if 0 -static size_t memsize(const void *ptr) -{ - const yaml_parser_t *parser = ptr; - /* TODO: calculate parser's size */ - return 0; -} -#endif - -static const rb_data_type_t psych_parser_type = { - "Psych/parser", - {0, dealloc, 0,}, - 0, 0, -#ifdef RUBY_TYPED_FREE_IMMEDIATELY - RUBY_TYPED_FREE_IMMEDIATELY, -#endif -}; - -static VALUE allocate(VALUE klass) -{ - yaml_parser_t * parser; - VALUE obj = TypedData_Make_Struct(klass, yaml_parser_t, &psych_parser_type, parser); - - yaml_parser_initialize(parser); - - return obj; -} - -static VALUE make_exception(yaml_parser_t * parser, VALUE path) -{ - if (parser->error == YAML_MEMORY_ERROR) { - return rb_eNoMemError; - } else { - size_t line, column; - VALUE ePsychSyntaxError; - - line = parser->context_mark.line + 1; - column = parser->context_mark.column + 1; - - ePsychSyntaxError = rb_const_get(mPsych, rb_intern("SyntaxError")); - - return rb_funcall(ePsychSyntaxError, rb_intern("new"), 6, - path, - SIZET2NUM(line), - SIZET2NUM(column), - SIZET2NUM(parser->problem_offset), - parser->problem ? rb_usascii_str_new2(parser->problem) : Qnil, - parser->context ? rb_usascii_str_new2(parser->context) : Qnil); - } -} - -static VALUE transcode_string(VALUE src, int * parser_encoding) -{ - int utf8 = rb_utf8_encindex(); - int utf16le = rb_enc_find_index("UTF-16LE"); - int utf16be = rb_enc_find_index("UTF-16BE"); - int source_encoding = rb_enc_get_index(src); - - if (source_encoding == utf8) { - *parser_encoding = YAML_UTF8_ENCODING; - return src; - } - - if (source_encoding == utf16le) { - *parser_encoding = YAML_UTF16LE_ENCODING; - return src; - } - - if (source_encoding == utf16be) { - *parser_encoding = YAML_UTF16BE_ENCODING; - return src; - } - - src = rb_str_export_to_enc(src, rb_utf8_encoding()); - RB_GC_GUARD(src); - - *parser_encoding = YAML_UTF8_ENCODING; - return src; -} - -static VALUE transcode_io(VALUE src, int * parser_encoding) -{ - VALUE io_external_encoding; - int io_external_enc_index; - - io_external_encoding = rb_funcall(src, rb_intern("external_encoding"), 0); - - /* if no encoding is returned, assume ascii8bit. */ - if (NIL_P(io_external_encoding)) { - io_external_enc_index = rb_ascii8bit_encindex(); - } else { - io_external_enc_index = rb_to_encoding_index(io_external_encoding); - } - - /* Treat US-ASCII as utf_8 */ - if (io_external_enc_index == rb_usascii_encindex()) { - *parser_encoding = YAML_UTF8_ENCODING; - return src; - } - - if (io_external_enc_index == rb_utf8_encindex()) { - *parser_encoding = YAML_UTF8_ENCODING; - return src; - } - - if (io_external_enc_index == rb_enc_find_index("UTF-16LE")) { - *parser_encoding = YAML_UTF16LE_ENCODING; - return src; - } - - if (io_external_enc_index == rb_enc_find_index("UTF-16BE")) { - *parser_encoding = YAML_UTF16BE_ENCODING; - return src; - } - - /* Just guess on ASCII-8BIT */ - if (io_external_enc_index == rb_ascii8bit_encindex()) { - *parser_encoding = YAML_ANY_ENCODING; - return src; - } - - /* If the external encoding is something we don't know how to handle, - * fall back to YAML_ANY_ENCODING. */ - *parser_encoding = YAML_ANY_ENCODING; - - return src; -} - -static VALUE protected_start_stream(VALUE pointer) -{ - VALUE *args = (VALUE *)pointer; - return rb_funcall(args[0], id_start_stream, 1, args[1]); -} - -static VALUE protected_start_document(VALUE pointer) -{ - VALUE *args = (VALUE *)pointer; - return rb_funcall3(args[0], id_start_document, 3, args + 1); -} - -static VALUE protected_end_document(VALUE pointer) -{ - VALUE *args = (VALUE *)pointer; - return rb_funcall(args[0], id_end_document, 1, args[1]); -} - -static VALUE protected_alias(VALUE pointer) -{ - VALUE *args = (VALUE *)pointer; - return rb_funcall(args[0], id_alias, 1, args[1]); -} - -static VALUE protected_scalar(VALUE pointer) -{ - VALUE *args = (VALUE *)pointer; - return rb_funcall3(args[0], id_scalar, 6, args + 1); -} - -static VALUE protected_start_sequence(VALUE pointer) -{ - VALUE *args = (VALUE *)pointer; - return rb_funcall3(args[0], id_start_sequence, 4, args + 1); -} - -static VALUE protected_end_sequence(VALUE handler) -{ - return rb_funcall(handler, id_end_sequence, 0); -} - -static VALUE protected_start_mapping(VALUE pointer) -{ - VALUE *args = (VALUE *)pointer; - return rb_funcall3(args[0], id_start_mapping, 4, args + 1); -} - -static VALUE protected_end_mapping(VALUE handler) -{ - return rb_funcall(handler, id_end_mapping, 0); -} - -static VALUE protected_empty(VALUE handler) -{ - return rb_funcall(handler, id_empty, 0); -} - -static VALUE protected_end_stream(VALUE handler) -{ - return rb_funcall(handler, id_end_stream, 0); -} - -static VALUE protected_event_location(VALUE pointer) -{ - VALUE *args = (VALUE *)pointer; - return rb_funcall3(args[0], id_event_location, 4, args + 1); -} - -static VALUE parse(VALUE self, VALUE handler, VALUE yaml, VALUE path) -{ - yaml_parser_t * parser; - yaml_event_t event; - int done = 0; - int state = 0; - int parser_encoding = YAML_ANY_ENCODING; - int encoding = rb_utf8_encindex(); - rb_encoding * internal_enc = rb_default_internal_encoding(); - - TypedData_Get_Struct(self, yaml_parser_t, &psych_parser_type, parser); - - yaml_parser_delete(parser); - yaml_parser_initialize(parser); - - if (rb_respond_to(yaml, id_read)) { - yaml = transcode_io(yaml, &parser_encoding); - yaml_parser_set_encoding(parser, parser_encoding); - yaml_parser_set_input(parser, io_reader, (void *)yaml); - } else { - StringValue(yaml); - yaml = transcode_string(yaml, &parser_encoding); - yaml_parser_set_encoding(parser, parser_encoding); - yaml_parser_set_input_string( - parser, - (const unsigned char *)RSTRING_PTR(yaml), - (size_t)RSTRING_LEN(yaml) - ); - } - - while(!done) { - VALUE event_args[5]; - VALUE start_line, start_column, end_line, end_column; - - if(parser->error || !yaml_parser_parse(parser, &event)) { - VALUE exception; - - exception = make_exception(parser, path); - yaml_parser_delete(parser); - yaml_parser_initialize(parser); - - rb_exc_raise(exception); - } - - start_line = SIZET2NUM(event.start_mark.line); - start_column = SIZET2NUM(event.start_mark.column); - end_line = SIZET2NUM(event.end_mark.line); - end_column = SIZET2NUM(event.end_mark.column); - - event_args[0] = handler; - event_args[1] = start_line; - event_args[2] = start_column; - event_args[3] = end_line; - event_args[4] = end_column; - rb_protect(protected_event_location, (VALUE)event_args, &state); - - switch(event.type) { - case YAML_STREAM_START_EVENT: - { - VALUE args[2]; - - args[0] = handler; - args[1] = INT2NUM(event.data.stream_start.encoding); - rb_protect(protected_start_stream, (VALUE)args, &state); - } - break; - case YAML_DOCUMENT_START_EVENT: - { - VALUE args[4]; - /* Get a list of tag directives (if any) */ - VALUE tag_directives = rb_ary_new(); - /* Grab the document version */ - VALUE version = event.data.document_start.version_directive ? - rb_ary_new3( - (long)2, - INT2NUM(event.data.document_start.version_directive->major), - INT2NUM(event.data.document_start.version_directive->minor) - ) : rb_ary_new(); - - if(event.data.document_start.tag_directives.start) { - yaml_tag_directive_t *start = - event.data.document_start.tag_directives.start; - yaml_tag_directive_t *end = - event.data.document_start.tag_directives.end; - for(; start != end; start++) { - VALUE handle = Qnil; - VALUE prefix = Qnil; - if(start->handle) { - handle = rb_str_new2((const char *)start->handle); - PSYCH_TRANSCODE(handle, encoding, internal_enc); - } - - if(start->prefix) { - prefix = rb_str_new2((const char *)start->prefix); - PSYCH_TRANSCODE(prefix, encoding, internal_enc); - } - - rb_ary_push(tag_directives, rb_ary_new3((long)2, handle, prefix)); - } - } - args[0] = handler; - args[1] = version; - args[2] = tag_directives; - args[3] = event.data.document_start.implicit == 1 ? Qtrue : Qfalse; - rb_protect(protected_start_document, (VALUE)args, &state); - } - break; - case YAML_DOCUMENT_END_EVENT: - { - VALUE args[2]; - - args[0] = handler; - args[1] = event.data.document_end.implicit == 1 ? Qtrue : Qfalse; - rb_protect(protected_end_document, (VALUE)args, &state); - } - break; - case YAML_ALIAS_EVENT: - { - VALUE args[2]; - VALUE alias = Qnil; - if(event.data.alias.anchor) { - alias = rb_str_new2((const char *)event.data.alias.anchor); - PSYCH_TRANSCODE(alias, encoding, internal_enc); - } - - args[0] = handler; - args[1] = alias; - rb_protect(protected_alias, (VALUE)args, &state); - } - break; - case YAML_SCALAR_EVENT: - { - VALUE args[7]; - VALUE anchor = Qnil; - VALUE tag = Qnil; - VALUE plain_implicit, quoted_implicit, style; - VALUE val = rb_str_new( - (const char *)event.data.scalar.value, - (long)event.data.scalar.length - ); - - PSYCH_TRANSCODE(val, encoding, internal_enc); - - if(event.data.scalar.anchor) { - anchor = rb_str_new2((const char *)event.data.scalar.anchor); - PSYCH_TRANSCODE(anchor, encoding, internal_enc); - } - - if(event.data.scalar.tag) { - tag = rb_str_new2((const char *)event.data.scalar.tag); - PSYCH_TRANSCODE(tag, encoding, internal_enc); - } - - plain_implicit = - event.data.scalar.plain_implicit == 0 ? Qfalse : Qtrue; - - quoted_implicit = - event.data.scalar.quoted_implicit == 0 ? Qfalse : Qtrue; - - style = INT2NUM(event.data.scalar.style); - - args[0] = handler; - args[1] = val; - args[2] = anchor; - args[3] = tag; - args[4] = plain_implicit; - args[5] = quoted_implicit; - args[6] = style; - rb_protect(protected_scalar, (VALUE)args, &state); - } - break; - case YAML_SEQUENCE_START_EVENT: - { - VALUE args[5]; - VALUE anchor = Qnil; - VALUE tag = Qnil; - VALUE implicit, style; - if(event.data.sequence_start.anchor) { - anchor = rb_str_new2((const char *)event.data.sequence_start.anchor); - PSYCH_TRANSCODE(anchor, encoding, internal_enc); - } - - tag = Qnil; - if(event.data.sequence_start.tag) { - tag = rb_str_new2((const char *)event.data.sequence_start.tag); - PSYCH_TRANSCODE(tag, encoding, internal_enc); - } - - implicit = - event.data.sequence_start.implicit == 0 ? Qfalse : Qtrue; - - style = INT2NUM(event.data.sequence_start.style); - - args[0] = handler; - args[1] = anchor; - args[2] = tag; - args[3] = implicit; - args[4] = style; - - rb_protect(protected_start_sequence, (VALUE)args, &state); - } - break; - case YAML_SEQUENCE_END_EVENT: - rb_protect(protected_end_sequence, handler, &state); - break; - case YAML_MAPPING_START_EVENT: - { - VALUE args[5]; - VALUE anchor = Qnil; - VALUE tag = Qnil; - VALUE implicit, style; - if(event.data.mapping_start.anchor) { - anchor = rb_str_new2((const char *)event.data.mapping_start.anchor); - PSYCH_TRANSCODE(anchor, encoding, internal_enc); - } - - if(event.data.mapping_start.tag) { - tag = rb_str_new2((const char *)event.data.mapping_start.tag); - PSYCH_TRANSCODE(tag, encoding, internal_enc); - } - - implicit = - event.data.mapping_start.implicit == 0 ? Qfalse : Qtrue; - - style = INT2NUM(event.data.mapping_start.style); - - args[0] = handler; - args[1] = anchor; - args[2] = tag; - args[3] = implicit; - args[4] = style; - - rb_protect(protected_start_mapping, (VALUE)args, &state); - } - break; - case YAML_MAPPING_END_EVENT: - rb_protect(protected_end_mapping, handler, &state); - break; - case YAML_NO_EVENT: - rb_protect(protected_empty, handler, &state); - break; - case YAML_STREAM_END_EVENT: - rb_protect(protected_end_stream, handler, &state); - done = 1; - break; - } - yaml_event_delete(&event); - if (state) rb_jump_tag(state); - } - - return self; -} - -/* - * call-seq: - * parser.mark # => # - * - * Returns a Psych::Parser::Mark object that contains line, column, and index - * information. - */ -static VALUE mark(VALUE self) -{ - VALUE mark_klass; - VALUE args[3]; - yaml_parser_t * parser; - - TypedData_Get_Struct(self, yaml_parser_t, &psych_parser_type, parser); - mark_klass = rb_const_get_at(cPsychParser, rb_intern("Mark")); - args[0] = SIZET2NUM(parser->mark.index); - args[1] = SIZET2NUM(parser->mark.line); - args[2] = SIZET2NUM(parser->mark.column); - - return rb_class_new_instance(3, args, mark_klass); -} - -void Init_psych_parser(void) -{ -#undef rb_intern -#if 0 - mPsych = rb_define_module("Psych"); -#endif - - cPsychParser = rb_define_class_under(mPsych, "Parser", rb_cObject); - rb_define_alloc_func(cPsychParser, allocate); - - /* Any encoding: Let the parser choose the encoding */ - rb_define_const(cPsychParser, "ANY", INT2NUM(YAML_ANY_ENCODING)); - - /* UTF-8 Encoding */ - rb_define_const(cPsychParser, "UTF8", INT2NUM(YAML_UTF8_ENCODING)); - - /* UTF-16-LE Encoding with BOM */ - rb_define_const(cPsychParser, "UTF16LE", INT2NUM(YAML_UTF16LE_ENCODING)); - - /* UTF-16-BE Encoding with BOM */ - rb_define_const(cPsychParser, "UTF16BE", INT2NUM(YAML_UTF16BE_ENCODING)); - - rb_require("psych/syntax_error"); - - rb_define_private_method(cPsychParser, "_native_parse", parse, 3); - rb_define_method(cPsychParser, "mark", mark, 0); - - id_read = rb_intern("read"); - id_path = rb_intern("path"); - id_empty = rb_intern("empty"); - id_start_stream = rb_intern("start_stream"); - id_end_stream = rb_intern("end_stream"); - id_start_document = rb_intern("start_document"); - id_end_document = rb_intern("end_document"); - id_alias = rb_intern("alias"); - id_scalar = rb_intern("scalar"); - id_start_sequence = rb_intern("start_sequence"); - id_end_sequence = rb_intern("end_sequence"); - id_start_mapping = rb_intern("start_mapping"); - id_end_mapping = rb_intern("end_mapping"); - id_event_location = rb_intern("event_location"); -} diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_parser.h b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_parser.h deleted file mode 100644 index beb3dd0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_parser.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef PSYCH_PARSER_H -#define PSYCH_PARSER_H - -void Init_psych_parser(void); - -#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_to_ruby.c b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_to_ruby.c deleted file mode 100644 index d473a5f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_to_ruby.c +++ /dev/null @@ -1,48 +0,0 @@ -#include - -VALUE cPsychVisitorsToRuby; - -/* call-seq: vis.build_exception(klass, message) - * - * Create an exception with class +klass+ and +message+ - */ -static VALUE build_exception(VALUE self, VALUE klass, VALUE mesg) -{ - VALUE e = rb_obj_alloc(klass); - - rb_iv_set(e, "mesg", mesg); - - return e; -} - -/* call-seq: vis.path2class(path) - * - * Convert +path+ string to a class - */ -static VALUE path2class(VALUE self, VALUE path) -{ - return rb_path_to_class(path); -} - -static VALUE init_struct(VALUE self, VALUE data, VALUE attrs) -{ - VALUE args = rb_ary_new2(1); - rb_ary_push(args, attrs); - rb_struct_initialize(data, args); - - return data; -} - -void Init_psych_to_ruby(void) -{ - VALUE psych = rb_define_module("Psych"); - VALUE class_loader = rb_define_class_under(psych, "ClassLoader", rb_cObject); - - VALUE visitors = rb_define_module_under(psych, "Visitors"); - VALUE visitor = rb_define_class_under(visitors, "Visitor", rb_cObject); - cPsychVisitorsToRuby = rb_define_class_under(visitors, "ToRuby", visitor); - - rb_define_private_method(cPsychVisitorsToRuby, "init_struct", init_struct, 2); - rb_define_private_method(cPsychVisitorsToRuby, "build_exception", build_exception, 2); - rb_define_private_method(class_loader, "path2class", path2class, 1); -} diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_to_ruby.h b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_to_ruby.h deleted file mode 100644 index 7b8e757..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_to_ruby.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef PSYCH_TO_RUBY_H -#define PSYCH_TO_RUBY_H - -#include - -void Init_psych_to_ruby(void); - -#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_yaml_tree.c b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_yaml_tree.c deleted file mode 100644 index bbd93f8..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_yaml_tree.c +++ /dev/null @@ -1,11 +0,0 @@ -#include - -VALUE cPsychVisitorsYamlTree; - -void Init_psych_yaml_tree(void) -{ - VALUE psych = rb_define_module("Psych"); - VALUE visitors = rb_define_module_under(psych, "Visitors"); - VALUE visitor = rb_define_class_under(visitors, "Visitor", rb_cObject); - cPsychVisitorsYamlTree = rb_define_class_under(visitors, "YAMLTree", visitor); -} diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_yaml_tree.h b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_yaml_tree.h deleted file mode 100644 index 4628a69..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/ext/psych/psych_yaml_tree.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef PSYCH_YAML_TREE_H -#define PSYCH_YAML_TREE_H - -#include - -void Init_psych_yaml_tree(void); - -#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych.rb deleted file mode 100644 index 0c158c9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych.rb +++ /dev/null @@ -1,793 +0,0 @@ -# frozen_string_literal: true -require 'date' - -require_relative 'psych/versions' -case RUBY_ENGINE -when 'jruby' - require_relative 'psych_jars' - if JRuby::Util.respond_to?(:load_ext) - JRuby::Util.load_ext('org.jruby.ext.psych.PsychLibrary') - else - require 'java'; require 'jruby' - org.jruby.ext.psych.PsychLibrary.new.load(JRuby.runtime, false) - end -else - require 'psych.so' -end -require_relative 'psych/nodes' -require_relative 'psych/streaming' -require_relative 'psych/visitors' -require_relative 'psych/handler' -require_relative 'psych/tree_builder' -require_relative 'psych/parser' -require_relative 'psych/omap' -require_relative 'psych/set' -require_relative 'psych/coder' -require_relative 'psych/stream' -require_relative 'psych/json/tree_builder' -require_relative 'psych/json/stream' -require_relative 'psych/handlers/document_stream' -require_relative 'psych/class_loader' - -### -# = Overview -# -# Psych is a YAML parser and emitter. -# Psych leverages libyaml [Home page: https://pyyaml.org/wiki/LibYAML] -# or [git repo: https://github.com/yaml/libyaml] for its YAML parsing -# and emitting capabilities. In addition to wrapping libyaml, Psych also -# knows how to serialize and de-serialize most Ruby objects to and from -# the YAML format. -# -# = I NEED TO PARSE OR EMIT YAML RIGHT NOW! -# -# # Parse some YAML -# Psych.load("--- foo") # => "foo" -# -# # Emit some YAML -# Psych.dump("foo") # => "--- foo\n...\n" -# { :a => 'b'}.to_yaml # => "---\n:a: b\n" -# -# Got more time on your hands? Keep on reading! -# -# == YAML Parsing -# -# Psych provides a range of interfaces for parsing a YAML document ranging from -# low level to high level, depending on your parsing needs. At the lowest -# level, is an event based parser. Mid level is access to the raw YAML AST, -# and at the highest level is the ability to unmarshal YAML to Ruby objects. -# -# == YAML Emitting -# -# Psych provides a range of interfaces ranging from low to high level for -# producing YAML documents. Very similar to the YAML parsing interfaces, Psych -# provides at the lowest level, an event based system, mid-level is building -# a YAML AST, and the highest level is converting a Ruby object straight to -# a YAML document. -# -# == High-level API -# -# === Parsing -# -# The high level YAML parser provided by Psych simply takes YAML as input and -# returns a Ruby data structure. For information on using the high level parser -# see Psych.load -# -# ==== Reading from a string -# -# Psych.safe_load("--- a") # => 'a' -# Psych.safe_load("---\n - a\n - b") # => ['a', 'b'] -# # From a trusted string: -# Psych.load("--- !ruby/range\nbegin: 0\nend: 42\nexcl: false\n") # => 0..42 -# -# ==== Reading from a file -# -# Psych.safe_load_file("data.yml", permitted_classes: [Date]) -# Psych.load_file("trusted_database.yml") -# -# ==== \Exception handling -# -# begin -# # The second argument changes only the exception contents -# Psych.parse("--- `", "file.txt") -# rescue Psych::SyntaxError => ex -# ex.file # => 'file.txt' -# ex.message # => "(file.txt): found character that cannot start any token" -# end -# -# === Emitting -# -# The high level emitter has the easiest interface. Psych simply takes a Ruby -# data structure and converts it to a YAML document. See Psych.dump for more -# information on dumping a Ruby data structure. -# -# ==== Writing to a string -# -# # Dump an array, get back a YAML string -# Psych.dump(['a', 'b']) # => "---\n- a\n- b\n" -# -# # Dump an array to an IO object -# Psych.dump(['a', 'b'], StringIO.new) # => # -# -# # Dump an array with indentation set -# Psych.dump(['a', ['b']], :indentation => 3) # => "---\n- a\n- - b\n" -# -# # Dump an array to an IO with indentation set -# Psych.dump(['a', ['b']], StringIO.new, :indentation => 3) -# -# ==== Writing to a file -# -# Currently there is no direct API for dumping Ruby structure to file: -# -# File.open('database.yml', 'w') do |file| -# file.write(Psych.dump(['a', 'b'])) -# end -# -# == Mid-level API -# -# === Parsing -# -# Psych provides access to an AST produced from parsing a YAML document. This -# tree is built using the Psych::Parser and Psych::TreeBuilder. The AST can -# be examined and manipulated freely. Please see Psych::parse_stream, -# Psych::Nodes, and Psych::Nodes::Node for more information on dealing with -# YAML syntax trees. -# -# ==== Reading from a string -# -# # Returns Psych::Nodes::Stream -# Psych.parse_stream("---\n - a\n - b") -# -# # Returns Psych::Nodes::Document -# Psych.parse("---\n - a\n - b") -# -# ==== Reading from a file -# -# # Returns Psych::Nodes::Stream -# Psych.parse_stream(File.read('database.yml')) -# -# # Returns Psych::Nodes::Document -# Psych.parse_file('database.yml') -# -# ==== \Exception handling -# -# begin -# # The second argument changes only the exception contents -# Psych.parse("--- `", "file.txt") -# rescue Psych::SyntaxError => ex -# ex.file # => 'file.txt' -# ex.message # => "(file.txt): found character that cannot start any token" -# end -# -# === Emitting -# -# At the mid level is building an AST. This AST is exactly the same as the AST -# used when parsing a YAML document. Users can build an AST by hand and the -# AST knows how to emit itself as a YAML document. See Psych::Nodes, -# Psych::Nodes::Node, and Psych::TreeBuilder for more information on building -# a YAML AST. -# -# ==== Writing to a string -# -# # We need Psych::Nodes::Stream (not Psych::Nodes::Document) -# stream = Psych.parse_stream("---\n - a\n - b") -# -# stream.to_yaml # => "---\n- a\n- b\n" -# -# ==== Writing to a file -# -# # We need Psych::Nodes::Stream (not Psych::Nodes::Document) -# stream = Psych.parse_stream(File.read('database.yml')) -# -# File.open('database.yml', 'w') do |file| -# file.write(stream.to_yaml) -# end -# -# == Low-level API -# -# === Parsing -# -# The lowest level parser should be used when the YAML input is already known, -# and the developer does not want to pay the price of building an AST or -# automatic detection and conversion to Ruby objects. See Psych::Parser for -# more information on using the event based parser. -# -# ==== Reading to Psych::Nodes::Stream structure -# -# parser = Psych::Parser.new(TreeBuilder.new) # => # -# parser = Psych.parser # it's an alias for the above -# -# parser.parse("---\n - a\n - b") # => # -# parser.handler # => # -# parser.handler.root # => # -# -# ==== Receiving an events stream -# -# recorder = Psych::Handlers::Recorder.new -# parser = Psych::Parser.new(recorder) -# -# parser.parse("---\n - a\n - b") -# recorder.events # => [list of [event, args] lists] -# # event is one of: Psych::Handler::EVENTS -# # args are the arguments passed to the event -# -# === Emitting -# -# The lowest level emitter is an event based system. Events are sent to a -# Psych::Emitter object. That object knows how to convert the events to a YAML -# document. This interface should be used when document format is known in -# advance or speed is a concern. See Psych::Emitter for more information. -# -# ==== Writing to a Ruby structure -# -# Psych.parser.parse("--- a") # => # -# -# parser.handler.first # => # -# parser.handler.first.to_ruby # => ["a"] -# -# parser.handler.root.first # => # -# parser.handler.root.first.to_ruby # => "a" -# -# # You can instantiate an Emitter manually -# Psych::Visitors::ToRuby.new.accept(parser.handler.root.first) -# # => "a" - -module Psych - # The version of libyaml Psych is using - LIBYAML_VERSION = Psych.libyaml_version.join('.').freeze - - ### - # Load +yaml+ in to a Ruby data structure. If multiple documents are - # provided, the object contained in the first document will be returned. - # +filename+ will be used in the exception message if any exception - # is raised while parsing. If +yaml+ is empty, it returns - # the specified +fallback+ return value, which defaults to +false+. - # - # Raises a Psych::SyntaxError when a YAML syntax error is detected. - # - # Example: - # - # Psych.unsafe_load("--- a") # => 'a' - # Psych.unsafe_load("---\n - a\n - b") # => ['a', 'b'] - # - # begin - # Psych.unsafe_load("--- `", filename: "file.txt") - # rescue Psych::SyntaxError => ex - # ex.file # => 'file.txt' - # ex.message # => "(file.txt): found character that cannot start any token" - # end - # - # When the optional +symbolize_names+ keyword argument is set to a - # true value, returns symbols for keys in Hash objects (default: strings). - # - # Psych.unsafe_load("---\n foo: bar") # => {"foo"=>"bar"} - # Psych.unsafe_load("---\n foo: bar", symbolize_names: true) # => {:foo=>"bar"} - # - # Raises a TypeError when `yaml` parameter is NilClass - # - # NOTE: This method *should not* be used to parse untrusted documents, such as - # YAML documents that are supplied via user input. Instead, please use the - # load method or the safe_load method. - # - def self.unsafe_load yaml, filename: nil, fallback: false, symbolize_names: false, freeze: false, strict_integer: false - result = parse(yaml, filename: filename) - return fallback unless result - result.to_ruby(symbolize_names: symbolize_names, freeze: freeze, strict_integer: strict_integer) - end - - ### - # Safely load the yaml string in +yaml+. By default, only the following - # classes are allowed to be deserialized: - # - # * TrueClass - # * FalseClass - # * NilClass - # * Integer - # * Float - # * String - # * Array - # * Hash - # - # Recursive data structures are not allowed by default. Arbitrary classes - # can be allowed by adding those classes to the +permitted_classes+ keyword argument. They are - # additive. For example, to allow Date deserialization: - # - # Psych.safe_load(yaml, permitted_classes: [Date]) - # - # Now the Date class can be loaded in addition to the classes listed above. - # - # Aliases can be explicitly allowed by changing the +aliases+ keyword argument. - # For example: - # - # x = [] - # x << x - # yaml = Psych.dump x - # Psych.safe_load yaml # => raises an exception - # Psych.safe_load yaml, aliases: true # => loads the aliases - # - # A Psych::DisallowedClass exception will be raised if the yaml contains a - # class that isn't in the +permitted_classes+ list. - # - # A Psych::AliasesNotEnabled exception will be raised if the yaml contains aliases - # but the +aliases+ keyword argument is set to false. - # - # +filename+ will be used in the exception message if any exception is raised - # while parsing. - # - # When the optional +symbolize_names+ keyword argument is set to a - # true value, returns symbols for keys in Hash objects (default: strings). - # - # Psych.safe_load("---\n foo: bar") # => {"foo"=>"bar"} - # Psych.safe_load("---\n foo: bar", symbolize_names: true) # => {:foo=>"bar"} - # - def self.safe_load yaml, permitted_classes: [], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false, strict_integer: false - result = parse(yaml, filename: filename) - return fallback unless result - - class_loader = ClassLoader::Restricted.new(permitted_classes.map(&:to_s), - permitted_symbols.map(&:to_s)) - scanner = ScalarScanner.new class_loader, strict_integer: strict_integer - visitor = if aliases - Visitors::ToRuby.new scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze - else - Visitors::NoAliasRuby.new scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze - end - result = visitor.accept result - result - end - - ### - # Load +yaml+ in to a Ruby data structure. If multiple documents are - # provided, the object contained in the first document will be returned. - # +filename+ will be used in the exception message if any exception - # is raised while parsing. If +yaml+ is empty, it returns - # the specified +fallback+ return value, which defaults to +nil+. - # - # Raises a Psych::SyntaxError when a YAML syntax error is detected. - # - # Example: - # - # Psych.load("--- a") # => 'a' - # Psych.load("---\n - a\n - b") # => ['a', 'b'] - # - # begin - # Psych.load("--- `", filename: "file.txt") - # rescue Psych::SyntaxError => ex - # ex.file # => 'file.txt' - # ex.message # => "(file.txt): found character that cannot start any token" - # end - # - # When the optional +symbolize_names+ keyword argument is set to a - # true value, returns symbols for keys in Hash objects (default: strings). - # - # Psych.load("---\n foo: bar") # => {"foo"=>"bar"} - # Psych.load("---\n foo: bar", symbolize_names: true) # => {:foo=>"bar"} - # - # Raises a TypeError when `yaml` parameter is NilClass. This method is - # similar to `safe_load` except that `Symbol` objects are allowed by default. - # - def self.load yaml, permitted_classes: [Symbol], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false, strict_integer: false - safe_load yaml, permitted_classes: permitted_classes, - permitted_symbols: permitted_symbols, - aliases: aliases, - filename: filename, - fallback: fallback, - symbolize_names: symbolize_names, - freeze: freeze, - strict_integer: strict_integer - end - - ### - # Parse a YAML string in +yaml+. Returns the Psych::Nodes::Document. - # +filename+ is used in the exception message if a Psych::SyntaxError is - # raised. - # - # Raises a Psych::SyntaxError when a YAML syntax error is detected. - # - # Example: - # - # Psych.parse("---\n - a\n - b") # => # - # - # begin - # Psych.parse("--- `", filename: "file.txt") - # rescue Psych::SyntaxError => ex - # ex.file # => 'file.txt' - # ex.message # => "(file.txt): found character that cannot start any token" - # end - # - # See Psych::Nodes for more information about YAML AST. - def self.parse yaml, filename: nil - parse_stream(yaml, filename: filename) do |node| - return node - end - - false - end - - ### - # Parse a file at +filename+. Returns the Psych::Nodes::Document. - # - # Raises a Psych::SyntaxError when a YAML syntax error is detected. - def self.parse_file filename, fallback: false - result = File.open filename, 'r:bom|utf-8' do |f| - parse f, filename: filename - end - result || fallback - end - - ### - # Returns a default parser - def self.parser - Psych::Parser.new(TreeBuilder.new) - end - - ### - # Parse a YAML string in +yaml+. Returns the Psych::Nodes::Stream. - # This method can handle multiple YAML documents contained in +yaml+. - # +filename+ is used in the exception message if a Psych::SyntaxError is - # raised. - # - # If a block is given, a Psych::Nodes::Document node will be yielded to the - # block as it's being parsed. - # - # Raises a Psych::SyntaxError when a YAML syntax error is detected. - # - # Example: - # - # Psych.parse_stream("---\n - a\n - b") # => # - # - # Psych.parse_stream("--- a\n--- b") do |node| - # node # => # - # end - # - # begin - # Psych.parse_stream("--- `", filename: "file.txt") - # rescue Psych::SyntaxError => ex - # ex.file # => 'file.txt' - # ex.message # => "(file.txt): found character that cannot start any token" - # end - # - # Raises a TypeError when NilClass is passed. - # - # See Psych::Nodes for more information about YAML AST. - def self.parse_stream yaml, filename: nil, &block - if block_given? - parser = Psych::Parser.new(Handlers::DocumentStream.new(&block)) - parser.parse yaml, filename - else - parser = self.parser - parser.parse yaml, filename - parser.handler.root - end - end - - ### - # call-seq: - # Psych.dump(o) -> string of yaml - # Psych.dump(o, options) -> string of yaml - # Psych.dump(o, io) -> io object passed in - # Psych.dump(o, io, options) -> io object passed in - # - # Dump Ruby object +o+ to a YAML string. Optional +options+ may be passed in - # to control the output format. If an IO object is passed in, the YAML will - # be dumped to that IO object. - # - # Currently supported options are: - # - # [:indentation] Number of space characters used to indent. - # Acceptable value should be in 0..9 range, - # otherwise option is ignored. - # - # Default: 2. - # [:line_width] Max character to wrap line at. - # For unlimited line width use -1. - # - # Default: 0 (meaning "wrap at 81"). - # [:canonical] Write "canonical" YAML form (very verbose, yet - # strictly formal). - # - # Default: false. - # [:header] Write %YAML [version] at the beginning of document. - # - # Default: false. - # - # [:stringify_names] Dump symbol keys in Hash objects as string. - # - # Default: false. - # - # Example: - # - # # Dump an array, get back a YAML string - # Psych.dump(['a', 'b']) # => "---\n- a\n- b\n" - # - # # Dump an array to an IO object - # Psych.dump(['a', 'b'], StringIO.new) # => # - # - # # Dump an array with indentation set - # Psych.dump(['a', ['b']], indentation: 3) # => "---\n- a\n- - b\n" - # - # # Dump an array to an IO with indentation set - # Psych.dump(['a', ['b']], StringIO.new, indentation: 3) - # - # # Dump hash with symbol keys as string - # Psych.dump({a: "b"}, stringify_names: true) # => "---\na: b\n" - def self.dump o, io = nil, options = {} - if Hash === io - options = io - io = nil - end - - visitor = Psych::Visitors::YAMLTree.create options - visitor << o - visitor.tree.yaml io, options - end - - ### - # call-seq: - # Psych.safe_dump(o) -> string of yaml - # Psych.safe_dump(o, options) -> string of yaml - # Psych.safe_dump(o, io) -> io object passed in - # Psych.safe_dump(o, io, options) -> io object passed in - # - # Safely dump Ruby object +o+ to a YAML string. Optional +options+ may be passed in - # to control the output format. If an IO object is passed in, the YAML will - # be dumped to that IO object. By default, only the following - # classes are allowed to be serialized: - # - # * TrueClass - # * FalseClass - # * NilClass - # * Integer - # * Float - # * String - # * Array - # * Hash - # - # Arbitrary classes can be allowed by adding those classes to the +permitted_classes+ - # keyword argument. They are additive. For example, to allow Date serialization: - # - # Psych.safe_dump(yaml, permitted_classes: [Date]) - # - # Now the Date class can be dumped in addition to the classes listed above. - # - # A Psych::DisallowedClass exception will be raised if the object contains a - # class that isn't in the +permitted_classes+ list. - # - # Currently supported options are: - # - # [:indentation] Number of space characters used to indent. - # Acceptable value should be in 0..9 range, - # otherwise option is ignored. - # - # Default: 2. - # [:line_width] Max character to wrap line at. - # For unlimited line width use -1. - # - # Default: 0 (meaning "wrap at 81"). - # [:canonical] Write "canonical" YAML form (very verbose, yet - # strictly formal). - # - # Default: false. - # [:header] Write %YAML [version] at the beginning of document. - # - # Default: false. - # - # [:stringify_names] Dump symbol keys in Hash objects as string. - # - # Default: false. - # - # Example: - # - # # Dump an array, get back a YAML string - # Psych.safe_dump(['a', 'b']) # => "---\n- a\n- b\n" - # - # # Dump an array to an IO object - # Psych.safe_dump(['a', 'b'], StringIO.new) # => # - # - # # Dump an array with indentation set - # Psych.safe_dump(['a', ['b']], indentation: 3) # => "---\n- a\n- - b\n" - # - # # Dump an array to an IO with indentation set - # Psych.safe_dump(['a', ['b']], StringIO.new, indentation: 3) - # - # # Dump hash with symbol keys as string - # Psych.dump({a: "b"}, stringify_names: true) # => "---\na: b\n" - def self.safe_dump o, io = nil, options = {} - if Hash === io - options = io - io = nil - end - - visitor = Psych::Visitors::RestrictedYAMLTree.create options - visitor << o - visitor.tree.yaml io, options - end - - ### - # Dump a list of objects as separate documents to a document stream. - # - # Example: - # - # Psych.dump_stream("foo\n ", {}) # => "--- ! \"foo\\n \"\n--- {}\n" - def self.dump_stream *objects - visitor = Psych::Visitors::YAMLTree.create({}) - objects.each do |o| - visitor << o - end - visitor.tree.yaml - end - - ### - # Dump Ruby +object+ to a JSON string. - def self.to_json object - visitor = Psych::Visitors::JSONTree.create - visitor << object - visitor.tree.yaml - end - - ### - # Load multiple documents given in +yaml+. Returns the parsed documents - # as a list. If a block is given, each document will be converted to Ruby - # and passed to the block during parsing - # - # Example: - # - # Psych.load_stream("--- foo\n...\n--- bar\n...") # => ['foo', 'bar'] - # - # list = [] - # Psych.load_stream("--- foo\n...\n--- bar\n...") do |ruby| - # list << ruby - # end - # list # => ['foo', 'bar'] - # - def self.load_stream yaml, filename: nil, fallback: [], **kwargs - result = if block_given? - parse_stream(yaml, filename: filename) do |node| - yield node.to_ruby(**kwargs) - end - else - parse_stream(yaml, filename: filename).children.map { |node| node.to_ruby(**kwargs) } - end - - return fallback if result.is_a?(Array) && result.empty? - result - end - - ### - # Load multiple documents given in +yaml+. Returns the parsed documents - # as a list. - # - # Example: - # - # Psych.safe_load_stream("--- foo\n...\n--- bar\n...") # => ['foo', 'bar'] - # - # list = [] - # Psych.safe_load_stream("--- foo\n...\n--- bar\n...") do |ruby| - # list << ruby - # end - # list # => ['foo', 'bar'] - # - def self.safe_load_stream yaml, filename: nil, permitted_classes: [], aliases: false - documents = parse_stream(yaml, filename: filename).children.map do |child| - stream = Psych::Nodes::Stream.new - stream.children << child - safe_load(stream.to_yaml, permitted_classes: permitted_classes, aliases: aliases) - end - - if block_given? - documents.each { |doc| yield doc } - nil - else - documents - end - end - - ### - # Load the document contained in +filename+. Returns the yaml contained in - # +filename+ as a Ruby object, or if the file is empty, it returns - # the specified +fallback+ return value, which defaults to +false+. - # - # NOTE: This method *should not* be used to parse untrusted documents, such as - # YAML documents that are supplied via user input. Instead, please use the - # safe_load_file method. - def self.unsafe_load_file filename, **kwargs - File.open(filename, 'r:bom|utf-8') { |f| - self.unsafe_load f, filename: filename, **kwargs - } - end - - ### - # Safely loads the document contained in +filename+. Returns the yaml contained in - # +filename+ as a Ruby object, or if the file is empty, it returns - # the specified +fallback+ return value, which defaults to +nil+. - # See safe_load for options. - def self.safe_load_file filename, **kwargs - File.open(filename, 'r:bom|utf-8') { |f| - self.safe_load f, filename: filename, **kwargs - } - end - - ### - # Loads the document contained in +filename+. Returns the yaml contained in - # +filename+ as a Ruby object, or if the file is empty, it returns - # the specified +fallback+ return value, which defaults to +nil+. - # See load for options. - def self.load_file filename, **kwargs - File.open(filename, 'r:bom|utf-8') { |f| - self.load f, filename: filename, **kwargs - } - end - - # :stopdoc: - def self.add_domain_type domain, type_tag, &block - key = ['tag', domain, type_tag].join ':' - domain_types[key] = [key, block] - domain_types["tag:#{type_tag}"] = [key, block] - end - - def self.add_builtin_type type_tag, &block - domain = 'yaml.org,2002' - key = ['tag', domain, type_tag].join ':' - domain_types[key] = [key, block] - end - - def self.remove_type type_tag - domain_types.delete type_tag - end - - def self.add_tag tag, klass - load_tags[tag] = klass.name - dump_tags[klass] = tag - end - - class << self - if defined?(Ractor) - class Config - attr_accessor :load_tags, :dump_tags, :domain_types - def initialize - @load_tags = {} - @dump_tags = {} - @domain_types = {} - end - end - - def config - Ractor.current[:PsychConfig] ||= Config.new - end - - def load_tags - config.load_tags - end - - def dump_tags - config.dump_tags - end - - def domain_types - config.domain_types - end - - def load_tags=(value) - config.load_tags = value - end - - def dump_tags=(value) - config.dump_tags = value - end - - def domain_types=(value) - config.domain_types = value - end - else - attr_accessor :load_tags - attr_accessor :dump_tags - attr_accessor :domain_types - end - end - self.load_tags = {} - self.dump_tags = {} - self.domain_types = {} - # :startdoc: -end - -require_relative 'psych/core_ext' diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych.so b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych.so deleted file mode 100755 index ac4c58929802604cde6ecc94b3532393fbd24a27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147880 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 ex - unless retried - name = "Struct::#{name}" - retried = ex - retry - end - raise retried - end - end - - CACHE = Hash[constants.map { |const| - val = const_get const - begin - [val, ::Object.const_get(val)] - rescue - nil - end - }.compact].freeze - - class Restricted < ClassLoader - def initialize classes, symbols - @classes = classes - @symbols = symbols - super() - end - - def symbolize sym - return super if @symbols.empty? - - if @symbols.include? sym - super - else - raise DisallowedClass.new('load', 'Symbol') - end - end - - private - - def find klassname - if @classes.include? klassname - super - else - raise DisallowedClass.new('load', klassname) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/coder.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/coder.rb deleted file mode 100644 index 96a9c3f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/coder.rb +++ /dev/null @@ -1,95 +0,0 @@ -# frozen_string_literal: true -module Psych - ### - # If an object defines +encode_with+, then an instance of Psych::Coder will - # be passed to the method when the object is being serialized. The Coder - # automatically assumes a Psych::Nodes::Mapping is being emitted. Other - # objects like Sequence and Scalar may be emitted if +seq=+ or +scalar=+ are - # called, respectively. - class Coder - attr_accessor :tag, :style, :implicit, :object - attr_reader :type, :seq - - def initialize tag - @map = {} - @seq = [] - @implicit = false - @type = :map - @tag = tag - @style = Psych::Nodes::Mapping::BLOCK - @scalar = nil - @object = nil - end - - def scalar *args - if args.length > 0 - warn "#{caller[0]}: Coder#scalar(a,b,c) is deprecated" if $VERBOSE - @tag, @scalar, _ = args - @type = :scalar - end - @scalar - end - - # Emit a map. The coder will be yielded to the block. - def map tag = @tag, style = @style - @tag = tag - @style = style - yield self if block_given? - @map - end - - # Emit a scalar with +value+ and +tag+ - def represent_scalar tag, value - self.tag = tag - self.scalar = value - end - - # Emit a sequence with +list+ and +tag+ - def represent_seq tag, list - @tag = tag - self.seq = list - end - - # Emit a sequence with +map+ and +tag+ - def represent_map tag, map - @tag = tag - self.map = map - end - - # Emit an arbitrary object +obj+ and +tag+ - def represent_object tag, obj - @tag = tag - @type = :object - @object = obj - end - - # Emit a scalar with +value+ - def scalar= value - @type = :scalar - @scalar = value - end - - # Emit a map with +value+ - def map= map - @type = :map - @map = map - end - - def []= k, v - @type = :map - @map[k] = v - end - alias :add :[]= - - def [] k - @type = :map - @map[k] - end - - # Emit a sequence of +list+ - def seq= list - @type = :seq - @seq = list - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/core_ext.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/core_ext.rb deleted file mode 100644 index fc259fd..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/core_ext.rb +++ /dev/null @@ -1,40 +0,0 @@ -# frozen_string_literal: true -class Object - def self.yaml_tag url - Psych.add_tag(url, self) - end - - ### - # call-seq: to_yaml(options = {}) - # - # Convert an object to YAML. See Psych.dump for more information on the - # available +options+. - def to_yaml options = {} - Psych.dump self, options - end -end - -if defined?(::IRB) - require_relative 'y' -end - -# Up to Ruby 3.4, Set was a regular object and was dumped as such -# by Pysch. -# Starting from Ruby 3.5 it's a core class written in C, so we have to implement -# #encode_with / #init_with to preserve backward compatibility. -if defined?(::Set) && Set.new.instance_variables.empty? - class Set - def encode_with(coder) - hash = {} - each do |m| - hash[m] = true - end - coder["hash"] = hash - coder - end - - def init_with(coder) - replace(coder["hash"].keys) - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/exception.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/exception.rb deleted file mode 100644 index d7469a4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/exception.rb +++ /dev/null @@ -1,28 +0,0 @@ -# frozen_string_literal: true -module Psych - class Exception < RuntimeError - end - - class BadAlias < Exception - end - - # Subclasses `BadAlias` for backwards compatibility - class AliasesNotEnabled < BadAlias - def initialize - super "Alias parsing was not enabled. To enable it, pass `aliases: true` to `Psych::load` or `Psych::safe_load`." - end - end - - # Subclasses `BadAlias` for backwards compatibility - class AnchorNotDefined < BadAlias - def initialize anchor_name - super "An alias referenced an unknown anchor: #{anchor_name}" - end - end - - class DisallowedClass < Exception - def initialize action, klass_name - super "Tried to #{action} unspecified class: #{klass_name}" - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handler.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handler.rb deleted file mode 100644 index ad7249f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handler.rb +++ /dev/null @@ -1,255 +0,0 @@ -# frozen_string_literal: true -module Psych - ### - # Psych::Handler is an abstract base class that defines the events used - # when dealing with Psych::Parser. Clients who want to use Psych::Parser - # should implement a class that inherits from Psych::Handler and define - # events that they can handle. - # - # Psych::Handler defines all events that Psych::Parser can possibly send to - # event handlers. - # - # See Psych::Parser for more details - class Handler - ### - # Configuration options for dumping YAML. - class DumperOptions - attr_accessor :line_width, :indentation, :canonical - - def initialize - @line_width = 0 - @indentation = 2 - @canonical = false - end - end - - # Default dumping options - OPTIONS = DumperOptions.new - - # Events that a Handler should respond to. - EVENTS = [ :alias, - :empty, - :end_document, - :end_mapping, - :end_sequence, - :end_stream, - :scalar, - :start_document, - :start_mapping, - :start_sequence, - :start_stream ] - - ### - # Called with +encoding+ when the YAML stream starts. This method is - # called once per stream. A stream may contain multiple documents. - # - # See the constants in Psych::Parser for the possible values of +encoding+. - def start_stream encoding - end - - ### - # Called when the document starts with the declared +version+, - # +tag_directives+, if the document is +implicit+. - # - # +version+ will be an array of integers indicating the YAML version being - # dealt with, +tag_directives+ is a list of tuples indicating the prefix - # and suffix of each tag, and +implicit+ is a boolean indicating whether - # the document is started implicitly. - # - # === Example - # - # Given the following YAML: - # - # %YAML 1.1 - # %TAG ! tag:tenderlovemaking.com,2009: - # --- !squee - # - # The parameters for start_document must be this: - # - # version # => [1, 1] - # tag_directives # => [["!", "tag:tenderlovemaking.com,2009:"]] - # implicit # => false - def start_document version, tag_directives, implicit - end - - ### - # Called with the document ends. +implicit+ is a boolean value indicating - # whether or not the document has an implicit ending. - # - # === Example - # - # Given the following YAML: - # - # --- - # hello world - # - # +implicit+ will be true. Given this YAML: - # - # --- - # hello world - # ... - # - # +implicit+ will be false. - def end_document implicit - end - - ### - # Called when an alias is found to +anchor+. +anchor+ will be the name - # of the anchor found. - # - # === Example - # - # Here we have an example of an array that references itself in YAML: - # - # --- &ponies - # - first element - # - *ponies - # - # &ponies is the anchor, *ponies is the alias. In this case, alias is - # called with "ponies". - def alias anchor - end - - ### - # Called when a scalar +value+ is found. The scalar may have an - # +anchor+, a +tag+, be implicitly +plain+ or implicitly +quoted+ - # - # +value+ is the string value of the scalar - # +anchor+ is an associated anchor or nil - # +tag+ is an associated tag or nil - # +plain+ is a boolean value - # +quoted+ is a boolean value - # +style+ is an integer indicating the string style - # - # See the constants in Psych::Nodes::Scalar for the possible values of - # +style+ - # - # === Example - # - # Here is a YAML document that exercises most of the possible ways this - # method can be called: - # - # --- - # - !str "foo" - # - &anchor fun - # - many - # lines - # - | - # many - # newlines - # - # The above YAML document contains a list with four strings. Here are - # the parameters sent to this method in the same order: - # - # # value anchor tag plain quoted style - # ["foo", nil, "!str", false, false, 3 ] - # ["fun", "anchor", nil, true, false, 1 ] - # ["many lines", nil, nil, true, false, 1 ] - # ["many\nnewlines\n", nil, nil, false, true, 4 ] - # - def scalar value, anchor, tag, plain, quoted, style - end - - ### - # Called when a sequence is started. - # - # +anchor+ is the anchor associated with the sequence or nil. - # +tag+ is the tag associated with the sequence or nil. - # +implicit+ a boolean indicating whether or not the sequence was implicitly - # started. - # +style+ is an integer indicating the list style. - # - # See the constants in Psych::Nodes::Sequence for the possible values of - # +style+. - # - # === Example - # - # Here is a YAML document that exercises most of the possible ways this - # method can be called: - # - # --- - # - !!seq [ - # a - # ] - # - &pewpew - # - b - # - # The above YAML document consists of three lists, an outer list that - # contains two inner lists. Here is a matrix of the parameters sent - # to represent these lists: - # - # # anchor tag implicit style - # [nil, nil, true, 1 ] - # [nil, "tag:yaml.org,2002:seq", false, 2 ] - # ["pewpew", nil, true, 1 ] - - def start_sequence anchor, tag, implicit, style - end - - ### - # Called when a sequence ends. - def end_sequence - end - - ### - # Called when a map starts. - # - # +anchor+ is the anchor associated with the map or +nil+. - # +tag+ is the tag associated with the map or +nil+. - # +implicit+ is a boolean indicating whether or not the map was implicitly - # started. - # +style+ is an integer indicating the mapping style. - # - # See the constants in Psych::Nodes::Mapping for the possible values of - # +style+. - # - # === Example - # - # Here is a YAML document that exercises most of the possible ways this - # method can be called: - # - # --- - # k: !!map { hello: world } - # v: &pewpew - # hello: world - # - # The above YAML document consists of three maps, an outer map that contains - # two inner maps. Below is a matrix of the parameters sent in order to - # represent these three maps: - # - # # anchor tag implicit style - # [nil, nil, true, 1 ] - # [nil, "tag:yaml.org,2002:map", false, 2 ] - # ["pewpew", nil, true, 1 ] - - def start_mapping anchor, tag, implicit, style - end - - ### - # Called when a map ends - def end_mapping - end - - ### - # Called when an empty event happens. (Which, as far as I can tell, is - # never). - def empty - end - - ### - # Called when the YAML stream ends - def end_stream - end - - ### - # Called before each event with line/column information. - def event_location(start_line, start_column, end_line, end_column) - end - - ### - # Is this handler a streaming handler? - def streaming? - false - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handlers/document_stream.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handlers/document_stream.rb deleted file mode 100644 index b77115d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handlers/document_stream.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true -require_relative '../tree_builder' - -module Psych - module Handlers - class DocumentStream < Psych::TreeBuilder # :nodoc: - def initialize &block - super - @block = block - end - - def start_document version, tag_directives, implicit - n = Nodes::Document.new version, tag_directives, implicit - push n - end - - def end_document implicit_end = !streaming? - @last.implicit_end = implicit_end - @block.call pop - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handlers/recorder.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handlers/recorder.rb deleted file mode 100644 index c98724c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/handlers/recorder.rb +++ /dev/null @@ -1,40 +0,0 @@ -# frozen_string_literal: true -require_relative '../handler' - -module Psych - module Handlers - ### - # This handler will capture an event and record the event. Recorder events - # are available vial Psych::Handlers::Recorder#events. - # - # For example: - # - # recorder = Psych::Handlers::Recorder.new - # parser = Psych::Parser.new recorder - # parser.parse '--- foo' - # - # recorder.events # => [list of events] - # - # # Replay the events - # - # emitter = Psych::Emitter.new $stdout - # recorder.events.each do |m, args| - # emitter.send m, *args - # end - - class Recorder < Psych::Handler - attr_reader :events - - def initialize - @events = [] - super - end - - EVENTS.each do |event| - define_method event do |*args| - @events << [event, args] - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/ruby_events.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/ruby_events.rb deleted file mode 100644 index 17b7ddc..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/ruby_events.rb +++ /dev/null @@ -1,20 +0,0 @@ -# frozen_string_literal: true -module Psych - module JSON - module RubyEvents # :nodoc: - def visit_Time o - formatted = format_time o - @emitter.scalar formatted, nil, nil, false, true, Nodes::Scalar::DOUBLE_QUOTED - end - - def visit_DateTime o - visit_Time o.to_time - end - - def visit_String o - @emitter.scalar o.to_s, nil, nil, false, true, Nodes::Scalar::DOUBLE_QUOTED - end - alias :visit_Symbol :visit_String - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/stream.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/stream.rb deleted file mode 100644 index 24dd4b9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/stream.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true -require_relative 'ruby_events' -require_relative 'yaml_events' - -module Psych - module JSON - class Stream < Psych::Visitors::JSONTree - include Psych::JSON::RubyEvents - include Psych::Streaming - extend Psych::Streaming::ClassMethods - - class Emitter < Psych::Stream::Emitter # :nodoc: - include Psych::JSON::YAMLEvents - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/tree_builder.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/tree_builder.rb deleted file mode 100644 index 9a45f6b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/tree_builder.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true -require_relative 'yaml_events' - -module Psych - module JSON - ### - # Psych::JSON::TreeBuilder is an event based AST builder. Events are sent - # to an instance of Psych::JSON::TreeBuilder and a JSON AST is constructed. - class TreeBuilder < Psych::TreeBuilder - include Psych::JSON::YAMLEvents - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/yaml_events.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/yaml_events.rb deleted file mode 100644 index eb973f5..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/json/yaml_events.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true -module Psych - module JSON - module YAMLEvents # :nodoc: - def start_document version, tag_directives, implicit - super(version, tag_directives, !streaming?) - end - - def end_document implicit_end = !streaming? - super(implicit_end) - end - - def start_mapping anchor, tag, implicit, style - super(anchor, nil, true, Nodes::Mapping::FLOW) - end - - def start_sequence anchor, tag, implicit, style - super(anchor, nil, true, Nodes::Sequence::FLOW) - end - - def scalar value, anchor, tag, plain, quoted, style - if "tag:yaml.org,2002:null" == tag - super('null', nil, nil, true, false, Nodes::Scalar::PLAIN) - else - super - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes.rb deleted file mode 100644 index 2fa52e0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes.rb +++ /dev/null @@ -1,78 +0,0 @@ -# frozen_string_literal: true -require_relative 'nodes/node' -require_relative 'nodes/stream' -require_relative 'nodes/document' -require_relative 'nodes/sequence' -require_relative 'nodes/scalar' -require_relative 'nodes/mapping' -require_relative 'nodes/alias' - -module Psych - ### - # = Overview - # - # When using Psych.load to deserialize a YAML document, the document is - # translated to an intermediary AST. That intermediary AST is then - # translated in to a Ruby object graph. - # - # In the opposite direction, when using Psych.dump, the Ruby object graph is - # translated to an intermediary AST which is then converted to a YAML - # document. - # - # Psych::Nodes contains all of the classes that make up the nodes of a YAML - # AST. You can manually build an AST and use one of the visitors (see - # Psych::Visitors) to convert that AST to either a YAML document or to a - # Ruby object graph. - # - # Here is an example of building an AST that represents a list with one - # scalar: - # - # # Create our nodes - # stream = Psych::Nodes::Stream.new - # doc = Psych::Nodes::Document.new - # seq = Psych::Nodes::Sequence.new - # scalar = Psych::Nodes::Scalar.new('foo') - # - # # Build up our tree - # stream.children << doc - # doc.children << seq - # seq.children << scalar - # - # The stream is the root of the tree. We can then convert the tree to YAML: - # - # stream.to_yaml => "---\n- foo\n" - # - # Or convert it to Ruby: - # - # stream.to_ruby => [["foo"]] - # - # == YAML AST Requirements - # - # A valid YAML AST *must* have one Psych::Nodes::Stream at the root. A - # Psych::Nodes::Stream node must have 1 or more Psych::Nodes::Document nodes - # as children. - # - # Psych::Nodes::Document nodes must have one and *only* one child. That child - # may be one of: - # - # * Psych::Nodes::Sequence - # * Psych::Nodes::Mapping - # * Psych::Nodes::Scalar - # - # Psych::Nodes::Sequence and Psych::Nodes::Mapping nodes may have many - # children, but Psych::Nodes::Mapping nodes should have an even number of - # children. - # - # All of these are valid children for Psych::Nodes::Sequence and - # Psych::Nodes::Mapping nodes: - # - # * Psych::Nodes::Sequence - # * Psych::Nodes::Mapping - # * Psych::Nodes::Scalar - # * Psych::Nodes::Alias - # - # Psych::Nodes::Scalar and Psych::Nodes::Alias are both terminal nodes and - # should not have any children. - module Nodes - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/alias.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/alias.rb deleted file mode 100644 index 6da655f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/alias.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true -module Psych - module Nodes - ### - # This class represents a {YAML Alias}[http://yaml.org/spec/1.1/#alias]. - # It points to an +anchor+. - # - # A Psych::Nodes::Alias is a terminal node and may have no children. - class Alias < Psych::Nodes::Node - # The anchor this alias links to - attr_accessor :anchor - - # Create a new Alias that points to an +anchor+ - def initialize anchor - @anchor = anchor - end - - def alias?; true; end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/document.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/document.rb deleted file mode 100644 index f57410d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/document.rb +++ /dev/null @@ -1,63 +0,0 @@ -# frozen_string_literal: true -module Psych - module Nodes - ### - # This represents a YAML Document. This node must be a child of - # Psych::Nodes::Stream. A Psych::Nodes::Document must have one child, - # and that child may be one of the following: - # - # * Psych::Nodes::Sequence - # * Psych::Nodes::Mapping - # * Psych::Nodes::Scalar - class Document < Psych::Nodes::Node - # The version of the YAML document - attr_accessor :version - - # A list of tag directives for this document - attr_accessor :tag_directives - - # Was this document implicitly created? - attr_accessor :implicit - - # Is the end of the document implicit? - attr_accessor :implicit_end - - ### - # Create a new Psych::Nodes::Document object. - # - # +version+ is a list indicating the YAML version. - # +tags_directives+ is a list of tag directive declarations - # +implicit+ is a flag indicating whether the document will be implicitly - # started. - # - # == Example: - # This creates a YAML document object that represents a YAML 1.1 document - # with one tag directive, and has an implicit start: - # - # Psych::Nodes::Document.new( - # [1,1], - # [["!", "tag:tenderlovemaking.com,2009:"]], - # true - # ) - # - # == See Also - # See also Psych::Handler#start_document - def initialize version = [], tag_directives = [], implicit = false - super() - @version = version - @tag_directives = tag_directives - @implicit = implicit - @implicit_end = true - end - - ### - # Returns the root node. A Document may only have one root node: - # http://yaml.org/spec/1.1/#id898031 - def root - children.first - end - - def document?; true; end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/mapping.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/mapping.rb deleted file mode 100644 index d49678c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/mapping.rb +++ /dev/null @@ -1,59 +0,0 @@ -# frozen_string_literal: true -module Psych - module Nodes - ### - # This class represents a {YAML Mapping}[http://yaml.org/spec/1.1/#mapping]. - # - # A Psych::Nodes::Mapping node may have 0 or more children, but must have - # an even number of children. Here are the valid children a - # Psych::Nodes::Mapping node may have: - # - # * Psych::Nodes::Sequence - # * Psych::Nodes::Mapping - # * Psych::Nodes::Scalar - # * Psych::Nodes::Alias - class Mapping < Psych::Nodes::Node - # Any Map Style - ANY = 0 - - # Block Map Style - BLOCK = 1 - - # Flow Map Style - FLOW = 2 - - # The optional anchor for this mapping - attr_accessor :anchor - - # The optional tag for this mapping - attr_accessor :tag - - # Is this an implicit mapping? - attr_accessor :implicit - - # The style of this mapping - attr_accessor :style - - ### - # Create a new Psych::Nodes::Mapping object. - # - # +anchor+ is the anchor associated with the map or +nil+. - # +tag+ is the tag associated with the map or +nil+. - # +implicit+ is a boolean indicating whether or not the map was implicitly - # started. - # +style+ is an integer indicating the mapping style. - # - # == See Also - # See also Psych::Handler#start_mapping - def initialize anchor = nil, tag = nil, implicit = true, style = BLOCK - super() - @anchor = anchor - @tag = tag - @implicit = implicit - @style = style - end - - def mapping?; true; end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/node.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/node.rb deleted file mode 100644 index 6ae5c59..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/node.rb +++ /dev/null @@ -1,76 +0,0 @@ -# frozen_string_literal: true -require_relative '../class_loader' -require_relative '../scalar_scanner' - -module Psych - module Nodes - ### - # The base class for any Node in a YAML parse tree. This class should - # never be instantiated. - class Node - include Enumerable - - # The children of this node - attr_reader :children - - # An associated tag - attr_reader :tag - - # The line number where this node start - attr_accessor :start_line - - # The column number where this node start - attr_accessor :start_column - - # The line number where this node ends - attr_accessor :end_line - - # The column number where this node ends - attr_accessor :end_column - - # Create a new Psych::Nodes::Node - def initialize - @children = [] - end - - ### - # Iterate over each node in the tree. Yields each node to +block+ depth - # first. - def each &block - return enum_for :each unless block_given? - Visitors::DepthFirst.new(block).accept self - end - - ### - # Convert this node to Ruby. - # - # See also Psych::Visitors::ToRuby - def to_ruby(symbolize_names: false, freeze: false, strict_integer: false) - Visitors::ToRuby.create(symbolize_names: symbolize_names, freeze: freeze, strict_integer: strict_integer).accept(self) - end - alias :transform :to_ruby - - ### - # Convert this node to YAML. - # - # See also Psych::Visitors::Emitter - def yaml io = nil, options = {} - require "stringio" unless defined?(StringIO) - - real_io = io || StringIO.new(''.encode('utf-8')) - - Visitors::Emitter.new(real_io, options).accept self - return real_io.string unless io - io - end - alias :to_yaml :yaml - - def alias?; false; end - def document?; false; end - def mapping?; false; end - def scalar?; false; end - def sequence?; false; end - def stream?; false; end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/scalar.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/scalar.rb deleted file mode 100644 index 5550b61..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/scalar.rb +++ /dev/null @@ -1,70 +0,0 @@ -# frozen_string_literal: true -module Psych - module Nodes - ### - # This class represents a {YAML Scalar}[http://yaml.org/spec/1.1/#id858081]. - # - # This node type is a terminal node and should not have any children. - class Scalar < Psych::Nodes::Node - # Any style scalar, the emitter chooses - ANY = 0 - - # Plain scalar style - PLAIN = 1 - - # Single quoted style - SINGLE_QUOTED = 2 - - # Double quoted style - DOUBLE_QUOTED = 3 - - # Literal style - LITERAL = 4 - - # Folded style - FOLDED = 5 - - # The scalar value - attr_accessor :value - - # The anchor value (if there is one) - attr_accessor :anchor - - # The tag value (if there is one) - attr_accessor :tag - - # Is this a plain scalar? - attr_accessor :plain - - # Is this scalar quoted? - attr_accessor :quoted - - # The style of this scalar - attr_accessor :style - - ### - # Create a new Psych::Nodes::Scalar object. - # - # +value+ is the string value of the scalar - # +anchor+ is an associated anchor or nil - # +tag+ is an associated tag or nil - # +plain+ is a boolean value - # +quoted+ is a boolean value - # +style+ is an integer indicating the string style - # - # == See Also - # - # See also Psych::Handler#scalar - def initialize value, anchor = nil, tag = nil, plain = true, quoted = false, style = ANY - @value = value - @anchor = anchor - @tag = tag - @plain = plain - @quoted = quoted - @style = style - end - - def scalar?; true; end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/sequence.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/sequence.rb deleted file mode 100644 index 740f193..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/sequence.rb +++ /dev/null @@ -1,84 +0,0 @@ -# frozen_string_literal: true -module Psych - module Nodes - ### - # This class represents a - # {YAML sequence}[http://yaml.org/spec/1.1/#sequence/syntax]. - # - # A YAML sequence is basically a list, and looks like this: - # - # %YAML 1.1 - # --- - # - I am - # - a Sequence - # - # A YAML sequence may have an anchor like this: - # - # %YAML 1.1 - # --- - # &A [ - # "This sequence", - # "has an anchor" - # ] - # - # A YAML sequence may also have a tag like this: - # - # %YAML 1.1 - # --- - # !!seq [ - # "This sequence", - # "has a tag" - # ] - # - # This class represents a sequence in a YAML document. A - # Psych::Nodes::Sequence node may have 0 or more children. Valid children - # for this node are: - # - # * Psych::Nodes::Sequence - # * Psych::Nodes::Mapping - # * Psych::Nodes::Scalar - # * Psych::Nodes::Alias - class Sequence < Psych::Nodes::Node - # Any Styles, emitter chooses - ANY = 0 - - # Block style sequence - BLOCK = 1 - - # Flow style sequence - FLOW = 2 - - # The anchor for this sequence (if any) - attr_accessor :anchor - - # The tag name for this sequence (if any) - attr_accessor :tag - - # Is this sequence started implicitly? - attr_accessor :implicit - - # The sequence style used - attr_accessor :style - - ### - # Create a new object representing a YAML sequence. - # - # +anchor+ is the anchor associated with the sequence or nil. - # +tag+ is the tag associated with the sequence or nil. - # +implicit+ a boolean indicating whether or not the sequence was - # implicitly started. - # +style+ is an integer indicating the list style. - # - # See Psych::Handler#start_sequence - def initialize anchor = nil, tag = nil, implicit = true, style = BLOCK - super() - @anchor = anchor - @tag = tag - @implicit = implicit - @style = style - end - - def sequence?; true; end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/stream.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/stream.rb deleted file mode 100644 index b525217..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/nodes/stream.rb +++ /dev/null @@ -1,40 +0,0 @@ -# frozen_string_literal: true -module Psych - module Nodes - ### - # Represents a YAML stream. This is the root node for any YAML parse - # tree. This node must have one or more child nodes. The only valid - # child node for a Psych::Nodes::Stream node is Psych::Nodes::Document. - class Stream < Psych::Nodes::Node - - # Encodings supported by Psych (and libyaml) - - # Any encoding - ANY = Psych::Parser::ANY - - # UTF-8 encoding - UTF8 = Psych::Parser::UTF8 - - # UTF-16LE encoding - UTF16LE = Psych::Parser::UTF16LE - - # UTF-16BE encoding - UTF16BE = Psych::Parser::UTF16BE - - # The encoding used for this stream - attr_accessor :encoding - - ### - # Create a new Psych::Nodes::Stream node with an +encoding+ that - # defaults to Psych::Nodes::Stream::UTF8. - # - # See also Psych::Handler#start_stream - def initialize encoding = UTF8 - super() - @encoding = encoding - end - - def stream?; true; end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/omap.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/omap.rb deleted file mode 100644 index 29cde0b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/omap.rb +++ /dev/null @@ -1,5 +0,0 @@ -# frozen_string_literal: true -module Psych - class Omap < ::Hash - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/parser.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/parser.rb deleted file mode 100644 index 2181c73..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/parser.rb +++ /dev/null @@ -1,65 +0,0 @@ -# frozen_string_literal: true -module Psych - ### - # YAML event parser class. This class parses a YAML document and calls - # events on the handler that is passed to the constructor. The events can - # be used for things such as constructing a YAML AST or deserializing YAML - # documents. It can even be fed back to Psych::Emitter to emit the same - # document that was parsed. - # - # See Psych::Handler for documentation on the events that Psych::Parser emits. - # - # Here is an example that prints out ever scalar found in a YAML document: - # - # # Handler for detecting scalar values - # class ScalarHandler < Psych::Handler - # def scalar value, anchor, tag, plain, quoted, style - # puts value - # end - # end - # - # parser = Psych::Parser.new(ScalarHandler.new) - # parser.parse(yaml_document) - # - # Here is an example that feeds the parser back in to Psych::Emitter. The - # YAML document is read from STDIN and written back out to STDERR: - # - # parser = Psych::Parser.new(Psych::Emitter.new($stderr)) - # parser.parse($stdin) - # - # Psych uses Psych::Parser in combination with Psych::TreeBuilder to - # construct an AST of the parsed YAML document. - - class Parser - class Mark < Struct.new(:index, :line, :column) - end - - # The handler on which events will be called - attr_accessor :handler - - # Set the encoding for this parser to +encoding+ - attr_writer :external_encoding - - ### - # Creates a new Psych::Parser instance with +handler+. YAML events will - # be called on +handler+. See Psych::Parser for more details. - - def initialize handler = Handler.new - @handler = handler - @external_encoding = ANY - end - - ### - # call-seq: - # parser.parse(yaml) - # - # Parse the YAML document contained in +yaml+. Events will be called on - # the handler set on the parser instance. - # - # See Psych::Parser and Psych::Parser#handler - - def parse yaml, path = yaml.respond_to?(:path) ? yaml.path : "" - _native_parse @handler, yaml, path - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/scalar_scanner.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/scalar_scanner.rb deleted file mode 100644 index 8cf868f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/scalar_scanner.rb +++ /dev/null @@ -1,141 +0,0 @@ -# frozen_string_literal: true - -module Psych - ### - # Scan scalars for built in types - class ScalarScanner - # Taken from http://yaml.org/type/timestamp.html - TIME = /^-?\d{4}-\d{1,2}-\d{1,2}(?:[Tt]|\s+)\d{1,2}:\d\d:\d\d(?:\.\d*)?(?:\s*(?:Z|[-+]\d{1,2}:?(?:\d\d)?))?$/ - - # Taken from http://yaml.org/type/float.html - # Base 60, [-+]inf and NaN are handled separately - FLOAT = /^(?:[-+]?([0-9][0-9_,]*)?\.[0-9]*([eE][-+][0-9]+)?(?# base 10))$/x - - # Taken from http://yaml.org/type/int.html and modified to ensure at least one numerical symbol exists - INTEGER_STRICT = /^(?:[-+]?0b[_]*[0-1][0-1_]* (?# base 2) - |[-+]?0[_]*[0-7][0-7_]* (?# base 8) - |[-+]?(0|[1-9][0-9_]*) (?# base 10) - |[-+]?0x[_]*[0-9a-fA-F][0-9a-fA-F_]* (?# base 16))$/x - - # Same as above, but allows commas. - # Not to YML spec, but kept for backwards compatibility - INTEGER_LEGACY = /^(?:[-+]?0b[_,]*[0-1][0-1_,]* (?# base 2) - |[-+]?0[_,]*[0-7][0-7_,]* (?# base 8) - |[-+]?(?:0|[1-9](?:[0-9]|,[0-9]|_[0-9])*) (?# base 10) - |[-+]?0x[_,]*[0-9a-fA-F][0-9a-fA-F_,]* (?# base 16))$/x - - attr_reader :class_loader - - # Create a new scanner - def initialize class_loader, strict_integer: false - @symbol_cache = {} - @class_loader = class_loader - @strict_integer = strict_integer - end - - # Tokenize +string+ returning the Ruby object - def tokenize string - return nil if string.empty? - return @symbol_cache[string] if @symbol_cache.key?(string) - integer_regex = @strict_integer ? INTEGER_STRICT : INTEGER_LEGACY - # Check for a String type, being careful not to get caught by hash keys, hex values, and - # special floats (e.g., -.inf). - if string.match?(%r{^[^\d.:-]?[[:alpha:]_\s!@#$%\^&*(){}<>|/\\~;=]+}) || string.match?(/\n/) - return string if string.length > 5 - - if string.match?(/^[^ytonf~]/i) - string - elsif string == '~' || string.match?(/^null$/i) - nil - elsif string.match?(/^(yes|true|on)$/i) - true - elsif string.match?(/^(no|false|off)$/i) - false - else - string - end - elsif string.match?(TIME) - begin - parse_time string - rescue ArgumentError - string - end - elsif string.match?(/^\d{4}-(?:1[012]|0\d|\d)-(?:[12]\d|3[01]|0\d|\d)$/) - begin - class_loader.date.strptime(string, '%F', Date::GREGORIAN) - rescue ArgumentError - string - end - elsif string.match?(/^\+?\.inf$/i) - Float::INFINITY - elsif string.match?(/^-\.inf$/i) - -Float::INFINITY - elsif string.match?(/^\.nan$/i) - Float::NAN - elsif string.match?(/^:./) - if string =~ /^:(["'])(.*)\1/ - @symbol_cache[string] = class_loader.symbolize($2.sub(/^:/, '')) - else - @symbol_cache[string] = class_loader.symbolize(string.sub(/^:/, '')) - end - elsif string.match?(/^[-+]?[0-9][0-9_]*(:[0-5]?[0-9]){1,2}$/) - i = 0 - string.split(':').each_with_index do |n,e| - i += (n.to_i * 60 ** (e - 2).abs) - end - i - elsif string.match?(/^[-+]?[0-9][0-9_]*(:[0-5]?[0-9]){1,2}\.[0-9_]*$/) - i = 0 - string.split(':').each_with_index do |n,e| - i += (n.to_f * 60 ** (e - 2).abs) - end - i - elsif string.match?(FLOAT) - if string.match?(/\A[-+]?\.\Z/) - string - else - Float(string.delete(',_').gsub(/\.([Ee]|$)/, '\1')) - end - elsif string.match?(integer_regex) - parse_int string - else - string - end - end - - ### - # Parse and return an int from +string+ - def parse_int string - Integer(string.delete(',_')) - end - - ### - # Parse and return a Time from +string+ - def parse_time string - klass = class_loader.load 'Time' - - date, time = *(string.split(/[ tT]/, 2)) - (yy, m, dd) = date.match(/^(-?\d{4})-(\d{1,2})-(\d{1,2})/).captures.map { |x| x.to_i } - md = time.match(/(\d+:\d+:\d+)(?:\.(\d*))?\s*(Z|[-+]\d+(:\d\d)?)?/) - - (hh, mm, ss) = md[1].split(':').map { |x| x.to_i } - us = (md[2] ? Rational("0.#{md[2]}") : 0) * 1000000 - - time = klass.utc(yy, m, dd, hh, mm, ss, us) - - return time if 'Z' == md[3] - return klass.at(time.to_i, us) unless md[3] - - tz = md[3].match(/^([+\-]?\d{1,2})\:?(\d{1,2})?$/)[1..-1].compact.map { |digit| Integer(digit, 10) } - offset = tz.first * 3600 - - if offset < 0 - offset -= ((tz[1] || 0) * 60) - else - offset += ((tz[1] || 0) * 60) - end - - klass.new(yy, m, dd, hh, mm, ss+us/(1_000_000r), offset) - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/set.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/set.rb deleted file mode 100644 index 760d217..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/set.rb +++ /dev/null @@ -1,5 +0,0 @@ -# frozen_string_literal: true -module Psych - class Set < ::Hash - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/stream.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/stream.rb deleted file mode 100644 index 24e45af..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/stream.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true -module Psych - ### - # Psych::Stream is a streaming YAML emitter. It will not buffer your YAML, - # but send it straight to an IO. - # - # Here is an example use: - # - # stream = Psych::Stream.new($stdout) - # stream.start - # stream.push({:foo => 'bar'}) - # stream.finish - # - # YAML will be immediately emitted to $stdout with no buffering. - # - # Psych::Stream#start will take a block and ensure that Psych::Stream#finish - # is called, so you can do this form: - # - # stream = Psych::Stream.new($stdout) - # stream.start do |em| - # em.push(:foo => 'bar') - # end - # - class Stream < Psych::Visitors::YAMLTree - class Emitter < Psych::Emitter # :nodoc: - def end_document implicit_end = !streaming? - super - end - - def streaming? - true - end - end - - include Psych::Streaming - extend Psych::Streaming::ClassMethods - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/streaming.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/streaming.rb deleted file mode 100644 index eb19792..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/streaming.rb +++ /dev/null @@ -1,28 +0,0 @@ -# frozen_string_literal: true -module Psych - module Streaming - module ClassMethods - ### - # Create a new streaming emitter. Emitter will print to +io+. See - # Psych::Stream for an example. - def new io - emitter = const_get(:Emitter).new(io) - class_loader = ClassLoader.new - ss = ScalarScanner.new class_loader - super(emitter, ss, {}) - end - end - - ### - # Start streaming using +encoding+ - def start encoding = Nodes::Stream::UTF8 - super.tap { yield self if block_given? } - ensure - finish if block_given? - end - - private - def register target, obj - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/syntax_error.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/syntax_error.rb deleted file mode 100644 index a4c9c4a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/syntax_error.rb +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true -require_relative 'exception' - -module Psych - class SyntaxError < Psych::Exception - attr_reader :file, :line, :column, :offset, :problem, :context - - def initialize file, line, col, offset, problem, context - err = [problem, context].compact.join ' ' - filename = file || '' - message = "(%s): %s at line %d column %d" % [filename, err, line, col] - - @file = file - @line = line - @column = col - @offset = offset - @problem = problem - @context = context - super(message) - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/tree_builder.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/tree_builder.rb deleted file mode 100644 index 83115bd..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/tree_builder.rb +++ /dev/null @@ -1,137 +0,0 @@ -# frozen_string_literal: true -require_relative 'handler' - -module Psych - ### - # This class works in conjunction with Psych::Parser to build an in-memory - # parse tree that represents a YAML document. - # - # == Example - # - # parser = Psych::Parser.new Psych::TreeBuilder.new - # parser.parse('--- foo') - # tree = parser.handler.root - # - # See Psych::Handler for documentation on the event methods used in this - # class. - class TreeBuilder < Psych::Handler - # Returns the root node for the built tree - attr_reader :root - - # Create a new TreeBuilder instance - def initialize - @stack = [] - @last = nil - @root = nil - - @start_line = nil - @start_column = nil - @end_line = nil - @end_column = nil - end - - def event_location(start_line, start_column, end_line, end_column) - @start_line = start_line - @start_column = start_column - @end_line = end_line - @end_column = end_column - end - - %w{ - Sequence - Mapping - }.each do |node| - class_eval <<~RUBY, __FILE__, __LINE__ + 1 - def start_#{node.downcase}(anchor, tag, implicit, style) - n = Nodes::#{node}.new(anchor, tag, implicit, style) - set_start_location(n) - @last.children << n - push n - end - - def end_#{node.downcase} - n = pop - set_end_location(n) - n - end - RUBY - end - - ### - # Handles start_document events with +version+, +tag_directives+, - # and +implicit+ styling. - # - # See Psych::Handler#start_document - def start_document version, tag_directives, implicit - n = Nodes::Document.new version, tag_directives, implicit - set_start_location(n) - @last.children << n - push n - end - - ### - # Handles end_document events with +version+, +tag_directives+, - # and +implicit+ styling. - # - # See Psych::Handler#start_document - def end_document implicit_end = !streaming? - @last.implicit_end = implicit_end - n = pop - set_end_location(n) - n - end - - def start_stream encoding - @root = Nodes::Stream.new(encoding) - set_start_location(@root) - push @root - end - - def end_stream - n = pop - set_end_location(n) - n - end - - def scalar value, anchor, tag, plain, quoted, style - s = Nodes::Scalar.new(value,anchor,tag,plain,quoted,style) - set_location(s) - @last.children << s - s - end - - def alias anchor - a = Nodes::Alias.new(anchor) - set_location(a) - @last.children << a - a - end - - private - def push value - @stack.push value - @last = value - end - - def pop - x = @stack.pop - @last = @stack.last - x - end - - def set_location(node) - set_start_location(node) - set_end_location(node) - end - - def set_start_location(node) - node.start_line = @start_line - node.start_column = @start_column - end - - def set_end_location(node) - node.end_line = @end_line - node.end_column = @end_column - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/versions.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/versions.rb deleted file mode 100644 index 3202b10..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/versions.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module Psych - # The version of Psych you are using - VERSION = '5.2.6' - - if RUBY_ENGINE == 'jruby' - DEFAULT_SNAKEYAML_VERSION = '2.9'.freeze - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors.rb deleted file mode 100644 index 508290d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true -require_relative 'visitors/visitor' -require_relative 'visitors/to_ruby' -require_relative 'visitors/emitter' -require_relative 'visitors/yaml_tree' -require_relative 'visitors/json_tree' -require_relative 'visitors/depth_first' diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/depth_first.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/depth_first.rb deleted file mode 100644 index b4ff9e4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/depth_first.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true -module Psych - module Visitors - class DepthFirst < Psych::Visitors::Visitor - def initialize block - @block = block - end - - private - - def nary o - o.children.each { |x| visit x } - @block.call o - end - alias :visit_Psych_Nodes_Stream :nary - alias :visit_Psych_Nodes_Document :nary - alias :visit_Psych_Nodes_Sequence :nary - alias :visit_Psych_Nodes_Mapping :nary - - def terminal o - @block.call o - end - alias :visit_Psych_Nodes_Scalar :terminal - alias :visit_Psych_Nodes_Alias :terminal - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/emitter.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/emitter.rb deleted file mode 100644 index e3b92b7..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/emitter.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true -module Psych - module Visitors - class Emitter < Psych::Visitors::Visitor - def initialize io, options = {} - opts = [:indentation, :canonical, :line_width].find_all { |opt| - options.key?(opt) - } - - if opts.empty? - @handler = Psych::Emitter.new io - else - du = Handler::DumperOptions.new - opts.each { |option| du.send :"#{option}=", options[option] } - @handler = Psych::Emitter.new io, du - end - end - - def visit_Psych_Nodes_Stream o - @handler.start_stream o.encoding - o.children.each { |c| accept c } - @handler.end_stream - end - - def visit_Psych_Nodes_Document o - @handler.start_document o.version, o.tag_directives, o.implicit - o.children.each { |c| accept c } - @handler.end_document o.implicit_end - end - - def visit_Psych_Nodes_Scalar o - @handler.scalar o.value, o.anchor, o.tag, o.plain, o.quoted, o.style - end - - def visit_Psych_Nodes_Sequence o - @handler.start_sequence o.anchor, o.tag, o.implicit, o.style - o.children.each { |c| accept c } - @handler.end_sequence - end - - def visit_Psych_Nodes_Mapping o - @handler.start_mapping o.anchor, o.tag, o.implicit, o.style - o.children.each { |c| accept c } - @handler.end_mapping - end - - def visit_Psych_Nodes_Alias o - @handler.alias o.anchor - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/json_tree.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/json_tree.rb deleted file mode 100644 index 979fc10..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/json_tree.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true -require_relative '../json/ruby_events' - -module Psych - module Visitors - class JSONTree < YAMLTree - include Psych::JSON::RubyEvents - - def self.create options = {} - emitter = Psych::JSON::TreeBuilder.new - class_loader = ClassLoader.new - ss = ScalarScanner.new class_loader - new(emitter, ss, options) - end - - def accept target - if target.respond_to?(:encode_with) - dump_coder target - else - send(@dispatch_cache[target.class], target) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/to_ruby.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/to_ruby.rb deleted file mode 100644 index 580a74e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/to_ruby.rb +++ /dev/null @@ -1,475 +0,0 @@ -# frozen_string_literal: true -require_relative '../scalar_scanner' -require_relative '../class_loader' -require_relative '../exception' - -unless defined?(Regexp::NOENCODING) - Regexp::NOENCODING = 32 -end - -module Psych - module Visitors - ### - # This class walks a YAML AST, converting each node to Ruby - class ToRuby < Psych::Visitors::Visitor - def self.create(symbolize_names: false, freeze: false, strict_integer: false) - class_loader = ClassLoader.new - scanner = ScalarScanner.new class_loader, strict_integer: strict_integer - new(scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze) - end - - attr_reader :class_loader - - def initialize ss, class_loader, symbolize_names: false, freeze: false - super() - @st = {} - @ss = ss - @load_tags = Psych.load_tags - @domain_types = Psych.domain_types - @class_loader = class_loader - @symbolize_names = symbolize_names - @freeze = freeze - end - - def accept target - result = super - - unless @domain_types.empty? || !target.tag - key = target.tag.sub(/^[!\/]*/, '').sub(/(,\d+)\//, '\1:') - key = "tag:#{key}" unless key.match?(/^(?:tag:|x-private)/) - - if @domain_types.key? key - value, block = @domain_types[key] - result = block.call value, result - end - end - - result = deduplicate(result).freeze if @freeze - result - end - - def deserialize o - if klass = resolve_class(@load_tags[o.tag]) - instance = klass.allocate - - if instance.respond_to?(:init_with) - coder = Psych::Coder.new(o.tag) - coder.scalar = o.value - instance.init_with coder - end - - return instance - end - - return o.value if o.quoted - return @ss.tokenize(o.value) unless o.tag - - case o.tag - when '!binary', 'tag:yaml.org,2002:binary' - o.value.unpack('m').first - when /^!(?:str|ruby\/string)(?::(.*))?$/, 'tag:yaml.org,2002:str' - klass = resolve_class($1) - if klass - klass.allocate.replace o.value - else - o.value - end - when '!ruby/object:BigDecimal' - require 'bigdecimal' unless defined? BigDecimal - class_loader.big_decimal._load o.value - when "!ruby/object:DateTime" - class_loader.date_time - t = @ss.parse_time(o.value) - DateTime.civil(*t.to_a[0, 6].reverse, Rational(t.utc_offset, 86400)) + - (t.subsec/86400) - when '!ruby/encoding' - ::Encoding.find o.value - when "!ruby/object:Complex" - class_loader.complex - Complex(o.value) - when "!ruby/object:Rational" - class_loader.rational - Rational(o.value) - when "!ruby/class", "!ruby/module" - resolve_class o.value - when "tag:yaml.org,2002:float", "!float" - Float(@ss.tokenize(o.value)) - when "!ruby/regexp" - klass = class_loader.regexp - matches = /^\/(?.*)\/(?[mixn]*)$/m.match(o.value) - source = matches[:string].gsub('\/', '/') - options = 0 - lang = nil - matches[:options].each_char do |option| - case option - when 'x' then options |= Regexp::EXTENDED - when 'i' then options |= Regexp::IGNORECASE - when 'm' then options |= Regexp::MULTILINE - when 'n' then options |= Regexp::NOENCODING - else lang = option - end - end - klass.new(*[source, options, lang].compact) - when "!ruby/range" - klass = class_loader.range - args = o.value.split(/([.]{2,3})/, 2).map { |s| - accept Nodes::Scalar.new(s) - } - args.push(args.delete_at(1) == '...') - klass.new(*args) - when /^!ruby\/sym(bol)?:?(.*)?$/ - class_loader.symbolize o.value - else - @ss.tokenize o.value - end - end - private :deserialize - - def visit_Psych_Nodes_Scalar o - register o, deserialize(o) - end - - def visit_Psych_Nodes_Sequence o - if klass = resolve_class(@load_tags[o.tag]) - instance = klass.allocate - - if instance.respond_to?(:init_with) - coder = Psych::Coder.new(o.tag) - coder.seq = o.children.map { |c| accept c } - instance.init_with coder - end - - return instance - end - - case o.tag - when nil - register_empty(o) - when '!omap', 'tag:yaml.org,2002:omap' - map = register(o, Psych::Omap.new) - o.children.each { |a| - map[accept(a.children.first)] = accept a.children.last - } - map - when /^!(?:seq|ruby\/array):(.*)$/ - klass = resolve_class($1) - list = register(o, klass.allocate) - o.children.each { |c| list.push accept c } - list - else - register_empty(o) - end - end - - def visit_Psych_Nodes_Mapping o - if @load_tags[o.tag] - return revive(resolve_class(@load_tags[o.tag]), o) - end - return revive_hash(register(o, {}), o) unless o.tag - - case o.tag - when /^!ruby\/struct:?(.*)?$/ - klass = resolve_class($1) if $1 - - if klass - s = register(o, klass.allocate) - - members = {} - struct_members = s.members.map { |x| class_loader.symbolize x } - o.children.each_slice(2) do |k,v| - member = accept(k) - value = accept(v) - if struct_members.include?(class_loader.symbolize(member)) - s.send("#{member}=", value) - else - members[member.to_s.sub(/^@/, '')] = value - end - end - init_with(s, members, o) - else - klass = class_loader.struct - members = o.children.map { |c| accept c } - h = Hash[*members] - s = klass.new(*h.map { |k,v| - class_loader.symbolize k - }).new(*h.map { |k,v| v }) - register(o, s) - s - end - - when /^!ruby\/data(-with-ivars)?(?::(.*))?$/ - data = register(o, resolve_class($2).allocate) if $2 - members = {} - - if $1 # data-with-ivars - ivars = {} - o.children.each_slice(2) do |type, vars| - case accept(type) - when 'members' - revive_data_members(members, vars) - data ||= allocate_anon_data(o, members) - when 'ivars' - revive_hash(ivars, vars) - end - end - ivars.each do |ivar, v| - data.instance_variable_set ivar, v - end - else - revive_data_members(members, o) - end - data ||= allocate_anon_data(o, members) - init_struct(data, **members) - data.freeze - data - - when /^!ruby\/object:?(.*)?$/ - name = $1 || 'Object' - - if name == 'Complex' - class_loader.complex - h = Hash[*o.children.map { |c| accept c }] - register o, Complex(h['real'], h['image']) - elsif name == 'Rational' - class_loader.rational - h = Hash[*o.children.map { |c| accept c }] - register o, Rational(h['numerator'], h['denominator']) - elsif name == 'Hash' - revive_hash(register(o, {}), o) - else - obj = revive((resolve_class(name) || class_loader.object), o) - obj - end - - when /^!(?:str|ruby\/string)(?::(.*))?$/, 'tag:yaml.org,2002:str' - klass = resolve_class($1) - members = {} - string = nil - - o.children.each_slice(2) do |k,v| - key = accept k - value = accept v - - if key == 'str' - if klass - string = klass.allocate.replace value - else - string = value - end - register(o, string) - else - members[key] = value - end - end - init_with(string, members.map { |k,v| [k.to_s.sub(/^@/, ''),v] }, o) - when /^!ruby\/array:(.*)$/ - klass = resolve_class($1) - list = register(o, klass.allocate) - - members = Hash[o.children.map { |c| accept c }.each_slice(2).to_a] - list.replace members['internal'] - - members['ivars'].each do |ivar, v| - list.instance_variable_set ivar, v - end - list - - when '!ruby/range' - klass = class_loader.range - h = Hash[*o.children.map { |c| accept c }] - register o, klass.new(h['begin'], h['end'], h['excl']) - - when /^!ruby\/exception:?(.*)?$/ - h = Hash[*o.children.map { |c| accept c }] - - e = build_exception((resolve_class($1) || class_loader.exception), - h.delete('message')) - - e.set_backtrace h.delete('backtrace') if h.key? 'backtrace' - init_with(e, h, o) - - when '!set', 'tag:yaml.org,2002:set' - set = class_loader.psych_set.new - @st[o.anchor] = set if o.anchor - o.children.each_slice(2) do |k,v| - set[accept(k)] = accept(v) - end - set - - when /^!ruby\/hash-with-ivars(?::(.*))?$/ - hash = $1 ? resolve_class($1).allocate : {} - register o, hash - o.children.each_slice(2) do |key, value| - case key.value - when 'elements' - revive_hash hash, value - when 'ivars' - value.children.each_slice(2) do |k,v| - hash.instance_variable_set accept(k), accept(v) - end - end - end - hash - - when /^!map:(.*)$/, /^!ruby\/hash:(.*)$/ - revive_hash register(o, resolve_class($1).allocate), o - - when '!omap', 'tag:yaml.org,2002:omap' - map = register(o, class_loader.psych_omap.new) - o.children.each_slice(2) do |l,r| - map[accept(l)] = accept r - end - map - - when /^!ruby\/marshalable:(.*)$/ - name = $1 - klass = resolve_class(name) - obj = register(o, klass.allocate) - - if obj.respond_to?(:init_with) - init_with(obj, revive_hash({}, o), o) - elsif obj.respond_to?(:marshal_load) - marshal_data = o.children.map(&method(:accept)) - obj.marshal_load(marshal_data) - obj - else - raise ArgumentError, "Cannot deserialize #{name}" - end - - else - revive_hash(register(o, {}), o) - end - end - - def visit_Psych_Nodes_Document o - accept o.root - end - - def visit_Psych_Nodes_Stream o - o.children.map { |c| accept c } - end - - def visit_Psych_Nodes_Alias o - @st.fetch(o.anchor) { raise AnchorNotDefined, o.anchor } - end - - private - - def register node, object - @st[node.anchor] = object if node.anchor - object - end - - def register_empty object - list = register(object, []) - object.children.each { |c| list.push accept c } - list - end - - def allocate_anon_data node, members - klass = class_loader.data.define(*members.keys) - register(node, klass.allocate) - end - - def revive_data_members hash, o - o.children.each_slice(2) do |k,v| - name = accept(k) - value = accept(v) - hash[class_loader.symbolize(name)] = value - end - hash - end - - def revive_hash hash, o, tagged= false - o.children.each_slice(2) { |k,v| - key = accept(k) - val = accept(v) - - if key == '<<' && k.tag != "tag:yaml.org,2002:str" - case v - when Nodes::Alias, Nodes::Mapping - begin - hash.merge! val - rescue TypeError - hash[key] = val - end - when Nodes::Sequence - begin - h = {} - val.reverse_each do |value| - h.merge! value - end - hash.merge! h - rescue TypeError - hash[key] = val - end - else - hash[key] = val - end - else - if !tagged && @symbolize_names && key.is_a?(String) - key = key.to_sym - elsif !@freeze - key = deduplicate(key) - end - - hash[key] = val - end - - } - hash - end - - if RUBY_VERSION < '2.7' - def deduplicate key - if key.is_a?(String) - # It is important to untaint the string, otherwise it won't - # be deduplicated into an fstring, but simply frozen. - -(key.untaint) - else - key - end - end - else - def deduplicate key - if key.is_a?(String) - -key - else - key - end - end - end - - def merge_key hash, key, val - end - - def revive klass, node - s = register(node, klass.allocate) - init_with(s, revive_hash({}, node, true), node) - end - - def init_with o, h, node - c = Psych::Coder.new(node.tag) - c.map = h - - if o.respond_to?(:init_with) - o.init_with c - else - h.each { |k,v| o.instance_variable_set(:"@#{k}", v) } - end - o - end - - # Convert +klassname+ to a Class - def resolve_class klassname - class_loader.load klassname - end - end - - class NoAliasRuby < ToRuby - def visit_Psych_Nodes_Alias o - raise AliasesNotEnabled - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/visitor.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/visitor.rb deleted file mode 100644 index 21052aa..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/visitor.rb +++ /dev/null @@ -1,34 +0,0 @@ -# frozen_string_literal: true -module Psych - module Visitors - class Visitor - def accept target - visit target - end - - private - - # @api private - def self.dispatch_cache - Hash.new do |hash, klass| - hash[klass] = :"visit_#{klass.name.gsub('::', '_')}" - end.compare_by_identity - end - - if defined?(Ractor) - def dispatch - @dispatch_cache ||= (Ractor.current[:Psych_Visitors_Visitor] ||= Visitor.dispatch_cache) - end - else - DISPATCH = dispatch_cache - def dispatch - DISPATCH - end - end - - def visit target - send dispatch[target.class], target - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/yaml_tree.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/yaml_tree.rb deleted file mode 100644 index b6c86f4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/visitors/yaml_tree.rb +++ /dev/null @@ -1,626 +0,0 @@ -# frozen_string_literal: true -require_relative '../tree_builder' -require_relative '../scalar_scanner' -require_relative '../class_loader' - -module Psych - module Visitors - ### - # YAMLTree builds a YAML ast given a Ruby object. For example: - # - # builder = Psych::Visitors::YAMLTree.new - # builder << { :foo => 'bar' } - # builder.tree # => # v } - @emitter.end_sequence - end - - def visit_Encoding o - tag = "!ruby/encoding" - @emitter.scalar o.name, nil, tag, false, false, Nodes::Scalar::ANY - end - - def visit_Object o - tag = Psych.dump_tags[o.class] - unless tag - klass = o.class == Object ? nil : o.class.name - tag = ['!ruby/object', klass].compact.join(':') - end - - map = @emitter.start_mapping(nil, tag, false, Nodes::Mapping::BLOCK) - register(o, map) - - dump_ivars o - @emitter.end_mapping - end - - alias :visit_Delegator :visit_Object - - def visit_Data o - ivars = o.instance_variables - if ivars.empty? - tag = ['!ruby/data', o.class.name].compact.join(':') - register o, @emitter.start_mapping(nil, tag, false, Nodes::Mapping::BLOCK) - o.members.each do |member| - @emitter.scalar member.to_s, nil, nil, true, false, Nodes::Scalar::ANY - accept o.send member - end - @emitter.end_mapping - - else - tag = ['!ruby/data-with-ivars', o.class.name].compact.join(':') - node = @emitter.start_mapping(nil, tag, false, Psych::Nodes::Mapping::BLOCK) - register(o, node) - - # Dump the members - accept 'members' - @emitter.start_mapping nil, nil, true, Nodes::Mapping::BLOCK - o.members.each do |member| - @emitter.scalar member.to_s, nil, nil, true, false, Nodes::Scalar::ANY - accept o.send member - end - @emitter.end_mapping - - # Dump the ivars - accept 'ivars' - @emitter.start_mapping nil, nil, true, Nodes::Mapping::BLOCK - ivars.each do |ivar| - accept ivar.to_s - accept o.instance_variable_get ivar - end - @emitter.end_mapping - - @emitter.end_mapping - end - end unless RUBY_VERSION < "3.2" - - def visit_Struct o - tag = ['!ruby/struct', o.class.name].compact.join(':') - - register o, @emitter.start_mapping(nil, tag, false, Nodes::Mapping::BLOCK) - o.members.each do |member| - @emitter.scalar member.to_s, nil, nil, true, false, Nodes::Scalar::ANY - accept o[member] - end - - dump_ivars o - - @emitter.end_mapping - end - - def visit_Exception o - dump_exception o, o.message.to_s - end - - def visit_NameError o - dump_exception o, o.message.to_s - end - - def visit_Regexp o - register o, @emitter.scalar(o.inspect, nil, '!ruby/regexp', false, false, Nodes::Scalar::ANY) - end - - def visit_Date o - formatted = format_date o - register o, @emitter.scalar(formatted, nil, nil, true, false, Nodes::Scalar::ANY) - end - - def visit_DateTime o - t = o.italy - formatted = format_time t, t.offset.zero? - tag = '!ruby/object:DateTime' - register o, @emitter.scalar(formatted, nil, tag, false, false, Nodes::Scalar::ANY) - end - - def visit_Time o - formatted = format_time o - register o, @emitter.scalar(formatted, nil, nil, true, false, Nodes::Scalar::ANY) - end - - def visit_Rational o - register o, @emitter.start_mapping(nil, '!ruby/object:Rational', false, Nodes::Mapping::BLOCK) - - [ - 'denominator', o.denominator.to_s, - 'numerator', o.numerator.to_s - ].each do |m| - @emitter.scalar m, nil, nil, true, false, Nodes::Scalar::ANY - end - - @emitter.end_mapping - end - - def visit_Complex o - register o, @emitter.start_mapping(nil, '!ruby/object:Complex', false, Nodes::Mapping::BLOCK) - - ['real', o.real.to_s, 'image', o.imag.to_s].each do |m| - @emitter.scalar m, nil, nil, true, false, Nodes::Scalar::ANY - end - - @emitter.end_mapping - end - - def visit_Integer o - @emitter.scalar o.to_s, nil, nil, true, false, Nodes::Scalar::ANY - end - alias :visit_TrueClass :visit_Integer - alias :visit_FalseClass :visit_Integer - - def visit_Float o - if o.nan? - @emitter.scalar '.nan', nil, nil, true, false, Nodes::Scalar::ANY - elsif o.infinite? - @emitter.scalar((o.infinite? > 0 ? '.inf' : '-.inf'), - nil, nil, true, false, Nodes::Scalar::ANY) - else - @emitter.scalar o.to_s, nil, nil, true, false, Nodes::Scalar::ANY - end - end - - def visit_BigDecimal o - @emitter.scalar o._dump, nil, '!ruby/object:BigDecimal', false, false, Nodes::Scalar::ANY - end - - def visit_String o - plain = true - quote = true - style = Nodes::Scalar::PLAIN - tag = nil - - if binary?(o) - o = [o].pack('m0') - tag = '!binary' # FIXME: change to below when syck is removed - #tag = 'tag:yaml.org,2002:binary' - style = Nodes::Scalar::LITERAL - plain = false - quote = false - elsif o.match?(/\n(?!\Z)/) # match \n except blank line at the end of string - style = Nodes::Scalar::LITERAL - elsif o == '<<' - style = Nodes::Scalar::SINGLE_QUOTED - tag = 'tag:yaml.org,2002:str' - plain = false - quote = false - elsif o == 'y' || o == 'Y' || o == 'n' || o == 'N' - style = Nodes::Scalar::DOUBLE_QUOTED - elsif @line_width && o.length > @line_width - style = Nodes::Scalar::FOLDED - elsif o.match?(/^[^[:word:]][^"]*$/) - style = Nodes::Scalar::DOUBLE_QUOTED - elsif not String === @ss.tokenize(o) or /\A0[0-7]*[89]/.match?(o) - style = Nodes::Scalar::SINGLE_QUOTED - end - - is_primitive = o.class == ::String - ivars = is_primitive ? [] : o.instance_variables - - if ivars.empty? - unless is_primitive - tag = "!ruby/string:#{o.class}" - plain = false - quote = false - end - @emitter.scalar o, nil, tag, plain, quote, style - else - maptag = '!ruby/string'.dup - maptag << ":#{o.class}" unless o.class == ::String - - register o, @emitter.start_mapping(nil, maptag, false, Nodes::Mapping::BLOCK) - @emitter.scalar 'str', nil, nil, true, false, Nodes::Scalar::ANY - @emitter.scalar o, nil, tag, plain, quote, style - - dump_ivars o - - @emitter.end_mapping - end - end - - def visit_Module o - raise TypeError, "can't dump anonymous module: #{o}" unless o.name - register o, @emitter.scalar(o.name, nil, '!ruby/module', false, false, Nodes::Scalar::SINGLE_QUOTED) - end - - def visit_Class o - raise TypeError, "can't dump anonymous class: #{o}" unless o.name - register o, @emitter.scalar(o.name, nil, '!ruby/class', false, false, Nodes::Scalar::SINGLE_QUOTED) - end - - def visit_Range o - register o, @emitter.start_mapping(nil, '!ruby/range', false, Nodes::Mapping::BLOCK) - ['begin', o.begin, 'end', o.end, 'excl', o.exclude_end?].each do |m| - accept m - end - @emitter.end_mapping - end - - def visit_Hash o - if o.class == ::Hash - register(o, @emitter.start_mapping(nil, nil, true, Psych::Nodes::Mapping::BLOCK)) - o.each do |k,v| - accept(@stringify_names && Symbol === k ? k.to_s : k) - accept v - end - @emitter.end_mapping - else - visit_hash_subclass o - end - end - - def visit_Psych_Set o - register(o, @emitter.start_mapping(nil, '!set', false, Psych::Nodes::Mapping::BLOCK)) - - o.each do |k,v| - accept(@stringify_names && Symbol === k ? k.to_s : k) - accept v - end - - @emitter.end_mapping - end - - def visit_Array o - if o.class == ::Array - visit_Enumerator o - else - visit_array_subclass o - end - end - - def visit_Enumerator o - register o, @emitter.start_sequence(nil, nil, true, Nodes::Sequence::BLOCK) - o.each { |c| accept c } - @emitter.end_sequence - end - - def visit_NilClass o - @emitter.scalar('', nil, 'tag:yaml.org,2002:null', true, false, Nodes::Scalar::ANY) - end - - def visit_Symbol o - if o.empty? - @emitter.scalar "", nil, '!ruby/symbol', false, false, Nodes::Scalar::ANY - else - @emitter.scalar ":#{o}", nil, nil, true, false, Nodes::Scalar::ANY - end - end - - def visit_BasicObject o - tag = Psych.dump_tags[o.class] - tag ||= "!ruby/marshalable:#{o.class.name}" - - map = @emitter.start_mapping(nil, tag, false, Nodes::Mapping::BLOCK) - register(o, map) - - o.marshal_dump.each(&method(:accept)) - - @emitter.end_mapping - end - - private - - def binary? string - string.encoding == Encoding::ASCII_8BIT && !string.ascii_only? - end - - def visit_array_subclass o - tag = "!ruby/array:#{o.class}" - ivars = o.instance_variables - if ivars.empty? - node = @emitter.start_sequence(nil, tag, false, Nodes::Sequence::BLOCK) - register o, node - o.each { |c| accept c } - @emitter.end_sequence - else - node = @emitter.start_mapping(nil, tag, false, Nodes::Sequence::BLOCK) - register o, node - - # Dump the internal list - accept 'internal' - @emitter.start_sequence(nil, nil, true, Nodes::Sequence::BLOCK) - o.each { |c| accept c } - @emitter.end_sequence - - # Dump the ivars - accept 'ivars' - @emitter.start_mapping(nil, nil, true, Nodes::Sequence::BLOCK) - ivars.each do |ivar| - accept ivar - accept o.instance_variable_get ivar - end - @emitter.end_mapping - - @emitter.end_mapping - end - end - - def visit_hash_subclass o - ivars = o.instance_variables - if ivars.any? - tag = "!ruby/hash-with-ivars:#{o.class}" - node = @emitter.start_mapping(nil, tag, false, Psych::Nodes::Mapping::BLOCK) - register(o, node) - - # Dump the ivars - accept 'ivars' - @emitter.start_mapping nil, nil, true, Nodes::Mapping::BLOCK - o.instance_variables.each do |ivar| - accept ivar - accept o.instance_variable_get ivar - end - @emitter.end_mapping - - # Dump the elements - accept 'elements' - @emitter.start_mapping nil, nil, true, Nodes::Mapping::BLOCK - o.each do |k,v| - accept k - accept v - end - @emitter.end_mapping - - @emitter.end_mapping - else - tag = "!ruby/hash:#{o.class}" - node = @emitter.start_mapping(nil, tag, false, Psych::Nodes::Mapping::BLOCK) - register(o, node) - o.each do |k,v| - accept k - accept v - end - @emitter.end_mapping - end - end - - def dump_list o - end - - def dump_exception o, msg - tag = ['!ruby/exception', o.class.name].join ':' - - @emitter.start_mapping nil, tag, false, Nodes::Mapping::BLOCK - - if msg - @emitter.scalar 'message', nil, nil, true, false, Nodes::Scalar::ANY - accept msg - end - - @emitter.scalar 'backtrace', nil, nil, true, false, Nodes::Scalar::ANY - accept o.backtrace - - dump_ivars o - - @emitter.end_mapping - end - - def format_time time, utc = time.utc? - if utc - time.strftime("%Y-%m-%d %H:%M:%S.%9N Z") - else - time.strftime("%Y-%m-%d %H:%M:%S.%9N %:z") - end - end - - def format_date date - date.strftime("%Y-%m-%d") - end - - def register target, yaml_obj - @st.register target, yaml_obj - yaml_obj - end - - def dump_coder o - @coders << o - tag = Psych.dump_tags[o.class] - unless tag - klass = o.class == Object ? nil : o.class.name - tag = ['!ruby/object', klass].compact.join(':') - end - - c = Psych::Coder.new(tag) - o.encode_with(c) - emit_coder c, o - end - - def emit_coder c, o - case c.type - when :scalar - @emitter.scalar c.scalar, nil, c.tag, c.tag.nil?, false, c.style - when :seq - @emitter.start_sequence nil, c.tag, c.tag.nil?, c.style - c.seq.each do |thing| - accept thing - end - @emitter.end_sequence - when :map - register o, @emitter.start_mapping(nil, c.tag, c.implicit, c.style) - c.map.each do |k,v| - accept k - accept v - end - @emitter.end_mapping - when :object - accept c.object - end - end - - def dump_ivars target - target.instance_variables.each do |iv| - @emitter.scalar("#{iv.to_s.sub(/^@/, '')}", nil, nil, true, false, Nodes::Scalar::ANY) - accept target.instance_variable_get(iv) - end - end - end - - class RestrictedYAMLTree < YAMLTree - DEFAULT_PERMITTED_CLASSES = { - TrueClass => true, - FalseClass => true, - NilClass => true, - Integer => true, - Float => true, - String => true, - Array => true, - Hash => true, - }.compare_by_identity.freeze - - def initialize emitter, ss, options - super - @permitted_classes = DEFAULT_PERMITTED_CLASSES.dup - Array(options[:permitted_classes]).each do |klass| - @permitted_classes[klass] = true - end - @permitted_symbols = {}.compare_by_identity - Array(options[:permitted_symbols]).each do |symbol| - @permitted_symbols[symbol] = true - end - @aliases = options.fetch(:aliases, false) - end - - def accept target - if !@aliases && @st.key?(target) - raise BadAlias, "Tried to dump an aliased object" - end - - unless Symbol === target || @permitted_classes[target.class] - raise DisallowedClass.new('dump', target.class.name || target.class.inspect) - end - - super - end - - def visit_Symbol sym - unless @permitted_classes[Symbol] || @permitted_symbols[sym] - raise DisallowedClass.new('dump', "Symbol(#{sym.inspect})") - end - - super - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/y.rb b/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/y.rb deleted file mode 100644 index e857953..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/psych-5.2.6/lib/psych/y.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true -module Kernel - ### - # An alias for Psych.dump_stream meant to be used with IRB. - def y *objects - puts Psych.dump_stream(*objects) - end - private :y -end - diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/History.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/History.md deleted file mode 100644 index bcca8f2..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/History.md +++ /dev/null @@ -1,3046 +0,0 @@ -## 6.6.1 / 2025-07-30 - -* Bugfixes - * Accept `to_path` to be `nil` on request bodies ([#3635]) - * Fix single runner stats before the server start ([#3572]) - * Fix incomplete worker boot state on refork ([#3601]) - * Improve HttpParserError messages for better debugging ([#3586]) - * Fix refork logs to distinguish from phased restarts ([#3598]) - * Fix `rack.after_reply` so it doesn't interrupt chain on error ([#3680]) - -## 6.6.0 / 2025-01-29 - -* Features - * Option to turn off SIGUSR2 trapping ([#3570], [#3567]) - * Shorten `ThreadPool` trimmer and reaper thread names ([#3383]) - * Add after_refork hook ([#3386]) - * Add busy threads stat ([#3517]) - * Add a debug log before running each type of hook ([#3375]) - * Allow alternative schemes in Binder ([#3348], [#3302]) - * Avoid spawning `Threadpool#trim` thread if pool size is fixed ([#3384]) - -* Bugfixes - * Change `HttpParserError` to be subclass of `StandardError` ([#3590], [#3552]) - * added test cases - * fix update phased restart symlink folder - -* Performance - * Only ping worker 0 during phased restart if using fork worker ([#3568]) - -* Refactor - * Fix multi-delimiter split to get status app token ([#3505]) - * Change ping to use const ([#3595]) - * Fixup use of Puma::Const::PipeRequest constants ([#3565]) - * Update DSL hook processing logic to be consistent ([#3376]) - -## 6.5.0 / 2024-11-23 - -* Features - * Print RUBY_DESCRIPTION when Puma starts ([#3407]) - * Set the worker process count automatically when using WEB_CONCURRENCY=auto ([#3439], [#3437]) - * Mark as ractor-safe ([#3486], [#3422]) - * Add option `enable_keep_alive`. `true` mimics existing behavior, but now can use `false` to disable keepalive to reduce queue tail latency ([#3496]) - * Add parameters to Puma methods to allow CI to change ENV in isolation ([#3485]) - * Add `ssl_ciphersuites` option for TLSv1.3 ciphers ([#3359], [#3343]) - * You can now use `--threads 5` or `threads 5` to config max/min threads with a single number (used to need to say `5:5`) ([#3309]) - * Option to turn off systemd plugin ([#3425], [#3424]) - * Add `on_stopped` hook ([#3411], [#3380]) - -* Bugfixes - * Handle blank environment variables when loading config ([#3539]) - * lib/rack/handler/puma.rb - fix for rackup v1.0.1, adjust Gemfile ([#3532], [#3531]) - * null_io.rb - add `external_encoding`, `set_encoding`, `binmode`, `binmode?` ([#3214]) - * Implement NullIO#seek and #pos to mimic IO ([#3468]) - * add support in rack handler & fix regression in binder for linux abstract namespace sockets ([#3508]) - * Use actual thread local for `Puma::Server.current`. ([#3360]) - * client.rb - fix request chunked body handling ([#3338], [#3337]) - * Properly handle two requests seen in the initial buffer ([#3332]) - * Fix response repeated status line when request is invalid or errors are raised ([#3308], [#3307]) - * Fix child processes not being reaped when `Process.detach` used ([#3314], [#3313]) - -* JRuby - * Make HTTP length constants configurable ([#3518]) - * Fixup jruby_restart.rb & launcher.rb to work with ARM64 macOS JRuby ([#3467]) - -* Performance - * Avoid checking if all workers reached timeout unless idle timeout is configured ([#3341]) - * Request body - increase read size to 64 kB ([#3548]) - * single mode skip wait_for_less_busy_worker ([#3325]) - -* Refactor - * A ton of CI/test improvements by @MSP-Greg, as usual. - * Add ThreadPool#stats and adjust Server#stats to use it ([#3527]) - * normalize whitespace in worker stats string ([#3513]) - * rack/handler/puma.rb - ssl - use `start_with?`, add test ([#3510]) - * extconf.rb - add logging for OpenSSL versions ([#3370]) - * Lazily require `Puma::Rack::Builder` ([#3340]) - * Refactor: Constantize worker pipe request types ([#3318]) - -* Docs - * stats.md improvements ([#3514]) - * control_cli.rb: Harmonize help message with bin/puma ([#3434]) - * dsl.rb: Clarify a callback's argument ([#3435]) - * lib/rack/handler/puma.rb - relocate and fixup module comment ([#3495]) - -## 6.4.3 / 2024-09-19 - -* Security - * Discards any headers using underscores if the non-underscore version also exists. Without this, an attacker could overwrite values set by intermediate proxies (e.g. X-Forwarded-For). ([CVE-2024-45614](https://github.com/puma/puma/security/advisories/GHSA-9hf4-67fc-4vf4)/GHSA-9hf4-67fc-4vf4) - -## 6.4.2 / 2024-01-08 - -* Security - * Limit the size of chunk extensions. Without this limit, an attacker could cause unbounded resource (CPU, network bandwidth) consumption. ([GHSA-c2f4-cvqm-65w2](https://github.com/puma/puma/security/advisories/GHSA-c2f4-cvqm-65w2)) - -## 6.4.1 / 2024-01-03 - -* Bugfixes - * DSL#warn_if_in_single_mode - fixup when workers set via CLI ([#3256]) - * Fix `idle-timeout` not working in cluster mode ([#3235], [#3228], [#3282], [#3283]) - * Fix worker 0 timing out during phased restart ([#3225], [#2786]) - * context_builder.rb - require openssl if verify_mode != 'none' ([#3179]) - * Make puma cluster process suitable as PID 1 ([#3255]) - * Improve Puma::NullIO consistency with real IO ([#3276]) - * extconf.rb - fixup to detect openssl info in Ruby build ([#3271], [#3266]) - * MiniSSL.java - set serialVersionUID, fix RaiseException deprecation ([#3270]) - * dsl.rb - fix warn_if_in_single_mode when WEB_CONCURRENCY is set ([#3265], [#3264]) - -* Maintenance - * LOTS of test refactoring to make tests more stable and easier to write - thanks to @MSP-Greg! - * Fix bug in tests re: TestPuma::HOST4 ([#3254]) - * Dockerfile for minimal repros: use Ruby 3.2, expect bundler installed ([#3245]) - * fix define_method calls, use Symbol parameter instead of String ([#3293]) - -* Docs - * README.md - add the puma-acme plugin ([#3301]) - * Remove `--keep-file-descriptors` flag from systemd docs ([#3248]) - * Note symlink mechanism in restart documentation for hot restart ([#3298]) - -## 6.4.0 / 2023-09-21 - -* Features - * on_thread_exit hook ([#2920]) - * on_thread_start_hook ([#3195]) - * Shutdown on idle ([#3209], [#2580]) - * New error message when control server port taken ([#3204]) - -* Refactor - * Remove `Forwardable` dependency ([#3191], #3190) - * Update URLMap Regexp usage for Ruby v3.3 ([#3165]) - -* Bugfixes - * Bring the cert_pem: parameter into parity with the cert: parameter to ssl_bind. ([#3174]) - * Fix using control server with IPv6 host ([#3181]) - * control_cli.rb - add require_relative 'log_writer' ([#3187]) - * Fix cases where fallback Rack response wasn't sent to the client ([#3094]) - -## 6.3.1 / 2023-08-18 - -* Security - * Address HTTP request smuggling vulnerabilities with zero-length Content Length header and trailer fields ([GHSA-68xg-gqqm-vgj8](https://github.com/puma/puma/security/advisories/GHSA-68xg-gqqm-vgj8)) - -## 6.3.0 / 2023-05-31 - -* Features - * Add dsl method `supported_http_methods` ([#3106], [#3014]) - * Puma error responses no longer have any fingerprints to indicate Puma ([#3161], [#3037]) - * Support decryption of SSL key ([#3133], [#3132]) - -* Bugfixes - * Don't send 103 early hints response when only invalid headers are used ([#3163]) - * Handle malformed request path ([#3155], [#3148]) - * Misc lib file fixes - trapping additional errors, CI helper ([#3129]) - * Fixup req form data file upload with "r\n" line endings ([#3137]) - * Restore rack 1.6 compatibility ([#3156]) - -* Refactor - * const.rb - Update Puma::HTTP_STATUS_CODES ([#3162]) - * Clarify Reactor#initialize ([#3151]) - -## 6.2.2 / 2023-04-17 - -* Bugfixes - * Fix Rack-related NameError by adding :: operator ([#3118], [#3117]) - -## 6.2.1 / 2023-03-31 - -* Bugfixes - * Fix java 8 compatibility ([#3109], [#3108]) - * Always write io_buffer when in "enum bodies" branch. ([#3113], [#3112]) - * Fix warn_if_in_single_mode incorrect message ([#3111]) - -## 6.2.0 / 2023-03-29 - -* Features - * Ability to supply a custom logger ([#2770], [#2511]) - * Warn when cluster mode-only hooks are defined in single mode ([#3089]) - * Adds the on_booted event ([#2709]) - -* Bugfixes - * Loggers - internal_write - catch Errno::EINVAL ([#3091]) - * commonlogger.rb - fix HIJACK time format, use constants, not strings ([#3074]) - * Fixed some edge cases regarding request hijacking ([#3072]) - -## 6.1.1 / 2023-02-28 - -* Bugfixes - * We no longer try to use the systemd plugin for JRuby ([#3079]) - * Allow ::Rack::Handler::Puma.run to work regardless of whether Rack/Rackup are loaded ([#3080]) - -## 6.1.0 / 2023-02-12 - -* Features - * WebSocket support via partial hijack ([#3058], [#3007]) - * Add built-in systemd notify support ([#3011]) - * Periodically send status to systemd ([#3006], [#2604]) - * Introduce the ability to return 413: payload too large for requests ([#3040]) - * Log loaded extensions when `PUMA_DEBUG` is set ([#3036], [#3020]) - -* Bugfixes - * Fix issue with rack 3 compatibility re: rackup ([#3061], [#3057]) - * Allow setting TCP low_latency with SSL listener ([#3065]) - -* Performance - * Reduce memory usage for large file uploads ([#3062]) - -## 6.0.2 / 2023-01-01 - -* Refactor - * Remove use of etc and time gems in Puma ([#3035], [#3033]) - * Refactor const.rb - freeze ([#3016]) - -## 6.0.1 / 2022-12-20 - -* Bugfixes - * Handle waking up a closed selector in Reactor#add ([#3005]) - * Fixup response processing, enumerable bodies ([#3004], [#3000]) - * Correctly close app body for all code paths ([#3002], [#2999]) -* Refactor - * Add IOBuffer to Client, remove from ThreadPool thread instances ([#3013]) - -## 6.0.0 / 2022-10-14 - -* Breaking Changes - * Dropping Ruby 2.2 and 2.3 support (now 2.4+) ([#2919]) - * Remote_addr functionality has changed ([#2652], [#2653]) - * No longer supporting Java 1.7 or below (JRuby 9.1 was the last release to support this) ([#2849]) - * Remove nakayoshi GC ([#2933], [#2925]) - * wait_for_less_busy_worker is now default on ([#2940]) - * Prefix all environment variables with `PUMA_` ([#2924], [#2853]) - * Removed some constants ([#2957], [#2958], [#2959], [#2960]) - * The following classes are now part of Puma's private API: `Client`, `Cluster::Worker`, `Cluster::Worker`, `HandleRequest`. ([#2988]) - * Configuration constants like `DefaultRackup` removed ([#2928]) - * Extracted `LogWriter` from `Events` ([#2798]) - * Only accept the standard 8 HTTP methods, others rejected with 501. ([#2932]) - -* Features - * Increase throughput on large (100kb+) response bodies by 3-10x ([#2896], [#2892]) - * Increase throughput on file responses ([#2923]) - * Add support for streaming bodies in Rack. ([#2740]) - * Allow OpenSSL session reuse via a 'reuse' ssl_bind method or bind string query parameter ([#2845]) - * Allow `run_hooks` to pass a hash to blocks for use later ([#2917], [#2915]) - * Allow using `preload_app!` with `fork_worker` ([#2907]) - * Support request_body_wait metric with higher precision ([#2953]) - * Allow header values to be arrays (Rack 3) ([#2936], [#2931]) - * Export Puma/Ruby versions in /stats ([#2875]) - * Allow configuring request uri max length & request path max length ([#2840]) - * Add a couple of public accessors ([#2774]) - * Log entire backtrace when worker start fails ([#2891]) - * [jruby] Enable TLSv1.3 support ([#2886]) - * [jruby] support setting TLS protocols + rename ssl_cipher_list ([#2899]) - * [jruby] Support a truststore option ([#2849], [#2904], [#2884]) - -* Bugfixes - * Load the configuration before passing it to the binder ([#2897]) - * Do not raise error raised on HTTP methods we don't recognize or support, like CONNECT ([#2932], [#1441]) - * Fixed a memory leak when creating a new SSL listener ([#2956]) - -* Refactor - * log_writer.rb - add internal_write method ([#2888]) - * Extract prune_bundler code into it's own class. ([#2797]) - * Refactor Launcher#run to increase readability (no logic change) ([#2795]) - * Ruby 3.2 will have native IO#wait_* methods, don't require io/wait ([#2903]) - * Various internal API refactorings ([#2942], [#2921], [#2922], [#2955]) - -## 5.6.9 / 2024-09-19 - -* Security - * Discards any headers using underscores if the non-underscore version also exists. Without this, an attacker could overwrite values set by intermediate proxies (e.g. X-Forwarded-For). ([CVE-2024-45614](https://github.com/puma/puma/security/advisories/GHSA-9hf4-67fc-4vf4)/GHSA-9hf4-67fc-4vf4) -* JRuby - * Must use at least Java >= 9 to compile. You can no longer build from source on Java 8. - - -## 5.6.8 / 2024-01-08 - -* Security - * Limit the size of chunk extensions. Without this limit, an attacker could cause unbounded resource (CPU, network bandwidth) consumption. ([GHSA-c2f4-cvqm-65w2](https://github.com/puma/puma/security/advisories/GHSA-c2f4-cvqm-65w2)) - -## 5.6.7 / 2023-08-18 - -* Security - * Address HTTP request smuggling vulnerabilities with zero-length Content Length header and trailer fields ([GHSA-68xg-gqqm-vgj8](https://github.com/puma/puma/security/advisories/GHSA-68xg-gqqm-vgj8)) - -## 5.6.6 / 2023-06-21 - -* Bugfix - * Prevent loading with rack 3 ([#3166]) - -## 5.6.5 / 2022-08-23 - -* Feature - * Puma::ControlCLI - allow refork command to be sent as a request ([#2868], [#2866]) - -* Bugfixes - * NullIO#closed should return false ([#2883]) - * [jruby] Fix TLS verification hang ([#2890], [#2729]) - * extconf.rb - don't use pkg_config('openssl') if '--with-openssl-dir' is used ([#2885], [#2839]) - * MiniSSL - detect SSL_CTX_set_dh_auto ([#2864], [#2863]) - * Fix rack.after_reply exceptions breaking connections ([#2861], [#2856]) - * Escape SSL cert and filenames ([#2855]) - * Fail hard if SSL certs or keys are invalid ([#2848]) - * Fail hard if SSL certs or keys cannot be read by user ([#2847]) - * Fix build with Opaque DH in LibreSSL 3.5. ([#2838]) - * Pre-existing socket file removed when TERM is issued after USR2 (if puma is running in cluster mode) ([#2817]) - * Fix Puma::StateFile#load incompatibility ([#2810]) - -## 5.6.4 / 2022-03-30 - -* Security - * Close several HTTP Request Smuggling exploits (CVE-2022-24790) - -## 5.6.2 / 2022-02-11 - -* Bugfix/Security - * Response body will always be `close`d. (GHSA-rmj8-8hhh-gv5h, related to [#2809]) - -## 5.6.1 / 2022-01-26 - -* Bugfixes - * Reverted a commit which appeared to be causing occasional blank header values ([#2809]) - -## 5.6.0 / 2022-01-25 - -* Features - * Support `localhost` integration in `ssl_bind` ([#2764], [#2708]) - * Allow backlog parameter to be set with ssl_bind DSL ([#2780]) - * Remove yaml (psych) requirement in StateFile ([#2784]) - * Allow culling of oldest workers, previously was only youngest ([#2773], [#2794]) - * Add worker_check_interval configuration option ([#2759]) - * Always send lowlevel_error response to client ([#2731], [#2341]) - * Support for cert_pem and key_pem with ssl_bind DSL ([#2728]) - -* Bugfixes - * Keep thread names under 15 characters, prevents breakage on some OSes ([#2733]) - * Fix two 'old-style-definition' compile warning ([#2807], [#2806]) - * Log environment correctly using option value ([#2799]) - * Fix warning from Ruby master (will be 3.2.0) ([#2785]) - * extconf.rb - fix openssl with old Windows builds ([#2757]) - * server.rb - rescue handling (`Errno::EBADF`) for `@notify.close` ([#2745]) - -* Refactor - * server.rb - refactor code using @options[:remote_address] ([#2742]) - * [jruby] a couple refactorings - avoid copy-ing bytes ([#2730]) - -## 5.5.2 / 2021-10-12 - -* Bugfixes - * Allow UTF-8 in HTTP header values - -## 5.5.1 / 2021-10-12 - -* Feature (added as mistake - we don't normally do this on bugfix releases, sorry!) - * Allow setting APP_ENV in preference to RACK_ENV or RAILS_ENV ([#2702]) - -* Security - * Do not allow LF as a line ending in a header (CVE-2021-41136) - -## 5.5.0 / 2021-09-19 - -* Features - * Automatic SSL certificate provisioning for localhost, via localhost gem ([#2610], [#2257]) - * add support for the PROXY protocol (v1 only) ([#2654], [#2651]) - * Add a semantic CLI option for no config file ([#2689]) - -* Bugfixes - * More elaborate exception handling - lets some dead pumas die. ([#2700], [#2699]) - * allow multiple after_worker_fork hooks ([#2690]) - * Preserve BUNDLE_APP_CONFIG on worker fork ([#2688], [#2687]) - -* Performance - * Fix performance of server-side SSL connection close. ([#2675]) - -## 5.4.0 / 2021-07-28 - -* Features - * Better/expanded names for threadpool threads ([#2657]) - * Allow pkg_config for OpenSSL ([#2648], [#1412]) - * Add `rack_url_scheme` to Puma::DSL, allows setting of `rack.url_scheme` header ([#2586], [#2569]) - -* Bugfixes - * `Binder#parse` - allow for symlinked unix path, add create_activated_fds debug ENV ([#2643], [#2638]) - * Fix deprecation warning: minissl.c - Use Random.bytes if available ([#2642]) - * Client certificates: set session id context while creating SSLContext ([#2633]) - * Fix deadlock issue in thread pool ([#2656]) - -* Refactor - * Replace `IO.select` with `IO#wait_*` when checking a single IO ([#2666]) - -## 5.3.2 / 2021-05-21 - -* Bugfixes - * Gracefully handle Rack not accepting CLI options ([#2630], [#2626]) - * Fix sigterm misbehavior ([#2629]) - * Improvements to keepalive-connection shedding ([#2628]) - -## 5.3.1 / 2021-05-11 - -* Security - * Close keepalive connections after the maximum number of fast inlined requests (CVE-2021-29509) ([#2625]) - -## 5.3.0 / 2021-05-07 - -* Features - * Add support for Linux's abstract sockets ([#2564], [#2526]) - * Add debug to worker timeout and startup ([#2559], [#2528]) - * Print warning when running one-worker cluster ([#2565], [#2534]) - * Don't close systemd activated socket on pumactl restart ([#2563], [#2504]) - -* Bugfixes - * systemd - fix event firing ([#2591], [#2572]) - * Immediately unlink temporary files ([#2613]) - * Improve parsing of HTTP_HOST header ([#2605], [#2584]) - * Handle fatal error that has no backtrace ([#2607], [#2552]) - * Fix timing out requests too early ([#2606], [#2574]) - * Handle segfault in Ruby 2.6.6 on thread-locals ([#2567], [#2566]) - * Server#closed_socket? - parameter may be a MiniSSL::Socket ([#2596]) - * Define UNPACK_TCP_STATE_FROM_TCP_INFO in the right place ([#2588], [#2556]) - * request.rb - fix chunked assembly for ascii incompatible encodings, add test ([#2585], [#2583]) - -* Performance - * Reset peerip only if remote_addr_header is set ([#2609]) - * Reduce puma_parser struct size ([#2590]) - -* Refactor - * Refactor drain on shutdown ([#2600]) - * Micro optimisations in `wait_for_less_busy_worker` feature ([#2579]) - * Lots of test fixes - -## 5.2.2 / 2021-02-22 - -* Bugfixes - * Add `#flush` and `#sync` methods to `Puma::NullIO` ([#2553]) - * Restore `sync=true` on `STDOUT` and `STDERR` streams ([#2557]) - -## 5.2.1 / 2021-02-05 - -* Bugfixes - * Fix TCP cork/uncork operations to work with ssl clients ([#2550]) - * Require rack/common_logger explicitly if :verbose is true ([#2547]) - * MiniSSL::Socket#write - use data.byteslice(wrote..-1) ([#2543]) - * Set `@env[CONTENT_LENGTH]` value as string. ([#2549]) - -## 5.2.0 / 2021-01-27 - -* Features - * 10x latency improvement for MRI on ssl connections by reducing overhead ([#2519]) - * Add option to specify the desired IO selector backend for libev ([#2522]) - * Add ability to set OpenSSL verification flags (MRI only) ([#2490]) - * Uses `flush` after writing messages to avoid mutating $stdout and $stderr using `sync=true` ([#2486]) - -* Bugfixes - * MiniSSL - Update dhparam to 2048 bit for use with SSL_CTX_set_tmp_dh ([#2535]) - * Change 'Goodbye!' message to be output after listeners are closed ([#2529]) - * Fix ssl bind logging with 0.0.0.0 and localhost ([#2533]) - * Fix compiler warnings, but skipped warnings related to ragel state machine generated code ([#1953]) - * Fix phased restart errors related to nio4r gem when using the Puma control server ([#2516]) - * Add `#string` method to `Puma::NullIO` ([#2520]) - * Fix binding via Rack handler to IPv6 addresses ([#2521]) - -* Refactor - * Refactor MiniSSL::Context on MRI, fix MiniSSL::Socket#write ([#2519]) - * Remove `Server#read_body` ([#2531]) - * Fail build if compiling extensions raises warnings on GH Actions, configurable via `MAKE_WARNINGS_INTO_ERRORS` ([#1953]) - -## 5.1.1 / 2020-12-10 - -* Bugfixes - * Fix over eager matching against banned header names ([#2510]) - -## 5.1.0 / 2020-11-30 - -* Features - * Phased restart availability is now always logged, even if it is not available. - * Prints the loaded configuration if the environment variable `PUMA_LOG_CONFIG` is present ([#2472]) - * Integrate with systemd's watchdog and notification features ([#2438]) - * Adds max_fast_inline as a configuration option for the Server object ([#2406]) - * You can now fork workers from worker 0 using SIGURG w/o fork_worker enabled [#2449] - * Add option to bind to systemd activated sockets ([#2362]) - * Add compile option to change the `QUERY_STRING` max length ([#2485]) - -* Bugfixes - * Fix JRuby handling in Puma::DSL#ssl_bind ([#2489]) - * control_cli.rb - all normal output should be to @stdout ([#2487]) - * Catch 'Error in reactor loop escaped: mode not supported for this object: r' ([#2477]) - * Ignore Rails' reaper thread (and any thread marked forksafe) for warning ([#2475]) - * Ignore illegal (by Rack spec) response header ([#2439]) - * Close idle connections immediately on shutdown ([#2460]) - * Fix some instances of phased restart errors related to the `json` gem ([#2473]) - * Remove use of `json` gem to fix phased restart errors ([#2479]) - * Fix grouping regexp of ILLEGAL_HEADER_KEY_REGEX ([#2495]) - -## 5.0.4 / 2020-10-27 - -* Bugfixes - * Pass preloaded application into new workers if available when using `preload_app` ([#2461], [#2454]) - -## 5.0.3 / 2020-10-26 - -* Bugfixes - * Add Client#io_ok?, check before Reactor#register ([#2432]) - * Fix hang on shutdown in refork ([#2442]) - * Fix `Bundler::GemNotFound` errors for `nio4r` gem during phased restarts ([#2427], [#2018]) - * Server run thread safety fix ([#2435]) - * Fire `on_booted` after server starts ([#2431], [#2212]) - * Cleanup daemonization in rc.d script ([#2409]) - -* Refactor - * Remove accept_nonblock.rb, add test_integration_ssl.rb ([#2448]) - * Refactor status.rb - dry it up a bit ([#2450]) - * Extract req/resp methods to new request.rb from server.rb ([#2419]) - * Refactor Reactor and Client request buffering ([#2279]) - * client.rb - remove JRuby specific 'finish' code ([#2412]) - * Consolidate fast_write calls in Server, extract early_hints assembly ([#2405]) - * Remove upstart from docs ([#2408]) - * Extract worker process into separate class ([#2374]) - * Consolidate option handling in Server, Server small refactors, doc changes ([#2389]) - -## 5.0.2 / 2020-09-28 - -* Bugfixes - * Reverted API changes to Server. - -## 5.0.1 / 2020-09-28 - -* Bugfixes - * Fix LoadError in CentOS 8 ([#2381]) - * Better error handling during force shutdown ([#2271]) - * Prevent connections from entering Reactor after shutdown begins ([#2377]) - * Fix error backtrace debug logging && Do not log request dump if it is not parsed ([#2376]) - * Split TCP_CORK and TCP_INFO ([#2372]) - * Do not log EOFError when a client connection is closed without write ([#2384]) - -* Refactor - * Change Events#ssl_error signature from (error, peeraddr, peercert) to (error, ssl_socket) ([#2375]) - * Consolidate option handling in Server, Server small refactors, doc chang ([#2373]) - -## 5.0.0 / 2020-09-17 - -* Features - * Allow compiling without OpenSSL and dynamically load files needed for SSL, add 'no ssl' CI ([#2305]) - * EXPERIMENTAL: Add `fork_worker` option and `refork` command for reduced memory usage by forking from a worker process instead of the master process. ([#2099]) - * EXPERIMENTAL: Added `wait_for_less_busy_worker` config. This may reduce latency on MRI through inserting a small delay before re-listening on the socket if worker is busy ([#2079]). - * EXPERIMENTAL: Added `nakayoshi_fork` option. Reduce memory usage in preloaded cluster-mode apps by GCing before fork and compacting, where available. ([#2093], [#2256]) - * Added pumactl `thread-backtraces` command to print thread backtraces ([#2054]) - * Added incrementing `requests_count` to `Puma.stats`. ([#2106]) - * Increased maximum URI path length from 2048 to 8192 bytes ([#2167], [#2344]) - * `lowlevel_error_handler` is now called during a forced threadpool shutdown, and if a callable with 3 arguments is set, we now also pass the status code ([#2203]) - * Faster phased restart and worker timeout ([#2220]) - * Added `state_permission` to config DSL to set state file permissions ([#2238]) - * Added `Puma.stats_hash`, which returns a stats in Hash instead of a JSON string ([#2086], [#2253]) - * `rack.multithread` and `rack.multiprocess` now dynamically resolved by `max_thread` and `workers` respectively ([#2288]) - -* Deprecations, Removals and Breaking API Changes - * `--control` has been removed. Use `--control-url` ([#1487]) - * `worker_directory` has been removed. Use `directory`. - * min_threads now set by environment variables PUMA_MIN_THREADS and MIN_THREADS. ([#2143]) - * max_threads now set by environment variables PUMA_MAX_THREADS and MAX_THREADS. ([#2143]) - * max_threads default to 5 in MRI or 16 for all other interpreters. ([#2143]) - * `preload_app!` is on by default if number of workers > 1 and set via `WEB_CONCURRENCY` ([#2143]) - * Puma::Plugin.workers_supported? has been removed. Use Puma.forkable? instead. ([#2143]) - * `tcp_mode` has been removed without replacement. ([#2169]) - * Daemonization has been removed without replacement. ([#2170]) - * Changed #connected_port to #connected_ports ([#2076]) - * Configuration: `environment` is read from `RAILS_ENV`, if `RACK_ENV` can't be found ([#2022]) - * Log binding on http:// for TCP bindings to make it clickable ([#2300]) - -* Bugfixes - * Fix JSON loading issues on phased-restarts ([#2269]) - * Improve shutdown reliability ([#2312], [#2338]) - * Close client http connections made to an ssl server with TLSv1.3 ([#2116]) - * Do not set user_config to quiet by default to allow for file config ([#2074]) - * Always close SSL connection in Puma::ControlCLI ([#2211]) - * Windows update extconf.rb for use with ssp and varied Ruby/MSYS2 combinations ([#2069]) - * Ensure control server Unix socket is closed on shutdown ([#2112]) - * Preserve `BUNDLE_GEMFILE` env var when using `prune_bundler` ([#1893]) - * Send 408 request timeout even when queue requests is disabled ([#2119]) - * Rescue IO::WaitReadable instead of EAGAIN for blocking read ([#2121]) - * Ensure `BUNDLE_GEMFILE` is unspecified in workers if unspecified in master when using `prune_bundler` ([#2154]) - * Rescue and log exceptions in hooks defined by users (on_worker_boot, after_worker_fork etc) ([#1551]) - * Read directly from the socket in #read_and_drop to avoid raising further SSL errors ([#2198]) - * Set `Connection: closed` header when queue requests is disabled ([#2216]) - * Pass queued requests to thread pool on server shutdown ([#2122]) - * Fixed a few minor concurrency bugs in ThreadPool that may have affected non-GVL Rubies ([#2220]) - * Fix `out_of_band` hook never executed if the number of worker threads is > 1 ([#2177]) - * Fix ThreadPool#shutdown timeout accuracy ([#2221]) - * Fix `UserFileDefaultOptions#fetch` to properly use `default` ([#2233]) - * Improvements to `out_of_band` hook ([#2234]) - * Prefer the rackup file specified by the CLI ([#2225]) - * Fix for spawning subprocesses with fork_worker option ([#2267]) - * Set `CONTENT_LENGTH` for chunked requests ([#2287]) - * JRuby - Add Puma::MiniSSL::Engine#init? and #teardown methods, run all SSL tests ([#2317]) - * Improve shutdown reliability ([#2312]) - * Resolve issue with threadpool waiting counter decrement when thread is killed - * Constrain rake-compiler version to 0.9.4 to fix `ClassNotFound` exception when using MiniSSL with Java8. - * Fix recursive `prune_bundler` ([#2319]). - * Ensure that TCP_CORK is usable - * Fix corner case when request body is chunked ([#2326]) - * Fix filehandle leak in MiniSSL ([#2299]) - -* Refactor - * Remove unused loader argument from Plugin initializer ([#2095]) - * Simplify `Configuration.random_token` and remove insecure fallback ([#2102]) - * Simplify `Runner#start_control` URL parsing ([#2111]) - * Removed the IOBuffer extension and replaced with Ruby ([#1980]) - * Update `Rack::Handler::Puma.run` to use `**options` ([#2189]) - * ThreadPool concurrency refactoring ([#2220]) - * JSON parse cluster worker stats instead of regex ([#2124]) - * Support parallel tests in verbose progress reporting ([#2223]) - * Refactor error handling in server accept loop ([#2239]) - -## 4.3.12 / 2022-03-30 - -* Security - * Close several HTTP Request Smuggling exploits (CVE-2022-24790) - -## 4.3.11 / 2022-02-11 - -* Security - * Always close the response body (GHSA-rmj8-8hhh-gv5h) - -## 4.3.10 / 2021-10-12 - -* Bugfixes - * Allow UTF-8 in HTTP header values - -## 4.3.9 / 2021-10-12 - -* Security - * Do not allow LF as a line ending in a header (CVE-2021-41136) - -## 4.3.8 / 2021-05-11 - -* Security - * Close keepalive connections after the maximum number of fast inlined requests (CVE-2021-29509) ([#2625]) - -## 4.3.7 / 2020-11-30 - -* Bugfixes - * Backport set CONTENT_LENGTH for chunked requests (Originally: [#2287], backport: [#2496]) - -## 4.3.6 / 2020-09-05 - -* Bugfixes - * Explicitly include ctype.h to fix compilation warning and build error on macOS with Xcode 12 ([#2304]) - * Don't require json at boot ([#2269]) - -## 4.3.4/4.3.5 and 3.12.5/3.12.6 / 2020-05-22 - -Each patchlevel release contains a separate security fix. We recommend simply upgrading to 4.3.5/3.12.6. - -* Security - * Fix: Fixed two separate HTTP smuggling vulnerabilities that used the Transfer-Encoding header. CVE-2020-11076 and CVE-2020-11077. - -## 4.3.3 and 3.12.4 / 2020-02-28 - -* Bugfixes - * Fix: Fixes a problem where we weren't splitting headers correctly on newlines ([#2132]) -* Security - * Fix: Prevent HTTP Response splitting via CR in early hints. CVE-2020-5249. - -## 4.3.2 and 3.12.3 / 2020-02-27 (YANKED) - -* Security - * Fix: Prevent HTTP Response splitting via CR/LF in header values. CVE-2020-5247. - -## 4.3.1 and 3.12.2 / 2019-12-05 - -* Security - * Fix: a poorly-behaved client could use keepalive requests to monopolize Puma's reactor and create a denial of service attack. CVE-2019-16770. - -## 4.3.0 / 2019-11-07 - -* Features - * Strip whitespace at end of HTTP headers ([#2010]) - * Optimize HTTP parser for JRuby ([#2012]) - * Add SSL support for the control app and cli ([#2046], [#2052]) - -* Bugfixes - * Fix Errno::EINVAL when SSL is enabled and browser rejects cert ([#1564]) - * Fix pumactl defaulting puma to development if an environment was not specified ([#2035]) - * Fix closing file stream when reading pid from pidfile ([#2048]) - * Fix a typo in configuration option `--extra_runtime_dependencies` ([#2050]) - -## 4.2.1 / 2019-10-07 - -* 3 bugfixes - * Fix socket activation of systemd (pre-existing) unix binder files ([#1842], [#1988]) - * Deal with multiple calls to bind correctly ([#1986], [#1994], [#2006]) - * Accepts symbols for `verify_mode` ([#1222]) - -## 4.2.0 / 2019-09-23 - -* 6 features - * Pumactl has a new -e environment option and reads `config/puma/.rb` config files ([#1885]) - * Semicolons are now allowed in URL paths (MRI only), useful for Angular or Redmine ([#1934]) - * Allow extra dependencies to be defined when using prune_bundler ([#1105]) - * Puma now reports the correct port when binding to port 0, also reports other listeners when binding to localhost ([#1786]) - * Sending SIGINFO to any Puma worker now prints currently active threads and their backtraces ([#1320]) - * Puma threads all now have their name set on Ruby 2.3+ ([#1968]) -* 4 bugfixes - * Fix some misbehavior with phased restart and externally SIGTERMed workers ([#1908], [#1952]) - * Fix socket closing on error ([#1941]) - * Removed unnecessary SIGINT trap for JRuby that caused some race conditions ([#1961]) - * Fix socket files being left around after process stopped ([#1970]) -* Absolutely thousands of lines of test improvements and fixes thanks to @MSP-Greg - -## 4.1.1 / 2019-09-05 - -* 3 bugfixes - * Revert our attempt to not dup STDOUT/STDERR ([#1946]) - * Fix socket close on error ([#1941]) - * Fix workers not shutting down correctly ([#1908]) - -## 4.1.0 / 2019-08-08 - -* 4 features - * Add REQUEST_PATH on parse error message ([#1831]) - * You can now easily add custom log formatters with the `log_formatter` config option ([#1816]) - * Puma.stats now provides process start times ([#1844]) - * Add support for disabling TLSv1.1 ([#1836]) - -* 7 bugfixes - * Fix issue where Puma was creating zombie process entries ([#1887]) - * Fix bugs with line-endings and chunked encoding ([#1812]) - * RACK_URL_SCHEME is now set correctly in all conditions ([#1491]) - * We no longer mutate global STDOUT/STDERR, particularly the sync setting ([#1837]) - * SSL read_nonblock no longer blocks ([#1857]) - * Swallow connection errors when sending early hints ([#1822]) - * Backtrace no longer dumped when invalid pumactl commands are run ([#1863]) - -* 5 other - * Avoid casting worker_timeout twice ([#1838]) - * Removed a call to private that wasn't doing anything ([#1882]) - * README, Rakefile, docs and test cleanups ([#1848], [#1847], [#1846], [#1853], #1859, [#1850], [#1866], [#1870], [#1872], [#1833], [#1888]) - * Puma.io has proper documentation now (https://puma.io/puma/) - * Added the Contributor Covenant CoC - -* 1 known issue - * Some users are still experiencing issues surrounding socket activation and Unix sockets ([#1842]) - -## 4.0.1 / 2019-07-11 - -* 2 bugfixes - * Fix socket removed after reload - should fix problems with systemd socket activation. ([#1829]) - * Add extconf tests for DTLS_method & TLS_server_method, use in minissl.rb. Should fix "undefined symbol: DTLS_method" when compiling against old OpenSSL versions. ([#1832]) -* 1 other - * Removed unnecessary RUBY_VERSION checks. ([#1827]) - -## 4.0.0 / 2019-06-25 - -* 9 features - * Add support for disabling TLSv1.0 ([#1562]) - * Request body read time metric ([#1569]) - * Add out_of_band hook ([#1648]) - * Re-implement (native) IOBuffer for JRuby ([#1691]) - * Min worker timeout ([#1716]) - * Add option to suppress SignalException on SIGTERM ([#1690]) - * Allow mutual TLS CA to be set using `ssl_bind` DSL ([#1689]) - * Reactor now uses nio4r instead of `select` ([#1728]) - * Add status to pumactl with pidfile ([#1824]) - -* 10 bugfixes - * Do not accept new requests on shutdown ([#1685], [#1808]) - * Fix 3 corner cases when request body is chunked ([#1508]) - * Change pid existence check's condition branches ([#1650]) - * Don't call .stop on a server that doesn't exist ([#1655]) - * Implemented NID_X9_62_prime256v1 (P-256) curve over P-521 ([#1671]) - * Fix @notify.close can't modify frozen IOError (RuntimeError) ([#1583]) - * Fix Java 8 support ([#1773]) - * Fix error `uninitialized constant Puma::Cluster` ([#1731]) - * Fix `not_token` being able to be set to true ([#1803]) - * Fix "Hang on SIGTERM with ruby 2.6 in cluster mode" (PR [#1741], [#1674], [#1720], [#1730], [#1755]) - -## 3.12.1 / 2019-03-19 - -* 1 features - * Internal strings are frozen ([#1649]) -* 3 bugfixes - * Fix chunked ending check ([#1607]) - * Rack handler should use provided default host ([#1700]) - * Better support for detecting runtimes that support `fork` ([#1630]) - -## 3.12.0 / 2018-07-13 - -* 5 features: - * You can now specify which SSL ciphers the server should support, default is unchanged ([#1478]) - * The setting for Puma's `max_threads` is now in `Puma.stats` ([#1604]) - * Pool capacity is now in `Puma.stats` ([#1579]) - * Installs restricted to Ruby 2.2+ ([#1506]) - * `--control` is now deprecated in favor of `--control-url` ([#1487]) - -* 2 bugfixes: - * Workers will no longer accept more web requests than they have capacity to process. This prevents an issue where one worker would accept lots of requests while starving other workers ([#1563]) - * In a test env puma now emits the stack on an exception ([#1557]) - -## 3.11.4 / 2018-04-12 - -* 2 features: - * Manage puma as a service using rc.d ([#1529]) - * Server stats are now available from a top level method ([#1532]) -* 5 bugfixes: - * Fix parsing CLI options ([#1482]) - * Order of stderr and stdout is made before redirecting to a log file ([#1511]) - * Init.d fix of `ps -p` to check if pid exists ([#1545]) - * Early hints bugfix ([#1550]) - * Purge interrupt queue when closing socket fails ([#1553]) - -## 3.11.3 / 2018-03-05 - -* 3 bugfixes: - * Add closed? to MiniSSL::Socket for use in reactor ([#1510]) - * Handle EOFError at the toplevel of the server threads ([#1524]) ([#1507]) - * Deal with zero sized bodies when using SSL ([#1483]) - -## 3.11.2 / 2018-01-19 - -* 1 bugfix: - * Deal with read\_nonblock returning nil early - -## 3.11.1 / 2018-01-18 - -* 1 bugfix: - * Handle read\_nonblock returning nil when the socket close ([#1502]) - -## 3.11.0 / 2017-11-20 - -* 2 features: - * HTTP 103 Early Hints ([#1403]) - * 421/451 status codes now have correct status messages attached ([#1435]) - -* 9 bugfixes: - * Environment config files (/config/puma/.rb) load correctly ([#1340]) - * Specify windows dependencies correctly ([#1434], [#1436]) - * puma/events required in test helper ([#1418]) - * Correct control CLI's option help text ([#1416]) - * Remove a warning for unused variable in mini_ssl ([#1409]) - * Correct pumactl docs argument ordering ([#1427]) - * Fix an uninitialized variable warning in server.rb ([#1430]) - * Fix docs typo/error in Launcher init ([#1429]) - * Deal with leading spaces in RUBYOPT ([#1455]) - -* 2 other: - * Add docs about internals ([#1425], [#1452]) - * Tons of test fixes from @MSP-Greg ([#1439], [#1442], [#1464]) - -## 3.10.0 / 2017-08-17 - -* 3 features: - * The status server has a new /gc and /gc-status command. ([#1384]) - * The persistent and first data timeouts are now configurable ([#1111]) - * Implemented RFC 2324 ([#1392]) - -* 12 bugfixes: - * Not really a Puma bug, but @NickolasVashchenko created a gem to workaround a Ruby bug that some users of Puma may be experiencing. See README for more. ([#1347]) - * Fix hangups with SSL and persistent connections. ([#1334]) - * Fix Rails double-binding to a port ([#1383]) - * Fix incorrect thread names ([#1368]) - * Fix issues with /etc/hosts and JRuby where localhost addresses were not correct. ([#1318]) - * Fix compatibility with RUBYOPT="--enable-frozen-string-literal" ([#1376]) - * Fixed some compiler warnings ([#1388]) - * We actually run the integration tests in CI now ([#1390]) - * No longer shipping unnecessary directories in the gemfile ([#1391]) - * If RUBYOPT is nil, we no longer blow up on restart. ([#1385]) - * Correct response to SIGINT ([#1377]) - * Proper exit code returned when we receive a TERM signal ([#1337]) - -* 3 refactors: - * Various test improvements from @grosser - * Rubocop ([#1325]) - * Hoe has been removed ([#1395]) - -* 1 known issue: - * Socket activation doesn't work in JRuby. Their fault, not ours. ([#1367]) - -## 3.9.1 / 2017-06-03 - -* 2 bugfixes: - * Fixed compatibility with older Bundler versions ([#1314]) - * Some internal test/development cleanup ([#1311], [#1313]) - -## 3.9.0 / 2017-06-01 - -* 2 features: - * The ENV is now reset to its original values when Puma restarts via USR1/USR2 ([#1260]) (MRI only, no JRuby support) - * Puma will no longer accept more clients than the maximum number of threads. ([#1278]) - -* 9 bugfixes: - * Reduce information leakage by preventing HTTP parse errors from writing environment hashes to STDERR ([#1306]) - * Fix SSL/WebSocket compatibility ([#1274]) - * HTTP headers with empty values are no longer omitted from responses. ([#1261]) - * Fix a Rack env key which was set to nil. ([#1259]) - * peercert has been implemented for JRuby ([#1248]) - * Fix port settings when using rails s ([#1277], [#1290]) - * Fix compat w/LibreSSL ([#1285]) - * Fix restarting Puma w/symlinks and a new Gemfile ([#1282]) - * Replace Dir.exists? with Dir.exist? ([#1294]) - -* 1 known issue: - * A bug in MRI 2.2+ can result in IOError: stream closed. See [#1206]. This issue has existed since at least Puma 3.6, and probably further back. - -* 1 refactor: - * Lots of test fixups from @grosser. - -## 3.8.2 / 2017-03-14 - -* 1 bugfix: - * Deal with getsockopt with TCP\_INFO failing for sockets that say they're TCP but aren't really. ([#1241]) - -## 3.8.1 / 2017-03-10 - -* 1 bugfix: - * Remove method call to method that no longer exists ([#1239]) - -## 3.8.0 / 2017-03-09 - -* 2 bugfixes: - * Port from rack handler does not take precedence over config file in Rails 5.1.0.beta2+ and 5.0.1.rc3+ ([#1234]) - * The `tmp/restart.txt` plugin no longer restricts the user from running more than one server from the same folder at a time ([#1226]) - -* 1 feature: - * Closed clients are aborted to save capacity ([#1227]) - -* 1 refactor: - * Bundler is no longer a dependency from tests ([#1213]) - -## 3.7.1 / 2017-02-20 - -* 2 bugfixes: - * Fix typo which blew up MiniSSL ([#1182]) - * Stop overriding command-line options with the config file ([#1203]) - -## 3.7.0 / 2017-01-04 - -* 6 minor features: - * Allow rack handler to accept ssl host. ([#1129]) - * Refactor TTOU processing. TTOU now handles multiple signals at once. ([#1165]) - * Pickup any remaining chunk data as the next request. - * Prevent short term thread churn - increased auto trim default to 30 seconds. - * Raise error when `stdout` or `stderr` is not writable. ([#1175]) - * Add Rack 2.0 support to gemspec. ([#1068]) - -* 5 refactors: - * Compare host and server name only once per call. ([#1091]) - * Minor refactor on Thread pool ([#1088]) - * Removed a ton of unused constants, variables and files. - * Use MRI macros when allocating heap memory - * Use hooks for on\_booted event. ([#1160]) - -* 14 bugfixes: - * Add eof? method to NullIO? ([#1169]) - * Fix Puma startup in provided init.d script ([#1061]) - * Fix default SSL mode back to none. ([#1036]) - * Fixed the issue of @listeners getting nil io ([#1120]) - * Make `get_dh1024` compatible with OpenSSL v1.1.0 ([#1178]) - * More gracefully deal with SSL sessions. Fixes [#1002] - * Move puma.rb to just autoloads. Fixes [#1063] - * MiniSSL: Provide write as <<. Fixes [#1089] - * Prune bundler should inherit fds ([#1114]) - * Replace use of Process.getpgid which does not behave as intended on all platforms ([#1110]) - * Transfer encoding header should be downcased before comparison ([#1135]) - * Use same write log logic for hijacked requests. ([#1081]) - * Fix `uninitialized constant Puma::StateFile` ([#1138]) - * Fix access priorities of each level in LeveledOptions ([#1118]) - -* 3 others: - - * Lots of tests added/fixed/improved. Switched to Minitest from Test::Unit. Big thanks to @frodsan. - * Lots of documentation added/improved. - * Add license indicators to the HTTP extension. ([#1075]) - -## 3.6.2 / 2016-11-22 - -* 1 bug fix: - - * Revert [#1118]/Fix access priorities of each level in LeveledOptions. This - had an unintentional side effect of changing the importance of command line - options, such as -p. - -## 3.6.1 / 2016-11-21 - -* 8 bug fixes: - - * Fix Puma start in init.d script. - * Fix default SSL mode back to none. Fixes [#1036] - * Fixed the issue of @listeners getting nil io, fix rails restart ([#1120]) - * More gracefully deal with SSL sessions. Fixes [#1002] - * Prevent short term thread churn. - * Provide write as <<. Fixes [#1089] - * Fix access priorities of each level in LeveledOptions - fixes TTIN. - * Stub description files updated for init.d. - -* 2 new project committers: - - * Nate Berkopec (@nateberkopec) - * Richard Schneeman (@schneems) - -## 3.6.0 / 2016-07-24 - -* 12 bug fixes: - * Add ability to detect a shutting down server. Fixes [#932] - * Add support for Expect: 100-continue. Fixes [#519] - * Check SSLContext better. Fixes [#828] - * Clarify behavior of '-t num'. Fixes [#984] - * Don't default to VERIFY_PEER. Fixes [#1028] - * Don't use ENV['PWD'] on windows. Fixes [#1023] - * Enlarge the scope of catching app exceptions. Fixes [#1027] - * Execute background hooks after daemonizing. Fixes [#925] - * Handle HUP as a stop unless there is IO redirection. Fixes [#911] - * Implement chunked request handling. Fixes [#620] - * Just rescue exception to return a 500. Fixes [#1027] - * Redirect IO in the jruby daemon mode. Fixes [#778] - -## 3.5.2 / 2016-07-20 - -* 1 bug fix: - * Don't let persistent_timeout be nil - -* 1 PR merged: - * Merge pull request [#1021] from benzrf/patch-1 - -## 3.5.1 / 2016-07-20 - -* 1 bug fix: - * Be sure to only listen on host:port combos once. Fixes [#1022] - -## 3.5.0 / 2016-07-18 - -* 1 minor features: - * Allow persistent_timeout to be configured via the dsl. - -* 9 bug fixes: - * Allow a bare % in a query string. Fixes [#958] - * Explicitly listen on all localhost addresses. Fixes [#782] - * Fix `TCPLogger` log error in tcp cluster mode. - * Fix puma/puma[#968] Cannot bind SSL port due to missing verify_mode option - * Fix puma/puma[#968] Default verify_mode to peer - * Log any exceptions in ThreadPool. Fixes [#1010] - * Silence connection errors in the reactor. Fixes [#959] - * Tiny fixes in hook documentation for [#840] - * It should not log requests if we want it to be quiet - -* 5 doc fixes: - * Add How to stop Puma on Heroku using plugins to the example directory - * Provide both hot and phased restart in jungle script - * Update reference to the instances management script - * Update default number of threads - * Fix typo in example config - -* 14 PRs merged: - * Merge pull request [#1007] from willnet/patch-1 - * Merge pull request [#1014] from jeznet/patch-1 - * Merge pull request [#1015] from bf4/patch-1 - * Merge pull request [#1017] from jorihardman/configurable_persistent_timeout - * Merge pull request [#954] from jf/master - * Merge pull request [#955] from jf/add-request-info-to-standard-error-rescue - * Merge pull request [#956] from maxkwallace/master - * Merge pull request [#960] from kmayer/kmayer-plugins-heroku-restart - * Merge pull request [#969] from frankwong15/master - * Merge pull request [#970] from willnet/delete-blank-document - * Merge pull request [#974] from rocketjob/feature/name_threads - * Merge pull request [#977] from snow/master - * Merge pull request [#981] from zach-chai/patch-1 - * Merge pull request [#993] from scorix/master - -## 3.4.0 / 2016-04-07 - -* 2 minor features: - * Add ability to force threads to stop on shutdown. Fixes [#938] - * Detect and commit seppuku when fork(2) fails. Fixes [#529] - -* 3 unknowns: - * Ignore errors trying to update the backport tables. Fixes [#788] - * Invoke the lowlevel_error in more places to allow for exception tracking. Fixes [#894] - * Update the query string when an absolute URI is used. Fixes [#937] - -* 5 doc fixes: - * Add Process Monitors section to top-level README - * Better document the hooks. Fixes [#840] - * docs/system.md sample config refinements and elaborations - * Fix typos at couple of places. - * Cleanup warnings - -* 3 PRs merged: - * Merge pull request [#945] from dekellum/systemd-docs-refined - * Merge pull request [#946] from vipulnsward/rm-pid - * Merge pull request [#947] from vipulnsward/housekeeping-typos - -## 3.3.0 / 2016-04-05 - -* 2 minor features: - * Allow overriding options of Configuration object - * Rename to inherit_ssl_listener like inherit_tcp|unix - -* 2 doc fixes: - * Add docs/systemd.md (with socket activation sub-section) - * Document UNIX signals with cluster on README.md - -* 3 PRs merged: - * Merge pull request [#936] from prathamesh-sonpatki/allow-overriding-config-options - * Merge pull request [#940] from kyledrake/signalsdoc - * Merge pull request [#942] from dekellum/socket-activate-improve - -## 3.2.0 / 2016-03-20 - -* 1 deprecation removal: - * Delete capistrano.rb - -* 3 bug fixes: - * Detect gems.rb as well as Gemfile - * Simplify and fix logic for directory to use when restarting for all phases - * Speed up phased-restart start - -* 2 PRs merged: - * Merge pull request [#927] from jlecour/gemfile_variants - * Merge pull request [#931] from joneslee85/patch-10 - -## 3.1.1 / 2016-03-17 - -* 4 bug fixes: - * Disable USR1 usage on JRuby - * Fixes [#922] - Correctly define file encoding as UTF-8 - * Set a more explicit SERVER_SOFTWARE Rack variable - * Show RUBY_ENGINE_VERSION if available. Fixes [#923] - -* 3 PRs merged: - * Merge pull request [#912] from tricknotes/fix-allow-failures-in-travis-yml - * Merge pull request [#921] from swrobel/patch-1 - * Merge pull request [#924] from tbrisker/patch-1 - -## 3.1.0 / 2016-03-05 - -* 1 minor feature: - * Add 'import' directive to config file. Fixes [#916] - -* 5 bug fixes: - * Add 'fetch' to options. Fixes [#913] - * Fix jruby daemonization. Fixes [#918] - * Recreate the proper args manually. Fixes [#910] - * Require 'time' to get iso8601. Fixes [#914] - -## 3.0.2 / 2016-02-26 - -* 5 bug fixes: - - * Fix 'undefined local variable or method `pid` for #' when execute pumactl with `--pid` option. - * Fix 'undefined method `windows?` for Puma:Module' when execute pumactl. - * Harden tmp_restart against errors related to the restart file - * Make `plugin :tmp_restart` behavior correct in Windows. - * fix uninitialized constant Puma::ControlCLI::StateFile - -* 3 PRs merged: - - * Merge pull request [#901] from mitto/fix-pumactl-uninitialized-constant-statefile - * Merge pull request [#902] from corrupt952/fix_undefined_method_and_variable_when_execute_pumactl - * Merge pull request [#905] from Eric-Guo/master - -## 3.0.1 / 2016-02-25 - -* 1 bug fix: - - * Removed the experimental support for async.callback as it broke - websockets entirely. Seems no server has both hijack and async.callback - and thus faye is totally confused what to do and doesn't work. - -## 3.0.0 / 2016-02-25 - -* 2 major changes: - - * Ruby pre-2.0 is no longer supported. We'll do our best to not add - features that break those rubies but will no longer be testing - with them. - * Don't log requests by default. Fixes [#852] - -* 2 major features: - - * Plugin support! Plugins can interact with configuration as well - as provide augment server functionality! - * Experimental env['async.callback'] support - -* 4 minor features: - - * Listen to unix socket with provided backlog if any - * Improves the cluster mode stats to report worker stats - * Pass the env to the lowlevel_error handler. Fixes [#854] - * Treat path-like hosts as unix sockets. Fixes [#824] - -* 5 bug fixes: - - * Clean thread locals when using keepalive. Fixes [#823] - * Cleanup compiler warnings. Fixes [#815] - * Expose closed? for use by the reactor. Fixes [#835] - * Move signal handlers to separate method to prevent space leak. Fixes [#798] - * Signal not full on worker exit [#876] - -* 5 doc fixes: - - * Update README.md with various grammar fixes - * Use newest version of Minitest - * Add directory configuration docs, fix typo [ci skip] - * Remove old COPYING notice. Fixes [#849] - -* 10 merged PRs: - - * Merge pull request [#871] from deepj/travis - * Merge pull request [#874] from wallclockbuilder/master - * Merge pull request [#883] from dadah89/igor/trim_only_worker - * Merge pull request [#884] from uistudio/async-callback - * Merge pull request [#888] from mlarraz/tick_minitest - * Merge pull request [#890] from todd/directory_docs - * Merge pull request [#891] from ctaintor/improve_clustered_status - * Merge pull request [#893] from spastorino/add_missing_require - * Merge pull request [#897] from zendesk/master - * Merge pull request [#899] from kch/kch-readme-fixes - -## 2.16.0 / 2016-01-27 - -* 7 minor features: - - * Add 'set_remote_address' config option - * Allow to run puma in silent mode - * Expose cli options in DSL - * Support passing JRuby keystore info in ssl_bind DSL - * Allow umask for unix:/// style control urls - * Expose `old_worker_count` in stats url - * Support TLS client auth (verify_mode) in jruby - -* 7 bug fixes: - - * Don't persist before_fork hook in state file - * Reload bundler before pulling in rack. Fixes [#859] - * Remove NEWRELIC_DISPATCHER env variable - * Cleanup C code - * Use Timeout.timeout instead of Object.timeout - * Make phased restarts faster - * Ignore the case of certain headers, because HTTP - -* 1 doc changes: - - * Test against the latest Ruby 2.1, 2.2, 2.3, head and JRuby 9.0.4.0 on Travis - -* 12 merged PRs - * Merge pull request [#822] from kwugirl/remove_NEWRELIC_DISPATCHER - * Merge pull request [#833] from joemiller/jruby-client-tls-auth - * Merge pull request [#837] from YuriSolovyov/ssl-keystore-jruby - * Merge pull request [#839] from mezuka/master - * Merge pull request [#845] from deepj/timeout-deprecation - * Merge pull request [#846] from sriedel/strip_before_fork - * Merge pull request [#850] from deepj/travis - * Merge pull request [#853] from Jeffrey6052/patch-1 - * Merge pull request [#857] from zendesk/faster_phased_restarts - * Merge pull request [#858] from mlarraz/fix_some_warnings - * Merge pull request [#860] from zendesk/expose_old_worker_count - * Merge pull request [#861] from zendesk/allow_control_url_umask - -## 2.15.3 / 2015-11-07 - -* 1 bug fix: - - * Fix JRuby parser - -## 2.15.2 / 2015-11-06 - -* 2 bug fixes: - * ext/puma_http11: handle duplicate headers as per RFC - * Only set ctx.ca iff there is a params['ca'] to set with. - -* 2 PRs merged: - * Merge pull request [#818] from unleashed/support-duplicate-headers - * Merge pull request [#819] from VictorLowther/fix-ca-and-verify_null-exception - -## 2.15.1 / 2015-11-06 - -* 1 bug fix: - - * Allow older openssl versions - -## 2.15.0 / 2015-11-06 - -* 6 minor features: - * Allow setting ca without setting a verify mode - * Make jungle for init.d support rbenv - * Use SSL_CTX_use_certificate_chain_file for full chain - * cluster: add worker_boot_timeout option - * configuration: allow empty tags to mean no tag desired - * puma/cli: support specifying STD{OUT,ERR} redirections and append mode - -* 5 bug fixes: - * Disable SSL Compression - * Fix bug setting worker_directory when using a symlink directory - * Fix error message in DSL that was slightly inaccurate - * Pumactl: set correct process name. Fixes [#563] - * thread_pool: fix race condition when shutting down workers - -* 10 doc fixes: - * Add before_fork explanation in Readme.md - * Correct spelling in DEPLOYMENT.md - * Correct spelling in docs/nginx.md - * Fix spelling errors. - * Fix typo in deployment description - * Fix typos (it's -> its) in events.rb and server.rb - * fixing for typo mentioned in [#803] - * Spelling correction for README - * thread_pool: fix typos in comment - * More explicit docs for worker_timeout - -* 18 PRs merged: - * Merge pull request [#768] from nathansamson/patch-1 - * Merge pull request [#773] from rossta/spelling_corrections - * Merge pull request [#774] from snow/master - * Merge pull request [#781] from sunsations/fix-typo - * Merge pull request [#791] from unleashed/allow_empty_tags - * Merge pull request [#793] from robdimarco/fix-working-directory-symlink-bug - * Merge pull request [#794] from peterkeen/patch-1 - * Merge pull request [#795] from unleashed/redirects-from-cmdline - * Merge pull request [#796] from cschneid/fix_dsl_message - * Merge pull request [#799] from annafw/master - * Merge pull request [#800] from liamseanbrady/fix_typo - * Merge pull request [#801] from scottjg/ssl-chain-file - * Merge pull request [#802] from scottjg/ssl-crimes - * Merge pull request [#804] from burningTyger/patch-2 - * Merge pull request [#809] from unleashed/threadpool-fix-race-in-shutdown - * Merge pull request [#810] from vlmonk/fix-pumactl-restart-bug - * Merge pull request [#814] from schneems/schneems/worker_timeout-docs - * Merge pull request [#817] from unleashed/worker-boot-timeout - -## 2.14.0 / 2015-09-18 - -* 1 minor feature: - * Make building with SSL support optional - -* 1 bug fix: - * Use Rack::Builder if available. Fixes [#735] - -## 2.13.4 / 2015-08-16 - -* 1 bug fix: - * Use the environment possible set by the config early and from - the config file later (if set). - -## 2.13.3 / 2015-08-15 - -Seriously, I need to revamp config with tests. - -* 1 bug fix: - * Fix preserving options before cleaning for state. Fixes [#769] - -## 2.13.2 / 2015-08-15 - -The "clearly I don't have enough tests for the config" release. - -* 1 bug fix: - * Fix another place binds wasn't initialized. Fixes [#767] - -## 2.13.1 / 2015-08-15 - -* 2 bug fixes: - * Fix binds being masked in config files. Fixes [#765] - * Use options from the config file properly in pumactl. Fixes [#764] - -## 2.13.0 / 2015-08-14 - -* 1 minor feature: - * Add before_fork hooks option. - -* 3 bug fixes: - * Check for OPENSSL_NO_ECDH before using ECDH - * Eliminate logging overhead from JRuby SSL - * Prefer cli options over config file ones. Fixes [#669] - -* 1 deprecation: - * Add deprecation warning to capistrano.rb. Fixes [#673] - -* 4 PRs merged: - * Merge pull request [#668] from kcollignon/patch-1 - * Merge pull request [#754] from nathansamson/before_boot - * Merge pull request [#759] from BenV/fix-centos6-build - * Merge pull request [#761] from looker/no-log - -## 2.12.3 / 2015-08-03 - -* 8 minor bugs fixed: - * Fix Capistrano 'uninitialized constant Puma' error. - * Fix some ancient and incorrect error handling code - * Fix uninitialized constant error - * Remove toplevel rack interspection, require rack on load instead - * Skip empty parts when chunking - * Switch from inject to each in config_ru_binds iteration - * Wrap SSLv3 spec in version guard. - * ruby 1.8.7 compatibility patches - -* 4 PRs merged: - * Merge pull request [#742] from deivid-rodriguez/fix_missing_require - * Merge pull request [#743] from matthewd/skip-empty-chunks - * Merge pull request [#749] from huacnlee/fix-cap-uninitialized-puma-error - * Merge pull request [#751] from costi/compat_1_8_7 - -* 1 test fix: - * Add 1.8.7, rbx-1 (allow failures) to Travis. - -## 2.12.2 / 2015-07-17 - -* 2 bug fix: - * Pull over and use Rack::URLMap. Fixes [#741] - * Stub out peercert on JRuby for now. Fixes [#739] - -## 2.12.1 / 2015-07-16 - -* 2 bug fixes: - * Use a constant format. Fixes [#737] - * Use strerror for Windows sake. Fixes [#733] - -* 1 doc change: - * typo fix: occured -> occurred - -* 1 PR merged: - * Merge pull request [#736] from paulanunda/paulanunda/typo-fix - -## 2.12.0 / 2015-07-14 - -* 13 bug fixes: - * Add thread reaping to thread pool - * Do not automatically use chunked responses when hijacked - * Do not suppress Content-Length on partial hijack - * Don't allow any exceptions to terminate a thread - * Handle ENOTCONN client disconnects when setting REMOTE_ADDR - * Handle very early exit of cluster mode. Fixes [#722] - * Install rack when running tests on travis to use rack/lint - * Make puma -v and -h return success exit code - * Make pumactl load config/puma.rb by default - * Pass options from pumactl properly when pruning. Fixes [#694] - * Remove rack dependency. Fixes [#705] - * Remove the default Content-Type: text/plain - * Add Client Side Certificate Auth - -* 8 doc/test changes: - * Added example sourcing of environment vars - * Added tests for bind configuration on rackup file - * Fix example config text - * Update DEPLOYMENT.md - * Update Readme with example of custom error handler - * ci: Improve Travis settings - * ci: Start running tests against JRuby 9k on Travis - * ci: Convert to container infrastructure for travisci - -* 2 ops changes: - * Check for system-wide rbenv - * capistrano: Add additional env when start rails - -* 16 PRs merged: - * Merge pull request [#686] from jjb/patch-2 - * Merge pull request [#693] from rob-murray/update-example-config - * Merge pull request [#697] from spk/tests-bind-on-rackup-file - * Merge pull request [#699] from deees/fix/require_rack_builder - * Merge pull request [#701] from deepj/master - * Merge pull request [#702] from Jimdo/thread-reaping - * Merge pull request [#703] from deepj/travis - * Merge pull request [#704] from grega/master - * Merge pull request [#709] from lian/master - * Merge pull request [#711] from julik/master - * Merge pull request [#712] from yakara-ltd/pumactl-default-config - * Merge pull request [#715] from RobotJiang/master - * Merge pull request [#725] from rwz/master - * Merge pull request [#726] from strenuus/handle-client-disconnect - * Merge pull request [#729] from allaire/patch-1 - * Merge pull request [#730] from iamjarvo/container-infrastructure - -## 2.11.3 / 2015-05-18 - -* 5 bug fixes: - * Be sure to unlink tempfiles after a request. Fixes [#690] - * Coerce the key to a string before checking. (thar be symbols). Fixes [#684] - * Fix hang on bad SSL handshake - * Remove `enable_SSLv3` support from JRuby - -* 1 PR merged: - * Merge pull request [#698] from looker/hang-handshake - -## 2.11.2 / 2015-04-11 - -* 2 minor features: - * Add `on_worker_fork` hook, which allows to mimic Unicorn's behavior - * Add shutdown_debug config option - -* 4 bug fixes: - * Fix the Config constants not being available in the DSL. Fixes [#683] - * Ignore multiple port declarations - * Proper 'Connection' header handling compatible with HTTP 1.[01] protocols - * Use "Puma" instead of "puma" to reporting to New Relic - -* 1 doc fixes: - * Add Gitter badge. - -* 6 PRs merged: - * Merge pull request [#657] from schneems/schneems/puma-once-port - * Merge pull request [#658] from Tomohiro/newrelic-dispatcher-default-update - * Merge pull request [#662] from basecrm/connection-compatibility - * Merge pull request [#664] from fxposter/on-worker-fork - * Merge pull request [#667] from JuanitoFatas/doc/gemspec - * Merge pull request [#672] from chulkilee/refactor - -## 2.11.1 / 2015-02-11 - -* 2 bug fixes: - * Avoid crash in strange restart conditions - * Inject the GEM_HOME that bundler into puma-wild's env. Fixes [#653] - -* 2 PRs merged: - * Merge pull request [#644] from bpaquet/master - * Merge pull request [#646] from mkonecny/master - -## 2.11.0 / 2015-01-20 - -* 9 bug fixes: - * Add mode as an additional bind option to unix sockets. Fixes [#630] - * Advertise HTTPS properly after a hot restart - * Don't write lowlevel_error_handler to state - * Fix phased restart with stuck requests - * Handle spaces in the path properly. Fixes [#622] - * Set a default REMOTE_ADDR to avoid using peeraddr on unix sockets. Fixes [#583] - * Skip device number checking on jruby. Fixes [#586] - * Update extconf.rb to compile correctly on OS X - * redirect io right after daemonizing so startup errors are shown. Fixes [#359] - -* 6 minor features: - * Add a configuration option that prevents puma from queueing requests. - * Add reload_worker_directory - * Add the ability to pass environment variables to the init script (for Jungle). - * Add the proctitle tag to the worker. Fixes [#633] - * Infer a proctitle tag based on the directory - * Update lowlevel error message to be more meaningful. - -* 10 PRs merged: - * Merge pull request [#478] from rubencaro/master - * Merge pull request [#610] from kwilczynski/master - * Merge pull request [#611] from jasonl/better-lowlevel-message - * Merge pull request [#616] from jc00ke/master - * Merge pull request [#623] from raldred/patch-1 - * Merge pull request [#628] from rdpoor/master - * Merge pull request [#634] from deepj/master - * Merge pull request [#637] from raskhadafi/patch-1 - * Merge pull request [#639] from ebeigarts/fix-phased-restarts - * Merge pull request [#640] from codehotter/issue-612-dependent-requests-deadlock - -## 2.10.2 / 2014-11-26 - -* 1 bug fix: - * Conditionalize thread local cleaning, fixes perf degradation fix - The code to clean out all Thread locals adds pretty significant - overhead to a each request, so it has to be turned on explicitly - if a user needs it. - -## 2.10.1 / 2014-11-24 - -* 1 bug fix: - * Load the app after daemonizing because the app might start threads. - - This change means errors loading the app are now reported only in the redirected - stdout/stderr. - - If you're app has problems starting up, start it without daemon mode initially - to test. - -## 2.10.0 / 2014-11-23 - -* 3 minor features: - * Added on_worker_shutdown hook mechanism - * Allow binding to ipv6 addresses for ssl URIs - * Warn about any threads started during app preload - -* 5 bug fixes: - * Clean out a threads local data before doing work - * Disable SSLv3. Fixes [#591] - * First change the directory to use the correct Gemfile. - * Only use config.ru binds if specified. Fixes [#606] - * Strongish cipher suite with FS support for some browsers - -* 2 doc changes: - * Change umask examples to more permissive values - * fix typo in README.md - -* 9 Merged PRs: - * Merge pull request [#560] from raskhadafi/prune_bundler-bug - * Merge pull request [#566] from sheltond/master - * Merge pull request [#593] from andruby/patch-1 - * Merge pull request [#594] from hassox/thread-cleanliness - * Merge pull request [#596] from burningTyger/patch-1 - * Merge pull request [#601] from sorentwo/friendly-umask - * Merge pull request [#602] from 1334/patch-1 - * Merge pull request [#608] from Gu1/master - * Merge pull request [#538] from memiux/? - -## 2.9.2 / 2014-10-25 - -* 8 bug fixes: - * Fix puma-wild handling a restart properly. Fixes [#550] - * JRuby SSL POODLE update - * Keep deprecated features warnings - * Log the current time when Puma shuts down. - * Fix cross-platform extension library detection - * Use the correct Windows names for OpenSSL. - * Better error logging during startup - * Fixing sexist error messages - -* 6 PRs merged: - * Merge pull request [#549] from bsnape/log-shutdown-time - * Merge pull request [#553] from lowjoel/master - * Merge pull request [#568] from mariuz/patch-1 - * Merge pull request [#578] from danielbuechele/patch-1 - * Merge pull request [#581] from alexch/slightly-better-logging - * Merge pull request [#590] from looker/jruby_disable_sslv3 - -## 2.9.1 / 2014-09-05 - -* 4 bug fixes: - * Cleanup the SSL related structures properly, fixes memory leak - * Fix thread spawning edge case. - * Force a worker check after a worker boots, don't wait 5sec. Fixes [#574] - * Implement SIGHUP for logs reopening - -* 2 PRs merged: - * Merge pull request [#561] from theoldreader/sighup - * Merge pull request [#570] from havenwood/spawn-thread-edge-case - -## 2.9.0 / 2014-07-12 - -* 1 minor feature: - * Add SSL support for JRuby - -* 3 bug fixes: - * Typo BUNDLER_GEMFILE -> BUNDLE_GEMFILE - * Use fast_write because we can't trust syswrite - * pumactl - do not modify original ARGV - -* 4 doc fixes: - * BSD-3-Clause over BSD to avoid confusion - * Deploy doc: clarification of the GIL - * Fix typo in DEPLOYMENT.md - * Update README.md - -* 6 PRs merged: - * Merge pull request [#520] from misfo/patch-2 - * Merge pull request [#530] from looker/jruby-ssl - * Merge pull request [#537] from vlmonk/patch-1 - * Merge pull request [#540] from allaire/patch-1 - * Merge pull request [#544] from chulkilee/bsd-3-clause - * Merge pull request [#551] from jcxplorer/patch-1 - -## 2.8.2 / 2014-04-12 - -* 4 bug fixes: - * During upgrade, change directory in main process instead of workers. - * Close the client properly on error - * Capistrano: fallback from phased restart to start when not started - * Allow tag option in conf file - -* 4 doc fixes: - * Fix Puma daemon service README typo - * `preload_app!` instead of `preload_app` - * add preload_app and prune_bundler to example config - * allow changing of worker_timeout in config file - -* 11 PRs merged: - * Merge pull request [#487] from ckuttruff/master - * Merge pull request [#492] from ckuttruff/master - * Merge pull request [#493] from alepore/config_tag - * Merge pull request [#503] from mariuz/patch-1 - * Merge pull request [#505] from sammcj/patch-1 - * Merge pull request [#506] from FlavourSys/config_worker_timeout - * Merge pull request [#510] from momer/rescue-block-handle-servers-fix - * Merge pull request [#511] from macool/patch-1 - * Merge pull request [#514] from edogawaconan/refactor_env - * Merge pull request [#517] from misfo/patch-1 - * Merge pull request [#518] from LongMan/master - -## 2.8.1 / 2014-03-06 - -* 1 bug fixes: - * Run puma-wild with proper deps for prune_bundler - -* 2 doc changes: - * Described the configuration file finding behavior added in 2.8.0 and how to disable it. - * Start the deployment doc - -* 6 PRs merged: - * Merge pull request [#471] from arthurnn/fix_test - * Merge pull request [#485] from joneslee85/patch-9 - * Merge pull request [#486] from joshwlewis/patch-1 - * Merge pull request [#490] from tobinibot/patch-1 - * Merge pull request [#491] from brianknight10/clarify-no-config - -## 2.8.0 / 2014-02-28 - -* 8 minor features: - * Add ability to autoload a config file. Fixes [#438] - * Add ability to detect and terminate hung workers. Fixes [#333] - * Add booted_workers to stats response - * Add config to customize the default error message - * Add prune_bundler option - * Add worker indexes, expose them via on_worker_boot. Fixes [#440] - * Add pretty process name - * Show the ruby version in use - -* 7 bug fixes: - * Added 408 status on timeout. - * Be more hostile with sockets that write block. Fixes [#449] - * Expect at_exit to exclusively remove the pidfile. Fixes [#444] - * Expose latency and listen backlog via bind query. Fixes [#370] - * JRuby raises IOError if the socket is there. Fixes [#377] - * Process requests fairly. Fixes [#406] - * Rescue SystemCallError as well. Fixes [#425] - -* 4 doc changes: - * Add 2.1.0 to the matrix - * Add Code Climate badge to README - * Create signals.md - * Set the license to BSD. Fixes [#432] - -* 14 PRs merged: - * Merge pull request [#428] from alexeyfrank/capistrano_default_hooks - * Merge pull request [#429] from namusyaka/revert-const_defined - * Merge pull request [#431] from mrb/master - * Merge pull request [#433] from alepore/process-name - * Merge pull request [#437] from ibrahima/master - * Merge pull request [#446] from sudara/master - * Merge pull request [#451] from pwiebe/status_408 - * Merge pull request [#453] from joevandyk/patch-1 - * Merge pull request [#470] from arthurnn/fix_458 - * Merge pull request [#472] from rubencaro/master - * Merge pull request [#480] from jjb/docs-on-running-test-suite - * Merge pull request [#481] from schneems/master - * Merge pull request [#482] from prathamesh-sonpatki/signals-doc-cleanup - * Merge pull request [#483] from YotpoLtd/master - -## 2.7.1 / 2013-12-05 - -* 1 bug fix: - * Keep STDOUT/STDERR the right mode. Fixes [#422] - -## 2.7.0 / 2013-12-03 - -* 1 minor feature: - * Adding TTIN and TTOU to increment/decrement workers - -* N bug fixes: - * Always use our Process.daemon because it's not busted - * Add capistrano restart failback to start. - * Change position of `cd` so that rvm gemset is loaded - * Clarify some platform specifics - * Do not close the pipe sockets when retrying - * Fix String#byteslice for Ruby 1.9.1, 1.9.2 - * Fix compatibility with 1.8.7. - * Handle IOError closed stream in IO.select - * Increase the max URI path length to 2048 chars from 1024 chars - * Upstart jungle use config/puma.rb instead - -## 2.6.0 / 2013-09-13 - -* 2 minor features: - * Add support for event hooks - ** Add a hook for state transitions - * Add phased restart to capistrano recipe. - -* 4 bug fixes: - * Convince workers to stop by SIGKILL after timeout - * Define RSTRING_NOT_MODIFIED for Rubinius performance - * Handle BrokenPipe, StandardError and IOError in fat_wrote and break out - * Return success status to the invoking environment - -## 2.5.1 / 2013-08-13 - -* 2 bug fixes: - * Keep jruby daemon mode from retrying on a hot restart - * Extract version from const.rb in gemspec - -## 2.5.0 / 2013-08-08 - -* 2 minor features: - * Allow configuring pumactl with config.rb - * make `pumactl restart` start puma if not running - -* 6 bug fixes: - * Autodetect ruby managers and home directory in upstart script - * Convert header values to string before sending. - * Correctly report phased-restart availability - * Fix pidfile creation/deletion race on jruby daemonization - * Use integers when comparing thread counts - * Fix typo in using lopez express (raw tcp) mode - -* 6 misc changes: - * Fix typo in phased-restart response - * Uncomment setuid/setgid by default in upstart - * Use Puma::Const::PUMA_VERSION in gemspec - * Update upstart comments to reflect new commandline - * Remove obsolete pumactl instructions; refer to pumactl for details - * Make Bundler used puma.gemspec version agnostic - -## 2.4.1 / 2013-08-07 - -* 1 experimental feature: - * Support raw tcp servers (aka Lopez Express mode) - -## 2.4.0 / 2013-07-22 - -* 5 minor features: - * Add PUMA_JRUBY_DAEMON_OPTS to get around agent starting twice - * Add ability to drain accept socket on shutdown - * Add port to DSL - * Adds support for using puma config file in capistrano deploys. - * Make phased_restart fallback to restart if not available - -* 10 bug fixes: - - * Be sure to only delete the pid in the master. Fixes [#334] - * Call out -C/--config flags - * Change parser symbol names to avoid clash. Fixes [#179] - * Convert thread pool sizes to integers - * Detect when the jruby daemon child doesn't start properly - * Fix typo in CLI help - * Improve the logging output when hijack is used. Fixes [#332] - * Remove unnecessary thread pool size conversions - * Setup :worker_boot as an Array. Fixes [#317] - * Use 127.0.0.1 as REMOTE_ADDR of unix client. Fixes [#309] - - -## 2.3.2 / 2013-07-08 - -* 1 bug fix: - * Move starting control server to after daemonization. - -## 2.3.1 / 2013-07-06 - -* 2 bug fixes: - * Include the right files in the Manifest. - * Disable inheriting connections on restart on windows. Fixes [#166] - -* 1 doc change: - * Better document some platform constraints - -## 2.3.0 / 2013-07-05 - -* 1 major bug fix: - * Stabilize control server, add support in cluster mode - -* 5 minor bug fixes: - * Add ability to cleanup stale unix sockets - * Check status data better. Fixes [#292] - * Convert raw IO errors to ConnectionError. Fixes [#274] - * Fix sending Content-Type and Content-Length for no body status. Fixes [#304] - * Pass state path through to `pumactl start`. Fixes [#287] - -* 2 internal changes: - * Refactored modes into seperate classes that CLI uses - * Changed CLI to take an Events object instead of stdout/stderr (API change) - -## 2.2.2 / 2013-07-02 - -* 1 bug fix: - * Fix restart_command in the config - -## 2.2.1 / 2013-07-02 - -* 1 minor feature: - * Introduce preload flag - -* 1 bug fix: - * Pass custom restart command in JRuby - -## 2.2.0 / 2013-07-01 - -* 1 major feature: - * Add ability to preload rack app - -* 2 minor bugfixes: - * Don't leak info when not in development. Fixes [#256] - * Load the app, then bind the ports - -## 2.1.1 / 2013-06-20 - -* 2 minor bug fixes: - - * Fix daemonization on jruby - * Load the application before daemonizing. Fixes [#285] - -## 2.1.0 / 2013-06-18 - -* 3 minor features: - * Allow listening socket to be configured via Capistrano variable - * Output results from 'stat's command when using pumactl - * Support systemd socket activation - -* 15 bug fixes: - * Deal with pipes closing while stopping. Fixes [#270] - * Error out early if there is no app configured - * Handle ConnectionError rather than the lowlevel exceptions - * tune with `-C` config file and `on_worker_boot` - * use `-w` - * Fixed some typos in upstart scripts - * Make sure to use bytesize instead of size (MiniSSL write) - * Fix an error in puma-manager.conf - * fix: stop leaking sockets on restart (affects ruby 1.9.3 or before) - * Ignore errors on the cross-thread pipe. Fixes [#246] - * Ignore errors while uncorking the socket (it might already be closed) - * Ignore the body on a HEAD request. Fixes [#278] - * Handle all engine data when possible. Fixes [#251]. - * Handle all read exceptions properly. Fixes [#252] - * Handle errors from the server better - -* 3 doc changes: - * Add note about on_worker_boot hook - * Add some documentation for Cluster mode - * Added quotes to /etc/puma.conf - -## 2.0.1 / 2013-04-30 - -* 1 bug fix: - * Fix not starting on JRuby properly - -## 2.0.0 / 2013-04-29 - -RailsConf 2013 edition! - -* 2 doc changes: - * Start with rackup -s Puma, NOT rackup -s puma. - * Minor doc fixes in the README.md, Capistrano section - -* 2 bug fixes: - * Fix reading RACK_ENV properly. Fixes [#234] - * Make cap recipe handle tmp/sockets; fixes [#228] - -* 3 minor changes: - * Fix capistrano recipe - * Fix stdout/stderr logs to sync outputs - * allow binding to IPv6 addresses - -## 2.0.0.b7 / 2013-03-18 - -* 5 minor enhancements: - * Add -q option for :start - * Add -V, --version - * Add default Rack handler helper - * Upstart support - * Set worker directory from configuration file - -* 12 bug fixes: - * Close the binder in the right place. Fixes [#192] - * Handle early term in workers. Fixes [#206] - * Make sure that the default port is 80 when the request doesn't include HTTP_X_FORWARDED_PROTO. - * Prevent Errno::EBADF errors on restart when running ruby 2.0 - * Record the proper @master_pid - * Respect the header HTTP_X_FORWARDED_PROTO when the host doesn't include a port number. - * Retry EAGAIN/EWOULDBLOCK during syswrite - * Run exec properly to restart. Fixes [#154] - * Set Rack run_once to false - * Syncronize all access to @timeouts. Fixes [#208] - * Write out the state post-daemonize. Fixes [#189] - * Prevent crash when all workers are gone - -## 2.0.0.b6 / 2013-02-06 - -* 2 minor enhancements: - * Add hook for running when a worker boots - * Advertise the Configuration object for apps to use. - -* 1 bug fix: - * Change directory in working during upgrade. Fixes [#185] - -## 2.0.0.b5 / 2013-02-05 - -* 2 major features: - * Add phased worker upgrade - * Add support for the rack hijack protocol - -* 2 minor features: - * Add -R to specify the restart command - * Add config file option to specify the restart command - -* 5 bug fixes: - * Cleanup pipes properly. Fixes [#182] - * Daemonize earlier so that we don't lose app threads. Fixes [#183] - * Drain the notification pipe. Fixes [#176], thanks @cryo28 - * Move write_pid to after we daemonize. Fixes [#180] - * Redirect IO properly and emit message for checkpointing - -## 2.0.0.b4 / 2012-12-12 - -* 4 bug fixes: - * Properly check #syswrite's value for variable sized buffers. Fixes [#170] - * Shutdown status server properly - * Handle char vs byte and mixing syswrite with write properly - * made MiniSSL validate key/cert file existence - -## 2.0.0.b3 / 2012-11-22 - -* 1 bug fix: - * Package right files in gem - -## 2.0.0.b2 / 2012-11-18 -* 5 minor feature: - * Now Puma is bundled with an capistrano recipe. Just require - 'puma/capistrano' in you deploy.rb - * Only inject CommonLogger in development mode - * Add -p option to pumactl - * Add ability to use pumactl to start a server - * Add options to daemonize puma - -* 7 bug fixes: - * Reset the IOBuffer properly. Fixes [#148] - * Shutdown gracefully on JRuby with Ctrl-C - * Various methods to get newrelic to start. Fixes [#128] - * fixing syntax error at capistrano recipe - * Force ECONNRESET when read returns nil - * Be sure to empty the drain the todo before shutting down. Fixes [#155] - * allow for alternate locations for status app - -## 2.0.0.b1 / 2012-09-11 - -* 1 major feature: - * Optional worker process mode (-w) to allow for process scaling in - addition to thread scaling - -* 1 bug fix: - * Introduce Puma::MiniSSL to be able to properly control doing - nonblocking SSL - -NOTE: SSL support in JRuby is not supported at present. Support will -be added back in a future date when a java Puma::MiniSSL is added. - -## 1.6.3 / 2012-09-04 - -* 1 bug fix: - * Close sockets waiting in the reactor when a hot restart is performed - so that browsers reconnect on the next request - -## 1.6.2 / 2012-08-27 - -* 1 bug fix: - * Rescue StandardError instead of IOError to handle SystemCallErrors - as well as other application exceptions inside the reactor. - -## 1.6.1 / 2012-07-23 - -* 1 packaging bug fixed: - * Include missing files - -## 1.6.0 / 2012-07-23 - -* 1 major bug fix: - * Prevent slow clients from starving the server by introducing a - dedicated IO reactor thread. Credit for reporting goes to @meh. - -## 1.5.0 / 2012-07-19 - -* 7 contributors to this release: - * Christian Mayer - * Darío Javier Cravero - * Dirkjan Bussink - * Gianluca Padovani - * Santiago Pastorino - * Thibault Jouan - * tomykaira - -* 6 bug fixes: - * Define RSTRING_NOT_MODIFIED for Rubinius - * Convert status to integer. Fixes [#123] - * Delete pidfile when stopping the server - * Allow compilation with -Werror=format-security option - * Fix wrong HTTP version for a HTTP/1.0 request - * Use String#bytesize instead of String#length - -* 3 minor features: - * Added support for setting RACK_ENV via the CLI, config file, and rack app - * Allow Server#run to run sync. Fixes [#111] - * Puma can now run on windows - -## 1.4.0 / 2012-06-04 - -* 1 bug fix: - * SCRIPT_NAME should be passed from env to allow mounting apps - -* 1 experimental feature: - * Add puma.socket key for direct socket access - -## 1.3.1 / 2012-05-15 - -* 2 bug fixes: - * use #bytesize instead of #length for Content-Length header - * Use StringIO properly. Fixes [#98] - -## 1.3.0 / 2012-05-08 - -* 2 minor features: - * Return valid Rack responses (passes Lint) from status server - * Add -I option to specify $LOAD_PATH directories - -* 4 bug fixes: - * Don't join the server thread inside the signal handle. Fixes [#94] - * Make NullIO#read mimic IO#read - * Only stop the status server if it's started. Fixes [#84] - * Set RACK_ENV early in cli also. Fixes [#78] - -* 1 new contributor: - * Jesse Cooke - -## 1.2.2 / 2012-04-28 - -* 4 bug fixes: - * Report a lowlevel error to stderr - * Set a fallback SERVER_NAME and SERVER_PORT - * Keep the encoding of the body correct. Fixes [#79] - * show error.to_s along with backtrace for low-level error - -## 1.2.1 / 2012-04-11 - -* 1 bug fix: - * Fix rack.url_scheme for SSL servers. Fixes [#65] - -## 1.2.0 / 2012-04-11 - -* 1 major feature: - * When possible, the internal restart does a "hot restart" meaning - the server sockets remains open, so no connections are lost. - -* 1 minor feature: - * More helpful fallback error message - -* 6 bug fixes: - * Pass the proper args to unknown_error. Fixes [#54], [#58] - * Stop the control server before restarting. Fixes [#61] - * Fix reporting https only on a true SSL connection - * Set the default content type to 'text/plain'. Fixes [#63] - * Use REUSEADDR. Fixes [#60] - * Shutdown gracefully on SIGTERM. Fixes [#53] - -* 2 new contributors: - * Seamus Abshere - * Steve Richert - -## 1.1.1 / 2012-03-30 - -* 1 bugfix: - * Include puma/compat.rb in the gem (oops!) - -## 1.1.0 / 2012-03-30 - -* 1 bugfix: - * Make sure that the unix socket has the perms 0777 by default - -* 1 minor feature: - * Add umask param to the unix:// bind to set the umask - -## 1.0.0 / 2012-03-29 - -* Released! - -## Ignore - this is for maintainers to copy-paste during release -## Master - -* Features - * Your feature goes here (#Github Number) - -* Bugfixes - * Your bugfix goes here (#Github Number) - -[#3680]:https://github.com/puma/puma/pull/3680 "PR by @byroot, merged 2025-07-31" -[#3572]:https://github.com/puma/puma/pull/3572 "PR by @barthez, merged 2025-02-06" -[#3586]:https://github.com/puma/puma/pull/3586 "PR by @MSP-Greg, merged 2025-02-03" -[#3598]:https://github.com/puma/puma/pull/3598 "PR by @joshuay03, merged 2025-01-31" -[#3601]:https://github.com/puma/puma/pull/3601 "PR by @joshuay03, merged 2025-01-31" -[#3635]:https://github.com/puma/puma/pull/3635 "PR by @LevitatingBusinessMan, merged 2025-05-08" -[#3570]:https://github.com/puma/puma/pull/3570 "PR by @mohamedhafez, merged 2024-12-30" -[#3567]:https://github.com/puma/puma/issues/3567 "Issue by @mohamedhafez, closed 2024-12-30" -[#3383]:https://github.com/puma/puma/pull/3383 "PR by @joshuay03, merged 2024-11-29" -[#3386]:https://github.com/puma/puma/pull/3386 "PR by @Drakula2k, merged 2024-11-27" -[#3517]:https://github.com/puma/puma/pull/3517 "PR by @jjb, merged 2024-11-26" -[#3375]:https://github.com/puma/puma/pull/3375 "PR by @joshuay03, merged 2024-11-23" -[#3348]:https://github.com/puma/puma/pull/3348 "PR by @tomurb, merged 2024-11-23" -[#3302]:https://github.com/puma/puma/issues/3302 "Issue by @benburkert, closed 2024-11-23" -[#3384]:https://github.com/puma/puma/pull/3384 "PR by @joshuay03, merged 2024-11-23" -[#3590]:https://github.com/puma/puma/pull/3590 "PR by @MSP-Greg, merged 2025-01-01" -[#3552]:https://github.com/puma/puma/issues/3552 "Issue by @utay, closed 2025-01-01" -[#3568]:https://github.com/puma/puma/pull/3568 "PR by @joshuay03, merged 2024-12-11" -[#3505]:https://github.com/puma/puma/pull/3505 "PR by @AnthonyClark, merged 2025-01-27" -[#3595]:https://github.com/puma/puma/pull/3595 "PR by @nateberkopec, merged 2025-01-07" -[#3565]:https://github.com/puma/puma/pull/3565 "PR by @MSP-Greg, merged 2024-11-28" -[#3376]:https://github.com/puma/puma/pull/3376 "PR by @joshuay03, merged 2024-11-23" -[#3407]:https://github.com/puma/puma/pull/3407 "PR by @JacobEvelyn, merged 2024-11-05" -[#3439]:https://github.com/puma/puma/pull/3439 "PR by @codergeek121, merged 2024-11-04" -[#3437]:https://github.com/puma/puma/issues/3437 "Issue by @rafaelfranca, closed 2024-11-04" -[#3486]:https://github.com/puma/puma/pull/3486 "PR by @mohamedhafez, merged 2024-09-26" -[#3422]:https://github.com/puma/puma/issues/3422 "Issue by @mohamedhafez, closed 2024-09-26" -[#3496]:https://github.com/puma/puma/pull/3496 "PR by @slizco, merged 2024-09-26" -[#3485]:https://github.com/puma/puma/pull/3485 "PR by @MSP-Greg, merged 2024-09-21" -[#3359]:https://github.com/puma/puma/pull/3359 "PR by @willayton, merged 2024-04-11" -[#3343]:https://github.com/puma/puma/issues/3343 "Issue by @willayton, closed 2024-04-11" -[#3309]:https://github.com/puma/puma/pull/3309 "PR by @byroot, merged 2024-01-09" -[#3425]:https://github.com/puma/puma/pull/3425 "PR by @mohamedhafez, merged 2024-07-14" -[#3424]:https://github.com/puma/puma/issues/3424 "Issue by @mohamedhafez, closed 2024-07-14" -[#3411]:https://github.com/puma/puma/pull/3411 "PR by @OuYangJinTing, merged 2024-06-15" -[#3380]:https://github.com/puma/puma/pull/3380 "PR by @emilyst, closed 2024-06-15" -[#3539]:https://github.com/puma/puma/pull/3539 "PR by @caius, merged 2024-11-20" -[#3532]:https://github.com/puma/puma/pull/3532 "PR by @MSP-Greg, merged 2024-10-24" -[#3531]:https://github.com/puma/puma/issues/3531 "Issue by @tagliala, closed 2024-10-24" -[#3214]:https://github.com/puma/puma/pull/3214 "PR by @MSP-Greg, merged 2024-10-15" -[#3468]:https://github.com/puma/puma/pull/3468 "PR by @foca, merged 2024-10-04" -[#3508]:https://github.com/puma/puma/pull/3508 "PR by @MayCXC, merged 2024-10-02" -[#3360]:https://github.com/puma/puma/pull/3360 "PR by @ioquatix, merged 2024-04-24" -[#3338]:https://github.com/puma/puma/pull/3338 "PR by @MSP-Greg, merged 2024-04-11" -[#3337]:https://github.com/puma/puma/issues/3337 "Issue by @skliew, closed 2024-04-11" -[#3332]:https://github.com/puma/puma/pull/3332 "PR by @evanphx, merged 2024-02-18" -[#3308]:https://github.com/puma/puma/pull/3308 "PR by @MSP-Greg, merged 2024-01-31" -[#3307]:https://github.com/puma/puma/issues/3307 "Issue by @nateberkopec, closed 2024-01-31" -[#3314]:https://github.com/puma/puma/pull/3314 "PR by @stanhu, merged 2024-01-26" -[#3313]:https://github.com/puma/puma/issues/3313 "Issue by @stanhu, closed 2024-01-26" -[#3518]:https://github.com/puma/puma/pull/3518 "PR by @roque86, merged 2024-11-15" -[#3467]:https://github.com/puma/puma/pull/3467 "PR by @MSP-Greg, merged 2024-09-21" -[#3341]:https://github.com/puma/puma/pull/3341 "PR by @joshuay03, merged 2024-03-11" -[#3548]:https://github.com/puma/puma/pull/3548 "PR by @MSP-Greg, merged 2024-11-21" -[#3325]:https://github.com/puma/puma/pull/3325 "PR by @OuYangJinTing, merged 2024-10-22" -[#3527]:https://github.com/puma/puma/pull/3527 "PR by @MSP-Greg, merged 2024-10-26" -[#3513]:https://github.com/puma/puma/pull/3513 "PR by @jjb, merged 2024-10-11" -[#3510]:https://github.com/puma/puma/pull/3510 "PR by @MSP-Greg, merged 2024-10-03" -[#3370]:https://github.com/puma/puma/pull/3370 "PR by @MSP-Greg, merged 2024-04-15" -[#3340]:https://github.com/puma/puma/pull/3340 "PR by @joshuay03, merged 2024-03-10" -[#3318]:https://github.com/puma/puma/pull/3318 "PR by @joshuay03, merged 2024-01-15" -[#3514]:https://github.com/puma/puma/pull/3514 "PR by @jjb, merged 2024-10-11" -[#3434]:https://github.com/puma/puma/pull/3434 "PR by @olleolleolle, merged 2024-09-19" -[#3435]:https://github.com/puma/puma/pull/3435 "PR by @olleolleolle, merged 2024-09-19" -[#3495]:https://github.com/puma/puma/pull/3495 "PR by @MSP-Greg, merged 2024-09-19" -[#3256]:https://github.com/puma/puma/pull/3256 "PR by @MSP-Greg, merged 2023-10-16" -[#3235]:https://github.com/puma/puma/pull/3235 "PR by @joshuay03, merged 2023-10-03" -[#3228]:https://github.com/puma/puma/issues/3228 "Issue by @davidalejandroaguilar, closed 2023-10-03" -[#3282]:https://github.com/puma/puma/issues/3282 "Issue by @bensheldon, closed 2024-01-02" -[#3283]:https://github.com/puma/puma/pull/3283 "PR by @joshuay03, merged 2024-01-02" -[#3225]:https://github.com/puma/puma/pull/3225 "PR by @joshuay03, merged 2023-09-27" -[#2786]:https://github.com/puma/puma/issues/2786 "Issue by @vitiokss, closed 2023-09-27" -[#3179]:https://github.com/puma/puma/pull/3179 "PR by @MSP-Greg, merged 2023-09-26" -[#3255]:https://github.com/puma/puma/pull/3255 "PR by @casperisfine, merged 2023-10-19" -[#3276]:https://github.com/puma/puma/pull/3276 "PR by @casperisfine, merged 2023-11-16" -[#3271]:https://github.com/puma/puma/pull/3271 "PR by @MSP-Greg, merged 2023-10-30" -[#3266]:https://github.com/puma/puma/issues/3266 "Issue by @Dragonicity, closed 2023-10-30" -[#3270]:https://github.com/puma/puma/pull/3270 "PR by @MSP-Greg, merged 2023-10-30" -[#3265]:https://github.com/puma/puma/pull/3265 "PR by @MSP-Greg, merged 2023-10-25" -[#3264]:https://github.com/puma/puma/issues/3264 "Issue by @dentarg, closed 2023-10-25" -[#3254]:https://github.com/puma/puma/pull/3254 "PR by @casperisfine, merged 2023-10-11" -[#3245]:https://github.com/puma/puma/pull/3245 "PR by @olleolleolle, merged 2023-10-02" -[#3293]:https://github.com/puma/puma/pull/3293 "PR by @MSP-Greg, merged 2023-12-21" -[#3301]:https://github.com/puma/puma/pull/3301 "PR by @benburkert, merged 2023-12-29" -[#3248]:https://github.com/puma/puma/pull/3248 "PR by @dentarg, merged 2023-10-04" -[#3298]:https://github.com/puma/puma/pull/3298 "PR by @til, merged 2023-12-26" -[#2920]:https://github.com/puma/puma/pull/2920 "PR by @biinari, merged 2023-07-11" -[#3195]:https://github.com/puma/puma/pull/3195 "PR by @binarygit, merged 2023-08-15" -[#3209]:https://github.com/puma/puma/pull/3209 "PR by @joshuay03, merged 2023-09-04" -[#2580]:https://github.com/puma/puma/issues/2580 "Issue by @schuetzm, closed 2023-09-04" -[#3204]:https://github.com/puma/puma/pull/3204 "PR by @dhavalsingh, merged 2023-08-25" -[#3191]:https://github.com/puma/puma/pull/3191 "PR by @MSP-Greg, merged 2023-08-31" -[#3165]:https://github.com/puma/puma/pull/3165 "PR by @fallwith, merged 2023-06-06" -[#3174]:https://github.com/puma/puma/pull/3174 "PR by @copiousfreetime, merged 2023-06-11" -[#3181]:https://github.com/puma/puma/pull/3181 "PR by @MSP-Greg, merged 2023-06-23" -[#3187]:https://github.com/puma/puma/pull/3187 "PR by @MSP-Greg, merged 2023-06-30" -[#3094]:https://github.com/puma/puma/pull/3094 "PR by @Vuta, merged 2023-07-23" -[#3106]:https://github.com/puma/puma/pull/3106 "PR by @MSP-Greg, merged 2023-05-29" -[#3014]:https://github.com/puma/puma/issues/3014 "Issue by @kyledrake, closed 2023-05-29" -[#3161]:https://github.com/puma/puma/pull/3161 "PR by @MSP-Greg, merged 2023-05-27" -[#3037]:https://github.com/puma/puma/issues/3037 "Issue by @daisy1754, closed 2023-05-27" -[#3133]:https://github.com/puma/puma/pull/3133 "PR by @stanhu, merged 2023-04-30" -[#3132]:https://github.com/puma/puma/issues/3132 "Issue by @stanhu, closed 2023-04-30" -[#3163]:https://github.com/puma/puma/pull/3163 "PR by @MSP-Greg, merged 2023-05-27" -[#3155]:https://github.com/puma/puma/pull/3155 "PR by @dentarg, merged 2023-05-14" -[#3148]:https://github.com/puma/puma/issues/3148 "Issue by @dentarg, closed 2023-05-14" -[#3129]:https://github.com/puma/puma/pull/3129 "PR by @MSP-Greg, merged 2023-05-02" -[#3137]:https://github.com/puma/puma/pull/3137 "PR by @MSP-Greg, merged 2023-04-30" -[#3156]:https://github.com/puma/puma/pull/3156 "PR by @severin, merged 2023-05-16" -[#3162]:https://github.com/puma/puma/pull/3162 "PR by @MSP-Greg, merged 2023-05-23" -[#3151]:https://github.com/puma/puma/pull/3151 "PR by @nateberkopec, merged 2023-05-12" -[#3118]:https://github.com/puma/puma/pull/3118 "PR by @ninoseki, merged 2023-04-01" -[#3117]:https://github.com/puma/puma/issues/3117 "Issue by @ninoseki, closed 2023-04-01" -[#3109]:https://github.com/puma/puma/pull/3109 "PR by @ahorek, merged 2023-03-31" -[#3108]:https://github.com/puma/puma/issues/3108 "Issue by @treviateo, closed 2023-03-31" -[#3113]:https://github.com/puma/puma/pull/3113 "PR by @collinsauve, merged 2023-03-31" -[#3112]:https://github.com/puma/puma/issues/3112 "Issue by @dmke, closed 2023-03-31" -[#3111]:https://github.com/puma/puma/pull/3111 "PR by @adzap, merged 2023-03-30" -[#2770]:https://github.com/puma/puma/pull/2770 "PR by @vzajkov, merged 2023-03-29" -[#2511]:https://github.com/puma/puma/issues/2511 "Issue by @jchristie55332, closed 2021-12-12" -[#3089]:https://github.com/puma/puma/pull/3089 "PR by @Vuta, merged 2023-03-06" -[#2709]:https://github.com/puma/puma/pull/2709 "PR by @rodzyn, merged 2023-02-20" -[#3091]:https://github.com/puma/puma/pull/3091 "PR by @MSP-Greg, merged 2023-03-28" -[#3074]:https://github.com/puma/puma/pull/3074 "PR by @MSP-Greg, merged 2023-03-14" -[#3072]:https://github.com/puma/puma/pull/3072 "PR by @MSP-Greg, merged 2023-02-17" -[#3079]:https://github.com/puma/puma/pull/3079 "PR by @mohamedhafez, merged 2023-02-24" -[#3080]:https://github.com/puma/puma/pull/3080 "PR by @MSP-Greg, merged 2023-02-16" -[#3058]:https://github.com/puma/puma/pull/3058 "PR by @dentarg, merged 2023-01-29" -[#3007]:https://github.com/puma/puma/issues/3007 "Issue by @MSP-Greg, closed 2023-01-29" -[#3011]:https://github.com/puma/puma/pull/3011 "PR by @joaomarcos96, merged 2023-01-03" -[#3006]:https://github.com/puma/puma/pull/3006 "PR by @QWYNG, merged 2023-02-09" -[#2604]:https://github.com/puma/puma/issues/2604 "Issue by @dgoetz, closed 2023-02-09" -[#3040]:https://github.com/puma/puma/pull/3040 "PR by @shayonj, merged 2023-01-02" -[#3036]:https://github.com/puma/puma/pull/3036 "PR by @MSP-Greg, merged 2023-01-13" -[#3020]:https://github.com/puma/puma/issues/3020 "Issue by @dentarg, closed 2023-01-13" -[#3061]:https://github.com/puma/puma/pull/3061 "PR by @MSP-Greg, merged 2023-02-12" -[#3057]:https://github.com/puma/puma/issues/3057 "Issue by @mmarvb8h, closed 2023-02-12" -[#3065]:https://github.com/puma/puma/pull/3065 "PR by @MSP-Greg, merged 2023-02-11" -[#3062]:https://github.com/puma/puma/pull/3062 "PR by @willkoehler, merged 2023-01-29" -[#3035]:https://github.com/puma/puma/pull/3035 "PR by @MSP-Greg, merged 2022-12-24" -[#3033]:https://github.com/puma/puma/issues/3033 "Issue by @jules-w2, closed 2022-12-24" -[#3016]:https://github.com/puma/puma/pull/3016 "PR by @MSP-Greg, merged 2022-12-24" -[#3005]:https://github.com/puma/puma/pull/3005 "PR by @JuanitoFatas, merged 2022-11-04" -[#3004]:https://github.com/puma/puma/pull/3004 "PR by @MSP-Greg, merged 2022-11-24" -[#3000]:https://github.com/puma/puma/issues/3000 "Issue by @dentarg, closed 2022-11-24" -[#3002]:https://github.com/puma/puma/pull/3002 "PR by @MSP-Greg, merged 2022-11-03" -[#2999]:https://github.com/puma/puma/issues/2999 "Issue by @aymeric-ledorze, closed 2022-11-03" -[#3013]:https://github.com/puma/puma/pull/3013 "PR by @MSP-Greg, merged 2022-11-13" -[#2919]:https://github.com/puma/puma/pull/2919 "PR by @MSP-Greg, merged 2022-08-30" -[#2652]:https://github.com/puma/puma/issues/2652 "Issue by @Roguelazer, closed 2022-09-04" -[#2653]:https://github.com/puma/puma/pull/2653 "PR by @Roguelazer, closed 2022-03-07" -[#2849]:https://github.com/puma/puma/pull/2849 "PR by @kares, merged 2022-04-09" -[#2933]:https://github.com/puma/puma/pull/2933 "PR by @cafedomancer, merged 2022-09-09" -[#2925]:https://github.com/puma/puma/issues/2925 "Issue by @nateberkopec, closed 2022-09-09" -[#2940]:https://github.com/puma/puma/pull/2940 "PR by @cafedomancer, merged 2022-09-10" -[#2924]:https://github.com/puma/puma/pull/2924 "PR by @cafedomancer, merged 2022-09-07" -[#2853]:https://github.com/puma/puma/issues/2853 "Issue by @nateberkopec, closed 2022-09-07" -[#2957]:https://github.com/puma/puma/pull/2957 "PR by @JuanitoFatas, merged 2022-09-16" -[#2958]:https://github.com/puma/puma/pull/2958 "PR by @JuanitoFatas, merged 2022-09-16" -[#2959]:https://github.com/puma/puma/pull/2959 "PR by @JuanitoFatas, merged 2022-09-16" -[#2960]:https://github.com/puma/puma/pull/2960 "PR by @JuanitoFatas, merged 2022-09-16" -[#2988]:https://github.com/puma/puma/pull/2988 "PR by @MSP-Greg, merged 2022-10-12" -[#2928]:https://github.com/puma/puma/pull/2928 "PR by @nateberkopec, merged 2022-09-10" -[#2798]:https://github.com/puma/puma/pull/2798 "PR by @johnnyshields, merged 2022-02-05" -[#2932]:https://github.com/puma/puma/pull/2932 "PR by @mrzasa, merged 2022-09-12" -[#2896]:https://github.com/puma/puma/pull/2896 "PR by @MSP-Greg, merged 2022-09-13" -[#2892]:https://github.com/puma/puma/pull/2892 "PR by @guilleiguaran, closed 2022-09-13" -[#2923]:https://github.com/puma/puma/pull/2923 "PR by @nateberkopec, merged 2022-09-09" -[#2740]:https://github.com/puma/puma/pull/2740 "PR by @ioquatix, merged 2022-01-29" -[#2845]:https://github.com/puma/puma/issues/2845 "Issue by @donv, closed 2022-03-22" -[#2917]:https://github.com/puma/puma/pull/2917 "PR by @MSP-Greg, merged 2022-09-19" -[#2915]:https://github.com/puma/puma/issues/2915 "Issue by @mperham, closed 2022-09-19" -[#2907]:https://github.com/puma/puma/pull/2907 "PR by @casperisfine, merged 2022-09-15" -[#2953]:https://github.com/puma/puma/pull/2953 "PR by @JuanitoFatas, merged 2022-09-14" -[#2936]:https://github.com/puma/puma/pull/2936 "PR by @MSP-Greg, merged 2022-09-09" -[#2931]:https://github.com/puma/puma/issues/2931 "Issue by @dentarg, closed 2022-09-09" -[#2875]:https://github.com/puma/puma/pull/2875 "PR by @ylecuyer, merged 2022-05-19" -[#2840]:https://github.com/puma/puma/pull/2840 "PR by @LukaszMaslej, merged 2022-04-13" -[#2774]:https://github.com/puma/puma/pull/2774 "PR by @ob-stripe, merged 2022-01-31" -[#2891]:https://github.com/puma/puma/pull/2891 "PR by @gingerlime, merged 2022-06-02" -[#2886]:https://github.com/puma/puma/pull/2886 "PR by @kares, merged 2022-05-30" -[#2899]:https://github.com/puma/puma/pull/2899 "PR by @kares, merged 2022-07-04" -[#2904]:https://github.com/puma/puma/pull/2904 "PR by @kares, merged 2022-08-27" -[#2884]:https://github.com/puma/puma/pull/2884 "PR by @kares, merged 2022-05-30" -[#2897]:https://github.com/puma/puma/pull/2897 "PR by @Edouard-chin, merged 2022-08-27" -[#1441]:https://github.com/puma/puma/issues/1441 "Issue by @nirvdrum, closed 2022-09-12" -[#2956]:https://github.com/puma/puma/pull/2956 "PR by @MSP-Greg, merged 2022-09-15" -[#2888]:https://github.com/puma/puma/pull/2888 "PR by @MSP-Greg, merged 2022-06-01" -[#2797]:https://github.com/puma/puma/pull/2797 "PR by @johnnyshields, merged 2022-02-01" -[#2795]:https://github.com/puma/puma/pull/2795 "PR by @johnnyshields, merged 2022-01-31" -[#2903]:https://github.com/puma/puma/pull/2903 "PR by @MSP-Greg, merged 2022-08-27" -[#2942]:https://github.com/puma/puma/pull/2942 "PR by @nateberkopec, merged 2022-09-15" -[#2921]:https://github.com/puma/puma/issues/2921 "Issue by @MSP-Greg, closed 2022-09-15" -[#2922]:https://github.com/puma/puma/issues/2922 "Issue by @MSP-Greg, closed 2022-09-10" -[#2955]:https://github.com/puma/puma/pull/2955 "PR by @cafedomancer, merged 2022-09-15" -[#3166]:https://github.com/puma/puma/pull/3166 "PR by @JoeDupuis, merged 2023-06-08" -[#2868]:https://github.com/puma/puma/pull/2868 "PR by @MSP-Greg, merged 2022-06-02" -[#2866]:https://github.com/puma/puma/issues/2866 "Issue by @slondr, closed 2022-06-02" -[#2883]:https://github.com/puma/puma/pull/2883 "PR by @MSP-Greg, merged 2022-06-02" -[#2890]:https://github.com/puma/puma/pull/2890 "PR by @kares, merged 2022-06-01" -[#2729]:https://github.com/puma/puma/issues/2729 "Issue by @kares, closed 2022-06-01" -[#2885]:https://github.com/puma/puma/pull/2885 "PR by @MSP-Greg, merged 2022-05-30" -[#2839]:https://github.com/puma/puma/issues/2839 "Issue by @wlipa, closed 2022-05-30" -[#2864]:https://github.com/puma/puma/pull/2864 "PR by @MSP-Greg, merged 2022-04-26" -[#2863]:https://github.com/puma/puma/issues/2863 "Issue by @eradman, closed 2022-04-26" -[#2861]:https://github.com/puma/puma/pull/2861 "PR by @BlakeWilliams, merged 2022-04-17" -[#2856]:https://github.com/puma/puma/issues/2856 "Issue by @nateberkopec, closed 2022-04-17" -[#2855]:https://github.com/puma/puma/pull/2855 "PR by @stanhu, merged 2022-04-09" -[#2848]:https://github.com/puma/puma/pull/2848 "PR by @stanhu, merged 2022-04-02" -[#2847]:https://github.com/puma/puma/pull/2847 "PR by @stanhu, merged 2022-04-02" -[#2838]:https://github.com/puma/puma/pull/2838 "PR by @epsilon-0, merged 2022-03-03" -[#2817]:https://github.com/puma/puma/pull/2817 "PR by @khustochka, merged 2022-02-20" -[#2810]:https://github.com/puma/puma/pull/2810 "PR by @kzkn, merged 2022-01-27" -[#2809]:https://github.com/puma/puma/pull/2809 "PR by @dentarg, merged 2022-01-26" -[#2764]:https://github.com/puma/puma/pull/2764 "PR by @dentarg, merged 2022-01-18" -[#2708]:https://github.com/puma/puma/issues/2708 "Issue by @erikaxel, closed 2022-01-18" -[#2780]:https://github.com/puma/puma/pull/2780 "PR by @dalibor, merged 2022-01-01" -[#2784]:https://github.com/puma/puma/pull/2784 "PR by @MSP-Greg, merged 2022-01-01" -[#2773]:https://github.com/puma/puma/pull/2773 "PR by @ob-stripe, merged 2022-01-01" -[#2794]:https://github.com/puma/puma/pull/2794 "PR by @johnnyshields, merged 2022-01-10" -[#2759]:https://github.com/puma/puma/pull/2759 "PR by @ob-stripe, merged 2021-12-11" -[#2731]:https://github.com/puma/puma/pull/2731 "PR by @baelter, merged 2021-11-02" -[#2341]:https://github.com/puma/puma/issues/2341 "Issue by @cjlarose, closed 2023-07-23" -[#2728]:https://github.com/puma/puma/pull/2728 "PR by @dalibor, merged 2021-10-31" -[#2733]:https://github.com/puma/puma/pull/2733 "PR by @ob-stripe, merged 2021-12-12" -[#2807]:https://github.com/puma/puma/pull/2807 "PR by @MSP-Greg, merged 2022-01-25" -[#2806]:https://github.com/puma/puma/issues/2806 "Issue by @olleolleolle, closed 2022-01-25" -[#2799]:https://github.com/puma/puma/pull/2799 "PR by @ags, merged 2022-01-22" -[#2785]:https://github.com/puma/puma/pull/2785 "PR by @MSP-Greg, merged 2022-01-02" -[#2757]:https://github.com/puma/puma/pull/2757 "PR by @MSP-Greg, merged 2021-11-24" -[#2745]:https://github.com/puma/puma/pull/2745 "PR by @MSP-Greg, merged 2021-11-03" -[#2742]:https://github.com/puma/puma/pull/2742 "PR by @MSP-Greg, merged 2021-12-12" -[#2730]:https://github.com/puma/puma/pull/2730 "PR by @kares, merged 2021-11-01" -[#2702]:https://github.com/puma/puma/pull/2702 "PR by @jacobherrington, merged 2021-09-21" -[#2610]:https://github.com/puma/puma/pull/2610 "PR by @ye-lin-aung, merged 2021-08-18" -[#2257]:https://github.com/puma/puma/issues/2257 "Issue by @nateberkopec, closed 2021-08-18" -[#2654]:https://github.com/puma/puma/pull/2654 "PR by @Roguelazer, merged 2021-09-07" -[#2651]:https://github.com/puma/puma/issues/2651 "Issue by @Roguelazer, closed 2021-09-07" -[#2689]:https://github.com/puma/puma/pull/2689 "PR by @jacobherrington, merged 2021-09-05" -[#2700]:https://github.com/puma/puma/pull/2700 "PR by @ioquatix, merged 2021-09-16" -[#2699]:https://github.com/puma/puma/issues/2699 "Issue by @ioquatix, closed 2021-09-16" -[#2690]:https://github.com/puma/puma/pull/2690 "PR by @doits, merged 2021-09-06" -[#2688]:https://github.com/puma/puma/pull/2688 "PR by @jdelStrother, merged 2021-09-03" -[#2687]:https://github.com/puma/puma/issues/2687 "Issue by @jdelStrother, closed 2021-09-03" -[#2675]:https://github.com/puma/puma/pull/2675 "PR by @devwout, merged 2021-09-08" -[#2657]:https://github.com/puma/puma/pull/2657 "PR by @olivierbellone, merged 2021-07-13" -[#2648]:https://github.com/puma/puma/pull/2648 "PR by @MSP-Greg, merged 2021-06-27" -[#1412]:https://github.com/puma/puma/issues/1412 "Issue by @x-yuri, closed 2021-06-27" -[#2586]:https://github.com/puma/puma/pull/2586 "PR by @MSP-Greg, merged 2021-05-26" -[#2569]:https://github.com/puma/puma/issues/2569 "Issue by @tarragon, closed 2021-05-26" -[#2643]:https://github.com/puma/puma/pull/2643 "PR by @MSP-Greg, merged 2021-06-27" -[#2638]:https://github.com/puma/puma/issues/2638 "Issue by @gingerlime, closed 2021-06-27" -[#2642]:https://github.com/puma/puma/pull/2642 "PR by @MSP-Greg, merged 2021-06-16" -[#2633]:https://github.com/puma/puma/pull/2633 "PR by @onlined, merged 2021-06-04" -[#2656]:https://github.com/puma/puma/pull/2656 "PR by @olivierbellone, merged 2021-07-07" -[#2666]:https://github.com/puma/puma/pull/2666 "PR by @MSP-Greg, merged 2021-07-25" -[#2630]:https://github.com/puma/puma/pull/2630 "PR by @seangoedecke, merged 2021-05-20" -[#2626]:https://github.com/puma/puma/issues/2626 "Issue by @rorymckinley, closed 2021-05-20" -[#2629]:https://github.com/puma/puma/pull/2629 "PR by @ye-lin-aung, merged 2021-05-20" -[#2628]:https://github.com/puma/puma/pull/2628 "PR by @wjordan, merged 2021-05-20" -[#2625]:https://github.com/puma/puma/issues/2625 "Issue by @jarthod, closed 2021-05-11" -[#2564]:https://github.com/puma/puma/pull/2564 "PR by @MSP-Greg, merged 2021-04-24" -[#2526]:https://github.com/puma/puma/issues/2526 "Issue by @nerdrew, closed 2021-04-24" -[#2559]:https://github.com/puma/puma/pull/2559 "PR by @ylecuyer, merged 2021-03-11" -[#2528]:https://github.com/puma/puma/issues/2528 "Issue by @cjlarose, closed 2021-03-11" -[#2565]:https://github.com/puma/puma/pull/2565 "PR by @CGA1123, merged 2021-03-09" -[#2534]:https://github.com/puma/puma/issues/2534 "Issue by @nateberkopec, closed 2021-03-09" -[#2563]:https://github.com/puma/puma/pull/2563 "PR by @MSP-Greg, merged 2021-03-06" -[#2504]:https://github.com/puma/puma/issues/2504 "Issue by @fsateler, closed 2021-03-06" -[#2591]:https://github.com/puma/puma/pull/2591 "PR by @MSP-Greg, merged 2021-05-05" -[#2572]:https://github.com/puma/puma/issues/2572 "Issue by @josef-krabath, closed 2021-05-05" -[#2613]:https://github.com/puma/puma/pull/2613 "PR by @smcgivern, merged 2021-04-27" -[#2605]:https://github.com/puma/puma/pull/2605 "PR by @pascalbetz, merged 2021-04-26" -[#2584]:https://github.com/puma/puma/issues/2584 "Issue by @kaorihinata, closed 2021-04-26" -[#2607]:https://github.com/puma/puma/pull/2607 "PR by @calvinxiao, merged 2021-04-23" -[#2552]:https://github.com/puma/puma/issues/2552 "Issue by @feliperaul, closed 2021-05-24" -[#2606]:https://github.com/puma/puma/pull/2606 "PR by @wjordan, merged 2021-04-20" -[#2574]:https://github.com/puma/puma/issues/2574 "Issue by @darkhelmet, closed 2021-04-20" -[#2567]:https://github.com/puma/puma/pull/2567 "PR by @kddnewton, merged 2021-04-19" -[#2566]:https://github.com/puma/puma/issues/2566 "Issue by @kddnewton, closed 2021-04-19" -[#2596]:https://github.com/puma/puma/pull/2596 "PR by @MSP-Greg, merged 2021-04-18" -[#2588]:https://github.com/puma/puma/pull/2588 "PR by @dentarg, merged 2021-04-02" -[#2556]:https://github.com/puma/puma/issues/2556 "Issue by @gamecreature, closed 2021-04-02" -[#2585]:https://github.com/puma/puma/pull/2585 "PR by @MSP-Greg, merged 2021-03-26" -[#2583]:https://github.com/puma/puma/issues/2583 "Issue by @jboler, closed 2021-03-26" -[#2609]:https://github.com/puma/puma/pull/2609 "PR by @calvinxiao, merged 2021-04-26" -[#2590]:https://github.com/puma/puma/pull/2590 "PR by @calvinxiao, merged 2021-04-05" -[#2600]:https://github.com/puma/puma/pull/2600 "PR by @wjordan, merged 2021-04-30" -[#2579]:https://github.com/puma/puma/pull/2579 "PR by @ghiculescu, merged 2021-03-17" -[#2553]:https://github.com/puma/puma/pull/2553 "PR by @olivierbellone, merged 2021-02-10" -[#2557]:https://github.com/puma/puma/pull/2557 "PR by @cjlarose, merged 2021-02-22" -[#2550]:https://github.com/puma/puma/pull/2550 "PR by @MSP-Greg, merged 2021-02-05" -[#2547]:https://github.com/puma/puma/pull/2547 "PR by @wildmaples, merged 2021-02-03" -[#2543]:https://github.com/puma/puma/pull/2543 "PR by @MSP-Greg, merged 2021-02-01" -[#2549]:https://github.com/puma/puma/pull/2549 "PR by @nmb, merged 2021-02-04" -[#2519]:https://github.com/puma/puma/pull/2519 "PR by @MSP-Greg, merged 2021-01-26" -[#2522]:https://github.com/puma/puma/pull/2522 "PR by @jcmfernandes, merged 2021-01-12" -[#2490]:https://github.com/puma/puma/pull/2490 "PR by @Bonias, merged 2020-12-07" -[#2486]:https://github.com/puma/puma/pull/2486 "PR by @karloscodes, merged 2020-12-02" -[#2535]:https://github.com/puma/puma/pull/2535 "PR by @MSP-Greg, merged 2021-01-27" -[#2529]:https://github.com/puma/puma/pull/2529 "PR by @MSP-Greg, merged 2021-01-24" -[#2533]:https://github.com/puma/puma/pull/2533 "PR by @MSP-Greg, merged 2021-01-24" -[#1953]:https://github.com/puma/puma/issues/1953 "Issue by @nateberkopec, closed 2020-12-01" -[#2516]:https://github.com/puma/puma/pull/2516 "PR by @cjlarose, merged 2020-12-17" -[#2520]:https://github.com/puma/puma/pull/2520 "PR by @dentarg, merged 2021-01-04" -[#2521]:https://github.com/puma/puma/pull/2521 "PR by @ojab, merged 2021-01-04" -[#2531]:https://github.com/puma/puma/pull/2531 "PR by @wjordan, merged 2021-01-19" -[#2510]:https://github.com/puma/puma/pull/2510 "PR by @micke, merged 2020-12-10" -[#2472]:https://github.com/puma/puma/pull/2472 "PR by @karloscodes, merged 2020-11-02" -[#2438]:https://github.com/puma/puma/pull/2438 "PR by @ekohl, merged 2020-10-26" -[#2406]:https://github.com/puma/puma/pull/2406 "PR by @fdel15, merged 2020-10-19" -[#2449]:https://github.com/puma/puma/pull/2449 "PR by @MSP-Greg, merged 2020-10-28" -[#2362]:https://github.com/puma/puma/pull/2362 "PR by @ekohl, merged 2020-11-10" -[#2485]:https://github.com/puma/puma/pull/2485 "PR by @elct9620, merged 2020-11-18" -[#2489]:https://github.com/puma/puma/pull/2489 "PR by @MSP-Greg, merged 2020-11-27" -[#2487]:https://github.com/puma/puma/pull/2487 "PR by @MSP-Greg, merged 2020-11-17" -[#2477]:https://github.com/puma/puma/pull/2477 "PR by @MSP-Greg, merged 2020-11-16" -[#2475]:https://github.com/puma/puma/pull/2475 "PR by @nateberkopec, merged 2020-11-02" -[#2439]:https://github.com/puma/puma/pull/2439 "PR by @kuei0221, merged 2020-10-26" -[#2460]:https://github.com/puma/puma/pull/2460 "PR by @cjlarose, merged 2020-10-27" -[#2473]:https://github.com/puma/puma/pull/2473 "PR by @cjlarose, merged 2020-11-01" -[#2479]:https://github.com/puma/puma/pull/2479 "PR by @cjlarose, merged 2020-11-10" -[#2495]:https://github.com/puma/puma/pull/2495 "PR by @JuanitoFatas, merged 2020-11-27" -[#2461]:https://github.com/puma/puma/pull/2461 "PR by @cjlarose, merged 2020-10-27" -[#2454]:https://github.com/puma/puma/issues/2454 "Issue by @majksner, closed 2020-10-27" -[#2432]:https://github.com/puma/puma/pull/2432 "PR by @MSP-Greg, merged 2020-10-25" -[#2442]:https://github.com/puma/puma/pull/2442 "PR by @wjordan, merged 2020-10-22" -[#2427]:https://github.com/puma/puma/pull/2427 "PR by @cjlarose, merged 2020-10-20" -[#2018]:https://github.com/puma/puma/issues/2018 "Issue by @gingerlime, closed 2020-10-20" -[#2435]:https://github.com/puma/puma/pull/2435 "PR by @wjordan, merged 2020-10-20" -[#2431]:https://github.com/puma/puma/pull/2431 "PR by @wjordan, merged 2020-10-16" -[#2212]:https://github.com/puma/puma/issues/2212 "Issue by @junaruga, closed 2020-10-16" -[#2409]:https://github.com/puma/puma/pull/2409 "PR by @fliiiix, merged 2020-10-03" -[#2448]:https://github.com/puma/puma/pull/2448 "PR by @MSP-Greg, merged 2020-10-25" -[#2450]:https://github.com/puma/puma/pull/2450 "PR by @MSP-Greg, merged 2020-10-25" -[#2419]:https://github.com/puma/puma/pull/2419 "PR by @MSP-Greg, merged 2020-10-09" -[#2279]:https://github.com/puma/puma/pull/2279 "PR by @wjordan, merged 2020-10-06" -[#2412]:https://github.com/puma/puma/pull/2412 "PR by @MSP-Greg, merged 2020-10-06" -[#2405]:https://github.com/puma/puma/pull/2405 "PR by @MSP-Greg, merged 2020-10-05" -[#2408]:https://github.com/puma/puma/pull/2408 "PR by @fliiiix, merged 2020-10-03" -[#2374]:https://github.com/puma/puma/pull/2374 "PR by @cjlarose, merged 2020-09-29" -[#2389]:https://github.com/puma/puma/pull/2389 "PR by @MSP-Greg, merged 2020-09-29" -[#2381]:https://github.com/puma/puma/pull/2381 "PR by @joergschray, merged 2020-09-24" -[#2271]:https://github.com/puma/puma/pull/2271 "PR by @wjordan, merged 2020-09-24" -[#2377]:https://github.com/puma/puma/pull/2377 "PR by @cjlarose, merged 2020-09-23" -[#2376]:https://github.com/puma/puma/pull/2376 "PR by @alexeevit, merged 2020-09-22" -[#2372]:https://github.com/puma/puma/pull/2372 "PR by @ahorek, merged 2020-09-22" -[#2384]:https://github.com/puma/puma/pull/2384 "PR by @schneems, merged 2020-09-27" -[#2375]:https://github.com/puma/puma/pull/2375 "PR by @MSP-Greg, merged 2020-09-23" -[#2373]:https://github.com/puma/puma/pull/2373 "PR by @MSP-Greg, merged 2020-09-23" -[#2305]:https://github.com/puma/puma/pull/2305 "PR by @MSP-Greg, merged 2020-09-14" -[#2099]:https://github.com/puma/puma/pull/2099 "PR by @wjordan, merged 2020-05-11" -[#2079]:https://github.com/puma/puma/pull/2079 "PR by @ayufan, merged 2020-05-11" -[#2093]:https://github.com/puma/puma/pull/2093 "PR by @schneems, merged 2019-12-18" -[#2256]:https://github.com/puma/puma/pull/2256 "PR by @nateberkopec, merged 2020-05-11" -[#2054]:https://github.com/puma/puma/pull/2054 "PR by @composerinteralia, merged 2019-11-11" -[#2106]:https://github.com/puma/puma/pull/2106 "PR by @ylecuyer, merged 2020-02-11" -[#2167]:https://github.com/puma/puma/pull/2167 "PR by @ChrisBr, closed 2020-07-06" -[#2344]:https://github.com/puma/puma/pull/2344 "PR by @dentarg, merged 2020-08-26" -[#2203]:https://github.com/puma/puma/pull/2203 "PR by @zanker-stripe, merged 2020-03-31" -[#2220]:https://github.com/puma/puma/pull/2220 "PR by @wjordan, merged 2020-04-14" -[#2238]:https://github.com/puma/puma/pull/2238 "PR by @sthirugn, merged 2020-05-07" -[#2086]:https://github.com/puma/puma/pull/2086 "PR by @bdewater, merged 2019-12-17" -[#2253]:https://github.com/puma/puma/pull/2253 "PR by @schneems, merged 2020-05-11" -[#2288]:https://github.com/puma/puma/pull/2288 "PR by @FTLam11, merged 2020-06-02" -[#1487]:https://github.com/puma/puma/pull/1487 "PR by @jxa, merged 2018-05-09" -[#2143]:https://github.com/puma/puma/pull/2143 "PR by @jalevin, merged 2020-04-21" -[#2169]:https://github.com/puma/puma/pull/2169 "PR by @nateberkopec, merged 2020-03-10" -[#2170]:https://github.com/puma/puma/pull/2170 "PR by @nateberkopec, merged 2020-03-10" -[#2076]:https://github.com/puma/puma/pull/2076 "PR by @drews256, merged 2020-02-27" -[#2022]:https://github.com/puma/puma/pull/2022 "PR by @olleolleolle, merged 2019-11-11" -[#2300]:https://github.com/puma/puma/pull/2300 "PR by @alexeevit, merged 2020-07-06" -[#2269]:https://github.com/puma/puma/pull/2269 "PR by @MSP-Greg, merged 2020-08-31" -[#2312]:https://github.com/puma/puma/pull/2312 "PR by @MSP-Greg, merged 2020-07-20" -[#2338]:https://github.com/puma/puma/issues/2338 "Issue by @micahhainlinestitchfix, closed 2020-08-18" -[#2116]:https://github.com/puma/puma/pull/2116 "PR by @MSP-Greg, merged 2020-05-15" -[#2074]:https://github.com/puma/puma/issues/2074 "Issue by @jchristie55332, closed 2020-02-19" -[#2211]:https://github.com/puma/puma/pull/2211 "PR by @MSP-Greg, merged 2020-03-30" -[#2069]:https://github.com/puma/puma/pull/2069 "PR by @MSP-Greg, merged 2019-11-09" -[#2112]:https://github.com/puma/puma/pull/2112 "PR by @wjordan, merged 2020-03-03" -[#1893]:https://github.com/puma/puma/pull/1893 "PR by @seven1m, merged 2020-02-18" -[#2119]:https://github.com/puma/puma/pull/2119 "PR by @wjordan, merged 2020-02-20" -[#2121]:https://github.com/puma/puma/pull/2121 "PR by @wjordan, merged 2020-02-21" -[#2154]:https://github.com/puma/puma/pull/2154 "PR by @cjlarose, merged 2020-03-10" -[#1551]:https://github.com/puma/puma/issues/1551 "Issue by @austinthecoder, closed 2020-03-10" -[#2198]:https://github.com/puma/puma/pull/2198 "PR by @eregon, merged 2020-03-24" -[#2216]:https://github.com/puma/puma/pull/2216 "PR by @praboud-stripe, merged 2020-04-06" -[#2122]:https://github.com/puma/puma/pull/2122 "PR by @wjordan, merged 2020-04-10" -[#2177]:https://github.com/puma/puma/issues/2177 "Issue by @GuiTeK, closed 2020-04-08" -[#2221]:https://github.com/puma/puma/pull/2221 "PR by @wjordan, merged 2020-04-17" -[#2233]:https://github.com/puma/puma/pull/2233 "PR by @ayufan, merged 2020-04-25" -[#2234]:https://github.com/puma/puma/pull/2234 "PR by @wjordan, merged 2020-04-30" -[#2225]:https://github.com/puma/puma/issues/2225 "Issue by @nateberkopec, closed 2020-04-27" -[#2267]:https://github.com/puma/puma/pull/2267 "PR by @wjordan, merged 2020-05-20" -[#2287]:https://github.com/puma/puma/pull/2287 "PR by @eugeneius, merged 2020-05-31" -[#2317]:https://github.com/puma/puma/pull/2317 "PR by @MSP-Greg, merged 2020-09-01" -[#2319]:https://github.com/puma/puma/issues/2319 "Issue by @AlexWayfer, closed 2020-09-03" -[#2326]:https://github.com/puma/puma/pull/2326 "PR by @rkistner, closed 2020-09-04" -[#2299]:https://github.com/puma/puma/issues/2299 "Issue by @JohnPhillips31416, closed 2020-09-17" -[#2095]:https://github.com/puma/puma/pull/2095 "PR by @bdewater, merged 2019-12-25" -[#2102]:https://github.com/puma/puma/pull/2102 "PR by @bdewater, merged 2020-02-07" -[#2111]:https://github.com/puma/puma/pull/2111 "PR by @wjordan, merged 2020-02-20" -[#1980]:https://github.com/puma/puma/pull/1980 "PR by @nateberkopec, merged 2020-02-27" -[#2189]:https://github.com/puma/puma/pull/2189 "PR by @jkowens, merged 2020-03-19" -[#2124]:https://github.com/puma/puma/pull/2124 "PR by @wjordan, merged 2020-04-14" -[#2223]:https://github.com/puma/puma/pull/2223 "PR by @wjordan, merged 2020-04-20" -[#2239]:https://github.com/puma/puma/pull/2239 "PR by @wjordan, merged 2020-05-15" -[#2496]:https://github.com/puma/puma/pull/2496 "PR by @TheRusskiy, merged 2020-11-30" -[#2304]:https://github.com/puma/puma/issues/2304 "Issue by @mpeltomaa, closed 2020-09-05" -[#2132]:https://github.com/puma/puma/issues/2132 "Issue by @bmclean, closed 2020-02-28" -[#2010]:https://github.com/puma/puma/pull/2010 "PR by @nateberkopec, merged 2019-10-07" -[#2012]:https://github.com/puma/puma/pull/2012 "PR by @headius, merged 2019-10-07" -[#2046]:https://github.com/puma/puma/pull/2046 "PR by @composerinteralia, merged 2019-10-21" -[#2052]:https://github.com/puma/puma/pull/2052 "PR by @composerinteralia, merged 2019-11-02" -[#1564]:https://github.com/puma/puma/issues/1564 "Issue by @perlun, closed 2019-10-07" -[#2035]:https://github.com/puma/puma/pull/2035 "PR by @AndrewSpeed, merged 2019-10-18" -[#2048]:https://github.com/puma/puma/pull/2048 "PR by @hahmed, merged 2019-10-21" -[#2050]:https://github.com/puma/puma/pull/2050 "PR by @olleolleolle, merged 2019-10-25" -[#1842]:https://github.com/puma/puma/issues/1842 "Issue by @nateberkopec, closed 2019-09-18" -[#1988]:https://github.com/puma/puma/issues/1988 "Issue by @mcg, closed 2019-10-01" -[#1986]:https://github.com/puma/puma/issues/1986 "Issue by @flaminestone, closed 2019-10-01" -[#1994]:https://github.com/puma/puma/issues/1994 "Issue by @LimeBlast, closed 2019-10-01" -[#2006]:https://github.com/puma/puma/pull/2006 "PR by @nateberkopec, merged 2019-10-01" -[#1222]:https://github.com/puma/puma/issues/1222 "Issue by @seanmckinley, closed 2019-10-04" -[#1885]:https://github.com/puma/puma/pull/1885 "PR by @spk, merged 2019-08-10" -[#1934]:https://github.com/puma/puma/pull/1934 "PR by @zarelit, merged 2019-08-28" -[#1105]:https://github.com/puma/puma/pull/1105 "PR by @daveallie, merged 2019-09-02" -[#1786]:https://github.com/puma/puma/pull/1786 "PR by @evanphx, merged 2019-09-11" -[#1320]:https://github.com/puma/puma/pull/1320 "PR by @nateberkopec, merged 2019-09-12" -[#1968]:https://github.com/puma/puma/pull/1968 "PR by @nateberkopec, merged 2019-09-15" -[#1908]:https://github.com/puma/puma/pull/1908 "PR by @MSP-Greg, merged 2019-08-23" -[#1952]:https://github.com/puma/puma/pull/1952 "PR by @MSP-Greg, merged 2019-09-19" -[#1941]:https://github.com/puma/puma/pull/1941 "PR by @MSP-Greg, merged 2019-09-02" -[#1961]:https://github.com/puma/puma/pull/1961 "PR by @nateberkopec, merged 2019-09-11" -[#1970]:https://github.com/puma/puma/pull/1970 "PR by @MSP-Greg, merged 2019-09-18" -[#1946]:https://github.com/puma/puma/pull/1946 "PR by @nateberkopec, merged 2019-09-02" -[#1831]:https://github.com/puma/puma/pull/1831 "PR by @spk, merged 2019-07-27" -[#1816]:https://github.com/puma/puma/pull/1816 "PR by @ylecuyer, merged 2019-08-01" -[#1844]:https://github.com/puma/puma/pull/1844 "PR by @ylecuyer, merged 2019-08-01" -[#1836]:https://github.com/puma/puma/pull/1836 "PR by @MSP-Greg, merged 2019-08-06" -[#1887]:https://github.com/puma/puma/pull/1887 "PR by @MSP-Greg, merged 2019-08-06" -[#1812]:https://github.com/puma/puma/pull/1812 "PR by @kou, merged 2019-08-03" -[#1491]:https://github.com/puma/puma/pull/1491 "PR by @olleolleolle, merged 2019-07-17" -[#1837]:https://github.com/puma/puma/pull/1837 "PR by @montanalow, merged 2019-07-25" -[#1857]:https://github.com/puma/puma/pull/1857 "PR by @Jesus, merged 2019-08-03" -[#1822]:https://github.com/puma/puma/pull/1822 "PR by @Jesus, merged 2019-08-01" -[#1863]:https://github.com/puma/puma/pull/1863 "PR by @dzunk, merged 2019-08-04" -[#1838]:https://github.com/puma/puma/pull/1838 "PR by @bogn83, merged 2019-07-14" -[#1882]:https://github.com/puma/puma/pull/1882 "PR by @okuramasafumi, merged 2019-08-06" -[#1848]:https://github.com/puma/puma/pull/1848 "PR by @nateberkopec, merged 2019-07-16" -[#1847]:https://github.com/puma/puma/pull/1847 "PR by @nateberkopec, merged 2019-07-16" -[#1846]:https://github.com/puma/puma/pull/1846 "PR by @nateberkopec, merged 2019-07-16" -[#1853]:https://github.com/puma/puma/pull/1853 "PR by @Jesus, merged 2019-07-18" -[#1850]:https://github.com/puma/puma/pull/1850 "PR by @nateberkopec, merged 2019-07-27" -[#1866]:https://github.com/puma/puma/pull/1866 "PR by @josacar, merged 2019-07-28" -[#1870]:https://github.com/puma/puma/pull/1870 "PR by @MSP-Greg, merged 2019-07-30" -[#1872]:https://github.com/puma/puma/pull/1872 "PR by @MSP-Greg, merged 2019-07-30" -[#1833]:https://github.com/puma/puma/issues/1833 "Issue by @julik, closed 2019-07-09" -[#1888]:https://github.com/puma/puma/pull/1888 "PR by @ClikeX, merged 2019-08-06" -[#1829]:https://github.com/puma/puma/pull/1829 "PR by @Fudoshiki, merged 2019-07-09" -[#1832]:https://github.com/puma/puma/pull/1832 "PR by @MSP-Greg, merged 2019-07-08" -[#1827]:https://github.com/puma/puma/pull/1827 "PR by @amrrbakry, merged 2019-06-27" -[#1562]:https://github.com/puma/puma/pull/1562 "PR by @skrobul, merged 2019-02-20" -[#1569]:https://github.com/puma/puma/pull/1569 "PR by @rianmcguire, merged 2019-02-20" -[#1648]:https://github.com/puma/puma/pull/1648 "PR by @wjordan, merged 2019-02-20" -[#1691]:https://github.com/puma/puma/pull/1691 "PR by @kares, merged 2019-02-20" -[#1716]:https://github.com/puma/puma/pull/1716 "PR by @mdkent, merged 2019-02-20" -[#1690]:https://github.com/puma/puma/pull/1690 "PR by @mic-kul, merged 2019-03-11" -[#1689]:https://github.com/puma/puma/pull/1689 "PR by @michaelherold, merged 2019-03-11" -[#1728]:https://github.com/puma/puma/pull/1728 "PR by @evanphx, merged 2019-03-20" -[#1824]:https://github.com/puma/puma/pull/1824 "PR by @spk, merged 2019-06-24" -[#1685]:https://github.com/puma/puma/pull/1685 "PR by @mainameiz, merged 2019-02-20" -[#1808]:https://github.com/puma/puma/pull/1808 "PR by @schneems, merged 2019-06-10" -[#1508]:https://github.com/puma/puma/pull/1508 "PR by @florin555, merged 2019-02-20" -[#1650]:https://github.com/puma/puma/pull/1650 "PR by @adam101, merged 2019-02-20" -[#1655]:https://github.com/puma/puma/pull/1655 "PR by @mipearson, merged 2019-02-20" -[#1671]:https://github.com/puma/puma/pull/1671 "PR by @eric-norcross, merged 2019-02-20" -[#1583]:https://github.com/puma/puma/pull/1583 "PR by @chwevans, merged 2019-02-20" -[#1773]:https://github.com/puma/puma/pull/1773 "PR by @enebo, merged 2019-04-14" -[#1731]:https://github.com/puma/puma/issues/1731 "Issue by @Fudoshiki, closed 2019-03-20" -[#1803]:https://github.com/puma/puma/pull/1803 "PR by @Jesus, merged 2019-05-28" -[#1741]:https://github.com/puma/puma/pull/1741 "PR by @MSP-Greg, merged 2019-03-19" -[#1674]:https://github.com/puma/puma/issues/1674 "Issue by @atitan, closed 2019-06-12" -[#1720]:https://github.com/puma/puma/issues/1720 "Issue by @voxik, closed 2019-03-20" -[#1730]:https://github.com/puma/puma/issues/1730 "Issue by @nearapogee, closed 2019-07-16" -[#1755]:https://github.com/puma/puma/issues/1755 "Issue by @vbalazs, closed 2019-07-26" -[#1649]:https://github.com/puma/puma/pull/1649 "PR by @schneems, merged 2018-10-17" -[#1607]:https://github.com/puma/puma/pull/1607 "PR by @harmdewit, merged 2018-08-15" -[#1700]:https://github.com/puma/puma/pull/1700 "PR by @schneems, merged 2019-01-05" -[#1630]:https://github.com/puma/puma/pull/1630 "PR by @eregon, merged 2018-09-11" -[#1478]:https://github.com/puma/puma/pull/1478 "PR by @eallison91, merged 2018-05-09" -[#1604]:https://github.com/puma/puma/pull/1604 "PR by @schneems, merged 2018-07-02" -[#1579]:https://github.com/puma/puma/pull/1579 "PR by @schneems, merged 2018-06-14" -[#1506]:https://github.com/puma/puma/pull/1506 "PR by @dekellum, merged 2018-05-09" -[#1563]:https://github.com/puma/puma/pull/1563 "PR by @dannyfallon, merged 2018-05-01" -[#1557]:https://github.com/puma/puma/pull/1557 "PR by @swrobel, merged 2018-05-09" -[#1529]:https://github.com/puma/puma/pull/1529 "PR by @desnudopenguino, merged 2018-03-20" -[#1532]:https://github.com/puma/puma/pull/1532 "PR by @schneems, merged 2018-03-21" -[#1482]:https://github.com/puma/puma/pull/1482 "PR by @shayonj, merged 2018-03-19" -[#1511]:https://github.com/puma/puma/pull/1511 "PR by @jemiam, merged 2018-03-19" -[#1545]:https://github.com/puma/puma/pull/1545 "PR by @hoshinotsuyoshi, merged 2018-03-28" -[#1550]:https://github.com/puma/puma/pull/1550 "PR by @eileencodes, merged 2018-03-29" -[#1553]:https://github.com/puma/puma/pull/1553 "PR by @eugeneius, merged 2018-04-02" -[#1510]:https://github.com/puma/puma/issues/1510 "Issue by @vincentwoo, closed 2018-03-06" -[#1524]:https://github.com/puma/puma/pull/1524 "PR by @tuwukee, closed 2018-03-06" -[#1507]:https://github.com/puma/puma/issues/1507 "Issue by @vincentwoo, closed 2018-03-19" -[#1483]:https://github.com/puma/puma/issues/1483 "Issue by @igravious, closed 2018-03-06" -[#1502]:https://github.com/puma/puma/issues/1502 "Issue by @vincentwoo, closed 2020-03-09" -[#1403]:https://github.com/puma/puma/pull/1403 "PR by @eileencodes, merged 2017-10-04" -[#1435]:https://github.com/puma/puma/pull/1435 "PR by @juliancheal, merged 2017-10-11" -[#1340]:https://github.com/puma/puma/pull/1340 "PR by @ViliusLuneckas, merged 2017-10-16" -[#1434]:https://github.com/puma/puma/pull/1434 "PR by @jumbosushi, merged 2017-10-10" -[#1436]:https://github.com/puma/puma/pull/1436 "PR by @luislavena, merged 2017-10-11" -[#1418]:https://github.com/puma/puma/pull/1418 "PR by @eileencodes, merged 2017-09-22" -[#1416]:https://github.com/puma/puma/pull/1416 "PR by @hiimtaylorjones, merged 2017-09-22" -[#1409]:https://github.com/puma/puma/pull/1409 "PR by @olleolleolle, merged 2017-09-13" -[#1427]:https://github.com/puma/puma/issues/1427 "Issue by @garybernhardt, closed 2017-10-04" -[#1430]:https://github.com/puma/puma/pull/1430 "PR by @MSP-Greg, merged 2017-10-09" -[#1429]:https://github.com/puma/puma/pull/1429 "PR by @perlun, merged 2017-10-09" -[#1455]:https://github.com/puma/puma/pull/1455 "PR by @perlun, merged 2017-11-16" -[#1425]:https://github.com/puma/puma/pull/1425 "PR by @vizcay, merged 2017-10-01" -[#1452]:https://github.com/puma/puma/pull/1452 "PR by @eprothro, merged 2017-11-16" -[#1439]:https://github.com/puma/puma/pull/1439 "PR by @MSP-Greg, merged 2017-10-16" -[#1442]:https://github.com/puma/puma/pull/1442 "PR by @MSP-Greg, merged 2017-10-19" -[#1464]:https://github.com/puma/puma/pull/1464 "PR by @MSP-Greg, merged 2017-11-20" -[#1384]:https://github.com/puma/puma/pull/1384 "PR by @noahgibbs, merged 2017-08-03" -[#1111]:https://github.com/puma/puma/pull/1111 "PR by @alexlance, merged 2017-06-04" -[#1392]:https://github.com/puma/puma/pull/1392 "PR by @hoffm, merged 2017-08-11" -[#1347]:https://github.com/puma/puma/pull/1347 "PR by @NikolayRys, merged 2017-06-28" -[#1334]:https://github.com/puma/puma/pull/1334 "PR by @respire, merged 2017-06-13" -[#1383]:https://github.com/puma/puma/pull/1383 "PR by @schneems, merged 2017-08-02" -[#1368]:https://github.com/puma/puma/pull/1368 "PR by @bongole, merged 2017-08-03" -[#1318]:https://github.com/puma/puma/pull/1318 "PR by @nateberkopec, merged 2017-08-03" -[#1376]:https://github.com/puma/puma/pull/1376 "PR by @pat, merged 2017-08-03" -[#1388]:https://github.com/puma/puma/pull/1388 "PR by @nateberkopec, merged 2017-08-08" -[#1390]:https://github.com/puma/puma/pull/1390 "PR by @junaruga, merged 2017-08-16" -[#1391]:https://github.com/puma/puma/pull/1391 "PR by @junaruga, merged 2017-08-16" -[#1385]:https://github.com/puma/puma/pull/1385 "PR by @grosser, merged 2017-08-16" -[#1377]:https://github.com/puma/puma/pull/1377 "PR by @shayonj, merged 2017-08-16" -[#1337]:https://github.com/puma/puma/pull/1337 "PR by @shayonj, merged 2017-08-16" -[#1325]:https://github.com/puma/puma/pull/1325 "PR by @palkan, merged 2017-06-04" -[#1395]:https://github.com/puma/puma/pull/1395 "PR by @junaruga, merged 2017-08-16" -[#1367]:https://github.com/puma/puma/issues/1367 "Issue by @dekellum, closed 2017-08-17" -[#1314]:https://github.com/puma/puma/pull/1314 "PR by @grosser, merged 2017-06-02" -[#1311]:https://github.com/puma/puma/pull/1311 "PR by @grosser, merged 2017-06-02" -[#1313]:https://github.com/puma/puma/pull/1313 "PR by @grosser, merged 2017-06-03" -[#1260]:https://github.com/puma/puma/pull/1260 "PR by @grosser, merged 2017-04-11" -[#1278]:https://github.com/puma/puma/pull/1278 "PR by @evanphx, merged 2017-04-28" -[#1306]:https://github.com/puma/puma/pull/1306 "PR by @jules2689, merged 2017-05-31" -[#1274]:https://github.com/puma/puma/pull/1274 "PR by @evanphx, merged 2017-05-01" -[#1261]:https://github.com/puma/puma/pull/1261 "PR by @jacksonrayhamilton, merged 2017-04-07" -[#1259]:https://github.com/puma/puma/pull/1259 "PR by @jacksonrayhamilton, merged 2017-04-07" -[#1248]:https://github.com/puma/puma/pull/1248 "PR by @davidarnold, merged 2017-04-18" -[#1277]:https://github.com/puma/puma/pull/1277 "PR by @schneems, merged 2017-05-01" -[#1290]:https://github.com/puma/puma/pull/1290 "PR by @schneems, merged 2017-05-12" -[#1285]:https://github.com/puma/puma/pull/1285 "PR by @fmauNeko, merged 2017-05-12" -[#1282]:https://github.com/puma/puma/pull/1282 "PR by @grosser, merged 2017-05-09" -[#1294]:https://github.com/puma/puma/pull/1294 "PR by @masry707, merged 2017-05-15" -[#1206]:https://github.com/puma/puma/pull/1206 "PR by @NikolayRys, closed 2017-06-27" -[#1241]:https://github.com/puma/puma/issues/1241 "Issue by @renchap, closed 2017-03-14" -[#1239]:https://github.com/puma/puma/pull/1239 "PR by @schneems, merged 2017-03-10" -[#1234]:https://github.com/puma/puma/pull/1234 "PR by @schneems, merged 2017-03-09" -[#1226]:https://github.com/puma/puma/pull/1226 "PR by @eileencodes, merged 2017-03-09" -[#1227]:https://github.com/puma/puma/pull/1227 "PR by @sirupsen, merged 2017-02-27" -[#1213]:https://github.com/puma/puma/pull/1213 "PR by @junaruga, merged 2017-02-28" -[#1182]:https://github.com/puma/puma/issues/1182 "Issue by @brunowego, closed 2017-02-09" -[#1203]:https://github.com/puma/puma/pull/1203 "PR by @twalpole, merged 2017-02-09" -[#1129]:https://github.com/puma/puma/pull/1129 "PR by @chtitux, merged 2016-12-12" -[#1165]:https://github.com/puma/puma/pull/1165 "PR by @sriedel, merged 2016-12-21" -[#1175]:https://github.com/puma/puma/pull/1175 "PR by @jemiam, merged 2016-12-21" -[#1068]:https://github.com/puma/puma/pull/1068 "PR by @junaruga, merged 2016-09-05" -[#1091]:https://github.com/puma/puma/pull/1091 "PR by @frodsan, merged 2016-09-17" -[#1088]:https://github.com/puma/puma/pull/1088 "PR by @frodsan, merged 2016-11-20" -[#1160]:https://github.com/puma/puma/pull/1160 "PR by @frodsan, merged 2016-11-24" -[#1169]:https://github.com/puma/puma/pull/1169 "PR by @scbrubaker02, merged 2016-12-12" -[#1061]:https://github.com/puma/puma/pull/1061 "PR by @michaelsauter, merged 2016-09-05" -[#1036]:https://github.com/puma/puma/issues/1036 "Issue by @matobinder, closed 2016-08-03" -[#1120]:https://github.com/puma/puma/pull/1120 "PR by @prathamesh-sonpatki, merged 2016-11-21" -[#1178]:https://github.com/puma/puma/pull/1178 "PR by @Koronen, merged 2016-12-21" -[#1002]:https://github.com/puma/puma/issues/1002 "Issue by @mattyb, closed 2016-07-26" -[#1063]:https://github.com/puma/puma/issues/1063 "Issue by @mperham, closed 2016-09-05" -[#1089]:https://github.com/puma/puma/issues/1089 "Issue by @AdamBialas, closed 2016-09-17" -[#1114]:https://github.com/puma/puma/pull/1114 "PR by @sj26, merged 2016-12-13" -[#1110]:https://github.com/puma/puma/pull/1110 "PR by @montdidier, merged 2016-12-12" -[#1135]:https://github.com/puma/puma/pull/1135 "PR by @jkraemer, merged 2016-11-19" -[#1081]:https://github.com/puma/puma/pull/1081 "PR by @frodsan, merged 2016-09-08" -[#1138]:https://github.com/puma/puma/pull/1138 "PR by @skull-squadron, merged 2016-12-13" -[#1118]:https://github.com/puma/puma/pull/1118 "PR by @hiroara, merged 2016-11-20" -[#1075]:https://github.com/puma/puma/issues/1075 "Issue by @pvalena, closed 2016-09-06" -[#932]:https://github.com/puma/puma/issues/932 "Issue by @everplays, closed 2016-07-24" -[#519]:https://github.com/puma/puma/issues/519 "Issue by @tmornini, closed 2016-07-25" -[#828]:https://github.com/puma/puma/issues/828 "Issue by @Zapotek, closed 2016-07-24" -[#984]:https://github.com/puma/puma/issues/984 "Issue by @erichmenge, closed 2016-07-24" -[#1028]:https://github.com/puma/puma/issues/1028 "Issue by @matobinder, closed 2016-07-24" -[#1023]:https://github.com/puma/puma/issues/1023 "Issue by @fera2k, closed 2016-07-24" -[#1027]:https://github.com/puma/puma/issues/1027 "Issue by @rosenfeld, closed 2016-07-24" -[#925]:https://github.com/puma/puma/issues/925 "Issue by @lokenmakwana, closed 2016-07-24" -[#911]:https://github.com/puma/puma/issues/911 "Issue by @veganstraightedge, closed 2016-07-24" -[#620]:https://github.com/puma/puma/issues/620 "Issue by @javanthropus, closed 2016-07-25" -[#778]:https://github.com/puma/puma/issues/778 "Issue by @niedhui, closed 2016-07-24" -[#1021]:https://github.com/puma/puma/pull/1021 "PR by @sarahzrf, merged 2016-07-20" -[#1022]:https://github.com/puma/puma/issues/1022 "Issue by @AKovtunov, closed 2017-08-16" -[#958]:https://github.com/puma/puma/issues/958 "Issue by @lalitlogical, closed 2016-04-23" -[#782]:https://github.com/puma/puma/issues/782 "Issue by @Tonkpils, closed 2016-07-19" -[#1010]:https://github.com/puma/puma/issues/1010 "Issue by @mneumark, closed 2016-07-19" -[#959]:https://github.com/puma/puma/issues/959 "Issue by @mwpastore, closed 2016-04-22" -[#840]:https://github.com/puma/puma/issues/840 "Issue by @marisawallace, closed 2016-04-07" -[#1007]:https://github.com/puma/puma/pull/1007 "PR by @willnet, merged 2016-06-24" -[#1014]:https://github.com/puma/puma/pull/1014 "PR by @szymon-jez, merged 2016-07-11" -[#1015]:https://github.com/puma/puma/pull/1015 "PR by @bf4, merged 2016-07-19" -[#1017]:https://github.com/puma/puma/pull/1017 "PR by @jorihardman, merged 2016-07-19" -[#954]:https://github.com/puma/puma/pull/954 "PR by @jf, merged 2016-04-12" -[#955]:https://github.com/puma/puma/pull/955 "PR by @jf, merged 2016-04-22" -[#956]:https://github.com/puma/puma/pull/956 "PR by @marisawallace, merged 2016-04-12" -[#960]:https://github.com/puma/puma/pull/960 "PR by @kmayer, merged 2016-04-15" -[#969]:https://github.com/puma/puma/pull/969 "PR by @frankwong15, merged 2016-05-10" -[#970]:https://github.com/puma/puma/pull/970 "PR by @willnet, merged 2016-04-26" -[#974]:https://github.com/puma/puma/pull/974 "PR by @reidmorrison, merged 2016-05-10" -[#977]:https://github.com/puma/puma/pull/977 "PR by @snow, merged 2016-05-10" -[#981]:https://github.com/puma/puma/pull/981 "PR by @zach-chai, merged 2016-07-19" -[#993]:https://github.com/puma/puma/pull/993 "PR by @scorix, merged 2016-07-19" -[#938]:https://github.com/puma/puma/issues/938 "Issue by @vandrijevik, closed 2016-04-07" -[#529]:https://github.com/puma/puma/issues/529 "Issue by @mperham, closed 2016-04-07" -[#788]:https://github.com/puma/puma/issues/788 "Issue by @herregroen, closed 2016-04-07" -[#894]:https://github.com/puma/puma/issues/894 "Issue by @rafbm, closed 2016-04-07" -[#937]:https://github.com/puma/puma/issues/937 "Issue by @huangxiangdan, closed 2016-04-07" -[#945]:https://github.com/puma/puma/pull/945 "PR by @dekellum, merged 2016-04-07" -[#946]:https://github.com/puma/puma/pull/946 "PR by @vipulnsward, merged 2016-04-07" -[#947]:https://github.com/puma/puma/pull/947 "PR by @vipulnsward, merged 2016-04-07" -[#936]:https://github.com/puma/puma/pull/936 "PR by @prathamesh-sonpatki, merged 2016-04-01" -[#940]:https://github.com/puma/puma/pull/940 "PR by @kyledrake, merged 2016-04-01" -[#942]:https://github.com/puma/puma/pull/942 "PR by @dekellum, merged 2016-04-01" -[#927]:https://github.com/puma/puma/pull/927 "PR by @jlecour, merged 2016-03-18" -[#931]:https://github.com/puma/puma/pull/931 "PR by @runlevel5, merged 2016-03-18" -[#922]:https://github.com/puma/puma/issues/922 "Issue by @LavirtheWhiolet, closed 2016-03-07" -[#923]:https://github.com/puma/puma/issues/923 "Issue by @donv, closed 2016-03-06" -[#912]:https://github.com/puma/puma/pull/912 "PR by @tricknotes, merged 2016-03-06" -[#921]:https://github.com/puma/puma/pull/921 "PR by @swrobel, merged 2016-03-06" -[#924]:https://github.com/puma/puma/pull/924 "PR by @tbrisker, merged 2016-03-07" -[#916]:https://github.com/puma/puma/issues/916 "Issue by @ma11hew28, closed 2016-03-06" -[#913]:https://github.com/puma/puma/issues/913 "Issue by @Casara, closed 2016-03-06" -[#918]:https://github.com/puma/puma/issues/918 "Issue by @rodrigdav, closed 2016-03-06" -[#910]:https://github.com/puma/puma/issues/910 "Issue by @ball-hayden, closed 2016-03-05" -[#914]:https://github.com/puma/puma/issues/914 "Issue by @osheroff, closed 2016-03-06" -[#901]:https://github.com/puma/puma/pull/901 "PR by @mitto, merged 2016-02-26" -[#902]:https://github.com/puma/puma/pull/902 "PR by @corrupt952, merged 2016-02-26" -[#905]:https://github.com/puma/puma/pull/905 "PR by @Eric-Guo, merged 2016-02-26" -[#852]:https://github.com/puma/puma/issues/852 "Issue by @asia653, closed 2016-02-25" -[#854]:https://github.com/puma/puma/issues/854 "Issue by @ollym, closed 2016-02-25" -[#824]:https://github.com/puma/puma/issues/824 "Issue by @MattWalston, closed 2016-02-25" -[#823]:https://github.com/puma/puma/issues/823 "Issue by @pneuman, closed 2016-02-25" -[#815]:https://github.com/puma/puma/issues/815 "Issue by @nate-dipiazza, closed 2016-02-25" -[#835]:https://github.com/puma/puma/issues/835 "Issue by @mwpastore, closed 2016-02-25" -[#798]:https://github.com/puma/puma/issues/798 "Issue by @schneems, closed 2016-02-25" -[#876]:https://github.com/puma/puma/issues/876 "Issue by @osheroff, closed 2016-02-25" -[#849]:https://github.com/puma/puma/issues/849 "Issue by @apotheon, closed 2016-02-25" -[#871]:https://github.com/puma/puma/pull/871 "PR by @deepj, merged 2016-02-25" -[#874]:https://github.com/puma/puma/pull/874 "PR by @wallclockbuilder, merged 2016-02-25" -[#883]:https://github.com/puma/puma/pull/883 "PR by @dadah89, merged 2016-02-25" -[#884]:https://github.com/puma/puma/pull/884 "PR by @furkanmustafa, merged 2016-02-25" -[#888]:https://github.com/puma/puma/pull/888 "PR by @mlarraz, merged 2016-02-25" -[#890]:https://github.com/puma/puma/pull/890 "PR by @todd, merged 2016-02-25" -[#891]:https://github.com/puma/puma/pull/891 "PR by @ctaintor, merged 2016-02-25" -[#893]:https://github.com/puma/puma/pull/893 "PR by @spastorino, merged 2016-02-25" -[#897]:https://github.com/puma/puma/pull/897 "PR by @vanchi-zendesk, merged 2016-02-25" -[#899]:https://github.com/puma/puma/pull/899 "PR by @kch, merged 2016-02-25" -[#859]:https://github.com/puma/puma/issues/859 "Issue by @boxofrad, closed 2016-01-28" -[#822]:https://github.com/puma/puma/pull/822 "PR by @kwugirl, merged 2016-01-28" -[#833]:https://github.com/puma/puma/pull/833 "PR by @joemiller, merged 2016-01-28" -[#837]:https://github.com/puma/puma/pull/837 "PR by @YurySolovyov, merged 2016-01-28" -[#839]:https://github.com/puma/puma/pull/839 "PR by @ka8725, merged 2016-01-15" -[#845]:https://github.com/puma/puma/pull/845 "PR by @deepj, merged 2016-01-28" -[#846]:https://github.com/puma/puma/pull/846 "PR by @sriedel, merged 2016-01-15" -[#850]:https://github.com/puma/puma/pull/850 "PR by @deepj, merged 2016-01-15" -[#853]:https://github.com/puma/puma/pull/853 "PR by @xuqiyong666, merged 2016-01-28" -[#857]:https://github.com/puma/puma/pull/857 "PR by @osheroff, merged 2016-01-15" -[#858]:https://github.com/puma/puma/pull/858 "PR by @mlarraz, merged 2016-01-28" -[#860]:https://github.com/puma/puma/pull/860 "PR by @osheroff, merged 2016-01-15" -[#861]:https://github.com/puma/puma/pull/861 "PR by @osheroff, merged 2016-01-15" -[#818]:https://github.com/puma/puma/pull/818 "PR by @unleashed, merged 2015-11-06" -[#819]:https://github.com/puma/puma/pull/819 "PR by @VictorLowther, merged 2015-11-06" -[#563]:https://github.com/puma/puma/issues/563 "Issue by @deathbob, closed 2015-11-06" -[#803]:https://github.com/puma/puma/issues/803 "Issue by @burningTyger, closed 2016-04-07" -[#768]:https://github.com/puma/puma/pull/768 "PR by @nathansamson, merged 2015-11-06" -[#773]:https://github.com/puma/puma/pull/773 "PR by @rossta, merged 2015-11-06" -[#774]:https://github.com/puma/puma/pull/774 "PR by @snow, merged 2015-11-06" -[#781]:https://github.com/puma/puma/pull/781 "PR by @sunsations, merged 2015-11-06" -[#791]:https://github.com/puma/puma/pull/791 "PR by @unleashed, merged 2015-10-01" -[#793]:https://github.com/puma/puma/pull/793 "PR by @robdimarco, merged 2015-11-06" -[#794]:https://github.com/puma/puma/pull/794 "PR by @peterkeen, merged 2015-11-06" -[#795]:https://github.com/puma/puma/pull/795 "PR by @unleashed, merged 2015-11-06" -[#796]:https://github.com/puma/puma/pull/796 "PR by @cschneid, merged 2015-10-13" -[#799]:https://github.com/puma/puma/pull/799 "PR by @annawinkler, merged 2015-11-06" -[#800]:https://github.com/puma/puma/pull/800 "PR by @liamseanbrady, merged 2015-11-06" -[#801]:https://github.com/puma/puma/pull/801 "PR by @scottjg, merged 2015-11-06" -[#802]:https://github.com/puma/puma/pull/802 "PR by @scottjg, merged 2015-11-06" -[#804]:https://github.com/puma/puma/pull/804 "PR by @burningTyger, merged 2015-11-06" -[#809]:https://github.com/puma/puma/pull/809 "PR by @unleashed, merged 2015-11-06" -[#810]:https://github.com/puma/puma/pull/810 "PR by @vlmonk, merged 2015-11-06" -[#814]:https://github.com/puma/puma/pull/814 "PR by @schneems, merged 2015-11-04" -[#817]:https://github.com/puma/puma/pull/817 "PR by @unleashed, merged 2015-11-06" -[#735]:https://github.com/puma/puma/issues/735 "Issue by @trekr5, closed 2015-08-04" -[#769]:https://github.com/puma/puma/issues/769 "Issue by @dovestyle, closed 2015-08-16" -[#767]:https://github.com/puma/puma/issues/767 "Issue by @kapso, closed 2015-08-15" -[#765]:https://github.com/puma/puma/issues/765 "Issue by @monfresh, closed 2015-08-15" -[#764]:https://github.com/puma/puma/issues/764 "Issue by @keithpitt, closed 2015-08-15" -[#669]:https://github.com/puma/puma/pull/669 "PR by @chulkilee, closed 2015-08-14" -[#673]:https://github.com/puma/puma/pull/673 "PR by @chulkilee, closed 2015-08-14" -[#668]:https://github.com/puma/puma/pull/668 "PR by @kcollignon, merged 2015-08-14" -[#754]:https://github.com/puma/puma/pull/754 "PR by @nathansamson, merged 2015-08-14" -[#759]:https://github.com/puma/puma/pull/759 "PR by @BenV, merged 2015-08-14" -[#761]:https://github.com/puma/puma/pull/761 "PR by @dmarcotte, merged 2015-08-14" -[#742]:https://github.com/puma/puma/pull/742 "PR by @deivid-rodriguez, merged 2015-07-17" -[#743]:https://github.com/puma/puma/pull/743 "PR by @matthewd, merged 2015-07-18" -[#749]:https://github.com/puma/puma/pull/749 "PR by @huacnlee, merged 2015-08-04" -[#751]:https://github.com/puma/puma/pull/751 "PR by @costi, merged 2015-07-31" -[#741]:https://github.com/puma/puma/issues/741 "Issue by @GUI, closed 2015-07-17" -[#739]:https://github.com/puma/puma/issues/739 "Issue by @hab278, closed 2015-07-17" -[#737]:https://github.com/puma/puma/issues/737 "Issue by @dmill, closed 2015-07-16" -[#733]:https://github.com/puma/puma/issues/733 "Issue by @Eric-Guo, closed 2015-07-15" -[#736]:https://github.com/puma/puma/pull/736 "PR by @paulanunda, merged 2015-07-15" -[#722]:https://github.com/puma/puma/issues/722 "Issue by @mikeki, closed 2015-07-14" -[#694]:https://github.com/puma/puma/issues/694 "Issue by @yld, closed 2015-06-10" -[#705]:https://github.com/puma/puma/issues/705 "Issue by @TheTeaNerd, closed 2015-07-14" -[#686]:https://github.com/puma/puma/pull/686 "PR by @jjb, merged 2015-06-10" -[#693]:https://github.com/puma/puma/pull/693 "PR by @rob-murray, merged 2015-06-10" -[#697]:https://github.com/puma/puma/pull/697 "PR by @spk, merged 2015-06-10" -[#699]:https://github.com/puma/puma/pull/699 "PR by @deees, merged 2015-05-19" -[#701]:https://github.com/puma/puma/pull/701 "PR by @deepj, merged 2015-05-19" -[#702]:https://github.com/puma/puma/pull/702 "PR by @OleMchls, merged 2015-06-10" -[#703]:https://github.com/puma/puma/pull/703 "PR by @deepj, merged 2015-06-10" -[#704]:https://github.com/puma/puma/pull/704 "PR by @grega, merged 2015-06-10" -[#709]:https://github.com/puma/puma/pull/709 "PR by @lian, merged 2015-06-10" -[#711]:https://github.com/puma/puma/pull/711 "PR by @julik, merged 2015-06-10" -[#712]:https://github.com/puma/puma/pull/712 "PR by @chewi, merged 2015-07-14" -[#715]:https://github.com/puma/puma/pull/715 "PR by @raymondmars, merged 2015-07-14" -[#725]:https://github.com/puma/puma/pull/725 "PR by @rwz, merged 2015-07-14" -[#726]:https://github.com/puma/puma/pull/726 "PR by @jshafton, merged 2015-07-14" -[#729]:https://github.com/puma/puma/pull/729 "PR by @allaire, merged 2015-07-14" -[#730]:https://github.com/puma/puma/pull/730 "PR by @iamjarvo, merged 2015-07-14" -[#690]:https://github.com/puma/puma/issues/690 "Issue by @bachue, closed 2015-04-21" -[#684]:https://github.com/puma/puma/issues/684 "Issue by @tomquas, closed 2015-04-13" -[#698]:https://github.com/puma/puma/pull/698 "PR by @dmarcotte, merged 2015-05-04" -[#683]:https://github.com/puma/puma/issues/683 "Issue by @indirect, closed 2015-04-11" -[#657]:https://github.com/puma/puma/pull/657 "PR by @schneems, merged 2015-02-19" -[#658]:https://github.com/puma/puma/pull/658 "PR by @tomohiro, merged 2015-02-23" -[#662]:https://github.com/puma/puma/pull/662 "PR by @iaintshine, merged 2015-03-06" -[#664]:https://github.com/puma/puma/pull/664 "PR by @fxposter, merged 2015-03-09" -[#667]:https://github.com/puma/puma/pull/667 "PR by @JuanitoFatas, merged 2015-03-12" -[#672]:https://github.com/puma/puma/pull/672 "PR by @chulkilee, merged 2015-03-15" -[#653]:https://github.com/puma/puma/issues/653 "Issue by @dvrensk, closed 2015-02-11" -[#644]:https://github.com/puma/puma/pull/644 "PR by @bpaquet, merged 2015-01-29" -[#646]:https://github.com/puma/puma/pull/646 "PR by @mkonecny, merged 2015-02-05" -[#630]:https://github.com/puma/puma/issues/630 "Issue by @jelmd, closed 2015-01-20" -[#622]:https://github.com/puma/puma/issues/622 "Issue by @sabamotto, closed 2015-01-20" -[#583]:https://github.com/puma/puma/issues/583 "Issue by @rwojsznis, closed 2015-01-20" -[#586]:https://github.com/puma/puma/issues/586 "Issue by @ponchik, closed 2015-01-20" -[#359]:https://github.com/puma/puma/issues/359 "Issue by @natew, closed 2014-12-13" -[#633]:https://github.com/puma/puma/issues/633 "Issue by @joevandyk, closed 2015-01-20" -[#478]:https://github.com/puma/puma/pull/478 "PR by @rubencaro, merged 2015-01-20" -[#610]:https://github.com/puma/puma/pull/610 "PR by @kwilczynski, merged 2014-11-27" -[#611]:https://github.com/puma/puma/pull/611 "PR by @jasonl, merged 2015-01-20" -[#616]:https://github.com/puma/puma/pull/616 "PR by @jc00ke, merged 2014-12-10" -[#623]:https://github.com/puma/puma/pull/623 "PR by @raldred, merged 2015-01-20" -[#628]:https://github.com/puma/puma/pull/628 "PR by @rdpoor, merged 2015-01-20" -[#634]:https://github.com/puma/puma/pull/634 "PR by @deepj, merged 2015-01-20" -[#637]:https://github.com/puma/puma/pull/637 "PR by @raskhadafi, merged 2015-01-20" -[#639]:https://github.com/puma/puma/pull/639 "PR by @ebeigarts, merged 2015-01-20" -[#640]:https://github.com/puma/puma/pull/640 "PR by @bailsman, merged 2015-01-20" -[#591]:https://github.com/puma/puma/issues/591 "Issue by @renier, closed 2014-11-24" -[#606]:https://github.com/puma/puma/issues/606 "Issue by @, closed 2014-11-24" -[#560]:https://github.com/puma/puma/pull/560 "PR by @raskhadafi, merged 2014-11-24" -[#566]:https://github.com/puma/puma/pull/566 "PR by @sheltond, merged 2014-11-24" -[#593]:https://github.com/puma/puma/pull/593 "PR by @andruby, merged 2014-10-30" -[#594]:https://github.com/puma/puma/pull/594 "PR by @hassox, merged 2014-10-31" -[#596]:https://github.com/puma/puma/pull/596 "PR by @burningTyger, merged 2014-11-01" -[#601]:https://github.com/puma/puma/pull/601 "PR by @sorentwo, merged 2014-11-24" -[#602]:https://github.com/puma/puma/pull/602 "PR by @1334, merged 2014-11-24" -[#608]:https://github.com/puma/puma/pull/608 "PR by @Gu1, merged 2014-11-24" -[#538]:https://github.com/puma/puma/pull/538 "PR by @memiux, merged 2014-11-24" -[#550]:https://github.com/puma/puma/issues/550 "Issue by @, closed 2014-10-30" -[#549]:https://github.com/puma/puma/pull/549 "PR by @bsnape, merged 2014-10-16" -[#553]:https://github.com/puma/puma/pull/553 "PR by @lowjoel, merged 2014-10-16" -[#568]:https://github.com/puma/puma/pull/568 "PR by @mariuz, merged 2014-10-16" -[#578]:https://github.com/puma/puma/pull/578 "PR by @danielbuechele, merged 2014-10-16" -[#581]:https://github.com/puma/puma/pull/581 "PR by @alexch, merged 2014-10-16" -[#590]:https://github.com/puma/puma/pull/590 "PR by @dmarcotte, merged 2014-10-16" -[#574]:https://github.com/puma/puma/issues/574 "Issue by @minasmart, closed 2014-09-05" -[#561]:https://github.com/puma/puma/pull/561 "PR by @krasnoukhov, merged 2014-08-04" -[#570]:https://github.com/puma/puma/pull/570 "PR by @havenwood, merged 2014-08-20" -[#520]:https://github.com/puma/puma/pull/520 "PR by @misfo, merged 2014-06-16" -[#530]:https://github.com/puma/puma/pull/530 "PR by @dmarcotte, merged 2014-06-16" -[#537]:https://github.com/puma/puma/pull/537 "PR by @vlmonk, merged 2014-06-16" -[#540]:https://github.com/puma/puma/pull/540 "PR by @allaire, merged 2014-05-27" -[#544]:https://github.com/puma/puma/pull/544 "PR by @chulkilee, merged 2014-06-03" -[#551]:https://github.com/puma/puma/pull/551 "PR by @jcxplorer, merged 2014-07-02" -[#487]:https://github.com/puma/puma/pull/487 "PR by @, merged 2014-03-06" -[#492]:https://github.com/puma/puma/pull/492 "PR by @, merged 2014-03-06" -[#493]:https://github.com/puma/puma/pull/493 "PR by @alepore, merged 2014-03-07" -[#503]:https://github.com/puma/puma/pull/503 "PR by @mariuz, merged 2014-04-12" -[#505]:https://github.com/puma/puma/pull/505 "PR by @sammcj, merged 2014-04-12" -[#506]:https://github.com/puma/puma/pull/506 "PR by @dsander, merged 2014-04-12" -[#510]:https://github.com/puma/puma/pull/510 "PR by @momer, merged 2014-04-12" -[#511]:https://github.com/puma/puma/pull/511 "PR by @macool, merged 2014-04-12" -[#514]:https://github.com/puma/puma/pull/514 "PR by @nanaya, merged 2014-04-12" -[#517]:https://github.com/puma/puma/pull/517 "PR by @misfo, merged 2014-04-12" -[#518]:https://github.com/puma/puma/pull/518 "PR by @alxgsv, merged 2014-04-12" -[#471]:https://github.com/puma/puma/pull/471 "PR by @arthurnn, merged 2014-02-28" -[#485]:https://github.com/puma/puma/pull/485 "PR by @runlevel5, merged 2014-03-01" -[#486]:https://github.com/puma/puma/pull/486 "PR by @joshwlewis, merged 2014-03-02" -[#490]:https://github.com/puma/puma/pull/490 "PR by @tobinibot, merged 2014-03-06" -[#491]:https://github.com/puma/puma/pull/491 "PR by @brianknight10, merged 2014-03-06" -[#438]:https://github.com/puma/puma/issues/438 "Issue by @mperham, closed 2014-01-25" -[#333]:https://github.com/puma/puma/issues/333 "Issue by @SamSaffron, closed 2014-01-26" -[#440]:https://github.com/puma/puma/issues/440 "Issue by @sudara, closed 2014-01-25" -[#449]:https://github.com/puma/puma/issues/449 "Issue by @cezarsa, closed 2014-02-04" -[#444]:https://github.com/puma/puma/issues/444 "Issue by @le0pard, closed 2014-01-25" -[#370]:https://github.com/puma/puma/issues/370 "Issue by @pelcasandra, closed 2014-01-26" -[#377]:https://github.com/puma/puma/issues/377 "Issue by @mrbrdo, closed 2014-01-26" -[#406]:https://github.com/puma/puma/issues/406 "Issue by @simonrussell, closed 2014-01-25" -[#425]:https://github.com/puma/puma/issues/425 "Issue by @jhass, closed 2014-01-26" -[#432]:https://github.com/puma/puma/pull/432 "PR by @anatol, closed 2014-01-25" -[#428]:https://github.com/puma/puma/pull/428 "PR by @alexeyfrank, merged 2014-01-25" -[#429]:https://github.com/puma/puma/pull/429 "PR by @namusyaka, merged 2013-12-16" -[#431]:https://github.com/puma/puma/pull/431 "PR by @mrb, merged 2014-01-25" -[#433]:https://github.com/puma/puma/pull/433 "PR by @alepore, merged 2014-02-28" -[#437]:https://github.com/puma/puma/pull/437 "PR by @ibrahima, merged 2014-01-25" -[#446]:https://github.com/puma/puma/pull/446 "PR by @sudara, merged 2014-01-27" -[#451]:https://github.com/puma/puma/pull/451 "PR by @pwiebe, merged 2014-02-04" -[#453]:https://github.com/puma/puma/pull/453 "PR by @joevandyk, merged 2014-02-28" -[#470]:https://github.com/puma/puma/pull/470 "PR by @arthurnn, merged 2014-02-28" -[#472]:https://github.com/puma/puma/pull/472 "PR by @rubencaro, merged 2014-02-21" -[#480]:https://github.com/puma/puma/pull/480 "PR by @jjb, merged 2014-02-26" -[#481]:https://github.com/puma/puma/pull/481 "PR by @schneems, merged 2014-02-25" -[#482]:https://github.com/puma/puma/pull/482 "PR by @prathamesh-sonpatki, merged 2014-02-26" -[#483]:https://github.com/puma/puma/pull/483 "PR by @maxilev, merged 2014-02-26" -[#422]:https://github.com/puma/puma/issues/422 "Issue by @alexandru-calinoiu, closed 2013-12-05" -[#334]:https://github.com/puma/puma/issues/334 "Issue by @srgpqt, closed 2013-07-18" -[#179]:https://github.com/puma/puma/issues/179 "Issue by @betelgeuse, closed 2013-07-18" -[#332]:https://github.com/puma/puma/issues/332 "Issue by @SamSaffron, closed 2013-07-18" -[#317]:https://github.com/puma/puma/issues/317 "Issue by @masterkain, closed 2013-07-11" -[#309]:https://github.com/puma/puma/issues/309 "Issue by @masterkain, closed 2013-07-09" -[#166]:https://github.com/puma/puma/issues/166 "Issue by @emassip, closed 2013-07-06" -[#292]:https://github.com/puma/puma/issues/292 "Issue by @pulse00, closed 2013-07-06" -[#274]:https://github.com/puma/puma/issues/274 "Issue by @mrbrdo, closed 2013-07-06" -[#304]:https://github.com/puma/puma/issues/304 "Issue by @nandosola, closed 2013-07-06" -[#287]:https://github.com/puma/puma/issues/287 "Issue by @runlevel5, closed 2013-07-06" -[#256]:https://github.com/puma/puma/issues/256 "Issue by @rkh, closed 2013-07-01" -[#285]:https://github.com/puma/puma/issues/285 "Issue by @mkwiatkowski, closed 2013-06-20" -[#270]:https://github.com/puma/puma/issues/270 "Issue by @iamroody, closed 2013-06-01" -[#246]:https://github.com/puma/puma/issues/246 "Issue by @amencarini, closed 2013-06-01" -[#278]:https://github.com/puma/puma/issues/278 "Issue by @titanous, closed 2013-06-18" -[#251]:https://github.com/puma/puma/issues/251 "Issue by @cure, closed 2013-06-18" -[#252]:https://github.com/puma/puma/issues/252 "Issue by @vixns, closed 2013-06-01" -[#234]:https://github.com/puma/puma/issues/234 "Issue by @jgarber, closed 2013-04-08" -[#228]:https://github.com/puma/puma/issues/228 "Issue by @joelmats, closed 2013-04-29" -[#192]:https://github.com/puma/puma/issues/192 "Issue by @steverandy, closed 2013-02-09" -[#206]:https://github.com/puma/puma/issues/206 "Issue by @moll, closed 2013-03-19" -[#154]:https://github.com/puma/puma/issues/154 "Issue by @trevor, closed 2013-03-19" -[#208]:https://github.com/puma/puma/issues/208 "Issue by @ochronus, closed 2013-03-18" -[#189]:https://github.com/puma/puma/issues/189 "Issue by @tolot27, closed 2013-02-09" -[#185]:https://github.com/puma/puma/issues/185 "Issue by @nicolai86, closed 2013-02-06" -[#182]:https://github.com/puma/puma/issues/182 "Issue by @sriedel, closed 2013-02-05" -[#183]:https://github.com/puma/puma/issues/183 "Issue by @concept47, closed 2013-02-05" -[#176]:https://github.com/puma/puma/issues/176 "Issue by @cryo28, closed 2013-02-05" -[#180]:https://github.com/puma/puma/issues/180 "Issue by @tscolari, closed 2013-02-05" -[#170]:https://github.com/puma/puma/issues/170 "Issue by @nixme, closed 2012-11-29" -[#148]:https://github.com/puma/puma/issues/148 "Issue by @rafaelss, closed 2012-11-18" -[#128]:https://github.com/puma/puma/issues/128 "Issue by @fbjork, closed 2012-10-20" -[#155]:https://github.com/puma/puma/issues/155 "Issue by @ehlertij, closed 2012-10-13" -[#123]:https://github.com/puma/puma/pull/123 "PR by @jcoene, closed 2012-07-19" -[#111]:https://github.com/puma/puma/pull/111 "PR by @kenkeiter, closed 2012-07-19" -[#98]:https://github.com/puma/puma/pull/98 "PR by @Flink, closed 2012-05-15" -[#94]:https://github.com/puma/puma/issues/94 "Issue by @ender672, closed 2012-05-08" -[#84]:https://github.com/puma/puma/issues/84 "Issue by @sigursoft, closed 2012-04-29" -[#78]:https://github.com/puma/puma/issues/78 "Issue by @dstrelau, closed 2012-04-28" -[#79]:https://github.com/puma/puma/issues/79 "Issue by @jammi, closed 2012-04-28" -[#65]:https://github.com/puma/puma/issues/65 "Issue by @bporterfield, closed 2012-04-11" -[#54]:https://github.com/puma/puma/issues/54 "Issue by @masterkain, closed 2012-04-10" -[#58]:https://github.com/puma/puma/pull/58 "PR by @paneq, closed 2012-04-10" -[#61]:https://github.com/puma/puma/issues/61 "Issue by @dustalov, closed 2012-04-10" -[#63]:https://github.com/puma/puma/issues/63 "Issue by @seamusabshere, closed 2012-04-11" -[#60]:https://github.com/puma/puma/issues/60 "Issue by @paneq, closed 2012-04-11" -[#53]:https://github.com/puma/puma/pull/53 "PR by @sxua, closed 2012-04-11" diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/LICENSE b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/LICENSE deleted file mode 100644 index 14bfc85..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2019, Evan Phoenix. Some code by Zed Shaw, (c) 2005. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/README.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/README.md deleted file mode 100644 index f3659dc..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/README.md +++ /dev/null @@ -1,485 +0,0 @@ -

- -

- -# Puma: A Ruby Web Server Built For Parallelism - -[![Actions](https://github.com/puma/puma/actions/workflows/tests.yml/badge.svg?branch=master)](https://github.com/puma/puma/actions/workflows/tests.yml?query=branch%3Amaster) -[![Code Climate](https://codeclimate.com/github/puma/puma.svg)](https://codeclimate.com/github/puma/puma) -[![StackOverflow](https://img.shields.io/badge/stackoverflow-Puma-blue.svg)]( https://stackoverflow.com/questions/tagged/puma ) - -Puma is a **simple, fast, multi-threaded, and highly parallel HTTP 1.1 server for Ruby/Rack applications**. - -## Built For Speed & Parallelism - -Puma is a server for [Rack](https://github.com/rack/rack)-powered HTTP applications written in Ruby. It is: -* **Multi-threaded**. Each request is served in a separate thread. This helps you serve more requests per second with less memory use. -* **Multi-process**. "Pre-forks" in cluster mode, using less memory per-process thanks to copy-on-write memory. -* **Standalone**. With SSL support, zero-downtime rolling restarts and a built-in request bufferer, you can deploy Puma without any reverse proxy. -* **Battle-tested**. Our HTTP parser is inherited from Mongrel and has over 15 years of production use. Puma is currently the most popular Ruby webserver, and is the default server for Ruby on Rails. - -Originally designed as a server for [Rubinius](https://github.com/rubinius/rubinius), Puma also works well with Ruby (MRI) and JRuby. - -On MRI, there is a Global VM Lock (GVL) that ensures only one thread can run Ruby code at a time. But if you're doing a lot of blocking IO (such as HTTP calls to external APIs like Twitter), Puma still improves MRI's throughput by allowing IO waiting to be done in parallel. Truly parallel Ruby implementations (TruffleRuby, JRuby) don't have this limitation. - -## Quick Start - -``` -$ gem install puma -$ puma -``` - -Without arguments, puma will look for a rackup (.ru) file in -working directory called `config.ru`. - -## SSL Connection Support - -Puma will install/compile with support for ssl sockets, assuming OpenSSL -development files are installed on the system. - -If the system does not have OpenSSL development files installed, Puma will -install/compile, but it will not allow ssl connections. - -## Frameworks - -### Rails - -Puma is the default server for Rails, included in the generated Gemfile. - -Start your server with the `rails` command: - -``` -$ rails server -``` - -Many configuration options and Puma features are not available when using `rails server`. It is recommended that you use Puma's executable instead: - -``` -$ bundle exec puma -``` - -### Sinatra - -You can run your Sinatra application with Puma from the command line like this: - -``` -$ ruby app.rb -s Puma -``` - -In order to actually configure Puma using a config file, like `puma.rb`, however, you need to use the `puma` executable. To do this, you must add a rackup file to your Sinatra app: - -```ruby -# config.ru -require './app' -run Sinatra::Application -``` - -You can then start your application using: - -``` -$ bundle exec puma -``` - -## Configuration - -Puma provides numerous options. Consult `puma -h` (or `puma --help`) for a full list of CLI options, or see `Puma::DSL` or [dsl.rb](https://github.com/puma/puma/blob/master/lib/puma/dsl.rb). - -You can also find several configuration examples as part of the -[test](https://github.com/puma/puma/tree/master/test/config) suite. - -For debugging purposes, you can set the environment variable `PUMA_LOG_CONFIG` with a value -and the loaded configuration will be printed as part of the boot process. - -### Thread Pool - -Puma uses a thread pool. You can set the minimum and maximum number of threads that are available in the pool with the `-t` (or `--threads`) flag: - -``` -$ puma -t 8:32 -``` - -Puma will automatically scale the number of threads, from the minimum until it caps out at the maximum, based on how much traffic is present. The current default is `0:16` and on MRI is `0:5`. Feel free to experiment, but be careful not to set the number of maximum threads to a large number, as you may exhaust resources on the system (or cause contention for the Global VM Lock, when using MRI). - -Be aware that additionally Puma creates threads on its own for internal purposes (e.g. handling slow clients). So, even if you specify -t 1:1, expect around 7 threads created in your application. - -### Cluster mode - -Puma also offers "cluster mode". Cluster mode `fork`s workers from a master process. Each child process still has its own thread pool. You can tune the number of workers with the `-w` (or `--workers`) flag: - -``` -$ puma -t 8:32 -w 3 -``` - -Or with the `WEB_CONCURRENCY` environment variable: - -``` -$ WEB_CONCURRENCY=3 puma -t 8:32 -``` - -Note that threads are still used in cluster mode, and the `-t` thread flag setting is per worker, so `-w 2 -t 16:16` will spawn 32 threads in total, with 16 in each worker process. - -If the `WEB_CONCURRENCY` environment variable is set to `"auto"` and the `concurrent-ruby` gem is available in your application, Puma will set the worker process count to the result of [available processors](https://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent.html#available_processor_count-class_method). - -For an in-depth discussion of the tradeoffs of thread and process count settings, [see our docs](https://github.com/puma/puma/blob/9282a8efa5a0c48e39c60d22ca70051a25df9f55/docs/kubernetes.md#workers-per-pod-and-other-config-issues). - -In cluster mode, Puma can "preload" your application. This loads all the application code *prior* to forking. Preloading reduces total memory usage of your application via an operating system feature called [copy-on-write](https://en.wikipedia.org/wiki/Copy-on-write). - -If the `WEB_CONCURRENCY` environment variable is set to a value > 1 (and `--prune-bundler` has not been specified), preloading will be enabled by default. Otherwise, you can use the `--preload` flag from the command line: - -``` -$ puma -w 3 --preload -``` - -Or, if you're using a configuration file, you can use the `preload_app!` method: - -```ruby -# config/puma.rb -workers 3 -preload_app! -``` - -Preloading can’t be used with phased restart, since phased restart kills and restarts workers one-by-one, and preloading copies the code of master into the workers. - -#### Cluster mode hooks - -When using cluster mode, Puma's configuration DSL provides `before_fork` and `on_worker_boot` -hooks to run code when the master process forks and child workers are booted respectively. - -It is recommended to use these hooks with `preload_app!`, otherwise constants loaded by your -application (such as `Rails`) will not be available inside the hooks. - -```ruby -# config/puma.rb -before_fork do - # Add code to run inside the Puma master process before it forks a worker child. -end - -on_worker_boot do - # Add code to run inside the Puma worker process after forking. -end -``` - -In addition, there is an `on_refork` and `after_refork` hooks which are used only in [`fork_worker` mode](docs/fork_worker.md), -when the worker 0 child process forks a grandchild worker: - -```ruby -on_refork do - # Used only when fork_worker mode is enabled. Add code to run inside the Puma worker 0 - # child process before it forks a grandchild worker. -end -``` - -```ruby -after_refork do - # Used only when fork_worker mode is enabled. Add code to run inside the Puma worker 0 - # child process after it forks a grandchild worker. -end -``` - -Importantly, note the following considerations when Ruby forks a child process: - -1. File descriptors such as network sockets **are** copied from the parent to the forked - child process. Dual-use of the same sockets by parent and child will result in I/O conflicts - such as `SocketError`, `Errno::EPIPE`, and `EOFError`. -2. Background Ruby threads, including threads used by various third-party gems for connection - monitoring, etc., are **not** copied to the child process. Often this does not cause - immediate problems until a third-party connection goes down, at which point there will - be no supervisor to reconnect it. - -Therefore, we recommend the following: - -1. If possible, do not establish any socket connections (HTTP, database connections, etc.) - inside Puma's master process when booting. -2. If (1) is not possible, use `before_fork` and `on_refork` to disconnect the parent's socket - connections when forking, so that they are not accidentally copied to the child process. -3. Use `on_worker_boot` to restart any background threads on the forked child. -4. Use `after_refork` to restart any background threads on the parent. - -#### Master process lifecycle hooks - -Puma's configuration DSL provides master process lifecycle hooks `on_booted`, `on_restart`, and `on_stopped` -which may be used to specify code blocks to run on each event: - -```ruby -# config/puma.rb -on_booted do - # Add code to run in the Puma master process after it boots, - # and also after a phased restart completes. -end - -on_restart do - # Add code to run in the Puma master process when it receives - # a restart command but before it restarts. -end - -on_stopped do - # Add code to run in the Puma master process when it receives - # a stop command but before it shuts down. -end -``` - -### Error handling - -If Puma encounters an error outside of the context of your application, it will respond with a 400/500 and a simple -textual error message (see `Puma::Server#lowlevel_error` or [server.rb](https://github.com/puma/puma/blob/master/lib/puma/server.rb)). -You can specify custom behavior for this scenario. For example, you can report the error to your third-party -error-tracking service (in this example, [rollbar](https://rollbar.com)): - -```ruby -lowlevel_error_handler do |e, env, status| - if status == 400 - message = "The server could not process the request due to an error, such as an incorrectly typed URL, malformed syntax, or a URL that contains illegal characters.\n" - else - message = "An error has occurred, and engineers have been informed. Please reload the page. If you continue to have problems, contact support@example.com\n" - Rollbar.critical(e) - end - - [status, {}, [message]] -end -``` - -### Binding TCP / Sockets - -Bind Puma to a socket with the `-b` (or `--bind`) flag: - -``` -$ puma -b tcp://127.0.0.1:9292 -``` - -To use a UNIX Socket instead of TCP: - -``` -$ puma -b unix:///var/run/puma.sock -``` - -If you need to change the permissions of the UNIX socket, just add a umask parameter: - -``` -$ puma -b 'unix:///var/run/puma.sock?umask=0111' -``` - -Need a bit of security? Use SSL sockets: - -``` -$ puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert' -``` -#### Self-signed SSL certificates (via the [`localhost`] gem, for development use): - -Puma supports the [`localhost`] gem for self-signed certificates. This is particularly useful if you want to use Puma with SSL locally, and self-signed certificates will work for your use-case. Currently, the integration can only be used in MRI. - -Puma automatically configures SSL when the [`localhost`] gem is loaded in a `development` environment: - -Add the gem to your Gemfile: -```ruby -group(:development) do - gem 'localhost' -end -``` - -And require it implicitly using bundler: -```ruby -require "bundler" -Bundler.require(:default, ENV["RACK_ENV"].to_sym) -``` - -Alternatively, you can require the gem in your configuration file, either `config/puma/development.rb`, `config/puma.rb`, or set via the `-C` cli option: -```ruby -require 'localhost' -# configuration methods (from Puma::DSL) as needed -``` - -Additionally, Puma must be listening to an SSL socket: - -```shell -$ puma -b 'ssl://localhost:9292' -C config/use_local_host.rb - -# The following options allow you to reach Puma over HTTP as well: -$ puma -b ssl://localhost:9292 -b tcp://localhost:9393 -C config/use_local_host.rb -``` - -[`localhost`]: https://github.com/socketry/localhost - -#### Controlling SSL Cipher Suites - -To use or avoid specific SSL ciphers for TLSv1.2 and below, use `ssl_cipher_filter` or `ssl_cipher_list` options. - -##### Ruby: - -``` -$ puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert&ssl_cipher_filter=!aNULL:AES+SHA' -``` - -##### JRuby: - -``` -$ puma -b 'ssl://127.0.0.1:9292?keystore=path_to_keystore&keystore-pass=keystore_password&ssl_cipher_list=TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA' -``` - -To configure the available TLSv1.3 ciphersuites, use `ssl_ciphersuites` option (not available for JRuby). - -##### Ruby: - -``` -$ puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert&ssl_ciphersuites=TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256' -``` - -See https://www.openssl.org/docs/man1.1.1/man1/ciphers.html for cipher filter format and full list of cipher suites. - -Disable TLS v1 with the `no_tlsv1` option: - -``` -$ puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert&no_tlsv1=true' -``` - -#### Controlling OpenSSL Verification Flags - -To enable verification flags offered by OpenSSL, use `verification_flags` (not available for JRuby): - -``` -$ puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert&verification_flags=PARTIAL_CHAIN' -``` - -You can also set multiple verification flags (by separating them with a comma): - -``` -$ puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert&verification_flags=PARTIAL_CHAIN,CRL_CHECK' -``` - -List of available flags: `USE_CHECK_TIME`, `CRL_CHECK`, `CRL_CHECK_ALL`, `IGNORE_CRITICAL`, `X509_STRICT`, `ALLOW_PROXY_CERTS`, `POLICY_CHECK`, `EXPLICIT_POLICY`, `INHIBIT_ANY`, `INHIBIT_MAP`, `NOTIFY_POLICY`, `EXTENDED_CRL_SUPPORT`, `USE_DELTAS`, `CHECK_SS_SIGNATURE`, `TRUSTED_FIRST`, `SUITEB_128_LOS_ONLY`, `SUITEB_192_LOS`, `SUITEB_128_LOS`, `PARTIAL_CHAIN`, `NO_ALT_CHAINS`, `NO_CHECK_TIME` -(see https://www.openssl.org/docs/manmaster/man3/X509_VERIFY_PARAM_set_hostflags.html#VERIFICATION-FLAGS). - -#### Controlling OpenSSL Password Decryption - -To enable runtime decryption of an encrypted SSL key (not available for JRuby), use `key_password_command`: - -``` -$ puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert&key_password_command=/path/to/command.sh' -``` - -`key_password_command` must: - -1. Be executable by Puma. -2. Print the decryption password to stdout. - - For example: - -```shell -#!/bin/sh - -echo "this is my password" -``` - -`key_password_command` can be used with `key` or `key_pem`. If the key -is not encrypted, the executable will not be called. - -### Control/Status Server - -Puma has a built-in status and control app that can be used to query and control Puma. - -``` -$ puma --control-url tcp://127.0.0.1:9293 --control-token foo -``` - -Puma will start the control server on localhost port 9293. All requests to the control server will need to include control token (in this case, `token=foo`) as a query parameter. This allows for simple authentication. Check out `Puma::App::Status` or [status.rb](https://github.com/puma/puma/blob/master/lib/puma/app/status.rb) to see what the status app has available. - -You can also interact with the control server via `pumactl`. This command will restart Puma: - -``` -$ pumactl --control-url 'tcp://127.0.0.1:9293' --control-token foo restart -``` - -To see a list of `pumactl` options, use `pumactl --help`. - -### Configuration File - -You can also provide a configuration file with the `-C` (or `--config`) flag: - -``` -$ puma -C /path/to/config -``` - -If no configuration file is specified, Puma will look for a configuration file at `config/puma.rb`. If an environment is specified (via the `--environment` flag or through the `APP_ENV`, `RACK_ENV`, or `RAILS_ENV` environment variables) Puma looks for a configuration file at `config/puma/.rb` and then falls back to `config/puma.rb`. - -If you want to prevent Puma from looking for a configuration file in those locations, include the `--no-config` flag: - -``` -$ puma --no-config - -# or - -$ puma -C "-" -``` - -The other side-effects of setting the environment are whether to show stack traces (in `development` or `test`), and setting RACK_ENV may potentially affect middleware looking for this value to change their behavior. The default puma RACK_ENV value is `development`. You can see all config default values in `Puma::Configuration#puma_default_options` or [configuration.rb](https://github.com/puma/puma/blob/61c6213fbab/lib/puma/configuration.rb#L182-L204). - -Check out `Puma::DSL` or [dsl.rb](https://github.com/puma/puma/blob/master/lib/puma/dsl.rb) to see all available options. - -## Restart - -Puma includes the ability to restart itself. When available (MRI, Rubinius, JRuby), Puma performs a "hot restart". This is the same functionality available in *Unicorn* and *NGINX* which keep the server sockets open between restarts. This makes sure that no pending requests are dropped while the restart is taking place. - -For more, see the [Restart documentation](docs/restart.md). - -## Signals - -Puma responds to several signals. A detailed guide to using UNIX signals with Puma can be found in the [Signals documentation](docs/signals.md). - -## Platform Constraints - -Some platforms do not support all Puma features. - - * **JRuby**, **Windows**: server sockets are not seamless on restart, they must be closed and reopened. These platforms have no way to pass descriptors into a new process that is exposed to Ruby. Also, cluster mode is not supported due to a lack of fork(2). - * **Windows**: Cluster mode is not supported due to a lack of fork(2). - * **Kubernetes**: The way Kubernetes handles pod shutdowns interacts poorly with server processes implementing graceful shutdown, like Puma. See the [kubernetes section of the documentation](docs/kubernetes.md) for more details. - -## Known Bugs - -For MRI versions 2.2.7, 2.2.8, 2.2.9, 2.2.10, 2.3.4 and 2.4.1, you may see ```stream closed in another thread (IOError)```. It may be caused by a [Ruby bug](https://bugs.ruby-lang.org/issues/13632). It can be fixed with the gem https://rubygems.org/gems/stopgap_13632: - -```ruby -if %w(2.2.7 2.2.8 2.2.9 2.2.10 2.3.4 2.4.1).include? RUBY_VERSION - begin - require 'stopgap_13632' - rescue LoadError - end -end -``` - -## Deployment - - * Puma has support for Capistrano with an [external gem](https://github.com/seuros/capistrano-puma). - - * Additionally, Puma has support for built-in daemonization via the [puma-daemon](https://github.com/kigster/puma-daemon) ruby gem. The gem restores the `daemonize` option that was removed from Puma starting version 5, but only for MRI Ruby. - - -It is common to use process monitors with Puma. Modern process monitors like systemd or rc.d -provide continuous monitoring and restarts for increased reliability in production environments: - -* [rc.d](docs/jungle/rc.d/README.md) -* [systemd](docs/systemd.md) - -Community guides: - -* [Deploying Puma on OpenBSD using relayd and httpd](https://gist.github.com/anon987654321/4532cf8d6c59c1f43ec8973faa031103) - -## Community Extensions - -### Plugins - -* [puma-metrics](https://github.com/harmjanblok/puma-metrics) — export Puma metrics to Prometheus -* [puma-plugin-statsd](https://github.com/yob/puma-plugin-statsd) — send Puma metrics to statsd -* [puma-plugin-systemd](https://github.com/sj26/puma-plugin-systemd) — deeper integration with systemd for notify, status and watchdog. Puma 5.1.0 integrated notify and watchdog, which probably conflicts with this plugin. Puma 6.1.0 added status support which obsoletes the plugin entirely. -* [puma-plugin-telemetry](https://github.com/babbel/puma-plugin-telemetry) - telemetry plugin for Puma offering various targets to publish -* [puma-acme](https://github.com/anchordotdev/puma-acme) - automatic SSL/HTTPS certificate provisioning and setup - -### Monitoring - -* [puma-status](https://github.com/ylecuyer/puma-status) — Monitor CPU/Mem/Load of running puma instances from the CLI - -## Contributing - -Find details for contributing in the [contribution guide](CONTRIBUTING.md). - -## License - -Puma is copyright Evan Phoenix and contributors, licensed under the BSD 3-Clause license. See the included LICENSE file for details. diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/puma b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/puma deleted file mode 100755 index 9c67c0f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/puma +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env ruby -# -# Copyright (c) 2011 Evan Phoenix -# - -require 'puma/cli' - -cli = Puma::CLI.new ARGV - -cli.run diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/puma-wild b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/puma-wild deleted file mode 100644 index 3701b21..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/puma-wild +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env ruby -# -# Copyright (c) 2014 Evan Phoenix -# - -require 'rubygems' - -cli_arg = ARGV.shift - -inc = "" - -if cli_arg == "-I" - inc = ARGV.shift - $LOAD_PATH.concat inc.split(":") -end - -module Puma; end - -Puma.const_set(:WILD_ARGS, ["-I", inc]) - -require 'puma/cli' - -cli = Puma::CLI.new ARGV - -cli.run diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/pumactl b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/pumactl deleted file mode 100755 index 51ab353..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/bin/pumactl +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env ruby - -require 'puma/control_cli' - -cli = Puma::ControlCLI.new ARGV.dup - -begin - cli.run -rescue => e - STDERR.puts e.message - exit 1 -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/architecture.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/architecture.md deleted file mode 100644 index 83f438b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/architecture.md +++ /dev/null @@ -1,74 +0,0 @@ -# Architecture - -## Overview - -![https://bit.ly/2iJuFky](images/puma-general-arch.png) - -Puma is a threaded Ruby HTTP application server processing requests across a TCP -and/or UNIX socket. - - -Puma processes (there can be one or many) accept connections from the socket via -a thread (in the [`Reactor`](../lib/puma/reactor.rb) class). The connection, -once fully buffered and read, moves into the `todo` list, where an available -thread will pick it up (in the [`ThreadPool`](../lib/puma/thread_pool.rb) -class). - -Puma works in two main modes: cluster and single. In single mode, only one Puma -process boots. In cluster mode, a `master` process is booted, which prepares -(and may boot) the application and then uses the `fork()` system call to create -one or more `child` processes. These `child` processes all listen to the same -socket. The `master` process does not listen to the socket or process requests - -its purpose is primarily to manage and listen for UNIX signals and possibly kill -or boot `child` processes. - -We sometimes call `child` processes (or Puma processes in `single` mode) -_workers_, and we sometimes call the threads created by Puma's -[`ThreadPool`](../lib/puma/thread_pool.rb) _worker threads_. - -## How Requests Work - -![https://bit.ly/2zwzhEK](images/puma-connection-flow.png) - -* Upon startup, Puma listens on a TCP or UNIX socket. - * The backlog of this socket is configured with a default of 1024, but the - actual backlog value is capped by the `net.core.somaxconn` sysctl value. - The backlog determines the size of the queue for unaccepted connections. If - the backlog is full, the operating system is not accepting new connections. - * This socket backlog is distinct from the `backlog` of work as reported by - `Puma.stats` or the control server. The backlog that `Puma.stats` refers to - represents the number of connections in the process' `todo` set waiting for - a thread from the [`ThreadPool`](../lib/puma/thread_pool.rb). -* By default, a single, separate thread (created by the - [`Reactor`](../lib/puma/reactor.rb) class) reads and buffers requests from the - socket. - * When at least one worker thread is available for work, the reactor thread - listens to the socket and accepts a request (if one is waiting). - * The reactor thread waits for the entire HTTP request to be received. - * Puma exposes the time spent waiting for the HTTP request body to be - received to the Rack app as `env['puma.request_body_wait']` - (milliseconds). - * Once fully buffered and received, the connection is pushed into the "todo" - set. -* Worker threads pop work off the "todo" set for processing. - * The worker thread processes the request via `call`ing the configured Rack - application. The Rack application generates the HTTP response. - * The worker thread writes the response to the connection. While Puma buffers - requests via a separate thread, it does not use a separate thread for - responses. - * Once done, the thread becomes available to process another connection in the - "todo" set. - -### `queue_requests` - -![https://bit.ly/2zxCJ1Z](images/puma-connection-flow-no-reactor.png) - -The `queue_requests` option is `true` by default, enabling the separate reactor -thread used to buffer requests as described above. - -If set to `false`, this buffer will not be used for connections while waiting -for the request to arrive. - -In this mode, when a connection is accepted, it is added to the "todo" queue -immediately, and a worker will synchronously do any waiting necessary to read -the HTTP request from the socket. diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/compile_options.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/compile_options.md deleted file mode 100644 index 4b4f9f9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/compile_options.md +++ /dev/null @@ -1,55 +0,0 @@ -# Compile Options - -There are some `cflags` provided to change Puma's default configuration for its -C extension. - -## Query String, `PUMA_QUERY_STRING_MAX_LENGTH` - -By default, the max length of `QUERY_STRING` is `1024 * 10`. But you may want to -adjust it to accept longer queries in GET requests. - -For manual install, pass the `PUMA_QUERY_STRING_MAX_LENGTH` option like this: - -``` -gem install puma -- --with-cflags="-D PUMA_QUERY_STRING_MAX_LENGTH=64000" -``` - -For Bundler, use its configuration system: - -``` -bundle config build.puma "--with-cflags='-D PUMA_QUERY_STRING_MAX_LENGTH=64000'" -``` - -## Request Path, `PUMA_REQUEST_PATH_MAX_LENGTH` - -By default, the max length of `REQUEST_PATH` is `8192`. But you may want to -adjust it to accept longer paths in requests. - -For manual install, pass the `PUMA_REQUEST_PATH_MAX_LENGTH` option like this: - -``` -gem install puma -- --with-cflags="-D PUMA_REQUEST_PATH_MAX_LENGTH=64000" -``` - -For Bundler, use its configuration system: - -``` -bundle config build.puma "--with-cflags='-D PUMA_REQUEST_PATH_MAX_LENGTH=64000'" -``` - -## Request URI, `PUMA_REQUEST_URI_MAX_LENGTH` - -By default, the max length of `REQUEST_URI` is `1024 * 12`. But you may want to -adjust it to accept longer URIs in requests. - -For manual install, pass the `PUMA_REQUEST_URI_MAX_LENGTH` option like this: - -``` -gem install puma -- --with-cflags="-D PUMA_REQUEST_URI_MAX_LENGTH=64000" -``` - -For Bundler, use its configuration system: - -``` -bundle config build.puma "--with-cflags='-D PUMA_REQUEST_URI_MAX_LENGTH=64000'" -``` diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/deployment.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/deployment.md deleted file mode 100644 index 2364aa6..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/deployment.md +++ /dev/null @@ -1,102 +0,0 @@ -# Deployment engineering for Puma - -Puma expects to be run in a deployed environment eventually. You can use it as -your development server, but most people use it in their production deployments. - -To that end, this document serves as a foundation of wisdom regarding deploying -Puma to production while increasing happiness and decreasing downtime. - -## Specifying Puma - -Most people will specify Puma by including `gem "puma"` in a Gemfile, so we'll -assume this is how you're using Puma. - -## Single vs. Cluster mode - -Initially, Puma was conceived as a thread-only web server, but support for -processes was added in version 2. - -To run `puma` in single mode (i.e., as a development environment), set the -number of workers to 0; anything higher will run in cluster mode. - -Here are some tips for cluster mode: - -### MRI - -* Use cluster mode and set the number of workers to 1.5x the number of CPU cores - in the machine, starting from a minimum of 2. -* Set the number of threads to desired concurrent requests/number of workers. - Puma defaults to 5, and that's a decent number. - -#### Migrating from Unicorn - -* If you're migrating from unicorn though, here are some settings to start with: - * Set workers to half the number of unicorn workers you're using - * Set threads to 2 - * Enjoy 50% memory savings -* As you grow more confident in the thread-safety of your app, you can tune the - workers down and the threads up. - -#### Ubuntu / Systemd (Systemctl) Installation - -See [systemd.md](systemd.md) - -#### Worker utilization - -**How do you know if you've got enough (or too many workers)?** - -A good question. Due to MRI's GIL, only one thread can be executing Ruby code at -a time. But since so many apps are waiting on IO from DBs, etc., they can -utilize threads to use the process more efficiently. - -Generally, you never want processes that are pegged all the time. That can mean -there is more work to do than the process can get through. On the other hand, if -you have processes that sit around doing nothing, then they're just eating up -resources. - -Watch your CPU utilization over time and aim for about 70% on average. 70% -utilization means you've got capacity still but aren't starving threads. - -**Measuring utilization** - -Using a timestamp header from an upstream proxy server (e.g., `nginx` or -`haproxy`) makes it possible to indicate how long requests have been waiting for -a Puma thread to become available. - -* Have your upstream proxy set a header with the time it received the request: - * nginx: `proxy_set_header X-Request-Start "${msec}";` - * haproxy >= 1.9: `http-request set-header X-Request-Start - t=%[date()]%[date_us()]` - * haproxy < 1.9: `http-request set-header X-Request-Start t=%[date()]` -* In your Rack middleware, determine the amount of time elapsed since - `X-Request-Start`. -* To improve accuracy, you will want to subtract time spent waiting for slow - clients: - * `env['puma.request_body_wait']` contains the number of milliseconds Puma - spent waiting for the client to send the request body. - * haproxy: `%Th` (TLS handshake time) and `%Ti` (idle time before request) - can can also be added as headers. - -## Should I daemonize? - -The Puma 5.0 release removed daemonization. For older versions and alternatives, -continue reading. - -I prefer not to daemonize my servers and use something like `runit` or `systemd` -to monitor them as child processes. This gives them fast response to crashes and -makes it easy to figure out what is going on. Additionally, unlike `unicorn`, -Puma does not require daemonization to do zero-downtime restarts. - -I see people using daemonization because they start puma directly via Capistrano -task and thus want it to live on past the `cap deploy`. To these people, I say: -You need to be using a process monitor. Nothing is making sure Puma stays up in -this scenario! You're just waiting for something weird to happen, Puma to die, -and to get paged at 3 AM. Do yourself a favor, at least the process monitoring -your OS comes with, be it `sysvinit` or `systemd`. Or branch out and use `runit` -or hell, even `monit`. - -## Restarting - -You probably will want to deploy some new code at some point, and you'd like -Puma to start running that new code. There are a few options for restarting -Puma, described separately in our [restart documentation](restart.md). diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/fork_worker.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/fork_worker.md deleted file mode 100644 index 6e12ab3..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/fork_worker.md +++ /dev/null @@ -1,41 +0,0 @@ -# Fork-Worker Cluster Mode [Experimental] - -Puma 5 introduces an experimental new cluster-mode configuration option, `fork_worker` (`--fork-worker` from the CLI). This mode causes Puma to fork additional workers from worker 0, instead of directly from the master process: - -``` -10000 \_ puma 4.3.3 (tcp://0.0.0.0:9292) [puma] -10001 \_ puma: cluster worker 0: 10000 [puma] -10002 \_ puma: cluster worker 1: 10000 [puma] -10003 \_ puma: cluster worker 2: 10000 [puma] -10004 \_ puma: cluster worker 3: 10000 [puma] -``` - -The `fork_worker` option allows your application to be initialized only once for copy-on-write memory savings, and it has two additional advantages: - -1. **Compatible with phased restart.** Because the master process itself doesn't preload the application, this mode works with phased restart (`SIGUSR1` or `pumactl phased-restart`). When worker 0 reloads as part of a phased restart, it initializes a new copy of your application first, then the other workers reload by forking from this new worker already containing the new preloaded application. - - This allows a phased restart to complete as quickly as a hot restart (`SIGUSR2` or `pumactl restart`), while still minimizing downtime by staggering the restart across cluster workers. - -2. **'Refork' for additional copy-on-write improvements in running applications.** Fork-worker mode introduces a new `refork` command that re-loads all nonzero workers by re-forking them from worker 0. - - This command can potentially improve memory utilization in large or complex applications that don't fully pre-initialize on startup, because the re-forked workers can share copy-on-write memory with a worker that has been running for a while and serving requests. - - You can trigger a refork by sending the cluster the `SIGURG` signal or running the `pumactl refork` command at any time. A refork will also automatically trigger once, after a certain number of requests have been processed by worker 0 (default 1000). To configure the number of requests before the auto-refork, pass a positive integer argument to `fork_worker` (e.g., `fork_worker 1000`), or `0` to disable. - -### Usage Considerations - -- `fork_worker` introduces new `on_refork` and `after_refork` configuration hooks. Note the following: - - When initially forking the parent process to the worker 0 child, `before_fork` will trigger on the parent process and `on_worker_boot` will trigger on the worker 0 child as normal. - - When forking the worker 0 child to grandchild workers, `on_refork` and `after_refork` will trigger on the worker 0 child, and `on_worker_boot` will trigger on each grandchild worker. - - For clarity, `before_fork` does not trigger on worker 0, and `after_refork` does not trigger on the grandchild. -- As a general migration guide: - - Copy any logic within your existing `before_fork` hook to the `on_refork` hook. - - Consider to copy logic from your `on_worker_boot` hook to the `after_refork` hook, if it is needed to reset the state of worker 0 after it forks. - -### Limitations - -- This mode is still very experimental so there may be bugs or edge-cases, particularly around expected behavior of existing hooks. Please open a [bug report](https://github.com/puma/puma/issues/new?template=bug_report.md) if you encounter any issues. - -- In order to fork new workers cleanly, worker 0 shuts down its server and stops serving requests so there are no open file descriptors or other kinds of shared global state between processes, and to maximize copy-on-write efficiency across the newly-forked workers. This may temporarily reduce total capacity of the cluster during a phased restart / refork. - -- In a cluster with `n` workers, a normal phased restart stops and restarts workers one by one while the application is loaded in each process, so `n-1` workers are available serving requests during the restart. In a phased restart in fork-worker mode, the application is first loaded in worker 0 while `n-1` workers are available, then worker 0 remains stopped while the rest of the workers are reloaded one by one, leaving only `n-2` workers to be available for a brief period of time. Reloading the rest of the workers should be quick because the application is preloaded at that point, but there may be situations where it can take longer (slow clients, long-running application code, slow worker-fork hooks, etc). diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/images/puma-connection-flow-no-reactor.png b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/images/puma-connection-flow-no-reactor.png deleted file mode 100644 index 05ef8d01fef4050f14713f4276441b285191300d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16029 zcmZX5bzD?i*sg%2(kLlNhm@i;j5G)`q;w;pG>YUPozh(+ASDPWEeJ?RcXx*f!jLmC zz+G_8`R;dr_n(0sv)5j0z41KH`%ajessbSa4Z)2YHwcv!Wi@Wxz|^{N1LH9sCOGqQ zU9|4T4M|HSSt%`djO|QZC#|W(;Q9>mm0k+o@hKHID@xiG#@gO*G`*(Wz2C_3lnqld zO>eJYK8O`x&3N7~VlCS*!i>SBxXKaJxed$Hob?=w^9=lybXs&-R#-Z75;WdhUvMe8 zk>%yEco|3{9m>Hx+zy?sf5*qn%q$^s-ktcMfoBDeF|ZBVn<*x=nC-IGJyYYzcQ|L& zpMg5x^@RusR4gWodn5N+f^HGhi+?nd4J3K@cNT?+_Kl>rvbL`8kGdyjKBt__`&NRJ zlk*ULROah5Ef&oH$*SI~L58(QP+Htr>rSK;{%RMRHy(WCx%K!VTcyX?l_x%xk2#U0OS z9^3G{tSTO+^yl0UERR`VxV(7hCFZuR8(Habu>OW#+&w1i>||Hqr z!@7t8b(pPnwuF6Wh3oWY9YGQWDyjbQ)>5NA$$TRN1(P+n?7E$}d6jrEsE?iWT!rPf<+f(KkRBPo27Y~X=aign@HnVV)Qdp$i|xAmhPXW7t$cE) z_rOeK7Q=d|*P^3uKw?+ec#;9vehpKoiYx*^-X*pY3S*dE$foikSvfF`!1e)&yUu5KVY5DcZ3=(xX$}rxnW5?L*-7pLLVo*c0 zKeI33sv-Sqt2a>FEAp-fNJPeooj*X z)38>X%zBb`yx_Yx2FxX`>!>(g>Bh;YdtD>oeeV{Z>1)uM(ch*MsG$&Sl=nQ`G(+*l ziWM;;$RqWWXK$BIM@0C=z^V71ny1t!F}yE@8@@8nw&HPjFKwW1kI!K2OBD#I4)A}} zpVRBINAdNpXCR3jZpW?PpEdFb7zbw&^c9FftNv9J2Smlb6)$v#>1l?HMqxdc{j$v8 z45NBCCA4f{{ttevj%Z2$qka~;NINFvZF9C`es6WrR-aa0q ze_w;z;&b!4{!NPNaX5;6$*kX~m0??Vw?7%OAHCKZ75wLr^Ti7~Kw zxm>JdU`s0uvvd;pHSz1kU}A>;yNL*x{N7EEDDmf6oY3mPw&=G;R9QSuccl|}b(xL} z$C6NAOf724@}H;cJLh~0UqtOEc#Ml9oWdBaj<+iYrZ;>}N8liCih5O6UGJcKaqp?TtD{%F65M=kb~SEG3D$ToIK#IQ2okK^grJo=R%gGuk?tel4}P9gpq zUvSZHqkqKuHbpv;)HIvu)7-t{+`F~f3#8HscPH;Bg-WEEnP;oh&wNIE_GgX?mCi*<@zimbD+eCek!r>Uq)^UGS@$`MLQILZDc_XRZ}if?=S z^oyfU#N}j}@A;pb_50!qc)xI%1D#uJ%z7yl(Vg(>S=GJ+{H0tJr022?*5g(jItQ=Tw|J@I9@Nl`~RIkoQ zQmzx#3hSxfkDcqEDfI6v#;P+77iyCxn(6Y{o&QmZZLw}~#P_r%<%^|GR>UqzxA)hh zU0r9r4{pPu{YPh;Ci?pNAgvc`6}cR4s(aCT^52Jn{P&TE;87r^7Liu3CZ36cl5uHiX_cWM=!#e_cW75;`(9qC;P+hi z2wbw7lEbvrmp_oSn3&eRw4080bnV$06=wjMq&19T{}{j)2FgM4q_JY1g$9rKEVk!q z+p~27Y;3`*G$42v#Aal8?=4D2ZD~1Y-)D-YEqKoHue6k ze$veEodl%%$R_|)LWu5tyYRg@fPbKQBI=EF0?DqTqTKOr*K2}FkZledYiMZHhJQCvZ@lm$eHrfy{Fen5t6MYjIoX!g%K^dss-rFI zrJ%?_bZXPHM6QR$8)U}S4s-f-E-zUIRhjoW2Z*WEUtC5$ysHPCJ_f0tu8T2%ZX?zm zkxn>UY7GIS{)8Kpn_`4_UVa6MSR96SUv3La+KY>cdFsFUfmTS7dTpBMo@i}7C$ftw z9t06YM2S&2ril9=Hv++j@BE%ec;mR3mWgQ%s+MP^J$bF)96xB2Df+gA{7wVxT(kiH zm-c;J`Ls4DUYLnxosZTgv2)bZJzm3Fr=u-xM|SnT2RfxUGd&Q?a{Y(Lc=E|2|IYDS ze!7v;+Hv9ymkTP}NTD#eqi%z{b2FCNhr`1|Ok-sls*2^_!_Q=KZG3U@;#27f)g(&+ z53OwBWRQiYRsxuAT)5Jged$8%L#b4X+3nH4{qTwcSy*5o#;C@Ex4nXXcQR)&0@!teK_yfPCBjw1xwgmdD`1jdTsd_xdsB3z!(4)tCp=N=*YgNy%@%Hq?*d8)UKq!167B1O+TL5Epk z$9eH-pVPx^UtloejnC5szkb~4fLuImdL1K5V?R?Z;k?{dzuTzn9>4JcNxDui=Elvg z$sDh6+x9?(>{Mu~J(0+3#;7$b18EiSw69*(blf5N~)l?}6(}g#YQ+y$H)9 zZ&SBD?i2{g91Qk{~TP!A`78 zZvSqHwxNQ4h`hsfq8m8!6wUF6vT`>W(%|{VeES%em9G>!( z6#&B1E$fp*9^m{8Hgkg(XDG88N`?x5e#?|c1_?9Kr4*SAWUwgNTyV|_w4D&D8@-g+ zX*T^dRSAc;L8r3tsPMUO3hEUo-9A904nFy~{hg&&m#uV>LM&^mYstY7JE145JZMntbB;+CW#^=^8^pN}ujb`6lB+*A{FAf_en*#5y*uLpSC zU?b$!GO8|KU2R4nUWM9II9_!OCjl8$<(>SpUJ)H0+O})!YRm#_3~44crg>zQtvsPr z8Q+ijV#K+ z5GOM;v%r=08*)KFocxZSWtKpZy&QHfJo|x)< z(H{d8aDI5INR!>A#Qo23F!Kv^Aepg$J5+{em?X!&Jvz|%ZdZA2{M$#03GM89C+0^+ zdViHz?Ul5hUs|rdo%#>~`)In}3i9l%Dpo-`~ z5=jyW-J{2m`nWH;qn_cd-x@F086YSr=SoQAp?E{MmE9ckfHomE_9y!?o@(l&paf?& z(w)benxA5;O~~B>Te74>lSrQ;!r@-K+EJ?K+V5xS!OfraEvZ{Rv_v zs~4q&_Kv)ccQ1-s7}O${r7&*hBdi9pd_WGwOjJ(dUTP7r?pNz81w`46=zJU5Ip^=m zrkbHxcrgFNYxZVGY%{05I7EjkNzoRB3eHaz&4b>6uawb?dMyN!X*$7Kx^9M_auP`h@WP(k6u8ZfTik2i z9syE8TbX-H)+}&c#{s}piuC(c=&=Xu@YM!0S~eAR)QH*RC(R}B=nWKc+NEPBxFs4B)tvJEApH4Zi-g1 zSmwXG7h@-tR+if%jCF_=VkUAz7x*y!79?wb831o^UsT8r}B z*4R5X_JgDeQUpTs)xk;ft(!Cu)LBibE+S;tci}OgBYtnM7I!z_GUdT39C5HO7JhU5 zY{VDwIJV|q2d~%p1s>#9OZ@J zuX^|3eQ;udAzhs%aDs)+HYcYd=Pw=3D9b94X5M@a&Aw+x#g_*#>zn%_iN*;?{Os}q z#sMhuDSF;+{_hXfu=%X#XCn}r$5DZluUF==T}(v>!{8zjJ%aR~d|S4)%g~3(&)i9+ zmp9G`IOX66BSLW|ZH|-3x=vbKzS0f8%=(qC*wrvcowF*)#kX!p66wcrlj|3nH4V!h zO+-eXDUToVaUjUS_t_De)dk-q^tNIe4sJ%EPoq;>D(D}32H$coo%9YAd_ZSIzH^%l z!YjooLUHGM$}F&#^2e3^d>$Rncek*!-mmL5$Gg=uGSAt{bo6Cgx97L|ggkdyww}sn zlz@c6Nw^&EP8GI9a5cny*K_Mm2e3sM3WX{w*T4B4*EXO$RkFjWHKU0a#$dpNzBp+j z7S9IpQOFfJRt7s7H*i$H-K%<~QVBJo`bG+%n#7U6vSmU_;P-}2V5l`hT0xHOBBOg~ zKf#JS(#!9bT7q_ccD)=M5I8f*7149!UkpeE1$$RWyym9vZd6VY`w2ezXv++%qs&XUq0uKNx9qJR1h(-B3XY>2#HBE&rigl^=N~I3L}HS z0Y{Zy4uN#czhzWS5wxdCIs$5vXQtdC8DEUikl5R;z^9Uz=z}YJr#L>uz24gikmze` zg&haF;@K6V>7TbmR5|ZrityjtyaS=}I^NFq{XLx5gly+y0V6EjzZyZv;@9of50#V? z@d*im>nvAPnX$O*gV5#n+FE>VDxwQz`S{kdFLBrs1wU!8y?qka$teNSr zosMWELbrRhE8eKtb)nIxQg7)gZQrebHvf|d*h|MN>WTj#p2y`7$uO8Nt)q=}SC070NXsh8FI&cpIJRCll0b=g; z;5Pky1i*jT5#(tH%;PDb}@ z;xil-7QFG24rNGs{el~WmEUcSgCC_Ds%=Mtd9P_oUpOla8Zwx%5XY+Q{squ%BWXNe zzqPbG%IGYjY>_6AXb`8rp}wa;qBSdv%1N$ zw%sDqw1eEWj3&ULEiEng1mj4hO$&5i$IeP#FM)cEgV8M**8yt_X}9aw_w0hj1W%*^ z^;V?vS_-06xm>-(C;ci3=VTby|HJ~U1gzT1I)-0_3x%(lNQdUuYj%fp@M>M+)BiHD9+W< zkxU_t$4yk+|@roRK5Ul zh2aMAT2C^>_rg2xSz@VC{fkKWTcF-jns_?{{yg6gnAJ`3H(R5>fnXni%Ar%v^=&{QP`g-SUrybuI=q4r@G?FJCgk6fF=hq@SYQwkMZ%?B*L#XS+@C zq@-U9<+dYis-_5=pSxXaK=m5U0M@UFCTIn&?2L4nZ}@#Q4EV1lYzc_(n}$`d#z5*v znMh&7funyhX_}8Z-d(r^tS}=cHFfH%g@WgxdTAbRf2J5Epx@E=x_MyC3Q=zyt^3m2 zH(Z1ap{2`cz?~R`otmTivn0~#&twhMyVn587|$>$wJd;c zQDG)8tgQa%SIss-ym!5NQHZUbRk|<}exQpXTCrxny^Oe}^GGKIImDk_{IVyBSF#RB z&!eHrp=nGyNc-(=DPq-mzzexvl%!;4?yOV(zMWQiE6oA$WF+vVIqgkzKnqD10qYla z99C@}>K!J;!L2;~+2aqAxs4lA&Ybi^1CwXBs$ABdrK1D} zh~bVv7g4z&b*Lf_^$tEp_o5!))LaFf7^D*Vvv#r7vXI>*zi4WnMQIf04^TnK_BiA= z`ab$H|D(2L{p9F<8bP4*Ph*optdPR-H?^i!_J@9PswgTJYUFhTv7l2{EDrMsW)~kS=6N8l|I~&(8>2szh;M_uauDUUP8wdfc#Pme++x1E(j4G9YLQTQrJjmINbw!uwq}p7=5>Xk zp?Eq(wXPfe36<7DspT+|_Pjzhm9P&5-vdu+!otFU5?^KSzygyyjRIMc{pRrS_qVUR zwM&eDq{XS4(KGs3YDaH?VWWFyiOME;=(DY$7k621^kEDU?=abT;U5N z&67cFmbs@l$Ycp_=12$J^y7R+`kv#4AB8mMd(1c37zYA9c4hnRgEsCH(x4Cs|8XL9 z?v?dp!1F@U$dTxNL-5?`9EZt~E>c^2Nk_YPH}L`OV~y4{2xFw0A209d zdxTz@84aT)xw!^h|ODnG&HRK zJw6tkF#Yf_g)s3!a&j^~!!NpZ{tU52y$$d1Ct~8_mP^u z*v-{-<;L5;fB%}hMEf^~8R&n0)P1Rgug0IAnR(~3?pERH(l>W+@7|utT}pGMaH2mx zn4c-;jP>=0C0~xo`cX%a=bk>A-rn668?=|lkUI!bdg~PFaN&KwPHIcAy|#b`rmYQL z#N{Q!A}%94JG<_qP2|Rc2I)+ZoD{+&(nrpYlOs3uwzUsRNh-aB6N%`VPzj_=V3WmC z+&lRAEr)sbO{5AjF>%Je=4-23D&o50OIa6bd9A2i$X%M#!$S(Sl@7Ri`8Zwku=h>x z>5?yB>RKiyS4J9_@;;{>mvAv=-dq>HF6#neE&=c?0|p78ZUQSdBS8vhr%?Nbe zjGN6BzHMd4h`J5AogTHSy%m_Cn;kMhS&ZqFR4hFVr8J_VI zNN>bCzpA}7FScG{XSzI6(!gd8z2yC1UL8+)=0CTmp*==ixEF6-9rZwhcl++i8P%_% zFV&MVm#{|V{k_TiBm5p;`L3Kz8+o3xA41E>7C$6qAIkCrs)^Txhnb&xu27;G@g0Q`O4(4tN9%5fog5~=BxrNWf_q0_)bw|17#&0RF zV5|V|!QYcaMcd)udbed%9&|{Wd{y9t;n9C3oLsq^{<8Y*>$(%*mw&p6PW?@a_liG% zwjE%w2x#tu$k8Ja?P_c8@9;M^fRTwli57gCu^bZdp6lOd1Q7y=HimAKeO- zc_AN?(#slycH=AW;Ir_;y-gQt*J8s)PR)59Rv|(mUYX_(t&yy_G*%(0BF>!-WFe_t z6jr8YuyfmFo^3%~Rv!7W6~CYboE!|WuV2FLWh=Q!wO zJNk6tUif~bO7~8Sm5kZUo4WyOrZaE2JfaSm{z%b%+$UFub@P2~%ilJiBS|G|#SnL; zo-T)qGGnrkTD80=GrsrAW*mfXf^7zhsm=HHgU+{4oZsh5$R)t{>jQt1i(`?*!7wg- z)n%wC?!K25a(&+ol|`NVq#RSI!y_=GB=5lSjE|vH?K1hKGlB zH+Az>QhS~eU5NU8WIyb{NW1!8cNx`E4f6C)*~Xq65yyJicHEpoy5u1FsZ1Go<9Kr^ z6enaPi!KwMmPV5hBRM=e($|`1n088vIO^*gZK1K|u_k6_ zj5A{jyZ|FO0n%p4PdBq#5zx5*fJoPkLBqf6w!|m6Go9%OMzJ#bPV&{(33u*(5Srfv z#b*xR!yyHsxi^|H7|c0h2hcshH&*ukL{!?&H+Z~wk+lCHs?xd^x-SD+K}yZK?xEkY zB6G0h4mD9>EXFW9X_IW}ARy<5C=)qJ!FC(Z912u3g;Ni#A!m93T7!DRQvo8bl?O6? zptNhFl>X}jt>(dg51%XYZ7-{W&++C^Ko2|IdmjKrcGZkR^;~&SA12Y{4ff4BX#pTi=UxC>Th@m2 zl;NIRoKbo5eiB~CZ7L`8Ub_Gg1AH9x0dG_|rvmUUj&SBLUnz{aO&ZaFoSE~gFTTgX zl0@&d3ffOQF(g$Y-ZE!DQ}I|!)M0|CN~Q}tF9VkE&~$#BkwNF(g*)^LF6raXhYFu} zo3WS80fxj0p==0k(}SseCJiKY3F-mNA(~#|`^S$r*n@;4M}$vy7Y3F_-JLZNc9PhwF2LMxtl0oflvF8b>LC8hiePTaNp%+CbLiQy1>A{c!gT&h{ir|$%Xg^x^ z2k@j@l)SPqirThNvle2)`b9Y~?ixFpFDjdXsX~z;K{)!LsHjbMlq7}}MtaHE383dg zECoNL-DshDtgUoTWs34+z2X-v5+SY9%Zf&5KsHq1KqMlBdZ0hM~J1-R-WYUvb0@b zO$y~|9JTN|I&_CkC1vp2OXXMoL>hhGfO49{$!Efa6~|aaA*ayS>DwAzL{b zPnj3_P6ii`@b{hZ>oKk-)Ezw;WfQ%NIs10PC^Q@yonfiF*QI3wWc90+p^5pr+SKN% zODLkw7Af{-Q>~Yk@t)tkt_zH--S z!}28(;rkH~;CD7SJ4T-{B1F__f;tH(mId3WyXA~sWXy%TAG|2B8T))km32dJHPd1% z*ULredWYB8mx=gff^ReGz6qfOQNwVLY5Cad-%B~b6mJ?-Em z!2$>N3zz-*4FX=#FvHU;-@m@g;MM@-(1}%&c5^gup>f0nae82MG6t*u+bCcXVkLnS zh3bO(Hs&oF{+iUIcwsL_v2~#8ef-CzsmHMTXjpfT>EGwn6ZtsJ5eiLso~~8ZN3Frp z-b39+pu5f8xpB-B@alWg2UN&Ahxh78yb%^YLx%6m_J*$o}iq+Eh5AEQHY!AmAJ62M7vjcEG)9 zSivJk5z;)#OutPnCKk8XJ5?F|2r8_`Hbcz}k@V;E=o!mm>cTXs8$NOQsXUvv>B?wSyuQ~IT&KLNc=A66LT~lp-z~l}q^m%~0rJaL_PSmgkh}H;c8Y*8U8S(= zv;SJ4>(7Y)b!x+(a?Kj7d>BU)LoT{IffJM=7SyiOOXSLp_~$UQ>mdUn9G-0hsHF&z->;xoMTG zdUPV&4jD6KjnX_9RO1M`@O^Sai1@RwmgEOc^y|qS^8Fduq7m;2{n={XsFn9ijjZCD zlg*BY$!Ds*V@rMWhA&E!TBJT25cF%8XcRl>_c&cVSudU_e6pr$blP4i9(u6;1qs|q z)oVNSGQotYNcSrfCrtadasY^g->{_Jc}1P=RzPX zbQy7VkJibs^G|v?gpcI(D~RrmoN?Yn7j>=U|xgM^hB&~}0 zqKaSZ*o!@et&>T9bDMa$mTZbAso3}s)wUcFmw3}R^Izm(nsc?`p<7#mc2#d=F3Nh& z9o&xP34j~a?DkGH$Y}{#cja&PY*%@qxCrkF;rfl)4(9X~J08(JzWZdKcU%@O>)sao zL*Q50j1St;!0l{T;lY5xcUDV1ltEnwL>m_7D;aIe4vWxp>-={1zc3A(KEOSEuaD^W zV{H4xB#)%G;Je?WpAx?PG32A>P8r{BsG8ZdRi^zqx6+Tf;OL&HEr=`7QFl=GrM55cZ-*=v^*pn)8NH)Uo{NVijF&GMi&lH!Y4b0wGSGaMuOCnUucYZ>pz}DICq& zOv23tyaG6>QYHGA>HyPXgkf+myXO0eIVXVyO3bRGdg#Z}O=W4JZyya?B7nx@8+C!h7i8eip;^ZK_hN-S4-2HF-fo4RD7y&=bokJP;{Y?7KpyxdJO6S+|s>)TCc`Sy6XGVo?LZb+3d9vLn7%V(r6T+(95mjvO;mM zW4mY1y0vwT#lR_R8^pO7NHJD zpopJ9AXVZw_S&g3@kU@Lu2QwaovuKCxEw5RH}C%=G2fbk{x6C7{Nl^$`N@KUw~PR8 z%BOvD(uX_LdbjmH(WdY)lOvBNOvwMnoElVE5w777(u@}C?1GyMq(HZnz@tasDk@~q z6lF*EiPTVcJ}6GK6Fyr|MzN;Ty6sHM1v>%hH~~N>6^SAUJ(v6W(S+Wexb$@84bV$G zU`|4inwqKw3fQc?{}3BaeHiw}f$|7=!26U0qexmNO>^PJc&H@4J?IdSA;wS&Of3if zQ6V&GRSt7$EkKlAAAmD(F~E>!bmW&Ei~q5s*hTy-3_PW#<_);7DxsO0?hUfJl1?$< ze^wVB`u|uVXU-MZ*(V3t=IU=fN4lW>Gi7CqY>U)KFL@t`ApactWeqam>KbxDNUky{ zLsR=z7zcAZ*xz?&N>7XPZ&GF0#6Qp00jqF@8+5p}N^~DSdGdsV(c>fJFuYOZDgO=_ zC&47cLh^re9Wph5zE%VX<@b34Wv^rV;RuHRKNL^Wj3FNSZ$`QQ4<}o`(L_XmNrKU0rK}F0>`5`P2Xuwt08y5~_7h>61&T&4Z3~dr2 z&nQHlzQO=&Q))oJ*fAC{n@8@YHF?4eVV!r&Oeh?L-Hua4daO4x`_4lo8;=H)s2!m? zuy+4_tScARFjnz6T`M?^+MdbtrEH{3eX!B~cv7wQVyHVBeU8}!Nq%=}^0#cF)*(8Q ze)gb|;6zeqSA^^GV&NykwPVatgYV+s%)F1K4y!9TxyVK{RMX9peR_L>^$u$EIM3xn zlY>}8B271+p!-+5x^Lbl`7fWh`aj7km8w&k`Q>5lVteU1Fj0#xgI`R{q<>>RnRR}1 z#`Dr~%Ev{gHlx95xHXYJ|DhS{k&dB9`ywJh#{Fc~wF)VmZX)+>uc3+`RS0rlw3oqRD}1PTmz(-< z1xcM<45nQ#Z6gZeHa=nOMx~0Rm2GqzJ-7zEAb@k;MJ*K&L`wz^hkn=pF~0xHz+u+I z+dA)6Vj*1E*L;Wa75P`^)T)QCR}V=$ZD%vS=2}Ne!!}(f z)HSU;m?YXth0DmP;06zVsFClZ>T-bg8e&Nz-3Y189xdffozgAwA?ygPq5 z&-^mueAavG3E6%5iI@SFo9Hw6e6I5$>v7)GS?W4k<3q-GSD^#WLa|1)%73L znJ;naDDbiTu~74t;R|-eGQR4Iz5PLDn{j(np(KJbK3#_6r;F;Tn|bXeE6-I?pl|Ps zbPz%8(2vut;YD=bfcZDk?p8M9JV2rjM%f|?{L!^C zF5QlxTsC3!&Iq)Nf=&Y+HMMeggn8RIDA>(+_xGy!oxs4SuqbbIrdDQJ|&n zntv%3NnedR;ibzrTD39ySCJ6^m~Q%fVBop z4bmMg;Uk@)vw92r#TTQXnH(Yd@knG`-$5|+9{q8RvK30ZNQ1S_L(U(wSf{LCVu&{0 zpVWk@{h`IL#VZb%Abq`?w-9t4I!2$Qeg*!VO zJUJ^17K;OV1U9mYii(DQnga+BiV1Y0zo6oIzth0+$5>@S0@rm|7?|*tJRRjSwsY>d zSm$=ff7v4DK}$~{9;#weDW zE@!Qw{grkRMk)Hyw^VyHB=#0d zc#N6>@Fl(~WHWgGFaMj(LB$qV)c#t6M~mO1seURHf>fo;Kpqxn$kC*6{Hy`wPvHgT z)7vB&lw?^6^+cOAwt|-C^1}JKyP=ZTRB~7z_Wsyijqj1@^(|h9o20ga=52VdTwGjm zi0DGmIXWS1kFWeLl%uI_cduo*Potsrma@>?jOJ=wfs}0O;uwGm zC+q2sY{syc-3ci0Uz{QAFb4L^?0pwkQ|AqG{LA?S_!XXrJKP$JFky`H&&@FHPU7jw ze)BM~%S{&-ut)@rDVc*JEl$c}CHw!}?)09kNxH0IpJ44~d{WYQ{X0j3YtfU4zj1$M zA^jTcJR|Fet>_ejX6!Jimy60A0D25$0sn!JUndMW|Mzj8!cEebt@G4@!({T#-rp>3 zEiAIRWtH?giNbWb82u*kpT>M^4!?01(;ZtDBM|eJIt7ODkG%61?zQu+!^Xe$05tah zNE5Mk7CZRi+Jus~Mz8xe3P7c$rT3QDrwc!SCfM+zd2JEo>4yQmz5je^!&Vb%WN3&+ zT7YWICGjUvv1@N{FDPI~cXTLRls{>V92gi7@Q`TST%0ths{rL4TXys*&5$*H`iCfUo(%WH;j@#yFY zD=YTf{phFuuXtfe=k4+)c0#@YLKDjqoboo zM@K*ems%VfyAz%F^5x4}_Ivm4-K?puUfx(=ZxL9o|NdP#GBQ$JRP>Rnq`3GE5lpA$ zqm4hxyo5gbp!iL7X+vET zDMd3Vx0Bb{NROQahesbTR~zc;E}GVDqxb8S5~%7fR|!? zI30V(zd1FP`U0QsI~lCgeB>Y}fBiA~(@ao_CemY+0%nSjhe0cdPD@W;BF9ek^TQyB zQ>@wCv?&@ewIg(?xjzAZ#o5!-L+X^9n`;`jcyQnEvq-dOM%G}DB{gcenodsMO&y;hkxrG{MfrQo z9hR-pB?mS%MV#pG_4QL*Rs$U)K~+=CQ`&kw)6nF@`J?=oWy>1_P|T~u~;Z*OmMQrE;} zVQPvR&r<1|7XR-TNHd@^@ALoVK!dq!SlwUPlSq?)MF5!$n9RY7w}%wAGBQOHivJ~q zgy9^>x-SX1czEC^;oZ;j{5?OPwOc96L@@QJP2qmp&iDR)Rn-tI6OWE@71cWw3c4H^ zo8sP9F)yib>ZxG+pS`TC@^kkzHJLj)8TR|G{zIk)Q#`bhO^kDvXo2<(Ndoio)~%G!)}zi z7Jd%LZ6V&D{f7RfEe&MJi}I^Hc`wGp>SBX6c0(fC??*m*)5IIN2-c4qzFQCW2PwT* zSsGuJqxWNGn^`S{sJGsekotr?dMF+vZqSkQ8=7V9 zUHzPUZ`HzX$R0<_oP*A@B{x`g16;Mh_cT4_9=TFO!E5ZCyKX7^ re-Q4o4mAP$=8Y<;dIAW+8Q=B>A1P;&V@mL|^BYQXs((u_XSZ(M7QjXWS4`F( z*WJ1$xvePse{%h7LmlBTSkCE<1CD_&i&<_XJhWlOd- zq}dZ&f%VFHaT@2Bl4Q}Hht})QI0Lr^gO(J+elp@`KI2?IaLv-NuY1G(q==h-3X64FQ&l1SS4T)}18LPXqNu!k^Tj_h8hKtmNTK=aoih z!^|&=@97GDQVUG(HZ}}37dRhmwG*ITitIOy=aRm{#SjW8Kp-1Dn=syrv7h)g>PIh~ zeppfvO1pd21J>c**dvD@>MJG1Su2$I0enpKRLaN>Sw>&+pfiF1qRpqHd#B1Kd?^8n zJI-S5Y6a-4?;kIr2PXu2m$~I>9Uwg^RT!qNg=Sd^n_qohbFOEK4Kbc^tmAG#rG4Tb z3R#P6J=1@B>wC~siWn)WBn=|wTfPArjJb?jp}Eq}J}XJx31LTZ`Tg9TZ@KOqbcy&h zcPXiYKj7bRIIu0Y;k72ZE^4;+=TDCn3yRH!o^|S1?4R*k$Io8I}j z_ZCh2o%Hk>!RuEWPQGQyF_!mRcm$sP$fnI_>%Rzv$ac&#QyA0QJYPFKIeAGWMrNSk z?Ct3}q}zs`)wHd4&^u}W_AQ!&qkMA)m5VrykGLz-FgETdY|5D(=kn+HLp?vW;Ba`w z9Xu94Sy#Vr(l|s`EF`K*cYZNYUdvl2KV{yKu<((VAY@fjS9e*pxilvT^az7L;7_km z2ol8cq_VTIdBpqT#fz#CEtF+gKqRNN_PlceEpmTxP-0#iJ1$U?G#i39Iv@pW>y*f6MduZ8$QcEV1DO^QG z4)$j{sYyQv-LZ<8iN6XFVg#>MmmN^*zIs)0%@R(1e6Ja!{@0o*v4IB;VZc@2Z(ZuP z-!&LMkJNbu^$V>T+QJ9Z4i0kZM-C1ga&AeolSage8i$p!TyuoVvd|w$f0vh+FO%wp zMbki3oWi_K4#53W1z*wI1qA{-a3cbwMFu&!Xz2~c?3jkZ*AWi&doSiJcDGaZ+CHp}rSHDna)DKzOnKN4 zb4b{kT-_;T)pVI9ic>fwB_HqpQyLo^Yp(XJ2>XDgr#&^qI|<29nV+A3<{>C3I5#)9?eLhNpP!8}5AA1`*jO;8 zOhh4x&DsacSOwjf-c`Ok#+6e80|QrASHS4*l*0_}JgNbc#7}-d6$s^s?I)9(4V4tt z5IB726DS$u@Zp&P@BT&;6QehtKnTh3J8aUx7f31g$P55>z*!E1Ixk~k{Q{Mdv?QE_ z3>EE3?4(-_#Bu1xXvqD7HHGl;lN0BX$=TV6NfB+y5bV#gY3yX51be3rbA15Jkzz?HHY@00eA~HZ$8P0c>sS1&B*RFFAy{!2{|^1@P5&TqHuP$v9MTb6A}=3ICOM)XE8ig=qdtTV+nEr4Si@^dOG{fo0S3eG~#|y zAvVbJKz7Lbi?_nhdyl87{B;`1bO&7s;FAx~M?G zqMsWWk~xd(vE3>D!E_6mUK()F`dWGx;9m#-Gq+dB#BV@=OX9D#?ZCu1O-EV z_Srv!O~rrGQ+#ltn^LWPvgieE!{ggIq~1~a(B11vI=KwMDo+p(gL@l z318D;jTfIvOIRkWYiQ^ryLEVY=n#C#2mB2W4-f7&(a|BlcDJ{;_kHW@H*dIi3+AV$ zjI_U2RS&RrzMU>uOTwR-nW3D7UOT{Gl0rhi#>bBl2!zR@m5q&rxHxxkG;68>Pm;2G z-1^U-a(a4mEiEnM~AYsbgOQ&UrB3vxMPyM!oj^GkjSiGDd(Hy4*+ zjuD)!jkQia>_cVSX*Og&lBMm}uNOvm-y0hxP!WyR`UVC%Iy%c2bKBe7hlfr_U6eF5 zD=Kz&yhR4)Fp#`tWMpX8`}a0BLf*mL-oHP(x{@quuB)4xoa~Y#!e59x<4Py%-xH(P zLt;-^pBx-K(mRyl1r#GtuMQa$W?y&>0$ne|Bwc6*o$s_J$w4_dW#zS+*#F zPnaOMRM$H3)Ya4g`e3|?D#*{@0C{m%GM3fb#@w7}BJ(lU<>e(PA zF>qD-?8(T;yTlJN@yi@1w-+ zOl%=iuK8Kgdjmwf15DRi;URAxlD{!9U_xr{N%! z8>2r9Ib=kurM4$E=~ZZV^fQ=Bdc~^1@|dA{gu;6$)Eg6nQl4qddD}0kvD3b>eX8o} z7hJqLJI{_nDinKAA}&&lpO;$4)6(uka-+_n7%sqGQ|dWO6p|ED41g#SqU)c7~#)DoRS!PW56t2sFmmYE~$IH8D1S7RnjV zt~U1lQ_O`rJ0p@;sGy`WrV_@Yps{IIftjS9$QsT*Gtw@2+$zOmn~%p#-|jVr?dj&` zkZHL@=j38m6mm{cm|ccL5{mi}@rjbtiHF4!V<11DH8wxGR{{(n__4T{Yr??5V6S$2 zMTe#^asKuzfy0RC;WuyI$ad1kVr*#8BBTPs-~yT-TLRUd@Q0RU6Ku|2UV2@BwLCP4 zGkBh+R&F=RMP&5uU5?j}kCQa)HUtSFW$)2>8Bh=64J?eUthRKXoV`^srlq6Hr)wJ; z(nyGYi_4l||1n=;*{!8;P!@@1)q@&&i*Fg}7yZU&yp`LQ!$w$P}#} z=Toog2z`6@c8q^G;LVF$v??n2REuYPaS-p`l~d9HQoMG0PNgKpqG_rgyF2C*e2|Y? zj_&TM^jVgl8TROvS(~RN=I3W-F8udmsq-C_9+_)~%8A=)j4cXDVYYc&A3~eeSRhpT z;!=TKqu+F2%&%)mYUY181t9$@x5@@LT_1Hi zJgHXf^mU-e@(-+39hkzzz{KcU;f^JfTA`QX!^Oafd8)*o8N#f>hi%X3UwJ7ZN8z+} z=cuPZ??v&Y#J6wbqci+sc>Ln1>$%Yf%ut;lhxV_k^lDAqPG`E*vE3Us(eSac7l|Q4 zfh+4HhY%=Ce6`-6=#AYx3zUHw%D1HABV|CK%dL}6IM-o3%vIMAxJ$hk2PcYyFa=l; zc6WD|h(JtnjJiIq=-i7zSv%L}$qRngjI3N~Iby^gxi4rr_QMx_s-f*!{A#MFP6pEbFlM%i*Mj)@EpL?s31(sVX3fTPQW`aJpcl zNpAmmCF+<_qb8_3(9MQ}rOI!5%k6Z|MbS64F!tVJSK!qQqP~M!-=viiE3PCC-lmLL z{!EYDM1oZyoGho~(fQs6`dy;pO{?Dq7qRw=B6GcX$Y@jZ82f$HSryM}Rwqt>Qpm8X z)H<*B*vyc+@OA9{a_?40pqJe3R>$rxMNO&;>dtqwZ63ZeEJ)cLmK@{Pe)2*VaFiM7 z_35<`?pX8FI0NKr=Qjo<4g<1|Tq{3+aPI{t4^;o;?{9FfRW`5}J$K(3y}WG8LpVLl zTwy~h!lYlC|4^uCB4o@V4~yykLV14AeKG@fswe0LDr@ z!R{VB3F!|~o?Myh%<1{j{rdP&KBCOph3(GBd<6Ef7BdvgH&5ao7&;EV!WM9j62Eo) z_X`pDUND>y2ghu{W&l^*2hy+`!rk({Hx#Xz~TZ4&$gD;@7mjQo;uUHzzIEu11`Go5!|z%&p& zgWo?1#rJ=7$Frs2M@T<;;#*|qcJ%$j*6vJ=y2aq@K?6i_CTawC@UqfPc}7)UJ^jPk zQBA|um1oYx{I+xLk=Uqp&+O2}uJ^-li`Isdn7H+$(aGlx@jBO)18^pn+>co_HSkcd z!22sMyR&s{8Lq!Sxy&2wIFgqutE$Rbe@X0A;C^rROSqu#Ep|f6tyDfl&TO5N*{{n- zh-GZGBw!n)39ab$1|(zq=={Q?B5K{+`GLC*`Qw8_c#A^0q9|&!9~-}*!N!1Ym4yqM z72(KUW4rhI{hCJ(O_WBp<1CC7K!I%x#OhN{2_6N{OTn2MJBWyVCh>jchIyw!32uB@ zva_p;y~>9%u?D00st(4_o+WJk-SkTG5?RVS1tqTqi*uY^b|l(2j7K8m#`lVdso-kc zs~0a$e^){&R|U>G@sc^LZLE7gJ8k*?2?lXX=%&%W6B3Wx~8L_>qf zs{1#TQ}1T?5muuIAF_+Zyuw@`H=GE02R&UiJV;8+Lo?+e(4~$1P{`fvIP3cF*8Xc0B@f&sOyu#_#NfihLQ~N5+_u(M%Kf)J0WQ_| zhiJ`tp}2sbkJ-&s_jh)7ZUPTvZg%m&r&$y3Zd#Mt-K2WbOJ(}D2je-o8^?^JGr)Z2 zbX~jI@o)foeLPk1aruNl78PLck78tG9J=48|0UJO=N6+VrW?u3hwaI7hvkkCB89ja z+YPuBA#SfJf@2Vv~Ft%jt39X&m!na^s25*ew%Amd_EU2$rNqa}q_EMj zFNBcJOFxFE7*jDAj$#wgMtS6=JhBsC0iXti@w12X@)Dfdj zuuv@M>Ve3N>cdDyeyt2~wsy;Eb2nze11#KiZv9Bd?M~xFD8lJF#r#J&(QfKeU{=~k zCtLMyb^eBjh9k%P4Yf-*ixH?P01jwjtDYwj7y|$Wcng4lp*Z;)tN`0A{q!$t{J&2) zAj;h8zfw zwG^{t8IaOk6=4d|bgR>asp$Fu4Vjx6WP&0fQ2oEZ+~kjYAf~cw>W6)j#9BzGwjF=B zsMONca=zsFZkaC;2r_WrC$XeE#F5tli%N^`i=Q*M55Q#DcXX?-Cu3D8 zBqXfe+5F}WN^X~6ylYxuZB~qDJ&?4Wt>v>7FXLV4ryehq7c}XL7Mqy;sZUuKx11dv z{D>gppwbQE*X(k2QirKheJI?^%g!Eh3cEblT-C*9sCDYs+wQk`o#DMWrx&uZzdzrf zda#?lEQZ{hi(B~h^|hPbuP;>3GXjbHZif9+`JRGta$%va9-EzxjoqF z<>`X<76%y5tPYIGjjY4dbVs?$zh&H`V}&Y3-WSdlX=N*kqPK^%sRK-RwI66n%Kkp4NWWar@#x?;-F!nwE( z(11ct^B+N6iq}}bvP*lxP7dJR-l;?}X{x#!HB1TXD{2C_;oZ)UAFKg)J4bD2QOreL z3k)_pO*{%Gsl-+zlAe7~yIi|hd(jua{X@?p(*7pMn^1j+gtMk=NS9N_fJL-mNhT>_OKr#m$Zm>3xQ zozHXRBPSZfIyIQ0_g$ct62jjGmwF?H`Rc zd7qDpNlNPd`IXnU7wEBfS*Bg^$gWAW{B=#y<@wh%VRb|?`^_{F_3p=i{0SvrYG@e# zNqX@5q~pFF89Di{FS>{4$6I4Vx5o1d3S2fvOpgDI=j+b$A!gstS3Qy8g-TTsYcSBVHC3mhBH$D7T)0 zK>9s3M7Uo04XqTp4JMIe7ab+R`n@t5wSg>tUQFKT{>vw6Y;0^j!-L>Xs;RN09x<{d z>+-_Rs>wEzx@b@xdx-`>4q@_adY~i>bdgh!q{s&x?bHgoRa*q_G}a)VG`+ESG0m z7+R(Z+u4$2itN7cz}0x(>FM+4|rW3Pn>)-7HmHM z!xfwe_r4N+z)_oUx;0Ug1gX;inQK#fUOj=(U~3IZuJoFqCC5WCKbn)RNg*9zg^Az?`8y08KQs*h$#N6!7fZ=rU zt5|2SVmOvb0Sz7fpy%rHqF*}mk#Ii5SW|%f={p`n)2qv)QS}tEW}Q-fi0A%o8`HrI z8}arpq1Jrb53M@OLbFBq1fOzAN@k#uDm{wsKp_v2k4@hQz}4WApBU@~I$G=+kI4na zoVUx=qVvo|u&m+;j`~_ss$)&LUVJe`gRyew_aUqc)ZuDRpFUh@Wq!`BF4OX=D`COp zwL`<%pL>R#Q&p8Wh2#E(?JS%(?ux%&|$3OVk?3#Ks1cO6p8*&Vk?E2AJ4Qf> z4mgO@bY*RZGM~s=0P6cLKJf%0_TkUiN_V^}mAU_CQLJS(Z|`gJ2e0hizi9BA4bUjV z%%jg$(}W!Oq)_K`E(;8He8sar`&N1Xvr1|?W*yNWG24>p_FKp3b|dp32IiU`!r-Z1 z!clxW@kyEh%%h!HUY0&-P1ez;H8dQmOwf5z$+tNYzhtXi;vfo(M`vRJxf1S2QXi}l z_tNQtxHviaupa4sTzieJjzel8r3xx^91Nu1inWF4yAJ&Kg;fPN94YG&Z&7s`k!hAd z`jgI#B8KnMhFye3lt|*LDFqnDYi7|$q`x244^fymJ5P7TGKr$KP(99#9@_2_Av@%F z^_D}^v!jcG35v)|L~Tc-8^5sdF|d%ya9Zv8nBU}ax=WMZ*jJ-rNEvlmLmHuVb+K@* zhB)lyZAQrOUDO@ALfcPgJ2t1_ z50j-xX|)VlY=iAuhED3sx+j)CNc^E^ZbmQxxB#GXlVm{Y2bdobKw-eM0A1n$*TnZ%(Jo&UTUpS8T*3`TR?K%C|pbVUy)8Gobzjq!33v z)?hkzEY-Vk>fku4zQWnmJMmtf7604&OVI^H%}QK&Py zNOUuEj6{i`-LTD@6h@lC(7cIPkX0g6Q1LZ&RkL?t>#~G6?KzG^jBe$Qe4lcb#Qj=ojz0;{_+hg!9#s8RlP_IUU{ zvIWD7REau8ZU20}#h(c{d)C64VncCo9P)Rkof?oPH{H4BU*n*h`|lyV z7Z_Q>L5(j3+d2uD;@-uumCyCs7@Sxv`eQpV*Y)?2rd-FtEyQhWHJL8`{!R{Tq&lcJ zatLs!4#Zc4xm?M;Ck|WJUf~RW?RH3TYxU)uQv0_u`IqW1DGnlkLS|e1-K*0U#pCyL z#VrPyi*<((QkK67+6UfN{9E_qiN4?{Vf5^Z>ovEw*Q}k zaN`t!9f7g{coI?+_!?+9eEGs{<#c^@$)=W`x#;ZZsVyLfJC91_xcfO-f#DSDx(57}PoDMF{z05k^HuegtJk0th~abnfP2ol+n#2(YmH zv`$P&pl=4T;drz$3 z%x!Zdk3&1ZY^u&_9f%unakq+hol*Xnce720v*pIdzP?UE?9SDfFN*Co$RKl~CBJ(j z`3$NIThN3qPIfLpNM3$1=1>JQ4 zWZI|=(^@u@oQg`+;kPW=c&;KTcOZqAr)Raz%vxC}+InA#(^6|7q2!s*GBX>SQ+=!k zOMV03J~0dXOKnNK1~9N1K>9$5ysYdjTg-3T_poV&{Bjv`{gjy#*z)flEEyw*i{y#q zyG(@G)H7&ENVGIGeBxDTel@rqW@l#uSY7-H=wn6bctvHUh2aU~=b1{g=u1<1c}(F6 zFnUf-4i*7T2zL^U`KxD<(DzOwW;VVVmiy9EIpqOk-|0wv0B*u24RsS-@{-gm5;owj2x&d^O|HGSc~-Ca6DkE}a=UIYNs)D;I8m+|Eo zKJRYQ4JO5)!~rGzi{3XLFuAP}X^DRW2n%ykITCX3U0wG~`(1Tb)*swNYCKA|3^Ydj zJL+qI-u=&o&4XpC(9i~Dm~<`VW~3WJeiO#$H^KJTu{7ZSq8|<@kd}1++UQ?E99stf zK3v}ea*1%JB;ctrC=6Oya>aWjX% zkNr2&x_pU#x$4_!F!7hV8yxjvL7bMlc1D5X+3fK zTHJN^O z^Ey1=7o()5rN8t8YIM*@6FC&$XnsBGG`PCDnxZajH?I;UC|%XSk$D`1)cEGA%N z+uYn-3}ozj)e2zS5|$wyU0kWrLbkJA5IF!{!}_mYQLlD&bpfa*6LCWrpHTCg;+vp# z0-`C|KRDQ#KlXlST9An;2fXx|mVL|us9(LWkY*L1K)K^qY1$ux>Z>{3Tet>v4t$eN zueI+@e6XF7oZMw3YAPl5P58hU`?1#6hm8Ieag$^NscAwRUVw7$G& z@%qpejmD6q>oL`%zB}J||9&~1uJ(Jm*%z-~DcyZCztk3N_3Mk<<@twV?^vZ^HL>8` z4t40IfG_|rJl<;aVYJ(zO#Ko#EFnD#tT@3vjoZj(0sME^T`3 zbuRE*w(1$9s1+~MtKZP52p`&k6E#FV=nvco{!L$zh3nckj49DzsmSgMHDLzv{!AVi z7XEdk@AUY-pq!mam2MqJ)`SnSKFF!j{bJpFk;3!IP;W_1dN|2?EUlm|-rc*6j;pvf z)WWuXJPr;HG{L4O_^x&1`Zzc^`RjwSuy#-7B%Zv(==a4IQfs4+5L_<%3XLEl_N|es zY0Xu8F~ePZK-;xmqiIIz4?daYYqI+=DC*p8bhy81rw|DrFx@(7!U}JC`aom`NS(G` zL0bH7YS?RA^L8Su!=z@SRopFZX)g0F*Zx(VQD=izt87R?i;?y&J0Rab8&Os;pw)8+ z+2DuUm^Bb=sZ;!lDRN(k zB%3jBD|jUGpYa>r1TR)E@7H~rX_;rL`mQWO90h0Fgvp!By2=&MMk$e6PRFD+R@@^v z^-KFd?(io$D3qCJTue*@ITvsl~)f+0n9VwYVN$1{^A z>c1SiOaHXAVVZOe{yCI!l!u9w0t4>fe;+J=y_~pdBj3njZ!I+y-VXS&N>p62P zQ&c)#t+m}rs6h?B`H9w6{|soPecbDjZ~z29sMOBTz<&pO;0xP^sxK5Y&klpLC96dO$m8kPf)kO&U(kkVc_7127Cz^j$S5;W7_HyI>W*yDV z0$t)D`s4O;5`b!VX+$gsHlc4ye`Z-o#w9ep(p7NJnkRbliKmdqFlVqTqnwbUT}3E? zoA9zwC|WR5wMWeDBemqJ$jO8FL#1-=BDHh{icB2xn?aKo2XQYzN)dkvGqQSzbM{3w z9+```KMWP`zLd_a=DlG4Q?bDOo(Zpq^~+4fy3_!NHfBX?aFo6PVhg&>6r4x{XL$Hx zxr^2!4$hXn812%(uO&$A-t~!2QvO3?x#Ew`TU0$;Ij4wrv=$ms_2L$r*Qpeo--N)s zbswhS8A0~ud4S&Cru?Jt=ljjNjm0>4Kf!omhsH5TtNFt5DA!W)5G9fm2P2SuZgSi{ z4Vdjs?g1Ee15^KG#+!QMM*g`;kuf)aoM9`Sewfv-4J{a~q%F;iRIT+)xh|#tCD{{B zK#BRKI5;q1dVrBg^!E09Azc``a57cir#9MOOQVDd|75rtqpPJ3qLU~1Tv=)N#^1er zS0oOq64UN3MaHV00nRD(S#EQy_3~{U z92~Ibbm4ApH+do*$p@FqzG$Vz#t!GJ-j~eFgs>xVG|A)OBN?{u(S0?Ql)~=u4}T22 zA7b|sCt8U-m&GQ8kiGI1U4c@1yHYhcW;0giN+)S(@qr`)$RG`{%kR30gXg$xIS}j{ zy7GCl_W`ioSphui(M7bqe`rj^ee32R%-p+*w_XX>`kDf+{BGE}SJsY)t*X$C&NxSr?5 zFXkT8$==wo)dImKl4S5vf1V90Y^dez;^;rl5`@mP@Mel$Kw!)no!Q8}m4uX3^=^L< zAw-QqLPCO*v*($R-8@aFJ)aw1jzLm5oXG5`jh@6bU}zu9$>cjw z#0>WKE{9s54&?NU+Owt;n&sVW+zl<_QS<<*G23h~V^>R>DsJ(Mi14Kp8_)p$@+oY| zGqz;u)c~i;R;K@^?W875*)2>;@?1?scp&C*jPMz7`Wqg$9^my}QnRqnJ}A8a2HMp? zrM%5M;A<3&-;}A5vV!a4y52X?TOZURfmpKKQ6tASA%< zZMRywimU( zW%OKe_ga_CR%E;Nt_iSy$!$897+>d2vumv%u>0`VMWs&Ij!;lGjONd3H7|5xLlkw> zX8X%$l~;lX_wQ;>XU3vy5(xE3raWIC{BW|uO8jU1(rT`-y^9XrgNP#kV{SH&O3+N< zLYbEYhwAj`_Ojb;|4Yo*owKn`{_jQ%wOc!e?q((AI4gAQM!Rjq2LC49UDQS;X{D>Q zcNNj(_~txFdvs@f{F)IcZdH%$*8JyTkH?)iWU$MTRBqStoerj*UG|3P0w>6+8vKK z?moB+5l%1MwHv&)F*B9^)vbaisg;1PfKT6$M$6}+KRH|UM4OawN8aLPrA!jRtm?2w z&CAYqr?bHXoa22+=Zg6#xeC+RvLMhucBZVx+GDHQ1M3NQeitLj`CoSADzbnh6D-iX zuEeb@h#U{X%OR*j%|fQ8|782)fcLZX)~PhC4wMp}`FS|x91!tTHI$kARacVj)M2P7 zy{?APGC_N4zYWK0FX}U68t7A3Gc?(2s%5sp>*StgZcxV6bsI$E!&h8S_;Z+B2#h z5megm(IF7{guX|lpM?;}TNk_aybm5c0L@bAw{NqH1_uXA_3E9$AR~Z21^s;wqIX~b zb~LO2MBplyy?H-BzvN`f_Oh_)s(pNX{)`tZ$jK4kIX^!K@(?9b(0YyFHYJ-YIKGMMag!8~fJWoc$_C3vu}HrmzHJ1Cn?Ud2x|6 zYzT@pno5A6CoR80PF7Y@`ZG}qHT-c40||Nk2gmgAp6%S{nR=l}0~URN07xC4t+TgpdJK4A_RjhOD@7nU^~6O#i3*ne>nqPyPNG zUKAP~4Ht7MVS(~LzNwkO_S1>CDZ^k*YbRu_%bR-lG=Ww+I-7BQ=O&d$Jp*Ux{_$}j zLy-InrhhN|OPdg*K0rkNhmrif6>z9S>l+~t?A|}6-+y=h>&ySz<1e`qC%Wqz3!LR9 zBifOis?3`6};;%pAP{(;*Sy`_pE)%RJ^2?ZyQz<;aV7j;~j zi=G6A{+N_>s=OM+zaswW7~Mk$jq?hfi(n#cg{|RMcPUAwaW_d?Kj>AJ*7G(?dY!Al zB`=eD?t-lK2kS9KiEy{N>+LuL7FLklO)J0I%$)4@@`{Qg%RA|c`%=^gBEhi7=$|}{ z>>Gi1;Q==I2pnb+O50Hf&DXgk$kFC#0dSkh|)qoCdQec8tua7^40iE#mhxp0K z$uPX4!a{SvdIAFj6F^txNe!{H@%nxmm%=5u{O`bgEqebH3;5#m7KG99H6myo#psH4AB-=G20C{Uxl z$~=>?pTHsVjPcAl3~iy<{fMzJ@E^NGG0b z2h^1Htu`*x4o2&kOxoFJZJ>pxQLCC`0%{J0|d zmp%h$OX?vU&E#?91wDQiw8P_LmXqJrZ|WRb;Hj~WSy@?Q>nkh!Q9E5mT6^p33IwB7 zX1P~Dq}yg{4u-&zU2Myup;wf_KpJJ?;UQphi~&;4IgpgpR8*`1Fui|Y^}&81@+81V z;AM?1ZT&>C4k0P2m}3yT{ZxgCX8=KQE($yR>m%NhL^zRY6`sx~9;T%{gpBf2?5Uxp z)1_d@Z#EJ>a8#6mL2=_`BPTi)g+CL#cgQ;DhLEZP97v;5&CEH)6-a5H{pWwd5^v4 z<6V0|*U6vR0{|Kax3`#%x9WR;<}kj=htOhf2B)gNpQ|8&8Xbbg@YSF>0~;Lg8H8&N zdXwM`Q`Y#6#6S+FzUWqVz5M;~iv>yCOtnoVlsk+0HY7!>XEIiUaNWW4ONUWE`+d@m z6#r#uA)JdKd@5-oQSU3%9X#^BbWx|l3<>raZN7pqR~{j0eTK;2*6VqetBDE~&FMxNm3z;IV3T_J@jd9;k?P2j2--3RZ@yrehh52O*x z)Hzf)F`D-j_REJ1U5HUxQDTo-T-bKj{2SFnL!Zq^{s%Z`eeC_fN|lPZWOp7%(3{|g zbHr;1ZfbMYD6%}F(W)X)dz`S$t@k~_>;e0&N9=94tL+wSBdjbcaC@V%=&mNN&kcBJ z4?(kye;}SK@&>!yyDoKN(v5xc{0DC>WkKe@QVUTPOSgn(>bGjxd5pD4?e{}f_L?qA zMlxFE>_0dh*ym{`q5@VND}8aU00>yCOk%wOr7}3NiOx%U z2qZxKtBplaZH|s+ywQ0v3C_!~1+1NXK}&~vUxD4fI2}JKp=}@U z{)P3|2fcjrPqLFX3Po2e&NyP0C>EXT``ZRxVs*X`>7WO}5tOh;6iw-B1$Fa!)6G?% zqOwczo5}c4(he2_w?E8$tJ)*58q!1$GN7b_74csGh-TQaWoY9K!EZLV?%PM&vB8lW z*|*zx;rPw9sEf7>C^Ey26~08F5@c|-bdTR-u-Q9igXnza*tc#eNj=D*9i`mwUHuDo zaiy0nyb+VSlTOML1Rj=Je)q6oz~$8;vHkothc7Id(DO*qYuxZmu}2i`>&2kuwLdYt zd#1CX&wR4NryzK4)dh6xYOB?DWd7oNi3~g-O#5_N<@H9`_Zog76m#fT0o2s^)oYq) z1+~Ux+jUXHnd&UrXNl)pCYGu{i;s?OeR^0!wi*m)E{{%oSF&~N&JKOzTKDG6+gJ?B zv=FJ*7>3*IL*HBZy#iGChfk3!Qin7l^AmmmM2#FB`8EE-X z`c47_;@MD=mC|-c+L^~x)P6(VdkFrzgHhH01fv?83{@K6qRP<%KctE!B32q3={W(h z=4(bv8YGt2zmW}Wo)ZRJ#%j!1#4@}{N@7V?&MRyb-T!#Z)y2i+IDTZ3dU%Z#QZv-v zf|r(YZzbF#j{^d=>w&6pL17RO=;Z8-A|oIm0FPSyHx~^I1R5D1&nd+xC2bI<5f?X6 zI1v^VwUcrMUZI9QWo5N*|MSN}UtfPI6Yt^eY#BMZVBFEgMQTy^vz=*Pt087}J#|CF z*?RlgR`2V4drRyzTYGy|Wo51T?AlsaJ3AG(GW{C)23=j{ zpIEcHSRhbXt>?MJ6eSN2kF;yp3qY{I^jlR`)hSUhIAH+pDXq7v$!CWexns0V}lN=HlXl!LIh^zcHz&7k1G#<)8rX zNxCw#u#6rAkAf1>>B1rA`cg!E0pI%j`#E6Nt3gd%Dj3-h-SD+uLSGeaI&F>RnMOb; zOp8VdufmIqpWc2(e&*>ZGU~qx0)>4dClRN>ZgiN3>4qkyrmCo_-sWv)8rEhF1i0`4 zD$FlVt>fur*5rJ2<3Rq&}gqjP~5!Udxm~rl+SlkOl__H|SkOgF{1Sr>8dQ!Pg;0MMdG^n5+*SK-nlD(1T(B z-ya8mzDNH0^-D&%M%<{zu7ZV=lL>Z1jRfN1<^4IVM_nFX{-&q5HyqN21LE4l6mdUT z>gew7J~=r_6LF(53OHR(W^R(dAOFN8;4r7BrIll!Eh7u^`<|ln!=%nuM@=pIJC@7+ zoi|aYK<4KIN2CBiiP{t=g0!-ZL3gVUQ|3P@`0>`8~*58W$H=HuN{xFHs|g z@(yb(@Wq|RWW;7A9mwnu{Y6C7qoh;D3<72X z4bVnuAA>S;a$XL6W?xqT)#28~WV{O{fP&2OFub=XLvShI?at)U|Lu%95}VhvP;T00 zQgQGE25OI}gm1rC8Fk67sNmdT%Y2blZ!T)fuG~^Q%T6Ti3i2Z(r_k5ZI_5kL@x8k& zsHz&}z}3Lk6wxm}%M4G3<#j%6SPTD@n4;opU$4N!7)pHe_gqwUk9{+OSw-=o7N{VS zyX)m36+w>Yb=H*R?WabCYkJgm+zk_Yt_om~P1jt9ofg3j}p00 zo;;EF2K4&*BOld$Ku2=L{<_w0Q>3rLq_z^J+aM74tYH?d-7kfb+naZeXqz<}*R(K@ zq}>ZB1qB74n?q3}@l|as$_;xcpfAzCn+?z$u=o5n{VadIt!*$NgCM1)D-2* z=g*%DfJ=?P{ckK_D$_)|f_hL)Dw?r@^R!$W6h=gG;* z$jC?zubugC=Ud|ia&mHqRM09U(>5P=cJ@iB+aJqap}?oCpsY;QjivXMrRCb%+SXJ! z;Mo_<3D9)FmdIjLI`EOMZv_QRe1f8!1p@WMo9!$0A|+%=vep92_in0X|P@7;rMN^a`#A6Gd9F zvY}SP>1gU`3W}R=CULV`F*jg5^NxjMNWLa;%gQQG7XrRb=rO@h4v@bXJ& zKoQ;1=8}W%7pd&Q*y;Ghaz&+GDt zkuU!%0pWwk+^-D#vAJZ6;&9_nnV-q@UPea7-oETmTSw05<}X4b{u+z1$ei;13wPW7N{p zN;cu<E*5INQVLdrK3Ad=M7#UKek2626^fVJxPtFhN8ac3xhd(D$BH-8ifM zsfPMqECG0mYFf-~@Vx)0^Ao(Qq%VUNFid}~|FPI}9a`&HuNZwevyNZO&6`ajlJR$c~=Gq796-z1qM zjl6(|U0-{8lH7DT$i>x!ctSx2C6Hs$#GeBL16ZDM@zqLiwZVR$U+Z~^u=_eYXNgtL zQpUx%R6Mkzi;9XSs7}F$#14#~Yo4>v+32$Z@+MwQE<0^DakNRsX|xp-9t{{2K|q7Y zM(V0Q;Qk)G4N72HX8NCPl6#zYuBqaJR%wg$)K^VHfqM!J;$;IAW42)ezECguuT}s- zGhyx1z~f1zzkTlZc6WETwrt2k($7{~Hg=gFv?n4iA#vT>*4oOECm9zb%0LXXNsxss zA01WOm6w-C_pSg-SNA+xI6jN_uU2{*hdYVnx7ga+y0^FYW8Ga8__eN}NEjDdtt1^s z#LEUM{^i-VyK8T3dr8qDmQd4@wBbB`&%NL@uD>80zwlx0E*tz%pH{RGIN#l zo_NL$a#Qh_?$x>NAm)|zz$Byd9M zU!@wf;QSnzpcVi7@H3nKShb~c96r;=V!N5-)#;m&Y6>p;;lXAL#ppMBz`BxP7&`(WlWY1)~i4x^Kj-VAD+BSPwJI!MWpVT3@Mep-pWrmomB59#1grWUE z{ck`Hq+ABLDTk!@&40x)>iW}E*p({m@)n-uywYRpeX8TX!cgJ&2jcLJ_=O$v3g?~2 z7Z@<4P(>G9GZcv5;zX>y*rTY#u2LLZS)5YmghO;BTI#)fGK&7`m;^Hd+uGVzzPvx^ z!jmK0*1YHw<9yI0j#jAOu=sVU=lPxy@`3wOJuxvc;HCuOTyQ7cNanxG9|9%-gdR2h zUH3-U(vlIJmzM|ppH>vOvDW;c;(Q4Fs}hG{{mxjPvJ(c{t@;<9;2x;RyCm47mH(_L z8}wbk^UN-QpTo2@N{fLuIU7RCX);k&BojL{Fwwz<)5YuuOGrpqnvQXV)36;=Y&}wi z{?!JKKi;0_UL$y(yg!G_>*C-lfO5<0`g!PNiSGDiFsaGKYP@({S>Gl9FK7foA&)E$}nP#n#*PpDB*pN4oU#QGJu0B^9j*3~Vj%R3$L~ zS1Ck$!6gvI3hOn#Wz1M_HUT1m$XMUOB<{!K0lWS+Z+?|_$oYM)dfDr9e|x^@b8WA$ zPwo?jWxfO{DobqyEM=A9eOA>=1>6x(|70|Kog|o0MIf*Ri@Ku7dF7)YdmtuQ7E()I zlwDn{d`#hg(?f#(TF}PQA+0K>Lbp4*&A(v z1DO1C1xk8IqiE*)EYc<&zBz7H59sQX>1xXXY*LQOE*{rSjSm@H2RTJDr8W8g?1ELj zQdOvvgOKYc{*zGe>$B7CsS5b^FCo4#Sl^B%t8BdQC}wUzac@#Y$pGD zu-YH*RqD3=t4t;o;?-M_0mHy1VOt{Pa$1snBByMW1p68i{GfW2R2ss3A(wTPLKG4- zx+fFNzDifDeHL9IxLoLIpKhrayTT@s+Q44W=h9HJ$%6Y%e-!X?qv**6Y3M5;{#mB|4F}aHQG6ldW;*W<|c3PX`8K zf3D;mp1nc8Er?(TTOFmObjg@T<%s;x)q zqPIlN+Ci#P^N*O7uPe>Fq$_c-barnf-1g=!COQ)O{vOK-+TupflTH6;%6RZhG?gSS zsZ;*SNb7jH-B$za#exg&fiK6L2$lm{wJlf`(J#d=W0PW8wDL!?02klg)^|%)XGYCjxSb>llkAw=JxycuT>vc*g(4TAa-5j`qt@SZBmL& zlIP$bwwt{h>7Hr`Q!&jFzHANQ5WYe@f|{GKvtT;>1!?s<0E=j=txah06$NcdW~B zzz@3j6BD!q4C>H;J0iH`?YP$N@>B6{?)jIKOuhoAO}{EkKk8(>lWbDQK)v5Kc=yT` z-;Vu%#)!I~El_Vo_rCmMwXT|6Yjb&&GdZ~hb;YVyvcT!pkNaq_n{$qs#Kui{i@T2*@ohdFZ_Nx2o6<+|^`q%ob>w}oN%a;Q7#cuo2E}x1}n*Hfg8<|h? zQm_y-yM+}lb&;%GJ3#1q#2Ax>-PEO;3E^3a7x#}^%0=J!s#Eg9tHP!124%DP?b?qE zaio0Ns=}`68Y@x`qp-ABVa~T^^Lk>xxX|`V=naqTJbeBvcz&l$cNnF+)5(X7)p^bM z+@4O|goOZiU_KZ4gXh_f4G59>d_95 z*oIqYcBT*_OeXI2)qxVWV%1Kc^tL%Rg>cfeD}WqGyZNo=a4O^C$Z|SjEIsN)eNXPL zJ5~=cIbK$oBidDK^{JGeg`xjROuwTbDI6qXQj`5*-~P0aHv46OT9^JNMsz4D+uT8) zYWUkaPW+i#oAGaM`?Ni$f$*27Z!LtU*5jXoJIZlU6enujn;7 zO1U{fI9WGg`l68i3?IdI*|7~`=|~qbQ>aN#s5;kuNM6cRGGq3~@|Au%`|wA8`=-jURz&Y-*Zo8-2}5EZ zRMBvE?n??6Vs&w_OM)@u5_qmQidIHyI_d!aN(4E-B5Wg@Gz@ES3nXg3~3+C)TCZ2_pbZ(SYN8BVLEmu zBp;F`a1yUBez~6F2mo^Dw(tg3sAxsZlz*80Wd;*WBarx)Ez{K_dY1=H_yL~WZocWX zs31MtP`nA)i&G2>i5+kWtOu!(W$fqexhOeH(l)iCYWr)}E>m1KKEKfU0%Jh3LuY{e zxko0Z+lYB^c=hL6tJ8%*k>-n!$k370GLLE7cMpk@0Hqr#08jDak z*b)@oueJ*0D6~-{JCz^37l0oCu?k^;PV&_B_G3m|TqWo)cH`pSPZBpygUTwL5SHcG`YzUECju$K)YaTM$V79T=Lr4Y>-k-&1Y&yq>Kt6bU z`g{3z_MnOrC1^SY$)(160^)ry9b@*DzB`ts-)tWG47{h94)gL}AFT4dbGfg#r(E>> z*hGAPoY;mle6=ref7$rk^Ee*@Ai_AFL?=d77T*t7dT(`Y5N3!N%}?^$lhpSY3hB(Q zKzxy)tVE$5{=MQU_O_h|6`z?T4X(|F?o~~OH?hcd)*C(M`akXdD2^?sFG3;EO*Xza zzwB1~VyV4PG^3=S)FMbE4-`w8&UH+1+;AE#)0?!nV-Q?1tzRqm3>bDyUWu zS3D5d6GmHA*^?V^NfX|e4ORN$|6>=&qK zl&fku6keC=*Mv|AH+|kG{^a{TH|x(KLmia&breU(8K41tJGlEv`L{cTq8)s|7iA^M)d%oCM3gE}C-2T4nn|jT#rr$A5dT=0^S${PkN`iI zvLuDORH;cza)ifwElH8hkXt`O1$^wicb7+NKy)@LCTxVlmIU&$Ju-Z*iY{b5 zJT8|y0^z&GIwhO^As7WtJrlD90ObE$;G63fa>GH09BOo>BJItP6z*z}s6wd3?UwqE zky)Q-mWzi-Js)BRYezp4qZE2_gjE3MM&a+o)418O)QB^cM=r&1Z69lAS)ie# zM#zJo9;_cpt^mjv0D99uMtf&r8p@nHMf=_9lC_oS>U_WL?b@@{BI5)OpDzvB$%#M+ zi9$6cs{BZbW*gfPtcUy!lZOj*#`X#xrUd0;ilP*RkVrQGp`Y_G5D>YrvmaIcVIzO7 z0<~zLX3#>Ks%+N{p9)r9?q%l4$nwZbgJs$QJ1$i0@p)6q&^xHPe`~J@5O(3w(>$gO9Wex=!htm@P08k9nG8nd z&m$L8ZFf3PKMY&CQtex7g(k5^ZAj_O{`m33jM93lJdHwMy`GnT!aogi3G3tM(ExL3 zv&nybVYlCMzJPsA`qo(^2F)|?d(%+qYOYc|-Ppj7CD!*fR7e@?>9Vt={-QE85Bst6 zA@xk~VIROCFL=Qjc>Ih7J`yd0N1QC^m_E=2ruNEo2*N(1Z@qfF;?>I-9EypSiMC8P z7f(r2MGN&dwGvQb1J^G87E?Es3d$deb9}8xm&lF)GrA5;eX)5?T`0cA7^$}W5#Koe zpg^s;h5Hpk1LRZ(scRnJqHZsIH4KgtU_E~3i;J!3cLd(dL39RVM=zz=?SDn`XTYdZXz2> z0qTe&4izRcO8UVgK$0tZ37ag)51Q_ktJ7__Pv@fvELwCEQlu82N3L}_RkOq2dSG1Q zcBQzTY>r}yVd;H)XRjFf$j^{EL5ni`i#|w(*N8WFLK407yF{ zs!S;1C{5Q96mxU7f%80E11v^boh^QSzOS3})*I_>pye!cxw~OHuSOTL_>cWUoALau z$D)))?s_XGVh{R?3f1&5>BET&yvYrQ9Z2OHhku|HG^ug1M`WtQT3n`otg*Qt^)o5G zFI-6%^F$wRHKJN2BU@+=dbFM)N1g*!lT z4TM4*=J6YjF|#q>9Y->y2oNC0OiimqcEkMZ_!L$lLrI7$n*&t0nSGcXBw~G&d|(+p zy~q_qvfJ`Dl>|XU!iKJa0lye9y(26t!$N8m~}-2k{St$HE{ZAD18NVN+S`H(tlv z4fgK%m(dp(kPp{;fuw_}}J}L9i z#P;CO@CKf(qgMO942=m4KqXVou}EUvB~bEN`=l!rjmleN)A^HeAs>RC?Y@!bR(vwZ zFG7j_HlUV$GO#rCr4!pLWjSjeC69Ah{HH zL*$!#l_z8fq{gvA*dC&i9u;Fhxnl5F87K^6Lz*E{+iwh|!n}m5+y=gSNc<|;IyEWB z^D5l>Su#~v6j%lkBxR}qT}H{mnt{+wRQGimhRX*<8jF5vsm&?tN;&D^Ht|Fs0ODNPJXC;Tm6sKjxUYr0s2Ah=%kvT=BJ( zcFbIfIW4sp+y^{Ij{n0&i&)Yv^M=N>T)mrPXd$em@riBP05CDa{mi>6Ls?}0So0tO zyIra3H3D*~;-3()upy~C=NjEi9&Z(>Q5PL`_n!F0Qed^%M5BwjdxrEG`YNi85)=-) z$Qx+18%`IC)hf}gSbs#*F*NB7Mevz>RW)s(i8r{7%4KLiuBosCsXoq){ z>^c~1MuT}2nb0EDO#5NN-|fpnAc((0Hw!BR99dHDxjlYjl&#Ce`6Gtl%gJPisTc%~ z!LfPB?(Q=QtB~PhSA2i0Y<{>#8pb&fT>AvkhZ1I-GTyI;)1eo#VT4$OeT=ISF<=yy z7btLyY|3n2S5{-z3YG5xbi>b}nufqB%ZGIAOPR!1OJ?%+Q3`eUQC+kg&nD&}(GYjE z0RquxuUqSI<`!4jhYw0J|(Lp!c@uqHBjncC-X|>>j z^!Hd;DW;vObP7MmmV}f{LSwF!Qk-d*b0}D}Nun`FOVbFkih4MpJc2YWWd?OvUox*w zwup{kF>%%6hxMW}rpg3vCxE}2{Gv*j z!o}Xi)tn#$v#s|*i4W5V)%f7l6GeVQ2H-D&Z}hrRJK`gp!x-EFxa8@2=*Wj=D}NH~ zik35jkv}ux?QF5W;8)^bmE@%b8OO{&(myBHkr(>JSEBG&Bcp60uPD|HUBY6;4m>v+ zd{4b%fr~>U<$iCWg)(Qm-1yr`ooh?`*}&S5d*7FzifCEs9m~(UOHrU1nN2Pv#I(-D zs)9ENZzgfa+NdiV!wfirFKiy#a{Y0i)PH#ZCMP;7pB=-%?rGbMxI(o*Y9;}=1ZXee zt8np~y0p#BA}a)NHOz@huK(l)%+dg|BfsqNw^Pkjqsf>V&;UR;K+YkITydO^pb;3pMw5&NSK`MS)z_71zDKI|_bb$G zw;K|qT$EPve5tBDpC&pEV4i9AaK)3wgK8ee^=C*%U7Y}&%h&Pr=K*YXYS|ion!h%% zp_Y1a#5=qyVQsY78a(&w6ECjrkcuuYHhnl;pm`{|@^_oJ=X8Y+aeCeR4rHy+ndapV zFm*znIe=2e)`a+L_aXbI(y#;Q_NR6D5Nhhw@-&!gq$d6AxrtUN#w*9K_jlLZtep;I zedvUAvjEEYuuLK+0VO*;{~|9Sk1scm-Cv~f4D<+eRz0JcMd5jgco<56N3+X9)}yho z>rEhf(f4*26Q9_Hf-uZ|qrNvs$=sxknmO{LbpTTr4(T%s*0*{gGFm`p6K^%(5~wpY zS8EYm*mZ0_6C}?odMVel<4C5coLW&a2ShbnQ%{y91Oka)r|Iv?W?1N@^RfR4SSw?kqjA zoOOSJ=fl@W%*+`&aaSZQ#%+YF1SZ2=G1pE{6s3yEC|QFq6#__b{h@##JQ1#Trx~&) z{O#zmD5J1IA7ARwd<34vjfQXT7V3Ywjf^)MV21)jPDL7q88e-_=BqkJ+^(ZkC6DOm z07U%{;j!sMTe*vd3yp(t5!!cQ*1mdY(iioIty~J)Sxd=pyV|g;>N{Lre0J$*rk7sB zGVBjP&@!-`4?hM5$m5~{w&tF{(&i~fl22*$_#Trg2_^i}OmM41?xUoiKCb?d9&P44 z5_UO`P={i1HD2^V|da`SoQlL@V@fY6Pt2jozd3-@rZav+RGdA2_|Iof81S13<$Q zQU=HAo_pcljM=%so-;8GLQZpBY=&rr0)U+;8P;dP`G|3nqQ9`7$VGTaao;XSw4=P59wbNzoggRQB{;|-TeAcs3)-5&-j z%Z~EIUk{Q++jN|@PxHU|WwudZ3B+=XzW28ci#~=gUWD-a-{3dOzy?e|ka5%LVpp_Y z71Oh+KoP|ctR4XhfJ^}I3%^}0(kgJTDmSP@tbCMk_*F`7NamH;U_FY=uKZtqqgzm# zW~6rxYYbH7=h1w3wf%U6J?#@OP#yMQ5b?9$FL!6^=rw9a$^gLVAJ`pEgG4<`f+bI5 z8#{)l5dC;r8^Gq4u!_&b-4D!8LrvPLhEj!5;O&p3u+vd%?G{_b>?iy?d@t7$W96SH z3iJnr{SV3Ug#;iu(if{723I4KRiV4~&u%$Vt%@NwxzVqGLsS49JfX7=Ip+V3bcYSqU5gLF3Wn=X~K^cTF z8>0DW=Rai0QYtqC-Dvb|6+l4us-J!&fSK<} zAMsiczd^+K04z$v-AO?R`nW|}k>(jSfzbK3&g0Q?X1azx*| zdqonz3bu6a2l$8qQ+B;dNqTA_CmOFl0Q7`LG(RvXJ@;3q6>?AjpiVfc`M(GdrtFXr zuPe^SLQbFtoOdR*>dpsCQU;QvzbXOx(By%r#pG;ZKpeDDdry=QC{(GY!T8Lox_h9mu)Q;hDeFVY@>-vFiwK&!ArLXSeJ7pRA6M<Iax=*5!lX7=>vcJbu+<8^lAL6P z0o6A2NS{dFFyPQU&m$tnPU)Zw)Ds+xkoVTea0x61a8bE@GX=|HI6@n%5X) zf0k$%3lBV_)T&C?1rRB~9D=4EdB#fNMKUUg%2)k_u6WN%gcXV4nRJOhUVDujxlbnJ zIp0!Tl5CKz6^pNK{ZSB~)68R-%q*AzQd(03gNRw0p+Hxf-ufBVr%x@4^@dqlAKcr^ z?PPuclDihYb5DHzb4I|%0uciu%!O>WnZ@)%IQf;->jtP}N|;ZDeQw;V;kXYxjMDIT zmg4B2>0&9L0W4@-u@x)MNE6*SybC^TKU@D@w<;ZgodEB143ph{^@purq3mqb^Ar(` z-n2F$b;VhzH^Cq_Nmbq%GF&bJK}uN2oY(;JduNPHsKzT)xq^BGQO(fPD-DmQ| zR=7yMmB+a@VvXsFmFHnzIw~R&MRy`yGP^ifZnEEuilqDK$NrtF@xSc6N513D%`qjX zag*$xe@GStEudoefhlvS6I4@ZZ$T0UZ*KjIP6Nl|f72K&1b6q--%!-$ zvYDe-0`ES9kT5baB*T~km_bN{psb)m5ZN_WL+9^>fp;Ei3OBdP8+xyf zQ}6`pT)vuA*y4=X)=e0+AKLIyAQ&ZG&5VHxvdjt@n$y_QN!w^t0Y(NGK2Xl}OCfY% zEt>%I)3fhE=)9=Pfr)&ZUpCvDfFf>5SFRQe--@a2ci-&KSek1fHPb3G6v9uGTpwz* z@S%6yUsReuV0znUabtOzOSxuNpa8ANss&n(j?%gui38WSYOXX7v-pvd_%FUl9o{%} z2fpA{vCs0F=J$Ns@OTx&{|c`+6K3E-I;sDBgKBK6mXto?I~}zZA@r{h7YMQLL-z?T zZ1JJLBKvLP3kkSKud!e5e_a#Uv2+b)@@z@p;voJeQktyOh-fe~9<0Q8sQP=4 zBP70_DN`^$I`rN5v2UFo+etj{7nPm8O4}D}#ft&((J5L!klD>A@d|5!l#)rrp}SZ1 z(8jUN+wdl}@0(}E23qwG!^wu?KP;nR_UFyHI_sxrRh|uw3y6}p*uUfe<;(8iFFG{1 zn5-XPW(aAd4Mjd}uzyfE4NSH$U6zjEwxIN>cG~*hbi>1j!H3f2m{fSyH0OATOX_?% zzs$DXHJX}g6TbCXgd1--db(i{2|o&QzKIvAWY+jC_cDSsXes^=E_&NAWizQzM30}K z;^R|2ul3fKaU#;Q!MR}$*Y}JKjWNXYC(7^6S_H>IpuuQLMh0V3Q}xPBCGm~@{Td$J z*0>!J#k&Cui9}xd{>yOjXWSwnzu8$sB~nsSZtexk;ql<{)i=k)9G5P_ym6@+Sq=-6 zwt2tRKz=DHDJ?BxZSuVX1ChD6x3@_QZs_mJ{R#*_*&KYjc<-g-#bG5McRZdVs024= zttSFy+E6Iz=*VT{`lVJ z`T2Q#e7upT*#@$)nq0Y{5R)2q9tvp5@igWQo`)@uCkKd$c33W%=%~&i6EN($@_JFf zk^g~P$ObwI+sFNH`#$A-Nm^BxUV)+No|chgNTAPsOdHB9!uv>0gsGtp5^`=h6CE8$ zz@UTU$Hy+`n=<>QO6nA6jz0s|4!zIk-O&Gt*w4N zh&A_a7n`54IedBfpD(FE< Ma%!^W(q;kw2Y`saQ2+n{ diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/java_options.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/java_options.md deleted file mode 100644 index ba1cd8d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/java_options.md +++ /dev/null @@ -1,54 +0,0 @@ -# Java Options - -`System Properties` or `Environment Variables` can be used to change Puma's -default configuration for its Java extension. The provided values are evaluated -during initialization, and changes while running the app have no effect. -Moreover, default values may be used in case of invalid inputs. - -## Supported Options - -| ENV Name | Default Value | Validation | -|------------------------------|:-------------:|:------------------------:| -| PUMA_QUERY_STRING_MAX_LENGTH | 1024 * 10 | Positive natural number | -| PUMA_REQUEST_PATH_MAX_LENGTH | 8192 | Positive natural number | -| PUMA_REQUEST_URI_MAX_LENGTH | 1024 * 12 | Positive natural number | -| PUMA_SKIP_SIGUSR2 | nil | n/a | - -## Examples - -### Invalid inputs - -An empty string will be handled as missing, and the default value will be used instead. -Puma will print an error message for other invalid values. - -``` -foo@bar:~/puma$ PUMA_QUERY_STRING_MAX_LENGTH=abc PUMA_REQUEST_PATH_MAX_LENGTH='' PUMA_REQUEST_URI_MAX_LENGTH=0 bundle exec bin/puma test/rackup/hello.ru - -The value 0 for PUMA_REQUEST_URI_MAX_LENGTH is invalid. Using default value 12288 instead. -The value abc for PUMA_QUERY_STRING_MAX_LENGTH is invalid. Using default value 10240 instead. -Puma starting in single mode... -``` - -### Valid inputs - -``` -foo@bar:~/puma$ PUMA_REQUEST_PATH_MAX_LENGTH=9 bundle exec bin/puma test/rackup/hello.ru - -Puma starting in single mode... -``` -``` -foo@bar:~ export path=/123456789 # 10 chars -foo@bar:~ curl "http://localhost:9292${path}" - -Puma caught this error: HTTP element REQUEST_PATH is longer than the 9 allowed length. (Puma::HttpParserError) - -foo@bar:~ export path=/12345678 # 9 chars -foo@bar:~ curl "http://localhost:9292${path}" -Hello World -``` - -### Java Flight Recorder Compatibility - -Unfortunately Java Flight Recorder uses `SIGUSR2` internally. If you wish to -use JFR, turn off Puma's trapping of `SIGUSR2` by setting the environment variable -`PUMA_SKIP_SIGUSR2` to any value. diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/README.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/README.md deleted file mode 100644 index 46713f9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Puma as a service - -## Systemd - -See [/docs/systemd](https://github.com/puma/puma/blob/master/docs/systemd.md). - -## rc.d - -See `/docs/jungle/rc.d` for FreeBSD's rc.d scripts diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/README.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/README.md deleted file mode 100644 index 2c5ddf5..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/README.md +++ /dev/null @@ -1,74 +0,0 @@ -# Puma as a service using rc.d - -Manage multiple Puma servers as services on one box using FreeBSD's rc.d service. - -## Dependencies - -* `jq` - a command-line json parser is needed to parse the json in the config file - -## Installation - - # Copy the puma script to the rc.d directory (make sure everyone has read/execute perms) - sudo cp puma /usr/local/etc/rc.d/ - - # Create an empty configuration file - sudo touch /usr/local/etc/puma.conf - - # Enable the puma service - sudo echo 'puma_enable="YES"' >> /etc/rc.conf - -## Managing the jungle - -Puma apps are referenced in /usr/local/etc/puma.conf by default. - -Start the jungle running: - -`service puma start` - -This script will run at boot time. - - -You can also stop the jungle (stops ALL puma instances) by running: - -`service puma stop` - - -To restart the jungle: - -`service puma restart` - -## Conventions - -* The script expects: - * a config file to exist under `config/puma.rb` in your app. E.g.: `/home/apps/my-app/config/puma.rb`. - -You can always change those defaults by editing the scripts. - -## Here's what a minimal app's config file should have - -``` -{ - "servers" : [ - { - "dir": "/path/to/rails/project", - "user": "deploy-user", - "ruby_version": "ruby.version", - "ruby_env": "rbenv" - } - ] -} -``` - -## Before starting... - -You need to customise `puma.conf` to: - -* Set the right user your app should be running on unless you want root to execute it! -* Set the directory of the app -* Set the ruby version to execute -* Set the ruby environment (currently set to rbenv, since that is the only ruby environment currently supported) -* Add additional server instances following the scheme in the example - -## Notes: - -Only rbenv is currently supported. diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/puma b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/puma deleted file mode 100755 index e800223..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/puma +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/sh -# - -# PROVIDE: puma - -. /etc/rc.subr - -name="puma" -start_cmd="puma_start" -stop_cmd="puma_stop" -restart_cmd="puma_restart" -rcvar=puma_enable -required_files=/usr/local/etc/puma.conf - -puma_start() -{ - server_count=$(/usr/local/bin/jq ".servers[] .ruby_env" /usr/local/etc/puma.conf | wc -l) - i=0 - while [ "$i" -lt "$server_count" ]; do - rb_env=$(/usr/local/bin/jq -r ".servers[$i].ruby_env" /usr/local/etc/puma.conf) - dir=$(/usr/local/bin/jq -r ".servers[$i].dir" /usr/local/etc/puma.conf) - user=$(/usr/local/bin/jq -r ".servers[$i].user" /usr/local/etc/puma.conf) - rb_ver=$(/usr/local/bin/jq -r ".servers[$i].ruby_version" /usr/local/etc/puma.conf) - case $rb_env in - "rbenv") - cd $dir && rbenv shell $rb_ver && /usr/sbin/daemon -u $user bundle exec puma -C $dir/config/puma.rb - ;; - *) - ;; - esac - i=$(( i + 1 )) - done -} - -puma_stop() -{ - pkill ruby -} - -puma_restart() -{ - server_count=$(/usr/local/bin/jq ".servers[] .ruby_env" /usr/local/etc/puma.conf | wc -l) - i=0 - while [ "$i" -lt "$server_count" ]; do - rb_env=$(/usr/local/bin/jq -r ".servers[$i].ruby_env" /usr/local/etc/puma.conf) - dir=$(/usr/local/bin/jq -r ".servers[$i].dir" /usr/local/etc/puma.conf) - user=$(/usr/local/bin/jq -r ".servers[$i].user" /usr/local/etc/puma.conf) - rb_ver=$(/usr/local/bin/jq -r ".servers[$i].ruby_version" /usr/local/etc/puma.conf) - case $rb_env in - "rbenv") - cd $dir && rbenv shell $rb_ver && /usr/sbin/daemon -u $user bundle exec puma -C $dir/config/puma.rb - ;; - *) - ;; - esac - i=$(( i + 1 )) - done -} - -load_rc_config $name -run_rc_command "$1" diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/puma.conf b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/puma.conf deleted file mode 100644 index 600537a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/jungle/rc.d/puma.conf +++ /dev/null @@ -1,10 +0,0 @@ -{ - "servers" : [ - { - "dir": "/path/to/rails/project", - "user": "deploy-user", - "ruby_version": "ruby.version", - "ruby_env": "rbenv" - } - ] -} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/kubernetes.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/kubernetes.md deleted file mode 100644 index 5c59a4d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/kubernetes.md +++ /dev/null @@ -1,78 +0,0 @@ -# Kubernetes - -## Running Puma in Kubernetes - -In general running Puma in Kubernetes works as-is, no special configuration is needed beyond what you would write anyway to get a new Kubernetes Deployment going. There is one known interaction between the way Kubernetes handles pod termination and how Puma handles `SIGINT`, where some request might be sent to Puma after it has already entered graceful shutdown mode and is no longer accepting requests. This can lead to dropped requests during rolling deploys. A workaround for this is listed at the end of this article. - -## Basic setup - -Assuming you already have a running cluster and docker image repository, you can run a simple Puma app with the following example Dockerfile and Deployment specification. These are meant as examples only and are deliberately very minimal to the point of skipping many options that are recommended for running in production, like healthchecks and envvar configuration with ConfigMaps. In general you should check the [Kubernetes documentation](https://kubernetes.io/docs/home/) and [Docker documentation](https://docs.docker.com/) for a more comprehensive overview of the available options. - -A basic Dockerfile example: -``` -FROM ruby:2.5.1-alpine # can be updated to newer ruby versions -RUN apk update && apk add build-base # and any other packages you need - -# Only rebuild gem bundle if Gemfile changes -COPY Gemfile Gemfile.lock ./ -RUN bundle install - -# Copy over the rest of the files -COPY . . - -# Open up port and start the service -EXPOSE 9292 -CMD bundle exec rackup -o 0.0.0.0 -``` - -A sample `deployment.yaml`: -``` ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: my-awesome-puma-app -spec: - selector: - matchLabels: - app: my-awesome-puma-app - template: - metadata: - labels: - app: my-awesome-puma-app - service: my-awesome-puma-app - spec: - containers: - - name: my-awesome-puma-app - image: - ports: - - containerPort: 9292 -``` - -## Graceful shutdown and pod termination - -For some high-throughput systems, it is possible that some HTTP requests will return responses with response codes in the 5XX range during a rolling deploy to a new version. This is caused by [the way that Kubernetes terminates a pod during rolling deploys](https://cloud.google.com/blog/products/gcp/kubernetes-best-practices-terminating-with-grace): - -1. The replication controller determines a pod should be shut down. -2. The Pod is set to the “Terminating” State and removed from the endpoints list of all Services, so that it receives no more requests. -3. The pods pre-stop hook get called. The default for this is to send `SIGTERM` to the process inside the pod. -4. The pod has up to `terminationGracePeriodSeconds` (default: 30 seconds) to gracefully shut down. Puma will do this (after it receives SIGTERM) by closing down the socket that accepts new requests and finishing any requests already running before exiting the Puma process. -5. If the pod is still running after `terminationGracePeriodSeconds` has elapsed, the pod receives `SIGKILL` to make sure the process inside it stops. After that, the container exits and all other Kubernetes objects associated with it are cleaned up. - -There is a subtle race condition between step 2 and 3: The replication controller does not synchronously remove the pod from the Services AND THEN call the pre-stop hook of the pod, but rather it asynchronously sends "remove this pod from your endpoints" requests to the Services and then immediately proceeds to invoke the pods' pre-stop hook. If the Service controller (typically something like nginx or haproxy) receives this request handles this request "too" late (due to internal lag or network latency between the replication and Service controllers) then it is possible that the Service controller will send one or more requests to a Puma process which has already shut down its listening socket. These requests will then fail with 5XX error codes. - -The way Kubernetes works this way, rather than handling step 2 synchronously, is due to the CAP theorem: in a distributed system there is no way to guarantee that any message will arrive promptly. In particular, waiting for all Service controllers to report back might get stuck for an indefinite time if one of them has already been terminated or if there has been a net split. A way to work around this is to add a sleep to the pre-stop hook of the same time as the `terminationGracePeriodSeconds` time. This will allow the Puma process to keep serving new requests during the entire grace period, although it will no longer receive new requests after all Service controllers have propagated the removal of the pod from their endpoint lists. Then, after `terminationGracePeriodSeconds`, the pod receives `SIGKILL` and closes down. If your process can't handle SIGKILL properly, for example because it needs to release locks in different services, you can also sleep for a shorter period (and/or increase `terminationGracePeriodSeconds`) as long as the time slept is longer than the time that your Service controllers take to propagate the pod removal. The downside of this workaround is that all pods will take at minimum the amount of time slept to shut down and this will increase the time required for your rolling deploy. - -More discussions and links to relevant articles can be found in https://github.com/puma/puma/issues/2343. - -## Workers Per Pod, and Other Config Issues - -With containerization, you will have to make a decision about how "big" to make each pod. Should you run 2 pods with 50 workers each? 25 pods, each with 4 workers? 100 pods, with each Puma running in single mode? Each scenario represents the same total amount of capacity (100 Puma processes that can respond to requests), but there are tradeoffs to make. - -* Worker counts should be somewhere between 4 and 32 in most cases. You want more than 4 in order to minimize time spent in request queueing for a free Puma worker, but probably less than ~32 because otherwise autoscaling is working in too large of an increment or they probably won't fit very well into your nodes. In any queueing system, queue time is proportional to 1/n, where n is the number of things pulling from the queue. Each pod will have its own request queue (i.e., the socket backlog). If you have 4 pods with 1 worker each (4 request queues), wait times are, proportionally, about 4 times higher than if you had 1 pod with 4 workers (1 request queue). -* Unless you have a very I/O-heavy application (50%+ time spent waiting on IO), use the default thread count (5 for MRI). Using higher numbers of threads with low I/O wait (<50%) will lead to additional request queueing time (latency!) and additional memory usage. -* More processes per pod reduces memory usage per process, because of copy-on-write memory and because the cost of the single master process is "amortized" over more child processes. -* Don't run less than 4 processes per pod if you can. Low numbers of processes per pod will lead to high request queueing, which means you will have to run more pods. -* If multithreaded, allocate 1 CPU per worker. If single threaded, allocate 0.75 cpus per worker. Most web applications spend about 25% of their time in I/O - but when you're running multi-threaded, your Puma process will have higher CPU usage and should be able to fully saturate a CPU core. -* Most Puma processes will use about ~512MB-1GB per worker, and about 1GB for the master process. However, you probably shouldn't bother with setting memory limits lower than around 2GB per process, because most places you are deploying will have 2GB of RAM per CPU. A sensible memory limit for a Puma configuration of 4 child workers might be something like 8 GB (1 GB for the master, 7GB for the 4 children). - diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/nginx.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/nginx.md deleted file mode 100644 index 64b2782..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/nginx.md +++ /dev/null @@ -1,80 +0,0 @@ -# Nginx configuration example file - -This is a very common setup using an upstream. It was adapted from some Capistrano recipe I found on the Internet a while ago. - -```nginx -upstream myapp { - server unix:///myapp/tmp/puma.sock; -} - -server { - listen 80; - server_name myapp.com; - - # ~2 seconds is often enough for most folks to parse HTML/CSS and - # retrieve needed images/icons/frames, connections are cheap in - # nginx so increasing this is generally safe... - keepalive_timeout 5; - - # path for static files - root /myapp/public; - access_log /myapp/log/nginx.access.log; - error_log /myapp/log/nginx.error.log info; - - # this rewrites all the requests to the maintenance.html - # page if it exists in the doc root. This is for capistrano's - # disable web task - if (-f $document_root/maintenance.html) { - rewrite ^(.*)$ /maintenance.html last; - break; - } - - location / { - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header Host $host; - - # If the file exists as a static file serve it directly without - # running all the other rewrite tests on it - if (-f $request_filename) { - break; - } - - # check for index.html for directory index - # if it's there on the filesystem then rewrite - # the url to add /index.html to the end of it - # and then break to send it to the next config rules. - if (-f $request_filename/index.html) { - rewrite (.*) $1/index.html break; - } - - # this is the meat of the rack page caching config - # it adds .html to the end of the url and then checks - # the filesystem for that file. If it exists, then we - # rewrite the url to have explicit .html on the end - # and then send it on its way to the next config rule. - # if there is no file on the fs then it sets all the - # necessary headers and proxies to our upstream pumas - if (-f $request_filename.html) { - rewrite (.*) $1.html break; - } - - if (!-f $request_filename) { - proxy_pass http://myapp; - break; - } - } - - # Now this supposedly should work as it gets the filenames with querystrings that Rails provides. - # BUT there's a chance it could break the ajax calls. - location ~* \.(ico|css|gif|jpe?g|png|js)(\?[0-9]+)?$ { - expires max; - break; - } - - # Error pages - # error_page 500 502 503 504 /500.html; - location = /500.html { - root /myapp/current/public; - } -} -``` diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/plugins.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/plugins.md deleted file mode 100644 index 2331682..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/plugins.md +++ /dev/null @@ -1,42 +0,0 @@ -## Plugins - -Puma 3.0 added support for plugins that can augment configuration and service -operations. - -There are two canonical plugins to aid in the development of new plugins: - -* [tmp\_restart](https://github.com/puma/puma/blob/master/lib/puma/plugin/tmp_restart.rb): - Restarts the server if the file `tmp/restart.txt` is touched -* [heroku](https://github.com/puma/puma-heroku/blob/master/lib/puma/plugin/heroku.rb): - Packages up the default configuration used by Puma on Heroku (being sunset - with the release of Puma 5.0) - -Plugins are activated in a Puma configuration file (such as `config/puma.rb'`) -by adding `plugin "name"`, such as `plugin "heroku"`. - -Plugins are activated based on path requirements so, activating the `heroku` -plugin is much like `require "puma/plugin/heroku"`. This allows gems to provide -multiple plugins (as well as unrelated gems to provide Puma plugins). - -The `tmp_restart` plugin comes with Puma, so it is always available. - -To use the `heroku` plugin, add `puma-heroku` to your Gemfile or install it. - -### API - -## Server-wide hooks - -Plugins can use a couple of hooks at the server level: `start` and `config`. - -`start` runs when the server has started and allows the plugin to initiate other -functionality to augment Puma. - -`config` runs when the server is being configured and receives a `Puma::DSL` -object that is useful for additional configuration. - -Public methods in [`Puma::Plugin`](../lib/puma/plugin.rb) are treated as a -public API for plugins. - -## Binder hooks - -There's `Puma::Binder#before_parse` method that allows to add proc to run before the body of `Puma::Binder#parse`. Example of usage can be found in [that repository](https://github.com/anchordotdev/puma-acme/blob/v0.1.3/lib/puma/acme/plugin.rb#L97-L118) (`before_parse_hook` could be renamed `before_parse`, making monkey patching of [binder.rb](https://github.com/anchordotdev/puma-acme/blob/v0.1.3/lib/puma/acme/binder.rb) is unnecessary). \ No newline at end of file diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/rails_dev_mode.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/rails_dev_mode.md deleted file mode 100644 index add3cee..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/rails_dev_mode.md +++ /dev/null @@ -1,28 +0,0 @@ -# Running Puma in Rails Development Mode - -## "Loopback requests" - -Be cautious of "loopback requests," where a Rails application executes a request to a server that, in turn, results in another request back to the same Rails application before the first request completes. Having a loopback request will trigger [Rails' load interlock](https://guides.rubyonrails.org/threading_and_code_execution.html#load-interlock) mechanism. The load interlock mechanism prevents a thread from using Rails autoloading mechanism to load constants while the application code is still running inside another thread. - -This issue only occurs in the development environment as Rails' load interlock is not used in production environments. Although we're not sure, we believe this issue may not occur with the new `zeitwerk` code loader. - -### Solutions - -#### 1. Bypass Rails' load interlock with `.permit_concurrent_loads` - -Wrap the first request inside a block that will allow concurrent loads: [`ActiveSupport::Dependencies.interlock.permit_concurrent_loads`](https://guides.rubyonrails.org/threading_and_code_execution.html#permit-concurrent-loads). Anything wrapped inside the `.permit_concurrent_loads` block will bypass the load interlock mechanism, allowing new threads to access the Rails environment and boot properly. - -###### Example - -```ruby -response = ActiveSupport::Dependencies.interlock.permit_concurrent_loads do - # Your HTTP request code here. For example: - Faraday.post url, data: 'foo' -end - -do_something_with response -``` - -#### 2. Use multiple processes on Puma - -Alternatively, you may also enable multiple (single-threaded) workers on Puma. By doing so, you are sidestepping the problem by creating multiple processes rather than new threads. However, this workaround is not ideal because debugging tools such as [byebug](https://github.com/deivid-rodriguez/byebug/issues/487) and [pry](https://github.com/pry/pry/issues/2153), work poorly with any multi-process web server. diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/restart.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/restart.md deleted file mode 100644 index 7ea5b02..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/restart.md +++ /dev/null @@ -1,65 +0,0 @@ -Puma provides three distinct kinds of restart operations, each for different use cases. This document describes "hot restarts" and "phased restarts." The third kind of restart operation is called "refork" and is described in the documentation for [`fork_worker`](fork_worker.md). - -## Hot restart - -To perform a "hot" restart, Puma performs an `exec` operation to start the process up again, so no memory is shared between the old process and the new process. As a result, it is safe to issue a restart at any place where you would manually stop Puma and start it again. In particular, it is safe to upgrade Puma itself using a hot restart. - -If the new process is unable to load, it will simply exit. You should therefore run Puma under a process monitor when using it in production. - -### How-to - -Any of the following will cause a Puma server to perform a hot restart: - -* Send the `puma` process the `SIGUSR2` signal -* Issue a `GET` request to the Puma status/control server with the path `/restart` -* Issue `pumactl restart` (this uses the control server method if available, otherwise sends the `SIGUSR2` signal to the process) - -### Supported configurations - -* Works in cluster mode and single mode -* Supported on all platforms - -### Client experience - -* All platforms: clients with an in-flight request are served responses before the connection is closed gracefully. Puma gracefully disconnects any idle HTTP persistent connections before restarting. -* On MRI or TruffleRuby on Linux and BSD: Clients who connect just before the server restarts may experience increased latency while the server stops and starts again, but their connections will not be closed prematurely. -* On Windows and JRuby: Clients who connect just before a restart may experience "connection reset" errors. - -### Additional notes - -* The newly started Puma process changes its current working directory to the directory specified by the `directory` option. If `directory` is set to symlink, this is automatically re-evaluated, so this mechanism can be used to upgrade the application. -* Only one version of the application is running at a time. -* `on_restart` is invoked just before the server shuts down. This can be used to clean up resources (like long-lived database connections) gracefully. Since Ruby 2.0, it is not typically necessary to explicitly close file descriptors on restart. This is because any file descriptor opened by Ruby will have the `FD_CLOEXEC` flag set, meaning that file descriptors are closed on `exec`. `on_restart` is useful, though, if your application needs to perform any more graceful protocol-specific shutdown procedures before closing connections. - -## Phased restart - -Phased restarts replace all running workers in a Puma cluster. This is a useful way to upgrade the application that Puma is serving gracefully. A phased restart works by first killing an old worker, then starting a new worker, waiting until the new worker has successfully started before proceeding to the next worker. This process continues until all workers are replaced. The master process is not restarted. - -### How-to - -Any of the following will cause a Puma server to perform a phased restart: - -* Send the `puma` process the `SIGUSR1` signal -* Issue a `GET` request to the Puma status/control server with the path `/phased-restart` -* Issue `pumactl phased-restart` (this uses the control server method if available, otherwise sends the `SIGUSR1` signal to the process) - -### Supported configurations - -* Works in cluster mode only -* To support upgrading the application that Puma is serving, ensure `prune_bundler` is enabled and that `preload_app!` is disabled -* Supported on all platforms where cluster mode is supported - -### Client experience - -* In-flight requests are always served responses before the connection is closed gracefully -* Idle persistent connections are gracefully disconnected -* New connections are not lost, and clients will not experience any increase in latency (as long as the number of configured workers is greater than one) - -### Additional notes - -* When a phased restart begins, the Puma master process changes its current working directory to the directory specified by the `directory` option. If `directory` is set to symlink, this is automatically re-evaluated, so this mechanism can be used to upgrade the application. -* On a single server, it's possible that two versions of the application are running concurrently during a phased restart. -* `on_restart` is not invoked -* Phased restarts can be slow for Puma clusters with many workers. Hot restarts often complete more quickly, but at the cost of increased latency during the restart. -* Phased restarts cannot be used to upgrade any gems loaded by the Puma master process, including `puma` itself, anything in `extra_runtime_dependencies`, or dependencies thereof. Upgrading other gems is safe. -* If you remove the gems from old releases as part of your deployment strategy, there are additional considerations. Do not put any gems into `extra_runtime_dependencies` that have native extensions or have dependencies that have native extensions (one common example is `puma_worker_killer` and its dependency on `ffi`). Workers will fail on boot during a phased restart. The underlying issue is recorded in [an issue on the rubygems project](https://github.com/rubygems/rubygems/issues/4004). Hot restarts are your only option here if you need these dependencies. diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/signals.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/signals.md deleted file mode 100644 index d3a17c5..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/signals.md +++ /dev/null @@ -1,98 +0,0 @@ -The [unix signal](https://en.wikipedia.org/wiki/Unix_signal) is a method of sending messages between [processes](https://en.wikipedia.org/wiki/Process_(computing)). When a signal is sent, the operating system interrupts the target process's normal flow of execution. There are standard signals that are used to stop a process, but there are also custom signals that can be used for other purposes. This document is an attempt to list all supported signals that Puma will respond to. In general, signals need only be sent to the master process of a cluster. - -## Sending Signals - -If you are new to signals, it can be helpful to see how they are used. When a process starts in a *nix-like operating system, it will have a [PID - or process identifier](https://en.wikipedia.org/wiki/Process_identifier) that can be used to send signals to the process. For demonstration, we will create an infinitely running process by tailing a file: - -```sh -$ echo "foo" >> my.log -$ irb -> pid = Process.spawn 'tail -f my.log' -``` - -From here, we can see that the tail process is running by using the `ps` command: - -```sh -$ ps aux | grep tail -schneems 87152 0.0 0.0 2432772 492 s032 S+ 12:46PM 0:00.00 tail -f my.log -``` - -You can send a signal in Ruby using the [Process module](https://docs.ruby-lang.org/en/master/Process.html#method-c-kill): - -``` -$ irb -> puts pid -=> 87152 -Process.detach(pid) # https://docs.ruby-lang.org/en/master/Process.html#method-c-detach -Process.kill("TERM", pid) -``` - -Now you will see via `ps` that there is no more `tail` process. Sometimes when referring to signals, the `SIG` prefix will be used. For example, `SIGTERM` is equivalent to sending `TERM` via `Process.kill`. - -## Puma Signals - -Puma cluster responds to these signals: - -- `TTIN` increment the worker count by 1 -- `TTOU` decrement the worker count by 1 -- `TERM` send `TERM` to worker. The worker will attempt to finish then exit. -- `USR2` restart workers. This also reloads the Puma configuration file, if there is one. -- `USR1` restart workers in phases, a rolling restart. This will not reload the configuration file. -- `HUP ` reopen log files defined in stdout_redirect configuration parameter. If there is no stdout_redirect option provided, it will behave like `INT` -- `INT ` equivalent of sending Ctrl-C to cluster. Puma will attempt to finish then exit. -- `CHLD` -- `URG ` refork workers in phases from worker 0 if `fork_workers` option is enabled. -- `INFO` print backtraces of all puma threads - -## Callbacks order in case of different signals - -### Start application - -``` -puma configuration file reloaded, if there is one -* Pruning Bundler environment -puma configuration file reloaded, if there is one - -before_fork -on_worker_fork -after_worker_fork - -Gemfile in context - -on_worker_boot - -Code of the app is loaded and running -``` - -### Send USR2 - -``` -on_worker_shutdown -on_restart - -puma configuration file reloaded, if there is one - -before_fork -on_worker_fork -after_worker_fork - -Gemfile in context - -on_worker_boot - -Code of the app is loaded and running -``` - -### Send USR1 - -``` -on_worker_shutdown -on_worker_fork -after_worker_fork - -Gemfile in context - -on_worker_boot - -Code of the app is loaded and running -``` diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/stats.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/stats.md deleted file mode 100644 index 2b55980..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/stats.md +++ /dev/null @@ -1,147 +0,0 @@ -## Accessing stats - -Stats can be accessed in two ways: - -### control server - -`$ pumactl stats` or `GET /stats` - -[Read more about `pumactl` and the control server in the README.](https://github.com/puma/puma#controlstatus-server). - -### Puma.stats - -`Puma.stats` produces a JSON string. `Puma.stats_hash` produces a ruby hash. - -#### in single mode - -Invoke `Puma.stats` anywhere in runtime, e.g. in a rails initializer: - -```ruby -# config/initializers/puma_stats.rb - -Thread.new do - loop do - sleep 30 - puts Puma.stats - end -end -``` - -#### in cluster mode - -Invoke `Puma.stats` from the master process - -```ruby -# config/puma.rb - -before_fork do - Thread.new do - loop do - puts Puma.stats - sleep 30 - end - end -end -``` - - -## Explanation of stats - -`Puma.stats` returns different information and a different structure depending on if Puma is in single vs. cluster mode. There is one top-level attribute that is common to both modes: - -* started_at: when Puma was started - -### single mode and individual workers in cluster mode - -When Puma runs in single mode, these stats are available at the top level. When Puma runs in cluster mode, these stats are available within the `worker_status` array in a hash labeled `last_status`, in an array of hashes where one hash represents each worker. - -* backlog: requests that are waiting for an available thread to be available. if this is frequently above 0, you need more capacity. -* running: how many threads are spawned. A spawned thread may be busy processing a request or waiting for a new request. If `min_threads` and `max_threads` are set to the same number, - this will be a never-changing number (other than rare cases when a thread dies, etc). -* busy_threads: `running` - `how many threads are waiting to receive work` + `how many requests are waiting for a thread to pick them up`. - this is a "wholistic" stat reflecting the overall current state of work to be done and the capacity to do it. -* pool_capacity: `how many threads are waiting to receive work` + `max_threads` - `running`. In a typical configuration where `min_threads` - and `max_threads` are configured to the same number, this is simply `how many threads are waiting to receive work`. This number exists only as a stat - and is not used for any internal decisions, unlike `busy_theads`, which is usually a more useful stat. -* max_threads: the maximum number of threads Puma is configured to spool per worker -* requests_count: the number of requests this worker has served since starting - - -### cluster mode - -* phase: which phase of restart the process is in, during [phased restart](https://github.com/puma/puma/blob/master/docs/restart.md) -* workers: ?? -* booted_workers: how many workers currently running? -* old_workers: ?? -* worker_status: array of hashes of info for each worker (see below) - -### worker status - -* started_at: when the worker started -* pid: the process id of the worker process -* index: each worker gets a number. if Puma is configured to have 3 workers, then this will be 0, 1, or 2 -* booted: if it's done booting [?] -* last_checkin: Last time the worker responded to the master process' heartbeat check. -* last_status: a hash of info about the worker's state handling requests. See the explanation for this in "single mode and individual workers in cluster mode" section above. - - -## Examples - -Here are two example stats hashes produced by `Puma.stats`: - -### single - -```json -{ - "started_at": "2021-01-14T07:12:35Z", - "backlog": 0, - "running": 5, - "pool_capacity": 5, - "max_threads": 5, - "requests_count": 3 -} -``` - -### cluster - -```json -{ - "started_at": "2021-01-14T07:09:17Z", - "workers": 2, - "phase": 0, - "booted_workers": 2, - "old_workers": 0, - "worker_status": [ - { - "started_at": "2021-01-14T07:09:24Z", - "pid": 64136, - "index": 0, - "phase": 0, - "booted": true, - "last_checkin": "2021-01-14T07:11:09Z", - "last_status": { - "backlog": 0, - "running": 5, - "pool_capacity": 5, - "max_threads": 5, - "requests_count": 2 - } - }, - { - "started_at": "2021-01-14T07:09:24Z", - "pid": 64137, - "index": 1, - "phase": 0, - "booted": true, - "last_checkin": "2021-01-14T07:11:09Z", - "last_status": { - "backlog": 0, - "running": 5, - "pool_capacity": 5, - "max_threads": 5, - "requests_count": 1 - } - } - ] -} -``` diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/systemd.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/systemd.md deleted file mode 100644 index cf7f9b0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/systemd.md +++ /dev/null @@ -1,253 +0,0 @@ -# systemd - -[systemd](https://www.freedesktop.org/wiki/Software/systemd/) is a commonly -available init system (PID 1) on many Linux distributions. It offers process -monitoring (including automatic restarts) and other useful features for running -Puma in production. - -## Service Configuration - -Below is a sample puma.service configuration file for systemd, which can be -copied or symlinked to `/etc/systemd/system/puma.service`, or if desired, using -an application or instance-specific name. - -Note that this uses the systemd preferred "simple" type where the start command -remains running in the foreground (does not fork and exit). - -~~~~ ini -[Unit] -Description=Puma HTTP Server -After=network.target - -# Uncomment for socket activation (see below) -# Requires=puma.socket - -[Service] -# Puma supports systemd's `Type=notify` and watchdog service -# monitoring, as of Puma 5.1 or later. -# On earlier versions of Puma or JRuby, change this to `Type=simple` and remove -# the `WatchdogSec` line. -Type=notify - -# If your Puma process locks up, systemd's watchdog will restart it within seconds. -WatchdogSec=10 - -# Preferably configure a non-privileged user -# User= - -# The path to your application code root directory. -# Also replace the "" placeholders below with this path. -# Example /home/username/myapp -WorkingDirectory= - -# Helpful for debugging socket activation, etc. -# Environment=PUMA_DEBUG=1 - -# SystemD will not run puma even if it is in your path. You must specify -# an absolute URL to puma. For example /usr/local/bin/puma -# Alternatively, create a binstub with `bundle binstubs puma --path ./sbin` in the WorkingDirectory -ExecStart=//bin/puma -C /puma.rb - -# Variant: Rails start. -# ExecStart=//bin/puma -C /config/puma.rb ../config.ru - -# Variant: Use `bundle exec puma` instead of binstub -# Variant: Specify directives inline. -# ExecStart=//puma -b tcp://0.0.0.0:9292 -b ssl://0.0.0.0:9293?key=key.pem&cert=cert.pem - - -Restart=always - -[Install] -WantedBy=multi-user.target -~~~~ - -See -[systemd.exec](https://www.freedesktop.org/software/systemd/man/systemd.exec.html) -for additional details. - -## Socket Activation - -systemd and Puma also support socket activation, where systemd opens the -listening socket(s) in advance and provides them to the Puma master process on -startup. Among other advantages, this keeps listening sockets open across puma -restarts and achieves graceful restarts, including when upgraded Puma, and is -compatible with both cluster mode and application preload. - -**Note:** Any wrapper scripts which `exec`, or other indirections in `ExecStart` -may result in activated socket file descriptors being closed before reaching the -puma master process. - -**Note:** Socket activation doesn't currently work on JRuby. This is tracked in -[#1367]. - -Configure one or more `ListenStream` sockets in a companion `*.socket` unit file -to use socket activation. Also, uncomment the associated `Requires` directive -for the socket unit in the service file (see above.) Here is a sample -puma.socket, matching the ports used in the above puma.service: - -~~~~ ini -[Unit] -Description=Puma HTTP Server Accept Sockets - -[Socket] -ListenStream=0.0.0.0:9292 -ListenStream=0.0.0.0:9293 - -# AF_UNIX domain socket -# SocketUser, SocketGroup, etc. may be needed for Unix domain sockets -# ListenStream=/run/puma.sock - -# Socket options matching Puma defaults -ReusePort=true -Backlog=1024 -# Enable this if you're using Puma with the "low_latency" option, read more in Puma DSL docs and systemd docs: -# https://www.freedesktop.org/software/systemd/man/latest/systemd.socket.html#NoDelay= -# NoDelay=true - -[Install] -WantedBy=sockets.target -~~~~ - -See -[systemd.socket](https://www.freedesktop.org/software/systemd/man/systemd.socket.html) -for additional configuration details. - -Note that the above configurations will work with Puma in either single process -or cluster mode. - -### Sockets and symlinks - -When using releases folders, you should set the socket path using the shared -folder path (ex. `/srv/projet/shared/tmp/puma.sock`), not the release folder -path (`/srv/projet/releases/1234/tmp/puma.sock`). - -Puma will detect the release path socket as different than the one provided by -systemd and attempt to bind it again, resulting in the exception `There is -already a server bound to:`. - -### Binding - -By default, you need to configure Puma to have binds matching with all -ListenStream statements. Any mismatched systemd ListenStreams will be closed by -Puma. - -To automatically bind to all activated sockets, the option -`--bind-to-activated-sockets` can be used. This matches the config DSL -`bind_to_activated_sockets` statement. This will cause Puma to create a bind -automatically for any activated socket. When systemd socket activation is not -enabled, this option does nothing. - -This also accepts an optional argument `only` (DSL: `'only'`) to discard any -binds that's not socket activated. - -## Usage - -Without socket activation, use `systemctl` as root (i.e., via `sudo`) as with -other system services: - -~~~~ sh -# After installing or making changes to puma.service -systemctl daemon-reload - -# Enable so it starts on boot -systemctl enable puma.service - -# Initial startup. -systemctl start puma.service - -# Check status -systemctl status puma.service - -# A normal restart. Warning: listener's sockets will be closed -# while a new puma process initializes. -systemctl restart puma.service -~~~~ - -With socket activation, several but not all of these commands should be run for -both socket and service: - -~~~~ sh -# After installing or making changes to either puma.socket or -# puma.service. -systemctl daemon-reload - -# Enable both socket and service, so they start on boot. Alternatively -# you could leave puma.service disabled, and systemd will start it on -# the first use (with startup lag on the first request) -systemctl enable puma.socket puma.service - -# Initial startup. The Requires directive (see above) ensures the -# socket is started before the service. -systemctl start puma.socket puma.service - -# Check the status of both socket and service. -systemctl status puma.socket puma.service - -# A "hot" restart, with systemd keeping puma.socket listening and -# providing to the new puma (master) instance. -systemctl restart puma.service - -# A normal restart, needed to handle changes to -# puma.socket, such as changing the ListenStream ports. Note -# daemon-reload (above) should be run first. -systemctl restart puma.socket puma.service -~~~~ - -Here is sample output from `systemctl status` with both service and socket -running: - -~~~~ -● puma.socket - Puma HTTP Server Accept Sockets - Loaded: loaded (/etc/systemd/system/puma.socket; enabled; vendor preset: enabled) - Active: active (running) since Thu 2016-04-07 08:40:19 PDT; 1h 2min ago - Listen: 0.0.0.0:9233 (Stream) - 0.0.0.0:9234 (Stream) - -Apr 07 08:40:19 hx systemd[874]: Listening on Puma HTTP Server Accept Sockets. - -● puma.service - Puma HTTP Server - Loaded: loaded (/etc/systemd/system/puma.service; enabled; vendor preset: enabled) - Active: active (running) since Thu 2016-04-07 08:40:19 PDT; 1h 2min ago - Main PID: 28320 (ruby) - CGroup: /system.slice/puma.service - ├─28320 puma 3.3.0 (tcp://0.0.0.0:9233,ssl://0.0.0.0:9234?key=key.pem&cert=cert.pem) [app] - ├─28323 puma: cluster worker 0: 28320 [app] - └─28327 puma: cluster worker 1: 28320 [app] - -Apr 07 08:40:19 hx puma[28320]: Puma starting in cluster mode... -Apr 07 08:40:19 hx puma[28320]: * Version 3.3.0 (ruby 2.2.4-p230), codename: Jovial Platypus -Apr 07 08:40:19 hx puma[28320]: * Min threads: 0, max threads: 16 -Apr 07 08:40:19 hx puma[28320]: * Environment: production -Apr 07 08:40:19 hx puma[28320]: * Process workers: 2 -Apr 07 08:40:19 hx puma[28320]: * Phased restart available -Apr 07 08:40:19 hx puma[28320]: * Activated tcp://0.0.0.0:9233 -Apr 07 08:40:19 hx puma[28320]: * Activated ssl://0.0.0.0:9234?key=key.pem&cert=cert.pem -Apr 07 08:40:19 hx puma[28320]: Use Ctrl-C to stop -~~~~ - -### capistrano3-puma - -By default, [capistrano3-puma](https://github.com/seuros/capistrano-puma) uses -`pumactl` for deployment restarts outside of systemd. To learn the exact -commands that this tool would use for `ExecStart` and `ExecStop`, use the -following `cap` commands in dry-run mode, and update from the above forking -service configuration accordingly. Note also that the configured `User` should -likely be the same as the capistrano3-puma `:puma_user` option. - -~~~~ sh -stage=production # or different stage, as needed -cap $stage puma:start --dry-run -cap $stage puma:stop --dry-run -~~~~ - -### Disabling Puma Systemd Integration - -If you would like to disable Puma's systemd integration, for example if you handle it elsewhere -in your code yourself, simply set the the environment variable `PUMA_SKIP_SYSTEMD` to any value. - - - -[Restart]: https://www.freedesktop.org/software/systemd/man/systemd.service.html#Restart= -[#1367]: https://github.com/puma/puma/issues/1367 -[#1499]: https://github.com/puma/puma/issues/1499 diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/testing_benchmarks_local_files.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/testing_benchmarks_local_files.md deleted file mode 100644 index aea776b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/testing_benchmarks_local_files.md +++ /dev/null @@ -1,150 +0,0 @@ -# Testing - benchmark/local files - -These files generate data that shows request-per-second (RPS), etc. Typically, files are in -pairs, a shell script and a Ruby script. The shell script starts the server, then runs the -Ruby file, which starts client request stream(s), then collects and logs metrics. - -## response_time_wrk.sh - -This uses [wrk] for generating data. One or more wrk runs are performed. Summarizes RPS and -wrk latency times. The default for the `-b` argument runs 28 different client request streams, -and takes a bit over 5 minutes. See 'Request Stream Configuration' below for `-b` argument -description. - -
- Summary output for
benchmarks/local/response_time_wrk.sh -w2 -t5:5 -s tcp6:
- -``` -Type req/sec 50% 75% 90% 99% 100% Resp Size -───────────────────────────────────────────────────────────────── 1kB -array 13710 0.74 2.52 5.23 7.76 37.45 1024 -chunk 13502 0.76 2.55 5.28 7.84 11.23 1042 -string 13794 0.74 2.51 5.20 7.75 14.07 1024 -io 9615 1.16 3.45 7.13 10.57 15.75 1024 -───────────────────────────────────────────────────────────────── 10kB -array 13458 0.76 2.57 5.31 7.93 13.94 10239 -chunk 13066 0.78 2.64 5.46 8.18 38.48 10320 -string 13500 0.76 2.55 5.29 7.88 11.42 10240 -io 9293 1.18 3.59 7.39 10.94 16.99 10240 -───────────────────────────────────────────────────────────────── 100kB -array 11315 0.96 3.06 6.33 9.49 17.69 102424 -chunk 9916 1.10 3.48 7.20 10.73 15.14 103075 -string 10948 1.00 3.17 6.57 9.83 17.88 102378 -io 8901 1.21 3.72 7.48 11.27 59.98 102407 -───────────────────────────────────────────────────────────────── 256kB -array 9217 1.15 3.82 7.88 11.74 17.12 262212 -chunk 7339 1.45 4.76 9.81 14.63 22.70 264007 -string 8574 1.19 3.81 7.73 11.21 15.80 262147 -io 8911 1.19 3.80 7.55 15.25 60.01 262183 -───────────────────────────────────────────────────────────────── 512kB -array 6951 1.49 5.03 10.28 15.90 25.08 524378 -chunk 5234 2.03 6.56 13.57 20.46 32.15 527862 -string 6438 1.55 5.04 10.12 16.28 72.87 524275 -io 8533 1.15 4.62 8.79 48.15 70.51 524327 -───────────────────────────────────────────────────────────────── 1024kB -array 4122 1.80 15.59 41.87 67.79 121.00 1048565 -chunk 3158 2.82 15.22 31.00 71.39 99.90 1055654 -string 4710 2.24 6.66 13.65 20.38 70.44 1048575 -io 8355 1.23 3.95 7.94 14.08 68.54 1048498 -───────────────────────────────────────────────────────────────── 2048kB -array 2454 4.12 14.02 27.70 43.48 88.89 2097415 -chunk 1743 6.26 17.65 36.98 55.78 92.10 2111358 -string 2479 4.38 12.52 25.65 38.44 95.62 2097502 -io 8264 1.25 3.83 7.76 11.73 65.69 2097090 - -Body ────────── req/sec ────────── ─────── req 50% times ─────── - KB array chunk string io array chunk string io -1 13710 13502 13794 9615 0.745 0.757 0.741 1.160 -10 13458 13066 13500 9293 0.760 0.784 0.759 1.180 -100 11315 9916 10948 8901 0.960 1.100 1.000 1.210 -256 9217 7339 8574 8911 1.150 1.450 1.190 1.190 -512 6951 5234 6438 8533 1.490 2.030 1.550 1.150 -1024 4122 3158 4710 8355 1.800 2.820 2.240 1.230 -2048 2454 1743 2479 8264 4.120 6.260 4.380 1.250 -───────────────────────────────────────────────────────────────────── -wrk -t8 -c16 -d10s -benchmarks/local/response_time_wrk.sh -w2 -t5:5 -s tcp6 -Y -Server cluster mode -w2 -t5:5, bind: tcp6 -Puma repo branch 00-response-refactor -ruby 3.2.0dev (2022-06-14T01:21:55Z master 048f14221c) +YJIT [x86_64-linux] - -[2136] - Gracefully shutting down workers... -[2136] === puma shutdown: 2022-06-13 21:16:13 -0500 === -[2136] - Goodbye! - - 5:15 Total Time -``` -

- -## bench_base.sh, bench_base.rb - -These two files setup parameters for the Puma server, which is normally started in a shell -script. It then starts a Ruby file (a subclass of BenchBase), passing arguments to it. The -Ruby file is normally used to generate a client request stream(s). - -### Puma Configuration - -The following arguments are used for the Puma server: - -* **`-C`** - configuration file -* **`-d`** - app delay -* **`-r`** - rackup file, often defaults to test/rackup/ci_select.ru -* **`-s`** - bind socket type, default is tcp/tcp4, also tcp6, ssl/ssl4, ssl6, unix, or aunix - (unix & abstract unix are not available with wrk). -* **`-t`** - threads, expressed as '5:5', same as Puma --thread -* **`-w`** - workers, same as Puma --worker -* **`-Y`** - enable Ruby YJIT - -### Request Stream Configuration - -The following arguments are used for request streams: - -* **`-b`** - response body configuration. Body type options are a array, c chunked, s string, - and i for File/IO. None or any combination can be specified, they should start the option. - Then, any combination of comma separated integers can be used for the response body size - in kB. The string 'ac50,100' would create four runs, 50kb array, 50kB chunked, 100kB array, - and 100kB chunked. See 'Testing - test/rackup/ci-*.ru files' for more info. -* **`-c`** - connections per client request stream thread, defaults to 2 for wrk. -* **`-D`** - duration of client request stream in seconds. -* **`-T`** - number of threads in the client request stream. For wrk, this defaults to - 80% of Puma workers * max_threads. - -### Notes - Configuration - -The above lists script arguments. - -`bench_base.sh` contains most server defaults. Many can be set via ENV variables. - -`bench_base.rb` contains the client request stream defaults. The default value for -`-b` is `acsi1,10,100,256,512,1024,2048`, which is a 4 x 7 matrix, and hence, runs -28 jobs. Also, the i body type (File/IO) generates files, they are placed in the -`"#{Dir.tmpdir}/.puma_response_body_io"` directory, which is created. - -### Notes - wrk - -The shell scripts use `-T` for wrk's thread count, since `-t` is used for Puma -server threads. Regarding the `-c` argument, wrk has an interesting behavior. -The total number of connections is set by `(connections/threads).to_i`. The scripts -here use `-c` as connections per thread. Hence, using `-T4 -c2` will yield a total -of eight wrk connections, two per thread. The equivalent wrk arguments would be `-t4 -c8`. - -Puma can only process so many requests, and requests will queue in the backlog -until Puma can respond to them. With wrk, if the number of total connections is -too high, one will see the upper latency times increase, pushing into the lower -latency times as the connections are increased. The default values for wrk's -threads and connections were chosen to minimize requests' time in the backlog. - -An example with four wrk runs using `-b s10`. Notice that `req/sec` varies by -less than 1%, but the `75%` times increase by an order of magnitude: -``` -req/sec 50% 75% 90% 99% 100% Resp Size wrk cmd line -───────────────────────────────────────────────────────────────────────────── - 13597 0.755 2.550 5.260 7.800 13.310 12040 wrk -t8 -c16 -d10 - 13549 0.793 4.430 8.140 11.220 16.600 12002 wrk -t10 -c20 -d10 - 13570 1.040 25.790 40.010 49.070 58.300 11982 wrk -t8 -c64 -d10 - 13684 1.050 25.820 40.080 49.160 66.190 12033 wrk -t16 -c64 -d10 -``` -Finally, wrk's output may cause rounding errors, so the response body size calculation is -imprecise. - -[wrk]: diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/testing_test_rackup_ci_files.md b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/testing_test_rackup_ci_files.md deleted file mode 100644 index 029d825..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/docs/testing_test_rackup_ci_files.md +++ /dev/null @@ -1,36 +0,0 @@ -# Testing - test/rackup/ci-*.ru files - -## Overview - -Puma should efficiently handle a variety of response bodies, varying both by size -and by the type of object used for the body. - -Five rackup files are located in 'test/rackup' that can be used. All have their -request body size (in kB) set via `Body-Conf` header or with `ENV['CI_BODY_CONF']`. -Additionally, the ci_select.ru file can have it's body type set via a starting -character. - -* **ci_array.ru** - body is an `Array` of 1kB strings. `Content-Length` is not set. -* **ci_chunked.ru** - body is an `Enumerator` of 1kB strings. `Content-Length` is not set. -* **ci_io.ru** - body is a File/IO object. `Content-Length` is set. -* **ci_string.ru** - body is a single string. `Content-Length` is set. -* **ci_select.ru** - can be any of the above. - -All responses have 25 headers, total length approx 1kB. ci_array.ru and ci_chunked.ru -contain 1kB items. - -All can be delayed by a float value (seconds) specified by the `Dly` header - -Note that rhe `Body-Conf` header takes precedence, and `ENV['CI_BODY_CONF']` is -only read on load. - -## ci_select.ru - -The ci_select.ru file allows a starting character to specify the body type in the -`Body-Conf` header or with `ENV['CI_BODY_CONF']`. -* **a** - array of strings -* **c** - chunked (enum) -* **s** - single string -* **i** - File/IO - -A value of `a100` would return a body as an array of 100 1kB strings. diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/Makefile b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/Makefile deleted file mode 100644 index 0083023..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/Makefile +++ /dev/null @@ -1,269 +0,0 @@ - -SHELL = /bin/sh - -# V=0 quiet, V=1 verbose. other values don't work. -V = 0 -V0 = $(V:0=) -Q1 = $(V:1=) -Q = $(Q1:0=@) -ECHO1 = $(V:1=@ :) -ECHO = $(ECHO1:0=@ echo) -NULLCMD = : - -#### Start of system configuration section. #### - -srcdir = . -topdir = /usr/include/ruby-3.2.0 -hdrdir = $(topdir) -arch_hdrdir = /usr/include/x86_64-linux-gnu/ruby-3.2.0 -PATH_SEPARATOR = : -VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby -prefix = $(DESTDIR)/usr -rubysitearchprefix = $(sitearchlibdir)/$(RUBY_BASE_NAME) -rubyarchprefix = $(archlibdir)/$(RUBY_BASE_NAME) -rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) -exec_prefix = $(prefix) -vendorarchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/vendor_ruby -sitearchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/site_ruby -rubyarchhdrdir = $(archincludedir)/$(RUBY_VERSION_NAME) -vendorhdrdir = $(rubyhdrdir)/vendor_ruby -sitehdrdir = $(rubyhdrdir)/site_ruby -rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) -vendorarchdir = $(rubysitearchprefix)/vendor_ruby/$(ruby_version) -vendorlibdir = $(vendordir)/$(ruby_version) -vendordir = $(rubylibprefix)/vendor_ruby -sitearchdir = $(DESTDIR)/usr/local/lib/x86_64-linux-gnu/site_ruby -sitelibdir = $(sitedir)/$(ruby_version) -sitedir = $(DESTDIR)/usr/local/lib/site_ruby -rubyarchdir = $(rubyarchprefix)/$(ruby_version) -rubylibdir = $(rubylibprefix)/$(ruby_version) -sitearchincludedir = $(includedir)/$(sitearch) -archincludedir = $(includedir)/$(arch) -sitearchlibdir = $(libdir)/$(sitearch) -archlibdir = $(libdir)/$(arch) -ridir = $(datarootdir)/$(RI_BASE_NAME) -mandir = $(datarootdir)/man -localedir = $(datarootdir)/locale -libdir = $(exec_prefix)/lib -psdir = $(docdir) -pdfdir = $(docdir) -dvidir = $(docdir) -htmldir = $(docdir) -infodir = $(datarootdir)/info -docdir = $(datarootdir)/doc/$(PACKAGE) -oldincludedir = $(DESTDIR)/usr/include -includedir = $(prefix)/include -runstatedir = $(DESTDIR)/var/run -localstatedir = $(DESTDIR)/var -sharedstatedir = $(prefix)/com -sysconfdir = $(DESTDIR)/etc -datadir = $(datarootdir) -datarootdir = $(prefix)/share -libexecdir = $(exec_prefix)/libexec -sbindir = $(exec_prefix)/sbin -bindir = $(exec_prefix)/bin -archdir = $(rubyarchdir) - - -CC_WRAPPER = -CC = x86_64-linux-gnu-gcc -CXX = x86_64-linux-gnu-g++ -LIBRUBY = $(LIBRUBY_SO) -LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a -LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) -LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static $(MAINLIBS) -empty = -OUTFLAG = -o $(empty) -COUTFLAG = -o $(empty) -CSRCFLAG = $(empty) - -RUBY_EXTCONF_H = -cflags = $(optflags) $(debugflags) $(warnflags) -cxxflags = -optflags = -O3 -fno-fast-math -debugflags = -ggdb3 -warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdiv-by-zero -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wold-style-definition -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef -cppflags = -CCDLFLAGS = -fPIC -CFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC $(ARCH_FLAG) -INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) -DEFS = -CPPFLAGS = -DHAVE_OPENSSL_BIO_H -DHAVE_DTLS_METHOD -DHAVE_SSL_CTX_SET_SESSION_CACHE_MODE -DHAVE_TLS_SERVER_METHOD -DHAVE_SSL_CTX_SET_MIN_PROTO_VERSION -DHAVE_SSL_CTX_SET_DH_AUTO -DHAVE_SSL_CTX_SET_CIPHERSUITES -DHAVE_SSL_GET1_PEER_CERTIFICATE -DHAVE_RANDOM_BYTES -Wdate-time -D_FORTIFY_SOURCE=3 $(DEFS) $(cppflags) -CXXFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 $(ARCH_FLAG) -ldflags = -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -dldflags = -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -ARCH_FLAG = -DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) -LDSHARED = $(CC) -shared -LDSHAREDXX = $(CXX) -shared -AR = x86_64-linux-gnu-gcc-ar -EXEEXT = - -RUBY_INSTALL_NAME = $(RUBY_BASE_NAME)3.2 -RUBY_SO_NAME = ruby-3.2 -RUBYW_INSTALL_NAME = -RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) -RUBYW_BASE_NAME = rubyw -RUBY_BASE_NAME = ruby - -arch = x86_64-linux-gnu -sitearch = $(arch) -ruby_version = 3.2.0 -ruby = $(bindir)/$(RUBY_BASE_NAME)3.2 -RUBY = $(ruby) -BUILTRUBY = $(bindir)/$(RUBY_BASE_NAME)3.2 -ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h - -RM = rm -f -RM_RF = rm -fr -RMDIRS = rmdir --ignore-fail-on-non-empty -p -MAKEDIRS = /bin/mkdir -p -INSTALL = /usr/bin/install -c -INSTALL_PROG = $(INSTALL) -m 0755 -INSTALL_DATA = $(INSTALL) -m 644 -COPY = cp -TOUCH = exit > - -#### End of system configuration section. #### - -preload = -libpath = . $(archlibdir) -LIBPATH = -L. -L$(archlibdir) -DEFFILE = - -CLEANFILES = mkmf.log -DISTCLEANFILES = -DISTCLEANDIRS = - -extout = -extout_prefix = -target_prefix = /puma -LOCAL_LIBS = -LIBS = $(LIBRUBYARG_SHARED) -lssl -lcrypto -lm -lpthread -lc -ORIG_SRCS = http11_parser.c mini_ssl.c puma_http11.c -SRCS = $(ORIG_SRCS) -OBJS = http11_parser.o mini_ssl.o puma_http11.o -HDRS = $(srcdir)/ext_help.h $(srcdir)/http11_parser.h -LOCAL_HDRS = -TARGET = puma_http11 -TARGET_NAME = puma_http11 -TARGET_ENTRY = Init_$(TARGET_NAME) -DLLIB = $(TARGET).so -EXTSTATIC = -STATIC_LIB = - -TIMESTAMP_DIR = . -BINDIR = $(bindir) -RUBYCOMMONDIR = $(sitedir)$(target_prefix) -RUBYLIBDIR = $(sitelibdir)$(target_prefix) -RUBYARCHDIR = $(sitearchdir)$(target_prefix) -HDRDIR = $(sitehdrdir)$(target_prefix) -ARCHHDRDIR = $(sitearchhdrdir)$(target_prefix) -TARGET_SO_DIR = -TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) -CLEANLIBS = $(TARGET_SO) false -CLEANOBJS = $(OBJS) *.bak -TARGET_SO_DIR_TIMESTAMP = $(TIMESTAMP_DIR)/.sitearchdir.-.puma.time - -all: $(DLLIB) -static: $(STATIC_LIB) -.PHONY: all install static install-so install-rb -.PHONY: clean clean-so clean-static clean-rb - -clean-static:: -clean-rb-default:: -clean-rb:: -clean-so:: -clean: clean-so clean-static clean-rb-default clean-rb - -$(Q)$(RM_RF) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time - -distclean-rb-default:: -distclean-rb:: -distclean-so:: -distclean-static:: -distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb - -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log - -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) - -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true - -realclean: distclean -install: install-so install-rb - -install-so: $(DLLIB) $(TARGET_SO_DIR_TIMESTAMP) - $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) -clean-static:: - -$(Q)$(RM) $(STATIC_LIB) -install-rb: pre-install-rb do-install-rb install-rb-default -install-rb-default: pre-install-rb-default do-install-rb-default -pre-install-rb: Makefile -pre-install-rb-default: Makefile -do-install-rb: -do-install-rb-default: -pre-install-rb-default: - @$(NULLCMD) -$(TARGET_SO_DIR_TIMESTAMP): - $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) - $(Q) $(TOUCH) $@ - -site-install: site-install-so site-install-rb -site-install-so: install-so -site-install-rb: install-rb - -.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S - -.cc.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cc.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.mm.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.mm.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cxx.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cxx.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cpp.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cpp.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.c.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.c.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.m.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.m.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -$(TARGET_SO): $(OBJS) Makefile - $(ECHO) linking shared-object puma/$(DLLIB) - -$(Q)$(RM) $(@) - $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) - - - -$(OBJS): $(HDRS) $(ruby_headers) diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/PumaHttp11Service.java b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/PumaHttp11Service.java deleted file mode 100644 index 00f63aa..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/PumaHttp11Service.java +++ /dev/null @@ -1,17 +0,0 @@ -package puma; - -import java.io.IOException; - -import org.jruby.Ruby; -import org.jruby.runtime.load.BasicLibraryService; - -import org.jruby.puma.Http11; -import org.jruby.puma.MiniSSL; - -public class PumaHttp11Service implements BasicLibraryService { - public boolean basicLoad(final Ruby runtime) throws IOException { - Http11.createHttp11(runtime); - MiniSSL.createMiniSSL(runtime); - return true; - } -} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/ext_help.h b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/ext_help.h deleted file mode 100644 index ba09e6d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/ext_help.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef ext_help_h -#define ext_help_h - -#define RAISE_NOT_NULL(T) if(T == NULL) rb_raise(rb_eArgError, "%s", "NULL found for " # T " when shouldn't be."); -#define DATA_GET(from,type,data_type,name) TypedData_Get_Struct(from,type,data_type,name); RAISE_NOT_NULL(name); -#define REQUIRE_TYPE(V, T) if(TYPE(V) != T) rb_raise(rb_eTypeError, "%s", "Wrong argument type for " # V " required " # T); -#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) - -#ifdef DEBUG -#define TRACE() fprintf(stderr, "> %s:%d:%s\n", __FILE__, __LINE__, __FUNCTION__) -#else -#define TRACE() -#endif - -#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/extconf.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/extconf.rb deleted file mode 100644 index 5748647..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/extconf.rb +++ /dev/null @@ -1,80 +0,0 @@ -require 'mkmf' - -dir_config("puma_http11") - -if $mingw - append_cflags '-fstack-protector-strong -D_FORTIFY_SOURCE=2' - append_ldflags '-fstack-protector-strong -l:libssp.a' - have_library 'ssp' -end - -unless ENV["PUMA_DISABLE_SSL"] - # don't use pkg_config('openssl') if '--with-openssl-dir' is used - has_openssl_dir = dir_config('openssl').any? || - RbConfig::CONFIG['configure_args']&.include?('openssl') - - found_pkg_config = !has_openssl_dir && pkg_config('openssl') - - found_ssl = if !$mingw && found_pkg_config - puts '──── Using OpenSSL pkgconfig (openssl.pc) ────' - true - elsif have_library('libcrypto', 'BIO_read') && have_library('libssl', 'SSL_CTX_new') - true - elsif %w'crypto libeay32'.find {|crypto| have_library(crypto, 'BIO_read')} && - %w'ssl ssleay32'.find {|ssl| have_library(ssl, 'SSL_CTX_new')} - true - else - puts '** Puma will be compiled without SSL support' - false - end - - if found_ssl - have_header "openssl/bio.h" - - ssl_h = "openssl/ssl.h".freeze - - puts "\n──── Below are yes for 1.0.2 & later ────" - have_func "DTLS_method" , ssl_h - have_func "SSL_CTX_set_session_cache_mode(NULL, 0)", ssl_h - - puts "\n──── Below are yes for 1.1.0 & later ────" - have_func "TLS_server_method" , ssl_h - have_func "SSL_CTX_set_min_proto_version(NULL, 0)" , ssl_h - - puts "\n──── Below is yes for 1.1.0 and later, but isn't documented until 3.0.0 ────" - # https://github.com/openssl/openssl/blob/OpenSSL_1_1_0/include/openssl/ssl.h#L1159 - have_func "SSL_CTX_set_dh_auto(NULL, 0)" , ssl_h - - puts "\n──── Below is yes for 1.1.1 & later ────" - have_func "SSL_CTX_set_ciphersuites(NULL, \"\")" , ssl_h - - puts "\n──── Below is yes for 3.0.0 & later ────" - have_func "SSL_get1_peer_certificate" , ssl_h - - puts '' - - # Random.bytes available in Ruby 2.5 and later, Random::DEFAULT deprecated in 3.0 - if Random.respond_to?(:bytes) - $defs.push "-DHAVE_RANDOM_BYTES" - puts "checking for Random.bytes... yes" - else - puts "checking for Random.bytes... no" - end - end -end - -if ENV["PUMA_MAKE_WARNINGS_INTO_ERRORS"] - # Make all warnings into errors - # Except `implicit-fallthrough` since most failures comes from ragel state machine generated code - if respond_to?(:append_cflags, true) # Ruby 2.5 and later - append_cflags(config_string('WERRORFLAG') || '-Werror') - append_cflags '-Wno-implicit-fallthrough' - else - # flag may not exist on some platforms, -Werror may not be defined on some platforms, but - # works with all in current CI - $CFLAGS << " #{config_string('WERRORFLAG') || '-Werror'}" - $CFLAGS << ' -Wno-implicit-fallthrough' - end -end - -create_makefile("puma/puma_http11") diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.c b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.c deleted file mode 100644 index 388a098..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.c +++ /dev/null @@ -1,1057 +0,0 @@ - -#line 1 "ext/puma_http11/http11_parser.rl" -/** - * Copyright (c) 2005 Zed A. Shaw - * You can redistribute it and/or modify it under the same terms as Ruby. - * License 3-clause BSD - */ -#include "http11_parser.h" -#include -#include -#include -#include -#include - -/* - * capitalizes all lower-case ASCII characters, - * converts dashes to underscores, and underscores to commas. - */ -static void snake_upcase_char(char *c) -{ - if (*c >= 'a' && *c <= 'z') - *c &= ~0x20; - else if (*c == '_') - *c = ','; - else if (*c == '-') - *c = '_'; -} - -#define LEN(AT, FPC) (FPC - buffer - parser->AT) -#define MARK(M,FPC) (parser->M = (FPC) - buffer) -#define PTR_TO(F) (buffer + parser->F) - -/** Machine **/ - - -#line 81 "ext/puma_http11/http11_parser.rl" - - -/** Data **/ - -#line 42 "ext/puma_http11/http11_parser.c" -static const int puma_parser_start = 1; -static const int puma_parser_first_final = 46; -static const int puma_parser_error = 0; - - -#line 85 "ext/puma_http11/http11_parser.rl" - -int puma_parser_init(puma_parser *parser) { - int cs = 0; - -#line 53 "ext/puma_http11/http11_parser.c" - { - cs = puma_parser_start; - } - -#line 89 "ext/puma_http11/http11_parser.rl" - parser->cs = cs; - parser->body_start = 0; - parser->content_len = 0; - parser->mark = 0; - parser->nread = 0; - parser->field_len = 0; - parser->field_start = 0; - parser->request = Qnil; - parser->body = Qnil; - - return 1; -} - - -/** exec **/ -size_t puma_parser_execute(puma_parser *parser, const char *buffer, size_t len, size_t off) { - const char *p, *pe; - int cs = parser->cs; - - assert(off <= len && "offset past end of buffer"); - - p = buffer+off; - pe = buffer+len; - - /* assert(*pe == '\0' && "pointer does not end on NUL"); */ - assert((size_t) (pe - p) == len - off && "pointers aren't same distance"); - - -#line 87 "ext/puma_http11/http11_parser.c" - { - if ( p == pe ) - goto _test_eof; - switch ( cs ) - { -case 1: - switch( (*p) ) { - case 36: goto tr0; - case 95: goto tr0; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto tr0; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto tr0; - } else - goto tr0; - goto st0; -st0: -cs = 0; - goto _out; -tr0: -#line 37 "ext/puma_http11/http11_parser.rl" - { MARK(mark, p); } - goto st2; -st2: - if ( ++p == pe ) - goto _test_eof2; -case 2: -#line 118 "ext/puma_http11/http11_parser.c" - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st27; - case 95: goto st27; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st27; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st27; - } else - goto st27; - goto st0; -tr2: -#line 50 "ext/puma_http11/http11_parser.rl" - { - parser->request_method(parser, PTR_TO(mark), LEN(mark, p)); - } - goto st3; -st3: - if ( ++p == pe ) - goto _test_eof3; -case 3: -#line 143 "ext/puma_http11/http11_parser.c" - switch( (*p) ) { - case 42: goto tr4; - case 43: goto tr5; - case 47: goto tr6; - case 58: goto tr7; - } - if ( (*p) < 65 ) { - if ( 45 <= (*p) && (*p) <= 57 ) - goto tr5; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr5; - } else - goto tr5; - goto st0; -tr4: -#line 37 "ext/puma_http11/http11_parser.rl" - { MARK(mark, p); } - goto st4; -st4: - if ( ++p == pe ) - goto _test_eof4; -case 4: -#line 167 "ext/puma_http11/http11_parser.c" - switch( (*p) ) { - case 32: goto tr8; - case 35: goto tr9; - } - goto st0; -tr8: -#line 53 "ext/puma_http11/http11_parser.rl" - { - parser->request_uri(parser, PTR_TO(mark), LEN(mark, p)); - } - goto st5; -tr31: -#line 37 "ext/puma_http11/http11_parser.rl" - { MARK(mark, p); } -#line 56 "ext/puma_http11/http11_parser.rl" - { - parser->fragment(parser, PTR_TO(mark), LEN(mark, p)); - } - goto st5; -tr33: -#line 56 "ext/puma_http11/http11_parser.rl" - { - parser->fragment(parser, PTR_TO(mark), LEN(mark, p)); - } - goto st5; -tr37: -#line 69 "ext/puma_http11/http11_parser.rl" - { - parser->request_path(parser, PTR_TO(mark), LEN(mark,p)); - } -#line 53 "ext/puma_http11/http11_parser.rl" - { - parser->request_uri(parser, PTR_TO(mark), LEN(mark, p)); - } - goto st5; -tr41: -#line 60 "ext/puma_http11/http11_parser.rl" - { MARK(query_start, p); } -#line 61 "ext/puma_http11/http11_parser.rl" - { - parser->query_string(parser, PTR_TO(query_start), LEN(query_start, p)); - } -#line 53 "ext/puma_http11/http11_parser.rl" - { - parser->request_uri(parser, PTR_TO(mark), LEN(mark, p)); - } - goto st5; -tr44: -#line 61 "ext/puma_http11/http11_parser.rl" - { - parser->query_string(parser, PTR_TO(query_start), LEN(query_start, p)); - } -#line 53 "ext/puma_http11/http11_parser.rl" - { - parser->request_uri(parser, PTR_TO(mark), LEN(mark, p)); - } - goto st5; -st5: - if ( ++p == pe ) - goto _test_eof5; -case 5: -#line 229 "ext/puma_http11/http11_parser.c" - if ( (*p) == 72 ) - goto tr10; - goto st0; -tr10: -#line 37 "ext/puma_http11/http11_parser.rl" - { MARK(mark, p); } - goto st6; -st6: - if ( ++p == pe ) - goto _test_eof6; -case 6: -#line 241 "ext/puma_http11/http11_parser.c" - if ( (*p) == 84 ) - goto st7; - goto st0; -st7: - if ( ++p == pe ) - goto _test_eof7; -case 7: - if ( (*p) == 84 ) - goto st8; - goto st0; -st8: - if ( ++p == pe ) - goto _test_eof8; -case 8: - if ( (*p) == 80 ) - goto st9; - goto st0; -st9: - if ( ++p == pe ) - goto _test_eof9; -case 9: - if ( (*p) == 47 ) - goto st10; - goto st0; -st10: - if ( ++p == pe ) - goto _test_eof10; -case 10: - if ( 48 <= (*p) && (*p) <= 57 ) - goto st11; - goto st0; -st11: - if ( ++p == pe ) - goto _test_eof11; -case 11: - if ( (*p) == 46 ) - goto st12; - if ( 48 <= (*p) && (*p) <= 57 ) - goto st11; - goto st0; -st12: - if ( ++p == pe ) - goto _test_eof12; -case 12: - if ( 48 <= (*p) && (*p) <= 57 ) - goto st13; - goto st0; -st13: - if ( ++p == pe ) - goto _test_eof13; -case 13: - if ( (*p) == 13 ) - goto tr18; - if ( 48 <= (*p) && (*p) <= 57 ) - goto st13; - goto st0; -tr18: -#line 65 "ext/puma_http11/http11_parser.rl" - { - parser->server_protocol(parser, PTR_TO(mark), LEN(mark, p)); - } - goto st14; -tr26: -#line 46 "ext/puma_http11/http11_parser.rl" - { MARK(mark, p); } -#line 47 "ext/puma_http11/http11_parser.rl" - { - parser->http_field(parser, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p)); - } - goto st14; -tr29: -#line 47 "ext/puma_http11/http11_parser.rl" - { - parser->http_field(parser, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p)); - } - goto st14; -st14: - if ( ++p == pe ) - goto _test_eof14; -case 14: -#line 322 "ext/puma_http11/http11_parser.c" - if ( (*p) == 10 ) - goto st15; - goto st0; -st15: - if ( ++p == pe ) - goto _test_eof15; -case 15: - switch( (*p) ) { - case 13: goto st16; - case 33: goto tr21; - case 124: goto tr21; - case 126: goto tr21; - } - if ( (*p) < 45 ) { - if ( (*p) > 39 ) { - if ( 42 <= (*p) && (*p) <= 43 ) - goto tr21; - } else if ( (*p) >= 35 ) - goto tr21; - } else if ( (*p) > 46 ) { - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr21; - } else if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 122 ) - goto tr21; - } else - goto tr21; - } else - goto tr21; - goto st0; -st16: - if ( ++p == pe ) - goto _test_eof16; -case 16: - if ( (*p) == 10 ) - goto tr22; - goto st0; -tr22: -#line 73 "ext/puma_http11/http11_parser.rl" - { - parser->body_start = p - buffer + 1; - parser->header_done(parser, p + 1, pe - p - 1); - {p++; cs = 46; goto _out;} - } - goto st46; -st46: - if ( ++p == pe ) - goto _test_eof46; -case 46: -#line 373 "ext/puma_http11/http11_parser.c" - goto st0; -tr21: -#line 40 "ext/puma_http11/http11_parser.rl" - { MARK(field_start, p); } -#line 41 "ext/puma_http11/http11_parser.rl" - { snake_upcase_char((char *)p); } - goto st17; -tr23: -#line 41 "ext/puma_http11/http11_parser.rl" - { snake_upcase_char((char *)p); } - goto st17; -st17: - if ( ++p == pe ) - goto _test_eof17; -case 17: -#line 389 "ext/puma_http11/http11_parser.c" - switch( (*p) ) { - case 33: goto tr23; - case 58: goto tr24; - case 124: goto tr23; - case 126: goto tr23; - } - if ( (*p) < 45 ) { - if ( (*p) > 39 ) { - if ( 42 <= (*p) && (*p) <= 43 ) - goto tr23; - } else if ( (*p) >= 35 ) - goto tr23; - } else if ( (*p) > 46 ) { - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr23; - } else if ( (*p) > 90 ) { - if ( 94 <= (*p) && (*p) <= 122 ) - goto tr23; - } else - goto tr23; - } else - goto tr23; - goto st0; -tr24: -#line 42 "ext/puma_http11/http11_parser.rl" - { - parser->field_len = LEN(field_start, p); - } - goto st18; -tr27: -#line 46 "ext/puma_http11/http11_parser.rl" - { MARK(mark, p); } - goto st18; -st18: - if ( ++p == pe ) - goto _test_eof18; -case 18: -#line 428 "ext/puma_http11/http11_parser.c" - switch( (*p) ) { - case 13: goto tr26; - case 32: goto tr27; - case 127: goto st0; - } - if ( (*p) > 8 ) { - if ( 10 <= (*p) && (*p) <= 31 ) - goto st0; - } else if ( (*p) >= 0 ) - goto st0; - goto tr25; -tr25: -#line 46 "ext/puma_http11/http11_parser.rl" - { MARK(mark, p); } - goto st19; -st19: - if ( ++p == pe ) - goto _test_eof19; -case 19: -#line 448 "ext/puma_http11/http11_parser.c" - switch( (*p) ) { - case 13: goto tr29; - case 127: goto st0; - } - if ( (*p) > 8 ) { - if ( 10 <= (*p) && (*p) <= 31 ) - goto st0; - } else if ( (*p) >= 0 ) - goto st0; - goto st19; -tr9: -#line 53 "ext/puma_http11/http11_parser.rl" - { - parser->request_uri(parser, PTR_TO(mark), LEN(mark, p)); - } - goto st20; -tr38: -#line 69 "ext/puma_http11/http11_parser.rl" - { - parser->request_path(parser, PTR_TO(mark), LEN(mark,p)); - } -#line 53 "ext/puma_http11/http11_parser.rl" - { - parser->request_uri(parser, PTR_TO(mark), LEN(mark, p)); - } - goto st20; -tr42: -#line 60 "ext/puma_http11/http11_parser.rl" - { MARK(query_start, p); } -#line 61 "ext/puma_http11/http11_parser.rl" - { - parser->query_string(parser, PTR_TO(query_start), LEN(query_start, p)); - } -#line 53 "ext/puma_http11/http11_parser.rl" - { - parser->request_uri(parser, PTR_TO(mark), LEN(mark, p)); - } - goto st20; -tr45: -#line 61 "ext/puma_http11/http11_parser.rl" - { - parser->query_string(parser, PTR_TO(query_start), LEN(query_start, p)); - } -#line 53 "ext/puma_http11/http11_parser.rl" - { - parser->request_uri(parser, PTR_TO(mark), LEN(mark, p)); - } - goto st20; -st20: - if ( ++p == pe ) - goto _test_eof20; -case 20: -#line 501 "ext/puma_http11/http11_parser.c" - switch( (*p) ) { - case 32: goto tr31; - case 60: goto st0; - case 62: goto st0; - case 127: goto st0; - } - if ( (*p) > 31 ) { - if ( 34 <= (*p) && (*p) <= 35 ) - goto st0; - } else if ( (*p) >= 0 ) - goto st0; - goto tr30; -tr30: -#line 37 "ext/puma_http11/http11_parser.rl" - { MARK(mark, p); } - goto st21; -st21: - if ( ++p == pe ) - goto _test_eof21; -case 21: -#line 522 "ext/puma_http11/http11_parser.c" - switch( (*p) ) { - case 32: goto tr33; - case 60: goto st0; - case 62: goto st0; - case 127: goto st0; - } - if ( (*p) > 31 ) { - if ( 34 <= (*p) && (*p) <= 35 ) - goto st0; - } else if ( (*p) >= 0 ) - goto st0; - goto st21; -tr5: -#line 37 "ext/puma_http11/http11_parser.rl" - { MARK(mark, p); } - goto st22; -st22: - if ( ++p == pe ) - goto _test_eof22; -case 22: -#line 543 "ext/puma_http11/http11_parser.c" - switch( (*p) ) { - case 43: goto st22; - case 58: goto st23; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st22; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st22; - } else if ( (*p) >= 65 ) - goto st22; - } else - goto st22; - goto st0; -tr7: -#line 37 "ext/puma_http11/http11_parser.rl" - { MARK(mark, p); } - goto st23; -st23: - if ( ++p == pe ) - goto _test_eof23; -case 23: -#line 568 "ext/puma_http11/http11_parser.c" - switch( (*p) ) { - case 32: goto tr8; - case 34: goto st0; - case 35: goto tr9; - case 60: goto st0; - case 62: goto st0; - case 127: goto st0; - } - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - goto st23; -tr6: -#line 37 "ext/puma_http11/http11_parser.rl" - { MARK(mark, p); } - goto st24; -st24: - if ( ++p == pe ) - goto _test_eof24; -case 24: -#line 588 "ext/puma_http11/http11_parser.c" - switch( (*p) ) { - case 32: goto tr37; - case 34: goto st0; - case 35: goto tr38; - case 60: goto st0; - case 62: goto st0; - case 63: goto tr39; - case 127: goto st0; - } - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - goto st24; -tr39: -#line 69 "ext/puma_http11/http11_parser.rl" - { - parser->request_path(parser, PTR_TO(mark), LEN(mark,p)); - } - goto st25; -st25: - if ( ++p == pe ) - goto _test_eof25; -case 25: -#line 611 "ext/puma_http11/http11_parser.c" - switch( (*p) ) { - case 32: goto tr41; - case 34: goto st0; - case 35: goto tr42; - case 60: goto st0; - case 62: goto st0; - case 127: goto st0; - } - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - goto tr40; -tr40: -#line 60 "ext/puma_http11/http11_parser.rl" - { MARK(query_start, p); } - goto st26; -st26: - if ( ++p == pe ) - goto _test_eof26; -case 26: -#line 631 "ext/puma_http11/http11_parser.c" - switch( (*p) ) { - case 32: goto tr44; - case 34: goto st0; - case 35: goto tr45; - case 60: goto st0; - case 62: goto st0; - case 127: goto st0; - } - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - goto st26; -st27: - if ( ++p == pe ) - goto _test_eof27; -case 27: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st28; - case 95: goto st28; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st28; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st28; - } else - goto st28; - goto st0; -st28: - if ( ++p == pe ) - goto _test_eof28; -case 28: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st29; - case 95: goto st29; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st29; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st29; - } else - goto st29; - goto st0; -st29: - if ( ++p == pe ) - goto _test_eof29; -case 29: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st30; - case 95: goto st30; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st30; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st30; - } else - goto st30; - goto st0; -st30: - if ( ++p == pe ) - goto _test_eof30; -case 30: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st31; - case 95: goto st31; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st31; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st31; - } else - goto st31; - goto st0; -st31: - if ( ++p == pe ) - goto _test_eof31; -case 31: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st32; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st32; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st32; - } else - goto st32; - goto st0; -st32: - if ( ++p == pe ) - goto _test_eof32; -case 32: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st33; - case 95: goto st33; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st33; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st33; - } else - goto st33; - goto st0; -st33: - if ( ++p == pe ) - goto _test_eof33; -case 33: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st34; - case 95: goto st34; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st34; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st34; - } else - goto st34; - goto st0; -st34: - if ( ++p == pe ) - goto _test_eof34; -case 34: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st35; - case 95: goto st35; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st35; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st35; - } else - goto st35; - goto st0; -st35: - if ( ++p == pe ) - goto _test_eof35; -case 35: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st36; - case 95: goto st36; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st36; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st36; - } else - goto st36; - goto st0; -st36: - if ( ++p == pe ) - goto _test_eof36; -case 36: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st37; - case 95: goto st37; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st37; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st37; - } else - goto st37; - goto st0; -st37: - if ( ++p == pe ) - goto _test_eof37; -case 37: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st38; - case 95: goto st38; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st38; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st38; - } else - goto st38; - goto st0; -st38: - if ( ++p == pe ) - goto _test_eof38; -case 38: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st39; - case 95: goto st39; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st39; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st39; - } else - goto st39; - goto st0; -st39: - if ( ++p == pe ) - goto _test_eof39; -case 39: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st40; - case 95: goto st40; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st40; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st40; - } else - goto st40; - goto st0; -st40: - if ( ++p == pe ) - goto _test_eof40; -case 40: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st41; - case 95: goto st41; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st41; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st41; - } else - goto st41; - goto st0; -st41: - if ( ++p == pe ) - goto _test_eof41; -case 41: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st42; - case 95: goto st42; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st42; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st42; - } else - goto st42; - goto st0; -st42: - if ( ++p == pe ) - goto _test_eof42; -case 42: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st43; - case 95: goto st43; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st43; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st43; - } else - goto st43; - goto st0; -st43: - if ( ++p == pe ) - goto _test_eof43; -case 43: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st44; - case 95: goto st44; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st44; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st44; - } else - goto st44; - goto st0; -st44: - if ( ++p == pe ) - goto _test_eof44; -case 44: - switch( (*p) ) { - case 32: goto tr2; - case 36: goto st45; - case 95: goto st45; - } - if ( (*p) < 48 ) { - if ( 45 <= (*p) && (*p) <= 46 ) - goto st45; - } else if ( (*p) > 57 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st45; - } else - goto st45; - goto st0; -st45: - if ( ++p == pe ) - goto _test_eof45; -case 45: - if ( (*p) == 32 ) - goto tr2; - goto st0; - } - _test_eof2: cs = 2; goto _test_eof; - _test_eof3: cs = 3; goto _test_eof; - _test_eof4: cs = 4; goto _test_eof; - _test_eof5: cs = 5; goto _test_eof; - _test_eof6: cs = 6; goto _test_eof; - _test_eof7: cs = 7; goto _test_eof; - _test_eof8: cs = 8; goto _test_eof; - _test_eof9: cs = 9; goto _test_eof; - _test_eof10: cs = 10; goto _test_eof; - _test_eof11: cs = 11; goto _test_eof; - _test_eof12: cs = 12; goto _test_eof; - _test_eof13: cs = 13; goto _test_eof; - _test_eof14: cs = 14; goto _test_eof; - _test_eof15: cs = 15; goto _test_eof; - _test_eof16: cs = 16; goto _test_eof; - _test_eof46: cs = 46; goto _test_eof; - _test_eof17: cs = 17; goto _test_eof; - _test_eof18: cs = 18; goto _test_eof; - _test_eof19: cs = 19; goto _test_eof; - _test_eof20: cs = 20; goto _test_eof; - _test_eof21: cs = 21; goto _test_eof; - _test_eof22: cs = 22; goto _test_eof; - _test_eof23: cs = 23; goto _test_eof; - _test_eof24: cs = 24; goto _test_eof; - _test_eof25: cs = 25; goto _test_eof; - _test_eof26: cs = 26; goto _test_eof; - _test_eof27: cs = 27; goto _test_eof; - _test_eof28: cs = 28; goto _test_eof; - _test_eof29: cs = 29; goto _test_eof; - _test_eof30: cs = 30; goto _test_eof; - _test_eof31: cs = 31; goto _test_eof; - _test_eof32: cs = 32; goto _test_eof; - _test_eof33: cs = 33; goto _test_eof; - _test_eof34: cs = 34; goto _test_eof; - _test_eof35: cs = 35; goto _test_eof; - _test_eof36: cs = 36; goto _test_eof; - _test_eof37: cs = 37; goto _test_eof; - _test_eof38: cs = 38; goto _test_eof; - _test_eof39: cs = 39; goto _test_eof; - _test_eof40: cs = 40; goto _test_eof; - _test_eof41: cs = 41; goto _test_eof; - _test_eof42: cs = 42; goto _test_eof; - _test_eof43: cs = 43; goto _test_eof; - _test_eof44: cs = 44; goto _test_eof; - _test_eof45: cs = 45; goto _test_eof; - - _test_eof: {} - _out: {} - } - -#line 117 "ext/puma_http11/http11_parser.rl" - - if (!puma_parser_has_error(parser)) - parser->cs = cs; - parser->nread += p - (buffer + off); - - assert(p <= pe && "buffer overflow after parsing execute"); - assert(parser->nread <= len && "nread longer than length"); - assert(parser->body_start <= len && "body starts after buffer end"); - assert(parser->mark < len && "mark is after buffer end"); - assert(parser->field_len <= len && "field has length longer than whole buffer"); - assert(parser->field_start < len && "field starts after buffer end"); - - return(parser->nread); -} - -int puma_parser_finish(puma_parser *parser) -{ - if (puma_parser_has_error(parser) ) { - return -1; - } else if (puma_parser_is_finished(parser) ) { - return 1; - } else { - return 0; - } -} - -int puma_parser_has_error(puma_parser *parser) { - return parser->cs == puma_parser_error; -} - -int puma_parser_is_finished(puma_parser *parser) { - return parser->cs >= puma_parser_first_final; -} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.h b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.h deleted file mode 100644 index e0545a9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.h +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Copyright (c) 2005 Zed A. Shaw - * You can redistribute it and/or modify it under the same terms as Ruby. - * License 3-clause BSD - */ - -#ifndef http11_parser_h -#define http11_parser_h - -#define RSTRING_NOT_MODIFIED 1 -#include "ruby.h" - -#include - -#if defined(_WIN32) -#include -#endif - -#define BUFFER_LEN 1024 - -struct puma_parser; - -typedef void (*element_cb)(struct puma_parser* hp, - const char *at, size_t length); - -typedef void (*field_cb)(struct puma_parser* hp, - const char *field, size_t flen, - const char *value, size_t vlen); - -typedef struct puma_parser { - int cs; - int content_len; - size_t body_start; - size_t nread; - size_t mark; - size_t field_start; - size_t field_len; - size_t query_start; - - VALUE request; - VALUE body; - - field_cb http_field; - element_cb request_method; - element_cb request_uri; - element_cb fragment; - element_cb request_path; - element_cb query_string; - element_cb server_protocol; - element_cb header_done; - - char buf[BUFFER_LEN]; - -} puma_parser; - -int puma_parser_init(puma_parser *parser); -int puma_parser_finish(puma_parser *parser); -size_t puma_parser_execute(puma_parser *parser, const char *data, - size_t len, size_t off); -int puma_parser_has_error(puma_parser *parser); -int puma_parser_is_finished(puma_parser *parser); - -#define puma_parser_nread(parser) (parser)->nread - -#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.java.rl b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.java.rl deleted file mode 100644 index c5cb658..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.java.rl +++ /dev/null @@ -1,145 +0,0 @@ -package org.jruby.puma; - -import org.jruby.Ruby; -import org.jruby.RubyHash; -import org.jruby.util.ByteList; - -public class Http11Parser { - -/** Machine **/ - -%%{ - - machine puma_parser; - - action mark {parser.mark = fpc; } - - action start_field { parser.field_start = fpc; } - action snake_upcase_field { /* FIXME stub */ } - action write_field { - parser.field_len = fpc-parser.field_start; - } - - action start_value { parser.mark = fpc; } - action write_value { - Http11.http_field(runtime, parser.data, parser.buffer, parser.field_start, parser.field_len, parser.mark, fpc-parser.mark); - } - action request_method { - Http11.request_method(runtime, parser.data, parser.buffer, parser.mark, fpc-parser.mark); - } - action request_uri { - Http11.request_uri(runtime, parser.data, parser.buffer, parser.mark, fpc-parser.mark); - } - action fragment { - Http11.fragment(runtime, parser.data, parser.buffer, parser.mark, fpc-parser.mark); - } - - action start_query {parser.query_start = fpc; } - action query_string { - Http11.query_string(runtime, parser.data, parser.buffer, parser.query_start, fpc-parser.query_start); - } - - action server_protocol { - Http11.server_protocol(runtime, parser.data, parser.buffer, parser.mark, fpc-parser.mark); - } - - action request_path { - Http11.request_path(runtime, parser.data, parser.buffer, parser.mark, fpc-parser.mark); - } - - action done { - parser.body_start = fpc + 1; - http.header_done(runtime, parser.data, parser.buffer, fpc + 1, pe - fpc - 1); - fbreak; - } - - include puma_parser_common "http11_parser_common.rl"; - -}%% - -/** Data **/ -%% write data noentry; - - public static interface ElementCB { - public void call(Ruby runtime, RubyHash data, ByteList buffer, int at, int length); - } - - public static interface FieldCB { - public void call(Ruby runtime, RubyHash data, ByteList buffer, int field, int flen, int value, int vlen); - } - - public static class HttpParser { - int cs; - int body_start; - int content_len; - int nread; - int mark; - int field_start; - int field_len; - int query_start; - - RubyHash data; - ByteList buffer; - - public void init() { - cs = 0; - - %% write init; - - body_start = 0; - content_len = 0; - mark = 0; - nread = 0; - field_len = 0; - field_start = 0; - } - } - - public final HttpParser parser = new HttpParser(); - - public int execute(Ruby runtime, Http11 http, ByteList buffer, int off) { - int p, pe; - int cs = parser.cs; - int len = buffer.length(); - assert off<=len : "offset past end of buffer"; - - p = off; - pe = len; - // get a copy of the bytes, since it may not start at 0 - // FIXME: figure out how to just use the bytes in-place - byte[] data = buffer.bytes(); - parser.buffer = buffer; - - %% write exec; - - parser.cs = cs; - parser.nread += (p - off); - - assert p <= pe : "buffer overflow after parsing execute"; - assert parser.nread <= len : "nread longer than length"; - assert parser.body_start <= len : "body starts after buffer end"; - assert parser.mark < len : "mark is after buffer end"; - assert parser.field_len <= len : "field has length longer than whole buffer"; - assert parser.field_start < len : "field starts after buffer end"; - - return parser.nread; - } - - public int finish() { - if(has_error()) { - return -1; - } else if(is_finished()) { - return 1; - } else { - return 0; - } - } - - public boolean has_error() { - return parser.cs == puma_parser_error; - } - - public boolean is_finished() { - return parser.cs == puma_parser_first_final; - } -} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.rl b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.rl deleted file mode 100644 index f1ef5a1..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser.rl +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Copyright (c) 2005 Zed A. Shaw - * You can redistribute it and/or modify it under the same terms as Ruby. - * License 3-clause BSD - */ -#include "http11_parser.h" -#include -#include -#include -#include -#include - -/* - * capitalizes all lower-case ASCII characters, - * converts dashes to underscores, and underscores to commas. - */ -static void snake_upcase_char(char *c) -{ - if (*c >= 'a' && *c <= 'z') - *c &= ~0x20; - else if (*c == '_') - *c = ','; - else if (*c == '-') - *c = '_'; -} - -#define LEN(AT, FPC) (FPC - buffer - parser->AT) -#define MARK(M,FPC) (parser->M = (FPC) - buffer) -#define PTR_TO(F) (buffer + parser->F) - -/** Machine **/ - -%%{ - - machine puma_parser; - - action mark { MARK(mark, fpc); } - - - action start_field { MARK(field_start, fpc); } - action snake_upcase_field { snake_upcase_char((char *)fpc); } - action write_field { - parser->field_len = LEN(field_start, fpc); - } - - action start_value { MARK(mark, fpc); } - action write_value { - parser->http_field(parser, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, fpc)); - } - action request_method { - parser->request_method(parser, PTR_TO(mark), LEN(mark, fpc)); - } - action request_uri { - parser->request_uri(parser, PTR_TO(mark), LEN(mark, fpc)); - } - action fragment { - parser->fragment(parser, PTR_TO(mark), LEN(mark, fpc)); - } - - action start_query { MARK(query_start, fpc); } - action query_string { - parser->query_string(parser, PTR_TO(query_start), LEN(query_start, fpc)); - } - - action server_protocol { - parser->server_protocol(parser, PTR_TO(mark), LEN(mark, fpc)); - } - - action request_path { - parser->request_path(parser, PTR_TO(mark), LEN(mark,fpc)); - } - - action done { - parser->body_start = fpc - buffer + 1; - parser->header_done(parser, fpc + 1, pe - fpc - 1); - fbreak; - } - - include puma_parser_common "http11_parser_common.rl"; - -}%% - -/** Data **/ -%% write data noentry; - -int puma_parser_init(puma_parser *parser) { - int cs = 0; - %% write init; - parser->cs = cs; - parser->body_start = 0; - parser->content_len = 0; - parser->mark = 0; - parser->nread = 0; - parser->field_len = 0; - parser->field_start = 0; - parser->request = Qnil; - parser->body = Qnil; - - return 1; -} - - -/** exec **/ -size_t puma_parser_execute(puma_parser *parser, const char *buffer, size_t len, size_t off) { - const char *p, *pe; - int cs = parser->cs; - - assert(off <= len && "offset past end of buffer"); - - p = buffer+off; - pe = buffer+len; - - /* assert(*pe == '\0' && "pointer does not end on NUL"); */ - assert((size_t) (pe - p) == len - off && "pointers aren't same distance"); - - %% write exec; - - if (!puma_parser_has_error(parser)) - parser->cs = cs; - parser->nread += p - (buffer + off); - - assert(p <= pe && "buffer overflow after parsing execute"); - assert(parser->nread <= len && "nread longer than length"); - assert(parser->body_start <= len && "body starts after buffer end"); - assert(parser->mark < len && "mark is after buffer end"); - assert(parser->field_len <= len && "field has length longer than whole buffer"); - assert(parser->field_start < len && "field starts after buffer end"); - - return(parser->nread); -} - -int puma_parser_finish(puma_parser *parser) -{ - if (puma_parser_has_error(parser) ) { - return -1; - } else if (puma_parser_is_finished(parser) ) { - return 1; - } else { - return 0; - } -} - -int puma_parser_has_error(puma_parser *parser) { - return parser->cs == puma_parser_error; -} - -int puma_parser_is_finished(puma_parser *parser) { - return parser->cs >= puma_parser_first_final; -} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser_common.rl b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser_common.rl deleted file mode 100644 index d61aafa..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/http11_parser_common.rl +++ /dev/null @@ -1,54 +0,0 @@ -%%{ - - machine puma_parser_common; - -#### HTTP PROTOCOL GRAMMAR -# line endings - CRLF = "\r\n"; - -# character types - CTL = (cntrl | 127); - safe = ("$" | "-" | "_" | "."); - extra = ("!" | "*" | "'" | "(" | ")" | ","); - reserved = (";" | "/" | "?" | ":" | "@" | "&" | "=" | "+"); - unsafe = (CTL | " " | "\"" | "#" | "%" | "<" | ">"); - national = any -- (alpha | digit | reserved | extra | safe | unsafe); - unreserved = (alpha | digit | safe | extra | national); - escape = ("%" xdigit xdigit); - uchar = (unreserved | escape | "%"); - pchar = (uchar | ":" | "@" | "&" | "=" | "+" | ";"); - tspecials = ("(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\\" | "\"" | "/" | "[" | "]" | "?" | "=" | "{" | "}" | " " | "\t"); - -# elements - token = (ascii -- (CTL | tspecials)); - -# URI schemes and absolute paths - scheme = ( alpha | digit | "+" | "-" | "." )* ; - absolute_uri = (scheme ":" (uchar | reserved )*); - - path = ( pchar+ ( "/" pchar* )* ) ; - query = ( uchar | reserved )* %query_string ; - param = ( pchar | "/" )* ; - params = ( param ( ";" param )* ) ; - rel_path = ( path? %request_path ) ("?" %start_query query)?; - absolute_path = ( "/"+ rel_path ); - - Request_URI = ( "*" | absolute_uri | absolute_path ) >mark %request_uri; - Fragment = ( uchar | reserved )* >mark %fragment; - Method = ( upper | digit | safe ){1,20} >mark %request_method; - - http_number = ( digit+ "." digit+ ) ; - Server_Protocol = ( "HTTP/" http_number ) >mark %server_protocol ; - Request_Line = ( Method " " Request_URI ("#" Fragment){0,1} " " Server_Protocol CRLF ) ; - - field_name = ( token -- ":" )+ >start_field $snake_upcase_field %write_field; - - field_value = ( (any -- CTL) | "\t" )* >start_value %write_value; - - message_header = field_name ":" " "* field_value :> CRLF; - - Request = Request_Line ( message_header )* ( CRLF @done ); - -main := Request; - -}%% diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/mini_ssl.c b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/mini_ssl.c deleted file mode 100644 index dc5a77f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/mini_ssl.c +++ /dev/null @@ -1,842 +0,0 @@ -#define RSTRING_NOT_MODIFIED 1 - -#include -#include -#include - -#ifdef HAVE_OPENSSL_BIO_H - -#include -#include -#include -#include -#include - -#ifndef SSL_OP_NO_COMPRESSION -#define SSL_OP_NO_COMPRESSION 0 -#endif - -typedef struct { - BIO* read; - BIO* write; - SSL* ssl; - SSL_CTX* ctx; -} ms_conn; - -typedef struct { - unsigned char* buf; - int bytes; -} ms_cert_buf; - -VALUE eError; - -NORETURN(void raise_file_error(const char* caller, const char *filename)); - -void raise_file_error(const char* caller, const char *filename) { - rb_raise(eError, "%s: error in file '%s': %s", caller, filename, ERR_error_string(ERR_get_error(), NULL)); -} - -NORETURN(void raise_param_error(const char* caller, const char *param)); - -void raise_param_error(const char* caller, const char *param) { - rb_raise(eError, "%s: error with parameter '%s': %s", caller, param, ERR_error_string(ERR_get_error(), NULL)); -} - -void engine_free(void *ptr) { - ms_conn *conn = ptr; - ms_cert_buf* cert_buf = (ms_cert_buf*)SSL_get_app_data(conn->ssl); - if(cert_buf) { - OPENSSL_free(cert_buf->buf); - free(cert_buf); - } - SSL_free(conn->ssl); - SSL_CTX_free(conn->ctx); - - free(conn); -} - -const rb_data_type_t engine_data_type = { - "MiniSSL/ENGINE", - { 0, engine_free, 0 }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY, -}; - -#ifndef HAVE_SSL_CTX_SET_DH_AUTO -DH *get_dh2048(void) { - /* `openssl dhparam -C 2048` - * -----BEGIN DH PARAMETERS----- - * MIIBCAKCAQEAjmh1uQHdTfxOyxEbKAV30fUfzqMDF/ChPzjfyzl2jcrqQMhrk76o - * 2NPNXqxHwsddMZ1RzvU8/jl+uhRuPWjXCFZbhET4N1vrviZM3VJhV8PPHuiVOACO - * y32jFd+Szx4bo2cXSK83hJ6jRd+0asP1awWjz9/06dFkrILCXMIfQLo0D8rqmppn - * EfDDAwuudCpM9kcDmBRAm9JsKbQ6gzZWjkc5+QWSaQofojIHbjvj3xzguaCJn+oQ - * vHWM+hsAnaOgEwCyeZ3xqs+/5lwSbkE/tqJW98cEZGygBUVo9jxZRZx6KOfjpdrb - * yenO9LJr/qtyrZB31WJbqxI0m0AKTAO8UwIBAg== - * -----END DH PARAMETERS----- - */ - static unsigned char dh2048_p[] = { - 0x8E, 0x68, 0x75, 0xB9, 0x01, 0xDD, 0x4D, 0xFC, 0x4E, 0xCB, - 0x11, 0x1B, 0x28, 0x05, 0x77, 0xD1, 0xF5, 0x1F, 0xCE, 0xA3, - 0x03, 0x17, 0xF0, 0xA1, 0x3F, 0x38, 0xDF, 0xCB, 0x39, 0x76, - 0x8D, 0xCA, 0xEA, 0x40, 0xC8, 0x6B, 0x93, 0xBE, 0xA8, 0xD8, - 0xD3, 0xCD, 0x5E, 0xAC, 0x47, 0xC2, 0xC7, 0x5D, 0x31, 0x9D, - 0x51, 0xCE, 0xF5, 0x3C, 0xFE, 0x39, 0x7E, 0xBA, 0x14, 0x6E, - 0x3D, 0x68, 0xD7, 0x08, 0x56, 0x5B, 0x84, 0x44, 0xF8, 0x37, - 0x5B, 0xEB, 0xBE, 0x26, 0x4C, 0xDD, 0x52, 0x61, 0x57, 0xC3, - 0xCF, 0x1E, 0xE8, 0x95, 0x38, 0x00, 0x8E, 0xCB, 0x7D, 0xA3, - 0x15, 0xDF, 0x92, 0xCF, 0x1E, 0x1B, 0xA3, 0x67, 0x17, 0x48, - 0xAF, 0x37, 0x84, 0x9E, 0xA3, 0x45, 0xDF, 0xB4, 0x6A, 0xC3, - 0xF5, 0x6B, 0x05, 0xA3, 0xCF, 0xDF, 0xF4, 0xE9, 0xD1, 0x64, - 0xAC, 0x82, 0xC2, 0x5C, 0xC2, 0x1F, 0x40, 0xBA, 0x34, 0x0F, - 0xCA, 0xEA, 0x9A, 0x9A, 0x67, 0x11, 0xF0, 0xC3, 0x03, 0x0B, - 0xAE, 0x74, 0x2A, 0x4C, 0xF6, 0x47, 0x03, 0x98, 0x14, 0x40, - 0x9B, 0xD2, 0x6C, 0x29, 0xB4, 0x3A, 0x83, 0x36, 0x56, 0x8E, - 0x47, 0x39, 0xF9, 0x05, 0x92, 0x69, 0x0A, 0x1F, 0xA2, 0x32, - 0x07, 0x6E, 0x3B, 0xE3, 0xDF, 0x1C, 0xE0, 0xB9, 0xA0, 0x89, - 0x9F, 0xEA, 0x10, 0xBC, 0x75, 0x8C, 0xFA, 0x1B, 0x00, 0x9D, - 0xA3, 0xA0, 0x13, 0x00, 0xB2, 0x79, 0x9D, 0xF1, 0xAA, 0xCF, - 0xBF, 0xE6, 0x5C, 0x12, 0x6E, 0x41, 0x3F, 0xB6, 0xA2, 0x56, - 0xF7, 0xC7, 0x04, 0x64, 0x6C, 0xA0, 0x05, 0x45, 0x68, 0xF6, - 0x3C, 0x59, 0x45, 0x9C, 0x7A, 0x28, 0xE7, 0xE3, 0xA5, 0xDA, - 0xDB, 0xC9, 0xE9, 0xCE, 0xF4, 0xB2, 0x6B, 0xFE, 0xAB, 0x72, - 0xAD, 0x90, 0x77, 0xD5, 0x62, 0x5B, 0xAB, 0x12, 0x34, 0x9B, - 0x40, 0x0A, 0x4C, 0x03, 0xBC, 0x53 - }; - static unsigned char dh2048_g[] = { 0x02 }; - - DH *dh; -#if !(OPENSSL_VERSION_NUMBER < 0x10100005L) - BIGNUM *p, *g; -#endif - - dh = DH_new(); - -#if OPENSSL_VERSION_NUMBER < 0x10100005L - dh->p = BN_bin2bn(dh2048_p, sizeof(dh2048_p), NULL); - dh->g = BN_bin2bn(dh2048_g, sizeof(dh2048_g), NULL); - - if ((dh->p == NULL) || (dh->g == NULL)) { - DH_free(dh); - return NULL; - } -#else - p = BN_bin2bn(dh2048_p, sizeof(dh2048_p), NULL); - g = BN_bin2bn(dh2048_g, sizeof(dh2048_g), NULL); - - if (p == NULL || g == NULL || !DH_set0_pqg(dh, p, NULL, g)) { - DH_free(dh); - BN_free(p); - BN_free(g); - return NULL; - } -#endif - - return dh; -} -#endif - -static void -sslctx_free(void *ptr) { - SSL_CTX *ctx = ptr; - SSL_CTX_free(ctx); -} - -static const rb_data_type_t sslctx_type = { - "MiniSSL/SSLContext", - { - 0, sslctx_free, - }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY, -}; - -ms_conn* engine_alloc(VALUE klass, VALUE* obj) { - ms_conn* conn; - - *obj = TypedData_Make_Struct(klass, ms_conn, &engine_data_type, conn); - - conn->read = BIO_new(BIO_s_mem()); - BIO_set_nbio(conn->read, 1); - - conn->write = BIO_new(BIO_s_mem()); - BIO_set_nbio(conn->write, 1); - - conn->ssl = 0; - conn->ctx = 0; - - return conn; -} - -static int engine_verify_callback(int preverify_ok, X509_STORE_CTX* ctx) { - X509* err_cert; - SSL* ssl; - int bytes; - unsigned char* buf = NULL; - - if(!preverify_ok) { - err_cert = X509_STORE_CTX_get_current_cert(ctx); - if(err_cert) { - /* - * Save the failed certificate for inspection/logging. - */ - bytes = i2d_X509(err_cert, &buf); - if(bytes > 0) { - ms_cert_buf* cert_buf = (ms_cert_buf*)malloc(sizeof(ms_cert_buf)); - cert_buf->buf = buf; - cert_buf->bytes = bytes; - ssl = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()); - SSL_set_app_data(ssl, cert_buf); - } - } - } - - return preverify_ok; -} - -static int password_callback(char *buf, int size, int rwflag, void *userdata) { - const char *password = (const char *) userdata; - size_t len = strlen(password); - - if (len > (size_t) size) { - return 0; - } - - memcpy(buf, password, len); - return (int) len; -} - -static VALUE -sslctx_alloc(VALUE klass) { - SSL_CTX *ctx; - long mode = 0 | - SSL_MODE_ENABLE_PARTIAL_WRITE | - SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER | - SSL_MODE_RELEASE_BUFFERS; - -#ifdef HAVE_TLS_SERVER_METHOD - ctx = SSL_CTX_new(TLS_method()); - // printf("\nctx using TLS_method security_level %d\n", SSL_CTX_get_security_level(ctx)); -#else - ctx = SSL_CTX_new(SSLv23_method()); -#endif - if (!ctx) { - rb_raise(eError, "SSL_CTX_new"); - } - SSL_CTX_set_mode(ctx, mode); - - return TypedData_Wrap_Struct(klass, &sslctx_type, ctx); -} - -VALUE -sslctx_initialize(VALUE self, VALUE mini_ssl_ctx) { - SSL_CTX* ctx; - int ssl_options; - VALUE key, cert, ca, verify_mode, ssl_cipher_filter, ssl_ciphersuites, no_tlsv1, no_tlsv1_1, - verification_flags, session_id_bytes, cert_pem, key_pem, key_password_command, key_password; - BIO *bio; - X509 *x509 = NULL; - EVP_PKEY *pkey; - pem_password_cb *password_cb = NULL; - const char *password = NULL; -#ifdef HAVE_SSL_CTX_SET_MIN_PROTO_VERSION - int min; -#endif -#ifndef HAVE_SSL_CTX_SET_DH_AUTO - DH *dh; -#endif -#if OPENSSL_VERSION_NUMBER < 0x10002000L - EC_KEY *ecdh; -#endif -#ifdef HAVE_SSL_CTX_SET_SESSION_CACHE_MODE - VALUE reuse, reuse_cache_size, reuse_timeout; - - reuse = rb_funcall(mini_ssl_ctx, rb_intern_const("reuse"), 0); - reuse_cache_size = rb_funcall(mini_ssl_ctx, rb_intern_const("reuse_cache_size"), 0); - reuse_timeout = rb_funcall(mini_ssl_ctx, rb_intern_const("reuse_timeout"), 0); -#endif - - key = rb_funcall(mini_ssl_ctx, rb_intern_const("key"), 0); - - key_password_command = rb_funcall(mini_ssl_ctx, rb_intern_const("key_password_command"), 0); - - cert = rb_funcall(mini_ssl_ctx, rb_intern_const("cert"), 0); - - ca = rb_funcall(mini_ssl_ctx, rb_intern_const("ca"), 0); - - cert_pem = rb_funcall(mini_ssl_ctx, rb_intern_const("cert_pem"), 0); - - key_pem = rb_funcall(mini_ssl_ctx, rb_intern_const("key_pem"), 0); - - verify_mode = rb_funcall(mini_ssl_ctx, rb_intern_const("verify_mode"), 0); - - ssl_cipher_filter = rb_funcall(mini_ssl_ctx, rb_intern_const("ssl_cipher_filter"), 0); - - ssl_ciphersuites = rb_funcall(mini_ssl_ctx, rb_intern_const("ssl_ciphersuites"), 0); - - no_tlsv1 = rb_funcall(mini_ssl_ctx, rb_intern_const("no_tlsv1"), 0); - - no_tlsv1_1 = rb_funcall(mini_ssl_ctx, rb_intern_const("no_tlsv1_1"), 0); - - TypedData_Get_Struct(self, SSL_CTX, &sslctx_type, ctx); - - if (!NIL_P(cert)) { - StringValue(cert); - - if (SSL_CTX_use_certificate_chain_file(ctx, RSTRING_PTR(cert)) != 1) { - raise_file_error("SSL_CTX_use_certificate_chain_file", RSTRING_PTR(cert)); - } - } - - if (!NIL_P(key_password_command)) { - key_password = rb_funcall(mini_ssl_ctx, rb_intern_const("key_password"), 0); - - if (!NIL_P(key_password)) { - StringValue(key_password); - password_cb = password_callback; - password = RSTRING_PTR(key_password); - SSL_CTX_set_default_passwd_cb(ctx, password_cb); - SSL_CTX_set_default_passwd_cb_userdata(ctx, (void *) password); - } - } - - if (!NIL_P(key)) { - StringValue(key); - - if (SSL_CTX_use_PrivateKey_file(ctx, RSTRING_PTR(key), SSL_FILETYPE_PEM) != 1) { - raise_file_error("SSL_CTX_use_PrivateKey_file", RSTRING_PTR(key)); - } - } - - if (!NIL_P(cert_pem)) { - X509 *ca = NULL; - unsigned long err; - - bio = BIO_new(BIO_s_mem()); - BIO_puts(bio, RSTRING_PTR(cert_pem)); - - /** - * Much of this pulled as a simplified version of the `use_certificate_chain_file` method - * from openssl's `ssl_rsa.c` file. - */ - - /* first read the cert as the first item in the pem file */ - x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL); - if (NULL == x509) { - BIO_free_all(bio); - raise_param_error("PEM_read_bio_X509", "cert_pem"); - } - - /* Add the cert to the context */ - /* 1 is success - otherwise check the error codes */ - if (1 != SSL_CTX_use_certificate(ctx, x509)) { - BIO_free_all(bio); - raise_param_error("SSL_CTX_use_certificate", "cert_pem"); - } - - X509_free(x509); /* no longer need our reference */ - - /* Now lets load up the rest of the certificate chain */ - /* 1 is success 0 is error */ - if (0 == SSL_CTX_clear_chain_certs(ctx)) { - BIO_free_all(bio); - raise_param_error("SSL_CTX_clear_chain_certs","cert_pem"); - } - - while (1) { - ca = PEM_read_bio_X509(bio, NULL, NULL, NULL); - - if (NULL == ca) { - break; - } - - if (0 == SSL_CTX_add0_chain_cert(ctx, ca)) { - BIO_free_all(bio); - raise_param_error("SSL_CTX_add0_chain_cert","cert_pem"); - } - /* don't free ca - its now owned by the context */ - } - - /* ca is NULL - so its either the end of the file or an error */ - err = ERR_peek_last_error(); - - /* If its the end of the file - then we are done, in any case free the bio */ - BIO_free_all(bio); - - if ((ERR_GET_LIB(err) == ERR_LIB_PEM) && (ERR_GET_REASON(err) == PEM_R_NO_START_LINE)) { - ERR_clear_error(); - } else { - raise_param_error("PEM_read_bio_X509","cert_pem"); - } - } - - if (!NIL_P(key_pem)) { - bio = BIO_new(BIO_s_mem()); - BIO_puts(bio, RSTRING_PTR(key_pem)); - pkey = PEM_read_bio_PrivateKey(bio, NULL, password_cb, (void *) password); - - if (SSL_CTX_use_PrivateKey(ctx, pkey) != 1) { - BIO_free(bio); - raise_file_error("SSL_CTX_use_PrivateKey", RSTRING_PTR(key_pem)); - } - EVP_PKEY_free(pkey); - BIO_free(bio); - } - - verification_flags = rb_funcall(mini_ssl_ctx, rb_intern_const("verification_flags"), 0); - - if (!NIL_P(verification_flags)) { - X509_VERIFY_PARAM *param = SSL_CTX_get0_param(ctx); - X509_VERIFY_PARAM_set_flags(param, NUM2INT(verification_flags)); - SSL_CTX_set1_param(ctx, param); - } - - if (!NIL_P(ca)) { - StringValue(ca); - if (SSL_CTX_load_verify_locations(ctx, RSTRING_PTR(ca), NULL) != 1) { - raise_file_error("SSL_CTX_load_verify_locations", RSTRING_PTR(ca)); - } - } - - ssl_options = SSL_OP_CIPHER_SERVER_PREFERENCE | SSL_OP_SINGLE_ECDH_USE | SSL_OP_NO_COMPRESSION; - -#ifdef HAVE_SSL_CTX_SET_MIN_PROTO_VERSION - if (RTEST(no_tlsv1_1)) { - min = TLS1_2_VERSION; - } - else if (RTEST(no_tlsv1)) { - min = TLS1_1_VERSION; - } - else { - min = TLS1_VERSION; - } - - SSL_CTX_set_min_proto_version(ctx, min); - -#else - /* As of 1.0.2f, SSL_OP_SINGLE_DH_USE key use is always on */ - ssl_options |= SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_SINGLE_DH_USE; - - if (RTEST(no_tlsv1)) { - ssl_options |= SSL_OP_NO_TLSv1; - } - if(RTEST(no_tlsv1_1)) { - ssl_options |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1; - } -#endif - -#ifdef HAVE_SSL_CTX_SET_SESSION_CACHE_MODE - if (!NIL_P(reuse)) { - SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_SERVER); - if (!NIL_P(reuse_cache_size)) { - SSL_CTX_sess_set_cache_size(ctx, NUM2INT(reuse_cache_size)); - } - if (!NIL_P(reuse_timeout)) { - SSL_CTX_set_timeout(ctx, NUM2INT(reuse_timeout)); - } - } else { - SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF); - } -#endif - - SSL_CTX_set_options(ctx, ssl_options); - - if (!NIL_P(ssl_cipher_filter)) { - StringValue(ssl_cipher_filter); - SSL_CTX_set_cipher_list(ctx, RSTRING_PTR(ssl_cipher_filter)); - } - else { - SSL_CTX_set_cipher_list(ctx, "HIGH:!aNULL@STRENGTH"); - } - -#if HAVE_SSL_CTX_SET_CIPHERSUITES - // Only override OpenSSL default ciphersuites if config option is supplied. - if (!NIL_P(ssl_ciphersuites)) { - StringValue(ssl_ciphersuites); - SSL_CTX_set_ciphersuites(ctx, RSTRING_PTR(ssl_ciphersuites)); - } -#endif - -#if OPENSSL_VERSION_NUMBER < 0x10002000L - // Remove this case if OpenSSL 1.0.1 (now EOL) support is no longer needed. - ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); - if (ecdh) { - SSL_CTX_set_tmp_ecdh(ctx, ecdh); - EC_KEY_free(ecdh); - } -#elif OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) - SSL_CTX_set_ecdh_auto(ctx, 1); -#endif - - if (NIL_P(verify_mode)) { - /* SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL); */ - } else { - SSL_CTX_set_verify(ctx, NUM2INT(verify_mode), engine_verify_callback); - } - - // Random.bytes available in Ruby 2.5 and later, Random::DEFAULT deprecated in 3.0 - session_id_bytes = rb_funcall( -#ifdef HAVE_RANDOM_BYTES - rb_cRandom, -#else - rb_const_get(rb_cRandom, rb_intern_const("DEFAULT")), -#endif - rb_intern_const("bytes"), - 1, ULL2NUM(SSL_MAX_SSL_SESSION_ID_LENGTH)); - - SSL_CTX_set_session_id_context(ctx, - (unsigned char *) RSTRING_PTR(session_id_bytes), - SSL_MAX_SSL_SESSION_ID_LENGTH); - - // printf("\ninitialize end security_level %d\n", SSL_CTX_get_security_level(ctx)); - -#ifdef HAVE_SSL_CTX_SET_DH_AUTO - // https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_dh_auto.html - SSL_CTX_set_dh_auto(ctx, 1); -#else - dh = get_dh2048(); - SSL_CTX_set_tmp_dh(ctx, dh); -#endif - - rb_obj_freeze(self); - return self; -} - -VALUE engine_init_server(VALUE self, VALUE sslctx) { - ms_conn* conn; - VALUE obj; - SSL_CTX* ctx; - SSL* ssl; - - conn = engine_alloc(self, &obj); - - TypedData_Get_Struct(sslctx, SSL_CTX, &sslctx_type, ctx); - - ssl = SSL_new(ctx); - conn->ssl = ssl; - SSL_set_app_data(ssl, NULL); - SSL_set_bio(ssl, conn->read, conn->write); - SSL_set_accept_state(ssl); - return obj; -} - -VALUE engine_init_client(VALUE klass) { - VALUE obj; - ms_conn* conn = engine_alloc(klass, &obj); -#ifdef HAVE_DTLS_METHOD - conn->ctx = SSL_CTX_new(DTLS_method()); -#else - conn->ctx = SSL_CTX_new(DTLSv1_method()); -#endif - conn->ssl = SSL_new(conn->ctx); - SSL_set_app_data(conn->ssl, NULL); - SSL_set_verify(conn->ssl, SSL_VERIFY_NONE, NULL); - - SSL_set_bio(conn->ssl, conn->read, conn->write); - - SSL_set_connect_state(conn->ssl); - return obj; -} - -VALUE engine_inject(VALUE self, VALUE str) { - ms_conn* conn; - long used; - - TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn); - - StringValue(str); - - used = BIO_write(conn->read, RSTRING_PTR(str), (int)RSTRING_LEN(str)); - - if(used == 0 || used == -1) { - return Qfalse; - } - - return INT2FIX(used); -} - -NORETURN(void raise_error(SSL* ssl, int result)); - -void raise_error(SSL* ssl, int result) { - char buf[512]; - char msg[768]; - const char* err_str; - int err = errno; - int mask = 4095; - int ssl_err = SSL_get_error(ssl, result); - int verify_err = (int) SSL_get_verify_result(ssl); - - if(SSL_ERROR_SYSCALL == ssl_err) { - snprintf(msg, sizeof(msg), "System error: %s - %d", strerror(err), err); - - } else if(SSL_ERROR_SSL == ssl_err) { - if(X509_V_OK != verify_err) { - err_str = X509_verify_cert_error_string(verify_err); - snprintf(msg, sizeof(msg), - "OpenSSL certificate verification error: %s - %d", - err_str, verify_err); - - } else { - err = (int) ERR_get_error(); - ERR_error_string_n(err, buf, sizeof(buf)); - snprintf(msg, sizeof(msg), "OpenSSL error: %s - %d", buf, err & mask); - } - } else { - snprintf(msg, sizeof(msg), "Unknown OpenSSL error: %d", ssl_err); - } - - ERR_clear_error(); - rb_raise(eError, "%s", msg); -} - -VALUE engine_read(VALUE self) { - ms_conn* conn; - char buf[512]; - int bytes, error; - - TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn); - - ERR_clear_error(); - - bytes = SSL_read(conn->ssl, (void*)buf, sizeof(buf)); - - if(bytes > 0) { - return rb_str_new(buf, bytes); - } - - if(SSL_want_read(conn->ssl)) return Qnil; - - error = SSL_get_error(conn->ssl, bytes); - - if(error == SSL_ERROR_ZERO_RETURN) { - rb_eof_error(); - } else { - raise_error(conn->ssl, bytes); - } - - return Qnil; -} - -VALUE engine_write(VALUE self, VALUE str) { - ms_conn* conn; - int bytes; - - TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn); - - StringValue(str); - - ERR_clear_error(); - - bytes = SSL_write(conn->ssl, (void*)RSTRING_PTR(str), (int)RSTRING_LEN(str)); - if(bytes > 0) { - return INT2FIX(bytes); - } - - if(SSL_want_write(conn->ssl)) return Qnil; - - raise_error(conn->ssl, bytes); - - return Qnil; -} - -VALUE engine_extract(VALUE self) { - ms_conn* conn; - int bytes; - size_t pending; - // https://www.openssl.org/docs/manmaster/man3/BIO_f_buffer.html - // crypto/bio/bf_buff.c DEFAULT_BUFFER_SIZE - char buf[4096]; - - TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn); - - pending = BIO_pending(conn->write); - if(pending > 0) { - bytes = BIO_read(conn->write, buf, sizeof(buf)); - if(bytes > 0) { - return rb_str_new(buf, bytes); - } else if(!BIO_should_retry(conn->write)) { - raise_error(conn->ssl, bytes); - } - } - - return Qnil; -} - -VALUE engine_shutdown(VALUE self) { - ms_conn* conn; - int ok; - - TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn); - - ERR_clear_error(); - - ok = SSL_shutdown(conn->ssl); - if (ok == 0) { - return Qfalse; - } - - return Qtrue; -} - -VALUE engine_init(VALUE self) { - ms_conn* conn; - - TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn); - - return SSL_in_init(conn->ssl) ? Qtrue : Qfalse; -} - -VALUE engine_peercert(VALUE self) { - ms_conn* conn; - X509* cert; - int bytes; - unsigned char* buf = NULL; - ms_cert_buf* cert_buf = NULL; - VALUE rb_cert_buf; - - TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn); - -#ifdef HAVE_SSL_GET1_PEER_CERTIFICATE - cert = SSL_get1_peer_certificate(conn->ssl); -#else - cert = SSL_get_peer_certificate(conn->ssl); -#endif - if(!cert) { - /* - * See if there was a failed certificate associated with this client. - */ - cert_buf = (ms_cert_buf*)SSL_get_app_data(conn->ssl); - if(!cert_buf) { - return Qnil; - } - buf = cert_buf->buf; - bytes = cert_buf->bytes; - - } else { - bytes = i2d_X509(cert, &buf); - X509_free(cert); - - if(bytes < 0) { - return Qnil; - } - } - - rb_cert_buf = rb_str_new((const char*)(buf), bytes); - if(!cert_buf) { - OPENSSL_free(buf); - } - - return rb_cert_buf; -} - -/* @see Puma::MiniSSL::Socket#ssl_version_state - * @version 5.0.0 - */ -static VALUE -engine_ssl_vers_st(VALUE self) { - ms_conn* conn; - TypedData_Get_Struct(self, ms_conn, &engine_data_type, conn); - return rb_ary_new3(2, rb_str_new2(SSL_get_version(conn->ssl)), rb_str_new2(SSL_state_string(conn->ssl))); -} - -VALUE noop(VALUE self) { - return Qnil; -} - -void Init_mini_ssl(VALUE puma) { - VALUE mod, eng, sslctx; - -/* Fake operation for documentation (RDoc, YARD) */ -#if 0 == 1 - puma = rb_define_module("Puma"); -#endif - - SSL_library_init(); - OpenSSL_add_ssl_algorithms(); - SSL_load_error_strings(); - ERR_load_crypto_strings(); - - mod = rb_define_module_under(puma, "MiniSSL"); - - eng = rb_define_class_under(mod, "Engine", rb_cObject); - rb_undef_alloc_func(eng); - - sslctx = rb_define_class_under(mod, "SSLContext", rb_cObject); - rb_define_alloc_func(sslctx, sslctx_alloc); - rb_define_method(sslctx, "initialize", sslctx_initialize, 1); - rb_undef_method(sslctx, "initialize_copy"); - - - // OpenSSL Build / Runtime/Load versions - - /* Version of OpenSSL that Puma was compiled with */ - rb_define_const(mod, "OPENSSL_VERSION", rb_str_new2(OPENSSL_VERSION_TEXT)); - -#if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000 - /* Version of OpenSSL that Puma loaded with */ - rb_define_const(mod, "OPENSSL_LIBRARY_VERSION", rb_str_new2(OpenSSL_version(OPENSSL_VERSION))); -#else - rb_define_const(mod, "OPENSSL_LIBRARY_VERSION", rb_str_new2(SSLeay_version(SSLEAY_VERSION))); -#endif - -#if defined(OPENSSL_NO_SSL3) || defined(OPENSSL_NO_SSL3_METHOD) - /* True if SSL3 is not available */ - rb_define_const(mod, "OPENSSL_NO_SSL3", Qtrue); -#else - rb_define_const(mod, "OPENSSL_NO_SSL3", Qfalse); -#endif - -#if defined(OPENSSL_NO_TLS1) || defined(OPENSSL_NO_TLS1_METHOD) - /* True if TLS1 is not available */ - rb_define_const(mod, "OPENSSL_NO_TLS1", Qtrue); -#else - rb_define_const(mod, "OPENSSL_NO_TLS1", Qfalse); -#endif - -#if defined(OPENSSL_NO_TLS1_1) || defined(OPENSSL_NO_TLS1_1_METHOD) - /* True if TLS1_1 is not available */ - rb_define_const(mod, "OPENSSL_NO_TLS1_1", Qtrue); -#else - rb_define_const(mod, "OPENSSL_NO_TLS1_1", Qfalse); -#endif - - rb_define_singleton_method(mod, "check", noop, 0); - - eError = rb_define_class_under(mod, "SSLError", rb_eStandardError); - - rb_define_singleton_method(eng, "server", engine_init_server, 1); - rb_define_singleton_method(eng, "client", engine_init_client, 0); - - rb_define_method(eng, "inject", engine_inject, 1); - rb_define_method(eng, "read", engine_read, 0); - - rb_define_method(eng, "write", engine_write, 1); - rb_define_method(eng, "extract", engine_extract, 0); - - rb_define_method(eng, "shutdown", engine_shutdown, 0); - - rb_define_method(eng, "init?", engine_init, 0); - - /* @!attribute [r] peercert - * Returns `nil` when `MiniSSL::Context#verify_mode` is set to `VERIFY_NONE`. - * @return [String, nil] DER encoded cert - */ - rb_define_method(eng, "peercert", engine_peercert, 0); - - rb_define_method(eng, "ssl_vers_st", engine_ssl_vers_st, 0); -} - -#else - -NORETURN(VALUE raise_error(VALUE self)); - -VALUE raise_error(VALUE self) { - rb_raise(rb_eStandardError, "SSL not available in this build"); -} - -void Init_mini_ssl(VALUE puma) { - VALUE mod; - - mod = rb_define_module_under(puma, "MiniSSL"); - rb_define_class_under(mod, "SSLError", rb_eStandardError); - - rb_define_singleton_method(mod, "check", raise_error, 0); -} -#endif diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/no_ssl/PumaHttp11Service.java b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/no_ssl/PumaHttp11Service.java deleted file mode 100644 index 5701e83..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/no_ssl/PumaHttp11Service.java +++ /dev/null @@ -1,15 +0,0 @@ -package puma; - -import java.io.IOException; - -import org.jruby.Ruby; -import org.jruby.runtime.load.BasicLibraryService; - -import org.jruby.puma.Http11; - -public class PumaHttp11Service implements BasicLibraryService { - public boolean basicLoad(final Ruby runtime) throws IOException { - Http11.createHttp11(runtime); - return true; - } -} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/Http11.java b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/Http11.java deleted file mode 100644 index 03c790c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/Http11.java +++ /dev/null @@ -1,249 +0,0 @@ -package org.jruby.puma; - -import org.jruby.Ruby; -import org.jruby.RubyClass; -import org.jruby.RubyHash; -import org.jruby.RubyModule; -import org.jruby.RubyNumeric; -import org.jruby.RubyObject; -import org.jruby.RubyString; - -import org.jruby.anno.JRubyMethod; - -import org.jruby.runtime.ObjectAllocator; -import org.jruby.runtime.builtin.IRubyObject; - -import org.jruby.exceptions.RaiseException; - -import org.jruby.util.ByteList; - -/** - * @author Ola Bini - * @author Charles Oliver Nutter - */ -public class Http11 extends RubyObject { - public final static int MAX_FIELD_NAME_LENGTH = 256; - public final static String MAX_FIELD_NAME_LENGTH_ERR = "HTTP element FIELD_NAME is longer than the 256 allowed length."; - public final static int MAX_FIELD_VALUE_LENGTH = 80 * 1024; - public final static String MAX_FIELD_VALUE_LENGTH_ERR = "HTTP element FIELD_VALUE is longer than the 81920 allowed length."; - public final static int MAX_REQUEST_URI_LENGTH = getConstLength("PUMA_REQUEST_URI_MAX_LENGTH", 1024 * 12); - public final static String MAX_REQUEST_URI_LENGTH_ERR = "HTTP element REQUEST_URI is longer than the " + MAX_REQUEST_URI_LENGTH + " allowed length."; - public final static int MAX_FRAGMENT_LENGTH = 1024; - public final static String MAX_FRAGMENT_LENGTH_ERR = "HTTP element FRAGMENT is longer than the 1024 allowed length."; - public final static int MAX_REQUEST_PATH_LENGTH = getConstLength("PUMA_REQUEST_PATH_MAX_LENGTH", 8192); - public final static String MAX_REQUEST_PATH_LENGTH_ERR = "HTTP element REQUEST_PATH is longer than the " + MAX_REQUEST_PATH_LENGTH + " allowed length."; - public final static int MAX_QUERY_STRING_LENGTH = getConstLength("PUMA_QUERY_STRING_MAX_LENGTH", 10 * 1024); - public final static String MAX_QUERY_STRING_LENGTH_ERR = "HTTP element QUERY_STRING is longer than the " + MAX_QUERY_STRING_LENGTH +" allowed length."; - public final static int MAX_HEADER_LENGTH = 1024 * (80 + 32); - public final static String MAX_HEADER_LENGTH_ERR = "HTTP element HEADER is longer than the 114688 allowed length."; - - public static final ByteList CONTENT_TYPE_BYTELIST = new ByteList(ByteList.plain("CONTENT_TYPE")); - public static final ByteList CONTENT_LENGTH_BYTELIST = new ByteList(ByteList.plain("CONTENT_LENGTH")); - public static final ByteList HTTP_PREFIX_BYTELIST = new ByteList(ByteList.plain("HTTP_")); - public static final ByteList COMMA_SPACE_BYTELIST = new ByteList(ByteList.plain(", ")); - public static final ByteList REQUEST_METHOD_BYTELIST = new ByteList(ByteList.plain("REQUEST_METHOD")); - public static final ByteList REQUEST_URI_BYTELIST = new ByteList(ByteList.plain("REQUEST_URI")); - public static final ByteList FRAGMENT_BYTELIST = new ByteList(ByteList.plain("FRAGMENT")); - public static final ByteList REQUEST_PATH_BYTELIST = new ByteList(ByteList.plain("REQUEST_PATH")); - public static final ByteList QUERY_STRING_BYTELIST = new ByteList(ByteList.plain("QUERY_STRING")); - public static final ByteList SERVER_PROTOCOL_BYTELIST = new ByteList(ByteList.plain("SERVER_PROTOCOL")); - - public static String getEnvOrProperty(String name) { - String envValue = System.getenv(name); - return (envValue != null) ? envValue : System.getProperty(name); - } - - public static int getConstLength(String name, Integer defaultValue) { - String stringValue = getEnvOrProperty(name); - if (stringValue == null || stringValue.isEmpty()) return defaultValue; - - try { - int value = Integer.parseUnsignedInt(stringValue); - if (value <= 0) { - throw new NumberFormatException("The number is not positive."); - } - return value; - } catch (NumberFormatException e) { - System.err.println(String.format("The value %s for %s is invalid. Using default value %d instead.", stringValue, name, defaultValue)); - return defaultValue; - } - } - - private static ObjectAllocator ALLOCATOR = new ObjectAllocator() { - public IRubyObject allocate(Ruby runtime, RubyClass klass) { - return new Http11(runtime, klass); - } - }; - - public static void createHttp11(Ruby runtime) { - RubyModule mPuma = runtime.defineModule("Puma"); - mPuma.defineClassUnder("HttpParserError",runtime.getClass("StandardError"),runtime.getClass("StandardError").getAllocator()); - - RubyClass cHttpParser = mPuma.defineClassUnder("HttpParser",runtime.getObject(),ALLOCATOR); - cHttpParser.defineAnnotatedMethods(Http11.class); - } - - private Ruby runtime; - private Http11Parser hp; - private RubyString body; - - public Http11(Ruby runtime, RubyClass clazz) { - super(runtime,clazz); - this.runtime = runtime; - this.hp = new Http11Parser(); - this.hp.parser.init(); - } - - public static void validateMaxLength(Ruby runtime, int len, int max, String msg) { - if(len>max) { - throw newHTTPParserError(runtime, msg); - } - } - - private static RaiseException newHTTPParserError(Ruby runtime, String msg) { - return runtime.newRaiseException(getHTTPParserError(runtime), msg); - } - - private static RubyClass getHTTPParserError(Ruby runtime) { - // Cheaper to look this up lazily than cache eagerly and consume a field, since it's rarely encountered - return (RubyClass)runtime.getModule("Puma").getConstant("HttpParserError"); - } - - public static void http_field(Ruby runtime, RubyHash req, ByteList buffer, int field, int flen, int value, int vlen) { - RubyString f; - IRubyObject v; - validateMaxLength(runtime, flen, MAX_FIELD_NAME_LENGTH, MAX_FIELD_NAME_LENGTH_ERR); - validateMaxLength(runtime, vlen, MAX_FIELD_VALUE_LENGTH, MAX_FIELD_VALUE_LENGTH_ERR); - - ByteList b = new ByteList(buffer,field,flen); - for(int i = 0,j = b.length();i 0 && Character.isWhitespace(buffer.get(value + vlen - 1))) vlen--; - - if (b.equals(CONTENT_LENGTH_BYTELIST) || b.equals(CONTENT_TYPE_BYTELIST)) { - f = RubyString.newString(runtime, b); - } else { - f = RubyString.newStringShared(runtime, HTTP_PREFIX_BYTELIST); - f.cat(b); - } - - b = new ByteList(buffer, value, vlen); - v = req.fastARef(f); - if (v == null || v.isNil()) { - req.fastASet(f, RubyString.newString(runtime, b)); - } else { - RubyString vs = v.convertToString(); - vs.cat(COMMA_SPACE_BYTELIST); - vs.cat(b); - } - } - - public static void request_method(Ruby runtime, RubyHash req, ByteList buffer, int at, int length) { - RubyString val = RubyString.newString(runtime,new ByteList(buffer,at,length)); - req.fastASet(RubyString.newStringShared(runtime, REQUEST_METHOD_BYTELIST),val); - } - - public static void request_uri(Ruby runtime, RubyHash req, ByteList buffer, int at, int length) { - validateMaxLength(runtime, length, MAX_REQUEST_URI_LENGTH, MAX_REQUEST_URI_LENGTH_ERR); - RubyString val = RubyString.newString(runtime,new ByteList(buffer,at,length)); - req.fastASet(RubyString.newStringShared(runtime, REQUEST_URI_BYTELIST),val); - } - - public static void fragment(Ruby runtime, RubyHash req, ByteList buffer, int at, int length) { - validateMaxLength(runtime, length, MAX_FRAGMENT_LENGTH, MAX_FRAGMENT_LENGTH_ERR); - RubyString val = RubyString.newString(runtime,new ByteList(buffer,at,length)); - req.fastASet(RubyString.newStringShared(runtime, FRAGMENT_BYTELIST),val); - } - - public static void request_path(Ruby runtime, RubyHash req, ByteList buffer, int at, int length) { - validateMaxLength(runtime, length, MAX_REQUEST_PATH_LENGTH, MAX_REQUEST_PATH_LENGTH_ERR); - RubyString val = RubyString.newString(runtime,new ByteList(buffer,at,length)); - req.fastASet(RubyString.newStringShared(runtime, REQUEST_PATH_BYTELIST),val); - } - - public static void query_string(Ruby runtime, RubyHash req, ByteList buffer, int at, int length) { - validateMaxLength(runtime, length, MAX_QUERY_STRING_LENGTH, MAX_QUERY_STRING_LENGTH_ERR); - RubyString val = RubyString.newString(runtime,new ByteList(buffer,at,length)); - req.fastASet(RubyString.newStringShared(runtime, QUERY_STRING_BYTELIST),val); - } - - public static void server_protocol(Ruby runtime, RubyHash req, ByteList buffer, int at, int length) { - RubyString val = RubyString.newString(runtime,new ByteList(buffer,at,length)); - req.fastASet(RubyString.newStringShared(runtime, SERVER_PROTOCOL_BYTELIST),val); - } - - public void header_done(Ruby runtime, RubyHash req, ByteList buffer, int at, int length) { - body = RubyString.newStringShared(runtime, new ByteList(buffer, at, length)); - } - - @JRubyMethod - public IRubyObject initialize() { - this.hp.parser.init(); - return this; - } - - @JRubyMethod - public IRubyObject reset() { - this.hp.parser.init(); - return runtime.getNil(); - } - - @JRubyMethod - public IRubyObject finish() { - this.hp.finish(); - return this.hp.is_finished() ? runtime.getTrue() : runtime.getFalse(); - } - - @JRubyMethod - public IRubyObject execute(IRubyObject req_hash, IRubyObject data, IRubyObject start) { - int from = RubyNumeric.fix2int(start); - ByteList d = ((RubyString)data).getByteList(); - if(from >= d.length()) { - throw newHTTPParserError(runtime, "Requested start is after data buffer end."); - } else { - Http11Parser hp = this.hp; - Http11Parser.HttpParser parser = hp.parser; - - parser.data = (RubyHash) req_hash; - - hp.execute(runtime, this, d,from); - - validateMaxLength(runtime, parser.nread,MAX_HEADER_LENGTH, MAX_HEADER_LENGTH_ERR); - - if(hp.has_error()) { - throw newHTTPParserError(runtime, "Invalid HTTP format, parsing fails. Are you trying to open an SSL connection to a non-SSL Puma?"); - } else { - return runtime.newFixnum(parser.nread); - } - } - } - - @JRubyMethod(name = "error?") - public IRubyObject has_error() { - return this.hp.has_error() ? runtime.getTrue() : runtime.getFalse(); - } - - @JRubyMethod(name = "finished?") - public IRubyObject is_finished() { - return this.hp.is_finished() ? runtime.getTrue() : runtime.getFalse(); - } - - @JRubyMethod - public IRubyObject nread() { - return runtime.newFixnum(this.hp.parser.nread); - } - - @JRubyMethod - public IRubyObject body() { - return body; - } -}// Http11 diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/Http11Parser.java b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/Http11Parser.java deleted file mode 100644 index d5a6815..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/Http11Parser.java +++ /dev/null @@ -1,455 +0,0 @@ - -// line 1 "ext/puma_http11/http11_parser.java.rl" -package org.jruby.puma; - -import org.jruby.Ruby; -import org.jruby.RubyHash; -import org.jruby.util.ByteList; - -public class Http11Parser { - -/** Machine **/ - - -// line 58 "ext/puma_http11/http11_parser.java.rl" - - -/** Data **/ - -// line 20 "ext/puma_http11/org/jruby/puma/Http11Parser.java" -private static byte[] init__puma_parser_actions_0() -{ - return new byte [] { - 0, 1, 0, 1, 2, 1, 3, 1, 4, 1, 5, 1, - 6, 1, 7, 1, 8, 1, 9, 1, 11, 1, 12, 1, - 13, 2, 0, 8, 2, 1, 2, 2, 4, 5, 2, 10, - 7, 2, 12, 7, 3, 9, 10, 7 - }; -} - -private static final byte _puma_parser_actions[] = init__puma_parser_actions_0(); - - -private static short[] init__puma_parser_key_offsets_0() -{ - return new short [] { - 0, 0, 8, 17, 27, 29, 30, 31, 32, 33, 34, 36, - 39, 41, 44, 45, 61, 62, 78, 85, 91, 99, 107, 117, - 125, 134, 142, 150, 159, 168, 177, 186, 195, 204, 213, 222, - 231, 240, 249, 258, 267, 276, 285, 294, 303, 312, 313 - }; -} - -private static final short _puma_parser_key_offsets[] = init__puma_parser_key_offsets_0(); - - -private static char[] init__puma_parser_trans_keys_0() -{ - return new char [] { - 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, - 46, 48, 57, 65, 90, 42, 43, 47, 58, 45, 57, 65, - 90, 97, 122, 32, 35, 72, 84, 84, 80, 47, 48, 57, - 46, 48, 57, 48, 57, 13, 48, 57, 10, 13, 33, 124, - 126, 35, 39, 42, 43, 45, 46, 48, 57, 65, 90, 94, - 122, 10, 33, 58, 124, 126, 35, 39, 42, 43, 45, 46, - 48, 57, 65, 90, 94, 122, 13, 32, 127, 0, 8, 10, - 31, 13, 127, 0, 8, 10, 31, 32, 60, 62, 127, 0, - 31, 34, 35, 32, 60, 62, 127, 0, 31, 34, 35, 43, - 58, 45, 46, 48, 57, 65, 90, 97, 122, 32, 34, 35, - 60, 62, 127, 0, 31, 32, 34, 35, 60, 62, 63, 127, - 0, 31, 32, 34, 35, 60, 62, 127, 0, 31, 32, 34, - 35, 60, 62, 127, 0, 31, 32, 36, 95, 45, 46, 48, - 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, - 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, - 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, - 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, - 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, - 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, - 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, - 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, - 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, - 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, - 32, 36, 95, 45, 46, 48, 57, 65, 90, 32, 36, 95, - 45, 46, 48, 57, 65, 90, 32, 36, 95, 45, 46, 48, - 57, 65, 90, 32, 36, 95, 45, 46, 48, 57, 65, 90, - 32, 0 - }; -} - -private static final char _puma_parser_trans_keys[] = init__puma_parser_trans_keys_0(); - - -private static byte[] init__puma_parser_single_lengths_0() -{ - return new byte [] { - 0, 2, 3, 4, 2, 1, 1, 1, 1, 1, 0, 1, - 0, 1, 1, 4, 1, 4, 3, 2, 4, 4, 2, 6, - 7, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 0 - }; -} - -private static final byte _puma_parser_single_lengths[] = init__puma_parser_single_lengths_0(); - - -private static byte[] init__puma_parser_range_lengths_0() -{ - return new byte [] { - 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 1, 1, - 1, 1, 0, 6, 0, 6, 2, 2, 2, 2, 4, 1, - 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0 - }; -} - -private static final byte _puma_parser_range_lengths[] = init__puma_parser_range_lengths_0(); - - -private static short[] init__puma_parser_index_offsets_0() -{ - return new short [] { - 0, 0, 6, 13, 21, 24, 26, 28, 30, 32, 34, 36, - 39, 41, 44, 46, 57, 59, 70, 76, 81, 88, 95, 102, - 110, 119, 127, 135, 142, 149, 156, 163, 170, 177, 184, 191, - 198, 205, 212, 219, 226, 233, 240, 247, 254, 261, 263 - }; -} - -private static final short _puma_parser_index_offsets[] = init__puma_parser_index_offsets_0(); - - -private static byte[] init__puma_parser_indicies_0() -{ - return new byte [] { - 0, 0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 3, - 1, 4, 5, 6, 7, 5, 5, 5, 1, 8, 9, 1, - 10, 1, 11, 1, 12, 1, 13, 1, 14, 1, 15, 1, - 16, 15, 1, 17, 1, 18, 17, 1, 19, 1, 20, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 1, 22, 1, 23, - 24, 23, 23, 23, 23, 23, 23, 23, 23, 1, 26, 27, - 1, 1, 1, 25, 29, 1, 1, 1, 28, 30, 1, 1, - 1, 1, 1, 31, 32, 1, 1, 1, 1, 1, 33, 34, - 35, 34, 34, 34, 34, 1, 8, 1, 9, 1, 1, 1, - 1, 35, 36, 1, 38, 1, 1, 39, 1, 1, 37, 40, - 1, 42, 1, 1, 1, 1, 41, 43, 1, 45, 1, 1, - 1, 1, 44, 2, 46, 46, 46, 46, 46, 1, 2, 47, - 47, 47, 47, 47, 1, 2, 48, 48, 48, 48, 48, 1, - 2, 49, 49, 49, 49, 49, 1, 2, 50, 50, 50, 50, - 50, 1, 2, 51, 51, 51, 51, 51, 1, 2, 52, 52, - 52, 52, 52, 1, 2, 53, 53, 53, 53, 53, 1, 2, - 54, 54, 54, 54, 54, 1, 2, 55, 55, 55, 55, 55, - 1, 2, 56, 56, 56, 56, 56, 1, 2, 57, 57, 57, - 57, 57, 1, 2, 58, 58, 58, 58, 58, 1, 2, 59, - 59, 59, 59, 59, 1, 2, 60, 60, 60, 60, 60, 1, - 2, 61, 61, 61, 61, 61, 1, 2, 62, 62, 62, 62, - 62, 1, 2, 63, 63, 63, 63, 63, 1, 2, 1, 1, - 0 - }; -} - -private static final byte _puma_parser_indicies[] = init__puma_parser_indicies_0(); - - -private static byte[] init__puma_parser_trans_targs_0() -{ - return new byte [] { - 2, 0, 3, 27, 4, 22, 24, 23, 5, 20, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 46, 17, - 18, 19, 14, 18, 19, 14, 5, 21, 5, 21, 22, 23, - 5, 24, 20, 25, 5, 26, 20, 5, 26, 20, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45 - }; -} - -private static final byte _puma_parser_trans_targs[] = init__puma_parser_trans_targs_0(); - - -private static byte[] init__puma_parser_trans_actions_0() -{ - return new byte [] { - 1, 0, 11, 0, 1, 1, 1, 1, 13, 13, 1, 0, - 0, 0, 0, 0, 0, 0, 19, 0, 0, 28, 23, 3, - 5, 7, 31, 7, 0, 9, 25, 1, 15, 0, 0, 0, - 37, 0, 37, 21, 40, 17, 40, 34, 0, 34, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 - }; -} - -private static final byte _puma_parser_trans_actions[] = init__puma_parser_trans_actions_0(); - - -static final int puma_parser_start = 1; -static final int puma_parser_first_final = 46; -static final int puma_parser_error = 0; - - -// line 62 "ext/puma_http11/http11_parser.java.rl" - - public static interface ElementCB { - public void call(Ruby runtime, RubyHash data, ByteList buffer, int at, int length); - } - - public static interface FieldCB { - public void call(Ruby runtime, RubyHash data, ByteList buffer, int field, int flen, int value, int vlen); - } - - public static class HttpParser { - int cs; - int body_start; - int content_len; - int nread; - int mark; - int field_start; - int field_len; - int query_start; - - RubyHash data; - ByteList buffer; - - public void init() { - cs = 0; - - -// line 216 "ext/puma_http11/org/jruby/puma/Http11Parser.java" - { - cs = puma_parser_start; - } - -// line 88 "ext/puma_http11/http11_parser.java.rl" - - body_start = 0; - content_len = 0; - mark = 0; - nread = 0; - field_len = 0; - field_start = 0; - } - } - - public final HttpParser parser = new HttpParser(); - - public int execute(Ruby runtime, Http11 http, ByteList buffer, int off) { - int p, pe; - int cs = parser.cs; - int len = buffer.length(); - assert off<=len : "offset past end of buffer"; - - p = off; - pe = len; - // get a copy of the bytes, since it may not start at 0 - // FIXME: figure out how to just use the bytes in-place - byte[] data = buffer.bytes(); - parser.buffer = buffer; - - -// line 248 "ext/puma_http11/org/jruby/puma/Http11Parser.java" - { - int _klen; - int _trans = 0; - int _acts; - int _nacts; - int _keys; - int _goto_targ = 0; - - _goto: while (true) { - switch ( _goto_targ ) { - case 0: - if ( p == pe ) { - _goto_targ = 4; - continue _goto; - } - if ( cs == 0 ) { - _goto_targ = 5; - continue _goto; - } -case 1: - _match: do { - _keys = _puma_parser_key_offsets[cs]; - _trans = _puma_parser_index_offsets[cs]; - _klen = _puma_parser_single_lengths[cs]; - if ( _klen > 0 ) { - int _lower = _keys; - int _mid; - int _upper = _keys + _klen - 1; - while (true) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( data[p] < _puma_parser_trans_keys[_mid] ) - _upper = _mid - 1; - else if ( data[p] > _puma_parser_trans_keys[_mid] ) - _lower = _mid + 1; - else { - _trans += (_mid - _keys); - break _match; - } - } - _keys += _klen; - _trans += _klen; - } - - _klen = _puma_parser_range_lengths[cs]; - if ( _klen > 0 ) { - int _lower = _keys; - int _mid; - int _upper = _keys + (_klen<<1) - 2; - while (true) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( data[p] < _puma_parser_trans_keys[_mid] ) - _upper = _mid - 2; - else if ( data[p] > _puma_parser_trans_keys[_mid+1] ) - _lower = _mid + 2; - else { - _trans += ((_mid - _keys)>>1); - break _match; - } - } - _trans += _klen; - } - } while (false); - - _trans = _puma_parser_indicies[_trans]; - cs = _puma_parser_trans_targs[_trans]; - - if ( _puma_parser_trans_actions[_trans] != 0 ) { - _acts = _puma_parser_trans_actions[_trans]; - _nacts = (int) _puma_parser_actions[_acts++]; - while ( _nacts-- > 0 ) - { - switch ( _puma_parser_actions[_acts++] ) - { - case 0: -// line 15 "ext/puma_http11/http11_parser.java.rl" - {parser.mark = p; } - break; - case 1: -// line 17 "ext/puma_http11/http11_parser.java.rl" - { parser.field_start = p; } - break; - case 2: -// line 18 "ext/puma_http11/http11_parser.java.rl" - { /* FIXME stub */ } - break; - case 3: -// line 19 "ext/puma_http11/http11_parser.java.rl" - { - parser.field_len = p-parser.field_start; - } - break; - case 4: -// line 23 "ext/puma_http11/http11_parser.java.rl" - { parser.mark = p; } - break; - case 5: -// line 24 "ext/puma_http11/http11_parser.java.rl" - { - Http11.http_field(runtime, parser.data, parser.buffer, parser.field_start, parser.field_len, parser.mark, p-parser.mark); - } - break; - case 6: -// line 27 "ext/puma_http11/http11_parser.java.rl" - { - Http11.request_method(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark); - } - break; - case 7: -// line 30 "ext/puma_http11/http11_parser.java.rl" - { - Http11.request_uri(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark); - } - break; - case 8: -// line 33 "ext/puma_http11/http11_parser.java.rl" - { - Http11.fragment(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark); - } - break; - case 9: -// line 37 "ext/puma_http11/http11_parser.java.rl" - {parser.query_start = p; } - break; - case 10: -// line 38 "ext/puma_http11/http11_parser.java.rl" - { - Http11.query_string(runtime, parser.data, parser.buffer, parser.query_start, p-parser.query_start); - } - break; - case 11: -// line 42 "ext/puma_http11/http11_parser.java.rl" - { - Http11.server_protocol(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark); - } - break; - case 12: -// line 46 "ext/puma_http11/http11_parser.java.rl" - { - Http11.request_path(runtime, parser.data, parser.buffer, parser.mark, p-parser.mark); - } - break; - case 13: -// line 50 "ext/puma_http11/http11_parser.java.rl" - { - parser.body_start = p + 1; - http.header_done(runtime, parser.data, parser.buffer, p + 1, pe - p - 1); - { p += 1; _goto_targ = 5; if (true) continue _goto;} - } - break; -// line 404 "ext/puma_http11/org/jruby/puma/Http11Parser.java" - } - } - } - -case 2: - if ( cs == 0 ) { - _goto_targ = 5; - continue _goto; - } - if ( ++p != pe ) { - _goto_targ = 1; - continue _goto; - } -case 4: -case 5: - } - break; } - } - -// line 114 "ext/puma_http11/http11_parser.java.rl" - - parser.cs = cs; - parser.nread += (p - off); - - assert p <= pe : "buffer overflow after parsing execute"; - assert parser.nread <= len : "nread longer than length"; - assert parser.body_start <= len : "body starts after buffer end"; - assert parser.mark < len : "mark is after buffer end"; - assert parser.field_len <= len : "field has length longer than whole buffer"; - assert parser.field_start < len : "field starts after buffer end"; - - return parser.nread; - } - - public int finish() { - if(has_error()) { - return -1; - } else if(is_finished()) { - return 1; - } else { - return 0; - } - } - - public boolean has_error() { - return parser.cs == puma_parser_error; - } - - public boolean is_finished() { - return parser.cs == puma_parser_first_final; - } -} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/MiniSSL.java b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/MiniSSL.java deleted file mode 100644 index 36ad801..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/org/jruby/puma/MiniSSL.java +++ /dev/null @@ -1,509 +0,0 @@ -package org.jruby.puma; - -import org.jruby.Ruby; -import org.jruby.RubyArray; -import org.jruby.RubyClass; -import org.jruby.RubyModule; -import org.jruby.RubyObject; -import org.jruby.RubyString; -import org.jruby.anno.JRubyMethod; -import org.jruby.exceptions.RaiseException; -import org.jruby.javasupport.JavaEmbedUtils; -import org.jruby.runtime.Block; -import org.jruby.runtime.ObjectAllocator; -import org.jruby.runtime.ThreadContext; -import org.jruby.runtime.builtin.IRubyObject; -import org.jruby.util.ByteList; - -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.TrustManager; -import javax.net.ssl.TrustManagerFactory; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLEngine; -import javax.net.ssl.SSLEngineResult; -import javax.net.ssl.SSLException; -import javax.net.ssl.SSLPeerUnverifiedException; -import javax.net.ssl.SSLSession; -import javax.net.ssl.X509TrustManager; -import java.io.FileInputStream; -import java.io.InputStream; -import java.io.IOException; -import java.nio.Buffer; -import java.nio.ByteBuffer; -import java.security.KeyManagementException; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.UnrecoverableKeyException; -import java.security.cert.Certificate; -import java.security.cert.CertificateEncodingException; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; -import java.util.concurrent.ConcurrentHashMap; -import java.util.Map; -import java.util.function.Supplier; - -import static javax.net.ssl.SSLEngineResult.Status; -import static javax.net.ssl.SSLEngineResult.HandshakeStatus; - -public class MiniSSL extends RubyObject { // MiniSSL::Engine - private static final long serialVersionUID = -6903439483039141234L; - private static ObjectAllocator ALLOCATOR = new ObjectAllocator() { - public IRubyObject allocate(Ruby runtime, RubyClass klass) { - return new MiniSSL(runtime, klass); - } - }; - - public static void createMiniSSL(Ruby runtime) { - RubyModule mPuma = runtime.defineModule("Puma"); - RubyModule ssl = mPuma.defineModuleUnder("MiniSSL"); - - // Puma::MiniSSL::SSLError - ssl.defineClassUnder("SSLError", runtime.getStandardError(), runtime.getStandardError().getAllocator()); - - RubyClass eng = ssl.defineClassUnder("Engine", runtime.getObject(), ALLOCATOR); - eng.defineAnnotatedMethods(MiniSSL.class); - } - - /** - * Fairly transparent wrapper around {@link java.nio.ByteBuffer} which adds the enhancements we need - */ - private static class MiniSSLBuffer { - ByteBuffer buffer; - - private MiniSSLBuffer(int capacity) { buffer = ByteBuffer.allocate(capacity); } - private MiniSSLBuffer(byte[] initialContents) { buffer = ByteBuffer.wrap(initialContents); } - - public void clear() { buffer.clear(); } - public void compact() { buffer.compact(); } - public void flip() { ((Buffer) buffer).flip(); } - public boolean hasRemaining() { return buffer.hasRemaining(); } - public int position() { return buffer.position(); } - - public ByteBuffer getRawBuffer() { - return buffer; - } - - /** - * Writes bytes to the buffer after ensuring there's room - */ - private void put(byte[] bytes, final int offset, final int length) { - if (buffer.remaining() < length) { - resize(buffer.limit() + length); - } - buffer.put(bytes, offset, length); - } - - /** - * Ensures that newCapacity bytes can be written to this buffer, only re-allocating if necessary - */ - public void resize(int newCapacity) { - if (newCapacity > buffer.capacity()) { - ByteBuffer dstTmp = ByteBuffer.allocate(newCapacity); - flip(); - dstTmp.put(buffer); - buffer = dstTmp; - } else { - buffer.limit(newCapacity); - } - } - - /** - * Drains the buffer to a ByteList, or returns null for an empty buffer - */ - public ByteList asByteList() { - flip(); - if (!buffer.hasRemaining()) { - buffer.clear(); - return null; - } - - byte[] bss = new byte[buffer.limit()]; - - buffer.get(bss); - buffer.clear(); - return new ByteList(bss, false); - } - - @Override - public String toString() { return buffer.toString(); } - } - - private SSLEngine engine; - private boolean closed; - private boolean handshake; - private MiniSSLBuffer inboundNetData; - private MiniSSLBuffer outboundAppData; - private MiniSSLBuffer outboundNetData; - - public MiniSSL(Ruby runtime, RubyClass klass) { - super(runtime, klass); - } - - private static Map keyManagerFactoryMap = new ConcurrentHashMap(); - private static Map trustManagerFactoryMap = new ConcurrentHashMap(); - - @JRubyMethod(meta = true) // Engine.server - public static synchronized IRubyObject server(ThreadContext context, IRubyObject recv, IRubyObject miniSSLContext) - throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException, UnrecoverableKeyException { - // Create the KeyManagerFactory and TrustManagerFactory for this server - String keystoreFile = asStringValue(miniSSLContext.callMethod(context, "keystore"), null); - char[] keystorePass = asStringValue(miniSSLContext.callMethod(context, "keystore_pass"), null).toCharArray(); - String keystoreType = asStringValue(miniSSLContext.callMethod(context, "keystore_type"), KeyStore::getDefaultType); - - String truststoreFile; - char[] truststorePass; - String truststoreType; - IRubyObject truststore = miniSSLContext.callMethod(context, "truststore"); - if (truststore.isNil()) { - truststoreFile = keystoreFile; - truststorePass = keystorePass; - truststoreType = keystoreType; - } else if (!isDefaultSymbol(context, truststore)) { - truststoreFile = truststore.convertToString().asJavaString(); - IRubyObject pass = miniSSLContext.callMethod(context, "truststore_pass"); - if (pass.isNil()) { - truststorePass = null; - } else { - truststorePass = asStringValue(pass, null).toCharArray(); - } - truststoreType = asStringValue(miniSSLContext.callMethod(context, "truststore_type"), KeyStore::getDefaultType); - } else { // self.truststore = :default - truststoreFile = null; - truststorePass = null; - truststoreType = null; - } - - KeyStore ks = KeyStore.getInstance(keystoreType); - InputStream is = new FileInputStream(keystoreFile); - try { - ks.load(is, keystorePass); - } finally { - is.close(); - } - KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); - kmf.init(ks, keystorePass); - keyManagerFactoryMap.put(keystoreFile, kmf); - - if (truststoreFile != null) { - KeyStore ts = KeyStore.getInstance(truststoreType); - is = new FileInputStream(truststoreFile); - try { - ts.load(is, truststorePass); - } finally { - is.close(); - } - TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); - tmf.init(ts); - trustManagerFactoryMap.put(truststoreFile, tmf); - } - - RubyClass klass = (RubyClass) recv; - return klass.newInstance(context, miniSSLContext, Block.NULL_BLOCK); - } - - private static String asStringValue(IRubyObject value, Supplier defaultValue) { - if (defaultValue != null && value.isNil()) return defaultValue.get(); - return value.convertToString().asJavaString(); - } - - private static boolean isDefaultSymbol(ThreadContext context, IRubyObject truststore) { - return context.runtime.newSymbol("default").equals(truststore); - } - - @JRubyMethod - public IRubyObject initialize(ThreadContext context, IRubyObject miniSSLContext) - throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { - - String keystoreFile = miniSSLContext.callMethod(context, "keystore").convertToString().asJavaString(); - KeyManagerFactory kmf = keyManagerFactoryMap.get(keystoreFile); - IRubyObject truststore = miniSSLContext.callMethod(context, "truststore"); - String truststoreFile = isDefaultSymbol(context, truststore) ? "" : asStringValue(truststore, () -> keystoreFile); - TrustManagerFactory tmf = trustManagerFactoryMap.get(truststoreFile); // null if self.truststore = :default - if (kmf == null) { - throw new KeyStoreException("Could not find KeyManagerFactory for keystore: " + keystoreFile + " truststore: " + truststoreFile); - } - - SSLContext sslCtx = SSLContext.getInstance("TLS"); - - sslCtx.init(kmf.getKeyManagers(), getTrustManagers(tmf), null); - closed = false; - handshake = false; - engine = sslCtx.createSSLEngine(); - - String[] enabledProtocols; - IRubyObject protocols = miniSSLContext.callMethod(context, "protocols"); - if (protocols.isNil()) { - if (miniSSLContext.callMethod(context, "no_tlsv1").isTrue()) { - enabledProtocols = new String[] { "TLSv1.1", "TLSv1.2", "TLSv1.3" }; - } else { - enabledProtocols = new String[] { "TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3" }; - } - - if (miniSSLContext.callMethod(context, "no_tlsv1_1").isTrue()) { - enabledProtocols = new String[] { "TLSv1.2", "TLSv1.3" }; - } - } else if (protocols instanceof RubyArray) { - enabledProtocols = (String[]) ((RubyArray) protocols).toArray(new String[0]); - } else { - throw context.runtime.newTypeError(protocols, context.runtime.getArray()); - } - engine.setEnabledProtocols(enabledProtocols); - - engine.setUseClientMode(false); - - long verify_mode = miniSSLContext.callMethod(context, "verify_mode").convertToInteger("to_i").getLongValue(); - if ((verify_mode & 0x1) != 0) { // 'peer' - engine.setWantClientAuth(true); - } - if ((verify_mode & 0x2) != 0) { // 'force_peer' - engine.setNeedClientAuth(true); - } - - IRubyObject cipher_suites = miniSSLContext.callMethod(context, "cipher_suites"); - if (cipher_suites instanceof RubyArray) { - engine.setEnabledCipherSuites((String[]) ((RubyArray) cipher_suites).toArray(new String[0])); - } else if (!cipher_suites.isNil()) { - throw context.runtime.newTypeError(cipher_suites, context.runtime.getArray()); - } - - SSLSession session = engine.getSession(); - inboundNetData = new MiniSSLBuffer(session.getPacketBufferSize()); - outboundAppData = new MiniSSLBuffer(session.getApplicationBufferSize()); - outboundAppData.flip(); - outboundNetData = new MiniSSLBuffer(session.getPacketBufferSize()); - - return this; - } - - private TrustManager[] getTrustManagers(TrustManagerFactory factory) { - if (factory == null) return null; // use JDK trust defaults - final TrustManager[] tms = factory.getTrustManagers(); - if (tms != null) { - for (int i=0; i 0 ? chain[0] : null; - delegate.checkClientTrusted(chain, authType); - } - - @Override - public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { - delegate.checkServerTrusted(chain, authType); - } - - @Override - public X509Certificate[] getAcceptedIssuers() { - return delegate.getAcceptedIssuers(); - } - - } - - @JRubyMethod - public IRubyObject inject(IRubyObject arg) { - ByteList bytes = arg.convertToString().getByteList(); - inboundNetData.put(bytes.unsafeBytes(), bytes.getBegin(), bytes.getRealSize()); - return this; - } - - private enum SSLOperation { - WRAP, - UNWRAP - } - - private SSLEngineResult doOp(SSLOperation sslOp, MiniSSLBuffer src, MiniSSLBuffer dst) throws SSLException { - SSLEngineResult res = null; - boolean retryOp = true; - while (retryOp) { - switch (sslOp) { - case WRAP: - res = engine.wrap(src.getRawBuffer(), dst.getRawBuffer()); - break; - case UNWRAP: - res = engine.unwrap(src.getRawBuffer(), dst.getRawBuffer()); - break; - default: - throw new AssertionError("Unknown SSLOperation: " + sslOp); - } - - switch (res.getStatus()) { - case BUFFER_OVERFLOW: - // increase the buffer size to accommodate the overflowing data - int newSize = Math.max(engine.getSession().getPacketBufferSize(), engine.getSession().getApplicationBufferSize()); - dst.resize(newSize + dst.position()); - // retry the operation - retryOp = true; - break; - case BUFFER_UNDERFLOW: - // need to wait for more data to come in before we retry - retryOp = false; - break; - case CLOSED: - closed = true; - retryOp = false; - break; - default: - // other case is OK. We're done here. - retryOp = false; - } - if (res.getHandshakeStatus() == HandshakeStatus.FINISHED) { - handshake = true; - } - } - - return res; - } - - @JRubyMethod - public IRubyObject read() { - try { - inboundNetData.flip(); - - if(!inboundNetData.hasRemaining()) { - return getRuntime().getNil(); - } - - MiniSSLBuffer inboundAppData = new MiniSSLBuffer(engine.getSession().getApplicationBufferSize()); - doOp(SSLOperation.UNWRAP, inboundNetData, inboundAppData); - - HandshakeStatus handshakeStatus = engine.getHandshakeStatus(); - boolean done = false; - while (!done) { - SSLEngineResult res; - switch (handshakeStatus) { - case NEED_WRAP: - res = doOp(SSLOperation.WRAP, inboundAppData, outboundNetData); - handshakeStatus = res.getHandshakeStatus(); - break; - case NEED_UNWRAP: - res = doOp(SSLOperation.UNWRAP, inboundNetData, inboundAppData); - if (res.getStatus() == Status.BUFFER_UNDERFLOW) { - // need more data before we can shake more hands - done = true; - } - handshakeStatus = res.getHandshakeStatus(); - break; - case NEED_TASK: - Runnable runnable; - while ((runnable = engine.getDelegatedTask()) != null) { - runnable.run(); - } - handshakeStatus = engine.getHandshakeStatus(); - break; - default: - done = true; - } - } - - if (inboundNetData.hasRemaining()) { - inboundNetData.compact(); - } else { - inboundNetData.clear(); - } - - ByteList appDataByteList = inboundAppData.asByteList(); - if (appDataByteList == null) { - return getRuntime().getNil(); - } - - return RubyString.newString(getRuntime(), appDataByteList); - } catch (SSLException e) { - throw newSSLError(getRuntime(), e); - } - } - - @JRubyMethod - public IRubyObject write(IRubyObject arg) { - byte[] bls = arg.convertToString().getBytes(); - outboundAppData = new MiniSSLBuffer(bls); - - return getRuntime().newFixnum(bls.length); - } - - @JRubyMethod - public IRubyObject extract(ThreadContext context) { - try { - ByteList dataByteList = outboundNetData.asByteList(); - if (dataByteList != null) { - return RubyString.newString(context.runtime, dataByteList); - } - - if (!outboundAppData.hasRemaining()) { - return context.nil; - } - - outboundNetData.clear(); - doOp(SSLOperation.WRAP, outboundAppData, outboundNetData); - dataByteList = outboundNetData.asByteList(); - if (dataByteList == null) { - return context.nil; - } - - return RubyString.newString(context.runtime, dataByteList); - } catch (SSLException e) { - throw newSSLError(getRuntime(), e); - } - } - - @JRubyMethod - public IRubyObject peercert(ThreadContext context) throws CertificateEncodingException { - Certificate peerCert; - try { - peerCert = engine.getSession().getPeerCertificates()[0]; - } catch (SSLPeerUnverifiedException e) { - peerCert = lastCheckedCert0; // null if trust check did not happen - } - return peerCert == null ? context.nil : JavaEmbedUtils.javaToRuby(context.runtime, peerCert.getEncoded()); - } - - @JRubyMethod(name = "init?") - public IRubyObject isInit(ThreadContext context) { - return handshake ? getRuntime().getFalse() : getRuntime().getTrue(); - } - - @JRubyMethod - public IRubyObject shutdown() { - if (closed || engine.isInboundDone() && engine.isOutboundDone()) { - if (engine.isOutboundDone()) { - engine.closeOutbound(); - } - return getRuntime().getTrue(); - } else { - return getRuntime().getFalse(); - } - } - - private static RubyClass getSSLError(Ruby runtime) { - return (RubyClass) ((RubyModule) runtime.getModule("Puma").getConstantAt("MiniSSL")).getConstantAt("SSLError"); - } - - private static RaiseException newSSLError(Ruby runtime, SSLException cause) { - return newError(runtime, getSSLError(runtime), cause.toString(), cause); - } - - private static RaiseException newError(Ruby runtime, RubyClass errorClass, String message, Throwable cause) { - RaiseException ex = RaiseException.from(runtime, errorClass, message); - ex.initCause(cause); - return ex; - } - -} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/puma_http11.c b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/puma_http11.c deleted file mode 100644 index b6bd18d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/ext/puma_http11/puma_http11.c +++ /dev/null @@ -1,495 +0,0 @@ -/** - * Copyright (c) 2005 Zed A. Shaw - * You can redistribute it and/or modify it under the same terms as Ruby. - * License 3-clause BSD - */ - -#define RSTRING_NOT_MODIFIED 1 - -#include "ruby.h" -#include "ext_help.h" -#include -#include -#include -#include "http11_parser.h" - -#ifndef MANAGED_STRINGS - -#ifndef RSTRING_PTR -#define RSTRING_PTR(s) (RSTRING(s)->ptr) -#endif -#ifndef RSTRING_LEN -#define RSTRING_LEN(s) (RSTRING(s)->len) -#endif - -#define rb_extract_chars(e, sz) (*sz = RSTRING_LEN(e), RSTRING_PTR(e)) -#define rb_free_chars(e) /* nothing */ - -#endif - -static VALUE eHttpParserError; - -#define HTTP_PREFIX "HTTP_" -#define HTTP_PREFIX_LEN (sizeof(HTTP_PREFIX) - 1) - -static VALUE global_request_method; -static VALUE global_request_uri; -static VALUE global_fragment; -static VALUE global_query_string; -static VALUE global_server_protocol; -static VALUE global_request_path; - -/** Defines common length and error messages for input length validation. */ -#define QUOTE(s) #s -#define EXPAND_MAX_LENGTH_VALUE(s) QUOTE(s) -#define DEF_MAX_LENGTH(N,length) const size_t MAX_##N##_LENGTH = length; const char *MAX_##N##_LENGTH_ERR = "HTTP element " # N " is longer than the " EXPAND_MAX_LENGTH_VALUE(length) " allowed length (was %d)" - -/** Validates the max length of given input and throws an HttpParserError exception if over. */ -#define VALIDATE_MAX_LENGTH(len, N) if(len > MAX_##N##_LENGTH) { rb_raise(eHttpParserError, MAX_##N##_LENGTH_ERR, len); } - -/** Defines global strings in the init method. */ -#define DEF_GLOBAL(N, val) global_##N = rb_str_new2(val); rb_global_variable(&global_##N) - - -/* Defines the maximum allowed lengths for various input elements.*/ -#ifndef PUMA_REQUEST_URI_MAX_LENGTH -#define PUMA_REQUEST_URI_MAX_LENGTH (1024 * 12) -#endif - -#ifndef PUMA_REQUEST_PATH_MAX_LENGTH -#define PUMA_REQUEST_PATH_MAX_LENGTH (8192) -#endif - -#ifndef PUMA_QUERY_STRING_MAX_LENGTH -#define PUMA_QUERY_STRING_MAX_LENGTH (1024 * 10) -#endif - -DEF_MAX_LENGTH(FIELD_NAME, 256); -DEF_MAX_LENGTH(FIELD_VALUE, 80 * 1024); -DEF_MAX_LENGTH(REQUEST_URI, PUMA_REQUEST_URI_MAX_LENGTH); -DEF_MAX_LENGTH(FRAGMENT, 1024); /* Don't know if this length is specified somewhere or not */ -DEF_MAX_LENGTH(REQUEST_PATH, PUMA_REQUEST_PATH_MAX_LENGTH); -DEF_MAX_LENGTH(QUERY_STRING, PUMA_QUERY_STRING_MAX_LENGTH); -DEF_MAX_LENGTH(HEADER, (1024 * (80 + 32))); - -struct common_field { - const size_t len; - const char *name; - int raw; - VALUE value; -}; - -/* - * A list of common HTTP headers we expect to receive. - * This allows us to avoid repeatedly creating identical string - * objects to be used with rb_hash_aset(). - */ -static struct common_field common_http_fields[] = { -# define f(N) { (sizeof(N) - 1), N, 0, Qnil } -# define fr(N) { (sizeof(N) - 1), N, 1, Qnil } - f("ACCEPT"), - f("ACCEPT_CHARSET"), - f("ACCEPT_ENCODING"), - f("ACCEPT_LANGUAGE"), - f("ALLOW"), - f("AUTHORIZATION"), - f("CACHE_CONTROL"), - f("CONNECTION"), - f("CONTENT_ENCODING"), - fr("CONTENT_LENGTH"), - fr("CONTENT_TYPE"), - f("COOKIE"), - f("DATE"), - f("EXPECT"), - f("FROM"), - f("HOST"), - f("IF_MATCH"), - f("IF_MODIFIED_SINCE"), - f("IF_NONE_MATCH"), - f("IF_RANGE"), - f("IF_UNMODIFIED_SINCE"), - f("KEEP_ALIVE"), /* Firefox sends this */ - f("MAX_FORWARDS"), - f("PRAGMA"), - f("PROXY_AUTHORIZATION"), - f("RANGE"), - f("REFERER"), - f("TE"), - f("TRAILER"), - f("TRANSFER_ENCODING"), - f("UPGRADE"), - f("USER_AGENT"), - f("VIA"), - f("X_FORWARDED_FOR"), /* common for proxies */ - f("X_REAL_IP"), /* common for proxies */ - f("WARNING") -# undef f -}; - -static void init_common_fields(void) -{ - unsigned i; - struct common_field *cf = common_http_fields; - char tmp[256]; /* MAX_FIELD_NAME_LENGTH */ - memcpy(tmp, HTTP_PREFIX, HTTP_PREFIX_LEN); - - for(i = 0; i < ARRAY_SIZE(common_http_fields); cf++, i++) { - if(cf->raw) { - cf->value = rb_str_new(cf->name, cf->len); - } else { - memcpy(tmp + HTTP_PREFIX_LEN, cf->name, cf->len + 1); - cf->value = rb_str_new(tmp, HTTP_PREFIX_LEN + cf->len); - } - rb_global_variable(&cf->value); - } -} - -static VALUE find_common_field_value(const char *field, size_t flen) -{ - unsigned i; - struct common_field *cf = common_http_fields; - for(i = 0; i < ARRAY_SIZE(common_http_fields); i++, cf++) { - if (cf->len == flen && !memcmp(cf->name, field, flen)) - return cf->value; - } - return Qnil; -} - -void http_field(puma_parser* hp, const char *field, size_t flen, - const char *value, size_t vlen) -{ - VALUE f = Qnil; - VALUE v; - - VALIDATE_MAX_LENGTH(flen, FIELD_NAME); - VALIDATE_MAX_LENGTH(vlen, FIELD_VALUE); - - f = find_common_field_value(field, flen); - - if (f == Qnil) { - /* - * We got a strange header that we don't have a memoized value for. - * Fallback to creating a new string to use as a hash key. - */ - - size_t new_size = HTTP_PREFIX_LEN + flen; - assert(new_size < BUFFER_LEN); - - memcpy(hp->buf, HTTP_PREFIX, HTTP_PREFIX_LEN); - memcpy(hp->buf + HTTP_PREFIX_LEN, field, flen); - - f = rb_str_new(hp->buf, new_size); - } - - while (vlen > 0 && isspace(value[vlen - 1])) vlen--; - - /* check for duplicate header */ - v = rb_hash_aref(hp->request, f); - - if (v == Qnil) { - v = rb_str_new(value, vlen); - rb_hash_aset(hp->request, f, v); - } else { - /* if duplicate header, normalize to comma-separated values */ - rb_str_cat2(v, ", "); - rb_str_cat(v, value, vlen); - } -} - -void request_method(puma_parser* hp, const char *at, size_t length) -{ - VALUE val = Qnil; - - val = rb_str_new(at, length); - rb_hash_aset(hp->request, global_request_method, val); -} - -void request_uri(puma_parser* hp, const char *at, size_t length) -{ - VALUE val = Qnil; - - VALIDATE_MAX_LENGTH(length, REQUEST_URI); - - val = rb_str_new(at, length); - rb_hash_aset(hp->request, global_request_uri, val); -} - -void fragment(puma_parser* hp, const char *at, size_t length) -{ - VALUE val = Qnil; - - VALIDATE_MAX_LENGTH(length, FRAGMENT); - - val = rb_str_new(at, length); - rb_hash_aset(hp->request, global_fragment, val); -} - -void request_path(puma_parser* hp, const char *at, size_t length) -{ - VALUE val = Qnil; - - VALIDATE_MAX_LENGTH(length, REQUEST_PATH); - - val = rb_str_new(at, length); - rb_hash_aset(hp->request, global_request_path, val); -} - -void query_string(puma_parser* hp, const char *at, size_t length) -{ - VALUE val = Qnil; - - VALIDATE_MAX_LENGTH(length, QUERY_STRING); - - val = rb_str_new(at, length); - rb_hash_aset(hp->request, global_query_string, val); -} - -void server_protocol(puma_parser* hp, const char *at, size_t length) -{ - VALUE val = rb_str_new(at, length); - rb_hash_aset(hp->request, global_server_protocol, val); -} - -/** Finalizes the request header to have a bunch of stuff that's - needed. */ - -void header_done(puma_parser* hp, const char *at, size_t length) -{ - hp->body = rb_str_new(at, length); -} - - -void HttpParser_free(void *data) { - TRACE(); - - if(data) { - xfree(data); - } -} - -void HttpParser_mark(void *ptr) { - puma_parser *hp = ptr; - if(hp->request) rb_gc_mark(hp->request); - if(hp->body) rb_gc_mark(hp->body); -} - -const rb_data_type_t HttpParser_data_type = { - "HttpParser", - { HttpParser_mark, HttpParser_free, 0 }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY, -}; - -VALUE HttpParser_alloc(VALUE klass) -{ - puma_parser *hp = ALLOC_N(puma_parser, 1); - TRACE(); - hp->http_field = http_field; - hp->request_method = request_method; - hp->request_uri = request_uri; - hp->fragment = fragment; - hp->request_path = request_path; - hp->query_string = query_string; - hp->server_protocol = server_protocol; - hp->header_done = header_done; - hp->request = Qnil; - - puma_parser_init(hp); - - return TypedData_Wrap_Struct(klass, &HttpParser_data_type, hp); -} - -/** - * call-seq: - * parser.new -> parser - * - * Creates a new parser. - */ -VALUE HttpParser_init(VALUE self) -{ - puma_parser *http = NULL; - DATA_GET(self, puma_parser, &HttpParser_data_type, http); - puma_parser_init(http); - - return self; -} - - -/** - * call-seq: - * parser.reset -> nil - * - * Resets the parser to it's initial state so that you can reuse it - * rather than making new ones. - */ -VALUE HttpParser_reset(VALUE self) -{ - puma_parser *http = NULL; - DATA_GET(self, puma_parser, &HttpParser_data_type, http); - puma_parser_init(http); - - return Qnil; -} - - -/** - * call-seq: - * parser.finish -> true/false - * - * Finishes a parser early which could put in a "good" or bad state. - * You should call reset after finish it or bad things will happen. - */ -VALUE HttpParser_finish(VALUE self) -{ - puma_parser *http = NULL; - DATA_GET(self, puma_parser, &HttpParser_data_type, http); - puma_parser_finish(http); - - return puma_parser_is_finished(http) ? Qtrue : Qfalse; -} - - -/** - * call-seq: - * parser.execute(req_hash, data, start) -> Integer - * - * Takes a Hash and a String of data, parses the String of data filling in the Hash - * returning an Integer to indicate how much of the data has been read. No matter - * what the return value, you should call HttpParser#finished? and HttpParser#error? - * to figure out if it's done parsing or there was an error. - * - * This function now throws an exception when there is a parsing error. This makes - * the logic for working with the parser much easier. You can still test for an - * error, but now you need to wrap the parser with an exception handling block. - * - * The third argument allows for parsing a partial request and then continuing - * the parsing from that position. It needs all of the original data as well - * so you have to append to the data buffer as you read. - */ -VALUE HttpParser_execute(VALUE self, VALUE req_hash, VALUE data, VALUE start) -{ - puma_parser *http = NULL; - int from = 0; - char *dptr = NULL; - long dlen = 0; - - DATA_GET(self, puma_parser, &HttpParser_data_type, http); - - from = FIX2INT(start); - dptr = rb_extract_chars(data, &dlen); - - if(from >= dlen) { - rb_free_chars(dptr); - rb_raise(eHttpParserError, "%s", "Requested start is after data buffer end."); - } else { - http->request = req_hash; - puma_parser_execute(http, dptr, dlen, from); - - rb_free_chars(dptr); - VALIDATE_MAX_LENGTH(puma_parser_nread(http), HEADER); - - if(puma_parser_has_error(http)) { - rb_raise(eHttpParserError, "%s", "Invalid HTTP format, parsing fails. Are you trying to open an SSL connection to a non-SSL Puma?"); - } else { - return INT2FIX(puma_parser_nread(http)); - } - } -} - - - -/** - * call-seq: - * parser.error? -> true/false - * - * Tells you whether the parser is in an error state. - */ -VALUE HttpParser_has_error(VALUE self) -{ - puma_parser *http = NULL; - DATA_GET(self, puma_parser, &HttpParser_data_type, http); - - return puma_parser_has_error(http) ? Qtrue : Qfalse; -} - - -/** - * call-seq: - * parser.finished? -> true/false - * - * Tells you whether the parser is finished or not and in a good state. - */ -VALUE HttpParser_is_finished(VALUE self) -{ - puma_parser *http = NULL; - DATA_GET(self, puma_parser, &HttpParser_data_type, http); - - return puma_parser_is_finished(http) ? Qtrue : Qfalse; -} - - -/** - * call-seq: - * parser.nread -> Integer - * - * Returns the amount of data processed so far during this processing cycle. It is - * set to 0 on initialize or reset calls and is incremented each time execute is called. - */ -VALUE HttpParser_nread(VALUE self) -{ - puma_parser *http = NULL; - DATA_GET(self, puma_parser, &HttpParser_data_type, http); - - return INT2FIX(http->nread); -} - -/** - * call-seq: - * parser.body -> nil or String - * - * If the request included a body, returns it. - */ -VALUE HttpParser_body(VALUE self) { - puma_parser *http = NULL; - DATA_GET(self, puma_parser, &HttpParser_data_type, http); - - return http->body; -} - -#ifdef HAVE_OPENSSL_BIO_H -void Init_mini_ssl(VALUE mod); -#endif - -void Init_puma_http11(void) -{ -#ifdef HAVE_RB_EXT_RACTOR_SAFE - rb_ext_ractor_safe(true); -#endif - - VALUE mPuma = rb_define_module("Puma"); - VALUE cHttpParser = rb_define_class_under(mPuma, "HttpParser", rb_cObject); - - DEF_GLOBAL(request_method, "REQUEST_METHOD"); - DEF_GLOBAL(request_uri, "REQUEST_URI"); - DEF_GLOBAL(fragment, "FRAGMENT"); - DEF_GLOBAL(query_string, "QUERY_STRING"); - DEF_GLOBAL(server_protocol, "SERVER_PROTOCOL"); - DEF_GLOBAL(request_path, "REQUEST_PATH"); - - eHttpParserError = rb_define_class_under(mPuma, "HttpParserError", rb_eStandardError); - rb_global_variable(&eHttpParserError); - - rb_define_alloc_func(cHttpParser, HttpParser_alloc); - rb_define_method(cHttpParser, "initialize", HttpParser_init, 0); - rb_define_method(cHttpParser, "reset", HttpParser_reset, 0); - rb_define_method(cHttpParser, "finish", HttpParser_finish, 0); - rb_define_method(cHttpParser, "execute", HttpParser_execute, 3); - rb_define_method(cHttpParser, "error?", HttpParser_has_error, 0); - rb_define_method(cHttpParser, "finished?", HttpParser_is_finished, 0); - rb_define_method(cHttpParser, "nread", HttpParser_nread, 0); - rb_define_method(cHttpParser, "body", HttpParser_body, 0); - init_common_fields(); - -#ifdef HAVE_OPENSSL_BIO_H - Init_mini_ssl(mPuma); -#endif -} diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma.rb deleted file mode 100644 index ab2b220..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma.rb +++ /dev/null @@ -1,78 +0,0 @@ -# frozen_string_literal: true - -# Standard libraries -require 'socket' -require 'tempfile' -require 'uri' -require 'stringio' - -require 'thread' - -# use require, see https://github.com/puma/puma/pull/2381 -require 'puma/puma_http11' - -require_relative 'puma/detect' -require_relative 'puma/json_serialization' - -module Puma - # when Puma is loaded via `Puma::CLI`, all files are loaded via - # `require_relative`. The below are for non-standard loading - autoload :Const, "#{__dir__}/puma/const" - autoload :Server, "#{__dir__}/puma/server" - autoload :Launcher, "#{__dir__}/puma/launcher" - autoload :LogWriter, "#{__dir__}/puma/log_writer" - - # at present, MiniSSL::Engine is only defined in extension code (puma_http11), - # not in minissl.rb - HAS_SSL = const_defined?(:MiniSSL, false) && MiniSSL.const_defined?(:Engine, false) - - HAS_UNIX_SOCKET = Object.const_defined?(:UNIXSocket) && !IS_WINDOWS - - if HAS_SSL - require_relative 'puma/minissl' - else - module MiniSSL - # this class is defined so that it exists when Puma is compiled - # without ssl support, as Server and Reactor use it in rescue statements. - class SSLError < StandardError ; end - end - end - - def self.ssl? - HAS_SSL - end - - def self.abstract_unix_socket? - @abstract_unix ||= - if HAS_UNIX_SOCKET - begin - ::UNIXServer.new("\0puma.temp.unix").close - true - rescue ArgumentError # darwin - false - end - else - false - end - end - - # @!attribute [rw] stats_object= - def self.stats_object=(val) - @get_stats = val - end - - # @!attribute [rw] stats_object - def self.stats - Puma::JSONSerialization.generate @get_stats.stats - end - - # @!attribute [r] stats_hash - # @version 5.0.0 - def self.stats_hash - @get_stats.stats - end - - def self.set_thread_name(name) - Thread.current.name = "puma #{name}" - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/app/status.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/app/status.rb deleted file mode 100644 index 53c012e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/app/status.rb +++ /dev/null @@ -1,96 +0,0 @@ -# frozen_string_literal: true -require_relative '../json_serialization' - -module Puma - module App - # Check out {#call}'s source code to see what actions this web application - # can respond to. - class Status - OK_STATUS = '{ "status": "ok" }'.freeze - - # @param launcher [::Puma::Launcher] - # @param token [String, nil] the token used for authentication - # - def initialize(launcher, token = nil) - @launcher = launcher - @auth_token = token - end - - # most commands call methods in `::Puma::Launcher` based on command in - # `env['PATH_INFO']` - def call(env) - unless authenticate(env) - return rack_response(403, 'Invalid auth token', 'text/plain') - end - - # resp_type is processed by following case statement, return - # is a number (status) or a string used as the body of a 200 response - resp_type = - case env['PATH_INFO'][/\/([^\/]+)$/, 1] - when 'stop' - @launcher.stop ; 200 - - when 'halt' - @launcher.halt ; 200 - - when 'restart' - @launcher.restart ; 200 - - when 'phased-restart' - @launcher.phased_restart ? 200 : 404 - - when 'refork' - @launcher.refork ? 200 : 404 - - when 'reload-worker-directory' - @launcher.send(:reload_worker_directory) ? 200 : 404 - - when 'gc' - GC.start ; 200 - - when 'gc-stats' - Puma::JSONSerialization.generate GC.stat - - when 'stats' - Puma::JSONSerialization.generate @launcher.stats - - when 'thread-backtraces' - backtraces = [] - @launcher.thread_status do |name, backtrace| - backtraces << { name: name, backtrace: backtrace } - end - Puma::JSONSerialization.generate backtraces - - else - return rack_response(404, "Unsupported action", 'text/plain') - end - - case resp_type - when String - rack_response 200, resp_type - when 200 - rack_response 200, OK_STATUS - when 404 - str = env['PATH_INFO'][/\/(\S+)/, 1].tr '-', '_' - rack_response 404, "{ \"error\": \"#{str} not available\" }" - end - end - - private - - def authenticate(env) - return true unless @auth_token - env['QUERY_STRING'].to_s.split(/[&;]/).include? "token=#{@auth_token}" - end - - def rack_response(status, body, content_type='application/json') - headers = { - 'content-type' => content_type, - 'content-length' => body.bytesize.to_s - } - - [status, headers, [body]] - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/binder.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/binder.rb deleted file mode 100644 index bbcca5b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/binder.rb +++ /dev/null @@ -1,509 +0,0 @@ -# frozen_string_literal: true - -require 'uri' -require 'socket' - -require_relative 'const' -require_relative 'util' -require_relative 'configuration' - -module Puma - - if HAS_SSL - require_relative 'minissl' - require_relative 'minissl/context_builder' - end - - class Binder - include Puma::Const - - RACK_VERSION = [1,6].freeze - - def initialize(log_writer, conf = Configuration.new, env: ENV) - @log_writer = log_writer - @conf = conf - @listeners = [] - @inherited_fds = {} - @activated_sockets = {} - @unix_paths = [] - @env = env - - @proto_env = { - "rack.version".freeze => RACK_VERSION, - "rack.errors".freeze => log_writer.stderr, - "rack.multithread".freeze => conf.options[:max_threads] > 1, - "rack.multiprocess".freeze => conf.options[:workers] >= 1, - "rack.run_once".freeze => false, - RACK_URL_SCHEME => conf.options[:rack_url_scheme], - "SCRIPT_NAME".freeze => env['SCRIPT_NAME'] || "", - - # I'd like to set a default CONTENT_TYPE here but some things - # depend on their not being a default set and inferring - # it from the content. And so if i set it here, it won't - # infer properly. - - "QUERY_STRING".freeze => "", - SERVER_SOFTWARE => PUMA_SERVER_STRING, - GATEWAY_INTERFACE => CGI_VER - } - - @envs = {} - @ios = [] - end - - attr_reader :ios - - # @version 5.0.0 - attr_reader :activated_sockets, :envs, :inherited_fds, :listeners, :proto_env, :unix_paths - - # @version 5.0.0 - attr_writer :ios, :listeners - - def env(sock) - @envs.fetch(sock, @proto_env) - end - - def close - @ios.each { |i| i.close } - end - - # @!attribute [r] connected_ports - # @version 5.0.0 - def connected_ports - t = ios.map { |io| io.addr[1] }; t.uniq!; t - end - - # @version 5.0.0 - def create_inherited_fds(env_hash) - env_hash.select {|k,v| k =~ /PUMA_INHERIT_\d+/}.each do |_k, v| - fd, url = v.split(":", 2) - @inherited_fds[url] = fd.to_i - end.keys # pass keys back for removal - end - - # systemd socket activation. - # LISTEN_FDS = number of listening sockets. e.g. 2 means accept on 2 sockets w/descriptors 3 and 4. - # LISTEN_PID = PID of the service process, aka us - # @see https://www.freedesktop.org/software/systemd/man/systemd-socket-activate.html - # @version 5.0.0 - # - def create_activated_fds(env_hash) - @log_writer.debug "ENV['LISTEN_FDS'] #{@env['LISTEN_FDS'].inspect} env_hash['LISTEN_PID'] #{env_hash['LISTEN_PID'].inspect}" - return [] unless env_hash['LISTEN_FDS'] && env_hash['LISTEN_PID'].to_i == $$ - env_hash['LISTEN_FDS'].to_i.times do |index| - sock = TCPServer.for_fd(socket_activation_fd(index)) - key = begin # Try to parse as a path - [:unix, Socket.unpack_sockaddr_un(sock.getsockname)] - rescue ArgumentError # Try to parse as a port/ip - port, addr = Socket.unpack_sockaddr_in(sock.getsockname) - addr = "[#{addr}]" if addr&.include? ':' - [:tcp, addr, port] - end - @activated_sockets[key] = sock - @log_writer.debug "Registered #{key.join ':'} for activation from LISTEN_FDS" - end - ["LISTEN_FDS", "LISTEN_PID"] # Signal to remove these keys from ENV - end - - # Synthesize binds from systemd socket activation - # - # When systemd socket activation is enabled, it can be tedious to keep the - # binds in sync. This method can synthesize any binds based on the received - # activated sockets. Any existing matching binds will be respected. - # - # When only_matching is true in, all binds that do not match an activated - # socket is removed in place. - # - # It's a noop if no activated sockets were received. - def synthesize_binds_from_activated_fs(binds, only_matching) - return binds unless activated_sockets.any? - - activated_binds = [] - - activated_sockets.keys.each do |proto, addr, port| - if port - tcp_url = "#{proto}://#{addr}:#{port}" - ssl_url = "ssl://#{addr}:#{port}" - ssl_url_prefix = "#{ssl_url}?" - - existing = binds.find { |bind| bind == tcp_url || bind == ssl_url || bind.start_with?(ssl_url_prefix) } - - activated_binds << (existing || tcp_url) - else - # TODO: can there be a SSL bind without a port? - activated_binds << "#{proto}://#{addr}" - end - end - - if only_matching - activated_binds - else - binds | activated_binds - end - end - - def before_parse(&block) - @before_parse ||= [] - @before_parse << block if block - @before_parse - end - - def parse(binds, log_writer = nil, log_msg = 'Listening') - before_parse.each(&:call) - log_writer ||= @log_writer - binds.each do |str| - uri = URI.parse str - case uri.scheme - when "tcp" - if fd = @inherited_fds.delete(str) - io = inherit_tcp_listener uri.host, uri.port, fd - log_writer.log "* Inherited #{str}" - elsif sock = @activated_sockets.delete([ :tcp, uri.host, uri.port ]) - io = inherit_tcp_listener uri.host, uri.port, sock - log_writer.log "* Activated #{str}" - else - ios_len = @ios.length - params = Util.parse_query uri.query - - low_latency = params.key?('low_latency') && params['low_latency'] != 'false' - backlog = params.fetch('https://github.com/backlog', 1024).to_i - - io = add_tcp_listener uri.host, uri.port, low_latency, backlog - - @ios[ios_len..-1].each do |i| - addr = loc_addr_str i - log_writer.log "* #{log_msg} on http://#{addr}" - end - end - - @listeners << [str, io] if io - when "unix" - path = "#{uri.host}#{uri.path}".gsub("%20", " ") - abstract = false - if str.start_with? 'unix://@' - raise "OS does not support abstract UNIXSockets" unless Puma.abstract_unix_socket? - abstract = true - path = "@#{path}" - end - - if fd = @inherited_fds.delete(str) - @unix_paths << path unless abstract || File.exist?(path) - io = inherit_unix_listener path, fd - log_writer.log "* Inherited #{str}" - elsif sock = @activated_sockets.delete([ :unix, path ]) || - !abstract && @activated_sockets.delete([ :unix, File.realdirpath(path) ]) - @unix_paths << path unless abstract || File.exist?(path) - io = inherit_unix_listener path, sock - log_writer.log "* Activated #{str}" - else - umask = nil - mode = nil - backlog = 1024 - - if uri.query - params = Util.parse_query uri.query - if u = params['umask'] - # Use Integer() to respect the 0 prefix as octal - umask = Integer(u) - end - - if u = params['mode'] - mode = Integer('0'+u) - end - - if u = params['backlog'] - backlog = Integer(u) - end - end - - @unix_paths << path unless abstract || File.exist?(path) - io = add_unix_listener path, umask, mode, backlog - log_writer.log "* #{log_msg} on #{str}" - end - - @listeners << [str, io] - when "ssl" - cert_key = %w[cert key] - - raise "Puma compiled without SSL support" unless HAS_SSL - - params = Util.parse_query uri.query - - # If key and certs are not defined and localhost gem is required. - # localhost gem will be used for self signed - # Load localhost authority if not loaded. - # Ruby 3 `values_at` accepts an array, earlier do not - if params.values_at(*cert_key).all? { |v| v.to_s.empty? } - ctx = localhost_authority && localhost_authority_context - end - - ctx ||= - begin - # Extract cert_pem and key_pem from options[:store] if present - cert_key.each do |v| - if params[v]&.start_with?('store:') - index = Integer(params.delete(v).split('store:').last) - params["#{v}_pem"] = @conf.options[:store][index] - end - end - MiniSSL::ContextBuilder.new(params, @log_writer).context - end - - if fd = @inherited_fds.delete(str) - log_writer.log "* Inherited #{str}" - io = inherit_ssl_listener fd, ctx - elsif sock = @activated_sockets.delete([ :tcp, uri.host, uri.port ]) - io = inherit_ssl_listener sock, ctx - log_writer.log "* Activated #{str}" - else - ios_len = @ios.length - backlog = params.fetch('https://github.com/backlog', 1024).to_i - low_latency = params['low_latency'] != 'false' - io = add_ssl_listener uri.host, uri.port, ctx, low_latency, backlog - - @ios[ios_len..-1].each do |i| - addr = loc_addr_str i - log_writer.log "* #{log_msg} on ssl://#{addr}?#{uri.query}" - end - end - - @listeners << [str, io] if io - else - log_writer.error "Invalid URI: #{str}" - end - end - - # If we inherited fds but didn't use them (because of a - # configuration change), then be sure to close them. - @inherited_fds.each do |str, fd| - log_writer.log "* Closing unused inherited connection: #{str}" - - begin - IO.for_fd(fd).close - rescue SystemCallError - end - - # We have to unlink a unix socket path that's not being used - uri = URI.parse str - if uri.scheme == "unix" - path = "#{uri.host}#{uri.path}" - File.unlink path - end - end - - # Also close any unused activated sockets - unless @activated_sockets.empty? - fds = @ios.map(&:to_i) - @activated_sockets.each do |key, sock| - next if fds.include? sock.to_i - log_writer.log "* Closing unused activated socket: #{key.first}://#{key[1..-1].join ':'}" - begin - sock.close - rescue SystemCallError - end - # We have to unlink a unix socket path that's not being used - File.unlink key[1] if key.first == :unix - end - end - end - - def localhost_authority - @localhost_authority ||= Localhost::Authority.fetch if defined?(Localhost::Authority) && !Puma::IS_JRUBY - end - - def localhost_authority_context - return unless localhost_authority - - key_path, crt_path = if [:key_path, :certificate_path].all? { |m| localhost_authority.respond_to?(m) } - [localhost_authority.key_path, localhost_authority.certificate_path] - else - local_certificates_path = File.expand_path("~/.localhost") - [File.join(local_certificates_path, "localhost.key"), File.join(local_certificates_path, "localhost.crt")] - end - MiniSSL::ContextBuilder.new({ "key" => key_path, "cert" => crt_path }, @log_writer).context - end - - # Tell the server to listen on host +host+, port +port+. - # If +optimize_for_latency+ is true (the default) then clients connecting - # will be optimized for latency over throughput. - # - # +backlog+ indicates how many unaccepted connections the kernel should - # allow to accumulate before returning connection refused. - # - def add_tcp_listener(host, port, optimize_for_latency=true, backlog=1024) - if host == "localhost" - loopback_addresses.each do |addr| - add_tcp_listener addr, port, optimize_for_latency, backlog - end - return - end - - host = host[1..-2] if host&.start_with? '[' - tcp_server = TCPServer.new(host, port) - - if optimize_for_latency - tcp_server.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) - end - tcp_server.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR, true) - tcp_server.listen backlog - - @ios << tcp_server - tcp_server - end - - def inherit_tcp_listener(host, port, fd) - s = fd.kind_of?(::TCPServer) ? fd : ::TCPServer.for_fd(fd) - - @ios << s - s - end - - def add_ssl_listener(host, port, ctx, - optimize_for_latency=true, backlog=1024) - - raise "Puma compiled without SSL support" unless HAS_SSL - # Puma will try to use local authority context if context is supplied nil - ctx ||= localhost_authority_context - - if host == "localhost" - loopback_addresses.each do |addr| - add_ssl_listener addr, port, ctx, optimize_for_latency, backlog - end - return - end - - host = host[1..-2] if host&.start_with? '[' - s = TCPServer.new(host, port) - if optimize_for_latency - s.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) - end - s.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR, true) - s.listen backlog - - ssl = MiniSSL::Server.new s, ctx - env = @proto_env.dup - env[HTTPS_KEY] = HTTPS - @envs[ssl] = env - - @ios << ssl - s - end - - def inherit_ssl_listener(fd, ctx) - raise "Puma compiled without SSL support" unless HAS_SSL - # Puma will try to use local authority context if context is supplied nil - ctx ||= localhost_authority_context - - s = fd.kind_of?(::TCPServer) ? fd : ::TCPServer.for_fd(fd) - - ssl = MiniSSL::Server.new(s, ctx) - - env = @proto_env.dup - env[HTTPS_KEY] = HTTPS - @envs[ssl] = env - - @ios << ssl - - s - end - - # Tell the server to listen on +path+ as a UNIX domain socket. - # - def add_unix_listener(path, umask=nil, mode=nil, backlog=1024) - # Let anyone connect by default - umask ||= 0 - - begin - old_mask = File.umask(umask) - - if File.exist? path - begin - old = UNIXSocket.new path - rescue SystemCallError, IOError - File.unlink path - else - old.close - raise "There is already a server bound to: #{path}" - end - end - s = UNIXServer.new path.sub(/\A@/, "\0") # check for abstract UNIXSocket - s.listen backlog - @ios << s - ensure - File.umask old_mask - end - - if mode - File.chmod mode, path - end - - env = @proto_env.dup - env[REMOTE_ADDR] = "127.0.0.1" - @envs[s] = env - - s - end - - def inherit_unix_listener(path, fd) - s = fd.kind_of?(::TCPServer) ? fd : ::UNIXServer.for_fd(fd) - - @ios << s - - env = @proto_env.dup - env[REMOTE_ADDR] = "127.0.0.1" - @envs[s] = env - - s - end - - def close_listeners - @listeners.each do |l, io| - begin - io.close unless io.closed? - uri = URI.parse l - next unless uri.scheme == 'unix' - unix_path = "#{uri.host}#{uri.path}" - File.unlink unix_path if @unix_paths.include?(unix_path) && File.exist?(unix_path) - rescue Errno::EBADF - end - end - end - - def redirects_for_restart - redirects = @listeners.map { |a| [a[1].to_i, a[1].to_i] }.to_h - redirects[:close_others] = true - redirects - end - - # @version 5.0.0 - def redirects_for_restart_env - @listeners.each_with_object({}).with_index do |(listen, memo), i| - memo["PUMA_INHERIT_#{i}"] = "#{listen[1].to_i}:#{listen[0]}" - end - end - - private - - # @!attribute [r] loopback_addresses - def loopback_addresses - t = Socket.ip_address_list.select do |addrinfo| - addrinfo.ipv6_loopback? || addrinfo.ipv4_loopback? - end - t.map! { |addrinfo| addrinfo.ip_address }; t.uniq!; t - end - - def loc_addr_str(io) - loc_addr = io.to_io.local_address - if loc_addr.ipv6? - "[#{loc_addr.ip_unpack[0]}]:#{loc_addr.ip_unpack[1]}" - else - loc_addr.ip_unpack.join(':') - end - end - - # @version 5.0.0 - def socket_activation_fd(int) - int + 3 # 3 is the magic number you add to follow the SA protocol - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cli.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cli.rb deleted file mode 100644 index 8f0c7a8..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cli.rb +++ /dev/null @@ -1,247 +0,0 @@ -# frozen_string_literal: true - -require 'optparse' -require 'uri' - -require_relative '../puma' -require_relative 'configuration' -require_relative 'launcher' -require_relative 'const' -require_relative 'log_writer' - -module Puma - class << self - # The CLI exports a Puma::Configuration instance here to allow - # apps to pick it up. An app must load this object conditionally - # because it is not set if the app is launched via any mechanism - # other than the CLI class. - attr_accessor :cli_config - end - - # Handles invoke a Puma::Server in a command line style. - # - class CLI - # Create a new CLI object using +argv+ as the command line - # arguments. - # - def initialize(argv, log_writer = LogWriter.stdio, events = Events.new, env: ENV) - @debug = false - @argv = argv.dup - @log_writer = log_writer - @events = events - - @conf = nil - - @stdout = nil - @stderr = nil - @append = false - - @control_url = nil - @control_options = {} - - setup_options env - - begin - @parser.parse! @argv - - if file = @argv.shift - @conf.configure do |user_config, file_config| - file_config.rackup file - end - end - rescue UnsupportedOption - exit 1 - end - - @conf.configure do |user_config, file_config| - if @stdout || @stderr - user_config.stdout_redirect @stdout, @stderr, @append - end - - if @control_url - user_config.activate_control_app @control_url, @control_options - end - end - - @launcher = Puma::Launcher.new(@conf, env: ENV, log_writer: @log_writer, events: @events, argv: argv) - end - - attr_reader :launcher - - # Parse the options, load the rackup, start the server and wait - # for it to finish. - # - def run - @launcher.run - end - - private - def unsupported(str) - @log_writer.error(str) - raise UnsupportedOption - end - - def configure_control_url(https://github.com/command_line_arg) - if command_line_arg - @control_url = command_line_arg - elsif Puma.jruby? - unsupported "No default url available on JRuby" - end - end - - # Build the OptionParser object to handle the available options. - # - - def setup_options(env = ENV) - @conf = Configuration.new({}, {events: @events}, env) do |user_config, file_config| - @parser = OptionParser.new do |o| - o.on "-b", "--bind URI", "URI to bind to (tcp://, unix://, ssl://)" do |arg| - user_config.bind arg - end - - o.on "--bind-to-activated-sockets [only]", "Bind to all activated sockets" do |arg| - user_config.bind_to_activated_sockets(arg || true) - end - - o.on "-C", "--config PATH", "Load PATH as a config file" do |arg| - file_config.load arg - end - - # Identical to supplying --config "-", but more semantic - o.on "--no-config", "Prevent Puma from searching for a config file" do |arg| - file_config.load "-" - end - - o.on "--control-url URL", "The bind url to use for the control server. Use 'auto' to use temp unix server" do |arg| - configure_control_url(https://github.com/arg) - end - - o.on "--control-token TOKEN", - "The token to use as authentication for the control server" do |arg| - @control_options[:auth_token] = arg - end - - o.on "--debug", "Log lowlevel debugging information" do - user_config.debug - end - - o.on "--dir DIR", "Change to DIR before starting" do |d| - user_config.directory d - end - - o.on "-e", "--environment ENVIRONMENT", - "The environment to run the Rack app on (default development)" do |arg| - user_config.environment arg - end - - o.on "-f", "--fork-worker=[REQUESTS]", OptionParser::DecimalInteger, - "Fork new workers from existing worker. Cluster mode only", - "Auto-refork after REQUESTS (default 1000)" do |*args| - user_config.fork_worker(*args.compact) - end - - o.on "-I", "--include PATH", "Specify $LOAD_PATH directories" do |arg| - $LOAD_PATH.unshift(*arg.split(':')) - end - - o.on "--idle-timeout SECONDS", "Number of seconds until the next request before automatic shutdown" do |arg| - user_config.idle_timeout arg - end - - o.on "-p", "--port PORT", "Define the TCP port to bind to", - "Use -b for more advanced options" do |arg| - user_config.bind "tcp://#{Configuration::DEFAULTS[:tcp_host]}:#{arg}" - end - - o.on "--pidfile PATH", "Use PATH as a pidfile" do |arg| - user_config.pidfile arg - end - - o.on "--plugin PLUGIN", "Load the given PLUGIN. Can be used multiple times to load multiple plugins." do |arg| - user_config.plugin arg - end - - o.on "--preload", "Preload the app. Cluster mode only" do - user_config.preload_app! - end - - o.on "--prune-bundler", "Prune out the bundler env if possible" do - user_config.prune_bundler - end - - o.on "--extra-runtime-dependencies GEM1,GEM2", "Defines any extra needed gems when using --prune-bundler" do |arg| - user_config.extra_runtime_dependencies arg.split(',') - end - - o.on "-q", "--quiet", "Do not log requests internally (default true)" do - user_config.quiet - end - - o.on "-v", "--log-requests", "Log requests as they occur" do - user_config.log_requests - end - - o.on "-R", "--restart-cmd CMD", - "The puma command to run during a hot restart", - "Default: inferred" do |cmd| - user_config.restart_command cmd - end - - o.on "-s", "--silent", "Do not log prompt messages other than errors" do - @log_writer = LogWriter.new(NullIO.new, $stderr) - end - - o.on "-S", "--state PATH", "Where to store the state details" do |arg| - user_config.state_path arg - end - - o.on '-t', '--threads INT', "min:max threads to use (default 0:16)" do |arg| - min, max = arg.split(":") - if max - user_config.threads min, max - else - user_config.threads min, min - end - end - - o.on "--early-hints", "Enable early hints support" do - user_config.early_hints - end - - o.on "-V", "--version", "Print the version information" do - puts "puma version #{Puma::Const::VERSION}" - exit 0 - end - - o.on "-w", "--workers COUNT", - "Activate cluster mode: How many worker processes to create" do |arg| - user_config.workers arg - end - - o.on "--tag NAME", "Additional text to display in process listing" do |arg| - user_config.tag arg - end - - o.on "--redirect-stdout FILE", "Redirect STDOUT to a specific file" do |arg| - @stdout = arg.to_s - end - - o.on "--redirect-stderr FILE", "Redirect STDERR to a specific file" do |arg| - @stderr = arg.to_s - end - - o.on "--[no-]redirect-append", "Append to redirected files" do |val| - @append = val - end - - o.banner = "puma " - - o.on_tail "-h", "--help", "Show help" do - $stdout.puts o - exit 0 - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/client.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/client.rb deleted file mode 100644 index 34bf857..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/client.rb +++ /dev/null @@ -1,720 +0,0 @@ -# frozen_string_literal: true - -class IO - # We need to use this for a jruby work around on both 1.8 and 1.9. - # So this either creates the constant (on 1.8), or harmlessly - # reopens it (on 1.9). - module WaitReadable - end -end - -require_relative 'detect' -require_relative 'io_buffer' -require 'tempfile' - -if Puma::IS_JRUBY - # We have to work around some OpenSSL buffer/io-readiness bugs - # so we pull it in regardless of if the user is binding - # to an SSL socket - require 'openssl' -end - -module Puma - - class ConnectionError < RuntimeError; end - - class HttpParserError501 < IOError; end - - #———————————————————————— DO NOT USE — this class is for internal use only ——— - - - # An instance of this class represents a unique request from a client. - # For example, this could be a web request from a browser or from CURL. - # - # An instance of `Puma::Client` can be used as if it were an IO object - # by the reactor. The reactor is expected to call `#to_io` - # on any non-IO objects it polls. For example, nio4r internally calls - # `IO::try_convert` (which may call `#to_io`) when a new socket is - # registered. - # - # Instances of this class are responsible for knowing if - # the header and body are fully buffered via the `try_to_finish` method. - # They can be used to "time out" a response via the `timeout_at` reader. - # - class Client # :nodoc: - - # this tests all values but the last, which must be chunked - ALLOWED_TRANSFER_ENCODING = %w[compress deflate gzip].freeze - - # chunked body validation - CHUNK_SIZE_INVALID = /[^\h]/.freeze - CHUNK_VALID_ENDING = Const::LINE_END - CHUNK_VALID_ENDING_SIZE = CHUNK_VALID_ENDING.bytesize - - # The maximum number of bytes we'll buffer looking for a valid - # chunk header. - MAX_CHUNK_HEADER_SIZE = 4096 - - # The maximum amount of excess data the client sends - # using chunk size extensions before we abort the connection. - MAX_CHUNK_EXCESS = 16 * 1024 - - # Content-Length header value validation - CONTENT_LENGTH_VALUE_INVALID = /[^\d]/.freeze - - TE_ERR_MSG = 'Invalid Transfer-Encoding' - - # The object used for a request with no body. All requests with - # no body share this one object since it has no state. - EmptyBody = NullIO.new - - include Puma::Const - - def initialize(io, env=nil) - @io = io - @to_io = io.to_io - @io_buffer = IOBuffer.new - @proto_env = env - @env = env&.dup - - @parser = HttpParser.new - @parsed_bytes = 0 - @read_header = true - @read_proxy = false - @ready = false - - @body = nil - @body_read_start = nil - @buffer = nil - @tempfile = nil - - @timeout_at = nil - - @requests_served = 0 - @hijacked = false - - @http_content_length_limit = nil - @http_content_length_limit_exceeded = false - - @peerip = nil - @peer_family = nil - @listener = nil - @remote_addr_header = nil - @expect_proxy_proto = false - - @body_remain = 0 - - @in_last_chunk = false - - # need unfrozen ASCII-8BIT, +'' is UTF-8 - @read_buffer = String.new # rubocop: disable Performance/UnfreezeString - end - - attr_reader :env, :to_io, :body, :io, :timeout_at, :ready, :hijacked, - :tempfile, :io_buffer, :http_content_length_limit_exceeded - - attr_writer :peerip, :http_content_length_limit - - attr_accessor :remote_addr_header, :listener - - # Remove in Puma 7? - def closed? - @to_io.closed? - end - - # Test to see if io meets a bare minimum of functioning, @to_io needs to be - # used for MiniSSL::Socket - def io_ok? - @to_io.is_a?(::BasicSocket) && !closed? - end - - # @!attribute [r] inspect - def inspect - "#" - end - - # For the hijack protocol (allows us to just put the Client object - # into the env) - def call - @hijacked = true - env[HIJACK_IO] ||= @io - end - - # @!attribute [r] in_data_phase - def in_data_phase - !(@read_header || @read_proxy) - end - - def set_timeout(val) - @timeout_at = Process.clock_gettime(Process::CLOCK_MONOTONIC) + val - end - - # Number of seconds until the timeout elapses. - def timeout - [@timeout_at - Process.clock_gettime(Process::CLOCK_MONOTONIC), 0].max - end - - def reset(fast_check=true) - @parser.reset - @io_buffer.reset - @read_header = true - @read_proxy = !!@expect_proxy_proto - @env = @proto_env.dup - @parsed_bytes = 0 - @ready = false - @body_remain = 0 - @peerip = nil if @remote_addr_header - @in_last_chunk = false - @http_content_length_limit_exceeded = false - - if @buffer - return false unless try_to_parse_proxy_protocol - - @parsed_bytes = parser_execute - - if @parser.finished? - return setup_body - elsif @parsed_bytes >= MAX_HEADER - raise HttpParserError, - "HEADER is longer than allowed, aborting client early." - end - - return false - else - begin - if fast_check && @to_io.wait_readable(FAST_TRACK_KA_TIMEOUT) - return try_to_finish - end - rescue IOError - # swallow it - end - end - end - - def close - tempfile_close - begin - @io.close - rescue IOError, Errno::EBADF - Puma::Util.purge_interrupt_queue - end - end - - def tempfile_close - tf_path = @tempfile&.path - @tempfile&.close - File.unlink(tf_path) if tf_path - @tempfile = nil - @body = nil - rescue Errno::ENOENT, IOError - end - - # If necessary, read the PROXY protocol from the buffer. Returns - # false if more data is needed. - def try_to_parse_proxy_protocol - if @read_proxy - if @expect_proxy_proto == :v1 - if @buffer.include? "\r\n" - if md = PROXY_PROTOCOL_V1_REGEX.match(@buffer) - if md[1] - @peerip = md[1].split(" ")[0] - end - @buffer = md.post_match - end - # if the buffer has a \r\n but doesn't have a PROXY protocol - # request, this is just HTTP from a non-PROXY client; move on - @read_proxy = false - return @buffer.size > 0 - else - return false - end - end - end - true - end - - def try_to_finish - if env[CONTENT_LENGTH] && above_http_content_limit(env[CONTENT_LENGTH].to_i) - @http_content_length_limit_exceeded = true - end - - if @http_content_length_limit_exceeded - @buffer = nil - @body = EmptyBody - set_ready - return true - end - - return read_body if in_data_phase - - data = nil - begin - data = @io.read_nonblock(CHUNK_SIZE) - rescue IO::WaitReadable - return false - rescue EOFError - # Swallow error, don't log - rescue SystemCallError, IOError - raise ConnectionError, "Connection error detected during read" - end - - # No data means a closed socket - unless data - @buffer = nil - set_ready - raise EOFError - end - - if @buffer - @buffer << data - else - @buffer = data - end - - return false unless try_to_parse_proxy_protocol - - @parsed_bytes = parser_execute - - if @parser.finished? && above_http_content_limit(@parser.body.bytesize) - @http_content_length_limit_exceeded = true - end - - if @parser.finished? - setup_body - elsif @parsed_bytes >= MAX_HEADER - raise HttpParserError, - "HEADER is longer than allowed, aborting client early." - else - false - end - end - - def eagerly_finish - return true if @ready - return false unless @to_io.wait_readable(0) - try_to_finish - end - - def finish(timeout) - return if @ready - @to_io.wait_readable(timeout) || timeout! until try_to_finish - end - - # Wraps `@parser.execute` and adds meaningful error messages - # @return [Integer] bytes of buffer read by parser - # - def parser_execute - @parser.execute(@env, @buffer, @parsed_bytes) - rescue => e - @env[HTTP_CONNECTION] = 'close' - raise e unless HttpParserError === e && e.message.include?('non-SSL') - - req, _ = @buffer.split "\r\n\r\n" - request_line, headers = req.split "\r\n", 2 - - # below checks for request issues and changes error message accordingly - if !@env.key? REQUEST_METHOD - if request_line.count(' ') != 2 - # maybe this is an SSL connection ? - raise e - else - method = request_line[/\A[^ ]+/] - raise e, "Invalid HTTP format, parsing fails. Bad method #{method}" - end - elsif !@env.key? REQUEST_PATH - path = request_line[/\A[^ ]+ +([^ ?\r\n]+)/, 1] - raise e, "Invalid HTTP format, parsing fails. Bad path #{path}" - elsif request_line.match?(/\A[^ ]+ +[^ ?\r\n]+\?/) && !@env.key?(QUERY_STRING) - query = request_line[/\A[^ ]+ +[^? ]+\?([^ ]+)/, 1] - raise e, "Invalid HTTP format, parsing fails. Bad query #{query}" - elsif !@env.key? SERVER_PROTOCOL - # protocol is bad - text = request_line[/[^ ]*\z/] - raise HttpParserError, "Invalid HTTP format, parsing fails. Bad protocol #{text}" - elsif !headers.empty? - # headers are bad - hdrs = headers.split("\r\n").map { |h| h.gsub "\n", '\n'}.join "\n" - raise HttpParserError, "Invalid HTTP format, parsing fails. Bad headers\n#{hdrs}" - end - end - - def timeout! - write_error(408) if in_data_phase - raise ConnectionError - end - - def write_error(status_code) - begin - @io << ERROR_RESPONSE[status_code] - rescue StandardError - end - end - - def peerip - return @peerip if @peerip - - if @remote_addr_header - hdr = (@env[@remote_addr_header] || @io.peeraddr.last).split(/[\s,]/).first - @peerip = hdr - return hdr - end - - @peerip ||= @io.peeraddr.last - end - - def peer_family - return @peer_family if @peer_family - - @peer_family ||= begin - @io.local_address.afamily - rescue - Socket::AF_INET - end - end - - # Returns true if the persistent connection can be closed immediately - # without waiting for the configured idle/shutdown timeout. - # @version 5.0.0 - # - def can_close? - # Allow connection to close if we're not in the middle of parsing a request. - @parsed_bytes == 0 - end - - def expect_proxy_proto=(val) - if val - if @read_header - @read_proxy = true - end - else - @read_proxy = false - end - @expect_proxy_proto = val - end - - private - - def setup_body - @body_read_start = Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond) - - if @env[HTTP_EXPECT] == CONTINUE - # TODO allow a hook here to check the headers before - # going forward - @io << HTTP_11_100 - @io.flush - end - - @read_header = false - - body = @parser.body - - te = @env[TRANSFER_ENCODING2] - if te - te_lwr = te.downcase - if te.include? ',' - te_ary = te_lwr.split ',' - te_count = te_ary.count CHUNKED - te_valid = te_ary[0..-2].all? { |e| ALLOWED_TRANSFER_ENCODING.include? e } - if te_ary.last == CHUNKED && te_count == 1 && te_valid - @env.delete TRANSFER_ENCODING2 - return setup_chunked_body body - elsif te_count >= 1 - raise HttpParserError , "#{TE_ERR_MSG}, multiple chunked: '#{te}'" - elsif !te_valid - raise HttpParserError501, "#{TE_ERR_MSG}, unknown value: '#{te}'" - end - elsif te_lwr == CHUNKED - @env.delete TRANSFER_ENCODING2 - return setup_chunked_body body - elsif ALLOWED_TRANSFER_ENCODING.include? te_lwr - raise HttpParserError , "#{TE_ERR_MSG}, single value must be chunked: '#{te}'" - else - raise HttpParserError501 , "#{TE_ERR_MSG}, unknown value: '#{te}'" - end - end - - @chunked_body = false - - cl = @env[CONTENT_LENGTH] - - if cl - # cannot contain characters that are not \d, or be empty - if CONTENT_LENGTH_VALUE_INVALID.match?(cl) || cl.empty? - raise HttpParserError, "Invalid Content-Length: #{cl.inspect}" - end - else - @buffer = body.empty? ? nil : body - @body = EmptyBody - set_ready - return true - end - - content_length = cl.to_i - - remain = content_length - body.bytesize - - if remain <= 0 - # Part of the body is a pipelined request OR garbage. We'll deal with that later. - if content_length == 0 - @body = EmptyBody - if body.empty? - @buffer = nil - else - @buffer = body - end - elsif remain == 0 - @body = StringIO.new body - @buffer = nil - else - @body = StringIO.new(body[0,content_length]) - @buffer = body[content_length..-1] - end - set_ready - return true - end - - if remain > MAX_BODY - @body = Tempfile.create(Const::PUMA_TMP_BASE) - File.unlink @body.path unless IS_WINDOWS - @body.binmode - @tempfile = @body - else - # The body[0,0] trick is to get an empty string in the same - # encoding as body. - @body = StringIO.new body[0,0] - end - - @body.write body - - @body_remain = remain - - false - end - - def read_body - if @chunked_body - return read_chunked_body - end - - # Read an odd sized chunk so we can read even sized ones - # after this - remain = @body_remain - - if remain > CHUNK_SIZE - want = CHUNK_SIZE - else - want = remain - end - - begin - chunk = @io.read_nonblock(want, @read_buffer) - rescue IO::WaitReadable - return false - rescue SystemCallError, IOError - raise ConnectionError, "Connection error detected during read" - end - - # No chunk means a closed socket - unless chunk - @body.close - @buffer = nil - set_ready - raise EOFError - end - - remain -= @body.write(chunk) - - if remain <= 0 - @body.rewind - @buffer = nil - set_ready - return true - end - - @body_remain = remain - - false - end - - def read_chunked_body - while true - begin - chunk = @io.read_nonblock(CHUNK_SIZE, @read_buffer) - rescue IO::WaitReadable - return false - rescue SystemCallError, IOError - raise ConnectionError, "Connection error detected during read" - end - - # No chunk means a closed socket - unless chunk - @body.close - @buffer = nil - set_ready - raise EOFError - end - - if decode_chunk(chunk) - @env[CONTENT_LENGTH] = @chunked_content_length.to_s - return true - end - end - end - - def setup_chunked_body(body) - @chunked_body = true - @partial_part_left = 0 - @prev_chunk = "" - @excess_cr = 0 - - @body = Tempfile.create(Const::PUMA_TMP_BASE) - File.unlink @body.path unless IS_WINDOWS - @body.binmode - @tempfile = @body - @chunked_content_length = 0 - - if decode_chunk(body) - @env[CONTENT_LENGTH] = @chunked_content_length.to_s - return true - end - end - - # @version 5.0.0 - def write_chunk(str) - @chunked_content_length += @body.write(str) - end - - def decode_chunk(chunk) - if @partial_part_left > 0 - if @partial_part_left <= chunk.size - if @partial_part_left > 2 - write_chunk(chunk[0..(@partial_part_left-3)]) # skip the \r\n - end - chunk = chunk[@partial_part_left..-1] - @partial_part_left = 0 - else - if @partial_part_left > 2 - if @partial_part_left == chunk.size + 1 - # Don't include the last \r - write_chunk(chunk[0..(@partial_part_left-3)]) - else - # don't include the last \r\n - write_chunk(chunk) - end - end - @partial_part_left -= chunk.size - return false - end - end - - if @prev_chunk.empty? - io = StringIO.new(chunk) - else - io = StringIO.new(@prev_chunk+chunk) - @prev_chunk = "" - end - - while !io.eof? - line = io.gets - if line.end_with?(CHUNK_VALID_ENDING) - # Puma doesn't process chunk extensions, but should parse if they're - # present, which is the reason for the semicolon regex - chunk_hex = line.strip[/\A[^;]+/] - if CHUNK_SIZE_INVALID.match? chunk_hex - raise HttpParserError, "Invalid chunk size: '#{chunk_hex}'" - end - len = chunk_hex.to_i(16) - if len == 0 - @in_last_chunk = true - @body.rewind - rest = io.read - if rest.bytesize < CHUNK_VALID_ENDING_SIZE - @buffer = nil - @partial_part_left = CHUNK_VALID_ENDING_SIZE - rest.bytesize - return false - else - # if the next character is a CRLF, set buffer to everything after that CRLF - start_of_rest = if rest.start_with?(CHUNK_VALID_ENDING) - CHUNK_VALID_ENDING_SIZE - else # we have started a trailer section, which we do not support. skip it! - rest.index(CHUNK_VALID_ENDING*2) + CHUNK_VALID_ENDING_SIZE*2 - end - - @buffer = rest[start_of_rest..-1] - @buffer = nil if @buffer.empty? - set_ready - return true - end - end - - # Track the excess as a function of the size of the - # header vs the size of the actual data. Excess can - # go negative (and is expected to) when the body is - # significant. - # The additional of chunk_hex.size and 2 compensates - # for a client sending 1 byte in a chunked body over - # a long period of time, making sure that that client - # isn't accidentally eventually punished. - @excess_cr += (line.size - len - chunk_hex.size - 2) - - if @excess_cr >= MAX_CHUNK_EXCESS - raise HttpParserError, "Maximum chunk excess detected" - end - - len += 2 - - part = io.read(len) - - unless part - @partial_part_left = len - next - end - - got = part.size - - case - when got == len - # proper chunked segment must end with "\r\n" - if part.end_with? CHUNK_VALID_ENDING - write_chunk(part[0..-3]) # to skip the ending \r\n - else - raise HttpParserError, "Chunk size mismatch" - end - when got <= len - 2 - write_chunk(part) - @partial_part_left = len - part.size - when got == len - 1 # edge where we get just \r but not \n - write_chunk(part[0..-2]) - @partial_part_left = len - part.size - end - else - if @prev_chunk.size + line.size >= MAX_CHUNK_HEADER_SIZE - raise HttpParserError, "maximum size of chunk header exceeded" - end - - @prev_chunk = line - return false - end - end - - if @in_last_chunk - set_ready - true - else - false - end - end - - def set_ready - if @body_read_start - @env['puma.request_body_wait'] = Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond) - @body_read_start - end - @requests_served += 1 - @ready = true - end - - def above_http_content_limit(value) - @http_content_length_limit&.< value - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster.rb deleted file mode 100644 index 4cf83ff..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster.rb +++ /dev/null @@ -1,634 +0,0 @@ -# frozen_string_literal: true - -require_relative 'runner' -require_relative 'util' -require_relative 'plugin' -require_relative 'cluster/worker_handle' -require_relative 'cluster/worker' - -module Puma - # This class is instantiated by the `Puma::Launcher` and used - # to boot and serve a Ruby application when puma "workers" are needed - # i.e. when using multi-processes. For example `$ puma -w 5` - # - # An instance of this class will spawn the number of processes passed in - # via the `spawn_workers` method call. Each worker will have it's own - # instance of a `Puma::Server`. - class Cluster < Runner - def initialize(launcher) - super(launcher) - - @phase = 0 - @workers = [] - @next_check = Time.now - - @phased_restart = false - end - - # Returns the list of cluster worker handles. - # @return [Array] - attr_reader :workers - - def stop_workers - log "- Gracefully shutting down workers..." - @workers.each { |x| x.term } - - begin - loop do - wait_workers - break if @workers.reject {|w| w.pid.nil?}.empty? - sleep 0.2 - end - rescue Interrupt - log "! Cancelled waiting for workers" - end - end - - def start_phased_restart(refork = false) - @events.fire_on_restart! - - @phase += 1 - if refork - log "- Starting worker refork, phase: #{@phase}" - else - log "- Starting phased worker restart, phase: #{@phase}" - end - - # Be sure to change the directory again before loading - # the app. This way we can pick up new code. - dir = @launcher.restart_dir - log "+ Changing to #{dir}" - Dir.chdir dir - end - - def redirect_io - super - - @workers.each { |x| x.hup } - end - - def spawn_workers - diff = @options[:workers] - @workers.size - return if diff < 1 - - master = Process.pid - if @options[:fork_worker] - @fork_writer << "-1\n" - end - - diff.times do - idx = next_worker_index - - if @options[:fork_worker] && idx != 0 - @fork_writer << "#{idx}\n" - pid = nil - else - pid = spawn_worker(idx, master) - end - - debug "Spawned worker: #{pid}" - @workers << WorkerHandle.new(idx, pid, @phase, @options) - end - - if @options[:fork_worker] && all_workers_in_phase? - @fork_writer << "0\n" - - if worker_at(0).phase > 0 - @fork_writer << "-2\n" - end - end - end - - # @version 5.0.0 - def spawn_worker(idx, master) - @config.run_hooks(:before_worker_fork, idx, @log_writer) - - pid = fork { worker(idx, master) } - if !pid - log "! Complete inability to spawn new workers detected" - log "! Seppuku is the only choice." - exit! 1 - end - - @config.run_hooks(:after_worker_fork, idx, @log_writer) - pid - end - - def cull_workers - diff = @workers.size - @options[:workers] - return if diff < 1 - debug "Culling #{diff} workers" - - workers = workers_to_cull(diff) - debug "Workers to cull: #{workers.inspect}" - - workers.each do |worker| - log "- Worker #{worker.index} (PID: #{worker.pid}) terminating" - worker.term - end - end - - def workers_to_cull(diff) - workers = @workers.sort_by(&:started_at) - - # In fork_worker mode, worker 0 acts as our master process. - # We should avoid culling it to preserve copy-on-write memory gains. - workers.reject! { |w| w.index == 0 } if @options[:fork_worker] - - workers[cull_start_index(diff), diff] - end - - def cull_start_index(diff) - case @options[:worker_culling_strategy] - when :oldest - 0 - else # :youngest - -diff - end - end - - # @!attribute [r] next_worker_index - def next_worker_index - occupied_positions = @workers.map(&:index) - idx = 0 - idx += 1 until !occupied_positions.include?(idx) - idx - end - - def worker_at(idx) - @workers.find { |w| w.index == idx } - end - - def all_workers_booted? - @workers.count { |w| !w.booted? } == 0 - end - - def all_workers_in_phase? - @workers.all? { |w| w.phase == @phase } - end - - def all_workers_idle_timed_out? - (@workers.map(&:pid) - idle_timed_out_worker_pids).empty? - end - - def check_workers(refork = false) - return if @next_check >= Time.now - - @next_check = Time.now + @options[:worker_check_interval] - - timeout_workers - wait_workers - cull_workers - spawn_workers - - if all_workers_booted? - # If we're running at proper capacity, check to see if - # we need to phase any workers out (which will restart - # in the right phase). - # - w = @workers.find { |x| x.phase != @phase } - - if w - if refork - log "- Stopping #{w.pid} for refork..." - else - log "- Stopping #{w.pid} for phased upgrade..." - end - - unless w.term? - w.term - log "- #{w.signal} sent to #{w.pid}..." - end - end - end - - t = @workers.reject(&:term?) - t.map!(&:ping_timeout) - - @next_check = [t.min, @next_check].compact.min - end - - def worker(index, master) - @workers = [] - - @master_read.close - @suicide_pipe.close - @fork_writer.close - - pipes = { check_pipe: @check_pipe, worker_write: @worker_write } - if @options[:fork_worker] - pipes[:fork_pipe] = @fork_pipe - pipes[:wakeup] = @wakeup - end - - server = start_server if preload? - new_worker = Worker.new index: index, - master: master, - launcher: @launcher, - pipes: pipes, - server: server - new_worker.run - end - - def restart - @restart = true - stop - end - - def phased_restart(refork = false) - return false if @options[:preload_app] && !refork - - @phased_restart = refork ? :refork : true - wakeup! - - true - end - - def stop - @status = :stop - wakeup! - end - - def stop_blocked - @status = :stop if @status == :run - wakeup! - @control&.stop true - Process.waitall - end - - def halt - @status = :halt - wakeup! - end - - def reload_worker_directory - dir = @launcher.restart_dir - log "+ Changing to #{dir}" - Dir.chdir dir - end - - # Inside of a child process, this will return all zeroes, as @workers is only populated in - # the master process. - # @!attribute [r] stats - def stats - old_worker_count = @workers.count { |w| w.phase != @phase } - worker_status = @workers.map do |w| - { - started_at: utc_iso8601(w.started_at), - pid: w.pid, - index: w.index, - phase: w.phase, - booted: w.booted?, - last_checkin: utc_iso8601(w.last_checkin), - last_status: w.last_status, - } - end - - { - started_at: utc_iso8601(@started_at), - workers: @workers.size, - phase: @phase, - booted_workers: worker_status.count { |w| w[:booted] }, - old_workers: old_worker_count, - worker_status: worker_status, - }.merge(super) - end - - def preload? - @options[:preload_app] - end - - # @version 5.0.0 - def fork_worker! - if (worker = worker_at 0) - worker.phase += 1 - end - phased_restart(true) - end - - # We do this in a separate method to keep the lambda scope - # of the signals handlers as small as possible. - def setup_signals - if @options[:fork_worker] - Signal.trap "SIGURG" do - fork_worker! - end - - # Auto-fork after the specified number of requests. - if (fork_requests = @options[:fork_worker].to_i) > 0 - @events.register(:ping!) do |w| - fork_worker! if w.index == 0 && - w.phase == 0 && - w.last_status[:requests_count] >= fork_requests - end - end - end - - Signal.trap "SIGCHLD" do - wakeup! - end - - Signal.trap "TTIN" do - @options[:workers] += 1 - wakeup! - end - - Signal.trap "TTOU" do - @options[:workers] -= 1 if @options[:workers] >= 2 - wakeup! - end - - master_pid = Process.pid - - Signal.trap "SIGTERM" do - # The worker installs their own SIGTERM when booted. - # Until then, this is run by the worker and the worker - # should just exit if they get it. - if Process.pid != master_pid - log "Early termination of worker" - exit! 0 - else - @launcher.close_binder_listeners - - stop_workers - stop - @events.fire_on_stopped! - raise(SignalException, "SIGTERM") if @options[:raise_exception_on_sigterm] - exit 0 # Clean exit, workers were stopped - end - end - end - - def run - @status = :run - - output_header "cluster" - - # This is aligned with the output from Runner, see Runner#output_header - log "* Workers: #{@options[:workers]}" - - if preload? - # Threads explicitly marked as fork safe will be ignored. Used in Rails, - # but may be used by anyone. Note that we need to explicit - # Process::Waiter check here because there's a bug in Ruby 2.6 and below - # where calling thread_variable_get on a Process::Waiter will segfault. - # We can drop that clause once those versions of Ruby are no longer - # supported. - fork_safe = ->(t) { !t.is_a?(Process::Waiter) && t.thread_variable_get(:fork_safe) } - - before = Thread.list.reject(&fork_safe) - - log "* Restarts: (\u2714) hot (\u2716) phased (#{@options[:fork_worker] ? "\u2714" : "\u2716"}) refork" - log "* Preloading application" - load_and_bind - - after = Thread.list.reject(&fork_safe) - - if after.size > before.size - threads = (after - before) - if threads.first.respond_to? :backtrace - log "! WARNING: Detected #{after.size-before.size} Thread(s) started in app boot:" - threads.each do |t| - log "! #{t.inspect} - #{t.backtrace ? t.backtrace.first : ''}" - end - else - log "! WARNING: Detected #{after.size-before.size} Thread(s) started in app boot" - end - end - else - log "* Restarts: (\u2714) hot (\u2714) phased (#{@options[:fork_worker] ? "\u2714" : "\u2716"}) refork" - - unless @config.app_configured? - error "No application configured, nothing to run" - exit 1 - end - - @launcher.binder.parse @options[:binds] - end - - read, @wakeup = Puma::Util.pipe - - setup_signals - - # Used by the workers to detect if the master process dies. - # If select says that @check_pipe is ready, it's because the - # master has exited and @suicide_pipe has been automatically - # closed. - # - @check_pipe, @suicide_pipe = Puma::Util.pipe - - # Separate pipe used by worker 0 to receive commands to - # fork new worker processes. - @fork_pipe, @fork_writer = Puma::Util.pipe - - log "Use Ctrl-C to stop" - - single_worker_warning - - redirect_io - - Plugins.fire_background - - @launcher.write_state - - start_control - - @master_read, @worker_write = read, @wakeup - - @options[:worker_write] = @worker_write - - @config.run_hooks(:before_fork, nil, @log_writer) - - spawn_workers - - Signal.trap "SIGINT" do - stop - end - - begin - booted = false - in_phased_restart = false - workers_not_booted = @options[:workers] - - while @status == :run - begin - if @options[:idle_timeout] && all_workers_idle_timed_out? - log "- All workers reached idle timeout" - break - end - - if @phased_restart - start_phased_restart(@phased_restart == :refork) - - in_phased_restart = @phased_restart - @phased_restart = false - - workers_not_booted = @options[:workers] - # worker 0 is not restarted on refork - workers_not_booted -= 1 if in_phased_restart == :refork - end - - check_workers(in_phased_restart == :refork) - - if read.wait_readable([0, @next_check - Time.now].max) - req = read.read_nonblock(1) - next unless req - - if req == PIPE_WAKEUP - @next_check = Time.now - next - end - - result = read.gets - pid = result.to_i - - if req == PIPE_BOOT || req == PIPE_FORK - pid, idx = result.split(':').map(&:to_i) - w = worker_at idx - w.pid = pid if w.pid.nil? - end - - if w = @workers.find { |x| x.pid == pid } - case req - when PIPE_BOOT - w.boot! - log "- Worker #{w.index} (PID: #{pid}) booted in #{w.uptime.round(2)}s, phase: #{w.phase}" - @next_check = Time.now - workers_not_booted -= 1 - when PIPE_EXTERNAL_TERM - # external term, see worker method, Signal.trap "SIGTERM" - w.term! - when PIPE_TERM - w.term unless w.term? - when PIPE_PING - status = result.sub(/^\d+/,'').chomp - w.ping!(status) - @events.fire(:ping!, w) - - if in_phased_restart && @options[:fork_worker] && workers_not_booted.positive? && w0 = worker_at(0) - w0.ping!(status) - @events.fire(:ping!, w0) - end - - if !booted && @workers.none? {|worker| worker.last_status.empty?} - @events.fire_on_booted! - debug_loaded_extensions("Loaded Extensions - master:") if @log_writer.debug? - booted = true - end - when PIPE_IDLE - if idle_workers[pid] - idle_workers.delete pid - else - idle_workers[pid] = true - end - end - else - log "! Out-of-sync worker list, no #{pid} worker" - end - end - - if in_phased_restart && workers_not_booted.zero? - @events.fire_on_booted! - debug_loaded_extensions("Loaded Extensions - master:") if @log_writer.debug? - in_phased_restart = false - end - rescue Interrupt - @status = :stop - end - end - - stop_workers unless @status == :halt - ensure - @check_pipe.close - @suicide_pipe.close - read.close - @wakeup.close - end - end - - private - - def single_worker_warning - return if @options[:workers] != 1 || @options[:silence_single_worker_warning] - - log "! WARNING: Detected running cluster mode with 1 worker." - log "! Running Puma in cluster mode with a single worker is often a misconfiguration." - log "! Consider running Puma in single-mode (workers = 0) in order to reduce memory overhead." - log "! Set the `silence_single_worker_warning` option to silence this warning message." - end - - # loops thru @workers, removing workers that exited, and calling - # `#term` if needed - def wait_workers - # Reap all children, known workers or otherwise. - # If puma has PID 1, as it's common in containerized environments, - # then it's responsible for reaping orphaned processes, so we must reap - # all our dead children, regardless of whether they are workers we spawned - # or some reattached processes. - reaped_children = {} - loop do - begin - pid, status = Process.wait2(-1, Process::WNOHANG) - break unless pid - reaped_children[pid] = status - rescue Errno::ECHILD - break - end - end - - @workers.reject! do |w| - next false if w.pid.nil? - begin - # We may need to check the PID individually because: - # 1. From Ruby versions 2.6 to 3.2, `Process.detach` can prevent or delay - # `Process.wait2(-1)` from detecting a terminated process: https://bugs.ruby-lang.org/issues/19837. - # 2. When `fork_worker` is enabled, some worker may not be direct children, - # but grand children. Because of this they won't be reaped by `Process.wait2(-1)`. - if reaped_children.delete(w.pid) || Process.wait(w.pid, Process::WNOHANG) - true - else - w.term if w.term? - nil - end - rescue Errno::ECHILD - begin - Process.kill(0, w.pid) - # child still alive but has another parent (e.g., using fork_worker) - w.term if w.term? - false - rescue Errno::ESRCH, Errno::EPERM - true # child is already terminated - end - end - end - - # Log unknown children - reaped_children.each do |pid, status| - log "! reaped unknown child process pid=#{pid} status=#{status}" - end - end - - # @version 5.0.0 - def timeout_workers - @workers.each do |w| - if !w.term? && w.ping_timeout <= Time.now - details = if w.booted? - "(Worker #{w.index} failed to check in within #{@options[:worker_timeout]} seconds)" - else - "(Worker #{w.index} failed to boot within #{@options[:worker_boot_timeout]} seconds)" - end - log "! Terminating timed out worker #{details}: #{w.pid}" - w.kill - end - end - end - - def idle_timed_out_worker_pids - idle_workers.keys - end - - def idle_workers - @idle_workers ||= {} - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster/worker.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster/worker.rb deleted file mode 100644 index 458f13c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster/worker.rb +++ /dev/null @@ -1,183 +0,0 @@ -# frozen_string_literal: true - -module Puma - class Cluster < Puma::Runner - #—————————————————————— DO NOT USE — this class is for internal use only ——— - - - # This class is instantiated by the `Puma::Cluster` and represents a single - # worker process. - # - # At the core of this class is running an instance of `Puma::Server` which - # gets created via the `start_server` method from the `Puma::Runner` class - # that this inherits from. - class Worker < Puma::Runner # :nodoc: - attr_reader :index, :master - - def initialize(index:, master:, launcher:, pipes:, server: nil) - super(launcher) - - @index = index - @master = master - @check_pipe = pipes[:check_pipe] - @worker_write = pipes[:worker_write] - @fork_pipe = pipes[:fork_pipe] - @wakeup = pipes[:wakeup] - @server = server - @hook_data = {} - end - - def run - title = "puma: cluster worker #{index}: #{master}" - title += " [#{@options[:tag]}]" if @options[:tag] && !@options[:tag].empty? - $0 = title - - Signal.trap "SIGINT", "IGNORE" - Signal.trap "SIGCHLD", "DEFAULT" - - Thread.new do - Puma.set_thread_name "wrkr check" - @check_pipe.wait_readable - log "! Detected parent died, dying" - exit! 1 - end - - # If we're not running under a Bundler context, then - # report the info about the context we will be using - if !ENV['BUNDLE_GEMFILE'] - if File.exist?("Gemfile") - log "+ Gemfile in context: #{File.expand_path("Gemfile")}" - elsif File.exist?("gems.rb") - log "+ Gemfile in context: #{File.expand_path("gems.rb")}" - end - end - - # Invoke any worker boot hooks so they can get - # things in shape before booting the app. - @config.run_hooks(:before_worker_boot, index, @log_writer, @hook_data) - - begin - server = @server ||= start_server - rescue Exception => e - log "! Unable to start worker" - log e - log e.backtrace.join("\n ") - exit 1 - end - - restart_server = Queue.new << true << false - - fork_worker = @options[:fork_worker] && index == 0 - - if fork_worker - restart_server.clear - worker_pids = [] - Signal.trap "SIGCHLD" do - wakeup! if worker_pids.reject! do |p| - Process.wait(p, Process::WNOHANG) rescue true - end - end - - Thread.new do - Puma.set_thread_name "wrkr fork" - while (idx = @fork_pipe.gets) - idx = idx.to_i - if idx == -1 # stop server - if restart_server.length > 0 - restart_server.clear - server.begin_restart(true) - @config.run_hooks(:before_refork, nil, @log_writer, @hook_data) - end - elsif idx == -2 # refork cycle is done - @config.run_hooks(:after_refork, nil, @log_writer, @hook_data) - elsif idx == 0 # restart server - restart_server << true << false - else # fork worker - worker_pids << pid = spawn_worker(idx) - @worker_write << "#{PIPE_FORK}#{pid}:#{idx}\n" rescue nil - end - end - end - end - - Signal.trap "SIGTERM" do - @worker_write << "#{PIPE_EXTERNAL_TERM}#{Process.pid}\n" rescue nil - restart_server.clear - server.stop - restart_server << false - end - - begin - @worker_write << "#{PIPE_BOOT}#{Process.pid}:#{index}\n" - rescue SystemCallError, IOError - Puma::Util.purge_interrupt_queue - STDERR.puts "Master seems to have exited, exiting." - return - end - - while restart_server.pop - server_thread = server.run - - if @log_writer.debug? && index == 0 - debug_loaded_extensions "Loaded Extensions - worker 0:" - end - - stat_thread ||= Thread.new(@worker_write) do |io| - Puma.set_thread_name "stat pld" - base_payload = "#{PIPE_PING}#{Process.pid}" - - while true - begin - b = server.backlog || 0 - r = server.running || 0 - t = server.pool_capacity || 0 - m = server.max_threads || 0 - rc = server.requests_count || 0 - bt = server.busy_threads || 0 - payload = %Q!#{base_payload}{ "backlog":#{b}, "running":#{r}, "pool_capacity":#{t}, "max_threads":#{m}, "requests_count":#{rc}, "busy_threads":#{bt} }\n! - io << payload - rescue IOError - Puma::Util.purge_interrupt_queue - break - end - sleep @options[:worker_check_interval] - end - end - server_thread.join - end - - # Invoke any worker shutdown hooks so they can prevent the worker - # exiting until any background operations are completed - @config.run_hooks(:before_worker_shutdown, index, @log_writer, @hook_data) - ensure - @worker_write << "#{PIPE_TERM}#{Process.pid}\n" rescue nil - @worker_write.close - end - - private - - def spawn_worker(idx) - @config.run_hooks(:before_worker_fork, idx, @log_writer, @hook_data) - - pid = fork do - new_worker = Worker.new index: idx, - master: master, - launcher: @launcher, - pipes: { check_pipe: @check_pipe, - worker_write: @worker_write }, - server: @server - new_worker.run - end - - if !pid - log "! Complete inability to spawn new workers detected" - log "! Seppuku is the only choice." - exit! 1 - end - - @config.run_hooks(:after_worker_fork, idx, @log_writer, @hook_data) - pid - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster/worker_handle.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster/worker_handle.rb deleted file mode 100644 index 64fff1a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/cluster/worker_handle.rb +++ /dev/null @@ -1,96 +0,0 @@ -# frozen_string_literal: true - -module Puma - class Cluster < Runner - #—————————————————————— DO NOT USE — this class is for internal use only ——— - - - # This class represents a worker process from the perspective of the puma - # master process. It contains information about the process and its health - # and it exposes methods to control the process via IPC. It does not - # include the actual logic executed by the worker process itself. For that, - # see Puma::Cluster::Worker. - class WorkerHandle # :nodoc: - def initialize(idx, pid, phase, options) - @index = idx - @pid = pid - @phase = phase - @stage = :started - @signal = "TERM" - @options = options - @first_term_sent = nil - @started_at = Time.now - @last_checkin = Time.now - @last_status = {} - @term = false - end - - attr_reader :index, :pid, :phase, :signal, :last_checkin, :last_status, :started_at - - # @version 5.0.0 - attr_writer :pid, :phase - - def booted? - @stage == :booted - end - - def uptime - Time.now - started_at - end - - def boot! - @last_checkin = Time.now - @stage = :booted - end - - def term! - @term = true - end - - def term? - @term - end - - STATUS_PATTERN = /{ "backlog":(?\d*), "running":(?\d*), "pool_capacity":(?\d*), "max_threads":(?\d*), "requests_count":(?\d*), "busy_threads":(?\d*) }/ - private_constant :STATUS_PATTERN - - def ping!(status) - @last_checkin = Time.now - @last_status = status.match(STATUS_PATTERN).named_captures.map { |c_name, c| [c_name.to_sym, c.to_i] }.to_h - end - - # @see Puma::Cluster#check_workers - # @version 5.0.0 - def ping_timeout - @last_checkin + - (booted? ? - @options[:worker_timeout] : - @options[:worker_boot_timeout] - ) - end - - def term - begin - if @first_term_sent && (Time.now - @first_term_sent) > @options[:worker_shutdown_timeout] - @signal = "KILL" - else - @term ||= true - @first_term_sent ||= Time.now - end - Process.kill @signal, @pid if @pid - rescue Errno::ESRCH - end - end - - def kill - @signal = 'KILL' - term - end - - def hup - Process.kill "HUP", @pid - rescue Errno::ESRCH - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/commonlogger.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/commonlogger.rb deleted file mode 100644 index 144e9a9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/commonlogger.rb +++ /dev/null @@ -1,115 +0,0 @@ -# frozen_string_literal: true - -module Puma - # Rack::CommonLogger forwards every request to the given +app+, and - # logs a line in the - # {Apache common log format}[https://httpd.apache.org/docs/2.4/logs.html#common] - # to the +logger+. - # - # If +logger+ is nil, CommonLogger will fall back +rack.errors+, which is - # an instance of Rack::NullLogger. - # - # +logger+ can be any class, including the standard library Logger, and is - # expected to have either +write+ or +<<+ method, which accepts the CommonLogger::FORMAT. - # According to the SPEC, the error stream must also respond to +puts+ - # (which takes a single argument that responds to +to_s+), and +flush+ - # (which is called without arguments in order to make the error appear for - # sure) - class CommonLogger - # Common Log Format: https://httpd.apache.org/docs/2.4/logs.html#common - # - # lilith.local - - [07/Aug/2006 23:58:02 -0400] "GET / HTTP/1.1" 500 - - # - # %{%s - %s [%s] "%s %s%s %s" %d %s\n} % - FORMAT = %{%s - %s [%s] "%s %s%s %s" %d %s %0.4f\n} - - HIJACK_FORMAT = %{%s - %s [%s] "%s %s%s %s" HIJACKED -1 %0.4f\n} - - LOG_TIME_FORMAT = '%d/%b/%Y:%H:%M:%S %z' - - CONTENT_LENGTH = 'Content-Length' # should be lower case from app, - # Util::HeaderHash allows mixed - HTTP_VERSION = Const::HTTP_VERSION - HTTP_X_FORWARDED_FOR = Const::HTTP_X_FORWARDED_FOR - PATH_INFO = Const::PATH_INFO - QUERY_STRING = Const::QUERY_STRING - REMOTE_ADDR = Const::REMOTE_ADDR - REMOTE_USER = 'REMOTE_USER' - REQUEST_METHOD = Const::REQUEST_METHOD - - def initialize(app, logger=nil) - @app = app - @logger = logger - end - - def call(env) - began_at = Time.now - status, header, body = @app.call(env) - header = Util::HeaderHash.new(header) - - # If we've been hijacked, then output a special line - if env['rack.hijack_io'] - log_hijacking(env, 'HIJACK', header, began_at) - else - ary = env['rack.after_reply'] - ary << lambda { log(env, status, header, began_at) } - end - - [status, header, body] - end - - private - - def log_hijacking(env, status, header, began_at) - now = Time.now - - msg = HIJACK_FORMAT % [ - env[HTTP_X_FORWARDED_FOR] || env[REMOTE_ADDR] || "-", - env[REMOTE_USER] || "-", - now.strftime(LOG_TIME_FORMAT), - env[REQUEST_METHOD], - env[PATH_INFO], - env[QUERY_STRING].empty? ? "" : "?#{env[QUERY_STRING]}", - env[HTTP_VERSION], - now - began_at ] - - write(msg) - end - - def log(env, status, header, began_at) - now = Time.now - length = extract_content_length(header) - - msg = FORMAT % [ - env[HTTP_X_FORWARDED_FOR] || env[REMOTE_ADDR] || "-", - env[REMOTE_USER] || "-", - now.strftime(LOG_TIME_FORMAT), - env[REQUEST_METHOD], - env[PATH_INFO], - env[QUERY_STRING].empty? ? "" : "?#{env[QUERY_STRING]}", - env[HTTP_VERSION], - status.to_s[0..3], - length, - now - began_at ] - - write(msg) - end - - def write(msg) - logger = @logger || env['rack.errors'] - - # Standard library logger doesn't support write but it supports << which actually - # calls to write on the log device without formatting - if logger.respond_to?(:write) - logger.write(msg) - else - logger << msg - end - end - - def extract_content_length(headers) - value = headers[CONTENT_LENGTH] or return '-' - value.to_s == '0' ? '-' : value - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/configuration.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/configuration.rb deleted file mode 100644 index 31321ec..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/configuration.rb +++ /dev/null @@ -1,407 +0,0 @@ -# frozen_string_literal: true - -require_relative 'plugin' -require_relative 'const' -require_relative 'dsl' - -module Puma - # A class used for storing "leveled" configuration options. - # - # In this class any "user" specified options take precedence over any - # "file" specified options, take precedence over any "default" options. - # - # User input is preferred over "defaults": - # user_options = { foo: "bar" } - # default_options = { foo: "zoo" } - # options = UserFileDefaultOptions.new(user_options, default_options) - # puts options[:foo] - # # => "bar" - # - # All values can be accessed via `all_of` - # - # puts options.all_of(:foo) - # # => ["bar", "zoo"] - # - # A "file" option can be set. This config will be preferred over "default" options - # but will defer to any available "user" specified options. - # - # user_options = { foo: "bar" } - # default_options = { rackup: "zoo.rb" } - # options = UserFileDefaultOptions.new(user_options, default_options) - # options.file_options[:rackup] = "sup.rb" - # puts options[:rackup] - # # => "sup.rb" - # - # The "default" options can be set via procs. These are resolved during runtime - # via calls to `finalize_values` - class UserFileDefaultOptions - def initialize(user_options, default_options) - @user_options = user_options - @file_options = {} - @default_options = default_options - end - - attr_reader :user_options, :file_options, :default_options - - def [](key) - fetch(key) - end - - def []=(key, value) - user_options[key] = value - end - - def fetch(key, default_value = nil) - return user_options[key] if user_options.key?(key) - return file_options[key] if file_options.key?(key) - return default_options[key] if default_options.key?(key) - - default_value - end - - def all_of(key) - user = user_options[key] - file = file_options[key] - default = default_options[key] - - user = [user] unless user.is_a?(Array) - file = [file] unless file.is_a?(Array) - default = [default] unless default.is_a?(Array) - - user.compact! - file.compact! - default.compact! - - user + file + default - end - - def finalize_values - @default_options.each do |k,v| - if v.respond_to? :call - @default_options[k] = v.call - end - end - end - - def final_options - default_options - .merge(file_options) - .merge(user_options) - end - end - - # The main configuration class of Puma. - # - # It can be initialized with a set of "user" options and "default" options. - # Defaults will be merged with `Configuration.puma_default_options`. - # - # This class works together with 2 main other classes the `UserFileDefaultOptions` - # which stores configuration options in order so the precedence is that user - # set configuration wins over "file" based configuration wins over "default" - # configuration. These configurations are set via the `DSL` class. This - # class powers the Puma config file syntax and does double duty as a configuration - # DSL used by the `Puma::CLI` and Puma rack handler. - # - # It also handles loading plugins. - # - # [Note:] - # `:port` and `:host` are not valid keys. By the time they make it to the - # configuration options they are expected to be incorporated into a `:binds` key. - # Under the hood the DSL maps `port` and `host` calls to `:binds` - # - # config = Configuration.new({}) do |user_config, file_config, default_config| - # user_config.port 3003 - # end - # config.load - # puts config.options[:port] - # # => 3003 - # - # It is expected that `load` is called on the configuration instance after setting - # config. This method expands any values in `config_file` and puts them into the - # correct configuration option hash. - # - # Once all configuration is complete it is expected that `clamp` will be called - # on the instance. This will expand any procs stored under "default" values. This - # is done because an environment variable may have been modified while loading - # configuration files. - class Configuration - DEFAULTS = { - auto_trim_time: 30, - binds: ['tcp://0.0.0.0:9292'.freeze], - clean_thread_locals: false, - debug: false, - enable_keep_alives: true, - early_hints: nil, - environment: 'development'.freeze, - # Number of seconds to wait until we get the first data for the request. - first_data_timeout: 30, - # Number of seconds to wait until the next request before shutting down. - idle_timeout: nil, - io_selector_backend: :auto, - log_requests: false, - logger: STDOUT, - # How many requests to attempt inline before sending a client back to - # the reactor to be subject to normal ordering. The idea here is that - # we amortize the cost of going back to the reactor for a well behaved - # but very "greedy" client across 10 requests. This prevents a not - # well behaved client from monopolizing the thread forever. - max_fast_inline: 10, - max_threads: Puma.mri? ? 5 : 16, - min_threads: 0, - mode: :http, - mutate_stdout_and_stderr_to_sync_on_write: true, - out_of_band: [], - # Number of seconds for another request within a persistent session. - persistent_timeout: 20, - queue_requests: true, - rackup: 'config.ru'.freeze, - raise_exception_on_sigterm: true, - reaping_time: 1, - remote_address: :socket, - silence_single_worker_warning: false, - silence_fork_callback_warning: false, - tag: File.basename(Dir.getwd), - tcp_host: '0.0.0.0'.freeze, - tcp_port: 9292, - wait_for_less_busy_worker: 0.005, - worker_boot_timeout: 60, - worker_check_interval: 5, - worker_culling_strategy: :youngest, - worker_shutdown_timeout: 30, - worker_timeout: 60, - workers: 0, - http_content_length_limit: nil - } - - def initialize(user_options={}, default_options = {}, env = ENV, &block) - default_options = self.puma_default_options(env).merge(default_options) - - @options = UserFileDefaultOptions.new(user_options, default_options) - @plugins = PluginLoader.new - @user_dsl = DSL.new(@options.user_options, self) - @file_dsl = DSL.new(@options.file_options, self) - @default_dsl = DSL.new(@options.default_options, self) - - if !@options[:prune_bundler] - default_options[:preload_app] = (@options[:workers] > 1) && Puma.forkable? - end - - @puma_bundler_pruned = env.key? 'PUMA_BUNDLER_PRUNED' - - if block - configure(&block) - end - end - - attr_reader :options, :plugins - - def configure - yield @user_dsl, @file_dsl, @default_dsl - ensure - @user_dsl._offer_plugins - @file_dsl._offer_plugins - @default_dsl._offer_plugins - end - - def initialize_copy(other) - @conf = nil - @cli_options = nil - @options = @options.dup - end - - def flatten - dup.flatten! - end - - def flatten! - @options = @options.flatten - self - end - - def puma_default_options(env = ENV) - defaults = DEFAULTS.dup - puma_options_from_env(env).each { |k,v| defaults[k] = v if v } - defaults - end - - def puma_options_from_env(env = ENV) - min = env['PUMA_MIN_THREADS'] || env['MIN_THREADS'] - max = env['PUMA_MAX_THREADS'] || env['MAX_THREADS'] - workers = if env['WEB_CONCURRENCY'] == 'auto' - require_processor_counter - ::Concurrent.available_processor_count - else - env['WEB_CONCURRENCY'] - end - - { - min_threads: min && min != "" && Integer(min), - max_threads: max && max != "" && Integer(max), - workers: workers && workers != "" && Integer(workers), - environment: env['APP_ENV'] || env['RACK_ENV'] || env['RAILS_ENV'], - } - end - - def load - config_files.each { |config_file| @file_dsl._load_from(config_file) } - - @options - end - - def config_files - files = @options.all_of(:config_files) - - return [] if files == ['-'] - return files if files.any? - - first_default_file = %W(config/puma/#{@options[:environment]}.rb config/puma.rb).find do |f| - File.exist?(f) - end - - [first_default_file] - end - - # Call once all configuration (included from rackup files) - # is loaded to flesh out any defaults - def clamp - @options.finalize_values - end - - # Injects the Configuration object into the env - class ConfigMiddleware - def initialize(config, app) - @config = config - @app = app - end - - def call(env) - env[Const::PUMA_CONFIG] = @config - @app.call(env) - end - end - - # Indicate if there is a properly configured app - # - def app_configured? - @options[:app] || File.exist?(rackup) - end - - def rackup - @options[:rackup] - end - - # Load the specified rackup file, pull options from - # the rackup file, and set @app. - # - def app - found = options[:app] || load_rackup - - if @options[:log_requests] - require_relative 'commonlogger' - logger = @options[:logger] - found = CommonLogger.new(found, logger) - end - - ConfigMiddleware.new(self, found) - end - - # Return which environment we're running in - def environment - @options[:environment] - end - - def load_plugin(name) - @plugins.create name - end - - # @param key [:Symbol] hook to run - # @param arg [Launcher, Int] `:on_restart` passes Launcher - # - def run_hooks(key, arg, log_writer, hook_data = nil) - log_writer.debug "Running #{key} hooks" - - @options.all_of(key).each do |b| - begin - if Array === b - hook_data[b[1]] ||= Hash.new - b[0].call arg, hook_data[b[1]] - else - b.call arg - end - rescue => e - log_writer.log "WARNING hook #{key} failed with exception (#{e.class}) #{e.message}" - log_writer.debug e.backtrace.join("\n") - end - end - end - - def final_options - @options.final_options - end - - def self.temp_path - require 'tmpdir' - - t = (Time.now.to_f * 1000).to_i - "#{Dir.tmpdir}/puma-status-#{t}-#{$$}" - end - - private - - def require_processor_counter - require 'concurrent/utility/processor_counter' - rescue LoadError - warn <<~MESSAGE - WEB_CONCURRENCY=auto requires the "concurrent-ruby" gem to be installed. - Please add "concurrent-ruby" to your Gemfile. - MESSAGE - raise - end - - # Load and use the normal Rack builder if we can, otherwise - # fallback to our minimal version. - def rack_builder - # Load bundler now if we can so that we can pickup rack from - # a Gemfile - if @puma_bundler_pruned - begin - require 'bundler/setup' - rescue LoadError - end - end - - begin - require 'rack' - require 'rack/builder' - ::Rack::Builder - rescue LoadError - require_relative 'rack/builder' - Puma::Rack::Builder - end - end - - def load_rackup - raise "Missing rackup file '#{rackup}'" unless File.exist?(rackup) - - rack_app, rack_options = rack_builder.parse_file(rackup) - rack_options = rack_options || {} - - @options.file_options.merge!(rack_options) - - config_ru_binds = [] - rack_options.each do |k, v| - config_ru_binds << v if k.to_s.start_with?("bind") - end - - @options.file_options[:binds] = config_ru_binds unless config_ru_binds.empty? - - rack_app - end - - def self.random_token - require 'securerandom' unless defined?(SecureRandom) - - SecureRandom.hex(16) - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/const.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/const.rb deleted file mode 100644 index 6aabc3c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/const.rb +++ /dev/null @@ -1,308 +0,0 @@ -#encoding: utf-8 -# frozen_string_literal: true - -module Puma - class UnsupportedOption < RuntimeError - end - - # Every standard HTTP code mapped to the appropriate message. These are - # used so frequently that they are placed directly in Puma for easy - # access rather than Puma::Const itself. - - # Every standard HTTP code mapped to the appropriate message. - # Generated with: - # curl -s https://www.iana.org/assignments/http-status-codes/http-status-codes-1.csv | \ - # ruby -ne 'm = /^(\d{3}),(?!Unassigned|\(Unused\))([^,]+)/.match($_) and \ - # puts "#{m[1]} => \x27#{m[2].strip}\x27,"' - HTTP_STATUS_CODES = { - 100 => 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', - 103 => 'Early Hints', - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - 207 => 'Multi-Status', - 208 => 'Already Reported', - 226 => 'IM Used', - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 307 => 'Temporary Redirect', - 308 => 'Permanent Redirect', - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Content Too Large', - 414 => 'URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Range Not Satisfiable', - 417 => 'Expectation Failed', - 421 => 'Misdirected Request', - 422 => 'Unprocessable Content', - 423 => 'Locked', - 424 => 'Failed Dependency', - 425 => 'Too Early', - 426 => 'Upgrade Required', - 428 => 'Precondition Required', - 429 => 'Too Many Requests', - 431 => 'Request Header Fields Too Large', - 451 => 'Unavailable For Legal Reasons', - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 506 => 'Variant Also Negotiates', - 507 => 'Insufficient Storage', - 508 => 'Loop Detected', - 510 => 'Not Extended (OBSOLETED)', - 511 => 'Network Authentication Required' - }.freeze - - # For some HTTP status codes the client only expects headers. - # - - STATUS_WITH_NO_ENTITY_BODY = { - 204 => true, - 205 => true, - 304 => true - }.freeze - - # Frequently used constants when constructing requests or responses. Many times - # the constant just refers to a string with the same contents. Using these constants - # gave about a 3% to 10% performance improvement over using the strings directly. - # - # The constants are frozen because Hash#[]= when called with a String key dups - # the String UNLESS the String is frozen. This saves us therefore 2 object - # allocations when creating the env hash later. - # - # While Puma does try to emulate the CGI/1.2 protocol, it does not use the REMOTE_IDENT, - # REMOTE_USER, or REMOTE_HOST parameters since those are either a security problem or - # too taxing on performance. - module Const - - PUMA_VERSION = VERSION = "6.6.1" - CODE_NAME = "Return to Forever" - - PUMA_SERVER_STRING = ["puma", PUMA_VERSION, CODE_NAME].join(" ").freeze - - FAST_TRACK_KA_TIMEOUT = 0.2 - - # How long to wait when getting some write blocking on the socket when - # sending data back - WRITE_TIMEOUT = 10 - - # The original URI requested by the client. - REQUEST_URI= "REQUEST_URI" - REQUEST_PATH = "REQUEST_PATH" - QUERY_STRING = "QUERY_STRING" - CONTENT_LENGTH = "CONTENT_LENGTH" - - PATH_INFO = "PATH_INFO" - - PUMA_TMP_BASE = "puma" - - ERROR_RESPONSE = { - # Indicate that we couldn't parse the request - 400 => "HTTP/1.1 400 Bad Request\r\n\r\n", - # The standard empty 404 response for bad requests. Use Error4040Handler for custom stuff. - 404 => "HTTP/1.1 404 Not Found\r\nConnection: close\r\n\r\n", - # The standard empty 408 response for requests that timed out. - 408 => "HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n", - # Indicate that there was an internal error, obviously. - 500 => "HTTP/1.1 500 Internal Server Error\r\n\r\n", - # Incorrect or invalid header value - 501 => "HTTP/1.1 501 Not Implemented\r\n\r\n", - # A common header for indicating the server is too busy. Not used yet. - 503 => "HTTP/1.1 503 Service Unavailable\r\n\r\n" - }.freeze - - # The basic max request size we'll try to read. - CHUNK_SIZE = 64 * 1024 - - # This is the maximum header that is allowed before a client is booted. The parser detects - # this, but we'd also like to do this as well. - MAX_HEADER = 1024 * (80 + 32) - - # Maximum request body size before it is moved out of memory and into a tempfile for reading. - MAX_BODY = MAX_HEADER - - REQUEST_METHOD = "REQUEST_METHOD" - HEAD = "HEAD" - - # based on https://www.rfc-editor.org/rfc/rfc9110.html#name-overview, - # with CONNECT removed, and PATCH added - SUPPORTED_HTTP_METHODS = %w[HEAD GET POST PUT DELETE OPTIONS TRACE PATCH].freeze - - # list from https://www.iana.org/assignments/http-methods/http-methods.xhtml - # as of 04-May-23 - IANA_HTTP_METHODS = %w[ - ACL - BASELINE-CONTROL - BIND - CHECKIN - CHECKOUT - CONNECT - COPY - DELETE - GET - HEAD - LABEL - LINK - LOCK - MERGE - MKACTIVITY - MKCALENDAR - MKCOL - MKREDIRECTREF - MKWORKSPACE - MOVE - OPTIONS - ORDERPATCH - PATCH - POST - PRI - PROPFIND - PROPPATCH - PUT - REBIND - REPORT - SEARCH - TRACE - UNBIND - UNCHECKOUT - UNLINK - UNLOCK - UPDATE - UPDATEREDIRECTREF - VERSION-CONTROL - ].freeze - - # ETag is based on the apache standard of hex mtime-size-inode (inode is 0 on win32) - LINE_END = "\r\n" - REMOTE_ADDR = "REMOTE_ADDR" - HTTP_X_FORWARDED_FOR = "HTTP_X_FORWARDED_FOR" - HTTP_X_FORWARDED_SSL = "HTTP_X_FORWARDED_SSL" - HTTP_X_FORWARDED_SCHEME = "HTTP_X_FORWARDED_SCHEME" - HTTP_X_FORWARDED_PROTO = "HTTP_X_FORWARDED_PROTO" - - SERVER_NAME = "SERVER_NAME" - SERVER_PORT = "SERVER_PORT" - HTTP_HOST = "HTTP_HOST" - PORT_80 = "80" - PORT_443 = "443" - LOCALHOST = "localhost" - LOCALHOST_IPV4 = "127.0.0.1" - LOCALHOST_IPV6 = "::1" - UNSPECIFIED_IPV4 = "0.0.0.0" - UNSPECIFIED_IPV6 = "::" - - SERVER_PROTOCOL = "SERVER_PROTOCOL" - HTTP_11 = "HTTP/1.1" - - SERVER_SOFTWARE = "SERVER_SOFTWARE" - GATEWAY_INTERFACE = "GATEWAY_INTERFACE" - CGI_VER = "CGI/1.2" - - STOP_COMMAND = "?" - HALT_COMMAND = "!" - RESTART_COMMAND = "R" - - RACK_INPUT = "rack.input" - RACK_URL_SCHEME = "rack.url_scheme" - RACK_AFTER_REPLY = "rack.after_reply" - PUMA_SOCKET = "puma.socket" - PUMA_CONFIG = "puma.config" - PUMA_PEERCERT = "puma.peercert" - - HTTP = "http" - HTTPS = "https" - - HTTPS_KEY = "HTTPS" - - HTTP_VERSION = "HTTP_VERSION" - HTTP_CONNECTION = "HTTP_CONNECTION" - HTTP_EXPECT = "HTTP_EXPECT" - CONTINUE = "100-continue" - - HTTP_11_100 = "HTTP/1.1 100 Continue\r\n\r\n" - HTTP_11_200 = "HTTP/1.1 200 OK\r\n" - HTTP_10_200 = "HTTP/1.0 200 OK\r\n" - - CLOSE = "close" - KEEP_ALIVE = "keep-alive" - - CONTENT_LENGTH2 = "content-length" - CONTENT_LENGTH_S = "Content-Length: " - TRANSFER_ENCODING = "transfer-encoding" - TRANSFER_ENCODING2 = "HTTP_TRANSFER_ENCODING" - - CONNECTION_CLOSE = "Connection: close\r\n" - CONNECTION_KEEP_ALIVE = "Connection: Keep-Alive\r\n" - - TRANSFER_ENCODING_CHUNKED = "Transfer-Encoding: chunked\r\n" - CLOSE_CHUNKED = "0\r\n\r\n" - - CHUNKED = "chunked" - - COLON = ": " - - NEWLINE = "\n" - - HIJACK_P = "rack.hijack?" - HIJACK = "rack.hijack" - HIJACK_IO = "rack.hijack_io" - - EARLY_HINTS = "rack.early_hints" - - # Illegal character in the key or value of response header - DQUOTE = "\"" - HTTP_HEADER_DELIMITER = Regexp.escape("(),/:;<=>?@[]{}\\").freeze - ILLEGAL_HEADER_KEY_REGEX = /[\x00-\x20#{DQUOTE}#{HTTP_HEADER_DELIMITER}]/.freeze - # header values can contain HTAB? - ILLEGAL_HEADER_VALUE_REGEX = /[\x00-\x08\x0A-\x1F]/.freeze - - # The keys of headers that should not be convert to underscore - # normalized versions. These headers are ignored at the request reading layer, - # but if we normalize them after reading, it's just confusing for the application. - UNMASKABLE_HEADERS = { - "HTTP_TRANSFER,ENCODING" => true, - "HTTP_CONTENT,LENGTH" => true, - } - - # Banned keys of response header - BANNED_HEADER_KEY = /\A(rack\.|status\z)/.freeze - - PROXY_PROTOCOL_V1_REGEX = /^PROXY (?:TCP4|TCP6|UNKNOWN) ([^\r]+)\r\n/.freeze - - # All constants are prefixed with `PIPE_` to avoid name collisions. - module PipeRequest - PIPE_WAKEUP = "!" - PIPE_BOOT = "b" - PIPE_FORK = "f" - PIPE_EXTERNAL_TERM = "e" - PIPE_TERM = "t" - PIPE_PING = "p" - PIPE_IDLE = "i" - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/control_cli.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/control_cli.rb deleted file mode 100644 index 5aaef94..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/control_cli.rb +++ /dev/null @@ -1,316 +0,0 @@ -# frozen_string_literal: true - -require 'optparse' -require_relative 'const' -require_relative 'detect' -require 'uri' -require 'socket' - -module Puma - class ControlCLI - - # values must be string or nil - # value of `nil` means command cannot be processed via signal - # @version 5.0.3 - CMD_PATH_SIG_MAP = { - 'gc' => nil, - 'gc-stats' => nil, - 'halt' => 'SIGQUIT', - 'info' => 'SIGINFO', - 'phased-restart' => 'SIGUSR1', - 'refork' => 'SIGURG', - 'reload-worker-directory' => nil, - 'reopen-log' => 'SIGHUP', - 'restart' => 'SIGUSR2', - 'start' => nil, - 'stats' => nil, - 'status' => '', - 'stop' => 'SIGTERM', - 'thread-backtraces' => nil, - 'worker-count-down' => 'SIGTTOU', - 'worker-count-up' => 'SIGTTIN' - }.freeze - - # commands that cannot be used in a request - NO_REQ_COMMANDS = %w[info reopen-log worker-count-down worker-count-up].freeze - - # @version 5.0.0 - PRINTABLE_COMMANDS = %w[gc-stats stats thread-backtraces].freeze - - def initialize(argv, stdout=STDOUT, stderr=STDERR, env: ENV) - @state = nil - @quiet = false - @pidfile = nil - @pid = nil - @control_url = nil - @control_auth_token = nil - @config_file = nil - @command = nil - @environment = env['APP_ENV'] || env['RACK_ENV'] || env['RAILS_ENV'] - - @argv = argv.dup - @stdout = stdout - @stderr = stderr - @cli_options = {} - - opts = OptionParser.new do |o| - o.banner = "Usage: pumactl (-p PID | -P pidfile | -S status_file | -C url -T token | -F config.rb) (#{CMD_PATH_SIG_MAP.keys.join("|")})" - - o.on "-S", "--state PATH", "Where the state file to use is" do |arg| - @state = arg - end - - o.on "-Q", "--quiet", "Do not display messages" do |arg| - @quiet = true - end - - o.on "-P", "--pidfile PATH", "Pid file" do |arg| - @pidfile = arg - end - - o.on "-p", "--pid PID", "Pid" do |arg| - @pid = arg.to_i - end - - o.on "-C", "--control-url URL", "The bind url to use for the control server" do |arg| - @control_url = arg - end - - o.on "-T", "--control-token TOKEN", "The token to use as authentication for the control server" do |arg| - @control_auth_token = arg - end - - o.on "-F", "--config-file PATH", "Puma config script" do |arg| - @config_file = arg - end - - o.on "-e", "--environment ENVIRONMENT", - "The environment to run the Rack app on (default development)" do |arg| - @environment = arg - end - - o.on_tail("-H", "--help", "Show this message") do - @stdout.puts o - exit - end - - o.on_tail("-V", "--version", "Show version") do - @stdout.puts Const::PUMA_VERSION - exit - end - end - - opts.order!(argv) { |a| opts.terminate a } - opts.parse! - - @command = argv.shift - - # check presence of command - unless @command - raise "Available commands: #{CMD_PATH_SIG_MAP.keys.join(", ")}" - end - - unless CMD_PATH_SIG_MAP.key? @command - raise "Invalid command: #{@command}" - end - - unless @config_file == '-' - environment = @environment || 'development' - - if @config_file.nil? - @config_file = %W(config/puma/#{environment}.rb config/puma.rb).find do |f| - File.exist?(f) - end - end - - if @config_file - require_relative 'configuration' - require_relative 'log_writer' - - config = Puma::Configuration.new({ config_files: [@config_file] }, {} , env) - config.load - @state ||= config.options[:state] - @control_url ||= config.options[:control_url] - @control_auth_token ||= config.options[:control_auth_token] - @pidfile ||= config.options[:pidfile] - end - end - rescue => e - @stdout.puts e.message - exit 1 - end - - def message(msg) - @stdout.puts msg unless @quiet - end - - def prepare_configuration - if @state - unless File.exist? @state - raise "State file not found: #{@state}" - end - - require_relative 'state_file' - - sf = Puma::StateFile.new - sf.load @state - - @control_url = sf.control_url - @control_auth_token = sf.control_auth_token - @pid = sf.pid - elsif @pidfile - # get pid from pid_file - @pid = File.read(@pidfile, mode: 'rb:UTF-8').to_i - end - end - - def send_request - uri = URI.parse @control_url - - host = uri.host - - # create server object by scheme - server = - case uri.scheme - when 'ssl' - require 'openssl' - host = host[1..-2] if host&.start_with? '[' - OpenSSL::SSL::SSLSocket.new( - TCPSocket.new(host, uri.port), - OpenSSL::SSL::SSLContext.new) - .tap { |ssl| ssl.sync_close = true } # default is false - .tap(&:connect) - when 'tcp' - host = host[1..-2] if host&.start_with? '[' - TCPSocket.new host, uri.port - when 'unix' - # check for abstract UNIXSocket - UNIXSocket.new(@control_url.start_with?('unix://@') ? - "\0#{host}#{uri.path}" : "#{host}#{uri.path}") - else - raise "Invalid scheme: #{uri.scheme}" - end - - if @command == 'status' - message 'Puma is started' - else - url = "/#{@command}" - - if @control_auth_token - url = url + "?token=#{@control_auth_token}" - end - - server.syswrite "GET #{url} HTTP/1.0\r\n\r\n" - - unless data = server.read - raise 'Server closed connection before responding' - end - - response = data.split("\r\n") - - if response.empty? - raise "Server sent empty response" - end - - @http, @code, @message = response.first.split(' ',3) - - if @code == '403' - raise 'Unauthorized access to server (wrong auth token)' - elsif @code == '404' - raise "Command error: #{response.last}" - elsif @code != '200' - raise "Bad response from server: #{@code}" - end - - message "Command #{@command} sent success" - message response.last if PRINTABLE_COMMANDS.include?(@command) - end - ensure - if server - if uri.scheme == 'ssl' - server.sysclose - else - server.close unless server.closed? - end - end - end - - def send_signal - unless @pid - raise 'Neither pid nor control url available' - end - - begin - sig = CMD_PATH_SIG_MAP[@command] - - if sig.nil? - @stdout.puts "'#{@command}' not available via pid only" - @stdout.flush unless @stdout.sync - return - elsif sig.start_with? 'SIG' - if Signal.list.key? sig.sub(/\ASIG/, '') - Process.kill sig, @pid - else - raise "Signal '#{sig}' not available'" - end - elsif @command == 'status' - begin - Process.kill 0, @pid - @stdout.puts 'Puma is started' - @stdout.flush unless @stdout.sync - rescue Errno::ESRCH - raise 'Puma is not running' - end - return - end - rescue SystemCallError - if @command == 'restart' - start - else - raise "No pid '#{@pid}' found" - end - end - - message "Command #{@command} sent success" - end - - def run - return start if @command == 'start' - prepare_configuration - - if Puma.windows? || @control_url && !NO_REQ_COMMANDS.include?(@command) - send_request - else - send_signal - end - - rescue => e - message e.message - exit 1 - end - - private - def start - require_relative 'cli' - - run_args = [] - - run_args += ["-S", @state] if @state - run_args += ["-q"] if @quiet - run_args += ["--pidfile", @pidfile] if @pidfile - run_args += ["--control-url", @control_url] if @control_url - run_args += ["--control-token", @control_auth_token] if @control_auth_token - run_args += ["-C", @config_file] if @config_file - run_args += ["-e", @environment] if @environment - - log_writer = Puma::LogWriter.new(@stdout, @stderr) - - # replace $0 because puma use it to generate restart command - puma_cmd = $0.gsub(/pumactl$/, 'puma') - $0 = puma_cmd if File.exist?(puma_cmd) - - cli = Puma::CLI.new run_args, log_writer - cli.run - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/detect.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/detect.rb deleted file mode 100644 index a233eb4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/detect.rb +++ /dev/null @@ -1,45 +0,0 @@ -# frozen_string_literal: true - -# This file can be loaded independently of puma.rb, so it cannot have any code -# that assumes puma.rb is loaded. - - -module Puma - # @version 5.2.1 - HAS_FORK = ::Process.respond_to? :fork - - HAS_NATIVE_IO_WAIT = ::IO.public_instance_methods(false).include? :wait_readable - - IS_JRUBY = Object.const_defined? :JRUBY_VERSION - - IS_OSX = RUBY_DESCRIPTION.include? 'darwin' - - IS_WINDOWS = RUBY_DESCRIPTION.match?(/mswin|ming|cygwin/) - - IS_LINUX = !(IS_OSX || IS_WINDOWS) - - # @version 5.2.0 - IS_MRI = RUBY_ENGINE == 'ruby' - - def self.jruby? - IS_JRUBY - end - - def self.osx? - IS_OSX - end - - def self.windows? - IS_WINDOWS - end - - # @version 5.0.0 - def self.mri? - IS_MRI - end - - # @version 5.0.0 - def self.forkable? - HAS_FORK - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/dsl.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/dsl.rb deleted file mode 100644 index c90b411..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/dsl.rb +++ /dev/null @@ -1,1438 +0,0 @@ -# frozen_string_literal: true - -require_relative 'const' -require_relative 'util' - -module Puma - # The methods that are available for use inside the configuration file. - # These same methods are used in Puma cli and the rack handler - # internally. - # - # Used manually (via CLI class): - # - # config = Configuration.new({}) do |user_config| - # user_config.port 3001 - # end - # config.load - # - # puts config.options[:binds] # => "tcp://127.0.0.1:3001" - # - # Used to load file: - # - # $ cat puma_config.rb - # port 3002 - # - # Resulting configuration: - # - # config = Configuration.new(config_file: "puma_config.rb") - # config.load - # - # puts config.options[:binds] # => "tcp://127.0.0.1:3002" - # - # You can also find many examples being used by the test suite in - # +test/config+. - # - # Puma v6 adds the option to specify a key name (String or Symbol) to the - # hooks that run inside the forked workers. All the hooks run inside the - # {Puma::Cluster::Worker#run} method. - # - # Previously, the worker index and the LogWriter instance were passed to the - # hook blocks/procs. If a key name is specified, a hash is passed as the last - # parameter. This allows storage of data, typically objects that are created - # before the worker that need to be passed to the hook when the worker is shutdown. - # - # The following hooks have been updated: - # - # | DSL Method | Options Key | Fork Block Location | - # | on_worker_boot | :before_worker_boot | inside, before | - # | on_worker_shutdown | :before_worker_shutdown | inside, after | - # | on_refork | :before_refork | inside | - # | after_refork | :after_refork | inside | - # - class DSL - ON_WORKER_KEY = [String, Symbol].freeze - - # Convenience method so logic can be used in CI. - # - # @see ssl_bind - # - def self.ssl_bind_str(host, port, opts) - verify = opts.fetch(:verify_mode, 'none').to_s - - tls_str = - if opts[:no_tlsv1_1] then '&no_tlsv1_1=true' - elsif opts[:no_tlsv1] then '&no_tlsv1=true' - else '' - end - - ca_additions = "&ca=#{Puma::Util.escape(opts[:ca])}" if ['peer', 'force_peer'].include?(verify) - - low_latency_str = opts.key?(:low_latency) ? "&low_latency=#{opts[:low_latency]}" : '' - backlog_str = opts[:backlog] ? "&backlog=#{Integer(opts[:backlog])}" : '' - - if defined?(JRUBY_VERSION) - cipher_suites = opts[:ssl_cipher_list] ? "&ssl_cipher_list=#{opts[:ssl_cipher_list]}" : nil # old name - cipher_suites = "#{cipher_suites}&cipher_suites=#{opts[:cipher_suites]}" if opts[:cipher_suites] - protocols = opts[:protocols] ? "&protocols=#{opts[:protocols]}" : nil - - keystore_additions = "keystore=#{opts[:keystore]}&keystore-pass=#{opts[:keystore_pass]}" - keystore_additions = "#{keystore_additions}&keystore-type=#{opts[:keystore_type]}" if opts[:keystore_type] - if opts[:truststore] - truststore_additions = "&truststore=#{opts[:truststore]}" - truststore_additions = "#{truststore_additions}&truststore-pass=#{opts[:truststore_pass]}" if opts[:truststore_pass] - truststore_additions = "#{truststore_additions}&truststore-type=#{opts[:truststore_type]}" if opts[:truststore_type] - end - - "ssl://#{host}:#{port}?#{keystore_additions}#{truststore_additions}#{cipher_suites}#{protocols}" \ - "&verify_mode=#{verify}#{tls_str}#{ca_additions}#{backlog_str}" - else - ssl_cipher_filter = opts[:ssl_cipher_filter] ? "&ssl_cipher_filter=#{opts[:ssl_cipher_filter]}" : nil - ssl_ciphersuites = opts[:ssl_ciphersuites] ? "&ssl_ciphersuites=#{opts[:ssl_ciphersuites]}" : nil - v_flags = (ary = opts[:verification_flags]) ? "&verification_flags=#{Array(ary).join ','}" : nil - - cert_flags = (cert = opts[:cert]) ? "cert=#{Puma::Util.escape(cert)}" : nil - key_flags = (key = opts[:key]) ? "&key=#{Puma::Util.escape(key)}" : nil - password_flags = (password_command = opts[:key_password_command]) ? "&key_password_command=#{Puma::Util.escape(password_command)}" : nil - - reuse_flag = - if (reuse = opts[:reuse]) - if reuse == true - '&reuse=dflt' - elsif reuse.is_a?(Hash) && (reuse.key?(:size) || reuse.key?(:timeout)) - val = +'' - if (size = reuse[:size]) && Integer === size - val << size.to_s - end - if (timeout = reuse[:timeout]) && Integer === timeout - val << ",#{timeout}" - end - if val.empty? - nil - else - "&reuse=#{val}" - end - else - nil - end - else - nil - end - - "ssl://#{host}:#{port}?#{cert_flags}#{key_flags}#{password_flags}#{ssl_cipher_filter}#{ssl_ciphersuites}" \ - "#{reuse_flag}&verify_mode=#{verify}#{tls_str}#{ca_additions}#{v_flags}#{backlog_str}#{low_latency_str}" - end - end - - def initialize(options, config) - @config = config - @options = options - - @plugins = [] - end - - def _load_from(path) - if path - @path = path - instance_eval(File.read(path), path, 1) - end - ensure - _offer_plugins - end - - def _offer_plugins - @plugins.each do |o| - if o.respond_to? :config - @options.shift - o.config self - end - end - - @plugins.clear - end - - def set_default_host(host) - @options[:default_host] = host - end - - def default_host - @options[:default_host] || Configuration::DEFAULTS[:tcp_host] - end - - def inject(&blk) - instance_eval(&blk) - end - - def get(key,default=nil) - @options[key.to_sym] || default - end - - # Load the named plugin for use by this configuration. - # - # @example - # plugin :tmp_restart - # - def plugin(name) - @plugins << @config.load_plugin(name) - end - - # Use an object or block as the rack application. This allows the - # configuration file to be the application itself. - # - # @example - # app do |env| - # body = 'Hello, World!' - # - # [ - # 200, - # { - # 'Content-Type' => 'text/plain', - # 'Content-Length' => body.length.to_s - # }, - # [body] - # ] - # end - # - # @see Puma::Configuration#app - # - def app(obj=nil, &block) - obj ||= block - - raise "Provide either a #call'able or a block" unless obj - - @options[:app] = obj - end - - # Start the Puma control rack application on +url+. This application can - # be communicated with to control the main server. Additionally, you can - # provide an authentication token, so all requests to the control server - # will need to include that token as a query parameter. This allows for - # simple authentication. - # - # Check out {Puma::App::Status} to see what the app has available. - # - # @example - # activate_control_app 'unix:///var/run/pumactl.sock' - # @example - # activate_control_app 'unix:///var/run/pumactl.sock', { auth_token: '12345' } - # @example - # activate_control_app 'unix:///var/run/pumactl.sock', { no_token: true } - # - def activate_control_app(url="auto", opts={}) - if url == "auto" - path = Configuration.temp_path - @options[:control_url] = "unix://#{path}" - @options[:control_url_temp] = path - else - @options[:control_url] = url - end - - if opts[:no_token] - # We need to use 'none' rather than :none because this value will be - # passed on to an instance of OptionParser, which doesn't support - # symbols as option values. - # - # See: https://github.com/puma/puma/issues/1193#issuecomment-305995488 - auth_token = 'none' - else - auth_token = opts[:auth_token] - auth_token ||= Configuration.random_token - end - - @options[:control_auth_token] = auth_token - @options[:control_url_umask] = opts[:umask] if opts[:umask] - end - - # Load additional configuration from a file. - # Files get loaded later via Configuration#load. - # - # @example - # load 'config/puma/production.rb' - # - def load(file) - @options[:config_files] ||= [] - @options[:config_files] << file - end - - # Bind the server to +url+. "tcp://", "unix://" and "ssl://" are the only - # accepted protocols. Multiple urls can be bound to, calling +bind+ does - # not overwrite previous bindings. - # - # The default is "tcp://0.0.0.0:9292". - # - # You can use query parameters within the url to specify options: - # - # * Set the socket backlog depth with +backlog+, default is 1024. - # * Set up an SSL certificate with +key+ & +cert+. - # * Set up an SSL certificate for mTLS with +key+, +cert+, +ca+ and +verify_mode+. - # * Set whether to optimize for low latency instead of throughput with - # +low_latency+, default is to not optimize for low latency. This is done - # via +Socket::TCP_NODELAY+. - # * Set socket permissions with +umask+. - # - # @example Backlog depth - # bind 'unix:///var/run/puma.sock?backlog=512' - # @example SSL cert - # bind 'ssl://127.0.0.1:9292?key=key.key&cert=cert.pem' - # @example SSL cert for mutual TLS (mTLS) - # bind 'ssl://127.0.0.1:9292?key=key.key&cert=cert.pem&ca=ca.pem&verify_mode=force_peer' - # @example Disable optimization for low latency - # bind 'tcp://0.0.0.0:9292?low_latency=false' - # @example Socket permissions - # bind 'unix:///var/run/puma.sock?umask=0111' - # - # @see Puma::Runner#load_and_bind - # @see Puma::Cluster#run - # - def bind(url) - @options[:binds] ||= [] - @options[:binds] << url - end - - def clear_binds! - @options[:binds] = [] - end - - # Bind to (systemd) activated sockets, regardless of configured binds. - # - # Systemd can present sockets as file descriptors that are already opened. - # By default Puma will use these but only if it was explicitly told to bind - # to the socket. If not, it will close the activated sockets. This means - # all configuration is duplicated. - # - # Binds can contain additional configuration, but only SSL config is really - # relevant since the unix and TCP socket options are ignored. - # - # This means there is a lot of duplicated configuration for no additional - # value in most setups. This method tells the launcher to bind to all - # activated sockets, regardless of existing bind. - # - # To clear configured binds, the value only can be passed. This will clear - # out any binds that may have been configured. - # - # @example Use any systemd activated sockets as well as configured binds - # bind_to_activated_sockets - # - # @example Only bind to systemd activated sockets, ignoring other binds - # bind_to_activated_sockets 'only' - # - def bind_to_activated_sockets(bind=true) - @options[:bind_to_activated_sockets] = bind - end - - # Define the TCP port to bind to. Use `bind` for more advanced options. - # - # The default is +9292+. - # - # @example - # port 3000 - # - def port(port, host=nil) - host ||= default_host - bind URI::Generic.build(scheme: 'tcp', host: host, port: Integer(port)).to_s - end - - # Define how long the tcp socket stays open, if no data has been received. - # - # The default is 30 seconds. - # - # @example - # first_data_timeout 40 - # - # @see Puma::Server.new - # - def first_data_timeout(seconds) - @options[:first_data_timeout] = Integer(seconds) - end - - # Define how long persistent connections can be idle before Puma closes them. - # - # The default is 20 seconds. - # - # @example - # persistent_timeout 30 - # - # @see Puma::Server.new - # - def persistent_timeout(seconds) - @options[:persistent_timeout] = Integer(seconds) - end - - # If a new request is not received within this number of seconds, begin shutting down. - # - # The default is +nil+. - # - # @example - # idle_timeout 60 - # - # @see Puma::Server.new - # - def idle_timeout(seconds) - @options[:idle_timeout] = Integer(seconds) - end - - # Work around leaky apps that leave garbage in Thread locals - # across requests. - # - # The default is +false+. - # - # @example - # clean_thread_locals - # - def clean_thread_locals(which=true) - @options[:clean_thread_locals] = which - end - - # When shutting down, drain the accept socket of pending connections and - # process them. This loops over the accept socket until there are no more - # read events and then stops looking and waits for the requests to finish. - # - # @see Puma::Server#graceful_shutdown - # - def drain_on_shutdown(which=true) - @options[:drain_on_shutdown] = which - end - - # Set the environment in which the rack's app will run. The value must be - # a string. - # - # The default is "development". - # - # @example - # environment 'production' - # - def environment(environment) - @options[:environment] = environment - end - - # How long to wait for threads to stop when shutting them down. - # Specifying :immediately will cause Puma to kill the threads immediately. - # Otherwise the value is the number of seconds to wait. - # - # Puma always waits a few seconds after killing a thread for it to try - # to finish up it's work, even in :immediately mode. - # - # The default is +:forever+. - # - # @see Puma::Server#graceful_shutdown - # - def force_shutdown_after(val=:forever) - i = case val - when :forever - -1 - when :immediately - 0 - else - Float(val) - end - - @options[:force_shutdown_after] = i - end - - # Code to run before doing a restart. This code should - # close log files, database connections, etc. - # - # This can be called multiple times to add code each time. - # - # @example - # on_restart do - # puts 'On restart...' - # end - # - def on_restart(&block) - process_hook :on_restart, nil, block, 'on_restart' - end - - # Command to use to restart Puma. This should be just how to - # load Puma itself (ie. 'ruby -Ilib bin/puma'), not the arguments - # to Puma, as those are the same as the original process. - # - # @example - # restart_command '/u/app/lolcat/bin/restart_puma' - # - def restart_command(cmd) - @options[:restart_cmd] = cmd.to_s - end - - # Store the pid of the server in the file at "path". - # - # @example - # pidfile '/u/apps/lolcat/tmp/pids/puma.pid' - # - def pidfile(path) - @options[:pidfile] = path.to_s - end - - # Disable request logging, the inverse of `log_requests`. - # - # The default is +true+. - # - # @example - # quiet - # - def quiet(which=true) - @options[:log_requests] = !which - end - - # Enable request logging, the inverse of `quiet`. - # - # The default is +false+. - # - # @example - # log_requests - # - def log_requests(which=true) - @options[:log_requests] = which - end - - # Pass in a custom logging class instance - # - # @example - # custom_logger Logger.new('t.log') - # - def custom_logger(custom_logger) - @options[:custom_logger] = custom_logger - end - - # Show debugging info - # - # The default is +false+. - # - # @example - # debug - # - def debug - @options[:debug] = true - end - - # Load +path+ as a rackup file. - # - # The default is "config.ru". - # - # @example - # rackup '/u/apps/lolcat/config.ru' - # - def rackup(path) - @options[:rackup] ||= path.to_s - end - - # Allows setting `env['rack.url_scheme']`. - # Only necessary if X-Forwarded-Proto is not being set by your proxy - # Normal values are 'http' or 'https'. - # - def rack_url_scheme(scheme=nil) - @options[:rack_url_scheme] = scheme - end - - # Enable HTTP 103 Early Hints responses. - # - # The default is +nil+. - # - # @example - # early_hints - # - def early_hints(answer=true) - @options[:early_hints] = answer - end - - # Redirect +STDOUT+ and +STDERR+ to files specified. The +append+ parameter - # specifies whether the output is appended. - # - # The default is +false+. - # - # @example - # stdout_redirect '/app/lolcat/log/stdout', '/app/lolcat/log/stderr' - # @example - # stdout_redirect '/app/lolcat/log/stdout', '/app/lolcat/log/stderr', true - # - def stdout_redirect(stdout=nil, stderr=nil, append=false) - @options[:redirect_stdout] = stdout - @options[:redirect_stderr] = stderr - @options[:redirect_append] = append - end - - def log_formatter(&block) - @options[:log_formatter] = block - end - - # Configure the number of threads to use to answer requests. - # - # It can be a single fixed number, or a +min+ and a +max+. - # - # The default is the environment variables +PUMA_MIN_THREADS+ / +PUMA_MAX_THREADS+ - # (or +MIN_THREADS+ / +MAX_THREADS+ if the +PUMA_+ variables aren't set). - # - # If these environment variables aren't set, the default is "0, 5" in MRI or "0, 16" for other interpreters. - # - # @example - # threads 5 - # @example - # threads 0, 16 - # @example - # threads 5, 5 - # - def threads(min, max = min) - min = Integer(min) - max = Integer(max) - if min > max - raise "The minimum (#{min}) number of threads must be less than or equal to the max (#{max})" - end - - if max < 1 - raise "The maximum number of threads (#{max}) must be greater than 0" - end - - @options[:min_threads] = min - @options[:max_threads] = max - end - - # Instead of using +bind+ and manually constructing a URI like: - # - # bind 'ssl://127.0.0.1:9292?key=key_path&cert=cert_path' - # - # you can use the this method. - # - # When binding on localhost you don't need to specify +cert+ and +key+, - # Puma will assume you are using the +localhost+ gem and try to load the - # appropriate files. - # - # When using the options hash parameter, the `reuse:` value is either - # `true`, which sets reuse 'on' with default values, or a hash, with `:size` - # and/or `:timeout` keys, each with integer values. - # - # The `cert:` options hash parameter can be the path to a certificate - # file including all intermediate certificates in PEM format. - # - # The `cert_pem:` options hash parameter can be String containing the - # cerificate and all intermediate certificates in PEM format. - # - # @example - # ssl_bind '127.0.0.1', '9292', { - # cert: path_to_cert, - # key: path_to_key, - # ssl_cipher_filter: cipher_filter, # optional - # ssl_ciphersuites: ciphersuites, # optional - # verify_mode: verify_mode, # default 'none' - # verification_flags: flags, # optional, not supported by JRuby - # reuse: true # optional - # } - # - # @example Using self-signed certificate with the +localhost+ gem: - # ssl_bind '127.0.0.1', '9292' - # - # @example Alternatively, you can provide +cert_pem+ and +key_pem+: - # ssl_bind '127.0.0.1', '9292', { - # cert_pem: File.read(path_to_cert), - # key_pem: File.read(path_to_key), - # reuse: {size: 2_000, timeout: 20} # optional - # } - # - # @example For JRuby, two keys are required: +keystore+ & +keystore_pass+ - # ssl_bind '127.0.0.1', '9292', { - # keystore: path_to_keystore, - # keystore_pass: password, - # ssl_cipher_list: cipher_list, # optional - # verify_mode: verify_mode # default 'none' - # } - # - def ssl_bind(host, port, opts = {}) - add_pem_values_to_options_store(opts) - bind self.class.ssl_bind_str(host, port, opts) - end - - # Use +path+ as the file to store the server info state. This is - # used by +pumactl+ to query and control the server. - # - # @example - # state_path '/u/apps/lolcat/tmp/pids/puma.state' - # - def state_path(path) - @options[:state] = path.to_s - end - - # Use +permission+ to restrict permissions for the state file. - # - # @example - # state_permission 0600 - # - def state_permission(permission) - @options[:state_permission] = permission - end - - # How many worker processes to run. Typically this is set to - # the number of available cores. - # - # The default is the value of the environment variable +WEB_CONCURRENCY+ if - # set, otherwise 0. - # - # @note Cluster mode only. - # - # @example - # workers 2 - # - # @see Puma::Cluster - # - def workers(count) - @options[:workers] = count.to_i - end - - # Disable warning message when running in cluster mode with a single worker. - # - # Cluster mode has some overhead of running an additional 'control' process - # in order to manage the cluster. If only running a single worker it is - # likely not worth paying that overhead vs running in single mode with - # additional threads instead. - # - # There are some scenarios where running cluster mode with a single worker - # may still be warranted and valid under certain deployment scenarios, see - # https://github.com/puma/puma/issues/2534 - # - # Moving from workers = 1 to workers = 0 will save 10-30% of memory use. - # - # The default is +false+. - # - # @note Cluster mode only. - # - # @example - # silence_single_worker_warning - # - def silence_single_worker_warning - @options[:silence_single_worker_warning] = true - end - - # Disable warning message when running single mode with callback hook defined. - # - # The default is +false+. - # - # @example - # silence_fork_callback_warning - # - def silence_fork_callback_warning - @options[:silence_fork_callback_warning] = true - end - - # Code to run immediately before master process - # forks workers (once on boot). These hooks can block if necessary - # to wait for background operations unknown to Puma to finish before - # the process terminates. - # This can be used to close any connections to remote servers (database, - # Redis, ...) that were opened when preloading the code. - # - # This can be called multiple times to add several hooks. - # - # @note Cluster mode only. - # - # @example - # before_fork do - # puts "Starting workers..." - # end - # - def before_fork(&block) - warn_if_in_single_mode('before_fork') - - process_hook :before_fork, nil, block, 'before_fork' - end - - # Code to run in a worker when it boots to setup - # the process before booting the app. - # - # This can be called multiple times to add several hooks. - # - # @note Cluster mode only. - # - # @example - # on_worker_boot do - # puts 'Before worker boot...' - # end - # - def on_worker_boot(key = nil, &block) - warn_if_in_single_mode('on_worker_boot') - - process_hook :before_worker_boot, key, block, 'on_worker_boot' - end - - # Code to run immediately before a worker shuts - # down (after it has finished processing HTTP requests). The worker's - # index is passed as an argument. These hooks - # can block if necessary to wait for background operations unknown - # to Puma to finish before the process terminates. - # - # This can be called multiple times to add several hooks. - # - # @note Cluster mode only. - # - # @example - # on_worker_shutdown do - # puts 'On worker shutdown...' - # end - # - def on_worker_shutdown(key = nil, &block) - warn_if_in_single_mode('on_worker_shutdown') - - process_hook :before_worker_shutdown, key, block, 'on_worker_shutdown' - end - - # Code to run in the master right before a worker is started. The worker's - # index is passed as an argument. - # - # This can be called multiple times to add several hooks. - # - # @note Cluster mode only. - # - # @example - # on_worker_fork do - # puts 'Before worker fork...' - # end - # - def on_worker_fork(&block) - warn_if_in_single_mode('on_worker_fork') - - process_hook :before_worker_fork, nil, block, 'on_worker_fork' - end - - # Code to run in the master after a worker has been started. The worker's - # index is passed as an argument. - # - # This is called everytime a worker is to be started. - # - # @note Cluster mode only. - # - # @example - # after_worker_fork do - # puts 'After worker fork...' - # end - # - def after_worker_fork(&block) - warn_if_in_single_mode('after_worker_fork') - - process_hook :after_worker_fork, nil, block, 'after_worker_fork' - end - - alias_method :after_worker_boot, :after_worker_fork - - # Code to run after puma is booted (works for both single and cluster modes). - # - # @example - # on_booted do - # puts 'After booting...' - # end - # - def on_booted(&block) - @config.options[:events].on_booted(&block) - end - - # Code to run after puma is stopped (works for both single and cluster modes). - # - # @example - # on_stopped do - # puts 'After stopping...' - # end - # - def on_stopped(&block) - @config.options[:events].on_stopped(&block) - end - - # When `fork_worker` is enabled, code to run in Worker 0 - # before all other workers are re-forked from this process, - # after the server has temporarily stopped serving requests - # (once per complete refork cycle). - # - # This can be used to trigger extra garbage-collection to maximize - # copy-on-write efficiency, or close any connections to remote servers - # (database, Redis, ...) that were opened while the server was running. - # - # This can be called multiple times to add several hooks. - # - # @note Cluster mode with `fork_worker` enabled only. - # - # @example - # on_refork do - # 3.times {GC.start} - # end - # - def on_refork(key = nil, &block) - warn_if_in_single_mode('on_refork') - - process_hook :before_refork, key, block, 'on_refork' - end - - # When `fork_worker` is enabled, code to run in Worker 0 - # after all other workers are re-forked from this process, - # after the server has temporarily stopped serving requests - # (once per complete refork cycle). - # - # This can be used to re-open any connections to remote servers - # (database, Redis, ...) that were closed via on_refork. - # - # This can be called multiple times to add several hooks. - # - # @note Cluster mode with `fork_worker` enabled only. - # - # @example - # after_refork do - # puts 'After refork...' - # end - # - def after_refork(key = nil, &block) - process_hook :after_refork, key, block, 'after_refork' - end - - # Provide a block to be executed just before a thread is added to the thread - # pool. Be careful: while the block executes, thread creation is delayed, and - # probably a request will have to wait too! The new thread will not be added to - # the threadpool until the provided block returns. - # - # Return values are ignored. - # Raising an exception will log a warning. - # - # This hook is useful for doing something when the thread pool grows. - # - # This can be called multiple times to add several hooks. - # - # @example - # on_thread_start do - # puts 'On thread start...' - # end - # - def on_thread_start(&block) - process_hook :before_thread_start, nil, block, 'on_thread_start' - end - - # Provide a block to be executed after a thread is trimmed from the thread - # pool. Be careful: while this block executes, Puma's main loop is - # blocked, so no new requests will be picked up. - # - # This hook only runs when a thread in the threadpool is trimmed by Puma. - # It does not run when a thread dies due to exceptions or any other cause. - # - # Return values are ignored. - # Raising an exception will log a warning. - # - # This hook is useful for cleaning up thread local resources when a thread - # is trimmed. - # - # This can be called multiple times to add several hooks. - # - # @example - # on_thread_exit do - # puts 'On thread exit...' - # end - # - def on_thread_exit(&block) - process_hook :before_thread_exit, nil, block, 'on_thread_exit' - end - - # Code to run out-of-band when the worker is idle. - # These hooks run immediately after a request has finished - # processing and there are no busy threads on the worker. - # The worker doesn't accept new requests until this code finishes. - # - # This hook is useful for running out-of-band garbage collection - # or scheduling asynchronous tasks to execute after a response. - # - # This can be called multiple times to add several hooks. - # - def out_of_band(&block) - process_hook :out_of_band, nil, block, 'out_of_band' - end - - # The directory to operate out of. - # - # The default is the current directory. - # - # @example - # directory '/u/apps/lolcat' - # - def directory(dir) - @options[:directory] = dir.to_s - end - - # Preload the application before starting the workers; this conflicts with - # phased restart feature. - # - # The default is +true+ if your app uses more than 1 worker. - # - # @note Cluster mode only. - # - # @example - # preload_app! - # - def preload_app!(answer=true) - @options[:preload_app] = answer - end - - # Use +obj+ or +block+ as the low level error handler. This allows the - # configuration file to change the default error on the server. - # - # @example - # lowlevel_error_handler do |err| - # [200, {}, ["error page"]] - # end - # - def lowlevel_error_handler(obj=nil, &block) - obj ||= block - raise "Provide either a #call'able or a block" unless obj - @options[:lowlevel_error_handler] = obj - end - - # This option is used to allow your app and its gems to be - # properly reloaded when not using preload. - # - # When set, if Puma detects that it's been invoked in the - # context of Bundler, it will cleanup the environment and - # re-run itself outside the Bundler environment, but directly - # using the files that Bundler has setup. - # - # This means that Puma is now decoupled from your Bundler - # context and when each worker loads, it will be loading a - # new Bundler context and thus can float around as the release - # dictates. - # - # @note This is incompatible with +preload_app!+. - # @note This is only supported for RubyGems 2.2+ - # - # @see extra_runtime_dependencies - # - def prune_bundler(answer=true) - @options[:prune_bundler] = answer - end - - # Raises a SignalException when SIGTERM is received. In environments where - # SIGTERM is something expected, you can suppress these with this option. - # - # This can be useful for example in Kubernetes, where rolling restart is - # guaranteed usually on the infrastructure level. - # - # The default is +true+. - # - # @example - # raise_exception_on_sigterm false - # - # @see Puma::Launcher#setup_signals - # @see Puma::Cluster#setup_signals - # - def raise_exception_on_sigterm(answer=true) - @options[:raise_exception_on_sigterm] = answer - end - - # When using prune_bundler, if extra runtime dependencies need to be loaded to - # initialize your app, then this setting can be used. This includes any Puma plugins. - # - # Before bundler is pruned, the gem names supplied will be looked up in the bundler - # context and then loaded again after bundler is pruned. - # Only applies if prune_bundler is used. - # - # @example - # extra_runtime_dependencies ['gem_name_1', 'gem_name_2'] - # @example - # extra_runtime_dependencies ['puma_worker_killer', 'puma-heroku'] - # - # @see Puma::Launcher#extra_runtime_deps_directories - # - def extra_runtime_dependencies(answer = []) - @options[:extra_runtime_dependencies] = Array(answer) - end - - # Additional text to display in process listing. - # - # If you do not specify a tag, Puma will infer it. If you do not want Puma - # to add a tag, use an empty string. - # - # The default is the current file or directory base name. - # - # @example - # tag 'app name' - # @example - # tag '' - # - def tag(string) - @options[:tag] = string.to_s - end - - # Change the default interval for checking workers. - # - # The default is 5 seconds. - # - # @note Cluster mode only. - # - # @example - # worker_check_interval 10 - # - # @see Puma::Cluster#check_workers - # - def worker_check_interval(interval) - @options[:worker_check_interval] = Integer(interval) - end - - # Verifies that all workers have checked in to the master process within - # the given timeout. If not the worker process will be restarted. This is - # not a request timeout, it is to protect against a hung or dead process. - # Setting this value will not protect against slow requests. - # - # This value must be greater than worker_check_interval. - # - # The default is 60 seconds. - # - # @note Cluster mode only. - # - # @example - # worker_timeout 60 - # - # @see Puma::Cluster::Worker#ping_timeout - # - def worker_timeout(timeout) - timeout = Integer(timeout) - min = @options.fetch(:worker_check_interval, Configuration::DEFAULTS[:worker_check_interval]) - - if timeout <= min - raise "The minimum worker_timeout must be greater than the worker reporting interval (#{min})" - end - - @options[:worker_timeout] = timeout - end - - # Change the default worker timeout for booting. - # - # The default is the value of `worker_timeout`. - # - # @note Cluster mode only. - # - # @example - # worker_boot_timeout 60 - # - # @see Puma::Cluster::Worker#ping_timeout - # - def worker_boot_timeout(timeout) - @options[:worker_boot_timeout] = Integer(timeout) - end - - # Set the timeout for worker shutdown. - # - # The default is 30 seconds. - # - # @note Cluster mode only. - # - # @example - # worker_shutdown_timeout 90 - # - # @see Puma::Cluster::Worker#term - # - def worker_shutdown_timeout(timeout) - @options[:worker_shutdown_timeout] = Integer(timeout) - end - - # Set the strategy for worker culling. - # - # There are two possible values: - # - # 1. **:youngest** - the youngest workers (i.e. the workers that were - # the most recently started) will be culled. - # 2. **:oldest** - the oldest workers (i.e. the workers that were started - # the longest time ago) will be culled. - # - # The default is +:youngest+. - # - # @note Cluster mode only. - # - # @example - # worker_culling_strategy :oldest - # - # @see Puma::Cluster#cull_workers - # - def worker_culling_strategy(strategy) - strategy = strategy.to_sym - - if ![:youngest, :oldest].include?(strategy) - raise "Invalid value for worker_culling_strategy - #{strategy}" - end - - @options[:worker_culling_strategy] = strategy - end - - # When set to true, workers accept all requests - # and queue them before passing them to the handlers. - # When set to false, each worker process accepts exactly as - # many requests as it is configured to simultaneously handle. - # - # Queueing requests generally improves performance. In some - # cases, such as a single threaded application, it may be - # better to ensure requests get balanced across workers. - # - # Note that setting this to false disables HTTP keepalive and - # slow clients will occupy a handler thread while the request - # is being sent. A reverse proxy, such as nginx, can handle - # slow clients and queue requests before they reach Puma. - # - # The default is +true+. - # - # @see Puma::Server - # - def queue_requests(answer=true) - @options[:queue_requests] = answer - end - - # When a shutdown is requested, the backtraces of all the - # threads will be written to $stdout. This can help figure - # out why shutdown is hanging. - # - def shutdown_debug(val=true) - @options[:shutdown_debug] = val - end - - - # Attempts to route traffic to less-busy workers by causing them to delay - # listening on the socket, allowing workers which are not processing any - # requests to pick up new requests first. - # - # The default is 0.005 seconds. - # - # Only works on MRI. For all other interpreters, this setting does nothing. - # - # @see Puma::Server#handle_servers - # @see Puma::ThreadPool#wait_for_less_busy_worker - # - def wait_for_less_busy_worker(val=0.005) - @options[:wait_for_less_busy_worker] = val.to_f - end - - # Control how the remote address of the connection is set. This - # is configurable because to calculate the true socket peer address - # a kernel syscall is required which for very fast rack handlers - # slows down the handling significantly. - # - # There are 5 possible values: - # - # 1. **:socket** - read the peername from the socket using the - # syscall. This is the normal behavior. If this fails for any reason (e.g., - # if the peer disconnects between the connection being accepted and the getpeername - # system call), Puma will return "0.0.0.0" - # 2. **:localhost** - set the remote address to "127.0.0.1" - # 3. **header: **- set the remote address to the value of the - # provided http header. For instance: - # `set_remote_address header: "X-Real-IP"`. - # Only the first word (as separated by spaces or comma) is used, allowing - # headers such as X-Forwarded-For to be used as well. If this header is absent, - # Puma will fall back to the behavior of :socket - # 4. **proxy_protocol: :v1**- set the remote address to the value read from the - # HAproxy PROXY protocol, version 1. If the request does not have the PROXY - # protocol attached to it, will fall back to :socket - # 5. **\** - this allows you to hardcode remote address to any value - # you wish. Because Puma never uses this field anyway, it's format is - # entirely in your hands. - # - # The default is +:socket+. - # - # @example - # set_remote_address :localhost - # - def set_remote_address(val=:socket) - case val - when :socket - @options[:remote_address] = val - when :localhost - @options[:remote_address] = :value - @options[:remote_address_value] = "127.0.0.1".freeze - when String - @options[:remote_address] = :value - @options[:remote_address_value] = val - when Hash - if hdr = val[:header] - @options[:remote_address] = :header - @options[:remote_address_header] = "HTTP_" + hdr.upcase.tr("-", "_") - elsif protocol_version = val[:proxy_protocol] - @options[:remote_address] = :proxy_protocol - protocol_version = protocol_version.downcase.to_sym - unless [:v1].include?(protocol_version) - raise "Invalid value for proxy_protocol - #{protocol_version.inspect}" - end - @options[:remote_address_proxy_protocol] = protocol_version - else - raise "Invalid value for set_remote_address - #{val.inspect}" - end - else - raise "Invalid value for set_remote_address - #{val}" - end - end - - # When enabled, workers will be forked from worker 0 instead of from the master process. - # This option is similar to `preload_app` because the app is preloaded before forking, - # but it is compatible with phased restart. - # - # This option also enables the `refork` command (SIGURG), which optimizes copy-on-write performance - # in a running app. - # - # A refork will automatically trigger once after the specified number of requests - # (default 1000), or pass 0 to disable auto refork. - # - # @note This is experimental. - # @note Cluster mode only. - # - def fork_worker(after_requests=1000) - @options[:fork_worker] = Integer(after_requests) - end - - # The number of requests to attempt inline before sending a client back to - # the reactor to be subject to normal ordering. - # - # The default is 10. - # - # @example - # max_fast_inline 20 - # - def max_fast_inline(num_of_requests) - @options[:max_fast_inline] = Float(num_of_requests) - end - - # When `true`, keep-alive connections are maintained on inbound requests. - # Enabling this setting reduces the number of TCP operations, reducing response - # times for connections that can send multiple requests in a single connection. - # - # When Puma receives more incoming connections than available Puma threads, - # enabling the keep-alive behavior may result in processing requests out-of-order, - # increasing overall response time variance. Increased response time variance - # means that the overall average of response times might not change, but more - # outliers will exist. Those long-tail outliers may significantly affect response - # times for some processed requests. - # - # When `false`, Puma closes the connection after each request, requiring the - # client to open a new request. Disabling this setting guarantees that requests - # will be processed in the order they are fully received, decreasing response - # variance and eliminating long-tail outliers caused by keep-alive behavior. - # The trade-off is that the number of TCP operations required will increase. - # - # The default is +true+. - # - # @example - # enable_keep_alives false - # - def enable_keep_alives(enabled=true) - @options[:enable_keep_alives] = enabled - end - - # Specify the backend for the IO selector. - # - # Provided values will be passed directly to +NIO::Selector.new+, with the - # exception of +:auto+ which will let nio4r choose the backend. - # - # Check the documentation of +NIO::Selector.backends+ for the list of valid - # options. Note that the available options on your system will depend on the - # operating system. If you want to use the pure Ruby backend (not - # recommended due to its comparatively low performance), set environment - # variable +NIO4R_PURE+ to +true+. - # - # The default is +:auto+. - # - # @see https://github.com/socketry/nio4r/blob/master/lib/nio/selector.rb - # - def io_selector_backend(backend) - @options[:io_selector_backend] = backend.to_sym - end - - # Ensures +STDOUT+ and +STDERR+ is immediately flushed to the underlying - # operating system and is not buffered internally - # - # The default is +true+. - # - # @example - # mutate_stdout_and_stderr_to_sync_on_write false - # - def mutate_stdout_and_stderr_to_sync_on_write(enabled=true) - @options[:mutate_stdout_and_stderr_to_sync_on_write] = enabled - end - - # Specify how big the request payload should be, in bytes. - # This limit is compared against Content-Length HTTP header. - # If the payload size (CONTENT_LENGTH) is larger than http_content_length_limit, - # HTTP 413 status code is returned. - # - # When no Content-Length http header is present, it is compared against the - # size of the body of the request. - # - # The default is +nil+. - # - # @example - # http_content_length_limit 2_000_000_000 - # - def http_content_length_limit(limit) - @options[:http_content_length_limit] = limit - end - - # Supported http methods, which will replace `Puma::Const::SUPPORTED_HTTP_METHODS`. - # The value of `:any` will allows all methods, otherwise, the value must be - # an array of strings. Note that methods are all uppercase. - # - # `Puma::Const::SUPPORTED_HTTP_METHODS` is conservative, if you want a - # complete set of methods, the methods defined by the - # [IANA Method Registry](https://www.iana.org/assignments/http-methods/http-methods.xhtml) - # are pre-defined as the constant `Puma::Const::IANA_HTTP_METHODS`. - # - # @note If the `methods` value is `:any`, no method check with be performed, - # similar to Puma v5 and earlier. - # - # @example Adds 'PROPFIND' to existing supported methods - # supported_http_methods(Puma::Const::SUPPORTED_HTTP_METHODS + ['PROPFIND']) - # @example Restricts methods to the array elements - # supported_http_methods %w[HEAD GET POST PUT DELETE OPTIONS PROPFIND] - # @example Restricts methods to the methods in the IANA Registry - # supported_http_methods Puma::Const::IANA_HTTP_METHODS - # @example Allows any method - # supported_http_methods :any - # - def supported_http_methods(methods) - if methods == :any - @options[:supported_http_methods] = :any - elsif Array === methods && methods == (ary = methods.grep(String).uniq) && - !ary.empty? - @options[:supported_http_methods] = ary - else - raise "supported_http_methods must be ':any' or a unique array of strings" - end - end - - private - - # To avoid adding cert_pem and key_pem as URI params, we store them on the - # options[:store] from where Puma binder knows how to find and extract them. - # - def add_pem_values_to_options_store(opts) - return if defined?(JRUBY_VERSION) - - @options[:store] ||= [] - - # Store cert_pem and key_pem to options[:store] if present - [:cert, :key].each do |v| - opt_key = :"#{v}_pem" - if opts[opt_key] - index = @options[:store].length - @options[:store] << opts[opt_key] - opts[v] = "store:#{index}" - end - end - end - - def process_hook(options_key, key, block, meth) - @options[options_key] ||= [] - if ON_WORKER_KEY.include? key.class - @options[options_key] << [block, key.to_sym] - elsif key.nil? - @options[options_key] << block - else - raise "'#{meth}' key must be String or Symbol" - end - end - - def warn_if_in_single_mode(hook_name) - return if @options[:silence_fork_callback_warning] - # user_options (CLI) have precedence over config file - workers_val = @config.options.user_options[:workers] || @options[:workers] || - @config.puma_default_options[:workers] || 0 - if workers_val == 0 - log_string = - "Warning: You specified code to run in a `#{hook_name}` block, " \ - "but Puma is not configured to run in cluster mode (worker count > 0), " \ - "so your `#{hook_name}` block will not run." - - LogWriter.stdio.log(log_string) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/error_logger.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/error_logger.rb deleted file mode 100644 index 792e14a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/error_logger.rb +++ /dev/null @@ -1,113 +0,0 @@ -# frozen_string_literal: true - -require_relative 'const' - -module Puma - # The implementation of a detailed error logging. - # @version 5.0.0 - # - class ErrorLogger - include Const - - attr_reader :ioerr - - REQUEST_FORMAT = %{"%s %s%s" - (%s)} - - LOG_QUEUE = Queue.new - - def initialize(ioerr, env: ENV) - @ioerr = ioerr - - @debug = env.key?('PUMA_DEBUG') - end - - def self.stdio(env: ENV) - new($stderr, env: env) - end - - # Print occurred error details. - # +options+ hash with additional options: - # - +error+ is an exception object - # - +req+ the http request - # - +text+ (default nil) custom string to print in title - # and before all remaining info. - # - def info(options={}) - internal_write title(options) - end - - # Print occurred error details only if - # environment variable PUMA_DEBUG is defined. - # +options+ hash with additional options: - # - +error+ is an exception object - # - +req+ the http request - # - +text+ (default nil) custom string to print in title - # and before all remaining info. - # - def debug(options={}) - return unless @debug - - error = options[:error] - req = options[:req] - - string_block = [] - string_block << title(options) - string_block << request_dump(req) if request_parsed?(req) - string_block << error.backtrace if error - - internal_write string_block.join("\n") - end - - def title(options={}) - text = options[:text] - req = options[:req] - error = options[:error] - - string_block = ["#{Time.now}"] - string_block << " #{text}" if text - string_block << " (#{request_title(req)})" if request_parsed?(req) - string_block << ": #{error.inspect}" if error - string_block.join('') - end - - def request_dump(req) - "Headers: #{request_headers(req)}\n" \ - "Body: #{req.body}" - end - - def request_title(req) - env = req.env - - REQUEST_FORMAT % [ - env[REQUEST_METHOD], - env[REQUEST_PATH] || env[PATH_INFO], - env[QUERY_STRING] || "", - env[HTTP_X_FORWARDED_FOR] || env[REMOTE_ADDR] || "-" - ] - end - - def request_headers(req) - headers = req.env.select { |key, _| key.start_with?('HTTP_') } - headers.map { |key, value| [key[5..-1], value] }.to_h.inspect - end - - def request_parsed?(req) - req && req.env[REQUEST_METHOD] - end - - def internal_write(str) - LOG_QUEUE << str - while (w_str = LOG_QUEUE.pop(true)) do - begin - @ioerr.is_a?(IO) and @ioerr.wait_writable(1) - @ioerr.write "#{w_str}\n" - @ioerr.flush unless @ioerr.sync - rescue Errno::EPIPE, Errno::EBADF, IOError, Errno::EINVAL - # 'Invalid argument' (Errno::EINVAL) may be raised by flush - end - end - rescue ThreadError - end - private :internal_write - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/events.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/events.rb deleted file mode 100644 index 3ada3e1..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/events.rb +++ /dev/null @@ -1,57 +0,0 @@ -# frozen_string_literal: true - -module Puma - - # This is an event sink used by `Puma::Server` to handle - # lifecycle events such as :on_booted, :on_restart, and :on_stopped. - # Using `Puma::DSL` it is possible to register callback hooks - # for each event type. - class Events - - def initialize - @hooks = Hash.new { |h,k| h[k] = [] } - end - - # Fire callbacks for the named hook - def fire(hook, *args) - @hooks[hook].each { |t| t.call(*args) } - end - - # Register a callback for a given hook - def register(hook, obj=nil, &blk) - if obj and blk - raise "Specify either an object or a block, not both" - end - - h = obj || blk - - @hooks[hook] << h - - h - end - - def on_booted(&block) - register(:on_booted, &block) - end - - def on_restart(&block) - register(:on_restart, &block) - end - - def on_stopped(&block) - register(:on_stopped, &block) - end - - def fire_on_booted! - fire(:on_booted) - end - - def fire_on_restart! - fire(:on_restart) - end - - def fire_on_stopped! - fire(:on_stopped) - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/io_buffer.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/io_buffer.rb deleted file mode 100644 index d2265e9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/io_buffer.rb +++ /dev/null @@ -1,46 +0,0 @@ -# frozen_string_literal: true - -require 'stringio' - -module Puma - class IOBuffer < StringIO - def initialize - super.binmode - end - - def empty? - length.zero? - end - - def reset - truncate 0 - rewind - end - - def to_s - rewind - read - end - - # Read & Reset - returns contents and resets - # @return [String] StringIO contents - def read_and_reset - rewind - str = read - truncate 0 - rewind - str - end - - alias_method :clear, :reset - - # before Ruby 2.5, `write` would only take one argument - if RUBY_VERSION >= '2.5' && RUBY_ENGINE != 'truffleruby' - alias_method :append, :write - else - def append(*strs) - strs.each { |str| write str } - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/jruby_restart.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/jruby_restart.rb deleted file mode 100644 index 48c410e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/jruby_restart.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -require 'ffi' - -module Puma - module JRubyRestart - extend FFI::Library - ffi_lib 'c' - attach_function :chdir, [:string], :int - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/json_serialization.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/json_serialization.rb deleted file mode 100644 index 94cad5c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/json_serialization.rb +++ /dev/null @@ -1,96 +0,0 @@ -# frozen_string_literal: true -require 'stringio' - -module Puma - - # Puma deliberately avoids the use of the json gem and instead performs JSON - # serialization without any external dependencies. In a puma cluster, loading - # any gem into the puma master process means that operators cannot use a - # phased restart to upgrade their application if the new version of that - # application uses a different version of that gem. The json gem in - # particular is additionally problematic because it leverages native - # extensions. If the puma master process relies on a gem with native - # extensions and operators remove gems from disk related to old releases, - # subsequent phased restarts can fail. - # - # The implementation of JSON serialization in this module is not designed to - # be particularly full-featured or fast. It just has to handle the few places - # where Puma relies on JSON serialization internally. - - module JSONSerialization - QUOTE = /"/ - BACKSLASH = /\\/ - CONTROL_CHAR_TO_ESCAPE = /[\x00-\x1F]/ # As required by ECMA-404 - CHAR_TO_ESCAPE = Regexp.union QUOTE, BACKSLASH, CONTROL_CHAR_TO_ESCAPE - - class SerializationError < StandardError; end - - class << self - def generate(value) - StringIO.open do |io| - serialize_value io, value - io.string - end - end - - private - - def serialize_value(output, value) - case value - when Hash - output << '{' - value.each_with_index do |(k, v), index| - output << ',' if index != 0 - serialize_object_key output, k - output << ':' - serialize_value output, v - end - output << '}' - when Array - output << '[' - value.each_with_index do |member, index| - output << ',' if index != 0 - serialize_value output, member - end - output << ']' - when Integer, Float - output << value.to_s - when String - serialize_string output, value - when true - output << 'true' - when false - output << 'false' - when nil - output << 'null' - else - raise SerializationError, "Unexpected value of type #{value.class}" - end - end - - def serialize_string(output, value) - output << '"' - output << value.gsub(CHAR_TO_ESCAPE) do |character| - case character - when BACKSLASH - '\\\\' - when QUOTE - '\\"' - when CONTROL_CHAR_TO_ESCAPE - '\u%.4X' % character.ord - end - end - output << '"' - end - - def serialize_object_key(output, value) - case value - when Symbol, String - serialize_string output, value.to_s - else - raise SerializationError, "Could not serialize object of type #{value.class} as object key" - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/launcher.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/launcher.rb deleted file mode 100644 index 1ecce52..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/launcher.rb +++ /dev/null @@ -1,497 +0,0 @@ -# frozen_string_literal: true - -require_relative 'log_writer' -require_relative 'events' -require_relative 'detect' -require_relative 'cluster' -require_relative 'single' -require_relative 'const' -require_relative 'binder' - -module Puma - # Puma::Launcher is the single entry point for starting a Puma server based on user - # configuration. It is responsible for taking user supplied arguments and resolving them - # with configuration in `config/puma.rb` or `config/puma/.rb`. - # - # It is responsible for either launching a cluster of Puma workers or a single - # puma server. - class Launcher - autoload :BundlePruner, 'puma/launcher/bundle_pruner' - - # Returns an instance of Launcher - # - # +conf+ A Puma::Configuration object indicating how to run the server. - # - # +launcher_args+ A Hash that currently has one required key `:events`, - # this is expected to hold an object similar to an `Puma::LogWriter.stdio`, - # this object will be responsible for broadcasting Puma's internal state - # to a logging destination. An optional key `:argv` can be supplied, - # this should be an array of strings, these arguments are re-used when - # restarting the puma server. - # - # Examples: - # - # conf = Puma::Configuration.new do |user_config| - # user_config.threads 1, 10 - # user_config.app do |env| - # [200, {}, ["hello world"]] - # end - # end - # Puma::Launcher.new(conf, log_writer: Puma::LogWriter.stdio).run - def initialize(conf, launcher_args={}) - @runner = nil - @log_writer = launcher_args[:log_writer] || LogWriter::DEFAULT - @events = launcher_args[:events] || Events.new - @argv = launcher_args[:argv] || [] - @original_argv = @argv.dup - @config = conf - - env = launcher_args.delete(:env) || ENV - - @config.options[:log_writer] = @log_writer - - # Advertise the Configuration - Puma.cli_config = @config if defined?(Puma.cli_config) - - @config.load - - @binder = Binder.new(@log_writer, conf) - @binder.create_inherited_fds(ENV).each { |k| ENV.delete k } - @binder.create_activated_fds(ENV).each { |k| ENV.delete k } - - @environment = conf.environment - - # Load the systemd integration if we detect systemd's NOTIFY_SOCKET. - # Skip this on JRuby though, because it is incompatible with the systemd - # integration due to https://github.com/jruby/jruby/issues/6504 - if ENV["NOTIFY_SOCKET"] && !Puma.jruby? && !ENV["PUMA_SKIP_SYSTEMD"] - @config.plugins.create('systemd') - end - - if @config.options[:bind_to_activated_sockets] - @config.options[:binds] = @binder.synthesize_binds_from_activated_fs( - @config.options[:binds], - @config.options[:bind_to_activated_sockets] == 'only' - ) - end - - @options = @config.options - @config.clamp - - @log_writer.formatter = LogWriter::PidFormatter.new if clustered? - @log_writer.formatter = options[:log_formatter] if @options[:log_formatter] - - @log_writer.custom_logger = options[:custom_logger] if @options[:custom_logger] - - generate_restart_data - - if clustered? && !Puma.forkable? - unsupported "worker mode not supported on #{RUBY_ENGINE} on this platform" - end - - Dir.chdir(@restart_dir) - - prune_bundler! - - @environment = @options[:environment] if @options[:environment] - set_rack_environment - - if clustered? - @options[:logger] = @log_writer - - @runner = Cluster.new(self) - else - @runner = Single.new(self) - end - Puma.stats_object = @runner - - @status = :run - - log_config if env['PUMA_LOG_CONFIG'] - end - - attr_reader :binder, :log_writer, :events, :config, :options, :restart_dir - - # Return stats about the server - def stats - @runner.stats - end - - # Write a state file that can be used by pumactl to control - # the server - def write_state - write_pid - - path = @options[:state] - permission = @options[:state_permission] - return unless path - - require_relative 'state_file' - - sf = StateFile.new - sf.pid = Process.pid - sf.control_url = @options[:control_url] - sf.control_auth_token = @options[:control_auth_token] - sf.running_from = File.expand_path('.') - - sf.save path, permission - end - - # Delete the configured pidfile - def delete_pidfile - path = @options[:pidfile] - File.unlink(path) if path && File.exist?(path) - end - - # Begin async shutdown of the server - def halt - @status = :halt - @runner.halt - end - - # Begin async shutdown of the server gracefully - def stop - @status = :stop - @runner.stop - end - - # Begin async restart of the server - def restart - @status = :restart - @runner.restart - end - - # Begin a phased restart if supported - def phased_restart - unless @runner.respond_to?(:phased_restart) and @runner.phased_restart - log "* phased-restart called but not available, restarting normally." - return restart - end - - if @options.file_options[:tag].nil? - dir = File.realdirpath(@restart_dir) - @options[:tag] = File.basename(dir) - set_process_title - end - - true - end - - # Begin a refork if supported - def refork - if clustered? && @runner.respond_to?(:fork_worker!) && @options[:fork_worker] - @runner.fork_worker! - true - else - log "* refork called but not available." - false - end - end - - # Run the server. This blocks until the server is stopped - def run - previous_env = get_env - - @config.clamp - - @config.plugins.fire_starts self - - setup_signals - set_process_title - - # This blocks until the server is stopped - @runner.run - - do_run_finished(previous_env) - end - - # Return all tcp ports the launcher may be using, TCP or SSL - # @!attribute [r] connected_ports - # @version 5.0.0 - def connected_ports - @binder.connected_ports - end - - # @!attribute [r] restart_args - def restart_args - cmd = @options[:restart_cmd] - if cmd - cmd.split(' ') + @original_argv - else - @restart_argv - end - end - - def close_binder_listeners - @runner.close_control_listeners - @binder.close_listeners - unless @status == :restart - log "=== puma shutdown: #{Time.now} ===" - log "- Goodbye!" - end - end - - # @!attribute [r] thread_status - # @version 5.0.0 - def thread_status - Thread.list.each do |thread| - name = "Thread: TID-#{thread.object_id.to_s(36)}" - name += " #{thread['label']}" if thread['label'] - name += " #{thread.name}" if thread.respond_to?(:name) && thread.name - backtrace = thread.backtrace || [""] - - yield name, backtrace - end - end - - private - - def get_env - if defined?(Bundler) - env = Bundler::ORIGINAL_ENV.dup - # add -rbundler/setup so we load from Gemfile when restarting - bundle = "-rbundler/setup" - env["RUBYOPT"] = [env["RUBYOPT"], bundle].join(" ").lstrip unless env["RUBYOPT"].to_s.include?(bundle) - env - else - ENV.to_h - end - end - - def do_run_finished(previous_env) - case @status - when :halt - do_forceful_stop - when :run, :stop - do_graceful_stop - when :restart - do_restart(previous_env) - end - - close_binder_listeners unless @status == :restart - end - - def do_forceful_stop - log "* Stopping immediately!" - @runner.stop_control - end - - def do_graceful_stop - @events.fire_on_stopped! - @runner.stop_blocked - end - - def do_restart(previous_env) - log "* Restarting..." - ENV.replace(previous_env) - @runner.stop_control - restart! - end - - def restart! - @events.fire_on_restart! - @config.run_hooks :on_restart, self, @log_writer - - if Puma.jruby? - close_binder_listeners - - require_relative 'jruby_restart' - argv = restart_args - JRubyRestart.chdir(@restart_dir) - Kernel.exec(*argv) - elsif Puma.windows? - close_binder_listeners - - argv = restart_args - Dir.chdir(@restart_dir) - Kernel.exec(*argv) - else - argv = restart_args - Dir.chdir(@restart_dir) - ENV.update(@binder.redirects_for_restart_env) - argv += [@binder.redirects_for_restart] - Kernel.exec(*argv) - end - end - - # If configured, write the pid of the current process out - # to a file. - def write_pid - path = @options[:pidfile] - return unless path - cur_pid = Process.pid - File.write path, cur_pid, mode: 'wb:UTF-8' - at_exit do - delete_pidfile if cur_pid == Process.pid - end - end - - def reload_worker_directory - @runner.reload_worker_directory if @runner.respond_to?(:reload_worker_directory) - end - - def log(str) - @log_writer.log(str) - end - - def clustered? - (@options[:workers] || 0) > 0 - end - - def unsupported(str) - @log_writer.error(str) - raise UnsupportedOption - end - - def set_process_title - Process.respond_to?(:setproctitle) ? Process.setproctitle(title) : $0 = title - end - - # @!attribute [r] title - def title - buffer = "puma #{Puma::Const::VERSION} (#{@options[:binds].join(',')})" - buffer += " [#{@options[:tag]}]" if @options[:tag] && !@options[:tag].empty? - buffer - end - - def set_rack_environment - @options[:environment] = environment - ENV['RACK_ENV'] = environment - end - - # @!attribute [r] environment - def environment - @environment - end - - def prune_bundler? - @options[:prune_bundler] && clustered? && !@options[:preload_app] - end - - def prune_bundler! - return unless prune_bundler? - BundlePruner.new(@original_argv, @options[:extra_runtime_dependencies], @log_writer).prune - end - - def generate_restart_data - if dir = @options[:directory] - @restart_dir = dir - - elsif Puma.windows? - # I guess the value of PWD is garbage on windows so don't bother - # using it. - @restart_dir = Dir.pwd - - # Use the same trick as unicorn, namely favor PWD because - # it will contain an unresolved symlink, useful for when - # the pwd is /data/releases/current. - elsif dir = ENV['PWD'] - s_env = File.stat(dir) - s_pwd = File.stat(Dir.pwd) - - if s_env.ino == s_pwd.ino and (Puma.jruby? or s_env.dev == s_pwd.dev) - @restart_dir = dir - end - end - - @restart_dir ||= Dir.pwd - - # if $0 is a file in the current directory, then restart - # it the same, otherwise add -S on there because it was - # picked up in PATH. - # - if File.exist?($0) - arg0 = [Gem.ruby, $0] - else - arg0 = [Gem.ruby, "-S", $0] - end - - # Detect and reinject -Ilib from the command line, used for testing without bundler - # cruby has an expanded path, jruby has just "lib" - lib = File.expand_path "lib" - arg0[1,0] = ["-I", lib] if [lib, "lib"].include?($LOAD_PATH[0]) - - if defined? Puma::WILD_ARGS - @restart_argv = arg0 + Puma::WILD_ARGS + @original_argv - else - @restart_argv = arg0 + @original_argv - end - end - - def setup_signals - unless ENV["PUMA_SKIP_SIGUSR2"] - begin - Signal.trap "SIGUSR2" do - restart - end - rescue Exception - log "*** SIGUSR2 not implemented, signal based restart unavailable!" - end - end - - unless Puma.jruby? - begin - Signal.trap "SIGUSR1" do - phased_restart - end - rescue Exception - log "*** SIGUSR1 not implemented, signal based restart unavailable!" - end - end - - begin - Signal.trap "SIGTERM" do - # Shortcut the control flow in case raise_exception_on_sigterm is true - do_graceful_stop - - raise(SignalException, "SIGTERM") if @options[:raise_exception_on_sigterm] - end - rescue Exception - log "*** SIGTERM not implemented, signal based gracefully stopping unavailable!" - end - - begin - Signal.trap "SIGINT" do - stop - end - rescue Exception - log "*** SIGINT not implemented, signal based gracefully stopping unavailable!" - end - - begin - Signal.trap "SIGHUP" do - if @runner.redirected_io? - @runner.redirect_io - else - stop - end - end - rescue Exception - log "*** SIGHUP not implemented, signal based logs reopening unavailable!" - end - - begin - unless Puma.jruby? # INFO in use by JVM already - Signal.trap "SIGINFO" do - thread_status do |name, backtrace| - @log_writer.log(name) - @log_writer.log(backtrace.map { |bt| " #{bt}" }) - end - end - end - rescue Exception - # Not going to log this one, as SIGINFO is *BSD only and would be pretty annoying - # to see this constantly on Linux. - end - end - - def log_config - log "Configuration:" - - @config.final_options - .each { |config_key, value| log "- #{config_key}: #{value}" } - - log "\n" - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/launcher/bundle_pruner.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/launcher/bundle_pruner.rb deleted file mode 100644 index 1b5c911..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/launcher/bundle_pruner.rb +++ /dev/null @@ -1,104 +0,0 @@ -# frozen_string_literal: true - -module Puma - class Launcher - - # This class is used to pickup Gemfile changes during - # application restarts. - class BundlePruner - - def initialize(original_argv, extra_runtime_dependencies, log_writer) - @original_argv = Array(original_argv) - @extra_runtime_dependencies = Array(extra_runtime_dependencies) - @log_writer = log_writer - end - - def prune - return if ENV['PUMA_BUNDLER_PRUNED'] - return unless defined?(Bundler) - - require_rubygems_min_version! - - unless puma_wild_path - log "! Unable to prune Bundler environment, continuing" - return - end - - dirs = paths_to_require_after_prune - - log '* Pruning Bundler environment' - home = ENV['GEM_HOME'] - bundle_gemfile = Bundler.original_env['BUNDLE_GEMFILE'] - bundle_app_config = Bundler.original_env['BUNDLE_APP_CONFIG'] - - with_unbundled_env do - ENV['GEM_HOME'] = home - ENV['BUNDLE_GEMFILE'] = bundle_gemfile - ENV['PUMA_BUNDLER_PRUNED'] = '1' - ENV["BUNDLE_APP_CONFIG"] = bundle_app_config - args = [Gem.ruby, puma_wild_path, '-I', dirs.join(':')] + @original_argv - # Ruby 2.0+ defaults to true which breaks socket activation - args += [{:close_others => false}] - Kernel.exec(*args) - end - end - - private - - def require_rubygems_min_version! - min_version = Gem::Version.new('2.2') - - return if min_version <= Gem::Version.new(Gem::VERSION) - - raise "prune_bundler is not supported on your version of RubyGems. " \ - "You must have RubyGems #{min_version}+ to use this feature." - end - - def puma_wild_path - puma_lib_dir = puma_require_paths.detect { |x| File.exist? File.join(x, '../bin/puma-wild') } - File.expand_path(File.join(puma_lib_dir, '../bin/puma-wild')) - end - - def with_unbundled_env - bundler_ver = Gem::Version.new(Bundler::VERSION) - if bundler_ver < Gem::Version.new('2.1.0') - Bundler.with_clean_env { yield } - else - Bundler.with_unbundled_env { yield } - end - end - - def paths_to_require_after_prune - puma_require_paths + extra_runtime_deps_paths - end - - def extra_runtime_deps_paths - t = @extra_runtime_dependencies.map do |dep_name| - if (spec = spec_for_gem(dep_name)) - require_paths_for_gem(spec) - else - log "* Could not load extra dependency: #{dep_name}" - nil - end - end - t.flatten!; t.compact!; t - end - - def puma_require_paths - require_paths_for_gem(spec_for_gem('puma')) - end - - def spec_for_gem(gem_name) - Bundler.rubygems.loaded_specs(gem_name) - end - - def require_paths_for_gem(gem_spec) - gem_spec.full_require_paths - end - - def log(str) - @log_writer.log(str) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/log_writer.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/log_writer.rb deleted file mode 100644 index 9a1eb9d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/log_writer.rb +++ /dev/null @@ -1,147 +0,0 @@ -# frozen_string_literal: true - -require_relative 'null_io' -require_relative 'error_logger' -require 'stringio' -require 'io/wait' unless Puma::HAS_NATIVE_IO_WAIT - -module Puma - - # Handles logging concerns for both standard messages - # (+stdout+) and errors (+stderr+). - class LogWriter - - class DefaultFormatter - def call(str) - str - end - end - - class PidFormatter - def call(str) - "[#{$$}] #{str}" - end - end - - LOG_QUEUE = Queue.new - - attr_reader :stdout, - :stderr - - attr_accessor :formatter, :custom_logger - - # Create a LogWriter that prints to +stdout+ and +stderr+. - def initialize(stdout, stderr, env: ENV) - @formatter = DefaultFormatter.new - @custom_logger = nil - @stdout = stdout - @stderr = stderr - - @debug = env.key?('PUMA_DEBUG') - @error_logger = ErrorLogger.new(@stderr, env: env) - end - - DEFAULT = new(STDOUT, STDERR) - - # Returns an LogWriter object which writes its status to - # two StringIO objects. - def self.strings(env: ENV) - LogWriter.new(StringIO.new, StringIO.new, env: env) - end - - def self.stdio(env: ENV) - LogWriter.new($stdout, $stderr, env: env) - end - - def self.null(env: ENV) - n = NullIO.new - LogWriter.new(n, n, env: env) - end - - # Write +str+ to +@stdout+ - def log(str) - if @custom_logger&.respond_to?(:write) - @custom_logger.write(format(str)) - else - internal_write "#{@formatter.call str}\n" - end - end - - def write(str) - internal_write @formatter.call(str) - end - - def internal_write(str) - LOG_QUEUE << str - while (w_str = LOG_QUEUE.pop(true)) do - begin - @stdout.is_a?(IO) and @stdout.wait_writable(1) - @stdout.write w_str - @stdout.flush unless @stdout.sync - rescue Errno::EPIPE, Errno::EBADF, IOError, Errno::EINVAL - # 'Invalid argument' (Errno::EINVAL) may be raised by flush - end - end - rescue ThreadError - end - private :internal_write - - def debug? - @debug - end - - def debug(str) - log("% #{str}") if @debug - end - - # Write +str+ to +@stderr+ - def error(str) - @error_logger.info(text: @formatter.call("ERROR: #{str}")) - exit 1 - end - - def format(str) - formatter.call(str) - end - - # An HTTP connection error has occurred. - # +error+ a connection exception, +req+ the request, - # and +text+ additional info - # @version 5.0.0 - def connection_error(error, req, text="HTTP connection error") - @error_logger.info(error: error, req: req, text: text) - end - - # An HTTP parse error has occurred. - # +error+ a parsing exception, - # and +req+ the request. - def parse_error(error, req) - @error_logger.info(error: error, req: req, text: 'HTTP parse error, malformed request') - end - - # An SSL error has occurred. - # @param error - # @param ssl_socket - def ssl_error(error, ssl_socket) - peeraddr = ssl_socket.peeraddr.last rescue "" - peercert = ssl_socket.peercert - subject = peercert&.subject - @error_logger.info(error: error, text: "SSL error, peer: #{peeraddr}, peer cert: #{subject}") - end - - # An unknown error has occurred. - # +error+ an exception object, +req+ the request, - # and +text+ additional info - def unknown_error(error, req=nil, text="Unknown error") - @error_logger.info(error: error, req: req, text: text) - end - - # Log occurred error debug dump. - # +error+ an exception object, +req+ the request, - # and +text+ additional info - # @version 5.0.0 - def debug_error(error, req=nil, text="") - @error_logger.debug(error: error, req: req, text: text) - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/minissl.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/minissl.rb deleted file mode 100644 index 0ff2ce8..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/minissl.rb +++ /dev/null @@ -1,459 +0,0 @@ -# frozen_string_literal: true - -begin - require 'io/wait' unless Puma::HAS_NATIVE_IO_WAIT -rescue LoadError -end - -require 'open3' -# need for Puma::MiniSSL::OPENSSL constants used in `HAS_TLS1_3` -# use require, see https://github.com/puma/puma/pull/2381 -require 'puma/puma_http11' - -module Puma - module MiniSSL - # Define constant at runtime, as it's easy to determine at built time, - # but Puma could (it shouldn't) be loaded with an older OpenSSL version - # @version 5.0.0 - HAS_TLS1_3 = IS_JRUBY || - ((OPENSSL_VERSION[/ \d+\.\d+\.\d+/].split('.').map(&:to_i) <=> [1,1,1]) != -1 && - (OPENSSL_LIBRARY_VERSION[/ \d+\.\d+\.\d+/].split('.').map(&:to_i) <=> [1,1,1]) !=-1) - - class Socket - def initialize(socket, engine) - @socket = socket - @engine = engine - @peercert = nil - @reuse = nil - end - - # @!attribute [r] to_io - def to_io - @socket - end - - def closed? - @socket.closed? - end - - # Returns a two element array, - # first is protocol version (SSL_get_version), - # second is 'handshake' state (SSL_state_string) - # - # Used for dropping tcp connections to ssl. - # See OpenSSL ssl/ssl_stat.c SSL_state_string for info - # @!attribute [r] ssl_version_state - # @version 5.0.0 - # - def ssl_version_state - IS_JRUBY ? [nil, nil] : @engine.ssl_vers_st - end - - # Used to check the handshake status, in particular when a TCP connection - # is made with TLSv1.3 as an available protocol - # @version 5.0.0 - def bad_tlsv1_3? - HAS_TLS1_3 && ssl_version_state == ['TLSv1.3', 'SSLERR'] - end - private :bad_tlsv1_3? - - def readpartial(size) - while true - output = @engine.read - return output if output - - data = @socket.readpartial(size) - @engine.inject(data) - output = @engine.read - - return output if output - - while neg_data = @engine.extract - @socket.write neg_data - end - end - end - - def engine_read_all - output = @engine.read - while output and additional_output = @engine.read - output << additional_output - end - output - end - - def read_nonblock(size, *_) - # *_ is to deal with keyword args that were added - # at some point (and being used in the wild) - while true - output = engine_read_all - return output if output - - data = @socket.read_nonblock(size, exception: false) - if data == :wait_readable || data == :wait_writable - # It would make more sense to let @socket.read_nonblock raise - # EAGAIN if necessary but it seems like it'll misbehave on Windows. - # I don't have a Windows machine to debug this so I can't explain - # exactly whats happening in that OS. Please let me know if you - # find out! - # - # In the meantime, we can emulate the correct behavior by - # capturing :wait_readable & :wait_writable and raising EAGAIN - # ourselves. - raise IO::EAGAINWaitReadable - elsif data.nil? - raise SSLError.exception "HTTP connection?" if bad_tlsv1_3? - return nil - end - - @engine.inject(data) - output = engine_read_all - - return output if output - - while neg_data = @engine.extract - @socket.write neg_data - end - end - end - - def write(data) - return 0 if data.empty? - - data_size = data.bytesize - need = data_size - - while true - wrote = @engine.write data - - enc_wr = +'' - while (enc = @engine.extract) - enc_wr << enc - end - @socket.write enc_wr unless enc_wr.empty? - - need -= wrote - - return data_size if need == 0 - - data = data.byteslice(wrote..-1) - end - end - - alias_method :syswrite, :write - alias_method :<<, :write - - # This is a temporary fix to deal with websockets code using - # write_nonblock. - - # The problem with implementing it properly - # is that it means we'd have to have the ability to rewind - # an engine because after we write+extract, the socket - # write_nonblock call might raise an exception and later - # code would pass the same data in, but the engine would think - # it had already written the data in. - # - # So for the time being (and since write blocking is quite rare), - # go ahead and actually block in write_nonblock. - # - def write_nonblock(data, *_) - write data - end - - def flush - @socket.flush - end - - def close - begin - unless @engine.shutdown - while alert_data = @engine.extract - @socket.write alert_data - end - end - rescue IOError, SystemCallError - Puma::Util.purge_interrupt_queue - # nothing - ensure - @socket.close - end - end - - # @!attribute [r] peeraddr - def peeraddr - @socket.peeraddr - end - - # OpenSSL is loaded in `MiniSSL::ContextBuilder` when - # `MiniSSL::Context#verify_mode` is not `VERIFY_NONE`. - # When `VERIFY_NONE`, `MiniSSL::Engine#peercert` is nil, regardless of - # whether the client sends a cert. - # @return [OpenSSL::X509::Certificate, nil] - # @!attribute [r] peercert - def peercert - return @peercert if @peercert - - raw = @engine.peercert - return nil unless raw - - @peercert = OpenSSL::X509::Certificate.new raw - end - end - - if IS_JRUBY - OPENSSL_NO_SSL3 = false - OPENSSL_NO_TLS1 = false - end - - class Context - attr_accessor :verify_mode - attr_reader :no_tlsv1, :no_tlsv1_1 - - def initialize - @no_tlsv1 = false - @no_tlsv1_1 = false - @key = nil - @cert = nil - @key_pem = nil - @cert_pem = nil - @reuse = nil - @reuse_cache_size = nil - @reuse_timeout = nil - end - - def check_file(file, desc) - raise ArgumentError, "#{desc} file '#{file}' does not exist" unless File.exist? file - raise ArgumentError, "#{desc} file '#{file}' is not readable" unless File.readable? file - end - - if IS_JRUBY - # jruby-specific Context properties: java uses a keystore and password pair rather than a cert/key pair - attr_reader :keystore - attr_reader :keystore_type - attr_accessor :keystore_pass - attr_reader :truststore - attr_reader :truststore_type - attr_accessor :truststore_pass - attr_reader :cipher_suites - attr_reader :protocols - - def keystore=(keystore) - check_file keystore, 'Keystore' - @keystore = keystore - end - - def truststore=(truststore) - # NOTE: historically truststore was assumed the same as keystore, this is kept for backwards - # compatibility, to rely on JVM's trust defaults we allow setting `truststore = :default` - unless truststore.eql?(:default) - raise ArgumentError, "No such truststore file '#{truststore}'" unless File.exist?(truststore) - end - @truststore = truststore - end - - def keystore_type=(type) - raise ArgumentError, "Invalid keystore type: #{type.inspect}" unless ['pkcs12', 'jks', nil].include?(type) - @keystore_type = type - end - - def truststore_type=(type) - raise ArgumentError, "Invalid truststore type: #{type.inspect}" unless ['pkcs12', 'jks', nil].include?(type) - @truststore_type = type - end - - def cipher_suites=(list) - list = list.split(',').map(&:strip) if list.is_a?(String) - @cipher_suites = list - end - - # aliases for backwards compatibility - alias_method :ssl_cipher_list, :cipher_suites - alias_method :ssl_cipher_list=, :cipher_suites= - - def protocols=(list) - list = list.split(',').map(&:strip) if list.is_a?(String) - @protocols = list - end - - def check - raise "Keystore not configured" unless @keystore - # @truststore defaults to @keystore due backwards compatibility - end - - else - # non-jruby Context properties - attr_reader :key - attr_reader :key_password_command - attr_reader :cert - attr_reader :ca - attr_reader :cert_pem - attr_reader :key_pem - attr_accessor :ssl_cipher_filter - attr_accessor :ssl_ciphersuites - attr_accessor :verification_flags - - attr_reader :reuse, :reuse_cache_size, :reuse_timeout - - def key=(key) - check_file key, 'Key' - @key = key - end - - def key_password_command=(key_password_command) - @key_password_command = key_password_command - end - - def cert=(cert) - check_file cert, 'Cert' - @cert = cert - end - - def ca=(ca) - check_file ca, 'ca' - @ca = ca - end - - def cert_pem=(cert_pem) - raise ArgumentError, "'cert_pem' is not a String" unless cert_pem.is_a? String - @cert_pem = cert_pem - end - - def key_pem=(key_pem) - raise ArgumentError, "'key_pem' is not a String" unless key_pem.is_a? String - @key_pem = key_pem - end - - def check - raise "Key not configured" if @key.nil? && @key_pem.nil? - raise "Cert not configured" if @cert.nil? && @cert_pem.nil? - end - - # Executes the command to return the password needed to decrypt the key. - def key_password - raise "Key password command not configured" if @key_password_command.nil? - - stdout_str, stderr_str, status = Open3.capture3(@key_password_command) - - return stdout_str.chomp if status.success? - - raise "Key password failed with code #{status.exitstatus}: #{stderr_str}" - end - - # Controls session reuse. Allowed values are as follows: - # * 'off' - matches the behavior of Puma 5.6 and earlier. This is included - # in case reuse 'on' is made the default in future Puma versions. - # * 'dflt' - sets session reuse on, with OpenSSL default cache size of - # 20k and default timeout of 300 seconds. - # * 's,t' - where s and t are integer strings, for size and timeout. - # * 's' - where s is an integer strings for size. - # * ',t' - where t is an integer strings for timeout. - # - def reuse=(reuse_str) - case reuse_str - when 'off' - @reuse = nil - when 'dflt' - @reuse = true - when /\A\d+\z/ - @reuse = true - @reuse_cache_size = reuse_str.to_i - when /\A\d+,\d+\z/ - @reuse = true - size, time = reuse_str.split ',' - @reuse_cache_size = size.to_i - @reuse_timeout = time.to_i - when /\A,\d+\z/ - @reuse = true - @reuse_timeout = reuse_str.delete(',').to_i - end - end - end - - # disables TLSv1 - # @!attribute [w] no_tlsv1= - def no_tlsv1=(tlsv1) - raise ArgumentError, "Invalid value of no_tlsv1=" unless ['true', 'false', true, false].include?(tlsv1) - @no_tlsv1 = tlsv1 - end - - # disables TLSv1 and TLSv1.1. Overrides `#no_tlsv1=` - # @!attribute [w] no_tlsv1_1= - def no_tlsv1_1=(tlsv1_1) - raise ArgumentError, "Invalid value of no_tlsv1_1=" unless ['true', 'false', true, false].include?(tlsv1_1) - @no_tlsv1_1 = tlsv1_1 - end - - end - - VERIFY_NONE = 0 - VERIFY_PEER = 1 - VERIFY_FAIL_IF_NO_PEER_CERT = 2 - - # https://github.com/openssl/openssl/blob/master/include/openssl/x509_vfy.h.in - # /* Certificate verify flags */ - VERIFICATION_FLAGS = { - "USE_CHECK_TIME" => 0x2, - "CRL_CHECK" => 0x4, - "CRL_CHECK_ALL" => 0x8, - "IGNORE_CRITICAL" => 0x10, - "X509_STRICT" => 0x20, - "ALLOW_PROXY_CERTS" => 0x40, - "POLICY_CHECK" => 0x80, - "EXPLICIT_POLICY" => 0x100, - "INHIBIT_ANY" => 0x200, - "INHIBIT_MAP" => 0x400, - "NOTIFY_POLICY" => 0x800, - "EXTENDED_CRL_SUPPORT" => 0x1000, - "USE_DELTAS" => 0x2000, - "CHECK_SS_SIGNATURE" => 0x4000, - "TRUSTED_FIRST" => 0x8000, - "SUITEB_128_LOS_ONLY" => 0x10000, - "SUITEB_192_LOS" => 0x20000, - "SUITEB_128_LOS" => 0x30000, - "PARTIAL_CHAIN" => 0x80000, - "NO_ALT_CHAINS" => 0x100000, - "NO_CHECK_TIME" => 0x200000 - }.freeze - - class Server - def initialize(socket, ctx) - @socket = socket - @ctx = ctx - @eng_ctx = IS_JRUBY ? @ctx : SSLContext.new(ctx) - end - - def accept - @ctx.check - io = @socket.accept - engine = Engine.server @eng_ctx - Socket.new io, engine - end - - def accept_nonblock - @ctx.check - io = @socket.accept_nonblock - engine = Engine.server @eng_ctx - Socket.new io, engine - end - - # @!attribute [r] to_io - def to_io - @socket - end - - # @!attribute [r] addr - # @version 5.0.0 - def addr - @socket.addr - end - - def close - @socket.close unless @socket.closed? # closed? call is for Windows - end - - def closed? - @socket.closed? - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/minissl/context_builder.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/minissl/context_builder.rb deleted file mode 100644 index 6abce10..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/minissl/context_builder.rb +++ /dev/null @@ -1,96 +0,0 @@ -module Puma - module MiniSSL - class ContextBuilder - def initialize(params, log_writer) - @params = params - @log_writer = log_writer - end - - def context - ctx = MiniSSL::Context.new - - if defined?(JRUBY_VERSION) - unless params['keystore'] - log_writer.error "Please specify the Java keystore via 'keystore='" - end - - ctx.keystore = params['keystore'] - - unless params['keystore-pass'] - log_writer.error "Please specify the Java keystore password via 'keystore-pass='" - end - - ctx.keystore_pass = params['keystore-pass'] - ctx.keystore_type = params['keystore-type'] - - if truststore = params['truststore'] - ctx.truststore = truststore.eql?('default') ? :default : truststore - ctx.truststore_pass = params['truststore-pass'] - ctx.truststore_type = params['truststore-type'] - end - - ctx.cipher_suites = params['cipher_suites'] || params['ssl_cipher_list'] - ctx.protocols = params['protocols'] if params['protocols'] - else - if params['key'].nil? && params['key_pem'].nil? - log_writer.error "Please specify the SSL key via 'key=' or 'key_pem='" - end - - ctx.key = params['key'] if params['key'] - ctx.key_pem = params['key_pem'] if params['key_pem'] - ctx.key_password_command = params['key_password_command'] if params['key_password_command'] - - if params['cert'].nil? && params['cert_pem'].nil? - log_writer.error "Please specify the SSL cert via 'cert=' or 'cert_pem='" - end - - ctx.cert = params['cert'] if params['cert'] - ctx.cert_pem = params['cert_pem'] if params['cert_pem'] - - if ['peer', 'force_peer'].include?(params['verify_mode']) - unless params['ca'] - log_writer.error "Please specify the SSL ca via 'ca='" - end - # needed for Puma::MiniSSL::Socket#peercert, env['puma.peercert'] - require 'openssl' - end - - ctx.ca = params['ca'] if params['ca'] - ctx.ssl_cipher_filter = params['ssl_cipher_filter'] if params['ssl_cipher_filter'] - ctx.ssl_ciphersuites = params['ssl_ciphersuites'] if params['ssl_ciphersuites'] && HAS_TLS1_3 - - ctx.reuse = params['reuse'] if params['reuse'] - end - - ctx.no_tlsv1 = params['no_tlsv1'] == 'true' - ctx.no_tlsv1_1 = params['no_tlsv1_1'] == 'true' - - if params['verify_mode'] - ctx.verify_mode = case params['verify_mode'] - when "peer" - MiniSSL::VERIFY_PEER - when "force_peer" - MiniSSL::VERIFY_PEER | MiniSSL::VERIFY_FAIL_IF_NO_PEER_CERT - when "none" - MiniSSL::VERIFY_NONE - else - log_writer.error "Please specify a valid verify_mode=" - MiniSSL::VERIFY_NONE - end - end - - if params['verification_flags'] - ctx.verification_flags = params['verification_flags'].split(','). - map { |flag| MiniSSL::VERIFICATION_FLAGS.fetch(flag) }. - inject { |sum, flag| sum ? sum | flag : flag } - end - - ctx - end - - private - - attr_reader :params, :log_writer - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/null_io.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/null_io.rb deleted file mode 100644 index 13534cd..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/null_io.rb +++ /dev/null @@ -1,101 +0,0 @@ -# frozen_string_literal: true - -module Puma - # Provides an IO-like object that always appears to contain no data. - # Used as the value for rack.input when the request has no body. - # - class NullIO - def gets - nil - end - - def string - "" - end - - def each - end - - def pos - 0 - end - - # Mimics IO#read with no data. - # - def read(length = nil, buffer = nil) - if length.to_i < 0 - raise ArgumentError, "(negative length #{length} given)" - end - - buffer = if buffer.nil? - "".b - else - String.try_convert(buffer) or raise TypeError, "no implicit conversion of #{buffer.class} into String" - end - buffer.clear - if length.to_i > 0 - nil - else - buffer - end - end - - def rewind - end - - def seek(pos, whence = 0) - raise ArgumentError, "negative length #{pos} given" if pos.negative? - 0 - end - - def close - end - - def size - 0 - end - - def eof? - true - end - - def sync - true - end - - def sync=(v) - end - - def puts(*ary) - end - - def write(*ary) - end - - def flush - self - end - - # This is used as singleton class, so can't have state. - def closed? - false - end - - def set_encoding(enc) - self - end - - # per rack spec - def external_encoding - Encoding::ASCII_8BIT - end - - def binmode - self - end - - def binmode? - true - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin.rb deleted file mode 100644 index 8a943b5..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin.rb +++ /dev/null @@ -1,111 +0,0 @@ -# frozen_string_literal: true - -module Puma - class UnknownPlugin < RuntimeError; end - - class PluginLoader - def initialize - @instances = [] - end - - def create(name) - if cls = Plugins.find(name) - plugin = cls.new - @instances << plugin - return plugin - end - - raise UnknownPlugin, "File failed to register properly named plugin" - end - - def fire_starts(launcher) - @instances.each do |i| - if i.respond_to? :start - i.start(launcher) - end - end - end - end - - class PluginRegistry - def initialize - @plugins = {} - @background = [] - end - - def register(name, cls) - @plugins[name] = cls - end - - def find(name) - name = name.to_s - - if cls = @plugins[name] - return cls - end - - begin - require "puma/plugin/#{name}" - rescue LoadError - raise UnknownPlugin, "Unable to find plugin: #{name}" - end - - if cls = @plugins[name] - return cls - end - - raise UnknownPlugin, "file failed to register a plugin" - end - - def add_background(blk) - @background << blk - end - - def fire_background - @background.each_with_index do |b, i| - Thread.new do - Puma.set_thread_name "plgn bg #{i}" - b.call - end - end - end - end - - Plugins = PluginRegistry.new - - class Plugin - # Matches - # "C:/Ruby22/lib/ruby/gems/2.2.0/gems/puma-3.0.1/lib/puma/plugin/tmp_restart.rb:3:in `'" - # AS - # C:/Ruby22/lib/ruby/gems/2.2.0/gems/puma-3.0.1/lib/puma/plugin/tmp_restart.rb - CALLER_FILE = / - \A # start of string - .+ # file path (one or more characters) - (?= # stop previous match when - :\d+ # a colon is followed by one or more digits - :in # followed by a colon followed by in - ) - /x - - def self.extract_name(ary) - path = ary.first[CALLER_FILE] - - m = %r!puma/plugin/([^/]*)\.rb$!.match(path) - m[1] - end - - def self.create(&blk) - name = extract_name(caller) - - cls = Class.new(self) - - cls.class_eval(&blk) - - Plugins.register name, cls - end - - def in_background(&blk) - Plugins.add_background blk - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin/systemd.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin/systemd.rb deleted file mode 100644 index d6c4715..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin/systemd.rb +++ /dev/null @@ -1,90 +0,0 @@ -# frozen_string_literal: true - -require_relative '../plugin' - -# Puma's systemd integration allows Puma to inform systemd: -# 1. when it has successfully started -# 2. when it is starting shutdown -# 3. periodically for a liveness check with a watchdog thread -# 4. periodically set the status -Puma::Plugin.create do - def start(launcher) - require_relative '../sd_notify' - - launcher.log_writer.log "* Enabling systemd notification integration" - - # hook_events - launcher.events.on_booted { Puma::SdNotify.ready } - launcher.events.on_stopped { Puma::SdNotify.stopping } - launcher.events.on_restart { Puma::SdNotify.reloading } - - # start watchdog - if Puma::SdNotify.watchdog? - ping_f = watchdog_sleep_time - - in_background do - launcher.log_writer.log "Pinging systemd watchdog every #{ping_f.round(1)} sec" - loop do - sleep ping_f - Puma::SdNotify.watchdog - end - end - end - - # start status loop - instance = self - sleep_time = 1.0 - in_background do - launcher.log_writer.log "Sending status to systemd every #{sleep_time.round(1)} sec" - - loop do - sleep sleep_time - # TODO: error handling? - Puma::SdNotify.status(instance.status) - end - end - end - - def status - if clustered? - messages = stats[:worker_status].map do |worker| - common_message(worker[:last_status]) - end.join(',') - - "Puma #{Puma::Const::VERSION}: cluster: #{booted_workers}/#{workers}, worker_status: [#{messages}]" - else - "Puma #{Puma::Const::VERSION}: worker: #{common_message(stats)}" - end - end - - private - - def watchdog_sleep_time - usec = Integer(ENV["WATCHDOG_USEC"]) - - sec_f = usec / 1_000_000.0 - # "It is recommended that a daemon sends a keep-alive notification message - # to the service manager every half of the time returned here." - sec_f / 2 - end - - def stats - Puma.stats_hash - end - - def clustered? - stats.has_key?(:workers) - end - - def workers - stats.fetch(:workers, 1) - end - - def booted_workers - stats.fetch(:booted_workers, 1) - end - - def common_message(stats) - "{ #{stats[:running]}/#{stats[:max_threads]} threads, #{stats[:pool_capacity]} available, #{stats[:backlog]} backlog }" - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin/tmp_restart.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin/tmp_restart.rb deleted file mode 100644 index 5136023..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/plugin/tmp_restart.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -require_relative '../plugin' - -Puma::Plugin.create do - def start(launcher) - path = File.join("tmp", "restart.txt") - - orig = nil - - # If we can't write to the path, then just don't bother with this plugin - begin - File.write(path, "") unless File.exist?(path) - orig = File.stat(path).mtime - rescue SystemCallError - return - end - - in_background do - while true - sleep 2 - - begin - mtime = File.stat(path).mtime - rescue SystemCallError - # If the file has disappeared, assume that means don't restart - else - if mtime > orig - launcher.restart - break - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/puma_http11.so b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/puma_http11.so deleted file mode 100755 index 4a104ac331acf46fd516928c9ca60ce090adc7d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141920 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 e - warn e.message - abort opt_parser.to_s - end - - options[:config] = args.last if args.last - options - end - - def handler_opts(options) - begin - info = [] - server = Rack::Handler.get(options[:server]) || Rack::Handler.default(options) - if server&.respond_to?(:valid_options) - info << "" - info << "Server-specific options for #{server.name}:" - - has_options = false - server.valid_options.each do |name, description| - next if /^(Host|Port)[^a-zA-Z]/.match? name.to_s # ignore handler's host and port options, we do our own. - - info << " -O %-21s %s" % [name, description] - has_options = true - end - return "" if !has_options - end - info.join("\n") - rescue NameError - return "Warning: Could not find handler specified (#{options[:server] || 'default'}) to determine handler-specific options" - end - end - end - - # Rack::Builder implements a small DSL to iteratively construct Rack - # applications. - # - # Example: - # - # require 'rack/lobster' - # app = Rack::Builder.new do - # use Rack::CommonLogger - # use Rack::ShowExceptions - # map "/lobster" do - # use Rack::Lint - # run Rack::Lobster.new - # end - # end - # - # run app - # - # Or - # - # app = Rack::Builder.app do - # use Rack::CommonLogger - # run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['OK']] } - # end - # - # run app - # - # +use+ adds middleware to the stack, +run+ dispatches to an application. - # You can use +map+ to construct a Rack::URLMap in a convenient way. - - class Builder - def self.parse_file(config, opts = Options.new) - options = {} - if config =~ /\.ru$/ - cfgfile = ::File.read(config) - if cfgfile[/^#\\(.*)/] && opts - options = opts.parse! $1.split(/\s+/) - end - cfgfile.sub!(/^__END__\n.*\Z/m, '') - app = new_from_string cfgfile, config - else - require config - app = Object.const_get(::File.basename(config, '.rb').capitalize) - end - [app, options] - end - - def self.new_from_string(builder_script, file="(rackup)") - eval "Puma::Rack::Builder.new {\n" + builder_script + "\n}.to_app", - TOPLEVEL_BINDING, file, 0 - end - - def initialize(default_app = nil, &block) - @use, @map, @run, @warmup = [], nil, default_app, nil - - # Conditionally load rack now, so that any rack middlewares, - # etc are available. - begin - require 'rack' - rescue LoadError - end - - instance_eval(&block) if block - end - - def self.app(default_app = nil, &block) - self.new(default_app, &block).to_app - end - - # Specifies middleware to use in a stack. - # - # class Middleware - # def initialize(app) - # @app = app - # end - # - # def call(env) - # env["rack.some_header"] = "setting an example" - # @app.call(env) - # end - # end - # - # use Middleware - # run lambda { |env| [200, { "Content-Type" => "text/plain" }, ["OK"]] } - # - # All requests through to this application will first be processed by the middleware class. - # The +call+ method in this example sets an additional environment key which then can be - # referenced in the application if required. - def use(middleware, *args, &block) - if @map - mapping, @map = @map, nil - @use << proc { |app| generate_map app, mapping } - end - @use << proc { |app| middleware.new(app, *args, &block) } - end - - # Takes an argument that is an object that responds to #call and returns a Rack response. - # The simplest form of this is a lambda object: - # - # run lambda { |env| [200, { "Content-Type" => "text/plain" }, ["OK"]] } - # - # However this could also be a class: - # - # class Heartbeat - # def self.call(env) - # [200, { "Content-Type" => "text/plain" }, ["OK"]] - # end - # end - # - # run Heartbeat - def run(app) - @run = app - end - - # Takes a lambda or block that is used to warm-up the application. - # - # warmup do |app| - # client = Rack::MockRequest.new(app) - # client.get('/') - # end - # - # use SomeMiddleware - # run MyApp - def warmup(prc=nil, &block) - @warmup = prc || block - end - - # Creates a route within the application. - # - # Rack::Builder.app do - # map '/' do - # run Heartbeat - # end - # end - # - # The +use+ method can also be used here to specify middleware to run under a specific path: - # - # Rack::Builder.app do - # map '/' do - # use Middleware - # run Heartbeat - # end - # end - # - # This example includes a piece of middleware which will run before requests hit +Heartbeat+. - # - def map(path, &block) - @map ||= {} - @map[path] = block - end - - def to_app - app = @map ? generate_map(@run, @map) : @run - fail "missing run or map statement" unless app - app = @use.reverse.inject(app) { |a,e| e[a] } - @warmup&.call app - app - end - - def call(env) - to_app.call(env) - end - - private - - def generate_map(default_app, mapping) - require_relative 'urlmap' - - mapped = default_app ? {'/' => default_app} : {} - mapping.each { |r,b| mapped[r] = self.class.new(default_app, &b).to_app } - URLMap.new(mapped) - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack/urlmap.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack/urlmap.rb deleted file mode 100644 index baab299..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack/urlmap.rb +++ /dev/null @@ -1,93 +0,0 @@ -# frozen_string_literal: true - -module Puma::Rack - # Rack::URLMap takes a hash mapping urls or paths to apps, and - # dispatches accordingly. Support for HTTP/1.1 host names exists if - # the URLs start with http:// or https://. - # - # URLMap modifies the SCRIPT_NAME and PATH_INFO such that the part - # relevant for dispatch is in the SCRIPT_NAME, and the rest in the - # PATH_INFO. This should be taken care of when you need to - # reconstruct the URL in order to create links. - # - # URLMap dispatches in such a way that the longest paths are tried - # first, since they are most specific. - - class URLMap - NEGATIVE_INFINITY = -1.0 / 0.0 - INFINITY = 1.0 / 0.0 - - def initialize(map = {}) - remap(map) - end - - def remap(map) - @mapping = map.map { |location, app| - if location =~ %r{\Ahttps?://(.*?)(/.*)} - host, location = $1, $2 - else - host = nil - end - - unless location[0] == ?/ - raise ArgumentError, "paths need to start with /" - end - - location = location.chomp('/') - match = Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", Regexp::NOENCODING) - - [host, location, match, app] - }.sort_by do |(host, location, _, _)| - [host ? -host.size : INFINITY, -location.size] - end - end - - def call(env) - path = env['PATH_INFO'] - script_name = env['SCRIPT_NAME'] - http_host = env['HTTP_HOST'] - server_name = env['SERVER_NAME'] - server_port = env['SERVER_PORT'] - - is_same_server = casecmp?(http_host, server_name) || - casecmp?(http_host, "#{server_name}:#{server_port}") - - @mapping.each do |host, location, match, app| - unless casecmp?(http_host, host) \ - || casecmp?(server_name, host) \ - || (!host && is_same_server) - next - end - - next unless m = match.match(path.to_s) - - rest = m[1] - next unless !rest || rest.empty? || rest[0] == ?/ - - env['SCRIPT_NAME'] = (script_name + location) - env['PATH_INFO'] = rest - - return app.call(env) - end - - [404, {'Content-Type' => "text/plain", "X-Cascade" => "pass"}, ["Not Found: #{path}"]] - - ensure - env['PATH_INFO'] = path - env['SCRIPT_NAME'] = script_name - end - - private - def casecmp?(v1, v2) - # if both nil, or they're the same string - return true if v1 == v2 - - # if either are nil... (but they're not the same) - return false if v1.nil? - return false if v2.nil? - - # otherwise check they're not case-insensitive the same - v1.casecmp(v2).zero? - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack_default.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack_default.rb deleted file mode 100644 index fa7ea2e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/rack_default.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -require_relative '../rack/handler/puma' - -# rackup was removed in Rack 3, it is now a separate gem -if Object.const_defined? :Rackup - module Rackup - module Handler - def self.default(options = {}) - ::Rackup::Handler::Puma - end - end - end -elsif Object.const_defined?(:Rack) && Rack.release < '3' - module Rack - module Handler - def self.default(options = {}) - ::Rack::Handler::Puma - end - end - end -else - raise "Rack 3 must be used with the Rackup gem" -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/reactor.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/reactor.rb deleted file mode 100644 index 1d74b42..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/reactor.rb +++ /dev/null @@ -1,125 +0,0 @@ -# frozen_string_literal: true - -module Puma - class UnsupportedBackend < StandardError; end - - # Monitors a collection of IO objects, calling a block whenever - # any monitored object either receives data or times out, or when the Reactor shuts down. - # - # The waiting/wake up is performed with nio4r, which will use the appropriate backend (libev, - # Java NIO or just plain IO#select). The call to `NIO::Selector#select` will - # 'wakeup' any IO object that receives data. - # - # This class additionally tracks a timeout for every added object, - # and wakes up any object when its timeout elapses. - # - # The implementation uses a Queue to synchronize adding new objects from the internal select loop. - class Reactor - # Create a new Reactor to monitor IO objects added by #add. - # The provided block will be invoked when an IO has data available to read, - # its timeout elapses, or when the Reactor shuts down. - def initialize(backend, &block) - require 'nio' - valid_backends = [:auto, *::NIO::Selector.backends] - unless valid_backends.include?(backend) - raise ArgumentError.new("unsupported IO selector backend: #{backend} (available backends: #{valid_backends.join(', ')})") - end - - @selector = ::NIO::Selector.new(NIO::Selector.backends.delete(backend)) - @input = Queue.new - @timeouts = [] - @block = block - end - - # Run the internal select loop, using a background thread by default. - def run(background=true) - if background - @thread = Thread.new do - Puma.set_thread_name "reactor" - select_loop - end - else - select_loop - end - end - - # Add a new client to monitor. - # The object must respond to #timeout and #timeout_at. - # Returns false if the reactor is already shut down. - def add(client) - @input << client - @selector.wakeup - true - rescue ClosedQueueError, IOError # Ignore if selector is already closed - false - end - - # Shutdown the reactor, blocking until the background thread is finished. - def shutdown - @input.close - begin - @selector.wakeup - rescue IOError # Ignore if selector is already closed - end - @thread&.join - end - - private - - def select_loop - close_selector = true - begin - until @input.closed? && @input.empty? - # Wakeup any registered object that receives incoming data. - # Block until the earliest timeout or Selector#wakeup is called. - timeout = (earliest = @timeouts.first) && earliest.timeout - @selector.select(timeout) {|mon| wakeup!(mon.value)} - - # Wakeup all objects that timed out. - timed_out = @timeouts.take_while {|t| t.timeout == 0} - timed_out.each { |c| wakeup! c } - - unless @input.empty? - until @input.empty? - client = @input.pop - register(client) if client.io_ok? - end - @timeouts.sort_by!(&:timeout_at) - end - end - rescue StandardError => e - STDERR.puts "Error in reactor loop escaped: #{e.message} (#{e.class})" - STDERR.puts e.backtrace - - # NoMethodError may be rarely raised when calling @selector.select, which - # is odd. Regardless, it may continue for thousands of calls if retried. - # Also, when it raises, @selector.close also raises an error. - if NoMethodError === e - close_selector = false - else - retry - end - end - # Wakeup all remaining objects on shutdown. - @timeouts.each(&@block) - @selector.close if close_selector - end - - # Start monitoring the object. - def register(client) - @selector.register(client.to_io, :r).value = client - @timeouts << client - rescue ArgumentError - # unreadable clients raise error when processed by NIO - end - - # 'Wake up' a monitored object by calling the provided block. - # Stop monitoring the object if the block returns `true`. - def wakeup!(client) - if @block.call client - @selector.deregister client.to_io - @timeouts.delete client - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/request.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/request.rb deleted file mode 100644 index f8aabf2..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/request.rb +++ /dev/null @@ -1,692 +0,0 @@ -# frozen_string_literal: true - -module Puma - #———————————————————————— DO NOT USE — this class is for internal use only ——— - - - # The methods here are included in Server, but are separated into this file. - # All the methods here pertain to passing the request to the app, then - # writing the response back to the client. - # - # None of the methods here are called externally, with the exception of - # #handle_request, which is called in Server#process_client. - # @version 5.0.3 - # - module Request # :nodoc: - - # Single element array body: smaller bodies are written to io_buffer first, - # then a single write from io_buffer. Larger sizes are written separately. - # Also fixes max size of chunked file body read. - BODY_LEN_MAX = 1_024 * 256 - - # File body: smaller bodies are combined with io_buffer, then written to - # socket. Larger bodies are written separately using `copy_stream` - IO_BODY_MAX = 1_024 * 64 - - # Array body: elements are collected in io_buffer. When io_buffer's size - # exceeds value, they are written to the socket. - IO_BUFFER_LEN_MAX = 1_024 * 512 - - SOCKET_WRITE_ERR_MSG = "Socket timeout writing data" - - CUSTOM_STAT = 'CUSTOM' - - include Puma::Const - - # Takes the request contained in +client+, invokes the Rack application to construct - # the response and writes it back to +client.io+. - # - # It'll return +false+ when the connection is closed, this doesn't mean - # that the response wasn't successful. - # - # It'll return +:async+ if the connection remains open but will be handled - # elsewhere, i.e. the connection has been hijacked by the Rack application. - # - # Finally, it'll return +true+ on keep-alive connections. - # @param client [Puma::Client] - # @param requests [Integer] - # @return [Boolean,:async] - # - def handle_request(client, requests) - env = client.env - io_buffer = client.io_buffer - socket = client.io # io may be a MiniSSL::Socket - app_body = nil - - return false if closed_socket?(socket) - - if client.http_content_length_limit_exceeded - return prepare_response(413, {}, ["Payload Too Large"], requests, client) - end - - normalize_env env, client - - env[PUMA_SOCKET] = socket - - if env[HTTPS_KEY] && socket.peercert - env[PUMA_PEERCERT] = socket.peercert - end - - env[HIJACK_P] = true - env[HIJACK] = client - - env[RACK_INPUT] = client.body - env[RACK_URL_SCHEME] ||= default_server_port(env) == PORT_443 ? HTTPS : HTTP - - if @early_hints - env[EARLY_HINTS] = lambda { |headers| - begin - unless (str = str_early_hints headers).empty? - fast_write_str socket, "HTTP/1.1 103 Early Hints\r\n#{str}\r\n" - end - rescue ConnectionError => e - @log_writer.debug_error e - # noop, if we lost the socket we just won't send the early hints - end - } - end - - req_env_post_parse env - - # A rack extension. If the app writes #call'ables to this - # array, we will invoke them when the request is done. - # - env[RACK_AFTER_REPLY] ||= [] - - begin - if @supported_http_methods == :any || @supported_http_methods.key?(env[REQUEST_METHOD]) - status, headers, app_body = @thread_pool.with_force_shutdown do - @app.call(env) - end - else - @log_writer.log "Unsupported HTTP method used: #{env[REQUEST_METHOD]}" - status, headers, app_body = [501, {}, ["#{env[REQUEST_METHOD]} method is not supported"]] - end - - # app_body needs to always be closed, hold value in case lowlevel_error - # is called - res_body = app_body - - # full hijack, app called env['rack.hijack'] - return :async if client.hijacked - - status = status.to_i - - if status == -1 - unless headers.empty? and res_body == [] - raise "async response must have empty headers and body" - end - - return :async - end - rescue ThreadPool::ForceShutdown => e - @log_writer.unknown_error e, client, "Rack app" - @log_writer.log "Detected force shutdown of a thread" - - status, headers, res_body = lowlevel_error(e, env, 503) - rescue Exception => e - @log_writer.unknown_error e, client, "Rack app" - - status, headers, res_body = lowlevel_error(e, env, 500) - end - prepare_response(status, headers, res_body, requests, client) - ensure - io_buffer.reset - uncork_socket client.io - app_body.close if app_body.respond_to? :close - client&.tempfile_close - if after_reply = env[RACK_AFTER_REPLY] - after_reply.each do |o| - begin - o.call - rescue StandardError => e - @log_writer.debug_error e - end - end - end - end - - # Assembles the headers and prepares the body for actually sending the - # response via `#fast_write_response`. - # - # @param status [Integer] the status returned by the Rack application - # @param headers [Hash] the headers returned by the Rack application - # @param res_body [Array] the body returned by the Rack application or - # a call to `Server#lowlevel_error` - # @param requests [Integer] number of inline requests handled - # @param client [Puma::Client] - # @return [Boolean,:async] keep-alive status or `:async` - def prepare_response(status, headers, res_body, requests, client) - env = client.env - socket = client.io - io_buffer = client.io_buffer - - return false if closed_socket?(socket) - - # Close the connection after a reasonable number of inline requests - # if the server is at capacity and the listener has a new connection ready. - # This allows Puma to service connections fairly when the number - # of concurrent connections exceeds the size of the threadpool. - force_keep_alive = if @enable_keep_alives - requests < @max_fast_inline || - @thread_pool.busy_threads < @max_threads || - !client.listener.to_io.wait_readable(0) - else - # Always set force_keep_alive to false if the server has keep-alives not enabled. - false - end - - resp_info = str_headers(env, status, headers, res_body, io_buffer, force_keep_alive) - - close_body = false - response_hijack = nil - content_length = resp_info[:content_length] - keep_alive = resp_info[:keep_alive] - - if res_body.respond_to?(:each) && !resp_info[:response_hijack] - # below converts app_body into body, dependent on app_body's characteristics, and - # content_length will be set if it can be determined - if !content_length && !resp_info[:transfer_encoding] && status != 204 - if res_body.respond_to?(:to_ary) && (array_body = res_body.to_ary) && - array_body.is_a?(Array) - body = array_body.compact - content_length = body.sum(&:bytesize) - elsif res_body.is_a?(File) && res_body.respond_to?(:size) - body = res_body - content_length = body.size - elsif res_body.respond_to?(:to_path) && (fn = res_body.to_path) && - File.readable?(fn) - body = File.open fn, 'rb' - content_length = body.size - close_body = true - else - body = res_body - end - elsif !res_body.is_a?(::File) && res_body.respond_to?(:to_path) && - (fn = res_body.to_path) && File.readable?(fn = res_body.to_path) - body = File.open fn, 'rb' - content_length = body.size - close_body = true - elsif !res_body.is_a?(::File) && res_body.respond_to?(:filename) && - res_body.respond_to?(:bytesize) && File.readable?(fn = res_body.filename) - # Sprockets::Asset - content_length = res_body.bytesize unless content_length - if (body_str = res_body.to_hash[:source]) - body = [body_str] - else # avoid each and use a File object - body = File.open fn, 'rb' - close_body = true - end - else - body = res_body - end - else - # partial hijack, from Rack spec: - # Servers must ignore the body part of the response tuple when the - # rack.hijack response header is present. - response_hijack = resp_info[:response_hijack] || res_body - end - - line_ending = LINE_END - - cork_socket socket - - if resp_info[:no_body] - # 101 (Switching Protocols) doesn't return here or have content_length, - # it should be using `response_hijack` - unless status == 101 - if content_length && status != 204 - io_buffer.append CONTENT_LENGTH_S, content_length.to_s, line_ending - end - - io_buffer << LINE_END - fast_write_str socket, io_buffer.read_and_reset - socket.flush - return keep_alive - end - else - if content_length - io_buffer.append CONTENT_LENGTH_S, content_length.to_s, line_ending - chunked = false - elsif !response_hijack && resp_info[:allow_chunked] - io_buffer << TRANSFER_ENCODING_CHUNKED - chunked = true - end - end - - io_buffer << line_ending - - # partial hijack, we write headers, then hand the socket to the app via - # response_hijack.call - if response_hijack - fast_write_str socket, io_buffer.read_and_reset - uncork_socket socket - response_hijack.call socket - return :async - end - - fast_write_response socket, body, io_buffer, chunked, content_length.to_i - body.close if close_body - keep_alive - end - - # @param env [Hash] see Puma::Client#env, from request - # @return [Puma::Const::PORT_443,Puma::Const::PORT_80] - # - def default_server_port(env) - if ['on', HTTPS].include?(env[HTTPS_KEY]) || env[HTTP_X_FORWARDED_PROTO].to_s[0...5] == HTTPS || env[HTTP_X_FORWARDED_SCHEME] == HTTPS || env[HTTP_X_FORWARDED_SSL] == "on" - PORT_443 - else - PORT_80 - end - end - - # Used to write 'early hints', 'no body' responses, 'hijacked' responses, - # and body segments (called by `fast_write_response`). - # Writes a string to a socket (normally `Client#io`) using `write_nonblock`. - # Large strings may not be written in one pass, especially if `io` is a - # `MiniSSL::Socket`. - # @param socket [#write_nonblock] the request/response socket - # @param str [String] the string written to the io - # @raise [ConnectionError] - # - def fast_write_str(socket, str) - n = 0 - byte_size = str.bytesize - while n < byte_size - begin - n += socket.write_nonblock(n.zero? ? str : str.byteslice(n..-1)) - rescue Errno::EAGAIN, Errno::EWOULDBLOCK - unless socket.wait_writable WRITE_TIMEOUT - raise ConnectionError, SOCKET_WRITE_ERR_MSG - end - retry - rescue Errno::EPIPE, SystemCallError, IOError - raise ConnectionError, SOCKET_WRITE_ERR_MSG - end - end - end - - # Used to write headers and body. - # Writes to a socket (normally `Client#io`) using `#fast_write_str`. - # Accumulates `body` items into `io_buffer`, then writes to socket. - # @param socket [#write] the response socket - # @param body [Enumerable, File] the body object - # @param io_buffer [Puma::IOBuffer] contains headers - # @param chunked [Boolean] - # @paramn content_length [Integer - # @raise [ConnectionError] - # - def fast_write_response(socket, body, io_buffer, chunked, content_length) - if body.is_a?(::File) && body.respond_to?(:read) - if chunked # would this ever happen? - while chunk = body.read(BODY_LEN_MAX) - io_buffer.append chunk.bytesize.to_s(16), LINE_END, chunk, LINE_END - end - fast_write_str socket, CLOSE_CHUNKED - else - if content_length <= IO_BODY_MAX - io_buffer.write body.read(content_length) - fast_write_str socket, io_buffer.read_and_reset - else - fast_write_str socket, io_buffer.read_and_reset - IO.copy_stream body, socket - end - end - elsif body.is_a?(::Array) && body.length == 1 - body_first = nil - # using body_first = body.first causes issues? - body.each { |str| body_first ||= str } - - if body_first.is_a?(::String) && body_first.bytesize < BODY_LEN_MAX - # smaller body, write to io_buffer first - io_buffer.write body_first - fast_write_str socket, io_buffer.read_and_reset - else - # large body, write both header & body to socket - fast_write_str socket, io_buffer.read_and_reset - fast_write_str socket, body_first - end - elsif body.is_a?(::Array) - # for array bodies, flush io_buffer to socket when size is greater than - # IO_BUFFER_LEN_MAX - if chunked - body.each do |part| - next if (byte_size = part.bytesize).zero? - io_buffer.append byte_size.to_s(16), LINE_END, part, LINE_END - if io_buffer.length > IO_BUFFER_LEN_MAX - fast_write_str socket, io_buffer.read_and_reset - end - end - io_buffer.write CLOSE_CHUNKED - else - body.each do |part| - next if part.bytesize.zero? - io_buffer.write part - if io_buffer.length > IO_BUFFER_LEN_MAX - fast_write_str socket, io_buffer.read_and_reset - end - end - end - # may write last body part for non-chunked, also headers if array is empty - fast_write_str(socket, io_buffer.read_and_reset) unless io_buffer.length.zero? - else - # for enum bodies - if chunked - empty_body = true - body.each do |part| - next if part.nil? || (byte_size = part.bytesize).zero? - empty_body = false - io_buffer.append byte_size.to_s(16), LINE_END, part, LINE_END - fast_write_str socket, io_buffer.read_and_reset - end - if empty_body - io_buffer << CLOSE_CHUNKED - fast_write_str socket, io_buffer.read_and_reset - else - fast_write_str socket, CLOSE_CHUNKED - end - else - fast_write_str socket, io_buffer.read_and_reset - body.each do |part| - next if part.bytesize.zero? - fast_write_str socket, part - end - end - end - socket.flush - rescue Errno::EAGAIN, Errno::EWOULDBLOCK - raise ConnectionError, SOCKET_WRITE_ERR_MSG - rescue Errno::EPIPE, SystemCallError, IOError - raise ConnectionError, SOCKET_WRITE_ERR_MSG - end - - private :fast_write_str, :fast_write_response - - # Given a Hash +env+ for the request read from +client+, add - # and fixup keys to comply with Rack's env guidelines. - # @param env [Hash] see Puma::Client#env, from request - # @param client [Puma::Client] only needed for Client#peerip - # - def normalize_env(env, client) - if host = env[HTTP_HOST] - # host can be a hostname, ipv4 or bracketed ipv6. Followed by an optional port. - if colon = host.rindex("]:") # IPV6 with port - env[SERVER_NAME] = host[0, colon+1] - env[SERVER_PORT] = host[colon+2, host.bytesize] - elsif !host.start_with?("[") && colon = host.index(":") # not hostname or IPV4 with port - env[SERVER_NAME] = host[0, colon] - env[SERVER_PORT] = host[colon+1, host.bytesize] - else - env[SERVER_NAME] = host - env[SERVER_PORT] = default_server_port(env) - end - else - env[SERVER_NAME] = LOCALHOST - env[SERVER_PORT] = default_server_port(env) - end - - unless env[REQUEST_PATH] - # it might be a dumbass full host request header - uri = begin - URI.parse(env[REQUEST_URI]) - rescue URI::InvalidURIError - raise Puma::HttpParserError - end - env[REQUEST_PATH] = uri.path - - # A nil env value will cause a LintError (and fatal errors elsewhere), - # so only set the env value if there actually is a value. - env[QUERY_STRING] = uri.query if uri.query - end - - env[PATH_INFO] = env[REQUEST_PATH].to_s # #to_s in case it's nil - - # From https://www.ietf.org/rfc/rfc3875 : - # "Script authors should be aware that the REMOTE_ADDR and - # REMOTE_HOST meta-variables (see sections 4.1.8 and 4.1.9) - # may not identify the ultimate source of the request. - # They identify the client for the immediate request to the - # server; that client may be a proxy, gateway, or other - # intermediary acting on behalf of the actual source client." - # - - unless env.key?(REMOTE_ADDR) - begin - addr = client.peerip - rescue Errno::ENOTCONN - # Client disconnects can result in an inability to get the - # peeraddr from the socket; default to unspec. - if client.peer_family == Socket::AF_INET6 - addr = UNSPECIFIED_IPV6 - else - addr = UNSPECIFIED_IPV4 - end - end - - # Set unix socket addrs to localhost - if addr.empty? - if client.peer_family == Socket::AF_INET6 - addr = LOCALHOST_IPV6 - else - addr = LOCALHOST_IPV4 - end - end - - env[REMOTE_ADDR] = addr - end - - # The legacy HTTP_VERSION header can be sent as a client header. - # Rack v4 may remove using HTTP_VERSION. If so, remove this line. - env[HTTP_VERSION] = env[SERVER_PROTOCOL] - end - private :normalize_env - - # @param header_key [#to_s] - # @return [Boolean] - # - def illegal_header_key?(header_key) - !!(ILLEGAL_HEADER_KEY_REGEX =~ header_key.to_s) - end - - # @param header_value [#to_s] - # @return [Boolean] - # - def illegal_header_value?(header_value) - !!(ILLEGAL_HEADER_VALUE_REGEX =~ header_value.to_s) - end - private :illegal_header_key?, :illegal_header_value? - - # Fixup any headers with `,` in the name to have `_` now. We emit - # headers with `,` in them during the parse phase to avoid ambiguity - # with the `-` to `_` conversion for critical headers. But here for - # compatibility, we'll convert them back. This code is written to - # avoid allocation in the common case (ie there are no headers - # with `,` in their names), that's why it has the extra conditionals. - # - # @note If a normalized version of a `,` header already exists, we ignore - # the `,` version. This prevents clobbering headers managed by proxies - # but not by clients (Like X-Forwarded-For). - # - # @param env [Hash] see Puma::Client#env, from request, modifies in place - # @version 5.0.3 - # - def req_env_post_parse(env) - to_delete = nil - to_add = nil - - env.each do |k,v| - if k.start_with?("HTTP_") && k.include?(",") && !UNMASKABLE_HEADERS.key?(k) - if to_delete - to_delete << k - else - to_delete = [k] - end - - new_k = k.tr(",", "_") - if env.key?(new_k) - next - end - - unless to_add - to_add = {} - end - - to_add[new_k] = v - end - end - - if to_delete # rubocop:disable Style/SafeNavigation - to_delete.each { |k| env.delete(k) } - end - - if to_add - env.merge! to_add - end - end - private :req_env_post_parse - - # Used in the lambda for env[ `Puma::Const::EARLY_HINTS` ] - # @param headers [Hash] the headers returned by the Rack application - # @return [String] - # @version 5.0.3 - # - def str_early_hints(headers) - eh_str = +"" - headers.each_pair do |k, vs| - next if illegal_header_key?(k) - - if vs.respond_to?(:to_s) && !vs.to_s.empty? - vs.to_s.split(NEWLINE).each do |v| - next if illegal_header_value?(v) - eh_str << "#{k}: #{v}\r\n" - end - elsif !(vs.to_s.empty? || !illegal_header_value?(vs)) - eh_str << "#{k}: #{vs}\r\n" - end - end - eh_str.freeze - end - private :str_early_hints - - # @param status [Integer] status from the app - # @return [String] the text description from Puma::HTTP_STATUS_CODES - # - def fetch_status_code(status) - HTTP_STATUS_CODES.fetch(status) { CUSTOM_STAT } - end - private :fetch_status_code - - # Processes and write headers to the IOBuffer. - # @param env [Hash] see Puma::Client#env, from request - # @param status [Integer] the status returned by the Rack application - # @param headers [Hash] the headers returned by the Rack application - # @param content_length [Integer,nil] content length if it can be determined from the - # response body - # @param io_buffer [Puma::IOBuffer] modified inn place - # @param force_keep_alive [Boolean] 'anded' with keep_alive, based on system - # status and `@max_fast_inline` - # @return [Hash] resp_info - # @version 5.0.3 - # - def str_headers(env, status, headers, res_body, io_buffer, force_keep_alive) - - line_ending = LINE_END - colon = COLON - - resp_info = {} - resp_info[:no_body] = env[REQUEST_METHOD] == HEAD - - http_11 = env[SERVER_PROTOCOL] == HTTP_11 - if http_11 - resp_info[:allow_chunked] = true - resp_info[:keep_alive] = env.fetch(HTTP_CONNECTION, "").downcase != CLOSE - - # An optimization. The most common response is 200, so we can - # reply with the proper 200 status without having to compute - # the response header. - # - if status == 200 - io_buffer << HTTP_11_200 - else - io_buffer.append "#{HTTP_11} #{status} ", fetch_status_code(status), line_ending - - resp_info[:no_body] ||= status < 200 || STATUS_WITH_NO_ENTITY_BODY[status] - end - else - resp_info[:allow_chunked] = false - resp_info[:keep_alive] = env.fetch(HTTP_CONNECTION, "").downcase == KEEP_ALIVE - - # Same optimization as above for HTTP/1.1 - # - if status == 200 - io_buffer << HTTP_10_200 - else - io_buffer.append "HTTP/1.0 #{status} ", - fetch_status_code(status), line_ending - - resp_info[:no_body] ||= status < 200 || STATUS_WITH_NO_ENTITY_BODY[status] - end - end - - # regardless of what the client wants, we always close the connection - # if running without request queueing - resp_info[:keep_alive] &&= @queue_requests - - # see prepare_response - resp_info[:keep_alive] &&= force_keep_alive - - resp_info[:response_hijack] = nil - - headers.each do |k, vs| - next if illegal_header_key?(k) - - case k.downcase - when CONTENT_LENGTH2 - next if illegal_header_value?(vs) - # nil.to_i is 0, nil&.to_i is nil - resp_info[:content_length] = vs&.to_i - next - when TRANSFER_ENCODING - resp_info[:allow_chunked] = false - resp_info[:content_length] = nil - resp_info[:transfer_encoding] = vs - when HIJACK - resp_info[:response_hijack] = vs - next - when BANNED_HEADER_KEY - next - end - - ary = if vs.is_a?(::Array) && !vs.empty? - vs - elsif vs.respond_to?(:to_s) && !vs.to_s.empty? - vs.to_s.split NEWLINE - else - nil - end - if ary - ary.each do |v| - next if illegal_header_value?(v) - io_buffer.append k, colon, v, line_ending - end - else - io_buffer.append k, colon, line_ending - end - end - - # HTTP/1.1 & 1.0 assume different defaults: - # - HTTP 1.0 assumes the connection will be closed if not specified - # - HTTP 1.1 assumes the connection will be kept alive if not specified. - # Only set the header if we're doing something which is not the default - # for this protocol version - if http_11 - io_buffer << CONNECTION_CLOSE if !resp_info[:keep_alive] - else - io_buffer << CONNECTION_KEEP_ALIVE if resp_info[:keep_alive] - end - resp_info - end - private :str_headers - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/runner.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/runner.rb deleted file mode 100644 index 2b8a969..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/runner.rb +++ /dev/null @@ -1,220 +0,0 @@ -# frozen_string_literal: true - -require_relative 'server' -require_relative 'const' - -module Puma - # Generic class that is used by `Puma::Cluster` and `Puma::Single` to - # serve requests. This class spawns a new instance of `Puma::Server` via - # a call to `start_server`. - class Runner - - include ::Puma::Const::PipeRequest - - def initialize(launcher) - @launcher = launcher - @log_writer = launcher.log_writer - @events = launcher.events - @config = launcher.config - @options = launcher.options - @app = nil - @control = nil - @started_at = Time.now - @wakeup = nil - end - - # Returns the hash of configuration options. - # @return [Puma::UserFileDefaultOptions] - attr_reader :options - - def wakeup! - return unless @wakeup - - @wakeup.write PIPE_WAKEUP unless @wakeup.closed? - - rescue SystemCallError, IOError - Puma::Util.purge_interrupt_queue - end - - def development? - @options[:environment] == "development" - end - - def test? - @options[:environment] == "test" - end - - def log(str) - @log_writer.log str - end - - # @version 5.0.0 - def stop_control - @control&.stop true - end - - def error(str) - @log_writer.error str - end - - def debug(str) - @log_writer.log "- #{str}" if @options[:debug] - end - - def start_control - str = @options[:control_url] - return unless str - - require_relative 'app/status' - - if token = @options[:control_auth_token] - token = nil if token.empty? || token == 'none' - end - - app = Puma::App::Status.new @launcher, token - - # A Reactor is not created and nio4r is not loaded when 'queue_requests: false' - # Use `nil` for events, no hooks in control server - control = Puma::Server.new app, nil, - { min_threads: 0, max_threads: 1, queue_requests: false, log_writer: @log_writer } - - begin - control.binder.parse [str], nil, 'Starting control server' - rescue Errno::EADDRINUSE, Errno::EACCES => e - raise e, "Error: Control server address '#{str}' is already in use. Original error: #{e.message}" - end - - control.run thread_name: 'ctl' - @control = control - end - - # @version 5.0.0 - def close_control_listeners - @control.binder.close_listeners if @control - end - - # @!attribute [r] ruby_engine - # @deprecated Use `RUBY_DESCRIPTION` instead - def ruby_engine - warn "Puma::Runner#ruby_engine is deprecated; use RUBY_DESCRIPTION instead. It will be removed in puma v7." - - if !defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby" - "ruby #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}" - else - if defined?(RUBY_ENGINE_VERSION) - "#{RUBY_ENGINE} #{RUBY_ENGINE_VERSION} - ruby #{RUBY_VERSION}" - else - "#{RUBY_ENGINE} #{RUBY_VERSION}" - end - end - end - - def output_header(mode) - min_t = @options[:min_threads] - max_t = @options[:max_threads] - environment = @options[:environment] - - log "Puma starting in #{mode} mode..." - log "* Puma version: #{Puma::Const::PUMA_VERSION} (\"#{Puma::Const::CODE_NAME}\")" - log "* Ruby version: #{RUBY_DESCRIPTION}" - log "* Min threads: #{min_t}" - log "* Max threads: #{max_t}" - log "* Environment: #{environment}" - - if mode == "cluster" - log "* Master PID: #{Process.pid}" - else - log "* PID: #{Process.pid}" - end - end - - def redirected_io? - @options[:redirect_stdout] || @options[:redirect_stderr] - end - - def redirect_io - stdout = @options[:redirect_stdout] - stderr = @options[:redirect_stderr] - append = @options[:redirect_append] - - if stdout - ensure_output_directory_exists(stdout, 'STDOUT') - - STDOUT.reopen stdout, (append ? "a" : "w") - STDOUT.puts "=== puma startup: #{Time.now} ===" - STDOUT.flush unless STDOUT.sync - end - - if stderr - ensure_output_directory_exists(stderr, 'STDERR') - - STDERR.reopen stderr, (append ? "a" : "w") - STDERR.puts "=== puma startup: #{Time.now} ===" - STDERR.flush unless STDERR.sync - end - - if @options[:mutate_stdout_and_stderr_to_sync_on_write] - STDOUT.sync = true - STDERR.sync = true - end - end - - def load_and_bind - unless @config.app_configured? - error "No application configured, nothing to run" - exit 1 - end - - begin - @app = @config.app - rescue Exception => e - log "! Unable to load application: #{e.class}: #{e.message}" - raise e - end - - @launcher.binder.parse @options[:binds] - end - - # @!attribute [r] app - def app - @app ||= @config.app - end - - def start_server - server = Puma::Server.new(app, @events, @options) - server.inherit_binder(@launcher.binder) - server - end - - private - def ensure_output_directory_exists(path, io_name) - unless Dir.exist?(File.dirname(path)) - raise "Cannot redirect #{io_name} to #{path}" - end - end - - def utc_iso8601(val) - "#{val.utc.strftime '%FT%T'}Z" - end - - def stats - { - versions: { - puma: Puma::Const::PUMA_VERSION, - ruby: { - engine: RUBY_ENGINE, - version: RUBY_VERSION, - patchlevel: RUBY_PATCHLEVEL - } - } - } - end - - # this method call should always be guarded by `@log_writer.debug?` - def debug_loaded_extensions(str) - @log_writer.debug "────────────────────────────────── #{str}" - re_ext = /\.#{RbConfig::CONFIG['DLEXT']}\z/i - $LOADED_FEATURES.grep(re_ext).each { |f| @log_writer.debug(" #{f}") } - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/sd_notify.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/sd_notify.rb deleted file mode 100644 index 7001fd0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/sd_notify.rb +++ /dev/null @@ -1,146 +0,0 @@ -# frozen_string_literal: true - -require "socket" - -module Puma - # The MIT License - # - # Copyright (c) 2017-2022 Agis Anastasopoulos - # - # Permission is hereby granted, free of charge, to any person obtaining a copy of - # this software and associated documentation files (the "Software"), to deal in - # the Software without restriction, including without limitation the rights to - # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - # the Software, and to permit persons to whom the Software is furnished to do so, - # subject to the following conditions: - # - # The above copyright notice and this permission notice shall be included in all - # copies or substantial portions of the Software. - # - # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - # - # This is a copy of https://github.com/agis/ruby-sdnotify as of commit cca575c - # The only changes made was "rehoming" it within the Puma module to avoid - # namespace collisions and applying standard's code formatting style. - # - # SdNotify is a pure-Ruby implementation of sd_notify(3). It can be used to - # notify systemd about state changes. Methods of this package are no-op on - # non-systemd systems (eg. Darwin). - # - # The API maps closely to the original implementation of sd_notify(3), - # therefore be sure to check the official man pages prior to using SdNotify. - # - # @see https://www.freedesktop.org/software/systemd/man/sd_notify.html - module SdNotify - # Exception raised when there's an error writing to the notification socket - class NotifyError < RuntimeError; end - - READY = "READY=1" - RELOADING = "RELOADING=1" - STOPPING = "STOPPING=1" - STATUS = "STATUS=" - ERRNO = "ERRNO=" - MAINPID = "MAINPID=" - WATCHDOG = "WATCHDOG=1" - FDSTORE = "FDSTORE=1" - - def self.ready(unset_env=false) - notify(READY, unset_env) - end - - def self.reloading(unset_env=false) - notify(RELOADING, unset_env) - end - - def self.stopping(unset_env=false) - notify(STOPPING, unset_env) - end - - # @param status [String] a custom status string that describes the current - # state of the service - def self.status(status, unset_env=false) - notify("#{STATUS}#{status}", unset_env) - end - - # @param errno [Integer] - def self.errno(errno, unset_env=false) - notify("#{ERRNO}#{errno}", unset_env) - end - - # @param pid [Integer] - def self.mainpid(pid, unset_env=false) - notify("#{MAINPID}#{pid}", unset_env) - end - - def self.watchdog(unset_env=false) - notify(WATCHDOG, unset_env) - end - - def self.fdstore(unset_env=false) - notify(FDSTORE, unset_env) - end - - # @param [Boolean] true if the service manager expects watchdog keep-alive - # notification messages to be sent from this process. - # - # If the $WATCHDOG_USEC environment variable is set, - # and the $WATCHDOG_PID variable is unset or set to the PID of the current - # process - # - # @note Unlike sd_watchdog_enabled(3), this method does not mutate the - # environment. - def self.watchdog? - wd_usec = ENV["WATCHDOG_USEC"] - wd_pid = ENV["WATCHDOG_PID"] - - return false if !wd_usec - - begin - wd_usec = Integer(wd_usec) - rescue - return false - end - - return false if wd_usec <= 0 - return true if !wd_pid || wd_pid == $$.to_s - - false - end - - # Notify systemd with the provided state, via the notification socket, if - # any. - # - # Generally this method will be used indirectly through the other methods - # of the library. - # - # @param state [String] - # @param unset_env [Boolean] - # - # @return [Fixnum, nil] the number of bytes written to the notification - # socket or nil if there was no socket to report to (eg. the program wasn't - # started by systemd) - # - # @raise [NotifyError] if there was an error communicating with the systemd - # socket - # - # @see https://www.freedesktop.org/software/systemd/man/sd_notify.html - def self.notify(state, unset_env=false) - sock = ENV["NOTIFY_SOCKET"] - - return nil if !sock - - ENV.delete("NOTIFY_SOCKET") if unset_env - - begin - Addrinfo.unix(sock, :DGRAM).connect { |s| s.write state } - rescue StandardError => e - raise NotifyError, "#{e.class}: #{e.message}", e.backtrace - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/server.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/server.rb deleted file mode 100644 index 02e2748..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/server.rb +++ /dev/null @@ -1,688 +0,0 @@ -# frozen_string_literal: true - -require 'stringio' - -require_relative 'thread_pool' -require_relative 'const' -require_relative 'log_writer' -require_relative 'events' -require_relative 'null_io' -require_relative 'reactor' -require_relative 'client' -require_relative 'binder' -require_relative 'util' -require_relative 'request' - -require 'socket' -require 'io/wait' unless Puma::HAS_NATIVE_IO_WAIT - -module Puma - - # This method was private on Ruby 2.4 but became public on Ruby 2.5+: - Thread.send(:attr_accessor, :puma_server) - - # The HTTP Server itself. Serves out a single Rack app. - # - # This class is used by the `Puma::Single` and `Puma::Cluster` classes - # to generate one or more `Puma::Server` instances capable of handling requests. - # Each Puma process will contain one `Puma::Server` instance. - # - # The `Puma::Server` instance pulls requests from the socket, adds them to a - # `Puma::Reactor` where they get eventually passed to a `Puma::ThreadPool`. - # - # Each `Puma::Server` will have one reactor and one thread pool. - class Server - include Puma::Const - include Request - - attr_reader :options - attr_reader :thread - attr_reader :log_writer - attr_reader :events - attr_reader :min_threads, :max_threads # for #stats - attr_reader :requests_count # @version 5.0.0 - - # @todo the following may be deprecated in the future - attr_reader :auto_trim_time, :early_hints, :first_data_timeout, - :leak_stack_on_error, - :persistent_timeout, :reaping_time - - attr_accessor :app - attr_accessor :binder - - - # Create a server for the rack app +app+. - # - # +log_writer+ is a Puma::LogWriter object used to log info and error messages. - # - # +events+ is a Puma::Events object used to notify application status events. - # - # Server#run returns a thread that you can join on to wait for the server - # to do its work. - # - # @note Several instance variables exist so they are available for testing, - # and have default values set via +fetch+. Normally the values are set via - # `::Puma::Configuration.puma_default_options`. - # - # @note The `events` parameter is set to nil, and set to `Events.new` in code. - # Often `options` needs to be passed, but `events` does not. Using nil allows - # calling code to not require events.rb. - # - def initialize(app, events = nil, options = {}) - @app = app - @events = events || Events.new - - @check, @notify = nil - @status = :stop - - @thread = nil - @thread_pool = nil - - @options = if options.is_a?(UserFileDefaultOptions) - options - else - UserFileDefaultOptions.new(options, Configuration::DEFAULTS) - end - - @clustered = (@options.fetch :workers, 0) > 0 - @worker_write = @options[:worker_write] - @log_writer = @options.fetch :log_writer, LogWriter.stdio - @early_hints = @options[:early_hints] - @first_data_timeout = @options[:first_data_timeout] - @persistent_timeout = @options[:persistent_timeout] - @idle_timeout = @options[:idle_timeout] - @min_threads = @options[:min_threads] - @max_threads = @options[:max_threads] - @queue_requests = @options[:queue_requests] - @max_fast_inline = @options[:max_fast_inline] - @enable_keep_alives = @options[:enable_keep_alives] - @io_selector_backend = @options[:io_selector_backend] - @http_content_length_limit = @options[:http_content_length_limit] - - # make this a hash, since we prefer `key?` over `include?` - @supported_http_methods = - if @options[:supported_http_methods] == :any - :any - else - if (ary = @options[:supported_http_methods]) - ary - else - SUPPORTED_HTTP_METHODS - end.sort.product([nil]).to_h.freeze - end - - temp = !!(@options[:environment] =~ /\A(development|test)\z/) - @leak_stack_on_error = @options[:environment] ? temp : true - - @binder = Binder.new(log_writer) - - ENV['RACK_ENV'] ||= "development" - - @mode = :http - - @precheck_closing = true - - @requests_count = 0 - - @idle_timeout_reached = false - end - - def inherit_binder(bind) - @binder = bind - end - - class << self - # @!attribute [r] current - def current - Thread.current.puma_server - end - - # :nodoc: - # @version 5.0.0 - def tcp_cork_supported? - Socket.const_defined?(:TCP_CORK) && Socket.const_defined?(:IPPROTO_TCP) - end - - # :nodoc: - # @version 5.0.0 - def closed_socket_supported? - Socket.const_defined?(:TCP_INFO) && Socket.const_defined?(:IPPROTO_TCP) - end - private :tcp_cork_supported? - private :closed_socket_supported? - end - - # On Linux, use TCP_CORK to better control how the TCP stack - # packetizes our stream. This improves both latency and throughput. - # socket parameter may be an MiniSSL::Socket, so use to_io - # - if tcp_cork_supported? - # 6 == Socket::IPPROTO_TCP - # 3 == TCP_CORK - # 1/0 == turn on/off - def cork_socket(socket) - skt = socket.to_io - begin - skt.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_CORK, 1) if skt.kind_of? TCPSocket - rescue IOError, SystemCallError - Puma::Util.purge_interrupt_queue - end - end - - def uncork_socket(socket) - skt = socket.to_io - begin - skt.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_CORK, 0) if skt.kind_of? TCPSocket - rescue IOError, SystemCallError - Puma::Util.purge_interrupt_queue - end - end - else - def cork_socket(socket) - end - - def uncork_socket(socket) - end - end - - if closed_socket_supported? - UNPACK_TCP_STATE_FROM_TCP_INFO = "C".freeze - - def closed_socket?(socket) - skt = socket.to_io - return false unless skt.kind_of?(TCPSocket) && @precheck_closing - - begin - tcp_info = skt.getsockopt(Socket::IPPROTO_TCP, Socket::TCP_INFO) - rescue IOError, SystemCallError - Puma::Util.purge_interrupt_queue - @precheck_closing = false - false - else - state = tcp_info.unpack(UNPACK_TCP_STATE_FROM_TCP_INFO)[0] - # TIME_WAIT: 6, CLOSE: 7, CLOSE_WAIT: 8, LAST_ACK: 9, CLOSING: 11 - (state >= 6 && state <= 9) || state == 11 - end - end - else - def closed_socket?(socket) - false - end - end - - # @!attribute [r] backlog - def backlog - @thread_pool&.backlog - end - - # @!attribute [r] running - def running - @thread_pool&.spawned - end - - - # This number represents the number of requests that - # the server is capable of taking right now. - # - # For example if the number is 5 then it means - # there are 5 threads sitting idle ready to take - # a request. If one request comes in, then the - # value would be 4 until it finishes processing. - # @!attribute [r] pool_capacity - def pool_capacity - @thread_pool&.pool_capacity - end - - # @!attribute [r] busy_threads - def busy_threads - @thread_pool&.busy_threads - end - - # Runs the server. - # - # If +background+ is true (the default) then a thread is spun - # up in the background to handle requests. Otherwise requests - # are handled synchronously. - # - def run(background=true, thread_name: 'srv') - BasicSocket.do_not_reverse_lookup = true - - @events.fire :state, :booting - - @status = :run - - @thread_pool = ThreadPool.new(thread_name, options) { |client| process_client client } - - if @queue_requests - @reactor = Reactor.new(@io_selector_backend) { |c| reactor_wakeup c } - @reactor.run - end - - @thread_pool.auto_reap! if options[:reaping_time] - @thread_pool.auto_trim! if @min_threads != @max_threads && options[:auto_trim_time] - - @check, @notify = Puma::Util.pipe unless @notify - - @events.fire :state, :running - - if background - @thread = Thread.new do - Puma.set_thread_name thread_name - handle_servers - end - return @thread - else - handle_servers - end - end - - # This method is called from the Reactor thread when a queued Client receives data, - # times out, or when the Reactor is shutting down. - # - # It is responsible for ensuring that a request has been completely received - # before it starts to be processed by the ThreadPool. This may be known as read buffering. - # If read buffering is not done, and no other read buffering is performed (such as by an application server - # such as nginx) then the application would be subject to a slow client attack. - # - # For a graphical representation of how the request buffer works see [architecture.md](https://github.com/puma/puma/blob/master/docs/architecture.md#connection-pipeline). - # - # The method checks to see if it has the full header and body with - # the `Puma::Client#try_to_finish` method. If the full request has been sent, - # then the request is passed to the ThreadPool (`@thread_pool << client`) - # so that a "worker thread" can pick up the request and begin to execute application logic. - # The Client is then removed from the reactor (return `true`). - # - # If a client object times out, a 408 response is written, its connection is closed, - # and the object is removed from the reactor (return `true`). - # - # If the Reactor is shutting down, all Clients are either timed out or passed to the - # ThreadPool, depending on their current state (#can_close?). - # - # Otherwise, if the full request is not ready then the client will remain in the reactor - # (return `false`). When the client sends more data to the socket the `Puma::Client` object - # will wake up and again be checked to see if it's ready to be passed to the thread pool. - def reactor_wakeup(client) - shutdown = !@queue_requests - if client.try_to_finish || (shutdown && !client.can_close?) - @thread_pool << client - elsif shutdown || client.timeout == 0 - client.timeout! - else - client.set_timeout(@first_data_timeout) - false - end - rescue StandardError => e - client_error(e, client) - client.close - true - end - - def handle_servers - begin - check = @check - sockets = [check] + @binder.ios - pool = @thread_pool - queue_requests = @queue_requests - drain = options[:drain_on_shutdown] ? 0 : nil - - addr_send_name, addr_value = case options[:remote_address] - when :value - [:peerip=, options[:remote_address_value]] - when :header - [:remote_addr_header=, options[:remote_address_header]] - when :proxy_protocol - [:expect_proxy_proto=, options[:remote_address_proxy_protocol]] - else - [nil, nil] - end - - while @status == :run || (drain && shutting_down?) - begin - ios = IO.select sockets, nil, nil, (shutting_down? ? 0 : @idle_timeout) - unless ios - unless shutting_down? - @idle_timeout_reached = true - - if @clustered - @worker_write << "#{PipeRequest::PIPE_IDLE}#{Process.pid}\n" rescue nil - next - else - @log_writer.log "- Idle timeout reached" - @status = :stop - end - end - - break - end - - if @idle_timeout_reached && @clustered - @idle_timeout_reached = false - @worker_write << "#{PipeRequest::PIPE_IDLE}#{Process.pid}\n" rescue nil - end - - ios.first.each do |sock| - if sock == check - break if handle_check - else - pool.wait_until_not_full - pool.wait_for_less_busy_worker(options[:wait_for_less_busy_worker]) if @clustered - - io = begin - sock.accept_nonblock - rescue IO::WaitReadable - next - end - drain += 1 if shutting_down? - pool << Client.new(io, @binder.env(sock)).tap { |c| - c.listener = sock - c.http_content_length_limit = @http_content_length_limit - c.send(addr_send_name, addr_value) if addr_value - } - end - end - rescue IOError, Errno::EBADF - # In the case that any of the sockets are unexpectedly close. - raise - rescue StandardError => e - @log_writer.unknown_error e, nil, "Listen loop" - end - end - - @log_writer.debug "Drained #{drain} additional connections." if drain - @events.fire :state, @status - - if queue_requests - @queue_requests = false - @reactor.shutdown - end - - graceful_shutdown if @status == :stop || @status == :restart - rescue Exception => e - @log_writer.unknown_error e, nil, "Exception handling servers" - ensure - # Errno::EBADF is infrequently raised - [@check, @notify].each do |io| - begin - io.close unless io.closed? - rescue Errno::EBADF - end - end - @notify = nil - @check = nil - end - - @events.fire :state, :done - end - - # :nodoc: - def handle_check - cmd = @check.read(1) - - case cmd - when STOP_COMMAND - @status = :stop - return true - when HALT_COMMAND - @status = :halt - return true - when RESTART_COMMAND - @status = :restart - return true - end - - false - end - - # Given a connection on +client+, handle the incoming requests, - # or queue the connection in the Reactor if no request is available. - # - # This method is called from a ThreadPool worker thread. - # - # This method supports HTTP Keep-Alive so it may, depending on if the client - # indicates that it supports keep alive, wait for another request before - # returning. - # - # Return true if one or more requests were processed. - def process_client(client) - # Advertise this server into the thread - Thread.current.puma_server = self - - clean_thread_locals = options[:clean_thread_locals] - close_socket = true - - requests = 0 - - begin - if @queue_requests && - !client.eagerly_finish - - client.set_timeout(@first_data_timeout) - if @reactor.add client - close_socket = false - return false - end - end - - with_force_shutdown(client) do - client.finish(@first_data_timeout) - end - - while true - @requests_count += 1 - case handle_request(client, requests + 1) - when false - break - when :async - close_socket = false - break - when true - ThreadPool.clean_thread_locals if clean_thread_locals - - requests += 1 - - # As an optimization, try to read the next request from the - # socket for a short time before returning to the reactor. - fast_check = @status == :run - - # Always pass the client back to the reactor after a reasonable - # number of inline requests if there are other requests pending. - fast_check = false if requests >= @max_fast_inline && - @thread_pool.backlog > 0 - - next_request_ready = with_force_shutdown(client) do - client.reset(fast_check) - end - - unless next_request_ready - break unless @queue_requests - client.set_timeout @persistent_timeout - if @reactor.add client - close_socket = false - break - end - end - end - end - true - rescue StandardError => e - client_error(e, client, requests) - # The ensure tries to close +client+ down - requests > 0 - ensure - client.io_buffer.reset - - begin - client.close if close_socket - rescue IOError, SystemCallError - Puma::Util.purge_interrupt_queue - # Already closed - rescue StandardError => e - @log_writer.unknown_error e, nil, "Client" - end - end - end - - # Triggers a client timeout if the thread-pool shuts down - # during execution of the provided block. - def with_force_shutdown(client, &block) - @thread_pool.with_force_shutdown(&block) - rescue ThreadPool::ForceShutdown - client.timeout! - end - - # :nocov: - - # Handle various error types thrown by Client I/O operations. - def client_error(e, client, requests = 1) - # Swallow, do not log - return if [ConnectionError, EOFError].include?(e.class) - - case e - when MiniSSL::SSLError - lowlevel_error(e, client.env) - @log_writer.ssl_error e, client.io - when HttpParserError - response_to_error(client, requests, e, 400) - @log_writer.parse_error e, client - when HttpParserError501 - response_to_error(client, requests, e, 501) - @log_writer.parse_error e, client - else - response_to_error(client, requests, e, 500) - @log_writer.unknown_error e, nil, "Read" - end - end - - # A fallback rack response if +@app+ raises as exception. - # - def lowlevel_error(e, env, status=500) - if handler = options[:lowlevel_error_handler] - if handler.arity == 1 - return handler.call(e) - elsif handler.arity == 2 - return handler.call(e, env) - else - return handler.call(e, env, status) - end - end - - if @leak_stack_on_error - backtrace = e.backtrace.nil? ? '' : e.backtrace.join("\n") - [status, {}, ["Puma caught this error: #{e.message} (#{e.class})\n#{backtrace}"]] - else - [status, {}, [""]] - end - end - - def response_to_error(client, requests, err, status_code) - status, headers, res_body = lowlevel_error(err, client.env, status_code) - prepare_response(status, headers, res_body, requests, client) - end - private :response_to_error - - # Wait for all outstanding requests to finish. - # - def graceful_shutdown - if options[:shutdown_debug] - threads = Thread.list - total = threads.size - - pid = Process.pid - - $stdout.syswrite "#{pid}: === Begin thread backtrace dump ===\n" - - threads.each_with_index do |t,i| - $stdout.syswrite "#{pid}: Thread #{i+1}/#{total}: #{t.inspect}\n" - $stdout.syswrite "#{pid}: #{t.backtrace.join("\n#{pid}: ")}\n\n" - end - $stdout.syswrite "#{pid}: === End thread backtrace dump ===\n" - end - - if @status != :restart - @binder.close - end - - if @thread_pool - if timeout = options[:force_shutdown_after] - @thread_pool.shutdown timeout.to_f - else - @thread_pool.shutdown - end - end - end - - def notify_safely(message) - @notify << message - rescue IOError, NoMethodError, Errno::EPIPE, Errno::EBADF - # The server, in another thread, is shutting down - Puma::Util.purge_interrupt_queue - rescue RuntimeError => e - # Temporary workaround for https://bugs.ruby-lang.org/issues/13239 - if e.message.include?('IOError') - Puma::Util.purge_interrupt_queue - else - raise e - end - end - private :notify_safely - - # Stops the acceptor thread and then causes the worker threads to finish - # off the request queue before finally exiting. - - def stop(sync=false) - notify_safely(STOP_COMMAND) - @thread.join if @thread && sync - end - - def halt(sync=false) - notify_safely(HALT_COMMAND) - @thread.join if @thread && sync - end - - def begin_restart(sync=false) - notify_safely(RESTART_COMMAND) - @thread.join if @thread && sync - end - - def shutting_down? - @status == :stop || @status == :restart - end - - # List of methods invoked by #stats. - # @version 5.0.0 - STAT_METHODS = [:backlog, :running, :pool_capacity, :max_threads, :requests_count, :busy_threads].freeze - - # Returns a hash of stats about the running server for reporting purposes. - # @version 5.0.0 - # @!attribute [r] stats - # @return [Hash] hash containing stat info from `Server` and `ThreadPool` - def stats - stats = @thread_pool&.stats || {} - stats[:max_threads] = @max_threads - stats[:requests_count] = @requests_count - stats - end - - # below are 'delegations' to binder - # remove in Puma 7? - - - def add_tcp_listener(host, port, optimize_for_latency = true, backlog = 1024) - @binder.add_tcp_listener host, port, optimize_for_latency, backlog - end - - def add_ssl_listener(host, port, ctx, optimize_for_latency = true, - backlog = 1024) - @binder.add_ssl_listener host, port, ctx, optimize_for_latency, backlog - end - - def add_unix_listener(path, umask = nil, mode = nil, backlog = 1024) - @binder.add_unix_listener path, umask, mode, backlog - end - - # @!attribute [r] connected_ports - def connected_ports - @binder.connected_ports - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/single.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/single.rb deleted file mode 100644 index cafe9fd..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/single.rb +++ /dev/null @@ -1,69 +0,0 @@ -# frozen_string_literal: true - -require_relative 'runner' -require_relative 'detect' -require_relative 'plugin' - -module Puma - # This class is instantiated by the `Puma::Launcher` and used - # to boot and serve a Ruby application when no puma "workers" are needed - # i.e. only using "threaded" mode. For example `$ puma -t 1:5` - # - # At the core of this class is running an instance of `Puma::Server` which - # gets created via the `start_server` method from the `Puma::Runner` class - # that this inherits from. - class Single < Runner - # @!attribute [r] stats - def stats - { - started_at: utc_iso8601(@started_at) - }.merge(@server&.stats || {}).merge(super) - end - - def restart - @server&.begin_restart - end - - def stop - @server&.stop false - end - - def halt - @server&.halt - end - - def stop_blocked - log "- Gracefully stopping, waiting for requests to finish" - @control&.stop true - @server&.stop true - end - - def run - output_header "single" - - load_and_bind - - Plugins.fire_background - - @launcher.write_state - - start_control - - @server = server = start_server - server_thread = server.run - - log "Use Ctrl-C to stop" - redirect_io - - @events.fire_on_booted! - - debug_loaded_extensions("Loaded Extensions:") if @log_writer.debug? - - begin - server_thread.join - rescue Interrupt - # Swallow it - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/state_file.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/state_file.rb deleted file mode 100644 index 7f6ddbc..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/state_file.rb +++ /dev/null @@ -1,68 +0,0 @@ -# frozen_string_literal: true - -module Puma - - # Puma::Launcher uses StateFile to write a yaml file for use with Puma::ControlCLI. - # - # In previous versions of Puma, YAML was used to read/write the state file. - # Since Puma is similar to Bundler/RubyGems in that it may load before one's app - # does, minimizing the dependencies that may be shared with the app is desired. - # - # At present, it only works with numeric and string values. It is still a valid - # yaml file, and the CI tests parse it with Psych. - # - class StateFile - - ALLOWED_FIELDS = %w!control_url control_auth_token pid running_from! - - def initialize - @options = {} - end - - def save(path, permission = nil) - contents = +"---\n" - @options.each do |k,v| - next unless ALLOWED_FIELDS.include? k - case v - when Numeric - contents << "#{k}: #{v}\n" - when String - next if v.strip.empty? - contents << (k == 'running_from' || v.to_s.include?(' ') ? - "#{k}: \"#{v}\"\n" : "#{k}: #{v}\n") - end - end - if permission - File.write path, contents, mode: 'wb:UTF-8' - else - File.write path, contents, mode: 'wb:UTF-8', perm: permission - end - end - - def load(path) - File.read(path).lines.each do |line| - next if line.start_with? '#' - k,v = line.split ':', 2 - next unless v && ALLOWED_FIELDS.include?(k) - v = v.strip - @options[k] = - case v - when '' then nil - when /\A\d+\z/ then v.to_i - when /\A\d+\.\d+\z/ then v.to_f - else v.gsub(/\A"|"\z/, '') - end - end - end - - ALLOWED_FIELDS.each do |f| - define_method f.to_sym do - @options[f] - end - - define_method :"#{f}=" do |v| - @options[f] = v - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/thread_pool.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/thread_pool.rb deleted file mode 100644 index f919bf7..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/thread_pool.rb +++ /dev/null @@ -1,446 +0,0 @@ -# frozen_string_literal: true - -require 'thread' - -require_relative 'io_buffer' - -module Puma - # Internal Docs for A simple thread pool management object. - # - # Each Puma "worker" has a thread pool to process requests. - # - # First a connection to a client is made in `Puma::Server`. It is wrapped in a - # `Puma::Client` instance and then passed to the `Puma::Reactor` to ensure - # the whole request is buffered into memory. Once the request is ready, it is passed into - # a thread pool via the `Puma::ThreadPool#<<` operator where it is stored in a `@todo` array. - # - # Each thread in the pool has an internal loop where it pulls a request from the `@todo` array - # and processes it. - class ThreadPool - class ForceShutdown < RuntimeError - end - - # How long, after raising the ForceShutdown of a thread during - # forced shutdown mode, to wait for the thread to try and finish - # up its work before leaving the thread to die on the vine. - SHUTDOWN_GRACE_TIME = 5 # seconds - - # Maintain a minimum of +min+ and maximum of +max+ threads - # in the pool. - # - # The block passed is the work that will be performed in each - # thread. - # - def initialize(name, options = {}, &block) - @not_empty = ConditionVariable.new - @not_full = ConditionVariable.new - @mutex = Mutex.new - - @todo = [] - - @spawned = 0 - @waiting = 0 - - @name = name - @min = Integer(options[:min_threads]) - @max = Integer(options[:max_threads]) - # Not an 'exposed' option, options[:pool_shutdown_grace_time] is used in CI - # to shorten @shutdown_grace_time from SHUTDOWN_GRACE_TIME. Parallel CI - # makes stubbing constants difficult. - @shutdown_grace_time = Float(options[:pool_shutdown_grace_time] || SHUTDOWN_GRACE_TIME) - @block = block - @out_of_band = options[:out_of_band] - @clean_thread_locals = options[:clean_thread_locals] - @before_thread_start = options[:before_thread_start] - @before_thread_exit = options[:before_thread_exit] - @reaping_time = options[:reaping_time] - @auto_trim_time = options[:auto_trim_time] - - @shutdown = false - - @trim_requested = 0 - @out_of_band_pending = false - - @workers = [] - - @auto_trim = nil - @reaper = nil - - @mutex.synchronize do - @min.times do - spawn_thread - @not_full.wait(@mutex) - end - end - - @force_shutdown = false - @shutdown_mutex = Mutex.new - end - - attr_reader :spawned, :trim_requested, :waiting - - def self.clean_thread_locals - Thread.current.keys.each do |key| # rubocop: disable Style/HashEachMethods - Thread.current[key] = nil unless key == :__recursive_key__ - end - end - - # generate stats hash so as not to perform multiple locks - # @return [Hash] hash containing stat info from ThreadPool - def stats - with_mutex do - { backlog: @todo.size, - running: @spawned, - pool_capacity: @waiting + (@max - @spawned), - busy_threads: @spawned - @waiting + @todo.size - } - end - end - - # How many objects have yet to be processed by the pool? - # - def backlog - with_mutex { @todo.size } - end - - # @!attribute [r] pool_capacity - def pool_capacity - waiting + (@max - spawned) - end - - # @!attribute [r] busy_threads - # @version 5.0.0 - def busy_threads - with_mutex { @spawned - @waiting + @todo.size } - end - - # :nodoc: - # - # Must be called with @mutex held! - # - def spawn_thread - @spawned += 1 - - trigger_before_thread_start_hooks - th = Thread.new(@spawned) do |spawned| - Puma.set_thread_name '%s tp %03i' % [@name, spawned] - todo = @todo - block = @block - mutex = @mutex - not_empty = @not_empty - not_full = @not_full - - while true - work = nil - - mutex.synchronize do - while todo.empty? - if @trim_requested > 0 - @trim_requested -= 1 - @spawned -= 1 - @workers.delete th - not_full.signal - trigger_before_thread_exit_hooks - Thread.exit - end - - @waiting += 1 - if @out_of_band_pending && trigger_out_of_band_hook - @out_of_band_pending = false - end - not_full.signal - begin - not_empty.wait mutex - ensure - @waiting -= 1 - end - end - - work = todo.shift - end - - if @clean_thread_locals - ThreadPool.clean_thread_locals - end - - begin - @out_of_band_pending = true if block.call(work) - rescue Exception => e - STDERR.puts "Error reached top of thread-pool: #{e.message} (#{e.class})" - end - end - end - - @workers << th - - th - end - - private :spawn_thread - - def trigger_before_thread_start_hooks - return unless @before_thread_start&.any? - - @before_thread_start.each do |b| - begin - b.call - rescue Exception => e - STDERR.puts "WARNING before_thread_start hook failed with exception (#{e.class}) #{e.message}" - end - end - nil - end - - private :trigger_before_thread_start_hooks - - def trigger_before_thread_exit_hooks - return unless @before_thread_exit&.any? - - @before_thread_exit.each do |b| - begin - b.call - rescue Exception => e - STDERR.puts "WARNING before_thread_exit hook failed with exception (#{e.class}) #{e.message}" - end - end - nil - end - - private :trigger_before_thread_exit_hooks - - # @version 5.0.0 - def trigger_out_of_band_hook - return false unless @out_of_band&.any? - - # we execute on idle hook when all threads are free - return false unless @spawned == @waiting - - @out_of_band.each(&:call) - true - rescue Exception => e - STDERR.puts "Exception calling out_of_band_hook: #{e.message} (#{e.class})" - true - end - - private :trigger_out_of_band_hook - - # @version 5.0.0 - def with_mutex(&block) - @mutex.owned? ? - yield : - @mutex.synchronize(&block) - end - - # Add +work+ to the todo list for a Thread to pickup and process. - def <<(work) - with_mutex do - if @shutdown - raise "Unable to add work while shutting down" - end - - @todo << work - - if @waiting < @todo.size and @spawned < @max - spawn_thread - end - - @not_empty.signal - end - end - - # This method is used by `Puma::Server` to let the server know when - # the thread pool can pull more requests from the socket and - # pass to the reactor. - # - # The general idea is that the thread pool can only work on a fixed - # number of requests at the same time. If it is already processing that - # number of requests then it is at capacity. If another Puma process has - # spare capacity, then the request can be left on the socket so the other - # worker can pick it up and process it. - # - # For example: if there are 5 threads, but only 4 working on - # requests, this method will not wait and the `Puma::Server` - # can pull a request right away. - # - # If there are 5 threads and all 5 of them are busy, then it will - # pause here, and wait until the `not_full` condition variable is - # signaled, usually this indicates that a request has been processed. - # - # It's important to note that even though the server might accept another - # request, it might not be added to the `@todo` array right away. - # For example if a slow client has only sent a header, but not a body - # then the `@todo` array would stay the same size as the reactor works - # to try to buffer the request. In that scenario the next call to this - # method would not block and another request would be added into the reactor - # by the server. This would continue until a fully buffered request - # makes it through the reactor and can then be processed by the thread pool. - def wait_until_not_full - with_mutex do - while true - return if @shutdown - - # If we can still spin up new threads and there - # is work queued that cannot be handled by waiting - # threads, then accept more work until we would - # spin up the max number of threads. - return if busy_threads < @max - - @not_full.wait @mutex - end - end - end - - # @version 5.0.0 - def wait_for_less_busy_worker(delay_s) - return unless delay_s && delay_s > 0 - - # Ruby MRI does GVL, this can result - # in processing contention when multiple threads - # (requests) are running concurrently - return unless Puma.mri? - - with_mutex do - return if @shutdown - - # do not delay, if we are not busy - return unless busy_threads > 0 - - # this will be signaled once a request finishes, - # which can happen earlier than delay - @not_full.wait @mutex, delay_s - end - end - - # If there are any free threads in the pool, tell one to go ahead - # and exit. If +force+ is true, then a trim request is requested - # even if all threads are being utilized. - # - def trim(force=false) - with_mutex do - free = @waiting - @todo.size - if (force or free > 0) and @spawned - @trim_requested > @min - @trim_requested += 1 - @not_empty.signal - end - end - end - - # If there are dead threads in the pool make them go away while decreasing - # spawned counter so that new healthy threads could be created again. - def reap - with_mutex do - dead_workers = @workers.reject(&:alive?) - - dead_workers.each do |worker| - worker.kill - @spawned -= 1 - end - - @workers.delete_if do |w| - dead_workers.include?(w) - end - end - end - - class Automaton - def initialize(pool, timeout, thread_name, message) - @pool = pool - @timeout = timeout - @thread_name = thread_name - @message = message - @running = false - end - - def start! - @running = true - - @thread = Thread.new do - Puma.set_thread_name @thread_name - while @running - @pool.public_send(@message) - sleep @timeout - end - end - end - - def stop - @running = false - @thread.wakeup - end - end - - def auto_trim!(timeout=@auto_trim_time) - @auto_trim = Automaton.new(self, timeout, "#{@name} tp trim", :trim) - @auto_trim.start! - end - - def auto_reap!(timeout=@reaping_time) - @reaper = Automaton.new(self, timeout, "#{@name} tp reap", :reap) - @reaper.start! - end - - # Allows ThreadPool::ForceShutdown to be raised within the - # provided block if the thread is forced to shutdown during execution. - def with_force_shutdown - t = Thread.current - @shutdown_mutex.synchronize do - raise ForceShutdown if @force_shutdown - t[:with_force_shutdown] = true - end - yield - ensure - t[:with_force_shutdown] = false - end - - # Tell all threads in the pool to exit and wait for them to finish. - # Wait +timeout+ seconds then raise +ForceShutdown+ in remaining threads. - # Next, wait an extra +@shutdown_grace_time+ seconds then force-kill remaining - # threads. Finally, wait 1 second for remaining threads to exit. - # - def shutdown(timeout=-1) - threads = with_mutex do - @shutdown = true - @trim_requested = @spawned - @not_empty.broadcast - @not_full.broadcast - - @auto_trim&.stop - @reaper&.stop - # dup workers so that we join them all safely - @workers.dup - end - - if timeout == -1 - # Wait for threads to finish without force shutdown. - threads.each(&:join) - else - join = ->(inner_timeout) do - start = Process.clock_gettime(Process::CLOCK_MONOTONIC) - threads.reject! do |t| - elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start - t.join inner_timeout - elapsed - end - end - - # Wait +timeout+ seconds for threads to finish. - join.call(timeout) - - # If threads are still running, raise ForceShutdown and wait to finish. - @shutdown_mutex.synchronize do - @force_shutdown = true - threads.each do |t| - t.raise ForceShutdown if t[:with_force_shutdown] - end - end - join.call(@shutdown_grace_time) - - # If threads are _still_ running, forcefully kill them and wait to finish. - threads.each(&:kill) - join.call(1) - end - - @spawned = 0 - @workers = [] - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/util.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/util.rb deleted file mode 100644 index a87dc73..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/puma/util.rb +++ /dev/null @@ -1,141 +0,0 @@ -# frozen_string_literal: true - -require 'uri/common' - -module Puma - module Util - module_function - - def pipe - IO.pipe - end - - # An instance method on Thread has been provided to address https://bugs.ruby-lang.org/issues/13632, - # which currently affects some older versions of Ruby: 2.2.7 2.2.8 2.2.9 2.2.10 2.3.4 2.4.1 - # Additional context: https://github.com/puma/puma/pull/1345 - def purge_interrupt_queue - Thread.current.purge_interrupt_queue if Thread.current.respond_to? :purge_interrupt_queue - end - - # Escapes and unescapes a URI escaped string with - # +encoding+. +encoding+ will be the target encoding of the string - # returned, and it defaults to UTF-8 - if defined?(::Encoding) - def escape(s, encoding = Encoding::UTF_8) - URI.encode_www_form_component(s, encoding) - end - - def unescape(s, encoding = Encoding::UTF_8) - URI.decode_www_form_component(s, encoding) - end - else - def escape(s, encoding = nil) - URI.encode_www_form_component(s, encoding) - end - - def unescape(s, encoding = nil) - URI.decode_www_form_component(s, encoding) - end - end - module_function :unescape, :escape - - DEFAULT_SEP = /[&;] */n - - # Stolen from Mongrel, with some small modifications: - # Parses a query string by breaking it up at the '&' - # and ';' characters. You can also use this to parse - # cookies by changing the characters used in the second - # parameter (which defaults to '&;'). - def parse_query(qs, d = nil, &unescaper) - unescaper ||= method(:unescape) - - params = {} - - (qs || '').split(d ? /[#{d}] */n : DEFAULT_SEP).each do |p| - next if p.empty? - k, v = p.split('=', 2).map(&unescaper) - - if cur = params[k] - if cur.class == Array - params[k] << v - else - params[k] = [cur, v] - end - else - params[k] = v - end - end - - params - end - - # A case-insensitive Hash that preserves the original case of a - # header when set. - class HeaderHash < Hash - def self.new(hash={}) - HeaderHash === hash ? hash : super(hash) - end - - def initialize(hash={}) - super() - @names = {} - hash.each { |k, v| self[k] = v } - end - - def each - super do |k, v| - yield(k, v.respond_to?(:to_ary) ? v.to_ary.join("\n") : v) - end - end - - # @!attribute [r] to_hash - def to_hash - hash = {} - each { |k,v| hash[k] = v } - hash - end - - def [](k) - super(k) || super(@names[k.downcase]) - end - - def []=(k, v) - canonical = k.downcase - delete k if @names[canonical] && @names[canonical] != k # .delete is expensive, don't invoke it unless necessary - @names[k] = @names[canonical] = k - super k, v - end - - def delete(k) - canonical = k.downcase - result = super @names.delete(canonical) - @names.delete_if { |name,| name.downcase == canonical } - result - end - - def include?(k) - @names.include?(k) || @names.include?(k.downcase) - end - - alias_method :has_key?, :include? - alias_method :member?, :include? - alias_method :key?, :include? - - def merge!(other) - other.each { |k, v| self[k] = v } - self - end - - def merge(other) - hash = dup - hash.merge! other - end - - def replace(other) - clear - other.each { |k, v| self[k] = v } - self - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/rack/handler/puma.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/rack/handler/puma.rb deleted file mode 100644 index 7b3ce3d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/lib/rack/handler/puma.rb +++ /dev/null @@ -1,144 +0,0 @@ -# frozen_string_literal: true - -module Puma - - # This module is used as an 'include' file in code at bottom of file. It loads - # into either `Rackup::Handler::Puma` or `Rack::Handler::Puma`. - - module RackHandler - DEFAULT_OPTIONS = { - :Verbose => false, - :Silent => false - } - - def config(app, options = {}) - require_relative '../../puma' - require_relative '../../puma/configuration' - require_relative '../../puma/log_writer' - require_relative '../../puma/launcher' - - default_options = DEFAULT_OPTIONS.dup - - # Libraries pass in values such as :Port and there is no way to determine - # if it is a default provided by the library or a special value provided - # by the user. A special key `user_supplied_options` can be passed. This - # contains an array of all explicitly defined user options. We then - # know that all other values are defaults - if user_supplied_options = options.delete(:user_supplied_options) - (options.keys - user_supplied_options).each do |k| - default_options[k] = options.delete(k) - end - end - - @events = options[:events] || ::Puma::Events.new - - conf = ::Puma::Configuration.new(options, default_options.merge({events: @events})) do |user_config, file_config, default_config| - if options.delete(:Verbose) - begin - require 'rack/commonlogger' # Rack 1.x - rescue LoadError - require 'rack/common_logger' # Rack 2 and later - end - app = ::Rack::CommonLogger.new(app, STDOUT) - end - - if options[:environment] - user_config.environment options[:environment] - end - - if options[:Threads] - min, max = options.delete(:Threads).split(':', 2) - user_config.threads min, max - end - - if options[:Host] || options[:Port] - host = options[:Host] || default_options[:Host] - port = options[:Port] || default_options[:Port] - self.set_host_port_to_config(host, port, user_config) - end - - if default_options[:Host] - file_config.set_default_host(default_options[:Host]) - end - self.set_host_port_to_config(default_options[:Host], default_options[:Port], default_config) - - user_config.app app - end - conf - end - - def run(app, **options) - conf = self.config(app, options) - - log_writer = options.delete(:Silent) ? ::Puma::LogWriter.strings : ::Puma::LogWriter.stdio - - launcher = ::Puma::Launcher.new(conf, :log_writer => log_writer, events: @events) - - yield launcher if block_given? - begin - launcher.run - rescue Interrupt - puts "* Gracefully stopping, waiting for requests to finish" - launcher.stop - puts "* Goodbye!" - end - end - - def valid_options - { - "Host=HOST" => "Hostname to listen on (default: localhost)", - "Port=PORT" => "Port to listen on (default: 8080)", - "Threads=MIN:MAX" => "min:max threads to use (default 0:16)", - "Verbose" => "Don't report each request (default: false)" - } - end - - def set_host_port_to_config(host, port, config) - config.clear_binds! if host || port - - if host&.start_with? '.', '/', '@' - config.bind "unix://#{host}" - elsif host&.start_with? 'ssl://' - uri = URI.parse(host) - uri.port ||= port || ::Puma::Configuration::DEFAULTS[:tcp_port] - config.bind uri.to_s - else - - if host - port ||= ::Puma::Configuration::DEFAULTS[:tcp_port] - end - - if port - host ||= ::Puma::Configuration::DEFAULTS[:tcp_host] - config.port port, host - end - end - end - end -end - -# rackup was removed in Rack 3, it is now a separate gem -if Object.const_defined?(:Rackup) && ::Rackup.const_defined?(:Handler) - module Rackup - module Handler - module Puma - class << self - include ::Puma::RackHandler - end - end - register :puma, Puma - end - end -else - do_register = Object.const_defined?(:Rack) && ::Rack.release < '3' - module Rack - module Handler - module Puma - class << self - include ::Puma::RackHandler - end - end - end - end - ::Rack::Handler.register(:puma, ::Rack::Handler::Puma) if do_register -end diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/tools/Dockerfile b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/tools/Dockerfile deleted file mode 100644 index 435081c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/tools/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -# Use this Dockerfile to create minimal reproductions of issues - -FROM ruby:3.2 - -RUN apt-get update && apt-get install -y ragel - -# throw errors if Gemfile has been modified since Gemfile.lock -RUN bundle config --global frozen 1 - -WORKDIR /usr/src/app - -COPY . . - -RUN bundle install -RUN bundle exec rake compile - -EXPOSE 9292 -CMD ["bundle", "exec", "bin/puma", "test/rackup/hello.ru"] diff --git a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/tools/trickletest.rb b/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/tools/trickletest.rb deleted file mode 100644 index fa54380..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/puma-6.6.1/tools/trickletest.rb +++ /dev/null @@ -1,44 +0,0 @@ -require 'socket' -require 'stringio' - -def do_test(st, chunk) - s = TCPSocket.new('127.0.0.1',ARGV[0].to_i); - req = StringIO.new(st) - nout = 0 - randstop = rand(st.length / 10) - STDERR.puts "stopping after: #{randstop}" - - begin - while data = req.read(chunk) - nout += s.write(data) - s.flush - sleep 0.1 - if nout > randstop - STDERR.puts "BANG! after #{nout} bytes." - break - end - end - rescue Object => e - STDERR.puts "ERROR: #{e}" - ensure - s.close - end -end - -content = "-" * (1024 * 240) -st = "GET / HTTP/1.1\r\nHost: www.zedshaw.com\r\nContent-Type: text/plain\r\nContent-Length: #{content.length}\r\n\r\n#{content}" - -puts "length: #{content.length}" - -threads = [] -ARGV[1].to_i.times do - t = Thread.new do - size = 100 - puts ">>>> #{size} sized chunks" - do_test(st, size) - end - - threads << t -end - -threads.each {|t| t.join} diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/CHANGELOG.md b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/CHANGELOG.md deleted file mode 100644 index bf9c593..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/CHANGELOG.md +++ /dev/null @@ -1,1226 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. For info on how to format all future additions to this file please reference [Keep A Changelog](https://keepachangelog.com/en/1.0.0/). - -## Unreleased - -## [3.2.0] - 2025-07-31 - -This release continues Rack's evolution toward a cleaner, more efficient foundation while maintaining backward compatibility for most applications. The breaking changes primarily affect deprecated functionality, so most users should experience a smooth upgrade with improved performance and standards compliance. - -### SPEC Changes - -- Request environment keys must now be strings. ([#2310](https://github.com/rack/rack/issues/2310), [@jeremyevans]) -- Add `nil` as a valid return from a Response `body.to_path` ([#2318](https://github.com/rack/rack/pull/2318), [@MSP-Greg]) -- `Rack::Lint#check_header_value` is relaxed, only disallowing CR/LF/NUL characters. ([#2354](https://github.com/rack/rack/pull/2354), [@ioquatix]) - -### Added - -- Introduce `Rack::VERSION` constant. ([#2199](https://github.com/rack/rack/pull/2199), [@ioquatix]) -- `ISO-2022-JP` encoded parts within MIME Multipart sections of an HTTP request body will now be converted to `UTF-8`. ([#2245](https://github.com/rack/rack/pull/2245), [@nappa](https://github.com/nappa)) -- Add `Rack::Request#query_parser=` to allow setting the query parser to use. ([#2349](https://github.com/rack/rack/pull/2349), [@jeremyevans]) -- Add `Rack::Request#form_pairs` to access form data as raw key-value pairs, preserving duplicate keys. ([#2351](https://github.com/rack/rack/pull/2351), [@matthewd]) - -### Changed - -- Invalid cookie keys will now raise an error. ([#2193](https://github.com/rack/rack/pull/2193), [@ioquatix]) -- `Rack::MediaType#params` now handles empty strings. ([#2229](https://github.com/rack/rack/pull/2229), [@jeremyevans]) -- Avoid unnecessary calls to the `ip_filter` lambda to evaluate `Request#ip` ([#2287](https://github.com/rack/rack/pull/2287), [@willbryant]) -- Only calculate `Request#ip` once per request ([#2292](https://github.com/rack/rack/pull/2292), [@willbryant]) -- `Rack::Builder` `#use`, `#map`, and `#run` methods now return `nil`. ([#2355](https://github.com/rack/rack/pull/2355), [@ioquatix]) -- Directly close the body in `Rack::ConditionalGet` when the response is `304 Not Modified`. ([#2353](https://github.com/rack/rack/pull/2353), [@ioquatix]) -- Directly close the body in `Rack::Head` when the request method is `HEAD`([#2360](https://github.com/rack/rack/pull/2360), [@skipkayhil](https://github.com/skipkayhil)) - -### Deprecated - -- `Rack::Auth::AbstractRequest#request` is deprecated without replacement. ([#2229](https://github.com/rack/rack/pull/2229), [@jeremyevans]) -- `Rack::Request#parse_multipart` (private method designed to be overridden in subclasses) is deprecated without replacement. ([#2229](https://github.com/rack/rack/pull/2229), [@jeremyevans]) - -### Removed - -- `Rack::Request#values_at` is removed. ([#2200](https://github.com/rack/rack/pull/2200), [@ioquatix]) -- `Rack::Logger` is removed with no replacement. ([#2196](https://github.com/rack/rack/pull/2196), [@ioquatix]) -- Automatic cache invalidation in `Rack::Request#{GET,POST}` has been removed. ([#2230](https://github.com/rack/rack/pull/2230), [@jeremyevans]) -- Support for `CGI::Cookie` has been removed. ([#2332](https://github.com/rack/rack/pull/2332), [@ioquatix]) - -### Fixed - -- `Rack::RewindableInput::Middleware` no longer wraps a nil input. ([#2259](https://github.com/rack/rack/pull/2259), [@tt](https://github.com/tt)) -- Fix `NoMethodError` in `Rack::Request#wrap_ipv6` when `x-forwarded-host` is empty. ([#2270](https://github.com/rack/rack/pull/2270), [@oieioi](https://github.com/oieioi)) -- Fix the specification for `SERVER_PORT` which was incorrectly documented as required to be an `Integer` if present - it must be a `String` containing digits only. ([#2296](https://github.com/rack/rack/pull/2296), [@ioquatix]) -- `SERVER_NAME` and `HTTP_HOST` are now more strictly validated according to the relevant specifications. ([#2298](https://github.com/rack/rack/pull/2298), [@ioquatix]) -- `Rack::Lint` now disallows `PATH_INFO="" SCRIPT_NAME=""`. ([#2298](https://github.com/rack/rack/issues/2307), [@jeremyevans]) - -## [3.1.16] - 2025-06-04 - -### Security - -- [CVE-2025-49007](https://github.com/advisories/GHSA-47m2-26rw-j2jw) Fix ReDoS in multipart request. - -## [3.1.15] - 2025-05-18 - -- Optional support for `CGI::Cookie` if not available. ([#2327](https://github.com/rack/rack/pull/2327), [#2333](https://github.com/rack/rack/pull/2333), [@earlopain]) - -## [3.1.14] - 2025-05-06 - -:warning: **This release includes a security fix that may cause certain routes in previously working applications to fail if query parameters exceed 4,096 in count or 4 MB in total size. See for more details.** - -### Security - -- [CVE-2025-46727](https://github.com/rack/rack/security/advisories/GHSA-gjh7-p2fx-99vx) Unbounded parameter parsing in `Rack::QueryParser` can lead to memory exhaustion. - -## [3.1.13] - 2025-04-13 - -- Ensure `Rack::ETag` correctly updates response body. ([#2324](https://github.com/rack/rack/pull/2324), [@ioquatix]) - -## [3.1.12] - 2025-03-11 - -### Security - -- [CVE-2025-27610](https://github.com/rack/rack/security/advisories/GHSA-7wqh-767x-r66v) Local file inclusion in `Rack::Static`. - -## [3.1.11] - 2025-03-04 - -### Security - -- [CVE-2025-27111](https://github.com/rack/rack/security/advisories/GHSA-8cgq-6mh2-7j6v) Possible Log Injection in `Rack::Sendfile`. - -## [3.1.10] - 2025-02-12 - -### Security - -- [CVE-2025-25184](https://github.com/rack/rack/security/advisories/GHSA-7g2v-jj9q-g3rg) Possible Log Injection in `Rack::CommonLogger`. - -## [3.1.9] - 2025-01-31 - -### Fixed - -- `Rack::MediaType#params` now handles parameters without values. ([#2263](https://github.com/rack/rack/pull/2263), [@AllyMarthaJ](https://github.com/AllyMarthaJ)) - -## [3.1.8] - 2024-10-14 - -### Fixed - -- Resolve deprecation warnings about uri `DEFAULT_PARSER`. ([#2249](https://github.com/rack/rack/pull/2249), [@earlopain]) - -## [3.1.7] - 2024-07-11 - -### Fixed - -- Do not remove escaped opening/closing quotes for content-disposition filenames. ([#2229](https://github.com/rack/rack/pull/2229), [@jeremyevans]) -- Fix encoding setting for non-binary IO-like objects in MockRequest#env_for. ([#2227](https://github.com/rack/rack/pull/2227), [@jeremyevans]) -- `Rack::Response` should not generate invalid `content-length` header. ([#2219](https://github.com/rack/rack/pull/2219), [@ioquatix]) -- Allow empty PATH_INFO. ([#2214](https://github.com/rack/rack/pull/2214), [@ioquatix]) - -## [3.1.6] - 2024-07-03 - -### Fixed - -- Fix several edge cases in `Rack::Request#parse_http_accept_header`'s implementation. ([#2226](https://github.com/rack/rack/pull/2226), [@ioquatix]) - -## [3.1.5] - 2024-07-02 - -### Security - -- Fix potential ReDoS attack in `Rack::Request#parse_http_accept_header`. ([GHSA-cj83-2ww7-mvq7](https://github.com/rack/rack/security/advisories/GHSA-cj83-2ww7-mvq7), [@dwisiswant0](https://github.com/dwisiswant0)) - -## [3.1.4] - 2024-06-22 - -### Fixed - -- Fix `Rack::Lint` matching some paths incorrectly as authority form. ([#2220](https://github.com/rack/rack/pull/2220), [@ioquatix]) - -## [3.1.3] - 2024-06-12 - -### Fixed - -- Fix passing non-strings to `Rack::Utils.escape_html`. ([#2202](https://github.com/rack/rack/pull/2202), [@earlopain]) -- `Rack::MockResponse` gracefully handles empty cookies ([#2203](https://github.com/rack/rack/pull/2203) [@wynksaiddestroy]) - -## [3.1.2] - 2024-06-11 - -- `Rack::Response` will take in to consideration chunked encoding responses ([#2204](https://github.com/rack/rack/pull/2204), [@tenderlove]) - -## [3.1.1] - 2024-06-11 - -- Oops! I shouldn't have shipped that - -## [3.1.0] - 2024-06-11 - -:warning: **This release includes several breaking changes.** Refer to the **Removed** section below for the list of deprecated methods that have been removed in this release. - -This release is primarily a maintenance release that removes features deprecated in Rack v3.0. Alongside these removals, there are several improvements to the Rack SPEC, mainly focused on enhancing input and output handling. These changes aim to make Rack more efficient and align better with the requirements of server implementations and relevant HTTP specifications. - -### SPEC Changes - -- `rack.input` is now optional. ([#1997](https://github.com/rack/rack/pull/1997), [#2018](https://github.com/rack/rack/pull/2018), [@ioquatix]) -- `PATH_INFO` is now validated according to the HTTP/1.1 specification. ([#2117](https://github.com/rack/rack/pull/2117), [#2181](https://github.com/rack/rack/pull/2181), [@ioquatix]) - - `OPTIONS *` is now accepted. ([#2114](https://github.com/rack/rack/pull/2114), [@doriantaylor](https://github.com/doriantaylor)) -- Introduce optional `rack.protocol` request and response header for handling connection upgrades. ([#1954](https://github.com/rack/rack/pull/1954), [@ioquatix]) - -### Added - -- Introduce `Rack::Multipart::MissingInputError` for improved handling of missing input in `#parse_multipart`. ([#2018](https://github.com/rack/rack/pull/2018), [@ioquatix]) -- Introduce `module Rack::BadRequest` which is included in multipart and query parser errors. ([#2019](https://github.com/rack/rack/pull/2019), [@ioquatix]) -- Add `.mjs` MIME type ([#2057](https://github.com/rack/rack/pull/2057), [@axilleas](https://github.com/axilleas)) -- `set_cookie_header` utility now supports the `partitioned` cookie attribute. This is required by Chrome in some embedded contexts. ([#2131](https://github.com/rack/rack/pull/2131), [@flavio-b](https://github.com/flavio-b)) -- Introduce `rack.early_hints` for sending `103 Early Hints` informational responses. ([#1831](https://github.com/rack/rack/pull/1831), [@casperisfine](https://github.com/casperisfine), [@jeremyevans]) - -### Changed - -- MIME type for JavaScript files (`.js`) changed from `application/javascript` to `text/javascript` ([`1bd0f15`](https://github.com/rack/rack/commit/1bd0f1597d8f4a90d47115f3e156a8ce7870c9c8), [@ioquatix]) -- Update MIME types associated to `.ttf`, `.woff`, `.woff2` and `.otf` extensions to use mondern `font/*` types. ([#2065](https://github.com/rack/rack/pull/2065), [@davidstosik]) -- `Rack::Utils.escape_html` is now delegated to `CGI.escapeHTML`. `'` is escaped to `#39;` instead of `#x27;`. (decimal vs hexadecimal) ([#2099](https://github.com/rack/rack/pull/2099), [@JunichiIto](https://github.com/JunichiIto)) -- Clarify use of `@buffered` and only update `content-length` when `Rack::Response#finish` is invoked. ([#2149](https://github.com/rack/rack/pull/2149), [@ioquatix]) - -### Deprecated - -- Deprecate automatic cache invalidation in `Request#{GET,POST}` ([#2073](https://github.com/rack/rack/pull/2073), [@jeremyevans]) -- Only cookie keys that are not valid according to the HTTP specifications are escaped. We are planning to deprecate this behaviour, so now a deprecation message will be emitted in this case. In the future, invalid cookie keys may not be accepted. ([#2191](https://github.com/rack/rack/pull/2191), [@ioquatix]) -- `Rack::Logger` is deprecated. ([#2197](https://github.com/rack/rack/pull/2197), [@ioquatix]) -- Add fallback lookup and deprecation warning for obsolete status symbols. ([#2137](https://github.com/rack/rack/pull/2137), [@wtn](https://github.com/wtn)) -- Deprecate `Rack::Request#values_at`, use `request.params.values_at` instead ([#2183](https://github.com/rack/rack/pull/2183), [@ioquatix]) - -### Removed - -- Remove deprecated `Rack::Auth::Digest` with no replacement. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) -- Remove deprecated `Rack::Cascade::NotFound` with no replacement. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) -- Remove deprecated `Rack::Chunked` with no replacement. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) -- Remove deprecated `Rack::File`, use `Rack::Files` instead. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) -- Remove deprecated `Rack::QueryParser` `key_space_limit` parameter with no replacement. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) -- Remove deprecated `Rack::Response#header`, use `Rack::Response#headers` instead. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) -- Remove deprecated cookie methods from `Rack::Utils`: `add_cookie_to_header`, `make_delete_cookie_header`, `add_remove_cookie_to_header`. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) -- Remove deprecated `Rack::Utils::HeaderHash`. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) -- Remove deprecated `Rack::VERSION`, `Rack::VERSION_STRING`, `Rack.version`, use `Rack.release` instead. ([#1966](https://github.com/rack/rack/pull/1966), [@ioquatix]) -- Remove non-standard status codes 306, 509, & 510 and update descriptions for 413, 422, & 451. ([#2137](https://github.com/rack/rack/pull/2137), [@wtn](https://github.com/wtn)) -- Remove any dependency on `transfer-encoding: chunked`. ([#2195](https://github.com/rack/rack/pull/2195), [@ioquatix]) -- Remove deprecated `Rack::Request#[]`, use `request.params[key]` instead ([#2183](https://github.com/rack/rack/pull/2183), [@ioquatix]) - -### Fixed - -- In `Rack::Files`, ignore the `Range` header if served file is 0 bytes. ([#2159](https://github.com/rack/rack/pull/2159), [@zarqman]) - -## [3.0.18] - 2025-05-22 - -- Fix incorrect backport of optional `CGI::Cookie` support. ([#2335](https://github.com/rack/rack/pull/2335), [@jeremyevans]) - -## [3.0.17] - 2025-05-18 - -- Optional support for `CGI::Cookie` if not available. ([#2327](https://github.com/rack/rack/pull/2327), [#2333](https://github.com/rack/rack/pull/2333), [@earlopain]) - -## [3.0.16] - 2025-05-06 - -:warning: **This release includes a security fix that may cause certain routes in previously working applications to fail if query parameters exceed 4,096 in count or 4 MB in total size. See for more details.** - -### Security - -- [CVE-2025-46727](https://github.com/rack/rack/security/advisories/GHSA-gjh7-p2fx-99vx) Unbounded parameter parsing in `Rack::QueryParser` can lead to memory exhaustion. - -## [3.0.15] - 2025-04-13 - -- Ensure `Rack::ETag` correctly updates response body. ([#2324](https://github.com/rack/rack/pull/2324), [@ioquatix]) - -## [3.0.14] - 2025-03-11 - -### Security - -- [CVE-2025-27610](https://github.com/rack/rack/security/advisories/GHSA-7wqh-767x-r66v) Local file inclusion in `Rack::Static`. - -## [3.0.13] - 2025-03-04 - -### Security - -- [CVE-2025-27111](https://github.com/rack/rack/security/advisories/GHSA-8cgq-6mh2-7j6v) Possible Log Injection in `Rack::Sendfile`. - -### Fixed - -- Remove autoloads for constants no longer shipped with Rack. ([#2269](https://github.com/rack/rack/pull/2269), [@ccutrer](https://github.com/ccutrer)) - -## [3.0.12] - 2025-02-12 - -### Security - -- [CVE-2025-25184](https://github.com/rack/rack/security/advisories/GHSA-7g2v-jj9q-g3rg) Possible Log Injection in `Rack::CommonLogger`. - -## [3.0.11] - 2024-05-10 - -- Backport #2062 to 3-0-stable: Do not allow `BodyProxy` to respond to `to_str`, make `to_ary` call close . ([#2062](https://github.com/rack/rack/pull/2062), [@jeremyevans](https://github.com/jeremyevans)) - -## [3.0.10] - 2024-03-21 - -- Backport #2104 to 3-0-stable: Return empty when parsing a multi-part POST with only one end delimiter. ([#2164](https://github.com/rack/rack/pull/2164), [@JoeDupuis](https://github.com/JoeDupuis)) - -## [3.0.9.1] - 2024-02-21 - -### Security - -* [CVE-2024-26146] Fixed ReDoS in Accept header parsing -* [CVE-2024-25126] Fixed ReDoS in Content Type header parsing -* [CVE-2024-26141] Reject Range headers which are too large - -[CVE-2024-26146]: https://github.com/advisories/GHSA-54rr-7fvw-6x8f -[CVE-2024-25126]: https://github.com/advisories/GHSA-22f2-v57c-j9cx -[CVE-2024-26141]: https://github.com/advisories/GHSA-xj5v-6v4g-jfw6 - -## [3.0.9] - 2024-01-31 - -- Fix incorrect content-length header that was emitted when `Rack::Response#write` was used in some situations. ([#2150](https://github.com/rack/rack/pull/2150), [@mattbrictson](https://github.com/mattbrictson)) - -## [3.0.8] - 2023-06-14 - -- Fix some unused variable verbose warnings. ([#2084](https://github.com/rack/rack/pull/2084), [@jeremyevans], [@skipkayhil](https://github.com/skipkayhil)) - -## [3.0.7] - 2023-03-16 - -- Make query parameters without `=` have `nil` values. ([#2059](https://github.com/rack/rack/pull/2059), [@jeremyevans]) - -## [3.0.6.1] - 2023-03-13 - -### Security - -- [CVE-2023-27539] Avoid ReDoS in header parsing - -## [3.0.6] - 2023-03-13 - -- Add `QueryParser#missing_value` for handling missing values + tests. ([#2052](https://github.com/rack/rack/pull/2052), [@ioquatix]) - -## [3.0.5] - 2023-03-13 - -- Split form/query parsing into two steps. ([#2038](https://github.com/rack/rack/pull/2038), [@matthewd](https://github.com/matthewd)) - -## [3.0.4.2] - 2023-03-02 - -### Security - -- [CVE-2023-27530] Introduce multipart_total_part_limit to limit total parts - -## [3.0.4.1] - 2023-01-17 - -### Security - -- [CVE-2022-44571] Fix ReDoS vulnerability in multipart parser -- [CVE-2022-44570] Fix ReDoS in Rack::Utils.get_byte_ranges -- [CVE-2022-44572] Forbid control characters in attributes (also ReDoS) - -## [3.0.4] - 2023-01-17 - -- `Rack::Request#POST` should consistently raise errors. Cache errors that occur when invoking `Rack::Request#POST` so they can be raised again later. ([#2010](https://github.com/rack/rack/pull/2010), [@ioquatix]) -- Fix `Rack::Lint` error message for `HTTP_CONTENT_TYPE` and `HTTP_CONTENT_LENGTH`. ([#2007](https://github.com/rack/rack/pull/2007), [@byroot](https://github.com/byroot)) -- Extend `Rack::MethodOverride` to handle `QueryParser::ParamsTooDeepError` error. ([#2006](https://github.com/rack/rack/pull/2006), [@byroot](https://github.com/byroot)) - -## [3.0.3] - 2022-12-27 - -### Fixed - -- `Rack::URLMap` uses non-deprecated form of `Regexp.new`. ([#1998](https://github.com/rack/rack/pull/1998), [@weizheheng](https://github.com/weizheheng)) - -## [3.0.2] - 2022-12-05 - -### Fixed - -- `Utils.build_nested_query` URL-encodes nested field names including the square brackets. -- Allow `Rack::Response` to pass through streaming bodies. ([#1993](https://github.com/rack/rack/pull/1993), [@ioquatix]) - -## [3.0.1] - 2022-11-18 - -### Fixed - -- `MethodOverride` does not look for an override if a request does not include form/parseable data. -- `Rack::Lint::Wrapper` correctly handles `respond_to?` with `to_ary`, `each`, `call` and `to_path`, forwarding to the body. ([#1981](https://github.com/rack/rack/pull/1981), [@ioquatix]) - -## [3.0.0] - 2022-09-06 - -This release introduces major improvements to Rack, including enhanced support for streaming responses, expanded protocol handling, and stricter compliance with HTTP standards. It refines middleware interfaces, improves multipart and hijack handling, and strengthens security and error reporting. The update also brings performance optimizations, better compatibility with modern Ruby versions, and numerous bug fixes, making Rack more robust and flexible for web application development. - -- No changes - -## [3.0.0.rc1] - 2022-09-04 - -### SPEC Changes - -- Stream argument must implement `<<` https://github.com/rack/rack/pull/1959 -- `close` may be called on `rack.input` https://github.com/rack/rack/pull/1956 -- `rack.response_finished` may be used for executing code after the response has been finished https://github.com/rack/rack/pull/1952 - -## [3.0.0.beta1] - 2022-08-08 - -### Security - -- Do not use semicolon as GET parameter separator. ([#1733](https://github.com/rack/rack/pull/1733), [@jeremyevans]) - -### SPEC Changes - -- Response array must now be non-frozen. -- Response `status` must now be an integer greater than or equal to 100. -- Response `headers` must now be an unfrozen hash. -- Response header keys can no longer include uppercase characters. -- Response header values can be an `Array` to handle multiple values (and no longer supports `\n` encoded headers). -- Response body can now respond to `#call` (streaming body) instead of `#each` (enumerable body), for the equivalent of response hijacking in previous versions. -- Middleware must no longer call `#each` on the body, but they can call `#to_ary` on the body if it responds to `#to_ary`. -- `rack.input` is no longer required to be rewindable. -- `rack.multithread`/`rack.multiprocess`/`rack.run_once`/`rack.version` are no longer required environment keys. -- `SERVER_PROTOCOL` is now a required environment key, matching the HTTP protocol used in the request. -- `rack.hijack?` (partial hijack) and `rack.hijack` (full hijack) are now independently optional. -- `rack.hijack_io` has been removed completely. -- `rack.response_finished` is an optional environment key which contains an array of callable objects that must accept `#call(env, status, headers, error)` and are invoked after the response is finished (either successfully or unsuccessfully). -- It is okay to call `#close` on `rack.input` to indicate that you no longer need or care about the input. -- The stream argument supplied to the streaming body and hijack must support `#<<` for writing output. - -### Removed - -- Remove `rack.multithread`/`rack.multiprocess`/`rack.run_once`. These variables generally come too late to be useful. ([#1720](https://github.com/rack/rack/pull/1720), [@ioquatix], [@jeremyevans])) -- Remove deprecated Rack::Request::SCHEME_WHITELIST. ([@jeremyevans]) -- Remove internal cookie deletion using pattern matching, there are very few practical cases where it would be useful and browsers handle it correctly without us doing anything special. ([#1844](https://github.com/rack/rack/pull/1844), [@ioquatix]) -- Remove `rack.version` as it comes too late to be useful. ([#1938](https://github.com/rack/rack/pull/1938), [@ioquatix]) -- Extract `rackup` command, `Rack::Server`, `Rack::Handler` and related code into a separate gem. ([#1937](https://github.com/rack/rack/pull/1937), [@ioquatix]) - -### Added - -- `Rack::Headers` added to support lower-case header keys. ([@jeremyevans]) -- `Rack::Utils#set_cookie_header` now supports `escape_key: false` to avoid key escaping. ([@jeremyevans]) -- `Rack::RewindableInput` supports size. ([@ahorek](https://github.com/ahorek)) -- `Rack::RewindableInput::Middleware` added for making `rack.input` rewindable. ([@jeremyevans]) -- The RFC 7239 Forwarded header is now supported and considered by default when looking for information on forwarding, falling back to the X-Forwarded-* headers. `Rack::Request.forwarded_priority` accessor has been added for configuring the priority of which header to check. ([#1423](https://github.com/rack/rack/issues/1423), [@jeremyevans]) -- Allow response headers to contain array of values. ([#1598](https://github.com/rack/rack/issues/1598), [@ioquatix]) -- Support callable body for explicit streaming support and clarify streaming response body behaviour. ([#1745](https://github.com/rack/rack/pull/1745), [@ioquatix], [#1748](https://github.com/rack/rack/pull/1748), [@wjordan]) -- Allow `Rack::Builder#run` to take a block instead of an argument. ([#1942](https://github.com/rack/rack/pull/1942), [@ioquatix]) -- Add `rack.response_finished` to `Rack::Lint`. ([#1802](https://github.com/rack/rack/pull/1802), [@BlakeWilliams], [#1952](https://github.com/rack/rack/pull/1952), [@ioquatix]) -- The stream argument must implement `#<<`. ([#1959](https://github.com/rack/rack/pull/1959), [@ioquatix]) - -### Changed - -- BREAKING CHANGE: Require `status` to be an Integer. ([#1662](https://github.com/rack/rack/pull/1662), [@olleolleolle](https://github.com/olleolleolle)) -- BREAKING CHANGE: Query parsing now treats parameters without `=` as having the empty string value instead of nil value, to conform to the URL spec. ([#1696](https://github.com/rack/rack/issues/1696), [@jeremyevans]) -- Relax validations around `Rack::Request#host` and `Rack::Request#hostname`. ([#1606](https://github.com/rack/rack/issues/1606), [@pvande](https://github.com/pvande)) -- Removed antiquated handlers: FCGI, LSWS, SCGI, Thin. ([#1658](https://github.com/rack/rack/pull/1658), [@ioquatix]) -- Removed options from `Rack::Builder.parse_file` and `Rack::Builder.load_file`. ([#1663](https://github.com/rack/rack/pull/1663), [@ioquatix]) -- `Rack::HTTP_VERSION` has been removed and the `HTTP_VERSION` env setting is no longer set in the CGI and Webrick handlers. ([#970](https://github.com/rack/rack/issues/970), [@jeremyevans]) -- `Rack::Request#[]` and `#[]=` now warn even in non-verbose mode. ([#1277](https://github.com/rack/rack/issues/1277), [@jeremyevans]) -- Decrease default allowed parameter recursion level from 100 to 32. ([#1640](https://github.com/rack/rack/issues/1640), [@jeremyevans]) -- Attempting to parse a multipart response with an empty body now raises Rack::Multipart::EmptyContentError. ([#1603](https://github.com/rack/rack/issues/1603), [@jeremyevans]) -- `Rack::Utils.secure_compare` uses OpenSSL's faster implementation if available. ([#1711](https://github.com/rack/rack/pull/1711), [@bdewater](https://github.com/bdewater)) -- `Rack::Request#POST` now caches an empty hash if input content type is not parseable. ([#749](https://github.com/rack/rack/pull/749), [@jeremyevans]) -- BREAKING CHANGE: Updated `trusted_proxy?` to match full 127.0.0.0/8 network. ([#1781](https://github.com/rack/rack/pull/1781), [@snbloch](https://github.com/snbloch)) -- Explicitly deprecate `Rack::File` which was an alias for `Rack::Files`. ([#1811](https://github.com/rack/rack/pull/1720), [@ioquatix]). -- Moved `Rack::Session` into [separate gem](https://github.com/rack/rack-session). ([#1805](https://github.com/rack/rack/pull/1805), [@ioquatix]) -- `rackup -D` option to daemonizes no longer changes the working directory to the root. ([#1813](https://github.com/rack/rack/pull/1813), [@jeremyevans]) -- The `x-forwarded-proto` header is now considered before the `x-forwarded-scheme` header for determining the forwarded protocol. `Rack::Request.x_forwarded_proto_priority` accessor has been added for configuring the priority of which header to check. ([#1809](https://github.com/rack/rack/issues/1809), [@jeremyevans]) -- `Rack::Request.forwarded_authority` (and methods that call it, such as `host`) now returns the last authority in the forwarded header, instead of the first, as earlier forwarded authorities can be forged by clients. This restores the Rack 2.1 behavior. ([#1829](https://github.com/rack/rack/issues/1809), [@jeremyevans]) -- Use lower case cookie attributes when creating cookies, and fold cookie attributes to lower case when reading cookies (specifically impacting `secure` and `httponly` attributes). ([#1849](https://github.com/rack/rack/pull/1849), [@ioquatix]) -- The response array must now be mutable (non-frozen) so middleware can modify it without allocating a new Array,therefore reducing object allocations. ([#1887](https://github.com/rack/rack/pull/1887), [#1927](https://github.com/rack/rack/pull/1927), [@amatsuda], [@ioquatix]) -- `rack.hijack?` (partial hijack) and `rack.hijack` (full hijack) are now independently optional. `rack.hijack_io` is no longer required/specified. ([#1939](https://github.com/rack/rack/pull/1939), [@ioquatix]) -- Allow calling close on `rack.input`. ([#1956](https://github.com/rack/rack/pull/1956), [@ioquatix]) - -### Fixed - -- Make Rack::MockResponse handle non-hash headers. ([#1629](https://github.com/rack/rack/issues/1629), [@jeremyevans]) -- TempfileReaper now deletes temp files if application raises an exception. ([#1679](https://github.com/rack/rack/issues/1679), [@jeremyevans]) -- Handle cookies with values that end in '=' ([#1645](https://github.com/rack/rack/pull/1645), [@lukaso](https://github.com/lukaso)) -- Make `Rack::NullLogger` respond to `#fatal!` [@jeremyevans]) -- Fix multipart filename generation for filenames that contain spaces. Encode spaces as "%20" instead of "+" which will be decoded properly by the multipart parser. ([#1736](https://github.com/rack/rack/pull/1645), [@muirdm](https://github.com/muirdm)) -- `Rack::Request#scheme` returns `ws` or `wss` when one of the `X-Forwarded-Scheme` / `X-Forwarded-Proto` headers is set to `ws` or `wss`, respectively. ([#1730](https://github.com/rack/rack/issues/1730), [@erwanst](https://github.com/erwanst)) - -## [2.2.17] - 2025-06-03 - -- Backport `Rack::MediaType#params` now handles parameters without values. ([#2263](https://github.com/rack/rack/pull/2263), [@AllyMarthaJ](https://github.com/AllyMarthaJ)) - -## [2.2.16] - 2025-05-22 - -- Fix incorrect backport of optional `CGI::Cookie` support. ([#2335](https://github.com/rack/rack/pull/2335), [@jeremyevans]) - -## [2.2.15] - 2025-05-18 - -- Optional support for `CGI::Cookie` if not available. ([#2327](https://github.com/rack/rack/pull/2327), [#2333](https://github.com/rack/rack/pull/2333), [@earlopain]) - -## [2.2.14] - 2025-05-06 - -:warning: **This release includes a security fix that may cause certain routes in previously working applications to fail if query parameters exceed 4,096 in count or 4 MB in total size. See for more details.** - -### Security - -- [CVE-2025-46727](https://github.com/rack/rack/security/advisories/GHSA-gjh7-p2fx-99vx) Unbounded parameter parsing in `Rack::QueryParser` can lead to memory exhaustion. - -## [2.2.13] - 2025-03-11 - -### Security - -- [CVE-2025-27610](https://github.com/rack/rack/security/advisories/GHSA-7wqh-767x-r66v) Local file inclusion in `Rack::Static`. - -## [2.2.12] - 2025-03-04 - -### Security - -- [CVE-2025-27111](https://github.com/rack/rack/security/advisories/GHSA-8cgq-6mh2-7j6v) Possible Log Injection in `Rack::Sendfile`. - -## [2.2.11] - 2025-02-12 - -### Security - -- [CVE-2025-25184](https://github.com/rack/rack/security/advisories/GHSA-7g2v-jj9q-g3rg) Possible Log Injection in `Rack::CommonLogger`. - -## [2.2.10] - 2024-10-14 - -- Fix compatibility issues with Ruby v3.4.0. ([#2248](https://github.com/rack/rack/pull/2248), [@byroot](https://github.com/byroot)) - -## [2.2.9] - 2023-03-21 - -- Return empty when parsing a multi-part POST with only one end delimiter. ([#2104](https://github.com/rack/rack/pull/2104), [@alpaca-tc]) - -## [2.2.8] - 2023-07-31 - -- Regenerate SPEC ([#2102](https://github.com/rack/rack/pull/2102), [@skipkayhil](https://github.com/skipkayhil)) -- Limit file extension length of multipart tempfiles ([#2015](https://github.com/rack/rack/pull/2015), [@dentarg](https://github.com/dentarg)) -- Fix "undefined method DelegateClass for Rack::Session::Cookie:Class" ([#2092](https://github.com/rack/rack/pull/2092), [@onigra](https://github.com/onigra) [@dchandekstark](https://github.com/dchandekstark)) - -## [2.2.7] - 2023-03-13 - -- Correct the year number in the changelog ([#2015](https://github.com/rack/rack/pull/2015), [@kimulab](https://github.com/kimulab)) -- Support underscore in host names for Rack 2.2 (Fixes [#2070](https://github.com/rack/rack/issues/2070)) ([#2015](https://github.com/rack/rack/pull/2071), [@jeremyevans](https://github.com/jeremyevans)) - -## [2.2.6.4] - 2023-03-13 - -- [CVE-2023-27539] Avoid ReDoS in header parsing - -## [2.2.6.3] - 2023-03-02 - -- [CVE-2023-27530] Introduce multipart_total_part_limit to limit total parts - -## [2.2.6.2] - 2023-01-17 - -- [CVE-2022-44570] Fix ReDoS in Rack::Utils.get_byte_ranges - -## [2.2.6.1] - 2023-01-17 - -- [CVE-2022-44571] Fix ReDoS vulnerability in multipart parser -- [CVE-2022-44572] Forbid control characters in attributes (also ReDoS) - -## [2.2.6] - 2023-01-17 - -- Extend `Rack::MethodOverride` to handle `QueryParser::ParamsTooDeepError` error. ([#2011](https://github.com/rack/rack/pull/2011), [@byroot](https://github.com/byroot)) - -## [2.2.5] - 2022-12-27 - -### Fixed - -- `Rack::URLMap` uses non-deprecated form of `Regexp.new`. ([#1998](https://github.com/rack/rack/pull/1998), [@weizheheng](https://github.com/weizheheng)) - -## [2.2.4] - 2022-06-30 - -- Better support for lower case headers in `Rack::ETag` middleware. ([#1919](https://github.com/rack/rack/pull/1919), [@ioquatix](https://github.com/ioquatix)) -- Use custom exception on params too deep error. ([#1838](https://github.com/rack/rack/pull/1838), [@simi](https://github.com/simi)) - -## [2.2.3.1] - 2022-05-27 - -### Security - -- [CVE-2022-30123] Fix shell escaping issue in Common Logger -- [CVE-2022-30122] Restrict parsing of broken MIME attachments - -## [2.2.3] - 2020-06-15 - -### Security - -- [[CVE-2020-8184](https://nvd.nist.gov/vuln/detail/CVE-2020-8184)] Do not allow percent-encoded cookie name to override existing cookie names. BREAKING CHANGE: Accessing cookie names that require URL encoding with decoded name no longer works. ([@fletchto99](https://github.com/fletchto99)) - -## [2.2.2] - 2020-02-11 - -### Fixed - -- Fix incorrect `Rack::Request#host` value. ([#1591](https://github.com/rack/rack/pull/1591), [@ioquatix]) -- Revert `Rack::Handler::Thin` implementation. ([#1583](https://github.com/rack/rack/pull/1583), [@jeremyevans]) -- Double assignment is still needed to prevent an "unused variable" warning. ([#1589](https://github.com/rack/rack/pull/1589), [@kamipo](https://github.com/kamipo)) -- Fix to handle same_site option for session pool. ([#1587](https://github.com/rack/rack/pull/1587), [@kamipo](https://github.com/kamipo)) - -## [2.2.1] - 2020-02-09 - -### Fixed - -- Rework `Rack::Request#ip` to handle empty `forwarded_for`. ([#1577](https://github.com/rack/rack/pull/1577), [@ioquatix]) - -## [2.2.0] - 2020-02-08 - -### SPEC Changes - -- `rack.session` request environment entry must respond to `to_hash` and return unfrozen Hash. ([@jeremyevans]) -- Request environment cannot be frozen. ([@jeremyevans]) -- CGI values in the request environment with non-ASCII characters must use ASCII-8BIT encoding. ([@jeremyevans]) -- Improve SPEC/lint relating to SERVER_NAME, SERVER_PORT and HTTP_HOST. ([#1561](https://github.com/rack/rack/pull/1561), [@ioquatix]) - -### Added - -- `rackup` supports multiple `-r` options and will require all arguments. ([@jeremyevans]) -- `Server` supports an array of paths to require for the `:require` option. ([@khotta](https://github.com/khotta)) -- `Files` supports multipart range requests. ([@fatkodima](https://github.com/fatkodima)) -- `Multipart::UploadedFile` supports an IO-like object instead of using the filesystem, using `:filename` and `:io` options. ([@jeremyevans]) -- `Multipart::UploadedFile` supports keyword arguments `:path`, `:content_type`, and `:binary` in addition to positional arguments. ([@jeremyevans]) -- `Static` supports a `:cascade` option for calling the app if there is no matching file. ([@jeremyevans]) -- `Session::Abstract::SessionHash#dig`. ([@jeremyevans]) -- `Response.[]` and `MockResponse.[]` for creating instances using status, headers, and body. ([@ioquatix]) -- Convenient cache and content type methods for `Rack::Response`. ([#1555](https://github.com/rack/rack/pull/1555), [@ioquatix]) - -### Changed - -- `Request#params` no longer rescues EOFError. ([@jeremyevans]) -- `Directory` uses a streaming approach, significantly improving time to first byte for large directories. ([@jeremyevans]) -- `Directory` no longer includes a Parent directory link in the root directory index. ([@jeremyevans]) -- `QueryParser#parse_nested_query` uses original backtrace when reraising exception with new class. ([@jeremyevans]) -- `ConditionalGet` follows RFC 7232 precedence if both If-None-Match and If-Modified-Since headers are provided. ([@jeremyevans]) -- `.ru` files supports the `frozen-string-literal` magic comment. ([@eregon](https://github.com/eregon)) -- Rely on autoload to load constants instead of requiring internal files, make sure to require 'rack' and not just 'rack/...'. ([@jeremyevans]) -- BREAKING CHANGE: `Etag` will continue sending ETag even if the response should not be cached. Streaming no longer works without a workaround, see [#1619](https://github.com/rack/rack/issues/1619#issuecomment-848460528). ([@henm](https://github.com/henm)) -- `Request#host_with_port` no longer includes a colon for a missing or empty port. ([@AlexWayfer](https://github.com/AlexWayfer)) -- All handlers uses keywords arguments instead of an options hash argument. ([@ioquatix]) -- `Files` handling of range requests no longer return a body that supports `to_path`, to ensure range requests are handled correctly. ([@jeremyevans]) -- `Multipart::Generator` only includes `Content-Length` for files with paths, and `Content-Disposition` `filename` if the `UploadedFile` instance has one. ([@jeremyevans]) -- `Request#ssl?` is true for the `wss` scheme (secure websockets). ([@jeremyevans]) -- `Rack::HeaderHash` is memoized by default. ([#1549](https://github.com/rack/rack/pull/1549), [@ioquatix]) -- `Rack::Directory` allow directory traversal inside root directory. ([#1417](https://github.com/rack/rack/pull/1417), [@ThomasSevestre](https://github.com/ThomasSevestre)) -- Sort encodings by server preference. ([#1184](https://github.com/rack/rack/pull/1184), [@ioquatix], [@wjordan](https://github.com/wjordan)) -- Rework host/hostname/authority implementation in `Rack::Request`. `#host` and `#host_with_port` have been changed to correctly return IPv6 addresses formatted with square brackets, as defined by [RFC3986](https://tools.ietf.org/html/rfc3986#section-3.2.2). ([#1561](https://github.com/rack/rack/pull/1561), [@ioquatix]) -- `Rack::Builder` parsing options on first `#\` line is deprecated. ([#1574](https://github.com/rack/rack/pull/1574), [@ioquatix]) - -### Removed - -- `Directory#path` as it was not used and always returned nil. ([@jeremyevans]) -- `BodyProxy#each` as it was only needed to work around a bug in Ruby <1.9.3. ([@jeremyevans]) -- `URLMap::INFINITY` and `URLMap::NEGATIVE_INFINITY`, in favor of `Float::INFINITY`. ([@ch1c0t](https://github.com/ch1c0t)) -- Deprecation of `Rack::File`. It will be deprecated again in rack 2.2 or 3.0. ([@rafaelfranca](https://github.com/rafaelfranca)) -- Support for Ruby 2.2 as it is well past EOL. ([@ioquatix]) -- Remove `Rack::Files#response_body` as the implementation was broken. ([#1153](https://github.com/rack/rack/pull/1153), [@ioquatix]) -- Remove `SERVER_ADDR` which was never part of the original SPEC. ([#1573](https://github.com/rack/rack/pull/1573), [@ioquatix]) - -### Fixed - -- `Directory` correctly handles root paths containing glob metacharacters. ([@jeremyevans]) -- `Cascade` uses a new response object for each call if initialized with no apps. ([@jeremyevans]) -- `BodyProxy` correctly delegates keyword arguments to the body object on Ruby 2.7+. ([@jeremyevans]) -- `BodyProxy#method` correctly handles methods delegated to the body object. ([@jeremyevans]) -- `Request#host` and `Request#host_with_port` handle IPv6 addresses correctly. ([@AlexWayfer](https://github.com/AlexWayfer)) -- `Lint` checks when response hijacking that `rack.hijack` is called with a valid object. ([@jeremyevans]) -- `Response#write` correctly updates `Content-Length` if initialized with a body. ([@jeremyevans]) -- `CommonLogger` includes `SCRIPT_NAME` when logging. ([@Erol](https://github.com/Erol)) -- `Utils.parse_nested_query` correctly handles empty queries, using an empty instance of the params class instead of a hash. ([@jeremyevans]) -- `Directory` correctly escapes paths in links. ([@yous](https://github.com/yous)) -- `Request#delete_cookie` and related `Utils` methods handle `:domain` and `:path` options in same call. ([@jeremyevans]) -- `Request#delete_cookie` and related `Utils` methods do an exact match on `:domain` and `:path` options. ([@jeremyevans]) -- `Static` no longer adds headers when a gzipped file request has a 304 response. ([@chooh](https://github.com/chooh)) -- `ContentLength` sets `Content-Length` response header even for bodies not responding to `to_ary`. ([@jeremyevans]) -- Thin handler supports options passed directly to `Thin::Controllers::Controller`. ([@jeremyevans]) -- WEBrick handler no longer ignores `:BindAddress` option. ([@jeremyevans]) -- `ShowExceptions` handles invalid POST data. ([@jeremyevans]) -- Basic authentication requires a password, even if the password is empty. ([@jeremyevans]) -- `Lint` checks response is array with 3 elements, per SPEC. ([@jeremyevans]) -- Support for using `:SSLEnable` option when using WEBrick handler. (Gregor Melhorn) -- Close response body after buffering it when buffering. ([@ioquatix]) -- Only accept `;` as delimiter when parsing cookies. ([@mrageh](https://github.com/mrageh)) -- `Utils::HeaderHash#clear` clears the name mapping as well. ([@raxoft](https://github.com/raxoft)) -- Support for passing `nil` `Rack::Files.new`, which notably fixes Rails' current `ActiveStorage::FileServer` implementation. ([@ioquatix]) - -### Documentation - -- CHANGELOG updates. ([@aupajo](https://github.com/aupajo)) -- Added [CONTRIBUTING](CONTRIBUTING.md). ([@dblock](https://github.com/dblock)) - -## [2.0.9] - 2020-02-08 - -- Handle case where session id key is requested but missing ([@jeremyevans]) -- Restore support for code relying on `SessionId#to_s`. ([@jeremyevans]) -- Add support for `SameSite=None` cookie value. ([@hennikul](https://github.com/hennikul)) - -## [2.1.2] - 2020-01-27 - -- Fix multipart parser for some files to prevent denial of service ([@aiomaster](https://github.com/aiomaster)) -- Fix `Rack::Builder#use` with keyword arguments ([@kamipo](https://github.com/kamipo)) -- Skip deflating in Rack::Deflater if Content-Length is 0 ([@jeremyevans]) -- Remove `SessionHash#transform_keys`, no longer needed ([@pavel](https://github.com/pavel)) -- Add to_hash to wrap Hash and Session classes ([@oleh-demyanyuk](https://github.com/oleh-demyanyuk)) -- Handle case where session id key is requested but missing ([@jeremyevans]) - -## [2.1.1] - 2020-01-12 - -- Remove `Rack::Chunked` from `Rack::Server` default middleware. ([#1475](https://github.com/rack/rack/pull/1475), [@ioquatix]) -- Restore support for code relying on `SessionId#to_s`. ([@jeremyevans]) - -## [2.1.0] - 2020-01-10 - -### Added - -- Add support for `SameSite=None` cookie value. ([@hennikul](https://github.com/hennikul)) -- Add trailer headers. ([@eileencodes](https://github.com/eileencodes)) -- Add MIME Types for video streaming. ([@styd](https://github.com/styd)) -- Add MIME Type for WASM. ([@buildrtech](https://github.com/buildrtech)) -- Add `Early Hints(103)` to status codes. ([@egtra](https://github.com/egtra)) -- Add `Too Early(425)` to status codes. ([@y-yagi]((https://github.com/y-yagi))) -- Add `Bandwidth Limit Exceeded(509)` to status codes. ([@CJKinni](https://github.com/CJKinni)) -- Add method for custom `ip_filter`. ([@svcastaneda](https://github.com/svcastaneda)) -- Add boot-time profiling capabilities to `rackup`. ([@tenderlove](https://github.com/tenderlove)) -- Add multi mapping support for `X-Accel-Mappings` header. ([@yoshuki](https://github.com/yoshuki)) -- Add `sync: false` option to `Rack::Deflater`. (Eric Wong) -- Add `Builder#freeze_app` to freeze application and all middleware instances. ([@jeremyevans]) -- Add API to extract cookies from `Rack::MockResponse`. ([@petercline](https://github.com/petercline)) - -### Changed - -- Don't propagate nil values from middleware. ([@ioquatix]) -- Lazily initialize the response body and only buffer it if required. ([@ioquatix]) -- Fix deflater zlib buffer errors on empty body part. ([@felixbuenemann](https://github.com/felixbuenemann)) -- Set `X-Accel-Redirect` to percent-encoded path. ([@diskkid](https://github.com/diskkid)) -- Remove unnecessary buffer growing when parsing multipart. ([@tainoe](https://github.com/tainoe)) -- Expand the root path in `Rack::Static` upon initialization. ([@rosenfeld](https://github.com/rosenfeld)) -- Make `ShowExceptions` work with binary data. ([@axyjo](https://github.com/axyjo)) -- Use buffer string when parsing multipart requests. ([@janko-m](https://github.com/janko-m)) -- Support optional UTF-8 Byte Order Mark (BOM) in config.ru. ([@mikegee](https://github.com/mikegee)) -- Handle `X-Forwarded-For` with optional port. ([@dpritchett](https://github.com/dpritchett)) -- Use `Time#httpdate` format for Expires, as proposed by RFC 7231. ([@nanaya](https://github.com/nanaya)) -- Make `Utils.status_code` raise an error when the status symbol is invalid instead of `500`. ([@adambutler](https://github.com/adambutler)) -- Rename `Request::SCHEME_WHITELIST` to `Request::ALLOWED_SCHEMES`. -- Make `Multipart::Parser.get_filename` accept files with `+` in their name. ([@lucaskanashiro](https://github.com/lucaskanashiro)) -- Add Falcon to the default handler fallbacks. ([@ioquatix]) -- Update codebase to avoid string mutations in preparation for `frozen_string_literals`. ([@pat](https://github.com/pat)) -- Change `MockRequest#env_for` to rely on the input optionally responding to `#size` instead of `#length`. ([@janko](https://github.com/janko)) -- Rename `Rack::File` -> `Rack::Files` and add deprecation notice. ([@postmodern](https://github.com/postmodern)) -- Prefer Base64 “strict encoding” for Base64 cookies. ([@ioquatix]) - -### Removed - -- BREAKING CHANGE: Remove `to_ary` from Response ([@tenderlove](https://github.com/tenderlove)) -- Deprecate `Rack::Session::Memcache` in favor of `Rack::Session::Dalli` from dalli gem ([@fatkodima](https://github.com/fatkodima)) - -### Fixed - -- Eliminate warnings for Ruby 2.7. ([@osamtimizer](https://github.com/osamtimizer])) - -### Documentation - -- Update broken example in `Session::Abstract::ID` documentation. ([tonytonyjan](https://github.com/tonytonyjan)) -- Add Padrino to the list of frameworks implementing Rack. ([@wikimatze](https://github.com/wikimatze)) -- Remove Mongrel from the suggested server options in the help output. ([@tricknotes](https://github.com/tricknotes)) -- Replace `HISTORY.md` and `NEWS.md` with `CHANGELOG.md`. ([@twitnithegirl](https://github.com/twitnithegirl)) -- CHANGELOG updates. ([@drenmi](https://github.com/Drenmi), [@p8](https://github.com/p8)) - -## [2.0.8] - 2019-12-08 - -### Security - -- [[CVE-2019-16782](https://nvd.nist.gov/vuln/detail/CVE-2019-16782)] Prevent timing attacks targeted at session ID lookup. BREAKING CHANGE: Session ID is now a SessionId instance instead of a String. ([@tenderlove](https://github.com/tenderlove), [@rafaelfranca](https://github.com/rafaelfranca)) - -## [1.6.12] - 2019-12-08 - -### Security - -- [[CVE-2019-16782](https://nvd.nist.gov/vuln/detail/CVE-2019-16782)] Prevent timing attacks targeted at session ID lookup. BREAKING CHANGE: Session ID is now a SessionId instance instead of a String. ([@tenderlove](https://github.com/tenderlove), [@rafaelfranca](https://github.com/rafaelfranca)) - -## [2.0.7] - 2019-04-02 - -### Fixed - -- Remove calls to `#eof?` on Rack input in `Multipart::Parser`, as this breaks the specification. ([@matthewd](https://github.com/matthewd)) -- Preserve forwarded IP addresses for trusted proxy chains. ([@SamSaffron](https://github.com/SamSaffron)) - -## [2.0.6] - 2018-11-05 - -### Fixed - -- [[CVE-2018-16470](https://nvd.nist.gov/vuln/detail/CVE-2018-16470)] Reduce buffer size of `Multipart::Parser` to avoid pathological parsing. ([@tenderlove](https://github.com/tenderlove)) -- Fix a call to a non-existing method `#accepts_html` in the `ShowExceptions` middleware. ([@tomelm](https://github.com/tomelm)) -- [[CVE-2018-16471](https://nvd.nist.gov/vuln/detail/CVE-2018-16471)] Whitelist HTTP and HTTPS schemes in `Request#scheme` to prevent a possible XSS attack. ([@PatrickTulskie](https://github.com/PatrickTulskie)) - -## [2.0.5] - 2018-04-23 - -### Fixed - -- Record errors originating from invalid UTF8 in `MethodOverride` middleware instead of breaking. ([@mclark](https://github.com/mclark)) - -## [2.0.4] - 2018-01-31 - -### Changed - -- Ensure the `Lock` middleware passes the original `env` object. ([@lugray](https://github.com/lugray)) -- Improve performance of `Multipart::Parser` when uploading large files. ([@tompng](https://github.com/tompng)) -- Increase buffer size in `Multipart::Parser` for better performance. ([@jkowens](https://github.com/jkowens)) -- Reduce memory usage of `Multipart::Parser` when uploading large files. ([@tompng](https://github.com/tompng)) -- Replace ConcurrentRuby dependency with native `Queue`. ([@devmchakan](https://github.com/devmchakan)) - -### Fixed - -- Require the correct digest algorithm in the `ETag` middleware. ([@matthewd](https://github.com/matthewd)) - -### Documentation - -- Update homepage links to use SSL. ([@hugoabonizio](https://github.com/hugoabonizio)) - -## [2.0.3] - 2017-05-15 - -### Changed - -- Ensure `env` values are ASCII 8-bit encoded. ([@eileencodes](https://github.com/eileencodes)) - -### Fixed - -- Prevent exceptions when a class with mixins inherits from `Session::Abstract::ID`. ([@jnraine](https://github.com/jnraine)) - -## [2.0.2] - 2017-05-08 - -### Added - -- Allow `Session::Abstract::SessionHash#fetch` to accept a block with a default value. ([@yannvanhalewyn](https://github.com/yannvanhalewyn)) -- Add `Builder#freeze_app` to freeze application and all middleware. ([@jeremyevans]) - -### Changed - -- Freeze default session options to avoid accidental mutation. ([@kirs](https://github.com/kirs)) -- Detect partial hijack without hash headers. ([@devmchakan](https://github.com/devmchakan)) -- Update tests to use MiniTest 6 matchers. ([@tonytonyjan](https://github.com/tonytonyjan)) -- Allow 205 Reset Content responses to set a Content-Length, as RFC 7231 proposes setting this to 0. ([@devmchakan](https://github.com/devmchakan)) - -### Fixed - -- Handle `NULL` bytes in multipart filenames. ([@casperisfine](https://github.com/casperisfine)) -- Remove warnings due to miscapitalized global. ([@ioquatix]) -- Prevent exceptions caused by a race condition on multi-threaded servers. ([@sophiedeziel](https://github.com/sophiedeziel)) -- Add RDoc as an explicit dependency for `doc` group. ([@tonytonyjan](https://github.com/tonytonyjan)) -- Record errors originating from `Multipart::Parser` in the `MethodOverride` middleware instead of letting them bubble up. ([@carlzulauf](https://github.com/carlzulauf)) -- Remove remaining use of removed `Utils#bytesize` method from the `File` middleware. ([@brauliomartinezlm](https://github.com/brauliomartinezlm)) - -### Removed - -- Remove `deflate` encoding support to reduce caching overhead. ([@devmchakan](https://github.com/devmchakan)) - -### Documentation - -- Update broken example in `Deflater` documentation. ([@mwpastore](https://github.com/mwpastore)) - -## [2.0.1] - 2016-06-30 - -### Changed - -- Remove JSON as an explicit dependency. ([@mperham](https://github.com/mperham)) - - -# History/News Archive -Items below this line are from the previously maintained HISTORY.md and NEWS.md files. - -## [2.0.0.rc1] 2016-05-06 -- Rack::Session::Abstract::ID is deprecated. Please change to use Rack::Session::Abstract::Persisted - -## [2.0.0.alpha] 2015-12-04 -- First-party "SameSite" cookies. Browsers omit SameSite cookies from third-party requests, closing the door on many CSRF attacks. -- Pass `same_site: true` (or `:strict`) to enable: response.set_cookie 'foo', value: 'bar', same_site: true or `same_site: :lax` to use Lax enforcement: response.set_cookie 'foo', value: 'bar', same_site: :lax -- Based on version 7 of the Same-site Cookies internet draft: - https://tools.ietf.org/html/draft-west-first-party-cookies-07 -- Thanks to Ben Toews (@mastahyeti) and Bob Long (@bobjflong) for updating to drafts 5 and 7. -- Add `Rack::Events` middleware for adding event based middleware: middleware that does not care about the response body, but only cares about doing work at particular points in the request / response lifecycle. -- Add `Rack::Request#authority` to calculate the authority under which the response is being made (this will be handy for h2 pushes). -- Add `Rack::Response::Helpers#cache_control` and `cache_control=`. Use this for setting cache control headers on your response objects. -- Add `Rack::Response::Helpers#etag` and `etag=`. Use this for setting etag values on the response. -- Introduce `Rack::Response::Helpers#add_header` to add a value to a multi-valued response header. Implemented in terms of other `Response#*_header` methods, so it's available to any response-like class that includes the `Helpers` module. -- Add `Rack::Request#add_header` to match. -- `Rack::Session::Abstract::ID` IS DEPRECATED. Please switch to `Rack::Session::Abstract::Persisted`. `Rack::Session::Abstract::Persisted` uses a request object rather than the `env` hash. -- Pull `ENV` access inside the request object in to a module. This will help with legacy Request objects that are ENV based but don't want to inherit from Rack::Request -- Move most methods on the `Rack::Request` to a module `Rack::Request::Helpers` and use public API to get values from the request object. This enables users to mix `Rack::Request::Helpers` in to their own objects so they can implement `(get|set|fetch|each)_header` as they see fit (for example a proxy object). -- Files and directories with + in the name are served correctly. Rather than unescaping paths like a form, we unescape with a URI parser using `Rack::Utils.unescape_path`. Fixes #265 -- Tempfiles are automatically closed in the case that there were too - many posted. -- Added methods for manipulating response headers that don't assume - they're stored as a Hash. Response-like classes may include the - Rack::Response::Helpers module if they define these methods: - - Rack::Response#has_header? - - Rack::Response#get_header - - Rack::Response#set_header - - Rack::Response#delete_header -- Introduce Util.get_byte_ranges that will parse the value of the HTTP_RANGE string passed to it without depending on the `env` hash. `byte_ranges` is deprecated in favor of this method. -- Change Session internals to use Request objects for looking up session information. This allows us to only allocate one request object when dealing with session objects (rather than doing it every time we need to manipulate cookies, etc). -- Add `Rack::Request#initialize_copy` so that the env is duped when the request gets duped. -- Added methods for manipulating request specific data. This includes - data set as CGI parameters, and just any arbitrary data the user wants - to associate with a particular request. New methods: - - Rack::Request#has_header? - - Rack::Request#get_header - - Rack::Request#fetch_header - - Rack::Request#each_header - - Rack::Request#set_header - - Rack::Request#delete_header -- lib/rack/utils.rb: add a method for constructing "delete" cookie - headers. This allows us to construct cookie headers without depending - on the side effects of mutating a hash. -- Prevent extremely deep parameters from being parsed. CVE-2015-3225 - -## [1.6.1] 2015-05-06 - - Fix CVE-2014-9490, denial of service attack in OkJson - - Use a monotonic time for Rack::Runtime, if available - - RACK_MULTIPART_LIMIT changed to RACK_MULTIPART_PART_LIMIT (RACK_MULTIPART_LIMIT is deprecated and will be removed in 1.7.0) - -## [1.5.3] 2015-05-06 - - Fix CVE-2014-9490, denial of service attack in OkJson - - Backport bug fixes to 1.5 series - -## [1.6.0] 2014-01-18 - - Response#unauthorized? helper - - Deflater now accepts an options hash to control compression on a per-request level - - Builder#warmup method for app preloading - - Request#accept_language method to extract HTTP_ACCEPT_LANGUAGE - - Add quiet mode of rack server, rackup --quiet - - Update HTTP Status Codes to RFC 7231 - - Less strict header name validation according to RFC 2616 - - SPEC updated to specify headers conform to RFC7230 specification - - Etag correctly marks etags as weak - - Request#port supports multiple x-http-forwarded-proto values - - Utils#multipart_part_limit configures the maximum number of parts a request can contain - - Default host to localhost when in development mode - - Various bugfixes and performance improvements - -## [1.5.2] 2013-02-07 - - Fix CVE-2013-0263, timing attack against Rack::Session::Cookie - - Fix CVE-2013-0262, symlink path traversal in Rack::File - - Add various methods to Session for enhanced Rails compatibility - - Request#trusted_proxy? now only matches whole strings - - Add JSON cookie coder, to be default in Rack 1.6+ due to security concerns - - URLMap host matching in environments that don't set the Host header fixed - - Fix a race condition that could result in overwritten pidfiles - - Various documentation additions - -## [1.4.5] 2013-02-07 - - Fix CVE-2013-0263, timing attack against Rack::Session::Cookie - - Fix CVE-2013-0262, symlink path traversal in Rack::File - -## [1.1.6, 1.2.8, 1.3.10] 2013-02-07 - - Fix CVE-2013-0263, timing attack against Rack::Session::Cookie - -## [1.5.1] 2013-01-28 - - Rack::Lint check_hijack now conforms to other parts of SPEC - - Added hash-like methods to Abstract::ID::SessionHash for compatibility - - Various documentation corrections - -## [1.5.0] 2013-01-21 - - Introduced hijack SPEC, for before-response and after-response hijacking - - SessionHash is no longer a Hash subclass - - Rack::File cache_control parameter is removed, in place of headers options - - Rack::Auth::AbstractRequest#scheme now yields strings, not symbols - - Rack::Utils cookie functions now format expires in RFC 2822 format - - Rack::File now has a default mime type - - rackup -b 'run Rack::Files.new(".")', option provides command line configs - - Rack::Deflater will no longer double encode bodies - - Rack::Mime#match? provides convenience for Accept header matching - - Rack::Utils#q_values provides splitting for Accept headers - - Rack::Utils#best_q_match provides a helper for Accept headers - - Rack::Handler.pick provides convenience for finding available servers - - Puma added to the list of default servers (preferred over Webrick) - - Various middleware now correctly close body when replacing it - - Rack::Request#params is no longer persistent with only GET params - - Rack::Request#update_param and #delete_param provide persistent operations - - Rack::Request#trusted_proxy? now returns true for local unix sockets - - Rack::Response no longer forces Content-Types - - Rack::Sendfile provides local mapping configuration options - - Rack::Utils#rfc2109 provides old netscape style time output - - Updated HTTP status codes - - Ruby 1.8.6 likely no longer passes tests, and is no longer fully supported - -## [1.4.4, 1.3.9, 1.2.7, 1.1.5] 2013-01-13 - - [SEC] Rack::Auth::AbstractRequest no longer symbolizes arbitrary strings - - Fixed erroneous test case in the 1.3.x series - -## [1.4.3] 2013-01-07 - - Security: Prevent unbounded reads in large multipart boundaries - -## [1.3.8] 2013-01-07 - - Security: Prevent unbounded reads in large multipart boundaries - -## [1.4.2] 2013-01-06 - - Add warnings when users do not provide a session secret - - Fix parsing performance for unquoted filenames - - Updated URI backports - - Fix URI backport version matching, and silence constant warnings - - Correct parameter parsing with empty values - - Correct rackup '-I' flag, to allow multiple uses - - Correct rackup pidfile handling - - Report rackup line numbers correctly - - Fix request loops caused by non-stale nonces with time limits - - Fix reloader on Windows - - Prevent infinite recursions from Response#to_ary - - Various middleware better conforms to the body close specification - - Updated language for the body close specification - - Additional notes regarding ECMA escape compatibility issues - - Fix the parsing of multiple ranges in range headers - - Prevent errors from empty parameter keys - - Added PATCH verb to Rack::Request - - Various documentation updates - - Fix session merge semantics (fixes rack-test) - - Rack::Static :index can now handle multiple directories - - All tests now utilize Rack::Lint (special thanks to Lars Gierth) - - Rack::File cache_control parameter is now deprecated, and removed by 1.5 - - Correct Rack::Directory script name escaping - - Rack::Static supports header rules for sophisticated configurations - - Multipart parsing now works without a Content-Length header - - New logos courtesy of Zachary Scott! - - Rack::BodyProxy now explicitly defines #each, useful for C extensions - - Cookies that are not URI escaped no longer cause exceptions - -## [1.3.7] 2013-01-06 - - Add warnings when users do not provide a session secret - - Fix parsing performance for unquoted filenames - - Updated URI backports - - Fix URI backport version matching, and silence constant warnings - - Correct parameter parsing with empty values - - Correct rackup '-I' flag, to allow multiple uses - - Correct rackup pidfile handling - - Report rackup line numbers correctly - - Fix request loops caused by non-stale nonces with time limits - - Fix reloader on Windows - - Prevent infinite recursions from Response#to_ary - - Various middleware better conforms to the body close specification - - Updated language for the body close specification - - Additional notes regarding ECMA escape compatibility issues - - Fix the parsing of multiple ranges in range headers - -## [1.2.6] 2013-01-06 - - Add warnings when users do not provide a session secret - - Fix parsing performance for unquoted filenames - -## [1.1.4] 2013-01-06 - - Add warnings when users do not provide a session secret - -## [1.4.1] 2012-01-22 - - Alter the keyspace limit calculations to reduce issues with nested params - - Add a workaround for multipart parsing where files contain unescaped "%" - - Added Rack::Response::Helpers#method_not_allowed? (code 405) - - Rack::File now returns 404 for illegal directory traversals - - Rack::File now returns 405 for illegal methods (non HEAD/GET) - - Rack::Cascade now catches 405 by default, as well as 404 - - Cookies missing '--' no longer cause an exception to be raised - - Various style changes and documentation spelling errors - - Rack::BodyProxy always ensures to execute its block - - Additional test coverage around cookies and secrets - - Rack::Session::Cookie can now be supplied either secret or old_secret - - Tests are no longer dependent on set order - - Rack::Static no longer defaults to serving index files - - Rack.release was fixed - -## [1.4.0] 2011-12-28 - - Ruby 1.8.6 support has officially been dropped. Not all tests pass. - - Raise sane error messages for broken config.ru - - Allow combining run and map in a config.ru - - Rack::ContentType will not set Content-Type for responses without a body - - Status code 205 does not send a response body - - Rack::Response::Helpers will not rely on instance variables - - Rack::Utils.build_query no longer outputs '=' for nil query values - - Various mime types added - - Rack::MockRequest now supports HEAD - - Rack::Directory now supports files that contain RFC3986 reserved chars - - Rack::File now only supports GET and HEAD requests - - Rack::Server#start now passes the block to Rack::Handler::#run - - Rack::Static now supports an index option - - Added the Teapot status code - - rackup now defaults to Thin instead of Mongrel (if installed) - - Support added for HTTP_X_FORWARDED_SCHEME - - Numerous bug fixes, including many fixes for new and alternate rubies - -## [1.1.3] 2011-12-28 - - Security fix. http://www.ocert.org/advisories/ocert-2011-003.html - Further information here: http://jruby.org/2011/12/27/jruby-1-6-5-1 - -## [1.3.5] 2011-10-17 - - Fix annoying warnings caused by the backport in 1.3.4 - -## [1.3.4] 2011-10-01 - - Backport security fix from 1.9.3, also fixes some roundtrip issues in URI - - Small documentation update - - Fix an issue where BodyProxy could cause an infinite recursion - - Add some supporting files for travis-ci - -## [1.2.4] 2011-09-16 - - Fix a bug with MRI regex engine to prevent XSS by malformed unicode - -## [1.3.3] 2011-09-16 - - Fix bug with broken query parameters in Rack::ShowExceptions - - Rack::Request#cookies no longer swallows exceptions on broken input - - Prevents XSS attacks enabled by bug in Ruby 1.8's regexp engine - - Rack::ConditionalGet handles broken If-Modified-Since helpers - -## [1.3.2] 2011-07-16 - - Fix for Rails and rack-test, Rack::Utils#escape calls to_s - -## [1.3.1] 2011-07-13 - - Fix 1.9.1 support - - Fix JRuby support - - Properly handle $KCODE in Rack::Utils.escape - - Make method_missing/respond_to behavior consistent for Rack::Lock, - Rack::Auth::Digest::Request and Rack::Multipart::UploadedFile - - Reenable passing rack.session to session middleware - - Rack::CommonLogger handles streaming responses correctly - - Rack::MockResponse calls close on the body object - - Fix a DOS vector from MRI stdlib backport - -## [1.2.3] 2011-05-22 - - Pulled in relevant bug fixes from 1.3 - - Fixed 1.8.6 support - -## [1.3.0] 2011-05-22 - - Various performance optimizations - - Various multipart fixes - - Various multipart refactors - - Infinite loop fix for multipart - - Test coverage for Rack::Server returns - - Allow files with '..', but not path components that are '..' - - rackup accepts handler-specific options on the command line - - Request#params no longer merges POST into GET (but returns the same) - - Use URI.encode_www_form_component instead. Use core methods for escaping. - - Allow multi-line comments in the config file - - Bug L#94 reported by Nikolai Lugovoi, query parameter unescaping. - - Rack::Response now deletes Content-Length when appropriate - - Rack::Deflater now supports streaming - - Improved Rack::Handler loading and searching - - Support for the PATCH verb - - env['rack.session.options'] now contains session options - - Cookies respect renew - - Session middleware uses SecureRandom.hex - -## [1.2.2, 1.1.2] 2011-03-13 - - Security fix in Rack::Auth::Digest::MD5: when authenticator - returned nil, permission was granted on empty password. - -## [1.2.1] 2010-06-15 - - Make CGI handler rewindable - - Rename spec/ to test/ to not conflict with SPEC on lesser - operating systems - -## [1.2.0] 2010-06-13 - - Removed Camping adapter: Camping 2.0 supports Rack as-is - - Removed parsing of quoted values - - Add Request.trace? and Request.options? - - Add mime-type for .webm and .htc - - Fix HTTP_X_FORWARDED_FOR - - Various multipart fixes - - Switch test suite to bacon - -## [1.1.0] 2010-01-03 - - Moved Auth::OpenID to rack-contrib. - - SPEC change that relaxes Lint slightly to allow subclasses of the - required types - - SPEC change to document rack.input binary mode in greater detail - - SPEC define optional rack.logger specification - - File servers support X-Cascade header - - Imported Config middleware - - Imported ETag middleware - - Imported Runtime middleware - - Imported Sendfile middleware - - New Logger and NullLogger middlewares - - Added mime type for .ogv and .manifest. - - Don't squeeze PATH_INFO slashes - - Use Content-Type to determine POST params parsing - - Update Rack::Utils::HTTP_STATUS_CODES hash - - Add status code lookup utility - - Response should call #to_i on the status - - Add Request#user_agent - - Request#host knows about forwarded host - - Return an empty string for Request#host if HTTP_HOST and - SERVER_NAME are both missing - - Allow MockRequest to accept hash params - - Optimizations to HeaderHash - - Refactored rackup into Rack::Server - - Added Utils.build_nested_query to complement Utils.parse_nested_query - - Added Utils::Multipart.build_multipart to complement - Utils::Multipart.parse_multipart - - Extracted set and delete cookie helpers into Utils so they can be - used outside Response - - Extract parse_query and parse_multipart in Request so subclasses - can change their behavior - - Enforce binary encoding in RewindableInput - - Set correct external_encoding for handlers that don't use RewindableInput - -## [1.0.1] 2009-10-18 - - Bump remainder of rack.versions. - - Support the pure Ruby FCGI implementation. - - Fix for form names containing "=": split first then unescape components - - Fixes the handling of the filename parameter with semicolons in names. - - Add anchor to nested params parsing regexp to prevent stack overflows - - Use more compatible gzip write api instead of "<<". - - Make sure that Reloader doesn't break when executed via ruby -e - - Make sure WEBrick respects the :Host option - - Many Ruby 1.9 fixes. - -## [1.0.0] 2009-04-25 - - SPEC change: Rack::VERSION has been pushed to [1,0]. - - SPEC change: header values must be Strings now, split on "\n". - - SPEC change: Content-Length can be missing, in this case chunked transfer - encoding is used. - - SPEC change: rack.input must be rewindable and support reading into - a buffer, wrap with Rack::RewindableInput if it isn't. - - SPEC change: rack.session is now specified. - - SPEC change: Bodies can now additionally respond to #to_path with - a filename to be served. - - NOTE: String bodies break in 1.9, use an Array consisting of a - single String instead. - - New middleware Rack::Lock. - - New middleware Rack::ContentType. - - Rack::Reloader has been rewritten. - - Major update to Rack::Auth::OpenID. - - Support for nested parameter parsing in Rack::Response. - - Support for redirects in Rack::Response. - - HttpOnly cookie support in Rack::Response. - - The Rakefile has been rewritten. - - Many bugfixes and small improvements. - -## [0.9.1] 2009-01-09 - - Fix directory traversal exploits in Rack::File and Rack::Directory. - -## [0.9] 2009-01-06 - - Rack is now managed by the Rack Core Team. - - Rack::Lint is stricter and follows the HTTP RFCs more closely. - - Added ConditionalGet middleware. - - Added ContentLength middleware. - - Added Deflater middleware. - - Added Head middleware. - - Added MethodOverride middleware. - - Rack::Mime now provides popular MIME-types and their extension. - - Mongrel Header now streams. - - Added Thin handler. - - Official support for swiftiplied Mongrel. - - Secure cookies. - - Made HeaderHash case-preserving. - - Many bugfixes and small improvements. - -## [0.4] 2008-08-21 - - New middleware, Rack::Deflater, by Christoffer Sawicki. - - OpenID authentication now needs ruby-openid 2. - - New Memcache sessions, by blink. - - Explicit EventedMongrel handler, by Joshua Peek - - Rack::Reloader is not loaded in rackup development mode. - - rackup can daemonize with -D. - - Many bugfixes, especially for pool sessions, URLMap, thread safety - and tempfile handling. - - Improved tests. - - Rack moved to Git. - -## [0.3] 2008-02-26 - - LiteSpeed handler, by Adrian Madrid. - - SCGI handler, by Jeremy Evans. - - Pool sessions, by blink. - - OpenID authentication, by blink. - - :Port and :File options for opening FastCGI sockets, by blink. - - Last-Modified HTTP header for Rack::File, by blink. - - Rack::Builder#use now accepts blocks, by Corey Jewett. - (See example/protectedlobster.ru) - - HTTP status 201 can contain a Content-Type and a body now. - - Many bugfixes, especially related to Cookie handling. - -## [0.2] 2007-05-16 - - HTTP Basic authentication. - - Cookie Sessions. - - Static file handler. - - Improved Rack::Request. - - Improved Rack::Response. - - Added Rack::ShowStatus, for better default error messages. - - Bug fixes in the Camping adapter. - - Removed Rails adapter, was too alpha. - -## [0.1] 2007-03-03 - -[@ioquatix]: https://github.com/ioquatix "Samuel Williams" -[@jeremyevans]: https://github.com/jeremyevans "Jeremy Evans" -[@amatsuda]: https://github.com/amatsuda "Akira Matsuda" -[@wjordan]: https://github.com/wjordan "Will Jordan" -[@BlakeWilliams]: https://github.com/BlakeWilliams "Blake Williams" -[@davidstosik]: https://github.com/davidstosik "David Stosik" -[@earlopain]: https://github.com/earlopain "Earlopain" -[@wynksaiddestroy]: https://github.com/wynksaiddestroy "Fabian Winkler" -[@matthewd]: https://github.com/matthewd "Matthew Draper" diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/CONTRIBUTING.md b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/CONTRIBUTING.md deleted file mode 100644 index a95263d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/CONTRIBUTING.md +++ /dev/null @@ -1,144 +0,0 @@ -# Contributing to Rack - -Rack is work of [hundreds of -contributors](https://github.com/rack/rack/graphs/contributors). You're -encouraged to submit [pull requests](https://github.com/rack/rack/pulls) and -[propose features and discuss issues](https://github.com/rack/rack/issues). - -## Backports - -Only security patches are ideal for backporting to non-main release versions. If -you're not sure if your bug fix is backportable, you should open a discussion to -discuss it first. - -The [Security Policy] documents which release versions will receive security -backports. - -## Fork the Project - -Fork the [project on GitHub](https://github.com/rack/rack) and check out your -copy. - -``` -git clone https://github.com/(your-github-username)/rack.git -cd rack -git remote add upstream https://github.com/rack/rack.git -``` - -## Create a Topic Branch - -Make sure your fork is up-to-date and create a topic branch for your feature or -bug fix. - -``` -git checkout main -git pull upstream main -git checkout -b my-feature-branch -``` - -## Running All Tests - -Install all dependencies. - -``` -bundle install -``` - -Run all tests. - -``` -rake test -``` - -## Write Tests - -Try to write a test that reproduces the problem you're trying to fix or -describes a feature that you want to build. - -We definitely appreciate pull requests that highlight or reproduce a problem, -even without a fix. - -## Write Code - -Implement your feature or bug fix. - -Make sure that all tests pass: - -``` -bundle exec rake test -``` - -## Write Documentation - -Document any external behavior in the [README](README.md). - -## Update Changelog - -Add a line to [CHANGELOG](CHANGELOG.md). - -## Commit Changes - -Make sure git knows your name and email address: - -``` -git config --global user.name "Your Name" -git config --global user.email "contributor@example.com" -``` - -Writing good commit logs is important. A commit log should describe what changed -and why. - -``` -git add ... -git commit -``` - -## Push - -``` -git push origin my-feature-branch -``` - -## Make a Pull Request - -Go to your fork of rack on GitHub and select your feature branch. Click the -'Pull Request' button and fill out the form. Pull requests are usually -reviewed within a few days. - -## Rebase - -If you've been working on a change for a while, rebase with upstream/main. - -``` -git fetch upstream -git rebase upstream/main -git push origin my-feature-branch -f -``` - -## Make Required Changes - -Amend your previous commit and force push the changes. - -``` -git commit --amend -git push origin my-feature-branch -f -``` - -## Check on Your Pull Request - -Go back to your pull request after a few minutes and see whether it passed -tests with GitHub Actions. Everything should look green, otherwise fix issues and -amend your commit as described above. - -## Be Patient - -It's likely that your change will not be merged and that the nitpicky -maintainers will ask you to do more, or fix seemingly benign problems. Hang in -there! - -## Thank You - -Please do know that we really appreciate and value your time and work. We love -you, really. - -[Security Policy]: SECURITY.md diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/MIT-LICENSE b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/MIT-LICENSE deleted file mode 100644 index fb33b7f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/MIT-LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (C) 2007-2021 Leah Neukirchen - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/README.md b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/README.md deleted file mode 100644 index 35b4132..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/README.md +++ /dev/null @@ -1,376 +0,0 @@ -# ![Rack](contrib/logo.webp) - -Rack provides a minimal, modular, and adaptable interface for developing web -applications in Ruby. By wrapping HTTP requests and responses in the simplest -way possible, it unifies and distills the bridge between web servers, web -frameworks, and web application into a single method call. - -The exact details of this are described in the [Rack Specification], which all -Rack applications should conform to. Browse the [Documentation] for more -information. - -## Version support - -| Version | Support | -|----------|------------------------------------| -| 3.2.x | Bug fixes and security patches. | -| 3.1.x | Security patches only. | -| 3.0.x | End of support. | -| 2.2.x | Security patches only. | -| <= 2.1.x | End of support. | - -**Rack 2.2.x is in security maintenance mode**. Please upgrade to Rack 3.1+ as soon -as possible to ensure you are receiving the latest features and security patches. - -Please see the [Security Policy] for more information. - -## Change log - -See the [Changelog](CHANGELOG.md) for a detailed list of changes in each version of Rack. - -### Rack 3.2 (latest release) - -This version of rack contains bug fixes and security patches. - -### Rack 3.1 - -This version of rack contains bug fixes and security patches. - -### Rack 3.0 - -This version of rack contains significant changes which are detailed in the -[Upgrade Guide](UPGRADE-GUIDE.md). It is recommended to upgrade to Rack 3 as soon -as possible to receive the latest features and security patches. - -### Rack 2.2 - -This version of Rack is receiving security patches only, and effort should be -made to move to Rack 3. - -Starting in Ruby 3.4 the `base64` dependency will no longer be a default gem, -and may cause a warning or error about `base64` being missing. To correct this, -add `base64` as a dependency to your project. - -## Installation - -Add the rack gem to your application bundle, or follow the instructions provided -by a [supported web framework](#supported-web-frameworks): - -```bash -# Install it generally: -$ gem install rack - -# or, add it to your current application gemfile: -$ bundle add rack -``` - -If you need features from `Rack::Session` or `bin/rackup` please add those gems separately. - -```bash -$ gem install rack-session rackup -``` - -## Usage - -Create a file called `config.ru` with the following contents: - -```ruby -run do |env| - [200, {}, ["Hello World"]] -end -``` - -Run this using the rackup gem or another [supported web -server](#supported-web-servers). - -```bash -$ gem install rackup -$ rackup - -# In another shell: -$ curl http://localhost:9292 -Hello World -``` - -## Supported web servers - -Rack is supported by a wide range of servers, including: - -* [Agoo](https://github.com/ohler55/agoo) -* [Falcon](https://github.com/socketry/falcon) -* [Iodine](https://github.com/boazsegev/iodine) -* [NGINX Unit](https://unit.nginx.org/) -* [Phusion Passenger](https://www.phusionpassenger.com/) (which is mod_rack for - Apache and for nginx) -* [Pitchfork](https://github.com/Shopify/pitchfork) -* [Puma](https://puma.io/) -* [Thin](https://github.com/macournoyer/thin) -* [Unicorn](https://yhbt.net/unicorn/) -* [uWSGI](https://uwsgi-docs.readthedocs.io/en/latest/) -* [Lamby](https://lamby.custominktech.com) (for AWS Lambda) - -You will need to consult the server documentation to find out what features and -limitations they may have. In general, any valid Rack app will run the same on -all these servers, without changing anything. - -### Rackup - -Rack provides a separate gem, [rackup](https://github.com/rack/rackup) which is -a generic interface for running a Rack application on supported servers, which -include `WEBRick`, `Puma`, `Falcon` and others. - -## Supported web frameworks - -These frameworks and many others support the [Rack Specification]: - -* [Camping](https://github.com/camping/camping) -* [Hanami](https://hanamirb.org/) -* [Ramaze](https://github.com/ramaze/ramaze) -* [Padrino](https://padrinorb.com/) -* [Roda](https://github.com/jeremyevans/roda) -* [Ruby on Rails](https://rubyonrails.org/) -* [Rum](https://github.com/leahneukirchen/rum) -* [Sinatra](https://sinatrarb.com/) -* [Utopia](https://github.com/socketry/utopia) -* [WABuR](https://github.com/ohler55/wabur) - -## Available middleware shipped with Rack - -Between the server and the framework, Rack can be customized to your -applications needs using middleware. Rack itself ships with the following -middleware: - -* `Rack::CommonLogger` for creating Apache-style logfiles. -* `Rack::ConditionalGet` for returning [Not - Modified](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/304) - responses when the response has not changed. -* `Rack::Config` for modifying the environment before processing the request. -* `Rack::ContentLength` for setting a `content-length` header based on body - size. -* `Rack::ContentType` for setting a default `content-type` header for responses. -* `Rack::Deflater` for compressing responses with gzip. -* `Rack::ETag` for setting `etag` header on bodies that can be buffered. -* `Rack::Events` for providing easy hooks when a request is received and when - the response is sent. -* `Rack::Head` for returning an empty body for HEAD requests. -* `Rack::Lint` for checking conformance to the [Rack Specification]. -* `Rack::Lock` for serializing requests using a mutex. -* `Rack::MethodOverride` for modifying the request method based on a submitted - parameter. -* `Rack::Recursive` for including data from other paths in the application, and - for performing internal redirects. -* `Rack::Reloader` for reloading files if they have been modified. -* `Rack::Runtime` for including a response header with the time taken to process - the request. -* `Rack::Sendfile` for working with web servers that can use optimized file - serving for file system paths. -* `Rack::ShowException` for catching unhandled exceptions and presenting them in - a nice and helpful way with clickable backtrace. -* `Rack::ShowStatus` for using nice error pages for empty client error - responses. -* `Rack::Static` for configurable serving of static files. -* `Rack::TempfileReaper` for removing temporary files creating during a request. - -All these components use the same interface, which is described in detail in the -[Rack Specification]. These optional components can be used in any way you wish. - -### Convenience interfaces - -If you want to develop outside of existing frameworks, implement your own ones, -or develop middleware, Rack provides many helpers to create Rack applications -quickly and without doing the same web stuff all over: - -* `Rack::Request` which also provides query string parsing and multipart - handling. -* `Rack::Response` for convenient generation of HTTP replies and cookie - handling. -* `Rack::MockRequest` and `Rack::MockResponse` for efficient and quick testing - of Rack application without real HTTP round-trips. -* `Rack::Cascade` for trying additional Rack applications if an application - returns a not found or method not supported response. -* `Rack::Directory` for serving files under a given directory, with directory - indexes. -* `Rack::Files` for serving files under a given directory, without directory - indexes. -* `Rack::MediaType` for parsing content-type headers. -* `Rack::Mime` for determining content-type based on file extension. -* `Rack::RewindableInput` for making any IO object rewindable, using a temporary - file buffer. -* `Rack::URLMap` to route to multiple applications inside the same process. - -## Configuration - -Rack exposes several configuration parameters to control various features of the -implementation. - -### `RACK_QUERY_PARSER_BYTESIZE_LIMIT` - -This environment variable sets the default for the maximum query string bytesize -that `Rack::QueryParser` will attempt to parse. Attempts to use a query string -that exceeds this number of bytes will result in a -`Rack::QueryParser::QueryLimitError` exception. If this enviroment variable is -provided, it must be an integer, or `Rack::QueryParser` will raise an exception. - -The default limit can be overridden on a per-`Rack::QueryParser` basis using -the `bytesize_limit` keyword argument when creating the `Rack::QueryParser`. - -### `RACK_QUERY_PARSER_PARAMS_LIMIT` - -This environment variable sets the default for the maximum number of query -parameters that `Rack::QueryParser` will attempt to parse. Attempts to use a -query string with more than this many query parameters will result in a -`Rack::QueryParser::QueryLimitError` exception. If this enviroment variable is -provided, it must be an integer, or `Rack::QueryParser` will raise an exception. - -The default limit can be overridden on a per-`Rack::QueryParser` basis using -the `params_limit` keyword argument when creating the `Rack::QueryParser`. - -This is implemented by counting the number of parameter separators in the -query string, before attempting parsing, so if the same parameter key is -used multiple times in the query, each counts as a separate parameter for -this check. - -### `param_depth_limit` - -```ruby -Rack::Utils.param_depth_limit = 32 # default -``` - -The maximum amount of nesting allowed in parameters. For example, if set to 3, -this query string would be allowed: - -``` -?a[b][c]=d -``` - -but this query string would not be allowed: - -``` -?a[b][c][d]=e -``` - -Limiting the depth prevents a possible stack overflow when parsing parameters. - -### `multipart_file_limit` - -```ruby -Rack::Utils.multipart_file_limit = 128 # default -``` - -The maximum number of parts with a filename a request can contain. Accepting -too many parts can lead to the server running out of file handles. - -The default is 128, which means that a single request can't upload more than 128 -files at once. Set to 0 for no limit. - -Can also be set via the `RACK_MULTIPART_FILE_LIMIT` environment variable. - -(This is also aliased as `multipart_part_limit` and `RACK_MULTIPART_PART_LIMIT` for compatibility) - -### `multipart_total_part_limit` - -The maximum total number of parts a request can contain of any type, including -both file and non-file form fields. - -The default is 4096, which means that a single request can't contain more than -4096 parts. - -Set to 0 for no limit. - -Can also be set via the `RACK_MULTIPART_TOTAL_PART_LIMIT` environment variable. - -## Contributing - -See [CONTRIBUTING.md](CONTRIBUTING.md) for specific details about how to make a -contribution to Rack. - -Please post bugs, suggestions and patches to [GitHub Issues](https://github.com/rack/rack/issues). - -Please check our [Security Policy](https://github.com/rack/rack/security/policy) -for responsible disclosure and security bug reporting process. Due to wide usage -of the library, it is strongly preferred that we manage timing in order to -provide viable patches at the time of disclosure. Your assistance in this matter -is greatly appreciated. - -## See Also - -### `rackup` - -A useful tool for running Rack applications from the command line, including -`Rackup::Server` (previously `Rack::Server`) for scripting servers. - -* https://github.com/rack/rackup - -### `rack-contrib` - -The plethora of useful middleware created the need for a project that collects -fresh Rack middleware. `rack-contrib` includes a variety of add-on components -for Rack and it is easy to contribute new modules. - -* https://github.com/rack/rack-contrib - -### `rack-session` - -Provides convenient session management for Rack. - -* https://github.com/rack/rack-session - -## Thanks - -The Rack Core Team, consisting of - -* Aaron Patterson [tenderlove](https://github.com/tenderlove) -* Samuel Williams [ioquatix](https://github.com/ioquatix) -* Jeremy Evans [jeremyevans](https://github.com/jeremyevans) -* Eileen Uchitelle [eileencodes](https://github.com/eileencodes) -* Matthew Draper [matthewd](https://github.com/matthewd) -* Rafael França [rafaelfranca](https://github.com/rafaelfranca) - -and the Rack Alumni - -* Ryan Tomayko [rtomayko](https://github.com/rtomayko) -* Scytrin dai Kinthra [scytrin](https://github.com/scytrin) -* Leah Neukirchen [leahneukirchen](https://github.com/leahneukirchen) -* James Tucker [raggi](https://github.com/raggi) -* Josh Peek [josh](https://github.com/josh) -* José Valim [josevalim](https://github.com/josevalim) -* Michael Fellinger [manveru](https://github.com/manveru) -* Santiago Pastorino [spastorino](https://github.com/spastorino) -* Konstantin Haase [rkh](https://github.com/rkh) - -would like to thank: - -* Adrian Madrid, for the LiteSpeed handler. -* Christoffer Sawicki, for the first Rails adapter and `Rack::Deflater`. -* Tim Fletcher, for the HTTP authentication code. -* Luc Heinrich for the Cookie sessions, the static file handler and bugfixes. -* Armin Ronacher, for the logo and racktools. -* Alex Beregszaszi, Alexander Kahn, Anil Wadghule, Aredridel, Ben Alpert, Dan - Kubb, Daniel Roethlisberger, Matt Todd, Tom Robinson, Phil Hagelberg, S. Brent - Faulkner, Bosko Milekic, Daniel Rodríguez Troitiño, Genki Takiuchi, Geoffrey - Grosenbach, Julien Sanchez, Kamal Fariz Mahyuddin, Masayoshi Takahashi, - Patrick Aljordm, Mig, Kazuhiro Nishiyama, Jon Bardin, Konstantin Haase, Larry - Siden, Matias Korhonen, Sam Ruby, Simon Chiang, Tim Connor, Timur Batyrshin, - and Zach Brock for bug fixing and other improvements. -* Eric Wong, Hongli Lai, Jeremy Kemper for their continuous support and API - improvements. -* Yehuda Katz and Carl Lerche for refactoring rackup. -* Brian Candler, for `Rack::ContentType`. -* Graham Batty, for improved handler loading. -* Stephen Bannasch, for bug reports and documentation. -* Gary Wright, for proposing a better `Rack::Response` interface. -* Jonathan Buch, for improvements regarding `Rack::Response`. -* Armin Röhrl, for tracking down bugs in the Cookie generator. -* Alexander Kellett for testing the Gem and reviewing the announcement. -* Marcus Rückert, for help with configuring and debugging lighttpd. -* The WSGI team for the well-done and documented work they've done and Rack - builds up on. -* All bug reporters and patch contributors not mentioned above. - -## License - -Rack is released under the [MIT License](MIT-LICENSE). - -[Rack Specification]: https://rack.github.io/rack/main/SPEC_rdoc.html -[Documentation]: https://rack.github.io/rack/ -[Security Policy]: SECURITY.md diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/SPEC.rdoc b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/SPEC.rdoc deleted file mode 100644 index f177643..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/SPEC.rdoc +++ /dev/null @@ -1,258 +0,0 @@ -= Rack Specification - -This specification aims to formalize the Rack protocol. You can (and should) use +Rack::Lint+ to enforce it. When you develop middleware, be sure to test with +Rack::Lint+ to catch possible violations of this specification. - -== The Application - -A Rack application is a Ruby object that responds to +call+. It takes exactly one argument, the +environment+ (representing an HTTP request) and returns a non-frozen +Array+ of exactly three elements: the +status+, the +headers+, and the +body+ (representing an HTTP response). - -== The Request Environment - -Incoming HTTP requests are represented using an environment. The environment must be an unfrozen +Hash+. The Rack application is free to modify the environment, but the modified environment should also comply with this specification. All environment keys must be strings. - -=== CGI Variables - -The environment is required to include these variables, adopted from {The Common Gateway Interface}[https://datatracker.ietf.org/doc/html/rfc3875] (CGI), except when they'd be empty, but see below. - -The CGI keys (named without a period) must have +String+ values and are reserved for the Rack specification. If the values for CGI keys contain non-ASCII characters, they should use ASCII-8BIT encoding. - -The server and application can store their own data in the environment, too. The keys must contain at least one dot, and should be prefixed uniquely. The prefix rack. is reserved for use with the Rack specification and the classes that ship with Rack. - -==== REQUEST_METHOD - -The HTTP request method, such as "GET" or "POST". This cannot ever be an empty string, and so is always required. - -==== SCRIPT_NAME - -The initial portion of the request URL's path that corresponds to the application object, so that the application knows its virtual location. This may be an empty string, if the application corresponds to the root of the server. If non-empty, the string must start with /, but should not end with /. - -In addition, SCRIPT_NAME MUST not be /, but instead be empty, and one of SCRIPT_NAME or PATH_INFO must be set, e.g. PATH_INFO can be / if SCRIPT_NAME is empty. - -==== PATH_INFO - -The remainder of the request URL's "path", designating the virtual "location" of the request's target within the application. This may be an empty string, if the request URL targets the application root and does not have a trailing slash. This value may be percent-encoded when originating from a URL. - -The PATH_INFO, if provided, must be a valid request target or an empty string, as defined by {RFC9110}[https://datatracker.ietf.org/doc/html/rfc9110#target.resource]. -* Only OPTIONS requests may have PATH_INFO set to * (asterisk-form). -* Only CONNECT requests may have PATH_INFO set to an authority (authority-form). Note that in HTTP/2+, the authority-form is not a valid request target. -* CONNECT and OPTIONS requests must not have PATH_INFO set to a URI (absolute-form). -* Otherwise, PATH_INFO must start with a / and must not include a fragment part starting with # (origin-form). - -==== QUERY_STRING - -The portion of the request URL that follows the ?, if any. May be empty, but is always required! - -==== SERVER_NAME - -Must be a valid host, as defined by {RFC3986}[https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2]. - -When combined with SCRIPT_NAME, PATH_INFO, and QUERY_STRING, these variables can be used to reconstruct the original the request URL. Note, however, that HTTP_HOST, if present, should be used in preference to SERVER_NAME for reconstructing the request URL. - -==== SERVER_PROTOCOL - -The HTTP version used for the request. It must match the regular expression HTTP\/\d(\.\d)?. - -==== SERVER_PORT - -The port the server is running on, if the server is running on a non-standard port. It must consist of digits only. - -The standard ports are: -* 80 for HTTP -* 443 for HTTPS - -==== CONTENT_TYPE - -The optional MIME type of the request body, if any. - -==== CONTENT_LENGTH - -The length of the request body, if any. It must consist of digits only. - -==== HTTP_HOST - -An optional HTTP authority, as defined by {RFC9110}[https://datatracker.ietf.org/doc/html/rfc9110#name-host-and-authority]. - -==== HTTP_ Headers - -Unless specified above, the environment can contain any number of additional headers, each starting with HTTP_. The presence or absence of these variables should correspond with the presence or absence of the appropriate HTTP header in the request, and those headers have no specific interpretation or validation by the Rack specification. However, there are many standard HTTP headers that have a specific meaning in the context of a request; see {RFC3875 section 4.1.18}[https://tools.ietf.org/html/rfc3875#section-4.1.18] for more details. - -For compatibility with the CGI specifiction, the environment must not contain the keys HTTP_CONTENT_TYPE or HTTP_CONTENT_LENGTH. Instead, the keys CONTENT_TYPE and CONTENT_LENGTH must be used. - -=== Rack-Specific Variables - -In addition to CGI variables, the Rack environment includes Rack-specific variables. These variables are prefixed with rack. and are reserved for use by the Rack specification, or by the classes that ship with Rack. - -==== rack.url_scheme - -The URL scheme, which must be one of http, https, ws or wss. This can never be an empty string, and so is always required. The scheme should be set according to the last hop. For example, if a client makes a request to a reverse proxy over HTTPS, but the connection between the reverse proxy and the server is over plain HTTP, the reverse proxy should set rack.url_scheme to http. - -==== rack.protocol - -An optional +Array+ of +String+ values, containing the protocols advertised by the client in the upgrade header (HTTP/1) or the :protocol pseudo-header (HTTP/2+). - -==== rack.session - -An optional +Hash+-like interface for storing request session data. The store must implement: -* store(key, value) (aliased as []=) to set a value for a key, -* fetch(key, default = nil) (aliased as []) to retrieve a value for a key, -* delete(key) to delete a key, -* clear to clear the session, -* to_hash (optional) to retrieve the session as a Hash. - -==== rack.logger - -An optional +Logger+-like interface for logging messages. The logger must implement: -* info(message, &block), -* debug(message, &block), -* warn(message, &block), -* error(message, &block), -* fatal(message, &block). - -==== rack.multipart.buffer_size - -An optional +Integer+ hint to the multipart parser as to what chunk size to use for reads and writes. - -==== rack.multipart.tempfile_factory - -An optional object for constructing temporary files for multipart form data. The factory must implement: -* call(filename, content_type) to create a temporary file for a multipart form field. -The factory must return an +IO+-like object that responds to << and optionally rewind. - -==== rack.hijack? - -If present and truthy, indicates that the server supports partial hijacking. See the section below on hijacking for more information. - -==== rack.hijack - -If present, an object responding to +call+ that is used to perform a full hijack. See the section below on hijacking for more information. - -==== rack.early_hints - -If present, an object responding to +call+ that is used to send early hints. See the section below on early hints for more information. - -==== rack.input - -If present, the input stream. See the section below on the input stream for more information. - -==== rack.errors - -The error stream. See the section below on the error stream for more information. - -==== rack.response_finished - -If present, an array of callables that will be run by the server after the response has been processed. The callables are called with environment, status, headers, error arguments and should not raise any exceptions. The callables would typically be called after sending the response to the client, but it could also be called if an error occurs while generating the response or sending the response (in that case, the +error+ argument will be a kind of +Exception+). The callables will be called in reverse order. - -=== The Input Stream - -The input stream is an +IO+-like object which contains the raw HTTP request data. When applicable, its external encoding must be ASCII-8BIT and it must be opened in binary mode. The input stream must respond to +gets+, +each+, and +read+: -* +gets+ must be called without arguments and return a +String+, or +nil+ on EOF (end-of-file). -* +read+ behaves like IO#read. Its signature is read([length, [buffer]]). - * If given, +length+ must be a non-negative Integer (>= 0) or +nil+, and +buffer+ must be a +String+ and may not be +nil+. - * If +length+ is given and not +nil+, then this method reads at most +length+ bytes from the input stream. - * If +length+ is not given or +nil+, then this method reads all data until EOF. - * When EOF is reached, this method returns +nil+ if +length+ is given and not +nil+, or +""+ if +length+ is not given or is +nil+. - * If +buffer+ is given, then the read data will be placed into +buffer+ instead of a newly created +String+. -* +each+ must be called without arguments and only yield +String+ values. -* +close+ can be called on the input stream to indicate that any remaining input is not needed. - -=== The Error Stream - -The error stream must respond to +puts+, +write+ and +flush+: -* +puts+ must be called with a single argument that responds to +to_s+. -* +write+ must be called with a single argument that is a +String+. -* +flush+ must be called without arguments and must be called in order to make the error appear for sure. -* +close+ must never be called on the error stream. - -=== Hijacking - -The hijacking interfaces provides a means for an application to take control of the HTTP connection. There are two distinct hijack interfaces: full hijacking where the application takes over the raw connection, and partial hijacking where the application takes over just the response body stream. In both cases, the application is responsible for closing the hijacked stream. - -Full hijacking only works with HTTP/1. Partial hijacking is functionally equivalent to streaming bodies, and is still optionally supported for backwards compatibility with older Rack versions. - -==== Full Hijack - -Full hijack is used to completely take over an HTTP/1 connection. It occurs before any headers are written and causes the server to ignore any response generated by the application. It is intended to be used when applications need access to the raw HTTP/1 connection. - -If rack.hijack is present in +env+, it must respond to +call+ and return an +IO+ object which can be used to read and write to the underlying connection using HTTP/1 semantics and formatting. - -==== Partial Hijack - -Partial hijack is used for bi-directional streaming of the request and response body. It occurs after the status and headers are written by the server and causes the server to ignore the Body of the response. It is intended to be used when applications need bi-directional streaming. - -If rack.hijack? is present in +env+ and truthy, an application may set the special response header rack.hijack to an object that responds to +call+, accepting a +stream+ argument. - -After the response status and headers have been sent, this hijack callback will be called with a +stream+ argument which follows the same interface as outlined in "Streaming Body". Servers must ignore the +body+ part of the response tuple when the rack.hijack response header is present. Using an empty +Array+ is recommended. - -If rack.hijack? is not present and truthy, the special response header rack.hijack must not be present in the response headers. - -=== Early Hints - -The application or any middleware may call the rack.early_hints with an object which would be valid as the headers of a Rack response. - -If rack.early_hints is present, it must respond to +call+. -If rack.early_hints is called, it must be called with valid Rack response headers. - -== The Response - -Outgoing HTTP responses are generated from the response tuple generated by the application. The response tuple is an +Array+ of three elements, which are: the HTTP status, the headers, and the response body. The Rack application is responsible for ensuring that the response tuple is well-formed and should follow the rules set out in this specification. - -=== The Status - -This is an HTTP status. It must be an Integer greater than or equal to 100. - -=== The Headers - -The headers must be an unfrozen +Hash+. The header keys must be +String+ values. Special headers starting rack. are for communicating with the server, and must not be sent back to the client. - -* The headers must not contain a "status" key. -* Header keys must conform to {RFC7230}[https://tools.ietf.org/html/rfc7230] token specification, i.e. cannot contain non-printable ASCII, DQUOTE or (),/:;<=>?@[\]{}. -* Header keys must not contain uppercase ASCII characters (A-Z). -* Header values must be either a +String+, or an +Array+ of +String+ values, such that each +String+ must not contain NUL (\0), CR (\r), or LF (\n). - -==== The content-type Header - -There must not be a content-type header key when the status is 1xx, 204, or 304. - -==== The content-length Header - -There must not be a content-length header key when the status is 1xx, 204, or 304. - -==== The rack.protocol Header - -If the rack.protocol header is present, it must be a +String+, and must be one of the values from the rack.protocol array from the environment. - -Setting this value informs the server that it should perform a connection upgrade. In HTTP/1, this is done using the +upgrade+ header. In HTTP/2+, this is done by accepting the request. - -=== The Body - -The Body is typically an +Array+ of +String+ values, an enumerable that yields +String+ values, a +Proc+, or an +IO+-like object. - -The Body must respond to +each+ or +call+. It may optionally respond to +to_path+ or +to_ary+. A Body that responds to +each+ is considered to be an Enumerable Body. A Body that responds to +call+ is considered to be a Streaming Body. - -A Body that responds to both +each+ and +call+ must be treated as an Enumerable Body, not a Streaming Body. If it responds to +each+, you must call +each+ and not +call+. If the Body doesn't respond to +each+, then you can assume it responds to +call+. - -The Body must either be consumed or returned. The Body is consumed by optionally calling either +each+ or +call+. Then, if the Body responds to +close+, it must be called to release any resources associated with the generation of the body. In other words, +close+ must always be called at least once; typically after the web server has sent the response to the client, but also in cases where the Rack application makes internal/virtual requests and discards the response. - -After calling +close+, the Body is considered closed and should not be consumed again. If the original Body is replaced by a new Body, the new Body must also consume the original Body by calling +close+ if possible. - -If the Body responds to +to_path+, it must return either +nil+ or a +String+. If a +String+ is returned, it must be a path for the local file system whose contents are identical to that produced by calling +each+; this may be used by the server as an alternative, possibly more efficient way to transport the response. The +to_path+ method does not consume the body. - -==== Enumerable Body - -The Enumerable Body must respond to +each+, which must only be called once, must not be called after being closed, and must only yield +String+ values. - -Middleware must not call +each+ directly on the Body. Instead, middleware can return a new Body that calls +each+ on the original Body, yielding at least once per iteration. - -If the Body responds to +to_ary+, it must return an +Array+ whose contents are identical to that produced by calling +each+. Middleware may call +to_ary+ directly on the Body and return a new Body in its place. In other words, middleware can only process the Body directly if it responds to +to_ary+. If the Body responds to both +to_ary+ and +close+, its implementation of +to_ary+ must call +close+. - -==== Streaming Body - -The Streaming Body must respond to +call+, which must only be called once, must not be called after being closed, and accept a +stream+ argument. - -The +stream+ argument must respond to: +read+, +write+, <<, +flush+, +close+, +close_read+, +close_write+, and +closed?+. The semantics of these +IO+ methods must be a best effort match to those of a normal Ruby +IO+ or +Socket+ object, using standard arguments and raising standard exceptions. Servers may simply pass on real +IO+ objects to the Streaming Body. In some cases (e.g. when using transfer-encoding or HTTP/2+), the server may need to provide a wrapper that implements the required methods, in order to provide the correct semantics. - -== Thanks - -We'd like to thank everyone who has contributed to the Rack project over the years. Your work has made this specification possible. That includes everyone who has contributed code, documentation, bug reports, and feedback. We'd also like to thank the authors of the various web servers, frameworks, and libraries that have implemented the Rack specification. Your work has helped to make the web a better place. - -Some parts of this specification are adapted from {PEP 333 – Python Web Server Gateway Interface v1.0}[https://peps.python.org/pep-0333/]. We'd like to thank everyone involved in that effort. diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack.rb deleted file mode 100644 index 5cc52ba..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack.rb +++ /dev/null @@ -1,64 +0,0 @@ -# frozen_string_literal: true - -# Copyright (C) 2007-2019 Leah Neukirchen -# -# Rack is freely distributable under the terms of an MIT-style license. -# See MIT-LICENSE or https://opensource.org/licenses/MIT. - -# The Rack main module, serving as a namespace for all core Rack -# modules and classes. -# -# All modules meant for use in your application are autoloaded here, -# so it should be enough just to require 'rack' in your code. - -require_relative 'rack/version' -require_relative 'rack/constants' - -module Rack - autoload :BadRequest, "rack/bad_request" - autoload :BodyProxy, "rack/body_proxy" - autoload :Builder, "rack/builder" - autoload :Cascade, "rack/cascade" - autoload :CommonLogger, "rack/common_logger" - autoload :ConditionalGet, "rack/conditional_get" - autoload :Config, "rack/config" - autoload :ContentLength, "rack/content_length" - autoload :ContentType, "rack/content_type" - autoload :Deflater, "rack/deflater" - autoload :Directory, "rack/directory" - autoload :ETag, "rack/etag" - autoload :Events, "rack/events" - autoload :Files, "rack/files" - autoload :ForwardRequest, "rack/recursive" - autoload :Head, "rack/head" - autoload :Headers, "rack/headers" - autoload :Lint, "rack/lint" - autoload :Lock, "rack/lock" - autoload :MediaType, "rack/media_type" - autoload :MethodOverride, "rack/method_override" - autoload :Mime, "rack/mime" - autoload :MockRequest, "rack/mock_request" - autoload :MockResponse, "rack/mock_response" - autoload :Multipart, "rack/multipart" - autoload :NullLogger, "rack/null_logger" - autoload :QueryParser, "rack/query_parser" - autoload :Recursive, "rack/recursive" - autoload :Reloader, "rack/reloader" - autoload :Request, "rack/request" - autoload :Response, "rack/response" - autoload :RewindableInput, "rack/rewindable_input" - autoload :Runtime, "rack/runtime" - autoload :Sendfile, "rack/sendfile" - autoload :ShowExceptions, "rack/show_exceptions" - autoload :ShowStatus, "rack/show_status" - autoload :Static, "rack/static" - autoload :TempfileReaper, "rack/tempfile_reaper" - autoload :URLMap, "rack/urlmap" - autoload :Utils, "rack/utils" - - module Auth - autoload :Basic, "rack/auth/basic" - autoload :AbstractHandler, "rack/auth/abstract/handler" - autoload :AbstractRequest, "rack/auth/abstract/request" - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/abstract/handler.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/abstract/handler.rb deleted file mode 100644 index 4731ee8..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/abstract/handler.rb +++ /dev/null @@ -1,41 +0,0 @@ -# frozen_string_literal: true - -require_relative '../../constants' - -module Rack - module Auth - # Rack::Auth::AbstractHandler implements common authentication functionality. - # - # +realm+ should be set for all handlers. - - class AbstractHandler - - attr_accessor :realm - - def initialize(app, realm = nil, &authenticator) - @app, @realm, @authenticator = app, realm, authenticator - end - - - private - - def unauthorized(www_authenticate = challenge) - return [ 401, - { CONTENT_TYPE => 'text/plain', - CONTENT_LENGTH => '0', - 'www-authenticate' => www_authenticate.to_s }, - [] - ] - end - - def bad_request - return [ 400, - { CONTENT_TYPE => 'text/plain', - CONTENT_LENGTH => '0' }, - [] - ] - end - - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/abstract/request.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/abstract/request.rb deleted file mode 100644 index b5c74b1..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/abstract/request.rb +++ /dev/null @@ -1,51 +0,0 @@ -# frozen_string_literal: true - -# XXX: Remove when removing AbstractRequest#request -require_relative '../../request' - -module Rack - module Auth - class AbstractRequest - - def initialize(env) - @env = env - end - - def request - warn "Rack::Auth::AbstractRequest#request is deprecated and will be removed in a future version of rack.", uplevel: 1 - @request ||= Request.new(@env) - end - - def provided? - !authorization_key.nil? && valid? - end - - def valid? - !@env[authorization_key].nil? - end - - def parts - @parts ||= @env[authorization_key].split(' ', 2) - end - - def scheme - @scheme ||= parts.first&.downcase - end - - def params - @params ||= parts.last - end - - - private - - AUTHORIZATION_KEYS = ['HTTP_AUTHORIZATION', 'X-HTTP_AUTHORIZATION', 'X_HTTP_AUTHORIZATION'] - - def authorization_key - @authorization_key ||= AUTHORIZATION_KEYS.detect { |key| @env.has_key?(key) } - end - - end - - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/basic.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/basic.rb deleted file mode 100644 index 67ffc49..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/auth/basic.rb +++ /dev/null @@ -1,58 +0,0 @@ -# frozen_string_literal: true - -require_relative 'abstract/handler' -require_relative 'abstract/request' - -module Rack - module Auth - # Rack::Auth::Basic implements HTTP Basic Authentication, as per RFC 2617. - # - # Initialize with the Rack application that you want protecting, - # and a block that checks if a username and password pair are valid. - - class Basic < AbstractHandler - - def call(env) - auth = Basic::Request.new(env) - - return unauthorized unless auth.provided? - - return bad_request unless auth.basic? - - if valid?(auth) - env['REMOTE_USER'] = auth.username - - return @app.call(env) - end - - unauthorized - end - - - private - - def challenge - 'Basic realm="%s"' % realm - end - - def valid?(auth) - @authenticator.call(*auth.credentials) - end - - class Request < Auth::AbstractRequest - def basic? - "basic" == scheme && credentials.length == 2 - end - - def credentials - @credentials ||= params.unpack1('m').split(':', 2) - end - - def username - credentials.first - end - end - - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/bad_request.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/bad_request.rb deleted file mode 100644 index 8eaa94e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/bad_request.rb +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -module Rack - # Represents a 400 Bad Request error when input data fails to meet the - # requirements. - module BadRequest - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/body_proxy.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/body_proxy.rb deleted file mode 100644 index 7291579..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/body_proxy.rb +++ /dev/null @@ -1,63 +0,0 @@ -# frozen_string_literal: true - -module Rack - # Proxy for response bodies allowing calling a block when - # the response body is closed (after the response has been fully - # sent to the client). - class BodyProxy - # Set the response body to wrap, and the block to call when the - # response has been fully sent. - def initialize(body, &block) - @body = body - @block = block - @closed = false - end - - # Return whether the wrapped body responds to the method. - def respond_to_missing?(method_name, include_all = false) - case method_name - when :to_str - false - else - super or @body.respond_to?(method_name, include_all) - end - end - - # If not already closed, close the wrapped body and - # then call the block the proxy was initialized with. - def close - return if @closed - @closed = true - begin - @body.close if @body.respond_to?(:close) - ensure - @block.call - end - end - - # Whether the proxy is closed. The proxy starts as not closed, - # and becomes closed on the first call to close. - def closed? - @closed - end - - # Delegate missing methods to the wrapped body. - def method_missing(method_name, *args, &block) - case method_name - when :to_str - super - when :to_ary - begin - @body.__send__(method_name, *args, &block) - ensure - close - end - else - @body.__send__(method_name, *args, &block) - end - end - # :nocov: - ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true) - # :nocov: - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/builder.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/builder.rb deleted file mode 100644 index 29d1249..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/builder.rb +++ /dev/null @@ -1,296 +0,0 @@ -# frozen_string_literal: true - -require_relative 'urlmap' - -module Rack; end -Rack::BUILDER_TOPLEVEL_BINDING = ->(builder){builder.instance_eval{binding}} - -module Rack - # Rack::Builder provides a domain-specific language (DSL) to construct Rack - # applications. It is primarily used to parse +config.ru+ files which - # instantiate several middleware and a final application which are hosted - # by a Rack-compatible web server. - # - # Example: - # - # app = Rack::Builder.new do - # use Rack::CommonLogger - # map "/ok" do - # run lambda { |env| [200, {'content-type' => 'text/plain'}, ['OK']] } - # end - # end - # - # run app - # - # Or - # - # app = Rack::Builder.app do - # use Rack::CommonLogger - # run lambda { |env| [200, {'content-type' => 'text/plain'}, ['OK']] } - # end - # - # run app - # - # +use+ adds middleware to the stack, +run+ dispatches to an application. - # You can use +map+ to construct a Rack::URLMap in a convenient way. - class Builder - - # https://stackoverflow.com/questions/2223882/whats-the-difference-between-utf-8-and-utf-8-without-bom - UTF_8_BOM = '\xef\xbb\xbf' - - # Parse the given config file to get a Rack application. - # - # If the config file ends in +.ru+, it is treated as a - # rackup file and the contents will be treated as if - # specified inside a Rack::Builder block. - # - # If the config file does not end in +.ru+, it is - # required and Rack will use the basename of the file - # to guess which constant will be the Rack application to run. - # - # Examples: - # - # Rack::Builder.parse_file('config.ru') - # # Rack application built using Rack::Builder.new - # - # Rack::Builder.parse_file('app.rb') - # # requires app.rb, which can be anywhere in Ruby's - # # load path. After requiring, assumes App constant - # # is a Rack application - # - # Rack::Builder.parse_file('./my_app.rb') - # # requires ./my_app.rb, which should be in the - # # process's current directory. After requiring, - # # assumes MyApp constant is a Rack application - def self.parse_file(path, **options) - if path.end_with?('.ru') - return self.load_file(path, **options) - else - require path - return Object.const_get(::File.basename(path, '.rb').split('_').map(&:capitalize).join('')) - end - end - - # Load the given file as a rackup file, treating the - # contents as if specified inside a Rack::Builder block. - # - # Ignores content in the file after +__END__+, so that - # use of +__END__+ will not result in a syntax error. - # - # Example config.ru file: - # - # $ cat config.ru - # - # use Rack::ContentLength - # require './app.rb' - # run App - def self.load_file(path, **options) - config = ::File.read(path) - config.slice!(/\A#{UTF_8_BOM}/) if config.encoding == Encoding::UTF_8 - - if config[/^#\\(.*)/] - fail "Parsing options from the first comment line is no longer supported: #{path}" - end - - config.sub!(/^__END__\n.*\Z/m, '') - - return new_from_string(config, path, **options) - end - - # Evaluate the given +builder_script+ string in the context of - # a Rack::Builder block, returning a Rack application. - def self.new_from_string(builder_script, path = "(rackup)", **options) - builder = self.new(**options) - - # We want to build a variant of TOPLEVEL_BINDING with self as a Rack::Builder instance. - # We cannot use instance_eval(String) as that would resolve constants differently. - binding = BUILDER_TOPLEVEL_BINDING.call(builder) - eval(builder_script, binding, path) - - return builder.to_app - end - - # Initialize a new Rack::Builder instance. +default_app+ specifies the - # default application if +run+ is not called later. If a block - # is given, it is evaluated in the context of the instance. - def initialize(default_app = nil, **options, &block) - @use = [] - @map = nil - @run = default_app - @warmup = nil - @freeze_app = false - @options = options - - instance_eval(&block) if block_given? - end - - # Any options provided to the Rack::Builder instance at initialization. - # These options can be server-specific. Some general options are: - # - # * +:isolation+: One of +process+, +thread+ or +fiber+. The execution - # isolation model to use. - attr :options - - # Create a new Rack::Builder instance and return the Rack application - # generated from it. - def self.app(default_app = nil, &block) - self.new(default_app, &block).to_app - end - - # Specifies middleware to use in a stack. - # - # class Middleware - # def initialize(app) - # @app = app - # end - # - # def call(env) - # env["rack.some_header"] = "setting an example" - # @app.call(env) - # end - # end - # - # use Middleware - # run lambda { |env| [200, { "content-type" => "text/plain" }, ["OK"]] } - # - # All requests through to this application will first be processed by the middleware class. - # The +call+ method in this example sets an additional environment key which then can be - # referenced in the application if required. - def use(middleware, *args, &block) - if @map - mapping, @map = @map, nil - @use << proc { |app| generate_map(app, mapping) } - end - @use << proc { |app| middleware.new(app, *args, &block) } - - nil - end - # :nocov: - ruby2_keywords(:use) if respond_to?(:ruby2_keywords, true) - # :nocov: - - # Takes a block or argument that is an object that responds to #call and - # returns a Rack response. - # - # You can use a block: - # - # run do |env| - # [200, { "content-type" => "text/plain" }, ["Hello World!"]] - # end - # - # You can also provide a lambda: - # - # run lambda { |env| [200, { "content-type" => "text/plain" }, ["OK"]] } - # - # You can also provide a class instance: - # - # class Heartbeat - # def call(env) - # [200, { "content-type" => "text/plain" }, ["OK"]] - # end - # end - # - # run Heartbeat.new - # - def run(app = nil, &block) - raise ArgumentError, "Both app and block given!" if app && block_given? - - @run = app || block - - nil - end - - # Takes a lambda or block that is used to warm-up the application. This block is called - # before the Rack application is returned by to_app. - # - # warmup do |app| - # client = Rack::MockRequest.new(app) - # client.get('/') - # end - # - # use SomeMiddleware - # run MyApp - def warmup(prc = nil, &block) - @warmup = prc || block - end - - # Creates a route within the application. Routes under the mapped path will be sent to - # the Rack application specified by run inside the block. Other requests will be sent to the - # default application specified by run outside the block. - # - # class App - # def call(env) - # [200, {'content-type' => 'text/plain'}, ["Hello World"]] - # end - # end - # - # class Heartbeat - # def call(env) - # [200, { "content-type" => "text/plain" }, ["OK"]] - # end - # end - # - # app = Rack::Builder.app do - # map '/heartbeat' do - # run Heartbeat.new - # end - # run App.new - # end - # - # run app - # - # The +use+ method can also be used inside the block to specify middleware to run under a specific path: - # - # app = Rack::Builder.app do - # map '/heartbeat' do - # use Middleware - # run Heartbeat.new - # end - # run App.new - # end - # - # This example includes a piece of middleware which will run before +/heartbeat+ requests hit +Heartbeat+. - # - # Note that providing a +path+ of +/+ will ignore any default application given in a +run+ statement - # outside the block. - def map(path, &block) - @map ||= {} - @map[path] = block - - nil - end - - # Freeze the app (set using run) and all middleware instances when building the application - # in to_app. - def freeze_app - @freeze_app = true - end - - # Return the Rack application generated by this instance. - def to_app - app = @map ? generate_map(@run, @map) : @run - fail "missing run or map statement" unless app - app.freeze if @freeze_app - app = @use.reverse.inject(app) { |a, e| e[a].tap { |x| x.freeze if @freeze_app } } - @warmup.call(app) if @warmup - app - end - - # Call the Rack application generated by this builder instance. Note that - # this rebuilds the Rack application and runs the warmup code (if any) - # every time it is called, so it should not be used if performance is important. - def call(env) - to_app.call(env) - end - - private - - # Generate a URLMap instance by generating new Rack applications for each - # map block in this instance. - def generate_map(default_app, mapping) - mapped = default_app ? { '/' => default_app } : {} - mapping.each { |r, b| mapped[r] = self.class.new(default_app, &b).to_app } - URLMap.new(mapped) - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/cascade.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/cascade.rb deleted file mode 100644 index 9c952fd..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/cascade.rb +++ /dev/null @@ -1,67 +0,0 @@ -# frozen_string_literal: true - -require_relative 'constants' - -module Rack - # Rack::Cascade tries a request on several apps, and returns the - # first response that is not 404 or 405 (or in a list of configured - # status codes). If all applications tried return one of the configured - # status codes, return the last response. - - class Cascade - # An array of applications to try in order. - attr_reader :apps - - # Set the apps to send requests to, and what statuses result in - # cascading. Arguments: - # - # apps: An enumerable of rack applications. - # cascade_for: The statuses to use cascading for. If a response is received - # from an app, the next app is tried. - def initialize(apps, cascade_for = [404, 405]) - @apps = [] - apps.each { |app| add app } - - @cascade_for = {} - [*cascade_for].each { |status| @cascade_for[status] = true } - end - - # Call each app in order. If the responses uses a status that requires - # cascading, try the next app. If all responses require cascading, - # return the response from the last app. - def call(env) - return [404, { CONTENT_TYPE => "text/plain" }, []] if @apps.empty? - result = nil - last_body = nil - - @apps.each do |app| - # The SPEC says that the body must be closed after it has been iterated - # by the server, or if it is replaced by a middleware action. Cascade - # replaces the body each time a cascade happens. It is assumed that nil - # does not respond to close, otherwise the previous application body - # will be closed. The final application body will not be closed, as it - # will be passed to the server as a result. - last_body.close if last_body.respond_to? :close - - result = app.call(env) - return result unless @cascade_for.include?(result[0].to_i) - last_body = result[2] - end - - result - end - - # Append an app to the list of apps to cascade. This app will - # be tried last. - def add(app) - @apps << app - end - - # Whether the given app is one of the apps to cascade to. - def include?(app) - @apps.include?(app) - end - - alias_method :<<, :add - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/common_logger.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/common_logger.rb deleted file mode 100644 index 940b8be..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/common_logger.rb +++ /dev/null @@ -1,89 +0,0 @@ -# frozen_string_literal: true - -require_relative 'constants' -require_relative 'utils' -require_relative 'body_proxy' -require_relative 'request' - -module Rack - # Rack::CommonLogger forwards every request to the given +app+, and - # logs a line in the - # {Apache common log format}[http://httpd.apache.org/docs/1.3/logs.html#common] - # to the configured logger. - class CommonLogger - # Common Log Format: http://httpd.apache.org/docs/1.3/logs.html#common - # - # lilith.local - - [07/Aug/2006 23:58:02 -0400] "GET / HTTP/1.1" 500 - - # - # %{%s - %s [%s] "%s %s%s %s" %d %s\n} % - # - # The actual format is slightly different than the above due to the - # separation of SCRIPT_NAME and PATH_INFO, and because the elapsed - # time in seconds is included at the end. - FORMAT = %{%s - %s [%s] "%s %s%s%s %s" %d %s %0.4f } - - # +logger+ can be any object that supports the +write+ or +<<+ methods, - # which includes the standard library Logger. These methods are called - # with a single string argument, the log message. - # If +logger+ is nil, CommonLogger will fall back env['rack.errors']. - def initialize(app, logger = nil) - @app = app - @logger = logger - end - - # Log all requests in common_log format after a response has been - # returned. Note that if the app raises an exception, the request - # will not be logged, so if exception handling middleware are used, - # they should be loaded after this middleware. Additionally, because - # the logging happens after the request body has been fully sent, any - # exceptions raised during the sending of the response body will - # cause the request not to be logged. - def call(env) - began_at = Utils.clock_time - status, headers, body = response = @app.call(env) - - response[2] = BodyProxy.new(body) { log(env, status, headers, began_at) } - response - end - - private - - # Log the request to the configured logger. - def log(env, status, response_headers, began_at) - request = Rack::Request.new(env) - length = extract_content_length(response_headers) - - msg = sprintf(FORMAT, - request.ip || "-", - request.get_header("REMOTE_USER") || "-", - Time.now.strftime("%d/%b/%Y:%H:%M:%S %z"), - request.request_method, - request.script_name, - request.path_info, - request.query_string.empty? ? "" : "?#{request.query_string}", - request.get_header(SERVER_PROTOCOL), - status.to_s[0..3], - length, - Utils.clock_time - began_at) - - msg.gsub!(/[^[:print:]]/) { |c| sprintf("\\x%x", c.ord) } - msg[-1] = "\n" - - logger = @logger || request.get_header(RACK_ERRORS) - # Standard library logger doesn't support write but it supports << which actually - # calls to write on the log device without formatting - if logger.respond_to?(:write) - logger.write(msg) - else - logger << msg - end - end - - # Attempt to determine the content length for the response to - # include it in the logged data. - def extract_content_length(headers) - value = headers[CONTENT_LENGTH] - !value || value.to_s == '0' ? '-' : value - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/conditional_get.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/conditional_get.rb deleted file mode 100644 index 091a2de..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/conditional_get.rb +++ /dev/null @@ -1,87 +0,0 @@ -# frozen_string_literal: true - -require_relative 'constants' -require_relative 'utils' -require_relative 'body_proxy' - -module Rack - - # Middleware that enables conditional GET using if-none-match and - # if-modified-since. The application should set either or both of the - # last-modified or etag response headers according to RFC 2616. When - # either of the conditions is met, the response body is set to be zero - # length and the response status is set to 304 Not Modified. - # - # Applications that defer response body generation until the body's each - # message is received will avoid response body generation completely when - # a conditional GET matches. - # - # Adapted from Michael Klishin's Merb implementation: - # https://github.com/wycats/merb/blob/master/merb-core/lib/merb-core/rack/middleware/conditional_get.rb - class ConditionalGet - def initialize(app) - @app = app - end - - # Return empty 304 response if the response has not been - # modified since the last request. - def call(env) - case env[REQUEST_METHOD] - when "GET", "HEAD" - status, headers, body = response = @app.call(env) - - if status == 200 && fresh?(env, headers) - response[0] = 304 - headers.delete(CONTENT_TYPE) - headers.delete(CONTENT_LENGTH) - - # We are done with the body: - body.close if body.respond_to?(:close) - response[2] = [] - end - response - else - @app.call(env) - end - end - - private - - # Return whether the response has not been modified since the - # last request. - def fresh?(env, headers) - # if-none-match has priority over if-modified-since per RFC 7232 - if none_match = env['HTTP_IF_NONE_MATCH'] - etag_matches?(none_match, headers) - elsif (modified_since = env['HTTP_IF_MODIFIED_SINCE']) && (modified_since = to_rfc2822(modified_since)) - modified_since?(modified_since, headers) - end - end - - # Whether the etag response header matches the if-none-match request header. - # If so, the request has not been modified. - def etag_matches?(none_match, headers) - headers[ETAG] == none_match - end - - # Whether the last-modified response header matches the if-modified-since - # request header. If so, the request has not been modified. - def modified_since?(modified_since, headers) - last_modified = to_rfc2822(headers['last-modified']) and - modified_since >= last_modified - end - - # Return a Time object for the given string (which should be in RFC2822 - # format), or nil if the string cannot be parsed. - def to_rfc2822(since) - # shortest possible valid date is the obsolete: 1 Nov 97 09:55 A - # anything shorter is invalid, this avoids exceptions for common cases - # most common being the empty string - if since && since.length >= 16 - # NOTE: there is no trivial way to write this in a non exception way - # _rfc2822 returns a hash but is not that usable - Time.rfc2822(since) rescue nil - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/config.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/config.rb deleted file mode 100644 index 41f6f7d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/config.rb +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true - -module Rack - # Rack::Config modifies the environment using the block given during - # initialization. - # - # Example: - # use Rack::Config do |env| - # env['my-key'] = 'some-value' - # end - class Config - def initialize(app, &block) - @app = app - @block = block - end - - def call(env) - @block.call(env) - @app.call(env) - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/constants.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/constants.rb deleted file mode 100644 index 7a349b9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/constants.rb +++ /dev/null @@ -1,68 +0,0 @@ -# frozen_string_literal: true - -module Rack - # Request env keys - HTTP_HOST = 'HTTP_HOST' - HTTP_PORT = 'HTTP_PORT' - HTTPS = 'HTTPS' - PATH_INFO = 'PATH_INFO' - REQUEST_METHOD = 'REQUEST_METHOD' - REQUEST_PATH = 'REQUEST_PATH' - SCRIPT_NAME = 'SCRIPT_NAME' - QUERY_STRING = 'QUERY_STRING' - SERVER_PROTOCOL = 'SERVER_PROTOCOL' - SERVER_NAME = 'SERVER_NAME' - SERVER_PORT = 'SERVER_PORT' - HTTP_COOKIE = 'HTTP_COOKIE' - - # Response Header Keys - CACHE_CONTROL = 'cache-control' - CONTENT_LENGTH = 'content-length' - CONTENT_TYPE = 'content-type' - ETAG = 'etag' - EXPIRES = 'expires' - SET_COOKIE = 'set-cookie' - TRANSFER_ENCODING = 'transfer-encoding' - - # HTTP method verbs - GET = 'GET' - POST = 'POST' - PUT = 'PUT' - PATCH = 'PATCH' - DELETE = 'DELETE' - HEAD = 'HEAD' - OPTIONS = 'OPTIONS' - CONNECT = 'CONNECT' - LINK = 'LINK' - UNLINK = 'UNLINK' - TRACE = 'TRACE' - - # Rack environment variables - RACK_VERSION = 'rack.version' - RACK_TEMPFILES = 'rack.tempfiles' - RACK_EARLY_HINTS = 'rack.early_hints' - RACK_ERRORS = 'rack.errors' - RACK_LOGGER = 'rack.logger' - RACK_INPUT = 'rack.input' - RACK_SESSION = 'rack.session' - RACK_SESSION_OPTIONS = 'rack.session.options' - RACK_SHOWSTATUS_DETAIL = 'rack.showstatus.detail' - RACK_URL_SCHEME = 'rack.url_scheme' - RACK_HIJACK = 'rack.hijack' - RACK_IS_HIJACK = 'rack.hijack?' - RACK_RECURSIVE_INCLUDE = 'rack.recursive.include' - RACK_MULTIPART_BUFFER_SIZE = 'rack.multipart.buffer_size' - RACK_MULTIPART_TEMPFILE_FACTORY = 'rack.multipart.tempfile_factory' - RACK_RESPONSE_FINISHED = 'rack.response_finished' - RACK_PROTOCOL = 'rack.protocol' - RACK_REQUEST_FORM_INPUT = 'rack.request.form_input' - RACK_REQUEST_FORM_HASH = 'rack.request.form_hash' - RACK_REQUEST_FORM_PAIRS = 'rack.request.form_pairs' - RACK_REQUEST_FORM_VARS = 'rack.request.form_vars' - RACK_REQUEST_FORM_ERROR = 'rack.request.form_error' - RACK_REQUEST_COOKIE_HASH = 'rack.request.cookie_hash' - RACK_REQUEST_COOKIE_STRING = 'rack.request.cookie_string' - RACK_REQUEST_QUERY_HASH = 'rack.request.query_hash' - RACK_REQUEST_QUERY_STRING = 'rack.request.query_string' - RACK_METHODOVERRIDE_ORIGINAL_METHOD = 'rack.methodoverride.original_method' -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/content_length.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/content_length.rb deleted file mode 100644 index cbac93a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/content_length.rb +++ /dev/null @@ -1,34 +0,0 @@ -# frozen_string_literal: true - -require_relative 'constants' -require_relative 'utils' - -module Rack - - # Sets the content-length header on responses that do not specify - # a content-length or transfer-encoding header. Note that this - # does not fix responses that have an invalid content-length - # header specified. - class ContentLength - include Rack::Utils - - def initialize(app) - @app = app - end - - def call(env) - status, headers, body = response = @app.call(env) - - if !STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i) && - !headers[CONTENT_LENGTH] && - !headers[TRANSFER_ENCODING] && - body.respond_to?(:to_ary) - - response[2] = body = body.to_ary - headers[CONTENT_LENGTH] = body.sum(&:bytesize).to_s - end - - response - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/content_type.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/content_type.rb deleted file mode 100644 index 19f0782..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/content_type.rb +++ /dev/null @@ -1,33 +0,0 @@ -# frozen_string_literal: true - -require_relative 'constants' -require_relative 'utils' - -module Rack - - # Sets the content-type header on responses which don't have one. - # - # Builder Usage: - # use Rack::ContentType, "text/plain" - # - # When no content type argument is provided, "text/html" is the - # default. - class ContentType - include Rack::Utils - - def initialize(app, content_type = "text/html") - @app = app - @content_type = content_type - end - - def call(env) - status, headers, _ = response = @app.call(env) - - unless STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i) - headers[CONTENT_TYPE] ||= @content_type - end - - response - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/deflater.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/deflater.rb deleted file mode 100644 index cc01c32..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/deflater.rb +++ /dev/null @@ -1,158 +0,0 @@ -# frozen_string_literal: true - -require "zlib" -require "time" # for Time.httpdate - -require_relative 'constants' -require_relative 'utils' -require_relative 'request' -require_relative 'body_proxy' - -module Rack - # This middleware enables content encoding of http responses, - # usually for purposes of compression. - # - # Currently supported encodings: - # - # * gzip - # * identity (no transformation) - # - # This middleware automatically detects when encoding is supported - # and allowed. For example no encoding is made when a cache - # directive of 'no-transform' is present, when the response status - # code is one that doesn't allow an entity body, or when the body - # is empty. - # - # Note that despite the name, Deflater does not support the +deflate+ - # encoding. - class Deflater - # Creates Rack::Deflater middleware. Options: - # - # :if :: a lambda enabling / disabling deflation based on returned boolean value - # (e.g use Rack::Deflater, :if => lambda { |*, body| sum=0; body.each { |i| sum += i.length }; sum > 512 }). - # However, be aware that calling `body.each` inside the block will break cases where `body.each` is not idempotent, - # such as when it is an +IO+ instance. - # :include :: a list of content types that should be compressed. By default, all content types are compressed. - # :sync :: determines if the stream is going to be flushed after every chunk. Flushing after every chunk reduces - # latency for time-sensitive streaming applications, but hurts compression and throughput. - # Defaults to +true+. - def initialize(app, options = {}) - @app = app - @condition = options[:if] - @compressible_types = options[:include] - @sync = options.fetch(:sync, true) - end - - def call(env) - status, headers, body = response = @app.call(env) - - unless should_deflate?(env, status, headers, body) - return response - end - - request = Request.new(env) - - encoding = Utils.select_best_encoding(%w(gzip identity), - request.accept_encoding) - - # Set the Vary HTTP header. - vary = headers["vary"].to_s.split(",").map(&:strip) - unless vary.include?("*") || vary.any?{|v| v.downcase == 'accept-encoding'} - headers["vary"] = vary.push("Accept-Encoding").join(",") - end - - case encoding - when "gzip" - headers['content-encoding'] = "gzip" - headers.delete(CONTENT_LENGTH) - mtime = headers["last-modified"] - mtime = Time.httpdate(mtime).to_i if mtime - response[2] = GzipStream.new(body, mtime, @sync) - response - when "identity" - response - else # when nil - # Only possible encoding values here are 'gzip', 'identity', and nil - message = "An acceptable encoding for the requested resource #{request.fullpath} could not be found." - bp = Rack::BodyProxy.new([message]) { body.close if body.respond_to?(:close) } - [406, { CONTENT_TYPE => "text/plain", CONTENT_LENGTH => message.length.to_s }, bp] - end - end - - # Body class used for gzip encoded responses. - class GzipStream - - BUFFER_LENGTH = 128 * 1_024 - - # Initialize the gzip stream. Arguments: - # body :: Response body to compress with gzip - # mtime :: The modification time of the body, used to set the - # modification time in the gzip header. - # sync :: Whether to flush each gzip chunk as soon as it is ready. - def initialize(body, mtime, sync) - @body = body - @mtime = mtime - @sync = sync - end - - # Yield gzip compressed strings to the given block. - def each(&block) - @writer = block - gzip = ::Zlib::GzipWriter.new(self) - gzip.mtime = @mtime if @mtime - # @body.each is equivalent to @body.gets (slow) - if @body.is_a? ::File # XXX: Should probably be ::IO - while part = @body.read(BUFFER_LENGTH) - gzip.write(part) - gzip.flush if @sync - end - else - @body.each { |part| - # Skip empty strings, as they would result in no output, - # and flushing empty parts would raise Zlib::BufError. - next if part.empty? - gzip.write(part) - gzip.flush if @sync - } - end - ensure - gzip.finish - end - - # Call the block passed to #each with the gzipped data. - def write(data) - @writer.call(data) - end - - # Close the original body if possible. - def close - @body.close if @body.respond_to?(:close) - end - end - - private - - # Whether the body should be compressed. - def should_deflate?(env, status, headers, body) - # Skip compressing empty entity body responses and responses with - # no-transform set. - if Utils::STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i) || - /\bno-transform\b/.match?(headers[CACHE_CONTROL].to_s) || - headers['content-encoding']&.!~(/\bidentity\b/) - return false - end - - # Skip if @compressible_types are given and does not include request's content type - return false if @compressible_types && !(headers.has_key?(CONTENT_TYPE) && @compressible_types.include?(headers[CONTENT_TYPE][/[^;]*/])) - - # Skip if @condition lambda is given and evaluates to false - return false if @condition && !@condition.call(env, status, headers, body) - - # No point in compressing empty body, also handles usage with - # Rack::Sendfile. - return false if headers[CONTENT_LENGTH] == '0' - - true - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/directory.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/directory.rb deleted file mode 100644 index 089623f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/directory.rb +++ /dev/null @@ -1,205 +0,0 @@ -# frozen_string_literal: true - -require 'time' - -require_relative 'constants' -require_relative 'utils' -require_relative 'head' -require_relative 'mime' -require_relative 'files' - -module Rack - # Rack::Directory serves entries below the +root+ given, according to the - # path info of the Rack request. If a directory is found, the file's contents - # will be presented in an html based index. If a file is found, the env will - # be passed to the specified +app+. - # - # If +app+ is not specified, a Rack::Files of the same +root+ will be used. - - class Directory - DIR_FILE = "%s%s%s%s\n" - DIR_PAGE_HEADER = <<-PAGE - - %s - - - -

%s

-
- - - - - - - - PAGE - DIR_PAGE_FOOTER = <<-PAGE -
NameSizeTypeLast Modified
-
- - PAGE - - # Body class for directory entries, showing an index page with links - # to each file. - class DirectoryBody < Struct.new(:root, :path, :files) - # Yield strings for each part of the directory entry - def each - show_path = Utils.escape_html(path.sub(/^#{root}/, '')) - yield(DIR_PAGE_HEADER % [ show_path, show_path ]) - - unless path.chomp('/') == root - yield(DIR_FILE % DIR_FILE_escape(files.call('..'))) - end - - Dir.foreach(path) do |basename| - next if basename.start_with?('.') - next unless f = files.call(basename) - yield(DIR_FILE % DIR_FILE_escape(f)) - end - - yield(DIR_PAGE_FOOTER) - end - - private - - # Escape each element in the array of html strings. - def DIR_FILE_escape(htmls) - htmls.map { |e| Utils.escape_html(e) } - end - end - - # The root of the directory hierarchy. Only requests for files and - # directories inside of the root directory are supported. - attr_reader :root - - # Set the root directory and application for serving files. - def initialize(root, app = nil) - @root = ::File.expand_path(root) - @app = app || Files.new(@root) - @head = Head.new(method(:get)) - end - - def call(env) - # strip body if this is a HEAD call - @head.call env - end - - # Internals of request handling. Similar to call but does - # not remove body for HEAD requests. - def get(env) - script_name = env[SCRIPT_NAME] - path_info = Utils.unescape_path(env[PATH_INFO]) - - if client_error_response = check_bad_request(path_info) || check_forbidden(path_info) - client_error_response - else - path = ::File.join(@root, path_info) - list_path(env, path, path_info, script_name) - end - end - - # Rack response to use for requests with invalid paths, or nil if path is valid. - def check_bad_request(path_info) - return if Utils.valid_path?(path_info) - - body = "Bad Request\n" - [400, { CONTENT_TYPE => "text/plain", - CONTENT_LENGTH => body.bytesize.to_s, - "x-cascade" => "pass" }, [body]] - end - - # Rack response to use for requests with paths outside the root, or nil if path is inside the root. - def check_forbidden(path_info) - return unless path_info.include? ".." - return if ::File.expand_path(::File.join(@root, path_info)).start_with?(@root) - - body = "Forbidden\n" - [403, { CONTENT_TYPE => "text/plain", - CONTENT_LENGTH => body.bytesize.to_s, - "x-cascade" => "pass" }, [body]] - end - - # Rack response to use for directories under the root. - def list_directory(path_info, path, script_name) - url_head = (script_name.split('/') + path_info.split('/')).map do |part| - Utils.escape_path part - end - - # Globbing not safe as path could contain glob metacharacters - body = DirectoryBody.new(@root, path, ->(basename) do - stat = stat(::File.join(path, basename)) - next unless stat - - url = ::File.join(*url_head + [Utils.escape_path(basename)]) - mtime = stat.mtime.httpdate - if stat.directory? - type = 'directory' - size = '-' - url << '/' - if basename == '..' - basename = 'Parent Directory' - else - basename << '/' - end - else - type = Mime.mime_type(::File.extname(basename)) - size = filesize_format(stat.size) - end - - [ url, basename, size, type, mtime ] - end) - - [ 200, { CONTENT_TYPE => 'text/html; charset=utf-8' }, body ] - end - - # File::Stat for the given path, but return nil for missing/bad entries. - def stat(path) - ::File.stat(path) - rescue Errno::ENOENT, Errno::ELOOP - return nil - end - - # Rack response to use for files and directories under the root. - # Unreadable and non-file, non-directory entries will get a 404 response. - def list_path(env, path, path_info, script_name) - if (stat = stat(path)) && stat.readable? - return @app.call(env) if stat.file? - return list_directory(path_info, path, script_name) if stat.directory? - end - - entity_not_found(path_info) - end - - # Rack response to use for unreadable and non-file, non-directory entries. - def entity_not_found(path_info) - body = "Entity not found: #{path_info}\n" - [404, { CONTENT_TYPE => "text/plain", - CONTENT_LENGTH => body.bytesize.to_s, - "x-cascade" => "pass" }, [body]] - end - - # Stolen from Ramaze - FILESIZE_FORMAT = [ - ['%.1fT', 1 << 40], - ['%.1fG', 1 << 30], - ['%.1fM', 1 << 20], - ['%.1fK', 1 << 10], - ] - - # Provide human readable file sizes - def filesize_format(int) - FILESIZE_FORMAT.each do |format, size| - return format % (int.to_f / size) if int >= size - end - - "#{int}B" - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/etag.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/etag.rb deleted file mode 100644 index 1841beb..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/etag.rb +++ /dev/null @@ -1,71 +0,0 @@ -# frozen_string_literal: true - -require 'digest/sha2' - -require_relative 'constants' -require_relative 'utils' - -module Rack - # Automatically sets the etag header on all String bodies. - # - # The etag header is skipped if etag or last-modified headers are sent or if - # a sendfile body (body.responds_to :to_path) is given (since such cases - # should be handled by apache/nginx). - # - # On initialization, you can pass two parameters: a cache-control directive - # used when etag is absent and a directive when it is present. The first - # defaults to nil, while the second defaults to "max-age=0, private, must-revalidate" - class ETag - ETAG_STRING = Rack::ETAG - DEFAULT_CACHE_CONTROL = "max-age=0, private, must-revalidate" - - def initialize(app, no_cache_control = nil, cache_control = DEFAULT_CACHE_CONTROL) - @app = app - @cache_control = cache_control - @no_cache_control = no_cache_control - end - - def call(env) - status, headers, body = response = @app.call(env) - - if etag_status?(status) && body.respond_to?(:to_ary) && !skip_caching?(headers) - body = body.to_ary - digest = digest_body(body) - headers[ETAG_STRING] = %(W/"#{digest}") if digest - - # Body was modified, so we need to re-assign it: - response[2] = body - end - - unless headers[CACHE_CONTROL] - if digest - headers[CACHE_CONTROL] = @cache_control if @cache_control - else - headers[CACHE_CONTROL] = @no_cache_control if @no_cache_control - end - end - - response - end - - private - - def etag_status?(status) - status == 200 || status == 201 - end - - def skip_caching?(headers) - headers.key?(ETAG_STRING) || headers.key?('last-modified') - end - - def digest_body(body) - digest = nil - - body.each do |part| - (digest ||= Digest::SHA256.new) << part unless part.empty? - end - - digest && digest.hexdigest.byteslice(0,32) - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/events.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/events.rb deleted file mode 100644 index c7bb201..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/events.rb +++ /dev/null @@ -1,157 +0,0 @@ -# frozen_string_literal: true - -require_relative 'body_proxy' -require_relative 'request' -require_relative 'response' - -module Rack - ### This middleware provides hooks to certain places in the request / - # response lifecycle. This is so that middleware that don't need to filter - # the response data can safely leave it alone and not have to send messages - # down the traditional "rack stack". - # - # The events are: - # - # * on_start(request, response) - # - # This event is sent at the start of the request, before the next - # middleware in the chain is called. This method is called with a request - # object, and a response object. Right now, the response object is always - # nil, but in the future it may actually be a real response object. - # - # * on_commit(request, response) - # - # The response has been committed. The application has returned, but the - # response has not been sent to the webserver yet. This method is always - # called with a request object and the response object. The response - # object is constructed from the rack triple that the application returned. - # Changes may still be made to the response object at this point. - # - # * on_send(request, response) - # - # The webserver has started iterating over the response body and presumably - # has started sending data over the wire. This method is always called with - # a request object and the response object. The response object is - # constructed from the rack triple that the application returned. Changes - # SHOULD NOT be made to the response object as the webserver has already - # started sending data. Any mutations will likely result in an exception. - # - # * on_finish(request, response) - # - # The webserver has closed the response, and all data has been written to - # the response socket. The request and response object should both be - # read-only at this point. The body MAY NOT be available on the response - # object as it may have been flushed to the socket. - # - # * on_error(request, response, error) - # - # An exception has occurred in the application or an `on_commit` event. - # This method will get the request, the response (if available) and the - # exception that was raised. - # - # ## Order - # - # `on_start` is called on the handlers in the order that they were passed to - # the constructor. `on_commit`, on_send`, `on_finish`, and `on_error` are - # called in the reverse order. `on_finish` handlers are called inside an - # `ensure` block, so they are guaranteed to be called even if something - # raises an exception. If something raises an exception in a `on_finish` - # method, then nothing is guaranteed. - - class Events - module Abstract - def on_start(req, res) - end - - def on_commit(req, res) - end - - def on_send(req, res) - end - - def on_finish(req, res) - end - - def on_error(req, res, e) - end - end - - class EventedBodyProxy < Rack::BodyProxy # :nodoc: - attr_reader :request, :response - - def initialize(body, request, response, handlers, &block) - super(body, &block) - @request = request - @response = response - @handlers = handlers - end - - def each - @handlers.reverse_each { |handler| handler.on_send request, response } - super - end - end - - class BufferedResponse < Rack::Response::Raw # :nodoc: - attr_reader :body - - def initialize(status, headers, body) - super(status, headers) - @body = body - end - - def to_a; [status, headers, body]; end - end - - def initialize(app, handlers) - @app = app - @handlers = handlers - end - - def call(env) - request = make_request env - on_start request, nil - - begin - status, headers, body = @app.call request.env - response = make_response status, headers, body - on_commit request, response - rescue StandardError => e - on_error request, response, e - on_finish request, response - raise - end - - body = EventedBodyProxy.new(body, request, response, @handlers) do - on_finish request, response - end - [response.status, response.headers, body] - end - - private - - def on_error(request, response, e) - @handlers.reverse_each { |handler| handler.on_error request, response, e } - end - - def on_commit(request, response) - @handlers.reverse_each { |handler| handler.on_commit request, response } - end - - def on_start(request, response) - @handlers.each { |handler| handler.on_start request, nil } - end - - def on_finish(request, response) - @handlers.reverse_each { |handler| handler.on_finish request, response } - end - - def make_request(env) - Rack::Request.new env - end - - def make_response(status, headers, body) - BufferedResponse.new status, headers, body - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/files.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/files.rb deleted file mode 100644 index 5b8353f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/files.rb +++ /dev/null @@ -1,216 +0,0 @@ -# frozen_string_literal: true - -require 'time' - -require_relative 'constants' -require_relative 'head' -require_relative 'utils' -require_relative 'request' -require_relative 'mime' - -module Rack - # Rack::Files serves files below the +root+ directory given, according to the - # path info of the Rack request. - # e.g. when Rack::Files.new("/etc") is used, you can access 'passwd' file - # as http://localhost:9292/passwd - # - # Handlers can detect if bodies are a Rack::Files, and use mechanisms - # like sendfile on the +path+. - - class Files - ALLOWED_VERBS = %w[GET HEAD OPTIONS] - ALLOW_HEADER = ALLOWED_VERBS.join(', ') - MULTIPART_BOUNDARY = 'AaB03x' - - attr_reader :root - - def initialize(root, headers = {}, default_mime = 'text/plain') - @root = (::File.expand_path(root) if root) - @headers = headers - @default_mime = default_mime - @head = Rack::Head.new(lambda { |env| get env }) - end - - def call(env) - # HEAD requests drop the response body, including 4xx error messages. - @head.call env - end - - def get(env) - request = Rack::Request.new env - unless ALLOWED_VERBS.include? request.request_method - return fail(405, "Method Not Allowed", { 'allow' => ALLOW_HEADER }) - end - - path_info = Utils.unescape_path request.path_info - return fail(400, "Bad Request") unless Utils.valid_path?(path_info) - - clean_path_info = Utils.clean_path_info(path_info) - path = ::File.join(@root, clean_path_info) - - available = begin - ::File.file?(path) && ::File.readable?(path) - rescue SystemCallError - # Not sure in what conditions this exception can occur, but this - # is a safe way to handle such an error. - # :nocov: - false - # :nocov: - end - - if available - serving(request, path) - else - fail(404, "File not found: #{path_info}") - end - end - - def serving(request, path) - if request.options? - return [200, { 'allow' => ALLOW_HEADER, CONTENT_LENGTH => '0' }, []] - end - last_modified = ::File.mtime(path).httpdate - return [304, {}, []] if request.get_header('HTTP_IF_MODIFIED_SINCE') == last_modified - - headers = { "last-modified" => last_modified } - mime_type = mime_type path, @default_mime - headers[CONTENT_TYPE] = mime_type if mime_type - - # Set custom headers - headers.merge!(@headers) if @headers - - status = 200 - size = filesize path - - ranges = Rack::Utils.get_byte_ranges(request.get_header('HTTP_RANGE'), size) - if ranges.nil? - # No ranges: - ranges = [0..size - 1] - elsif ranges.empty? - # Unsatisfiable. Return error, and file size: - response = fail(416, "Byte range unsatisfiable") - response[1]["content-range"] = "bytes */#{size}" - return response - else - # Partial content - partial_content = true - - if ranges.size == 1 - range = ranges[0] - headers["content-range"] = "bytes #{range.begin}-#{range.end}/#{size}" - else - headers[CONTENT_TYPE] = "multipart/byteranges; boundary=#{MULTIPART_BOUNDARY}" - end - - status = 206 - body = BaseIterator.new(path, ranges, mime_type: mime_type, size: size) - size = body.bytesize - end - - headers[CONTENT_LENGTH] = size.to_s - - if request.head? - body = [] - elsif !partial_content - body = Iterator.new(path, ranges, mime_type: mime_type, size: size) - end - - [status, headers, body] - end - - class BaseIterator - attr_reader :path, :ranges, :options - - def initialize(path, ranges, options) - @path = path - @ranges = ranges - @options = options - end - - def each - ::File.open(path, "rb") do |file| - ranges.each do |range| - yield multipart_heading(range) if multipart? - - each_range_part(file, range) do |part| - yield part - end - end - - yield "\r\n--#{MULTIPART_BOUNDARY}--\r\n" if multipart? - end - end - - def bytesize - size = ranges.inject(0) do |sum, range| - sum += multipart_heading(range).bytesize if multipart? - sum += range.size - end - size += "\r\n--#{MULTIPART_BOUNDARY}--\r\n".bytesize if multipart? - size - end - - def close; end - - private - - def multipart? - ranges.size > 1 - end - - def multipart_heading(range) -<<-EOF -\r ---#{MULTIPART_BOUNDARY}\r -content-type: #{options[:mime_type]}\r -content-range: bytes #{range.begin}-#{range.end}/#{options[:size]}\r -\r -EOF - end - - def each_range_part(file, range) - file.seek(range.begin) - remaining_len = range.end - range.begin + 1 - while remaining_len > 0 - part = file.read([8192, remaining_len].min) - break unless part - remaining_len -= part.length - - yield part - end - end - end - - class Iterator < BaseIterator - alias :to_path :path - end - - private - - def fail(status, body, headers = {}) - body += "\n" - - [ - status, - { - CONTENT_TYPE => "text/plain", - CONTENT_LENGTH => body.size.to_s, - "x-cascade" => "pass" - }.merge!(headers), - [body] - ] - end - - # The MIME type for the contents of the file located at @path - def mime_type(path, default_mime) - Mime.mime_type(::File.extname(path), default_mime) - end - - def filesize(path) - # We check via File::size? whether this file provides size info - # via stat (e.g. /proc files often don't), otherwise we have to - # figure it out by reading the whole file into memory. - ::File.size?(path) || ::File.read(path).bytesize - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/head.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/head.rb deleted file mode 100644 index 261bdf1..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/head.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -require_relative 'constants' -require_relative 'body_proxy' - -module Rack - # Rack::Head returns an empty body for all HEAD requests. It leaves - # all other requests unchanged. - class Head - def initialize(app) - @app = app - end - - def call(env) - _, _, body = response = @app.call(env) - - if env[REQUEST_METHOD] == HEAD - body.close if body.respond_to?(:close) - response[2] = [] - end - - response - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/headers.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/headers.rb deleted file mode 100644 index cedf3a8..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/headers.rb +++ /dev/null @@ -1,238 +0,0 @@ -# frozen_string_literal: true - -module Rack - # Rack::Headers is a Hash subclass that downcases all keys. It's designed - # to be used by rack applications that don't implement the Rack 3 SPEC - # (by using non-lowercase response header keys), automatically handling - # the downcasing of keys. - class Headers < Hash - KNOWN_HEADERS = {} - %w( - Accept-CH - Accept-Patch - Accept-Ranges - Access-Control-Allow-Credentials - Access-Control-Allow-Headers - Access-Control-Allow-Methods - Access-Control-Allow-Origin - Access-Control-Expose-Headers - Access-Control-Max-Age - Age - Allow - Alt-Svc - Cache-Control - Connection - Content-Disposition - Content-Encoding - Content-Language - Content-Length - Content-Location - Content-MD5 - Content-Range - Content-Security-Policy - Content-Security-Policy-Report-Only - Content-Type - Date - Delta-Base - ETag - Expect-CT - Expires - Feature-Policy - IM - Last-Modified - Link - Location - NEL - P3P - Permissions-Policy - Pragma - Preference-Applied - Proxy-Authenticate - Public-Key-Pins - Referrer-Policy - Refresh - Report-To - Retry-After - Server - Set-Cookie - Status - Strict-Transport-Security - Timing-Allow-Origin - Tk - Trailer - Transfer-Encoding - Upgrade - Vary - Via - WWW-Authenticate - Warning - X-Cascade - X-Content-Duration - X-Content-Security-Policy - X-Content-Type-Options - X-Correlation-ID - X-Correlation-Id - X-Download-Options - X-Frame-Options - X-Permitted-Cross-Domain-Policies - X-Powered-By - X-Redirect-By - X-Request-ID - X-Request-Id - X-Runtime - X-UA-Compatible - X-WebKit-CS - X-XSS-Protection - ).each do |str| - downcased = str.downcase.freeze - KNOWN_HEADERS[str] = KNOWN_HEADERS[downcased] = downcased - end - - def self.[](*items) - if items.length % 2 != 0 - if items.length == 1 && items.first.is_a?(Hash) - new.merge!(items.first) - else - raise ArgumentError, "odd number of arguments for Rack::Headers" - end - else - hash = new - loop do - break if items.length == 0 - key = items.shift - value = items.shift - hash[key] = value - end - hash - end - end - - def [](key) - super(downcase_key(key)) - end - - def []=(key, value) - super(KNOWN_HEADERS[key] || key.downcase.freeze, value) - end - alias store []= - - def assoc(key) - super(downcase_key(key)) - end - - def compare_by_identity - raise TypeError, "Rack::Headers cannot compare by identity, use regular Hash" - end - - def delete(key) - super(downcase_key(key)) - end - - def dig(key, *a) - super(downcase_key(key), *a) - end - - def fetch(key, *default, &block) - key = downcase_key(key) - super - end - - def fetch_values(*a) - super(*a.map!{|key| downcase_key(key)}) - end - - def has_key?(key) - super(downcase_key(key)) - end - alias include? has_key? - alias key? has_key? - alias member? has_key? - - def invert - hash = self.class.new - each{|key, value| hash[value] = key} - hash - end - - def merge(hash, &block) - dup.merge!(hash, &block) - end - - def reject(&block) - hash = dup - hash.reject!(&block) - hash - end - - def replace(hash) - clear - update(hash) - end - - def select(&block) - hash = dup - hash.select!(&block) - hash - end - - def to_proc - lambda{|x| self[x]} - end - - def transform_values(&block) - dup.transform_values!(&block) - end - - def update(hash, &block) - hash.each do |key, value| - self[key] = if block_given? && include?(key) - block.call(key, self[key], value) - else - value - end - end - self - end - alias merge! update - - def values_at(*keys) - keys.map{|key| self[key]} - end - - # :nocov: - if RUBY_VERSION >= '2.5' - # :nocov: - def slice(*a) - h = self.class.new - a.each{|k| h[k] = self[k] if has_key?(k)} - h - end - - def transform_keys(&block) - dup.transform_keys!(&block) - end - - def transform_keys! - hash = self.class.new - each do |k, v| - hash[yield k] = v - end - replace(hash) - end - end - - # :nocov: - if RUBY_VERSION >= '3.0' - # :nocov: - def except(*a) - super(*a.map!{|key| downcase_key(key)}) - end - end - - private - - def downcase_key(key) - key.is_a?(String) ? KNOWN_HEADERS[key] || key.downcase : key - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/lint.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/lint.rb deleted file mode 100644 index a96bdea..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/lint.rb +++ /dev/null @@ -1,964 +0,0 @@ -# frozen_string_literal: true - -require 'forwardable' - -require_relative 'constants' -require_relative 'utils' - -module Rack - # Validates your application and the requests and responses according to the Rack spec. See SPEC.rdoc for details. - class Lint - # Represents a failure to meet the Rack specification. - class LintError < RuntimeError; end - - # Invoke the application, validating the request and response according to the Rack spec. - def call(env = nil) - Wrapper.new(@app, env).response - end - - # :stopdoc: - - ALLOWED_SCHEMES = %w(https http wss ws).freeze - - REQUEST_PATH_ORIGIN_FORM = /\A\/[^#]*\z/ - REQUEST_PATH_ABSOLUTE_FORM = /\A#{Utils::URI_PARSER.make_regexp}\z/ - REQUEST_PATH_AUTHORITY_FORM = /\A[^\/:]+:\d+\z/ - REQUEST_PATH_ASTERISK_FORM = '*' - - # Match a host name, according to RFC3986. Copied from `URI::RFC3986_Parser::HOST` because older Ruby versions (< 3.3) don't expose it. - HOST_PATTERN = / - (?\[(?: - (? - (?:\h{1,4}:){6} - (?\h{1,4}:\h{1,4} - | (?(?[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d) - \.\g\.\g\.\g) - ) - | ::(?:\h{1,4}:){5}\g - | \h{1,4}?::(?:\h{1,4}:){4}\g - | (?:(?:\h{1,4}:)?\h{1,4})?::(?:\h{1,4}:){3}\g - | (?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g - | (?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g - | (?:(?:\h{1,4}:){,4}\h{1,4})?::\g - | (?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4} - | (?:(?:\h{1,4}:){,6}\h{1,4})?:: - ) - | (?v\h++\.[!$&-.0-9:;=A-Z_a-z~]++) - )\]) - | \g - | (?(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])*+) - /x.freeze - SERVER_NAME_PATTERN = /\A#{HOST_PATTERN}\z/.freeze - HTTP_HOST_PATTERN = /\A#{HOST_PATTERN}(:\d*+)?\z/.freeze - - private_constant :HOST_PATTERN, :SERVER_NAME_PATTERN, :HTTP_HOST_PATTERN - - # N.B. The empty `##` comments creates paragraphs in the output. A trailing "\" is used to escape the newline character, which combines the comments into a single paragraph. - # - ## = Rack Specification - ## - ## This specification aims to formalize the Rack protocol. You can (and should) use +Rack::Lint+ to enforce it. When you develop middleware, be sure to test with +Rack::Lint+ to catch possible violations of this specification. - ## - ## == The Application - ## - ## A Rack application is a Ruby object that responds to +call+. \ - def initialize(app) - raise LintError, "app must respond to call" unless app.respond_to?(:call) - - @app = app - end - - class Wrapper - def initialize(app, env) - @app = app - @env = env - @response = nil - @head_request = false - - @status = nil - @headers = nil - @body = nil - @consumed = nil - @content_length = nil - @closed = false - @size = 0 - end - - def response - ## It takes exactly one argument, the +environment+ (representing an HTTP request) \ - raise LintError, "No env given" unless @env - check_environment(@env) - - ## and returns a non-frozen +Array+ of exactly three elements: \ - @response = @app.call(@env) - - raise LintError, "response is not an Array, but #{@response.class}" unless @response.kind_of? Array - raise LintError, "response is frozen" if @response.frozen? - raise LintError, "response array has #{@response.size} elements instead of 3" unless @response.size == 3 - - @status, @headers, @body = @response - ## the +status+, \ - check_status(@status) - - ## the +headers+, \ - check_headers(@headers) - - hijack_proc = check_hijack_response(@headers, @env) - if hijack_proc - @headers[RACK_HIJACK] = hijack_proc - end - - ## and the +body+ (representing an HTTP response). - check_content_type_header(@status, @headers) - check_content_length_header(@status, @headers) - check_rack_protocol_header(@status, @headers) - @head_request = @env[REQUEST_METHOD] == HEAD - - @lint = (@env['rack.lint'] ||= []) << self - - if (@env['rack.lint.body_iteration'] ||= 0) > 0 - raise LintError, "Middleware must not call #each directly" - end - - return [@status, @headers, self] - end - - private def assert_required(key) - raise LintError, "env missing required key #{key}" unless @env.include?(key) - - return @env[key] - end - - ## - ## == The Request Environment - ## - ## Incoming HTTP requests are represented using an environment. \ - def check_environment(env) - ## The environment must be an unfrozen +Hash+. The Rack application is free to modify the environment, but the modified environment should also comply with this specification. \ - raise LintError, "env #{env.inspect} is not a Hash, but #{env.class}" unless env.kind_of? Hash - raise LintError, "env should not be frozen, but is" if env.frozen? - - ## All environment keys must be strings. - keys = env.keys - keys.reject!{|key| String === key} - unless keys.empty? - raise LintError, "env contains non-string keys: #{keys.inspect}" - end - - ## - ## === CGI Variables - ## - ## The environment is required to include these variables, adopted from {The Common Gateway Interface}[https://datatracker.ietf.org/doc/html/rfc3875] (CGI), except when they'd be empty, but see below. - - ## - ## The CGI keys (named without a period) must have +String+ values and are reserved for the Rack specification. If the values for CGI keys contain non-ASCII characters, they should use ASCII-8BIT encoding. - env.each do |key, value| - next if key.include?(".") # Skip extensions - - unless value.kind_of? String - raise LintError, "env variable #{key} has non-string value #{value.inspect}" - end - - next if value.encoding == Encoding::ASCII_8BIT - - unless value.b !~ /[\x80-\xff]/n - raise LintError, "env variable #{key} has value containing non-ASCII characters and has non-ASCII-8BIT encoding #{value.inspect} encoding: #{value.encoding}" - end - end - - ## - ## The server and application can store their own data in the environment, too. The keys must contain at least one dot, and should be prefixed uniquely. The prefix rack. is reserved for use with the Rack specification and the classes that ship with Rack. - - ## - ## ==== REQUEST_METHOD - ## - ## The HTTP request method, such as "GET" or "POST". This cannot ever be an empty string, and so is always required. - request_method = assert_required(REQUEST_METHOD) - unless request_method =~ /\A[0-9A-Za-z!\#$%&'*+.^_`|~-]+\z/ - raise LintError, "REQUEST_METHOD unknown: #{request_method.inspect}" - end - - ## - ## ==== SCRIPT_NAME - ## - ## The initial portion of the request URL's path that corresponds to the application object, so that the application knows its virtual location. This may be an empty string, if the application corresponds to the root of the server. If non-empty, the string must start with /, but should not end with /. - if script_name = env[SCRIPT_NAME] - if script_name != "" && script_name !~ /\A\// - raise LintError, "SCRIPT_NAME must start with /" - end - - ## - ## In addition, SCRIPT_NAME MUST not be /, but instead be empty, \ - if script_name == "/" - raise LintError, "SCRIPT_NAME cannot be '/', make it '' and PATH_INFO '/'" - end - end - - ## and one of SCRIPT_NAME or PATH_INFO must be set, e.g. PATH_INFO can be / if SCRIPT_NAME is empty. - path_info = env[PATH_INFO] - if (script_name.nil? || script_name.empty?) && (path_info.nil? || path_info.empty?) - raise LintError, "One of SCRIPT_NAME or PATH_INFO must be set (make PATH_INFO '/' if SCRIPT_NAME is empty)" - end - - ## - ## ==== PATH_INFO - ## - ## The remainder of the request URL's "path", designating the virtual "location" of the request's target within the application. This may be an empty string, if the request URL targets the application root and does not have a trailing slash. This value may be percent-encoded when originating from a URL. - ## - ## The PATH_INFO, if provided, must be a valid request target or an empty string, as defined by {RFC9110}[https://datatracker.ietf.org/doc/html/rfc9110#target.resource]. - case path_info - when REQUEST_PATH_ASTERISK_FORM - ## * Only OPTIONS requests may have PATH_INFO set to * (asterisk-form). - unless request_method == OPTIONS - raise LintError, "Only OPTIONS requests may have PATH_INFO set to '*' (asterisk-form)" - end - when REQUEST_PATH_AUTHORITY_FORM - ## * Only CONNECT requests may have PATH_INFO set to an authority (authority-form). Note that in HTTP/2+, the authority-form is not a valid request target. - unless request_method == CONNECT - raise LintError, "Only CONNECT requests may have PATH_INFO set to an authority (authority-form)" - end - when REQUEST_PATH_ABSOLUTE_FORM - ## * CONNECT and OPTIONS requests must not have PATH_INFO set to a URI (absolute-form). - if request_method == CONNECT || request_method == OPTIONS - raise LintError, "CONNECT and OPTIONS requests must not have PATH_INFO set to a URI (absolute-form)" - end - when REQUEST_PATH_ORIGIN_FORM - ## * Otherwise, PATH_INFO must start with a / and must not include a fragment part starting with # (origin-form). - when "", nil - # Empty string or nil is okay. - else - raise LintError, "PATH_INFO must start with a '/' and must not include a fragment part starting with '#' (origin-form)" - end - - ## - ## ==== QUERY_STRING - ## - ## The portion of the request URL that follows the ?, if any. May be empty, but is always required! - assert_required(QUERY_STRING) - - ## - ## ==== SERVER_NAME - ## - ## Must be a valid host, as defined by {RFC3986}[https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2]. - ## - ## When combined with SCRIPT_NAME, PATH_INFO, and QUERY_STRING, these variables can be used to reconstruct the original the request URL. Note, however, that HTTP_HOST, if present, should be used in preference to SERVER_NAME for reconstructing the request URL. - server_name = assert_required(SERVER_NAME) - unless server_name.match?(SERVER_NAME_PATTERN) - raise LintError, "env[SERVER_NAME] must be a valid host" - end - - ## - ## ==== SERVER_PROTOCOL - ## - ## The HTTP version used for the request. It must match the regular expression HTTP\/\d(\.\d)?. - server_protocol = assert_required(SERVER_PROTOCOL) - unless %r{HTTP/\d(\.\d)?}.match?(server_protocol) - raise LintError, "env[SERVER_PROTOCOL] does not match HTTP/\\d(\\.\\d)?" - end - - ## - ## ==== SERVER_PORT - ## - ## The port the server is running on, if the server is running on a non-standard port. It must consist of digits only. - ## - ## The standard ports are: - ## * 80 for HTTP - ## * 443 for HTTPS - if server_port = env[SERVER_PORT] - unless server_port =~ /\A\d+\z/ - raise LintError, "env[SERVER_PORT] is not an Integer" - end - end - - ## - ## ==== CONTENT_TYPE - ## - ## The optional MIME type of the request body, if any. - # N.B. We do not validate this field as it is considered user-provided data. - - ## - ## ==== CONTENT_LENGTH - ## - ## The length of the request body, if any. It must consist of digits only. - if content_length = env["CONTENT_LENGTH"] - if content_length !~ /\A\d+\z/ - raise LintError, "Invalid CONTENT_LENGTH: #{content_length.inspect}" - end - end - - ## - ## ==== HTTP_HOST - ## - ## An optional HTTP authority, as defined by {RFC9110}[https://datatracker.ietf.org/doc/html/rfc9110#name-host-and-authority]. - if http_host = env[HTTP_HOST] - unless http_host.match?(HTTP_HOST_PATTERN) - raise LintError, "env[HTTP_HOST] must be a valid authority" - end - end - - ## - ## ==== HTTP_ Headers - ## - ## Unless specified above, the environment can contain any number of additional headers, each starting with HTTP_. The presence or absence of these variables should correspond with the presence or absence of the appropriate HTTP header in the request, and those headers have no specific interpretation or validation by the Rack specification. However, there are many standard HTTP headers that have a specific meaning in the context of a request; see {RFC3875 section 4.1.18}[https://tools.ietf.org/html/rfc3875#section-4.1.18] for more details. - ## - ## For compatibility with the CGI specifiction, the environment must not contain the keys HTTP_CONTENT_TYPE or HTTP_CONTENT_LENGTH. Instead, the keys CONTENT_TYPE and CONTENT_LENGTH must be used. - %w[HTTP_CONTENT_TYPE HTTP_CONTENT_LENGTH].each do |header| - if env.include?(header) - raise LintError, "env contains #{header}, must use #{header[5..-1]}" - end - end - - ## - ## === Rack-Specific Variables - ## - ## In addition to CGI variables, the Rack environment includes Rack-specific variables. These variables are prefixed with rack. and are reserved for use by the Rack specification, or by the classes that ship with Rack. - ## - ## ==== rack.url_scheme - ## - ## The URL scheme, which must be one of http, https, ws or wss. This can never be an empty string, and so is always required. The scheme should be set according to the last hop. For example, if a client makes a request to a reverse proxy over HTTPS, but the connection between the reverse proxy and the server is over plain HTTP, the reverse proxy should set rack.url_scheme to http. - rack_url_scheme = assert_required(RACK_URL_SCHEME) - unless ALLOWED_SCHEMES.include?(rack_url_scheme) - raise LintError, "rack.url_scheme unknown: #{rack_url_scheme.inspect}" - end - - ## - ## ==== rack.protocol - ## - ## An optional +Array+ of +String+ values, containing the protocols advertised by the client in the upgrade header (HTTP/1) or the :protocol pseudo-header (HTTP/2+). - if protocols = env[RACK_PROTOCOL] - unless protocols.is_a?(Array) && protocols.all?{|protocol| protocol.is_a?(String)} - raise LintError, "rack.protocol must be an Array of Strings" - end - end - - ## - ## ==== rack.session - ## - ## An optional +Hash+-like interface for storing request session data. The store must implement: - if session = env[RACK_SESSION] - ## * store(key, value) (aliased as []=) to set a value for a key, - unless session.respond_to?(:store) && session.respond_to?(:[]=) - raise LintError, "session #{session.inspect} must respond to store and []=" - end - - ## * fetch(key, default = nil) (aliased as []) to retrieve a value for a key, - unless session.respond_to?(:fetch) && session.respond_to?(:[]) - raise LintError, "session #{session.inspect} must respond to fetch and []" - end - - ## * delete(key) to delete a key, - unless session.respond_to?(:delete) - raise LintError, "session #{session.inspect} must respond to delete" - end - - ## * clear to clear the session, - unless session.respond_to?(:clear) - raise LintError, "session #{session.inspect} must respond to clear" - end - - ## * to_hash (optional) to retrieve the session as a Hash. - unless session.respond_to?(:to_hash) && session.to_hash.kind_of?(Hash) && !session.to_hash.frozen? - raise LintError, "session #{session.inspect} must respond to to_hash and return unfrozen Hash instance" - end - end - - ## - ## ==== rack.logger - ## - ## An optional +Logger+-like interface for logging messages. The logger must implement: - if logger = env[RACK_LOGGER] - ## * info(message, &block), - unless logger.respond_to?(:info) - raise LintError, "logger #{logger.inspect} must respond to info" - end - - ## * debug(message, &block), - unless logger.respond_to?(:debug) - raise LintError, "logger #{logger.inspect} must respond to debug" - end - - ## * warn(message, &block), - unless logger.respond_to?(:warn) - raise LintError, "logger #{logger.inspect} must respond to warn" - end - - ## * error(message, &block), - unless logger.respond_to?(:error) - raise LintError, "logger #{logger.inspect} must respond to error" - end - - ## * fatal(message, &block). - unless logger.respond_to?(:fatal) - raise LintError, "logger #{logger.inspect} must respond to fatal" - end - end - - ## - ## ==== rack.multipart.buffer_size - ## - ## An optional +Integer+ hint to the multipart parser as to what chunk size to use for reads and writes. - if rack_multipart_buffer_size = env[RACK_MULTIPART_BUFFER_SIZE] - unless rack_multipart_buffer_size.is_a?(Integer) && rack_multipart_buffer_size > 0 - raise LintError, "rack.multipart.buffer_size must be an Integer > 0 if specified" - end - end - - ## - ## ==== rack.multipart.tempfile_factory - ## - ## An optional object for constructing temporary files for multipart form data. The factory must implement: - if rack_multipart_tempfile_factory = env[RACK_MULTIPART_TEMPFILE_FACTORY] - ## * call(filename, content_type) to create a temporary file for a multipart form field. - unless rack_multipart_tempfile_factory.respond_to?(:call) - raise LintError, "rack.multipart.tempfile_factory must respond to #call" - end - - ## The factory must return an +IO+-like object that responds to << and optionally rewind. - env[RACK_MULTIPART_TEMPFILE_FACTORY] = lambda do |filename, content_type| - io = rack_multipart_tempfile_factory.call(filename, content_type) - unless io.respond_to?(:<<) - raise LintError, "rack.multipart.tempfile_factory return value must respond to #<<" - end - io - end - end - - ## - ## ==== rack.hijack? - ## - ## If present and truthy, indicates that the server supports partial hijacking. See the section below on hijacking for more information. - # - # N.B. There is no specific validation here. If the user provides a partial hijack response, we will confirm this value is truthy in `check_hijack_response`. - - ## - ## ==== rack.hijack - ## - ## If present, an object responding to +call+ that is used to perform a full hijack. See the section below on hijacking for more information. - check_hijack(env) - - ## - ## ==== rack.early_hints - ## - ## If present, an object responding to +call+ that is used to send early hints. See the section below on early hints for more information. - check_early_hints env - - ## - ## ==== rack.input - ## - ## If present, the input stream. See the section below on the input stream for more information. - if rack_input = env[RACK_INPUT] - check_input_stream(rack_input) - @env[RACK_INPUT] = InputWrapper.new(rack_input) - end - - ## - ## ==== rack.errors - ## - ## The error stream. See the section below on the error stream for more information. - rack_errors = assert_required(RACK_ERRORS) - check_error_stream(rack_errors) - @env[RACK_ERRORS] = ErrorWrapper.new(rack_errors) - - ## - ## ==== rack.response_finished - ## - ## If present, an array of callables that will be run by the server after the response has been processed. The callables are called with environment, status, headers, error arguments and should not raise any exceptions. The callables would typically be called after sending the response to the client, but it could also be called if an error occurs while generating the response or sending the response (in that case, the +error+ argument will be a kind of +Exception+). The callables will be called in reverse order. - if rack_response_finished = env[RACK_RESPONSE_FINISHED] - raise LintError, "rack.response_finished must be an array of callable objects" unless rack_response_finished.is_a?(Array) - rack_response_finished.each do |callable| - raise LintError, "rack.response_finished values must respond to call(env, status, headers, error)" unless callable.respond_to?(:call) - end - end - end - - ## - ## === The Input Stream - ## - ## The input stream is an +IO+-like object which contains the raw HTTP request data. \ - def check_input_stream(input) - ## When applicable, its external encoding must be ASCII-8BIT and it must be opened in binary mode. \ - if input.respond_to?(:external_encoding) && input.external_encoding != Encoding::ASCII_8BIT - raise LintError, "rack.input #{input} does not have ASCII-8BIT as its external encoding" - end - if input.respond_to?(:binmode?) && !input.binmode? - raise LintError, "rack.input #{input} is not opened in binary mode" - end - - ## The input stream must respond to +gets+, +each+, and +read+: - [:gets, :each, :read].each do |method| - unless input.respond_to? method - raise LintError, "rack.input #{input} does not respond to ##{method}" - end - end - end - - class InputWrapper - def initialize(input) - @input = input - end - - ## * +gets+ must be called without arguments and return a +String+, or +nil+ on EOF (end-of-file). - def gets(*args) - raise LintError, "rack.input#gets called with arguments" unless args.size == 0 - - chunk = @input.gets - - unless chunk.nil? or chunk.kind_of? String - raise LintError, "rack.input#gets didn't return a String" - end - - chunk - end - - ## * +read+ behaves like IO#read. Its signature is read([length, [buffer]]). - ## * If given, +length+ must be a non-negative Integer (>= 0) or +nil+, and +buffer+ must be a +String+ and may not be +nil+. - ## * If +length+ is given and not +nil+, then this method reads at most +length+ bytes from the input stream. - ## * If +length+ is not given or +nil+, then this method reads all data until EOF. - ## * When EOF is reached, this method returns +nil+ if +length+ is given and not +nil+, or +""+ if +length+ is not given or is +nil+. - ## * If +buffer+ is given, then the read data will be placed into +buffer+ instead of a newly created +String+. - def read(*args) - unless args.size <= 2 - raise LintError, "rack.input#read called with too many arguments" - end - if args.size >= 1 - unless args.first.kind_of?(Integer) || args.first.nil? - raise LintError, "rack.input#read called with non-integer and non-nil length" - end - unless args.first.nil? || args.first >= 0 - raise LintError, "rack.input#read called with a negative length" - end - end - if args.size >= 2 - unless args[1].kind_of?(String) - raise LintError, "rack.input#read called with non-String buffer" - end - end - - chunk = @input.read(*args) - - unless chunk.nil? or chunk.kind_of? String - raise LintError, "rack.input#read didn't return nil or a String" - end - if args[0].nil? - unless !chunk.nil? - raise LintError, "rack.input#read(nil) returned nil on EOF" - end - end - - chunk - end - - ## * +each+ must be called without arguments and only yield +String+ values. - def each(*args) - raise LintError, "rack.input#each called with arguments" unless args.size == 0 - @input.each do |line| - unless line.kind_of? String - raise LintError, "rack.input#each didn't yield a String" - end - yield line - end - end - - ## * +close+ can be called on the input stream to indicate that any remaining input is not needed. - def close(*args) - @input.close(*args) - end - end - - ## - ## === The Error Stream - ## - def check_error_stream(error) - ## The error stream must respond to +puts+, +write+ and +flush+: - [:puts, :write, :flush].each do |method| - unless error.respond_to? method - raise LintError, "rack.error #{error} does not respond to ##{method}" - end - end - end - - class ErrorWrapper - def initialize(error) - @error = error - end - - ## * +puts+ must be called with a single argument that responds to +to_s+. - def puts(str) - @error.puts str - end - - ## * +write+ must be called with a single argument that is a +String+. - def write(str) - raise LintError, "rack.errors#write not called with a String" unless str.kind_of? String - @error.write str - end - - ## * +flush+ must be called without arguments and must be called in order to make the error appear for sure. - def flush - @error.flush - end - - ## * +close+ must never be called on the error stream. - def close(*args) - raise LintError, "rack.errors#close must not be called" - end - end - - ## - ## === Hijacking - ## - ## The hijacking interfaces provides a means for an application to take control of the HTTP connection. There are two distinct hijack interfaces: full hijacking where the application takes over the raw connection, and partial hijacking where the application takes over just the response body stream. In both cases, the application is responsible for closing the hijacked stream. - ## - ## Full hijacking only works with HTTP/1. Partial hijacking is functionally equivalent to streaming bodies, and is still optionally supported for backwards compatibility with older Rack versions. - ## - ## ==== Full Hijack - ## - ## Full hijack is used to completely take over an HTTP/1 connection. It occurs before any headers are written and causes the server to ignore any response generated by the application. It is intended to be used when applications need access to the raw HTTP/1 connection. - ## - def check_hijack(env) - ## If rack.hijack is present in +env+, it must respond to +call+ \ - if original_hijack = env[RACK_HIJACK] - raise LintError, "rack.hijack must respond to call" unless original_hijack.respond_to?(:call) - - env[RACK_HIJACK] = proc do - io = original_hijack.call - - ## and return an +IO+ object which can be used to read and write to the underlying connection using HTTP/1 semantics and formatting. - raise LintError, "rack.hijack must return an IO instance" unless io.is_a?(IO) - - io - end - end - end - - ## - ## ==== Partial Hijack - ## - ## Partial hijack is used for bi-directional streaming of the request and response body. It occurs after the status and headers are written by the server and causes the server to ignore the Body of the response. It is intended to be used when applications need bi-directional streaming. - ## - def check_hijack_response(headers, env) - ## If rack.hijack? is present in +env+ and truthy, \ - if env[RACK_IS_HIJACK] - ## an application may set the special response header rack.hijack \ - if original_hijack = headers[RACK_HIJACK] - ## to an object that responds to +call+, \ - unless original_hijack.respond_to?(:call) - raise LintError, 'rack.hijack header must respond to #call' - end - ## accepting a +stream+ argument. - return proc do |io| - original_hijack.call StreamWrapper.new(io) - end - end - ## - ## After the response status and headers have been sent, this hijack callback will be called with a +stream+ argument which follows the same interface as outlined in "Streaming Body". Servers must ignore the +body+ part of the response tuple when the rack.hijack response header is present. Using an empty +Array+ is recommended. - else - ## - ## If rack.hijack? is not present and truthy, the special response header rack.hijack must not be present in the response headers. - if headers.key?(RACK_HIJACK) - raise LintError, 'rack.hijack header must not be present if server does not support hijacking' - end - end - - nil - end - - ## - ## === Early Hints - ## - ## The application or any middleware may call the rack.early_hints with an object which would be valid as the headers of a Rack response. - def check_early_hints(env) - if env[RACK_EARLY_HINTS] - ## - ## If rack.early_hints is present, it must respond to +call+. - unless env[RACK_EARLY_HINTS].respond_to?(:call) - raise LintError, "rack.early_hints must respond to call" - end - - original_callback = env[RACK_EARLY_HINTS] - env[RACK_EARLY_HINTS] = lambda do |headers| - ## If rack.early_hints is called, it must be called with valid Rack response headers. - check_headers(headers) - original_callback.call(headers) - end - end - end - - ## - ## == The Response - ## - ## Outgoing HTTP responses are generated from the response tuple generated by the application. The response tuple is an +Array+ of three elements, which are: the HTTP status, the headers, and the response body. The Rack application is responsible for ensuring that the response tuple is well-formed and should follow the rules set out in this specification. - ## - ## === The Status - ## - def check_status(status) - ## This is an HTTP status. It must be an Integer greater than or equal to 100. - unless status.is_a?(Integer) && status >= 100 - raise LintError, "Status must be an Integer >=100" - end - end - - ## - ## === The Headers - ## - def check_headers(headers) - ## The headers must be an unfrozen +Hash+. \ - unless headers.kind_of?(Hash) - raise LintError, "headers object should be a hash, but isn't (got #{headers.class} as headers)" - end - - if headers.frozen? - raise LintError, "headers object should not be frozen, but is" - end - - headers.each do |key, value| - ## The header keys must be +String+ values. \ - unless key.kind_of? String - raise LintError, "header key must be a string, was #{key.class}" - end - - ## Special headers starting rack. are for communicating with the server, and must not be sent back to the client. - next if key.start_with?("rack.") - - ## - ## * The headers must not contain a "status" key. - raise LintError, "headers must not contain status" if key == "status" - ## * Header keys must conform to {RFC7230}[https://tools.ietf.org/html/rfc7230] token specification, i.e. cannot contain non-printable ASCII, DQUOTE or (),/:;<=>?@[\]{}. - raise LintError, "invalid header name: #{key}" if key =~ /[\(\),\/:;<=>\?@\[\\\]{}[:cntrl:]]/ - ## * Header keys must not contain uppercase ASCII characters (A-Z). - raise LintError, "uppercase character in header name: #{key}" if key =~ /[A-Z]/ - - ## * Header values must be either a +String+, \ - if value.kind_of?(String) - check_header_value(key, value) - elsif value.kind_of?(Array) - ## or an +Array+ of +String+ values, \ - value.each{|value| check_header_value(key, value)} - else - raise LintError, "a header value must be a String or Array of Strings, but the value of '#{key}' is a #{value.class}" - end - end - end - - def check_header_value(key, value) - ## such that each +String+ must not contain NUL (\0), CR (\r), or LF (\n). - if value.match?(/[\x00\x0A\x0D]/) - raise LintError, "invalid header value #{key}: #{value.inspect}" - end - end - - ## - ## ==== The content-type Header - ## - def check_content_type_header(status, headers) - headers.each do |key, value| - ## There must not be a content-type header key when the status is 1xx, 204, or 304. - if key == "content-type" - if Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.key? status.to_i - raise LintError, "content-type header found in #{status} response, not allowed" - end - return - end - end - end - - ## - ## ==== The content-length Header - ## - def check_content_length_header(status, headers) - headers.each do |key, value| - if key == 'content-length' - ## There must not be a content-length header key when the status is 1xx, 204, or 304. - if Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.key? status.to_i - raise LintError, "content-length header found in #{status} response, not allowed" - end - @content_length = value - end - end - end - - def verify_content_length(size) - if @head_request - unless size == 0 - raise LintError, "Response body was given for HEAD request, but should be empty" - end - elsif @content_length - unless @content_length == size.to_s - raise LintError, "content-length header was #{@content_length}, but should be #{size}" - end - end - end - - ## - ## ==== The rack.protocol Header - ## - def check_rack_protocol_header(status, headers) - ## If the rack.protocol header is present, it must be a +String+, and must be one of the values from the rack.protocol array from the environment. - protocol = headers['rack.protocol'] - - if protocol - request_protocols = @env['rack.protocol'] - - if request_protocols.nil? - raise LintError, "rack.protocol header is #{protocol.inspect}, but rack.protocol was not set in request!" - elsif !request_protocols.include?(protocol) - raise LintError, "rack.protocol header is #{protocol.inspect}, but should be one of #{request_protocols.inspect} from the request!" - end - end - end - ## - ## Setting this value informs the server that it should perform a connection upgrade. In HTTP/1, this is done using the +upgrade+ header. In HTTP/2+, this is done by accepting the request. - ## - ## === The Body - ## - ## The Body is typically an +Array+ of +String+ values, an enumerable that yields +String+ values, a +Proc+, or an +IO+-like object. - ## - ## The Body must respond to +each+ or +call+. It may optionally respond to +to_path+ or +to_ary+. A Body that responds to +each+ is considered to be an Enumerable Body. A Body that responds to +call+ is considered to be a Streaming Body. - ## - ## A Body that responds to both +each+ and +call+ must be treated as an Enumerable Body, not a Streaming Body. If it responds to +each+, you must call +each+ and not +call+. If the Body doesn't respond to +each+, then you can assume it responds to +call+. - ## - ## The Body must either be consumed or returned. The Body is consumed by optionally calling either +each+ or +call+. Then, if the Body responds to +close+, it must be called to release any resources associated with the generation of the body. In other words, +close+ must always be called at least once; typically after the web server has sent the response to the client, but also in cases where the Rack application makes internal/virtual requests and discards the response. - def close - ## - ## After calling +close+, the Body is considered closed and should not be consumed again. \ - @closed = true - - ## If the original Body is replaced by a new Body, the new Body must also consume the original Body by calling +close+ if possible. - @body.close if @body.respond_to?(:close) - - index = @lint.index(self) - unless @env['rack.lint'][0..index].all? {|lint| lint.instance_variable_get(:@closed)} - raise LintError, "Body has not been closed" - end - end - - def verify_to_path - ## - ## If the Body responds to +to_path+, it must return either +nil+ or a +String+. If a +String+ is returned, it must be a path for the local file system whose contents are identical to that produced by calling +each+; this may be used by the server as an alternative, possibly more efficient way to transport the response. The +to_path+ method does not consume the body. - if @body.respond_to?(:to_path) - optional_path = @body.to_path - - if optional_path != nil - unless optional_path.is_a?(String) && ::File.exist?(optional_path) - raise LintError, "body.to_path must be nil or a path to an existing file" - end - end - end - end - - ## - ## ==== Enumerable Body - ## - def each - ## The Enumerable Body must respond to +each+, \ - raise LintError, "Enumerable Body must respond to each" unless @body.respond_to?(:each) - - ## which must only be called once, \ - raise LintError, "Response body must only be called once (#{@consumed})" unless @consumed.nil? - - ## must not be called after being closed, \ - raise LintError, "Response body is already closed" if @closed - - @consumed = :each - - @body.each do |chunk| - ## and must only yield +String+ values. - unless chunk.kind_of? String - raise LintError, "Body yielded non-string value #{chunk.inspect}" - end - - ## - ## Middleware must not call +each+ directly on the Body. Instead, middleware can return a new Body that calls +each+ on the original Body, yielding at least once per iteration. - if @lint[0] == self - @env['rack.lint.body_iteration'] += 1 - else - if (@env['rack.lint.body_iteration'] -= 1) > 0 - raise LintError, "New body must yield at least once per iteration of old body" - end - end - - @size += chunk.bytesize - yield chunk - end - - verify_content_length(@size) - - verify_to_path - end - - BODY_METHODS = {to_ary: true, each: true, call: true, to_path: true} - - def to_path - @body.to_path - end - - def respond_to?(name, *) - if BODY_METHODS.key?(name) - @body.respond_to?(name) - else - super - end - end - - ## - ## If the Body responds to +to_ary+, it must return an +Array+ whose contents are identical to that produced by calling +each+. Middleware may call +to_ary+ directly on the Body and return a new Body in its place. In other words, middleware can only process the Body directly if it responds to +to_ary+. If the Body responds to both +to_ary+ and +close+, its implementation of +to_ary+ must call +close+. - def to_ary - @body.to_ary.tap do |content| - unless content == @body.enum_for.to_a - raise LintError, "#to_ary not identical to contents produced by calling #each" - end - end - ensure - close - end - - ## - ## ==== Streaming Body - ## - def call(stream) - ## The Streaming Body must respond to +call+, \ - raise LintError, "Streaming Body must respond to call" unless @body.respond_to?(:call) - - ## which must only be called once, \ - raise LintError, "Response body must only be called once (#{@consumed})" unless @consumed.nil? - - ## must not be called after being closed, \ - raise LintError, "Response body is already closed" if @closed - - @consumed = :call - - ## and accept a +stream+ argument. - ## - ## The +stream+ argument must respond to: +read+, +write+, <<, +flush+, +close+, +close_read+, +close_write+, and +closed?+. \ - @body.call(StreamWrapper.new(stream)) - end - - class StreamWrapper - extend Forwardable - - ## The semantics of these +IO+ methods must be a best effort match to those of a normal Ruby +IO+ or +Socket+ object, using standard arguments and raising standard exceptions. Servers may simply pass on real +IO+ objects to the Streaming Body. In some cases (e.g. when using transfer-encoding or HTTP/2+), the server may need to provide a wrapper that implements the required methods, in order to provide the correct semantics. - REQUIRED_METHODS = [ - :read, :write, :<<, :flush, :close, - :close_read, :close_write, :closed? - ] - - def_delegators :@stream, *REQUIRED_METHODS - - def initialize(stream) - @stream = stream - - REQUIRED_METHODS.each do |method_name| - raise LintError, "Stream must respond to #{method_name}" unless stream.respond_to?(method_name) - end - end - end - end - end -end - -## -## == Thanks -## -## We'd like to thank everyone who has contributed to the Rack project over the years. Your work has made this specification possible. That includes everyone who has contributed code, documentation, bug reports, and feedback. We'd also like to thank the authors of the various web servers, frameworks, and libraries that have implemented the Rack specification. Your work has helped to make the web a better place. -## -## Some parts of this specification are adapted from {PEP 333 – Python Web Server Gateway Interface v1.0}[https://peps.python.org/pep-0333/]. We'd like to thank everyone involved in that effort. diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/lock.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/lock.rb deleted file mode 100644 index 342123a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/lock.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -require_relative 'body_proxy' - -module Rack - # Rack::Lock locks every request inside a mutex, so that every request - # will effectively be executed synchronously. - class Lock - def initialize(app, mutex = Mutex.new) - @app, @mutex = app, mutex - end - - def call(env) - @mutex.lock - begin - response = @app.call(env) - returned = response << BodyProxy.new(response.pop) { unlock } - ensure - unlock unless returned - end - end - - private - - def unlock - @mutex.unlock - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/media_type.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/media_type.rb deleted file mode 100644 index 29ad117..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/media_type.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -module Rack - # Rack::MediaType parse media type and parameters out of content_type string - - class MediaType - SPLIT_PATTERN = /[;,]/ - - class << self - # The media type (type/subtype) portion of the CONTENT_TYPE header - # without any media type parameters. e.g., when CONTENT_TYPE is - # "text/plain;charset=utf-8", the media-type is "text/plain". - # - # For more information on the use of media types in HTTP, see: - # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7 - def type(content_type) - return nil unless content_type && !content_type.empty? - type = content_type.split(SPLIT_PATTERN, 2).first - type.rstrip! - type.downcase! - type - end - - # The media type parameters provided in CONTENT_TYPE as a Hash, or - # an empty Hash if no CONTENT_TYPE or media-type parameters were - # provided. e.g., when the CONTENT_TYPE is "text/plain;charset=utf-8", - # this method responds with the following Hash: - # { 'charset' => 'utf-8' } - # - # This will pass back parameters with empty strings in the hash if they - # lack a value (e.g., "text/plain;charset=" will return { 'charset' => '' }, - # and "text/plain;charset" will return { 'charset' => '' }, similarly to - # the query params parser (barring the latter case, which returns nil instead)). - def params(content_type) - return {} if content_type.nil? || content_type.empty? - - content_type.split(SPLIT_PATTERN)[1..-1].each_with_object({}) do |s, hsh| - s.strip! - k, v = s.split('=', 2) - k.downcase! - hsh[k] = strip_doublequotes(v) - end - end - - private - - def strip_doublequotes(str) - (str && str.start_with?('"') && str.end_with?('"')) ? str[1..-2] : str || '' - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/method_override.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/method_override.rb deleted file mode 100644 index 6125b19..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/method_override.rb +++ /dev/null @@ -1,56 +0,0 @@ -# frozen_string_literal: true - -require_relative 'constants' -require_relative 'request' -require_relative 'utils' - -module Rack - class MethodOverride - HTTP_METHODS = %w[GET HEAD PUT POST DELETE OPTIONS PATCH LINK UNLINK] - - METHOD_OVERRIDE_PARAM_KEY = "_method" - HTTP_METHOD_OVERRIDE_HEADER = "HTTP_X_HTTP_METHOD_OVERRIDE" - ALLOWED_METHODS = %w[POST] - - def initialize(app) - @app = app - end - - def call(env) - if allowed_methods.include?(env[REQUEST_METHOD]) - method = method_override(env) - if HTTP_METHODS.include?(method) - env[RACK_METHODOVERRIDE_ORIGINAL_METHOD] = env[REQUEST_METHOD] - env[REQUEST_METHOD] = method - end - end - - @app.call(env) - end - - def method_override(env) - req = Request.new(env) - method = method_override_param(req) || - env[HTTP_METHOD_OVERRIDE_HEADER] - begin - method.to_s.upcase - rescue ArgumentError - env[RACK_ERRORS].puts "Invalid string for method" - end - end - - private - - def allowed_methods - ALLOWED_METHODS - end - - def method_override_param(req) - req.POST[METHOD_OVERRIDE_PARAM_KEY] if req.form_data? || req.parseable_data? - rescue Utils::InvalidParameterError, Utils::ParameterTypeError, QueryParser::ParamsTooDeepError - req.get_header(RACK_ERRORS).puts "Invalid or incomplete POST params" - rescue EOFError - req.get_header(RACK_ERRORS).puts "Bad request content body" - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mime.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mime.rb deleted file mode 100644 index 0272968..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mime.rb +++ /dev/null @@ -1,694 +0,0 @@ -# frozen_string_literal: true - -module Rack - module Mime - # Returns String with mime type if found, otherwise use +fallback+. - # +ext+ should be filename extension in the '.ext' format that - # File.extname(file) returns. - # +fallback+ may be any object - # - # Also see the documentation for MIME_TYPES - # - # Usage: - # Rack::Mime.mime_type('.foo') - # - # This is a shortcut for: - # Rack::Mime::MIME_TYPES.fetch('https://github.com/.foo', 'application/octet-stream') - - def mime_type(ext, fallback = 'application/octet-stream') - MIME_TYPES.fetch(ext.to_s.downcase, fallback) - end - module_function :mime_type - - # Returns true if the given value is a mime match for the given mime match - # specification, false otherwise. - # - # Rack::Mime.match?('text/html', 'text/*') => true - # Rack::Mime.match?('text/plain', '*') => true - # Rack::Mime.match?('text/html', 'application/json') => false - - def match?(value, matcher) - v1, v2 = value.split('/', 2) - m1, m2 = matcher.split('/', 2) - - (m1 == '*' || v1 == m1) && (m2.nil? || m2 == '*' || m2 == v2) - end - module_function :match? - - # List of most common mime-types, selected various sources - # according to their usefulness in a webserving scope for Ruby - # users. - # - # To amend this list with your local mime.types list you can use: - # - # require 'webrick/httputils' - # list = WEBrick::HTTPUtils.load_mime_types('/etc/mime.types') - # Rack::Mime::MIME_TYPES.merge!(list) - # - # N.B. On Ubuntu the mime.types file does not include the leading period, so - # users may need to modify the data before merging into the hash. - - MIME_TYPES = { - ".123" => "application/vnd.lotus-1-2-3", - ".3dml" => "text/vnd.in3d.3dml", - ".3g2" => "video/3gpp2", - ".3gp" => "video/3gpp", - ".a" => "application/octet-stream", - ".acc" => "application/vnd.americandynamics.acc", - ".ace" => "application/x-ace-compressed", - ".acu" => "application/vnd.acucobol", - ".aep" => "application/vnd.audiograph", - ".afp" => "application/vnd.ibm.modcap", - ".ai" => "application/postscript", - ".aif" => "audio/x-aiff", - ".aiff" => "audio/x-aiff", - ".ami" => "application/vnd.amiga.ami", - ".apng" => "image/apng", - ".appcache" => "text/cache-manifest", - ".apr" => "application/vnd.lotus-approach", - ".asc" => "application/pgp-signature", - ".asf" => "video/x-ms-asf", - ".asm" => "text/x-asm", - ".aso" => "application/vnd.accpac.simply.aso", - ".asx" => "video/x-ms-asf", - ".atc" => "application/vnd.acucorp", - ".atom" => "application/atom+xml", - ".atomcat" => "application/atomcat+xml", - ".atomsvc" => "application/atomsvc+xml", - ".atx" => "application/vnd.antix.game-component", - ".au" => "audio/basic", - ".avi" => "video/x-msvideo", - ".avif" => "image/avif", - ".bat" => "application/x-msdownload", - ".bcpio" => "application/x-bcpio", - ".bdm" => "application/vnd.syncml.dm+wbxml", - ".bh2" => "application/vnd.fujitsu.oasysprs", - ".bin" => "application/octet-stream", - ".bmi" => "application/vnd.bmi", - ".bmp" => "image/bmp", - ".box" => "application/vnd.previewsystems.box", - ".btif" => "image/prs.btif", - ".bz" => "application/x-bzip", - ".bz2" => "application/x-bzip2", - ".c" => "text/x-c", - ".c4g" => "application/vnd.clonk.c4group", - ".cab" => "application/vnd.ms-cab-compressed", - ".cc" => "text/x-c", - ".ccxml" => "application/ccxml+xml", - ".cdbcmsg" => "application/vnd.contact.cmsg", - ".cdkey" => "application/vnd.mediastation.cdkey", - ".cdx" => "chemical/x-cdx", - ".cdxml" => "application/vnd.chemdraw+xml", - ".cdy" => "application/vnd.cinderella", - ".cer" => "application/pkix-cert", - ".cgm" => "image/cgm", - ".chat" => "application/x-chat", - ".chm" => "application/vnd.ms-htmlhelp", - ".chrt" => "application/vnd.kde.kchart", - ".cif" => "chemical/x-cif", - ".cii" => "application/vnd.anser-web-certificate-issue-initiation", - ".cil" => "application/vnd.ms-artgalry", - ".cla" => "application/vnd.claymore", - ".class" => "application/octet-stream", - ".clkk" => "application/vnd.crick.clicker.keyboard", - ".clkp" => "application/vnd.crick.clicker.palette", - ".clkt" => "application/vnd.crick.clicker.template", - ".clkw" => "application/vnd.crick.clicker.wordbank", - ".clkx" => "application/vnd.crick.clicker", - ".clp" => "application/x-msclip", - ".cmc" => "application/vnd.cosmocaller", - ".cmdf" => "chemical/x-cmdf", - ".cml" => "chemical/x-cml", - ".cmp" => "application/vnd.yellowriver-custom-menu", - ".cmx" => "image/x-cmx", - ".com" => "application/x-msdownload", - ".conf" => "text/plain", - ".cpio" => "application/x-cpio", - ".cpp" => "text/x-c", - ".cpt" => "application/mac-compactpro", - ".crd" => "application/x-mscardfile", - ".crl" => "application/pkix-crl", - ".crt" => "application/x-x509-ca-cert", - ".csh" => "application/x-csh", - ".csml" => "chemical/x-csml", - ".csp" => "application/vnd.commonspace", - ".css" => "text/css", - ".csv" => "text/csv", - ".curl" => "application/vnd.curl", - ".cww" => "application/prs.cww", - ".cxx" => "text/x-c", - ".daf" => "application/vnd.mobius.daf", - ".davmount" => "application/davmount+xml", - ".dcr" => "application/x-director", - ".dd2" => "application/vnd.oma.dd2+xml", - ".ddd" => "application/vnd.fujixerox.ddd", - ".deb" => "application/x-debian-package", - ".der" => "application/x-x509-ca-cert", - ".dfac" => "application/vnd.dreamfactory", - ".diff" => "text/x-diff", - ".dis" => "application/vnd.mobius.dis", - ".djv" => "image/vnd.djvu", - ".djvu" => "image/vnd.djvu", - ".dll" => "application/x-msdownload", - ".dmg" => "application/octet-stream", - ".dna" => "application/vnd.dna", - ".doc" => "application/msword", - ".docm" => "application/vnd.ms-word.document.macroEnabled.12", - ".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document", - ".dot" => "application/msword", - ".dotm" => "application/vnd.ms-word.template.macroEnabled.12", - ".dotx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.template", - ".dp" => "application/vnd.osgi.dp", - ".dpg" => "application/vnd.dpgraph", - ".dsc" => "text/prs.lines.tag", - ".dtd" => "application/xml-dtd", - ".dts" => "audio/vnd.dts", - ".dtshd" => "audio/vnd.dts.hd", - ".dv" => "video/x-dv", - ".dvi" => "application/x-dvi", - ".dwf" => "model/vnd.dwf", - ".dwg" => "image/vnd.dwg", - ".dxf" => "image/vnd.dxf", - ".dxp" => "application/vnd.spotfire.dxp", - ".ear" => "application/java-archive", - ".ecelp4800" => "audio/vnd.nuera.ecelp4800", - ".ecelp7470" => "audio/vnd.nuera.ecelp7470", - ".ecelp9600" => "audio/vnd.nuera.ecelp9600", - ".ecma" => "application/ecmascript", - ".edm" => "application/vnd.novadigm.edm", - ".edx" => "application/vnd.novadigm.edx", - ".efif" => "application/vnd.picsel", - ".ei6" => "application/vnd.pg.osasli", - ".eml" => "message/rfc822", - ".eol" => "audio/vnd.digital-winds", - ".eot" => "application/vnd.ms-fontobject", - ".eps" => "application/postscript", - ".es3" => "application/vnd.eszigno3+xml", - ".esf" => "application/vnd.epson.esf", - ".etx" => "text/x-setext", - ".exe" => "application/x-msdownload", - ".ext" => "application/vnd.novadigm.ext", - ".ez" => "application/andrew-inset", - ".ez2" => "application/vnd.ezpix-album", - ".ez3" => "application/vnd.ezpix-package", - ".f" => "text/x-fortran", - ".f77" => "text/x-fortran", - ".f90" => "text/x-fortran", - ".fbs" => "image/vnd.fastbidsheet", - ".fdf" => "application/vnd.fdf", - ".fe_launch" => "application/vnd.denovo.fcselayout-link", - ".fg5" => "application/vnd.fujitsu.oasysgp", - ".fli" => "video/x-fli", - ".flif" => "image/flif", - ".flo" => "application/vnd.micrografx.flo", - ".flv" => "video/x-flv", - ".flw" => "application/vnd.kde.kivio", - ".flx" => "text/vnd.fmi.flexstor", - ".fly" => "text/vnd.fly", - ".fm" => "application/vnd.framemaker", - ".fnc" => "application/vnd.frogans.fnc", - ".for" => "text/x-fortran", - ".fpx" => "image/vnd.fpx", - ".fsc" => "application/vnd.fsc.weblaunch", - ".fst" => "image/vnd.fst", - ".ftc" => "application/vnd.fluxtime.clip", - ".fti" => "application/vnd.anser-web-funds-transfer-initiation", - ".fvt" => "video/vnd.fvt", - ".fzs" => "application/vnd.fuzzysheet", - ".g3" => "image/g3fax", - ".gac" => "application/vnd.groove-account", - ".gdl" => "model/vnd.gdl", - ".gem" => "application/octet-stream", - ".gemspec" => "text/x-script.ruby", - ".ghf" => "application/vnd.groove-help", - ".gif" => "image/gif", - ".gim" => "application/vnd.groove-identity-message", - ".gmx" => "application/vnd.gmx", - ".gph" => "application/vnd.flographit", - ".gqf" => "application/vnd.grafeq", - ".gram" => "application/srgs", - ".grv" => "application/vnd.groove-injector", - ".grxml" => "application/srgs+xml", - ".gtar" => "application/x-gtar", - ".gtm" => "application/vnd.groove-tool-message", - ".gtw" => "model/vnd.gtw", - ".gv" => "text/vnd.graphviz", - ".gz" => "application/x-gzip", - ".h" => "text/x-c", - ".h261" => "video/h261", - ".h263" => "video/h263", - ".h264" => "video/h264", - ".hbci" => "application/vnd.hbci", - ".hdf" => "application/x-hdf", - ".heic" => "image/heic", - ".heics" => "image/heic-sequence", - ".heif" => "image/heif", - ".heifs" => "image/heif-sequence", - ".hh" => "text/x-c", - ".hlp" => "application/winhlp", - ".hpgl" => "application/vnd.hp-hpgl", - ".hpid" => "application/vnd.hp-hpid", - ".hps" => "application/vnd.hp-hps", - ".hqx" => "application/mac-binhex40", - ".htc" => "text/x-component", - ".htke" => "application/vnd.kenameaapp", - ".htm" => "text/html", - ".html" => "text/html", - ".hvd" => "application/vnd.yamaha.hv-dic", - ".hvp" => "application/vnd.yamaha.hv-voice", - ".hvs" => "application/vnd.yamaha.hv-script", - ".icc" => "application/vnd.iccprofile", - ".ice" => "x-conference/x-cooltalk", - ".ico" => "image/vnd.microsoft.icon", - ".ics" => "text/calendar", - ".ief" => "image/ief", - ".ifb" => "text/calendar", - ".ifm" => "application/vnd.shana.informed.formdata", - ".igl" => "application/vnd.igloader", - ".igs" => "model/iges", - ".igx" => "application/vnd.micrografx.igx", - ".iif" => "application/vnd.shana.informed.interchange", - ".imp" => "application/vnd.accpac.simply.imp", - ".ims" => "application/vnd.ms-ims", - ".ipk" => "application/vnd.shana.informed.package", - ".irm" => "application/vnd.ibm.rights-management", - ".irp" => "application/vnd.irepository.package+xml", - ".iso" => "application/octet-stream", - ".itp" => "application/vnd.shana.informed.formtemplate", - ".ivp" => "application/vnd.immervision-ivp", - ".ivu" => "application/vnd.immervision-ivu", - ".jad" => "text/vnd.sun.j2me.app-descriptor", - ".jam" => "application/vnd.jam", - ".jar" => "application/java-archive", - ".java" => "text/x-java-source", - ".jisp" => "application/vnd.jisp", - ".jlt" => "application/vnd.hp-jlyt", - ".jnlp" => "application/x-java-jnlp-file", - ".joda" => "application/vnd.joost.joda-archive", - ".jp2" => "image/jp2", - ".jpeg" => "image/jpeg", - ".jpg" => "image/jpeg", - ".jpgv" => "video/jpeg", - ".jpm" => "video/jpm", - ".js" => "text/javascript", - ".json" => "application/json", - ".karbon" => "application/vnd.kde.karbon", - ".kfo" => "application/vnd.kde.kformula", - ".kia" => "application/vnd.kidspiration", - ".kml" => "application/vnd.google-earth.kml+xml", - ".kmz" => "application/vnd.google-earth.kmz", - ".kne" => "application/vnd.kinar", - ".kon" => "application/vnd.kde.kontour", - ".kpr" => "application/vnd.kde.kpresenter", - ".ksp" => "application/vnd.kde.kspread", - ".ktz" => "application/vnd.kahootz", - ".kwd" => "application/vnd.kde.kword", - ".latex" => "application/x-latex", - ".lbd" => "application/vnd.llamagraphics.life-balance.desktop", - ".lbe" => "application/vnd.llamagraphics.life-balance.exchange+xml", - ".les" => "application/vnd.hhe.lesson-player", - ".link66" => "application/vnd.route66.link66+xml", - ".log" => "text/plain", - ".lostxml" => "application/lost+xml", - ".lrm" => "application/vnd.ms-lrm", - ".ltf" => "application/vnd.frogans.ltf", - ".lvp" => "audio/vnd.lucent.voice", - ".lwp" => "application/vnd.lotus-wordpro", - ".m3u" => "audio/x-mpegurl", - ".m3u8" => "application/x-mpegurl", - ".m4a" => "audio/mp4a-latm", - ".m4v" => "video/mp4", - ".ma" => "application/mathematica", - ".mag" => "application/vnd.ecowin.chart", - ".man" => "text/troff", - ".manifest" => "text/cache-manifest", - ".mathml" => "application/mathml+xml", - ".mbk" => "application/vnd.mobius.mbk", - ".mbox" => "application/mbox", - ".mc1" => "application/vnd.medcalcdata", - ".mcd" => "application/vnd.mcd", - ".mdb" => "application/x-msaccess", - ".mdi" => "image/vnd.ms-modi", - ".mdoc" => "text/troff", - ".me" => "text/troff", - ".mfm" => "application/vnd.mfmp", - ".mgz" => "application/vnd.proteus.magazine", - ".mid" => "audio/midi", - ".midi" => "audio/midi", - ".mif" => "application/vnd.mif", - ".mime" => "message/rfc822", - ".mj2" => "video/mj2", - ".mjs" => "text/javascript", - ".mlp" => "application/vnd.dolby.mlp", - ".mmd" => "application/vnd.chipnuts.karaoke-mmd", - ".mmf" => "application/vnd.smaf", - ".mml" => "application/mathml+xml", - ".mmr" => "image/vnd.fujixerox.edmics-mmr", - ".mng" => "video/x-mng", - ".mny" => "application/x-msmoney", - ".mov" => "video/quicktime", - ".movie" => "video/x-sgi-movie", - ".mp3" => "audio/mpeg", - ".mp4" => "video/mp4", - ".mp4a" => "audio/mp4", - ".mp4s" => "application/mp4", - ".mp4v" => "video/mp4", - ".mpc" => "application/vnd.mophun.certificate", - ".mpd" => "application/dash+xml", - ".mpeg" => "video/mpeg", - ".mpg" => "video/mpeg", - ".mpga" => "audio/mpeg", - ".mpkg" => "application/vnd.apple.installer+xml", - ".mpm" => "application/vnd.blueice.multipass", - ".mpn" => "application/vnd.mophun.application", - ".mpp" => "application/vnd.ms-project", - ".mpy" => "application/vnd.ibm.minipay", - ".mqy" => "application/vnd.mobius.mqy", - ".mrc" => "application/marc", - ".ms" => "text/troff", - ".mscml" => "application/mediaservercontrol+xml", - ".mseq" => "application/vnd.mseq", - ".msf" => "application/vnd.epson.msf", - ".msh" => "model/mesh", - ".msi" => "application/x-msdownload", - ".msl" => "application/vnd.mobius.msl", - ".msty" => "application/vnd.muvee.style", - ".mts" => "model/vnd.mts", - ".mus" => "application/vnd.musician", - ".mvb" => "application/x-msmediaview", - ".mwf" => "application/vnd.mfer", - ".mxf" => "application/mxf", - ".mxl" => "application/vnd.recordare.musicxml", - ".mxml" => "application/xv+xml", - ".mxs" => "application/vnd.triscape.mxs", - ".mxu" => "video/vnd.mpegurl", - ".n" => "application/vnd.nokia.n-gage.symbian.install", - ".nc" => "application/x-netcdf", - ".ngdat" => "application/vnd.nokia.n-gage.data", - ".nlu" => "application/vnd.neurolanguage.nlu", - ".nml" => "application/vnd.enliven", - ".nnd" => "application/vnd.noblenet-directory", - ".nns" => "application/vnd.noblenet-sealer", - ".nnw" => "application/vnd.noblenet-web", - ".npx" => "image/vnd.net-fpx", - ".nsf" => "application/vnd.lotus-notes", - ".oa2" => "application/vnd.fujitsu.oasys2", - ".oa3" => "application/vnd.fujitsu.oasys3", - ".oas" => "application/vnd.fujitsu.oasys", - ".obd" => "application/x-msbinder", - ".oda" => "application/oda", - ".odc" => "application/vnd.oasis.opendocument.chart", - ".odf" => "application/vnd.oasis.opendocument.formula", - ".odg" => "application/vnd.oasis.opendocument.graphics", - ".odi" => "application/vnd.oasis.opendocument.image", - ".odp" => "application/vnd.oasis.opendocument.presentation", - ".ods" => "application/vnd.oasis.opendocument.spreadsheet", - ".odt" => "application/vnd.oasis.opendocument.text", - ".oga" => "audio/ogg", - ".ogg" => "application/ogg", - ".ogv" => "video/ogg", - ".ogx" => "application/ogg", - ".org" => "application/vnd.lotus-organizer", - ".otc" => "application/vnd.oasis.opendocument.chart-template", - ".otf" => "font/otf", - ".otg" => "application/vnd.oasis.opendocument.graphics-template", - ".oth" => "application/vnd.oasis.opendocument.text-web", - ".oti" => "application/vnd.oasis.opendocument.image-template", - ".otm" => "application/vnd.oasis.opendocument.text-master", - ".ots" => "application/vnd.oasis.opendocument.spreadsheet-template", - ".ott" => "application/vnd.oasis.opendocument.text-template", - ".oxt" => "application/vnd.openofficeorg.extension", - ".p" => "text/x-pascal", - ".p10" => "application/pkcs10", - ".p12" => "application/x-pkcs12", - ".p7b" => "application/x-pkcs7-certificates", - ".p7m" => "application/pkcs7-mime", - ".p7r" => "application/x-pkcs7-certreqresp", - ".p7s" => "application/pkcs7-signature", - ".pas" => "text/x-pascal", - ".pbd" => "application/vnd.powerbuilder6", - ".pbm" => "image/x-portable-bitmap", - ".pcl" => "application/vnd.hp-pcl", - ".pclxl" => "application/vnd.hp-pclxl", - ".pcx" => "image/x-pcx", - ".pdb" => "chemical/x-pdb", - ".pdf" => "application/pdf", - ".pem" => "application/x-x509-ca-cert", - ".pfr" => "application/font-tdpfr", - ".pgm" => "image/x-portable-graymap", - ".pgn" => "application/x-chess-pgn", - ".pgp" => "application/pgp-encrypted", - ".pic" => "image/x-pict", - ".pict" => "image/pict", - ".pkg" => "application/octet-stream", - ".pki" => "application/pkixcmp", - ".pkipath" => "application/pkix-pkipath", - ".pl" => "text/x-script.perl", - ".plb" => "application/vnd.3gpp.pic-bw-large", - ".plc" => "application/vnd.mobius.plc", - ".plf" => "application/vnd.pocketlearn", - ".pls" => "application/pls+xml", - ".pm" => "text/x-script.perl-module", - ".pml" => "application/vnd.ctc-posml", - ".png" => "image/png", - ".pnm" => "image/x-portable-anymap", - ".pntg" => "image/x-macpaint", - ".portpkg" => "application/vnd.macports.portpkg", - ".pot" => "application/vnd.ms-powerpoint", - ".potm" => "application/vnd.ms-powerpoint.template.macroEnabled.12", - ".potx" => "application/vnd.openxmlformats-officedocument.presentationml.template", - ".ppa" => "application/vnd.ms-powerpoint", - ".ppam" => "application/vnd.ms-powerpoint.addin.macroEnabled.12", - ".ppd" => "application/vnd.cups-ppd", - ".ppm" => "image/x-portable-pixmap", - ".pps" => "application/vnd.ms-powerpoint", - ".ppsm" => "application/vnd.ms-powerpoint.slideshow.macroEnabled.12", - ".ppsx" => "application/vnd.openxmlformats-officedocument.presentationml.slideshow", - ".ppt" => "application/vnd.ms-powerpoint", - ".pptm" => "application/vnd.ms-powerpoint.presentation.macroEnabled.12", - ".pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation", - ".prc" => "application/vnd.palm", - ".pre" => "application/vnd.lotus-freelance", - ".prf" => "application/pics-rules", - ".ps" => "application/postscript", - ".psb" => "application/vnd.3gpp.pic-bw-small", - ".psd" => "image/vnd.adobe.photoshop", - ".ptid" => "application/vnd.pvi.ptid1", - ".pub" => "application/x-mspublisher", - ".pvb" => "application/vnd.3gpp.pic-bw-var", - ".pwn" => "application/vnd.3m.post-it-notes", - ".py" => "text/x-script.python", - ".pya" => "audio/vnd.ms-playready.media.pya", - ".pyv" => "video/vnd.ms-playready.media.pyv", - ".qam" => "application/vnd.epson.quickanime", - ".qbo" => "application/vnd.intu.qbo", - ".qfx" => "application/vnd.intu.qfx", - ".qps" => "application/vnd.publishare-delta-tree", - ".qt" => "video/quicktime", - ".qtif" => "image/x-quicktime", - ".qxd" => "application/vnd.quark.quarkxpress", - ".ra" => "audio/x-pn-realaudio", - ".rake" => "text/x-script.ruby", - ".ram" => "audio/x-pn-realaudio", - ".rar" => "application/x-rar-compressed", - ".ras" => "image/x-cmu-raster", - ".rb" => "text/x-script.ruby", - ".rcprofile" => "application/vnd.ipunplugged.rcprofile", - ".rdf" => "application/rdf+xml", - ".rdz" => "application/vnd.data-vision.rdz", - ".rep" => "application/vnd.businessobjects", - ".rgb" => "image/x-rgb", - ".rif" => "application/reginfo+xml", - ".rl" => "application/resource-lists+xml", - ".rlc" => "image/vnd.fujixerox.edmics-rlc", - ".rld" => "application/resource-lists-diff+xml", - ".rm" => "application/vnd.rn-realmedia", - ".rmp" => "audio/x-pn-realaudio-plugin", - ".rms" => "application/vnd.jcp.javame.midlet-rms", - ".rnc" => "application/relax-ng-compact-syntax", - ".roff" => "text/troff", - ".rpm" => "application/x-redhat-package-manager", - ".rpss" => "application/vnd.nokia.radio-presets", - ".rpst" => "application/vnd.nokia.radio-preset", - ".rq" => "application/sparql-query", - ".rs" => "application/rls-services+xml", - ".rsd" => "application/rsd+xml", - ".rss" => "application/rss+xml", - ".rtf" => "application/rtf", - ".rtx" => "text/richtext", - ".ru" => "text/x-script.ruby", - ".s" => "text/x-asm", - ".saf" => "application/vnd.yamaha.smaf-audio", - ".sbml" => "application/sbml+xml", - ".sc" => "application/vnd.ibm.secure-container", - ".scd" => "application/x-msschedule", - ".scm" => "application/vnd.lotus-screencam", - ".scq" => "application/scvp-cv-request", - ".scs" => "application/scvp-cv-response", - ".sdkm" => "application/vnd.solent.sdkm+xml", - ".sdp" => "application/sdp", - ".see" => "application/vnd.seemail", - ".sema" => "application/vnd.sema", - ".semd" => "application/vnd.semd", - ".semf" => "application/vnd.semf", - ".setpay" => "application/set-payment-initiation", - ".setreg" => "application/set-registration-initiation", - ".sfd" => "application/vnd.hydrostatix.sof-data", - ".sfs" => "application/vnd.spotfire.sfs", - ".sgm" => "text/sgml", - ".sgml" => "text/sgml", - ".sh" => "application/x-sh", - ".shar" => "application/x-shar", - ".shf" => "application/shf+xml", - ".sig" => "application/pgp-signature", - ".sit" => "application/x-stuffit", - ".sitx" => "application/x-stuffitx", - ".skp" => "application/vnd.koan", - ".slt" => "application/vnd.epson.salt", - ".smi" => "application/smil+xml", - ".snd" => "audio/basic", - ".so" => "application/octet-stream", - ".spf" => "application/vnd.yamaha.smaf-phrase", - ".spl" => "application/x-futuresplash", - ".spot" => "text/vnd.in3d.spot", - ".spp" => "application/scvp-vp-response", - ".spq" => "application/scvp-vp-request", - ".src" => "application/x-wais-source", - ".srt" => "text/srt", - ".srx" => "application/sparql-results+xml", - ".sse" => "application/vnd.kodak-descriptor", - ".ssf" => "application/vnd.epson.ssf", - ".ssml" => "application/ssml+xml", - ".stf" => "application/vnd.wt.stf", - ".stk" => "application/hyperstudio", - ".str" => "application/vnd.pg.format", - ".sus" => "application/vnd.sus-calendar", - ".sv4cpio" => "application/x-sv4cpio", - ".sv4crc" => "application/x-sv4crc", - ".svd" => "application/vnd.svd", - ".svg" => "image/svg+xml", - ".svgz" => "image/svg+xml", - ".swf" => "application/x-shockwave-flash", - ".swi" => "application/vnd.arastra.swi", - ".t" => "text/troff", - ".tao" => "application/vnd.tao.intent-module-archive", - ".tar" => "application/x-tar", - ".tbz" => "application/x-bzip-compressed-tar", - ".tcap" => "application/vnd.3gpp2.tcap", - ".tcl" => "application/x-tcl", - ".tex" => "application/x-tex", - ".texi" => "application/x-texinfo", - ".texinfo" => "application/x-texinfo", - ".text" => "text/plain", - ".tif" => "image/tiff", - ".tiff" => "image/tiff", - ".tmo" => "application/vnd.tmobile-livetv", - ".torrent" => "application/x-bittorrent", - ".tpl" => "application/vnd.groove-tool-template", - ".tpt" => "application/vnd.trid.tpt", - ".tr" => "text/troff", - ".tra" => "application/vnd.trueapp", - ".trm" => "application/x-msterminal", - ".ts" => "video/mp2t", - ".tsv" => "text/tab-separated-values", - ".ttf" => "font/ttf", - ".twd" => "application/vnd.simtech-mindmapper", - ".txd" => "application/vnd.genomatix.tuxedo", - ".txf" => "application/vnd.mobius.txf", - ".txt" => "text/plain", - ".ufd" => "application/vnd.ufdl", - ".umj" => "application/vnd.umajin", - ".unityweb" => "application/vnd.unity", - ".uoml" => "application/vnd.uoml+xml", - ".uri" => "text/uri-list", - ".ustar" => "application/x-ustar", - ".utz" => "application/vnd.uiq.theme", - ".uu" => "text/x-uuencode", - ".vcd" => "application/x-cdlink", - ".vcf" => "text/x-vcard", - ".vcg" => "application/vnd.groove-vcard", - ".vcs" => "text/x-vcalendar", - ".vcx" => "application/vnd.vcx", - ".vis" => "application/vnd.visionary", - ".viv" => "video/vnd.vivo", - ".vrml" => "model/vrml", - ".vsd" => "application/vnd.visio", - ".vsf" => "application/vnd.vsf", - ".vtt" => "text/vtt", - ".vtu" => "model/vnd.vtu", - ".vxml" => "application/voicexml+xml", - ".war" => "application/java-archive", - ".wasm" => "application/wasm", - ".wav" => "audio/x-wav", - ".wax" => "audio/x-ms-wax", - ".wbmp" => "image/vnd.wap.wbmp", - ".wbs" => "application/vnd.criticaltools.wbs+xml", - ".wbxml" => "application/vnd.wap.wbxml", - ".webm" => "video/webm", - ".webp" => "image/webp", - ".wm" => "video/x-ms-wm", - ".wma" => "audio/x-ms-wma", - ".wmd" => "application/x-ms-wmd", - ".wmf" => "application/x-msmetafile", - ".wml" => "text/vnd.wap.wml", - ".wmlc" => "application/vnd.wap.wmlc", - ".wmls" => "text/vnd.wap.wmlscript", - ".wmlsc" => "application/vnd.wap.wmlscriptc", - ".wmv" => "video/x-ms-wmv", - ".wmx" => "video/x-ms-wmx", - ".wmz" => "application/x-ms-wmz", - ".woff" => "font/woff", - ".woff2" => "font/woff2", - ".wpd" => "application/vnd.wordperfect", - ".wpl" => "application/vnd.ms-wpl", - ".wps" => "application/vnd.ms-works", - ".wqd" => "application/vnd.wqd", - ".wri" => "application/x-mswrite", - ".wrl" => "model/vrml", - ".wsdl" => "application/wsdl+xml", - ".wspolicy" => "application/wspolicy+xml", - ".wtb" => "application/vnd.webturbo", - ".wvx" => "video/x-ms-wvx", - ".x3d" => "application/vnd.hzn-3d-crossword", - ".xar" => "application/vnd.xara", - ".xbd" => "application/vnd.fujixerox.docuworks.binder", - ".xbm" => "image/x-xbitmap", - ".xdm" => "application/vnd.syncml.dm+xml", - ".xdp" => "application/vnd.adobe.xdp+xml", - ".xdw" => "application/vnd.fujixerox.docuworks", - ".xenc" => "application/xenc+xml", - ".xer" => "application/patch-ops-error+xml", - ".xfdf" => "application/vnd.adobe.xfdf", - ".xfdl" => "application/vnd.xfdl", - ".xhtml" => "application/xhtml+xml", - ".xif" => "image/vnd.xiff", - ".xla" => "application/vnd.ms-excel", - ".xlam" => "application/vnd.ms-excel.addin.macroEnabled.12", - ".xls" => "application/vnd.ms-excel", - ".xlsb" => "application/vnd.ms-excel.sheet.binary.macroEnabled.12", - ".xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ".xlsm" => "application/vnd.ms-excel.sheet.macroEnabled.12", - ".xlt" => "application/vnd.ms-excel", - ".xltx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.template", - ".xml" => "application/xml", - ".xo" => "application/vnd.olpc-sugar", - ".xop" => "application/xop+xml", - ".xpm" => "image/x-xpixmap", - ".xpr" => "application/vnd.is-xpr", - ".xps" => "application/vnd.ms-xpsdocument", - ".xpw" => "application/vnd.intercon.formnet", - ".xsl" => "application/xml", - ".xslt" => "application/xslt+xml", - ".xsm" => "application/vnd.syncml+xml", - ".xspf" => "application/xspf+xml", - ".xul" => "application/vnd.mozilla.xul+xml", - ".xwd" => "image/x-xwindowdump", - ".xyz" => "chemical/x-xyz", - ".yaml" => "text/yaml", - ".yml" => "text/yaml", - ".zaz" => "application/vnd.zzazz.deck+xml", - ".zip" => "application/zip", - ".zmm" => "application/vnd.handheld-entertainment+xml", - } - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock.rb deleted file mode 100644 index 5e5c457..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock.rb +++ /dev/null @@ -1,3 +0,0 @@ -# frozen_string_literal: true - -require_relative 'mock_request' diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock_request.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock_request.rb deleted file mode 100644 index 7c87bea..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock_request.rb +++ /dev/null @@ -1,161 +0,0 @@ -# frozen_string_literal: true - -require 'uri' -require 'stringio' - -require_relative 'constants' -require_relative 'mock_response' - -module Rack - # Rack::MockRequest helps testing your Rack application without - # actually using HTTP. - # - # After performing a request on a URL with get/post/put/patch/delete, it - # returns a MockResponse with useful helper methods for effective - # testing. - # - # You can pass a hash with additional configuration to the - # get/post/put/patch/delete. - # :input:: A String or IO-like to be used as rack.input. - # :fatal:: Raise a FatalWarning if the app writes to rack.errors. - # :lint:: If true, wrap the application in a Rack::Lint. - - class MockRequest - class FatalWarning < RuntimeError - end - - class FatalWarner - def puts(warning) - raise FatalWarning, warning - end - - def write(warning) - raise FatalWarning, warning - end - - def flush - end - - def string - "" - end - end - - def initialize(app) - @app = app - end - - # Make a GET request and return a MockResponse. See #request. - def get(uri, opts = {}) request(GET, uri, opts) end - # Make a POST request and return a MockResponse. See #request. - def post(uri, opts = {}) request(POST, uri, opts) end - # Make a PUT request and return a MockResponse. See #request. - def put(uri, opts = {}) request(PUT, uri, opts) end - # Make a PATCH request and return a MockResponse. See #request. - def patch(uri, opts = {}) request(PATCH, uri, opts) end - # Make a DELETE request and return a MockResponse. See #request. - def delete(uri, opts = {}) request(DELETE, uri, opts) end - # Make a HEAD request and return a MockResponse. See #request. - def head(uri, opts = {}) request(HEAD, uri, opts) end - # Make an OPTIONS request and return a MockResponse. See #request. - def options(uri, opts = {}) request(OPTIONS, uri, opts) end - - # Make a request using the given request method for the given - # uri to the rack application and return a MockResponse. - # Options given are passed to MockRequest.env_for. - def request(method = GET, uri = "", opts = {}) - env = self.class.env_for(uri, opts.merge(method: method)) - - if opts[:lint] - app = Rack::Lint.new(@app) - else - app = @app - end - - errors = env[RACK_ERRORS] - status, headers, body = app.call(env) - MockResponse.new(status, headers, body, errors) - ensure - body.close if body.respond_to?(:close) - end - - # For historical reasons, we're pinning to RFC 2396. - # URI::Parser = URI::RFC2396_Parser - def self.parse_uri_rfc2396(uri) - @parser ||= URI::Parser.new - @parser.parse(uri) - end - - # Return the Rack environment used for a request to +uri+. - # All options that are strings are added to the returned environment. - # Options: - # :fatal :: Whether to raise an exception if request outputs to rack.errors - # :input :: The rack.input to set - # :http_version :: The SERVER_PROTOCOL to set - # :method :: The HTTP request method to use - # :params :: The params to use - # :script_name :: The SCRIPT_NAME to set - def self.env_for(uri = "", opts = {}) - uri = parse_uri_rfc2396(uri) - uri.path = "/#{uri.path}" unless uri.path[0] == ?/ - - env = {} - - env[REQUEST_METHOD] = (opts[:method] ? opts[:method].to_s.upcase : GET).b - env[SERVER_NAME] = (uri.host || "example.org").b - env[SERVER_PORT] = (uri.port ? uri.port.to_s : "80").b - env[SERVER_PROTOCOL] = opts[:http_version] || 'HTTP/1.1' - env[QUERY_STRING] = (uri.query.to_s).b - env[PATH_INFO] = (uri.path).b - env[RACK_URL_SCHEME] = (uri.scheme || "http").b - env[HTTPS] = (env[RACK_URL_SCHEME] == "https" ? "on" : "off").b - - env[SCRIPT_NAME] = opts[:script_name] || "" - - if opts[:fatal] - env[RACK_ERRORS] = FatalWarner.new - else - env[RACK_ERRORS] = StringIO.new - end - - if params = opts[:params] - if env[REQUEST_METHOD] == GET - params = Utils.parse_nested_query(params) if params.is_a?(String) - params.update(Utils.parse_nested_query(env[QUERY_STRING])) - env[QUERY_STRING] = Utils.build_nested_query(params) - elsif !opts.has_key?(:input) - opts["CONTENT_TYPE"] = "application/x-www-form-urlencoded" - if params.is_a?(Hash) - if data = Rack::Multipart.build_multipart(params) - opts[:input] = data - opts["CONTENT_LENGTH"] ||= data.length.to_s - opts["CONTENT_TYPE"] = "multipart/form-data; boundary=#{Rack::Multipart::MULTIPART_BOUNDARY}" - else - opts[:input] = Utils.build_nested_query(params) - end - else - opts[:input] = params - end - end - end - - rack_input = opts[:input] - if String === rack_input - rack_input = StringIO.new(rack_input) - end - - if rack_input - rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding) - env[RACK_INPUT] = rack_input - - env["CONTENT_LENGTH"] ||= env[RACK_INPUT].size.to_s if env[RACK_INPUT].respond_to?(:size) - end - - opts.each { |field, value| - env[field] = value if String === field - } - - env - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock_response.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock_response.rb deleted file mode 100644 index 7360ade..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/mock_response.rb +++ /dev/null @@ -1,147 +0,0 @@ -# frozen_string_literal: true - -require 'time' - -require_relative 'response' - -module Rack - # Rack::MockResponse provides useful helpers for testing your apps. - # Usually, you don't create the MockResponse on your own, but use - # MockRequest. - - class MockResponse < Rack::Response - class Cookie - attr_reader :name, :value, :path, :domain, :expires, :secure - - def initialize(args) - @name = args["name"] - @value = args["value"] - @path = args["path"] - @domain = args["domain"] - @expires = args["expires"] - @secure = args["secure"] - end - - def method_missing(method_name, *args, &block) - @value.send(method_name, *args, &block) - end - # :nocov: - ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true) - # :nocov: - - def respond_to_missing?(method_name, include_all = false) - @value.respond_to?(method_name, include_all) || super - end - end - - class << self - alias [] new - end - - # Headers - attr_reader :original_headers, :cookies - - # Errors - attr_accessor :errors - - def initialize(status, headers, body, errors = nil) - @original_headers = headers - - if errors - @errors = errors.string if errors.respond_to?(:string) - else - @errors = "" - end - - super(body, status, headers) - - @cookies = parse_cookies_from_header - buffered_body! - end - - def =~(other) - body =~ other - end - - def match(other) - body.match other - end - - def body - return @buffered_body if defined?(@buffered_body) - - # FIXME: apparently users of MockResponse expect the return value of - # MockResponse#body to be a string. However, the real response object - # returns the body as a list. - # - # See spec_showstatus.rb: - # - # should "not replace existing messages" do - # ... - # res.body.should == "foo!" - # end - buffer = @buffered_body = String.new - - @body.each do |chunk| - buffer << chunk - end - - return buffer - end - - def empty? - [201, 204, 304].include? status - end - - def cookie(name) - cookies.fetch(name, nil) - end - - private - - def parse_cookies_from_header - cookies = Hash.new - set_cookie_header = headers['set-cookie'] - if set_cookie_header && !set_cookie_header.empty? - Array(set_cookie_header).each do |cookie| - cookie_name, cookie_filling = cookie.split('=', 2) - cookie_attributes = identify_cookie_attributes cookie_filling - parsed_cookie = Cookie.new( - 'name' => cookie_name.strip, - 'value' => cookie_attributes.fetch('https://github.com/value'), - 'path' => cookie_attributes.fetch('https://github.com/path', nil), - 'domain' => cookie_attributes.fetch('https://github.com/domain', nil), - 'expires' => cookie_attributes.fetch('https://github.com/expires', nil), - 'secure' => cookie_attributes.fetch('https://github.com/secure', false) - ) - cookies.store(cookie_name, parsed_cookie) - end - end - cookies - end - - def identify_cookie_attributes(cookie_filling) - cookie_bits = cookie_filling.split(';') - cookie_attributes = Hash.new - cookie_attributes.store('value', Array(cookie_bits[0].strip)) - cookie_bits.drop(1).each do |bit| - if bit.include? '=' - cookie_attribute, attribute_value = bit.split('=', 2) - cookie_attributes.store(cookie_attribute.strip.downcase, attribute_value.strip) - end - if bit.include? 'secure' - cookie_attributes.store('secure', true) - end - end - - if cookie_attributes.key? 'max-age' - cookie_attributes.store('expires', Time.now + cookie_attributes['max-age'].to_i) - elsif cookie_attributes.key? 'expires' - cookie_attributes.store('expires', Time.httpdate(cookie_attributes['expires'])) - end - - cookie_attributes - end - - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart.rb deleted file mode 100644 index 4b02fb3..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart.rb +++ /dev/null @@ -1,77 +0,0 @@ -# frozen_string_literal: true - -require_relative 'constants' -require_relative 'utils' - -require_relative 'multipart/parser' -require_relative 'multipart/generator' - -require_relative 'bad_request' - -module Rack - # A multipart form data parser, adapted from IOWA. - # - # Usually, Rack::Request#POST takes care of calling this. - module Multipart - MULTIPART_BOUNDARY = "AaB03x" - - class MissingInputError < StandardError - include BadRequest - end - - # Accumulator for multipart form data, conforming to the QueryParser API. - # In future, the Parser could return the pair list directly, but that would - # change its API. - class ParamList # :nodoc: - def self.make_params - new - end - - def self.normalize_params(params, key, value) - params << [key, value] - end - - def initialize - @pairs = [] - end - - def <<(pair) - @pairs << pair - end - - def to_params_hash - @pairs - end - end - - class << self - def parse_multipart(env, params = Rack::Utils.default_query_parser) - unless io = env[RACK_INPUT] - raise MissingInputError, "Missing input stream!" - end - - if content_length = env['CONTENT_LENGTH'] - content_length = content_length.to_i - end - - content_type = env['CONTENT_TYPE'] - - tempfile = env[RACK_MULTIPART_TEMPFILE_FACTORY] || Parser::TEMPFILE_FACTORY - bufsize = env[RACK_MULTIPART_BUFFER_SIZE] || Parser::BUFSIZE - - info = Parser.parse(io, content_length, content_type, tempfile, bufsize, params) - env[RACK_TEMPFILES] = info.tmp_files - - return info.params - end - - def extract_multipart(request, params = Rack::Utils.default_query_parser) - parse_multipart(request.env) - end - - def build_multipart(params, first = true) - Generator.new(params, first).dump - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/generator.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/generator.rb deleted file mode 100644 index 30d7f51..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/generator.rb +++ /dev/null @@ -1,99 +0,0 @@ -# frozen_string_literal: true - -require_relative 'uploaded_file' - -module Rack - module Multipart - class Generator - def initialize(params, first = true) - @params, @first = params, first - - if @first && !@params.is_a?(Hash) - raise ArgumentError, "value must be a Hash" - end - end - - def dump - return nil if @first && !multipart? - return flattened_params unless @first - - flattened_params.map do |name, file| - if file.respond_to?(:original_filename) - if file.path - ::File.open(file.path, 'rb') do |f| - f.set_encoding(Encoding::BINARY) - content_for_tempfile(f, file, name) - end - else - content_for_tempfile(file, file, name) - end - else - content_for_other(file, name) - end - end.join << "--#{MULTIPART_BOUNDARY}--\r" - end - - private - def multipart? - query = lambda { |value| - case value - when Array - value.any?(&query) - when Hash - value.values.any?(&query) - when Rack::Multipart::UploadedFile - true - end - } - - @params.values.any?(&query) - end - - def flattened_params - @flattened_params ||= begin - h = Hash.new - @params.each do |key, value| - k = @first ? key.to_s : "[#{key}]" - - case value - when Array - value.map { |v| - Multipart.build_multipart(v, false).each { |subkey, subvalue| - h["#{k}[]#{subkey}"] = subvalue - } - } - when Hash - Multipart.build_multipart(value, false).each { |subkey, subvalue| - h[k + subkey] = subvalue - } - else - h[k] = value - end - end - h - end - end - - def content_for_tempfile(io, file, name) - length = ::File.stat(file.path).size if file.path - filename = "; filename=\"#{Utils.escape_path(file.original_filename)}\"" -<<-EOF ---#{MULTIPART_BOUNDARY}\r -content-disposition: form-data; name="#{name}"#{filename}\r -content-type: #{file.content_type}\r -#{"content-length: #{length}\r\n" if length}\r -#{io.read}\r -EOF - end - - def content_for_other(file, name) -<<-EOF ---#{MULTIPART_BOUNDARY}\r -content-disposition: form-data; name="#{name}"\r -\r -#{file}\r -EOF - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/parser.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/parser.rb deleted file mode 100644 index 3817950..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/parser.rb +++ /dev/null @@ -1,530 +0,0 @@ -# frozen_string_literal: true - -require 'strscan' - -require_relative '../utils' -require_relative '../bad_request' - -module Rack - module Multipart - class MultipartPartLimitError < Errno::EMFILE - include BadRequest - end - - class MultipartTotalPartLimitError < StandardError - include BadRequest - end - - # Use specific error class when parsing multipart request - # that ends early. - class EmptyContentError < ::EOFError - include BadRequest - end - - # Base class for multipart exceptions that do not subclass from - # other exception classes for backwards compatibility. - class BoundaryTooLongError < StandardError - include BadRequest - end - - # Prefer to use the BoundaryTooLongError class or Rack::BadRequest. - Error = BoundaryTooLongError - - EOL = "\r\n" - FWS = /[ \t]+(?:\r\n[ \t]+)?/ # whitespace with optional folding - HEADER_VALUE = "(?:[^\r\n]|\r\n[ \t])*" # anything but a non-folding CRLF - MULTIPART = %r|\Amultipart/.*boundary=\"?([^\";,]+)\"?|ni - MULTIPART_CONTENT_TYPE = /^Content-Type:#{FWS}?(#{HEADER_VALUE})/ni - MULTIPART_CONTENT_DISPOSITION = /^Content-Disposition:#{FWS}?(#{HEADER_VALUE})/ni - MULTIPART_CONTENT_ID = /^Content-ID:#{FWS}?(#{HEADER_VALUE})/ni - - # Rack::Multipart::Parser handles parsing of multipart/form-data requests. - # - # File Parameter Contents - # - # When processing file uploads, the parser returns a hash containing - # information about uploaded files. For +file+ parameters, the hash includes: - # - # * +:filename+ - The original filename, already URL decoded by the parser - # * +:type+ - The content type of the uploaded file - # * +:name+ - The parameter name from the form - # * +:tempfile+ - A Tempfile object containing the uploaded data - # * +:head+ - The raw header content for this part - class Parser - BUFSIZE = 1_048_576 - TEXT_PLAIN = "text/plain" - TEMPFILE_FACTORY = lambda { |filename, content_type| - extension = ::File.extname(filename.gsub("\0", '%00'))[0, 129] - - Tempfile.new(["RackMultipart", extension]) - } - - class BoundedIO # :nodoc: - def initialize(io, content_length) - @io = io - @content_length = content_length - @cursor = 0 - end - - def read(size, outbuf = nil) - return if @cursor >= @content_length - - left = @content_length - @cursor - - str = if left < size - @io.read left, outbuf - else - @io.read size, outbuf - end - - if str - @cursor += str.bytesize - else - # Raise an error for mismatching content-length and actual contents - raise EOFError, "bad content body" - end - - str - end - end - - MultipartInfo = Struct.new :params, :tmp_files - EMPTY = MultipartInfo.new(nil, []) - - def self.parse_boundary(content_type) - return unless content_type - data = content_type.match(MULTIPART) - return unless data - data[1] - end - - def self.parse(io, content_length, content_type, tmpfile, bufsize, qp) - return EMPTY if 0 == content_length - - boundary = parse_boundary content_type - return EMPTY unless boundary - - if boundary.length > 70 - # RFC 1521 Section 7.2.1 imposes a 70 character maximum for the boundary. - # Most clients use no more than 55 characters. - raise BoundaryTooLongError, "multipart boundary size too large (#{boundary.length} characters)" - end - - io = BoundedIO.new(io, content_length) if content_length - - parser = new(boundary, tmpfile, bufsize, qp) - parser.parse(io) - - parser.result - end - - class Collector - class MimePart < Struct.new(:body, :head, :filename, :content_type, :name) - def get_data - data = body - if filename == "" - # filename is blank which means no file has been selected - return - elsif filename - body.rewind if body.respond_to?(:rewind) - - # Take the basename of the upload's original filename. - # This handles the full Windows paths given by Internet Explorer - # (and perhaps other broken user agents) without affecting - # those which give the lone filename. - fn = filename.split(/[\/\\]/).last - - data = { filename: fn, type: content_type, - name: name, tempfile: body, head: head } - end - - yield data - end - end - - class BufferPart < MimePart - def file?; false; end - def close; end - end - - class TempfilePart < MimePart - def file?; true; end - def close; body.close; end - end - - include Enumerable - - def initialize(tempfile) - @tempfile = tempfile - @mime_parts = [] - @open_files = 0 - end - - def each - @mime_parts.each { |part| yield part } - end - - def on_mime_head(mime_index, head, filename, content_type, name) - if filename - body = @tempfile.call(filename, content_type) - body.binmode if body.respond_to?(:binmode) - klass = TempfilePart - @open_files += 1 - else - body = String.new - klass = BufferPart - end - - @mime_parts[mime_index] = klass.new(body, head, filename, content_type, name) - - check_part_limits - end - - def on_mime_body(mime_index, content) - @mime_parts[mime_index].body << content - end - - def on_mime_finish(mime_index) - end - - private - - def check_part_limits - file_limit = Utils.multipart_file_limit - part_limit = Utils.multipart_total_part_limit - - if file_limit && file_limit > 0 - if @open_files >= file_limit - @mime_parts.each(&:close) - raise MultipartPartLimitError, 'Maximum file multiparts in content reached' - end - end - - if part_limit && part_limit > 0 - if @mime_parts.size >= part_limit - @mime_parts.each(&:close) - raise MultipartTotalPartLimitError, 'Maximum total multiparts in content reached' - end - end - end - end - - attr_reader :state - - def initialize(boundary, tempfile, bufsize, query_parser) - @query_parser = query_parser - @params = query_parser.make_params - @bufsize = bufsize - - @state = :FAST_FORWARD - @mime_index = 0 - @collector = Collector.new tempfile - - @sbuf = StringScanner.new("".dup) - @body_regex = /(?:#{EOL}|\A)--#{Regexp.quote(boundary)}(?:#{EOL}|--)/m - @body_regex_at_end = /#{@body_regex}\z/m - @end_boundary_size = boundary.bytesize + 4 # (-- at start, -- at finish) - @rx_max_size = boundary.bytesize + 6 # (\r\n-- at start, either \r\n or -- at finish) - @head_regex = /(.*?#{EOL})#{EOL}/m - end - - def parse(io) - outbuf = String.new - read_data(io, outbuf) - - loop do - status = - case @state - when :FAST_FORWARD - handle_fast_forward - when :CONSUME_TOKEN - handle_consume_token - when :MIME_HEAD - handle_mime_head - when :MIME_BODY - handle_mime_body - else # when :DONE - return - end - - read_data(io, outbuf) if status == :want_read - end - end - - def result - @collector.each do |part| - part.get_data do |data| - tag_multipart_encoding(part.filename, part.content_type, part.name, data) - name, data = handle_dummy_encoding(part.name, data) - @query_parser.normalize_params(@params, name, data) - end - end - MultipartInfo.new @params.to_params_hash, @collector.find_all(&:file?).map(&:body) - end - - private - - def read_data(io, outbuf) - content = io.read(@bufsize, outbuf) - handle_empty_content!(content) - @sbuf.concat(content) - end - - # This handles the initial parser state. We read until we find the starting - # boundary, then we can transition to the next state. If we find the ending - # boundary, this is an invalid multipart upload, but keep scanning for opening - # boundary in that case. If no boundary found, we need to keep reading data - # and retry. It's highly unlikely the initial read will not consume the - # boundary. The client would have to deliberately craft a response - # with the opening boundary beyond the buffer size for that to happen. - def handle_fast_forward - while true - case consume_boundary - when :BOUNDARY - # found opening boundary, transition to next state - @state = :MIME_HEAD - return - when :END_BOUNDARY - # invalid multipart upload - if @sbuf.pos == @end_boundary_size && @sbuf.rest == EOL - # stop parsing a buffer if a buffer is only an end boundary. - @state = :DONE - return - end - - # retry for opening boundary - else - # no boundary found, keep reading data - return :want_read - end - end - end - - def handle_consume_token - tok = consume_boundary - # break if we're at the end of a buffer, but not if it is the end of a field - @state = if tok == :END_BOUNDARY || (@sbuf.eos? && tok != :BOUNDARY) - :DONE - else - :MIME_HEAD - end - end - - CONTENT_DISPOSITION_MAX_PARAMS = 16 - CONTENT_DISPOSITION_MAX_BYTES = 1536 - def handle_mime_head - if @sbuf.scan_until(@head_regex) - head = @sbuf[1] - content_type = head[MULTIPART_CONTENT_TYPE, 1] - if (disposition = head[MULTIPART_CONTENT_DISPOSITION, 1]) && - disposition.bytesize <= CONTENT_DISPOSITION_MAX_BYTES - - # ignore actual content-disposition value (should always be form-data) - i = disposition.index(';') - disposition.slice!(0, i+1) - param = nil - num_params = 0 - - # Parse parameter list - while i = disposition.index('=') - # Only parse up to max parameters, to avoid potential denial of service - num_params += 1 - break if num_params > CONTENT_DISPOSITION_MAX_PARAMS - - # Found end of parameter name, ensure forward progress in loop - param = disposition.slice!(0, i+1) - - # Remove ending equals and preceding whitespace from parameter name - param.chomp!('=') - param.lstrip! - - if disposition[0] == '"' - # Parameter value is quoted, parse it, handling backslash escapes - disposition.slice!(0, 1) - value = String.new - - while i = disposition.index(/(["\\])/) - c = $1 - - # Append all content until ending quote or escape - value << disposition.slice!(0, i) - - # Remove either backslash or ending quote, - # ensures forward progress in loop - disposition.slice!(0, 1) - - # stop parsing parameter value if found ending quote - break if c == '"' - - escaped_char = disposition.slice!(0, 1) - if param == 'filename' && escaped_char != '"' - # Possible IE uploaded filename, append both escape backslash and value - value << c << escaped_char - else - # Other only append escaped value - value << escaped_char - end - end - else - if i = disposition.index(';') - # Parameter value unquoted (which may be invalid), value ends at semicolon - value = disposition.slice!(0, i) - else - # If no ending semicolon, assume remainder of line is value and stop - # parsing - disposition.strip! - value = disposition - disposition = '' - end - end - - case param - when 'name' - name = value - when 'filename' - filename = value - when 'filename*' - filename_star = value - # else - # ignore other parameters - end - - # skip trailing semicolon, to proceed to next parameter - if i = disposition.index(';') - disposition.slice!(0, i+1) - end - end - else - name = head[MULTIPART_CONTENT_ID, 1] - end - - if filename_star - encoding, _, filename = filename_star.split("'", 3) - filename = normalize_filename(filename || '') - filename.force_encoding(find_encoding(encoding)) - elsif filename - filename = normalize_filename(filename) - end - - if name.nil? || name.empty? - name = filename || "#{content_type || TEXT_PLAIN}[]".dup - end - - @collector.on_mime_head @mime_index, head, filename, content_type, name - @state = :MIME_BODY - else - :want_read - end - end - - def handle_mime_body - if (body_with_boundary = @sbuf.check_until(@body_regex)) # check but do not advance the pointer yet - body = body_with_boundary.sub(@body_regex_at_end, '') # remove the boundary from the string - @collector.on_mime_body @mime_index, body - @sbuf.pos += body.length + 2 # skip \r\n after the content - @state = :CONSUME_TOKEN - @mime_index += 1 - else - # Save what we have so far - if @rx_max_size < @sbuf.rest_size - delta = @sbuf.rest_size - @rx_max_size - @collector.on_mime_body @mime_index, @sbuf.peek(delta) - @sbuf.pos += delta - @sbuf.string = @sbuf.rest - end - :want_read - end - end - - # Scan until the we find the start or end of the boundary. - # If we find it, return the appropriate symbol for the start or - # end of the boundary. If we don't find the start or end of the - # boundary, clear the buffer and return nil. - def consume_boundary - if read_buffer = @sbuf.scan_until(@body_regex) - read_buffer.end_with?(EOL) ? :BOUNDARY : :END_BOUNDARY - else - @sbuf.terminate - nil - end - end - - def normalize_filename(filename) - if filename.scan(/%.?.?/).all? { |s| /%[0-9a-fA-F]{2}/.match?(s) } - filename = Utils.unescape_path(filename) - end - - filename.scrub! - - filename.split(/[\/\\]/).last || String.new - end - - CHARSET = "charset" - deprecate_constant :CHARSET - - def tag_multipart_encoding(filename, content_type, name, body) - name = name.to_s - encoding = Encoding::UTF_8 - - name.force_encoding(encoding) - - return if filename - - if content_type - list = content_type.split(';') - type_subtype = list.first - type_subtype.strip! - if TEXT_PLAIN == type_subtype - rest = list.drop 1 - rest.each do |param| - k, v = param.split('=', 2) - k.strip! - v.strip! - v = v[1..-2] if v.start_with?('"') && v.end_with?('"') - if k == "charset" - encoding = find_encoding(v) - end - end - end - end - - name.force_encoding(encoding) - body.force_encoding(encoding) - end - - # Return the related Encoding object. However, because - # enc is submitted by the user, it may be invalid, so - # use a binary encoding in that case. - def find_encoding(enc) - Encoding.find enc - rescue ArgumentError - Encoding::BINARY - end - - REENCODE_DUMMY_ENCODINGS = { - # ISO-2022-JP is a legacy but still widely used encoding in Japan - # Here we convert ISO-2022-JP to UTF-8 so that it can be handled. - Encoding::ISO_2022_JP => true - - # Other dummy encodings are rarely used and have not been supported yet. - # Adding support for them will require careful considerations. - } - - def handle_dummy_encoding(name, body) - # A string object with a 'dummy' encoding does not have full functionality and can cause errors. - # So here we covert it to UTF-8 so that it can be handled properly. - if name.encoding.dummy? && REENCODE_DUMMY_ENCODINGS[name.encoding] - name = name.encode(Encoding::UTF_8) - body = body.encode(Encoding::UTF_8) - end - return name, body - end - - def handle_empty_content!(content) - if content.nil? || content.empty? - raise EmptyContentError - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/uploaded_file.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/uploaded_file.rb deleted file mode 100644 index 513d8a2..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/multipart/uploaded_file.rb +++ /dev/null @@ -1,82 +0,0 @@ -# frozen_string_literal: true - -require 'tempfile' -require 'fileutils' - -module Rack - module Multipart - # Despite the misleading name, UploadedFile is designed for use for - # preparing multipart file upload bodies, generally for use in tests. - # It is not designed for and should not be used for handling uploaded - # files (there is no need for that, since Rack's multipart parser - # already creates Tempfiles for that). Using this with non-trusted - # filenames can create a security vulnerability. - # - # You should only use this class if you plan on passing the instances - # to Rack::MockRequest for use in creating multipart request bodies. - # - # UploadedFile delegates most methods to the tempfile it contains. - class UploadedFile - # The provided name of the file. This generally is the basename of - # path provided during initialization, but it can contain slashes if they - # were present in the filename argument when the instance was created. - attr_reader :original_filename - - # The content type of the instance. - attr_accessor :content_type - - # Create a new UploadedFile. For backwards compatibility, this accepts - # both positional and keyword versions of the same arguments: - # - # filepath/path :: The path to the file - # ct/content_type :: The content_type of the file - # bin/binary :: Whether to set binmode on the file before copying data into it. - # - # If both positional and keyword arguments are present, the keyword arguments - # take precedence. - # - # The following keyword-only arguments are also accepted: - # - # filename :: Override the filename to use for the file. This is so the - # filename for the upload does not need to match the basename of - # the file path. This should not contain slashes, unless you are - # trying to test how an application handles invalid filenames in - # multipart upload bodies. - # io :: Use the given IO-like instance as the tempfile, instead of creating - # a Tempfile instance. This is useful for building multipart file - # upload bodies without a file being present on the filesystem. If you are - # providing this, you should also provide the filename argument. - def initialize(filepath = nil, ct = "text/plain", bin = false, - path: filepath, content_type: ct, binary: bin, filename: nil, io: nil) - if io - @tempfile = io - @original_filename = filename - else - raise "#{path} file does not exist" unless ::File.exist?(path) - @original_filename = filename || ::File.basename(path) - @tempfile = Tempfile.new([@original_filename, ::File.extname(path)], encoding: Encoding::BINARY) - @tempfile.binmode if binary - FileUtils.copy_file(path, @tempfile.path) - end - @content_type = content_type - end - - # The path of the tempfile for the instance, if the tempfile has a path. - # nil if the tempfile does not have a path. - def path - @tempfile.path if @tempfile.respond_to?(:path) - end - alias_method :local_path, :path - - # Return true if the tempfile responds to the method. - def respond_to_missing?(*args) - @tempfile.respond_to?(*args) - end - - # Delegate method missing calls to the tempfile. - def method_missing(method_name, *args, &block) #:nodoc: - @tempfile.__send__(method_name, *args, &block) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/null_logger.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/null_logger.rb deleted file mode 100644 index 52fc125..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/null_logger.rb +++ /dev/null @@ -1,48 +0,0 @@ -# frozen_string_literal: true - -require_relative 'constants' - -module Rack - class NullLogger - def initialize(app) - @app = app - end - - def call(env) - env[RACK_LOGGER] = self - @app.call(env) - end - - def info(progname = nil, &block); end - def debug(progname = nil, &block); end - def warn(progname = nil, &block); end - def error(progname = nil, &block); end - def fatal(progname = nil, &block); end - def unknown(progname = nil, &block); end - def info? ; end - def debug? ; end - def warn? ; end - def error? ; end - def fatal? ; end - def debug! ; end - def error! ; end - def fatal! ; end - def info! ; end - def warn! ; end - def level ; end - def progname ; end - def datetime_format ; end - def formatter ; end - def sev_threshold ; end - def level=(level); end - def progname=(progname); end - def datetime_format=(datetime_format); end - def formatter=(formatter); end - def sev_threshold=(sev_threshold); end - def close ; end - def add(severity, message = nil, progname = nil, &block); end - def log(severity, message = nil, progname = nil, &block); end - def <<(msg); end - def reopen(logdev = nil); end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/query_parser.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/query_parser.rb deleted file mode 100644 index 28eeaa0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/query_parser.rb +++ /dev/null @@ -1,259 +0,0 @@ -# frozen_string_literal: true - -require_relative 'bad_request' -require 'uri' - -module Rack - class QueryParser - DEFAULT_SEP = /& */n - COMMON_SEP = { ";" => /; */n, ";," => /[;,] */n, "&" => /& */n } - - # ParameterTypeError is the error that is raised when incoming structural - # parameters (parsed by parse_nested_query) contain conflicting types. - class ParameterTypeError < TypeError - include BadRequest - end - - # InvalidParameterError is the error that is raised when incoming structural - # parameters (parsed by parse_nested_query) contain invalid format or byte - # sequence. - class InvalidParameterError < ArgumentError - include BadRequest - end - - # QueryLimitError is for errors raised when the query provided exceeds one - # of the query parser limits. - class QueryLimitError < RangeError - include BadRequest - end - - # ParamsTooDeepError is the old name for the error that is raised when params - # are recursively nested over the specified limit. Make it the same as - # as QueryLimitError, so that code that rescues ParamsTooDeepError error - # to handle bad query strings also now handles other limits. - ParamsTooDeepError = QueryLimitError - - def self.make_default(param_depth_limit, **options) - new(Params, param_depth_limit, **options) - end - - attr_reader :param_depth_limit - - env_int = lambda do |key, val| - if str_val = ENV[key] - begin - val = Integer(str_val, 10) - rescue ArgumentError - raise ArgumentError, "non-integer value provided for environment variable #{key}" - end - end - - val - end - - BYTESIZE_LIMIT = env_int.call("RACK_QUERY_PARSER_BYTESIZE_LIMIT", 4194304) - private_constant :BYTESIZE_LIMIT - - PARAMS_LIMIT = env_int.call("RACK_QUERY_PARSER_PARAMS_LIMIT", 4096) - private_constant :PARAMS_LIMIT - - def initialize(params_class, param_depth_limit, bytesize_limit: BYTESIZE_LIMIT, params_limit: PARAMS_LIMIT) - @params_class = params_class - @param_depth_limit = param_depth_limit - @bytesize_limit = bytesize_limit - @params_limit = params_limit - end - - # Stolen from Mongrel, with some small modifications: - # Parses a query string by breaking it up at the '&'. You can also use this - # to parse cookies by changing the characters used in the second parameter - # (which defaults to '&'). - def parse_query(qs, separator = nil, &unescaper) - params = make_params - - each_query_pair(qs, separator, unescaper) do |k, v| - if cur = params[k] - if cur.class == Array - params[k] << v - else - params[k] = [cur, v] - end - else - params[k] = v - end - end - - return params.to_h - end - - # Parses a query string by breaking it up at the '&', returning all key-value - # pairs as an array of [key, value] arrays. Unlike parse_query, this preserves - # all duplicate keys rather than collapsing them. - def parse_query_pairs(qs, separator = nil) - pairs = [] - - each_query_pair(qs, separator) do |k, v| - pairs << [k, v] - end - - pairs - end - - # parse_nested_query expands a query string into structural types. Supported - # types are Arrays, Hashes and basic value types. It is possible to supply - # query strings with parameters of conflicting types, in this case a - # ParameterTypeError is raised. Users are encouraged to return a 400 in this - # case. - def parse_nested_query(qs, separator = nil) - params = make_params - - each_query_pair(qs, separator) do |k, v| - _normalize_params(params, k, v, 0) - end - - return params.to_h - end - - # normalize_params recursively expands parameters into structural types. If - # the structural types represented by two different parameter names are in - # conflict, a ParameterTypeError is raised. The depth argument is deprecated - # and should no longer be used, it is kept for backwards compatibility with - # earlier versions of rack. - def normalize_params(params, name, v, _depth=nil) - _normalize_params(params, name, v, 0) - end - - private def _normalize_params(params, name, v, depth) - raise ParamsTooDeepError if depth >= param_depth_limit - - if !name - # nil name, treat same as empty string (required by tests) - k = after = '' - elsif depth == 0 - # Start of parsing, don't treat [] or [ at start of string specially - if start = name.index('[', 1) - # Start of parameter nesting, use part before brackets as key - k = name[0, start] - after = name[start, name.length] - else - # Plain parameter with no nesting - k = name - after = '' - end - elsif name.start_with?('[]') - # Array nesting - k = '[]' - after = name[2, name.length] - elsif name.start_with?('[') && (start = name.index(']', 1)) - # Hash nesting, use the part inside brackets as the key - k = name[1, start-1] - after = name[start+1, name.length] - else - # Probably malformed input, nested but not starting with [ - # treat full name as key for backwards compatibility. - k = name - after = '' - end - - return if k.empty? - - if after == '' - if k == '[]' && depth != 0 - return [v] - else - params[k] = v - end - elsif after == "[" - params[name] = v - elsif after == "[]" - params[k] ||= [] - raise ParameterTypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array) - params[k] << v - elsif after.start_with?('[]') - # Recognize x[][y] (hash inside array) parameters - unless after[2] == '[' && after.end_with?(']') && (child_key = after[3, after.length-4]) && !child_key.empty? && !child_key.index('[') && !child_key.index(']') - # Handle other nested array parameters - child_key = after[2, after.length] - end - params[k] ||= [] - raise ParameterTypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array) - if params_hash_type?(params[k].last) && !params_hash_has_key?(params[k].last, child_key) - _normalize_params(params[k].last, child_key, v, depth + 1) - else - params[k] << _normalize_params(make_params, child_key, v, depth + 1) - end - else - params[k] ||= make_params - raise ParameterTypeError, "expected Hash (got #{params[k].class.name}) for param `#{k}'" unless params_hash_type?(params[k]) - params[k] = _normalize_params(params[k], after, v, depth + 1) - end - - params - end - - def make_params - @params_class.new - end - - def new_depth_limit(param_depth_limit) - self.class.new @params_class, param_depth_limit - end - - private - - def params_hash_type?(obj) - obj.kind_of?(@params_class) - end - - def params_hash_has_key?(hash, key) - return false if /\[\]/.match?(key) - - key.split(/[\[\]]+/).inject(hash) do |h, part| - next h if part == '' - return false unless params_hash_type?(h) && h.key?(part) - h[part] - end - - true - end - - def each_query_pair(qs, separator, unescaper = nil) - return if !qs || qs.empty? - - if qs.bytesize > @bytesize_limit - raise QueryLimitError, "total query size (#{qs.bytesize}) exceeds limit (#{@bytesize_limit})" - end - - pairs = qs.split(separator ? (COMMON_SEP[separator] || /[#{separator}] */n) : DEFAULT_SEP, @params_limit + 1) - - if pairs.size > @params_limit - param_count = pairs.size + pairs.last.count(separator || "&") - raise QueryLimitError, "total number of query parameters (#{param_count}) exceeds limit (#{@params_limit})" - end - - if unescaper - pairs.each do |p| - next if p.empty? - k, v = p.split('=', 2).map!(&unescaper) - yield k, v - end - else - pairs.each do |p| - next if p.empty? - k, v = p.split('=', 2).map! { |s| unescape(s) } - yield k, v - end - end - rescue ArgumentError => e - raise InvalidParameterError, e.message, e.backtrace - end - - def unescape(string, encoding = Encoding::UTF_8) - URI.decode_www_form_component(string, encoding) - end - - class Params < Hash - alias_method :to_params_hash, :to_h - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/recursive.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/recursive.rb deleted file mode 100644 index 0945d32..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/recursive.rb +++ /dev/null @@ -1,66 +0,0 @@ -# frozen_string_literal: true - -require 'uri' - -require_relative 'constants' - -module Rack - # Rack::ForwardRequest gets caught by Rack::Recursive and redirects - # the current request to the app at +url+. - # - # raise ForwardRequest.new("/not-found") - # - - class ForwardRequest < Exception - attr_reader :url, :env - - def initialize(url, env = {}) - @url = URI(url) - @env = env - - @env[PATH_INFO] = @url.path - @env[QUERY_STRING] = @url.query if @url.query - @env[HTTP_HOST] = @url.host if @url.host - @env[HTTP_PORT] = @url.port if @url.port - @env[RACK_URL_SCHEME] = @url.scheme if @url.scheme - - super "forwarding to #{url}" - end - end - - # Rack::Recursive allows applications called down the chain to - # include data from other applications (by using - # rack['rack.recursive.include'][...] or raise a - # ForwardRequest to redirect internally. - - class Recursive - def initialize(app) - @app = app - end - - def call(env) - dup._call(env) - end - - def _call(env) - @script_name = env[SCRIPT_NAME] - @app.call(env.merge(RACK_RECURSIVE_INCLUDE => method(:include))) - rescue ForwardRequest => req - call(env.merge(req.env)) - end - - def include(env, path) - unless path.index(@script_name) == 0 && (path[@script_name.size] == ?/ || - path[@script_name.size].nil?) - raise ArgumentError, "can only include below #{@script_name}, not #{path}" - end - - env = env.merge(PATH_INFO => path, - SCRIPT_NAME => @script_name, - REQUEST_METHOD => GET, - "CONTENT_LENGTH" => "0", "CONTENT_TYPE" => "", - RACK_INPUT => StringIO.new("")) - @app.call(env) - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/reloader.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/reloader.rb deleted file mode 100644 index a15064a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/reloader.rb +++ /dev/null @@ -1,112 +0,0 @@ -# frozen_string_literal: true - -# Copyright (C) 2009-2018 Michael Fellinger -# Rack::Reloader is subject to the terms of an MIT-style license. -# See MIT-LICENSE or https://opensource.org/licenses/MIT. - -require 'pathname' - -module Rack - - # High performant source reloader - # - # This class acts as Rack middleware. - # - # What makes it especially suited for use in a production environment is that - # any file will only be checked once and there will only be made one system - # call stat(2). - # - # Please note that this will not reload files in the background, it does so - # only when actively called. - # - # It is performing a check/reload cycle at the start of every request, but - # also respects a cool down time, during which nothing will be done. - class Reloader - def initialize(app, cooldown = 10, backend = Stat) - @app = app - @cooldown = cooldown - @last = (Time.now - cooldown) - @cache = {} - @mtimes = {} - @reload_mutex = Mutex.new - - extend backend - end - - def call(env) - if @cooldown and Time.now > @last + @cooldown - if Thread.list.size > 1 - @reload_mutex.synchronize{ reload! } - else - reload! - end - - @last = Time.now - end - - @app.call(env) - end - - def reload!(stderr = $stderr) - rotation do |file, mtime| - previous_mtime = @mtimes[file] ||= mtime - safe_load(file, mtime, stderr) if mtime > previous_mtime - end - end - - # A safe Kernel::load, issuing the hooks depending on the results - def safe_load(file, mtime, stderr = $stderr) - load(file) - stderr.puts "#{self.class}: reloaded `#{file}'" - file - rescue LoadError, SyntaxError => ex - stderr.puts ex - ensure - @mtimes[file] = mtime - end - - module Stat - def rotation - files = [$0, *$LOADED_FEATURES].uniq - paths = ['./', *$LOAD_PATH].uniq - - files.map{|file| - next if /\.(so|bundle)$/.match?(file) # cannot reload compiled files - - found, stat = figure_path(file, paths) - next unless found && stat && mtime = stat.mtime - - @cache[file] = found - - yield(found, mtime) - }.compact - end - - # Takes a relative or absolute +file+ name, a couple possible +paths+ that - # the +file+ might reside in. Returns the full path and File::Stat for the - # path. - def figure_path(file, paths) - found = @cache[file] - found = file if !found and Pathname.new(file).absolute? - found, stat = safe_stat(found) - return found, stat if found - - paths.find do |possible_path| - path = ::File.join(possible_path, file) - found, stat = safe_stat(path) - return ::File.expand_path(found), stat if found - end - - return false, false - end - - def safe_stat(file) - return unless file - stat = ::File.stat(file) - return file, stat if stat.file? - rescue Errno::ENOENT, Errno::ENOTDIR, Errno::ESRCH - @cache.delete(file) and false - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/request.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/request.rb deleted file mode 100644 index d08c6f5..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/request.rb +++ /dev/null @@ -1,787 +0,0 @@ -# frozen_string_literal: true - -require_relative 'constants' -require_relative 'utils' -require_relative 'media_type' - -module Rack - # Rack::Request provides a convenient interface to a Rack - # environment. It is stateless, the environment +env+ passed to the - # constructor will be directly modified. - # - # req = Rack::Request.new(env) - # req.post? - # req.params["data"] - - class Request - class << self - attr_accessor :ip_filter - - # The priority when checking forwarded headers. The default - # is [:forwarded, :x_forwarded], which means, check the - # +Forwarded+ header first, followed by the appropriate - # X-Forwarded-* header. You can revert the priority by - # reversing the priority, or remove checking of either - # or both headers by removing elements from the array. - # - # This should be set as appropriate in your environment - # based on what reverse proxies are in use. If you are not - # using reverse proxies, you should probably use an empty - # array. - attr_accessor :forwarded_priority - - # The priority when checking either the X-Forwarded-Proto - # or X-Forwarded-Scheme header for the forwarded protocol. - # The default is [:proto, :scheme], to try the - # X-Forwarded-Proto header before the - # X-Forwarded-Scheme header. Rack 2 had behavior - # similar to [:scheme, :proto]. You can remove either or - # both of the entries in array to ignore that respective header. - attr_accessor :x_forwarded_proto_priority - end - - @forwarded_priority = [:forwarded, :x_forwarded] - @x_forwarded_proto_priority = [:proto, :scheme] - - valid_ipv4_octet = /\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])/ - - trusted_proxies = Regexp.union( - /\A127#{valid_ipv4_octet}{3}\z/, # localhost IPv4 range 127.x.x.x, per RFC-3330 - /\A::1\z/, # localhost IPv6 ::1 - /\Af[cd][0-9a-f]{2}(?::[0-9a-f]{0,4}){0,7}\z/i, # private IPv6 range fc00 .. fdff - /\A10#{valid_ipv4_octet}{3}\z/, # private IPv4 range 10.x.x.x - /\A172\.(1[6-9]|2[0-9]|3[01])#{valid_ipv4_octet}{2}\z/, # private IPv4 range 172.16.0.0 .. 172.31.255.255 - /\A192\.168#{valid_ipv4_octet}{2}\z/, # private IPv4 range 192.168.x.x - /\Alocalhost\z|\Aunix(\z|:)/i, # localhost hostname, and unix domain sockets - ) - - self.ip_filter = lambda { |ip| trusted_proxies.match?(ip) } - - ALLOWED_SCHEMES = %w(https http wss ws).freeze - - def initialize(env) - @env = env - @ip = nil - @params = nil - end - - def ip - @ip ||= super - end - - def params - @params ||= super - end - - def update_param(k, v) - super - @params = nil - end - - def delete_param(k) - v = super - @params = nil - v - end - - module Env - # The environment of the request. - attr_reader :env - - def initialize(env) - @env = env - # This module is included at least in `ActionDispatch::Request` - # The call to `super()` allows additional mixed-in initializers are called - super() - end - - # Predicate method to test to see if `name` has been set as request - # specific data - def has_header?(name) - @env.key? name - end - - # Get a request specific value for `name`. - def get_header(name) - @env[name] - end - - # If a block is given, it yields to the block if the value hasn't been set - # on the request. - def fetch_header(name, &block) - @env.fetch(name, &block) - end - - # Loops through each key / value pair in the request specific data. - def each_header(&block) - @env.each(&block) - end - - # Set a request specific value for `name` to `v` - def set_header(name, v) - @env[name] = v - end - - # Add a header that may have multiple values. - # - # Example: - # request.add_header 'Accept', 'image/png' - # request.add_header 'Accept', '*/*' - # - # assert_equal 'image/png,*/*', request.get_header('Accept') - # - # http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 - def add_header(key, v) - if v.nil? - get_header key - elsif has_header? key - set_header key, "#{get_header key},#{v}" - else - set_header key, v - end - end - - # Delete a request specific value for `name`. - def delete_header(name) - @env.delete name - end - - def initialize_copy(other) - @env = other.env.dup - end - end - - module Helpers - # The set of form-data media-types. Requests that do not indicate - # one of the media types present in this list will not be eligible - # for form-data / param parsing. - FORM_DATA_MEDIA_TYPES = [ - 'application/x-www-form-urlencoded', - 'multipart/form-data' - ] - - # The set of media-types. Requests that do not indicate - # one of the media types present in this list will not be eligible - # for param parsing like soap attachments or generic multiparts - PARSEABLE_DATA_MEDIA_TYPES = [ - 'multipart/related', - 'multipart/mixed' - ] - - # Default ports depending on scheme. Used to decide whether or not - # to include the port in a generated URI. - DEFAULT_PORTS = { 'http' => 80, 'https' => 443, 'coffee' => 80 } - - # The address of the client which connected to the proxy. - HTTP_X_FORWARDED_FOR = 'HTTP_X_FORWARDED_FOR' - - # The contents of the host/:authority header sent to the proxy. - HTTP_X_FORWARDED_HOST = 'HTTP_X_FORWARDED_HOST' - - HTTP_FORWARDED = 'HTTP_FORWARDED' - - # The value of the scheme sent to the proxy. - HTTP_X_FORWARDED_SCHEME = 'HTTP_X_FORWARDED_SCHEME' - - # The protocol used to connect to the proxy. - HTTP_X_FORWARDED_PROTO = 'HTTP_X_FORWARDED_PROTO' - - # The port used to connect to the proxy. - HTTP_X_FORWARDED_PORT = 'HTTP_X_FORWARDED_PORT' - - # Another way for specifying https scheme was used. - HTTP_X_FORWARDED_SSL = 'HTTP_X_FORWARDED_SSL' - - def body; get_header(RACK_INPUT) end - def script_name; get_header(SCRIPT_NAME).to_s end - def script_name=(s); set_header(SCRIPT_NAME, s.to_s) end - - def path_info; get_header(PATH_INFO).to_s end - def path_info=(s); set_header(PATH_INFO, s.to_s) end - - def request_method; get_header(REQUEST_METHOD) end - def query_string; get_header(QUERY_STRING).to_s end - def content_length; get_header('CONTENT_LENGTH') end - def logger; get_header(RACK_LOGGER) end - def user_agent; get_header('HTTP_USER_AGENT') end - - # the referer of the client - def referer; get_header('HTTP_REFERER') end - alias referrer referer - - def session - fetch_header(RACK_SESSION) do |k| - set_header RACK_SESSION, default_session - end - end - - def session_options - fetch_header(RACK_SESSION_OPTIONS) do |k| - set_header RACK_SESSION_OPTIONS, {} - end - end - - # Checks the HTTP request method (or verb) to see if it was of type DELETE - def delete?; request_method == DELETE end - - # Checks the HTTP request method (or verb) to see if it was of type GET - def get?; request_method == GET end - - # Checks the HTTP request method (or verb) to see if it was of type HEAD - def head?; request_method == HEAD end - - # Checks the HTTP request method (or verb) to see if it was of type OPTIONS - def options?; request_method == OPTIONS end - - # Checks the HTTP request method (or verb) to see if it was of type LINK - def link?; request_method == LINK end - - # Checks the HTTP request method (or verb) to see if it was of type PATCH - def patch?; request_method == PATCH end - - # Checks the HTTP request method (or verb) to see if it was of type POST - def post?; request_method == POST end - - # Checks the HTTP request method (or verb) to see if it was of type PUT - def put?; request_method == PUT end - - # Checks the HTTP request method (or verb) to see if it was of type TRACE - def trace?; request_method == TRACE end - - # Checks the HTTP request method (or verb) to see if it was of type UNLINK - def unlink?; request_method == UNLINK end - - def scheme - if get_header(HTTPS) == 'on' - 'https' - elsif get_header(HTTP_X_FORWARDED_SSL) == 'on' - 'https' - elsif forwarded_scheme - forwarded_scheme - else - get_header(RACK_URL_SCHEME) - end - end - - # The authority of the incoming request as defined by RFC3976. - # https://tools.ietf.org/html/rfc3986#section-3.2 - # - # In HTTP/1, this is the `host` header. - # In HTTP/2, this is the `:authority` pseudo-header. - def authority - forwarded_authority || host_authority || server_authority - end - - # The authority as defined by the `SERVER_NAME` and `SERVER_PORT` - # variables. - def server_authority - host = self.server_name - port = self.server_port - - if host - if port - "#{host}:#{port}" - else - host - end - end - end - - def server_name - get_header(SERVER_NAME) - end - - def server_port - get_header(SERVER_PORT) - end - - def cookies - hash = fetch_header(RACK_REQUEST_COOKIE_HASH) do |key| - set_header(key, {}) - end - - string = get_header(HTTP_COOKIE) - - unless string == get_header(RACK_REQUEST_COOKIE_STRING) - hash.replace Utils.parse_cookies_header(string) - set_header(RACK_REQUEST_COOKIE_STRING, string) - end - - hash - end - - def content_type - content_type = get_header('CONTENT_TYPE') - content_type.nil? || content_type.empty? ? nil : content_type - end - - def xhr? - get_header("HTTP_X_REQUESTED_WITH") == "XMLHttpRequest" - end - - # The `HTTP_HOST` header. - def host_authority - get_header(HTTP_HOST) - end - - def host_with_port(authority = self.authority) - host, _, port = split_authority(authority) - - if port == DEFAULT_PORTS[self.scheme] - host - else - authority - end - end - - # Returns a formatted host, suitable for being used in a URI. - def host - split_authority(self.authority)[0] - end - - # Returns an address suitable for being to resolve to an address. - # In the case of a domain name or IPv4 address, the result is the same - # as +host+. In the case of IPv6 or future address formats, the square - # brackets are removed. - def hostname - split_authority(self.authority)[1] - end - - def port - if authority = self.authority - _, _, port = split_authority(authority) - end - - port || forwarded_port&.last || DEFAULT_PORTS[scheme] || server_port - end - - def forwarded_for - forwarded_priority.each do |type| - case type - when :forwarded - if forwarded_for = get_http_forwarded(:for) - return(forwarded_for.map! do |authority| - split_authority(authority)[1] - end) - end - when :x_forwarded - if value = get_header(HTTP_X_FORWARDED_FOR) - return(split_header(value).map do |authority| - split_authority(wrap_ipv6(authority))[1] - end) - end - end - end - - nil - end - - def forwarded_port - forwarded_priority.each do |type| - case type - when :forwarded - if forwarded = get_http_forwarded(:for) - return(forwarded.map do |authority| - split_authority(authority)[2] - end.compact) - end - when :x_forwarded - if value = get_header(HTTP_X_FORWARDED_PORT) - return split_header(value).map(&:to_i) - end - end - end - - nil - end - - def forwarded_authority - forwarded_priority.each do |type| - case type - when :forwarded - if forwarded = get_http_forwarded(:host) - return forwarded.last - end - when :x_forwarded - if (value = get_header(HTTP_X_FORWARDED_HOST)) && (x_forwarded_host = split_header(value).last) - return wrap_ipv6(x_forwarded_host) - end - end - end - - nil - end - - def ssl? - scheme == 'https' || scheme == 'wss' - end - - def ip - remote_addresses = split_header(get_header('REMOTE_ADDR')) - - remote_addresses.reverse_each do |ip| - return ip unless trusted_proxy?(ip) - end - - if (forwarded_for = self.forwarded_for) && !forwarded_for.empty? - # The forwarded for addresses are ordered: client, proxy1, proxy2. - # So we reject all the trusted addresses (proxy*) and return the - # last client. Or if we trust everyone, we just return the first - # address. - forwarded_for.reverse_each do |ip| - return ip unless trusted_proxy?(ip) - end - return forwarded_for.first - end - - # If all the addresses are trusted, and we aren't forwarded, just return - # the first remote address, which represents the source of the request. - remote_addresses.first - end - - # The media type (type/subtype) portion of the CONTENT_TYPE header - # without any media type parameters. e.g., when CONTENT_TYPE is - # "text/plain;charset=utf-8", the media-type is "text/plain". - # - # For more information on the use of media types in HTTP, see: - # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7 - def media_type - MediaType.type(content_type) - end - - # The media type parameters provided in CONTENT_TYPE as a Hash, or - # an empty Hash if no CONTENT_TYPE or media-type parameters were - # provided. e.g., when the CONTENT_TYPE is "text/plain;charset=utf-8", - # this method responds with the following Hash: - # { 'charset' => 'utf-8' } - def media_type_params - MediaType.params(content_type) - end - - # The character set of the request body if a "charset" media type - # parameter was given, or nil if no "charset" was specified. Note - # that, per RFC2616, text/* media types that specify no explicit - # charset are to be considered ISO-8859-1. - def content_charset - media_type_params['charset'] - end - - # Determine whether the request body contains form-data by checking - # the request content-type for one of the media-types: - # "application/x-www-form-urlencoded" or "multipart/form-data". The - # list of form-data media types can be modified through the - # +FORM_DATA_MEDIA_TYPES+ array. - # - # A request body is also assumed to contain form-data when no - # content-type header is provided and the request_method is POST. - def form_data? - type = media_type - meth = get_header(RACK_METHODOVERRIDE_ORIGINAL_METHOD) || get_header(REQUEST_METHOD) - - (meth == POST && type.nil?) || FORM_DATA_MEDIA_TYPES.include?(type) - end - - # Determine whether the request body contains data by checking - # the request media_type against registered parse-data media-types - def parseable_data? - PARSEABLE_DATA_MEDIA_TYPES.include?(media_type) - end - - # Returns the data received in the query string. - def GET - get_header(RACK_REQUEST_QUERY_HASH) || set_header(RACK_REQUEST_QUERY_HASH, parse_query(query_string, '&')) - end - - # Returns the form data pairs received in the request body. - # - # This method support both application/x-www-form-urlencoded and - # multipart/form-data. - def form_pairs - if pairs = get_header(RACK_REQUEST_FORM_PAIRS) - return pairs - elsif error = get_header(RACK_REQUEST_FORM_ERROR) - raise error.class, error.message, cause: error.cause - end - - begin - rack_input = get_header(RACK_INPUT) - - # Otherwise, figure out how to parse the input: - if rack_input.nil? - set_header(RACK_REQUEST_FORM_PAIRS, []) - elsif form_data? || parseable_data? - if pairs = Rack::Multipart.parse_multipart(env, Rack::Multipart::ParamList) - set_header RACK_REQUEST_FORM_PAIRS, pairs - else - form_vars = get_header(RACK_INPUT).read - - # Fix for Safari Ajax postings that always append \0 - # form_vars.sub!(/\0\z/, '') # performance replacement: - form_vars.slice!(-1) if form_vars.end_with?("\0") - - set_header RACK_REQUEST_FORM_VARS, form_vars - pairs = query_parser.parse_query_pairs(form_vars, '&') - set_header(RACK_REQUEST_FORM_PAIRS, pairs) - end - else - set_header(RACK_REQUEST_FORM_PAIRS, []) - end - rescue => error - set_header(RACK_REQUEST_FORM_ERROR, error) - raise - end - end - - # Returns the data received in the request body. - # - # This method support both application/x-www-form-urlencoded and - # multipart/form-data. - def POST - if form_hash = get_header(RACK_REQUEST_FORM_HASH) - return form_hash - elsif error = get_header(RACK_REQUEST_FORM_ERROR) - raise error.class, error.message, cause: error.cause - end - - pairs = form_pairs - set_header RACK_REQUEST_FORM_HASH, expand_param_pairs(pairs) - end - - # The union of GET and POST data. - # - # Note that modifications will not be persisted in the env. Use update_param or delete_param if you want to destructively modify params. - def params - self.GET.merge(self.POST) - end - - # Allow overriding the query parser that the receiver will use. - # By default Rack::Utils.default_query_parser is used. - attr_writer :query_parser - - # Destructively update a parameter, whether it's in GET and/or POST. Returns nil. - # - # The parameter is updated wherever it was previous defined, so GET, POST, or both. If it wasn't previously defined, it's inserted into GET. - # - # env['rack.input'] is not touched. - def update_param(k, v) - found = false - if self.GET.has_key?(k) - found = true - self.GET[k] = v - end - if self.POST.has_key?(k) - found = true - self.POST[k] = v - end - unless found - self.GET[k] = v - end - end - - # Destructively delete a parameter, whether it's in GET or POST. Returns the value of the deleted parameter. - # - # If the parameter is in both GET and POST, the POST value takes precedence since that's how #params works. - # - # env['rack.input'] is not touched. - def delete_param(k) - post_value, get_value = self.POST.delete(k), self.GET.delete(k) - post_value || get_value - end - - def base_url - "#{scheme}://#{host_with_port}" - end - - # Tries to return a remake of the original request URL as a string. - def url - base_url + fullpath - end - - def path - script_name + path_info - end - - def fullpath - query_string.empty? ? path : "#{path}?#{query_string}" - end - - def accept_encoding - parse_http_accept_header(get_header("HTTP_ACCEPT_ENCODING")) - end - - def accept_language - parse_http_accept_header(get_header("HTTP_ACCEPT_LANGUAGE")) - end - - def trusted_proxy?(ip) - Rack::Request.ip_filter.call(ip) - end - - private - - def default_session; {}; end - - # Assist with compatibility when processing `X-Forwarded-For`. - def wrap_ipv6(host) - # Even thought IPv6 addresses should be wrapped in square brackets, - # sometimes this is not done in various legacy/underspecified headers. - # So we try to fix this situation for compatibility reasons. - - # Try to detect IPv6 addresses which aren't escaped yet: - if !host.start_with?('[') && host.count(':') > 1 - "[#{host}]" - else - host - end - end - - def parse_http_accept_header(header) - # It would be nice to use filter_map here, but it's Ruby 2.7+ - parts = header.to_s.split(',') - - parts.map! do |part| - part.strip! - next if part.empty? - - attribute, parameters = part.split(';', 2) - attribute.strip! - parameters&.strip! - quality = 1.0 - if parameters and /\Aq=([\d.]+)/ =~ parameters - quality = $1.to_f - end - [attribute, quality] - end - - parts.compact! - - parts - end - - # Get an array of values set in the RFC 7239 `Forwarded` request header. - def get_http_forwarded(token) - Utils.forwarded_values(get_header(HTTP_FORWARDED))&.[](token) - end - - def query_parser - @query_parser || Utils.default_query_parser - end - - def parse_query(qs, d = '&') - query_parser.parse_nested_query(qs, d) - end - - def parse_multipart - warn "Rack::Request#parse_multipart is deprecated and will be removed in a future version of Rack.", uplevel: 1 - Rack::Multipart.extract_multipart(self, query_parser) - end - - def expand_param_pairs(pairs, query_parser = query_parser()) - params = query_parser.make_params - - pairs.each do |k, v| - query_parser.normalize_params(params, k, v) - end - - params.to_params_hash - end - - def split_header(value) - value ? value.strip.split(/[, \t]+/) : [] - end - - # ipv6 extracted from resolv stdlib, simplified - # to remove numbered match group creation. - ipv6 = Regexp.union( - /(?:[0-9A-Fa-f]{1,4}:){7} - [0-9A-Fa-f]{1,4}/x, - /(?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)? :: - (?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?/x, - /(?:[0-9A-Fa-f]{1,4}:){6,6} - \d+\.\d+\.\d+\.\d+/x, - /(?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)? :: - (?:[0-9A-Fa-f]{1,4}:)* - \d+\.\d+\.\d+\.\d+/x, - /[Ff][Ee]80 - (?::[0-9A-Fa-f]{1,4}){7} - %[-0-9A-Za-z._~]+/x, - /[Ff][Ee]80: - (?: - (?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)? :: - (?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)? - | - :(?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)? - )? - :[0-9A-Fa-f]{1,4}%[-0-9A-Za-z._~]+/x) - - AUTHORITY = / - \A - (? - # Match IPv6 as a string of hex digits and colons in square brackets - \[(?
#{ipv6})\] - | - # Match any other printable string (except square brackets) as a hostname - (?
[[[:graph:]&&[^\[\]]]]*?) - ) - (:(?\d+))? - \z - /x - - private_constant :AUTHORITY - - def split_authority(authority) - return [] if authority.nil? - return [] unless match = AUTHORITY.match(authority) - return match[:host], match[:address], match[:port]&.to_i - end - - FORWARDED_SCHEME_HEADERS = { - proto: HTTP_X_FORWARDED_PROTO, - scheme: HTTP_X_FORWARDED_SCHEME - }.freeze - private_constant :FORWARDED_SCHEME_HEADERS - def forwarded_scheme - forwarded_priority.each do |type| - case type - when :forwarded - if (forwarded_proto = get_http_forwarded(:proto)) && - (scheme = allowed_scheme(forwarded_proto.last)) - return scheme - end - when :x_forwarded - x_forwarded_proto_priority.each do |x_type| - if header = FORWARDED_SCHEME_HEADERS[x_type] - split_header(get_header(header)).reverse_each do |scheme| - if allowed_scheme(scheme) - return scheme - end - end - end - end - end - end - - nil - end - - def allowed_scheme(header) - header if ALLOWED_SCHEMES.include?(header) - end - - def forwarded_priority - Request.forwarded_priority - end - - def x_forwarded_proto_priority - Request.x_forwarded_proto_priority - end - end - - include Env - include Helpers - end -end - -# :nocov: -require_relative 'multipart' unless defined?(Rack::Multipart) -# :nocov: diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/response.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/response.rb deleted file mode 100644 index ece451d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/response.rb +++ /dev/null @@ -1,403 +0,0 @@ -# frozen_string_literal: true - -require 'time' - -require_relative 'constants' -require_relative 'utils' -require_relative 'media_type' -require_relative 'headers' - -module Rack - # Rack::Response provides a convenient interface to create a Rack - # response. - # - # It allows setting of headers and cookies, and provides useful - # defaults (an OK response with empty headers and body). - # - # You can use Response#write to iteratively generate your response, - # but note that this is buffered by Rack::Response until you call - # +finish+. +finish+ however can take a block inside which calls to - # +write+ are synchronous with the Rack response. - # - # Your application's +call+ should end returning Response#finish. - class Response - def self.[](status, headers, body) - self.new(body, status, headers) - end - - CHUNKED = 'chunked' - STATUS_WITH_NO_ENTITY_BODY = Utils::STATUS_WITH_NO_ENTITY_BODY - - attr_accessor :length, :status, :body - attr_reader :headers - - # Initialize the response object with the specified +body+, +status+ - # and +headers+. - # - # If the +body+ is +nil+, construct an empty response object with internal - # buffering. - # - # If the +body+ responds to +to_str+, assume it's a string-like object and - # construct a buffered response object containing using that string as the - # initial contents of the buffer. - # - # Otherwise it is expected +body+ conforms to the normal requirements of a - # Rack response body, typically implementing one of +each+ (enumerable - # body) or +call+ (streaming body). - # - # The +status+ defaults to +200+ which is the "OK" HTTP status code. You - # can provide any other valid status code. - # - # The +headers+ must be a +Hash+ of key-value header pairs which conform to - # the Rack specification for response headers. The key must be a +String+ - # instance and the value can be either a +String+ or +Array+ instance. - def initialize(body = nil, status = 200, headers = {}) - @status = status.to_i - - unless headers.is_a?(Hash) - raise ArgumentError, "Headers must be a Hash!" - end - - @headers = Headers.new - # Convert headers input to a plain hash with lowercase keys. - headers.each do |k, v| - @headers[k] = v - end - - @writer = self.method(:append) - - @block = nil - - # Keep track of whether we have expanded the user supplied body. - if body.nil? - @body = [] - @buffered = true - # Body is unspecified - it may be a buffered response, or it may be a HEAD response. - @length = nil - elsif body.respond_to?(:to_str) - @body = [body] - @buffered = true - @length = body.to_str.bytesize - else - @body = body - @buffered = nil # undetermined as of yet. - @length = nil - end - - yield self if block_given? - end - - def redirect(target, status = 302) - self.status = status - self.location = target - end - - def chunked? - CHUNKED == get_header(TRANSFER_ENCODING) - end - - def no_entity_body? - # The response body is an enumerable body and it is not allowed to have an entity body. - @body.respond_to?(:each) && STATUS_WITH_NO_ENTITY_BODY[@status] - end - - # Generate a response array consistent with the requirements of the SPEC. - # @return [Array] a 3-tuple suitable of `[status, headers, body]` - # which is suitable to be returned from the middleware `#call(env)` method. - def finish(&block) - if no_entity_body? - delete_header CONTENT_TYPE - delete_header CONTENT_LENGTH - close - return [@status, @headers, []] - else - if block_given? - # We don't add the content-length here as the user has provided a block that can #write additional chunks to the body. - @block = block - return [@status, @headers, self] - else - # If we know the length of the body, set the content-length header... except if we are chunked? which is a legacy special case where the body might already be encoded and thus the actual encoded body length and the content-length are likely to be different. - if @length && !chunked? - @headers[CONTENT_LENGTH] = @length.to_s - end - return [@status, @headers, @body] - end - end - end - - alias to_a finish # For *response - - def each(&callback) - @body.each(&callback) - @buffered = true - - if @block - @writer = callback - @block.call(self) - end - end - - # Append a chunk to the response body. - # - # Converts the response into a buffered response if it wasn't already. - # - # NOTE: Do not mix #write and direct #body access! - # - def write(chunk) - buffered_body! - - @writer.call(chunk.to_s) - end - - def close - @body.close if @body.respond_to?(:close) - end - - def empty? - @block == nil && @body.empty? - end - - def has_header?(key) - raise ArgumentError unless key.is_a?(String) - @headers.key?(key) - end - def get_header(key) - raise ArgumentError unless key.is_a?(String) - @headers[key] - end - def set_header(key, value) - raise ArgumentError unless key.is_a?(String) - @headers[key] = value - end - def delete_header(key) - raise ArgumentError unless key.is_a?(String) - @headers.delete key - end - - alias :[] :get_header - alias :[]= :set_header - - module Helpers - def invalid?; status < 100 || status >= 600; end - - def informational?; status >= 100 && status < 200; end - def successful?; status >= 200 && status < 300; end - def redirection?; status >= 300 && status < 400; end - def client_error?; status >= 400 && status < 500; end - def server_error?; status >= 500 && status < 600; end - - def ok?; status == 200; end - def created?; status == 201; end - def accepted?; status == 202; end - def no_content?; status == 204; end - def moved_permanently?; status == 301; end - def bad_request?; status == 400; end - def unauthorized?; status == 401; end - def forbidden?; status == 403; end - def not_found?; status == 404; end - def method_not_allowed?; status == 405; end - def not_acceptable?; status == 406; end - def request_timeout?; status == 408; end - def precondition_failed?; status == 412; end - def unprocessable?; status == 422; end - - def redirect?; [301, 302, 303, 307, 308].include? status; end - - def include?(header) - has_header?(header) - end - - # Add a header that may have multiple values. - # - # Example: - # response.add_header 'vary', 'accept-encoding' - # response.add_header 'vary', 'cookie' - # - # assert_equal 'accept-encoding,cookie', response.get_header('vary') - # - # http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 - def add_header(key, value) - raise ArgumentError unless key.is_a?(String) - - if value.nil? - return get_header(key) - end - - value = value.to_s - - if header = get_header(key) - if header.is_a?(Array) - header << value - else - set_header(key, [header, value]) - end - else - set_header(key, value) - end - end - - # Get the content type of the response. - def content_type - get_header CONTENT_TYPE - end - - # Set the content type of the response. - def content_type=(content_type) - set_header CONTENT_TYPE, content_type - end - - def media_type - MediaType.type(content_type) - end - - def media_type_params - MediaType.params(content_type) - end - - def content_length - cl = get_header CONTENT_LENGTH - cl ? cl.to_i : cl - end - - def location - get_header "location" - end - - def location=(location) - set_header "location", location - end - - def set_cookie(key, value) - add_header SET_COOKIE, Utils.set_cookie_header(key, value) - end - - def delete_cookie(key, value = {}) - set_header(SET_COOKIE, - Utils.delete_set_cookie_header!( - get_header(SET_COOKIE), key, value - ) - ) - end - - def set_cookie_header - get_header SET_COOKIE - end - - def set_cookie_header=(value) - set_header SET_COOKIE, value - end - - def cache_control - get_header CACHE_CONTROL - end - - def cache_control=(value) - set_header CACHE_CONTROL, value - end - - # Specifies that the content shouldn't be cached. Overrides `cache!` if already called. - def do_not_cache! - set_header CACHE_CONTROL, "no-cache, must-revalidate" - set_header EXPIRES, Time.now.httpdate - end - - # Specify that the content should be cached. - # @param duration [Integer] The number of seconds until the cache expires. - # @option directive [String] The cache control directive, one of "public", "private", "no-cache" or "no-store". - def cache!(duration = 3600, directive: "public") - unless headers[CACHE_CONTROL] =~ /no-cache/ - set_header CACHE_CONTROL, "#{directive}, max-age=#{duration}" - set_header EXPIRES, (Time.now + duration).httpdate - end - end - - def etag - get_header ETAG - end - - def etag=(value) - set_header ETAG, value - end - - protected - - # Convert the body of this response into an internally buffered Array if possible. - # - # `@buffered` is a ternary value which indicates whether the body is buffered. It can be: - # * `nil` - The body has not been buffered yet. - # * `true` - The body is buffered as an Array instance. - # * `false` - The body is not buffered and cannot be buffered. - # - # @return [Boolean] whether the body is buffered as an Array instance. - def buffered_body! - if @buffered.nil? - if @body.is_a?(Array) - # The user supplied body was an array: - @body = @body.compact - @length = @body.sum{|part| part.bytesize} - @buffered = true - elsif @body.respond_to?(:each) - # Turn the user supplied body into a buffered array: - body = @body - @body = Array.new - @buffered = true - - body.each do |part| - @writer.call(part.to_s) - end - - body.close if body.respond_to?(:close) - else - # We don't know how to buffer the user-supplied body: - @buffered = false - end - end - - return @buffered - end - - def append(chunk) - chunk = chunk.dup unless chunk.frozen? - @body << chunk - - if @length - @length += chunk.bytesize - elsif @buffered - @length = chunk.bytesize - end - - return chunk - end - end - - include Helpers - - class Raw - include Helpers - - attr_reader :headers - attr_accessor :status - - def initialize(status, headers) - @status = status - @headers = headers - end - - def has_header?(key) - headers.key?(key) - end - - def get_header(key) - headers[key] - end - - def set_header(key, value) - headers[key] = value - end - - def delete_header(key) - headers.delete(key) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/rewindable_input.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/rewindable_input.rb deleted file mode 100644 index d0ad375..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/rewindable_input.rb +++ /dev/null @@ -1,116 +0,0 @@ -# -*- encoding: binary -*- -# frozen_string_literal: true - -require 'tempfile' - -require_relative 'constants' - -module Rack - # Class which can make any IO object rewindable, including non-rewindable ones. It does - # this by buffering the data into a tempfile, which is rewindable. - # - # Don't forget to call #close when you're done. This frees up temporary resources that - # RewindableInput uses, though it does *not* close the original IO object. - class RewindableInput - # Makes rack.input rewindable, for compatibility with applications and middleware - # designed for earlier versions of Rack (where rack.input was required to be - # rewindable). - class Middleware - def initialize(app) - @app = app - end - - def call(env) - if (input = env[RACK_INPUT]) - env[RACK_INPUT] = RewindableInput.new(input) - end - - @app.call(env) - end - end - - def initialize(io) - @io = io - @rewindable_io = nil - @unlinked = false - end - - def gets - make_rewindable unless @rewindable_io - @rewindable_io.gets - end - - def read(*args) - make_rewindable unless @rewindable_io - @rewindable_io.read(*args) - end - - def each(&block) - make_rewindable unless @rewindable_io - @rewindable_io.each(&block) - end - - def rewind - make_rewindable unless @rewindable_io - @rewindable_io.rewind - end - - def size - make_rewindable unless @rewindable_io - @rewindable_io.size - end - - # Closes this RewindableInput object without closing the originally - # wrapped IO object. Cleans up any temporary resources that this RewindableInput - # has created. - # - # This method may be called multiple times. It does nothing on subsequent calls. - def close - if @rewindable_io - if @unlinked - @rewindable_io.close - else - @rewindable_io.close! - end - @rewindable_io = nil - end - end - - private - - def make_rewindable - # Buffer all data into a tempfile. Since this tempfile is private to this - # RewindableInput object, we chmod it so that nobody else can read or write - # it. On POSIX filesystems we also unlink the file so that it doesn't - # even have a file entry on the filesystem anymore, though we can still - # access it because we have the file handle open. - @rewindable_io = Tempfile.new('RackRewindableInput') - @rewindable_io.chmod(0000) - @rewindable_io.set_encoding(Encoding::BINARY) - @rewindable_io.binmode - # :nocov: - if filesystem_has_posix_semantics? - raise 'Unlink failed. IO closed.' if @rewindable_io.closed? - @unlinked = true - end - # :nocov: - - buffer = "".dup - while @io.read(1024 * 4, buffer) - entire_buffer_written_out = false - while !entire_buffer_written_out - written = @rewindable_io.write(buffer) - entire_buffer_written_out = written == buffer.bytesize - if !entire_buffer_written_out - buffer.slice!(0 .. written - 1) - end - end - end - @rewindable_io.rewind - end - - def filesystem_has_posix_semantics? - RUBY_PLATFORM !~ /(mswin|mingw|cygwin|java)/ - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/runtime.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/runtime.rb deleted file mode 100644 index a1bfa69..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/runtime.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -require_relative 'utils' - -module Rack - # Sets an "x-runtime" response header, indicating the response - # time of the request, in seconds - # - # You can put it right before the application to see the processing - # time, or before all the other middlewares to include time for them, - # too. - class Runtime - FORMAT_STRING = "%0.6f" # :nodoc: - HEADER_NAME = "x-runtime" # :nodoc: - - def initialize(app, name = nil) - @app = app - @header_name = HEADER_NAME - @header_name += "-#{name.to_s.downcase}" if name - end - - def call(env) - start_time = Utils.clock_time - _, headers, _ = response = @app.call(env) - - request_time = Utils.clock_time - start_time - - unless headers.key?(@header_name) - headers[@header_name] = FORMAT_STRING % request_time - end - - response - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/sendfile.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/sendfile.rb deleted file mode 100644 index 4723893..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/sendfile.rb +++ /dev/null @@ -1,167 +0,0 @@ -# frozen_string_literal: true - -require_relative 'constants' -require_relative 'utils' -require_relative 'body_proxy' - -module Rack - - # = Sendfile - # - # The Sendfile middleware intercepts responses whose body is being - # served from a file and replaces it with a server specific x-sendfile - # header. The web server is then responsible for writing the file contents - # to the client. This can dramatically reduce the amount of work required - # by the Ruby backend and takes advantage of the web server's optimized file - # delivery code. - # - # In order to take advantage of this middleware, the response body must - # respond to +to_path+ and the request must include an x-sendfile-type - # header. Rack::Files and other components implement +to_path+ so there's - # rarely anything you need to do in your application. The x-sendfile-type - # header is typically set in your web servers configuration. The following - # sections attempt to document - # - # === Nginx - # - # Nginx supports the x-accel-redirect header. This is similar to x-sendfile - # but requires parts of the filesystem to be mapped into a private URL - # hierarchy. - # - # The following example shows the Nginx configuration required to create - # a private "/files/" area, enable x-accel-redirect, and pass the special - # x-sendfile-type and x-accel-mapping headers to the backend: - # - # location ~ /files/(.*) { - # internal; - # alias /var/www/$1; - # } - # - # location / { - # proxy_redirect off; - # - # proxy_set_header Host $host; - # proxy_set_header X-Real-IP $remote_addr; - # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - # - # proxy_set_header x-sendfile-type x-accel-redirect; - # proxy_set_header x-accel-mapping /var/www/=/files/; - # - # proxy_pass http://127.0.0.1:8080/; - # } - # - # Note that the x-sendfile-type header must be set exactly as shown above. - # The x-accel-mapping header should specify the location on the file system, - # followed by an equals sign (=), followed name of the private URL pattern - # that it maps to. The middleware performs a simple substitution on the - # resulting path. - # - # See Also: https://www.nginx.com/resources/wiki/start/topics/examples/xsendfile - # - # === lighttpd - # - # Lighttpd has supported some variation of the x-sendfile header for some - # time, although only recent version support x-sendfile in a reverse proxy - # configuration. - # - # $HTTP["host"] == "example.com" { - # proxy-core.protocol = "http" - # proxy-core.balancer = "round-robin" - # proxy-core.backends = ( - # "127.0.0.1:8000", - # "127.0.0.1:8001", - # ... - # ) - # - # proxy-core.allow-x-sendfile = "enable" - # proxy-core.rewrite-request = ( - # "x-sendfile-type" => (".*" => "x-sendfile") - # ) - # } - # - # See Also: http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModProxyCore - # - # === Apache - # - # x-sendfile is supported under Apache 2.x using a separate module: - # - # https://tn123.org/mod_xsendfile/ - # - # Once the module is compiled and installed, you can enable it using - # XSendFile config directive: - # - # RequestHeader Set x-sendfile-type x-sendfile - # ProxyPassReverse / http://localhost:8001/ - # XSendFile on - # - # === Mapping parameter - # - # The third parameter allows for an overriding extension of the - # x-accel-mapping header. Mappings should be provided in tuples of internal to - # external. The internal values may contain regular expression syntax, they - # will be matched with case indifference. - - class Sendfile - def initialize(app, variation = nil, mappings = []) - @app = app - @variation = variation - @mappings = mappings.map do |internal, external| - [/^#{internal}/i, external] - end - end - - def call(env) - _, headers, body = response = @app.call(env) - - if body.respond_to?(:to_path) - case type = variation(env) - when /x-accel-redirect/i - path = ::File.expand_path(body.to_path) - if url = map_accel_path(env, path) - headers[CONTENT_LENGTH] = '0' - # '?' must be percent-encoded because it is not query string but a part of path - headers[type.downcase] = ::Rack::Utils.escape_path(url).gsub('?', '%3F') - obody = body - response[2] = Rack::BodyProxy.new([]) do - obody.close if obody.respond_to?(:close) - end - else - env[RACK_ERRORS].puts "x-accel-mapping header missing" - end - when /x-sendfile|x-lighttpd-send-file/i - path = ::File.expand_path(body.to_path) - headers[CONTENT_LENGTH] = '0' - headers[type.downcase] = path - obody = body - response[2] = Rack::BodyProxy.new([]) do - obody.close if obody.respond_to?(:close) - end - when '', nil - else - env[RACK_ERRORS].puts "Unknown x-sendfile variation: #{type.inspect}" - end - end - response - end - - private - def variation(env) - @variation || - env['sendfile.type'] || - env['HTTP_X_SENDFILE_TYPE'] - end - - def map_accel_path(env, path) - if mapping = @mappings.find { |internal, _| internal =~ path } - path.sub(*mapping) - elsif mapping = env['HTTP_X_ACCEL_MAPPING'] - mapping.split(',').map(&:strip).each do |m| - internal, external = m.split('=', 2).map(&:strip) - new_path = path.sub(/^#{internal}/i, external) - return new_path unless path == new_path - end - path - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/show_exceptions.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/show_exceptions.rb deleted file mode 100644 index c09292e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/show_exceptions.rb +++ /dev/null @@ -1,409 +0,0 @@ -# frozen_string_literal: true - -require 'erb' - -require_relative 'constants' -require_relative 'utils' -require_relative 'request' - -module Rack - # Rack::ShowExceptions catches all exceptions raised from the app it - # wraps. It shows a useful backtrace with the sourcefile and - # clickable context, the whole Rack environment and the request - # data. - # - # Be careful when you use this on public-facing sites as it could - # reveal information helpful to attackers. - - class ShowExceptions - CONTEXT = 7 - - Frame = Struct.new(:filename, :lineno, :function, - :pre_context_lineno, :pre_context, - :context_line, :post_context_lineno, - :post_context) - - def initialize(app) - @app = app - end - - def call(env) - @app.call(env) - rescue StandardError, LoadError, SyntaxError => e - exception_string = dump_exception(e) - - env[RACK_ERRORS].puts(exception_string) - env[RACK_ERRORS].flush - - if accepts_html?(env) - content_type = "text/html" - body = pretty(env, e) - else - content_type = "text/plain" - body = exception_string - end - - [ - 500, - { - CONTENT_TYPE => content_type, - CONTENT_LENGTH => body.bytesize.to_s, - }, - [body], - ] - end - - def prefers_plaintext?(env) - !accepts_html?(env) - end - - def accepts_html?(env) - Rack::Utils.best_q_match(env["HTTP_ACCEPT"], %w[text/html]) - end - private :accepts_html? - - def dump_exception(exception) - if exception.respond_to?(:detailed_message) - message = exception.detailed_message(highlight: false) - # :nocov: - # Ruby 3.2 added Exception#detailed_message, so the else - # branch cannot be hit on the current Ruby version. - else - message = exception.message - # :nocov: - end - string = "#{exception.class}: #{message}\n".dup - string << exception.backtrace.map { |l| "\t#{l}" }.join("\n") - string - end - - def pretty(env, exception) - req = Rack::Request.new(env) - - # This double assignment is to prevent an "unused variable" warning. - # Yes, it is dumb, but I don't like Ruby yelling at me. - path = path = (req.script_name + req.path_info).squeeze("/") - - # This double assignment is to prevent an "unused variable" warning. - # Yes, it is dumb, but I don't like Ruby yelling at me. - frames = frames = exception.backtrace.map { |line| - frame = Frame.new - if line =~ /(.*?):(\d+)(:in `(.*)')?/ - frame.filename = $1 - frame.lineno = $2.to_i - frame.function = $4 - - begin - lineno = frame.lineno - 1 - lines = ::File.readlines(frame.filename) - frame.pre_context_lineno = [lineno - CONTEXT, 0].max - frame.pre_context = lines[frame.pre_context_lineno...lineno] - frame.context_line = lines[lineno].chomp - frame.post_context_lineno = [lineno + CONTEXT, lines.size].min - frame.post_context = lines[lineno + 1..frame.post_context_lineno] - rescue - end - - frame - else - nil - end - }.compact - - template.result(binding) - end - - def template - TEMPLATE - end - - def h(obj) # :nodoc: - case obj - when String - Utils.escape_html(obj) - else - Utils.escape_html(obj.inspect) - end - end - - # :stopdoc: - - # adapted from Django - # Copyright (c) Django Software Foundation and individual contributors. - # Used under the modified BSD license: - # http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5 - TEMPLATE = ERB.new(<<-'HTML'.gsub(/^ /, '')) - - - - - - <%=h exception.class %> at <%=h path %> - - - - - -
-

<%=h exception.class %> at <%=h path %>

- <% if exception.respond_to?(:detailed_message) %> -

<%=h exception.detailed_message(highlight: false) %>

- <% else %> -

<%=h exception.message %>

- <% end %> - - - - - - -
Ruby - <% if first = frames.first %> - <%=h first.filename %>: in <%=h first.function %>, line <%=h frames.first.lineno %> - <% else %> - unknown location - <% end %> -
Web<%=h req.request_method %> <%=h(req.host + path)%>
- -

Jump to:

- -
- -
-

Traceback (innermost first)

-
    - <% frames.each { |frame| %> -
  • - <%=h frame.filename %>: in <%=h frame.function %> - - <% if frame.context_line %> -
    - <% if frame.pre_context %> -
      - <% frame.pre_context.each { |line| %> -
    1. <%=h line %>
    2. - <% } %> -
    - <% end %> - -
      -
    1. <%=h frame.context_line %>...
    - - <% if frame.post_context %> -
      - <% frame.post_context.each { |line| %> -
    1. <%=h line %>
    2. - <% } %> -
    - <% end %> -
    - <% end %> -
  • - <% } %> -
-
- -
-

Request information

- -

GET

- <% if req.GET and not req.GET.empty? %> - - - - - - - - - <% req.GET.sort_by { |k, v| k.to_s }.each { |key, val| %> - - - - - <% } %> - -
VariableValue
<%=h key %>
<%=h val.inspect %>
- <% else %> -

No GET data.

- <% end %> - -

POST

- <% if ((req.POST and not req.POST.empty?) rescue (no_post_data = "Invalid POST data"; nil)) %> - - - - - - - - - <% req.POST.sort_by { |k, v| k.to_s }.each { |key, val| %> - - - - - <% } %> - -
VariableValue
<%=h key %>
<%=h val.inspect %>
- <% else %> -

<%= no_post_data || "No POST data" %>.

- <% end %> - - - - <% unless req.cookies.empty? %> - - - - - - - - - <% req.cookies.each { |key, val| %> - - - - - <% } %> - -
VariableValue
<%=h key %>
<%=h val.inspect %>
- <% else %> -

No cookie data.

- <% end %> - -

Rack ENV

- - - - - - - - - <% env.sort_by { |k, v| k.to_s }.each { |key, val| %> - - - - - <% } %> - -
VariableValue
<%=h key %>
<%=h val.inspect %>
- -
- -
-

- You're seeing this error because you use Rack::ShowExceptions. -

-
- - - - HTML - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/show_status.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/show_status.rb deleted file mode 100644 index 7b1a62f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/show_status.rb +++ /dev/null @@ -1,121 +0,0 @@ -# frozen_string_literal: true - -require 'erb' - -require_relative 'constants' -require_relative 'utils' -require_relative 'request' -require_relative 'body_proxy' - -module Rack - # Rack::ShowStatus catches all empty responses and replaces them - # with a site explaining the error. - # - # Additional details can be put into rack.showstatus.detail - # and will be shown as HTML. If such details exist, the error page - # is always rendered, even if the reply was not empty. - - class ShowStatus - def initialize(app) - @app = app - @template = ERB.new(TEMPLATE) - end - - def call(env) - status, headers, body = response = @app.call(env) - empty = headers[CONTENT_LENGTH].to_i <= 0 - - # client or server error, or explicit message - if (status.to_i >= 400 && empty) || env[RACK_SHOWSTATUS_DETAIL] - # This double assignment is to prevent an "unused variable" warning. - # Yes, it is dumb, but I don't like Ruby yelling at me. - req = req = Rack::Request.new(env) - - message = Rack::Utils::HTTP_STATUS_CODES[status.to_i] || status.to_s - - # This double assignment is to prevent an "unused variable" warning. - # Yes, it is dumb, but I don't like Ruby yelling at me. - detail = detail = env[RACK_SHOWSTATUS_DETAIL] || message - - html = @template.result(binding) - size = html.bytesize - - response[2] = Rack::BodyProxy.new([html]) do - body.close if body.respond_to?(:close) - end - - headers[CONTENT_TYPE] = "text/html" - headers[CONTENT_LENGTH] = size.to_s - end - - response - end - - def h(obj) # :nodoc: - case obj - when String - Utils.escape_html(obj) - else - Utils.escape_html(obj.inspect) - end - end - - # :stopdoc: - -# adapted from Django -# Copyright (c) Django Software Foundation and individual contributors. -# Used under the modified BSD license: -# http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5 -TEMPLATE = <<'HTML' - - - - - <%=h message %> at <%=h req.script_name + req.path_info %> - - - - -
-

<%=h message %> (<%= status.to_i %>)

- - - - - - - - - -
Request Method:<%=h req.request_method %>
Request URL:<%=h req.url %>
-
-
-

<%=h detail %>

-
- -
-

- You're seeing this error because you use Rack::ShowStatus. -

-
- - -HTML - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/static.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/static.rb deleted file mode 100644 index c26993e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/static.rb +++ /dev/null @@ -1,188 +0,0 @@ -# frozen_string_literal: true - -require_relative 'constants' -require_relative 'files' -require_relative 'mime' - -module Rack - - # The Rack::Static middleware intercepts requests for static files - # (javascript files, images, stylesheets, etc) based on the url prefixes or - # route mappings passed in the options, and serves them using a Rack::Files - # object. This allows a Rack stack to serve both static and dynamic content. - # - # Examples: - # - # Serve all requests beginning with /media from the "media" folder located - # in the current directory (ie media/*): - # - # use Rack::Static, :urls => ["/media"] - # - # Same as previous, but instead of returning 404 for missing files under - # /media, call the next middleware: - # - # use Rack::Static, :urls => ["/media"], :cascade => true - # - # Serve all requests beginning with /css or /images from the folder "public" - # in the current directory (ie public/css/* and public/images/*): - # - # use Rack::Static, :urls => ["/css", "/images"], :root => "public" - # - # Serve all requests to / with "index.html" from the folder "public" in the - # current directory (ie public/index.html): - # - # use Rack::Static, :urls => {"/" => 'index.html'}, :root => 'public' - # - # Serve all requests normally from the folder "public" in the current - # directory but uses index.html as default route for "/" - # - # use Rack::Static, :urls => [""], :root => 'public', :index => - # 'index.html' - # - # Set custom HTTP Headers for based on rules: - # - # use Rack::Static, :root => 'public', - # :header_rules => [ - # [rule, {header_field => content, header_field => content}], - # [rule, {header_field => content}] - # ] - # - # Rules for selecting files: - # - # 1) All files - # Provide the :all symbol - # :all => Matches every file - # - # 2) Folders - # Provide the folder path as a string - # '/folder' or '/folder/subfolder' => Matches files in a certain folder - # - # 3) File Extensions - # Provide the file extensions as an array - # ['css', 'js'] or %w(css js) => Matches files ending in .css or .js - # - # 4) Regular Expressions / Regexp - # Provide a regular expression - # %r{\.(?:css|js)\z} => Matches files ending in .css or .js - # /\.(?:eot|ttf|otf|woff2|woff|svg)\z/ => Matches files ending in - # the most common web font formats (.eot, .ttf, .otf, .woff2, .woff, .svg) - # Note: This Regexp is available as a shortcut, using the :fonts rule - # - # 5) Font Shortcut - # Provide the :fonts symbol - # :fonts => Uses the Regexp rule stated right above to match all common web font endings - # - # Rule Ordering: - # Rules are applied in the order that they are provided. - # List rather general rules above special ones. - # - # Complete example use case including HTTP header rules: - # - # use Rack::Static, :root => 'public', - # :header_rules => [ - # # Cache all static files in public caches (e.g. Rack::Cache) - # # as well as in the browser - # [:all, {'cache-control' => 'public, max-age=31536000'}], - # - # # Provide web fonts with cross-origin access-control-headers - # # Firefox requires this when serving assets using a Content Delivery Network - # [:fonts, {'access-control-allow-origin' => '*'}] - # ] - # - class Static - def initialize(app, options = {}) - @app = app - @urls = options[:urls] || ["/favicon.ico"] - @index = options[:index] - @gzip = options[:gzip] - @cascade = options[:cascade] - root = options[:root] || Dir.pwd - - # HTTP Headers - @header_rules = options[:header_rules] || [] - # Allow for legacy :cache_control option while prioritizing global header_rules setting - @header_rules.unshift([:all, { CACHE_CONTROL => options[:cache_control] }]) if options[:cache_control] - - @file_server = Rack::Files.new(root) - end - - def add_index_root?(path) - @index && route_file(path) && path.end_with?('/') - end - - def overwrite_file_path(path) - @urls.kind_of?(Hash) && @urls.key?(path) || add_index_root?(path) - end - - def route_file(path) - @urls.kind_of?(Array) && @urls.any? { |url| path.index(url) == 0 } - end - - def can_serve(path) - route_file(path) || overwrite_file_path(path) - end - - def call(env) - path = env[PATH_INFO] - actual_path = Utils.clean_path_info(Utils.unescape_path(path)) - - if can_serve(actual_path) - if overwrite_file_path(path) - env[PATH_INFO] = (add_index_root?(path) ? path + @index : @urls[path]) - elsif @gzip && env['HTTP_ACCEPT_ENCODING'] && /\bgzip\b/.match?(env['HTTP_ACCEPT_ENCODING']) - path = env[PATH_INFO] - env[PATH_INFO] += '.gz' - response = @file_server.call(env) - env[PATH_INFO] = path - - if response[0] == 404 - response = nil - elsif response[0] == 304 - # Do nothing, leave headers as is - else - response[1][CONTENT_TYPE] = Mime.mime_type(::File.extname(path), 'text/plain') - response[1]['content-encoding'] = 'gzip' - end - end - - path = env[PATH_INFO] - response ||= @file_server.call(env) - - if @cascade && response[0] == 404 - return @app.call(env) - end - - headers = response[1] - applicable_rules(path).each do |rule, new_headers| - new_headers.each { |field, content| headers[field] = content } - end - - response - else - @app.call(env) - end - end - - # Convert HTTP header rules to HTTP headers - def applicable_rules(path) - @header_rules.find_all do |rule, new_headers| - case rule - when :all - true - when :fonts - /\.(?:ttf|otf|eot|woff2|woff|svg)\z/.match?(path) - when String - path = ::Rack::Utils.unescape(path) - path.start_with?(rule) || path.start_with?('/' + rule) - when Array - /\.(#{rule.join('|')})\z/.match?(path) - when Regexp - rule.match?(path) - else - false - end - end - end - - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/tempfile_reaper.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/tempfile_reaper.rb deleted file mode 100644 index 0b94cc7..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/tempfile_reaper.rb +++ /dev/null @@ -1,33 +0,0 @@ -# frozen_string_literal: true - -require_relative 'constants' -require_relative 'body_proxy' - -module Rack - - # Middleware tracks and cleans Tempfiles created throughout a request (i.e. Rack::Multipart) - # Ideas/strategy based on posts by Eric Wong and Charles Oliver Nutter - # https://groups.google.com/forum/#!searchin/rack-devel/temp/rack-devel/brK8eh-MByw/sw61oJJCGRMJ - class TempfileReaper - def initialize(app) - @app = app - end - - def call(env) - env[RACK_TEMPFILES] ||= [] - - begin - _, _, body = response = @app.call(env) - rescue Exception - env[RACK_TEMPFILES]&.each(&:close!) - raise - end - - response[2] = BodyProxy.new(body) do - env[RACK_TEMPFILES]&.each(&:close!) - end - - response - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/urlmap.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/urlmap.rb deleted file mode 100644 index 99c4d82..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/urlmap.rb +++ /dev/null @@ -1,99 +0,0 @@ -# frozen_string_literal: true - -require 'set' - -require_relative 'constants' - -module Rack - # Rack::URLMap takes a hash mapping urls or paths to apps, and - # dispatches accordingly. Support for HTTP/1.1 host names exists if - # the URLs start with http:// or https://. - # - # URLMap modifies the SCRIPT_NAME and PATH_INFO such that the part - # relevant for dispatch is in the SCRIPT_NAME, and the rest in the - # PATH_INFO. This should be taken care of when you need to - # reconstruct the URL in order to create links. - # - # URLMap dispatches in such a way that the longest paths are tried - # first, since they are most specific. - - class URLMap - def initialize(map = {}) - remap(map) - end - - def remap(map) - @known_hosts = Set[] - @mapping = map.map { |location, app| - if location =~ %r{\Ahttps?://(.*?)(/.*)} - host, location = $1, $2 - @known_hosts << host - else - host = nil - end - - unless location[0] == ?/ - raise ArgumentError, "paths need to start with /" - end - - location = location.chomp('/') - match = Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", Regexp::NOENCODING) - - [host, location, match, app] - }.sort_by do |(host, location, _, _)| - [host ? -host.size : Float::INFINITY, -location.size] - end - end - - def call(env) - path = env[PATH_INFO] - script_name = env[SCRIPT_NAME] - http_host = env[HTTP_HOST] - server_name = env[SERVER_NAME] - server_port = env[SERVER_PORT] - - is_same_server = casecmp?(http_host, server_name) || - casecmp?(http_host, "#{server_name}:#{server_port}") - - is_host_known = @known_hosts.include? http_host - - @mapping.each do |host, location, match, app| - unless casecmp?(http_host, host) \ - || casecmp?(server_name, host) \ - || (!host && is_same_server) \ - || (!host && !is_host_known) # If we don't have a matching host, default to the first without a specified host - next - end - - next unless m = match.match(path.to_s) - - rest = m[1] - next unless !rest || rest.empty? || rest[0] == ?/ - - env[SCRIPT_NAME] = (script_name + location) - env[PATH_INFO] = rest - - return app.call(env) - end - - [404, { CONTENT_TYPE => "text/plain", "x-cascade" => "pass" }, ["Not Found: #{path}"]] - - ensure - env[PATH_INFO] = path - env[SCRIPT_NAME] = script_name - end - - private - def casecmp?(v1, v2) - # if both nil, or they're the same string - return true if v1 == v2 - - # if either are nil... (but they're not the same) - return false if v1.nil? - return false if v2.nil? - - # otherwise check they're not case-insensitive the same - v1.casecmp(v2).zero? - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/utils.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/utils.rb deleted file mode 100644 index 2c08f1f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/utils.rb +++ /dev/null @@ -1,622 +0,0 @@ -# -*- encoding: binary -*- -# frozen_string_literal: true - -require 'uri' -require 'fileutils' -require 'set' -require 'tempfile' -require 'time' -require 'erb' - -require_relative 'query_parser' -require_relative 'mime' -require_relative 'headers' -require_relative 'constants' - -module Rack - # Rack::Utils contains a grab-bag of useful methods for writing web - # applications adopted from all kinds of Ruby libraries. - - module Utils - ParameterTypeError = QueryParser::ParameterTypeError - InvalidParameterError = QueryParser::InvalidParameterError - ParamsTooDeepError = QueryParser::ParamsTooDeepError - DEFAULT_SEP = QueryParser::DEFAULT_SEP - COMMON_SEP = QueryParser::COMMON_SEP - KeySpaceConstrainedParams = QueryParser::Params - URI_PARSER = defined?(::URI::RFC2396_PARSER) ? ::URI::RFC2396_PARSER : ::URI::DEFAULT_PARSER - - class << self - attr_accessor :default_query_parser - end - # The default amount of nesting to allowed by hash parameters. - # This helps prevent a rogue client from triggering a possible stack overflow - # when parsing parameters. - self.default_query_parser = QueryParser.make_default(32) - - module_function - - # URI escapes. (CGI style space to +) - def escape(s) - URI.encode_www_form_component(s) - end - - # Like URI escaping, but with %20 instead of +. Strictly speaking this is - # true URI escaping. - def escape_path(s) - URI_PARSER.escape s - end - - # Unescapes the **path** component of a URI. See Rack::Utils.unescape for - # unescaping query parameters or form components. - def unescape_path(s) - URI_PARSER.unescape s - end - - # Unescapes a URI escaped string with +encoding+. +encoding+ will be the - # target encoding of the string returned, and it defaults to UTF-8 - def unescape(s, encoding = Encoding::UTF_8) - URI.decode_www_form_component(s, encoding) - end - - class << self - attr_accessor :multipart_total_part_limit - - attr_accessor :multipart_file_limit - - # multipart_part_limit is the original name of multipart_file_limit, but - # the limit only counts parts with filenames. - alias multipart_part_limit multipart_file_limit - alias multipart_part_limit= multipart_file_limit= - end - - # The maximum number of file parts a request can contain. Accepting too - # many parts can lead to the server running out of file handles. - # Set to `0` for no limit. - self.multipart_file_limit = (ENV['RACK_MULTIPART_PART_LIMIT'] || ENV['RACK_MULTIPART_FILE_LIMIT'] || 128).to_i - - # The maximum total number of parts a request can contain. Accepting too - # many can lead to excessive memory use and parsing time. - self.multipart_total_part_limit = (ENV['RACK_MULTIPART_TOTAL_PART_LIMIT'] || 4096).to_i - - def self.param_depth_limit - default_query_parser.param_depth_limit - end - - def self.param_depth_limit=(v) - self.default_query_parser = self.default_query_parser.new_depth_limit(v) - end - - if defined?(Process::CLOCK_MONOTONIC) - def clock_time - Process.clock_gettime(Process::CLOCK_MONOTONIC) - end - else - # :nocov: - def clock_time - Time.now.to_f - end - # :nocov: - end - - def parse_query(qs, d = nil, &unescaper) - Rack::Utils.default_query_parser.parse_query(qs, d, &unescaper) - end - - def parse_nested_query(qs, d = nil) - Rack::Utils.default_query_parser.parse_nested_query(qs, d) - end - - def build_query(params) - params.map { |k, v| - if v.class == Array - build_query(v.map { |x| [k, x] }) - else - v.nil? ? escape(k) : "#{escape(k)}=#{escape(v)}" - end - }.join("&") - end - - def build_nested_query(value, prefix = nil) - case value - when Array - value.map { |v| - build_nested_query(v, "#{prefix}[]") - }.join("&") - when Hash - value.map { |k, v| - build_nested_query(v, prefix ? "#{prefix}[#{k}]" : k) - }.delete_if(&:empty?).join('&') - when nil - escape(prefix) - else - raise ArgumentError, "value must be a Hash" if prefix.nil? - "#{escape(prefix)}=#{escape(value)}" - end - end - - def q_values(q_value_header) - q_value_header.to_s.split(',').map do |part| - value, parameters = part.split(';', 2).map(&:strip) - quality = 1.0 - if parameters && (md = /\Aq=([\d.]+)/.match(parameters)) - quality = md[1].to_f - end - [value, quality] - end - end - - def forwarded_values(forwarded_header) - return nil unless forwarded_header - forwarded_header = forwarded_header.to_s.gsub("\n", ";") - - forwarded_header.split(';').each_with_object({}) do |field, values| - field.split(',').each do |pair| - pair = pair.split('=').map(&:strip).join('=') - return nil unless pair =~ /\A(by|for|host|proto)="?([^"]+)"?\Z/i - (values[$1.downcase.to_sym] ||= []) << $2 - end - end - end - module_function :forwarded_values - - # Return best accept value to use, based on the algorithm - # in RFC 2616 Section 14. If there are multiple best - # matches (same specificity and quality), the value returned - # is arbitrary. - def best_q_match(q_value_header, available_mimes) - values = q_values(q_value_header) - - matches = values.map do |req_mime, quality| - match = available_mimes.find { |am| Rack::Mime.match?(am, req_mime) } - next unless match - [match, quality] - end.compact.sort_by do |match, quality| - (match.split('/', 2).count('*') * -10) + quality - end.last - matches&.first - end - - # Introduced in ERB 4.0. ERB::Escape is an alias for ERB::Utils which - # doesn't get monkey-patched by rails - if defined?(ERB::Escape) && ERB::Escape.instance_method(:html_escape) - define_method(:escape_html, ERB::Escape.instance_method(:html_escape)) - # :nocov: - # Ruby 3.2/ERB 4.0 added ERB::Escape#html_escape, so the else - # branch cannot be hit on the current Ruby version. - else - require 'cgi/escape' - # Escape ampersands, brackets and quotes to their HTML/XML entities. - def escape_html(string) - CGI.escapeHTML(string.to_s) - end - # :nocov: - end - - def select_best_encoding(available_encodings, accept_encoding) - # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html - - expanded_accept_encoding = [] - - accept_encoding.each do |m, q| - preference = available_encodings.index(m) || available_encodings.size - - if m == "*" - (available_encodings - accept_encoding.map(&:first)).each do |m2| - expanded_accept_encoding << [m2, q, preference] - end - else - expanded_accept_encoding << [m, q, preference] - end - end - - encoding_candidates = expanded_accept_encoding - .sort_by { |_, q, p| [-q, p] } - .map!(&:first) - - unless encoding_candidates.include?("identity") - encoding_candidates.push("identity") - end - - expanded_accept_encoding.each do |m, q| - encoding_candidates.delete(m) if q == 0.0 - end - - (encoding_candidates & available_encodings)[0] - end - - # :call-seq: - # parse_cookies_header(value) -> hash - # - # Parse cookies from the provided header +value+ according to RFC6265. The - # syntax for cookie headers only supports semicolons. Returns a map of - # cookie +key+ to cookie +value+. - # - # parse_cookies_header('myname=myvalue; max-age=0') - # # => {"myname"=>"myvalue", "max-age"=>"0"} - # - def parse_cookies_header(value) - return {} unless value - - value.split(/; */n).each_with_object({}) do |cookie, cookies| - next if cookie.empty? - key, value = cookie.split('=', 2) - cookies[key] = (unescape(value) rescue value) unless cookies.key?(key) - end - end - - # :call-seq: - # parse_cookies(env) -> hash - # - # Parse cookies from the provided request environment using - # parse_cookies_header. Returns a map of cookie +key+ to cookie +value+. - # - # parse_cookies({'HTTP_COOKIE' => 'myname=myvalue'}) - # # => {'myname' => 'myvalue'} - # - def parse_cookies(env) - parse_cookies_header env[HTTP_COOKIE] - end - - # A valid cookie key according to RFC6265 and RFC2616. - # A can be any US-ASCII characters, except control characters, spaces, or tabs. It also must not contain a separator character like the following: ( ) < > @ , ; : \ " / [ ] ? = { }. - VALID_COOKIE_KEY = /\A[!#$%&'*+\-\.\^_`|~0-9a-zA-Z]+\z/.freeze - private_constant :VALID_COOKIE_KEY - - # :call-seq: - # set_cookie_header(key, value) -> encoded string - # - # Generate an encoded string using the provided +key+ and +value+ suitable - # for the +set-cookie+ header according to RFC6265. The +value+ may be an - # instance of either +String+ or +Hash+. If the cookie key is invalid (as - # defined by RFC6265), an +ArgumentError+ will be raised. - # - # If the cookie +value+ is an instance of +Hash+, it considers the following - # cookie attribute keys: +domain+, +max_age+, +expires+ (must be instance - # of +Time+), +secure+, +http_only+, +same_site+ and +value+. For more - # details about the interpretation of these fields, consult - # [RFC6265 Section 5.2](https://datatracker.ietf.org/doc/html/rfc6265#section-5.2). - # - # set_cookie_header("myname", "myvalue") - # # => "myname=myvalue" - # - # set_cookie_header("myname", {value: "myvalue", max_age: 10}) - # # => "myname=myvalue; max-age=10" - # - def set_cookie_header(key, value) - unless key =~ VALID_COOKIE_KEY - raise ArgumentError, "invalid cookie key: #{key.inspect}" - end - - case value - when Hash - domain = "; domain=#{value[:domain]}" if value[:domain] - path = "; path=#{value[:path]}" if value[:path] - max_age = "; max-age=#{value[:max_age]}" if value[:max_age] - expires = "; expires=#{value[:expires].httpdate}" if value[:expires] - secure = "; secure" if value[:secure] - httponly = "; httponly" if (value.key?(:httponly) ? value[:httponly] : value[:http_only]) - same_site = - case value[:same_site] - when false, nil - nil - when :none, 'None', :None - '; samesite=none' - when :lax, 'Lax', :Lax - '; samesite=lax' - when true, :strict, 'Strict', :Strict - '; samesite=strict' - else - raise ArgumentError, "Invalid :same_site value: #{value[:same_site].inspect}" - end - partitioned = "; partitioned" if value[:partitioned] - value = value[:value] - end - - value = [value] unless Array === value - - return "#{key}=#{value.map { |v| escape v }.join('&')}#{domain}" \ - "#{path}#{max_age}#{expires}#{secure}#{httponly}#{same_site}#{partitioned}" - end - - # :call-seq: - # set_cookie_header!(headers, key, value) -> header value - # - # Append a cookie in the specified headers with the given cookie +key+ and - # +value+ using set_cookie_header. - # - # If the headers already contains a +set-cookie+ key, it will be converted - # to an +Array+ if not already, and appended to. - def set_cookie_header!(headers, key, value) - if header = headers[SET_COOKIE] - if header.is_a?(Array) - header << set_cookie_header(key, value) - else - headers[SET_COOKIE] = [header, set_cookie_header(key, value)] - end - else - headers[SET_COOKIE] = set_cookie_header(key, value) - end - end - - # :call-seq: - # delete_set_cookie_header(key, value = {}) -> encoded string - # - # Generate an encoded string based on the given +key+ and +value+ using - # set_cookie_header for the purpose of causing the specified cookie to be - # deleted. The +value+ may be an instance of +Hash+ and can include - # attributes as outlined by set_cookie_header. The encoded cookie will have - # a +max_age+ of 0 seconds, an +expires+ date in the past and an empty - # +value+. When used with the +set-cookie+ header, it will cause the client - # to *remove* any matching cookie. - # - # delete_set_cookie_header("myname") - # # => "myname=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT" - # - def delete_set_cookie_header(key, value = {}) - set_cookie_header(key, value.merge(max_age: '0', expires: Time.at(0), value: '')) - end - - def delete_cookie_header!(headers, key, value = {}) - headers[SET_COOKIE] = delete_set_cookie_header!(headers[SET_COOKIE], key, value) - - return nil - end - - # :call-seq: - # delete_set_cookie_header!(header, key, value = {}) -> header value - # - # Set an expired cookie in the specified headers with the given cookie - # +key+ and +value+ using delete_set_cookie_header. This causes - # the client to immediately delete the specified cookie. - # - # delete_set_cookie_header!(nil, "mycookie") - # # => "mycookie=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT" - # - # If the header is non-nil, it will be modified in place. - # - # header = [] - # delete_set_cookie_header!(header, "mycookie") - # # => ["mycookie=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT"] - # header - # # => ["mycookie=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT"] - # - def delete_set_cookie_header!(header, key, value = {}) - if header - header = Array(header) - header << delete_set_cookie_header(key, value) - else - header = delete_set_cookie_header(key, value) - end - - return header - end - - def rfc2822(time) - time.rfc2822 - end - - # Parses the "Range:" header, if present, into an array of Range objects. - # Returns nil if the header is missing or syntactically invalid. - # Returns an empty array if none of the ranges are satisfiable. - def byte_ranges(env, size) - get_byte_ranges env['HTTP_RANGE'], size - end - - def get_byte_ranges(http_range, size) - # See - # Ignore Range when file size is 0 to avoid a 416 error. - return nil if size.zero? - return nil unless http_range && http_range =~ /bytes=([^;]+)/ - ranges = [] - $1.split(/,[ \t]*/).each do |range_spec| - return nil unless range_spec.include?('-') - range = range_spec.split('-') - r0, r1 = range[0], range[1] - if r0.nil? || r0.empty? - return nil if r1.nil? - # suffix-byte-range-spec, represents trailing suffix of file - r0 = size - r1.to_i - r0 = 0 if r0 < 0 - r1 = size - 1 - else - r0 = r0.to_i - if r1.nil? - r1 = size - 1 - else - r1 = r1.to_i - return nil if r1 < r0 # backwards range is syntactically invalid - r1 = size - 1 if r1 >= size - end - end - ranges << (r0..r1) if r0 <= r1 - end - - return [] if ranges.map(&:size).sum > size - - ranges - end - - # :nocov: - if defined?(OpenSSL.fixed_length_secure_compare) - # Constant time string comparison. - # - # NOTE: the values compared should be of fixed length, such as strings - # that have already been processed by HMAC. This should not be used - # on variable length plaintext strings because it could leak length info - # via timing attacks. - def secure_compare(a, b) - return false unless a.bytesize == b.bytesize - - OpenSSL.fixed_length_secure_compare(a, b) - end - # :nocov: - else - def secure_compare(a, b) - return false unless a.bytesize == b.bytesize - - l = a.unpack("C*") - - r, i = 0, -1 - b.each_byte { |v| r |= v ^ l[i += 1] } - r == 0 - end - end - - # Context allows the use of a compatible middleware at different points - # in a request handling stack. A compatible middleware must define - # #context which should take the arguments env and app. The first of which - # would be the request environment. The second of which would be the rack - # application that the request would be forwarded to. - class Context - attr_reader :for, :app - - def initialize(app_f, app_r) - raise 'running context does not respond to #context' unless app_f.respond_to? :context - @for, @app = app_f, app_r - end - - def call(env) - @for.context(env, @app) - end - - def recontext(app) - self.class.new(@for, app) - end - - def context(env, app = @app) - recontext(app).call(env) - end - end - - # Every standard HTTP code mapped to the appropriate message. - # Generated with: - # curl -s https://www.iana.org/assignments/http-status-codes/http-status-codes-1.csv \ - # | ruby -rcsv -e "puts CSV.parse(STDIN, headers: true) \ - # .reject {|v| v['Description'] == 'Unassigned' or v['Description'].include? '(' } \ - # .map {|v| %Q/#{v['Value']} => '#{v['Description']}'/ }.join(','+?\n)" - HTTP_STATUS_CODES = { - 100 => 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', - 103 => 'Early Hints', - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - 207 => 'Multi-Status', - 208 => 'Already Reported', - 226 => 'IM Used', - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 307 => 'Temporary Redirect', - 308 => 'Permanent Redirect', - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Content Too Large', - 414 => 'URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Range Not Satisfiable', - 417 => 'Expectation Failed', - 421 => 'Misdirected Request', - 422 => 'Unprocessable Content', - 423 => 'Locked', - 424 => 'Failed Dependency', - 425 => 'Too Early', - 426 => 'Upgrade Required', - 428 => 'Precondition Required', - 429 => 'Too Many Requests', - 431 => 'Request Header Fields Too Large', - 451 => 'Unavailable For Legal Reasons', - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 506 => 'Variant Also Negotiates', - 507 => 'Insufficient Storage', - 508 => 'Loop Detected', - 511 => 'Network Authentication Required' - } - - # Responses with HTTP status codes that should not have an entity body - STATUS_WITH_NO_ENTITY_BODY = Hash[((100..199).to_a << 204 << 304).product([true])] - - SYMBOL_TO_STATUS_CODE = Hash[*HTTP_STATUS_CODES.map { |code, message| - [message.downcase.gsub(/\s|-/, '_').to_sym, code] - }.flatten] - - OBSOLETE_SYMBOLS_TO_STATUS_CODES = { - payload_too_large: 413, - unprocessable_entity: 422, - bandwidth_limit_exceeded: 509, - not_extended: 510 - }.freeze - private_constant :OBSOLETE_SYMBOLS_TO_STATUS_CODES - - OBSOLETE_SYMBOL_MAPPINGS = { - payload_too_large: :content_too_large, - unprocessable_entity: :unprocessable_content - }.freeze - private_constant :OBSOLETE_SYMBOL_MAPPINGS - - def status_code(status) - if status.is_a?(Symbol) - SYMBOL_TO_STATUS_CODE.fetch(status) do - fallback_code = OBSOLETE_SYMBOLS_TO_STATUS_CODES.fetch(status) { raise ArgumentError, "Unrecognized status code #{status.inspect}" } - message = "Status code #{status.inspect} is deprecated and will be removed in a future version of Rack." - if canonical_symbol = OBSOLETE_SYMBOL_MAPPINGS[status] - message = "#{message} Please use #{canonical_symbol.inspect} instead." - end - warn message, uplevel: 3 - fallback_code - end - else - status.to_i - end - end - - PATH_SEPS = Regexp.union(*[::File::SEPARATOR, ::File::ALT_SEPARATOR].compact) - - def clean_path_info(path_info) - parts = path_info.split PATH_SEPS - - clean = [] - - parts.each do |part| - next if part.empty? || part == '.' - part == '..' ? clean.pop : clean << part - end - - clean_path = clean.join(::File::SEPARATOR) - clean_path.prepend("/") if parts.empty? || parts.first.empty? - clean_path - end - - NULL_BYTE = "\0" - - def valid_path?(path) - path.valid_encoding? && !path.include?(NULL_BYTE) - end - - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/version.rb b/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/version.rb deleted file mode 100644 index 1635d4e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-3.2.0/lib/rack/version.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -# Copyright (C) 2007-2019 Leah Neukirchen -# -# Rack is freely distributable under the terms of an MIT-style license. -# See MIT-LICENSE or https://opensource.org/licenses/MIT. - -module Rack - VERSION = "3.2.0" - - RELEASE = VERSION - - # Return the Rack release as a dotted string. - def self.release - VERSION - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/History.md b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/History.md deleted file mode 100644 index 0deacec..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/History.md +++ /dev/null @@ -1,389 +0,0 @@ -## 2.2.0 / 2024-12-23 - -* Bug fixes: - * `Rack::Test::Cookie` now parses cookie parameters using a - case-insensitive approach (Guillaume Malette #349) - -* Minor enhancements: - * Arrays of cookies containing a blank cookie are now handled - correctly when processing responses. (Martin Emde #343) - * `Rack::Test::UploadedFile` no longer uses a finalizer for named - paths to close and unlink the created Tempfile. Tempfile itself - uses a finalizer to close and unlink itself, so there is no - reason for `Rack::Test::UploadedFile` to do so (Jeremy Evans #338) - -## 2.1.0 / 2023-03-14 - -* Breaking changes: - * Digest authentication support, deprecated in 2.0.0, has been - removed (Jeremy Evans #307) - * requiring rack/mock_session, deprecated in 2.0.0, has been removed - (Jeremy Evans #307) - -* Minor enhancements: - * The `original_filename` for `Rack::Test::UploadedFile` can now be - set even if the content of the file comes from a file path - (Stuart Chinery #314) - * Add `Rack::Test::Session#restore_state`, for executing a block - and restoring current state (last request, last response, and - cookies) after the block (Jeremy Evans #316) - * Make `Rack::Test::Methods` support `default_host` method similar to - `app`, which will set the default host used for requests to the app - (Jeremy Evans #317 #318) - * Allow responses to set cookie paths not matching the current - request URI. Such cookies will only be sent for paths matching - the cookie path (Chris Waters #322) - * Ignore leading dot for cookie domains, per RFC 6265 (Stephen Crosby - #329) - * Avoid creating empty multipart body if params is empty in - `Rack::Test::Session#env_for` (Ryunosuke Sato #331) - -## 2.0.2 / 2022-06-28 - -* Bug fixes: - * Fix additional incompatible character encodings error when building - uploaded bodies (Jeremy Evans #311) - -## 2.0.1 / 2022-06-27 - -* Bug fixes: - * Fix incompatible character encodings error when building uploaded - file bodies (Jeremy Evans #308 #309) - -## 2.0.0 / 2022-06-24 - -* Breaking changes: - * Digest authentication support is now deprecated, as it relies on - digest authentication support in rack, which has been deprecated - (Jeremy Evans #294) - * `Rack::Test::Utils.build_primitive_part` no longer handles array - values (Jeremy Evans #292) - * `Rack::Test::Utils` module methods other than `build_nested_query` - and `build_multipart` are now private methods (Jeremy Evans #297) - * `Rack::MockSession` has been combined into `Rack::Test::Session`, - and remains as an alias to `Rack::Test::Session`, but to keep some - backwards compatibility, `Rack::Test::Session.new` will accept a - `Rack::Test::Session` instance and return it (Jeremy Evans #297) - * Previously protected methods in `Rack::Test::Cookie{,Jar}` are now - private methods (Jeremy Evans #297) - * `Rack::Test::Methods` no longer defines `build_rack_mock_session`, - but for backwards compatibility, `build_rack_test_session` will call - `build_rack_mock_session` if it is defined (Jeremy Evans #297) - * `Rack::Test::Methods::METHODS` is no longer defined - (Jeremy Evans #297) - * `Rack::Test::Methods#_current_session_names` has been removed - (Jeremy Evans #297) - * Headers used/accessed by rack-test are now lower case, for rack 3 - compliance (Jeremy Evans #295) - * Frozen literal strings are now used internally, which may break - code that mutates static strings returned by rack-test, if any - (Jeremy Evans #304) - -* Minor enhancements: - * rack-test now works with the rack main branch (what will be rack 3) - (Jeremy Evans #280 #292) - * rack-test only loads the parts of rack it uses when running on the - rack main branch (what will be rack 3) (Jeremy Evans #292) - * Development dependencies have been significantly reduced, and are - now a subset of the development dependencies of rack itself - (Jeremy Evans #292) - * Avoid creating multiple large copies of uploaded file data in - memory (Jeremy Evans #286) - * Specify HTTP/1.0 when submitting requests, to avoid responses with - Transfer-Encoding: chunked (Jeremy Evans #288) - * Support `:query_params` in rack environment for parameters that - are appended to the query string instead of used in the request - body (Jeremy Evans #150 #287) - * Reduce required ruby version to 2.0, since tests run fine on - Ruby 2.0 (Jeremy Evans #292) - * Support :multipart env key for request methods to force multipart - input (Jeremy Evans #303) - * Force multipart input for request methods if content type starts - with multipart (Jeremy Evans #303) - * Improve performance of Utils.build_multipart by using an - append-only design (Jeremy Evans #304) - * Improve performance of Utils.build_nested_query for array values - (Jeremy Evans #304) - -* Bug fixes: - * The `CONTENT_TYPE` of multipart requests is now respected, if it - starts with `multipart/` (Tom Knig #238) - * Work correctly with responses that respond to `to_a` but not - `to_ary` (Sergio Faria #276) - * Raise an ArgumentError instead of a TypeError when providing a - StringIO without an original filename when creating an - UploadedFile (Nuno Correia #279) - * Allow combining both an UploadedFile and a plain string when - building a multipart upload (Mitsuhiro Shibuya #278) - * Fix the generation of filenames with spaces to use path - escaping instead of regular escaping, since path unescaping is - used to decode it (Muir Manders, Jeremy Evans #275 #284) - * Rewind tempfile used for multipart uploads before it is - submitted to the application - (Jeremy Evans, Alexander Dervish #261 #268 #286) - * Fix Rack::Test.encoding_aware_strings to be true only on rack - 1.6+ (Jeremy Evans #292) - * Make Rack::Test::CookieJar#valid? return true/false - (Jeremy Evans #292) - * Cookies without a domain attribute no longer are submitted to - requests for subdomains of that domain, for RFC 6265 - compliance (Jeremy Evans #292) - * Increase required rack version to 1.3, since tests fail on - rack 1.2 and below (Jeremy Evans #293) - -## 1.1.0 / 2018-07-21 - -* Breaking changes: - * None - -* Minor enhancements / new functionality: - * [GitHub] Added configuration for Stale (Per Lundberg #232) - * follow_direct: Include rack.session.options (Mark Edmondson #233) - * [CI] Add simplecov (fatkodima #227) - -* Bug fixes: - * Follow relative locations correctly. (Samuel Williams #230) - -## 1.0.0 / 2018-03-27 - -* Breaking changes: - * Always set CONTENT_TYPE for non-GET requests - (Per Lundberg #223) - -* Minor enhancements / bug fixes: - * Create tempfile using the basename without extension - (Edouard Chin #201) - * Save `session` during `follow_redirect!` - (Alexander Popov #218) - * Document how to use URL params with DELETE method - (Timur Platonov #220) - -## 0.8.3 / 2018-02-27 - -* Bug fixes: - * Do not set Content-Type if params are explicitly set to nil - (Bartek Bułat #212). Fixes #200. - * Fix `UploadedFile#new` regression - (Per Lundberg #215) - -* Minor enhancements - * [CI] Test against Ruby 2.5 (Nicolas Leger #217) - -## 0.8.2 / 2017-11-21 - -* Bug fixes: - * Bugfix for `UploadedFile.new` unintended API breakage. - (Per Lundberg #210) - -## 0.8.0 / 2017-11-20 - -* Known Issue - * In `UploadedFile.new`, when passing e.g. a `Pathname` object, - errors can be raised (eg. `ArgumentError: Missing original_filename - for IO`, or `NoMethodError: undefined method 'size'`) See #207, #209. -* Minor enhancements - * Add a required_ruby_version of >= 2.2.2, similar to rack 2.0.1. - (Samuel Giddins #194) - * Remove new line from basic auth. (Felix Kleinschmidt #185) - * Rubocop fixes (Per Lundberg #196) - * Add how to install rack-test from github to README. (Jun Aruga #189) - * Update CodeClimate badges (Toshimaru #195) - * Add the ability to create Test::UploadedFile instances without - the file system (Adam Milligan #149) - * Add custom_request, remove duplication (Johannes Barre #184) - * README.md: Added note about how to post JSON (Per Lundberg #198) - * README.md: Added version badge (Per Lundberg #199) -* Bug fixes - * Bugfix for Cookies with multiple paths (Kyle Welsby #197) - -## 0.7.0 / 2017-07-10 - -* Major enhancements - * The project URL changed to https://github.com/rack-test/rack-test - (Per Lundberg, Dennis Sivia, Jun Aruga) - * Rack 2 compatible. (Trevor Wennblom #81, Vít Ondruch, Jun Aruga #151) -* Minor enhancements - * Port to RSpec 3. (Murahashi [Matt] Kenichi #70, Antonio Terceiro #134) - * Add Travis CI (Johannes Barre #108, Jun Aruga #161) - * Don't append an ampersand when params are empty (sbilharz, #157) - * Allow symbol access to cookies (Anorlondo448 #156) - * README: Added Travis badge (Olivier Lacan, Per Lundberg #146) - * `Rack::Test::Utils#build_multipart`: Allow passing a third parameter - to force multipart (Koen Punt #142) - * Allow better testing of cookies (Stephen Best #133) - * make `build_multipart` work without mixing in `Rack::Test::Utils` - (Aaron Patterson #131) - * Add license to gemspec (Jordi Massaguer Pla #72, Anatol Pomozov #89, - Anatol Pomozov #90, Johannes Barre #109, Mandaryn #115, - Chris Marshall #120, Robert Reiz #126, Nic Benders #127, Nic Benders #130) - * Feature/bulk pr for readme updates (Patrick Mulder #65, - Troels Knak-Nielsen #74, Jeff Casimir #76) - * Switch README format to Markdown (Dennis Sivia #176) - * Convert History.txt to Markdown (Dennis Sivia #179) - * Stop generating gemspec file. (Jun Aruga #181) - * Fix errors at rake docs and whitespace. (Jun Aruga #183) - * Ensure Rack::Test::UploadedFile closes its tempfile file descriptor - on GC (Michael de Silva #180) - * Change codeclimate URL correctly. (Jun Aruga #186) -* Bug fixes - * Initialize digest_username before using it. (Guo Xiang Tan #116, - John Drago #124, Mike Perham #154) - * Do not set Content-Type for DELETE requests (David Celis #132) - * Adds support for empty arrays in params. (Cedric Röck, Tim Masliuchenko - #125) - * Update README code example quotes to be consistent. (Dmitry Gritsay #112) - * Update README not to recommend installing gem with sudo. (T.J. Schuck #87) - * Set scheme when using ENV to enable SSL (Neil Ang #155) - * Reuse request method and parameters on HTTP 307 redirect. (Martin Mauch - #138) - -## 0.6.3 / 2015-01-09 - -* Minor enhancements - * Expose an env helper for persistently configuring the env as needed - (Darío Javier Cravero #80) - * Expose the tempfile of UploadedFile (Sytse Sijbrandij #67) -* Bug fixes - * Improve support for arrays of hashes in multipart forms (Murray Steele #69) - * Improve test for query strings (Paul Grayson #66) - -## 0.6.2 / 2012-09-27 - -* Minor enhancements - * Support HTTP PATCH method (Marjan Krekoten' #33) - * Preserve the exact query string when possible (Paul Grayson #63) - * Add a #delete method to CookieJar (Paul Grayson #63) -* Bug fixes - * Fix HTTP Digest authentication when the URI has query params - * Don't append default ports to HTTP_HOST (David Lee #57) - -## 0.6.1 / 2011-07-27 - -* Bug fixes - * Fix support for params with arrays in multipart forms (Joel Chippindale) - * Add `respond_to?` to `Rack::Test::UploadedFile` to match `method_missing` (Josh Nichols) - * Set the Referer header on requests issued by follow_redirect! (Ryan Bigg) - -## 0.6.0 / 2011-05-03 - -* Bug fixes - * Add support for HTTP OPTIONS verb (Paolo "Nusco" Perrotta) - * Call #finish on MockResponses if it's available (Aaron Patterson) - * Allow HTTP_HOST to be set via #header (Geoff Buesing) - -## 0.5.7 / 2011-01-01 -* Bug fixes - * If no URI is present, include all cookies (Pratik Naik) - -## 0.5.6 / 2010-09-25 - -* Bug fixes - * Use parse_nested_query for parsing URI like Rack does (Eugene Bolshakov) - * Don't depend on ActiveSupport extension to String (Bryan Helmkamp) - * Do not overwrite HTTP_HOST if it is set (Krekoten' Marjan) - -## 0.5.5 / 2010-09-22 - -* Bug fixes - * Fix encoding of file uploads on Ruby 1.9 (Alan Kennedy) - * Set env["HTTP_HOST"] when making requests (Istvan Hoka) - -## 0.5.4 / 2010-05-26 - -* Bug fixes - * Don't stomp on Content-Type's supplied via #header (Bryan Helmkamp) - * Fixed build_multipart to allow for arrays of files (Louis Rose) - * Don't raise an error if raw cookies contain a blank line (John Reilly) - * Handle parameter names with brackets properly (Tanner Donovan) - -## 0.5.3 / 2009-11-27 - -* Bug fixes - * Fix cookie matching for subdomains (Marcin Kulik) - -## 0.5.2 / 2009-11-13 - -* Bug fixes - * Call close on response body after iteration, not before (Simon Rozet) - * Add missing require for time in cookie_jar.rb (Jerry West) - -## 0.5.1 / 2009-10-27 - -* Bug fixes - * Escape cookie values (John Pignata) - * Close the response body after each request, as per the Rack spec (Elomar França) - -## 0.5.0 / 2009-09-19 - -* Bug fixes - * Set HTTP_X_REQUESTED_WITH in the Rack env when a request is made with :xhr => true (Ben Sales) - * Set headers in the Rack env in HTTP_USER_AGENT form - * Rack::Test now generates no Ruby warnings - -## 0.4.2 / 2009-09-01 - -* Minor enhancements - * Merge in rack/master's build_multipart method which covers additional cases - * Accept raw :params string input and merge it with the query string - * Stringify and upcase request method (e.g. :post => "POST") (Josh Peek) -* Bug fixes - * Properly convert hashes with nil values (e.g. :foo => nil becomes simply "foo", not "foo=") - * Prepend a slash to the URI path if it doesn't start with one (Josh Peek) - * Requiring Rack-Test never modifies the Ruby load path anymore (Josh Peek) - * Fixed using multiple cookies in a string on Ruby 1.8 (Tuomas Kareinen and Hermanni Hyytiälä) - -## 0.4.1 / 2009-08-06 - -* Minor enhancements - * Support initializing a `Rack::Test::Session` with an app in addition to - a `Rack::MockSession` - * Allow CONTENT_TYPE to be specified in the env and not overwritten when - sending a POST or PUT - -## 0.4.0 / 2009-06-25 - -* Minor enhancements - * Expose hook for building `Rack::MockSessions` for frameworks that need - to configure them before use - * Support passing in arrays of raw cookies in addition to a newline - separated string - * Support after_request callbacks in MockSession for things like running - background jobs - * Allow multiple named sessions using with_session - * Initialize `Rack::Test::Sessions` with `Rack::MockSessions` instead of apps. - This change should help integration with other Ruby web frameworks - (like Merb). - * Support sending bodies for PUT requests (Larry Diehl) - -## 0.3.0 / 2009-05-17 - -* Major enhancements - * Ruby 1.9 compatible (Simon Rozet, Michael Fellinger) -* Minor enhancements - * Add `CookieJar#[]` and `CookieJar#[]=` methods - * Make the default host configurable - * Use `Rack::Lint` and fix errors (Simon Rozet) - * Extract `Rack::MockSession` from `Rack::Test::Session` to handle tracking - the last request and response and the cookie jar - * Add #set_cookie and #clear_cookies methods - * Rename #authorize to #basic_authorize (#authorize remains as an alias) - (Simon Rozet) - -## 0.2.0 / 2009-04-26 - -Because `#last_response` is now a `MockResponse` instead of a `Rack::Response`, `#last_response.body` -now returns a string instead of an array. - -* Major enhancements - * Support multipart requests via the UploadedFile class (thanks, Rails) -* Minor enhancements - * Updated for Rack 1.0 - * Don't require rubygems (See http://gist.github.com/54177) - * Support HTTP Digest authentication with the `#digest_authorize` method - * `#last_response` returns a `MockResponse` instead of a Response - (Michael Fellinger) - -## 0.1.0 / 2009-03-02 - -* 1 major enhancement - * Birthday! diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/MIT-LICENSE.txt b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/MIT-LICENSE.txt deleted file mode 100644 index 78b1b57..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/MIT-LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2008-2009 Bryan Helmkamp, Engine Yard Inc. -Copyright (c) 2022 Jeremy Evans - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/README.md b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/README.md deleted file mode 100644 index cfa24e6..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/README.md +++ /dev/null @@ -1,139 +0,0 @@ -# Rack::Test -[![Gem Version](https://badge.fury.io/rb/rack-test.svg)](https://badge.fury.io/rb/rack-test) - -Code: https://github.com/rack/rack-test - -## Description - -Rack::Test is a small, simple testing API for Rack apps. It can be used on its -own or as a reusable starting point for Web frameworks and testing libraries -to build on. - -## Features - -* Allows for submitting requests and testing responses -* Maintains a cookie jar across requests -* Supports request headers used for subsequent requests -* Follow redirects when requested - -## Examples - -These examples use `test/unit` but it's equally possible to use `rack-test` with -other testing frameworks such as `minitest` or `rspec`. - -```ruby -require "test/unit" -require "rack/test" -require "json" - -class HomepageTest < Test::Unit::TestCase - include Rack::Test::Methods - - def app - lambda { |env| [200, {'content-type' => 'text/plain'}, ['All responses are OK']] } - end - - def test_response_is_ok - # Optionally set headers used for all requests in this spec: - #header 'accept-charset', 'utf-8' - - # First argument is treated as the path - get '/' - - assert last_response.ok? - assert_equal 'All responses are OK', last_response.body - end - - def delete_with_url_params_and_body - # First argument can have a query string - # - # Second argument is used as the parameters for the request, which will be - # included in the request body for non-GET requests. - delete '/?foo=bar', JSON.generate('baz' => 'zot') - end - - def post_with_json - # Third argument is the rack environment to use for the request. The following - # entries in the submitted rack environment are treated specially (in addition - # to options supported by `Rack::MockRequest#env_for`: - # - # :cookie : Set a cookie for the current session before submitting the request. - # - # :query_params : Set parameters for the query string (as opposed to the body). - # Value should be a hash of parameters. - # - # :xhr : Set HTTP_X_REQUESTED_WITH env key to XMLHttpRequest. - post(uri, JSON.generate('baz' => 'zot'), 'CONTENT_TYPE' => 'application/json') - end -end -``` - -`rack-test` will test the app returned by the `app` method. If you are loading middleware -in a `config.ru` file, and want to test that, you should load the Rack app created from -the `config.ru` file: - -```ruby -OUTER_APP = Rack::Builder.parse_file("config.ru").first - -class TestApp < Test::Unit::TestCase - include Rack::Test::Methods - - def app - OUTER_APP - end - - def test_root - get "/" - assert last_response.ok? - end -end -``` - -## Install - -To install the latest release as a gem: - -``` -gem install rack-test -``` - -Or add to your `Gemfile`: - -``` -gem 'rack-test' -``` - -## Contribution - -Contributions are welcome. Please make sure to: - -* Use a regular forking workflow -* Write tests for the new or changed behaviour -* Provide an explanation/motivation in your commit message / PR message -* Ensure `History.md` is updated - -## Authors - -- Contributions from Bryan Helmkamp, Jeremy Evans, Simon Rozet, and others -- Much of the original code was extracted from Merb 1.0's request helper - -## License - -`rack-test` is released under the [MIT License](MIT-LICENSE.txt). - -## Supported platforms - -* Ruby 2.0+ -* JRuby 9.1+ - -## Releasing - -* Bump VERSION in lib/rack/test/version.rb -* Ensure `History.md` is up-to-date, including correct version and date -* `git commit . -m 'Release $VERSION'` -* `git push` -* `git tag -a -m 'Tag the $VERSION release' $VERSION` -* `git push --tags` -* `gem build rack-test.gemspec` -* `gem push rack-test-$VERSION.gem` -* Add a discussion post for the release diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test.rb b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test.rb deleted file mode 100644 index 0b519e9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test.rb +++ /dev/null @@ -1,382 +0,0 @@ -# frozen_string_literal: true - -require 'uri' - -# :nocov: -begin - require "rack/version" -rescue LoadError - require "rack" -else - if Rack.release >= '2.3' - require "rack/request" - require "rack/mock" - require "rack/utils" - else - require "rack" - end -end -# :nocov: - -require 'forwardable' - -require_relative 'test/cookie_jar' -require_relative 'test/utils' -require_relative 'test/methods' -require_relative 'test/uploaded_file' -require_relative 'test/version' - -module Rack - module Test - # The default host to use for requests, when a full URI is not - # provided. - DEFAULT_HOST = 'example.org'.freeze - - # The default multipart boundary to use for multipart request bodies - MULTIPART_BOUNDARY = '----------XnJLe9ZIbbGUYtzPQJ16u1'.freeze - - # The starting boundary in multipart requests - START_BOUNDARY = "--#{MULTIPART_BOUNDARY}\r\n".freeze - - # The ending boundary in multipart requests - END_BOUNDARY = "--#{MULTIPART_BOUNDARY}--\r\n".freeze - - # The common base class for exceptions raised by Rack::Test - class Error < StandardError; end - - # Rack::Test::Session handles a series of requests issued to a Rack app. - # It keeps track of the cookies for the session, and allows for setting headers - # and a default rack environment that is used for future requests. - # - # Rack::Test::Session's methods are most often called through Rack::Test::Methods, - # which will automatically build a session when it's first used. - class Session - extend Forwardable - include Rack::Test::Utils - - def self.new(app, default_host = DEFAULT_HOST) # :nodoc: - if app.is_a?(self) - # Backwards compatibility for initializing with Rack::MockSession - app - else - super - end - end - - # The Rack::Test::CookieJar for the cookies for the current session. - attr_accessor :cookie_jar - - # The default host used for the session for when using paths for URIs. - attr_reader :default_host - - # Creates a Rack::Test::Session for a given Rack app or Rack::Test::BasicSession. - # - # Note: Generally, you won't need to initialize a Rack::Test::Session directly. - # Instead, you should include Rack::Test::Methods into your testing context. - # (See README.rdoc for an example) - # - # The following methods are defined via metaprogramming: get, post, put, patch, - # delete, options, and head. Each method submits a request with the given request - # method, with the given URI and optional parameters and rack environment. - # Examples: - # - # # URI only: - # get("/") # GET / - # get("/?foo=bar") # GET /?foo=bar - # - # # URI and parameters - # get("/foo", 'bar'=>'baz') # GET /foo?bar=baz - # post("/foo", 'bar'=>'baz') # POST /foo (bar=baz in request body) - # - # # URI, parameters, and rack environment - # get("/bar", {}, 'CONTENT_TYPE'=>'foo') - # get("/bar", {'foo'=>'baz'}, 'HTTP_ACCEPT'=>'*') - # - # The above methods as well as #request and #custom_request store the Rack::Request - # submitted in #last_request. The methods store a Rack::MockResponse based on the - # response in #last_response. #last_response is also returned by the methods. - # If a block is given, #last_response is also yielded to the block. - def initialize(app, default_host = DEFAULT_HOST) - @env = {} - @app = app - @after_request = [] - @default_host = default_host - @last_request = nil - @last_response = nil - clear_cookies - end - - %w[get post put patch delete options head].each do |method_name| - class_eval(<<-END, __FILE__, __LINE__+1) - def #{method_name}(uri, params = {}, env = {}, &block) - custom_request('#{method_name.upcase}', uri, params, env, &block) - end - END - end - - # Run a block after the each request completes. - def after_request(&block) - @after_request << block - end - - # Replace the current cookie jar with an empty cookie jar. - def clear_cookies - @cookie_jar = CookieJar.new([], @default_host) - end - - # Set a cookie in the current cookie jar. - def set_cookie(cookie, uri = nil) - cookie_jar.merge(cookie, uri) - end - - # Return the last request issued in the session. Raises an error if no - # requests have been sent yet. - def last_request - raise Error, 'No request yet. Request a page first.' unless @last_request - @last_request - end - - # Return the last response received in the session. Raises an error if - # no requests have been sent yet. - def last_response - raise Error, 'No response yet. Request a page first.' unless @last_response - @last_response - end - - # Issue a request to the Rack app for the given URI and optional Rack - # environment. Example: - # - # request "/" - def request(uri, env = {}, &block) - uri = parse_uri(uri, env) - env = env_for(uri, env) - process_request(uri, env, &block) - end - - # Issue a request using the given HTTP verb for the given URI, with optional - # params and rack environment. Example: - # - # custom_request "LINK", "/" - def custom_request(verb, uri, params = {}, env = {}, &block) - uri = parse_uri(uri, env) - env = env_for(uri, env.merge(method: verb.to_s.upcase, params: params)) - process_request(uri, env, &block) - end - - # Set a header to be included on all subsequent requests through the - # session. Use a value of nil to remove a previously configured header. - # - # In accordance with the Rack spec, headers will be included in the Rack - # environment hash in HTTP_USER_AGENT form. Example: - # - # header "user-agent", "Firefox" - def header(name, value) - name = name.upcase - name.tr!('-', '_') - name = "HTTP_#{name}" unless name == 'CONTENT_TYPE' || name == 'CONTENT_LENGTH' - env(name, value) - end - - # Set an entry in the rack environment to be included on all subsequent - # requests through the session. Use a value of nil to remove a previously - # value. Example: - # - # env "rack.session", {:csrf => 'token'} - def env(name, value) - if value.nil? - @env.delete(name) - else - @env[name] = value - end - end - - # Set the username and password for HTTP Basic authorization, to be - # included in subsequent requests in the HTTP_AUTHORIZATION header. - # - # Example: - # basic_authorize "bryan", "secret" - def basic_authorize(username, password) - encoded_login = ["#{username}:#{password}"].pack('m0') - header('Authorization', "Basic #{encoded_login}") - end - - alias authorize basic_authorize - - # Rack::Test will not follow any redirects automatically. This method - # will follow the redirect returned (including setting the Referer header - # on the new request) in the last response. If the last response was not - # a redirect, an error will be raised. - def follow_redirect! - unless last_response.redirect? - raise Error, 'Last response was not a redirect. Cannot follow_redirect!' - end - - if last_response.status == 307 - request_method = last_request.request_method - params = last_request.params - else - request_method = 'GET' - params = {} - end - - # Compute the next location by appending the location header with the - # last request, as per https://tools.ietf.org/html/rfc7231#section-7.1.2 - # Adding two absolute locations returns the right-hand location - next_location = URI.parse(last_request.url) + URI.parse(last_response['Location']) - - custom_request( - request_method, - next_location.to_s, - params, - 'HTTP_REFERER' => last_request.url, - 'rack.session' => last_request.session, - 'rack.session.options' => last_request.session_options - ) - end - - # Yield to the block, and restore the last request, last response, and - # cookie jar to the state they were prior to block execution upon - # exiting the block. - def restore_state - request = @last_request - response = @last_response - cookie_jar = @cookie_jar.dup - after_request = @after_request.dup - - begin - yield - ensure - @last_request = request - @last_response = response - @cookie_jar = cookie_jar - @after_request = after_request - end - end - - private - - # :nocov: - if !defined?(Rack::RELEASE) || Gem::Version.new(Rack::RELEASE) < Gem::Version.new('2.2.2') - def close_body(body) - body.close if body.respond_to?(:close) - end - # :nocov: - else - # close() gets called automatically in newer Rack versions. - def close_body(body) - end - end - - # Normalize URI based on given URI/path and environment. - def parse_uri(path, env) - uri = URI.parse(path) - uri.path = "/#{uri.path}" unless uri.path.start_with?('/') - uri.host ||= @default_host - uri.scheme ||= 'https' if env['HTTPS'] == 'on' - uri - end - - DEFAULT_ENV = { - 'rack.test' => true, - 'REMOTE_ADDR' => '127.0.0.1', - 'SERVER_PROTOCOL' => 'HTTP/1.0', - } - # :nocov: - unless Rack.release >= '2.3' - DEFAULT_ENV['HTTP_VERSION'] = DEFAULT_ENV['SERVER_PROTOCOL'] - end - # :nocov: - DEFAULT_ENV.freeze - private_constant :DEFAULT_ENV - - # Update environment to use based on given URI. - def env_for(uri, env) - env = DEFAULT_ENV.merge(@env).merge!(env) - - env['HTTP_HOST'] ||= [uri.host, (uri.port if uri.port != uri.default_port)].compact.join(':') - env['HTTPS'] = 'on' if URI::HTTPS === uri - env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest' if env[:xhr] - env['REQUEST_METHOD'] ||= env[:method] ? env[:method].to_s.upcase : 'GET' - - params = env.delete(:params) - query_array = [uri.query] - - if env['REQUEST_METHOD'] == 'GET' - # Treat params as query params - if params - append_query_params(query_array, params) - end - elsif !env.key?(:input) - env['CONTENT_TYPE'] ||= 'application/x-www-form-urlencoded' - params ||= {} - multipart = env.has_key?(:multipart) ? env.delete(:multipart) : env['CONTENT_TYPE'].start_with?('multipart/') - - if params.is_a?(Hash) - if !params.empty? && data = build_multipart(params, false, multipart) - env[:input] = data - env['CONTENT_LENGTH'] ||= data.length.to_s - env['CONTENT_TYPE'] = "#{multipart_content_type(env)}; boundary=#{MULTIPART_BOUNDARY}" - else - env[:input] = build_nested_query(params) - end - else - env[:input] = params - end - end - - if query_params = env.delete(:query_params) - append_query_params(query_array, query_params) - end - query_array.compact! - query_array.reject!(&:empty?) - uri.query = query_array.join('&') - - set_cookie(env.delete(:cookie), uri) if env.key?(:cookie) - - Rack::MockRequest.env_for(uri.to_s, env) - end - - # Append a string version of the query params to the array of query params. - def append_query_params(query_array, query_params) - query_params = parse_nested_query(query_params) if query_params.is_a?(String) - query_array << build_nested_query(query_params) - end - - # Return the multipart content type to use based on the environment. - def multipart_content_type(env) - requested_content_type = env['CONTENT_TYPE'] - if requested_content_type.start_with?('multipart/') - requested_content_type - else - 'multipart/form-data' - end - end - - # Submit the request with the given URI and rack environment to - # the mock session. Returns and potentially yields the last response. - def process_request(uri, env) - env['HTTP_COOKIE'] ||= cookie_jar.for(uri) - @last_request = Rack::Request.new(env) - status, headers, body = @app.call(env).to_a - - @last_response = MockResponse.new(status, headers, body, env['rack.errors'].flush) - close_body(body) - cookie_jar.merge(last_response.headers['set-cookie'], uri) - @after_request.each(&:call) - @last_response.finish - - yield @last_response if block_given? - - @last_response - end - end - - # Whether the version of rack in use handles encodings. - def self.encoding_aware_strings? - Rack.release >= '1.6' - end - end - - # For backwards compatibility with 1.1.0 and below - MockSession = Test::Session -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/cookie_jar.rb b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/cookie_jar.rb deleted file mode 100644 index d09a5bb..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/cookie_jar.rb +++ /dev/null @@ -1,251 +0,0 @@ -# frozen_string_literal: true - -require 'uri' -require 'time' - -module Rack - module Test - # Represents individual cookies in the cookie jar. This is considered private - # API and behavior of this class can change at any time. - class Cookie # :nodoc: - include Rack::Utils - - # The name of the cookie, will be a string - attr_reader :name - - # The value of the cookie, will be a string or nil if there is no value. - attr_reader :value - - # The raw string for the cookie, without options. Will generally be in - # name=value format is name and value are provided. - attr_reader :raw - - def initialize(raw, uri = nil, default_host = DEFAULT_HOST) - @default_host = default_host - uri ||= default_uri - - # separate the name / value pair from the cookie options - @raw, options = raw.split(/[;,] */n, 2) - - @name, @value = parse_query(@raw, ';').to_a.first - @options = Hash[parse_query(options, ';').map { |k, v| [k.downcase, v] }] - - if domain = @options['domain'] - @exact_domain_match = false - domain[0] = '' if domain[0] == '.' - else - # If the domain attribute is not present in the cookie, - # the domain must match exactly. - @exact_domain_match = true - @options['domain'] = (uri.host || default_host) - end - - # Set the path for the cookie to the directory containing - # the request if it isn't set. - @options['path'] ||= uri.path.sub(/\/[^\/]*\Z/, '') - end - - # Wether the given cookie can replace the current cookie in the cookie jar. - def replaces?(other) - [name.downcase, domain, path] == [other.name.downcase, other.domain, other.path] - end - - # Whether the cookie has a value. - def empty? - @value.nil? || @value.empty? - end - - # The explicit or implicit domain for the cookie. - def domain - @options['domain'] - end - - # Whether the cookie has the secure flag, indicating it can only be sent over - # an encrypted connection. - def secure? - @options.key?('secure') - end - - # Whether the cookie has the httponly flag, indicating it is not available via - # a javascript API. - def http_only? - @options.key?('httponly') - end - - # The explicit or implicit path for the cookie. - def path - ([*@options['path']].first.split(',').first || '/').strip - end - - # A Time value for when the cookie expires, if the expires option is set. - def expires - Time.parse(@options['expires']) if @options['expires'] - end - - # Whether the cookie is currently expired. - def expired? - expires && expires < Time.now - end - - # Whether the cookie is valid for the given URI. - def valid?(uri) - uri ||= default_uri - - uri.host = @default_host if uri.host.nil? - - !!((!secure? || (secure? && uri.scheme == 'https')) && - uri.host =~ Regexp.new("#{'^' if @exact_domain_match}#{Regexp.escape(domain)}$", Regexp::IGNORECASE)) - end - - # Cookies that do not match the URI will not be sent in requests to the URI. - def matches?(uri) - !expired? && valid?(uri) && uri.path.start_with?(path) - end - - # Order cookies by name, path, and domain. - def <=>(other) - [name, path, domain.reverse] <=> [other.name, other.path, other.domain.reverse] - end - - # A hash of cookie options, including the cookie value, but excluding the cookie name. - def to_h - hash = @options.merge( - 'value' => @value, - 'HttpOnly' => http_only?, - 'secure' => secure? - ) - hash.delete('httponly') - hash - end - alias to_hash to_h - - private - - # The default URI to use for the cookie, including just the host. - def default_uri - URI.parse('//' + @default_host + '/') - end - end - - # Represents all cookies for a session, handling adding and - # removing cookies, and finding which cookies apply to a given - # request. This is considered private API and behavior of this - # class can change at any time. - class CookieJar # :nodoc: - DELIMITER = '; '.freeze - - def initialize(cookies = [], default_host = DEFAULT_HOST) - @default_host = default_host - @cookies = cookies.sort! - end - - # Ensure the copy uses a distinct cookies array. - def initialize_copy(other) - super - @cookies = @cookies.dup - end - - # Return the value for first cookie with the given name, or nil - # if no such cookie exists. - def [](name) - name = name.to_s - @cookies.each do |cookie| - return cookie.value if cookie.name == name - end - nil - end - - # Set a cookie with the given name and value in the - # cookie jar. - def []=(name, value) - merge("#{name}=#{Rack::Utils.escape(value)}") - end - - # Return the first cookie with the given name, or nil if - # no such cookie exists. - def get_cookie(name) - @cookies.each do |cookie| - return cookie if cookie.name == name - end - nil - end - - # Delete all cookies with the given name from the cookie jar. - def delete(name) - @cookies.reject! do |cookie| - cookie.name == name - end - nil - end - - # Add a string of raw cookie information to the cookie jar, - # if the cookie is valid for the given URI. - # Cookies should be separated with a newline. - def merge(raw_cookies, uri = nil) - return unless raw_cookies - - raw_cookies = raw_cookies.split("\n") if raw_cookies.is_a? String - - raw_cookies.each do |raw_cookie| - next if raw_cookie.empty? - cookie = Cookie.new(raw_cookie, uri, @default_host) - self << cookie if cookie.valid?(uri) - end - end - - # Add a Cookie to the cookie jar. - def <<(new_cookie) - @cookies.reject! do |existing_cookie| - new_cookie.replaces?(existing_cookie) - end - - @cookies << new_cookie - @cookies.sort! - end - - # Return a raw cookie string for the cookie header to - # use for the given URI. - def for(uri) - buf = String.new - delimiter = nil - - each_cookie_for(uri) do |cookie| - if delimiter - buf << delimiter - else - delimiter = DELIMITER - end - buf << cookie.raw - end - - buf - end - - # Return a hash cookie names and cookie values for cookies in the jar. - def to_hash - cookies = {} - - @cookies.each do |cookie| - cookies[cookie.name] = cookie.value - end - - cookies - end - - private - - # Yield each cookie that matches for the URI. - # - # The cookies are sorted by most specific first. So, we loop through - # all the cookies in order and add it to a hash by cookie name if - # the cookie can be sent to the current URI. It's added to the hash - # so that when we are done, the cookies will be unique by name and - # we'll have grabbed the most specific to the URI. - def each_cookie_for(uri) - @cookies.each do |cookie| - yield cookie if !uri || cookie.matches?(uri) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/methods.rb b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/methods.rb deleted file mode 100644 index a30d02d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/methods.rb +++ /dev/null @@ -1,94 +0,0 @@ -# frozen_string_literal: true - -require 'forwardable' - -module Rack - module Test - # This module serves as the primary integration point for using Rack::Test - # in a testing environment. It depends on an app method being defined in the - # same context, and provides the Rack::Test API methods (see Rack::Test::Session - # for their documentation). It defines the following methods that are delegated - # to the current session: :request, :get, :post, :put, :patch, :delete, :options, - # :head, :custom_request, :follow_redirect!, :header, :env, :set_cookie, - # :clear_cookies, :authorize, :basic_authorize, :last_response, and :last_request. - # - # Example: - # - # class HomepageTest < Test::Unit::TestCase - # include Rack::Test::Methods - # - # def app - # MyApp - # end - # end - module Methods - extend Forwardable - - # Return the existing session with the given name, or a new - # rack session. Always use a new session if name is nil. - def rack_test_session(name = :default) # :nodoc: - return build_rack_test_session(name) unless name - - @_rack_test_sessions ||= {} - @_rack_test_sessions[name] ||= build_rack_test_session(name) - end - - # For backwards compatibility with older rack-test versions. - alias rack_mock_session rack_test_session # :nodoc: - - # Create a new Rack::Test::Session for #app. - def build_rack_test_session(_name) # :nodoc: - if respond_to?(:build_rack_mock_session, true) - # Backwards compatibility for capybara - build_rack_mock_session - else - if respond_to?(:default_host) - Session.new(app, default_host) - else - Session.new(app) - end - end - end - - # Return the currently actively session. This is the session to - # which the delegated methods are sent. - def current_session - @_rack_test_current_session ||= rack_test_session - end - - # Create a new session (or reuse an existing session with the given name), - # and make it the current session for the given block. - def with_session(name) - session = _rack_test_current_session - yield(@_rack_test_current_session = rack_test_session(name)) - ensure - @_rack_test_current_session = session - end - - def_delegators(:current_session, - :request, - :get, - :post, - :put, - :patch, - :delete, - :options, - :head, - :custom_request, - :follow_redirect!, - :header, - :env, - :set_cookie, - :clear_cookies, - :authorize, - :basic_authorize, - :last_response, - :last_request, - ) - - # Private accessor to avoid uninitialized instance variable warning in Ruby 2.* - attr_accessor :_rack_test_current_session - private :_rack_test_current_session - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/uploaded_file.rb b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/uploaded_file.rb deleted file mode 100644 index 5be6dc7..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/uploaded_file.rb +++ /dev/null @@ -1,99 +0,0 @@ -# frozen_string_literal: true - -require 'fileutils' -require 'tempfile' -require 'stringio' - -module Rack - module Test - # Wraps a Tempfile with a content type. Including one or more UploadedFile's - # in the params causes Rack::Test to build and issue a multipart request. - # - # Example: - # post "/photos", "file" => Rack::Test::UploadedFile.new("me.jpg", "image/jpeg") - class UploadedFile - # The filename, *not* including the path, of the "uploaded" file - attr_reader :original_filename - - # The tempfile - attr_reader :tempfile - - # The content type of the "uploaded" file - attr_accessor :content_type - - # Creates a new UploadedFile instance. - # - # Arguments: - # content :: is a path to a file, or an {IO} or {StringIO} object representing the content. - # content_type :: MIME type of the file - # binary :: Whether the file should be set to binmode (content treated as binary). - # original_filename :: The filename to use for the file. Required if content is StringIO, optional override if not - def initialize(content, content_type = 'text/plain', binary = false, original_filename: nil) - @content_type = content_type - @original_filename = original_filename - - case content - when StringIO - initialize_from_stringio(content) - else - initialize_from_file_path(content) - end - - @tempfile.binmode if binary - end - - # The path to the tempfile. Will not work if the receiver's content is from a StringIO. - def path - tempfile.path - end - alias local_path path - - # Delegate all methods not handled to the tempfile. - def method_missing(method_name, *args, &block) - tempfile.public_send(method_name, *args, &block) - end - - # Append to given buffer in 64K chunks to avoid multiple large - # copies of file data in memory. Rewind tempfile before and - # after to make sure all data in tempfile is appended to the - # buffer. - def append_to(buffer) - tempfile.rewind - - buf = String.new - buffer << tempfile.readpartial(65_536, buf) until tempfile.eof? - - tempfile.rewind - - nil - end - - def respond_to_missing?(method_name, include_private = false) #:nodoc: - tempfile.respond_to?(method_name, include_private) || super - end - - private - - # Use the StringIO as the tempfile. - def initialize_from_stringio(stringio) - raise(ArgumentError, 'Missing `original_filename` for StringIO object') unless @original_filename - - @tempfile = stringio - end - - # Create a tempfile and copy the content from the given path into the tempfile, optionally renaming if - # original_filename has been set. - def initialize_from_file_path(path) - raise "#{path} file does not exist" unless ::File.exist?(path) - - @original_filename ||= ::File.basename(path) - extension = ::File.extname(@original_filename) - - @tempfile = Tempfile.new([::File.basename(@original_filename, extension), extension]) - @tempfile.set_encoding(Encoding::BINARY) - - FileUtils.copy_file(path, @tempfile.path) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/utils.rb b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/utils.rb deleted file mode 100644 index a79a8e7..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/utils.rb +++ /dev/null @@ -1,156 +0,0 @@ -# frozen_string_literal: true - -module Rack - module Test - module Utils # :nodoc: - include Rack::Utils - extend self - - # Build a query string for the given value and prefix. The value - # can be an array or hash of parameters. - def build_nested_query(value, prefix = nil) - case value - when Array - if value.empty? - "#{prefix}[]=" - else - prefix += "[]" unless unescape(prefix).end_with?('[]') - value.map do |v| - build_nested_query(v, prefix.to_s) - end.join('&') - end - when Hash - value.map do |k, v| - build_nested_query(v, prefix ? "#{prefix}[#{escape(k)}]" : escape(k)) - end.join('&') - when NilClass - prefix.to_s - else - "#{prefix}=#{escape(value)}" - end - end - - # Build a multipart body for the given params. - def build_multipart(params, _first = true, multipart = false) - raise ArgumentError, 'value must be a Hash' unless params.is_a?(Hash) - - unless multipart - query = lambda { |value| - case value - when Array - value.each(&query) - when Hash - value.values.each(&query) - when UploadedFile - multipart = true - end - } - params.values.each(&query) - return nil unless multipart - end - - params = normalize_multipart_params(params, true) - - buffer = String.new - build_parts(buffer, params) - buffer - end - - private - - # Return a flattened hash of parameter values based on the given params. - def normalize_multipart_params(params, first=false) - flattened_params = {} - - params.each do |key, value| - k = first ? key.to_s : "[#{key}]" - - case value - when Array - value.map do |v| - if v.is_a?(Hash) - nested_params = {} - normalize_multipart_params(v).each do |subkey, subvalue| - nested_params[subkey] = subvalue - end - (flattened_params["#{k}[]"] ||= []) << nested_params - else - flattened_params["#{k}[]"] = value - end - end - when Hash - normalize_multipart_params(value).each do |subkey, subvalue| - flattened_params[k + subkey] = subvalue - end - else - flattened_params[k] = value - end - end - - flattened_params - end - - # Build the multipart content for uploading. - def build_parts(buffer, parameters) - _build_parts(buffer, parameters) - buffer << END_BOUNDARY - end - - # Append each multipart parameter value to the buffer. - def _build_parts(buffer, parameters) - parameters.map do |name, value| - if name =~ /\[\]\Z/ && value.is_a?(Array) && value.all? { |v| v.is_a?(Hash) } - value.each do |hash| - new_value = {} - hash.each { |k, v| new_value[name + k] = v } - _build_parts(buffer, new_value) - end - else - [value].flatten.map do |v| - if v.respond_to?(:original_filename) - build_file_part(buffer, name, v) - else - build_primitive_part(buffer, name, v) - end - end - end - end - end - - # Append the multipart fragment for a parameter that isn't a file upload to the buffer. - def build_primitive_part(buffer, parameter_name, value) - buffer << - START_BOUNDARY << - "content-disposition: form-data; name=\"" << - parameter_name.to_s.b << - "\"\r\n\r\n" << - value.to_s.b << - "\r\n" - buffer - end - - # Append the multipart fragment for a parameter that is a file upload to the buffer. - def build_file_part(buffer, parameter_name, uploaded_file) - buffer << - START_BOUNDARY << - "content-disposition: form-data; name=\"" << - parameter_name.to_s.b << - "\"; filename=\"" << - escape_path(uploaded_file.original_filename).b << - "\"\r\ncontent-type: " << - uploaded_file.content_type.to_s.b << - "\r\ncontent-length: " << - uploaded_file.size.to_s.b << - "\r\n\r\n" - - # Handle old versions of Capybara::RackTest::Form::NilUploadedFile - if uploaded_file.respond_to?(:set_encoding) - uploaded_file.set_encoding(Encoding::BINARY) - uploaded_file.append_to(buffer) - end - - buffer << "\r\n" - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/version.rb b/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/version.rb deleted file mode 100644 index f7e7462..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rack-test-2.2.0/lib/rack/test/version.rb +++ /dev/null @@ -1,5 +0,0 @@ -module Rack - module Test - VERSION = '2.2.0'.freeze - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/bin/rackup b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/bin/rackup deleted file mode 100755 index d2751b6..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/bin/rackup +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -require_relative "../lib/rackup" -Rackup::Server.start diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup.rb b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup.rb deleted file mode 100644 index 588d8df..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true - -# Released under the MIT License. -# Copyright, 2022-2024, by Samuel Williams. - -require_relative 'rackup/handler' -require_relative 'rackup/server' -require_relative 'rackup/version' - -begin - # Although webrick is gone from Ruby since 3.0, it still warns all the way - # through to 3.3. Only on 3.4 will requiring it not produce a warning anymore. - verbose, $VERBOSE = $VERBOSE, nil - require 'webrick' - # If the user happens to have webrick in their bundle, make the handler available. - require_relative 'rackup/handler/webrick' -rescue LoadError - # ¯\_(ツ)_/¯ -ensure - $VERBOSE = verbose -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler.rb b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler.rb deleted file mode 100644 index a46604b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler.rb +++ /dev/null @@ -1,113 +0,0 @@ -# frozen_string_literal: true - -# Released under the MIT License. -# Copyright, 2022-2023, by Samuel Williams. - -module Rackup - # *Handlers* connect web servers with Rack. - # - # Rackup includes Handlers for WEBrick and CGI. - # - # Handlers usually are activated by calling MyHandler.run(myapp). - # A second optional hash can be passed to include server-specific - # configuration. - module Handler - @handlers = {} - - # Register a named handler class. - def self.register(name, klass) - if klass.is_a?(String) - warn "Calling Rackup::Handler.register with a string is deprecated, use the class/module itself.", uplevel: 1 - - klass = self.const_get(klass, false) - end - - name = name.to_sym - - @handlers[name] = klass - end - - def self.[](name) - name = name.to_sym - - begin - @handlers[name] || self.const_get(name, false) - rescue NameError - # Ignore. - end - end - - def self.get(name) - return nil unless name - - name = name.to_sym - - if server = self[name] - return server - end - - begin - require_handler("rackup/handler", name) - rescue LoadError - require_handler("rack/handler", name) - end - - return self[name] - end - - RACK_HANDLER = 'RACK_HANDLER' - RACKUP_HANDLER = 'RACKUP_HANDLER' - - SERVER_NAMES = %i(puma falcon webrick).freeze - private_constant :SERVER_NAMES - - # Select first available Rack handler given an `Array` of server names. - # Raises `LoadError` if no handler was found. - # - # > pick ['puma', 'webrick'] - # => Rackup::Handler::WEBrick - def self.pick(server_names) - server_names = Array(server_names) - - server_names.each do |server_name| - begin - server = self.get(server_name) - return server if server - rescue LoadError - # Ignore. - end - end - - raise LoadError, "Couldn't find handler for: #{server_names.join(', ')}." - end - - def self.default - if rack_handler = ENV[RACKUP_HANDLER] - self.get(rack_handler) - elsif rack_handler = ENV[RACK_HANDLER] - warn "RACK_HANDLER is deprecated, use RACKUP_HANDLER." - self.get(rack_handler) - else - pick SERVER_NAMES - end - end - - # Transforms server-name constants to their canonical form as filenames, - # then tries to require them but silences the LoadError if not found - # - # Naming convention: - # - # Foo # => 'foo' - # FooBar # => 'foo_bar.rb' - # FooBAR # => 'foobar.rb' - # FOObar # => 'foobar.rb' - # FOOBAR # => 'foobar.rb' - # FooBarBaz # => 'foo_bar_baz.rb' - def self.require_handler(prefix, const_name) - file = const_name.to_s.gsub(/^[A-Z]+/) { |pre| pre.downcase }. - gsub(/[A-Z]+[^A-Z]/, '_\&').downcase - - require(::File.join(prefix, file)) - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler/cgi.rb b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler/cgi.rb deleted file mode 100644 index a8f8a11..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler/cgi.rb +++ /dev/null @@ -1,61 +0,0 @@ -# frozen_string_literal: true - -# Released under the MIT License. -# Copyright, 2022-2023, by Samuel Williams. - -module Rackup - module Handler - class CGI - include Rack - - def self.run(app, **options) - $stdin.binmode - serve app - end - - def self.serve(app) - env = ENV.to_hash - env.delete "HTTP_CONTENT_LENGTH" - - env[SCRIPT_NAME] = "" if env[SCRIPT_NAME] == "/" - - env.update( - RACK_INPUT => $stdin, - RACK_ERRORS => $stderr, - RACK_URL_SCHEME => ["yes", "on", "1"].include?(ENV[HTTPS]) ? "https" : "http" - ) - - env[QUERY_STRING] ||= "" - env[REQUEST_PATH] ||= "/" - - status, headers, body = app.call(env) - begin - send_headers status, headers - send_body body - ensure - body.close if body.respond_to? :close - end - end - - def self.send_headers(status, headers) - $stdout.print "Status: #{status}\r\n" - headers.each { |k, vs| - vs.split("\n").each { |v| - $stdout.print "#{k}: #{v}\r\n" - } - } - $stdout.print "\r\n" - $stdout.flush - end - - def self.send_body(body) - body.each { |part| - $stdout.print part - $stdout.flush - } - end - end - - register :cgi, CGI - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler/webrick.rb b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler/webrick.rb deleted file mode 100644 index 7a7070f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/handler/webrick.rb +++ /dev/null @@ -1,162 +0,0 @@ -# frozen_string_literal: true - -# Released under the MIT License. -# Copyright, 2022-2023, by Samuel Williams. -# Copyright, 2022, by Jeremy Evans. - -require 'webrick' -require 'stringio' - -require 'rack/constants' -require_relative '../handler' -require_relative '../version' - -require_relative '../stream' - -module Rackup - module Handler - class WEBrick < ::WEBrick::HTTPServlet::AbstractServlet - def self.run(app, **options) - environment = ENV['RACK_ENV'] || 'development' - default_host = environment == 'development' ? 'localhost' : nil - - if !options[:BindAddress] || options[:Host] - options[:BindAddress] = options.delete(:Host) || default_host - end - options[:Port] ||= 8080 - if options[:SSLEnable] - require 'webrick/https' - end - - @server = ::WEBrick::HTTPServer.new(options) - @server.mount "/", Rackup::Handler::WEBrick, app - yield @server if block_given? - @server.start - end - - def self.valid_options - environment = ENV['RACK_ENV'] || 'development' - default_host = environment == 'development' ? 'localhost' : '0.0.0.0' - - { - "Host=HOST" => "Hostname to listen on (default: #{default_host})", - "Port=PORT" => "Port to listen on (default: 8080)", - } - end - - def self.shutdown - if @server - @server.shutdown - @server = nil - end - end - - def initialize(server, app) - super server - @app = app - end - - # This handles mapping the WEBrick request to a Rack input stream. - class Input - include Stream::Reader - - def initialize(request) - @request = request - - @reader = Fiber.new do - @request.body do |chunk| - Fiber.yield(chunk) - end - - Fiber.yield(nil) - - # End of stream: - @reader = nil - end - end - - def close - @request = nil - @reader = nil - end - - private - - # Read one chunk from the request body. - def read_next - @reader&.resume - end - end - - def service(req, res) - env = req.meta_vars - env.delete_if { |k, v| v.nil? } - - input = Input.new(req) - - env.update( - ::Rack::RACK_INPUT => input, - ::Rack::RACK_ERRORS => $stderr, - ::Rack::RACK_URL_SCHEME => ["yes", "on", "1"].include?(env[::Rack::HTTPS]) ? "https" : "http", - ::Rack::RACK_IS_HIJACK => true, - ) - - env[::Rack::QUERY_STRING] ||= "" - unless env[::Rack::PATH_INFO] == "" - path, n = req.request_uri.path, env[::Rack::SCRIPT_NAME].length - env[::Rack::PATH_INFO] = path[n, path.length - n] - end - env[::Rack::REQUEST_PATH] ||= [env[::Rack::SCRIPT_NAME], env[::Rack::PATH_INFO]].join - - status, headers, body = @app.call(env) - begin - res.status = status - - if value = headers[::Rack::RACK_HIJACK] - io_lambda = value - body = nil - elsif !body.respond_to?(:to_path) && !body.respond_to?(:each) - io_lambda = body - body = nil - end - - if value = headers.delete('set-cookie') - res.cookies.concat(Array(value)) - end - - headers.each do |key, value| - # Skip keys starting with rack., per Rack SPEC - next if key.start_with?('rack.') - - # Since WEBrick won't accept repeated headers, - # merge the values per RFC 1945 section 4.2. - value = value.join(", ") if Array === value - res[key] = value - end - - if io_lambda - protocol = headers['rack.protocol'] || headers['upgrade'] - - if protocol - # Set all the headers correctly for an upgrade response: - res.upgrade!(protocol) - end - res.body = io_lambda - elsif body.respond_to?(:to_path) - res.body = ::File.open(body.to_path, 'rb') - else - buffer = String.new - body.each do |part| - buffer << part - end - res.body = buffer - end - ensure - body.close if body.respond_to?(:close) - end - end - end - - register :webrick, WEBrick - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/lobster.rb b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/lobster.rb deleted file mode 100644 index 8502ba0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/lobster.rb +++ /dev/null @@ -1,81 +0,0 @@ -# frozen_string_literal: true - -# Released under the MIT License. -# Copyright, 2022-2023, by Samuel Williams. - -require 'zlib' - -require 'rack/constants' -require 'rack/request' -require 'rack/response' - -module Rackup - # Paste has a Pony, Rack has a Lobster! - class Lobster - include Rack - - LobsterString = Zlib::Inflate.inflate("eJx9kEEOwyAMBO99xd7MAcytUhPlJyj2 - P6jy9i4k9EQyGAnBarEXeCBqSkntNXsi/ZCvC48zGQoZKikGrFMZvgS5ZHd+aGWVuWwhVF0 - t1drVmiR42HcWNz5w3QanT+2gIvTVCiE1lm1Y0eU4JGmIIbaKwextKn8rvW+p5PIwFl8ZWJ - I8jyiTlhTcYXkekJAzTyYN6E08A+dk8voBkAVTJQ==".delete("\n ").unpack("m*")[0]) - - LambdaLobster = lambda { |env| - if env[QUERY_STRING].include?("flip") - lobster = LobsterString.split("\n"). - map { |line| line.ljust(42).reverse }. - join("\n") - href = "?" - else - lobster = LobsterString - href = "?flip" - end - - content = ["Lobstericious!", - "
", lobster, "
", - "flip!"] - length = content.inject(0) { |a, e| a + e.size }.to_s - [200, { CONTENT_TYPE => "text/html", CONTENT_LENGTH => length }, content] - } - - def call(env) - req = Request.new(env) - if req.GET["flip"] == "left" - lobster = LobsterString.split("\n").map do |line| - line.ljust(42).reverse. - gsub('\\', 'TEMP'). - gsub('/', '\\'). - gsub('TEMP', '/'). - gsub('{', '}'). - gsub('(', ')') - end.join("\n") - href = "?flip=right" - elsif req.GET["flip"] == "crash" - raise "Lobster crashed" - else - lobster = LobsterString - href = "?flip=left" - end - - res = Response.new - res.write "Lobstericious!" - res.write "
"
-      res.write lobster
-      res.write "
" - res.write "

flip!

" - res.write "

crash!

" - res.finish - end - - end -end - -if $0 == __FILE__ - # :nocov: - require_relative 'server' - require_relative 'show_exceptions' - require_relative 'lint' - Rackup::Server.start( - app: Rack::ShowExceptions.new(Rack::Lint.new(Rackup::Lobster.new)), Port: 9292 - ) - # :nocov: -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/server.rb b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/server.rb deleted file mode 100644 index cb132f7..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/server.rb +++ /dev/null @@ -1,462 +0,0 @@ -# frozen_string_literal: true - -# Released under the MIT License. -# Copyright, 2022-2023, by Samuel Williams. - -require 'optparse' -require 'fileutils' - -require 'rack/builder' -require 'rack/common_logger' -require 'rack/content_length' -require 'rack/show_exceptions' -require 'rack/lint' -require 'rack/tempfile_reaper' - -require 'rack/version' - -require_relative 'version' -require_relative 'handler' - -module Rackup - class Server - class Options - def parse!(args) - options = {} - opt_parser = OptionParser.new("", 24, ' ') do |opts| - opts.banner = "Usage: rackup [ruby options] [rack options] [rackup config]" - - opts.separator "" - opts.separator "Ruby options:" - - lineno = 1 - opts.on("-e", "--eval LINE", "evaluate a LINE of code") { |line| - eval line, TOPLEVEL_BINDING, "-e", lineno - lineno += 1 - } - - opts.on("-d", "--debug", "set debugging flags (set $DEBUG to true)") { - options[:debug] = true - } - opts.on("-w", "--warn", "turn warnings on for your script") { - options[:warn] = true - } - opts.on("-q", "--quiet", "turn off logging") { - options[:quiet] = true - } - - opts.on("-I", "--include PATH", - "specify $LOAD_PATH (may be used more than once)") { |path| - (options[:include] ||= []).concat(path.split(":")) - } - - opts.on("-r", "--require LIBRARY", - "require the library, before executing your script") { |library| - (options[:require] ||= []) << library - } - - opts.separator "" - opts.separator "Rack options:" - opts.on("-b", "--builder BUILDER_LINE", "evaluate a BUILDER_LINE of code as a builder script") { |line| - options[:builder] = line - } - - opts.on("-s", "--server SERVER", "serve using SERVER (thin/puma/webrick)") { |s| - options[:server] = s - } - - opts.on("-o", "--host HOST", "listen on HOST (default: localhost)") { |host| - options[:Host] = host - } - - opts.on("-p", "--port PORT", "use PORT (default: 9292)") { |port| - options[:Port] = port - } - - opts.on("-O", "--option NAME[=VALUE]", "pass VALUE to the server as option NAME. If no VALUE, sets it to true. Run '#{$0} -s SERVER -h' to get a list of options for SERVER") { |name| - name, value = name.split('=', 2) - value = true if value.nil? - options[name.to_sym] = value - } - - opts.on("-E", "--env ENVIRONMENT", "use ENVIRONMENT for defaults (default: development)") { |e| - options[:environment] = e - } - - opts.on("-D", "--daemonize", "run daemonized in the background") { |d| - options[:daemonize] ||= true - } - - opts.on("--daemonize-noclose", "run daemonized in the background without closing stdout/stderr") { - options[:daemonize] = :noclose - } - - opts.on("-P", "--pid FILE", "file to store PID") { |f| - options[:pid] = ::File.expand_path(f) - } - - opts.separator "" - opts.separator "Profiling options:" - - opts.on("--heap HEAPFILE", "Build the application, then dump the heap to HEAPFILE") do |e| - options[:heapfile] = e - end - - opts.on("--profile PROFILE", "Dump CPU or Memory profile to PROFILE (defaults to a tempfile)") do |e| - options[:profile_file] = e - end - - opts.on("--profile-mode MODE", "Profile mode (cpu|wall|object)") do |e| - unless %w[cpu wall object].include?(e) - raise OptionParser::InvalidOption, "unknown profile mode: #{e}" - end - options[:profile_mode] = e.to_sym - end - - opts.separator "" - opts.separator "Common options:" - - opts.on_tail("-h", "-?", "--help", "Show this message") do - puts opts - puts handler_opts(options) - - exit - end - - opts.on_tail("--version", "Show version") do - puts "Rack #{Rack::RELEASE}" - exit - end - end - - begin - opt_parser.parse! args - rescue OptionParser::InvalidOption => e - warn e.message - abort opt_parser.to_s - end - - options[:config] = args.last if args.last && !args.last.empty? - options - end - - def handler_opts(options) - info = [] - server = Rackup::Handler.get(options[:server]) || Rackup::Handler.default - if server && server.respond_to?(:valid_options) - info << "" - info << "Server-specific options for #{server.name}:" - - has_options = false - server.valid_options.each do |name, description| - next if /^(Host|Port)[^a-zA-Z]/.match?(name.to_s) # ignore handler's host and port options, we do our own. - info << sprintf(" -O %-21s %s", name, description) - has_options = true - end - return "" if !has_options - end - info.join("\n") - rescue NameError, LoadError - return "Warning: Could not find handler specified (#{options[:server] || 'default'}) to determine handler-specific options" - end - end - - # Start a new rack server (like running rackup). This will parse ARGV and - # provide standard ARGV rackup options, defaulting to load 'config.ru'. - # - # Providing an options hash will prevent ARGV parsing and will not include - # any default options. - # - # This method can be used to very easily launch a CGI application, for - # example: - # - # Rack::Server.start( - # :app => lambda do |e| - # [200, {'content-type' => 'text/html'}, ['hello world']] - # end, - # :server => 'cgi' - # ) - # - # Further options available here are documented on Rack::Server#initialize - def self.start(options = nil) - new(options).start - end - - attr_writer :options - - # Options may include: - # * :app - # a rack application to run (overrides :config and :builder) - # * :builder - # a string to evaluate a Rack::Builder from - # * :config - # a rackup configuration file path to load (.ru) - # * :environment - # this selects the middleware that will be wrapped around - # your application. Default options available are: - # - development: CommonLogger, ShowExceptions, and Lint - # - deployment: CommonLogger - # - none: no extra middleware - # note: when the server is a cgi server, CommonLogger is not included. - # * :server - # choose a specific Rackup::Handler, e.g. cgi, fcgi, webrick - # * :daemonize - # if truthy, the server will daemonize itself (fork, detach, etc) - # if :noclose, the server will not close STDOUT/STDERR - # * :pid - # path to write a pid file after daemonize - # * :Host - # the host address to bind to (used by supporting Rackup::Handler) - # * :Port - # the port to bind to (used by supporting Rackup::Handler) - # * :AccessLog - # webrick access log options (or supporting Rackup::Handler) - # * :debug - # turn on debug output ($DEBUG = true) - # * :warn - # turn on warnings ($-w = true) - # * :include - # add given paths to $LOAD_PATH - # * :require - # require the given libraries - # - # Additional options for profiling app initialization include: - # * :heapfile - # location for ObjectSpace.dump_all to write the output to - # * :profile_file - # location for CPU/Memory (StackProf) profile output (defaults to a tempfile) - # * :profile_mode - # StackProf profile mode (cpu|wall|object) - def initialize(options = nil) - @ignore_options = [] - - if options - @use_default_options = false - @options = options - @app = options[:app] if options[:app] - else - @use_default_options = true - @options = parse_options(ARGV) - end - end - - def options - merged_options = @use_default_options ? default_options.merge(@options) : @options - merged_options.reject { |k, v| @ignore_options.include?(k) } - end - - def default_options - environment = ENV['RACK_ENV'] || 'development' - default_host = environment == 'development' ? 'localhost' : '0.0.0.0' - - { - environment: environment, - pid: nil, - Port: 9292, - Host: default_host, - AccessLog: [], - config: "config.ru" - } - end - - def app - @app ||= options[:builder] ? build_app_from_string : build_app_and_options_from_config - end - - class << self - def logging_middleware - lambda { |server| - /CGI/.match?(server.server.name) || server.options[:quiet] ? nil : [Rack::CommonLogger, $stderr] - } - end - - def default_middleware_by_environment - m = Hash.new {|h, k| h[k] = []} - m["deployment"] = [ - [Rack::ContentLength], - logging_middleware, - [Rack::TempfileReaper] - ] - m["development"] = [ - [Rack::ContentLength], - logging_middleware, - [Rack::ShowExceptions], - [Rack::Lint], - [Rack::TempfileReaper] - ] - - m - end - - def middleware - default_middleware_by_environment - end - end - - def middleware - self.class.middleware - end - - def start(&block) - if options[:warn] - $-w = true - end - - if includes = options[:include] - $LOAD_PATH.unshift(*includes) - end - - Array(options[:require]).each do |library| - require library - end - - if options[:debug] - $DEBUG = true - require 'pp' - p options[:server] - pp wrapped_app - pp app - end - - check_pid! if options[:pid] - - # Touch the wrapped app, so that the config.ru is loaded before - # daemonization (i.e. before chdir, etc). - handle_profiling(options[:heapfile], options[:profile_mode], options[:profile_file]) do - wrapped_app - end - - daemonize_app if options[:daemonize] - - write_pid if options[:pid] - - trap(:INT) do - if server.respond_to?(:shutdown) - server.shutdown - else - exit - end - end - - server.run(wrapped_app, **options, &block) - end - - def server - @_server ||= Handler.get(options[:server]) || Handler.default - end - - private - def build_app_and_options_from_config - if !::File.exist? options[:config] - abort "configuration #{options[:config]} not found" - end - - return Rack::Builder.parse_file(self.options[:config]) - end - - def handle_profiling(heapfile, profile_mode, filename) - if heapfile - require "objspace" - ObjectSpace.trace_object_allocations_start - yield - GC.start - ::File.open(heapfile, "w") { |f| ObjectSpace.dump_all(output: f) } - exit - end - - if profile_mode - require "stackprof" - require "tempfile" - - make_profile_name(filename) do |filename| - ::File.open(filename, "w") do |f| - StackProf.run(mode: profile_mode, out: f) do - yield - end - puts "Profile written to: #{filename}" - end - end - exit - end - - yield - end - - def make_profile_name(filename) - if filename - yield filename - else - ::Dir::Tmpname.create("profile.dump") do |tmpname, _, _| - yield tmpname - end - end - end - - def build_app_from_string - Rack::Builder.new_from_string(self.options[:builder]) - end - - def parse_options(args) - # Don't evaluate CGI ISINDEX parameters. - args.clear if ENV.include?(Rack::REQUEST_METHOD) - - @options = opt_parser.parse!(args) - @options[:config] = ::File.expand_path(options[:config]) - ENV["RACK_ENV"] = options[:environment] - @options - end - - def opt_parser - Options.new - end - - def build_app(app) - middleware[options[:environment]].reverse_each do |middleware| - middleware = middleware.call(self) if middleware.respond_to?(:call) - next unless middleware - klass, *args = middleware - app = klass.new(app, *args) - end - app - end - - def wrapped_app - @wrapped_app ||= build_app app - end - - def daemonize_app - # Cannot be covered as it forks - # :nocov: - Process.daemon(true, options[:daemonize] == :noclose) - # :nocov: - end - - def write_pid - ::File.open(options[:pid], ::File::CREAT | ::File::EXCL | ::File::WRONLY ){ |f| f.write("#{Process.pid}") } - at_exit { ::FileUtils.rm_f(options[:pid]) } - rescue Errno::EEXIST - check_pid! - retry - end - - def check_pid! - return unless ::File.exist?(options[:pid]) - - pid = ::File.read(options[:pid]).to_i - raise Errno::ESRCH if pid == 0 - - Process.kill(0, pid) - exit_with_pid(pid) - rescue Errno::ESRCH - ::File.delete(options[:pid]) - rescue Errno::EPERM - exit_with_pid(pid) - end - - def exit_with_pid(pid) - $stderr.puts "A server is already running (pid: #{pid}, file: #{options[:pid]})." - exit(1) - end - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/stream.rb b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/stream.rb deleted file mode 100644 index 137f8ca..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/stream.rb +++ /dev/null @@ -1,199 +0,0 @@ -# frozen_string_literal: true - -# Released under the MIT License. -# Copyright, 2023-2024, by Samuel Williams. - -module Rackup - # The input stream is an IO-like object which contains the raw HTTP POST data. When applicable, its external encoding must be “ASCII-8BIT” and it must be opened in binary mode, for Ruby 1.9 compatibility. The input stream must respond to gets, each, read and rewind. - class Stream - def initialize(input = nil, output = Buffered.new) - @input = input - @output = output - - raise ArgumentError, "Non-writable output!" unless output.respond_to?(:write) - - # Will hold remaining data in `#read`. - @buffer = nil - @closed = false - end - - attr :input - attr :output - - # This provides a read-only interface for data, which is surprisingly tricky to implement correctly. - module Reader - # rack.hijack_io must respond to: - # read, write, read_nonblock, write_nonblock, flush, close, close_read, close_write, closed? - - # read behaves like IO#read. Its signature is read([length, [buffer]]). If given, length must be a non-negative Integer (>= 0) or nil, and buffer must be a String and may not be nil. If length is given and not nil, then this method reads at most length bytes from the input stream. If length is not given or nil, then this method reads all data until EOF. When EOF is reached, this method returns nil if length is given and not nil, or “” if length is not given or is nil. If buffer is given, then the read data will be placed into buffer instead of a newly created String object. - # @param length [Integer] the amount of data to read - # @param buffer [String] the buffer which will receive the data - # @return a buffer containing the data - def read(length = nil, buffer = nil) - return '' if length == 0 - - buffer ||= String.new.force_encoding(Encoding::BINARY) - - # Take any previously buffered data and replace it into the given buffer. - if @buffer - buffer.replace(@buffer) - @buffer = nil - else - buffer.clear - end - - if length - while buffer.bytesize < length and chunk = read_next - buffer << chunk - end - - # This ensures the subsequent `slice!` works correctly. - buffer.force_encoding(Encoding::BINARY) - - # This will be at least one copy: - @buffer = buffer.byteslice(length, buffer.bytesize) - - # This should be zero-copy: - buffer.slice!(length, buffer.bytesize) - - if buffer.empty? - return nil - else - return buffer - end - else - while chunk = read_next - buffer << chunk - end - - return buffer - end - end - - # Read at most `length` bytes from the stream. Will avoid reading from the underlying stream if possible. - def read_partial(length = nil) - if @buffer - buffer = @buffer - @buffer = nil - else - buffer = read_next - end - - if buffer and length - if buffer.bytesize > length - # This ensures the subsequent `slice!` works correctly. - buffer.force_encoding(Encoding::BINARY) - - @buffer = buffer.byteslice(length, buffer.bytesize) - buffer.slice!(length, buffer.bytesize) - end - end - - return buffer - end - - def gets - read_partial - end - - def each - while chunk = read_partial - yield chunk - end - end - - def read_nonblock(length, buffer = nil) - @buffer ||= read_next - chunk = nil - - unless @buffer - buffer&.clear - return - end - - if @buffer.bytesize > length - chunk = @buffer.byteslice(0, length) - @buffer = @buffer.byteslice(length, @buffer.bytesize) - else - chunk = @buffer - @buffer = nil - end - - if buffer - buffer.replace(chunk) - else - buffer = chunk - end - - return buffer - end - end - - include Reader - - def write(buffer) - if @output - @output.write(buffer) - return buffer.bytesize - else - raise IOError, "Stream is not writable, output has been closed!" - end - end - - def write_nonblock(buffer) - write(buffer) - end - - def <<(buffer) - write(buffer) - end - - def flush - end - - def close_read - @input&.close - @input = nil - end - - # close must never be called on the input stream. huh? - def close_write - if @output.respond_to?(:close) - @output&.close - end - - @output = nil - end - - # Close the input and output bodies. - def close(error = nil) - self.close_read - self.close_write - - return nil - ensure - @closed = true - end - - # Whether the stream has been closed. - def closed? - @closed - end - - # Whether there are any output chunks remaining? - def empty? - @output.empty? - end - - private - - def read_next - if @input - return @input.read - else - @input = nil - raise IOError, "Stream is not readable, input has been closed!" - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/version.rb b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/version.rb deleted file mode 100644 index 199d03d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/lib/rackup/version.rb +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -# Released under the MIT License. -# Copyright, 2022-2023, by Samuel Williams. - -module Rackup - VERSION = "2.2.1" -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/license.md b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/license.md deleted file mode 100644 index 003f0ac..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/license.md +++ /dev/null @@ -1,80 +0,0 @@ -# MIT License - -Copyright, 2007-2009, by Leah Neukirchen. -Copyright, 2008, by Marc-André Cournoyer. -Copyright, 2009, by Aaron Pfeifer. -Copyright, 2009-2010, by Megan Batty. -Copyright, 2009-2010, by Michael Fellinger. -Copyright, 2009, by Genki Takiuchi. -Copyright, 2009, by Joshua Peek. -Copyright, 2009, by Yehuda Katz. -Copyright, 2009, by Carl Lerche. -Copyright, 2010, by Julik Tarkhanov. -Copyright, 2010-2016, by James Tucker. -Copyright, 2010, by Timur Batyrshin. -Copyright, 2010, by Loren Segal. -Copyright, 2010, by Andrew Bortz. -Copyright, 2010, by John Barnette. -Copyright, 2010, by John Sumsion. -Copyright, 2011-2018, by Aaron Patterson. -Copyright, 2011, by Konstantin Haase. -Copyright, 2011, by Blake Mizerany. -Copyright, 2011, by Tsutomu Kuroda. -Copyright, 2012, by Jean Boussier. -Copyright, 2012, by Trevor Wennblom. -Copyright, 2012, by Anurag Priyam. -Copyright, 2012, by Hrvoje Šimić. -Copyright, 2013, by Uchio Kondo. -Copyright, 2013, by Tim Moore. -Copyright, 2013, by Hal Brodigan. -Copyright, 2013, by Bas Vodde. -Copyright, 2013, by Joe Fiorini. -Copyright, 2014, by Wyatt Pan. -Copyright, 2014, by Lenny Marks. -Copyright, 2014, by Igor Bochkariov. -Copyright, 2014, by Max Cantor. -Copyright, 2014, by David Celis. -Copyright, 2014-2019, by Rafael França. -Copyright, 2014, by Jeremy Kemper. -Copyright, 2014, by Richard Schneeman. -Copyright, 2015, by Peter Wilmott. -Copyright, 2015, by Sean McGivern. -Copyright, 2015, by Tadashi Saito. -Copyright, 2015, by Martin Hrdlicka. -Copyright, 2015, by Zachary Scott. -Copyright, 2016, by Sophie Deziel. -Copyright, 2016, by Kazuya Hotta. -Copyright, 2017, by Ryunosuke Sato. -Copyright, 2017-2024, by Samuel Williams. -Copyright, 2018, by Dillon Welch. -Copyright, 2018, by Yoshiyuki Hirano. -Copyright, 2018, by Nick LaMuro. -Copyright, 2019, by Krzysztof Rybka. -Copyright, 2019, by Misaki Shioi. -Copyright, 2020-2022, by Jeremy Evans. -Copyright, 2021, by Katsuhiko Yoshida. -Copyright, 2021, by Kang Sheng. -Copyright, 2021, by Stephen Paul Weber. -Copyright, 2022, by Akira Matsuda. -Copyright, 2022, by Andrew Hoglund. -Copyright, 2024, by Olle Jonsson. -Copyright, 2024, by Geremia Taglialatela. -Copyright, 2024, by Petrik de Heus. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/readme.md b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/readme.md deleted file mode 100644 index 95f071b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/readme.md +++ /dev/null @@ -1,64 +0,0 @@ -# Rackup - -`rackup` provides a command line interface for running a Rack-compatible application. It also provides a generic interface for starting a `rack`-compatible server: `Rackup::Handler`. It is not designed for production use. - -[![Development Status](https://github.com/rack/rackup/workflows/Test/badge.svg)](https://github.com/rack/rackup/actions?workflow=Test) - -## Installation - -``` bash --- For Puma -$ gem install rackup puma - --- For Falcon -$ gem install rackup falcon -``` - -## Usage - -In a directory with your `config.ru` simply run the command: - -``` bash -$ rackup -``` - -Your application should now be available locally, typically `http://localhost:9292`. - -## (Soft) Deprecation - -For a long time, `rackup` (the executable and implementation) was part of `rack`, and `webrick` was the default server, included with Ruby. It made it easy to run a Rack application without having to worry about the details of the server - great for documentation and demos. - -When `webrick` was removed from the Ruby standard library, `rack` started depending on `webrick` as a default server. Every web application and server would pull in `webrick` as a dependency, even if it was not used. To avoid this, the `rackup` component of `rack` was moved to this gem, which depended on `webrick`. - -However, many libraries (e.g. `rails`) still depend on `rackup` and end up pulling in `webrick` as a dependency. To avoid this, the decision was made to cut `webrick` as a dependency of `rackup`. This means that `rackup` no longer depends on `webrick`, and you need to install it separately if you want to use it. - -As a consequence of this, the value of the `rackup` gem is further diminished. In other words, why would you do this: - -``` bash -$ gem install rackup puma -$ rackup ... -``` - -when you can do this: - -``` bash -$ gem install puma -$ puma ... -``` - -In summary, the maintainers of `rack` recommend the following: - - - Libraries should not depend on `rackup` if possible. `rackup` as an executable made sense when webrick shipped with Ruby, so there was always a fallback. But that hasn't been true since Ruby 3.0. - - Frameworks and applications should focus on providing `config.ru` files, so that users can use the webserver program of their choice directly (e.g. puma, falcon). - - There is still some value in the generic `rackup` and `Rackup::Handler` interfaces, but we encourage users to invoke the server command directly if possible. - - Webrick should be avoided if possible. - -## Contributing - -We welcome contributions to this project. - -1. Fork it. -2. Create your feature branch (`git checkout -b my-new-feature`). -3. Commit your changes (`git commit -am 'Add some feature'`). -4. Push to the branch (`git push origin my-new-feature`). -5. Create new Pull Request. diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/releases.md b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/releases.md deleted file mode 100644 index 5ec8c2b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/releases.md +++ /dev/null @@ -1,24 +0,0 @@ -# Releases - -All notable changes to this project will be documented in this file. For info on how to format all future additions to this file please reference [Keep A Changelog](https://keepachangelog.com/en/1.0.0/). - -## v2.2.0 - - - Remove old rack shims. - - Remove `webrick` dependency. - -## v2.1.0 - - - Correctly support streaming responses with `webrick`. - -## v2.0.0 - - - Initial release and migration of code from `rack`. - -## v1.0.1 - - - Fix `rackup.rb` invalid requires. - -## v1.0.0 - - - Initial release of empty shim for Rack v2. diff --git a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/security.md b/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/security.md deleted file mode 100644 index 2a33a46..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rackup-2.2.1/security.md +++ /dev/null @@ -1,3 +0,0 @@ -# Security Policy - -Please see our main security policy: https://github.com/rack/rack/security/policy diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/CONTRIBUTING.rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/CONTRIBUTING.rdoc deleted file mode 100644 index d76eb6b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/CONTRIBUTING.rdoc +++ /dev/null @@ -1,219 +0,0 @@ -= Developer Introduction - -So you want to write a generator, fix a bug, or otherwise work with RDoc. This -document provides an overview of how RDoc works from parsing options to -generating output. Most of the documentation can be found in the specific -classes for each feature. - -== Bugs - -If you think you found a bug, file a ticket on the {issues -tracker}[https://github.com/ruby/rdoc/issues] on github. - -If your bug involves an error RDoc produced please include a sample file that -illustrates the problem or link to the repository or gem that is associated -with the bug. - -Please include steps to reproduce the issue. Here are some examples of good -issues: - -* https://github.com/ruby/rdoc/issues/55 -* https://github.com/ruby/rdoc/issues/61 - -== Developer Quick Start - -RDoc uses bundler for development. To get ready to work on RDoc run: - - $ gem install bundler - [...] - $ bundle install - [...] - $ rake - [...] - -This will install all the necessary dependencies for development with rake, -generate documentation and run the tests for the first time. - -If the tests don't pass on the first run check the {GitHub Actions page}[https://github.com/ruby/rdoc/actions] to see if there are any known failures -(there shouldn't be). - -You can now use `rake` and `autotest` to run the tests. - -Note: the `rake` command must be used first before running any tests, because -it's used to generate various parsers implemented in RDoc. Also `rake clean` is -helpful to delete these generated files. - -== Glossary - -Here are definitions for some common terms in the RDoc documentation. The -list also briefly describes how the components of RDoc interact. - -parser:: - Parses files and creates a documentation tree from the contents. - -documentation tree:: - The documentation tree represents files, classes, modules, methods, - constants, includes, comments and other ruby syntax features as a tree. - RDoc walks this tree with a generator to create documentation. - -generator:: - Walks the documentation tree and generates output. - - RDoc ships with two generators, the Darkfish generator creates HTML and the - RI generator creates an RI data store. - -markup parser:: - Parses comments from a file into a generic markup tree. - - The markup parsers allow RDoc to handle RDoc, TomDoc, rd and Markdown format - documentation with common formatters. - -markup tree:: - Each parsed comment has a markup tree that represents common markup items - such as headings, paragraphs, lists or verbatim text sections for example - code or output. - - A generator uses a formatters to walks the tree to create output. Some - generators use multiple formatters on a markup tree to produce the output. - -formatter:: - Converts a parsed markup tree into some form other form of markup. - - Formatters can either produce a one-to-one conversion, such as ToHtml, or - extract part of the parsed result, such as ToHtmlSnippet which outputs the - first 100 characters as HTML. - -== Plugins - -When 'rdoc/rdoc' is loaded RDoc looks for 'rdoc/discover' files in your -installed gems. This can be used to load parsers, alternate generators, or -additional preprocessor directives. An rdoc plugin layout should look -something like this: - - lib/rdoc/discover.rb - lib/my/rdoc/plugin.rb - # etc. - -In your rdoc/discover.rb file you will want to wrap the loading of your plugin -in an RDoc version check like this: - - begin - gem 'rdoc', '~> 3' - require 'my/rdoc/plugin' - rescue Gem::LoadError - end - -=== Plugin Types - -In RDoc you can change the following behaviors: - -* Add a parser for a new file format -* Add a new output generator -* Add a new markup directive -* Add a new type of documentation markup -* Add a new type of formatter - -All of these are described below - -== Option Parsing - -Option parsing is handled by RDoc::Options. When you're writing a generator -you can provide the user with extra options by providing a class method -+setup_options+. The option parser will call this after your generator is -loaded. See RDoc::Generator for details. - -== File Parsing - -After options are parsed, RDoc parses files from the files and directories in -ARGV. RDoc compares the filename against what each parser claims it can parse -via RDoc::Parser#parse_files_matching. For example, RDoc::Parser::C can parse -C files, C headers, C++ files, C++ headers and yacc grammars. - -Once a matching parser class is found it is instantiated and +scan+ is called. -The parser needs to extract documentation from the file and add it to the RDoc -document tree. Usually this involves starting at the root and adding a class -or a module (RDoc::TopLevel#add_class and RDoc::TopLevel#add_module) and -proceeding to add classes, modules and methods to each nested item. - -When the parsers are finished the document tree is cleaned up to remove -dangling references to aliases and includes that were not found (and may exist -in a separate library) through RDoc::ClassModule#complete. - -To write your own parser for a new file format see RDoc::Parser. - -=== Documentation Tree - -The parsers build a documentation tree that is composed of RDoc::CodeObject and -its subclasses. There are various methods to walk the tree to extract -information, see RDoc::Context and its subclasses. - -Within a class or module, attributes, methods and constants are divided into -sections. The section represents a functional grouping of parts of the class. -TomDoc uses the sections "Public", "Internal" and "Deprecated". The sections -can be enumerated using RDoc::Context#each_section. - -== Output Generation - -An RDoc generator turns the documentation tree into some other kind of output. -RDoc comes with an HTML generator (RDoc::Generator::Darkfish) and an RI -database generator (RDoc::Generator::RI). The output a generator creates does -not have to be human-readable. - -To create your own generator see RDoc::Generator. - -=== Comments - -In RDoc 3.10 and newer the comment on an RDoc::CodeObject is now an -RDoc::Comment object instead of a String. This is to support various -documentation markup formats like rdoc, TomDoc and rd. The comments are -normalized to remove comment markers and remove indentation then parsed lazily -via RDoc::Comment#document to create a generic markup tree that can be -processed by a formatter. - -To add your own markup format see RDoc::Markup@Other+directives - -==== Formatters - -To transform a comment into some form of output an RDoc::Markup::Formatter -subclass is used like RDoc::Markup::ToHtml. A formatter is a visitor that -walks a parsed comment tree (an RDoc::Markup::Document) of any format. To help -write a formatter RDoc::Markup::FormatterTestCase exists for generic parsers, -and RDoc::Markup::TextFormatterTestCase which contains extra test cases for -text-type output (like +ri+ output). - -RDoc ships with formatters that will turn a comment into HTML, rdoc-markup-like -text, ANSI or terminal backspace highlighted text, HTML, cross-referenced HTML, -an HTML snippet free of most markup, an HTML label for use in id attributes, a -table-of-contents page, and text with only code blocks. - -The output of the formatter does not need to be text or text-like. -RDoc::Markup::ToLabel creates an HTML-safe label for use in an HTML id -attribute. A formatter could count the number of words and the average word -length for a comment, for example. - -==== Directives - -For comments in markup you can add new directives (:nodoc: is a directive). -Directives may replace text or store it off for later use. - -See RDoc::Markup::PreProcess::register for details. - -=== JSONIndex - -RDoc contains a special generator, RDoc::Generator::JSONIndex, which creates a -JSON-based search index and includes a search engine for use with HTML output. -This generator can be used to add searching to any HTML output and is designed -to be called from inside an HTML generator. - -== Markup - -Additional documentation markup formats can be added to RDoc. A markup -parsing class must respond to \::parse and accept a String argument containing -the markup format. An RDoc::Document containing documentation items -(RDoc::Markup::Heading, RDoc::Markup::Paragraph, RDoc::Markup::Verbatim, etc.) -must be returned. - -To register the parser with rdoc, add the markup type's name and class to the -RDoc::Text::MARKUP_FORMAT hash like: - - RDoc::Text::MARKUP_FORMAT['rdoc'] = RDoc::Markup diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/CVE-2013-0256.rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/CVE-2013-0256.rdoc deleted file mode 100644 index b285b6a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/CVE-2013-0256.rdoc +++ /dev/null @@ -1,49 +0,0 @@ -= RDoc 2.3.0 through 3.12 XSS Exploit - -RDoc documentation generated by rdoc 2.3.0 through rdoc 3.12 and prereleases up -to rdoc 4.0.0.preview2.1 are vulnerable to an XSS exploit. This exploit may -lead to cookie disclosure to third parties. - -The exploit exists in darkfish.js which is copied from the RDoc install -location to the generated documentation. - -RDoc is a static documentation generation tool. Patching the library itself -is insufficient to correct this exploit. Those hosting rdoc documentation will -need to apply the following patch. If applied while ignoring whitespace, this -patch will correct all affected versions: - - diff --git darkfish.js darkfish.js - index 4be722f..f26fd45 100644 - --- darkfish.js - +++ darkfish.js - @@ -109,13 +109,15 @@ function hookSearch() { - function highlightTarget( anchor ) { - console.debug( "Highlighting target '%s'.", anchor ); - - - $("a[name=" + anchor + "]").each( function() { - - if ( !$(this).parent().parent().hasClass('target-section') ) { - - console.debug( "Wrapping the target-section" ); - - $('div.method-detail').unwrap( 'div.target-section' ); - - $(this).parent().wrap( '
' ); - - } else { - - console.debug( "Already wrapped." ); - + $("a[name]").each( function() { - + if ( $(this).attr("name") == anchor ) { - + if ( !$(this).parent().parent().hasClass('target-section') ) { - + console.debug( "Wrapping the target-section" ); - + $('div.method-detail').unwrap( 'div.target-section' ); - + $(this).parent().wrap( '
' ); - + } else { - + console.debug( "Already wrapped." ); - + } - } - }); - }; - -RDoc 3.9.5, 3.12.1 and RDoc 4.0.0.rc.2 and newer are not vulnerable to this -exploit. - -This exploit was discovered by Evgeny Ermakov . - -This vulnerability has been assigned the CVE identifier CVE-2013-0256. - diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/ExampleMarkdown.md b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/ExampleMarkdown.md deleted file mode 100644 index fd4359f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/ExampleMarkdown.md +++ /dev/null @@ -1,39 +0,0 @@ -# Example Markdown - -This document contains example output to show RDoc styling. This file was -created from a Markdown file. - -For the following styles, see ExampleRDoc.rdoc for style examples: - -* Headings -* Paragraphs -* Code blocks (verbatim sections) -* Definition lists -* Ordered lists -* Unordered lists - -These items all use the same styles as RDoc format files. - -## Footnotes - -Footnotes are rendered at the bottom of the documentation section[^1]. For -pages this will be at the bottom of the page. For method documentation this -will be at the end of the current method. - -[^1]: Here is the footnote content. As you can see it is at the bottom of the -page. - -## Blockquotes - -Here is how a blockquote looks. - -> We finished our first sensor sweep of the neutral zone. Now, how the hell do -> we defeat an enemy that knows us better than we know ourselves? and attack -> the Romulans. -> -> > Sorry, Data. I guess it's better to be lucky than good. The unexpected is -> > our normal routine. Could someone survive inside a transporter buffer for -> > 75 years? - -This text is from [Riker Ipsum](http://rikeripsum.com) - diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/ExampleRDoc.rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/ExampleRDoc.rdoc deleted file mode 100644 index b5dd68c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/ExampleRDoc.rdoc +++ /dev/null @@ -1,210 +0,0 @@ -= Example \RDoc - -This document contains example output to show RDoc styling. This file was -created from a RDoc Markup file. - -== Headings - -You should not use headings beyond level 3, it is a sign of poor organization -of your code or documentation. It also becomes difficult for the user to -figure out what you are attempting to explain to them as they have to track -the multiple layers of nesting. - -= Heading level 1 - -Above is a level one heading. - -These paragraphs are filler that exist so you can see how the heading -interacts with paragraphs before and after the heading. As you can see each -different heading has a different amount of margin above and below. - -This should be sufficient to give you a proper picture of how it will appear in -your documentation. - -== Heading level 2 - -Above is a level two heading. - -These paragraphs are filler that exist so you can see how the heading -interacts with paragraphs before and after the heading. As you can see each -different heading has a different amount of margin above and below. - -This should be sufficient to give you a proper picture of how it will appear in -your documentation. - -=== Heading level 3 - -Above is a level three heading. - -These paragraphs are filler that exist so you can see how the heading -interacts with paragraphs before and after the heading. As you can see each -different heading has a different amount of margin above and below. - -This should be sufficient to give you a proper picture of how it will appear in -your documentation. - -==== Heading level 4 - -Above is a level four heading. - -These paragraphs are filler that exist so you can see how the heading -interacts with paragraphs before and after the heading. As you can see each -different heading has a different amount of margin above and below. - -This should be sufficient to give you a proper picture of how it will appear in -your documentation. - -===== Heading level 5 - -Above is a level five heading. - -These paragraphs are filler that exist so you can see how the heading -interacts with paragraphs before and after the heading. As you can see each -different heading has a different amount of margin above and below. - -This should be sufficient to give you a proper picture of how it will appear in -your documentation. - -====== Heading level 6 - -Above is a level six heading. - -These paragraphs are filler that exist so you can see how the heading -interacts with paragraphs before and after the heading. As you can see each -different heading has a different amount of margin above and below. - -This should be sufficient to give you a proper picture of how it will appear in -your documentation. - -== Paragraphs - -This is how a paragraph looks. Since it is difficult to generate good content -for paragraphs I have chosen to use {Riker Ipsum}[http://rikeripsum.com] for -nonsense filler content. In the previous sentence you can see how a link is -formatted. - -Here is an example of *bold* and _emphasis_ styling. Try not to combine the -two or use them too often. Here is an example of inline verbatim -text. That should be enough of a taste of inline markup in paragraphs. -The Riker Ipsum filler follows: - -Shields up! Rrrrred alert! Well, I'll say this for him - he's sure of himself. -and attack the Romulans. Worf, It's better than music. It's jazz. This should -be interesting. When has justice ever been as simple as a rule book? Flair is -what marks the difference between artistry and mere competence. - -Sorry, Data. I think you've let your personal feelings cloud your judgement. We -finished our first sensor sweep of the neutral zone. Yes, absolutely, I do -indeed concur, wholeheartedly! Mr. Worf, you do remember how to fire phasers? A -lot of things can change in twelve years, Admiral. Your shields were failing, -sir. - -== Verbatim sections - -A verbatim section typically contains source code or example output. This is -how verbatim blocks of code looks: - - def local responder - responder.ping do |value| - return value - end - end - - def ping uri - @uri = uri - @remote = DRb::DRbObject.new_with_uri @uri - - @remote.ping do |value| - return value - end - end - -This is a paragraph following the verbatim block so you can see how leading and trailing paragraphs interact with it. - -== Unordered lists - -Here is an unordered list. As you can see it uses non-numeral markers for each list item: - -* This is the top-most item in the list. -* This is a second item in the list. - - Unlike the first item, this item has more than one paragraph so you can see - how they interact. -* This is a third item in the list. Like the item before it, this item has a - second paragraph. - - Here is the second paragraph in the list item. -* A final list item. - -== Ordered lists - -Here is an ordered list. As you can see it uses numeral markers for each list -item: - -1. This is the first item in the list. -1. This is the second item in the list. - - Unlike the first item, this item has more than one paragraph so you can see - how they interact. -1. This is the third item in the list. Like the item before it, this item has - a second paragraph. - - Here is the second paragraph in the third list item. -1. The fourth and final list item. - -== Definition lists - -=== "Note" list - -The "note" syntax can be used to create a definition list: - - note:: - description - -Here is such a definition list: - -cat:: - A cat is a small mammal that is commonly kept as a pet. - -dog:: - A dog is a mammal that is also kept as a pet. A dog may range in size from - smaller than a cat to larger than a human. - - Typically dogs are easier to train to respond to commands than cats. - -rabbit:: - Rabbits are also mammals, but are infrequently kept as pets. Most rabbits - are wild. - -=== "Label" list - -The "label" syntax can be used to create a definition list: - - [label] - description - -Here is such a definition list: - -[cat] - A cat is a small mammal that is commonly kept as a pet. - -[dog] - A dog is a mammal that is also kept as a pet. A dog may range in size from - smaller than a cat to larger than a human. - - Typically dogs are easier to train to respond to commands than cats. - -[rabbit] - Rabbits are also mammals, but are infrequently kept as pets. Most rabbits - are wild. - -== Rule - -A rule is a horizontal divider between two paragraphs. Following this -paragraph is a rule. - ---- - -In historic versions of RDoc you could control the height of the rule in HTML -output. This is no longer true as HTML 5 does not support this. - diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/History.rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/History.rdoc deleted file mode 100644 index deb8c77..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/History.rdoc +++ /dev/null @@ -1,1668 +0,0 @@ -= History - -== 5.1.0 / 2017-02-24 - -* Bug fixes - * Fix an issue that rdoc fails when running on Windows with RUBYOPT=-U. - PR #430 by Toshihiko Ichida - -* Minor enhancements - * Parse ruby 2.1 def. PR #436 by Akira Matsuda. - * Suppress warnings in eval. PR #440 by Nobuyoshi Nakada. - -== 5.0.0 / 2016-11-05 - -* Major enhancements - * Cleanup deprecated code targeted Ruby 1.8 - -* Bug fixes - * Ensure badge data is included in result of JsonIndex template. - * Ensure items in the nil section are displayed in HTML output. Issue #399 - by Daniel Svensson. - * Parse rb_intern_const correctly in C. PR #381 by Sho Hashimoto. - * Fix broken assets caused by #335 when serving ri. PR #360 by Alex Wood. - * Don't try to parse svg files. Issue #350 by Sigurd Svela. - -* Minor enhancements - * Improve class name expansion/resolution in ri. PR #400 by NARUSE, Yui - * Improve performance of document generation. PR #397 by Yusuke Endoh. - -== 4.3.0 / 2016-11-04 - -* Minor enhancements - * Removed json dependency for Ruby 2.4.0 - * End to support Ruby 1.8.x - -== 4.2.2 / 2016-02-09 - -* Bug fixes - * Include lib/rdoc/generator/pot/* in built gem - - -== 4.2.1 / 2015-12-22 - -* Bug fixes - * Fixed infinite loop with CR #339 by @nobu - * Allow rdoc run with --disable-gems #340 by @luizluca - * Don't store full path in GZipped js files #341 by @voxik - * Fix relative path names for drive letters #367 by @nobu - * Fix for valid syntax `class C end` parsing #368 by @nobu - - -== 4.2.0 / 2014-12-06 - -* Major enhancements - * RDoc can now produce translation files for use with gettext. See - RDoc::Generator::POT for a workflow for creating translations of your - documentation. Pull request #254 by Kouhei Sutou. - -* Minor enhancements - * RDoc now allows any single-word macro before a C method implementation. - Issue #722 by Hanmac. - * Now :all is a synonym for :private for RDoc::Options#visibility= to match - the --all command line option. Pull request #276 by Zachary Scott. - * Running rake for the first time now installs racc. Pull request #285 by - Kouhei Sutou. - * Added -h flag to also display help. Issue #300 by Ryan Davis - * search_index.js is now loaded asynchronously for improved performance. - * Allow +X::Y+ as typewriter text. Issue #319, pull request #322 by Jeremy - Evans. - * Added RDoc::RI::Task for building ri data easily through rake. Pull - request #332 by Zachary Scott. - * A gzipped search index is generated for servers configured to use - precompressed files. Pull request #334 by Zachary Scott. - * CSS files now live under /css relative to the document root. Pull request - #335 by Zachary Scott. - * Improved detection of valid ruby in verbatim sections. Pull request #333 - by Jeremy Evans. - -* Bug fixes - * Fixed HTML labels for cross-browser compatibility. This breaks existing - links but enables cross-browser compatibility. Pull request #330 by Jens - Will. - * RDoc handles ASCII-incompatible encodings now. An encoding hint may need - to be added to the file for RDoc to produce correct output, though. - Issue #288 by Manuel Meurer. - * Fixed height recalculation issues when headings are hovered. Issue #289 - by Dietmar H. Büto. - * RDoc now ignores its own output directories. Pull Request #306 by - Hsing-Hui Hsu, bug #305 by Ryan Davis. - * Fixed RDoc::Task no longer uselessly builds documentation when generating - non-HTML output. Bug #307 by Christina Thompson, pull request #308 by - Hsing-Hui Hsu - * Added pointer to font copyright and license information to LEGAL.rdoc. - Issue #290 by Christian Hofstaedtler. - * Fixed RDoc::Context#<=> for ruby trunk. Issue #284 by Hanmac, pull - request #287 by Aaron Patterson - * Tests no longer create directories inside test/. Pull request #286 by - Kouhei Sutou. - * Fixed documentation example in RDoc::Markup. Pull request #292 by Gregory - Brown. - * Applied typo fix to RDoc::Markup. Pull request #297 by @montanalow - * Fixed pretty_print for RDoc::MethodAttr with an alias. Pull request #324 - by Hsing-Hui Hsu. - * Fixed lexing of %w"". Issue #315 by Thierry Lambert, pull request #323 by - Jeremy Evans. - * RDoc::TokenStream now removes nil tokens. Pull request #318 by Calle - Erlandsson. - * Fixed footer links to rubyforge and darkfish. Pull request #328 by - @blackwinter - * Fixed page-top link. Pull request #329 by @blackwinter - * Minitest gem activation failures are now ignored during test startup. - Issue #313 by Vít Ondruch. - * Fixed error when generating documentation from singleton classes. Issue - #311 by Vít Ondruch. - * Splat and keyword params can now be detected for documentation - completeness. Issue #321 Tom Kadwill. - * Standalone anchors in markdown documents are no longer escaped. Issue - #312 by Scott Thompson. - * Fixed RegExp matching stack overflow on Ruby 1.8.7. Issue #327 by sshao. - -== 4.1.2 / 2014-09-05 - -* Bug fixes - * Updated vendored jQuery to 1.6.4. Bug ruby/ruby#711 by @neuralme - -== 4.1.1 / 2014-01-09 - -* Bug fixes - * Fixed reporting of undocumented method parameters when including when - yield and &block are present. Pull request #281 by Victor Bilyk. - * Fixed merging of rd-style and hash-style comments at the top of a file. - Bug #266 by Zachary Scott. - * Fixed Document-attr in the C parser. Bug #271 by Hanmac. - * Removed duplicated condition in superclass fixup. Pull request #282 by - Benoit Daloze. - -== 4.1.0 / 2013-12-26 - -* Notable changes - * Improved accessibility of HTML output. Accessibility review was provided - by: - - Techvision – http://www.techvision.net.in - - The accessibility consultants in Pune, India - - * The look of RDoc has been updated. - -* Minor enhancements - * RDoc can now link to [], []=, << and >> methods. Pull request #202 by - Jeremy Evans, Bug # 191 by by Zachary Scott. - * Added RDoc::Options#output_decoration which controls header labels for - HTML output. Pull Request #199 by Zachary Scott. - * Added --template-stylesheets options to RDoc to allow specification of - alternate stylesheets. Pull request #205 by Zachary Scott. - * Improved performance of the Markdown and RD parsers. Pull request #217 by - Ryan Davis. - * rdoc -v now prints the version instead of enabling verbose - mode. Pull request #201 by Lee Jarvis. - * Running rake newb now automatically installs development - dependencies if the parser files haven't been built. Pull request #235 by - Kouhei Sutou. - * Moved old DEVELOPERS file to CONTRIBUTING to match github conventions. - * TomDoc output now has a "Returns" heading. Issue #234 by Brian Henderson - * Metaprogrammed methods can now use the :args: directive in addition to the - :call-seq: directive. Issue #236 by Mike Moore. - * Sections can be linked to using "@" like labels. If a section and a label - have the same name the section will be preferred. Issue #233 by Brian - Henderson. - * Files that come with a template are hard-linked to save space. Issue #186 - by Vít Ondruch. - -* Bug fixes - * Applied typo fixes by @dvsuresh from ruby/ruby@2c5dcdf - * Restored behavior of --no-pager alias -T. Pull request #223 by ruafozy. - * Fixed extra whitespace output in the rdoc coverage report. Bug #210 by - Ryan Davis. - * RDoc no longer documents its timestamp file when run on an empty - directory. Bug #212 by Rainer Keller - * HTML escape method names in the table of contents. Bug #219 by Akinori - MUSHA. - * Character literals ?h now create a new token type to prevent - loss of the "?" in output. Bug #220 by Vipul A M. - * When looking up a method that does not exist, ri escapes the regular - expression for fallback searches. Bug #227 by Aaron Patterson. - * The ri generator now writes the class method data after +module_function+. - Bug #222 by Zachary Scott, Ruby bug #8225 by David Unric. - * ri now handles missing ri data files. Bug #222 by Zachary Scott, Ruby bug - #8225 by David Unric. - * Added TomDoc to the supported markup formats section of rdoc --help. - Bug #214 by Ryan Davis. - * Fixed documented? check for classes which indicated incorrect 100% - coverage. Bug #211 by Ryan Davis. - * An :enddoc: at the top level stops all further parsing. Bug #213 by Ryan - Davis. - * Improved handling of multiline call-seq. Bug #207 by Erik Hollensbe. - * Fixed text that is missing whitespace for TomDoc. Bug #248 by Noel Cower. - * The RDoc methods now store the method they are aliased to. Bug #206 by - Jeremy Stephens. - * Fixed parsing of multiple methods on the same line. Bug #221 by derula. - * Fixed missing support for images in markdown. Bug #241, pull request #242 - by Zachary Scott. - * The markdown image fix also added support for images via an rdoc-image: - scheme. See RDoc::Markup@Links for details. Issue #93 by Tim Pease. - * Ignore empty call-seq for methods. Improved deduplication of C methods - sharing the same C function. This allows the method heading to show - up correctly for String#== and #===. Bug #244 by Neurogami. - * RDoc no longer adds "http://" to urls without a scheme. Bug #208 by - Zachary Scott. - * Improved the error message in the RDoc server when ri data is missing. - Bug #243, Pull Request #249 by Tadas Tamošauskas. - * Support ruby 2.0 hash syntax for keywords. Bug #256 by diogocsc. - * Prevent \\ from escaping the tag in RDoc markup. (\ still - escapes the tag.) Bug #251 by Pablo Bianciotto. - * Fixed lexing of escaped characters in strings which could cause - duplication of the final characters in source code view. Bug #252 by Mike - Stok. - * Disallow invalid tab widths for -w option. Bug reported by Charles - Hixson. - * rb_file_const() now adds constants to File::Constants when used outside - file.c. Fixes missing File::Constants::FNM_* constants in ruby. - * Fixed handling of :markup: when the file parser is unknown. Issue #262 by - Brian Henderson, pull request #269 by Rein Henrichs. - * Regexp options are no longer stripped in HTML output. Bug #259 by Zachary - Scott, Pull request #265 by Rein Henrichs - -== 4.0.1 / 2013-03-27 - -* Bug fixes - * RDoc::Options parser should rescue from OptionParser::ParseError. - * Updated example of RDoc::Options to include reopening RDoc::Options. - Pointed out by Michael Granger - * Moved RubyGems documentation installed message into RDoc hook. For - RubyGems bug #469 by Jeff Sandberg - * An Error is now raised when a heredoc is not terminated. Fixes exceptions - when processing comment blocks. Reported by darix - * rdoc --quiet --no-ignore-invalid now exits for invalid options. Pull - request #192 by Jeremy Evans - * RDoc::Parser::C no longer ignores a (METHOD) cast in rb_define_method. - Pull request #184 by Carlos Agarie - * RDoc::Servlet no longer ignores extra directories from -d. Pull request - #173 by Thomas Leitner - * Fixed `rdoc --ri-site`. Bug #193 by Michal Papis. - * RDoc no longer attempts to parse binary files. Bug #189 by postmodern, - Bug #190 by Christoffer Lervåg, Bug #195 by Aaron Patterson - * `rdoc --pipe` output now contains for markdown compliance. - * RDoc no longer leaves emacs-style modelines in .txt, .md or .rd files. - Bug #178 by Zachary Scott - * RDoc no longer puts raw markup in HTML output for markdown input. Bug - #204 by Erik Hollensbe - * Code objects with nodoc are no longer included in the ri store. Bug #177 - by Thomas Leitner. - * Text#snippet now creates a RDoc::Markup::ToHtmlSnippet correctly. - * The C parser now de-duplicates call-seq if the same C function is used for - multiple method names. Bug #203 by Pete Higgins - -== 4.0.0 / 2013-02-24 - -RDoc 4.0 includes several new features and several breaking changes. The -changes should not affect users of `rdoc` or `ri`. - -Notable feature additions are markdown support and an WEBrick servlet that can -serve HTML from an ri store. (This means that RubyGems 2.0+ no longer needs -to build HTML documentation when installing gems.) - -Changes since RDoc 3.12.1: - -* Breaking changes - * The default output encoding for RDoc is now UTF-8. Previously RDoc used - the default external encoding which was determined from your locale. - Issue #106 by Justin Baker. - * RDoc::RI::Store is now RDoc::Store so ri data generated by RDoc 4 cannot - be read by earlier versions of RDoc. RDoc::RI::Store exists as an alias - of RDoc::Store so ri data from older versions can still be read. - RDoc::RI::Store will be removed in RDoc 5. - - Tests that create RDoc::CodeObjects on the fly without wiring them into - the documentation tree (did not use add_class, add_method, etc.) must be - updated to use these methods. The documentation tree automatically - attaches them to the store instance which allows lookups to work - correctly. Additionally, a new method RDoc::Store#add_file must be used - instead of RDoc::TopLevel.new. The latter will not be attached to the - documentation tree. - * RDoc generators must accept an RDoc::Store and an RDoc::Options in - initialize. RDoc no longer passes an Array of RDoc::TopLevel objects to - #generate. Use RDoc::Store#all_files instead. - * Some markup formatters (RDoc::Markup::To*) now accept an RDoc::Options - instance as the first argument. Notably, the base class Formatter and - ToHtml*. (This is not universal due to the difficult at accessing the - user's options instance deep inside RDoc. A future major release may - remedy this.) - * Added new markup nodes and specials that RDoc::Markup::Formatter - subclasses must handle. If you're using RDoc::Markup::FormatterTestCase - the new methods you need to add should be readily apparent. - * Removed RDoc::RI::Paths::SYSDIR and ::SITEDIR. These were hidden - constants so no breakage is expected. Use RDoc::RI::Paths::system_dir - and ::site_dir instead. - * RDoc::RI::Store#modules has been renamed to RDoc::Store#module_names - to avoid confusion with RDoc::Store#all_modules imported from - RDoc::TopLevel. - * RDoc::RDocError has been removed. It was deprecated throughout RDoc 3. - * ri -f html is no longer supported. - * Comment definitions in C comments are now only discovered from the first - line. A colon on a subsequent line won't trigger definition extraction. - Issue #103, see also - http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/42942 - * Fixed :stopdoc: for class A::B where A has not been seen. Issue #95 by - Ryan Davis - * RDoc::ClassModule#each_ancestor no longer yields itself if there is - circular ancestry - -* Major enhancements - * ri can now show pages (README, etc.) - - ri rdoc:README - - Will show the README for the latest version of RDoc. You can specify - exact gem versions such as "rdoc-4.0:README" or view pages from the - standard library documentation with "ruby:README". - - RDoc 3 did not save pages in ri data so you will need to regenerate - documentation from your gems to use this feature. - * Added Markdown as a supported format. The markdown format can be set on a - per-file or per-comment basis with the +:markdown:+ directive like the rd - and tomdoc formats and on a per-project basis with - rdoc --markup markdown --write-options - * Removed global state from RDoc. RDoc::Store holds the documentation tree - and connects the driver to the parsers and generator. This also allows - documentation parsing and generation for multiple instances, but the rdoc - command-line tool does not support this. - - Due to this change RDoc::RDoc.current and RDoc::RDoc.reset no longer - exist. - -* Minor enhancements - * Added --page-dir option to give pretty names for a FAQ, guides, or other - documentation you write that is not stored in the project root. For - example, with the following layout: - - README.txt - guides/syntax.txt - guides/conversion.txt - - Running `rdoc --page-dir guides` will make the files in "guides" appear to - be at the top level of the project. This means they will appear to exist - at the top level in HTML output and you can access them with - `ri your_gem:syntax` and `ri your_gem:conversion`. - * Added --root for building documentation from outside the source dir. - * Added current heading and page-top links to HTML headings. - * Added a ChangeLog parser. It automatically parses files that begin - with 'ChangeLog' - * Added a table of contents to the sidebar. - * RDoc markup format merges adjacent labels in a label or note list into a - single definition list item for output. - * RDoc now tracks use of extend. Pull request #118 by Michael Granger. - * RDoc now tracks methods that use super. Pull request #116 by Erik - Hollensbe. - * Added methods ::system_dir, ::site_dir, ::home_dir and ::gem_dir to fetch - the components of RDoc::RI::Paths.path individually. - * Added support for rb_file_const. - * RDoc now processes files in sorted order. Issue #71 by Vít Ondruch - * RDoc now warns with --verbose when methods are duplicated. Issue #71 by - Vít Ondruch - * ri will display documentation for all methods in a class if -a is given. - Issue #57 by casper - * The RDoc coverage report will report line information for attributes, - constants and methods missing documentation. Issue #121 by Zachary Scott - * RDoc now reports a warning for files that are unreadable due to - permissions problems. - * RDoc controls documentation generation for RubyGems 2.0+ - -* Bug fixes - * Fixed parsing of multibyte files with incomplete characters at byte 1024. - Ruby bug #6393 by nobu, patch by Nobuyoshi Nakada and Yui NARUSE. - * Fixed rdoc -E. Ruby Bug #6392 and (modified) patch by Nobuyoshi Nakada - * Added link handling to Markdown output. Bug #160 by burningTyger. - * Fixed HEREDOC output for the limited case of a heredoc followed by a line - end. When a HEREDOC is not followed by a line end RDoc is not currently - smart enough to restore the source correctly. Bug #162 by Zachary Scott. - * Fixed parsing of executables with shebang and encoding comments. Bug #161 - by Marcus Stollsteimer - * RDoc now ignores methods defined on constants instead of creating a fake - module. Bug #163 by Zachary Scott. - * Fixed ChangeLog parsing for FFI gem. Bug #165 by Zachary Scott. - * RDoc now links \#== methods. Bug #164 by Zachary Scott. - * Allow [] following argument names for TomDoc. Bug #167 by Ellis Berner. - * Fixed the RDoc servlet for home and site directories. Bug #170 by Thomas - Leitner. - * Fixed references to methods in the RDoc servlet. Bug #171 by Thomas - Leitner. - * Fixed debug message when generating the darkfish root page. Pull Request - #174 by Thomas Leitner. - * Fixed deletion of attribute ri data when a class was loaded then saved. - Issue #171 by Thomas Leitner. - * Fully qualified names for constants declared from the top level are now - attached to their class or module properly. - * Fixed table of contents display in HTML output for classes and modules. - * Incremental ri builds of C files now work. C variable names from previous - runs are now saved between runs. - * A word that is directly followed by a multi-word tidy link label no longer - disappears. (Like text{link}[http://example]) - * Fixed legacy template support. Pull Request #107 by Justin Baker. - * An HTML class in a verbatim section no longer triggers ruby parsing. - Issue #92 by Vijay Dev - * Improved documentation for setting the default documentation format for - your ruby project. Issue #94 by Henrik Hodne - * Fixed handling of LANG in the RDoc::Options tests. Issue #99 by Vít - Ondruch - * RDoc no longer quits when given an entry that is not a file or directory. - Issue #101 by Charles Nutter - * Fixed bug in syntax-highlighting that would corrupt regular expressions. - Ruby Bug #6488 by Benny Lyne Amorsen. - * "class Object" no longer appears in the coverage report if all its methods - are documented. This suppresses a false positive for libraries that add - toplevel methods. Pull Request #128 by Zachary Scott. - * Fixed test_gen_url test name in TestRDocMarkupToHtml. Pull Request #130 - by Zachary Scott. - * Comment-defined methods ahead of define_method are now discovered. Issue - #133 by eclectic923 - * Fixed detection of define_method documentation. Issue #138 by Marvin - Gülker. - * Fixed lexing of character syntax (?z). Reported by Xavier - Noria. - * Add license to gem spec. Issue #144 by pivotalcommon - * Fixed comment selection for classes. Pull request #146 by pioz - * Fixed parsing of def self.&() end. Issue #148 by Michael - Lucy - * Generated RD parser files are now included in the gem. Issue #145 by - Marvin Gülker - * Class and module aliases now create new classes to avoid duplicate names - in the class list. Issue #143 by Richard Schneeman, Rails Issue #2839 - * RDoc::Markup::Parser now correctly matches indentation of lists when - multibyte characters are used in the list labels. Issue #140 by - burningTyger - * Fixed mangling of email addresses that look like labels. Issue #129 by - Tobias Koch - * Classes and modules in a C file may now be created in any order. Issue - #124 by Su Zhang - * A metaprogrammed method supports the :args: directive. Issue #100 - * A metaprogrammed method supports the :yields: directive. - * RDoc will now look for directives up to the end of the line. For example, - class B < A; end # :nodoc: - will now hide documentation of B. Issue #125 by Zachary Scott - * Fixed tokenization of % when it is not followed by a $-string type - * Fixed display of __END__ in documentation examples in HTML output - * Fixed tokenization of reserved words used as new-style hash keys - * RDoc now handles class << $gvar by ignoring the body - * Fixed parsing of class A:: B. - * Worked around bug in RDoc::RubyLex where tokens won't be reinterpreted - after unget_tk. - * Fixed class << ::Foo writing documentation to /Foo.html - * Fixed class ::A referencing itself from inside its own namespace. - -Changes since RDoc 4.0.0.rc.2: - -* Bug fix - * Templates now use the correct encoding when generating pages. Issue #183 - by Vít Ondruch - -== 4.0.0.rc.2 / 2013-02-05 - -* Minor enhancements - * Added current heading and page-top links to HTML headings. - -* Bug fixes - * Fixed an XSS exploit in darkfish.js. This could lead to cookie disclosure - to third parties. See CVE-2013-0256[rdoc-ref:CVE-2013-0256.rdoc] for full - details including a patch you can apply to generated RDoc documentation. - * Fixed parsing of multibyte files with incomplete characters at byte 1024. - Ruby bug #6393 by nobu, patch by Nobuyoshi Nakada and Yui NARUSE. - * Fixed rdoc -E. Ruby Bug #6392 and (modified) patch by Nobuyoshi Nakada - * Added link handling to Markdown output. Bug #160 by burningTyger. - * Fixed HEREDOC output for the limited case of a heredoc followed by a line - end. When a HEREDOC is not followed by a line end RDoc is not currently - smart enough to restore the source correctly. Bug #162 by Zachary Scott. - * Fixed parsing of executables with shebang and encoding comments. Bug #161 - by Marcus Stollsteimer - * RDoc now ignores methods defined on constants instead of creating a fake - module. Bug #163 by Zachary Scott. - * Fixed ChangeLog parsing for FFI gem. Bug #165 by Zachary Scott. - * RDoc now links \#== methods. Bug #164 by Zachary Scott. - * Allow [] following argument names for TomDoc. Bug #167 by Ellis Berner. - * Fixed the RDoc servlet for home and site directories. Bug #170 by Thomas - Leitner. - * Fixed references to methods in the RDoc servlet. Bug #171 by Thomas - Leitner. - * Fixed debug message when generating the darkfish root page. Pull Request - #174 by Thomas Leitner. - * Fixed deletion of attribute ri data when a class was loaded then saved. - Issue #171 by Thomas Leitner. - -== 4.0.0.preview2.1 / 2012-12-14 - -* Minor enhancements - * Added --page-dir option to give pretty names for a FAQ, guides, or other - documentation you write that is not stored in the project root. For - example, with the following layout: - - README.txt - guides/syntax.txt - guides/conversion.txt - - Running `rdoc --page-dir guides` will make the files in "guides" appear to - be at the top level of the project. This means they will appear to exist - at the top level in HTML output and you can access them with - `ri your_gem:syntax` and `ri your_gem:conversion`. - -* Bug fixes - * Fully qualified names for constants declared from the top level are now - attached to their class or module properly. - * Fixed table of contents display in HTML output for classes and modules. - * Incremental ri builds of C files now work. C variable names from previous - runs are now saved between runs. - -== 4.0.0.preview2 / 2012-12-01 - -* Breaking changes - * The default output encoding for RDoc is now UTF-8. Previously RDoc used - the default external encoding which was determined from your locale. - Issue #106 by Justin Baker. - * RDoc::RI::Store is now RDoc::Store so ri data generated by RDoc 4 cannot - be read by earlier versions of RDoc. RDoc::RI::Store exists as an alias - of RDoc::Store so ri data from older versions can still be read. - RDoc::RI::Store will be removed in RDoc 5. - - Tests that create RDoc::CodeObjects on the fly without wiring them into - the documentation tree (did not use add_class, add_method, etc.) must be - updated to use these methods. The documentation tree automatically - attaches them to the store instance which allows lookups to work - correctly. Additionally, a new method RDoc::Store#add_file must be used - instead of RDoc::TopLevel.new. The latter will not be attached to the - documentation tree. - * RDoc generators must accept an RDoc::Store and an RDoc::Options in - initialize. RDoc no longer passes an Array of RDoc::TopLevel objects to - #generate. Use RDoc::Store#all_files instead. - * Some markup formatters (RDoc::Markup::To*) now accept an RDoc::Options - instance as the first argument. Notably, the base class Formatter and - ToHtml*. (This is not universal due to the difficult at accessing the - user's options instance deep inside RDoc. A future major release may - remedy this.) - * Added new markup nodes and specials that RDoc::Markup::Formatter - subclasses must handle. If you're using RDoc::Markup::FormatterTestCase - the new methods you need to add should be readily apparent. - * Removed RDoc::RI::Paths::SYSDIR and ::SITEDIR. These were hidden - constants so no breakage is expected. Use RDoc::RI::Paths::system_dir - and ::site_dir instead. - * RDoc::RI::Store#modules has been renamed to RDoc::Store#module_names - to avoid confusion with RDoc::Store#all_modules imported from - RDoc::TopLevel. - * RDoc::RDocError has been removed. It was deprecated throughout RDoc 3. - * ri -f html is no longer supported. - * Comment definitions in C comments are now only discovered from the first - line. A colon on a subsequent line won't trigger definition extraction. - Issue #103, see also - http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/42942 - * Fixed :stopdoc: for class A::B where A has not been seen. Issue #95 by - Ryan Davis - * RDoc::ClassModule#each_ancestor no longer yields itself if there is - circular ancestry - -* Major enhancements - * ri can now show pages (README, etc.) - - ri rdoc:README - - Will show the README for the latest version of RDoc. You can specify - exact gem versions such as "rdoc-4.0:README" or view pages from the - standard library documentation with "ruby:README". - - RDoc 3 did not save pages in ri data so you will need to regenerate - documentation from your gems to use this feature. - * Added Markdown as a supported format. The markdown format can be set on a - per-file or per-comment basis with the +:markdown:+ directive like the rd - and tomdoc formats and on a per-project basis with - rdoc --markup markdown --write-options - * Removed global state from RDoc. RDoc::Store holds the documentation tree - and connects the driver to the parsers and generator. This also allows - documentation parsing and generation for multiple instances, but the rdoc - command-line tool does not support this. - - Due to this change RDoc::RDoc.current and RDoc::RDoc.reset no longer - exist. - -* Minor enhancements - * Added --root for building documentation from outside the source dir. - * Added a ChangeLog parser. It automatically parses files that begin - with 'ChangeLog' - * Added a table of contents to the sidebar. - * RDoc markup format merges adjacent labels in a label or note list into a - single definition list item for output. - * RDoc now tracks use of extend. Pull request #118 by Michael Granger. - * RDoc now tracks methods that use super. Pull request #116 by Erik - Hollensbe. - * Added methods ::system_dir, ::site_dir, ::home_dir and ::gem_dir to fetch - the components of RDoc::RI::Paths.path individually. - * Added support for rb_file_const. - * RDoc now processes files in sorted order. Issue #71 by Vít Ondruch - * RDoc now warns with --verbose when methods are duplicated. Issue #71 by - Vít Ondruch - * ri will display documentation for all methods in a class if -a is given. - Issue #57 by casper - * The RDoc coverage report will report line information for attributes, - constants and methods missing documentation. Issue #121 by Zachary Scott - * RDoc now reports a warning for files that are unreadable due to - permissions problems. - * RDoc controls documentation generation for RubyGems 2.0+ - -* Bug fixes - * A word that is directly followed by a multi-word tidy link label no longer - disappears. (Like text{link}[http://example]) - * Fixed legacy template support. Pull Request #107 by Justin Baker. - * An HTML class in a verbatim section no longer triggers ruby parsing. - Issue #92 by Vijay Dev - * Improved documentation for setting the default documentation format for - your ruby project. Issue #94 by Henrik Hodne - * Fixed handling of LANG in the RDoc::Options tests. Issue #99 by Vít - Ondruch - * RDoc no longer quits when given an entry that is not a file or directory. - Issue #101 by Charles Nutter - * Fixed bug in syntax-highlighting that would corrupt regular expressions. - Ruby Bug #6488 by Benny Lyne Amorsen. - * "class Object" no longer appears in the coverage report if all its methods - are documented. This suppresses a false positive for libraries that add - toplevel methods. Pull Request #128 by Zachary Scott. - * Fixed test_gen_url test name in TestRDocMarkupToHtml. Pull Request #130 - by Zachary Scott. - * Comment-defined methods ahead of define_method are now discovered. Issue - #133 by eclectic923 - * Fixed detection of define_method documentation. Issue #138 by Marvin - Gülker. - * Fixed lexing of character syntax (?z). Reported by Xavier - Noria. - * Add license to gem spec. Issue #144 by pivotalcommon - * Fixed comment selection for classes. Pull request #146 by pioz - * Fixed parsing of def self.&() end. Issue #148 by Michael - Lucy - * Generated RD parser files are now included in the gem. Issue #145 by - Marvin Gülker - * Class and module aliases now create new classes to avoid duplicate names - in the class list. Issue #143 by Richard Schneeman, Rails Issue #2839 - * RDoc::Markup::Parser now correctly matches indentation of lists when - multibyte characters are used in the list labels. Issue #140 by - burningTyger - * Fixed mangling of email addresses that look like labels. Issue #129 by - Tobias Koch - * Classes and modules in a C file may now be created in any order. Issue - #124 by Su Zhang - * A metaprogrammed method supports the :args: directive. Issue #100 - * A metaprogrammed method supports the :yields: directive. - * RDoc will now look for directives up to the end of the line. For example, - class B < A; end # :nodoc: - will now hide documentation of B. Issue #125 by Zachary Scott - * Fixed tokenization of % when it is not followed by a $-string type - * Fixed display of __END__ in documentation examples in HTML output - * Fixed tokenization of reserved words used as new-style hash keys - * RDoc now handles class << $gvar by ignoring the body - * Fixed parsing of class A:: B. - * Worked around bug in RDoc::RubyLex where tokens won't be reinterpreted - after unget_tk. - * Fixed class << ::Foo writing documentation to /Foo.html - * Fixed class ::A referencing itself from inside its own namespace. - -== 3.12.2 / 2013-02-24 - -* Bug fixes - * Fixed bug in syntax-highlighting that would corrupt regular expressions. - Ruby Bug #6488 by Benny Lyne Amorsen. - * Fixed lexing of character syntax (?x). Reported by Xavier - Noria. - * Fixed tokenization of % when it is not followed by a $-string type - * Fixed display of __END__ in documentation examples in HTML output - * Fixed tokenization of reserved words used as new-style hash keys - * Fixed HEREDOC output for the limited case of a heredoc followed by a line - end. When a HEREDOC is not followed by a line end RDoc is not currently - smart enough to restore the source correctly. Bug #162 by Zachary Scott. - -== 3.12.1 / 2013-02-05 - -* Bug fixes - * Fixed an XSS exploit in darkfish.js. This could lead to cookie disclosure - to third parties. See CVE-2013-0256[rdoc-ref:CVE-2013-0256.rdoc] for full - details including a patch you can apply to generated RDoc documentation. - * Ensured that rd parser files are generated before checking the manifest. - -== 3.12 / 2011-12-15 - -* Minor enhancements - * Added DEVELOPERS document which contains an overview of how RDoc works and - how to add new features to RDoc. - * Improved title for HTML output to include --title in the - title element. - * rdoc --pipe now understands --markup. - * RDoc now supports IRC-scheme hyperlinks. Issue #83 by trans. - -* Bug fixes - * Fixed title on HTML output for pages. - * Fixed parsing of non-indented HEREDOC. - * Fixed parsing of %w[] and other % literals. Issue #84 by - Erik Hollensbe - * Fixed arrow replacement in HTML output munging the spaceship operator. - Issue #85 by eclectic923. - * Verbatim sections with ERB that match the ruby code whitelist are no - longer syntax-highlighted. Issue #86 by eclectic923 - * Line endings on windows are normalized immediately after reading with - binmode. Issue #87 by Usa Nakamura - * RDoc better understands directives for comments. Comment directives can - now be found anywhere in multi-line comments. Issue #90 by Ryan Davis - * Tidy links to methods show the label again. Issue #88 by Simon Chiang - * RDoc::Parser::C can now find comments directly above - +rb_define_class_under+. Issue #89 by Enrico - * In rdoc, backspace and ansi formatters, labels and notes without bodies - are now shown. - * In rdoc, backspace and ansi formatters, whitespace between label or note - and the colon is now stripped. - -== 3.11 / 2011-10-17 - -* Bug fixes - * Avoid parsing TAGS files included in gems. Issue #81 by Santiago - Pastorino. - -== 3.10 / 2011-10-08 - -* Major enhancements - * RDoc HTML output has been improved: - * The search from Володя Колесников's (Vladimir Kolesnikov) SDoc has been - integrated. - - The search index generation is a reusable component through - RDoc::Generator::JsonIndex - * The table of contents is now a separate page and now shows links to - headings and sections inside a page or class. - * Class pages no longer show the namespace and no longer have file info - pages. - * HTML output is HTML 5. - * Static files can be copied into RDoc using --copy-files - * RDoc supports additional documentation formats: - * TomDoc 1.0.0-rc1 - * RD format - - The default markup can be set via the --markup option. - - The format of documentation in a particular file can be specified by the - +:markup:+ directive. If the +:markup:+ directive is in the first comment - it is used as the default for the entire file. For other comments it - overrides the default markup format. - - The markup format can be set for rake tasks using RDoc::Task#markup - * RDoc can save and load an options file. - - To create an options file that defaults to using TomDoc markup run: - - rdoc --markup tomdoc --write-options - - This will create a .rdoc_options file. Check it in to your VCS and - package it with your gem. RDoc will automatically load this file and - combine it with the user's options. - - Some options are not saved. See RDoc::Options@Saved+Options for full - details. - -* Minor enhancements - * RDoc autoloads everything. You only need to require 'rdoc' now. - * HTML headings now have ids matching their titles. - - = Hello! - - Is rendered as - -

Hello!

- - * Labels for classes or methods can be linked-to by adding an @ - following the class or method reference. For example, - RDoc::Markup@Links - - See RDoc::Markup@Links for further details. - * For HTML output RDoc uses +SomeClass.method_name+ and - +SomeClass#method_name+ for remote methods and attributes and - +::method_name+ and +#method_name+ for local methods. - * RDoc makes an effort to syntax-highlight ruby code in verbatim sections. - See RDoc::Markup@Paragraphs+and+Verbatim - * Added RDoc::TopLevel#text? and RDoc::Parser::Text to indicate a - parsed file contains no ruby constructs. - * Added rdoc-label link scheme which allows bidirectional links. - See RDoc::Markup for details. - * Image paths at HTTPS URLs will now be turned into ++ tags. Pull - Request #60 by James Mead - * Added RDoc::Comment which encapsulates comment-handling functionality. - * Added RDoc::Markup::PreProcess::post_process to allow arbitrary comment - munging. - * RDoc::RDoc::current is set for the entire RDoc run. - * Split rdoc/markup/inline into individual files for its component classes. - * Moved token stream HTML markup out of RDoc::AnyMethod#markup_code into - RDoc::TokenStream::to_html - * "Top" link in section headers is no longer inside the heading element. - * RDoc avoids printing some warnings unless run with `rdoc --verbose`. For - Rails issue #1646. - * Finishing a paragraph with two or more spaces will result in a line break. - This feature is experimental and may be modified or removed. - -* Bug fixes - * Markup defined by RDoc::Markup#add_special inside a is no - longer converted. - * Performance of RDoc::RubyLex has been improved. Ruby Bug #5202 by Ryan - Melton. - * Add US-ASCII magic comments to work with ruby -Ku. Issue #63 by - Travis D. Warlick, Jr. - * Clicking a link in the method description now works. Issue #61 by Alan - Hogan. - * Fixed RDoc::Markup::Parser for CRLF line endings. Issue #67 by Marvin - Gülker. - * Fixed lexing of percent strings like %r{#}. Issue #68 by eclectic923. - * The C parser now understands classes defined with - +rb_struct_define_without_accessor+ (like Range). Pull Request #73 by Dan - Bernier - * Fixed lexing of a b <<-HEREDOC. Issue #75 by John Mair. - * Added LEGAL.rdoc with references to licenses in other files. Issue #78 by - Dmitry Jemerov. - * Block parameters are displayed in Darkfish output again. Issue #76 by - Andrea Singh. - * The method parameter coverage report no longer includes parameter default - values. Issue #77 by Jake Goulding. - * The module for an include is not looked up until parsed all the files are - parsed. Unless your project includes nonexistent modules this avoids - worst-case behavior (O(n!)) of RDoc::Include#module. - -== 3.9.5 / 2013-02-05 - -* Bug fixes - * Fixed an XSS exploit in darkfish.js. This could lead to cookie disclosure - to third parties. See CVE-2013-0256.rdoc for full details including a - patch you can apply to generated RDoc documentation. - -== 3.9.4 / 2011-08-26 - -* Bug fixes - * Applied typo and grammar fixes from Luke Gruber. Ruby bug #5203 - -== 3.9.3 / 2011-08-23 - -* Bug fixes - * Add US-ASCII magic comments to work with ruby -Ku. Issue #63 by - Travis D. Warlick, Jr. - * Image paths at HTTPS URLs are now turned into ++ tags. Pull - Request #60 by James Mead - * Markup defined by RDoc::Markup#add_special inside a is no - longer converted. - -== 3.9.2 / 2011-08-11 - -* Bug fix - * Loosened TIDYLINK regexp to allow any content in the link section like: - {foo}[rdoc-ref:SomeClass] - * In HTML output headings are capped at
again - -== 3.9.1 / 2011-07-31 - -* Bug fixes - * Fix RDoc::Markup parser for a header followed by a non-text token. Issue - #56 by Adam Tait - * Fix RDoc::Markup::ToHtmlCrossref#gen_url for non-rdoc-ref links. - * Fix bug report URL when rdoc crashes. - -== 3.9 / 2011-07-30 - -* Minor enhancements - * RDoc::Parser::C now supports :doc: and :nodoc: for class comments - * Added the rdoc-ref: link scheme which links to a named reference. - rdoc-ref: can resolve references to classes, modules, methods, - files, etc. This can be used to create cross-generator named links unlike - the link: scheme which is dependent upon the exact file name. - Issue #53 by Simon Chiang - * Pulled RDoc::CrossReference out of RDoc::Markup::ToHtmlCrossref. - Cross-references can now be created easily for non-HTML formatters. -* Bug fixes - * `ri []` and other special methods now work properly. Issue #52 by - ddebernardy. - * `ri` now has space between class comments from multiple files. - * :stopdoc: no longer creates Object references. Issue #55 by Simon Chiang - * :nodoc: works on class aliases now. Issue #51 by Steven G. Harms - * Remove tokenizer restriction on header lengths for verbatim sections. - Issue #49 by trans - -== 3.8 / 2011-06-29 - -* Minor enhancements - * RDoc::Parser::C can now discover methods on ENV and ARGF. - * RDoc::Parser::C now knows about rb_cSocket and rb_mDL. -* Bug fixes - * Updating Object in an ri data store with new data now removes methods, - includes, constants and aliases. - -== 3.7 / 2011-06-27 - -* Minor enhancements - * New directive :category: which allows methods to be grouped into sections - more cleanly. See RDoc::Markup for details. - * Document-class for RDoc::Parser::C now supports Foo::CONST as well as - CONST. - * ri method output is now a comma-separated list when displayed - interactively. Pull Request #39 by Benoit Daloze. - * RDoc::ClassModule#merge now prefers the argument's information over the - receiver's (it now behaves like Hash#merge! instead of a backwards - Hash#merge!). - * RDoc::Markup#convert now accepts an RDoc::Markup::Document instance - * RDoc now owns the code for generating RDoc and ri data when gems install - * Added RDoc::RDoc::reset - * Added RDoc::CodeObject#file_name -* Bug fixes - * ri no longer crashes when attempting to complete a plain [. - * ri data now tracks which file information came from so it can process - removals and changes to: - * Classes and Modules - * Methods - * Attributes - * Includes - * Constants - You will need to rebuild your ri data for it to update properly. Issue - #21 by Sven Riedel - * Signal and SignalException no longer clobber each other - * RDoc::Parser::C no longer creates classes when processing aliases. - * RDoc::Text#strip_stars handles Document-method for methods with =, ! and ? - now. - * RDoc::Parser::C now allows .cpp files to be used with the "in" comment on - rb_define_method. Bug #35 by Hanmac. - * RDoc::Parser::Ruby no longer eats content when =begin/=end documentation - blocks are followed by a documentable item. Issue #41 by mfn. - * RDoc::Markup::Formatter and subclasses now allow an optional +markup+ - parameter for adding custom markup. The example in - RDoc::Markup::Formatter will now work. Issue #38 by tsilen. - * RDoc::Parser::C can now distinguish between class methods and instance - methods in Document-method. Issue #36 by Vincent Batts. - * RDoc now encodes file names in the output encoding. Issue #33 by Perry - Smith. - * ri data generation for method aliases no longer duplicates the class in - #full_name - -== 3.6.1 / 2011-05-15 - -* Bug fixes - * Fix infinite loop created when re-encountering BasicObject. - * RDoc::Context#each_ancestor is now provided for duck-typing. - * rb_path2class() can now be used to discover the parent class in - rb_define_class_under. - -== 3.6 / 2011-05-13 - -* Major Enhancements - * Interactive ri is now the default when no names are given. -* Minor Enhancements - * RDoc::RDoc#generate was added to allow multiple generators to be used with - a set of parsed file info. - * RDoc::Options#finish can be called multiple times now. - * `ri -i` only shows one level of namespace when completing class names. - * Added `ri --list` for explicit listing. `ri -l F G` will list all classes - or modules starting with F or G -* Bug fixes - * Remove windows-specific test for test_check_files, it is too hard to do. - Ruby commit r30811 by Usaku Nakamura. - * Remove unnecessary (and wrong) platform-dependent hacks. Ruby commit - r30829 by Usaku Nakamura. - * Completing via Array#[ in `ri -i` no longer crashes. Ruby Bug #3167 - * Completing IO::o in `ri -i` now returns results. Ruby Bug #3167 - * RDoc::Parser::C ignores prototypes better. Pull Request #34 by Pete - Higgins. - * private_class_method and public_class_method are now parsed correctly for - inherited methods. Issue #16 by gitsucks. - * The doc directive now forces documentation even when the method is marked - private or protected. - -== 3.5.3 / 2010-02-06 - -* Bug fixes - * When including a file perform a lossy force-transcoding to the output - encoding instead of crashing to preserve as much content as possible. - Ruby Bug #4376 by Yui NARUSE. - * Work around inconsistent encoding result from String#sub!, String#gsub!. - Related to Ruby Bug #4376. - * Work around inconsistent encoding result from String#[]=. Related to Ruby - Bug #4376. - * When Darkfish fails the file being generated is now reported. - -== 3.5.2 / 2010-02-04 - -* Deprecations - * RDoc::Context::Section#sequence is now deprecated. Use - RDoc::Context::Section#aref instead. - -* Bug fixes - * Fixed syntax highlighting CSS class generation. Reported by Daniel - Bretoi. - * Fixed ri for methods with aliases. Pull Request #15 by Sven Riedel. - * Added windows-specific test for test_check_files. - * Darkfish now supports sections. Template and generator author see - RDoc::Context#each_section to add section support. RubyForge Bug #26883 - by Jeff Hodges. - * Fixed post-install message for Ruby 1.9.2 users. - * Set required ruby version to >= 1.8.7. - -== 3.5.1 / 2010-01-30 - -* Bug fixes - * Fixed some typos. Pull request #13 by R.T. Lechow. - * Ensure an RDoc::Stats is created in #parse_files. Fixes documentation for - railties which has no files. Reported by Aaron Patterson - -== 3.5 / 2010-01-29 - -* Minor enhancements - * RDoc::Parser::C looks for rb_scan_args and fills in RDoc::AnyMethod#params - appropriately. This may provide useful information if the author did not - provide a call-seq. - * RDoc::Parser::C now records the function name for methods implemented in - C. - * RDoc now records file and byte offset information for methods. -* Bug fixes - * Locations of module aliases are now recorded. - * RDoc::Parser::C finds method bodies better now. - * Fixed further locations where output encoding was not preserved. Bug #11 - by Vít Ondruch, RubyForge bug #28791 by Dzmitry Prakapenka. - * Fixed display of numeric lists on the index page and file pages. Bug #12 - by tobijk. - * Skip TestRDocOptions#test_check_files on windows until a windows-specific - test can be created. RubyForge bug #28821 by Usaku Nakamura. - * Fixed line-height of headings in method and alias descriptions. RubyForge - Bug #2770 by Adam Avilla - * Relaxed RDoc::Parser::Ruby#remove_private_comments to consume more dashes - as older versions once did. Bug #7 by Claus Folke Brobak. - -== 3.4 / 2010-01-06 - -* Minor enhancements - * RDoc::RDoc#document may now be called with an RDoc::Options instance. -* Bug fixes - * Added skips to Encoding tests running on 1.8. - * Fixed warnings - -== 3.3 / 2010-01-03 - -* Minor enhancements - * The coverage report can now report undocumented method parameters - including methods defined in C. - - rdoc -C gives a standard report, rdoc -C1 includes - method parameters. Method parameters are considered documented if they're - marked-up with +, or . - * The C parser now uses *args instead of ... if no - call-seq was provided to give names to the arguments. -* Bug fixes - * The C parser now records the file location of aliases, attributes, - constants and methods allowing -C to work on C files. - * Darkfish now handles dots in call-seq allowing ary.insert(index, - obj...) to display correctly. Patch #6 by KUBO Takehiro. - * Improved processing of meta-programmed methods when followed by unparseable - syntax. RubyForge patch #28653 by Aidan Cully. - * rdoc now touches the flag file when it create the output directory. - Prevents the "isn't an RDoc directory" error if rdoc crashes. - * RDoc now properly converts to the expected output encoding. RubyForge bug - #28791 by Dzmitry Prakapenka. - * Restored parsing of block comments. RubyForge bug #28668 by Stefano Crocco. - * Metaprogrammed methods defined with blocks no longer confuse the ruby - parser. RubyForge bug #28370 by Erik Hollensbe. - * ri no longer displays all methods in the inheritance chain. - -== 3.2 / 2010-12-29 - -* Minor enhancements - * RDoc generator authors may now suppress updating the output dir (creating - a created.rid file) by setting RDoc::Options#update_output_dir to false. - * RDoc::Task has been refactored to ease creating subclasses. -* Bug fixes - * RDoc's gitignore now ignores .DS_Store files. Pull Request #3 by Shane - Becker. - -== 3.1 / 2010-12-28 - -RDoc has moved to github. Releases after 3.1 reference github unless -otherwise noted. - -* Minor enhancements - * RDoc::Task now features a #generator option to choose an alternate - generator. Pull Request #2 by Erik Hollensbe. - * Enhanced test for RDoc::Parser::binary? RubyForge patch #28538 by Eito - Katagiri. - * Generator list in --help is no longer static. Generator description comes - from the generator's DESCRIPTION constant. - * Documentation summary is now displayed with dynamic width. -* Bug fixes - * Strip encoding comment from input to avoid overriding file comment. - RubyForge Bug #22113 by James Gray. - * Restore call-seq parsing behavior when the call-seq is the only comment. - RubyForge Bug #26290 by Sylvain Joyeux. - * Coverage report no longer crashes for constant aliases. Pull Request #1 - by Andy Lindeman. - * RDoc no longer loses ghost methods when followed by certain tokens. - RubyForge bug #27793 by Aaron Patterson. - * RDoc no longer crashes in ri if HOME is not set. Ruby Bug #4202 by - Shyouhei Urabe. - * ri no longer crashes with HTML format output. RubyForge bug #28675 by - 7rans. - * RDoc::Markup::ToHtml#gen_url now initializes #from_path to ''. - Additionally, #from_path is now settable. RubyForge bug #27838 by Claus - Folke Brobak. - * Comments in the C parser are now normalized before being combined. - RubyForge patch #28646 by Sven Herzberg. - * RDoc::Parser::C no longer requires a comment and finds more method bodies. - RubyForge patch #28643 by Sven Herzberg. - * Darkfish now has a "Class/Module Index" instead of a "Class Index". - RubyForge patch #28364 by James Tucker. - * RDoc::Parser::Ruby now parses negative numbers correctly. RubyForge patch - #28544 by Eito Katagiri. - -== 3.0.1 / 2010-12-19 - -* Bug fix - * RDoc no longer has a Perl parser. - -== 3.0 / 2010-12-19 - -Special thanks to Thierry Lambert for massive improvements to RDoc. - -* Major enhancements - * Ruby 1.8.6 is no longer supported by RDoc. - * RDoc now converts input files to a single encoding specified by - --encoding. See RDoc::RDoc and RDoc::Options#encoding. - --encoding is now preferred over --charset - * RDoc now supports a --coverage-report flag (also -C and - --dcov) that outputs a report on items lacking documentation. - * Templates (rdoc -T) are now checked for existence in - RDoc::Options. Generator authors can now use RDoc::Options#template_dir - which is the full path to the template directory. - * Added support for class aliases. Patch by Thierry Lambert. - * Improved merging of classes and modules across multiple files including - more accurate documentation statistics. Patch by Thierry Lambert. - * Improved handling of method aliases. Patch by Thierry Lambert. - * Improved handling of visibility of RDoc code objects. Patch by Thierry - Lambert. - * RDoc::Attr#type is now RDoc::Attr#definition. Patch by Thierry Lambert. - * Removed TimeConstantMethods - * RDoc now calls ::new instead of ::for on generators. -* Minor enhancements - * Added rdoc arguments --dry-run, --all, - --visibility, --force-output, --hyperlink-all. - Patch by Thierry Lambert. - * RDoc::Markup::FormatterTestCase has been expanded. Patch by Thierry - Lambert. - * RDoc::Markup::TextFormatterTestCase has been extracted from RDoc tests. - Patch by Thierry Lambert. - * Various RDoc::Parser::Ruby enhancements. Patch by Thierry Lambert. - * Various RDoc::Markup::Parser enhancements. Patch by Thierry Lambert. - * RDoc::Parser::binary? is more robust now that it uses Encoding. - * Deprecated rdoc arguments are now explicitly mentioned in rdoc command - output. Patch by Thierry Lambert. - * Constant values are formatted more accurately. Patch by Thierry Lambert. - * Enhanced call-seq parsing in RDoc::Parser::C. Patch by Thierry Lambert. - * RDoc no longer uses kw, cmt, re or str classes for embedded source code - snippets. Patch by Thierry Lambert. - * RDoc directives may now be escaped with a leading '\\'. Patch by Thierry - Lambert. - * RDoc note lists (label::) now generate a table with class - "rdoc-list". Patch by Thierry Lambert. - * RDoc markup documentation has been moved to RDoc::Markup including notes - on how to document source code. - * An RDoc::Require is now always listed at the file level. Patch by Thierry - Lambert. - * RDoc::CodeObjects now know which file they were defined in. - * RDoc::Options calls ::setup_options on the generator class specified by - --format. See RDoc::Options::setup_generator. - * rdoc gives an error when multiple formats are given. - * Files with erb inside will no longer trip RDoc::Parser::binary? - * Last --title wins. Patch by Thierry Lambert. - * Better block params handling. Patch by Thierry Lambert. - * Moved rdoc/tokenstream.rb to rdoc/token_stream.rb. - * Moved rdoc/markup/preprocess.rb to rdoc/markup/pre_process.rb. - * Removed "':' not followed by operator or identifier" warning for new Hash - syntax. - * rb_attr() is now supported for attributes. - * RDoc::Parser::C now supports yields, doc, and args directives like - RDoc::Parser::Ruby. - * Moved RDoc::Parser::PerlPOD to the rdoc-perl_pod gem. -* Bug fixes - * RDoc::Generator tests no longer require any installed RDoc on Ruby 1.9 - * Load existing cache before generating ri. Ruby r27749 by NAKAMURA Usaku. - * RDoc now handles BOM. Ruby r28062 by Nobuyoshi Nakada. - * Use proper XML encoding for darkfish classpage. Ruby r28083 by NARUSE, - Yui. - * Fix ri output when special characters are inside html tags. Patch by Tomo - Kazahaya, Ruby Bug #3512. - * Don't bother checking if the pager exists, it's already done. Ruby r28842 - by NAKAMURA Usaku. - * RDoc::Parser::Ruby now ignores non-constant-named singleton classes. Ruby - r29140 by Nobuyoshi Nakada. Ruby Bug #3759. - * RDoc::Parser::Ruby call args no longer include assignment. Ruby r29141 by - Nobuyoshi Nakada. Ruby Bug #3759 - * Handle $HOME being unset in ri. Ruby r29272 by Nobuyoshi Nakada. - * uniq ancestors and modules too. Ruby r29312 by Nobuyoshi Nakada. - * RDoc now knows about Encoding by default. Ruby r29356 by Nobuyoshi - Nakada. - * ri now defaults to the backspace formatter when piped. Use RI environment - variable or options to override. Ruby r28455 by Yusuke Endoh. - * __send__ and friends no longer get their underscores removed. Patch by - Thierry Lambert. - * The C parser now makes new public when promoting initialize. - * Fix crash in #markup_code for TkUnknownChar. - * Fix crash in RDoc::Parser::C when aliasing methods with Regexp special - characters. - * Fix crash when various operators are used as a name as in - alias * compose. - * Fix warning with some dynamic use of attr_* - * Methods added to true, false and nil are now documented. - * Remove warning for methods defined on globals. - -== 2.5.11 / 2010-08-20 - -* Minor Enhancements - * Alias comments are now discovered by the C parser. Reported by Jeremy - Evans. - * Removed --all option which is unused in RDoc. Use the nodoc or - stopdoc/startdoc directives to suppress documentation instead. - -== 2.5.10 / 2010-08-17 - -* Minor Enhancements - * Support rb_singleton_class(). Reported by Jeremy Evans. - * Support rb_define_private_method() on rb_singleton_class(). Reported by - Jeremy Evans. - -* Bug Fixes - * Treat non-ASCII RDoc files as text. Bug #28391 by Kouhei Sutou. - * Fix potential test failures due to ivar collision. Bug #28390 by Kouhei - Sutou. - * Added duck-typed #aref for RDoc::Attr to RDoc::AnyMethod. Bug #28375 by - Erik Hollensbe - * Fixed method references in HTML output when show_hash is false. - * Fixed comments with '.' in call-seq in C sources. Reported by Jeremy - Evans. - * RDoc now understands singleton aliases. Reported by Jeremy Evans. - -== 2.5.9 / 2010-07-06 - -* Bug Fixes - * Look up pager correctly. - * Fixed handling of bullets in verbatim sections. Partial patch by - Juha-Jarmo Heinonen. - -== 2.5.8 / 2010-04-27 - -*NOTE*: - -RDoc 2.5 did not save method parameters, so you should upgrade your rdoc-data -gem to a version >= 2.5.3. - -To have ri data for core and stdlib you'll need to: - - gem install rdoc-data - -then run: - - rdoc-data --install - -To have ri data for you gems you'll also need to run: - - gem rdoc --all --overwrite - -If you don't want to rebuild the rdoc for `gem server`, add --no-rdoc. - -* Bug Fixes - * ri no longer complains about nonexistent pagers. - * Fixed failing test - -== 2.5.7 / 2010-04-22 - -* Minor Enhancements - * Unrecognized RDoc directives can now be registered by a plugin for - handling. See RDoc::Markup::PreProcess. - * Added RDoc::Markup::Raw to allow other markup engines to dump raw content - into RDoc. -* Bug Fixes - * rdoc -p no longer means --pipe if files are also given. - * RDoc now knows about BasicObject by default. Ruby Bug #1318 by Ambrus Zsbán - -== 2.5.6 / 2010-04-22 - -* Minor Enhancements - * Unrecognized RDoc directives are added as metadata to the object they get - attached to. - - ## - # :my_new_directive: my cool value - - Results in a 'my_new_directive' metadata key with value 'my cool value' on - the RDoc::CodeObject it is for -* Bug Fixes - * RDoc no longer prints out "invalid options:" when there were no invalid - options. - * Fixed link size on Darkfish file pages - -== 2.5.5 / 2010-04-19 - -* 1 Minor Enhancement - * Use #binread in RDoc::Markup::PreProcess. Patch from ruby trunk. -* 3 Bug Fixes - * Fixed indentation of method-description lists in Darkfish. Bug #28081 by - Theresa Dwinnell. - * Fixed loading RDoc::AnyMethod aliases to no longer infinitely loop. Bug - #28107 by Sven Riedel - * Fixed handling of ignored invalid options to continue after the invalid - option. - -== 2.5.4 / 2010-04-18 - -* 2 Minor Enhancements - * Methods will now be cross-referenced when preceded with ::. Ruby Bug - #3169 by Marc-Andre Lafortune. - * Methods now have human readable fragment identifiers for HTML output. - (#method-i-gsub vs #M000005). Ruby Bug #3023 by Marc-Andre Lafortune. -* 1 Bug Fixes - * RDoc::Parser::Ruby now handles while begin a; b end # .... - Ruby Bug #3160 by Yusuke Endoh. - -== 2.5.3 / 2010-04-10 - -* 1 Minor Enhancement - * RDoc::Parser::Simple and the include directive remove coding: comment from - first line -* 2 Bug Fixes - * Fixed loading of created.rid when regenerating documentation. Ruby bug - #3121 by Yusuke Endoh. - * Compare times as Integers as created.rid doesn't store fractional times. - -== 2.5.2 / 2010-04-09 - -* 1 Minor Enhancement - * Imported various changes by Nobu from ruby trunk. -* 2 Bug Fixes - * RDoc parses files without extensions as text files again. - * RDoc::Parser::Ruby parses %{ strings correctly again. - -== 2.5.1 / 2010-04-06 - -* 1 Minor Enhancement - * RDoc::Parser::C now supports the include directive for classes and - modules. -* 6 Bug Fixes - * RDoc::AnyMethod params now get saved in ri data. - * ri now displays method arguments correctly. - * RDoc::Markup::Parser allows no space between = and header text like rdoc - 2.4 and earlier. - * RDoc::Parser::C's "in" directive now looks in the current directory. - * RDoc::Task's rerdoc task no longer deletes the doc directory twice. - * rdoc --force-update now works correctly. Patch by Nobu Nokada - -== 2.5 / 2010-03-31 - -* 9 Major Enhancements - * Darkfish now has a "Home" button - * ri no longer displays the value of a constant. There's no easy way to - make them presentable. Use irb or ruby -e instead. Ruby Bug #549. - * New ri data format now uses Marshal and pre-builds caches - * No support for old ri data format, too hard to maintain - * To upgrade your core ri documentation, install the rdoc-data gem and run - rdoc-data - * RDoc now displays how well you've documented your library - * New recursive-descent parser for RDoc::Markup. See RDoc::Markup::Parser - * Updated ruby_lex and ruby_token - * Removed threading support, RDoc is not thread-safe - * Removed many unsupported options to rdoc - * Future versions of RDoc will not support Ruby 1.8.6. Bugs filed for - 1.8.6-only issues will be (largely) rejected. - -* 17 Minor Enhancements - * Source Parsing - * RDoc now supports module aliasing via constant assignment. - * RDoc now tracks superclasses correctly. Fixes File < IO for core docs. - * RDoc now ignores methods inside methods. - * RDoc now ignores Marshal and other binray files. - * Removed "Skipping require of dynamic string" warning. - * C parser now handles Document-method better. Bug #27329. - * API enhancements for writing parsers like the Ruby parser, see - RDoc::Parser::RubyTools - * ri - * Uses pager over less and more for Debian. Ruby Bug #1171. - * ri will use the RI_PAGER environment variable to find a pager. - * ri data generator now supports SIGINFO (^T) - * When rdoc is in debug mode, ^C now prints a backtrace - * RDoc::Markup::AttributeManager no longer uses global state. - * RDoc::RDoc no longer passes around options. Patch #27167. - * Darkfish won't generate a file if its template is missing. Patch #25857. - * Improved some wording for the RDoc main page. Patch #27264, #27268. - * Removed diagram generation support (to return in the future). - * Removed external support for RDoc::Task. - -* 12 Bug Fixes - * The :attr: directives now use the name given to create an attribute. See - RDoc::Parser::Ruby#parse_meta_attr. - * Fix crossrefs on paths with '-'. Ruby Bug #883. - * Fix ruby parser for alias with = in the name. Bug #27522. - * Images are no longer executable. Bug #27156. - * --op is no longer overridden by --ri. Bug #27054. - * :method: now works when at the end of a class. Bug #26910. - * Preserve ellipsis from call-seq in Darkfish. Patch #26974. - * Emacs-style coding: is handled properly. Patch #27388. - * RDoc::RubyLex now parses UTF-8 identifiers. Bug #26946, #26947. - * Fixed namespace lookup rules. Bug #26161. - * Worked around bug in Selenium where they hide a .jar in a .txt file. - Filed Selenium bug #27789. - * Alias comments are no longer hidden. Reported by Adam Avilla. - -== 2.4.3 / 2009-04-01 - -* 2 Bug Fixes - * Corrected patch for file links - * Corrected display of file popup - -== 2.4.2 / 2009-03-25 - -* 2 Minor Enhancements - * Added --pipe for turning RDoc on stdin into HTML - * Added rdoc/task.rb containing a replacement for rake/rdoctask.rb. Use - RDoc::Task now instead of Rake::RDocTask. - -* 10 Bug Fixes - * Writing the ri cache file to the proper directory. Bug #24459 by Lars - Christensen. - * Possible fix for Dir::[] and Pathname interaction on 1.9. Bug #24650 by - tiburon. - * Fixed scanning constants for if/end, etc. pairs. Bug #24609 by Ryan - Davis. - * Fixed private methods in the C parser. Bug #24599 by Aaron Patterson. - * Fixed display of markup on RDoc main page. Bug #24168 by rhubarb. - * Fixed display of \\ character in documentation proceeding words. - Bug #22112 by James Gray. See RDoc for details. - * Fixed parsing and display of arg params for some corner cases. Bug #21113 - by Csiszár Attila. - * Fixed links in Files box. Patch #24403 by Eric Wong. - * Toplevel methods now appear in Object. Bug #22677 by Ryan Davis. - * Added back --promiscuous which didn't do anything you cared about. Why - did you enable it? Nobody looked at that page! Oh, it warns, too. - -== 2.4.1 / 2009-02-26 - -* 1 Minor Enhancements - * Added :attr:, :attr_reader:, :attr_writer:, :attr_accessor: directives. - Replaces --accessor. See RDoc::Parser::Ruby for details. - -* 3 Bug Fixes - * Don't complain when exiting normally. Bug by Matt Neuburg. - * Restore --inline-source that warns - * Fixed links to files in Darkfish output - -== 2.4.0 / 2009-02-24 - -* 9 Minor Enhancements - * `ri -f html` is now XHTML-happy - * Clarified RDoc::Markup link syntax. Bug #23517 by Eric Armstrong. - * Number of threads to parse with is now configurable - * Darkfish can now use alternate templates from $LOAD_PATH via -T - * Removed F95 parser in favor of the rdoc-f95 gem - * Moved HTML and XML generators to unmaintained - * No gem will be provided as it's too difficult to make them work - * Removed options --one-file, --style=, --inline-source, --promiscuous, - --op-name - * Removed support for --accessor, use regular documentation or - the method directive instead. See RDoc::Parser::Ruby - * Removed --ri-system as it is unused by Ruby's makefiles - * Added method list to index.html - -* 6 Bug Fixes - * A class marked nodoc no longer appears in the index. Bug #23751 by - Clifford Heath. - * Fix 1.9 compatibility issues. Bug #23815 by paddor. - * Darkfish now respects --charset - * RDoc no longer attempts to be lazy when building HTML. This is a - workaround. Bug #23893 by Stefano Crocco. - * RDoc doesn't crash with def (blah).foo() end - * RDoc doesn't crash with #define functions - -== 2.3.0 / 2009-01-28 - -* 3 Major Enhancements - * Michael Granger's Darkfish generator is now the default for HTML output - * Various rdoc generation speedups by Hongli Lai. Patches #22555, #22556, - #22557, #22562, #22565. - * rdoc/discover.rb files are loaded automatically from installed gems - -* 8 Minor Enhancements - * Added a space after the commas in ri class method lists. RubyForge - enhancement #22182. - * Improved ri --interactive - * Generators can now override generated file locations - * Moved unmaintained CHM generator to it's own package - * Moved unmaintained extra HTML templates to their own package - * Removed experimental texinfo generator - * Converted to minitest - * Known classes and modules list outputs once per line now for grep - -* 11 Bug Fixes - * Fix missing superclass in ri output - * Fix an RDoc crash when told to parse an empty file - * Ignore nonexistent files instead of crashing - * .txt and .rdoc files are always considered text. Patch #22897 by Aaron - Patterson. - * When merging ri data with a nonexistent directory, RDoc no longer crashes - * Fix visibility of methods in XML output. Issue by Yehuda Katz. - * Fixed relative link generation - * Fix crash, RDoc now ignores comments above local variable assignments in - modules - * RDoc now only accepts adjacent comments for rb_define_module and - rb_define_class - * C file RDoc is no longer included in token stream - * Scan all gem paths to match gem name for ri output - -== 2.2.1 / 2008-09-24 -This version provides some minor fixes and enhancements to 2.2.0 intended -to polish RDoc for Ruby 1.9.1. - -* 3 Minor Enhancements - * Support for parsing RDoc from SWIG. Ruby patch #10742 by Gonzalo - Garramuno, #13993 by Steven Jenkins. - * Simple support for Perl POD documentation. Patch by Hugh Sasse. - * Changed the default character set of RDoc's output from iso-8859-1 to - utf-8. - -* 9 Bug Fixes - * Explicitly set the html template's text color, so that the generated - documentation will display correctly on browsers with custom text and - background color settings (patch by Luther Thompson). - * Ensure that RDoc correctly will associate an alias and a method, even - if it encounters the alias first because the alias lives in a different - file. - * Fix the parsing of multiline constants (patch by Chris Alfeld and - Joel VanderWerf) - * Make --exclude usuable. Ruby patch #11671 by Trans. - * Detect inline C functions. Ruby Bug #11993 by Florian Frank. - * Fix an issue in which RDoc might not document a class' - superclass correctly if the class was defined in multiple files and - depending on the order in which RDoc processed the files. This should - ensure that the child class -> parent class relationship is correct in - ri documentation, allowing ri to lookup inherited methods (i.e., File.read). - * Stop ri from crashing when it looks for a completely bogus method (i.e., - File#reada). Now, ri exits with a helpful error message. - * Fixed missing display of constant values in ri. - * Fixed display of constants in ri's html output. - -== 2.2.0 / 2008-09-19 -This version includes some significant enhancements to ri. See RI.txt for -documentation about ri. - -* 5 Major Enhancements - * More extensive unit tests (special thanks to Chris Lowis for contributing - a test). - * Made ri twice as fast for the most common use case of displaying - information for a class or a fully-qualified method - (i.e., ri Array#flatten, after ri has created a cache the first time that - it runs). - * Made ri many times faster when searching for an unqualified method (i.e., - ri read, again after the first such search has populated ri's cache) - * Changed ri to do regular expression searches for unqualified methods; - now, a regular expression for a method can be passed to ri on the - command-line. - * Added an interactive mode to ri (patch by Daniel Choi). Now, when ri - is given a -i argument, it will allow the user to disambiguate - unqualified methods if more than one is present and also will allow a - user to get information for a class' method. - -* 8 Minor Enhancements - * RDoc now adds the package title to the web pages that it generates - for files and classes/modules, which helps them appear better in - search engine results. - * RDoc now automatically generates cross-reference links for classes and - methods specified relative to the global namespace (i.e., ::A::B::C#method). - * All built-in templates now output valid, strict XHTML. - * The documentation is slightly better organized (the markup details were - merged into the RDoc module's documentation). - * Improved rdoc's HTML generation speed by about 20% (on Windows, the - boost seems larger). - * Provided an ri command-line option to control its caching behavior. - * Improved RDoc's documentation. Added RI.txt to document ri. - * Allow HTML templates distributed as gems to be loaded with the -T option, - just like the standard templates in rdoc/generator/html (so an HTML - template lib/new_template.rb in a gem can be used with rdoc -T new_template) - -* 25 Bug fixes: - * Fixed prototype detection in C parser. Can process ruby 1.8 C files - again. - * Fixed the main page for frameless template. Patch by Marcin Raczkowski. - * Fixed the main page for frame templates. Now, if no main page is - specified, RDoc will default to the README. - * Fixed missing stylesheet in generated chm. Patch by Gordon Thiesfeld. - * Fixed the parsing of module names starting with '::'. Patch by - Giuseppe Bilotta. - * Fixed a case where RDoc first would encounter Foo::Bar and then would - encounter class Foo. Previously, RDoc erroneously would have considered - that both a Foo class and a Foo module existed. - * Fix a class where RDoc would not generate correct cross-reference links - to a class contained within a module of the same name (i.e. RDoc::RDoc) - * Prevented RDoc from trying to parse binary files, which would produce - garbage output. - * RDoc now correctly converts ' characters to apostrophes, opening single - quotes, and closing single quotes in most cases (smart single quotes). - * RDoc now correctly converts " characters to opening double quotes and - and closing double quotes in most cases (smart double quotes). - * (c) correctly is converted into the copyright symbol. - * '&' characters in text now correctly are translated to HTML character codes. - * Fixed missing stylesheet in generated chm. Patch by Gordon Thiesfeld. - * Fixed broken method links in the built-in templates. - * RDoc properly links to files and classes in the one page HTML template. - * The kilmer and hefss templates properly syntax highlight when inlining - source code. - * The kilmer and hefss template class pages properly display methods again. - * Fixed broken class, file, and method links in the frameless template. - * Fixed the clipping of source code in the html and frameless templates when - the source code cannot fit into the window; a scrollbar now will allow - all of the source code to be viewed. - * Fixed the missing constant descriptions in the html and frameless - templates. - * Fixed the ri command-line options that customize the directories to be - searched for documentation. - * Fixed the XML generator. Patch by Anthony Durity. - * Stopped the XML template from generating invalid XML due to malformed - embedded ruby. - * Adding missing information about a class' constants to the XML template. - * Fixed the horizontal rule markup (---) so that it correctly adds a - horizontal rule rather than suppressing all text that follows. - -== 2.1.0 / 2008-07-20 - -* 3 Major Enhancements: - * RDoc now knows about meta-programmed methods, see RDoc::Parser::Ruby - * Reorganized parsers under RDoc::Parser base class - * ri now walks the ancestors of a class looking for a method e.g. ri - File#read displays documentation for IO#read (may require regeneration of - ri data) -* 5 Minor Enhancements: - * Allow links to files - * Default options now taken from RDOCOPT environment variable - * Class method documentation can be found at toplevel now (def X.foo) - * Allow HTML templates distributed as gems to be loaded with the -T option, - just like the standard templates in rdoc/generator/html (so an HTML - template lib/new_template.rb in a gem can be used with rdoc -T new_template) - * `rdoc -v` prints out files, classes, modules and methods as it goes -* 11 Bug Fixes: - * `ri Foo.bar` now looks for class methods also - * Sections work in the default template again - * Doesn't warn about :foo:: list item being an unrecognized directive - * RDoc no longer converts characters inside tt tags - * Fixed "uninitialized constant RDoc::Markup::ToHtml::HTML" - * Fixed generation of relative links - * Fixed various diagram generation issues - * Fixed templates broken by switch to erb - * Fixed issue with style comments - * Lowercase words are no longer rdoc'd as methods without leading #, as - described in the documentation - * RDoc now correctly sets superclasses if they were originally unknown - -== 2.0.0 / 2008-04-10 - -* 3 Major Enhancements: - * Renamespaced everything RDoc under the RDoc module. - * New `ri` implementation. - * Reads from a cache in ~/.ri/ for enhanced speed. - * RubyGems aware, only searches latest gem versions. - * Now up to over 100 tests and 200 assertions. -* 4 Minor Enhancements: - * Switched to an ERb-based TemplatePage, see RDoc::TemplatePage. - * Class/module ri now displays attribute and constant comments. - * Cross-references can be disabled with a leading \. - * Relaxed parsing for some RDoc inline markup. diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/LEGAL.rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/LEGAL.rdoc deleted file mode 100644 index dae1059..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/LEGAL.rdoc +++ /dev/null @@ -1,50 +0,0 @@ -# coding: UTF-8 - -= Legal Notice Information - -The files in this distribution are covered by the Ruby license (see LICENSE) except the features mentioned below: - -Darkfish:: - Darkfish was written by Michael Granger and is included under the BSD 3-Clause - license. Darkfish contains images from the Silk Icons set by Mark James. - - See lib/rdoc/generator/darkfish.rb for license information. - - * lib/rdoc/generator/darkfish.rb - * lib/rdoc/generator/template/darkfish/* - * lib/rdoc/generator/template/darkfish/images - -SDoc:: - Portions of SDoc by (Володя Колесников) Vladimir Kolesnikov are included - under the MIT license as RDoc::Generator::JsonIndex. See - lib/rdoc/generator/json_index.rb for license information. - - * lib/rdoc/generator/json_index.rb - * lib/rdoc/generator/template/json_index/* - * The +#search_index+ methods on RDoc::CodeObject subclasses were derived - from sdoc. - * RDoc::ClassModule#document_self_or_methods comes from SDoc. - -peg-markdown:: - RDoc's Markdown support is derived from peg-markdown by John MacFarlane. It - is used under the MIT license. See RDoc::Markdown for license details. - -MarkdownTest:: - test/test_rdoc_markdown_test.rb uses MarkdownTest 1.0.3's source files which - are included as test/MarkdownTest_1.0.3/*.text which are Copyright (c) - 2004-2005 John Gruber http://daringfireball.net and is included under the - same terms as Perl itself. - - See http://dev.perl.org/licenses/ for the terms of the Perl license. - -Fonts:: - Source Code Pro is (c) 2010, 2012 Adobe Systems Incorporated. - - Lato is (c) 2010 Łukasz Dziedzic. - - Both fonts are used under the SIL Open Font License, Version 1.1. The - license is available at http://scripts.sil.org/OFL - - See lib/rdoc/generator/template/darkfish/fonts.css for complete copyright - and license information, including a copy of the OFL. - diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/LICENSE.rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/LICENSE.rdoc deleted file mode 100644 index c61bb93..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/LICENSE.rdoc +++ /dev/null @@ -1,59 +0,0 @@ -= License - -RDoc is copyrighted free software. - -You can redistribute it and/or modify it under either the terms of the GPL -version 2 (see the file GPL), or the conditions below: - -1. You may make and give away verbatim copies of the source form of the - software without restriction, provided that you duplicate all of the - original copyright notices and associated disclaimers. - -2. You may modify your copy of the software in any way, provided that - you do at least ONE of the following: - - a. place your modifications in the Public Domain or otherwise - make them Freely Available, such as by posting said - modifications to Usenet or an equivalent medium, or by allowing - the author to include your modifications in the software. - - b. use the modified software only within your corporation or - organization. - - c. give non-standard binaries non-standard names, with - instructions on where to get the original software distribution. - - d. make other distribution arrangements with the author. - -3. You may distribute the software in object code or binary form, - provided that you do at least ONE of the following: - - a. distribute the binaries and library files of the software, - together with instructions (in the manual page or equivalent) - on where to get the original distribution. - - b. accompany the distribution with the machine-readable source of - the software. - - c. give non-standard binaries non-standard names, with - instructions on where to get the original software distribution. - - d. make other distribution arrangements with the author. - -4. You may modify and include the part of the software into any other - software (possibly commercial). But some files in the distribution - are not written by the author, so that they are not under these terms. - - For the list of those files and their copying conditions, see the - file LEGAL. - -5. The scripts and library files supplied as input to or produced as - output from the software do not automatically fall under the - copyright of the software, but belong to whomever generated them, - and may be sold commercially, and may be aggregated with this - software. - -6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE. diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/README.rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/README.rdoc deleted file mode 100644 index c4b60b2..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/README.rdoc +++ /dev/null @@ -1,144 +0,0 @@ -= \RDoc - Ruby Documentation System - -home :: https://github.com/ruby/rdoc -rdoc :: https://ruby.github.io/rdoc -bugs :: https://github.com/ruby/rdoc/issues -code quality :: https://codeclimate.com/github/ruby/rdoc - -== Description - -RDoc produces HTML and command-line documentation for Ruby projects. RDoc -includes the +rdoc+ and +ri+ tools for generating and displaying documentation -from the command-line. - -== Generating Documentation - -Once installed, you can create documentation using the +rdoc+ command - - $ rdoc [options] [names...] - -For an up-to-date option summary, type - - $ rdoc --help - -A typical use might be to generate documentation for a package of Ruby -source (such as RDoc itself). - - $ rdoc - -This command generates documentation for all the Ruby and C source -files in and below the current directory. These will be stored in a -documentation tree starting in the subdirectory +doc+. - -You can make this slightly more useful for your readers by having the -index page contain the documentation for the primary file. In our -case, we could type - - % rdoc --main README.rdoc - -You'll find information on the various formatting tricks you can use -in comment blocks in the documentation this generates. - -RDoc uses file extensions to determine how to process each file. File names -ending +.rb+ and +.rbw+ are assumed to be Ruby source. Files -ending +.c+ are parsed as C files. All other files are assumed to -contain just Markup-style markup (with or without leading '#' comment -markers). If directory names are passed to RDoc, they are scanned -recursively for C and Ruby source files only. - -To generate documentation using +rake+ see RDoc::Task[https://ruby.github.io/rdoc/RDoc/Task.html]. - -To generate documentation programmatically: - - gem 'rdoc' - require 'rdoc/rdoc' - - options = RDoc::Options.new - options.files = ['a.rb', 'b.rb'] - options.setup_generator 'darkfish' - # see RDoc::Options - - rdoc = RDoc::RDoc.new - rdoc.document options - # see RDoc::RDoc - -You can specify the target files for document generation with +.document+ file in the project root directory. -+.document+ file contains a list of file and directory names including comment lines starting with '#'. -See https://github.com/ruby/rdoc/blob/master/.document as an example. - -== Writing Documentation - -To write documentation for RDoc place a comment above the class, module, -method, constant, or attribute you want documented: - - ## - # This class represents an arbitrary shape by a series of points. - - class Shape - - ## - # Creates a new shape described by a +polyline+. - # - # If the +polyline+ does not end at the same point it started at the - # first pointed is copied and placed at the end of the line. - # - # An ArgumentError is raised if the line crosses itself, but shapes may - # be concave. - - def initialize polyline - # ... - end - - end - -The default comment markup format is the RDoc::Markup format. -TomDoc[rdoc-ref:RDoc::TomDoc], Markdown[rdoc-ref:RDoc::Markdown] and -RD[rdoc-ref:RDoc::RD] format comments are also supported. You can set the -default comment format for your entire project by creating a -.rdoc_options file. See RDoc::Options@Saved+Options for instructions -on creating one. You can also set the comment format for a single file -through the +:markup:+ directive, but this is only recommended if you wish to -switch markup formats. See RDoc::Markup@Other+directives. - -Comments can contain directives that tell RDoc information that it cannot -otherwise discover through parsing. See RDoc::Markup@Directives to control -what is or is not documented, to define method arguments or to break up -methods in a class by topic. See RDoc::Parser::Ruby for directives used to -teach RDoc about metaprogrammed methods. - -See RDoc::Parser::C for documenting C extensions with RDoc. - -To determine how well your project is documented run rdoc -C lib to -get a documentation coverage report. rdoc -C1 lib includes parameter -names in the documentation coverage report. - -== Theme Options - -There are a few community-maintained themes for \RDoc: - -- rorvswild-theme-rdoc[https://github.com/BaseSecrete/rorvswild-theme-rdoc] -- hanna[https://github.com/jeremyevans/hanna] (a fork maintained by {Jeremy Evans}[https://github.com/jeremyevans]) - -Please follow the theme's README for usage instructions. - -== Bugs - -See CONTRIBUTING.rdoc for information on filing a bug report. It's OK to file -a bug report for anything you're having a problem with. If you can't figure -out how to make RDoc produce the output you like that is probably a -documentation bug. - -== License - -RDoc is Copyright (c) 2001-2003 Dave Thomas, The Pragmatic Programmers. -Portions (c) 2007-2011 Eric Hodel. Portions copyright others, see individual -files and LEGAL.rdoc for details. - -RDoc is free software, and may be redistributed under the terms specified in -LICENSE.rdoc. - -== Warranty - -This software is provided "as is" and without any express or implied -warranties, including, without limitation, the implied warranties of -merchantability and fitness for a particular purpose. diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/RI.md b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/RI.md deleted file mode 100644 index 45addac..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/RI.md +++ /dev/null @@ -1,842 +0,0 @@ -# `ri`: Ruby Information - -`ri` (ruby information) is the Ruby command-line utility -that gives fast and easy on-line access to Ruby documentation. - -`ri` can show documentation for Ruby itself and for its installed gems: - -- A **class** or **module**: - text associated with the class or module definition - in a source file (`.rb` or `.c`). -- One or more **methods**: - text associated with method definitions - in source files (`.rb` and `.c`). -- A **page**: - text from a stand-alone documentation file - (`.rdoc` or `.md`, or sometimes other). - -Examples (output omitted): - -```sh -$ ri Hash # Document for class Hash. -$ ri Array#sort # Document for instance method sort in class Array. -$ ri read # Documents for methods ::read and #read in all classes and modules. -$ ri ruby:dig_methods # Document for page dig_methods. -``` - -`ri` can also show lists of: - -- **classes** and **modules**: - full or partial list. -- **pages**: - for Ruby or for an installed gem. - -Examples (output omitted): - -```sh -$ ri --list # List of classes and modules. -$ ri ruby: # List of Ruby pages. -``` - -## Why `ri`? - -Using `ri` may have advantages over using -the [Ruby online documentation](https://docs.ruby-lang.org/en/master): - -- The `ri` documentation is always available, even when you do not have internet access - (think: airplane mode). -- If you are working in a terminal window, typing `ri _whatever_` (or just `ri`) - may be faster than navigating to a browser window and searching for documentation. -- If you are working in an - [irb \(interactive Ruby\)](https://docs.ruby-lang.org/en/master/IRB.html) - session, you _already_ have immediate access to `ri`: - just type `'show_doc'`. - -## Modes - -There are two `ri` modes: - -- Static mode: - In general, `ri` responds in its static mode - if a _name_ is given; - it shows results and exits (as in the examples above). - See [Static Mode][1]. -- Interactive mode: - In general, `ri` enters its interactive mode - if no _name_ is given; - in interactive mode, `ri` shows results and waits for another command: - - ```sh - $ ri - Enter the method name you want to look up. - You can use tab to autocomplete. - Enter a blank line to exit. - >> - ``` - - See [Interactive Mode][2]. - -## Names - -In both modes, static and interactive, -`ri` responds to an input _name_ that specifies what is to be displayed: -a document, multiple documents, or other information: - -- Static mode (in the shell): type `'ri _name_'`; - examples (output omitted): - - ```sh - $ ri File - $ ri IO#readlines - $ ri ruby: - ``` - -- Interactive mode (already in `ri`): just type the _name_; - examples (output omitted): - - ```sh - $ ri - Enter the method name you want to look up. - You can use tab to autocomplete. - Enter a blank line to exit. - >> File - >> IO#readlines - >> ruby: - ``` - -### Names for Class and Module Documents - -These example `ri` commands cite names for class and module documents -(see [details and examples][3]): - -| Command | Shows | -|------------------------------|------------------------------------------------------------| -| ri File | Document for Ruby class File. | -| ri File::Stat | Document for Ruby nested class File::Stat. | -| ri Enumerable | Document for Ruby module Enumerable. | -| ri Arr | Document for Ruby class Array (unique initial characters). | -| ri Nokogiri::HTML4::Document | Document for gem class Nokogiri::HTML4::Document. | -| ri Nokogiri | Document for gem module Nokogiri. | -
- -If [option \\--all][4] -is in effect, documents for the methods in the named class or module -are included in the display. - -### Names for Method Documents - -These example `ri` commands cite names for method documents -(see [details and examples][5]): - -| Command | Shows | -|--------------------------------------|----------------------------------------------------------------------------------| -| ri IO::readlines | Document for Ruby class method IO::readlines. | -| ri IO#readlines | Document for Ruby instance method IO::readlines. | -| ri IO.readlines | Documents for Ruby instance method IO::readlines and class method IO::readlines. | -| ri ::readlines | Documents for all class methods ::readlines. | -| ri #readlines | Documents for all instance methods #readlines. | -| ri .readlines, ri readlines | Documents for class methods ::readlines and instance methods #readlines. | -| ri Nokogiri::HTML4::Document::parse | Document for gem class method Nokogiri::HTML4::Document::parse. | -| ri Nokogiri::HTML4::Document#fragment | Document for gem instance method Nokogiri::HTML4::Document#fragment. | -
- -### Names for Page Documents - -These example `ri` commands cite names for page documents -(see [details and examples][6]): - -| Command | Shows | -|--------------------------------|--------------------------------------------------| -| ri ruby:syntax/assignment.rdoc | Document for Ruby page assignment. | -| ri ruby:syntax/assignment | Same document, if no other syntax/assignment.*. | -| ri ruby:assignment | Same document, if no other */assignment.*. | -| ri nokogiri:README.md | Document for page README.md. | -
- -### Names for Lists - -These example `ri` commands cite names for lists -(see [details and examples][7]): - -| Command | Shows | -|---------------|-------------------------| -| ri ruby: | List of Ruby pages. | -| ri nokogiri: | List of Nokogiri pages. | -
- -There are more lists available; -see [option \\--list][8]. - -## Pro Tips - -### `ri` at the Ready - -If you are a frequent `ri` user, -you can save time by keeping open a dedicated command window -with either of: - -- A running [interactive ri][2] session. -- A running [irb session][9]; - type `'show_doc'` to enter `ri`, newline to exit. - -When you switch to that window, `ri` is ready to respond quickly, -without the performance overhead of re-reading `ri` sources. - -### Output Filters - -The `pager` value actually need not be simply the path to an executable; -it's actually a full-fledged command line, -and so may include not only the executable path, -but also whatever options and arguments that executable accepts. - -You can, for example, set the pager value to `'grep . | less'`, -which will exclude blank lines (thus saving screen space) -before piping the result to `less`; -example (output omitted): - -```sh -$ RI_PAGER="grep . | less" ri Array -``` - -See the documentation for your chosen pager programs -(e.g, type `'grep --help'`, `'less --help'`). - -### Links in `ri` Output - -#### Implicit Link - -When you see: - -- `'IO::readlines'`, `'IO#readlines'`, `'IO.readlines'`: - use that same text as the _name_ in an `ri` command. - - Examples (output omitted): - - ```sh - $ ri IO::readlines - $ ri IO#readlines - $ ri IO.readlines - ``` - -- `'#read'`, `'::read'`, `'.read'`: - you're likely already in the `ri` document for a class or module, - or for a method in a class or module; - use that same text with the name of the class or module (such as `'File'`) - as the _name_ in an `ri` command. - - Examples (output omitted): - - ```sh - $ ri File::read - $ ri File#read - $ ri File.read - ``` - -#### Explicit Link - -When you see: - -- `'{Dig Methods}[rdoc-ref:doc/dig_methods.rdoc]'`: - use the trailing part of the `'[rdoc-ref:doc/'` in an `ri` command - for a Ruby document. - - Example (output omitted): - - ```sh - $ ri ruby:dig_methods.rdoc - ``` - -- `'{Table (information)}[https://en.wikipedia.org/wiki/Table_(information)]'`: - go to the given URL in your browser. - -## About the Examples - -- `ri` output can be large; - to save space, an example may pipe it to one of these: - - - [head](https://www.man7.org/linux/man-pages/man1/head.1.html): leading lines only. - - [tail](https://www.man7.org/linux/man-pages/man1/tail.1.html): trailing lines only. - - [wc -l](https://www.man7.org/linux/man-pages/man1/wc.1.html): line count only. - - [grep](https://www.man7.org/linux/man-pages/man1/grep.1.html): selected lines only. - -- An example that involves a gem assumes that gems `nokogiri` and `minitest` are installed. - -## `ri` Documents - -This section outlines what you can expect to find -in the `ri` document for a class, module, method, or page. - -See also: - -- [Pager][10]. -- [Links in ri Output][11]. - -### Class and Module Documents - -The document for a class or module shows: - -- The class or module name, along with its parent class if any. -- Where it's defined (Ruby core or gem). -- When each exists: - - - The names of its included modules. - - The text of its embedded documentation. - - Its constants. - - Its class methods. - - Its instance methods. - -Examples: - -- Ruby class `Array`: - - ```sh - $ ri Array | head - = Array < Object - - ------------------------------------------------------------------------ - = Includes: - Enumerable (from ruby core) - - (from ruby core) - ------------------------------------------------------------------------ - An Array is an ordered, integer-indexed collection of objects, called - elements. Any object may be an Array element. - ``` - -- Gem module `Nokogiri`: - - ```sh - $ ri Nokogiri | head - = Nokogiri - - (from gem nokogiri-1.16.2-x86_64-linux) - ------------------------------------------------------------------------ - - Nokogiri parses and searches XML/HTML very quickly, and also has - correctly implemented CSS3 selector support as well as XPath 1.0 - support. - - Parsing a document returns either a Nokogiri::XML::Document, or a - ``` - -The document typically includes certain headings, -which may be useful for searching: - -```sh -$ ri IO | grep "^= " -= IO < Object -= Includes: -= Constants: -= Class methods: -= Instance methods: -``` - -### Method Documents - -The document for a method includes: - -- The source of the method: `'(from ruby core)'` or `'(from gem _gem_)'`. -- The calling sequence(s) for the method. -- The text of its embedded documentation (if it exists). - -Examples: - -```sh -$ ri IO#read | head -= IO#read - -(from ruby core) ------------------------------------------------------------------------- -ios.read([length [, outbuf]]) -> string, outbuf, or nil - ------------------------------------------------------------------------- - -Reads length bytes from the I/O stream. -``` - -```sh -$ ri Nokogiri::parse | head -= Nokogiri::parse - -(from gem nokogiri-1.16.2-x86_64-linux) ------------------------------------------------------------------------- - parse(string, url = nil, encoding = nil, options = nil) { |doc| ... } - ------------------------------------------------------------------------- - -Parse an HTML or XML document. string contains the document. -``` - -The output for a _name_ that cites methods includes the document -for each found implementation; -the number of such implementations depends on the _name_: - -- Within a class: - - Each of these commands shows documents - for methods in Ruby class `IO` (output omitted): - - ```sh - $ ri IO::readlines # Class method ::readlines. - $ ri IO#readlines # Instance method #readlines. - $ ri IO.readlines # Both of above. - ``` - -- In all classes: - - Each of these commands shows documents - for methods in all classes (output omitted): - - ```sh - $ ri ::readlines # Class method ::readlines. - $ ri \#readlines # Instance method #readlines. - $ ri .readlines # Both of above. - ``` - - For these all-classes commands, - the output is organized into sections, - one for each found method (output filtered to show sections): - - ```sh - $ ri ::readlines | grep "= Implementation" - === Implementation from CSV - === Implementation from IO - ``` - - ```sh - $ ri \#readlines | grep "= Implementation" - === Implementation from ARGF - === Implementation from CSV - === Implementation from IO - === Implementation from Kernel - === Implementation from Buffering - === Implementation from Pathname - === Implementation from StringIO - === Implementation from GzipReader - ``` - - ```sh - $ ri .readlines | grep "= Implementation" - === Implementation from ARGF - === Implementation from CSV - === Implementation from CSV - === Implementation from IO - === Implementation from IO - === Implementation from Kernel - === Implementation from Buffering - === Implementation from Pathname - === Implementation from StringIO - === Implementation from GzipReader - ``` - -### Page Documents - -The document for a Ruby page is the text from the `.rdoc` or `.md` source -for that page: - -```sh -$ ri ruby:dig_methods | head -= Dig Methods - -Ruby's dig methods are useful for accessing nested data structures. - -Consider this data: - item = { - id: "0001", - type: "donut", - name: "Cake", - ppu: 0.55, -``` - -The document for a gem page is whatever the gem has generated -for the page: - -```sh -$ ri minitest:README | head -= minitest/{test,spec,mock,benchmark} - -home: - https://github.com/minitest/minitest - -bugs: - https://github.com/minitest/minitest/issues - -rdoc: - https://docs.seattlerb.org/minitest -``` - -## `ri` Lists - -The list of Ruby pages is available via _name_ `'ruby:'`: - -```sh -$ ri ruby: | head -= Pages in ruby core - -CONTRIBUTING.md -COPYING -COPYING.ja -LEGAL -NEWS-1.8.7 -NEWS-1.9.1 -NEWS-1.9.2 -NEWS-1.9.3 -``` - -```sh -$ ri ruby: | tail -syntax/control_expressions.rdoc -syntax/exceptions.rdoc -syntax/literals.rdoc -syntax/methods.rdoc -syntax/miscellaneous.rdoc -syntax/modules_and_classes.rdoc -syntax/pattern_matching.rdoc -syntax/precedence.rdoc -syntax/refinements.rdoc -win32/README.win32 -``` - -The list of gem pages is available via _name_ `'_gem_name_'`: - -```sh -$ ri nokogiri: | head -= Pages in gem nokogiri-1.16.2-x86_64-linux - -README.md -lib/nokogiri/css/tokenizer.rex -``` - -See also: - -- [Option \\--list][8]: - lists classes and modules. -- [Option \\--list-doc-dirs][12]: - lists `ri` source directories. - -## `ri` Information - -With certain options, -an `ri` command may display information other than documents or lists: - -- [Option \\--help or -h][13]: - Shows `ri` help text. -- [option \\--version or -v][14]: - Shows `ri` version. -- [Option \\--dump=FILEPATH][15]: - Shows dump of `ri` cache file at the given filepath. - -## Static Mode - -In static mode, `ri` shows a response and exits. - -In general, `ri` responds in static mode -if the command gives a _name_: - -```sh -$ ri Array | head -= Array < Object - ------------------------------------------------------------------------- -= Includes: -Enumerable (from ruby core) - -(from ruby core) ------------------------------------------------------------------------- -An Array is an ordered, integer-indexed collection of objects, called -elements. Any object may be an Array element. -``` - -`ri` also responds in static mode when certain options are given, -even when no _name_ is given; -see [ri Information][16]. - -## Interactive Mode - -In general, `ri` responds to a command in interactive mode -if the command has no arguments: - -```sh -$ ri -Enter the method name you want to look up. -You can use tab to autocomplete. -Enter a blank line to exit. ->> - -``` - -A command in interactive mode are similar to one in static mode, -except that it: - -- Omits command word `ri`; you just type the _name_. -- Omits options; in interactive mode the only options in effect - are those taken from environment variable `RI`. - See [Options][17]. -- Supports tab auto-completion for the name of a class, module, or method; - when, for example, you type `"Arr\t"` (here `"\t` represents the tab character), - `ri` "completes" the text as `'Array '`. - -See also [ri at the Ready][18]. - -## Pager - -Because `ri` output is often large, -`ri` by default pipes it to a _pager_, -which is the program whose name is the first-found among: - -- The value of `ENV['RI_PAGER']`. -- The value of `ENV['PAGER']`. -- `'pager'`. -- `'less'`. -- `'more'`. - -If none is found, the output goes directly to `$stdout`, with no pager. - -If you set environment variable `RI_PAGER` or `PAGER`, -its value should be the name of an executable program -that will accept the `ri` output (such as `'pager'`, `'less'`, or `'more'`). - -See also [Output Filters][19]. - -## Options - -Options may be given on the `ri` command line; -those should be whitespace-separated, and must precede the given _name_, if any. - -Options may also be specified in environment variable `RI`; -those should also be whitespace-separated. - -An option specified in environment variable `RI` -may be overridden by an option on the `ri` command line: - -```sh -$ RI="--all" ri Array | wc -l -4224 -$ RI="--all" ri --no-all Array | wc -l -390 -``` - -### Source Directories Options - -#### Options `--doc-dir=DIRPATH`, `-d DIRPATH` - -Option `--doc-dir=DIRPATH` (aliased as `-d`) adds the given directory path -to the beginning of the array of `ri` source directory paths: - -```sh -$ ri --doc-dir=/tmp --list-doc-dirs | head -1 -/tmp -``` - -#### Options `--gems`, `--no-gems` - -Option `--gems` (the default) specifies that documents from installed gems -may be included; -option `--no-gems` may be used to exclude them: - -```sh -$ ri --list | wc -l -1417 -$ ri --list --no-gems| wc -l -1262 -``` - -#### Options `--home`, `--no-home` - -Option `--home` (the default) specifies that `ri` is to include source directory -in `~/.rdoc` if it exists; -option `--no-home` may be used to exclude them. - -#### Options `--list-doc-dirs`, `--no-list-doc-dirs` - -Option `--list-doc-dirs` specifies that a list of the `ri` source directories -is to be displayed; -default is `--no-list-doc-dirs`. - -#### Option `--no-standard` - -Option `--no-standard` specifies that documents from the standard libraries -are not to be included; -default is to include documents from the standard libraries. - -#### Options `--site`, `--no-site` - -Option `--site` (the default) specifies that documents from the site libraries -may be included; -option `--no-site` may be used to exclude them. - -#### Options `--system`, `--no-system` - -Option `--system` (the default) specifies that documents from the system libraries -may be included; -option `--no-system` may be used to exclude them. - -### Mode Options - -#### Options `--interactive`, `-i`, `--no-interactive` - -Option `--interactive` (aliased as `-i`) -specifies that `ri` is to enter interactive mode (ignoring the _name_ if given); -the option is the default when no _name_ is given; -option `--no-interactive` (the default) -specifies that `ri` is not to enter interactive mode, -regardless of whether _name_ is given. - -### Information Options - -#### Options `--help`, `-h` - -Option `--help` (aliased as `-h`) specifies that `ri` is to show -its help text and exit. - -#### Options `--version`, `-v` - -Option `--version` (aliased as `-v`) specifies that `ri` is to show its version and exit. - -### Debugging Options - -#### Options `--dump=FILEPATH`, `--no-dump` - -Option `--dump=FILEPATH` specifies that `ri` is to dump the content -of the `.ri` file at the given file path; -option`--no-dump` (the default) specifies that `ri` is not to dump content. - -The file path may point to any `.ri` file, -but typically would point to one named `cache.ri`: - -```sh -$ ri --dump=/usr/share/ri/3.0.0/system/cache.ri | wc -l -14487 -$ ri --dump=/usr/share/ri/3.0.0/system/cache.ri | head -{:ancestors=> - {"Array"=>["Enumerable", "Object"], - "RubyVM"=>["Object"], - "RubyVM::AbstractSyntaxTree::Node"=>["Object"], - "Object"=>["BasicObject", "Kernel"], - "Integer"=>["Numeric"], - "Module"=>["Object"], - "Class"=>["Module"], - "Complex"=>["Numeric"], - "NilClass"=>["Object"], -``` - -#### Options `--profile`, `--no-profile` - -Option `--profile` specifies that the program is to be run with the Ruby profiler; -option `no-profile` (the default) specifies that the program is not to be run -with the Ruby profiler. - -### Output Options - -#### Options `--format=FORMAT`, `-f FORMAT` - -Option `--format=FORMAT` (aliased as `-f`) specifies the formatter for the output, -which must be `ansi`, `bs`, `markdown`, or `rdoc`; -the default is `bs` for paged output, `ansi` otherwise. - -#### Options `--pager`, `--no-pager` - -Option `--pager` (the default) specifies that the output is to be piped -to a pager; -option `--no-pager` specifies that the output is not to be piped. - -#### Options `--width=NUMBER`, `-w NUMBER` - -Option `--width` (aliased as `-w`) specifies that the lengths of the displayed lines -should be restricted to the given _NUMBER_ of characters; -this is to be accomplished by line-wrapping, not truncation. -The default width is `80`: - -```sh -$ ri --width=40 Array | head -= Array < Object - ----------------------------------------- -= Includes: -Enumerable (from ruby core) - -(from ruby core) ----------------------------------------- -An Array is an ordered, integer-indexed -collection of objects, called -``` - - -### List Options - -#### Options `--list`, `-l`, `--no-list` - -Option `--list` (aliased as `-l`) specifies that all class and module names -whose initial characters match the given _name_ are to be displayed: -whose initial characters match the given _name_ are to be displayed: - -```sh -$ ri --list Ar | head -ArgumentError -Array -``` - -If no _name_ is given, all class and module names are displayed. - -Option `--no-list` (the default) specifies that a list of class and module names -is not to be displayed. - -### Methods Options (for Class or Module) - -#### Options `--all`, `-a`, `--no-all` - -Option `--all` (aliased as `-a`) specifies that when _name_ identifies a class or module, -the documents for all its methods are included; -option `--no-all` (the default) specifies that the method documents are not to be included: - -```shell -$ ri Array | wc -l -390 -$ ri --all Array | wc -l -4224 -``` - -### Server Option - -#### Option `--server=NUMBER` - -Option `--server` specifies that the \RDoc server is to be run on the port -given as _NUMBER_; -the default port is `8214`. - -## Generating `ri` Source Files - -`ri` by default reads data from directories installed by Ruby and gems. - -You can create your own `ri` source files. -This command creates `ri` source files in local directory `my_ri`, -from Ruby source files in local directory `my_sources`: - -```sh -$ rdoc --op my_ri --format=ri my_sources -``` - -Those files may then be considered for any `ri` command -by specifying option `--doc-dir=my_ri`; -see [option \\--doc-dir][20]. - -[1]: rdoc-ref:RI.md@Static+Mode -[2]: rdoc-ref:RI.md@Interactive+Mode -[3]: rdoc-ref:RI.md@Class+and+Module+Documents -[4]: rdoc-ref:RI.md@Options+--all-2C+-a-2C+--no-all -[5]: rdoc-ref:RI.md@Method+Documents -[6]: rdoc-ref:RI.md@Page+Documents -[7]: rdoc-ref:RI.md@ri+Lists -[8]: rdoc-ref:RI.md@Options+--list-2C+-l-2C+--no-list -[9]: https://docs.ruby-lang.org/en/master/IRB.html -[10]: rdoc-ref:RI.md@Pager -[11]: rdoc-ref:RI.md@Links+in+ri+Output -[12]: rdoc-ref:RI.md@Options+--list-doc-dirs-2C+--no-list-doc-dirs -[13]: rdoc-ref:RI.md@Options+--help-2C+-h -[14]: rdoc-ref:RI.md@Options+--version-2C+-v -[15]: rdoc-ref:RI.md@Options+--dump-3DFILEPATH-2C+--no-dump -[16]: rdoc-ref:RI.md@ri+Information -[17]: rdoc-ref:RI.md@Options -[18]: rdoc-ref:RI.md@ri+at+the+Ready -[19]: rdoc-ref:RI.md@Output+Filters -[20]: rdoc-ref:RI.md@Options+--doc-dir-3DDIRPATH-2C+-d+DIRPATH diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/TODO.rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/TODO.rdoc deleted file mode 100644 index da91911..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/TODO.rdoc +++ /dev/null @@ -1,60 +0,0 @@ -= TODO -This file contains some things that might happen in RDoc, or might not. -Forward Looking Statements applies. - -== RDoc::VERSION.succ - -=== Blockers: - -* Update LICENSE to match ruby's switch -* The alias keyword should not be bidirectional -* Fix RDoc::Parser#use_markup to handle the filename (see TODO) -* Restore backwards compatibility due to paragraph text joining from existing - ri files -* Fix consumption of , after link like: RDoc[rdoc-ref:RDoc], <- comma here -* Remove support for links like Matrix[*rows] - -=== Nice to have: - -* Parse only changed files (like in ruby) -* Page of Glory (or Shame) in HTML output showing documentation coverage - statistics. -* Link to the parent-class implementation of methods that use super -* Add direct accessor to RDoc::Options to RDoc::Task -* Remove "Public" in HTML output if there are only public methods -* Method markup support for rd documentation (per rd syntax) -* Improve SIGINFO handling -* Global variable support -* Provide the code_object to directive handlers - -== More Future - -=== API changes to RDoc - -* RDoc::TopLevel#add_method should automatically create the appropriate method - class rather than requiring one be passed in. -* Remove #comment= from Context subclasses in favor of #add_comment -* Add versions to RDoc::Markup syntax tree marshal format -* Comments can no longer be Strings - -== Crazy Ideas - -* Auto-normalize heading levels to look OK. It's weird to see an

in - the middle of a method section. -* RDoc::CodeObject - * Move into own namespace - * Rename TopLevel to File - * Rename Context to Container - * Rename NormalClass to Class - -== Accessibility - -Page title in right hand side - -Table of contents in left hand side as sub-list under main heading - -For class list, never method list, method summary at top - -table-of-contents-navigation div => nav + role="navigation" - -type "mod", focus is still on "mod" diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/rdoc b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/rdoc deleted file mode 100755 index 95b6eea..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/rdoc +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env ruby -# -# RDoc: Documentation tool for source code -# (see lib/rdoc/rdoc.rb for more information) -# -# Copyright (c) 2003 Dave Thomas -# Released under the same terms as Ruby - -begin - gem 'rdoc' -rescue NameError => e # --disable-gems - raise unless e.name == :gem -rescue Gem::LoadError -end - -require 'rdoc/rdoc' - -begin - r = RDoc::RDoc.new - r.document ARGV -rescue Errno::ENOSPC - $stderr.puts 'Ran out of space creating documentation' - $stderr.puts - $stderr.puts 'Please free up some space and try again' -rescue SystemExit - raise -rescue Exception => e - if $DEBUG_RDOC then - $stderr.puts e.message - $stderr.puts "#{e.backtrace.join "\n\t"}" - $stderr.puts - elsif Interrupt === e then - $stderr.puts - $stderr.puts 'Interrupted' - else - $stderr.puts "uh-oh! RDoc had a problem:" - $stderr.puts e.message - $stderr.puts - $stderr.puts "run with --debug for full backtrace" - end - - exit 1 -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/ri b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/ri deleted file mode 100755 index 7fbed0c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/exe/ri +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env ruby - -begin - gem 'rdoc' -rescue NameError => e # --disable-gems - raise unless e.name == :gem -rescue Gem::LoadError -end - -require 'rdoc/ri/driver' - -RDoc::RI::Driver.run ARGV diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc.rb deleted file mode 100644 index b42059c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc.rb +++ /dev/null @@ -1,211 +0,0 @@ -# frozen_string_literal: true -$DEBUG_RDOC = nil - -## -# RDoc produces documentation for Ruby source files by parsing the source and -# extracting the definition for classes, modules, methods, includes and -# requires. It associates these with optional documentation contained in an -# immediately preceding comment block then renders the result using an output -# formatter. -# -# For a simple introduction to writing or generating documentation using RDoc -# see the README. -# -# == Roadmap -# -# If you think you found a bug in RDoc see CONTRIBUTING@Bugs -# -# If you want to use RDoc to create documentation for your Ruby source files, -# see RDoc::Markup and refer to rdoc --help for command line usage. -# -# If you want to set the default markup format see -# RDoc::Markup@Markup+Formats -# -# If you want to store rdoc configuration in your gem (such as the default -# markup format) see RDoc::Options@Saved+Options -# -# If you want to write documentation for Ruby files see RDoc::Parser::Ruby -# -# If you want to write documentation for extensions written in C see -# RDoc::Parser::C -# -# If you want to generate documentation using rake see RDoc::Task. -# -# If you want to drive RDoc programmatically, see RDoc::RDoc. -# -# If you want to use the library to format text blocks into HTML or other -# formats, look at RDoc::Markup. -# -# If you want to make an RDoc plugin such as a generator or directive handler -# see RDoc::RDoc. -# -# If you want to write your own output generator see RDoc::Generator. -# -# If you want an overview of how RDoc works see CONTRIBUTING -# -# == Credits -# -# RDoc is currently being maintained by Eric Hodel . -# -# Dave Thomas is the original author of RDoc. -# -# * The Ruby parser in rdoc/parse.rb is based heavily on the outstanding -# work of Keiju ISHITSUKA of Nippon Rational Inc, who produced the Ruby -# parser for irb and the rtags package. - -module RDoc - - ## - # Exception thrown by any rdoc error. - - class Error < RuntimeError; end - - require_relative 'rdoc/version' - - ## - # Method visibilities - - VISIBILITIES = [:public, :protected, :private] - - ## - # Name of the dotfile that contains the description of files to be processed - # in the current directory - - DOT_DOC_FILENAME = ".document" - - ## - # General RDoc modifiers - - GENERAL_MODIFIERS = %w[nodoc].freeze - - ## - # RDoc modifiers for classes - - CLASS_MODIFIERS = GENERAL_MODIFIERS - - ## - # RDoc modifiers for attributes - - ATTR_MODIFIERS = GENERAL_MODIFIERS - - ## - # RDoc modifiers for constants - - CONSTANT_MODIFIERS = GENERAL_MODIFIERS - - ## - # RDoc modifiers for methods - - METHOD_MODIFIERS = GENERAL_MODIFIERS + - %w[arg args yield yields notnew not-new not_new doc] - - ## - # Loads the best available YAML library. - - def self.load_yaml - begin - gem 'psych' - rescue NameError => e # --disable-gems - raise unless e.name == :gem - rescue Gem::LoadError - end - - begin - require 'psych' - rescue ::LoadError - ensure - require 'yaml' - end - end - - ## - # Searches and returns the directory for settings. - # - # 1. $HOME/.rdoc directory, if it exists. - # 2. The +rdoc+ directory under the path specified by the - # +XDG_DATA_HOME+ environment variable, if it is set. - # 3. $HOME/.local/share/rdoc directory. - # - # Other than the home directory, the containing directory will be - # created automatically. - - def self.home - rdoc_dir = begin - File.expand_path('~/.rdoc') - rescue ArgumentError - end - - if File.directory?(rdoc_dir) - rdoc_dir - else - require 'fileutils' - begin - # XDG - xdg_data_home = ENV["XDG_DATA_HOME"] || File.join(File.expand_path("~"), '.local', 'share') - unless File.exist?(xdg_data_home) - FileUtils.mkdir_p xdg_data_home - end - File.join xdg_data_home, "rdoc" - rescue Errno::EACCES - end - end - end - - autoload :RDoc, "#{__dir__}/rdoc/rdoc" - - autoload :CrossReference, "#{__dir__}/rdoc/cross_reference" - autoload :ERBIO, "#{__dir__}/rdoc/erbio" - autoload :ERBPartial, "#{__dir__}/rdoc/erb_partial" - autoload :Encoding, "#{__dir__}/rdoc/encoding" - autoload :Generator, "#{__dir__}/rdoc/generator" - autoload :Options, "#{__dir__}/rdoc/options" - autoload :Parser, "#{__dir__}/rdoc/parser" - autoload :Servlet, "#{__dir__}/rdoc/servlet" - autoload :RI, "#{__dir__}/rdoc/ri" - autoload :Stats, "#{__dir__}/rdoc/stats" - autoload :Store, "#{__dir__}/rdoc/store" - autoload :Task, "#{__dir__}/rdoc/task" - autoload :Text, "#{__dir__}/rdoc/text" - - autoload :Markdown, "#{__dir__}/rdoc/markdown" - autoload :Markup, "#{__dir__}/rdoc/markup" - autoload :RD, "#{__dir__}/rdoc/rd" - autoload :TomDoc, "#{__dir__}/rdoc/tom_doc" - - autoload :KNOWN_CLASSES, "#{__dir__}/rdoc/known_classes" - - autoload :TokenStream, "#{__dir__}/rdoc/token_stream" - - autoload :Comment, "#{__dir__}/rdoc/comment" - - require_relative 'rdoc/i18n' - - # code objects - # - # We represent the various high-level code constructs that appear in Ruby - # programs: classes, modules, methods, and so on. - autoload :CodeObject, "#{__dir__}/rdoc/code_object" - - autoload :Context, "#{__dir__}/rdoc/code_object/context" - autoload :TopLevel, "#{__dir__}/rdoc/code_object/top_level" - - autoload :AnonClass, "#{__dir__}/rdoc/code_object/anon_class" - autoload :ClassModule, "#{__dir__}/rdoc/code_object/class_module" - autoload :NormalClass, "#{__dir__}/rdoc/code_object/normal_class" - autoload :NormalModule, "#{__dir__}/rdoc/code_object/normal_module" - autoload :SingleClass, "#{__dir__}/rdoc/code_object/single_class" - - autoload :Alias, "#{__dir__}/rdoc/code_object/alias" - autoload :AnyMethod, "#{__dir__}/rdoc/code_object/any_method" - autoload :MethodAttr, "#{__dir__}/rdoc/code_object/method_attr" - autoload :GhostMethod, "#{__dir__}/rdoc/code_object/ghost_method" - autoload :MetaMethod, "#{__dir__}/rdoc/code_object/meta_method" - autoload :Attr, "#{__dir__}/rdoc/code_object/attr" - - autoload :Constant, "#{__dir__}/rdoc/code_object/constant" - autoload :Mixin, "#{__dir__}/rdoc/code_object/mixin" - autoload :Include, "#{__dir__}/rdoc/code_object/include" - autoload :Extend, "#{__dir__}/rdoc/code_object/extend" - autoload :Require, "#{__dir__}/rdoc/code_object/require" - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object.rb deleted file mode 100644 index 388863b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object.rb +++ /dev/null @@ -1,395 +0,0 @@ -# frozen_string_literal: true -## -# Base class for the RDoc code tree. -# -# We contain the common stuff for contexts (which are containers) and other -# elements (methods, attributes and so on) -# -# Here's the tree of the CodeObject subclasses: -# -# * RDoc::Context -# * RDoc::TopLevel -# * RDoc::ClassModule -# * RDoc::AnonClass (never used so far) -# * RDoc::NormalClass -# * RDoc::NormalModule -# * RDoc::SingleClass -# * RDoc::MethodAttr -# * RDoc::Attr -# * RDoc::AnyMethod -# * RDoc::GhostMethod -# * RDoc::MetaMethod -# * RDoc::Alias -# * RDoc::Constant -# * RDoc::Require -# * RDoc::Mixin -# * RDoc::Include -# * RDoc::Extend - -class RDoc::CodeObject - - include RDoc::Text - - ## - # Our comment - - attr_reader :comment - - ## - # Do we document our children? - - attr_reader :document_children - - ## - # Do we document ourselves? - - attr_reader :document_self - - ## - # Are we done documenting (ie, did we come across a :enddoc:)? - - attr_reader :done_documenting - - ## - # Which file this code object was defined in - - attr_reader :file - - ## - # Force documentation of this CodeObject - - attr_reader :force_documentation - - ## - # Line in #file where this CodeObject was defined - - attr_accessor :line - - ## - # Hash of arbitrary metadata for this CodeObject - - attr_reader :metadata - - ## - # Sets the parent CodeObject - - attr_writer :parent - - ## - # Did we ever receive a +:nodoc:+ directive? - - attr_reader :received_nodoc - - ## - # Set the section this CodeObject is in - - attr_writer :section - - ## - # The RDoc::Store for this object. - - attr_reader :store - - ## - # When mixed-in to a class, this points to the Context in which it was originally defined. - - attr_accessor :mixin_from - - ## - # Creates a new CodeObject that will document itself and its children - - def initialize - @metadata = {} - @comment = '' - @parent = nil - @parent_name = nil # for loading - @parent_class = nil # for loading - @section = nil - @section_title = nil # for loading - @file = nil - @full_name = nil - @store = nil - @track_visibility = true - @mixin_from = nil - - initialize_visibility - end - - ## - # Initializes state for visibility of this CodeObject and its children. - - def initialize_visibility # :nodoc: - @document_children = true - @document_self = true - @done_documenting = false - @force_documentation = false - @received_nodoc = false - @ignored = false - @suppressed = false - @track_visibility = true - end - - ## - # Replaces our comment with +comment+, unless it is empty. - - def comment=(comment) - @comment = case comment - when NilClass then '' - when RDoc::Comment then comment.normalize - else - if comment and not comment.empty? then - normalize_comment comment - else - # HACK correct fix is to have #initialize create @comment - # with the correct encoding - if String === @comment and @comment.empty? then - @comment = RDoc::Encoding.change_encoding @comment, comment.encoding - end - @comment - end - end - end - - ## - # Should this CodeObject be displayed in output? - # - # A code object should be displayed if: - # - # * The item didn't have a nodoc or wasn't in a container that had nodoc - # * The item wasn't ignored - # * The item has documentation and was not suppressed - - def display? - @document_self and not @ignored and - (documented? or not @suppressed) - end - - ## - # Enables or disables documentation of this CodeObject's children unless it - # has been turned off by :enddoc: - - def document_children=(document_children) - return unless @track_visibility - - @document_children = document_children unless @done_documenting - end - - ## - # Enables or disables documentation of this CodeObject unless it has been - # turned off by :enddoc:. If the argument is +nil+ it means the - # documentation is turned off by +:nodoc:+. - - def document_self=(document_self) - return unless @track_visibility - return if @done_documenting - - @document_self = document_self - @received_nodoc = true if document_self.nil? - end - - ## - # Does this object have a comment with content or is #received_nodoc true? - - def documented? - @received_nodoc or !@comment.empty? - end - - ## - # Turns documentation on/off, and turns on/off #document_self - # and #document_children. - # - # Once documentation has been turned off (by +:enddoc:+), - # the object will refuse to turn #document_self or - # #document_children on, so +:doc:+ and +:start_doc:+ directives - # will have no effect in the current file. - - def done_documenting=(value) - return unless @track_visibility - @done_documenting = value - @document_self = !value - @document_children = @document_self - end - - ## - # File name where this CodeObject was found. - # - # See also RDoc::Context#in_files - - def file_name - return unless @file - - @file.absolute_name - end - - ## - # Force the documentation of this object unless documentation - # has been turned off by :enddoc: - #-- - # HACK untested, was assigning to an ivar - - def force_documentation=(value) - @force_documentation = value unless @done_documenting - end - - ## - # Sets the full_name overriding any computed full name. - # - # Set to +nil+ to clear RDoc's cached value - - def full_name=(full_name) - @full_name = full_name - end - - ## - # Use this to ignore a CodeObject and all its children until found again - # (#record_location is called). An ignored item will not be displayed in - # documentation. - # - # See github issue #55 - # - # The ignored status is temporary in order to allow implementation details - # to be hidden. At the end of processing a file RDoc allows all classes - # and modules to add new documentation to previously created classes. - # - # If a class was ignored (via stopdoc) then reopened later with additional - # documentation it should be displayed. If a class was ignored and never - # reopened it should not be displayed. The ignore flag allows this to - # occur. - - def ignore - return unless @track_visibility - - @ignored = true - - stop_doc - end - - ## - # Has this class been ignored? - # - # See also #ignore - - def ignored? - @ignored - end - - ## - # The options instance from the store this CodeObject is attached to, or a - # default options instance if the CodeObject is not attached. - # - # This is used by Text#snippet - - def options - @store&.options || RDoc::Options.new - end - - ## - # Our parent CodeObject. The parent may be missing for classes loaded from - # legacy RI data stores. - - def parent - return @parent if @parent - return nil unless @parent_name - - if @parent_class == RDoc::TopLevel then - @parent = @store.add_file @parent_name - else - @parent = @store.find_class_or_module @parent_name - - return @parent if @parent - - begin - @parent = @store.load_class @parent_name - rescue RDoc::Store::MissingFileError - nil - end - end - end - - ## - # Name of our parent - - def parent_name - @parent ? @parent.full_name : '(unknown)' - end - - ## - # Records the RDoc::TopLevel (file) where this code object was defined - - def record_location(top_level) - @ignored = false - @suppressed = false - @file = top_level - end - - ## - # The section this CodeObject is in. Sections allow grouping of constants, - # attributes and methods inside a class or module. - - def section - return @section if @section - - @section = parent.add_section @section_title if parent - end - - ## - # Enable capture of documentation unless documentation has been - # turned off by :enddoc: - - def start_doc - return if @done_documenting - - @document_self = true - @document_children = true - @ignored = false - @suppressed = false - end - - ## - # Disable capture of documentation - - def stop_doc - return unless @track_visibility - - @document_self = false - @document_children = false - end - - ## - # Sets the +store+ that contains this CodeObject - - def store=(store) - @store = store - - return unless @track_visibility - - if :nodoc == options.visibility then - initialize_visibility - @track_visibility = false - end - end - - ## - # Use this to suppress a CodeObject and all its children until the next file - # it is seen in or documentation is discovered. A suppressed item with - # documentation will be displayed while an ignored item with documentation - # may not be displayed. - - def suppress - return unless @track_visibility - - @suppressed = true - - stop_doc - end - - ## - # Has this class been suppressed? - # - # See also #suppress - - def suppressed? - @suppressed - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/alias.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/alias.rb deleted file mode 100644 index bd5b3ec..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/alias.rb +++ /dev/null @@ -1,104 +0,0 @@ -# frozen_string_literal: true -## -# Represent an alias, which is an old_name/new_name pair associated with a -# particular context -#-- -# TODO implement Alias as a proxy to a method/attribute, inheriting from -# MethodAttr - -class RDoc::Alias < RDoc::CodeObject - - ## - # Aliased method's name - - attr_reader :new_name - - alias name new_name - - ## - # Aliasee method's name - - attr_reader :old_name - - ## - # Is this an alias declared in a singleton context? - - attr_reader :singleton - - ## - # Source file token stream - - attr_reader :text - - ## - # Creates a new Alias with a token stream of +text+ that aliases +old_name+ - # to +new_name+, has +comment+ and is a +singleton+ context. - - def initialize(text, old_name, new_name, comment, singleton: false) - super() - - @text = text - @singleton = singleton - @old_name = old_name - @new_name = new_name - self.comment = comment - end - - ## - # Order by #singleton then #new_name - - def <=>(other) - [@singleton ? 0 : 1, new_name] <=> [other.singleton ? 0 : 1, other.new_name] - end - - ## - # HTML fragment reference for this alias - - def aref - type = singleton ? 'c' : 'i' - "#alias-#{type}-#{html_name}" - end - - ## - # HTML id-friendly version of +#new_name+. - - def html_name - CGI.escape(@new_name.gsub('-', '-2D')).gsub('%', '-').sub(/^-/, '') - end - - def inspect # :nodoc: - parent_name = parent ? parent.name : '(unknown)' - "#<%s:0x%x %s.alias_method %s, %s>" % [ - self.class, object_id, - parent_name, @old_name, @new_name, - ] - end - - ## - # '::' for the alias of a singleton method/attribute, '#' for instance-level. - - def name_prefix - singleton ? '::' : '#' - end - - ## - # Old name with prefix '::' or '#'. - - def pretty_old_name - "#{singleton ? '::' : '#'}#{@old_name}" - end - - ## - # New name with prefix '::' or '#'. - - def pretty_new_name - "#{singleton ? '::' : '#'}#{@new_name}" - end - - alias pretty_name pretty_new_name - - def to_s # :nodoc: - "alias: #{self.new_name} -> #{self.pretty_old_name} in: #{parent}" - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/anon_class.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/anon_class.rb deleted file mode 100644 index 3c2f0e1..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/anon_class.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true -## -# An anonymous class like: -# -# c = Class.new do end -# -# AnonClass is currently not used. - -class RDoc::AnonClass < RDoc::ClassModule -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/any_method.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/any_method.rb deleted file mode 100644 index b319f0d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/any_method.rb +++ /dev/null @@ -1,374 +0,0 @@ -# frozen_string_literal: true -## -# AnyMethod is the base class for objects representing methods - -class RDoc::AnyMethod < RDoc::MethodAttr - - ## - # 2:: - # RDoc 4 - # Added calls_super - # Added parent name and class - # Added section title - # 3:: - # RDoc 4.1 - # Added is_alias_for - - MARSHAL_VERSION = 3 # :nodoc: - - ## - # Don't rename \#initialize to \::new - - attr_accessor :dont_rename_initialize - - ## - # The C function that implements this method (if it was defined in a C file) - - attr_accessor :c_function - - # The section title of the method (if defined in a C file via +:category:+) - attr_accessor :section_title - - ## - # If true this method uses +super+ to call a superclass version - - attr_accessor :calls_super - - include RDoc::TokenStream - - ## - # Creates a new AnyMethod with a token stream +text+ and +name+ - - def initialize(text, name, singleton: false) - super(text, name, singleton: singleton) - - @c_function = nil - @dont_rename_initialize = false - @token_stream = nil - @calls_super = false - @superclass_method = nil - end - - ## - # Adds +an_alias+ as an alias for this method in +context+. - - def add_alias(an_alias, context = nil) - method = self.class.new an_alias.text, an_alias.new_name, singleton: singleton - - method.record_location an_alias.file - method.params = self.params - method.visibility = self.visibility - method.comment = an_alias.comment - method.is_alias_for = self - @aliases << method - context.add_method method if context - method - end - - ## - # Prefix for +aref+ is 'method'. - - def aref_prefix - 'method' - end - - ## - # The call_seq or the param_seq with method name, if there is no call_seq. - # - # Use this for displaying a method's argument lists. - - def arglists - if @call_seq then - @call_seq - elsif @params then - "#{name}#{param_seq}" - end - end - - ## - # Different ways to call this method - - def call_seq - unless call_seq = _call_seq - call_seq = is_alias_for._call_seq if is_alias_for - end - - return unless call_seq - - deduplicate_call_seq(call_seq) - end - - ## - # Sets the different ways you can call this method. If an empty +call_seq+ - # is given nil is assumed. - # - # See also #param_seq - - def call_seq=(call_seq) - return if call_seq.nil? || call_seq.empty? - - @call_seq = call_seq - end - - ## - # Whether the method has a call-seq. - - def has_call_seq? - !!(@call_seq || is_alias_for&._call_seq) - end - - ## - # Loads is_alias_for from the internal name. Returns nil if the alias - # cannot be found. - - def is_alias_for # :nodoc: - case @is_alias_for - when RDoc::MethodAttr then - @is_alias_for - when Array then - return nil unless @store - - klass_name, singleton, method_name = @is_alias_for - - return nil unless klass = @store.find_class_or_module(klass_name) - - @is_alias_for = klass.find_method method_name, singleton - end - end - - ## - # Dumps this AnyMethod for use by ri. See also #marshal_load - - def marshal_dump - aliases = @aliases.map do |a| - [a.name, parse(a.comment)] - end - - is_alias_for = [ - @is_alias_for.parent.full_name, - @is_alias_for.singleton, - @is_alias_for.name - ] if @is_alias_for - - [ MARSHAL_VERSION, - @name, - full_name, - @singleton, - @visibility, - parse(@comment), - @call_seq, - @block_params, - aliases, - @params, - @file.relative_name, - @calls_super, - @parent.name, - @parent.class, - @section.title, - is_alias_for, - ] - end - - ## - # Loads this AnyMethod from +array+. For a loaded AnyMethod the following - # methods will return cached values: - # - # * #full_name - # * #parent_name - - def marshal_load(array) - initialize_visibility - - @dont_rename_initialize = nil - @token_stream = nil - @aliases = [] - @parent = nil - @parent_name = nil - @parent_class = nil - @section = nil - @file = nil - - version = array[0] - @name = array[1] - @full_name = array[2] - @singleton = array[3] - @visibility = array[4] - @comment = RDoc::Comment.from_document array[5] - @call_seq = array[6] - @block_params = array[7] - # 8 handled below - @params = array[9] - # 10 handled below - @calls_super = array[11] - @parent_name = array[12] - @parent_title = array[13] - @section_title = array[14] - @is_alias_for = array[15] - - array[8].each do |new_name, document| - add_alias RDoc::Alias.new(nil, @name, new_name, RDoc::Comment.from_document(document), singleton: @singleton) - end - - @parent_name ||= if @full_name =~ /#/ then - $` - else - name = @full_name.split('::') - name.pop - name.join '::' - end - - @file = RDoc::TopLevel.new array[10] if version > 0 - end - - ## - # Method name - # - # If the method has no assigned name, it extracts it from #call_seq. - - def name - return @name if @name - - @name = - @call_seq[/^.*?\.(\w+)/, 1] || - @call_seq[/^.*?(\w+)/, 1] || - @call_seq if @call_seq - end - - ## - # A list of this method's method and yield parameters. +call-seq+ params - # are preferred over parsed method and block params. - - def param_list - if @call_seq then - params = @call_seq.split("\n").last - params = params.sub(/.*?\((.*)\)/, '\1') - params = params.sub(/(\{|do)\s*\|([^|]*)\|.*/, ',\2') - elsif @params then - params = @params.sub(/\((.*)\)/, '\1') - - params << ",#{@block_params}" if @block_params - elsif @block_params then - params = @block_params - else - return [] - end - - if @block_params then - # If this method has explicit block parameters, remove any explicit - # &block - params = params.sub(/,?\s*&\w+/, '') - else - params = params.sub(/\&(\w+)/, '\1') - end - - params = params.gsub(/\s+/, '').split(',').reject(&:empty?) - - params.map { |param| param.sub(/=.*/, '') } - end - - ## - # Pretty parameter list for this method. If the method's parameters were - # given by +call-seq+ it is preferred over the parsed values. - - def param_seq - if @call_seq then - params = @call_seq.split("\n").last - params = params.sub(/[^( ]+/, '') - params = params.sub(/(\|[^|]+\|)\s*\.\.\.\s*(end|\})/, '\1 \2') - elsif @params then - params = @params.gsub(/\s*\#.*/, '') - params = params.tr_s("\n ", " ") - params = "(#{params})" unless params[0] == ?( - else - params = '' - end - - if @block_params then - # If this method has explicit block parameters, remove any explicit - # &block - params = params.sub(/,?\s*&\w+/, '') - - block = @block_params.tr_s("\n ", " ") - if block[0] == ?( - block = block.sub(/^\(/, '').sub(/\)/, '') - end - params << " { |#{block}| ... }" - end - - params - end - - ## - # Whether to skip the method description, true for methods that have - # aliases with a call-seq that doesn't include the method name. - - def skip_description? - has_call_seq? && call_seq.nil? && !!(is_alias_for || !aliases.empty?) - end - - ## - # Sets the store for this method and its referenced code objects. - - def store=(store) - super - - @file = @store.add_file @file.full_name if @file - end - - ## - # For methods that +super+, find the superclass method that would be called. - - def superclass_method - return unless @calls_super - return @superclass_method if @superclass_method - - parent.each_ancestor do |ancestor| - if method = ancestor.method_list.find { |m| m.name == @name } then - @superclass_method = method - break - end - end - - @superclass_method - end - - protected - - ## - # call_seq without deduplication and alias lookup. - - def _call_seq - @call_seq if defined?(@call_seq) && @call_seq - end - - private - - ## - # call_seq with alias examples information removed, if this - # method is an alias method. - - def deduplicate_call_seq(call_seq) - return call_seq unless is_alias_for || !aliases.empty? - - method_name = self.name - method_name = method_name[0, 1] if method_name =~ /\A\[/ - - entries = call_seq.split "\n" - - ignore = aliases.map(&:name) - if is_alias_for - ignore << is_alias_for.name - ignore.concat is_alias_for.aliases.map(&:name) - end - ignore.map! { |n| n =~ /\A\[/ ? /\[.*\]/ : n} - ignore.delete(method_name) - ignore = Regexp.union(ignore) - - matching = entries.reject do |entry| - entry =~ /^\w*\.?#{ignore}[$\(\s]/ or - entry =~ /\s#{ignore}\s/ - end - - matching.empty? ? nil : matching.join("\n") - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/attr.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/attr.rb deleted file mode 100644 index 969b183..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/attr.rb +++ /dev/null @@ -1,172 +0,0 @@ -# frozen_string_literal: true -## -# An attribute created by \#attr, \#attr_reader, \#attr_writer or -# \#attr_accessor - -class RDoc::Attr < RDoc::MethodAttr - - ## - # 3:: - # RDoc 4 - # Added parent name and class - # Added section title - - MARSHAL_VERSION = 3 # :nodoc: - - ## - # Is the attribute readable ('R'), writable ('W') or both ('RW')? - - attr_accessor :rw - - ## - # Creates a new Attr with body +text+, +name+, read/write status +rw+ and - # +comment+. +singleton+ marks this as a class attribute. - - def initialize(text, name, rw, comment, singleton: false) - super(text, name, singleton: singleton) - - @rw = rw - self.comment = comment - end - - ## - # Attributes are equal when their names, singleton and rw are identical - - def ==(other) - self.class == other.class and - self.name == other.name and - self.rw == other.rw and - self.singleton == other.singleton - end - - ## - # Add +an_alias+ as an attribute in +context+. - - def add_alias(an_alias, context) - new_attr = self.class.new(text, an_alias.new_name, rw, comment, singleton: singleton) - new_attr.record_location an_alias.file - new_attr.visibility = self.visibility - new_attr.is_alias_for = self - @aliases << new_attr - context.add_attribute new_attr - new_attr - end - - ## - # The #aref prefix for attributes - - def aref_prefix - 'attribute' - end - - ## - # Attributes never call super. See RDoc::AnyMethod#calls_super - # - # An RDoc::Attr can show up in the method list in some situations (see - # Gem::ConfigFile) - - def calls_super # :nodoc: - false - end - - ## - # Returns attr_reader, attr_writer or attr_accessor as appropriate. - - def definition - case @rw - when 'RW' then 'attr_accessor' - when 'R' then 'attr_reader' - when 'W' then 'attr_writer' - end - end - - def inspect # :nodoc: - alias_for = @is_alias_for ? " (alias for #{@is_alias_for.name})" : nil - visibility = self.visibility - visibility = "forced #{visibility}" if force_documentation - "#<%s:0x%x %s %s (%s)%s>" % [ - self.class, object_id, - full_name, - rw, - visibility, - alias_for, - ] - end - - ## - # Dumps this Attr for use by ri. See also #marshal_load - - def marshal_dump - [ MARSHAL_VERSION, - @name, - full_name, - @rw, - @visibility, - parse(@comment), - singleton, - @file.relative_name, - @parent.full_name, - @parent.class, - @section.title - ] - end - - ## - # Loads this Attr from +array+. For a loaded Attr the following - # methods will return cached values: - # - # * #full_name - # * #parent_name - - def marshal_load(array) - initialize_visibility - - @aliases = [] - @parent = nil - @parent_name = nil - @parent_class = nil - @section = nil - @file = nil - - version = array[0] - @name = array[1] - @full_name = array[2] - @rw = array[3] - @visibility = array[4] - @comment = RDoc::Comment.from_document array[5] - @singleton = array[6] || false # MARSHAL_VERSION == 0 - # 7 handled below - @parent_name = array[8] - @parent_class = array[9] - @section_title = array[10] - - @file = RDoc::TopLevel.new array[7] if version > 1 - - @parent_name ||= @full_name.split('#', 2).first - end - - def pretty_print(q) # :nodoc: - q.group 2, "[#{self.class.name} #{full_name} #{rw} #{visibility}", "]" do - unless comment.empty? then - q.breakable - q.text "comment:" - q.breakable - q.pp @comment - end - end - end - - def to_s # :nodoc: - "#{definition} #{name} in: #{parent}" - end - - ## - # Attributes do not have token streams. - # - # An RDoc::Attr can show up in the method list in some situations (see - # Gem::ConfigFile) - - def token_stream # :nodoc: - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/class_module.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/class_module.rb deleted file mode 100644 index f6b0abb..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/class_module.rb +++ /dev/null @@ -1,888 +0,0 @@ -# frozen_string_literal: true -## -# ClassModule is the base class for objects representing either a class or a -# module. - -class RDoc::ClassModule < RDoc::Context - - ## - # 1:: - # RDoc 3.7 - # * Added visibility, singleton and file to attributes - # * Added file to constants - # * Added file to includes - # * Added file to methods - # 2:: - # RDoc 3.13 - # * Added extends - # 3:: - # RDoc 4.0 - # * Added sections - # * Added in_files - # * Added parent name - # * Complete Constant dump - - MARSHAL_VERSION = 3 # :nodoc: - - ## - # Constants that are aliases for this class or module - - attr_accessor :constant_aliases - - ## - # Comment and the location it came from. Use #add_comment to add comments - - attr_accessor :comment_location - - ## - # Class or module this constant is an alias for - - attr_accessor :is_alias_for - - ## - # Return a RDoc::ClassModule of class +class_type+ that is a copy - # of module +module+. Used to promote modules to classes. - #-- - # TODO move to RDoc::NormalClass (I think) - - def self.from_module(class_type, mod) - klass = class_type.new mod.name - - mod.comment_location.each do |comment, location| - klass.add_comment comment, location - end - - klass.parent = mod.parent - klass.section = mod.section - - klass.attributes.concat mod.attributes - klass.method_list.concat mod.method_list - klass.aliases.concat mod.aliases - klass.external_aliases.concat mod.external_aliases - klass.constants.concat mod.constants - klass.includes.concat mod.includes - klass.extends.concat mod.extends - - klass.methods_hash.update mod.methods_hash - klass.constants_hash.update mod.constants_hash - - klass.current_section = mod.current_section - klass.in_files.concat mod.in_files - klass.sections.concat mod.sections - klass.unmatched_alias_lists = mod.unmatched_alias_lists - klass.current_section = mod.current_section - klass.visibility = mod.visibility - - klass.classes_hash.update mod.classes_hash - klass.modules_hash.update mod.modules_hash - klass.metadata.update mod.metadata - - klass.document_self = mod.received_nodoc ? nil : mod.document_self - klass.document_children = mod.document_children - klass.force_documentation = mod.force_documentation - klass.done_documenting = mod.done_documenting - - # update the parent of all children - - (klass.attributes + - klass.method_list + - klass.aliases + - klass.external_aliases + - klass.constants + - klass.includes + - klass.extends + - klass.classes + - klass.modules).each do |obj| - obj.parent = klass - obj.full_name = nil - end - - klass - end - - ## - # Creates a new ClassModule with +name+ with optional +superclass+ - # - # This is a constructor for subclasses, and must never be called directly. - - def initialize(name, superclass = nil) - @constant_aliases = [] - @is_alias_for = nil - @name = name - @superclass = superclass - @comment_location = [] # [[comment, location]] - - super() - end - - ## - # Adds +comment+ to this ClassModule's list of comments at +location+. This - # method is preferred over #comment= since it allows ri data to be updated - # across multiple runs. - - def add_comment(comment, location) - return unless document_self - - original = comment - - comment = case comment - when RDoc::Comment then - comment.normalize - else - normalize_comment comment - end - - if location.parser == RDoc::Parser::C - @comment_location.delete_if { |(_, l)| l == location } - end - - @comment_location << [comment, location] - - self.comment = original - end - - def add_things(my_things, other_things) # :nodoc: - other_things.each do |group, things| - my_things[group].each { |thing| yield false, thing } if - my_things.include? group - - things.each do |thing| - yield true, thing - end - end - end - - ## - # Ancestors list for this ClassModule: the list of included modules - # (classes will add their superclass if any). - # - # Returns the included classes or modules, not the includes - # themselves. The returned values are either String or - # RDoc::NormalModule instances (see RDoc::Include#module). - # - # The values are returned in reverse order of their inclusion, - # which is the order suitable for searching methods/attributes - # in the ancestors. The superclass, if any, comes last. - - def ancestors - includes.map { |i| i.module }.reverse - end - - def aref_prefix # :nodoc: - raise NotImplementedError, "missing aref_prefix for #{self.class}" - end - - ## - # HTML fragment reference for this module or class. See - # RDoc::NormalClass#aref and RDoc::NormalModule#aref - - def aref - "#{aref_prefix}-#{full_name}" - end - - ## - # Ancestors of this class or module only - - alias direct_ancestors ancestors - - ## - # Clears the comment. Used by the Ruby parser. - - def clear_comment - @comment = '' - end - - ## - # This method is deprecated, use #add_comment instead. - # - # Appends +comment+ to the current comment, but separated by a rule. Works - # more like +=. - - def comment=(comment) # :nodoc: - comment = case comment - when RDoc::Comment then - comment.normalize - else - normalize_comment comment - end - - comment = "#{@comment.to_s}\n---\n#{comment.to_s}" unless @comment.empty? - - super comment - end - - ## - # Prepares this ClassModule for use by a generator. - # - # See RDoc::Store#complete - - def complete(min_visibility) - update_aliases - remove_nodoc_children - embed_mixins - update_includes - update_extends - remove_invisible min_visibility - end - - ## - # Does this ClassModule or any of its methods have document_self set? - - def document_self_or_methods - document_self || method_list.any?{ |m| m.document_self } - end - - ## - # Does this class or module have a comment with content or is - # #received_nodoc true? - - def documented? - return true if @received_nodoc - return false if @comment_location.empty? - @comment_location.any? { |comment, _| not comment.empty? } - end - - ## - # Iterates the ancestors of this class or module for which an - # RDoc::ClassModule exists. - - def each_ancestor # :yields: module - return enum_for __method__ unless block_given? - - ancestors.each do |mod| - next if String === mod - next if self == mod - yield mod - end - end - - ## - # Looks for a symbol in the #ancestors. See Context#find_local_symbol. - - def find_ancestor_local_symbol(symbol) - each_ancestor do |m| - res = m.find_local_symbol(symbol) - return res if res - end - - nil - end - - ## - # Finds a class or module with +name+ in this namespace or its descendants - - def find_class_named(name) - return self if full_name == name - return self if @name == name - - @classes.values.find do |klass| - next if klass == self - klass.find_class_named name - end - end - - ## - # Return the fully qualified name of this class or module - - def full_name - @full_name ||= if RDoc::ClassModule === parent then - "#{parent.full_name}::#{@name}" - else - @name - end - end - - ## - # Return array of full_name splitted by +::+. - - def nesting_namespaces - @namespaces ||= full_name.split("::").reject(&:empty?) - end - - ## - # Return array of fully qualified nesting namespaces. - # - # For example, if full_name is +A::B::C+, this method returns ["A", "A::B", "A::B::C"] - - def fully_qualified_nesting_namespaces - return nesting_namespaces if nesting_namespaces.length < 2 - @fqns ||= nesting_namespaces.inject([]) do |list, n| - list << (list.empty? ? n : "#{list.last}::#{n}") - end - end - - ## - # TODO: filter included items by #display? - - def marshal_dump # :nodoc: - attrs = attributes.sort.map do |attr| - next unless attr.display? - [ attr.name, attr.rw, - attr.visibility, attr.singleton, attr.file_name, - ] - end.compact - - method_types = methods_by_type.map do |type, visibilities| - visibilities = visibilities.map do |visibility, methods| - method_names = methods.map do |method| - next unless method.display? - [method.name, method.file_name] - end.compact - - [visibility, method_names.uniq] - end - - [type, visibilities] - end - - [ MARSHAL_VERSION, - @name, - full_name, - @superclass, - parse(@comment_location), - attrs, - constants.select { |constant| constant.display? }, - includes.map do |incl| - next unless incl.display? - [incl.name, parse(incl.comment), incl.file_name] - end.compact, - method_types, - extends.map do |ext| - next unless ext.display? - [ext.name, parse(ext.comment), ext.file_name] - end.compact, - @sections.values, - @in_files.map do |tl| - tl.relative_name - end, - parent.full_name, - parent.class, - ] - end - - def marshal_load(array) # :nodoc: - initialize_visibility - initialize_methods_etc - @current_section = nil - @document_self = true - @done_documenting = false - @parent = nil - @temporary_section = nil - @visibility = nil - @classes = {} - @modules = {} - - @name = array[1] - @full_name = array[2] - @superclass = array[3] - document = array[4] - - @comment = RDoc::Comment.from_document document - - @comment_location = if RDoc::Markup::Document === document.parts.first then - document - else - RDoc::Markup::Document.new document - end - - array[5].each do |name, rw, visibility, singleton, file| - singleton ||= false - visibility ||= :public - - attr = RDoc::Attr.new nil, name, rw, nil, singleton: singleton - - add_attribute attr - attr.visibility = visibility - attr.record_location RDoc::TopLevel.new file - end - - array[6].each do |constant, document, file| - case constant - when RDoc::Constant then - add_constant constant - else - constant = add_constant RDoc::Constant.new(constant, nil, RDoc::Comment.from_document(document)) - constant.record_location RDoc::TopLevel.new file - end - end - - array[7].each do |name, document, file| - incl = add_include RDoc::Include.new(name, RDoc::Comment.from_document(document)) - incl.record_location RDoc::TopLevel.new file - end - - array[8].each do |type, visibilities| - visibilities.each do |visibility, methods| - @visibility = visibility - - methods.each do |name, file| - method = RDoc::AnyMethod.new nil, name, singleton: type == 'class' - method.record_location RDoc::TopLevel.new file - add_method method - end - end - end - - array[9].each do |name, document, file| - ext = add_extend RDoc::Extend.new(name, RDoc::Comment.from_document(document)) - ext.record_location RDoc::TopLevel.new file - end if array[9] # Support Marshal version 1 - - sections = (array[10] || []).map do |section| - [section.title, section] - end - - @sections = Hash[*sections.flatten] - @current_section = add_section nil - - @in_files = [] - - (array[11] || []).each do |filename| - record_location RDoc::TopLevel.new filename - end - - @parent_name = array[12] - @parent_class = array[13] - end - - ## - # Merges +class_module+ into this ClassModule. - # - # The data in +class_module+ is preferred over the receiver. - - def merge(class_module) - @parent = class_module.parent - @parent_name = class_module.parent_name - - other_document = parse class_module.comment_location - - if other_document then - document = parse @comment_location - - document = document.merge other_document - - @comment = RDoc::Comment.from_document(document) - @comment_location = document - end - - cm = class_module - other_files = cm.in_files - - merge_collections attributes, cm.attributes, other_files do |add, attr| - if add then - add_attribute attr - else - @attributes.delete attr - @methods_hash.delete attr.pretty_name - end - end - - merge_collections constants, cm.constants, other_files do |add, const| - if add then - add_constant const - else - @constants.delete const - @constants_hash.delete const.name - end - end - - merge_collections includes, cm.includes, other_files do |add, incl| - if add then - add_include incl - else - @includes.delete incl - end - end - - @includes.uniq! # clean up - - merge_collections extends, cm.extends, other_files do |add, ext| - if add then - add_extend ext - else - @extends.delete ext - end - end - - @extends.uniq! # clean up - - merge_collections method_list, cm.method_list, other_files do |add, meth| - if add then - add_method meth - else - @method_list.delete meth - @methods_hash.delete meth.pretty_name - end - end - - merge_sections cm - - self - end - - ## - # Merges collection +mine+ with +other+ preferring other. +other_files+ is - # used to help determine which items should be deleted. - # - # Yields whether the item should be added or removed (true or false) and the - # item to be added or removed. - # - # merge_collections things, other.things, other.in_files do |add, thing| - # if add then - # # add the thing - # else - # # remove the thing - # end - # end - - def merge_collections(mine, other, other_files, &block) # :nodoc: - my_things = mine. group_by { |thing| thing.file } - other_things = other.group_by { |thing| thing.file } - - remove_things my_things, other_files, &block - add_things my_things, other_things, &block - end - - ## - # Merges the comments in this ClassModule with the comments in the other - # ClassModule +cm+. - - def merge_sections(cm) # :nodoc: - my_sections = sections.group_by { |section| section.title } - other_sections = cm.sections.group_by { |section| section.title } - - other_files = cm.in_files - - remove_things my_sections, other_files do |_, section| - @sections.delete section.title - end - - other_sections.each do |group, sections| - if my_sections.include? group - my_sections[group].each do |my_section| - other_section = cm.sections_hash[group] - - my_comments = my_section.comments - other_comments = other_section.comments - - other_files = other_section.in_files - - merge_collections my_comments, other_comments, other_files do |add, comment| - if add then - my_section.add_comment comment - else - my_section.remove_comment comment - end - end - end - else - sections.each do |section| - add_section group, section.comments - end - end - end - end - - ## - # Does this object represent a module? - - def module? - false - end - - ## - # Allows overriding the initial name. - # - # Used for modules and classes that are constant aliases. - - def name=(new_name) - @name = new_name - end - - ## - # Parses +comment_location+ into an RDoc::Markup::Document composed of - # multiple RDoc::Markup::Documents with their file set. - - def parse(comment_location) - case comment_location - when String then - super - when Array then - docs = comment_location.map do |comment, location| - doc = super comment - doc.file = location - doc - end - - RDoc::Markup::Document.new(*docs) - when RDoc::Comment then - doc = super comment_location.text, comment_location.format - doc.file = comment_location.location - doc - when RDoc::Markup::Document then - return comment_location - else - raise ArgumentError, "unknown comment class #{comment_location.class}" - end - end - - ## - # Path to this class or module for use with HTML generator output. - - def path - prefix = options.class_module_path_prefix - return http_url unless prefix - File.join(prefix, http_url) - end - - ## - # Name to use to generate the url: - # modules and classes that are aliases for another - # module or class return the name of the latter. - - def name_for_path - is_alias_for ? is_alias_for.full_name : full_name - end - - ## - # Returns the classes and modules that are not constants - # aliasing another class or module. For use by formatters - # only (caches its result). - - def non_aliases - @non_aliases ||= classes_and_modules.reject { |cm| cm.is_alias_for } - end - - ## - # Updates the child modules or classes of class/module +parent+ by - # deleting the ones that have been removed from the documentation. - # - # +parent_hash+ is either parent.modules_hash or - # parent.classes_hash and +all_hash+ is ::all_modules_hash or - # ::all_classes_hash. - - def remove_nodoc_children - prefix = self.full_name + '::' - - modules_hash.each_key do |name| - full_name = prefix + name - modules_hash.delete name unless @store.modules_hash[full_name] - end - - classes_hash.each_key do |name| - full_name = prefix + name - classes_hash.delete name unless @store.classes_hash[full_name] - end - end - - def remove_things(my_things, other_files) # :nodoc: - my_things.delete_if do |file, things| - next false unless other_files.include? file - - things.each do |thing| - yield false, thing - end - - true - end - end - - ## - # Search record used by RDoc::Generator::JsonIndex - - def search_record - [ - name, - full_name, - full_name, - '', - path, - '', - snippet(@comment_location), - ] - end - - ## - # Sets the store for this class or module and its contained code objects. - - def store=(store) - super - - @attributes .each do |attr| attr.store = store end - @constants .each do |const| const.store = store end - @includes .each do |incl| incl.store = store end - @extends .each do |ext| ext.store = store end - @method_list.each do |meth| meth.store = store end - end - - ## - # Get the superclass of this class. Attempts to retrieve the superclass - # object, returns the name if it is not known. - - def superclass - @store.find_class_named(@superclass) || @superclass - end - - ## - # Set the superclass of this class to +superclass+ - # - # where +superclass+ is one of: - # - # - +nil+ - # - a String containing the full name of the superclass - # - the RDoc::ClassModule representing the superclass - - def superclass=(superclass) - raise NoMethodError, "#{full_name} is a module" if module? - case superclass - when RDoc::ClassModule - @superclass = superclass.full_name - when nil, String - @superclass = superclass - else - raise TypeError, "superclass must be a String or RDoc::ClassModule, not #{superclass.class}" - end - end - - ## - # Get all super classes of this class in an array. The last element might be - # a string if the name is unknown. - - def super_classes - result = [] - parent = self - while parent = parent.superclass - result << parent - return result if parent.is_a?(String) - end - result - end - - def to_s # :nodoc: - if is_alias_for then - "#{self.class.name} #{self.full_name} -> #{is_alias_for}" - else - super - end - end - - ## - # 'module' or 'class' - - def type - module? ? 'module' : 'class' - end - - ## - # Updates the child modules & classes by replacing the ones that are - # aliases through a constant. - # - # The aliased module/class is replaced in the children and in - # RDoc::Store#modules_hash or RDoc::Store#classes_hash - # by a copy that has RDoc::ClassModule#is_alias_for set to - # the aliased module/class, and this copy is added to #aliases - # of the aliased module/class. - # - # Formatters can use the #non_aliases method to retrieve children that - # are not aliases, for instance to list the namespace content, since - # the aliased modules are included in the constants of the class/module, - # that are listed separately. - - def update_aliases - constants.each do |const| - next unless cm = const.is_alias_for - cm_alias = cm.dup - cm_alias.name = const.name - - # Don't move top-level aliases under Object, they look ugly there - unless RDoc::TopLevel === cm_alias.parent then - cm_alias.parent = self - cm_alias.full_name = nil # force update for new parent - end - - cm_alias.aliases.clear - cm_alias.is_alias_for = cm - - if cm.module? then - @store.modules_hash[cm_alias.full_name] = cm_alias - modules_hash[const.name] = cm_alias - else - @store.classes_hash[cm_alias.full_name] = cm_alias - classes_hash[const.name] = cm_alias - end - - cm.aliases << cm_alias - end - end - - ## - # Deletes from #includes those whose module has been removed from the - # documentation. - #-- - # FIXME: includes are not reliably removed, see _possible_bug test case - - def update_includes - includes.reject! do |include| - mod = include.module - !(String === mod) && @store.modules_hash[mod.full_name].nil? - end - - includes.uniq! - end - - ## - # Deletes from #extends those whose module has been removed from the - # documentation. - #-- - # FIXME: like update_includes, extends are not reliably removed - - def update_extends - extends.reject! do |ext| - mod = ext.module - - !(String === mod) && @store.modules_hash[mod.full_name].nil? - end - - extends.uniq! - end - - def embed_mixins - return unless options.embed_mixins - - includes.each do |include| - next if String === include.module - include.module.method_list.each do |code_object| - add_method(prepare_to_embed(code_object)) - end - include.module.constants.each do |code_object| - add_constant(prepare_to_embed(code_object)) - end - include.module.attributes.each do |code_object| - add_attribute(prepare_to_embed(code_object)) - end - end - - extends.each do |ext| - next if String === ext.module - ext.module.method_list.each do |code_object| - add_method(prepare_to_embed(code_object, true)) - end - ext.module.attributes.each do |code_object| - add_attribute(prepare_to_embed(code_object, true)) - end - end - end - - private - - def prepare_to_embed(code_object, singleton=false) - code_object = code_object.dup - code_object.mixin_from = code_object.parent - code_object.singleton = true if singleton - set_current_section(code_object.section.title, code_object.section.comment) - # add_method and add_attribute will reassign self's visibility back to the method/attribute - # so we need to sync self's visibility with the object's to properly retain that information - self.visibility = code_object.visibility - code_object - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/constant.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/constant.rb deleted file mode 100644 index d5f54ed..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/constant.rb +++ /dev/null @@ -1,186 +0,0 @@ -# frozen_string_literal: true -## -# A constant - -class RDoc::Constant < RDoc::CodeObject - - MARSHAL_VERSION = 0 # :nodoc: - - ## - # Sets the module or class this is constant is an alias for. - - attr_writer :is_alias_for - - ## - # The constant's name - - attr_accessor :name - - ## - # The constant's value - - attr_accessor :value - - ## - # The constant's visibility - - attr_accessor :visibility - - ## - # Creates a new constant with +name+, +value+ and +comment+ - - def initialize(name, value, comment) - super() - - @name = name - @value = value - - @is_alias_for = nil - @visibility = :public - - self.comment = comment - end - - ## - # Constants are ordered by name - - def <=>(other) - return unless self.class === other - - [parent_name, name] <=> [other.parent_name, other.name] - end - - ## - # Constants are equal when their #parent and #name is the same - - def ==(other) - self.class == other.class and - @parent == other.parent and - @name == other.name - end - - ## - # A constant is documented if it has a comment, or is an alias - # for a documented class or module. - - def documented? - return true if super - return false unless @is_alias_for - case @is_alias_for - when String then - found = @store.find_class_or_module @is_alias_for - return false unless found - @is_alias_for = found - end - @is_alias_for.documented? - end - - ## - # Full constant name including namespace - - def full_name - @full_name ||= "#{parent_name}::#{@name}" - end - - ## - # The module or class this constant is an alias for - - def is_alias_for - case @is_alias_for - when String then - found = @store.find_class_or_module @is_alias_for - @is_alias_for = found if found - @is_alias_for - else - @is_alias_for - end - end - - def inspect # :nodoc: - "#<%s:0x%x %s::%s>" % [ - self.class, object_id, - parent_name, @name, - ] - end - - ## - # Dumps this Constant for use by ri. See also #marshal_load - - def marshal_dump - alias_name = case found = is_alias_for - when RDoc::CodeObject then found.full_name - else found - end - - [ MARSHAL_VERSION, - @name, - full_name, - @visibility, - alias_name, - parse(@comment), - @file.relative_name, - parent.name, - parent.class, - section.title, - ] - end - - ## - # Loads this Constant from +array+. For a loaded Constant the following - # methods will return cached values: - # - # * #full_name - # * #parent_name - - def marshal_load(array) - initialize array[1], nil, RDoc::Comment.from_document(array[5]) - - @full_name = array[2] - @visibility = array[3] || :public - @is_alias_for = array[4] - # 5 handled above - # 6 handled below - @parent_name = array[7] - @parent_class = array[8] - @section_title = array[9] - - @file = RDoc::TopLevel.new array[6] - end - - ## - # Path to this constant for use with HTML generator output. - - def path - "#{@parent.path}##{@name}" - end - - def pretty_print(q) # :nodoc: - q.group 2, "[#{self.class.name} #{full_name}", "]" do - unless comment.empty? then - q.breakable - q.text "comment:" - q.breakable - q.pp @comment - end - end - end - - ## - # Sets the store for this class or module and its contained code objects. - - def store=(store) - super - - @file = @store.add_file @file.full_name if @file - end - - def to_s # :nodoc: - parent_name = parent ? parent.full_name : '(unknown)' - if is_alias_for - "constant #{parent_name}::#@name -> #{is_alias_for}" - else - "constant #{parent_name}::#@name" - end - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/context.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/context.rb deleted file mode 100644 index 3a4dd0e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/context.rb +++ /dev/null @@ -1,1222 +0,0 @@ -# frozen_string_literal: true -## -# A Context is something that can hold modules, classes, methods, attributes, -# aliases, requires, and includes. Classes, modules, and files are all -# Contexts. - -class RDoc::Context < RDoc::CodeObject - - include Comparable - - ## - # Types of methods - - TYPES = %w[class instance] - - ## - # If a context has these titles it will be sorted in this order. - - TOMDOC_TITLES = [nil, 'Public', 'Internal', 'Deprecated'] # :nodoc: - TOMDOC_TITLES_SORT = TOMDOC_TITLES.sort_by { |title| title.to_s } # :nodoc: - - ## - # Class/module aliases - - attr_reader :aliases - - ## - # All attr* methods - - attr_reader :attributes - - ## - # Block params to be used in the next MethodAttr parsed under this context - - attr_accessor :block_params - - ## - # Constants defined - - attr_reader :constants - - ## - # Sets the current documentation section of documentation - - attr_writer :current_section - - ## - # Files this context is found in - - attr_reader :in_files - - ## - # Modules this context includes - - attr_reader :includes - - ## - # Modules this context is extended with - - attr_reader :extends - - ## - # Methods defined in this context - - attr_reader :method_list - - ## - # Name of this class excluding namespace. See also full_name - - attr_reader :name - - ## - # Files this context requires - - attr_reader :requires - - ## - # Use this section for the next method, attribute or constant added. - - attr_accessor :temporary_section - - ## - # Hash old_name => [aliases], for aliases - # that haven't (yet) been resolved to a method/attribute. - # (Not to be confused with the aliases of the context.) - - attr_accessor :unmatched_alias_lists - - ## - # Aliases that could not be resolved. - - attr_reader :external_aliases - - ## - # Current visibility of this context - - attr_accessor :visibility - - ## - # Current visibility of this line - - attr_writer :current_line_visibility - - ## - # Hash of registered methods. Attributes are also registered here, - # twice if they are RW. - - attr_reader :methods_hash - - ## - # Params to be used in the next MethodAttr parsed under this context - - attr_accessor :params - - ## - # Hash of registered constants. - - attr_reader :constants_hash - - ## - # Creates an unnamed empty context with public current visibility - - def initialize - super - - @in_files = [] - - @name ||= "unknown" - @parent = nil - @visibility = :public - - @current_section = Section.new self, nil, nil - @sections = { nil => @current_section } - @temporary_section = nil - - @classes = {} - @modules = {} - - initialize_methods_etc - end - - ## - # Sets the defaults for methods and so-forth - - def initialize_methods_etc - @method_list = [] - @attributes = [] - @aliases = [] - @requires = [] - @includes = [] - @extends = [] - @constants = [] - @external_aliases = [] - @current_line_visibility = nil - - # This Hash maps a method name to a list of unmatched aliases (aliases of - # a method not yet encountered). - @unmatched_alias_lists = {} - - @methods_hash = {} - @constants_hash = {} - - @params = nil - - @store ||= nil - end - - ## - # Contexts are sorted by full_name - - def <=>(other) - return nil unless RDoc::CodeObject === other - - full_name <=> other.full_name - end - - ## - # Adds an item of type +klass+ with the given +name+ and +comment+ to the - # context. - # - # Currently only RDoc::Extend and RDoc::Include are supported. - - def add(klass, name, comment) - if RDoc::Extend == klass then - ext = RDoc::Extend.new name, comment - add_extend ext - elsif RDoc::Include == klass then - incl = RDoc::Include.new name, comment - add_include incl - else - raise NotImplementedError, "adding a #{klass} is not implemented" - end - end - - ## - # Adds +an_alias+ that is automatically resolved - - def add_alias(an_alias) - return an_alias unless @document_self - - method_attr = find_method(an_alias.old_name, an_alias.singleton) || - find_attribute(an_alias.old_name, an_alias.singleton) - - if method_attr then - method_attr.add_alias an_alias, self - else - add_to @external_aliases, an_alias - unmatched_alias_list = - @unmatched_alias_lists[an_alias.pretty_old_name] ||= [] - unmatched_alias_list.push an_alias - end - - an_alias - end - - ## - # Adds +attribute+ if not already there. If it is (as method(s) or attribute), - # updates the comment if it was empty. - # - # The attribute is registered only if it defines a new method. - # For instance, attr_reader :foo will not be registered - # if method +foo+ exists, but attr_accessor :foo will be registered - # if method +foo+ exists, but foo= does not. - - def add_attribute(attribute) - return attribute unless @document_self - - # mainly to check for redefinition of an attribute as a method - # TODO find a policy for 'attr_reader :foo' + 'def foo=()' - register = false - - key = nil - - if attribute.rw.index 'R' then - key = attribute.pretty_name - known = @methods_hash[key] - - if known then - known.comment = attribute.comment if known.comment.empty? - elsif registered = @methods_hash[attribute.pretty_name + '='] and - RDoc::Attr === registered then - registered.rw = 'RW' - else - @methods_hash[key] = attribute - register = true - end - end - - if attribute.rw.index 'W' then - key = attribute.pretty_name + '=' - known = @methods_hash[key] - - if known then - known.comment = attribute.comment if known.comment.empty? - elsif registered = @methods_hash[attribute.pretty_name] and - RDoc::Attr === registered then - registered.rw = 'RW' - else - @methods_hash[key] = attribute - register = true - end - end - - if register then - attribute.visibility = @visibility - add_to @attributes, attribute - resolve_aliases attribute - end - - attribute - end - - ## - # Adds a class named +given_name+ with +superclass+. - # - # Both +given_name+ and +superclass+ may contain '::', and are - # interpreted relative to the +self+ context. This allows handling correctly - # examples like these: - # class RDoc::Gauntlet < Gauntlet - # module Mod - # class Object # implies < ::Object - # class SubObject < Object # this is _not_ ::Object - # - # Given class Container::Item RDoc assumes +Container+ is a module - # unless it later sees class Container. +add_class+ automatically - # upgrades +given_name+ to a class in this case. - - def add_class(class_type, given_name, superclass = '::Object') - # superclass +nil+ is passed by the C parser in the following cases: - # - registering Object in 1.8 (correct) - # - registering BasicObject in 1.9 (correct) - # - registering RubyVM in 1.9 in iseq.c (incorrect: < Object in vm.c) - # - # If we later find a superclass for a registered class with a nil - # superclass, we must honor it. - - # find the name & enclosing context - if given_name =~ /^:+(\w+)$/ then - full_name = $1 - enclosing = top_level - name = full_name.split(/:+/).last - else - full_name = child_name given_name - - if full_name =~ /^(.+)::(\w+)$/ then - name = $2 - ename = $1 - enclosing = @store.classes_hash[ename] || @store.modules_hash[ename] - # HACK: crashes in actionpack/lib/action_view/helpers/form_helper.rb (metaprogramming) - unless enclosing then - # try the given name at top level (will work for the above example) - enclosing = @store.classes_hash[given_name] || - @store.modules_hash[given_name] - return enclosing if enclosing - # not found: create the parent(s) - names = ename.split('::') - enclosing = self - names.each do |n| - enclosing = enclosing.classes_hash[n] || - enclosing.modules_hash[n] || - enclosing.add_module(RDoc::NormalModule, n) - end - end - else - name = full_name - enclosing = self - end - end - - # fix up superclass - if full_name == 'BasicObject' then - superclass = nil - elsif full_name == 'Object' then - superclass = '::BasicObject' - end - - # find the superclass full name - if superclass then - if superclass =~ /^:+/ then - superclass = $' #' - else - if superclass =~ /^(\w+):+(.+)$/ then - suffix = $2 - mod = find_module_named($1) - superclass = mod.full_name + '::' + suffix if mod - else - mod = find_module_named(superclass) - superclass = mod.full_name if mod - end - end - - # did we believe it was a module? - mod = @store.modules_hash.delete superclass - - upgrade_to_class mod, RDoc::NormalClass, mod.parent if mod - - # e.g., Object < Object - superclass = nil if superclass == full_name - end - - klass = @store.classes_hash[full_name] - - if klass then - # if TopLevel, it may not be registered in the classes: - enclosing.classes_hash[name] = klass - - # update the superclass if needed - if superclass then - existing = klass.superclass - existing = existing.full_name unless existing.is_a?(String) if existing - if existing.nil? || - (existing == 'Object' && superclass != 'Object') then - klass.superclass = superclass - end - end - else - # this is a new class - mod = @store.modules_hash.delete full_name - - if mod then - klass = upgrade_to_class mod, RDoc::NormalClass, enclosing - - klass.superclass = superclass unless superclass.nil? - else - klass = class_type.new name, superclass - - enclosing.add_class_or_module(klass, enclosing.classes_hash, - @store.classes_hash) - end - end - - klass.parent = self - - klass - end - - ## - # Adds the class or module +mod+ to the modules or - # classes Hash +self_hash+, and to +all_hash+ (either - # TopLevel::modules_hash or TopLevel::classes_hash), - # unless #done_documenting is +true+. Sets the #parent of +mod+ - # to +self+, and its #section to #current_section. Returns +mod+. - - def add_class_or_module(mod, self_hash, all_hash) - mod.section = current_section # TODO declaring context? something is - # wrong here... - mod.parent = self - mod.full_name = nil - mod.store = @store - - unless @done_documenting then - self_hash[mod.name] = mod - # this must be done AFTER adding mod to its parent, so that the full - # name is correct: - all_hash[mod.full_name] = mod - if @store.unmatched_constant_alias[mod.full_name] then - to, file = @store.unmatched_constant_alias[mod.full_name] - add_module_alias mod, mod.name, to, file - end - end - - mod - end - - ## - # Adds +constant+ if not already there. If it is, updates the comment, - # value and/or is_alias_for of the known constant if they were empty/nil. - - def add_constant(constant) - return constant unless @document_self - - # HACK: avoid duplicate 'PI' & 'E' in math.c (1.8.7 source code) - # (this is a #ifdef: should be handled by the C parser) - known = @constants_hash[constant.name] - - if known then - known.comment = constant.comment if known.comment.empty? - - known.value = constant.value if - known.value.nil? or known.value.strip.empty? - - known.is_alias_for ||= constant.is_alias_for - else - @constants_hash[constant.name] = constant - add_to @constants, constant - end - - constant - end - - ## - # Adds included module +include+ which should be an RDoc::Include - - def add_include(include) - add_to @includes, include - - include - end - - ## - # Adds extension module +ext+ which should be an RDoc::Extend - - def add_extend(ext) - add_to @extends, ext - - ext - end - - ## - # Adds +method+ if not already there. If it is (as method or attribute), - # updates the comment if it was empty. - - def add_method(method) - return method unless @document_self - - # HACK: avoid duplicate 'new' in io.c & struct.c (1.8.7 source code) - key = method.pretty_name - known = @methods_hash[key] - - if known then - if @store then # otherwise we are loading - known.comment = method.comment if known.comment.empty? - previously = ", previously in #{known.file}" unless - method.file == known.file - @store.options.warn \ - "Duplicate method #{known.full_name} in #{method.file}#{previously}" - end - else - @methods_hash[key] = method - if @current_line_visibility - method.visibility, @current_line_visibility = @current_line_visibility, nil - else - method.visibility = @visibility - end - add_to @method_list, method - resolve_aliases method - end - - method - end - - ## - # Adds a module named +name+. If RDoc already knows +name+ is a class then - # that class is returned instead. See also #add_class. - - def add_module(class_type, name) - mod = @classes[name] || @modules[name] - return mod if mod - - full_name = child_name name - mod = @store.modules_hash[full_name] || class_type.new(name) - - add_class_or_module mod, @modules, @store.modules_hash - end - - ## - # Adds a module by +RDoc::NormalModule+ instance. See also #add_module. - - def add_module_by_normal_module(mod) - add_class_or_module mod, @modules, @store.modules_hash - end - - ## - # Adds an alias from +from+ (a class or module) to +name+ which was defined - # in +file+. - - def add_module_alias(from, from_name, to, file) - return from if @done_documenting - - to_full_name = child_name to.name - - # if we already know this name, don't register an alias: - # see the metaprogramming in lib/active_support/basic_object.rb, - # where we already know BasicObject is a class when we find - # BasicObject = BlankSlate - return from if @store.find_class_or_module to_full_name - - unless from - @store.unmatched_constant_alias[child_name(from_name)] = [to, file] - return to - end - - new_to = from.dup - new_to.name = to.name - new_to.full_name = nil - - if new_to.module? then - @store.modules_hash[to_full_name] = new_to - @modules[to.name] = new_to - else - @store.classes_hash[to_full_name] = new_to - @classes[to.name] = new_to - end - - # Registers a constant for this alias. The constant value and comment - # will be updated later, when the Ruby parser adds the constant - const = RDoc::Constant.new to.name, nil, new_to.comment - const.record_location file - const.is_alias_for = from - add_constant const - - new_to - end - - ## - # Adds +require+ to this context's top level - - def add_require(require) - return require unless @document_self - - if RDoc::TopLevel === self then - add_to @requires, require - else - parent.add_require require - end - end - - ## - # Returns a section with +title+, creating it if it doesn't already exist. - # +comment+ will be appended to the section's comment. - # - # A section with a +title+ of +nil+ will return the default section. - # - # See also RDoc::Context::Section - - def add_section(title, comment = nil) - if section = @sections[title] then - section.add_comment comment if comment - else - section = Section.new self, title, comment - @sections[title] = section - end - - section - end - - ## - # Adds +thing+ to the collection +array+ - - def add_to(array, thing) - array << thing if @document_self - - thing.parent = self - thing.store = @store if @store - thing.section = current_section - end - - ## - # Is there any content? - # - # This means any of: comment, aliases, methods, attributes, external - # aliases, require, constant. - # - # Includes and extends are also checked unless includes == false. - - def any_content(includes = true) - @any_content ||= !( - @comment.empty? && - @method_list.empty? && - @attributes.empty? && - @aliases.empty? && - @external_aliases.empty? && - @requires.empty? && - @constants.empty? - ) - @any_content || (includes && !(@includes + @extends).empty? ) - end - - ## - # Creates the full name for a child with +name+ - - def child_name(name) - if name =~ /^:+/ - $' #' - elsif RDoc::TopLevel === self then - name - else - "#{self.full_name}::#{name}" - end - end - - ## - # Class attributes - - def class_attributes - @class_attributes ||= attributes.select { |a| a.singleton } - end - - ## - # Class methods - - def class_method_list - @class_method_list ||= method_list.select { |a| a.singleton } - end - - ## - # Array of classes in this context - - def classes - @classes.values - end - - ## - # All classes and modules in this namespace - - def classes_and_modules - classes + modules - end - - ## - # Hash of classes keyed by class name - - def classes_hash - @classes - end - - ## - # The current documentation section that new items will be added to. If - # temporary_section is available it will be used. - - def current_section - if section = @temporary_section then - @temporary_section = nil - else - section = @current_section - end - - section - end - - def display(method_attr) # :nodoc: - if method_attr.is_a? RDoc::Attr - "#{method_attr.definition} #{method_attr.pretty_name}" - else - "method #{method_attr.pretty_name}" - end - end - - ## - # Iterator for ancestors for duck-typing. Does nothing. See - # RDoc::ClassModule#each_ancestor. - # - # This method exists to make it easy to work with Context subclasses that - # aren't part of RDoc. - - def each_ancestor(&_) # :nodoc: - end - - ## - # Iterator for classes and modules - - def each_classmodule(&block) # :yields: module - classes_and_modules.sort.each(&block) - end - - ## - # Iterator for methods - - def each_method # :yields: method - return enum_for __method__ unless block_given? - - @method_list.sort.each { |m| yield m } - end - - ## - # Iterator for each section's contents sorted by title. The +section+, the - # section's +constants+ and the sections +attributes+ are yielded. The - # +constants+ and +attributes+ collections are sorted. - # - # To retrieve methods in a section use #methods_by_type with the optional - # +section+ parameter. - # - # NOTE: Do not edit collections yielded by this method - - def each_section # :yields: section, constants, attributes - return enum_for __method__ unless block_given? - - constants = @constants.group_by do |constant| constant.section end - attributes = @attributes.group_by do |attribute| attribute.section end - - constants.default = [] - attributes.default = [] - - sort_sections.each do |section| - yield section, constants[section].select(&:display?).sort, attributes[section].select(&:display?).sort - end - end - - ## - # Finds an attribute +name+ with singleton value +singleton+. - - def find_attribute(name, singleton) - name = $1 if name =~ /^(.*)=$/ - @attributes.find { |a| a.name == name && a.singleton == singleton } - end - - ## - # Finds an attribute with +name+ in this context - - def find_attribute_named(name) - case name - when /\A#/ then - find_attribute name[1..-1], false - when /\A::/ then - find_attribute name[2..-1], true - else - @attributes.find { |a| a.name == name } - end - end - - ## - # Finds a class method with +name+ in this context - - def find_class_method_named(name) - @method_list.find { |meth| meth.singleton && meth.name == name } - end - - ## - # Finds a constant with +name+ in this context - - def find_constant_named(name) - @constants.find do |m| - m.name == name || m.full_name == name - end - end - - ## - # Find a module at a higher scope - - def find_enclosing_module_named(name) - parent && parent.find_module_named(name) - end - - ## - # Finds an external alias +name+ with singleton value +singleton+. - - def find_external_alias(name, singleton) - @external_aliases.find { |m| m.name == name && m.singleton == singleton } - end - - ## - # Finds an external alias with +name+ in this context - - def find_external_alias_named(name) - case name - when /\A#/ then - find_external_alias name[1..-1], false - when /\A::/ then - find_external_alias name[2..-1], true - else - @external_aliases.find { |a| a.name == name } - end - end - - ## - # Finds an instance method with +name+ in this context - - def find_instance_method_named(name) - @method_list.find { |meth| !meth.singleton && meth.name == name } - end - - ## - # Finds a method, constant, attribute, external alias, module or file - # named +symbol+ in this context. - - def find_local_symbol(symbol) - find_method_named(symbol) or - find_constant_named(symbol) or - find_attribute_named(symbol) or - find_external_alias_named(symbol) or - find_module_named(symbol) or - @store.find_file_named(symbol) - end - - ## - # Finds a method named +name+ with singleton value +singleton+. - - def find_method(name, singleton) - @method_list.find { |m| - if m.singleton - m.name == name && m.singleton == singleton - else - m.name == name && !m.singleton && !singleton - end - } - end - - ## - # Finds a instance or module method with +name+ in this context - - def find_method_named(name) - case name - when /\A#/ then - find_method name[1..-1], false - when /\A::/ then - find_method name[2..-1], true - else - @method_list.find { |meth| meth.name == name } - end - end - - ## - # Find a module with +name+ using ruby's scoping rules - - def find_module_named(name) - res = @modules[name] || @classes[name] - return res if res - return self if self.name == name - find_enclosing_module_named name - end - - ## - # Look up +symbol+, first as a module, then as a local symbol. - - def find_symbol(symbol) - find_symbol_module(symbol) || find_local_symbol(symbol) - end - - ## - # Look up a module named +symbol+. - - def find_symbol_module(symbol) - result = nil - - # look for a class or module 'symbol' - case symbol - when /^::/ then - result = @store.find_class_or_module symbol - when /^(\w+):+(.+)$/ - suffix = $2 - top = $1 - searched = self - while searched do - mod = searched.find_module_named(top) - break unless mod - result = @store.find_class_or_module "#{mod.full_name}::#{suffix}" - break if result || searched.is_a?(RDoc::TopLevel) - searched = searched.parent - end - else - searched = self - while searched do - result = searched.find_module_named(symbol) - break if result || searched.is_a?(RDoc::TopLevel) - searched = searched.parent - end - end - - result - end - - ## - # The full name for this context. This method is overridden by subclasses. - - def full_name - '(unknown)' - end - - ## - # Does this context and its methods and constants all have documentation? - # - # (Yes, fully documented doesn't mean everything.) - - def fully_documented? - documented? and - attributes.all? { |a| a.documented? } and - method_list.all? { |m| m.documented? } and - constants.all? { |c| c.documented? } - end - - ## - # URL for this with a +prefix+ - - def http_url - path = name_for_path - path = path.gsub(/<<\s*(\w*)/, 'from-\1') if path =~ /<'class' or - # 'instance') and visibility (+:public+, +:protected+, +:private+). - # - # If +section+ is provided only methods in that RDoc::Context::Section will - # be returned. - - def methods_by_type(section = nil) - methods = {} - - TYPES.each do |type| - visibilities = {} - RDoc::VISIBILITIES.each do |vis| - visibilities[vis] = [] - end - - methods[type] = visibilities - end - - each_method do |method| - next if section and not method.section == section - methods[method.type][method.visibility] << method - end - - methods - end - - ## - # Yields AnyMethod and Attr entries matching the list of names in +methods+. - - def methods_matching(methods, singleton = false, &block) - (@method_list + @attributes).each do |m| - yield m if methods.include?(m.name) and m.singleton == singleton - end - - each_ancestor do |parent| - parent.methods_matching(methods, singleton, &block) - end - end - - ## - # Array of modules in this context - - def modules - @modules.values - end - - ## - # Hash of modules keyed by module name - - def modules_hash - @modules - end - - ## - # Name to use to generate the url. - # #full_name by default. - - def name_for_path - full_name - end - - ## - # Changes the visibility for new methods to +visibility+ - - def ongoing_visibility=(visibility) - @visibility = visibility - end - - ## - # Record +top_level+ as a file +self+ is in. - - def record_location(top_level) - @in_files << top_level unless @in_files.include?(top_level) - end - - ## - # Should we remove this context from the documentation? - # - # The answer is yes if: - # * #received_nodoc is +true+ - # * #any_content is +false+ (not counting includes) - # * All #includes are modules (not a string), and their module has - # #remove_from_documentation? == true - # * All classes and modules have #remove_from_documentation? == true - - def remove_from_documentation? - @remove_from_documentation ||= - @received_nodoc && - !any_content(false) && - @includes.all? { |i| !i.module.is_a?(String) && i.module.remove_from_documentation? } && - classes_and_modules.all? { |cm| cm.remove_from_documentation? } - end - - ## - # Removes methods and attributes with a visibility less than +min_visibility+. - #-- - # TODO mark the visibility of attributes in the template (if not public?) - - def remove_invisible(min_visibility) - return if [:private, :nodoc].include? min_visibility - remove_invisible_in @method_list, min_visibility - remove_invisible_in @attributes, min_visibility - remove_invisible_in @constants, min_visibility - end - - ## - # Only called when min_visibility == :public or :private - - def remove_invisible_in(array, min_visibility) # :nodoc: - if min_visibility == :public then - array.reject! { |e| - e.visibility != :public and not e.force_documentation - } - else - array.reject! { |e| - e.visibility == :private and not e.force_documentation - } - end - end - - ## - # Tries to resolve unmatched aliases when a method or attribute has just - # been added. - - def resolve_aliases(added) - # resolve any pending unmatched aliases - key = added.pretty_name - unmatched_alias_list = @unmatched_alias_lists[key] - return unless unmatched_alias_list - unmatched_alias_list.each do |unmatched_alias| - added.add_alias unmatched_alias, self - @external_aliases.delete unmatched_alias - end - @unmatched_alias_lists.delete key - end - - ## - # Returns RDoc::Context::Section objects referenced in this context for use - # in a table of contents. - - def section_contents - used_sections = {} - - each_method do |method| - next unless method.display? - - used_sections[method.section] = true - end - - # order found sections - sections = sort_sections.select do |section| - used_sections[section] - end - - # only the default section is used - return [] if - sections.length == 1 and not sections.first.title - - sections - end - - ## - # Sections in this context - - def sections - @sections.values - end - - def sections_hash # :nodoc: - @sections - end - - ## - # Sets the current section to a section with +title+. See also #add_section - - def set_current_section(title, comment) - @current_section = add_section title, comment - end - - ## - # Given an array +methods+ of method names, set the visibility of each to - # +visibility+ - - def set_visibility_for(methods, visibility, singleton = false) - methods_matching methods, singleton do |m| - m.visibility = visibility - end - end - - ## - # Given an array +names+ of constants, set the visibility of each constant to - # +visibility+ - - def set_constant_visibility_for(names, visibility) - names.each do |name| - constant = @constants_hash[name] or next - constant.visibility = visibility - end - end - - ## - # Sorts sections alphabetically (default) or in TomDoc fashion (none, - # Public, Internal, Deprecated) - - def sort_sections - titles = @sections.map { |title, _| title } - - if titles.length > 1 and - TOMDOC_TITLES_SORT == - (titles | TOMDOC_TITLES).sort_by { |title| title.to_s } then - @sections.values_at(*TOMDOC_TITLES).compact - else - @sections.sort_by { |title, _| - title.to_s - }.map { |_, section| - section - } - end - end - - def to_s # :nodoc: - "#{self.class.name} #{self.full_name}" - end - - ## - # Return the TopLevel that owns us - #-- - # FIXME we can be 'owned' by several TopLevel (see #record_location & - # #in_files) - - def top_level - return @top_level if defined? @top_level - @top_level = self - @top_level = @top_level.parent until RDoc::TopLevel === @top_level - @top_level - end - - ## - # Upgrades NormalModule +mod+ in +enclosing+ to a +class_type+ - - def upgrade_to_class(mod, class_type, enclosing) - enclosing.modules_hash.delete mod.name - - klass = RDoc::ClassModule.from_module class_type, mod - klass.store = @store - - # if it was there, then we keep it even if done_documenting - @store.classes_hash[mod.full_name] = klass - enclosing.classes_hash[mod.name] = klass - - klass - end - - autoload :Section, "#{__dir__}/context/section" - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/context/section.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/context/section.rb deleted file mode 100644 index 16b7781..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/context/section.rb +++ /dev/null @@ -1,176 +0,0 @@ -# frozen_string_literal: true -require 'cgi/escape' -require 'cgi/util' unless defined?(CGI::EscapeExt) - -## -# A section of documentation like: -# -# # :section: The title -# # The body -# -# Sections can be referenced multiple times and will be collapsed into a -# single section. - -class RDoc::Context::Section - - include RDoc::Text - - MARSHAL_VERSION = 0 # :nodoc: - - ## - # Section comment - - attr_reader :comment - - ## - # Section comments - - attr_reader :comments - - ## - # Context this Section lives in - - attr_reader :parent - - ## - # Section title - - attr_reader :title - - ## - # Creates a new section with +title+ and +comment+ - - def initialize(parent, title, comment) - @parent = parent - @title = title ? title.strip : title - - @comments = [] - - add_comment comment - end - - ## - # Sections are equal when they have the same #title - - def ==(other) - self.class === other and @title == other.title - end - - alias eql? == - - ## - # Adds +comment+ to this section - - def add_comment(comment) - comments = Array(comment) - comments.each do |c| - extracted_comment = extract_comment(c) - @comments << extracted_comment unless extracted_comment.empty? - end - end - - ## - # Anchor reference for linking to this section - - def aref - title = @title || '[untitled]' - - CGI.escape(title).gsub('%', '-').sub(/^-/, '') - end - - ## - # Extracts the comment for this section from the original comment block. - # If the first line contains :section:, strip it and use the rest. - # Otherwise remove lines up to the line containing :section:, and look - # for those lines again at the end and remove them. This lets us write - # - # # :section: The title - # # The body - - def extract_comment(comment) - case comment - when nil - RDoc::Comment.new '' - when RDoc::Comment then - if comment.text =~ /^#[ \t]*:section:.*\n/ then - start = $` - rest = $' - - comment.text = if start.empty? then - rest - else - rest.sub(/#{start.chomp}\Z/, '') - end - end - - comment - else - raise TypeError, "unknown comment #{comment.inspect}" - end - end - - def inspect # :nodoc: - "#<%s:0x%x %p>" % [self.class, object_id, title] - end - - def hash # :nodoc: - @title.hash - end - - ## - # The files comments in this section come from - - def in_files - @comments.map(&:file) - end - - ## - # Serializes this Section. The title and parsed comment are saved, but not - # the section parent which must be restored manually. - - def marshal_dump - [ - MARSHAL_VERSION, - @title, - parse, - ] - end - - ## - # De-serializes this Section. The section parent must be restored manually. - - def marshal_load(array) - @parent = nil - - @title = array[1] - @comments = array[2].parts.map { |doc| RDoc::Comment.from_document(doc) } - end - - ## - # Parses +comment_location+ into an RDoc::Markup::Document composed of - # multiple RDoc::Markup::Documents with their file set. - - def parse - RDoc::Markup::Document.new(*@comments.map(&:parse)) - end - - ## - # The section's title, or 'Top Section' if the title is nil. - # - # This is used by the table of contents template so the name is silly. - - def plain_html - @title || 'Top Section' - end - - ## - # Removes a comment from this section if it is from the same file as - # +comment+ - - def remove_comment(target_comment) - @comments.delete_if do |stored_comment| - stored_comment.file == target_comment.file - end - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/extend.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/extend.rb deleted file mode 100644 index 7d57433..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/extend.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true -## -# A Module extension to a class with \#extend -# -# RDoc::Extend.new 'Enumerable', 'comment ...' - -class RDoc::Extend < RDoc::Mixin - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/ghost_method.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/ghost_method.rb deleted file mode 100644 index 25f951e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/ghost_method.rb +++ /dev/null @@ -1,6 +0,0 @@ -# frozen_string_literal: true -## -# GhostMethod represents a method referenced only by a comment - -class RDoc::GhostMethod < RDoc::AnyMethod -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/include.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/include.rb deleted file mode 100644 index c3e0d45..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/include.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true -## -# A Module included in a class with \#include -# -# RDoc::Include.new 'Enumerable', 'comment ...' - -class RDoc::Include < RDoc::Mixin - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/meta_method.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/meta_method.rb deleted file mode 100644 index 8c95a0f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/meta_method.rb +++ /dev/null @@ -1,6 +0,0 @@ -# frozen_string_literal: true -## -# MetaMethod represents a meta-programmed method - -class RDoc::MetaMethod < RDoc::AnyMethod -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/method_attr.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/method_attr.rb deleted file mode 100644 index 16779fa..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/method_attr.rb +++ /dev/null @@ -1,411 +0,0 @@ -# frozen_string_literal: true -## -# Abstract class representing either a method or an attribute. - -class RDoc::MethodAttr < RDoc::CodeObject - - include Comparable - - ## - # Name of this method/attribute. - - attr_accessor :name - - ## - # public, protected, private - - attr_accessor :visibility - - ## - # Is this a singleton method/attribute? - - attr_accessor :singleton - - ## - # Source file token stream - - attr_reader :text - - ## - # Array of other names for this method/attribute - - attr_reader :aliases - - ## - # The method/attribute we're aliasing - - attr_accessor :is_alias_for - - #-- - # The attributes below are for AnyMethod only. - # They are left here for the time being to - # allow ri to operate. - # TODO modify ri to avoid calling these on attributes. - #++ - - ## - # Parameters yielded by the called block - - attr_reader :block_params - - ## - # Parameters for this method - - attr_accessor :params - - ## - # Different ways to call this method - - attr_accessor :call_seq - - ## - # The call_seq or the param_seq with method name, if there is no call_seq. - - attr_reader :arglists - - ## - # Creates a new MethodAttr from token stream +text+ and method or attribute - # name +name+. - # - # Usually this is called by super from a subclass. - - def initialize(text, name, singleton: false) - super() - - @text = text - @name = name - - @aliases = [] - @is_alias_for = nil - @parent_name = nil - @singleton = singleton - @visibility = :public - @see = false - - @arglists = nil - @block_params = nil - @call_seq = nil - @params = nil - end - - ## - # Resets cached data for the object so it can be rebuilt by accessor methods - - def initialize_copy(other) # :nodoc: - @full_name = nil - end - - def initialize_visibility # :nodoc: - super - @see = nil - end - - ## - # Order by #singleton then #name - - def <=>(other) - return unless other.respond_to?(:singleton) && - other.respond_to?(:name) - - [@singleton ? 0 : 1, name_ord_range, name] <=> - [other.singleton ? 0 : 1, other.name_ord_range, other.name] - end - - def ==(other) # :nodoc: - equal?(other) or self.class == other.class and full_name == other.full_name - end - - ## - # A method/attribute is documented if any of the following is true: - # - it was marked with :nodoc:; - # - it has a comment; - # - it is an alias for a documented method; - # - it has a +#see+ method that is documented. - - def documented? - super or - (is_alias_for and is_alias_for.documented?) or - (see and see.documented?) - end - - ## - # A method/attribute to look at, - # in particular if this method/attribute has no documentation. - # - # It can be a method/attribute of the superclass or of an included module, - # including the Kernel module, which is always appended to the included - # modules. - # - # Returns +nil+ if there is no such method/attribute. - # The +#is_alias_for+ method/attribute, if any, is not included. - # - # Templates may generate a "see also ..." if this method/attribute - # has documentation, and "see ..." if it does not. - - def see - @see = find_see if @see == false - @see - end - - ## - # Sets the store for this class or module and its contained code objects. - - def store=(store) - super - - @file = @store.add_file @file.full_name if @file - end - - def find_see # :nodoc: - return nil if singleton || is_alias_for - - # look for the method - other = find_method_or_attribute name - return other if other - - # if it is a setter, look for a getter - return nil unless name =~ /[a-z_]=$/i # avoid == or === - return find_method_or_attribute name[0..-2] - end - - def find_method_or_attribute(name) # :nodoc: - return nil unless parent.respond_to? :ancestors - - searched = parent.ancestors - kernel = @store.modules_hash['Kernel'] - - searched << kernel if kernel && - parent != kernel && !searched.include?(kernel) - - searched.each do |ancestor| - next if String === ancestor - next if parent == ancestor - - other = ancestor.find_method_named('#' + name) || - ancestor.find_attribute_named(name) - - return other if other - end - - nil - end - - ## - # Abstract method. Contexts in their building phase call this - # to register a new alias for this known method/attribute. - # - # - creates a new AnyMethod/Attribute named an_alias.new_name; - # - adds +self+ as an alias for the new method or attribute - # - adds the method or attribute to #aliases - # - adds the method or attribute to +context+. - - def add_alias(an_alias, context) - raise NotImplementedError - end - - ## - # HTML fragment reference for this method - - def aref - type = singleton ? 'c' : 'i' - # % characters are not allowed in html names => dash instead - "#{aref_prefix}-#{type}-#{html_name}" - end - - ## - # Prefix for +aref+, defined by subclasses. - - def aref_prefix - raise NotImplementedError - end - - ## - # Attempts to sanitize the content passed by the Ruby parser: - # remove outer parentheses, etc. - - def block_params=(value) - # 'yield.to_s' or 'assert yield, msg' - return @block_params = '' if value =~ /^[\.,]/ - - # remove trailing 'if/unless ...' - return @block_params = '' if value =~ /^(if|unless)\s/ - - value = $1.strip if value =~ /^(.+)\s(if|unless)\s/ - - # outer parentheses - value = $1 if value =~ /^\s*\((.*)\)\s*$/ - value = value.strip - - # proc/lambda - return @block_params = $1 if value =~ /^(proc|lambda)(\s*\{|\sdo)/ - - # surrounding +...+ or [...] - value = $1.strip if value =~ /^\+(.*)\+$/ - value = $1.strip if value =~ /^\[(.*)\]$/ - - return @block_params = '' if value.empty? - - # global variable - return @block_params = 'str' if value =~ /^\$[&0-9]$/ - - # wipe out array/hash indices - value.gsub!(/(\w)\[[^\[]+\]/, '\1') - - # remove @ from class/instance variables - value.gsub!(/@@?([a-z0-9_]+)/, '\1') - - # method calls => method name - value.gsub!(/([A-Z:a-z0-9_]+)\.([a-z0-9_]+)(\s*\(\s*[a-z0-9_.,\s]*\s*\)\s*)?/) do - case $2 - when 'to_s' then $1 - when 'const_get' then 'const' - when 'new' then - $1.split('::').last. # ClassName => class_name - gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2'). - gsub(/([a-z\d])([A-Z])/, '\1_\2'). - downcase - else - $2 - end - end - - # class prefixes - value.gsub!(/[A-Za-z0-9_:]+::/, '') - - # simple expressions - value = $1 if value =~ /^([a-z0-9_]+)\s*[-*+\/]/ - - @block_params = value.strip - end - - ## - # HTML id-friendly method/attribute name - - def html_name - require 'cgi/escape' - require 'cgi/util' unless defined?(CGI::EscapeExt) - - CGI.escape(@name.gsub('-', '-2D')).gsub('%', '-').sub(/^-/, '') - end - - ## - # Full method/attribute name including namespace - - def full_name - @full_name ||= "#{parent_name}#{pretty_name}" - end - - def inspect # :nodoc: - alias_for = @is_alias_for ? " (alias for #{@is_alias_for.name})" : nil - visibility = self.visibility - visibility = "forced #{visibility}" if force_documentation - "#<%s:0x%x %s (%s)%s>" % [ - self.class, object_id, - full_name, - visibility, - alias_for, - ] - end - - ## - # '::' for a class method/attribute, '#' for an instance method. - - def name_prefix - @singleton ? '::' : '#' - end - - ## - # Method/attribute name with class/instance indicator - - def pretty_name - "#{name_prefix}#{@name}" - end - - ## - # Type of method/attribute (class or instance) - - def type - singleton ? 'class' : 'instance' - end - - ## - # Path to this method for use with HTML generator output. - - def path - "#{@parent.path}##{aref}" - end - - ## - # Name of our parent with special handling for un-marshaled methods - - def parent_name - @parent_name || super - end - - def pretty_print(q) # :nodoc: - alias_for = - if @is_alias_for.respond_to? :name then - "alias for #{@is_alias_for.name}" - elsif Array === @is_alias_for then - "alias for #{@is_alias_for.last}" - end - - q.group 2, "[#{self.class.name} #{full_name} #{visibility}", "]" do - if alias_for then - q.breakable - q.text alias_for - end - - if text then - q.breakable - q.text "text:" - q.breakable - q.pp @text - end - - unless comment.empty? then - q.breakable - q.text "comment:" - q.breakable - q.pp @comment - end - end - end - - ## - # Used by RDoc::Generator::JsonIndex to create a record for the search - # engine. - - def search_record - [ - @name, - full_name, - @name, - @parent.full_name, - path, - params, - snippet(@comment), - ] - end - - def to_s # :nodoc: - if @is_alias_for - "#{self.class.name}: #{full_name} -> #{is_alias_for}" - else - "#{self.class.name}: #{full_name}" - end - end - - def name_ord_range # :nodoc: - case name.ord - when 0..64 # anything below "A" - 1 - when 91..96 # the symbols between "Z" and "a" - 2 - when 123..126 # 7-bit symbols above "z": "{", "|", "}", "~" - 3 - else # everythig else can be sorted as normal - 4 - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/mixin.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/mixin.rb deleted file mode 100644 index 9b425ef..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/mixin.rb +++ /dev/null @@ -1,120 +0,0 @@ -# frozen_string_literal: true -## -# A Mixin adds features from a module into another context. RDoc::Include and -# RDoc::Extend are both mixins. - -class RDoc::Mixin < RDoc::CodeObject - - ## - # Name of included module - - attr_accessor :name - - ## - # Creates a new Mixin for +name+ with +comment+ - - def initialize(name, comment) - super() - @name = name - self.comment = comment - @module = nil # cache for module if found - end - - ## - # Mixins are sorted by name - - def <=>(other) - return unless self.class === other - - name <=> other.name - end - - def ==(other) # :nodoc: - self.class === other and @name == other.name - end - - alias eql? == # :nodoc: - - ## - # Full name based on #module - - def full_name - m = self.module - RDoc::ClassModule === m ? m.full_name : @name - end - - def hash # :nodoc: - [@name, self.module].hash - end - - def inspect # :nodoc: - "#<%s:0x%x %s.%s %s>" % [ - self.class, - object_id, - parent_name, self.class.name.downcase, @name, - ] - end - - ## - # Attempts to locate the included module object. Returns the name if not - # known. - # - # The scoping rules of Ruby to resolve the name of an included module are: - # - first look into the children of the current context; - # - if not found, look into the children of included modules, - # in reverse inclusion order; - # - if still not found, go up the hierarchy of names. - # - # This method has O(n!) behavior when the module calling - # include is referencing nonexistent modules. Avoid calling #module until - # after all the files are parsed. This behavior is due to ruby's constant - # lookup behavior. - # - # As of the beginning of October, 2011, no gem includes nonexistent modules. - - def module - return @module if @module - - # search the current context - return @name unless parent - full_name = parent.child_name(@name) - @module = @store.modules_hash[full_name] - return @module if @module - return @name if @name =~ /^::/ - - # search the includes before this one, in reverse order - searched = parent.includes.take_while { |i| i != self }.reverse - searched.each do |i| - inc = i.module - next if String === inc - full_name = inc.child_name(@name) - @module = @store.modules_hash[full_name] - return @module if @module - end - - # go up the hierarchy of names - up = parent.parent - while up - full_name = up.child_name(@name) - @module = @store.modules_hash[full_name] - return @module if @module - up = up.parent - end - - @name - end - - ## - # Sets the store for this class or module and its contained code objects. - - def store=(store) - super - - @file = @store.add_file @file.full_name if @file - end - - def to_s # :nodoc: - "#{self.class.name.downcase} #@name in: #{parent}" - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/normal_class.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/normal_class.rb deleted file mode 100644 index 6b68d6d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/normal_class.rb +++ /dev/null @@ -1,92 +0,0 @@ -# frozen_string_literal: true -## -# A normal class, neither singleton nor anonymous - -class RDoc::NormalClass < RDoc::ClassModule - - ## - # The ancestors of this class including modules. Unlike Module#ancestors, - # this class is not included in the result. The result will contain both - # RDoc::ClassModules and Strings. - - def ancestors - if String === superclass then - super << superclass - elsif superclass then - ancestors = super - ancestors << superclass - ancestors.concat superclass.ancestors - else - super - end - end - - def aref_prefix # :nodoc: - 'class' - end - - ## - # The definition of this class, class MyClassName - - def definition - "class #{full_name}" - end - - def direct_ancestors - superclass ? super + [superclass] : super - end - - def inspect # :nodoc: - superclass = @superclass ? " < #{@superclass}" : nil - "<%s:0x%x class %s%s includes: %p extends: %p attributes: %p methods: %p aliases: %p>" % [ - self.class, object_id, - full_name, superclass, @includes, @extends, @attributes, @method_list, @aliases - ] - end - - def to_s # :nodoc: - display = "#{self.class.name} #{self.full_name}" - if superclass - display += ' < ' + (superclass.is_a?(String) ? superclass : superclass.full_name) - end - display += ' -> ' + is_alias_for.to_s if is_alias_for - display - end - - def pretty_print(q) # :nodoc: - superclass = @superclass ? " < #{@superclass}" : nil - - q.group 2, "[class #{full_name}#{superclass}", "]" do - q.breakable - q.text "includes:" - q.breakable - q.seplist @includes do |inc| q.pp inc end - - q.breakable - q.text "constants:" - q.breakable - q.seplist @constants do |const| q.pp const end - - q.breakable - q.text "attributes:" - q.breakable - q.seplist @attributes do |attr| q.pp attr end - - q.breakable - q.text "methods:" - q.breakable - q.seplist @method_list do |meth| q.pp meth end - - q.breakable - q.text "aliases:" - q.breakable - q.seplist @aliases do |aliaz| q.pp aliaz end - - q.breakable - q.text "comment:" - q.breakable - q.pp comment - end - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/normal_module.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/normal_module.rb deleted file mode 100644 index 677a9dc..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/normal_module.rb +++ /dev/null @@ -1,73 +0,0 @@ -# frozen_string_literal: true -## -# A normal module, like NormalClass - -class RDoc::NormalModule < RDoc::ClassModule - - def aref_prefix # :nodoc: - 'module' - end - - def inspect # :nodoc: - "#<%s:0x%x module %s includes: %p extends: %p attributes: %p methods: %p aliases: %p>" % [ - self.class, object_id, - full_name, @includes, @extends, @attributes, @method_list, @aliases - ] - end - - ## - # The definition of this module, module MyModuleName - - def definition - "module #{full_name}" - end - - ## - # This is a module, returns true - - def module? - true - end - - def pretty_print(q) # :nodoc: - q.group 2, "[module #{full_name}:", "]" do - q.breakable - q.text "includes:" - q.breakable - q.seplist @includes do |inc| q.pp inc end - q.breakable - - q.breakable - q.text "constants:" - q.breakable - q.seplist @constants do |const| q.pp const end - - q.text "attributes:" - q.breakable - q.seplist @attributes do |attr| q.pp attr end - q.breakable - - q.text "methods:" - q.breakable - q.seplist @method_list do |meth| q.pp meth end - q.breakable - - q.text "aliases:" - q.breakable - q.seplist @aliases do |aliaz| q.pp aliaz end - q.breakable - - q.text "comment:" - q.breakable - q.pp comment - end - end - - ## - # Modules don't have one, raises NoMethodError - - def superclass - raise NoMethodError, "#{full_name} is a module" - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/require.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/require.rb deleted file mode 100644 index f47e3b1..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/require.rb +++ /dev/null @@ -1,51 +0,0 @@ -# frozen_string_literal: true -## -# A file loaded by \#require - -class RDoc::Require < RDoc::CodeObject - - ## - # Name of the required file - - attr_accessor :name - - ## - # Creates a new Require that loads +name+ with +comment+ - - def initialize(name, comment) - super() - @name = name.gsub(/'|"/, "") #' - @top_level = nil - self.comment = comment - end - - def inspect # :nodoc: - "#<%s:0x%x require '%s' in %s>" % [ - self.class, - object_id, - @name, - @parent ? @parent.base_name : '(unknown)' - ] - end - - def to_s # :nodoc: - "require #{name} in: #{parent}" - end - - ## - # The RDoc::TopLevel corresponding to this require, or +nil+ if not found. - - def top_level - @top_level ||= begin - tl = RDoc::TopLevel.all_files_hash[name + '.rb'] - - if tl.nil? and RDoc::TopLevel.all_files.first.full_name =~ %r(^lib/) then - # second chance - tl = RDoc::TopLevel.all_files_hash['lib/' + name + '.rb'] - end - - tl - end - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/single_class.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/single_class.rb deleted file mode 100644 index 88a93a0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/single_class.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true -## -# A singleton class - -class RDoc::SingleClass < RDoc::ClassModule - - ## - # Adds the superclass to the included modules. - - def ancestors - superclass ? super + [superclass] : super - end - - def aref_prefix # :nodoc: - 'sclass' - end - - ## - # The definition of this singleton class, class << MyClassName - - def definition - "class << #{full_name}" - end - - def pretty_print(q) # :nodoc: - q.group 2, "[class << #{full_name}", "]" do - next - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/top_level.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/top_level.rb deleted file mode 100644 index eeeff02..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_object/top_level.rb +++ /dev/null @@ -1,273 +0,0 @@ -# frozen_string_literal: true -## -# A TopLevel context is a representation of the contents of a single file - -class RDoc::TopLevel < RDoc::Context - - MARSHAL_VERSION = 0 # :nodoc: - - ## - # Relative name of this file - - attr_accessor :relative_name - - ## - # Absolute name of this file - - attr_accessor :absolute_name - - ## - # All the classes or modules that were declared in - # this file. These are assigned to either +#classes_hash+ - # or +#modules_hash+ once we know what they really are. - - attr_reader :classes_or_modules - - ## - # The parser class that processed this file - - attr_reader :parser - - ## - # Creates a new TopLevel for the file at +absolute_name+. If documentation - # is being generated outside the source dir +relative_name+ is relative to - # the source directory. - - def initialize(absolute_name, relative_name = absolute_name) - super() - @name = nil - @absolute_name = absolute_name - @relative_name = relative_name - @parser = nil - - @classes_or_modules = [] - end - - ## - # Sets the parser for this toplevel context, also the store. - - def parser=(val) - @parser = val - @store.update_parser_of_file(absolute_name, val) if @store - @parser - end - - ## - # An RDoc::TopLevel is equal to another with the same relative_name - - def ==(other) - self.class === other and @relative_name == other.relative_name - end - - alias eql? == - - ## - # Adds +an_alias+ to +Object+ instead of +self+. - - def add_alias(an_alias) - object_class.record_location self - return an_alias unless @document_self - object_class.add_alias an_alias - end - - ## - # Adds +constant+ to +Object+ instead of +self+. - - def add_constant(constant) - object_class.record_location self - return constant unless @document_self - object_class.add_constant constant - end - - ## - # Adds +include+ to +Object+ instead of +self+. - - def add_include(include) - object_class.record_location self - return include unless @document_self - object_class.add_include include - end - - ## - # Adds +method+ to +Object+ instead of +self+. - - def add_method(method) - object_class.record_location self - return method unless @document_self - object_class.add_method method - end - - ## - # Adds class or module +mod+. Used in the building phase - # by the Ruby parser. - - def add_to_classes_or_modules(mod) - @classes_or_modules << mod - end - - ## - # Base name of this file - - def base_name - File.basename @relative_name - end - - alias name base_name - - ## - # Only a TopLevel that contains text file) will be displayed. See also - # RDoc::CodeObject#display? - - def display? - text? and super - end - - ## - # See RDoc::TopLevel::find_class_or_module - #-- - # TODO Why do we search through all classes/modules found, not just the - # ones of this instance? - - def find_class_or_module(name) - @store.find_class_or_module name - end - - ## - # Finds a class or module named +symbol+ - - def find_local_symbol(symbol) - find_class_or_module(symbol) || super - end - - ## - # Finds a module or class with +name+ - - def find_module_named(name) - find_class_or_module(name) - end - - ## - # Returns the relative name of this file - - def full_name - @relative_name - end - - ## - # An RDoc::TopLevel has the same hash as another with the same - # relative_name - - def hash - @relative_name.hash - end - - ## - # URL for this with a +prefix+ - - def http_url - @relative_name.tr('.', '_') + '.html' - end - - def inspect # :nodoc: - "#<%s:0x%x %p modules: %p classes: %p>" % [ - self.class, object_id, - base_name, - @modules.map { |n, m| m }, - @classes.map { |n, c| c } - ] - end - - ## - # Dumps this TopLevel for use by ri. See also #marshal_load - - def marshal_dump - [ - MARSHAL_VERSION, - @relative_name, - @parser, - parse(@comment), - ] - end - - ## - # Loads this TopLevel from +array+. - - def marshal_load(array) # :nodoc: - initialize array[1] - - @parser = array[2] - @comment = RDoc::Comment.from_document array[3] - end - - ## - # Returns the NormalClass "Object", creating it if not found. - # - # Records +self+ as a location in "Object". - - def object_class - @object_class ||= begin - oc = @store.find_class_named('Object') || add_class(RDoc::NormalClass, 'Object') - oc.record_location self - oc - end - end - - ## - # Base name of this file without the extension - - def page_name - basename = File.basename @relative_name - basename =~ /\.(rb|rdoc|txt|md)$/i - - $` || basename - end - - ## - # Path to this file for use with HTML generator output. - - def path - prefix = options.file_path_prefix - return http_url unless prefix - File.join(prefix, http_url) - end - - def pretty_print(q) # :nodoc: - q.group 2, "[#{self.class}: ", "]" do - q.text "base name: #{base_name.inspect}" - q.breakable - - items = @modules.map { |n, m| m } - items.concat @modules.map { |n, c| c } - q.seplist items do |mod| q.pp mod end - end - end - - ## - # Search record used by RDoc::Generator::JsonIndex - - def search_record - return unless @parser < RDoc::Parser::Text - - [ - page_name, - '', - page_name, - '', - path, - '', - snippet(@comment), - ] - end - - ## - # Is this TopLevel from a text file instead of a source code file? - - def text? - @parser and @parser.include? RDoc::Parser::Text - end - - def to_s # :nodoc: - "file #{full_name}" - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_objects.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_objects.rb deleted file mode 100644 index d5f2f92..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/code_objects.rb +++ /dev/null @@ -1,5 +0,0 @@ -# frozen_string_literal: true -# This file was used to load all the RDoc::CodeObject subclasses at once. Now -# autoload handles this. - -require_relative '../rdoc' diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/comment.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/comment.rb deleted file mode 100644 index b269ec4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/comment.rb +++ /dev/null @@ -1,236 +0,0 @@ -# frozen_string_literal: true -## -# A comment holds the text comment for a RDoc::CodeObject and provides a -# unified way of cleaning it up and parsing it into an RDoc::Markup::Document. -# -# Each comment may have a different markup format set by #format=. By default -# 'rdoc' is used. The :markup: directive tells RDoc which format to use. -# -# See RDoc::MarkupReference@Directive+for+Specifying+RDoc+Source+Format. - - -class RDoc::Comment - - include RDoc::Text - - ## - # The format of this comment. Defaults to RDoc::Markup - - attr_reader :format - - ## - # The RDoc::TopLevel this comment was found in - - attr_accessor :location - - ## - # Line where this Comment was written - - attr_accessor :line - - ## - # For duck-typing when merging classes at load time - - alias file location # :nodoc: - - ## - # The text for this comment - - attr_reader :text - - ## - # Alias for text - - alias to_s text - - ## - # Overrides the content returned by #parse. Use when there is no #text - # source for this comment - - attr_writer :document - - ## - # Creates a new comment with +text+ that is found in the RDoc::TopLevel - # +location+. - - def initialize(text = nil, location = nil, language = nil) - @location = location - @text = text.nil? ? nil : text.dup - @language = language - - @document = nil - @format = 'rdoc' - @normalized = false - end - - ## - #-- - # TODO deep copy @document - - def initialize_copy(copy) # :nodoc: - @text = copy.text.dup - end - - def ==(other) # :nodoc: - self.class === other and - other.text == @text and other.location == @location - end - - ## - # Look for a 'call-seq' in the comment to override the normal parameter - # handling. The :call-seq: is indented from the baseline. All lines of the - # same indentation level and prefix are consumed. - # - # For example, all of the following will be used as the :call-seq: - # - # # :call-seq: - # # ARGF.readlines(sep=$/) -> array - # # ARGF.readlines(limit) -> array - # # ARGF.readlines(sep, limit) -> array - # # - # # ARGF.to_a(sep=$/) -> array - # # ARGF.to_a(limit) -> array - # # ARGF.to_a(sep, limit) -> array - - def extract_call_seq - # we must handle situations like the above followed by an unindented first - # comment. The difficulty is to make sure not to match lines starting - # with ARGF at the same indent, but that are after the first description - # paragraph. - if /^(? ((?!\n)\s)*+ (?# whitespaces except newline)) - :?call-seq: - (? \g(?\n|\z) (?# trailing spaces))? - (? - (\g(?!\w)\S.*\g)* - (?> - (? \g\w+ (?# ' # ARGF' in the example above)) - .*\g)? - (\g\S.*\g (?# other non-blank line))*+ - (\g+(\k.*\g (?# ARGF.to_a lines))++)*+ - ) - (?m:^\s*$|\z) - /x =~ @text - seq = $~[:seq] - - all_start, all_stop = $~.offset(0) - @text.slice! all_start...all_stop - - seq.gsub!(/^\s*/, '') - end - end - - ## - # A comment is empty if its text String is empty. - - def empty? - @text.empty? && (@document.nil? || @document.empty?) - end - - ## - # HACK dubious - - def encode!(encoding) - @text = String.new @text, encoding: encoding - self - end - - ## - # Sets the format of this comment and resets any parsed document - - def format=(format) - @format = format - @document = nil - end - - def inspect # :nodoc: - location = @location ? @location.relative_name : '(unknown)' - - "#<%s:%x %s %p>" % [self.class, object_id, location, @text] - end - - ## - # Normalizes the text. See RDoc::Text#normalize_comment for details - - def normalize - return self unless @text - return self if @normalized # TODO eliminate duplicate normalization - - @text = normalize_comment @text - - @normalized = true - - self - end - - ## - # Was this text normalized? - - def normalized? # :nodoc: - @normalized - end - - ## - # Parses the comment into an RDoc::Markup::Document. The parsed document is - # cached until the text is changed. - - def parse - return @document if @document - - @document = super @text, @format - @document.file = @location - @document - end - - ## - # Removes private sections from this comment. Private sections are flush to - # the comment marker and start with -- and end with ++. - # For C-style comments, a private marker may not start at the opening of the - # comment. - # - # /* - # *-- - # * private - # *++ - # * public - # */ - - def remove_private - # Workaround for gsub encoding for Ruby 1.9.2 and earlier - empty = '' - empty = RDoc::Encoding.change_encoding empty, @text.encoding - - @text = @text.gsub(%r%^\s*([#*]?)--.*?^\s*(\1)\+\+\n?%m, empty) - @text = @text.sub(%r%^\s*[#*]?--.*%m, '') - end - - ## - # Replaces this comment's text with +text+ and resets the parsed document. - # - # An error is raised if the comment contains a document but no text. - - def text=(text) - raise RDoc::Error, 'replacing document-only comment is not allowed' if - @text.nil? and @document - - @document = nil - @text = text.nil? ? nil : text.dup - end - - ## - # Returns true if this comment is in TomDoc format. - - def tomdoc? - @format == 'tomdoc' - end - - ## - # Create a new parsed comment from a document - - def self.from_document(document) # :nodoc: - comment = RDoc::Comment.new('') - comment.document = document - comment.location = RDoc::TopLevel.new(document.file) if document.file - comment - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/cross_reference.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/cross_reference.rb deleted file mode 100644 index a942d33..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/cross_reference.rb +++ /dev/null @@ -1,228 +0,0 @@ -# frozen_string_literal: true - -require_relative 'markup/attribute_manager' # for PROTECT_ATTR - -## -# RDoc::CrossReference is a reusable way to create cross references for names. - -class RDoc::CrossReference - - ## - # Regular expression to match class references - # - # 1. There can be a '\\' in front of text to suppress the cross-reference - # 2. There can be a '::' in front of class names to reference from the - # top-level namespace. - # 3. The method can be followed by parenthesis (not recommended) - - CLASS_REGEXP_STR = '\\\\?((?:\:{2})?[A-Z]\w*(?:\:\:\w+)*)' - - ## - # Regular expression to match a single method argument. - - METHOD_ARG_REGEXP_STR = '[\w.+*/=<>-]+' - - ## - # Regular expression to match method arguments. - - METHOD_ARGS_REGEXP_STR = /(?:\((?:#{METHOD_ARG_REGEXP_STR}(?:,\s*#{METHOD_ARG_REGEXP_STR})*)?\))?/.source - - ## - # Regular expression to match method references. - # - # See CLASS_REGEXP_STR - - METHOD_REGEXP_STR = /( - (?!\d)[\w#{RDoc::Markup::AttributeManager::PROTECT_ATTR}]+[!?=]?| - %|=(?:==?|~)|![=~]|\[\]=?|<(?:<|=>?)?|>[>=]?|[-+!]@?|\*\*?|[\/%\`|&^~] - )#{METHOD_ARGS_REGEXP_STR}/.source.delete("\n ").freeze - - ## - # Regular expressions matching text that should potentially have - # cross-reference links generated are passed to add_regexp_handling. Note - # that these expressions are meant to pick up text for which cross-references - # have been suppressed, since the suppression characters are removed by the - # code that is triggered. - - CROSSREF_REGEXP = /(?:^|[\s()]) - ( - (?: - # A::B::C.meth - #{CLASS_REGEXP_STR}(?:[.#]|::)#{METHOD_REGEXP_STR} - - # A::B::C - # The stuff after CLASS_REGEXP_STR is a - # nasty hack. CLASS_REGEXP_STR unfortunately matches - # words like dog and cat (these are legal "class" - # names in Fortran 95). When a word is flagged as a - # potential cross-reference, limitations in the markup - # engine suppress other processing, such as typesetting. - # This is particularly noticeable for contractions. - # In order that words like "can't" not - # be flagged as potential cross-references, only - # flag potential class cross-references if the character - # after the cross-reference is a space, sentence - # punctuation, tag start character, or attribute - # marker. - | #{CLASS_REGEXP_STR}(?=[@\s).?!,;<\000]|\z) - - # Stand-alone method (preceded by a #) - | \\?\##{METHOD_REGEXP_STR} - - # Stand-alone method (preceded by ::) - | ::#{METHOD_REGEXP_STR} - - # Things that look like filenames - # The key thing is that there must be at least - # one special character (period, slash, or - # underscore). - | (?:\.\.\/)*[-\/\w]+[_\/.][-\w\/.]+ - - # Things that have markup suppressed - # Don't process things like '\<' in \, though. - # TODO: including < is a hack, not very satisfying. - | \\[^\s<] - ) - - # labels for headings - (?:@[\w+%-]+(?:\.[\w|%-]+)?)? - )/x - - ## - # Version of CROSSREF_REGEXP used when --hyperlink-all is specified. - - ALL_CROSSREF_REGEXP = / - (?:^|[\s()]) - ( - (?: - # A::B::C.meth - #{CLASS_REGEXP_STR}(?:[.#]|::)#{METHOD_REGEXP_STR} - - # A::B::C - | #{CLASS_REGEXP_STR}(?=[@\s).?!,;<\000]|\z) - - # Stand-alone method - | \\?#{METHOD_REGEXP_STR} - - # Things that look like filenames - | (?:\.\.\/)*[-\/\w]+[_\/.][-\w\/.]+ - - # Things that have markup suppressed - | \\[^\s<] - ) - - # labels for headings - (?:@[\w+%-]+)? - )/x - - ## - # Hash of references that have been looked-up to their replacements - - attr_accessor :seen - - ## - # Allows cross-references to be created based on the given +context+ - # (RDoc::Context). - - def initialize(context) - @context = context - @store = context.store - - @seen = {} - end - - ## - # Returns a method reference to +name+. - - def resolve_method(name) - ref = nil - - if /#{CLASS_REGEXP_STR}([.#]|::)#{METHOD_REGEXP_STR}/o =~ name then - type = $2 - if '.' == type # will find either #method or ::method - method = $3 - else - method = "#{type}#{$3}" - end - container = @context.find_symbol_module($1) - elsif /^([.#]|::)#{METHOD_REGEXP_STR}/o =~ name then - type = $1 - if '.' == type - method = $2 - else - method = "#{type}#{$2}" - end - container = @context - else - type = nil - container = nil - end - - if container then - unless RDoc::TopLevel === container then - if '.' == type then - if 'new' == method then # AnyClassName.new will be class method - ref = container.find_local_symbol method - ref = container.find_ancestor_local_symbol method unless ref - else - ref = container.find_local_symbol "::#{method}" - ref = container.find_ancestor_local_symbol "::#{method}" unless ref - ref = container.find_local_symbol "##{method}" unless ref - ref = container.find_ancestor_local_symbol "##{method}" unless ref - end - else - ref = container.find_local_symbol method - ref = container.find_ancestor_local_symbol method unless ref - end - end - end - - ref - end - - ## - # Returns a reference to +name+. - # - # If the reference is found and +name+ is not documented +text+ will be - # returned. If +name+ is escaped +name+ is returned. If +name+ is not - # found +text+ is returned. - - def resolve(name, text) - return @seen[name] if @seen.include? name - - ref = case name - when /^\\(#{CLASS_REGEXP_STR})$/o then - @context.find_symbol $1 - else - @context.find_symbol name - end - - ref = resolve_method name unless ref - - # Try a page name - ref = @store.page name if not ref and name =~ /^[\w.]+$/ - - ref = nil if RDoc::Alias === ref # external alias, can't link to it - - out = if name == '\\' then - name - elsif name =~ /^\\/ then - # we remove the \ only in front of what we know: - # other backslashes are treated later, only outside of - ref ? $' : name - elsif ref then - if ref.display? then - ref - else - text - end - else - text - end - - @seen[name] = out - - out - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/encoding.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/encoding.rb deleted file mode 100644 index 78dbe87..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/encoding.rb +++ /dev/null @@ -1,120 +0,0 @@ -# coding: US-ASCII -# frozen_string_literal: true - -## -# This class is a wrapper around File IO and Encoding that helps RDoc load -# files and convert them to the correct encoding. - -module RDoc::Encoding - - HEADER_REGEXP = /^ - (?: - \A\#!.*\n - | - ^\#\s+frozen[-_]string[-_]literal[=:].+\n - | - ^\#[^\n]+\b(?:en)?coding[=:]\s*(?[^\s;]+).*\n - | - <\?xml[^?]*encoding=(?["'])(?.*?)\k.*\n - )+ - /xi # :nodoc: - - ## - # Reads the contents of +filename+ and handles any encoding directives in - # the file. - # - # The content will be converted to the +encoding+. If the file cannot be - # converted a warning will be printed and nil will be returned. - # - # If +force_transcode+ is true the document will be transcoded and any - # unknown character in the target encoding will be replaced with '?' - - def self.read_file(filename, encoding, force_transcode = false) - content = File.open filename, "rb" do |f| f.read end - content.gsub!("\r\n", "\n") if RUBY_PLATFORM =~ /mswin|mingw/ - - utf8 = content.sub!(/\A\xef\xbb\xbf/, '') - - enc = RDoc::Encoding.detect_encoding content - content = RDoc::Encoding.change_encoding content, enc if enc - - begin - encoding ||= Encoding.default_external - orig_encoding = content.encoding - - if not orig_encoding.ascii_compatible? then - content = content.encode encoding - elsif utf8 then - content = RDoc::Encoding.change_encoding content, Encoding::UTF_8 - content = content.encode encoding - else - # assume the content is in our output encoding - content = RDoc::Encoding.change_encoding content, encoding - end - - unless content.valid_encoding? then - # revert and try to transcode - content = RDoc::Encoding.change_encoding content, orig_encoding - content = content.encode encoding - end - - unless content.valid_encoding? then - warn "unable to convert #{filename} to #{encoding}, skipping" - content = nil - end - rescue Encoding::InvalidByteSequenceError, - Encoding::UndefinedConversionError => e - if force_transcode then - content = RDoc::Encoding.change_encoding content, orig_encoding - content = content.encode(encoding, - :invalid => :replace, - :undef => :replace, - :replace => '?') - return content - else - warn "unable to convert #{e.message} for #{filename}, skipping" - return nil - end - end - - content - rescue ArgumentError => e - raise unless e.message =~ /unknown encoding name - (.*)/ - warn "unknown encoding name \"#{$1}\" for #{filename}, skipping" - nil - rescue Errno::EISDIR, Errno::ENOENT - nil - end - - ## - # Detects the encoding of +string+ based on the magic comment - - def self.detect_encoding(string) - result = HEADER_REGEXP.match string - name = result && result[:name] - - name ? Encoding.find(name) : nil - end - - ## - # Removes magic comments and shebang - - def self.remove_magic_comment(string) - string.sub HEADER_REGEXP do |s| - s.gsub(/[^\n]/, '') - end - end - - ## - # Changes encoding based on +encoding+ without converting and returns new - # string - - def self.change_encoding(text, encoding) - if text.kind_of? RDoc::Comment - text.encode! encoding - else - String.new text, encoding: encoding - end - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/erb_partial.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/erb_partial.rb deleted file mode 100644 index bad02ea..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/erb_partial.rb +++ /dev/null @@ -1,18 +0,0 @@ -# frozen_string_literal: true -## -# Allows an ERB template to be rendered in the context (binding) of an -# existing ERB template evaluation. - -class RDoc::ERBPartial < ERB - - ## - # Overrides +compiler+ startup to set the +eoutvar+ to an empty string only - # if it isn't already set. - - def set_eoutvar(compiler, eoutvar = '_erbout') - super - - compiler.pre_cmd = ["#{eoutvar} ||= +''"] - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/erbio.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/erbio.rb deleted file mode 100644 index e955eed..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/erbio.rb +++ /dev/null @@ -1,37 +0,0 @@ -# frozen_string_literal: true -require 'erb' - -## -# A subclass of ERB that writes directly to an IO. Credit to Aaron Patterson -# and Masatoshi SEKI. -# -# To use: -# -# erbio = RDoc::ERBIO.new '<%= "hello world" %>', nil, nil -# -# File.open 'hello.txt', 'w' do |io| -# erbio.result binding -# end -# -# Note that binding must enclose the io you wish to output on. - -class RDoc::ERBIO < ERB - - ## - # Defaults +eoutvar+ to 'io', otherwise is identical to ERB's initialize - - def initialize(str, trim_mode: nil, eoutvar: 'io') - super(str, trim_mode: trim_mode, eoutvar: eoutvar) - end - - ## - # Instructs +compiler+ how to write to +io_variable+ - - def set_eoutvar(compiler, io_variable) - compiler.put_cmd = "#{io_variable}.write" - compiler.insert_cmd = "#{io_variable}.write" - compiler.pre_cmd = [] - compiler.post_cmd = [] - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator.rb deleted file mode 100644 index a769cf8..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator.rb +++ /dev/null @@ -1,51 +0,0 @@ -# frozen_string_literal: true -## -# RDoc uses generators to turn parsed source code in the form of an -# RDoc::CodeObject tree into some form of output. RDoc comes with the HTML -# generator RDoc::Generator::Darkfish and an ri data generator -# RDoc::Generator::RI. -# -# == Registering a Generator -# -# Generators are registered by calling RDoc::RDoc.add_generator with the class -# of the generator: -# -# class My::Awesome::Generator -# RDoc::RDoc.add_generator self -# end -# -# == Adding Options to +rdoc+ -# -# Before option processing in +rdoc+, RDoc::Options will call ::setup_options -# on the generator class with an RDoc::Options instance. The generator can -# use RDoc::Options#option_parser to add command-line options to the +rdoc+ -# tool. See RDoc::Options@Custom+Options for an example and see OptionParser -# for details on how to add options. -# -# You can extend the RDoc::Options instance with additional accessors for your -# generator. -# -# == Generator Instantiation -# -# After parsing, RDoc::RDoc will instantiate a generator by calling -# #initialize with an RDoc::Store instance and an RDoc::Options instance. -# -# The RDoc::Store instance holds documentation for parsed source code. In -# RDoc 3 and earlier the RDoc::TopLevel class held this data. When upgrading -# a generator from RDoc 3 and earlier you should only need to replace -# RDoc::TopLevel with the store instance. -# -# RDoc will then call #generate on the generator instance. You can use the -# various methods on RDoc::Store and in the RDoc::CodeObject tree to create -# your desired output format. - -module RDoc::Generator - - autoload :Markup, "#{__dir__}/generator/markup" - - autoload :Darkfish, "#{__dir__}/generator/darkfish" - autoload :JsonIndex, "#{__dir__}/generator/json_index" - autoload :RI, "#{__dir__}/generator/ri" - autoload :POT, "#{__dir__}/generator/pot" - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/darkfish.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/darkfish.rb deleted file mode 100644 index 7fec365..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/darkfish.rb +++ /dev/null @@ -1,812 +0,0 @@ -# frozen_string_literal: true -# -*- mode: ruby; ruby-indent-level: 2; tab-width: 2 -*- - -require 'erb' -require 'fileutils' -require 'pathname' -require_relative 'markup' - -## -# Darkfish RDoc HTML Generator -# -# $Id: darkfish.rb 52 2009-01-07 02:08:11Z deveiant $ -# -# == Author/s -# * Michael Granger (ged@FaerieMUD.org) -# -# == Contributors -# * Mahlon E. Smith (mahlon@martini.nu) -# * Eric Hodel (drbrain@segment7.net) -# -# == License -# -# Copyright (c) 2007, 2008, Michael Granger. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# * Neither the name of the author/s, nor the names of the project's -# contributors may be used to endorse or promote products derived from this -# software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# == Attributions -# -# Darkfish uses the {Silk Icons}[http://www.famfamfam.com/lab/icons/silk/] set -# by Mark James. - -class RDoc::Generator::Darkfish - - RDoc::RDoc.add_generator self - - include ERB::Util - - ## - # Stylesheets, fonts, etc. that are included in RDoc. - - BUILTIN_STYLE_ITEMS = # :nodoc: - %w[ - css/fonts.css - fonts/Lato-Light.ttf - fonts/Lato-LightItalic.ttf - fonts/Lato-Regular.ttf - fonts/Lato-RegularItalic.ttf - fonts/SourceCodePro-Bold.ttf - fonts/SourceCodePro-Regular.ttf - css/rdoc.css - ] - - ## - # Release Version - - VERSION = '3' - - ## - # Description of this generator - - DESCRIPTION = 'HTML generator, written by Michael Granger' - - ## - # The relative path to style sheets and javascript. By default this is set - # the same as the rel_prefix. - - attr_accessor :asset_rel_path - - ## - # The path to generate files into, combined with --op from the - # options for a full path. - - attr_reader :base_dir - - ## - # Classes and modules to be used by this generator, not necessarily - # displayed. See also #modsort - - attr_reader :classes - - ## - # No files will be written when dry_run is true. - - attr_accessor :dry_run - - ## - # When false the generate methods return a String instead of writing to a - # file. The default is true. - - attr_accessor :file_output - - ## - # Files to be displayed by this generator - - attr_reader :files - - ## - # The JSON index generator for this Darkfish generator - - attr_reader :json_index - - ## - # Methods to be displayed by this generator - - attr_reader :methods - - ## - # Sorted list of classes and modules to be displayed by this generator - - attr_reader :modsort - - ## - # The RDoc::Store that is the source of the generated content - - attr_reader :store - - ## - # The directory where the template files live - - attr_reader :template_dir # :nodoc: - - ## - # The output directory - - attr_reader :outputdir - - ## - # Initialize a few instance variables before we start - - def initialize(store, options) - @store = store - @options = options - - @asset_rel_path = '' - @base_dir = Pathname.pwd.expand_path - @dry_run = @options.dry_run - @file_output = true - @template_dir = Pathname.new options.template_dir - @template_cache = {} - - @classes = nil - @context = nil - @files = nil - @methods = nil - @modsort = nil - - @json_index = RDoc::Generator::JsonIndex.new self, options - end - - ## - # Output progress information if debugging is enabled - - def debug_msg *msg - return unless $DEBUG_RDOC - $stderr.puts(*msg) - end - - ## - # Create the directories the generated docs will live in if they don't - # already exist. - - def gen_sub_directories - @outputdir.mkpath - end - - ## - # Copy over the stylesheet into the appropriate place in the output - # directory. - - def write_style_sheet - debug_msg "Copying static files" - options = { :verbose => $DEBUG_RDOC, :noop => @dry_run } - - BUILTIN_STYLE_ITEMS.each do |item| - install_rdoc_static_file @template_dir + item, "./#{item}", options - end - - unless @options.template_stylesheets.empty? - FileUtils.cp @options.template_stylesheets, '.', **options - end - - Dir[(@template_dir + "{js,images}/**/*").to_s].each do |path| - next if File.directory? path - next if File.basename(path) =~ /^\./ - - dst = Pathname.new(path).relative_path_from @template_dir - - install_rdoc_static_file @template_dir + path, dst, options - end - end - - ## - # Build the initial indices and output objects based on an array of TopLevel - # objects containing the extracted information. - - def generate - setup - - write_style_sheet - generate_index - generate_class_files - generate_file_files - generate_table_of_contents - @json_index.generate - @json_index.generate_gzipped - - copy_static - - rescue => e - debug_msg "%s: %s\n %s" % [ - e.class.name, e.message, e.backtrace.join("\n ") - ] - - raise - end - - ## - # Copies static files from the static_path into the output directory - - def copy_static - return if @options.static_path.empty? - - fu_options = { :verbose => $DEBUG_RDOC, :noop => @dry_run } - - @options.static_path.each do |path| - unless File.directory? path then - FileUtils.install path, @outputdir, **fu_options.merge(:mode => 0644) - next - end - - Dir.chdir path do - Dir[File.join('**', '*')].each do |entry| - dest_file = @outputdir + entry - - if File.directory? entry then - FileUtils.mkdir_p entry, **fu_options - else - FileUtils.install entry, dest_file, **fu_options.merge(:mode => 0644) - end - end - end - end - end - - ## - # Return a list of the documented modules sorted by salience first, then - # by name. - - def get_sorted_module_list(classes) - classes.select do |klass| - klass.display? - end.sort - end - - ## - # Generate an index page which lists all the classes which are documented. - - def generate_index - template_file = @template_dir + 'index.rhtml' - return unless template_file.exist? - - debug_msg "Rendering the index page..." - - out_file = @base_dir + @options.op_dir + 'index.html' - rel_prefix = @outputdir.relative_path_from out_file.dirname - search_index_rel_prefix = rel_prefix - search_index_rel_prefix += @asset_rel_path if @file_output - - asset_rel_prefix = rel_prefix + @asset_rel_path - - @title = @options.title - @main_page = @files.find { |f| f.full_name == @options.main_page } - - render_template template_file, out_file do |io| - here = binding - # suppress 1.9.3 warning - here.local_variable_set(:asset_rel_prefix, asset_rel_prefix) - # some partials rely on the presence of current variable to render - here.local_variable_set(:current, @main_page) if @main_page - here - end - rescue => e - error = RDoc::Error.new \ - "error generating index.html: #{e.message} (#{e.class})" - error.set_backtrace e.backtrace - - raise error - end - - ## - # Generates a class file for +klass+ - - def generate_class(klass, template_file = nil) - current = klass - - template_file ||= @template_dir + 'class.rhtml' - - debug_msg " working on %s (%s)" % [klass.full_name, klass.path] - out_file = @outputdir + klass.path - rel_prefix = @outputdir.relative_path_from out_file.dirname - search_index_rel_prefix = rel_prefix - search_index_rel_prefix += @asset_rel_path if @file_output - - asset_rel_prefix = rel_prefix + @asset_rel_path - - breadcrumb = # used in templates - breadcrumb = generate_nesting_namespaces_breadcrumb(current, rel_prefix) - - @title = "#{klass.type} #{klass.full_name} - #{@options.title}" - - debug_msg " rendering #{out_file}" - render_template template_file, out_file do |io| - here = binding - # suppress 1.9.3 warning - here.local_variable_set(:asset_rel_prefix, asset_rel_prefix) - here - end - end - - ## - # Generate a documentation file for each class and module - - def generate_class_files - template_file = @template_dir + 'class.rhtml' - template_file = @template_dir + 'classpage.rhtml' unless - template_file.exist? - return unless template_file.exist? - debug_msg "Generating class documentation in #{@outputdir}" - - current = nil - - @classes.each do |klass| - current = klass - - generate_class klass, template_file - end - rescue => e - error = RDoc::Error.new \ - "error generating #{current.path}: #{e.message} (#{e.class})" - error.set_backtrace e.backtrace - - raise error - end - - ## - # Generate a documentation file for each file - - def generate_file_files - page_file = @template_dir + 'page.rhtml' - fileinfo_file = @template_dir + 'fileinfo.rhtml' - - # for legacy templates - filepage_file = @template_dir + 'filepage.rhtml' unless - page_file.exist? or fileinfo_file.exist? - - return unless - page_file.exist? or fileinfo_file.exist? or filepage_file.exist? - - debug_msg "Generating file documentation in #{@outputdir}" - - out_file = nil - current = nil - - @files.each do |file| - current = file - - if file.text? and page_file.exist? then - generate_page file - next - end - - template_file = nil - out_file = @outputdir + file.path - debug_msg " working on %s (%s)" % [file.full_name, out_file] - rel_prefix = @outputdir.relative_path_from out_file.dirname - search_index_rel_prefix = rel_prefix - search_index_rel_prefix += @asset_rel_path if @file_output - - asset_rel_prefix = rel_prefix + @asset_rel_path - - unless filepage_file then - if file.text? then - next unless page_file.exist? - template_file = page_file - @title = file.page_name - else - next unless fileinfo_file.exist? - template_file = fileinfo_file - @title = "File: #{file.base_name}" - end - end - - @title += " - #{@options.title}" - template_file ||= filepage_file - - render_template template_file, out_file do |io| - here = binding - # suppress 1.9.3 warning - here.local_variable_set(:asset_rel_prefix, asset_rel_prefix) - here.local_variable_set(:current, current) - here - end - end - rescue => e - error = - RDoc::Error.new "error generating #{out_file}: #{e.message} (#{e.class})" - error.set_backtrace e.backtrace - - raise error - end - - ## - # Generate a page file for +file+ - - def generate_page(file) - template_file = @template_dir + 'page.rhtml' - - out_file = @outputdir + file.path - debug_msg " working on %s (%s)" % [file.full_name, out_file] - rel_prefix = @outputdir.relative_path_from out_file.dirname - search_index_rel_prefix = rel_prefix - search_index_rel_prefix += @asset_rel_path if @file_output - - current = file - asset_rel_prefix = rel_prefix + @asset_rel_path - - @title = "#{file.page_name} - #{@options.title}" - - debug_msg " rendering #{out_file}" - render_template template_file, out_file do |io| - here = binding - # suppress 1.9.3 warning - here.local_variable_set(:current, current) - here.local_variable_set(:asset_rel_prefix, asset_rel_prefix) - here - end - end - - ## - # Generates the 404 page for the RDoc servlet - - def generate_servlet_not_found(message) - template_file = @template_dir + 'servlet_not_found.rhtml' - return unless template_file.exist? - - debug_msg "Rendering the servlet 404 Not Found page..." - - rel_prefix = rel_prefix = '' - search_index_rel_prefix = rel_prefix - search_index_rel_prefix += @asset_rel_path if @file_output - - asset_rel_prefix = '' - - @title = 'Not Found' - - render_template template_file do |io| - here = binding - # suppress 1.9.3 warning - here.local_variable_set(:asset_rel_prefix, asset_rel_prefix) - here - end - rescue => e - error = RDoc::Error.new \ - "error generating servlet_not_found: #{e.message} (#{e.class})" - error.set_backtrace e.backtrace - - raise error - end - - ## - # Generates the servlet root page for the RDoc servlet - - def generate_servlet_root(installed) - template_file = @template_dir + 'servlet_root.rhtml' - return unless template_file.exist? - - debug_msg 'Rendering the servlet root page...' - - rel_prefix = '.' - asset_rel_prefix = rel_prefix - search_index_rel_prefix = asset_rel_prefix - search_index_rel_prefix += @asset_rel_path if @file_output - - @title = 'Local RDoc Documentation' - - render_template template_file do |io| binding end - rescue => e - error = RDoc::Error.new \ - "error generating servlet_root: #{e.message} (#{e.class})" - error.set_backtrace e.backtrace - - raise error - end - - ## - # Generate an index page which lists all the classes which are documented. - - def generate_table_of_contents - template_file = @template_dir + 'table_of_contents.rhtml' - return unless template_file.exist? - - debug_msg "Rendering the Table of Contents..." - - out_file = @outputdir + 'table_of_contents.html' - rel_prefix = @outputdir.relative_path_from out_file.dirname - search_index_rel_prefix = rel_prefix - search_index_rel_prefix += @asset_rel_path if @file_output - - asset_rel_prefix = rel_prefix + @asset_rel_path - - @title = "Table of Contents - #{@options.title}" - - render_template template_file, out_file do |io| - here = binding - # suppress 1.9.3 warning - here.local_variable_set(:asset_rel_prefix, asset_rel_prefix) - here - end - rescue => e - error = RDoc::Error.new \ - "error generating table_of_contents.html: #{e.message} (#{e.class})" - error.set_backtrace e.backtrace - - raise error - end - - def install_rdoc_static_file(source, destination, options) # :nodoc: - return unless source.exist? - - begin - FileUtils.mkdir_p File.dirname(destination), **options - - begin - FileUtils.ln source, destination, **options - rescue Errno::EEXIST - FileUtils.rm destination - retry - end - rescue - FileUtils.cp source, destination, **options - end - end - - ## - # Prepares for generation of output from the current directory - - def setup - return if instance_variable_defined? :@outputdir - - @outputdir = Pathname.new(@options.op_dir).expand_path @base_dir - - return unless @store - - @classes = @store.all_classes_and_modules.sort - @files = @store.all_files.sort - @methods = @classes.flat_map { |m| m.method_list }.sort - @modsort = get_sorted_module_list @classes - end - - ## - # Creates a template from its components and the +body_file+. - # - # For backwards compatibility, if +body_file+ contains " - - - -#{head_file.read} - -#{body} - TEMPLATE - end - - ## - # Renders the ERb contained in +file_name+ relative to the template - # directory and returns the result based on the current context. - - def render(file_name) - template_file = @template_dir + file_name - - template = template_for template_file, false, RDoc::ERBPartial - - template.filename = template_file.to_s - - template.result @context - end - - ## - # Load and render the erb template in the given +template_file+ and write - # it out to +out_file+. - # - # Both +template_file+ and +out_file+ should be Pathname-like objects. - # - # An io will be yielded which must be captured by binding in the caller. - - def render_template(template_file, out_file = nil) # :yield: io - io_output = out_file && !@dry_run && @file_output - erb_klass = io_output ? RDoc::ERBIO : ERB - - template = template_for template_file, true, erb_klass - - if io_output then - debug_msg "Outputting to %s" % [out_file.expand_path] - - out_file.dirname.mkpath - out_file.open 'w', 0644 do |io| - io.set_encoding @options.encoding - - @context = yield io - - template_result template, @context, template_file - end - else - @context = yield nil - - output = template_result template, @context, template_file - - debug_msg " would have written %d characters to %s" % [ - output.length, out_file.expand_path - ] if @dry_run - - output - end - end - - ## - # Creates the result for +template+ with +context+. If an error is raised a - # Pathname +template_file+ will indicate the file where the error occurred. - - def template_result(template, context, template_file) - template.filename = template_file.to_s - template.result context - rescue NoMethodError => e - raise RDoc::Error, "Error while evaluating %s: %s" % [ - template_file.expand_path, - e.message, - ], e.backtrace - end - - ## - # Retrieves a cache template for +file+, if present, or fills the cache. - - def template_for(file, page = true, klass = ERB) - template = @template_cache[file] - - return template if template - - if page then - template = assemble_template file - erbout = 'io' - else - template = file.read - template = template.encode @options.encoding - - file_var = File.basename(file).sub(/\..*/, '') - - erbout = "_erbout_#{file_var}" - end - - template = klass.new template, trim_mode: '-', eoutvar: erbout - @template_cache[file] = template - template - end - - # :stopdoc: - ParagraphExcerptRegexpOther = %r[\b\w[^./:]++\.] - # use \p/\P{letter} instead of \w/\W in Unicode - ParagraphExcerptRegexpUnicode = %r[\b\p{letter}[^./:]++\.] - # :startdoc: - - # Returns an excerpt of the comment for usage in meta description tags - def excerpt(comment) - text = case comment - when RDoc::Comment - comment.text - else - comment - end - - # Match from a capital letter to the first period, discarding any links, so - # that we don't end up matching badges in the README - pattern = ParagraphExcerptRegexpUnicode - begin - first_paragraph_match = text.match(pattern) - rescue Encoding::CompatibilityError - # The doc is non-ASCII text and encoded in other than Unicode base encodings. - raise if pattern == ParagraphExcerptRegexpOther - pattern = ParagraphExcerptRegexpOther - retry - end - return text[0...150].tr_s("\n", " ").squeeze(" ") unless first_paragraph_match - - extracted_text = first_paragraph_match[0] - second_paragraph = text.match(pattern, first_paragraph_match.end(0)) - extracted_text << " " << second_paragraph[0] if second_paragraph - - extracted_text[0...150].tr_s("\n", " ").squeeze(" ") - end - - def generate_ancestor_list(ancestors, klass) - return '' if ancestors.empty? - - ancestor = ancestors.shift - content = +'
  • ' - - if ancestor.is_a?(RDoc::NormalClass) - content << "#{ancestor.full_name}" - else - content << ancestor.to_s - end - - # Recursively call the method for the remaining ancestors - content << generate_ancestor_list(ancestors, klass) - - content << '
' - end - - def generate_class_link(klass, rel_prefix) - if klass.display? - %(#{klass.name}) - else - %(#{klass.name}) - end - end - - def generate_class_index_content(classes, rel_prefix) - grouped_classes = group_classes_by_namespace_for_sidebar(classes) - return '' unless top = grouped_classes[nil] - - solo = top.one? { |klass| klass.display? } - traverse_classes(top, grouped_classes, rel_prefix, solo) - end - - def traverse_classes(klasses, grouped_classes, rel_prefix, solo = false) - content = +'" - end - - def group_classes_by_namespace_for_sidebar(classes) - grouped_classes = classes.group_by do |klass| - klass.full_name[/\A[^:]++(?:::[^:]++(?=::))*+(?=::[^:]*+\z)/] - end.select do |_, klasses| - klasses.any?(&:display?) - end - - grouped_classes.values.each(&:uniq!) - grouped_classes - end - - private - - def nesting_namespaces_to_class_modules(klass) - tree = {} - - klass.nesting_namespaces.zip(klass.fully_qualified_nesting_namespaces) do |ns, fqns| - tree[ns] = @store.classes_hash[fqns] || @store.modules_hash[fqns] - end - - tree - end - - def generate_nesting_namespaces_breadcrumb(klass, rel_prefix) - nesting_namespaces_to_class_modules(klass).map do |namespace, class_module| - path = class_module ? (rel_prefix + class_module.path).to_s : "" - { name: namespace, path: path, self: klass.full_name == class_module&.full_name } - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/json_index.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/json_index.rb deleted file mode 100644 index 065caa4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/json_index.rb +++ /dev/null @@ -1,284 +0,0 @@ -# frozen_string_literal: true -require 'json' -begin - require 'zlib' -rescue LoadError -end - -## -# The JsonIndex generator is designed to complement an HTML generator and -# produces a JSON search index. This generator is derived from sdoc by -# Vladimir Kolesnikov and contains verbatim code written by him. -# -# This generator is designed to be used with a regular HTML generator: -# -# class RDoc::Generator::Darkfish -# def initialize options -# # ... -# @base_dir = Pathname.pwd.expand_path -# -# @json_index = RDoc::Generator::JsonIndex.new self, options -# end -# -# def generate -# # ... -# @json_index.generate -# end -# end -# -# == Index Format -# -# The index is output as a JSON file assigned to the global variable -# +search_data+. The structure is: -# -# var search_data = { -# "index": { -# "searchIndex": -# ["a", "b", ...], -# "longSearchIndex": -# ["a", "a::b", ...], -# "info": [ -# ["A", "A", "A.html", "", ""], -# ["B", "A::B", "A::B.html", "", ""], -# ... -# ] -# } -# } -# -# The same item is described across the +searchIndex+, +longSearchIndex+ and -# +info+ fields. The +searchIndex+ field contains the item's short name, the -# +longSearchIndex+ field contains the full_name (when appropriate) and the -# +info+ field contains the item's name, full_name, path, parameters and a -# snippet of the item's comment. -# -# == LICENSE -# -# Copyright (c) 2009 Vladimir Kolesnikov -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -class RDoc::Generator::JsonIndex - - include RDoc::Text - - ## - # Where the search index lives in the generated output - - SEARCH_INDEX_FILE = File.join 'js', 'search_index.js' - - attr_reader :index # :nodoc: - - ## - # Creates a new generator. - # +options+ are the same options passed to the parent generator. - - def initialize(parent_generator, options) - @parent_generator = parent_generator - @store = parent_generator.store - @options = options - - @template_dir = File.expand_path '../template/json_index', __FILE__ - @base_dir = @parent_generator.base_dir - - @classes = nil - @files = nil - @index = nil - end - - ## - # Builds the JSON index as a Hash. - - def build_index - reset @store.all_files.sort, @store.all_classes_and_modules.sort - - index_classes - index_methods - index_pages - - { :index => @index } - end - - ## - # Output progress information if debugging is enabled - - def debug_msg *msg - return unless $DEBUG_RDOC - $stderr.puts(*msg) - end - - ## - # Writes the JSON index to disk - - def generate - debug_msg "Generating JSON index" - - debug_msg " writing search index to %s" % SEARCH_INDEX_FILE - data = build_index - - return if @options.dry_run - - out_dir = @base_dir + @options.op_dir - index_file = out_dir + SEARCH_INDEX_FILE - - FileUtils.mkdir_p index_file.dirname, :verbose => $DEBUG_RDOC - - index_file.open 'w', 0644 do |io| - io.set_encoding Encoding::UTF_8 - io.write 'var search_data = ' - - JSON.dump data, io, 0 - end - unless ENV['SOURCE_DATE_EPOCH'].nil? - index_file.utime index_file.atime, Time.at(ENV['SOURCE_DATE_EPOCH'].to_i).gmtime - end - - Dir.chdir @template_dir do - Dir['**/*.js'].each do |source| - dest = File.join out_dir, source - - FileUtils.install source, dest, :mode => 0644, :preserve => true, :verbose => $DEBUG_RDOC - end - end - end - - ## - # Compress the search_index.js file using gzip - - def generate_gzipped - return if @options.dry_run or not defined?(Zlib) - - debug_msg "Compressing generated JSON index" - out_dir = @base_dir + @options.op_dir - - search_index_file = out_dir + SEARCH_INDEX_FILE - outfile = out_dir + "#{search_index_file}.gz" - - debug_msg "Reading the JSON index file from %s" % search_index_file - search_index = search_index_file.read(mode: 'r:utf-8') - - debug_msg "Writing gzipped search index to %s" % outfile - - Zlib::GzipWriter.open(outfile) do |gz| - gz.mtime = File.mtime(search_index_file) - gz.orig_name = search_index_file.basename.to_s - gz.write search_index - gz.close - end - - # GZip the rest of the js files - Dir.chdir @template_dir do - Dir['**/*.js'].each do |source| - dest = out_dir + source - outfile = out_dir + "#{dest}.gz" - - debug_msg "Reading the original js file from %s" % dest - data = dest.read - - debug_msg "Writing gzipped file to %s" % outfile - - Zlib::GzipWriter.open(outfile) do |gz| - gz.mtime = File.mtime(dest) - gz.orig_name = dest.basename.to_s - gz.write data - gz.close - end - end - end - end - - ## - # Adds classes and modules to the index - - def index_classes - debug_msg " generating class search index" - - documented = @classes.uniq.select do |klass| - klass.document_self_or_methods - end - - documented.each do |klass| - debug_msg " #{klass.full_name}" - record = klass.search_record - @index[:searchIndex] << search_string(record.shift) - @index[:longSearchIndex] << search_string(record.shift) - @index[:info] << record - end - end - - ## - # Adds methods to the index - - def index_methods - debug_msg " generating method search index" - - list = @classes.uniq.flat_map do |klass| - klass.method_list - end.sort_by do |method| - [method.name, method.parent.full_name] - end - - list.each do |method| - debug_msg " #{method.full_name}" - record = method.search_record - @index[:searchIndex] << "#{search_string record.shift}()" - @index[:longSearchIndex] << "#{search_string record.shift}()" - @index[:info] << record - end - end - - ## - # Adds pages to the index - - def index_pages - debug_msg " generating pages search index" - - pages = @files.select do |file| - file.text? - end - - pages.each do |page| - debug_msg " #{page.page_name}" - record = page.search_record - @index[:searchIndex] << search_string(record.shift) - @index[:longSearchIndex] << '' - record.shift - @index[:info] << record - end - end - - def reset(files, classes) # :nodoc: - @files = files - @classes = classes - - @index = { - :searchIndex => [], - :longSearchIndex => [], - :info => [] - } - end - - ## - # Removes whitespace and downcases +string+ - - def search_string(string) - string.downcase.gsub(/\s/, '') - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/markup.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/markup.rb deleted file mode 100644 index 1c39687..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/markup.rb +++ /dev/null @@ -1,171 +0,0 @@ -# frozen_string_literal: true -## -# Handle common RDoc::Markup tasks for various CodeObjects -# -# This module is loaded by generators. It allows RDoc's CodeObject tree to -# avoid loading generator code to improve startup time for +ri+. - -module RDoc::Generator::Markup - - ## - # Generates a relative URL from this object's path to +target_path+ - - def aref_to(target_path) - RDoc::Markup::ToHtml.gen_relative_url path, target_path - end - - ## - # Generates a relative URL from +from_path+ to this object's path - - def as_href(from_path) - RDoc::Markup::ToHtml.gen_relative_url from_path, path - end - - ## - # Handy wrapper for marking up this object's comment - - def description - markup @comment - end - - ## - # Creates an RDoc::Markup::ToHtmlCrossref formatter - - def formatter - return @formatter if defined? @formatter - - options = @store.options - this = RDoc::Context === self ? self : @parent - - @formatter = RDoc::Markup::ToHtmlCrossref.new options, this.path, this - @formatter.code_object = self - @formatter - end - - ## - # Build a webcvs URL starting for the given +url+ with +full_path+ appended - # as the destination path. If +url+ contains '%s' +full_path+ will be - # will replace the %s using sprintf on the +url+. - - def cvs_url(https://github.com/url,%20full_path) - if /%s/ =~ url then - sprintf url, full_path - else - url + full_path - end - end - - ## - # The preferred URL for this object. - - def canonical_url - options = @store.options - if path - File.join(options.canonical_root, path.to_s) - else - options.canonical_root - end - end - -end - -class RDoc::CodeObject - - include RDoc::Generator::Markup - -end - -class RDoc::MethodAttr - - ## - # Prepend +src+ with line numbers. Relies on the first line of a source - # code listing having: - # - # # File xxxxx, line dddd - # - # If it has this comment then line numbers are added to +src+ and the , - # line dddd portion of the comment is removed. - - def add_line_numbers(src) - return unless src.sub!(/\A(.*)(, line (\d+))/, '\1') - first = $3.to_i - 1 - last = first + src.count("\n") - size = last.to_s.length - - line = first - src.gsub!(/^/) do - res = if line == first then - " " * (size + 1) - else - "%2$*1$d " % [size, line] - end - - line += 1 - res - end - end - - ## - # Turns the method's token stream into HTML. - # - # Prepends line numbers if +options.line_numbers+ is true. - - def markup_code - return '' unless @token_stream - - src = RDoc::TokenStream.to_html @token_stream - - # dedent the source - indent = src.length - lines = src.lines.to_a - lines.shift if src =~ /\A.*#\ *File/i # remove '# File' comment - lines.each do |line| - if line =~ /^ *(?=\S)/ - n = $~.end(0) - indent = n if n < indent - break if n == 0 - end - end - src.gsub!(/^#{' ' * indent}/, '') if indent > 0 - - add_line_numbers(src) if options.line_numbers - - src - end - -end - -class RDoc::ClassModule - - ## - # Handy wrapper for marking up this class or module's comment - - def description - markup @comment_location - end - -end - -class RDoc::Context::Section - - include RDoc::Generator::Markup - -end - -class RDoc::TopLevel - - ## - # Returns a URL for this source file on some web repository. Use the -W - # command line option to set. - - def cvs_url - url = @store.options.webcvs - - if /%s/ =~ url then - url % @relative_name - else - url + @relative_name - end - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot.rb deleted file mode 100644 index a20fde0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot.rb +++ /dev/null @@ -1,94 +0,0 @@ -# frozen_string_literal: true -## -# Generates a POT file. -# -# Here is a translator work flow with the generator. -# -# == Create .pot -# -# You create .pot file by pot formatter: -# -# % rdoc --format pot -# -# It generates doc/rdoc.pot. -# -# == Create .po -# -# You create .po file from doc/rdoc.pot. This operation is needed only -# the first time. This work flow assumes that you are a translator -# for Japanese. -# -# You create locale/ja/rdoc.po from doc/rdoc.pot. You can use msginit -# provided by GNU gettext or rmsginit provided by gettext gem. This -# work flow uses gettext gem because it is more portable than GNU -# gettext for Rubyists. Gettext gem is implemented by pure Ruby. -# -# % gem install gettext -# % mkdir -p locale/ja -# % rmsginit --input doc/rdoc.pot --output locale/ja/rdoc.po --locale ja -# -# Translate messages in .po -# -# You translate messages in .po by a PO file editor. po-mode.el exists -# for Emacs users. There are some GUI tools such as GTranslator. -# There are some Web services such as POEditor and Tansifex. You can -# edit by your favorite text editor because .po is a text file. -# Generate localized documentation -# -# You can generate localized documentation with locale/ja/rdoc.po: -# -# % rdoc --locale ja -# -# You can find documentation in Japanese in doc/. Yay! -# -# == Update translation -# -# You need to update translation when your application is added or -# modified messages. -# -# You can update .po by the following command lines: -# -# % rdoc --format pot -# % rmsgmerge --update locale/ja/rdoc.po doc/rdoc.pot -# -# You edit locale/ja/rdoc.po to translate new messages. - -class RDoc::Generator::POT - - RDoc::RDoc.add_generator self - - ## - # Description of this generator - - DESCRIPTION = 'creates .pot file' - - ## - # Set up a new .pot generator - - def initialize(store, options) #:not-new: - @options = options - @store = store - end - - ## - # Writes .pot to disk. - - def generate - po = extract_messages - pot_path = 'rdoc.pot' - File.open(pot_path, "w") do |pot| - pot.print(po.to_s) - end - end - - private - def extract_messages - extractor = MessageExtractor.new(@store) - extractor.extract - end - - require_relative 'pot/message_extractor' - require_relative 'pot/po' - require_relative 'pot/po_entry' - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/message_extractor.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/message_extractor.rb deleted file mode 100644 index ee6d847..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/message_extractor.rb +++ /dev/null @@ -1,68 +0,0 @@ -# frozen_string_literal: true -## -# Extracts message from RDoc::Store - -class RDoc::Generator::POT::MessageExtractor - - ## - # Creates a message extractor for +store+. - - def initialize(store) - @store = store - @po = RDoc::Generator::POT::PO.new - end - - ## - # Extracts messages from +store+, stores them into - # RDoc::Generator::POT::PO and returns it. - - def extract - @store.all_classes_and_modules.each do |klass| - extract_from_klass(klass) - end - @po - end - - private - - def extract_from_klass(klass) - extract_text(klass.comment_location, klass.full_name) - - klass.each_section do |section, constants, attributes| - extract_text(section.title, "#{klass.full_name}: section title") - section.comments.each do |comment| - extract_text(comment, "#{klass.full_name}: #{section.title}") - end - end - - klass.constants.each do |constant| - extract_text(constant.comment, constant.full_name) - end - - klass.attributes.each do |attribute| - extract_text(attribute.comment, attribute.full_name) - end - - klass.each_method do |method| - extract_text(method.comment, method.full_name) - end - end - - def extract_text(text, comment, location = nil) - return if text.nil? - - options = { - :extracted_comment => comment, - :references => [location].compact, - } - i18n_text = RDoc::I18n::Text.new(text) - i18n_text.extract_messages do |part| - @po.add(entry(part[:paragraph], options)) - end - end - - def entry(msgid, options) - RDoc::Generator::POT::POEntry.new(msgid, options) - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/po.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/po.rb deleted file mode 100644 index 447cb60..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/po.rb +++ /dev/null @@ -1,84 +0,0 @@ -# frozen_string_literal: true -## -# Generates a PO format text - -class RDoc::Generator::POT::PO - - ## - # Creates an object that represents PO format. - - def initialize - @entries = {} - add_header - end - - ## - # Adds a PO entry to the PO. - - def add(entry) - existing_entry = @entries[entry.msgid] - if existing_entry - entry = existing_entry.merge(entry) - end - @entries[entry.msgid] = entry - end - - ## - # Returns PO format text for the PO. - - def to_s - po = '' - sort_entries.each do |entry| - po += "\n" unless po.empty? - po += entry.to_s - end - po - end - - private - - def add_header - add(header_entry) - end - - def header_entry - comment = <<-COMMENT -SOME DESCRIPTIVE TITLE. -Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -This file is distributed under the same license as the PACKAGE package. -FIRST AUTHOR , YEAR. - COMMENT - - content = <<-CONTENT -Project-Id-Version: PACKAGE VERSEION -Report-Msgid-Bugs-To: -PO-Revision-Date: YEAR-MO_DA HO:MI+ZONE -Last-Translator: FULL NAME -Language-Team: LANGUAGE -Language: -MIME-Version: 1.0 -Content-Type: text/plain; charset=CHARSET -Content-Transfer-Encoding: 8bit -Plural-Forms: nplurals=INTEGER; plural=EXPRESSION; - CONTENT - - options = { - :msgstr => content, - :translator_comment => comment, - :flags => ['fuzzy'], - } - RDoc::Generator::POT::POEntry.new('', options) - end - - def sort_entries - headers, messages = @entries.values.partition do |entry| - entry.msgid.empty? - end - # TODO: sort by location - sorted_messages = messages.sort_by do |entry| - entry.msgid - end - headers + sorted_messages - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/po_entry.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/po_entry.rb deleted file mode 100644 index 8de260e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/pot/po_entry.rb +++ /dev/null @@ -1,141 +0,0 @@ -# frozen_string_literal: true -## -# A PO entry in PO - -class RDoc::Generator::POT::POEntry - - # The msgid content - attr_reader :msgid - - # The msgstr content - attr_reader :msgstr - - # The comment content created by translator (PO editor) - attr_reader :translator_comment - - # The comment content extracted from source file - attr_reader :extracted_comment - - # The locations where the PO entry is extracted - attr_reader :references - - # The flags of the PO entry - attr_reader :flags - - ## - # Creates a PO entry for +msgid+. Other values can be specified by - # +options+. - - def initialize(msgid, options = {}) - @msgid = msgid - @msgstr = options[:msgstr] || "" - @translator_comment = options[:translator_comment] - @extracted_comment = options[:extracted_comment] - @references = options[:references] || [] - @flags = options[:flags] || [] - end - - ## - # Returns the PO entry in PO format. - - def to_s - entry = '' - entry += format_translator_comment - entry += format_extracted_comment - entry += format_references - entry += format_flags - entry += <<-ENTRY -msgid #{format_message(@msgid)} -msgstr #{format_message(@msgstr)} - ENTRY - end - - ## - # Merges the PO entry with +other_entry+. - - def merge(other_entry) - options = { - :extracted_comment => merge_string(@extracted_comment, - other_entry.extracted_comment), - :translator_comment => merge_string(@translator_comment, - other_entry.translator_comment), - :references => merge_array(@references, - other_entry.references), - :flags => merge_array(@flags, - other_entry.flags), - } - self.class.new(@msgid, options) - end - - private - - def format_comment(mark, comment) - return '' unless comment - return '' if comment.empty? - - formatted_comment = '' - comment.each_line do |line| - formatted_comment += "#{mark} #{line}" - end - formatted_comment += "\n" unless formatted_comment.end_with?("\n") - formatted_comment - end - - def format_translator_comment - format_comment('#', @translator_comment) - end - - def format_extracted_comment - format_comment('#.', @extracted_comment) - end - - def format_references - return '' if @references.empty? - - formatted_references = '' - @references.sort.each do |file, line| - formatted_references += "\#: #{file}:#{line}\n" - end - formatted_references - end - - def format_flags - return '' if @flags.empty? - - formatted_flags = flags.join(",") - "\#, #{formatted_flags}\n" - end - - def format_message(message) - return "\"#{escape(message)}\"" unless message.include?("\n") - - formatted_message = '""' - message.each_line do |line| - formatted_message += "\n" - formatted_message += "\"#{escape(line)}\"" - end - formatted_message - end - - def escape(string) - string.gsub(/["\\\t\n]/) do |special_character| - case special_character - when "\t" - "\\t" - when "\n" - "\\n" - else - "\\#{special_character}" - end - end - end - - def merge_string(string1, string2) - [string1, string2].compact.join("\n") - end - - def merge_array(array1, array2) - (array1 + array2).uniq - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/ri.rb b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/ri.rb deleted file mode 100644 index 32f518a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/ri.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true -## -# Generates ri data files - -class RDoc::Generator::RI - - RDoc::RDoc.add_generator self - - ## - # Description of this generator - - DESCRIPTION = 'creates ri data files' - - ## - # Set up a new ri generator - - def initialize(store, options) #:not-new: - @options = options - @store = store - @store.path = '.' - end - - ## - # Writes the parsed data store to disk for use by ri. - - def generate - @store.save - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_footer.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_footer.rhtml deleted file mode 100644 index 9791b42..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_footer.rhtml +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_head.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_head.rhtml deleted file mode 100644 index 7376fc3..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_head.rhtml +++ /dev/null @@ -1,48 +0,0 @@ - - - -<%= h @title %> - -<%- if defined?(klass) -%> - "> - - <%- if klass.comment.empty? -%> - "> - <%- else -%> - "> - <%- end -%> -<%- elsif defined?(file) -%> - - "> -<%- elsif @title -%> - - - <%- if @options.main_page and - main_page = @files.find { |f| f.full_name == @options.main_page } then %> - "> - <%- else -%> - - <%- end -%> -<%- end -%> - -<%- if canonical_url = @options.canonical_root -%> -<% canonical_url = current.canonical_url if defined?(current) %> - -<%- end -%> - - - - - - - - - - - -<%- @options.template_stylesheets.each do |stylesheet| -%> - -<%- end -%> diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtml deleted file mode 100644 index d33ecd4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtml +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml deleted file mode 100644 index 067bd62..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +++ /dev/null @@ -1,15 +0,0 @@ -<%- unless klass.extends.empty? then %> - -<%- end -%> diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml deleted file mode 100644 index 04846f8..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +++ /dev/null @@ -1,15 +0,0 @@ -<%- unless klass.includes.empty? then %> - -<%- end -%> diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml deleted file mode 100644 index faed7e0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +++ /dev/null @@ -1,15 +0,0 @@ - diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml deleted file mode 100644 index d09216a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml +++ /dev/null @@ -1,21 +0,0 @@ -<% if (class_methods = klass.class_method_list.sort).any? %> - -<% end %> - -<% if (instance_methods = klass.instance_methods.sort).any? %> - -<% end %> diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_navigation.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_navigation.rhtml deleted file mode 100644 index d7f3308..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_navigation.rhtml +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml deleted file mode 100644 index 3f68f0c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +++ /dev/null @@ -1,32 +0,0 @@ -<%- simple_files = @files.select { |f| f.text? } %> -<%- if defined?(current) -%> - <%- dir = current.full_name[%r{\A[^/]+(?=/)}] || current.page_name -%> -<%- end -%> -<%- unless simple_files.empty? then -%> - -<%- end -%> diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml deleted file mode 100644 index 6808b2b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml +++ /dev/null @@ -1,6 +0,0 @@ -<%- if klass.type == 'class' && (ancestors = klass.super_classes).any? -%> - -<%- end -%> diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtml deleted file mode 100644 index afc7f7b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtml +++ /dev/null @@ -1,14 +0,0 @@ - diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml deleted file mode 100644 index 6dcd2ae..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +++ /dev/null @@ -1,11 +0,0 @@ -<%- unless klass.sections.length == 1 then %> - -<%- end -%> diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml deleted file mode 100644 index b1e047b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +++ /dev/null @@ -1,39 +0,0 @@ -<%- comment = if current.respond_to? :comment_location then - current.comment_location - else - current.comment - end - table = current.parse(comment).table_of_contents.dup - - if table.length > 1 then %> - -<%- end -%> diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_toggle.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_toggle.rhtml deleted file mode 100644 index ed2cbe3..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/_sidebar_toggle.rhtml +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/class.rhtml b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/class.rhtml deleted file mode 100644 index 628945d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/class.rhtml +++ /dev/null @@ -1,221 +0,0 @@ - -<%= render '_sidebar_toggle.rhtml' %> - - - -
- <%# If nesting level is 1, breadcrumb list is not needed %> - <% if breadcrumb.size > 1 %> - - <% end %> - -

- <%= klass.type %> <%= klass.full_name %> -

- -
- <%= klass.description %> -
- - <%- klass.each_section do |section, constants, attributes| -%> - -<%- end -%> -
diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/css/fonts.css b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/css/fonts.css deleted file mode 100644 index 57302b5..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/css/fonts.css +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), - * with Reserved Font Name "Source". All Rights Reserved. Source is a - * trademark of Adobe Systems Incorporated in the United States and/or other - * countries. - * - * This Font Software is licensed under the SIL Open Font License, Version - * 1.1. - * - * This license is copied below, and is also available with a FAQ at: - * http://scripts.sil.org/OFL - */ - -@font-face { - font-family: "Source Code Pro"; - font-style: normal; - font-weight: 400; - src: local("Source Code Pro"), - local("SourceCodePro-Regular"), - url("https://github.com/fonts/SourceCodePro-Regular.ttf") format("truetype"); -} - -@font-face { - font-family: "Source Code Pro"; - font-style: normal; - font-weight: 700; - src: local("Source Code Pro Bold"), - local("SourceCodePro-Bold"), - url("https://github.com/fonts/SourceCodePro-Bold.ttf") format("truetype"); -} - -/* - * Copyright (c) 2010, Łukasz Dziedzic (dziedzic@typoland.com), - * with Reserved Font Name Lato. - * - * This Font Software is licensed under the SIL Open Font License, Version - * 1.1. - * - * This license is copied below, and is also available with a FAQ at: - * http://scripts.sil.org/OFL - */ - -@font-face { - font-family: "Lato"; - font-style: normal; - font-weight: 300; - src: local("Lato Light"), - local("Lato-Light"), - url("https://github.com/fonts/Lato-Light.ttf") format("truetype"); -} - -@font-face { - font-family: "Lato"; - font-style: italic; - font-weight: 300; - src: local("Lato Light Italic"), - local("Lato-LightItalic"), - url("https://github.com/fonts/Lato-LightItalic.ttf") format("truetype"); -} - -@font-face { - font-family: "Lato"; - font-style: normal; - font-weight: 700; - src: local("Lato Regular"), - local("Lato-Regular"), - url("https://github.com/fonts/Lato-Regular.ttf") format("truetype"); -} - -@font-face { - font-family: "Lato"; - font-style: italic; - font-weight: 700; - src: local("Lato Italic"), - local("Lato-Italic"), - url("https://github.com/fonts/Lato-RegularItalic.ttf") format("truetype"); -} - -/* - * ----------------------------------------------------------- - * SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 - * ----------------------------------------------------------- - * - * PREAMBLE - * The goals of the Open Font License (OFL) are to stimulate worldwide - * development of collaborative font projects, to support the font creation - * efforts of academic and linguistic communities, and to provide a free and - * open framework in which fonts may be shared and improved in partnership - * with others. - * - * The OFL allows the licensed fonts to be used, studied, modified and - * redistributed freely as long as they are not sold by themselves. The - * fonts, including any derivative works, can be bundled, embedded, - * redistributed and/or sold with any software provided that any reserved - * names are not used by derivative works. The fonts and derivatives, - * however, cannot be released under any other type of license. The - * requirement for fonts to remain under this license does not apply - * to any document created using the fonts or their derivatives. - * - * DEFINITIONS - * "Font Software" refers to the set of files released by the Copyright - * Holder(s) under this license and clearly marked as such. This may - * include source files, build scripts and documentation. - * - * "Reserved Font Name" refers to any names specified as such after the - * copyright statement(s). - * - * "Original Version" refers to the collection of Font Software components as - * distributed by the Copyright Holder(s). - * - * "Modified Version" refers to any derivative made by adding to, deleting, - * or substituting -- in part or in whole -- any of the components of the - * Original Version, by changing formats or by porting the Font Software to a - * new environment. - * - * "Author" refers to any designer, engineer, programmer, technical - * writer or other person who contributed to the Font Software. - * - * PERMISSION & CONDITIONS - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of the Font Software, to use, study, copy, merge, embed, modify, - * redistribute, and sell modified and unmodified copies of the Font - * Software, subject to the following conditions: - * - * 1) Neither the Font Software nor any of its individual components, - * in Original or Modified Versions, may be sold by itself. - * - * 2) Original or Modified Versions of the Font Software may be bundled, - * redistributed and/or sold with any software, provided that each copy - * contains the above copyright notice and this license. These can be - * included either as stand-alone text files, human-readable headers or - * in the appropriate machine-readable metadata fields within text or - * binary files as long as those fields can be easily viewed by the user. - * - * 3) No Modified Version of the Font Software may use the Reserved Font - * Name(s) unless explicit written permission is granted by the corresponding - * Copyright Holder. This restriction only applies to the primary font name as - * presented to the users. - * - * 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font - * Software shall not be used to promote, endorse or advertise any - * Modified Version, except to acknowledge the contribution(s) of the - * Copyright Holder(s) and the Author(s) or with their explicit written - * permission. - * - * 5) The Font Software, modified or unmodified, in part or in whole, - * must be distributed entirely under this license, and must not be - * distributed under any other license. The requirement for fonts to - * remain under this license does not apply to any document created - * using the Font Software. - * - * TERMINATION - * This license becomes null and void if any of the above conditions are - * not met. - * - * DISCLAIMER - * THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT - * OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL - * DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM - * OTHER DEALINGS IN THE FONT SOFTWARE. - */ - diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/css/rdoc.css b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/css/rdoc.css deleted file mode 100644 index c84a604..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/css/rdoc.css +++ /dev/null @@ -1,683 +0,0 @@ -/* - * "Darkfish" RDoc CSS - * $Id: rdoc.css 54 2009-01-27 01:09:48Z deveiant $ - * - * Author: Michael Granger - * - */ - -/* vim: ft=css et sw=2 ts=2 sts=2 */ - -/* 1. Variables and Root Styles */ -:root { - --sidebar-width: 300px; - --highlight-color: #cc342d; /* Reddish color for accents and headings */ - --secondary-highlight-color: #c83045; /* Darker reddish color for secondary highlights */ - --text-color: #505050; /* Dark bluish-grey for text */ - --background-color: #fefefe; /* Near white background */ - --code-block-background-color: #f6f6f3; /* Slightly darker grey for code blocks */ - --link-color: #42405F; /* Dark bluish-grey for links */ - --link-hover-color: var(--highlight-color); /* Reddish color on hover */ - --border-color: #e0e0e0;; /* General border color */ - --source-code-toggle-color: var(--secondary-highlight-color); - --scrollbar-thumb-hover-background: #505050; /* Hover color for scrollbar thumb */ - --table-header-background-color: #eceaed; - --table-td-background-color: #f5f4f6; - - /* Font family variables */ - --font-primary: 'Segoe UI', 'Verdana', 'Arial', sans-serif; - --font-heading: 'Helvetica', 'Arial', sans-serif; - --font-code: monospace; -} - -/* 2. Global Styles */ -body { - background: var(--background-color); - font-family: var(--font-primary); - font-weight: 400; - color: var(--text-color); - line-height: 1.6; - - /* Layout */ - display: flex; - flex-direction: column; - min-height: 100vh; - margin: 0; -} - -/* 3. Typography */ -h1 span, -h2 span, -h3 span, -h4 span, -h5 span, -h6 span { - position: relative; - - display: none; - padding-left: 1em; - line-height: 0; - vertical-align: baseline; - font-size: 10px; -} - -h1 span { top: -1.3em; } -h2 span { top: -1.2em; } -h3 span { top: -1.0em; } -h4 span { top: -0.8em; } -h5 span { top: -0.5em; } -h6 span { top: -0.5em; } - -h1:hover span, -h2:hover span, -h3:hover span, -h4:hover span, -h5:hover span, -h6:hover span { - display: inline; -} - -h1:target, -h2:target, -h3:target, -h4:target, -h5:target, -h6:target { - margin-left: -10px; - border-left: 10px solid var(--border-color); - scroll-margin-top: 1rem; -} - -main .anchor-link:target { - scroll-margin-top: 1rem; -} - -/* 4. Links */ -a { - color: var(--link-color); - transition: color 0.3s ease; - text-decoration: underline; - text-underline-offset: 0.2em; /* Make sure it doesn't overlap with underscores in a method name. */ -} - -a:hover { - color: var(--link-hover-color); -} - -a code:hover { - color: var(--link-hover-color); -} - -/* 5. Code and Pre */ -code, -pre { - font-family: var(--font-code); - background-color: var(--code-block-background-color); - border: 1px solid var(--border-color); - border-radius: 6px; - padding: 16px; - overflow-x: auto; - font-size: 15px; - line-height: 1.5; - margin: 1em 0; -} - -code { - background-color: var(--code-block-background-color); - padding: 0.1em 0.3em; - border-radius: 3px; - font-size: 85%; -} - -/* Tables */ -table { - margin: 0; - border-spacing: 0; - border-collapse: collapse; -} - -table tr th, table tr td { - padding: 0.2em 0.4em; - border: 1px solid var(--border-color); -} - -table tr th { - background-color: var(--table-header-background-color); -} - -table tr:nth-child(even) td { - background-color: var(--table-td-background-color); -} - -/* 7. Navigation and Sidebar */ -nav { - font-family: var(--font-heading); - font-size: 16px; - border-right: 1px solid var(--border-color); - position: fixed; - top: 0; - bottom: 0; - left: 0; - width: var(--sidebar-width); - background: var(--background-color); /* It needs an explicit background for toggling narrow screens */ - overflow-y: auto; - z-index: 10; - display: flex; - flex-direction: column; - color: var(--text-color); -} - -nav[hidden] { - display: none; -} - -nav footer { - padding: 1em; - border-top: 1px solid var(--border-color); -} - -nav footer a { - color: var(--secondary-highlight-color); -} - -nav .nav-section { - margin-top: 1em; - padding: 0 1em; -} - -nav h2, nav h3 { - margin: 0 0 0.5em; - padding: 0.5em 0; - color: var(--highlight-color); - border-bottom: 1px solid var(--border-color); -} - -nav h2 { - font-size: 1.2em; -} - -nav h3, -#table-of-contents-navigation { - font-size: 1em; -} - -ol.breadcrumb { - display: flex; - - padding: 0; - margin: 0 0 1em; -} - -ol.breadcrumb li { - display: block; - list-style: none; - font-size: 125%; -} - -nav ul, -nav dl, -nav p { - padding: 0; - list-style: none; - margin: 0.5em 0; -} - -nav ul li { - margin-bottom: 0.3em; -} - -nav ul ul { - padding-left: 1em; -} - -nav ul ul ul { - padding-left: 1em; -} - -nav ul ul ul ul { - padding-left: 1em; -} - -nav a { - color: var(--link-color); - text-decoration: none; -} - -nav a:hover { - color: var(--link-hover-color); - text-decoration: underline; -} - -#navigation-toggle { - z-index: 1000; - font-size: 2em; - display: block; - position: fixed; - top: 10px; - left: 20px; - cursor: pointer; -} - -#navigation-toggle[aria-expanded="true"] { - top: 10px; - left: 250px; -} - -nav ul li details { - position: relative; - padding-right: 1.5em; /* Add space for the marker on the right */ -} - -nav ul li details > summary { - list-style: none; /* Remove the default marker */ - position: relative; /* So that the open/close triangle can position itself absolutely inside */ -} - -nav ul li details > summary::-webkit-details-marker { - display: none; /* Removes the default marker, in Safari 18. */ -} - -nav ul li details > summary::after { - content: '▶'; /* Unicode right-pointing triangle */ - position: absolute; - font-size: 0.8em; - bottom: 0.1em; - margin-left: 0.3em; - transition: transform 0.2s ease; -} - -nav ul li details[open] > summary::after { - transform: rotate(90deg); /* Rotate the triangle when open */ -} - -/* 8. Main Content */ -main { - flex: 1; - display: block; - margin: 3em auto; - padding: 0 2em; - max-width: 800px; - font-size: 16px; - line-height: 1.6; - color: var(--text-color); - box-sizing: border-box; -} - -@media (min-width: 1024px) { - main { - margin-left: var(--sidebar-width); - } - - .table-of-contents main { - margin-left: 20em; - } - - #navigation-toggle { - display: none; - } -} - -main h1[class] { - margin-top: 0; - margin-bottom: 1em; - font-size: 2.5em; - color: var(--highlight-color); -} - -main h1, -main h2, -main h3, -main h4, -main h5, -main h6 { - font-family: var(--font-heading); - color: var(--highlight-color); -} - -/* Search */ -#search-section { - padding: 1em; - background-color: var(--background-color); - border-bottom: 1px solid var(--border-color); -} - -#search-field-wrapper { - position: relative; - display: flex; - align-items: center; -} - -#search-field { - width: 100%; - padding: 0.5em 1em 0.5em 2.5em; - border: 1px solid var(--border-color); - border-radius: 20px; - font-size: 14px; - outline: none; - transition: border-color 0.3s ease; - color: var(--text-color); -} - -#search-field:focus { - border-color: var(--highlight-color); -} - -#search-field::placeholder { - color: var(--text-color); -} - -#search-field-wrapper::before { - content: "\1F50D"; - position: absolute; - left: 0.75em; - top: 50%; - transform: translateY(-50%); - font-size: 14px; - color: var(--text-color); - opacity: 0.6; -} - -/* Search Results */ -#search-results { - font-family: var(--font-primary); - font-weight: 300; -} - -#search-results .search-match { - font-family: var(--font-heading); - font-weight: normal; -} - -#search-results .search-selected { - background: var(--code-block-background-color); - border-bottom: 1px solid transparent; -} - -#search-results li { - list-style: none; - border-bottom: 1px solid var(--border-color); - margin-bottom: 0.5em; -} - -#search-results li:last-child { - border-bottom: none; - margin-bottom: 0; -} - -#search-results li p { - padding: 0; - margin: 0.5em; -} - -#search-results .search-namespace { - font-weight: bold; -} - -#search-results li em { - background-color: rgba(224, 108, 117, 0.1); - font-style: normal; -} - -#search-results pre { - margin: 0.5em; - font-family: var(--font-code); -} - -/* Syntax Highlighting - Gruvbox Light Scheme */ - -.ruby-constant { color: #AF3A03; } /* Dark Orange */ -.ruby-keyword { color: #9D0006; } /* Dark Red */ -.ruby-ivar { color: #B57614; } /* Brown */ -.ruby-operator { color: #427B58; } /* Dark Teal */ -.ruby-identifier { color: #076678; } /* Deep Teal */ -.ruby-node { color: #8F3F71; } /* Plum */ -.ruby-comment { color: #928374; font-style: italic; } /* Gray */ -.ruby-regexp { color: #8F3F71; } /* Plum */ -.ruby-value { color: #AF3A03; } /* Dark Orange */ -.ruby-string { color: #79740E; } /* Olive */ - -/* Emphasis */ -em { - text-decoration-color: rgba(52, 48, 64, 0.25); - text-decoration-line: underline; - text-decoration-style: dotted; -} - -strong, -em { - color: var(--highlight-color); - background-color: rgba(255, 111, 97, 0.1); /* Light red background for emphasis */ -} - -/* Paragraphs */ -main p { - line-height: 1.5em; - font-weight: 400; -} - -/* Preformatted Text */ -main pre { - margin: 1.2em 0.5em; - padding: 1em; - font-size: 0.8em; -} - -/* Horizontal Rules */ -main hr { - margin: 1.5em 1em; - border: 2px solid var(--border-color); -} - -/* Blockquotes */ -main blockquote { - margin: 0 2em 1.2em 1.2em; - padding-left: 0.5em; - border-left: 2px solid var(--border-color); -} - -/* Lists */ -main li > p { - margin: 0.5em; -} - -/* Definition Lists */ -main dl { - margin: 1em 0.5em; -} - -main dt { - line-height: 1.5; /* matches `main p` */ - font-weight: bold; -} - -main dl.note-list dt { - margin-right: 1em; - float: left; -} - -main dl.note-list dt:has(+ dt) { - margin-right: 0.25em; -} - -main dl.note-list dt:has(+ dt)::after { - content: ', '; - font-weight: normal; -} - -main dd { - margin: 0 0 1em 1em; -} - -main dd p:first-child { - margin-top: 0; -} - -/* Headers within Main */ -main header h2 { - margin-top: 2em; - border-width: 0; - border-top: 4px solid var(--border-color); - font-size: 130%; -} - -main header h3 { - margin: 2em 0 1.5em; - border-width: 0; - border-top: 3px solid var(--border-color); - font-size: 120%; -} - -/* Utility Classes */ -.hide { display: none !important; } -.initially-hidden { display: none; } - -/* Table of Contents */ -.table-of-contents ul { - margin: 1em; - list-style: none; -} - -.table-of-contents ul ul { - margin-top: 0.25em; -} - -.table-of-contents ul :link, -.table-of-contents ul :visited { - font-size: 16px; -} - -.table-of-contents li { - margin-bottom: 0.25em; -} - -/* Method Details */ -main .method-source-code { - visibility: hidden; - max-height: 0; - overflow: auto; - transition-duration: 200ms; - transition-delay: 0ms; - transition-property: all; - transition-timing-function: ease-in-out; -} - -main .method-source-code pre { - border-color: var(--source-code-toggle-color); -} - -main .method-source-code.active-menu { - visibility: visible; - max-height: 100vh; -} - -main .method-description .method-calls-super { - color: var(--text-color); - font-weight: bold; -} - -main .method-detail { - margin-bottom: 2.5em; -} - -main .method-detail:target { - margin-left: -10px; - border-left: 10px solid var(--border-color); -} - -main .method-header { - display: inline-block; -} - -main .method-heading { - position: relative; - font-family: var(--font-code); - font-size: 110%; - font-weight: bold; -} - -main .method-heading::after { - content: '¶'; - position: absolute; - visibility: hidden; - color: var(--highlight-color); - font-size: 0.5em; -} - -main .method-heading:hover::after { - visibility: visible; -} - -main .method-controls { - line-height: 20px; - float: right; - color: var(--source-code-toggle-color); - cursor: pointer; -} - -main .method-description, -main .aliases { - margin-top: 0.75em; - color: var(--text-color); -} - -main .aliases { - padding-top: 4px; - font-style: italic; - cursor: default; -} - -main .aliases a { - color: var(--secondary-highlight-color); -} - -main .mixin-from { - font-size: 80%; - font-style: italic; - margin-bottom: 0.75em; -} - -main .method-description ul { - margin-left: 1.5em; -} - -main #attribute-method-details .method-detail:hover { - background-color: transparent; - cursor: default; -} - -main .attribute-access-type { - text-transform: uppercase; -} - -/* Responsive Adjustments */ -@media (max-width: 480px) { - nav { - width: 100%; - } - - main { - margin: 1em auto; - padding: 0 1em; - max-width: 100%; - } - - #navigation-toggle { - right: 10px; - left: auto; - } - - #navigation-toggle[aria-expanded="true"] { - left: auto; - } - - table { - display: block; - overflow-x: auto; - white-space: nowrap; - } - - main .method-controls { - margin-top: 10px; - float: none; - } -} diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-Light.ttf b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-Light.ttf deleted file mode 100644 index b49dd43729d456e489a8f4c8ec323a47ab8b9ae8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94668 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

FsulxL_Yn=fqW!JSYn4UZz_VI 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 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-LightItalic.ttf b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-LightItalic.ttf deleted file mode 100644 index 7959fef0756e905627298817d86513fdf26d6922..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94196 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 Sv(kH?wp@?o-S`p3*#7{ysOP%? diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-Regular.ttf b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-Regular.ttf deleted file mode 100644 index 839cd589dc5eba0da98b43451b4ec6c328ca48b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96184 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

ucu-&%9a>XM7550A4YWv99%x~0LA&?HZ)eRytM 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 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-RegularItalic.ttf b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/Lato-RegularItalic.ttf deleted file mode 100644 index bababa09e3fad2aa3e788898e7753ff8d80a8e8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95316 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 Zdy6Gm=sD%RPg|bPWWD$h#s3t#{x=NUkZJ$` diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Bold.ttf b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Bold.ttf deleted file mode 100644 index dd00982d4952a7f6b7725fafc1e648128fb250ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138268 zcmbrn2YggT7xzDN?`(SSb$63Z@5!bBNk~W|g)~ABgbo2h4ZSO&cM^ILl&Xk`im0fd zqJka8E+Q!SSh4G)B=7Is*({4b&+~uZ&!7AG?zuTTckaxbGc#xA-UP-OWA1D*Q`wY) z9(Bc|^+TR!{6-42B}H{*Js~+$LVO?{dKMLz{IKHZ%lLjaW6D=OYpUx^W43l-{Hsxn z`HbjU*SCOo4AC*({xV~s<<)h`XCir_X+;`MoLl`F+M*3YsR5 z9RAv*IUS7kXrZ4c4xc^6u8-1y?*|~gankUKqy0X4vzhVT`HXpdK4o(A^!QcEdB%@L zFxJ%tHA6KVpUiS}DxJ9MP9cT;0T1k$QZAuaylI`#eb z?{V>fj+BlRHAc%xekVUUY3z*rcNWJ+FuT8fuOcs18K9hII^?lRq0&}J$s1T2kA>FR z-cc2*q6i~Xep6T%wKMx3MFrK&$c!Bw%6A=hR1)qvjPZNudwx@CgD_I=%!D&XR?ae6 z2^-ADu>_WnpR!pIo4~rU0v5$8KnY7@27Ker1oL7ZtP9I!rL2%8vn(5jZc_g4dcOLnu zMLr7xD(d;452`&K^=Jb+;@E_aKeYDfrnN}{+U52Uh4%S>IlLJioi&j%4J~JTu z|M@Uj_37{#o1^1K#|Ox*6h2vseo*~i4)QR0*tS&~JlLcil!MLDanV|)&a!n%@BjKu zGIL?m;nUM`49AfSFTV50#kZ+<9NppN|Mv&=2YKAKuspN%3F1}wQ>|7m;ZhQ|Bvr(UscQg`%#VWh@gL@ z3GVno)6uxqggOs~SLefz%h6}uEj=^}nhKVOZ^>J|m@m%M4(%T+@91F8%mbfsXboS~ zyoB{bU&w-|m%)?s(Kgx4%$)FTGV0qMKgXiQ{P1llY9Gk_ab*dvpk8CvZ10D&?)W|h zrI?P?C)p_+U$P7A7xp%5WIwTY*+m?$uoKXX$4EP#HM0#kCb7x*{x0?wdxL$1w2RpS za2Gp(gK9{1bU__C`YDY8#T|d5j#OW&VJ7P3uhlT0B{Dq=MSF$g8uA5I8wLGveHLm# zIc1~e^r&$$uJuRjxFHuie4nP}UW{w=k)v#}1k|S-dPj`HgOP&n7=^3+QPUjO2etIl zd@u#IE@PF*D^hDO^3_75H=w;pldttnJ+7@qOB+x+8XfF#eIb4(KaK17iA6wDiF^#G zlM$^R$!6nIL3>uBPL!ho`bgwf3T+z7;GyMHruiAwmb|J^`U?7tKYXGZwu!^tlThC7 zxFSQ-{lDr@X|_BGZ+RKV2sW0zhY{cuENezPUI0(9hu9h1DO>9+C9DP`5^;*HU^Cff zwuH@PgRF8s8_3q-+Z-xY$4K@VTZnucHJ>PFU!%>xMlA>8=!x3TLdhMF(gC``S~^PG z2F?RIr`cq5$4?!H8Z4O3{Xm~KqC;=EhdT4P5$rK!} z9oLXkR>w6QH(5r;}6J77NoP^%?s4hW2?MeQ!xa+JF2^I$M2b`v1QY zV_gN60HteyY+w!6a{R~hf8LMXARVsN{%L2Z6C~A*^3~{UhyNydLdTczt_xUExMF>f za66sNIr*bK=FRT#)?oPLO(5@!^$F%0rbIvrtlKVP)}Vh0(Bcew6>}-+?XcFN^~P_O z6xu3DOZ&e+xVlB%seUPXiwSCzx=9%F|i%Hxb#)fKarJ7yA3^j&X^AHEnd{LwQ5 z(T{`G=hgG-3u2A>wD^*RU>4G&XB*)`;TUToFc(FkFUMf6k3-y)fbl5_9-4w!EDbY5 zI?GVcsV}Q93L5LXVfN__`_icTE*D(oI&RPHxDz+eScOhtxOtcJ-S2nfkf-m-tbv#r*h$XcMc&O0i1x5!=NM zv0ofe)`^`WO2jBLco1K%ZdbR84PuYzFV>5D)C1~4b+c|VX8NueGoIor)%(>4)II7w z>MnJ+SRy{*XW0*;QS?>sQ}^5X+XbkvsmIj4>ORqg8FVP--QgJB7NK9>jk)Vy_!`5w z@HTsgUF3bmSKcj=|LT!x`)`Hzeb}`53E)p|>vNi}@

tc|tj@Jgb~lURB;wE-Rm_E~>X`RO8eHHC0VlbJb#Xs5%@zF;`uvu2R>i8`OR3 z5%oB{=ymli^^*FY`hoh9`ic6Pa2Ls9s2C|`h*q@Uec}P}h~PrI;VfJYw+nX<_X_t74+=Mg z$A-s;XN8xB4-X%0QcNDEu*iEN_eCC!d@}Nd$QL7DjeH~WgUIVqo>9J0IZ^ph1yRGI zMn;W^nh@}rHZcSDb_ht21)y_&5y@xA;Z*y=TY zm0#yy@t^tcN`Pjo8l?fY8m~-NW-AMn#maJ}P1&aGQue`C2Vtud%HzsY$}_Oli^`kI z`^pt;ak#4istLAAf~~r$`I@b!Yqn~Et=6G`-v|GE7(M>YJ8Z>-he#14#58#J7O_{{ zFOG?m;z@BvydmBZSH*Slo%j*9>Iqv_!&d#QwzAW^=>7CYeS|(u-(BBZKR`c5-=trt zUk6+5H9T#2&G3ogTf;5QR$fLUY?W+GgRQz6b6~5U#wo_>#s$X3#P^^6(QM@jTLp&et+pB#K1#DyNFk3dE^VdeVnjX*o}$6D{bI*tlK3}Jiq6lDZS5H4 zJC<~`;B#5W(vB9K-_@~%zVDdbF{NWNUrgspq!OW+fG_<-{}dNOaaJ4^jQQxN*E_O1 zx^*PsZrJB)f35vhe7+7|Za>%lX8RlMuS0jC{rmQ3+rN@I{P)l6*BQHh6?_4%U0;8F z-Sy@FJ@wT@+wZ;@cWpcUd<`}JeAMS7uZ@SK*@#_R2?FK8Q;2}hGiY%x!s%!F6bZM#xqXISl_t7~?xIvwi5f9T3>FRO zXJf<^^tIUn?W8du63Bm~7cF9$Sb@HHSUiJX_^x-A#F}{fzr+QfoKe zce)?#6zsKn03Z1comy(hW|=7U zfY_iORhBH`O07vus!2P>+e<)$c`&dQeOhlf-0oJLc#t%(-2)2%-`(#1KRg zLopUFw9LPMA*R@;&B6QG0dY6hq8GK9_+9oryT!L7(h!I>>=11@Ardek)`-)hjdH{r z6m7hUcw;gmj;V+?n#B^n91+KT6m#%rF}|N=*&M4+?#S}FE34y1)`y3&e%!?RBG&KE zBUn9;VIz1F8_AQ|D4xnj^At7=QR5Vz!>00FHjQ^@%{-6I=7nqlFJpJ{O16Yovz5FL zTgGcy3-60<@Hg2i-jA*3{rMoaj@Ppdd*mL?dIdzPTt5Tu@3$^ zJIJTA!+a4t#Ai?h!%p*6>{-5=Jgza zlY9kxnQvjQ^WFSy{tu{z(3@l@XP#DeuaO_Z}K1bkNhVk1hLT9{5$?V z{~7(Uo5&MA#HW_H>JP+Nzls~^q3I%9~)ShSDm}gQ|GJm*9GcA zbly6>&ZrC5CF+uN$+{F>nl4?Jsml_#bWB&MGwI58#md8oqh=}(Dzh+i&r#+h(mJ5b z#T>p%*{$qBv~^I~s%%g;BKm5@oW5DvqU=@f!@N#WSch7UdAvg9YA;n$D^*pk!c&QA zRj1adc51C^ul80Q)H>Bs?V~!WeN|_*A7Zrrs;fFcbyEi-0`O1=sr9O-I#~5mhah@u zP<;>w_^QKHKSXZ+>IlRLBh^54l!y}vB2kz{21ckHk;`hio( zya$`hi`g7r#OCpyY(6h#Yxn@RmJehbc>~+Thq6{ajBVi~*;YP^ZR4Za9zKEH!~V*`s_3dyKcRlYA+AoG)Xa@rT(}eu90@A7x+g$Jlj#lHK5s zvoHB6_8otQ{luSVKl2yZFZ`TxQh5w<+F9iV#A;6?vObN7?TqrA@;oB#CzVs`QEk2O zAmXuSXvKh)!M)n*VW0XcRtgW$fyEKdGh`ncuSz-?6lX+skID)wD0dZ73hS=^wM0gL0<5=O` zi#5(&m~ZxA<SO9j@gk!5=hes6 zQ{n}2PJKdsQoJP2i%-N8;@|31;$`tRqQ;LAJHCZ=A^t_Q$=N`4hBR8>kYN%P(E(P1 z8tP6+lSHK%hhh&PdP7D^#01DFiP{7iEm3zs#sECeQxQL4HL0P#0vRt6iy;#v>Ly5v zet>!i644i-ZiGyhs4qdLfUeLZ62a`jutUYvR>&NQSPqGZkq}EEyGz6h$UKR<4KiP% zMI1eFJ_ukg#fm^feI9bKL_H5VM54X`*&q>XAcsoSry++)u&!p9%NW*y3@dDg6^4d- z4w7OEpuP;bK%ydQ!px_kt*iIq9AGU=D^Lw}E9AWr(GT)IiKv6zFA=qn2PC2oA;_K&NL0%2s6=dld{ClN9>*l=HOPk~;wQ-C60sTb zVTo7`c>+9wGTelGR3Z>#Vi#3IP_%neqP_u%*p^V~KBpw&cgQCs>i3XON<<9gQxcWx zeHuK2x{#kdD?!}B*cm`J%mic)0=|MhLrEnh`58fePIjX9Bm0x@5@g#~0ktLBjmk>g z4c@fy7vx(Oc0pbQ?*g*tdlJMo47Vu9*=*}^TzPbHk{bp?Em z$XkW{Lc*OOuS<9k_Lr1o(2uKfs?jC;z2(0i0|^bpV{~(=Oq!L3T(Gr)e8%96wS&=Qz=D zfK(*Z@2Sojj*vpa@*#B=Tp{fw4E=@MTQEXWUI4r04Dp~O3=(apwO>C-XA34s7YXYN zN%<1tz)iyXL%Lgtfb@{ixPp075(DWa!OlFxyeUb7^pUWUkiHg@A^jw56r{g}RLB4c z8x0v~Aq5il)@(iuGT1@_WQYWN{)~rOpf=P?*i=aPhej@>QNpG{Qo9h{0o55`Uz#Cq zmgGTFodKH-8EK&qGD<>Y9^x5E86>p@z<#*qi{y`pr5TTtU_YGkcnj5#R0n{aaz_5D zLAIl|18f;2wHHwfs4W0%fu!~#$aZNK@D<_`$(xYr61EC5!vgt0ri87A%(6hX?qXpO zWLF722SdCjA-j|B0@}I9`av=TlG+zwr(d=ywd-I&?FjHpfbo0_VqrXFPYK%zS!$sXlI%fD0_76wi@d_Z>yW)9G`DDWB3n%d zRT7$8unv+ef~=9y+@slpY%&A%me81uxKBbhC0ha-zco9Nt;iN+13+Urr*UOkr(g@E0Z=_YgKU&=^aW+S zgntW({-{hsnwyYl7lrJMwozt-c{oS?lm%cR;9xOm0V-Gy;IE1UXak#pKiFmgHd3}r z$ezkB3E4!UdhS8~-$C9ZA^RxsZRK7-?X=&559C2`2>1f{1R+u&(H{tr1_{3>L^sIC zB?3OLoRWwhkWWYid{21_oJM;1oAL~J7U%Fa<*Y<}4v9Xmyb3*hN_i8YUx+Ut-;T+gAb?}UkDxSsM0k+7Xs-a(RoAC^+2bG^pfa|kn|nUg+m4a=yVZ~CJ=@5 zM964~4t7^#Bs#Q}8Vll(CKED2qU!>g1X7{z3Q6gJE*Fx1hSYV3M4J-g7Gw_znue(b z5?vvr1s#>8NTMr;ESBg<4wdLiAcsqIJt3!q8L-(ykaH!)bG_d!CN@r26;)M?0|evLSupYfkZhBiGD^XsDt{6M4@_oCQ(oi0b2@pr1>7w z10>`84agKgHVc9rAyGOYM@rOk$Y~Ol@@ST*6_BtgL48iZwuIUX5_Kl1{|U4+p;kg} zl2AVstrE2ga*Krer9j&eYBeP4Pf#DFJq1Fofkayn)L+F;iCPPZ_9dv_ihUBbH{`t% z>cax=L>I{ZfZ9F>675Kc?vUuugouZP?+_vh5_Ta(0b_dj8NuLVdiWN>^^mYP z!H};WHYRATtcP6*2Ak^LCA4nVdq`-HQV;tPw1(EBO$jy$675LPx>IkIuo;kH5?VXz zBP6shsi*q^S|jS|9)Qh(qjTW(B`b|+{ZrtczQn;^SNXicW4x&gc?$Mo3}J`57}An^7j z)8|QOO{UM6;7v@Xr}_h0pXtdqfNg_>{}8lR(^H)R+XG4M0%+}}FOjf&AgTU<)?s?8 zGhllm;cEn~$@K6eg7z%+brQZ9lG*~$zNDV&5AZyO=?6*J8OVAGUk5o@!p=gXPZE4R zWP^k~2TAP$_y)*f61+pp^ur~b>OMk3`JMnGrl&ds+F#U@4*@)1V*;L;8IZ+Vj)jD`5qY_er=rS;Ce>k`DpeqtcV#0KCb~^yCMC*FnB2q30y}*CezLqJLdN z&rI}hNcbGcHzoA^ME{nA_DA#=C5-I$wuJUe^zTR*+3=Et_D%HfN*LMmJqhij=--#n z^A`OF653PIe<-2nF8Yro{BFpPCG;Fd|A~ZCU%V`#XEORvCAA#UM%I{kVp8YcYcM?W=$VK9CkdV#GyTsJM!H`l zoc!xo38U|SlW_92-zALF{vqM;I|KZhP*64l@+B0M-vHkxXw7YaZxghJHds)QrvZLN z(3;x-zakXM4}L|^+S>rz5ws>Zz;*1=*%FApkjErq6y(F;1oRD%kAlZ=J`D1dM2v=f0>F1@ z{bzhyBE~QlrjrQVKMeLD1j-Qx-yqZpknjycy$T8Y5-R$580<@^pF>7T#9qiGi8u^d zBN4M9Ye8@1kG2e}1E{M&yNA^SlwF{$!_bz5KpTf`0IfJjTZExK!#3j_bqj-kgl)$; zd^n8m0chPene0G|xc7uOiX*Dt?YU3DDl+3?zIk627J4yGY6lh!-L0diWWw zaU<#aXORZiMA9{9p??9AzIz^eTpvk41Mw0hT@M7Vk326CBr&%W;uFYMB!aGeRU-Zk z`G!PLx!#wk7?UGEkcgKduS;l;CkpKr1$ztR8wL9kw4RRY2C{MfHe`-Od<>Z{5g$Sp zNW@2w!zAJ&<-|5`p%M9wni5el*G) zeFJTUdnE-(RFpF*97IBoHo3AF+>7^110hkjE3lPa2tsHM6rB6x(S3)+&WG`z9s{tY z9o`83`G^MXAMjtiG-$to|KX>h?IkeA;&4>5yAUzGf!Y5z9?f%jE#BQ+h4(yP9Nkdec-;)$THR6IN4i^fv33LO z*4Q1j`_kUcKE=Mm{x16m?LV~t-u~YXItLGjV23D&REHdgo(}6AwmZD*@R`Fm4!=1n zj;@XYj!}-OjyaA!9eX$V+p6k5Sd4uy#=Y!4~(p-<)q75mmghjxjMLdyXswIUDI9jT+3bi zxej-2a-HkC)b$?M2V76Oo^^fI^*z_CuHU-;?xwoAxdpmKxFx%Fb1QbMajSP5<2Kc8 zzT0xQSKQup`^@bdx8K|qcUSjd_W|xB-6y%vac^;7@4mzRWA_^#J{|^-IFAgEe2)r` zfgYngCVR~FSn9FCW2eVKkB2=@d;ILt;pyb*>uL0i_bm3T@vQe8<2luHzUOk!O`f|w z4|_i1`L*Y-Ufj#Y%ik;9E75C+SEE<6*FvwAUTt3Yc-`;ynAaJvSG?Z!`poMauiv~C zZ&&XCZH&G@k`ND|}jg_V^s}dDQ1wp9{Wm zz8SvDeK+~;_C4(Ti0?DL=Y8Mvz3Tg|@9%!9pQqn6zXg6P{LcEl>i3@CRljfje)m`X z^ZhIQ`}q&|-|2tQ|6%{r{xA7o^#8>F%YgKNynyn6z5&AmCIrk3xGP{yz>a_e0mlQL z3V1Q#t$>dMZUp=oa4XO;&^OQ+7$2AwSP(cdaCYF5z;%J!1NR3$6!>J|xxhCAKMK4a z_zQm7+&RcEC@iRJP*G4#P<_ytpy@%2f({2g8uVxIhKvt667p!svmqBkE`?kP zHHOBAE)HECx+Qd9=+V%}L(hf28TwJ^_0S(e|H5zMc?`&*;zV zFBycv-4JAmG^7}^4JC$J!(hW$!!*ND!{dhM@LM168?G6?Glm%xj9JD4W2JF`ainpQ zagMRYxZb$Kc))nv_>}QQ<3-~q#xIRO8Qa4g!+gRFVR2#2`0b7l!~PxKJ$y;{$?zXc z5vH-GR@0@3kcgoXtr0Ipyb-BHR!6Rl+#LB%A9=n2t#qOV1N9sO&J zbBte1a!j|F88NLfFUDMowTsP)ofUf|_Md zWo*iLAmfpYa~ZE?e4g=5#?P6tnW>q*GgoFln)z1dcUjI^-dV+26SA7Kj%WSYCAZ7C zE)RD3u4_!!-d&e;J=FE%ZoFG|w;|mg?Dj#nYj$q-lU61-6i+il-v7yJ=9_I_(3VIbxESO!eui({!cM3i(_`Kkof}aciDinor zg@X%670xT%UHC}h8-+g>1r=o%jVszybgt;NqD#e&#XiM_#TCVM#r4G_i}x45QT$`^ ztrCY4?~>S(x{{?O50|`9@^R0oo@08p^*qz_qf)0*uhOj2#?tkr$4gI@K41EJ>AR($ zmHw;r=hBWc`!cVx(6Y#~@n!dv9V>gk>`J+*d}#U7@(tyWm0zy#t%$8itthOhsHm$L zRnb)OY{g3zmn&}d^6r(~tG3syUR!#-(Cf!a|4Kt;bmgeZ$(8q19;$q(^6|=NEB~wt zuZpY6sLHRZs2X0iqH06c>8jVOKCe!wo>0BH`swQTYIHTGn$ns%HTTpUsyR{fWX-vn z*J|Fcxl;3W&961>wT`tuwIQ|9wNq>7)ZSIQvi95F6}^}B-rf6rokLwhT|?czx~KX$ z^eO9eSD!6?-sN}8@%~7Mkx?Vl zMs^!nFtT;zu8{{u9vk`i$TK6)kGweYqmiGF{C4E8BRfVpjPe|nHL7aVlu-|idSTSh zqZ39Kjb1(a+~{j#_!$2&<}m}uG>us|=EX6W$GVO!7&~a}-m&kEz1is4XlTr7EN-l7 z?B6)7aa`lH#(9k`jcXgXG~UyAxbfk}CmWw@ywG@YoWr=Raihj<9d~}*H{&bEPa3~= z{OR$R#{WDaaze?3X%qHMcxS>dP03AlP1Bn;G@Wd^I?-cd#Ka*Jw@kb`$#+umq`M{^ zn)Jcs;K{j@%P04nJaY1s$;T&uJ0*5XpD8=0T%77Ub?nrmQ@@@TJgs5c-f3Sn2Q`mv zzNh(o^Iy}$r)N(eKYi)+?bG*7KQjH)jK~@3Gm2)^%@{eOdB&0%tuyYM@yLwlXS_Y* z+KiuOsx!T3nr513&Y8J#=I)vI&wPI7&6$7960>|}#mvf{)o<3+S*vI5n{{^9m$QDF zt*2>&WJgS=IoyH%$yhJyguiLxps5C=O)h0pSykT zhx5Ybb)8o`uW{budE4eaH1DN(m*=(551pSgfAIWy^LNaDX8wl@Towc_NLo;`px=Tq z3+63YymzTV`^Y!gWQL6%8v|R%~B!Y{l6X@2t4C z;`f!VD`Qp`t{lE{!O9&g?_K%G%I8;JT>1Sf$5nx=;#TFYs#w)$)sR(VRxMt&bJeL; zmsb70I(T)=>MpB$tS(<&w|emE(W_UkzIXMB)i136evRWA&ozN-x~wT$Gkne3HBYR$ zzSe7P_q7w&KDhRSb-Hy~>&C5HvTpaf$Jf2J?vM4x^%d*qtlzc%+4Wa9=r&|*7`McBcw*zFP0pK=Hq~xgVLjS5?b~#0)9FobZ~C^?p*54F0_5x_VZ@@%^{mp zHy3U0zj^%TMVs3;AKLu%=C?Or-~7iG_bm}yvbL0MY1lGt%hD~|wjA5?{FZmOe7WVX ztsYxVTeG+J+1j*q>DJv_AKUus*6Uk4wgqlW+g849#J0KHHf}qz?Wt{VY`eDYkL|A8 z!?tH`uh>3%``qp8w;$R5^!B&5f4zh4@Y#{Lqj*Qdjs-h5?|5*>Ydfy*xV1B6XXehz zolQH}?R;qGM>~Jn<-RL!SJAFMyGHL?wrkU_dv-mr>(s7uyDskfbl11LI(B>Qj@+HK zyJ&aK?jgI!@1C{0W%tJ2dv-st`_%4pyD#qkboV#A|JY-<$7k<@_mv#@^uX5#{y1oN z(C1*-!PJAr2m2iydvM0V)dzQJ$Nqyy4_-eMeyH-$ltZ%*Ej_gD(7{7khcO*9VMi+i z@6)LG9e5W;e;0?DJ;OXB&C$^&d;6?te{)ur$)I?e6tDIJ`(t86?EIla4~TffHp7et zrR`QzedUM|u1`EUWoUNxktgV7I0ZQ|rCM17iM5=!y*WB6D%xacr+S;cP000U_m%Fh zAzAQd6!q7fwKztOoq*-Ri&q_Bu`42*KghxeXq-SR0PX6{$QKoP^Umri*CClHA zkE&hSr*3Wk?xVtL{j(y9>xYz?vIA;sU3zVv*tEUYY^?VUnlfV46l2gpEI#QkF)^&Z z*5L07Xf0|fyPYW-*-@!c?2<=^uC1zESsxo+Nd{D&WSl(J_2l6hO^Bjq@x4AR=1>}N?ijz8Rf_2-|F zYU})4RM!O5)r7iYKjOdEHN%u)_O!F({p(iL)U51N&|s+bO^eR&TUF_8avFLqY$8>8 z;`SPAm7ScX%x-_jkb?a4Q3_N;me=fSMouOi`K>2fTTdu!{`~XSbnel96Di5MZkCjk zDkIDncJwXZwvE5AZQFd_Hh+G5(|js(Hp(oJ6262oM`w{iGUx(NAC%HFb4GmMu7zpl z4!$XAf=fzHeQA0jkDk}wJAZsWt}eoTdgE#r&4WD6-e%R?q}uxyZC20T_rkmPt*%hk zwEx1L+i$hc;=UuX$-?Q0h+@PwI(bc)?}Sz!4#&Kyl?QtfiXPvFYTx=(2chz(cUQ8| zV@&8bdezsr+m3uc;g`Q-zOb`b)U>oxbF!-1*`Xpg1`WD#Yx;%Y+5t5|$9C^N7F08! zHW(WooSuYf*2WG5yxrU13~!{iQKL<8dEbJqE4v7t$66^+?9&_47j;8kym(#a{BAek zbx~-mG}zaj1>a#|>Nj@Lvb$(b%@ZnT6%@>>teRO+Ftf^>lVb)hRof;{++10?dE(@4 zRg0R&kDf4L^!O$eik@XDsah-gXl0W<(avP@?d*FMH+nV~mrO72Q!zU?8*LgrxVqPf z35zYZA#(|n_7FF*1!EMUCxdtSPJ&t(7W{m#>?UktMw{0 zxd%H1d89NoO{F4EZEC+dqL=^Sb+YWs4u*sWJLo1k!sN0amZIct%+IFe_B0S#%U*J$ zcv^9Odh3A&m8G+CvXMM;Kvn4w|Mow>{+bUPo)QJyq@iV_QGQfLdZFfq=~24|}SG>@8QHSAw2bJm$~8b(6d& zA0?!|C;Lf;r`b~*yR;KKo-}J#YhqGz;<{#+6^r=B_F>)f^1AW8?UNU+z_r+KRmyO! zD{@!O-hO`m=FH42^p$tc?W%J3cN6XbZk1bJfX}^|F(xx}Oa@Q6H67OpT-OKJh23#o zmKpW$%)w+C{q61R`)~K*oC|wThlGY$2Tyy!74EgZW>1uzlcK5)b{Nju55!d^Bvi+q zJQ-7+m{=Xd>(NyV`Jtith6}i#7w%Vr`(e+`?5$dFlSQ36TAO6-?Y*9Pg#L1_$7YF-3881DwL60)2;tMopU5{&|;>m}$X2 zy@g-6UjQ~36;_IS#^TwRH^W}IE*#S@4YT$zFQz2xs9*}GS(W!L%@Z!otvWTNG-Akv z+z|s~yVNHq`X;#)WGYV|tqRt!oYr?v-t3ZI%aYD}xuf=l$lavX=x_6h?bL~>q-sG~ z&5~Z(!wf}PS@|_pxzRm>vlE+Ka%c3eo1PmLS|8o3M}B39_mId4DswV&^+1_@$gj}b zI{TM7nnpuvp$yE)8J!a}XARA{!!u*E1BHF-Y-bccFy7lI)-NU}&1LnR+8N!0gDQ{Q zDl`X2%=QgLxeI%i72_^hma^-pZ}D(Ddvla}d;Zr(qOjXTQTO;9=Xabds^*uK&n&2H z%+M+A$DDiRhUbQ*#y9dcNy$Un8&RF!)4S(QDDsJP%uMt092jgs8(|L_ed|1fIjHAm zb=F1;Fnno7_q?=ZNz%y5_+Ew(|Mbuy4?MsZOtf?DIwaG>xyjL~zgu(r62wF49f?W~ z+B${h(CjJaZ)yc(Xc4ffKk~E0M;KV`5Wtu%hE{C{U3qQ_kERHR`{s|yuJjEJ3kr_P z9^NG>;`}HFx2(b4+{3+{o%;+PF}8GRZ$mYBk2{6NBJ?Lqijr8romyhP0%hp!UZY{vJ&= zEccZ1lM==IBAT_+xh9e}t|P~y#Xi5(;*PyEJ3MWT1hULD3)uViY85BlWR4qVy8u5)NVdr?NMI1EhBO0{htA`BR#go$vo>6{b(RnUY8u;?*w>pwc z_Kr=iZn&D_>h7=>d<%0q4Ti8yXD9beM~9=TYBe=Yb`oxB@kL&48Sxq2)&vLmHix+R zIPsgg`uN)Lbo12z{9O z)&L%HdvxGzI;s+Z`(Vbg+OKm_VDCA7wu>4$E;}sNPwyWYk~GlBZ#Ly-J2}m>x6dqW zZ-<34;5{L@K3eOkh+4^WDDIcR&K)ZZe?7)}J04SbS8`s`=#1DX-}Kbc1Llq|oETjY z*(WyKl%7}FCwzfRqG51|A;8Pc%hSoPqFZsl_`m`F0e+soUT&W8-C_%e&`g$!`$j1% zXol2A2t@OUPqlSJ=TgRww^TR8E@<(dbMazYR!9oA<*Qw?M)Y`SqTRM_&BwZ=INOhR z@cod{Xc>%m~*s1tV1LHy?R$kM2&a?}3(BugW& zw|nd}md1A*xQ|*4bFq?!d*L~q**n@Mrm*+F9lJyx-M7c=9O5dRe4P?@+kuTPjXg#@Z$;z^=jq0YX_lxof z^6`#Ob#Z!cQ=MCYi*O2XE?fOVKu+K1?8Fqih|nN@?UJb?I(;tVWTbVOsm5c z*0g=BT3E)at+HwnKUuZOR;`_lw#KT(TGpD@S~4A?b68!L_j`DYKRhQM%}9MaE6d+r zo72>P>?LSpiDjXV)q{)*X+) zKT?ZAVmxE8=dlHQA93bD4_9A%lTWsF2jtehX-UTPNT;1UX(vQ@@SFG9*HuvoGpeP+YNZykv_*=wGse?7_XnhB3cw$1}-q=jg zhCH)xScb{IBczY&8q)sbhrD^?%$YmdKcAV%M-AbAsYBYQVsGRw?2c^Sj6ZLu<)!r& zOl0US9rb8Qi)E?xMwi@@@#DK@q?yg#9w@fsTSAMo<0{;QYjttaz__L{=ER(etFh4$ z23WPcqloszP!?5dgB(Y)b!LYr?O;KR-iekm$4f2twY1u3TG5elTTAwnX%!nSdAigF z*=R>uwQibL+u2entxmfedIic*0>40eShb1mQd@L~Hpim%yhCgLj?&_vrnO@jrO?k% z5~Ua`Za*1AY5j?Iujq|QG!FvP>zhen%gX-Niil(S{`kcY(j`*=I+ zETha|SQ2}V)_W%g+%6}LGO|QoHs!ose__=YsWkS;w0$&fiPqY;wf(GV^HmyqWZD5% zt)EI`kJJv5S}K_~_K+514_XCdk4^c$w_Y(uyF%OV)GX|vS-3+_b&*=KrKZ&>Hd?ZT z)H>T}$r4iQX3=`mKB`rlVskfY4VgB`CI_;+)Y{o-Z>JSlp3D8&VJiOSK7P>Fhn7f-o}O*4pdL9YeLz zBEQ4mMsG*ICy5@9F-_?U|MtGUR@U~AwKX#BBYR?)&CktkJ<&=ZCr@tS1*%8Nlb~}*Z=G4MKllvLDOTIPEgdXi{ zAFlOiqdC&KbKl%66+xx7N6Ru&-<7425kfgEhWlEz(qb|#^#YkzMr+z0yygjV?o~pl zmPN2G_STUWTdnYqlt8I}HQllQW+C)toM_QHaLU}~#>^5s-h2@H(JFdvVVx8lEv_M&42c$P= z*hkYU2XQB!q)f<9o7Vbh>K8ox&8PwSyuAI7Q3Doko!?o~Tx*H!@w>|pwZDOqc0*oz ztzNJ^MG~6*rIx%x)9R#GbVEt;Ji)3>)Y29p2RS!kPm*$QqWk?_`Ybl1Z(bC2i+SAhni~AqKI{AxFzWd-9;w82!T9>;A5l?I5+(>$J3% zUMICw3#pa8PHL&wNi9Cn4pK|jm0H>Bq;`%~i#4z{EqSy|D?R$}ccZ>YPbosR=O$ulF+(ocEaxGD57W6C&LW+y6#wal{RWtpiT%bLi3EVVSRO0A6a|E`shzSPoe zE7QtIUutQ#mD)j;c0(DoK2KVkNMCEGpOrc_kA<)p%RYnl)D#YlA7gebV_De4mqDq2 z=Ry^GQqlI_K7RgLv^JHC)M$G@@8W10@EuyA`d6p8gwxaPus+)z2UxO71^58pdy&i(Drdw7JU1P7<|+%#p%`l5L)c&a>$ z?};2xT|GFO+NT6LmumOJJ!m}Qx3$z~HLWhlMoXiK)VfJ6Mjkw4v1(I%v>Y({*=iGS zYqimva=_@#aZg?6cSUzxk)vIqJ)hIchutbFpEu<$wKURbTAgB}rBX|6kd2mlfz&oy zw4U_b&#E=+WWIN5Q^f7NQN3jjZk8OJ?#Lk#1DkwWSA^9~gw}uL?hy5zXzhWJww0^x z7F%{c?D)#mnt+_JSbu$HzH>jP_>jS^=5e)yXL|SUnHy8*5)m>mJR-!{#iQQ>WAKvp z5&T5q*qqV5XGad|VeXxRmN3A6T{W-Ajyu{C;~i;X6FgN!iKW*3AGIkKt!G2N&DjKY#xH742W3EZXx+&4RQS z)ET$^T`Ol0sU^E=X*(lR>{kY8b(C5;gUGZrgGepPWW5{BAW|!55Sf^tR1R7o0ZnqVmyo)cRZrCx1CvNHVHI1jv3dQkd&OX zZgCC;de)^|YM6t=vRSqdai7QzNwr0w8O!5iGypXQXE$D3jHqBqIY5sECGiHOtz{;VTC$bYcKVAG z(iT{?vX1T;r|^UvS}ZzgEYij_T%q*Q$^h$IefIBKSu&|5pViV@d{%17JEc~7Cq6Bs zE%{GpU--LL<}0<7ua?%5uhde$Qj4EqKdGe=N@`^U>R}y&rB>EhrlmHMS~+`4Ew!1{ zqWs9W3(9NK+5zvKSVv!}rL>w>C&yW-r7}pZ93`ceY9Y09r0#-};pw_no2bR5T`=a@ zYICqu!P*obv?J#x-^{VukGtcoD_TsJl$1QyfOoG}4YIy_)zrk}u=(bH#~WCCE08aG ziIS=13-89WAYUxH<3LnzFYDSNO=3cSc4(~g3 zb*b4hE+DX9b+FH9V{FZq3FEibF3RuQHy=H&2kw%9yU2T3o;guOCLc4R=-QM*_u}Jx zQrwL89!@^NZYl9WSw3y+^*!Ue4bB|k;^?qg)rAf0Gj&K*L_1#k>28Ydv1#tHBh<#_ z9p&0uRizmYZQ<#!J=xHnZBgg8vny|#6CUpwgeN=3pti6Y+QdHTWH(XhqGOeXx0Yqr zXHf(dh0J=OO?7y>ivC17nSE6)-j+|Ry){kLl5yU~*jS@6CMI*qIPDEA9vf#c#>E*8 zaqaJE3V2@1!G6BM!M=XM)^_>bTB|_Rir#(+Rg&;T6#t`H=h`YWi(cly z%t8H%bXXyEfw+r5ZN%==Tx|qX!LOl(>d9PSrkGYnXYD_gbbqk64 zN8vrvg93fsdU$&CGVALyTFIU04IOLAyqow#n`r%L;ZLw85+~%I0 z-WjEXcglOBuX>&*+D``i zxaz&_?XqI|n#9bEr1r*`@R;zL?p1?4k_=uR!vgg*Nc5Q41Mz`5EqJJ3;9kD~S8tz0 zf1P6jtg6+3`ajp^EYYsbBAOQe!+}Ms(`mDa9cmk^oW?AKG0O736uq=#w#U3-|3BZG zDkx~>kDua-2re_(ygijjZ%@UR=t_I`N-Yc4FPYSPdhYD}()me`;T0;Bt`xHw-q3W}f5Rp0Ftb!Kt6SQe@Qj7Pkw2@5HiuT)D&0}O*Zlk4MD7Aq$TD&o1(YnUb zcpQ#e&s8%qs)td%F{;Z2E#Bg@zH^mz$9om3+1~!6KBF`HC7aR$RJ&D^okd`t&d2EO zjkgxl;_*J!5+y*seia&^y?zxKHQV3+yr&1fe#K95uMx+oM#-4r@vaxjgISAw&OvI6 z?$G8~w4Qfp)BZ){3cW4X8y4%_i?As<9=c`FyAOER=Js1-mLZW3ZO$E$5tkhx?04;I zEhy-GaSSgj;k~h?GpeTKga%f|_3GKPM0e|5dU?z*@X@fmg2H^1T6=d)vxAXJE&g<& zQvY4sep{2WgN^PB{HNYoKHrl?{w3*r{EYtS4YE9ZGEVTnIT8ca=4j?T?VQg{3J8iC* zWG&xlO{=}1r};!UuCNpB+Ma->)$-A_I&PyS+ez*Jq3t~Y8>_Coao?xrBHNN>70Z&< ztS-w|ca?kZWjywbJ$;y7ZDxQO7+{!C0t7IGvLrwPq|qVEB#^ctoBpLNDVs{NEW06% z>?XU}gpt4Bx$jAq2S|3m|NcYlv5wxm^|X81Ey{z^8i~--w}nRXpoBl-vsHOe!W0pz z$b*vhB0^F24}NXruL~CLrGxn!R(4@^cR?%Q|H$Dt;b{@B5#iud#T2n8!LyV~+$$d{ zQmP%?YYnPWM9~KA)&TrIYjF5|;1Xlx;{)`?oZil9*7bHVfnc$J`?p2%{J21ovj(^E z;J}}=5*{4*W%M>CudD2&p`q^Lz2?Fl-xetQbmrRT=WjbdTxkbk8sZ`qL1Z8 zd~S$r9{$wwFMAfYJSfF|Vq^v2JhzDb{2!vK(t_2@*8vAD38DrFi#c%z18yG|p~8P) z#2l(96``0NVn=h(I)T#;r%SR}`NbAQ?cpNmpVy#Vy6|TeRe4b210obkgD^)cnhaq#TH{K{KD)z-w{>HYA?2Qgv-GRl-*O((xXEtS?WzI2UZ@nz$ z52rQ^PhCmlCT+maxiAzPtn;5a7F`U@tU)<%=Fd{q;%p0C&WKQ19+V`r2rbWp62BFp zpuB7gveFzBC)_NQ?}_*?=1?79c{&e?Q1C(N*#MWhB6MR8>gO_7gw9J)j3Kulkh!#j(#eO9 zggBnmdQo0GB#Fg#AY~+ta1yn@tc1IwwM7cQCJQ_FPAT8kJtamsry^Fjs_sS97YgUT9AUpApRHf*0l93-l)P(b$QkXqOA;T5*_sV-s zj#zA>DQvN0j>B!?rg|&=})YAHE@B>j3tPlhGma;N>(T^RUOw!JuqqH&KNnXlz3v~@k=;a z;(Ymav(;+0)ztjS;8va#%wYV}k?2g!+opqEEY^!t;;V%TMR!=1pq5TT?Kics-PA+|7;gYJ=9$Z~!0*=PyPFp-l5BD6szLJ`Z( zWq}A4b@v2jC~|!fTBjn3O16>~WV^&U*g z?6>KiO_9-HZPe}5Raz~crcm8*2qT)p4paUOJc-;Fl|3Jd`8OBk-mK5O$p}~z9#JnN z&7>YXK$^*WIPZyItq^H1!Er(#rnR~l+R!6Hi`P9{CqaAGL0cv0?*)%+f3Cms)gKq! zig{!s`|T1>gQ7ypN;bM5=7~I&g(CbmxGer6rtsLP@)47s>p*9j~AguYfx?@ z6`}eZw1Uf65o*jqOF4y#(5g2HC(}3+*Fr;u9s+4V`=7Nt<~&jq?UQG5WY0-ai2&|i}Th>^Zq^VNq>>zMaiOrDT+F+Hb$hF6@(Y%ayazXFm>E{2Mdm_s@C@@FNjPlOVlicnF% z<2f9hD!|XEU2ccE7@Apw@^<;N3YG_@c137;9+YH;2rZSM6~X|Y8$ngjd_GxFi1iWs zqumvs*5pK~Uc6bJyH~NlrjJ6(swIw|=T%;|uRyAi{ZaFwO zusd08tsArr_q0|U=e2%gZ%X^;n`*CU^ zg+3_1@gv}871_)p(f`I16qU-)hllOKnusCc#o^z#>m^o~gj@Ht!@txC zOMpxG4)nBgj5EYfXIdEa!5Jm*TXy6qw7|W3*tOi3qbq~%NW|@FX!x*=hOaBO8dvP2 zwGxoMk(E! z8@PAZHTa>azjV=j|1j{kJMPC1(FNsVJAoTK|C=OH4js6=B$sR~%W6t0=HnUPo=q2d zyKX`Dx7!Xkm-_H=W@)r~ecgeXjU`TxS-;)tVS2g2r8gO?E3>^)K4xVWCwU6Egoo6z z7^5d)KAUv*)gVn0=J4vVV0ylxZRaL`^OmYmWo1b1v?tjcFoma&j?5wtyl3EMo- z#S1Nq;}c;%^|G#%%G)?kIIXd1XFnxo2DgsYHtVW2&hlVDp_E(uYZvynZJYNsZZg#w zk%R7VB-!tqx3!cN9#j_k!Xwo+=Z@f5a#`o#m6bTDlo9pCvBG-H6)^%5BIWRB9g{fXQyL5+ETqA3G-sAM^~=T0&5?b91_v_tM~gF0Fh%pBk*;ICgIBVf z7wd6cv{lb(Dx%3EkFMuHJ5~V+{e10Fk$}^XLt6XnbgA|W`Igqr5Gv=^I8vHD-C0r^ z7IJCFYH@9mbDYtvn-JvmVQh38GytW{0#~J2qkuR@)mq#LpB52o9zKhKBg{3rKcQf3 zy12gybqN}Rdm|$!dk2;W>Y9tcQ=;xT)Q!3XiHKG^S8Yo#Pho$L)h#|B%bjLj*`nFhoUAoB`c(41B28^`MY&BobgbihMHPhu zK1&kx+$V8NSa&$a=T|z&W@A%@13f1_zUhz*tgY{8XF3sXNFVM??GGmG1D>YH?(V5n zBHbGttZqh~AXhKOT`DhYu|?agHI~Ino!J=LsW(^Gm<@|=o}tr#zUh3clwr>$9H6~0 z5D$<>lgzr(q?%MxiJe@spBR17I&ww-$mPAw+nRm#v8L9&ZMAhFm)&M{xok~+J?f_A z*}0`=YkSn$Tp}-Sjz)W(N3GRn!%le5ss=`ElHAV%6tg6$QUWlc)$32ZE5cf!j$zEzMEVY=&7Fcx~=_w>vB-&m-P84Ax zJ!O6Bf0_RPhBj(THOUon(|`*!*}9`?tO>H_>>g9FvNB+Fx2Ik*S$63v8rH_s9?RHw z9cBG%qhLHXwGyKcwK{N>w1AyAiYZ!Reh!_*V|pOp+^wzOj8rx65svgZ-i_(L17<-tjxSKuCa&Uq|N}XdiAqPcW|ax#B$LOvEqZ zHx$)VKe*9led^As5?!&pq_TMGmXBI%Hx5-ADk~KgmBxRV=<;+nu=`%I$6ck4`R%q~g$Zg7_4|AD`zAaQqEw-NX>%p^B1$t%lsHcQ5X2FLHXTldbpgFq z8_=d}{8MiCw67+u4d|*3zRLRK;Z0Vj(`s=!)m!F53jt$A*@4nhcOc*{Ej>_HVGJyU z=C+)ywV9i$s+!EUTEg>IUf+S&96)skj*IyRS1r4;&^k?3K^#6(na|(7)sj1fS68v& z3v*lx$J8v4PN3Y_J7^(!#WM0VkDz>=cQIe#SmYkYpRn?1ow+LW1&o#J`sf9^>l$X} zDf>Cf;j5QDa`3Wc`)ol?HTKPB5>@}V8-im@JO+3JOdQDv1Pvd`;c+$zW|!-x-pfB_1kRtm_;fx+b&wVpGZYOK|NSlm`L zHPjNWHNhcw?X_8d99vXrJeD$D=I*0g#@oZ8M%@+5nFmKUtW{)*;$%j>YDD_t4$|yN zgS~spRx}r}IqFc&<%OeLgyiytiLgs^P+d+d=Lh%Qh<7fz8 zwEh)#-CY|uwC_s~>~eKgwRu8~iJ;z~jokaP@TsqleZKhM;NT^Rdgo>XxMnD#Q1yQa z1%A-W<=7t+))!tRI)6Cym#;9acjoL8eQU<5CGaicWSFRPkb(&=#`;VO5Txm;aY znk|lVbFO9%b#Li>L8UmPu-VzBygE7TjkHZFpmPsuUSo!*ipq32}#UptiN3g|$V zrY*JTv&^KUWBGV|W@N?gvIfkyffsPZQ##!2ce$cEDL)DleImXQh8U46Ea%CJw>|u0 z;&j3lJRO5IyjgzupNLP7=u9X(U*>)Rt+8s}@W->q|F63p=(!Mm3;|QhfD2;mEY!1H ztw2~=#A<;j|5Eq7;U|Xqtrb77P`4~^m|bdVS(@Fj+`|55 z+qTRty0p(sX`TEviJ|3JyY7OGGX{#<0Ty(mo!#~oWFkm)mMM` zKW+78I(?zO#1S)j)QwAXP?Hp@<WqZ>%!yZqV)za@zJR@&A zGCqE!P5y;1WdC}aJ=HxVXHNNGPtTw{^AkBXfS)$mtJnqDVR96iH{mWCbPo=6c43dzub6YF)?F7P=Lc^>#Sp}|5$fP(J7TuX6%m09K|Sosa7mX`0zT9aC*92LvJ=Mrkecc9y!!M>+_D!vNvq~>E;35^AA156ty<2 z=2|-{YA1zQe`4&qSeDqE>^hMX86J=;7kAl(#Dm#tP)$u$){=^1bGhF(H~1IpLTM{%>~h&Y zW#RrUvApi=jW7l>JTq{N5-eMURGA}`+4ts z*LwP1ukzb#eSL43KA^AY>R!RiIZT0$_8VM9rE-xTo|VSQ?or;ezdvXvhl}OM>L*@IIKV3Xbm?X zQKxq#TIVgYrLFGarug7sylL3IbxCHKZ%yn-qZjfikz4?KMK3ueoG&d-2co4|$pQzj zUWwM#$ILawCEBXG;ayF~)R&)NrI|l;G%rlFG|CPY?mUQO8?*@S!Ou9vQm9@hB$ZN$ z9n-O^E-D6=(Y)>%@p?x*uVb2clY3|ICsuRan|WZsCZt;<-m)w^gO&>#5fR^XPl=W*_kL3XV|{mv8=n zWa`3Bu~*9NnnG=n)pFNRk@{D^{U*Eq*KpTc`h$_?4GT3&^^^8mv&Nixr7RJq{>C%k zW`fW=l1jGDnwl_&I5>|1eIgzm81)v#8C|NR)GB5kKjQ1Q4ulfDoheJTx#6WhvX4C5 zwmH_j^is;bQ0-~Pbt1(j{a;!d`@7hN_|V=Y7IyW&(Efht01X8#oa!WvgU7I6th4jU z@^daUb}nmEQIrkDE`x^d2=#gWeZi<*P%fbybX!jlaWdW2P0-Z5m||J@@D=lFc}1wu zQKG9dJMHR@OUK8TJHwk-zBc~3k^|%IyIZVPTWX?B_2Ht)7cyr<)z-^mFFAVq`uZ`> z0u?B03^n>}`))v{CC8T)K%tjjoPKDt_h~Yk$&$XYn936@Fjhyx%-*8AG@K% zYP}m+4y843H?-n`iZCP4z=mpg7A6^`3Z0PSk(lxQ{9yAYy;%%c7 zAGsUty0@kJ7sHLd1sZT*p+Ri78z(wFC_)E%Ac;m}hC(Q5-`anA5dXV_ew}BneTvKb z6wIIb-tgtanU}=avfm2q}+0a2- z63!c&E#Yt^Y&C&E4Sv)UAGqR*2gk=ByyA)vOq>iI*s`#%u5RDLmII+DeKq!A(2hH_ zQ4t-PeW*1;d@~P6vjx$ijOnrmA7~Qn3Y%Y3U8E_h(iZ1eO24J1=Wh#@@TYpKrAp~* zwbLmf5q1iSE`*g)P_iH9;tDn7MMr6+@4N^_ zG=KyZqX9%HqG2Scf_w5sD57B`Xwe#!qG2SczK}8o`Li<07<7TB(6NB;Me3rALC#;u zR4OsNyh5ouV*V2QWAU|g!At*wC!_V9as}VX!y(A>vINEXAzDqENtHA|xTV-GK`9R^yW7aX%k~L*QIGf~A2czq#H)!J zXCs)_PSw~}PKS_e#J$(s!aq~jZgP~B%BqKJ^EWi+t=6J|l&!Mm*_?lhqMIVMMM=1M zxf75aRbpt97&bh<<_6@H!|n5+oL42v!Dmh*5XlrzSxolCddM1{dmwPAg5^PJ&LXrZ z4~nQ130nHL&`2JXa7b*SDi2EZBtntdmm337qzIL9DD0ca8mHbmXuOJ2m_S$oheA_9 zl(A$f1<#y(8YaRA$V^HWIkd>1;&bKi%KyxBCoYC&)}S1x#C}*Fl*S}NWqDBI5+bxb z4@$EVp^7{xt$+xv5~08taaLmmd{%4Eaw-y^)k@D&mjZS?Tz?s(OL`q z*$MuvxLV_s&w|y0)Fy2P9t5aVu-@jQBikD3N!kN&N<{;9eJM;1`gUMixLrs2DdpN2 zLgxyVh@GR=r_rN5=;7J+#DZufxYji~*3c8L`61tz_eFg+1cRX64zXQnqjWLTTFWqV zaxWTAASevV<)P?1V}=iYkUPv?>?JqZ@Qe9apygPw?s>w7zxf;B!>zYIu(Z2ZxoPR^ z!@HM2tK4#qu@`eIlz74;wyMCnK~$-@bz8JP!>VAs-sZH|s{A2KH8Yl&)RxJ_%+`(L zAzCS!HEF0TH&q#`bYG~h*I691>DEC6vMgoXh;W^V<;KWu>2HIn-(9}&w|SU~oEu?^ z_D#N8O*uET#}gFU%Apk5`g2ahlZb4MQx1#xv{ct^5)okeP_eEXhf>ZBe-=46)ja2h zS9hC4bXfiysQD(*RwqU*t!jSC4Xx@-^j%n1WZFEi^e|7b`Bm@2mS6B$AgV*mtr4ca zlFO|@9MSIp-^bTLM`uim5~3e|+?M_l<)L_HE#J2AlQGl8!cVqj{@&{GSn;#O_)~aB?E`Fcp~j;rEv?Kvvh+|}Fwj_3czQYW{{DyfjKP0+#a|_Qq_L2di|W5B zVezE3Jc!R#yp96&W!(CsJ;)x<{0r)O;z|(s_V6ug^T40L&zmSptjE1h(gD`?@uxnX zx$cKerPXSAsaZWQ#4db&{`A))hvV_XJc4}zZ&RH&CFSR#Zam`(Fjq~#rStnRXynANd4K&&t)KmBF7t5pVzjx})@{S#c z5AWEq{Jv|hk!DX73zb-P8bJ?6K=lWey#C<&TTJM#DVa1?S@}y(=iOsMH7Qtwc#lcu zn`oyQ?N9|iCG;n1w+o-enPc6s($Z)Ar4oH-D7cNosvAFD?B&c+Hj=r5efIQeR&fe9 z#+^nB(psQJ4c{ket;E|~kei49I@tH=N~8&p9A{kRkD=4P77u6zmCrz zK-;_qi7|U`L`*aiU2Glyw>_s$?OCQ@FDHV*1dGQ*p}1i~@r@@>UROLbQ+(aYlQ$M` zU|ZWKi&;a_cse~^l=)`yB#i|2Te_nKBLTT%9vF|%jd|eT81;(1uQcKig6IYO1-txj zb}!#Bd3y4O<=sChTt4*W&mAsfZJE!P9sb;x4=oq|04<1fyN7&;kj9c_Upj5!eF%j_ z_N++f5To9D~;Q#pTYXzwCcF%79JWg zTe#z0zM_gEd0}O-|C&28??#h!ACIr!U5ow2n8u z9SYIn-Z*9R#}?b$7h-_aP8pWwHszmMuA2_ly}&^ zb?f%XNPlp@v;~+|04p~J-JQp;kR@2Mg5wmHmv#?{0b3|ml4=QxHmKjs9c9lKGH9weq%&5Vn^1gYJlVIu<+Wr}V_PU)UD}KJWnRQ(AULCYRNCEDh!rx$4>yxpOo%+xzs` z%pr^XYcgxFx;ki;eNAo&sXzYw^Upl<{PQ0dw%De}$ER(XD#z^D*sKGirmQu( zQ3L#*>n+gr9TIsa=`hW19GG(4&fH8P4~EKvI(yZCI=a~Y!cuH`uN(2@g$GL@v{}L6 z>K}w5%$~=I0H^;-yko%Lm`)Y=J&O!eS>~;&#?2+8e}x8 z72tGp))}v<-L=@fy`%8P!dh44zz$D|XMc}Et<(=RTG5jeJ#}DB5aMn0>Y&ttYh+`# zp!v8y_rUjM#WB0lrnOf^>o)FneEfl(@{$tvZ{=QhVd2T*k{yRLDn?$J4xG&gF?V1I ziDmJ~qRnzAK7ElrDJ3@1vEp=C>kW5;3sjaXRLTmqyDHLDDyvM_>fEJFu6Rj!F7vZQ z(CKIK=4($N?2EBO3RSp1SXZQJ-9er^pr=rebpofy=7H{I65R``pOm$a``@b%dTUg2 zFG#*TGTOA|WAAOVJ2&mv>Ysgb!^Zm`T%@&b0d^Z<+oWnzS?uOl@kwNs!a@_4bB&W| zOP^(}Sr_XMmJC4o#w{sdx3?i-GFl>j_VO)}*2ak0S7iyCn;fOhRGC5OZ9$dqo7(=35|75cV)5K*5Iw0C$1XBNh^r+n(K;i-HS>K>4Y7|tC&=t( zja9ERr`0>BUOuE;YC9gZo0O`<#Rzy4{h?;8hh5?kagvdo!Yk?EhXtq4aP4D_m}hKP zy9Uq{cZ1JWfp@kG z%iu!)Ut?IF{%AIG<;p9we|?mF6IBMUk{JoyzO_+})r3-0dgj zo9}(%%eP-8|CE}|vXuS1U&)-$ykP$|t%nYy?Zs%x(@#42+G_CSAPqlnMO6CVj&1hI zRo5%zj5$N6{DIQSvy~M`4nF;etYdHbly%CFMKPpX^??qd^uoW(`X-}$yKK#;)7QR7 z_6YT70N!_Dq;=>|v@(II@`dL;XSWm|vb!L$t(V5PhMZ^J9;2yFr8uoXtcu=TVlka{ z_~#~_&04u8uD;=#^i8RF`d~WVx#&zn(mLb*fo^|Sw>OfweDvyDT!Da##xS_rClC(Q z=J6b!*__iXXhc#3$Jdth7EdBD+3l;J*pq5nuytD+s@tcAy3@UunooMHL7l0(wAj_S zG2Ob@;dI$Io5}}T+ZxNuTuHxq0r)`qLSf;H;FkUZ*en%JzREdgm`aLl%8`kxvJ$-; zWMF(*(aZYlHxGsyc8(;rx7GW-?Vk31JswQ3thwG5hZJWWU8YcVz@@Hk-P-djTub8_ zZ;y`a<%;NNJ^V>$8tQzFrDaOBBHm_ZvpRQ0S#8wm_flQVCX9}xaxq0_>ndvm=va_! zNYnx)ON0TUNT!rr=^)<&k;Z4V;i*nlcYUD#;OO>{pnA7LzQG!(5;mM1ud8U<(KdH^ z`xOE+hMc8EduIezf8pEl*|;-eD2^KzTnihDE9zR)RjIky+=GXodx6fI64eMwVTE-4 z0weIUQ;$XNHJIoZCuT%984WwfiG9Q(-FHd*g65miiA8Q^dynoZ-=+(>9Cpr~DT+oFv zajhR|Tpr;J#-vn$paJC?A%~t7p>~3Djfq3giBJPUxkkdF*Nf2Cb5N>1B#6**4&{=D zKYNS#EVlqq{DzrB?+~GXq!u`ow;)2xIh4~DfA+n3EnGZ?A>P}??GF7>q>LV}`S>8w z5%KsI&8JKt2?Z4S3;K_tA*6ZS-EXn=INwl4CkJJJ!(>cQ2)ibFs31zuMCO-Ily&XtK_(Vbz`8H# zF00#62kIXJ_3I!@$QvnY9G>j$zcIbXDQX&7;y-SzQhWSO`?`nEj6UPrRGS{_8k7h> zpeZ+27MC?{9oTR*b-9r44>xKhqDL>wm`gc&!Fkw7Ha+tD0$rEc-(-F*{MUcV)5Tr6BM(fL*Sh1Uv(?SdcXo_K8A0uyeVRQ;_9*fqtk-DSo~ib`psAQDl@+QAjaR*S zgek&1HaSccGT9+j5!(B<(8z9qw?wG`>wlZiU&Z(D;@<-w@clDFknNz)@(cX)y4m3S z{m3BvJO2D3{{23D{v7|jpMR$Bzs^6ys*C5B@cC=}^FIFhHX+8oB%8o^kR^ui*FGQM zpARE*>~&<(D-~ETe1Akpv0um>_&mx#U%Xz|;C90A$@=j<`G{D-x7ZWxCgFCnf$Bu; z2J&#z?P`g(x;Cg?81b~TCz_Q8Lxo8;gdAUgyc+L)1Ml4+zQ=foMV7&`P3{iQ$bvRl zTdieJ$gAW2P?InuGgTN2O1$?&6oFh8-Y@QM%E*kZS6bNlmn*)5u}eD-p8gERCKO!F zKF)rKXUk|eFB%WYfW!W1T>VOAHr@-t9 zfFBIj6w|FnM|D|=TGp=gyVw3aRaB;__LNR{_6m&}O^K!`R;$sfHAQjPBlSX&sz@!g z$Q(8|j)-f0mhwKiAuYS(ska>g8*k|Cnksc$w56)GF7tY4D+-U>=8&}rYV;+XSU&>7 z<#m1#i~$r+eh}aTkAMf4M5L~WtS(%-M|vm1ec7io-`U)Itf%Wp@79Ty=9U&*o_PAK zYkB~uo~2+o>_*E{OR#i`R0G;0j|wnv8^=5~d{`sssfa8OxYUtu7%UTH@L)ii;b2cW zDu_9C=>J$^t$bpGvas-9)K(o1f@S4}Y<^sQUFH=w)V0UW?({V^U--t47L>bBG|z8I zUwC8TM=!oeb6e+U0bMYRU?Zw{L(j#1r1@KFG{SVLkEOTgs*n zVFf-2ddt3AyS>v9g)9dBE{BH)j7_MTLSBA2)v;eg+B$m{YrE#@7*;FihyVV%5mqNRIt zn7B~~R)KD_Ckp|Vn8K=XA3eNz|JRdaZaboti`6na)rTB(el;zKiDeV zyn0tpRIWHDV-D!d3T7-0w{*D}hT}Y|Y1tgd#qXu1p5T<4 zm0=pc@y`uNE%Ac;%X!?F+7qeh;?{;%W`~x#dY1>MhnhQ24Xta2){e4H9l#L64yQyi z2s=hy@jL-W%;dkW-ZWtn|LJGy(X_k8GFE%IWBT0K#P#ZJ3stqlGp7c-Ev7Bb z*zn!UOLz8TbksK8tW!?&##w-b0X0j9J_F%4aZ9WK=c4F?U8^;!)kdwxq*j|WgA0X` zbLXPPoBJ1c?_P2*&dh9bIycSCEV|FU`}WKm!p(2qbkze-J^3h>lq80rJAv zbX*)JW4MK!!T_jCcJ<)9Kl0(mzMkW~zx?UQNON1;FMr9HVav$aoEv`VZO@~S%9_6& zw-_i37CD7-xxjr`+rhs?`v>70W`&HBHD(MROnin+oon|yDA@ynYNN75Rca2_s;f#? zZeXAOpw_L8%_seR>f)n<%$AHrsr@K*9Vr)v?f9KNj-NP~G z7NfO$@YIH(+Nymgy$TOMR(&4^|!ASZGA6uwLrc zHdqgbH(6e3-}UU%AJDlfHtxM`Ky4~nk#=)__YZzBAnq(3;DaVtC7>t&f(UdmtS_{>Xfcy{Q*Z~OLN-7{^`Vc*=+sE~OQwC~dCO!drjU$OyYP^QYTyXH^K#_MLugIP))f zo?%CJW3+hhzojL@ihvFKAE=6h$_AJL`;-JGAGqCcRjbMUh8w3S7T;sMh8*ATS=;uxata&-IS!p(^7Af14C1C1t$x1h~& zT3CyRk+?C04ptjyGL?!sy7sqE-?A~i%Q0z8)%I>)9CWpqCQ~ydFFs#3eZ!W6_fE#_ z(rv(Y^L&^76T|~Bmb};@mii zP6q5Meb6>?sQI?W=4wwl^utpZYj|7%gU<&m5kPB_o+FvwiT!d#MVnqR1|6e^TW)Ji zTf7?K=3hfk+&g#vd`|+*_q%T=$@uAx^H&%Xh`(}q$IrJM`i(Vc_HKJf#nC*CfKD_o zi%%J;2a=t*TMAEQ_){Givx!F~i{~CC=j)t#g*rI{am z?CvAC%>;^-rNvj5YZa<;Yhy!=Eq2Ms$WlAS>&;*|E?7{tpjy~PKvANc$evJLvaBe^ zH=<0QdA((8qc2q7*s`N#&t#ys)<3nS&g~5?vNudkQCo{zu1-c{?N(M_WiXmD-?dg5 z$P2%Wp2$`UgQXaMNmklFvNsSRjuoj`oe}!*t&+5E$#y`N11!Xv-QX7refh(OzlU7? z%8EiGyL7zls?4jbI5K2m#TUN!nQbcjaNid)XSaRkvBzjHNDreMGn55(tU5z41;VW8 z75i_=0c0?`fWI!4a7$>%|HAib|_1$$P+QJHXiK5(8s6TdnXW(d{ zla;iZHLw=Q1%J!F&wXxRi(in#TA(qvX8!Os{12m$Y9&eawsVZ%MSNeP6>o0Gv)jOo zZAV&~{4>tJ^ybTsOh@5b_a~!=+6E4{xnrqB&k1!+V9`=#t!~&^Z!lF>Z*|ye(otJ; znY=VbMUv3(ptSzbzlm>>m4IY+)=og2WbjrT-qfy=YuZ>{@Ykt-j?u+fUAwLvPwlUj+l%n4|_;epLh>3E>pm0C7zGP99bV{vMz)0Zq4Xq4iH0;XMk<|1&wdls!VrWss@imsrtt3!| zX!ORe6%K6U7f7?Xhw6U zdVIp-7_vX`fPKVfnHaA=L%j{4H`JJsbU-etfJgd)l@F|}e1N_2?6Voor#^*sq^umo z4FE%7H_CfY#c70&D%t_|C3=M>146+&ygny?2l_iccjvGidNtZ0?TEbiybXTT(f<4? z_WP%hJ3yp{H+YRys(?c|GT;FQWWII5FG6*VU`sJ(YY9o=cNBpv@*p~8lB3wDN0AG} z1!7}G0m|_fxcVD~#-r~Z4|Kb6^E&*;6?KO6P@u=FtJNy*)s?F%OAHR%KbY-it4>#O z{>*TR?%kK8wwk77U}a@Qt>cA4@!<@sHT<@)q^Ezdr*EXYTmM_Co=!U$<)e;?YXy!$ zu{e+lz-RG4(%S}BZe9Unz>=M%B?B{{Rq4Rng?Jh^G6yc!%C}e6IAiP{<(&ekD8r*Suxbxntc}}RJ+`qi8@BZQ_JMTA zi2Z156YV4!ov}t(6P;A=WZg-E+E8FDp0l;F$p$#`YOU?y)5^2#jkR|EnUD>-(6Z%}~ zDfKtLUOLj;7j3ugX&yT>GI&O9t(~pVM^ZbZLDz~b?k#;q3Ig9(h!_h531 z1&`Xzvsjoc7L&22#?ie+9l!bJMA>5J%&uJr+9oE_>4}N9le>4m$liEv>-KBTp1lTb zgP-wgG2Dv8?G$1-WX?`OW{Ok&hq4tdeld#z7Y{u|^(@l;Hc+X83S8u*4|EHJN^&~o z(g@yUB`%X8jHH}m52$XP#W-t#5zQ1-k%d&oY&k5l7`IiUybtQ&R)@^`K#kF7!hKvT zbkUD_AhNK%X|I?;?BBm_bgmYacD^hGdU2iFaA-?)-6QY0^^sms5|_lJ^~kV0ly?U7 zW}J^ueMqe7U$$B(+2)BegA?b*n>IVzt6H3mV`X3Yx_T<@?lHv!`_;|Mvm2M1ZI<~; zO(?Q66){!JyDjLI*VgBJ3r1^vMt%{$tw%`_BI0M*hG~7q_-Crz`vUT(ltlTkTl_mP ziejMb6x)80R9M4uuuQOWT%$+A)a443lu#5Y)p}J)iJVoduCJd? z-ah`V!tQSHn`fVun*7wKK%$r>ot$xh6J`k+iqBkT^1VPmv={u2K`vi8l*?E7pSc~E z^KCA534lV0r47>_7phk-$&RUjv0xiTZ2 zw^Xw4KD{!GM0m*7BE6xv6IKC}vaCpFEQI>_x_i{?9d!@P%_%wMMvq z%_`v1UdGh=lSOZ`Hy+FU3_^`jMLw=wmV$TExro@TfF>7IK&+pBnO>G<$x z@vMLq+lg`h5A6Z}ePysCUAEo*SM!t*YDBxw3R&M^l;dh@uj|-O{$+fh3m~1$1%&-$Jfn(!5lV@khns2y1OPa0wv4`Ft zE3uTyi}l5!`#!K~d)aAMQ)x|^yu?%zVZv`F^g+EoR5`JF6_#&GAJXfChAH&WfgW%r z8MhEzq%|QzUs7t=UcKAix|moAM6}gq(7moC{b@trEw}i*a@lvd3I=XLIx*d6rzC9( zp9OrL<=hNhiMSbuW~(47iOb_DesbndnZ>6#f8_U(k}RQHO7WB^Tj@Mv6QAPuwh$Cm zXz|pK`BUPl1zEw;sRdV?<6X|hD9TIb{pX}Y=`f9wXB^_+3D(%BaN#~>dW+mk}=RW@kpL_E@V-JNX z%tX$s(qD@BIzMhY=p@@Y$z_VMM70UBdXcM8%i`kt#;@cwICeR zTG&5lPQmlN`HINaj&2UgRI_u&dI`d+#^*LpPHvnV-{cI2oX$|t`43}b(3_3eiy_zu zOCS^4xJAa8jf50qG_yMc>j>=y1wrC88l%6!QLrO?cf^prZxk0<+!aQhsj6qOp*>J( z@D4_XrrnJ;Q=7fQQuMC!kUi#eb@#jHuZ*A)zq7+!s$svWa937_ZAOdt!mF_j(avd` zr{7jTT0ha_?~I#lEoS?0u;p;fUUX6$wmLuW4jXH_Yc*u=Z^YQ`*n<*qaL^3JZ)Gcs zU|q8cCHLs1^1eg%$GhHjn11ZBnwps17O$y+oiG%#p`wWTV-J1ckw-r8(8rGZwoOeh zcsvW!Q`>yE1)MIw-{lN|GmHaMtimaN`r_Ggv>Z6(jDPHw&N27F+fK40n~Tkc3vZqz zo`(|~EcVwEFOKE%5A#m}biRz~n>XJ$l8k!VtH+~z2fKGQb?#4Bw^!XgGkWE|y84LM zJdV0co7)mcjwEG@)6_1-j_T0vIvpA$;&CM|vZ2$qtr=6MPPlvQ6Tx`5b9#8oXf)*R zbPUxWZ0p_M($Um9)wiUM`W7v<-dc;_u(#ghaMzeOd4m4Y#z>z*t{F|YOhZ%){8Sjm z8WfSulk%EHI|95<2}Wz-(m(yMoXIt{+Mdk+VMWhOOt8WOHRCna$?DAEdv>#{GPfMP z2eY8qkxH}!-i6)EiGOZ4@#^5*P(gM|0VCB@%ib>gU|q7eD{2ebJGJaw=1(QQP|MEN zzGLdRd(rHUMjE1J6#>?H`eb=vV^80%IL1mAM+e6e44v+}%?7B*C{h~sM$tY`eJaJn zz8Ij=W@)vSbh$k(@jzr@Fc==)8SlBoK3dso_jU(l>65xp@0t=C(LTnj*j-ewHP_wG7UTu@jEX)EN^3F+(5~V5<0&BM45D83m(3@ zKjKR?Zg1auEa8dvHXd*`ghQ@Ke|f0U+Y_#Kb*ZJ7f~PY5y)zR}D7i05ct z2vis||5*_*&2IN*Ix0=9sKRgBurr_PA*;#zg5X(^=C=)eaTz4v)jjzfr}!*a8vEbn zN)Oy|$K7||amNG4YiIiVCmfE6{{ETTO9M`4fPR2qB3J7A3tTC=x!6*fN#t>*F|PS0 zvi$ySxYErJ=QE|`mKHFjD`)2KYOIfX%@fgRbRpfaurZk9Nsodjjs36lq)o(=+#z30 zz_2$OKuK@nNrCak_@EIysk3b(6cg~I)n|mT&?WMu)I0Mem$qBtNuNJy8?#wb)tOBX z?PfP+t~vS;QEGVgQShWLIx)TzPx@<2$>1?@uC$4`k|&i&aIQ3X>gpn8V7`BFPm(kY zi7z2)dI=f@WezNUc2cZL+M>Gg!Ult|cWn>wna7yd{*&f=aQ zb=HQr^!4tDgEF_?G#|`SCgHzc;_Er7Oq6Nla+wIzdl6k$y33zcf-J><+(R&=ZgZlt+h>*YpIGx!rqm+?&yP@CP`1Y`G12Zp(*UL1d!MfFVh9t;OR4k%HVwO z!0rT%SENb8l>bFtLGH@x3eaE2)3L@_IP>@Ju`6a5&dmnGwmDt3Z}XVLjZt*($kP=l zo^QRbpbz%Mh!wOA`?QLwn@(TWae8z26=&|+meUm|^5FkBUBTk)QtujX9fqzj9BZ5i z?U)D;8Rb=hOI1_^pYnh$60^q?nXA7D$vyxPN(<(tIT}v zT;{dRADZeyjg6r?_df{1*O6QMs*BF(|e0#5rcpympSgLT^(m z)WQyo;djDE5d{DrQp%G?rlxrQ$hxA-Wb2yzfyxvN+XHr6gK?^MXG`-!%26M-%3HIe z^tFb)9)sOxt{nD7YX?%kRL~!FtsnKC)jswg7&Y$`S_YOkjoBN@sMZ3a4af$PKMfW~ zO>*AN)x7th%@#4B_k`5xCv*LXz1!^O${}Bj{VF$6R`5Mm&#n<3rzixS7b~q=btyio zaIyMd-+ueAfeTX%9vj>`?3LZOdJ0&elHFHuj%z08nUmduJKC{FqV0m4Xh;dd353<9 z(i`VI@kV(`u@4srI%h_vuJnzWdKzR=+_+Af%~$aL1LFIXm9zdb_us9*y#1|rwa1uK zs1QDZaosPC>wX#+M%;^UYWX+slfHSM^vzdRtJnhtPa)szeFX&<{*#_vtrBVh@yhV* zh5y9t@GSmi1)sp^Zk1-ojiuteaBT)m9c<6WjctwoRLoyoBx{T_r|-(C;SH&(!N$hv`l)Davc7&Y7M-deZVrc=>4#==SHW@i zd3GP4xz?e*i-nIfU*`Mh@od31_8s;ZzENRS@SPhjl(TFqbK$w?wxM9xbA6x1`&Z!o zpRi97<)ji+AMJ{#|r!| z`TQoD)fJ%FpI}xPm0O05ld-^4XlIJ`$mN+A#c?%YT#t#ZiO=BX85Z~^ni1xoX<(P( z$s6AF6t#A`UTtZ01GQBb&j%GWSz!^96CNl{7Z-8E-&H@wZ1>lFoxO7B zmMwQ}*+OrpanH9|xS!spXz4WjkuW$tjc-6&``RtHyf)jp@slS{ys(kpx(aW7P<)GII+?iP0s~k5CVydS$FXD2c5Zy( z#K})??Bp-woiDBKMJ&imgt11d5C(JGmzeMT`FmswV;4H8R?A*Iahvo6KY2K`d(WR| zzI(=m&yKzMFrL^iwNandJNTi@D;g-dtcMMcTa(soOeC35kne-rHYpUw)?~8Ps8DR$ zHtJ9N6!nQjy~3CF-_tf(n~2#e90t^ZFgUfgSkg7wHf9O<#zRf9B6(4)DLmp2Sm5Sn z1^Y0D-(r*)gHa0nrDYR~ZjlV8urO|lBlC?>FS-OU9@jp9+A9wylVQ0x?H|Q>lqMRF zNr~~?gWmijVX3#!xDUOxO}dgXo7Txk<*2a5619_U7{So$HslZdJ;x&!V?%84ROa~y zWtY5pAC2#qt4elA_znLSkt4sn_D`~ZeG?&i>)un~J+_j0{uCP&Ulj7*<2!^T5B~PG z*Zzr}&kP6+^qX4gDA)|If0DF(Q7WWxPZs2d%6qdDsjRlpt zPq41VK z=|cC?SbD!_?v*S%NtdU;e}11&6JOnBX3m^BbLPyMGc#whb8U{|NSUw0tS_{7EGo>I z%Fgo}a&w&}ttG)oj?QOkU(UXmv8FIu7yYI1`Yd0`vKKt?mhfxLay@q~X6nS}c9Gsez6~tG=g?c9 zi0y%tQi~@PAH!XVbGT_&(U-B3vjDRxn013b2^({gJ_$4Ee09?J4`U3aS-cLjUYo6r zDq~Wdv9}bYp9~iHK&QPjK3dFC87~= zyhKIhU&Q+l@nvV}@ofFy!!r8m`D*^(M~Y>fH4KpGo+s0tWBE_e{VXj1E}ftMH*pl` zbV$sMei;@X%(jL}1II?JdAvb3^7+j1t}%U&VDdHweU0|fz@Em)`i6q)DmSYQR8En1V-&9E>)2&R&bf6UL18 z+&}~4NNN0GnKdPvZdrS0)6rXy` zXLyfE@#Q|#kN7i(53{L{A-dFcQgo*HF2ngGhz-n)9QJpa{~>()>QMAHUM@UeFO{0j zl?xxIhN6pk$u5Byv){v*5tN!NG$A(r;uyNL($5}Ea^#5EBI4`302aCH3arAYL9vzAP{OB!VTdZ~E z6|IitUuw16fY&+}#+d(kKGGdA1+=x7Tr!!j(qGZZ!E+p{r2pJig_T`cz8zW}#y&=@j-g3Z@HKYxODol}pB;Z`f&Va*ko5RjpQ&8vDXKD3@!hC1j)`i%t%&|7=Os33?G*d!vaaTxJ`|2}g{4-QSFL zE1;-^C!aqy%O{v8_QOFC-tQ$jNk4OuU`4xhT z1Y9N$zdT^84>xLNuD0|q(Tq%GPh@YzH9V=ESY=scnXxeI*6996R&HJSMf}6oVzc=Xvq@heo;a=nhNSO z-l2K=;YJgBXNo5bW>;6znT}yM%UF`*H~;su(^ zMqdnBh=xxJz#aRyl-K4h+W7F~>KttbIaY0`56_S zf|`87{0K0A54oZhS*nc|H6{!AqIXaAk&g{;np#y~ziPUMrTAZ(p6*_}SSo8hdjXU| z^7(kWu^<8Zl{%pb0KFx-KrhekE5#x5C3>c~J0;7J?rruhmr!%(*z+yUr1<+U>Ec!kRSg_IAqFjk=}(4`bwE$*s`73-Im)n^y!3UW%z zQw$Zhrfz?Gx<*%6V9l+0bo)Pu4%>|&q&7i;!<(kHvH*`P@^VR=X znOEs~iq)5fEaJmWtCm+SudiRfDFPXAE%2jyqVZKZrvdm(HW}~=mlrxowiL;NVd3jx zjodzpm>`Bzhpmq9T$#B156-<~ff{`^e(Ca-{p5CKN3E0dY zZ)uaUNbj|jmCCg0D4Lj>9<}9hibY?tW_4t0!xcI`h}BZCV`{}N;((t38cMDPAgH!4`1567PCeu z)rh~`VkwV)5NO%c8rj_vC|yi27E#&{Vohvw?1{5ys&c*FTwG5VfKXWbgM&BZ^QZa{8;;7hp=O-=EtPi9Q|Hc=8Ktp$>V=7!YU^SXOwf2JgkUL^u z0vKNe*7pMjcwl~;=ZDA-QX@$HbNM2A5vg9RkQE6#XR@q_uZr}`qj2byaan;! z7HsJEo6Y%sq3Ygzi_OztYBXeN^f_w1#bL2oGHbj}SEe#6FTb#|vJhwRDm4WK-kO&( zvom#?42|vvoknMXUlpyMIQw?s@(oZajb>B5{P=Ye6bYRib7Cp+R>H?cOz>)Q(o*uY z9=)r^T&S@dd@iC6s-ijkdhBEV8mMI9LWsy&C%xyMf(K zluFp5sc@_o3$>5jF(9AqsSTsJ2WXsCS zHioyXE)P>er1$`%i_MsWz<4>iw`W0F9;A8m@_fF$JX)#qcI+~?2XV27fzMngmvl}b zc)XD-YcmTV5Nw`MS=|U}R5!C?_M~tLG!M+BGdhFs8I0Tx!UKm|iJbYD&*00~cpQ|M zfB7O(-OsWU+zPyZ}K>(ME>QD1Z0E! z<#v4e22X{V4j$)K#T)Df;ite58VUdMEWTX9zd+9LFCVZ{XjJzhj#>Wlw&DS3RP@Cn zf4Ko#*9!tXRVoX)K70`G&j`=qy^p_NjrafI;V|-m$K?3v8_^QMS=2Ko8y-ymltj+4k&gmU|w7_T`%F3)& z<{9-Mm!P;6dA}j{!@rgt*t-1~n?gTJ2oh;oJJc{ZdxKxULLqH*Mlh6FntKW(%{EVM zey+yGwiSEW%eyP}*;50xBSjO%6^nAOOouwj6ki7PAHruaM#4$sa#@mqk>wE;TV6R* zR<)?YU2Q1WST+8#vVv@B2_Syi#l7TCQoZAaI$SvBQ--s*;y64qCuxFXChN~ zC?l;9-s_ReVfZfnK1N3=By(xSF?pStGcZuk!W|*;nWfs?qSRwbj{#n0%ZEyaheYA6 z)M_u5b>?*o7w0*hdC@-w2E$c@#Zzrsv)b)2H5(0}(Kpy$c19e-iWUWoyZ zXIcWms&-axvs!I*{nn(@rio0GWuPXg_zdXq3ThP9Yn)?2Q{4B4=`%AbLv=xIXeQfg zu;~!_<=stsM{o1z2W{Fz;k)ZG6)tZgJXX*z_%fqpDCM2Td-u$O1&8||5H+vUH= z>nN0g{#ldWo0j7A{NK^&i-FD}_NN4Nrnn8b{RyRmWJBrnG;+rVGPUWp8DYmomtMVn zw1i3&{mbQtpSrwcl<0Aa+741sSx^d?ALEBLSfH$5+}_lAPo5>+q|uvwY}-IHW24b8 z+s!G;5p3&$hX%G6tAyxO6v|INi39sR2!ENT>cqW#B2~;Tb-PP6rb>4>G-I%s^Jnxq z=6vAPSDX#S&g|}Mdj9czhvRkrlc+E0M2fi_;;_*pe`b+dG*x?(DvUrS*Ox5!xa}@k zKE&;b39e+p;6Pc~fc)#U+ntX5{J3l=8VuJA7LHd03M)uLpeAos#Mm3a%t)=4%wUO~ z)YLU&=YNa8GAzO1d=Bv#Cqq0gCYBBbdOP|99nn4#@^-Nr-LGl3lGaNc3 zk9UEe0n{takW-VB#w=`wQeR?`q)$<{m^%8|gye~>Ezip4!pCHCN1LCS6FjKDS3&yU zAQv=^IqJq$Fw?7xQ$=&D$DF6h*5w$jHAbqa-oij?$`X~z6TFk^C*F(rIRC`C8CDe8 z$RaCrq)zam0}B>TC@73 ze7R-ydAcTz)}qy=sdK#frF4e;3GnRyU}qZ1GVm;#4oseWBuuiNOUW%GZJm9ZC5H~V z+>Ts>v5IXQjcglKu3kO5)oah_QjYgM;Pf7! zo<2@j^cx2zCl3JDr7{lKOKc3!-`gm;>A*G>^`+ZpwmH;>R8gf(v2EVCZJRsIm?o&R z)ONP_?*FRN*tJ@_rV3A5deT+_?jglr*{diU44HFsiaYOw%?!K_nq#ZP3p!JVL6xbp z+SIBmX3A1C)Iv%|N?`3SbNgSF;vf^@0+F>IF_-07$}C5s54JWFG=tiP;lbNKJ{k?(KqIQWJ0 z^^^ar9LuXVb?^CmIaVI*c;kFIqW6ckC-we(UV-=ivN|?zM@&Kuh>zgoYK^QB_}!&e zvpQ2XUoo%*OzsM&QIn=iF=rLY8p5>OZSffyOI8$|ndwcAfJLiKQI@6CNh*?7LZ_y~ zCQR)N`XLmPxdCcifO7A6{^1cNdrMvBF&CQL_HIYTP+8evx!tF}PUU6WSF~%*DQ-tb zMsv2IkZUJHc`jETI6>-a&eA zGes&*im1+17p`4rG}Tq4Ytl7hdb;LUH9>2MgJoW0a$78J(>2jQI!mmT z)bXi^oVC~eSA(%#laXigX$@0dmHmarY)AC5){dWOblaf@2mBba2(W(dWgkE{O5<{o zTXIRPCu>)C>{|cQg`cPMRr5)`8ohJ$ucLGN6-H&;_AERp_?6uDtl&0ik^Eo3#{Pnl zU@K$^WKPKR+MVn#Jw5pTC3Xhms3z&V%k(9d&dx+4REN!&f49wrVC9z-LY^*Ku={r$ zqZuHM)i|UELpD*Z(3}D_RjkV)()qa-Aa~PSdPm)^k=|wHHC2_%@NCeJ^-fxu)PsGQOr_X6Lls zRbsMR^NN~FBa1Vyyh2^FJ1WYDoqQ;_WC8P|_dOSX z#|Hswlgrdz)h2GAP-ix5Xlq{P8O{#c%fqRvyKZF6n#VlLvq!46n#HQ@LSxHRWs!fx zWGXE;6d0DnwRJ&NuJTeUF*qNdVlUx7{?Or*l^;$5EpuHF@&m8HY2aOV-F4*Tr<$~R zSxWR|O~+3j`SO>)e7q~%#k^O$+MM{iI{H(*9tYGCtXAnpX(}XJ9Ews^Rb5qu9x2SF zPh1rWnOrG21t(h?+QbF#W$SOUwA8S0#QLcVL#w=_mMUjuoAylfBgWqNpRA4wPmN_X zur71Yjt(XI#8j=iQ@M42z&C8nX{_x_$xKmeQu=C}@@xaaa&Z3zu^*vMuS0(eZCWKQ zYa?Ams!%`9JtECUI#Lz$mn^(`PwndFQGbiMJwMk}kkyda>AuD5fs?sank%<-&$Okl zUZJ#GCUeB-Z&*%NL z!ZBB+CL3-PD`ru(!evlc&m1MmMQ!*#m)6)mrrwQwkTd zdsf%773OtGJdYU!;(1OZpaxP=rS3wESvax|SvZRT7fP^PN-GOe0ETakrYfr=~~@Pc~@=;(lD&`<5(XbJg6 zQi1t}Q3yCD-WH(6n!+K!$BzrqJoje0i?E!atLyN@$c3Hwhx?C}nV$Qb4HYNLRZW8C z;)`d0|6WZ>WlhRy{A;XieDA&Ywp`kXotwy$Od|cr-3TuiXpiW9kSls@sDpGq99CfH zO{5{HseyRbjgEe!VY)rNy)C_CU48IadJXvz2&Z4iE?uPhqO-ecd0nsPM}nir=l;MC zsWjcM&|;ul%W+>BgF;fCS}U4 zx9;!hnNCxh8|4Crp+w&m6g2G z*9S_(DV+~01W7tcw3g}3r4WfDYMSU|JSHOsTo8XXRen?e(Vvqa6)=3MwZDb2mVWDH zL&2LEyYV=?>C(Jrx4RiMNO-hL>?J|$&1M(H! zj`nIpPXjx&O7;oMWs)oz`G|>FF9e78Y7_Idt#7E?(7t9-6G_8JcYmwLIPj9Aw{YwF zjFH2urj9Jq%&gP4j+m`G)@|6Lxp-gn<=g`GdXh)9N8AosT*GBCX`3i+NdBF_@XaKb z9OZY(E7SO>uY1!rL1^qVS@Lh{JC$YdIPD=@muE@y)aJB~U0R3!{^+l9kZmB+(^R-U zbHkzxV_Ij5-Gqjhr?)$8wqbwysxzShy~H@{0T4Y3d53;hzZV_K>qO!*ZuLEiF< zuR28^0L>+3e}`uS{*GVgxgUQ;JwYb!Pu=jX%+t=+imrrVl z@|?!ym-1EZ;1Z!4xxgkJO60=vPUQ6S9iE%;_k>`0LVCJ7+}Zhu6F^1hc)#adI z6`)%I9hNc<8!P$XuUXbQuquxHY5(kJ*Il=IkqXDQ@4sYZay4+$EApUWY=>OI>Il*i z>6+?)ICNd;3;lV$_mrI|f3_ETs~iv3`WbGmU-)i7>*x^as4GE;FKry?vwNKI7J#8aah z5~;cNw-B~ksgYA_csQlbjHgE4bK&~)q|f>X>Eq#2`gz!K_-BV}=jA^?{A~Pna{hDp zWz9>U2nTg~&Otr>S?QB$uT~o7g`bW8{BXi=e*R~N>*wKjcKH1Kjg&vMA?h)@&>~4f zn9%0YTN}~pp`oFJCKivsK);pdJ0RYYdHR}BUvbX(AFV4)MwBNuu z`@f_;e0ci{t}ewFAdY`0_>_m>HIw!jUdz9h0D}$SfJ30hdyramSJQ8dc0=w`IM|TL= z2!Up#kXt!Q4ts0}rJ|@Nwc2E{fR52B_QF>_{_(HO%-nkH;$!SB-beIA(Ltq4!2+U+~Ju!@0>aOIaDE2EM^8l!0zQV z)Gf9JN|xTmpWgH7{iP+!l2T@1*G6|8{Mg41B5s!=fU<0cu8k2s_yw0Mu@2LvUfR9v zc<<}X)U$#=M1R>6xOl@A8!qNQ#4S~d_k{xXW$KB&@LQCy+VMSVTv~ge3%uv8X zk)GWVy^Xy9ZjQdmd6{@#3df#46X)jWZ7Z1*tWI9GR|;7|2QQ&Kj7m%z;rQp?hV^Yw zCO5Z2H&{8_JyTyl(>?oPdrwdMhY8qdPskf{FM!^)nO(4wy%xQG2K&)}uh@@sER1{y z1Nv>~@T9F{T1J)w@>~s9cir&Xm)gy&Ub6aU3;+yO(icTc;_?h7<&w7S@M0WXqE9%Bu6J%KCzNOn;#1V3nM;Xq%hy>&Bw)#!C__* z?R%u(u0ofyu+Zru+srT6+IeSW{=#(JT83}^H$03w+|JfQetZ>mc;YDafhYD59lwY0 zi-3y~FMfZ>$P8uH<0iKD;Txi-sE3u$amV-?iGVxp@39NFf$z!oB+Zv_>Ot3tm%~Cv z6mC24^U*Oc*VCmAUqojL7=>G2O7UVhP6RuRU>V{6#UqJ`!IB)f$f!%gIu$XzX0CeQW- zgCkW7U-bSQgV8=Zq<5xfWm^1JECd_*oJzcqiOt=EH{Cqey)B{=HYuCC2X4A~ylXq{ zC;4@BJ9``XpnWqBOw;l>pBRN*bQNF`WR1mVjcyn3O{6CbF9U`biKqGc6>eGK7=lZo zTtAq==c+jj#N%gnP^L)h!rrrGVio185}~KZPmICHm*t-5vwd}KN`?|=fGa<{=Cu*_ zX-8*w^e5Rx+4vK_aOP5~G09R!XAQ3AI*{~^lN^NIyapkC1RPlinG4;DVI+-lH3rz| zH8Gwxn}y-$?|uF={%;4aRc6{WSx2%oc{oCBmvHT;KRx?S)s~9J#)>V#vkhs_01Emu zNLt>bkpyUCz7Icy;Jf$I6PH|h>Fh4x6I4{={Fb%Y{dPRI3%(E4;&Dh1qHsg(Fg!3_ z!aW#O8$}3Ctf?fUNyAIeupdN!{-v+7rhQAW-QKh0QsqZ~g$ab=T;{_#&HNJTF|bbu zUf*4MtKd5xQ|uFdKdTXT&VGV414&!{7)EUQ;FD5$Kf^*}4OI(?LQz)BlRL%aX84ts ziC}lYQK>7-G-cXcE}K3#v(Q?%N!H>&yI_GKt6ef&(;qPF8q?A-S6rq|Z!(#p@5s9T z?2G4Ee~7au(XMiZ@1t*kWtExYJH61VU`D1Df%1wC8ld5<@i^+NAy{nE8}n=0H|sKU zG~wI|^M#{*ONy5FlsfEXhHBRY`|!%5r8RI`IQw*Ozd9>*QlGDV{qo(DBh8zpYfM$a zJl!%o3|lxA4j42GH-UdDXar89T-vLESzD9K4L_7-3(pju97R_poK<2^2=yu$f19#d zux>5w(_dRh_vjj>O01cvUgh=$F8V&pNlCYM`vN^SQI%OWb#YhM#Zy&uPgTB|lBQ~G z3N`ky$&@!U(`|W!P1Np=WSY zoiTjXuB)isIAXuR*iTRKE%3I6ZMJH^{&!am%aLqs{fSOyj=tY{B6_P7|2ObsDZ$55 z=xUcg%uK9`f~BZ>f;=4kBMHW2=qeVb?PWMxmK8<+C`Ym-ugp0@Z=5SiAdV< zSCjXZOTR3o7@0qiJtobn`r;*^I9l|=s`W{(~U1lWP-+e30KbS&~HJ&QV$X@&G* zxgI=v%xR;oZk4M;iv6HeAw$uhvx9*^^dO@dbqDI5>V}RPw&qbJ#ar&T;pkR=C$cKpqE;~o&+oU&hjCtXB~&v zU(#No^N}|K*lp**fZu{&&x3N$mMyy%0%F(^H7PiRdR~UPKACrhEZDWRrDbau|D9~v z($TrOrDbzx$Cehff4`zfs1OE_4m}1mrg(qKQ$if_J{B#W@1lla*x$?i#|S%2g5KMAv(ols)+x?dK`43=5c%37u%yZV&CI! z$Yu!i#VrU@*FMeW%vyAG{AJNf}|iYV3z7NL)8lH6NIoA!eb)fAFN#U?hC%kn~r05sl+%8A#`5hp2C^iWJltI!-F_!62vNxm7P3%=f2Bf)g zf)w}GAw}wY|9vUm!A+ZpQW3={u;Th{+*`+cfHTV8f)5Vr(vxBUT9UU8iY9D-Q;vD} z?+98sFw2%OlRR+}`bi&&#cQ_A|nCA~z8_!60;kZqDl-xxN>07}lK3q3B0;?aPEfY z`j7Y5U|WX&|lBq8GGSk-QaIJXRfhM<@{Tt~izKt%DeUv> zCTx}R%j~*DM(nqZvwvN)KAtb@E{NVu`9OF61J34qoJPgcH2u&QR`o*M`fs*@mLBr5S0hZNt2$mOeA zS~N+|Cc-qt8?KP$77j;Ev zx)$kEOg;ZK++NY_NXt;>g)0m-?d>&&ig2DXBhArV(LU@8tsP6Rt4kkS8}dOa#Ll3E zQ&{~6i3`78@Wc$6SgMTv5I?Lmlg%jE#^|TG{v(xuuk-ZsaWv_M;ZQ!@k1fELrI_3O zb%S~BJC`b#?rhH+tn;^75*Yp^cGc`03;kI2hq4kl@aOlShVzj!aG-9UMG5*|DL%enSWU z&9vI>R$L#G?;9hdsbv{;et%s?S?cH^tyX)FR;$SyJhF7z;laVf%a$G)Y;U-*tLwrB z>GwB&htubC!mKUdA8e~LI$SP?v99e8I{6>gdS@xh;aO-JcgbSkKx-=&%BAF0)6y_k zGE}HBa`A)oei$nJ?&>PqEESUPEI4tfr{~bbqJup>2k*4z=2~$*A>Zq}hP7q+ix=mY zX@~O+2E$Fb%6krujUVXgIWRtUu!jYF`Lxn_?)qM9gR!;M*w7j?;>EW!=K zl{81?^^~d>whl0m($YCH9Pw`&Z<#PC4HGTnoBWaCkxolVb9rU!RL80d!W|vq3s!YZ zwN{olAnQb<+DW_ahv(!2^R9m}kX2Xt}HLZ&-@BHMI+dgh= z=m{?kc`sBO?dmj*CQWVcU$oSkH8VW2J}YO*OqK|%4!b=E`_#26wI)rYkG@bI8mTF3 z!On=@-N!o{7T))jk8tEx-9#RJtLqty=Ku8e(% z@xlh-1lFhpF;?wK@Bv?7z?Viei+pkp)s4wdE>8K@3>T_j5*-%Fh-I1g1}D}ZZ!4+r zwp65Pa)Y6A!%Z0(6)oP1lD3a;ts7NF-%*XMaR@r_0CO;p)8W3yAz;sz9&c`^!=tsd zHk8+A=C;%{q@|fn`3`NG-ss2rm5j88nwH$m`tpWW%LUaV^`z3r zpP+N(#vT@$#HHv_9puBsf`I_JnWi~6QwaT&7lV_z&14oF?kzEOdmvD{X4$eer5F{x zQjJ>%S;cIoSx8 zCXI_Ck%@^&afd&8?dA==8ST@Jom*O4w{$j6w`cTjz^t_pdq4J(utzuoYYy_18mUhn zF3jlz7C4f^;MNnCdH8hes5erKRq>w(Cox0kb6WO_V5oPM{D2^>K#E}5`G&d-9?ot@RVKG8dtu2rpBlV%v{9nEuW&dS$}^^T@xDc7t~W~Gkwj@g`> z9oCn+YHGUZ`b6)DHeWZBpF7$+rcc|lMX5<0?H$(OQ4U3|!Y{OQ9BPF;O?mE=JT%D^>_LalE}_Ohg)reH>l`|67dwYwKd49`W{sOPd@X zTdN@_-|njM?jm~J4uB5`X0$YDFtk2M^t;rzAJQJW?hw-*`pHjN<4=AivRRM~ds>VKA5AmmWNNZg^L4(T7uJS1j@GqU z)yhsRkp|r^6Dm-4_(4_vjnnZBy#JKHNBR41yuU4+7E)BCPsS7&HR1g)c(-yozsdHq zeZo5^0qp}2V~(30__8VbNyNQb7{Ok~dk`1nNxUzFJuh#R@=Z*K?ZZqN!2)Z%>6moj ziv(+{(8S&s-Ucj$0@fCxfx&4R-ocCK$m>d>k-Z|ki*Srp5Pm1lVY*ku(teeRzu$$G z8D>#~cWB25|DMo{nFpMPqXK8*{gIfSeO!T6c`B@F$NMueJG)CE;2kD^$Bp5pf$3tNGu4hXPBSL(JgO}xy7sI%&(DW)lMGyAF=ul- zYi|5Ox|fVuu<|td+G3#|G8^-n@_kEAHu@BEc8(<*%SBDumN5$^4$Nkwh2aaL73bz; zQoZHzD20`%o^I6a*J>$yHUJ65jOhJ(A~nFdsoqX-~B={TO(Q% zVTz&aTte}yIjG2$kCpwQu;13Bi`;xuhVW+N*g@8O45_yK!bEQ^Q053TS6_#{PpS|}Ujm}p-qT&~FN zm--3dM`nUJUcp6U!h|Xi2ox$Our#J|d7IW*R_4^UVc8>797MZ+O?dNM=@w527YR8| zrxnwM6GG!eUrJFhSd`MoX?sNYCZzhvxzhEGsYldw=m>6O!Z*9xwGNNRp>4-xJ$%w4 z-5aR6bKrTwuz0C}L5q!DDh>}^QNcf0db8hR<6EN`fPLiyrN7H(II!{K6FLNhk% z!LK+r>LKl_Yyo9`lrxcyK); z--U)!Y4t>D{0>OFgh$ysBAsjjDT$e!1fKICIf{xL&Z45naXB%SD?Ex<%;@sZ{LV{I z%RYgYN4wEwD+=lqJ#q?TnMPYdFm26{@Zp`BUmw z4ES1vuh%Oz8m(UJ6)FNerJ&dgUU&;ThBb7i-Fz;ZCmVxHmnjESHKiqC)qry8GG{R8 z#Kk$QpsK0>oOMOOgclcp7grH!n*XH)a9c%Y0HU=^N$z* zz(4x}(#$tOmHQ`&(#af=JdMYKk@ofoT?VVwfJ>-tDlTejDk^RY=bBBqxh8WiU_A^B zKL=^WYwi57LM<(!%GTCONtRoMZ`PEQR9Baj)Px~vNm}OsmfTOG1xvEYLX$Or9$LDl z8<$Y+ITid0F5@ zLIe_Vs_II_xz7y~vQ@01*?;ICYW0UHSHj0^ z0W+*2@6v5J$@y!dW2F)}$4CZAPJ1v;^JNZNj8zGU&3D zNcSf4+%4q^Oy|3)XA1A{uM!ZhM|$Jd7AuN-=0h6Rkykcw+bNXzY2!APCUPt`lCS`3Mfd#3Gv? z7Mh2C1cG{dMwza{Ufsdz`n~8GwmtR& zm)dcSpWA2H_Q`>P$pWXdAQ~0w%F61*8k@-kYc^Bd6U$|HOSoF()o=GKnppIIyJu#) zc{s{)ckHW)(xNO(SQK3pjcx4e+Bg^EduW#ldQgcG3vdt*Wu{{Dyw(HOJ=AX^FVj8I zTf4itmKsZE$6`+iYSL2Aya1YSiRG|g#=eO!(1XwX3}5byDcHTS|Hc>e?Ps0?G_K1^ zrJe6{`#Tv8!F+e#NYjSjG>AsM)*#lX1Kv;t(!7Ye{H*YMP9bicN^s94qOZ)TFUfZc zwLG@iAQ}uv8_x;lqw!%}%7>(ZGUeqcty~PN9Oag6$}**F>`8Mwk=?(QQr66A?X;wG zWAP+s^ti%MT^_+X+T(VYOQ*M~9oemKS5`QyylIv)o7I%2is-VD|F@yv-vK#rUMTey z9l1X3WS%QemyxaZWH-EBS?a9zrJE~qvW*$4KAj0rK8*gJZHPTd^=5>!_hHI~Dbe4* z_##5?iWRW0#qKBWpqWumwa0W9OBvYu`mtl(-Ke$QF$a4)_9|)(ebt#a@a4*wg}oAc z3STgSIrCHgB@JI5z!&V-Kl3uaYz5Zu$DYO)ZnNDof0H^mqqU#VTV*JKYQz_%g+5w3%ZP z7hy!r?Of8B`ZP5cG@EENOl_q`q;^AfdRMFnWqwF1Gg>z|`L2Pj1FxdQ$4KVh6-z_- z{qb|unrC!9Y;SKc@ee4Jz31NP3yWkz+RJI2?fbuu#K3C&Z{F%HACLO4MIg zw6s)2BK%jV3D(xpK?`-Y!7#PGg(FZ|gNC$2-vgMxj|JF&#lA~xl86th=QH7&rpgN$ zGwGB#=`}t7wa$8XhFNXYGB!*KFN>AO+QmSO&JR$~E}ZX+e|ZdwGCcHSEx{i}zM4Rc z_cmPhPuUBn{QHue^b37(%nv91-Xep6&Hy@u5%Q13i?|j58~6FNH$VFGCvrWWTwL+{ zq1vG#p`pNPD=4s83*z@<1y@%A?m_5;uZbW2GjJcvb-M}f(;U9reMQTvDdABZRqyfG z2)1;;%zr~2;LZs3?6(+4k@Q%AFB!a~c_*?wW~bb4^?0nf8hkT@m&ngTk1Ln9sOP%G zzv_Rljla;$>AyjV>!#01iQQFK|9h0U@zSYP=b*%ax*Gs@n-GRKOxHOnf!a!@#Fs2C zmnFyLTGhM3GlqK(-i02A&6b~UvpMvym|hp-FLRXW=5+_9?Yum(a70LgBF-G~d#AJ5 zWzZN^t*T0&tH_1ZZd;Y1v$^Jav)N!$*Ve+!uMSf^OSMt=kNAhybjP!b-?1z&aCQ#g z?ChknNql+FKLd9mUq=5A2Bv56CFaA|5z9%}WiFmrpiKDQ^uas$FR^`PAF^kAx%W^faK7gp}<`38-^mQ{tF5 z=LYh%wv;ZhyeQ8vKLO{dDSykP+3ZWLt3kU=tE&NQZgCNJLE}RYwqUf3nqXvi=}##s z4hB>Dh0(#*6-$yw$OnR-h)}sDJIc?_4+TS=o>a0_sC(37bv@`1$f80!2{7{6Ty_MS z!@r8ls$EM~%)@10VF8fg;(0n0XlDTaGh4!au4R*hFyuB+K zx648T%oI9tM64>V;G7~+?4^GO{yf@Un5i}9fv3TQNmy@@Ik8EMbK>=|f;=a70>0}k z{NwzX#5pWD)UE1Kc>@8jsz=$AEiq<)N~n-H)0~DUp|PVR)97*;GfO&-5o^}hm`q+Z z=c4N{YX7eI{6C*t-(X62iodYXkK3U3TktzT+UJu4b3GPCpZvok9i0gYQY#jTL;(D}(O zO7aZ0(R(YdZzTKZ{>F{aa7iwcjr2G3jdR`Aq4&=%PsNuys@gJFiVm) zg;rKU_`*A5XWN(tXM1a&lbPC*O6)B$x)4(Ny!md7X*1H)X~Kazu(l7ZjbG$-AuxV1 zf${vlh74o3WNJ-LpL%SlApCY3Wjny73O{(cQ~3G2N00LFC-MCh|Bf}U_1nGB(w|1@K8mLYFD23^hs)_> zj}RAv_JEH)P*{i0b{vhq%pOFty_|n}_^EifJ}ErJAl$(D#H}&}lmHM;MSp!7>vfYL zoI)K@4!neO;SvPJyVQ2T?@}4TqM$+FQ5Jj`XZsu>8Y$3*&Jli6?3^Xr(aE{=w5~j4 z0^LvZ#3%tm6RCM9@#ATp6wOd-xx5|n+_Awa#CAmcSn%k(M}@so_{q6&0xyRHj1ZF3 zQ)@+favF;^ewrC5F%BLgxp0!VWeVlINufOHnMVMfqyR4)`aoX)Qt4klO2wZ&qS^-n z{QX#{NW^-PV)42LCa{NbSXAF3&QBdgkl7=`UYVlFF?lRPjdM5&OlKJ#p_BgFU34NXU>&ENUGH&$}GrvuFMkuqRhZg;$NyC;@}|U zDOgypL*nAOSW+z}Vu1~%nj}t^=*MAEWqLR?)LDlNPO8 zk8u2w;}YfMxP6?hS@2{BfraEtK$WOBKW{E%ks;4Dh_y_T2_!NHuc)1mzyqNz2ZxehT+vH)VI%ITC&lTXvTx*rnP`kn8 z3-8F}zC)^9lHqfFCzk=a%*h}VSSBF@PoG8JE<(PY~n0OSn-C#Tf;)i#_KLY*}0ORJN`K+dmdhrYHmS%3H@_$k|aIO5j&1N z#w-1hBN|x?PH4bv?}=#h39f_ESgs$EK_lzC30+r;gH{#SY6a-<7qT7vq*}DUxCT#9 z*i$5`XYZt6z&nX}r{?0#)7R%k#Twj4;LYK)>?5uzD`+b>lg2r-`NGfH4)|UB)e*Ef zL9r5jBM!!u;xVbp^oS6hJ|YccA4NZc-e<>|n0Pcg9W^BB1}GOn z2WXPFaV;1`B2Ae6`pD6EU;YtlD1isMA&$pMp+&+2k_!3(Xhk#tObHJT6|hM+{^&@w z53zrBFujXL!HEHk4IB%sp_HV#9FLk%$g~n+ zC%MW?xg0nyHqhm>dbj{Al)DClN*JRX|?OHJlqb7Df!_5DReip?9M%qc)7Q-(n9Q0Y>cC zXZ9qGc#>MZObX5!acV>js(nNcncq0wM5=Qm%1M-_;;uvyPaZh}79ox!x^Q(>l=z8r zD4#c^G<1bA{Eh2;vgy-xQPAwqr;q!cz$v_MSj#y zAq6>}us!fDDc)S828r`z9c%}0Gn@p-Ms8szp@k(_o7x!1Plhkex>63DZW4!+g@b6< zNB99*!WJ!U7AT^HN>T)+07x0P-Dbq87beygn@j22Gfq2WMGAI*0AGI1itu35aiX>{!m4pN0vwMxot+e$QX%oty7gBBS=7P1yp13Y(`RepI20*hZG*H#j6t4}2n}K2 z8Yv@oJt9H^N|KFZM~76<@$w${sd!h)h++#%+4a%wQdZX>jRLi}RJ@8t-zEl2kw?fJ znEk`Rai!&!zr8m<+{mDxR1fe7;#Gfp?-s;Kib1?Wu1MjgB!uPlCedgTGT(f2ApVCM zea*Q3z;s4^jy4(I^Bw`EDWw z=(t0IWaKHRi%8fJcJQ7b`Z;V2sBUhrF`;1DBAbV-6_!k9zi(YA%F5H7{guQpnzUA;F{&xkHmMP`nin z3F+UGlgJ?_=0Z-)59yx^=}&|}>Yxs!5VH4zPvSWh#ZE_;3OVAPkYg5w2Ogmt;M-(e zu}ZN?u@|2EuTy+l@g>FA6;CLhSNurvw&FL6zcDp4Vsm0KPTFc`!)!U*z;?0&?BncH z>?BU+dxSm9{)hb^_Dl9>aD}whPTHY-o@dp0zWbBD|0j;=|5r3*-#6hTZMvR2>w(p3 z)6=zdJ$KdvJAGF41c3jf``76yUM1B+oT`cYBB=)A6_B`3{wF@C(fR13P!z>phqvP* z@!|hSOum#6v(o>O&i}r2W{*3~7Kg)Pc0PC318a`A+k`MoJg}di6+HpqKk5E;dWu&` zwGgLj;y!df$@ri6L}lms=tC0od(nEKQ+(w=67xS2^Z&cvf}JFn9CST*)&uK~x7&m; zOgyk3pA|g;;6Lg9b$W_dNwpBCYU18@KFRo>_?$-PqYv3!6e0|1@>rf*O~g8~nh3Br z#J`ipQP9kd^2yRdBm1~LgOB>TbwnEfOCfXP|G0gI(!{L>l5HR!BIgCm9a&E1>;|(P zu~PQpcsCFO)&QnC*{_!GgBomedH>kjWPVV4wN3oEo? zU!io$hkPo~JlE7T&B{$~V$y!|-nO=ak#-riGK($P05ZKTKLL z=mr{&8`6|&wLY^T>RFI~=JI~QGy5Zpfw3(rb>`Vf(9BJ9^t5oXvH+*KVE394rsZZ8 zj(QDSJUF0QWrBCV(0||Hu5E9xb#MFTL)-DxQR}|phUjUQ+q0@ASXedK_`NsZ{IK_e zmXbhdpn*LyA-oBwk=UeQ5pPBv!2V8FRG4!0I9H0F=q-9IrpTceKfLi{O7EfL*C@U0 zAvo|nJTv$vlXvhje3$jJE2~F%y+LTfa_AFj`%^ZXJE0@s=zF~B9T|c zfUraSKGnI!&tSHSjI#Hm=24;iwGp^uSB}hnh4bKPVMkDxMG+XnLRUm258`4kGLLO!j!3CwoJTB&kWC*@-v-X zm?J-n_}VBxEAiYTKdbOOAwQ?!`2zV_jT0z0%g?C_pMt!EP+nUpv?!G&4ZipaKwrWq4Kq(qiW1IgI9H@f z`GEXA4bNngr8pUiN>!fxtP!26A^BOWs7jT}l?M9jQokU5XAIBx%g^w$o%)pg4Em?O zE;bbX%=`(VCouV=QnEb3y!r7p3r%Uyl#*9fY zvlB3_D7zv31D@83vK!K+ysS)6xHEL}cbq1dL1)S_rIjfawu~fLRE#qSO zyBhItlAlu*PVrIk6n^g$9~QqQ zp2FJ;;$yf!C7u+&g12udoU9Ka_lVyWA49zRlb#<+dj1aL--Gx2#cu-A6AGuY0{3s@ z%Qu0+Bm67y;OXxZpA}z3?#s~%R!|<|14v8IC0rgx&JO{HX9y0?xGP7jX8`L-@d@$k zfOwzy9S-lSNbw}zUIhI6c+8UX#C$@03UTifp9Y*$fbcau0ZaM{_(e$dG@v{R?4AHD z0G_d zg*~(&Yy*Eko9=Tdz9Yv-)TH7rAZCkzzalUCqO$5fV_$;CUCm*JDzr1=PI^boc7#q- zOvMP|Y=b|}ZQ$%_l(Q7&3MpzaR}+Cp>o&zOo|4nXQ%dPd5-Fwl!+7tU7yss;)ZP>rs}^Co=T27mki+j`%~OG))elwX85s#U2L$MGa_ zh?M(QrvXhoTfwxDaK~p!L7)L_?tMJ%1P9xa>uDQ zj&?PG_hAm7xMmLWz&r?4l7$>bTtpX@F^<{%eB;=x2G^|yyv_JsgI~gPt`!n@bb;=p zxKpjw<37Jl??hRshPES=>WH{}GwxKQ8&I>uNI$RulevT3J!cBX=Wh=712A}u)Ha_$rhGUbklG-)`R3^8_%L98)qj4?!sF-DET|E{&yow*=> zpZSyTdH(00dG5RG*=6m0_FjAKv)4wd)P8NCcsI;N$cM^FJ+p)RHI>YdK2$=AN&SvW zN4?&^k-g!IkQL_)y>W z?@PyZQu+>^%5a;P(`MRrr-7R+UZJBkaMj9cnA!im|N+8 zW-d3yngrj&Yz;!WM6gdp3RAglz%|3a0%e|Plbl9vPM#5-u0<%Q;QQikWM>bAC9oRE4i3Ot zYz+A5aaap{1!*3LndBhm_Y&YW8YJlc0Y-tF6hUkASmZV&2}RwigrRyh^o8zsm@RG}(T z#j20$tM*X+RDU%fxD4Me4ODxnK^S#EQ+o$H)L=D44ORQ7VQM&TKY9$K#v^K9Xk#u> z`$0e3{%VvuK#f*o)L1o6jmK9{6V!pKH26pzq+%+r61cG;!o3Y;5Gz%vN_BAXRPcE4 zggPX6QXLw6q7G9N)!}NAs#4YXTB=s1Rh>FQO;$&$De5TbJ)Wwjsp0d}lRZov0S5lhny7qv~;IV54eM3-R?;vuX*x zr4|S4)e_aJmZ~<@uIMYp4%HdFsk&6RTCP^8mC$OuN_|zGroN_5S7!v9gXe_&ByTB~k`CgB#0@k@hNbqh2Px2bi|c6Y0~ zP2G;K#MY~ys5{i1>Mnfc2)%`BLvX$NnYssGkKKo{d%L<{1?mBO$+=NIh+_^aI0Z9K zhx$d(sUB9pRGaXP*(2)L>QVI=u1I}CJ*l2jPpfCtv%$ys_Ut+JTeVp|uePWc)QjpR z^|E?Jy^8svD_E|67pzdPso$&D)f?(f^@rej^_KdhdRzTTy@M~-wyM9Vch!4pTkwYZ zD{ce(oBBZgU44iz*;cBL)WjGV}J?`*etDXe?U{#P(*XUZE#y7ilxc_>xJ~DVGco*8Zj?z>0G(8<>Mq=>vs|yxEA^>*mHsO3Gya-B9k&jgsn619>#yTZiF5UN`h461{SAGg z{-(Z2U#u_Dm+H%Kf5mG3ZAe+aqp#54)mQ4P^ws(ry+&WFuhZYt*X!@=8}twKjru0N zR^O~|(LdDd^pEtd(CTx${;^)Kf1>Zucj~+JPocZ>zw`$EGkuS~7kdWx>j(7D^+x@m zen|g9KdgVLH|byLNA$1tqxv!ZxPC%Esh`qM>u2<{`ZxMH{ad|RKd-mw7xatzC1~Y- zMZcclCREoBpeQA3C=`(0|t->VH71 z_{aJa{ZIX={!DMzJ4|4d(Z(2SoC!^y$u|YTHKx!MnPSt&^fh~!ex|<}VD>Zv&0c1Z z+1m^@L(EXKj~Ql$n-OMTQ)2crBXL3GD06@rZN`|fW}F#szG5br15K$p$iz(CB%roD zGAUDL%1wo-GzUZL!J+0bXa+jmOfprb+SHg@lQwnc2s7CnX{MN?%v3YYOgA&kOmnoE zWoDZ>X0DlMjxooYP>@bG)-oqS!9|`i&<=zm{zmYw3&9Z z%$#C6OsDBG-DbI2VOE+`%_{R%bDH^@Io+IL&NOG4v(4AdIp$n*o;lxKV7_54G~YBA znTyRO=2CN+`IcF2zHKfy-!WI1@0u&kRpx4Qjag%^HP@N%nd{B>%?*&j-DqwyYt7B( z7V|^1&in|HwA;+>kaw+zOz93t&+dXW>TXEfHn0@xUdX)eHxEF@wGlF?hgd%LOGwv# zWgdaN?@{v@q=8SEC(TplY4ePE*8IjiXMSroo9E3I^MZNNykuTBub5ZO@62oF_vUr; zhI!Nc!MugDG#*V>BxQm`n9G)FK6r2}aUH(VRpD3VfVEq zc0W7P?r%rg1MKMFn|4faVQ`Th8|-h#;ilU0_A7RRJ=0ko?<&}r|q)c zcDY?)SK3qUD*IJ?n*EwR-JW63v}f6~?bq!&_FQ|OJ>OnnzhN)5-?SImi|r-$(%^pV zGMpP+VJ{2LvEQ<*?YHga_B-|p`(1mby~HNA^~Go4wus*sixfv3KC~#(TlGV1vCA9Nb;Fd1Sxf z^58qcx3M0-6#V|p!HxE(_HO%M!Rp}ac7y$yy~o}gTp6sf_u2b{o9qMj=XRrg&^{Dg z6?8Kq_EGzoecV1_pR`Zer|mQLS^FFNoc*ocY@fGV>(my1uqA$ z2CumSSLljdvFqddx;JD=g-Qm#LSLLc* zjjMHOSLcp^zNaJI6nB)H>ZZBrZibubj&`%$Y&XZvb@SXY?pSx6JKmk(=DQQ!0(X)- z*=1b4YjBOO$t`q?T(fI&i`^2}>Xy1T*Y1|NQ(TAZbX~67Eq5#2N_VPT<-Y1pb6<0( zyEELG?ksn<`?@>Fo$JnX=erBsH{6Bpo9-favAe`w>MnENa;x39-R15(?h5x^ccr_^ zUG1)MYuvT&I`=(yz5Bkq!TrG9=x%ar-OcV6_d~bN{m9+wZgaQ0AG`JLC+-e+r@PDj z)ZOj=%WZH!bN9G=-F@zU_kjDk+vpy254m5shutsTCig4%i2JpB)IH`NcTcz{-Ba#q z_l$ei{l-1#e(N^7=iL_ff_u@u=*VA2ZVcu1H-+-LE+xv;BZJdG~6c~77hV4`^VRZvwLD*4mRFU|$v4g6u|$;g z&&A4$Y8qNP8oHM*Y;9UuSku_vm1$^bYU>JX8!{-r#FE@%l3P56;Ewi87X`=S6;)x{ z$4*PF)4tZ}p5*e;&oBc5jmwlqBlD( zS0WJ}kyDFAtcbj0QF$yGsrc?1Pp1+^ zGdf!{oz0#=v&87B6k;%4V)2yZlaiEEl5#2?&gQ3zX7Ah(@pKtKf=4;?SRyVYE|Wr( zNmVM-;hdfvV{z||=#o>J3?CsapIJD$@kJbtHlF`llJj4QLmw9)R}bK zB7NkPJ^Z^_6N^=s;~lNxcQu|&;9ZU9WrTG4%e zOZYP_VG1p)YJIh;>bzMk&sWRy)$)9Gd0wW8>*w1d&EcqoR4!It)X+<+!iF9igpEBN zC!UT;ZZXL%9uJ#*aFbNC$-i(-zD|WrJ?TjCr1;fR{Ax+CS`w_0;@3#=Yoz!!QvJAe zsk&6rqMYI`+9{h@Jdq3+5j&aRI3 zWz9`_?Y^>o+IREb^9vD+r=>B$8SpEH8HG(h;KtLnQcpiFz%4n|R)+1qyKwYW(zW*v z2ep!Dtt472iKeA;>10uR&bZo##JsM z##PP~1EnNUCYhHdU2A*WqRz0ZCm)QeTunrle99!BGAVgwx$UA})a`pwx4bdkOaj-< zqigqWsEpyJw}W9+l`+3orVT$4!9P1*N_(cuU3V`z(^7+MTcxFNX(?Qt)U3QNT;WI8 z6`nRLdTCRzqGxnH)sL>H_6GVUugE4Rg{YIJM&Db-=@qWp=~cz(Dj8QwC#g)CrnW_t zS}c()*DZ_v=vpSDYgu-51s{abm7}G242vaFzCR{X(hw;>P$yDc7=(MuB~re16Eg88 zQj$(3(+KghCQpxWbA!TU3d5AyHrqS=Y#U4X-T_m}k?jy=QjRhyhs@fzD9e|>QqnE+ zEt)8kd@H$)Vu?!0uT09}r)%UR;bjtDDZSNqxLBfG=u$5AE0=PW3w_F^T;)=(a-mPT zl%rheP%h;um;B2m-*U;<&mplyh2&Eq`BX?g6_QVd)VD&?uaNXBB>f6Wze4CyA^G?z z8|h2^{Dcg;WZO;htCD=Gq#l0GL_G1YlzRF(HkPRJ&&55jj(8OX)Su!}RcXd#N^t`x z_j0mu-!0Ab$@F%3^5!?WG*gtxz8IyM0-5kBnBVNuOde1ArJ3U1$sh4JtD3a8(Zt_l zOZM1OJ+|^5TV;=}y2n=AW2?*Bs(aF_?n$q@C%tM)PZ$qWc9DMy%M!%slQXlT7K@}7 z#l4ekHg*Cj=lh8^n{5Kw_Mxi9{A7#7TS_y9c$norvluSrD}) zho~~;W;3ph!6wsgHs_ii!qf<1zy}Cn@UB$kJkeN~eYVlJ0|hr0@?b(X@vN*Z#W%7j zvY(L2!oz*G6v>)w-pQWkN%oW?iBjaZ@)T8?32Bxt&Gh$_=^4u;r9@e_#ECMb>8e_n zHD_#fQ&+|vky*Ml!^1=p-8j9hvjr26Jsv?Ojo>-Wu-PNA^mRvNmMzO*9k#T-F{7t- z>*?M4*cL2{T4*t^XSSGG&FyY>%c7+jGbhuXH`ga+W;VB&8vJH+O){0;4)mA9s?vOHaoX>0FlYHe!4AeOb2 zHe{ChbYv<>mZu!2UcgAQ&$<bNxVI$;p& zgr}>Mm3N)2o$G{gtP@_ZPJ}6S!mQNEQn0Ru`FZ4DOC==UK8`$l?diH+dtFYPnjCv= zjvb?LPdc?Z_L`h@YT3@zisF7^jpBX+isF7EiQ<03i{gI5iQ<03iA3lV$?7HY%k)^} z*-Dsx0*pN82)CaAqquLyDDEfPDDEe~C?WYLB>#lupOE~$_$Lx5SX3wUOG>&) zX;&{_i$#8+2vg{q6uNrJ8vKQ>NvUU2=$e#zc}X1N30;%Yu1Tq{UpU4hFNA|B`A1SN zFLH&y?cE(>YgsPwI$Kuyc%9f;X!F*l zmPO57K4M#oB=y=;&-}RWvg{Ob!bqfY`7h=Qh-4Pc9UV)z#`fgbCh@GmHy;1@8F_7hPe=_eeR-aqLl9JqbT zZPMjH zV{aoWBe1c(wKda`?Pi@|eYl&kh1#7g(#^=~yP3C9({ns(dyeNDpRK<2IU+Yd+4?Ta zbU^CXw6Ke#@4?Ov?vE5)vT^nl=d&fl^ZceXwzd0LlPy#-vIxz{>S^X}R5Ff7 zCF6L$WNh^%oVg_PyBExnyL^DH%C)OGfT&$;d7xBWs`bj>d&eOItXZOz4|9tml>v8@%DWKW!t|X!C~e!r?OSI>j3u-stp(?~Y-&cP;nE3UBzH9iHl4 ztJo-N@@s1Dv|h^3{>37O_YRr>Alu4ul$EiA#)eqJZ(PBQJP|S>*Dw=u)iNL%R-PQc zNM2x{T^o&w-oI&SkKLxbJK8zncx9pwKf4secUPw4RNLCp;ir~ZRav;KsT00_c&e(j zjS#DPho3AHG0%j-^kYm+2Gp1gq%qHwC1O>6K#j>j8}o~jL?WIl^o#I?kP%bw>uPT4 zXe>bQV@oIJ7WXU#A~Q<^Q${e)Qo!v;(70zQ;Eoj_Dei{N#XJvrduI{7>|!tG9xD#X zho^Kr?}z)imw};_l|@abbhj+ev^KRhH1)wW)Y`tNr6JRbwOVmY8^+E~%mOX#ZH4U} zUCks9&SYl+pHj>-i5S~Ga|k*W(sSq;tzFA{to2=7j)Z5)F+%(LCOk`@z~esLvy_Rr zXW=oTCkvW7yC8Q)p6~^eNS&g}kkMSz{ZdXPjGOTYYB}XPNSR66Q>qb3I>=IoK1qT!@^)=6hF1 zOJ^?8jg8N45ju5($Yv8kYQX$xkhOhXfzetD0B zD_!oT$;cuVcH=XGs!B2{!KA@R#S$yieSk~w~n_(eH>De+6?_?0oon~ar}Hb^LJnPtU3 zU)bRwI%9XCTq2a`JYFGw6*+#D;#b-07ncfyqv=hrO5#=J_*IKvb&j9k;Yh}6$WMw3 zsi2gqPM+u$Mr+%3>}lLWraYA(A45NQw|bc*2>l z5(?vz_l99vg6Di1Y|p-}iRYyLeq4ZC z^7rCOxFvrtu7sOMDwtA#KTcp%;d$Ag}!KMCLw#bXs;4k?L51bMnI3+xAN_gOu@W3hIfm2?rhUbO;UaSVU z(BF@t*mmcc0;c5e#kX(^{e`1R`TcSDOa1-+INZ|yWkP?yKMsGXzuymsTk7xk!{L_t z`+ab1`%C^_Yz(*L@5RS(OZ)qMaJZ%Y{eC#ylE2^nfLrn}m-_pCarjI9%O!umKaS50 zB!9m@4!7j*_s8Lu{41pXe!m?4Qh!-1r2Kw4{3UN2zNq!#>m9g~*P6egDvCch==m>0&w6o0=Sgd4XD;;dsneiq;S>z2l*_Kxr^L+Hh(|YcLewRV@jIwr0B8a9$)t+yGBOKN3!8s2%e-1@iIQq5}O0!n*L&@Uu9x z0nJ4?ZK816WM5zj{w>ZE><9Zu{9EX39|QY1oO4z{|e_6pzkWU3I7TwPu2nNz`qLa#lOOr{x1XHz`qK% z2e>^Er}R*Fr4${4v(O@>aPl$_SO`r(3MVg7el<#sLg;wto>Dk78H4?BbvUqERRfP! zN5g-vnhTt-=EEnWGO%~z^rFJK#TCG_)LFo5)HMjbRY6-9P7dA)d_p}1d|Ew?GCYIR ze;TL%UVzU_3guL<;?$qQX}{NiZ{SRy!im1W13yw91Gj5X7-#lEAWrN7i*$eBo_bH< zUV1Qa1Wx8DoXaZ#?yvU;j>gG6Md$8-hv-8Btq<3rEl$@>22Rz}fjCnKJWd}6oUcJ= zoS~}+HtI&;LcI{!s#}3=x(#@WJ_XpVyMbruGl1vnbAjjU^MM!Zi-DKwOM$EPYT#2E zwZ@sX=YX5_X5b4NwZ@sXSAehU*MaZocYs^AoPLGD<7Vtm?@1}YC&%)8(u#hKKWKS_&NjR${czf< z1kb41v#Lw*7Woi`^H}}yUhF4sjTi$EN^eE>X}WW0Pn^=)A7{2q)tt%D4>f)Ew347~ z_EED*JBUw-G_MVWj=NFfc6jgh!uhNN#2w=89)#0cxJa1Gl!wz>d*gi^6O3(WSh_5D zpYanyr5Otu2QUt09LYGI7&Mh&tYDnTSj#wtaVFzD#`#M#9ZOU_<8sCe8Lwl!gK-n% zi;V9sU9xnE){Oa#eHjNb4rMH19L+ePvt?D2PB4}+9?UqAv6``taSG#f5SGR!^KY0m zu2C=evY3xv5aPU6KH9sGPqtB?_UDNz27t$$59jp)T z5t?uCrfU}SY;T5mv+=AdSS99KF}L8j5Bv*H4pebI+F<66^|0BXa7P#NGq5AH=mUC| z3s1d66=57I!pI{&s<;B~%@Rj(4^l-B<5`TT?5m0w1di^$gI}+0eqh<>wBqX!uUH)q zJph5;h~FkLzsQ~q-_^{<-_`%$byK>#`|X-;HvinXyTo??;lss;%xn^I6wa;PR(z_`S=d?DNexWP=mNCn@GoJh4fAh*Rt(IK5tr^XW5j7Ja_f zYNM`)zs9NaHjdeav*oK`dlOHciKn;WO!-Ba6R*UR*Wrx#I+P$EPxZyQ@VoVWi1iRZ z_XzM)ocDeXXS-j+Ic|-4u^H#KKf>>Q%mte;1r#f&pdl-e` zEcRHn(v;#CnUUV6M;tpJQ4hpY;WY$#<6`0`xojL z5juhWOBpLUG)>e{X|d-(q_`<3vV3^8cLe z<%}yBp=B8YLfud0L$k;*Xb>3*jUlDT@os1cIap89b%=Kn=XH1Rsh$drAIIti zDE&O7Si=7wiCIFi5PKq4DxZSZ6Lw(zpyo1;XRIX*?qYilW14XW`(MQNNsKYZ0~sqA z%NXY{MvMnA9!D5_xC5(c)y_T%_F2t74-y6svVW5C6vj%%VvbYJ_Nj~`8A};!Idm}F zn;8$~)ShDdSjO=jr<&~(c8o$9ez4<6s!4C8S2iP(N1V;N!a z2HWTDI2CE0!uFw@{w$7v6#EP!dvFP1_;C0r?Aei`A9$~R7!!v1@gn#LVRxdZD>X>9 z1E&y%H-zApcJs_g#F)Tq-dpt9c+&%Y1$?e$pYIcft3vqqj5?F?R!s)KSqn~cqWsT< zuBD0KI_u#}{}j>;T}<@f#$i+7NB^WJbt2_R?$uYYZ>?3@k50Ax7&{r zQ^{Yi2@_Nv&)+GGf_NtaHowT84d2zw#^2Td-*r>EyZh~$ZZ`kixVy&r-*V^X>Fvc> zwT=!ZKv!1<{uB70$Za{3+Dp?6>-mrgn%{Vm9>C`w#;X|r%81oG{9j_EeyZFNjCH^X zSSyp3i~X^JJ^;Cm2@Zlbt+9~gTn)WYk3&xLG;}g;fj*`;Skuy0Xj$4O8kRnT2Bi>M zlM3`6x!RGuZX~3=Ki2aHu>P(l!@6H~rr5a8X-P}6j)>AHFk zt?<5Rxq?(IN1K&p3PLW{tH(c^_T}|SLGA^qm)9Lt4{6szNV(b| z-Rg!^>s&~)E`}6qHKbS1L2C5^q*bp&O0`wL%UY5OA(Pr0vM8_h2y!S$p~mLuI)XGx zbR3cHq9*$ZXs+C7Lbhwt76MmkPCJmafLb6+{UM~S2V-28?qgUp-GQQ&j%26PK;7-2 z>1Id}w?g_ywWIlxYlVE!6G&qT?qC?}AjgDel0$Ua&9j3E7hD zoz)%mFZ2WI1(&1!ecMyJpY?y$=JdY&YpuR#kIu3Y&^P93lH1mezJ;YtNZw3x>oIzk z_>5s6n#;yZTSboK)FVKt5N$*uLs|MZ9@+sTNUslu)OrDA(AyzX&Vwv@Jldoa?NI_L z>}Vlicp~^Mbl?0T_zN@w zeWo1E(JY&s!zqqL?Xt2-lFU~^^UsmcVR#(0|Fl4t-KoJ@!8d}-f-8dSz{%eZy-yE7 zx6qT|;a?5j0tf#gY92~Ty;9Bb7`qQc8WtDgiv3m$~-#%G{Q==abZ_*dxeQwldqa5}vb*aPui9tORT)1dqDM2v$= zp~>%S(A{(~)(~K2SO%(Z8~iThcc^5fb0&;9M3! z?=ER9KOLj$CD6-s4Rmn*2)Eqc3+-BuLHFWIc+37A{0(>A8ihN}Ii+5i??LFHheJ!{ z3}~V}3HmkLp>z6-;C$$Ix;$8eTR3io4zK&LE_)mr7GDnD47OrD_9=RDvFbzLA%`;= z=P}M_tY>UyY-8+VTtzbD@Jz-_7}qeaW8A>FiSaqc*Bh3{;^8*N4;eot%+rkdjC~mg zG7beM@=6#-GfrSkFjg>5WUOVJ0*vxzGR|Y1&sfjc%-F`*#kdMsmUkxOd5jk^u4cTF z@jAvE8P@^J^VT!o&3GT+X?e6V(zh#lU#}GREbMr!k(*cmd-jjF&TB z4NT-;&$yQHR>nIRH!wcH_%P$6z$pJ|#?6c`GrrFFHsiaDA25CbOcex-A!9M)0LHs=UU?&cgYvNR4kUT$puA$nkdbOT zC?w8*Q1}5OR;aj1Mv1$9Oj*_O}pc z18{J72ji`bYZ;n0t%yHAbTFFh>*~=AL9E3J-Hc;bHDk z;Bfaa;{%LD;o*)bJlx&NNE9CKh{D6&Ex-}(2F5jvMBx#RC_KVl$Ve0(;fTT`+UCBVl7YD%t#d8*Aa#H<@X2t9qeBgvF8bySs!qfv|Ib1x1$x1a(0Iu>^7GU zz&1i~w*M01jy=Tx^0)`b|FVdU-(B_L@|v~;{{KIO;qEl1$CpAg5G^+>7;cKiwBCed zjs5ipVr~`lO)*~`XaMz_=Xc#C^%bUT~(o7ZEbv1e~Rg|U`#B4Y((f^h=lXhwYJ1!@h|!^9+dkeld1 zCeZ_?B6^TX^dOVyLFU^?WrTX2@ny!%j88Mt=rIDf6B5$sF#@|FDkxERGp=V`$9N;- zb&OXst|mkt|5AG*zQLD1B*Xhp*)VEyDZV7q>)-pQc5*_fpYw+gymI~&%QmtekWb|N zkz}Fw57L30KdkO^{%AGc`$uc)-alFw_x{lbAiaP1>M!R{VXRabPgFnrKuLvnNnt!v z10gM*0{LoImT@{H8LP3X?_ELfA`!uk+8{MTjaH?&Z($;CQkafCtOd9OfyQ?vi2Vm| zju$f~CP@W-IMv-?pY0;tTj1?C;)2n~Swf=l1tHN5-_~)MhNf`ph43+Nin-mJb}+|K zc94$=?b-A;Af`Q3%#~tN&m({8hh*L%CiPdiU5S|U#H3k@{AnH}lln55Gz*e>y_nRy z$-PEQ;zr0V`M4{5UEJm3Pj3c=e}ugsP!Y5JAbiL78Cbym=u16Fx-r|pZz^LUByuH? z$A@W_9^@YSsp2jGUwP9XxLnxjisd+>_2s?e% zup5Ohfn9>bh%P>?uX={l9z)*)%abcOl+wUgz~Xmnj~_TD)RIE+6|lF_*SSa;rM4Ik z>~iXD_>l}$S-cIlvByW-SA)L0)re2p@JHJHk>-7f@i~3_(6&#y^an!YzOw5fMWnRx zX4`ut?frXvHs<(f`;gs$Shx51X?u6DuO0XA=-EdZ2M2w3d;b94J%Bq15TgU{ylCMM zw0Rrxd+sE_=i9hvfbJOJy9GjvZ*c5%yfxa+3M!S>x9|22hs$>B`$y=I-vQn67W(4z zSucEF=!72tUGRgU2Yxs-z$c;Ey#`v_r$SfzEa+*U2OaIlLqGch=w`2nUiO8^cV;jQ zQvY3UM$u#NeM9Pt?nI$`D(o1Gw+{C-6@LDH6iaVtSx|yqgju>Odq+z4h7`UXWzueL zM48I_TGRDRe*=caC}|^%CWL!3<}(%oD&P=xKb>uc@yy ze^!Q_nxWVgIRQHcCu0BSaO|_Jg6lNw{LIJx%A=T39>D|AnxfL?SE#STxVImVL$JGc z_-OPLd{xD}<$Wav_B`2EX#Gl3)BOnWaiC@j1M4_79{f9lW1s&|^acbL zx4Ya-cec>;z8vtaRL|<$c6*1+?r)HJ>pwtE>IK8_k76jyMtt&NFmAe;9}Kah?dV`A z#@}&hfBL$e&ejC#5X?~uH=Z1X-8_XpgC0ZocI|v?m)zNP0>1k?G3S1+XV4$O zW)g1UIRUr*QI9>7kt7vLe;Y_`bE-L)sdKaWA-9Awk5M?rU1}xbZVhhRS!L)c9gN~$ gKX&I{{~w_bW-t5)=n*&vf?F`!vHGDu_yxiL0mn%PZvX%Q diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Regular.ttf b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Regular.ttf deleted file mode 100644 index 1decfb95af634f6e44fb1ba6d56fa342656dce60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138680 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 VPoPKO>nq%T(TdfN`-7hl{|8{rQ_BDV diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/add.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/add.png deleted file mode 100644 index 6332fefea4be19eeadf211b0b202b272e8564898..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 733 zcmV<30wVp1P)9VHk(~TedF+gQSL8D5xnVSSWAVY>J9b+m>@{iq7_KE}go~11+5s4;8hc+i0Xa zI1j@EX5!S+Me6HNqKzU5YQwL;-W5$p%ZMKMeR<%zp69-~?<4?8|C8S?bklXr4v&Ov zb&06v2|-x?qB`90yn>Qi%Sh2^G4n)$ZdyvTPf9}1)_buUT7>`e2G&2VU@~Bb(o+Mz zi4)>IxlSY${Dj4k={-9RzU^W5g9|2V5RZ2ZulL9s2xQbZ@r6eP9Ra5u(s|C0Nj#&4>wTSkb?%#=9?@ z^oxDy-O@tyN{L@by(WWvQ3%CyEu8x{+#Jb4-h&K9Owi)2pgg+heWDyked|3R$$kL@A z#sp1v-r+=G4B8D6DqsDH0@7OztA7aT9qc1Py{()w`m``?Y0&gi2=ROcc-9+nU^I6< zT=e_Y=vSnG@?3Ue{BW5ONFttcE!R-R_W4O01|0-|K-YNXLo2`4Qv z`r1LxR6#yf3FB%T95gJnaKKivA~Z}S9A(ZxEDK}O3T04USJ P00000NkvXXu0mjf^IS-S diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/arrow_up.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/arrow_up.png deleted file mode 100644 index 1ebb193243780b8eb1919a51ef27c2a0d36ccec2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372 zcmV-)0gL{LP)6w#wHUuW*nL5>vZR zlg{G&%mT~|kL3ei%GW0*UOHUMs5XI$4uxe-L?I@SAefq*207}Iqtjm#e5*fP53AiC z)C|RQfwzxx<#_WfANRGZx{+tFDl8~Q?;~Ve=lM^*8UTTnVL?HTDz8uta0D@d28E9S z_)i8aLz^UE6PPKymi;2GJ`34{eIia-CtfAt0H61rk0 SPTNud0000Pdwe5?6tW?r-ok|b$oDQj8FV%kZPq;(MWOV8?8;<)(iP}>hNMU> z7fbz%jjlr7h8uuoQ~J6}n}@Y@PdTk=)PxO{%7zmL?dchpZX*~n;I{!C>*(8cU;q(~ zAS%Po_@naEU!xidrBXD?;hN|x^%W|Ij)0y*r5vi|?W&Fub(NqJ@z0o=O&SR3v>A``^efOSo-hEdApp;^Jd;9y!%1UfzX6Bh- z%-mbG|0Na{7Ruai_Y+DEb1s+b!*9k%Q!whMxjtZKA*?o;i1g&jy0@( zaU=-@d-h+o%gal6JRXEXA&L3`d2 z%jIxzZ~*p9O-;EJp_Ds0If38rM<5W8ic~K>FOK&2_p!CLg^i63OioVb6k$)zWHLx3 z5;!|M!}<9+#QSi1dRlbEcxPt^;cysUuU8@%3}RwpLRIGG<|IKnoyP6$Eh3SKw7a*r zSDXP=IYc&YZf;7@?fCe($^l9ORaJ3wbAx0uiC8QqRr$2t-Cfy8%XCI3B%pxJW>XdM zw~zPt_s}#A@pxQ5Ly)4szaMtH9lgE1SXx@b+S(fW`ub$fYPE8J7#bSNDzme*Ub07{ zQKV8SjEs!%0@v5ql8ggm!@$6Rbi^E8vBqpRM-}l+@5OSMrl+TWj*gC^qoV@>u{fQb zov5v?g~?>X@bEC&+uLPaQ&Ypn-y~^mZA}+f(&2EFH8eE%dU|@ENpN*_1-)L6_4Rc* zFuq@`IjX9vp1QiaK9ZojyZhnQURP99d=u;%37VRkpwsD4U0sd3x;hEQB&e^i|3QN0 z=H|Os1fRqaw!?#igLmS4HE!G3*ce(`TF} zlgUq0Q544c8(ae&UR$8ps&snq6^bPY3v3xAmMW74Di$h~GCH6E3TaYs2#6A<7K*gC z777H71_Wa;(dfp+g-drPCSWu)#PInZi72LJ;o?i~$-U=y&UbQ89Dul3%3P+Axkzc* zbH-y;QF=hR{qLItf%ci2_&e5wNo0gnVatG?ul6Zw=o$I9Ljfn*ic3`U?>IfEim3g{ zujU&$-hy6wn;w(xme|zJm;lWJxtTFfM)q0`kX!Vu0+d${$}LCddK1<^htTe-fUYL3 zB`SdNsZD>RgvLj1<^@h6_+cDRK2Brcr2~>%$*5S)hyV33PV^teac3%|4lz@8p4?)5 z?t5o^?q+%^%)Yygo~I^U4VR!bTnWuE35hcWrfCDR3q+sxJ79e7Fg`&)RCqLA^2^y^ z0laVfadW90_Fz8Brm|r47sB^u1VgI>kanj)Z4`zMSfHlm8>CwXa$JVM`$2RrmZB-3 zN10m-!;BvH*Br3V8t`DH7m`jf#2upVDXl{5ff18_pzCPK1Zu$$CKKvd8FGeFf)+K<|x33pc7P&S#3GZT4mEw;nr(Ze*F z3&*?-4U-lm*#tber5 z%S_ceqB`b3ko6r~BbvDwdohTvP(3a(pq{x#T$yQsu#OKwEe}KuH^Mh@nxg_(Nw136 zq#a^3xNBke)In+!?qk3%4wB69{pF`Tzg`07*qoM6N<$ Eg55P&8UO$Q diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/bullet_black.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/bullet_black.png deleted file mode 100644 index 57619706d10d9736b1849a83f2c5694fbe09c53b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$h^>lFz(Kw&{<9vg>5sw~gS5O!4 zr|{HuUFIBKiQyL}eBJ-L{`UVT|6_O~L{G%N{Wbre{kQtZ_0LvEhC#5QQ<|d}62BjvZR2H60wE-$h^mK6y(Kw&{<9vg>(S^W+6Zii9 z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz1H+_;eX)`ni0%X8XBDc-`=Ph(Uan2 zYsR{H!kvIN--9isvHznRsC#5QQ<|d}62BjvZR2H60wE-$h_H=O!(Kw&{<9vg>(S^W+6Zii9 z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz4q@v|B?28{s)#N@CGn3@%_y|zAV9T z66e<&B4?b6oF&azg|C(V&1ZbI_D}pL`}(^FT2yXwG1Ph~$Q@h8mJYOz!PC{xWt~$( F699+YQR)By diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/date.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/date.png deleted file mode 100644 index 783c83357fdf90a1c7c024358e1d768b5c09c135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626 zcmV-&0*(ENP)5OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$fC4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(8Ia`-u_IEhxG7U<13kSsMW+$lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/find.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/find.png deleted file mode 100644 index 1547479646722bda4647df52cf3e8bc9b77428c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 659 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 Dl)1NK diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/macFFBgHack.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/macFFBgHack.png deleted file mode 100644 index c6473b324ee1dae1faaacc0826639833f551116c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIEX7WqAsj$Z!;#Vf4nJ za0`Jjl>Qs8<JF;+Fd5q0wCR k?u=~bH}2*0f`J3~k>FVdQ&MBb@0BAfpf&c&j diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/package.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/package.png deleted file mode 100644 index da3c2a2d74bab159ba0f65d7db601768258afcb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmV-b1FHOqP)5TQ^(M5v$(QKVE?W+9X! z*o}&~6c?_FreF)9NJB7b5Nbn{G0n4+%uJhR9(V5R|NFTpb|HgjefT!tIhLx@DR+N) zV+fHiR5Yt19}k|KnCsND{tH-`IMJ)3AE?OtyZ4>Un|6(d%h#JK`i&a7^xW9>`yBy` zS4SOHeOpC7$?hH5-#7Rswiue_8Ju*2N@$58=a#2OTA3png`w3v->gWif7t%e$ z$NLVS!tFT#8WL|Wa&K~+{%4P2cRfwesYV1_!F=3OaRVHl(>=`%&{x*s30c}#CNE@&;ItrAv!f!)Oy$Q9t$uS=(sD$-J{T*^(8Eez1E-l3}} zPrfHZ1`qsIFe&gipuL8-IZbo2Yg{lFGKs?ZZWcOaOdk*3`5T;$?AjbG1#`B510Er^h2)2r3Y{!8_2Gj=$KzuN5 zaErtW8W_Y2iJJjY)5pmTVJoPJYpanPOEuYHclM^C1F>${hFRpdi8a<2H|Xudf78bm(zwJ9`K%6I?q*Ua~ fW9JvIbn5*B+_J)rUMBs>00000NkvXXu0mjfH&TkY diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/page_green.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/page_green.png deleted file mode 100644 index de8e003f9fb8752c09e7f3655d5d8664b5c62fc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 621 zcmV-z0+RiSP)QqUjAtB;_Vvt6}AS_5YgM`Uqu`yva+H8^=4U$e4gHb}u zAQ2N{V3A%pO|?Pv?tb6z=jC}SiRa$G^v3q?*6XcYz$p|cq{uLj@#~Fi`J(>5{@&&N zy%T^+;>8cXx%|o77anP?&W1?1A(>-T49z9pyeCl@7YI+Si zKti7=B~``}TImz(G{0PnlQA3P#MAd}sorMjkP!50B7$nAkU^%#nl{Q9lW0@}9fE-> zN(q7tRuiC_T1r|BBtVBTlQ2+70$Rf;eF`Z;lx46Cpu-rEgb)EBKq(b^W8l<^We(`D z43?0=01z<3G6+UUv6`CsWCk6^93!#+<;ws7007{zS3k2k9-zZKFO~(k`>s0y006+1 zgF_jyIhsL-`FMf~JL~C=cV75(CrJ|q;MVO961G=O zm9d)YpJg5g(4i_HKL75eSE}mq$Y}r}hyVdcV~p>6a}oXr80q`oj%+s700000NkvXX Hu0mjfPs|!l diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/page_white_text.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/page_white_text.png deleted file mode 100644 index 813f712f726c935f9adf8d2f2dd0d7683791ef11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%6;pyTSA|c6o&@eC9QG)Hj&ExYL zO&oVL^)+cM^qd@ApywS>pwx0H@RDN}hq;7mU-SKczYQ-hnrr=;iDAQMZQ+*g=YOM= z!QlMQEn7FbaD->uKAYgo_j9)W&$$zS*W9}m(ey0q$&7l-XEWO0Y(9M=SnhLbwy;d>@~SY$Ku*0xPvIOQeV1x7u_z-2-X>_74(yfh7C znXL|3GZ+d2`3re2hs?MKC#5QQ<|d}62BjvZR2H60wE-$R?&;zfqH(@;q9b3Efq-lM(nr^( z=EYR73-9e)UYMWsXy%?aZsD68Yyv^2$~6QgEcljw%kx>O(f-gQ?@fOOx3A-0+Qw?O zRx~W)kn~Qe2d6f9nMG#g9Q04Mk==M~N!Dglvxk!fgVh#w@ZV$IY1+Xc`d{d2UcaP~ zfWp)_Ivqj}l2SPy^9ZWy6rG9Yx4v67_uA&&9|XA~5-#3)W3%em1peD8RWH^#O%XoM zxMPud%}GTj#~*+7JMxTd!`{^Q+>(D3*|@KV`*G2;{QnANOxu1$r2xIe;OXk;vd$@? F2>@zac~<}c diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/plugin.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/plugin.png deleted file mode 100644 index 6187b15aec001b7080b51a5f944f07591f26cc15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591 zcmV-V0eEcNHZMNv|IbJ-M`( zKwWL~opzjJe^WpCmV9E;(0&ut2;4va_(#>M8)>9$R5viQnf(Nkh~VM$y>J(jqb$cj z+nL1Nm|mV)Gm|9MnHf*7Ja4OEAQz__^LRKOLEwqpiGV^^A*T=#&inGm-62Xs;dnSp zKj&H9T*boh2i)W+(n27l!C)>fq|L%VB1i ziC4p;NwV_}ZjW7$LRW#(_bKF#hp=!IqNO26Z*w2+LEwx{PVnZ&Sn}T;mtzb$;qA*nT@@+ zV5uQ@iXDTPoTbV#FRr~z04|PPh`wXTNoCm9*tG&?e3+fYl>K6+&3|Cc$KOpL`ER+_ dcRl5U#9zn6ZO}GFk7R5;7c zlif>`Q5?tj7Yw@ZCMtTF^Q|ZedeJhM%QPCR*bs8V79p$QTo7e94yQNXRs-{0?hOn_-8n0AMO@u1Ts zNl8QzJs1#rz%RBt?ux>l+amAvh+J!{$lkaqv}+Erb-6j2xp>K4GLQnNB*W`hFg*?P z^AL@~(h~Z+wfcWEXHqV^Tq-#z$7Y#o0;yFxA!00F}F2dX# zjE$iOgT#G4*1TR6kB1Gnn@>$meCh2a>c5YuIvFn-R2W@>4@M*m@-|jiDV?b)bccgA zyPfsMM!rjy>+1O2)5Eg29Z_*2p&qGnmS!OH?vZ(4>QB01d>j%9n4QINxkyT(Dos?I zjaWF$*IQmh`SF-?xU%xMEfjq1=6qY*g&lgG_cXv$BGoIWyfO5 zp>pdV*O+y=&6@N2WWFo(%RtT`Q(H^6zn^a%epE~Kx^mEJ{c8`luC$nc*z9j|4Ms8aJK-ladKLpnAK z!yd|CC&>l1b7`m$MH$ScEIP@XgT41O>|DzL{-38CH68OyX#u=G?d7;y&_o&o)f@3U z2(tr%Ok88caOL`xiQA8o;Vzr-$A$SOu6o|$&0DQAJ1Z7?OACaeoy+)PWu&~aueW<| z*KW^(^2}#30u*~<_mXScFNd6U&sxh5*GGMNytZGxkIGqL%v6329^u`FD6T?b?K!4B z@Hzh?O2Au=((Gu;rvgLMt^pS|u1rEkBgC8$oH%zgT`TvZiK#VDrVG?-i~6a_+WZb> zc1>>lb)xcuo^Cl8k%q3c_d*It_Vtj>RSovF&w;hS=6uYrT2e@-@l@P~uBN`zu!v>e zTm(is&jcQ6vuP?|;!e+(n8w)-Xjd!hwk@r2D0i00ygdKo2Xvs?&w_lajj5DHS@9I! z;_&ji2e{!uusGnVn};Pu|dl5x-FhQyC8^-4Uo_;BLiOXzcE z&4PS2TBWSC=hsw0og;z#(mly@Ed2E1E$_VDaM?kloE4ob2XK&K;OS~-nhIGlA4~UZrJu6*|}wi#TT?|yWUH+_&n($t0xta zBwTzSfE)uAw*L0>+`pTps}L-$jIP5Q_E$Am+l|{XfsKr0Vi~`Em?SJQ#0y)8vsxb1 zMdxJl^){_CDwI^}>)Pw${G?Ajc@P}x{Fvhoi0jbY^427?KPmoA_G)sqK}u$2(79Xg zC%}xm5JDcrsm5^vQEQpGEdJDc^yfuNAlqV1pZQVkOSceV<|{=|=@?=o4i_1RFUZth zC7cu<6%V3dVCI}P6DL4iUgTc@&(nXY)ox}HZ z(a#EgiNj%{kjRLL2t?{m_aKN`{5-&u+HAtQ-Qq#@!I@<(M+B3i@|g=LY6 z90tpW!JuMn_Lcy1q7g&LUSuLE3XS}K#P^nHVUmL`L)dbP| z0bt(+Cp#M-bH!LM*DzJ0Lfn;eTBV@|JvGSgpdoc1RhhV>(G-2(vE|>MrVgA9+?+0m4OzUqbT>-U-jg|v zLZMntq`r?fy1UCMh>z2Koi1SL-~N2ZrIf+dZW|;SWszsde}Dl!HOMc1Fa>K9)e&RI z)A?aK zcviCdKDUg_%#u7YAE`A`Y3$(P4&m^@fEWAvjAwVmRWeUnmkrxA;E!fKoc{9Vi=lvFL}KmoS;g* zdjL?Y!VHUFq63aLj6VZE+tHts?Z1pFkiO9^k*5pGpFpU&5#5G4ATd{t>a&9zKBVB9=Ns^HFU|DTGH8C+Xr2UqOU`Zxe)!|%j4=-QojGePq)pRGe;!f)Czk!u3vP_Jxu8(e6 zf4Q`F$Qio2Jw@N*E@k?c`+Sw}AYQjkT+x)OAe6eq(AT!iRuksKQn%Ao_Ac1T-p#Js I_CnHs0qX}mlmGw# diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/tag_green.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/tag_green.png deleted file mode 100644 index 83ec984bd73364134da0f98d27a800c5d3264180..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 613 zcmV-r0-F7aP)^5T)AZ%#@G{_P{NCN^P z(J0zvSn~SSm(Ur);-M~8^*;61*VRI`T1BN&LAhK;sZ>I-SVW;vfUfJv=ko^ugnc0x zhJodBxe>iyk3%w<%wC8holUJ4(iv>tL{`DQt zPOsyUbO_Cmc&*iHkqbm3ku`|GcC^OhF>jj9W*GkH;^g!iUVpib_h*=@udp4h(P+e*zL_~ZmJjh(y^BxULwq>9zXoYE8sq{#pN~U0C6!8vY)5N2 z9P*}mw}7X$O^qTtJef1ACWvJT9^wt-)Zh0r~j#0bT`f;-zv6 z^Tmw22!%rMcs!TaUX<-8s;X-B`+Xbo+_uWuFa z1yIPc?DTrQ7KvRhmt*TG|L=EYQ=LqFX;=Lp`4}jx6BE-@00000NkvXXu0mjf=s_29 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/transparent.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/transparent.png deleted file mode 100644 index d665e179efd797451084235f105425247fea0a14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;bAV5X>;M1%mmiTn0pv241o;Is pI6S+N2ITN~x;Tb#$R;N!@B(=T42&&nK2`x)44$rjF6*2UngG277DE64 diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/wrench.png b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/images/wrench.png deleted file mode 100644 index 5c8213fef5ab969f03189d4367e32e597e38bd7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 610 zcmV-o0-gPdP)^jb z4`0v}DG1te)wmeb(>p90leRz?_mO+^JKy=v&2<29Od6?F%9%(c8los#f*@G`-%W&* z$)uBj2i@u-@SgX}gtyWPe6d*|w6h%R? zScK2#Yn%$sum0cy>90DmY*i{1XqpClEtktsRTZ)lCUe z<FogV^*tm>8*AlX za4oiR!&85LrobG57qUHUX#{>Vz(RHpB5|@>9O6N$jqB8>%($0wxE5R3)b>Y~xtCo$ zCgEk&A?_#IxHdN)9tqre^o{ho4{?hmPuf@^@I3-wncaRd%|~O3xbrKY=&TiwPYkJroM{;WUQTuMY8vpg}f4o)2%U3C;eEDoiEh?94d(rV57VIF#8VqzW$HrDC|#U`x@QDbgi zVl)t9GGz&YY#D?gc%>hISA+_EBpnXt#pnC`p6@xw0$8TCbULjhlgVx(kuc)%xbgqq zR5+DNDFRN0!y)7Gm}oT0i39}h4h928qY?Rho^UvPGJ#kuW|-Amtrn`Pmd&+bFo@sp z$LI4IQw7BG?|#2ewOS<<3VjL$0=lMY^m;wqZujv5kx1l%Sl;V&Iy4#$ip3&@LV2!7vhhN=PCz%^9v24`qb(+m4W?!q-&~=?ssf5GfnAmJKV;3bvpDm0(NhahZ=&^sqo6Odj6>)Dq_3p~4~ zvb`d3Mydwjt&Df^hVmLtI2x=U&h9(JVYX-!y~z3zi;1>=LY;o(bL$(Yf$lf)dMf0-u^0HrpTG Wk@)HE*94aU0000m+BBgry{~j2fHLegbHP( zrgXNbr0}2;^nywdjLjZe?uxtrd3D(pZH@fFFc0{BW_~jxoO1w7-VX;6vK@ROA$$R6 zEmo;Ht-Mj|>5jUy{bQ^V5@53LRI8AgLpUm|m+15sqcz@QtVSo|oz7ArM8?pIn+>gN z0b=4_b5O|4A*;Q+vc9Vqr~%3V155*NV~@gTz}KSUiKB-uJzjMZ>5%Q#n24H!V{ zTY(LLAE*NAHZ}C#wnj%Bw5OFIkRhkkAW#kDC3j9Wm0YXRaXlyyp>#mVfYG)eC;@ab zDb=T-BCAY4LI(Z@GOTr2V_A{pRwSmz+8Be>CjAw(=gnbVWAeguvZa93JmL(EDxv1m z0OP4q=fpAK1Mq!C2`OkEn37o;m#wF#(t(8Pu#S?2f#x<~4EO{@fmm`p9veD6RZ_jp z@Au4};q&`XuKEYgIiB4((kgxOs#YdqJw0fY>9^K_agEu5+$#k;w#%I2N>n_?)YIqu z`tq&#_^p?-%K*U0^}|7+9U(&k0?s;=r=uCZ%)H9_edH8wK}gB(nUB1FFk+2Ol%BXV zHoFY`D~2x|2 -<%= render '_sidebar_toggle.rhtml' %> - -

- -
-<%- if @main_page %> - <%= @main_page.description %> -<%- else -%> -

This is the API documentation for <%= h @title %>. -<%- end -%> -

diff --git a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/js/darkfish.js b/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/js/darkfish.js deleted file mode 100644 index 4c15efd..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rdoc-6.14.2/lib/rdoc/generator/template/darkfish/js/darkfish.js +++ /dev/null @@ -1,120 +0,0 @@ -/** - * - * Darkfish Page Functions - * $Id: darkfish.js 53 2009-01-07 02:52:03Z deveiant $ - * - * Author: Michael Granger - * - */ - -/* Provide console simulation for firebug-less environments */ -/* -if (!("console" in window) || !("firebug" in console)) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", - "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; - - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -}; -*/ - - -function showSource( e ) { - var target = e.target; - while (!target.classList.contains('method-detail')) { - target = target.parentNode; - } - if (typeof target !== "undefined" && target !== null) { - target = target.querySelector('.method-source-code'); - } - if (typeof target !== "undefined" && target !== null) { - target.classList.toggle('active-menu') - } -}; - -function hookSourceViews() { - document.querySelectorAll('.method-source-toggle').forEach(function (codeObject) { - codeObject.addEventListener('click', showSource); - }); -}; - -function hookSearch() { - var input = document.querySelector('#search-field'); - var result = document.querySelector('#search-results'); - result.classList.remove("initially-hidden"); - - var search_section = document.querySelector('#search-section'); - search_section.classList.remove("initially-hidden"); - - var search = new Search(search_data, input, result); - - search.renderItem = function(result) { - var li = document.createElement('li'); - var html = ''; - - // TODO add relative path to " - @output.puts "" - @output.puts "" - @output.puts "" - @output.puts "" - @output.puts "" - end - - def flush - @output.flush - end - - def move_progress(percent_done) - @output.puts " " - @output.flush - end - - def make_header_red - @output.puts " " - end - - def make_header_yellow - @output.puts " " - end - - def make_example_group_header_red(group_id) - @output.puts " " - @output.puts " " - end - - def make_example_group_header_yellow(group_id) - @output.puts " " - @output.puts " " - end - - private - - def indentation_style(number_of_parents) - "style=\"margin-left: #{(number_of_parents - 1) * 15}px;\"" - end - - REPORT_HEADER = <<-EOF -
- -
-
-

RSpec Code Examples

-
- -
- - - -
- -
-

 

-

 

-
-
- - -
-EOF - - GLOBAL_SCRIPTS = <<-EOF - -function addClass(element_id, classname) { - document.getElementById(element_id).className += (" " + classname); -} - -function removeClass(element_id, classname) { - var elem = document.getElementById(element_id); - var classlist = elem.className.replace(classname,''); - elem.className = classlist; -} - -function moveProgressBar(percentDone) { - document.getElementById("rspec-header").style.width = percentDone +"%"; -} - -function makeRed(element_id) { - removeClass(element_id, 'passed'); - removeClass(element_id, 'not_implemented'); - addClass(element_id,'failed'); -} - -function makeYellow(element_id) { - var elem = document.getElementById(element_id); - if (elem.className.indexOf("failed") == -1) { // class doesn't includes failed - if (elem.className.indexOf("not_implemented") == -1) { // class doesn't include not_implemented - removeClass(element_id, 'passed'); - addClass(element_id,'not_implemented'); - } - } -} - -function apply_filters() { - var passed_filter = document.getElementById('passed_checkbox').checked; - var failed_filter = document.getElementById('failed_checkbox').checked; - var pending_filter = document.getElementById('pending_checkbox').checked; - - assign_display_style("example passed", passed_filter); - assign_display_style("example failed", failed_filter); - assign_display_style("example not_implemented", pending_filter); - - assign_display_style_for_group("example_group passed", passed_filter); - assign_display_style_for_group("example_group not_implemented", pending_filter, pending_filter || passed_filter); - assign_display_style_for_group("example_group failed", failed_filter, failed_filter || pending_filter || passed_filter); -} - -function get_display_style(display_flag) { - var style_mode = 'none'; - if (display_flag == true) { - style_mode = 'block'; - } - return style_mode; -} - -function assign_display_style(classname, display_flag) { - var style_mode = get_display_style(display_flag); - var elems = document.getElementsByClassName(classname) - for (var i=0; i - - - RSpec results - - - - - - - - -EOF - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/html_snippet_extractor.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/html_snippet_extractor.rb deleted file mode 100644 index 992704b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/html_snippet_extractor.rb +++ /dev/null @@ -1,122 +0,0 @@ -module RSpec - module Core - module Formatters - # @api private - # - # Extracts code snippets by looking at the backtrace of the passed error - # and applies synax highlighting and line numbers using html. - class HtmlSnippetExtractor - # @private - module NullConverter - def self.convert(code) - %Q(#{code}\n# Install the coderay gem to get syntax highlighting) - end - end - - # @private - module CoderayConverter - def self.convert(code) - CodeRay.scan(code, :ruby).html(:line_numbers => false) - end - end - - # rubocop:disable Style/ClassVars - # @private - @@converter = NullConverter - - begin - require 'coderay' - RSpec::Support.require_rspec_core 'formatters/syntax_highlighter' - RSpec::Core::Formatters::SyntaxHighlighter.attempt_to_add_rspec_terms_to_coderay_keywords - @@converter = CoderayConverter - # rubocop:disable Lint/HandleExceptions - rescue LoadError - # it'll fall back to the NullConverter assigned above - # rubocop:enable Lint/HandleExceptions - end - - # rubocop:enable Style/ClassVars - - # @api private - # - # Extract lines of code corresponding to a backtrace. - # - # @param backtrace [String] the backtrace from a test failure - # @return [String] highlighted code snippet indicating where the test - # failure occurred - # - # @see #post_process - def snippet(backtrace) - raw_code, line = snippet_for(backtrace[0]) - highlighted = @@converter.convert(raw_code) - post_process(highlighted, line) - end - # rubocop:enable Style/ClassVars - - # @api private - # - # Create a snippet from a line of code. - # - # @param error_line [String] file name with line number (i.e. - # 'foo_spec.rb:12') - # @return [String] lines around the target line within the file - # - # @see #lines_around - def snippet_for(error_line) - if error_line =~ /(.*):(\d+)/ - file = Regexp.last_match[1] - line = Regexp.last_match[2].to_i - [lines_around(file, line), line] - else - ["# Couldn't get snippet for #{error_line}", 1] - end - end - - # @api private - # - # Extract lines of code centered around a particular line within a - # source file. - # - # @param file [String] filename - # @param line [Fixnum] line number - # @return [String] lines around the target line within the file (2 above - # and 1 below). - def lines_around(file, line) - if File.file?(file) - lines = File.read(file).split("\n") - min = [0, line - 3].max - max = [line + 1, lines.length - 1].min - selected_lines = [] - selected_lines.join("\n") - lines[min..max].join("\n") - else - "# Couldn't get snippet for #{file}" - end - rescue SecurityError - # :nocov: - SecurityError is no longer produced starting in ruby 2.7 - "# Couldn't get snippet for #{file}" - # :nocov: - end - - # @api private - # - # Adds line numbers to all lines and highlights the line where the - # failure occurred using html `span` tags. - # - # @param highlighted [String] syntax-highlighted snippet surrounding the - # offending line of code - # @param offending_line [Fixnum] line where failure occurred - # @return [String] completed snippet - def post_process(highlighted, offending_line) - new_lines = [] - highlighted.split("\n").each_with_index do |line, i| - new_line = "#{offending_line + i - 2}#{line}" - new_line = "#{new_line}" if i == 2 - new_lines << new_line - end - new_lines.join("\n") - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/json_formatter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/json_formatter.rb deleted file mode 100644 index 7c6fde8..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/json_formatter.rb +++ /dev/null @@ -1,103 +0,0 @@ -RSpec::Support.require_rspec_core "formatters/base_formatter" -require 'json' - -module RSpec - module Core - module Formatters - # @private - class JsonFormatter < BaseFormatter - Formatters.register self, :message, :dump_summary, :dump_profile, :stop, :seed, :close - - attr_reader :output_hash - - def initialize(output) - super - @output_hash = { - :version => RSpec::Core::Version::STRING - } - end - - def message(notification) - (@output_hash[:messages] ||= []) << notification.message - end - - def dump_summary(summary) - @output_hash[:summary] = { - :duration => summary.duration, - :example_count => summary.example_count, - :failure_count => summary.failure_count, - :pending_count => summary.pending_count, - :errors_outside_of_examples_count => summary.errors_outside_of_examples_count - } - @output_hash[:summary_line] = summary.totals_line - end - - def stop(group_notification) - @output_hash[:examples] = group_notification.notifications.map do |notification| - format_example(notification.example).tap do |hash| - e = notification.example.exception - - if e - hash[:exception] = { - :class => e.class.name, - :message => e.message, - :backtrace => notification.formatted_backtrace, - } - end - end - end - end - - def seed(notification) - return unless notification.seed_used? - @output_hash[:seed] = notification.seed - end - - def close(_notification) - output.write @output_hash.to_json - end - - def dump_profile(profile) - @output_hash[:profile] = {} - dump_profile_slowest_examples(profile) - dump_profile_slowest_example_groups(profile) - end - - # @api private - def dump_profile_slowest_examples(profile) - @output_hash[:profile] = {} - @output_hash[:profile][:examples] = profile.slowest_examples.map do |example| - format_example(example).tap do |hash| - hash[:run_time] = example.execution_result.run_time - end - end - @output_hash[:profile][:slowest] = profile.slow_duration - @output_hash[:profile][:total] = profile.duration - end - - # @api private - def dump_profile_slowest_example_groups(profile) - @output_hash[:profile] ||= {} - @output_hash[:profile][:groups] = profile.slowest_groups.map do |loc, hash| - hash.update(:location => loc) - end - end - - private - - def format_example(example) - { - :id => example.id, - :description => example.description, - :full_description => example.full_description, - :status => example.execution_result.status.to_s, - :file_path => example.metadata[:file_path], - :line_number => example.metadata[:line_number], - :run_time => example.execution_result.run_time, - :pending_message => example.execution_result.pending_message, - } - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/profile_formatter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/profile_formatter.rb deleted file mode 100644 index 4b95d93..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/profile_formatter.rb +++ /dev/null @@ -1,68 +0,0 @@ -RSpec::Support.require_rspec_core "formatters/console_codes" - -module RSpec - module Core - module Formatters - # @api private - # Formatter for providing profile output. - class ProfileFormatter - Formatters.register self, :dump_profile - - def initialize(output) - @output = output - end - - # @private - attr_reader :output - - # @api public - # - # This method is invoked after the dumping the summary if profiling is - # enabled. - # - # @param profile [ProfileNotification] containing duration, - # slowest_examples and slowest_example_groups - def dump_profile(profile) - dump_profile_slowest_examples(profile) - dump_profile_slowest_example_groups(profile) - end - - private - - def dump_profile_slowest_examples(profile) - @output.puts "\nTop #{profile.slowest_examples.size} slowest " \ - "examples (#{Helpers.format_seconds(profile.slow_duration)} " \ - "seconds, #{profile.percentage}% of total time):\n" - - profile.slowest_examples.each do |example| - @output.puts " #{example.full_description}" - @output.puts " #{bold(Helpers.format_seconds(example.execution_result.run_time))} " \ - "#{bold("seconds")} #{format_caller(example.location)}" - end - end - - def dump_profile_slowest_example_groups(profile) - return if profile.slowest_groups.empty? - - @output.puts "\nTop #{profile.slowest_groups.size} slowest example groups:" - profile.slowest_groups.each do |loc, hash| - average = "#{bold(Helpers.format_seconds(hash[:average]))} #{bold("seconds")} average" - total = "#{Helpers.format_seconds(hash[:total_time])} seconds" - count = Helpers.pluralize(hash[:count], "example") - @output.puts " #{hash[:description]}" - @output.puts " #{average} (#{total} / #{count}) #{loc}" - end - end - - def format_caller(caller_info) - RSpec.configuration.backtrace_formatter.backtrace_line( - caller_info.to_s.split(':in `block').first) - end - - def bold(text) - ConsoleCodes.wrap(text, :bold) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/progress_formatter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/progress_formatter.rb deleted file mode 100644 index 81e0beb..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/progress_formatter.rb +++ /dev/null @@ -1,29 +0,0 @@ -RSpec::Support.require_rspec_core "formatters/base_text_formatter" -RSpec::Support.require_rspec_core "formatters/console_codes" - -module RSpec - module Core - module Formatters - # @private - class ProgressFormatter < BaseTextFormatter - Formatters.register self, :example_passed, :example_pending, :example_failed, :start_dump - - def example_passed(_notification) - output.print ConsoleCodes.wrap('.', :success) - end - - def example_pending(_notification) - output.print ConsoleCodes.wrap('*', :pending) - end - - def example_failed(_notification) - output.print ConsoleCodes.wrap('F', :failure) - end - - def start_dump(_notification) - output.puts - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/protocol.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/protocol.rb deleted file mode 100644 index 12fc71f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/protocol.rb +++ /dev/null @@ -1,182 +0,0 @@ -module RSpec - module Core - module Formatters - # This class isn't loaded at runtime but serves to document all of the - # notifications implemented as part of the standard interface. The - # reporter will issue these during a normal test suite run, but a - # formatter will only receive those notifications it has registered - # itself to receive. To register a formatter call: - # - # `::RSpec::Core::Formatters.register class, :list, :of, :notifications` - # - # e.g. - # - # `::RSpec::Core::Formatters.register self, :start, :example_started` - # - # @see RSpec::Core::Formatters::BaseFormatter - # @see RSpec::Core::Formatters::BaseTextFormatter - # @see RSpec::Core::Reporter - class Protocol - # @method initialize(output) - # @api public - # - # @param output [IO] the formatter output - - # @method start(notification) - # @api public - # @group Suite Notifications - # - # This method is invoked before any examples are run, right after - # they have all been collected. This can be useful for special - # formatters that need to provide progress on feedback (graphical ones). - # - # This will only be invoked once, and the next one to be invoked - # is {#example_group_started}. - # - # @param notification [Notifications::StartNotification] - - # @method example_group_started(notification) - # @api public - # @group Group Notifications - # - # This method is invoked at the beginning of the execution of each - # example group. - # - # The next method to be invoked after this is {#example_passed}, - # {#example_pending}, or {#example_group_finished}. - # - # @param notification [Notifications::GroupNotification] containing example_group - # subclass of {ExampleGroup} - - # @method example_group_finished(notification) - # @api public - # @group Group Notifications - # - # Invoked at the end of the execution of each example group. - # - # @param notification [Notifications::GroupNotification] containing example_group - # subclass of {ExampleGroup} - - # @method example_started(notification) - # @api public - # @group Example Notifications - # - # Invoked at the beginning of the execution of each example. - # - # @param notification [Notifications::ExampleNotification] containing example subclass - # of {Example} - - # @method example_finished(notification) - # @api public - # @group Example Notifications - # - # Invoked at the end of the execution of each example. - # - # @param notification [Notifications::ExampleNotification] containing example subclass - # of {Example} - - # @method example_passed(notification) - # @api public - # @group Example Notifications - # - # Invoked when an example passes. - # - # @param notification [Notifications::ExampleNotification] containing example subclass - # of {Example} - - # @method example_pending(notification) - # @api public - # @group Example Notifications - # - # Invoked when an example is pending. - # - # @param notification [Notifications::ExampleNotification] containing example subclass - # of {Example} - - # @method example_failed(notification) - # @api public - # @group Example Notifications - # - # Invoked when an example fails. - # - # @param notification [Notifications::ExampleNotification] containing example subclass - # of {Example} - - # @method message(notification) - # @api public - # @group Suite Notifications - # - # Used by the reporter to send messages to the output stream. - # - # @param notification [Notifications::MessageNotification] containing message - - # @method stop(notification) - # @api public - # @group Suite Notifications - # - # Invoked after all examples have executed, before dumping post-run - # reports. - # - # @param notification [Notifications::NullNotification] - - # @method start_dump(notification) - # @api public - # @group Suite Notifications - # - # This method is invoked after all of the examples have executed. The - # next method to be invoked after this one is {#dump_failures} - # (BaseTextFormatter then calls {#dump_failures} once for each failed - # example). - # - # @param notification [Notifications::NullNotification] - - # @method dump_failures(notification) - # @api public - # @group Suite Notifications - # - # Dumps detailed information about each example failure. - # - # @param notification [Notifications::NullNotification] - - # @method dump_summary(summary) - # @api public - # @group Suite Notifications - # - # This method is invoked after the dumping of examples and failures. - # Each parameter is assigned to a corresponding attribute. - # - # @param summary [Notifications::SummaryNotification] containing duration, - # example_count, failure_count and pending_count - - # @method dump_profile(profile) - # @api public - # @group Suite Notifications - # - # This method is invoked after the dumping the summary if profiling is - # enabled. - # - # @param profile [Notifications::ProfileNotification] containing duration, - # slowest_examples and slowest_example_groups - - # @method dump_pending(notification) - # @api public - # @group Suite Notifications - # - # Outputs a report of pending examples. This gets invoked - # after the summary if option is set to do so. - # - # @param notification [Notifications::NullNotification] - - # @method close(notification) - # @api public - # @group Suite Notifications - # - # Invoked at the end of a suite run. Allows the formatter to do any - # tidying up, but be aware that formatter output streams may be used - # elsewhere so don't actually close them. - # - # @param notification [Notifications::NullNotification] - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/snippet_extractor.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/snippet_extractor.rb deleted file mode 100644 index c585db4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/snippet_extractor.rb +++ /dev/null @@ -1,134 +0,0 @@ -module RSpec - module Core - module Formatters - # @private - class SnippetExtractor - NoSuchFileError = Class.new(StandardError) - NoSuchLineError = Class.new(StandardError) - - def self.extract_line_at(file_path, line_number) - source = source_from_file(file_path) - line = source.lines[line_number - 1] - raise NoSuchLineError unless line - line - end - - def self.source_from_file(path) - raise NoSuchFileError unless File.exist?(path) - RSpec.world.source_from_file(path) - end - - if RSpec::Support::RubyFeatures.ripper_supported? - NoExpressionAtLineError = Class.new(StandardError) - - attr_reader :source, :beginning_line_number, :max_line_count - - def self.extract_expression_lines_at(file_path, beginning_line_number, max_line_count=nil) - if max_line_count == 1 - [extract_line_at(file_path, beginning_line_number)] - else - source = source_from_file(file_path) - new(source, beginning_line_number, max_line_count).expression_lines - end - end - - def initialize(source, beginning_line_number, max_line_count=nil) - @source = source - @beginning_line_number = beginning_line_number - @max_line_count = max_line_count - end - - def expression_lines - line_range = line_range_of_expression - - if max_line_count && line_range.count > max_line_count - line_range = (line_range.begin)..(line_range.begin + max_line_count - 1) - end - - source.lines[(line_range.begin - 1)..(line_range.end - 1)] - rescue SyntaxError, NoExpressionAtLineError - [self.class.extract_line_at(source.path, beginning_line_number)] - end - - private - - def line_range_of_expression - @line_range_of_expression ||= begin - line_range = line_range_of_location_nodes_in_expression - initial_unclosed_tokens = unclosed_tokens_in_line_range(line_range) - unclosed_tokens = initial_unclosed_tokens - - until (initial_unclosed_tokens & unclosed_tokens).empty? - line_range = (line_range.begin)..(line_range.end + 1) - unclosed_tokens = unclosed_tokens_in_line_range(line_range) - end - - line_range - end - end - - def unclosed_tokens_in_line_range(line_range) - tokens = FlatMap.flat_map(line_range) do |line_number| - source.tokens_by_line_number[line_number] - end - - tokens.each_with_object([]) do |token, unclosed_tokens| - if token.opening? - unclosed_tokens << token - else - index = unclosed_tokens.rindex do |unclosed_token| - unclosed_token.closed_by?(token) - end - unclosed_tokens.delete_at(index) if index - end - end - end - - def line_range_of_location_nodes_in_expression - line_numbers = expression_node.each_with_object(Set.new) do |node, set| - set << node.location.line if node.location - end - - line_numbers.min..line_numbers.max - end - - def expression_node - raise NoExpressionAtLineError if location_nodes_at_beginning_line.empty? - - @expression_node ||= begin - common_ancestor_nodes = location_nodes_at_beginning_line.map do |node| - node.each_ancestor.to_a - end.reduce(:&) - - common_ancestor_nodes.find { |node| expression_outmost_node?(node) } - end - end - - def expression_outmost_node?(node) - return true unless node.parent - return false if node.type.to_s.start_with?('@') - ![node, node.parent].all? do |n| - # See `Ripper::PARSER_EVENTS` for the complete list of sexp types. - type = n.type.to_s - type.end_with?('call') || type.start_with?('method_add_') - end - end - - def location_nodes_at_beginning_line - source.nodes_by_line_number[beginning_line_number] - end - else - # :nocov: - def self.extract_expression_lines_at(file_path, beginning_line_number, *) - [extract_line_at(file_path, beginning_line_number)] - end - # :nocov: - end - - def self.least_indentation_from(lines) - lines.map { |line| line[/^[ \t]*/] }.min - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/syntax_highlighter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/syntax_highlighter.rb deleted file mode 100644 index e7766f6..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/formatters/syntax_highlighter.rb +++ /dev/null @@ -1,91 +0,0 @@ -module RSpec - module Core - module Formatters - # @private - # Provides terminal syntax highlighting of code snippets - # when coderay is available. - class SyntaxHighlighter - def initialize(configuration) - @configuration = configuration - end - - def highlight(lines) - implementation.highlight_syntax(lines) - end - - # rubocop:disable Lint/RescueException - # rubocop:disable Lint/HandleExceptions - def self.attempt_to_add_rspec_terms_to_coderay_keywords - CodeRay::Scanners::Ruby::Patterns::IDENT_KIND.add(%w[ - describe context - it specify - before after around - let subject - expect allow - ], :keyword) - rescue Exception - # Mutating CodeRay's contants like this is not a public API - # and might not always work. If we cannot add our keywords - # to CodeRay it is not a big deal and not worth raising an - # error over, so we ignore it. - end - # rubocop:enable Lint/HandleExceptions - # rubocop:enable Lint/RescueException - - private - - if RSpec::Support::OS.windows? - # :nocov: - def implementation - WindowsImplementation - end - # :nocov: - else - def implementation - return color_enabled_implementation if @configuration.color_enabled? - NoSyntaxHighlightingImplementation - end - end - - def color_enabled_implementation - @color_enabled_implementation ||= begin - require 'coderay' - self.class.attempt_to_add_rspec_terms_to_coderay_keywords - CodeRayImplementation - rescue LoadError - NoSyntaxHighlightingImplementation - end - end - - # @private - module CodeRayImplementation - RESET_CODE = "\e[0m" - - def self.highlight_syntax(lines) - highlighted = begin - CodeRay.encode(lines.join("\n"), :ruby, :terminal) - rescue Support::AllExceptionsExceptOnesWeMustNotRescue - return lines - end - - highlighted.split("\n").map do |line| - line.sub(/\S/) { |char| char.insert(0, RESET_CODE) } - end - end - end - - # @private - module NoSyntaxHighlightingImplementation - def self.highlight_syntax(lines) - lines - end - end - - # @private - # Not sure why, but our code above (and/or coderay itself) does not work - # on Windows, so we disable the feature on Windows. - WindowsImplementation = NoSyntaxHighlightingImplementation - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/hooks.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/hooks.rb deleted file mode 100644 index 2935a73..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/hooks.rb +++ /dev/null @@ -1,646 +0,0 @@ -module RSpec - module Core - # Provides `before`, `after` and `around` hooks as a means of - # supporting common setup and teardown. This module is extended - # onto {ExampleGroup}, making the methods available from any `describe` - # or `context` block and included in {Configuration}, making them - # available off of the configuration object to define global setup - # or teardown logic. - module Hooks - # @api public - # - # @overload before(&block) - # @overload before(scope, &block) - # @param scope [Symbol] `:example`, `:context`, or `:suite` - # (defaults to `:example`) - # @overload before(scope, *conditions, &block) - # @param scope [Symbol] `:example`, `:context`, or `:suite` - # (defaults to `:example`) - # @param conditions [Array, Hash] constrains this hook to - # examples matching these conditions e.g. - # `before(:example, :ui => true) { ... }` will only run with examples - # or groups declared with `:ui => true`. Symbols will be transformed - # into hash entries with `true` values. - # @overload before(conditions, &block) - # @param conditions [Hash] - # constrains this hook to examples matching these conditions e.g. - # `before(:example, :ui => true) { ... }` will only run with examples - # or groups declared with `:ui => true`. - # - # @see #after - # @see #around - # @see ExampleGroup - # @see SharedContext - # @see SharedExampleGroup - # @see Configuration - # - # Declare a block of code to be run before each example (using `:example`) - # or once before any example (using `:context`). These are usually - # declared directly in the {ExampleGroup} to which they apply, but they - # can also be shared across multiple groups. - # - # You can also use `before(:suite)` to run a block of code before any - # example groups are run. This should be declared in {RSpec.configure}. - # - # Instance variables declared in `before(:example)` or `before(:context)` - # are accessible within each example. - # - # ### Order - # - # `before` hooks are stored in three scopes, which are run in order: - # `:suite`, `:context`, and `:example`. They can also be declared in - # several different places: `RSpec.configure`, a parent group, the current - # group. They are run in the following order: - # - # before(:suite) # Declared in RSpec.configure. - # before(:context) # Declared in RSpec.configure. - # before(:context) # Declared in a parent group. - # before(:context) # Declared in the current group. - # before(:example) # Declared in RSpec.configure. - # before(:example) # Declared in a parent group. - # before(:example) # Declared in the current group. - # - # If more than one `before` is declared within any one example group, they - # are run in the order in which they are declared. Any `around` hooks will - # execute after `before` context hooks but before any `before` example - # hook regardless of where they are declared. - # - # ### Conditions - # - # When you add a conditions hash to `before(:example)` or - # `before(:context)`, RSpec will only apply that hook to groups or - # examples that match the conditions. e.g. - # - # RSpec.configure do |config| - # config.before(:example, :authorized => true) do - # log_in_as :authorized_user - # end - # end - # - # RSpec.describe Something, :authorized => true do - # # The before hook will run in before each example in this group. - # end - # - # RSpec.describe SomethingElse do - # it "does something", :authorized => true do - # # The before hook will run before this example. - # end - # - # it "does something else" do - # # The hook will not run before this example. - # end - # end - # - # Note that filtered config `:context` hooks can still be applied - # to individual examples that have matching metadata. Just like - # Ruby's object model is that every object has a singleton class - # which has only a single instance, RSpec's model is that every - # example has a singleton example group containing just the one - # example. - # - # ### Warning: `before(:suite, :with => :conditions)` - # - # The conditions hash is used to match against specific examples. Since - # `before(:suite)` is not run in relation to any specific example or - # group, conditions passed along with `:suite` are effectively ignored. - # - # ### Exceptions - # - # When an exception is raised in a `before` block, RSpec skips any - # subsequent `before` blocks and the example, but runs all of the - # `after(:example)` and `after(:context)` hooks. - # - # ### Warning: implicit before blocks - # - # `before` hooks can also be declared in shared contexts which get - # included implicitly either by you or by extension libraries. Since - # RSpec runs these in the order in which they are declared within each - # scope, load order matters, and can lead to confusing results when one - # before block depends on state that is prepared in another before block - # that gets run later. - # - # ### Warning: `before(:context)` - # - # It is very tempting to use `before(:context)` to speed things up, but we - # recommend that you avoid this as there are a number of gotchas, as well - # as things that simply don't work. - # - # #### Context - # - # `before(:context)` is run in an example that is generated to provide - # group context for the block. - # - # #### Instance variables - # - # Instance variables declared in `before(:context)` are shared across all - # the examples in the group. This means that each example can change the - # state of a shared object, resulting in an ordering dependency that can - # make it difficult to reason about failures. - # - # #### Unsupported RSpec constructs - # - # RSpec has several constructs that reset state between each example - # automatically. These are not intended for use from within - # `before(:context)`: - # - # * `let` declarations - # * `subject` declarations - # * Any mocking, stubbing or test double declaration - # - # ### other frameworks - # - # Mock object frameworks and database transaction managers (like - # ActiveRecord) are typically designed around the idea of setting up - # before an example, running that one example, and then tearing down. This - # means that mocks and stubs can (sometimes) be declared in - # `before(:context)`, but get torn down before the first real example is - # ever run. - # - # You _can_ create database-backed model objects in a `before(:context)` - # in rspec-rails, but it will not be wrapped in a transaction for you, so - # you are on your own to clean up in an `after(:context)` block. - # - # @example before(:example) declared in an {ExampleGroup} - # - # RSpec.describe Thing do - # before(:example) do - # @thing = Thing.new - # end - # - # it "does something" do - # # Here you can access @thing. - # end - # end - # - # @example before(:context) declared in an {ExampleGroup} - # - # RSpec.describe Parser do - # before(:context) do - # File.open(file_to_parse, 'w') do |f| - # f.write <<-CONTENT - # stuff in the file - # CONTENT - # end - # end - # - # it "parses the file" do - # Parser.parse(file_to_parse) - # end - # - # after(:context) do - # File.delete(file_to_parse) - # end - # end - # - # @note The `:example` and `:context` scopes are also available as - # `:each` and `:all`, respectively. Use whichever you prefer. - # @note The `:suite` scope is only supported for hooks registered on - # `RSpec.configuration` since they exist independently of any - # example or example group. - def before(*args, &block) - hooks.register :append, :before, *args, &block - end - - alias_method :append_before, :before - - # Adds `block` to the front of the list of `before` blocks in the same - # scope (`:example`, `:context`, or `:suite`). - # - # See {#before} for scoping semantics. - def prepend_before(*args, &block) - hooks.register :prepend, :before, *args, &block - end - - # @api public - # @overload after(&block) - # @overload after(scope, &block) - # @param scope [Symbol] `:example`, `:context`, or `:suite` (defaults to - # `:example`) - # @overload after(scope, *conditions, &block) - # @param scope [Symbol] `:example`, `:context`, or `:suite` (defaults to - # `:example`) - # @param conditions [Array, Hash] constrains this hook to - # examples matching these conditions e.g. - # `after(:example, :ui => true) { ... }` will only run with examples - # or groups declared with `:ui => true`. Symbols will be transformed - # into hash entries with `true` values. - # @overload after(conditions, &block) - # @param conditions [Hash] - # constrains this hook to examples matching these conditions e.g. - # `after(:example, :ui => true) { ... }` will only run with examples - # or groups declared with `:ui => true`. - # - # @see #before - # @see #around - # @see ExampleGroup - # @see SharedContext - # @see SharedExampleGroup - # @see Configuration - # - # Declare a block of code to be run after each example (using `:example`) - # or once after all examples n the context (using `:context`). See - # {#before} for more information about ordering. - # - # ### Exceptions - # - # `after` hooks are guaranteed to run even when there are exceptions in - # `before` hooks or examples. When an exception is raised in an after - # block, the exception is captured for later reporting, and subsequent - # `after` blocks are run. - # - # ### Order - # - # `after` hooks are stored in three scopes, which are run in order: - # `:example`, `:context`, and `:suite`. They can also be declared in - # several different places: `RSpec.configure`, a parent group, the current - # group. They are run in the following order: - # - # after(:example) # Declared in the current group. - # after(:example) # Declared in a parent group. - # after(:example) # Declared in RSpec.configure. - # after(:context) # Declared in the current group. - # after(:context) # Declared in a parent group. - # after(:context) # Declared in RSpec.configure. - # after(:suite) # Declared in RSpec.configure. - # - # This is the reverse of the order in which `before` hooks are run. - # Similarly, if more than one `after` is declared within any example - # group, they are run in reverse order of that in which they are declared. - # Also `around` hooks will run after any `after` example hooks are - # invoked but before any `after` context hooks. - # - # @note The `:example` and `:context` scopes are also available as - # `:each` and `:all`, respectively. Use whichever you prefer. - # @note The `:suite` scope is only supported for hooks registered on - # `RSpec.configuration` since they exist independently of any - # example or example group. - def after(*args, &block) - hooks.register :prepend, :after, *args, &block - end - - alias_method :prepend_after, :after - - # Adds `block` to the back of the list of `after` blocks in the same - # scope (`:example`, `:context`, or `:suite`). - # - # See {#after} for scoping semantics. - def append_after(*args, &block) - hooks.register :append, :after, *args, &block - end - - # @api public - # @overload around(&block) - # @overload around(scope, &block) - # @param scope [Symbol] `:example` (defaults to `:example`) - # present for syntax parity with `before` and `after`, but - # `:example`/`:each` is the only supported value. - # @overload around(scope, *conditions, &block) - # @param scope [Symbol] `:example` (defaults to `:example`) - # present for syntax parity with `before` and `after`, but - # `:example`/`:each` is the only supported value. - # @param conditions [Array, Hash] constrains this hook to - # examples matching these conditions e.g. - # `around(:example, :ui => true) { ... }` will only run with examples - # or groups declared with `:ui => true`. Symbols will be transformed - # into hash entries with `true` values. - # @overload around(conditions, &block) - # @param conditions [Hash] constrains this hook to examples matching - # these conditions e.g. `around(:example, :ui => true) { ... }` will - # only run with examples or groups declared with `:ui => true`. - # - # @yield [Example] the example to run - # - # @note the syntax of `around` is similar to that of `before` and `after` - # but the semantics are quite different. `before` and `after` hooks are - # run in the context of the examples with which they are associated, - # whereas `around` hooks are actually responsible for running the - # examples. Consequently, `around` hooks do not have direct access to - # resources that are made available within the examples and their - # associated `before` and `after` hooks. - # - # @note `:example`/`:each` is the only supported scope. - # - # Declare a block of code, parts of which will be run before and parts - # after the example. It is your responsibility to run the example: - # - # around(:example) do |ex| - # # Do some stuff before. - # ex.run - # # Do some stuff after. - # end - # - # The yielded example aliases `run` with `call`, which lets you treat it - # like a `Proc`. This is especially handy when working with libraries - # that manage their own setup and teardown using a block or proc syntax, - # e.g. - # - # around(:example) {|ex| Database.transaction(&ex)} - # around(:example) {|ex| FakeFS(&ex)} - # - # ### Order - # - # The `around` hooks execute surrounding an example and its hooks. - # - # This means after any `before` context hooks, but before any `before` - # example hooks, and similarly after any `after` example hooks but before - # any `after` context hooks. - # - # They are not a synonym for `before`/`after`. - def around(*args, &block) - hooks.register :prepend, :around, *args, &block - end - - # @private - # Holds the various registered hooks. - def hooks - @hooks ||= HookCollections.new(self, FilterableItemRepository::UpdateOptimized) - end - - # @private - Hook = Struct.new(:block, :options) - - # @private - class BeforeHook < Hook - def run(example) - example.instance_exec(example, &block) - end - end - - # @private - class AfterHook < Hook - def run(example) - example.instance_exec(example, &block) - rescue Support::AllExceptionsExceptOnesWeMustNotRescue => ex - example.set_exception(ex) - end - end - - # @private - class AfterContextHook < Hook - def run(example) - example.instance_exec(example, &block) - rescue Support::AllExceptionsExceptOnesWeMustNotRescue => e - RSpec.configuration.reporter.notify_non_example_exception(e, "An error occurred in an `after(:context)` hook.") - end - end - - # @private - class AroundHook < Hook - def execute_with(example, procsy) - example.instance_exec(procsy, &block) - return if procsy.executed? - Pending.mark_skipped!(example, - "#{hook_description} did not execute the example") - end - - if Proc.method_defined?(:source_location) - def hook_description - "around hook at #{Metadata.relative_path(block.source_location.join(':'))}" - end - else # for 1.8.7 - # :nocov: - def hook_description - "around hook" - end - # :nocov: - end - end - - # @private - # - # This provides the primary API used by other parts of rspec-core. By hiding all - # implementation details behind this facade, it's allowed us to heavily optimize - # this, so that, for example, hook collection objects are only instantiated when - # a hook is added. This allows us to avoid many object allocations for the common - # case of a group having no hooks. - # - # This is only possible because this interface provides a "tell, don't ask"-style - # API, so that callers _tell_ this class what to do with the hooks, rather than - # asking this class for a list of hooks, and then doing something with them. - class HookCollections - def initialize(owner, filterable_item_repo_class) - @owner = owner - @filterable_item_repo_class = filterable_item_repo_class - @before_example_hooks = nil - @after_example_hooks = nil - @before_context_hooks = nil - @after_context_hooks = nil - @around_example_hooks = nil - end - - def register_globals(host, globals) - parent_groups = host.parent_groups - - process(host, parent_groups, globals, :before, :example, &:options) - process(host, parent_groups, globals, :after, :example, &:options) - process(host, parent_groups, globals, :around, :example, &:options) - - process(host, parent_groups, globals, :before, :context, &:options) - process(host, parent_groups, globals, :after, :context, &:options) - end - - def register_global_singleton_context_hooks(example, globals) - parent_groups = example.example_group.parent_groups - - process(example, parent_groups, globals, :before, :context) { {} } - process(example, parent_groups, globals, :after, :context) { {} } - end - - def register(prepend_or_append, position, *args, &block) - scope, options = scope_and_options_from(*args) - - if scope == :suite - # TODO: consider making this an error in RSpec 4. For SemVer reasons, - # we are only warning in RSpec 3. - RSpec.warn_with "WARNING: `#{position}(:suite)` hooks are only supported on " \ - "the RSpec configuration object. This " \ - "`#{position}(:suite)` hook, registered on an example " \ - "group, will be ignored." - return - elsif scope == :context && position == :around - # TODO: consider making this an error in RSpec 4. For SemVer reasons, - # we are only warning in RSpec 3. - RSpec.warn_with "WARNING: `around(:context)` hooks are not supported and " \ - "behave like `around(:example)`." - end - - hook = HOOK_TYPES[position][scope].new(block, options) - ensure_hooks_initialized_for(position, scope).__send__(prepend_or_append, hook, options) - end - - # @private - # - # Runs all of the blocks stored with the hook in the context of the - # example. If no example is provided, just calls the hook directly. - def run(position, scope, example_or_group) - return if RSpec.configuration.dry_run? - - if scope == :context - unless example_or_group.class.metadata[:skip] - run_owned_hooks_for(position, :context, example_or_group) - end - else - case position - when :before then run_example_hooks_for(example_or_group, :before, :reverse_each) - when :after then run_example_hooks_for(example_or_group, :after, :each) - when :around then run_around_example_hooks_for(example_or_group) { yield } - end - end - end - - SCOPES = [:example, :context] - - SCOPE_ALIASES = { :each => :example, :all => :context } - - HOOK_TYPES = { - :before => Hash.new { BeforeHook }, - :after => Hash.new { AfterHook }, - :around => Hash.new { AroundHook } - } - - HOOK_TYPES[:after][:context] = AfterContextHook - - protected - - EMPTY_HOOK_ARRAY = [].freeze - - def matching_hooks_for(position, scope, example_or_group) - repository = hooks_for(position, scope) { return EMPTY_HOOK_ARRAY } - - # It would be nice to not have to switch on type here, but - # we don't want to define `ExampleGroup#metadata` because then - # `metadata` from within an individual example would return the - # group's metadata but the user would probably expect it to be - # the example's metadata. - metadata = case example_or_group - when ExampleGroup then example_or_group.class.metadata - else example_or_group.metadata - end - - repository.items_for(metadata) - end - - def all_hooks_for(position, scope) - hooks_for(position, scope) { return EMPTY_HOOK_ARRAY }.items_and_filters.map(&:first) - end - - def run_owned_hooks_for(position, scope, example_or_group) - matching_hooks_for(position, scope, example_or_group).each do |hook| - hook.run(example_or_group) - end - end - - def processable_hooks_for(position, scope, host) - if scope == :example - all_hooks_for(position, scope) - else - matching_hooks_for(position, scope, host) - end - end - - private - - def hooks_for(position, scope) - if position == :before - scope == :example ? @before_example_hooks : @before_context_hooks - elsif position == :after - scope == :example ? @after_example_hooks : @after_context_hooks - else # around - @around_example_hooks - end || yield - end - - def ensure_hooks_initialized_for(position, scope) - if position == :before - if scope == :example - @before_example_hooks ||= @filterable_item_repo_class.new(:all?) - else - @before_context_hooks ||= @filterable_item_repo_class.new(:all?) - end - elsif position == :after - if scope == :example - @after_example_hooks ||= @filterable_item_repo_class.new(:all?) - else - @after_context_hooks ||= @filterable_item_repo_class.new(:all?) - end - else # around - @around_example_hooks ||= @filterable_item_repo_class.new(:all?) - end - end - - def process(host, parent_groups, globals, position, scope) - hooks_to_process = globals.processable_hooks_for(position, scope, host) - return if hooks_to_process.empty? - - hooks_to_process -= FlatMap.flat_map(parent_groups) do |group| - group.hooks.all_hooks_for(position, scope) - end - return if hooks_to_process.empty? - - repository = ensure_hooks_initialized_for(position, scope) - hooks_to_process.each { |hook| repository.append hook, (yield hook) } - end - - def scope_and_options_from(*args) - return :suite if args.first == :suite - scope = extract_scope_from(args) - meta = Metadata.build_hash_from(args, :warn_about_example_group_filtering) - return scope, meta - end - - def extract_scope_from(args) - if known_scope?(args.first) - normalized_scope_for(args.shift) - elsif args.any? { |a| a.is_a?(Symbol) } - error_message = "You must explicitly give a scope " \ - "(#{SCOPES.join(", ")}) or scope alias " \ - "(#{SCOPE_ALIASES.keys.join(", ")}) when using symbols as " \ - "metadata for a hook." - raise ArgumentError.new error_message - else - :example - end - end - - def known_scope?(scope) - SCOPES.include?(scope) || SCOPE_ALIASES.keys.include?(scope) - end - - def normalized_scope_for(scope) - SCOPE_ALIASES[scope] || scope - end - - def run_example_hooks_for(example, position, each_method) - owner_parent_groups.__send__(each_method) do |group| - group.hooks.run_owned_hooks_for(position, :example, example) - end - end - - def run_around_example_hooks_for(example) - hooks = FlatMap.flat_map(owner_parent_groups) do |group| - group.hooks.matching_hooks_for(:around, :example, example) - end - - return yield if hooks.empty? # exit early to avoid the extra allocation cost of `Example::Procsy` - - initial_procsy = Example::Procsy.new(example) { yield } - hooks.inject(initial_procsy) do |procsy, around_hook| - procsy.wrap { around_hook.execute_with(example, procsy) } - end.call - end - - if respond_to?(:singleton_class) && singleton_class.ancestors.include?(singleton_class) - def owner_parent_groups - @owner.parent_groups - end - else # Ruby < 2.1 (see https://bugs.ruby-lang.org/issues/8035) - # :nocov: - def owner_parent_groups - @owner_parent_groups ||= [@owner] + @owner.parent_groups - end - # :nocov: - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/invocations.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/invocations.rb deleted file mode 100644 index 4719085..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/invocations.rb +++ /dev/null @@ -1,87 +0,0 @@ -module RSpec - module Core - # @private - module Invocations - # @private - class InitializeProject - def call(*_args) - RSpec::Support.require_rspec_core "project_initializer" - ProjectInitializer.new.run - 0 - end - end - - # @private - class DRbWithFallback - def call(options, err, out) - require 'rspec/core/drb' - begin - return DRbRunner.new(options).run(err, out) - rescue DRb::DRbConnError - err.puts "No DRb server is running. Running in local process instead ..." - end - RSpec::Core::Runner.new(options).run(err, out) - end - end - - # @private - class Bisect - def call(options, err, out) - RSpec::Support.require_rspec_core "bisect/coordinator" - runner = Runner.new(options).tap { |r| r.configure(err, out) } - formatter = bisect_formatter_klass_for(options.options[:bisect]).new( - out, runner.configuration.bisect_runner - ) - - success = RSpec::Core::Bisect::Coordinator.bisect_with( - runner, options.args, formatter - ) - - runner.exit_code(success) - end - - private - - def bisect_formatter_klass_for(argument) - return Formatters::BisectDebugFormatter if argument == "verbose" - Formatters::BisectProgressFormatter - end - end - - # @private - class PrintVersion - def call(_options, _err, out) - overall_version = RSpec::Core::Version::STRING - unless overall_version =~ /[a-zA-Z]+/ - overall_version = overall_version.split('.').first(2).join('.') - end - - out.puts "RSpec #{overall_version}" - - [:Core, :Expectations, :Mocks, :Rails, :Support].each do |const_name| - lib_name = const_name.to_s.downcase - begin - require "rspec/#{lib_name}/version" - rescue LoadError - # Not worth mentioning libs that are not installed - nil - else - out.puts " - rspec-#{lib_name} #{RSpec.const_get(const_name)::Version::STRING}" - end - end - - 0 - end - end - - # @private - PrintHelp = Struct.new(:parser, :hidden_options) do - def call(_options, _err, out) - # Removing the hidden options from the output. - out.puts parser.to_s.gsub(/^\s+(#{hidden_options.join('|')})\b.*$\n/, '') - 0 - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/memoized_helpers.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/memoized_helpers.rb deleted file mode 100644 index adcfce7..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/memoized_helpers.rb +++ /dev/null @@ -1,580 +0,0 @@ -RSpec::Support.require_rspec_support 'reentrant_mutex' - -module RSpec - module Core - # This module is included in {ExampleGroup}, making the methods - # available to be called from within example blocks. - # - # @see ClassMethods - module MemoizedHelpers - # @note `subject` was contributed by Joe Ferris to support the one-liner - # syntax embraced by shoulda matchers: - # - # RSpec.describe Widget do - # it { is_expected.to validate_presence_of(:name) } - # # or - # it { should validate_presence_of(:name) } - # end - # - # While the examples below demonstrate how to use `subject` - # explicitly in examples, we recommend that you define a method with - # an intention revealing name instead. - # - # @example - # - # # Explicit declaration of subject. - # RSpec.describe Person do - # subject { Person.new(:birthdate => 19.years.ago) } - # it "should be eligible to vote" do - # subject.should be_eligible_to_vote - # # ^ ^ explicit reference to subject not recommended - # end - # end - # - # # Implicit subject => { Person.new }. - # RSpec.describe Person do - # it "should be eligible to vote" do - # subject.should be_eligible_to_vote - # # ^ ^ explicit reference to subject not recommended - # end - # end - # - # # One-liner syntax - expectation is set on the subject. - # RSpec.describe Person do - # it { is_expected.to be_eligible_to_vote } - # # or - # it { should be_eligible_to_vote } - # end - # - # @note Because `subject` is designed to create state that is reset - # between each example, and `before(:context)` is designed to setup - # state that is shared across _all_ examples in an example group, - # `subject` is _not_ intended to be used in a `before(:context)` hook. - # - # @see #should - # @see #should_not - # @see #is_expected - def subject - __memoized.fetch_or_store(:subject) do - described = described_class || self.class.metadata.fetch(:description_args).first - Class === described ? described.new : described - end - end - - # When `should` is called with no explicit receiver, the call is - # delegated to the object returned by `subject`. Combined with an - # implicit subject this supports very concise expressions. - # - # @example - # - # RSpec.describe Person do - # it { should be_eligible_to_vote } - # end - # - # @see #subject - # @see #is_expected - # - # @note This only works if you are using rspec-expectations. - # @note If you are using RSpec's newer expect-based syntax you may - # want to use `is_expected.to` instead of `should`. - def should(matcher=nil, message=nil) - enforce_value_expectation(matcher, 'should') - RSpec::Expectations::PositiveExpectationHandler.handle_matcher(subject, matcher, message) - end - - # Just like `should`, `should_not` delegates to the subject (implicit or - # explicit) of the example group. - # - # @example - # - # RSpec.describe Person do - # it { should_not be_eligible_to_vote } - # end - # - # @see #subject - # @see #is_expected - # - # @note This only works if you are using rspec-expectations. - # @note If you are using RSpec's newer expect-based syntax you may - # want to use `is_expected.to_not` instead of `should_not`. - def should_not(matcher=nil, message=nil) - enforce_value_expectation(matcher, 'should_not') - RSpec::Expectations::NegativeExpectationHandler.handle_matcher(subject, matcher, message) - end - - # Wraps the `subject` in `expect` to make it the target of an expectation. - # Designed to read nicely for one-liners. - # - # @example - # - # describe [1, 2, 3] do - # it { is_expected.to be_an Array } - # it { is_expected.not_to include 4 } - # end - # - # @see #subject - # @see #should - # @see #should_not - # - # @note This only works if you are using rspec-expectations. - def is_expected - expect(subject) - end - - # @private - # should just be placed in private section, - # but Ruby issues warnings on private attributes. - # and expanding it to the equivalent method upsets Rubocop, - # b/c it should obviously be a reader - attr_reader :__memoized - private :__memoized - - private - - # @private - def initialize(*) - __init_memoized - super - end - - # @private - def __init_memoized - @__memoized = if RSpec.configuration.threadsafe? - ThreadsafeMemoized.new - else - NonThreadSafeMemoized.new - end - end - - # @private - def enforce_value_expectation(matcher, method_name) - return if matcher_supports_value_expectations?(matcher) - - RSpec.deprecate( - "#{method_name} #{RSpec::Support::ObjectFormatter.format(matcher)}", - :message => - "The implicit block expectation syntax is deprecated, you should pass " \ - "a block to `expect` to use the provided block expectation matcher " \ - "(#{RSpec::Support::ObjectFormatter.format(matcher)}), " \ - "or the matcher must implement `supports_value_expectations?`." - ) - end - - def matcher_supports_value_expectations?(matcher) - matcher.supports_value_expectations? - rescue - true - end - - # @private - class ThreadsafeMemoized - def initialize - @memoized = {} - @mutex = Support::ReentrantMutex.new - end - - def fetch_or_store(key) - @memoized.fetch(key) do # only first access pays for synchronization - @mutex.synchronize do - @memoized.fetch(key) { @memoized[key] = yield } - end - end - end - end - - # @private - class NonThreadSafeMemoized - def initialize - @memoized = {} - end - - def fetch_or_store(key) - @memoized.fetch(key) { @memoized[key] = yield } - end - end - - # Used internally to customize the behavior of the - # memoized hash when used in a `before(:context)` hook. - # - # @private - class ContextHookMemoized - def self.isolate_for_context_hook(example_group_instance) - exploding_memoized = self - - example_group_instance.instance_exec do - @__memoized = exploding_memoized - - begin - yield - ensure - # This is doing a reset instead of just isolating for context hook. - # Really, this should set the old @__memoized back into place. - # - # Caller is the before and after context hooks - # which are both called from self.run - # I didn't look at why it made tests fail, maybe an object was getting reused in RSpec tests, - # if so, then that probably already works, and its the tests that are wrong. - __init_memoized - end - end - end - - def self.fetch_or_store(key, &_block) - description = if key == :subject - "subject" - else - "let declaration `#{key}`" - end - - raise <<-EOS -#{description} accessed in #{article} #{hook_expression} hook at: - #{CallerFilter.first_non_rspec_line} - -`let` and `subject` declarations are not intended to be called -in #{article} #{hook_expression} hook, as they exist to define state that -is reset between each example, while #{hook_expression} exists to -#{hook_intention}. -EOS - end - - # @private - class Before < self - def self.hook_expression - "`before(:context)`" - end - - def self.article - "a" - end - - def self.hook_intention - "define state that is shared across examples in an example group" - end - end - - # @private - class After < self - def self.hook_expression - "`after(:context)`" - end - - def self.article - "an" - end - - def self.hook_intention - "cleanup state that is shared across examples in an example group" - end - end - end - - # This module is extended onto {ExampleGroup}, making the methods - # available to be called from within example group blocks. - # You can think of them as being analagous to class macros. - module ClassMethods - # Generates a method whose return value is memoized after the first - # call. Useful for reducing duplication between examples that assign - # values to the same local variable. - # - # @note `let` _can_ enhance readability when used sparingly (1,2, or - # maybe 3 declarations) in any given example group, but that can - # quickly degrade with overuse. YMMV. - # - # @note `let` can be configured to be threadsafe or not. - # If it is threadsafe, it will take longer to access the value. - # If it is not threadsafe, it may behave in surprising ways in examples - # that spawn separate threads. Specify this on `RSpec.configure` - # - # @note Because `let` is designed to create state that is reset between - # each example, and `before(:context)` is designed to setup state that - # is shared across _all_ examples in an example group, `let` is _not_ - # intended to be used in a `before(:context)` hook. - # - # @example - # - # RSpec.describe Thing do - # let(:thing) { Thing.new } - # - # it "does something" do - # # First invocation, executes block, memoizes and returns result. - # thing.do_something - # - # # Second invocation, returns the memoized value. - # thing.should be_something - # end - # end - def let(name, &block) - # We have to pass the block directly to `define_method` to - # allow it to use method constructs like `super` and `return`. - raise "#let or #subject called without a block" if block.nil? - - # A list of reserved words that can't be used as a name for a memoized helper - # Matches for both symbols and passed strings - if [:initialize, :to_s].include?(name.to_sym) - raise ArgumentError, "#let or #subject called with reserved name `#{name}`" - end - - our_module = MemoizedHelpers.module_for(self) - - # If we have a module clash in our helper module - # then we need to remove it to prevent a warning. - # - # Note we do not check ancestor modules (see: `instance_methods(false)`) - # as we can override them. - if our_module.instance_methods(false).include?(name) - our_module.__send__(:remove_method, name) - end - our_module.__send__(:define_method, name, &block) - - # If we have a module clash in the example module - # then we need to remove it to prevent a warning. - # - # Note we do not check ancestor modules (see: `instance_methods(false)`) - # as we can override them. - if instance_methods(false).include?(name) - remove_method(name) - end - - # Apply the memoization. The method has been defined in an ancestor - # module so we can use `super` here to get the value. - if block.arity == 1 - define_method(name) { __memoized.fetch_or_store(name) { super(RSpec.current_example, &nil) } } - else - define_method(name) { __memoized.fetch_or_store(name) { super(&nil) } } - end - end - - # Just like `let`, except the block is invoked by an implicit `before` - # hook. This serves a dual purpose of setting up state and providing a - # memoized reference to that state. - # - # @example - # - # class Thing - # def self.count - # @count ||= 0 - # end - # - # def self.count=(val) - # @count += val - # end - # - # def self.reset_count - # @count = 0 - # end - # - # def initialize - # self.class.count += 1 - # end - # end - # - # RSpec.describe Thing do - # after(:example) { Thing.reset_count } - # - # context "using let" do - # let(:thing) { Thing.new } - # - # it "is not invoked implicitly" do - # Thing.count.should eq(0) - # end - # - # it "can be invoked explicitly" do - # thing - # Thing.count.should eq(1) - # end - # end - # - # context "using let!" do - # let!(:thing) { Thing.new } - # - # it "is invoked implicitly" do - # Thing.count.should eq(1) - # end - # - # it "returns memoized version on first invocation" do - # thing - # Thing.count.should eq(1) - # end - # end - # end - def let!(name, &block) - let(name, &block) - before { __send__(name) } - end - - # Declares a `subject` for an example group which can then be wrapped - # with `expect` using `is_expected` to make it the target of an - # expectation in a concise, one-line example. - # - # Given a `name`, defines a method with that name which returns the - # `subject`. This lets you declare the subject once and access it - # implicitly in one-liners and explicitly using an intention revealing - # name. - # - # When given a `name`, calling `super` in the block is not supported. - # - # @note `subject` can be configured to be threadsafe or not. - # If it is threadsafe, it will take longer to access the value. - # If it is not threadsafe, it may behave in surprising ways in examples - # that spawn separate threads. Specify this on `RSpec.configure` - # - # @param name [String,Symbol] used to define an accessor with an - # intention revealing name - # @param block defines the value to be returned by `subject` in examples - # - # @example - # - # RSpec.describe CheckingAccount, "with $50" do - # subject { CheckingAccount.new(Money.new(50, :USD)) } - # it { is_expected.to have_a_balance_of(Money.new(50, :USD)) } - # it { is_expected.not_to be_overdrawn } - # end - # - # RSpec.describe CheckingAccount, "with a non-zero starting balance" do - # subject(:account) { CheckingAccount.new(Money.new(50, :USD)) } - # it { is_expected.not_to be_overdrawn } - # it "has a balance equal to the starting balance" do - # account.balance.should eq(Money.new(50, :USD)) - # end - # end - # - # @see MemoizedHelpers#should - # @see MemoizedHelpers#should_not - # @see MemoizedHelpers#is_expected - def subject(name=nil, &block) - if name - let(name, &block) - alias_method :subject, name - - self::NamedSubjectPreventSuper.__send__(:define_method, name) do - raise NotImplementedError, "`super` in named subjects is not supported" - end - else - let(:subject, &block) - end - end - - # Just like `subject`, except the block is invoked by an implicit - # `before` hook. This serves a dual purpose of setting up state and - # providing a memoized reference to that state. - # - # @example - # - # class Thing - # def self.count - # @count ||= 0 - # end - # - # def self.count=(val) - # @count += val - # end - # - # def self.reset_count - # @count = 0 - # end - # - # def initialize - # self.class.count += 1 - # end - # end - # - # RSpec.describe Thing do - # after(:example) { Thing.reset_count } - # - # context "using subject" do - # subject { Thing.new } - # - # it "is not invoked implicitly" do - # Thing.count.should eq(0) - # end - # - # it "can be invoked explicitly" do - # subject - # Thing.count.should eq(1) - # end - # end - # - # context "using subject!" do - # subject!(:thing) { Thing.new } - # - # it "is invoked implicitly" do - # Thing.count.should eq(1) - # end - # - # it "returns memoized version on first invocation" do - # subject - # Thing.count.should eq(1) - # end - # end - # end - def subject!(name=nil, &block) - subject(name, &block) - before { subject } - end - end - - # @private - # - # Gets the LetDefinitions module. The module is mixed into - # the example group and is used to hold all let definitions. - # This is done so that the block passed to `let` can be - # forwarded directly on to `define_method`, so that all method - # constructs (including `super` and `return`) can be used in - # a `let` block. - # - # The memoization is provided by a method definition on the - # example group that supers to the LetDefinitions definition - # in order to get the value to memoize. - def self.module_for(example_group) - get_constant_or_yield(example_group, :LetDefinitions) do - mod = Module.new do - include(Module.new { - example_group.const_set(:NamedSubjectPreventSuper, self) - }) - end - - example_group.const_set(:LetDefinitions, mod) - mod - end - end - - # @private - def self.define_helpers_on(example_group) - example_group.__send__(:include, module_for(example_group)) - end - - if Module.method(:const_defined?).arity == 1 # for 1.8 - # @private - # - # Gets the named constant or yields. - # On 1.8, const_defined? / const_get do not take into - # account the inheritance hierarchy. - # :nocov: - def self.get_constant_or_yield(example_group, name) - if example_group.const_defined?(name) - example_group.const_get(name) - else - yield - end - end - # :nocov: - else - # @private - # - # Gets the named constant or yields. - # On 1.9, const_defined? / const_get take into account the - # the inheritance by default, and accept an argument to - # disable this behavior. It's important that we don't - # consider inheritance here; each example group level that - # uses a `let` should get its own `LetDefinitions` module. - def self.get_constant_or_yield(example_group, name) - if example_group.const_defined?(name, (check_ancestors = false)) - example_group.const_get(name, check_ancestors) - else - yield - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/metadata.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/metadata.rb deleted file mode 100644 index 9034214..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/metadata.rb +++ /dev/null @@ -1,498 +0,0 @@ -module RSpec - module Core - # Each ExampleGroup class and Example instance owns an instance of - # Metadata, which is Hash extended to support lazy evaluation of values - # associated with keys that may or may not be used by any example or group. - # - # In addition to metadata that is used internally, this also stores - # user-supplied metadata, e.g. - # - # RSpec.describe Something, :type => :ui do - # it "does something", :slow => true do - # # ... - # end - # end - # - # `:type => :ui` is stored in the Metadata owned by the example group, and - # `:slow => true` is stored in the Metadata owned by the example. These can - # then be used to select which examples are run using the `--tag` option on - # the command line, or several methods on `Configuration` used to filter a - # run (e.g. `filter_run_including`, `filter_run_excluding`, etc). - # - # @see Example#metadata - # @see ExampleGroup.metadata - # @see FilterManager - # @see Configuration#filter_run_including - # @see Configuration#filter_run_excluding - module Metadata - # Matches strings either at the beginning of the input or prefixed with a - # whitespace, containing the current path, either postfixed with the - # separator, or at the end of the string. Match groups are the character - # before and the character after the string if any. - # - # http://rubular.com/r/fT0gmX6VJX - # http://rubular.com/r/duOrD4i3wb - # http://rubular.com/r/sbAMHFrOx1 - def self.relative_path_regex - @relative_path_regex ||= /(\A|\s)#{File.expand_path('.')}(#{File::SEPARATOR}|\s|\Z)/ - end - - # @api private - # - # @param line [String] current code line - # @return [String] relative path to line - def self.relative_path(line) - line = line.sub(relative_path_regex, "\\1.\\2".freeze) - line = line.sub(/\A([^:]+:\d+)$/, '\\1'.freeze) - return nil if line == '-e:1'.freeze - line - rescue SecurityError - # :nocov: - SecurityError is no longer produced starting in ruby 2.7 - nil - # :nocov: - end - - # @private - # Iteratively walks up from the given metadata through all - # example group ancestors, yielding each metadata hash along the way. - def self.ascending(metadata) - yield metadata - return unless (group_metadata = metadata.fetch(:example_group) { metadata[:parent_example_group] }) - - loop do - yield group_metadata - break unless (group_metadata = group_metadata[:parent_example_group]) - end - end - - # @private - # Returns an enumerator that iteratively walks up the given metadata through all - # example group ancestors, yielding each metadata hash along the way. - def self.ascend(metadata) - enum_for(:ascending, metadata) - end - - # @private - # Used internally to build a hash from an args array. - # Symbols are converted into hash keys with a value of `true`. - # This is done to support simple tagging using a symbol, rather - # than needing to do `:symbol => true`. - def self.build_hash_from(args, warn_about_example_group_filtering=false) - hash = args.last.is_a?(Hash) ? args.pop : {} - - hash[args.pop] = true while args.last.is_a?(Symbol) - - if warn_about_example_group_filtering && hash.key?(:example_group) - RSpec.deprecate("Filtering by an `:example_group` subhash", - :replacement => "the subhash to filter directly") - end - - hash - end - - # @private - def self.deep_hash_dup(object) - return object.dup if Array === object - return object unless Hash === object - - object.inject(object.dup) do |duplicate, (key, value)| - duplicate[key] = deep_hash_dup(value) - duplicate - end - end - - # @private - def self.id_from(metadata) - "#{metadata[:rerun_file_path]}[#{metadata[:scoped_id]}]" - end - - # @private - def self.location_tuple_from(metadata) - [metadata[:absolute_file_path], metadata[:line_number]] - end - - # @private - # Used internally to populate metadata hashes with computed keys - # managed by RSpec. - class HashPopulator - attr_reader :metadata, :user_metadata, :description_args, :block - - def initialize(metadata, user_metadata, index_provider, description_args, block) - @metadata = metadata - @user_metadata = user_metadata - @index_provider = index_provider - @description_args = description_args - @block = block - end - - def populate - ensure_valid_user_keys - - metadata[:block] = block - metadata[:description_args] = description_args - metadata[:description] = build_description_from(*metadata[:description_args]) - metadata[:full_description] = full_description - metadata[:described_class] = described_class - - populate_location_attributes - metadata.update(user_metadata) - end - - private - - def populate_location_attributes - backtrace = user_metadata.delete(:caller) - - file_path, line_number = if backtrace - file_path_and_line_number_from(backtrace) - elsif block.respond_to?(:source_location) - block.source_location - else - file_path_and_line_number_from(caller) - end - - relative_file_path = Metadata.relative_path(file_path) - absolute_file_path = File.expand_path(relative_file_path) - metadata[:file_path] = relative_file_path - metadata[:line_number] = line_number.to_i - metadata[:location] = "#{relative_file_path}:#{line_number}" - metadata[:absolute_file_path] = absolute_file_path - metadata[:rerun_file_path] ||= relative_file_path - metadata[:scoped_id] = build_scoped_id_for(absolute_file_path) - end - - def file_path_and_line_number_from(backtrace) - first_caller_from_outside_rspec = backtrace.find { |l| l !~ CallerFilter::LIB_REGEX } - first_caller_from_outside_rspec ||= backtrace.first - /(.+?):(\d+)(?:|:\d+)/.match(first_caller_from_outside_rspec).captures - end - - def description_separator(parent_part, child_part) - if parent_part.is_a?(Module) && /^(?:#|::|\.)/.match(child_part.to_s) - ''.freeze - else - ' '.freeze - end - end - - def build_description_from(parent_description=nil, my_description=nil) - return parent_description.to_s unless my_description - return my_description.to_s if parent_description.to_s == '' - separator = description_separator(parent_description, my_description) - (parent_description.to_s + separator) << my_description.to_s - end - - def build_scoped_id_for(file_path) - index = @index_provider.call(file_path).to_s - parent_scoped_id = metadata.fetch(:scoped_id) { return index } - "#{parent_scoped_id}:#{index}" - end - - def ensure_valid_user_keys - RESERVED_KEYS.each do |key| - next unless user_metadata.key?(key) - raise <<-EOM.gsub(/^\s+\|/, '') - |#{"*" * 50} - |:#{key} is not allowed - | - |RSpec reserves some hash keys for its own internal use, - |including :#{key}, which is used on: - | - | #{CallerFilter.first_non_rspec_line}. - | - |Here are all of RSpec's reserved hash keys: - | - | #{RESERVED_KEYS.join("\n ")} - |#{"*" * 50} - EOM - end - end - end - - # @private - class ExampleHash < HashPopulator - def self.create(group_metadata, user_metadata, index_provider, description, block) - example_metadata = group_metadata.dup - group_metadata = Hash.new(&ExampleGroupHash.backwards_compatibility_default_proc do |hash| - hash[:parent_example_group] - end) - group_metadata.update(example_metadata) - - example_metadata[:execution_result] = Example::ExecutionResult.new - example_metadata[:example_group] = group_metadata - example_metadata[:shared_group_inclusion_backtrace] = SharedExampleGroupInclusionStackFrame.current_backtrace - example_metadata.delete(:parent_example_group) - - description_args = description.nil? ? [] : [description] - hash = new(example_metadata, user_metadata, index_provider, description_args, block) - hash.populate - hash.metadata - end - - private - - def described_class - metadata[:example_group][:described_class] - end - - def full_description - build_description_from( - metadata[:example_group][:full_description], - metadata[:description] - ) - end - end - - # @private - class ExampleGroupHash < HashPopulator - def self.create(parent_group_metadata, user_metadata, example_group_index, *args, &block) - group_metadata = hash_with_backwards_compatibility_default_proc - - if parent_group_metadata - group_metadata.update(parent_group_metadata) - group_metadata[:parent_example_group] = parent_group_metadata - end - - hash = new(group_metadata, user_metadata, example_group_index, args, block) - hash.populate - hash.metadata - end - - def self.hash_with_backwards_compatibility_default_proc - Hash.new(&backwards_compatibility_default_proc { |hash| hash }) - end - - def self.backwards_compatibility_default_proc(&example_group_selector) - Proc.new do |hash, key| - case key - when :example_group - # We commonly get here when rspec-core is applying a previously - # configured filter rule, such as when a gem configures: - # - # RSpec.configure do |c| - # c.include MyGemHelpers, :example_group => { :file_path => /spec\/my_gem_specs/ } - # end - # - # It's confusing for a user to get a deprecation at this point in - # the code, so instead we issue a deprecation from the config APIs - # that take a metadata hash, and MetadataFilter sets this thread - # local to silence the warning here since it would be so - # confusing. - unless RSpec::Support.thread_local_data[:silence_metadata_example_group_deprecations] - RSpec.deprecate("The `:example_group` key in an example group's metadata hash", - :replacement => "the example group's hash directly for the " \ - "computed keys and `:parent_example_group` to access the parent " \ - "example group metadata") - end - - group_hash = example_group_selector.call(hash) - LegacyExampleGroupHash.new(group_hash) if group_hash - when :example_group_block - RSpec.deprecate("`metadata[:example_group_block]`", - :replacement => "`metadata[:block]`") - hash[:block] - when :describes - RSpec.deprecate("`metadata[:describes]`", - :replacement => "`metadata[:described_class]`") - hash[:described_class] - end - end - end - - private - - def described_class - candidate = metadata[:description_args].first - return candidate unless NilClass === candidate || String === candidate - parent_group = metadata[:parent_example_group] - parent_group && parent_group[:described_class] - end - - def full_description - description = metadata[:description] - parent_example_group = metadata[:parent_example_group] - return description unless parent_example_group - - parent_description = parent_example_group[:full_description] - separator = description_separator(parent_example_group[:description_args].last, - metadata[:description_args].first) - - parent_description + separator + description - end - end - - # @private - RESERVED_KEYS = [ - :description, - :description_args, - :described_class, - :example_group, - :parent_example_group, - :execution_result, - :last_run_status, - :file_path, - :absolute_file_path, - :rerun_file_path, - :full_description, - :line_number, - :location, - :scoped_id, - :block, - :shared_group_inclusion_backtrace - ] - end - - # Mixin that makes the including class imitate a hash for backwards - # compatibility. The including class should use `attr_accessor` to - # declare attributes. - # @private - module HashImitatable - def self.included(klass) - klass.extend ClassMethods - end - - def to_h - hash = extra_hash_attributes.dup - - self.class.hash_attribute_names.each do |name| - hash[name] = __send__(name) - end - - hash - end - - (Hash.public_instance_methods - Object.public_instance_methods).each do |method_name| - next if [:[], :[]=, :to_h].include?(method_name.to_sym) - - define_method(method_name) do |*args, &block| - issue_deprecation(method_name, *args) - - hash = hash_for_delegation - self.class.hash_attribute_names.each do |name| - hash.delete(name) unless instance_variable_defined?(:"@#{name}") - end - - hash.__send__(method_name, *args, &block).tap do - # apply mutations back to the object - hash.each do |name, value| - if directly_supports_attribute?(name) - set_value(name, value) - else - extra_hash_attributes[name] = value - end - end - end - end - end - - def [](key) - issue_deprecation(:[], key) - - if directly_supports_attribute?(key) - get_value(key) - else - extra_hash_attributes[key] - end - end - - def []=(key, value) - issue_deprecation(:[]=, key, value) - - if directly_supports_attribute?(key) - set_value(key, value) - else - extra_hash_attributes[key] = value - end - end - - private - - def extra_hash_attributes - @extra_hash_attributes ||= {} - end - - def directly_supports_attribute?(name) - self.class.hash_attribute_names.include?(name) - end - - def get_value(name) - __send__(name) - end - - def set_value(name, value) - __send__(:"#{name}=", value) - end - - def hash_for_delegation - to_h - end - - def issue_deprecation(_method_name, *_args) - # no-op by default: subclasses can override - end - - # @private - module ClassMethods - def hash_attribute_names - @hash_attribute_names ||= [] - end - - def attr_accessor(*names) - hash_attribute_names.concat(names) - super - end - end - end - - # @private - # Together with the example group metadata hash default block, - # provides backwards compatibility for the old `:example_group` - # key. In RSpec 2.x, the computed keys of a group's metadata - # were exposed from a nested subhash keyed by `[:example_group]`, and - # then the parent group's metadata was exposed by sub-subhash - # keyed by `[:example_group][:example_group]`. - # - # In RSpec 3, we reorganized this to that the computed keys are - # exposed directly of the group metadata hash (no nesting), and - # `:parent_example_group` returns the parent group's metadata. - # - # Maintaining backwards compatibility was difficult: we wanted - # `:example_group` to return an object that: - # - # * Exposes the top-level metadata keys that used to be nested - # under `:example_group`. - # * Supports mutation (rspec-rails, for example, assigns - # `metadata[:example_group][:described_class]` when you use - # anonymous controller specs) such that changes are written - # back to the top-level metadata hash. - # * Exposes the parent group metadata as - # `[:example_group][:example_group]`. - class LegacyExampleGroupHash - include HashImitatable - - def initialize(metadata) - @metadata = metadata - parent_group_metadata = metadata.fetch(:parent_example_group) { {} }[:example_group] - self[:example_group] = parent_group_metadata if parent_group_metadata - end - - def to_h - super.merge(@metadata) - end - - private - - def directly_supports_attribute?(name) - name != :example_group - end - - def get_value(name) - @metadata[name] - end - - def set_value(name, value) - @metadata[name] = value - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/metadata_filter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/metadata_filter.rb deleted file mode 100644 index 2e63baf..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/metadata_filter.rb +++ /dev/null @@ -1,255 +0,0 @@ -module RSpec - module Core - # Contains metadata filtering logic. This has been extracted from - # the metadata classes because it operates ON a metadata hash but - # does not manage any of the state in the hash. We're moving towards - # having metadata be a raw hash (not a custom subclass), so externalizing - # this filtering logic helps us move in that direction. - module MetadataFilter - class << self - # @private - def apply?(predicate, filters, metadata) - filters.__send__(predicate) { |k, v| filter_applies?(k, v, metadata) } - end - - # @private - def filter_applies?(key, filter_value, metadata) - silence_metadata_example_group_deprecations do - return location_filter_applies?(filter_value, metadata) if key == :locations - return id_filter_applies?(filter_value, metadata) if key == :ids - return filters_apply?(key, filter_value, metadata) if Hash === filter_value - - meta_value = metadata.fetch(key) { return false } - - return true if TrueClass === filter_value && meta_value - return proc_filter_applies?(key, filter_value, metadata) if Proc === filter_value - return filter_applies_to_any_value?(key, filter_value, metadata) if Array === meta_value - - filter_value === meta_value || filter_value.to_s == meta_value.to_s - end - end - - # @private - def silence_metadata_example_group_deprecations - RSpec::Support.thread_local_data[:silence_metadata_example_group_deprecations] = true - yield - ensure - RSpec::Support.thread_local_data.delete(:silence_metadata_example_group_deprecations) - end - - private - - def filter_applies_to_any_value?(key, value, metadata) - metadata[key].any? { |v| filter_applies?(key, v, key => value) } - end - - def id_filter_applies?(rerun_paths_to_scoped_ids, metadata) - scoped_ids = rerun_paths_to_scoped_ids.fetch(metadata[:rerun_file_path]) { return false } - - Metadata.ascend(metadata).any? do |meta| - scoped_ids.include?(meta[:scoped_id]) - end - end - - def location_filter_applies?(locations, metadata) - Metadata.ascend(metadata).any? do |meta| - file_path = meta[:absolute_file_path] - line_num = meta[:line_number] - - locations[file_path].any? do |filter_line_num| - line_num == RSpec.world.preceding_declaration_line(file_path, filter_line_num) - end - end - end - - def proc_filter_applies?(key, proc, metadata) - case proc.arity - when 0 then proc.call - when 2 then proc.call(metadata[key], metadata) - else proc.call(metadata[key]) - end - end - - def filters_apply?(key, value, metadata) - subhash = metadata[key] - return false unless Hash === subhash || HashImitatable === subhash - value.all? { |k, v| filter_applies?(k, v, subhash) } - end - end - end - - # Tracks a collection of filterable items (e.g. modules, hooks, etc) - # and provides an optimized API to get the applicable items for the - # metadata of an example or example group. - # - # There are two implementations, optimized for different uses. - # @private - module FilterableItemRepository - # This implementation is simple, and is optimized for frequent - # updates but rare queries. `append` and `prepend` do no extra - # processing, and no internal memoization is done, since this - # is not optimized for queries. - # - # This is ideal for use by a example or example group, which may - # be updated multiple times with globally configured hooks, etc, - # but will not be queried frequently by other examples or example - # groups. - # @private - class UpdateOptimized - attr_reader :items_and_filters - - def initialize(applies_predicate) - @applies_predicate = applies_predicate - @items_and_filters = [] - end - - def append(item, metadata) - @items_and_filters << [item, metadata] - end - - def prepend(item, metadata) - @items_and_filters.unshift [item, metadata] - end - - def delete(item, metadata) - @items_and_filters.delete [item, metadata] - end - - def items_for(request_meta) - @items_and_filters.each_with_object([]) do |(item, item_meta), to_return| - to_return << item if item_meta.empty? || - MetadataFilter.apply?(@applies_predicate, item_meta, request_meta) - end - end - - unless [].respond_to?(:each_with_object) # For 1.8.7 - # :nocov: - undef items_for - def items_for(request_meta) - @items_and_filters.inject([]) do |to_return, (item, item_meta)| - to_return << item if item_meta.empty? || - MetadataFilter.apply?(@applies_predicate, item_meta, request_meta) - to_return - end - end - # :nocov: - end - end - - # This implementation is much more complex, and is optimized for - # rare (or hopefully no) updates once the queries start. Updates - # incur a cost as it has to clear the memoization and keep track - # of applicable keys. Queries will be O(N) the first time an item - # is provided with a given set of applicable metadata; subsequent - # queries with items with the same set of applicable metadata will - # be O(1) due to internal memoization. - # - # This is ideal for use by config, where filterable items (e.g. hooks) - # are typically added at the start of the process (e.g. in `spec_helper`) - # and then repeatedly queried as example groups and examples are defined. - # @private - class QueryOptimized < UpdateOptimized - alias find_items_for items_for - private :find_items_for - - def initialize(applies_predicate) - super - @applicable_keys = Set.new - @proc_keys = Set.new - @memoized_lookups = Hash.new do |hash, applicable_metadata| - hash[applicable_metadata] = find_items_for(applicable_metadata) - end - end - - def append(item, metadata) - super - handle_mutation(metadata) - end - - def prepend(item, metadata) - super - handle_mutation(metadata) - end - - def delete(item, metadata) - super - reconstruct_caches - end - - def items_for(metadata) - # The filtering of `metadata` to `applicable_metadata` is the key thing - # that makes the memoization actually useful in practice, since each - # example and example group have different metadata (e.g. location and - # description). By filtering to the metadata keys our items care about, - # we can ignore extra metadata keys that differ for each example/group. - # For example, given `config.include DBHelpers, :db`, example groups - # can be split into these two sets: those that are tagged with `:db` and those - # that are not. For each set, this method for the first group in the set is - # still an `O(N)` calculation, but all subsequent groups in the set will be - # constant time lookups when they call this method. - applicable_metadata = applicable_metadata_from(metadata) - - if applicable_metadata.any? { |k, _| @proc_keys.include?(k) } - # It's unsafe to memoize lookups involving procs (since they can - # be non-deterministic), so we skip the memoization in this case. - find_items_for(applicable_metadata) - else - @memoized_lookups[applicable_metadata] - end - end - - private - - def reconstruct_caches - @applicable_keys.clear - @proc_keys.clear - @items_and_filters.each do |_item, metadata| - handle_mutation(metadata) - end - end - - def handle_mutation(metadata) - @applicable_keys.merge(metadata.keys) - @proc_keys.merge(proc_keys_from metadata) - @memoized_lookups.clear - end - - def applicable_metadata_from(metadata) - MetadataFilter.silence_metadata_example_group_deprecations do - @applicable_keys.inject({}) do |hash, key| - # :example_group is treated special here because... - # - In RSpec 2, example groups had an `:example_group` key - # - In RSpec 3, that key is deprecated (it was confusing!). - # - The key is not technically present in an example group metadata hash - # (and thus would fail the `metadata.key?(key)` check) but a value - # is provided when accessed via the hash's `default_proc` - # - Thus, for backwards compatibility, we have to explicitly check - # for `:example_group` here if it is one of the keys being used to - # filter. - hash[key] = metadata[key] if metadata.key?(key) || key == :example_group - hash - end - end - end - - def proc_keys_from(metadata) - metadata.each_with_object([]) do |(key, value), to_return| - to_return << key if Proc === value - end - end - - unless [].respond_to?(:each_with_object) # For 1.8.7 - # :nocov: - undef proc_keys_from - def proc_keys_from(metadata) - metadata.inject([]) do |to_return, (key, value)| - to_return << key if Proc === value - to_return - end - end - # :nocov: - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/minitest_assertions_adapter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/minitest_assertions_adapter.rb deleted file mode 100644 index 25db751..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/minitest_assertions_adapter.rb +++ /dev/null @@ -1,31 +0,0 @@ -begin - # Only the minitest 5.x gem includes the minitest.rb and assertions.rb files. - require 'minitest' - require 'minitest/assertions' -rescue LoadError - # We must be using Ruby Core's MiniTest or the Minitest gem 4.x. - require 'minitest/unit' - Minitest = MiniTest -end - -module RSpec - module Core - # @private - module MinitestAssertionsAdapter - include ::Minitest::Assertions - # Need to forcefully include Pending after Minitest::Assertions - # to make sure our own #skip method beats Minitest's. - include ::RSpec::Core::Pending - - # Minitest 5.x requires this accessor to be available. See - # https://github.com/seattlerb/minitest/blob/38f0a5fcbd9c37c3f80a3eaad4ba84d3fc9947a0/lib/minitest/assertions.rb#L8 - # - # It is not required for other extension libraries, and RSpec does not - # report or make this information available to formatters. - attr_writer :assertions - def assertions - @assertions ||= 0 - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/flexmock.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/flexmock.rb deleted file mode 100644 index 91475ae..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/flexmock.rb +++ /dev/null @@ -1,31 +0,0 @@ -# Created by Jim Weirich on 2007-04-10. -# Copyright (c) 2007. All rights reserved. - -require 'flexmock/rspec' - -module RSpec - module Core - module MockingAdapters - # @private - module Flexmock - include ::FlexMock::MockContainer - - def self.framework_name - :flexmock - end - - def setup_mocks_for_rspec - # No setup required. - end - - def verify_mocks_for_rspec - flexmock_verify - end - - def teardown_mocks_for_rspec - flexmock_close - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/mocha.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/mocha.rb deleted file mode 100644 index 8caf7b6..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/mocha.rb +++ /dev/null @@ -1,57 +0,0 @@ -# In order to support all versions of mocha, we have to jump through some -# hoops here. -# -# mocha >= '0.13.0': -# require 'mocha/api' is required. -# require 'mocha/object' raises a LoadError b/c the file no longer exists. -# mocha < '0.13.0', >= '0.9.7' -# require 'mocha/api' is required. -# require 'mocha/object' is required. -# mocha < '0.9.7': -# require 'mocha/api' raises a LoadError b/c the file does not yet exist. -# require 'mocha/standalone' is required. -# require 'mocha/object' is required. -begin - require 'mocha/api' - - begin - require 'mocha/object' - rescue LoadError - # Mocha >= 0.13.0 no longer contains this file nor needs it to be loaded. - end -rescue LoadError - require 'mocha/standalone' - require 'mocha/object' -end - -module RSpec - module Core - module MockingAdapters - # @private - module Mocha - def self.framework_name - :mocha - end - - # Mocha::Standalone was deprecated as of Mocha 0.9.7. - begin - include ::Mocha::API - rescue NameError - include ::Mocha::Standalone - end - - def setup_mocks_for_rspec - mocha_setup - end - - def verify_mocks_for_rspec - mocha_verify - end - - def teardown_mocks_for_rspec - mocha_teardown - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/null.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/null.rb deleted file mode 100644 index 442de9a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/null.rb +++ /dev/null @@ -1,14 +0,0 @@ -module RSpec - module Core - module MockingAdapters - # @private - module Null - def setup_mocks_for_rspec; end - - def verify_mocks_for_rspec; end - - def teardown_mocks_for_rspec; end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/rr.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/rr.rb deleted file mode 100644 index d72651a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/rr.rb +++ /dev/null @@ -1,31 +0,0 @@ -require 'rr' - -RSpec.configuration.backtrace_exclusion_patterns.push(RR::Errors::BACKTRACE_IDENTIFIER) - -module RSpec - module Core - # @private - module MockingAdapters - # @private - module RR - def self.framework_name - :rr - end - - include ::RR::Extensions::InstanceMethods - - def setup_mocks_for_rspec - ::RR::Space.instance.reset - end - - def verify_mocks_for_rspec - ::RR::Space.instance.verify_doubles - end - - def teardown_mocks_for_rspec - ::RR::Space.instance.reset - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/rspec.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/rspec.rb deleted file mode 100644 index bb3f0ae..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/mocking_adapters/rspec.rb +++ /dev/null @@ -1,32 +0,0 @@ -require 'rspec/mocks' - -module RSpec - module Core - module MockingAdapters - # @private - module RSpec - include ::RSpec::Mocks::ExampleMethods - - def self.framework_name - :rspec - end - - def self.configuration - ::RSpec::Mocks.configuration - end - - def setup_mocks_for_rspec - ::RSpec::Mocks.setup - end - - def verify_mocks_for_rspec - ::RSpec::Mocks.verify - end - - def teardown_mocks_for_rspec - ::RSpec::Mocks.teardown - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/notifications.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/notifications.rb deleted file mode 100644 index 72768ef..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/notifications.rb +++ /dev/null @@ -1,523 +0,0 @@ -RSpec::Support.require_rspec_core "formatters/console_codes" -RSpec::Support.require_rspec_core "formatters/exception_presenter" -RSpec::Support.require_rspec_core "formatters/helpers" -RSpec::Support.require_rspec_core "shell_escape" - -module RSpec::Core - # Notifications are value objects passed to formatters to provide them - # with information about a particular event of interest. - module Notifications - # @private - module NullColorizer - module_function - - def wrap(line, _code_or_symbol) - line - end - end - - # The `StartNotification` represents a notification sent by the reporter - # when the suite is started. It contains the expected amount of examples - # to be executed, and the load time of RSpec. - # - # @attr count [Fixnum] the number counted - # @attr load_time [Float] the number of seconds taken to boot RSpec - # and load the spec files - StartNotification = Struct.new(:count, :load_time) - - # The `ExampleNotification` represents notifications sent by the reporter - # which contain information about the current (or soon to be) example. - # It is used by formatters to access information about that example. - # - # @example - # def example_started(notification) - # puts "Hey I started #{notification.example.description}" - # end - # - # @attr example [RSpec::Core::Example] the current example - ExampleNotification = Struct.new(:example) - class ExampleNotification - # @private - def self.for(example) - execution_result = example.execution_result - - return SkippedExampleNotification.new(example) if execution_result.example_skipped? - return new(example) unless execution_result.status == :pending || execution_result.status == :failed - - klass = if execution_result.pending_fixed? - PendingExampleFixedNotification - elsif execution_result.status == :pending - PendingExampleFailedAsExpectedNotification - else - FailedExampleNotification - end - - klass.new(example) - end - - private_class_method :new - end - - # The `ExamplesNotification` represents notifications sent by the reporter - # which contain information about the suites examples. - # - # @example - # def stop(notification) - # puts "Hey I ran #{notification.examples.size}" - # end - # - class ExamplesNotification - def initialize(reporter) - @reporter = reporter - end - - # @return [Array] list of examples - def examples - @reporter.examples - end - - # @return [Array] list of failed examples - def failed_examples - @reporter.failed_examples - end - - # @return [Array] list of pending examples - def pending_examples - @reporter.pending_examples - end - - # @return [Array] - # returns examples as notifications - def notifications - @notifications ||= format_examples(examples) - end - - # @return [Array] - # returns failed examples as notifications - def failure_notifications - @failed_notifications ||= format_examples(failed_examples) - end - - # @return [Array] - # returns pending examples as notifications - def pending_notifications - @pending_notifications ||= format_examples(pending_examples) - end - - # @return [String] The list of failed examples, fully formatted in the way - # that RSpec's built-in formatters emit. - def fully_formatted_failed_examples(colorizer=::RSpec::Core::Formatters::ConsoleCodes) - formatted = "\nFailures:\n" - - failure_notifications.each_with_index do |failure, index| - formatted += failure.fully_formatted(index.next, colorizer) - end - - formatted - end - - # @return [String] The list of pending examples, fully formatted in the - # way that RSpec's built-in formatters emit. - def fully_formatted_pending_examples(colorizer=::RSpec::Core::Formatters::ConsoleCodes) - return if RSpec.configuration.pending_failure_output == :skip - - formatted = "\nPending: (Failures listed here are expected and do not affect your suite's status)\n".dup - - pending_notifications.each_with_index do |notification, index| - formatted << notification.fully_formatted(index.next, colorizer) - end - - formatted - end - - private - - def format_examples(examples) - examples.map do |example| - ExampleNotification.for(example) - end - end - end - - # The `FailedExampleNotification` extends `ExampleNotification` with - # things useful for examples that have failure info -- typically a - # failed or pending spec. - # - # @example - # def example_failed(notification) - # puts "Hey I failed :(" - # puts "Here's my stack trace" - # puts notification.exception.backtrace.join("\n") - # end - # - # @attr [RSpec::Core::Example] example the current example - # @see ExampleNotification - class FailedExampleNotification < ExampleNotification - public_class_method :new - - # @return [Exception] The example failure - def exception - @exception_presenter.exception - end - - # @return [String] The example description - def description - @exception_presenter.description - end - - # Returns the message generated for this failure line by line. - # - # @return [Array] The example failure message - def message_lines - @exception_presenter.message_lines - end - - # Returns the message generated for this failure colorized line by line. - # - # @param colorizer [#wrap] An object to colorize the message_lines by - # @return [Array] The example failure message colorized - def colorized_message_lines(colorizer=::RSpec::Core::Formatters::ConsoleCodes) - @exception_presenter.colorized_message_lines(colorizer) - end - - # Returns the failures formatted backtrace. - # - # @return [Array] the examples backtrace lines - def formatted_backtrace - @exception_presenter.formatted_backtrace - end - - # Returns the failures colorized formatted backtrace. - # - # @param colorizer [#wrap] An object to colorize the message_lines by - # @return [Array] the examples colorized backtrace lines - def colorized_formatted_backtrace(colorizer=::RSpec::Core::Formatters::ConsoleCodes) - @exception_presenter.colorized_formatted_backtrace(colorizer) - end - - # @return [String] The failure information fully formatted in the way that - # RSpec's built-in formatters emit. - def fully_formatted(failure_number, colorizer=::RSpec::Core::Formatters::ConsoleCodes) - @exception_presenter.fully_formatted(failure_number, colorizer) - end - - # @return [Array] The failure information fully formatted in the way that - # RSpec's built-in formatters emit, split by line. - def fully_formatted_lines(failure_number, colorizer=::RSpec::Core::Formatters::ConsoleCodes) - @exception_presenter.fully_formatted_lines(failure_number, colorizer) - end - - private - - def initialize(example, exception_presenter=Formatters::ExceptionPresenter::Factory.new(example).build) - @exception_presenter = exception_presenter - super(example) - end - end - - # @deprecated Use {FailedExampleNotification} instead. - class PendingExampleFixedNotification < FailedExampleNotification; end - - # @deprecated Use {FailedExampleNotification} instead. - class PendingExampleFailedAsExpectedNotification < FailedExampleNotification; end - - # The `SkippedExampleNotification` extends `ExampleNotification` with - # things useful for specs that are skipped. - # - # @attr [RSpec::Core::Example] example the current example - # @see ExampleNotification - class SkippedExampleNotification < ExampleNotification - public_class_method :new - - # @return [String] The pending detail fully formatted in the way that - # RSpec's built-in formatters emit. - def fully_formatted(pending_number, colorizer=::RSpec::Core::Formatters::ConsoleCodes) - formatted_caller = RSpec.configuration.backtrace_formatter.backtrace_line(example.location) - - [ - colorizer.wrap("\n #{pending_number}) #{example.full_description}", :pending), - "\n ", - Formatters::ExceptionPresenter::PENDING_DETAIL_FORMATTER.call(example, colorizer), - "\n", - colorizer.wrap(" # #{formatted_caller}\n", :detail) - ].join("") - end - end - - # The `GroupNotification` represents notifications sent by the reporter - # which contain information about the currently running (or soon to be) - # example group. It is used by formatters to access information about that - # group. - # - # @example - # def example_group_started(notification) - # puts "Hey I started #{notification.group.description}" - # end - # @attr group [RSpec::Core::ExampleGroup] the current group - GroupNotification = Struct.new(:group) - - # The `MessageNotification` encapsulates generic messages that the reporter - # sends to formatters. - # - # @attr message [String] the message - MessageNotification = Struct.new(:message) - - # The `SeedNotification` holds the seed used to randomize examples and - # whether that seed has been used or not. - # - # @attr seed [Fixnum] the seed used to randomize ordering - # @attr used [Boolean] whether the seed has been used or not - SeedNotification = Struct.new(:seed, :used) - class SeedNotification - # @api - # @return [Boolean] has the seed been used? - def seed_used? - !!used - end - private :used - - # @return [String] The seed information fully formatted in the way that - # RSpec's built-in formatters emit. - def fully_formatted - "\nRandomized with seed #{seed}\n" - end - end - - # The `SummaryNotification` holds information about the results of running - # a test suite. It is used by formatters to provide information at the end - # of the test run. - # - # @attr duration [Float] the time taken (in seconds) to run the suite - # @attr examples [Array] the examples run - # @attr failed_examples [Array] the failed examples - # @attr pending_examples [Array] the pending examples - # @attr load_time [Float] the number of seconds taken to boot RSpec - # and load the spec files - # @attr errors_outside_of_examples_count [Integer] the number of errors that - # have occurred processing - # the spec suite - SummaryNotification = Struct.new(:duration, :examples, :failed_examples, - :pending_examples, :load_time, - :errors_outside_of_examples_count) - class SummaryNotification - # @api - # @return [Fixnum] the number of examples run - def example_count - @example_count ||= examples.size - end - - # @api - # @return [Fixnum] the number of failed examples - def failure_count - @failure_count ||= failed_examples.size - end - - # @api - # @return [Fixnum] the number of pending examples - def pending_count - @pending_count ||= pending_examples.size - end - - # @api - # @return [String] A line summarising the result totals of the spec run. - def totals_line - summary = Formatters::Helpers.pluralize(example_count, "example") + - ", " + Formatters::Helpers.pluralize(failure_count, "failure") - summary += ", #{pending_count} pending" if pending_count > 0 - if errors_outside_of_examples_count > 0 - summary += ( - ", " + - Formatters::Helpers.pluralize(errors_outside_of_examples_count, "error") + - " occurred outside of examples" - ) - end - summary - end - - # @api public - # - # Wraps the results line with colors based on the configured - # colors for failure, pending, and success. Defaults to red, - # yellow, green accordingly. - # - # @param colorizer [#wrap] An object which supports wrapping text with - # specific colors. - # @return [String] A colorized results line. - def colorized_totals_line(colorizer=::RSpec::Core::Formatters::ConsoleCodes) - if failure_count > 0 || errors_outside_of_examples_count > 0 - colorizer.wrap(totals_line, RSpec.configuration.failure_color) - elsif pending_count > 0 - colorizer.wrap(totals_line, RSpec.configuration.pending_color) - else - colorizer.wrap(totals_line, RSpec.configuration.success_color) - end - end - - # @api public - # - # Formats failures into a rerunable command format. - # - # @param colorizer [#wrap] An object which supports wrapping text with - # specific colors. - # @return [String] A colorized summary line. - def colorized_rerun_commands(colorizer=::RSpec::Core::Formatters::ConsoleCodes) - "\nFailed examples:\n\n" + - failed_examples.map do |example| - colorizer.wrap("rspec #{rerun_argument_for(example)}", RSpec.configuration.failure_color) + " " + - colorizer.wrap("# #{example.full_description}", RSpec.configuration.detail_color) - end.join("\n") - end - - # @return [String] a formatted version of the time it took to run the - # suite - def formatted_duration - Formatters::Helpers.format_duration(duration) - end - - # @return [String] a formatted version of the time it took to boot RSpec - # and load the spec files - def formatted_load_time - Formatters::Helpers.format_duration(load_time) - end - - # @return [String] The summary information fully formatted in the way that - # RSpec's built-in formatters emit. - def fully_formatted(colorizer=::RSpec::Core::Formatters::ConsoleCodes) - formatted = "\nFinished in #{formatted_duration} " \ - "(files took #{formatted_load_time} to load)\n" \ - "#{colorized_totals_line(colorizer)}\n" - - unless failed_examples.empty? - formatted += (colorized_rerun_commands(colorizer) + "\n") - end - - formatted - end - - private - - include RSpec::Core::ShellEscape - - def rerun_argument_for(example) - location = example.location_rerun_argument - return location unless duplicate_rerun_locations.include?(location) - conditionally_quote(example.id) - end - - def duplicate_rerun_locations - @duplicate_rerun_locations ||= begin - locations = RSpec.world.all_examples.map(&:location_rerun_argument) - - Set.new.tap do |s| - locations.group_by { |l| l }.each do |l, ls| - s << l if ls.count > 1 - end - end - end - end - end - - # The `ProfileNotification` holds information about the results of running a - # test suite when profiling is enabled. It is used by formatters to provide - # information at the end of the test run for profiling information. - # - # @attr duration [Float] the time taken (in seconds) to run the suite - # @attr examples [Array] the examples run - # @attr number_of_examples [Fixnum] the number of examples to profile - # @attr example_groups [Array] example groups run - class ProfileNotification - def initialize(duration, examples, number_of_examples, example_groups) - @duration = duration - @examples = examples - @number_of_examples = number_of_examples - @example_groups = example_groups - end - attr_reader :duration, :examples, :number_of_examples - - # @return [Array] the slowest examples - def slowest_examples - @slowest_examples ||= - examples.sort_by do |example| - -example.execution_result.run_time - end.first(number_of_examples) - end - - # @return [Float] the time taken (in seconds) to run the slowest examples - def slow_duration - @slow_duration ||= - slowest_examples.inject(0.0) do |i, e| - i + e.execution_result.run_time - end - end - - # @return [String] the percentage of total time taken - def percentage - @percentage ||= - begin - time_taken = slow_duration / duration - '%.1f' % ((time_taken.nan? ? 0.0 : time_taken) * 100) - end - end - - # @return [Array] the slowest example groups - def slowest_groups - @slowest_groups ||= calculate_slowest_groups - end - - private - - def calculate_slowest_groups - # stop if we've only one example group - return {} if @example_groups.keys.length <= 1 - - @example_groups.each_value do |hash| - hash[:average] = hash[:total_time].to_f / hash[:count] - end - - groups = @example_groups.sort_by { |_, hash| -hash[:average] }.first(number_of_examples) - groups.map { |group, data| [group.location, data] } - end - end - - # The `DeprecationNotification` is issued by the reporter when a deprecated - # part of RSpec is encountered. It represents information about the - # deprecated call site. - # - # @attr message [String] A custom message about the deprecation - # @attr deprecated [String] A custom message about the deprecation (alias of - # message) - # @attr replacement [String] An optional replacement for the deprecation - # @attr call_site [String] An optional call site from which the deprecation - # was issued - DeprecationNotification = Struct.new(:deprecated, :message, :replacement, :call_site) - class DeprecationNotification - private_class_method :new - - # @api - # Convenience way to initialize the notification - def self.from_hash(data) - new data[:deprecated], data[:message], data[:replacement], data[:call_site] - end - end - - # `NullNotification` represents a placeholder value for notifications that - # currently require no information, but we may wish to extend in future. - class NullNotification - end - - # `CustomNotification` is used when sending custom events to formatters / - # other registered listeners, it creates attributes based on supplied hash - # of options. - class CustomNotification < Struct - # @param options [Hash] A hash of method / value pairs to create on this notification - # @return [CustomNotification] - # - # Build a custom notification based on the supplied option key / values. - def self.for(options={}) - return NullNotification if options.keys.empty? - new(*options.keys).new(*options.values) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/option_parser.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/option_parser.rb deleted file mode 100644 index e239e87..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/option_parser.rb +++ /dev/null @@ -1,325 +0,0 @@ -# http://www.ruby-doc.org/stdlib/libdoc/optparse/rdoc/classes/OptionParser.html -require 'optparse' - -module RSpec::Core - # @private - class Parser - def self.parse(args, source=nil) - new(args).parse(source) - end - - attr_reader :original_args - - def initialize(original_args) - @original_args = original_args - end - - def parse(source=nil) - return { :files_or_directories_to_run => [] } if original_args.empty? - args = original_args.dup - - options = args.delete('--tty') ? { :tty => true } : {} - begin - parser(options).parse!(args) - rescue OptionParser::InvalidOption => e - abort "#{e.message}#{" (defined in #{source})" if source}\n\n" \ - "Please use --help for a listing of valid options" - end - - options[:files_or_directories_to_run] = args - options - end - - private - - # rubocop:disable Metrics/AbcSize - # rubocop:disable Metrics/MethodLength - # rubocop:disable Metrics/CyclomaticComplexity - # rubocop:disable Metrics/PerceivedComplexity - def parser(options) - OptionParser.new do |parser| - parser.summary_width = 34 - - parser.banner = "Usage: rspec [options] [files or directories]\n\n" - - parser.on('-I PATH', 'Specify PATH to add to $LOAD_PATH (may be used more than once).') do |dirs| - options[:libs] ||= [] - options[:libs].concat(dirs.split(File::PATH_SEPARATOR)) - end - - parser.on('-r', '--require PATH', 'Require a file.') do |path| - options[:requires] ||= [] - options[:requires] << path - end - - parser.on('-O', '--options PATH', 'Specify the path to a custom options file.') do |path| - options[:custom_options_file] = path - end - - parser.on('--order TYPE[:SEED]', 'Run examples by the specified order type.', - ' [defined] examples and groups are run in the order they are defined', - ' [rand] randomize the order of groups and examples', - ' [random] alias for rand', - ' [random:SEED] e.g. --order random:123', - ' [recently-modified] run the most recently modified files first') do |o| - options[:order] = o - end - - parser.on('--seed SEED', Integer, 'Equivalent of --order rand:SEED.') do |seed| - options[:order] = "rand:#{seed}" - end - - parser.on('--bisect[=verbose]', 'Repeatedly runs the suite in order to isolate the failures to the ', - ' smallest reproducible case.') do |argument| - options[:bisect] = argument || true - options[:runner] = RSpec::Core::Invocations::Bisect.new - end - - parser.on('--[no-]fail-fast[=COUNT]', 'Abort the run after a certain number of failures (1 by default).') do |argument| - if argument == true - value = 1 - elsif argument == false || argument == 0 - value = false - else - begin - value = Integer(argument) - rescue ArgumentError - RSpec.warning "Expected an integer value for `--fail-fast`, got: #{argument.inspect}", :call_site => nil - end - end - set_fail_fast(options, value) - end - - parser.on('--failure-exit-code CODE', Integer, - 'Override the exit code used when there are failing specs.') do |code| - options[:failure_exit_code] = code - end - - parser.on('--error-exit-code CODE', Integer, - 'Override the exit code used when there are errors loading or running specs outside of examples.') do |code| - options[:error_exit_code] = code - end - - parser.on('-X', '--[no-]drb', 'Run examples via DRb.') do |use_drb| - options[:drb] = use_drb - options[:runner] = RSpec::Core::Invocations::DRbWithFallback.new if use_drb - end - - parser.on('--drb-port PORT', 'Port to connect to the DRb server.') do |o| - options[:drb_port] = o.to_i - end - - parser.separator("\n **** Output ****\n\n") - - parser.on('-f', '--format FORMATTER', 'Choose a formatter.', - ' [p]rogress (default - dots)', - ' [d]ocumentation (group and example names)', - ' [h]tml', - ' [j]son', - ' [f]ailures ("file:line:reason", suitable for editors integration)', - ' custom formatter class name') do |o| - options[:formatters] ||= [] - options[:formatters] << [o] - end - - parser.on('-o', '--out FILE', - 'Write output to a file instead of $stdout. This option applies', - ' to the previously specified --format, or the default format', - ' if no format is specified.' - ) do |o| - options[:formatters] ||= [['progress']] - options[:formatters].last << o - end - - parser.on('--deprecation-out FILE', 'Write deprecation warnings to a file instead of $stderr.') do |file| - options[:deprecation_stream] = file - end - - parser.on('-b', '--backtrace', 'Enable full backtrace.') do |_o| - options[:full_backtrace] = true - end - - parser.on('-c', '--color', '--colour', '') do |_o| - # flag will be excluded from `--help` output because it is deprecated - options[:color] = true - options[:color_mode] = :automatic - end - - parser.on('--force-color', '--force-colour', 'Force the output to be in color, even if the output is not a TTY') do |_o| - if options[:color_mode] == :off - abort "Please only use one of `--force-color` and `--no-color`" - end - options[:color_mode] = :on - end - - parser.on('--no-color', '--no-colour', 'Force the output to not be in color, even if the output is a TTY') do |_o| - if options[:color_mode] == :on - abort "Please only use one of --force-color and --no-color" - end - options[:color_mode] = :off - end - - parser.on('-p', '--[no-]profile [COUNT]', - 'Enable profiling of examples and list the slowest examples (default: 10).') do |argument| - options[:profile_examples] = if argument.nil? - true - elsif argument == false - false - else - begin - Integer(argument) - rescue ArgumentError - RSpec.warning "Non integer specified as profile count, separate " \ - "your path from options with -- e.g. " \ - "`rspec --profile -- #{argument}`", - :call_site => nil - true - end - end - end - - parser.on('--dry-run', 'Print the formatter output of your suite without', - ' running any examples or hooks') do |_o| - options[:dry_run] = true - end - - parser.on('-w', '--warnings', 'Enable ruby warnings') do - if Object.const_defined?(:Warning) && Warning.respond_to?(:[]=) - # :nocov: on older Ruby without Warning - Warning[:deprecated] = true - # :nocov: - end - $VERBOSE = true - end - - parser.separator <<-FILTERING - - **** Filtering/tags **** - - In addition to the following options for selecting specific files, groups, or - examples, you can select individual examples by appending the line number(s) to - the filename: - - rspec path/to/a_spec.rb:37:87 - - You can also pass example ids enclosed in square brackets: - - rspec path/to/a_spec.rb[1:5,1:6] # run the 5th and 6th examples/groups defined in the 1st group - -FILTERING - - parser.on('--only-failures', "Filter to just the examples that failed the last time they ran.") do - configure_only_failures(options) - end - - parser.on("-n", "--next-failure", "Apply `--only-failures` and abort after one failure.", - " (Equivalent to `--only-failures --fail-fast --order defined`)") do - configure_only_failures(options) - set_fail_fast(options, 1) - options[:order] ||= 'defined' - end - - parser.on('-P', '--pattern PATTERN', 'Load files matching pattern (default: "spec/**/*_spec.rb").') do |o| - if options[:pattern] - options[:pattern] += ',' + o - else - options[:pattern] = o - end - end - - parser.on('--exclude-pattern PATTERN', - 'Load files except those matching pattern. Opposite effect of --pattern.') do |o| - options[:exclude_pattern] = o - end - - parser.on('-e', '--example STRING', "Run examples whose full nested names include STRING (may be", - " used more than once)") do |o| - (options[:full_description] ||= []) << Regexp.compile(Regexp.escape(o)) - end - - parser.on('-E', '--example-matches REGEX', "Run examples whose full nested names match REGEX (may be", - " used more than once)") do |o| - (options[:full_description] ||= []) << Regexp.compile(o) - end - - parser.on('-t', '--tag TAG[:VALUE]', - 'Run examples with the specified tag, or exclude examples', - 'by adding ~ before the tag.', - ' - e.g. ~slow', - ' - TAG is always converted to a symbol') do |tag| - filter_type = tag =~ /^~/ ? :exclusion_filter : :inclusion_filter - - name, value = tag.gsub(/^(~@|~|@)/, '').split(':', 2) - name = name.to_sym - - parsed_value = case value - when nil then true # The default value for tags is true - when 'true' then true - when 'false' then false - when 'nil' then nil - when /^:/ then value[1..-1].to_sym - when /^\d+$/ then Integer(value) - when /^\d+.\d+$/ then Float(value) - else - value - end - - add_tag_filter(options, filter_type, name, parsed_value) - end - - parser.on('--default-path PATH', 'Set the default path where RSpec looks for examples (can', - ' be a path to a file or a directory).') do |path| - options[:default_path] = path - end - - parser.separator("\n **** Utility ****\n\n") - - parser.on('--init', 'Initialize your project with RSpec.') do |_cmd| - options[:runner] = RSpec::Core::Invocations::InitializeProject.new - end - - parser.on('-v', '--version', 'Display the version.') do - options[:runner] = RSpec::Core::Invocations::PrintVersion.new - end - - # These options would otherwise be confusing to users, so we forcibly - # prevent them from executing. - # - # * --I is too similar to -I. - # * -d was a shorthand for --debugger, which is removed, but now would - # trigger --default-path. - invalid_options = %w[-d --I] - - hidden_options = invalid_options + %w[-c] - - parser.on_tail('-h', '--help', "You're looking at it.") do - options[:runner] = RSpec::Core::Invocations::PrintHelp.new(parser, hidden_options) - end - - # This prevents usage of the invalid_options. - invalid_options.each do |option| - parser.on(option) do - raise OptionParser::InvalidOption.new - end - end - end - end - # rubocop:enable Metrics/AbcSize - # rubocop:enable Metrics/MethodLength - # rubocop:enable Metrics/CyclomaticComplexity - # rubocop:enable Metrics/PerceivedComplexity - - def add_tag_filter(options, filter_type, tag_name, value=true) - (options[filter_type] ||= {})[tag_name] = value - end - - def set_fail_fast(options, value) - options[:fail_fast] = value - end - - def configure_only_failures(options) - options[:only_failures] = true - add_tag_filter(options, :inclusion_filter, :last_run_status, 'failed') - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/ordering.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/ordering.rb deleted file mode 100644 index 6058a2f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/ordering.rb +++ /dev/null @@ -1,208 +0,0 @@ -module RSpec - module Core - # @private - module Ordering - # @private - # The default global ordering (defined order). - class Identity - def order(items) - items - end - end - - # @private - # Orders items randomly. - class Random - def initialize(configuration) - @configuration = configuration - @used = false - end - - def used? - @used - end - - def order(items) - @used = true - - seed = @configuration.seed.to_s - items.sort_by { |item| jenkins_hash_digest(seed + item.id) } - end - - private - - # http://en.wikipedia.org/wiki/Jenkins_hash_function - # Jenkins provides a good distribution and is simpler than MD5. - # It's a bit slower than MD5 (primarily because `Digest::MD5` is - # implemented in C) but has the advantage of not requiring us - # to load another part of stdlib, which we try to minimize. - def jenkins_hash_digest(string) - hash = 0 - - string.each_byte do |byte| - hash += byte - hash &= MAX_32_BIT - hash += ((hash << 10) & MAX_32_BIT) - hash &= MAX_32_BIT - hash ^= hash >> 6 - end - - hash += ((hash << 3) & MAX_32_BIT) - hash &= MAX_32_BIT - hash ^= hash >> 11 - hash += ((hash << 15) & MAX_32_BIT) - hash &= MAX_32_BIT - hash - end - - MAX_32_BIT = 4_294_967_295 - end - - # @private - # Orders items by modification time (most recent modified first). - class RecentlyModified - def order(list) - list.sort_by { |item| -File.mtime(item.metadata[:absolute_file_path]).to_i } - end - end - - # @private - # Orders items based on a custom block. - class Custom - def initialize(callable) - @callable = callable - end - - def order(list) - @callable.call(list) - end - end - - # @private - # A strategy which delays looking up the ordering until needed - class Delayed - def initialize(registry, name) - @registry = registry - @name = name - end - - def order(list) - strategy.order(list) - end - - private - - def strategy - @strategy ||= lookup_strategy - end - - def lookup_strategy - raise "Undefined ordering strategy #{@name.inspect}" unless @registry.has_strategy?(@name) - @registry.fetch(@name) - end - end - - # @private - # Stores the different ordering strategies. - class Registry - def initialize(configuration) - @configuration = configuration - @strategies = {} - - register(:random, Random.new(configuration)) - register(:recently_modified, RecentlyModified.new) - - identity = Identity.new - register(:defined, identity) - - # The default global ordering is --defined. - register(:global, identity) - end - - def fetch(name, &fallback) - @strategies.fetch(name, &fallback) - end - - def has_strategy?(name) - @strategies.key?(name) - end - - def register(sym, strategy) - @strategies[sym] = strategy - end - - def used_random_seed? - @strategies[:random].used? - end - end - - # @private - # Manages ordering configuration. - # - # @note This is not intended to be used externally. Use - # the APIs provided by `RSpec::Core::Configuration` instead. - class ConfigurationManager - attr_reader :seed, :ordering_registry - - def initialize - @ordering_registry = Registry.new(self) - @seed = rand(0xFFFF) - @seed_forced = false - @order_forced = false - end - - def seed_used? - ordering_registry.used_random_seed? - end - - def seed=(seed) - return if @seed_forced - register_ordering(:global, ordering_registry.fetch(:random)) - @seed = seed.to_i - end - - def order=(type) - order, seed = type.to_s.split(':') - @seed = seed.to_i if seed - - ordering_name = if order.include?('rand') - :random - elsif order == 'defined' - :defined - elsif order == 'recently-modified' - :recently_modified - else - order.to_sym - end - - if ordering_name - strategy = - if ordering_registry.has_strategy?(ordering_name) - ordering_registry.fetch(ordering_name) - else - Delayed.new(ordering_registry, ordering_name) - end - - register_ordering(:global, strategy) - end - end - - def force(hash) - if hash.key?(:seed) - self.seed = hash[:seed] - @seed_forced = true - @order_forced = true - elsif hash.key?(:order) - self.order = hash[:order] - @order_forced = true - end - end - - def register_ordering(name, strategy=Custom.new(Proc.new { |l| yield l })) - return if @order_forced && name == :global - ordering_registry.register(name, strategy) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/output_wrapper.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/output_wrapper.rb deleted file mode 100644 index 8e07aa8..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/output_wrapper.rb +++ /dev/null @@ -1,29 +0,0 @@ -module RSpec - module Core - # @private - class OutputWrapper - # @private - attr_accessor :output - - # @private - def initialize(output) - @output = output - end - - def respond_to?(name, priv=false) - output.respond_to?(name, priv) - end - - def method_missing(name, *args, &block) - output.__send__(name, *args, &block) - end - - # Redirect calls for IO interface methods - IO.instance_methods(false).each do |method| - define_method(method) do |*args, &block| - output.__send__(method, *args, &block) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/pending.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/pending.rb deleted file mode 100644 index c6c59c1..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/pending.rb +++ /dev/null @@ -1,157 +0,0 @@ -module RSpec - module Core - # Provides methods to mark examples as pending. These methods are available - # to be called from within any example or hook. - module Pending - # Raised in the middle of an example to indicate that it should be marked - # as skipped. - class SkipDeclaredInExample < StandardError - attr_reader :argument - - def initialize(argument) - @argument = argument - end - end - - # If Test::Unit is loaded, we'll use its error as baseclass, so that - # Test::Unit will report unmet RSpec expectations as failures rather than - # errors. - begin - class PendingExampleFixedError < Test::Unit::AssertionFailedError; end - rescue - class PendingExampleFixedError < StandardError; end - end - - # @private - NO_REASON_GIVEN = 'No reason given' - - # @private - NOT_YET_IMPLEMENTED = 'Not yet implemented' - - # @overload pending() - # @overload pending(message) - # - # Marks an example as pending. The rest of the example will still be - # executed, and if it passes the example will fail to indicate that the - # pending can be removed. - # - # @param message [String] optional message to add to the summary report. - # - # @example - # describe "some behaviour" do - # # reported as "Pending: no reason given" - # it "is pending with no message" do - # pending - # raise "broken" - # end - # - # # reported as "Pending: something else getting finished" - # it "is pending with a custom message" do - # pending("something else getting finished") - # raise "broken" - # end - # end - # - # @note When using `pending` inside an example body using this method - # hooks, such as `before(:example)`, have already be run. This means that - # a failure from the code in the `before` hook will prevent the example - # from being considered pending, as the example body would not be - # executed. If you need to consider hooks as pending as well you can use - # the pending metadata as an alternative, e.g. - # `it "does something", pending: "message"`. - def pending(message=nil, &_block) - current_example = RSpec.current_example - - if block_given? - raise ArgumentError, <<-EOS.gsub(/^\s+\|/, '') - |The semantics of `RSpec::Core::Pending#pending` have changed in - |RSpec 3. In RSpec 2.x, it caused the example to be skipped. In - |RSpec 3, the rest of the example is still run but is expected to - |fail, and will be marked as a failure (rather than as pending) if - |the example passes. - | - |Passing a block within an example is now deprecated. Marking the - |example as pending provides the same behavior in RSpec 3 which was - |provided only by the block in RSpec 2.x. - | - |Move the code in the block provided to `pending` into the rest of - |the example body. - | - |Called from #{CallerFilter.first_non_rspec_line}. - | - EOS - elsif current_example - Pending.mark_pending! current_example, message - else - raise "`pending` may not be used outside of examples, such as in " \ - "before(:context). Maybe you want `skip`?" - end - end - - # @overload skip() - # @overload skip(message) - # - # Marks an example as pending and skips execution. - # - # @param message [String] optional message to add to the summary report. - # - # @example - # describe "an example" do - # # reported as "Pending: no reason given" - # it "is skipped with no message" do - # skip - # end - # - # # reported as "Pending: something else getting finished" - # it "is skipped with a custom message" do - # skip "something else getting finished" - # end - # end - def skip(message=nil) - current_example = RSpec.current_example - - Pending.mark_skipped!(current_example, message) if current_example - - raise SkipDeclaredInExample.new(message) - end - - # @private - # - # Mark example as skipped. - # - # @param example [RSpec::Core::Example] the example to mark as skipped - # @param message_or_bool [Boolean, String] the message to use, or true - def self.mark_skipped!(example, message_or_bool) - Pending.mark_pending! example, message_or_bool - example.metadata[:skip] = true - end - - # @private - # - # Mark example as pending. - # - # @param example [RSpec::Core::Example] the example to mark as pending - # @param message_or_bool [Boolean, String] the message to use, or true - def self.mark_pending!(example, message_or_bool) - message = if !message_or_bool || !(String === message_or_bool) - NO_REASON_GIVEN - else - message_or_bool - end - - example.metadata[:pending] = true - example.execution_result.pending_message = message - example.execution_result.pending_fixed = false - end - - # @private - # - # Mark example as fixed. - # - # @param example [RSpec::Core::Example] the example to mark as fixed - def self.mark_fixed!(example) - example.execution_result.pending_fixed = true - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/profiler.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/profiler.rb deleted file mode 100644 index 5e65279..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/profiler.rb +++ /dev/null @@ -1,34 +0,0 @@ -module RSpec - module Core - # @private - class Profiler - NOTIFICATIONS = [:example_group_started, :example_group_finished, :example_started] - - def initialize - @example_groups = Hash.new { |h, k| h[k] = { :count => 0 } } - end - - attr_reader :example_groups - - def example_group_started(notification) - return unless notification.group.top_level? - - @example_groups[notification.group][:start] = Time.now - @example_groups[notification.group][:description] = notification.group.top_level_description - end - - def example_group_finished(notification) - return unless notification.group.top_level? - - group = @example_groups[notification.group] - return unless group.key?(:start) - group[:total_time] = Time.now - group[:start] - end - - def example_started(notification) - group = notification.example.example_group.parent_groups.last - @example_groups[group][:count] += 1 - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer.rb deleted file mode 100644 index ca707e0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer.rb +++ /dev/null @@ -1,48 +0,0 @@ -RSpec::Support.require_rspec_support "directory_maker" - -module RSpec - module Core - # @private - # Generates conventional files for an RSpec project. - class ProjectInitializer - attr_reader :destination, :stream, :template_path - - DOT_RSPEC_FILE = '.rspec' - SPEC_HELPER_FILE = 'spec/spec_helper.rb' - - def initialize(opts={}) - @destination = opts.fetch(:destination, Dir.getwd) - @stream = opts.fetch(:report_stream, $stdout) - @template_path = opts.fetch(:template_path) do - File.expand_path("../project_initializer", __FILE__) - end - end - - def run - copy_template DOT_RSPEC_FILE - copy_template SPEC_HELPER_FILE - end - - private - - def copy_template(file) - destination_file = File.join(destination, file) - return report_exists(file) if File.exist?(destination_file) - - report_creating(file) - RSpec::Support::DirectoryMaker.mkdir_p(File.dirname(destination_file)) - File.open(destination_file, 'w') do |f| - f.write File.read(File.join(template_path, file)) - end - end - - def report_exists(file) - stream.puts " exist #{file}" - end - - def report_creating(file) - stream.puts " create #{file}" - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer/.rspec b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer/.rspec deleted file mode 100644 index c99d2e7..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer/.rspec +++ /dev/null @@ -1 +0,0 @@ ---require spec_helper diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer/spec/spec_helper.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer/spec/spec_helper.rb deleted file mode 100644 index c80d44b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/project_initializer/spec/spec_helper.rb +++ /dev/null @@ -1,98 +0,0 @@ -# This file was generated by the `rspec --init` command. Conventionally, all -# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. -# The generated `.rspec` file contains `--require spec_helper` which will cause -# this file to always be loaded, without a need to explicitly require it in any -# files. -# -# Given that it is always loaded, you are encouraged to keep this file as -# light-weight as possible. Requiring heavyweight dependencies from this file -# will add to the boot time of your test suite on EVERY test run, even for an -# individual file that may not need all of that loaded. Instead, consider making -# a separate helper file that requires the additional dependencies and performs -# the additional setup, and require it from the spec files that actually need -# it. -# -# See https://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration -RSpec.configure do |config| - # rspec-expectations config goes here. You can use an alternate - # assertion/expectation library such as wrong or the stdlib/minitest - # assertions if you prefer. - config.expect_with :rspec do |expectations| - # This option will default to `true` in RSpec 4. It makes the `description` - # and `failure_message` of custom matchers include text for helper methods - # defined using `chain`, e.g.: - # be_bigger_than(2).and_smaller_than(4).description - # # => "be bigger than 2 and smaller than 4" - # ...rather than: - # # => "be bigger than 2" - expectations.include_chain_clauses_in_custom_matcher_descriptions = true - end - - # rspec-mocks config goes here. You can use an alternate test double - # library (such as bogus or mocha) by changing the `mock_with` option here. - config.mock_with :rspec do |mocks| - # Prevents you from mocking or stubbing a method that does not exist on - # a real object. This is generally recommended, and will default to - # `true` in RSpec 4. - mocks.verify_partial_doubles = true - end - - # This option will default to `:apply_to_host_groups` in RSpec 4 (and will - # have no way to turn it off -- the option exists only for backwards - # compatibility in RSpec 3). It causes shared context metadata to be - # inherited by the metadata hash of host groups and examples, rather than - # triggering implicit auto-inclusion in groups with matching metadata. - config.shared_context_metadata_behavior = :apply_to_host_groups - -# The settings below are suggested to provide a good initial experience -# with RSpec, but feel free to customize to your heart's content. -=begin - # This allows you to limit a spec run to individual examples or groups - # you care about by tagging them with `:focus` metadata. When nothing - # is tagged with `:focus`, all examples get run. RSpec also provides - # aliases for `it`, `describe`, and `context` that include `:focus` - # metadata: `fit`, `fdescribe` and `fcontext`, respectively. - config.filter_run_when_matching :focus - - # Allows RSpec to persist some state between runs in order to support - # the `--only-failures` and `--next-failure` CLI options. We recommend - # you configure your source control system to ignore this file. - config.example_status_persistence_file_path = "spec/examples.txt" - - # Limits the available syntax to the non-monkey patched syntax that is - # recommended. For more details, see: - # https://rspec.info/features/3-12/rspec-core/configuration/zero-monkey-patching-mode/ - config.disable_monkey_patching! - - # This setting enables warnings. It's recommended, but in some cases may - # be too noisy due to issues in dependencies. - config.warnings = true - - # Many RSpec users commonly either run the entire suite or an individual - # file, and it's useful to allow more verbose output when running an - # individual spec file. - if config.files_to_run.one? - # Use the documentation formatter for detailed output, - # unless a formatter has already been configured - # (e.g. via a command-line flag). - config.default_formatter = "doc" - end - - # Print the 10 slowest examples and example groups at the - # end of the spec run, to help surface which specs are running - # particularly slow. - config.profile_examples = 10 - - # Run specs in random order to surface order dependencies. If you find an - # order dependency and want to debug it, you can fix the order by providing - # the seed, which is printed after each run. - # --seed 1234 - config.order = :random - - # Seed global randomization in this process using the `--seed` CLI option. - # Setting this allows you to use `--seed` to deterministically reproduce - # test failures related to randomization by passing the same `--seed` value - # as the one that triggered the failure. - Kernel.srand config.seed -=end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/rake_task.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/rake_task.rb deleted file mode 100644 index 1b60db0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/rake_task.rb +++ /dev/null @@ -1,190 +0,0 @@ -require 'rake' -require 'rake/tasklib' -require 'rspec/support' - -RSpec::Support.require_rspec_support "ruby_features" - -# :nocov: -unless RSpec::Support.respond_to?(:require_rspec_core) - RSpec::Support.define_optimized_require_for_rspec(:core) { |f| require_relative "../#{f}" } -end -# :nocov: - -RSpec::Support.require_rspec_core "shell_escape" - -module RSpec - module Core - # RSpec rake task - # - # @see Rakefile - class RakeTask < ::Rake::TaskLib - include ::Rake::DSL if defined?(::Rake::DSL) - include RSpec::Core::ShellEscape - - # Default path to the RSpec executable. - DEFAULT_RSPEC_PATH = File.expand_path('../../../../exe/rspec', __FILE__) - - # Default pattern for spec files. - DEFAULT_PATTERN = 'spec/**{,/*/**}/*_spec.rb' - - # Name of task. Defaults to `:spec`. - attr_accessor :name - - # Files matching this pattern will be loaded. - # Defaults to `'spec/**{,/*/**}/*_spec.rb'`. - attr_accessor :pattern - - # Files matching this pattern will be excluded. - # Defaults to `nil`. - attr_accessor :exclude_pattern - - # Whether or not to fail Rake when an error occurs (typically when - # examples fail). Defaults to `true`. - attr_accessor :fail_on_error - - # A message to print to stderr when there are failures. - attr_accessor :failure_message - - if RUBY_VERSION < "1.9.0" || Support::Ruby.jruby? - # Run RSpec with a clean (empty) environment is not supported - # :nocov: - def with_clean_environment=(_value) - raise ArgumentError, "Running in a clean environment is not supported on Ruby versions before 1.9.0" - end - - # Run RSpec with a clean (empty) environment is not supported - def with_clean_environment - false - end - # :nocov: - else - # Run RSpec with a clean (empty) environment. - attr_accessor :with_clean_environment - end - - # Use verbose output. If this is set to true, the task will print the - # executed spec command to stdout. Defaults to `true`. - attr_accessor :verbose - - # Command line options to pass to ruby. Defaults to `nil`. - attr_accessor :ruby_opts - - # Path to RSpec. Defaults to the absolute path to the - # rspec binary from the loaded rspec-core gem. - attr_accessor :rspec_path - - # Command line options to pass to RSpec. Defaults to `nil`. - attr_accessor :rspec_opts - - def initialize(*args, &task_block) - @name = args.shift || :spec - @ruby_opts = nil - @rspec_opts = nil - @verbose = true - @fail_on_error = true - @rspec_path = DEFAULT_RSPEC_PATH - @pattern = DEFAULT_PATTERN - - define(args, &task_block) - end - - # @private - def run_task(verbose) - command = spec_command - puts command if verbose - - if with_clean_environment - return if system({}, command, :unsetenv_others => true) - else - return if system(command) - end - - puts failure_message if failure_message - - return unless fail_on_error - $stderr.puts "#{command} failed" if verbose - exit $?.exitstatus || 1 - end - - private - - # @private - def define(args, &task_block) - desc "Run RSpec code examples" unless ::Rake.application.last_description - - task name, *args do |_, task_args| - RakeFileUtils.__send__(:verbose, verbose) do - task_block.call(*[self, task_args].slice(0, task_block.arity)) if task_block - run_task verbose - end - end - end - - def file_inclusion_specification - if ENV['SPEC'] - FileList[ENV['SPEC']].sort - elsif String === pattern && !File.exist?(pattern) - return if [*rspec_opts].any? { |opt| opt =~ /--pattern/ } - "--pattern #{escape pattern}" - else - # Before RSpec 3.1, we used `FileList` to get the list of matched - # files, and then pass that along to the `rspec` command. Starting - # with 3.1, we prefer to pass along the pattern as-is to the `rspec` - # command, for 3 reasons: - # - # * It's *much* less verbose to pass one `--pattern` option than a - # long list of files. - # * It ensures `task.pattern` and `--pattern` have the same - # behavior. - # * It fixes a bug, where - # `task.pattern = pattern_that_matches_no_files` would run *all* - # files because it would cause no pattern or file args to get - # passed to `rspec`, which causes all files to get run. - # - # However, `FileList` is *far* more flexible than the `--pattern` - # option. Specifically, it supports individual files and directories, - # as well as arrays of files, directories and globs, as well as other - # `FileList` objects. - # - # For backwards compatibility, we have to fall back to using FileList - # if the user has passed a `pattern` option that will not work with - # `--pattern`. - # - # TODO: consider deprecating support for this and removing it in - # RSpec 4. - FileList[pattern].sort.map { |file| escape file } - end - end - - def file_exclusion_specification - " --exclude-pattern #{escape exclude_pattern}" if exclude_pattern - end - - def spec_command - cmd_parts = [] - cmd_parts << RUBY - cmd_parts << ruby_opts - cmd_parts << rspec_load_path - cmd_parts << escape(rspec_path) - cmd_parts << file_inclusion_specification - cmd_parts << file_exclusion_specification - cmd_parts << rspec_opts - cmd_parts.flatten.reject(&blank).join(" ") - end - - def blank - lambda { |s| s.nil? || s == "" } - end - - def rspec_load_path - @rspec_load_path ||= begin - core_and_support = $LOAD_PATH.grep( - /#{File::SEPARATOR}rspec-(core|support)[^#{File::SEPARATOR}]*#{File::SEPARATOR}lib/ - ).uniq - - "-I#{core_and_support.map { |file| escape file }.join(File::PATH_SEPARATOR)}" - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/reporter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/reporter.rb deleted file mode 100644 index d513f3f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/reporter.rb +++ /dev/null @@ -1,266 +0,0 @@ -module RSpec::Core - # A reporter will send notifications to listeners, usually formatters for the - # spec suite run. - class Reporter - # @private - RSPEC_NOTIFICATIONS = Set.new( - [ - :close, :deprecation, :deprecation_summary, :dump_failures, :dump_pending, - :dump_profile, :dump_summary, :example_failed, :example_group_finished, - :example_group_started, :example_passed, :example_pending, :example_started, - :message, :seed, :start, :start_dump, :stop, :example_finished - ]) - - def initialize(configuration) - @configuration = configuration - @listeners = Hash.new { |h, k| h[k] = Set.new } - @examples = [] - @failed_examples = [] - @pending_examples = [] - @duration = @start = @load_time = nil - @non_example_exception_count = 0 - @setup_default = lambda {} - @setup = false - @profiler = nil - end - - # @private - attr_reader :examples, :failed_examples, :pending_examples - - # Registers a listener to a list of notifications. The reporter will send - # notification of events to all registered listeners. - # - # @param listener [Object] An object that wishes to be notified of reporter - # events - # @param notifications [Array] Array of symbols represents the events a - # listener wishes to subscribe too - def register_listener(listener, *notifications) - notifications.each do |notification| - @listeners[notification.to_sym] << listener - end - true - end - - # @private - def prepare_default(loader, output_stream, deprecation_stream) - @setup_default = lambda do - loader.setup_default output_stream, deprecation_stream - end - end - - # @private - def registered_listeners(notification) - @listeners[notification].to_a - end - - # @overload report(count, &block) - # @overload report(count, &block) - # @param expected_example_count [Integer] the number of examples being run - # @yield [Block] block yields itself for further reporting. - # - # Initializes the report run and yields itself for further reporting. The - # block is required, so that the reporter can manage cleaning up after the - # run. - # - # @example - # - # reporter.report(group.examples.size) do |r| - # example_groups.map {|g| g.run(r) } - # end - # - def report(expected_example_count) - start(expected_example_count) - begin - yield self - ensure - finish - end - end - - # @param exit_code [Integer] the exit_code to be return by the reporter - # - # Reports a run that exited early without having run any examples. - # - def exit_early(exit_code) - report(0) { exit_code } - end - - # @private - def start(expected_example_count, time=RSpec::Core::Time.now) - @start = time - @load_time = (@start - @configuration.start_time).to_f - notify :seed, Notifications::SeedNotification.new(@configuration.seed, seed_used?) - notify :start, Notifications::StartNotification.new(expected_example_count, @load_time) - end - - # @param message [#to_s] A message object to send to formatters - # - # Send a custom message to supporting formatters. - def message(message) - notify :message, Notifications::MessageNotification.new(message) - end - - # @param event [Symbol] Name of the custom event to trigger on formatters - # @param options [Hash] Hash of arguments to provide via `CustomNotification` - # - # Publish a custom event to supporting registered formatters. - # @see RSpec::Core::Notifications::CustomNotification - def publish(event, options={}) - if RSPEC_NOTIFICATIONS.include? event - raise "RSpec::Core::Reporter#publish is intended for sending custom " \ - "events not internal RSpec ones, please rename your custom event." - end - notify event, Notifications::CustomNotification.for(options) - end - - # @private - def example_group_started(group) - notify :example_group_started, Notifications::GroupNotification.new(group) unless group.descendant_filtered_examples.empty? - end - - # @private - def example_group_finished(group) - notify :example_group_finished, Notifications::GroupNotification.new(group) unless group.descendant_filtered_examples.empty? - end - - # @private - def example_started(example) - @examples << example - notify :example_started, Notifications::ExampleNotification.for(example) - end - - # @private - def example_finished(example) - notify :example_finished, Notifications::ExampleNotification.for(example) - end - - # @private - def example_passed(example) - notify :example_passed, Notifications::ExampleNotification.for(example) - end - - # @private - def example_failed(example) - @failed_examples << example - notify :example_failed, Notifications::ExampleNotification.for(example) - end - - # @private - def example_pending(example) - @pending_examples << example - notify :example_pending, Notifications::ExampleNotification.for(example) - end - - # @private - def deprecation(hash) - notify :deprecation, Notifications::DeprecationNotification.from_hash(hash) - end - - # @private - # Provides a way to notify of an exception that is not tied to any - # particular example (such as an exception encountered in a :suite hook). - # Exceptions will be formatted the same way they normally are. - def notify_non_example_exception(exception, context_description) - @configuration.world.non_example_failure = true - @non_example_exception_count += 1 - - example = Example.new(AnonymousExampleGroup, context_description, {}) - presenter = Formatters::ExceptionPresenter.new(exception, example, :indentation => 0) - message presenter.fully_formatted(nil) - end - - # @private - def finish - close_after do - examples_notification = Notifications::ExamplesNotification.new(self) - stop(examples_notification) - notify :start_dump, Notifications::NullNotification - notify :dump_pending, examples_notification - notify :dump_failures, examples_notification - notify :deprecation_summary, Notifications::NullNotification - unless mute_profile_output? - notify :dump_profile, Notifications::ProfileNotification.new(@duration, @examples, - @configuration.profile_examples, - @profiler.example_groups) - end - notify :dump_summary, Notifications::SummaryNotification.new(@duration, @examples, @failed_examples, - @pending_examples, @load_time, - @non_example_exception_count) - notify :seed, Notifications::SeedNotification.new(@configuration.seed, seed_used?) - end - end - - # @private - def close_after - yield - ensure - close - end - - # @private - def stop(notification) - @duration = (RSpec::Core::Time.now - @start).to_f if @start - notify :stop, notification - end - - # @private - def notify(event, notification) - ensure_listeners_ready - registered_listeners(event).each do |formatter| - formatter.__send__(event, notification) - end - end - - # @private - def abort_with(msg, exit_status) - message(msg) - close - exit!(exit_status) - end - - # @private - def fail_fast_limit_met? - return false unless (fail_fast = @configuration.fail_fast) - - if fail_fast == true - @failed_examples.any? - else - fail_fast <= @failed_examples.size - end - end - - private - - def ensure_listeners_ready - return if @setup - - @setup_default.call - @profiler = Profiler.new - register_listener @profiler, *Profiler::NOTIFICATIONS - @setup = true - end - - def close - notify :close, Notifications::NullNotification - end - - def mute_profile_output? - # Don't print out profiled info if there are failures and `--fail-fast` is - # used, it just clutters the output. - !@configuration.profile_examples? || fail_fast_limit_met? - end - - def seed_used? - @configuration.seed && @configuration.seed_used? - end - end - - # @private - # # Used in place of a {Reporter} for situations where we don't want reporting output. - class NullReporter - def self.method_missing(*) - # ignore - end - private_class_method :method_missing - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/ruby_project.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/ruby_project.rb deleted file mode 100644 index 156f89b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/ruby_project.rb +++ /dev/null @@ -1,53 +0,0 @@ -# This is borrowed (slightly modified) from Scott Taylor's -# project_path project: -# http://github.com/smtlaissezfaire/project_path -module RSpec - module Core - # @private - module RubyProject - def add_to_load_path(*dirs) - dirs.each { |dir| add_dir_to_load_path(File.join(root, dir)) } - end - - def add_dir_to_load_path(dir) - $LOAD_PATH.unshift(dir) unless $LOAD_PATH.include?(dir) - end - - def root - @project_root ||= determine_root - end - - def determine_root - find_first_parent_containing('spec') || '.' - end - - def find_first_parent_containing(dir) - ascend_until { |path| File.exist?(File.join(path, dir)) } - end - - def ascend_until - fs = File::SEPARATOR - escaped_slash = "\\#{fs}" - special = "_RSPEC_ESCAPED_SLASH_" - project_path = File.expand_path(".") - parts = project_path.gsub(escaped_slash, special).squeeze(fs).split(fs).map do |x| - x.gsub(special, escaped_slash) - end - - until parts.empty? - path = parts.join(fs) - path = fs if path == "" - return path if yield(path) - parts.pop - end - end - - module_function :add_to_load_path - module_function :add_dir_to_load_path - module_function :root - module_function :determine_root - module_function :find_first_parent_containing - module_function :ascend_until - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/runner.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/runner.rb deleted file mode 100644 index 16d07ef..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/runner.rb +++ /dev/null @@ -1,216 +0,0 @@ -module RSpec - module Core - # Provides the main entry point to run a suite of RSpec examples. - class Runner - # @attr_reader - # @private - attr_reader :options, :configuration, :world - - # Register an `at_exit` hook that runs the suite when the process exits. - # - # @note This is not generally needed. The `rspec` command takes care - # of running examples for you without involving an `at_exit` - # hook. This is only needed if you are running specs using - # the `ruby` command, and even then, the normal way to invoke - # this is by requiring `rspec/autorun`. - def self.autorun - if autorun_disabled? - RSpec.deprecate("Requiring `rspec/autorun` when running RSpec via the `rspec` command") - return - elsif installed_at_exit? || running_in_drb? - return - end - - at_exit { perform_at_exit } - @installed_at_exit = true - end - - # @private - def self.perform_at_exit - # Don't bother running any specs and just let the program terminate - # if we got here due to an unrescued exception (anything other than - # SystemExit, which is raised when somebody calls Kernel#exit). - return unless $!.nil? || $!.is_a?(SystemExit) - - # We got here because either the end of the program was reached or - # somebody called Kernel#exit. Run the specs and then override any - # existing exit status with RSpec's exit status if any specs failed. - invoke - end - - # Runs the suite of specs and exits the process with an appropriate exit - # code. - def self.invoke - disable_autorun! - status = run(ARGV, $stderr, $stdout).to_i - exit(status) if status != 0 - end - - # Run a suite of RSpec examples. Does not exit. - # - # This is used internally by RSpec to run a suite, but is available - # for use by any other automation tool. - # - # If you want to run this multiple times in the same process, and you - # want files like `spec_helper.rb` to be reloaded, be sure to load `load` - # instead of `require`. - # - # @param args [Array] command-line-supported arguments - # @param err [IO] error stream - # @param out [IO] output stream - # @return [Fixnum] exit status code. 0 if all specs passed, - # or the configured failure exit code (1 by default) if specs - # failed. - def self.run(args, err=$stderr, out=$stdout) - trap_interrupt - options = ConfigurationOptions.new(args) - - if options.options[:runner] - options.options[:runner].call(options, err, out) - else - new(options).run(err, out) - end - end - - def initialize(options, configuration=RSpec.configuration, world=RSpec.world) - @options = options - @configuration = configuration - @world = world - end - - # Configures and runs a spec suite. - # - # @param err [IO] error stream - # @param out [IO] output stream - def run(err, out) - setup(err, out) - return @configuration.reporter.exit_early(exit_code) if RSpec.world.wants_to_quit - - run_specs(@world.ordered_example_groups).tap do - persist_example_statuses - end - end - - # Wires together the various configuration objects and state holders. - # - # @param err [IO] error stream - # @param out [IO] output stream - def setup(err, out) - configure(err, out) - return if RSpec.world.wants_to_quit - - @configuration.load_spec_files - ensure - @world.announce_filters - end - - # Runs the provided example groups. - # - # @param example_groups [Array] groups to run - # @return [Fixnum] exit status code. 0 if all specs passed, - # or the configured failure exit code (1 by default) if specs - # failed. - def run_specs(example_groups) - examples_count = @world.example_count(example_groups) - examples_passed = @configuration.reporter.report(examples_count) do |reporter| - @configuration.with_suite_hooks do - if examples_count == 0 && @configuration.fail_if_no_examples - return @configuration.failure_exit_code - end - - example_groups.map { |g| g.run(reporter) }.all? - end - end - - exit_code(examples_passed) - end - - # @private - def configure(err, out) - @configuration.error_stream = err - @configuration.output_stream = out if @configuration.output_stream == $stdout - @options.configure(@configuration) - end - - # @private - def self.disable_autorun! - @autorun_disabled = true - end - - # @private - def self.autorun_disabled? - @autorun_disabled ||= false - end - - # @private - def self.installed_at_exit? - @installed_at_exit ||= false - end - - # @private - def self.running_in_drb? - return false unless defined?(DRb) - - server = begin - DRb.current_server - rescue DRb::DRbServerNotFound - return false - end - - return false unless server && server.alive? - - require 'socket' - require 'uri' - - local_ipv4 = begin - IPSocket.getaddress(Socket.gethostname) - rescue SocketError - return false - end - - ["127.0.0.1", "localhost", local_ipv4].any? { |addr| addr == URI(DRb.current_server.uri).host } - end - - # @private - def self.trap_interrupt - trap('INT') { handle_interrupt } - end - - # @private - def self.handle_interrupt - if RSpec.world.wants_to_quit - exit!(1) - else - RSpec.world.wants_to_quit = true - - $stderr.puts( - "\nRSpec is shutting down and will print the summary report... Interrupt again to force quit " \ - "(warning: at_exit hooks will be skipped if you force quit)." - ) - end - end - - # @private - def exit_code(examples_passed=false) - return @configuration.error_exit_code || @configuration.failure_exit_code if @world.non_example_failure - return @configuration.failure_exit_code unless examples_passed - - 0 - end - - private - - def persist_example_statuses - return if @configuration.dry_run - return unless (path = @configuration.example_status_persistence_file_path) - - ExampleStatusPersister.persist(@world.all_examples, path) - rescue SystemCallError => e - RSpec.warning "Could not write example statuses to #{path} (configured as " \ - "`config.example_status_persistence_file_path`) due to a " \ - "system error: #{e.inspect}. Please check that the config " \ - "option is set to an accessible, valid file path", :call_site => nil - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/sandbox.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/sandbox.rb deleted file mode 100644 index e7d518c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/sandbox.rb +++ /dev/null @@ -1,37 +0,0 @@ -module RSpec - module Core - # A sandbox isolates the enclosed code into an environment that looks 'new' - # meaning globally accessed objects are reset for the duration of the - # sandbox. - # - # @note This module is not normally available. You must require - # `rspec/core/sandbox` to load it. - module Sandbox - # Execute a provided block with RSpec global objects (configuration, - # world) reset. This is used to test RSpec with RSpec. - # - # When calling this the configuration is passed into the provided block. - # Use this to set custom configs for your sandboxed examples. - # - # ``` - # Sandbox.sandboxed do |config| - # config.before(:context) { RSpec.current_example = nil } - # end - # ``` - def self.sandboxed - orig_config = RSpec.configuration - orig_world = RSpec.world - orig_example = RSpec.current_example - - RSpec.configuration = RSpec::Core::Configuration.new - RSpec.world = RSpec::Core::World.new(RSpec.configuration) - - yield RSpec.configuration - ensure - RSpec.configuration = orig_config - RSpec.world = orig_world - RSpec.current_example = orig_example - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/set.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/set.rb deleted file mode 100644 index ae97810..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/set.rb +++ /dev/null @@ -1,54 +0,0 @@ -module RSpec - module Core - # @private - # - # We use this to replace `::Set` so we can have the advantage of - # constant time key lookups for unique arrays but without the - # potential to pollute a developers environment with an extra - # piece of the stdlib. This helps to prevent false positive - # builds. - # - class Set - include Enumerable - - def initialize(array=[]) - @values = {} - merge(array) - end - - def empty? - @values.empty? - end - - def <<(key) - @values[key] = true - self - end - - def delete(key) - @values.delete(key) - end - - def each(&block) - @values.keys.each(&block) - self - end - - def include?(key) - @values.key?(key) - end - - def merge(values) - values.each do |key| - @values[key] = true - end - self - end - - def clear - @values.clear - self - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shared_context.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shared_context.rb deleted file mode 100644 index 6de7f64..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shared_context.rb +++ /dev/null @@ -1,55 +0,0 @@ -module RSpec - module Core - # Exposes {ExampleGroup}-level methods to a module, so you can include that - # module in an {ExampleGroup}. - # - # @example - # - # module LoggedInAsAdmin - # extend RSpec::Core::SharedContext - # before(:example) do - # log_in_as :admin - # end - # end - # - # describe "admin section" do - # include LoggedInAsAdmin - # # ... - # end - module SharedContext - # @private - def included(group) - __shared_context_recordings.each do |recording| - recording.playback_onto(group) - end - end - - # @private - def __shared_context_recordings - @__shared_context_recordings ||= [] - end - - # @private - Recording = Struct.new(:method_name, :args, :block) do - def playback_onto(group) - group.__send__(method_name, *args, &block) - end - end - - # @private - def self.record(methods) - methods.each do |meth| - define_method(meth) do |*args, &block| - __shared_context_recordings << Recording.new(meth, args, block) - end - end - end - - # @private - record [:describe, :context] + Hooks.instance_methods(false) + - MemoizedHelpers::ClassMethods.instance_methods(false) - end - end - # @private - SharedContext = Core::SharedContext -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shared_example_group.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shared_example_group.rb deleted file mode 100644 index 3d9efce..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shared_example_group.rb +++ /dev/null @@ -1,271 +0,0 @@ -RSpec::Support.require_rspec_support "with_keywords_when_needed" - -module RSpec - module Core - # Represents some functionality that is shared with multiple example groups. - # The functionality is defined by the provided block, which is lazily - # eval'd when the `SharedExampleGroupModule` instance is included in an example - # group. - class SharedExampleGroupModule < Module - # @private - attr_reader :definition - - def initialize(description, definition, metadata) - @description = description - @definition = definition - @metadata = metadata - end - - # Provides a human-readable representation of this module. - def inspect - "#<#{self.class.name} #{@description.inspect}>" - end - alias to_s inspect - - # Ruby callback for when a module is included in another module is class. - # Our definition evaluates the shared group block in the context of the - # including example group. - def included(klass) - inclusion_line = klass.metadata[:location] - include_in klass, inclusion_line, [], nil - end - - # @private - def include_in(klass, inclusion_line, args, customization_block) - klass.update_inherited_metadata(@metadata) unless @metadata.empty? - - SharedExampleGroupInclusionStackFrame.with_frame(@description, inclusion_line) do - RSpec::Support::WithKeywordsWhenNeeded.class_exec(klass, *args, &@definition) - klass.class_exec(&customization_block) if customization_block - end - end - end - - # Shared example groups let you define common context and/or common - # examples that you wish to use in multiple example groups. - # - # When defined, the shared group block is stored for later evaluation. - # It can later be included in an example group either explicitly - # (using `include_examples`, `include_context` or `it_behaves_like`) - # or implicitly (via matching metadata). - # - # Named shared example groups are scoped based on where they are - # defined. Shared groups defined in an example group are available - # for inclusion in that example group or any child example groups, - # but not in any parent or sibling example groups. Shared example - # groups defined at the top level can be included from any example group. - module SharedExampleGroup - # @overload shared_examples(name, &block) - # @param name [String, Symbol, Module] identifer to use when looking up - # this shared group - # @param block The block to be eval'd - # @overload shared_examples(name, metadata, &block) - # @param name [String, Symbol, Module] identifer to use when looking up - # this shared group - # @param metadata [Array, Hash] metadata to attach to this - # group; any example group or example with matching metadata will - # automatically include this shared example group. - # @param block The block to be eval'd - # - # Stores the block for later use. The block will be evaluated - # in the context of an example group via `include_examples`, - # `include_context`, or `it_behaves_like`. - # - # @example - # shared_examples "auditable" do - # it "stores an audit record on save!" do - # expect { auditable.save! }.to change(Audit, :count).by(1) - # end - # end - # - # RSpec.describe Account do - # it_behaves_like "auditable" do - # let(:auditable) { Account.new } - # end - # end - # - # @see ExampleGroup.it_behaves_like - # @see ExampleGroup.include_examples - # @see ExampleGroup.include_context - def shared_examples(name, *args, &block) - top_level = self == ExampleGroup - if top_level && RSpec::Support.thread_local_data[:in_example_group] - raise "Creating isolated shared examples from within a context is " \ - "not allowed. Remove `RSpec.` prefix or move this to a " \ - "top-level scope." - end - - RSpec.world.shared_example_group_registry.add(self, name, *args, &block) - end - alias shared_context shared_examples - alias shared_examples_for shared_examples - - # @api private - # - # Shared examples top level DSL. - module TopLevelDSL - # @private - def self.definitions - proc do - def shared_examples(name, *args, &block) - RSpec.world.shared_example_group_registry.add(:main, name, *args, &block) - end - alias shared_context shared_examples - alias shared_examples_for shared_examples - end - end - - # @private - def self.exposed_globally? - @exposed_globally ||= false - end - - # @api private - # - # Adds the top level DSL methods to Module and the top level binding. - def self.expose_globally! - return if exposed_globally? - Core::DSL.change_global_dsl(&definitions) - @exposed_globally = true - end - - # @api private - # - # Removes the top level DSL methods to Module and the top level binding. - def self.remove_globally! - return unless exposed_globally? - - Core::DSL.change_global_dsl do - undef shared_examples - undef shared_context - undef shared_examples_for - end - - @exposed_globally = false - end - end - - # @private - class Registry - def add(context, name, *metadata_args, &block) - unless block - RSpec.warning "Shared example group #{name} was defined without a "\ - "block and will have no effect. Please define a "\ - "block or remove the definition." - end - - if RSpec.configuration.shared_context_metadata_behavior == :trigger_inclusion - return legacy_add(context, name, *metadata_args, &block) - end - - unless valid_name?(name) - raise ArgumentError, "Shared example group names can only be a string, " \ - "symbol or module but got: #{name.inspect}" - end - - ensure_block_has_source_location(block) { CallerFilter.first_non_rspec_line } - warn_if_key_taken context, name, block - - metadata = Metadata.build_hash_from(metadata_args) - shared_module = SharedExampleGroupModule.new(name, block, metadata) - shared_example_groups[context][name] = shared_module - end - - def find(lookup_contexts, name) - lookup_contexts.each do |context| - found = shared_example_groups[context][name] - return found if found - end - - shared_example_groups[:main][name] - end - - private - - # TODO: remove this in RSpec 4. This exists only to support - # `config.shared_context_metadata_behavior == :trigger_inclusion`, - # the legacy behavior of shared context metadata, which we do - # not want to support in RSpec 4. - def legacy_add(context, name, *metadata_args, &block) - ensure_block_has_source_location(block) { CallerFilter.first_non_rspec_line } - shared_module = SharedExampleGroupModule.new(name, block, {}) - - if valid_name?(name) - warn_if_key_taken context, name, block - shared_example_groups[context][name] = shared_module - else - metadata_args.unshift name - end - - return if metadata_args.empty? - RSpec.configuration.include shared_module, *metadata_args - end - - def shared_example_groups - @shared_example_groups ||= Hash.new { |hash, context| hash[context] = {} } - end - - def valid_name?(candidate) - case candidate - when String, Symbol, Module then true - else false - end - end - - def warn_if_key_taken(context, key, new_block) - existing_module = shared_example_groups[context][key] - return unless existing_module - - old_definition_location = formatted_location existing_module.definition - new_definition_location = formatted_location new_block - loaded_spec_files = RSpec.configuration.loaded_spec_files - - if loaded_spec_files.include?(new_definition_location) && old_definition_location == new_definition_location - RSpec.warn_with <<-WARNING.gsub(/^ +\|/, ''), :call_site => nil - |WARNING: Your shared example group, '#{key}', defined at: - | #{old_definition_location} - |was automatically loaded by RSpec because the file name - |matches the configured autoloading pattern (#{RSpec.configuration.pattern}), - |and is also being required from somewhere else. To fix this - |warning, either rename the file to not match the pattern, or - |do not explicitly require the file. - WARNING - else - RSpec.warn_with <<-WARNING.gsub(/^ +\|/, ''), :call_site => nil - |WARNING: Shared example group '#{key}' has been previously defined at: - | #{old_definition_location} - |...and you are now defining it at: - | #{new_definition_location} - |The new definition will overwrite the original one. - WARNING - end - end - - if RUBY_VERSION.to_f >= 1.9 - def formatted_location(block) - block.source_location.join(":") - end - else # 1.8.7 - # :nocov: - def formatted_location(block) - block.source_location.join(":").gsub(/:in.*$/, '') - end - # :nocov: - end - - if Proc.method_defined?(:source_location) - def ensure_block_has_source_location(_block); end - else # for 1.8.7 - # :nocov: - def ensure_block_has_source_location(block) - source_location = yield.split(':') - block.extend(Module.new { define_method(:source_location) { source_location } }) - end - # :nocov: - end - end - end - end - - instance_exec(&Core::SharedExampleGroup::TopLevelDSL.definitions) -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shell_escape.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shell_escape.rb deleted file mode 100644 index a92feae..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/shell_escape.rb +++ /dev/null @@ -1,49 +0,0 @@ -module RSpec - module Core - # @private - # Deals with the fact that `shellwords` only works on POSIX systems. - module ShellEscape - module_function - - def quote(argument) - "'#{argument.to_s.gsub("'", "\\\\'")}'" - end - - if RSpec::Support::OS.windows? - # :nocov: - alias escape quote - # :nocov: - else - require 'shellwords' - - def escape(shell_command) - Shellwords.escape(shell_command.to_s) - end - end - - # Known shells that require quoting: zsh, csh, tcsh. - # - # Feel free to add other shells to this list that are known to - # allow `rspec ./some_spec.rb[1:1]` syntax without quoting the id. - # - # @private - SHELLS_ALLOWING_UNQUOTED_IDS = %w[ bash ksh fish ] - - def conditionally_quote(id) - return id if shell_allows_unquoted_ids? - quote(id) - end - - def shell_allows_unquoted_ids? - # Note: ENV['SHELL'] isn't necessarily the shell the user is currently running. - # According to http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html: - # "This variable shall represent a pathname of the user's preferred command language interpreter." - # - # It's the best we can easily do, though. We err on the side of safety (quoting - # the id when not actually needed) so it's not a big deal if the user is actually - # using a different shell. - SHELLS_ALLOWING_UNQUOTED_IDS.include?(ENV['SHELL'].to_s.split('/').last) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/test_unit_assertions_adapter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/test_unit_assertions_adapter.rb deleted file mode 100644 index d84ecb1..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/test_unit_assertions_adapter.rb +++ /dev/null @@ -1,30 +0,0 @@ -require 'test/unit/assertions' - -module RSpec - module Core - # @private - module TestUnitAssertionsAdapter - include ::Test::Unit::Assertions - - # If using test/unit from Ruby core with Ruby 1.9+, it includes - # MiniTest::Assertions by default. Note the upcasing of 'Test'. - # - # If the test/unit gem is being loaded, it will not include any minitest - # assertions. - # - # Only if Minitest 5.x is included / loaded do we need to worry about - # adding a shim for the new updates. Thus instead of checking on the - # RUBY_VERSION we need to check ancestors. - begin - # MiniTest is 4.x. - # Minitest is 5.x. - if ancestors.include?(::Minitest::Assertions) - require 'rspec/core/minitest_assertions_adapter' - include ::RSpec::Core::MinitestAssertionsAdapter - end - rescue NameError - # No-op. Minitest 5.x was not loaded. - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/version.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/version.rb deleted file mode 100644 index 29801aa..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/version.rb +++ /dev/null @@ -1,9 +0,0 @@ -module RSpec - module Core - # Version information for RSpec Core. - module Version - # Current version of RSpec Core, in semantic versioning format. - STRING = '3.13.5' - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/warnings.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/warnings.rb deleted file mode 100644 index b880059..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/warnings.rb +++ /dev/null @@ -1,40 +0,0 @@ -require "rspec/support/warnings" - -module RSpec - module Core - # @private - module Warnings - # @private - # - # Used internally to print deprecation warnings. - def deprecate(deprecated, data={}) - RSpec.configuration.reporter.deprecation( - { - :deprecated => deprecated, - :call_site => CallerFilter.first_non_rspec_line - }.merge(data) - ) - end - - # @private - # - # Used internally to print deprecation warnings. - def warn_deprecation(message, opts={}) - RSpec.configuration.reporter.deprecation opts.merge(:message => message) - end - - # @private - def warn_with(message, options={}) - if options[:use_spec_location_as_call_site] - message += "." unless message.end_with?(".") - - if RSpec.current_example - message += " Warning generated from spec at `#{RSpec.current_example.location}`." - end - end - - super(message, options) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/world.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/world.rb deleted file mode 100644 index 6fb4396..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.5/lib/rspec/core/world.rb +++ /dev/null @@ -1,287 +0,0 @@ -module RSpec - module Core - # @api private - # - # Internal container for global non-configuration data. - class World - # @private - attr_reader :example_groups, :filtered_examples, :example_group_counts_by_spec_file - - # Used internally to determine what to do when a SIGINT is received. - attr_accessor :wants_to_quit - - # Used internally to signify that a SystemExit occurred in - # `Configuration#load_file_handling_errors`, and thus examples cannot - # be counted accurately. Specifically, we cannot accurately report - # "No examples found". - # @private - attr_accessor :rspec_is_quitting - - # Used internally to signal that a failure outside of an example - # has occurred, and that therefore the exit status should indicate - # the run failed. - # @private - attr_accessor :non_example_failure - - def initialize(configuration=RSpec.configuration) - @wants_to_quit = false - @rspec_is_quitting = false - @configuration = configuration - configuration.world = self - @example_groups = [] - @example_group_counts_by_spec_file = Hash.new(0) - prepare_example_filtering - end - - # @api public - # - # Prepares filters so that they apply to example groups when they run. - # - # This is a separate method so that filters can be modified/replaced and - # examples refiltered during a process's lifetime, which can be useful for - # a custom runner. - def prepare_example_filtering - @filtered_examples = Hash.new do |hash, group| - hash[group] = filter_manager.prune(group.examples) - end - end - - # @api private - # - # Apply ordering strategy from configuration to example groups. - def ordered_example_groups - ordering_strategy = @configuration.ordering_registry.fetch(:global) - ordering_strategy.order(@example_groups) - end - - # @api private - # - # Reset world to 'scratch' before running suite. - def reset - RSpec::ExampleGroups.remove_all_constants - example_groups.clear - @sources_by_path.clear if defined?(@sources_by_path) - @syntax_highlighter = nil - @example_group_counts_by_spec_file = Hash.new(0) - end - - # @private - def filter_manager - @configuration.filter_manager - end - - # @private - def registered_example_group_files - @example_group_counts_by_spec_file.keys - end - - # @api private - # - # Records an example group. - def record(example_group) - @configuration.on_example_group_definition_callbacks.each { |block| block.call(example_group) } - @example_group_counts_by_spec_file[example_group.metadata[:absolute_file_path]] += 1 - end - - # @private - def num_example_groups_defined_in(file) - @example_group_counts_by_spec_file[file] - end - - # @private - def shared_example_group_registry - @shared_example_group_registry ||= SharedExampleGroup::Registry.new - end - - # @private - def inclusion_filter - @configuration.inclusion_filter - end - - # @private - def exclusion_filter - @configuration.exclusion_filter - end - - # @api private - # - # Get count of examples to be run. - def example_count(groups=example_groups) - FlatMap.flat_map(groups) { |g| g.descendants }. - inject(0) { |a, e| a + e.filtered_examples.size } - end - - # @private - def all_example_groups - FlatMap.flat_map(example_groups) { |g| g.descendants } - end - - # @private - def all_examples - FlatMap.flat_map(all_example_groups) { |g| g.examples } - end - - # @private - # Traverses the tree of each top level group. - # For each it yields the group, then the children, recursively. - # Halts the traversal of a branch of the tree as soon as the passed block returns true. - # Note that siblings groups and their sub-trees will continue to be explored. - # This is intended to make it easy to find the top-most group that satisfies some - # condition. - def traverse_example_group_trees_until(&block) - example_groups.each do |group| - group.traverse_tree_until(&block) - end - end - - # @api private - # - # Find line number of previous declaration. - def preceding_declaration_line(absolute_file_name, filter_line) - line_numbers = descending_declaration_line_numbers_by_file.fetch(absolute_file_name) do - return nil - end - - line_numbers.find { |num| num <= filter_line } - end - - # @private - def reporter - @configuration.reporter - end - - # @private - def source_from_file(path) - unless defined?(@sources_by_path) - RSpec::Support.require_rspec_support 'source' - @sources_by_path = {} - end - - @sources_by_path[path] ||= Support::Source.from_file(path) - end - - # @private - def syntax_highlighter - @syntax_highlighter ||= Formatters::SyntaxHighlighter.new(@configuration) - end - - # @api private - # - # Notify reporter of filters. - def announce_filters - fail_if_config_and_cli_options_invalid - filter_announcements = [] - - announce_inclusion_filter filter_announcements - announce_exclusion_filter filter_announcements - - unless filter_manager.empty? - if filter_announcements.length == 1 - report_filter_message("Run options: #{filter_announcements[0]}") - else - report_filter_message("Run options:\n #{filter_announcements.join("\n ")}") - end - end - - if @configuration.run_all_when_everything_filtered? && example_count.zero? && !@configuration.only_failures? - report_filter_message("#{everything_filtered_message}; ignoring #{inclusion_filter.description}") - filtered_examples.clear - inclusion_filter.clear - end - - return unless example_count.zero? - - example_groups.clear - unless rspec_is_quitting - if filter_manager.empty? - report_filter_message("No examples found.") - elsif exclusion_filter.empty? || inclusion_filter.empty? - report_filter_message(everything_filtered_message) - end - end - end - - # @private - def report_filter_message(message) - reporter.message(message) unless @configuration.silence_filter_announcements? - end - - # @private - def everything_filtered_message - "\nAll examples were filtered out" - end - - # @api private - # - # Add inclusion filters to announcement message. - def announce_inclusion_filter(announcements) - return if inclusion_filter.empty? - - announcements << "include #{inclusion_filter.description}" - end - - # @api private - # - # Add exclusion filters to announcement message. - def announce_exclusion_filter(announcements) - return if exclusion_filter.empty? - - announcements << "exclude #{exclusion_filter.description}" - end - - private - - def descending_declaration_line_numbers_by_file - @descending_declaration_line_numbers_by_file ||= begin - declaration_locations = FlatMap.flat_map(example_groups, &:declaration_locations) - hash_of_arrays = Hash.new { |h, k| h[k] = [] } - - # TODO: change `inject` to `each_with_object` when we drop 1.8.7 support. - line_nums_by_file = declaration_locations.inject(hash_of_arrays) do |hash, (file_name, line_number)| - hash[file_name] << line_number - hash - end - - line_nums_by_file.each_value do |list| - list.sort! - list.reverse! - end - end - end - - def fail_if_config_and_cli_options_invalid - return unless @configuration.only_failures_but_not_configured? - - reporter.abort_with( - "\nTo use `--only-failures`, you must first set " \ - "`config.example_status_persistence_file_path`.", - 1 # exit code - ) - end - - # @private - # Provides a null implementation for initial use by configuration. - module Null - def self.non_example_failure; end - def self.non_example_failure=(_); end - - def self.registered_example_group_files - [] - end - - def self.traverse_example_group_trees_until - end - - # :nocov: - def self.example_groups - [] - end - - def self.all_example_groups - [] - end - # :nocov: - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/.document b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/.document deleted file mode 100644 index 52a564f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/.document +++ /dev/null @@ -1,5 +0,0 @@ -lib/**/*.rb -- -README.md -LICENSE.md -Changelog.md diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/.yardopts b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/.yardopts deleted file mode 100644 index 9555b8e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/.yardopts +++ /dev/null @@ -1,6 +0,0 @@ ---exclude features ---no-private ---markup markdown -- -Changelog.md -LICENSE.md diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/Changelog.md b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/Changelog.md deleted file mode 100644 index fc7d5f0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/Changelog.md +++ /dev/null @@ -1,1366 +0,0 @@ -### Development -[Full Changelog](https://github.com/rspec/rspec/compare/rspec-expectations-v3.13.4...3-13-maintenance) - -### 3.13.5 / 2025-05-27 -[Full Changelog](https://github.com/rspec/rspec/compare/rspec-expectations-v3.13.4...rspec-expectations-v3.13.5) - -Bug Fixes: - -* Fix links in gemspec to point to the monorepo / homepage. - -### 3.13.4 / 2025-05-01 -[Full Changelog](https://github.com/rspec/rspec/compare/rspec-expectations-v3.13.3...rspec-expectations-v3.13.4) - -Bug Fixes: - -* Prevent `match` from trying to compare strings and arrays using `Array#match`. (Joseph Haig, rspec/rspec#183) - -### 3.13.3 / 2024-09-07 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.13.2...v3.13.3) - -Bug Fixes: - -* Fix passing a regular expression to the `include` matcher without a count constraint. - (Jon Rowe, rspec/rspec-expectations#1485) - -### 3.13.2 / 2024-08-20 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.13.1...v3.13.2) - -Bug Fixes: - -* When using null object doubles, prevent typos triggering dynamic matchers. - (Eric Mueller, rspec/rspec-expectations#1455) -* Use `RSpec.warning` for an expectation warning rather than `Kernel.warn`. (Jon Rowe, rspec/rspec-expectations#1472) -* Prevent mismatched use of block and value matchers in compound expectations. (Phil Pirozhkov, rspec/rspec-expectations#1476) -* Raise an error when passing no arguments to the `include` matcher. (Eric Mueller, rspec/rspec-expectations#1479) - -### 3.13.1 / 2024-06-13 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.13.0...v3.13.1) - -Bug Fixes: - -* Fix the "false positive" warning message when using a negated `raise_error` matcher - with a `RegExp` instance. (Eric Mueller, rspec/rspec-expectations#1456) - -### 3.13.0 / 2024-02-04 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.12.4...v3.13.0) - -Enhancements: - -* Update `eq` and `eql` matchers to better highlight difference in string encoding. - (Alan Foster, rspec/rspec-expectations#1425) - -### 3.12.4 / 2024-02-04 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.12.3...v3.12.4) - -Bug Fixes: - -* Fix the diff for redefined `actual` and reassigned `@actual` in compound - expectations failure messages. (Phil Pirozhkov, rspec/rspec-expectations#1440) - -### 3.12.3 / 2023-04-20 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.12.2...v3.12.3) - -Bug Fixes: - -* Fix `include` matcher when fuzzy matching on keys with a hash-like actual which - has a non standard `key?` method which may raise. - (Jon Rowe, rspec/rspec-expectations#1416) - -### 3.12.2 / 2023-01-07 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.12.1...v3.12.2) - -Bug Fixes: - -* Prevent deprecation warning when using the `exist` matcher with `Dir`. - (Steve Dierker, rspec/rspec-expectations#1398) - -### 3.12.1 / 2022-12-16 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.12.0...v3.12.1) - -Bug Fixes: - -* Pass keyword arguments through to aliased (and thus negated) matchers. (Jon Rowe, rspec/rspec-expectations#1394) -* When handling failures in an aggregated_failures block (or example) prevent - the failure list leaking out. (Maciek Rząsa, rspec/rspec-expectations#1392) - -### 3.12.0 / 2022-10-26 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.11.1...v3.12.0) - -Enhancements: - -* Add `an_array_matching` alias for `match_array` to improve readability as an argument - matcher. (Mark Schneider, rspec/rspec-expectations#1361) - -### 3.11.1 / 2022-09-12 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.11.0...v3.11.1) - -Bug Fixes: - -* Allow the `contain_exactly` matcher to be reused by resetting its - internals on `matches?` (@bclayman-sq, rspec/rspec-expectations#1326) -* Using the exist matcher on `FileTest` no longer produces a deprecation warning. - (Ryo Nakamura, rspec/rspec-expectations#1383) - -### 3.11.0 / 2022-02-09 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.10.2...v3.11.0) - -Enhancements: - -* Return `true` from `aggregate_failures` when no exception occurs. (Jon Rowe, rspec/rspec-expectations#1225) - -Deprecations: - -* Print a deprecation message when using the implicit block expectation syntax. - (Phil Pirozhkov, rspec/rspec-expectations#1139) - -### 3.10.2 / 2022-01-14 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.10.1...v3.10.2) - -Bug Fixes: - -* Fix support for dynamic matchers for expectation target checks (Phil Pirozhkov, rspec/rspec-expectations#1294) -* Fix `expect(array).to include(hash).times`, previously this would fail due to - matching the entire array as a single hash, rather than a member of the hash. - (Slava Kardakov, rspec/rspec-expectations#1322) -* Ensure `raise_error` matches works with the `error_highlight` option from Ruby 3.1. - (Peter Goldstein, rspec/rspec-expectations#1339) - -### 3.10.1 / 2020-12-27 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.10.0...v3.10.1) - -Bug Fixes: - -* Allow JRuby 9.2.x.x to generate backtraces normally rather than via our - backfill workaround. (rspec/rspec-expectations#1230, Jon Rowe) - -### 3.10.0 / 2020-10-30 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.9.3...v3.10.0) - -Enhancements: - -* Allow `include` matcher to be chained with `once`, `at_least`, etc. for simple cases. - (Marc-André Lafortune, rspec/rspec-expectations#1168) -* Add an explicit warning when `nil` is passed to `raise_error`. (Phil Pirozhkov, rspec/rspec-expectations#1143) -* Improve `include` matcher's composability. (Phil Pirozhkov, rspec/rspec-expectations#1155) -* Mocks expectations can now set a custom failure message. - (Benoit Tigeot and Nicolas Zermati, rspec/rspec-expectations#1156) -* `aggregate_failures` now shows the backtrace line for each failure. (Fabricio Bedin, rspec/rspec-expectations#1163) -* Support multiple combinations of `yield_control` modifiers like `at_least`, `at_most`. - (Jon Rowe, rspec/rspec-expectations#1169) -* Dynamic `have_` matchers now have output consistent with other dynamic matchers. - (Marc-André Lafortune, rspec/rspec-expectations#1195) -* New config option `strict_predicate_matchers` allows predicate matcher to be strict - (i.e. match for `true` or `false`) instead of the default (match truthy vs `false` or `nil`). - (Marc-André Lafortune, rspec/rspec-expectations#1196) - -### 3.9.4 / 2020-10-29 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.9.3...v3.9.4) - -Bug Fixes: - -* Fix regression with `be_` and `have_` matchers and arguments implementing `to_hash` - were they would act like keywords and be cast to a hash. (Jon Rowe, rspec/rspec-expectations#1222) - -### 3.9.3 / 2020-10-23 - -Bug Fixes: - -* Swap the comparison of the delta vs the expected for the `be_within` matcher allowing - more complicated oobjects to be compared providing they provide `abs` and other - comparison methods. (Kelly Stannard, rspec/rspec-expectations#1182) -* Properly format expected in the description of the `be_within` matcher. (Jon Rowe, rspec/rspec-expectations#1185) -* Remove warning when using keyword arguments with `be_` and `have_` matchers on 2.7.x - (Jon Rowe, rspec/rspec-expectations#1187) -* Prevent formatting a single hash as a list of key value pairs in default failure messages - for custom matches (fixes formatting in `EnglishPhrasing#list`). (Robert Eshleman, rspec/rspec-expectations#1193) -* Prevent errors from causing false positives when using `be ` comparison, e.g. - `expect(1).not_to be < 'a'` will now correctly fail rather than pass. (Jon Rowe, rspec/rspec-expectations#1208) - - -### 3.9.2 / 2020-05-08 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.9.1...v3.9.2) - -Bug Fixes: - -* Issue a proper `ArgumentError` when invalid arguments are given to `yield_control` - modifiers such as `at_least` et al. (Marc-André Lafortune, rspec/rspec-expectations#1167) -* Prevent Ruby 2.7 keyword arguments warning from being issued by custom - matcher definitions. (Jon Rowe, rspec/rspec-expectations#1176) - -### 3.9.1 / 2020-03-13 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.9.0...v3.9.1) - -Bug Fixes: - -* Issue an improved warning when using `respond_to(...).with(n).arguments` and ignore - the warning when using with `have_attributes(...)`. (Jon Rowe, rspec/rspec-expectations#1164) - -### 3.9.0 / 2019-10-08 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.6...v3.9.0) - -Enhancements: - -* The `respond_to` matcher now uses the signature from `initialize` to validate checks - for `new` (unless `new` is non standard). (Jon Rowe, rspec/rspec-expectations#1072) -* Generated descriptions for matchers now use `is expected to` rather than `should` in - line with our preferred DSL. (Pete Johns, rspec/rspec-expectations#1080, rspec/rspec-corerspec/rspec-expectations#2572) -* Add the ability to re-raise expectation errors when matching - with `match_when_negated` blocks. (Jon Rowe, rspec/rspec-expectations#1130) -* Add a warning when an empty diff is produce due to identical inspect output. - (Benoit Tigeot, rspec/rspec-expectations#1126) - -### 3.8.6 / 2019-10-07 - -Bug Fixes: - -* Revert rspec/rspec-expectations#1125 due to the change being incompatible with our semantic versioning - policy. - -### 3.8.5 / 2019-10-02 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.4...v3.8.5) - -Bug Fixes: - -* Prevent unsupported implicit block expectation syntax from being used. - (Phil Pirozhkov, rspec/rspec-expectations#1125) - -### 3.8.4 / 2019-06-10 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.3...v3.8.4) - -Bug Fixes: - -* Prevent false negatives when checking objects for the methods required to run the - the `be_an_instance_of` and `be_kind_of` matchers. (Nazar Matus, rspec/rspec-expectations#1112) - -### 3.8.3 / 2019-04-20 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.2...v3.8.3) - -Bug Fixes: - -* Prevent composed `all` matchers from leaking into their siblings leading to duplicate - failures. (Jamie English, rspec/rspec-expectations#1086) -* Prevent objects which change their hash on comparison from failing change checks. - (Phil Pirozhkov, rspec/rspec-expectations#1100) -* Issue an `ArgumentError` rather than a `NoMethodError` when `be_an_instance_of` and - `be_kind_of` matchers encounter objects not supporting those methods. - (Taichi Ishitani, rspec/rspec-expectations#1107) - -### 3.8.2 / 2018-10-09 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.1...v3.8.2) - -Bug Fixes: - -* Change `include` matcher to rely on a `respond_to?(:include?)` check rather than a direct - Hash comparison before calling `to_hash` to convert to a hash. (Jordan Owens, rspec/rspec-expectations#1073) -* Prevent unexpected call stack jumps from causing an obscure error (`IndexError`), and - replace that error with a proper informative message. (Jon Rowe, rspec/rspec-expectations#1076) - -### 3.8.1 / 2018-08-06 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.8.0...v3.8.1) - -Bug Fixes: - -* Fix regression in `include` matcher so stopped - `expect(hash.with_indifferent_access).to include(:symbol_key)` - from working. (Eito Katagiri, rspec/rspec-expectations#1069) - -### 3.8.0 / 2018-08-04 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.7.0...v3.8.0) - -Enhancements: - -* Improve failure message of `change(receiver, :message)` by including the - receiver as `SomeClass#some_message`. (Tomohiro Hashidate, rspec/rspec-expectations#1005) -* Improve `change` matcher so that it can correctly detect changes in - deeply nested mutable objects (such as arrays-of-hashes-of-arrays). - The improved logic uses the before/after `hash` value to see if the - object has been mutated, rather than shallow duping the object. - (Myron Marston, rspec/rspec-expectations#1034) -* Improve `include` matcher so that pseudo-hash objects (e.g. objects - that decorate a hash using a `SimpleDelegator` or similar) are treated - as a hash, as long as they implement `to_hash`. (Pablo Brasero, rspec/rspec-expectations#1012) -* Add `max_formatted_output_length=` to configuration, allowing changing - the length at which we truncate large output strings. - (Sam Phippen rspec/rspec-expectations#951, Benoit Tigeot rspec/rspec-expectations#1056) -* Improve error message when passing a matcher that doesn't support block - expectations to a block based `expect`. (@nicktime, rspec/rspec-expectations#1066) - -### 3.7.0 / 2017-10-17 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.6.0...v3.7.0) - -Enhancements: - -* Improve compatibility with `--enable-frozen-string-literal` option - on Ruby 2.3+. (Pat Allan, rspec/rspec-expectations#997) - -### 3.6.0 / 2017-05-04 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.6.0.beta2...v3.6.0) - -Enhancements: - -* Treat NoMethodError as a failure for comparison matchers. (Jon Rowe, rspec/rspec-expectations#972) -* Allow for scoped aliased and negated matchers--just call - `alias_matcher` or `define_negated_matcher` from within an example - group. (Markus Reiter, rspec/rspec-expectations#974) -* Improve failure message of `change` matcher with block and `satisfy` matcher - by including the block snippet instead of just describing it as `result` or - `block` when Ripper is available. (Yuji Nakayama, rspec/rspec-expectations#987) - -Bug Fixes: - -* Fix `yield_with_args` and `yield_successive_args` matchers so that - they compare expected to actual args at the time the args are yielded - instead of at the end, in case the method that is yielding mutates the - arguments after yielding. (Alyssa Ross, rspec/rspec-expectations#965) - -### 3.6.0.beta2 / 2016-12-12 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.6.0.beta1...v3.6.0.beta2) - -Bug Fixes: - -* Using the exist matcher on `File` no longer produces a deprecation warning. - (Jon Rowe, rspec/rspec-expectations#954) - -### 3.6.0.beta1 / 2016-10-09 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.5.0...v3.6.0.beta1) - -Bug Fixes: - -* Fix `contain_exactly` to work correctly with ranges. (Myron Marston, rspec/rspec-expectations#940) -* Fix `change` to work correctly with sets. (Marcin Gajewski, rspec/rspec-expectations#939) - -### 3.5.0 / 2016-07-01 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.5.0.beta4...v3.5.0) - -Enhancements: - -* Add support for keyword arguments to the `respond_to` matcher. (Rob Smith, rspec/rspec-expectations#915). - -### 3.5.0.beta4 / 2016-06-05 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.5.0.beta3...v3.5.0.beta4) - -Bug Fixes: - -* Fix `include` matcher so that it provides a valid diff for hashes. (Yuji Nakayama, rspec/rspec-expectations#916) - -### 3.5.0.beta3 / 2016-04-02 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.5.0.beta2...v3.5.0.beta3) - -Enhancements: - -* Make `rspec/expectations/minitest_integration` work on Minitest::Spec - 5.6+. (Myron Marston, rspec/rspec-expectations#904) -* Add an alias `having_attributes` for `have_attributes` matcher. - (Yuji Nakayama, rspec/rspec-expectations#905) -* Improve `change` matcher error message when block is mis-used. - (Alex Altair, rspec/rspec-expectations#908) - -### 3.5.0.beta2 / 2016-03-10 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.5.0.beta1...v3.5.0.beta2) - -Enhancements: - -* Add the ability to raise an error on encountering false positives via - `RSpec::Configuration#on_potential_false_positives = :raise`. (Jon Rowe, rspec/rspec-expectations#900) -* When using the custom matcher DSL, support new - `notify_expectation_failures: true` option for the `match` method to - allow expectation failures to be raised as normal instead of being - converted into a `false` return value for `matches?`. (Jon Rowe, rspec/rspec-expectations#892) - -Bug Fixes: - -* Allow `should` deprecation check to work on `BasicObject`s. (James Coleman, rspec/rspec-expectations#898) - -### 3.5.0.beta1 / 2016-02-06 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.4.0...v3.5.0.beta1) - -Enhancements: - -* Make `match_when_negated` in custom matcher DSL support use of - expectations within the match logic. (Chris Arcand, rspec/rspec-expectations#789) - -Bug Fixes: - -* Return `true` as expected from passing negated expectations - (such as `expect("foo").not_to eq "bar"`), so they work - properly when used within a `match` or `match_when_negated` - block. (Chris Arcand, rspec/rspec-expectations#789) - -### 3.4.0 / 2015-11-11 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.3.1...v3.4.0) - -Enhancements: - -* Warn when `RSpec::Matchers` is included in a superclass after it has - already been included in a subclass on MRI 1.9, since that situation - can cause uses of `super` to trigger infinite recursion. (Myron Marston, rspec/rspec-expectations#816) -* Stop rescuing `NoMemoryError`, `SignalExcepetion`, `Interrupt` and - `SystemExit`. It is dangerous to interfere with these. (Myron Marston, rspec/rspec-expectations#845) -* Add `#with_captures` to the match matcher which allows a user to specify expected - captures when matching a regex against a string. (Sam Phippen, rspec/rspec-expectations#848) -* Always print compound failure messages in the multi-line form. Trying - to print it all on a single line didn't read very well. (Myron Marston, rspec/rspec-expectations#859) - -Bug Fixes: - -* Fix failure message from dynamic predicate matchers when the object - does not respond to the predicate so that it is inspected rather - than relying upon its `to_s` -- that way for `nil`, `"nil"` is - printed rather than an empty string. (Myron Marston, rspec/rspec-expectations#841) -* Fix SystemStackError raised when diffing an Enumerable object - whose `#each` includes the object itself. (Yuji Nakayama, rspec/rspec-expectations#857) - -### 3.3.1 / 2015-07-15 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.3.0...v3.3.1) - -Bug Fixes: - -* Fix `be >`, `be <`, etc so that it fails rather than allowing an - argument error to be raised when compared against an object of the - wrong type. This allows it to be used in composed matcher expressions - against heterogeneous objects. (Dennis Günnewig, rspec/rspec-expectations#809) -* Fix `respond_to` to work properly on target objects - that redefine the `method` method. (unmanbearpig, rspec/rspec-expectations#821) - -### 3.3.0 / 2015-06-12 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.2.1...v3.3.0) - -Enhancements: - -* Expose `RSpec::Matchers::EnglishPhrasing` to make it easier to write - nice failure messages in custom matchers. (Jared Beck, rspec/rspec-expectations#736) -* Add `RSpec::Matchers::FailMatchers`, a mixin which provides - `fail`, `fail_with` and `fail_including` matchers for use in - specifying that an expectation fails for use by - extension/plugin authors. (Charlie Rudolph, rspec/rspec-expectations#729) -* Avoid loading `tempfile` (and its dependencies) unless - it is absolutely needed. (Myron Marston, rspec/rspec-expectations#735) -* Improve failure output when attempting to use `be_true` or `be_false`. - (Tim Wade, rspec/rspec-expectations#744) -* Define `RSpec::Matchers#respond_to_missing?` so that - `RSpec::Matchers#respond_to?` and `RSpec::Matchers#method` handle - dynamic predicate matchers. (Andrei Botalov, rspec/rspec-expectations#751) -* Use custom Time/DateTime/BigDecimal formatting for all matchers - so they are consistently represented in failure messages. - (Gavin Miller, rspec/rspec-expectations#740) -* Add configuration to turn off warnings about matcher combinations that - may cause false positives. (Jon Rowe, rspec/rspec-expectations#768) -* Warn when using a bare `raise_error` matcher that you may be subject to - false positives. (Jon Rowe, rspec/rspec-expectations#768) -* Warn rather than raise when using the`raise_error` matcher in negative - expectations that may be subject to false positives. (Jon Rowe, rspec/rspec-expectations#775) -* Improve failure message for `include(a, b, c)` so that if `a` and `b` - are included the failure message only mentions `c`. (Chris Arcand, rspec/rspec-expectations#780) -* Allow `satisfy` matcher to take an optional description argument - that will be used in the `description`, `failure_message` and - `failure_message_when_negated` in place of the undescriptive - "sastify block". (Chris Arcand, rspec/rspec-expectations#783) -* Add new `aggregate_failures` API that allows multiple independent - expectations to all fail and be listed in the failure output, rather - than the example aborting on the first failure. (Myron Marston, rspec/rspec-expectations#776) -* Improve `raise_error` matcher so that it can accept a matcher as a single argument - that matches the message. (Time Wade, rspec/rspec-expectations#782) - -Bug Fixes: - -* Make `contain_exactly` / `match_array` work with strict test doubles - that have not defined `<=>`. (Myron Marston, rspec/rspec-expectations#758) -* Fix `include` matcher so that it omits the diff when it would - confusingly highlight items that are actually included but are not - an exact match in a line-by-line diff. (Tim Wade, rspec/rspec-expectations#763) -* Fix `match` matcher so that it does not blow up when matching a string - or regex against another matcher (rather than a string or regex). - (Myron Marston, rspec/rspec-expectations#772) -* Silence whitespace-only diffs. (Myron Marston, rspec/rspec-expectations#801) - -### 3.2.1 / 2015-04-06 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.2.0...v3.2.1) - -Bug Fixes: - -* Prevent `Range`s from being enumerated when generating matcher - descriptions. (Jon Rowe, rspec/rspec-expectations#755) -* Ensure exception messages are compared as strings in the `raise_error` - matcher. (Jon Rowe, rspec/rspec-expectations#755) - -### 3.2.0 / 2015-02-03 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.1.2...v3.2.0) - -Enhancements: - -* Add `block_arg` method to custom matcher API, which allows you to - access the block passed to a custom matcher, if there is one. - (Mike Dalton, rspec/rspec-expectations#645) -* Provide more detail in failure message of `yield_control` matcher. - (Jon Rowe, rspec/rspec-expectations#650) -* Add a shorthand syntax for `chain` in the matcher DSL which assigns values - for use elsewhere, for example `chain :and_smaller_than, :small_value` - creates an `attr_reader` for `small_value` (Tom Stuart, rspec/rspec-expectations#644) -* Provide a more helpful deprecation message when using the `should` syntax. - (Elia Schito, rspec/rspec-expectations#663) -* Provide more detail in the `have_attributes` matcher failure message. - (Jon Rowe, rspec/rspec-expectations#668) -* Make the `have_attributes` matcher diffable. - (Jon Rowe, Alexey Fedorov, rspec/rspec-expectations#668) -* Add `output(...).to_std(out|err)_from_any_process` as alternatives - to `output(...).to_std(out|err)`. The latter doesn't work when a sub - process writes to the named stream but is much faster. - (Alex Genco, rspec/rspec-expectations#700) -* Improve compound matchers (created by `and` and `or`) so that diffs - are included in failures when one or more of their matchers - are diffable. (Alexey Fedorov, rspec/rspec-expectations#713) - -Bug Fixes: - -* Avoid calling `private_methods` from the `be` predicate matcher on - the target object if the object publicly responds to the predicate - method. This avoids a possible error that can occur if the object - raises errors from `private_methods` (which can happen with celluloid - objects). (@chapmajs, rspec/rspec-expectations#670) -* Make `yield_control` (with no modifier) default to - `at_least(:once)` rather than raising a confusing error - when multiple yields are encountered. - (Myron Marston, rspec/rspec-expectations#675) -* Fix "instance variable @color not initialized" warning when using - rspec-expectations outside of an rspec-core context. (Myron Marston, rspec/rspec-expectations#689) -* Fix `start_with` and `end_with` to work properly when checking a - string against an array of strings. (Myron Marston, rspec/rspec-expectations#690) -* Don't use internally delegated matchers when generating descriptions - for examples without doc strings. (Myron Marston, rspec/rspec-expectations#692) - -### 3.1.2 / 2014-09-26 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.1.1...v3.1.2) - -Bug Fixes: - -* Fix `define_negated_matcher` so that matchers that support fluent - interfaces continue to be negated after you use the chained method. - (Myron Marston, rspec/rspec-expectations#656) -* Fix `define_negated_matcher` so that the matchers fail with an - appropriate failure message. (Myron Marston, rspec/rspec-expectations#659) - -### 3.1.1 / 2014-09-15 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.1.0...v3.1.1) - -Bug Fixes: - -* Fix regression in `all` matcher in 3.1.0 that prevented it from - working on objects that are not `Enumerable` but do implement - `each_with_index` (such as an ActiveRecord proxy). (Jori Hardman, rspec/rspec-expectations#647) - -### 3.1.0 / 2014-09-04 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.4...v3.1.0) - -Enhancements: - -* Add `have_attributes` matcher, that passes if actual's attribute - values match the expected attributes hash: - `Person = Struct.new(:name, :age)` - `person = Person.new("Bob", 32)` - `expect(person).to have_attributes(:name => "Bob", :age => 32)`. - (Adam Farhi, rspec/rspec-expectations#571) -* Extended compound matcher support to block matchers, for cases like: - `expect { ... }.to change { x }.to(3).and change { y }.to(4)`. (Myron - Marston, rspec/rspec-expectations#567) -* Include chained methods in custom matcher description and failure message - when new `include_chain_clauses_in_custom_matcher_descriptions` config - option is enabled. (Dan Oved, rspec/rspec-expectations#600) -* Add `thrice` modifier to `yield_control` matcher as a synonym for - `exactly(3).times`. (Dennis Taylor, rspec/rspec-expectations#615) -* Add `RSpec::Matchers.define_negated_matcher`, which defines a negated - version of the named matcher. (Adam Farhi, Myron Marston, rspec/rspec-expectations#618) -* Document and support negation of `contain_exactly`/`match_array`. - (Jon Rowe, rspec/rspec-expectations#626). - -Bug Fixes: - -* Rename private `LegacyMacherAdapter` constant to `LegacyMatcherAdapter` - to fix typo. (Abdelkader Boudih, rspec/rspec-expectations#563) -* Fix `all` matcher so that it fails properly (rather than raising a - `NoMethodError`) when matched against a non-enumerable. (Hao Su, rspec/rspec-expectations#622) - -### 3.0.4 / 2014-08-14 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.3...v3.0.4) - -Bug Fixes: - -* Fix `start_with` and `end_with` so that they work properly with - structs. (Myron Marston, rspec/rspec-expectations#620) -* Fix failure message generation so that structs are printed properly - in failures. Previously failure messages would represent them as - an array. (Myron Marston, rspec/rspec-expectations#620) -* Fix composable matcher support so that it does not wrongly treat - structs as arrays. (Myron Marston, rspec/rspec-expectations#620) - -### 3.0.3 / 2014-07-21 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.2...v3.0.3) - -Bug Fixes: - -* Fix issue with detection of generic operator matchers so they work - correctly when undefined. (Myron Marston, rspec/rspec-expectations#597) -* Don't inadvertently define `BasicObject` in 1.8.7. (Chris Griego, rspec/rspec-expectations#603) -* Fix `include` matcher so that it fails gracefully when matched against - an object that does not respond to `include?`. (Myron Marston, rspec/rspec-expectations#607) - -### 3.0.2 / 2014-06-19 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.1...v3.0.2) - -Bug Fixes: - -* Fix regression in `contain_exactly` (AKA `match_array`) that caused it - to wrongly pass when the expected array was empty. (Myron Marston, rspec/rspec-expectations#581) -* Provide a better error message when you use the `change(obj, :msg)` - form of the change matcher but forget the message argument. (Alex - Sunderland, rspec/rspec-expectations#585) -* Make the `contain_exactly` matcher work with arrays that contain hashes in - arbitrary ordering. (Sam Phippen, rspec/rspec-expectations#578) - -### 3.0.1 / 2014-06-12 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.0...v3.0.1) - -Bug Fixes: - -* Add a missing `require` that would cause the `respond_to` matcher to - fail when used in a project where the rest of RSpec (e.g. core and - expecatations) weren't being used. (Myron Marston, rspec/rspec-expectations#566) -* Structs are no longer treated as arrays when diffed. (Jon Rowe, rspec/rspec-expectations#576) - -### 3.0.0 / 2014-06-01 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.0.rc1...v3.0.0) - -No code changes. Just taking it out of pre-release. - -### 3.0.0.rc1 / 2014-05-18 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.0.beta2...v3.0.0.rc1) - -Breaking Changes for 3.0.0: - -* Remove `matcher_execution_context` attribute from DSL-defined - custom matchers. (Myron Marston) -* Remove `RSpec::Matchers::Pretty#_pretty_print`. (Myron Marston) -* Remove `RSpec::Matchers::Pretty#expected_to_sentence`. (Myron Marston) -* Rename `RSpec::Matchers::Configuration` constant to - `RSpec::Expectations::Configuration`. (Myron Marston) -* Prevent `have_xyz` predicate matchers using private methods. - (Adrian Gonzalez) -* Block matchers must now implement `supports_block_expectations?`. - (Myron Marston) -* Stop supporting `require 'rspec-expectations'`. - Use `require 'rspec/expectations'` instead. (Myron Marston) - -Bug Fixes: - -* Fix `NoMethodError` triggered by beta2 when `YARD` was loaded in - the test environment. (Myron Marston) -* Fix `be_xyz` matcher to accept a `do...end` block. (Myron Marston) -* Fix composable matcher failure message generation logic - so that it does not blow up when given `$stdout` or `$stderr`. - (Myron Marston) -* Fix `change` matcher to work properly with `IO` objects. - (Myron Marston) -* Fix `exist` matcher so that it can be used in composed matcher - expressions involving objects that do not implement `exist?` or - `exists?`. (Daniel Fone) -* Fix composable matcher match logic so that it clones matchers - before using them in order to work properly with matchers - that use internal memoization based on a given `actual` value. - (Myron Marston) -* Fix `be_xyz` and `has_xyz` predicate matchers so that they can - be used in composed matcher expressions involving objects that - do not implement the predicate method. (Daniel Fone) - -Enhancements: - -* Document the remaining public APIs. rspec-expectations now has 100% of - the public API documented and will remain that way (as new undocumented - methods will fail the build). (Myron Marston) -* Improve the formatting of BigDecimal objects in `eq` matcher failure - messages. (Daniel Fone) -* Improve the failure message for `be_xyz` predicate matchers so - that it includes the `inspect` output of the receiver. - (Erik Michaels-Ober, Sam Phippen) -* Add `all` matcher, to allow you to specify that a given matcher - matches all elements in a collection: - `expect([1, 3, 5]).to all( be_odd )`. (Adam Farhi) -* Add boolean aliases (`&`/`|`) for compound operators (`and`/`or`). (Adam Farhi) -* Give users a clear error when they wrongly use a value matcher - in a block expectation expression (e.g. `expect { 3 }.to eq(3)`) - or vice versa. (Myron Marston) - -### 3.0.0.beta2 / 2014-02-17 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.0.beta1...v3.0.0.beta2) - -Breaking Changes for 3.0.0: - -* Remove deprecated support for accessing the `RSpec` constant using - `Rspec` or `Spec`. (Myron Marston) -* Remove deprecated `RSpec::Expectations.differ=`. (Myron Marston) -* Remove support for deprecated `expect(...).should`. (Myron Marston) -* Explicitly disallow `expect { }.not_to change { }` with `by`, - `by_at_least`, `by_at_most` or `to`. These have never been supported - but did not raise explicit errors. (Myron Marston) -* Provide `===` rather than `==` as an alias of `matches?` for - all matchers. The semantics of `===` are closer to an RSpec - matcher than `==`. (Myron Marston) -* Remove deprecated `RSpec::Matchers::OperatorMatcher` constant. - (Myron Marston) -* Make `RSpec::Expectations::ExpectationNotMetError` subclass - `Exception` rather than `StandardError` so they can bypass - a bare `rescue` in end-user code (e.g. when an expectation is - set from within a rspec-mocks stub implementation). (Myron Marston) -* Remove Test::Unit and Minitest 4.x integration. (Myron Marston) - -Enhancements: - -* Simplify the failure message of the `be` matcher when matching against: - `true`, `false` and `nil`. (Sam Phippen) -* Update matcher protocol and custom matcher DSL to better align - with the newer `expect` syntax. If you want your matchers to - maintain compatibility with multiple versions of RSpec, you can - alias the new names to the old. (Myron Marston) - * `failure_message_for_should` => `failure_message` - * `failure_message_for_should_not` => `failure_message_when_negated` - * `match_for_should` => `match` - * `match_for_should_not` => `match_when_negated` -* Improve generated descriptions from `change` matcher. (Myron Marston) -* Add support for compound matcher expressions using `and` and `or`. - Simply chain them off of any existing matcher to create an expression - like `expect(alphabet).to start_with("a").and end_with("z")`. - (Eloy Espinaco) -* Add `contain_exactly` as a less ambiguous version of `match_array`. - Note that it expects the expected array to be splatted as - individual args: `expect(array).to contain_exactly(1, 2)` is - the same as `expect(array).to match_array([1, 2])`. (Myron Marston) -* Update `contain_exactly`/`match_array` so that it can match against - other non-array collections (such as a `Set`). (Myron Marston) -* Update built-in matchers so that they can accept matchers as arguments - to allow you to compose matchers in arbitrary ways. (Myron Marston) -* Add `RSpec::Matchers::Composable` mixin that can be used to make - a custom matcher composable as well. Note that custom matchers - defined via `RSpec::Matchers.define` already have this. (Myron - Marston) -* Define noun-phrase aliases for built-in matchers, which can be - used when creating composed matcher expressions that read better - and provide better failure messages. (Myron Marston) -* Add `RSpec::Matchers.alias_matcher` so users can define their own - matcher aliases. The `description` of the matcher will reflect the - alternate matcher name. (Myron Marston) -* Add explicit `be_between` matcher. `be_between` has worked for a - long time as a dynamic predicate matcher, but the failure message - was suboptimal. The new matcher provides a much better failure - message. (Erik Michaels-Ober) -* Enhance the `be_between` matcher to allow for `inclusive` or `exclusive` - comparison (e.g. inclusive of min/max or exclusive of min/max). - (Pedro Gimenez) -* Make failure message for `not_to be #{operator}` less confusing by - only saying it's confusing when comparison operators are used. - (Prathamesh Sonpatki) -* Improve failure message of `eq` matcher when `Time` or `DateTime` - objects are used so that the full sub-second precision is included. - (Thomas Holmes, Jeff Wallace) -* Add `output` matcher for expecting that a block outputs `to_stdout` - or `to_stderr`. (Luca Pette, Matthias Günther) -* Forward a provided block on to the `has_xyz?` method call when - the `have_xyz` matcher is used. (Damian Galarza) -* Provide integration with Minitest 5.x. Require - `rspec/expectations/minitest_integration` after loading minitest - to use rspec-expectations with minitest. (Myron Marston) - -Bug Fixes: - -* Fix wrong matcher descriptions with falsey expected value (yujinakayama) -* Fix `expect { }.not_to change { }.from(x)` so that the matcher only - passes if the starting value is `x`. (Tyler Rick, Myron Marston) -* Fix hash diffing, so that it colorizes properly and doesn't consider trailing - commas when performing the diff. (Jared Norman) -* Fix built-in matchers to fail normally rather than raising - `ArgumentError` when given an object of the wrong type to match - against, so that they work well in composite matcher expressions like - `expect([1.51, "foo"]).to include(a_string_matching(/foo/), a_value_within(0.1).of(1.5))`. - (Myron Marston) - -Deprecations: - -* Retain support for RSpec 2 matcher protocol (e.g. for matchers - in 3rd party extension gems like `shoulda`), but it will print - a deprecation warning. (Myron Marston) - -### 3.0.0.beta1 / 2013-11-07 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.2...v3.0.0.beta1) - -Breaking Changes for 3.0.0: - -* Remove explicit support for 1.8.6. (Jon Rowe) -* Remove the deprecated `be_close` matcher, preferring `be_within` instead. - (Sam Phippen) -* Remove the deprecated `have`, `have_at_least` and `have_at_most` matchers. - You can continue using those matchers through https://github.com/rspec/rspec-collection_matchers, - or you can rewrite your expectations with something like - `expect(your_object.size).to eq(num)`. (Hugo Baraúna) -* Rename `be_true` and `be_false` to `be_truthy` and `be_falsey`. (Sam Phippen) -* Make `expect { }.to_not raise_error(SomeSpecificClass, message)`, - `expect { }.to_not raise_error(SomeSpecificClass)` and - `expect { }.to_not raise_error(message)` invalid, since they are prone - to hiding failures. Instead, use `expect { }.to_not raise_error` (with no - args). (Sam Phippen) -* Within `RSpec::Matchers.define` blocks, helper methods made available - either via `def self.helper` or `extend HelperModule` are no longer - available to the `match` block (or any of the others). Instead - `include` your helper module and define the helper method as an - instance method. (Myron Marston) -* Force upgrading Diff::LCS for encoding compatability with diffs. (Jon Rowe) - -Enhancements: - -* Support `do..end` style block with `raise_error` matcher. (Yuji Nakayama) -* Rewrote custom matcher DSL to simplify its implementation and solve a - few issues. (Myron Marston) -* Allow early `return` from within custom matcher DSL blocks. (Myron - Marston) -* The custom matcher DSL's `chain` can now accept a block. (Myron - Marston) -* Support setting an expectation on a `raise_error` matcher via a chained - `with_message` method call. (Sam Phippen) - -Bug Fixes: - -* Allow `include` and `match` matchers to be used from within a - DSL-defined custom matcher's `match` block. (Myron Marston) -* Correct encoding error message on diff failure (Jon Rowe) - -Deprecations: - - * Using the old `:should` syntax without explicitly configuring it is deprecated. - It will continue to work but will emit a deprecation warning in RSpec 3 if - you do not explicitly enable it. (Sam Phippen) - -### 2.99.2 / 2014-07-21 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.1...v2.99.2) - -Bug Fixes: - -* Fix regression in `Expectations#method_handle_for` where proxy objects - with method delegated would wrongly not return a method handle. - (Jon Rowe, rspec/rspec-expectations#594) -* Fix issue with detection of generic operator matchers so they work - correctly when undefined. (Myron Marston, rspec/rspec-expectations#597) - -### 2.99.1 / 2014-06-19 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.0...v2.99.1) - -Bug Fixes: - -* Fix typo in custom matcher `expected` deprecation warning -- it's - `expected_as_array`, not `expected_array`. (Frederick Cheung, rspec/rspec-expectations#562) - -### 2.99.0 / 2014-06-01 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.0.rc1...v2.99.0) - -Enhancements: - -* Special case deprecation message for `errors_on` with `rspec-rails` to be more useful. - (Aaron Kromer) - -### 2.99.0.rc1 / 2014-05-18 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.0.beta2...2.99.0.rc1) - -Deprecations: - -* Deprecate `matcher_execution_context` attribute on DSL-defined - custom matchers. (Myron Marston) -* Deprecate `RSpec::Matchers::Pretty#_pretty_print`. (Myron Marston) -* Deprecate `RSpec::Matchers::Pretty#expected_to_sentence`. (Myron Marston) -* Deprecate `RSpec::Matchers::Configuration` in favor of - `RSpec::Expectations::Configuration`. (Myron Marston) -* Deprecate `be_xyz` predicate matcher on an object that doesn't respond to - `xyz?` or `xyzs?`. (Daniel Fone) -* Deprecate `have_xyz` matcher on an object that doesn't respond to `has_xyz?`. - (Daniel Fone) -* Deprecate `have_xyz` matcher on an object that has a private method `has_xyz?`. - (Jon Rowe) -* Issue a deprecation warning when a block expectation expression is - used with a matcher that doesn't explicitly support block expectations - via `supports_block_expectations?`. (Myron Marston) -* Deprecate `require 'rspec-expectations'`. Use - `require 'rspec/expectations'` instead. (Myron Marston) - -### 2.99.0.beta2 / 2014-02-17 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.0.beta1...v2.99.0.beta2) - -Deprecations: - -* Deprecate chaining `by`, `by_at_least`, `by_at_most` or `to` off of - `expect { }.not_to change { }`. The docs have always said these are - not supported for the negative form but now they explicitly raise - errors in RSpec 3. (Myron Marston) -* Change the semantics of `expect { }.not_to change { x }.from(y)`. - In RSpec 2.x, this expectation would only fail if `x` started with - the value of `y` and changed. If it started with a different value - and changed, it would pass. In RSpec 3, it will pass only if the - value starts at `y` and it does not change. (Myron Marston) -* Deprecate `matcher == value` as an alias for `matcher.matches?(value)`, - in favor of `matcher === value`. (Myron Marston) -* Deprecate `RSpec::Matchers::OperatorMatcher` in favor of - `RSpec::Matchers::BuiltIn::OperatorMatcher`. (Myron Marston) -* Deprecate auto-integration with Test::Unit and minitest. - Instead, include `RSpec::Matchers` in the appropriate test case - base class yourself. (Myron Marston) -* Deprecate treating `#expected` on a DSL-generated custom matcher - as an array when only 1 argument is passed to the matcher method. - In RSpec 3 it will be the single value in order to make diffs - work properly. (Jon Rowe) - -### 2.99.0.beta1 / 2013-11-07 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.4...v2.99.0.beta1) - -Deprecations - -* Deprecate `have`, `have_at_least` and `have_at_most`. You can continue using those - matchers through https://github.com/rspec/rspec-collection_matchers, or - you can rewrite your expectations with something like - `expect(your_object.size).to eq(num)`. (Hugo Baraúna) -* Deprecate `be_xyz` predicate matcher when `xyz?` is a private method. - (Jon Rowe) -* Deprecate `be_true`/`be_false` in favour of `be_truthy`/`be_falsey` - (for Ruby's conditional semantics) or `be true`/`be false` - (for exact equality). (Sam Phippen) -* Deprecate calling helper methods from a custom matcher with the wrong - scope. (Myron Marston) - * `def self.foo` / `extend Helper` can be used to add macro methods - (e.g. methods that call the custom matcher DSL methods), but should - not be used to define helper methods called from within the DSL - blocks. - * `def foo` / `include Helper` is the opposite: it's for helper methods - callable from within a DSL block, but not for defining macros. - * RSpec 2.x allowed helper methods defined either way to be used for - either purpose, but RSpec 3.0 will not. - -### 2.14.5 / 2014-02-01 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.4...v2.14.5) - -Bug fixes - -* Fix wrong matcher descriptions with falsey expected value - (yujinakayama) - -### 2.14.4 / 2013-11-06 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.3...v2.14.4) - -Bug fixes - -* Make the `match` matcher produce a diff output. (Jon Rowe, Ben Moss) -* Choose encoding for diff's more intelligently, and when all else fails fall - back to default internal encoding with replacing characters. (Jon Rowe) - -### 2.14.3 / 2013-09-22 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.2...v2.14.3) - -Bug fixes - -* Fix operator matchers (`should` syntax) when `method` is redefined on target. - (Brandon Turner) -* Fix diffing of hashes with object based keys. (Jon Rowe) -* Fix operator matchers (`should` syntax) when operator is defined via - `method_missing` (Jon Rowe) - -### 2.14.2 / 2013-08-14 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.1...v2.14.2) - -Bug fixes - -* Fix `be_` matcher to not support operator chaining like the - `be` matcher does (e.g. `be == 5`). This led to some odd behaviors - since `be_ == anything` returned a `BeComparedTo` matcher - and was thus always truthy. This was a consequence of the implementation - (e.g. subclassing the basic `Be` matcher) and was not intended behavior. - (Myron Marston). -* Fix `change` matcher to compare using `==` in addition to `===`. This - is important for an expression like: - `expect {}.to change { a.class }.from(ClassA).to(ClassB)` because - `SomeClass === SomeClass` returns false. (Myron Marston) - -### 2.14.1 / 2013-08-08 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.0...2.14.1) - -Bug fixes - -* Ensure diff output uses the same encoding as the encoding of - the string being diff'd to prevent `Encoding::UndefinedConversionError` - errors (Jon Rowe). - -### 2.14.0 / 2013-07-06 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.0.rc1...v2.14.0) - -Bug fixes - -* Values that are not matchers use `#inspect`, rather than `#description` for - documentation output (Andy Lindeman, Sam Phippen). -* Make `expect(a).to be_within(x).percent_of(y)` work with negative y - (Katsuhiko Nishimra). -* Make the `be_predicate` matcher work as expected used with `expect{...}.to - change...` (Sam Phippen). - -### 2.14.0.rc1 / 2013-05-27 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.13.0...v2.14.0.rc1) - -Enhancements - -* Enhance `yield_control` so that you can specify an exact or relative - number of times: `expect { }.to yield_control.exactly(3).times`, - `expect { }.to yield_control.at_least(2).times`, etc (Bartek - Borkowski). -* Make the differ that is used when an expectation fails better handle arrays - by splitting each element of the array onto its own line. (Sam Phippen) -* Accept duck-typed strings that respond to `:to_str` as expectation messages. - (Toby Ovod-Everett) - -Bug fixes - -* Fix differ to not raise errors when dealing with differently-encoded - strings (Jon Rowe). -* Fix `expect(something).to be_within(x).percent_of(y)` where x and y are both - integers (Sam Phippen). -* Fix `have` matcher to handle the fact that on ruby 2.0, - `Enumerator#size` may return nil (Kenta Murata). -* Fix `expect { raise s }.to raise_error(s)` where s is an error instance - on ruby 2.0 (Sam Phippen). -* Fix `expect(object).to raise_error` passing. This now warns the user and - fails the spec (tomykaira). - -Deprecations - -* Deprecate `expect { }.not_to raise_error(SpecificErrorClass)` or - `expect { }.not_to raise_error("some specific message")`. Using - these was prone to hiding failures as they would allow _any other - error_ to pass. (Sam Phippen and David Chelimsky) - -### 2.13.0 / 2013-02-23 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.12.1...v2.13.0) - -Enhancements - -* Add support for percent deltas to `be_within` matcher: - `expect(value).to be_within(10).percent_of(expected)` - (Myron Marston). -* Add support to `include` matcher to allow it to be given a list - of matchers as the expecteds to match against (Luke Redpath). - -Bug fixes - -* Fix `change` matcher so that it dups strings in order to handle - mutated strings (Myron Marston). -* Fix `should be =~ /some regex/` / `expect(...).to be =~ /some regex/`. - Previously, these either failed with a confusing `undefined method - matches?' for false:FalseClass` error or were no-ops that didn't - actually verify anything (Myron Marston). -* Add compatibility for diff-lcs 1.2 and relax the version - constraint (Peter Goldstein). -* Fix DSL-generated matchers to allow multiple instances of the - same matcher in the same example to have different description - and failure messages based on the expected value (Myron Marston). -* Prevent `undefined method #split for Array` error when dumping - the diff of an array of multiline strings (Myron Marston). -* Don't blow up when comparing strings that are in an encoding - that is not ASCII compatible (Myron Marston). -* Remove confusing "Check the implementation of #==" message - printed for empty diffs (Myron Marston). - -### 2.12.1 / 2012-12-15 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.12.0...v2.12.1) - -Bug fixes - -* Improve the failure message for an expression like - `{}.should =~ {}`. (Myron Marston and Andy Lindeman) -* Provide a `match_regex` alias so that custom matchers - built using the matcher DSL can use it (since `match` - is a different method in that context). - (Steven Harman) - -### 2.12.0 / 2012-11-12 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.11.3...v2.12.0) - -Enhancements - -* Colorize diffs if the `--color` option is configured. (Alex Coplan) -* Include backtraces in unexpected errors handled by `raise_error` - matcher (Myron Marston) -* Print a warning when users accidentally pass a non-string argument - as an expectation message (Sam Phippen) -* `=~` and `match_array` matchers output a more useful error message when - the actual value is not an array (or an object that responds to `#to_ary`) - (Sam Phippen) - -Bug fixes - -* Fix `include` matcher so that `expect({}).to include(:a => nil)` - fails as it should (Sam Phippen). -* Fix `be_an_instance_of` matcher so that `Class#to_s` is used in the - description rather than `Class#inspect`, since some classes (like - `ActiveRecord::Base`) define a long, verbose `#inspect`. - (Tom Stuart) - -### 2.11.3 / 2012-09-04 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.11.2...v2.11.3) - -Bug fixes - -* Fix (and deprecate) `expect { }.should` syntax so that it works even - though it was never a documented or intended syntax. It worked as a - consequence of the implementation of `expect` in RSpec 2.10 and - earlier. (Myron Marston) -* Ensure #== is defined on built in matchers so that they can be composed. - For example: - - expect { - user.emailed! - }.to change { user.last_emailed_at }.to be_within(1.second).of(Time.zone.now) - -### 2.11.2 / 2012-07-25 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.11.1...v2.11.2) - -Bug fixes - -* Define `should` and `should_not` on `Object` rather than `BasicObject` - on MacRuby. On MacRuby, `BasicObject` is defined but is not the root - of the object hierarchy. (Gabriel Gilder) - -### 2.11.1 / 2012-07-08 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.11.0...v2.11.1) - -Bug fixes - -* Constrain `actual` in `be_within` matcher to values that respond to `-` instead - of requiring a specific type. - * `Time`, for example, is a legit alternative. - -### 2.11.0 / 2012-07-07 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.10.0...v2.11.0) - -Enhancements - -* Expand `expect` syntax so that it supports expections on bare values - in addition to blocks (Myron Marston). -* Add configuration options to control available expectation syntaxes - (Myron Marston): - * `RSpec.configuration.expect_with(:rspec) { |c| c.syntax = :expect }` - * `RSpec.configuration.expect_with(:rspec) { |c| c.syntax = :should }` - * `RSpec.configuration.expect_with(:rspec) { |c| c.syntax = [:should, :expect] }` - * `RSpec.configuration.add_should_and_should_not_to Delegator` - -Bug fixes - -* Allow only `Numeric` values to be the "actual" in the `be_within` matcher. - This prevents confusing error messages. (Su Zhang @zhangsu) -* Define `should` and `should_not` on `BasicObject` rather than `Kernel` - on 1.9. This makes `should` and `should_not` work properly with - `BasicObject`-subclassed proxy objects like `Delegator`. (Myron - Marston) - -### 2.10.0 / 2012-05-03 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.9.1...v2.10.0) - -Enhancements - -* Add new `start_with` and `end_with` matchers (Jeremy Wadsack) -* Add new matchers for specifying yields (Myron Marston): - * `expect {...}.to yield_control` - * `expect {...}.to yield_with_args(1, 2, 3)` - * `expect {...}.to yield_with_no_args` - * `expect {...}.to yield_successive_args(1, 2, 3)` -* `match_unless_raises` takes multiple exception args - -Bug fixes - -* Fix `be_within` matcher to be inclusive of delta. -* Fix message-specific specs to pass on Rubinius (John Firebaugh) - -### 2.9.1 / 2012-04-03 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.9.0...v2.9.1) - -Bug fixes - -* Provide a helpful message if the diff between two objects is empty. -* Fix bug diffing single strings with multiline strings. -* Fix for error with using custom matchers inside other custom matchers - (mirasrael) -* Fix using execution context methods in nested DSL matchers (mirasrael) - -### 2.9.0 / 2012-03-17 -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.8.0...v2.9.0) - -Enhancements - -* Move built-in matcher classes to RSpec::Matchers::BuiltIn to reduce pollution - of RSpec::Matchers (which is included in every example). -* Autoload files with matcher classes to improve load time. - -Bug fixes - -* Align `respond_to?` and `method_missing` in DSL-defined matchers. -* Clear out user-defined instance variables between invocations of DSL-defined - matchers. -* Dup the instance of a DSL generated matcher so its state is not changed by - subsequent invocations. -* Treat expected args consistently across positive and negative expectations - (thanks to Ralf Kistner for the heads up) - -### 2.8.0 / 2012-01-04 - -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.8.0.rc2...v2.8.0) - -Enhancements - -* Better diff output for Hash (Philippe Creux) -* Eliminate Ruby warnings (Olek Janiszewski) - -### 2.8.0.rc2 / 2011-12-19 - -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.8.0.rc1...v2.8.0.rc2) - -No changes for this release. Just releasing with the other rspec gems. - -### 2.8.0.rc1 / 2011-11-06 - -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.7.0...v2.8.0.rc1) - -Enhancements - -* Use classes for the built-in matchers (they're faster). -* Eliminate Ruby warnings (Matijs van Zuijlen) - -### 2.7.0 / 2011-10-16 - -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.6.0...v2.7.0) - -Enhancements - -* `HaveMatcher` converts argument using `to_i` (Alex Bepple & Pat Maddox) -* Improved failure message for the `have_xxx` matcher (Myron Marston) -* `HaveMatcher` supports `count` (Matthew Bellantoni) -* Change matcher dups `Enumerable` before the action, supporting custom - `Enumerable` types like `CollectionProxy` in Rails (David Chelimsky) - -Bug fixes - -* Fix typo in `have(n).xyz` documentation (Jean Boussier) -* fix `safe_sort` for ruby 1.9.2 (`Kernel` now defines `<=>` for Object) (Peter - van Hardenberg) - -### 2.6.0 / 2011-05-12 - -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.5.0...v2.6.0) - -Enhancements - -* `change` matcher accepts regexps (Robert Davis) -* better descriptions for `have_xxx` matchers (Magnus Bergmark) -* `range.should cover(*values)` (Anders Furseth) - -Bug fixes - -* Removed non-ascii characters that were choking rcov (Geoffrey Byers) -* change matcher dups arrays and hashes so their before/after states can be - compared correctly. -* Fix the order of inclusion of RSpec::Matchers in Test::Unit::TestCase and - MiniTest::Unit::TestCase to prevent a SystemStackError (Myron Marston) - -### 2.5.0 / 2011-02-05 - -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.4.0...v2.5.0) - -Enhancements - -* `should exist` works with `exist?` or `exists?` (Myron Marston) -* `expect { ... }.not_to do_something` (in addition to `to_not`) - -Documentation - -* improved docs for raise_error matcher (James Almond) - -### 2.4.0 / 2011-01-02 - -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.3.0...v2.4.0) - -No functional changes in this release, which was made to align with the -rspec-core-2.4.0 release. - -Enhancements - -* improved RDoc for change matcher (Jo Liss) - -### 2.3.0 / 2010-12-12 - -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.2.1...v2.3.0) - -Enhancements - -* diff strings when include matcher fails (Mike Sassak) - -### 2.2.0 / 2010-11-28 - -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.1.0...v2.2.0) - -### 2.1.0 / 2010-11-07 - -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.1...v2.1.0) - -Enhancements - -* `be_within(delta).of(expected)` matcher (Myron Marston) -* Lots of new Cucumber features (Myron Marston) -* Raise error if you try `should != expected` on Ruby-1.9 (Myron Marston) -* Improved failure messages from `throw_symbol` (Myron Marston) - -Bug fixes - -* Eliminate hard dependency on `RSpec::Core` (Myron Marston) -* `have_matcher` - use pluralize only when ActiveSupport inflections are indeed - defined (Josep M Bach) -* throw_symbol matcher no longer swallows exceptions (Myron Marston) -* fix matcher chaining to avoid name collisions (Myron Marston) - -### 2.0.0 / 2010-10-10 - -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.0.rc...v2.0.0) - -Enhancements - -* Add match_for_should_not method to matcher DSL (Myron Marston) - -Bug fixes - -* `respond_to` matcher works correctly with `should_not` with multiple methods - (Myron Marston) -* `include` matcher works correctly with `should_not` with multiple values - (Myron Marston) - -### 2.0.0.rc / 2010-10-05 - -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.0.beta.22...v2.0.0.rc) - -Enhancements - -* `require 'rspec/expectations'` in a T::U or MiniUnit suite (Josep M. Bach) - -Bug fixes - -* change by 0 passes/fails correctly (Len Smith) -* Add description to satisfy matcher - -### 2.0.0.beta.22 / 2010-09-12 - -[Full Changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.0.beta.20...v2.0.0.beta.22) - -Enhancements - -* diffing improvements - * diff multiline strings - * don't diff single line strings - * don't diff numbers (silly) - * diff regexp + multiline string - -Bug fixes - * `should[_not]` change now handles boolean values correctly diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/LICENSE.md b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/LICENSE.md deleted file mode 100644 index dae02d8..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/LICENSE.md +++ /dev/null @@ -1,25 +0,0 @@ -The MIT License (MIT) -===================== - -* Copyright © 2012 David Chelimsky, Myron Marston -* Copyright © 2006 David Chelimsky, The RSpec Development Team -* Copyright © 2005 Steven Baker - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/README.md b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/README.md deleted file mode 100644 index a649542..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/README.md +++ /dev/null @@ -1,326 +0,0 @@ -# RSpec Expectations [![Build Status](https://github.com/rspec/rspec-expectations/workflows/RSpec%20CI/badge.svg)](https://github.com/rspec/rspec-expectations/actions) [![Code Climate](https://codeclimate.com/github/rspec/rspec-expectations.svg)](https://codeclimate.com/github/rspec/rspec-expectations) - -RSpec::Expectations lets you express expected outcomes on an object in an -example. - -```ruby -expect(account.balance).to eq(Money.new(37.42, :USD)) -``` - -## Install - -If you want to use rspec-expectations with rspec, just install the rspec gem -and RubyGems will also install rspec-expectations for you (along with -rspec-core and rspec-mocks): - -```shell -gem install rspec -``` - -Want to run against the `main` branch? You'll need to include the dependent -RSpec repos as well. Add the following to your `Gemfile`: - -```ruby -%w[rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib| - gem lib, :git => "https://github.com/rspec/#{lib}.git", :branch => 'main' -end -``` - -If you want to use rspec-expectations with another tool, like Test::Unit, -Minitest, or Cucumber, you can install it directly: - -```shell -gem install rspec-expectations -``` - -## Contributing - -Once you've set up the environment, you'll need to cd into the working -directory of whichever repo you want to work in. From there you can run the -specs and cucumber features, and make patches. - -NOTE: You do not need to use rspec-dev to work on a specific RSpec repo. You -can treat each RSpec repo as an independent project. - -- [Build details](BUILD_DETAIL.md) -- [Code of Conduct](CODE_OF_CONDUCT.md) -- [Detailed contributing guide](CONTRIBUTING.md) -- [Development setup guide](DEVELOPMENT.md) - -## Basic usage - -Here's an example using rspec-core: - -```ruby -RSpec.describe Order do - it "sums the prices of the items in its line items" do - order = Order.new - order.add_entry(LineItem.new(:item => Item.new( - :price => Money.new(1.11, :USD) - ))) - order.add_entry(LineItem.new(:item => Item.new( - :price => Money.new(2.22, :USD), - :quantity => 2 - ))) - expect(order.total).to eq(Money.new(5.55, :USD)) - end -end -``` - -The `describe` and `it` methods come from rspec-core. The `Order`, `LineItem`, `Item` and `Money` classes would be from _your_ code. The last line of the example -expresses an expected outcome. If `order.total == Money.new(5.55, :USD)`, then -the example passes. If not, it fails with a message like: - -``` - expected: # - got: # -``` - -## Built-in matchers - -### Equivalence - -```ruby -expect(actual).to eq(expected) # passes if actual == expected -expect(actual).to eql(expected) # passes if actual.eql?(expected) -expect(actual).not_to eql(not_expected) # passes if not(actual.eql?(expected)) -``` - -Note: The new `expect` syntax no longer supports the `==` matcher. - -### Identity - -```ruby -expect(actual).to be(expected) # passes if actual.equal?(expected) -expect(actual).to equal(expected) # passes if actual.equal?(expected) -``` - -### Comparisons - -```ruby -expect(actual).to be > expected -expect(actual).to be >= expected -expect(actual).to be <= expected -expect(actual).to be < expected -expect(actual).to be_within(delta).of(expected) -``` - -### Regular expressions - -```ruby -expect(actual).to match(/expression/) -``` - -Note: The new `expect` syntax no longer supports the `=~` matcher. - -### Types/classes - -```ruby -expect(actual).to be_an_instance_of(expected) # passes if actual.class == expected -expect(actual).to be_a(expected) # passes if actual.kind_of?(expected) -expect(actual).to be_an(expected) # an alias for be_a -expect(actual).to be_a_kind_of(expected) # another alias -``` - -### Truthiness - -```ruby -expect(actual).to be_truthy # passes if actual is truthy (not nil or false) -expect(actual).to be true # passes if actual == true -expect(actual).to be_falsy # passes if actual is falsy (nil or false) -expect(actual).to be false # passes if actual == false -expect(actual).to be_nil # passes if actual is nil -expect(actual).to_not be_nil # passes if actual is not nil -``` - -### Expecting errors - -```ruby -expect { ... }.to raise_error -expect { ... }.to raise_error(ErrorClass) -expect { ... }.to raise_error("message") -expect { ... }.to raise_error(ErrorClass, "message") -``` - -### Expecting throws - -```ruby -expect { ... }.to throw_symbol -expect { ... }.to throw_symbol(:symbol) -expect { ... }.to throw_symbol(:symbol, 'value') -``` - -### Yielding - -```ruby -expect { |b| 5.tap(&b) }.to yield_control # passes regardless of yielded args - -expect { |b| yield_if_true(true, &b) }.to yield_with_no_args # passes only if no args are yielded - -expect { |b| 5.tap(&b) }.to yield_with_args(5) -expect { |b| 5.tap(&b) }.to yield_with_args(Integer) -expect { |b| "a string".tap(&b) }.to yield_with_args(/str/) - -expect { |b| [1, 2, 3].each(&b) }.to yield_successive_args(1, 2, 3) -expect { |b| { :a => 1, :b => 2 }.each(&b) }.to yield_successive_args([:a, 1], [:b, 2]) -``` - -### Predicate matchers - -```ruby -expect(actual).to be_xxx # passes if actual.xxx? -expect(actual).to have_xxx(:arg) # passes if actual.has_xxx?(:arg) -``` - -### Ranges (Ruby >= 1.9 only) - -```ruby -expect(1..10).to cover(3) -``` - -### Collection membership - -```ruby -# exact order, entire collection -expect(actual).to eq(expected) - -# exact order, partial collection (based on an exact position) -expect(actual).to start_with(expected) -expect(actual).to end_with(expected) - -# any order, entire collection -expect(actual).to match_array(expected) - -# You can also express this by passing the expected elements -# as individual arguments -expect(actual).to contain_exactly(expected_element1, expected_element2) - - # any order, partial collection -expect(actual).to include(expected) -``` - -#### Examples - -```ruby -expect([1, 2, 3]).to eq([1, 2, 3]) # Order dependent equality check -expect([1, 2, 3]).to include(1) # Exact ordering, partial collection matches -expect([1, 2, 3]).to include(2, 3) # -expect([1, 2, 3]).to start_with(1) # As above, but from the start of the collection -expect([1, 2, 3]).to start_with(1, 2) # -expect([1, 2, 3]).to end_with(3) # As above but from the end of the collection -expect([1, 2, 3]).to end_with(2, 3) # -expect({:a => 'b'}).to include(:a => 'b') # Matching within hashes -expect("this string").to include("is str") # Matching within strings -expect("this string").to start_with("this") # -expect("this string").to end_with("ring") # -expect([1, 2, 3]).to contain_exactly(2, 3, 1) # Order independent matches -expect([1, 2, 3]).to match_array([3, 2, 1]) # - -# Order dependent compound matchers -expect( - [{:a => 'hash'},{:a => 'another'}] -).to match([a_hash_including(:a => 'hash'), a_hash_including(:a => 'another')]) -``` - -## `should` syntax - -In addition to the `expect` syntax, rspec-expectations continues to support the -`should` syntax: - -```ruby -actual.should eq expected -actual.should be > 3 -[1, 2, 3].should_not include 4 -``` - -See [detailed information on the `should` syntax and its usage.](https://github.com/rspec/rspec-expectations/blob/main/Should.md) - -## Compound Matcher Expressions - -You can also create compound matcher expressions using `and` or `or`: - -``` ruby -expect(alphabet).to start_with("a").and end_with("z") -expect(stoplight.color).to eq("red").or eq("green").or eq("yellow") -``` - -## Composing Matchers - -Many of the built-in matchers are designed to take matchers as -arguments, to allow you to flexibly specify only the essential -aspects of an object or data structure. In addition, all of the -built-in matchers have one or more aliases that provide better -phrasing for when they are used as arguments to another matcher. - -### Examples - -```ruby -expect { k += 1.05 }.to change { k }.by( a_value_within(0.1).of(1.0) ) - -expect { s = "barn" }.to change { s } - .from( a_string_matching(/foo/) ) - .to( a_string_matching(/bar/) ) - -expect(["barn", 2.45]).to contain_exactly( - a_value_within(0.1).of(2.5), - a_string_starting_with("bar") -) - -expect(["barn", "food", 2.45]).to end_with( - a_string_matching("foo"), - a_value > 2 -) - -expect(["barn", 2.45]).to include( a_string_starting_with("bar") ) - -expect(:a => "food", :b => "good").to include(:a => a_string_matching(/foo/)) - -hash = { - :a => { - :b => ["foo", 5], - :c => { :d => 2.05 } - } -} - -expect(hash).to match( - :a => { - :b => a_collection_containing_exactly( - a_string_starting_with("f"), - an_instance_of(Integer) - ), - :c => { :d => (a_value < 3) } - } -) - -expect { |probe| - [1, 2, 3].each(&probe) -}.to yield_successive_args( a_value < 2, 2, a_value > 2 ) -``` - -## Usage outside rspec-core - -You always need to load `rspec/expectations` even if you only want to use one part of the library: - -```ruby -require 'rspec/expectations' -``` - -Then simply include `RSpec::Matchers` in any class: - -```ruby -class MyClass - include RSpec::Matchers - - def do_something(arg) - expect(arg).to be > 0 - # do other stuff - end -end -``` - -## Also see - -* [https://github.com/rspec/rspec](https://github.com/rspec/rspec) -* [https://github.com/rspec/rspec-core](https://github.com/rspec/rspec-core) -* [https://github.com/rspec/rspec-mocks](https://github.com/rspec/rspec-mocks) -* [https://github.com/rspec/rspec-rails](https://github.com/rspec/rspec-rails) diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations.rb deleted file mode 100644 index 9e11ea0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations.rb +++ /dev/null @@ -1,82 +0,0 @@ -require 'rspec/support' -RSpec::Support.require_rspec_support "caller_filter" -RSpec::Support.require_rspec_support "warnings" -RSpec::Support.require_rspec_support "object_formatter" - -require 'rspec/matchers' - -RSpec::Support.define_optimized_require_for_rspec(:expectations) { |f| require_relative(f) } - -%w[ - expectation_target - configuration - fail_with - handler - version -].each { |file| RSpec::Support.require_rspec_expectations(file) } - -module RSpec - # RSpec::Expectations provides a simple, readable API to express - # the expected outcomes in a code example. To express an expected - # outcome, wrap an object or block in `expect`, call `to` or `to_not` - # (aliased as `not_to`) and pass it a matcher object: - # - # expect(order.total).to eq(Money.new(5.55, :USD)) - # expect(list).to include(user) - # expect(message).not_to match(/foo/) - # expect { do_something }.to raise_error - # - # The last form (the block form) is needed to match against ruby constructs - # that are not objects, but can only be observed when executing a block - # of code. This includes raising errors, throwing symbols, yielding, - # and changing values. - # - # When `expect(...).to` is invoked with a matcher, it turns around - # and calls `matcher.matches?()`. For example, - # in the expression: - # - # expect(order.total).to eq(Money.new(5.55, :USD)) - # - # ...`eq(Money.new(5.55, :USD))` returns a matcher object, and it results - # in the equivalent of `eq.matches?(order.total)`. If `matches?` returns - # `true`, the expectation is met and execution continues. If `false`, then - # the spec fails with the message returned by `eq.failure_message`. - # - # Given the expression: - # - # expect(order.entries).not_to include(entry) - # - # ...the `not_to` method (also available as `to_not`) invokes the equivalent of - # `include.matches?(order.entries)`, but it interprets `false` as success, and - # `true` as a failure, using the message generated by - # `include.failure_message_when_negated`. - # - # rspec-expectations ships with a standard set of useful matchers, and writing - # your own matchers is quite simple. - # - # See [RSpec::Matchers](../RSpec/Matchers) for more information about the - # built-in matchers that ship with rspec-expectations, and how to write your - # own custom matchers. - module Expectations - # Exception raised when an expectation fails. - # - # @note We subclass Exception so that in a stub implementation if - # the user sets an expectation, it can't be caught in their - # code by a bare `rescue`. - # @api public - class ExpectationNotMetError < Exception - end - - # Exception raised from `aggregate_failures` when multiple expectations fail. - # - # @note The constant is defined here but the extensive logic of this class - # is lazily defined when `FailureAggregator` is autoloaded, since we do - # not need to waste time defining that functionality unless - # `aggregate_failures` is used. - class MultipleExpectationsNotMetError < ExpectationNotMetError - end - - autoload :BlockSnippetExtractor, "rspec/expectations/block_snippet_extractor" - autoload :FailureAggregator, "rspec/expectations/failure_aggregator" - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/block_snippet_extractor.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/block_snippet_extractor.rb deleted file mode 100644 index 25cc326..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/block_snippet_extractor.rb +++ /dev/null @@ -1,255 +0,0 @@ -module RSpec - module Expectations - # @private - class BlockSnippetExtractor # rubocop:disable Metrics/ClassLength - # rubocop should properly handle `Struct.new {}` as an inner class definition. - - attr_reader :proc, :method_name - - def self.try_extracting_single_line_body_of(proc, method_name) - lines = new(proc, method_name).body_content_lines - return nil unless lines.count == 1 - lines.first - rescue Error - nil - end - - def initialize(proc, method_name) - @proc = proc - @method_name = method_name.to_s.freeze - end - - # Ideally we should properly handle indentations of multiline snippet, - # but it's not implemented yet since because we use result of this method only when it's a - # single line and implementing the logic introduces additional complexity. - def body_content_lines - raw_body_lines.map(&:strip).reject(&:empty?) - end - - private - - def raw_body_lines - raw_body_snippet.split("\n") - end - - def raw_body_snippet - block_token_extractor.body_tokens.map(&:string).join - end - - def block_token_extractor - @block_token_extractor ||= BlockTokenExtractor.new(method_name, source, beginning_line_number) - end - - if RSpec.respond_to?(:world) - def source - raise TargetNotFoundError unless File.exist?(file_path) - RSpec.world.source_from_file(file_path) - end - else - # :nocov: - RSpec::Support.require_rspec_support 'source' - def source - raise TargetNotFoundError unless File.exist?(file_path) - @source ||= RSpec::Support::Source.from_file(file_path) - end - # :nocov: - end - - def file_path - source_location.first - end - - def beginning_line_number - source_location.last - end - - def source_location - proc.source_location || raise(TargetNotFoundError) - end - - Error = Class.new(StandardError) - TargetNotFoundError = Class.new(Error) - AmbiguousTargetError = Class.new(Error) - - # @private - # Performs extraction of block body snippet using tokens, - # which cannot be done with node information. - BlockTokenExtractor = Struct.new(:method_name, :source, :beginning_line_number) do - attr_reader :state, :body_tokens - - def initialize(*) - super - parse! - end - - private - - def parse! - @state = :initial - - catch(:finish) do - source.tokens.each do |token| - invoke_state_handler(token) - end - end - end - - def finish! - throw :finish - end - - def invoke_state_handler(token) - __send__("#{state}_state", token) - end - - def initial_state(token) - @state = :after_method_call if token.location == block_locator.method_call_location - end - - def after_method_call_state(token) - @state = :after_opener if handle_opener_token(token) - end - - def after_opener_state(token) - if handle_closer_token(token) - finish_or_find_next_block_if_incorrect! - elsif pipe_token?(token) - finalize_pending_tokens! - @state = :after_beginning_of_args - else - pending_tokens << token - handle_opener_token(token) - @state = :after_beginning_of_body unless token.type == :on_sp - end - end - - def after_beginning_of_args_state(token) - @state = :after_beginning_of_body if pipe_token?(token) - end - - def after_beginning_of_body_state(token) - if handle_closer_token(token) - finish_or_find_next_block_if_incorrect! - else - pending_tokens << token - handle_opener_token(token) - end - end - - def pending_tokens - @pending_tokens ||= [] - end - - def finalize_pending_tokens! - pending_tokens.freeze.tap do - @pending_tokens = nil - end - end - - def finish_or_find_next_block_if_incorrect! - body_tokens = finalize_pending_tokens! - - if correct_block?(body_tokens) - @body_tokens = body_tokens - finish! - else - @state = :after_method_call - end - end - - def handle_opener_token(token) - opener_token?(token).tap do |boolean| - opener_token_stack.push(token) if boolean - end - end - - def opener_token?(token) - token.type == :on_lbrace || (token.type == :on_kw && token.string == 'do') - end - - def handle_closer_token(token) - if opener_token_stack.last.closed_by?(token) - opener_token_stack.pop - opener_token_stack.empty? - else - false - end - end - - def opener_token_stack - @opener_token_stack ||= [] - end - - def pipe_token?(token) - token.type == :on_op && token.string == '|' - end - - def correct_block?(body_tokens) - return true if block_locator.body_content_locations.empty? - content_location = block_locator.body_content_locations.first - content_location.between?(body_tokens.first.location, body_tokens.last.location) - end - - def block_locator - @block_locator ||= BlockLocator.new(method_name, source, beginning_line_number) - end - end - - # @private - # Locates target block with node information (semantics), which tokens don't have. - BlockLocator = Struct.new(:method_name, :source, :beginning_line_number) do - def method_call_location - @method_call_location ||= method_ident_node.location - end - - def body_content_locations - @body_content_locations ||= block_body_node.map(&:location).compact - end - - private - - def method_ident_node - method_call_node = block_wrapper_node.children.first - method_call_node.find do |node| - method_ident_node?(node) - end - end - - def block_body_node - block_node = block_wrapper_node.children[1] - block_node.children.last - end - - def block_wrapper_node - case candidate_block_wrapper_nodes.size - when 1 - candidate_block_wrapper_nodes.first - when 0 - raise TargetNotFoundError - else - raise AmbiguousTargetError - end - end - - def candidate_block_wrapper_nodes - @candidate_block_wrapper_nodes ||= candidate_method_ident_nodes.map do |method_ident_node| - block_wrapper_node = method_ident_node.each_ancestor.find { |node| node.type == :method_add_block } - next nil unless block_wrapper_node - method_call_node = block_wrapper_node.children.first - method_call_node.include?(method_ident_node) ? block_wrapper_node : nil - end.compact - end - - def candidate_method_ident_nodes - source.nodes_by_line_number[beginning_line_number].select do |node| - method_ident_node?(node) - end - end - - def method_ident_node?(node) - node.type == :@ident && node.args.first == method_name - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/configuration.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/configuration.rb deleted file mode 100644 index 21620fb..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/configuration.rb +++ /dev/null @@ -1,244 +0,0 @@ -RSpec::Support.require_rspec_expectations "syntax" - -module RSpec - module Expectations - # Provides configuration options for rspec-expectations. - # If you are using rspec-core, you can access this via a - # block passed to `RSpec::Core::Configuration#expect_with`. - # Otherwise, you can access it via RSpec::Expectations.configuration. - # - # @example - # RSpec.configure do |rspec| - # rspec.expect_with :rspec do |c| - # # c is the config object - # end - # end - # - # # or - # - # RSpec::Expectations.configuration - class Configuration - # @private - FALSE_POSITIVE_BEHAVIOURS = - { - :warn => lambda { |message| RSpec.warning message }, - :raise => lambda { |message| raise ArgumentError, message }, - :nothing => lambda { |_| true }, - } - - def initialize - @on_potential_false_positives = :warn - @strict_predicate_matchers = false - end - - # Configures the supported syntax. - # @param [Array, Symbol] values the syntaxes to enable - # @example - # RSpec.configure do |rspec| - # rspec.expect_with :rspec do |c| - # c.syntax = :should - # # or - # c.syntax = :expect - # # or - # c.syntax = [:should, :expect] - # end - # end - def syntax=(values) - if Array(values).include?(:expect) - Expectations::Syntax.enable_expect - else - Expectations::Syntax.disable_expect - end - - if Array(values).include?(:should) - Expectations::Syntax.enable_should - else - Expectations::Syntax.disable_should - end - end - - # Configures the maximum character length that RSpec will print while - # formatting an object. You can set length to nil to prevent RSpec from - # doing truncation. - # @param [Fixnum] length the number of characters to limit the formatted output to. - # @example - # RSpec.configure do |rspec| - # rspec.expect_with :rspec do |c| - # c.max_formatted_output_length = 200 - # end - # end - def max_formatted_output_length=(length) - RSpec::Support::ObjectFormatter.default_instance.max_formatted_output_length = length - end - - # The list of configured syntaxes. - # @return [Array] the list of configured syntaxes. - # @example - # unless RSpec::Matchers.configuration.syntax.include?(:expect) - # raise "this RSpec extension gem requires the rspec-expectations `:expect` syntax" - # end - def syntax - syntaxes = [] - syntaxes << :should if Expectations::Syntax.should_enabled? - syntaxes << :expect if Expectations::Syntax.expect_enabled? - syntaxes - end - - if ::RSpec.respond_to?(:configuration) - def color? - ::RSpec.configuration.color_enabled? - end - else - # :nocov: - # Indicates whether or not diffs should be colored. - # Delegates to rspec-core's color option if rspec-core - # is loaded; otherwise you can set it here. - attr_writer :color - - # Indicates whether or not diffs should be colored. - # Delegates to rspec-core's color option if rspec-core - # is loaded; otherwise you can set it here. - def color? - defined?(@color) && @color - end - # :nocov: - end - - # :nocov: Because this is only really _useful_ on 1.8, and hard to test elsewhere. - # - # Adds `should` and `should_not` to the given classes - # or modules. This can be used to ensure `should` works - # properly on things like proxy objects (particular - # `Delegator`-subclassed objects on 1.8). - # - # @param [Array] modules the list of classes or modules - # to add `should` and `should_not` to. - def add_should_and_should_not_to(*modules) - modules.each do |mod| - Expectations::Syntax.enable_should(mod) - end - end - # :nocov: - - # Sets or gets the backtrace formatter. The backtrace formatter should - # implement `#format_backtrace(Array)`. This is used - # to format backtraces of errors handled by the `raise_error` - # matcher. - # - # If you are using rspec-core, rspec-core's backtrace formatting - # will be used (including respecting the presence or absence of - # the `--backtrace` option). - # - # @!attribute [rw] backtrace_formatter - attr_writer :backtrace_formatter - def backtrace_formatter - @backtrace_formatter ||= if defined?(::RSpec.configuration.backtrace_formatter) - ::RSpec.configuration.backtrace_formatter - else - NullBacktraceFormatter - end - end - - # Sets if custom matcher descriptions and failure messages - # should include clauses from methods defined using `chain`. - # @param value [Boolean] - attr_writer :include_chain_clauses_in_custom_matcher_descriptions - - # Indicates whether or not custom matcher descriptions and failure messages - # should include clauses from methods defined using `chain`. It is - # false by default for backwards compatibility. - def include_chain_clauses_in_custom_matcher_descriptions? - @include_chain_clauses_in_custom_matcher_descriptions ||= false - end - - # @private - def reset_syntaxes_to_default - self.syntax = [:should, :expect] - RSpec::Expectations::Syntax.warn_about_should! - end - - # @api private - # Null implementation of a backtrace formatter used by default - # when rspec-core is not loaded. Does no filtering. - NullBacktraceFormatter = Module.new do - def self.format_backtrace(backtrace) - backtrace - end - end - - # Configures whether RSpec will warn about matcher use which will - # potentially cause false positives in tests. - # - # @param [Boolean] boolean - def warn_about_potential_false_positives=(boolean) - if boolean - self.on_potential_false_positives = :warn - elsif warn_about_potential_false_positives? - self.on_potential_false_positives = :nothing - else - # no-op, handler is something else - end - end - - # Configures what RSpec will do about matcher use which would potentially cause - # false positives in tests. Defaults to `:warn` since this is generally the desired behavior, - # but can also be set to `:raise` or `:nothing`. - # - # @overload on_potential_false_positives - # @return [Symbol] the behavior setting - # @overload on_potential_false_positives=(value) - # @param [Symbol] behavior can be set to `:warn`, `:raise` or `:nothing` - # @return [Symbol] the behavior setting - attr_reader :on_potential_false_positives - - def on_potential_false_positives=(behavior) - unless FALSE_POSITIVE_BEHAVIOURS.key?(behavior) - raise ArgumentError, "Supported values are: #{FALSE_POSITIVE_BEHAVIOURS.keys}" - end - @on_potential_false_positives = behavior - end - - # Configures RSpec to check predicate matchers to `be(true)` / `be(false)` (strict), - # or `be_truthy` / `be_falsey` (not strict). - # Historically, the default was `false`, but `true` is recommended. - # - # @overload strict_predicate_matchers - # @return [Boolean] - # @overload strict_predicate_matchers? - # @return [Boolean] - # @overload strict_predicate_matchers=(value) - # @param [Boolean] value - attr_reader :strict_predicate_matchers - - def strict_predicate_matchers=(value) - raise ArgumentError, "Pass `true` or `false`" unless value == true || value == false - @strict_predicate_matchers = value - end - - def strict_predicate_matchers? - @strict_predicate_matchers - end - - # Indicates whether RSpec will warn about matcher use which will - # potentially cause false positives in tests, generally you want to - # avoid such scenarios so this defaults to `true`. - def warn_about_potential_false_positives? - on_potential_false_positives == :warn - end - - # @private - def false_positives_handler - FALSE_POSITIVE_BEHAVIOURS.fetch(@on_potential_false_positives) - end - end - - # The configuration object. - # @return [RSpec::Expectations::Configuration] the configuration object - def self.configuration - @configuration ||= Configuration.new - end - - # set default syntax - configuration.reset_syntaxes_to_default - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/expectation_target.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/expectation_target.rb deleted file mode 100644 index 7d1e8d4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/expectation_target.rb +++ /dev/null @@ -1,163 +0,0 @@ -module RSpec - module Expectations - # Wraps the target of an expectation. - # - # @example - # expect(something) # => ExpectationTarget wrapping something - # expect { do_something } # => ExpectationTarget wrapping the block - # - # # used with `to` - # expect(actual).to eq(3) - # - # # with `not_to` - # expect(actual).not_to eq(3) - # - # @note `ExpectationTarget` is not intended to be instantiated - # directly by users. Use `expect` instead. - class ExpectationTarget - # @private - # Used as a sentinel value to be able to tell when the user - # did not pass an argument. We can't use `nil` for that because - # `nil` is a valid value to pass. - UndefinedValue = Module.new - - # @note this name aligns with `Minitest::Expectation` so that our - # {InstanceMethods} module can be included in that class when - # used in a Minitest context. - # @return [Object] the target of the expectation - attr_reader :target - - # @api private - def initialize(value) - @target = value - end - - # @private - def self.for(value, block) - if UndefinedValue.equal?(value) - unless block - raise ArgumentError, "You must pass either an argument or a block to `expect`." - end - BlockExpectationTarget.new(block) - elsif block - raise ArgumentError, "You cannot pass both an argument and a block to `expect`." - else - ValueExpectationTarget.new(value) - end - end - - # Defines instance {ExpectationTarget} instance methods. These are defined - # in a module so we can include it in `Minitest::Expectation` when - # `rspec/expectations/minitest_integration` is loaded in order to - # support usage with Minitest. - module InstanceMethods - # Runs the given expectation, passing if `matcher` returns true. - # @example - # expect(value).to eq(5) - # expect { perform }.to raise_error - # @param [Matcher] - # matcher - # @param [String, Proc] message optional message to display when the expectation fails - # @return [Boolean] true if the expectation succeeds (else raises) - # @see RSpec::Matchers - def to(matcher=nil, message=nil, &block) - prevent_operator_matchers(:to) unless matcher - RSpec::Expectations::PositiveExpectationHandler.handle_matcher(target, matcher, message, &block) - end - - # Runs the given expectation, passing if `matcher` returns false. - # @example - # expect(value).not_to eq(5) - # @param [Matcher] - # matcher - # @param [String, Proc] message optional message to display when the expectation fails - # @return [Boolean] false if the negative expectation succeeds (else raises) - # @see RSpec::Matchers - def not_to(matcher=nil, message=nil, &block) - prevent_operator_matchers(:not_to) unless matcher - RSpec::Expectations::NegativeExpectationHandler.handle_matcher(target, matcher, message, &block) - end - alias to_not not_to - - private - - def prevent_operator_matchers(verb) - raise ArgumentError, "The expect syntax does not support operator matchers, " \ - "so you must pass a matcher to `##{verb}`." - end - end - - include InstanceMethods - end - - # @private - # Validates the provided matcher to ensure it supports block - # expectations, in order to avoid user confusion when they - # use a block thinking the expectation will be on the return - # value of the block rather than the block itself. - class ValueExpectationTarget < ExpectationTarget - def to(matcher=nil, message=nil, &block) - enforce_value_expectation(matcher) - super - end - - def not_to(matcher=nil, message=nil, &block) - enforce_value_expectation(matcher) - super - end - - private - - def enforce_value_expectation(matcher) - return if supports_value_expectations?(matcher) - - RSpec.deprecate( - "expect(value).to #{RSpec::Support::ObjectFormatter.format(matcher)}", - :message => - "The implicit block expectation syntax is deprecated, you should pass " \ - "a block rather than an argument to `expect` to use the provided " \ - "block expectation matcher or the matcher must implement " \ - "`supports_value_expectations?`. e.g `expect { value }.to " \ - "#{RSpec::Support::ObjectFormatter.format(matcher)}` not " \ - "`expect(value).to #{RSpec::Support::ObjectFormatter.format(matcher)}`" - ) - end - - def supports_value_expectations?(matcher) - !matcher.respond_to?(:supports_value_expectations?) || matcher.supports_value_expectations? - end - end - - # @private - # Validates the provided matcher to ensure it supports block - # expectations, in order to avoid user confusion when they - # use a block thinking the expectation will be on the return - # value of the block rather than the block itself. - class BlockExpectationTarget < ExpectationTarget - def to(matcher, message=nil, &block) - enforce_block_expectation(matcher) - super - end - - def not_to(matcher, message=nil, &block) - enforce_block_expectation(matcher) - super - end - alias to_not not_to - - private - - def enforce_block_expectation(matcher) - return if supports_block_expectations?(matcher) - - raise ExpectationNotMetError, "You must pass an argument rather than a block to `expect` to use the provided " \ - "matcher (#{RSpec::Support::ObjectFormatter.format(matcher)}), or the matcher must implement " \ - "`supports_block_expectations?`." - end - - def supports_block_expectations?(matcher) - matcher.respond_to?(:supports_block_expectations?) && matcher.supports_block_expectations? - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/fail_with.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/fail_with.rb deleted file mode 100644 index 17b66b3..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/fail_with.rb +++ /dev/null @@ -1,39 +0,0 @@ -module RSpec - module Expectations - class << self - # @private - class Differ - # @private - OBJECT_PREPARER = lambda do |object| - RSpec::Matchers::Composable.surface_descriptions_in(object) - end - end - - # @private - def differ - RSpec::Support::Differ.new( - :object_preparer => Differ::OBJECT_PREPARER, - :color => RSpec::Matchers.configuration.color? - ) - end - - # Raises an RSpec::Expectations::ExpectationNotMetError with message. - # @param [String] message - # @param [Object] expected - # @param [Object] actual - # - # Adds a diff to the failure message when `expected` and `actual` are - # both present. - def fail_with(message, expected=nil, actual=nil) - unless message - raise ArgumentError, "Failure message is nil. Does your matcher define the " \ - "appropriate failure_message[_when_negated] method to return a string?" - end - - message = ::RSpec::Matchers::MultiMatcherDiff.from(expected, actual).message_with_diff(message, differ) - - RSpec::Support.notify_failure(RSpec::Expectations::ExpectationNotMetError.new message) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/failure_aggregator.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/failure_aggregator.rb deleted file mode 100644 index b573bba..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/failure_aggregator.rb +++ /dev/null @@ -1,236 +0,0 @@ -module RSpec - module Expectations - # @private - class FailureAggregator - attr_reader :block_label, :metadata - - # @private - class AggregatedFailure - # :nocov: - # `inspect` was apparently used by some versions early in ruby 3 while constructing - # NoMethodError, but seems to be no longer. - # - # @private - MESSAGE = - 'AggregatedFailure: This method caused a failure which has been ' \ - 'suppressed to be aggregated into our failure report by returning ' \ - 'this value, further errors can be ignored.' - - def inspect - MESSAGE - end - # :nocov: - end - - AGGREGATED_FAILURE = AggregatedFailure.new - - def aggregate - RSpec::Support.with_failure_notifier(self) do - begin - yield - rescue ExpectationNotMetError => e - # Normally, expectation failures will be notified via the `call` method, below, - # but since the failure notifier uses a thread local variable, failing expectations - # in another thread will still raise. We handle that here and categorize it as part - # of `failures` rather than letting it fall through and be categorized as part of - # `other_errors`. - failures << e - rescue Support::AllExceptionsExceptOnesWeMustNotRescue => e - # While it is normally a bad practice to rescue `Exception`, it's important we do - # so here. It's low risk (`notify_aggregated_failures` below will re-raise the exception, - # or raise a `MultipleExpectationsNotMetError` that includes the exception), and it's - # essential that the user is notified of expectation failures that may have already - # occurred in the `aggregate_failures` block. Those expectation failures may provide - # important diagnostics for understanding why this exception occurred, and if we simply - # allowed this exception to be raised as-is, it would (wrongly) suggest to the user - # that the expectation passed when it did not, which would be quite confusing. - other_errors << e - end - end - - notify_aggregated_failures - end - - def failures - @failures ||= [] - end - - def other_errors - @other_errors ||= [] - end - - # This method is defined to satisfy the callable interface - # expected by `RSpec::Support.with_failure_notifier`. - def call(failure, options) - source_id = options[:source_id] - return if source_id && @seen_source_ids.key?(source_id) - - @seen_source_ids[source_id] = true - assign_backtrace(failure) unless failure.backtrace - failures << failure - - AGGREGATED_FAILURE - end - - private - - if RSpec::Support::Ruby.jruby? && RSpec::Support::Ruby.jruby_version < '9.2.0.0' - # On JRuby 9.1.x.x and before, `caller` and `raise` produce different backtraces with - # regards to `.java` stack frames. It's important that we use `raise` for JRuby to produce - # a backtrace that has a continuous common section with the raised `MultipleExpectationsNotMetError`, - # so that rspec-core's truncation logic can work properly on it to list the backtrace - # relative to the `aggregate_failures` block. - # :nocov: - def assign_backtrace(failure) - raise failure - rescue failure.class => e - failure.set_backtrace(e.backtrace) - end - # :nocov: - else - # Using `caller` performs better (and is simpler) than `raise` on most Rubies. - def assign_backtrace(failure) - failure.set_backtrace(caller) - end - end - - def initialize(block_label, metadata) - @block_label = block_label - @metadata = metadata - @seen_source_ids = {} # don't want to load stdlib set - end - - def notify_aggregated_failures - all_errors = failures + other_errors - - case all_errors.size - when 0 then return true - when 1 then RSpec::Support.notify_failure all_errors.first - else RSpec::Support.notify_failure MultipleExpectationsNotMetError.new(self) - end - end - end - - # Exception raised from `aggregate_failures` when multiple expectations fail. - class MultipleExpectationsNotMetError - # @return [String] The fully formatted exception message. - def message - @message ||= (["#{summary}:"] + enumerated_failures + enumerated_errors).join("\n\n") - end - - # @return [Array] The list of expectation failures. - def failures - @failure_aggregator.failures - end - - # @return [Array] The list of other exceptions. - def other_errors - @failure_aggregator.other_errors - end - - # @return [Array] The list of expectation failures and other exceptions, combined. - attr_reader :all_exceptions - - # @return [String] The user-assigned label for the aggregation block. - def aggregation_block_label - @failure_aggregator.block_label - end - - # @return [Hash] The metadata hash passed to `aggregate_failures`. - def aggregation_metadata - @failure_aggregator.metadata - end - - # @return [String] A summary of the failure, including the block label and a count of failures. - def summary - "Got #{exception_count_description} from failure aggregation " \ - "block#{block_description}" - end - - # return [String] A description of the failure/error counts. - def exception_count_description - failure_count = pluralize("failure", failures.size) - return failure_count if other_errors.empty? - error_count = pluralize("other error", other_errors.size) - "#{failure_count} and #{error_count}" - end - - private - - def initialize(failure_aggregator) - @failure_aggregator = failure_aggregator - @all_exceptions = failures + other_errors - end - - def block_description - return "" unless aggregation_block_label - " #{aggregation_block_label.inspect}" - end - - def pluralize(noun, count) - "#{count} #{noun}#{'s' unless count == 1}" - end - - def enumerated(exceptions, index_offset) - exceptions.each_with_index.map do |exception, index| - index += index_offset - formatted_message = "#{yield exception}\n#{format_backtrace(exception.backtrace).first}" - "#{index_label index}#{indented formatted_message, index}" - end - end - - def exclusion_patterns - patterns = %w[/lib\d*/ruby/ bin/ exe/rspec /lib/bundler/ /exe/bundle:] - patterns << "org/jruby/" if RSpec::Support::Ruby.jruby? - patterns.map! { |s| Regexp.new(s.gsub('/', File::SEPARATOR)) } - end - - def format_backtrace(backtrace) - backtrace.map { |l| backtrace_line(l) }.compact.tap { |filtered| filtered.concat backtrace if filtered.empty? } - end - - def backtrace_line(line) - return if [Regexp.union(RSpec::CallerFilter::IGNORE_REGEX, *exclusion_patterns)].any? { |p| line =~ p } - - # It changes the current path that is relative to - # system root to be relative to the project root. - line.sub(/(\A|\s)#{File.expand_path('.')}(#{File::SEPARATOR}|\s|\Z)/, '\\1.\\2'.freeze).sub(/\A([^:]+:\d+)$/, '\\1'.freeze) - end - - def enumerated_failures - enumerated(failures, 0, &:message) - end - - def enumerated_errors - enumerated(other_errors, failures.size) do |error| - "#{error.class}: #{error.message}" - end - end - - def indented(failure_message, index) - line_1, *rest = failure_message.strip.lines.to_a - first_line_indentation = ' ' * (longest_index_label_width - width_of_label(index)) - - first_line_indentation + line_1 + rest.map do |line| - line =~ /\S/ ? indentation + line : line - end.join - end - - def indentation - @indentation ||= ' ' * longest_index_label_width - end - - def longest_index_label_width - @longest_index_label_width ||= width_of_label(failures.size) - end - - def width_of_label(index) - index_label(index).chars.count - end - - def index_label(index) - " #{index + 1}) " - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/handler.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/handler.rb deleted file mode 100644 index d86061a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/handler.rb +++ /dev/null @@ -1,181 +0,0 @@ -module RSpec - module Expectations - # @private - module ExpectationHelper - def self.check_message(msg) - unless msg.nil? || msg.respond_to?(:to_str) || msg.respond_to?(:call) - RSpec.warning( - "ignoring the provided expectation message argument" \ - "(#{ msg.inspect }) since it is not a string or a proc" - ) - end - end - - # Returns an RSpec-3+ compatible matcher, wrapping a legacy one - # in an adapter if necessary. - # - # @private - def self.modern_matcher_from(matcher) - LegacyMatcherAdapter::RSpec2.wrap(matcher) || - LegacyMatcherAdapter::RSpec1.wrap(matcher) || matcher - end - - def self.with_matcher(handler, matcher, message) - check_message(message) - matcher = modern_matcher_from(matcher) - yield matcher - ensure - ::RSpec::Matchers.last_expectation_handler = handler - ::RSpec::Matchers.last_matcher = matcher - end - - def self.handle_failure(matcher, message, failure_message_method) - message = message.call if message.respond_to?(:call) - message ||= matcher.__send__(failure_message_method) - - if matcher.respond_to?(:diffable?) && matcher.diffable? - ::RSpec::Expectations.fail_with message, matcher.expected, matcher.actual - else - ::RSpec::Expectations.fail_with message - end - end - end - - # @private - class PositiveExpectationHandler - def self.handle_matcher(actual, initial_matcher, custom_message=nil, &block) - ExpectationHelper.with_matcher(self, initial_matcher, custom_message) do |matcher| - return ::RSpec::Matchers::BuiltIn::PositiveOperatorMatcher.new(actual) unless initial_matcher - - match_result = matcher.matches?(actual, &block) - if custom_message && match_result.respond_to?(:error_generator) - match_result.error_generator.opts[:message] = custom_message - end - - match_result || ExpectationHelper.handle_failure(matcher, custom_message, :failure_message) - end - end - - def self.verb - 'is expected to' - end - - def self.should_method - :should - end - - def self.opposite_should_method - :should_not - end - end - - # @private - class NegativeExpectationHandler - def self.handle_matcher(actual, initial_matcher, custom_message=nil, &block) - ExpectationHelper.with_matcher(self, initial_matcher, custom_message) do |matcher| - return ::RSpec::Matchers::BuiltIn::NegativeOperatorMatcher.new(actual) unless initial_matcher - - negated_match_result = does_not_match?(matcher, actual, &block) - if custom_message && negated_match_result.respond_to?(:error_generator) - negated_match_result.error_generator.opts[:message] = custom_message - end - - negated_match_result || ExpectationHelper.handle_failure(matcher, custom_message, :failure_message_when_negated) - end - end - - def self.does_not_match?(matcher, actual, &block) - if matcher.respond_to?(:does_not_match?) - matcher.does_not_match?(actual, &block) - else - !matcher.matches?(actual, &block) - end - end - - def self.verb - 'is expected not to' - end - - def self.should_method - :should_not - end - - def self.opposite_should_method - :should - end - end - - # Wraps a matcher written against one of the legacy protocols in - # order to present the current protocol. - # - # @private - class LegacyMatcherAdapter < Matchers::MatcherDelegator - def initialize(matcher) - super - ::RSpec.warn_deprecation(<<-EOS.gsub(/^\s+\|/, ''), :type => "legacy_matcher") - |#{matcher.class.name || matcher.inspect} implements a legacy RSpec matcher - |protocol. For the current protocol you should expose the failure messages - |via the `failure_message` and `failure_message_when_negated` methods. - |(Used from #{CallerFilter.first_non_rspec_line}) - EOS - end - - def self.wrap(matcher) - new(matcher) if interface_matches?(matcher) - end - - # Starting in RSpec 1.2 (and continuing through all 2.x releases), - # the failure message protocol was: - # * `failure_message_for_should` - # * `failure_message_for_should_not` - # @private - class RSpec2 < self - def failure_message - base_matcher.failure_message_for_should - end - - def failure_message_when_negated - base_matcher.failure_message_for_should_not - end - - def self.interface_matches?(matcher) - ( - !matcher.respond_to?(:failure_message) && - matcher.respond_to?(:failure_message_for_should) - ) || ( - !matcher.respond_to?(:failure_message_when_negated) && - matcher.respond_to?(:failure_message_for_should_not) - ) - end - end - - # Before RSpec 1.2, the failure message protocol was: - # * `failure_message` - # * `negative_failure_message` - # @private - class RSpec1 < self - def failure_message - base_matcher.failure_message - end - - def failure_message_when_negated - base_matcher.negative_failure_message - end - - # Note: `failure_message` is part of the RSpec 3 protocol - # (paired with `failure_message_when_negated`), so we don't check - # for `failure_message` here. - def self.interface_matches?(matcher) - !matcher.respond_to?(:failure_message_when_negated) && - matcher.respond_to?(:negative_failure_message) - end - end - end - - # RSpec 3.0 was released with the class name misspelled. For SemVer compatibility, - # we will provide this misspelled alias until 4.0. - # @deprecated Use LegacyMatcherAdapter instead. - # @private - LegacyMacherAdapter = LegacyMatcherAdapter - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/minitest_integration.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/minitest_integration.rb deleted file mode 100644 index 94cdb5f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/minitest_integration.rb +++ /dev/null @@ -1,58 +0,0 @@ -require 'rspec/expectations' - -Minitest::Test.class_eval do - include ::RSpec::Matchers - - # This `expect` will only be called if the user is using Minitest < 5.6 - # or if they are _not_ using Minitest::Spec on 5.6+. Minitest::Spec on 5.6+ - # defines its own `expect` and will have the assertions incremented via our - # definitions of `to`/`not_to`/`to_not` below. - def expect(*a, &b) - self.assertions += 1 - super - end - - # Convert a `MultipleExpectationsNotMetError` to a `Minitest::Assertion` error so - # it gets counted in minitest's summary stats as a failure rather than an error. - # It would be nice to make `MultipleExpectationsNotMetError` subclass - # `Minitest::Assertion`, but Minitest's implementation does not treat subclasses - # the same, so this is the best we can do. - def aggregate_failures(*args, &block) - super - rescue RSpec::Expectations::MultipleExpectationsNotMetError => e - assertion_failed = Minitest::Assertion.new(e.message) - assertion_failed.set_backtrace e.backtrace - raise assertion_failed - end -end - -# Older versions of Minitest (e.g. before 5.6) do not define -# `Minitest::Expectation`. -if defined?(::Minitest::Expectation) - Minitest::Expectation.class_eval do - include RSpec::Expectations::ExpectationTarget::InstanceMethods - - def to(*args) - ctx.assertions += 1 - super - end - - def not_to(*args) - ctx.assertions += 1 - super - end - - def to_not(*args) - ctx.assertions += 1 - super - end - end -end - -module RSpec - module Expectations - remove_const :ExpectationNotMetError - # Exception raised when an expectation fails. - const_set :ExpectationNotMetError, ::Minitest::Assertion - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/syntax.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/syntax.rb deleted file mode 100644 index b843034..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/syntax.rb +++ /dev/null @@ -1,132 +0,0 @@ -module RSpec - module Expectations - # @api private - # Provides methods for enabling and disabling the available - # syntaxes provided by rspec-expectations. - module Syntax - module_function - - # @api private - # Determines where we add `should` and `should_not`. - def default_should_host - @default_should_host ||= ::Object.ancestors.last - end - - # @api private - # Instructs rspec-expectations to warn on first usage of `should` or `should_not`. - # Enabled by default. This is largely here to facilitate testing. - def warn_about_should! - @warn_about_should = true - end - - # @api private - # Generates a deprecation warning for the given method if no warning - # has already been issued. - def warn_about_should_unless_configured(method_name) - return unless @warn_about_should - - RSpec.deprecate( - "Using `#{method_name}` from rspec-expectations' old `:should` syntax without explicitly enabling the syntax", - :replacement => "the new `:expect` syntax or explicitly enable `:should` with `config.expect_with(:rspec) { |c| c.syntax = :should }`" - ) - - @warn_about_should = false - end - - # @api private - # Enables the `should` syntax. - def enable_should(syntax_host=default_should_host) - @warn_about_should = false if syntax_host == default_should_host - return if should_enabled?(syntax_host) - - syntax_host.module_exec do - def should(matcher=nil, message=nil, &block) - ::RSpec::Expectations::Syntax.warn_about_should_unless_configured(::Kernel.__method__) - ::RSpec::Expectations::PositiveExpectationHandler.handle_matcher(self, matcher, message, &block) - end - - def should_not(matcher=nil, message=nil, &block) - ::RSpec::Expectations::Syntax.warn_about_should_unless_configured(::Kernel.__method__) - ::RSpec::Expectations::NegativeExpectationHandler.handle_matcher(self, matcher, message, &block) - end - end - end - - # @api private - # Disables the `should` syntax. - def disable_should(syntax_host=default_should_host) - return unless should_enabled?(syntax_host) - - syntax_host.module_exec do - undef should - undef should_not - end - end - - # @api private - # Enables the `expect` syntax. - def enable_expect(syntax_host=::RSpec::Matchers) - return if expect_enabled?(syntax_host) - - syntax_host.module_exec do - def expect(value=::RSpec::Expectations::ExpectationTarget::UndefinedValue, &block) - ::RSpec::Expectations::ExpectationTarget.for(value, block) - end - end - end - - # @api private - # Disables the `expect` syntax. - def disable_expect(syntax_host=::RSpec::Matchers) - return unless expect_enabled?(syntax_host) - - syntax_host.module_exec do - undef expect - end - end - - # @api private - # Indicates whether or not the `should` syntax is enabled. - def should_enabled?(syntax_host=default_should_host) - syntax_host.method_defined?(:should) - end - - # @api private - # Indicates whether or not the `expect` syntax is enabled. - def expect_enabled?(syntax_host=::RSpec::Matchers) - syntax_host.method_defined?(:expect) - end - end - end -end - -if defined?(BasicObject) - # The legacy `:should` syntax adds the following methods directly to - # `BasicObject` so that they are available off of any object. Note, however, - # that this syntax does not always play nice with delegate/proxy objects. - # We recommend you use the non-monkeypatching `:expect` syntax instead. - class BasicObject - # @method should(matcher, message) - # Passes if `matcher` returns true. Available on every `Object`. - # @example - # actual.should eq expected - # actual.should match /expression/ - # @param [Matcher] - # matcher - # @param [String] message optional message to display when the expectation fails - # @return [Boolean] true if the expectation succeeds (else raises) - # @note This is only available when you have enabled the `:should` syntax. - # @see RSpec::Matchers - - # @method should_not(matcher, message) - # Passes if `matcher` returns false. Available on every `Object`. - # @example - # actual.should_not eq expected - # @param [Matcher] - # matcher - # @param [String] message optional message to display when the expectation fails - # @return [Boolean] false if the negative expectation succeeds (else raises) - # @note This is only available when you have enabled the `:should` syntax. - # @see RSpec::Matchers - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/version.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/version.rb deleted file mode 100644 index 0fc9ef9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/expectations/version.rb +++ /dev/null @@ -1,8 +0,0 @@ -module RSpec - module Expectations - # @private - module Version - STRING = '3.13.5' - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers.rb deleted file mode 100644 index d5347d1..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers.rb +++ /dev/null @@ -1,1046 +0,0 @@ -require 'rspec/support' -RSpec::Support.require_rspec_support 'matcher_definition' -RSpec::Support.define_optimized_require_for_rspec(:matchers) { |f| require_relative(f) } - -%w[ - english_phrasing - composable - built_in - generated_descriptions - dsl - matcher_delegator - aliased_matcher - multi_matcher_diff -].each { |file| RSpec::Support.require_rspec_matchers(file) } - -# RSpec's top level namespace. All of rspec-expectations is contained -# in the `RSpec::Expectations` and `RSpec::Matchers` namespaces. -module RSpec - # RSpec::Matchers provides a number of useful matchers we use to define - # expectations. Any object that implements the [matcher protocol](Matchers/MatcherProtocol) - # can be used as a matcher. - # - # ## Predicates - # - # In addition to matchers that are defined explicitly, RSpec will create - # custom matchers on the fly for any arbitrary predicate, giving your specs a - # much more natural language feel. - # - # A Ruby predicate is a method that ends with a "?" and returns true or false. - # Common examples are `empty?`, `nil?`, and `instance_of?`. - # - # All you need to do is write `expect(..).to be_` followed by the predicate - # without the question mark, and RSpec will figure it out from there. - # For example: - # - # expect([]).to be_empty # => [].empty?() | passes - # expect([]).not_to be_empty # => [].empty?() | fails - # - # In addition to prefixing the predicate matchers with "be_", you can also use "be_a_" - # and "be_an_", making your specs read much more naturally: - # - # expect("a string").to be_an_instance_of(String) # =>"a string".instance_of?(String) # passes - # - # expect(3).to be_a_kind_of(Integer) # => 3.kind_of?(Numeric) | passes - # expect(3).to be_a_kind_of(Numeric) # => 3.kind_of?(Numeric) | passes - # expect(3).to be_an_instance_of(Integer) # => 3.instance_of?(Integer) | passes - # expect(3).not_to be_an_instance_of(Numeric) # => 3.instance_of?(Numeric) | fails - # - # RSpec will also create custom matchers for predicates like `has_key?`. To - # use this feature, just state that the object should have_key(:key) and RSpec will - # call has_key?(:key) on the target. For example: - # - # expect(:a => "A").to have_key(:a) - # expect(:a => "A").to have_key(:b) # fails - # - # You can use this feature to invoke any predicate that begins with "has_", whether it is - # part of the Ruby libraries (like `Hash#has_key?`) or a method you wrote on your own class. - # - # Note that RSpec does not provide composable aliases for these dynamic predicate - # matchers. You can easily define your own aliases, though: - # - # RSpec::Matchers.alias_matcher :a_user_who_is_an_admin, :be_an_admin - # expect(user_list).to include(a_user_who_is_an_admin) - # - # ## Alias Matchers - # - # With {RSpec::Matchers.alias_matcher}, you can easily create an - # alternate name for a given matcher. - # - # The description will also change according to the new name: - # - # RSpec::Matchers.alias_matcher :a_list_that_sums_to, :sum_to - # sum_to(3).description # => "sum to 3" - # a_list_that_sums_to(3).description # => "a list that sums to 3" - # - # or you can specify a custom description like this: - # - # RSpec::Matchers.alias_matcher :a_list_sorted_by, :be_sorted_by do |description| - # description.sub("be sorted by", "a list sorted by") - # end - # - # be_sorted_by(:age).description # => "be sorted by age" - # a_list_sorted_by(:age).description # => "a list sorted by age" - # - # ## Custom Matchers - # - # When you find that none of the stock matchers provide a natural feeling - # expectation, you can very easily write your own using RSpec's matcher DSL - # or writing one from scratch. - # - # ### Matcher DSL - # - # Imagine that you are writing a game in which players can be in various - # zones on a virtual board. To specify that bob should be in zone 4, you - # could say: - # - # expect(bob.current_zone).to eql(Zone.new("4")) - # - # But you might find it more expressive to say: - # - # expect(bob).to be_in_zone("4") - # - # and/or - # - # expect(bob).not_to be_in_zone("3") - # - # You can create such a matcher like so: - # - # RSpec::Matchers.define :be_in_zone do |zone| - # match do |player| - # player.in_zone?(zone) - # end - # end - # - # This will generate a be_in_zone method that returns a matcher - # with logical default messages for failures. You can override the failure - # messages and the generated description as follows: - # - # RSpec::Matchers.define :be_in_zone do |zone| - # match do |player| - # player.in_zone?(zone) - # end - # - # failure_message do |player| - # # generate and return the appropriate string. - # end - # - # failure_message_when_negated do |player| - # # generate and return the appropriate string. - # end - # - # description do - # # generate and return the appropriate string. - # end - # end - # - # Each of the message-generation methods has access to the block arguments - # passed to the create method (in this case, zone). The - # failure message methods (failure_message and - # failure_message_when_negated) are passed the actual value (the - # receiver of expect(..) or expect(..).not_to). - # - # ### Custom Matcher from scratch - # - # You could also write a custom matcher from scratch, as follows: - # - # class BeInZone - # def initialize(expected) - # @expected = expected - # end - # - # def matches?(target) - # @target = target - # @target.current_zone.eql?(Zone.new(@expected)) - # end - # - # def failure_message - # "expected #{@target.inspect} to be in Zone #{@expected}" - # end - # - # def failure_message_when_negated - # "expected #{@target.inspect} not to be in Zone #{@expected}" - # end - # end - # - # ... and a method like this: - # - # def be_in_zone(expected) - # BeInZone.new(expected) - # end - # - # And then expose the method to your specs. This is normally done - # by including the method and the class in a module, which is then - # included in your spec: - # - # module CustomGameMatchers - # class BeInZone - # # ... - # end - # - # def be_in_zone(expected) - # # ... - # end - # end - # - # describe "Player behaviour" do - # include CustomGameMatchers - # # ... - # end - # - # or you can include in globally in a spec_helper.rb file required - # from your spec file(s): - # - # RSpec::configure do |config| - # config.include(CustomGameMatchers) - # end - # - # ### Making custom matchers composable - # - # RSpec's built-in matchers are designed to be composed, in expressions like: - # - # expect(["barn", 2.45]).to contain_exactly( - # a_value_within(0.1).of(2.5), - # a_string_starting_with("bar") - # ) - # - # Custom matchers can easily participate in composed matcher expressions like these. - # Include {RSpec::Matchers::Composable} in your custom matcher to make it support - # being composed (matchers defined using the DSL have this included automatically). - # Within your matcher's `matches?` method (or the `match` block, if using the DSL), - # use `values_match?(expected, actual)` rather than `expected == actual`. - # Under the covers, `values_match?` is able to match arbitrary - # nested data structures containing a mix of both matchers and non-matcher objects. - # It uses `===` and `==` to perform the matching, considering the values to - # match if either returns `true`. The `Composable` mixin also provides some helper - # methods for surfacing the matcher descriptions within your matcher's description - # or failure messages. - # - # RSpec's built-in matchers each have a number of aliases that rephrase the matcher - # from a verb phrase (such as `be_within`) to a noun phrase (such as `a_value_within`), - # which reads better when the matcher is passed as an argument in a composed matcher - # expressions, and also uses the noun-phrase wording in the matcher's `description`, - # for readable failure messages. You can alias your custom matchers in similar fashion - # using {RSpec::Matchers.alias_matcher}. - # - # ## Negated Matchers - # - # Sometimes if you want to test for the opposite using a more descriptive name - # instead of using `not_to`, you can use {RSpec::Matchers.define_negated_matcher}: - # - # RSpec::Matchers.define_negated_matcher :exclude, :include - # include(1, 2).description # => "include 1 and 2" - # exclude(1, 2).description # => "exclude 1 and 2" - # - # While the most obvious negated form may be to add a `not_` prefix, - # the failure messages you get with that form can be confusing (e.g. - # "expected [actual] to not [verb], but did not"). We've found it works - # best to find a more positive name for the negated form, such as - # `avoid_changing` rather than `not_change`. - # - module Matchers # rubocop:disable Metrics/ModuleLength - extend ::RSpec::Matchers::DSL - - # @!macro [attach] alias_matcher - # @!parse - # alias $1 $2 - # @!visibility private - # We define this override here so we can attach a YARD macro to it. - # It ensures that our docs list all the matcher aliases. - def self.alias_matcher(*args, &block) - super(*args, &block) - end - - # @!method self.alias_matcher(new_name, old_name, options={}, &description_override) - # Extended from {RSpec::Matchers::DSL#alias_matcher}. - - # @!method self.define(name, &declarations) - # Extended from {RSpec::Matchers::DSL#define}. - - # @!method self.define_negated_matcher(negated_name, base_name, &description_override) - # Extended from {RSpec::Matchers::DSL#define_negated_matcher}. - - # @method expect - # Supports `expect(actual).to matcher` syntax by wrapping `actual` in an - # `ExpectationTarget`. - # @example - # expect(actual).to eq(expected) - # expect(actual).not_to eq(expected) - # @return [Expectations::ExpectationTarget] - # @see Expectations::ExpectationTarget#to - # @see Expectations::ExpectationTarget#not_to - - # Allows multiple expectations in the provided block to fail, and then - # aggregates them into a single exception, rather than aborting on the - # first expectation failure like normal. This allows you to see all - # failures from an entire set of expectations without splitting each - # off into its own example (which may slow things down if the example - # setup is expensive). - # - # @param label [String] label for this aggregation block, which will be - # included in the aggregated exception message. - # @param metadata [Hash] additional metadata about this failure aggregation - # block. If multiple expectations fail, it will be exposed from the - # {Expectations::MultipleExpectationsNotMetError} exception. Mostly - # intended for internal RSpec use but you can use it as well. - # @yield Block containing as many expectation as you want. The block is - # simply yielded to, so you can trust that anything that works outside - # the block should work within it. - # @raise [Expectations::MultipleExpectationsNotMetError] raised when - # multiple expectations fail. - # @raise [Expectations::ExpectationNotMetError] raised when a single - # expectation fails. - # @raise [Exception] other sorts of exceptions will be raised as normal. - # - # @example - # aggregate_failures("verifying response") do - # expect(response.status).to eq(200) - # expect(response.headers).to include("Content-Type" => "text/plain") - # expect(response.body).to include("Success") - # end - # - # @note The implementation of this feature uses a thread-local variable, - # which means that if you have an expectation failure in another thread, - # it'll abort like normal. - def aggregate_failures(label=nil, metadata={}, &block) - Expectations::FailureAggregator.new(label, metadata).aggregate(&block) - end - - # Passes if actual is truthy (anything but false or nil) - def be_truthy - BuiltIn::BeTruthy.new - end - alias_matcher :a_truthy_value, :be_truthy - - # Passes if actual is falsey (false or nil) - def be_falsey - BuiltIn::BeFalsey.new - end - alias_matcher :be_falsy, :be_falsey - alias_matcher :a_falsey_value, :be_falsey - alias_matcher :a_falsy_value, :be_falsey - - # Passes if actual is nil - def be_nil - BuiltIn::BeNil.new - end - alias_matcher :a_nil_value, :be_nil - - # @example - # expect(actual).to be_truthy - # expect(actual).to be_falsey - # expect(actual).to be_nil - # expect(actual).to be_[arbitrary_predicate](*args) - # expect(actual).not_to be_nil - # expect(actual).not_to be_[arbitrary_predicate](*args) - # - # Given true, false, or nil, will pass if actual value is true, false or - # nil (respectively). Given no args means the caller should satisfy an if - # condition (to be or not to be). - # - # Predicates are any Ruby method that ends in a "?" and returns true or - # false. Given be_ followed by arbitrary_predicate (without the "?"), - # RSpec will match convert that into a query against the target object. - # - # The arbitrary_predicate feature will handle any predicate prefixed with - # "be_an_" (e.g. be_an_instance_of), "be_a_" (e.g. be_a_kind_of) or "be_" - # (e.g. be_empty), letting you choose the prefix that best suits the - # predicate. - def be(*args) - args.empty? ? Matchers::BuiltIn::Be.new : equal(*args) - end - alias_matcher :a_value, :be, :klass => AliasedMatcherWithOperatorSupport - - # passes if target.kind_of?(klass) - def be_a(klass) - be_a_kind_of(klass) - end - alias_method :be_an, :be_a - - # Passes if actual.instance_of?(expected) - # - # @example - # expect(5).to be_an_instance_of(Integer) - # expect(5).not_to be_an_instance_of(Numeric) - # expect(5).not_to be_an_instance_of(Float) - def be_an_instance_of(expected) - BuiltIn::BeAnInstanceOf.new(expected) - end - alias_method :be_instance_of, :be_an_instance_of - alias_matcher :an_instance_of, :be_an_instance_of - - # Passes if actual.kind_of?(expected) - # - # @example - # expect(5).to be_a_kind_of(Integer) - # expect(5).to be_a_kind_of(Numeric) - # expect(5).not_to be_a_kind_of(Float) - def be_a_kind_of(expected) - BuiltIn::BeAKindOf.new(expected) - end - alias_method :be_kind_of, :be_a_kind_of - alias_matcher :a_kind_of, :be_a_kind_of - - # Passes if actual.between?(min, max). Works with any Comparable object, - # including String, Symbol, Time, or Numeric (Fixnum, Bignum, Integer, - # Float, Complex, and Rational). - # - # By default, `be_between` is inclusive (i.e. passes when given either the max or min value), - # but you can make it `exclusive` by chaining that off the matcher. - # - # @example - # expect(5).to be_between(1, 10) - # expect(11).not_to be_between(1, 10) - # expect(10).not_to be_between(1, 10).exclusive - def be_between(min, max) - BuiltIn::BeBetween.new(min, max) - end - alias_matcher :a_value_between, :be_between - - # Passes if actual == expected +/- delta - # - # @example - # expect(result).to be_within(0.5).of(3.0) - # expect(result).not_to be_within(0.5).of(3.0) - def be_within(delta) - BuiltIn::BeWithin.new(delta) - end - alias_matcher :a_value_within, :be_within - alias_matcher :within, :be_within - - # Applied to a proc, specifies that its execution will cause some value to - # change. - # - # @param [Object] receiver - # @param [Symbol] message the message to send the receiver - # - # You can either pass receiver and message, or a block, - # but not both. - # - # When passing a block, it must use the `{ ... }` format, not - # do/end, as `{ ... }` binds to the `change` method, whereas do/end - # would errantly bind to the `expect(..).to` or `expect(...).not_to` method. - # - # You can chain any of the following off of the end to specify details - # about the change: - # - # * `from` - # * `to` - # - # or any one of: - # - # * `by` - # * `by_at_least` - # * `by_at_most` - # - # @example - # expect { - # team.add_player(player) - # }.to change(roster, :count) - # - # expect { - # team.add_player(player) - # }.to change(roster, :count).by(1) - # - # expect { - # team.add_player(player) - # }.to change(roster, :count).by_at_least(1) - # - # expect { - # team.add_player(player) - # }.to change(roster, :count).by_at_most(1) - # - # string = "string" - # expect { - # string.reverse! - # }.to change { string }.from("string").to("gnirts") - # - # string = "string" - # expect { - # string - # }.not_to change { string }.from("string") - # - # expect { - # person.happy_birthday - # }.to change(person, :birthday).from(32).to(33) - # - # expect { - # employee.develop_great_new_social_networking_app - # }.to change(employee, :title).from("Mail Clerk").to("CEO") - # - # expect { - # doctor.leave_office - # }.to change(doctor, :sign).from(/is in/).to(/is out/) - # - # user = User.new(:type => "admin") - # expect { - # user.symbolize_type - # }.to change(user, :type).from(String).to(Symbol) - # - # == Notes - # - # Evaluates `receiver.message` or `block` before and after it - # evaluates the block passed to `expect`. If the value is the same - # object, its before/after `hash` value is used to see if it has changed. - # Therefore, your object needs to properly implement `hash` to work correctly - # with this matcher. - # - # `expect( ... ).not_to change` supports the form that specifies `from` - # (which specifies what you expect the starting, unchanged value to be) - # but does not support forms with subsequent calls to `by`, `by_at_least`, - # `by_at_most` or `to`. - def change(receiver=nil, message=nil, &block) - BuiltIn::Change.new(receiver, message, &block) - end - alias_matcher :a_block_changing, :change - alias_matcher :changing, :change - - # Passes if actual contains all of the expected regardless of order. - # This works for collections. Pass in multiple args and it will only - # pass if all args are found in collection. - # - # @note This is also available using the `=~` operator with `should`, - # but `=~` is not supported with `expect`. - # - # @example - # expect([1, 2, 3]).to contain_exactly(1, 2, 3) - # expect([1, 2, 3]).to contain_exactly(1, 3, 2) - # - # @see #match_array - def contain_exactly(*items) - BuiltIn::ContainExactly.new(items) - end - alias_matcher :a_collection_containing_exactly, :contain_exactly - alias_matcher :containing_exactly, :contain_exactly - - # Passes if actual covers expected. This works for - # Ranges. You can also pass in multiple args - # and it will only pass if all args are found in Range. - # - # @example - # expect(1..10).to cover(5) - # expect(1..10).to cover(4, 6) - # expect(1..10).to cover(4, 6, 11) # fails - # expect(1..10).not_to cover(11) - # expect(1..10).not_to cover(5) # fails - # - # ### Warning:: Ruby >= 1.9 only - def cover(*values) - BuiltIn::Cover.new(*values) - end - alias_matcher :a_range_covering, :cover - alias_matcher :covering, :cover - - # Matches if the actual value ends with the expected value(s). In the case - # of a string, matches against the last `expected.length` characters of the - # actual string. In the case of an array, matches against the last - # `expected.length` elements of the actual array. - # - # @example - # expect("this string").to end_with "string" - # expect([0, 1, 2, 3, 4]).to end_with 4 - # expect([0, 2, 3, 4, 4]).to end_with 3, 4 - def end_with(*expected) - BuiltIn::EndWith.new(*expected) - end - alias_matcher :a_collection_ending_with, :end_with - alias_matcher :a_string_ending_with, :end_with - alias_matcher :ending_with, :end_with - - # Passes if actual == expected. - # - # See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more - # information about equality in Ruby. - # - # @example - # expect(5).to eq(5) - # expect(5).not_to eq(3) - def eq(expected) - BuiltIn::Eq.new(expected) - end - alias_matcher :an_object_eq_to, :eq - alias_matcher :eq_to, :eq - - # Passes if `actual.eql?(expected)` - # - # See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more - # information about equality in Ruby. - # - # @example - # expect(5).to eql(5) - # expect(5).not_to eql(3) - def eql(expected) - BuiltIn::Eql.new(expected) - end - alias_matcher :an_object_eql_to, :eql - alias_matcher :eql_to, :eql - - # Passes if actual.equal?(expected) (object identity). - # - # See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more - # information about equality in Ruby. - # - # @example - # expect(5).to equal(5) # Integers are equal - # expect("5").not_to equal("5") # Strings that look the same are not the same object - def equal(expected) - BuiltIn::Equal.new(expected) - end - alias_matcher :an_object_equal_to, :equal - alias_matcher :equal_to, :equal - - # Passes if `actual.exist?` or `actual.exists?` - # - # @example - # expect(File).to exist("path/to/file") - def exist(*args) - BuiltIn::Exist.new(*args) - end - alias_matcher :an_object_existing, :exist - alias_matcher :existing, :exist - - # Passes if actual's attribute values match the expected attributes hash. - # This works no matter how you define your attribute readers. - # - # @example - # Person = Struct.new(:name, :age) - # person = Person.new("Bob", 32) - # - # expect(person).to have_attributes(:name => "Bob", :age => 32) - # expect(person).to have_attributes(:name => a_string_starting_with("B"), :age => (a_value > 30) ) - # - # @note It will fail if actual doesn't respond to any of the expected attributes. - # - # @example - # expect(person).to have_attributes(:color => "red") - def have_attributes(expected) - BuiltIn::HaveAttributes.new(expected) - end - alias_matcher :an_object_having_attributes, :have_attributes - alias_matcher :having_attributes, :have_attributes - - # Passes if actual includes expected. This works for - # collections and Strings. You can also pass in multiple args - # and it will only pass if all args are found in collection. - # - # @example - # expect([1,2,3]).to include(3) - # expect([1,2,3]).to include(2,3) - # expect([1,2,3]).to include(2,3,4) # fails - # expect([1,2,3]).not_to include(4) - # expect("spread").to include("read") - # expect("spread").not_to include("red") - # expect(:a => 1, :b => 2).to include(:a) - # expect(:a => 1, :b => 2).to include(:a, :b) - # expect(:a => 1, :b => 2).to include(:a => 1) - # expect(:a => 1, :b => 2).to include(:b => 2, :a => 1) - # expect(:a => 1, :b => 2).to include(:c) # fails - # expect(:a => 1, :b => 2).not_to include(:a => 2) - def include(*expected) - BuiltIn::Include.new(*expected) - end - alias_matcher :a_collection_including, :include - alias_matcher :a_string_including, :include - alias_matcher :a_hash_including, :include - alias_matcher :including, :include - - # Passes if the provided matcher passes when checked against all - # elements of the collection. - # - # @example - # expect([1, 3, 5]).to all be_odd - # expect([1, 3, 6]).to all be_odd # fails - # - # @note The negative form `not_to all` is not supported. Instead - # use `not_to include` or pass a negative form of a matcher - # as the argument (e.g. `all exclude(:foo)`). - # - # @note You can also use this with compound matchers as well. - # - # @example - # expect([1, 3, 5]).to all( be_odd.and be_an(Integer) ) - def all(expected) - BuiltIn::All.new(expected) - end - - # Given a `Regexp` or `String`, passes if `actual.match(pattern)` - # Given an arbitrary nested data structure (e.g. arrays and hashes), - # matches if `expected === actual` || `actual == expected` for each - # pair of elements. - # - # @example - # expect(email).to match(/^([^\s]+)((?:[-a-z0-9]+\.)+[a-z]{2,})$/i) - # expect(email).to match("@example.com") - # - # @example - # hash = { - # :a => { - # :b => ["foo", 5], - # :c => { :d => 2.05 } - # } - # } - # - # expect(hash).to match( - # :a => { - # :b => a_collection_containing_exactly( - # a_string_starting_with("f"), - # an_instance_of(Integer) - # ), - # :c => { :d => (a_value < 3) } - # } - # ) - # - # @note The `match_regex` alias is deprecated and is not recommended for use. - # It was added in 2.12.1 to facilitate its use from within custom - # matchers (due to how the custom matcher DSL was evaluated in 2.x, - # `match` could not be used there), but is no longer needed in 3.x. - def match(expected) - BuiltIn::Match.new(expected) - end - alias_matcher :match_regex, :match - alias_matcher :an_object_matching, :match - alias_matcher :a_string_matching, :match - alias_matcher :matching, :match - - # An alternate form of `contain_exactly` that accepts - # the expected contents as a single array arg rather - # than splatted out as individual items. - # - # @example - # expect(results).to contain_exactly(1, 2) - # # is identical to: - # expect(results).to match_array([1, 2]) - # - # @see #contain_exactly - def match_array(items) - contain_exactly(*items) - end - alias_matcher :an_array_matching, :match_array do |desc| - desc.sub("contain exactly", "an array containing exactly") - end - - # With no arg, passes if the block outputs `to_stdout` or `to_stderr`. - # With a string, passes if the block outputs that specific string `to_stdout` or `to_stderr`. - # With a regexp or matcher, passes if the block outputs a string `to_stdout` or `to_stderr` that matches. - # - # To capture output from any spawned subprocess as well, use `to_stdout_from_any_process` or - # `to_stderr_from_any_process`. Output from any process that inherits the main process's corresponding - # standard stream will be captured. - # - # @example - # expect { print 'foo' }.to output.to_stdout - # expect { print 'foo' }.to output('foo').to_stdout - # expect { print 'foo' }.to output(/foo/).to_stdout - # - # expect { do_something }.to_not output.to_stdout - # - # expect { warn('foo') }.to output.to_stderr - # expect { warn('foo') }.to output('foo').to_stderr - # expect { warn('foo') }.to output(/foo/).to_stderr - # - # expect { do_something }.to_not output.to_stderr - # - # expect { system('echo foo') }.to output("foo\n").to_stdout_from_any_process - # expect { system('echo foo', out: :err) }.to output("foo\n").to_stderr_from_any_process - # - # @note `to_stdout` and `to_stderr` work by temporarily replacing `$stdout` or `$stderr`, - # so they're not able to intercept stream output that explicitly uses `STDOUT`/`STDERR` - # or that uses a reference to `$stdout`/`$stderr` that was stored before the - # matcher was used. - # @note `to_stdout_from_any_process` and `to_stderr_from_any_process` use Tempfiles, and - # are thus significantly (~30x) slower than `to_stdout` and `to_stderr`. - def output(expected=nil) - BuiltIn::Output.new(expected) - end - alias_matcher :a_block_outputting, :output - - # With no args, matches if any error is raised. - # With a named error, matches only if that specific error is raised. - # With a named error and message specified as a String, matches only if both match. - # With a named error and message specified as a Regexp, matches only if both match. - # Pass an optional block to perform extra verifications on the exception matched - # - # @example - # expect { do_something_risky }.to raise_error - # expect { do_something_risky }.to raise_error(PoorRiskDecisionError) - # expect { do_something_risky }.to raise_error(PoorRiskDecisionError) { |error| expect(error.data).to eq 42 } - # expect { do_something_risky }.to raise_error { |error| expect(error.data).to eq 42 } - # expect { do_something_risky }.to raise_error(PoorRiskDecisionError, "that was too risky") - # expect { do_something_risky }.to raise_error(PoorRiskDecisionError, /oo ri/) - # expect { do_something_risky }.to raise_error("that was too risky") - # - # expect { do_something_risky }.not_to raise_error - def raise_error(error=BuiltIn::RaiseError::UndefinedValue, message=nil, &block) - BuiltIn::RaiseError.new(error, message, &block) - end - alias_method :raise_exception, :raise_error - - alias_matcher :a_block_raising, :raise_error do |desc| - desc.sub("raise", "a block raising") - end - - alias_matcher :raising, :raise_error do |desc| - desc.sub("raise", "raising") - end - - # Matches if the target object responds to all of the names - # provided. Names can be Strings or Symbols. - # - # @example - # expect("string").to respond_to(:length) - # - def respond_to(*names) - BuiltIn::RespondTo.new(*names) - end - alias_matcher :an_object_responding_to, :respond_to - alias_matcher :responding_to, :respond_to - - # Passes if the submitted block returns true. Yields target to the - # block. - # - # Generally speaking, this should be thought of as a last resort when - # you can't find any other way to specify the behaviour you wish to - # specify. - # - # If you do find yourself in such a situation, you could always write - # a custom matcher, which would likely make your specs more expressive. - # - # @param description [String] optional description to be used for this matcher. - # - # @example - # expect(5).to satisfy { |n| n > 3 } - # expect(5).to satisfy("be greater than 3") { |n| n > 3 } - def satisfy(description=nil, &block) - BuiltIn::Satisfy.new(description, &block) - end - alias_matcher :an_object_satisfying, :satisfy - alias_matcher :satisfying, :satisfy - - # Matches if the actual value starts with the expected value(s). In the - # case of a string, matches against the first `expected.length` characters - # of the actual string. In the case of an array, matches against the first - # `expected.length` elements of the actual array. - # - # @example - # expect("this string").to start_with "this s" - # expect([0, 1, 2, 3, 4]).to start_with 0 - # expect([0, 2, 3, 4, 4]).to start_with 0, 1 - def start_with(*expected) - BuiltIn::StartWith.new(*expected) - end - alias_matcher :a_collection_starting_with, :start_with - alias_matcher :a_string_starting_with, :start_with - alias_matcher :starting_with, :start_with - - # Given no argument, matches if a proc throws any Symbol. - # - # Given a Symbol, matches if the given proc throws the specified Symbol. - # - # Given a Symbol and an arg, matches if the given proc throws the - # specified Symbol with the specified arg. - # - # @example - # expect { do_something_risky }.to throw_symbol - # expect { do_something_risky }.to throw_symbol(:that_was_risky) - # expect { do_something_risky }.to throw_symbol(:that_was_risky, 'culprit') - # - # expect { do_something_risky }.not_to throw_symbol - # expect { do_something_risky }.not_to throw_symbol(:that_was_risky) - # expect { do_something_risky }.not_to throw_symbol(:that_was_risky, 'culprit') - def throw_symbol(expected_symbol=nil, expected_arg=nil) - BuiltIn::ThrowSymbol.new(expected_symbol, expected_arg) - end - - alias_matcher :a_block_throwing, :throw_symbol do |desc| - desc.sub("throw", "a block throwing") - end - - alias_matcher :throwing, :throw_symbol do |desc| - desc.sub("throw", "throwing") - end - - # Passes if the method called in the expect block yields, regardless - # of whether or not arguments are yielded. - # - # @example - # expect { |b| 5.tap(&b) }.to yield_control - # expect { |b| "a".to_sym(&b) }.not_to yield_control - # - # @note Your expect block must accept a parameter and pass it on to - # the method-under-test as a block. - def yield_control - BuiltIn::YieldControl.new - end - alias_matcher :a_block_yielding_control, :yield_control - alias_matcher :yielding_control, :yield_control - - # Passes if the method called in the expect block yields with - # no arguments. Fails if it does not yield, or yields with arguments. - # - # @example - # expect { |b| User.transaction(&b) }.to yield_with_no_args - # expect { |b| 5.tap(&b) }.not_to yield_with_no_args # because it yields with `5` - # expect { |b| "a".to_sym(&b) }.not_to yield_with_no_args # because it does not yield - # - # @note Your expect block must accept a parameter and pass it on to - # the method-under-test as a block. - # @note This matcher is not designed for use with methods that yield - # multiple times. - def yield_with_no_args - BuiltIn::YieldWithNoArgs.new - end - alias_matcher :a_block_yielding_with_no_args, :yield_with_no_args - alias_matcher :yielding_with_no_args, :yield_with_no_args - - # Given no arguments, matches if the method called in the expect - # block yields with arguments (regardless of what they are or how - # many there are). - # - # Given arguments, matches if the method called in the expect block - # yields with arguments that match the given arguments. - # - # Argument matching is done using `===` (the case match operator) - # and `==`. If the expected and actual arguments match with either - # operator, the matcher will pass. - # - # @example - # expect { |b| 5.tap(&b) }.to yield_with_args # because #tap yields an arg - # expect { |b| 5.tap(&b) }.to yield_with_args(5) # because 5 == 5 - # expect { |b| 5.tap(&b) }.to yield_with_args(Integer) # because Integer === 5 - # expect { |b| File.open("f.txt", &b) }.to yield_with_args(/txt/) # because /txt/ === "f.txt" - # - # expect { |b| User.transaction(&b) }.not_to yield_with_args # because it yields no args - # expect { |b| 5.tap(&b) }.not_to yield_with_args(1, 2, 3) - # - # @note Your expect block must accept a parameter and pass it on to - # the method-under-test as a block. - # @note This matcher is not designed for use with methods that yield - # multiple times. - def yield_with_args(*args) - BuiltIn::YieldWithArgs.new(*args) - end - alias_matcher :a_block_yielding_with_args, :yield_with_args - alias_matcher :yielding_with_args, :yield_with_args - - # Designed for use with methods that repeatedly yield (such as - # iterators). Passes if the method called in the expect block yields - # multiple times with arguments matching those given. - # - # Argument matching is done using `===` (the case match operator) - # and `==`. If the expected and actual arguments match with either - # operator, the matcher will pass. - # - # @example - # expect { |b| [1, 2, 3].each(&b) }.to yield_successive_args(1, 2, 3) - # expect { |b| { :a => 1, :b => 2 }.each(&b) }.to yield_successive_args([:a, 1], [:b, 2]) - # expect { |b| [1, 2, 3].each(&b) }.not_to yield_successive_args(1, 2) - # - # @note Your expect block must accept a parameter and pass it on to - # the method-under-test as a block. - def yield_successive_args(*args) - BuiltIn::YieldSuccessiveArgs.new(*args) - end - alias_matcher :a_block_yielding_successive_args, :yield_successive_args - alias_matcher :yielding_successive_args, :yield_successive_args - - # Delegates to {RSpec::Expectations.configuration}. - # This is here because rspec-core's `expect_with` option - # looks for a `configuration` method on the mixin - # (`RSpec::Matchers`) to yield to a block. - # @return [RSpec::Expectations::Configuration] the configuration object - def self.configuration - Expectations.configuration - end - - private - - BE_PREDICATE_REGEX = /^(?:be_(?:an?_)?)(.*)/ - HAS_REGEX = /^(?:have_)(.*)/ - DYNAMIC_MATCHER_REGEX = Regexp.union(BE_PREDICATE_REGEX, HAS_REGEX) - - def method_missing(method, *args, &block) - case method.to_s - when BE_PREDICATE_REGEX - BuiltIn::BePredicate.new(method, *args, &block) - when HAS_REGEX - BuiltIn::Has.new(method, *args, &block) - else - super - end - end - ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true) - - if RUBY_VERSION.to_f >= 1.9 - def respond_to_missing?(method, *) - method =~ DYNAMIC_MATCHER_REGEX || super - end - else # for 1.8.7 - # :nocov: - def respond_to?(method, *) - method = method.to_s - method =~ DYNAMIC_MATCHER_REGEX || super - end - public :respond_to? - # :nocov: - end - - # @api private - def self.is_a_matcher?(obj) - return true if ::RSpec::Matchers::BuiltIn::BaseMatcher === obj - begin - return false if obj.respond_to?(:i_respond_to_everything_so_im_not_really_a_matcher) - rescue NoMethodError - # Some objects, like BasicObject, don't implemented standard - # reflection methods. - return false - end - return false unless obj.respond_to?(:matches?) - - obj.respond_to?(:failure_message) || - obj.respond_to?(:failure_message_for_should) # support legacy matchers - end - - ::RSpec::Support.register_matcher_definition do |obj| - is_a_matcher?(obj) - end - - # @api private - def self.is_a_describable_matcher?(obj) - is_a_matcher?(obj) && obj.respond_to?(:description) - end - - class << self - private - - if RSpec::Support::Ruby.mri? && RUBY_VERSION[0, 3] == '1.9' - # Note that `included` doesn't work for this because it is triggered - # _after_ `RSpec::Matchers` is an ancestor of the inclusion host, rather - # than _before_, like `append_features`. It's important we check this before - # in order to find the cases where it was already previously included. - # @api private - # :nocov: - def append_features(mod) - return super if mod < self # `mod < self` indicates a re-inclusion. - - subclasses = ObjectSpace.each_object(Class).select { |c| c < mod && c < self } - return super unless subclasses.any? - - subclasses.reject! { |s| subclasses.any? { |s2| s < s2 } } # Filter to the root ancestor. - subclasses = subclasses.map { |s| "`#{s}`" }.join(", ") - - RSpec.warning "`#{self}` has been included in a superclass (`#{mod}`) " \ - "after previously being included in subclasses (#{subclasses}), " \ - "which can trigger infinite recursion from `super` due to an MRI 1.9 bug " \ - "(https://redmine.ruby-lang.org/issues/3351). To work around this, " \ - "either upgrade to MRI 2.0+, include a dup of the module (e.g. " \ - "`include #{self}.dup`), or find a way to include `#{self}` in `#{mod}` " \ - "before it is included in subclasses (#{subclasses}). See " \ - "https://github.com/rspec/rspec-expectations/issues/814%20for%20more%20info" - - super - end - # :nocov: - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/aliased_matcher.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/aliased_matcher.rb deleted file mode 100644 index c52c4c4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/aliased_matcher.rb +++ /dev/null @@ -1,116 +0,0 @@ -module RSpec - module Matchers - # Decorator that wraps a matcher and overrides `description` - # using the provided block in order to support an alias - # of a matcher. This is intended for use when composing - # matchers, so that you can use an expression like - # `include( a_value_within(0.1).of(3) )` rather than - # `include( be_within(0.1).of(3) )`, and have the corresponding - # description read naturally. - # - # @api private - class AliasedMatcher < MatcherDelegator - def initialize(base_matcher, description_block) - @description_block = description_block - super(base_matcher) - end - - # Forward messages on to the wrapped matcher. - # Since many matchers provide a fluent interface - # (e.g. `a_value_within(0.1).of(3)`), we need to wrap - # the returned value if it responds to `description`, - # so that our override can be applied when it is eventually - # used. - def method_missing(*) - return_val = super - return return_val unless RSpec::Matchers.is_a_matcher?(return_val) - self.class.new(return_val, @description_block) - end - - # Provides the description of the aliased matcher. Aliased matchers - # are designed to behave identically to the original matcher except - # for the description and failure messages. The description is different - # to reflect the aliased name. - # - # @api private - def description - @description_block.call(super) - end - - # Provides the failure_message of the aliased matcher. Aliased matchers - # are designed to behave identically to the original matcher except - # for the description and failure messages. The failure_message is different - # to reflect the aliased name. - # - # @api private - def failure_message - @description_block.call(super) - end - - # Provides the failure_message_when_negated of the aliased matcher. Aliased matchers - # are designed to behave identically to the original matcher except - # for the description and failure messages. The failure_message_when_negated is different - # to reflect the aliased name. - # - # @api private - def failure_message_when_negated - @description_block.call(super) - end - end - - # Decorator used for matchers that have special implementations of - # operators like `==` and `===`. - # @private - class AliasedMatcherWithOperatorSupport < AliasedMatcher - # We undef these so that they get delegated via `method_missing`. - undef == - undef === - end - - # @private - class AliasedNegatedMatcher < AliasedMatcher - def matches?(*args, &block) - if @base_matcher.respond_to?(:does_not_match?) - @base_matcher.does_not_match?(*args, &block) - else - !super - end - end - - def does_not_match?(*args, &block) - @base_matcher.matches?(*args, &block) - end - - def failure_message - optimal_failure_message(__method__, :failure_message_when_negated) - end - - def failure_message_when_negated - optimal_failure_message(__method__, :failure_message) - end - - private - - DefaultFailureMessages = BuiltIn::BaseMatcher::DefaultFailureMessages - - # For a matcher that uses the default failure messages, we prefer to - # use the override provided by the `description_block`, because it - # includes the phrasing that the user has expressed a preference for - # by going through the effort of defining a negated matcher. - # - # However, if the override didn't actually change anything, then we - # should return the opposite failure message instead -- the overridden - # message is going to be confusing if we return it as-is, as it represents - # the non-negated failure message for a negated match (or vice versa). - def optimal_failure_message(same, inverted) - if DefaultFailureMessages.has_default_failure_messages?(@base_matcher) - base_message = @base_matcher.__send__(same) - overridden = @description_block.call(base_message) - return overridden if overridden != base_message - end - - @base_matcher.__send__(inverted) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in.rb deleted file mode 100644 index e6237ff..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in.rb +++ /dev/null @@ -1,53 +0,0 @@ -RSpec::Support.require_rspec_matchers "built_in/base_matcher" - -module RSpec - module Matchers - # Container module for all built-in matchers. The matcher classes are here - # (rather than directly under `RSpec::Matchers`) in order to prevent name - # collisions, since `RSpec::Matchers` gets included into the user's namespace. - # - # Autoloading is used to delay when the matcher classes get loaded, allowing - # rspec-matchers to boot faster, and avoiding loading matchers the user is - # not using. - module BuiltIn - autoload :BeAKindOf, 'rspec/matchers/built_in/be_kind_of' - autoload :BeAnInstanceOf, 'rspec/matchers/built_in/be_instance_of' - autoload :BeBetween, 'rspec/matchers/built_in/be_between' - autoload :Be, 'rspec/matchers/built_in/be' - autoload :BeComparedTo, 'rspec/matchers/built_in/be' - autoload :BeFalsey, 'rspec/matchers/built_in/be' - autoload :BeHelpers, 'rspec/matchers/built_in/be' - autoload :BeNil, 'rspec/matchers/built_in/be' - autoload :BePredicate, 'rspec/matchers/built_in/has' - autoload :BeTruthy, 'rspec/matchers/built_in/be' - autoload :BeWithin, 'rspec/matchers/built_in/be_within' - autoload :Change, 'rspec/matchers/built_in/change' - autoload :Compound, 'rspec/matchers/built_in/compound' - autoload :ContainExactly, 'rspec/matchers/built_in/contain_exactly' - autoload :Cover, 'rspec/matchers/built_in/cover' - autoload :EndWith, 'rspec/matchers/built_in/start_or_end_with' - autoload :Eq, 'rspec/matchers/built_in/eq' - autoload :Eql, 'rspec/matchers/built_in/eql' - autoload :Equal, 'rspec/matchers/built_in/equal' - autoload :Exist, 'rspec/matchers/built_in/exist' - autoload :Has, 'rspec/matchers/built_in/has' - autoload :HaveAttributes, 'rspec/matchers/built_in/have_attributes' - autoload :Include, 'rspec/matchers/built_in/include' - autoload :All, 'rspec/matchers/built_in/all' - autoload :Match, 'rspec/matchers/built_in/match' - autoload :NegativeOperatorMatcher, 'rspec/matchers/built_in/operators' - autoload :OperatorMatcher, 'rspec/matchers/built_in/operators' - autoload :Output, 'rspec/matchers/built_in/output' - autoload :PositiveOperatorMatcher, 'rspec/matchers/built_in/operators' - autoload :RaiseError, 'rspec/matchers/built_in/raise_error' - autoload :RespondTo, 'rspec/matchers/built_in/respond_to' - autoload :Satisfy, 'rspec/matchers/built_in/satisfy' - autoload :StartWith, 'rspec/matchers/built_in/start_or_end_with' - autoload :ThrowSymbol, 'rspec/matchers/built_in/throw_symbol' - autoload :YieldControl, 'rspec/matchers/built_in/yield' - autoload :YieldSuccessiveArgs, 'rspec/matchers/built_in/yield' - autoload :YieldWithArgs, 'rspec/matchers/built_in/yield' - autoload :YieldWithNoArgs, 'rspec/matchers/built_in/yield' - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/all.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/all.rb deleted file mode 100644 index 27cce20..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/all.rb +++ /dev/null @@ -1,86 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `all`. - # Not intended to be instantiated directly. - class All < BaseMatcher - # @private - attr_reader :matcher, :failed_objects - - def initialize(matcher) - @matcher = matcher - @failed_objects = {} - end - - # @private - def does_not_match?(_actual) - raise NotImplementedError, '`expect().not_to all( matcher )` is not supported.' - end - - # @api private - # @return [String] - def failure_message - unless iterable? - return "#{improve_hash_formatting(super)}, but was not iterable" - end - - all_messages = [improve_hash_formatting(super)] - failed_objects.each do |index, matcher_failure_message| - all_messages << failure_message_for_item(index, matcher_failure_message) - end - all_messages.join("\n\n") - end - - # @api private - # @return [String] - def description - improve_hash_formatting "all #{description_of matcher}" - end - - private - - def match(_expected, _actual) - return false unless iterable? - - index_failed_objects - failed_objects.empty? - end - - def index_failed_objects - actual.each_with_index do |actual_item, index| - cloned_matcher = matcher.clone - matches = cloned_matcher.matches?(actual_item) - failed_objects[index] = cloned_matcher.failure_message unless matches - end - end - - def failure_message_for_item(index, failure_message) - failure_message = indent_multiline_message(add_new_line_if_needed(failure_message)) - indent_multiline_message("object at index #{index} failed to match:#{failure_message}") - end - - def add_new_line_if_needed(message) - message.start_with?("\n") ? message : "\n#{message}" - end - - def indent_multiline_message(message) - message = message.sub(/\n+\z/, '') - message.lines.map do |line| - line =~ /\S/ ? ' ' + line : line - end.join - end - - def initialize_copy(other) - @matcher = @matcher.clone - @failed_objects = @failed_objects.clone - super - end - - def iterable? - @actual.respond_to?(:each_with_index) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/base_matcher.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/base_matcher.rb deleted file mode 100644 index 8dd5133..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/base_matcher.rb +++ /dev/null @@ -1,225 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # - # Used _internally_ as a base class for matchers that ship with - # rspec-expectations and rspec-rails. - # - # ### Warning: - # - # This class is for internal use, and subject to change without notice. - # We strongly recommend that you do not base your custom matchers on this - # class. If/when this changes, we will announce it and remove this warning. - class BaseMatcher - include RSpec::Matchers::Composable - - # @api private - # Used to detect when no arg is passed to `initialize`. - # `nil` cannot be used because it's a valid value to pass. - UNDEFINED = Object.new.freeze - - # @private - attr_reader :actual, :expected, :rescued_exception - - # @private - attr_writer :matcher_name - - def initialize(expected=UNDEFINED) - @expected = expected unless UNDEFINED.equal?(expected) - end - - # @api private - # Indicates if the match is successful. Delegates to `match`, which - # should be defined on a subclass. Takes care of consistently - # initializing the `actual` attribute. - def matches?(actual) - @actual = actual - match(expected, actual) - end - - # @api private - # Used to wrap a block of code that will indicate failure by - # raising one of the named exceptions. - # - # This is used by rspec-rails for some of its matchers that - # wrap rails' assertions. - def match_unless_raises(*exceptions) - exceptions.unshift Exception if exceptions.empty? - begin - yield - true - rescue *exceptions => @rescued_exception - false - end - end - - # @api private - # Generates a description using {EnglishPhrasing}. - # @return [String] - def description - desc = EnglishPhrasing.split_words(self.class.matcher_name) - desc << EnglishPhrasing.list(@expected) if defined?(@expected) - desc - end - - # @api private - # Matchers are not diffable by default. Override this to make your - # subclass diffable. - def diffable? - false - end - - # @api private - # Most matchers are value matchers (i.e. meant to work with `expect(value)`) - # rather than block matchers (i.e. meant to work with `expect { }`), so - # this defaults to false. Block matchers must override this to return true. - def supports_block_expectations? - false - end - - # @private - def supports_value_expectations? - true - end - - # @api private - def expects_call_stack_jump? - false - end - - # @private - def expected_formatted - RSpec::Support::ObjectFormatter.format(@expected) - end - - # @private - def actual_formatted - RSpec::Support::ObjectFormatter.format(@actual) - end - - # @private - def self.matcher_name - @matcher_name ||= underscore(name.split('::').last) - end - - # @private - def matcher_name - if defined?(@matcher_name) - @matcher_name - else - self.class.matcher_name - end - end - - # @private - # Borrowed from ActiveSupport. - def self.underscore(camel_cased_word) - word = camel_cased_word.to_s.dup - word.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2') - word.gsub!(/([a-z\d])([A-Z])/, '\1_\2') - word.tr!('-', '_') - word.downcase! - word - end - private_class_method :underscore - - # @private - module HashFormatting - # `{ :a => 5, :b => 2 }.inspect` produces: - # - # {:a=>5, :b=>2} - # - # ...but it looks much better as: - # - # {:a => 5, :b => 2} - # - # This is idempotent and safe to run on a string multiple times. - def improve_hash_formatting(inspect_string) - inspect_string.gsub(/(\S)=>(\S)/, '\1 => \2') - end - module_function :improve_hash_formatting - end - - include HashFormatting - - # @private - module StringEncodingFormatting - # @api private - # @return [Boolean] True if the actual and expected string encoding are different. - # i.e. the failure may be related to encoding differences and the encoding - # should be shown to the user. false otherwise. - if String.method_defined?(:encoding) - def string_encoding_differs? - actual.is_a?(String) && expected.is_a?(String) && actual.encoding != expected.encoding - end - else - # @api private - # @return [Boolean] False always as the curent Ruby version does not support String encoding - # :nocov: - def string_encoding_differs? - false - end - # :nocov: - end - module_function :string_encoding_differs? - - if String.method_defined?(:encoding) - # @api private - # Formats a String's encoding as a human readable string - # @param value [String] - # @return [String] - def format_encoding(value) - "#" - end - else - # @api private - # Formats a String's encoding as a human readable string - # @param _value [String] - # @return [nil] nil as the curent Ruby version does not support String encoding - # :nocov: - def format_encoding(_value) - nil - end - # :nocov: - end - module_function :format_encoding - end - - include StringEncodingFormatting - - # @api private - # Provides default implementations of failure messages, based on the `description`. - module DefaultFailureMessages - # @api private - # Provides a good generic failure message. Based on `description`. - # When subclassing, if you are not satisfied with this failure message - # you often only need to override `description`. - # @return [String] - def failure_message - "expected #{description_of @actual} to #{description}".dup - end - - # @api private - # Provides a good generic negative failure message. Based on `description`. - # When subclassing, if you are not satisfied with this failure message - # you often only need to override `description`. - # @return [String] - def failure_message_when_negated - "expected #{description_of @actual} not to #{description}".dup - end - - # @private - def self.has_default_failure_messages?(matcher) - matcher.method(:failure_message).owner == self && - matcher.method(:failure_message_when_negated).owner == self - rescue NameError - false - end - end - - include DefaultFailureMessages - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be.rb deleted file mode 100644 index 40d4017..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be.rb +++ /dev/null @@ -1,191 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `be_truthy`. - # Not intended to be instantiated directly. - class BeTruthy < BaseMatcher - # @api private - # @return [String] - def failure_message - "expected: truthy value\n got: #{actual_formatted}" - end - - # @api private - # @return [String] - def failure_message_when_negated - "expected: falsey value\n got: #{actual_formatted}" - end - - private - - def match(_, actual) - !!actual - end - end - - # @api private - # Provides the implementation for `be_falsey`. - # Not intended to be instantiated directly. - class BeFalsey < BaseMatcher - # @api private - # @return [String] - def failure_message - "expected: falsey value\n got: #{actual_formatted}" - end - - # @api private - # @return [String] - def failure_message_when_negated - "expected: truthy value\n got: #{actual_formatted}" - end - - private - - def match(_, actual) - !actual - end - end - - # @api private - # Provides the implementation for `be_nil`. - # Not intended to be instantiated directly. - class BeNil < BaseMatcher - # @api private - # @return [String] - def failure_message - "expected: nil\n got: #{actual_formatted}" - end - - # @api private - # @return [String] - def failure_message_when_negated - "expected: not nil\n got: nil" - end - - private - - def match(_, actual) - actual.nil? - end - end - - # @private - module BeHelpers - private - - def args_to_s - @args.empty? ? "" : parenthesize(inspected_args.join(', ')) - end - - def parenthesize(string) - "(#{string})" - end - - def inspected_args - @args.map { |a| RSpec::Support::ObjectFormatter.format(a) } - end - - def expected_to_sentence - EnglishPhrasing.split_words(@expected) - end - - def args_to_sentence - EnglishPhrasing.list(@args) - end - end - - # @api private - # Provides the implementation for `be`. - # Not intended to be instantiated directly. - class Be < BaseMatcher - include BeHelpers - - def initialize(*args) - @args = args - end - - # @api private - # @return [String] - def failure_message - "expected #{actual_formatted} to evaluate to true" - end - - # @api private - # @return [String] - def failure_message_when_negated - "expected #{actual_formatted} to evaluate to false" - end - - [:==, :<, :<=, :>=, :>, :===, :=~].each do |operator| - define_method operator do |operand| - BeComparedTo.new(operand, operator) - end - end - - private - - def match(_, actual) - !!actual - end - end - - # @api private - # Provides the implementation of `be value`. - # Not intended to be instantiated directly. - class BeComparedTo < BaseMatcher - include BeHelpers - - def initialize(operand, operator) - @expected = operand - @operator = operator - @args = [] - end - - def matches?(actual) - perform_match(actual) - rescue ArgumentError, NoMethodError - false - end - - def does_not_match?(actual) - !perform_match(actual) - rescue ArgumentError, NoMethodError - false - end - - # @api private - # @return [String] - def failure_message - "expected: #{@operator} #{expected_formatted}\n" \ - " got: #{@operator.to_s.gsub(/./, ' ')} #{actual_formatted}" - end - - # @api private - # @return [String] - def failure_message_when_negated - message = "`expect(#{actual_formatted}).not_to " \ - "be #{@operator} #{expected_formatted}`" - if [:<, :>, :<=, :>=].include?(@operator) - message + " not only FAILED, it is a bit confusing." - else - message - end - end - - # @api private - # @return [String] - def description - "be #{@operator} #{expected_to_sentence}#{args_to_sentence}" - end - - private - - def perform_match(actual) - @actual = actual - @actual.__send__ @operator, @expected - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_between.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_between.rb deleted file mode 100644 index 55f084e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_between.rb +++ /dev/null @@ -1,77 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `be_between`. - # Not intended to be instantiated directly. - class BeBetween < BaseMatcher - def initialize(min, max) - @min, @max = min, max - inclusive - end - - # @api public - # Makes the between comparison inclusive. - # - # @example - # expect(3).to be_between(2, 3).inclusive - # - # @note The matcher is inclusive by default; this simply provides - # a way to be more explicit about it. - def inclusive - @less_than_operator = :<= - @greater_than_operator = :>= - @mode = :inclusive - self - end - - # @api public - # Makes the between comparison exclusive. - # - # @example - # expect(3).to be_between(2, 4).exclusive - def exclusive - @less_than_operator = :< - @greater_than_operator = :> - @mode = :exclusive - self - end - - # @api private - # @return [Boolean] - def matches?(actual) - @actual = actual - comparable? && compare - rescue ArgumentError - false - end - - # @api private - # @return [String] - def failure_message - "#{super}#{not_comparable_clause}" - end - - # @api private - # @return [String] - def description - "be between #{description_of @min} and #{description_of @max} (#{@mode})" - end - - private - - def comparable? - @actual.respond_to?(@less_than_operator) && @actual.respond_to?(@greater_than_operator) - end - - def not_comparable_clause - ", but it does not respond to `#{@less_than_operator}` and `#{@greater_than_operator}`" unless comparable? - end - - def compare - @actual.__send__(@greater_than_operator, @min) && @actual.__send__(@less_than_operator, @max) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_instance_of.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_instance_of.rb deleted file mode 100644 index e71d380..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_instance_of.rb +++ /dev/null @@ -1,26 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `be_an_instance_of`. - # Not intended to be instantiated directly. - class BeAnInstanceOf < BaseMatcher - # @api private - # @return [String] - def description - "be an instance of #{expected}" - end - - private - - def match(expected, actual) - actual.instance_of?(expected) - rescue NoMethodError - raise ::ArgumentError, "The #{matcher_name} matcher requires that " \ - "the actual object responds to #instance_of? method " \ - "but a `NoMethodError` was encountered instead." - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_kind_of.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_kind_of.rb deleted file mode 100644 index 4fe23bd..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_kind_of.rb +++ /dev/null @@ -1,20 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `be_a_kind_of`. - # Not intended to be instantiated directly. - class BeAKindOf < BaseMatcher - private - - def match(expected, actual) - actual.kind_of?(expected) - rescue NoMethodError - raise ::ArgumentError, "The #{matcher_name} matcher requires that " \ - "the actual object responds to #kind_of? method " \ - "but a `NoMethodError` was encountered instead." - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_within.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_within.rb deleted file mode 100644 index 7a2b5b5..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/be_within.rb +++ /dev/null @@ -1,72 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `be_within`. - # Not intended to be instantiated directly. - class BeWithin < BaseMatcher - def initialize(delta) - @delta = delta - end - - # @api public - # Sets the expected value. - def of(expected) - @expected = expected - @tolerance = @delta - @unit = '' - self - end - - # @api public - # Sets the expected value, and makes the matcher do - # a percent comparison. - def percent_of(expected) - @expected = expected - @tolerance = @expected.abs * @delta / 100.0 - @unit = '%' - self - end - - # @private - def matches?(actual) - @actual = actual - raise needs_expected unless defined? @expected - numeric? && (@actual - @expected).abs <= @tolerance - end - - # @api private - # @return [String] - def failure_message - "expected #{actual_formatted} to #{description}#{not_numeric_clause}" - end - - # @api private - # @return [String] - def failure_message_when_negated - "expected #{actual_formatted} not to #{description}" - end - - # @api private - # @return [String] - def description - "be within #{@delta}#{@unit} of #{expected_formatted}" - end - - private - - def numeric? - @actual.respond_to?(:-) - end - - def needs_expected - ArgumentError.new "You must set an expected value using #of: be_within(#{@delta}).of(expected_value)" - end - - def not_numeric_clause - ", but it could not be treated as a numeric value" unless numeric? - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/change.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/change.rb deleted file mode 100644 index 00e65dc..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/change.rb +++ /dev/null @@ -1,452 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `change`. - # Not intended to be instantiated directly. - class Change < BaseMatcher - # @api public - # Specifies the delta of the expected change. - def by(expected_delta) - ChangeRelatively.new(change_details, expected_delta, :by) do |actual_delta| - values_match?(expected_delta, actual_delta) - end - end - - # @api public - # Specifies a minimum delta of the expected change. - def by_at_least(minimum) - ChangeRelatively.new(change_details, minimum, :by_at_least) do |actual_delta| - actual_delta >= minimum - end - end - - # @api public - # Specifies a maximum delta of the expected change. - def by_at_most(maximum) - ChangeRelatively.new(change_details, maximum, :by_at_most) do |actual_delta| - actual_delta <= maximum - end - end - - # @api public - # Specifies the new value you expect. - def to(value) - ChangeToValue.new(change_details, value) - end - - # @api public - # Specifies the original value. - def from(value) - ChangeFromValue.new(change_details, value) - end - - # @private - def matches?(event_proc) - raise_block_syntax_error if block_given? - perform_change(event_proc) && change_details.changed? - end - - def does_not_match?(event_proc) - raise_block_syntax_error if block_given? - perform_change(event_proc) && !change_details.changed? - end - - # @api private - # @return [String] - def failure_message - "expected #{change_details.value_representation} to have changed, " \ - "but #{positive_failure_reason}" - end - - # @api private - # @return [String] - def failure_message_when_negated - "expected #{change_details.value_representation} not to have changed, " \ - "but #{negative_failure_reason}" - end - - # @api private - # @return [String] - def description - "change #{change_details.value_representation}" - end - - # @private - def supports_block_expectations? - true - end - - # @private - def supports_value_expectations? - false - end - - private - - def initialize(receiver=nil, message=nil, &block) - @receiver = receiver - @message = message - @block = block - end - - def change_details - @change_details ||= ChangeDetails.new(matcher_name, @receiver, @message, &@block) - end - - def perform_change(event_proc) - @event_proc = event_proc - change_details.perform_change(event_proc) do |actual_before| - # pre-compute values derived from the `before` value before the - # mutation is applied, in case the specified mutation is mutation - # of a single object (rather than a changing what object a method - # returns). We need to cache these values before the `before` value - # they are based on potentially gets mutated. - @actual_before_description = description_of(actual_before) - end - end - - def raise_block_syntax_error - raise SyntaxError, "Block not received by the `change` matcher. " \ - "Perhaps you want to use `{ ... }` instead of do/end?" - end - - def positive_failure_reason - return "was not given a block" unless Proc === @event_proc - "is still #{@actual_before_description}" - end - - def negative_failure_reason - return "was not given a block" unless Proc === @event_proc - "did change from #{@actual_before_description} " \ - "to #{description_of change_details.actual_after}" - end - end - - # Used to specify a relative change. - # @api private - class ChangeRelatively < BaseMatcher - def initialize(change_details, expected_delta, relativity, &comparer) - @change_details = change_details - @expected_delta = expected_delta - @relativity = relativity - @comparer = comparer - end - - # @private - def failure_message - "expected #{@change_details.value_representation} to have changed " \ - "#{@relativity.to_s.tr('_', ' ')} " \ - "#{description_of @expected_delta}, but #{failure_reason}" - end - - # @private - def matches?(event_proc) - @event_proc = event_proc - @change_details.perform_change(event_proc) && @comparer.call(@change_details.actual_delta) - end - - # @private - def does_not_match?(_event_proc) - raise NotImplementedError, "`expect { }.not_to change " \ - "{ }.#{@relativity}()` is not supported" - end - - # @private - def description - "change #{@change_details.value_representation} " \ - "#{@relativity.to_s.tr('_', ' ')} #{description_of @expected_delta}" - end - - # @private - def supports_block_expectations? - true - end - - # @private - def supports_value_expectations? - false - end - - private - - def failure_reason - return "was not given a block" unless Proc === @event_proc - "was changed by #{description_of @change_details.actual_delta}" - end - end - - # @api private - # Base class for specifying a change from and/or to specific values. - class SpecificValuesChange < BaseMatcher - # @private - MATCH_ANYTHING = ::Object.ancestors.last - - def initialize(change_details, from, to) - @change_details = change_details - @expected_before = from - @expected_after = to - end - - # @private - def matches?(event_proc) - perform_change(event_proc) && @change_details.changed? && @matches_before && matches_after? - end - - # @private - def description - "change #{@change_details.value_representation} #{change_description}" - end - - # @private - def failure_message - return not_given_a_block_failure unless Proc === @event_proc - return before_value_failure unless @matches_before - return did_not_change_failure unless @change_details.changed? - after_value_failure - end - - # @private - def supports_block_expectations? - true - end - - # @private - def supports_value_expectations? - false - end - - private - - def perform_change(event_proc) - @event_proc = event_proc - @change_details.perform_change(event_proc) do |actual_before| - # pre-compute values derived from the `before` value before the - # mutation is applied, in case the specified mutation is mutation - # of a single object (rather than a changing what object a method - # returns). We need to cache these values before the `before` value - # they are based on potentially gets mutated. - @matches_before = values_match?(@expected_before, actual_before) - @actual_before_description = description_of(actual_before) - end - end - - def matches_after? - values_match?(@expected_after, @change_details.actual_after) - end - - def before_value_failure - "expected #{@change_details.value_representation} " \ - "to have initially been #{description_of @expected_before}, " \ - "but was #{@actual_before_description}" - end - - def after_value_failure - "expected #{@change_details.value_representation} " \ - "to have changed to #{description_of @expected_after}, " \ - "but is now #{description_of @change_details.actual_after}" - end - - def did_not_change_failure - "expected #{@change_details.value_representation} " \ - "to have changed #{change_description}, but did not change" - end - - def did_change_failure - "expected #{@change_details.value_representation} not to have changed, but " \ - "did change from #{@actual_before_description} " \ - "to #{description_of @change_details.actual_after}" - end - - def not_given_a_block_failure - "expected #{@change_details.value_representation} to have changed " \ - "#{change_description}, but was not given a block" - end - end - - # @api private - # Used to specify a change from a specific value - # (and, optionally, to a specific value). - class ChangeFromValue < SpecificValuesChange - def initialize(change_details, expected_before) - @description_suffix = nil - super(change_details, expected_before, MATCH_ANYTHING) - end - - # @api public - # Specifies the new value you expect. - def to(value) - @expected_after = value - @description_suffix = " to #{description_of value}" - self - end - - # @private - def does_not_match?(event_proc) - if @description_suffix - raise NotImplementedError, "`expect { }.not_to change { }.to()` " \ - "is not supported" - end - - perform_change(event_proc) && !@change_details.changed? && @matches_before - end - - # @private - def failure_message_when_negated - return not_given_a_block_failure unless Proc === @event_proc - return before_value_failure unless @matches_before - did_change_failure - end - - private - - def change_description - "from #{description_of @expected_before}#{@description_suffix}" - end - end - - # @api private - # Used to specify a change to a specific value - # (and, optionally, from a specific value). - class ChangeToValue < SpecificValuesChange - def initialize(change_details, expected_after) - @description_suffix = nil - super(change_details, MATCH_ANYTHING, expected_after) - end - - # @api public - # Specifies the original value. - def from(value) - @expected_before = value - @description_suffix = " from #{description_of value}" - self - end - - # @private - def does_not_match?(_event_proc) - raise NotImplementedError, "`expect { }.not_to change { }.to()` " \ - "is not supported" - end - - private - - def change_description - "to #{description_of @expected_after}#{@description_suffix}" - end - end - - # @private - # Encapsulates the details of the before/after values. - # - # Note that this class exposes the `actual_after` value, to allow the - # matchers above to derive failure messages, etc from the value on demand - # as needed, but it intentionally does _not_ expose the `actual_before` - # value. Some usages of the `change` matcher mutate a specific object - # returned by the value proc, which means that failure message snippets, - # etc, which are derived from the `before` value may not be accurate if - # they are lazily computed as needed. We must pre-compute them before - # applying the change in the `expect` block. To ensure that all `change` - # matchers do that properly, we do not expose the `actual_before` value. - # Instead, matchers must pass a block to `perform_change`, which yields - # the `actual_before` value before applying the change. - class ChangeDetails - attr_reader :actual_after - - UNDEFINED = Module.new.freeze - - def initialize(matcher_name, receiver=nil, message=nil, &block) - if receiver && !message - raise( - ArgumentError, - "`change` requires either an object and message " \ - "(`change(obj, :msg)`) or a block (`change { }`). " \ - "You passed an object but no message." - ) - end - - @matcher_name = matcher_name - @receiver = receiver - @message = message - @value_proc = block - # TODO: temporary measure to mute warning of access to an initialized - # instance variable when a deprecated implicit block expectation - # syntax is used. This may be removed once `fail` is used, and the - # matcher never issues this warning. - @actual_after = UNDEFINED - end - - def value_representation - @value_representation ||= - if @message - "`#{message_notation(@receiver, @message)}`" - elsif (value_block_snippet = extract_value_block_snippet) - "`#{value_block_snippet}`" - else - 'result' - end - end - - def perform_change(event_proc) - @actual_before = evaluate_value_proc - @before_hash = @actual_before.hash - yield @actual_before if block_given? - - return false unless Proc === event_proc - event_proc.call - - @actual_after = evaluate_value_proc - @actual_hash = @actual_after.hash - true - end - - def changed? - # Consider it changed if either: - # - # - The before/after values are unequal - # - The before/after values have different hash values - # - # The latter case specifically handles the case when the value proc - # returns the exact same object, but it has been mutated. - # - # Note that it is not sufficient to only check the hashes; it is - # possible for two values to be unequal (and of different classes) - # but to return the same hash value. Also, some objects may change - # their hash after being compared with `==`/`!=`. - @actual_before != @actual_after || @before_hash != @actual_hash - end - - def actual_delta - @actual_after - @actual_before - end - - private - - def evaluate_value_proc - @value_proc ? @value_proc.call : @receiver.__send__(@message) - end - - def message_notation(receiver, message) - case receiver - when Module - "#{receiver}.#{message}" - else - "#{Support.class_of(receiver)}##{message}" - end - end - - if RSpec::Support::RubyFeatures.ripper_supported? - def extract_value_block_snippet - return nil unless @value_proc - Expectations::BlockSnippetExtractor.try_extracting_single_line_body_of(@value_proc, @matcher_name) - end - else - # :nocov: - def extract_value_block_snippet - nil - end - # :nocov: - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/compound.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/compound.rb deleted file mode 100644 index 3a7fb1e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/compound.rb +++ /dev/null @@ -1,293 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Base class for `and` and `or` compound matchers. - class Compound < BaseMatcher - # @private - attr_reader :matcher_1, :matcher_2, :evaluator - - def initialize(matcher_1, matcher_2) - @matcher_1 = matcher_1 - @matcher_2 = matcher_2 - end - - # @private - def does_not_match?(_actual) - raise NotImplementedError, "`expect(...).not_to matcher.#{conjunction} matcher` " \ - "is not supported, since it creates a bit of an ambiguity. Instead, define negated versions " \ - "of whatever matchers you wish to negate with `RSpec::Matchers.define_negated_matcher` and " \ - "use `expect(...).to matcher.#{conjunction} matcher`." - end - - # @api private - # @return [String] - def description - "#{matcher_1.description} #{conjunction} #{matcher_2.description}" - end - - # @api private - def supports_block_expectations? - matcher_supports_block_expectations?(matcher_1) && - matcher_supports_block_expectations?(matcher_2) - end - - # @api private - def supports_value_expectations? - matcher_supports_value_expectations?(matcher_1) && - matcher_supports_value_expectations?(matcher_2) - end - - # @api private - def expects_call_stack_jump? - NestedEvaluator.matcher_expects_call_stack_jump?(matcher_1) || - NestedEvaluator.matcher_expects_call_stack_jump?(matcher_2) - end - - # @api private - # @return [Boolean] - def diffable? - matcher_is_diffable?(matcher_1) || matcher_is_diffable?(matcher_2) - end - - # @api private - # @return [RSpec::Matchers::MultiMatcherDiff] - def expected - return nil unless evaluator - ::RSpec::Matchers::MultiMatcherDiff.for_many_matchers(diffable_matcher_list) - end - - protected - - def diffable_matcher_list - list = [] - list.concat(diffable_matcher_list_for(matcher_1)) unless matcher_1_matches? - list.concat(diffable_matcher_list_for(matcher_2)) unless matcher_2_matches? - list - end - - private - - def initialize_copy(other) - @matcher_1 = @matcher_1.clone - @matcher_2 = @matcher_2.clone - super - end - - def match(_expected, actual) - evaluator_klass = if supports_block_expectations? && Proc === actual - NestedEvaluator - elsif supports_value_expectations? - SequentialEvaluator - else - # Can't raise an ArgumentError in this context, as it's rescued - raise "Block and value matchers can't be combined in a compound expectation (#{matcher_1.description}, #{matcher_2.description})" - end - - @evaluator = evaluator_klass.new(actual, matcher_1, matcher_2) - end - - def indent_multiline_message(message) - message.lines.map do |line| - line =~ /\S/ ? ' ' + line : line - end.join - end - - def compound_failure_message - "#{indent_multiline_message(matcher_1.failure_message.sub(/\n+\z/, ''))}" \ - "\n\n...#{conjunction}:" \ - "\n\n#{indent_multiline_message(matcher_2.failure_message.sub(/\A\n+/, ''))}" - end - - def matcher_1_matches? - evaluator.matcher_matches?(matcher_1) - end - - def matcher_2_matches? - evaluator.matcher_matches?(matcher_2) - end - - def matcher_supports_block_expectations?(matcher) - matcher.supports_block_expectations? - rescue NoMethodError - false - end - - def matcher_supports_value_expectations?(matcher) - matcher.supports_value_expectations? - rescue NoMethodError - true - end - - def matcher_is_diffable?(matcher) - matcher.diffable? - rescue NoMethodError - false - end - - def diffable_matcher_list_for(matcher) - return [] unless matcher_is_diffable?(matcher) - return matcher.diffable_matcher_list if Compound === matcher - [matcher] - end - - # For value expectations, we can evaluate the matchers sequentially. - class SequentialEvaluator - def initialize(actual, *) - @actual = actual - end - - def matcher_matches?(matcher) - matcher.matches?(@actual) - end - end - - # Normally, we evaluate the matching sequentially. For an expression like - # `expect(x).to foo.and bar`, this becomes: - # - # expect(x).to foo - # expect(x).to bar - # - # For block expectations, we need to nest them instead, so that - # `expect { x }.to foo.and bar` becomes: - # - # expect { - # expect { x }.to foo - # }.to bar - # - # This is necessary so that the `expect` block is only executed once. - class NestedEvaluator - def initialize(actual, matcher_1, matcher_2) - @actual = actual - @matcher_1 = matcher_1 - @matcher_2 = matcher_2 - @match_results = {} - - inner, outer = order_block_matchers - - @match_results[outer] = outer.matches?(Proc.new do |*args| - @match_results[inner] = inner.matches?(inner_matcher_block(args)) - end) - end - - def matcher_matches?(matcher) - @match_results.fetch(matcher) do - raise ArgumentError, "Your #{matcher.description} has no match " \ - "results, this can occur when an unexpected call stack or " \ - "local jump occurs. Perhaps one of your matchers needs to " \ - "declare `expects_call_stack_jump?` as `true`?" - end - end - - private - - # Some block matchers (such as `yield_xyz`) pass args to the `expect` block. - # When such a matcher is used as the outer matcher, we need to forward the - # the args on to the `expect` block. - def inner_matcher_block(outer_args) - return @actual if outer_args.empty? - - Proc.new do |*inner_args| - unless inner_args.empty? - raise ArgumentError, "(#{@matcher_1.description}) and " \ - "(#{@matcher_2.description}) cannot be combined in a compound expectation " \ - "since both matchers pass arguments to the block." - end - - @actual.call(*outer_args) - end - end - - # For a matcher like `raise_error` or `throw_symbol`, where the block will jump - # up the call stack, we need to order things so that it is the inner matcher. - # For example, we need it to be this: - # - # expect { - # expect { - # x += 1 - # raise "boom" - # }.to raise_error("boom") - # }.to change { x }.by(1) - # - # ...rather than: - # - # expect { - # expect { - # x += 1 - # raise "boom" - # }.to change { x }.by(1) - # }.to raise_error("boom") - # - # In the latter case, the after-block logic in the `change` matcher would never - # get executed because the `raise "boom"` line would jump to the `rescue` in the - # `raise_error` logic, so only the former case will work properly. - # - # This method figures out which matcher should be the inner matcher and which - # should be the outer matcher. - def order_block_matchers - return @matcher_1, @matcher_2 unless self.class.matcher_expects_call_stack_jump?(@matcher_2) - return @matcher_2, @matcher_1 unless self.class.matcher_expects_call_stack_jump?(@matcher_1) - - raise ArgumentError, "(#{@matcher_1.description}) and " \ - "(#{@matcher_2.description}) cannot be combined in a compound expectation " \ - "because they both expect a call stack jump." - end - - def self.matcher_expects_call_stack_jump?(matcher) - matcher.expects_call_stack_jump? - rescue NoMethodError - false - end - end - - # @api public - # Matcher used to represent a compound `and` expectation. - class And < self - # @api private - # @return [String] - def failure_message - if matcher_1_matches? - matcher_2.failure_message - elsif matcher_2_matches? - matcher_1.failure_message - else - compound_failure_message - end - end - - private - - def match(*) - super - matcher_1_matches? && matcher_2_matches? - end - - def conjunction - "and" - end - end - - # @api public - # Matcher used to represent a compound `or` expectation. - class Or < self - # @api private - # @return [String] - def failure_message - compound_failure_message - end - - private - - def match(*) - super - matcher_1_matches? || matcher_2_matches? - end - - def conjunction - "or" - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/contain_exactly.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/contain_exactly.rb deleted file mode 100644 index f80572c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/contain_exactly.rb +++ /dev/null @@ -1,312 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # rubocop:disable Metrics/ClassLength - # @api private - # Provides the implementation for `contain_exactly` and `match_array`. - # Not intended to be instantiated directly. - class ContainExactly < BaseMatcher - # @api private - # @return [String] - def failure_message - if Array === actual - generate_failure_message - else - "expected a collection that can be converted to an array with " \ - "`#to_ary` or `#to_a`, but got #{actual_formatted}" - end - end - - # @api private - # @return [String] - def failure_message_when_negated - list = EnglishPhrasing.list(surface_descriptions_in(expected)) - "expected #{actual_formatted} not to contain exactly#{list}" - end - - # @api private - # @return [String] - def description - list = EnglishPhrasing.list(surface_descriptions_in(expected)) - "contain exactly#{list}" - end - - def matches?(actual) - @pairings_maximizer = nil - @best_solution = nil - @extra_items = nil - @missing_items = nil - super(actual) - end - - private - - def generate_failure_message - message = expected_collection_line - message += actual_collection_line - message += missing_elements_line unless missing_items.empty? - message += extra_elements_line unless extra_items.empty? - message - end - - def expected_collection_line - message_line('expected collection contained', expected, true) - end - - def actual_collection_line - message_line('actual collection contained', actual) - end - - def missing_elements_line - message_line('the missing elements were', missing_items, true) - end - - def extra_elements_line - message_line('the extra elements were', extra_items) - end - - def describe_collection(collection, surface_descriptions=false) - if surface_descriptions - "#{description_of(safe_sort(surface_descriptions_in collection))}\n" - else - "#{description_of(safe_sort(collection))}\n" - end - end - - def message_line(prefix, collection, surface_descriptions=false) - "%-32s%s" % [prefix + ':', - describe_collection(collection, surface_descriptions)] - end - - def match(_expected, _actual) - return false unless convert_actual_to_an_array - match_when_sorted? || (extra_items.empty? && missing_items.empty?) - end - - # This cannot always work (e.g. when dealing with unsortable items, - # or matchers as expected items), but it's practically free compared to - # the slowness of the full matching algorithm, and in common cases this - # works, so it's worth a try. - def match_when_sorted? - values_match?(safe_sort(expected), safe_sort(actual)) - end - - def convert_actual_to_an_array - if actual.respond_to?(:to_ary) - @actual = actual.to_ary - elsif actual.respond_to?(:to_a) && !to_a_disallowed?(actual) - @actual = actual.to_a - else - false - end - end - - def safe_sort(array) - array.sort - rescue Support::AllExceptionsExceptOnesWeMustNotRescue - array - end - - if RUBY_VERSION == "1.8.7" - # :nocov: - def to_a_disallowed?(object) - case object - when NilClass, String then true - else Kernel == RSpec::Support.method_handle_for(object, :to_a).owner - end - end - # :nocov: - else - def to_a_disallowed?(object) - NilClass === object - end - end - - def missing_items - @missing_items ||= best_solution.unmatched_expected_indexes.map do |index| - expected[index] - end - end - - def extra_items - @extra_items ||= best_solution.unmatched_actual_indexes.map do |index| - actual[index] - end - end - - def best_solution - @best_solution ||= pairings_maximizer.find_best_solution - end - - def pairings_maximizer - @pairings_maximizer ||= begin - expected_matches = Hash[Array.new(expected.size) { |i| [i, []] }] - actual_matches = Hash[Array.new(actual.size) { |i| [i, []] }] - - expected.each_with_index do |e, ei| - actual.each_with_index do |a, ai| - next unless values_match?(e, a) - - expected_matches[ei] << ai - actual_matches[ai] << ei - end - end - - PairingsMaximizer.new(expected_matches, actual_matches) - end - end - - # Once we started supporting composing matchers, the algorithm for this matcher got - # much more complicated. Consider this expression: - # - # expect(["fool", "food"]).to contain_exactly(/foo/, /fool/) - # - # This should pass (because we can pair /fool/ with "fool" and /foo/ with "food"), but - # the original algorithm used by this matcher would pair the first elements it could - # (/foo/ with "fool"), which would leave /fool/ and "food" unmatched. When we have - # an expected element which is a matcher that matches a superset of actual items - # compared to another expected element matcher, we need to consider every possible pairing. - # - # This class is designed to maximize the number of actual/expected pairings -- or, - # conversely, to minimize the number of unpaired items. It's essentially a brute - # force solution, but with a few heuristics applied to reduce the size of the - # problem space: - # - # * Any items which match none of the items in the other list are immediately - # placed into the `unmatched_expected_indexes` or `unmatched_actual_indexes` array. - # The extra items and missing items in the matcher failure message are derived - # from these arrays. - # * Any items which reciprocally match only each other are paired up and not - # considered further. - # - # What's left is only the items which match multiple items from the other list - # (or vice versa). From here, it performs a brute-force depth-first search, - # looking for a solution which pairs all elements in both lists, or, barring that, - # that produces the fewest unmatched items. - # - # @private - class PairingsMaximizer - # @private - Solution = Struct.new(:unmatched_expected_indexes, :unmatched_actual_indexes, - :indeterminate_expected_indexes, :indeterminate_actual_indexes) do - def worse_than?(other) - unmatched_item_count > other.unmatched_item_count - end - - def candidate? - indeterminate_expected_indexes.empty? && - indeterminate_actual_indexes.empty? - end - - def ideal? - candidate? && ( - unmatched_expected_indexes.empty? || - unmatched_actual_indexes.empty? - ) - end - - def unmatched_item_count - unmatched_expected_indexes.count + unmatched_actual_indexes.count - end - - def +(derived_candidate_solution) - self.class.new( - unmatched_expected_indexes + derived_candidate_solution.unmatched_expected_indexes, - unmatched_actual_indexes + derived_candidate_solution.unmatched_actual_indexes, - # Ignore the indeterminate indexes: by the time we get here, - # we've dealt with all indeterminates. - [], [] - ) - end - end - - attr_reader :expected_to_actual_matched_indexes, :actual_to_expected_matched_indexes, :solution - - def initialize(expected_to_actual_matched_indexes, actual_to_expected_matched_indexes) - @expected_to_actual_matched_indexes = expected_to_actual_matched_indexes - @actual_to_expected_matched_indexes = actual_to_expected_matched_indexes - - unmatched_expected_indexes, indeterminate_expected_indexes = - categorize_indexes(expected_to_actual_matched_indexes, actual_to_expected_matched_indexes) - - unmatched_actual_indexes, indeterminate_actual_indexes = - categorize_indexes(actual_to_expected_matched_indexes, expected_to_actual_matched_indexes) - - @solution = Solution.new(unmatched_expected_indexes, unmatched_actual_indexes, - indeterminate_expected_indexes, indeterminate_actual_indexes) - end - - def find_best_solution - return solution if solution.candidate? - best_solution_so_far = NullSolution - - expected_index = solution.indeterminate_expected_indexes.first - actuals = expected_to_actual_matched_indexes[expected_index] - - actuals.each do |actual_index| - solution = best_solution_for_pairing(expected_index, actual_index) - return solution if solution.ideal? - best_solution_so_far = solution if best_solution_so_far.worse_than?(solution) - end - - best_solution_so_far - end - - private - - # @private - # Starting solution that is worse than any other real solution. - NullSolution = Class.new do - def self.worse_than?(_other) - true - end - end - - def categorize_indexes(indexes_to_categorize, other_indexes) - unmatched = [] - indeterminate = [] - - indexes_to_categorize.each_pair do |index, matches| - if matches.empty? - unmatched << index - elsif !reciprocal_single_match?(matches, index, other_indexes) - indeterminate << index - end - end - - return unmatched, indeterminate - end - - def reciprocal_single_match?(matches, index, other_list) - return false unless matches.one? - other_list[matches.first] == [index] - end - - def best_solution_for_pairing(expected_index, actual_index) - modified_expecteds = apply_pairing_to( - solution.indeterminate_expected_indexes, - expected_to_actual_matched_indexes, actual_index) - - modified_expecteds.delete(expected_index) - - modified_actuals = apply_pairing_to( - solution.indeterminate_actual_indexes, - actual_to_expected_matched_indexes, expected_index) - - modified_actuals.delete(actual_index) - - solution + self.class.new(modified_expecteds, modified_actuals).find_best_solution - end - - def apply_pairing_to(indeterminates, original_matches, other_list_index) - indeterminates.inject({}) do |accum, index| - accum[index] = original_matches[index] - [other_list_index] - accum - end - end - end - end - # rubocop:enable Metrics/ClassLength - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/count_expectation.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/count_expectation.rb deleted file mode 100644 index aa91310..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/count_expectation.rb +++ /dev/null @@ -1,171 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Abstract class to implement `once`, `at_least` and other - # count constraints. - module CountExpectation - # @api public - # Specifies that the method is expected to match once. - def once - exactly(1) - end - - # @api public - # Specifies that the method is expected to match twice. - def twice - exactly(2) - end - - # @api public - # Specifies that the method is expected to match thrice. - def thrice - exactly(3) - end - - # @api public - # Specifies that the method is expected to match the given number of times. - def exactly(number) - set_expected_count(:==, number) - self - end - - # @api public - # Specifies the maximum number of times the method is expected to match - def at_most(number) - set_expected_count(:<=, number) - self - end - - # @api public - # Specifies the minimum number of times the method is expected to match - def at_least(number) - set_expected_count(:>=, number) - self - end - - # @api public - # No-op. Provides syntactic sugar. - def times - self - end - - protected - # @api private - attr_reader :count_expectation_type, :expected_count - - private - - if RUBY_VERSION.to_f > 1.8 - def cover?(count, number) - count.cover?(number) - end - else - # :nocov: - def cover?(count, number) - number >= count.first && number <= count.last - end - # :nocov: - end - - def expected_count_matches?(actual_count) - @actual_count = actual_count - return @actual_count > 0 unless count_expectation_type - return cover?(expected_count, actual_count) if count_expectation_type == :<=> - - @actual_count.__send__(count_expectation_type, expected_count) - end - - def has_expected_count? - !!count_expectation_type - end - - def set_expected_count(relativity, n) - raise_unsupported_count_expectation if unsupported_count_expectation?(relativity) - - count = count_constraint_to_number(n) - - if count_expectation_type == :<= && relativity == :>= - raise_impossible_count_expectation(count) if count > expected_count - @count_expectation_type = :<=> - @expected_count = count..expected_count - elsif count_expectation_type == :>= && relativity == :<= - raise_impossible_count_expectation(count) if count < expected_count - @count_expectation_type = :<=> - @expected_count = expected_count..count - else - @count_expectation_type = relativity - @expected_count = count - end - end - - def raise_impossible_count_expectation(count) - text = - case count_expectation_type - when :<= then "at_least(#{count}).at_most(#{expected_count})" - when :>= then "at_least(#{expected_count}).at_most(#{count})" - end - raise ArgumentError, "The constraint #{text} is not possible" - end - - def raise_unsupported_count_expectation - text = - case count_expectation_type - when :<= then "at_least" - when :>= then "at_most" - when :<=> then "at_least/at_most combination" - else "count" - end - raise ArgumentError, "Multiple #{text} constraints are not supported" - end - - def count_constraint_to_number(n) - case n - when Numeric then n - when :once then 1 - when :twice then 2 - when :thrice then 3 - else - raise ArgumentError, "Expected a number, :once, :twice or :thrice," \ - " but got #{n}" - end - end - - def unsupported_count_expectation?(relativity) - return true if count_expectation_type == :== - return true if count_expectation_type == :<=> - (count_expectation_type == :<= && relativity == :<=) || - (count_expectation_type == :>= && relativity == :>=) - end - - def count_expectation_description - "#{human_readable_expectation_type}#{human_readable_count(expected_count)}" - end - - def count_failure_reason(action) - "#{count_expectation_description}" \ - " but #{action}#{human_readable_count(@actual_count)}" - end - - def human_readable_expectation_type - case count_expectation_type - when :<= then ' at most' - when :>= then ' at least' - when :<=> then ' between' - else '' - end - end - - def human_readable_count(count) - case count - when Range then " #{count.first} and #{count.last} times" - when nil then '' - when 1 then ' once' - when 2 then ' twice' - else " #{count} times" - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/cover.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/cover.rb deleted file mode 100644 index 47474a2..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/cover.rb +++ /dev/null @@ -1,24 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `cover`. - # Not intended to be instantiated directly. - class Cover < BaseMatcher - def initialize(*expected) - @expected = expected - end - - def matches?(range) - @actual = range - @expected.all? { |e| range.cover?(e) } - end - - def does_not_match?(range) - @actual = range - expected.none? { |e| range.cover?(e) } - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/eq.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/eq.rb deleted file mode 100644 index 08ed656..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/eq.rb +++ /dev/null @@ -1,44 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `eq`. - # Not intended to be instantiated directly. - class Eq < BaseMatcher - # @api private - # @return [String] - def failure_message - if string_encoding_differs? - "\nexpected: #{format_encoding(expected)} #{expected_formatted}\n got: #{format_encoding(actual)} #{actual_formatted}\n\n(compared using ==)\n" - else - "\nexpected: #{expected_formatted}\n got: #{actual_formatted}\n\n(compared using ==)\n" - end - end - - # @api private - # @return [String] - def failure_message_when_negated - "\nexpected: value != #{expected_formatted}\n got: #{actual_formatted}\n\n(compared using ==)\n" - end - - # @api private - # @return [String] - def description - "eq #{expected_formatted}" - end - - # @api private - # @return [Boolean] - def diffable? - true - end - - private - - def match(expected, actual) - actual == expected - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/eql.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/eql.rb deleted file mode 100644 index 32560df..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/eql.rb +++ /dev/null @@ -1,38 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `eql`. - # Not intended to be instantiated directly. - class Eql < BaseMatcher - # @api private - # @return [String] - def failure_message - if string_encoding_differs? - "\nexpected: #{format_encoding(expected)} #{expected_formatted}\n got: #{format_encoding(actual)} #{actual_formatted}\n\n(compared using eql?)\n" - else - "\nexpected: #{expected_formatted}\n got: #{actual_formatted}\n\n(compared using eql?)\n" - end - end - - # @api private - # @return [String] - def failure_message_when_negated - "\nexpected: value != #{expected_formatted}\n got: #{actual_formatted}\n\n(compared using eql?)\n" - end - - # @api private - # @return [Boolean] - def diffable? - true - end - - private - - def match(expected, actual) - actual.eql? expected - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/equal.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/equal.rb deleted file mode 100644 index bbab3ed..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/equal.rb +++ /dev/null @@ -1,81 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `equal`. - # Not intended to be instantiated directly. - class Equal < BaseMatcher - # @api private - # @return [String] - def failure_message - if expected_is_a_literal_singleton? - simple_failure_message - else - detailed_failure_message - end - end - - # @api private - # @return [String] - def failure_message_when_negated - <<-MESSAGE - -expected not #{inspect_object(actual)} - got #{inspect_object(expected)} - -Compared using equal?, which compares object identity. - -MESSAGE - end - - # @api private - # @return [Boolean] - def diffable? - !expected_is_a_literal_singleton? - end - - private - - def match(expected, actual) - actual.equal? expected - end - - LITERAL_SINGLETONS = [true, false, nil] - - def expected_is_a_literal_singleton? - LITERAL_SINGLETONS.include?(expected) - end - - def actual_inspected - if LITERAL_SINGLETONS.include?(actual) - actual_formatted - else - inspect_object(actual) - end - end - - def simple_failure_message - "\nexpected #{expected_formatted}\n got #{actual_inspected}\n" - end - - def detailed_failure_message - <<-MESSAGE - -expected #{inspect_object(expected)} - got #{inspect_object(actual)} - -Compared using equal?, which compares object identity, -but expected and actual are not the same object. Use -`expect(actual).to eq(expected)` if you don't care about -object identity in this example. - -MESSAGE - end - - def inspect_object(o) - "#<#{o.class}:#{o.object_id}> => #{RSpec::Support::ObjectFormatter.format(o)}" - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/exist.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/exist.rb deleted file mode 100644 index 438625d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/exist.rb +++ /dev/null @@ -1,90 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `exist`. - # Not intended to be instantiated directly. - class Exist < BaseMatcher - def initialize(*expected) - @expected = expected - end - - # @api private - # @return [Boolean] - def matches?(actual) - @actual = actual - @test = ExistenceTest.new @actual, @expected - @test.valid_test? && @test.actual_exists? - end - - # @api private - # @return [Boolean] - def does_not_match?(actual) - @actual = actual - @test = ExistenceTest.new @actual, @expected - @test.valid_test? && !@test.actual_exists? - end - - # @api private - # @return [String] - def failure_message - "expected #{actual_formatted} to exist#{@test.validity_message}" - end - - # @api private - # @return [String] - def failure_message_when_negated - "expected #{actual_formatted} not to exist#{@test.validity_message}" - end - - # @api private - # Simple class for memoizing actual/expected for this matcher - # and examining the match - class ExistenceTest < Struct.new(:actual, :expected) - # @api private - # @return [Boolean] - def valid_test? - uniq_truthy_values.size == 1 - end - - # @api private - # @return [Boolean] - def actual_exists? - existence_values.first - end - - # @api private - # @return [String] - def validity_message - case uniq_truthy_values.size - when 0 - " but it does not respond to either `exist?` or `exists?`" - when 2 - " but `exist?` and `exists?` returned different values:\n\n"\ - " exist?: #{existence_values.first}\n"\ - "exists?: #{existence_values.last}" - end - end - - private - - def uniq_truthy_values - @uniq_truthy_values ||= existence_values.map { |v| !!v }.uniq - end - - def existence_values - @existence_values ||= predicates.map { |p| actual.__send__(p, *expected) } - end - - def predicates - @predicates ||= [:exist?, :exists?].select { |p| actual.respond_to?(p) && !deprecated(p, actual) } - end - - def deprecated(predicate, actual) - predicate == :exists? && (File == actual || FileTest == actual || Dir == actual) - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/has.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/has.rb deleted file mode 100644 index 0f4e7e4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/has.rb +++ /dev/null @@ -1,194 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for dynamic predicate matchers. - # Not intended to be inherited directly. - class DynamicPredicate < BaseMatcher - include BeHelpers - - def initialize(method_name, *args, &block) - @method_name, @args, @block = method_name, args, block - end - ruby2_keywords :initialize if respond_to?(:ruby2_keywords, true) - - # @private - def matches?(actual, &block) - @actual = actual - @block ||= block - predicate_accessible? && predicate_matches? - end - - # @private - def does_not_match?(actual, &block) - @actual = actual - @block ||= block - predicate_accessible? && predicate_matches?(false) - end - - # @api private - # @return [String] - def failure_message - failure_message_expecting(true) - end - - # @api private - # @return [String] - def failure_message_when_negated - failure_message_expecting(false) - end - - # @api private - # @return [String] - def description - "#{method_description}#{args_to_sentence}" - end - - private - - # Catch a semi-frequent typo - if you have strict_predicate_matchers disabled and - # expect(spy).to have_receieveddd(:foo) it would be evergreen - the dynamic matcher - # queries `has_receiveddd?`, the spy _fakes_ the method, returning its (truthy) self. - if defined?(RSpec::Mocks::Double) - def really_responds_to?(method) - if RSpec::Mocks::Double === @actual - @actual.respond_to?(method) && methods_include?(method) - else - @actual.respond_to?(method) - end - end - else - # :nocov: - def really_responds_to?(method) - @actual.respond_to?(method) - end - # :nocov: - end - - def predicate_accessible? - really_responds_to?(predicate) - end - - # support 1.8.7, evaluate once at load time for performance - if String === methods.first - # :nocov: - def private_predicate? - @actual.private_methods.include? predicate.to_s - end - - def methods_include?(method) - @actual.methods.include?(method.to_s) - end - # :nocov: - else - def private_predicate? - @actual.private_methods.include? predicate - end - - def methods_include?(method) - @actual.methods.include?(method) - end - end - - def predicate_result - @predicate_result = actual.__send__(predicate_method_name, *@args, &@block) - end - - def predicate_method_name - predicate - end - - def predicate_matches?(value=true) - if RSpec::Expectations.configuration.strict_predicate_matchers? - value == predicate_result - else - value == !!predicate_result - end - end - - def root - # On 1.9, there appears to be a bug where String#match can return `false` - # rather than the match data object. Changing to Regex#match appears to - # work around this bug. For an example of this bug, see: - # https://travis-ci.org/rspec/rspec-expectations/jobs/27549635 - self.class::REGEX.match(@method_name.to_s).captures.first - end - - def method_description - EnglishPhrasing.split_words(@method_name) - end - - def failure_message_expecting(value) - validity_message || - "expected `#{actual_formatted}.#{predicate}#{args_to_s}` to #{expectation_of value}, got #{description_of @predicate_result}" - end - - def expectation_of(value) - if RSpec::Expectations.configuration.strict_predicate_matchers? - "return #{value}" - elsif value - "be truthy" - else - "be falsey" - end - end - - def validity_message - return nil if predicate_accessible? - - "expected #{actual_formatted} to respond to `#{predicate}`#{failure_to_respond_explanation}" - end - - def failure_to_respond_explanation - if private_predicate? - " but `#{predicate}` is a private method" - end - end - end - - # @api private - # Provides the implementation for `has_`. - # Not intended to be instantiated directly. - class Has < DynamicPredicate - # :nodoc: - REGEX = Matchers::HAS_REGEX - private - def predicate - @predicate ||= :"has_#{root}?" - end - end - - # @api private - # Provides the implementation of `be_`. - # Not intended to be instantiated directly. - class BePredicate < DynamicPredicate - # :nodoc: - REGEX = Matchers::BE_PREDICATE_REGEX - private - def predicate - @predicate ||= :"#{root}?" - end - - def predicate_method_name - actual.respond_to?(predicate) ? predicate : present_tense_predicate - end - - def failure_to_respond_explanation - super || if predicate == :true? - " or perhaps you meant `be true` or `be_truthy`" - elsif predicate == :false? - " or perhaps you meant `be false` or `be_falsey`" - end - end - - def predicate_accessible? - super || really_responds_to?(present_tense_predicate) - end - - def present_tense_predicate - :"#{root}s?" - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/have_attributes.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/have_attributes.rb deleted file mode 100644 index 89be3f2..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/have_attributes.rb +++ /dev/null @@ -1,114 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `have_attributes`. - # Not intended to be instantiated directly. - class HaveAttributes < BaseMatcher - # @private - attr_reader :respond_to_failed - - def initialize(expected) - @expected = expected - @values = {} - @respond_to_failed = false - @negated = false - end - - # @private - def actual - @values - end - - # @api private - # @return [Boolean] - def matches?(actual) - @actual = actual - @negated = false - return false unless respond_to_attributes? - perform_match(:all?) - end - - # @api private - # @return [Boolean] - def does_not_match?(actual) - @actual = actual - @negated = true - return false unless respond_to_attributes? - perform_match(:none?) - end - - # @api private - # @return [String] - def description - described_items = surface_descriptions_in(expected) - improve_hash_formatting "have attributes #{RSpec::Support::ObjectFormatter.format(described_items)}" - end - - # @api private - # @return [Boolean] - def diffable? - !@respond_to_failed && !@negated - end - - # @api private - # @return [String] - def failure_message - respond_to_failure_message_or do - "expected #{actual_formatted} to #{description} but had attributes #{ formatted_values }" - end - end - - # @api private - # @return [String] - def failure_message_when_negated - respond_to_failure_message_or { "expected #{actual_formatted} not to #{description}" } - end - - private - - def cache_all_values - @values = {} - expected.each do |attribute_key, _attribute_value| - actual_value = @actual.__send__(attribute_key) - @values[attribute_key] = actual_value - end - end - - def perform_match(predicate) - cache_all_values - expected.__send__(predicate) do |attribute_key, attribute_value| - actual_has_attribute?(attribute_key, attribute_value) - end - end - - def actual_has_attribute?(attribute_key, attribute_value) - values_match?(attribute_value, @values.fetch(attribute_key)) - end - - def respond_to_attributes? - matches = respond_to_matcher.matches?(@actual) - @respond_to_failed = !matches - matches - end - - def respond_to_matcher - @respond_to_matcher ||= RespondTo.new(*expected.keys).with(0).arguments.tap { |m| m.ignoring_method_signature_failure! } - end - - def respond_to_failure_message_or - if respond_to_failed - respond_to_matcher.failure_message - else - improve_hash_formatting(yield) - end - end - - def formatted_values - values = RSpec::Support::ObjectFormatter.format(@values) - improve_hash_formatting(values) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/include.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/include.rb deleted file mode 100644 index 3fedee3..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/include.rb +++ /dev/null @@ -1,218 +0,0 @@ -require 'rspec/matchers/built_in/count_expectation' - -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `include`. - # Not intended to be instantiated directly. - class Include < BaseMatcher # rubocop:disable Metrics/ClassLength - include CountExpectation - # @private - attr_reader :expecteds - - # @api private - def initialize(*expecteds) - raise(ArgumentError, 'include() is not supported, please supply an argument') if expecteds.empty? - @expecteds = expecteds - end - - # @api private - # @return [Boolean] - def matches?(actual) - check_actual?(actual) && - if check_expected_count? - expected_count_matches?(count_inclusions) - else - perform_match { |v| v } - end - end - - # @api private - # @return [Boolean] - def does_not_match?(actual) - check_actual?(actual) && - if check_expected_count? - !expected_count_matches?(count_inclusions) - else - perform_match { |v| !v } - end - end - - # @api private - # @return [String] - def description - improve_hash_formatting("include#{readable_list_of(expecteds)}#{count_expectation_description}") - end - - # @api private - # @return [String] - def failure_message - format_failure_message("to") { super } - end - - # @api private - # @return [String] - def failure_message_when_negated - format_failure_message("not to") { super } - end - - # @api private - # @return [Boolean] - def diffable? - !diff_would_wrongly_highlight_matched_item? - end - - # @api private - # @return [Array, Hash] - def expected - if expecteds.one? && Hash === expecteds.first - expecteds.first - else - expecteds - end - end - - private - - def check_actual?(actual) - actual = actual.to_hash if convert_to_hash?(actual) - @actual = actual - @actual.respond_to?(:include?) - end - - def check_expected_count? - case - when !has_expected_count? - return false - when expecteds.size != 1 - raise NotImplementedError, 'Count constraint supported only when testing for a single value being included' - when actual.is_a?(Hash) - raise NotImplementedError, 'Count constraint on hash keys not implemented' - end - true - end - - def format_failure_message(preposition) - msg = if actual.respond_to?(:include?) - "expected #{description_of @actual} #{preposition}" \ - " include#{readable_list_of @divergent_items}" \ - "#{count_failure_reason('it is included') if has_expected_count?}" - else - "#{yield}, but it does not respond to `include?`" - end - improve_hash_formatting(msg) - end - - def readable_list_of(items) - described_items = surface_descriptions_in(items) - if described_items.all? { |item| item.is_a?(Hash) } - " #{described_items.inject(:merge).inspect}" - else - EnglishPhrasing.list(described_items) - end - end - - def perform_match(&block) - @divergent_items = excluded_from_actual(&block) - @divergent_items.empty? - end - - def excluded_from_actual - return [] unless @actual.respond_to?(:include?) - - expecteds.inject([]) do |memo, expected_item| - if comparing_hash_to_a_subset?(expected_item) - expected_item.each do |(key, value)| - memo << { key => value } unless yield actual_hash_includes?(key, value) - end - elsif comparing_hash_keys?(expected_item) - memo << expected_item unless yield actual_hash_has_key?(expected_item) - else - memo << expected_item unless yield actual_collection_includes?(expected_item) - end - memo - end - end - - def comparing_hash_to_a_subset?(expected_item) - actual.is_a?(Hash) && expected_item.is_a?(Hash) - end - - def actual_hash_includes?(expected_key, expected_value) - actual_value = - actual.fetch(expected_key) do - actual.find(Proc.new { return false }) { |actual_key, _| values_match?(expected_key, actual_key) }[1] - end - values_match?(expected_value, actual_value) - end - - def comparing_hash_keys?(expected_item) - actual.is_a?(Hash) && !expected_item.is_a?(Hash) - end - - def actual_hash_has_key?(expected_key) - # We check `key?` first for perf: - # `key?` is O(1), but `any?` is O(N). - - has_exact_key = - begin - actual.key?(expected_key) - rescue - false - end - - has_exact_key || actual.keys.any? { |key| values_match?(expected_key, key) } - end - - def actual_collection_includes?(expected_item) - return actual.scan(expected_item).size > 0 if Regexp === expected_item && String === actual - return true if actual.include?(expected_item) - - # String lacks an `any?` method... - return false unless actual.respond_to?(:any?) - - actual.any? { |value| values_match?(expected_item, value) } - end - - if RUBY_VERSION < '1.9' - # :nocov: - def count_enumerable(expected_item) - actual.select { |value| values_match?(expected_item, value) }.size - end - # :nocov: - else - def count_enumerable(expected_item) - actual.count { |value| values_match?(expected_item, value) } - end - end - - def count_inclusions - @divergent_items = expected - case actual - when String - actual.scan(expected.first).length - when Enumerable - count_enumerable(Hash === expected ? expected : expected.first) - else - raise NotImplementedError, 'Count constraints are implemented for Enumerable and String values only' - end - end - - def diff_would_wrongly_highlight_matched_item? - return false unless actual.is_a?(String) && expected.is_a?(Array) - return false if Regexp === expecteds.first - - lines = actual.split("\n") - expected.any? do |str| - actual.include?(str) && lines.none? { |line| line == str } - end - end - - def convert_to_hash?(obj) - !obj.respond_to?(:include?) && obj.respond_to?(:to_hash) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/match.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/match.rb deleted file mode 100644 index a822f76..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/match.rb +++ /dev/null @@ -1,120 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `match`. - # Not intended to be instantiated directly. - class Match < BaseMatcher - def initialize(expected) - super(expected) - - @expected_captures = nil - end - # @api private - # @return [String] - def description - if @expected_captures && @expected.match(actual) - "match #{surface_descriptions_in(expected).inspect} with captures #{surface_descriptions_in(@expected_captures).inspect}" - else - "match #{surface_descriptions_in(expected).inspect}" - end - end - - # @api private - # @return [Boolean] - def diffable? - true - end - - # Used to specify the captures we match against - # @return [self] - def with_captures(*captures) - @expected_captures = captures - self - end - - # @api private - # @return [String] - def failure_message - if Array === expected && !(actual.respond_to?(:to_a) || actual.respond_to?(:to_ary)) - return "expected a collection that can be converted to an array with " \ - "`#to_ary` or `#to_a`, but got #{actual_formatted}" - end - - super - end - - private - - def match(expected, actual) - return match_captures(expected, actual) if @expected_captures - return true if values_match?(expected, actual) - return false if Array === expected - return false unless can_safely_call_match?(expected, actual) - actual.match(expected) - end - - def can_safely_call_match?(expected, actual) - return false unless actual.respond_to?(:match) - - !(RSpec::Matchers.is_a_matcher?(expected) && - (String === actual || Regexp === actual)) - end - - def match_captures(expected, actual) - match = actual.match(expected) - if match - match = ReliableMatchData.new(match) - if match.names.empty? - values_match?(@expected_captures, match.captures) - else - expected_matcher = @expected_captures.last - values_match?(expected_matcher, Hash[match.names.zip(match.captures)]) || - values_match?(expected_matcher, Hash[match.names.map(&:to_sym).zip(match.captures)]) || - values_match?(@expected_captures, match.captures) - end - else - false - end - end - end - - # @api private - # Used to wrap match data and make it reliable for 1.8.7 - class ReliableMatchData - def initialize(match_data) - @match_data = match_data - end - - if RUBY_VERSION == "1.8.7" - # @api private - # Returns match data names for named captures - # @return Array - # :nocov: - def names - [] - end - # :nocov: - else - # @api private - # Returns match data names for named captures - # @return Array - def names - match_data.names - end - end - - # @api private - # returns an array of captures from the match data - # @return Array - def captures - match_data.captures - end - - protected - - attr_reader :match_data - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/operators.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/operators.rb deleted file mode 100644 index 64f8f3b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/operators.rb +++ /dev/null @@ -1,128 +0,0 @@ -require 'rspec/support' - -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for operator matchers. - # Not intended to be instantiated directly. - # Only available for use with `should`. - class OperatorMatcher - class << self - # @private - def registry - @registry ||= {} - end - - # @private - def register(klass, operator, matcher) - registry[klass] ||= {} - registry[klass][operator] = matcher - end - - # @private - def unregister(klass, operator) - registry[klass] && registry[klass].delete(operator) - end - - # @private - def get(klass, operator) - klass.ancestors.each do |ancestor| - matcher = registry[ancestor] && registry[ancestor][operator] - return matcher if matcher - end - - nil - end - end - - register Enumerable, '=~', BuiltIn::ContainExactly - - def initialize(actual) - @actual = actual - end - - # @private - def self.use_custom_matcher_or_delegate(operator) - define_method(operator) do |expected| - if !has_non_generic_implementation_of?(operator) && (matcher = OperatorMatcher.get(@actual.class, operator)) - @actual.__send__(::RSpec::Matchers.last_expectation_handler.should_method, matcher.new(expected)) - else - eval_match(@actual, operator, expected) - end - end - - negative_operator = operator.sub(/^=/, '!') - if negative_operator != operator && respond_to?(negative_operator) - define_method(negative_operator) do |_expected| - opposite_should = ::RSpec::Matchers.last_expectation_handler.opposite_should_method - raise "RSpec does not support `#{::RSpec::Matchers.last_expectation_handler.should_method} #{negative_operator} expected`. " \ - "Use `#{opposite_should} #{operator} expected` instead." - end - end - end - - ['==', '===', '=~', '>', '>=', '<', '<='].each do |operator| - use_custom_matcher_or_delegate operator - end - - # @private - def fail_with_message(message) - RSpec::Expectations.fail_with(message, @expected, @actual) - end - - # @api private - # @return [String] - def description - "#{@operator} #{RSpec::Support::ObjectFormatter.format(@expected)}" - end - - private - - def has_non_generic_implementation_of?(op) - Support.method_handle_for(@actual, op).owner != ::Kernel - rescue NameError - false - end - - def eval_match(actual, operator, expected) - ::RSpec::Matchers.last_matcher = self - @operator, @expected = operator, expected - __delegate_operator(actual, operator, expected) - end - end - - # @private - # Handles operator matcher for `should`. - class PositiveOperatorMatcher < OperatorMatcher - def __delegate_operator(actual, operator, expected) - if actual.__send__(operator, expected) - true - else - expected_formatted = RSpec::Support::ObjectFormatter.format(expected) - actual_formatted = RSpec::Support::ObjectFormatter.format(actual) - - if ['==', '===', '=~'].include?(operator) - fail_with_message("expected: #{expected_formatted}\n got: #{actual_formatted} (using #{operator})") - else - fail_with_message("expected: #{operator} #{expected_formatted}\n got: #{operator.gsub(/./, ' ')} #{actual_formatted}") - end - end - end - end - - # @private - # Handles operator matcher for `should_not`. - class NegativeOperatorMatcher < OperatorMatcher - def __delegate_operator(actual, operator, expected) - return false unless actual.__send__(operator, expected) - - expected_formatted = RSpec::Support::ObjectFormatter.format(expected) - actual_formatted = RSpec::Support::ObjectFormatter.format(actual) - - fail_with_message("expected not: #{operator} #{expected_formatted}\n got: #{operator.gsub(/./, ' ')} #{actual_formatted}") - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/output.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/output.rb deleted file mode 100644 index 8c3cced..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/output.rb +++ /dev/null @@ -1,207 +0,0 @@ -require 'stringio' - -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `output`. - # Not intended to be instantiated directly. - class Output < BaseMatcher - def initialize(expected) - @expected = expected - @actual = "" - @block = nil - @stream_capturer = NullCapture - end - - def matches?(block) - @block = block - return false unless Proc === block - @actual = @stream_capturer.capture(block) - @expected ? values_match?(@expected, @actual) : captured? - end - - def does_not_match?(block) - !matches?(block) && Proc === block - end - - # @api public - # Tells the matcher to match against stdout. - # Works only when the main Ruby process prints to stdout - def to_stdout - @stream_capturer = CaptureStdout - self - end - - # @api public - # Tells the matcher to match against stderr. - # Works only when the main Ruby process prints to stderr - def to_stderr - @stream_capturer = CaptureStderr - self - end - - # @api public - # Tells the matcher to match against stdout. - # Works when subprocesses print to stdout as well. - # This is significantly (~30x) slower than `to_stdout` - def to_stdout_from_any_process - @stream_capturer = CaptureStreamToTempfile.new("stdout", $stdout) - self - end - - # @api public - # Tells the matcher to match against stderr. - # Works when subprocesses print to stderr as well. - # This is significantly (~30x) slower than `to_stderr` - def to_stderr_from_any_process - @stream_capturer = CaptureStreamToTempfile.new("stderr", $stderr) - self - end - - # @api private - # @return [String] - def failure_message - "expected block to #{description}, but #{positive_failure_reason}" - end - - # @api private - # @return [String] - def failure_message_when_negated - "expected block to not #{description}, but #{negative_failure_reason}" - end - - # @api private - # @return [String] - def description - if @expected - "output #{description_of @expected} to #{@stream_capturer.name}" - else - "output to #{@stream_capturer.name}" - end - end - - # @api private - # @return [Boolean] - def diffable? - true - end - - # @api private - # Indicates this matcher matches against a block. - # @return [True] - def supports_block_expectations? - true - end - - # @api private - # Indicates this matcher matches against a block only. - # @return [False] - def supports_value_expectations? - false - end - - private - - def captured? - @actual.length > 0 - end - - def positive_failure_reason - return "was not a block" unless Proc === @block - return "output #{actual_output_description}" if @expected - "did not" - end - - def negative_failure_reason - return "was not a block" unless Proc === @block - "output #{actual_output_description}" - end - - def actual_output_description - return "nothing" unless captured? - actual_formatted - end - end - - # @private - module NullCapture - def self.name - "some stream" - end - - def self.capture(_block) - raise "You must chain `to_stdout` or `to_stderr` off of the `output(...)` matcher." - end - end - - # @private - module CaptureStdout - def self.name - 'stdout' - end - - def self.capture(block) - captured_stream = StringIO.new - - original_stream = $stdout - $stdout = captured_stream - - block.call - - captured_stream.string - ensure - $stdout = original_stream - end - end - - # @private - module CaptureStderr - def self.name - 'stderr' - end - - def self.capture(block) - captured_stream = StringIO.new - - original_stream = $stderr - $stderr = captured_stream - - block.call - - captured_stream.string - ensure - $stderr = original_stream - end - end - - # @private - class CaptureStreamToTempfile < Struct.new(:name, :stream) - def capture(block) - # We delay loading tempfile until it is actually needed because - # we want to minimize stdlibs loaded so that users who use a - # portion of the stdlib can't have passing specs while forgetting - # to load it themselves. `CaptureStreamToTempfile` is rarely used - # and `tempfile` pulls in a bunch of things (delegate, tmpdir, - # thread, fileutils, etc), so it's worth delaying it until this point. - require 'tempfile' - - original_stream = stream.clone - captured_stream = Tempfile.new(name) - - begin - captured_stream.sync = true - stream.reopen(captured_stream) - block.call - captured_stream.rewind - captured_stream.read - ensure - stream.reopen(original_stream) - captured_stream.close - captured_stream.unlink - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/raise_error.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/raise_error.rb deleted file mode 100644 index bbaaf62..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/raise_error.rb +++ /dev/null @@ -1,275 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `raise_error`. - # Not intended to be instantiated directly. - # rubocop:disable Metrics/ClassLength - # rubocop:disable Lint/RescueException - class RaiseError - include Composable - - # Used as a sentinel value to be able to tell when the user did not pass an - # argument. We can't use `nil` for that because we need to warn when `nil` is - # passed in a different way. It's an Object, not a Module, since Module's `===` - # does not evaluate to true when compared to itself. - # - # Note; this _is_ the default value supplied for expected_error_or_message, but - # because there are two method-calls involved, that default is actually supplied - # in the definition of the _matcher_ method, `RSpec::Matchers#raise_error` - UndefinedValue = Object.new.freeze - - def initialize(expected_error_or_message, expected_message, &block) - @block = block - @actual_error = nil - @warn_about_bare_error = UndefinedValue === expected_error_or_message - @warn_about_nil_error = expected_error_or_message.nil? - - case expected_error_or_message - when nil, UndefinedValue - @expected_error = Exception - @expected_message = expected_message - when String, Regexp - @expected_error = Exception - @expected_message = expected_error_or_message - else - @expected_error = expected_error_or_message - @expected_message = expected_message - end - end - - # @api public - # Specifies the expected error message. - def with_message(expected_message) - raise_message_already_set if @expected_message - @warn_about_bare_error = false - @expected_message = expected_message - self - end - - # rubocop:disable Metrics/MethodLength - # @private - def matches?(given_proc, negative_expectation=false, &block) - @given_proc = given_proc - @block ||= block - @raised_expected_error = false - @with_expected_message = false - @eval_block = false - @eval_block_passed = false - - return false unless Proc === given_proc - - begin - given_proc.call - rescue Exception => @actual_error - if values_match?(@expected_error, @actual_error) || - values_match?(@expected_error, actual_error_message) - @raised_expected_error = true - @with_expected_message = verify_message - end - end - - unless negative_expectation - warn_about_bare_error! if warn_about_bare_error? - warn_about_nil_error! if warn_about_nil_error? - eval_block if ready_to_eval_block? - end - - expectation_matched? - end - # rubocop:enable Metrics/MethodLength - - # @private - def does_not_match?(given_proc) - warn_for_negative_false_positives! - !matches?(given_proc, :negative_expectation) && Proc === given_proc - end - - # @private - def supports_block_expectations? - true - end - - # @private - def supports_value_expectations? - false - end - - # @private - def expects_call_stack_jump? - true - end - - # @api private - # @return [String] - def failure_message - @eval_block ? actual_error_message : "expected #{expected_error}#{given_error}" - end - - # @api private - # @return [String] - def failure_message_when_negated - "expected no #{expected_error}#{given_error}" - end - - # @api private - # @return [String] - def description - "raise #{expected_error}" - end - - private - - def actual_error_message - return nil unless @actual_error - - @actual_error.respond_to?(:original_message) ? @actual_error.original_message : @actual_error.message - end - - def expectation_matched? - error_and_message_match? && block_matches? - end - - def error_and_message_match? - @raised_expected_error && @with_expected_message - end - - def block_matches? - @eval_block ? @eval_block_passed : true - end - - def ready_to_eval_block? - @raised_expected_error && @with_expected_message && @block - end - - def eval_block - @eval_block = true - begin - @block[@actual_error] - @eval_block_passed = true - rescue Exception => err - @actual_error = err - end - end - - def verify_message - return true if @expected_message.nil? - values_match?(@expected_message, actual_error_message.to_s) - end - - def warn_for_negative_false_positives! - expression = if expecting_specific_exception? && @expected_message - "`expect { }.not_to raise_error(SpecificErrorClass, message)`" - elsif expecting_specific_exception? - "`expect { }.not_to raise_error(SpecificErrorClass)`" - elsif @expected_message - "`expect { }.not_to raise_error(message)`" - elsif @warn_about_nil_error - "`expect { }.not_to raise_error(nil)`" - end - - return unless expression - - warn_about_negative_false_positive! expression - end - - def handle_warning(message) - RSpec::Expectations.configuration.false_positives_handler.call(message) - end - - def warn_about_bare_error? - @warn_about_bare_error && @block.nil? - end - - def warn_about_nil_error? - @warn_about_nil_error - end - - def warn_about_bare_error! - handle_warning("Using the `raise_error` matcher without providing a specific " \ - "error or message risks false positives, since `raise_error` " \ - "will match when Ruby raises a `NoMethodError`, `NameError` or " \ - "`ArgumentError`, potentially allowing the expectation to pass " \ - "without even executing the method you are intending to call. " \ - "#{warning}"\ - "Instead consider providing a specific error class or message. " \ - "This message can be suppressed by setting: " \ - "`RSpec::Expectations.configuration.on_potential_false" \ - "_positives = :nothing`") - end - - def warn_about_nil_error! - handle_warning("Using the `raise_error` matcher with a `nil` error is probably " \ - "unintentional, it risks false positives, since `raise_error` " \ - "will match when Ruby raises a `NoMethodError`, `NameError` or " \ - "`ArgumentError`, potentially allowing the expectation to pass " \ - "without even executing the method you are intending to call. " \ - "#{warning}"\ - "Instead consider providing a specific error class or message. " \ - "This message can be suppressed by setting: " \ - "`RSpec::Expectations.configuration.on_potential_false" \ - "_positives = :nothing`") - end - - def warn_about_negative_false_positive!(expression) - handle_warning("Using #{expression} risks false positives, since literally " \ - "any other error would cause the expectation to pass, " \ - "including those raised by Ruby (e.g. `NoMethodError`, `NameError` " \ - "and `ArgumentError`), meaning the code you are intending to test " \ - "may not even get reached. Instead consider using " \ - "`expect { }.not_to raise_error` or `expect { }.to raise_error" \ - "(DifferentSpecificErrorClass)`. This message can be suppressed by " \ - "setting: `RSpec::Expectations.configuration.on_potential_false" \ - "_positives = :nothing`") - end - - def expected_error - case @expected_message - when nil - if RSpec::Support.is_a_matcher?(@expected_error) - "Exception with #{description_of(@expected_error)}" - else - description_of(@expected_error) - end - when Regexp - "#{@expected_error} with message matching #{description_of(@expected_message)}" - else - "#{@expected_error} with #{description_of(@expected_message)}" - end - end - - def format_backtrace(backtrace) - formatter = Matchers.configuration.backtrace_formatter - formatter.format_backtrace(backtrace) - end - - def given_error - return " but was not given a block" unless Proc === @given_proc - return " but nothing was raised" unless @actual_error - - backtrace = format_backtrace(@actual_error.backtrace) - [ - ", got #{description_of(@actual_error)} with backtrace:", - *backtrace - ].join("\n # ") - end - - def expecting_specific_exception? - @expected_error != Exception - end - - def raise_message_already_set - raise "`expect { }.to raise_error(message).with_message(message)` is not valid. " \ - 'The matcher only allows the expected message to be specified once' - end - - def warning - warning = "Actual error raised was #{description_of(@actual_error)}. " - warning if @actual_error - end - end - # rubocop:enable Lint/RescueException - # rubocop:enable Metrics/ClassLength - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/respond_to.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/respond_to.rb deleted file mode 100644 index 9adbe04..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/respond_to.rb +++ /dev/null @@ -1,200 +0,0 @@ -RSpec::Support.require_rspec_support "method_signature_verifier" - -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `respond_to`. - # Not intended to be instantiated directly. - class RespondTo < BaseMatcher - def initialize(*names) - @names = names - @expected_arity = nil - @expected_keywords = [] - @ignoring_method_signature_failure = false - @unlimited_arguments = nil - @arbitrary_keywords = nil - end - - # @api public - # Specifies the number of expected arguments. - # - # @example - # expect(obj).to respond_to(:message).with(3).arguments - def with(n) - @expected_arity = n - self - end - - # @api public - # Specifies keyword arguments, if any. - # - # @example - # expect(obj).to respond_to(:message).with_keywords(:color, :shape) - # @example with an expected number of arguments - # expect(obj).to respond_to(:message).with(3).arguments.and_keywords(:color, :shape) - def with_keywords(*keywords) - @expected_keywords = keywords - self - end - alias :and_keywords :with_keywords - - # @api public - # Specifies that the method accepts any keyword, i.e. the method has - # a splatted keyword parameter of the form **kw_args. - # - # @example - # expect(obj).to respond_to(:message).with_any_keywords - def with_any_keywords - @arbitrary_keywords = true - self - end - alias :and_any_keywords :with_any_keywords - - # @api public - # Specifies that the number of arguments has no upper limit, i.e. the - # method has a splatted parameter of the form *args. - # - # @example - # expect(obj).to respond_to(:message).with_unlimited_arguments - def with_unlimited_arguments - @unlimited_arguments = true - self - end - alias :and_unlimited_arguments :with_unlimited_arguments - - # @api public - # No-op. Intended to be used as syntactic sugar when using `with`. - # - # @example - # expect(obj).to respond_to(:message).with(3).arguments - def argument - self - end - alias :arguments :argument - - # @private - def matches?(actual) - find_failing_method_names(actual, :reject).empty? - end - - # @private - def does_not_match?(actual) - find_failing_method_names(actual, :select).empty? - end - - # @api private - # @return [String] - def failure_message - "expected #{actual_formatted} to respond to #{@failing_method_names.map { |name| description_of(name) }.join(', ')}#{with_arity}" - end - - # @api private - # @return [String] - def failure_message_when_negated - failure_message.sub(/to respond to/, 'not to respond to') - end - - # @api private - # @return [String] - def description - "respond to #{pp_names}#{with_arity}" - end - - # @api private - # Used by other matchers to suppress a check - def ignoring_method_signature_failure! - @ignoring_method_signature_failure = true - end - - private - - def find_failing_method_names(actual, filter_method) - @actual = actual - @failing_method_names = @names.__send__(filter_method) do |name| - @actual.respond_to?(name) && matches_arity?(actual, name) - end - end - - def matches_arity?(actual, name) - ArityCheck.new(@expected_arity, @expected_keywords, @arbitrary_keywords, @unlimited_arguments).matches?(actual, name) - rescue NameError - return true if @ignoring_method_signature_failure - raise ArgumentError, "The #{matcher_name} matcher requires that " \ - "the actual object define the method(s) in " \ - "order to check arity, but the method " \ - "`#{name}` is not defined. Remove the arity " \ - "check or define the method to continue." - end - - def with_arity - str = ''.dup - str << " with #{with_arity_string}" if @expected_arity - str << " #{str.length == 0 ? 'with' : 'and'} #{with_keywords_string}" if @expected_keywords && @expected_keywords.count > 0 - str << " #{str.length == 0 ? 'with' : 'and'} unlimited arguments" if @unlimited_arguments - str << " #{str.length == 0 ? 'with' : 'and'} any keywords" if @arbitrary_keywords - str - end - - def with_arity_string - "#{@expected_arity} argument#{@expected_arity == 1 ? '' : 's'}" - end - - def with_keywords_string - kw_str = case @expected_keywords.count - when 1 - @expected_keywords.first.inspect - when 2 - @expected_keywords.map(&:inspect).join(' and ') - else - "#{@expected_keywords[0...-1].map(&:inspect).join(', ')}, and #{@expected_keywords.last.inspect}" - end - - "keyword#{@expected_keywords.count == 1 ? '' : 's'} #{kw_str}" - end - - def pp_names - @names.length == 1 ? "##{@names.first}" : description_of(@names) - end - - # @private - class ArityCheck - def initialize(expected_arity, expected_keywords, arbitrary_keywords, unlimited_arguments) - expectation = Support::MethodSignatureExpectation.new - - if expected_arity.is_a?(Range) - expectation.min_count = expected_arity.min - expectation.max_count = expected_arity.max - else - expectation.min_count = expected_arity - end - - expectation.keywords = expected_keywords - expectation.expect_unlimited_arguments = unlimited_arguments - expectation.expect_arbitrary_keywords = arbitrary_keywords - @expectation = expectation - end - - def matches?(actual, name) - return true if @expectation.empty? - verifier_for(actual, name).with_expectation(@expectation).valid? - end - - def verifier_for(actual, name) - Support::StrictSignatureVerifier.new(method_signature_for(actual, name)) - end - - def method_signature_for(actual, name) - method_handle = Support.method_handle_for(actual, name) - - if name == :new && method_handle.owner === ::Class && ::Class === actual - Support::MethodSignature.new(actual.instance_method(:initialize)) - else - Support::MethodSignature.new(method_handle) - end - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/satisfy.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/satisfy.rb deleted file mode 100644 index a50967b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/satisfy.rb +++ /dev/null @@ -1,62 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `satisfy`. - # Not intended to be instantiated directly. - class Satisfy < BaseMatcher - def initialize(description=nil, &block) - @description = description - @block = block - end - - # @private - def matches?(actual, &block) - @block = block if block - @actual = actual - @block.call(actual) - end - - # @private - def description - @description ||= "satisfy #{block_representation}" - end - - # @api private - # @return [String] - def failure_message - "expected #{actual_formatted} to #{description}" - end - - # @api private - # @return [String] - def failure_message_when_negated - "expected #{actual_formatted} not to #{description}" - end - - private - - if RSpec::Support::RubyFeatures.ripper_supported? - def block_representation - if (block_snippet = extract_block_snippet) - "expression `#{block_snippet}`" - else - 'block' - end - end - - def extract_block_snippet - return nil unless @block - Expectations::BlockSnippetExtractor.try_extracting_single_line_body_of(@block, matcher_name) - end - else - # :nocov: - def block_representation - 'block' - end - # :nocov: - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/start_or_end_with.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/start_or_end_with.rb deleted file mode 100644 index 81f06c2..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/start_or_end_with.rb +++ /dev/null @@ -1,94 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Base class for the `end_with` and `start_with` matchers. - # Not intended to be instantiated directly. - class StartOrEndWith < BaseMatcher - def initialize(*expected) - @actual_does_not_have_ordered_elements = false - @expected = expected.length == 1 ? expected.first : expected - end - - # @api private - # @return [String] - def failure_message - super.tap do |msg| - if @actual_does_not_have_ordered_elements - msg << ", but it does not have ordered elements" - elsif !actual.respond_to?(:[]) - msg << ", but it cannot be indexed using #[]" - end - end - end - - # @api private - # @return [String] - def description - return super unless Hash === expected - english_name = EnglishPhrasing.split_words(self.class.matcher_name) - description_of_expected = surface_descriptions_in(expected).inspect - "#{english_name} #{description_of_expected}" - end - - private - - def match(_expected, actual) - return false unless actual.respond_to?(:[]) - - begin - return true if subsets_comparable? && subset_matches? - element_matches? - rescue ArgumentError - @actual_does_not_have_ordered_elements = true - return false - end - end - - def subsets_comparable? - # Structs support the Enumerable interface but don't really have - # the semantics of a subset of a larger set... - return false if Struct === expected - - expected.respond_to?(:length) - end - end - - # For RSpec 3.1, the base class was named `StartAndEndWith`. For SemVer reasons, - # we still provide this constant until 4.0. - # @deprecated Use StartOrEndWith instead. - # @private - StartAndEndWith = StartOrEndWith - - # @api private - # Provides the implementation for `start_with`. - # Not intended to be instantiated directly. - class StartWith < StartOrEndWith - private - - def subset_matches? - values_match?(expected, actual[0, expected.length]) - end - - def element_matches? - values_match?(expected, actual[0]) - end - end - - # @api private - # Provides the implementation for `end_with`. - # Not intended to be instantiated directly. - class EndWith < StartOrEndWith - private - - def subset_matches? - values_match?(expected, actual[-expected.length, expected.length]) - end - - def element_matches? - values_match?(expected, actual[-1]) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/throw_symbol.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/throw_symbol.rb deleted file mode 100644 index e1bb4c5..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/throw_symbol.rb +++ /dev/null @@ -1,138 +0,0 @@ -module RSpec - module Matchers - module BuiltIn - # @api private - # Provides the implementation for `throw_symbol`. - # Not intended to be instantiated directly. - class ThrowSymbol - include Composable - - def initialize(expected_symbol=nil, expected_arg=nil) - @expected_symbol = expected_symbol - @expected_arg = expected_arg - @caught_symbol = @caught_arg = nil - end - - # rubocop:disable Metrics/MethodLength - # @private - def matches?(given_proc) - @block = given_proc - return false unless Proc === given_proc - - begin - if @expected_symbol.nil? - given_proc.call - else - @caught_arg = catch :proc_did_not_throw_anything do - catch @expected_symbol do - given_proc.call - throw :proc_did_not_throw_anything, :nothing_thrown - end - end - - if @caught_arg == :nothing_thrown - @caught_arg = nil - else - @caught_symbol = @expected_symbol - end - end - - # Ruby 1.8 uses NameError with `symbol' - # Ruby 1.9 uses ArgumentError with :symbol - rescue NameError, ArgumentError => e - unless (match_data = e.message.match(/uncaught throw (`|\:)([a-zA-Z0-9_]*)(')?/)) - other_exception = e - raise - end - @caught_symbol = match_data.captures[1].to_sym - rescue => other_exception - raise - ensure - # rubocop:disable Lint/EnsureReturn - unless other_exception - if @expected_symbol.nil? - return !!@caught_symbol - else - if @expected_arg.nil? - return @caught_symbol == @expected_symbol - else - return (@caught_symbol == @expected_symbol) && values_match?(@expected_arg, @caught_arg) - end - end - end - # rubocop:enable Lint/EnsureReturn - end - end - # rubocop:enable Metrics/MethodLength - - def does_not_match?(given_proc) - !matches?(given_proc) && Proc === given_proc - end - - # @api private - # @return [String] - def failure_message - "expected #{expected} to be thrown, #{actual_result}" - end - - # @api private - # @return [String] - def failure_message_when_negated - "expected #{expected('no Symbol')}#{' not' if @expected_symbol} to be thrown, #{actual_result}" - end - - # @api private - # @return [String] - def description - "throw #{expected}" - end - - # @api private - # Indicates this matcher matches against a block. - # @return [True] - def supports_block_expectations? - true - end - - # @api private - def supports_value_expectations? - false - end - - # @api private - def expects_call_stack_jump? - true - end - - private - - def actual_result - return "but was not a block" unless Proc === @block - "got #{caught}" - end - - def expected(symbol_desc='a Symbol') - throw_description(@expected_symbol || symbol_desc, @expected_arg) - end - - def caught - throw_description(@caught_symbol || 'nothing', @caught_arg) - end - - def throw_description(symbol, arg) - symbol_description = symbol.is_a?(String) ? symbol : description_of(symbol) - - arg_description = if arg - " with #{description_of arg}" - elsif @expected_arg && @caught_symbol == @expected_symbol - " with no argument" - else - "" - end - - symbol_description + arg_description - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/yield.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/yield.rb deleted file mode 100644 index c443dc0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/built_in/yield.rb +++ /dev/null @@ -1,375 +0,0 @@ -require 'rspec/matchers/built_in/count_expectation' - -RSpec::Support.require_rspec_support 'method_signature_verifier' - -module RSpec - module Matchers - module BuiltIn - # @private - # Object that is yielded to `expect` when one of the - # yield matchers is used. Provides information about - # the yield behavior of the object-under-test. - class YieldProbe - def self.probe(block, &callback) - probe = new(block, &callback) - return probe unless probe.has_block? - probe.probe - end - - attr_accessor :num_yields, :yielded_args - - def initialize(block, &callback) - @block = block - @callback = callback || Proc.new {} - @used = false - self.num_yields = 0 - self.yielded_args = [] - end - - def has_block? - Proc === @block - end - - def probe - assert_valid_expect_block! - @block.call(self) - assert_used! - self - end - - def to_proc - @used = true - - probe = self - callback = @callback - Proc.new do |*args| - probe.num_yields += 1 - probe.yielded_args << args - callback.call(*args) - nil # to indicate the block does not return a meaningful value - end - end - - def single_yield_args - yielded_args.first - end - - def yielded_once?(matcher_name) - case num_yields - when 1 then true - when 0 then false - else - raise "The #{matcher_name} matcher is not designed to be used with a " \ - 'method that yields multiple times. Use the yield_successive_args ' \ - 'matcher for that case.' - end - end - - def assert_used! - return if @used - raise 'You must pass the argument yielded to your expect block on ' \ - 'to the method-under-test as a block. It acts as a probe that ' \ - 'allows the matcher to detect whether or not the method-under-test ' \ - 'yields, and, if so, how many times, and what the yielded arguments ' \ - 'are.' - end - - if RUBY_VERSION.to_f > 1.8 - def assert_valid_expect_block! - block_signature = RSpec::Support::BlockSignature.new(@block) - return if RSpec::Support::StrictSignatureVerifier.new(block_signature, [self]).valid? - raise 'Your expect block must accept an argument to be used with this ' \ - 'matcher. Pass the argument as a block on to the method you are testing.' - end - else - # :nocov: - # On 1.8.7, `lambda { }.arity` and `lambda { |*a| }.arity` both return -1, - # so we can't distinguish between accepting no args and an arg splat. - # It's OK to skip, this, though; it just provides a nice error message - # when the user forgets to accept an arg in their block. They'll still get - # the `assert_used!` error message from above, which is sufficient. - def assert_valid_expect_block! - # nothing to do - end - # :nocov: - end - end - - # @api private - # Provides the implementation for `yield_control`. - # Not intended to be instantiated directly. - class YieldControl < BaseMatcher - include CountExpectation - # @private - def matches?(block) - @probe = YieldProbe.probe(block) - return false unless @probe.has_block? - expected_count_matches?(@probe.num_yields) - end - - # @private - def does_not_match?(block) - !matches?(block) && @probe.has_block? - end - - # @api private - # @return [String] - def failure_message - 'expected given block to yield control' + failure_reason - end - - # @api private - # @return [String] - def failure_message_when_negated - 'expected given block not to yield control' + failure_reason - end - - # @private - def supports_block_expectations? - true - end - - # @private - def supports_value_expectations? - false - end - - private - - def failure_reason - return ' but was not a block' unless @probe.has_block? - return "#{count_expectation_description} but did not yield" if @probe.num_yields == 0 - count_failure_reason('yielded') - end - end - - # @api private - # Provides the implementation for `yield_with_no_args`. - # Not intended to be instantiated directly. - class YieldWithNoArgs < BaseMatcher - # @private - def matches?(block) - @probe = YieldProbe.probe(block) - return false unless @probe.has_block? - @probe.yielded_once?(:yield_with_no_args) && @probe.single_yield_args.empty? - end - - # @private - def does_not_match?(block) - !matches?(block) && @probe.has_block? - end - - # @private - def failure_message - "expected given block to yield with no arguments, but #{positive_failure_reason}" - end - - # @private - def failure_message_when_negated - "expected given block not to yield with no arguments, but #{negative_failure_reason}" - end - - # @private - def supports_block_expectations? - true - end - - # @private - def supports_value_expectations? - false - end - - private - - def positive_failure_reason - return 'was not a block' unless @probe.has_block? - return 'did not yield' if @probe.num_yields.zero? - "yielded with arguments: #{description_of @probe.single_yield_args}" - end - - def negative_failure_reason - return 'was not a block' unless @probe.has_block? - 'did' - end - end - - # @api private - # Provides the implementation for `yield_with_args`. - # Not intended to be instantiated directly. - class YieldWithArgs < BaseMatcher - def initialize(*args) - @expected = args - end - - # @private - def matches?(block) - @args_matched_when_yielded = true - @probe = YieldProbe.new(block) do - @actual = @probe.single_yield_args - @actual_formatted = actual_formatted - @args_matched_when_yielded &&= args_currently_match? - end - return false unless @probe.has_block? - @probe.probe - @probe.yielded_once?(:yield_with_args) && @args_matched_when_yielded - end - - # @private - def does_not_match?(block) - !matches?(block) && @probe.has_block? - end - - # @private - def failure_message - "expected given block to yield with arguments, but #{positive_failure_reason}" - end - - # @private - def failure_message_when_negated - "expected given block not to yield with arguments, but #{negative_failure_reason}" - end - - # @private - def description - desc = 'yield with args' - desc = "#{desc}(#{expected_arg_description})" unless @expected.empty? - desc - end - - # @private - def supports_block_expectations? - true - end - - # @private - def supports_value_expectations? - false - end - - private - - def positive_failure_reason - return 'was not a block' unless @probe.has_block? - return 'did not yield' if @probe.num_yields.zero? - @positive_args_failure - end - - def expected_arg_description - @expected.map { |e| description_of e }.join(', ') - end - - def negative_failure_reason - if !@probe.has_block? - 'was not a block' - elsif @args_matched_when_yielded && !@expected.empty? - 'yielded with expected arguments' \ - "\nexpected not: #{surface_descriptions_in(@expected).inspect}" \ - "\n got: #{@actual_formatted}" - else - 'did' - end - end - - def args_currently_match? - if @expected.empty? # expect {...}.to yield_with_args - @positive_args_failure = 'yielded with no arguments' if @actual.empty? - return !@actual.empty? - end - - unless (match = all_args_match?) - @positive_args_failure = 'yielded with unexpected arguments' \ - "\nexpected: #{surface_descriptions_in(@expected).inspect}" \ - "\n got: #{@actual_formatted}" - end - - match - end - - def all_args_match? - values_match?(@expected, @actual) - end - end - - # @api private - # Provides the implementation for `yield_successive_args`. - # Not intended to be instantiated directly. - class YieldSuccessiveArgs < BaseMatcher - def initialize(*args) - @expected = args - end - - # @private - def matches?(block) - @actual_formatted = [] - @actual = [] - args_matched_when_yielded = true - yield_count = 0 - - @probe = YieldProbe.probe(block) do |*arg_array| - arg_or_args = arg_array.size == 1 ? arg_array.first : arg_array - @actual_formatted << RSpec::Support::ObjectFormatter.format(arg_or_args) - @actual << arg_or_args - args_matched_when_yielded &&= values_match?(@expected[yield_count], arg_or_args) - yield_count += 1 - end - - return false unless @probe.has_block? - args_matched_when_yielded && yield_count == @expected.length - end - - def does_not_match?(block) - !matches?(block) && @probe.has_block? - end - - # @private - def failure_message - 'expected given block to yield successively with arguments, ' \ - "but #{positive_failure_reason}" - end - - # @private - def failure_message_when_negated - 'expected given block not to yield successively with arguments, ' \ - "but #{negative_failure_reason}" - end - - # @private - def description - "yield successive args(#{expected_arg_description})" - end - - # @private - def supports_block_expectations? - true - end - - # @private - def supports_value_expectations? - false - end - - private - - def expected_arg_description - @expected.map { |e| description_of e }.join(', ') - end - - def positive_failure_reason - return 'was not a block' unless @probe.has_block? - - 'yielded with unexpected arguments' \ - "\nexpected: #{surface_descriptions_in(@expected).inspect}" \ - "\n got: [#{@actual_formatted.join(", ")}]" - end - - def negative_failure_reason - return 'was not a block' unless @probe.has_block? - - 'yielded with expected arguments' \ - "\nexpected not: #{surface_descriptions_in(@expected).inspect}" \ - "\n got: [#{@actual_formatted.join(", ")}]" - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/composable.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/composable.rb deleted file mode 100644 index e4816e9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/composable.rb +++ /dev/null @@ -1,171 +0,0 @@ -RSpec::Support.require_rspec_support "fuzzy_matcher" - -module RSpec - module Matchers - # Mixin designed to support the composable matcher features - # of RSpec 3+. Mix it into your custom matcher classes to - # allow them to be used in a composable fashion. - # - # @api public - module Composable - # Creates a compound `and` expectation. The matcher will - # only pass if both sub-matchers pass. - # This can be chained together to form an arbitrarily long - # chain of matchers. - # - # @example - # expect(alphabet).to start_with("a").and end_with("z") - # expect(alphabet).to start_with("a") & end_with("z") - # - # @note The negative form (`expect(...).not_to matcher.and other`) - # is not supported at this time. - def and(matcher) - BuiltIn::Compound::And.new self, matcher - end - alias & and - - # Creates a compound `or` expectation. The matcher will - # pass if either sub-matcher passes. - # This can be chained together to form an arbitrarily long - # chain of matchers. - # - # @example - # expect(stoplight.color).to eq("red").or eq("green").or eq("yellow") - # expect(stoplight.color).to eq("red") | eq("green") | eq("yellow") - # - # @note The negative form (`expect(...).not_to matcher.or other`) - # is not supported at this time. - def or(matcher) - BuiltIn::Compound::Or.new self, matcher - end - alias | or - - # Delegates to `#matches?`. Allows matchers to be used in composable - # fashion and also supports using matchers in case statements. - def ===(value) - matches?(value) - end - - private - - # This provides a generic way to fuzzy-match an expected value against - # an actual value. It understands nested data structures (e.g. hashes - # and arrays) and is able to match against a matcher being used as - # the expected value or within the expected value at any level of - # nesting. - # - # Within a custom matcher you are encouraged to use this whenever your - # matcher needs to match two values, unless it needs more precise semantics. - # For example, the `eq` matcher _does not_ use this as it is meant to - # use `==` (and only `==`) for matching. - # - # @param expected [Object] what is expected - # @param actual [Object] the actual value - # - # @!visibility public - def values_match?(expected, actual) - expected = with_matchers_cloned(expected) - Support::FuzzyMatcher.values_match?(expected, actual) - end - - # Returns the description of the given object in a way that is - # aware of composed matchers. If the object is a matcher with - # a `description` method, returns the description; otherwise - # returns `object.inspect`. - # - # You are encouraged to use this in your custom matcher's - # `description`, `failure_message` or - # `failure_message_when_negated` implementation if you are - # supporting matcher arguments. - # - # @!visibility public - def description_of(object) - RSpec::Support::ObjectFormatter.format(object) - end - - # Transforms the given data structure (typically a hash or array) - # into a new data structure that, when `#inspect` is called on it, - # will provide descriptions of any contained matchers rather than - # the normal `#inspect` output. - # - # You are encouraged to use this in your custom matcher's - # `description`, `failure_message` or - # `failure_message_when_negated` implementation if you are - # supporting any arguments which may be a data structure - # containing matchers. - # - # @!visibility public - def surface_descriptions_in(item) - if Matchers.is_a_describable_matcher?(item) - DescribableItem.new(item) - elsif Hash === item - Hash[surface_descriptions_in(item.to_a)] - elsif Struct === item || unreadable_io?(item) - RSpec::Support::ObjectFormatter.format(item) - elsif should_enumerate?(item) - item.map { |subitem| surface_descriptions_in(subitem) } - else - item - end - end - - # @private - # Historically, a single matcher instance was only checked - # against a single value. Given that the matcher was only - # used once, it's been common to memoize some intermediate - # calculation that is derived from the `actual` value in - # order to reuse that intermediate result in the failure - # message. - # - # This can cause a problem when using such a matcher as an - # argument to another matcher in a composed matcher expression, - # since the matcher instance may be checked against multiple - # values and produce invalid results due to the memoization. - # - # To deal with this, we clone any matchers in `expected` via - # this method when using `values_match?`, so that any memoization - # does not "leak" between checks. - def with_matchers_cloned(object) - if Matchers.is_a_matcher?(object) - object.clone - elsif Hash === object - Hash[with_matchers_cloned(object.to_a)] - elsif should_enumerate?(object) - object.map { |subobject| with_matchers_cloned(subobject) } - else - object - end - end - - # @api private - # We should enumerate arrays as long as they are not recursive. - def should_enumerate?(item) - Array === item && item.none? { |subitem| subitem.equal?(item) } - end - - # @api private - def unreadable_io?(object) - return false unless IO === object - object.each {} # STDOUT is enumerable but raises an error - false - rescue IOError - true - end - module_function :surface_descriptions_in, :should_enumerate?, :unreadable_io? - - # Wraps an item in order to surface its `description` via `inspect`. - # @api private - DescribableItem = Struct.new(:item) do - # Inspectable version of the item description - def inspect - "(#{item.description})" - end - - # A pretty printed version of the item description. - def pretty_print(pp) - pp.text "(#{item.description})" - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/dsl.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/dsl.rb deleted file mode 100644 index 4905dd8..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/dsl.rb +++ /dev/null @@ -1,546 +0,0 @@ -RSpec::Support.require_rspec_support "with_keywords_when_needed" - -module RSpec - module Matchers - # Defines the custom matcher DSL. - module DSL - # Defines a matcher alias. The returned matcher's `description` will be overridden - # to reflect the phrasing of the new name, which will be used in failure messages - # when passed as an argument to another matcher in a composed matcher expression. - # - # @example - # RSpec::Matchers.alias_matcher :a_list_that_sums_to, :sum_to - # sum_to(3).description # => "sum to 3" - # a_list_that_sums_to(3).description # => "a list that sums to 3" - # - # @example - # RSpec::Matchers.alias_matcher :a_list_sorted_by, :be_sorted_by do |description| - # description.sub("be sorted by", "a list sorted by") - # end - # - # be_sorted_by(:age).description # => "be sorted by age" - # a_list_sorted_by(:age).description # => "a list sorted by age" - # - # @param new_name [Symbol] the new name for the matcher - # @param old_name [Symbol] the original name for the matcher - # @param options [Hash] options for the aliased matcher - # @option options [Class] :klass the ruby class to use as the decorator. (Not normally used). - # @yield [String] optional block that, when given, is used to define the overridden - # logic. The yielded arg is the original description or failure message. If no - # block is provided, a default override is used based on the old and new names. - # @see RSpec::Matchers - def alias_matcher(new_name, old_name, options={}, &description_override) - description_override ||= lambda do |old_desc| - old_desc.gsub(EnglishPhrasing.split_words(old_name), EnglishPhrasing.split_words(new_name)) - end - klass = options.fetch(:klass) { AliasedMatcher } - - define_method(new_name) do |*args, &block| - matcher = __send__(old_name, *args, &block) - matcher.matcher_name = new_name if matcher.respond_to?(:matcher_name=) - klass.new(matcher, description_override) - end - ruby2_keywords new_name if respond_to?(:ruby2_keywords, true) - end - - # Defines a negated matcher. The returned matcher's `description` and `failure_message` - # will be overridden to reflect the phrasing of the new name, and the match logic will - # be based on the original matcher but negated. - # - # @example - # RSpec::Matchers.define_negated_matcher :exclude, :include - # include(1, 2).description # => "include 1 and 2" - # exclude(1, 2).description # => "exclude 1 and 2" - # - # @param negated_name [Symbol] the name for the negated matcher - # @param base_name [Symbol] the name of the original matcher that will be negated - # @yield [String] optional block that, when given, is used to define the overridden - # logic. The yielded arg is the original description or failure message. If no - # block is provided, a default override is used based on the old and new names. - # @see RSpec::Matchers - def define_negated_matcher(negated_name, base_name, &description_override) - alias_matcher(negated_name, base_name, :klass => AliasedNegatedMatcher, &description_override) - end - - # Defines a custom matcher. - # - # @param name [Symbol] the name for the matcher - # @yield [Object] block that is used to define the matcher. - # The block is evaluated in the context of your custom matcher class. - # When args are passed to your matcher, they will be yielded here, - # usually representing the expected value(s). - # @see RSpec::Matchers - def define(name, &declarations) - warn_about_block_args(name, declarations) - define_method name do |*expected, &block_arg| - RSpec::Matchers::DSL::Matcher.new(name, declarations, self, *expected, &block_arg) - end - end - alias_method :matcher, :define - - private - - if Proc.method_defined?(:parameters) - def warn_about_block_args(name, declarations) - declarations.parameters.each do |type, arg_name| - next unless type == :block - RSpec.warning("Your `#{name}` custom matcher receives a block argument (`#{arg_name}`), " \ - "but due to limitations in ruby, RSpec cannot provide the block. Instead, " \ - "use the `block_arg` method to access the block") - end - end - else - # :nocov: - def warn_about_block_args(*) - # There's no way to detect block params on 1.8 since the method reflection APIs don't expose it - end - # :nocov: - end - - RSpec.configure { |c| c.extend self } if RSpec.respond_to?(:configure) - - # Contains the methods that are available from within the - # `RSpec::Matchers.define` DSL for creating custom matchers. - module Macros - # Stores the block that is used to determine whether this matcher passes - # or fails. The block should return a boolean value. When the matcher is - # passed to `expect(...).to` and the block returns `true`, then the expectation - # passes. Similarly, when the matcher is passed to `expect(...).not_to` and the - # block returns `false`, then the expectation passes. - # - # @example - # - # RSpec::Matchers.define :be_even do - # match do |actual| - # actual.even? - # end - # end - # - # expect(4).to be_even # passes - # expect(3).not_to be_even # passes - # expect(3).to be_even # fails - # expect(4).not_to be_even # fails - # - # By default the match block will swallow expectation errors (e.g. - # caused by using an expectation such as `expect(1).to eq 2`), if you - # wish to allow these to bubble up, pass in the option - # `:notify_expectation_failures => true`. - # - # @param [Hash] options for defining the behavior of the match block. - # @yield [Object] actual the actual value (i.e. the value wrapped by `expect`) - def match(options={}, &match_block) - define_user_override(:matches?, match_block) do |actual| - @actual = actual - RSpec::Support.with_failure_notifier(RAISE_NOTIFIER) do - begin - super(*actual_arg_for(match_block)) - rescue RSpec::Expectations::ExpectationNotMetError - raise if options[:notify_expectation_failures] - false - end - end - end - end - - # @private - RAISE_NOTIFIER = Proc.new { |err, _opts| raise err } - - # Use this to define the block for a negative expectation (`expect(...).not_to`) - # when the positive and negative forms require different handling. This - # is rarely necessary, but can be helpful, for example, when specifying - # asynchronous processes that require different timeouts. - # - # By default the match block will swallow expectation errors (e.g. - # caused by using an expectation such as `expect(1).to eq 2`), if you - # wish to allow these to bubble up, pass in the option - # `:notify_expectation_failures => true`. - # - # @param [Hash] options for defining the behavior of the match block. - # @yield [Object] actual the actual value (i.e. the value wrapped by `expect`) - def match_when_negated(options={}, &match_block) - define_user_override(:does_not_match?, match_block) do |actual| - begin - @actual = actual - RSpec::Support.with_failure_notifier(RAISE_NOTIFIER) do - super(*actual_arg_for(match_block)) - end - rescue RSpec::Expectations::ExpectationNotMetError - raise if options[:notify_expectation_failures] - false - end - end - end - - # Use this instead of `match` when the block will raise an exception - # rather than returning false to indicate a failure. - # - # @example - # - # RSpec::Matchers.define :accept_as_valid do |candidate_address| - # match_unless_raises ValidationException do |validator| - # validator.validate(candidate_address) - # end - # end - # - # expect(email_validator).to accept_as_valid("person@company.com") - # - # @yield [Object] actual the actual object (i.e. the value wrapped by `expect`) - def match_unless_raises(expected_exception=Exception, &match_block) - define_user_override(:matches?, match_block) do |actual| - @actual = actual - begin - super(*actual_arg_for(match_block)) - rescue expected_exception => @rescued_exception - false - else - true - end - end - end - - # Customizes the failure message to use when this matcher is - # asked to positively match. Only use this when the message - # generated by default doesn't suit your needs. - # - # @example - # - # RSpec::Matchers.define :have_strength do |expected| - # match { your_match_logic } - # - # failure_message do |actual| - # "Expected strength of #{expected}, but had #{actual.strength}" - # end - # end - # - # @yield [Object] actual the actual object (i.e. the value wrapped by `expect`) - def failure_message(&definition) - define_user_override(__method__, definition) - end - - # Customize the failure message to use when this matcher is asked - # to negatively match. Only use this when the message generated by - # default doesn't suit your needs. - # - # @example - # - # RSpec::Matchers.define :have_strength do |expected| - # match { your_match_logic } - # - # failure_message_when_negated do |actual| - # "Expected not to have strength of #{expected}, but did" - # end - # end - # - # @yield [Object] actual the actual object (i.e. the value wrapped by `expect`) - def failure_message_when_negated(&definition) - define_user_override(__method__, definition) - end - - # Customize the description to use for one-liners. Only use this when - # the description generated by default doesn't suit your needs. - # - # @example - # - # RSpec::Matchers.define :qualify_for do |expected| - # match { your_match_logic } - # - # description do - # "qualify for #{expected}" - # end - # end - # - # @yield [Object] actual the actual object (i.e. the value wrapped by `expect`) - def description(&definition) - define_user_override(__method__, definition) - end - - # Tells the matcher to diff the actual and expected values in the failure - # message. - def diffable - define_method(:diffable?) { true } - end - - # Declares that the matcher can be used in a block expectation. - # Users will not be able to use your matcher in a block - # expectation without declaring this. - # (e.g. `expect { do_something }.to matcher`). - def supports_block_expectations - define_method(:supports_block_expectations?) { true } - end - - # Convenience for defining methods on this matcher to create a fluent - # interface. The trick about fluent interfaces is that each method must - # return self in order to chain methods together. `chain` handles that - # for you. If the method is invoked and the - # `include_chain_clauses_in_custom_matcher_descriptions` config option - # hash been enabled, the chained method name and args will be added to the - # default description and failure message. - # - # In the common case where you just want the chained method to store some - # value(s) for later use (e.g. in `match`), you can provide one or more - # attribute names instead of a block; the chained method will store its - # arguments in instance variables with those names, and the values will - # be exposed via getters. - # - # @example - # - # RSpec::Matchers.define :have_errors_on do |key| - # chain :with do |message| - # @message = message - # end - # - # match do |actual| - # actual.errors[key] == @message - # end - # end - # - # expect(minor).to have_errors_on(:age).with("Not old enough to participate") - def chain(method_name, *attr_names, &definition) - unless block_given? ^ attr_names.any? - raise ArgumentError, "You must pass either a block or some attribute names (but not both) to `chain`." - end - - definition = assign_attributes(attr_names) if attr_names.any? - - define_user_override(method_name, definition) do |*args, &block| - super(*args, &block) - @chained_method_clauses.push([method_name, args]) - self - end - end - - def assign_attributes(attr_names) - attr_reader(*attr_names) - private(*attr_names) - - lambda do |*attr_values| - attr_names.zip(attr_values) do |attr_name, attr_value| - instance_variable_set(:"@#{attr_name}", attr_value) - end - end - end - - # assign_attributes isn't defined in the private section below because - # that makes MRI 1.9.2 emit a warning about private attributes. - private :assign_attributes - - private - - # Does the following: - # - # - Defines the named method using a user-provided block - # in @user_method_defs, which is included as an ancestor - # in the singleton class in which we eval the `define` block. - # - Defines an overridden definition for the same method - # usign the provided `our_def` block. - # - Provides a default `our_def` block for the common case - # of needing to call the user's definition with `@actual` - # as an arg, but only if their block's arity can handle it. - # - # This compiles the user block into an actual method, allowing - # them to use normal method constructs like `return` - # (e.g. for an early guard statement), while allowing us to define - # an override that can provide the wrapped handling - # (e.g. assigning `@actual`, rescueing errors, etc) and - # can `super` to the user's definition. - def define_user_override(method_name, user_def, &our_def) - @user_method_defs.__send__(:define_method, method_name, &user_def) - our_def ||= lambda { super(*actual_arg_for(user_def)) } - define_method(method_name, &our_def) - end - - # Defines deprecated macro methods from RSpec 2 for backwards compatibility. - # @deprecated Use the methods from {Macros} instead. - module Deprecated - # @deprecated Use {Macros#match} instead. - def match_for_should(&definition) - RSpec.deprecate("`match_for_should`", :replacement => "`match`") - match(&definition) - end - - # @deprecated Use {Macros#match_when_negated} instead. - def match_for_should_not(&definition) - RSpec.deprecate("`match_for_should_not`", :replacement => "`match_when_negated`") - match_when_negated(&definition) - end - - # @deprecated Use {Macros#failure_message} instead. - def failure_message_for_should(&definition) - RSpec.deprecate("`failure_message_for_should`", :replacement => "`failure_message`") - failure_message(&definition) - end - - # @deprecated Use {Macros#failure_message_when_negated} instead. - def failure_message_for_should_not(&definition) - RSpec.deprecate("`failure_message_for_should_not`", :replacement => "`failure_message_when_negated`") - failure_message_when_negated(&definition) - end - end - end - - # Defines default implementations of the matcher - # protocol methods for custom matchers. You can - # override any of these using the {RSpec::Matchers::DSL::Macros Macros} methods - # from within an `RSpec::Matchers.define` block. - module DefaultImplementations - include BuiltIn::BaseMatcher::DefaultFailureMessages - - # @api private - # Used internally by objects returns by `should` and `should_not`. - def diffable? - false - end - - # The default description. - def description - english_name = EnglishPhrasing.split_words(name) - expected_list = EnglishPhrasing.list(expected) - "#{english_name}#{expected_list}#{chained_method_clause_sentences}" - end - - # Matchers do not support block expectations by default. You - # must opt-in. - def supports_block_expectations? - false - end - - def supports_value_expectations? - true - end - - # Most matchers do not expect call stack jumps. - def expects_call_stack_jump? - false - end - - private - - def chained_method_clause_sentences - return '' unless Expectations.configuration.include_chain_clauses_in_custom_matcher_descriptions? - - @chained_method_clauses.map do |(method_name, method_args)| - english_name = EnglishPhrasing.split_words(method_name) - arg_list = EnglishPhrasing.list(method_args) - " #{english_name}#{arg_list}" - end.join - end - end - - # The class used for custom matchers. The block passed to - # `RSpec::Matchers.define` will be evaluated in the context - # of the singleton class of an instance, and will have the - # {RSpec::Matchers::DSL::Macros Macros} methods available. - class Matcher - # Provides default implementations for the matcher protocol methods. - include DefaultImplementations - - # Allows expectation expressions to be used in the match block. - include RSpec::Matchers - - # Supports the matcher composability features of RSpec 3+. - include Composable - - # Makes the macro methods available to an `RSpec::Matchers.define` block. - extend Macros - extend Macros::Deprecated - - # Exposes the value being matched against -- generally the object - # object wrapped by `expect`. - attr_reader :actual - - # Exposes the exception raised during the matching by `match_unless_raises`. - # Could be useful to extract details for a failure message. - attr_reader :rescued_exception - - # The block parameter used in the expectation - attr_reader :block_arg - - # The name of the matcher. - attr_reader :name - - # @api private - def initialize(name, declarations, matcher_execution_context, *expected, &block_arg) - @name = name - @actual = nil - @expected_as_array = expected - @matcher_execution_context = matcher_execution_context - @chained_method_clauses = [] - @block_arg = block_arg - - klass = - class << self - # See `Macros#define_user_override` above, for an explanation. - include(@user_method_defs = Module.new) - self - end - RSpec::Support::WithKeywordsWhenNeeded.class_exec(klass, *expected, &declarations) - end - - # Provides the expected value. This will return an array if - # multiple arguments were passed to the matcher; otherwise it - # will return a single value. - # @see #expected_as_array - def expected - if expected_as_array.size == 1 - expected_as_array[0] - else - expected_as_array - end - end - - # Returns the expected value as an an array. This exists primarily - # to aid in upgrading from RSpec 2.x, since in RSpec 2, `expected` - # always returned an array. - # @see #expected - attr_reader :expected_as_array - - # Adds the name (rather than a cryptic hex number) - # so we can identify an instance of - # the matcher in error messages (e.g. for `NoMethodError`) - def inspect - "#<#{self.class.name} #{name}>" - end - - if RUBY_VERSION.to_f >= 1.9 - # Indicates that this matcher responds to messages - # from the `@matcher_execution_context` as well. - # Also, supports getting a method object for such methods. - def respond_to_missing?(method, include_private=false) - super || @matcher_execution_context.respond_to?(method, include_private) - end - else # for 1.8.7 - # :nocov: - # Indicates that this matcher responds to messages - # from the `@matcher_execution_context` as well. - def respond_to?(method, include_private=false) - super || @matcher_execution_context.respond_to?(method, include_private) - end - # :nocov: - end - - private - - def actual_arg_for(block) - block.arity.zero? ? [] : [@actual] - end - - # Takes care of forwarding unhandled messages to the - # `@matcher_execution_context` (typically the current - # running `RSpec::Core::Example`). This is needed by - # rspec-rails so that it can define matchers that wrap - # Rails' test helper methods, but it's also a useful - # feature in its own right. - def method_missing(method, *args, &block) - if @matcher_execution_context.respond_to?(method) - @matcher_execution_context.__send__ method, *args, &block - else - super(method, *args, &block) - end - end - # The method_missing method should be refactored to pass kw args in RSpec 4 - # then this can be removed - ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/english_phrasing.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/english_phrasing.rb deleted file mode 100644 index 05b69bd..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/english_phrasing.rb +++ /dev/null @@ -1,60 +0,0 @@ -module RSpec - module Matchers - # Facilitates converting ruby objects to English phrases. - module EnglishPhrasing - # Converts a symbol into an English expression. - # - # split_words(:banana_creme_pie) #=> "banana creme pie" - # - def self.split_words(sym) - sym.to_s.tr('_', ' ') - end - - # @note The returned string has a leading space except - # when given an empty list. - # - # Converts an object (often a collection of objects) - # into an English list. - # - # list(['banana', 'kiwi', 'mango']) - # #=> " \"banana\", \"kiwi\", and \"mango\"" - # - # Given an empty collection, returns the empty string. - # - # list([]) #=> "" - # - def self.list(obj) - return " #{RSpec::Support::ObjectFormatter.format(obj)}" if !obj || Struct === obj || Hash === obj - items = Array(obj).map { |w| RSpec::Support::ObjectFormatter.format(w) } - case items.length - when 0 - "" - when 1 - " #{items[0]}" - when 2 - " #{items[0]} and #{items[1]}" - else - " #{items[0...-1].join(', ')}, and #{items[-1]}" - end - end - - if RUBY_VERSION == '1.8.7' - # Not sure why, but on travis on 1.8.7 we have gotten these warnings: - # lib/rspec/matchers/english_phrasing.rb:28: warning: default `to_a' will be obsolete - # So it appears that `Array` can trigger that (e.g. by calling `to_a` on the passed object?) - # So here we replace `Kernel#Array` with our own warning-free implementation for 1.8.7. - # @private - # rubocop:disable Naming/MethodName - # :nocov: - def self.Array(obj) - case obj - when Array then obj - else [obj] - end - end - # :nocov: - # rubocop:enable Naming/MethodName - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/fail_matchers.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/fail_matchers.rb deleted file mode 100644 index bdd7cda..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/fail_matchers.rb +++ /dev/null @@ -1,42 +0,0 @@ -require 'rspec/expectations' - -module RSpec - module Matchers - # Matchers for testing RSpec matchers. Include them with: - # - # require 'rspec/matchers/fail_matchers' - # RSpec.configure do |config| - # config.include RSpec::Matchers::FailMatchers - # end - # - module FailMatchers - # Matches if an expectation fails - # - # @example - # expect { some_expectation }.to fail - def fail(&block) - raise_error(RSpec::Expectations::ExpectationNotMetError, &block) - end - - # Matches if an expectation fails with the provided message - # - # @example - # expect { some_expectation }.to fail_with("some failure message") - # expect { some_expectation }.to fail_with(/some failure message/) - def fail_with(message) - raise_error(RSpec::Expectations::ExpectationNotMetError, message) - end - - # Matches if an expectation fails including the provided message - # - # @example - # expect { some_expectation }.to fail_including("portion of some failure message") - def fail_including(*snippets) - raise_error( - RSpec::Expectations::ExpectationNotMetError, - a_string_including(*snippets) - ) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/generated_descriptions.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/generated_descriptions.rb deleted file mode 100644 index cbf3751..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/generated_descriptions.rb +++ /dev/null @@ -1,41 +0,0 @@ -module RSpec - module Matchers - class << self - # @private - attr_accessor :last_matcher, :last_expectation_handler - end - - # @api private - # Used by rspec-core to clear the state used to generate - # descriptions after an example. - def self.clear_generated_description - self.last_matcher = nil - self.last_expectation_handler = nil - end - - # @api private - # Generates an an example description based on the last expectation. - # Used by rspec-core's one-liner syntax. - def self.generated_description - return nil if last_expectation_handler.nil? - "#{last_expectation_handler.verb} #{last_description}" - end - - # @private - def self.last_description - last_matcher.respond_to?(:description) ? last_matcher.description : <<-MESSAGE -When you call a matcher in an example without a String, like this: - -specify { expect(object).to matcher } - -or this: - -it { is_expected.to matcher } - -RSpec expects the matcher to have a #description method. You should either -add a String to the example this matcher is being used in, or give it a -description method. Then you won't have to suffer this lengthy warning again. -MESSAGE - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/matcher_delegator.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/matcher_delegator.rb deleted file mode 100644 index b957b4f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/matcher_delegator.rb +++ /dev/null @@ -1,61 +0,0 @@ -module RSpec - module Matchers - # Provides a base class with as little methods as possible, so that - # most methods can be delegated via `method_missing`. - # - # On Ruby 2.0+ BasicObject could be used for this purpose, but it - # introduce some extra complexity with constant resolution, so the - # BlankSlate pattern was prefered. - # @private - class BaseDelegator - kept_methods = [ - # Methods that raise warnings if removed. - :__id__, :__send__, :object_id, - - # Methods that are explicitly undefined in some subclasses. - :==, :===, - - # Methods we keep on purpose. - :class, :respond_to?, :__method__, :method, :dup, - :clone, :initialize_dup, :initialize_copy, :initialize_clone, - ] - instance_methods.each do |method| - unless kept_methods.include?(method.to_sym) - undef_method(method) - end - end - end - - # Provides the necessary plumbing to wrap a matcher with a decorator. - # @private - class MatcherDelegator < BaseDelegator - include Composable - attr_reader :base_matcher - - def initialize(base_matcher) - @base_matcher = base_matcher - end - - def method_missing(*args, &block) - base_matcher.__send__(*args, &block) - end - - if ::RUBY_VERSION.to_f > 1.8 - def respond_to_missing?(name, include_all=false) - super || base_matcher.respond_to?(name, include_all) - end - else - # :nocov: - def respond_to?(name, include_all=false) - super || base_matcher.respond_to?(name, include_all) - end - # :nocov: - end - - def initialize_copy(other) - @base_matcher = @base_matcher.clone - super - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/matcher_protocol.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/matcher_protocol.rb deleted file mode 100644 index 4a87f64..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/matcher_protocol.rb +++ /dev/null @@ -1,105 +0,0 @@ -module RSpec - module Matchers - # rspec-expectations can work with any matcher object that implements this protocol. - # - # @note This class is not loaded at runtime by rspec-expectations. It exists - # purely to provide documentation for the matcher protocol. - class MatcherProtocol - # @!group Required Methods - - # @!method matches?(actual) - # @param actual [Object] The object being matched against. - # @yield For an expression like `expect(x).to matcher do...end`, the `do/end` - # block binds to `to`. It passes that block, if there is one, on to this method. - # @return [Boolean] true if this matcher matches the provided object. - - # @!method failure_message - # This will only be called if {#matches?} returns false. - # @return [String] Explanation for the failure. - - # @!endgroup - - # @!group Optional Methods - - # @!method does_not_match?(actual) - # In a negative expectation such as `expect(x).not_to foo`, RSpec will - # call `foo.does_not_match?(x)` if this method is defined. If it's not - # defined it will fall back to using `!foo.matches?(x)`. This allows you - # to provide custom logic for the negative case. - # - # @param actual [Object] The object being matched against. - # @yield For an expression like `expect(x).not_to matcher do...end`, the `do/end` - # block binds to `not_to`. It passes that block, if there is one, on to this method. - # @return [Boolean] true if this matcher does not match the provided object. - - # @!method failure_message_when_negated - # This will only be called when a negative match fails. - # @return [String] Explanation for the failure. - # @note This method is listed as optional because matchers do not have to - # support negation. But if your matcher does support negation, this is a - # required method -- otherwise, you'll get a `NoMethodError`. - - # @!method description - # The description is used for two things: - # - # * When using RSpec's one-liner syntax - # (e.g. `it { is_expected.to matcher }`), the description - # is used to generate the example's doc string since you - # have not provided one. - # * In a composed matcher expression, the description is used - # as part of the failure message (and description) of the outer - # matcher. - # - # @return [String] Description of the matcher. - - # @!method supports_block_expectations? - # Indicates that this matcher can be used in a block expectation expression, - # such as `expect { foo }.to raise_error`. Generally speaking, this is - # only needed for matchers which operate on a side effect of a block, rather - # than on a particular object. - # @return [Boolean] true if this matcher can be used in block expressions. - # @note If not defined, RSpec assumes a value of `false` for this method. - - # @!method supports_value_expectations? - # Indicates that this matcher can be used in a value expectation expression, - # such as `expect(foo).to eq(bar)`. - # @return [Boolean] true if this matcher can be used in value expressions. - # @note If not defined, RSpec assumes a value of `true` for this method. - - # @!method expects_call_stack_jump? - # Indicates that when this matcher is used in a block expectation - # expression, it expects the block to use a ruby construct that causes - # a call stack jump (such as raising an error or throwing a symbol). - # - # This is used internally for compound block expressions, as matchers - # which expect call stack jumps must be treated with care to work properly. - # - # @return [Boolean] true if the matcher expects a call stack jump - # - # @note This method is very rarely used or needed. - # @note If not defined, RSpec assumes a value of `false` for this method. - - # @!method diffable? - # @return [Boolean] true if `actual` and `expected` can be diffed. - # Indicates that this matcher provides `actual` and `expected` attributes, - # and that the values returned by these can be usefully diffed, which can - # be included in the output. - - # @!method actual - # @return [String, Object] If an object (rather than a string) is provided, - # RSpec will use the `pp` library to convert it to multi-line output in - # order to diff. - # The actual value for the purposes of a diff. - # @note This method is required if `diffable?` returns true. - - # @!method expected - # @return [String, Object] If an object (rather than a string) is provided, - # RSpec will use the `pp` library to convert it to multi-line output in - # order to diff. - # The expected value for the purposes of a diff. - # @note This method is required if `diffable?` returns true. - - # @!endgroup - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/multi_matcher_diff.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/multi_matcher_diff.rb deleted file mode 100644 index cd2264e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-expectations-3.13.5/lib/rspec/matchers/multi_matcher_diff.rb +++ /dev/null @@ -1,82 +0,0 @@ -module RSpec - module Matchers - # @api private - # Handles list of expected and actual value pairs when there is a need - # to render multiple diffs. Also can handle one pair. - class MultiMatcherDiff - # @private - # Default diff label when there is only one matcher in diff - # output - DEFAULT_DIFF_LABEL = "Diff:".freeze - - # @private - # Maximum readable matcher description length - DESCRIPTION_MAX_LENGTH = 65 - - def initialize(expected_list) - @expected_list = expected_list - end - - # @api private - # Wraps provided expected value in instance of - # MultiMatcherDiff. If provided value is already an - # MultiMatcherDiff then it just returns it. - # @param [Any] expected value to be wrapped - # @param [Any] actual value - # @return [RSpec::Matchers::MultiMatcherDiff] - def self.from(expected, actual) - return expected if self === expected - new([[expected, DEFAULT_DIFF_LABEL, actual]]) - end - - # @api private - # Wraps provided matcher list in instance of - # MultiMatcherDiff. - # @param [Array] matchers list of matchers to wrap - # @return [RSpec::Matchers::MultiMatcherDiff] - def self.for_many_matchers(matchers) - new(matchers.map { |m| [m.expected, diff_label_for(m), m.actual] }) - end - - # @api private - # Returns message with diff(s) appended for provided differ - # factory and actual value if there are any - # @param [String] message original failure message - # @param [Proc] differ - # @return [String] - def message_with_diff(message, differ) - diff = diffs(differ) - message = "#{message}\n#{diff}" unless diff.empty? - message - end - - private - - class << self - private - - def diff_label_for(matcher) - "Diff for (#{truncated(RSpec::Support::ObjectFormatter.format(matcher))}):" - end - - def truncated(description) - return description if description.length <= DESCRIPTION_MAX_LENGTH - description[0...DESCRIPTION_MAX_LENGTH - 3] << "..." - end - end - - def diffs(differ) - @expected_list.map do |(expected, diff_label, actual)| - diff = differ.diff(actual, expected) - next if diff.strip.empty? - if diff == "\e[0m\n\e[0m" - "#{diff_label}\n" \ - " " - else - "#{diff_label}#{diff}" - end - end.compact.join("\n") - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/.document b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/.document deleted file mode 100644 index 52a564f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/.document +++ /dev/null @@ -1,5 +0,0 @@ -lib/**/*.rb -- -README.md -LICENSE.md -Changelog.md diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/.yardopts b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/.yardopts deleted file mode 100644 index 9555b8e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/.yardopts +++ /dev/null @@ -1,6 +0,0 @@ ---exclude features ---no-private ---markup markdown -- -Changelog.md -LICENSE.md diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/Changelog.md b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/Changelog.md deleted file mode 100644 index f326ed9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/Changelog.md +++ /dev/null @@ -1,1329 +0,0 @@ -### Development -[Full Changelog](https://github.com/rspec/rspec/compare/rspec-mocks-v3.13.5...3-13-maintenance) - -### 3.13.5 / 2025-05-27 -[Full Changelog](https://github.com/rspec/rspec/compare/rspec-mocks-v3.13.4...rspec-mocks-v3.13.5) - -Bug Fixes: - -* Fix regression where a previous fix (rspec/rspec#214) would leave behind thread data - between tests. (Jon Rowe, rspec/rspec#219) -* Fix links in gemspec to point to monorepo / homepage. (Jon Rowe) - -### 3.13.4 / 2025-05-05 -[Full Changelog](https://github.com/rspec/rspec/compare/rspec-mocks-v3.13.3...rspec-mocks-v3.13.4) - -Bug Fixes: - -* Fix regression where nested stubbed method calls would inadvertently not be counted. - (Jon Rowe, rspec/rspec#214) -* Fix regression where keyword arguments would not be passed through to nested stubbed - method calls. (Jon Rowe, rspec/rspec#214) - -### 3.13.3 / 2025-05-01 -[Full Changelog](https://github.com/rspec/rspec/compare/rspec-mocks-v3.13.2...rspec-mocks-v3.13.3) - -Bug Fixes: - -* When stubbing methods using the `expect_any_instance_of` or `allow_any_instance_of` - ensure the stubbed method has the same visibility as the real method. - (Jon Rowe, rspec/rspec-mocks#1596) -* Prevent recursive calls to stubbed methods during stub invocation. - (James Dabbs, rspec/rspec#116, rspec/rspec#156) - -### 3.13.2 / 2024-10-02 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.13.1...v3.13.2) - -Bug Fixes: - -* Support keyword arguments in callables passed to `and_invoke`. (Jon Rowe, rspec/rspec-mocks#1595) - -### 3.13.1 / 2024-05-08 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.13.0...v3.13.1) - -Bug Fixes: - -* Use `RSpec::Support::Mutex` in `RSpec::Mocks::Proxy` to avoid issues from - stubbing `::Mutex#new`. (Eric Mueller, rspec/rspec-mocks#1575) - -### 3.13.0 / 2024-02-04 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.7...v3.13.0) - -Enhancements: - -* Add an `array_excluding` matcher for arguments. (Zane Wolfgang Pickett, rspec/rspec-mocks#1528) - -### 3.12.7 / 2024-02-04 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.6...v3.12.7) - -Bug Fixes: - -* Reduce allocations from "any_instance" style mocks. (Carlos Palhares, rspec/rspec-mocks#1479) - -### 3.12.6 / 2023-07-11 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.5...v3.12.6) - -Bug Fixes: - -* Fix an issue with `and_call_original` when using the `method_missing` fallback - with keyword arguments. (Igor Drozdov, rspec/rspec-mocks#1552) - -### 3.12.5 / 2023-03-30 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.4...v3.12.5) - -Bug Fixes: - -* Fix compatibility issue with Rails where active_support monkey patches `with` - when using any instance. (Lachlan Sylvester, rspec/rspec-mocks#1540) - -### 3.12.4 / 2023-03-12 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.3...v3.12.4) - -Bug Fixes: - -* Fix an issue with asserting that Array#reverse is never called. (Brad Trick, rspec/rspec-mocks#1533) -* Fix compatibility issue with Rails where active_support monkey patches `with`. - (Jean Boussier, rspec/rspec-mocks#1531, rspec/rspec-mocks#1534) - -### 3.12.3 / 2023-01-17 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.2...v3.12.3) - -Bug Fixes: - -* Fix keyword delegation in `send` for verifying doubles on Ruby 3. - (Charlie Honig, rspec/rspec-mocks#1485) - -### 3.12.2 / 2023-01-07 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.1...v3.12.2) - -Bug Fixes: - -* Fix implementation blocks for mocks using keyword arguments on Ruby 3.2.0. - (Adam Steel, rspec/rspec-mocks#1508) -* Fix keyword argument assertions when mocking using `with` on Ruby 3.2.0. - (Slava Kardakov, Benoit Tigeot, Phil Pirozhkov, Benoit Daloze, rspec/rspec-mocks#1514) - -### 3.12.1 / 2022-12-10 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.12.0...v3.12.1) - -Bug Fixes: - -* Remove empty diff marker when a diff only contains console codes. (Jon Rowe, rspec/rspec-mocks#1506) -* Show keyword vs hash diff marker when arguments are not `==` (Jon Rowe, rspec/rspec-mocks#1506) -* Change check to detect frozen objects to rescue errors rather than - pre-empting by checking `frozen?` due to some objects mis-behaving. - (Keegan Roth, rspec/rspec-mocks#1401) -* Prevent unfulfilled expectations using `expect_any_instance_of` across a class - inheritance boundary from raising rather than failing. (Jon Rowe, rspec/rspec-mocks#1496) -* Prevent a misleading error message when using `allow(...).not_to` with - unsupported matchers. (Phil Pirozhkov, rspec/rspec-mocks#1503) - -### 3.12.0 / 2022-10-26 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.11.2...v3.12.0) - -Enhancements: - -* Improve diff output when diffing keyword arguments against hashes. - (Jean Boussier, rspec/rspec-mocks#1461) - -### 3.11.2 / 2022-10-25 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.11.1...v3.11.2) - -Bug Fixes: - -* Use the original implementation of `Class.new` to detect overridden definitions - of `new` rather than the owner, fixing detection of "double aliased" methods - in Ruby 3 and above. (Benoit Daloze, rspec/rspec-mocks#1470, rspec/rspec-mocks#1476) -* Support keyword argument semantics when constraining argument expectations using - `with` on Ruby 3.0+ with `instance_double` (Andrii Malyshko, rspec/rspec-mocks#1473) - -### 3.11.1 / 2022-03-31 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.11.0...v3.11.1) - -Bug Fixes: - -* Add extra `ruby2_keywords` calls to properly designate methods using - `*args` to pass keyword around, fixes an issue with TruffleRuby. - (Benoit Daloze, rspec/rspec-mocks#1464) - -### 3.11.0 / 2022-02-09 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.10.3...v3.11.0) - -Enhancements: - -* Add `and_invoke` implementation for configuring responses to `receive` - (and `receive_messages`) with multiple callable objects. (Kyle Smith, rspec/rspec-mocks#1411) - -### 3.10.3 / 2022-01-28 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.10.2...v3.10.3) - -Bug Fixes: - -* Suppress warning by setting `$VERBOSE` to nil. (Nobuyoshi Nakada, rspec/rspec-mocks#1414) -* Support keyword argument semantics when constraining argument expectations using - `with` on Ruby 3.0+ (Yusuke Endoh, rspec/rspec-mocks#1394) - -### 3.10.2 / 2021-01-27 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.10.1...v3.10.2) - -Bug Fixes: - -* Support keyword arguments with `and_call_original` on Ruby 3.0. - (Bryan Powell, rspec/rspec-mocks#1385) -* `RSpec::Mocks::Constant#previously_defined?` is now always a boolean. - (Phil Pirozhkov, rspec/rspec-mocks#1397) -* Support keyword arguments on Ruby 3.0 when used with `expect_any_instance_of` - or `allow_any_instance_of` with `and_call_original`. - (Jess Hottenstein, rspec/rspec-mocks#1407) - -### 3.10.1 / 2020-12-27 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.10.0...v3.10.1) - -Bug Fixes: - -* Issue `ArgumentError` rather than `TypeError` when unsupported methods on - unsupported objects are attempted to be stubbed. (@zhisme, rspec/rspec-mocks#1357) - -### 3.10.0 / 2020-10-30 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.9.1...v3.10.0) - -Enhancements: -* Add the ability to set a custom error generator in `MessageExpectation`. - This will allow rspec-expectations to inject a custom failure message. - (Benoit Tigeot and Nicolas Zermati, rspec/rspec-mocks#1312) -* Return the result of the block passed to `RSpec::Mocks.with_temporary_scope` - when block run. (@expeehaa, rspec/rspec-mocks#1329) - -### 3.9.1 / 2019-12-31 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.9.0...v3.9.1) - -Bug Fixes: - -* Trigger `RSpec::Mocks.configuration.verifying_double_callbacks` when using - `allow_any_instance_of` or `expect_any_instance_of` (Daniel Orner, rspec/rspec-mocks#1309) - -### 3.9.0 / 2019-10-07 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.8.2...v3.9.0) - -Enhancements: - -* Improve thread safety of message expectations by using Mutex to prevent - deadlocking errors. (Ry Biesemeyer, rspec/rspec-mocks#1236) -* Add the ability to use `time` as an alias for `times`. For example: - `expect(Class).to receive(:method).exactly(1).time`. - (Pistos, Benoit Tigeot, rspec/rspec-mocks#1271) - -### 3.8.2 / 2019-10-02 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.8.1...v3.8.2) - -* Allow `array_including` argument matchers to be nested. - (Emmanuel Delmas, rspec/rspec-mocks#1291) - -### 3.8.1 / 2019-06-13 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.8.0...v3.8.1) - -Bug Fixes: - -* Ensure stubbing methods does not change their visibility. - (Kevin Boschert, rspec/rspec-mocks#1277) - -### 3.8.0 / 2018-08-04 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.7.0...v3.8.0) - -Bug Fixes: - -* Issue error when encountering invalid "counted" negative message expectations. - (Sergiy Yarinovskiy, rspec/rspec-mocks#1212) -* Ensure `allow_any_instance_of` and `expect_any_instance_of` can be temporarily - supressed. (Jon Rowe, rspec/rspec-mocks#1228) -* Ensure `expect_any_instance_of(double).to_not have_received(:some_method)` - fails gracefully (as its not supported) rather than issuing a `NoMethodError`. - (Maxim Krizhanovsky, rspec/rspec-mocks#1231) - -### 3.7.0 / 2017-10-17 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.6.0...v3.7.0) - -Enhancements: - -* Improve compatibility with `--enable-frozen-string-literal` option - on Ruby 2.3+. (Pat Allan, rspec/rspec-mocks#1165) - -Bug Fixes: - -* Fix `hash_including` and `hash_excluding` so that they work against - subclasses of `Hash`. (Aaron Rosenberg, rspec/rspec-mocks#1167) - -### 3.6.0 / 2017-05-04 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.6.0.beta2...v3.6.0) - -Bug Fixes: - -* Fix "instance variable @color not initialized" warning when using - rspec-mocks without rspec-core. (Myron Marston, rspec/rspec-mocks#1142) -* Restore aliased module methods properly when stubbing on 1.8.7. - (Samuel Giddins, rspec/rspec-mocks#1144) -* Allow a message chain expectation to be constrained by argument(s). - (Jon Rowe, rspec/rspec-mocks#1156) - -### 3.6.0.beta2 / 2016-12-12 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.6.0.beta1...v3.6.0.beta2) - -Enhancements: - -* Add new `without_partial_double_verification { }` API that lets you - temporarily turn off partial double verification for an example. - (Jon Rowe, rspec/rspec-mocks#1104) - -### 3.6.0.beta1 / 2016-10-09 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.5.0...v3.6.0.beta1) - -Bug Fixes: - -* Return the test double instance form `#freeze` (Alessandro Berardi, rspec/rspec-mocks#1109) -* Allow the special logic for stubbing `new` to work when `.method` has - been redefined. (Proby, rspec/rspec-mocks#1119) - -### 3.5.0 / 2016-07-01 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.5.0.beta4...v3.5.0) - -Enhancements: - -* Provides a nice string representation of - `RSpec::Mocks::MessageExpectation` (Myron Marston, rspec/rspec-mocks#1095) - -### 3.5.0.beta4 / 2016-06-05 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.5.0.beta3...v3.5.0.beta4) - -Enhancements: - -* Add `and_throw` to any instance handling. (Tobias Bühlmann, rspec/rspec-mocks#1068) - -### 3.5.0.beta3 / 2016-04-02 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.5.0.beta2...v3.5.0.beta3) - -Enhancements: - -* Issue warning when attempting to use unsupported - `allow(...).to receive(...).ordered`. (Jon Rowe, rspec/rspec-mocks#1000) -* Add `rspec/mocks/minitest_integration`, to properly integrate rspec-mocks - with minitest. (Myron Marston, rspec/rspec-mocks#1065) - -### 3.5.0.beta2 / 2016-03-10 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.5.0.beta1...v3.5.0.beta2) - -Enhancements: - -* Improve error message displayed when using `and_wrap_original` on pure test - doubles. (betesh, rspec/rspec-mocks#1063) - -Bug Fixes: - -* Fix issue that prevented `receive_message_chain(...).with(...)` working - correctly on "any instance" mocks. (Jon Rowe, rspec/rspec-mocks#1061) - -### 3.5.0.beta1 / 2016-02-06 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.4.1...v3.5.0.beta1) - -Bug Fixes: - -* Allow `any_instance_of(...).to receive(...)` to use `and_yield` multiple - times. (Kilian Cirera Sant, rspec/rspec-mocks#1054) -* Allow matchers which inherit from `rspec-mocks` matchers to be used for - `allow`. (Andrew Kozin, rspec/rspec-mocks#1056) -* Prevent stubbing `respond_to?` on partial doubles from causing infinite - recursion. (Jon Rowe, rspec/rspec-mocks#1013) -* Prevent aliased methods from disapearing after being mocked with - `any_instance` (regression from rspec/rspec-mocks#1043). (Joe Rafaniello, rspec/rspec-mocks#1060) - -### 3.4.1 / 2016-01-10 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.4.0...v3.4.1) - -Bug Fixes: - -* Fix `any_instance` to work properly on Ruby 2.3. (Joe Rafaniello, rspec/rspec-mocks#1043) - -### 3.4.0 / 2015-11-11 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.3.2...v3.4.0) - -Enhancements: - -* Make `expect(...).to have_received` work without relying upon - rspec-expectations. (Myron Marston, rspec/rspec-mocks#978) -* Add option for failing tests when expectations are set on `nil`. - (Liz Rush, rspec/rspec-mocks#983) - -Bug Fixes: - -* Fix `have_received { ... }` so that any block passed when the message - was received is forwarded to the `have_received` block. (Myron Marston, rspec/rspec-mocks#1006) -* Fix infinite loop in error generator when stubbing `respond_to?`. - (Alex Dowad, rspec/rspec-mocks#1022) -* Fix issue with using `receive` on subclasses (at a class level) with 1.8.7. - (Alex Dowad, rspec/rspec-mocks#1026) - -### 3.3.2 / 2015-07-15 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.3.1...v3.3.2) - -Bug Fixes: - -* Prevent thread deadlock errors during proxy creation (e.g. when using - `before_verifying_doubles` callbacks). (Jon Rowe, rspec/rspec-mocks#980, rspec/rspec-mocks#979) - -### 3.3.1 / 2015-06-19 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.3.0...v3.3.1) - -Bug Fixes: - -* Fix bug in `before_verifying_double` callback logic that caused it to be called - once for each class in the ancestor list when mocking or stubbing a class. Now - it is only called for the mocked or stubbed class, as you would expect. (Sam - Phippen, rspec/rspec-mocks#974) - -### 3.3.0 / 2015-06-12 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.2.1...v3.3.0) - -Enhancements: - -* When stubbing `new` on `MyClass` or `class_double(MyClass)`, use the - method signature from `MyClass#initialize` to verify arguments. - (Myron Marston, rspec/rspec-mocks#886) -* Use matcher descriptions when generating description of received arguments - for mock expectation failures. (Tim Wade, rspec/rspec-mocks#891) -* Avoid loading `stringio` unnecessarily. (Myron Marston, rspec/rspec-mocks#894) -* Verifying doubles failure messages now distinguish between class and instance - level methods. (Tim Wade, rspec/rspec-mocks#896, rspec/rspec-mocks#908) -* Improve mock expectation failure messages so that it combines both - number of times and the received arguments in the output. (John Ceh, rspec/rspec-mocks#918) -* Improve how test doubles are represented in failure messages. - (Siva Gollapalli, Myron Marston, rspec/rspec-mocks#932) -* Rename `RSpec::Mocks::Configuration#when_declaring_verifying_double` to - `RSpec::Mocks::Configuration#before_verifying_doubles` and utilise when - verifying partial doubles. (Jon Rowe, rspec/rspec-mocks#940) -* Use rspec-support's `ObjectFormatter` for improved formatting of - arguments in failure messages so that, for example, full time - precisions is displayed for time objects. (Gavin Miller, Myron Marston, rspec/rspec-mocks#955) - -Bug Fixes: - -* Ensure expectations that raise eagerly also raise during RSpec verification. - This means that if exceptions are caught inside test execution the test will - still fail. (Sam Phippen, rspec/rspec-mocks#884) -* Fix `have_received(msg).with(args).exactly(n).times` and - `receive(msg).with(args).exactly(n).times` failure messages - for when the message was received the wrong number of times with - the specified args, and also received additional times with other - arguments. Previously it confusingly listed the arguments as being - mis-matched (even when the double was allowed to receive with any - args) rather than listing the count. (John Ceh, rspec/rspec-mocks#918) -* Fix `any_args`/`anything` support so that we avoid calling `obj == anything` - on user objects that may have improperly implemented `==` in a way that - raises errors. (Myron Marston, rspec/rspec-mocks#924) -* Fix edge case involving stubbing the same method on a class and a subclass - which previously hit a `NoMethodError` internally in RSpec. (Myron Marston rspec/rspec-mocks#954) -* Fix edge case where the message received count would be incremented multiple - times for one failure. (Myron Marston, rspec/rspec-mocks#957) -* Fix failure messages for when spies received the expected message with - different arguments and also received another message. (Maurício Linhares, rspec/rspec-mocks#960) -* Silence whitespace-only diffs. (Myron Marston, rspec/rspec-mocks#969) - -### 3.2.1 / 2015-02-23 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.2.0...v3.2.1) - -Bug Fixes: - -* Add missing `rspec/support/differ` require so that rspec-mocks can be - used w/o rspec-expectations (which also loads the differ and hided the - fact we forgot to require it). (Myron Marston, rspec/rspec-mocks#893) -* Revert tracking of received arg mutation (added in 3.2.0 to provide an - error in a situation we can't support) as our implementation has side - effects on non-standard objects and there's no solution we could come - up with that always works. (Myron Marston, rspec/rspec-mocks#900) - -### 3.2.0 / 2015-02-03 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.1.3...v3.2.0) - -Enhancements: - -* Treat `any_args` as an arg splat, allowing it to match an arbitrary - number of args at any point in an arg list. (Myron Marston, rspec/rspec-mocks#786) -* Print diffs when arguments in mock expectations are mismatched. - (Sam Phippen, rspec/rspec-mocks#751) -* Support names for verified doubles (`instance_double`, `instance_spy`, - `class_double`, `class_spy`, `object_double`, `object_spy`). (Cezary - Baginski, rspec/rspec-mocks#826) -* Make `array_including` and `hash_including` argument matchers composable. - (Sam Phippen, rspec/rspec-mocks#819) -* Make `allow_any_instance_of(...).to receive(...).and_wrap_original` - work. (Ryan Fitzgerald, rspec/rspec-mocks#869) - -Bug Fixes: - -* Provide a clear error when users wrongly combine `no_args` with - additional arguments (e.g. `expect().to receive().with(no_args, 1)`). - (Myron Marston, rspec/rspec-mocks#786) -* Provide a clear error when users wrongly use `any_args` multiple times in the - same argument list (e.g. `expect().to receive().with(any_args, 1, any_args)`. - (Myron Marston, rspec/rspec-mocks#786) -* Prevent the error generator from using user object #description methods. - See [rspec/rspec-mocks#685](https://github.com/rspec/rspec-mocks/issues/685). - (Sam Phippen, rspec/rspec-mocks#751) -* Make verified doubles declared as `(instance|class)_double(SomeConst)` - work properly when `SomeConst` has previously been stubbed. - `(instance|class)_double("SomeClass")` already worked properly. - (Myron Marston, rspec/rspec-mocks#824) -* Add a matcher description for `receive`, `receive_messages` and - `receive_message_chain`. (Myron Marston, rspec/rspec-mocks#828) -* Validate invocation args for null object verified doubles. - (Myron Marston, rspec/rspec-mocks#829) -* Fix `RSpec::Mocks::Constant.original` when called with an invalid - constant to return an object indicating the constant name is invalid, - rather than blowing up. (Myron Marston, rspec/rspec-mocks#833) -* Make `extend RSpec::Mocks::ExampleMethods` on any object work properly - to add the rspec-mocks API to that object. Previously, `expect` would - be undefined. (Myron Marston, rspec/rspec-mocks#846) -* Fix `require 'rspec/mocks/standalone'` so that it only affects `main` - and not every object. It's really only intended to be used in a REPL - like IRB, but some gems have loaded it, thinking it needs to be loaded - when using rspec-mocks outside the context of rspec-core. - (Myron Marston, rspec/rspec-mocks#846) -* Prevent message expectations from being modified by customization methods - (e.g. `with`) after they have been invoked. (Sam Phippen and Melanie Gilman, rspec/rspec-mocks#837) -* Handle cases where a method stub cannot be removed due to something - external to RSpec monkeying with the method definition. This can - happen, for example, when you `file.reopen(io)` after previously - stubbing a method on the `file` object. (Myron Marston, rspec/rspec-mocks#853) -* Provide a clear error when received message args are mutated before - a `have_received(...).with(...)` expectation. (Myron Marston, rspec/rspec-mocks#868) - -### 3.1.3 / 2014-10-08 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.1.2...v3.1.3) - -Bug Fixes: - -* Correct received messages count when used with `have_received` matcher. - (Jon Rowe, rspec/rspec-mocks#793) -* Provide a clear error message when you use `allow_any_instance_of(...)` or - `expect_any_instance_of(...)` with the `have_received` matcher (they are - not intended to be used together and previously caused an odd internal - failure in rspec-mocks). (Jon Rowe, rspec/rspec-mocks#799). -* Fix verified double `with` verification so that it applies to method - stubs. (Myron Marston, rspec/rspec-mocks#790) - -### 3.1.2 / 2014-09-26 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.1.1...v3.1.2) - -Bug Fixes: - -* Provide a clear error message when you use `allow(...)` with the - `have_received` matcher (they are not intended to be used together - and previously caused an odd internal failure in rspec-mocks). (Jon Rowe, rspec/rspec-mocks#788). - -### 3.1.1 / 2014-09-18 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.1.0...v3.1.1) - -Bug Fixes: - -* Prevent included modules being detected as prepended modules on Ruby 2.0 - when using `any_instance_of(...)`. (Tony Novak, rspec/rspec-mocks#781) - -### 3.1.0 / 2014-09-04 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.4...v3.1.0) - -Enhancements: - -* Add spying methods (`spy`, `ìnstance_spy`, `class_spy` and `object_spy`) - which create doubles as null objects for use with spying in testing. (Sam - Phippen, rspec/rspec-mocks#671) -* `have_received` matcher will raise "does not implement" errors correctly when - used with verifying doubles and partial doubles. (Xavier Shay, rspec/rspec-mocks#722) -* Allow matchers to be used in place of keyword arguments in `with` - expectations. (Xavier Shay, rspec/rspec-mocks#726) -* Add `thrice` modifier to message expectation interface as a synonym - for `exactly(3).times`. (Dennis Taylor, rspec/rspec-mocks#753) -* Add more `thrice` synonyms e.g. `.at_least(:thrice)`, `.at_most(:thrice)`, - `receive(...).thrice` and `have_received(...).thrice`. (Jon Rowe, rspec/rspec-mocks#754) -* Add `and_wrap_original` modifier for partial doubles to mutate the - response from a method. (Jon Rowe, rspec/rspec-mocks#762) - -Bug Fixes: - -* Remove `any_number_of_times` from `any_instance` recorders that were - erroneously causing mention of the method in documentation. (Jon Rowe, rspec/rspec-mocks#760) -* Prevent included modules being detected as prepended modules on Ruby 2.0. - (Eugene Kenny, rspec/rspec-mocks#771) - -### 3.0.4 / 2014-08-14 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.3...v3.0.4) - -Bug Fixes: - -* Restore `kind_of(x)` to match using `arg.kind_of?(x)` (like RSpec 2) - rather than `x === arg`. (Jon Rowe, rspec/rspec-mocks#750) - -### 3.0.3 / 2014-07-21 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.2...v3.0.3) - -Bug Fixes: - -* `have_received` matcher will raise "does not implement" errors correctly when - used with verifying doubles and partial doubles. (Xavier Shay, rspec/rspec-mocks#722) -* Make `double.as_null_object.dup` and `double.as_null_object.clone` - make the copies be null objects. (Myron Marston, rspec/rspec-mocks#732) -* Don't inadvertently define `BasicObject` in 1.8.7. (Chris Griego, rspec/rspec-mocks#739) - -### 3.0.2 / 2014-06-19 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.1...v3.0.2) - -Bug Fixes: - -* Fix edge case that triggered "can't add a new key into hash during - iteration" during mock verification. (Sam Phippen, Myron Marston, rspec/rspec-mocks#711) -* Fix verifying doubles so that when they accidentally leak into another - example, they provide the same clear error message that normal doubles - do. (Myron Marston, rspec/rspec-mocks#718) -* Make `ordered` work with exact receive counts. (Sam Phippen, rspec/rspec-mocks#713) - -### 3.0.1 / 2014-06-07 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.0...v3.0.1) - -Bug Fixes: - -* Fix `receive_message_chain(...)` so that it supports `with` just like - `stub_chain` did. (Jon Rowe, rspec/rspec-mocks#697) -* Fix regression in `expect_any_instance_of` so that it expects the - message on _any_ instance rather than on _every_ instance. - (Myron Marston, rspec/rspec-mocks#699) - -### 3.0.0 / 2014-06-01 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.0.rc1...v3.0.0) - -Bug Fixes: - -* Fix module prepend detection to work properly on ruby 2.0 for a case - where a module is extended onto itself. (Myron Marston) -* Fix `transfer_nested_constants` option so that transferred constants - get properly reset at the end of the example. (Myron Marston) -* Fix `config.transfer_nested_constants = true` so that you don't - erroneously get errors when stubbing a constant that is not a module - or a class. (Myron Marston) -* Fix regression that caused `double(:class => SomeClass)` to later - trigger infinite recursion. (Myron Marston) -* Fix bug in `have_received(...).with(...).ordered` where it was not - taking the args into account when checking the order. (Myron Marston) -* Fix bug in `have_received(...).ordered` where it was wrongly - considering stubs when checking the order. (Myron Marston) -* Message expectation matchers now show descriptions from argument - matchers when their expectations aren't met. (Jon Rowe) -* Display warning when encountering `TypeError` during instance method - staging on 2.0.0-p195, suffers from https://bugs.ruby-lang.org/issues/8686 - too. (Cezar Halmagean). - -### 3.0.0.rc1 / 2014-05-18 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.0.beta2...v3.0.0.rc1) - -Breaking Changes for 3.0.0: - -* Remove `RSpec::Mocks::TestDouble.extend_onto`. (Myron Marston) -* Remove `RSpec::Mocks::ConstantStubber`. (Jon Rowe) -* Make monkey-patch of Marshal to support dumping of stubbed objects opt-in. - (Xavier Shay) - -Enhancements: - -* Instead of crashing when cleaning up stub methods on a frozen object, it now - issues a warning explaining that it's impossible to clean up the stubs. - (Justin Coyne and Sam Phippen) -* Add meaningful descriptions to `anything`, `duck_type` and `instance_of` argument - matchers. (Jon Rowe) - -Bug Fixes: - -* Fix regression introduced in 3.0.0.beta2 that caused - `double.as_null_object.to_str` to return the double rather - than a string. (Myron Marston) -* Fix bug in `expect(dbl).to receive_message_chain(:foo, :bar)` where it was - not setting an expectation for the last message in the chain. - (Jonathan del Strother) -* Allow verifying partial doubles to have private methods stubbed. (Xavier Shay) -* Fix bug with allowing/expecting messages on Class objects which have had - their singleton class prepended to. (Jon Rowe) -* Fix an issue with 1.8.7 not running implementation blocks on partial doubles. - (Maurício Linhares) -* Prevent `StackLevelTooDeep` errors when stubbing an `any_instance` method that's - accessed in `inspect` by providing our own inspect output. (Jon Rowe) -* Fix bug in `any_instance` logic that did not allow you to mock or stub - private methods if `verify_partial_doubles` was configured. (Oren Dobzinski) -* Include useful error message when trying to observe an unimplemented method - on an any instance. (Xavier Shay) -* Fix `and_call_original` to work properly when multiple classes in an - inheritance hierarchy have been stubbed with the same method. (Myron Marston) -* Fix `any_instance` so that it updates existing instances that have - already been stubbed. (Myron Marston) -* Fix verified doubles so that their class name is included in failure - messages. (Myron Marston) -* Fix `expect_any_instance_of` so that when the message is received - on an individual instance that has been directly stubbed, it still - satisfies the expectation. (Sam Phippen, Myron Marston) -* Explicitly disallow using `any_instance` to mock or stub a method - that is defined on a module prepended onto the class. This triggered - `SystemStackError` before and is very hard to support so we are not - supporting it at this time. (Myron Marston) - -### 3.0.0.beta2 / 2014-02-17 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.0.beta1...v3.0.0.beta2) - -Breaking Changes for 3.0.0: - -* Rename `RSpec::Mocks::Mock` to `RSpec::Mocks::Double`. (Myron Marston) -* Change how to integrate rspec-mocks in other test frameworks. You now - need to include `RSpec::Mocks::ExampleMethods` in your test context. - (Myron Marston) -* Prevent RSpec mocks' doubles and partial doubles from being used outside of - the per-test lifecycle (e.g. from a `before(:all)` hook). (Sam Phippen) -* Remove the `host` argument of `RSpec::Mocks.setup`. Instead - `RSpec::Mocks::ExampleMethods` should be included directly in the scope where - RSpec's mocking capabilities are used. (Sam Phippen) -* Make test doubles raise errors if you attempt to use them after they - get reset, to help surface issues when you accidentally retain - references to test doubles and attempt to reuse them in another - example. (Myron Marston) -* Remove support for `and_return { value }` and `and_return` without arguments. (Yuji Nakayama) - -Enhancements: - -* Add `receive_message_chain` which provides the functionality of the old - `stub_chain` for the new allow/expect syntax. Use it like so: `allow(...).to - receive_message_chain(:foo, :bar, :bazz)`. (Sam Phippen). -* Change argument matchers to use `===` as their primary matching - protocol, since their semantics mirror that of a case or rescue statement - (which uses `===` for matching). (Myron Marston) -* Add `RSpec::Mocks.with_temporary_scope`, which allows you to create - temporary rspec-mocks scopes in arbitrary places (such as a - `before(:all)` hook). (Myron Marston) -* Support keyword arguments when checking arity with verifying doubles. - (Xavier Shay) - -Bug Fixes: - -* Fix regression in 3.0.0.beta1 that caused `double("string_name" => :value)` - to stop working. (Xavier Shay) -* Fix the way rspec-mocks and rspec-core interact so that if users - define a `let` with the same name as one of the methods - from `RSpec::Mocks::ArgumentMatchers`, the user's `let` takes - precedence. (Michi Huber, Myron Marston) -* Fix verified doubles so that their methods match the visibility - (public, protected or private) of the interface they verify - against. (Myron Marston) -* Fix verified null object doubles so that they do not wrongly - report that they respond to anything. They only respond to methods - available on the interface they verify against. (Myron Marston) -* Fix deprecation warning for use of old `:should` syntax w/o explicit - config so that it no longer is silenced by an extension gem such - as rspec-rails when it calls `config.add_stub_and_should_receive_to`. - (Sam Phippen) -* Fix `expect` syntax so that it does not wrongly emit a "You're - overriding a previous implementation for this stub" warning when - you are not actually doing that. (Myron Marston) -* Fix `any_instance.unstub` when used on sub classes for whom the super - class has had `any_instance.stub` invoked on. (Jon Rowe) -* Fix regression in `stub_chain`/`receive_message_chain` that caused - it to raise an `ArgumentError` when passing args to the stubbed - methods. (Sam Phippen) -* Correct stub of undefined parent modules all the way down when stubbing a - nested constant. (Xavier Shay) -* Raise `VerifyingDoubleNotDefinedError` when a constant is not defined for - a verifying class double. (Maurício Linhares) -* Remove `Double#to_str`, which caused confusing `raise some_double` - behavior. (Maurício Linhares) - -### 3.0.0.beta1 / 2013-11-07 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.4...v3.0.0.beta1) - -Breaking Changes for 3.0.0: - -* Raise an explicit error if `should_not_receive(...).and_return` is used. (Sam - Phippen) -* Remove 1.8.6 workarounds. (Jon Rowe) -* Remove `stub!` and `unstub!`. (Sam Phippen) -* Remove `mock(name, methods)` and `stub(name, methods)`, leaving - `double(name, methods)` for creating test doubles. (Sam Phippen, Michi Huber) -* Remove `any_number_of_times` since `should_receive(:msg).any_number_of_times` - is really a stub in a mock's clothing. (Sam Phippen) -* Remove support for re-using the same null-object test double in multiple - examples. Test doubles are designed to only live for one example. - (Myron Marston) -* Make `at_least(0)` raise an error. (Sam Phippen) -* Remove support for `require 'spec/mocks'` which had been kept - in place for backwards compatibility with RSpec 1. (Myron Marston) -* Blocks provided to `with` are always used as implementation. (Xavier Shay) -* The config option (added in 2.99) to yield the receiver to - `any_instance` implementation blocks now defaults to "on". (Sam Phippen) - -Enhancements: - -* Allow the `have_received` matcher to use a block to set further expectations - on arguments. (Tim Cowlishaw) -* Provide `instance_double` and `class_double` to create verifying doubles, - ported from `rspec-fire`. (Xavier Shay) -* `as_null_object` on a verifying double only responds to defined methods. - (Xavier Shay) -* Provide `object_double` to create verified doubles of specific object - instances. (Xavier Shay) -* Provide `verify_partial_doubles` configuration that provides `object_double` - like verification behaviour on partial doubles. (Xavier Shay) -* Improved performance of double creation, particularly those with many - attributes. (Xavier Shay) -* Default value of `transfer_nested_constants` option for constant stubbing can - be configured. (Xavier Shay) -* Messages can be allowed or expected on in bulk via - `receive_messages(:message => :value)`. (Jon Rowe) -* `allow(Klass.any_instance)` and `expect(Klass.any_instance)` now print a - warning. This is usually a mistake, and users usually want - `allow_any_instance_of` or `expect_any_instance_of` instead. (Sam Phippen) -* `instance_double` and `class_double` raise `ArgumentError` if the underlying - module is loaded and the arity of the method being invoked does not match the - arity of the method as it is actually implemented. (Andy Lindeman) -* Spies can now check their invocation ordering is correct. (Jon Rowe) - -Deprecations: - -* Using the old `:should` syntax without explicitly configuring it - is deprecated. It will continue to work but will emit a deprecation - warning in RSpec 3 if you do not explicitly enable it. (Sam Phippen) - -Bug Fixes: - -* Fix `and_call_original` to handle a complex edge case involving - singleton class ancestors. (Marc-André Lafortune, Myron Marston) -* When generating an error message for unexpected arguments, - use `#inspect` rather than `#description` if `#description` - returns `nil` or `''` so that you still get a useful message. - (Nick DeLuca) - -### 2.99.4 / 2015-06-19 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.3...v2.99.4) - -Bug Fixes: - -* Add missing deprecation for using `with` with no arguments e.g. `with()`. (Yousuke, rspec/rspec-mocks#970) - -### 2.99.3 / 2015-01-09 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.2...v2.99.3) - -Bug Fixes: - -* Fix regression that caused an error when a test double was deserialized from YAML. (Yuji Nakayama, rspec/rspec-mocks#777) - -### 2.99.2 / 2014-07-21 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.1...v2.99.2) - -Enhancements: - -* Warn about upcoming change to `#===` matching and `DateTime#===` behaviour. - (Jon Rowe, rspec/rspec-mocks#735) - -### 2.99.1 / 2014-06-12 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0...v2.99.1) - -Bug Fixes: - -* Fix bug that caused errors at the end of each example - when a `double.as_null_object` had been frozen. (Yuji Nakayama, rspec/rspec-mocks#698) - -Deprecations: - -* Deprecate freezing a test double. (Yuji Nakayama, rspec/rspec-mocks#698) - -### 2.99.0 / 2014-06-01 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0.rc1...v2.99.0) - -No changes. Just taking it out of pre-release. - -### 2.99.0.rc1 / 2014-05-18 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0.beta2...v2.99.0.rc1) - -Deprecations: - -* Deprecate `RSpec::Mocks::TestDouble.extend_onto`. (Myron Marston) -* Deprecate `RSpec::Mocks::ConstantStubber`. (Jon Rowe) -* Deprecate `Marshal.dump` monkey-patch without opt-in. (Xavier Shay) - -### 2.99.0.beta2 / 2014-02-17 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0.beta1...v2.99.0.beta2) - -Deprecations: - -* Deprecate `RSpec::Mocks::Mock` in favor of `RSpec::Mocks::Double`. - (Myron Marston) -* Deprecate the `host` argument of `RSpec::Mocks.setup`. Instead - `RSpec::Mocks::ExampleMethods` should be included directly in the scope where - RSpec's mocking capabilities are used. (Sam Phippen) -* Deprecate using any of rspec-mocks' features outside the per-test - lifecycle (e.g. from a `before(:all)` hook). (Myron Marston) -* Deprecate re-using a test double in another example. (Myron Marston) -* Deprecate `and_return { value }` and `and_return` without arguments. (Yuji Nakayama) - -### 2.99.0.beta1 / 2013-11-07 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.4...v2.99.0.beta1) - -Deprecations - -* Expecting to use lambdas or other strong arity implementations for stub - methods with mis-matched arity is deprecated and support for them will be - removed in 3.0. Either provide the right amount of arguments or use a weak - arity implementation (methods with splats or procs). (Jon Rowe) -* Using the same test double instance in multiple examples is deprecated. Test - doubles are only meant to live for one example. The mocks and stubs have - always been reset between examples; however, in 2.x the `as_null_object` - state was not reset and some users relied on this to have a null object - double that is used for many examples. This behavior will be removed in 3.0. - (Myron Marston) -* Print a detailed warning when an `any_instance` implementation block is used - when the new `yield_receiver_to_any_instance_implementation_blocks` config - option is not explicitly set, as RSpec 3.0 will default to enabling this new - feature. (Sam Phippen) - -Enhancements: - -* Add a config option to yield the receiver to `any_instance` implementation - blocks. (Sam Phippen) - -### 2.14.6 / 2014-02-20 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.5...v2.14.6) - -Bug Fixes: - -* Ensure `any_instance` method stubs and expectations are torn down regardless of - expectation failures. (Sam Phippen) - -### 2.14.5 / 2014-02-01 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.4...v2.14.5) - -Bug Fixes: - -* Fix regression that caused block implementations to not receive all - args on 1.8.7 if the block also receives a block, due to Proc#arity - reporting `1` no matter how many args the block receives if it - receives a block, too. (Myron Marston) - -### 2.14.4 / 2013-10-15 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.3...v2.14.4) - -Bug Fixes: - -* Fix issue where unstubing methods on "any instances" would not - remove stubs on existing instances (Jon Rowe) -* Fix issue with receive(:message) do ... end precedence preventing - the usage of modifications (`and_return` etc) (Jon Rowe) - -### 2.14.3 / 2013-08-08 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.2...v2.14.3) - -Bug Fixes: - -* Fix stubbing some instance methods for classes whose hierarchy includes - a prepended Module (Bradley Schaefer) - -### 2.14.2 / 2013-07-30 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.1...v2.14.2) - -Bug Fixes: - -* Fix `as_null_object` doubles so that they return `nil` from `to_ary` - (Jon Rowe). -* Fix regression in 2.14 that made `stub!` (with an implicit receiver) - return a test double rather than stub a method (Myron Marston). - -### 2.14.1 / 2013-07-07 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.0...v2.14.1) - -Bug Fixes: - -* Restore `double.as_null_object` behavior from 2.13 and earlier: a - double's nullness persisted between examples in earlier examples. - While this is not an intended use case (test doubles are meant to live - for only one example), we don't want to break behavior users rely - on in a minor relase. This will be deprecated in 2.99 and removed - in 3.0. (Myron Marston) - -### 2.14.0 / 2013-07-06 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.0.rc1...v2.14.0) - -Enhancements: - -* Document test spies in the readme. (Adarsh Pandit) -* Add an `array_including` matcher. (Sam Phippen) -* Add a syntax-agnostic API for mocking or stubbing a method. This is - intended for use by libraries such as rspec-rails that need to mock - or stub a method, and work regardless of the syntax the user has - configured (Paul Annesley, Myron Marston and Sam Phippen). - -Bug Fixes: - -* Fix `double` so that it sets up passed stubs correctly regardless of - the configured syntax (Paul Annesley). -* Allow a block implementation to be used in combination with - `and_yield`, `and_raise`, `and_return` or `and_throw`. This got fixed - in 2.13.1 but failed to get merged into master for the 2.14.0.rc1 - release (Myron Marston). -* `Marshal.dump` does not unnecessarily duplicate objects when rspec-mocks has - not been fully initialized. This could cause errors when using `spork` or - similar preloading gems (Andy Lindeman). - -### 2.14.0.rc1 / 2013-05-27 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.13.0...v2.14.0.rc1) - -Enhancements: - -* Refactor internals so that the mock proxy methods and state are held - outside of the mocked object rather than inside it. This paves the way - for future syntax enhancements and removes the need for some hacky - work arounds for `any_instance` dup'ing and `YAML` serialization, - among other things. Note that the code now relies upon `__id__` - returning a unique, consistent value for any object you want to - mock or stub (Myron Marston). -* Add support for test spies. This allows you to verify a message - was received afterwards using the `have_received` matcher. - Note that you must first stub the method or use a null double. - (Joe Ferris and Joël Quenneville) -* Make `at_least` and `at_most` style receive expectations print that they were - expecting at least or at most some number of calls, rather than just the - number of calls given in the expectation (Sam Phippen) -* Make `with` style receive expectations print the args they were expecting, and - the args that they got (Sam Phippen) -* Fix some warnings seen under ruby 2.0.0p0 (Sam Phippen). -* Add a new `:expect` syntax for message expectations - (Myron Marston and Sam Phippen). - -Bug fixes - -* Fix `any_instance` so that a frozen object can be `dup`'d when methods - have been stubbed on that type using `any_instance` (Jon Rowe). -* Fix `and_call_original` so that it properly raises an `ArgumentError` - when the wrong number of args are passed (Jon Rowe). -* Fix `double` on 1.9.2 so you can wrap them in an Array - using `Array(my_double)` (Jon Rowe). -* Fix `stub_const` and `hide_const` to handle constants that redefine `send` - (Sam Phippen). -* Fix `Marshal.dump` extension so that it correctly handles nil. - (Luke Imhoff, Jon Rowe) -* Fix isolation of `allow_message_expectations_on_nil` (Jon Rowe) -* Use inspect to format actual arguments on expectations in failure messages (rspec/rspec-mocks#280, Ben Langfeld) -* Protect against improperly initialised test doubles (rspec/rspec-mocks#293) (Joseph Shraibman and Jon Rowe) - -Deprecations - -* Deprecate `stub` and `mock` as aliases for `double`. `double` is the - best term for creating a test double, and it reduces confusion to - have only one term (Michi Huber). -* Deprecate `stub!` and `unstub!` in favor of `stub` and `unstub` - (Jon Rowe). -* Deprecate `at_least(0).times` and `any_number_of_times` (Michi Huber). - -### 2.13.1 / 2013-04-06 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.13.0...v2.13.1) - -Bug fixes - -* Allow a block implementation to be used in combination with - `and_yield`, `and_raise`, `and_return` or `and_throw` (Myron Marston). - -### 2.13.0 / 2013-02-23 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.12.2...v2.13.0) - -Bug fixes - -* Fix bug that caused weird behavior when a method that had - previously been stubbed with multiple return values (e.g. - `obj.stub(:foo).and_return(1, 2)`) was later mocked with a - single return value (e.g. `obj.should_receive(:foo).once.and_return(1)`). - (Myron Marston) -* Fix bug related to a mock expectation for a method that already had - multiple stubs with different `with` constraints. Previously, the - first stub was used, even though it may not have matched the passed - args. The fix defers this decision until the message is received so - that the proper stub response can be chosen based on the passed - arguments (Myron Marston). -* Do not call `nil?` extra times on a mocked object, in case `nil?` - itself is expected a set number of times (Myron Marston). -* Fix `missing_default_stub_error` message so array args are handled - properly (Myron Marston). -* Explicitly disallow `any_instance.unstub!` (Ryan Jones). -* Fix `any_instance` stubbing so that it works with `Delegator` - subclasses (Myron Marston). -* Fix `and_call_original` so that it works with `Delegator` subclasses - (Myron Marston). -* Fix `any_instance.should_not_receive` when `any_instance.should_receive` - is used on the same class in the same example. Previously it would - wrongly report a failure even when the message was not received - (Myron Marston). - -### 2.12.2 / 2013-01-27 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.12.1...v.2.12.2) - -Bug fixes - -* Fix `and_call_original` to work properly for methods defined - on a module extended onto an object instance (Myron Marston). -* Fix `stub_const` with an undefined constnat name to work properly - with constant strings that are prefixed with `::` -- and edge case - I missed in the bug fix in the 2.12.1 release (Myron Marston). -* Ensure method visibility on a partial mock is restored after reseting - method stubs, even on a singleton module (created via `extend self`) - when the method visibility differs between the instance and singleton - versions (Andy Lindeman). - -### 2.12.1 / 2012-12-21 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.12.0...v2.12.1) - -Bug fixes - -* Fix `any_instance` to support `and_call_original`. - (Myron Marston) -* Properly restore stubbed aliased methods on rubies - that report the incorrect owner (Myron Marston and Andy Lindeman). -* Fix `hide_const` and `stub_const` with a defined constnat name to - work properly with constant strings that are prefixed with `::` (Myron Marston). - -### 2.12.0 / 2012-11-12 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.11.3...v2.12.0) - -Enhancements - -* `and_raise` can accept an exception class and message, more closely - matching `Kernel#raise` (e.g., `foo.stub(:bar).and_raise(RuntimeError, "message")`) - (Bas Vodde) -* Add `and_call_original`, which will delegate the message to the - original method (Myron Marston). - -Deprecations: - -* Add deprecation warning when using `and_return` with `should_not_receive` - (Neha Kumari) - -### 2.11.3 / 2012-09-19 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.11.2...v2.11.3) - -Bug fixes - -* Fix `:transfer_nested_constants` option of `stub_const` so that it - doesn't blow up when there are inherited constants. (Myron Marston) -* `any_instance` stubs can be used on classes that override `Object#method`. - (Andy Lindeman) -* Methods stubbed with `any_instance` are unstubbed after the test finishes. - (Andy Lindeman) -* Fix confusing error message when calling a mocked class method an - extra time with the wrong arguments (Myron Marston). - -### 2.11.2 / 2012-08-11 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.11.1...v2.11.2) - -Bug fixes - -* Don't modify `dup` on classes that don't support `dup` (David Chelimsky) -* Fix `any_instance` so that it works properly with methods defined on - a superclass. (Daniel Eguzkiza) -* Fix `stub_const` so that it works properly for nested constants that - share a name with a top-level constant (e.g. "MyGem::Hash"). (Myron - Marston) - -### 2.11.1 / 2012-07-09 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.11.0...v2.11.1) - -Bug fixes - -* Fix `should_receive` so that when it is called on an `as_null_object` - double with no implementation, and there is a previous explicit stub - for the same method, the explicit stub remains (rather than being - overridden with the null object implementation--`return self`). (Myron - Marston) - -### 2.11.0 / 2012-07-07 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.10.1...v2.11.0) - -Enhancements - -* Expose ArgumentListMatcher as a formal API - * supports use by 3rd party mock frameworks like Surrogate -* Add `stub_const` API to stub constants for the duration of an - example (Myron Marston). - -Bug fixes - -* Fix regression of edge case behavior. `double.should_receive(:foo) { a }` - was causing a NoMethodError when `double.stub(:foo).and_return(a, b)` - had been setup before (Myron Marston). -* Infinite loop generated by using `any_instance` and `dup`. (Sidu Ponnappa @kaiwren) -* `double.should_receive(:foo).at_least(:once).and_return(a)` always returns a - even if `:foo` is already stubbed. -* Prevent infinite loop when interpolating a null double into a string - as an integer (`"%i" % double.as_null_object`). (Myron Marston) -* Fix `should_receive` so that null object behavior (e.g. returning - self) is preserved if no implementation is given (Myron Marston). -* Fix `and_raise` so that it raises `RuntimeError` rather than - `Exception` by default, just like ruby does. (Andrew Marshall) - -### 2.10.1 / 2012-05-05 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.10.0...v2.10.1) - -Bug fixes - -* fix regression of edge case behavior - (https://github.com/rspec/rspec-mocks/issues/132) - * fixed failure of `object.should_receive(:message).at_least(0).times.and_return value` - * fixed failure of `object.should_not_receive(:message).and_return value` - -### 2.10.0 / 2012-05-03 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.9.0...v2.10.0) - -Bug fixes - -* fail fast when an `exactly` or `at_most` expectation is exceeded - -### 2.9.0 / 2012-03-17 -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.8.0...v2.9.0) - -Enhancements - -* Support order constraints across objects (preethiramdev) - -Bug fixes - -* Allow a `as_null_object` to be passed to `with` -* Pass proc to block passed to stub (Aubrey Rhodes) -* Initialize child message expectation args to match any args (rspec/rspec-mocks#109 - - preethiramdev) - -### 2.8.0 / 2012-01-04 - -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.8.0.rc2...v2.8.0) - -No changes for this release. Just releasing with the other rspec gems. - -### 2.8.0.rc2 / 2011-12-19 - -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.8.0.rc1...v2.8.0.rc2) - -No changes for this release. Just releasing with the other rspec gems. - -### 2.8.0.rc1 / 2011-11-06 - -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.7.0...v2.8.0.rc1) - -Enhancements - -* Eliminate Ruby warnings (Matijs van Zuijlen) - -### 2.7.0 / 2011-10-16 - -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.6.0...v2.7.0) - -Enhancements - -* Use `__send__` rather than `send` (alextk) -* Add support for `any_instance.stub_chain` (Sidu Ponnappa) -* Add support for `any_instance` argument matching based on `with` (Sidu - Ponnappa and Andy Lindeman) - -Changes - -* Check for `failure_message_for_should` or `failure_message` instead of - `description` to detect a matcher (Tibor Claassen) - -Bug fixes - -* pass a hash to `any_instance.stub`. (Justin Ko) -* allow `to_ary` to be called without raising `NoMethodError` (Mikhail - Dieterle) -* `any_instance` properly restores private methods (Sidu Ponnappa) - -### 2.6.0 / 2011-05-12 - -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.5.0...v2.6.0) - -Enhancements - -* Add support for `any_instance.stub` and `any_instance.should_receive` (Sidu - Ponnappa and Andy Lindeman) - -Bug fixes - -* fix bug in which multiple chains with shared messages ending in hashes failed - to return the correct value - -### 2.5.0 / 2011-02-05 - -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.4.0...v2.5.0) - -Bug fixes - -* message expectation counts now work in combination with a stub (Damian - Nurzynski) -* fix failure message when message received with incorrect args (Josep M. - Bach) - -### 2.4.0 / 2011-01-02 - -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.3.0...v2.4.0) - -No functional changes in this release, which was made to align with the -rspec-core-2.4.0 release. - -### 2.3.0 / 2010-12-12 - -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.2.0...v2.3.0) - -Bug fixes - -* Fix our Marshal extension so that it does not interfere with objects that - have their own `@mock_proxy` instance variable. (Myron Marston) - -### 2.2.0 / 2010-11-28 - -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.1.0...v2.2.0) - -Enhancements - -* Added "rspec/mocks/standalone" for exploring the rspec-mocks in irb. - -Bug fix - -* Eliminate warning on splat args without parens (Gioele Barabucci) -* Fix bug where `obj.should_receive(:foo).with(stub.as_null_object)` would pass - with a false positive. - -### 2.1.0 / 2010-11-07 - -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.0.1...v2.1.0) - -Bug fixes - -* Fix serialization of stubbed object (Josep M Bach) - -### 2.0.0 / 2010-10-10 - -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.0.0.beta.22...v2.0.0) - -### 2.0.0.rc / 2010-10-05 - -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.0.0.beta.22...v2.0.0.rc) - -Enhancements - -* support passing a block to an expectation block (Nicolas Braem) - * `obj.should_receive(:msg) {|&block| ... }` - -Bug fixes - -* Fix YAML serialization of stub (Myron Marston) -* Fix rdoc rake task (Hans de Graaff) - -### 2.0.0.beta.22 / 2010-09-12 - -[Full Changelog](http://github.com/rspec/rspec-mocks/compare/v2.0.0.beta.20...v2.0.0.beta.22) - -Bug fixes - -* fixed regression that broke `obj.stub_chain(:a, :b => :c)` -* fixed regression that broke `obj.stub_chain(:a, :b) { :c }` -* `respond_to?` always returns true when using `as_null_object` diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/LICENSE.md b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/LICENSE.md deleted file mode 100644 index dae02d8..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/LICENSE.md +++ /dev/null @@ -1,25 +0,0 @@ -The MIT License (MIT) -===================== - -* Copyright © 2012 David Chelimsky, Myron Marston -* Copyright © 2006 David Chelimsky, The RSpec Development Team -* Copyright © 2005 Steven Baker - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/README.md b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/README.md deleted file mode 100644 index e569fee..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/README.md +++ /dev/null @@ -1,465 +0,0 @@ -# RSpec Mocks [![Build Status](https://github.com/rspec/rspec-mocks/workflows/RSpec%20CI/badge.svg)](https://github.com/rspec/rspec-mocks/actions) [![Code Climate](https://codeclimate.com/github/rspec/rspec-mocks.svg)](https://codeclimate.com/github/rspec/rspec-mocks) -rspec-mocks is a test-double framework for rspec with support for method stubs, -fakes, and message expectations on generated test-doubles and real objects -alike. - -## Install - - gem install rspec # for rspec-core, rspec-expectations, rspec-mocks - gem install rspec-mocks # for rspec-mocks only - -Want to run against the `main` branch? You'll need to include the dependent -RSpec repos as well. Add the following to your `Gemfile`: - -```ruby -%w[rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib| - gem lib, :git => "https://github.com/rspec/#{lib}.git", :branch => 'main' -end -``` -## Contributing - -Once you've set up the environment, you'll need to cd into the working -directory of whichever repo you want to work in. From there you can run the -specs and cucumber features, and make patches. - -NOTE: You do not need to use rspec-dev to work on a specific RSpec repo. You -can treat each RSpec repo as an independent project. - -For information about contributing to RSpec, please refer to the following markdown files: -* [Build details](BUILD_DETAIL.md) -* [Code of Conduct](CODE_OF_CONDUCT.md) -* [Detailed contributing guide](CONTRIBUTING.md) -* [Development setup guide](DEVELOPMENT.md) - -## Test Doubles - -A test double is an object that stands in for another object in your system -during a code example. Use the `double` method, passing in an optional identifier, to create one: - -```ruby -book = double("book") -``` - -Most of the time you will want some confidence that your doubles resemble an -existing object in your system. Verifying doubles are provided for this -purpose. If the existing object is available, they will prevent you from adding -stubs and expectations for methods that do not exist or that have an invalid -number of parameters. - -```ruby -book = instance_double("Book", :pages => 250) -``` - -Verifying doubles have some clever tricks to enable you to both test in -isolation without your dependencies loaded while still being able to validate -them against real objects. More detail is available in [their -documentation](https://github.com/rspec/rspec-mocks/blob/main/features/verifying_doubles). - -Verifying doubles can also accept custom identifiers, just like double(), e.g.: - -```ruby -books = [] -books << instance_double("Book", :rspec_book, :pages => 250) -books << instance_double("Book", "(Untitled)", :pages => 5000) - -puts books.inspect # with names, it's clearer which were actually added -``` - -## Method Stubs - -A method stub is an implementation that returns a pre-determined value. Method -stubs can be declared on test doubles or real objects using the same syntax. -rspec-mocks supports 3 forms for declaring method stubs: - -```ruby -allow(book).to receive(:title) { "The RSpec Book" } -allow(book).to receive(:title).and_return("The RSpec Book") -allow(book).to receive_messages( - :title => "The RSpec Book", - :subtitle => "Behaviour-Driven Development with RSpec, Cucumber, and Friends") -``` - -You can also use this shortcut, which creates a test double and declares a -method stub in one statement: - -```ruby -book = double("book", :title => "The RSpec Book") -``` - -The first argument is a name, which is used for documentation and appears in -failure messages. If you don't care about the name, you can leave it out, -making the combined instantiation/stub declaration very terse: - -```ruby -double(:foo => 'bar') -``` - -This is particularly nice when providing a list of test doubles to a method -that iterates through them: - -```ruby -order.calculate_total_price(double(:price => 1.99), double(:price => 2.99)) -``` - -### Stubbing a chain of methods - -You can use `receive_message_chain` in place of `receive` to stub a chain of messages: - -```ruby -allow(double).to receive_message_chain("foo.bar") { :baz } -allow(double).to receive_message_chain(:foo, :bar => :baz) -allow(double).to receive_message_chain(:foo, :bar) { :baz } - -# Given any of the above forms: -double.foo.bar # => :baz -``` - -Chains can be arbitrarily long, which makes it quite painless to violate the Law of Demeter in violent ways, so you should consider any use of `receive_message_chain` a code smell. Even though not all code smells indicate real problems (think fluent interfaces), `receive_message_chain` still results in brittle examples. For example, if you write `allow(foo).to receive_message_chain(:bar, :baz => 37)` in a spec and then the implementation calls `foo.baz.bar`, the stub will not work. - -## Consecutive return values - -When a stub might be invoked more than once, you can provide additional -arguments to `and_return`. The invocations cycle through the list. The last -value is returned for any subsequent invocations: - -```ruby -allow(die).to receive(:roll).and_return(1, 2, 3) -die.roll # => 1 -die.roll # => 2 -die.roll # => 3 -die.roll # => 3 -die.roll # => 3 -``` - -To return an array in a single invocation, declare an array: - -```ruby -allow(team).to receive(:players).and_return([double(:name => "David")]) -``` - -## Message Expectations - -A message expectation is an expectation that the test double will receive a -message some time before the example ends. If the message is received, the -expectation is satisfied. If not, the example fails. - -```ruby -validator = double("validator") -expect(validator).to receive(:validate) { "02134" } -zipcode = Zipcode.new("02134", validator) -zipcode.valid? -``` - -## Test Spies - -Verifies the given object received the expected message during the course of -the test. For a message to be verified, the given object must be setup to spy -on it, either by having it explicitly stubbed or by being a null object double -(e.g. `double(...).as_null_object`). Convenience methods are provided to easily -create null object doubles for this purpose: - -```ruby -spy("invitation") # => same as `double("invitation").as_null_object` -instance_spy("Invitation") # => same as `instance_double("Invitation").as_null_object` -class_spy("Invitation") # => same as `class_double("Invitation").as_null_object` -object_spy("Invitation") # => same as `object_double("Invitation").as_null_object` -``` - -Verifying messages received in this way implements the Test Spy pattern. - -```ruby -invitation = spy('invitation') - -user.accept_invitation(invitation) - -expect(invitation).to have_received(:accept) - -# You can also use other common message expectations. For example: -expect(invitation).to have_received(:accept).with(mailer) -expect(invitation).to have_received(:accept).twice -expect(invitation).to_not have_received(:accept).with(mailer) - -# One can specify a return value on the spy the same way one would a double. -invitation = spy('invitation', :accept => true) -expect(invitation).to have_received(:accept).with(mailer) -expect(invitation.accept).to eq(true) -``` - -Note that `have_received(...).with(...)` is unable to work properly when -passed arguments are mutated after the spy records the received message. -For example, this does not work properly: - -```ruby -greeter = spy("greeter") - -message = "Hello" -greeter.greet_with(message) -message << ", World" - -expect(greeter).to have_received(:greet_with).with("Hello") -``` - -## Nomenclature - -### Mock Objects and Test Stubs - -The names Mock Object and Test Stub suggest specialized Test Doubles. i.e. -a Test Stub is a Test Double that only supports method stubs, and a Mock -Object is a Test Double that supports message expectations and method -stubs. - -There is a lot of overlapping nomenclature here, and there are many -variations of these patterns (fakes, spies, etc). Keep in mind that most of -the time we're talking about method-level concepts that are variations of -method stubs and message expectations, and we're applying to them to _one_ -generic kind of object: a Test Double. - -### Test-Specific Extension - -a.k.a. Partial Double, a Test-Specific Extension is an extension of a -real object in a system that is instrumented with test-double like -behaviour in the context of a test. This technique is very common in Ruby -because we often see class objects acting as global namespaces for methods. -For example, in Rails: - -```ruby -person = double("person") -allow(Person).to receive(:find) { person } -``` - -In this case we're instrumenting Person to return the person object we've -defined whenever it receives the `find` message. We can also set a message -expectation so that the example fails if `find` is not called: - -```ruby -person = double("person") -expect(Person).to receive(:find) { person } -``` - -RSpec replaces the method we're stubbing or mocking with its own -test-double-like method. At the end of the example, RSpec verifies any message -expectations, and then restores the original methods. - -## Expecting Arguments - -```ruby -expect(double).to receive(:msg).with(*args) -expect(double).to_not receive(:msg).with(*args) -``` - -You can set multiple expectations for the same message if you need to: - -```ruby -expect(double).to receive(:msg).with("A", 1, 3) -expect(double).to receive(:msg).with("B", 2, 4) -``` - -## Argument Matchers - -Arguments that are passed to `with` are compared with actual arguments -received using ===. In cases in which you want to specify things about the -arguments rather than the arguments themselves, you can use any of the -matchers that ship with rspec-expectations. They don't all make syntactic -sense (they were primarily designed for use with RSpec::Expectations), but -you are free to create your own custom RSpec::Matchers. - -rspec-mocks also adds some keyword Symbols that you can use to -specify certain kinds of arguments: - -```ruby -expect(double).to receive(:msg).with(no_args) -expect(double).to receive(:msg).with(any_args) -expect(double).to receive(:msg).with(1, any_args) # any args acts like an arg splat and can go anywhere -expect(double).to receive(:msg).with(1, kind_of(Numeric), "b") #2nd argument can be any kind of Numeric -expect(double).to receive(:msg).with(1, boolean(), "b") #2nd argument can be true or false -expect(double).to receive(:msg).with(1, /abc/, "b") #2nd argument can be any String matching the submitted Regexp -expect(double).to receive(:msg).with(1, anything(), "b") #2nd argument can be anything at all -expect(double).to receive(:msg).with(1, duck_type(:abs, :div), "b") #2nd argument can be object that responds to #abs and #div -expect(double).to receive(:msg).with(hash_including(:a => 5)) # first arg is a hash with a: 5 as one of the key-values -expect(double).to receive(:msg).with(array_including(5)) # first arg is an array with 5 as one of the key-values -expect(double).to receive(:msg).with(hash_excluding(:a => 5)) # first arg is a hash without a: 5 as one of the key-values -expect(double).to receive(:msg).with(start_with('a')) # any matcher, custom or from rspec-expectations -expect(double).to receive(:msg).with(satisfy { |data| data.dig(:a, :b, :c) == 5 }) # assert anything you want -``` - -## Receive Counts - -```ruby -expect(double).to receive(:msg).once -expect(double).to receive(:msg).twice -expect(double).to receive(:msg).exactly(n).time -expect(double).to receive(:msg).exactly(n).times -expect(double).to receive(:msg).at_least(:once) -expect(double).to receive(:msg).at_least(:twice) -expect(double).to receive(:msg).at_least(n).time -expect(double).to receive(:msg).at_least(n).times -expect(double).to receive(:msg).at_most(:once) -expect(double).to receive(:msg).at_most(:twice) -expect(double).to receive(:msg).at_most(n).time -expect(double).to receive(:msg).at_most(n).times -``` - -## Ordering - -```ruby -expect(double).to receive(:msg).ordered -expect(double).to receive(:other_msg).ordered - # This will fail if the messages are received out of order -``` - -This can include the same message with different arguments: - -```ruby -expect(double).to receive(:msg).with("A", 1, 3).ordered -expect(double).to receive(:msg).with("B", 2, 4).ordered -``` - -## Setting Responses - -Whether you are setting a message expectation or a method stub, you can -tell the object precisely how to respond. The most generic way is to pass -a block to `receive`: - -```ruby -expect(double).to receive(:msg) { value } -``` - -When the double receives the `msg` message, it evaluates the block and returns -the result. - -```ruby -expect(double).to receive(:msg).and_return(value) -expect(double).to receive(:msg).exactly(3).times.and_return(value1, value2, value3) - # returns value1 the first time, value2 the second, etc -expect(double).to receive(:msg).and_raise(error) - # `error` can be an instantiated object (e.g. `StandardError.new(some_arg)`) or a class (e.g. `StandardError`) - # if it is a class, it must be instantiable with no args -expect(double).to receive(:msg).and_throw(:msg) -expect(double).to receive(:msg).and_yield(values, to, yield) -expect(double).to receive(:msg).and_yield(values, to, yield).and_yield(some, other, values, this, time) - # for methods that yield to a block multiple times -``` - -Any of these responses can be applied to a stub as well - -```ruby -allow(double).to receive(:msg).and_return(value) -allow(double).to receive(:msg).and_return(value1, value2, value3) -allow(double).to receive(:msg).and_raise(error) -allow(double).to receive(:msg).and_throw(:msg) -allow(double).to receive(:msg).and_yield(values, to, yield) -allow(double).to receive(:msg).and_yield(values, to, yield).and_yield(some, other, values, this, time) -``` - -## Arbitrary Handling - -Once in a while you'll find that the available expectations don't solve the -particular problem you are trying to solve. Imagine that you expect the message -to come with an Array argument that has a specific length, but you don't care -what is in it. You could do this: - -```ruby -expect(double).to receive(:msg) do |arg| - expect(arg.size).to eq 7 -end -``` - -If the method being stubbed itself takes a block, and you need to yield to it -in some special way, you can use this: - -```ruby -expect(double).to receive(:msg) do |&arg| - begin - arg.call - ensure - # cleanup - end -end -``` - -## Delegating to the Original Implementation - -When working with a partial mock object, you may occasionally -want to set a message expectation without interfering with how -the object responds to the message. You can use `and_call_original` -to achieve this: - -```ruby -expect(Person).to receive(:find).and_call_original -Person.find # => executes the original find method and returns the result -``` - -## Combining Expectation Details - -Combining the message name with specific arguments, receive counts and responses -you can get quite a bit of detail in your expectations: - -```ruby -expect(double).to receive(:<<).with("illegal value").once.and_raise(ArgumentError) -``` - -While this is a good thing when you really need it, you probably don't really -need it! Take care to specify only the things that matter to the behavior of -your code. - -## Stubbing and Hiding Constants - -See the [mutating constants -README](https://github.com/rspec/rspec-mocks/blob/main/features/mutating_constants/README.md) -for info on this feature. - -## Use `before(:example)`, not `before(:context)` - -Stubs in `before(:context)` are not supported. The reason is that all stubs and mocks get cleared out after each example, so any stub that is set in `before(:context)` would work in the first example that happens to run in that group, but not for any others. - -Instead of `before(:context)`, use `before(:example)`. - -## Settings mocks or stubs on any instance of a class - -rspec-mocks provides two methods, `allow_any_instance_of` and -`expect_any_instance_of`, that will allow you to stub or mock any instance -of a class. They are used in place of `allow` or `expect`: - -```ruby -allow_any_instance_of(Widget).to receive(:name).and_return("Wibble") -expect_any_instance_of(Widget).to receive(:name).and_return("Wobble") -``` - -These methods add the appropriate stub or expectation to all instances of -`Widget`. - -This feature is sometimes useful when working with legacy code, though in -general we discourage its use for a number of reasons: - -* The `rspec-mocks` API is designed for individual object instances, but this - feature operates on entire classes of objects. As a result there are some - semantically confusing edge cases. For example in - `expect_any_instance_of(Widget).to receive(:name).twice` it isn't clear - whether each specific instance is expected to receive `name` twice, or if two - receives total are expected. (It's the former.) -* Using this feature is often a design smell. It may be - that your test is trying to do too much or that the object under test is too - complex. -* It is the most complicated feature of `rspec-mocks`, and has historically - received the most bug reports. (None of the core team actively use it, - which doesn't help.) - - -## Further Reading - -There are many different viewpoints about the meaning of mocks and stubs. If -you are interested in learning more, here is some recommended reading: - -* Mock Objects: http://www.mockobjects.com/ -* Endo-Testing: http://www.ccs.neu.edu/research/demeter/related-work/extreme-programming/MockObjectsFinal.PDF -* Mock Roles, Not Objects: http://www.jmock.org/oopsla2004.pdf -* Test Double: http://www.martinfowler.com/bliki/TestDouble.html -* Test Double Patterns: http://xunitpatterns.com/Test%20Double%20Patterns.html -* Mocks aren't stubs: http://www.martinfowler.com/articles/mocksArentStubs.html - -## Also see - -* [https://github.com/rspec/rspec](https://github.com/rspec/rspec) -* [https://github.com/rspec/rspec-core](https://github.com/rspec/rspec-core) -* [https://github.com/rspec/rspec-expectations](https://github.com/rspec/rspec-expectations) -* [https://github.com/rspec/rspec-rails](https://github.com/rspec/rspec-rails) diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks.rb deleted file mode 100644 index 297779e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks.rb +++ /dev/null @@ -1,133 +0,0 @@ -require 'rspec/support' -RSpec::Support.require_rspec_support 'caller_filter' -RSpec::Support.require_rspec_support 'warnings' -RSpec::Support.require_rspec_support 'ruby_features' - -RSpec::Support.define_optimized_require_for_rspec(:mocks) { |f| require_relative f } - -%w[ - instance_method_stasher - method_double - argument_matchers - example_methods - proxy - test_double - argument_list_matcher - message_expectation - order_group - error_generator - space - mutate_const - targets - syntax - configuration - verifying_double - version -].each { |name| RSpec::Support.require_rspec_mocks name } - -# Share the top-level RSpec namespace, because we are a core supported -# extension. -module RSpec - # Contains top-level utility methods. While this contains a few - # public methods, these are not generally meant to be called from - # a test or example. They exist primarily for integration with - # test frameworks (such as rspec-core). - module Mocks - # Performs per-test/example setup. This should be called before - # an test or example begins. - def self.setup - @space_stack << (@space = space.new_scope) - end - - # Verifies any message expectations that were set during the - # test or example. This should be called at the end of an example. - def self.verify - space.verify_all - end - - # Cleans up all test double state (including any methods that were - # redefined on partial doubles). This _must_ be called after - # each example, even if an error was raised during the example. - def self.teardown - space.reset_all - @space_stack.pop - @space = @space_stack.last || @root_space - end - - # Adds an allowance (stub) on `subject` - # - # @param subject the subject to which the message will be added - # @param message a symbol, representing the message that will be - # added. - # @param opts a hash of options, :expected_from is used to set the - # original call site - # @yield an optional implementation for the allowance - # - # @example Defines the implementation of `foo` on `bar`, using the passed block - # x = 0 - # RSpec::Mocks.allow_message(bar, :foo) { x += 1 } - def self.allow_message(subject, message, opts={}, &block) - space.proxy_for(subject).add_stub(message, opts, &block) - end - - # Sets a message expectation on `subject`. - # @param subject the subject on which the message will be expected - # @param message a symbol, representing the message that will be - # expected. - # @param opts a hash of options, :expected_from is used to set the - # original call site - # @yield an optional implementation for the expectation - # - # @example Expect the message `foo` to receive `bar`, then call it - # RSpec::Mocks.expect_message(bar, :foo) - # bar.foo - def self.expect_message(subject, message, opts={}, &block) - space.proxy_for(subject).add_message_expectation(message, opts, &block) - end - - # Call the passed block and verify mocks after it has executed. This allows - # mock usage in arbitrary places, such as a `before(:all)` hook. - # - # @return [Object] the return value from the block - def self.with_temporary_scope - setup - - begin - result = yield - verify - result - ensure - teardown - end - end - - class << self - # @private - attr_reader :space - end - @space_stack = [] - @root_space = @space = RSpec::Mocks::RootSpace.new - - # @private - IGNORED_BACKTRACE_LINE = 'this backtrace line is ignored' - - # To speed up boot time a bit, delay loading optional or rarely - # used features until their first use. - autoload :AnyInstance, "rspec/mocks/any_instance" - autoload :ExpectChain, "rspec/mocks/message_chain" - autoload :StubChain, "rspec/mocks/message_chain" - autoload :MarshalExtension, "rspec/mocks/marshal_extension" - - # Namespace for mock-related matchers. - module Matchers - # @private - # just a "tag" for rspec-mock matchers detection - module Matcher; end - - autoload :HaveReceived, "rspec/mocks/matchers/have_received" - autoload :Receive, "rspec/mocks/matchers/receive" - autoload :ReceiveMessageChain, "rspec/mocks/matchers/receive_message_chain" - autoload :ReceiveMessages, "rspec/mocks/matchers/receive_messages" - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance.rb deleted file mode 100644 index 41eae81..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance.rb +++ /dev/null @@ -1,11 +0,0 @@ -%w[ - any_instance/chain - any_instance/error_generator - any_instance/stub_chain - any_instance/stub_chain_chain - any_instance/expect_chain_chain - any_instance/expectation_chain - any_instance/message_chains - any_instance/recorder - any_instance/proxy -].each { |f| RSpec::Support.require_rspec_mocks(f) } diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/chain.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/chain.rb deleted file mode 100644 index 74d864b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/chain.rb +++ /dev/null @@ -1,111 +0,0 @@ -module RSpec - module Mocks - # @private - module AnyInstance - # @private - class Chain - def initialize(recorder, *args, &block) - @recorder = recorder - @expectation_args = args - @expectation_block = block - @argument_list_matcher = ArgumentListMatcher::MATCH_ALL - end - - # @private - # - # Provides convenience methods for recording customizations on message - # expectations. - module Customizations - # @macro [attach] record - # @method $1(*args, &block) - # Records the `$1` message for playback against an instance that - # invokes a method stubbed or mocked using `any_instance`. - # - # @see RSpec::Mocks::MessageExpectation#$1 - # - def self.record(method_name) - define_method(method_name) do |*args, &block| - record(method_name, *args, &block) - end - end - - record :and_return - record :and_raise - record :and_throw - record :and_yield - record :and_call_original - record :and_wrap_original - record :with - record :once - record :twice - record :thrice - record :exactly - record :times - record :time - record :never - record :at_least - record :at_most - end - - include Customizations - - # @private - def playback!(instance) - message_expectation = create_message_expectation_on(instance) - messages.inject(message_expectation) do |object, message| - object.__send__(*message.first, &message.last) - end - end - - # @private - def constrained_to_any_of?(*constraints) - constraints.any? do |constraint| - messages.any? do |message| - message.first.first == constraint - end - end - end - - # @private - def matches_args?(*args) - @argument_list_matcher.args_match?(*args) - end - - # @private - def expectation_fulfilled! - @expectation_fulfilled = true - end - - def never - AnyInstance.error_generator.raise_double_negation_error("expect_any_instance_of(MyClass)") if negated? - super - end - - def with(*args, &block) - @argument_list_matcher = ArgumentListMatcher.new(*args) - super - end - - private - - def negated? - messages.any? { |(message, *_), _| message == :never } - end - - def messages - @messages ||= [] - end - - def last_message - messages.last.first.first unless messages.empty? - end - - def record(rspec_method_name, *args, &block) - verify_invocation_order(rspec_method_name, *args, &block) - messages << [args.unshift(rspec_method_name), block] - self - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/error_generator.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/error_generator.rb deleted file mode 100644 index d1046cb..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/error_generator.rb +++ /dev/null @@ -1,31 +0,0 @@ -module RSpec - module Mocks - module AnyInstance - # @private - class ErrorGenerator < ::RSpec::Mocks::ErrorGenerator - def raise_second_instance_received_message_error(unfulfilled_expectations) - __raise "Exactly one instance should have received the following " \ - "message(s) but didn't: #{unfulfilled_expectations.sort.join(', ')}" - end - - def raise_does_not_implement_error(klass, method_name) - __raise "#{klass} does not implement ##{method_name}" - end - - def raise_message_already_received_by_other_instance_error(method_name, object_inspect, invoked_instance) - __raise "The message '#{method_name}' was received by #{object_inspect} " \ - "but has already been received by #{invoked_instance}" - end - - def raise_not_supported_with_prepend_error(method_name, problem_mod) - __raise "Using `any_instance` to stub a method (#{method_name}) that has been " \ - "defined on a prepended module (#{problem_mod}) is not supported." - end - end - - def self.error_generator - @error_generator ||= ErrorGenerator.new - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/expect_chain_chain.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/expect_chain_chain.rb deleted file mode 100644 index c467ba9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/expect_chain_chain.rb +++ /dev/null @@ -1,31 +0,0 @@ -module RSpec - module Mocks - module AnyInstance - # @private - class ExpectChainChain < StubChain - def initialize(*args) - super - @expectation_fulfilled = false - end - - def expectation_fulfilled? - @expectation_fulfilled - end - - def playback!(instance) - super.tap { @expectation_fulfilled = true } - end - - private - - def create_message_expectation_on(instance) - ::RSpec::Mocks::ExpectChain.expect_chain_on(instance, *@expectation_args, &@expectation_block) - end - - def invocation_order - EmptyInvocationOrder - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/expectation_chain.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/expectation_chain.rb deleted file mode 100644 index edf8548..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/expectation_chain.rb +++ /dev/null @@ -1,50 +0,0 @@ -module RSpec - module Mocks - module AnyInstance - # @private - class ExpectationChain < Chain - def expectation_fulfilled? - @expectation_fulfilled || constrained_to_any_of?(:never) - end - - def initialize(*args, &block) - @expectation_fulfilled = false - super - end - - private - - def verify_invocation_order(_rspec_method_name, *_args, &_block) - end - end - - # @private - class PositiveExpectationChain < ExpectationChain - private - - def create_message_expectation_on(instance) - proxy = ::RSpec::Mocks.space.proxy_for(instance) - method_name, opts = @expectation_args - opts = (opts || {}).merge(:expected_form => IGNORED_BACKTRACE_LINE) - - me = proxy.add_message_expectation(method_name, opts, &@expectation_block) - if RSpec::Mocks.configuration.yield_receiver_to_any_instance_implementation_blocks? - me.and_yield_receiver_to_implementation - end - - me - end - - ExpectationInvocationOrder = - { - :and_return => [:with, nil], - :and_raise => [:with, nil], - }.freeze - - def invocation_order - ExpectationInvocationOrder - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/message_chains.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/message_chains.rb deleted file mode 100644 index 7f4d770..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/message_chains.rb +++ /dev/null @@ -1,83 +0,0 @@ -module RSpec - module Mocks - module AnyInstance - # @private - class MessageChains - def initialize - @chains_by_method_name = Hash.new { |h, k| h[k] = [] } - end - - # @private - def [](method_name) - @chains_by_method_name[method_name] - end - - # @private - def add(method_name, chain) - @chains_by_method_name[method_name] << chain - chain - end - - # @private - def remove_stub_chains_for!(method_name) - @chains_by_method_name[method_name].reject! do |chain| - StubChain === chain - end - end - - # @private - def has_expectation?(method_name) - @chains_by_method_name[method_name].find do |chain| - ExpectationChain === chain - end - end - - # @private - def each_unfulfilled_expectation_matching(method_name, *args) - @chains_by_method_name[method_name].each do |chain| - yield chain if !chain.expectation_fulfilled? && chain.matches_args?(*args) - end - end - - # @private - def all_expectations_fulfilled? - @chains_by_method_name.all? do |_method_name, chains| - chains.all? { |chain| chain.expectation_fulfilled? } - end - end - - # @private - def unfulfilled_expectations - @chains_by_method_name.map do |method_name, chains| - method_name.to_s if ExpectationChain === chains.last && !chains.last.expectation_fulfilled? - end.compact - end - - # @private - def received_expected_message!(method_name) - @chains_by_method_name[method_name].each do |chain| - chain.expectation_fulfilled! - end - end - - # @private - def playback!(instance, method_name) - raise_if_second_instance_to_receive_message(instance) - @chains_by_method_name[method_name].each do |chain| - chain.playback!(instance) - end - end - - private - - def raise_if_second_instance_to_receive_message(instance) - @instance_with_expectation ||= instance if ExpectationChain === instance - return unless ExpectationChain === instance - return if @instance_with_expectation.equal?(instance) - - AnyInstance.error_generator.raise_second_instance_received_message_error(unfulfilled_expectations) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/proxy.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/proxy.rb deleted file mode 100644 index 54ded05..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/proxy.rb +++ /dev/null @@ -1,125 +0,0 @@ -module RSpec - module Mocks - module AnyInstance - # @private - # The `AnyInstance::Recorder` is responsible for redefining the klass's - # instance method in order to add any stubs/expectations the first time - # the method is called. It's not capable of updating a stub on an instance - # that's already been previously stubbed (either directly, or via - # `any_instance`). - # - # This proxy sits in front of the recorder and delegates both to it - # and to the `RSpec::Mocks::Proxy` for each already mocked or stubbed - # instance of the class, in order to propagates changes to the instances. - # - # Note that unlike `RSpec::Mocks::Proxy`, this proxy class is stateless - # and is not persisted in `RSpec::Mocks.space`. - # - # Proxying for the message expectation fluent interface (typically chained - # off of the return value of one of these methods) is provided by the - # `FluentInterfaceProxy` class below. - class Proxy - def initialize(recorder, target_proxies) - @recorder = recorder - @target_proxies = target_proxies - end - - def klass - @recorder.klass - end - - def stub(method_name_or_method_map, &block) - if Hash === method_name_or_method_map - method_name_or_method_map.each do |method_name, return_value| - stub(method_name).and_return(return_value) - end - else - perform_proxying(__method__, [method_name_or_method_map], block) do |proxy| - proxy.add_stub(method_name_or_method_map, &block) - end - end - end - - def unstub(method_name) - perform_proxying(__method__, [method_name], nil) do |proxy| - proxy.remove_stub_if_present(method_name) - end - end - - def stub_chain(*chain, &block) - perform_proxying(__method__, chain, block) do |proxy| - Mocks::StubChain.stub_chain_on(proxy.object, *chain, &block) - end - end - - def expect_chain(*chain, &block) - perform_proxying(__method__, chain, block) do |proxy| - Mocks::ExpectChain.expect_chain_on(proxy.object, *chain, &block) - end - end - - def should_receive(method_name, &block) - perform_proxying(__method__, [method_name], block) do |proxy| - # Yeah, this is a bit odd...but if we used `add_message_expectation` - # then it would act like `expect_every_instance_of(klass).to receive`. - # The any_instance recorder takes care of validating that an instance - # received the message. - proxy.add_stub(method_name, &block) - end - end - - def should_not_receive(method_name, &block) - perform_proxying(__method__, [method_name], block) do |proxy| - proxy.add_message_expectation(method_name, &block).never - end - end - - private - - def perform_proxying(method_name, args, block, &target_proxy_block) - recorder_value = @recorder.__send__(method_name, *args, &block) - proxy_values = @target_proxies.map(&target_proxy_block) - FluentInterfaceProxy.new([recorder_value] + proxy_values) - end - end - - unless defined?(BasicObject) - class BasicObject - # Remove all methods except those expected to be defined on BasicObject - (instance_methods.map(&:to_sym) - [:__send__, :"!", :instance_eval, :==, :instance_exec, :"!=", :equal?, :__id__, :__binding__, :object_id]).each do |method| - undef_method method - end - end - end - - # @private - # Delegates messages to each of the given targets in order to - # provide the fluent interface that is available off of message - # expectations when dealing with `any_instance`. - # - # `targets` will typically contain 1 of the `AnyInstance::Recorder` - # return values and N `MessageExpectation` instances (one per instance - # of the `any_instance` klass). - class FluentInterfaceProxy < BasicObject - def initialize(targets) - @targets = targets - end - - if ::RUBY_VERSION.to_f > 1.8 - def respond_to_missing?(method_name, include_private=false) - super || @targets.first.respond_to?(method_name, include_private) - end - else - def respond_to?(method_name, include_private=false) - super || @targets.first.respond_to?(method_name, include_private) - end - end - - def method_missing(*args, &block) - return_values = @targets.map { |t| t.__send__(*args, &block) } - FluentInterfaceProxy.new(return_values) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/recorder.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/recorder.rb deleted file mode 100644 index 0eb8245..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/recorder.rb +++ /dev/null @@ -1,299 +0,0 @@ -module RSpec - module Mocks - module AnyInstance - # Given a class `TheClass`, `TheClass.any_instance` returns a `Recorder`, - # which records stubs and message expectations for later playback on - # instances of `TheClass`. - # - # Further constraints are stored in instances of [Chain](Chain). - # - # @see AnyInstance - # @see Chain - class Recorder - # @private - attr_reader :message_chains, :stubs, :klass - - def initialize(klass) - @message_chains = MessageChains.new - @stubs = Hash.new { |hash, key| hash[key] = [] } - @observed_methods = [] - @played_methods = {} - @backed_up_method_owner = {} - @klass = klass - @expectation_set = false - - return unless RSpec::Mocks.configuration.verify_partial_doubles? - RSpec::Mocks.configuration.verifying_double_callbacks.each do |block| - block.call(ObjectReference.for(klass)) - end - end - - # Initializes the recording a stub to be played back against any - # instance of this object that invokes the submitted method. - # - # @see Methods#stub - def stub(method_name, &block) - observe!(method_name) - message_chains.add(method_name, StubChain.new(self, method_name, &block)) - end - - # Initializes the recording a stub chain to be played back against any - # instance of this object that invokes the method matching the first - # argument. - # - # @see Methods#stub_chain - def stub_chain(*method_names_and_optional_return_values, &block) - normalize_chain(*method_names_and_optional_return_values) do |method_name, args| - observe!(method_name) - message_chains.add(method_name, StubChainChain.new(self, *args, &block)) - end - end - - # @private - def expect_chain(*method_names_and_optional_return_values, &block) - @expectation_set = true - normalize_chain(*method_names_and_optional_return_values) do |method_name, args| - observe!(method_name) - message_chains.add(method_name, ExpectChainChain.new(self, *args, &block)) - end - end - - # Initializes the recording a message expectation to be played back - # against any instance of this object that invokes the submitted - # method. - # - # @see Methods#should_receive - def should_receive(method_name, &block) - @expectation_set = true - observe!(method_name) - message_chains.add(method_name, PositiveExpectationChain.new(self, method_name, &block)) - end - - # The opposite of `should_receive` - # - # @see Methods#should_not_receive - def should_not_receive(method_name, &block) - should_receive(method_name, &block).never - end - - # Removes any previously recorded stubs, stub_chains or message - # expectations that use `method_name`. - # - # @see Methods#unstub - def unstub(method_name) - unless @observed_methods.include?(method_name.to_sym) - AnyInstance.error_generator.raise_method_not_stubbed_error(method_name) - end - message_chains.remove_stub_chains_for!(method_name) - stubs[method_name].clear - stop_observing!(method_name) unless message_chains.has_expectation?(method_name) - end - - # @api private - # - # Used internally to verify that message expectations have been - # fulfilled. - def verify - return unless @expectation_set - return if message_chains.all_expectations_fulfilled? - - AnyInstance.error_generator.raise_second_instance_received_message_error(message_chains.unfulfilled_expectations) - end - - # @private - def stop_all_observation! - @observed_methods.each { |method_name| restore_method!(method_name) } - end - - # @private - def playback!(instance, method_name) - RSpec::Mocks.space.ensure_registered(instance) - message_chains.playback!(instance, method_name) - @played_methods[method_name] = instance - received_expected_message!(method_name) if message_chains.has_expectation?(method_name) - end - - # @private - def instance_that_received(method_name) - @played_methods[method_name] - end - - # @private - def build_alias_method_name(method_name) - "__#{method_name}_without_any_instance__" - end - - # @private - def already_observing?(method_name) - @observed_methods.include?(method_name) || super_class_observing?(method_name) - end - - # @private - def notify_received_message(_object, message, args, _blk) - has_expectation = false - - message_chains.each_unfulfilled_expectation_matching(message, *args) do |expectation| - has_expectation = true - expectation.expectation_fulfilled! - end - - return unless has_expectation - - restore_method!(message) - mark_invoked!(message) - end - - protected - - def stop_observing!(method_name) - restore_method!(method_name) - @observed_methods.delete(method_name) - super_class_observers_for(method_name).each do |ancestor| - ::RSpec::Mocks.space. - any_instance_recorder_for(ancestor).stop_observing!(method_name) - end - end - - private - - def ancestor_is_an_observer?(ancestor, method_name) - return if ancestor == @klass - - ::RSpec::Mocks.space. - any_instance_recorder_for(ancestor).already_observing?(method_name) - end - - def super_class_observers_for(method_name) - @klass.ancestors.select do |ancestor| - ancestor_is_an_observer?(ancestor, method_name) - end - end - - def super_class_observing?(method_name) - @klass.ancestors.any? do |ancestor| - ancestor_is_an_observer?(ancestor, method_name) - end - end - - def normalize_chain(*args) - args.shift.to_s.split('.').map { |s| s.to_sym }.reverse.each { |a| args.unshift a } - yield args.first, args - end - - def received_expected_message!(method_name) - message_chains.received_expected_message!(method_name) - restore_method!(method_name) - mark_invoked!(method_name) - end - - def restore_method!(method_name) - if public_protected_or_private_method_defined?(build_alias_method_name(method_name)) - restore_original_method!(method_name) - else - remove_dummy_method!(method_name) - end - end - - def restore_original_method!(method_name) - return unless @klass.instance_method(method_name).owner == @klass - - alias_method_name = build_alias_method_name(method_name) - @klass.class_exec(@backed_up_method_owner) do |backed_up_method_owner| - remove_method method_name - - # A @klass can have methods implemented (see Method#owner) in @klass - # or inherited from a superclass. In ruby 2.2 and earlier, we can copy - # a method regardless of the 'owner' and restore it to @klass after - # because a call to 'super' from @klass's copied method would end up - # calling the original class's superclass's method. - # - # With the commit below, available starting in 2.3.0, ruby changed - # this behavior and a call to 'super' from the method copied to @klass - # will call @klass's superclass method, which is the original - # implementer of this method! This leads to very strange errors - # if @klass's copied method calls 'super', since it would end up - # calling itself, the original method implemented in @klass's - # superclass. - # - # For ruby 2.3 and above, we need to only restore methods that - # @klass originally owned. - # - # https://github.com/ruby/ruby/commit/c8854d2ca4be9ee6946e6d17b0e17d9ef130ee81 - if RUBY_VERSION < "2.3" || backed_up_method_owner[method_name.to_sym] == self - alias_method method_name, alias_method_name - end - remove_method alias_method_name - end - end - - def remove_dummy_method!(method_name) - @klass.class_exec do - remove_method method_name - end - end - - def backup_method!(method_name) - return unless public_protected_or_private_method_defined?(method_name) - - alias_method_name = build_alias_method_name(method_name) - @backed_up_method_owner[method_name.to_sym] ||= @klass.instance_method(method_name).owner - @klass.class_exec do - alias_method alias_method_name, method_name - end - end - - def public_protected_or_private_method_defined?(method_name) - MethodReference.method_defined_at_any_visibility?(@klass, method_name) - end - - def observe!(method_name) - allow_no_prepended_module_definition_of(method_name) - - if RSpec::Mocks.configuration.verify_partial_doubles? && !Mocks.configuration.temporarily_suppress_partial_double_verification - unless public_protected_or_private_method_defined?(method_name) - AnyInstance.error_generator.raise_does_not_implement_error(@klass, method_name) - end - end - - stop_observing!(method_name) if already_observing?(method_name) - @observed_methods << method_name - backup_method!(method_name) - recorder = self - method_was_private = @klass.private_method_defined?(method_name) - @klass.__send__(:define_method, method_name) do |*args, &blk| - recorder.playback!(self, method_name) - __send__(method_name, *args, &blk) - end - @klass.__send__(:private, method_name) if method_was_private - @klass.__send__(:ruby2_keywords, method_name) if @klass.respond_to?(:ruby2_keywords, true) - end - - def mark_invoked!(method_name) - backup_method!(method_name) - recorder = self - @klass.__send__(:define_method, method_name) do |*_args, &_blk| - invoked_instance = recorder.instance_that_received(method_name) - inspect = "#<#{self.class}:#{object_id} #{instance_variables.map { |name| "#{name}=#{instance_variable_get name}" }.join(', ')}>" - AnyInstance.error_generator.raise_message_already_received_by_other_instance_error( - method_name, inspect, invoked_instance - ) - end - end - - if Support::RubyFeatures.module_prepends_supported? - def allow_no_prepended_module_definition_of(method_name) - prepended_modules = RSpec::Mocks::Proxy.prepended_modules_of(@klass) - problem_mod = prepended_modules.find { |mod| mod.method_defined?(method_name) } - return unless problem_mod - - AnyInstance.error_generator.raise_not_supported_with_prepend_error(method_name, problem_mod) - end - else - def allow_no_prepended_module_definition_of(_method_name) - # nothing to do; prepends aren't supported on this version of ruby - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/stub_chain.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/stub_chain.rb deleted file mode 100644 index c4c0ab7..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/stub_chain.rb +++ /dev/null @@ -1,51 +0,0 @@ -module RSpec - module Mocks - module AnyInstance - # @private - class StubChain < Chain - # @private - def expectation_fulfilled? - true - end - - private - - def create_message_expectation_on(instance) - proxy = ::RSpec::Mocks.space.proxy_for(instance) - method_name, opts = @expectation_args - opts = (opts || {}).merge(:expected_form => IGNORED_BACKTRACE_LINE) - - stub = proxy.add_stub(method_name, opts, &@expectation_block) - @recorder.stubs[stub.message] << stub - - if RSpec::Mocks.configuration.yield_receiver_to_any_instance_implementation_blocks? - stub.and_yield_receiver_to_implementation - end - - stub - end - - InvocationOrder = - { - :and_return => [:with, nil], - :and_raise => [:with, nil], - :and_yield => [:with, :and_yield, nil], - :and_throw => [:with, nil], - :and_call_original => [:with, nil], - :and_wrap_original => [:with, nil] - }.freeze - - EmptyInvocationOrder = {}.freeze - - def invocation_order - InvocationOrder - end - - def verify_invocation_order(rspec_method_name, *_args, &_block) - return if invocation_order.fetch(rspec_method_name, [nil]).include?(last_message) - raise NoMethodError, "Undefined method #{rspec_method_name}" - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/stub_chain_chain.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/stub_chain_chain.rb deleted file mode 100644 index 495511c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/any_instance/stub_chain_chain.rb +++ /dev/null @@ -1,23 +0,0 @@ -module RSpec - module Mocks - module AnyInstance - # @private - class StubChainChain < StubChain - def initialize(*args) - super - @expectation_fulfilled = false - end - - private - - def create_message_expectation_on(instance) - ::RSpec::Mocks::StubChain.stub_chain_on(instance, *@expectation_args, &@expectation_block) - end - - def invocation_order - EmptyInvocationOrder - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/argument_list_matcher.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/argument_list_matcher.rb deleted file mode 100644 index f8adcd9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/argument_list_matcher.rb +++ /dev/null @@ -1,117 +0,0 @@ -# We intentionally do not use the `RSpec::Support.require...` methods -# here so that this file can be loaded individually, as documented -# below. -require 'rspec/mocks/argument_matchers' -require 'rspec/support/fuzzy_matcher' - -module RSpec - module Mocks - # Wrapper for matching arguments against a list of expected values. Used by - # the `with` method on a `MessageExpectation`: - # - # expect(object).to receive(:message).with(:a, 'b', 3) - # object.message(:a, 'b', 3) - # - # Values passed to `with` can be literal values or argument matchers that - # match against the real objects .e.g. - # - # expect(object).to receive(:message).with(hash_including(:a => 'b')) - # - # Can also be used directly to match the contents of any `Array`. This - # enables 3rd party mocking libs to take advantage of rspec's argument - # matching without using the rest of rspec-mocks. - # - # require 'rspec/mocks/argument_list_matcher' - # include RSpec::Mocks::ArgumentMatchers - # - # arg_list_matcher = RSpec::Mocks::ArgumentListMatcher.new(123, hash_including(:a => 'b')) - # arg_list_matcher.args_match?(123, :a => 'b') - # - # This class is immutable. - # - # @see ArgumentMatchers - class ArgumentListMatcher - # @private - attr_reader :expected_args - - # @api public - # @param [Array] expected_args a list of expected literals and/or argument matchers - # - # Initializes an `ArgumentListMatcher` with a collection of literal - # values and/or argument matchers. - # - # @see ArgumentMatchers - # @see #args_match? - def initialize(*expected_args) - @expected_args = expected_args - ensure_expected_args_valid! - end - ruby2_keywords :initialize if respond_to?(:ruby2_keywords, true) - - # @api public - # @param [Array] actual_args - # - # Matches each element in the `expected_args` against the element in the same - # position of the arguments passed to `new`. - # - # @see #initialize - def args_match?(*actual_args) - expected_args = resolve_expected_args_based_on(actual_args) - - return false if expected_args.size != actual_args.size - - if RUBY_VERSION >= "3" - # If the expectation was set with keywords, while the actual method was called with a positional hash argument, they don't match. - # If the expectation was set without keywords, e.g., with({a: 1}), then it fine to call it with either foo(a: 1) or foo({a: 1}). - # This corresponds to Ruby semantics, as if the method was def foo(options). - if Hash === expected_args.last && Hash === actual_args.last - if !Hash.ruby2_keywords_hash?(actual_args.last) && Hash.ruby2_keywords_hash?(expected_args.last) - return false - end - end - end - - Support::FuzzyMatcher.values_match?(expected_args, actual_args) - end - ruby2_keywords :args_match? if respond_to?(:ruby2_keywords, true) - - # @private - # Resolves abstract arg placeholders like `no_args` and `any_args` into - # a more concrete arg list based on the provided `actual_args`. - def resolve_expected_args_based_on(actual_args) - return [] if [ArgumentMatchers::NoArgsMatcher::INSTANCE] == expected_args - - any_args_index = expected_args.index { |a| ArgumentMatchers::AnyArgsMatcher::INSTANCE == a } - return expected_args unless any_args_index - - replace_any_args_with_splat_of_anything(any_args_index, actual_args.count) - end - - private - - def replace_any_args_with_splat_of_anything(before_count, actual_args_count) - any_args_count = actual_args_count - expected_args.count + 1 - after_count = expected_args.count - before_count - 1 - - any_args = 1.upto(any_args_count).map { ArgumentMatchers::AnyArgMatcher::INSTANCE } - expected_args.first(before_count) + any_args + expected_args.last(after_count) - end - - def ensure_expected_args_valid! - if expected_args.count { |a| ArgumentMatchers::AnyArgsMatcher::INSTANCE == a } > 1 - raise ArgumentError, "`any_args` can only be passed to " \ - "`with` once but you have passed it multiple times." - elsif expected_args.count > 1 && expected_args.any? { |a| ArgumentMatchers::NoArgsMatcher::INSTANCE == a } - raise ArgumentError, "`no_args` can only be passed as a " \ - "singleton argument to `with` (i.e. `with(no_args)`), " \ - "but you have passed additional arguments." - end - end - - # Value that will match all argument lists. - # - # @private - MATCH_ALL = new(ArgumentMatchers::AnyArgsMatcher::INSTANCE) - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/argument_matchers.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/argument_matchers.rb deleted file mode 100644 index 5452508..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/argument_matchers.rb +++ /dev/null @@ -1,366 +0,0 @@ -# This cannot take advantage of our relative requires, since this file is a -# dependency of `rspec/mocks/argument_list_matcher.rb`. See comment there for -# details. -require 'rspec/support/matcher_definition' - -module RSpec - module Mocks - # ArgumentMatchers are placeholders that you can include in message - # expectations to match arguments against a broader check than simple - # equality. - # - # With the exception of `any_args` and `no_args`, they all match against - # the arg in same position in the argument list. - # - # @see ArgumentListMatcher - module ArgumentMatchers - # Acts like an arg splat, matching any number of args at any point in an arg list. - # - # @example - # expect(object).to receive(:message).with(1, 2, any_args) - # - # # matches any of these: - # object.message(1, 2) - # object.message(1, 2, 3) - # object.message(1, 2, 3, 4) - def any_args - AnyArgsMatcher::INSTANCE - end - - # Matches any argument at all. - # - # @example - # expect(object).to receive(:message).with(anything) - def anything - AnyArgMatcher::INSTANCE - end - - # Matches no arguments. - # - # @example - # expect(object).to receive(:message).with(no_args) - def no_args - NoArgsMatcher::INSTANCE - end - - # Matches if the actual argument responds to the specified messages. - # - # @example - # expect(object).to receive(:message).with(duck_type(:hello)) - # expect(object).to receive(:message).with(duck_type(:hello, :goodbye)) - def duck_type(*args) - DuckTypeMatcher.new(*args) - end - - # Matches a boolean value. - # - # @example - # expect(object).to receive(:message).with(boolean()) - def boolean - BooleanMatcher::INSTANCE - end - - # Matches a hash that includes the specified key(s) or key/value pairs. - # Ignores any additional keys. - # - # @example - # expect(object).to receive(:message).with(hash_including(:key => val)) - # expect(object).to receive(:message).with(hash_including(:key)) - # expect(object).to receive(:message).with(hash_including(:key, :key2 => val2)) - def hash_including(*args) - HashIncludingMatcher.new(ArgumentMatchers.anythingize_lonely_keys(*args)) - end - - # Matches a hash that doesn't include the specified key(s) or key/value. - # - # @example - # expect(object).to receive(:message).with(hash_excluding(:key => val)) - # expect(object).to receive(:message).with(hash_excluding(:key)) - # expect(object).to receive(:message).with(hash_excluding(:key, :key2 => :val2)) - def hash_excluding(*args) - HashExcludingMatcher.new(ArgumentMatchers.anythingize_lonely_keys(*args)) - end - - # Matches an array that includes the specified items at least once. - # Ignores duplicates and additional values - # - # @example - # expect(object).to receive(:message).with(array_including(1,2,3)) - # expect(object).to receive(:message).with(array_including([1,2,3])) - def array_including(*args) - actually_an_array = Array === args.first && args.count == 1 ? args.first : args - ArrayIncludingMatcher.new(actually_an_array) - end - - # Matches an array that excludes the specified items. - # - # @example - # expect(object).to receive(:message).with(array_excluding(1,2,3)) - # expect(object).to receive(:message).with(array_excluding([1,2,3])) - def array_excluding(*args) - actually_an_array = Array === args.first && args.count == 1 ? args.first : args - ArrayExcludingMatcher.new(actually_an_array) - end - - alias_method :hash_not_including, :hash_excluding - - # Matches if `arg.instance_of?(klass)` - # - # @example - # expect(object).to receive(:message).with(instance_of(Thing)) - def instance_of(klass) - InstanceOf.new(klass) - end - - alias_method :an_instance_of, :instance_of - - # Matches if `arg.kind_of?(klass)` - # - # @example - # expect(object).to receive(:message).with(kind_of(Thing)) - def kind_of(klass) - KindOf.new(klass) - end - - alias_method :a_kind_of, :kind_of - - # @private - def self.anythingize_lonely_keys(*args) - hash = Hash === args.last ? args.delete_at(-1) : {} - args.each { | arg | hash[arg] = AnyArgMatcher::INSTANCE } - hash - end - - # Intended to be subclassed by stateless, immutable argument matchers. - # Provides a `::INSTANCE` constant for accessing a global - # singleton instance of the matcher. There is no need to construct - # multiple instance since there is no state. It also facilities the - # special case logic we need for some of these matchers, by making it - # easy to do comparisons like: `[klass::INSTANCE] == args` rather than - # `args.count == 1 && klass === args.first`. - # - # @private - class SingletonMatcher - private_class_method :new - - def self.inherited(subklass) - subklass.const_set(:INSTANCE, subklass.send(:new)) - end - end - - # @private - class AnyArgsMatcher < SingletonMatcher - def description - "*(any args)" - end - end - - # @private - class AnyArgMatcher < SingletonMatcher - def ===(_other) - true - end - - def description - "anything" - end - end - - # @private - class NoArgsMatcher < SingletonMatcher - def description - "no args" - end - end - - # @private - class BooleanMatcher < SingletonMatcher - def ===(value) - true == value || false == value - end - - def description - "boolean" - end - end - - # @private - class BaseHashMatcher - def initialize(expected) - @expected = expected - end - - def ===(predicate, actual) - @expected.__send__(predicate) do |k, v| - actual.key?(k) && Support::FuzzyMatcher.values_match?(v, actual[k]) - end - rescue NoMethodError - false - end - - def description(name) - "#{name}(#{formatted_expected_hash.inspect.sub(/^\{/, "").sub(/\}$/, "")})" - end - - private - - def formatted_expected_hash - Hash[ - @expected.map do |k, v| - k = RSpec::Support.rspec_description_for_object(k) - v = RSpec::Support.rspec_description_for_object(v) - - [k, v] - end - ] - end - end - - # @private - class HashIncludingMatcher < BaseHashMatcher - def ===(actual) - super(:all?, actual) - end - - def description - super("hash_including") - end - end - - # @private - class HashExcludingMatcher < BaseHashMatcher - def ===(actual) - super(:none?, actual) - end - - def description - super("hash_not_including") - end - end - - # @private - class ArrayIncludingMatcher - def initialize(expected) - @expected = expected - end - - def ===(actual) - actual = actual.uniq - return true if (actual & @expected).count >= @expected.count - - @expected.uniq.all? do |expected_element| - actual.any? do |actual_element| - RSpec::Support::FuzzyMatcher.values_match?(expected_element, actual_element) - end - end - rescue NoMethodError - false - end - - def description - "array_including(#{formatted_expected_values})" - end - - private - - def formatted_expected_values - @expected.map do |x| - RSpec::Support.rspec_description_for_object(x) - end.join(", ") - end - end - - # @private - class ArrayExcludingMatcher - def initialize(unexpected) - @unexpected = unexpected.uniq - end - - def ===(actual) - actual = actual.uniq - return false unless (actual & @unexpected).empty? - - actual.none? do |actual_element| - @unexpected.any? do |unexpected_element| - RSpec::Support::FuzzyMatcher.values_match?(unexpected_element, actual_element) - end - end - rescue NoMethodError - false - end - - def description - "array_excluding(#{formatted_unexpected_values})" - end - - private - - def formatted_unexpected_values - @unexpected.map do |x| - RSpec::Support.rspec_description_for_object(x) - end.join(", ") - end - end - - # @private - class DuckTypeMatcher - def initialize(*methods_to_respond_to) - @methods_to_respond_to = methods_to_respond_to - end - - def ===(value) - @methods_to_respond_to.all? { |message| value.respond_to?(message) } - end - - def description - "duck_type(#{@methods_to_respond_to.map(&:inspect).join(', ')})" - end - end - - # @private - class InstanceOf - def initialize(klass) - @klass = klass - end - - def ===(actual) - actual.instance_of?(@klass) - end - - def description - "an_instance_of(#{@klass.name})" - end - end - - # @private - class KindOf - def initialize(klass) - @klass = klass - end - - def ===(actual) - actual.kind_of?(@klass) - end - - def description - "kind of #{@klass.name}" - end - end - - matcher_namespace = name + '::' - ::RSpec::Support.register_matcher_definition do |object| - # This is the best we have for now. We should tag all of our matchers - # with a module or something so we can test for it directly. - # - # (Note Module#parent in ActiveSupport is defined in a similar way.) - begin - object.class.name.include?(matcher_namespace) - rescue NoMethodError - # Some objects, like BasicObject, don't implement standard - # reflection methods. - false - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/configuration.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/configuration.rb deleted file mode 100644 index 8496bdc..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/configuration.rb +++ /dev/null @@ -1,212 +0,0 @@ -module RSpec - module Mocks - # Provides configuration options for rspec-mocks. - class Configuration - def initialize - @allow_message_expectations_on_nil = nil - @yield_receiver_to_any_instance_implementation_blocks = true - @verify_doubled_constant_names = false - @transfer_nested_constants = false - @verify_partial_doubles = false - @temporarily_suppress_partial_double_verification = false - @color = false - end - - # Sets whether RSpec will warn, ignore, or fail a test when - # expectations are set on nil. - # By default, when this flag is not set, warning messages are issued when - # expectations are set on nil. This is to prevent false-positives and to - # catch potential bugs early on. - # When set to `true`, warning messages are suppressed. - # When set to `false`, it will raise an error. - # - # @example - # RSpec.configure do |config| - # config.mock_with :rspec do |mocks| - # mocks.allow_message_expectations_on_nil = false - # end - # end - attr_accessor :allow_message_expectations_on_nil - - def yield_receiver_to_any_instance_implementation_blocks? - @yield_receiver_to_any_instance_implementation_blocks - end - - # Sets whether or not RSpec will yield the receiving instance of a - # message to blocks that are used for any_instance stub implementations. - # When set, the first yielded argument will be the receiving instance. - # Defaults to `true`. - # - # @example - # RSpec.configure do |rspec| - # rspec.mock_with :rspec do |mocks| - # mocks.yield_receiver_to_any_instance_implementation_blocks = false - # end - # end - attr_writer :yield_receiver_to_any_instance_implementation_blocks - - # Adds `stub` and `should_receive` to the given - # modules or classes. This is usually only necessary - # if you application uses some proxy classes that - # "strip themselves down" to a bare minimum set of - # methods and remove `stub` and `should_receive` in - # the process. - # - # @example - # RSpec.configure do |rspec| - # rspec.mock_with :rspec do |mocks| - # mocks.add_stub_and_should_receive_to Delegator - # end - # end - # - def add_stub_and_should_receive_to(*modules) - modules.each do |mod| - Syntax.enable_should(mod) - end - end - - # Provides the ability to set either `expect`, - # `should` or both syntaxes. RSpec uses `expect` - # syntax by default. This is needed if you want to - # explicitly enable `should` syntax and/or explicitly - # disable `expect` syntax. - # - # @example - # RSpec.configure do |rspec| - # rspec.mock_with :rspec do |mocks| - # mocks.syntax = [:expect, :should] - # end - # end - # - def syntax=(*values) - syntaxes = values.flatten - if syntaxes.include?(:expect) - Syntax.enable_expect - else - Syntax.disable_expect - end - - if syntaxes.include?(:should) - Syntax.enable_should - else - Syntax.disable_should - end - end - - # Returns an array with a list of syntaxes - # that are enabled. - # - # @example - # unless RSpec::Mocks.configuration.syntax.include?(:expect) - # raise "this RSpec extension gem requires the rspec-mocks `:expect` syntax" - # end - # - def syntax - syntaxes = [] - syntaxes << :should if Syntax.should_enabled? - syntaxes << :expect if Syntax.expect_enabled? - syntaxes - end - - def verify_doubled_constant_names? - !!@verify_doubled_constant_names - end - - # When this is set to true, an error will be raised when - # `instance_double` or `class_double` is given the name of an undefined - # constant. You probably only want to set this when running your entire - # test suite, with all production code loaded. Setting this for an - # isolated unit test will prevent you from being able to isolate it! - attr_writer :verify_doubled_constant_names - - # Provides a way to perform customisations when verifying doubles. - # - # @example - # RSpec::Mocks.configuration.before_verifying_doubles do |ref| - # ref.some_method! - # end - def before_verifying_doubles(&block) - verifying_double_callbacks << block - end - alias :when_declaring_verifying_double :before_verifying_doubles - - # @api private - # Returns an array of blocks to call when verifying doubles - def verifying_double_callbacks - @verifying_double_callbacks ||= [] - end - - def transfer_nested_constants? - !!@transfer_nested_constants - end - - # Sets the default for the `transfer_nested_constants` option when - # stubbing constants. - attr_writer :transfer_nested_constants - - # When set to true, partial mocks will be verified the same as object - # doubles. Any stubs will have their arguments checked against the original - # method, and methods that do not exist cannot be stubbed. - def verify_partial_doubles=(val) - @verify_partial_doubles = !!val - end - - def verify_partial_doubles? - @verify_partial_doubles - end - - # @private - # Used to track whether we are temporarily suppressing verifying partial - # doubles with `without_partial_double_verification { ... }` - attr_accessor :temporarily_suppress_partial_double_verification - - if ::RSpec.respond_to?(:configuration) - def color? - ::RSpec.configuration.color_enabled? - end - else - # Indicates whether or not diffs should be colored. - # Delegates to rspec-core's color option if rspec-core - # is loaded; otherwise you can set it here. - attr_writer :color - - # Indicates whether or not diffs should be colored. - # Delegates to rspec-core's color option if rspec-core - # is loaded; otherwise you can set it here. - def color? - @color - end - end - - # Monkey-patch `Marshal.dump` to enable dumping of mocked or stubbed - # objects. By default this will not work since RSpec mocks works by - # adding singleton methods that cannot be serialized. This patch removes - # these singleton methods before serialization. Setting to falsey removes - # the patch. - # - # This method is idempotent. - def patch_marshal_to_support_partial_doubles=(val) - if val - RSpec::Mocks::MarshalExtension.patch! - else - RSpec::Mocks::MarshalExtension.unpatch! - end - end - - # @api private - # Resets the configured syntax to the default. - def reset_syntaxes_to_default - self.syntax = [:should, :expect] - RSpec::Mocks::Syntax.warn_about_should! - end - end - - # Mocks specific configuration, as distinct from `RSpec.configuration` - # which is core RSpec configuration. - def self.configuration - @configuration ||= Configuration.new - end - - configuration.reset_syntaxes_to_default - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/error_generator.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/error_generator.rb deleted file mode 100644 index 8e7e2c1..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/error_generator.rb +++ /dev/null @@ -1,390 +0,0 @@ -RSpec::Support.require_rspec_support "object_formatter" - -module RSpec - module Mocks - # Raised when a message expectation is not satisfied. - MockExpectationError = Class.new(Exception) - - # Raised when a test double is used after it has been torn - # down (typically at the end of an rspec-core example). - ExpiredTestDoubleError = Class.new(MockExpectationError) - - # Raised when doubles or partial doubles are used outside of the per-test lifecycle. - OutsideOfExampleError = Class.new(StandardError) - - # Raised when an expectation customization method (e.g. `with`, - # `and_return`) is called on a message expectation which has already been - # invoked. - MockExpectationAlreadyInvokedError = Class.new(Exception) - - # Raised for situations that RSpec cannot support due to mutations made - # externally on arguments that RSpec is holding onto to use for later - # comparisons. - # - # @deprecated We no longer raise this error but the constant remains until - # RSpec 4 for SemVer reasons. - CannotSupportArgMutationsError = Class.new(StandardError) - - # @private - UnsupportedMatcherError = Class.new(StandardError) - # @private - NegationUnsupportedError = Class.new(StandardError) - # @private - VerifyingDoubleNotDefinedError = Class.new(StandardError) - - # @private - class ErrorGenerator - attr_writer :opts - - def initialize(target=nil) - @target = target - end - - # @private - def opts - @opts ||= {} - end - - # @private - def raise_unexpected_message_error(message, args) - __raise "#{intro} received unexpected message :#{message} with #{format_args(args)}" - end - - # @private - def raise_unexpected_message_args_error(expectation, args_for_multiple_calls, source_id=nil) - __raise error_message(expectation, args_for_multiple_calls), nil, source_id - end - - # @private - def raise_missing_default_stub_error(expectation, args_for_multiple_calls) - __raise( - error_message(expectation, args_for_multiple_calls) + - "\n Please stub a default value first if message might be received with other args as well. \n" - ) - end - - # @private - def raise_similar_message_args_error(expectation, args_for_multiple_calls, backtrace_line=nil) - __raise error_message(expectation, args_for_multiple_calls), backtrace_line - end - - def default_error_message(expectation, expected_args, actual_args) - "#{intro} received #{expectation.message.inspect} #{unexpected_arguments_message(expected_args, actual_args)}".dup - end - - # rubocop:disable Metrics/ParameterLists - # @private - def raise_expectation_error(message, expected_received_count, argument_list_matcher, - actual_received_count, expectation_count_type, args, - backtrace_line=nil, source_id=nil) - expected_part = expected_part_of_expectation_error(expected_received_count, expectation_count_type, argument_list_matcher) - received_part = received_part_of_expectation_error(actual_received_count, args) - __raise "(#{intro(:unwrapped)}).#{message}#{format_args(args)}\n #{expected_part}\n #{received_part}", backtrace_line, source_id - end - # rubocop:enable Metrics/ParameterLists - - # @private - def raise_unimplemented_error(doubled_module, method_name, object) - message = case object - when InstanceVerifyingDouble - "the %s class does not implement the instance method: %s".dup << - if ObjectMethodReference.for(doubled_module, method_name).implemented? - ". Perhaps you meant to use `class_double` instead?" - else - "" - end - when ClassVerifyingDouble - "the %s class does not implement the class method: %s".dup << - if InstanceMethodReference.for(doubled_module, method_name).implemented? - ". Perhaps you meant to use `instance_double` instead?" - else - "" - end - else - "%s does not implement: %s" - end - - __raise message % [doubled_module.description, method_name] - end - - # @private - def raise_non_public_error(method_name, visibility) - raise NoMethodError, "%s method `%s' called on %s" % [ - visibility, method_name, intro - ] - end - - # @private - def raise_invalid_arguments_error(verifier) - __raise verifier.error_message - end - - # @private - def raise_expired_test_double_error - raise ExpiredTestDoubleError, - "#{intro} was originally created in one example but has leaked into " \ - "another example and can no longer be used. rspec-mocks' doubles are " \ - "designed to only last for one example, and you need to create a new " \ - "one in each example you wish to use it for." - end - - # @private - def describe_expectation(verb, message, expected_received_count, _actual_received_count, args) - "#{verb} #{message}#{format_args(args)} #{count_message(expected_received_count)}" - end - - # @private - def raise_out_of_order_error(message) - __raise "#{intro} received :#{message} out of order" - end - - # @private - def raise_missing_block_error(args_to_yield) - __raise "#{intro} asked to yield |#{arg_list(args_to_yield)}| but no block was passed" - end - - # @private - def raise_wrong_arity_error(args_to_yield, signature) - __raise "#{intro} yielded |#{arg_list(args_to_yield)}| to block with #{signature.description}" - end - - # @private - def raise_only_valid_on_a_partial_double(method) - __raise "#{intro} is a pure test double. `#{method}` is only " \ - "available on a partial double." - end - - # @private - def raise_expectation_on_unstubbed_method(method) - __raise "#{intro} expected to have received #{method}, but that " \ - "object is not a spy or method has not been stubbed." - end - - # @private - def raise_expectation_on_mocked_method(method) - __raise "#{intro} expected to have received #{method}, but that " \ - "method has been mocked instead of stubbed or spied." - end - - # @private - def raise_double_negation_error(wrapped_expression) - __raise "Isn't life confusing enough? You've already set a " \ - "negative message expectation and now you are trying to " \ - "negate it again with `never`. What does an expression like " \ - "`#{wrapped_expression}.not_to receive(:msg).never` even mean?" - end - - # @private - def raise_verifying_double_not_defined_error(ref) - notify(VerifyingDoubleNotDefinedError.new( - "#{ref.description.inspect} is not a defined constant. " \ - "Perhaps you misspelt it? " \ - "Disable check with `verify_doubled_constant_names` configuration option." - )) - end - - # @private - def raise_have_received_disallowed(type, reason) - __raise "Using #{type}(...) with the `have_received` " \ - "matcher is not supported#{reason}." - end - - # @private - def raise_cant_constrain_count_for_negated_have_received_error(count_constraint) - __raise "can't use #{count_constraint} when negative" - end - - # @private - def raise_method_not_stubbed_error(method_name) - __raise "The method `#{method_name}` was not stubbed or was already unstubbed" - end - - # @private - def raise_already_invoked_error(message, calling_customization) - error_message = "The message expectation for #{intro}.#{message} has already been invoked " \ - "and cannot be modified further (e.g. using `#{calling_customization}`). All message expectation " \ - "customizations must be applied before it is used for the first time." - - notify MockExpectationAlreadyInvokedError.new(error_message) - end - - def raise_expectation_on_nil_error(method_name) - __raise expectation_on_nil_message(method_name) - end - - def expectation_on_nil_message(method_name) - "An expectation of `:#{method_name}` was set on `nil`. " \ - "To allow expectations on `nil` and suppress this message, set `RSpec::Mocks.configuration.allow_message_expectations_on_nil` to `true`. " \ - "To disallow expectations on `nil`, set `RSpec::Mocks.configuration.allow_message_expectations_on_nil` to `false`" - end - - # @private - def intro(unwrapped=false) - case @target - when TestDouble then TestDoubleFormatter.format(@target, unwrapped) - when Class then - formatted = "#{@target.inspect} (class)" - return formatted if unwrapped - "#<#{formatted}>" - when NilClass then "nil" - else @target.inspect - end - end - - # @private - def method_call_args_description(args, generic_prefix=" with arguments: ", matcher_prefix=" with ") - case args.first - when ArgumentMatchers::AnyArgsMatcher then "#{matcher_prefix}any arguments" - when ArgumentMatchers::NoArgsMatcher then "#{matcher_prefix}no arguments" - else - if yield - "#{generic_prefix}#{format_args(args)}" - else - "" - end - end - end - - private - - def received_part_of_expectation_error(actual_received_count, args) - "received: #{count_message(actual_received_count)}" + - method_call_args_description(args) do - actual_received_count > 0 && args.length > 0 - end - end - - def expected_part_of_expectation_error(expected_received_count, expectation_count_type, argument_list_matcher) - "expected: #{count_message(expected_received_count, expectation_count_type)}" + - method_call_args_description(argument_list_matcher.expected_args) do - argument_list_matcher.expected_args.length > 0 - end - end - - def unexpected_arguments_message(expected_args_string, actual_args_string) - "with unexpected arguments\n expected: #{expected_args_string}\n got: #{actual_args_string}" - end - - def error_message(expectation, args_for_multiple_calls) - expected_args = format_args(expectation.expected_args) - actual_args = format_received_args(args_for_multiple_calls) - - if RSpec::Support::RubyFeatures.distincts_kw_args_from_positional_hash? - expected_hash = expectation.expected_args.last - actual_hash = args_for_multiple_calls.last.last - if Hash === expected_hash && Hash === actual_hash && - (Hash.ruby2_keywords_hash?(expected_hash) != Hash.ruby2_keywords_hash?(actual_hash)) - - actual_description = Hash.ruby2_keywords_hash?(actual_hash) ? " (keyword arguments)" : " (options hash)" - expected_description = Hash.ruby2_keywords_hash?(expected_hash) ? " (keyword arguments)" : " (options hash)" - - if actual_description != expected_description - actual_args += actual_description - expected_args += expected_description - end - end - end - - message = default_error_message(expectation, expected_args, actual_args) - - if args_for_multiple_calls.one? - diff = diff_message(expectation.expected_args, args_for_multiple_calls.first) - if RSpec::Mocks.configuration.color? - message << "\nDiff:#{diff}" unless diff.gsub(/\e\[\d+m/, '').strip.empty? - else - message << "\nDiff:#{diff}" unless diff.strip.empty? - end - end - - message - end - - def diff_message(expected_args, actual_args) - formatted_expected_args = expected_args.map do |x| - RSpec::Support.rspec_description_for_object(x) - end - - formatted_expected_args, actual_args = unpack_string_args(formatted_expected_args, actual_args) - - differ.diff(actual_args, formatted_expected_args) - end - - def unpack_string_args(formatted_expected_args, actual_args) - if [formatted_expected_args, actual_args].all? { |x| list_of_exactly_one_string?(x) } - [formatted_expected_args.first, actual_args.first] - else - [formatted_expected_args, actual_args] - end - end - - def list_of_exactly_one_string?(args) - Array === args && args.count == 1 && String === args.first - end - - def differ - RSpec::Support::Differ.new(:color => RSpec::Mocks.configuration.color?) - end - - def __raise(message, backtrace_line=nil, source_id=nil) - message = opts[:message] unless opts[:message].nil? - exception = RSpec::Mocks::MockExpectationError.new(message) - prepend_to_backtrace(exception, backtrace_line) if backtrace_line - notify exception, :source_id => source_id - end - - if RSpec::Support::Ruby.jruby? - def prepend_to_backtrace(exception, line) - raise exception - rescue RSpec::Mocks::MockExpectationError => with_backtrace - with_backtrace.backtrace.unshift(line) - end - else - def prepend_to_backtrace(exception, line) - exception.set_backtrace(caller.unshift line) - end - end - - def notify(*args) - RSpec::Support.notify_failure(*args) - end - - def format_args(args) - return "(no args)" if args.empty? - "(#{arg_list(args)})" - end - - def arg_list(args) - args.map { |arg| RSpec::Support::ObjectFormatter.format(arg) }.join(", ") - end - - def format_received_args(args_for_multiple_calls) - grouped_args(args_for_multiple_calls).map do |args_for_one_call, index| - "#{format_args(args_for_one_call)}#{group_count(index, args_for_multiple_calls)}" - end.join("\n ") - end - - def count_message(count, expectation_count_type=nil) - return "at least #{times(count.abs)}" if count < 0 || expectation_count_type == :at_least - return "at most #{times(count)}" if expectation_count_type == :at_most - times(count) - end - - def times(count) - "#{count} time#{count == 1 ? '' : 's'}" - end - - def grouped_args(args) - Hash[args.group_by { |x| x }.map { |k, v| [k, v.count] }] - end - - def group_count(index, args) - " (#{times(index)})" if args.size > 1 || index > 1 - end - end - - # @private - def self.error_generator - @error_generator ||= ErrorGenerator.new - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/example_methods.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/example_methods.rb deleted file mode 100644 index 5531b28..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/example_methods.rb +++ /dev/null @@ -1,434 +0,0 @@ -RSpec::Support.require_rspec_mocks 'object_reference' - -module RSpec - module Mocks - # Contains methods intended to be used from within code examples. - # Mix this in to your test context (such as a test framework base class) - # to use rspec-mocks with your test framework. If you're using rspec-core, - # it'll take care of doing this for you. - module ExampleMethods - include RSpec::Mocks::ArgumentMatchers - - # @overload double() - # @overload double(name) - # @param name [String/Symbol] name or description to be used in failure messages - # @overload double(stubs) - # @param stubs (Hash) hash of message/return-value pairs - # @overload double(name, stubs) - # @param name [String/Symbol] name or description to be used in failure messages - # @param stubs (Hash) hash of message/return-value pairs - # @return (Double) - # - # Constructs an instance of [RSpec::Mocks::Double](RSpec::Mocks::Double) configured - # with an optional name, used for reporting in failure messages, and an optional - # hash of message/return-value pairs. - # - # @example - # book = double("book", :title => "The RSpec Book") - # book.title #=> "The RSpec Book" - # - # card = double("card", :suit => "Spades", :rank => "A") - # card.suit #=> "Spades" - # card.rank #=> "A" - # - def double(*args) - ExampleMethods.declare_double(Double, *args) - end - - # @overload instance_double(doubled_class) - # @param doubled_class [String, Class] - # @overload instance_double(doubled_class, name) - # @param doubled_class [String, Class] - # @param name [String/Symbol] name or description to be used in failure messages - # @overload instance_double(doubled_class, stubs) - # @param doubled_class [String, Class] - # @param stubs [Hash] hash of message/return-value pairs - # @overload instance_double(doubled_class, name, stubs) - # @param doubled_class [String, Class] - # @param name [String/Symbol] name or description to be used in failure messages - # @param stubs [Hash] hash of message/return-value pairs - # @return InstanceVerifyingDouble - # - # Constructs a test double against a specific class. If the given class - # name has been loaded, only instance methods defined on the class are - # allowed to be stubbed. In all other ways it behaves like a - # [double](double). - def instance_double(doubled_class, *args) - ref = ObjectReference.for(doubled_class) - ExampleMethods.declare_verifying_double(InstanceVerifyingDouble, ref, *args) - end - - # @overload class_double(doubled_class) - # @param doubled_class [String, Module] - # @overload class_double(doubled_class, name) - # @param doubled_class [String, Module] - # @param name [String/Symbol] name or description to be used in failure messages - # @overload class_double(doubled_class, stubs) - # @param doubled_class [String, Module] - # @param stubs [Hash] hash of message/return-value pairs - # @overload class_double(doubled_class, name, stubs) - # @param doubled_class [String, Module] - # @param name [String/Symbol] name or description to be used in failure messages - # @param stubs [Hash] hash of message/return-value pairs - # @return ClassVerifyingDouble - # - # Constructs a test double against a specific class. If the given class - # name has been loaded, only class methods defined on the class are - # allowed to be stubbed. In all other ways it behaves like a - # [double](double). - def class_double(doubled_class, *args) - ref = ObjectReference.for(doubled_class) - ExampleMethods.declare_verifying_double(ClassVerifyingDouble, ref, *args) - end - - # @overload object_double(object_or_name) - # @param object_or_name [String, Object] - # @overload object_double(object_or_name, name) - # @param object_or_name [String, Object] - # @param name [String/Symbol] name or description to be used in failure messages - # @overload object_double(object_or_name, stubs) - # @param object_or_name [String, Object] - # @param stubs [Hash] hash of message/return-value pairs - # @overload object_double(object_or_name, name, stubs) - # @param object_or_name [String, Object] - # @param name [String/Symbol] name or description to be used in failure messages - # @param stubs [Hash] hash of message/return-value pairs - # @return ObjectVerifyingDouble - # - # Constructs a test double against a specific object. Only the methods - # the object responds to are allowed to be stubbed. If a String argument - # is provided, it is assumed to reference a constant object which is used - # for verification. In all other ways it behaves like a [double](double). - def object_double(object_or_name, *args) - ref = ObjectReference.for(object_or_name, :allow_direct_object_refs) - ExampleMethods.declare_verifying_double(ObjectVerifyingDouble, ref, *args) - end - - # @overload spy() - # @overload spy(name) - # @param name [String/Symbol] name or description to be used in failure messages - # @overload spy(stubs) - # @param stubs (Hash) hash of message/return-value pairs - # @overload spy(name, stubs) - # @param name [String/Symbol] name or description to be used in failure messages - # @param stubs (Hash) hash of message/return-value pairs - # @return (Double) - # - # Constructs a test double that is optimized for use with - # `have_received`. With a normal double one has to stub methods in order - # to be able to spy them. A spy automatically spies on all methods. - def spy(*args) - double(*args).as_null_object - end - - # @overload instance_spy(doubled_class) - # @param doubled_class [String, Class] - # @overload instance_spy(doubled_class, name) - # @param doubled_class [String, Class] - # @param name [String/Symbol] name or description to be used in failure messages - # @overload instance_spy(doubled_class, stubs) - # @param doubled_class [String, Class] - # @param stubs [Hash] hash of message/return-value pairs - # @overload instance_spy(doubled_class, name, stubs) - # @param doubled_class [String, Class] - # @param name [String/Symbol] name or description to be used in failure messages - # @param stubs [Hash] hash of message/return-value pairs - # @return InstanceVerifyingDouble - # - # Constructs a test double that is optimized for use with `have_received` - # against a specific class. If the given class name has been loaded, only - # instance methods defined on the class are allowed to be stubbed. With - # a normal double one has to stub methods in order to be able to spy - # them. An instance_spy automatically spies on all instance methods to - # which the class responds. - def instance_spy(*args) - instance_double(*args).as_null_object - end - - # @overload object_spy(object_or_name) - # @param object_or_name [String, Object] - # @overload object_spy(object_or_name, name) - # @param object_or_name [String, Class] - # @param name [String/Symbol] name or description to be used in failure messages - # @overload object_spy(object_or_name, stubs) - # @param object_or_name [String, Object] - # @param stubs [Hash] hash of message/return-value pairs - # @overload object_spy(object_or_name, name, stubs) - # @param object_or_name [String, Class] - # @param name [String/Symbol] name or description to be used in failure messages - # @param stubs [Hash] hash of message/return-value pairs - # @return ObjectVerifyingDouble - # - # Constructs a test double that is optimized for use with `have_received` - # against a specific object. Only instance methods defined on the object - # are allowed to be stubbed. With a normal double one has to stub - # methods in order to be able to spy them. An object_spy automatically - # spies on all methods to which the object responds. - def object_spy(*args) - object_double(*args).as_null_object - end - - # @overload class_spy(doubled_class) - # @param doubled_class [String, Module] - # @overload class_spy(doubled_class, name) - # @param doubled_class [String, Class] - # @param name [String/Symbol] name or description to be used in failure messages - # @overload class_spy(doubled_class, stubs) - # @param doubled_class [String, Module] - # @param stubs [Hash] hash of message/return-value pairs - # @overload class_spy(doubled_class, name, stubs) - # @param doubled_class [String, Class] - # @param name [String/Symbol] name or description to be used in failure messages - # @param stubs [Hash] hash of message/return-value pairs - # @return ClassVerifyingDouble - # - # Constructs a test double that is optimized for use with `have_received` - # against a specific class. If the given class name has been loaded, - # only class methods defined on the class are allowed to be stubbed. - # With a normal double one has to stub methods in order to be able to spy - # them. An class_spy automatically spies on all class methods to which the - # class responds. - def class_spy(*args) - class_double(*args).as_null_object - end - - # Disables warning messages about expectations being set on nil. - # - # By default warning messages are issued when expectations are set on - # nil. This is to prevent false-positives and to catch potential bugs - # early on. - # @deprecated Use {RSpec::Mocks::Configuration#allow_message_expectations_on_nil} instead. - def allow_message_expectations_on_nil - RSpec::Mocks.space.proxy_for(nil).warn_about_expectations = false - end - - # Stubs the named constant with the given value. - # Like method stubs, the constant will be restored - # to its original value (or lack of one, if it was - # undefined) when the example completes. - # - # @param constant_name [String] The fully qualified name of the constant. The current - # constant scoping at the point of call is not considered. - # @param value [Object] The value to make the constant refer to. When the - # example completes, the constant will be restored to its prior state. - # @param options [Hash] Stubbing options. - # @option options :transfer_nested_constants [Boolean, Array] Determines - # what nested constants, if any, will be transferred from the original value - # of the constant to the new value of the constant. This only works if both - # the original and new values are modules (or classes). - # @return [Object] the stubbed value of the constant - # - # @example - # stub_const("MyClass", Class.new) # => Replaces (or defines) MyClass with a new class object. - # stub_const("SomeModel::PER_PAGE", 5) # => Sets SomeModel::PER_PAGE to 5. - # - # class CardDeck - # SUITS = [:Spades, :Diamonds, :Clubs, :Hearts] - # NUM_CARDS = 52 - # end - # - # stub_const("CardDeck", Class.new) - # CardDeck::SUITS # => uninitialized constant error - # CardDeck::NUM_CARDS # => uninitialized constant error - # - # stub_const("CardDeck", Class.new, :transfer_nested_constants => true) - # CardDeck::SUITS # => our suits array - # CardDeck::NUM_CARDS # => 52 - # - # stub_const("CardDeck", Class.new, :transfer_nested_constants => [:SUITS]) - # CardDeck::SUITS # => our suits array - # CardDeck::NUM_CARDS # => uninitialized constant error - def stub_const(constant_name, value, options={}) - ConstantMutator.stub(constant_name, value, options) - end - - # Hides the named constant with the given value. The constant will be - # undefined for the duration of the test. - # - # Like method stubs, the constant will be restored to its original value - # when the example completes. - # - # @param constant_name [String] The fully qualified name of the constant. - # The current constant scoping at the point of call is not considered. - # - # @example - # hide_const("MyClass") # => MyClass is now an undefined constant - def hide_const(constant_name) - ConstantMutator.hide(constant_name) - end - - # Verifies that the given object received the expected message during the - # course of the test. On a spy objects or as null object doubles this - # works for any method, on other objects the method must have - # been stubbed beforehand in order for messages to be verified. - # - # Stubbing and verifying messages received in this way implements the - # Test Spy pattern. - # - # @param method_name [Symbol] name of the method expected to have been - # called. - # - # @example - # invitation = double('invitation', accept: true) - # user.accept_invitation(invitation) - # expect(invitation).to have_received(:accept) - # - # # You can also use most message expectations: - # expect(invitation).to have_received(:accept).with(mailer).once - # - # @note `have_received(...).with(...)` is unable to work properly when - # passed arguments are mutated after the spy records the received message. - def have_received(method_name, &block) - Matchers::HaveReceived.new(method_name, &block) - end - - # Turns off the verifying of partial doubles for the duration of the - # block, this is useful in situations where methods are defined at run - # time and you wish to define stubs for them but not turn off partial - # doubles for the entire run suite. (e.g. view specs in rspec-rails). - def without_partial_double_verification - original_state = Mocks.configuration.temporarily_suppress_partial_double_verification - Mocks.configuration.temporarily_suppress_partial_double_verification = true - yield - ensure - Mocks.configuration.temporarily_suppress_partial_double_verification = original_state - end - - # @method expect - # Used to wrap an object in preparation for setting a mock expectation - # on it. - # - # @example - # expect(obj).to receive(:foo).with(5).and_return(:return_value) - # - # @note This method is usually provided by rspec-expectations. However, - # if you use rspec-mocks without rspec-expectations, there's a definition - # of it that is made available here. If you disable the `:expect` syntax - # this method will be undefined. - - # @method allow - # Used to wrap an object in preparation for stubbing a method - # on it. - # - # @example - # allow(dbl).to receive(:foo).with(5).and_return(:return_value) - # - # @note If you disable the `:expect` syntax this method will be undefined. - - # @method expect_any_instance_of - # Used to wrap a class in preparation for setting a mock expectation - # on instances of it. - # - # @example - # expect_any_instance_of(MyClass).to receive(:foo) - # - # @note If you disable the `:expect` syntax this method will be undefined. - - # @method allow_any_instance_of - # Used to wrap a class in preparation for stubbing a method - # on instances of it. - # - # @example - # allow_any_instance_of(MyClass).to receive(:foo) - # - # @note This is only available when you have enabled the `expect` syntax. - - # @method receive - # Used to specify a message that you expect or allow an object - # to receive. The object returned by `receive` supports the same - # fluent interface that `should_receive` and `stub` have always - # supported, allowing you to constrain the arguments or number of - # times, and configure how the object should respond to the message. - # - # @example - # expect(obj).to receive(:hello).with("world").exactly(3).times - # - # @note If you disable the `:expect` syntax this method will be undefined. - - # @method receive_messages - # Shorthand syntax used to setup message(s), and their return value(s), - # that you expect or allow an object to receive. The method takes a hash - # of messages and their respective return values. Unlike with `receive`, - # you cannot apply further customizations using a block or the fluent - # interface. - # - # @example - # allow(obj).to receive_messages(:speak => "Hello World") - # allow(obj).to receive_messages(:speak => "Hello", :meow => "Meow") - # - # @note If you disable the `:expect` syntax this method will be undefined. - - # @method receive_message_chain - # @overload receive_message_chain(method1, method2) - # @overload receive_message_chain("method1.method2") - # @overload receive_message_chain(method1, method_to_value_hash) - # - # stubs/mocks a chain of messages on an object or test double. - # - # ## Warning: - # - # Chains can be arbitrarily long, which makes it quite painless to - # violate the Law of Demeter in violent ways, so you should consider any - # use of `receive_message_chain` a code smell. Even though not all code smells - # indicate real problems (think fluent interfaces), `receive_message_chain` still - # results in brittle examples. For example, if you write - # `allow(foo).to receive_message_chain(:bar, :baz => 37)` in a spec and then the - # implementation calls `foo.baz.bar`, the stub will not work. - # - # @example - # allow(double).to receive_message_chain("foo.bar") { :baz } - # allow(double).to receive_message_chain(:foo, :bar => :baz) - # allow(double).to receive_message_chain(:foo, :bar) { :baz } - # - # # Given any of ^^ these three forms ^^: - # double.foo.bar # => :baz - # - # # Common use in Rails/ActiveRecord: - # allow(Article).to receive_message_chain("recent.published") { [Article.new] } - # - # @note If you disable the `:expect` syntax this method will be undefined. - - # @private - def self.included(klass) - klass.class_exec do - # This gets mixed in so that if `RSpec::Matchers` is included in - # `klass` later, its definition of `expect` will take precedence. - include ExpectHost unless method_defined?(:expect) - end - end - - # @private - def self.extended(object) - # This gets extended in so that if `RSpec::Matchers` is included in - # `klass` later, its definition of `expect` will take precedence. - object.extend ExpectHost unless object.respond_to?(:expect) - end - - # @private - def self.declare_verifying_double(type, ref, *args) - if RSpec::Mocks.configuration.verify_doubled_constant_names? && - !ref.defined? - - RSpec::Mocks.error_generator.raise_verifying_double_not_defined_error(ref) - end - - RSpec::Mocks.configuration.verifying_double_callbacks.each do |block| - block.call(ref) - end - - declare_double(type, ref, *args) - end - - # @private - def self.declare_double(type, *args) - args << {} unless Hash === args.last - type.new(*args) - end - - # This module exists to host the `expect` method for cases where - # rspec-mocks is used w/o rspec-expectations. - module ExpectHost - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/instance_method_stasher.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/instance_method_stasher.rb deleted file mode 100644 index 12edec2..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/instance_method_stasher.rb +++ /dev/null @@ -1,146 +0,0 @@ -module RSpec - module Mocks - # @private - class InstanceMethodStasher - def initialize(object, method) - @object = object - @method = method - @klass = (class << object; self; end) - - @original_method = nil - @method_is_stashed = false - end - - attr_reader :original_method - - if RUBY_VERSION.to_f < 1.9 - # @private - def method_is_stashed? - @method_is_stashed - end - - # @private - def stash - return if !method_defined_directly_on_klass? || @method_is_stashed - - @klass.__send__(:alias_method, stashed_method_name, @method) - @method_is_stashed = true - end - - # @private - def stashed_method_name - "obfuscated_by_rspec_mocks__#{@method}" - end - - # @private - def restore - return unless @method_is_stashed - - if @klass.__send__(:method_defined?, @method) - @klass.__send__(:undef_method, @method) - end - @klass.__send__(:alias_method, @method, stashed_method_name) - @klass.__send__(:remove_method, stashed_method_name) - @method_is_stashed = false - end - else - - # @private - def method_is_stashed? - !!@original_method - end - - # @private - def stash - return unless method_defined_directly_on_klass? - @original_method ||= ::RSpec::Support.method_handle_for(@object, @method) - @klass.__send__(:undef_method, @method) - end - - # @private - def restore - return unless @original_method - - if @klass.__send__(:method_defined?, @method) - @klass.__send__(:undef_method, @method) - end - - handle_restoration_failures do - @klass.__send__(:define_method, @method, @original_method) - end - - @original_method = nil - end - end - - if RUBY_DESCRIPTION.include?('2.0.0p247') || RUBY_DESCRIPTION.include?('2.0.0p195') - # ruby 2.0.0-p247 and 2.0.0-p195 both have a bug that we can't work around :(. - # https://bugs.ruby-lang.org/issues/8686 - def handle_restoration_failures - yield - rescue TypeError - RSpec.warn_with( - "RSpec failed to properly restore a partial double (#{@object.inspect}) " \ - "to its original state due to a known bug in MRI 2.0.0-p195 & p247 " \ - "(https://bugs.ruby-lang.org/issues/8686). This object may remain " \ - "screwed up for the rest of this process. Please upgrade to 2.0.0-p353 or above.", - :call_site => nil, :use_spec_location_as_call_site => true - ) - end - else - def handle_restoration_failures - # No known reasons for restoration to fail on other rubies. - yield - end - end - - private - - # @private - def method_defined_directly_on_klass? - method_defined_on_klass? && method_owned_by_klass? - end - - # @private - def method_defined_on_klass?(klass=@klass) - MethodReference.method_defined_at_any_visibility?(klass, @method) - end - - def method_owned_by_klass? - owner = @klass.instance_method(@method).owner - - # On Ruby 2.0.0+ the owner of a method on a class which has been - # `prepend`ed may actually be an instance, e.g. - # `#`, rather than the expected `MyClass`. - owner = owner.class unless Module === owner - - # On some 1.9s (e.g. rubinius) aliased methods - # can report the wrong owner. Example: - # class MyClass - # class << self - # alias alternate_new new - # end - # end - # - # MyClass.owner(:alternate_new) returns `Class` when incorrect, - # but we need to consider the owner to be `MyClass` because - # it is not actually available on `Class` but is on `MyClass`. - # Hence, we verify that the owner actually has the method defined. - # If the given owner does not have the method defined, we assume - # that the method is actually owned by @klass. - # - # On 1.8, aliased methods can also report the wrong owner. Example: - # module M - # def a; end - # module_function :a - # alias b a - # module_function :b - # end - # The owner of M.b is the raw Module object, instead of the expected - # singleton class of the module - return true if RUBY_VERSION < '1.9' && owner == @object - owner == @klass || !(method_defined_on_klass?(owner)) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/marshal_extension.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/marshal_extension.rb deleted file mode 100644 index cfa9c1a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/marshal_extension.rb +++ /dev/null @@ -1,41 +0,0 @@ -module RSpec - module Mocks - # Support for `patch_marshal_to_support_partial_doubles` configuration. - # - # @private - class MarshalExtension - def self.patch! - return if Marshal.respond_to?(:dump_with_rspec_mocks) - - Marshal.instance_eval do - class << self - def dump_with_rspec_mocks(object, *rest) - if !::RSpec::Mocks.space.registered?(object) || NilClass === object - dump_without_rspec_mocks(object, *rest) - else - dump_without_rspec_mocks(object.dup, *rest) - end - end - - alias_method :dump_without_rspec_mocks, :dump - undef_method :dump - alias_method :dump, :dump_with_rspec_mocks - end - end - end - - def self.unpatch! - return unless Marshal.respond_to?(:dump_with_rspec_mocks) - - Marshal.instance_eval do - class << self - undef_method :dump_with_rspec_mocks - undef_method :dump - alias_method :dump, :dump_without_rspec_mocks - undef_method :dump_without_rspec_mocks - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/expectation_customization.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/expectation_customization.rb deleted file mode 100644 index 81e6427..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/expectation_customization.rb +++ /dev/null @@ -1,20 +0,0 @@ -module RSpec - module Mocks - module Matchers - # @private - class ExpectationCustomization - attr_accessor :block - - def initialize(method_name, args, block) - @method_name = method_name - @args = args - @block = block - end - - def playback_onto(expectation) - expectation.__send__(@method_name, *@args, &@block) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/have_received.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/have_received.rb deleted file mode 100644 index cf4852b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/have_received.rb +++ /dev/null @@ -1,134 +0,0 @@ -module RSpec - module Mocks - module Matchers - # @private - class HaveReceived - include Matcher - - COUNT_CONSTRAINTS = %w[exactly at_least at_most times time once twice thrice] - ARGS_CONSTRAINTS = %w[with] - CONSTRAINTS = COUNT_CONSTRAINTS + ARGS_CONSTRAINTS + %w[ordered] - - def initialize(method_name, &block) - @method_name = method_name - @block = block - @constraints = [] - @subject = nil - end - - def matcher_name - "have_received" - end - - def matches?(subject, &block) - @block ||= block - @subject = subject - @expectation = expect - mock_proxy.ensure_implemented(@method_name) - - expected_messages_received_in_order? - end - - def does_not_match?(subject) - @subject = subject - ensure_count_unconstrained - @expectation = expect.never - mock_proxy.ensure_implemented(@method_name) - expected_messages_received_in_order? - end - - def failure_message - capture_failure_message - end - - def failure_message_when_negated - capture_failure_message - end - - def description - (@expectation ||= expect).description_for("have received") - end - - CONSTRAINTS.each do |expectation| - define_method expectation do |*args| - @constraints << [expectation, *args] - self - end - end - - def setup_expectation(subject, &block) - notify_failure_message unless matches?(subject, &block) - end - - def setup_negative_expectation(subject, &block) - notify_failure_message unless does_not_match?(subject, &block) - end - - def setup_allowance(_subject, &_block) - disallow("allow", " as it would have no effect") - end - - def setup_any_instance_allowance(_subject, &_block) - disallow("allow_any_instance_of") - end - - def setup_any_instance_expectation(_subject, &_block) - disallow("expect_any_instance_of") - end - - def setup_any_instance_negative_expectation(_subject, &_block) - disallow("expect_any_instance_of") - end - - private - - def disallow(type, reason="") - RSpec::Mocks.error_generator.raise_have_received_disallowed(type, reason) - end - - def expect - expectation = mock_proxy.build_expectation(@method_name) - apply_constraints_to expectation - expectation - end - - def apply_constraints_to(expectation) - @constraints.each do |constraint| - expectation.send(*constraint) - end - end - - def ensure_count_unconstrained - return unless count_constraint - RSpec::Mocks.error_generator.raise_cant_constrain_count_for_negated_have_received_error(count_constraint) - end - - def count_constraint - @constraints.map(&:first).find do |constraint| - COUNT_CONSTRAINTS.include?(constraint) - end - end - - def capture_failure_message - RSpec::Support.with_failure_notifier(Proc.new { |err, _opt| return err.message }) do - notify_failure_message - end - end - - def notify_failure_message - mock_proxy.check_for_unexpected_arguments(@expectation) - @expectation.generate_error - end - - def expected_messages_received_in_order? - mock_proxy.replay_received_message_on @expectation, &@block - @expectation.expected_messages_received? && @expectation.ensure_expected_ordering_received! - end - - def mock_proxy - RSpec::Mocks.space.proxy_for(@subject) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive.rb deleted file mode 100644 index ee95830..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive.rb +++ /dev/null @@ -1,134 +0,0 @@ -RSpec::Support.require_rspec_mocks 'matchers/expectation_customization' - -module RSpec - module Mocks - module Matchers - # @private - class Receive - include Matcher - - def initialize(message, block) - @message = message - @block = block - @recorded_customizations = [] - end - - def matcher_name - "receive" - end - - def description - describable.description_for("receive") - end - - def setup_expectation(subject, &block) - warn_if_any_instance("expect", subject) - @describable = setup_mock_proxy_method_substitute(subject, :add_message_expectation, block) - end - alias matches? setup_expectation - - def setup_negative_expectation(subject, &block) - # ensure `never` goes first for cases like `never.and_return(5)`, - # where `and_return` is meant to raise an error - @recorded_customizations.unshift ExpectationCustomization.new(:never, [], nil) - - warn_if_any_instance("expect", subject) - - setup_expectation(subject, &block) - end - alias does_not_match? setup_negative_expectation - - def setup_allowance(subject, &block) - warn_if_any_instance("allow", subject) - setup_mock_proxy_method_substitute(subject, :add_stub, block) - end - - def setup_any_instance_expectation(subject, &block) - setup_any_instance_method_substitute(subject, :should_receive, block) - end - - def setup_any_instance_negative_expectation(subject, &block) - setup_any_instance_method_substitute(subject, :should_not_receive, block) - end - - def setup_any_instance_allowance(subject, &block) - setup_any_instance_method_substitute(subject, :stub, block) - end - - own_methods = (instance_methods - superclass.instance_methods) - MessageExpectation.public_instance_methods(false).each do |method| - next if own_methods.include?(method) - - define_method(method) do |*args, &block| - @recorded_customizations << ExpectationCustomization.new(method, args, block) - self - end - ruby2_keywords(method) if respond_to?(:ruby2_keywords, true) - end - - private - - def describable - @describable ||= DefaultDescribable.new(@message) - end - - def warn_if_any_instance(expression, subject) - return unless AnyInstance::Proxy === subject - - RSpec.warning( - "`#{expression}(#{subject.klass}.any_instance).to` " \ - "is probably not what you meant, it does not operate on " \ - "any instance of `#{subject.klass}`. " \ - "Use `#{expression}_any_instance_of(#{subject.klass}).to` instead." - ) - end - - def setup_mock_proxy_method_substitute(subject, method, block) - proxy = ::RSpec::Mocks.space.proxy_for(subject) - setup_method_substitute(proxy, method, block) - end - - def setup_any_instance_method_substitute(subject, method, block) - proxy = ::RSpec::Mocks.space.any_instance_proxy_for(subject) - setup_method_substitute(proxy, method, block) - end - - def setup_method_substitute(host, method, block, *args) - args << @message.to_sym - block = move_block_to_last_customization(block) - - expectation = host.__send__(method, *args, &(@block || block)) - - @recorded_customizations.each do |customization| - customization.playback_onto(expectation) - end - expectation - end - - def move_block_to_last_customization(block) - last = @recorded_customizations.last - return block unless last - - last.block ||= block - nil - end - - # MessageExpectation objects are able to describe themselves in detail. - # We use this as a fall back when a MessageExpectation is not available. - # @private - class DefaultDescribable - def initialize(message) - @message = message - end - - # This is much simpler for the `any_instance` case than what the - # user may want, but I'm not up for putting a bunch of effort - # into full descriptions for `any_instance` expectations at this point :(. - def description_for(verb) - "#{verb} #{@message}" - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive_message_chain.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive_message_chain.rb deleted file mode 100644 index fdc89f9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive_message_chain.rb +++ /dev/null @@ -1,82 +0,0 @@ -RSpec::Support.require_rspec_mocks 'matchers/expectation_customization' - -module RSpec - module Mocks - module Matchers - # @private - class ReceiveMessageChain - include Matcher - - def initialize(chain, &block) - @chain = chain - @block = block - @recorded_customizations = [] - end - - [:with, :and_return, :and_invoke, :and_throw, :and_raise, :and_yield, :and_call_original].each do |msg| - define_method(msg) do |*args, &block| - @recorded_customizations << ExpectationCustomization.new(msg, args, block) - self - end - end - - def matcher_name - "receive_message_chain" - end - - def description - "receive message chain #{formatted_chain}" - end - - def setup_allowance(subject, &block) - chain = StubChain.stub_chain_on(subject, *@chain, &(@block || block)) - replay_customizations(chain) - end - - def setup_any_instance_allowance(subject, &block) - proxy = ::RSpec::Mocks.space.any_instance_proxy_for(subject) - chain = proxy.stub_chain(*@chain, &(@block || block)) - replay_customizations(chain) - end - - def setup_any_instance_expectation(subject, &block) - proxy = ::RSpec::Mocks.space.any_instance_proxy_for(subject) - chain = proxy.expect_chain(*@chain, &(@block || block)) - replay_customizations(chain) - end - - def setup_expectation(subject, &block) - chain = ExpectChain.expect_chain_on(subject, *@chain, &(@block || block)) - replay_customizations(chain) - end - - def setup_negative_expectation(*_args) - raise NegationUnsupportedError, - "`expect(...).not_to receive_message_chain` is not supported " \ - "since it doesn't really make sense. What would it even mean?" - end - - alias matches? setup_expectation - alias does_not_match? setup_negative_expectation - - private - - def replay_customizations(chain) - @recorded_customizations.each do |customization| - customization.playback_onto(chain) - end - end - - def formatted_chain - @formatted_chain ||= @chain.map do |part| - if Hash === part - part.keys.first.to_s - else - part.to_s - end - end.join(".") - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive_messages.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive_messages.rb deleted file mode 100644 index 6bf9047..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/matchers/receive_messages.rb +++ /dev/null @@ -1,77 +0,0 @@ -module RSpec - module Mocks - module Matchers - # @private - class ReceiveMessages - include Matcher - - def initialize(message_return_value_hash) - @message_return_value_hash = message_return_value_hash - @backtrace_line = CallerFilter.first_non_rspec_line - end - - def matcher_name - "receive_messages" - end - - def description - "receive messages: #{@message_return_value_hash.inspect}" - end - - def setup_expectation(subject) - warn_about_block if block_given? - each_message_on(proxy_on(subject)) do |host, message, return_value| - host.add_simple_expectation(message, return_value, @backtrace_line) - end - end - alias matches? setup_expectation - - def setup_negative_expectation(_subject) - raise NegationUnsupportedError, - "`expect(...).to_not receive_messages` is not supported since it " \ - "doesn't really make sense. What would it even mean?" - end - alias does_not_match? setup_negative_expectation - - def setup_allowance(subject) - warn_about_block if block_given? - each_message_on(proxy_on(subject)) do |host, message, return_value| - host.add_simple_stub(message, return_value) - end - end - - def setup_any_instance_expectation(subject) - warn_about_block if block_given? - each_message_on(any_instance_of(subject)) do |host, message, return_value| - host.should_receive(message).and_return(return_value) - end - end - - def setup_any_instance_allowance(subject) - warn_about_block if block_given? - any_instance_of(subject).stub(@message_return_value_hash) - end - - def warn_about_block - raise "Implementation blocks aren't supported with `receive_messages`" - end - - private - - def proxy_on(subject) - ::RSpec::Mocks.space.proxy_for(subject) - end - - def any_instance_of(subject) - ::RSpec::Mocks.space.any_instance_proxy_for(subject) - end - - def each_message_on(host) - @message_return_value_hash.each do |message, value| - yield host, message, value - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/message_chain.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/message_chain.rb deleted file mode 100644 index 907d14b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/message_chain.rb +++ /dev/null @@ -1,87 +0,0 @@ -module RSpec - module Mocks - # @private - class MessageChain - attr_reader :object, :chain, :block - - def initialize(object, *chain, &blk) - @object = object - @chain, @block = format_chain(*chain, &blk) - end - - # @api private - def setup_chain - if chain.length > 1 - if (matching_stub = find_matching_stub) - chain.shift - chain_on(matching_stub.invoke(nil), *chain, &@block) - elsif (matching_expectation = find_matching_expectation) - chain.shift - chain_on(matching_expectation.invoke_without_incrementing_received_count(nil), *chain, &@block) - else - next_in_chain = Double.new - expectation(object, chain.shift) { next_in_chain } - chain_on(next_in_chain, *chain, &@block) - end - else - expectation(object, chain.shift, &@block) - end - end - - private - - def chain_on(object, *chain, &block) - initialize(object, *chain, &block) - setup_chain - end - - def format_chain(*chain, &blk) - if Hash === chain.last - hash = chain.pop - hash.each do |k, v| - chain << k - blk = Proc.new { v } - end - end - return chain.join('.').split('.'), blk - end - - def find_matching_stub - ::RSpec::Mocks.space.proxy_for(object). - __send__(:find_matching_method_stub, chain.first.to_sym) - end - - def find_matching_expectation - ::RSpec::Mocks.space.proxy_for(object). - __send__(:find_matching_expectation, chain.first.to_sym) - end - end - - # @private - class ExpectChain < MessageChain - # @api private - def self.expect_chain_on(object, *chain, &blk) - new(object, *chain, &blk).setup_chain - end - - private - - def expectation(object, message, &return_block) - ::RSpec::Mocks.expect_message(object, message, {}, &return_block) - end - end - - # @private - class StubChain < MessageChain - def self.stub_chain_on(object, *chain, &blk) - new(object, *chain, &blk).setup_chain - end - - private - - def expectation(object, message, &return_block) - ::RSpec::Mocks.allow_message(object, message, {}, &return_block) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/message_expectation.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/message_expectation.rb deleted file mode 100644 index a478db7..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/message_expectation.rb +++ /dev/null @@ -1,856 +0,0 @@ -RSpec::Support.require_rspec_support 'mutex' - -module RSpec - module Mocks - # A message expectation that only allows concrete return values to be set - # for a message. While this same effect can be achieved using a standard - # MessageExpectation, this version is much faster and so can be used as an - # optimization. - # - # @private - class SimpleMessageExpectation - def initialize(message, response, error_generator, backtrace_line=nil) - @message, @response, @error_generator, @backtrace_line = message.to_sym, response, error_generator, backtrace_line - @received = false - end - - def invoke(*_) - @received = true - @response - end - - def matches?(message, *_) - @message == message.to_sym - end - - def called_max_times? - false - end - - def verify_messages_received - return if @received - @error_generator.raise_expectation_error( - @message, 1, ArgumentListMatcher::MATCH_ALL, 0, nil, [], @backtrace_line - ) - end - - def unadvise(_) - end - end - - # Represents an individual method stub or message expectation. The methods - # defined here can be used to configure how it behaves. The methods return - # `self` so that they can be chained together to form a fluent interface. - class MessageExpectation - # @!group Configuring Responses - - # @overload and_return(value) - # @overload and_return(first_value, second_value) - # - # Tells the object to return a value when it receives the message. Given - # more than one value, the first value is returned the first time the - # message is received, the second value is returned the next time, etc, - # etc. - # - # If the message is received more times than there are values, the last - # value is returned for every subsequent call. - # - # @return [nil] No further chaining is supported after this. - # @example - # allow(counter).to receive(:count).and_return(1) - # counter.count # => 1 - # counter.count # => 1 - # - # allow(counter).to receive(:count).and_return(1,2,3) - # counter.count # => 1 - # counter.count # => 2 - # counter.count # => 3 - # counter.count # => 3 - # counter.count # => 3 - # # etc - def and_return(first_value, *values, &_block) - raise_already_invoked_error_if_necessary(__method__) - if negative? - raise "`and_return` is not supported with negative message expectations" - end - - if block_given? - raise ArgumentError, "Implementation blocks aren't supported with `and_return`" - end - - values.unshift(first_value) - @expected_received_count = [@expected_received_count, values.size].max unless ignoring_args? || (@expected_received_count == 0 && @at_least) - self.terminal_implementation_action = AndReturnImplementation.new(values) - - nil - end - - # Tells the object to invoke a Proc when it receives the message. Given - # more than one value, the result of the first Proc is returned the first - # time the message is received, the result of the second Proc is returned - # the next time, etc, etc. - # - # If the message is received more times than there are Procs, the result of - # the last Proc is returned for every subsequent call. - # - # @return [nil] No further chaining is supported after this. - # @example - # allow(api).to receive(:get_foo).and_invoke(-> { raise ApiTimeout }) - # api.get_foo # => raises ApiTimeout - # api.get_foo # => raises ApiTimeout - # - # allow(api).to receive(:get_foo).and_invoke(-> { raise ApiTimeout }, -> { raise ApiTimeout }, -> { :a_foo }) - # api.get_foo # => raises ApiTimeout - # api.get_foo # => raises ApiTimeout - # api.get_foo # => :a_foo - # api.get_foo # => :a_foo - # api.get_foo # => :a_foo - # # etc - def and_invoke(first_proc, *procs, &_block) - raise_already_invoked_error_if_necessary(__method__) - if negative? - raise "`and_invoke` is not supported with negative message expectations" - end - - if block_given? - raise ArgumentError, "Implementation blocks aren't supported with `and_invoke`" - end - - procs.unshift(first_proc) - if procs.any? { |p| !p.respond_to?(:call) } - raise ArgumentError, "Arguments to `and_invoke` must be callable." - end - - @expected_received_count = [@expected_received_count, procs.size].max unless ignoring_args? || (@expected_received_count == 0 && @at_least) - self.terminal_implementation_action = AndInvokeImplementation.new(procs) - - nil - end - - # Tells the object to delegate to the original unmodified method - # when it receives the message. - # - # @note This is only available on partial doubles. - # - # @return [nil] No further chaining is supported after this. - # @example - # expect(counter).to receive(:increment).and_call_original - # original_count = counter.count - # counter.increment - # expect(counter.count).to eq(original_count + 1) - def and_call_original - block = lambda do |original, *args, &b| - original.call(*args, &b) - end - block = block.ruby2_keywords if block.respond_to?(:ruby2_keywords) - - wrap_original(__method__, &block) - end - - # Decorates the stubbed method with the supplied block. The original - # unmodified method is passed to the block along with any method call - # arguments so you can delegate to it, whilst still being able to - # change what args are passed to it and/or change the return value. - # - # @note This is only available on partial doubles. - # - # @return [nil] No further chaining is supported after this. - # @example - # expect(api).to receive(:large_list).and_wrap_original do |original_method, *args, &block| - # original_method.call(*args, &block).first(10) - # end - def and_wrap_original(&block) - wrap_original(__method__, &block) - end - - # @overload and_raise - # @overload and_raise(ExceptionClass) - # @overload and_raise(ExceptionClass, message) - # @overload and_raise(exception_instance) - # - # Tells the object to raise an exception when the message is received. - # - # @return [nil] No further chaining is supported after this. - # @note - # When you pass an exception class, the MessageExpectation will raise - # an instance of it, creating it with `exception` and passing `message` - # if specified. If the exception class initializer requires more than - # one parameters, you must pass in an instance and not the class, - # otherwise this method will raise an ArgumentError exception. - # - # @example - # allow(car).to receive(:go).and_raise - # allow(car).to receive(:go).and_raise(OutOfGas) - # allow(car).to receive(:go).and_raise(OutOfGas, "At least 2 oz of gas needed to drive") - # allow(car).to receive(:go).and_raise(OutOfGas.new(2, :oz)) - def and_raise(*args) - raise_already_invoked_error_if_necessary(__method__) - self.terminal_implementation_action = Proc.new { raise(*args) } - nil - end - - # @overload and_throw(symbol) - # @overload and_throw(symbol, object) - # - # Tells the object to throw a symbol (with the object if that form is - # used) when the message is received. - # - # @return [nil] No further chaining is supported after this. - # @example - # allow(car).to receive(:go).and_throw(:out_of_gas) - # allow(car).to receive(:go).and_throw(:out_of_gas, :level => 0.1) - def and_throw(*args) - raise_already_invoked_error_if_necessary(__method__) - self.terminal_implementation_action = Proc.new { throw(*args) } - nil - end - - # Tells the object to yield one or more args to a block when the message - # is received. - # - # @return [MessageExpectation] self, to support further chaining. - # @example - # stream.stub(:open).and_yield(StringIO.new) - def and_yield(*args, &block) - raise_already_invoked_error_if_necessary(__method__) - yield @eval_context = Object.new if block - - # Initialize args to yield now that it's being used, see also: comment - # in constructor. - @args_to_yield ||= [] - - @args_to_yield << args - self.initial_implementation_action = AndYieldImplementation.new(@args_to_yield, @eval_context, @error_generator) - self - end - # @!endgroup - - # @!group Constraining Receive Counts - - # Constrain a message expectation to be received a specific number of - # times. - # - # @return [MessageExpectation] self, to support further chaining. - # @example - # expect(dealer).to receive(:deal_card).exactly(10).times - def exactly(n, &block) - raise_already_invoked_error_if_necessary(__method__) - self.inner_implementation_action = block - set_expected_received_count :exactly, n - self - end - - # Constrain a message expectation to be received at least a specific - # number of times. - # - # @return [MessageExpectation] self, to support further chaining. - # @example - # expect(dealer).to receive(:deal_card).at_least(9).times - def at_least(n, &block) - raise_already_invoked_error_if_necessary(__method__) - set_expected_received_count :at_least, n - - if n == 0 - raise "at_least(0) has been removed, use allow(...).to receive(:message) instead" - end - - self.inner_implementation_action = block - - self - end - - # Constrain a message expectation to be received at most a specific - # number of times. - # - # @return [MessageExpectation] self, to support further chaining. - # @example - # expect(dealer).to receive(:deal_card).at_most(10).times - def at_most(n, &block) - raise_already_invoked_error_if_necessary(__method__) - self.inner_implementation_action = block - set_expected_received_count :at_most, n - self - end - - # Syntactic sugar for `exactly`, `at_least` and `at_most` - # - # @return [MessageExpectation] self, to support further chaining. - # @example - # expect(dealer).to receive(:deal_card).exactly(10).times - # expect(dealer).to receive(:deal_card).at_least(10).times - # expect(dealer).to receive(:deal_card).at_most(10).times - def times(&block) - self.inner_implementation_action = block - self - end - alias time times - - # Expect a message not to be received at all. - # - # @return [MessageExpectation] self, to support further chaining. - # @example - # expect(car).to receive(:stop).never - def never - error_generator.raise_double_negation_error("expect(obj)") if negative? - @expected_received_count = 0 - self - end - - # Expect a message to be received exactly one time. - # - # @return [MessageExpectation] self, to support further chaining. - # @example - # expect(car).to receive(:go).once - def once(&block) - self.inner_implementation_action = block - set_expected_received_count :exactly, 1 - self - end - - # Expect a message to be received exactly two times. - # - # @return [MessageExpectation] self, to support further chaining. - # @example - # expect(car).to receive(:go).twice - def twice(&block) - self.inner_implementation_action = block - set_expected_received_count :exactly, 2 - self - end - - # Expect a message to be received exactly three times. - # - # @return [MessageExpectation] self, to support further chaining. - # @example - # expect(car).to receive(:go).thrice - def thrice(&block) - self.inner_implementation_action = block - set_expected_received_count :exactly, 3 - self - end - # @!endgroup - - # @!group Other Constraints - - # Constrains a stub or message expectation to invocations with specific - # arguments. - # - # With a stub, if the message might be received with other args as well, - # you should stub a default value first, and then stub or mock the same - # message using `with` to constrain to specific arguments. - # - # A message expectation will fail if the message is received with different - # arguments. - # - # @return [MessageExpectation] self, to support further chaining. - # @example - # allow(cart).to receive(:add) { :failure } - # allow(cart).to receive(:add).with(Book.new(:isbn => 1934356379)) { :success } - # cart.add(Book.new(:isbn => 1234567890)) - # # => :failure - # cart.add(Book.new(:isbn => 1934356379)) - # # => :success - # - # expect(cart).to receive(:add).with(Book.new(:isbn => 1934356379)) { :success } - # cart.add(Book.new(:isbn => 1234567890)) - # # => failed expectation - # cart.add(Book.new(:isbn => 1934356379)) - # # => passes - def with(*args, &block) - raise_already_invoked_error_if_necessary(__method__) - if args.empty? - raise ArgumentError, - "`with` must have at least one argument. Use `no_args` matcher to set the expectation of receiving no arguments." - end - - self.inner_implementation_action = block - @argument_list_matcher = ArgumentListMatcher.new(*args) - self - end - ruby2_keywords(:with) if respond_to?(:ruby2_keywords, true) - - # Expect messages to be received in a specific order. - # - # @return [MessageExpectation] self, to support further chaining. - # @example - # expect(api).to receive(:prepare).ordered - # expect(api).to receive(:run).ordered - # expect(api).to receive(:finish).ordered - def ordered(&block) - if type == :stub - RSpec.warning( - "`allow(...).to receive(..).ordered` is not supported and will " \ - "have no effect, use `and_return(*ordered_values)` instead." - ) - end - - self.inner_implementation_action = block - additional_expected_calls.times do - @order_group.register(self) - end - @ordered = true - self - end - - # @return [String] a nice representation of the message expectation - def to_s - args_description = error_generator.method_call_args_description(@argument_list_matcher.expected_args, "", "") { true } - args_description = "(#{args_description})" unless args_description.start_with?("(") - "#<#{self.class} #{error_generator.intro}.#{message}#{args_description}>" - end - alias inspect to_s - - # Implementation details is a long module - # rubocop:disable Metrics/ModuleLength - - # @private - # Contains the parts of `MessageExpectation` that aren't part of - # rspec-mocks' public API. The class is very big and could really use - # some collaborators it delegates to for this stuff but for now this was - # the simplest way to split the public from private stuff to make it - # easier to publish the docs for the APIs we want published. - module ImplementationDetails - attr_accessor :error_generator, :implementation - attr_reader :message - attr_reader :orig_object - attr_writer :expected_received_count, :expected_from, :argument_list_matcher - protected :expected_received_count=, :expected_from=, :error_generator=, :implementation= - - # @private - attr_reader :type - - # rubocop:disable Metrics/ParameterLists - def initialize(error_generator, expectation_ordering, expected_from, method_double, - type=:expectation, opts={}, &implementation_block) - @type = type - @error_generator = error_generator - @error_generator.opts = error_generator.opts.merge(opts) - @expected_from = expected_from - @method_double = method_double - @orig_object = @method_double.object - @message = @method_double.method_name - @actual_received_count = 0 - @actual_received_count_write_mutex = Support::Mutex.new - @expected_received_count = type == :expectation ? 1 : :any - @argument_list_matcher = ArgumentListMatcher::MATCH_ALL - @order_group = expectation_ordering - @order_group.register(self) unless type == :stub - @expectation_type = type - @ordered = false - @at_least = @at_most = @exactly = nil - - self.invoking_internals = false - - # Initialized to nil so that we don't allocate an array for every - # mock or stub. See also comment in `and_yield`. - @args_to_yield = nil - @eval_context = nil - @yield_receiver_to_implementation_block = false - - @implementation = Implementation.new - self.inner_implementation_action = implementation_block - end - # rubocop:enable Metrics/ParameterLists - - def expected_args - @argument_list_matcher.expected_args - end - - def and_yield_receiver_to_implementation - @yield_receiver_to_implementation_block = true - self - end - - def yield_receiver_to_implementation_block? - @yield_receiver_to_implementation_block - end - - def matches?(message, *args) - @message == message && @argument_list_matcher.args_match?(*args) - end - ruby2_keywords :matches? if respond_to?(:ruby2_keywords, true) - - def safe_invoke(parent_stub, *args, &block) - invoke_incrementing_actual_calls_by(1, false, parent_stub, *args, &block) - end - ruby2_keywords :safe_invoke if respond_to?(:ruby2_keywords, true) - - def invoke(parent_stub, *args, &block) - if invoking_internals - safe_invoke_without_incrementing_received_count(parent_stub, *args, &block) - else - invoke_incrementing_actual_calls_by(1, true, parent_stub, *args, &block) - end - end - ruby2_keywords :invoke if respond_to?(:ruby2_keywords, true) - - def safe_invoke_without_incrementing_received_count(parent_stub, *args, &block) - invoke_incrementing_actual_calls_by(0, false, parent_stub, *args, &block) - end - ruby2_keywords :safe_invoke_without_incrementing_received_count if respond_to?(:ruby2_keywords, true) - - def invoke_without_incrementing_received_count(parent_stub, *args, &block) - invoke_incrementing_actual_calls_by(0, true, parent_stub, *args, &block) - end - ruby2_keywords :invoke_without_incrementing_received_count if respond_to?(:ruby2_keywords, true) - - def negative? - @expected_received_count == 0 && !@at_least - end - - def called_max_times? - @expected_received_count != :any && - !@at_least && - @expected_received_count > 0 && - @actual_received_count >= @expected_received_count - end - - def matches_name_but_not_args(message, *args) - @message == message && !@argument_list_matcher.args_match?(*args) - end - - def verify_messages_received - return if expected_messages_received? - generate_error - end - - def expected_messages_received? - ignoring_args? || matches_exact_count? || matches_at_least_count? || matches_at_most_count? - end - - def ensure_expected_ordering_received! - @order_group.verify_invocation_order(self) if @ordered - true - end - - def ignoring_args? - @expected_received_count == :any - end - - def matches_at_least_count? - @at_least && @actual_received_count >= @expected_received_count - end - - def matches_at_most_count? - @at_most && @actual_received_count <= @expected_received_count - end - - def matches_exact_count? - @expected_received_count == @actual_received_count - end - - def similar_messages - @similar_messages ||= [] - end - - def advise(*args) - similar_messages << args - end - - def unadvise(args) - similar_messages.delete_if { |message| args.include?(message) } - end - - def generate_error - if similar_messages.empty? - @error_generator.raise_expectation_error( - @message, @expected_received_count, @argument_list_matcher, - @actual_received_count, expectation_count_type, expected_args, - @expected_from, exception_source_id - ) - else - @error_generator.raise_similar_message_args_error( - self, @similar_messages, @expected_from - ) - end - end - - def raise_unexpected_message_args_error(args_for_multiple_calls) - @error_generator.raise_unexpected_message_args_error(self, args_for_multiple_calls, exception_source_id) - end - - def expectation_count_type - return :at_least if @at_least - return :at_most if @at_most - nil - end - - def description_for(verb) - @error_generator.describe_expectation( - verb, @message, @expected_received_count, - @actual_received_count, expected_args - ) - end - - def raise_out_of_order_error - @error_generator.raise_out_of_order_error @message - end - - def additional_expected_calls - return 0 if @expectation_type == :stub || !@exactly - @expected_received_count - 1 - end - - def ordered? - @ordered - end - - def negative_expectation_for?(message) - @message == message && negative? - end - - def actual_received_count_matters? - @at_least || @at_most || @exactly - end - - def increase_actual_received_count! - @actual_received_count_write_mutex.synchronize do - @actual_received_count += 1 - end - end - - private - - def exception_source_id - @exception_source_id ||= "#{self.class.name} #{__id__}" - end - - def invoking_internals - RSpec::Support.thread_local_data[:"__rspec_#{object_id}_invoking_internals"] - end - - def invoking_internals=(value) - # We clear the key for this rather than setting to false because otherwise the amount of - # thread local data will keep growing over the lifetime of the thread (which is a long - # time on a single threaded spec run e.g standard MRI) - if value - RSpec::Support.thread_local_data[:"__rspec_#{object_id}_invoking_internals"] = true - else - RSpec::Support.thread_local_data.delete(:"__rspec_#{object_id}_invoking_internals") - end - end - - def invoke_incrementing_actual_calls_by(increment, allowed_to_fail, parent_stub, *args, &block) - self.invoking_internals = true - - args.unshift(orig_object) if yield_receiver_to_implementation_block? - - if negative? || (allowed_to_fail && (@exactly || @at_most) && (@actual_received_count == @expected_received_count)) - # args are the args we actually received, @argument_list_matcher is the - # list of args we were expecting - @error_generator.raise_expectation_error( - @message, @expected_received_count, - @argument_list_matcher, - @actual_received_count + increment, - expectation_count_type, args, nil, exception_source_id - ) - end - - @order_group.handle_order_constraint self - - self.invoking_internals = false - - if implementation.present? - implementation.call(*args, &block) - elsif parent_stub - parent_stub.invoke(nil, *args, &block) - end - ensure - self.invoking_internals = false - @actual_received_count_write_mutex.synchronize do - @actual_received_count += increment - end - end - ruby2_keywords :invoke_incrementing_actual_calls_by if respond_to?(:ruby2_keywords, true) - - def has_been_invoked? - @actual_received_count > 0 - end - - def raise_already_invoked_error_if_necessary(calling_customization) - return unless has_been_invoked? - - error_generator.raise_already_invoked_error(message, calling_customization) - end - - def set_expected_received_count(relativity, n) - raise "`count` is not supported with negative message expectations" if negative? - @at_least = (relativity == :at_least) - @at_most = (relativity == :at_most) - @exactly = (relativity == :exactly) - @expected_received_count = case n - when Numeric then n - when :once then 1 - when :twice then 2 - when :thrice then 3 - end - end - - def initial_implementation_action=(action) - implementation.initial_action = action - end - - def inner_implementation_action=(action) - return unless action - warn_about_stub_override if implementation.inner_action - implementation.inner_action = action - end - - def terminal_implementation_action=(action) - implementation.terminal_action = action - end - - def warn_about_stub_override - RSpec.warning( - "You're overriding a previous stub implementation of `#{@message}`. " \ - "Called from #{CallerFilter.first_non_rspec_line}." - ) - end - - def wrap_original(method_name, &block) - if RSpec::Mocks::TestDouble === @method_double.object - @error_generator.raise_only_valid_on_a_partial_double(method_name) - else - warn_about_stub_override if implementation.inner_action - @implementation = AndWrapOriginalImplementation.new(@method_double.original_implementation_callable, block) - @yield_receiver_to_implementation_block = false - end - - nil - end - end - - include ImplementationDetails - end - # rubocop:enable Metrics/ModuleLength - - # Handles the implementation of an `and_yield` declaration. - # @private - class AndYieldImplementation - def initialize(args_to_yield, eval_context, error_generator) - @args_to_yield = args_to_yield - @eval_context = eval_context - @error_generator = error_generator - end - - def call(*_args_to_ignore, &block) - return if @args_to_yield.empty? && @eval_context.nil? - - @error_generator.raise_missing_block_error @args_to_yield unless block - value = nil - block_signature = Support::BlockSignature.new(block) - - @args_to_yield.each do |args| - unless Support::StrictSignatureVerifier.new(block_signature, args).valid? - @error_generator.raise_wrong_arity_error(args, block_signature) - end - - value = @eval_context ? @eval_context.instance_exec(*args, &block) : yield(*args) - end - value - end - end - - # Handles the implementation of an `and_return` implementation. - # @private - class AndReturnImplementation - def initialize(values_to_return) - @values_to_return = values_to_return - end - - def call(*_args_to_ignore, &_block) - if @values_to_return.size > 1 - @values_to_return.shift - else - @values_to_return.first - end - end - end - - # Handles the implementation of an `and_invoke` implementation. - # @private - class AndInvokeImplementation - def initialize(procs_to_invoke) - @procs_to_invoke = procs_to_invoke - end - - def call(*args, &block) - proc = if @procs_to_invoke.size > 1 - @procs_to_invoke.shift - else - @procs_to_invoke.first - end - - proc.call(*args, &block) - end - ruby2_keywords(:call) if respond_to?(:ruby2_keywords, true) - end - - # Represents a configured implementation. Takes into account - # any number of sub-implementations. - # @private - class Implementation - attr_accessor :initial_action, :inner_action, :terminal_action - - def call(*args, &block) - actions.map do |action| - action.call(*args, &block) - end.last - end - ruby2_keywords :call if respond_to?(:ruby2_keywords, true) - - def present? - actions.any? - end - - private - - def actions - [initial_action, inner_action, terminal_action].compact - end - end - - # Represents an `and_call_original` implementation. - # @private - class AndWrapOriginalImplementation - def initialize(method, block) - @method = method - @block = block - end - - CannotModifyFurtherError = Class.new(StandardError) - - def initial_action=(_value) - raise cannot_modify_further_error - end - - def inner_action=(_value) - raise cannot_modify_further_error - end - - def terminal_action=(_value) - raise cannot_modify_further_error - end - - def present? - true - end - - def inner_action - true - end - - def call(*args, &block) - @block.call(@method, *args, &block) - end - ruby2_keywords :call if respond_to?(:ruby2_keywords, true) - - private - - def cannot_modify_further_error - CannotModifyFurtherError.new "This method has already been configured " \ - "to call the original implementation, and cannot be modified further." - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/method_double.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/method_double.rb deleted file mode 100644 index 7417f65..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/method_double.rb +++ /dev/null @@ -1,316 +0,0 @@ -module RSpec - module Mocks - # @private - class MethodDouble - # @private TODO: drop in favor of FrozenError in ruby 2.5+ - FROZEN_ERROR_MSG = /can't modify frozen/ - - # @private - attr_reader :method_name, :object, :expectations, :stubs, :method_stasher - - # @private - def initialize(object, method_name, proxy) - @method_name = method_name - @object = object - @proxy = proxy - - @original_visibility = nil - @method_stasher = InstanceMethodStasher.new(object, method_name) - @method_is_proxied = false - @expectations = [] - @stubs = [] - end - - def original_implementation_callable - # If original method is not present, uses the `method_missing` - # handler of the object. This accounts for cases where the user has not - # correctly defined `respond_to?`, and also 1.8 which does not provide - # method handles for missing methods even if `respond_to?` is correct. - @original_implementation_callable ||= original_method || method_missing_block - end - - alias_method :save_original_implementation_callable!, :original_implementation_callable - - def original_method - @original_method ||= - @method_stasher.original_method || - @proxy.original_method_handle_for(method_name) - end - - # @private - def method_missing_block - block = Proc.new do |*args, &b| - @object.__send__(:method_missing, @method_name, *args, &b) - end - block.ruby2_keywords if block.respond_to?(:ruby2_keywords) - - block - end - - # @private - def visibility - @proxy.visibility_for(@method_name) - end - - # @private - def object_singleton_class - class << @object; self; end - end - - # @private - def configure_method - @original_visibility = visibility - @method_stasher.stash unless @method_is_proxied - define_proxy_method - end - - # @private - def define_proxy_method - return if @method_is_proxied - - save_original_implementation_callable! - definition_target.class_exec(self, method_name, @original_visibility || visibility) do |method_double, method_name, visibility| - define_method(method_name) do |*args, &block| - method_double.proxy_method_invoked(self, *args, &block) - end - # This can't be `if respond_to?(:ruby2_keywords, true)`, - # see https://github.com/rspec/rspec-mocks/pull/1385#issuecomment-755340298 - ruby2_keywords(method_name) if Module.private_method_defined?(:ruby2_keywords) - __send__(visibility, method_name) - end - - @method_is_proxied = true - rescue RuntimeError, TypeError => e - # TODO: drop in favor of FrozenError in ruby 2.5+ - # RuntimeError (and FrozenError) for ruby 2.x - # TypeError for ruby 1.x - if (defined?(FrozenError) && e.is_a?(FrozenError)) || FROZEN_ERROR_MSG === e.message - raise ArgumentError, "Cannot proxy frozen objects, rspec-mocks relies on proxies for method stubbing and expectations." - end - raise - end - - # The implementation of the proxied method. Subclasses may override this - # method to perform additional operations. - # - # @private - def proxy_method_invoked(_obj, *args, &block) - @proxy.message_received method_name, *args, &block - end - ruby2_keywords :proxy_method_invoked if respond_to?(:ruby2_keywords, true) - - # @private - def restore_original_method - return unless @method_is_proxied - - remove_method_from_definition_target - @method_stasher.restore if @method_stasher.method_is_stashed? - restore_original_visibility - - @method_is_proxied = false - rescue RuntimeError, TypeError => e - # TODO: drop in favor of FrozenError in ruby 2.5+ - # RuntimeError (and FrozenError) for ruby 2.x - # TypeError for ruby 1.x - if (defined?(FrozenError) && e.is_a?(FrozenError)) || FROZEN_ERROR_MSG === e.message - return show_frozen_warning - end - raise - end - - # @private - def show_frozen_warning - RSpec.warn_with( - "WARNING: rspec-mocks was unable to restore the original `#{@method_name}` " \ - "method on #{@object.inspect} because it has been frozen. If you reuse this " \ - "object, `#{@method_name}` will continue to respond with its stub implementation.", - :call_site => nil, - :use_spec_location_as_call_site => true - ) - end - - # @private - def restore_original_visibility - return unless @original_visibility && - MethodReference.method_defined_at_any_visibility?(object_singleton_class, @method_name) - - object_singleton_class.__send__(@original_visibility, method_name) - end - - # @private - def verify - expectations.each { |e| e.verify_messages_received } - end - - # @private - def reset - restore_original_method - clear - end - - # @private - def clear - expectations.clear - stubs.clear - end - - # The type of message expectation to create has been extracted to its own - # method so that subclasses can override it. - # - # @private - def message_expectation_class - MessageExpectation - end - - # @private - def add_expectation(error_generator, expectation_ordering, expected_from, opts, &implementation) - configure_method - expectation = message_expectation_class.new(error_generator, expectation_ordering, - expected_from, self, :expectation, opts, &implementation) - expectations << expectation - expectation - end - - # @private - def build_expectation(error_generator, expectation_ordering) - expected_from = IGNORED_BACKTRACE_LINE - message_expectation_class.new(error_generator, expectation_ordering, expected_from, self) - end - - # @private - def add_stub(error_generator, expectation_ordering, expected_from, opts={}, &implementation) - configure_method - stub = message_expectation_class.new(error_generator, expectation_ordering, expected_from, - self, :stub, opts, &implementation) - stubs.unshift stub - stub - end - - # A simple stub can only return a concrete value for a message, and - # cannot match on arguments. It is used as an optimization over - # `add_stub` / `add_expectation` where it is known in advance that this - # is all that will be required of a stub, such as when passing attributes - # to the `double` example method. They do not stash or restore existing method - # definitions. - # - # @private - def add_simple_stub(method_name, response) - setup_simple_method_double method_name, response, stubs - end - - # @private - def add_simple_expectation(method_name, response, error_generator, backtrace_line) - setup_simple_method_double method_name, response, expectations, error_generator, backtrace_line - end - - # @private - def setup_simple_method_double(method_name, response, collection, error_generator=nil, backtrace_line=nil) - define_proxy_method - - me = SimpleMessageExpectation.new(method_name, response, error_generator, backtrace_line) - collection.unshift me - me - end - - # @private - def add_default_stub(*args, &implementation) - return if stubs.any? - add_stub(*args, &implementation) - end - - # @private - def remove_stub - raise_method_not_stubbed_error if stubs.empty? - remove_stub_if_present - end - - # @private - def remove_stub_if_present - expectations.empty? ? reset : stubs.clear - end - - # @private - def raise_method_not_stubbed_error - RSpec::Mocks.error_generator.raise_method_not_stubbed_error(method_name) - end - - # In Ruby 2.0.0 and above prepend will alter the method lookup chain. - # We use an object's singleton class to define method doubles upon, - # however if the object has had its singleton class (as opposed to - # its actual class) prepended too then the the method lookup chain - # will look in the prepended module first, **before** the singleton - # class. - # - # This code works around that by providing a mock definition target - # that is either the singleton class, or if necessary, a prepended module - # of our own. - # - if Support::RubyFeatures.module_prepends_supported? - - private - - # We subclass `Module` in order to be able to easily detect our prepended module. - RSpecPrependedModule = Class.new(Module) - - def definition_target - @definition_target ||= usable_rspec_prepended_module || object_singleton_class - end - - def usable_rspec_prepended_module - @proxy.prepended_modules_of_singleton_class.each do |mod| - # If we have one of our modules prepended before one of the user's - # modules that defines the method, use that, since our module's - # definition will take precedence. - return mod if RSpecPrependedModule === mod - - # If we hit a user module with the method defined first, - # we must create a new prepend module, even if one exists later, - # because ours will only take precedence if it comes first. - return new_rspec_prepended_module if mod.method_defined?(method_name) - end - - nil - end - - def new_rspec_prepended_module - RSpecPrependedModule.new.tap do |mod| - object_singleton_class.__send__ :prepend, mod - end - end - - else - - private - - def definition_target - object_singleton_class - end - - end - - private - - def remove_method_from_definition_target - definition_target.__send__(:remove_method, @method_name) - rescue NameError - # This can happen when the method has been monkeyed with by - # something outside RSpec. This happens, for example, when - # `file.write` has been stubbed, and then `file.reopen(other_io)` - # is later called, as `File#reopen` appears to redefine `write`. - # - # Note: we could avoid rescuing this by checking - # `definition_target.instance_method(@method_name).owner == definition_target`, - # saving us from the cost of the expensive exception, but this error is - # extremely rare (it was discovered on 2014-12-30, only happens on - # RUBY_VERSION < 2.0 and our spec suite only hits this condition once), - # so we'd rather avoid the cost of that check for every method double, - # and risk the rare situation where this exception will get raised. - RSpec.warn_with( - "WARNING: RSpec could not fully restore #{@object.inspect}." \ - "#{@method_name}, possibly because the method has been redefined " \ - "by something outside of RSpec." - ) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/method_reference.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/method_reference.rb deleted file mode 100644 index 50608b0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/method_reference.rb +++ /dev/null @@ -1,214 +0,0 @@ -RSpec::Support.require_rspec_support 'comparable_version' - -module RSpec - module Mocks - # Represents a method on an object that may or may not be defined. - # The method may be an instance method on a module or a method on - # any object. - # - # @private - class MethodReference - def self.for(object_reference, method_name) - new(object_reference, method_name) - end - - def initialize(object_reference, method_name) - @object_reference = object_reference - @method_name = method_name - end - - # A method is implemented if sending the message does not result in - # a `NoMethodError`. It might be dynamically implemented by - # `method_missing`. - def implemented? - @object_reference.when_loaded do |m| - method_implemented?(m) - end - end - - # Returns true if we definitively know that sending the method - # will result in a `NoMethodError`. - # - # This is not simply the inverse of `implemented?`: there are - # cases when we don't know if a method is implemented and - # both `implemented?` and `unimplemented?` will return false. - def unimplemented? - @object_reference.when_loaded do |_m| - return !implemented? - end - - # If it's not loaded, then it may be implemented but we can't check. - false - end - - # A method is defined if we are able to get a `Method` object for it. - # In that case, we can assert against metadata like the arity. - def defined? - @object_reference.when_loaded do |m| - method_defined?(m) - end - end - - def with_signature - return unless (original = original_method) - yield Support::MethodSignature.new(original) - end - - def visibility - @object_reference.when_loaded do |m| - return visibility_from(m) - end - - # When it's not loaded, assume it's public. We don't want to - # wrongly treat the method as private. - :public - end - - def self.instance_method_visibility_for(klass, method_name) - if klass.public_method_defined?(method_name) - :public - elsif klass.private_method_defined?(method_name) - :private - elsif klass.protected_method_defined?(method_name) - :protected - end - end - - class << self - alias method_defined_at_any_visibility? instance_method_visibility_for - end - - def self.method_visibility_for(object, method_name) - vis = instance_method_visibility_for(class << object; self; end, method_name) - - # If the method is not defined on the class, `instance_method_visibility_for` - # returns `nil`. However, it may be handled dynamically by `method_missing`, - # so here we check `respond_to` (passing false to not check private methods). - # - # This only considers the public case, but I don't think it's possible to - # write `method_missing` in such a way that it handles a dynamic message - # with private or protected visibility. Ruby doesn't provide you with - # the caller info. - return vis unless vis.nil? - - proxy = RSpec::Mocks.space.proxy_for(object) - respond_to = proxy.method_double_if_exists_for_message(:respond_to?) - - visible = respond_to && respond_to.original_method.call(method_name) || - object.respond_to?(method_name) - - return :public if visible - end - - private - - def original_method - @object_reference.when_loaded do |m| - self.defined? && find_method(m) - end - end - end - - # @private - class InstanceMethodReference < MethodReference - private - - def method_implemented?(mod) - MethodReference.method_defined_at_any_visibility?(mod, @method_name) - end - - # Ideally, we'd use `respond_to?` for `method_implemented?` but we need a - # reference to an instance to do that and we don't have one. Note that - # we may get false negatives: if the method is implemented via - # `method_missing`, we'll return `false` even though it meets our - # definition of "implemented". However, it's the best we can do. - alias method_defined? method_implemented? - - # works around the fact that repeated calls for method parameters will - # falsely return empty arrays on JRuby in certain circumstances, this - # is necessary here because we can't dup/clone UnboundMethods. - # - # This is necessary due to a bug in JRuby prior to 1.7.5 fixed in: - # https://github.com/jruby/jruby/commit/99a0613fe29935150d76a9a1ee4cf2b4f63f4a27 - if RUBY_PLATFORM == 'java' && RSpec::Support::ComparableVersion.new(JRUBY_VERSION) < '1.7.5' - def find_method(mod) - mod.dup.instance_method(@method_name) - end - else - def find_method(mod) - mod.instance_method(@method_name) - end - end - - def visibility_from(mod) - MethodReference.instance_method_visibility_for(mod, @method_name) - end - end - - # @private - class ObjectMethodReference < MethodReference - def self.for(object_reference, method_name) - if ClassNewMethodReference.applies_to?(method_name) { object_reference.when_loaded { |o| o } } - ClassNewMethodReference.new(object_reference, method_name) - else - super - end - end - - private - - def method_implemented?(object) - object.respond_to?(@method_name, true) - end - - def method_defined?(object) - (class << object; self; end).method_defined?(@method_name) - end - - def find_method(object) - object.method(@method_name) - end - - def visibility_from(object) - MethodReference.method_visibility_for(object, @method_name) - end - end - - # When a class's `.new` method is stubbed, we want to use the method - # signature from `#initialize` because `.new`'s signature is a generic - # `def new(*args)` and it simply delegates to `#initialize` and forwards - # all args...so the method with the actually used signature is `#initialize`. - # - # This method reference implementation handles that specific case. - # @private - class ClassNewMethodReference < ObjectMethodReference - def self.applies_to?(method_name) - return false unless method_name == :new - klass = yield - return false unless ::Class === klass && klass.respond_to?(:new, true) - - # We only want to apply our special logic to normal `new` methods. - # Methods that the user has monkeyed with should be left as-is. - uses_class_new?(klass) - end - - if RUBY_VERSION.to_i >= 3 - CLASS_NEW = ::Class.instance_method(:new) - - def self.uses_class_new?(klass) - ::RSpec::Support.method_handle_for(klass, :new) == CLASS_NEW.bind(klass) - end - else # Ruby 2's Method#== is too strict - def self.uses_class_new?(klass) - ::RSpec::Support.method_handle_for(klass, :new).owner == ::Class - end - end - - def with_signature - @object_reference.when_loaded do |klass| - yield Support::MethodSignature.new(klass.instance_method(:initialize)) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/minitest_integration.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/minitest_integration.rb deleted file mode 100644 index a129890..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/minitest_integration.rb +++ /dev/null @@ -1,68 +0,0 @@ -require 'rspec/mocks' - -module RSpec - module Mocks - # @private - module MinitestIntegration - include ::RSpec::Mocks::ExampleMethods - - def before_setup - ::RSpec::Mocks.setup - super - end - - def after_teardown - super - - # Only verify if there's not already an error. Otherwise - # we risk getting the same failure twice, since negative - # expectation violations raise both when the message is - # unexpectedly received, and also during `verify` (in case - # the first failure was caught by user code via a - # `rescue Exception`). - ::RSpec::Mocks.verify unless failures.any? - ensure - ::RSpec::Mocks.teardown - end - end - end -end - -Minitest::Test.send(:include, RSpec::Mocks::MinitestIntegration) - -if defined?(::Minitest::Expectation) - if defined?(::RSpec::Expectations) && ::Minitest::Expectation.method_defined?(:to) - # rspec/expectations/minitest_integration has already been loaded and - # has defined `to`/`not_to`/`to_not` on `Minitest::Expectation` so we do - # not want to here (or else we would interfere with rspec-expectations' definition). - else - # ...otherwise, define those methods now. If `rspec/expectations/minitest_integration` - # is loaded after this file, it'll override the definition here. - Minitest::Expectation.class_eval do - include RSpec::Mocks::ExpectationTargetMethods - - def to(*args) - ctx.assertions += 1 - super - end - - def not_to(*args) - ctx.assertions += 1 - super - end - - def to_not(*args) - ctx.assertions += 1 - super - end - end - end -end - -module RSpec - module Mocks - remove_const :MockExpectationError - # Raised when a message expectation is not satisfied. - MockExpectationError = ::Minitest::Assertion - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/mutate_const.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/mutate_const.rb deleted file mode 100644 index 071d7a2..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/mutate_const.rb +++ /dev/null @@ -1,339 +0,0 @@ -RSpec::Support.require_rspec_support 'recursive_const_methods' - -module RSpec - module Mocks - # Provides information about constants that may (or may not) - # have been mutated by rspec-mocks. - class Constant - extend Support::RecursiveConstMethods - - # @api private - def initialize(name) - @name = name - @previously_defined = false - @stubbed = false - @hidden = false - @valid_name = true - yield self if block_given? - end - - # @return [String] The fully qualified name of the constant. - attr_reader :name - - # @return [Object, nil] The original value (e.g. before it - # was mutated by rspec-mocks) of the constant, or - # nil if the constant was not previously defined. - attr_accessor :original_value - - # @private - attr_writer :previously_defined, :stubbed, :hidden, :valid_name - - # @return [Boolean] Whether or not the constant was defined - # before the current example. - def previously_defined? - @previously_defined - end - - # @return [Boolean] Whether or not rspec-mocks has mutated - # (stubbed or hidden) this constant. - def mutated? - @stubbed || @hidden - end - - # @return [Boolean] Whether or not rspec-mocks has stubbed - # this constant. - def stubbed? - @stubbed - end - - # @return [Boolean] Whether or not rspec-mocks has hidden - # this constant. - def hidden? - @hidden - end - - # @return [Boolean] Whether or not the provided constant name - # is a valid Ruby constant name. - def valid_name? - @valid_name - end - - # The default `to_s` isn't very useful, so a custom version is provided. - def to_s - "#<#{self.class.name} #{name}>" - end - alias inspect to_s - - # @private - def self.unmutated(name) - previously_defined = !!recursive_const_defined?(name) - rescue NameError - new(name) do |c| - c.valid_name = false - end - else - new(name) do |const| - const.previously_defined = previously_defined - const.original_value = recursive_const_get(name) if previously_defined - end - end - - # Queries rspec-mocks to find out information about the named constant. - # - # @param [String] name the name of the constant - # @return [Constant] an object containing information about the named - # constant. - def self.original(name) - mutator = ::RSpec::Mocks.space.constant_mutator_for(name) - mutator ? mutator.to_constant : unmutated(name) - end - end - - # Provides a means to stub constants. - class ConstantMutator - extend Support::RecursiveConstMethods - - # Stubs a constant. - # - # @param (see ExampleMethods#stub_const) - # @option (see ExampleMethods#stub_const) - # @return (see ExampleMethods#stub_const) - # - # @see ExampleMethods#stub_const - # @note It's recommended that you use `stub_const` in your - # examples. This is an alternate public API that is provided - # so you can stub constants in other contexts (e.g. helper - # classes). - def self.stub(constant_name, value, options={}) - unless String === constant_name - raise ArgumentError, "`stub_const` requires a String, but you provided a #{constant_name.class.name}" - end - - mutator = if recursive_const_defined?(constant_name, &raise_on_invalid_const) - DefinedConstantReplacer - else - UndefinedConstantSetter - end - - mutate(mutator.new(constant_name, value, options[:transfer_nested_constants])) - value - end - - # Hides a constant. - # - # @param (see ExampleMethods#hide_const) - # - # @see ExampleMethods#hide_const - # @note It's recommended that you use `hide_const` in your - # examples. This is an alternate public API that is provided - # so you can hide constants in other contexts (e.g. helper - # classes). - def self.hide(constant_name) - mutate(ConstantHider.new(constant_name, nil, {})) - nil - end - - # Contains common functionality used by all of the constant mutators. - # - # @private - class BaseMutator - include Support::RecursiveConstMethods - - attr_reader :original_value, :full_constant_name - - def initialize(full_constant_name, mutated_value, transfer_nested_constants) - @full_constant_name = normalize_const_name(full_constant_name) - @mutated_value = mutated_value - @transfer_nested_constants = transfer_nested_constants - @context_parts = @full_constant_name.split('::') - @const_name = @context_parts.pop - @reset_performed = false - end - - def to_constant - const = Constant.new(full_constant_name) - const.original_value = original_value - - const - end - - def idempotently_reset - reset unless @reset_performed - @reset_performed = true - end - end - - # Hides a defined constant for the duration of an example. - # - # @private - class ConstantHider < BaseMutator - def mutate - return unless (@defined = recursive_const_defined?(full_constant_name)) - @context = recursive_const_get(@context_parts.join('::')) - @original_value = get_const_defined_on(@context, @const_name) - - @context.__send__(:remove_const, @const_name) - end - - def to_constant - return Constant.unmutated(full_constant_name) unless @defined - - const = super - const.hidden = true - const.previously_defined = true - - const - end - - def reset - return unless @defined - @context.const_set(@const_name, @original_value) - end - end - - # Replaces a defined constant for the duration of an example. - # - # @private - class DefinedConstantReplacer < BaseMutator - def initialize(*args) - super - @constants_to_transfer = [] - end - - def mutate - @context = recursive_const_get(@context_parts.join('::')) - @original_value = get_const_defined_on(@context, @const_name) - - @constants_to_transfer = verify_constants_to_transfer! - - @context.__send__(:remove_const, @const_name) - @context.const_set(@const_name, @mutated_value) - - transfer_nested_constants - end - - def to_constant - const = super - const.stubbed = true - const.previously_defined = true - - const - end - - def reset - @constants_to_transfer.each do |const| - @mutated_value.__send__(:remove_const, const) - end - - @context.__send__(:remove_const, @const_name) - @context.const_set(@const_name, @original_value) - end - - def transfer_nested_constants - @constants_to_transfer.each do |const| - @mutated_value.const_set(const, get_const_defined_on(original_value, const)) - end - end - - def verify_constants_to_transfer! - return [] unless should_transfer_nested_constants? - - { @original_value => "the original value", @mutated_value => "the stubbed value" }.each do |value, description| - next if value.respond_to?(:constants) - - raise ArgumentError, - "Cannot transfer nested constants for #{@full_constant_name} " \ - "since #{description} is not a class or module and only classes " \ - "and modules support nested constants." - end - - if Array === @transfer_nested_constants - @transfer_nested_constants = @transfer_nested_constants.map(&:to_s) if RUBY_VERSION == '1.8.7' - undefined_constants = @transfer_nested_constants - constants_defined_on(@original_value) - - if undefined_constants.any? - available_constants = constants_defined_on(@original_value) - @transfer_nested_constants - raise ArgumentError, - "Cannot transfer nested constant(s) #{undefined_constants.join(' and ')} " \ - "for #{@full_constant_name} since they are not defined. Did you mean " \ - "#{available_constants.join(' or ')}?" - end - - @transfer_nested_constants - else - constants_defined_on(@original_value) - end - end - - def should_transfer_nested_constants? - return true if @transfer_nested_constants - return false unless RSpec::Mocks.configuration.transfer_nested_constants? - @original_value.respond_to?(:constants) && @mutated_value.respond_to?(:constants) - end - end - - # Sets an undefined constant for the duration of an example. - # - # @private - class UndefinedConstantSetter < BaseMutator - def mutate - @parent = @context_parts.inject(Object) do |klass, name| - if const_defined_on?(klass, name) - get_const_defined_on(klass, name) - else - ConstantMutator.stub(name_for(klass, name), Module.new) - end - end - - @parent.const_set(@const_name, @mutated_value) - end - - def to_constant - const = super - const.stubbed = true - const.previously_defined = false - - const - end - - def reset - @parent.__send__(:remove_const, @const_name) - end - - private - - def name_for(parent, name) - root = if parent == Object - '' - else - parent.name - end - root + '::' + name - end - end - - # Uses the mutator to mutate (stub or hide) a constant. Ensures that - # the mutator is correctly registered so it can be backed out at the end - # of the test. - # - # @private - def self.mutate(mutator) - ::RSpec::Mocks.space.register_constant_mutator(mutator) - mutator.mutate - end - - # Used internally by the constant stubbing to raise a helpful - # error when a constant like "A::B::C" is stubbed and A::B is - # not a module (and thus, it's impossible to define "A::B::C" - # since only modules can have nested constants). - # - # @api private - def self.raise_on_invalid_const - lambda do |const_name, failed_name| - raise "Cannot stub constant #{failed_name} on #{const_name} " \ - "since #{const_name} is not a module." - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/object_reference.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/object_reference.rb deleted file mode 100644 index cce2c33..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/object_reference.rb +++ /dev/null @@ -1,149 +0,0 @@ -module RSpec - module Mocks - # @private - class ObjectReference - # Returns an appropriate Object or Module reference based - # on the given argument. - def self.for(object_module_or_name, allow_direct_object_refs=false) - case object_module_or_name - when Module - if anonymous_module?(object_module_or_name) - DirectObjectReference.new(object_module_or_name) - else - # Use a `NamedObjectReference` if it has a name because this - # will use the original value of the constant in case it has - # been stubbed. - NamedObjectReference.new(name_of(object_module_or_name)) - end - when String - NamedObjectReference.new(object_module_or_name) - else - if allow_direct_object_refs - DirectObjectReference.new(object_module_or_name) - else - raise ArgumentError, - "Module or String expected, got #{object_module_or_name.inspect}" - end - end - end - - if Module.new.name.nil? - def self.anonymous_module?(mod) - !name_of(mod) - end - else # 1.8.7 - def self.anonymous_module?(mod) - name_of(mod) == "" - end - end - private_class_method :anonymous_module? - - def self.name_of(mod) - MODULE_NAME_METHOD.bind(mod).call - end - private_class_method :name_of - - # @private - MODULE_NAME_METHOD = Module.instance_method(:name) - end - - # An implementation of rspec-mocks' reference interface. - # Used when an object is passed to {ExampleMethods#object_double}, or - # an anonymous class or module is passed to {ExampleMethods#instance_double} - # or {ExampleMethods#class_double}. - # Represents a reference to that object. - # @see NamedObjectReference - class DirectObjectReference - # @param object [Object] the object to which this refers - def initialize(object) - @object = object - end - - # @return [String] the object's description (via `#inspect`). - def description - @object.inspect - end - - # Defined for interface parity with the other object reference - # implementations. Raises an `ArgumentError` to indicate that `as_stubbed_const` - # is invalid when passing an object argument to `object_double`. - def const_to_replace - raise ArgumentError, - "Can not perform constant replacement with an anonymous object." - end - - # The target of the verifying double (the object itself). - # - # @return [Object] - def target - @object - end - - # Always returns true for an object as the class is defined. - # - # @return [true] - def defined? - true - end - - # Yields if the reference target is loaded, providing a generic mechanism - # to optionally run a bit of code only when a reference's target is - # loaded. - # - # This specific implementation always yields because direct references - # are always loaded. - # - # @yield [Object] the target of this reference. - def when_loaded - yield @object - end - end - - # An implementation of rspec-mocks' reference interface. - # Used when a string is passed to {ExampleMethods#object_double}, - # and when a string, named class or named module is passed to - # {ExampleMethods#instance_double}, or {ExampleMethods#class_double}. - # Represents a reference to the object named (via a constant lookup) - # by the string. - # @see DirectObjectReference - class NamedObjectReference - # @param const_name [String] constant name - def initialize(const_name) - @const_name = const_name - end - - # @return [Boolean] true if the named constant is defined, false otherwise. - def defined? - !!object - end - - # @return [String] the constant name to replace with a double. - def const_to_replace - @const_name - end - alias description const_to_replace - - # @return [Object, nil] the target of the verifying double (the named object), or - # nil if it is not defined. - def target - object - end - - # Yields if the reference target is loaded, providing a generic mechanism - # to optionally run a bit of code only when a reference's target is - # loaded. - # - # @yield [Object] the target object - def when_loaded - yield object if object - end - - private - - def object - return @object if defined?(@object) - @object = Constant.original(@const_name).original_value - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/order_group.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/order_group.rb deleted file mode 100644 index a994799..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/order_group.rb +++ /dev/null @@ -1,81 +0,0 @@ -module RSpec - module Mocks - # @private - class OrderGroup - def initialize - @expectations = [] - @invocation_order = [] - @index = 0 - end - - # @private - def register(expectation) - @expectations << expectation - end - - def invoked(message) - @invocation_order << message - end - - # @private - def ready_for?(expectation) - remaining_expectations.find(&:ordered?) == expectation - end - - # @private - def consume - remaining_expectations.each_with_index do |expectation, index| - next unless expectation.ordered? - - @index += index + 1 - return expectation - end - nil - end - - # @private - def handle_order_constraint(expectation) - return unless expectation.ordered? && remaining_expectations.include?(expectation) - return consume if ready_for?(expectation) - expectation.raise_out_of_order_error - end - - def verify_invocation_order(expectation) - expectation.raise_out_of_order_error unless expectations_invoked_in_order? - true - end - - def clear - @index = 0 - @invocation_order.clear - @expectations.clear - end - - def empty? - @expectations.empty? - end - - private - - def remaining_expectations - @expectations[@index..-1] || [] - end - - def expectations_invoked_in_order? - invoked_expectations == expected_invocations - end - - def invoked_expectations - @expectations.select { |e| e.ordered? && @invocation_order.include?(e) } - end - - def expected_invocations - @invocation_order.map { |invocation| expectation_for(invocation) }.compact - end - - def expectation_for(message) - @expectations.find { |e| message == e } - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/proxy.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/proxy.rb deleted file mode 100644 index 45beb55..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/proxy.rb +++ /dev/null @@ -1,517 +0,0 @@ -RSpec::Support.require_rspec_support 'mutex' - -module RSpec - module Mocks - # @private - class Proxy - # @private - SpecificMessage = Struct.new(:object, :message, :args) do - def ==(expectation) - expectation.orig_object == object && expectation.matches?(message, *args) - end - end - - # @private - def ensure_implemented(*_args) - # noop for basic proxies, see VerifyingProxy for behaviour. - end - - # @private - def initialize(object, order_group, options={}) - ensure_can_be_proxied!(object) - - @object = object - @order_group = order_group - @error_generator = ErrorGenerator.new(object) - @messages_received = [] - @messages_received_mutex = Support::Mutex.new - @options = options - @null_object = false - @method_doubles = Hash.new { |h, k| h[k] = MethodDouble.new(@object, k, self) } - end - - # @private - def ensure_can_be_proxied!(object) - return unless object.is_a?(Symbol) - - msg = "Cannot proxy frozen objects. Symbols such as #{object} cannot be mocked or stubbed." - raise ArgumentError, msg - end - - # @private - attr_reader :object - - # @private - def null_object? - @null_object - end - - # @private - # Tells the object to ignore any messages that aren't explicitly set as - # stubs or message expectations. - def as_null_object - @null_object = true - @object - end - - # @private - def original_method_handle_for(_message) - nil - end - - DEFAULT_MESSAGE_EXPECTATION_OPTS = {}.freeze - - # @private - def add_message_expectation(method_name, opts=DEFAULT_MESSAGE_EXPECTATION_OPTS, &block) - location = opts.fetch(:expected_from) { CallerFilter.first_non_rspec_line } - meth_double = method_double_for(method_name) - - if null_object? && !block - meth_double.add_default_stub(@error_generator, @order_group, location, opts) do - @object - end - end - - meth_double.add_expectation @error_generator, @order_group, location, opts, &block - end - - # @private - def add_simple_expectation(method_name, response, location) - method_double_for(method_name).add_simple_expectation method_name, response, @error_generator, location - end - - # @private - def build_expectation(method_name) - meth_double = method_double_for(method_name) - - meth_double.build_expectation( - @error_generator, - @order_group - ) - end - - # @private - def replay_received_message_on(expectation, &block) - expected_method_name = expectation.message - meth_double = method_double_for(expected_method_name) - - if meth_double.expectations.any? - @error_generator.raise_expectation_on_mocked_method(expected_method_name) - end - - unless null_object? || meth_double.stubs.any? - @error_generator.raise_expectation_on_unstubbed_method(expected_method_name) - end - - @messages_received_mutex.synchronize do - @messages_received.each do |(actual_method_name, args, received_block)| - next unless expectation.matches?(actual_method_name, *args) - - expectation.safe_invoke(nil) - block.call(*args, &received_block) if block - end - end - end - - # @private - def check_for_unexpected_arguments(expectation) - @messages_received_mutex.synchronize do - return if @messages_received.empty? - - return if @messages_received.any? { |method_name, args, _| expectation.matches?(method_name, *args) } - - name_but_not_args, others = @messages_received.partition do |(method_name, args, _)| - expectation.matches_name_but_not_args(method_name, *args) - end - - return if name_but_not_args.empty? && !others.empty? - - expectation.raise_unexpected_message_args_error(name_but_not_args.map { |args| args[1] }) - end - end - - # @private - def add_stub(method_name, opts={}, &implementation) - location = opts.fetch(:expected_from) { CallerFilter.first_non_rspec_line } - method_double_for(method_name).add_stub @error_generator, @order_group, location, opts, &implementation - end - - # @private - def add_simple_stub(method_name, response) - method_double_for(method_name).add_simple_stub method_name, response - end - - # @private - def remove_stub(method_name) - method_double_for(method_name).remove_stub - end - - # @private - def remove_stub_if_present(method_name) - method_double_for(method_name).remove_stub_if_present - end - - # @private - def verify - @method_doubles.each_value { |d| d.verify } - end - - # @private - def reset - @messages_received_mutex.synchronize do - @messages_received.clear - end - end - - # @private - def received_message?(method_name, *args, &block) - @messages_received_mutex.synchronize do - @messages_received.any? { |array| array == [method_name, args, block] } - end - end - - # @private - def messages_arg_list - @messages_received_mutex.synchronize do - @messages_received.map { |_, args, _| args } - end - end - - # @private - def has_negative_expectation?(message) - method_double_for(message).expectations.find { |expectation| expectation.negative_expectation_for?(message) } - end - - # @private - def record_message_received(message, *args, &block) - @order_group.invoked SpecificMessage.new(object, message, args) - @messages_received_mutex.synchronize do - @messages_received << [message, args, block] - end - end - ruby2_keywords :record_message_received if respond_to?(:ruby2_keywords, true) - - # @private - def message_received(message, *args, &block) - record_message_received message, *args, &block - - expectation = find_matching_expectation(message, *args) - stub = find_matching_method_stub(message, *args) - - if (stub && expectation && expectation.called_max_times?) || (stub && !expectation) - expectation.increase_actual_received_count! if expectation && expectation.actual_received_count_matters? - if (expectation = find_almost_matching_expectation(message, *args)) - expectation.advise(*args) unless expectation.expected_messages_received? - end - stub.invoke(nil, *args, &block) - elsif expectation - expectation.unadvise(messages_arg_list) - expectation.invoke(stub, *args, &block) - elsif (expectation = find_almost_matching_expectation(message, *args)) - expectation.advise(*args) if null_object? unless expectation.expected_messages_received? - - if null_object? || !has_negative_expectation?(message) - expectation.raise_unexpected_message_args_error([args]) - end - elsif (stub = find_almost_matching_stub(message, *args)) - stub.advise(*args) - raise_missing_default_stub_error(stub, [args]) - elsif Class === @object - @object.superclass.__send__(message, *args, &block) - else - @object.__send__(:method_missing, message, *args, &block) - end - end - ruby2_keywords :message_received if respond_to?(:ruby2_keywords, true) - - # @private - def raise_unexpected_message_error(method_name, args) - @error_generator.raise_unexpected_message_error method_name, args - end - - # @private - def raise_missing_default_stub_error(expectation, args_for_multiple_calls) - @error_generator.raise_missing_default_stub_error(expectation, args_for_multiple_calls) - end - - # @private - def visibility_for(_method_name) - # This is the default (for test doubles). Subclasses override this. - :public - end - - if Support::RubyFeatures.module_prepends_supported? - def self.prepended_modules_of(klass) - ancestors = klass.ancestors - - # `|| 0` is necessary for Ruby 2.0, where the singleton class - # is only in the ancestor list when there are prepended modules. - singleton_index = ancestors.index(klass) || 0 - - ancestors[0, singleton_index] - end - - def prepended_modules_of_singleton_class - @prepended_modules_of_singleton_class ||= RSpec::Mocks::Proxy.prepended_modules_of(@object.singleton_class) - end - end - - # @private - def method_double_if_exists_for_message(message) - method_double_for(message) if @method_doubles.key?(message.to_sym) - end - - private - - def method_double_for(message) - @method_doubles[message.to_sym] - end - - def find_matching_expectation(method_name, *args) - find_best_matching_expectation_for(method_name) do |expectation| - expectation.matches?(method_name, *args) - end - end - ruby2_keywords :find_matching_expectation if respond_to?(:ruby2_keywords, true) - - def find_almost_matching_expectation(method_name, *args) - find_best_matching_expectation_for(method_name) do |expectation| - expectation.matches_name_but_not_args(method_name, *args) - end - end - ruby2_keywords :find_almost_matching_expectation if respond_to?(:ruby2_keywords, true) - - def find_best_matching_expectation_for(method_name) - first_match = nil - - method_double_for(method_name).expectations.each do |expectation| - next unless yield expectation - return expectation unless expectation.called_max_times? - first_match ||= expectation - end - - first_match - end - - def find_matching_method_stub(method_name, *args) - method_double_for(method_name).stubs.find { |stub| stub.matches?(method_name, *args) } - end - ruby2_keywords :find_matching_method_stub if respond_to?(:ruby2_keywords, true) - - def find_almost_matching_stub(method_name, *args) - method_double_for(method_name).stubs.find { |stub| stub.matches_name_but_not_args(method_name, *args) } - end - ruby2_keywords :find_almost_matching_stub if respond_to?(:ruby2_keywords, true) - end - - # @private - class TestDoubleProxy < Proxy - def reset - @method_doubles.clear - object.__disallow_further_usage! - super - end - end - - # @private - class PartialDoubleProxy < Proxy - def original_method_handle_for(message) - if any_instance_class_recorder_observing_method?(@object.class, message) - message = ::RSpec::Mocks.space. - any_instance_recorder_for(@object.class). - build_alias_method_name(message) - end - - ::RSpec::Support.method_handle_for(@object, message) - rescue NameError - nil - end - - # @private - def add_simple_expectation(method_name, response, location) - method_double_for(method_name).configure_method - super - end - - # @private - def add_simple_stub(method_name, response) - method_double_for(method_name).configure_method - super - end - - # @private - def visibility_for(method_name) - # We fall back to :public because by default we allow undefined methods - # to be stubbed, and when we do so, we make them public. - MethodReference.method_visibility_for(@object, method_name) || :public - end - - def reset - @method_doubles.each_value { |d| d.reset } - super - end - - def message_received(message, *args, &block) - RSpec::Mocks.space.any_instance_recorders_from_ancestry_of(object).each do |subscriber| - subscriber.notify_received_message(object, message, args, block) - end - super - end - ruby2_keywords :message_received if respond_to?(:ruby2_keywords, true) - - private - - def any_instance_class_recorder_observing_method?(klass, method_name) - only_return_existing = true - recorder = ::RSpec::Mocks.space.any_instance_recorder_for(klass, only_return_existing) - return true if recorder && recorder.already_observing?(method_name) - - superklass = klass.superclass - return false if superklass.nil? - any_instance_class_recorder_observing_method?(superklass, method_name) - end - end - - # @private - # When we mock or stub a method on a class, we have to treat it a bit different, - # because normally singleton method definitions only affect the object on which - # they are defined, but on classes they affect subclasses, too. As a result, - # we need some special handling to get the original method. - module PartialClassDoubleProxyMethods - def initialize(source_space, *args) - @source_space = source_space - super(*args) - end - - # Consider this situation: - # - # class A; end - # class B < A; end - # - # allow(A).to receive(:new) - # expect(B).to receive(:new).and_call_original - # - # When getting the original definition for `B.new`, we cannot rely purely on - # using `B.method(:new)` before our redefinition is defined on `B`, because - # `B.method(:new)` will return a method that will execute the stubbed version - # of the method on `A` since singleton methods on classes are in the lookup - # hierarchy. - # - # To do it properly, we need to find the original definition of `new` from `A` - # from _before_ `A` was stubbed, and we need to rebind it to `B` so that it will - # run with the proper `self`. - # - # That's what this method (together with `original_unbound_method_handle_from_ancestor_for`) - # does. - def original_method_handle_for(message) - unbound_method = superclass_proxy && - superclass_proxy.original_unbound_method_handle_from_ancestor_for(message.to_sym) - - return super unless unbound_method - unbound_method.bind(object) - # :nocov: - rescue TypeError - if RUBY_VERSION == '1.8.7' - # In MRI 1.8.7, a singleton method on a class cannot be rebound to its subclass - if unbound_method && unbound_method.owner.ancestors.first != unbound_method.owner - # This is a singleton method; we can't do anything with it - # But we can work around this using a different implementation - double = method_double_from_ancestor_for(message) - return object.method(double.method_stasher.stashed_method_name) - end - end - raise - # :nocov: - end - - protected - - def original_unbound_method_handle_from_ancestor_for(message) - double = method_double_from_ancestor_for(message) - double && double.original_method.unbind - end - - def method_double_from_ancestor_for(message) - @method_doubles.fetch(message) do - # The fact that there is no method double for this message indicates - # that it has not been redefined by rspec-mocks. We need to continue - # looking up the ancestor chain. - return superclass_proxy && - superclass_proxy.method_double_from_ancestor_for(message) - end - end - - def superclass_proxy - return @superclass_proxy if defined?(@superclass_proxy) - - if (superclass = object.superclass) - @superclass_proxy = @source_space.superclass_proxy_for(superclass) - else - @superclass_proxy = nil - end - end - end - - # @private - class PartialClassDoubleProxy < PartialDoubleProxy - include PartialClassDoubleProxyMethods - end - - # @private - class ProxyForNil < PartialDoubleProxy - def initialize(order_group) - set_expectation_behavior - super(nil, order_group) - end - - attr_accessor :disallow_expectations - attr_accessor :warn_about_expectations - - def add_message_expectation(method_name, opts={}, &block) - warn_or_raise!(method_name) - super - end - - def add_stub(method_name, opts={}, &implementation) - warn_or_raise!(method_name) - super - end - - private - - def set_expectation_behavior - case RSpec::Mocks.configuration.allow_message_expectations_on_nil - when false - @warn_about_expectations = false - @disallow_expectations = true - when true - @warn_about_expectations = false - @disallow_expectations = false - else - @warn_about_expectations = true - @disallow_expectations = false - end - end - - def warn_or_raise!(method_name) - # This method intentionally swallows the message when - # neither disallow_expectations nor warn_about_expectations - # are set to true. - if disallow_expectations - raise_error(method_name) - elsif warn_about_expectations - warn(method_name) - end - end - - def warn(method_name) - warning_msg = @error_generator.expectation_on_nil_message(method_name) - RSpec.warning(warning_msg) - end - - def raise_error(method_name) - @error_generator.raise_expectation_on_nil_error(method_name) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/space.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/space.rb deleted file mode 100644 index f933caa..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/space.rb +++ /dev/null @@ -1,238 +0,0 @@ -RSpec::Support.require_rspec_support 'reentrant_mutex' - -module RSpec - module Mocks - # @private - # Provides a default space implementation for outside - # the scope of an example. Called "root" because it serves - # as the root of the space stack. - class RootSpace - def proxy_for(*_args) - raise_lifecycle_message - end - - def any_instance_recorder_for(*_args) - raise_lifecycle_message - end - - def any_instance_proxy_for(*_args) - raise_lifecycle_message - end - - def register_constant_mutator(_mutator) - raise_lifecycle_message - end - - def any_instance_recorders_from_ancestry_of(_object) - raise_lifecycle_message - end - - def reset_all - end - - def verify_all - end - - def registered?(_object) - false - end - - def superclass_proxy_for(*_args) - raise_lifecycle_message - end - - def new_scope - Space.new - end - - private - - def raise_lifecycle_message - raise OutsideOfExampleError, - "The use of doubles or partial doubles from rspec-mocks outside of the per-test lifecycle is not supported." - end - end - - # @private - class Space - attr_reader :proxies, :any_instance_recorders, :proxy_mutex, :any_instance_mutex - - def initialize - @proxies = {} - @any_instance_recorders = {} - @constant_mutators = [] - @expectation_ordering = OrderGroup.new - @proxy_mutex = new_mutex - @any_instance_mutex = new_mutex - end - - def new_scope - NestedSpace.new(self) - end - - def verify_all - proxies.values.each { |proxy| proxy.verify } - any_instance_recorders.each_value { |recorder| recorder.verify } - end - - def reset_all - proxies.each_value { |proxy| proxy.reset } - any_instance_recorders.each_value { |recorder| recorder.stop_all_observation! } - any_instance_recorders.clear - @constant_mutators.reverse.each { |mut| mut.idempotently_reset } - end - - def register_constant_mutator(mutator) - @constant_mutators << mutator - end - - def constant_mutator_for(name) - @constant_mutators.find { |m| m.full_constant_name == name } - end - - def any_instance_recorder_for(klass, only_return_existing=false) - any_instance_mutex.synchronize do - id = klass.__id__ - any_instance_recorders.fetch(id) do - return nil if only_return_existing - any_instance_recorder_not_found_for(id, klass) - end - end - end - - def any_instance_proxy_for(klass) - AnyInstance::Proxy.new(any_instance_recorder_for(klass), proxies_of(klass)) - end - - def proxies_of(klass) - proxies.values.select { |proxy| klass === proxy.object } - end - - def proxy_for(object) - proxy_mutex.synchronize do - id = id_for(object) - proxies.fetch(id) { proxy_not_found_for(id, object) } - end - end - - def superclass_proxy_for(klass) - proxy_mutex.synchronize do - id = id_for(klass) - proxies.fetch(id) { superclass_proxy_not_found_for(id, klass) } - end - end - - alias ensure_registered proxy_for - - def registered?(object) - proxies.key?(id_for object) - end - - def any_instance_recorders_from_ancestry_of(object) - # Optimization: `any_instance` is a feature we generally - # recommend not using, so we can often early exit here - # without doing an O(N) linear search over the number of - # ancestors in the object's class hierarchy. - return [] if any_instance_recorders.empty? - - # We access the ancestors through the singleton class, to avoid calling - # `class` in case `class` has been stubbed. - (class << object; ancestors; end).map do |klass| - any_instance_recorders[klass.__id__] - end.compact - end - - private - - def new_mutex - Support::ReentrantMutex.new - end - - def proxy_not_found_for(id, object) - proxies[id] = case object - when NilClass then ProxyForNil.new(@expectation_ordering) - when TestDouble then object.__build_mock_proxy_unless_expired(@expectation_ordering) - when Class - class_proxy_with_callback_verification_strategy(object, CallbackInvocationStrategy.new) - else - if RSpec::Mocks.configuration.verify_partial_doubles? - VerifyingPartialDoubleProxy.new(object, @expectation_ordering) - else - PartialDoubleProxy.new(object, @expectation_ordering) - end - end - end - - def superclass_proxy_not_found_for(id, object) - raise "superclass_proxy_not_found_for called with something that is not a class" unless Class === object - proxies[id] = class_proxy_with_callback_verification_strategy(object, NoCallbackInvocationStrategy.new) - end - - def class_proxy_with_callback_verification_strategy(object, strategy) - if RSpec::Mocks.configuration.verify_partial_doubles? - VerifyingPartialClassDoubleProxy.new( - self, - object, - @expectation_ordering, - strategy - ) - else - PartialClassDoubleProxy.new(self, object, @expectation_ordering) - end - end - - def any_instance_recorder_not_found_for(id, klass) - any_instance_recorders[id] = AnyInstance::Recorder.new(klass) - end - - if defined?(::BasicObject) && !::BasicObject.method_defined?(:__id__) # for 1.9.2 - require 'securerandom' - - def id_for(object) - id = object.__id__ - - return id if object.equal?(::ObjectSpace._id2ref(id)) - # this suggests that object.__id__ is proxying through to some wrapped object - - object.instance_exec do - @__id_for_rspec_mocks_space ||= ::SecureRandom.uuid - end - end - else - def id_for(object) - object.__id__ - end - end - end - - # @private - class NestedSpace < Space - def initialize(parent) - @parent = parent - super() - end - - def proxies_of(klass) - super + @parent.proxies_of(klass) - end - - def constant_mutator_for(name) - super || @parent.constant_mutator_for(name) - end - - def registered?(object) - super || @parent.registered?(object) - end - - private - - def proxy_not_found_for(id, object) - @parent.proxies[id] || super - end - - def any_instance_recorder_not_found_for(id, klass) - @parent.any_instance_recorders[id] || super - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/standalone.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/standalone.rb deleted file mode 100644 index 74317b0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/standalone.rb +++ /dev/null @@ -1,3 +0,0 @@ -require 'rspec/mocks' -extend RSpec::Mocks::ExampleMethods -RSpec::Mocks.setup diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/syntax.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/syntax.rb deleted file mode 100644 index 2caabd1..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/syntax.rb +++ /dev/null @@ -1,325 +0,0 @@ -module RSpec - module Mocks - # @api private - # Provides methods for enabling and disabling the available syntaxes - # provided by rspec-mocks. - module Syntax - # @private - def self.warn_about_should! - @warn_about_should = true - end - - # @private - def self.warn_unless_should_configured(method_name , replacement="the new `:expect` syntax or explicitly enable `:should`") - if @warn_about_should - RSpec.deprecate( - "Using `#{method_name}` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax", - :replacement => replacement - ) - - @warn_about_should = false - end - end - - # @api private - # Enables the should syntax (`dbl.stub`, `dbl.should_receive`, etc). - def self.enable_should(syntax_host=default_should_syntax_host) - @warn_about_should = false if syntax_host == default_should_syntax_host - return if should_enabled?(syntax_host) - - syntax_host.class_exec do - def should_receive(message, opts={}, &block) - ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) - ::RSpec::Mocks.expect_message(self, message, opts, &block) - end - - def should_not_receive(message, &block) - ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) - ::RSpec::Mocks.expect_message(self, message, {}, &block).never - end - - def stub(message_or_hash, opts={}, &block) - ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) - if ::Hash === message_or_hash - message_or_hash.each { |message, value| stub(message).and_return value } - else - ::RSpec::Mocks.allow_message(self, message_or_hash, opts, &block) - end - end - - def unstub(message) - ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__, "`allow(...).to receive(...).and_call_original` or explicitly enable `:should`") - ::RSpec::Mocks.space.proxy_for(self).remove_stub(message) - end - - def stub_chain(*chain, &blk) - ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) - ::RSpec::Mocks::StubChain.stub_chain_on(self, *chain, &blk) - end - - def as_null_object - ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) - @_null_object = true - ::RSpec::Mocks.space.proxy_for(self).as_null_object - end - - def null_object? - ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) - defined?(@_null_object) - end - - def received_message?(message, *args, &block) - ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) - ::RSpec::Mocks.space.proxy_for(self).received_message?(message, *args, &block) - end - - unless Class.respond_to? :any_instance - Class.class_exec do - def any_instance - ::RSpec::Mocks::Syntax.warn_unless_should_configured(__method__) - ::RSpec::Mocks.space.any_instance_proxy_for(self) - end - end - end - end - end - - # @api private - # Disables the should syntax (`dbl.stub`, `dbl.should_receive`, etc). - def self.disable_should(syntax_host=default_should_syntax_host) - return unless should_enabled?(syntax_host) - - syntax_host.class_exec do - undef should_receive - undef should_not_receive - undef stub - undef unstub - undef stub_chain - undef as_null_object - undef null_object? - undef received_message? - end - - Class.class_exec do - undef any_instance - end - end - - # @api private - # Enables the expect syntax (`expect(dbl).to receive`, `allow(dbl).to receive`, etc). - def self.enable_expect(syntax_host=::RSpec::Mocks::ExampleMethods) - return if expect_enabled?(syntax_host) - - syntax_host.class_exec do - def receive(method_name, &block) - Matchers::Receive.new(method_name, block) - end - - def receive_messages(message_return_value_hash, &_block) - matcher = Matchers::ReceiveMessages.new(message_return_value_hash) - matcher.warn_about_block if block_given? - matcher - end - - def receive_message_chain(*messages, &block) - Matchers::ReceiveMessageChain.new(messages, &block) - end - - def allow(target) - AllowanceTarget.new(target) - end - - def expect_any_instance_of(klass) - AnyInstanceExpectationTarget.new(klass) - end - - def allow_any_instance_of(klass) - AnyInstanceAllowanceTarget.new(klass) - end - end - - RSpec::Mocks::ExampleMethods::ExpectHost.class_exec do - def expect(target) - ExpectationTarget.new(target) - end - end - end - - # @api private - # Disables the expect syntax (`expect(dbl).to receive`, `allow(dbl).to receive`, etc). - def self.disable_expect(syntax_host=::RSpec::Mocks::ExampleMethods) - return unless expect_enabled?(syntax_host) - - syntax_host.class_exec do - undef receive - undef receive_messages - undef receive_message_chain - undef allow - undef expect_any_instance_of - undef allow_any_instance_of - end - - RSpec::Mocks::ExampleMethods::ExpectHost.class_exec do - undef expect - end - end - - # @api private - # Indicates whether or not the should syntax is enabled. - def self.should_enabled?(syntax_host=default_should_syntax_host) - syntax_host.method_defined?(:should_receive) - end - - # @api private - # Indicates whether or not the expect syntax is enabled. - def self.expect_enabled?(syntax_host=::RSpec::Mocks::ExampleMethods) - syntax_host.method_defined?(:allow) - end - - # @api private - # Determines where the methods like `should_receive`, and `stub` are added. - def self.default_should_syntax_host - # JRuby 1.7.4 introduces a regression whereby `defined?(::BasicObject) => nil` - # yet `BasicObject` still exists and patching onto ::Object breaks things - # e.g. SimpleDelegator expectations won't work - # - # See: https://github.com/jruby/jruby/issues/814 - if defined?(JRUBY_VERSION) && JRUBY_VERSION == '1.7.4' && RUBY_VERSION.to_f > 1.8 - return ::BasicObject - end - - # On 1.8.7, Object.ancestors.last == Kernel but - # things blow up if we include `RSpec::Mocks::Methods` - # into Kernel...not sure why. - return Object unless defined?(::BasicObject) - - # MacRuby has BasicObject but it's not the root class. - return Object unless Object.ancestors.last == ::BasicObject - - ::BasicObject - end - end - end -end - -if defined?(BasicObject) - # The legacy `:should` syntax adds the following methods directly to - # `BasicObject` so that they are available off of any object. Note, however, - # that this syntax does not always play nice with delegate/proxy objects. - # We recommend you use the non-monkeypatching `:expect` syntax instead. - # @see Class - class BasicObject - # @method should_receive - # Sets an expectation that this object should receive a message before - # the end of the example. - # - # @example - # logger = double('logger') - # thing_that_logs = ThingThatLogs.new(logger) - # logger.should_receive(:log) - # thing_that_logs.do_something_that_logs_a_message - # - # @note This is only available when you have enabled the `should` syntax. - # @see RSpec::Mocks::ExampleMethods#expect - - # @method should_not_receive - # Sets and expectation that this object should _not_ receive a message - # during this example. - # @see RSpec::Mocks::ExampleMethods#expect - - # @method stub - # Tells the object to respond to the message with the specified value. - # - # @example - # counter.stub(:count).and_return(37) - # counter.stub(:count => 37) - # counter.stub(:count) { 37 } - # - # @note This is only available when you have enabled the `should` syntax. - # @see RSpec::Mocks::ExampleMethods#allow - - # @method unstub - # Removes a stub. On a double, the object will no longer respond to - # `message`. On a real object, the original method (if it exists) is - # restored. - # - # This is rarely used, but can be useful when a stub is set up during a - # shared `before` hook for the common case, but you want to replace it - # for a special case. - # - # @note This is only available when you have enabled the `should` syntax. - - # @method stub_chain - # @overload stub_chain(method1, method2) - # @overload stub_chain("method1.method2") - # @overload stub_chain(method1, method_to_value_hash) - # - # Stubs a chain of methods. - # - # ## Warning: - # - # Chains can be arbitrarily long, which makes it quite painless to - # violate the Law of Demeter in violent ways, so you should consider any - # use of `stub_chain` a code smell. Even though not all code smells - # indicate real problems (think fluent interfaces), `stub_chain` still - # results in brittle examples. For example, if you write - # `foo.stub_chain(:bar, :baz => 37)` in a spec and then the - # implementation calls `foo.baz.bar`, the stub will not work. - # - # @example - # double.stub_chain("foo.bar") { :baz } - # double.stub_chain(:foo, :bar => :baz) - # double.stub_chain(:foo, :bar) { :baz } - # - # # Given any of ^^ these three forms ^^: - # double.foo.bar # => :baz - # - # # Common use in Rails/ActiveRecord: - # Article.stub_chain("recent.published") { [Article.new] } - # - # @note This is only available when you have enabled the `should` syntax. - # @see RSpec::Mocks::ExampleMethods#receive_message_chain - - # @method as_null_object - # Tells the object to respond to all messages. If specific stub values - # are declared, they'll work as expected. If not, the receiver is - # returned. - # - # @note This is only available when you have enabled the `should` syntax. - - # @method null_object? - # Returns true if this object has received `as_null_object` - # - # @note This is only available when you have enabled the `should` syntax. - end -end - -# The legacy `:should` syntax adds the `any_instance` to `Class`. -# We generally recommend you use the newer `:expect` syntax instead, -# which allows you to stub any instance of a class using -# `allow_any_instance_of(klass)` or mock any instance using -# `expect_any_instance_of(klass)`. -# @see BasicObject -class Class - # @method any_instance - # Used to set stubs and message expectations on any instance of a given - # class. Returns a [Recorder](Recorder), which records messages like - # `stub` and `should_receive` for later playback on instances of the - # class. - # - # @example - # Car.any_instance.should_receive(:go) - # race = Race.new - # race.cars << Car.new - # race.go # assuming this delegates to all of its cars - # # this example would pass - # - # Account.any_instance.stub(:balance) { Money.new(:USD, 25) } - # Account.new.balance # => Money.new(:USD, 25)) - # - # @return [Recorder] - # - # @note This is only available when you have enabled the `should` syntax. - # @see RSpec::Mocks::ExampleMethods#expect_any_instance_of - # @see RSpec::Mocks::ExampleMethods#allow_any_instance_of -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/targets.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/targets.rb deleted file mode 100644 index 26f7287..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/targets.rb +++ /dev/null @@ -1,124 +0,0 @@ -module RSpec - module Mocks - # @private - module TargetDelegationClassMethods - def delegate_to(matcher_method) - define_method(:to) do |matcher, &block| - unless matcher_allowed?(matcher) - raise_unsupported_matcher(:to, matcher) - end - define_matcher(matcher, matcher_method, &block) - end - end - - def delegate_not_to(matcher_method, options={}) - method_name = options.fetch(:from) - define_method(method_name) do |matcher, &block| - case matcher - when Matchers::Receive, Matchers::HaveReceived - define_matcher(matcher, matcher_method, &block) - when Matchers::ReceiveMessages, Matchers::ReceiveMessageChain - raise_negation_unsupported(method_name, matcher) - else - raise_unsupported_matcher(method_name, matcher) - end - end - end - - def disallow_negation(method_name) - define_method(method_name) do |matcher, *_args| - raise_negation_unsupported(method_name, matcher) - end - end - end - - # @private - module TargetDelegationInstanceMethods - attr_reader :target - - private - - def matcher_allowed?(matcher) - Matchers::Matcher === matcher - end - - def define_matcher(matcher, name, &block) - matcher.__send__(name, target, &block) - end - - def raise_unsupported_matcher(method_name, matcher) - raise UnsupportedMatcherError, - "only the `receive`, `have_received` and `receive_messages` matchers are supported " \ - "with `#{expression}(...).#{method_name}`, but you have provided: #{matcher}" - end - - def raise_negation_unsupported(method_name, matcher) - raise NegationUnsupportedError, - "`#{expression}(...).#{method_name} #{matcher.matcher_name}` is not supported since it " \ - "doesn't really make sense. What would it even mean?" - end - end - - # @private - class TargetBase - def initialize(target) - @target = target - end - - extend TargetDelegationClassMethods - include TargetDelegationInstanceMethods - end - - # @private - module ExpectationTargetMethods - extend TargetDelegationClassMethods - include TargetDelegationInstanceMethods - - delegate_to :setup_expectation - delegate_not_to :setup_negative_expectation, :from => :not_to - delegate_not_to :setup_negative_expectation, :from => :to_not - - def expression - :expect - end - end - - # @private - class ExpectationTarget < TargetBase - include ExpectationTargetMethods - end - - # @private - class AllowanceTarget < TargetBase - def expression - :allow - end - - delegate_to :setup_allowance - disallow_negation :not_to - disallow_negation :to_not - end - - # @private - class AnyInstanceAllowanceTarget < TargetBase - def expression - :allow_any_instance_of - end - - delegate_to :setup_any_instance_allowance - disallow_negation :not_to - disallow_negation :to_not - end - - # @private - class AnyInstanceExpectationTarget < TargetBase - def expression - :expect_any_instance_of - end - - delegate_to :setup_any_instance_expectation - delegate_not_to :setup_any_instance_negative_expectation, :from => :not_to - delegate_not_to :setup_any_instance_negative_expectation, :from => :to_not - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/test_double.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/test_double.rb deleted file mode 100644 index fed46dd..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/test_double.rb +++ /dev/null @@ -1,173 +0,0 @@ -module RSpec - module Mocks - # Implements the methods needed for a pure test double. RSpec::Mocks::Double - # includes this module, and it is provided for cases where you want a - # pure test double without subclassing RSpec::Mocks::Double. - module TestDouble - # Creates a new test double with a `name` (that will be used in error - # messages only) - def initialize(name=nil, stubs={}) - @__expired = false - if Hash === name && stubs.empty? - stubs = name - @name = nil - else - @name = name - end - assign_stubs(stubs) - end - - # Tells the object to respond to all messages. If specific stub values - # are declared, they'll work as expected. If not, the receiver is - # returned. - def as_null_object - __mock_proxy.as_null_object - end - - # Returns true if this object has received `as_null_object` - def null_object? - __mock_proxy.null_object? - end - - # This allows for comparing the mock to other objects that proxy such as - # ActiveRecords belongs_to proxy objects. By making the other object run - # the comparison, we're sure the call gets delegated to the proxy - # target. - def ==(other) - other == __mock_proxy - end - - # @private - def inspect - TestDoubleFormatter.format(self) - end - - # @private - def to_s - inspect.tr('<', '[').tr('>', ']') - end - - # @private - def respond_to?(message, incl_private=false) - return true if __mock_proxy.null_object? - - super - end - - # @private - def __build_mock_proxy_unless_expired(order_group) - __raise_expired_error || __build_mock_proxy(order_group) - end - - # @private - def __disallow_further_usage! - @__expired = true - end - - # Override for default freeze implementation to prevent freezing of test - # doubles. - def freeze - RSpec.warn_with("WARNING: you attempted to freeze a test double. This is explicitly a no-op as freezing doubles can lead to undesired behaviour when resetting tests.") - self - end - - private - - def method_missing(message, *args, &block) - proxy = __mock_proxy - proxy.record_message_received(message, *args, &block) - - if proxy.null_object? - case message - when :to_int then return 0 - when :to_a, :to_ary then return nil - when :to_str then return to_s - else return self - end - end - - # Defined private and protected methods will still trigger `method_missing` - # when called publicly. We want ruby's method visibility error to get raised, - # so we simply delegate to `super` in that case. - # ...well, we would delegate to `super`, but there's a JRuby - # bug, so we raise our own visibility error instead: - # https://github.com/jruby/jruby/issues/1398 - visibility = proxy.visibility_for(message) - if visibility == :private || visibility == :protected - ErrorGenerator.new(self).raise_non_public_error( - message, visibility - ) - end - - # Required wrapping doubles in an Array on Ruby 1.9.2 - raise NoMethodError if [:to_a, :to_ary].include? message - proxy.raise_unexpected_message_error(message, args) - end - - def assign_stubs(stubs) - stubs.each_pair do |message, response| - __mock_proxy.add_simple_stub(message, response) - end - end - - def __mock_proxy - ::RSpec::Mocks.space.proxy_for(self) - end - - def __build_mock_proxy(order_group) - TestDoubleProxy.new(self, order_group) - end - - def __raise_expired_error - return false unless @__expired - ErrorGenerator.new(self).raise_expired_test_double_error - end - - def initialize_copy(other) - as_null_object if other.null_object? - super - end - end - - # A generic test double object. `double`, `instance_double` and friends - # return an instance of this. - class Double - include TestDouble - end - - # @private - module TestDoubleFormatter - def self.format(dbl, unwrap=false) - format = "#{type_desc(dbl)}#{verified_module_desc(dbl)} #{name_desc(dbl)}" - return format if unwrap - "#<#{format}>" - end - - class << self - private - - def type_desc(dbl) - case dbl - when InstanceVerifyingDouble then "InstanceDouble" - when ClassVerifyingDouble then "ClassDouble" - when ObjectVerifyingDouble then "ObjectDouble" - else "Double" - end - end - - # @private - IVAR_GET = Object.instance_method(:instance_variable_get) - - def verified_module_desc(dbl) - return nil unless VerifyingDouble === dbl - "(#{IVAR_GET.bind(dbl).call(:@doubled_module).description})" - end - - def name_desc(dbl) - return "(anonymous)" unless (name = IVAR_GET.bind(dbl).call(:@name)) - name.inspect - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_double.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_double.rb deleted file mode 100644 index 3402967..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_double.rb +++ /dev/null @@ -1,125 +0,0 @@ -RSpec::Support.require_rspec_mocks 'verifying_proxy' - -module RSpec - module Mocks - # @private - module VerifyingDouble - def respond_to?(message, include_private=false) - return super unless null_object? - - method_ref = __mock_proxy.method_reference[message] - - case method_ref.visibility - when :public then true - when :private then include_private - when :protected then include_private || RUBY_VERSION.to_f < 2.0 - else !method_ref.unimplemented? - end - end - - def method_missing(message, *args, &block) - # Null object conditional is an optimization. If not a null object, - # validity of method expectations will have been checked at definition - # time. - if null_object? - if @__sending_message == message - __mock_proxy.ensure_implemented(message) - else - __mock_proxy.ensure_publicly_implemented(message, self) - end - - __mock_proxy.validate_arguments!(message, args) - end - - super - end - - # Redefining `__send__` causes ruby to issue a warning. - old, $VERBOSE = $VERBOSE, nil - # rubocop:disable Naming/MethodName - def __send__(name, *args, &block) - @__sending_message = name - super - ensure - @__sending_message = nil - end - # rubocop:enable Naming/MethodName - ruby2_keywords :__send__ if respond_to?(:ruby2_keywords, true) - $VERBOSE = old - - def send(name, *args, &block) - __send__(name, *args, &block) - end - ruby2_keywords :send if respond_to?(:ruby2_keywords, true) - - def initialize(doubled_module, *args) - @doubled_module = doubled_module - - possible_name = args.first - name = if String === possible_name || Symbol === possible_name - args.shift - end - - super(name, *args) - @__sending_message = nil - end - end - - # A mock providing a custom proxy that can verify the validity of any - # method stubs or expectations against the public instance methods of the - # given class. - # - # @private - class InstanceVerifyingDouble - include TestDouble - include VerifyingDouble - - def __build_mock_proxy(order_group) - VerifyingProxy.new(self, order_group, - @doubled_module, - InstanceMethodReference - ) - end - end - - # An awkward module necessary because we cannot otherwise have - # ClassVerifyingDouble inherit from Module and still share these methods. - # - # @private - module ObjectVerifyingDoubleMethods - include TestDouble - include VerifyingDouble - - def as_stubbed_const(options={}) - ConstantMutator.stub(@doubled_module.const_to_replace, self, options) - self - end - - private - - def __build_mock_proxy(order_group) - VerifyingProxy.new(self, order_group, - @doubled_module, - ObjectMethodReference - ) - end - end - - # Similar to an InstanceVerifyingDouble, except that it verifies against - # public methods of the given object. - # - # @private - class ObjectVerifyingDouble - include ObjectVerifyingDoubleMethods - end - - # Effectively the same as an ObjectVerifyingDouble (since a class is a type - # of object), except with Module in the inheritance chain so that - # transferring nested constants to work. - # - # @private - class ClassVerifyingDouble < Module - include ObjectVerifyingDoubleMethods - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_message_expectation.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_message_expectation.rb deleted file mode 100644 index d6dcb57..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_message_expectation.rb +++ /dev/null @@ -1,55 +0,0 @@ -RSpec::Support.require_rspec_support 'method_signature_verifier' - -module RSpec - module Mocks - # A message expectation that knows about the real implementation of the - # message being expected, so that it can verify that any expectations - # have the valid arguments. - # @api private - class VerifyingMessageExpectation < MessageExpectation - # A level of indirection is used here rather than just passing in the - # method itself, since method look up is expensive and we only want to - # do it if actually needed. - # - # Conceptually the method reference makes more sense as a constructor - # argument since it should be immutable, but it is significantly more - # straight forward to build the object in pieces so for now it stays as - # an accessor. - attr_accessor :method_reference - - def initialize(*args) - super - end - - # @private - def with(*args, &block) - super(*args, &block).tap do - validate_expected_arguments! do |signature| - example_call_site_args = [:an_arg] * signature.min_non_kw_args - example_call_site_args << :kw_args_hash if signature.required_kw_args.any? - @argument_list_matcher.resolve_expected_args_based_on(example_call_site_args) - end - end - end - ruby2_keywords(:with) if respond_to?(:ruby2_keywords, true) - - private - - def validate_expected_arguments! - return if method_reference.nil? - - method_reference.with_signature do |signature| - args = yield signature - verifier = Support::LooseSignatureVerifier.new(signature, args) - - unless verifier.valid? - # Fail fast is required, otherwise the message expectation will fail - # as well ("expected method not called") and clobber this one. - @failed_fast = true - @error_generator.raise_invalid_arguments_error(verifier) - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_proxy.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_proxy.rb deleted file mode 100644 index 6147b81..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/verifying_proxy.rb +++ /dev/null @@ -1,221 +0,0 @@ -RSpec::Support.require_rspec_mocks 'verifying_message_expectation' -RSpec::Support.require_rspec_mocks 'method_reference' - -module RSpec - module Mocks - # @private - class CallbackInvocationStrategy - def call(doubled_module) - RSpec::Mocks.configuration.verifying_double_callbacks.each do |block| - block.call doubled_module - end - end - end - - # @private - class NoCallbackInvocationStrategy - def call(_doubled_module) - end - end - - # @private - module VerifyingProxyMethods - def add_stub(method_name, opts={}, &implementation) - ensure_implemented(method_name) - super - end - - def add_simple_stub(method_name, *args) - ensure_implemented(method_name) - super - end - - def add_message_expectation(method_name, opts={}, &block) - ensure_implemented(method_name) - super - end - - def ensure_implemented(method_name) - return unless method_reference[method_name].unimplemented? - - @error_generator.raise_unimplemented_error( - @doubled_module, - method_name, - @object - ) - end - - def ensure_publicly_implemented(method_name, _object) - ensure_implemented(method_name) - visibility = method_reference[method_name].visibility - - return if visibility == :public - @error_generator.raise_non_public_error(method_name, visibility) - end - end - - # A verifying proxy mostly acts like a normal proxy, except that it - # contains extra logic to try and determine the validity of any expectation - # set on it. This includes whether or not methods have been defined and the - # validity of arguments on method calls. - # - # In all other ways this behaves like a normal proxy. It only adds the - # verification behaviour to specific methods then delegates to the parent - # implementation. - # - # These checks are only activated if the doubled class has already been - # loaded, otherwise they are disabled. This allows for testing in - # isolation. - # - # @private - class VerifyingProxy < TestDoubleProxy - include VerifyingProxyMethods - - def initialize(object, order_group, doubled_module, method_reference_class) - super(object, order_group) - @object = object - @doubled_module = doubled_module - @method_reference_class = method_reference_class - - # A custom method double is required to pass through a way to lookup - # methods to determine their parameters. This is only relevant if the doubled - # class is loaded. - @method_doubles = Hash.new do |h, k| - h[k] = VerifyingMethodDouble.new(@object, k, self, method_reference[k]) - end - end - - def method_reference - @method_reference ||= Hash.new do |h, k| - h[k] = @method_reference_class.for(@doubled_module, k) - end - end - - def visibility_for(method_name) - method_reference[method_name].visibility - end - - def validate_arguments!(method_name, args) - @method_doubles[method_name].validate_arguments!(args) - end - end - - # @private - DEFAULT_CALLBACK_INVOCATION_STRATEGY = CallbackInvocationStrategy.new - - # @private - class VerifyingPartialDoubleProxy < PartialDoubleProxy - include VerifyingProxyMethods - - def initialize(object, expectation_ordering, optional_callback_invocation_strategy=DEFAULT_CALLBACK_INVOCATION_STRATEGY) - super(object, expectation_ordering) - @doubled_module = DirectObjectReference.new(object) - - # A custom method double is required to pass through a way to lookup - # methods to determine their parameters. - @method_doubles = Hash.new do |h, k| - h[k] = VerifyingExistingMethodDouble.for(object, k, self) - end - - optional_callback_invocation_strategy.call(@doubled_module) - end - - def ensure_implemented(_method_name) - return if Mocks.configuration.temporarily_suppress_partial_double_verification - super - end - - def method_reference - @method_doubles - end - end - - # @private - class VerifyingPartialClassDoubleProxy < VerifyingPartialDoubleProxy - include PartialClassDoubleProxyMethods - end - - # @private - class VerifyingMethodDouble < MethodDouble - def initialize(object, method_name, proxy, method_reference) - super(object, method_name, proxy) - @method_reference = method_reference - end - - def message_expectation_class - VerifyingMessageExpectation - end - - def add_expectation(*args, &block) - # explicit params necessary for 1.8.7 see #626 - super(*args, &block).tap { |x| x.method_reference = @method_reference } - end - - def add_stub(*args, &block) - # explicit params necessary for 1.8.7 see #626 - super(*args, &block).tap { |x| x.method_reference = @method_reference } - end - - def proxy_method_invoked(obj, *args, &block) - validate_arguments!(args) - super - end - ruby2_keywords :proxy_method_invoked if respond_to?(:ruby2_keywords, true) - - def validate_arguments!(actual_args) - @method_reference.with_signature do |signature| - verifier = Support::StrictSignatureVerifier.new(signature, actual_args) - raise ArgumentError, verifier.error_message unless verifier.valid? - end - end - end - - # A VerifyingMethodDouble fetches the method to verify against from the - # original object, using a MethodReference. This works for pure doubles, - # but when the original object is itself the one being modified we need to - # collapse the reference and the method double into a single object so that - # we can access the original pristine method definition. - # - # @private - class VerifyingExistingMethodDouble < VerifyingMethodDouble - def initialize(object, method_name, proxy) - super(object, method_name, proxy, self) - - @valid_method = object.respond_to?(method_name, true) - - # Trigger an eager find of the original method since if we find it any - # later we end up getting a stubbed method with incorrect arity. - save_original_implementation_callable! - end - - def with_signature - yield Support::MethodSignature.new(original_implementation_callable) - end - - def unimplemented? - !@valid_method - end - - def self.for(object, method_name, proxy) - if ClassNewMethodReference.applies_to?(method_name) { object } - VerifyingExistingClassNewMethodDouble - elsif Mocks.configuration.temporarily_suppress_partial_double_verification - MethodDouble - else - self - end.new(object, method_name, proxy) - end - end - - # Used in place of a `VerifyingExistingMethodDouble` for the specific case - # of mocking or stubbing a `new` method on a class. In this case, we substitute - # the method signature from `#initialize` since new's signature is just `*args`. - # - # @private - class VerifyingExistingClassNewMethodDouble < VerifyingExistingMethodDouble - def with_signature - yield Support::MethodSignature.new(object.instance_method(:initialize)) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/version.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/version.rb deleted file mode 100644 index 9b42c77..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-mocks-3.13.5/lib/rspec/mocks/version.rb +++ /dev/null @@ -1,9 +0,0 @@ -module RSpec - module Mocks - # Version information for RSpec mocks. - module Version - # Version of RSpec mocks currently in use in SemVer format. - STRING = '3.13.5' - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/Changelog.md b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/Changelog.md deleted file mode 100644 index b13ecbb..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/Changelog.md +++ /dev/null @@ -1,429 +0,0 @@ -### Development -[Full Changelog](https://github.com/rspec/rspec/compare/rspec-support-v3.13.5...3-13-maintenance) - -### 3.13.5 -[Full Changelog](http://github.com/rspec/rspec/compare/rspec-support-v3.13.4...rspec-support-v3.13.5) - -Bug Fixes: - -* Fix regression in `RSpec::Support::MethodSignature` where positional argument arity confused - a check for keyword arguments, meaning a hash would be wrongly detected as keyword arguments - when it should have been a positional argument. (Malcolm O'Hare, rspec/rspec#121) - -### 3.13.4 -[Full Changelog](http://github.com/rspec/rspec/compare/rspec-support-v3.13.3...rspec-support-v3.13.4) - -Bug Fixes: - -* Fix homepage link in gemspec. (Jon Rowe) - -### 3.13.3 / 2025-04-30 -[Full Changelog](http://github.com/rspec/rspec/compare/rspec-support-v3.13.2...rspec-support-v3.13.3) - -Bug Fixes: - -* Support for changes in diff-lcs and Ruby 3.4 in spec helpers. (Jon Rowe, #164 etc) - -### 3.13.2 / 2024-12-02 -[Full Changelog](http://github.com/rspec/rspec/compare/rspec-support-v3.13.1...rspec-support-v3.13.2) - -No changes. Released during the monorepo migration to test release processes, but accidentally -contained no changes. - -### 3.13.1 / 2024-02-23 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.13.0...v3.13.1) - -Bug Fixes: - -* Exclude ruby internal require warnings from `RSpec::Support::CallerFilter#first_non_rspec_line`. - (Jon Rowe, rspec/rspec-support#593) - -### 3.13.0 / 2024-02-04 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.12.2...v3.13.0) - -Enchancements - -* Add `RubyFeatures#supports_syntax_suggest?`. (Jon Rowe, rspec/rspec-support#571) - -Bug Fixes: - -* Allow string keys for keyword arguments during verification of method - signatures, (but only on Ruby 3+). (@malcolmohare, rspec/rspec-support#591) - -### 3.12.2 / 2024-02-04 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.12.1...v3.12.2) - -Bug Fixes: - -* Properly surface errors from `in_sub_process`. (Jon Rowe, rspec/rspec-support#575) -* Add magic comment for freezing string literals. (Josh Nichols, rspec/rspec-support#586) - -### 3.12.1 / 2023-06-26 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.12.0...v3.12.1) - -Bug Fixes: - -* Fix `RSpec::Support.thread_local_data` to be Thread local but not Fiber local. - (Jon Rowe, rspec/rspec-support#581) - -### 3.12.0 / 2022-10-26 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.11.1...v3.12.0) -Enhancements: - -* Add `RSpec::Support::RubyFeatures.distincts_kw_args_from_positional_hash?` - (Jean byroot Boussier, rspec/rspec-support#535) - -### 3.11.1 / 2022-09-12 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.11.0...v3.11.1) - -Bug Fixes: - -* Fix ripper detection on TruffleRuby. (Brandon Fish, rspec/rspec-support#541) - -### 3.11.0 / 2022-02-09 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.10.3...v3.11.0) - -No changes. Released to support other RSpec releases. - -### 3.10.3 / 2021-11-03 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.10.2...v3.10.3) - -Bug Fixes: - -* Use `Mutex#owned?` to allow `RSpec::Support::ReentrantMutex` to work in - nested Fibers on Ruby 3.0 and later. (Benoit Daloze, rspec/rspec-support#503, rspec/rspec-support#504) -* Support `end`-less methods in `RSpec::Support::Source::Token` - so that RSpec won't hang when an `end`-less method raises an error. (Yuji Nakayama, rspec/rspec-support#505) - -### 3.10.2 / 2021-01-28 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.10.1...v3.10.2) - -Bug Fixes: - -* Fix issue with `RSpec::Support.define_optimized_require_for_rspec` on JRuby - 9.1.17.0 (Jon Rowe, rspec/rspec-support#492) - -### 3.10.1 / 2020-12-27 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.10.0...v3.10.1) - -Bug Fixes: - -* Fix deprecation expectations to fail correctly when - asserting on messages. (Phil Pirozhkov, rspec/rspec-support#453) - -### 3.10.0 / 2020-10-30 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.4...v3.10.0) - -No changes. Released to support other RSpec releases. - -### 3.9.4 / 2020-10-23 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.3...v3.9.4) - -Bug Fixes: - -* Flag ripper as supported on Truffle Ruby. (Brandon Fish, rspec/rspec-support#427) -* Prevent stubbing `File.read` from breaking source extraction. - (Jon Rowe, rspec/rspec-support#431) - -### 3.9.3 / 2020-05-02 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.2...v3.9.3) - -Bug Fixes: - -* Mark ripper as unsupported on Truffle Ruby. (Brandon Fish, rspec/rspec-support#395) -* Mark ripper as unsupported on JRuby 9.2.0.0. (Brian Hawley, rspec/rspec-support#400) -* Capture `Mutex.new` for our `RSpec::Support:Mutex` in order to - allow stubbing `Mutex.new`. (Jon Rowe, rspec/rspec-support#411) - -### 3.9.2 / 2019-12-30 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.1...v3.9.2) - -Bug Fixes: - -* Remove unneeded eval. (Matijs van Zuijlen, rspec/rspec-support#394) - -### 3.9.1 / 2019-12-28 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.9.0...v3.9.1) - -Bug Fixes: - -* Remove warning caused by keyword arguments on Ruby 2.7.0. - (Jon Rowe, rspec/rspec-support#392) - -### 3.9.0 / 2019-10-07 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.3...v3.9.0) - -*NO CHANGES* - -Version 3.9.0 was released to allow other RSpec gems to release 3.9.0. - -### 3.8.3 / 2019-10-02 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.2...v3.8.3) - -Bug Fixes: - -* Escape \r when outputting strings inside arrays. - (Tomita Masahiro, Jon Rowe, rspec/rspec-support#378) -* Ensure that optional hash arguments are recognised correctly vs keyword - arguments. (Evgeni Dzhelyov, rspec/rspec-support#366) - -### 3.8.2 / 2019-06-10 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.1...v3.8.2) - -Bug Fixes: - -* Ensure that an empty hash is recognised as empty keyword arguments when - applicable. (Thomas Walpole, rspec/rspec-support#375) -* Ensure that diffing truthy values produce diffs consistently. - (Lucas Nestor, rspec/rspec-support#377) - -### 3.8.1 / 2019-03-03 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.8.0...v3.8.1) - -Bug Fixes: - -* Ensure that inspecting a `SimpleDelegator` based object works regardless of - visibility of the `__getobj__` method. (Jon Rowe, rspec/rspec-support#369) - -### 3.8.0 / 2018-08-04 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.7.1...v3.8.0) - -Bug Fixes: - -* Order hash keys before diffing to improve diff accuracy when using mocked calls. - (James Crisp, rspec/rspec-support#334) - -### 3.7.1 / 2018-01-29 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.7.0...v3.7.1) - -Bug Fixes: - -* Fix source extraction logic so that it does not trigger a `SystemStackError` - when processing deeply nested example groups. (Craig Bass, rspec/rspec-support#343) - -### 3.7.0 / 2017-10-17 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.6.0...v3.7.0) - -Enhancements: - -* Improve compatibility with `--enable-frozen-string-literal` option - on Ruby 2.3+. (Pat Allan, rspec/rspec-support#320) -* Add `Support.class_of` for extracting class of any object. - (Yuji Nakayama, rspec/rspec-support#325) - -Bug Fixes: - -* Fix recursive const support to not blow up when given buggy classes - that raise odd errors from `#to_str`. (Myron Marston, rspec/rspec-support#317) - -### 3.6.0 / 2017-05-04 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.6.0.beta2...3.6.0) - -Enhancements: - -* Import `Source` classes from rspec-core. (Yuji Nakayama, rspec/rspec-support#315) - -### 3.6.0.beta2 / 2016-12-12 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.6.0.beta1...v3.6.0.beta2) - -No user-facing changes. - -### 3.6.0.beta1 / 2016-10-09 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0...v3.6.0.beta1) - -Bug Fixes: - -* Prevent truncated formatted object output from mangling console codes. (rspec/rspec-support#294, Anson Kelly) - -### 3.5.0 / 2016-07-01 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0.beta4...v3.5.0) - -**No user facing changes since beta4** - -### 3.5.0.beta4 / 2016-06-05 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0.beta3...v3.5.0.beta4) - -Enhancements: -* Improve `MethodSignature` to better support keyword arguments. (rspec/rspec-support#250, Rob Smith). - -### 3.5.0.beta3 / 2016-04-02 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0.beta2...v3.5.0.beta3) - -Bug Fixes: - -* Fix `EncodedString` to properly handle the behavior of `String#split` - on JRuby when the string contains invalid bytes. (Jon Rowe, rspec/rspec-support#268) -* Fix `ObjectFormatter` so that formatting objects that don't respond to - `#inspect` (such as `BasicObject`) does not cause `NoMethodError`. - (Yuji Nakayama, rspec/rspec-support#269) -* Fix `ObjectFormatter` so that formatting recursive array or hash does not - cause `SystemStackError`. (Yuji Nakayama, rspec/rspec-support#270, rspec/rspec-support#272) - -### 3.5.0.beta2 / 2016-03-10 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.5.0.beta1...v3.5.0.beta2) - -No user-facing changes. - -### 3.5.0.beta1 / 2016-02-06 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.4.1...v3.5.0.beta1) - -Enhancements: - -* Improve formatting of objects by allowing truncation to a pre-configured length. - (Liam M, rspec/rspec-support#256) - -### 3.4.1 / 2015-11-20 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.4.0...v3.4.1) - -Bug Fixes: - -* Fix `RSpec::Support::RubyFeature.ripper_supported?` so it returns - `false` on Rubinius since the Rubinius team has no plans to support - it. This prevents rspec-core from trying to load and use ripper to - extract failure snippets. (Aaron Stone, rspec/rspec-support#251) - -Changes: - -* Remove `VersionChecker` in favor of `ComparableVersion`. (Yuji Nakayama, rspec/rspec-support#266) - -### 3.4.0 / 2015-11-11 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.3.0...v3.4.0) - -Enhancements: - -* Improve formatting of `Delegator` based objects (e.g. `SimpleDelegator`) in - failure messages and diffs. (Andrew Horner, rspec/rspec-support#215) -* Add `ComparableVersion`. (Yuji Nakayama, rspec/rspec-support#245) -* Add `Ripper` support detection. (Yuji Nakayama, rspec/rspec-support#245) - -Bug Fixes: - -* Work around bug in JRuby that reports that `attr_writer` methods - have no parameters, causing RSpec's verifying doubles to wrongly - fail when mocking or stubbing a writer method on JRuby. (Myron Marston, rspec/rspec-support#225) - -### 3.3.0 / 2015-06-12 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.2.2...v3.3.0) - -Enhancements: - -* Improve formatting of arrays and hashes in failure messages so they - use our custom formatting of matchers, time objects, etc. - (Myron Marston, Nicholas Chmielewski, rspec/rspec-support#205) -* Use improved formatting for diffs as well. (Nicholas Chmielewski, rspec/rspec-support#205) - -Bug Fixes: - -* Fix `FuzzyMatcher` so that it checks `expected == actual` rather than - `actual == expected`, which avoids errors in situations where the - `actual` object's `==` is improperly implemented to assume that only - objects of the same type will be given. This allows rspec-mocks' - `anything` to match against objects with buggy `==` definitions. - (Myron Marston, rspec/rspec-support#193) - -### 3.2.2 / 2015-02-23 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.2.1...v3.2.2) - -Bug Fixes: - -* Fix an encoding issue with `EncodedString#split` when encountering an - invalid byte string. (Benjamin Fleischer, rspec/rspec-support#1760) - -### 3.2.1 / 2015-02-04 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.2.0...v3.2.1) - -Bug Fixes: - -* Fix `RSpec::CallerFilter` to work on Rubinius 2.2. - (Myron Marston, rspec/rspec-support#169) - -### 3.2.0 / 2015-02-03 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.1.2...v3.2.0) - -Enhancements: - -* Add extra Ruby type detection. (Jon Rowe, rspec/rspec-support#133) -* Make differ instance re-usable. (Alexey Fedorov, rspec/rspec-support#160) - -Bug Fixes: - -* Do not consider `[]` and `{}` to match when performing fuzzy matching. - (Myron Marston, rspec/rspec-support#157) - -### 3.1.2 / 2014-10-08 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.1.1...v3.1.2) - -Bug Fixes: - -* Fix method signature to not blow up with a `NoMethodError` on 1.8.7 when - verifying against an RSpec matcher. (Myron Marston, rspec/rspec-support#116) - -### 3.1.1 / 2014-09-26 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.1.0...v3.1.1) - -Bug Fixes: - -* Fix `RSpec::Support::DirectoryMaker` (used by `rspec --init` and - `rails generate rspec:install`) so that it detects absolute paths - on Windows properly. (Scott Archer, rspec/rspec-support#107, rspec/rspec-support#108, rspec/rspec-support#109) (Jon Rowe, rspec/rspec-support#110) - -### 3.1.0 / 2014-09-04 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.4...v3.1.0) - -Bug Fixes: - -* Fix `FuzzyMatcher` so that it does not wrongly match a struct against - an array. (Myron Marston, rspec/rspec-support#97) -* Prevent infinitely recursing `#flatten` methods from causing the differ - to hang. (Jon Rowe, rspec/rspec-support#101) - -### 3.0.4 / 2014-08-14 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.3...v3.0.4) - -Bug Fixes: - -* Fix `FuzzyMatcher` so that it does not silence `ArgumentError` raised - from broken implementations of `==`. (Myron Marston, rspec/rspec-support#94) - -### 3.0.3 / 2014-07-21 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.2...v3.0.3) - -Bug Fixes: - -* Fix regression in `Support#method_handle_for` where proxy objects - with method delegated would wrongly not return a method handle. - (Jon Rowe, rspec/rspec-support#90) -* Properly detect Module#prepend support in Ruby 2.1+ (Ben Langfeld, rspec/rspec-support#91) -* Fix `rspec/support/warnings.rb` so it can be loaded and used in - isolation. (Myron Marston, rspec/rspec-support#93) - -### 3.0.2 / 2014-06-20 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.1...v3.0.2) - -* Revert `BlockSignature` change from 3.0.1 because of a ruby bug that - caused it to change the block's behavior (https://bugs.ruby-lang.org/issues/9967). - (Myron Marston, rspec-mocksrspec/rspec-support#721) - -### 3.0.1 / 2014-06-19 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.0...v3.0.1) - -* Fix `BlockSignature` so that it correctly differentiates between - required and optional block args. (Myron Marston, rspec-mocksrspec/rspec-support#714) - -### 3.0.0 / 2014-06-01 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.0.rc1...v3.0.0) - -### 3.0.0.rc1 / 2014-05-18 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.0.beta2...v3.0.0.rc1) - -### 3.0.0.beta2 / 2014-02-17 -[Full Changelog](http://github.com/rspec/rspec-support/compare/v3.0.0.beta1...v3.0.0.beta2) - -Bug Fixes: - -* Issue message when :replacement is passed to `RSpec.warn_with`. (Jon Rowe) - -### 3.0.0.beta1 / 2013-11-07 -[Full Changelog](https://github.com/rspec/rspec-support/compare/0dc12d1bdbbacc757a9989f8c09cd08ef3a4837e...v3.0.0.beta1) - -Initial release. diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/LICENSE.md b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/LICENSE.md deleted file mode 100644 index 08aa3ab..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/LICENSE.md +++ /dev/null @@ -1,23 +0,0 @@ -The MIT License (MIT) -==================== - -* Copyright © 2013 David Chelimsky, Myron Marston, Jon Rowe, Sam Phippen, Xavier Shay, Bradley Schaefer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/README.md b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/README.md deleted file mode 100644 index bb88209..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# RSpec::Support [![Build Status](https://github.com/rspec/rspec-support/workflows/RSpec%20CI/badge.svg)](https://github.com/rspec/rspec-support/actions) - -`RSpec::Support` provides common functionality to `RSpec::Core`, -`RSpec::Expectations` and `RSpec::Mocks`. It is considered -suitable for internal use only at this time. - -## Installation / Usage - -Install one or more of the `RSpec` gems. - -Want to run against the `main` branch? You'll need to include the dependent -RSpec repos as well. Add the following to your `Gemfile`: - -```ruby -%w[rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib| - gem lib, :git => "https://github.com/rspec/#{lib}.git", :branch => 'main' -end -``` - -## Contributing - -Once you've set up the environment, you'll need to cd into the working -directory of whichever repo you want to work in. From there you can run the -specs and cucumber features, and make patches. - -NOTE: You do not need to use rspec-dev to work on a specific RSpec repo. You -can treat each RSpec repo as an independent project. - -- [Build details](BUILD_DETAIL.md) -- [Code of Conduct](CODE_OF_CONDUCT.md) -- [Detailed contributing guide](CONTRIBUTING.md) -- [Development setup guide](DEVELOPMENT.md) - -## Patches - -Please submit a pull request or a github issue. If you submit an issue, please -include a link to either of: - -* a gist (or equivalent) of the patch -* a branch or commit in your github fork of the repo diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support.rb deleted file mode 100644 index 72154e0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support.rb +++ /dev/null @@ -1,162 +0,0 @@ -# frozen_string_literal: true - -module RSpec - module Support - # @api private - # - # Defines a helper method that is optimized to require files from the - # named lib. The passed block MUST be `{ |f| require_relative f }` - # because for `require_relative` to work properly from within the named - # lib the line of code must be IN that lib. - # - # `require_relative` is preferred when available because it is always O(1), - # regardless of the number of dirs in $LOAD_PATH. `require`, on the other - # hand, does a linear O(N) search over the dirs in the $LOAD_PATH until - # it can resolve the file relative to one of the dirs. - def self.define_optimized_require_for_rspec(lib, &require_relative) - name = "require_rspec_#{lib}" - - if RUBY_PLATFORM == 'java' && !Kernel.respond_to?(:require) - # JRuby 9.1.17.0 has developed a regression for require - (class << self; self; end).__send__(:define_method, name) do |f| - Kernel.send(:require, "rspec/#{lib}/#{f}") - end - elsif Kernel.respond_to?(:require_relative) - (class << self; self; end).__send__(:define_method, name) do |f| - require_relative.call("#{lib}/#{f}") - end - else - (class << self; self; end).__send__(:define_method, name) do |f| - require "rspec/#{lib}/#{f}" - end - end - end - - define_optimized_require_for_rspec(:support) { |f| require_relative(f) } - require_rspec_support "version" - require_rspec_support "ruby_features" - - # @api private - KERNEL_METHOD_METHOD = ::Kernel.instance_method(:method) - - # @api private - # - # Used internally to get a method handle for a particular object - # and method name. - # - # Includes handling for a few special cases: - # - # - Objects that redefine #method (e.g. an HTTPRequest struct) - # - BasicObject subclasses that mixin a Kernel dup (e.g. SimpleDelegator) - # - Objects that undefine method and delegate everything to another - # object (e.g. Mongoid association objects) - if RubyFeatures.supports_rebinding_module_methods? - def self.method_handle_for(object, method_name) - KERNEL_METHOD_METHOD.bind(object).call(method_name) - rescue NameError => original - begin - handle = object.method(method_name) - raise original unless handle.is_a? Method - handle - rescue Support::AllExceptionsExceptOnesWeMustNotRescue - raise original - end - end - else - def self.method_handle_for(object, method_name) - if ::Kernel === object - KERNEL_METHOD_METHOD.bind(object).call(method_name) - else - object.method(method_name) - end - rescue NameError => original - begin - handle = object.method(method_name) - raise original unless handle.is_a? Method - handle - rescue Support::AllExceptionsExceptOnesWeMustNotRescue - raise original - end - end - end - - # @api private - # - # Used internally to get a class of a given object, even if it does not respond to #class. - def self.class_of(object) - object.class - rescue NoMethodError - singleton_class = class << object; self; end - singleton_class.ancestors.find { |ancestor| !ancestor.equal?(singleton_class) } - end - - # A single thread local variable so we don't excessively pollute that namespace. - if RUBY_VERSION.to_f >= 2 - def self.thread_local_data - Thread.current.thread_variable_get(:__rspec) || Thread.current.thread_variable_set(:__rspec, {}) - end - else - def self.thread_local_data - Thread.current[:__rspec] ||= {} - end - end - - # @api private - def self.failure_notifier=(callable) - thread_local_data[:failure_notifier] = callable - end - - # @private - DEFAULT_FAILURE_NOTIFIER = lambda { |failure, _opts| raise failure } - - # @api private - def self.failure_notifier - thread_local_data[:failure_notifier] || DEFAULT_FAILURE_NOTIFIER - end - - # @api private - def self.notify_failure(failure, options={}) - failure_notifier.call(failure, options) - end - - # @api private - def self.with_failure_notifier(callable) - orig_notifier = failure_notifier - self.failure_notifier = callable - yield - ensure - self.failure_notifier = orig_notifier - end - - class << self - # @api private - attr_writer :warning_notifier - end - - # @private - DEFAULT_WARNING_NOTIFIER = lambda { |warning| ::Kernel.warn warning } - - # @api private - def self.warning_notifier - @warning_notifier ||= DEFAULT_WARNING_NOTIFIER - end - - # @private - module AllExceptionsExceptOnesWeMustNotRescue - # These exceptions are dangerous to rescue as rescuing them - # would interfere with things we should not interfere with. - AVOID_RESCUING = [NoMemoryError, SignalException, Interrupt, SystemExit] - - def self.===(exception) - AVOID_RESCUING.none? { |ar| ar === exception } - end - end - - # The Differ is only needed when a spec fails with a diffable failure. - # In the more common case of all specs passing or the only failures being - # non-diffable, we can avoid the extra cost of loading the differ, diff-lcs, - # pp, etc by avoiding an unnecessary require. Instead, autoload will take - # care of loading the differ on first use. - autoload :Differ, "rspec/support/differ" - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/caller_filter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/caller_filter.rb deleted file mode 100644 index e54b23a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/caller_filter.rb +++ /dev/null @@ -1,85 +0,0 @@ -# frozen_string_literal: true - -RSpec::Support.require_rspec_support "ruby_features" - -module RSpec - # Consistent implementation for "cleaning" the caller method to strip out - # non-rspec lines. This enables errors to be reported at the call site in - # the code using the library, which is far more useful than the particular - # internal method that raised an error. - class CallerFilter - RSPEC_LIBS = %w[ - core - mocks - expectations - support - matchers - rails - ] - - ADDITIONAL_TOP_LEVEL_FILES = %w[ autorun ] - - LIB_REGEX = %r{/lib/rspec/(#{(RSPEC_LIBS + ADDITIONAL_TOP_LEVEL_FILES).join('|')})(\.rb|/)} - - # rubygems/core_ext/kernel_require.rb isn't actually part of rspec (obviously) but we want - # it ignored when we are looking for the first meaningful line of the backtrace outside - # of RSpec. It can show up in the backtrace as the immediate first caller - # when `CallerFilter.first_non_rspec_line` is called from the top level of a required - # file, but it depends on if rubygems is loaded or not. We don't want to have to deal - # with this complexity in our `RSpec.deprecate` calls, so we ignore it here. - IGNORE_REGEX = Regexp.union(LIB_REGEX, "rubygems/core_ext/kernel_require.rb", "(other) - other = self.class.new(other) unless other.is_a?(self.class) - - return 0 if string == other.string - - longer_segment_count = [self, other].map { |version| version.segments.count }.max - - longer_segment_count.times do |index| - self_segment = segments[index] || 0 - other_segment = other.segments[index] || 0 - - if self_segment.class == other_segment.class - result = self_segment <=> other_segment - return result unless result == 0 - else - return self_segment.is_a?(String) ? -1 : 1 - end - end - - 0 - end - - def segments - @segments ||= string.scan(/[a-z]+|\d+/i).map do |segment| - if segment =~ /\A\d+\z/ - segment.to_i - else - segment - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/differ.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/differ.rb deleted file mode 100644 index 9488296..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/differ.rb +++ /dev/null @@ -1,217 +0,0 @@ -# frozen_string_literal: true - -RSpec::Support.require_rspec_support 'encoded_string' -RSpec::Support.require_rspec_support 'hunk_generator' -RSpec::Support.require_rspec_support "object_formatter" - -require 'pp' - -module RSpec - module Support - # rubocop:disable Metrics/ClassLength - class Differ - def diff(actual, expected) - diff = "" - - unless actual.nil? || expected.nil? - if all_strings?(actual, expected) - if any_multiline_strings?(actual, expected) - diff = diff_as_string(coerce_to_string(actual), coerce_to_string(expected)) - end - elsif no_procs?(actual, expected) && no_numbers?(actual, expected) - diff = diff_as_object(actual, expected) - end - end - - diff.to_s - end - - # rubocop:disable Metrics/MethodLength - def diff_as_string(actual, expected) - encoding = EncodedString.pick_encoding(actual, expected) - - actual = EncodedString.new(actual, encoding) - expected = EncodedString.new(expected, encoding) - - output = EncodedString.new("\n", encoding) - hunks = build_hunks(actual, expected) - - hunks.each_cons(2) do |prev_hunk, current_hunk| - begin - if current_hunk.overlaps?(prev_hunk) - add_old_hunk_to_hunk(current_hunk, prev_hunk) - else - add_to_output(output, prev_hunk.diff(format_type).to_s) - end - ensure - add_to_output(output, "\n") - end - end - - finalize_output(output, hunks.last.diff(format_type).to_s) if hunks.last - - color_diff output - rescue Encoding::CompatibilityError - handle_encoding_errors(actual, expected) - end - # rubocop:enable Metrics/MethodLength - - def diff_as_object(actual, expected) - actual_as_string = object_to_string(actual) - expected_as_string = object_to_string(expected) - diff_as_string(actual_as_string, expected_as_string) - end - - def color? - @color - end - - def initialize(opts={}) - @color = opts.fetch(:color, false) - @object_preparer = opts.fetch(:object_preparer, lambda { |string| string }) - end - - private - - def no_procs?(*args) - safely_flatten(args).none? { |a| Proc === a } - end - - def all_strings?(*args) - safely_flatten(args).all? { |a| String === a } - end - - def any_multiline_strings?(*args) - all_strings?(*args) && safely_flatten(args).any? { |a| multiline?(a) } - end - - def no_numbers?(*args) - safely_flatten(args).none? { |a| Numeric === a } - end - - def coerce_to_string(string_or_array) - return string_or_array unless Array === string_or_array - diffably_stringify(string_or_array).join("\n") - end - - def diffably_stringify(array) - array.map do |entry| - if Array === entry - entry.inspect - else - entry.to_s.gsub("\n", "\\n").gsub("\r", "\\r") - end - end - end - - if String.method_defined?(:encoding) - def multiline?(string) - string.include?("\n".encode(string.encoding)) - end - else - def multiline?(string) - string.include?("\n") - end - end - - def build_hunks(actual, expected) - HunkGenerator.new(actual, expected).hunks - end - - def finalize_output(output, final_line) - add_to_output(output, final_line) - add_to_output(output, "\n") - end - - def add_to_output(output, string) - output << string - end - - def add_old_hunk_to_hunk(hunk, oldhunk) - hunk.merge(oldhunk) - end - - def safely_flatten(array) - array = array.flatten(1) until (array == array.flatten(1)) - array - end - - def format_type - :unified - end - - def color(text, color_code) - "\e[#{color_code}m#{text}\e[0m" - end - - def red(text) - color(text, 31) - end - - def green(text) - color(text, 32) - end - - def blue(text) - color(text, 34) - end - - def normal(text) - color(text, 0) - end - - def color_diff(diff) - return diff unless color? - - diff.lines.map do |line| - case line[0].chr - when "+" - green line - when "-" - red line - when "@" - line[1].chr == "@" ? blue(line) : normal(line) - else - normal(line) - end - end.join - end - - def object_to_string(object) - object = @object_preparer.call(object) - case object - when Hash - hash_to_string(object) - when Array - PP.pp(ObjectFormatter.prepare_for_inspection(object), "".dup) - when String - object =~ /\n/ ? object : object.inspect - else - PP.pp(object, "".dup) - end - end - - def hash_to_string(hash) - formatted_hash = ObjectFormatter.prepare_for_inspection(hash) - formatted_hash.keys.sort_by { |k| k.to_s }.map do |key| - pp_key = PP.singleline_pp(key, "".dup) - pp_value = PP.singleline_pp(formatted_hash[key], "".dup) - - "#{pp_key} => #{pp_value}," - end.join("\n") - end - - def handle_encoding_errors(actual, expected) - if actual.source_encoding != expected.source_encoding - "Could not produce a diff because the encoding of the actual string " \ - "(#{actual.source_encoding}) differs from the encoding of the expected " \ - "string (#{expected.source_encoding})" - else - "Could not produce a diff because of the encoding of the string " \ - "(#{expected.source_encoding})" - end - end - end - # rubocop:enable Metrics/ClassLength - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/directory_maker.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/directory_maker.rb deleted file mode 100644 index c59d751..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/directory_maker.rb +++ /dev/null @@ -1,65 +0,0 @@ -# frozen_string_literal: true - -RSpec::Support.require_rspec_support 'ruby_features' - -module RSpec - module Support - # @api private - # - # Replacement for fileutils#mkdir_p because we don't want to require parts - # of stdlib in RSpec. - class DirectoryMaker - # @api private - # - # Implements nested directory construction - def self.mkdir_p(path) - stack = generate_stack(path) - path.split(File::SEPARATOR).each do |part| - stack = generate_path(stack, part) - begin - Dir.mkdir(stack) unless directory_exists?(stack) - rescue Errno::EEXIST => e - raise e unless directory_exists?(stack) - rescue Errno::ENOTDIR => e - raise Errno::EEXIST, e.message - end - end - end - - if OS.windows_file_path? - def self.generate_stack(path) - if path.start_with?(File::SEPARATOR) - File::SEPARATOR - elsif path[1] == ':' - '' - else - '.' - end - end - def self.generate_path(stack, part) - if stack == '' - part - elsif stack == File::SEPARATOR - File.join('', part) - else - File.join(stack, part) - end - end - else - def self.generate_stack(path) - path.start_with?(File::SEPARATOR) ? File::SEPARATOR : "." - end - def self.generate_path(stack, part) - File.join(stack, part) - end - end - - def self.directory_exists?(dirname) - File.exist?(dirname) && File.directory?(dirname) - end - private_class_method :directory_exists? - private_class_method :generate_stack - private_class_method :generate_path - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/encoded_string.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/encoded_string.rb deleted file mode 100644 index 044c151..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/encoded_string.rb +++ /dev/null @@ -1,163 +0,0 @@ -# frozen_string_literal: true - -module RSpec - module Support - # @private - class EncodedString - # Reduce allocations by storing constants. - UTF_8 = "UTF-8" - US_ASCII = "US-ASCII" - - # Ruby's default replacement string is: - # U+FFFD ("\xEF\xBF\xBD"), for Unicode encoding forms, else - # ? ("\x3F") - REPLACE = "?" - - def initialize(string, encoding=nil) - @encoding = encoding - @source_encoding = detect_source_encoding(string) - @string = matching_encoding(string) - end - attr_reader :source_encoding - - delegated_methods = String.instance_methods.map(&:to_s) & %w[eql? lines == encoding empty?] - delegated_methods.each do |name| - define_method(name) { |*args, &block| @string.__send__(name, *args, &block) } - end - - def <<(string) - @string << matching_encoding(string) - end - - if Ruby.jruby? - def split(regex_or_string) - @string.split(matching_encoding(regex_or_string)) - rescue ArgumentError - # JRuby raises an ArgumentError when splitting a source string that - # contains invalid bytes. - remove_invalid_bytes(@string).split regex_or_string - end - else - def split(regex_or_string) - @string.split(matching_encoding(regex_or_string)) - end - end - - def to_s - @string - end - alias :to_str :to_s - - if String.method_defined?(:encoding) - - private - - # Encoding Exceptions: - # - # Raised by Encoding and String methods: - # Encoding::UndefinedConversionError: - # when a transcoding operation fails - # if the String contains characters invalid for the target encoding - # e.g. "\x80".encode('UTF-8','ASCII-8BIT') - # vs "\x80".encode('UTF-8','ASCII-8BIT', undef: :replace, replace: '') - # # => '' - # Encoding::CompatibilityError - # when Encoding.compatible?(str1, str2) is nil - # e.g. utf_16le_emoji_string.split("\n") - # e.g. valid_unicode_string.encode(utf8_encoding) << ascii_string - # Encoding::InvalidByteSequenceError: - # when the string being transcoded contains a byte invalid for - # either the source or target encoding - # e.g. "\x80".encode('UTF-8','US-ASCII') - # vs "\x80".encode('UTF-8','US-ASCII', invalid: :replace, replace: '') - # # => '' - # ArgumentError - # when operating on a string with invalid bytes - # e.g."\x80".split("\n") - # TypeError - # when a symbol is passed as an encoding - # Encoding.find(:"UTF-8") - # when calling force_encoding on an object - # that doesn't respond to #to_str - # - # Raised by transcoding methods: - # Encoding::ConverterNotFoundError: - # when a named encoding does not correspond with a known converter - # e.g. 'abc'.force_encoding('UTF-8').encode('foo') - # or a converter path cannot be found - # e.g. "\x80".force_encoding('ASCII-8BIT').encode('Emacs-Mule') - # - # Raised by byte <-> char conversions - # RangeError: out of char range - # e.g. the UTF-16LE emoji: 128169.chr - def matching_encoding(string) - string = remove_invalid_bytes(string) - string.encode(@encoding) - rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError - # Originally defined as a constant to avoid unneeded allocations, this hash must - # be defined inline (without {}) to avoid warnings on Ruby 2.7 - # - # In MRI 2.1 'invalid: :replace' changed to also replace an invalid byte sequence - # see https://github.com/ruby/ruby/blob/v2_1_0/NEWS#L176 - # https://www.ruby-forum.com/topic/6861247 - # https://twitter.com/nalsh/status/553413844685438976 - # - # For example, given: - # "\x80".force_encoding("Emacs-Mule").encode(:invalid => :replace).bytes.to_a - # - # On MRI 2.1 or above: 63 # '?' - # else : 128 # "\x80" - # - string.encode(@encoding, :invalid => :replace, :undef => :replace, :replace => REPLACE) - rescue Encoding::ConverterNotFoundError - # Originally defined as a constant to avoid unneeded allocations, this hash must - # be defined inline (without {}) to avoid warnings on Ruby 2.7 - string.dup.force_encoding(@encoding).encode(:invalid => :replace, :replace => REPLACE) - end - - # Prevents raising ArgumentError - if String.method_defined?(:scrub) - # https://github.com/ruby/ruby/blob/eeb05e8c11/doc/NEWS-2.1.0#L120-L123 - # https://github.com/ruby/ruby/blob/v2_1_0/string.c#L8242 - # https://github.com/hsbt/string-scrub - # https://github.com/rubinius/rubinius/blob/v2.5.2/kernel/common/string.rb#L1913-L1972 - def remove_invalid_bytes(string) - string.scrub(REPLACE) - end - else - # http://stackoverflow.com/a/8711118/879854 - # Loop over chars in a string replacing chars - # with invalid encoding, which is a pretty good proxy - # for the invalid byte sequence that causes an ArgumentError - def remove_invalid_bytes(string) - string.chars.map do |char| - char.valid_encoding? ? char : REPLACE - end.join - end - end - - def detect_source_encoding(string) - string.encoding - end - - def self.pick_encoding(source_a, source_b) - Encoding.compatible?(source_a, source_b) || Encoding.default_external - end - else - - def self.pick_encoding(_source_a, _source_b) - end - - private - - def matching_encoding(string) - string - end - - def detect_source_encoding(_string) - US_ASCII - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/fuzzy_matcher.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/fuzzy_matcher.rb deleted file mode 100644 index 46c0cab..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/fuzzy_matcher.rb +++ /dev/null @@ -1,50 +0,0 @@ -# frozen_string_literal: true - -module RSpec - module Support - # Provides a means to fuzzy-match between two arbitrary objects. - # Understands array/hash nesting. Uses `===` or `==` to - # perform the matching. - module FuzzyMatcher - # @api private - def self.values_match?(expected, actual) - if Hash === actual - return hashes_match?(expected, actual) if Hash === expected - elsif Array === expected && Enumerable === actual && !(Struct === actual) - return arrays_match?(expected, actual.to_a) - end - - return true if expected == actual - - begin - expected === actual - rescue ArgumentError - # Some objects, like 0-arg lambdas on 1.9+, raise - # ArgumentError for `expected === actual`. - false - end - end - - # @private - def self.arrays_match?(expected_list, actual_list) - return false if expected_list.size != actual_list.size - - expected_list.zip(actual_list).all? do |expected, actual| - values_match?(expected, actual) - end - end - - # @private - def self.hashes_match?(expected_hash, actual_hash) - return false if expected_hash.size != actual_hash.size - - expected_hash.all? do |expected_key, expected_value| - actual_value = actual_hash.fetch(expected_key) { return false } - values_match?(expected_value, actual_value) - end - end - - private_class_method :arrays_match?, :hashes_match? - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/hunk_generator.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/hunk_generator.rb deleted file mode 100644 index 086a88e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/hunk_generator.rb +++ /dev/null @@ -1,49 +0,0 @@ -# frozen_string_literal: true - -require 'diff/lcs' -require 'diff/lcs/hunk' - -module RSpec - module Support - # @private - class HunkGenerator - def initialize(actual, expected) - @actual = actual - @expected = expected - end - - def hunks - @file_length_difference = 0 - @hunks ||= diffs.map do |piece| - build_hunk(piece) - end - end - - private - - def diffs - Diff::LCS.diff(expected_lines, actual_lines) - end - - def expected_lines - @expected.split("\n").map! { |e| e.chomp } - end - - def actual_lines - @actual.split("\n").map! { |e| e.chomp } - end - - def build_hunk(piece) - Diff::LCS::Hunk.new( - expected_lines, actual_lines, piece, context_lines, @file_length_difference - ).tap do |h| - @file_length_difference = h.file_length_difference - end - end - - def context_lines - 3 - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/matcher_definition.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/matcher_definition.rb deleted file mode 100644 index 6b7819c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/matcher_definition.rb +++ /dev/null @@ -1,44 +0,0 @@ -# frozen_string_literal: true - -module RSpec - module Support - # @private - def self.matcher_definitions - @matcher_definitions ||= [] - end - - # Used internally to break cyclic dependency between mocks, expectations, - # and support. We don't currently have a consistent implementation of our - # matchers, though we are considering changing that: - # https://github.com/rspec/rspec-mocks/issues/513 - # - # @private - def self.register_matcher_definition(&block) - matcher_definitions << block - end - - # Remove a previously registered matcher. Useful for cleaning up after - # yourself in specs. - # - # @private - def self.deregister_matcher_definition(&block) - matcher_definitions.delete(block) - end - - # @private - def self.is_a_matcher?(object) - matcher_definitions.any? { |md| md.call(object) } - end - - # @api private - # - # gives a string representation of an object for use in RSpec descriptions - def self.rspec_description_for_object(object) - if RSpec::Support.is_a_matcher?(object) && object.respond_to?(:description) - object.description - else - object - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/method_signature_verifier.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/method_signature_verifier.rb deleted file mode 100644 index a462772..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/method_signature_verifier.rb +++ /dev/null @@ -1,467 +0,0 @@ -# frozen_string_literal: true - -require 'rspec/support' -RSpec::Support.require_rspec_support "ruby_features" -RSpec::Support.require_rspec_support "matcher_definition" - -module RSpec - module Support - # Extracts info about the number of arguments and allowed/required - # keyword args of a given method. - # - # @private - class MethodSignature # rubocop:disable Metrics/ClassLength - attr_reader :min_non_kw_args, :max_non_kw_args, :optional_kw_args, :required_kw_args - - def initialize(method) - @method = method - @optional_kw_args = [] - @required_kw_args = [] - classify_parameters - end - - def non_kw_args_arity_description - case max_non_kw_args - when min_non_kw_args then min_non_kw_args.to_s - when INFINITY then "#{min_non_kw_args} or more" - else "#{min_non_kw_args} to #{max_non_kw_args}" - end - end - - def valid_non_kw_args?(positional_arg_count, optional_max_arg_count=positional_arg_count) - return true if positional_arg_count.nil? - - min_non_kw_args <= positional_arg_count && - optional_max_arg_count <= max_non_kw_args - end - - def classify_arity(arity=@method.arity) - if arity < 0 - # `~` inverts the one's complement and gives us the - # number of required args - @min_non_kw_args = ~arity - @max_non_kw_args = INFINITY - else - @min_non_kw_args = arity - @max_non_kw_args = arity - end - end - - if RubyFeatures.optional_and_splat_args_supported? - def description - @description ||= begin - parts = [] - - unless non_kw_args_arity_description == "0" - parts << "arity of #{non_kw_args_arity_description}" - end - - if @optional_kw_args.any? - parts << "optional keyword args (#{@optional_kw_args.map(&:inspect).join(", ")})" - end - - if @required_kw_args.any? - parts << "required keyword args (#{@required_kw_args.map(&:inspect).join(", ")})" - end - - parts << "any additional keyword args" if @allows_any_kw_args - - parts.join(" and ") - end - end - - def missing_kw_args_from(given_kw_args) - @required_kw_args - given_kw_args - end - - def invalid_kw_args_from(given_kw_args) - return [] if @allows_any_kw_args - given_kw_args - @allowed_kw_args - end - - # Considering the arg types, are there kw_args? - if RubyFeatures.kw_arg_separation? - def has_kw_args_in?(args) - # If the last arg is a hash, depending on the signature it could be kw_args or a positional parameter. - return false unless Hash === args.last && could_contain_kw_args?(args) - - # If the position of the hash is beyond the count of required and optional positional - # args then it is the kwargs hash - return true if args.count > @max_non_kw_args - - # This is the proper way to disambiguate between positional args and keywords hash - # but relies on beginning of the call chain annotating the method with - # ruby2_keywords, so only use it for positive feedback as without the annotation - # this is always false - return true if Hash.ruby2_keywords_hash?(args[-1]) - - # Otherwise, the hash could be defined kw_args or an optional positional parameter - # inspect the keys against known kwargs to determine what it is - # Note: the problem with this is that if a user passes only invalid keyword args, - # rspec no longer detects is and will assign this to a positional argument - return arbitrary_kw_args? || args.last.keys.all? { |x| @allowed_kw_args.include?(x) } - end - else - def has_kw_args_in?(args) - # Version <= Ruby 2.7 - # If the last argument is Hash, Ruby will treat only symbol keys as keyword arguments - # the rest will be grouped in another Hash and passed as positional argument. - Hash === args.last && - could_contain_kw_args?(args) && - (args.last.empty? || args.last.keys.any? { |x| x.is_a?(Symbol) }) - end - end - - # Without considering what the last arg is, could it - # contain keyword arguments? - def could_contain_kw_args?(args) - return false if args.count <= min_non_kw_args - - @allows_any_kw_args || @allowed_kw_args.any? - end - - def arbitrary_kw_args? - @allows_any_kw_args - end - - def unlimited_args? - @max_non_kw_args == INFINITY - end - - def classify_parameters - optional_non_kw_args = @min_non_kw_args = 0 - @allows_any_kw_args = false - - @method.parameters.each do |(type, name)| - case type - # def foo(a:) - when :keyreq then @required_kw_args << name - # def foo(a: 1) - when :key then @optional_kw_args << name - # def foo(**kw_args) - when :keyrest then @allows_any_kw_args = true - # def foo(a) - when :req then @min_non_kw_args += 1 - # def foo(a = 1) - when :opt then optional_non_kw_args += 1 - # def foo(*a) - when :rest then optional_non_kw_args = INFINITY - end - end - - @max_non_kw_args = @min_non_kw_args + optional_non_kw_args - @allowed_kw_args = @required_kw_args + @optional_kw_args - end - else - def description - "arity of #{non_kw_args_arity_description}" - end - - def missing_kw_args_from(_given_kw_args) - [] - end - - def invalid_kw_args_from(_given_kw_args) - [] - end - - def has_kw_args_in?(_args) - false - end - - def could_contain_kw_args?(*) - false - end - - def arbitrary_kw_args? - false - end - - def unlimited_args? - false - end - - alias_method :classify_parameters, :classify_arity - end - - INFINITY = 1 / 0.0 - end - - if RSpec::Support::Ruby.jruby? - # JRuby has only partial support for UnboundMethod#parameters, so we fall back on using #arity - # https://github.com/jruby/jruby/issues/2816 and https://github.com/jruby/jruby/issues/2817 - if RubyFeatures.optional_and_splat_args_supported? && - Java::JavaLang::String.instance_method(:char_at).parameters == [] - - class MethodSignature < remove_const(:MethodSignature) - private - - def classify_parameters - super - if (arity = @method.arity) != 0 && @method.parameters.empty? - classify_arity(arity) - end - end - end - end - - # JRuby used to always report -1 arity for Java proxy methods. - # The workaround essentially makes use of Java's introspection to figure - # out matching methods (which could be more than one partly because Java - # supports multiple overloads, and partly because JRuby introduces - # aliases to make method names look more Rubyesque). If there is only a - # single match, we can use that methods arity directly instead of the - # default -1 arity. - # - # This workaround only works for Java proxy methods, and in order to - # support regular methods and blocks, we need to be careful about calling - # owner and java_class as they might not be available - if Java::JavaLang::String.instance_method(:char_at).arity == -1 - class MethodSignature < remove_const(:MethodSignature) - private - - def classify_parameters - super - return unless @method.arity == -1 - return unless @method.respond_to?(:owner) - return unless @method.owner.respond_to?(:java_class) - java_instance_methods = @method.owner.java_class.java_instance_methods - compatible_overloads = java_instance_methods.select do |java_method| - @method == @method.owner.instance_method(java_method.name) - end - if compatible_overloads.size == 1 - classify_arity(compatible_overloads.first.arity) - end - end - end - end - end - - # Encapsulates expectations about the number of arguments and - # allowed/required keyword args of a given method. - # - # @api private - class MethodSignatureExpectation - def initialize - @min_count = nil - @max_count = nil - @keywords = [] - - @expect_unlimited_arguments = false - @expect_arbitrary_keywords = false - end - - attr_reader :min_count, :max_count, :keywords - - attr_accessor :expect_unlimited_arguments, :expect_arbitrary_keywords - - def max_count=(number) - raise ArgumentError, 'must be a non-negative integer or nil' \ - unless number.nil? || (number.is_a?(Integer) && number >= 0) - - @max_count = number - end - - def min_count=(number) - raise ArgumentError, 'must be a non-negative integer or nil' \ - unless number.nil? || (number.is_a?(Integer) && number >= 0) - - @min_count = number - end - - def empty? - @min_count.nil? && - @keywords.to_a.empty? && - !@expect_arbitrary_keywords && - !@expect_unlimited_arguments - end - - def keywords=(values) - @keywords = values.to_a || [] - end - end - - # Deals with the slightly different semantics of block arguments. - # For methods, arguments are required unless a default value is provided. - # For blocks, arguments are optional, even if no default value is provided. - # - # However, we want to treat block args as required since you virtually - # always want to pass a value for each received argument and our - # `and_yield` has treated block args as required for many years. - # - # @api private - class BlockSignature < MethodSignature - if RubyFeatures.optional_and_splat_args_supported? - def classify_parameters - super - @min_non_kw_args = @max_non_kw_args unless @max_non_kw_args == INFINITY - end - end - end - - # Abstract base class for signature verifiers. - # - # @api private - class MethodSignatureVerifier - attr_reader :non_kw_args, :kw_args, :min_non_kw_args, :max_non_kw_args - - def initialize(signature, args=[]) - @signature = signature - @non_kw_args, @kw_args = split_args(args.clone) - @min_non_kw_args = @max_non_kw_args = @non_kw_args - @arbitrary_kw_args = @unlimited_args = false - end - - def with_expectation(expectation) # rubocop:disable Metrics/MethodLength - return self unless MethodSignatureExpectation === expectation - - if expectation.empty? - @min_non_kw_args = @max_non_kw_args = @non_kw_args = nil - @kw_args = [] - else - @min_non_kw_args = @non_kw_args = expectation.min_count || 0 - @max_non_kw_args = expectation.max_count || @min_non_kw_args - - if RubyFeatures.optional_and_splat_args_supported? - @unlimited_args = expectation.expect_unlimited_arguments - else - @unlimited_args = false - end - - if RubyFeatures.kw_args_supported? - @kw_args = expectation.keywords - @arbitrary_kw_args = expectation.expect_arbitrary_keywords - else - @kw_args = [] - @arbitrary_kw_args = false - end - end - - self - end - - def valid? - missing_kw_args.empty? && - invalid_kw_args.empty? && - valid_non_kw_args? && - arbitrary_kw_args? && - unlimited_args? - end - - def error_message - if missing_kw_args.any? - "Missing required keyword arguments: %s" % [ - missing_kw_args.join(", ") - ] - elsif invalid_kw_args.any? - "Invalid keyword arguments provided: %s" % [ - invalid_kw_args.join(", ") - ] - elsif !valid_non_kw_args? - "Wrong number of arguments. Expected %s, got %s." % [ - @signature.non_kw_args_arity_description, - non_kw_args - ] - end - end - - private - - def valid_non_kw_args? - @signature.valid_non_kw_args?(min_non_kw_args, max_non_kw_args) - end - - def missing_kw_args - @signature.missing_kw_args_from(kw_args) - end - - def invalid_kw_args - @signature.invalid_kw_args_from(kw_args) - end - - def arbitrary_kw_args? - !@arbitrary_kw_args || @signature.arbitrary_kw_args? - end - - def unlimited_args? - !@unlimited_args || @signature.unlimited_args? - end - - def split_args(args) - kw_args = if @signature.has_kw_args_in?(args) && !RubyFeatures.kw_arg_separation? - last = args.pop - non_kw_args = last.reject { |k, _| k.is_a?(Symbol) } - if non_kw_args.empty? - last.keys - else - args << non_kw_args - last.select { |k, _| k.is_a?(Symbol) }.keys - end - elsif @signature.has_kw_args_in?(args) && RubyFeatures.kw_arg_separation? - args.pop.keys - else - [] - end - - [args.length, kw_args] - end - end - - # Figures out whether a given method can accept various arguments. - # Surprisingly non-trivial. - # - # @private - StrictSignatureVerifier = MethodSignatureVerifier - - # Allows matchers to be used instead of providing keyword arguments. In - # practice, when this happens only the arity of the method is verified. - # - # @private - class LooseSignatureVerifier < MethodSignatureVerifier - private - - def split_args(args) - if RSpec::Support.is_a_matcher?(args.last) && @signature.could_contain_kw_args?(args) - args.pop - @signature = SignatureWithKeywordArgumentsMatcher.new(@signature) - end - - super(args) - end - - # If a matcher is used in a signature in place of keyword arguments, all - # keyword argument validation needs to be skipped since the matcher is - # opaque. - # - # Instead, keyword arguments will be validated when the method is called - # and they are actually known. - # - # @private - class SignatureWithKeywordArgumentsMatcher - def initialize(signature) - @signature = signature - end - - def missing_kw_args_from(_kw_args) - [] - end - - def invalid_kw_args_from(_kw_args) - [] - end - - def non_kw_args_arity_description - @signature.non_kw_args_arity_description - end - - def valid_non_kw_args?(*args) - @signature.valid_non_kw_args?(*args) - end - - def has_kw_args_in?(args) - @signature.has_kw_args_in?(args) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/mutex.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/mutex.rb deleted file mode 100644 index 63eeca4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/mutex.rb +++ /dev/null @@ -1,75 +0,0 @@ -# frozen_string_literal: true - -module RSpec - module Support - # On 1.8.7, it's in the stdlib. - # We don't want to load the stdlib, b/c this is a test tool, and can affect - # the test environment, causing tests to pass where they should fail. - # - # So we're transcribing/modifying it from - # https://github.com/ruby/ruby/blob/v1_8_7_374/lib/thread.rb#L56 - # Some methods we don't need are deleted. Anything I don't - # understand (there's quite a bit, actually) is left in. - # - # Some formatting changes are made to appease the robot overlord: - # https://travis-ci.org/rspec/rspec-core/jobs/54410874 - # @private - class Mutex - def initialize - @waiting = [] - @locked = false - @waiting.taint - taint - end - - # @private - def lock - while Thread.critical = true && @locked - @waiting.push Thread.current - Thread.stop - end - @locked = true - Thread.critical = false - self - end - - # @private - def unlock - return unless @locked - Thread.critical = true - @locked = false - wakeup_and_run_waiting_thread - self - end - - # @private - def synchronize - lock - begin - yield - ensure - unlock - end - end - - private - - def wakeup_and_run_waiting_thread - begin - t = @waiting.shift - t.wakeup if t - rescue ThreadError - retry - end - Thread.critical = false - begin - t.run if t - rescue ThreadError - :noop - end - end - - # Avoid warnings for library wide checks spec - end unless defined?(::RSpec::Support::Mutex) || defined?(::Mutex) - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/object_formatter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/object_formatter.rb deleted file mode 100644 index d464f1b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/object_formatter.rb +++ /dev/null @@ -1,279 +0,0 @@ -# frozen_string_literal: true - -RSpec::Support.require_rspec_support 'matcher_definition' - -module RSpec - module Support - # Provide additional output details beyond what `inspect` provides when - # printing Time, DateTime, or BigDecimal - # @api private - class ObjectFormatter # rubocop:disable Metrics/ClassLength - ELLIPSIS = "..." - - attr_accessor :max_formatted_output_length - - # Methods are deferred to a default instance of the class to maintain the interface - # For example, calling ObjectFormatter.format is still possible - def self.default_instance - @default_instance ||= new - end - - def self.format(object) - default_instance.format(object) - end - - def self.prepare_for_inspection(object) - default_instance.prepare_for_inspection(object) - end - - def initialize(max_formatted_output_length=200) - @max_formatted_output_length = max_formatted_output_length - @current_structure_stack = [] - end - - def format(object) - if max_formatted_output_length.nil? - prepare_for_inspection(object).inspect - else - formatted_object = prepare_for_inspection(object).inspect - if formatted_object.length < max_formatted_output_length - formatted_object - else - beginning = truncate_string formatted_object, 0, max_formatted_output_length / 2 - ending = truncate_string formatted_object, -max_formatted_output_length / 2, -1 - beginning + ELLIPSIS + ending - end - end - end - - # Prepares the provided object to be formatted by wrapping it as needed - # in something that, when `inspect` is called on it, will produce the - # desired output. - # - # This allows us to apply the desired formatting to hash/array data structures - # at any level of nesting, simply by walking that structure and replacing items - # with custom items that have `inspect` defined to return the desired output - # for that item. Then we can just use `Array#inspect` or `Hash#inspect` to - # format the entire thing. - def prepare_for_inspection(object) - case object - when Array - prepare_array(object) - when Hash - prepare_hash(object) - when Symbol - object - else - inspector_class = INSPECTOR_CLASSES.find { |inspector| inspector.can_inspect?(object) } - inspector_class.new(object, self) - end - end - - def prepare_array(array) - with_entering_structure(array) do - array.map { |element| prepare_element(element) } - end - end - - def prepare_hash(input_hash) - with_entering_structure(input_hash) do - sort_hash_keys(input_hash).inject({}) do |output_hash, key_and_value| - key, value = key_and_value.map { |element| prepare_element(element) } - output_hash[key] = value - output_hash - end - end - end - - def sort_hash_keys(input_hash) - if input_hash.keys.all? { |k| k.is_a?(String) || k.is_a?(Symbol) } - Hash[input_hash.sort_by { |k, _v| k.to_s }] - else - input_hash - end - end - - def prepare_element(element) - if recursive_structure?(element) - case element - when Array then InspectableItem.new('[...]') - when Hash then InspectableItem.new('{...}') - else raise # This won't happen - end - else - prepare_for_inspection(element) - end - end - - def with_entering_structure(structure) - @current_structure_stack.push(structure) - return_value = yield - @current_structure_stack.pop - return_value - end - - def recursive_structure?(object) - @current_structure_stack.any? { |seen_structure| seen_structure.equal?(object) } - end - - InspectableItem = Struct.new(:text) do - def inspect - text - end - - def pretty_print(pp) - pp.text(text) - end - end - - BaseInspector = Struct.new(:object, :formatter) do - def self.can_inspect?(_object) - raise NotImplementedError - end - - def inspect - raise NotImplementedError - end - - def pretty_print(pp) - pp.text(inspect) - end - end - - class TimeInspector < BaseInspector - FORMAT = "%Y-%m-%d %H:%M:%S" - - def self.can_inspect?(object) - Time === object - end - - if Time.method_defined?(:nsec) - def inspect - object.strftime("#{FORMAT}.#{"%09d" % object.nsec} %z") - end - else # for 1.8.7 - def inspect - object.strftime("#{FORMAT}.#{"%06d" % object.usec} %z") - end - end - end - - class DateTimeInspector < BaseInspector - FORMAT = "%a, %d %b %Y %H:%M:%S.%N %z" - - def self.can_inspect?(object) - defined?(DateTime) && DateTime === object - end - - # ActiveSupport sometimes overrides inspect. If `ActiveSupport` is - # defined use a custom format string that includes more time precision. - def inspect - if defined?(ActiveSupport) - object.strftime(FORMAT) - else - object.inspect - end - end - end - - class BigDecimalInspector < BaseInspector - def self.can_inspect?(object) - defined?(BigDecimal) && BigDecimal === object - end - - def inspect - "#{object.to_s('F')} (#{object.inspect})" - end - end - - class DescribableMatcherInspector < BaseInspector - def self.can_inspect?(object) - Support.is_a_matcher?(object) && object.respond_to?(:description) - end - - def inspect - object.description - end - end - - class UninspectableObjectInspector < BaseInspector - OBJECT_ID_FORMAT = '%#016x' - - def self.can_inspect?(object) - object.inspect - false - rescue NoMethodError - true - end - - def inspect - "#<#{klass}:#{native_object_id}>" - end - - def klass - Support.class_of(object) - end - - # http://stackoverflow.com/a/2818916 - def native_object_id - OBJECT_ID_FORMAT % (object.__id__ << 1) - rescue NoMethodError - # In Ruby 1.9.2, BasicObject responds to none of #__id__, #object_id, #id... - '-' - end - end - - class DelegatorInspector < BaseInspector - def self.can_inspect?(object) - defined?(Delegator) && Delegator === object - end - - def inspect - "#<#{object.class}(#{formatter.format(object.send(:__getobj__))})>" - end - end - - class InspectableObjectInspector < BaseInspector - def self.can_inspect?(object) - object.inspect - true - rescue NoMethodError - false - end - - def inspect - object.inspect - end - end - - INSPECTOR_CLASSES = [ - TimeInspector, - DateTimeInspector, - BigDecimalInspector, - UninspectableObjectInspector, - DescribableMatcherInspector, - DelegatorInspector, - InspectableObjectInspector - ].tap do |classes| - # 2.4 has improved BigDecimal formatting so we do not need - # to provide our own. - # https://github.com/ruby/bigdecimal/pull/42 - classes.delete(BigDecimalInspector) if RUBY_VERSION >= '2.4' - end - - private - - # Returns the substring defined by the start_index and end_index - # If the string ends with a partial ANSI code code then that - # will be removed as printing partial ANSI - # codes to the terminal can lead to corruption - def truncate_string(str, start_index, end_index) - cut_str = str[start_index..end_index] - - # ANSI color codes are like: \e[33m so anything with \e[ and a - # number without a 'm' is an incomplete color code - cut_str.sub(/\e\[\d+$/, '') - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/recursive_const_methods.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/recursive_const_methods.rb deleted file mode 100644 index ac2910d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/recursive_const_methods.rb +++ /dev/null @@ -1,78 +0,0 @@ -# frozen_string_literal: true - -module RSpec - module Support - # Provides recursive constant lookup methods useful for - # constant stubbing. - module RecursiveConstMethods - # We only want to consider constants that are defined directly on a - # particular module, and not include top-level/inherited constants. - # Unfortunately, the constant API changed between 1.8 and 1.9, so - # we need to conditionally define methods to ignore the top-level/inherited - # constants. - # - # Given: - # class A; B = 1; end - # class C < A; end - # - # On 1.8: - # - C.const_get("Hash") # => ::Hash - # - C.const_defined?("Hash") # => false - # - C.constants # => ["B"] - # - None of these methods accept the extra `inherit` argument - # On 1.9: - # - C.const_get("Hash") # => ::Hash - # - C.const_defined?("Hash") # => true - # - C.const_get("Hash", false) # => raises NameError - # - C.const_defined?("Hash", false) # => false - # - C.constants # => [:B] - # - C.constants(false) #=> [] - if Module.method(:const_defined?).arity == 1 - def const_defined_on?(mod, const_name) - mod.const_defined?(const_name) - end - - def get_const_defined_on(mod, const_name) - return mod.const_get(const_name) if const_defined_on?(mod, const_name) - - raise NameError, "uninitialized constant #{mod.name}::#{const_name}" - end - - def constants_defined_on(mod) - mod.constants.select { |c| const_defined_on?(mod, c) } - end - else - def const_defined_on?(mod, const_name) - mod.const_defined?(const_name, false) - end - - def get_const_defined_on(mod, const_name) - mod.const_get(const_name, false) - end - - def constants_defined_on(mod) - mod.constants(false) - end - end - - def recursive_const_get(const_name) - normalize_const_name(const_name).split('::').inject(Object) do |mod, name| - get_const_defined_on(mod, name) - end - end - - def recursive_const_defined?(const_name) - parts = normalize_const_name(const_name).split('::') - parts.inject([Object, '']) do |(mod, full_name), name| - yield(full_name, name) if block_given? && !(Module === mod) - return false unless const_defined_on?(mod, name) - [get_const_defined_on(mod, name), [mod.name, name].join('::')] - end - end - - def normalize_const_name(const_name) - const_name.sub(/\A::/, '') - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/reentrant_mutex.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/reentrant_mutex.rb deleted file mode 100644 index 28957a2..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/reentrant_mutex.rb +++ /dev/null @@ -1,80 +0,0 @@ -# frozen_string_literal: true - -module RSpec - module Support - # Allows a thread to lock out other threads from a critical section of code, - # while allowing the thread with the lock to reenter that section. - # - # Based on Monitor as of 2.2 - - # https://github.com/ruby/ruby/blob/eb7ddaa3a47bf48045d26c72eb0f263a53524ebc/lib/monitor.rb#L9 - # - # Depends on Mutex, but Mutex is only available as part of core since 1.9.1: - # exists - http://ruby-doc.org/core-1.9.1/Mutex.html - # dne - http://ruby-doc.org/core-1.9.0/Mutex.html - # - # @private - class ReentrantMutex - def initialize - @owner = nil - @count = 0 - @mutex = Mutex.new - end - - def synchronize - enter - yield - ensure - exit - end - - private - - # This is fixing a bug #501 that is specific to Ruby 3.0. The new implementation - # depends on `owned?` that was introduced in Ruby 2.0, so both should work for Ruby 2.x. - if RUBY_VERSION.to_f >= 3.0 - def enter - @mutex.lock unless @mutex.owned? - @count += 1 - end - - def exit - unless @mutex.owned? - raise ThreadError, "Attempt to unlock a mutex which is locked by another thread/fiber" - end - @count -= 1 - @mutex.unlock if @count == 0 - end - else - def enter - @mutex.lock if @owner != Thread.current - @owner = Thread.current - @count += 1 - end - - def exit - @count -= 1 - return unless @count == 0 - @owner = nil - @mutex.unlock - end - end - end - - if defined? ::Mutex - # On 1.9 and up, this is in core, so we just use the real one - class Mutex < ::Mutex - # If you mock Mutex.new you break our usage of Mutex, so - # instead we capture the original method to return Mutexes. - NEW_MUTEX_METHOD = Mutex.method(:new) - - def self.new - NEW_MUTEX_METHOD.call - end - end - else # For 1.8.7 - # :nocov: - RSpec::Support.require_rspec_support "mutex" - # :nocov: - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/ruby_features.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/ruby_features.rb deleted file mode 100644 index 7ccdb7e..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/ruby_features.rb +++ /dev/null @@ -1,221 +0,0 @@ -# frozen_string_literal: true - -require 'rbconfig' -RSpec::Support.require_rspec_support "comparable_version" - -module RSpec - module Support - # @api private - # - # Provides query methods for different OS or OS features. - module OS - module_function - - def windows? - !!(RbConfig::CONFIG['host_os'] =~ /cygwin|mswin|mingw|bccwin|wince|emx/) - end - - def windows_file_path? - ::File::ALT_SEPARATOR == '\\' - end - end - - # @api private - # - # Provides query methods for different rubies - module Ruby - module_function - - def jruby? - RUBY_PLATFORM == 'java' - end - - def jruby_version - @jruby_version ||= ComparableVersion.new(JRUBY_VERSION) - end - - def jruby_9000? - jruby? && JRUBY_VERSION >= '9.0.0.0' - end - - def rbx? - defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx' - end - - def non_mri? - !mri? - end - - def mri? - !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby' - end - - def truffleruby? - defined?(RUBY_ENGINE) && RUBY_ENGINE == 'truffleruby' - end - end - - # @api private - # - # Provides query methods for ruby features that differ among - # implementations. - module RubyFeatures - module_function - - if Ruby.jruby? && RUBY_VERSION.to_f < 1.9 - # On JRuby 1.7 `--1.8` mode, `Process.respond_to?(:fork)` returns true, - # but when you try to fork, it raises an error: - # NotImplementedError: fork is not available on this platform - # - # When we drop support for JRuby 1.7 and/or Ruby 1.8, we can drop - # this special case. - def fork_supported? - false - end - else - def fork_supported? - Process.respond_to?(:fork) - end - end - - def optional_and_splat_args_supported? - Method.method_defined?(:parameters) - end - - def caller_locations_supported? - respond_to?(:caller_locations, true) - end - - if Exception.method_defined?(:cause) - def supports_exception_cause? - true - end - else - def supports_exception_cause? - false - end - end - - if RUBY_VERSION.to_f >= 3.2 - def supports_syntax_suggest? - true - end - else - def supports_syntax_suggest? - false - end - end - - if RUBY_VERSION.to_f >= 3.0 - # https://rubyreferences.github.io/rubychanges/3.0.html#keyword-arguments-are-now-fully-separated-from-positional-arguments - def kw_arg_separation? - true - end - else - def kw_arg_separation? - false - end - end - - if RUBY_VERSION.to_f >= 2.7 - def supports_taint? - false - end - else - def supports_taint? - true - end - end - ripper_requirements = [ComparableVersion.new(RUBY_VERSION) >= '1.9.2'] - - ripper_requirements.push(false) if Ruby.rbx? - - if Ruby.jruby? - ripper_requirements.push(Ruby.jruby_version >= '1.7.5') - # Ripper on JRuby 9.0.0.0.rc1 - 9.1.8.0 reports wrong line number - # or cannot parse source including `:if`. - # Ripper on JRuby 9.x.x.x < 9.1.17.0 can't handle keyword arguments - # Neither can JRuby 9.2, e.g. < 9.2.1.0 - ripper_requirements.push(!Ruby.jruby_version.between?('9.0.0.0.rc1', '9.2.0.0')) - end - - # TruffleRuby disables ripper due to low performance - ripper_requirements.push(false) if Ruby.truffleruby? - - if ripper_requirements.all? - def ripper_supported? - true - end - else - def ripper_supported? - false - end - end - - def distincts_kw_args_from_positional_hash? - RUBY_VERSION >= '3.0.0' - end - - if Ruby.mri? - def kw_args_supported? - RUBY_VERSION >= '2.0.0' - end - - def required_kw_args_supported? - RUBY_VERSION >= '2.1.0' - end - - def supports_rebinding_module_methods? - RUBY_VERSION.to_i >= 2 - end - else - # RBX / JRuby et al support is unknown for keyword arguments - begin - eval("o = Object.new; def o.m(a: 1); end;"\ - " raise SyntaxError unless o.method(:m).parameters.include?([:key, :a])") - - def kw_args_supported? - true - end - rescue SyntaxError - def kw_args_supported? - false - end - end - - begin - eval("o = Object.new; def o.m(a: ); end;"\ - "raise SyntaxError unless o.method(:m).parameters.include?([:keyreq, :a])") - - def required_kw_args_supported? - true - end - rescue SyntaxError - def required_kw_args_supported? - false - end - end - - begin - Module.new { def foo; end }.instance_method(:foo).bind(Object.new) - - def supports_rebinding_module_methods? - true - end - rescue TypeError - def supports_rebinding_module_methods? - false - end - end - end - - def module_refinement_supported? - Module.method_defined?(:refine) || Module.private_method_defined?(:refine) - end - - def module_prepends_supported? - Module.method_defined?(:prepend) || Module.private_method_defined?(:prepend) - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source.rb deleted file mode 100644 index 8aad27b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source.rb +++ /dev/null @@ -1,87 +0,0 @@ -# frozen_string_literal: true - -RSpec::Support.require_rspec_support 'encoded_string' -RSpec::Support.require_rspec_support 'ruby_features' - -module RSpec - module Support - # @private - # Represents a Ruby source file and provides access to AST and tokens. - class Source - attr_reader :source, :path - - # This class protects us against having File read and expand_path - # stubbed out within tests. - class File - class << self - [:read, :expand_path].each do |method_name| - define_method(method_name, &::File.method(method_name)) - end - end - end - - def self.from_file(path) - source = File.read(path) - new(source, path) - end - - if String.method_defined?(:encoding) - def initialize(source_string, path=nil) - @source = RSpec::Support::EncodedString.new(source_string, Encoding.default_external) - @path = path ? File.expand_path(path) : '(string)' - end - else # for 1.8.7 - # :nocov: - def initialize(source_string, path=nil) - @source = RSpec::Support::EncodedString.new(source_string) - @path = path ? File.expand_path(path) : '(string)' - end - # :nocov: - end - - def lines - @lines ||= source.split("\n") - end - - def inspect - "#<#{self.class} #{path}>" - end - - if RSpec::Support::RubyFeatures.ripper_supported? - RSpec::Support.require_rspec_support 'source/node' - RSpec::Support.require_rspec_support 'source/token' - - def ast - @ast ||= begin - require 'ripper' - sexp = Ripper.sexp(source) - raise SyntaxError unless sexp - Node.new(sexp) - end - end - - def tokens - @tokens ||= begin - require 'ripper' - tokens = Ripper.lex(source) - Token.tokens_from_ripper_tokens(tokens) - end - end - - def nodes_by_line_number - @nodes_by_line_number ||= begin - nodes_by_line_number = ast.select(&:location).group_by { |node| node.location.line } - Hash.new { |hash, key| hash[key] = [] }.merge(nodes_by_line_number) - end - end - - def tokens_by_line_number - @tokens_by_line_number ||= begin - nodes_by_line_number = tokens.group_by { |token| token.location.line } - Hash.new { |hash, key| hash[key] = [] }.merge(nodes_by_line_number) - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/location.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/location.rb deleted file mode 100644 index fb5a377..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/location.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module RSpec - module Support - class Source - # @private - # Represents a source location of node or token. - Location = Struct.new(:line, :column) do - include Comparable - - def self.location?(array) - array.is_a?(Array) && array.size == 2 && array.all? { |e| e.is_a?(Integer) } - end - - def <=>(other) - line_comparison = (line <=> other.line) - return line_comparison unless line_comparison == 0 - column <=> other.column - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/node.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/node.rb deleted file mode 100644 index 359bf9f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/node.rb +++ /dev/null @@ -1,112 +0,0 @@ -# frozen_string_literal: true - -RSpec::Support.require_rspec_support 'source/location' - -module RSpec - module Support - class Source - # @private - # A wrapper for Ripper AST node which is generated with `Ripper.sexp`. - class Node - include Enumerable - - attr_reader :sexp, :parent - - def self.sexp?(array) - array.is_a?(Array) && array.first.is_a?(Symbol) - end - - def initialize(ripper_sexp, parent=nil) - @sexp = ripper_sexp.freeze - @parent = parent - end - - def type - sexp[0] - end - - def args - @args ||= raw_args.map do |raw_arg| - if Node.sexp?(raw_arg) - Node.new(raw_arg, self) - elsif Location.location?(raw_arg) - Location.new(*raw_arg) - elsif raw_arg.is_a?(Array) - ExpressionSequenceNode.new(raw_arg, self) - else - raw_arg - end - end.freeze - end - - def children - @children ||= args.select { |arg| arg.is_a?(Node) }.freeze - end - - def location - @location ||= args.find { |arg| arg.is_a?(Location) } - end - - # We use a loop here (instead of recursion) to prevent SystemStackError - def each - return to_enum(__method__) unless block_given? - - node_queue = [] - node_queue << self - - while (current_node = node_queue.shift) - yield current_node - node_queue.concat(current_node.children) - end - end - - def each_ancestor - return to_enum(__method__) unless block_given? - - current_node = self - - while (current_node = current_node.parent) - yield current_node - end - end - - def inspect - "#<#{self.class} #{type}>" - end - - private - - def raw_args - sexp[1..-1] || [] - end - end - - # @private - # Basically `Ripper.sexp` generates arrays whose first element is a symbol (type of sexp), - # but it exceptionally generates typeless arrays for expression sequence: - # - # Ripper.sexp('foo; bar') - # => [ - # :program, - # [ # Typeless array - # [:vcall, [:@ident, "foo", [1, 0]]], - # [:vcall, [:@ident, "bar", [1, 5]]] - # ] - # ] - # - # We wrap typeless arrays in this pseudo type node - # so that it can be handled in the same way as other type node. - class ExpressionSequenceNode < Node - def type - :_expression_sequence - end - - private - - def raw_args - sexp - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/token.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/token.rb deleted file mode 100644 index ca887a7..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/source/token.rb +++ /dev/null @@ -1,96 +0,0 @@ -# frozen_string_literal: true - -RSpec::Support.require_rspec_support 'source/location' - -module RSpec - module Support - class Source - # @private - # A wrapper for Ripper token which is generated with `Ripper.lex`. - class Token - CLOSING_TYPES_BY_OPENING_TYPE = { - :on_lbracket => :on_rbracket, - :on_lparen => :on_rparen, - :on_lbrace => :on_rbrace, - :on_heredoc_beg => :on_heredoc_end - }.freeze - - CLOSING_KEYWORDS_BY_OPENING_KEYWORD = { - 'def' => 'end', - 'do' => 'end', - }.freeze - - attr_reader :token - - def self.tokens_from_ripper_tokens(ripper_tokens) - ripper_tokens.map { |ripper_token| new(ripper_token) }.freeze - end - - def initialize(ripper_token) - @token = ripper_token.freeze - end - - def location - @location ||= Location.new(*token[0]) - end - - def type - token[1] - end - - def string - token[2] - end - - def ==(other) - token == other.token - end - - alias_method :eql?, :== - - def inspect - "#<#{self.class} #{type} #{string.inspect}>" - end - - def keyword? - type == :on_kw - end - - def equals_operator? - type == :on_op && string == '=' - end - - def opening? - opening_delimiter? || opening_keyword? - end - - def closed_by?(other) - delimiter_closed_by?(other) || keyword_closed_by?(other) - end - - private - - def opening_delimiter? - CLOSING_TYPES_BY_OPENING_TYPE.key?(type) - end - - def opening_keyword? - return false unless keyword? - CLOSING_KEYWORDS_BY_OPENING_KEYWORD.key?(string) - end - - def delimiter_closed_by?(other) - other.type == CLOSING_TYPES_BY_OPENING_TYPE[type] - end - - def keyword_closed_by?(other) - return false unless keyword? - return true if other.string == CLOSING_KEYWORDS_BY_OPENING_KEYWORD[string] - - # Ruby 3's `end`-less method definition: `def method_name = body` - string == 'def' && other.equals_operator? && location.line == other.location.line - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec.rb deleted file mode 100644 index 5468cf9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec.rb +++ /dev/null @@ -1,84 +0,0 @@ -# frozen_string_literal: true - -require 'rspec/support' -require 'rspec/support/spec/in_sub_process' - -RSpec::Support.require_rspec_support "spec/deprecation_helpers" -RSpec::Support.require_rspec_support "spec/diff_helpers" -RSpec::Support.require_rspec_support "spec/with_isolated_stderr" -RSpec::Support.require_rspec_support "spec/stderr_splitter" -RSpec::Support.require_rspec_support "spec/formatting_support" -RSpec::Support.require_rspec_support "spec/with_isolated_directory" -RSpec::Support.require_rspec_support "ruby_features" - -warning_preventer = $stderr = RSpec::Support::StdErrSplitter.new($stderr) - -RSpec.configure do |c| - c.include RSpecHelpers - c.include RSpec::Support::WithIsolatedStdErr - c.include RSpec::Support::FormattingSupport - c.include RSpec::Support::InSubProcess - - unless defined?(Debugger) # debugger causes warnings when used - c.before do - warning_preventer.reset! - end - - c.after do - warning_preventer.verify_no_warnings! - end - end - - if c.files_to_run.one? - c.full_backtrace = true - c.default_formatter = 'doc' - end - - c.filter_run_when_matching :focus - - c.example_status_persistence_file_path = "./spec/examples.txt" - - c.define_derived_metadata :failing_on_windows_ci do |meta| - meta[:pending] ||= "This spec fails on Windows CI and needs someone to fix it." - end if RSpec::Support::OS.windows? && ENV['CI'] -end - -module RSpec - module Support - module Spec - def self.setup_simplecov(&block) - # Simplecov emits some ruby warnings when loaded, so silence them. - old_verbose, $VERBOSE = $VERBOSE, false - - return if ENV['NO_COVERAGE'] || RUBY_VERSION < '1.9.3' - return if RUBY_ENGINE != 'ruby' || RSpec::Support::OS.windows? - - # Don't load it when we're running a single isolated - # test file rather than the whole suite. - return if RSpec.configuration.files_to_run.one? - - require 'simplecov' - start_simplecov(&block) - rescue LoadError - warn "Simplecov could not be loaded" - ensure - $VERBOSE = old_verbose - end - - def self.start_simplecov(&block) - SimpleCov.start do - add_filter "bundle/" - add_filter "tmp/" - add_filter do |source_file| - # Filter out `spec` directory except when it is under `lib` - # (as is the case in rspec-support) - source_file.filename.include?('/spec/') && !source_file.filename.include?('/lib/') - end - - instance_eval(&block) if block - end - end - private_class_method :start_simplecov - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/deprecation_helpers.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/deprecation_helpers.rb deleted file mode 100644 index f7458c3..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/deprecation_helpers.rb +++ /dev/null @@ -1,50 +0,0 @@ -# frozen_string_literal: true - -module RSpecHelpers - def expect_deprecation_with_call_site(file, line, snippet=//) - expect(RSpec.configuration.reporter).to receive(:deprecation). - with(include(:deprecated => match(snippet), :call_site => include([file, line].join(':')))) - end - - def expect_deprecation_without_call_site(snippet=//) - expect(RSpec.configuration.reporter).to receive(:deprecation). - with(include(:deprecated => match(snippet), :call_site => eq(nil))) - end - - def expect_warn_deprecation_with_call_site(file, line, snippet=//) - expect(RSpec.configuration.reporter).to receive(:deprecation). - with(include(:message => match(snippet), :call_site => include([file, line].join(':')))) - end - - def expect_warn_deprecation(snippet=//) - expect(RSpec.configuration.reporter).to receive(:deprecation). - with(include(:message => match(snippet))) - end - - def allow_deprecation - allow(RSpec.configuration.reporter).to receive(:deprecation) - end - - def expect_no_deprecations - expect(RSpec.configuration.reporter).not_to receive(:deprecation) - end - alias expect_no_deprecation expect_no_deprecations - - def expect_warning_without_call_site(expected=//) - expect(::Kernel).to receive(:warn). - with(match(expected).and(satisfy { |message| !(/Called from/ =~ message) })) - end - - def expect_warning_with_call_site(file, line, expected=//) - expect(::Kernel).to receive(:warn). - with(match(expected).and(match(/Called from #{file}:#{line}/))) - end - - def expect_no_warnings - expect(::Kernel).not_to receive(:warn) - end - - def allow_warning - allow(::Kernel).to receive(:warn) - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/diff_helpers.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/diff_helpers.rb deleted file mode 100644 index 58e0712..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/diff_helpers.rb +++ /dev/null @@ -1,45 +0,0 @@ -# frozen_string_literal: true - -require 'diff/lcs' - -module RSpec - module Support - module Spec - module DiffHelpers - # In the updated version of diff-lcs several diff headers change format slightly - # compensate for this and change minimum version in RSpec 4 - if ::Diff::LCS::VERSION.to_f < 1.4 - def one_line_header(line_number=2) - "-1,#{line_number} +1,#{line_number}" - end - elsif ::Diff::LCS::VERSION.to_f < 1.6 - def one_line_header(_=2) - "-1 +1" - end - else - def one_line_header(line_number=2) - if line_number - 1 == 1 - "-1 +1" - else - "-1,#{line_number - 1} +1,#{line_number - 1}" - end - end - end - - if ::Diff::LCS::VERSION.to_f > 1.5 - def removing_two_line_header - "-1,2 +0,0" - end - elsif Diff::LCS::VERSION.to_f < 1.4 || Diff::LCS::VERSION >= "1.4.4" - def removing_two_line_header - "-1,3 +1" - end - else - def removing_two_line_header - "-1,3 +1,5" - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/formatting_support.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/formatting_support.rb deleted file mode 100644 index a773a20..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/formatting_support.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module RSpec - module Support - module FormattingSupport - def dedent(string) - string.gsub(/^\s+\|/, '').chomp - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/in_sub_process.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/in_sub_process.rb deleted file mode 100644 index 4130225..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/in_sub_process.rb +++ /dev/null @@ -1,73 +0,0 @@ -# frozen_string_literal: true - -module RSpec - module Support - module InSubProcess - if Process.respond_to?(:fork) && !(Ruby.jruby? && RUBY_VERSION == '1.8.7') - - UnmarshableObject = Struct.new(:error) - - # Useful as a way to isolate a global change to a subprocess. - - def in_sub_process(prevent_warnings=true) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize - exception_reader, exception_writer = IO.pipe - result_reader, result_writer = IO.pipe - - # Set binary mode to avoid errors surrounding ascii-8bit to utf-8 conversion - # this happens with warnings on rspec-rails for example - [exception_reader, exception_writer, result_reader, result_writer].each { |io| io.binmode } - - pid = Process.fork do - warning_preventer = $stderr = RSpec::Support::StdErrSplitter.new($stderr) - - begin - result = yield - warning_preventer.verify_no_warnings! if prevent_warnings - # rubocop:disable Lint/HandleExceptions - rescue Support::AllExceptionsExceptOnesWeMustNotRescue => exception - # rubocop:enable Lint/HandleExceptions - end - - exception_writer.write marshal_dump_with_unmarshable_object_handling(exception) - exception_reader.close - exception_writer.close - - result_writer.write marshal_dump_with_unmarshable_object_handling(result) - result_reader.close - result_writer.close - - exit! # prevent at_exit hooks from running (e.g. minitest) - end - - exception_writer.close - result_writer.close - Process.waitpid(pid) - - exception = Marshal.load(exception_reader.read) - exception_reader.close - raise exception if exception - - result = Marshal.load(result_reader.read) - result_reader.close - result - end - alias :in_sub_process_if_possible :in_sub_process - - def marshal_dump_with_unmarshable_object_handling(object) - Marshal.dump(object) - rescue TypeError => error - Marshal.dump(UnmarshableObject.new(error)) - end - else - def in_sub_process(*) - skip "This spec requires forking to work properly, " \ - "and your platform does not support forking" - end - - def in_sub_process_if_possible(*) - yield - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/library_wide_checks.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/library_wide_checks.rb deleted file mode 100644 index d424525..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/library_wide_checks.rb +++ /dev/null @@ -1,152 +0,0 @@ -# frozen_string_literal: true - -require 'rspec/support/spec/shell_out' - -module RSpec - module Support - module WhitespaceChecks - # This malformed whitespace detection logic has been borrowed from bundler: - # https://github.com/bundler/bundler/blob/v1.8.0/spec/quality_spec.rb - def check_for_tab_characters(filename) - failing_lines = [] - File.readlines(filename).each_with_index do |line, number| - failing_lines << number + 1 if line =~ /\t/ - end - - return if failing_lines.empty? - "#{filename} has tab characters on lines #{failing_lines.join(', ')}" - end - - def check_for_extra_spaces(filename) - failing_lines = [] - File.readlines(filename).each_with_index do |line, number| - next if line =~ /^\s+#.*\s+\n$/ - failing_lines << number + 1 if line =~ /\s+\n$/ - end - - return if failing_lines.empty? - "#{filename} has spaces on the EOL on lines #{failing_lines.join(', ')}" - end - end - end -end - -RSpec.shared_examples_for "library wide checks" do |lib, options| - consider_a_test_env_file = options.fetch(:consider_a_test_env_file, /MATCHES NOTHING/) - allowed_loaded_feature_regexps = options.fetch(:allowed_loaded_feature_regexps, []) - preamble_for_lib = options[:preamble_for_lib] - preamble_for_spec = "require 'rspec/core'; require 'spec_helper'" - skip_spec_files = options.fetch(:skip_spec_files, /MATCHES NOTHING/) - - include RSpec::Support::ShellOut - include RSpec::Support::WhitespaceChecks - - define_method :files_to_require_for do |sub_dir| - slash = File::SEPARATOR - lib_path_re = /#{slash + lib}[^#{slash}]*#{slash}lib/ - load_path = $LOAD_PATH.grep(lib_path_re).first - directory = load_path.sub(/lib$/, sub_dir) - files = Dir["#{directory}/**/*.rb"] - extract_regex = /#{Regexp.escape(directory) + File::SEPARATOR}(.+)\.rb$/ - - # We sort to ensure the files are loaded in a consistent order, regardless - # of OS. Otherwise, it could load in a different order on Travis than - # locally, and potentially trigger a "circular require considered harmful" - # warning or similar. - files.sort.map { |file| file[extract_regex, 1] } - end - - def command_from(code_lines) - code_lines.join("\n") - end - - def load_all_files(files, preamble, postamble=nil) - requires = files.map { |f| "require '#{f}'" } - command = command_from(Array(preamble) + requires + Array(postamble)) - - stdout, stderr, status = with_env 'NO_COVERAGE' => '1' do - options = %w[ -w ] - options << "--disable=gem" if RUBY_VERSION.to_f >= 1.9 && RSpec::Support::Ruby.mri? - run_ruby_with_current_load_path(command, *options) - end - - [stdout, strip_known_warnings(stderr), status.exitstatus] - end - - define_method :load_all_lib_files do - files = all_lib_files - lib_test_env_files - preamble = ['orig_loaded_features = $".dup', preamble_for_lib] - postamble = ['puts(($" - orig_loaded_features).join("\n"))'] - - @loaded_feature_lines, stderr, exitstatus = load_all_files(files, preamble, postamble) - ["", stderr, exitstatus] - end - - define_method :load_all_spec_files do - files = files_to_require_for("spec") + lib_test_env_files - files = files.reject { |f| f =~ skip_spec_files } - load_all_files(files, preamble_for_spec) - end - - attr_reader :all_lib_files, :lib_test_env_files, - :lib_file_results, :spec_file_results - - before(:context) do - @all_lib_files = files_to_require_for("lib") - @lib_test_env_files = all_lib_files.grep(consider_a_test_env_file) - - @lib_file_results, @spec_file_results = [ - # Load them in parallel so it's faster... - Thread.new { load_all_lib_files }, - Thread.new { load_all_spec_files } - ].map(&:join).map(&:value) - end - - def have_successful_no_warnings_output - eq ["", "", 0] - end - - it "issues no warnings when loaded", :slow do - expect(lib_file_results).to have_successful_no_warnings_output - end - - it "issues no warnings when the spec files are loaded", :slow do - expect(spec_file_results).to have_successful_no_warnings_output - end - - it 'only loads a known set of stdlibs so gem authors are forced ' \ - 'to load libs they use to have passing specs', :slow do - loaded_features = @loaded_feature_lines.split("\n") - if RUBY_VERSION == '1.8.7' - # On 1.8.7, $" returns the relative require path if that was used - # to require the file. LIB_REGEX will not match the relative version - # since it has a `/lib` prefix. Here we deal with this by expanding - # relative files relative to the $LOAD_PATH dir (lib). - Dir.chdir("lib") { loaded_features.map! { |f| File.expand_path(f) } } - end - - loaded_features.reject! { |feature| RSpec::CallerFilter::LIB_REGEX =~ feature } - loaded_features.reject! { |feature| allowed_loaded_feature_regexps.any? { |r| r =~ feature } } - - expect(loaded_features).to eq([]) - end - - RSpec::Matchers.define :be_well_formed do - match do |actual| - actual.empty? - end - - failure_message do |actual| - actual.join("\n") - end - end - - it "has no malformed whitespace", :slow do - error_messages = [] - `git ls-files -z`.split("\x0").each do |filename| - error_messages << check_for_tab_characters(filename) - error_messages << check_for_extra_spaces(filename) - end - expect(error_messages.compact).to be_well_formed - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/shell_out.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/shell_out.rb deleted file mode 100644 index 3727c8a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/shell_out.rb +++ /dev/null @@ -1,115 +0,0 @@ -# frozen_string_literal: true - -require 'open3' -require 'rake/file_utils' -require 'shellwords' - -module RSpec - module Support - module ShellOut - def with_env(vars) - original = ENV.to_hash - vars.each { |k, v| ENV[k] = v } - - begin - yield - ensure - ENV.replace(original) - end - end - - if Open3.respond_to?(:capture3) # 1.9+ - def shell_out(*command) - stdout, stderr, status = Open3.capture3(*command) - return stdout, filter(stderr), status - end - else # 1.8.7 - # popen3 doesn't provide the exit status so we fake it out. - FakeProcessStatus = Struct.new(:exitstatus) - - def shell_out(*command) - stdout = stderr = nil - - Open3.popen3(*command) do |_in, out, err| - stdout = out.read - stderr = err.read - end - - status = FakeProcessStatus.new(0) - return stdout, filter(stderr), status - end - end - - def run_ruby_with_current_load_path(ruby_command, *flags) - command = [ - FileUtils::RUBY, - "-I#{$LOAD_PATH.map(&:shellescape).join(File::PATH_SEPARATOR)}", - "-e", ruby_command, *flags - ] - - # Unset these env vars because `ruby -w` will issue warnings whenever - # they are set to non-default values. - with_env 'RUBY_GC_HEAP_FREE_SLOTS' => nil, 'RUBY_GC_MALLOC_LIMIT' => nil, - 'RUBY_FREE_MIN' => nil do - shell_out(*command) - end - end - - LINES_TO_IGNORE = - [ - # Ignore bundler warning. - %r{bundler/source/rubygems}, - # Ignore bundler + rubygems warning. - %r{site_ruby/\d\.\d\.\d/rubygems}, - %r{site_ruby/\d\.\d\.\d/bundler}, - %r{jruby-\d\.\d\.\d+\.\d/lib/ruby/stdlib/rubygems}, - %r{lib/rubygems/custom_require}, - # This is required for windows for some reason - %r{lib/bundler/rubygems}, - # This is a JRuby file that generates warnings on 9.0.3.0 - %r{lib/ruby/stdlib/jar}, - # This is a JRuby file that generates warnings on 9.1.7.0 - %r{org/jruby/RubyKernel\.java}, - # This is a JRuby gem that generates warnings on 9.1.7.0 - %r{ffi-1\.13\.\d+-java}, - %r{uninitialized constant FFI}, - # These are related to the above, there is a warning about io from FFI - %r{jruby-\d\.\d\.\d+\.\d/lib/ruby/stdlib/io}, - %r{io/console on JRuby shells out to stty for most operations}, - # This is a JRuby 9.1.17.0 error on Github Actions - %r{io/console not supported; tty will not be manipulated}, - # This is a JRuby 9.2.1.x error - %r{jruby/kernel/gem_prelude}, - %r{lib/jruby\.jar!/jruby/preludes}, - # Ignore some JRuby errors for gems - %r{jruby/\d\.\d(\.\d)?/gems/aruba}, - %r{jruby/\d\.\d(\.\d)?/gems/ffi}, - %r{warning: encoding options not supported in 1\.8}, - # Ignore errors from asdf - %r{\.asdf/installs}, - ] - - def strip_known_warnings(input) - input.split("\n").reject do |l| - LINES_TO_IGNORE.any? { |to_ignore| l =~ to_ignore } || - # Remove blank lines - l == "" || l.nil? - end.join("\n") - end - - private - - if Ruby.jruby? - def filter(output) - output.each_line.reject do |line| - line.include?("lib/ruby/shared/rubygems") - end.join($/) - end - else - def filter(output) - output - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/stderr_splitter.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/stderr_splitter.rb deleted file mode 100644 index 9caa34c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/stderr_splitter.rb +++ /dev/null @@ -1,77 +0,0 @@ -# frozen_string_literal: true - -require 'stringio' - -module RSpec - module Support - class StdErrSplitter - def initialize(original) - @orig_stderr = original - @output_tracker = ::StringIO.new - @last_line = nil - end - - respond_to_name = (::RUBY_VERSION.to_f < 1.9) ? :respond_to? : :respond_to_missing? - define_method respond_to_name do |*args| - @orig_stderr.respond_to?(*args) || super(*args) - end - - def method_missing(name, *args, &block) - @output_tracker.__send__(name, *args, &block) if @output_tracker.respond_to?(name) - @orig_stderr.__send__(name, *args, &block) - end - - def ==(other) - @orig_stderr == other - end - - def reopen(*args) - reset! - @orig_stderr.reopen(*args) - end - - # To work around JRuby error: - # can't convert RSpec::Support::StdErrSplitter into String - def to_io - @orig_stderr.to_io - end - - # To work around JRuby error: - # TypeError: $stderr must have write method, RSpec::StdErrSplitter given - def write(line) - return if line =~ %r{^\S+/gems/\S+:\d+: warning:} # http://rubular.com/r/kqeUIZOfPG - - # Ruby 2.7.0 warnings from keyword arguments span multiple lines, extend check above - # to look for the next line. - return if @last_line =~ %r{^\S+/gems/\S+:\d+: warning:} && - line =~ %r{warning: The called method .* is defined here} - - # Ruby 2.7.0 complains about hashes used in place of keyword arguments - # Aruba 0.14.2 uses this internally triggering that here - return if line =~ %r{lib/ruby/2\.7\.0/fileutils\.rb:622: warning:} - - @orig_stderr.write(line) - @output_tracker.write(line) - ensure - @last_line = line - end - - def has_output? - !output.empty? - end - - def reset! - @output_tracker = ::StringIO.new - end - - def verify_no_warnings! - raise "Warnings were generated: #{output}" if has_output? - reset! - end - - def output - @output_tracker.string - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/string_matcher.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/string_matcher.rb deleted file mode 100644 index b8c0c71..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/string_matcher.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -require 'rspec/matchers' -# Special matcher for comparing encoded strings so that -# we don't run any expectation failures through the Differ, -# which also relies on EncodedString. Instead, confirm the -# strings have the same bytes. -RSpec::Matchers.define :be_identical_string do |expected| - if String.method_defined?(:encoding) - match do - expected_encoding? && - actual.bytes.to_a == expected.bytes.to_a - end - - failure_message do - "expected\n#{actual.inspect} (#{actual.encoding.name}) to be identical to\n"\ - "#{expected.inspect} (#{expected.encoding.name})\n"\ - "The exact bytes are printed below for more detail:\n"\ - "#{actual.bytes.to_a}\n"\ - "#{expected.bytes.to_a}\n"\ - end - - # Depends on chaining :with_same_encoding for it to - # check for string encoding. - def expected_encoding? - if defined?(@expect_same_encoding) && @expect_same_encoding - actual.encoding == expected.encoding - else - true - end - end - else - match do - actual.split(//) == expected.split(//) - end - - failure_message do - "expected\n#{actual.inspect} to be identical to\n#{expected.inspect}\n" - end - end - - chain :with_same_encoding do - @expect_same_encoding ||= true - end -end -RSpec::Matchers.alias_matcher :a_string_identical_to, :be_identical_string -RSpec::Matchers.alias_matcher :be_diffed_as, :be_identical_string diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/with_isolated_directory.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/with_isolated_directory.rb deleted file mode 100644 index f81a7df..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/with_isolated_directory.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -require 'tmpdir' - -RSpec.shared_context "isolated directory" do - around do |ex| - Dir.mktmpdir do |tmp_dir| - Dir.chdir(tmp_dir, &ex) - end - end -end - -RSpec.configure do |c| - c.include_context "isolated directory", :isolated_directory => true -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/with_isolated_stderr.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/with_isolated_stderr.rb deleted file mode 100644 index ef62be4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/spec/with_isolated_stderr.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module RSpec - module Support - module WithIsolatedStdErr - def with_isolated_stderr - original = $stderr - $stderr = StringIO.new - yield - ensure - $stderr = original - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/version.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/version.rb deleted file mode 100644 index e5fd9af..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/version.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -module RSpec - module Support - module Version - STRING = '3.13.5' - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/warnings.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/warnings.rb deleted file mode 100644 index 31783d9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/warnings.rb +++ /dev/null @@ -1,41 +0,0 @@ -# frozen_string_literal: true - -require 'rspec/support' -RSpec::Support.require_rspec_support "caller_filter" - -module RSpec - module Support - module Warnings - def deprecate(deprecated, options={}) - warn_with "DEPRECATION: #{deprecated} is deprecated.", options - end - - # @private - # - # Used internally to print deprecation warnings - # when rspec-core isn't loaded - def warn_deprecation(message, options={}) - warn_with "DEPRECATION: \n #{message}", options - end - - # @private - # - # Used internally to print warnings - def warning(text, options={}) - warn_with "WARNING: #{text}.", options - end - - # @private - # - # Used internally to print longer warnings - def warn_with(message, options={}) - call_site = options.fetch(:call_site) { CallerFilter.first_non_rspec_line } - message += " Use #{options[:replacement]} instead." if options[:replacement] - message += " Called from #{call_site}." if call_site - Support.warning_notifier.call message - end - end - end - - extend RSpec::Support::Warnings -end diff --git a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/with_keywords_when_needed.rb b/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/with_keywords_when_needed.rb deleted file mode 100644 index bec99f4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/rspec-support-3.13.5/lib/rspec/support/with_keywords_when_needed.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -RSpec::Support.require_rspec_support("method_signature_verifier") - -module RSpec - module Support - module WithKeywordsWhenNeeded - # This module adds keyword sensitive support for core ruby methods - # where we cannot use `ruby2_keywords` directly. - - module_function - - if RSpec::Support::RubyFeatures.kw_args_supported? - # Remove this in RSpec 4 in favour of explicitly passed in kwargs where - # this is used. Works around a warning in Ruby 2.7 - - def class_exec(klass, *args, &block) - if MethodSignature.new(block).has_kw_args_in?(args) - binding.eval(<<-CODE, __FILE__, __LINE__) - kwargs = args.pop - klass.class_exec(*args, **kwargs, &block) - CODE - else - klass.class_exec(*args, &block) - end - end - ruby2_keywords :class_exec if respond_to?(:ruby2_keywords, true) - else - def class_exec(klass, *args, &block) - klass.class_exec(*args, &block) - end - end - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/.document b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/.document deleted file mode 100644 index 6fbe0c0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/.document +++ /dev/null @@ -1,5 +0,0 @@ -COPYING -*.md -*.txt -docs/ -ext/stringio/ diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/.rdoc_options b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/.rdoc_options deleted file mode 100644 index f9297d9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/.rdoc_options +++ /dev/null @@ -1,2 +0,0 @@ ---- -main_page: README.md diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/COPYING b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/COPYING deleted file mode 100644 index 48e5a96..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/COPYING +++ /dev/null @@ -1,56 +0,0 @@ -Ruby is copyrighted free software by Yukihiro Matsumoto . -You can redistribute it and/or modify it under either the terms of the -2-clause BSDL (see the file BSDL), or the conditions below: - -1. You may make and give away verbatim copies of the source form of the - software without restriction, provided that you duplicate all of the - original copyright notices and associated disclaimers. - -2. You may modify your copy of the software in any way, provided that - you do at least ONE of the following: - - a. place your modifications in the Public Domain or otherwise - make them Freely Available, such as by posting said - modifications to Usenet or an equivalent medium, or by allowing - the author to include your modifications in the software. - - b. use the modified software only within your corporation or - organization. - - c. give non-standard binaries non-standard names, with - instructions on where to get the original software distribution. - - d. make other distribution arrangements with the author. - -3. You may distribute the software in object code or binary form, - provided that you do at least ONE of the following: - - a. distribute the binaries and library files of the software, - together with instructions (in the manual page or equivalent) - on where to get the original distribution. - - b. accompany the distribution with the machine-readable source of - the software. - - c. give non-standard binaries non-standard names, with - instructions on where to get the original software distribution. - - d. make other distribution arrangements with the author. - -4. You may modify and include the part of the software into any other - software (possibly commercial). But some files in the distribution - are not written by the author, so that they are not under these terms. - - For the list of those files and their copying conditions, see the - file LEGAL. - -5. The scripts and library files supplied as input to or produced as - output from the software do not automatically fall under the - copyright of the software, but belong to whomever generated them, - and may be sold commercially, and may be aggregated with this - software. - -6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE. diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/LICENSE.txt b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/LICENSE.txt deleted file mode 100644 index 66d9359..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/NEWS.md b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/NEWS.md deleted file mode 100644 index e82bd36..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/NEWS.md +++ /dev/null @@ -1,243 +0,0 @@ -# News - -## 3.1.7 - 2025-04-21 - -### Improvements - - * CRuby: Added support for `rb_io_mode_t` that will be introduced in - Ruby 3.5 or later. - * GH-129 - * Patch by Samuel Williams - -### Thanks - - * Samuel Williams - -## 3.1.6 - 2025-03-25 - -### Fixes - - * CRuby: Fix SEGV at unget to a null device StringIO - * JRuby: - * Fix NullPointerException at unget to a null device StringIO - * Use proper checkEncoding signature - * Update strioWrite logic to match CRuby - * GH-124 - -## 3.1.5 - 2025-02-21 - -### Improvements - - * JRuby: Improved compatibility with CRuby for `StringIO#seek` with - frozen string. - * GH-119 - * GH-121 - -## 3.1.4 - 2025-02-20 - -### Improvements - - * JRuby: Improved compatibility with CRuby. - * GH-116 - -### Fixes - - * CRuby: Fixed a bug that `StringIO` may mutate a shared string. - * GH-117 - -## 3.1.3 - 2025-02-14 - -### Fixes - - * JRuby: Fixed a bug that JRuby may not be able to be started - * GH-112 - * GH-113 - * Reported by Karol Bucek - -### Thanks - - * Karol Bucek - -## 3.1.2 - 2024-11-07 - -### Improvements - - * JRuby: Added support for detecting encoding by BOM. - * GH-100 - * GH-101 - -### Fixes - - * CRuby: Fixed a bug that unknown memory may be used by - `StringIO#ungetc`/`StringIO#ungetbyte`. - * https://hackerone.com/reports/2805165 - * Reported by manun. - -### Thanks - - * manun - -## 3.1.1 - 2024-06-13 - -### Improvements - - * JRuby: Improved. - * GH-83 - * GH-84 - * GH-85 - - * Added `StringIO::MAX_LENGTH`. - - * Added support for NULL `StringIO` by `StringIO.new(nil)`. - - * Improved IO compatibility for partial read. - * GH-95 - * https://bugs.ruby-lang.org/issues/20418 - -### Fixes - - * Fixed a bug that coderange isn't updated after overwrite. - * Reported by Tiago Cardoso. - * https://bugs.ruby-lang.org/issues/20185 - * GH-77 - * GH-79 - -### Thanks - - * Tiago Cardoso - -## 3.1.0 - 2023-11-28 - -### Fixes - - * TruffleRuby: Do not compile the C extension - - GH-71 - -## 3.0.9 - 2023-11-08 - -### Improvements - - * JRuby: Aligned `StringIO#gets` behavior with the C implementation. - - GH-61 - -### Fixes - - * CRuby: Fixed `StringIO#pread` with the length 0. - - Patch by Jean byroot Boussier. - - GH-67 - - * CRuby: Fixed a bug that `StringIO#gets` with non ASCII compatible - encoding such as UTF-16 doesn't detect correct new line characters. - - Reported by IWAMOTO Kouichi. - - GH-68 - -### Thanks - - * Jean byroot Boussier - - * IWAMOTO Kouichi - -## 3.0.8 - 2023-08-10 - -### Improvements - - * Added `StringIO#pread`. - - Patch by Jean byroot Boussier. - - GH-56 - - * JRuby: Added `StringIO::VERSION`. - - GH-57 GH-59 - -### Thanks - - * Jean byroot Boussier - -## 3.0.7 - 2023-06-02 - - * CRuby: Avoid direct struct usage. This change is for supporting - Ruby 3.3. - - GH-54 - -## 3.0.6 - 2023-04-14 - -### Improvements - - * CRuby: Added support for write barrier. - - * JRuby: Added missing arty-checking. - - GH-48 - - * JRuby: Added support for `StringIO.new(encoding:)`. - - GH-45 - -## 3.0.5 - 2023-02-02 - -### Improvements - -### Fixes - - * Fixed a bug that `StringIO#gets("2+ character", chomp: true)` did not - remove the separator at the end. - [[Bug #19389](https://bugs.ruby-lang.org/issues/19389)] - -## 3.0.4 - 2022-12-09 - -### Improvements - - * JRuby: Changed to use flag registry. - [[GitHub#33](https://github.com/ruby/stringio/pull/26)] - -## 3.0.3 - 2022-12-08 - -### Improvements - - * Improved documents. - [[GitHub#33](https://github.com/ruby/stringio/pull/33)] - [[GitHub#34](https://github.com/ruby/stringio/pull/34)] - [[GitHub#35](https://github.com/ruby/stringio/pull/35)] - [[GitHub#36](https://github.com/ruby/stringio/pull/36)] - [[GitHub#37](https://github.com/ruby/stringio/pull/37)] - [Patch by Burdette Lamar] - -### Fixes - - * Fixed a bug that large `StringIO#ungetc`/`StringIO#ungetbyte` - break internal buffer. - - * Fixed a bug that `StringIO#each("2+ character", chomp: true)` cause - infinite loop. - [[Bug #18769](https://bugs.ruby-lang.org/issues/18769)] - - * Fixed a bug that `StringIO#each(nil, chomp: true)` chomps. - [[Bug #18770](https://bugs.ruby-lang.org/issues/18770)] - - * Fixed a bug that `StringIO#each("", chomp: true)` isn't compatible - with `IO#each("", chomp: true)`. - [[Bug #18768](https://bugs.ruby-lang.org/issues/18768)] - - * Fixed a bug that `StringIO#set_encoding` doesn't accept external - and internal encodings pairo. - [[GitHub#16](https://github.com/ruby/stringio/issues/16)] - [Reported by Kenta Murata] - - * Fixed a bug that `StringIO#truncate` isn't compatible with - `File#truncate`. - -### Thanks - - * Kenta Murata - - * Burdette Lamar - diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/README.md b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/README.md deleted file mode 100644 index 0b875b0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# StringIO - -![ubuntu](https://github.com/ruby/stringio/workflows/ubuntu/badge.svg?branch=master&event=push) -![macos](https://github.com/ruby/stringio/workflows/macos/badge.svg?branch=master&event=push) -![windows](https://github.com/ruby/stringio/workflows/windows/badge.svg?branch=master&event=push) - -Pseudo `IO` class from/to `String`. - -This library is based on MoonWolf version written in Ruby. Thanks a lot. - -## Differences to `IO` - -* `fileno` raises `NotImplementedError`. -* encoding conversion is not implemented, and ignored silently. -* there is no `#to_io` method because this is not an `IO`. - -## Installation - -Add this line to your application's Gemfile: - -```ruby -gem 'stringio' -``` - -And then execute: - - $ bundle - -Or install it yourself as: - - $ gem install stringio - -## Development - -Run `bundle install` to install dependencies and then `bundle exec rake test` to run the tests. - -To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, author a NEWS.md section, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). - -## Contributing - -Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/stringio. - -## License - -The gem is available as open source under the terms of the [2-Clause BSD License](https://opensource.org/licenses/BSD-2-Clause). diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/docs/io.rb b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/docs/io.rb deleted file mode 100644 index bef7551..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/docs/io.rb +++ /dev/null @@ -1,8 +0,0 @@ -# :stopdoc: -class IO - module generic_readable - end - module generic_writable - end -end -# :startdoc: diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/.document b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/.document deleted file mode 100644 index decba01..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/.document +++ /dev/null @@ -1 +0,0 @@ -*.[ch] diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/Makefile b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/Makefile deleted file mode 100644 index 8391feb..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/Makefile +++ /dev/null @@ -1,269 +0,0 @@ - -SHELL = /bin/sh - -# V=0 quiet, V=1 verbose. other values don't work. -V = 0 -V0 = $(V:0=) -Q1 = $(V:1=) -Q = $(Q1:0=@) -ECHO1 = $(V:1=@ :) -ECHO = $(ECHO1:0=@ echo) -NULLCMD = : - -#### Start of system configuration section. #### - -srcdir = . -topdir = /usr/include/ruby-3.2.0 -hdrdir = $(topdir) -arch_hdrdir = /usr/include/x86_64-linux-gnu/ruby-3.2.0 -PATH_SEPARATOR = : -VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby -prefix = $(DESTDIR)/usr -rubysitearchprefix = $(sitearchlibdir)/$(RUBY_BASE_NAME) -rubyarchprefix = $(archlibdir)/$(RUBY_BASE_NAME) -rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) -exec_prefix = $(prefix) -vendorarchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/vendor_ruby -sitearchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/site_ruby -rubyarchhdrdir = $(archincludedir)/$(RUBY_VERSION_NAME) -vendorhdrdir = $(rubyhdrdir)/vendor_ruby -sitehdrdir = $(rubyhdrdir)/site_ruby -rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) -vendorarchdir = $(rubysitearchprefix)/vendor_ruby/$(ruby_version) -vendorlibdir = $(vendordir)/$(ruby_version) -vendordir = $(rubylibprefix)/vendor_ruby -sitearchdir = $(DESTDIR)/usr/local/lib/x86_64-linux-gnu/site_ruby -sitelibdir = $(sitedir)/$(ruby_version) -sitedir = $(DESTDIR)/usr/local/lib/site_ruby -rubyarchdir = $(rubyarchprefix)/$(ruby_version) -rubylibdir = $(rubylibprefix)/$(ruby_version) -sitearchincludedir = $(includedir)/$(sitearch) -archincludedir = $(includedir)/$(arch) -sitearchlibdir = $(libdir)/$(sitearch) -archlibdir = $(libdir)/$(arch) -ridir = $(datarootdir)/$(RI_BASE_NAME) -mandir = $(datarootdir)/man -localedir = $(datarootdir)/locale -libdir = $(exec_prefix)/lib -psdir = $(docdir) -pdfdir = $(docdir) -dvidir = $(docdir) -htmldir = $(docdir) -infodir = $(datarootdir)/info -docdir = $(datarootdir)/doc/$(PACKAGE) -oldincludedir = $(DESTDIR)/usr/include -includedir = $(prefix)/include -runstatedir = $(DESTDIR)/var/run -localstatedir = $(DESTDIR)/var -sharedstatedir = $(prefix)/com -sysconfdir = $(DESTDIR)/etc -datadir = $(datarootdir) -datarootdir = $(prefix)/share -libexecdir = $(exec_prefix)/libexec -sbindir = $(exec_prefix)/sbin -bindir = $(exec_prefix)/bin -archdir = $(rubyarchdir) - - -CC_WRAPPER = -CC = x86_64-linux-gnu-gcc -CXX = x86_64-linux-gnu-g++ -LIBRUBY = $(LIBRUBY_SO) -LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a -LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) -LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static $(MAINLIBS) -empty = -OUTFLAG = -o $(empty) -COUTFLAG = -o $(empty) -CSRCFLAG = $(empty) - -RUBY_EXTCONF_H = -cflags = $(optflags) $(debugflags) $(warnflags) -cxxflags = -optflags = -O3 -fno-fast-math -debugflags = -ggdb3 -warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdiv-by-zero -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wold-style-definition -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef -cppflags = -CCDLFLAGS = -fPIC -CFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC $(ARCH_FLAG) -INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) -DEFS = -CPPFLAGS = -Wdate-time -D_FORTIFY_SOURCE=3 $(DEFS) $(cppflags) -CXXFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 $(ARCH_FLAG) -ldflags = -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -dldflags = -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -ARCH_FLAG = -DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) -LDSHARED = $(CC) -shared -LDSHAREDXX = $(CXX) -shared -AR = x86_64-linux-gnu-gcc-ar -EXEEXT = - -RUBY_INSTALL_NAME = $(RUBY_BASE_NAME)3.2 -RUBY_SO_NAME = ruby-3.2 -RUBYW_INSTALL_NAME = -RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) -RUBYW_BASE_NAME = rubyw -RUBY_BASE_NAME = ruby - -arch = x86_64-linux-gnu -sitearch = $(arch) -ruby_version = 3.2.0 -ruby = $(bindir)/$(RUBY_BASE_NAME)3.2 -RUBY = $(ruby) -BUILTRUBY = $(bindir)/$(RUBY_BASE_NAME)3.2 -ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h - -RM = rm -f -RM_RF = rm -fr -RMDIRS = rmdir --ignore-fail-on-non-empty -p -MAKEDIRS = /bin/mkdir -p -INSTALL = /usr/bin/install -c -INSTALL_PROG = $(INSTALL) -m 0755 -INSTALL_DATA = $(INSTALL) -m 644 -COPY = cp -TOUCH = exit > - -#### End of system configuration section. #### - -preload = -libpath = . $(archlibdir) -LIBPATH = -L. -L$(archlibdir) -DEFFILE = - -CLEANFILES = mkmf.log -DISTCLEANFILES = -DISTCLEANDIRS = - -extout = -extout_prefix = -target_prefix = -LOCAL_LIBS = -LIBS = $(LIBRUBYARG_SHARED) -lm -lpthread -lc -ORIG_SRCS = stringio.c -SRCS = $(ORIG_SRCS) -OBJS = stringio.o -HDRS = -LOCAL_HDRS = -TARGET = stringio -TARGET_NAME = stringio -TARGET_ENTRY = Init_$(TARGET_NAME) -DLLIB = $(TARGET).so -EXTSTATIC = -STATIC_LIB = - -TIMESTAMP_DIR = . -BINDIR = $(bindir) -RUBYCOMMONDIR = $(sitedir)$(target_prefix) -RUBYLIBDIR = $(sitelibdir)$(target_prefix) -RUBYARCHDIR = $(sitearchdir)$(target_prefix) -HDRDIR = $(sitehdrdir)$(target_prefix) -ARCHHDRDIR = $(sitearchhdrdir)$(target_prefix) -TARGET_SO_DIR = -TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) -CLEANLIBS = $(TARGET_SO) false -CLEANOBJS = $(OBJS) *.bak -TARGET_SO_DIR_TIMESTAMP = $(TIMESTAMP_DIR)/.sitearchdir.time - -all: $(DLLIB) -static: $(STATIC_LIB) -.PHONY: all install static install-so install-rb -.PHONY: clean clean-so clean-static clean-rb - -clean-static:: -clean-rb-default:: -clean-rb:: -clean-so:: -clean: clean-so clean-static clean-rb-default clean-rb - -$(Q)$(RM_RF) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time - -distclean-rb-default:: -distclean-rb:: -distclean-so:: -distclean-static:: -distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb - -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log - -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) - -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true - -realclean: distclean -install: install-so install-rb - -install-so: $(DLLIB) $(TARGET_SO_DIR_TIMESTAMP) - $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) -clean-static:: - -$(Q)$(RM) $(STATIC_LIB) -install-rb: pre-install-rb do-install-rb install-rb-default -install-rb-default: pre-install-rb-default do-install-rb-default -pre-install-rb: Makefile -pre-install-rb-default: Makefile -do-install-rb: -do-install-rb-default: -pre-install-rb-default: - @$(NULLCMD) -$(TARGET_SO_DIR_TIMESTAMP): - $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) - $(Q) $(TOUCH) $@ - -site-install: site-install-so site-install-rb -site-install-so: install-so -site-install-rb: install-rb - -.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S - -.cc.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cc.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.mm.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.mm.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cxx.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cxx.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cpp.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cpp.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.c.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.c.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.m.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.m.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -$(TARGET_SO): $(OBJS) Makefile - $(ECHO) linking shared-object $(DLLIB) - -$(Q)$(RM) $(@) - $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) - - - -$(OBJS): $(HDRS) $(ruby_headers) diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/extconf.rb b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/extconf.rb deleted file mode 100644 index 0089766..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/extconf.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: false -require 'mkmf' -if RUBY_ENGINE == 'ruby' - have_type("rb_io_mode_t", "ruby/io.h") - - create_makefile('stringio') -else - File.write('Makefile', dummy_makefile("").join) -end diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/stringio.c b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/stringio.c deleted file mode 100644 index e621138..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/ext/stringio/stringio.c +++ /dev/null @@ -1,2023 +0,0 @@ -/* -*- mode: c; indent-tabs-mode: t -*- */ -/********************************************************************** - - stringio.c - - - $Author$ - $RoughId: stringio.c,v 1.13 2002/03/14 03:24:18 nobu Exp $ - created at: Tue Feb 19 04:10:38 JST 2002 - - All the files in this distribution are covered under the Ruby's - license (see the file COPYING). - -**********************************************************************/ - -static const char *const -STRINGIO_VERSION = "3.1.7"; - -#include - -#include "ruby.h" -#include "ruby/io.h" -#include "ruby/encoding.h" -#if defined(HAVE_FCNTL_H) || defined(_WIN32) -#include -#elif defined(HAVE_SYS_FCNTL_H) -#include -#endif - -#ifndef RB_INTEGER_TYPE_P -# define RB_INTEGER_TYPE_P(c) (FIXNUM_P(c) || RB_TYPE_P(c, T_BIGNUM)) -#endif - -#ifndef RB_PASS_CALLED_KEYWORDS -# define rb_funcallv_kw(recv, mid, arg, argv, kw_splat) rb_funcallv(recv, mid, arg, argv) -# define rb_class_new_instance_kw(argc, argv, klass, kw_splat) rb_class_new_instance(argc, argv, klass) -#endif - -#ifndef HAVE_TYPE_RB_IO_MODE_T -typedef int rb_io_mode_t; -#endif - -struct StringIO { - VALUE string; - rb_encoding *enc; - long pos; - long lineno; - rb_io_mode_t flags; - int count; -}; - -static VALUE strio_init(int, VALUE *, struct StringIO *, VALUE); -static VALUE strio_unget_bytes(struct StringIO *, const char *, long); -static long strio_write(VALUE self, VALUE str); - -#define IS_STRIO(obj) (rb_typeddata_is_kind_of((obj), &strio_data_type)) -#define error_inval(msg) (rb_syserr_fail(EINVAL, msg)) -#define get_enc(ptr) ((ptr)->enc ? (ptr)->enc : !NIL_P((ptr)->string) ? rb_enc_get((ptr)->string) : NULL) - -static bool -readonly_string_p(VALUE string) -{ - return OBJ_FROZEN_RAW(string); -} - -static struct StringIO * -strio_alloc(void) -{ - struct StringIO *ptr = ALLOC(struct StringIO); - ptr->string = Qnil; - ptr->pos = 0; - ptr->lineno = 0; - ptr->flags = 0; - ptr->count = 1; - return ptr; -} - -static void -strio_mark(void *p) -{ - struct StringIO *ptr = p; - - rb_gc_mark(ptr->string); -} - -static void -strio_free(void *p) -{ - struct StringIO *ptr = p; - if (--ptr->count <= 0) { - xfree(ptr); - } -} - -static size_t -strio_memsize(const void *p) -{ - return sizeof(struct StringIO); -} - -static const rb_data_type_t strio_data_type = { - "strio", - { - strio_mark, - strio_free, - strio_memsize, - }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED -}; - -#define check_strio(self) ((struct StringIO*)rb_check_typeddata((self), &strio_data_type)) - -static struct StringIO* -get_strio(VALUE self) -{ - struct StringIO *ptr = check_strio(rb_io_taint_check(self)); - - if (!ptr) { - rb_raise(rb_eIOError, "uninitialized stream"); - } - return ptr; -} - -static VALUE -enc_subseq(VALUE str, long pos, long len, rb_encoding *enc) -{ - str = rb_str_subseq(str, pos, len); - rb_enc_associate(str, enc); - return str; -} - -static VALUE -strio_substr(struct StringIO *ptr, long pos, long len, rb_encoding *enc) -{ - VALUE str = ptr->string; - long rlen = RSTRING_LEN(str) - pos; - - if (len > rlen) len = rlen; - if (len < 0) len = 0; - if (len == 0) return rb_enc_str_new(0, 0, enc); - return enc_subseq(str, pos, len, enc); -} - -#define StringIO(obj) get_strio(obj) - -#define STRIO_READABLE FL_USER4 -#define STRIO_WRITABLE FL_USER5 -#define STRIO_READWRITE (STRIO_READABLE|STRIO_WRITABLE) -typedef char strio_flags_check[(STRIO_READABLE/FMODE_READABLE == STRIO_WRITABLE/FMODE_WRITABLE) * 2 - 1]; -#define STRIO_MODE_SET_P(strio, mode) \ - ((RBASIC(strio)->flags & STRIO_##mode) && \ - ((struct StringIO*)DATA_PTR(strio))->flags & FMODE_##mode) -#define CLOSED(strio) (!STRIO_MODE_SET_P(strio, READWRITE)) -#define READABLE(strio) STRIO_MODE_SET_P(strio, READABLE) -#define WRITABLE(strio) STRIO_MODE_SET_P(strio, WRITABLE) - -static VALUE sym_exception; - -static struct StringIO* -readable(VALUE strio) -{ - struct StringIO *ptr = StringIO(strio); - if (!READABLE(strio)) { - rb_raise(rb_eIOError, "not opened for reading"); - } - return ptr; -} - -static struct StringIO* -writable(VALUE strio) -{ - struct StringIO *ptr = StringIO(strio); - if (!WRITABLE(strio)) { - rb_raise(rb_eIOError, "not opened for writing"); - } - return ptr; -} - -static void -check_modifiable(struct StringIO *ptr) -{ - if (NIL_P(ptr->string)) { - /* Null device StringIO */ - } - else if (OBJ_FROZEN_RAW(ptr->string)) { - rb_raise(rb_eIOError, "not modifiable string"); - } - else { - rb_str_modify(ptr->string); - } -} - -static VALUE -strio_s_allocate(VALUE klass) -{ - return TypedData_Wrap_Struct(klass, &strio_data_type, 0); -} - -/* - * call-seq: - * StringIO.new(string = '', mode = 'r+') -> new_stringio - * - * Note that +mode+ defaults to 'r' if +string+ is frozen. - * - * Returns a new \StringIO instance formed from +string+ and +mode+; - * see {Access Modes}[rdoc-ref:File@Access+Modes]: - * - * strio = StringIO.new # => # - * strio.close - * - * The instance should be closed when no longer needed. - * - * Related: StringIO.open (accepts block; closes automatically). - */ -static VALUE -strio_initialize(int argc, VALUE *argv, VALUE self) -{ - struct StringIO *ptr = check_strio(self); - - if (!ptr) { - DATA_PTR(self) = ptr = strio_alloc(); - } - rb_call_super(0, 0); - return strio_init(argc, argv, ptr, self); -} - -static int -detect_bom(VALUE str, int *bomlen) -{ - const char *p; - long len; - - RSTRING_GETMEM(str, p, len); - if (len < 1) return 0; - switch ((unsigned char)p[0]) { - case 0xEF: - if (len < 2) break; - if ((unsigned char)p[1] == 0xBB && len > 2) { - if ((unsigned char)p[2] == 0xBF) { - *bomlen = 3; - return rb_utf8_encindex(); - } - } - break; - - case 0xFE: - if (len < 2) break; - if ((unsigned char)p[1] == 0xFF) { - *bomlen = 2; - return rb_enc_find_index("UTF-16BE"); - } - break; - - case 0xFF: - if (len < 2) break; - if ((unsigned char)p[1] == 0xFE) { - if (len >= 4 && (unsigned char)p[2] == 0 && (unsigned char)p[3] == 0) { - *bomlen = 4; - return rb_enc_find_index("UTF-32LE"); - } - *bomlen = 2; - return rb_enc_find_index("UTF-16LE"); - } - break; - - case 0: - if (len < 4) break; - if ((unsigned char)p[1] == 0 && (unsigned char)p[2] == 0xFE && (unsigned char)p[3] == 0xFF) { - *bomlen = 4; - return rb_enc_find_index("UTF-32BE"); - } - break; - } - return 0; -} - -static rb_encoding * -set_encoding_by_bom(struct StringIO *ptr) -{ - int bomlen, idx = detect_bom(ptr->string, &bomlen); - rb_encoding *extenc = NULL; - - if (idx) { - extenc = rb_enc_from_index(idx); - ptr->pos = bomlen; - if (ptr->flags & FMODE_WRITABLE) { - rb_enc_associate_index(ptr->string, idx); - } - } - ptr->enc = extenc; - return extenc; -} - -static VALUE -strio_init(int argc, VALUE *argv, struct StringIO *ptr, VALUE self) -{ - VALUE string, vmode, opt; - int oflags; - rb_io_enc_t convconfig; - - argc = rb_scan_args(argc, argv, "02:", &string, &vmode, &opt); - rb_io_extract_modeenc(&vmode, 0, opt, &oflags, &ptr->flags, &convconfig); - if (!NIL_P(string)) { - StringValue(string); - } - else if (!argc) { - string = rb_enc_str_new("", 0, rb_default_external_encoding()); - } - - if (!NIL_P(string) && readonly_string_p(string)) { - if (ptr->flags & FMODE_WRITABLE) { - rb_syserr_fail(EACCES, 0); - } - } - else { - if (NIL_P(vmode)) { - ptr->flags |= FMODE_WRITABLE; - } - } - if (!NIL_P(string) && (ptr->flags & FMODE_TRUNC)) { - rb_str_resize(string, 0); - } - RB_OBJ_WRITE(self, &ptr->string, string); - if (argc == 1 && !NIL_P(string)) { - ptr->enc = rb_enc_get(string); - } - else { - ptr->enc = convconfig.enc; - } - ptr->pos = 0; - ptr->lineno = 0; - if (ptr->flags & FMODE_SETENC_BY_BOM) set_encoding_by_bom(ptr); - RBASIC(self)->flags |= (ptr->flags & FMODE_READWRITE) * (STRIO_READABLE / FMODE_READABLE); - return self; -} - -static VALUE -strio_finalize(VALUE self) -{ - struct StringIO *ptr = StringIO(self); - RB_OBJ_WRITE(self, &ptr->string, Qnil); - ptr->flags &= ~FMODE_READWRITE; - return self; -} - -/* - * call-seq: - * StringIO.open(string = '', mode = 'r+') {|strio| ... } - * - * Note that +mode+ defaults to 'r' if +string+ is frozen. - * - * Creates a new \StringIO instance formed from +string+ and +mode+; - * see {Access Modes}[rdoc-ref:File@Access+Modes]. - * - * With no block, returns the new instance: - * - * strio = StringIO.open # => # - * - * With a block, calls the block with the new instance - * and returns the block's value; - * closes the instance on block exit. - * - * StringIO.open {|strio| p strio } - * # => # - * - * Related: StringIO.new. - */ -static VALUE -strio_s_open(int argc, VALUE *argv, VALUE klass) -{ - VALUE obj = rb_class_new_instance_kw(argc, argv, klass, RB_PASS_CALLED_KEYWORDS); - if (!rb_block_given_p()) return obj; - return rb_ensure(rb_yield, obj, strio_finalize, obj); -} - -/* :nodoc: */ -static VALUE -strio_s_new(int argc, VALUE *argv, VALUE klass) -{ - if (rb_block_given_p()) { - VALUE cname = rb_obj_as_string(klass); - - rb_warn("%"PRIsVALUE"::new() does not take block; use %"PRIsVALUE"::open() instead", - cname, cname); - } - return rb_class_new_instance_kw(argc, argv, klass, RB_PASS_CALLED_KEYWORDS); -} - -/* - * Returns +false+. Just for compatibility to IO. - */ -static VALUE -strio_false(VALUE self) -{ - StringIO(self); - return Qfalse; -} - -/* - * Returns +nil+. Just for compatibility to IO. - */ -static VALUE -strio_nil(VALUE self) -{ - StringIO(self); - return Qnil; -} - -/* - * Returns an object itself. Just for compatibility to IO. - */ -static VALUE -strio_self(VALUE self) -{ - StringIO(self); - return self; -} - -/* - * Returns 0. Just for compatibility to IO. - */ -static VALUE -strio_0(VALUE self) -{ - StringIO(self); - return INT2FIX(0); -} - -/* - * Returns the argument unchanged. Just for compatibility to IO. - */ -static VALUE -strio_first(VALUE self, VALUE arg) -{ - StringIO(self); - return arg; -} - -/* - * Raises NotImplementedError. - */ -static VALUE -strio_unimpl(int argc, VALUE *argv, VALUE self) -{ - StringIO(self); - rb_notimplement(); - - UNREACHABLE; -} - -/* - * call-seq: - * string -> string - * - * Returns underlying string: - * - * StringIO.open('foo') do |strio| - * p strio.string - * strio.string = 'bar' - * p strio.string - * end - * - * Output: - * - * "foo" - * "bar" - * - * Related: StringIO#string= (assigns the underlying string). - */ -static VALUE -strio_get_string(VALUE self) -{ - return StringIO(self)->string; -} - -/* - * call-seq: - * string = other_string -> other_string - * - * Assigns the underlying string as +other_string+, and sets position to zero; - * returns +other_string+: - * - * StringIO.open('foo') do |strio| - * p strio.string - * strio.string = 'bar' - * p strio.string - * end - * - * Output: - * - * "foo" - * "bar" - * - * Related: StringIO#string (returns the underlying string). - */ -static VALUE -strio_set_string(VALUE self, VALUE string) -{ - struct StringIO *ptr = StringIO(self); - - rb_io_taint_check(self); - ptr->flags &= ~FMODE_READWRITE; - StringValue(string); - ptr->flags = readonly_string_p(string) ? FMODE_READABLE : FMODE_READWRITE; - ptr->pos = 0; - ptr->lineno = 0; - RB_OBJ_WRITE(self, &ptr->string, string); - return string; -} - -/* - * call-seq: - * close -> nil - * - * Closes +self+ for both reading and writing. - * - * Raises IOError if reading or writing is attempted. - * - * Related: StringIO#close_read, StringIO#close_write. - */ -static VALUE -strio_close(VALUE self) -{ - StringIO(self); - RBASIC(self)->flags &= ~STRIO_READWRITE; - return Qnil; -} - -/* - * call-seq: - * close_read -> nil - * - * Closes +self+ for reading; closed-write setting remains unchanged. - * - * Raises IOError if reading is attempted. - * - * Related: StringIO#close, StringIO#close_write. - */ -static VALUE -strio_close_read(VALUE self) -{ - struct StringIO *ptr = StringIO(self); - if (!(ptr->flags & FMODE_READABLE)) { - rb_raise(rb_eIOError, "closing non-duplex IO for reading"); - } - RBASIC(self)->flags &= ~STRIO_READABLE; - return Qnil; -} - -/* - * call-seq: - * close_write -> nil - * - * Closes +self+ for writing; closed-read setting remains unchanged. - * - * Raises IOError if writing is attempted. - * - * Related: StringIO#close, StringIO#close_read. - */ -static VALUE -strio_close_write(VALUE self) -{ - struct StringIO *ptr = StringIO(self); - if (!(ptr->flags & FMODE_WRITABLE)) { - rb_raise(rb_eIOError, "closing non-duplex IO for writing"); - } - RBASIC(self)->flags &= ~STRIO_WRITABLE; - return Qnil; -} - -/* - * call-seq: - * closed? -> true or false - * - * Returns +true+ if +self+ is closed for both reading and writing, - * +false+ otherwise. - */ -static VALUE -strio_closed(VALUE self) -{ - StringIO(self); - if (!CLOSED(self)) return Qfalse; - return Qtrue; -} - -/* - * call-seq: - * closed_read? -> true or false - * - * Returns +true+ if +self+ is closed for reading, +false+ otherwise. - */ -static VALUE -strio_closed_read(VALUE self) -{ - StringIO(self); - if (READABLE(self)) return Qfalse; - return Qtrue; -} - -/* - * call-seq: - * closed_write? -> true or false - * - * Returns +true+ if +self+ is closed for writing, +false+ otherwise. - */ -static VALUE -strio_closed_write(VALUE self) -{ - StringIO(self); - if (WRITABLE(self)) return Qfalse; - return Qtrue; -} - -static struct StringIO * -strio_to_read(VALUE self) -{ - struct StringIO *ptr = readable(self); - if (NIL_P(ptr->string)) return NULL; - if (ptr->pos < RSTRING_LEN(ptr->string)) return ptr; - return NULL; -} - -/* - * call-seq: - * eof? -> true or false - * - * Returns +true+ if positioned at end-of-stream, +false+ otherwise; - * see {Position}[rdoc-ref:IO@Position]. - * - * Raises IOError if the stream is not opened for reading. - */ -static VALUE -strio_eof(VALUE self) -{ - if (strio_to_read(self)) return Qfalse; - return Qtrue; -} - -/* :nodoc: */ -static VALUE -strio_copy(VALUE copy, VALUE orig) -{ - struct StringIO *ptr, *old_ptr; - VALUE old_string = Qundef; - - orig = rb_convert_type(orig, T_DATA, "StringIO", "to_strio"); - if (copy == orig) return copy; - ptr = StringIO(orig); - old_ptr = check_strio(copy); - if (old_ptr) { - old_string = old_ptr->string; - strio_free(old_ptr); - } - DATA_PTR(copy) = ptr; - RB_OBJ_WRITTEN(copy, old_string, ptr->string); - RBASIC(copy)->flags &= ~STRIO_READWRITE; - RBASIC(copy)->flags |= RBASIC(orig)->flags & STRIO_READWRITE; - ++ptr->count; - return copy; -} - -/* - * call-seq: - * lineno -> current_line_number - * - * Returns the current line number in +self+; - * see {Line Number}[rdoc-ref:IO@Line+Number]. - */ -static VALUE -strio_get_lineno(VALUE self) -{ - return LONG2NUM(StringIO(self)->lineno); -} - -/* - * call-seq: - * lineno = new_line_number -> new_line_number - * - * Sets the current line number in +self+ to the given +new_line_number+; - * see {Line Number}[rdoc-ref:IO@Line+Number]. - */ -static VALUE -strio_set_lineno(VALUE self, VALUE lineno) -{ - StringIO(self)->lineno = NUM2LONG(lineno); - return lineno; -} - -/* - * call-seq: - * binmode -> self - * - * Sets the data mode in +self+ to binary mode; - * see {Data Mode}[rdoc-ref:File@Data+Mode]. - * - */ -static VALUE -strio_binmode(VALUE self) -{ - struct StringIO *ptr = StringIO(self); - rb_encoding *enc = rb_ascii8bit_encoding(); - - ptr->enc = enc; - if (WRITABLE(self)) { - rb_enc_associate(ptr->string, enc); - } - return self; -} - -#define strio_fcntl strio_unimpl - -#define strio_flush strio_self - -#define strio_fsync strio_0 - -/* - * call-seq: - * reopen(other, mode = 'r+') -> self - * - * Reinitializes the stream with the given +other+ (string or StringIO) and +mode+; - * see IO.new: - * - * StringIO.open('foo') do |strio| - * p strio.string - * strio.reopen('bar') - * p strio.string - * other_strio = StringIO.new('baz') - * strio.reopen(other_strio) - * p strio.string - * other_strio.close - * end - * - * Output: - * - * "foo" - * "bar" - * "baz" - * - */ -static VALUE -strio_reopen(int argc, VALUE *argv, VALUE self) -{ - rb_io_taint_check(self); - if (argc == 1 && !RB_TYPE_P(*argv, T_STRING)) { - return strio_copy(self, *argv); - } - return strio_init(argc, argv, StringIO(self), self); -} - -/* - * call-seq: - * pos -> stream_position - * - * Returns the current position (in bytes); - * see {Position}[rdoc-ref:IO@Position]. - */ -static VALUE -strio_get_pos(VALUE self) -{ - return LONG2NUM(StringIO(self)->pos); -} - -/* - * call-seq: - * pos = new_position -> new_position - * - * Sets the current position (in bytes); - * see {Position}[rdoc-ref:IO@Position]. - */ -static VALUE -strio_set_pos(VALUE self, VALUE pos) -{ - struct StringIO *ptr = StringIO(self); - long p = NUM2LONG(pos); - if (p < 0) { - error_inval(0); - } - ptr->pos = p; - return pos; -} - -/* - * call-seq: - * rewind -> 0 - * - * Sets the current position and line number to zero; - * see {Position}[rdoc-ref:IO@Position] - * and {Line Number}[rdoc-ref:IO@Line+Number]. - */ -static VALUE -strio_rewind(VALUE self) -{ - struct StringIO *ptr = StringIO(self); - ptr->pos = 0; - ptr->lineno = 0; - return INT2FIX(0); -} - -/* - * call-seq: - * seek(offset, whence = SEEK_SET) -> 0 - * - * Sets the current position to the given integer +offset+ (in bytes), - * with respect to a given constant +whence+; - * see {Position}[rdoc-ref:IO@Position]. - */ -static VALUE -strio_seek(int argc, VALUE *argv, VALUE self) -{ - VALUE whence; - struct StringIO *ptr = StringIO(self); - long amount, offset; - - rb_scan_args(argc, argv, "11", NULL, &whence); - amount = NUM2LONG(argv[0]); - if (CLOSED(self)) { - rb_raise(rb_eIOError, "closed stream"); - } - switch (NIL_P(whence) ? 0 : NUM2LONG(whence)) { - case 0: - offset = 0; - break; - case 1: - offset = ptr->pos; - break; - case 2: - offset = RSTRING_LEN(ptr->string); - break; - default: - error_inval("invalid whence"); - } - if (amount > LONG_MAX - offset || amount + offset < 0) { - error_inval(0); - } - ptr->pos = amount + offset; - return INT2FIX(0); -} - -/* - * call-seq: - * sync -> true - * - * Returns +true+; implemented only for compatibility with other stream classes. - */ -static VALUE -strio_get_sync(VALUE self) -{ - StringIO(self); - return Qtrue; -} - -#define strio_set_sync strio_first - -#define strio_tell strio_get_pos - -/* - * call-seq: - * each_byte {|byte| ... } -> self - * - * With a block given, calls the block with each remaining byte in the stream; - * see {Byte IO}[rdoc-ref:IO@Byte+IO]. - * - * With no block given, returns an enumerator. - */ -static VALUE -strio_each_byte(VALUE self) -{ - struct StringIO *ptr; - - RETURN_ENUMERATOR(self, 0, 0); - - while ((ptr = strio_to_read(self)) != NULL) { - char c = RSTRING_PTR(ptr->string)[ptr->pos++]; - rb_yield(CHR2FIX(c)); - } - return self; -} - -/* - * call-seq: - * getc -> character or nil - * - * Reads and returns the next character from the stream; - * see {Character IO}[rdoc-ref:IO@Character+IO]. - */ -static VALUE -strio_getc(VALUE self) -{ - struct StringIO *ptr = readable(self); - rb_encoding *enc = get_enc(ptr); - VALUE str = ptr->string; - long pos = ptr->pos; - int len; - char *p; - - if (NIL_P(str) || pos >= RSTRING_LEN(str)) { - return Qnil; - } - p = RSTRING_PTR(str)+pos; - len = rb_enc_mbclen(p, RSTRING_END(str), enc); - ptr->pos += len; - return enc_subseq(str, pos, len, enc); -} - -/* - * call-seq: - * getbyte -> byte or nil - * - * Reads and returns the next 8-bit byte from the stream; - * see {Byte IO}[rdoc-ref:IO@Byte+IO]. - */ -static VALUE -strio_getbyte(VALUE self) -{ - struct StringIO *ptr = readable(self); - int c; - if (NIL_P(ptr->string) || ptr->pos >= RSTRING_LEN(ptr->string)) { - return Qnil; - } - c = RSTRING_PTR(ptr->string)[ptr->pos++]; - return CHR2FIX(c); -} - -static void -strio_extend(struct StringIO *ptr, long pos, long len) -{ - long olen; - - if (len > LONG_MAX - pos) - rb_raise(rb_eArgError, "string size too big"); - - check_modifiable(ptr); - olen = RSTRING_LEN(ptr->string); - if (pos + len > olen) { - rb_str_resize(ptr->string, pos + len); - if (pos > olen) - MEMZERO(RSTRING_PTR(ptr->string) + olen, char, pos - olen); - } -} - -static void -strio_unget_string(struct StringIO *ptr, VALUE c) -{ - const char *cp = NULL; - long cl = RSTRING_LEN(c); - if (cl > 0) { - if (c != ptr->string) cp = RSTRING_PTR(c); - strio_unget_bytes(ptr, cp, cl); - RB_GC_GUARD(c); - } -} - -/* - * call-seq: - * ungetc(character) -> nil - * - * Pushes back ("unshifts") a character or integer onto the stream; - * see {Character IO}[rdoc-ref:IO@Character+IO]. - */ -static VALUE -strio_ungetc(VALUE self, VALUE c) -{ - struct StringIO *ptr = readable(self); - rb_encoding *enc, *enc2; - - check_modifiable(ptr); - if (NIL_P(ptr->string)) return Qnil; - if (NIL_P(c)) return Qnil; - if (RB_INTEGER_TYPE_P(c)) { - int len, cc = NUM2INT(c); - char buf[16]; - - enc = rb_enc_get(ptr->string); - len = rb_enc_codelen(cc, enc); - if (len <= 0) { - rb_enc_uint_chr(cc, enc); /* to raise an exception */ - UNREACHABLE; - } - rb_enc_mbcput(cc, buf, enc); - return strio_unget_bytes(ptr, buf, len); - } - else { - StringValue(c); - if (RSTRING_LEN(c) == 0) return Qnil; - enc = rb_enc_get(ptr->string); - enc2 = rb_enc_get(c); - if (enc != enc2 && enc != rb_ascii8bit_encoding()) { - c = rb_str_conv_enc(c, enc2, enc); - } - strio_unget_string(ptr, c); - return Qnil; - } -} - -/* - * call-seq: - * ungetbyte(byte) -> nil - * - * Pushes back ("unshifts") an 8-bit byte onto the stream; - * see {Byte IO}[rdoc-ref:IO@Byte+IO]. - */ -static VALUE -strio_ungetbyte(VALUE self, VALUE c) -{ - struct StringIO *ptr = readable(self); - - check_modifiable(ptr); - if (NIL_P(ptr->string)) return Qnil; - if (NIL_P(c)) return Qnil; - if (RB_INTEGER_TYPE_P(c)) { - /* rb_int_and() not visible from exts */ - VALUE v = rb_funcall(c, '&', 1, INT2FIX(0xff)); - const char cc = NUM2INT(v) & 0xFF; - strio_unget_bytes(ptr, &cc, 1); - } - else { - StringValue(c); - strio_unget_string(ptr, c); - } - return Qnil; -} - -static VALUE -strio_unget_bytes(struct StringIO *ptr, const char *cp, long cl) -{ - long pos = ptr->pos, len, rest; - VALUE str = ptr->string; - char *s; - - len = RSTRING_LEN(str); - rest = pos - len; - if (cl > pos) { - long ex = cl - (rest < 0 ? pos : len); - rb_str_modify_expand(str, ex); - rb_str_set_len(str, len + ex); - s = RSTRING_PTR(str); - if (rest < 0) memmove(s + cl, s + pos, -rest); - pos = 0; - } - else { - if (rest > 0) { - rb_str_modify_expand(str, rest); - rb_str_set_len(str, len + rest); - } - s = RSTRING_PTR(str); - if (rest > cl) memset(s + len, 0, rest - cl); - pos -= cl; - } - memcpy(s + pos, (cp ? cp : s), cl); - ptr->pos = pos; - return Qnil; -} - -/* - * call-seq: - * readchar -> string - * - * Like +getc+, but raises an exception if already at end-of-stream; - * see {Character IO}[rdoc-ref:IO@Character+IO]. - */ -static VALUE -strio_readchar(VALUE self) -{ - VALUE c = rb_funcallv(self, rb_intern("getc"), 0, 0); - if (NIL_P(c)) rb_eof_error(); - return c; -} - -/* - * call-seq: - * readbyte -> byte - * - * Like +getbyte+, but raises an exception if already at end-of-stream; - * see {Byte IO}[rdoc-ref:IO@Byte+IO]. - */ -static VALUE -strio_readbyte(VALUE self) -{ - VALUE c = rb_funcallv(self, rb_intern("getbyte"), 0, 0); - if (NIL_P(c)) rb_eof_error(); - return c; -} - -/* - * call-seq: - * each_char {|c| ... } -> self - * - * With a block given, calls the block with each remaining character in the stream; - * see {Character IO}[rdoc-ref:IO@Character+IO]. - * - * With no block given, returns an enumerator. - */ -static VALUE -strio_each_char(VALUE self) -{ - VALUE c; - - RETURN_ENUMERATOR(self, 0, 0); - - while (!NIL_P(c = strio_getc(self))) { - rb_yield(c); - } - return self; -} - -/* - * call-seq: - * each_codepoint {|codepoint| ... } -> self - * - * With a block given, calls the block with each remaining codepoint in the stream; - * see {Codepoint IO}[rdoc-ref:IO@Codepoint+IO]. - * - * With no block given, returns an enumerator. - */ -static VALUE -strio_each_codepoint(VALUE self) -{ - struct StringIO *ptr; - rb_encoding *enc; - unsigned int c; - int n; - - RETURN_ENUMERATOR(self, 0, 0); - - ptr = readable(self); - enc = get_enc(ptr); - while ((ptr = strio_to_read(self)) != NULL) { - c = rb_enc_codepoint_len(RSTRING_PTR(ptr->string)+ptr->pos, - RSTRING_END(ptr->string), &n, enc); - ptr->pos += n; - rb_yield(UINT2NUM(c)); - } - return self; -} - -/* Boyer-Moore search: copied from regex.c */ -static void -bm_init_skip(long *skip, const char *pat, long m) -{ - int c; - - for (c = 0; c < (1 << CHAR_BIT); c++) { - skip[c] = m; - } - while (--m) { - skip[(unsigned char)*pat++] = m; - } -} - -static long -bm_search(const char *little, long llen, const char *big, long blen, const long *skip) -{ - long i, j, k; - - i = llen - 1; - while (i < blen) { - k = i; - j = llen - 1; - while (j >= 0 && big[k] == little[j]) { - k--; - j--; - } - if (j < 0) return k + 1; - i += skip[(unsigned char)big[i]]; - } - return -1; -} - -struct getline_arg { - VALUE rs; - long limit; - unsigned int chomp: 1; -}; - -static struct getline_arg * -prepare_getline_args(struct StringIO *ptr, struct getline_arg *arg, int argc, VALUE *argv) -{ - VALUE rs, lim, opts; - long limit = -1; - int respect_chomp; - - argc = rb_scan_args(argc, argv, "02:", &rs, &lim, &opts); - respect_chomp = argc == 0 || !NIL_P(rs); - switch (argc) { - case 0: - rs = rb_rs; - break; - - case 1: - if (!NIL_P(rs) && !RB_TYPE_P(rs, T_STRING)) { - VALUE tmp = rb_check_string_type(rs); - if (NIL_P(tmp)) { - limit = NUM2LONG(rs); - rs = rb_rs; - } - else { - rs = tmp; - } - } - break; - - case 2: - if (!NIL_P(rs)) StringValue(rs); - if (!NIL_P(lim)) limit = NUM2LONG(lim); - break; - } - if (!NIL_P(ptr->string) && !NIL_P(rs)) { - rb_encoding *enc_rs, *enc_io; - enc_rs = rb_enc_get(rs); - enc_io = get_enc(ptr); - if (enc_rs != enc_io && - (rb_enc_str_coderange(rs) != ENC_CODERANGE_7BIT || - (RSTRING_LEN(rs) > 0 && !rb_enc_asciicompat(enc_io)))) { - if (rs == rb_rs) { - rs = rb_enc_str_new(0, 0, enc_io); - rb_str_buf_cat_ascii(rs, "\n"); - rs = rs; - } - else { - rb_raise(rb_eArgError, "encoding mismatch: %s IO with %s RS", - rb_enc_name(enc_io), - rb_enc_name(enc_rs)); - } - } - } - arg->rs = rs; - arg->limit = limit; - arg->chomp = 0; - if (!NIL_P(opts)) { - static ID keywords[1]; - VALUE vchomp; - if (!keywords[0]) { - keywords[0] = rb_intern_const("chomp"); - } - rb_get_kwargs(opts, keywords, 0, 1, &vchomp); - if (respect_chomp) { - arg->chomp = (vchomp != Qundef) && RTEST(vchomp); - } - } - return arg; -} - -static inline int -chomp_newline_width(const char *s, const char *e) -{ - if (e > s && *--e == '\n') { - if (e > s && *--e == '\r') return 2; - return 1; - } - return 0; -} - -static VALUE -strio_getline(struct getline_arg *arg, struct StringIO *ptr) -{ - const char *s, *e, *p; - long n, limit = arg->limit; - VALUE str = arg->rs; - long w = 0; - rb_encoding *enc = get_enc(ptr); - - if (NIL_P(ptr->string) || ptr->pos >= (n = RSTRING_LEN(ptr->string))) { - return Qnil; - } - s = RSTRING_PTR(ptr->string); - e = s + RSTRING_LEN(ptr->string); - s += ptr->pos; - if (limit > 0 && (size_t)limit < (size_t)(e - s)) { - e = rb_enc_right_char_head(s, s + limit, e, get_enc(ptr)); - } - if (NIL_P(str)) { - if (arg->chomp) { - w = chomp_newline_width(s, e); - } - str = strio_substr(ptr, ptr->pos, e - s - w, enc); - } - else if ((n = RSTRING_LEN(str)) == 0) { - const char *paragraph_end = NULL; - p = s; - while (p[(p + 1 < e) && (*p == '\r') && 0] == '\n') { - p += *p == '\r'; - if (++p == e) { - return Qnil; - } - } - s = p; - while ((p = memchr(p, '\n', e - p)) && (p != e)) { - p++; - if (!((p < e && *p == '\n') || - (p + 1 < e && *p == '\r' && *(p+1) == '\n'))) { - continue; - } - paragraph_end = p - ((*(p-2) == '\r') ? 2 : 1); - while ((p < e && *p == '\n') || - (p + 1 < e && *p == '\r' && *(p+1) == '\n')) { - p += (*p == '\r') ? 2 : 1; - } - e = p; - break; - } - if (arg->chomp && paragraph_end) { - w = e - paragraph_end; - } - str = strio_substr(ptr, s - RSTRING_PTR(ptr->string), e - s - w, enc); - } - else if (n == 1) { - if ((p = memchr(s, RSTRING_PTR(str)[0], e - s)) != 0) { - e = p + 1; - w = (arg->chomp ? (p > s && *(p-1) == '\r') + 1 : 0); - } - str = strio_substr(ptr, ptr->pos, e - s - w, enc); - } - else { - if (n < e - s + arg->chomp) { - /* unless chomping, RS at the end does not matter */ - if (e - s < 1024 || n == e - s) { - for (p = s; p + n <= e; ++p) { - if (MEMCMP(p, RSTRING_PTR(str), char, n) == 0) { - e = p + n; - w = (arg->chomp ? n : 0); - break; - } - } - } - else { - long skip[1 << CHAR_BIT], pos; - p = RSTRING_PTR(str); - bm_init_skip(skip, p, n); - if ((pos = bm_search(p, n, s, e - s, skip)) >= 0) { - e = s + pos + (arg->chomp ? 0 : n); - } - } - } - str = strio_substr(ptr, ptr->pos, e - s - w, enc); - } - ptr->pos = e - RSTRING_PTR(ptr->string); - ptr->lineno++; - return str; -} - -/* - * call-seq: - * gets(sep = $/, chomp: false) -> string or nil - * gets(limit, chomp: false) -> string or nil - * gets(sep, limit, chomp: false) -> string or nil - * - * Reads and returns a line from the stream; - * assigns the return value to $_; - * see {Line IO}[rdoc-ref:IO@Line+IO]. - */ -static VALUE -strio_gets(int argc, VALUE *argv, VALUE self) -{ - struct StringIO *ptr = readable(self); - struct getline_arg arg; - VALUE str; - - if (prepare_getline_args(ptr, &arg, argc, argv)->limit == 0) { - if (NIL_P(ptr->string)) return Qnil; - return rb_enc_str_new(0, 0, get_enc(ptr)); - } - - str = strio_getline(&arg, ptr); - rb_lastline_set(str); - return str; -} - -/* - * call-seq: - * readline(sep = $/, chomp: false) -> string - * readline(limit, chomp: false) -> string - * readline(sep, limit, chomp: false) -> string - * - * Reads a line as with IO#gets, but raises EOFError if already at end-of-file; - * see {Line IO}[rdoc-ref:IO@Line+IO]. - */ -static VALUE -strio_readline(int argc, VALUE *argv, VALUE self) -{ - VALUE line = rb_funcallv_kw(self, rb_intern("gets"), argc, argv, RB_PASS_CALLED_KEYWORDS); - if (NIL_P(line)) rb_eof_error(); - return line; -} - -/* - * call-seq: - * each_line(sep = $/, chomp: false) {|line| ... } -> self - * each_line(limit, chomp: false) {|line| ... } -> self - * each_line(sep, limit, chomp: false) {|line| ... } -> self - * - * Calls the block with each remaining line read from the stream; - * does nothing if already at end-of-file; - * returns +self+. - * See {Line IO}[rdoc-ref:IO@Line+IO]. - */ -static VALUE -strio_each(int argc, VALUE *argv, VALUE self) -{ - VALUE line; - struct StringIO *ptr = readable(self); - struct getline_arg arg; - - RETURN_ENUMERATOR(self, argc, argv); - - if (prepare_getline_args(ptr, &arg, argc, argv)->limit == 0) { - rb_raise(rb_eArgError, "invalid limit: 0 for each_line"); - } - - while (!NIL_P(line = strio_getline(&arg, ptr))) { - rb_yield(line); - } - return self; -} - -/* - * call-seq: - * strio.readlines(sep=$/, chomp: false) -> array - * strio.readlines(limit, chomp: false) -> array - * strio.readlines(sep, limit, chomp: false) -> array - * - * See IO#readlines. - */ -static VALUE -strio_readlines(int argc, VALUE *argv, VALUE self) -{ - VALUE ary, line; - struct StringIO *ptr = readable(self); - struct getline_arg arg; - - if (prepare_getline_args(ptr, &arg, argc, argv)->limit == 0) { - rb_raise(rb_eArgError, "invalid limit: 0 for readlines"); - } - - ary = rb_ary_new(); - while (!NIL_P(line = strio_getline(&arg, ptr))) { - rb_ary_push(ary, line); - } - return ary; -} - -/* - * call-seq: - * strio.write(string, ...) -> integer - * strio.syswrite(string) -> integer - * - * Appends the given string to the underlying buffer string. - * The stream must be opened for writing. If the argument is not a - * string, it will be converted to a string using to_s. - * Returns the number of bytes written. See IO#write. - */ -static VALUE -strio_write_m(int argc, VALUE *argv, VALUE self) -{ - long len = 0; - while (argc-- > 0) { - /* StringIO can't exceed long limit */ - len += strio_write(self, *argv++); - } - return LONG2NUM(len); -} - -static long -strio_write(VALUE self, VALUE str) -{ - struct StringIO *ptr = writable(self); - long len, olen; - rb_encoding *enc, *enc2; - rb_encoding *const ascii8bit = rb_ascii8bit_encoding(); - rb_encoding *usascii = 0; - - if (!RB_TYPE_P(str, T_STRING)) - str = rb_obj_as_string(str); - enc = get_enc(ptr); - if (!enc) return 0; - enc2 = rb_enc_get(str); - if (enc != enc2 && enc != ascii8bit && enc != (usascii = rb_usascii_encoding())) { - VALUE converted = rb_str_conv_enc(str, enc2, enc); - if (converted == str && enc2 != ascii8bit && enc2 != usascii) { /* conversion failed */ - rb_enc_check(rb_enc_from_encoding(enc), str); - } - str = converted; - } - len = RSTRING_LEN(str); - if (len == 0) return 0; - check_modifiable(ptr); - olen = RSTRING_LEN(ptr->string); - if (ptr->flags & FMODE_APPEND) { - ptr->pos = olen; - } - if (ptr->pos == olen) { - if (enc == ascii8bit || enc2 == ascii8bit) { - rb_enc_str_buf_cat(ptr->string, RSTRING_PTR(str), len, enc); - } - else { - rb_str_buf_append(ptr->string, str); - } - } - else { - strio_extend(ptr, ptr->pos, len); - rb_str_modify(ptr->string); - memmove(RSTRING_PTR(ptr->string)+ptr->pos, RSTRING_PTR(str), len); - } - RB_GC_GUARD(str); - ptr->pos += len; - return len; -} - -/* - * call-seq: - * strio << obj -> strio - * - * See IO#<<. - */ -#define strio_addstr rb_io_addstr - -/* - * call-seq: - * strio.print() -> nil - * strio.print(obj, ...) -> nil - * - * See IO#print. - */ -#define strio_print rb_io_print - -/* - * call-seq: - * strio.printf(format_string [, obj, ...] ) -> nil - * - * See IO#printf. - */ -#define strio_printf rb_io_printf - -/* - * call-seq: - * strio.putc(obj) -> obj - * - * See IO#putc. - */ -static VALUE -strio_putc(VALUE self, VALUE ch) -{ - struct StringIO *ptr = writable(self); - VALUE str; - - check_modifiable(ptr); - if (RB_TYPE_P(ch, T_STRING)) { - if (NIL_P(ptr->string)) return ch; - str = rb_str_substr(ch, 0, 1); - } - else { - char c = NUM2CHR(ch); - if (NIL_P(ptr->string)) return ch; - str = rb_str_new(&c, 1); - } - strio_write(self, str); - return ch; -} - -/* - * call-seq: - * strio.puts(obj, ...) -> nil - * - * See IO#puts. - */ -#define strio_puts rb_io_puts - -/* - * call-seq: - * strio.read([length [, outbuf]]) -> string, outbuf, or nil - * - * See IO#read. - */ -static VALUE -strio_read(int argc, VALUE *argv, VALUE self) -{ - struct StringIO *ptr = readable(self); - VALUE str = Qnil; - long len; - int binary = 0; - - switch (argc) { - case 2: - str = argv[1]; - if (!NIL_P(str)) { - StringValue(str); - rb_str_modify(str); - } - /* fall through */ - case 1: - if (!NIL_P(argv[0])) { - len = NUM2LONG(argv[0]); - if (len < 0) { - rb_raise(rb_eArgError, "negative length %ld given", len); - } - if (len > 0 && - (NIL_P(ptr->string) || ptr->pos >= RSTRING_LEN(ptr->string))) { - if (!NIL_P(str)) rb_str_resize(str, 0); - return Qnil; - } - binary = 1; - break; - } - /* fall through */ - case 0: - if (NIL_P(ptr->string)) return Qnil; - len = RSTRING_LEN(ptr->string); - if (len <= ptr->pos) { - rb_encoding *enc = get_enc(ptr); - if (NIL_P(str)) { - str = rb_str_new(0, 0); - } - else { - rb_str_resize(str, 0); - } - rb_enc_associate(str, enc); - return str; - } - else { - len -= ptr->pos; - } - break; - default: - rb_error_arity(argc, 0, 2); - } - if (NIL_P(str)) { - rb_encoding *enc = binary ? rb_ascii8bit_encoding() : get_enc(ptr); - str = strio_substr(ptr, ptr->pos, len, enc); - } - else { - long rest = RSTRING_LEN(ptr->string) - ptr->pos; - if (len > rest) len = rest; - rb_str_resize(str, len); - MEMCPY(RSTRING_PTR(str), RSTRING_PTR(ptr->string) + ptr->pos, char, len); - if (!binary) { - rb_enc_copy(str, ptr->string); - } - } - ptr->pos += RSTRING_LEN(str); - return str; -} - -/* - * call-seq: - * pread(maxlen, offset) -> string - * pread(maxlen, offset, out_string) -> string - * - * See IO#pread. - */ -static VALUE -strio_pread(int argc, VALUE *argv, VALUE self) -{ - VALUE rb_len, rb_offset, rb_buf; - rb_scan_args(argc, argv, "21", &rb_len, &rb_offset, &rb_buf); - long len = NUM2LONG(rb_len); - long offset = NUM2LONG(rb_offset); - - if (len < 0) { - rb_raise(rb_eArgError, "negative string size (or size too big): %" PRIsVALUE, rb_len); - } - - if (len == 0) { - if (NIL_P(rb_buf)) { - return rb_str_new("", 0); - } - return rb_buf; - } - - if (offset < 0) { - rb_syserr_fail_str(EINVAL, rb_sprintf("pread: Invalid offset argument: %" PRIsVALUE, rb_offset)); - } - - struct StringIO *ptr = readable(self); - - if (offset >= RSTRING_LEN(ptr->string)) { - rb_eof_error(); - } - - if (NIL_P(rb_buf)) { - return strio_substr(ptr, offset, len, rb_ascii8bit_encoding()); - } - - long rest = RSTRING_LEN(ptr->string) - offset; - if (len > rest) len = rest; - rb_str_resize(rb_buf, len); - rb_enc_associate(rb_buf, rb_ascii8bit_encoding()); - MEMCPY(RSTRING_PTR(rb_buf), RSTRING_PTR(ptr->string) + offset, char, len); - return rb_buf; -} - - -/* - * call-seq: - * strio.sysread(integer[, outbuf]) -> string - * strio.readpartial(integer[, outbuf]) -> string - * - * Similar to #read, but raises +EOFError+ at end of string instead of - * returning +nil+, as well as IO#sysread does. - */ -static VALUE -strio_sysread(int argc, VALUE *argv, VALUE self) -{ - VALUE val = rb_funcallv_kw(self, rb_intern("read"), argc, argv, RB_PASS_CALLED_KEYWORDS); - if (NIL_P(val)) { - rb_eof_error(); - } - return val; -} - -/* - * call-seq: - * strio.read_nonblock(integer[, outbuf [, opts]]) -> string - * - * Similar to #read, but raises +EOFError+ at end of string unless the - * +exception: false+ option is passed in. - */ -static VALUE -strio_read_nonblock(int argc, VALUE *argv, VALUE self) -{ - VALUE opts = Qnil, val; - - rb_scan_args(argc, argv, "11:", NULL, NULL, &opts); - - if (!NIL_P(opts)) { - argc--; - } - - val = strio_read(argc, argv, self); - if (NIL_P(val)) { - if (!NIL_P(opts) && - rb_hash_lookup2(opts, sym_exception, Qundef) == Qfalse) - return Qnil; - else - rb_eof_error(); - } - - return val; -} - -/* - * See IO#write - */ -#define strio_syswrite rb_io_write - -/* - * See IO#write_nonblock - */ -static VALUE -strio_syswrite_nonblock(int argc, VALUE *argv, VALUE self) -{ - VALUE str; - - rb_scan_args(argc, argv, "10:", &str, NULL); - return strio_syswrite(self, str); -} - -#define strio_isatty strio_false - -#define strio_pid strio_nil - -#define strio_fileno strio_nil - -/* - * call-seq: - * strio.length -> integer - * strio.size -> integer - * - * Returns the size of the buffer string. - */ -static VALUE -strio_size(VALUE self) -{ - VALUE string = StringIO(self)->string; - if (NIL_P(string)) { - return INT2FIX(0); - } - return ULONG2NUM(RSTRING_LEN(string)); -} - -/* - * call-seq: - * strio.truncate(integer) -> 0 - * - * Truncates the buffer string to at most _integer_ bytes. The stream - * must be opened for writing. - */ -static VALUE -strio_truncate(VALUE self, VALUE len) -{ - VALUE string = writable(self)->string; - long l = NUM2LONG(len); - long plen; - if (l < 0) { - error_inval("negative length"); - } - if (NIL_P(string)) return 0; - plen = RSTRING_LEN(string); - rb_str_resize(string, l); - if (plen < l) { - MEMZERO(RSTRING_PTR(string) + plen, char, l - plen); - } - return INT2FIX(0); -} - -/* - * call-seq: - * strio.external_encoding => encoding - * - * Returns the Encoding object that represents the encoding of the file. - * If the stream is write mode and no encoding is specified, returns - * +nil+. - */ - -static VALUE -strio_external_encoding(VALUE self) -{ - struct StringIO *ptr = StringIO(self); - return rb_enc_from_encoding(get_enc(ptr)); -} - -/* - * call-seq: - * strio.internal_encoding => encoding - * - * Returns the Encoding of the internal string if conversion is - * specified. Otherwise returns +nil+. - */ - -static VALUE -strio_internal_encoding(VALUE self) -{ - return Qnil; -} - -/* - * call-seq: - * strio.set_encoding(ext_enc, [int_enc[, opt]]) => strio - * - * Specify the encoding of the StringIO as ext_enc. - * Use the default external encoding if ext_enc is nil. - * 2nd argument int_enc and optional hash opt argument - * are ignored; they are for API compatibility to IO. - */ - -static VALUE -strio_set_encoding(int argc, VALUE *argv, VALUE self) -{ - rb_encoding* enc; - struct StringIO *ptr = StringIO(self); - VALUE ext_enc, int_enc, opt; - - argc = rb_scan_args(argc, argv, "11:", &ext_enc, &int_enc, &opt); - - if (NIL_P(ext_enc)) { - enc = rb_default_external_encoding(); - } - else { - enc = rb_find_encoding(ext_enc); - if (!enc) { - rb_io_enc_t convconfig; - int oflags; - rb_io_mode_t fmode; - VALUE vmode = rb_str_append(rb_str_new_cstr("r:"), ext_enc); - rb_io_extract_modeenc(&vmode, 0, Qnil, &oflags, &fmode, &convconfig); - enc = convconfig.enc2; - } - } - ptr->enc = enc; - if (!NIL_P(ptr->string) && WRITABLE(self)) { - rb_enc_associate(ptr->string, enc); - } - - return self; -} - -/* - * call-seq: - * strio.set_encoding_by_bom => strio or nil - * - * Sets the encoding according to the BOM (Byte Order Mark) in the - * string. - * - * Returns +self+ if the BOM is found, otherwise +nil. - */ -static VALUE -strio_set_encoding_by_bom(VALUE self) -{ - struct StringIO *ptr = StringIO(self); - - if (!set_encoding_by_bom(ptr)) return Qnil; - return rb_enc_from_encoding(ptr->enc); -} - -/* - * \IO streams for strings, with access similar to - * {IO}[rdoc-ref:IO]; - * see {IO}[rdoc-ref:IO]. - * - * === About the Examples - * - * Examples on this page assume that \StringIO has been required: - * - * require 'stringio' - * - */ -void -Init_stringio(void) -{ -#undef rb_intern - -#ifdef HAVE_RB_EXT_RACTOR_SAFE - rb_ext_ractor_safe(true); -#endif - - VALUE StringIO = rb_define_class("StringIO", rb_cObject); - - /* The version string */ - rb_define_const(StringIO, "VERSION", rb_str_new_cstr(STRINGIO_VERSION)); - - rb_include_module(StringIO, rb_mEnumerable); - rb_define_alloc_func(StringIO, strio_s_allocate); - - /* Maximum length that a StringIO instance can hold */ - rb_define_const(StringIO, "MAX_LENGTH", LONG2NUM(LONG_MAX)); - - rb_define_singleton_method(StringIO, "new", strio_s_new, -1); - rb_define_singleton_method(StringIO, "open", strio_s_open, -1); - rb_define_method(StringIO, "initialize", strio_initialize, -1); - rb_define_method(StringIO, "initialize_copy", strio_copy, 1); - rb_define_method(StringIO, "reopen", strio_reopen, -1); - - rb_define_method(StringIO, "string", strio_get_string, 0); - rb_define_method(StringIO, "string=", strio_set_string, 1); - rb_define_method(StringIO, "lineno", strio_get_lineno, 0); - rb_define_method(StringIO, "lineno=", strio_set_lineno, 1); - - - /* call-seq: strio.binmode -> true */ - rb_define_method(StringIO, "binmode", strio_binmode, 0); - rb_define_method(StringIO, "close", strio_close, 0); - rb_define_method(StringIO, "close_read", strio_close_read, 0); - rb_define_method(StringIO, "close_write", strio_close_write, 0); - rb_define_method(StringIO, "closed?", strio_closed, 0); - rb_define_method(StringIO, "closed_read?", strio_closed_read, 0); - rb_define_method(StringIO, "closed_write?", strio_closed_write, 0); - rb_define_method(StringIO, "eof", strio_eof, 0); - rb_define_method(StringIO, "eof?", strio_eof, 0); - /* call-seq: strio.fcntl */ - rb_define_method(StringIO, "fcntl", strio_fcntl, -1); - /* call-seq: strio.flush -> strio */ - rb_define_method(StringIO, "flush", strio_flush, 0); - /* call-seq: strio.fsync -> 0 */ - rb_define_method(StringIO, "fsync", strio_fsync, 0); - rb_define_method(StringIO, "pos", strio_get_pos, 0); - rb_define_method(StringIO, "pos=", strio_set_pos, 1); - rb_define_method(StringIO, "rewind", strio_rewind, 0); - rb_define_method(StringIO, "seek", strio_seek, -1); - rb_define_method(StringIO, "sync", strio_get_sync, 0); - /* call-seq: strio.sync = boolean -> boolean */ - rb_define_method(StringIO, "sync=", strio_set_sync, 1); - rb_define_method(StringIO, "tell", strio_tell, 0); - - rb_define_method(StringIO, "each", strio_each, -1); - rb_define_method(StringIO, "each_line", strio_each, -1); - rb_define_method(StringIO, "each_byte", strio_each_byte, 0); - rb_define_method(StringIO, "each_char", strio_each_char, 0); - rb_define_method(StringIO, "each_codepoint", strio_each_codepoint, 0); - rb_define_method(StringIO, "getc", strio_getc, 0); - rb_define_method(StringIO, "ungetc", strio_ungetc, 1); - rb_define_method(StringIO, "ungetbyte", strio_ungetbyte, 1); - rb_define_method(StringIO, "getbyte", strio_getbyte, 0); - rb_define_method(StringIO, "gets", strio_gets, -1); - rb_define_method(StringIO, "readlines", strio_readlines, -1); - rb_define_method(StringIO, "read", strio_read, -1); - rb_define_method(StringIO, "pread", strio_pread, -1); - - rb_define_method(StringIO, "write", strio_write_m, -1); - rb_define_method(StringIO, "putc", strio_putc, 1); - - /* - * call-seq: - * strio.isatty -> nil - * strio.tty? -> nil - * - */ - rb_define_method(StringIO, "isatty", strio_isatty, 0); - rb_define_method(StringIO, "tty?", strio_isatty, 0); - - /* call-seq: strio.pid -> nil */ - rb_define_method(StringIO, "pid", strio_pid, 0); - - /* call-seq: strio.fileno -> nil */ - rb_define_method(StringIO, "fileno", strio_fileno, 0); - rb_define_method(StringIO, "size", strio_size, 0); - rb_define_method(StringIO, "length", strio_size, 0); - rb_define_method(StringIO, "truncate", strio_truncate, 1); - - rb_define_method(StringIO, "external_encoding", strio_external_encoding, 0); - rb_define_method(StringIO, "internal_encoding", strio_internal_encoding, 0); - rb_define_method(StringIO, "set_encoding", strio_set_encoding, -1); - rb_define_method(StringIO, "set_encoding_by_bom", strio_set_encoding_by_bom, 0); - - { - VALUE mReadable = rb_define_module_under(rb_cIO, "generic_readable"); - rb_define_method(mReadable, "readchar", strio_readchar, 0); - rb_define_method(mReadable, "readbyte", strio_readbyte, 0); - rb_define_method(mReadable, "readline", strio_readline, -1); - rb_define_method(mReadable, "sysread", strio_sysread, -1); - rb_define_method(mReadable, "readpartial", strio_sysread, -1); - rb_define_method(mReadable, "read_nonblock", strio_read_nonblock, -1); - rb_include_module(StringIO, mReadable); - } - { - VALUE mWritable = rb_define_module_under(rb_cIO, "generic_writable"); - rb_define_method(mWritable, "<<", strio_addstr, 1); - rb_define_method(mWritable, "print", strio_print, -1); - rb_define_method(mWritable, "printf", strio_printf, -1); - rb_define_method(mWritable, "puts", strio_puts, -1); - rb_define_method(mWritable, "syswrite", strio_syswrite, 1); - rb_define_method(mWritable, "write_nonblock", strio_syswrite_nonblock, -1); - rb_include_module(StringIO, mWritable); - } - - sym_exception = ID2SYM(rb_intern("exception")); -} diff --git a/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/lib/stringio.so b/vendor/bundle/ruby/3.2.0/gems/stringio-3.1.7/lib/stringio.so deleted file mode 100755 index eecb41c3329131ef8d9789e11c6a5abbfd341155..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184552 zcmeFa33OD&@;`njlVlPSm_R~ESO*A8WHAAP35z5^;0{b6vWW|XkcC7-5|bGgWr-wF z#&IyX`&=ISo<3ZjFHcc%!?5G>6cH6gB_hHdFVO1l^`_IJorXbG%;4e5}1D!538i-i71!Qs#?9RoauhKJDee@-S0I zQR0Y*K5@Jts|mG1@NE!$da3Ac5oHu-Q%Fa;wg`N1X%lpM8O*m|@CBDCf=@504f@Rf z%31vXroDW@xA`tEC%7yYdg!Iz-WA}}UBx;7`?qkXGE1} zNKU5^`g9K=e+is=AvxPZ$XSYZI|q1@1JpmZ3*di4yBDH&hG;iB1ioVke{Kum&(sij z4LV-P-fKd%`$Gu-yFuUY0`@Km(eB+L{QpS^yf1{D1tIj=6ar6U&~^bm{}Mv~p&{t6 z3ZYLL zL(tC+fj<$#Z~qCQe@h7Ze}s@f3G^2lcRz%XKP7}+Ux)Dj$PoCMA@J`4e<6K(govxV zLfHF32z#Gl?RHY~SAhVZTP?g)3JR7itEw!hbr#k*3ksA1`<%Rj;*y$@CFQlwlA1Yr zlPanzOXd_Vt|;Mk7p^HNT3J|7T3%ULQGP>-QsY{@s$gYlO$lxn7c40%SXNlGlx}Nk z>AR$|s9;HnQ@^cs))W*~q0Pd|C5(aU30YaPg7k8h7ZE987Q0FdiVB?tg|$WH<%BG+ zgp!pb=oS(SmaZtQS;E>_TC!?IRZVfhlJeyxl?ByAP*he@w3Nh@S1u`VuBv8j32=E~ zg^R&ug|%e`#V*D`dK9~sEnCI;D_zS*z!^(OR!L1wRZT%*O}TRw19NJY75?Kz!UExu3c4&&NaFWCc~U+lEb2U84y*h zo#K+kt|bU*9#EAo5LP=`bEP$f%SsBIW#zTZIV85cctq{0W!zrZGQ_&Gss`#5tSEPu z73hkgdqylS=K%)4m68u+-Ed#9Y;jRV3F~))Xxvm+QMU>tSqfj2m#%_&)rFNTh*+0k zco5C9l4V8JtEgC3wY-GNT0Runn95vS4!=n5a7j9mn4mFPjltwB4e}esC`0*mA*i%` z

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

i0 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 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "changelog_uri" => "https://github.com/ruby/date/releases" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Tadayoshi Funaba".freeze] - s.date = "2024-12-02" - s.description = "A subclass of Object includes Comparable module for handling dates.".freeze - s.email = [nil] - s.extensions = ["ext/date/extconf.rb".freeze] - s.files = ["ext/date/extconf.rb".freeze] - s.homepage = "https://github.com/ruby/date".freeze - s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.6.0".freeze) - s.rubygems_version = "3.4.20".freeze - s.summary = "A subclass of Object includes Comparable module for handling dates.".freeze - - s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version -end diff --git a/vendor/bundle/ruby/3.2.0/specifications/diff-lcs-1.6.2.gemspec b/vendor/bundle/ruby/3.2.0/specifications/diff-lcs-1.6.2.gemspec deleted file mode 100644 index 7574737..0000000 --- a/vendor/bundle/ruby/3.2.0/specifications/diff-lcs-1.6.2.gemspec +++ /dev/null @@ -1,35 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: diff-lcs 1.6.2 ruby lib - -Gem::Specification.new do |s| - s.name = "diff-lcs".freeze - s.version = "1.6.2" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/halostatue/diff-lcs/issues", "changelog_uri" => "https://github.com/halostatue/diff-lcs/blob/main/CHANGELOG.md", "homepage_uri" => "https://github.com/halostatue/diff-lcs", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/halostatue/diff-lcs" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Austin Ziegler".freeze] - s.date = "2025-05-12" - s.description = "Diff::LCS computes the difference between two Enumerable sequences using the\nMcIlroy-Hunt longest common subsequence (LCS) algorithm. It includes utilities\nto create a simple HTML diff output format and a standard diff-like tool.\n\nThis is release 1.6.1, providing a simple extension that allows for\nDiff::LCS::Change objects to be treated implicitly as arrays and fixes a number\nof formatting issues.\n\nRuby versions below 2.5 are soft-deprecated, which means that older versions are\nno longer part of the CI test suite. If any changes have been introduced that\nbreak those versions, bug reports and patches will be accepted, but it will be\nup to the reporter to verify any fixes prior to release. The next major release\nwill completely break compatibility.".freeze - s.email = ["halostatue@gmail.com".freeze] - s.executables = ["htmldiff".freeze, "ldiff".freeze] - s.extra_rdoc_files = ["CHANGELOG.md".freeze, "CODE_OF_CONDUCT.md".freeze, "CONTRIBUTING.md".freeze, "CONTRIBUTORS.md".freeze, "LICENCE.md".freeze, "Manifest.txt".freeze, "README.md".freeze, "SECURITY.md".freeze, "docs/COPYING.txt".freeze, "docs/artistic.txt".freeze] - s.files = ["CHANGELOG.md".freeze, "CODE_OF_CONDUCT.md".freeze, "CONTRIBUTING.md".freeze, "CONTRIBUTORS.md".freeze, "LICENCE.md".freeze, "Manifest.txt".freeze, "README.md".freeze, "SECURITY.md".freeze, "bin/htmldiff".freeze, "bin/ldiff".freeze, "docs/COPYING.txt".freeze, "docs/artistic.txt".freeze] - s.homepage = "https://github.com/halostatue/diff-lcs".freeze - s.licenses = ["MIT".freeze, "Artistic-1.0-Perl".freeze, "GPL-2.0-or-later".freeze] - s.rdoc_options = ["--main".freeze, "README.md".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 1.8".freeze) - s.rubygems_version = "3.4.20".freeze - s.summary = "Diff::LCS computes the difference between two Enumerable sequences using the McIlroy-Hunt longest common subsequence (LCS) algorithm".freeze - - s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version - - s.specification_version = 4 - - s.add_development_dependency(%q.freeze, ["~> 4.0"]) - s.add_development_dependency(%q.freeze, ["~> 2.0"]) - s.add_development_dependency(%q.freeze, ["~> 1.0"]) - s.add_development_dependency(%q.freeze, [">= 2.0", "< 4"]) - s.add_development_dependency(%q.freeze, [">= 10.0", "< 14"]) - s.add_development_dependency(%q.freeze, [">= 6.3.1", "< 7"]) -end diff --git a/vendor/bundle/ruby/3.2.0/specifications/erb-5.0.2.gemspec b/vendor/bundle/ruby/3.2.0/specifications/erb-5.0.2.gemspec deleted file mode 100644 index 03bb8a4..0000000 --- a/vendor/bundle/ruby/3.2.0/specifications/erb-5.0.2.gemspec +++ /dev/null @@ -1,27 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: erb 5.0.2 ruby lib -# stub: ext/erb/escape/extconf.rb - -Gem::Specification.new do |s| - s.name = "erb".freeze - s.version = "5.0.2" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "homepage_uri" => "https://github.com/ruby/erb", "source_code_uri" => "https://github.com/ruby/erb" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Masatoshi SEKI".freeze, "Takashi Kokubun".freeze] - s.bindir = "libexec".freeze - s.date = "1980-01-02" - s.description = "An easy to use but powerful templating system for Ruby.".freeze - s.email = ["seki@ruby-lang.org".freeze, "k0kubun@ruby-lang.org".freeze] - s.executables = ["erb".freeze] - s.extensions = ["ext/erb/escape/extconf.rb".freeze] - s.files = ["ext/erb/escape/extconf.rb".freeze, "libexec/erb".freeze] - s.homepage = "https://github.com/ruby/erb".freeze - s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 3.2.0".freeze) - s.rubygems_version = "3.4.20".freeze - s.summary = "An easy to use but powerful templating system for Ruby.".freeze - - s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version -end diff --git a/vendor/bundle/ruby/3.2.0/specifications/nio4r-2.7.4.gemspec b/vendor/bundle/ruby/3.2.0/specifications/nio4r-2.7.4.gemspec deleted file mode 100644 index affcb8b..0000000 --- a/vendor/bundle/ruby/3.2.0/specifications/nio4r-2.7.4.gemspec +++ /dev/null @@ -1,24 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: nio4r 2.7.4 ruby lib -# stub: ext/nio4r/extconf.rb - -Gem::Specification.new do |s| - s.name = "nio4r".freeze - s.version = "2.7.4" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/socketry/nio4r/issues", "changelog_uri" => "https://github.com/socketry/nio4r/blob/main/changes.md", "documentation_uri" => "https://www.rubydoc.info/gems/nio4r", "funding_uri" => "https://github.com/sponsors/ioquatix/", "source_code_uri" => "https://github.com/socketry/nio4r.git", "wiki_uri" => "https://github.com/socketry/nio4r/wiki" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Tony Arcieri".freeze, "Samuel Williams".freeze, "Olle Jonsson".freeze, "Gregory Longtin".freeze, "Tiago Cardoso".freeze, "Joao Fernandes".freeze, "Thomas Dziedzic".freeze, "Boaz Segev".freeze, "Logan Bowers".freeze, "Pedro Paiva".freeze, "Jun Aruga".freeze, "Omer Katz".freeze, "Upekshe Jayasekera".freeze, "Tim Carey-Smith".freeze, "Benoit Daloze".freeze, "Sergey Avseyev".freeze, "Tomoya Ishida".freeze, "Usaku Nakamura".freeze, "C\u00E9dric Boutillier".freeze, "Daniel Berger".freeze, "Dirkjan Bussink".freeze, "Hiroshi Shibata".freeze, "Jes\u00FAs Burgos Maci\u00E1".freeze, "Luis Lavena".freeze, "Pavel Rosick\u00FD".freeze, "Sadayuki Furuhashi".freeze, "Stephen von Takach".freeze, "Vladimir Kochnev".freeze, "V\u00EDt Ondruch".freeze, "Anatol Pomozov".freeze, "Bernd Ahlers".freeze, "Charles Oliver Nutter".freeze, "Denis Washington".freeze, "Elad Eyal".freeze, "Jean byroot Boussier".freeze, "Jeffrey Martin".freeze, "John Thornton".freeze, "Jun Jiang".freeze, "Lars Kanis".freeze, "Marek Kowalcze".freeze, "Maxime Demolin".freeze, "Orien Madgwick".freeze, "Pavel Lobashov".freeze, "Per Lundberg".freeze, "Phillip Aldridge".freeze, "Ravil Bayramgalin".freeze, "Shannon Skipper".freeze, "Tao Luo".freeze, "Thomas Kuntz".freeze, "Tsimnuj Hawj".freeze, "Zhang Kang".freeze] - s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIE2DCCA0CgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMRgwFgYDVQQDDA9zYW11\nZWwud2lsbGlhbXMxHTAbBgoJkiaJk/IsZAEZFg1vcmlvbnRyYW5zZmVyMRIwEAYK\nCZImiZPyLGQBGRYCY28xEjAQBgoJkiaJk/IsZAEZFgJuejAeFw0yMjA4MDYwNDUz\nMjRaFw0zMjA4MDMwNDUzMjRaMGExGDAWBgNVBAMMD3NhbXVlbC53aWxsaWFtczEd\nMBsGCgmSJomT8ixkARkWDW9yaW9udHJhbnNmZXIxEjAQBgoJkiaJk/IsZAEZFgJj\nbzESMBAGCgmSJomT8ixkARkWAm56MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB\nigKCAYEAomvSopQXQ24+9DBB6I6jxRI2auu3VVb4nOjmmHq7XWM4u3HL+pni63X2\n9qZdoq9xt7H+RPbwL28LDpDNflYQXoOhoVhQ37Pjn9YDjl8/4/9xa9+NUpl9XDIW\nsGkaOY0eqsQm1pEWkHJr3zn/fxoKPZPfaJOglovdxf7dgsHz67Xgd/ka+Wo1YqoE\ne5AUKRwUuvaUaumAKgPH+4E4oiLXI4T1Ff5Q7xxv6yXvHuYtlMHhYfgNn8iiW8WN\nXibYXPNP7NtieSQqwR/xM6IRSoyXKuS+ZNGDPUUGk8RoiV/xvVN4LrVm9upSc0ss\nRZ6qwOQmXCo/lLcDUxJAgG95cPw//sI00tZan75VgsGzSWAOdjQpFM0l4dxvKwHn\ntUeT3ZsAgt0JnGqNm2Bkz81kG4A2hSyFZTFA8vZGhp+hz+8Q573tAR89y9YJBdYM\nzp0FM4zwMNEUwgfRzv1tEVVUEXmoFCyhzonUUw4nE4CFu/sE3ffhjKcXcY//qiSW\nxm4erY3XAgMBAAGjgZowgZcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O\nBBYEFO9t7XWuFf2SKLmuijgqR4sGDlRsMC4GA1UdEQQnMCWBI3NhbXVlbC53aWxs\naWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MC4GA1UdEgQnMCWBI3NhbXVlbC53aWxs\naWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MA0GCSqGSIb3DQEBCwUAA4IBgQB5sxkE\ncBsSYwK6fYpM+hA5B5yZY2+L0Z+27jF1pWGgbhPH8/FjjBLVn+VFok3CDpRqwXCl\nxCO40JEkKdznNy2avOMra6PFiQyOE74kCtv7P+Fdc+FhgqI5lMon6tt9rNeXmnW/\nc1NaMRdxy999hmRGzUSFjozcCwxpy/LwabxtdXwXgSay4mQ32EDjqR1TixS1+smp\n8C/NCWgpIfzpHGJsjvmH2wAfKtTTqB9CVKLCWEnCHyCaRVuKkrKjqhYCdmMBqCws\nJkxfQWC+jBVeG9ZtPhQgZpfhvh+6hMhraUYRQ6XGyvBqEUe+yo6DKIT3MtGE2+CP\neX9i9ZWBydWb8/rvmwmX2kkcBbX0hZS1rcR593hGc61JR6lvkGYQ2MYskBveyaxt\nQ2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8\nvoD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=\n-----END CERTIFICATE-----\n".freeze] - s.date = "2024-10-28" - s.extensions = ["ext/nio4r/extconf.rb".freeze] - s.files = ["ext/nio4r/extconf.rb".freeze] - s.homepage = "https://github.com/socketry/nio4r".freeze - s.licenses = ["MIT".freeze, "BSD-2-Clause".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.6".freeze) - s.rubygems_version = "3.4.20".freeze - s.summary = "New IO for Ruby".freeze - - s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version -end diff --git a/vendor/bundle/ruby/3.2.0/specifications/psych-5.2.6.gemspec b/vendor/bundle/ruby/3.2.0/specifications/psych-5.2.6.gemspec deleted file mode 100644 index 625b3d1..0000000 --- a/vendor/bundle/ruby/3.2.0/specifications/psych-5.2.6.gemspec +++ /dev/null @@ -1,32 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: psych 5.2.6 ruby lib -# stub: ext/psych/extconf.rb - -Gem::Specification.new do |s| - s.name = "psych".freeze - s.version = "5.2.6" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "changelog_uri" => "https://github.com/ruby/psych/releases", "msys2_mingw_dependencies" => "libyaml" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Aaron Patterson".freeze, "SHIBATA Hiroshi".freeze, "Charles Oliver Nutter".freeze] - s.date = "2025-05-12" - s.description = "Psych is a YAML parser and emitter. Psych leverages libyaml[https://pyyaml.org/wiki/LibYAML]\nfor its YAML parsing and emitting capabilities. In addition to wrapping libyaml,\nPsych also knows how to serialize and de-serialize most Ruby objects to and from the YAML format.\n".freeze - s.email = ["aaron@tenderlovemaking.com".freeze, "hsbt@ruby-lang.org".freeze, "headius@headius.com".freeze] - s.extensions = ["ext/psych/extconf.rb".freeze] - s.extra_rdoc_files = ["README.md".freeze] - s.files = ["README.md".freeze, "ext/psych/extconf.rb".freeze] - s.homepage = "https://github.com/ruby/psych".freeze - s.licenses = ["MIT".freeze] - s.rdoc_options = ["--main".freeze, "README.md".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze) - s.rubygems_version = "3.4.20".freeze - s.summary = "Psych is a YAML parser and emitter".freeze - - s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version - - s.specification_version = 4 - - s.add_runtime_dependency(%q.freeze, [">= 0"]) - s.add_runtime_dependency(%q.freeze, [">= 0"]) -end diff --git a/vendor/bundle/ruby/3.2.0/specifications/puma-6.6.1.gemspec b/vendor/bundle/ruby/3.2.0/specifications/puma-6.6.1.gemspec deleted file mode 100644 index 08b0ee1..0000000 --- a/vendor/bundle/ruby/3.2.0/specifications/puma-6.6.1.gemspec +++ /dev/null @@ -1,30 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: puma 6.6.1 ruby lib -# stub: ext/puma_http11/extconf.rb - -Gem::Specification.new do |s| - s.name = "puma".freeze - s.version = "6.6.1" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/puma/puma/issues", "changelog_uri" => "https://github.com/puma/puma/blob/master/History.md", "homepage_uri" => "https://puma.io/", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/puma/puma" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Evan Phoenix".freeze] - s.date = "1980-01-02" - s.description = "Puma is a simple, fast, multi-threaded, and highly parallel HTTP 1.1 server\nfor Ruby/Rack applications. Puma is intended for use in both development and\nproduction environments. It's great for highly parallel Ruby implementations such as\nJRuby and TruffleRuby as well as as providing process worker support to support CRuby well.\n".freeze - s.email = ["evan@phx.io".freeze] - s.executables = ["puma".freeze, "pumactl".freeze] - s.extensions = ["ext/puma_http11/extconf.rb".freeze] - s.files = ["bin/puma".freeze, "bin/pumactl".freeze, "ext/puma_http11/extconf.rb".freeze] - s.homepage = "https://puma.io/".freeze - s.licenses = ["BSD-3-Clause".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.4".freeze) - s.rubygems_version = "3.4.20".freeze - s.summary = "A Ruby/Rack web server built for parallelism.".freeze - - s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version - - s.specification_version = 4 - - s.add_runtime_dependency(%q.freeze, ["~> 2.0"]) -end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rack-3.2.0.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rack-3.2.0.gemspec deleted file mode 100644 index 27654a2..0000000 --- a/vendor/bundle/ruby/3.2.0/specifications/rack-3.2.0.gemspec +++ /dev/null @@ -1,31 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: rack 3.2.0 ruby lib - -Gem::Specification.new do |s| - s.name = "rack".freeze - s.version = "3.2.0" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/rack/rack/issues", "changelog_uri" => "https://github.com/rack/rack/blob/main/CHANGELOG.md", "documentation_uri" => "https://rubydoc.info/github/rack/rack", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/rack/rack" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Leah Neukirchen".freeze] - s.date = "1980-01-02" - s.description = "Rack provides a minimal, modular and adaptable interface for developing\nweb applications in Ruby. By wrapping HTTP requests and responses in\nthe simplest way possible, it unifies and distills the API for web\nservers, web frameworks, and software in between (the so-called\nmiddleware) into a single method call.\n".freeze - s.email = "leah@vuxu.org".freeze - s.extra_rdoc_files = ["CHANGELOG.md".freeze, "CONTRIBUTING.md".freeze, "README.md".freeze] - s.files = ["CHANGELOG.md".freeze, "CONTRIBUTING.md".freeze, "README.md".freeze] - s.homepage = "https://github.com/rack/rack".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.4.0".freeze) - s.rubygems_version = "3.4.20".freeze - s.summary = "A modular Ruby webserver interface.".freeze - - s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version - - s.specification_version = 4 - - s.add_development_dependency(%q.freeze, ["~> 5.0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) -end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rack-test-2.2.0.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rack-test-2.2.0.gemspec deleted file mode 100644 index 9a5921f..0000000 --- a/vendor/bundle/ruby/3.2.0/specifications/rack-test-2.2.0.gemspec +++ /dev/null @@ -1,29 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: rack-test 2.2.0 ruby lib - -Gem::Specification.new do |s| - s.name = "rack-test".freeze - s.version = "2.2.0" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/rack/rack-test/issues", "changelog_uri" => "https://github.com/rack/rack-test/blob/main/History.md", "mailing_list_uri" => "https://github.com/rack/rack-test/discussions", "source_code_uri" => "https://github.com/rack/rack-test" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Jeremy Evans".freeze, "Bryan Helmkamp".freeze] - s.date = "2024-12-23" - s.description = "Rack::Test is a small, simple testing API for Rack apps. It can be used on its\nown or as a reusable starting point for Web frameworks and testing libraries\nto build on.".freeze - s.email = ["code@jeremyevans.net".freeze, "bryan@brynary.com".freeze] - s.homepage = "https://github.com/rack/rack-test".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze) - s.rubygems_version = "3.4.20".freeze - s.summary = "Simple testing API built on Rack".freeze - - s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version - - s.specification_version = 4 - - s.add_runtime_dependency(%q.freeze, [">= 1.3"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 5.0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) -end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rackup-2.2.1.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rackup-2.2.1.gemspec deleted file mode 100644 index 9ecb93a..0000000 --- a/vendor/bundle/ruby/3.2.0/specifications/rackup-2.2.1.gemspec +++ /dev/null @@ -1,26 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: rackup 2.2.1 ruby lib - -Gem::Specification.new do |s| - s.name = "rackup".freeze - s.version = "2.2.1" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/rack/rackup.git" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Samuel Williams".freeze, "James Tucker".freeze, "Leah Neukirchen".freeze, "Jeremy Evans".freeze, "Joshua Peek".freeze, "Megan Batty".freeze, "Rafael Fran\u00E7a".freeze, "Anurag Priyam".freeze, "Max Cantor".freeze, "Michael Fellinger".freeze, "Sophie Deziel".freeze, "Yoshiyuki Hirano".freeze, "Aaron Patterson".freeze, "Jean Boussier".freeze, "Katsuhiko Yoshida".freeze, "Konstantin Haase".freeze, "Krzysztof Rybka".freeze, "Martin Hrdlicka".freeze, "Nick LaMuro".freeze, "Aaron Pfeifer".freeze, "Akira Matsuda".freeze, "Andrew Bortz".freeze, "Andrew Hoglund".freeze, "Bas Vodde".freeze, "Blake Mizerany".freeze, "Carl Lerche".freeze, "David Celis".freeze, "Dillon Welch".freeze, "Genki Takiuchi".freeze, "Geremia Taglialatela".freeze, "Hal Brodigan".freeze, "Hrvoje \u0160imi\u0107".freeze, "Igor Bochkariov".freeze, "Jeremy Kemper".freeze, "Joe Fiorini".freeze, "John Barnette".freeze, "John Sumsion".freeze, "Julik Tarkhanov".freeze, "Kang Sheng".freeze, "Kazuya Hotta".freeze, "Lenny Marks".freeze, "Loren Segal".freeze, "Marc-Andr\u00E9 Cournoyer".freeze, "Misaki Shioi".freeze, "Olle Jonsson".freeze, "Peter Wilmott".freeze, "Petrik de Heus".freeze, "Richard Schneeman".freeze, "Ryunosuke Sato".freeze, "Sean McGivern".freeze, "Stephen Paul Weber".freeze, "Tadashi Saito".freeze, "Tim Moore".freeze, "Timur Batyrshin".freeze, "Trevor Wennblom".freeze, "Tsutomu Kuroda".freeze, "Uchio Kondo".freeze, "Wyatt Pan".freeze, "Yehuda Katz".freeze, "Zachary Scott".freeze] - s.date = "2024-11-13" - s.executables = ["rackup".freeze] - s.files = ["bin/rackup".freeze] - s.homepage = "https://github.com/rack/rackup".freeze - s.licenses = ["MIT".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.5".freeze) - s.rubygems_version = "3.4.20".freeze - s.summary = "A general server command for Rack applications.".freeze - - s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version - - s.specification_version = 4 - - s.add_runtime_dependency(%q.freeze, [">= 3"]) -end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rdoc-6.14.2.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rdoc-6.14.2.gemspec deleted file mode 100644 index 8a77787..0000000 --- a/vendor/bundle/ruby/3.2.0/specifications/rdoc-6.14.2.gemspec +++ /dev/null @@ -1,32 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: rdoc 6.14.2 ruby lib - -Gem::Specification.new do |s| - s.name = "rdoc".freeze - s.version = "6.14.2" - - s.required_rubygems_version = Gem::Requirement.new(">= 2.2".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "changelog_uri" => "https://github.com/ruby/rdoc/releases", "homepage_uri" => "https://ruby.github.io/rdoc", "source_code_uri" => "https://github.com/ruby/rdoc" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Eric Hodel".freeze, "Dave Thomas".freeze, "Phil Hagelberg".freeze, "Tony Strauss".freeze, "Zachary Scott".freeze, "Hiroshi SHIBATA".freeze, "ITOYANAGI Sakura".freeze] - s.bindir = "exe".freeze - s.date = "2025-07-03" - s.description = "RDoc produces HTML and command-line documentation for Ruby projects.\nRDoc includes the +rdoc+ and +ri+ tools for generating and displaying documentation from the command-line.\n".freeze - s.email = ["drbrain@segment7.net".freeze, "".freeze, "".freeze, "".freeze, "mail@zzak.io".freeze, "hsbt@ruby-lang.org".freeze, "aycabta@gmail.com".freeze] - s.executables = ["rdoc".freeze, "ri".freeze] - s.extra_rdoc_files = ["CONTRIBUTING.rdoc".freeze, "CVE-2013-0256.rdoc".freeze, "ExampleMarkdown.md".freeze, "ExampleRDoc.rdoc".freeze, "History.rdoc".freeze, "LEGAL.rdoc".freeze, "LICENSE.rdoc".freeze, "README.rdoc".freeze, "RI.md".freeze, "TODO.rdoc".freeze] - s.files = ["CONTRIBUTING.rdoc".freeze, "CVE-2013-0256.rdoc".freeze, "ExampleMarkdown.md".freeze, "ExampleRDoc.rdoc".freeze, "History.rdoc".freeze, "LEGAL.rdoc".freeze, "LICENSE.rdoc".freeze, "README.rdoc".freeze, "RI.md".freeze, "TODO.rdoc".freeze, "exe/rdoc".freeze, "exe/ri".freeze] - s.homepage = "https://ruby.github.io/rdoc".freeze - s.licenses = ["Ruby".freeze] - s.rdoc_options = ["--main".freeze, "README.rdoc".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.6.0".freeze) - s.rubygems_version = "3.4.20".freeze - s.summary = "RDoc produces HTML and command-line documentation for Ruby projects".freeze - - s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version - - s.specification_version = 4 - - s.add_runtime_dependency(%q.freeze, [">= 4.0.0"]) - s.add_runtime_dependency(%q.freeze, [">= 0"]) -end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rspec-3.13.1.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rspec-3.13.1.gemspec deleted file mode 100644 index 363069a..0000000 --- a/vendor/bundle/ruby/3.2.0/specifications/rspec-3.13.1.gemspec +++ /dev/null @@ -1,31 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: rspec 3.13.1 ruby lib - -Gem::Specification.new do |s| - s.name = "rspec".freeze - s.version = "3.13.1" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/rspec/rspec/issues", "documentation_uri" => "https://rspec.info/documentation/", "mailing_list_uri" => "https://groups.google.com/forum/#!forum/rspec", "source_code_uri" => "https://github.com/rspec/rspec/blob/rspec-metagem-v3.13.1/rspec" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Steven Baker".freeze, "David Chelimsky".freeze, "Myron Marston".freeze] - s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIFvjCCA6agAwIBAgIJAPXjfUbCjdXVMA0GCSqGSIb3DQEBCwUAMIGAMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO\nMAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B\nCQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMjUwMjA2MTE0NjU2WhcNMjYw\nMjA2MTE0NjU2WjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x\nEDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl\nYy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI\nKMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C\ne/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0\ntQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc\n6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo\nmLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ\nefLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO\ns3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7\nXeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK\nblXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC\ngpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u\n2FUsqZbbJcCmkBrGposCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw\nHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMA0GCSqGSIb3DQEBCwUAA4IC\nAQBGBr0ll2yLrkO6IeK5Q7qZFnANaUCKfi6Of9VztZJXgKAU5KAQxyOidGktoA5N\nlp+bFKudRkW8jSehqoNaNBdSZ9Bc07EGMXIhUFJZF9rq7Z2SKPwUm6EaSsBK13QR\nU4K6wuaw5ZJSFzklapoGOJRGnFlnNtlhNFY6+tTwCeblwZbcuYGyGY8+Rg7GbyVl\n3Tr4Gi1aS/qG/MDXKdE8HWm39dmaAMdbw6dg1VBd0JrX2VqH7xvE1dM/D3OlKrNp\ngNFRNJig3Y8qPjocZR0cGkhgZoC9wribWxHSNawZm4CoV3fja2HNx9QyM7BaB+as\nyuqAiBbA7vBcyc8nKATip3mxbyXYXoDD7nmO8JCPP7O/WsgG+U/B2a0kPdvYFoxE\nQ0Js3GtFCuMvL+0rifqdxBOLtu0Pw9q4RvToTJIl2IR6eTgCb82B1hw9qKf7PjuL\nBoEsYjjDhGw6FZvcJG8O6uj7aB+z4aF21YR74UGL7sq/RIPNNez5JI95jTGfqCPy\n6yo0w3zja3yg28QK3Fj+tbOHeSLv9SDQWi/1jiPprGzbxGvbVvjvX11YZc46vkmY\nAwP+qZPPf97FXXZGEGIYhhHpnj+Ltx9nCetRPiZ4rvYBcXgCWVQSg6eiEofrMwn/\nAKMCABhZ1Y2eATsfMgdkmIZk7JIPZiSi6eUxPiCMP9M/pw==\n-----END CERTIFICATE-----\n".freeze] - s.date = "1980-01-02" - s.description = "BDD for Ruby".freeze - s.email = "rspec@googlegroups.com".freeze - s.extra_rdoc_files = ["README.md".freeze] - s.files = ["README.md".freeze] - s.homepage = "https://rspec.info/".freeze - s.licenses = ["MIT".freeze] - s.rdoc_options = ["--charset=UTF-8".freeze] - s.rubygems_version = "3.4.20".freeze - s.summary = "rspec-3.13.1".freeze - - s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version - - s.specification_version = 4 - - s.add_runtime_dependency(%q.freeze, ["~> 3.13.0"]) - s.add_runtime_dependency(%q.freeze, ["~> 3.13.0"]) - s.add_runtime_dependency(%q.freeze, ["~> 3.13.0"]) -end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rspec-core-3.13.5.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rspec-core-3.13.5.gemspec deleted file mode 100644 index f567eea..0000000 --- a/vendor/bundle/ruby/3.2.0/specifications/rspec-core-3.13.5.gemspec +++ /dev/null @@ -1,31 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: rspec-core 3.13.5 ruby lib - -Gem::Specification.new do |s| - s.name = "rspec-core".freeze - s.version = "3.13.5" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/rspec/rspec/issues", "changelog_uri" => "https://github.com/rspec/rspec/blob/rspec-core-v3.13.5/rspec-core/Changelog.md", "documentation_uri" => "https://rspec.info/documentation/", "mailing_list_uri" => "https://groups.google.com/forum/#!forum/rspec", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/rspec/rspec/blob/rspec-core-v3.13.5/rspec-core" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Steven Baker".freeze, "David Chelimsky".freeze, "Chad Humphries".freeze, "Myron Marston".freeze] - s.bindir = "exe".freeze - s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIFvjCCA6agAwIBAgIJAPXjfUbCjdXVMA0GCSqGSIb3DQEBCwUAMIGAMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO\nMAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B\nCQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMjUwMjA2MTE0NjU2WhcNMjYw\nMjA2MTE0NjU2WjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x\nEDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl\nYy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI\nKMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C\ne/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0\ntQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc\n6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo\nmLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ\nefLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO\ns3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7\nXeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK\nblXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC\ngpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u\n2FUsqZbbJcCmkBrGposCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw\nHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMA0GCSqGSIb3DQEBCwUAA4IC\nAQBGBr0ll2yLrkO6IeK5Q7qZFnANaUCKfi6Of9VztZJXgKAU5KAQxyOidGktoA5N\nlp+bFKudRkW8jSehqoNaNBdSZ9Bc07EGMXIhUFJZF9rq7Z2SKPwUm6EaSsBK13QR\nU4K6wuaw5ZJSFzklapoGOJRGnFlnNtlhNFY6+tTwCeblwZbcuYGyGY8+Rg7GbyVl\n3Tr4Gi1aS/qG/MDXKdE8HWm39dmaAMdbw6dg1VBd0JrX2VqH7xvE1dM/D3OlKrNp\ngNFRNJig3Y8qPjocZR0cGkhgZoC9wribWxHSNawZm4CoV3fja2HNx9QyM7BaB+as\nyuqAiBbA7vBcyc8nKATip3mxbyXYXoDD7nmO8JCPP7O/WsgG+U/B2a0kPdvYFoxE\nQ0Js3GtFCuMvL+0rifqdxBOLtu0Pw9q4RvToTJIl2IR6eTgCb82B1hw9qKf7PjuL\nBoEsYjjDhGw6FZvcJG8O6uj7aB+z4aF21YR74UGL7sq/RIPNNez5JI95jTGfqCPy\n6yo0w3zja3yg28QK3Fj+tbOHeSLv9SDQWi/1jiPprGzbxGvbVvjvX11YZc46vkmY\nAwP+qZPPf97FXXZGEGIYhhHpnj+Ltx9nCetRPiZ4rvYBcXgCWVQSg6eiEofrMwn/\nAKMCABhZ1Y2eATsfMgdkmIZk7JIPZiSi6eUxPiCMP9M/pw==\n-----END CERTIFICATE-----\n".freeze] - s.date = "1980-01-02" - s.description = "BDD for Ruby. RSpec runner and example groups.".freeze - s.email = "rspec@googlegroups.com".freeze - s.executables = ["rspec".freeze] - s.files = ["exe/rspec".freeze] - s.homepage = "https://rspec.info/".freeze - s.licenses = ["MIT".freeze] - s.rdoc_options = ["--charset=UTF-8".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 1.8.7".freeze) - s.rubygems_version = "3.4.20".freeze - s.summary = "rspec-core-3.13.5".freeze - - s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version - - s.specification_version = 4 - - s.add_runtime_dependency(%q.freeze, ["~> 3.13.0"]) -end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rspec-expectations-3.13.5.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rspec-expectations-3.13.5.gemspec deleted file mode 100644 index 780aba2..0000000 --- a/vendor/bundle/ruby/3.2.0/specifications/rspec-expectations-3.13.5.gemspec +++ /dev/null @@ -1,29 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: rspec-expectations 3.13.5 ruby lib - -Gem::Specification.new do |s| - s.name = "rspec-expectations".freeze - s.version = "3.13.5" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/rspec/rspec/issues", "changelog_uri" => "https://github.com/rspec/rspec/blob/rspec-expectations-v3.13.5/rspec-expectations/Changelog.md", "documentation_uri" => "https://rspec.info/documentation/", "mailing_list_uri" => "https://groups.google.com/forum/#!forum/rspec", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/rspec/rspec/blob/rspec-expectations-v3.13.5/rspec-expectations" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Steven Baker".freeze, "David Chelimsky".freeze, "Myron Marston".freeze] - s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIFvjCCA6agAwIBAgIJAPXjfUbCjdXVMA0GCSqGSIb3DQEBCwUAMIGAMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO\nMAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B\nCQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMjUwMjA2MTE0NjU2WhcNMjYw\nMjA2MTE0NjU2WjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x\nEDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl\nYy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI\nKMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C\ne/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0\ntQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc\n6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo\nmLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ\nefLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO\ns3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7\nXeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK\nblXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC\ngpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u\n2FUsqZbbJcCmkBrGposCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw\nHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMA0GCSqGSIb3DQEBCwUAA4IC\nAQBGBr0ll2yLrkO6IeK5Q7qZFnANaUCKfi6Of9VztZJXgKAU5KAQxyOidGktoA5N\nlp+bFKudRkW8jSehqoNaNBdSZ9Bc07EGMXIhUFJZF9rq7Z2SKPwUm6EaSsBK13QR\nU4K6wuaw5ZJSFzklapoGOJRGnFlnNtlhNFY6+tTwCeblwZbcuYGyGY8+Rg7GbyVl\n3Tr4Gi1aS/qG/MDXKdE8HWm39dmaAMdbw6dg1VBd0JrX2VqH7xvE1dM/D3OlKrNp\ngNFRNJig3Y8qPjocZR0cGkhgZoC9wribWxHSNawZm4CoV3fja2HNx9QyM7BaB+as\nyuqAiBbA7vBcyc8nKATip3mxbyXYXoDD7nmO8JCPP7O/WsgG+U/B2a0kPdvYFoxE\nQ0Js3GtFCuMvL+0rifqdxBOLtu0Pw9q4RvToTJIl2IR6eTgCb82B1hw9qKf7PjuL\nBoEsYjjDhGw6FZvcJG8O6uj7aB+z4aF21YR74UGL7sq/RIPNNez5JI95jTGfqCPy\n6yo0w3zja3yg28QK3Fj+tbOHeSLv9SDQWi/1jiPprGzbxGvbVvjvX11YZc46vkmY\nAwP+qZPPf97FXXZGEGIYhhHpnj+Ltx9nCetRPiZ4rvYBcXgCWVQSg6eiEofrMwn/\nAKMCABhZ1Y2eATsfMgdkmIZk7JIPZiSi6eUxPiCMP9M/pw==\n-----END CERTIFICATE-----\n".freeze] - s.date = "1980-01-02" - s.description = "rspec-expectations provides a simple, readable API to express expected outcomes of a code example.".freeze - s.email = "rspec@googlegroups.com".freeze - s.homepage = "https://rspec.info/".freeze - s.licenses = ["MIT".freeze] - s.rdoc_options = ["--charset=UTF-8".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 1.8.7".freeze) - s.rubygems_version = "3.4.20".freeze - s.summary = "rspec-expectations-3.13.5".freeze - - s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version - - s.specification_version = 4 - - s.add_runtime_dependency(%q.freeze, ["~> 3.13.0"]) - s.add_runtime_dependency(%q.freeze, [">= 1.2.0", "< 2.0"]) -end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rspec-mocks-3.13.5.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rspec-mocks-3.13.5.gemspec deleted file mode 100644 index 80f38ca..0000000 --- a/vendor/bundle/ruby/3.2.0/specifications/rspec-mocks-3.13.5.gemspec +++ /dev/null @@ -1,29 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: rspec-mocks 3.13.5 ruby lib - -Gem::Specification.new do |s| - s.name = "rspec-mocks".freeze - s.version = "3.13.5" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/rspec/rspec/issues", "changelog_uri" => "https://github.com/rspec/rspec/blob/rspec-mocks-v3.13.5/rspec-mocks/Changelog.md", "documentation_uri" => "https://rspec.info/documentation/", "mailing_list_uri" => "https://groups.google.com/forum/#!forum/rspec", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/rspec/rspec/blob/rspec-mocks-v3.13.5/rspec-mocks" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Steven Baker".freeze, "David Chelimsky".freeze, "Myron Marston".freeze] - s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIFvjCCA6agAwIBAgIJAPXjfUbCjdXVMA0GCSqGSIb3DQEBCwUAMIGAMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO\nMAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B\nCQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMjUwMjA2MTE0NjU2WhcNMjYw\nMjA2MTE0NjU2WjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x\nEDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl\nYy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI\nKMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C\ne/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0\ntQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc\n6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo\nmLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ\nefLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO\ns3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7\nXeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK\nblXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC\ngpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u\n2FUsqZbbJcCmkBrGposCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw\nHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMA0GCSqGSIb3DQEBCwUAA4IC\nAQBGBr0ll2yLrkO6IeK5Q7qZFnANaUCKfi6Of9VztZJXgKAU5KAQxyOidGktoA5N\nlp+bFKudRkW8jSehqoNaNBdSZ9Bc07EGMXIhUFJZF9rq7Z2SKPwUm6EaSsBK13QR\nU4K6wuaw5ZJSFzklapoGOJRGnFlnNtlhNFY6+tTwCeblwZbcuYGyGY8+Rg7GbyVl\n3Tr4Gi1aS/qG/MDXKdE8HWm39dmaAMdbw6dg1VBd0JrX2VqH7xvE1dM/D3OlKrNp\ngNFRNJig3Y8qPjocZR0cGkhgZoC9wribWxHSNawZm4CoV3fja2HNx9QyM7BaB+as\nyuqAiBbA7vBcyc8nKATip3mxbyXYXoDD7nmO8JCPP7O/WsgG+U/B2a0kPdvYFoxE\nQ0Js3GtFCuMvL+0rifqdxBOLtu0Pw9q4RvToTJIl2IR6eTgCb82B1hw9qKf7PjuL\nBoEsYjjDhGw6FZvcJG8O6uj7aB+z4aF21YR74UGL7sq/RIPNNez5JI95jTGfqCPy\n6yo0w3zja3yg28QK3Fj+tbOHeSLv9SDQWi/1jiPprGzbxGvbVvjvX11YZc46vkmY\nAwP+qZPPf97FXXZGEGIYhhHpnj+Ltx9nCetRPiZ4rvYBcXgCWVQSg6eiEofrMwn/\nAKMCABhZ1Y2eATsfMgdkmIZk7JIPZiSi6eUxPiCMP9M/pw==\n-----END CERTIFICATE-----\n".freeze] - s.date = "1980-01-02" - s.description = "RSpec's 'test double' framework, with support for stubbing and mocking".freeze - s.email = "rspec@googlegroups.com".freeze - s.homepage = "https://rspec.info/".freeze - s.licenses = ["MIT".freeze] - s.rdoc_options = ["--charset=UTF-8".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 1.8.7".freeze) - s.rubygems_version = "3.4.20".freeze - s.summary = "rspec-mocks-3.13.5".freeze - - s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version - - s.specification_version = 4 - - s.add_runtime_dependency(%q.freeze, ["~> 3.13.0"]) - s.add_runtime_dependency(%q.freeze, [">= 1.2.0", "< 2.0"]) -end diff --git a/vendor/bundle/ruby/3.2.0/specifications/rspec-support-3.13.5.gemspec b/vendor/bundle/ruby/3.2.0/specifications/rspec-support-3.13.5.gemspec deleted file mode 100644 index c0236fd..0000000 --- a/vendor/bundle/ruby/3.2.0/specifications/rspec-support-3.13.5.gemspec +++ /dev/null @@ -1,29 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: rspec-support 3.13.5 ruby lib - -Gem::Specification.new do |s| - s.name = "rspec-support".freeze - s.version = "3.13.5" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "bug_tracker_uri" => "https://github.com/rspec/rspec/issues", "changelog_uri" => "https://github.com/rspec/rspec/blob/rspec-support-v3.13.5/rspec-support/Changelog.md", "documentation_uri" => "https://rspec.info/documentation/", "mailing_list_uri" => "https://groups.google.com/forum/#!forum/rspec", "rubygems_mfa_required" => "true", "source_code_uri" => "https://github.com/rspec/rspec/blob/rspec-support-v3.13.5/rspec-support" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["David Chelimsky".freeze, "Myron Marson".freeze, "Jon Rowe".freeze, "Sam Phippen".freeze, "Xaviery Shay".freeze, "Bradley Schaefer".freeze] - s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIFvjCCA6agAwIBAgIJAPXjfUbCjdXVMA0GCSqGSIb3DQEBCwUAMIGAMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEO\nMAwGA1UECgwFUlNwZWMxEzARBgNVBAMMCnJzcGVjLmluZm8xJTAjBgkqhkiG9w0B\nCQEWFnJzcGVjQGdvb2dsZWdyb3Vwcy5jb20wHhcNMjUwMjA2MTE0NjU2WhcNMjYw\nMjA2MTE0NjU2WjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x\nEDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBVJTcGVjMRMwEQYDVQQDDApyc3Bl\nYy5pbmZvMSUwIwYJKoZIhvcNAQkBFhZyc3BlY0Bnb29nbGVncm91cHMuY29tMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsSmjgcHaKlD0jizRJowi2bGI\nKMOHnJoExxRNHHxH+3w9kkl95YldvDRVX495b13ZCzwRe0AyqX24wq04tp0G5Z5C\ne/w2pnNK4ol1eECPwQu+YGpepeODlZICL5gwQspe0cDifbBnHx5QySMiPpvx6bC0\ntQTox0ppDIaMhch8IPCwyoE4DQK5bpsdwnLSHTsQjUIb7IM8tUMpd/iKrJgNffwc\n6gC1TmhIlzQoB26nCNh9uK7xZjUM+sGECzvcYuImchUaIgJA/ybrlZS+m/hxzvBo\nmLnn/xNEC6Vz5HG+3TR0Gb0cSUf6XUu2s51Jk/SJi3MhCZp2gs9OUg4EVZNzQVkZ\nefLBjAZG2Mxk14JyB4/Omc+Jk0ajprINCBbUNnxzCJrYDM3J9TVWIwyUGNX/U3MO\ns3tMAT+EVgx/mZMPnBO8EULlyF51MRUp3Wy9Mnw8AYLk30UnMG5AjqgO5JNyFlA7\nXeh3EVdWY3vMB1pkhPwlsenpcmj5gOzrd54lELOVbCGHCf48iSqeflY2Lhe0pvzK\nblXCJBDmtrebvus291rM/dHcbEfK1SVd5Wut/n131iouf6dnNCFskFygDcgBbthC\ngpEMqf80lEmhX59VUsm0Pv6OEo+ZPHBvXPiJA6DShQh9t3YtpwyA8uVDMbT/i32u\n2FUsqZbbJcCmkBrGposCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw\nHQYDVR0OBBYEFPPvQ5XT0Nvuhi6k+hrWVv35J+TeMA0GCSqGSIb3DQEBCwUAA4IC\nAQBGBr0ll2yLrkO6IeK5Q7qZFnANaUCKfi6Of9VztZJXgKAU5KAQxyOidGktoA5N\nlp+bFKudRkW8jSehqoNaNBdSZ9Bc07EGMXIhUFJZF9rq7Z2SKPwUm6EaSsBK13QR\nU4K6wuaw5ZJSFzklapoGOJRGnFlnNtlhNFY6+tTwCeblwZbcuYGyGY8+Rg7GbyVl\n3Tr4Gi1aS/qG/MDXKdE8HWm39dmaAMdbw6dg1VBd0JrX2VqH7xvE1dM/D3OlKrNp\ngNFRNJig3Y8qPjocZR0cGkhgZoC9wribWxHSNawZm4CoV3fja2HNx9QyM7BaB+as\nyuqAiBbA7vBcyc8nKATip3mxbyXYXoDD7nmO8JCPP7O/WsgG+U/B2a0kPdvYFoxE\nQ0Js3GtFCuMvL+0rifqdxBOLtu0Pw9q4RvToTJIl2IR6eTgCb82B1hw9qKf7PjuL\nBoEsYjjDhGw6FZvcJG8O6uj7aB+z4aF21YR74UGL7sq/RIPNNez5JI95jTGfqCPy\n6yo0w3zja3yg28QK3Fj+tbOHeSLv9SDQWi/1jiPprGzbxGvbVvjvX11YZc46vkmY\nAwP+qZPPf97FXXZGEGIYhhHpnj+Ltx9nCetRPiZ4rvYBcXgCWVQSg6eiEofrMwn/\nAKMCABhZ1Y2eATsfMgdkmIZk7JIPZiSi6eUxPiCMP9M/pw==\n-----END CERTIFICATE-----\n".freeze] - s.date = "1980-01-02" - s.description = "Support utilities for RSpec gems".freeze - s.email = "rspec-users@rubyforge.org".freeze - s.homepage = "https://rspec.info/".freeze - s.licenses = ["MIT".freeze] - s.rdoc_options = ["--charset=UTF-8".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 1.8.7".freeze) - s.rubygems_version = "3.4.20".freeze - s.summary = "rspec-support-3.13.5".freeze - - s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version - - s.specification_version = 4 - - s.add_development_dependency(%q.freeze, ["> 10.0.0"]) - s.add_development_dependency(%q.freeze, ["~> 1.1.0"]) -end diff --git a/vendor/bundle/ruby/3.2.0/specifications/stringio-3.1.7.gemspec b/vendor/bundle/ruby/3.2.0/specifications/stringio-3.1.7.gemspec deleted file mode 100644 index 9ab3bb6..0000000 --- a/vendor/bundle/ruby/3.2.0/specifications/stringio-3.1.7.gemspec +++ /dev/null @@ -1,26 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: stringio 3.1.7 ruby lib -# stub: ext/stringio/extconf.rb - -Gem::Specification.new do |s| - s.name = "stringio".freeze - s.version = "3.1.7" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.metadata = { "changelog_uri" => "https://github.com/ruby/stringio/releases/tag/v3.1.7" } if s.respond_to? :metadata= - s.require_paths = ["lib".freeze] - s.authors = ["Nobu Nakada".freeze, "Charles Oliver Nutter".freeze] - s.date = "2025-04-21" - s.description = "Pseudo `IO` class from/to `String`.".freeze - s.email = ["nobu@ruby-lang.org".freeze, "headius@headius.com".freeze] - s.extensions = ["ext/stringio/extconf.rb".freeze] - s.extra_rdoc_files = [".document".freeze, ".rdoc_options".freeze, "COPYING".freeze, "LICENSE.txt".freeze, "NEWS.md".freeze, "README.md".freeze, "docs/io.rb".freeze, "ext/stringio/.document".freeze] - s.files = [".document".freeze, ".rdoc_options".freeze, "COPYING".freeze, "LICENSE.txt".freeze, "NEWS.md".freeze, "README.md".freeze, "docs/io.rb".freeze, "ext/stringio/.document".freeze, "ext/stringio/extconf.rb".freeze] - s.homepage = "https://github.com/ruby/stringio".freeze - s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.7".freeze) - s.rubygems_version = "3.4.20".freeze - s.summary = "Pseudo IO on String".freeze - - s.installed_by_version = "3.4.20" if s.respond_to? :installed_by_version -end

+d4 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 1.9`. - - Resolves [#63][issue-63]. - -## 1.4.2 / 2020-06-23 - -- Camille Drapier fixed a small issue with RuboCop configuration. [#59][pull-59] - -- Applied another fix (and unit test) to fix an issue for the Chef team. - [#60][issue-60], [#61][pull-61] - -## 1.4.1 / 2020-06-23 - -- Fix an issue where diff sizes could be negative, and they should be. - [#57][issue-57], [#58][pull-58] - -## 1.4 / 2020-06-23 - -- Ruby versions lower than 2.4 are soft-deprecated and will not be run as part - of the CI process any longer. - -- Akinora MUSHA (knu) added the ability for `Diff::LCS::Change` objects to be - implicitly treated arrays. Originally provided as pull request [#47][pull-47], - but it introduced a number of test failures as documented in [#48][issue-48], - and remediation of `Diff::LCS` itself was introduced in [#49][pull-49]. - -- Resolved [#5][issue-05] with some tests comparing output from `system` calls - to `bin/ldiff` with some pre-generated output. Resolved [#6][issue-06] with - these tests. - -- Resolved a previously undetected `bin/ldiff` issue with `--context` output not - matching `diff --context` output. - -- Resolved an issue with later versions of Ruby not working with an `OptParse` - specification of `Numeric`; this has been changed to `Integer`. - -- Brandon Fish added TruffleRuby in [#52][pull-52]. - -- Fixed two missing classes as reported in [#53][issue-53]. - -## 1.3 / 2017-01-18 - -- Bugs fixed: - - - Fixed an error for `bin/ldiff --version`. Fixes issue [#21][issue-21]. - - - Force `Diff::LCS::Change` and `Diff::LCS::ContextChange` to only perform - equality comparisons against themselves. Provided by Kevin Mook in pull - request [#29][pull-29]. - - - Fix tab expansion in `htmldiff`, provided by Mark Friedgan in pull request - [#25][pull-25]. - - - Silence Ruby 2.4 `Fixnum` deprecation warnings. Fixes issue [#38][issue-38] - and pull request [#36][pull-36]. - - - Ensure that test dependencies are loaded properly. Fixes issue - [#33][issue-33] and pull request [#34][pull-34]. - - - Fix issue [#1][issue-01] with incorrect intuition of patch direction. - Tentative fix, but the previous failure cases pass now. - -- Tooling changes: - - - Added SimpleCov and Coveralls support. - - - Change the homepage (temporarily) to the GitHub repo. - - - Updated testing and gem infrastructure. - - - Modernized the specs. - -- Cleaned up documentation. - -- Added a Code of Conduct. - -## 1.2.5 / 2013-11-08 - -- Bugs fixed: - - - Comparing arrays flattened them too far, especially with `Diff::LCS.sdiff`. - Fixed by Josh Bronson in pull request [#23][pull-23]. - -## 1.2.4 / 2013-04-20 - -- Bugs fixed: - - - A bug was introduced after 1.1.3 when pruning common sequences at the start - of comparison. Paul Kunysch (@pck) fixed this in pull request - [#18][pull-18]. Thanks! - - - The Rubinius (1.9 mode) bug in [rubinius/rubinius#2268][rubinius#2268] has - been fixed by the Rubinius team two days after it was filed. Thanks for - fixing this so quickly! - -- Switching to Raggi's hoe-gemspec2 for gemspec generation. - -## 1.2.3 / 2013-04-11 - -- Bugs Fixed: - - - The new encoding detection for diff output generation (added in 1.2.2) - introduced a bug if the left side of the comparison was the empty set. - Originally found in [rspec/rspec-expectations#238][rspec-expectations#238] - and [rspec/rspec-expectations#239][rspec-expectations#239]. Jon Rowe - developed a reasonable heuristic (left side, right side, empty string - literal) to avoid this bug. - - - There is a known issue with Rubinius in 1.9 mode reported in - [rubinius/rubinius#2268][rubinius#2268] and demonstrated in the Travis CI - builds. For all other tested platforms, diff-lcs is considered stable. As - soon as a suitably small test-case can be created for the Rubinius team to - examine, this will be added to the Rubinius issue around this. - -## 1.2.2 / 2013-03-30 - -- Bugs Fixed: - - - `Diff::LCS::Hunk` could not properly generate a difference for comparison - sets that are not US-ASCII-compatible because of the use of literal regular - expressions and strings. Jon Rowe found this in - [rspec/rspec-expectations#219][rspec-expectations#219] and provided a first - pass implementation in pull request [#15][pull-15]. I've reworked it because - of test failures in Rubinius when running in Ruby 1.9 mode. This coerces the - added values to the encoding of the old dataset (as determined by the first - piece of the old dataset). - - - Adding Travis CI testing for Ruby 2.0. - -## 1.2.1 / 2013-02-09 - -- Bugs Fixed: - - - As seen in [rspec/rspec-expectations#200][rspec-expectations#200], the - release of `Diff::LCS` 1.2 introduced an unnecessary public API change to - `Diff::LCS::Hunk` (see the change at - [rspec/rspec-expectations@3d6fc82c][rspec-expectations@3d6fc82c] for - details). The new method name (and behaviour) is more correct, but I should - not have renamed the function or should have at least provided an alias. - This release restores `Diff::LCS::Hunk#unshift` as an alias to #merge. Note - that the old `#unshift` behaviour was incorrect and will not be restored. - -## 1.2.0 / 2013-01-21 - -- Minor Enhancements: - - - Added special case handling for `Diff::LCS.patch` so that it handles patches - that are empty or contain no changes. - - - Added two new methods (`#patch_me` and `#unpatch_me`) to the include-able - module. - -- Bugs Fixed: - - - Fixed issue [#1][issue-01] patch direction detection. - - - Resolved issue [#2][issue-02] by handling `string[string.size, 1]` properly - (it returns `""` not `nil`). - - - Michael Granger (ged) fixed an implementation error in `Diff::LCS::Change` - and added specs in pull request [#8][pull-08]. Thanks! - - - Made the code auto-testable. - - - Vít Ondruch (voxik) provided the latest version of the GPL2 license file in - pull request [#10][pull-10]. Thanks! - - - Fixed a documentation issue with the include-able versions of `#patch!` and - `#unpatch!` where they implied that they would replace the original value. - Given that `Diff::LCS.patch` always returns a copy, the documentation was - incorrect and has been corrected. To provide the behaviour that was - originally documented, two new methods were added to provide this behaviour. - Found by scooter-dangle in issue [#12][issue-12]. Thanks! - -- Code Style Changes: - - - Removed trailing spaces. - - - Calling class methods using `.` instead of `::`. - - - Vít Ondruch (voxik) removed unnecessary shebangs in pull request - [#9][pull-09]. Thanks! - - - Kenichi Kamiya (kachick) removed some warnings of an unused variable in - lucky pull request [#13][pull-13]. Thanks! - - - Embarked on a major refactoring to make the files a little more manageable - and understand the code on a deeper level. - - - Adding CI via Travis CI. - -## 1.1.3 / 2011-08-27 - -- Converted to 'hoe' for release. - -- Converted tests to RSpec 2. - -- Extracted the body of `htmldiff` into a class available from - `diff/lcs/htmldiff`. - -- Migrated development and issue tracking to GitHub. - -- Bugs fixed: - - - Eliminated the explicit use of RubyGems in both `bin/htmldiff` and - `bin/ldiff`. Resolves issue [#4][issue-04]. - - - Eliminated Ruby warnings. Resolves issue [#3][issue-03]. - -## 1.1.2 / 2004-10-20 - -- Fixed a problem reported by Mauricio Fernandez in `htmldiff`. - -## 1.1.1 / 2004-09-25 - -- Fixed bug #891 (Set returned from patch command does not contain last equal - part). - -- Fixed a problem with callback initialisation code (it assumed that all - callbacks passed as classes can be initialised; now, it rescues NoMethodError - in the event of private :new being called). - -- Modified the non-initialisable callbacks to have a private `#new` method. - -- Moved `ldiff` core code to `Diff::LCS::Ldiff` (`diff/lcs/ldiff.rb`). - -## 1.1.0 - -- Eliminated the need for `Diff::LCS::Event` and removed it. - -- Added a contextual diff callback, `Diff::LCS::ContextDiffCallback`. - -- Implemented (un-)patching for standard diff callback output formats with both - `#diff` and `#sdiff`. - -- Extensive documentation changes. - -## 1.0.4 - -- Fixed a problem with `bin/ldiff` output, especially for unified format. - Newlines that should have been present weren't. - -- Changed the `.tar.gz` installer to generate Windows batch files if ones do not - exist already. Removed the existing batch files as they didn't work. - -## 1.0.3 - -- Fixed a problem with `#traverse_sequences` where the first difference from the - left sequence might not be appropriately captured. - -## 1.0.2 - -- Fixed an issue with `ldiff` not working because actions were changed from - symbols to strings. - -## 1.0.1 - -- Minor modifications to the `gemspec`, the `README`. - -- Renamed the diff program to `ldiff` (as well as the companion batch file) so - as to not collide with the standard diff program. - -- Fixed issues with RubyGems. Requires RubyGems > 0.6.1 or >= 0.6.1 with the - latest CVS version. - -## 1.0 - -- Initial release based mostly on Perl's Algorithm::Diff. - -[age]: https://github.com/FiloSottile/age -[hoe-halostatue]: https://github.com/halostatue/hoe-halostatue -[hoe-markdown]: https://github.com/flavorjones/hoe-markdown -[issue-01]: https://github.com/halostatue/diff-lcs/issues/1 -[issue-02]: https://github.com/halostatue/diff-lcs/issues/2 -[issue-03]: https://github.com/halostatue/diff-lcs/issues/3 -[issue-04]: https://github.com/halostatue/diff-lcs/issues/4 -[issue-05]: https://github.com/halostatue/diff-lcs/issues/5 -[issue-06]: https://github.com/halostatue/diff-lcs/issues/6 -[issue-12]: https://github.com/halostatue/diff-lcs/issues/12 -[issue-21]: https://github.com/halostatue/diff-lcs/issues/21 -[issue-33]: https://github.com/halostatue/diff-lcs/issues/33 -[issue-35]: https://github.com/halostatue/diff-lcs/issues/35 -[issue-38]: https://github.com/halostatue/diff-lcs/issues/38 -[issue-43]: https://github.com/halostatue/diff-lcs/issues/43 -[issue-44]: https://github.com/halostatue/diff-lcs/issues/44 -[issue-46]: https://github.com/halostatue/diff-lcs/issues/46 -[issue-48]: https://github.com/halostatue/diff-lcs/issues/48 -[issue-53]: https://github.com/halostatue/diff-lcs/issues/53 -[issue-57]: https://github.com/halostatue/diff-lcs/issues/57 -[issue-60]: https://github.com/halostatue/diff-lcs/issues/60 -[issue-63]: https://github.com/halostatue/diff-lcs/issues/63 -[issue-65]: https://github.com/halostatue/diff-lcs/issues/65 -[issue-70]: https://github.com/halostatue/diff-lcs/issues/70 -[issue-91]: https://github.com/halostatue/diff-lcs/issues/91 -[issue-95]: https://github.com/halostatue/diff-lcs/issues/95 -[issue-100]: https://github.com/halostatue/diff-lcs/issues/100 -[issue-102]: https://github.com/halostatue/diff-lcs/issues/102 -[issue-106]: https://github.com/halostatue/diff-lcs/issues/106 -[issue-107]: https://github.com/halostatue/diff-lcs/issues/107 -[pull-08]: https://github.com/halostatue/diff-lcs/pull/8 -[pull-09]: https://github.com/halostatue/diff-lcs/pull/9 -[pull-10]: https://github.com/halostatue/diff-lcs/pull/10 -[pull-13]: https://github.com/halostatue/diff-lcs/pull/13 -[pull-15]: https://github.com/halostatue/diff-lcs/pull/15 -[pull-18]: https://github.com/halostatue/diff-lcs/pull/18 -[pull-23]: https://github.com/halostatue/diff-lcs/pull/23 -[pull-25]: https://github.com/halostatue/diff-lcs/pull/25 -[pull-29]: https://github.com/halostatue/diff-lcs/pull/29 -[pull-34]: https://github.com/halostatue/diff-lcs/pull/34 -[pull-36]: https://github.com/halostatue/diff-lcs/pull/36 -[pull-47]: https://github.com/halostatue/diff-lcs/pull/47 -[pull-49]: https://github.com/halostatue/diff-lcs/pull/49 -[pull-52]: https://github.com/halostatue/diff-lcs/pull/52 -[pull-58]: https://github.com/halostatue/diff-lcs/pull/58 -[pull-59]: https://github.com/halostatue/diff-lcs/pull/59 -[pull-61]: https://github.com/halostatue/diff-lcs/pull/61 -[pull-69]: https://github.com/halostatue/diff-lcs/pull/69 -[pull-71]: https://github.com/halostatue/diff-lcs/pull/71 -[pull-72]: https://github.com/halostatue/diff-lcs/pull/72 -[pull-73]: https://github.com/halostatue/diff-lcs/pull/73 -[pull-75]: https://github.com/halostatue/diff-lcs/pull/75 -[pull-79]: https://github.com/halostatue/diff-lcs/pull/79 -[pull-80]: https://github.com/halostatue/diff-lcs/pull/80 -[pull-82]: https://github.com/halostatue/diff-lcs/pull/82 -[pull-84]: https://github.com/halostatue/diff-lcs/pull/84 -[pull-86]: https://github.com/halostatue/diff-lcs/pull/86 -[pull-89]: https://github.com/halostatue/diff-lcs/pull/89 -[pull-90]: https://github.com/halostatue/diff-lcs/pull/90 -[pull-92]: https://github.com/halostatue/diff-lcs/pull/92 -[pull-93]: https://github.com/halostatue/diff-lcs/pull/93 -[pull-101]: https://github.com/halostatue/diff-lcs/pull/101 -[pull-103]: https://github.com/halostatue/diff-lcs/pull/103 -[pull-104]: https://github.com/halostatue/diff-lcs/pull/104 -[pull-105]: https://github.com/halostatue/diff-lcs/pull/105 -[pull-129]: https://github.com/halostatue/diff-lcs/pull/129 -[pull-147]: https://github.com/halostatue/diff-lcs/pull/147 -[pull-148]: https://github.com/halostatue/diff-lcs/pull/148 -[rspec-expectations#200]: https://github.com/rspec/rspec-expectations/pull/200 -[rspec-expectations#219]: https://github.com/rspec/rspec-expectations/issues/219 -[rspec-expectations#238]: https://github.com/rspec/rspec-expectations/issues/238 -[rspec-expectations#239]: https://github.com/rspec/rspec-expectations/issues/239 -[rspec-expectations@3d6fc82c]: https://github.com/rspec/rspec-expectations/commit/3d6fc82c -[rubinius#2268]: https://github.com/rubinius/rubinius/issues/2268 -[standard ruby]: https://github.com/standardrb/standard -[tidelift]: https://tidelift.com/security -[tp]: https://guides.rubygems.org/trusted-publishing/ diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CODE_OF_CONDUCT.md b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CODE_OF_CONDUCT.md deleted file mode 100644 index 184b5fb..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,128 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, caste, color, religion, or sexual -identity and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -- Demonstrating empathy and kindness toward other people -- Being respectful of differing opinions, viewpoints, and experiences -- Giving and gracefully accepting constructive feedback -- Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -- Focusing on what is best not just for us as individuals, but for the overall - community - -Examples of unacceptable behavior include: - -- The use of sexualized language or imagery, and sexual attention or advances of - any kind -- Trolling, insulting or derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or email address, - without their explicit permission -- Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official email address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at [INSERT CONTACT -METHOD]. All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series of -actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or permanent -ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within the -community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.1, available at -. - -Community Impact Guidelines were inspired by -[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. - -For answers to common questions about this code of conduct, see the FAQ at -. Translations are available at -. - -[homepage]: https://www.contributor-covenant.org -[Mozilla CoC]: https://github.com/mozilla/diversity diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTING.md b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTING.md deleted file mode 100644 index 4bcde4b..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTING.md +++ /dev/null @@ -1,71 +0,0 @@ -# Contributing - -Contribution to diff-lcs is encouraged in any form: a bug report, a feature -request, or code contributions. There are a few DOs and DON'Ts for -contributions. - -- DO: - - - Keep the coding style that already exists for any updated Ruby code (support - or otherwise). I use [Standard Ruby][standardrb] for linting and formatting. - - - Use thoughtfully-named topic branches for contributions. Rebase your commits - into logical chunks as necessary. - - - Use [quality commit messages][qcm]. - - - Add your name or GitHub handle to `CONTRIBUTORS.md` and a record in the - `CHANGELOG.md` as a separate commit from your main change. (Follow the style - in the `CHANGELOG.md` and provide a link to your PR.) - - - Add or update tests as appropriate for your change. The test suite is - written in [RSpec][rspec]. - - - Add or update documentation as appropriate for your change. The - documentation is RDoc; diff-lcs does not use extensions that may be present - in alternative documentation generators. - -- DO NOT: - - - Modify `VERSION` in `lib/diff/lcs/version.rb`. When your patch is accepted - and a release is made, the version will be updated at that point. - - - Modify `diff-lcs.gemspec`; it is a generated file. (You _may_ use - `rake gemspec` to regenerate it if your change involves metadata related to - gem itself). - - - Modify the `Gemfile`. - -## Test Dependencies - -diff-lcs uses Ryan Davis's [Hoe][Hoe] to manage the release process, and it adds -a number of rake tasks. You will mostly be interested in `rake`, which runs -tests in the same way that `rake spec` does. - -To assist with the installation of the development dependencies for diff-lcs, I -have provided a Gemfile pointing to the (generated) `diff-lcs.gemspec` file. -`minitar.gemspec` file. This will permit you to use `bundle install` to install -the dependencies. - -You can run tests with code coverage analysis by running `rake spec:coverage`. - -## Workflow - -Here's the most direct way to get your work merged into the project: - -- Fork the project. -- Clone your fork (`git clone git://github.com//diff-lcs.git`). -- Create a topic branch to contain your change - (`git checkout -b my_awesome_feature`). -- Hack away, add tests. Not necessarily in that order. -- Make sure everything still passes by running `rake`. -- If necessary, rebase your commits into logical chunks, without errors. -- Push the branch up (`git push origin my_awesome_feature`). -- Create a pull request against halostatue/diff-lcs and describe what your - change does and the why you think it should be merged. - -[hoe]: https://github.com/seattlerb/hoe -[qcm]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html -[release-gem]: https://github.com/rubygems/release-gem -[rspec]: http://rspec.info/documentation/ -[standardrb]: https://github.com/standardrb/standard diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTORS.md b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTORS.md deleted file mode 100644 index 9053019..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTORS.md +++ /dev/null @@ -1,49 +0,0 @@ -# Contributors - -- Austin Ziegler (@halostatue) created diff-lcs. - -Thanks to everyone else who has contributed to diff-lcs over the years: - -- @ginriki -- @joshbronson -- @kevinmook -- @mckaz -- Akinori Musha -- Artem Ignatyev -- Brandon Fish -- Baptiste Courtois (@annih) -- Camille Drapier -- Cédric Boutillier -- @earlopain -- Gregg Kellogg -- Jagdeep Singh -- Jason Gladish -- Jon Rowe -- Josef Strzibny -- Josep (@apuratepp) -- Josh Bronson -- Jun Aruga -- Justin Steele -- Kenichi Kamiya -- Kensuke Nagae -- Kevin Ansfield -- Koichi Ito -- Mark Friedgan -- Masato Nakamura -- Mark Young -- Michael Granger -- Myron Marston -- Nicolas Leger -- Oleg Orlov -- Patrick Linnane -- Paul Kunysch -- Pete Higgins -- Peter Goldstein -- Peter Wagenet -- Philippe Lafoucrière -- Ryan Lovelett -- Scott Steele -- Simon Courtois -- Tien (@tiendo1011) -- Tomas Jura -- Vít Ondruch diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/LICENCE.md b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/LICENCE.md deleted file mode 100644 index c57c3f1..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/LICENCE.md +++ /dev/null @@ -1,40 +0,0 @@ -# Licence - -This software is available under three licenses: the GNU GPL version 2 (or at -your option, a later version), the Perl Artistic license, or the MIT license. -Note that my preference for licensing is the MIT license, but Algorithm::Diff -was dually originally licensed with the Perl Artistic and the GNU GPL ("the same -terms as Perl itself") and given that the Ruby implementation originally hewed -pretty closely to the Perl version, I must maintain the additional licensing -terms. - -- Copyright 2004–2025 Austin Ziegler and contributors. -- Adapted from Algorithm::Diff (Perl) by Ned Konz and a Smalltalk version by - Mario I. Wolczko. - -## MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -## Perl Artistic License - -See the file docs/artistic.txt in the main distribution. - -## GNU GPL version 2 - -See the file docs/COPYING.txt in the main distribution. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/Manifest.txt b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/Manifest.txt deleted file mode 100644 index fe58c86..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/Manifest.txt +++ /dev/null @@ -1,115 +0,0 @@ -.rspec -CHANGELOG.md -CODE_OF_CONDUCT.md -CONTRIBUTING.md -CONTRIBUTORS.md -LICENCE.md -Manifest.txt -README.md -Rakefile -SECURITY.md -bin/htmldiff -bin/ldiff -docs/COPYING.txt -docs/artistic.txt -lib/diff-lcs.rb -lib/diff/lcs.rb -lib/diff/lcs/array.rb -lib/diff/lcs/backports.rb -lib/diff/lcs/block.rb -lib/diff/lcs/callbacks.rb -lib/diff/lcs/change.rb -lib/diff/lcs/htmldiff.rb -lib/diff/lcs/hunk.rb -lib/diff/lcs/internals.rb -lib/diff/lcs/ldiff.rb -lib/diff/lcs/string.rb -lib/diff/lcs/version.rb -mise.toml -spec/change_spec.rb -spec/diff_spec.rb -spec/fixtures/123_x -spec/fixtures/456_x -spec/fixtures/aX -spec/fixtures/bXaX -spec/fixtures/ds1.csv -spec/fixtures/ds2.csv -spec/fixtures/empty -spec/fixtures/file1.bin -spec/fixtures/file2.bin -spec/fixtures/four_lines -spec/fixtures/four_lines_with_missing_new_line -spec/fixtures/ldiff/diff.missing_new_line1-e -spec/fixtures/ldiff/diff.missing_new_line1-f -spec/fixtures/ldiff/diff.missing_new_line2-e -spec/fixtures/ldiff/diff.missing_new_line2-f -spec/fixtures/ldiff/error.diff.chef-e -spec/fixtures/ldiff/error.diff.chef-f -spec/fixtures/ldiff/error.diff.missing_new_line1-e -spec/fixtures/ldiff/error.diff.missing_new_line1-f -spec/fixtures/ldiff/error.diff.missing_new_line2-e -spec/fixtures/ldiff/error.diff.missing_new_line2-f -spec/fixtures/ldiff/output.diff -spec/fixtures/ldiff/output.diff-c -spec/fixtures/ldiff/output.diff-e -spec/fixtures/ldiff/output.diff-f -spec/fixtures/ldiff/output.diff-u -spec/fixtures/ldiff/output.diff.bin1 -spec/fixtures/ldiff/output.diff.bin1-c -spec/fixtures/ldiff/output.diff.bin1-e -spec/fixtures/ldiff/output.diff.bin1-f -spec/fixtures/ldiff/output.diff.bin1-u -spec/fixtures/ldiff/output.diff.bin2 -spec/fixtures/ldiff/output.diff.bin2-c -spec/fixtures/ldiff/output.diff.bin2-e -spec/fixtures/ldiff/output.diff.bin2-f -spec/fixtures/ldiff/output.diff.bin2-u -spec/fixtures/ldiff/output.diff.chef -spec/fixtures/ldiff/output.diff.chef-c -spec/fixtures/ldiff/output.diff.chef-e -spec/fixtures/ldiff/output.diff.chef-f -spec/fixtures/ldiff/output.diff.chef-u -spec/fixtures/ldiff/output.diff.chef2 -spec/fixtures/ldiff/output.diff.chef2-c -spec/fixtures/ldiff/output.diff.chef2-d -spec/fixtures/ldiff/output.diff.chef2-e -spec/fixtures/ldiff/output.diff.chef2-f -spec/fixtures/ldiff/output.diff.chef2-u -spec/fixtures/ldiff/output.diff.empty.vs.four_lines -spec/fixtures/ldiff/output.diff.empty.vs.four_lines-c -spec/fixtures/ldiff/output.diff.empty.vs.four_lines-e -spec/fixtures/ldiff/output.diff.empty.vs.four_lines-f -spec/fixtures/ldiff/output.diff.empty.vs.four_lines-u -spec/fixtures/ldiff/output.diff.four_lines.vs.empty -spec/fixtures/ldiff/output.diff.four_lines.vs.empty-c -spec/fixtures/ldiff/output.diff.four_lines.vs.empty-e -spec/fixtures/ldiff/output.diff.four_lines.vs.empty-f -spec/fixtures/ldiff/output.diff.four_lines.vs.empty-u -spec/fixtures/ldiff/output.diff.issue95_trailing_context -spec/fixtures/ldiff/output.diff.issue95_trailing_context-c -spec/fixtures/ldiff/output.diff.issue95_trailing_context-e -spec/fixtures/ldiff/output.diff.issue95_trailing_context-f -spec/fixtures/ldiff/output.diff.issue95_trailing_context-u -spec/fixtures/ldiff/output.diff.missing_new_line1 -spec/fixtures/ldiff/output.diff.missing_new_line1-c -spec/fixtures/ldiff/output.diff.missing_new_line1-e -spec/fixtures/ldiff/output.diff.missing_new_line1-f -spec/fixtures/ldiff/output.diff.missing_new_line1-u -spec/fixtures/ldiff/output.diff.missing_new_line2 -spec/fixtures/ldiff/output.diff.missing_new_line2-c -spec/fixtures/ldiff/output.diff.missing_new_line2-e -spec/fixtures/ldiff/output.diff.missing_new_line2-f -spec/fixtures/ldiff/output.diff.missing_new_line2-u -spec/fixtures/new-chef -spec/fixtures/new-chef2 -spec/fixtures/old-chef -spec/fixtures/old-chef2 -spec/hunk_spec.rb -spec/issues_spec.rb -spec/lcs_spec.rb -spec/ldiff_spec.rb -spec/patch_spec.rb -spec/sdiff_spec.rb -spec/spec_helper.rb -spec/traverse_balanced_spec.rb -spec/traverse_sequences_spec.rb diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/README.md b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/README.md deleted file mode 100644 index 6583803..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# Diff::LCS - -- home :: https://github.com/halostatue/diff-lcs -- changelog :: https://github.com/halostatue/diff-lcs/blob/main/CHANGELOG.md -- code :: https://github.com/halostatue/diff-lcs -- bugs :: https://github.com/halostatue/diff-lcs/issues -- rdoc :: http://rubydoc.info/github/halostatue/diff-lcs - - - - - -## Description - -Diff::LCS computes the difference between two Enumerable sequences using the -McIlroy-Hunt longest common subsequence (LCS) algorithm. It includes utilities -to create a simple HTML diff output format and a standard diff-like tool. - -This is release 1.6.1, providing a simple extension that allows for -Diff::LCS::Change objects to be treated implicitly as arrays and fixes a number -of formatting issues. - -Ruby versions below 2.5 are soft-deprecated, which means that older versions are -no longer part of the CI test suite. If any changes have been introduced that -break those versions, bug reports and patches will be accepted, but it will be -up to the reporter to verify any fixes prior to release. The next major release -will completely break compatibility. - -## Synopsis - -Using this module is quite simple. By default, Diff::LCS does not extend objects -with the Diff::LCS interface, but will be called as if it were a function: - -```ruby -require 'diff/lcs' - -seq1 = %w(a b c e h j l m n p) -seq2 = %w(b c d e f j k l m r s t) - -lcs = Diff::LCS.LCS(seq1, seq2) -diffs = Diff::LCS.diff(seq1, seq2) -sdiff = Diff::LCS.sdiff(seq1, seq2) -seq = Diff::LCS.traverse_sequences(seq1, seq2, callback_obj) -bal = Diff::LCS.traverse_balanced(seq1, seq2, callback_obj) -seq2 == Diff::LCS.patch!(seq1, diffs) -seq1 == Diff::LCS.unpatch!(seq2, diffs) -seq2 == Diff::LCS.patch!(seq1, sdiff) -seq1 == Diff::LCS.unpatch!(seq2, sdiff) -``` - -Objects can be extended with Diff::LCS: - -```ruby -seq1.extend(Diff::LCS) -lcs = seq1.lcs(seq2) -diffs = seq1.diff(seq2) -sdiff = seq1.sdiff(seq2) -seq = seq1.traverse_sequences(seq2, callback_obj) -bal = seq1.traverse_balanced(seq2, callback_obj) -seq2 == seq1.patch!(diffs) -seq1 == seq2.unpatch!(diffs) -seq2 == seq1.patch!(sdiff) -seq1 == seq2.unpatch!(sdiff) -``` - -By requiring 'diff/lcs/array' or 'diff/lcs/string', Array or String will be -extended for use this way. - -Note that Diff::LCS requires a sequenced enumerable container, which means that -the order of enumeration is both predictable and consistent for the same set of -data. While it is theoretically possible to generate a diff for an unordered -hash, it will only be meaningful if the enumeration of the hashes is consistent. -In general, this will mean that containers that behave like String or Array will -perform best. - -## History - -Diff::LCS is a port of Perl's Algorithm::Diff that uses the McIlroy-Hunt longest -common subsequence (LCS) algorithm to compute intelligent differences between -two sequenced enumerable containers. The implementation is based on Mario I. -Wolczko's [Smalltalk version 1.2][smalltalk] (1993) and Ned Konz's Perl version -[Algorithm::Diff 1.15][perl]. `Diff::LCS#sdiff` and -`Diff::LCS#traverse_balanced` were originally written for the Perl version by -Mike Schilli. - -The algorithm is described in A Fast Algorithm for Computing Longest Common -Subsequences, CACM, vol.20, no.5, pp.350-353, May 1977, with a few minor -improvements to improve the speed. A simplified description of the algorithm, -originally written for the Perl version, was written by Mark-Jason Dominus. - -[smalltalk]: ftp://st.cs.uiuc.edu/pub/Smalltalk/MANCHESTER/manchester/4.0/diff.st -[perl]: http://search.cpan.org/~nedkonz/Algorithm-Diff-1.15/ diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/Rakefile b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/Rakefile deleted file mode 100644 index 0bfe927..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/Rakefile +++ /dev/null @@ -1,115 +0,0 @@ -require "rubygems" -require "rspec" -require "rspec/core/rake_task" -require "hoe" -require "rake/clean" - -MAINTENANCE = ENV["MAINTENANCE"] == "true" -BUILD_DOCS = MAINTENANCE || ENV["DOCS"] == "true" -TRUSTED_RELEASE = ENV["rubygems_release_gem"] == "true" - -Hoe.plugin :halostatue -Hoe.plugin :rubygems - -Hoe.plugins.delete :debug -Hoe.plugins.delete :newb -Hoe.plugins.delete :signing -Hoe.plugins.delete :publish unless BUILD_DOCS - -if RUBY_VERSION < "1.9" - class Array # :nodoc: - def to_h - Hash[*flatten(1)] - end - end - - class Gem::Specification # :nodoc: - def metadata=(*) - end - - def default_value(*) - end - end - - class Object # :nodoc: - def caller_locations(*) - [] - end - end -end - -_spec = Hoe.spec "diff-lcs" do - developer("Austin Ziegler", "halostatue@gmail.com") - - self.trusted_release = TRUSTED_RELEASE - - require_ruby_version ">= 1.8" - - self.history_file = "CHANGELOG.md" - self.readme_file = "README.md" - self.licenses = ["MIT", "Artistic-1.0-Perl", "GPL-2.0-or-later"] - - spec_extras[:metadata] = ->(val) { - val["rubygems_mfa_required"] = "true" - } - - extra_dev_deps << ["hoe", "~> 4.0"] - extra_dev_deps << ["hoe-halostatue", "~> 2.0"] - extra_dev_deps << ["hoe-rubygems", "~> 1.0"] - extra_dev_deps << ["rspec", ">= 2.0", "< 4"] - extra_dev_deps << ["rake", ">= 10.0", "< 14"] - extra_dev_deps << ["rdoc", ">= 6.3.1", "< 7"] -end - -if BUILD_DOCS - rake_tasks = Rake.application.instance_variable_get(:@tasks) - tasks = ["publish_docs", "publish_on_announce", "debug_email", "post_blog", "announce"] - tasks.each do |task| - rake_tasks.delete(task) - end -end - -desc "Run all specifications" -RSpec::Core::RakeTask.new(:spec) do |t| - rspec_dirs = %w[spec lib].join(":") - t.rspec_opts = ["-I#{rspec_dirs}"] -end - -task :version do - require "diff/lcs/version" - puts Diff::LCS::VERSION -end - -Rake::Task["spec"].actions.uniq! { |a| a.source_location } - -# standard:disable Style/HashSyntax -task :default => :spec unless Rake::Task["default"].prereqs.include?("spec") -task :test => :spec unless Rake::Task["test"].prereqs.include?("spec") -# standard:enable Style/HashSyntax - -if RUBY_VERSION >= "3.0" && RUBY_ENGINE == "ruby" - namespace :spec do - desc "Runs test coverage. Only works Ruby 2.0+ and assumes 'simplecov' is installed." - task :coverage do - ENV["COVERAGE"] = "true" - Rake::Task["spec"].execute - end - end -end - -if MAINTENANCE - task ruby18: :package do - require "diff/lcs/version" - # standard:disable Layout/HeredocIndentation - puts <<-MESSAGE -You are starting a barebones Ruby 1.8 docker environment for testing. -A snapshot package has been built, so install it with: - - cd diff-lcs - gem install pkg/diff-lcs-#{Diff::LCS::VERSION} - - MESSAGE - # standard:enable Layout/HeredocIndentation - sh "docker run -it --rm -v #{Dir.pwd}:/root/diff-lcs bellbind/docker-ruby18-rails2 bash -l" - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/SECURITY.md b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/SECURITY.md deleted file mode 100644 index 16854f6..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/SECURITY.md +++ /dev/null @@ -1,41 +0,0 @@ -# diff-lcs Security - -## Supported Versions - -Security reports are accepted for the most recent major release and the previous -version for a limited time after the initial major release version. After a -major release, the previous version will receive full support for six months and -security support for an additional six months (for a total of twelve months). - -Because diff-lcs 1.x supports a wide range of Ruby versions, security reports -will only be accepted when they can be demonstrated on Ruby 3.1 or higher. - -> [!information] -> -> There will be a diff-lcs 2.0 released in 2025 which narrows support to modern -> versions of Ruby only. -> -> | Release Date | Support Ends | Security Support Ends | -> | ------------ | ------------ | --------------------- | -> | 2025 | +6 months | +12 months | -> -> If the 2.0.0 release happens on 2025-07-01, regular support for diff-lcs 1.x -> will end on 2026-12-31 and security support for diff-lcs 1.x will end on -> 2026-06-30. - -## Reporting a Vulnerability - -By preference, use the [Tidelift security contact][tidelift]. Tidelift will -coordinate the fix and disclosure. - -Alternatively, Send an email to [diff-lcs@halostatue.ca][email] with the text -`Diff::LCS` in the subject. Emails sent to this address should be encrypted -using [age][age] with the following public key: - -``` -age1fc6ngxmn02m62fej5cl30lrvwmxn4k3q2atqu53aatekmnqfwumqj4g93w -``` - -[tidelift]: https://tidelift.com/security -[email]: mailto:diff-lcs@halostatue.ca -[age]: https://github.com/FiloSottile/age diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/bin/htmldiff b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/bin/htmldiff deleted file mode 100755 index bcd89d2..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/bin/htmldiff +++ /dev/null @@ -1,35 +0,0 @@ -#! /usr/bin/env ruby -w -# frozen_string_literal: true - -require "diff/lcs" -require "diff/lcs/htmldiff" - -begin - require "text/format" -rescue LoadError - Diff::LCS::HTMLDiff.can_expand_tabs = false -end - -if ARGV.size < 2 or ARGV.size > 3 - warn "usage: #{File.basename($0)} old new [output.html]" - warn " #{File.basename($0)} old new > output.html" - exit 127 -end - -left = IO.read(ARGV[0]).split($/) -right = IO.read(ARGV[1]).split($/) - -options = { :title => "diff #{ARGV[0]} #{ARGV[1]}" } - -htmldiff = Diff::LCS::HTMLDiff.new(left, right, options) - -if ARGV[2] - File.open(ARGV[2], "w") do |f| - htmldiff.options[:output] = f - htmldiff.run - end -else - htmldiff.run -end - -# vim: ft=ruby diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/bin/ldiff b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/bin/ldiff deleted file mode 100755 index f4734f5..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/bin/ldiff +++ /dev/null @@ -1,9 +0,0 @@ -#! /usr/bin/env ruby -w -# frozen_string_literal: true - -require 'diff/lcs' -require 'diff/lcs/ldiff' - -exit Diff::LCS::Ldiff.run(ARGV) - -# vim: ft=ruby diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/docs/COPYING.txt b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/docs/COPYING.txt deleted file mode 100644 index d159169..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/docs/COPYING.txt +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/docs/artistic.txt b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/docs/artistic.txt deleted file mode 100644 index 763e17a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/docs/artistic.txt +++ /dev/null @@ -1,127 +0,0 @@ -The "Artistic License" - - Preamble - -The intent of this document is to state the conditions under which a -Package may be copied, such that the Copyright Holder maintains some -semblance of artistic control over the development of the package, -while giving the users of the package the right to use and distribute -the Package in a more-or-less customary fashion, plus the right to make -reasonable modifications. - -Definitions: - - "Package" refers to the collection of files distributed by the - Copyright Holder, and derivatives of that collection of files - created through textual modification. - - "Standard Version" refers to such a Package if it has not been - modified, or has been modified in accordance with the wishes - of the Copyright Holder as specified below. - - "Copyright Holder" is whoever is named in the copyright or - copyrights for the package. - - "You" is you, if you're thinking about copying or distributing - this Package. - - "Reasonable copying fee" is whatever you can justify on the - basis of media cost, duplication charges, time of people involved, - and so on. (You will not be required to justify it to the - Copyright Holder, but only to the computing community at large - as a market that must bear the fee.) - - "Freely Available" means that no fee is charged for the item - itself, though there may be fees involved in handling the item. - It also means that recipients of the item may redistribute it - under the same conditions they received it. - -1. You may make and give away verbatim copies of the source form of the -Standard Version of this Package without restriction, provided that you -duplicate all of the original copyright notices and associated disclaimers. - -2. You may apply bug fixes, portability fixes and other modifications -derived from the Public Domain or from the Copyright Holder. A Package -modified in such a way shall still be considered the Standard Version. - -3. You may otherwise modify your copy of this Package in any way, provided -that you insert a prominent notice in each changed file stating how and -when you changed that file, and provided that you do at least ONE of the -following: - - a) place your modifications in the Public Domain or otherwise make them - Freely Available, such as by posting said modifications to Usenet or - an equivalent medium, or placing the modifications on a major archive - site such as uunet.uu.net, or by allowing the Copyright Holder to include - your modifications in the Standard Version of the Package. - - b) use the modified Package only within your corporation or organization. - - c) rename any non-standard executables so the names do not conflict - with standard executables, which must also be provided, and provide - a separate manual page for each non-standard executable that clearly - documents how it differs from the Standard Version. - - d) make other distribution arrangements with the Copyright Holder. - -4. You may distribute the programs of this Package in object code or -executable form, provided that you do at least ONE of the following: - - a) distribute a Standard Version of the executables and library files, - together with instructions (in the manual page or equivalent) on where - to get the Standard Version. - - b) accompany the distribution with the machine-readable source of - the Package with your modifications. - - c) give non-standard executables non-standard names, and clearly - document the differences in manual pages (or equivalent), together - with instructions on where to get the Standard Version. - - d) make other distribution arrangements with the Copyright Holder. - -5. You may charge a reasonable copying fee for any distribution of this -Package. You may charge any fee you choose for support of this -Package. You may not charge a fee for this Package itself. However, -you may distribute this Package in aggregate with other (possibly -commercial) programs as part of a larger (possibly commercial) software -distribution provided that you do not advertise this Package as a -product of your own. You may embed this Package's interpreter within -an executable of yours (by linking); this shall be construed as a mere -form of aggregation, provided that the complete Standard Version of the -interpreter is so embedded. - -6. The scripts and library files supplied as input to or produced as -output from the programs of this Package do not automatically fall -under the copyright of this Package, but belong to whoever generated -them, and may be sold commercially, and may be aggregated with this -Package. If such scripts or library files are aggregated with this -Package via the so-called "undump" or "unexec" methods of producing a -binary executable image, then distribution of such an image shall -neither be construed as a distribution of this Package nor shall it -fall under the restrictions of Paragraphs 3 and 4, provided that you do -not represent such an executable image as a Standard Version of this -Package. - -7. C subroutines (or comparably compiled subroutines in other -languages) supplied by you and linked into this Package in order to -emulate subroutines and variables of the language defined by this -Package shall not be considered part of this Package, but are the -equivalent of input as in Paragraph 6, provided these subroutines do -not change the language in any way that would cause it to fail the -regression tests for the language. - -8. Aggregation of this Package with a commercial distribution is always -permitted provided that the use of this Package is embedded; that is, -when no overt attempt is made to make this Package's interfaces visible -to the end user of the commercial distribution. Such use shall not be -construed as a distribution of this Package. - -9. The name of the Copyright Holder may not be used to endorse or promote -products derived from this software without specific prior written permission. - -10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - - The End diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff-lcs.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff-lcs.rb deleted file mode 100644 index bc07bf9..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff-lcs.rb +++ /dev/null @@ -1,3 +0,0 @@ -# frozen_string_literal: true - -require "diff/lcs" diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs.rb deleted file mode 100644 index 5ee8937..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs.rb +++ /dev/null @@ -1,742 +0,0 @@ -# frozen_string_literal: true - -module Diff; end unless defined? Diff - -# == How Diff Works (by Mark-Jason Dominus) -# -# I once read an article written by the authors of +diff+; they said that they -# hard worked very hard on the algorithm until they found the right one. -# -# I think what they ended up using (and I hope someone will correct me, because -# I am not very confident about this) was the `longest common subsequence' -# method. In the LCS problem, you have two sequences of items: -# -# a b c d f g h j q z -# a b c d e f g i j k r x y z -# -# and you want to find the longest sequence of items that is present in both -# original sequences in the same order. That is, you want to find a new -# sequence *S* which can be obtained from the first sequence by deleting some -# items, and from the second sequence by deleting other items. You also want -# *S* to be as long as possible. In this case *S* is: -# -# a b c d f g j z -# -# From there it's only a small step to get diff-like output: -# -# e h i k q r x y -# + - + + - + + + -# -# This module solves the LCS problem. It also includes a canned function to -# generate +diff+-like output. -# -# It might seem from the example above that the LCS of two sequences is always -# pretty obvious, but that's not always the case, especially when the two -# sequences have many repeated elements. For example, consider -# -# a x b y c z p d q -# a b c a x b y c z -# -# A naive approach might start by matching up the +a+ and +b+ that appear at -# the beginning of each sequence, like this: -# -# a x b y c z p d q -# a b c a b y c z -# -# This finds the common subsequence +a b c z+. But actually, the LCS is +a x b -# y c z+: -# -# a x b y c z p d q -# a b c a x b y c z -module Diff::LCS -end - -require "diff/lcs/version" -require "diff/lcs/callbacks" -require "diff/lcs/internals" - -module Diff::LCS - # Returns an Array containing the longest common subsequence(s) between - # +self+ and +other+. See Diff::LCS#lcs. - # - # lcs = seq1.lcs(seq2) - # - # A note when using objects: Diff::LCS only works properly when each object - # can be used as a key in a Hash. This means that those objects must implement - # the methods +#hash+ and +#eql?+ such that two objects containing identical values - # compare identically for key purposes. That is: - # - # O.new('a').eql?(O.new('a')) == true && - # O.new('a').hash == O.new('a').hash - def lcs(other, &block) # :yields: self[i] if there are matched subsequences - Diff::LCS.lcs(self, other, &block) - end - - # Returns the difference set between +self+ and +other+. See Diff::LCS#diff. - def diff(other, callbacks = nil, &block) - Diff::LCS.diff(self, other, callbacks, &block) - end - - # Returns the balanced ("side-by-side") difference set between +self+ and - # +other+. See Diff::LCS#sdiff. - def sdiff(other, callbacks = nil, &block) - Diff::LCS.sdiff(self, other, callbacks, &block) - end - - # Traverses the discovered longest common subsequences between +self+ and - # +other+. See Diff::LCS#traverse_sequences. - def traverse_sequences(other, callbacks = nil, &block) - Diff::LCS.traverse_sequences(self, other, callbacks || Diff::LCS::SequenceCallbacks, &block) - end - - # Traverses the discovered longest common subsequences between +self+ and - # +other+ using the alternate, balanced algorithm. See - # Diff::LCS#traverse_balanced. - def traverse_balanced(other, callbacks = nil, &block) - Diff::LCS.traverse_balanced(self, other, callbacks || Diff::LCS::BalancedCallbacks, &block) - end - - # Attempts to patch +self+ with the provided +patchset+. A new sequence based - # on +self+ and the +patchset+ will be created. See Diff::LCS#patch. Attempts - # to autodiscover the direction of the patch. - def patch(patchset) - Diff::LCS.patch(self, patchset) - end - alias_method :unpatch, :patch - - # Attempts to patch +self+ with the provided +patchset+. A new sequence based - # on +self+ and the +patchset+ will be created. See Diff::LCS#patch. Does no - # patch direction autodiscovery. - def patch!(patchset) - Diff::LCS.patch!(self, patchset) - end - - # Attempts to unpatch +self+ with the provided +patchset+. A new sequence - # based on +self+ and the +patchset+ will be created. See Diff::LCS#unpatch. - # Does no patch direction autodiscovery. - def unpatch!(patchset) - Diff::LCS.unpatch!(self, patchset) - end - - # Attempts to patch +self+ with the provided +patchset+, using #patch!. If - # the sequence this is used on supports #replace, the value of +self+ will be - # replaced. See Diff::LCS#patch. Does no patch direction autodiscovery. - def patch_me(patchset) - if respond_to? :replace - replace(patch!(patchset)) - else - patch!(patchset) - end - end - - # Attempts to unpatch +self+ with the provided +patchset+, using #unpatch!. - # If the sequence this is used on supports #replace, the value of +self+ will - # be replaced. See Diff::LCS#unpatch. Does no patch direction autodiscovery. - def unpatch_me(patchset) - if respond_to? :replace - replace(unpatch!(patchset)) - else - unpatch!(patchset) - end - end -end - -class << Diff::LCS - def lcs(seq1, seq2, &block) # :yields: seq1[i] for each matched - matches = Diff::LCS::Internals.lcs(seq1, seq2) - ret = [] - string = seq1.is_a? String - matches.each_index do |i| - next if matches[i].nil? - - v = string ? seq1[i, 1] : seq1[i] - v = block[v] if block - ret << v - end - ret - end - alias_method :LCS, :lcs - - # #diff computes the smallest set of additions and deletions necessary to - # turn the first sequence into the second, and returns a description of these - # changes. - # - # See Diff::LCS::DiffCallbacks for the default behaviour. An alternate - # behaviour may be implemented with Diff::LCS::ContextDiffCallbacks. If a - # Class argument is provided for +callbacks+, #diff will attempt to - # initialise it. If the +callbacks+ object (possibly initialised) responds to - # #finish, it will be called. - def diff(seq1, seq2, callbacks = nil, &block) # :yields: diff changes - diff_traversal(:diff, seq1, seq2, callbacks || Diff::LCS::DiffCallbacks, &block) - end - - # #sdiff computes all necessary components to show two sequences and their - # minimized differences side by side, just like the Unix utility - # sdiff does: - # - # old < - - # same same - # before | after - # - > new - # - # See Diff::LCS::SDiffCallbacks for the default behaviour. An alternate - # behaviour may be implemented with Diff::LCS::ContextDiffCallbacks. If a - # Class argument is provided for +callbacks+, #diff will attempt to - # initialise it. If the +callbacks+ object (possibly initialised) responds to - # #finish, it will be called. - # - # Each element of a returned array is a Diff::LCS::ContextChange object, - # which can be implicitly converted to an array. - # - # Diff::LCS.sdiff(a, b).each do |action, (old_pos, old_element), (new_pos, new_element)| - # case action - # when '!' - # # replace - # when '-' - # # delete - # when '+' - # # insert - # end - # end - def sdiff(seq1, seq2, callbacks = nil, &block) # :yields: diff changes - diff_traversal(:sdiff, seq1, seq2, callbacks || Diff::LCS::SDiffCallbacks, &block) - end - - # #traverse_sequences is the most general facility provided by this module; - # #diff and #lcs are implemented as calls to it. - # - # The arguments to #traverse_sequences are the two sequences to traverse, and - # a callback object, like this: - # - # traverse_sequences(seq1, seq2, Diff::LCS::ContextDiffCallbacks.new) - # - # == Callback Methods - # - # Optional callback methods are emphasized. - # - # callbacks#match:: Called when +a+ and +b+ are pointing to - # common elements in +A+ and +B+. - # callbacks#discard_a:: Called when +a+ is pointing to an - # element not in +B+. - # callbacks#discard_b:: Called when +b+ is pointing to an - # element not in +A+. - # callbacks#finished_a:: Called when +a+ has reached the end of - # sequence +A+. - # callbacks#finished_b:: Called when +b+ has reached the end of - # sequence +B+. - # - # == Algorithm - # - # a---+ - # v - # A = a b c e h j l m n p - # B = b c d e f j k l m r s t - # ^ - # b---+ - # - # If there are two arrows (+a+ and +b+) pointing to elements of sequences +A+ - # and +B+, the arrows will initially point to the first elements of their - # respective sequences. #traverse_sequences will advance the arrows through - # the sequences one element at a time, calling a method on the user-specified - # callback object before each advance. It will advance the arrows in such a - # way that if there are elements A[i] and B[j] which are - # both equal and part of the longest common subsequence, there will be some - # moment during the execution of #traverse_sequences when arrow +a+ is - # pointing to A[i] and arrow +b+ is pointing to B[j]. When - # this happens, #traverse_sequences will call callbacks#match and - # then it will advance both arrows. - # - # Otherwise, one of the arrows is pointing to an element of its sequence that - # is not part of the longest common subsequence. #traverse_sequences will - # advance that arrow and will call callbacks#discard_a or - # callbacks#discard_b, depending on which arrow it advanced. If both - # arrows point to elements that are not part of the longest common - # subsequence, then #traverse_sequences will advance arrow +a+ and call the - # appropriate callback, then it will advance arrow +b+ and call the appropriate - # callback. - # - # The methods for callbacks#match, callbacks#discard_a, and - # callbacks#discard_b are invoked with an event comprising the - # action ("=", "+", or "-", respectively), the indexes +i+ and +j+, and the - # elements A[i] and B[j]. Return values are discarded by - # #traverse_sequences. - # - # === End of Sequences - # - # If arrow +a+ reaches the end of its sequence before arrow +b+ does, - # #traverse_sequence will try to call callbacks#finished_a with the - # last index and element of +A+ (A[-1]) and the current index and - # element of +B+ (B[j]). If callbacks#finished_a does not - # exist, then callbacks#discard_b will be called on each element of - # +B+ until the end of the sequence is reached (the call will be done with - # A[-1] and B[j] for each element). - # - # If +b+ reaches the end of +B+ before +a+ reaches the end of +A+, - # callbacks#finished_b will be called with the current index and - # element of +A+ (A[i]) and the last index and element of +B+ - # (A[-1]). Again, if callbacks#finished_b does not exist on - # the callback object, then callbacks#discard_a will be called on - # each element of +A+ until the end of the sequence is reached (A[i] - # and B[-1]). - # - # There is a chance that one additional callbacks#discard_a or - # callbacks#discard_b will be called after the end of the sequence - # is reached, if +a+ has not yet reached the end of +A+ or +b+ has not yet - # reached the end of +B+. - def traverse_sequences(seq1, seq2, callbacks = Diff::LCS::SequenceCallbacks) # :yields: change events - callbacks ||= Diff::LCS::SequenceCallbacks - matches = Diff::LCS::Internals.lcs(seq1, seq2) - - run_finished_a = run_finished_b = false - string = seq1.is_a?(String) - - a_size = seq1.size - b_size = seq2.size - ai = bj = 0 - - matches.each do |b_line| - if b_line.nil? - unless seq1[ai].nil? - ax = string ? seq1[ai, 1] : seq1[ai] - bx = string ? seq2[bj, 1] : seq2[bj] - - event = Diff::LCS::ContextChange.new("-", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.discard_a(event) - end - else - ax = string ? seq1[ai, 1] : seq1[ai] - - loop do - break unless bj < b_line - - bx = string ? seq2[bj, 1] : seq2[bj] - event = Diff::LCS::ContextChange.new("+", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.discard_b(event) - bj += 1 - end - bx = string ? seq2[bj, 1] : seq2[bj] - event = Diff::LCS::ContextChange.new("=", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.match(event) - bj += 1 - end - ai += 1 - end - - # The last entry (if any) processed was a match. +ai+ and +bj+ point just - # past the last matching lines in their sequences. - while (ai < a_size) || (bj < b_size) - # last A? - if ai == a_size && bj < b_size - if callbacks.respond_to?(:finished_a) && !run_finished_a - ax = string ? seq1[-1, 1] : seq1[-1] - bx = string ? seq2[bj, 1] : seq2[bj] - event = Diff::LCS::ContextChange.new(">", a_size - 1, ax, bj, bx) - event = yield event if block_given? - callbacks.finished_a(event) - run_finished_a = true - else - ax = string ? seq1[ai, 1] : seq1[ai] - loop do - bx = string ? seq2[bj, 1] : seq2[bj] - event = Diff::LCS::ContextChange.new("+", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.discard_b(event) - bj += 1 - break unless bj < b_size - end - end - end - - # last B? - if bj == b_size && ai < a_size - if callbacks.respond_to?(:finished_b) && !run_finished_b - ax = string ? seq1[ai, 1] : seq1[ai] - bx = string ? seq2[-1, 1] : seq2[-1] - event = Diff::LCS::ContextChange.new("<", ai, ax, b_size - 1, bx) - event = yield event if block_given? - callbacks.finished_b(event) - run_finished_b = true - else - bx = string ? seq2[bj, 1] : seq2[bj] - loop do - ax = string ? seq1[ai, 1] : seq1[ai] - event = Diff::LCS::ContextChange.new("-", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.discard_a(event) - ai += 1 - break unless bj < b_size - end - end - end - - if ai < a_size - ax = string ? seq1[ai, 1] : seq1[ai] - bx = string ? seq2[bj, 1] : seq2[bj] - event = Diff::LCS::ContextChange.new("-", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.discard_a(event) - ai += 1 - end - - if bj < b_size - ax = string ? seq1[ai, 1] : seq1[ai] - bx = string ? seq2[bj, 1] : seq2[bj] - event = Diff::LCS::ContextChange.new("+", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.discard_b(event) - bj += 1 - end - end - end - - # #traverse_balanced is an alternative to #traverse_sequences. It uses a - # different algorithm to iterate through the entries in the computed longest - # common subsequence. Instead of viewing the changes as insertions or - # deletions from one of the sequences, #traverse_balanced will report - # changes between the sequences. - # - # The arguments to #traverse_balanced are the two sequences to traverse and a - # callback object, like this: - # - # traverse_balanced(seq1, seq2, Diff::LCS::ContextDiffCallbacks.new) - # - # #sdiff is implemented with #traverse_balanced. - # - # == Callback Methods - # - # Optional callback methods are emphasized. - # - # callbacks#match:: Called when +a+ and +b+ are pointing to - # common elements in +A+ and +B+. - # callbacks#discard_a:: Called when +a+ is pointing to an - # element not in +B+. - # callbacks#discard_b:: Called when +b+ is pointing to an - # element not in +A+. - # callbacks#change:: Called when +a+ and +b+ are pointing to - # the same relative position, but - # A[a] and B[b] are not - # the same; a change has - # occurred. - # - # #traverse_balanced might be a bit slower than #traverse_sequences, - # noticeable only while processing huge amounts of data. - # - # == Algorithm - # - # a---+ - # v - # A = a b c e h j l m n p - # B = b c d e f j k l m r s t - # ^ - # b---+ - # - # === Matches - # - # If there are two arrows (+a+ and +b+) pointing to elements of sequences +A+ - # and +B+, the arrows will initially point to the first elements of their - # respective sequences. #traverse_sequences will advance the arrows through - # the sequences one element at a time, calling a method on the user-specified - # callback object before each advance. It will advance the arrows in such a - # way that if there are elements A[i] and B[j] which are - # both equal and part of the longest common subsequence, there will be some - # moment during the execution of #traverse_sequences when arrow +a+ is - # pointing to A[i] and arrow +b+ is pointing to B[j]. When - # this happens, #traverse_sequences will call callbacks#match and - # then it will advance both arrows. - # - # === Discards - # - # Otherwise, one of the arrows is pointing to an element of its sequence that - # is not part of the longest common subsequence. #traverse_sequences will - # advance that arrow and will call callbacks#discard_a or - # callbacks#discard_b, depending on which arrow it advanced. - # - # === Changes - # - # If both +a+ and +b+ point to elements that are not part of the longest - # common subsequence, then #traverse_sequences will try to call - # callbacks#change and advance both arrows. If - # callbacks#change is not implemented, then - # callbacks#discard_a and callbacks#discard_b will be - # called in turn. - # - # The methods for callbacks#match, callbacks#discard_a, - # callbacks#discard_b, and callbacks#change are invoked - # with an event comprising the action ("=", "+", "-", or "!", respectively), - # the indexes +i+ and +j+, and the elements A[i] and B[j]. - # Return values are discarded by #traverse_balanced. - # - # === Context - # - # Note that +i+ and +j+ may not be the same index position, even if +a+ and - # +b+ are considered to be pointing to matching or changed elements. - def traverse_balanced(seq1, seq2, callbacks = Diff::LCS::BalancedCallbacks) - matches = Diff::LCS::Internals.lcs(seq1, seq2) - a_size = seq1.size - b_size = seq2.size - ai = bj = mb = 0 - ma = -1 - string = seq1.is_a?(String) - - # Process all the lines in the match vector. - loop do - # Find next match indexes +ma+ and +mb+ - loop do - ma += 1 - break unless ma < matches.size && matches[ma].nil? - end - - break if ma >= matches.size # end of matches? - - mb = matches[ma] - - # Change(seq2) - while (ai < ma) || (bj < mb) - ax = string ? seq1[ai, 1] : seq1[ai] - bx = string ? seq2[bj, 1] : seq2[bj] - - case [(ai < ma), (bj < mb)] - when [true, true] - if callbacks.respond_to?(:change) - event = Diff::LCS::ContextChange.new("!", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.change(event) - ai += 1 - else - event = Diff::LCS::ContextChange.new("-", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.discard_a(event) - ai += 1 - ax = string ? seq1[ai, 1] : seq1[ai] - event = Diff::LCS::ContextChange.new("+", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.discard_b(event) - end - - bj += 1 - when [true, false] - event = Diff::LCS::ContextChange.new("-", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.discard_a(event) - ai += 1 - when [false, true] - event = Diff::LCS::ContextChange.new("+", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.discard_b(event) - bj += 1 - end - end - - # Match - ax = string ? seq1[ai, 1] : seq1[ai] - bx = string ? seq2[bj, 1] : seq2[bj] - event = Diff::LCS::ContextChange.new("=", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.match(event) - ai += 1 - bj += 1 - end - - while (ai < a_size) || (bj < b_size) - ax = string ? seq1[ai, 1] : seq1[ai] - bx = string ? seq2[bj, 1] : seq2[bj] - - case [(ai < a_size), (bj < b_size)] - when [true, true] - if callbacks.respond_to?(:change) - event = Diff::LCS::ContextChange.new("!", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.change(event) - ai += 1 - else - event = Diff::LCS::ContextChange.new("-", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.discard_a(event) - ai += 1 - ax = string ? seq1[ai, 1] : seq1[ai] - event = Diff::LCS::ContextChange.new("+", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.discard_b(event) - end - - bj += 1 - when [true, false] - event = Diff::LCS::ContextChange.new("-", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.discard_a(event) - ai += 1 - when [false, true] - event = Diff::LCS::ContextChange.new("+", ai, ax, bj, bx) - event = yield event if block_given? - callbacks.discard_b(event) - bj += 1 - end - end - end - - # standard:disable Style/HashSyntax - PATCH_MAP = { # :nodoc: - :patch => {"+" => "+", "-" => "-", "!" => "!", "=" => "="}.freeze, - :unpatch => {"+" => "-", "-" => "+", "!" => "!", "=" => "="}.freeze - }.freeze - # standard:enable Style/HashSyntax - - # Applies a +patchset+ to the sequence +src+ according to the +direction+ - # (:patch or :unpatch), producing a new sequence. - # - # If the +direction+ is not specified, Diff::LCS::patch will attempt to - # discover the direction of the +patchset+. - # - # A +patchset+ can be considered to apply forward (:patch) if the - # following expression is true: - # - # patch(s1, diff(s1, s2)) -> s2 - # - # A +patchset+ can be considered to apply backward (:unpatch) if the - # following expression is true: - # - # patch(s2, diff(s1, s2)) -> s1 - # - # If the +patchset+ contains no changes, the +src+ value will be returned as - # either src.dup or +src+. A +patchset+ can be deemed as having no - # changes if the following predicate returns true: - # - # patchset.empty? or - # patchset.flatten(1).all? { |change| change.unchanged? } - # - # === Patchsets - # - # A +patchset+ is always an enumerable sequence of changes, hunks of changes, - # or a mix of the two. A hunk of changes is an enumerable sequence of - # changes: - # - # [ # patchset - # # change - # [ # hunk - # # change - # ] - # ] - # - # The +patch+ method accepts patchsets that are enumerable sequences - # containing either Diff::LCS::Change objects (or a subclass) or the array - # representations of those objects. Prior to application, array - # representations of Diff::LCS::Change objects will be reified. - def patch(src, patchset, direction = nil) - # Normalize the patchset. - has_changes, patchset = Diff::LCS::Internals.analyze_patchset(patchset) - - return src.respond_to?(:dup) ? src.dup : src unless has_changes - - string = src.is_a?(String) - # Start with a new empty type of the source's class - res = src.class.new - - direction ||= Diff::LCS::Internals.intuit_diff_direction(src, patchset) - - ai = bj = 0 - - patch_map = PATCH_MAP[direction] - - patchset.each do |change| - # Both Change and ContextChange support #action - action = patch_map[change.action] - - case change - when Diff::LCS::ContextChange - case direction - when :patch - el = change.new_element - op = change.old_position - np = change.new_position - when :unpatch - el = change.old_element - op = change.new_position - np = change.old_position - end - - case action - when "-" # Remove details from the old string - while ai < op - res << (string ? src[ai, 1] : src[ai]) - ai += 1 - bj += 1 - end - ai += 1 - when "+" - while bj < np - res << (string ? src[ai, 1] : src[ai]) - ai += 1 - bj += 1 - end - - res << el - bj += 1 - when "=" - # This only appears in sdiff output with the SDiff callback. - # Therefore, we only need to worry about dealing with a single - # element. - res << el - - ai += 1 - bj += 1 - when "!" - while ai < op - res << (string ? src[ai, 1] : src[ai]) - ai += 1 - bj += 1 - end - - bj += 1 - ai += 1 - - res << el - end - when Diff::LCS::Change - case action - when "-" - while ai < change.position - res << (string ? src[ai, 1] : src[ai]) - ai += 1 - bj += 1 - end - ai += 1 - when "+" - while bj < change.position - res << (string ? src[ai, 1] : src[ai]) - ai += 1 - bj += 1 - end - - bj += 1 - - res << change.element - end - end - end - - while ai < src.size - res << (string ? src[ai, 1] : src[ai]) - ai += 1 - bj += 1 - end - - res - end - - # Given a set of patchset, convert the current version to the prior version. - # Does no auto-discovery. - def unpatch!(src, patchset) - patch(src, patchset, :unpatch) - end - - # Given a set of patchset, convert the current version to the next version. - # Does no auto-discovery. - def patch!(src, patchset) - patch(src, patchset, :patch) - end -end - -require "diff/lcs/backports" diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/array.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/array.rb deleted file mode 100644 index 663918a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/array.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -require "diff/lcs" - -class Array - include Diff::LCS -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/backports.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/backports.rb deleted file mode 100644 index 6543c8a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/backports.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -unless 0.respond_to?(:positive?) - class Fixnum # standard:disable Lint/UnifiedInteger - def positive? - self > 0 - end - - def negative? - self < 0 - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/block.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/block.rb deleted file mode 100644 index 226ed6f..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/block.rb +++ /dev/null @@ -1,37 +0,0 @@ -# frozen_string_literal: true - -# A block is an operation removing, adding, or changing a group of items. -# Basically, this is just a list of changes, where each change adds or -# deletes a single item. Used by bin/ldiff. -class Diff::LCS::Block - attr_reader :changes, :insert, :remove - - def initialize(chunk) - @changes = [] - @insert = [] - @remove = [] - - chunk.each do |item| - @changes << item - @remove << item if item.deleting? - @insert << item if item.adding? - end - end - - def diff_size - @insert.size - @remove.size - end - - def op - case [@remove.empty?, @insert.empty?] - when [false, false] - "!" - when [false, true] - "-" - when [true, false] - "+" - else # [true, true] - "^" - end - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/callbacks.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/callbacks.rb deleted file mode 100644 index 2c5a779..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/callbacks.rb +++ /dev/null @@ -1,327 +0,0 @@ -# frozen_string_literal: true - -require "diff/lcs/change" - -module Diff::LCS - # This callback object implements the default set of callback events, - # which only returns the event itself. Note that #finished_a and - # #finished_b are not implemented -- I haven't yet figured out where they - # would be useful. - # - # Note that this is intended to be called as is, e.g., - # - # Diff::LCS.LCS(seq1, seq2, Diff::LCS::DefaultCallbacks) - class DefaultCallbacks - class << self - # Called when two items match. - def match(event) - event - end - - # Called when the old value is discarded in favour of the new value. - def discard_a(event) - event - end - - # Called when the new value is discarded in favour of the old value. - def discard_b(event) - event - end - - # Called when both the old and new values have changed. - def change(event) - event - end - - private :new - end - end - - # An alias for DefaultCallbacks that is used in - # Diff::LCS#traverse_sequences. - # - # Diff::LCS.LCS(seq1, seq2, Diff::LCS::SequenceCallbacks) - SequenceCallbacks = DefaultCallbacks - - # An alias for DefaultCallbacks that is used in - # Diff::LCS#traverse_balanced. - # - # Diff::LCS.LCS(seq1, seq2, Diff::LCS::BalancedCallbacks) - BalancedCallbacks = DefaultCallbacks - - def self.callbacks_for(callbacks) - callbacks.new - rescue - callbacks - end -end - -# This will produce a compound array of simple diff change objects. Each -# element in the #diffs array is a +hunk+ or +hunk+ array, where each -# element in each +hunk+ array is a single Change object representing the -# addition or removal of a single element from one of the two tested -# sequences. The +hunk+ provides the full context for the changes. -# -# diffs = Diff::LCS.diff(seq1, seq2) -# # This example shows a simplified array format. -# # [ [ [ '-', 0, 'a' ] ], # 1 -# # [ [ '+', 2, 'd' ] ], # 2 -# # [ [ '-', 4, 'h' ], # 3 -# # [ '+', 4, 'f' ] ], -# # [ [ '+', 6, 'k' ] ], # 4 -# # [ [ '-', 8, 'n' ], # 5 -# # [ '-', 9, 'p' ], -# # [ '+', 9, 'r' ], -# # [ '+', 10, 's' ], -# # [ '+', 11, 't' ] ] ] -# -# There are five hunks here. The first hunk says that the +a+ at position 0 -# of the first sequence should be deleted ('-'). The second hunk -# says that the +d+ at position 2 of the second sequence should be inserted -# ('+'). The third hunk says that the +h+ at position 4 of the -# first sequence should be removed and replaced with the +f+ from position 4 -# of the second sequence. The other two hunks are described similarly. -# -# === Use -# -# This callback object must be initialised and is used by the Diff::LCS#diff -# method. -# -# cbo = Diff::LCS::DiffCallbacks.new -# Diff::LCS.LCS(seq1, seq2, cbo) -# cbo.finish -# -# Note that the call to #finish is absolutely necessary, or the last set of -# changes will not be visible. Alternatively, can be used as: -# -# cbo = Diff::LCS::DiffCallbacks.new { |tcbo| Diff::LCS.LCS(seq1, seq2, tcbo) } -# -# The necessary #finish call will be made. -# -# === Simplified Array Format -# -# The simplified array format used in the example above can be obtained -# with: -# -# require 'pp' -# pp diffs.map { |e| e.map { |f| f.to_a } } -class Diff::LCS::DiffCallbacks - # Returns the difference set collected during the diff process. - attr_reader :diffs - - def initialize # :yields: self - @hunk = [] - @diffs = [] - - return unless block_given? - - begin - yield self - ensure - finish - end - end - - # Finalizes the diff process. If an unprocessed hunk still exists, then it - # is appended to the diff list. - def finish - finish_hunk - end - - def match(_event) - finish_hunk - end - - def discard_a(event) - @hunk << Diff::LCS::Change.new("-", event.old_position, event.old_element) - end - - def discard_b(event) - @hunk << Diff::LCS::Change.new("+", event.new_position, event.new_element) - end - - def finish_hunk - @diffs << @hunk unless @hunk.empty? - @hunk = [] - end - private :finish_hunk -end - -# This will produce a compound array of contextual diff change objects. Each -# element in the #diffs array is a "hunk" array, where each element in each -# "hunk" array is a single change. Each change is a Diff::LCS::ContextChange -# that contains both the old index and new index values for the change. The -# "hunk" provides the full context for the changes. Both old and new objects -# will be presented for changed objects. +nil+ will be substituted for a -# discarded object. -# -# seq1 = %w(a b c e h j l m n p) -# seq2 = %w(b c d e f j k l m r s t) -# -# diffs = Diff::LCS.diff(seq1, seq2, Diff::LCS::ContextDiffCallbacks) -# # This example shows a simplified array format. -# # [ [ [ '-', [ 0, 'a' ], [ 0, nil ] ] ], # 1 -# # [ [ '+', [ 3, nil ], [ 2, 'd' ] ] ], # 2 -# # [ [ '-', [ 4, 'h' ], [ 4, nil ] ], # 3 -# # [ '+', [ 5, nil ], [ 4, 'f' ] ] ], -# # [ [ '+', [ 6, nil ], [ 6, 'k' ] ] ], # 4 -# # [ [ '-', [ 8, 'n' ], [ 9, nil ] ], # 5 -# # [ '+', [ 9, nil ], [ 9, 'r' ] ], -# # [ '-', [ 9, 'p' ], [ 10, nil ] ], -# # [ '+', [ 10, nil ], [ 10, 's' ] ], -# # [ '+', [ 10, nil ], [ 11, 't' ] ] ] ] -# -# The five hunks shown are comprised of individual changes; if there is a -# related set of changes, they are still shown individually. -# -# This callback can also be used with Diff::LCS#sdiff, which will produce -# results like: -# -# diffs = Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextCallbacks) -# # This example shows a simplified array format. -# # [ [ [ "-", [ 0, "a" ], [ 0, nil ] ] ], # 1 -# # [ [ "+", [ 3, nil ], [ 2, "d" ] ] ], # 2 -# # [ [ "!", [ 4, "h" ], [ 4, "f" ] ] ], # 3 -# # [ [ "+", [ 6, nil ], [ 6, "k" ] ] ], # 4 -# # [ [ "!", [ 8, "n" ], [ 9, "r" ] ], # 5 -# # [ "!", [ 9, "p" ], [ 10, "s" ] ], -# # [ "+", [ 10, nil ], [ 11, "t" ] ] ] ] -# -# The five hunks are still present, but are significantly shorter in total -# presentation, because changed items are shown as changes ("!") instead of -# potentially "mismatched" pairs of additions and deletions. -# -# The result of this operation is similar to that of -# Diff::LCS::SDiffCallbacks. They may be compared as: -# -# s = Diff::LCS.sdiff(seq1, seq2).reject { |e| e.action == "=" } -# c = Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextDiffCallbacks).flatten(1) -# -# s == c # -> true -# -# === Use -# -# This callback object must be initialised and can be used by the -# Diff::LCS#diff or Diff::LCS#sdiff methods. -# -# cbo = Diff::LCS::ContextDiffCallbacks.new -# Diff::LCS.LCS(seq1, seq2, cbo) -# cbo.finish -# -# Note that the call to #finish is absolutely necessary, or the last set of -# changes will not be visible. Alternatively, can be used as: -# -# cbo = Diff::LCS::ContextDiffCallbacks.new { |tcbo| Diff::LCS.LCS(seq1, seq2, tcbo) } -# -# The necessary #finish call will be made. -# -# === Simplified Array Format -# -# The simplified array format used in the example above can be obtained -# with: -# -# require 'pp' -# pp diffs.map { |e| e.map { |f| f.to_a } } -class Diff::LCS::ContextDiffCallbacks < Diff::LCS::DiffCallbacks - def discard_a(event) - @hunk << Diff::LCS::ContextChange.simplify(event) - end - - def discard_b(event) - @hunk << Diff::LCS::ContextChange.simplify(event) - end - - def change(event) - @hunk << Diff::LCS::ContextChange.simplify(event) - end -end - -# This will produce a simple array of diff change objects. Each element in -# the #diffs array is a single ContextChange. In the set of #diffs provided -# by SDiffCallbacks, both old and new objects will be presented for both -# changed and unchanged objects. +nil+ will be substituted -# for a discarded object. -# -# The diffset produced by this callback, when provided to Diff::LCS#sdiff, -# will compute and display the necessary components to show two sequences -# and their minimized differences side by side, just like the Unix utility -# +sdiff+. -# -# same same -# before | after -# old < - -# - > new -# -# seq1 = %w(a b c e h j l m n p) -# seq2 = %w(b c d e f j k l m r s t) -# -# diffs = Diff::LCS.sdiff(seq1, seq2) -# # This example shows a simplified array format. -# # [ [ "-", [ 0, "a"], [ 0, nil ] ], -# # [ "=", [ 1, "b"], [ 0, "b" ] ], -# # [ "=", [ 2, "c"], [ 1, "c" ] ], -# # [ "+", [ 3, nil], [ 2, "d" ] ], -# # [ "=", [ 3, "e"], [ 3, "e" ] ], -# # [ "!", [ 4, "h"], [ 4, "f" ] ], -# # [ "=", [ 5, "j"], [ 5, "j" ] ], -# # [ "+", [ 6, nil], [ 6, "k" ] ], -# # [ "=", [ 6, "l"], [ 7, "l" ] ], -# # [ "=", [ 7, "m"], [ 8, "m" ] ], -# # [ "!", [ 8, "n"], [ 9, "r" ] ], -# # [ "!", [ 9, "p"], [ 10, "s" ] ], -# # [ "+", [ 10, nil], [ 11, "t" ] ] ] -# -# The result of this operation is similar to that of -# Diff::LCS::ContextDiffCallbacks. They may be compared as: -# -# s = Diff::LCS.sdiff(seq1, seq2).reject { |e| e.action == "=" } -# c = Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextDiffCallbacks).flatten(1) -# -# s == c # -> true -# -# === Use -# -# This callback object must be initialised and is used by the Diff::LCS#sdiff -# method. -# -# cbo = Diff::LCS::SDiffCallbacks.new -# Diff::LCS.LCS(seq1, seq2, cbo) -# -# As with the other initialisable callback objects, -# Diff::LCS::SDiffCallbacks can be initialised with a block. As there is no -# "fininishing" to be done, this has no effect on the state of the object. -# -# cbo = Diff::LCS::SDiffCallbacks.new { |tcbo| Diff::LCS.LCS(seq1, seq2, tcbo) } -# -# === Simplified Array Format -# -# The simplified array format used in the example above can be obtained -# with: -# -# require 'pp' -# pp diffs.map { |e| e.to_a } -class Diff::LCS::SDiffCallbacks - # Returns the difference set collected during the diff process. - attr_reader :diffs - - def initialize # :yields: self - @diffs = [] - yield self if block_given? - end - - def match(event) - @diffs << Diff::LCS::ContextChange.simplify(event) - end - - def discard_a(event) - @diffs << Diff::LCS::ContextChange.simplify(event) - end - - def discard_b(event) - @diffs << Diff::LCS::ContextChange.simplify(event) - end - - def change(event) - @diffs << Diff::LCS::ContextChange.simplify(event) - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/change.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/change.rb deleted file mode 100644 index 714d78c..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/change.rb +++ /dev/null @@ -1,174 +0,0 @@ -# frozen_string_literal: true - -# Represents a simplistic (non-contextual) change. Represents the removal or -# addition of an element from either the old or the new sequenced -# enumerable. -class Diff::LCS::Change - IntClass = 1.class # Fixnum is deprecated in Ruby 2.4 # standard:disable Naming/ConstantName - - # The only actions valid for changes are '+' (add), '-' (delete), '=' - # (no change), '!' (changed), '<' (tail changes from first sequence), or - # '>' (tail changes from second sequence). The last two ('<>') are only - # found with Diff::LCS::diff and Diff::LCS::sdiff. - VALID_ACTIONS = %w[+ - = ! > <].freeze - - def self.valid_action?(action) - VALID_ACTIONS.include? action - end - - # Returns the action this Change represents. - attr_reader :action - - # Returns the position of the Change. - attr_reader :position - # Returns the sequence element of the Change. - attr_reader :element - - def initialize(*args) - @action, @position, @element = *args - - fail "Invalid Change Action '#{@action}'" unless Diff::LCS::Change.valid_action?(@action) - fail "Invalid Position Type" unless @position.is_a? IntClass - end - - def inspect(*_args) - "#<#{self.class}: #{to_a.inspect}>" - end - - def to_a - [@action, @position, @element] - end - - alias_method :to_ary, :to_a - - def self.from_a(arr) - arr = arr.flatten(1) - case arr.size - when 5 - Diff::LCS::ContextChange.new(*arr[0...5]) - when 3 - Diff::LCS::Change.new(*arr[0...3]) - else - fail "Invalid change array format provided." - end - end - - include Comparable - - def ==(other) - (self.class == other.class) and - (action == other.action) and - (position == other.position) and - (element == other.element) - end - - def <=>(other) - r = action <=> other.action - r = position <=> other.position if r.zero? - r = element <=> other.element if r.zero? - r - end - - def adding? - @action == "+" - end - - def deleting? - @action == "-" - end - - def unchanged? - @action == "=" - end - - def changed? - @action == "!" - end - - def finished_a? - @action == ">" - end - - def finished_b? - @action == "<" - end -end - -# Represents a contextual change. Contains the position and values of the -# elements in the old and the new sequenced enumerables as well as the action -# taken. -class Diff::LCS::ContextChange < Diff::LCS::Change - # We don't need these two values. - undef :position - undef :element - - # Returns the old position being changed. - attr_reader :old_position - # Returns the new position being changed. - attr_reader :new_position - # Returns the old element being changed. - attr_reader :old_element - # Returns the new element being changed. - attr_reader :new_element - - def initialize(*args) - @action, @old_position, @old_element, @new_position, @new_element = *args - - fail "Invalid Change Action '#{@action}'" unless Diff::LCS::Change.valid_action?(@action) - fail "Invalid (Old) Position Type" unless @old_position.nil? || @old_position.is_a?(IntClass) - fail "Invalid (New) Position Type" unless @new_position.nil? || @new_position.is_a?(IntClass) - end - - def to_a - [ - @action, - [@old_position, @old_element], - [@new_position, @new_element] - ] - end - - alias_method :to_ary, :to_a - - def self.from_a(arr) - Diff::LCS::Change.from_a(arr) - end - - # Simplifies a context change for use in some diff callbacks. '<' actions - # are converted to '-' and '>' actions are converted to '+'. - def self.simplify(event) - ea = event.to_a - - case ea[0] - when "-" - ea[2][1] = nil - when "<" - ea[0] = "-" - ea[2][1] = nil - when "+" - ea[1][1] = nil - when ">" - ea[0] = "+" - ea[1][1] = nil - end - - Diff::LCS::ContextChange.from_a(ea) - end - - def ==(other) - (self.class == other.class) and - (@action == other.action) and - (@old_position == other.old_position) and - (@new_position == other.new_position) and - (@old_element == other.old_element) and - (@new_element == other.new_element) - end - - def <=>(other) - r = @action <=> other.action - r = @old_position <=> other.old_position if r.zero? - r = @new_position <=> other.new_position if r.zero? - r = @old_element <=> other.old_element if r.zero? - r = @new_element <=> other.new_element if r.zero? - r - end -end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/htmldiff.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/htmldiff.rb deleted file mode 100644 index 9073243..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/htmldiff.rb +++ /dev/null @@ -1,160 +0,0 @@ -# frozen_string_literal: true - -require "erb" - -# Produce a simple HTML diff view. -class Diff::LCS::HTMLDiff - class << self - # standard:disable ThreadSafety/ClassAndModuleAttributes - attr_accessor :can_expand_tabs # :nodoc: - # standard:enable ThreadSafety/ClassAndModuleAttributes - end - self.can_expand_tabs = true - - class Callbacks # :nodoc: - attr_accessor :output - attr_accessor :match_class - attr_accessor :only_a_class - attr_accessor :only_b_class - - def initialize(output, options = {}) - @output = output - options ||= {} - - @match_class = options[:match_class] || "match" - @only_a_class = options[:only_a_class] || "only_a" - @only_b_class = options[:only_b_class] || "only_b" - end - - def htmlize(element, css_class) - element = " " if element.empty? - %(

i0 z{cET%fn-0Qo7(#^@P}S?j1O0PKf}T|Y3~DlbK2P6nVYi0l4W!JbQ~S!tsb=^0siZAF`Hzp) zP0Ponu~E|6Yo^)S!j0j@gMGNo!={uH8?Vd7YIqlvfY&@ge0$9V*5%p?Z$Vib0PS_x z!n#~vT~l!+^gclOjA(t%?)85J>NbUpBcxGp%-Ob@HwHlYR6?36*{FgSHMw$S{vi?X1GZW?elj8UoC|B*Bx!jK?6z9?H$49W3W~ASLV+$L57_!Y zNM@p|h}R0?G)ZcO&;*`FfUOV$UlIi@Nw~PhZ4zLwM5G&dufpmp1 z7~Vk=)(YWZkb?lfLYV7IxcLg<1|R-cD}-dju}(={vHb)p%3W zyiY<0!sw)OOK+T#cgMjPtD?>gu*-B3YS)PNx=m8hn8$|ylyY57zfICYbvzzLj|QwV zrcZRaW}*(NjBZKMjf7Nb=~hsPRlBY55-=na7Voa2ai zJuTUuDp_?>p1FhIFX8wM$Xo|erx)G@WG;p12+~f(B8Y(?yNEai;xLerKtUgf90xoI*w$u8>sIH-vewnFz{s}@ujr>Xba)gr~AU&N5b;yp&&y5J?1Ls zdIyc8)hfxix#Blf61mDD@QnltiZPd&0Cfyt?KVheqvupM++?*R~ad z*-UqbEqZoIJf6q1OMx(BhN0=vs_^idt6Rbg*2ZXqMno3sb@}wTn4`p@+s`O31 z)qD^tY$24^{BQ*Jk&tTMl9Q&ld%M#Dr0KtNWjoSv&3DJbd?a8R2fmE)rM^3z_^E*P z$$=-Sm8#DQ-~AN}nE##%|2)9__d<}RfR!R7P_#t?X(|2&?=lIi6nBH%33%VS-Eh?YynK>l$Z$@X?As?LOQ(kH6=K={hpfK~*$0VS zq~A+Z_A@1+?E5JDYC>BP;#9ELbU~yj+EpTe z{F{^hN3mXJaLP<}4BVzej`7dAI!~ce=3hi@PeRo|=3|JXKt=3)4wJK`~~O%b_j?Z1f6}*(hKQodRZ{mz9bPbO-#mNk$uvfis_CwHw_k$!I$9 z2>cHN=DM$fybPG@h6D;*B#>I}6L>$8uq^i@$oGJE-Oj$Wo477L&d~ociY9w{f7e8z z5(Cm1<(AH$lHX#|kQ{xSvw$WZ)yAo%aFpEb!vRyVMA0@#EN^bdICfC82$F?~C>j|4FH`K0JUrk=*Gdm0g`7^4V#k4toH>c%o zR+IcP7Vz)p+R#l$W#fca3ytcx#&DPBG@Y*4Spn=>`U;F|4r9o+$@QhVtu?uBx;=>j zHVMBp*I!bLp%((Su)8!jL>WE-eVf8`f!d|H1GS#stuL=efbIEhp3B|bIlJ^mK0TN) z3A(Ok`EL`w7O*eJFVESPXdQQ;(Ev6NzrxM1M?>$gFbyhK=Ij%N>!2?KI@3U+?`AUn zo;hi1bbZd07XqPt2) z2j7OnzYpL}h#uVEF~w29@?J_OL|>GUPKb^{U=&~{L<47TOBsJcbPlYuft>Efxdh|_ z5jr7yE67R_S3*1pazDWS%E|p*wmKmi<$vDAQQzUjZsv@k1`~G930QGAkb86XX~j!O zKLa$G&{Sb|n&(I8ZvcBy|7bs#67$Ryb0P5qxk56F@@c4Uyi>&QztF(nfC!wK6bosj zgJFAk+lpU3O5jgYEaeYP?OT83*Vo z?Z%Yl`LtXC>+WJBO4#~zm9QUdCm}NvC@p(>qfDljv=b_>pDorah)he^E`|SM<&|IW zGda;!NN(w6I-OM76{ZXOJIPFnIhvY#ESFuaw04H=deXU0X>B5u{H4%0L1+~McS$HY z%eQs)CPg@b_ljhd57%!9wW<~VxewPSz^*RbZvt2!CiRowJkP_(jxiqgHlih7{o;Fk znU!V!p8hU4-JICtLeCfVs^`6x?NED`%x3BF5q;eAxl;8=#o3BAE~cG+3zLH zbN1U6@m0CfolhcdeVMNBkbfa<`!aoJh;4z5U#6b}bt+(Arau94zX*Mqp2q0Q^pw~h z;!jw96q~+GPh<3DdOy_f4%nCJOF+&Lp)b<|TY<@1WM8JgOw@ybeVM*3Ro))3FVoKk znI=MCrvC!+l?Z*AesF)fQNX@TUj#BAurJdWg6OeJF}49|fdTANjEDMjXa=xLF;AH{X`_hp7xuTXNJq!j zQZ_j@PG#wE+&_IXI0ek{id>^1CzF*9$Nhx(_kbOaYcPP#C%_KJ1);17rHA9TA-)q} zhvSBT3sEMJ^yp54z5S`xL+q$DIeV*u>osySF!D99@81d{?e{?>T6uk1(!-Z5d!gY~agA z0rT0|5PQ8!qapSI_*X0WqCuoEGEICXK^j(DD{&30&%(48=&vj10$(mNK0lPcL-bof zL4h`&egU-}u<`U~kpGC#cv>`&o)S{%h04re;hyPizkB+?-}?@rQ&rf27y~nrKGWe0-S^?G#-$X2LOI-Ogf4>sw5J z#WdF*7BM4~K(h%^Jm1ZYnoSgH+m+3Z6#HG8ST;&P^FM&+J=n}&)J#cX1WtM z9_6+_mCzCHCl{Mdj^fci&C202#2}a4HED8#a`pqv5*qA(!?FI+^qjqnG4ih)Mx&3O zxaMK%!d@5j%Gp(uRa99+pqxv2oqRv2oq^67)I1+{doQzHu8n&y(|V1i6jfZp@R9TB zXCpDkFxk79y%FCFuy-*>gB%6eyO@q%AdUitmF-EdahVJ69Kgn!OF%9H^1Z#_rtf0< zNHp2k$JNK+cc5_Sb^JiVi?Hxk%e{8dOP2O#pYRJrqfG_b=Yx6PKJA@-R+9O30QTA1 z+2=*5=Yh`OAaon-W}mHteJau*z+NO|Tpc_Fy&7o7IxU+kxdXP&s}ua}H2B8NjtV*Z zM)?C+UI%Q~W#ImB@x;+{aK0no-XUK5MA2XHaD!OA-JJ|Iu$-fCy z4TrBv2fFgzJ-0i^bwJV5`{w1{C6I>Bh_=H2x_Di_!k70UG5Mc9O5j5S*rR+Xs(zBx z#ZhJ2HT<`CKPJY~CCQaEUVtuIH2nuXegJIOFz_YDmoAi&-D!D%ZAb;4LbQUk(hVtn z!CfD)3g`gRP6ApS1%WyykQ%)=@!Lv3Mjs3^2+&hB5rfR}MdkFQG_K4g$4X<}{%|0C z`%7>k#5j<#K$UKP$S?F#pRAJs^u;Z+TsvfBo_nj0&P4xJq78HT$qPwGo;!;)rUM1V znCD&qwHUB{!yuW98srJWTZcml{rkbEcME5^O&GfuHFMuQ0IqpgFytk zsI(HKF;J!R!}&YCRIPKv$@jIK@jcSm+!_Dt<2O2^YGei_s6VMbYZU7j!*6?xO8dq8 z&-UZSmsuN-yP-q}p#4}x+G@l<5NdzGUd(UE+Q2^ndMwbnh)K=TGl-lOeV?@@+Svr3 z4s1VmZ1h96Og79c-KSU85i%y5A?{za{&afF?U4RHTe^&}YY@2#Xm?=N!gN=7X6e37 zbSs!=xsB*sfP5dHmc|7Yvd}?`E7nybkiZS}732<{ClfUxllX^h{b{IapF%!D8V>>m z#n`8iZ$rHf*r$*|GM}d5Ro17F2PhFuSHFS%UqDp6tItWFJQk1hguaVJ(}O&z(ODJd z&ets6$Mi*09q~C}luJL3?kK>uAzO9bnPj39Zkateib5s@#pHB6tPLS806Vh~B(u?D z#4oQJAvv8{*b$E2KtbVlX5kR11A*iapPSAsG>2bWF}X}8_;8(B*ula#IkT|P7v!(b zEF9zG;wWI1u0&DnPqm3eCU|cItRr{;WHmtD-r{q! z!>H%^Lb#70kHO;}OqJ2yyz#%Y#dFRkkrRk|o&?qc=3jv?n@R)?lIM$8orQ?}>vPyY z1ET&)`?1s@KNYB~XJbqD7vg^ex_3b!uw+t<%@li*m&$jRCR#H#972Bp*qSkjz6e@IU3|7VUY22$ zs~dbo_4zb!7hy-q&h~jdx{fUBFCe2e)`u-Q%w>6H+K079($)rRvbLRk5LxaA(1)$b zwpJfD4QdKteb}R}4_gF1S7BPjJeIX19FIZ&1F#PrAIsX-=(o@tfX-)O`nBgEpo!nw zZ2ofeDBY8y0_F5}YqKQ^>IK;i*nZ6MM@P?Oi=>?$XH~aUeYjJe4~9uCUYo6WZ4p(Y zFSPeVW*?xS80(fMK}`UPdwVJCVpe&=bupz6KE>Wjnrgu6xoo2Nm2Bo0~e?q(n@+>fYV#tFI!wzNGRLC8HFYfOn?KQ~W zp3twjFC=euF-~GGzB}8;s!P1p$GUFOzV|H5i3+XT6LiMX(j5cVNd(6179wdUQ3-Ej zz&eS}ARPgcdDrJ=okSO3f{mTTSE({bN$IDv#mmnn5p@zfl0YB8I*GuSjRF>wrjvL_ zN~@DN5cd6*uXPgtP7N}Pv_mIx4Dn-?tU8Inl1Z_;K3zJAG15ex#A&e42dt9_BDqu~ zXp(jkOW{2q@SVi6;3-kSHt!^s!F)Afoy2V*x0tkh`%s*U2P|Y5znRT1I1eQ?k$w!3 zM*w^K5ID0@z=BLVseTRKSH!P*W8liCSjr#XKCFZH6Ts$=KY{!xVNI}ua3RHla5|SP z?8V>@n0GV-sRZ;S5Bf^d$X`QQaBQ7_jgpY6`o~p1f;R?H@zdTO_D=A%+Qdhm&=(cS zkDllc@vF&)Zy@Fno2%8y)<561C+3F5&3(9avVHrZp}Jw)!>Sw2=w1cqE!lXDpO0Q= zWgx6ZUpv}M!&|cLwVduj`8ok~xwmAi)#V-zbr4X_0{gbC9nw1qa+U=h7u}wU*ed9XoQ+PiH%nkkn@`Hrs20^4a#e#6^2FWnGe!$$I2}mPA zk1db>^d;dnqDpdSwnclaYRjXJ@U;U9im~Odr`G$D^WK1)TA${*{(5Syt%-^> z#a0v`z9`#e?S&LgJ?fDpb2wnlC-7w=@ukgYF7YP;)_ej_QY%%d4u9xHFNgP1z?#p^ zAb*#znokfeN--yjX~X3~tKq#5u;%j|$TNT*Yd%}~lEhJWmE_WF@lhAStKEfn;d>h> zD8`!4mr$Pr)_j5_`(i2^&1bMA)qH+|=O@6LPk*1o=FO*%5C5y?Q)drS8Ih_Muwtip z6ko{gJK08jmDN971y4kMP zt%H73VVXIg=w{As_GLW@*ly=ZS^EHNSLmG;rtaWm*XAccAE7Yy3UgeWy%_pJ?)Gg6Wb56#iwP9n_LR7 zTy_9_{eXggs?A(>U#PtSbJ-x7jdoYraM@pF1G(%G@Ei`9%O2u$NL)tg;kuW6_+Pnf z(HK&Zh4jSHfim)fY}KgC$Y45AQ%U?dprDxCJVMTbS_qhGL6S=%q+0zTmXNIHZZK5m6}n% zm=~X(E&WW!X#HdqbtR3?O0*%wjv#$S6d?8j*+azdq%a<2G?1L@lNwo<6&Q(VIB}m{ zFfiw@^szV9b1`lSH5WaS&OS<0%s-u=n_`~qBj%K`!lj*SOh=-)w=b1um{H{&CBz(Q z-9tPIF8BKHNVh%cUjL1C{lE~ty&IpkTgvEGenWbg$%WsJ-i8o8aZU3pe77Pa9e^AZ|rKem#DpE&Xn8f#K4IK|3hx7U@@?y^ zeZsiye%xycSl_vI);?i868d1E$vt^y$F5I27y3-V`qR$Nj`u*{B)%z)NW}G%-$1Wd zn11=7OSb+BlxoZtZ+*ai8)~LkGh;un6L-#54Zji>()M39Je`4petO3Yw-3}%AUWMj z$#Bi!ms8;a$wfX~cI#{5o7nByW1LM=yGaN|zJHn_#*5~7H${TmWRv+dD53)_$CBkZ zzz(o11vv-Uc!1?Gs0S5&1iUGs11u>qs5YSkEMLI?iDYzuB_(u#r7qLyV!#ft^aANB zLI+qvY6U512Ux}ubtqs5Sk4DIQ^bAnJ_vG`h$kSv0$DFY2UzMc^DP1F081Z`9)KNS zS>>&hf6^o22#GbyjlZs9Clep_=Axy^T-~ze)2~8L9h*3m1P=o2=LP~_Ch7#A?yG!R zX4SHPCOlICcN*~}pI{sXj7hmYIyP~*64$Yb^AR`~u+xZvGql>S8(M5X@@{%@6~-PZYQTKa(1F8!g(NTrVtqAx_qN*_3LQNU6eU-}Bz%K>9Q2LRZm41#C)P#GgkBC#ONCG_Z4%w0sbS*ZM*^6ZM1Z+Da z$Yi&WNoO^O!F!1KwVe_8^C{+XpaQ~pcpSVF0UHnJg3OVyCgMT3kYYhN9S_fgcd>-^ zYHS(E)qtMlDqlMN9^PciLVsevi5GLfdT16}jGSw6^eOKzagtH~y;`C{tT?+N#7Fft ziEeCN^6l*9>FMqMF`mp@=DXU)Zp-&h6uK3#Zne^NtItBO1#FDD+b0o6Gd0FkW~;2L ze4qHYfPzA;tBgl7{UaoK&`YSR+@0*u(G8=|`3Uuu<1Av6zH*(9PW#F*##AZa2*4TsfLejp8J%n8%aGj~T6p=MRhQ8S4IFl&*jCM)@&g zE9RyYr4eA`#X`>>+s_HdKV=#%SWb;ea}EU4)~($P!FIoDGX zoKtU(l0H6MzL_VT%_f0|`RLR)C4|_=zCx7Tb|z-Y?N;phSKi1A8W&EJ9v<~R$VW7M z!17i*CoBGOkAbc;7|wL9LvyOr+-M1%ik=DXAMJJK3hy5OaP9RH3bhEZPVD}Sy=i|O z`XPmBt^Gj8-co%6{ZGK!^+i6}IJz^B8uw?a4klSMUG`AAGWZILG1IjsqzXu`^-?P9 zR`3VYsUOuN(+#ljO`7#DK6*3L6+i65?QWk9p3u@Hs;?hty~zwP)la_1SPtY_v+E7s z05@gq*8;akwO&9;E85mgnRaS3heGcIxJj>1f-|e?IaX$pJ+AkKJsX|{KtVB9*p*N> z0?7g|rNUOgpLSvw_z0D@yG3kL+E;vZT3XdG%2#MsbA^v&gUqSY(&lj5IMiOI&1eEo zF6H(`k2IfKF4Z-oc?bTt05_w##wW}xLXYLWl;(5WU^1K0e1X7vz-BaoGqwf^7(G)SXCV$zIoF8f9TOKOGOx7@(jStGaWbv@e?c%S);1o~7t%)&1@xRCQlk z#3ohO<$sMo+Lm|EK&Ofuf0mQsHGqvj4b$-_V2PK}_;Zz1*L_U4!+$GaWiO~4-PY}HswDD&H$d@8C{`>~=3lR0}u<7`-yoe#*8Tu%f^P66QxTfXJ7 zjBVVlguV{2imM#w@{Oa5)Hk1*DY@(KzT)12M{lGGim{6O4N7mKl6GE76}JF>bue=X z@9x7@Z&zCQ{#r}s@ActnTN5`LEO-(h@^P8y@6zC$Oy+lKa4u0*qgY1)1;ykpC8QUW zjyVjCC3IdUdG;m}s{cHDFo^5{RQ(EHrWGNRp(X;EB8bHx zXNmZR=<7h10XD#fG_z^yVSuf3aa`vfrLO^YHT?GhHoyj%B$bhhdeQ-QExbbIs&v_!s5A<@fzv^V;zES;g z6?}kZ9v3l{(6iY6qo+RQ7T>gIXX>d}ejnA|04fxb^Xzf79Znmclqt@fM{wZ?#DRiB zb5|154XQI>FK2>OHri8C<10T{&g=otKuIdbUd|j1H3qPkGeI(mMiIZfYEQ{& zB0C?BlO(5b^T%tTt^|@sUPt+31NdFp@lzizd-SyMP5P0=K6;~D+FZfzW}4#TI9lSd z%3v>l?r9Y{-vzjrGrHqb&tJZrsiU>xAkPt}n3F)=iJ6ABPJEo?^wSBpP7M6nE%?)Q z;;Zn!EPkyM1AjinLi*`C@nd*D1ZpBUa#u#l~8_mr58#{p~L))cgxs zo9+~6>?Zy_DcC^3IihEeqhClOF7YOrM*OirL7`@n^Pm<1$sjMG+FV7_sU!Mu)#hs! zzKJ7-S@q^7ssBw~_Q~vGrO{g7@?7Emq55ridDXv-ZQ^|^3j7Ty`8Rg_HnxekeoO5W zz$Osi#kLyx8TvcGCI(0OWaH>7)%tgF)vI^-j=0GfIz6DE7%S#>P(6Xx(qFTdYv8{M zuvtrxsgue$3DvOQ7PuAOl>q(D=iVw|)?(F_Xh%kmYX1sy@wK17!H4Vglfsrl*Z;GU zNrrjw{5_pm7xxbjKJISs!EZPZewbYE2dwce^z3nTWQO$KLOV?l-Xs1EprBCm%0Hog z1Cn#Sg!I~$q|w0^dr6ItkXw$hh)vw`W*?oprC%aO_1|mCq|cQ9aDdagTdMq+RVc6h zqt&tPA2nfy-vF@vqt&tPAN7RprZ9bdM?xAehCvSj+=9v{8%Gb2aQr}=>`$^*(24LI z1r!ux1w9w)Y#{m8OR1n$@VkQYvrB*a2o-cki`b-~`Vmb%wF^2Ny13X!{80*3zk*WV zZlzu`RP1=C`$v^+dyg;8?XmTjE6`^-U>8l?9@{UMJP!Q;VAc4zPa=+9RW;s;^Q#&^ zC;nrgpinDa$vA8RB(Hl3mG0NHbeyjH)JLdvP0?esAyMc1^wcih0Sc&pd1Fo(S%H># zo^2G)6W4qj3UqyJS6j42g;szmf01X8qcu|gMz4H-;&s(xL7}GnSg0d_9|gfDZj7h*;pGl-|K6mCbl)?JXAOVFy-w~smd7LBIU34 z%3n+TRX{9{`eZwUnPh(rUyr2%lL?_X{k16Sq2ZbKTuuTvUI3mgC8$dTY&) zlaG+y_qK>lbRXuUx3v585>|_*{I|Y;=xi=S+BNO};gvtjwSsC?=n9zfKX~>yI#bFo z^2!e*elSo_s3|`c>Np_z!%Il{4Yidot)+Ykd2Z(M&Hi8I?=Isf=uG+kzDpRLD&Jx? z%B$l#F|Kzxq35B(Lclt%6XTZJ_6{pMR>$=<^rt|t(|nRGeUcxbS(7uU z>p8J~JydxNl>#J-JfkiMf6UZ3f68C&!>j3TsHo!X)C+x5QL#RT*Q4ugi^qFHU;OtD z*-mg$>ZGv;|5z~V{#kmm`t6(WF3ifkroSZN@P6sMr;-a!+*~w%!2l ztuU3FgjDWxpic$Lr;M2xO^ZU`kP858bv1ot2j}j)J0l%SBhwSt9P|jblDl_^?cm3~h%5)J+B?K{@MG%XgeGt>J-}n*X+{Y=eFAc>vfLnwWXiQE?qLu&S6aO>gS>Z$u901m!9zu#nm~C zx)Z5Oz|LXx1L*^7Jclt4>I6mW9L8-RH;B+Vj5J2)Fj7M2Fg}3gO|j`5MjE4Y7>$l4 zGr-Paj0PDYLgz37TR{riISgHEcsXF_FzOzM+JK$I7zZ*;gwA2S4)T-;ox|ul34;K3 z4&zXe{Qx_MF>nv7H+PZ9@#Jwd2C$1n&W2?HU>AuTJJ_+sQNXAXdvuY=a2ZV(iQEYP z^?+R@axcg#pm?emb{C19<#P-diOeIJ{BR!_PJy^9Ou74Ic-)itQY~4Y_LWr|b2`Mm z-}UsPT`QUrV6xKb_3*0vG2b;diaV%lycF}E12pN$7}dmeY41S4 z0F+NSYBpguv#6M=AqkfDP1)g(?Y(Cw=oUbc5)D~p$eN6r#7%Z5G;=9^MI9TVQ2fc|`ui}vt#osH{E4kNI>`m%PpY1*!v-#AT-Mn~ zLR;DABA?Y+fyj`(9x0;TC+Fu>tP#)FW6aT5db@YOGZf4d*Sz#N`#c({-)yYBuE1nV zfIW3L;hSwWEqxa95d~>I{bqM1^E>2sz+syDye;qSKAqQ}K(`;B#AAk7;!zyE0`q%K zk0po{uixo5f#(Up!V z+`8U7_R0Q_!v!OjQ@Te~l4S!-g^0}TiEFw%K~XgmeZ)5SW}xX5p!c1gv#!(D&xDmL zQ^@|BXV`Q23@YWWfh5w(KJ2-xt;`d3oLrzNe-|F>cyXut6{78@UA8jDn{A&k>i88E zA75jP7p08X)M8xj8GG?6GG3@c#5zFjvRi1M5w)_;R9CJLE?wqO>l*pw!r-R{^?wswFZq%_{ zMVn?NIFJN7*)2%ZY{BV@I>VJ<#As}y1$?w-C;sqYI(y<8y}g`?Yah}4dqOxoaCl#Q z{=n;`5Wxr5A4RZBZKO->_?0r;-f^_EOM_~%C$5o8&O&H!6FQH|Tm+c!?kg?-4z&X4 zS?Wd4t&e2KQ<=@i1FaaEc(}}V^Tt0lA#$hN^8D>aWGBr{8lt_->D0V1 z)5m24*TtCz+ZORw_>{V&a7jq-D{7*6O>F6PReDyuHE~Nm%JB|Lnk(_BaxA)K zw~BR5RrXOut0584)Ci>up^MBJlf+cHV*$>FPCzHHEjciy5HQnoWo@=eQ|B^9US0E2Y&wE~zt9-hEt=qsn`zzsz8l)Lm)x;JB^TpCvUUB=xea-OurUkn;9( zTDfco1m17!z}v_1mOL9Q-KVySeFN_lRa~`Gv2)5>9k+I+T`6O9a!CzIqdNs-Tq}pz z%0-V)qqhpubtT>0mp_ee9-Mwh>)+qR=ivt9L7bZCs|)=~Pfush<)n-!3B}tGx;dZMRWqJ15j^ z`nZ`<`SwAmeIv$-n{4kPtCu}xM@DsSb~^*jb*=-VkzBKEjL|H2|W ztgYF7nRf7?-PqV=BzYD(WaNdK%DdPO?kq#|<%AMxH;+VJI$-+3k5(v z(ba9#<#RfQneOfeX5TZpExn~+#6x$_H(TP{mgp&_rWup6OTFE-e zhxQgE>NtuLC(l|7)!|?l`K+_tfL-W`lT{L2nZ~WMRJT&=NFK7OT-32XIh6iab(qz~ zDXnHfwK<5wM;)J0)YWS6*{>Bf8_H6*6iS!58mv66F0=DpU3<{6^RihY+YVJ4l`HYS zd@mQNzUc^I$42>C4m&Q&pU~8lm=xt_ zJ8W{4Ke4HO3*2RECXcznRupZRn1e$*8+2LBydl@eVvk8<`#7JDy6lOCa;+`)^fb10 z@VYsYEwR|!)7TQ{Sk;SZb-D7mo+&Y4DixjkNsja!oaRTlpPa1+%)&~!TNL+s8h4AW zFQNg>Xh*q4iqjozPHvHN&i#HPhrSvCbZKCxyQs0UzOm>|JL0zBHjuoF?|_dZJld}> zL;qG{(M@?yWGg4~1if_GR`K@|H<7Kp$OH6{%_MSFD$*<-EjANr7XO@zG;<<7v{v}g zuOM0wt0%6}M!21He0(|!48RUKegN_=(DM&3V22!gXrZ%afD>i#vnQ_6?KAa;5M^&q ze@5&-K>j_?m>x$fEb$^y53L?620C(MLi*hTyI-et2BQg(@9KHdG+Jy-L(9JTySX&1 z&4I=><6b9?+llIcd`lqn0K^E8Jw-eXaT3T>Aom)?4ItNw_z>bjko$qmbr7$ByaaUD z=n*o?rdTLTd}h6SUsK9(eFpodfE}I-BFPpa>EXE_;r(9x8UX@-A;m%#>0VE6CK(Cz z!!wOR8UnT%8-(j@A)M~}w1>B?gthO}2c$Qkr@Pk0w|h&*Db~QnM)Bg(K{BeoG2R1_ z-IPW{h*2Pii6}r!0XbI0?qb<(M@9R30SIuKb-m`IX|x4RqA}uIL*EGrF<1?V!9X2Jw0T_a3J+fl6V!c zD;NS#CK6BDj(#BiTfo{;;7Mww=+aHwQQcW|tAMqmHXw}tt{ny8qAi5ec2o^-Hwmj9 z4Fu^AxTp2LIMq5|j$M6VZa9Ja!Ltuw*E9rx^8jgo&8cmqTwn(*EB4br0zmk0nc*4u4&lF=adK+^R)1_mfkOLSlXXPrJ99*=ar9B ztk@SLo{-HP^){L5c9HwZ=pTUHE)rz2TgZglMP7jQIl#VRSP!yJgubHF@2US+guY^E z1<@R^uNV#h87@L!G3X~o&IH&piF^@~GE=O0l-Jl^%5UQ%rxID*+Y_T3($@tq9Y74; z?e-8*;&1}rE7QT3uEv19ZKDVs3*|iL8;UZ;!BXv0QU~t3-L7}!++c& zQ#DsYYRS3Tln}mxVyq>%A*2P64DwQHb%Wtot79}s_V?jxbw^wHChxFk`RL8wVb_uN zAudj_N>?16NR6!&eaN~uP*0`EpXU=x+vV*SdI7px9m-we88q3@!<6A&iuM&zdy&d+ zK<;OVX&{pTv&ThVD2|?zJ$h!U&XbVraSlAE0|mvHJ#K`$4oFsbDcR#7_=7#}_TjR} zEDPVn9&h;Q&FvxWLtLCpe(=e~(L1tKE?c$wJ#VQa z;5is5D8?*x8q{1M$?g-`BTJnIzxU`UsqZ6Xs^u23iK+JS(W$A_4oJzqqi^OTv(dk# zN|G(V@1Llmn***O(@OyR>MZajQNWxsSdXvHnn*@po!t)qt$_RLtd&nZjslkVQu^xb zS_$bp`iBvC5U{V#0%vYZ8UNMU3$Q*11kUD%oTAC&FAe~NtO%V1683EV?AqZunikv10ugllejE;fhNT8r_bB={j z^MT|MpOKv7YWPDlddY{&Hy*U`O?;zdU#D2=8}4X~eTwq67sahTRvAj+NBb+t`7*$b z_IaOH+KOt8_C55Q54wCv&r$9l#`s;vID@FWNaY3~cOk^5AnyZ35?bPg80;uCzxfb9 zAB3_eGed)~pqP4+EWX%t+gNawCu}UZ+Y|q5Ea0kT&t(J4@t)AAlRw21MHi>Wje2w- z&ow@xE`zh4xMuY_O4Wy`ZBVckP;WPgdc*Z+l>SWMPmyGQ@UrYysc?tp;=_aNROH43 z1;yl)z?D!J134x15XgNZl;Hay?*S((;q218=h@u0VuV*HdQpiVoon#K$0(+`?e{Q$ z1r!uxbK7Qf=&%5r+Xl&O^qC}?+cuJTA>Di$fwe!hSvA=C;pxnbhBE&21}v+0`6w zL0rvYF16U!hpRbkI=8*Tr$)c$u~Y-^?e~)ND&=l-+n{Hfdo6E|Y;Jpy&x=`RLT+Jh z`!q>B4%pl_@MMf9o!jcSdOs46)`)?Ju9tMu`7A$N9Q_v_o6pvVs1Ru5FbEWxKstxj z54N-dY!16ENDsh0c3am~Uf)dAS^AF8X=oqQSO!ijs&^ECu#lhARlL)`!G+abKh-_C)ByGbUFXkWWV@D&u2%B2IjBM_2{ufH0S<= z#SJi2+j##5ET(#gXkc=6wr7uMs5aj21cqwUt~)Taq7j`5AkONZj0hua$ugJ=JCrzH-Z=FVxtVNTX(i^0G?AbcUZRq4>a|-OGHnxY-E>F;Y1F^+q^6Q< z&=HNQc)iuIZdB5yAOkcS63ver$U2S7q;AQMCDL|#n3|x&7W!9O`qI-S-`Wh)v|HS- zsYz2-<+_vQ*UU zYpIXx`>Z`zq-N~V&D$W< za!n6|=C-MEsj&RkO#>KoGhUYZxx9=YqW5msrooT~{m_tg zns-HOIAZFbn!+63Tw%cGl@ZK4a68&NHyn41Hup(7skFG#iWgyWhN95wcK6CzO)B5P z4Jb@W$;NW*ktPa{b5>qOmQb)g%?q%N3Hx4VsMvREI=NigY`bF{degmv1A2EE=CU{| zZX>f0D8=?}5ZBIiA16~ubeqOQ8mI;DO9`XlX@$Ako(Tq9Y#jhAvzOy`yL*6T|qqWC>NTfos={^qF&s-yg^B}Rr6K{G^rO? z(0`An7sQlD`nJxir7;~S<=Eb4gQMtBe3hu99A~YSq3!490vA!ZF zsPhop#M&-hR&p%)9-ErPI!(36(1eduXRd0V~sTqEXsB{cv(o~SKZJLj3!8~RZ|86NLBt=ejH&f0|2jjAWqag7;unUs`R z&7D{~0oPfa)Gf4mYeTJJKG_Ch@|&}<$xs(9M>3^}3eg_u9LMo*)fWrYDZ@&vz17zY>nYz80SFw?!KmQ~w{z8Ag)1NF83T9*QHQ`UTjmR$i z$!#aBAAd3n^=EhfBnK<3l0W$|{3+6BCCLo^Ih8+!Mf`~`;7|Ti{$!Ww&yD(Xr~W+5 zpLi{Q@^9$RyZp(m=TEW7;&1tr`HesE-}#fzGY^U@^ruO{^2#@-n~4l7Y%NUJ>*RNk zL|AC9oNtiNK32B6HhKGWPc}%3 z2`?O-#3v+~{Pg@t*h%L9XnPaDs*3A>{M|SAPHq+;n1HCDh`W_lt5yRF2+B@Ks6mBi z$VQZqm<5QUXt365Z9%A7TLG=2R;<>gR;+btZC$@wYu#;8QQO+Zt+n6Q>i_dOv%LGV zAno_}e~@?Y%$zxM=FFKh=bV{)pF7N`IxLn_U4|0%i+HUL;!rgY7)UT;x2Zj7|rVLQtJnmus>*D8pCyJin^KJPz3{XG8o-LD^zbR*GMo z57f(ucT3(ZUO98~&=Yi{q{K|)Bh@=m5azS~Z&qzJus=ALz#znQ{+VfywFgVT;vY0`_^T^>MXWLXiSPiAQJ2Lx4=>wu5J|s#{WTi*a=r-C$AJyF=Q_Oud z4H+7$eta$k7<}b7hu{>ua-FKBYG7JMJMKV@`a5tyPoem1+#Cq3XUC(W^d#ndrwDEB z0GiQeJ-oF8EhpAP^*A3bifh=XU$BZLMe^* zB;ejrFu~l3RE>&)F|HsIL#ai`p`jQph~SDrQ*%}XkhketeJy|u%(Zx?^q`chTcEbX z%kgxT9K*d#}p+t0g;mJ`!13*-NthOj1Ft7c;Mp@ZM8!7yw?+LLst7R<###cG7((^Y1WH0ZNXUVQ2}?~@DkG8x`Nj;tl~;CR zhMpk%0kK)RSTjtItwhPBnLSiKUeFXavGhsujw6Rn1nHcXw@Ix7fu~*m^65 z?h4Q`Jv+y>`s#T!k;Tk<5>PU2{;-NS#;KZW%(go1D^_-gzdNveEMqt}N8kk;Rm z4P047$n^wd&1Fu1V{G4njtl1AtnID902AdYqPUIA<~|TPh@HBW>=Meai+0DAh9jnA zq~}oamqh)K!Tp5-LR0x*fE-&E?LoU$Jk@w3t(`s9&r{E%f%?AJ$${!p%r-F|GHj!Z z=6u$9af8qgKA}whq}TF2XY)HKqaOZ?p^D))vUTaP>WArKQyT3KL~f*K4eE{C%Rh(P zVS!fL>B9G9tvIP0O|Pb7csI$EEUb#YAZ=e64Tlkjso9L7_SD>JscAG~A@sfl>Xw_O z|84x9x%Gn_PhbT&&V9c8a>yh7Jv3+S)0mbrhBu%RdiG_(dn0^tBhn!H_g9+ z(WcqoPv0ttdU_$#w*nuuz*@)`c(VI8tu9%eG-QXai-NXjD16*wqoGu6wCbqXPF-gV zP+W|?L*o^s-GdQ$+jzr6(P;n8(NN>Un_E z_0xe8v;3`9Tbb6tIpw3Fxku+)d`!x+#|o+eR%?2t8Hh46N7c! zPX5mZt-EWveLWoym#)(d`L^YcmVOUa-#wRJLGNCOu|(8%FbD>E6lj#dlr=-eYb}zhAe_lm3W}K#XJhfMVh@t9_JE2yq z^(0i6OczSs+rRek$X@fvHVd-tJ4JSlLDnwF+*{DH$bRjSeP570f9|$E`KZ;67Mba) zdm&sF+hZQvU4re&os#y$Bx&w-d0Au+cw`tPFzw-;l6GGXY3>KO)YU3G3fKAZeMQFi zhMkV@i-5r>7{`O$Ow@Ug!F1t3wA^`Sx~L1fFzXG_ce6m#ji9>M;j5NxN1pW^xrH^=Z_ep^Mj7Kn-5A;)ed}Dt zfyA`Q*KdLRAIs`8m|9E-q(&3{7pUu{5_Idg&uvFTn8DCWpu89v!>hP;ZGJR-0Edw-6QvSC8dFl~&iRhJwIImrXZA z?S8LDZA!@GKfO$@5t;n=PGr(@=rhNm`&aEchdyx}dT5p9&;!bF=%G~!4m~r=h5@cG z%CcyEt7Fk0`;kRgw2JA`J>pZK-tEVATwT>#&t>)Z08RwIC{kEfqhQ8#F&)-Tw^M7j zZE~C2907ly^Hb|)nOZOGbZTt@j4_!SlT)mUj8_N-V>OW#WVhG_zXJ7uZ{erX!oxdl z;l5pL;prgJ#Gn1xu8m|Gzjt=u)0iE8r zYZ31wA@;Ob9b`pV9|db9FWkpKFgIp-OmCAbwIk$WMmHEEpjRcU^hgS0#m=T{(&|Ip z3}|7_1ZN=P0272#5$|T3aX$pBoZN8r*2aSAo6ZL@M2zFeePP6i3_OJ zAEDs#5c;^{Tt+@56M2+?HK0%Z6Bb~9brD=X1Z}{yk4+R$d{aaU>e!zJoQ;4XBIwRv zu8OCNK9x4r9gqi@`|Of>&rTMzS0ei+5FMH9htSd$dbRpGR7#%Vh5Be!6_LV^ita}{ z#?n2B`wG=vu7>&zdI&{)?-sC|xk);r9=M4k!5s1iS(7AH<^%I3*rU{nBZr-&J{BDeWv9+}L-zlVn?ym& zag$^z+L_3M%UCMs2NJOR!t^pPDHzG#Jf<~a6`~i`XWDW0PJE_+i`WI~W@~LY2@iwF@)^SU*Cd;@#p?pUv8IdUaL1D7Kd|$r<>huh7f)rLy^{N!Xk{s1~c{Y zOT-`hi?w1B4%ujN?ukQvlqW-6rEiuw(X&Tcmy8l$q<1$`KZUhr!rhD6)6;8X@eT^~ z@Ibd$$q+2&T!m!sTSmUfafDsui<^K%3N@V%9}^R<>H~1XL`c-@A-j>*AE5h%*vw%< zbwJ`(p^2g(1>aB=j)HzNg=M0{((8#-mIgCHF&)&lmDuX-<`Bl*fBQHOrR!J2+CWEQ z2D}DFg{MRX3@<|~3k!eegkmv(df!Y1oRLgwr+dTcV9)OAgLBF#qE-gPq$9WPKqqO` za5>=W3Xj`v8yhW%6)ip9E7y8 zw?If27kq9P*V!(T`x;bn`zxG)UUq&^R;H(~BSBidea_aHBo$MpwAui&&`EU#EJ9U^ z{6kFs@6k1h@|T%F!E{s5zFHKGN7`F)TrChz7H!6`oodko}4>h83(rB^Tw2GS-fqGrhy?D!P@Z9C}d*5=6 zfpM#`=vV{;fd^dLVXawi8VqEJZLAGr$^iuRphImWl&2(mY7{V|u&SM`=+ZFB#CS2- z!6Q30DDZo0b?qv)J5ap}`qO<vE=FF3ya(K3;Zi%)=!jR_a#UuvX6i$53_qPHpn1 z0K*t~jExv_dTmsMlO5} z_5sf7mJhwGRIa*^_7LM|MWRSTlivdv_8TKwuMWHy-{e-UXo2vfV-W6XQT9 zAH(vcDEbLgnAj33O5sQ$KkCMW18|Y-Fj780#vbcX^|iLX9RO>Seh5HOmNFT5-zduA zZyjbVKF>(bQNXf4p}tdKLj=#YI|mr19W*0MfWBh{A7N`<4uZVcF4IY?n+lBw{9^lX zp8v>KH(>WBIMww3bl3k2mS+X%Ge5werg3^=sOst~z=gmJjzgv4-C*iayw}MgDr7z) zUc0FMCs_n}MC6D!W|6^u5wzEI2`JpZnmW3_`dO;XWCqcA^6_NRX;@mo*^&~8NZd}V zS+)arVc#h*r@Zi-T>((2XL5H&eg?||lCX9ZO2PiCS7QN@{$>-Jp_POZY_kMv?Q(RH`<{EEL+IB_`2q4{b>ngvCuR%mTe6qg>oJpK`Yt+&Lu?Lg zGGNjVi=5p|;*w4p40h}Tb~~gpgy%YChTAO&4DLpd#f^X~WWx0wR)FsO+z6pox5}Ie z)VKbhV7m3gvgBNo8oROjp2efV-1Dq~pPEr(6f ztk+B5vt|!=sU}1*ZOD!_QdmWMG$^z7+iQ-NzU?>CLdS)MjooRMle+dK0;gQ}4Hay2 z4MK+@MzTMQuJ(;y*7g4k_kO6;pV+y}3r>>hf&OxoKS)fXi?Ob#LEw#;gIfIqy3*N+ z7q>~cW-EEXT|*dn+o{tn-vYJg#;#HIkbK$cRNq=&Po?n%_~pd6tMXTTEmgQVp$Fek zYQAms{O8D8@wKSfPBkk>D?#3;m;~6*BY~LFDj#Mu@6`%AAo*s;6sh6xd5|21j{_La zJ<*mfGHMS@Jk`J&d#uF?J-{G29Nk2hURy4K18Ks<5F{;boODsgTxxlQ6|^guSIv!5|v^I8ezBO_EuR zhQKe;8f)rML0n(Pyv75BbX>%P$Lb-8;2|1H_4lYDklS*QNt`srNiTF1!~aod`e1Za zRkM5ML@{6u2QERt5=St45Hwf_D(f;xaYRNmSpJ$QHcud+i7Y)LP*vurcok;!g6uZL zj;Me>$b>aAG6guaz~k$xxeC6K6%qb+Ee^vw>5>{kSly8L%i}MX~N-5HdjO+=&WUAdui34!H zx~ubf5r|Qc2XGWCvc!j|?O(z`YW4lF9fQ|Jp1&p28xJK9y#Ohg%cXdtU`V`80td2+ z@vz(`nMIq-`O%%(86YZQWZ1*^m>?hE@Ti#jhy!X>#8bLM5Kcmv7vdI0gOOJAoS2W2 zCZnS<2@#S3#AB3agvJ=B5lTLDR>n@}bGP`EIR(54H?5bgFz0Q@5i0@&kUX0nL_MtLq6MlYm7e^MvW}m45_b$l~N^TVl zmpcr78)nW1?Hy_kK+p+h{w+D?0k=W^2O_poGS*}mNIr|&jJ9(S!lp4&m3 z7IZ)lbvFlX?Cu!^t26`$&v0p&s{^sE0kYe6cnBN60m0=?-V_K4UgVs(j; z%LiIO##R`)w5CL)aFTrbqh>P>+`u@gJ$FQVfQ(S9vtl}UA@+6Y;z9;zx5H zWO$NO%N>(70ln*C;EF-HWjP;d^3OEj2<(6JOar+hE4=p|yU-O3-<6n+W^?F6KaMbc z>k;cg`#9+NWXD!HFc^O|Dm?@l?%^dUCHJ(z;XSc)W{=^63ew1%P&>}_k+aZ)*d|Xr z`vdh$jN=O5O6$|WqocM`197WW-D)FCYASMI^dO8aTg?Axjmer`4t9w>e1tIsB>smJ zt^x^+kZ&7)ddh^KM7e#Vow#M`IfHkgJmS<1`VXSU12yPYhMWQf!^xKvu*38@k7@TU$j zAwJht^u{G0eZ$Mm%TlBkrs{4*q)_P;b`cj@SMJqSowCE{p6rTz{t+niE*EE9fxI11AHbARl!d+zU2 z)>mJ(gJSoL{Ig*03@*k4P#;ooSQn42t&_*zn2?7Y#7(v=IKAGoV1nU5Jf6e$OMjZ? zZa8B@)e~n|(Sdh~J_6CACGLy@^Dx;9^pYfGCjw!@Xg?$oxq9>e8gqLAs}6R{sC5u6 zIEO|~-)iRt^kRXGTQ5iRyxMsiyrU3{j(Zex@sd+Mrj?h@!LquORvLDp6)+-He-JMb zQ_Z-D{dS-&cY=sptR>GwNcyWY%6!P@Q$(~O(qF(nEQrK(Lib4&dd_b3-SbnaH@eCg zFfxlas|yj=;Vz9wi&+4()kFcmFa9O)?wVFz>9i`Q7>)zd2In*2@uQJhQ8?_h!xyNQ zZCr-cE$7A*TzBMNR&^WGc?0zW^^ZKBkb&&|v^DOc@I8#Dm(bz2D4*NR;i#QEh7b0$ zlK42+B4-VdXa2E9Qh*a5VCX%ou_KB01~4?n#c5|xoBIc75K`r%#y03&r1vn-?JM}3 zM&6HM$GwTbhQ|0{-CM8}vWxf`R&A~Ufe_^Uwa^PV^Gr3FeW*sBp5!+0brcR9*%)OW zB(DZ*H|Z|eNA*NgWh{*s+RN;t3CV{dC2|K#?`FI!1p65{L$1Cl0S)uWG#~3Xhm!t+ zDA52cK9{e;?tCIs4i}9`KI1>PorJ^JZ<;uY@{(CUhFctoIIe0fv|3C2#BoTkCa zE>TzM>0CKJ^8J>$*+#R(evA$2U3E|l0>;gr63H`1xn!MES0l73hU5k`HNzOm_5{IL z4o8(48xhBdhZOa6gj5Ep*U#Z1Msqk;o5C`i2UC>K=winR1C6jTSI5nqd>TO60W8qh zvlr_3E_BiNyy3wmz``D}&&{zLe{d7X1iEelSy&g~ZNb{c;BH~lQBi#~s6Hwxi;A(5 zmVx<~o7X;|2&QmBTxGVaf9_~7o(v2cJfvg{6O>TAp$a&c5{3yGW8ISTBTNaNyEq7$ zN*`<31uFP>+H{*c&E*!Iio7%)*rSKLXIZp2Hh1&|z(0yK{TPdLp#Dd;i||ZDf2f}I z(SB?UMt4|iZgH4Ee<<}KPEoNrLcpUO*NI3*;dCf?wX#cZM4q|>C?Vr`E^Y|%-~bYI z+O=rq$y8OmjWJlvvh|%tK^lp`c%irEcwLtZ23zLzx#7OHU4zS5OgYql#xjVJFoOD_ z2`7E7ZgjRF#H63vqT5lsK;73V;W|vfUuzRXo*s?F?!bXx!^2Nl$;zVPUHm?fonu5T z-q*8+8k%|qk09acEgIr#T2ySkLq4;JN2CD4=^JiDat57bd*trHPAu@Ggm@LBdX%p! zD_@Ke;9L#@Z}gT9R0z?TzW$?=OC7lD*@c=plEaie5Mxe8UP0VyE;dX_sv0v2lo;!h z6dj3Du|ggt`Bl+4Tw)p&@L7*E7ar<55ManTupQqUtG3ybgtKJL;4!HE;;kY)V8Fn2 z2H{q55@FHHvQ`!Cr;o8-WR;YpmjitoA;LkpVoV3Q(+07E4!Cg&kAeM>EH2f1U~y(_8I_cn{3YDxz>{%S{!lG>bcIiifS|u`+A1C>Z#m$ zD#7pGPA4TJ4qU8yo4;TQA`US^4l&P$VV?XQB8wrWuc!KP3=pNFzmL(x^jS-gVHoNJ zpE;7_cW~Sxr2^=Ny*JYSqX0}+Mr5s2ccR(i@n+#X8SUbcHHa!{I`vVISAs)mdNU6L z8Yz6m%{U{4y^$kBag5r;{!j_*t$u<^R_oDb>OC+d2W#3TP{U0@u+CJ0ElVlEu7!ED zf9h6HbgM~dIfMiSYF`W?C-m`h1Tl5+Yj~&_+A~a-ogLTf=P@XFzef-ufN=vS{ehS< zB$IEpC{TB=#wH4SK4vQmPG^_*RxfpynVEQ_JaFIu-8uY@2<{>L>Y2_e(8{OHjPasAGMgCSPM{vad+{}% z#gOO1hN?F^V%gKXrU38W;TjK+%Um4wKMmX4hXlE_Hq!X{OFlM0sO)4cWant54XT)v zw|rev(FJ0#(Z@+Y&zdxe9>pnEY(-tLJi8U8{)J!(*t?RwxMOwv0q_o0w=6gG|0W-A zSpxkid;Y&AzsIh_4G3gP2kf#708*^cvc!OCddPkiXvaDh{82oOm;vly?r^M}bUcvc zhR9b;$MK}OJjgG8ZH#D=z=R6V?}1^@EPpf`mA`{#*l-@59;!aI!_<`+rknn+{iNvt zb%zxU<0R8W)1^%7>A9l@9k`GOwP{z|VG7Q8RE{$W8?c$sCG~i8wE(^k6KXm4feYZo zn-q_(7T~cS1blo3rqOcy+#(0{bu+;7?wn)d9k2~(WXgLx-gm*FsiMzz?l2qyfdi@3 z;y4ayyg$mM^!1Vg9#7t%<)=pb<2VSO{$NZ%-D_gi|7l3TZYusAVRbet^OTLv;CPe6 zmy1S>U|F$zf)F*_9B#y;3JV}Y=E38`Sh4`8n4;n`ewXsO`SFot8zojx2f-T;QGbp>QHPa6m7%Fky2ZFK_M;Nfg%rGo|kv@C#p z$Vfp=LCe5z3)I8ni?fxm$Z;|5Ll1RqQt7Kyq z?Y|(K_(Apr>E{e1tm5o$3+n$0!6Z5t@pQ2Tegq*BuJFii!s6>~t!00WwREZ*2{}yM z>k^BmXdY5ceg1J9VkWx5aE?sT*A^l`bU);>XzBbFtJ%IX-ytN z_~FWWpmC&MTCczj)MrnxKE^*CL+t2A*fKCKhUKqF~=hXK0GR8CE!TcF`u${&u zFM?3ru4HB*!m?`D!sWX>&OKx1>=h^^4Q@QwcMAP9XyD8;LjDV79+%)=+}f=?LCqZ} z^w>tr<*;IoEA}l8oDA`9c-I|Wlcz!d&Z6G+ z2E{E{-m@q=WIkbeKS*}n<9h6?;h2I}mv?j}&M6Ga+C%RY&~m+MHHH)eih0fFyrSSF zEFB**(2qES7@K(CCyuY#g}4OHV|1ECR=dms56USz>fiAWWbdJV)?wZjc7H(?NYEtV zq7_{P!P*crC|isS1M|-qN8fCY>@1b2zX=E`eQgD8827+678w7e^*uOFuO3iaBQ+aH z`$r1ml4j}?&(c>7aZqTXZJ zcRD5BWdCiBJ8;(#Ux&Zszw!EA)!7cf&GB*+j2ECyxZk8NY}G%B8?+i64_9Zj>jl0Z zaS|KNdm;@uu5M z(T7nf9CQ>dut(g$rnRoR zHZ^blqy?GsWsOTyt#xg6t;_3bQ}})OOlwvzYdE&fOT}^XK zdt0iusk-&dRAy3h^HNJ*LtT5Ot#et8sc^!?%88k&^Jh=CrD!PA(%j~|Qe9iK1V6J* z@~6$2(%RZA_qEmS)fqCdHiO^$WiQE#)VzwydDCW}n3;*+OEY|AV?-xRV9%vDD;jIt zm!#$_YiyWY-BvfXd1-AW2Lp}NgL63?z*w~4ry1JoSxRhYu3*QRI&CKT4$TA%uJg#W!4-aKRf=wa%P4<6mR;t)UF(-9oPU@(f)X_PqFInZ;en`HOOq++|Z_G)T!S5j5Ar%Nvq~7Gtgl3Cs#VUF>jaFEpsVo)K0JCrp%gz zNkmPzxVjCh+$w{$(=sGS{PylVh^=x;SQ#lAYI7>#@ zu4QXu#o%yoaGT5^wl$tzmx0!6t%qp2-prbF!hFmWv{5&)wZSh6Rsk$WfpiH92rHTq z4==+N;KR%*m2+lu5gnK6Sk~6qu&l0jxU4cY)h*Rd^vLU+t}U-_wTe!#WAKCmFbPvN z7qmXJn0nFCd&-w@O`TRXd;Tm7fF?v+ z=k&?cMNwO-X&$7ydht?c17NWr>tG@@woA4MLdAkvljh9KOr1IL#1xhv%mHv2TG1*w z*B@B~u@Kg+OxZ!q?cS2=wk5&}tCr?~PJF0=W>agn zlNrvwWz9CjFY|0aq2Hk&mOw}PNn!%g_+>hTyuRrmkIPn7+u=|!-h8C zl$n(knTnGp&NEBCXAU(COuz(>mcvS6vTj*hM{6C7AE;iV%Ni3hB2&rP+l>mLRaOqisoJy|dWbL^iF?%T!LBHoMaCkBwS; zzE;c(Ovj~l^{_T;&**5Qj>F=ygx*}jtYc-F;Y*vF&+KR!$Fx|mZ5_}%l7jywt%6H1 zJ+K0si7iw+jS7s=_S9wI-Ne}o#CkRo!DU56!Z}7$W{bA~pGl@NOy?9;FnGu2aEk>~ z=*UjlWf`o>EG2`z3<8$R0~$SH!R(2%yhe4?8Wn`d`o@*UuA;q`1gw)WJ28?TD z0nX|Y5Gmpy1}8;palk;C)fhUh ztsQ2t*yT0T=A<|g#F~>XFYahSWWg-e%Q|2jw7|^CfEQ+&qT*}8q;P0uSv3Qj!KC84 zxumHMkp*K_Q)CQCb^=&EH+#-(=n^#4>^z+ue|$28U|KuGx1;(p~Q`&H#nHy3Mg2Wkxkg)PQTJV-gg5igAv<*OIxF^Grh&P4SDx zT($_Pz~F|E?P$bVDG(<_33^#qzdUi~H2AwGkOJ6i%ThFgz-1UI6w2YX%^fu3FklsP zr%awUaVDIl*%g(rRw&u{tA|gGhO)u}Bn?;;n;P4^!&Ng!q9T?;vGhd`oH%>_@X2G3 z8b0>$QHPHjGkj#zvgVP^;Ooexb=CDFMLmv`xmVYU!uF13b>kcAmesX3)*xBkTC-&Q z%A=1QdE^npM>Y%}IcMDPk@XHix4QM>DUE~)#lTi`>qrbWdpEMarrzbkg&1EC8AImW zX_N6?&9KlCz%_TYjqF&)DAq`^UfWRECqh$DgCSg!!0aTn5k{ho3UL^X#I@DcotYSZ zF@DrP-KM0JdnLD?4lW%>bgSDX?wN#B^dRv?V$V$eGQtvG4gR9On07wrf)YcI)W ziRb{UZ*zhoHHc5rNXl_U+!|FUdSOb!qV}Dwn1Wal!$z1;y{tElwT;VD)lH(Z!K>NR zz@F4JF*ii1G&XyNPlbq(OsJ3cYV_6U3OmB$NV5;k?bM}pO?6-f(j1CJEY~Y3<~Plr1=IR zm^ux@GVPQpwnx>qwV;jSGWn!=BDtVPs-Xj3rCFq7>=nwK{u9m3+_8dN4As_{suyqG z^hG>Xh#%d`)`sO4g_{{|zyO{eJ`O5Q;IlrL1lmB21Pc?(vEgMKOb^T@*an=8CNCM% z0|kiAq?%54PA&(<8@tOO%?zJomKgfxreJ}!SUkpSYZAGmYX|8kyToFZxW&bL=!RlJA1#hDESh-NNj62CE|_3ZMyNBvD|AQATk3*==(A`O(*v3`B%Gj- zUFp6RU=ZEVQQcaLFfUERzC0+XQCcZtds4cMdjPzzJ>o^gOL*^jVb_cr=?Md!2prWlwIIp_C$7fC9Gj*< zufWjEhV#s3fk9}9laPpONnc7=jg*njT<#)bOU0EqfOh5%_9#VHFnfdqrokoB@DDbUOu{` zt#!0@_XP*wi9^tVFT&!~E%#%<=vBSylU>sUFmVOhs$ z3~t*lVl>vxDhgVZNgWpY)$Zn4i~Sm>fjIXj(BQqcEi%<#R$(KyUs{HJO(5hoAKoh6x?$K zXksQ>6_<&(kSPWSacliR+|_{$UZ`Gi#bVS}hbsb?)zTTGxsk*83jtu4;bMG!+;Cyw z^usNJ_GCnvY{R0v6H*&i<2Pwj`1NJ`(ckSfcVQ|F=7!;I{eue0&<%j(Crss`AP>*G zn77{Oea@GB6iAI9upmgq4$*D}YPWR;ViWV9vkeR_*cg9iJ_fUPuZa&+1Mza|fmPx6 zg88h%kN(8IL*BNsTTl@W84lX``@txF&KLJX-F^p4-EdB&!66{;dyqnOVBC?xTtgMV z@ua5t=uq&fIE)t@```sq=$N1Czcqc%B*CgGh&kYtC+?AWc>Wc!TE($&)Zlpg8@S7fsfa|Ta$#^S`cXKZa{|Mxg z;SuLxEe{WWIS3YpF9+KLbaHzDQWknp@Tqf&NrkBqC_k|ZU$yo4I`>M#|1x+I7t3-2 z>cc!d2X_!Fjrcl7INT6?JB`c6^!IR)F#vSEhyEgHJ*5+0YXkfO!XnDp-)-T(1?pdG z4HcVGdD;9q>2aG<{PkrZ8sHIyL3tPsLzjM(##?{T7Z&g5i}OLyb?Gf>P>mz}NqUb< zAHFHPGk83}wMUuWyzMQJAm#SH2TXd5tv{w`{q$H{HWp>3FS)IU=z2KF4Ben(kT~Wz zlORRlhg1@&%VBXvIOqt-(w)IiC|N%V9tc$1>P_JTtRy0ZD*ANadrca(CN;Vc_bF{? zN%A2i%%EfVeavy5ZUd|EL5(B{0(}I(k2r?Vs536h2f`=Y*PHA3tLwB29%#1 zj7OmTBhvV0w{T72;Aj#eOBJ{&<6Gf-I3&n~Uk|<)1Q`^>ELX9U*9j+L zy4?}{jM8T0T95EhgD?w+pNy|%7edF7FZd5Uclplmj?V8s3r&3xT*5woC%u_HrJU;> z9%>j^_;BzTH4SKCSvL%0vQ?${6q&fT`PHn<)s&lS$E9B1S3gK(NH?w$!<)5u3uW01{PDXp@Fu_YPq@ z$4|4^@E^{7@M8rc%hRk5yOAt=_YadnMj=3OnW9-HI-Ah($vN5I&c!~nMq%U zTz#1ckaK#om9K2|oVw+vZn@Mg4<}VYtyE<|PKF4O4Foh?;&Uvqr9ov1Ke&<76Fv2^ zGR;{eW<$3Uz4nXC$FWmT#< z^U?2n+O@E40>4kcfW}XFL2wrh!0bmK=a)AP#iI+*w*r_an2h-1Or&5138WKf+7cZs z+wMiqvPH2oY`cR{9$1^Q-yJbTk40JG&jsiy{1d=H)Bxjvivo?W1gT#7Pj5%J+E=I! zn6oQ7q1_ZJ=!1OMV^TGF28p87!!TfZmXS$Wp1>J$dM9gi8e*ji&g-L681_}|NLD*? z0_|B_xsy3W0nZ~syS>w6=0a|_WLRZ3oZim+_D<+vSl_wBl;tKUOX834A=76IY`KM{l@KpH!4R?s7n&d*Y?FrydpmlVnvd?zf6`jcPp0w8ocZA!=~tD}1h1+;DrEdo-5g3r-&iUw7VzLny3&*(VpTY4$ zGx$x-x#17fe@Y|ur}X=2^zDN*-qDo_H!J+;MJ7>Qzw0aiflkN0>F4PQJfD7@Jbxqo zH>TFA|4|A1K=(hzG##cC8d4{sH&>+ZX5Y4`TU@8~!C5HXl3JA-x+zqpB9YX*dV_EH zDC);Y)4xjd`l5PAiJ}a;L+Q=0ijhD_cTZ@0Ps5-)UT7S_i>u(J3hfDnX)jQ?3KX?z zPbjD%fx=aw82u2a+`fQo1jFS;^#;ZC4Uh<7hnV&XKHq@P2RNj9KBQW};Refx3OY?y zt$*P8rKm|&9+hEU9@S%BDRW9onNvE9_diJAlcqwVqBWlczXf90zJ%U)6zh-5jsSWU zrtwkAw3;2IJ&AYEVXTF^sD-*1FVw}oaE8kpYl16DYW3zbz62UTvEF>1+~p0^n=h9; z(rNEgQBR&jQwwHXh3CeO=|0M?eO%qhNZ{iM&#_`m(yP<>Ia)-v@}j)hm8612@mp3* zaZg9@H@1>SGR#fpD#qlvG5r`rVtM(YPSji&r%$zG zghEj8mZxALDM%(kK{5#n-1JS+p6Qk()`H|@O}B6qFl8Y&=bA-(rvN$?yQ!|M$CStc zHbkPkLnLzukPn>`SGp@Go@ZV=!=qp$91 z^f_!16#2Au>k>JHz$>cTY+DD3p&x(EH_h0eFCC21yds~p?sYN;0Qo%tk~si?5plJ} zKgWNbR?HK@+gvZ+#%r9++TIo7`CUYq!*6Pn@lF1E6*BZwCd1(BrDME!pj91mZRteS>;L@%o5* zPa1hoT`unH<>94t@z9(1U?a|u+G6`UtG#!sD(FeaaMKt9BHx# z1QbOM1ezF9osy5$NQcPUX09|F#`HOW#{l`H zRjY{{0Hg=TV^0_EK_b@OzB(0l&w%3e5SAs09H|4<*$pI_BOt=J^KDBEC7u@kO#PY$ zE273OU)IM|e2E2PDfD_WiLI?<5^L*aj(QG3ZW7&!;vc#;gYx)p2TRd{y|$B5NQ$eO zl@yC%vTj900hFUc18FhN(lLpb!0&isaLv%er4(=^s&g+$RURGCcGXMrA$$ zG<24L%I++n^@koUevp1)xGC7m%VWW>o!_b_u5=Bv_F;!ZeDPwaJ!~#R^sweq+GTK5 zD#A`|npSWor}TloJ_5B2Fw9Nm7v|Il6ajzaNnvOr9FGqEA-Kp+ia`I`7Y_!W!NZNE z&`ZT(sCYqIDhl4meMRn3{26+ZT}Z{7EMaz!BBej}fJ4B8$AhQI1H8og-!?zRsgp=z zz~W6gIh+dQ>Hy#8g7g=$UpEEcJxai)Bc_mjeb(q+;%Y#9xfT$TN);6OB!>g9yqcUG zokSARdOc@PqwLM7@>}07N|uZN7r^;1$S(5NgB$E>e?y3$7C#MNSLR`b#V*;Ed3WU@ zs#m?(9dG z`{qQBYT+t>Gq{i*^TT{!VJ5sv->t>+%2q;~!+o^@kfH(K;WT+L*i85SZiSzVpBvuC zA3|Li{yN0#@-T(;+cZNAFLLUi#O3#-3~FS$0<~`QY9RQKYqW1quk(#b+;Jc9V4wZf zx|>$RAUdD%2cV_ozu*VXPnq}hWf&X*&>#6?J7pxA&`U*5nTzwJqTqekSCnl%{ST1A zDRZKo37j$_=n1Y+(C=1HDKF}YGDsDRFg--16D7%7-OIAIAn>lv03d{+ehanfF2L>2N@7X5z#5{s}`d>!@`VRHvlU_af9P%oR3oNhlxPHMD$VtPP za_Ouw<#Vht<`C^5uEL>?KztR0VBw@DK%gN<)mQ(`LtnNGKY+Vz0(aMnPXTR zziQQ*-L7@XepDdjymmR2=I&kqI6X!Rq*;}UIdUZ3DryVwZsV~h(Jnd74UMs^5Y9oedGp1-N zcGU;ToQ1Ty3~Wft27Dq%Kp>pmK$1BEB6Mx=Ee`{u!{4Oeg}GyRc9Sp42X7u?yi`m| zS4F%K*px19Cr&a)Mz;q+??hkES14PNkF4;dY%c^!6VX7c+RjRF6V=KO(KPPr7 z9&5+&VCfZBz-cz4RBR<*KE&{@&}VqvmCZ4{>j47gn1n!Q9I#w-YLtgZe2oVE*Gvs`^QqvE z%=lyQS2l=@zp}xEh5v0&9?kM}8Gy@9z+H8H66!l1st9F!jl$QcNgyy&;{*zi{mUmz zVdFde3U_YJt|oYNyf2fpeqTfz*96-@7kM7&g}#`3qPq=2MFgQy)V(6ji@QxlDX#Pt zX?(ZCM?17@S5~S>lSTHznB~) zgCc=T#_C0m)r$rf#_HwZDsHA+Wvohz3;BX8cMQ?fEL}&SS@;}qp3k0%gH(nl z|H5;x<`|g1#up=m8V=egJ4oFs@+9X)X{jiKw82;8Abo)2ZDx>`S=$gklI;V?Jbkjc z-<3_!B<$yHf+k`6-UNNhwr)2;FS1E&f*!us&;{=+h!gn-Kj`uycAG6cHbJxSSZjQK zk4@0wXSwc*G~UfozdN|!O5^=>F&82d_cxpIx8O#ONAjbyD8^wvj=P5feUCu_VY@&0 zkQpBu6vz-1S$zYRClQo~<8Z1cZ2k)69wPRY^mR}cIDUJh$>4y>M_=kGp9)Euhxltn zcu8?=~-Ug6nf(Fq4wG0fEodTyiXP?$Ojlj|tF4D_^cYj~G+S?>z(L~JN_ugNpXePxI9yMTM;gI72S(V0)Isge!5=# z=wJF4j)$}ye=+Ure=EGodQtctjo*b_6t2t1t1B0VmlkX;L~3*4!-ZNJy2Zx~#2G)ZoV5laXg}dv5Ur^=!0_&GL59dfW@;Jak zY$~s1&)2G3=^1Z`e!$rM`n*T-aCs!}SJa*}$QTm+Xa7W>v3z7Zj!uJcAe82F2ab4+=IFfnQ=X-=uU<<>i6@CqOVR#|E56s!< z4f^U^7|_6kjc+8co-Mee5SOcqFcb^JPm9*{3l=6=WHzXhZFFmA_uy0<6L^{-fv45W z3aPvFz4YVn)lX=op3raL9nhPb!yEH|PFa7d;MoFP?kIemPd_|f_yUILre-dsy?zos zx=rMXU81#fVYrTwe0<}VHRhqUOY@n$G=B?Qc`^S3Nq&&Og{`rZEPbKye~Wl!H*wAO z6Nzrk>nlAge++y4rsnX^>N@lUH&5tW^X2BD{M&^3@WH}2iX`WqqCd$^7BjPfI<8t~ z8YqSo@S{6y26rFkhX;;LuV!}qO`AOe_7HqgKE2u}&u-QElvB>%O1x$9A`)}7xh#k}cJin+$B)`Cmo#dML9 z@}70@ObY8Pv=O;Pt=%vT<)`3F0E}&{f9r|ON6D}9pTouQOTN364?7TyIdB~0aoq8^ zbKscs@eNj-@JLa7p;a!7-=ud|h!J=7vLo(u%!vD>A90^!M*K3{S}7?H;&nDT6nw+7 z?@HmxphxjPoYXt<@ELe6WnLK4Q^P0F$$YGg0}@B0a|>}wb$~S0t&+{B4c#X)iIF8+ zauft{o*fv3*?A6qpi3Gqz;o-CgTCFKU<9UCG6_bzWR}rB$1vI_J)?aN0CbRVB%*w& zT%pnOq5fXdzoizuHSdnR;8d>_3IlU8LjSPI0Uv;c_JHFNn`!1o{IxdU5`(}a)=#papv)yI+3`;+=?k-4Z@$Eu`ndiz3OoDEfpu>8SrnbQ!ccpf1z5 z_`tqtDW}QGaQvq{ruJzX_QqT^drKbrkI%q?W(-A^2OOM?Yc7<1vTI9SL;%8t^!xxBNg$MaQ(rZXzdG{sCHS4Z9 z&Cj!}nrB;{hnBz2P~_JQSCIc)_*-WD77YSDGTuas$goU8#wXELI4*=ef(Llq02vSH zrWQ zGBKMkc``<;{LeOpqbCFZ@6xY@lKNS+1-~SL>@752um_`GmUPOGEn3&Vo?!YErpCnQ zrj8gDf41kQaM8K|fk(Mr7iEUk zWvt`X^xL#8|H{LXb8(pB0(%Tmp+d#+t^yaQd|Do>!+j2dHo~5zE0jG0G@=)HXigmb zR2(B(P``bY@KK`P>tF{tV{r-c+@v8%f7A1ukHCBt!;H(8@J^YU1}3Gy>w$(~aTzj3 zCghgz7Zzwh{IF$73JZ2RHwl&PON~NF<^UenP&a^Njx%yn`YF%$JwU`BhYAsgj)wUH zF1o^$Nv`+(E>DGdaW;vwBB^*UD<1<3RNA}ZP?bKPyG5yVyvV|F?Ft8`iY&{rB3jA= zh`&o;%>$$1OX|;Z-4?zUGW`T(6W2a!>dl|N1$n~$6Du-^R5G$&NRWfD96bS|av-{l%6nV*1QqlX z;j!u1<>wC!(m3;9gfn-T&v-gDtM^h=?-+N`k8g19e07ni{EK)+u3VA-2>d9* zKFurgpH?r4uk%wVHk!})r3CakU>oRsl0;&~FM17dy=>drh2n^oR@8 z77?FPd3i-Cji(0irm3|H5J<)IX3k&;R55+##dNi49f>ylXgEkWpR%7!e%)V^4` z_FaIvx8PLFSeS9Ao-Wbzc&-J(%89f4acGm{3)F#^8$>v}l9NCDL6?tl+SkID=D;WN z(?^*BV;#MDlBv2Adfu}jmY(Zv67=koq$iO-FEUo*$qw0@WhuhLm;RY7gQ+Ny_ZcCv# zjYs@sW@LMCGxt}7+)Sb|J;Lt!@wwm1Fy2cr?lo!9xq=4BZd$F!9C~n&8eD?MNv=rW zobIFO=Jc)UA+DAs!dH}qK~M5+jQ}lwXE@%`qEGc@`B)fV;}o8UvvS{%E<(A)t};)8 z!moBo>xd?E001|;8$dD#0BH`?KpQc^E-s#zY2))U1vqz1&Efba4;JJm;V}AA?=bot z;Kq40pELl;900)STxGi(i?}6{IMIWF(?9U+7z|e37rcwnv%{wE^JQe!5BN%wc_RHB zJ1RC;8NqS->@I0pmCOMET=;GP$s7P6BJpj@sQ&t_)VW|&GLO%;c!APm?4%7-hhQ2X z@&c#m3&BfvuD=xg*6g0f4(<@U0g5hP?yI)JtzGdOZiak7IWSW}A7dFnNkx?JPz)4E z8)|cBa0Q3L9B0#CWLieKmwKEVda}m{b2l8ZKk(@|cF;6|0Y$+1o-lvB>+<9sL zt1s@p*V3&b_gcPhDhl34Uy+gFE9BubcB#P<=1)X^%L8I_7xVsq$rGH6`Hsz}vx6f? zJ_(^SCn9|g06=RL-*0O$*q3jck=ofJCh>{lpIO+#Zm^&*QH0YiKFO+BvXh9hWc#E$ z1xECGtyRil>M#h(Vc#*)6O_cR=0MUU^A-0&H(vg zTcU{4=8{(0l87N~KIx<_D2(%6+w`DQs(S|34i91UbuvflVD;z*lFShhFjqeMLBFcZ z!RXGx5!H(DJHaNa0yhQMJB^0X$ig0j)%Tc_!SzKgM)Rcf?>!=OR&}1}N_Zw8`hqV& z0>3am-BQd|BZ^&(!k{wV`^%Ofpu?M=`YyzJ;Ob>p2%m#Cu^#xO;ZHKhDscUoCrakV zKCtd8HyMs7OA6ntQW=)+m0ou|Wz*LHg~^Y8&;+3&u-y9CtsV@lKhIc;=V2$ZBD^s8 zzGdh4gI|)JGAEp!7p4}1Etv+Uqj;Vbto;6Msk2feHU#m}`^QHgDE1Mm>7VF-R;i!0mz31wK5$(GWAthJO4q7q?wGmS429V4#q>Qkw@fl$#-UAbqVR&3Ay-;X% z&&NpkNG^cA+GRr#6*>kp`WTA#%unXQU;2-$U;s}|@C0-ulj+w(Jvi z_n0F|EJ}RzSPvy+*I_JIZKtGd58k7Ce-9@>kosq^hQZD?bW&vWfI}bS>sDi7X@kkL z2oRUai6_csN{{ytcnM0_f(7HW@ccAi040)S2+f3$w{ZM1SvEp7VY#=;$@@Cj#JmeJL>MDT%+2-r35HjV8vQp-A zP#ZGklSVZpa{zz`J@2-y?Iqofx7p-itVobDS8C6;q;$3)W5FhLfU9ajO21?4;k|=J z>x)+vua8#^Ss$;D;b|9|^g<@#Ov9SbBFQ6?#Xy3`VkebbW+92EVtq2bs+cZ?t7N;H z%s~Yx{B8ir98wv?7h4)jWSRC!>`zlA1lpC;5WzNMiCuX?Rc;xcyXg&$^g42yFSMhF8db55T zjiG1P;AJ-Ep3wHbml_Nh3SL|VFXQAr@G>qdP`C;dqoX~bFscN?g)lTQL0)$f!MDr# z1aC!nC1A}WF5q&!)x7fHCeITdehK^aWBdIE^Zu*BVT`LgL~AY~+6FvDwrzhiI*#cNv93u|XT^=^6 zHV+${P@7MB5UR~me?IAa|GHdh#=Z^H;=RxpCh<->F@g8H9)x%g#i4M}9N%DbhZ|q| zE}OKkyGtfv8r^G4O|ZfzsZ!uKxl$&v(k7F_AOEEvtTXraRbmq%3=^lBxjOBeRI%R- zu3(V%3e04aeP!@n!>K!5l^MVgKWX$+_NmY98Bfm zzSPCXodgO_BD!**gU^iPnnX9xp+mNyv&-e5e5VSz7cp#%-@izdfEXP1t`z;R6ZzR1 zTp5xjt_F5496a1D?p(NJiY^i29)2oRa_7P)b-UTQkT~B^KLhtee~vxgnw9z(pHJZ! zwyy|Bf2YodZ%C z?lu8s8elTXv!H1#FVYFN^_eV}foyj**zer6Q`uwkt@-vrbWDCln zI2N8`<8XSCFQj#RdK2W$o~KFa9lo&|74N?(tZCs3cz%i(oACNSc$}Wuu9+bo6HojW z?gKimMx2K80#tyGaUOvDK0iS0VQzRKgL39&e)>cYfF&h7bqQ#ZAX_i_v`6%59v-iQ z?)Ns@2#=m>@9-w4T!^p$Z$w79T!o@!eK7Or$y7AmYGE{vo{B-h@VVBgo?ukCB-NAq z=#+nB6HZ}lw=ZChfn(8pU(k2Obnki0LdHxxQ`y=HKFiwHYlBqx5;rgcGRIF zHp}_Jdg_|>!MAM2xA?>jjhNU~+mkcOV7lC6k{JGUjwYrDi%DgzFCL7B2J^i_V%!+z zp)c{pT#3$XCY^clEjE`^5b=m)5{I^Y5@Lq^n`92)72a#4pYmvRSny9A!7SNJu02Yf zdMVkw_+vjlz4b0@?iWPf+#p`)3zKW^h=UA}jPrLr z2n7z$_!@!J+b23fld7X^6=Wug2A~52SmYw%*;)e-9FU@NzaH)IDEU}T;c(Q0NqfMd zay3%-nFq2_RpG22=kQ}1*dtP7!FGtV(!U8$?kuOZ*-S@x*lZ$fj=3^NZCYvvPycdAI zp?3D>ZxzY$Bvm;9-LSKIwhsz?X-6gNxze6CsTP z4`~Fvb+0yfO4$D>->-!F!Q)NyVQLsCgL?&OYqLFcgr#zz;Dk*^PbSkn22m%h8Kd&A`9_B7*`B2#Bw7B%q^!FdzZ}1jfO{=yK`Dotb84 zy4!vLlhruJ_=t}vA;wn{(GZi3amB=J)aZt6V&r6ZkD8dcN!-M&CYoa&=y6TriE+Qb zs{XpS@AO@FbLULgt*`$7uh(CXTTeM_4I;CKSP-tY>YQp~L3#3@+)5cQn|rZBGlDo3JHUp2rbihS)6QKHa4> zsCFkULfD3ddr!~`?k8{nEz%9W6grIqz>&mWvpr!iRwEL_WAbU*r}wn{sZ3lRI`Q75 zUeLc@x$I67iL6v!^};Ji-Y)+XKSJ~Tz>i>81b~l1v<4o7Yydx%uW3MwRljv{*(#UW zvwFdatXE!ag%_{kfWRoW9=Yt37$laT)JOa(o*vDECJlcnk-Wzy8Eq*0Z`!@RRo<4k zCjr$)ldKXsnYTn;w5Ig+*aLAgpGv%{)|l><57AoahV;C;nRxh}`1qZ8?W*TS{vjun ze=wDQFqMBahTDk#bVCnQ(Zf{qG@9Fp9;2d4K1@XqQ_<^n%@lv5Xn|CiN^NwP&coMf zeySHs?;fDcehSN9Vf+L!)XpRe6C?D6q#nIk*iX=@(8;Oo&@&}x8|0{+`+McRq8g^3_af%OU}|BPPYQ|R!=0t8qo;XC8I0p+vFa$|S$7;be=G{;0`lh3cj>+ILR z$!E@GZP*SC-hKlOL*0N6JXAGk$@aw#!~q==jjQ=ViY=Z)+XT3bw()lHy3m;x*KJN`(GNzGai6 z3ys#=58-DRBllb7t+XU%tFDu`%CE)0i$;xxWb9MN+C!{8inT|x_Gs1~%}Tq8F#7oh z`_{CtwFk5Atts|jG%IAQnu@0hDMP73jB>^Hi6~^as40LbiV0&V0*Iop;TFk*>$Jt( zM7SP}#QH5zhAmsQ5^TMO2I~ALz@XM4Z9oQZ*n$R2G4$RoiGin@i7mje0BMK|fG&}1 zw;+8K!&c2e;|Kgesh+oiq7VNREulO1L@=LpHmql_g7xoc6ah~xIb*$Mq(OX~+(Td8 z^d$FpGp_D=oT8$moy2l>YC=q#CTJ&8>7=wy2{@{!)4{9|wM|SBDMn*W zwN}i#VC6Dm!Qh7E+XqxE5>qTjiwd23YpTU})mj@wK;JxuAc)XB9%c4Hn?h>8I<4wJ zSS*UDk0GNaB0B9TgF`a5$?-~Srm7Jv&ImG-E3ICs53pOQCcBl7(Y~7cW>?2?<=!@2 zj(4-EA8)2*5TyI5Um4~VkgL2Ui6tx11Gk4!R@q;}+b?1_6C2SbzieqvKsh;eDb@LK z2=LN1k3I*v-E4WVl1Wa+_!3U@#7R)NQ>~tr&fff^_DqK=d5vYIg%rPxy-JnrtF$&6 zjUpCNzaL@3)24!#+8nS#fJ{AV*jsRv@bl)KhKJ+-n!aAWmTh#-g< z^-jKFgD$a{t|aD4+0vvI&z(L~#F1!8&II~w-74G9B<+w$uiscsOj^m~@r?=s^m{|} zClLLF6#FBzFCr0uurLoEV>Kie>*1zDpSI2cYeTJ&Nj}Hv^NzgO#wARESWPyu zQvPVJaeosRy3BurUtm&Cvh#fXV!rLwbaFR}7P<=EIB-oX@I{u03f8Q7Xr`frq=$>G zi~Y`5qXNpY*E-U7zM86q{_Qd-%|P&zyv35LA%@1mc+?VwgYhZr(jXWQTgPB9er!+< zM)HUyQ`548DiJtISXo*KlCftZuy(S-RPXGL3E!31;#^8(fu3n7WY5&e6Jd&c!Mf zQ$I2!?T8Axain4)E}9j(kf@d8Ggc(!?HTAw08ahhpq#gyi^(mf88zBYOPZJCwnn+4 z7jL~;RQ%aoFyE7dmVxThX|wS&dmb7t{UmR;&g#r5xX5|)g95D2hb*N!!Wx?^w&M)N zXQ^s_Huf+L2RuxtG;hNx&5!FHAM)|U%`_^&Px4JG;tt}zgI1Vr!GVXk$z?mvs`#(R58YaEfgDZTnn3#KCpnIm%i@s&op7A49K)3~n5jv8Tki@?J!;%B>qsfB zo@A?Kx*UF9ekBFqO4_BdU0$Dfi~>NU$@g0_O5wE^Ah%S5=d)9T=W|dtpJsVXgGUP} zucF0Vs=@PFslmHfd!_@HTwqx#lWt7xLp0^S!~tT4E`HV2Gp512Ghl@PnficX$9G9; zuX!guR}Eg2BW|T;rzX?j1rTtfiytBgA|&2V*3a4qkQOgd8o3U-@PQ0|GJSOP>Ue*9 zbbz{LUuy~LeM@b3s|CMHR^W?+fPJl46okdUHN0<8P9MnBSu=eT_qF1%_2ZcUi`3Ct z`l68lDj?*u&ii|9AnEjAxw?mb2X-TbyKjoA(_zsLBO~wg=`akj`h5IUu*?xFNg)Y- zgypPdIaq0oIcIj(-H24P$t}~Xs3!rZPk>U1`RDf%P)`yT5Nk<&JD>qFU>#Qy6X?!) zbPAdp!|424<`$+7H0|stA)wA#Hen~38p}z(2My)Ld(oWUirok1>=h?)$bx(Yr&GvZ z&`}EClCMa0hJtYRpF^2O)j+dsU4R|5FUHVUd=1-TF0)@vSI7f$)RDI(A4>{{H>KlN z5R4KZiVNqrR>Ubd7ytHza4uM>WJ2f!thW~q?=~k-CLWD#=*pJP{om$#Nfb);+( zjz80fS>AR`@d>Bfd|FAd0(YefXNR><$3UQPctbXcz;^M;%Z0;x$pa97UK2EaqMUqH z47Y$DiOGW)M-WcfbwL;sPGAI2F6=^=`++#dtmb&x=|re+t%8`OEq()ndB@LQ$Q$OgR41I8-1D zL95o{Obt6hb(B2zSUGc!aQq1^CHt&%gu~NbN_WR2SuB?o#A{a3-(W${1*pc&l?xZj z%~*uA*mm}m_~omR3}Yd`OQ>RV;l;w?P94Q&L8oy18|hUb&f6dyzXPRY6Blnyp+f9= z!ugQt7C@1)Yeagx!jN!=EeX~DCb57_R_>3xh)Uw;)Ig4Inc@IqKu z18lxpafh;M*V^H1r8995*t2nU|D$mDdPh>hJ8{Eg5D`G`1QNKK5f?N5dmSQxd=bcg zbLSqF&}Nh$zEO`N=^*(2o=YU*a2p@K2SPW|0wz2kB>)s^?Mq_e+>;cLH zi%OY1NA_O{tToG$rpt9(WDiDhAGVN?Q#au#iR;PR{qVNVrPF{i#}ZQVvKt|Cg9RL! znkm;%gA#4M*;Y78c3>CP==jgpvw6{n&ymyEcX3rw{3bCetwnTEmS&jJy7rkRY!O*HXg;9qNLvPXWS2nVQM z!kJ&f@eh}l@_F2@97cWyWE$RB?ehg6LyQCBv^Y1eco453UCah98F%Gl!u%C z6-{idzzjl;TOG0=105J*cU+J%6^D+$n3OLiUrowyG(FyAQ)@zqu$c*8!WYTsi@t~^ zc)5I-?c*_rBInPS>72|_9TjpRxH<;SK@&e`MI_U6Hq2T85K*p&{WfB z(A*Mxn~<|{5hq6LL*P>RLj^9n)Tf+z5l(!)1?+X;Svb#?z)abvoc$qrqtfF#a4Dv8 zNxA)-ww6n}Vk?NuQg>&e{8U-mB>4!g6+)-ZA}eHNx4Z#|Jqm{}kfQ!d7y8h?9gFf& zrSbJnxS2%mbv})o(tHH<;W*(0?p4Cdrt1^(ro`cdq>Gi*JxD0&H4aG%Yb=EG^<8Wq zj|NDdycBJYg%UD3Q|7NlYSv+>W$NtE1bdN=n2odTzJ>_$l{b`4FQAe~ZEn4$?wD*w zm#NEoMg4IUy4@U_0kBa@+`q%aIH4<>Fd$tm#Btgx3#5q%dXB+A;m;V4 z7++*?o^qW<#CT|!f#`Vxm*mp34*!Jn3BC7YWSbu9Rm8*$(Rzq%n3vOrpjudkXQc)( zXr>;@Z^C&MqZvLBA2ayMZcVpC8{!s&?>G1qgWm%)CZ>s%k7==lgfra#fp zw}Q1{dPm&8KU25=&ETbt8ps&@ zM1%8QI^&Hv+u*z_m+^H5e`b>wU_OyV#^5|N$TJWXgY#4!<5wG;=g$UBc=j25hnb8q zhQPp>PJaWK(_qBI2Iq50&P2M<^DTq(+>Pm3il+_EGb@u|r{`sZ^O=Yk%T&)>OutRr z4`@S-L%l-fg*W*aXK}Q_d2?Kf&e6j{E(DZlCYdxP`YKu>8{e4Ocxhj*ED__V?KpgAhH^xVhvuC{N2ot}pb z{$fVkzpoAPByg&SyAEl9>z^MQ`h!`G&olD>i{+RMeBQ|Uoxypl^=AzJw!!(#jLVE1 zN9z1~v0oDw4c=yO+u2TP_XSM9RNJ|+JImmFj~Wg!P|tdUx0_zt2?pW~&-f+N1C@S{YRY1i17-x)avLvsGC=%8$Ae zpYrMG?JVGNF-g2IT92<#@~4aI9=syu5|BeX!{s{aV5%^OP_)jA6-$&qYN8r<; z7jqlLcOmdb`SrdC{G15<{0RJ#2z)pKzXEupe7OsFqwxPz1pPA+@_!Dzkv{w?LOy*U zG)kYz5%@_F_@)T_;s|_a1peU&{H6%}_6Yn-5%?n!_zxoRUq;}sN8o>n!13YVFrAN! zz)y+5yCU$l5%|Rs_)r8s5`o_cypdkr9zp+L1pdtk{HX~12NC#75%^yt@M&nG8tM7* z5%|dw_?Z#-c@g;52>g-=d}joHSp>c}0{=_|{$K?DtqA;Z1pc29_#Yzh=JAcwe|iKy zCjvh?0`HE%H%8!@2>j9r{F(@SZv_7N2>g)<{09;EE5I9-yEh}~lNcasq~|jt@Dn5O zB@y^~;Elr58$rJ#0?$X_qEapA3;p?GM^?QS-C=LIlK-%0Z23afD;Ls3u2;wwbD%VM zUl}v?#0!RWc~F$fUMXGn+CBK< zPgEJH>@Mf4o?9puGLS!Ln9E)|mmNr#ML9!K+O10O;^=^le6zz1{gj&an5Thbo+8 zh5QhQ#vAH0uN;iNe7VAYDv=`v&j0LC(aNYGu_=m$qTwgnF+izUu|8F;q9D|6rZ{X| zlvGzGijIf|RCWZIeNo=DM#RxhTEW$ts`3;;?Pq# z2;(FL1HV!x7$1Y_RjO4ve!46Ui)^`Csn+`XPzB|@ve%!lAnV=gu!{^J(XN{-y8T1N z4631AwOFpW>DnHVEuyG;RWFBf)R4mMLuo=qR8Ef|Ue)r5=qsm(JvUby9v%Tpz~)l9 zt0Q&Y^Ln~Bt#Q|!f3E9-cc56^iH#vR_*H|XOwGi zk62GZ(~6WYG9&D6rq<^ohZ!2qWQS0-V5#+qSbZrP)Kenz>j!53Mwe5I?~OAMzKXPQ3zBEI6@v~*KbCmXZNH@VO7f#&NtN(y8ZcG zUcpr4GG9Py7P21nKokr4ehNLQMLFL;fbx>tS*wu#rpxXC)o3PVbQ`B)TP{Pr z(r9y4SSV!KVqq7h0y+0*byb={ATkDD8ya#;Ra2C*x|HkqAZv7|1f_tyg}&*Gtf7h8GpxEAghMr;2~;L1{X7#$ zpy^x=z7RImXB5I{OJ&5-QD@>0LmBoyGDYlG{~YgQN86BRYr#CEnUgx^IaKK$aQ|yS9|1TeMO{` zE$5kPkgP;R^O;mkq^10|%)9_wbVB{}R>mm&eEuk$T(DsRQl;IwE1DuvLxdK(bcT8JN|wHV60(x$JfH7it})GI}dz)E^xd z%GB~hxl{8wp$Mo=5FNRZ0_Bl15qjl<+M_}pqM*fvTiF{*6QOx44OK-4bpS*MUOW1W z=B46gMMo7ig6M$K=0ROl&1r`>VEPUNIY?uhmZ3WlnuFhoi#&w@6~Oc`+NTaJD}z=8 z9jala%^kW*ODm-SuC4h(AMvT$E}hAgu^!skRNu_JQ=SE2m4|FEW{1$HvI5I!O_aUC z`0f7}Iu;BV>cpIce!gU0*lagA8yK#uduSa(kpHmZXLDX1HO)!YKi#mt_3pbx_8?jr{c;Z3N<>4MD`h{tvVeDg>MFVEjDz zkc{9%^Uc`DW5eHfly+tF1w+i?XMflnfcswq{OhJ^1~yk3{&4sWENF2N$!2-i8Gbew z8VB~D(~skSrQu&?1Rk8OU)bDl7>J*o!u&S?qcpL}#PeFlB>f6L91g~=!Ap?8-SDyb z3`IQfw3>G|_rf0JKe9vfftHD^Yc6@n>ltc3?Xsi z$q;|)HciMTjk^V(u>ViP5vz+-86-NM2k!hb*?fJ|Hs8*2eg=n0_&3Gg&O3MgANgMa zFU6nvc|F!j!@mx0!KXcF!TX!|C*5a$p6|WR@N>el8gaN;4{il-(0`tHzV0hO*5)FI9^Z6;m-^GN+93v0> # -Date.jd(2451944) - #=> # -Date.ordinal(2001,34) - #=> # -Date.commercial(2001,5,6) - #=> # -Date.parse('2001-02-03') - #=> # -Date.strptime('03-02-2001', '%d-%m-%Y') - #=> # -Time.new(2001,2,3).to_date - #=> # -``` - -All `Date` objects are immutable; hence cannot modify themselves. - -The concept of a date object can be represented as a tuple of the day count, the offset and the day of calendar reform. - -The day count denotes the absolute position of a temporal dimension. The offset is relative adjustment, which determines decoded local time with the day count. The day of calendar reform denotes the start day of the new style. The old style of the West is the Julian calendar which was adopted by Caesar. The new style is the Gregorian calendar, which is the current civil calendar of many countries. - -The day count is virtually the astronomical Julian day number. The offset in this class is usually zero, and cannot be specified directly. - -A `Date` object can be created with an optional argument, the day of calendar reform as a Julian day number, which should be 2298874 to 2426355 or negative/positive infinity. The default value is `Date::ITALY` (2299161=1582-10-15). See also sample/cal.rb. - -``` -$ ruby sample/cal.rb -c it 10 1582 -October 1582 -S M Tu W Th F S -1 2 3 4 15 16 -17 18 19 20 21 22 23 -24 25 26 27 28 29 30 -31 -``` - -``` -$ ruby sample/cal.rb -c gb 9 1752 -September 1752 -S M Tu W Th F S -1 2 14 15 16 -17 18 19 20 21 22 23 -24 25 26 27 28 29 30 -``` - -A `Date` object has various methods. See each reference. - -```ruby -d = Date.parse('3rd Feb 2001') - #=> # -d.year #=> 2001 -d.mon #=> 2 -d.mday #=> 3 -d.wday #=> 6 -d += 1 #=> # -d.strftime('%a %d %b %Y') #=> "Sun 04 Feb 2001" -``` - -## Development - -After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. - -To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). - -## Contributing - -Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/date. - -## License - -The gem is available as open source under the terms of the [2-Clause BSD License](https://opensource.org/licenses/BSD-2-Clause). diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/Makefile b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/Makefile deleted file mode 100644 index 62ec5b0..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/Makefile +++ /dev/null @@ -1,269 +0,0 @@ - -SHELL = /bin/sh - -# V=0 quiet, V=1 verbose. other values don't work. -V = 0 -V0 = $(V:0=) -Q1 = $(V:1=) -Q = $(Q1:0=@) -ECHO1 = $(V:1=@ :) -ECHO = $(ECHO1:0=@ echo) -NULLCMD = : - -#### Start of system configuration section. #### - -srcdir = . -topdir = /usr/include/ruby-3.2.0 -hdrdir = $(topdir) -arch_hdrdir = /usr/include/x86_64-linux-gnu/ruby-3.2.0 -PATH_SEPARATOR = : -VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby -prefix = $(DESTDIR)/usr -rubysitearchprefix = $(sitearchlibdir)/$(RUBY_BASE_NAME) -rubyarchprefix = $(archlibdir)/$(RUBY_BASE_NAME) -rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) -exec_prefix = $(prefix) -vendorarchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/vendor_ruby -sitearchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/site_ruby -rubyarchhdrdir = $(archincludedir)/$(RUBY_VERSION_NAME) -vendorhdrdir = $(rubyhdrdir)/vendor_ruby -sitehdrdir = $(rubyhdrdir)/site_ruby -rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) -vendorarchdir = $(rubysitearchprefix)/vendor_ruby/$(ruby_version) -vendorlibdir = $(vendordir)/$(ruby_version) -vendordir = $(rubylibprefix)/vendor_ruby -sitearchdir = $(DESTDIR)/usr/local/lib/x86_64-linux-gnu/site_ruby -sitelibdir = $(sitedir)/$(ruby_version) -sitedir = $(DESTDIR)/usr/local/lib/site_ruby -rubyarchdir = $(rubyarchprefix)/$(ruby_version) -rubylibdir = $(rubylibprefix)/$(ruby_version) -sitearchincludedir = $(includedir)/$(sitearch) -archincludedir = $(includedir)/$(arch) -sitearchlibdir = $(libdir)/$(sitearch) -archlibdir = $(libdir)/$(arch) -ridir = $(datarootdir)/$(RI_BASE_NAME) -mandir = $(datarootdir)/man -localedir = $(datarootdir)/locale -libdir = $(exec_prefix)/lib -psdir = $(docdir) -pdfdir = $(docdir) -dvidir = $(docdir) -htmldir = $(docdir) -infodir = $(datarootdir)/info -docdir = $(datarootdir)/doc/$(PACKAGE) -oldincludedir = $(DESTDIR)/usr/include -includedir = $(prefix)/include -runstatedir = $(DESTDIR)/var/run -localstatedir = $(DESTDIR)/var -sharedstatedir = $(prefix)/com -sysconfdir = $(DESTDIR)/etc -datadir = $(datarootdir) -datarootdir = $(prefix)/share -libexecdir = $(exec_prefix)/libexec -sbindir = $(exec_prefix)/sbin -bindir = $(exec_prefix)/bin -archdir = $(rubyarchdir) - - -CC_WRAPPER = -CC = x86_64-linux-gnu-gcc -CXX = x86_64-linux-gnu-g++ -LIBRUBY = $(LIBRUBY_SO) -LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a -LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) -LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static $(MAINLIBS) -empty = -OUTFLAG = -o $(empty) -COUTFLAG = -o $(empty) -CSRCFLAG = $(empty) - -RUBY_EXTCONF_H = -cflags = $(optflags) $(debugflags) $(warnflags) -cxxflags = -optflags = -O3 -fno-fast-math -debugflags = -ggdb3 -warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdiv-by-zero -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wold-style-definition -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef -cppflags = -CCDLFLAGS = -fPIC -CFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC $(ARCH_FLAG) -INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) -DEFS = -CPPFLAGS = -DHAVE_RB_CATEGORY_WARN -DHAVE_TIMEZONE -Wdate-time -D_FORTIFY_SOURCE=3 $(DEFS) $(cppflags) -CXXFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 $(ARCH_FLAG) -ldflags = -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed -dldflags = -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -ARCH_FLAG = -DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) -LDSHARED = $(CC) -shared -LDSHAREDXX = $(CXX) -shared -AR = x86_64-linux-gnu-gcc-ar -EXEEXT = - -RUBY_INSTALL_NAME = $(RUBY_BASE_NAME)3.2 -RUBY_SO_NAME = ruby-3.2 -RUBYW_INSTALL_NAME = -RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) -RUBYW_BASE_NAME = rubyw -RUBY_BASE_NAME = ruby - -arch = x86_64-linux-gnu -sitearch = $(arch) -ruby_version = 3.2.0 -ruby = $(bindir)/$(RUBY_BASE_NAME)3.2 -RUBY = $(ruby) -BUILTRUBY = $(bindir)/$(RUBY_BASE_NAME)3.2 -ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h - -RM = rm -f -RM_RF = rm -fr -RMDIRS = rmdir --ignore-fail-on-non-empty -p -MAKEDIRS = /bin/mkdir -p -INSTALL = /usr/bin/install -c -INSTALL_PROG = $(INSTALL) -m 0755 -INSTALL_DATA = $(INSTALL) -m 644 -COPY = cp -TOUCH = exit > - -#### End of system configuration section. #### - -preload = -libpath = . $(archlibdir) -LIBPATH = -L. -L$(archlibdir) -DEFFILE = - -CLEANFILES = mkmf.log -DISTCLEANFILES = -DISTCLEANDIRS = - -extout = -extout_prefix = -target_prefix = -LOCAL_LIBS = -LIBS = $(LIBRUBYARG_SHARED) -lm -lpthread -lc -ORIG_SRCS = date_core.c date_parse.c date_strftime.c date_strptime.c -SRCS = $(ORIG_SRCS) -OBJS = date_core.o date_parse.o date_strftime.o date_strptime.o -HDRS = $(srcdir)/date_tmx.h $(srcdir)/zonetab.h -LOCAL_HDRS = -TARGET = date_core -TARGET_NAME = date_core -TARGET_ENTRY = Init_$(TARGET_NAME) -DLLIB = $(TARGET).so -EXTSTATIC = -STATIC_LIB = - -TIMESTAMP_DIR = . -BINDIR = $(bindir) -RUBYCOMMONDIR = $(sitedir)$(target_prefix) -RUBYLIBDIR = $(sitelibdir)$(target_prefix) -RUBYARCHDIR = $(sitearchdir)$(target_prefix) -HDRDIR = $(sitehdrdir)$(target_prefix) -ARCHHDRDIR = $(sitearchhdrdir)$(target_prefix) -TARGET_SO_DIR = -TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) -CLEANLIBS = $(TARGET_SO) false -CLEANOBJS = $(OBJS) *.bak -TARGET_SO_DIR_TIMESTAMP = $(TIMESTAMP_DIR)/.sitearchdir.time - -all: $(DLLIB) -static: $(STATIC_LIB) -.PHONY: all install static install-so install-rb -.PHONY: clean clean-so clean-static clean-rb - -clean-static:: -clean-rb-default:: -clean-rb:: -clean-so:: -clean: clean-so clean-static clean-rb-default clean-rb - -$(Q)$(RM_RF) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time - -distclean-rb-default:: -distclean-rb:: -distclean-so:: -distclean-static:: -distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb - -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log - -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) - -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true - -realclean: distclean -install: install-so install-rb - -install-so: $(DLLIB) $(TARGET_SO_DIR_TIMESTAMP) - $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) -clean-static:: - -$(Q)$(RM) $(STATIC_LIB) -install-rb: pre-install-rb do-install-rb install-rb-default -install-rb-default: pre-install-rb-default do-install-rb-default -pre-install-rb: Makefile -pre-install-rb-default: Makefile -do-install-rb: -do-install-rb-default: -pre-install-rb-default: - @$(NULLCMD) -$(TARGET_SO_DIR_TIMESTAMP): - $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) - $(Q) $(TOUCH) $@ - -site-install: site-install-so site-install-rb -site-install-so: install-so -site-install-rb: install-rb - -.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S - -.cc.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cc.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.mm.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.mm.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cxx.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cxx.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.cpp.o: - $(ECHO) compiling $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.cpp.S: - $(ECHO) translating $(<) - $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.c.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.c.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -.m.o: - $(ECHO) compiling $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< - -.m.S: - $(ECHO) translating $(<) - $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< - -$(TARGET_SO): $(OBJS) Makefile - $(ECHO) linking shared-object $(DLLIB) - -$(Q)$(RM) $(@) - $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) - - - -$(OBJS): $(HDRS) $(ruby_headers) diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_core.c b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_core.c deleted file mode 100644 index 2e92539..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_core.c +++ /dev/null @@ -1,10064 +0,0 @@ -/* - date_core.c: Coded by Tadayoshi Funaba 2010-2014 -*/ - -#include "ruby.h" -#include "ruby/encoding.h" -#include "ruby/util.h" -#include -#include -#if defined(HAVE_SYS_TIME_H) -#include -#endif - -#undef NDEBUG -#define NDEBUG -#include - -#ifdef RUBY_EXTCONF_H -#include RUBY_EXTCONF_H -#endif - -#define USE_PACK - -static ID id_cmp, id_le_p, id_ge_p, id_eqeq_p; -static VALUE cDate, cDateTime; -static VALUE eDateError; -static VALUE half_days_in_day, day_in_nanoseconds; -static double positive_inf, negative_inf; - -// used by deconstruct_keys -static VALUE sym_year, sym_month, sym_day, sym_yday, sym_wday; -static VALUE sym_hour, sym_min, sym_sec, sym_sec_fraction, sym_zone; - -#define f_boolcast(x) ((x) ? Qtrue : Qfalse) - -#define f_abs(x) rb_funcall(x, rb_intern("abs"), 0) -#define f_negate(x) rb_funcall(x, rb_intern("-@"), 0) -#define f_add(x,y) rb_funcall(x, '+', 1, y) -#define f_sub(x,y) rb_funcall(x, '-', 1, y) -#define f_mul(x,y) rb_funcall(x, '*', 1, y) -#define f_div(x,y) rb_funcall(x, '/', 1, y) -#define f_quo(x,y) rb_funcall(x, rb_intern("quo"), 1, y) -#define f_idiv(x,y) rb_funcall(x, rb_intern("div"), 1, y) -#define f_mod(x,y) rb_funcall(x, '%', 1, y) -#define f_remainder(x,y) rb_funcall(x, rb_intern("remainder"), 1, y) -#define f_expt(x,y) rb_funcall(x, rb_intern("**"), 1, y) -#define f_floor(x) rb_funcall(x, rb_intern("floor"), 0) -#define f_ceil(x) rb_funcall(x, rb_intern("ceil"), 0) -#define f_truncate(x) rb_funcall(x, rb_intern("truncate"), 0) -#define f_round(x) rb_funcall(x, rb_intern("round"), 0) - -#define f_to_i(x) rb_funcall(x, rb_intern("to_i"), 0) -#define f_to_r(x) rb_funcall(x, rb_intern("to_r"), 0) -#define f_to_s(x) rb_funcall(x, rb_intern("to_s"), 0) -#define f_inspect(x) rb_funcall(x, rb_intern("inspect"), 0) - -#define f_add3(x,y,z) f_add(f_add(x, y), z) -#define f_sub3(x,y,z) f_sub(f_sub(x, y), z) - -#define f_frozen_ary(...) rb_ary_freeze(rb_ary_new3(__VA_ARGS__)) - -static VALUE date_initialize(int argc, VALUE *argv, VALUE self); -static VALUE datetime_initialize(int argc, VALUE *argv, VALUE self); - -#define RETURN_FALSE_UNLESS_NUMERIC(obj) if(!RTEST(rb_obj_is_kind_of((obj), rb_cNumeric))) return Qfalse -inline static void -check_numeric(VALUE obj, const char* field) -{ - if(!RTEST(rb_obj_is_kind_of(obj, rb_cNumeric))) { - rb_raise(rb_eTypeError, "invalid %s (not numeric)", field); - } -} - -inline static int -f_cmp(VALUE x, VALUE y) -{ - if (FIXNUM_P(x) && FIXNUM_P(y)) { - long c = FIX2LONG(x) - FIX2LONG(y); - if (c > 0) - return 1; - else if (c < 0) - return -1; - return 0; - } - return rb_cmpint(rb_funcallv(x, id_cmp, 1, &y), x, y); -} - -inline static VALUE -f_lt_p(VALUE x, VALUE y) -{ - if (FIXNUM_P(x) && FIXNUM_P(y)) - return f_boolcast(FIX2LONG(x) < FIX2LONG(y)); - return rb_funcall(x, '<', 1, y); -} - -inline static VALUE -f_gt_p(VALUE x, VALUE y) -{ - if (FIXNUM_P(x) && FIXNUM_P(y)) - return f_boolcast(FIX2LONG(x) > FIX2LONG(y)); - return rb_funcall(x, '>', 1, y); -} - -inline static VALUE -f_le_p(VALUE x, VALUE y) -{ - if (FIXNUM_P(x) && FIXNUM_P(y)) - return f_boolcast(FIX2LONG(x) <= FIX2LONG(y)); - return rb_funcall(x, id_le_p, 1, y); -} - -inline static VALUE -f_ge_p(VALUE x, VALUE y) -{ - if (FIXNUM_P(x) && FIXNUM_P(y)) - return f_boolcast(FIX2LONG(x) >= FIX2LONG(y)); - return rb_funcall(x, id_ge_p, 1, y); -} - -inline static VALUE -f_eqeq_p(VALUE x, VALUE y) -{ - if (FIXNUM_P(x) && FIXNUM_P(y)) - return f_boolcast(FIX2LONG(x) == FIX2LONG(y)); - return rb_funcall(x, id_eqeq_p, 1, y); -} - -inline static VALUE -f_zero_p(VALUE x) -{ - switch (TYPE(x)) { - case T_FIXNUM: - return f_boolcast(FIX2LONG(x) == 0); - case T_BIGNUM: - return Qfalse; - case T_RATIONAL: - { - VALUE num = rb_rational_num(x); - return f_boolcast(FIXNUM_P(num) && FIX2LONG(num) == 0); - } - } - return rb_funcall(x, id_eqeq_p, 1, INT2FIX(0)); -} - -#define f_nonzero_p(x) (!f_zero_p(x)) - -inline static VALUE -f_negative_p(VALUE x) -{ - if (FIXNUM_P(x)) - return f_boolcast(FIX2LONG(x) < 0); - return rb_funcall(x, '<', 1, INT2FIX(0)); -} - -#define f_positive_p(x) (!f_negative_p(x)) - -#define f_ajd(x) rb_funcall(x, rb_intern("ajd"), 0) -#define f_jd(x) rb_funcall(x, rb_intern("jd"), 0) -#define f_year(x) rb_funcall(x, rb_intern("year"), 0) -#define f_mon(x) rb_funcall(x, rb_intern("mon"), 0) -#define f_mday(x) rb_funcall(x, rb_intern("mday"), 0) -#define f_wday(x) rb_funcall(x, rb_intern("wday"), 0) -#define f_hour(x) rb_funcall(x, rb_intern("hour"), 0) -#define f_min(x) rb_funcall(x, rb_intern("min"), 0) -#define f_sec(x) rb_funcall(x, rb_intern("sec"), 0) - -/* copied from time.c */ -#define NDIV(x,y) (-(-((x)+1)/(y))-1) -#define NMOD(x,y) ((y)-(-((x)+1)%(y))-1) -#define DIV(n,d) ((n)<0 ? NDIV((n),(d)) : (n)/(d)) -#define MOD(n,d) ((n)<0 ? NMOD((n),(d)) : (n)%(d)) - -#define HAVE_JD (1 << 0) -#define HAVE_DF (1 << 1) -#define HAVE_CIVIL (1 << 2) -#define HAVE_TIME (1 << 3) -#define COMPLEX_DAT (1 << 7) - -#define have_jd_p(x) ((x)->flags & HAVE_JD) -#define have_df_p(x) ((x)->flags & HAVE_DF) -#define have_civil_p(x) ((x)->flags & HAVE_CIVIL) -#define have_time_p(x) ((x)->flags & HAVE_TIME) -#define complex_dat_p(x) ((x)->flags & COMPLEX_DAT) -#define simple_dat_p(x) (!complex_dat_p(x)) - -#define ITALY 2299161 /* 1582-10-15 */ -#define ENGLAND 2361222 /* 1752-09-14 */ -#define JULIAN positive_inf -#define GREGORIAN negative_inf -#define DEFAULT_SG ITALY - -#define UNIX_EPOCH_IN_CJD INT2FIX(2440588) /* 1970-01-01 */ - -#define MINUTE_IN_SECONDS 60 -#define HOUR_IN_SECONDS 3600 -#define DAY_IN_SECONDS 86400 -#define SECOND_IN_MILLISECONDS 1000 -#define SECOND_IN_NANOSECONDS 1000000000 - -#define JC_PERIOD0 1461 /* 365.25 * 4 */ -#define GC_PERIOD0 146097 /* 365.2425 * 400 */ -#define CM_PERIOD0 71149239 /* (lcm 7 1461 146097) */ -#define CM_PERIOD (0xfffffff / CM_PERIOD0 * CM_PERIOD0) -#define CM_PERIOD_JCY (CM_PERIOD / JC_PERIOD0 * 4) -#define CM_PERIOD_GCY (CM_PERIOD / GC_PERIOD0 * 400) - -#define REFORM_BEGIN_YEAR 1582 -#define REFORM_END_YEAR 1930 -#define REFORM_BEGIN_JD 2298874 /* ns 1582-01-01 */ -#define REFORM_END_JD 2426355 /* os 1930-12-31 */ - -#ifdef USE_PACK -#define SEC_WIDTH 6 -#define MIN_WIDTH 6 -#define HOUR_WIDTH 5 -#define MDAY_WIDTH 5 -#define MON_WIDTH 4 - -#define SEC_SHIFT 0 -#define MIN_SHIFT SEC_WIDTH -#define HOUR_SHIFT (MIN_WIDTH + SEC_WIDTH) -#define MDAY_SHIFT (HOUR_WIDTH + MIN_WIDTH + SEC_WIDTH) -#define MON_SHIFT (MDAY_WIDTH + HOUR_WIDTH + MIN_WIDTH + SEC_WIDTH) - -#define PK_MASK(x) ((1 << (x)) - 1) - -#define EX_SEC(x) (((x) >> SEC_SHIFT) & PK_MASK(SEC_WIDTH)) -#define EX_MIN(x) (((x) >> MIN_SHIFT) & PK_MASK(MIN_WIDTH)) -#define EX_HOUR(x) (((x) >> HOUR_SHIFT) & PK_MASK(HOUR_WIDTH)) -#define EX_MDAY(x) (((x) >> MDAY_SHIFT) & PK_MASK(MDAY_WIDTH)) -#define EX_MON(x) (((x) >> MON_SHIFT) & PK_MASK(MON_WIDTH)) - -#define PACK5(m,d,h,min,s) \ - (((m) << MON_SHIFT) | ((d) << MDAY_SHIFT) |\ - ((h) << HOUR_SHIFT) | ((min) << MIN_SHIFT) | ((s) << SEC_SHIFT)) - -#define PACK2(m,d) \ - (((m) << MON_SHIFT) | ((d) << MDAY_SHIFT)) -#endif - -#ifdef HAVE_FLOAT_H -#include -#endif - -#if defined(FLT_RADIX) && defined(FLT_MANT_DIG) && FLT_RADIX == 2 && FLT_MANT_DIG > 22 -#define date_sg_t float -#else -#define date_sg_t double -#endif - -#define JULIAN_EPOCH_DATE "-4712-01-01" -#define JULIAN_EPOCH_DATETIME JULIAN_EPOCH_DATE "T00:00:00+00:00" -#define JULIAN_EPOCH_DATETIME_RFC3339 "Mon, 1 Jan -4712 00:00:00 +0000" -#define JULIAN_EPOCH_DATETIME_HTTPDATE "Mon, 01 Jan -4712 00:00:00 GMT" - -/* A set of nth, jd, df and sf denote ajd + 1/2. Each ajd begin at - * noon of GMT (assume equal to UTC). However, this begins at - * midnight. - */ - -struct SimpleDateData -{ - unsigned flags; - int jd; /* as utc */ - VALUE nth; /* not always canonicalized */ - date_sg_t sg; /* 2298874..2426355 or -/+oo -- at most 22 bits */ - /* decoded as utc=local */ - int year; /* truncated */ -#ifndef USE_PACK - int mon; - int mday; - /* hour is zero */ - /* min is zero */ - /* sec is zero */ -#else - /* packed civil */ - unsigned pc; -#endif -}; - -struct ComplexDateData -{ - unsigned flags; - int jd; /* as utc */ - VALUE nth; /* not always canonicalized */ - date_sg_t sg; /* 2298874..2426355 or -/+oo -- at most 22 bits */ - /* decoded as local */ - int year; /* truncated */ -#ifndef USE_PACK - int mon; - int mday; - int hour; - int min; - int sec; -#else - /* packed civil */ - unsigned pc; -#endif - int df; /* as utc, in secs */ - int of; /* in secs */ - VALUE sf; /* in nano secs */ -}; - -union DateData { - unsigned flags; - struct SimpleDateData s; - struct ComplexDateData c; -}; - -#define get_d1(x)\ - union DateData *dat;\ - TypedData_Get_Struct(x, union DateData, &d_lite_type, dat); - -#define get_d1a(x)\ - union DateData *adat;\ - TypedData_Get_Struct(x, union DateData, &d_lite_type, adat); - -#define get_d1b(x)\ - union DateData *bdat;\ - TypedData_Get_Struct(x, union DateData, &d_lite_type, bdat); - -#define get_d2(x,y)\ - union DateData *adat, *bdat;\ - TypedData_Get_Struct(x, union DateData, &d_lite_type, adat);\ - TypedData_Get_Struct(y, union DateData, &d_lite_type, bdat); - -inline static VALUE -canon(VALUE x) -{ - if (RB_TYPE_P(x, T_RATIONAL)) { - VALUE den = rb_rational_den(x); - if (FIXNUM_P(den) && FIX2LONG(den) == 1) - return rb_rational_num(x); - } - return x; -} - -#ifndef USE_PACK -#define set_to_simple(obj, x, _nth, _jd ,_sg, _year, _mon, _mday, _flags) \ -do {\ - RB_OBJ_WRITE((obj), &(x)->nth, canon(_nth)); \ - (x)->jd = _jd;\ - (x)->sg = (date_sg_t)(_sg);\ - (x)->year = _year;\ - (x)->mon = _mon;\ - (x)->mday = _mday;\ - (x)->flags = (_flags) & ~COMPLEX_DAT;\ -} while (0) -#else -#define set_to_simple(obj, x, _nth, _jd ,_sg, _year, _mon, _mday, _flags) \ -do {\ - RB_OBJ_WRITE((obj), &(x)->nth, canon(_nth)); \ - (x)->jd = _jd;\ - (x)->sg = (date_sg_t)(_sg);\ - (x)->year = _year;\ - (x)->pc = PACK2(_mon, _mday);\ - (x)->flags = (_flags) & ~COMPLEX_DAT;\ -} while (0) -#endif - -#ifndef USE_PACK -#define set_to_complex(obj, x, _nth, _jd ,_df, _sf, _of, _sg,\ -_year, _mon, _mday, _hour, _min, _sec, _flags) \ -do {\ - RB_OBJ_WRITE((obj), &(x)->nth, canon(_nth));\ - (x)->jd = _jd;\ - (x)->df = _df;\ - RB_OBJ_WRITE((obj), &(x)->sf, canon(_sf));\ - (x)->of = _of;\ - (x)->sg = (date_sg_t)(_sg);\ - (x)->year = _year;\ - (x)->mon = _mon;\ - (x)->mday = _mday;\ - (x)->hour = _hour;\ - (x)->min = _min;\ - (x)->sec = _sec;\ - (x)->flags = (_flags) | COMPLEX_DAT;\ -} while (0) -#else -#define set_to_complex(obj, x, _nth, _jd ,_df, _sf, _of, _sg,\ -_year, _mon, _mday, _hour, _min, _sec, _flags) \ -do {\ - RB_OBJ_WRITE((obj), &(x)->nth, canon(_nth));\ - (x)->jd = _jd;\ - (x)->df = _df;\ - RB_OBJ_WRITE((obj), &(x)->sf, canon(_sf));\ - (x)->of = _of;\ - (x)->sg = (date_sg_t)(_sg);\ - (x)->year = _year;\ - (x)->pc = PACK5(_mon, _mday, _hour, _min, _sec);\ - (x)->flags = (_flags) | COMPLEX_DAT;\ -} while (0) -#endif - -#ifndef USE_PACK -#define copy_simple_to_complex(obj, x, y) \ -do {\ - RB_OBJ_WRITE((obj), &(x)->nth, (y)->nth);\ - (x)->jd = (y)->jd;\ - (x)->df = 0;\ - (x)->sf = INT2FIX(0);\ - (x)->of = 0;\ - (x)->sg = (date_sg_t)((y)->sg);\ - (x)->year = (y)->year;\ - (x)->mon = (y)->mon;\ - (x)->mday = (y)->mday;\ - (x)->hour = 0;\ - (x)->min = 0;\ - (x)->sec = 0;\ - (x)->flags = (y)->flags;\ -} while (0) -#else -#define copy_simple_to_complex(obj, x, y) \ -do {\ - RB_OBJ_WRITE((obj), &(x)->nth, (y)->nth);\ - (x)->jd = (y)->jd;\ - (x)->df = 0;\ - RB_OBJ_WRITE((obj), &(x)->sf, INT2FIX(0));\ - (x)->of = 0;\ - (x)->sg = (date_sg_t)((y)->sg);\ - (x)->year = (y)->year;\ - (x)->pc = PACK5(EX_MON((y)->pc), EX_MDAY((y)->pc), 0, 0, 0);\ - (x)->flags = (y)->flags;\ -} while (0) -#endif - -#ifndef USE_PACK -#define copy_complex_to_simple(obj, x, y) \ -do {\ - RB_OBJ_WRITE((obj), &(x)->nth, (y)->nth);\ - (x)->jd = (y)->jd;\ - (x)->sg = (date_sg_t)((y)->sg);\ - (x)->year = (y)->year;\ - (x)->mon = (y)->mon;\ - (x)->mday = (y)->mday;\ - (x)->flags = (y)->flags;\ -} while (0) -#else -#define copy_complex_to_simple(obj, x, y) \ -do {\ - RB_OBJ_WRITE((obj), &(x)->nth, (y)->nth);\ - (x)->jd = (y)->jd;\ - (x)->sg = (date_sg_t)((y)->sg);\ - (x)->year = (y)->year;\ - (x)->pc = PACK2(EX_MON((y)->pc), EX_MDAY((y)->pc));\ - (x)->flags = (y)->flags;\ -} while (0) -#endif - -/* base */ - -static int c_valid_civil_p(int, int, int, double, - int *, int *, int *, int *); - -static int -c_find_fdoy(int y, double sg, int *rjd, int *ns) -{ - int d, rm, rd; - - for (d = 1; d < 31; d++) - if (c_valid_civil_p(y, 1, d, sg, &rm, &rd, rjd, ns)) - return 1; - return 0; -} - -static int -c_find_ldoy(int y, double sg, int *rjd, int *ns) -{ - int i, rm, rd; - - for (i = 0; i < 30; i++) - if (c_valid_civil_p(y, 12, 31 - i, sg, &rm, &rd, rjd, ns)) - return 1; - return 0; -} - -#ifndef NDEBUG -/* :nodoc: */ -static int -c_find_fdom(int y, int m, double sg, int *rjd, int *ns) -{ - int d, rm, rd; - - for (d = 1; d < 31; d++) - if (c_valid_civil_p(y, m, d, sg, &rm, &rd, rjd, ns)) - return 1; - return 0; -} -#endif - -static int -c_find_ldom(int y, int m, double sg, int *rjd, int *ns) -{ - int i, rm, rd; - - for (i = 0; i < 30; i++) - if (c_valid_civil_p(y, m, 31 - i, sg, &rm, &rd, rjd, ns)) - return 1; - return 0; -} - -static void -c_civil_to_jd(int y, int m, int d, double sg, int *rjd, int *ns) -{ - double a, b, jd; - - if (m <= 2) { - y -= 1; - m += 12; - } - a = floor(y / 100.0); - b = 2 - a + floor(a / 4.0); - jd = floor(365.25 * (y + 4716)) + - floor(30.6001 * (m + 1)) + - d + b - 1524; - if (jd < sg) { - jd -= b; - *ns = 0; - } - else - *ns = 1; - - *rjd = (int)jd; -} - -static void -c_jd_to_civil(int jd, double sg, int *ry, int *rm, int *rdom) -{ - double x, a, b, c, d, e, y, m, dom; - - if (jd < sg) - a = jd; - else { - x = floor((jd - 1867216.25) / 36524.25); - a = jd + 1 + x - floor(x / 4.0); - } - b = a + 1524; - c = floor((b - 122.1) / 365.25); - d = floor(365.25 * c); - e = floor((b - d) / 30.6001); - dom = b - d - floor(30.6001 * e); - if (e <= 13) { - m = e - 1; - y = c - 4716; - } - else { - m = e - 13; - y = c - 4715; - } - - *ry = (int)y; - *rm = (int)m; - *rdom = (int)dom; -} - -static void -c_ordinal_to_jd(int y, int d, double sg, int *rjd, int *ns) -{ - int ns2; - - c_find_fdoy(y, sg, rjd, &ns2); - *rjd += d - 1; - *ns = (*rjd < sg) ? 0 : 1; -} - -static void -c_jd_to_ordinal(int jd, double sg, int *ry, int *rd) -{ - int rm2, rd2, rjd, ns; - - c_jd_to_civil(jd, sg, ry, &rm2, &rd2); - c_find_fdoy(*ry, sg, &rjd, &ns); - *rd = (jd - rjd) + 1; -} - -static void -c_commercial_to_jd(int y, int w, int d, double sg, int *rjd, int *ns) -{ - int rjd2, ns2; - - c_find_fdoy(y, sg, &rjd2, &ns2); - rjd2 += 3; - *rjd = - (rjd2 - MOD((rjd2 - 1) + 1, 7)) + - 7 * (w - 1) + - (d - 1); - *ns = (*rjd < sg) ? 0 : 1; -} - -static void -c_jd_to_commercial(int jd, double sg, int *ry, int *rw, int *rd) -{ - int ry2, rm2, rd2, a, rjd2, ns2; - - c_jd_to_civil(jd - 3, sg, &ry2, &rm2, &rd2); - a = ry2; - c_commercial_to_jd(a + 1, 1, 1, sg, &rjd2, &ns2); - if (jd >= rjd2) - *ry = a + 1; - else { - c_commercial_to_jd(a, 1, 1, sg, &rjd2, &ns2); - *ry = a; - } - *rw = 1 + DIV(jd - rjd2, 7); - *rd = MOD(jd + 1, 7); - if (*rd == 0) - *rd = 7; -} - -static void -c_weeknum_to_jd(int y, int w, int d, int f, double sg, int *rjd, int *ns) -{ - int rjd2, ns2; - - c_find_fdoy(y, sg, &rjd2, &ns2); - rjd2 += 6; - *rjd = (rjd2 - MOD(((rjd2 - f) + 1), 7) - 7) + 7 * w + d; - *ns = (*rjd < sg) ? 0 : 1; -} - -static void -c_jd_to_weeknum(int jd, int f, double sg, int *ry, int *rw, int *rd) -{ - int rm, rd2, rjd, ns, j; - - c_jd_to_civil(jd, sg, ry, &rm, &rd2); - c_find_fdoy(*ry, sg, &rjd, &ns); - rjd += 6; - j = jd - (rjd - MOD((rjd - f) + 1, 7)) + 7; - *rw = (int)DIV(j, 7); - *rd = (int)MOD(j, 7); -} - -#ifndef NDEBUG -/* :nodoc: */ -static void -c_nth_kday_to_jd(int y, int m, int n, int k, double sg, int *rjd, int *ns) -{ - int rjd2, ns2; - - if (n > 0) { - c_find_fdom(y, m, sg, &rjd2, &ns2); - rjd2 -= 1; - } - else { - c_find_ldom(y, m, sg, &rjd2, &ns2); - rjd2 += 7; - } - *rjd = (rjd2 - MOD((rjd2 - k) + 1, 7)) + 7 * n; - *ns = (*rjd < sg) ? 0 : 1; -} -#endif - -inline static int -c_jd_to_wday(int jd) -{ - return MOD(jd + 1, 7); -} - -#ifndef NDEBUG -/* :nodoc: */ -static void -c_jd_to_nth_kday(int jd, double sg, int *ry, int *rm, int *rn, int *rk) -{ - int rd, rjd, ns2; - - c_jd_to_civil(jd, sg, ry, rm, &rd); - c_find_fdom(*ry, *rm, sg, &rjd, &ns2); - *rn = DIV(jd - rjd, 7) + 1; - *rk = c_jd_to_wday(jd); -} -#endif - -static int -c_valid_ordinal_p(int y, int d, double sg, - int *rd, int *rjd, int *ns) -{ - int ry2, rd2; - - if (d < 0) { - int rjd2, ns2; - - if (!c_find_ldoy(y, sg, &rjd2, &ns2)) - return 0; - c_jd_to_ordinal(rjd2 + d + 1, sg, &ry2, &rd2); - if (ry2 != y) - return 0; - d = rd2; - } - c_ordinal_to_jd(y, d, sg, rjd, ns); - c_jd_to_ordinal(*rjd, sg, &ry2, &rd2); - if (ry2 != y || rd2 != d) - return 0; - return 1; -} - -static const int monthtab[2][13] = { - { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, - { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } -}; - -inline static int -c_julian_leap_p(int y) -{ - return MOD(y, 4) == 0; -} - -inline static int -c_gregorian_leap_p(int y) -{ - return (MOD(y, 4) == 0 && y % 100 != 0) || MOD(y, 400) == 0; -} - -static int -c_julian_last_day_of_month(int y, int m) -{ - assert(m >= 1 && m <= 12); - return monthtab[c_julian_leap_p(y) ? 1 : 0][m]; -} - -static int -c_gregorian_last_day_of_month(int y, int m) -{ - assert(m >= 1 && m <= 12); - return monthtab[c_gregorian_leap_p(y) ? 1 : 0][m]; -} - -static int -c_valid_julian_p(int y, int m, int d, int *rm, int *rd) -{ - int last; - - if (m < 0) - m += 13; - if (m < 1 || m > 12) - return 0; - last = c_julian_last_day_of_month(y, m); - if (d < 0) - d = last + d + 1; - if (d < 1 || d > last) - return 0; - *rm = m; - *rd = d; - return 1; -} - -static int -c_valid_gregorian_p(int y, int m, int d, int *rm, int *rd) -{ - int last; - - if (m < 0) - m += 13; - if (m < 1 || m > 12) - return 0; - last = c_gregorian_last_day_of_month(y, m); - if (d < 0) - d = last + d + 1; - if (d < 1 || d > last) - return 0; - *rm = m; - *rd = d; - return 1; -} - -static int -c_valid_civil_p(int y, int m, int d, double sg, - int *rm, int *rd, int *rjd, int *ns) -{ - int ry; - - if (m < 0) - m += 13; - if (m < 1 || m > 12) - return 0; - if (d < 0) { - if (!c_find_ldom(y, m, sg, rjd, ns)) - return 0; - c_jd_to_civil(*rjd + d + 1, sg, &ry, rm, rd); - if (ry != y || *rm != m) - return 0; - d = *rd; - } - c_civil_to_jd(y, m, d, sg, rjd, ns); - c_jd_to_civil(*rjd, sg, &ry, rm, rd); - if (ry != y || *rm != m || *rd != d) - return 0; - return 1; -} - -static int -c_valid_commercial_p(int y, int w, int d, double sg, - int *rw, int *rd, int *rjd, int *ns) -{ - int ns2, ry2, rw2, rd2; - - if (d < 0) - d += 8; - if (w < 0) { - int rjd2; - - c_commercial_to_jd(y + 1, 1, 1, sg, &rjd2, &ns2); - c_jd_to_commercial(rjd2 + w * 7, sg, &ry2, &rw2, &rd2); - if (ry2 != y) - return 0; - w = rw2; - } - c_commercial_to_jd(y, w, d, sg, rjd, ns); - c_jd_to_commercial(*rjd, sg, &ry2, rw, rd); - if (y != ry2 || w != *rw || d != *rd) - return 0; - return 1; -} - -static int -c_valid_weeknum_p(int y, int w, int d, int f, double sg, - int *rw, int *rd, int *rjd, int *ns) -{ - int ns2, ry2, rw2, rd2; - - if (d < 0) - d += 7; - if (w < 0) { - int rjd2; - - c_weeknum_to_jd(y + 1, 1, f, f, sg, &rjd2, &ns2); - c_jd_to_weeknum(rjd2 + w * 7, f, sg, &ry2, &rw2, &rd2); - if (ry2 != y) - return 0; - w = rw2; - } - c_weeknum_to_jd(y, w, d, f, sg, rjd, ns); - c_jd_to_weeknum(*rjd, f, sg, &ry2, rw, rd); - if (y != ry2 || w != *rw || d != *rd) - return 0; - return 1; -} - -#ifndef NDEBUG -/* :nodoc: */ -static int -c_valid_nth_kday_p(int y, int m, int n, int k, double sg, - int *rm, int *rn, int *rk, int *rjd, int *ns) -{ - int ns2, ry2, rm2, rn2, rk2; - - if (k < 0) - k += 7; - if (n < 0) { - int t, ny, nm, rjd2; - - t = y * 12 + m; - ny = DIV(t, 12); - nm = MOD(t, 12) + 1; - - c_nth_kday_to_jd(ny, nm, 1, k, sg, &rjd2, &ns2); - c_jd_to_nth_kday(rjd2 + n * 7, sg, &ry2, &rm2, &rn2, &rk2); - if (ry2 != y || rm2 != m) - return 0; - n = rn2; - } - c_nth_kday_to_jd(y, m, n, k, sg, rjd, ns); - c_jd_to_nth_kday(*rjd, sg, &ry2, rm, rn, rk); - if (y != ry2 || m != *rm || n != *rn || k != *rk) - return 0; - return 1; -} -#endif - -static int -c_valid_time_p(int h, int min, int s, int *rh, int *rmin, int *rs) -{ - if (h < 0) - h += 24; - if (min < 0) - min += 60; - if (s < 0) - s += 60; - *rh = h; - *rmin = min; - *rs = s; - return !(h < 0 || h > 24 || - min < 0 || min > 59 || - s < 0 || s > 59 || - (h == 24 && (min > 0 || s > 0))); -} - -inline static int -c_valid_start_p(double sg) -{ - if (isnan(sg)) - return 0; - if (isinf(sg)) - return 1; - if (sg < REFORM_BEGIN_JD || sg > REFORM_END_JD) - return 0; - return 1; -} - -inline static int -df_local_to_utc(int df, int of) -{ - df -= of; - if (df < 0) - df += DAY_IN_SECONDS; - else if (df >= DAY_IN_SECONDS) - df -= DAY_IN_SECONDS; - return df; -} - -inline static int -df_utc_to_local(int df, int of) -{ - df += of; - if (df < 0) - df += DAY_IN_SECONDS; - else if (df >= DAY_IN_SECONDS) - df -= DAY_IN_SECONDS; - return df; -} - -inline static int -jd_local_to_utc(int jd, int df, int of) -{ - df -= of; - if (df < 0) - jd -= 1; - else if (df >= DAY_IN_SECONDS) - jd += 1; - return jd; -} - -inline static int -jd_utc_to_local(int jd, int df, int of) -{ - df += of; - if (df < 0) - jd -= 1; - else if (df >= DAY_IN_SECONDS) - jd += 1; - return jd; -} - -inline static int -time_to_df(int h, int min, int s) -{ - return h * HOUR_IN_SECONDS + min * MINUTE_IN_SECONDS + s; -} - -inline static void -df_to_time(int df, int *h, int *min, int *s) -{ - *h = df / HOUR_IN_SECONDS; - df %= HOUR_IN_SECONDS; - *min = df / MINUTE_IN_SECONDS; - *s = df % MINUTE_IN_SECONDS; -} - -static VALUE -sec_to_day(VALUE s) -{ - if (FIXNUM_P(s)) - return rb_rational_new2(s, INT2FIX(DAY_IN_SECONDS)); - return f_quo(s, INT2FIX(DAY_IN_SECONDS)); -} - -inline static VALUE -isec_to_day(int s) -{ - return sec_to_day(INT2FIX(s)); -} - -static VALUE -ns_to_day(VALUE n) -{ - if (FIXNUM_P(n)) - return rb_rational_new2(n, day_in_nanoseconds); - return f_quo(n, day_in_nanoseconds); -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -ms_to_sec(VALUE m) -{ - if (FIXNUM_P(m)) - return rb_rational_new2(m, INT2FIX(SECOND_IN_MILLISECONDS)); - return f_quo(m, INT2FIX(SECOND_IN_MILLISECONDS)); -} -#endif - -static VALUE -ns_to_sec(VALUE n) -{ - if (FIXNUM_P(n)) - return rb_rational_new2(n, INT2FIX(SECOND_IN_NANOSECONDS)); - return f_quo(n, INT2FIX(SECOND_IN_NANOSECONDS)); -} - -#ifndef NDEBUG -/* :nodoc: */ -inline static VALUE -ins_to_day(int n) -{ - return ns_to_day(INT2FIX(n)); -} -#endif - -static int -safe_mul_p(VALUE x, long m) -{ - long ix; - - if (!FIXNUM_P(x)) - return 0; - ix = FIX2LONG(x); - if (ix < 0) { - if (ix <= (FIXNUM_MIN / m)) - return 0; - } - else { - if (ix >= (FIXNUM_MAX / m)) - return 0; - } - return 1; -} - -static VALUE -day_to_sec(VALUE d) -{ - if (safe_mul_p(d, DAY_IN_SECONDS)) - return LONG2FIX(FIX2LONG(d) * DAY_IN_SECONDS); - return f_mul(d, INT2FIX(DAY_IN_SECONDS)); -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -day_to_ns(VALUE d) -{ - return f_mul(d, day_in_nanoseconds); -} -#endif - -static VALUE -sec_to_ms(VALUE s) -{ - if (safe_mul_p(s, SECOND_IN_MILLISECONDS)) - return LONG2FIX(FIX2LONG(s) * SECOND_IN_MILLISECONDS); - return f_mul(s, INT2FIX(SECOND_IN_MILLISECONDS)); -} - -static VALUE -sec_to_ns(VALUE s) -{ - if (safe_mul_p(s, SECOND_IN_NANOSECONDS)) - return LONG2FIX(FIX2LONG(s) * SECOND_IN_NANOSECONDS); - return f_mul(s, INT2FIX(SECOND_IN_NANOSECONDS)); -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -isec_to_ns(int s) -{ - return sec_to_ns(INT2FIX(s)); -} -#endif - -static VALUE -div_day(VALUE d, VALUE *f) -{ - if (f) - *f = f_mod(d, INT2FIX(1)); - return f_floor(d); -} - -static VALUE -div_df(VALUE d, VALUE *f) -{ - VALUE s = day_to_sec(d); - - if (f) - *f = f_mod(s, INT2FIX(1)); - return f_floor(s); -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -div_sf(VALUE s, VALUE *f) -{ - VALUE n = sec_to_ns(s); - - if (f) - *f = f_mod(n, INT2FIX(1)); - return f_floor(n); -} -#endif - -static void -decode_day(VALUE d, VALUE *jd, VALUE *df, VALUE *sf) -{ - VALUE f; - - *jd = div_day(d, &f); - *df = div_df(f, &f); - *sf = sec_to_ns(f); -} - -inline static double -s_virtual_sg(union DateData *x) -{ - if (isinf(x->s.sg)) - return x->s.sg; - if (f_zero_p(x->s.nth)) - return x->s.sg; - else if (f_negative_p(x->s.nth)) - return positive_inf; - return negative_inf; -} - -inline static double -c_virtual_sg(union DateData *x) -{ - if (isinf(x->c.sg)) - return x->c.sg; - if (f_zero_p(x->c.nth)) - return x->c.sg; - else if (f_negative_p(x->c.nth)) - return positive_inf; - return negative_inf; -} - -inline static double -m_virtual_sg(union DateData *x) -{ - if (simple_dat_p(x)) - return s_virtual_sg(x); - else - return c_virtual_sg(x); -} - -#define canonicalize_jd(_nth, _jd) \ -do {\ - if (_jd < 0) {\ - _nth = f_sub(_nth, INT2FIX(1));\ - _jd += CM_PERIOD;\ - }\ - if (_jd >= CM_PERIOD) {\ - _nth = f_add(_nth, INT2FIX(1));\ - _jd -= CM_PERIOD;\ - }\ -} while (0) - -inline static void -canonicalize_s_jd(VALUE obj, union DateData *x) -{ - int j = x->s.jd; - VALUE nth = x->s.nth; - assert(have_jd_p(x)); - canonicalize_jd(nth, x->s.jd); - RB_OBJ_WRITE(obj, &x->s.nth, nth); - if (x->s.jd != j) - x->flags &= ~HAVE_CIVIL; -} - -inline static void -get_s_jd(union DateData *x) -{ - assert(simple_dat_p(x)); - if (!have_jd_p(x)) { - int jd, ns; - - assert(have_civil_p(x)); -#ifndef USE_PACK - c_civil_to_jd(x->s.year, x->s.mon, x->s.mday, - s_virtual_sg(x), &jd, &ns); -#else - c_civil_to_jd(x->s.year, EX_MON(x->s.pc), EX_MDAY(x->s.pc), - s_virtual_sg(x), &jd, &ns); -#endif - x->s.jd = jd; - x->s.flags |= HAVE_JD; - } -} - -inline static void -get_s_civil(union DateData *x) -{ - assert(simple_dat_p(x)); - if (!have_civil_p(x)) { - int y, m, d; - - assert(have_jd_p(x)); - c_jd_to_civil(x->s.jd, s_virtual_sg(x), &y, &m, &d); - x->s.year = y; -#ifndef USE_PACK - x->s.mon = m; - x->s.mday = d; -#else - x->s.pc = PACK2(m, d); -#endif - x->s.flags |= HAVE_CIVIL; - } -} - -inline static void -get_c_df(union DateData *x) -{ - assert(complex_dat_p(x)); - if (!have_df_p(x)) { - assert(have_time_p(x)); -#ifndef USE_PACK - x->c.df = df_local_to_utc(time_to_df(x->c.hour, x->c.min, x->c.sec), - x->c.of); -#else - x->c.df = df_local_to_utc(time_to_df(EX_HOUR(x->c.pc), - EX_MIN(x->c.pc), - EX_SEC(x->c.pc)), - x->c.of); -#endif - x->c.flags |= HAVE_DF; - } -} - -inline static void -get_c_time(union DateData *x) -{ - assert(complex_dat_p(x)); - if (!have_time_p(x)) { -#ifndef USE_PACK - int r; - assert(have_df_p(x)); - r = df_utc_to_local(x->c.df, x->c.of); - df_to_time(r, &x->c.hour, &x->c.min, &x->c.sec); - x->c.flags |= HAVE_TIME; -#else - int r, m, d, h, min, s; - - assert(have_df_p(x)); - m = EX_MON(x->c.pc); - d = EX_MDAY(x->c.pc); - r = df_utc_to_local(x->c.df, x->c.of); - df_to_time(r, &h, &min, &s); - x->c.pc = PACK5(m, d, h, min, s); - x->c.flags |= HAVE_TIME; -#endif - } -} - -inline static void -canonicalize_c_jd(VALUE obj, union DateData *x) -{ - int j = x->c.jd; - VALUE nth = x->c.nth; - assert(have_jd_p(x)); - canonicalize_jd(nth, x->c.jd); - RB_OBJ_WRITE(obj, &x->c.nth, nth); - if (x->c.jd != j) - x->flags &= ~HAVE_CIVIL; -} - -inline static void -get_c_jd(union DateData *x) -{ - assert(complex_dat_p(x)); - if (!have_jd_p(x)) { - int jd, ns; - - assert(have_civil_p(x)); -#ifndef USE_PACK - c_civil_to_jd(x->c.year, x->c.mon, x->c.mday, - c_virtual_sg(x), &jd, &ns); -#else - c_civil_to_jd(x->c.year, EX_MON(x->c.pc), EX_MDAY(x->c.pc), - c_virtual_sg(x), &jd, &ns); -#endif - - get_c_time(x); -#ifndef USE_PACK - x->c.jd = jd_local_to_utc(jd, - time_to_df(x->c.hour, x->c.min, x->c.sec), - x->c.of); -#else - x->c.jd = jd_local_to_utc(jd, - time_to_df(EX_HOUR(x->c.pc), - EX_MIN(x->c.pc), - EX_SEC(x->c.pc)), - x->c.of); -#endif - x->c.flags |= HAVE_JD; - } -} - -inline static void -get_c_civil(union DateData *x) -{ - assert(complex_dat_p(x)); - if (!have_civil_p(x)) { -#ifndef USE_PACK - int jd, y, m, d; -#else - int jd, y, m, d, h, min, s; -#endif - - assert(have_jd_p(x)); - get_c_df(x); - jd = jd_utc_to_local(x->c.jd, x->c.df, x->c.of); - c_jd_to_civil(jd, c_virtual_sg(x), &y, &m, &d); - x->c.year = y; -#ifndef USE_PACK - x->c.mon = m; - x->c.mday = d; -#else - h = EX_HOUR(x->c.pc); - min = EX_MIN(x->c.pc); - s = EX_SEC(x->c.pc); - x->c.pc = PACK5(m, d, h, min, s); -#endif - x->c.flags |= HAVE_CIVIL; - } -} - -inline static int -local_jd(union DateData *x) -{ - assert(complex_dat_p(x)); - assert(have_jd_p(x)); - assert(have_df_p(x)); - return jd_utc_to_local(x->c.jd, x->c.df, x->c.of); -} - -inline static int -local_df(union DateData *x) -{ - assert(complex_dat_p(x)); - assert(have_df_p(x)); - return df_utc_to_local(x->c.df, x->c.of); -} - -static void -decode_year(VALUE y, double style, - VALUE *nth, int *ry) -{ - int period; - VALUE t; - - period = (style < 0) ? - CM_PERIOD_GCY : - CM_PERIOD_JCY; - if (FIXNUM_P(y)) { - long iy, it, inth; - - iy = FIX2LONG(y); - if (iy >= (FIXNUM_MAX - 4712)) - goto big; - it = iy + 4712; /* shift */ - inth = DIV(it, ((long)period)); - *nth = LONG2FIX(inth); - if (inth) - it = MOD(it, ((long)period)); - *ry = (int)it - 4712; /* unshift */ - return; - } - big: - t = f_add(y, INT2FIX(4712)); /* shift */ - *nth = f_idiv(t, INT2FIX(period)); - if (f_nonzero_p(*nth)) - t = f_mod(t, INT2FIX(period)); - *ry = FIX2INT(t) - 4712; /* unshift */ -} - -static void -encode_year(VALUE nth, int y, double style, - VALUE *ry) -{ - int period; - VALUE t; - - period = (style < 0) ? - CM_PERIOD_GCY : - CM_PERIOD_JCY; - if (f_zero_p(nth)) - *ry = INT2FIX(y); - else { - t = f_mul(INT2FIX(period), nth); - t = f_add(t, INT2FIX(y)); - *ry = t; - } -} - -static void -decode_jd(VALUE jd, VALUE *nth, int *rjd) -{ - *nth = f_idiv(jd, INT2FIX(CM_PERIOD)); - if (f_zero_p(*nth)) { - *rjd = FIX2INT(jd); - return; - } - *rjd = FIX2INT(f_mod(jd, INT2FIX(CM_PERIOD))); -} - -static void -encode_jd(VALUE nth, int jd, VALUE *rjd) -{ - if (f_zero_p(nth)) { - *rjd = INT2FIX(jd); - return; - } - *rjd = f_add(f_mul(INT2FIX(CM_PERIOD), nth), INT2FIX(jd)); -} - -inline static double -guess_style(VALUE y, double sg) /* -/+oo or zero */ -{ - double style = 0; - - if (isinf(sg)) - style = sg; - else if (!FIXNUM_P(y)) - style = f_positive_p(y) ? negative_inf : positive_inf; - else { - long iy = FIX2LONG(y); - - assert(FIXNUM_P(y)); - if (iy < REFORM_BEGIN_YEAR) - style = positive_inf; - else if (iy > REFORM_END_YEAR) - style = negative_inf; - } - return style; -} - -inline static void -m_canonicalize_jd(VALUE obj, union DateData *x) -{ - if (simple_dat_p(x)) { - get_s_jd(x); - canonicalize_s_jd(obj, x); - } - else { - get_c_jd(x); - canonicalize_c_jd(obj, x); - } -} - -inline static VALUE -m_nth(union DateData *x) -{ - if (simple_dat_p(x)) - return x->s.nth; - else { - get_c_civil(x); - return x->c.nth; - } -} - -inline static int -m_jd(union DateData *x) -{ - if (simple_dat_p(x)) { - get_s_jd(x); - return x->s.jd; - } - else { - get_c_jd(x); - return x->c.jd; - } -} - -static VALUE -m_real_jd(union DateData *x) -{ - VALUE nth, rjd; - int jd; - - nth = m_nth(x); - jd = m_jd(x); - - encode_jd(nth, jd, &rjd); - return rjd; -} - -static int -m_local_jd(union DateData *x) -{ - if (simple_dat_p(x)) { - get_s_jd(x); - return x->s.jd; - } - else { - get_c_jd(x); - get_c_df(x); - return local_jd(x); - } -} - -static VALUE -m_real_local_jd(union DateData *x) -{ - VALUE nth, rjd; - int jd; - - nth = m_nth(x); - jd = m_local_jd(x); - - encode_jd(nth, jd, &rjd); - return rjd; -} - -inline static int -m_df(union DateData *x) -{ - if (simple_dat_p(x)) - return 0; - else { - get_c_df(x); - return x->c.df; - } -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -m_df_in_day(union DateData *x) -{ - return isec_to_day(m_df(x)); -} -#endif - -static int -m_local_df(union DateData *x) -{ - if (simple_dat_p(x)) - return 0; - else { - get_c_df(x); - return local_df(x); - } -} - -#ifndef NDEBUG -static VALUE -m_local_df_in_day(union DateData *x) -{ - return isec_to_day(m_local_df(x)); -} -#endif - -inline static VALUE -m_sf(union DateData *x) -{ - if (simple_dat_p(x)) - return INT2FIX(0); - else - return x->c.sf; -} - -#ifndef NDEBUG -static VALUE -m_sf_in_day(union DateData *x) -{ - return ns_to_day(m_sf(x)); -} -#endif - -static VALUE -m_sf_in_sec(union DateData *x) -{ - return ns_to_sec(m_sf(x)); -} - -static VALUE -m_fr(union DateData *x) -{ - if (simple_dat_p(x)) - return INT2FIX(0); - else { - int df; - VALUE sf, fr; - - df = m_local_df(x); - sf = m_sf(x); - fr = isec_to_day(df); - if (f_nonzero_p(sf)) - fr = f_add(fr, ns_to_day(sf)); - return fr; - } -} - -#define HALF_DAYS_IN_SECONDS (DAY_IN_SECONDS / 2) - -static VALUE -m_ajd(union DateData *x) -{ - VALUE r, sf; - int df; - - if (simple_dat_p(x)) { - r = m_real_jd(x); - if (FIXNUM_P(r) && FIX2LONG(r) <= (FIXNUM_MAX / 2)) { - long ir = FIX2LONG(r); - ir = ir * 2 - 1; - return rb_rational_new2(LONG2FIX(ir), INT2FIX(2)); - } - else - return rb_rational_new2(f_sub(f_mul(r, - INT2FIX(2)), - INT2FIX(1)), - INT2FIX(2)); - } - - r = m_real_jd(x); - df = m_df(x); - df -= HALF_DAYS_IN_SECONDS; - if (df) - r = f_add(r, isec_to_day(df)); - sf = m_sf(x); - if (f_nonzero_p(sf)) - r = f_add(r, ns_to_day(sf)); - - return r; -} - -static VALUE -m_amjd(union DateData *x) -{ - VALUE r, sf; - int df; - - r = m_real_jd(x); - if (FIXNUM_P(r) && FIX2LONG(r) >= (FIXNUM_MIN + 2400001)) { - long ir = FIX2LONG(r); - ir -= 2400001; - r = rb_rational_new1(LONG2FIX(ir)); - } - else - r = rb_rational_new1(f_sub(m_real_jd(x), - INT2FIX(2400001))); - - if (simple_dat_p(x)) - return r; - - df = m_df(x); - if (df) - r = f_add(r, isec_to_day(df)); - sf = m_sf(x); - if (f_nonzero_p(sf)) - r = f_add(r, ns_to_day(sf)); - - return r; -} - -inline static int -m_of(union DateData *x) -{ - if (simple_dat_p(x)) - return 0; - else { - get_c_jd(x); - return x->c.of; - } -} - -static VALUE -m_of_in_day(union DateData *x) -{ - return isec_to_day(m_of(x)); -} - -inline static double -m_sg(union DateData *x) -{ - if (simple_dat_p(x)) - return x->s.sg; - else { - get_c_jd(x); - return x->c.sg; - } -} - -static int -m_julian_p(union DateData *x) -{ - int jd; - double sg; - - if (simple_dat_p(x)) { - get_s_jd(x); - jd = x->s.jd; - sg = s_virtual_sg(x); - } - else { - get_c_jd(x); - jd = x->c.jd; - sg = c_virtual_sg(x); - } - if (isinf(sg)) - return sg == positive_inf; - return jd < sg; -} - -inline static int -m_gregorian_p(union DateData *x) -{ - return !m_julian_p(x); -} - -inline static int -m_proleptic_julian_p(union DateData *x) -{ - double sg; - - sg = m_sg(x); - if (isinf(sg) && sg > 0) - return 1; - return 0; -} - -inline static int -m_proleptic_gregorian_p(union DateData *x) -{ - double sg; - - sg = m_sg(x); - if (isinf(sg) && sg < 0) - return 1; - return 0; -} - -inline static int -m_year(union DateData *x) -{ - if (simple_dat_p(x)) { - get_s_civil(x); - return x->s.year; - } - else { - get_c_civil(x); - return x->c.year; - } -} - -static VALUE -m_real_year(union DateData *x) -{ - VALUE nth, ry; - int year; - - nth = m_nth(x); - year = m_year(x); - - if (f_zero_p(nth)) - return INT2FIX(year); - - encode_year(nth, year, - m_gregorian_p(x) ? -1 : +1, - &ry); - return ry; -} - -inline static int -m_mon(union DateData *x) -{ - if (simple_dat_p(x)) { - get_s_civil(x); -#ifndef USE_PACK - return x->s.mon; -#else - return EX_MON(x->s.pc); -#endif - } - else { - get_c_civil(x); -#ifndef USE_PACK - return x->c.mon; -#else - return EX_MON(x->c.pc); -#endif - } -} - -inline static int -m_mday(union DateData *x) -{ - if (simple_dat_p(x)) { - get_s_civil(x); -#ifndef USE_PACK - return x->s.mday; -#else - return EX_MDAY(x->s.pc); -#endif - } - else { - get_c_civil(x); -#ifndef USE_PACK - return x->c.mday; -#else - return EX_MDAY(x->c.pc); -#endif - } -} - -static const int yeartab[2][13] = { - { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }, - { 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 } -}; - -static int -c_julian_to_yday(int y, int m, int d) -{ - assert(m >= 1 && m <= 12); - return yeartab[c_julian_leap_p(y) ? 1 : 0][m] + d; -} - -static int -c_gregorian_to_yday(int y, int m, int d) -{ - assert(m >= 1 && m <= 12); - return yeartab[c_gregorian_leap_p(y) ? 1 : 0][m] + d; -} - -static int -m_yday(union DateData *x) -{ - int jd, ry, rd; - double sg; - - jd = m_local_jd(x); - sg = m_virtual_sg(x); /* !=m_sg() */ - - if (m_proleptic_gregorian_p(x) || - (jd - sg) > 366) - return c_gregorian_to_yday(m_year(x), m_mon(x), m_mday(x)); - if (m_proleptic_julian_p(x)) - return c_julian_to_yday(m_year(x), m_mon(x), m_mday(x)); - c_jd_to_ordinal(jd, sg, &ry, &rd); - return rd; -} - -static int -m_wday(union DateData *x) -{ - return c_jd_to_wday(m_local_jd(x)); -} - -static int -m_cwyear(union DateData *x) -{ - int ry, rw, rd; - - c_jd_to_commercial(m_local_jd(x), m_virtual_sg(x), /* !=m_sg() */ - &ry, &rw, &rd); - return ry; -} - -static VALUE -m_real_cwyear(union DateData *x) -{ - VALUE nth, ry; - int year; - - nth = m_nth(x); - year = m_cwyear(x); - - if (f_zero_p(nth)) - return INT2FIX(year); - - encode_year(nth, year, - m_gregorian_p(x) ? -1 : +1, - &ry); - return ry; -} - -static int -m_cweek(union DateData *x) -{ - int ry, rw, rd; - - c_jd_to_commercial(m_local_jd(x), m_virtual_sg(x), /* !=m_sg() */ - &ry, &rw, &rd); - return rw; -} - -static int -m_cwday(union DateData *x) -{ - int w; - - w = m_wday(x); - if (w == 0) - w = 7; - return w; -} - -static int -m_wnumx(union DateData *x, int f) -{ - int ry, rw, rd; - - c_jd_to_weeknum(m_local_jd(x), f, m_virtual_sg(x), /* !=m_sg() */ - &ry, &rw, &rd); - return rw; -} - -static int -m_wnum0(union DateData *x) -{ - return m_wnumx(x, 0); -} - -static int -m_wnum1(union DateData *x) -{ - return m_wnumx(x, 1); -} - -inline static int -m_hour(union DateData *x) -{ - if (simple_dat_p(x)) - return 0; - else { - get_c_time(x); -#ifndef USE_PACK - return x->c.hour; -#else - return EX_HOUR(x->c.pc); -#endif - } -} - -inline static int -m_min(union DateData *x) -{ - if (simple_dat_p(x)) - return 0; - else { - get_c_time(x); -#ifndef USE_PACK - return x->c.min; -#else - return EX_MIN(x->c.pc); -#endif - } -} - -inline static int -m_sec(union DateData *x) -{ - if (simple_dat_p(x)) - return 0; - else { - get_c_time(x); -#ifndef USE_PACK - return x->c.sec; -#else - return EX_SEC(x->c.pc); -#endif - } -} - -#define decode_offset(of,s,h,m)\ -do {\ - int a;\ - s = (of < 0) ? '-' : '+';\ - a = (of < 0) ? -of : of;\ - h = a / HOUR_IN_SECONDS;\ - m = a % HOUR_IN_SECONDS / MINUTE_IN_SECONDS;\ -} while (0) - -static VALUE -of2str(int of) -{ - int s, h, m; - - decode_offset(of, s, h, m); - return rb_enc_sprintf(rb_usascii_encoding(), "%c%02d:%02d", s, h, m); -} - -static VALUE -m_zone(union DateData *x) -{ - if (simple_dat_p(x)) - return rb_usascii_str_new2("+00:00"); - return of2str(m_of(x)); -} - -inline static VALUE -f_kind_of_p(VALUE x, VALUE c) -{ - return rb_obj_is_kind_of(x, c); -} - -inline static VALUE -k_date_p(VALUE x) -{ - return f_kind_of_p(x, cDate); -} - -inline static VALUE -k_numeric_p(VALUE x) -{ - return f_kind_of_p(x, rb_cNumeric); -} - -inline static VALUE -k_rational_p(VALUE x) -{ - return f_kind_of_p(x, rb_cRational); -} - -static inline void -expect_numeric(VALUE x) -{ - if (!k_numeric_p(x)) - rb_raise(rb_eTypeError, "expected numeric"); -} - -#ifndef NDEBUG -/* :nodoc: */ -static void -civil_to_jd(VALUE y, int m, int d, double sg, - VALUE *nth, int *ry, - int *rjd, - int *ns) -{ - double style = guess_style(y, sg); - - if (style == 0) { - int jd; - - c_civil_to_jd(FIX2INT(y), m, d, sg, &jd, ns); - decode_jd(INT2FIX(jd), nth, rjd); - if (f_zero_p(*nth)) - *ry = FIX2INT(y); - else { - VALUE nth2; - decode_year(y, *ns ? -1 : +1, &nth2, ry); - } - } - else { - decode_year(y, style, nth, ry); - c_civil_to_jd(*ry, m, d, style, rjd, ns); - } -} - -static void -jd_to_civil(VALUE jd, double sg, - VALUE *nth, int *rjd, - int *ry, int *rm, int *rd) -{ - decode_jd(jd, nth, rjd); - c_jd_to_civil(*rjd, sg, ry, rm, rd); -} - -static void -ordinal_to_jd(VALUE y, int d, double sg, - VALUE *nth, int *ry, - int *rjd, - int *ns) -{ - double style = guess_style(y, sg); - - if (style == 0) { - int jd; - - c_ordinal_to_jd(FIX2INT(y), d, sg, &jd, ns); - decode_jd(INT2FIX(jd), nth, rjd); - if (f_zero_p(*nth)) - *ry = FIX2INT(y); - else { - VALUE nth2; - decode_year(y, *ns ? -1 : +1, &nth2, ry); - } - } - else { - decode_year(y, style, nth, ry); - c_ordinal_to_jd(*ry, d, style, rjd, ns); - } -} - -static void -jd_to_ordinal(VALUE jd, double sg, - VALUE *nth, int *rjd, - int *ry, int *rd) -{ - decode_jd(jd, nth, rjd); - c_jd_to_ordinal(*rjd, sg, ry, rd); -} - -static void -commercial_to_jd(VALUE y, int w, int d, double sg, - VALUE *nth, int *ry, - int *rjd, - int *ns) -{ - double style = guess_style(y, sg); - - if (style == 0) { - int jd; - - c_commercial_to_jd(FIX2INT(y), w, d, sg, &jd, ns); - decode_jd(INT2FIX(jd), nth, rjd); - if (f_zero_p(*nth)) - *ry = FIX2INT(y); - else { - VALUE nth2; - decode_year(y, *ns ? -1 : +1, &nth2, ry); - } - } - else { - decode_year(y, style, nth, ry); - c_commercial_to_jd(*ry, w, d, style, rjd, ns); - } -} - -static void -jd_to_commercial(VALUE jd, double sg, - VALUE *nth, int *rjd, - int *ry, int *rw, int *rd) -{ - decode_jd(jd, nth, rjd); - c_jd_to_commercial(*rjd, sg, ry, rw, rd); -} - -static void -weeknum_to_jd(VALUE y, int w, int d, int f, double sg, - VALUE *nth, int *ry, - int *rjd, - int *ns) -{ - double style = guess_style(y, sg); - - if (style == 0) { - int jd; - - c_weeknum_to_jd(FIX2INT(y), w, d, f, sg, &jd, ns); - decode_jd(INT2FIX(jd), nth, rjd); - if (f_zero_p(*nth)) - *ry = FIX2INT(y); - else { - VALUE nth2; - decode_year(y, *ns ? -1 : +1, &nth2, ry); - } - } - else { - decode_year(y, style, nth, ry); - c_weeknum_to_jd(*ry, w, d, f, style, rjd, ns); - } -} - -static void -jd_to_weeknum(VALUE jd, int f, double sg, - VALUE *nth, int *rjd, - int *ry, int *rw, int *rd) -{ - decode_jd(jd, nth, rjd); - c_jd_to_weeknum(*rjd, f, sg, ry, rw, rd); -} - -static void -nth_kday_to_jd(VALUE y, int m, int n, int k, double sg, - VALUE *nth, int *ry, - int *rjd, - int *ns) -{ - double style = guess_style(y, sg); - - if (style == 0) { - int jd; - - c_nth_kday_to_jd(FIX2INT(y), m, n, k, sg, &jd, ns); - decode_jd(INT2FIX(jd), nth, rjd); - if (f_zero_p(*nth)) - *ry = FIX2INT(y); - else { - VALUE nth2; - decode_year(y, *ns ? -1 : +1, &nth2, ry); - } - } - else { - decode_year(y, style, nth, ry); - c_nth_kday_to_jd(*ry, m, n, k, style, rjd, ns); - } -} - -static void -jd_to_nth_kday(VALUE jd, double sg, - VALUE *nth, int *rjd, - int *ry, int *rm, int *rn, int *rk) -{ - decode_jd(jd, nth, rjd); - c_jd_to_nth_kday(*rjd, sg, ry, rm, rn, rk); -} -#endif - -static int -valid_ordinal_p(VALUE y, int d, double sg, - VALUE *nth, int *ry, - int *rd, int *rjd, - int *ns) -{ - double style = guess_style(y, sg); - int r; - - if (style == 0) { - int jd; - - r = c_valid_ordinal_p(FIX2INT(y), d, sg, rd, &jd, ns); - if (!r) - return 0; - decode_jd(INT2FIX(jd), nth, rjd); - if (f_zero_p(*nth)) - *ry = FIX2INT(y); - else { - VALUE nth2; - decode_year(y, *ns ? -1 : +1, &nth2, ry); - } - } - else { - decode_year(y, style, nth, ry); - r = c_valid_ordinal_p(*ry, d, style, rd, rjd, ns); - } - return r; -} - -static int -valid_gregorian_p(VALUE y, int m, int d, - VALUE *nth, int *ry, - int *rm, int *rd) -{ - decode_year(y, -1, nth, ry); - return c_valid_gregorian_p(*ry, m, d, rm, rd); -} - -static int -valid_civil_p(VALUE y, int m, int d, double sg, - VALUE *nth, int *ry, - int *rm, int *rd, int *rjd, - int *ns) -{ - double style = guess_style(y, sg); - int r; - - if (style == 0) { - int jd; - - r = c_valid_civil_p(FIX2INT(y), m, d, sg, rm, rd, &jd, ns); - if (!r) - return 0; - decode_jd(INT2FIX(jd), nth, rjd); - if (f_zero_p(*nth)) - *ry = FIX2INT(y); - else { - VALUE nth2; - decode_year(y, *ns ? -1 : +1, &nth2, ry); - } - } - else { - decode_year(y, style, nth, ry); - if (style < 0) - r = c_valid_gregorian_p(*ry, m, d, rm, rd); - else - r = c_valid_julian_p(*ry, m, d, rm, rd); - if (!r) - return 0; - c_civil_to_jd(*ry, *rm, *rd, style, rjd, ns); - } - return r; -} - -static int -valid_commercial_p(VALUE y, int w, int d, double sg, - VALUE *nth, int *ry, - int *rw, int *rd, int *rjd, - int *ns) -{ - double style = guess_style(y, sg); - int r; - - if (style == 0) { - int jd; - - r = c_valid_commercial_p(FIX2INT(y), w, d, sg, rw, rd, &jd, ns); - if (!r) - return 0; - decode_jd(INT2FIX(jd), nth, rjd); - if (f_zero_p(*nth)) - *ry = FIX2INT(y); - else { - VALUE nth2; - decode_year(y, *ns ? -1 : +1, &nth2, ry); - } - } - else { - decode_year(y, style, nth, ry); - r = c_valid_commercial_p(*ry, w, d, style, rw, rd, rjd, ns); - } - return r; -} - -static int -valid_weeknum_p(VALUE y, int w, int d, int f, double sg, - VALUE *nth, int *ry, - int *rw, int *rd, int *rjd, - int *ns) -{ - double style = guess_style(y, sg); - int r; - - if (style == 0) { - int jd; - - r = c_valid_weeknum_p(FIX2INT(y), w, d, f, sg, rw, rd, &jd, ns); - if (!r) - return 0; - decode_jd(INT2FIX(jd), nth, rjd); - if (f_zero_p(*nth)) - *ry = FIX2INT(y); - else { - VALUE nth2; - decode_year(y, *ns ? -1 : +1, &nth2, ry); - } - } - else { - decode_year(y, style, nth, ry); - r = c_valid_weeknum_p(*ry, w, d, f, style, rw, rd, rjd, ns); - } - return r; -} - -#ifndef NDEBUG -/* :nodoc: */ -static int -valid_nth_kday_p(VALUE y, int m, int n, int k, double sg, - VALUE *nth, int *ry, - int *rm, int *rn, int *rk, int *rjd, - int *ns) -{ - double style = guess_style(y, sg); - int r; - - if (style == 0) { - int jd; - - r = c_valid_nth_kday_p(FIX2INT(y), m, n, k, sg, rm, rn, rk, &jd, ns); - if (!r) - return 0; - decode_jd(INT2FIX(jd), nth, rjd); - if (f_zero_p(*nth)) - *ry = FIX2INT(y); - else { - VALUE nth2; - decode_year(y, *ns ? -1 : +1, &nth2, ry); - } - } - else { - decode_year(y, style, nth, ry); - r = c_valid_nth_kday_p(*ry, m, n, k, style, rm, rn, rk, rjd, ns); - } - return r; -} -#endif - -VALUE date_zone_to_diff(VALUE); - -static int -offset_to_sec(VALUE vof, int *rof) -{ - int try_rational = 1; - - again: - switch (TYPE(vof)) { - case T_FIXNUM: - { - long n; - - n = FIX2LONG(vof); - if (n != -1 && n != 0 && n != 1) - return 0; - *rof = (int)n * DAY_IN_SECONDS; - return 1; - } - case T_FLOAT: - { - double n; - - n = RFLOAT_VALUE(vof) * DAY_IN_SECONDS; - if (n < -DAY_IN_SECONDS || n > DAY_IN_SECONDS) - return 0; - *rof = (int)round(n); - if (*rof != n) - rb_warning("fraction of offset is ignored"); - return 1; - } - default: - expect_numeric(vof); - vof = f_to_r(vof); - if (!k_rational_p(vof)) { - if (!try_rational) Check_Type(vof, T_RATIONAL); - try_rational = 0; - goto again; - } - /* fall through */ - case T_RATIONAL: - { - VALUE vs, vn, vd; - long n; - - vs = day_to_sec(vof); - - if (!k_rational_p(vs)) { - vn = vs; - goto rounded; - } - vn = rb_rational_num(vs); - vd = rb_rational_den(vs); - - if (FIXNUM_P(vn) && FIXNUM_P(vd) && (FIX2LONG(vd) == 1)) - n = FIX2LONG(vn); - else { - vn = f_round(vs); - if (!f_eqeq_p(vn, vs)) - rb_warning("fraction of offset is ignored"); - rounded: - if (!FIXNUM_P(vn)) - return 0; - n = FIX2LONG(vn); - if (n < -DAY_IN_SECONDS || n > DAY_IN_SECONDS) - return 0; - } - *rof = (int)n; - return 1; - } - case T_STRING: - { - VALUE vs = date_zone_to_diff(vof); - long n; - - if (!FIXNUM_P(vs)) - return 0; - n = FIX2LONG(vs); - if (n < -DAY_IN_SECONDS || n > DAY_IN_SECONDS) - return 0; - *rof = (int)n; - return 1; - } - } - return 0; -} - -/* date */ - -#define valid_sg(sg) \ -do {\ - if (!c_valid_start_p(sg)) {\ - sg = 0;\ - rb_warning("invalid start is ignored");\ - }\ -} while (0) - -static VALUE -valid_jd_sub(int argc, VALUE *argv, VALUE klass, int need_jd) -{ - double sg = NUM2DBL(argv[1]); - valid_sg(sg); - return argv[0]; -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -date_s__valid_jd_p(int argc, VALUE *argv, VALUE klass) -{ - VALUE vjd, vsg; - VALUE argv2[2]; - - rb_scan_args(argc, argv, "11", &vjd, &vsg); - - argv2[0] = vjd; - if (argc < 2) - argv2[1] = DBL2NUM(GREGORIAN); - else - argv2[1] = vsg; - - return valid_jd_sub(2, argv2, klass, 1); -} -#endif - -/* - * call-seq: - * Date.valid_jd?(jd, start = Date::ITALY) -> true - * - * Implemented for compatibility; - * returns +true+ unless +jd+ is invalid (i.e., not a Numeric). - * - * Date.valid_jd?(2451944) # => true - * - * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - * Related: Date.jd. - */ -static VALUE -date_s_valid_jd_p(int argc, VALUE *argv, VALUE klass) -{ - VALUE vjd, vsg; - VALUE argv2[2]; - - rb_scan_args(argc, argv, "11", &vjd, &vsg); - - RETURN_FALSE_UNLESS_NUMERIC(vjd); - argv2[0] = vjd; - if (argc < 2) - argv2[1] = INT2FIX(DEFAULT_SG); - else - argv2[1] = vsg; - - if (NIL_P(valid_jd_sub(2, argv2, klass, 0))) - return Qfalse; - return Qtrue; -} - -static VALUE -valid_civil_sub(int argc, VALUE *argv, VALUE klass, int need_jd) -{ - VALUE nth, y; - int m, d, ry, rm, rd; - double sg; - - y = argv[0]; - m = NUM2INT(argv[1]); - d = NUM2INT(argv[2]); - sg = NUM2DBL(argv[3]); - - valid_sg(sg); - - if (!need_jd && (guess_style(y, sg) < 0)) { - if (!valid_gregorian_p(y, m, d, - &nth, &ry, - &rm, &rd)) - return Qnil; - return INT2FIX(0); /* dummy */ - } - else { - int rjd, ns; - VALUE rjd2; - - if (!valid_civil_p(y, m, d, sg, - &nth, &ry, - &rm, &rd, &rjd, - &ns)) - return Qnil; - if (!need_jd) - return INT2FIX(0); /* dummy */ - encode_jd(nth, rjd, &rjd2); - return rjd2; - } -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -date_s__valid_civil_p(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vm, vd, vsg; - VALUE argv2[4]; - - rb_scan_args(argc, argv, "31", &vy, &vm, &vd, &vsg); - - argv2[0] = vy; - argv2[1] = vm; - argv2[2] = vd; - if (argc < 4) - argv2[3] = DBL2NUM(GREGORIAN); - else - argv2[3] = vsg; - - return valid_civil_sub(4, argv2, klass, 1); -} -#endif - -/* - * call-seq: - * Date.valid_civil?(year, month, mday, start = Date::ITALY) -> true or false - * - * Returns +true+ if the arguments define a valid ordinal date, - * +false+ otherwise: - * - * Date.valid_date?(2001, 2, 3) # => true - * Date.valid_date?(2001, 2, 29) # => false - * Date.valid_date?(2001, 2, -1) # => true - * - * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - * Related: Date.jd, Date.new. - */ -static VALUE -date_s_valid_civil_p(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vm, vd, vsg; - VALUE argv2[4]; - - rb_scan_args(argc, argv, "31", &vy, &vm, &vd, &vsg); - - RETURN_FALSE_UNLESS_NUMERIC(vy); - RETURN_FALSE_UNLESS_NUMERIC(vm); - RETURN_FALSE_UNLESS_NUMERIC(vd); - argv2[0] = vy; - argv2[1] = vm; - argv2[2] = vd; - if (argc < 4) - argv2[3] = INT2FIX(DEFAULT_SG); - else - argv2[3] = vsg; - - if (NIL_P(valid_civil_sub(4, argv2, klass, 0))) - return Qfalse; - return Qtrue; -} - -static VALUE -valid_ordinal_sub(int argc, VALUE *argv, VALUE klass, int need_jd) -{ - VALUE nth, y; - int d, ry, rd; - double sg; - - y = argv[0]; - d = NUM2INT(argv[1]); - sg = NUM2DBL(argv[2]); - - valid_sg(sg); - - { - int rjd, ns; - VALUE rjd2; - - if (!valid_ordinal_p(y, d, sg, - &nth, &ry, - &rd, &rjd, - &ns)) - return Qnil; - if (!need_jd) - return INT2FIX(0); /* dummy */ - encode_jd(nth, rjd, &rjd2); - return rjd2; - } -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -date_s__valid_ordinal_p(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vd, vsg; - VALUE argv2[3]; - - rb_scan_args(argc, argv, "21", &vy, &vd, &vsg); - - argv2[0] = vy; - argv2[1] = vd; - if (argc < 3) - argv2[2] = DBL2NUM(GREGORIAN); - else - argv2[2] = vsg; - - return valid_ordinal_sub(3, argv2, klass, 1); -} -#endif - -/* - * call-seq: - * Date.valid_ordinal?(year, yday, start = Date::ITALY) -> true or false - * - * Returns +true+ if the arguments define a valid ordinal date, - * +false+ otherwise: - * - * Date.valid_ordinal?(2001, 34) # => true - * Date.valid_ordinal?(2001, 366) # => false - * - * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - * Related: Date.jd, Date.ordinal. - */ -static VALUE -date_s_valid_ordinal_p(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vd, vsg; - VALUE argv2[3]; - - rb_scan_args(argc, argv, "21", &vy, &vd, &vsg); - - RETURN_FALSE_UNLESS_NUMERIC(vy); - RETURN_FALSE_UNLESS_NUMERIC(vd); - argv2[0] = vy; - argv2[1] = vd; - if (argc < 3) - argv2[2] = INT2FIX(DEFAULT_SG); - else - argv2[2] = vsg; - - if (NIL_P(valid_ordinal_sub(3, argv2, klass, 0))) - return Qfalse; - return Qtrue; -} - -static VALUE -valid_commercial_sub(int argc, VALUE *argv, VALUE klass, int need_jd) -{ - VALUE nth, y; - int w, d, ry, rw, rd; - double sg; - - y = argv[0]; - w = NUM2INT(argv[1]); - d = NUM2INT(argv[2]); - sg = NUM2DBL(argv[3]); - - valid_sg(sg); - - { - int rjd, ns; - VALUE rjd2; - - if (!valid_commercial_p(y, w, d, sg, - &nth, &ry, - &rw, &rd, &rjd, - &ns)) - return Qnil; - if (!need_jd) - return INT2FIX(0); /* dummy */ - encode_jd(nth, rjd, &rjd2); - return rjd2; - } -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -date_s__valid_commercial_p(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vw, vd, vsg; - VALUE argv2[4]; - - rb_scan_args(argc, argv, "31", &vy, &vw, &vd, &vsg); - - argv2[0] = vy; - argv2[1] = vw; - argv2[2] = vd; - if (argc < 4) - argv2[3] = DBL2NUM(GREGORIAN); - else - argv2[3] = vsg; - - return valid_commercial_sub(4, argv2, klass, 1); -} -#endif - -/* - * call-seq: - * Date.valid_commercial?(cwyear, cweek, cwday, start = Date::ITALY) -> true or false - * - * Returns +true+ if the arguments define a valid commercial date, - * +false+ otherwise: - * - * Date.valid_commercial?(2001, 5, 6) # => true - * Date.valid_commercial?(2001, 5, 8) # => false - * - * See Date.commercial. - * - * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - * Related: Date.jd, Date.commercial. - */ -static VALUE -date_s_valid_commercial_p(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vw, vd, vsg; - VALUE argv2[4]; - - rb_scan_args(argc, argv, "31", &vy, &vw, &vd, &vsg); - - RETURN_FALSE_UNLESS_NUMERIC(vy); - RETURN_FALSE_UNLESS_NUMERIC(vw); - RETURN_FALSE_UNLESS_NUMERIC(vd); - argv2[0] = vy; - argv2[1] = vw; - argv2[2] = vd; - if (argc < 4) - argv2[3] = INT2FIX(DEFAULT_SG); - else - argv2[3] = vsg; - - if (NIL_P(valid_commercial_sub(4, argv2, klass, 0))) - return Qfalse; - return Qtrue; -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -valid_weeknum_sub(int argc, VALUE *argv, VALUE klass, int need_jd) -{ - VALUE nth, y; - int w, d, f, ry, rw, rd; - double sg; - - y = argv[0]; - w = NUM2INT(argv[1]); - d = NUM2INT(argv[2]); - f = NUM2INT(argv[3]); - sg = NUM2DBL(argv[4]); - - valid_sg(sg); - - { - int rjd, ns; - VALUE rjd2; - - if (!valid_weeknum_p(y, w, d, f, sg, - &nth, &ry, - &rw, &rd, &rjd, - &ns)) - return Qnil; - if (!need_jd) - return INT2FIX(0); /* dummy */ - encode_jd(nth, rjd, &rjd2); - return rjd2; - } -} - -/* :nodoc: */ -static VALUE -date_s__valid_weeknum_p(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vw, vd, vf, vsg; - VALUE argv2[5]; - - rb_scan_args(argc, argv, "41", &vy, &vw, &vd, &vf, &vsg); - - argv2[0] = vy; - argv2[1] = vw; - argv2[2] = vd; - argv2[3] = vf; - if (argc < 5) - argv2[4] = DBL2NUM(GREGORIAN); - else - argv2[4] = vsg; - - return valid_weeknum_sub(5, argv2, klass, 1); -} - -/* :nodoc: */ -static VALUE -date_s_valid_weeknum_p(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vw, vd, vf, vsg; - VALUE argv2[5]; - - rb_scan_args(argc, argv, "41", &vy, &vw, &vd, &vf, &vsg); - - argv2[0] = vy; - argv2[1] = vw; - argv2[2] = vd; - argv2[3] = vf; - if (argc < 5) - argv2[4] = INT2FIX(DEFAULT_SG); - else - argv2[4] = vsg; - - if (NIL_P(valid_weeknum_sub(5, argv2, klass, 0))) - return Qfalse; - return Qtrue; -} - -static VALUE -valid_nth_kday_sub(int argc, VALUE *argv, VALUE klass, int need_jd) -{ - VALUE nth, y; - int m, n, k, ry, rm, rn, rk; - double sg; - - y = argv[0]; - m = NUM2INT(argv[1]); - n = NUM2INT(argv[2]); - k = NUM2INT(argv[3]); - sg = NUM2DBL(argv[4]); - - { - int rjd, ns; - VALUE rjd2; - - if (!valid_nth_kday_p(y, m, n, k, sg, - &nth, &ry, - &rm, &rn, &rk, &rjd, - &ns)) - return Qnil; - if (!need_jd) - return INT2FIX(0); /* dummy */ - encode_jd(nth, rjd, &rjd2); - return rjd2; - } -} - -/* :nodoc: */ -static VALUE -date_s__valid_nth_kday_p(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vm, vn, vk, vsg; - VALUE argv2[5]; - - rb_scan_args(argc, argv, "41", &vy, &vm, &vn, &vk, &vsg); - - argv2[0] = vy; - argv2[1] = vm; - argv2[2] = vn; - argv2[3] = vk; - if (argc < 5) - argv2[4] = DBL2NUM(GREGORIAN); - else - argv2[4] = vsg; - - return valid_nth_kday_sub(5, argv2, klass, 1); -} - -/* :nodoc: */ -static VALUE -date_s_valid_nth_kday_p(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vm, vn, vk, vsg; - VALUE argv2[5]; - - rb_scan_args(argc, argv, "41", &vy, &vm, &vn, &vk, &vsg); - - argv2[0] = vy; - argv2[1] = vm; - argv2[2] = vn; - argv2[3] = vk; - if (argc < 5) - argv2[4] = INT2FIX(DEFAULT_SG); - else - argv2[4] = vsg; - - if (NIL_P(valid_nth_kday_sub(5, argv2, klass, 0))) - return Qfalse; - return Qtrue; -} - -/* :nodoc: */ -static VALUE -date_s_zone_to_diff(VALUE klass, VALUE str) -{ - return date_zone_to_diff(str); -} -#endif - -/* - * call-seq: - * Date.julian_leap?(year) -> true or false - * - * Returns +true+ if the given year is a leap year - * in the {proleptic Julian calendar}[https://en.wikipedia.org/wiki/Proleptic_Julian_calendar], +false+ otherwise: - * - * Date.julian_leap?(1900) # => true - * Date.julian_leap?(1901) # => false - * - * Related: Date.gregorian_leap?. - */ -static VALUE -date_s_julian_leap_p(VALUE klass, VALUE y) -{ - VALUE nth; - int ry; - - check_numeric(y, "year"); - decode_year(y, +1, &nth, &ry); - return f_boolcast(c_julian_leap_p(ry)); -} - -/* - * call-seq: - * Date.gregorian_leap?(year) -> true or false - * - * Returns +true+ if the given year is a leap year - * in the {proleptic Gregorian calendar}[https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar], +false+ otherwise: - * - * Date.gregorian_leap?(2000) # => true - * Date.gregorian_leap?(2001) # => false - * - * Related: Date.julian_leap?. - */ -static VALUE -date_s_gregorian_leap_p(VALUE klass, VALUE y) -{ - VALUE nth; - int ry; - - check_numeric(y, "year"); - decode_year(y, -1, &nth, &ry); - return f_boolcast(c_gregorian_leap_p(ry)); -} - -static void -d_lite_gc_mark(void *ptr) -{ - union DateData *dat = ptr; - if (simple_dat_p(dat)) - rb_gc_mark(dat->s.nth); - else { - rb_gc_mark(dat->c.nth); - rb_gc_mark(dat->c.sf); - } -} - -static size_t -d_lite_memsize(const void *ptr) -{ - const union DateData *dat = ptr; - return complex_dat_p(dat) ? sizeof(struct ComplexDateData) : sizeof(struct SimpleDateData); -} - -#ifndef HAVE_RB_EXT_RACTOR_SAFE -# define RUBY_TYPED_FROZEN_SHAREABLE 0 -#endif - -static const rb_data_type_t d_lite_type = { - "Date", - {d_lite_gc_mark, RUBY_TYPED_DEFAULT_FREE, d_lite_memsize,}, - 0, 0, - RUBY_TYPED_FREE_IMMEDIATELY|RUBY_TYPED_WB_PROTECTED|RUBY_TYPED_FROZEN_SHAREABLE, -}; - -inline static VALUE -d_simple_new_internal(VALUE klass, - VALUE nth, int jd, - double sg, - int y, int m, int d, - unsigned flags) -{ - struct SimpleDateData *dat; - VALUE obj; - - obj = TypedData_Make_Struct(klass, struct SimpleDateData, - &d_lite_type, dat); - set_to_simple(obj, dat, nth, jd, sg, y, m, d, flags); - - assert(have_jd_p(dat) || have_civil_p(dat)); - - return obj; -} - -inline static VALUE -d_complex_new_internal(VALUE klass, - VALUE nth, int jd, - int df, VALUE sf, - int of, double sg, - int y, int m, int d, - int h, int min, int s, - unsigned flags) -{ - struct ComplexDateData *dat; - VALUE obj; - - obj = TypedData_Make_Struct(klass, struct ComplexDateData, - &d_lite_type, dat); - set_to_complex(obj, dat, nth, jd, df, sf, of, sg, - y, m, d, h, min, s, flags); - - assert(have_jd_p(dat) || have_civil_p(dat)); - assert(have_df_p(dat) || have_time_p(dat)); - - return obj; -} - -static VALUE -d_lite_s_alloc_simple(VALUE klass) -{ - return d_simple_new_internal(klass, - INT2FIX(0), 0, - DEFAULT_SG, - 0, 0, 0, - HAVE_JD); -} - -static VALUE -d_lite_s_alloc_complex(VALUE klass) -{ - return d_complex_new_internal(klass, - INT2FIX(0), 0, - 0, INT2FIX(0), - 0, DEFAULT_SG, - 0, 0, 0, - 0, 0, 0, - HAVE_JD | HAVE_DF); -} - -static VALUE -d_lite_s_alloc(VALUE klass) -{ - return d_lite_s_alloc_complex(klass); -} - -static void -old_to_new(VALUE ajd, VALUE of, VALUE sg, - VALUE *rnth, int *rjd, int *rdf, VALUE *rsf, - int *rof, double *rsg) -{ - VALUE jd, df, sf, of2, t; - - decode_day(f_add(ajd, half_days_in_day), - &jd, &df, &sf); - t = day_to_sec(of); - of2 = f_round(t); - - if (!f_eqeq_p(of2, t)) - rb_warning("fraction of offset is ignored"); - - decode_jd(jd, rnth, rjd); - - *rdf = NUM2INT(df); - *rsf = sf; - *rof = NUM2INT(of2); - *rsg = NUM2DBL(sg); - - if (*rdf < 0 || *rdf >= DAY_IN_SECONDS) - rb_raise(eDateError, "invalid day fraction"); - - if (f_lt_p(*rsf, INT2FIX(0)) || - f_ge_p(*rsf, INT2FIX(SECOND_IN_NANOSECONDS))) - - if (*rof < -DAY_IN_SECONDS || *rof > DAY_IN_SECONDS) { - *rof = 0; - rb_warning("invalid offset is ignored"); - } - - if (!c_valid_start_p(*rsg)) { - *rsg = DEFAULT_SG; - rb_warning("invalid start is ignored"); - } -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -date_s_new_bang(int argc, VALUE *argv, VALUE klass) -{ - VALUE ajd, of, sg, nth, sf; - int jd, df, rof; - double rsg; - - rb_scan_args(argc, argv, "03", &ajd, &of, &sg); - - switch (argc) { - case 0: - ajd = INT2FIX(0); - case 1: - of = INT2FIX(0); - case 2: - sg = INT2FIX(DEFAULT_SG); - } - - old_to_new(ajd, of, sg, - &nth, &jd, &df, &sf, &rof, &rsg); - - if (!df && f_zero_p(sf) && !rof) - return d_simple_new_internal(klass, - nth, jd, - rsg, - 0, 0, 0, - HAVE_JD); - else - return d_complex_new_internal(klass, - nth, jd, - df, sf, - rof, rsg, - 0, 0, 0, - 0, 0, 0, - HAVE_JD | HAVE_DF); -} -#endif - -inline static int -wholenum_p(VALUE x) -{ - if (FIXNUM_P(x)) - return 1; - switch (TYPE(x)) { - case T_BIGNUM: - return 1; - case T_FLOAT: - { - double d = RFLOAT_VALUE(x); - return round(d) == d; - } - break; - case T_RATIONAL: - { - VALUE den = rb_rational_den(x); - return FIXNUM_P(den) && FIX2LONG(den) == 1; - } - break; - } - return 0; -} - -inline static VALUE -to_integer(VALUE x) -{ - if (RB_INTEGER_TYPE_P(x)) - return x; - return f_to_i(x); -} - -inline static VALUE -d_trunc(VALUE d, VALUE *fr) -{ - VALUE rd; - - if (wholenum_p(d)) { - rd = to_integer(d); - *fr = INT2FIX(0); - } - else { - rd = f_idiv(d, INT2FIX(1)); - *fr = f_mod(d, INT2FIX(1)); - } - return rd; -} - -#define jd_trunc d_trunc -#define k_trunc d_trunc - -inline static VALUE -h_trunc(VALUE h, VALUE *fr) -{ - VALUE rh; - - if (wholenum_p(h)) { - rh = to_integer(h); - *fr = INT2FIX(0); - } - else { - rh = f_idiv(h, INT2FIX(1)); - *fr = f_mod(h, INT2FIX(1)); - *fr = f_quo(*fr, INT2FIX(24)); - } - return rh; -} - -inline static VALUE -min_trunc(VALUE min, VALUE *fr) -{ - VALUE rmin; - - if (wholenum_p(min)) { - rmin = to_integer(min); - *fr = INT2FIX(0); - } - else { - rmin = f_idiv(min, INT2FIX(1)); - *fr = f_mod(min, INT2FIX(1)); - *fr = f_quo(*fr, INT2FIX(1440)); - } - return rmin; -} - -inline static VALUE -s_trunc(VALUE s, VALUE *fr) -{ - VALUE rs; - - if (wholenum_p(s)) { - rs = to_integer(s); - *fr = INT2FIX(0); - } - else { - rs = f_idiv(s, INT2FIX(1)); - *fr = f_mod(s, INT2FIX(1)); - *fr = f_quo(*fr, INT2FIX(86400)); - } - return rs; -} - -#define num2num_with_frac(s,n) \ -do {\ - s = s##_trunc(v##s, &fr);\ - if (f_nonzero_p(fr)) {\ - if (argc > n)\ - rb_raise(eDateError, "invalid fraction");\ - fr2 = fr;\ - }\ -} while (0) - -#define num2int_with_frac(s,n) \ -do {\ - s = NUM2INT(s##_trunc(v##s, &fr));\ - if (f_nonzero_p(fr)) {\ - if (argc > n)\ - rb_raise(eDateError, "invalid fraction");\ - fr2 = fr;\ - }\ -} while (0) - -#define canon24oc() \ -do {\ - if (rh == 24) {\ - rh = 0;\ - fr2 = f_add(fr2, INT2FIX(1));\ - }\ -} while (0) - -#define add_frac() \ -do {\ - if (f_nonzero_p(fr2))\ - ret = d_lite_plus(ret, fr2);\ -} while (0) - -#define val2sg(vsg,dsg) \ -do {\ - dsg = NUM2DBL(vsg);\ - if (!c_valid_start_p(dsg)) {\ - dsg = DEFAULT_SG;\ - rb_warning("invalid start is ignored");\ - }\ -} while (0) - -static VALUE d_lite_plus(VALUE, VALUE); - -/* - * call-seq: - * Date.jd(jd = 0, start = Date::ITALY) -> date - * - * Returns a new \Date object formed from the arguments: - * - * Date.jd(2451944).to_s # => "2001-02-03" - * Date.jd(2451945).to_s # => "2001-02-04" - * Date.jd(0).to_s # => "-4712-01-01" - * - * The returned date is: - * - * - Gregorian, if the argument is greater than or equal to +start+: - * - * Date::ITALY # => 2299161 - * Date.jd(Date::ITALY).gregorian? # => true - * Date.jd(Date::ITALY + 1).gregorian? # => true - * - * - Julian, otherwise - * - * Date.jd(Date::ITALY - 1).julian? # => true - * - * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - * Related: Date.new. - */ -static VALUE -date_s_jd(int argc, VALUE *argv, VALUE klass) -{ - VALUE vjd, vsg, jd, fr, fr2, ret; - double sg; - - rb_scan_args(argc, argv, "02", &vjd, &vsg); - - jd = INT2FIX(0); - fr2 = INT2FIX(0); - sg = DEFAULT_SG; - - switch (argc) { - case 2: - val2sg(vsg, sg); - case 1: - check_numeric(vjd, "jd"); - num2num_with_frac(jd, positive_inf); - } - - { - VALUE nth; - int rjd; - - decode_jd(jd, &nth, &rjd); - ret = d_simple_new_internal(klass, - nth, rjd, - sg, - 0, 0, 0, - HAVE_JD); - } - add_frac(); - return ret; -} - -/* - * call-seq: - * Date.ordinal(year = -4712, yday = 1, start = Date::ITALY) -> date - * - * Returns a new \Date object formed fom the arguments. - * - * With no arguments, returns the date for January 1, -4712: - * - * Date.ordinal.to_s # => "-4712-01-01" - * - * With argument +year+, returns the date for January 1 of that year: - * - * Date.ordinal(2001).to_s # => "2001-01-01" - * Date.ordinal(-2001).to_s # => "-2001-01-01" - * - * With positive argument +yday+ == +n+, - * returns the date for the +nth+ day of the given year: - * - * Date.ordinal(2001, 14).to_s # => "2001-01-14" - * - * With negative argument +yday+, counts backward from the end of the year: - * - * Date.ordinal(2001, -14).to_s # => "2001-12-18" - * - * Raises an exception if +yday+ is zero or out of range. - * - * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - * Related: Date.jd, Date.new. - */ -static VALUE -date_s_ordinal(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vd, vsg, y, fr, fr2, ret; - int d; - double sg; - - rb_scan_args(argc, argv, "03", &vy, &vd, &vsg); - - y = INT2FIX(-4712); - d = 1; - fr2 = INT2FIX(0); - sg = DEFAULT_SG; - - switch (argc) { - case 3: - val2sg(vsg, sg); - case 2: - check_numeric(vd, "yday"); - num2int_with_frac(d, positive_inf); - case 1: - check_numeric(vy, "year"); - y = vy; - } - - { - VALUE nth; - int ry, rd, rjd, ns; - - if (!valid_ordinal_p(y, d, sg, - &nth, &ry, - &rd, &rjd, - &ns)) - rb_raise(eDateError, "invalid date"); - - ret = d_simple_new_internal(klass, - nth, rjd, - sg, - 0, 0, 0, - HAVE_JD); - } - add_frac(); - return ret; -} - -/* - * Same as Date.new. - */ -static VALUE -date_s_civil(int argc, VALUE *argv, VALUE klass) -{ - return date_initialize(argc, argv, d_lite_s_alloc_simple(klass)); -} - -/* - * call-seq: - * Date.new(year = -4712, month = 1, mday = 1, start = Date::ITALY) -> date - * - * Returns a new \Date object constructed from the given arguments: - * - * Date.new(2022).to_s # => "2022-01-01" - * Date.new(2022, 2).to_s # => "2022-02-01" - * Date.new(2022, 2, 4).to_s # => "2022-02-04" - * - * Argument +month+ should be in range (1..12) or range (-12..-1); - * when the argument is negative, counts backward from the end of the year: - * - * Date.new(2022, -11, 4).to_s # => "2022-02-04" - * - * Argument +mday+ should be in range (1..n) or range (-n..-1) - * where +n+ is the number of days in the month; - * when the argument is negative, counts backward from the end of the month. - * - * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - * Related: Date.jd. - */ -static VALUE -date_initialize(int argc, VALUE *argv, VALUE self) -{ - VALUE vy, vm, vd, vsg, y, fr, fr2, ret; - int m, d; - double sg; - struct SimpleDateData *dat = rb_check_typeddata(self, &d_lite_type); - - if (!simple_dat_p(dat)) { - rb_raise(rb_eTypeError, "Date expected"); - } - - rb_scan_args(argc, argv, "04", &vy, &vm, &vd, &vsg); - - y = INT2FIX(-4712); - m = 1; - d = 1; - fr2 = INT2FIX(0); - sg = DEFAULT_SG; - - switch (argc) { - case 4: - val2sg(vsg, sg); - case 3: - check_numeric(vd, "day"); - num2int_with_frac(d, positive_inf); - case 2: - check_numeric(vm, "month"); - m = NUM2INT(vm); - case 1: - check_numeric(vy, "year"); - y = vy; - } - - if (guess_style(y, sg) < 0) { - VALUE nth; - int ry, rm, rd; - - if (!valid_gregorian_p(y, m, d, - &nth, &ry, - &rm, &rd)) - rb_raise(eDateError, "invalid date"); - - set_to_simple(self, dat, nth, 0, sg, ry, rm, rd, HAVE_CIVIL); - } - else { - VALUE nth; - int ry, rm, rd, rjd, ns; - - if (!valid_civil_p(y, m, d, sg, - &nth, &ry, - &rm, &rd, &rjd, - &ns)) - rb_raise(eDateError, "invalid date"); - - set_to_simple(self, dat, nth, rjd, sg, ry, rm, rd, HAVE_JD | HAVE_CIVIL); - } - ret = self; - add_frac(); - return ret; -} - -/* - * call-seq: - * Date.commercial(cwyear = -4712, cweek = 1, cwday = 1, start = Date::ITALY) -> date - * - * Returns a new \Date object constructed from the arguments. - * - * Argument +cwyear+ gives the year, and should be an integer. - * - * Argument +cweek+ gives the index of the week within the year, - * and should be in range (1..53) or (-53..-1); - * in some years, 53 or -53 will be out-of-range; - * if negative, counts backward from the end of the year: - * - * Date.commercial(2022, 1, 1).to_s # => "2022-01-03" - * Date.commercial(2022, 52, 1).to_s # => "2022-12-26" - * - * Argument +cwday+ gives the indes of the weekday within the week, - * and should be in range (1..7) or (-7..-1); - * 1 or -7 is Monday; - * if negative, counts backward from the end of the week: - * - * Date.commercial(2022, 1, 1).to_s # => "2022-01-03" - * Date.commercial(2022, 1, -7).to_s # => "2022-01-03" - * - * When +cweek+ is 1: - * - * - If January 1 is a Friday, Saturday, or Sunday, - * the first week begins in the week after: - * - * Date::ABBR_DAYNAMES[Date.new(2023, 1, 1).wday] # => "Sun" - * Date.commercial(2023, 1, 1).to_s # => "2023-01-02" - Date.commercial(2023, 1, 7).to_s # => "2023-01-08" - * - * - Otherwise, the first week is the week of January 1, - * which may mean some of the days fall on the year before: - * - * Date::ABBR_DAYNAMES[Date.new(2020, 1, 1).wday] # => "Wed" - * Date.commercial(2020, 1, 1).to_s # => "2019-12-30" - Date.commercial(2020, 1, 7).to_s # => "2020-01-05" - * - * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - * Related: Date.jd, Date.new, Date.ordinal. - */ -static VALUE -date_s_commercial(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vw, vd, vsg, y, fr, fr2, ret; - int w, d; - double sg; - - rb_scan_args(argc, argv, "04", &vy, &vw, &vd, &vsg); - - y = INT2FIX(-4712); - w = 1; - d = 1; - fr2 = INT2FIX(0); - sg = DEFAULT_SG; - - switch (argc) { - case 4: - val2sg(vsg, sg); - case 3: - check_numeric(vd, "cwday"); - num2int_with_frac(d, positive_inf); - case 2: - check_numeric(vw, "cweek"); - w = NUM2INT(vw); - case 1: - check_numeric(vy, "year"); - y = vy; - } - - { - VALUE nth; - int ry, rw, rd, rjd, ns; - - if (!valid_commercial_p(y, w, d, sg, - &nth, &ry, - &rw, &rd, &rjd, - &ns)) - rb_raise(eDateError, "invalid date"); - - ret = d_simple_new_internal(klass, - nth, rjd, - sg, - 0, 0, 0, - HAVE_JD); - } - add_frac(); - return ret; -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -date_s_weeknum(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vw, vd, vf, vsg, y, fr, fr2, ret; - int w, d, f; - double sg; - - rb_scan_args(argc, argv, "05", &vy, &vw, &vd, &vf, &vsg); - - y = INT2FIX(-4712); - w = 0; - d = 1; - f = 0; - fr2 = INT2FIX(0); - sg = DEFAULT_SG; - - switch (argc) { - case 5: - val2sg(vsg, sg); - case 4: - f = NUM2INT(vf); - case 3: - num2int_with_frac(d, positive_inf); - case 2: - w = NUM2INT(vw); - case 1: - y = vy; - } - - { - VALUE nth; - int ry, rw, rd, rjd, ns; - - if (!valid_weeknum_p(y, w, d, f, sg, - &nth, &ry, - &rw, &rd, &rjd, - &ns)) - rb_raise(eDateError, "invalid date"); - - ret = d_simple_new_internal(klass, - nth, rjd, - sg, - 0, 0, 0, - HAVE_JD); - } - add_frac(); - return ret; -} - -/* :nodoc: */ -static VALUE -date_s_nth_kday(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vm, vn, vk, vsg, y, fr, fr2, ret; - int m, n, k; - double sg; - - rb_scan_args(argc, argv, "05", &vy, &vm, &vn, &vk, &vsg); - - y = INT2FIX(-4712); - m = 1; - n = 1; - k = 1; - fr2 = INT2FIX(0); - sg = DEFAULT_SG; - - switch (argc) { - case 5: - val2sg(vsg, sg); - case 4: - num2int_with_frac(k, positive_inf); - case 3: - n = NUM2INT(vn); - case 2: - m = NUM2INT(vm); - case 1: - y = vy; - } - - { - VALUE nth; - int ry, rm, rn, rk, rjd, ns; - - if (!valid_nth_kday_p(y, m, n, k, sg, - &nth, &ry, - &rm, &rn, &rk, &rjd, - &ns)) - rb_raise(eDateError, "invalid date"); - - ret = d_simple_new_internal(klass, - nth, rjd, - sg, - 0, 0, 0, - HAVE_JD); - } - add_frac(); - return ret; -} -#endif - -#if !defined(HAVE_GMTIME_R) -static struct tm* -gmtime_r(const time_t *t, struct tm *tm) -{ - auto struct tm *tmp = gmtime(t); - if (tmp) - *tm = *tmp; - return tmp; -} - -static struct tm* -localtime_r(const time_t *t, struct tm *tm) -{ - auto struct tm *tmp = localtime(t); - if (tmp) - *tm = *tmp; - return tmp; -} -#endif - -static void set_sg(union DateData *, double); - -/* - * call-seq: - * Date.today(start = Date::ITALY) -> date - * - * Returns a new \Date object constructed from the present date: - * - * Date.today.to_s # => "2022-07-06" - * - * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - */ -static VALUE -date_s_today(int argc, VALUE *argv, VALUE klass) -{ - VALUE vsg, nth, ret; - double sg; - time_t t; - struct tm tm; - int y, ry, m, d; - - rb_scan_args(argc, argv, "01", &vsg); - - if (argc < 1) - sg = DEFAULT_SG; - else - val2sg(vsg, sg); - - if (time(&t) == -1) - rb_sys_fail("time"); - tzset(); - if (!localtime_r(&t, &tm)) - rb_sys_fail("localtime"); - - y = tm.tm_year + 1900; - m = tm.tm_mon + 1; - d = tm.tm_mday; - - decode_year(INT2FIX(y), -1, &nth, &ry); - - ret = d_simple_new_internal(klass, - nth, 0, - GREGORIAN, - ry, m, d, - HAVE_CIVIL); - { - get_d1(ret); - set_sg(dat, sg); - } - return ret; -} - -#define set_hash0(k,v) rb_hash_aset(hash, k, v) -#define ref_hash0(k) rb_hash_aref(hash, k) -#define del_hash0(k) rb_hash_delete(hash, k) - -#define sym(x) ID2SYM(rb_intern(x"")) - -#define set_hash(k,v) set_hash0(sym(k), v) -#define ref_hash(k) ref_hash0(sym(k)) -#define del_hash(k) del_hash0(sym(k)) - -static VALUE -rt_rewrite_frags(VALUE hash) -{ - VALUE seconds; - - seconds = del_hash("seconds"); - if (!NIL_P(seconds)) { - VALUE offset, d, h, min, s, fr; - - offset = ref_hash("offset"); - if (!NIL_P(offset)) - seconds = f_add(seconds, offset); - - d = f_idiv(seconds, INT2FIX(DAY_IN_SECONDS)); - fr = f_mod(seconds, INT2FIX(DAY_IN_SECONDS)); - - h = f_idiv(fr, INT2FIX(HOUR_IN_SECONDS)); - fr = f_mod(fr, INT2FIX(HOUR_IN_SECONDS)); - - min = f_idiv(fr, INT2FIX(MINUTE_IN_SECONDS)); - fr = f_mod(fr, INT2FIX(MINUTE_IN_SECONDS)); - - s = f_idiv(fr, INT2FIX(1)); - fr = f_mod(fr, INT2FIX(1)); - - set_hash("jd", f_add(UNIX_EPOCH_IN_CJD, d)); - set_hash("hour", h); - set_hash("min", min); - set_hash("sec", s); - set_hash("sec_fraction", fr); - } - return hash; -} - -static VALUE d_lite_year(VALUE); -static VALUE d_lite_wday(VALUE); -static VALUE d_lite_jd(VALUE); - -static VALUE -rt_complete_frags(VALUE klass, VALUE hash) -{ - static VALUE tab = Qnil; - int g; - long e; - VALUE k, a, d; - - if (NIL_P(tab)) { - tab = f_frozen_ary(11, - f_frozen_ary(2, - sym("time"), - f_frozen_ary(3, - sym("hour"), - sym("min"), - sym("sec"))), - f_frozen_ary(2, - Qnil, - f_frozen_ary(1, - sym("jd"))), - f_frozen_ary(2, - sym("ordinal"), - f_frozen_ary(5, - sym("year"), - sym("yday"), - sym("hour"), - sym("min"), - sym("sec"))), - f_frozen_ary(2, - sym("civil"), - f_frozen_ary(6, - sym("year"), - sym("mon"), - sym("mday"), - sym("hour"), - sym("min"), - sym("sec"))), - f_frozen_ary(2, - sym("commercial"), - f_frozen_ary(6, - sym("cwyear"), - sym("cweek"), - sym("cwday"), - sym("hour"), - sym("min"), - sym("sec"))), - f_frozen_ary(2, - sym("wday"), - f_frozen_ary(4, - sym("wday"), - sym("hour"), - sym("min"), - sym("sec"))), - f_frozen_ary(2, - sym("wnum0"), - f_frozen_ary(6, - sym("year"), - sym("wnum0"), - sym("wday"), - sym("hour"), - sym("min"), - sym("sec"))), - f_frozen_ary(2, - sym("wnum1"), - f_frozen_ary(6, - sym("year"), - sym("wnum1"), - sym("wday"), - sym("hour"), - sym("min"), - sym("sec"))), - f_frozen_ary(2, - Qnil, - f_frozen_ary(6, - sym("cwyear"), - sym("cweek"), - sym("wday"), - sym("hour"), - sym("min"), - sym("sec"))), - f_frozen_ary(2, - Qnil, - f_frozen_ary(6, - sym("year"), - sym("wnum0"), - sym("cwday"), - sym("hour"), - sym("min"), - sym("sec"))), - f_frozen_ary(2, - Qnil, - f_frozen_ary(6, - sym("year"), - sym("wnum1"), - sym("cwday"), - sym("hour"), - sym("min"), - sym("sec")))); - rb_gc_register_mark_object(tab); - } - - { - long i, eno = 0, idx = 0; - - for (i = 0; i < RARRAY_LEN(tab); i++) { - VALUE x, a; - - x = RARRAY_AREF(tab, i); - a = RARRAY_AREF(x, 1); - - { - long j, n = 0; - - for (j = 0; j < RARRAY_LEN(a); j++) - if (!NIL_P(ref_hash0(RARRAY_AREF(a, j)))) - n++; - if (n > eno) { - eno = n; - idx = i; - } - } - } - if (eno == 0) - g = 0; - else { - g = 1; - k = RARRAY_AREF(RARRAY_AREF(tab, idx), 0); - a = RARRAY_AREF(RARRAY_AREF(tab, idx), 1); - e = eno; - } - } - - d = Qnil; - - if (g && !NIL_P(k) && (RARRAY_LEN(a) - e)) { - if (k == sym("ordinal")) { - if (NIL_P(ref_hash("year"))) { - if (NIL_P(d)) - d = date_s_today(0, (VALUE *)0, cDate); - set_hash("year", d_lite_year(d)); - } - if (NIL_P(ref_hash("yday"))) - set_hash("yday", INT2FIX(1)); - } - else if (k == sym("civil")) { - long i; - - for (i = 0; i < RARRAY_LEN(a); i++) { - VALUE e = RARRAY_AREF(a, i); - - if (!NIL_P(ref_hash0(e))) - break; - if (NIL_P(d)) - d = date_s_today(0, (VALUE *)0, cDate); - set_hash0(e, rb_funcall(d, SYM2ID(e), 0)); - } - if (NIL_P(ref_hash("mon"))) - set_hash("mon", INT2FIX(1)); - if (NIL_P(ref_hash("mday"))) - set_hash("mday", INT2FIX(1)); - } - else if (k == sym("commercial")) { - long i; - - for (i = 0; i < RARRAY_LEN(a); i++) { - VALUE e = RARRAY_AREF(a, i); - - if (!NIL_P(ref_hash0(e))) - break; - if (NIL_P(d)) - d = date_s_today(0, (VALUE *)0, cDate); - set_hash0(e, rb_funcall(d, SYM2ID(e), 0)); - } - if (NIL_P(ref_hash("cweek"))) - set_hash("cweek", INT2FIX(1)); - if (NIL_P(ref_hash("cwday"))) - set_hash("cwday", INT2FIX(1)); - } - else if (k == sym("wday")) { - if (NIL_P(d)) - d = date_s_today(0, (VALUE *)0, cDate); - set_hash("jd", d_lite_jd(f_add(f_sub(d, - d_lite_wday(d)), - ref_hash("wday")))); - } - else if (k == sym("wnum0")) { - long i; - - for (i = 0; i < RARRAY_LEN(a); i++) { - VALUE e = RARRAY_AREF(a, i); - - if (!NIL_P(ref_hash0(e))) - break; - if (NIL_P(d)) - d = date_s_today(0, (VALUE *)0, cDate); - set_hash0(e, rb_funcall(d, SYM2ID(e), 0)); - } - if (NIL_P(ref_hash("wnum0"))) - set_hash("wnum0", INT2FIX(0)); - if (NIL_P(ref_hash("wday"))) - set_hash("wday", INT2FIX(0)); - } - else if (k == sym("wnum1")) { - long i; - - for (i = 0; i < RARRAY_LEN(a); i++) { - VALUE e = RARRAY_AREF(a, i); - - if (!NIL_P(ref_hash0(e))) - break; - if (NIL_P(d)) - d = date_s_today(0, (VALUE *)0, cDate); - set_hash0(e, rb_funcall(d, SYM2ID(e), 0)); - } - if (NIL_P(ref_hash("wnum1"))) - set_hash("wnum1", INT2FIX(0)); - if (NIL_P(ref_hash("wday"))) - set_hash("wday", INT2FIX(1)); - } - } - - if (g && k == sym("time")) { - if (f_le_p(klass, cDateTime)) { - if (NIL_P(d)) - d = date_s_today(0, (VALUE *)0, cDate); - if (NIL_P(ref_hash("jd"))) - set_hash("jd", d_lite_jd(d)); - } - } - - if (NIL_P(ref_hash("hour"))) - set_hash("hour", INT2FIX(0)); - if (NIL_P(ref_hash("min"))) - set_hash("min", INT2FIX(0)); - if (NIL_P(ref_hash("sec"))) - set_hash("sec", INT2FIX(0)); - else if (f_gt_p(ref_hash("sec"), INT2FIX(59))) - set_hash("sec", INT2FIX(59)); - - return hash; -} - -static VALUE -rt__valid_jd_p(VALUE jd, VALUE sg) -{ - return jd; -} - -static VALUE -rt__valid_ordinal_p(VALUE y, VALUE d, VALUE sg) -{ - VALUE nth, rjd2; - int ry, rd, rjd, ns; - - if (!valid_ordinal_p(y, NUM2INT(d), NUM2DBL(sg), - &nth, &ry, - &rd, &rjd, - &ns)) - return Qnil; - encode_jd(nth, rjd, &rjd2); - return rjd2; -} - -static VALUE -rt__valid_civil_p(VALUE y, VALUE m, VALUE d, VALUE sg) -{ - VALUE nth, rjd2; - int ry, rm, rd, rjd, ns; - - if (!valid_civil_p(y, NUM2INT(m), NUM2INT(d), NUM2DBL(sg), - &nth, &ry, - &rm, &rd, &rjd, - &ns)) - return Qnil; - encode_jd(nth, rjd, &rjd2); - return rjd2; -} - -static VALUE -rt__valid_commercial_p(VALUE y, VALUE w, VALUE d, VALUE sg) -{ - VALUE nth, rjd2; - int ry, rw, rd, rjd, ns; - - if (!valid_commercial_p(y, NUM2INT(w), NUM2INT(d), NUM2DBL(sg), - &nth, &ry, - &rw, &rd, &rjd, - &ns)) - return Qnil; - encode_jd(nth, rjd, &rjd2); - return rjd2; -} - -static VALUE -rt__valid_weeknum_p(VALUE y, VALUE w, VALUE d, VALUE f, VALUE sg) -{ - VALUE nth, rjd2; - int ry, rw, rd, rjd, ns; - - if (!valid_weeknum_p(y, NUM2INT(w), NUM2INT(d), NUM2INT(f), NUM2DBL(sg), - &nth, &ry, - &rw, &rd, &rjd, - &ns)) - return Qnil; - encode_jd(nth, rjd, &rjd2); - return rjd2; -} - -static VALUE -rt__valid_date_frags_p(VALUE hash, VALUE sg) -{ - { - VALUE vjd; - - if (!NIL_P(vjd = ref_hash("jd"))) { - VALUE jd = rt__valid_jd_p(vjd, sg); - if (!NIL_P(jd)) - return jd; - } - } - - { - VALUE year, yday; - - if (!NIL_P(yday = ref_hash("yday")) && - !NIL_P(year = ref_hash("year"))) { - VALUE jd = rt__valid_ordinal_p(year, yday, sg); - if (!NIL_P(jd)) - return jd; - } - } - - { - VALUE year, mon, mday; - - if (!NIL_P(mday = ref_hash("mday")) && - !NIL_P(mon = ref_hash("mon")) && - !NIL_P(year = ref_hash("year"))) { - VALUE jd = rt__valid_civil_p(year, mon, mday, sg); - if (!NIL_P(jd)) - return jd; - } - } - - { - VALUE year, week, wday; - - wday = ref_hash("cwday"); - if (NIL_P(wday)) { - wday = ref_hash("wday"); - if (!NIL_P(wday)) - if (f_zero_p(wday)) - wday = INT2FIX(7); - } - - if (!NIL_P(wday) && - !NIL_P(week = ref_hash("cweek")) && - !NIL_P(year = ref_hash("cwyear"))) { - VALUE jd = rt__valid_commercial_p(year, week, wday, sg); - if (!NIL_P(jd)) - return jd; - } - } - - { - VALUE year, week, wday; - - wday = ref_hash("wday"); - if (NIL_P(wday)) { - wday = ref_hash("cwday"); - if (!NIL_P(wday)) - if (f_eqeq_p(wday, INT2FIX(7))) - wday = INT2FIX(0); - } - - if (!NIL_P(wday) && - !NIL_P(week = ref_hash("wnum0")) && - !NIL_P(year = ref_hash("year"))) { - VALUE jd = rt__valid_weeknum_p(year, week, wday, INT2FIX(0), sg); - if (!NIL_P(jd)) - return jd; - } - } - - { - VALUE year, week, wday; - - wday = ref_hash("wday"); - if (NIL_P(wday)) - wday = ref_hash("cwday"); - if (!NIL_P(wday)) - wday = f_mod(f_sub(wday, INT2FIX(1)), - INT2FIX(7)); - - if (!NIL_P(wday) && - !NIL_P(week = ref_hash("wnum1")) && - !NIL_P(year = ref_hash("year"))) { - VALUE jd = rt__valid_weeknum_p(year, week, wday, INT2FIX(1), sg); - if (!NIL_P(jd)) - return jd; - } - } - return Qnil; -} - -static VALUE -d_new_by_frags(VALUE klass, VALUE hash, VALUE sg) -{ - VALUE jd; - - if (!c_valid_start_p(NUM2DBL(sg))) { - sg = INT2FIX(DEFAULT_SG); - rb_warning("invalid start is ignored"); - } - - if (NIL_P(hash)) - rb_raise(eDateError, "invalid date"); - - if (NIL_P(ref_hash("jd")) && - NIL_P(ref_hash("yday")) && - !NIL_P(ref_hash("year")) && - !NIL_P(ref_hash("mon")) && - !NIL_P(ref_hash("mday"))) - jd = rt__valid_civil_p(ref_hash("year"), - ref_hash("mon"), - ref_hash("mday"), sg); - else { - hash = rt_rewrite_frags(hash); - hash = rt_complete_frags(klass, hash); - jd = rt__valid_date_frags_p(hash, sg); - } - - if (NIL_P(jd)) - rb_raise(eDateError, "invalid date"); - { - VALUE nth; - int rjd; - - decode_jd(jd, &nth, &rjd); - return d_simple_new_internal(klass, - nth, rjd, - NUM2DBL(sg), - 0, 0, 0, - HAVE_JD); - } -} - -VALUE date__strptime(const char *str, size_t slen, - const char *fmt, size_t flen, VALUE hash); - -static VALUE -date_s__strptime_internal(int argc, VALUE *argv, VALUE klass, - const char *default_fmt) -{ - VALUE vstr, vfmt, hash; - const char *str, *fmt; - size_t slen, flen; - - rb_scan_args(argc, argv, "11", &vstr, &vfmt); - - StringValue(vstr); - if (!rb_enc_str_asciicompat_p(vstr)) - rb_raise(rb_eArgError, - "string should have ASCII compatible encoding"); - str = RSTRING_PTR(vstr); - slen = RSTRING_LEN(vstr); - if (argc < 2) { - fmt = default_fmt; - flen = strlen(default_fmt); - } - else { - StringValue(vfmt); - if (!rb_enc_str_asciicompat_p(vfmt)) - rb_raise(rb_eArgError, - "format should have ASCII compatible encoding"); - fmt = RSTRING_PTR(vfmt); - flen = RSTRING_LEN(vfmt); - } - hash = rb_hash_new(); - if (NIL_P(date__strptime(str, slen, fmt, flen, hash))) - return Qnil; - - { - VALUE zone = ref_hash("zone"); - VALUE left = ref_hash("leftover"); - - if (!NIL_P(zone)) { - rb_enc_copy(zone, vstr); - set_hash("zone", zone); - } - if (!NIL_P(left)) { - rb_enc_copy(left, vstr); - set_hash("leftover", left); - } - } - - return hash; -} - -/* - * call-seq: - * Date._strptime(string, format = '%F') -> hash - * - * Returns a hash of values parsed from +string+ - * according to the given +format+: - * - * Date._strptime('2001-02-03', '%Y-%m-%d') # => {:year=>2001, :mon=>2, :mday=>3} - * - * For other formats, see - * {Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html]. - * (Unlike Date.strftime, does not support flags and width.) - * - * See also {strptime(3)}[https://man7.org/linux/man-pages/man3/strptime.3.html]. - * - * Related: Date.strptime (returns a \Date object). - */ -static VALUE -date_s__strptime(int argc, VALUE *argv, VALUE klass) -{ - return date_s__strptime_internal(argc, argv, klass, "%F"); -} - -/* - * call-seq: - * Date.strptime(string = '-4712-01-01', format = '%F', start = Date::ITALY) -> date - * - * Returns a new \Date object with values parsed from +string+, - * according to the given +format+: - * - * Date.strptime('2001-02-03', '%Y-%m-%d') # => # - * Date.strptime('03-02-2001', '%d-%m-%Y') # => # - * Date.strptime('2001-034', '%Y-%j') # => # - * Date.strptime('2001-W05-6', '%G-W%V-%u') # => # - * Date.strptime('2001 04 6', '%Y %U %w') # => # - * Date.strptime('2001 05 6', '%Y %W %u') # => # - * Date.strptime('sat3feb01', '%a%d%b%y') # => # - * - * For other formats, see - * {Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html]. - * (Unlike Date.strftime, does not support flags and width.) - * - * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - * See also {strptime(3)}[https://man7.org/linux/man-pages/man3/strptime.3.html]. - * - * Related: Date._strptime (returns a hash). - */ -static VALUE -date_s_strptime(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, fmt, sg; - - rb_scan_args(argc, argv, "03", &str, &fmt, &sg); - - switch (argc) { - case 0: - str = rb_str_new2(JULIAN_EPOCH_DATE); - case 1: - fmt = rb_str_new2("%F"); - case 2: - sg = INT2FIX(DEFAULT_SG); - } - - { - VALUE argv2[2], hash; - - argv2[0] = str; - argv2[1] = fmt; - hash = date_s__strptime(2, argv2, klass); - return d_new_by_frags(klass, hash, sg); - } -} - -VALUE date__parse(VALUE str, VALUE comp); - -static size_t -get_limit(VALUE opt) -{ - if (!NIL_P(opt)) { - VALUE limit = rb_hash_aref(opt, ID2SYM(rb_intern("limit"))); - if (NIL_P(limit)) return SIZE_MAX; - return NUM2SIZET(limit); - } - return 128; -} - -#ifndef HAVE_RB_CATEGORY_WARN -#define rb_category_warn(category, fmt) rb_warn(fmt) -#endif - -static void -check_limit(VALUE str, VALUE opt) -{ - size_t slen, limit; - if (NIL_P(str)) return; - StringValue(str); - slen = RSTRING_LEN(str); - limit = get_limit(opt); - if (slen > limit) { - rb_raise(rb_eArgError, - "string length (%"PRI_SIZE_PREFIX"u) exceeds the limit %"PRI_SIZE_PREFIX"u", slen, limit); - } -} - -static VALUE -date_s__parse_internal(int argc, VALUE *argv, VALUE klass) -{ - VALUE vstr, vcomp, hash, opt; - - argc = rb_scan_args(argc, argv, "11:", &vstr, &vcomp, &opt); - check_limit(vstr, opt); - StringValue(vstr); - if (!rb_enc_str_asciicompat_p(vstr)) - rb_raise(rb_eArgError, - "string should have ASCII compatible encoding"); - if (argc < 2) - vcomp = Qtrue; - - hash = date__parse(vstr, vcomp); - - return hash; -} - -/* - * call-seq: - * Date._parse(string, comp = true, limit: 128) -> hash - * - * Note: - * This method recognizes many forms in +string+, - * but it is not a validator. - * For formats, see - * {"Specialized Format Strings" in Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-Specialized+Format+Strings] - * - * If +string+ does not specify a valid date, - * the result is unpredictable; - * consider using Date._strptime instead. - * - * Returns a hash of values parsed from +string+: - * - * Date._parse('2001-02-03') # => {:year=>2001, :mon=>2, :mday=>3} - * - * If +comp+ is +true+ and the given year is in the range (0..99), - * the current century is supplied; - * otherwise, the year is taken as given: - * - * Date._parse('01-02-03', true) # => {:year=>2001, :mon=>2, :mday=>3} - * Date._parse('01-02-03', false) # => {:year=>1, :mon=>2, :mday=>3} - * - * See argument {limit}[rdoc-ref:Date@Argument+limit]. - * - * Related: Date.parse(returns a \Date object). - */ -static VALUE -date_s__parse(int argc, VALUE *argv, VALUE klass) -{ - return date_s__parse_internal(argc, argv, klass); -} - -/* - * call-seq: - * Date.parse(string = '-4712-01-01', comp = true, start = Date::ITALY, limit: 128) -> date - * - * Note: - * This method recognizes many forms in +string+, - * but it is not a validator. - * For formats, see - * {"Specialized Format Strings" in Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-Specialized+Format+Strings] - * If +string+ does not specify a valid date, - * the result is unpredictable; - * consider using Date._strptime instead. - * - * Returns a new \Date object with values parsed from +string+: - * - * Date.parse('2001-02-03') # => # - * Date.parse('20010203') # => # - * Date.parse('3rd Feb 2001') # => # - * - * If +comp+ is +true+ and the given year is in the range (0..99), - * the current century is supplied; - * otherwise, the year is taken as given: - * - * Date.parse('01-02-03', true) # => # - * Date.parse('01-02-03', false) # => # - * - * See: - * - * - Argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - Argument {limit}[rdoc-ref:Date@Argument+limit]. - * - * Related: Date._parse (returns a hash). - */ -static VALUE -date_s_parse(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, comp, sg, opt; - - argc = rb_scan_args(argc, argv, "03:", &str, &comp, &sg, &opt); - - switch (argc) { - case 0: - str = rb_str_new2(JULIAN_EPOCH_DATE); - case 1: - comp = Qtrue; - case 2: - sg = INT2FIX(DEFAULT_SG); - } - - { - int argc2 = 2; - VALUE argv2[3], hash; - argv2[0] = str; - argv2[1] = comp; - if (!NIL_P(opt)) argv2[argc2++] = opt; - hash = date_s__parse(argc2, argv2, klass); - return d_new_by_frags(klass, hash, sg); - } -} - -VALUE date__iso8601(VALUE); -VALUE date__rfc3339(VALUE); -VALUE date__xmlschema(VALUE); -VALUE date__rfc2822(VALUE); -VALUE date__httpdate(VALUE); -VALUE date__jisx0301(VALUE); - -/* - * call-seq: - * Date._iso8601(string, limit: 128) -> hash - * - * Returns a hash of values parsed from +string+, which should contain - * an {ISO 8601 formatted date}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-ISO+8601+Format+Specifications]: - * - * d = Date.new(2001, 2, 3) - * s = d.iso8601 # => "2001-02-03" - * Date._iso8601(s) # => {:mday=>3, :year=>2001, :mon=>2} - * - * See argument {limit}[rdoc-ref:Date@Argument+limit]. - * - * Related: Date.iso8601 (returns a \Date object). - */ -static VALUE -date_s__iso8601(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, opt; - - rb_scan_args(argc, argv, "1:", &str, &opt); - check_limit(str, opt); - - return date__iso8601(str); -} - -/* - * call-seq: - * Date.iso8601(string = '-4712-01-01', start = Date::ITALY, limit: 128) -> date - * - * Returns a new \Date object with values parsed from +string+, - * which should contain - * an {ISO 8601 formatted date}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-ISO+8601+Format+Specifications]: - * - * d = Date.new(2001, 2, 3) - * s = d.iso8601 # => "2001-02-03" - * Date.iso8601(s) # => # - * - * See: - * - * - Argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - Argument {limit}[rdoc-ref:Date@Argument+limit]. - * - * Related: Date._iso8601 (returns a hash). - */ -static VALUE -date_s_iso8601(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, sg, opt; - - argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - - switch (argc) { - case 0: - str = rb_str_new2(JULIAN_EPOCH_DATE); - case 1: - sg = INT2FIX(DEFAULT_SG); - } - - { - int argc2 = 1; - VALUE argv2[2], hash; - argv2[0] = str; - if (!NIL_P(opt)) argv2[argc2++] = opt; - hash = date_s__iso8601(argc2, argv2, klass); - return d_new_by_frags(klass, hash, sg); - } -} - -/* - * call-seq: - * Date._rfc3339(string, limit: 128) -> hash - * - * Returns a hash of values parsed from +string+, which should be a valid - * {RFC 3339 format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-RFC+3339+Format]: - * - * d = Date.new(2001, 2, 3) - * s = d.rfc3339 # => "2001-02-03T00:00:00+00:00" - * Date._rfc3339(s) - * # => {:year=>2001, :mon=>2, :mday=>3, :hour=>0, :min=>0, :sec=>0, :zone=>"+00:00", :offset=>0} - * - * See argument {limit}[rdoc-ref:Date@Argument+limit]. - * - * Related: Date.rfc3339 (returns a \Date object). - */ -static VALUE -date_s__rfc3339(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, opt; - - rb_scan_args(argc, argv, "1:", &str, &opt); - check_limit(str, opt); - - return date__rfc3339(str); -} - -/* - * call-seq: - * Date.rfc3339(string = '-4712-01-01T00:00:00+00:00', start = Date::ITALY, limit: 128) -> date - * - * Returns a new \Date object with values parsed from +string+, - * which should be a valid - * {RFC 3339 format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-RFC+3339+Format]: - * - * d = Date.new(2001, 2, 3) - * s = d.rfc3339 # => "2001-02-03T00:00:00+00:00" - * Date.rfc3339(s) # => # - * - * See: - * - * - Argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - Argument {limit}[rdoc-ref:Date@Argument+limit]. - * - * Related: Date._rfc3339 (returns a hash). - */ -static VALUE -date_s_rfc3339(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, sg, opt; - - argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - - switch (argc) { - case 0: - str = rb_str_new2(JULIAN_EPOCH_DATETIME); - case 1: - sg = INT2FIX(DEFAULT_SG); - } - - { - int argc2 = 1; - VALUE argv2[2], hash; - argv2[0] = str; - if (!NIL_P(opt)) argv2[argc2++] = opt; - hash = date_s__rfc3339(argc2, argv2, klass); - return d_new_by_frags(klass, hash, sg); - } -} - -/* - * call-seq: - * Date._xmlschema(string, limit: 128) -> hash - * - * Returns a hash of values parsed from +string+, which should be a valid - * XML date format: - * - * d = Date.new(2001, 2, 3) - * s = d.xmlschema # => "2001-02-03" - * Date._xmlschema(s) # => {:year=>2001, :mon=>2, :mday=>3} - * - * See argument {limit}[rdoc-ref:Date@Argument+limit]. - * - * Related: Date.xmlschema (returns a \Date object). - */ -static VALUE -date_s__xmlschema(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, opt; - - rb_scan_args(argc, argv, "1:", &str, &opt); - check_limit(str, opt); - - return date__xmlschema(str); -} - -/* - * call-seq: - * Date.xmlschema(string = '-4712-01-01', start = Date::ITALY, limit: 128) -> date - * - * Returns a new \Date object with values parsed from +string+, - * which should be a valid XML date format: - * - * d = Date.new(2001, 2, 3) - * s = d.xmlschema # => "2001-02-03" - * Date.xmlschema(s) # => # - * - * See: - * - * - Argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - Argument {limit}[rdoc-ref:Date@Argument+limit]. - * - * Related: Date._xmlschema (returns a hash). - */ -static VALUE -date_s_xmlschema(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, sg, opt; - - argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - - switch (argc) { - case 0: - str = rb_str_new2(JULIAN_EPOCH_DATE); - case 1: - sg = INT2FIX(DEFAULT_SG); - } - - { - int argc2 = 1; - VALUE argv2[2], hash; - argv2[0] = str; - if (!NIL_P(opt)) argv2[argc2++] = opt; - hash = date_s__xmlschema(argc2, argv2, klass); - return d_new_by_frags(klass, hash, sg); - } -} - -/* - * call-seq: - * Date._rfc2822(string, limit: 128) -> hash - * - * Returns a hash of values parsed from +string+, which should be a valid - * {RFC 2822 date format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-RFC+2822+Format]: - * - * d = Date.new(2001, 2, 3) - * s = d.rfc2822 # => "Sat, 3 Feb 2001 00:00:00 +0000" - * Date._rfc2822(s) - * # => {:wday=>6, :mday=>3, :mon=>2, :year=>2001, :hour=>0, :min=>0, :sec=>0, :zone=>"+0000", :offset=>0} - * - * See argument {limit}[rdoc-ref:Date@Argument+limit]. - * - * Related: Date.rfc2822 (returns a \Date object). - */ -static VALUE -date_s__rfc2822(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, opt; - - rb_scan_args(argc, argv, "1:", &str, &opt); - check_limit(str, opt); - - return date__rfc2822(str); -} - -/* - * call-seq: - * Date.rfc2822(string = 'Mon, 1 Jan -4712 00:00:00 +0000', start = Date::ITALY, limit: 128) -> date - * - * Returns a new \Date object with values parsed from +string+, - * which should be a valid - * {RFC 2822 date format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-RFC+2822+Format]: - * - * d = Date.new(2001, 2, 3) - * s = d.rfc2822 # => "Sat, 3 Feb 2001 00:00:00 +0000" - * Date.rfc2822(s) # => # - * - * See: - * - * - Argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - Argument {limit}[rdoc-ref:Date@Argument+limit]. - * - * Related: Date._rfc2822 (returns a hash). - */ -static VALUE -date_s_rfc2822(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, sg, opt; - - argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - - switch (argc) { - case 0: - str = rb_str_new2(JULIAN_EPOCH_DATETIME_RFC3339); - case 1: - sg = INT2FIX(DEFAULT_SG); - } - - { - int argc2 = 1; - VALUE argv2[2], hash; - argv2[0] = str; - if (!NIL_P(opt)) argv2[argc2++] = opt; - hash = date_s__rfc2822(argc2, argv2, klass); - return d_new_by_frags(klass, hash, sg); - } -} - -/* - * call-seq: - * Date._httpdate(string, limit: 128) -> hash - * - * Returns a hash of values parsed from +string+, which should be a valid - * {HTTP date format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-HTTP+Format]: - * - * d = Date.new(2001, 2, 3) - * s = d.httpdate # => "Sat, 03 Feb 2001 00:00:00 GMT" - * Date._httpdate(s) - * # => {:wday=>6, :mday=>3, :mon=>2, :year=>2001, :hour=>0, :min=>0, :sec=>0, :zone=>"GMT", :offset=>0} - * - * Related: Date.httpdate (returns a \Date object). - */ -static VALUE -date_s__httpdate(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, opt; - - rb_scan_args(argc, argv, "1:", &str, &opt); - check_limit(str, opt); - - return date__httpdate(str); -} - -/* - * call-seq: - * Date.httpdate(string = 'Mon, 01 Jan -4712 00:00:00 GMT', start = Date::ITALY, limit: 128) -> date - * - * Returns a new \Date object with values parsed from +string+, - * which should be a valid - * {HTTP date format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-HTTP+Format]: - * - * d = Date.new(2001, 2, 3) - s = d.httpdate # => "Sat, 03 Feb 2001 00:00:00 GMT" - Date.httpdate(s) # => # - * - * See: - * - * - Argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - Argument {limit}[rdoc-ref:Date@Argument+limit]. - * - * Related: Date._httpdate (returns a hash). - */ -static VALUE -date_s_httpdate(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, sg, opt; - - argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - - switch (argc) { - case 0: - str = rb_str_new2(JULIAN_EPOCH_DATETIME_HTTPDATE); - case 1: - sg = INT2FIX(DEFAULT_SG); - } - - { - int argc2 = 1; - VALUE argv2[2], hash; - argv2[0] = str; - if (!NIL_P(opt)) argv2[argc2++] = opt; - hash = date_s__httpdate(argc2, argv2, klass); - return d_new_by_frags(klass, hash, sg); - } -} - -/* - * call-seq: - * Date._jisx0301(string, limit: 128) -> hash - * - * Returns a hash of values parsed from +string+, which should be a valid - * {JIS X 0301 date format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-JIS+X+0301+Format]: - * - * d = Date.new(2001, 2, 3) - * s = d.jisx0301 # => "H13.02.03" - * Date._jisx0301(s) # => {:year=>2001, :mon=>2, :mday=>3} - * - * See argument {limit}[rdoc-ref:Date@Argument+limit]. - * - * Related: Date.jisx0301 (returns a \Date object). - */ -static VALUE -date_s__jisx0301(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, opt; - - rb_scan_args(argc, argv, "1:", &str, &opt); - check_limit(str, opt); - - return date__jisx0301(str); -} - -/* - * call-seq: - * Date.jisx0301(string = '-4712-01-01', start = Date::ITALY, limit: 128) -> date - * - * Returns a new \Date object with values parsed from +string+, - * which should be a valid {JIS X 0301 format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-JIS+X+0301+Format]: - * - * d = Date.new(2001, 2, 3) - * s = d.jisx0301 # => "H13.02.03" - * Date.jisx0301(s) # => # - * - * For no-era year, legacy format, Heisei is assumed. - * - * Date.jisx0301('13.02.03') # => # - * - * See: - * - * - Argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - Argument {limit}[rdoc-ref:Date@Argument+limit]. - * - * Related: Date._jisx0301 (returns a hash). - */ -static VALUE -date_s_jisx0301(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, sg, opt; - - argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - - switch (argc) { - case 0: - str = rb_str_new2(JULIAN_EPOCH_DATE); - case 1: - sg = INT2FIX(DEFAULT_SG); - } - - { - int argc2 = 1; - VALUE argv2[2], hash; - argv2[0] = str; - if (!NIL_P(opt)) argv2[argc2++] = opt; - hash = date_s__jisx0301(argc2, argv2, klass); - return d_new_by_frags(klass, hash, sg); - } -} - -static VALUE -dup_obj(VALUE self) -{ - get_d1a(self); - - if (simple_dat_p(adat)) { - VALUE new = d_lite_s_alloc_simple(rb_obj_class(self)); - { - get_d1b(new); - bdat->s = adat->s; - RB_OBJ_WRITTEN(new, Qundef, bdat->s.nth); - return new; - } - } - else { - VALUE new = d_lite_s_alloc_complex(rb_obj_class(self)); - { - get_d1b(new); - bdat->c = adat->c; - RB_OBJ_WRITTEN(new, Qundef, bdat->c.nth); - RB_OBJ_WRITTEN(new, Qundef, bdat->c.sf); - return new; - } - } -} - -static VALUE -dup_obj_as_complex(VALUE self) -{ - get_d1a(self); - - if (simple_dat_p(adat)) { - VALUE new = d_lite_s_alloc_complex(rb_obj_class(self)); - { - get_d1b(new); - copy_simple_to_complex(new, &bdat->c, &adat->s); - bdat->c.flags |= HAVE_DF | COMPLEX_DAT; - return new; - } - } - else { - VALUE new = d_lite_s_alloc_complex(rb_obj_class(self)); - { - get_d1b(new); - bdat->c = adat->c; - RB_OBJ_WRITTEN(new, Qundef, bdat->c.nth); - RB_OBJ_WRITTEN(new, Qundef, bdat->c.sf); - return new; - } - } -} - -#define val2off(vof,iof) \ -do {\ - if (!offset_to_sec(vof, &iof)) {\ - iof = 0;\ - rb_warning("invalid offset is ignored");\ - }\ -} while (0) - -#if 0 -static VALUE -d_lite_initialize(int argc, VALUE *argv, VALUE self) -{ - VALUE jd, vjd, vdf, sf, vsf, vof, vsg; - int df, of; - double sg; - - rb_check_frozen(self); - - rb_scan_args(argc, argv, "05", &vjd, &vdf, &vsf, &vof, &vsg); - - jd = INT2FIX(0); - df = 0; - sf = INT2FIX(0); - of = 0; - sg = DEFAULT_SG; - - switch (argc) { - case 5: - val2sg(vsg, sg); - case 4: - val2off(vof, of); - case 3: - sf = vsf; - if (f_lt_p(sf, INT2FIX(0)) || - f_ge_p(sf, INT2FIX(SECOND_IN_NANOSECONDS))) - rb_raise(eDateError, "invalid second fraction"); - case 2: - df = NUM2INT(vdf); - if (df < 0 || df >= DAY_IN_SECONDS) - rb_raise(eDateError, "invalid day fraction"); - case 1: - jd = vjd; - } - - { - VALUE nth; - int rjd; - - get_d1(self); - - decode_jd(jd, &nth, &rjd); - if (!df && f_zero_p(sf) && !of) { - set_to_simple(self, &dat->s, nth, rjd, sg, 0, 0, 0, HAVE_JD); - } - else { - if (!complex_dat_p(dat)) - rb_raise(rb_eArgError, - "cannot load complex into simple"); - - set_to_complex(self, &dat->c, nth, rjd, df, sf, of, sg, - 0, 0, 0, 0, 0, 0, HAVE_JD | HAVE_DF); - } - } - return self; -} -#endif - -/* :nodoc: */ -static VALUE -d_lite_initialize_copy(VALUE copy, VALUE date) -{ - rb_check_frozen(copy); - - if (copy == date) - return copy; - { - get_d2(copy, date); - if (simple_dat_p(bdat)) { - if (simple_dat_p(adat)) { - adat->s = bdat->s; - } - else { - adat->c.flags = bdat->s.flags | COMPLEX_DAT; - adat->c.nth = bdat->s.nth; - adat->c.jd = bdat->s.jd; - adat->c.df = 0; - adat->c.sf = INT2FIX(0); - adat->c.of = 0; - adat->c.sg = bdat->s.sg; - adat->c.year = bdat->s.year; -#ifndef USE_PACK - adat->c.mon = bdat->s.mon; - adat->c.mday = bdat->s.mday; - adat->c.hour = bdat->s.hour; - adat->c.min = bdat->s.min; - adat->c.sec = bdat->s.sec; -#else - adat->c.pc = bdat->s.pc; -#endif - } - } - else { - if (!complex_dat_p(adat)) - rb_raise(rb_eArgError, - "cannot load complex into simple"); - - adat->c = bdat->c; - } - } - return copy; -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -d_lite_fill(VALUE self) -{ - get_d1(self); - - if (simple_dat_p(dat)) { - get_s_jd(dat); - get_s_civil(dat); - } - else { - get_c_jd(dat); - get_c_civil(dat); - get_c_df(dat); - get_c_time(dat); - } - return self; -} -#endif - -/* - * call-seq: - * d.ajd -> rational - * - * Returns the astronomical Julian day number. This is a fractional - * number, which is not adjusted by the offset. - * - * DateTime.new(2001,2,3,4,5,6,'+7').ajd #=> (11769328217/4800) - * DateTime.new(2001,2,2,14,5,6,'-7').ajd #=> (11769328217/4800) - */ -static VALUE -d_lite_ajd(VALUE self) -{ - get_d1(self); - return m_ajd(dat); -} - -/* - * call-seq: - * d.amjd -> rational - * - * Returns the astronomical modified Julian day number. This is - * a fractional number, which is not adjusted by the offset. - * - * DateTime.new(2001,2,3,4,5,6,'+7').amjd #=> (249325817/4800) - * DateTime.new(2001,2,2,14,5,6,'-7').amjd #=> (249325817/4800) - */ -static VALUE -d_lite_amjd(VALUE self) -{ - get_d1(self); - return m_amjd(dat); -} - -/* - * call-seq: - * d.jd -> integer - * - * Returns the Julian day number. This is a whole number, which is - * adjusted by the offset as the local time. - * - * DateTime.new(2001,2,3,4,5,6,'+7').jd #=> 2451944 - * DateTime.new(2001,2,3,4,5,6,'-7').jd #=> 2451944 - */ -static VALUE -d_lite_jd(VALUE self) -{ - get_d1(self); - return m_real_local_jd(dat); -} - -/* - * call-seq: - * d.mjd -> integer - * - * Returns the modified Julian day number. This is a whole number, - * which is adjusted by the offset as the local time. - * - * DateTime.new(2001,2,3,4,5,6,'+7').mjd #=> 51943 - * DateTime.new(2001,2,3,4,5,6,'-7').mjd #=> 51943 - */ -static VALUE -d_lite_mjd(VALUE self) -{ - get_d1(self); - return f_sub(m_real_local_jd(dat), INT2FIX(2400001)); -} - -/* - * call-seq: - * ld -> integer - * - * Returns the - * {Lilian day number}[https://en.wikipedia.org/wiki/Lilian_date], - * which is the number of days since the beginning of the Gregorian - * calendar, October 15, 1582. - * - * Date.new(2001, 2, 3).ld # => 152784 - * - */ -static VALUE -d_lite_ld(VALUE self) -{ - get_d1(self); - return f_sub(m_real_local_jd(dat), INT2FIX(2299160)); -} - -/* - * call-seq: - * year -> integer - * - * Returns the year: - * - * Date.new(2001, 2, 3).year # => 2001 - * (Date.new(1, 1, 1) - 1).year # => 0 - * - */ -static VALUE -d_lite_year(VALUE self) -{ - get_d1(self); - return m_real_year(dat); -} - -/* - * call-seq: - * yday -> integer - * - * Returns the day of the year, in range (1..366): - * - * Date.new(2001, 2, 3).yday # => 34 - * - */ -static VALUE -d_lite_yday(VALUE self) -{ - get_d1(self); - return INT2FIX(m_yday(dat)); -} - -/* - * call-seq: - * mon -> integer - * - * Returns the month in range (1..12): - * - * Date.new(2001, 2, 3).mon # => 2 - * - */ -static VALUE -d_lite_mon(VALUE self) -{ - get_d1(self); - return INT2FIX(m_mon(dat)); -} - -/* - * call-seq: - * mday -> integer - * - * Returns the day of the month in range (1..31): - * - * Date.new(2001, 2, 3).mday # => 3 - * - */ -static VALUE -d_lite_mday(VALUE self) -{ - get_d1(self); - return INT2FIX(m_mday(dat)); -} - -/* - * call-seq: - * day_fraction -> rational - * - * Returns the fractional part of the day in range (Rational(0, 1)...Rational(1, 1)): - * - * DateTime.new(2001,2,3,12).day_fraction # => (1/2) - * - */ -static VALUE -d_lite_day_fraction(VALUE self) -{ - get_d1(self); - if (simple_dat_p(dat)) - return INT2FIX(0); - return m_fr(dat); -} - -/* - * call-seq: - * cwyear -> integer - * - * Returns commercial-date year for +self+ - * (see Date.commercial): - * - * Date.new(2001, 2, 3).cwyear # => 2001 - * Date.new(2000, 1, 1).cwyear # => 1999 - * - */ -static VALUE -d_lite_cwyear(VALUE self) -{ - get_d1(self); - return m_real_cwyear(dat); -} - -/* - * call-seq: - * cweek -> integer - * - * Returns commercial-date week index for +self+ - * (see Date.commercial): - * - * Date.new(2001, 2, 3).cweek # => 5 - * - */ -static VALUE -d_lite_cweek(VALUE self) -{ - get_d1(self); - return INT2FIX(m_cweek(dat)); -} - -/* - * call-seq: - * cwday -> integer - * - * Returns the commercial-date weekday index for +self+ - * (see Date.commercial); - * 1 is Monday: - * - * Date.new(2001, 2, 3).cwday # => 6 - * - */ -static VALUE -d_lite_cwday(VALUE self) -{ - get_d1(self); - return INT2FIX(m_cwday(dat)); -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -d_lite_wnum0(VALUE self) -{ - get_d1(self); - return INT2FIX(m_wnum0(dat)); -} - -/* :nodoc: */ -static VALUE -d_lite_wnum1(VALUE self) -{ - get_d1(self); - return INT2FIX(m_wnum1(dat)); -} -#endif - -/* - * call-seq: - * wday -> integer - * - * Returns the day of week in range (0..6); Sunday is 0: - * - * Date.new(2001, 2, 3).wday # => 6 - * - */ -static VALUE -d_lite_wday(VALUE self) -{ - get_d1(self); - return INT2FIX(m_wday(dat)); -} - -/* - * call-seq: - * sunday? -> true or false - * - * Returns +true+ if +self+ is a Sunday, +false+ otherwise. - */ -static VALUE -d_lite_sunday_p(VALUE self) -{ - get_d1(self); - return f_boolcast(m_wday(dat) == 0); -} - -/* - * call-seq: - * monday? -> true or false - * - * Returns +true+ if +self+ is a Monday, +false+ otherwise. - */ -static VALUE -d_lite_monday_p(VALUE self) -{ - get_d1(self); - return f_boolcast(m_wday(dat) == 1); -} - -/* - * call-seq: - * tuesday? -> true or false - * - * Returns +true+ if +self+ is a Tuesday, +false+ otherwise. - */ -static VALUE -d_lite_tuesday_p(VALUE self) -{ - get_d1(self); - return f_boolcast(m_wday(dat) == 2); -} - -/* - * call-seq: - * wednesday? -> true or false - * - * Returns +true+ if +self+ is a Wednesday, +false+ otherwise. - */ -static VALUE -d_lite_wednesday_p(VALUE self) -{ - get_d1(self); - return f_boolcast(m_wday(dat) == 3); -} - -/* - * call-seq: - * thursday? -> true or false - * - * Returns +true+ if +self+ is a Thursday, +false+ otherwise. - */ -static VALUE -d_lite_thursday_p(VALUE self) -{ - get_d1(self); - return f_boolcast(m_wday(dat) == 4); -} - -/* - * call-seq: - * friday? -> true or false - * - * Returns +true+ if +self+ is a Friday, +false+ otherwise. - */ -static VALUE -d_lite_friday_p(VALUE self) -{ - get_d1(self); - return f_boolcast(m_wday(dat) == 5); -} - -/* - * call-seq: - * saturday? -> true or false - * - * Returns +true+ if +self+ is a Saturday, +false+ otherwise. - */ -static VALUE -d_lite_saturday_p(VALUE self) -{ - get_d1(self); - return f_boolcast(m_wday(dat) == 6); -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -d_lite_nth_kday_p(VALUE self, VALUE n, VALUE k) -{ - int rjd, ns; - - get_d1(self); - - if (NUM2INT(k) != m_wday(dat)) - return Qfalse; - - c_nth_kday_to_jd(m_year(dat), m_mon(dat), - NUM2INT(n), NUM2INT(k), m_virtual_sg(dat), /* !=m_sg() */ - &rjd, &ns); - if (m_local_jd(dat) != rjd) - return Qfalse; - return Qtrue; -} -#endif - -/* - * call-seq: - * hour -> integer - * - * Returns the hour in range (0..23): - * - * DateTime.new(2001, 2, 3, 4, 5, 6).hour # => 4 - * - */ -static VALUE -d_lite_hour(VALUE self) -{ - get_d1(self); - return INT2FIX(m_hour(dat)); -} - -/* - * call-seq: - * min -> integer - * - * Returns the minute in range (0..59): - * - * DateTime.new(2001, 2, 3, 4, 5, 6).min # => 5 - * - */ -static VALUE -d_lite_min(VALUE self) -{ - get_d1(self); - return INT2FIX(m_min(dat)); -} - -/* - * call-seq: - * sec -> integer - * - * Returns the second in range (0..59): - * - * DateTime.new(2001, 2, 3, 4, 5, 6).sec # => 6 - * - */ -static VALUE -d_lite_sec(VALUE self) -{ - get_d1(self); - return INT2FIX(m_sec(dat)); -} - -/* - * call-seq: - * sec_fraction -> rational - * - * Returns the fractional part of the second in range - * (Rational(0, 1)...Rational(1, 1)): - * - * DateTime.new(2001, 2, 3, 4, 5, 6.5).sec_fraction # => (1/2) - * - */ -static VALUE -d_lite_sec_fraction(VALUE self) -{ - get_d1(self); - return m_sf_in_sec(dat); -} - -/* - * call-seq: - * d.offset -> rational - * - * Returns the offset. - * - * DateTime.parse('04pm+0730').offset #=> (5/16) - */ -static VALUE -d_lite_offset(VALUE self) -{ - get_d1(self); - return m_of_in_day(dat); -} - -/* - * call-seq: - * d.zone -> string - * - * Returns the timezone. - * - * DateTime.parse('04pm+0730').zone #=> "+07:30" - */ -static VALUE -d_lite_zone(VALUE self) -{ - get_d1(self); - return m_zone(dat); -} - -/* - * call-seq: - * d.julian? -> true or false - * - * Returns +true+ if the date is before the date of calendar reform, - * +false+ otherwise: - * - * (Date.new(1582, 10, 15) - 1).julian? # => true - * Date.new(1582, 10, 15).julian? # => false - * - */ -static VALUE -d_lite_julian_p(VALUE self) -{ - get_d1(self); - return f_boolcast(m_julian_p(dat)); -} - -/* - * call-seq: - * gregorian? -> true or false - * - * Returns +true+ if the date is on or after - * the date of calendar reform, +false+ otherwise: - * - * Date.new(1582, 10, 15).gregorian? # => true - * (Date.new(1582, 10, 15) - 1).gregorian? # => false - * - */ -static VALUE -d_lite_gregorian_p(VALUE self) -{ - get_d1(self); - return f_boolcast(m_gregorian_p(dat)); -} - -/* - * call-seq: - * leap? -> true or false - * - * Returns +true+ if the year is a leap year, +false+ otherwise: - * - * Date.new(2000).leap? # => true - * Date.new(2001).leap? # => false - * - */ -static VALUE -d_lite_leap_p(VALUE self) -{ - int rjd, ns, ry, rm, rd; - - get_d1(self); - if (m_gregorian_p(dat)) - return f_boolcast(c_gregorian_leap_p(m_year(dat))); - - c_civil_to_jd(m_year(dat), 3, 1, m_virtual_sg(dat), - &rjd, &ns); - c_jd_to_civil(rjd - 1, m_virtual_sg(dat), &ry, &rm, &rd); - return f_boolcast(rd == 29); -} - -/* - * call-seq: - * start -> float - * - * Returns the Julian start date for calendar reform; - * if not an infinity, the returned value is suitable - * for passing to Date#jd: - * - * d = Date.new(2001, 2, 3, Date::ITALY) - * s = d.start # => 2299161.0 - * Date.jd(s).to_s # => "1582-10-15" - * - * d = Date.new(2001, 2, 3, Date::ENGLAND) - * s = d.start # => 2361222.0 - * Date.jd(s).to_s # => "1752-09-14" - * - * Date.new(2001, 2, 3, Date::GREGORIAN).start # => -Infinity - * Date.new(2001, 2, 3, Date::JULIAN).start # => Infinity - * - * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - */ -static VALUE -d_lite_start(VALUE self) -{ - get_d1(self); - return DBL2NUM(m_sg(dat)); -} - -static void -clear_civil(union DateData *x) -{ - if (simple_dat_p(x)) { - x->s.year = 0; -#ifndef USE_PACK - x->s.mon = 0; - x->s.mday = 0; -#else - x->s.pc = 0; -#endif - x->s.flags &= ~HAVE_CIVIL; - } - else { - x->c.year = 0; -#ifndef USE_PACK - x->c.mon = 0; - x->c.mday = 0; - x->c.hour = 0; - x->c.min = 0; - x->c.sec = 0; -#else - x->c.pc = 0; -#endif - x->c.flags &= ~(HAVE_CIVIL | HAVE_TIME); - } -} - -static void -set_sg(union DateData *x, double sg) -{ - if (simple_dat_p(x)) { - get_s_jd(x); - clear_civil(x); - x->s.sg = (date_sg_t)sg; - } else { - get_c_jd(x); - get_c_df(x); - clear_civil(x); - x->c.sg = (date_sg_t)sg; - } -} - -static VALUE -dup_obj_with_new_start(VALUE obj, double sg) -{ - volatile VALUE dup = dup_obj(obj); - { - get_d1(dup); - set_sg(dat, sg); - } - return dup; -} - -/* - * call-seq: - * new_start(start = Date::ITALY]) -> new_date - * - * Returns a copy of +self+ with the given +start+ value: - * - * d0 = Date.new(2000, 2, 3) - * d0.julian? # => false - * d1 = d0.new_start(Date::JULIAN) - * d1.julian? # => true - * - * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. - * - */ -static VALUE -d_lite_new_start(int argc, VALUE *argv, VALUE self) -{ - VALUE vsg; - double sg; - - rb_scan_args(argc, argv, "01", &vsg); - - sg = DEFAULT_SG; - if (argc >= 1) - val2sg(vsg, sg); - - return dup_obj_with_new_start(self, sg); -} - -/* - * call-seq: - * italy -> new_date - * - * Equivalent to Date#new_start with argument Date::ITALY. - * - */ -static VALUE -d_lite_italy(VALUE self) -{ - return dup_obj_with_new_start(self, ITALY); -} - -/* - * call-seq: - * england -> new_date - * - * Equivalent to Date#new_start with argument Date::ENGLAND. - */ -static VALUE -d_lite_england(VALUE self) -{ - return dup_obj_with_new_start(self, ENGLAND); -} - -/* - * call-seq: - * julian -> new_date - * - * Equivalent to Date#new_start with argument Date::JULIAN. - */ -static VALUE -d_lite_julian(VALUE self) -{ - return dup_obj_with_new_start(self, JULIAN); -} - -/* - * call-seq: - * gregorian -> new_date - * - * Equivalent to Date#new_start with argument Date::GREGORIAN. - */ -static VALUE -d_lite_gregorian(VALUE self) -{ - return dup_obj_with_new_start(self, GREGORIAN); -} - -static void -set_of(union DateData *x, int of) -{ - assert(complex_dat_p(x)); - get_c_jd(x); - get_c_df(x); - clear_civil(x); - x->c.of = of; -} - -static VALUE -dup_obj_with_new_offset(VALUE obj, int of) -{ - volatile VALUE dup = dup_obj_as_complex(obj); - { - get_d1(dup); - set_of(dat, of); - } - return dup; -} - -/* - * call-seq: - * d.new_offset([offset=0]) -> date - * - * Duplicates self and resets its offset. - * - * d = DateTime.new(2001,2,3,4,5,6,'-02:00') - * #=> # - * d.new_offset('+09:00') #=> # - */ -static VALUE -d_lite_new_offset(int argc, VALUE *argv, VALUE self) -{ - VALUE vof; - int rof; - - rb_scan_args(argc, argv, "01", &vof); - - rof = 0; - if (argc >= 1) - val2off(vof, rof); - - return dup_obj_with_new_offset(self, rof); -} - -/* - * call-seq: - * d + other -> date - * - * Returns a date object pointing +other+ days after self. The other - * should be a numeric value. If the other is a fractional number, - * assumes its precision is at most nanosecond. - * - * Date.new(2001,2,3) + 1 #=> # - * DateTime.new(2001,2,3) + Rational(1,2) - * #=> # - * DateTime.new(2001,2,3) + Rational(-1,2) - * #=> # - * DateTime.jd(0,12) + DateTime.new(2001,2,3).ajd - * #=> # - */ -static VALUE -d_lite_plus(VALUE self, VALUE other) -{ - int try_rational = 1; - get_d1(self); - - again: - switch (TYPE(other)) { - case T_FIXNUM: - { - VALUE nth; - long t; - int jd; - - nth = m_nth(dat); - t = FIX2LONG(other); - if (DIV(t, CM_PERIOD)) { - nth = f_add(nth, INT2FIX(DIV(t, CM_PERIOD))); - t = MOD(t, CM_PERIOD); - } - - if (!t) - jd = m_jd(dat); - else { - jd = m_jd(dat) + (int)t; - canonicalize_jd(nth, jd); - } - - if (simple_dat_p(dat)) - return d_simple_new_internal(rb_obj_class(self), - nth, jd, - dat->s.sg, - 0, 0, 0, - (dat->s.flags | HAVE_JD) & - ~HAVE_CIVIL); - else - return d_complex_new_internal(rb_obj_class(self), - nth, jd, - dat->c.df, dat->c.sf, - dat->c.of, dat->c.sg, - 0, 0, 0, -#ifndef USE_PACK - dat->c.hour, - dat->c.min, - dat->c.sec, -#else - EX_HOUR(dat->c.pc), - EX_MIN(dat->c.pc), - EX_SEC(dat->c.pc), -#endif - (dat->c.flags | HAVE_JD) & - ~HAVE_CIVIL); - } - break; - case T_BIGNUM: - { - VALUE nth; - int jd, s; - - if (f_positive_p(other)) - s = +1; - else { - s = -1; - other = f_negate(other); - } - - nth = f_idiv(other, INT2FIX(CM_PERIOD)); - jd = FIX2INT(f_mod(other, INT2FIX(CM_PERIOD))); - - if (s < 0) { - nth = f_negate(nth); - jd = -jd; - } - - if (!jd) - jd = m_jd(dat); - else { - jd = m_jd(dat) + jd; - canonicalize_jd(nth, jd); - } - - if (f_zero_p(nth)) - nth = m_nth(dat); - else - nth = f_add(m_nth(dat), nth); - - if (simple_dat_p(dat)) - return d_simple_new_internal(rb_obj_class(self), - nth, jd, - dat->s.sg, - 0, 0, 0, - (dat->s.flags | HAVE_JD) & - ~HAVE_CIVIL); - else - return d_complex_new_internal(rb_obj_class(self), - nth, jd, - dat->c.df, dat->c.sf, - dat->c.of, dat->c.sg, - 0, 0, 0, -#ifndef USE_PACK - dat->c.hour, - dat->c.min, - dat->c.sec, -#else - EX_HOUR(dat->c.pc), - EX_MIN(dat->c.pc), - EX_SEC(dat->c.pc), -#endif - (dat->c.flags | HAVE_JD) & - ~HAVE_CIVIL); - } - break; - case T_FLOAT: - { - double jd, o, tmp; - int s, df; - VALUE nth, sf; - - o = RFLOAT_VALUE(other); - - if (o > 0) - s = +1; - else { - s = -1; - o = -o; - } - - o = modf(o, &tmp); - - if (!floor(tmp / CM_PERIOD)) { - nth = INT2FIX(0); - jd = (int)tmp; - } - else { - double i, f; - - f = modf(tmp / CM_PERIOD, &i); - nth = f_floor(DBL2NUM(i)); - jd = (int)(f * CM_PERIOD); - } - - o *= DAY_IN_SECONDS; - o = modf(o, &tmp); - df = (int)tmp; - o *= SECOND_IN_NANOSECONDS; - sf = INT2FIX((int)round(o)); - - if (s < 0) { - jd = -jd; - df = -df; - sf = f_negate(sf); - } - - if (f_zero_p(sf)) - sf = m_sf(dat); - else { - sf = f_add(m_sf(dat), sf); - if (f_lt_p(sf, INT2FIX(0))) { - df -= 1; - sf = f_add(sf, INT2FIX(SECOND_IN_NANOSECONDS)); - } - else if (f_ge_p(sf, INT2FIX(SECOND_IN_NANOSECONDS))) { - df += 1; - sf = f_sub(sf, INT2FIX(SECOND_IN_NANOSECONDS)); - } - } - - if (!df) - df = m_df(dat); - else { - df = m_df(dat) + df; - if (df < 0) { - jd -= 1; - df += DAY_IN_SECONDS; - } - else if (df >= DAY_IN_SECONDS) { - jd += 1; - df -= DAY_IN_SECONDS; - } - } - - if (!jd) - jd = m_jd(dat); - else { - jd = m_jd(dat) + jd; - canonicalize_jd(nth, jd); - } - - if (f_zero_p(nth)) - nth = m_nth(dat); - else - nth = f_add(m_nth(dat), nth); - - if (!df && f_zero_p(sf) && !m_of(dat)) - return d_simple_new_internal(rb_obj_class(self), - nth, (int)jd, - m_sg(dat), - 0, 0, 0, - (dat->s.flags | HAVE_JD) & - ~(HAVE_CIVIL | HAVE_TIME | - COMPLEX_DAT)); - else - return d_complex_new_internal(rb_obj_class(self), - nth, (int)jd, - df, sf, - m_of(dat), m_sg(dat), - 0, 0, 0, - 0, 0, 0, - (dat->c.flags | - HAVE_JD | HAVE_DF) & - ~(HAVE_CIVIL | HAVE_TIME)); - } - break; - default: - expect_numeric(other); - other = f_to_r(other); - if (!k_rational_p(other)) { - if (!try_rational) Check_Type(other, T_RATIONAL); - try_rational = 0; - goto again; - } - /* fall through */ - case T_RATIONAL: - { - VALUE nth, sf, t; - int jd, df, s; - - if (wholenum_p(other)) { - other = rb_rational_num(other); - goto again; - } - - if (f_positive_p(other)) - s = +1; - else { - s = -1; - other = f_negate(other); - } - - nth = f_idiv(other, INT2FIX(CM_PERIOD)); - t = f_mod(other, INT2FIX(CM_PERIOD)); - - jd = FIX2INT(f_idiv(t, INT2FIX(1))); - t = f_mod(t, INT2FIX(1)); - - t = f_mul(t, INT2FIX(DAY_IN_SECONDS)); - df = FIX2INT(f_idiv(t, INT2FIX(1))); - t = f_mod(t, INT2FIX(1)); - - sf = f_mul(t, INT2FIX(SECOND_IN_NANOSECONDS)); - - if (s < 0) { - nth = f_negate(nth); - jd = -jd; - df = -df; - sf = f_negate(sf); - } - - if (f_zero_p(sf)) - sf = m_sf(dat); - else { - sf = f_add(m_sf(dat), sf); - if (f_lt_p(sf, INT2FIX(0))) { - df -= 1; - sf = f_add(sf, INT2FIX(SECOND_IN_NANOSECONDS)); - } - else if (f_ge_p(sf, INT2FIX(SECOND_IN_NANOSECONDS))) { - df += 1; - sf = f_sub(sf, INT2FIX(SECOND_IN_NANOSECONDS)); - } - } - - if (!df) - df = m_df(dat); - else { - df = m_df(dat) + df; - if (df < 0) { - jd -= 1; - df += DAY_IN_SECONDS; - } - else if (df >= DAY_IN_SECONDS) { - jd += 1; - df -= DAY_IN_SECONDS; - } - } - - if (!jd) - jd = m_jd(dat); - else { - jd = m_jd(dat) + jd; - canonicalize_jd(nth, jd); - } - - if (f_zero_p(nth)) - nth = m_nth(dat); - else - nth = f_add(m_nth(dat), nth); - - if (!df && f_zero_p(sf) && !m_of(dat)) - return d_simple_new_internal(rb_obj_class(self), - nth, jd, - m_sg(dat), - 0, 0, 0, - (dat->s.flags | HAVE_JD) & - ~(HAVE_CIVIL | HAVE_TIME | - COMPLEX_DAT)); - else - return d_complex_new_internal(rb_obj_class(self), - nth, jd, - df, sf, - m_of(dat), m_sg(dat), - 0, 0, 0, - 0, 0, 0, - (dat->c.flags | - HAVE_JD | HAVE_DF) & - ~(HAVE_CIVIL | HAVE_TIME)); - } - break; - } -} - -static VALUE -minus_dd(VALUE self, VALUE other) -{ - get_d2(self, other); - - { - int d, df; - VALUE n, sf, r; - - n = f_sub(m_nth(adat), m_nth(bdat)); - d = m_jd(adat) - m_jd(bdat); - df = m_df(adat) - m_df(bdat); - sf = f_sub(m_sf(adat), m_sf(bdat)); - canonicalize_jd(n, d); - - if (df < 0) { - d -= 1; - df += DAY_IN_SECONDS; - } - else if (df >= DAY_IN_SECONDS) { - d += 1; - df -= DAY_IN_SECONDS; - } - - if (f_lt_p(sf, INT2FIX(0))) { - df -= 1; - sf = f_add(sf, INT2FIX(SECOND_IN_NANOSECONDS)); - } - else if (f_ge_p(sf, INT2FIX(SECOND_IN_NANOSECONDS))) { - df += 1; - sf = f_sub(sf, INT2FIX(SECOND_IN_NANOSECONDS)); - } - - if (f_zero_p(n)) - r = INT2FIX(0); - else - r = f_mul(n, INT2FIX(CM_PERIOD)); - - if (d) - r = f_add(r, rb_rational_new1(INT2FIX(d))); - if (df) - r = f_add(r, isec_to_day(df)); - if (f_nonzero_p(sf)) - r = f_add(r, ns_to_day(sf)); - - if (RB_TYPE_P(r, T_RATIONAL)) - return r; - return rb_rational_new1(r); - } -} - -/* - * call-seq: - * d - other -> date or rational - * - * If the other is a date object, returns a Rational - * whose value is the difference between the two dates in days. - * If the other is a numeric value, returns a date object - * pointing +other+ days before self. - * If the other is a fractional number, - * assumes its precision is at most nanosecond. - * - * Date.new(2001,2,3) - 1 #=> # - * DateTime.new(2001,2,3) - Rational(1,2) - * #=> # - * Date.new(2001,2,3) - Date.new(2001) - * #=> (33/1) - * DateTime.new(2001,2,3) - DateTime.new(2001,2,2,12) - * #=> (1/2) - */ -static VALUE -d_lite_minus(VALUE self, VALUE other) -{ - if (k_date_p(other)) - return minus_dd(self, other); - - switch (TYPE(other)) { - case T_FIXNUM: - return d_lite_plus(self, LONG2NUM(-FIX2LONG(other))); - case T_FLOAT: - return d_lite_plus(self, DBL2NUM(-RFLOAT_VALUE(other))); - default: - expect_numeric(other); - /* fall through */ - case T_BIGNUM: - case T_RATIONAL: - return d_lite_plus(self, f_negate(other)); - } -} - -/* - * call-seq: - * next_day(n = 1) -> new_date - * - * Equivalent to Date#+ with argument +n+. - */ -static VALUE -d_lite_next_day(int argc, VALUE *argv, VALUE self) -{ - VALUE n; - - rb_scan_args(argc, argv, "01", &n); - if (argc < 1) - n = INT2FIX(1); - return d_lite_plus(self, n); -} - -/* - * call-seq: - * prev_day(n = 1) -> new_date - * - * Equivalent to Date#- with argument +n+. - */ -static VALUE -d_lite_prev_day(int argc, VALUE *argv, VALUE self) -{ - VALUE n; - - rb_scan_args(argc, argv, "01", &n); - if (argc < 1) - n = INT2FIX(1); - return d_lite_minus(self, n); -} - -/* - * call-seq: - * d.next -> new_date - * - * Returns a new \Date object representing the following day: - * - * d = Date.new(2001, 2, 3) - * d.to_s # => "2001-02-03" - * d.next.to_s # => "2001-02-04" - * - */ -static VALUE -d_lite_next(VALUE self) -{ - return d_lite_next_day(0, (VALUE *)NULL, self); -} - -/* - * call-seq: - * d >> n -> new_date - * - * Returns a new \Date object representing the date - * +n+ months later; +n+ should be a numeric: - * - * (Date.new(2001, 2, 3) >> 1).to_s # => "2001-03-03" - * (Date.new(2001, 2, 3) >> -2).to_s # => "2000-12-03" - * - * When the same day does not exist for the new month, - * the last day of that month is used instead: - * - * (Date.new(2001, 1, 31) >> 1).to_s # => "2001-02-28" - * (Date.new(2001, 1, 31) >> -4).to_s # => "2000-09-30" - * - * This results in the following, possibly unexpected, behaviors: - * - * d0 = Date.new(2001, 1, 31) - * d1 = d0 >> 1 # => # - * d2 = d1 >> 1 # => # - * - * d0 = Date.new(2001, 1, 31) - * d1 = d0 >> 1 # => # - * d2 = d1 >> -1 # => # - * - */ -static VALUE -d_lite_rshift(VALUE self, VALUE other) -{ - VALUE t, y, nth, rjd2; - int m, d, rjd; - double sg; - - get_d1(self); - t = f_add3(f_mul(m_real_year(dat), INT2FIX(12)), - INT2FIX(m_mon(dat) - 1), - other); - if (FIXNUM_P(t)) { - long it = FIX2LONG(t); - y = LONG2NUM(DIV(it, 12)); - it = MOD(it, 12); - m = (int)it + 1; - } - else { - y = f_idiv(t, INT2FIX(12)); - t = f_mod(t, INT2FIX(12)); - m = FIX2INT(t) + 1; - } - d = m_mday(dat); - sg = m_sg(dat); - - while (1) { - int ry, rm, rd, ns; - - if (valid_civil_p(y, m, d, sg, - &nth, &ry, - &rm, &rd, &rjd, &ns)) - break; - if (--d < 1) - rb_raise(eDateError, "invalid date"); - } - encode_jd(nth, rjd, &rjd2); - return d_lite_plus(self, f_sub(rjd2, m_real_local_jd(dat))); -} - -/* - * call-seq: - * d << n -> date - * - * Returns a new \Date object representing the date - * +n+ months earlier; +n+ should be a numeric: - * - * (Date.new(2001, 2, 3) << 1).to_s # => "2001-01-03" - * (Date.new(2001, 2, 3) << -2).to_s # => "2001-04-03" - * - * When the same day does not exist for the new month, - * the last day of that month is used instead: - * - * (Date.new(2001, 3, 31) << 1).to_s # => "2001-02-28" - * (Date.new(2001, 3, 31) << -6).to_s # => "2001-09-30" - * - * This results in the following, possibly unexpected, behaviors: - * - * d0 = Date.new(2001, 3, 31) - * d0 << 2 # => # - * d0 << 1 << 1 # => # - * - * d0 = Date.new(2001, 3, 31) - * d1 = d0 << 1 # => # - * d2 = d1 << -1 # => # - * - */ -static VALUE -d_lite_lshift(VALUE self, VALUE other) -{ - expect_numeric(other); - return d_lite_rshift(self, f_negate(other)); -} - -/* - * call-seq: - * next_month(n = 1) -> new_date - * - * Equivalent to #>> with argument +n+. - */ -static VALUE -d_lite_next_month(int argc, VALUE *argv, VALUE self) -{ - VALUE n; - - rb_scan_args(argc, argv, "01", &n); - if (argc < 1) - n = INT2FIX(1); - return d_lite_rshift(self, n); -} - -/* - * call-seq: - * prev_month(n = 1) -> new_date - * - * Equivalent to #<< with argument +n+. - */ -static VALUE -d_lite_prev_month(int argc, VALUE *argv, VALUE self) -{ - VALUE n; - - rb_scan_args(argc, argv, "01", &n); - if (argc < 1) - n = INT2FIX(1); - return d_lite_lshift(self, n); -} - -/* - * call-seq: - * next_year(n = 1) -> new_date - * - * Equivalent to #>> with argument n * 12. - */ -static VALUE -d_lite_next_year(int argc, VALUE *argv, VALUE self) -{ - VALUE n; - - rb_scan_args(argc, argv, "01", &n); - if (argc < 1) - n = INT2FIX(1); - return d_lite_rshift(self, f_mul(n, INT2FIX(12))); -} - -/* - * call-seq: - * prev_year(n = 1) -> new_date - * - * Equivalent to #<< with argument n * 12. - */ -static VALUE -d_lite_prev_year(int argc, VALUE *argv, VALUE self) -{ - VALUE n; - - rb_scan_args(argc, argv, "01", &n); - if (argc < 1) - n = INT2FIX(1); - return d_lite_lshift(self, f_mul(n, INT2FIX(12))); -} - -static VALUE d_lite_cmp(VALUE, VALUE); - -/* - * call-seq: - * step(limit, step = 1){|date| ... } -> self - * - * Calls the block with specified dates; - * returns +self+. - * - * - The first +date+ is +self+. - * - Each successive +date+ is date + step, - * where +step+ is the numeric step size in days. - * - The last date is the last one that is before or equal to +limit+, - * which should be a \Date object. - * - * Example: - * - * limit = Date.new(2001, 12, 31) - * Date.new(2001).step(limit){|date| p date.to_s if date.mday == 31 } - * - * Output: - * - * "2001-01-31" - * "2001-03-31" - * "2001-05-31" - * "2001-07-31" - * "2001-08-31" - * "2001-10-31" - * "2001-12-31" - * - * Returns an Enumerator if no block is given. - */ -static VALUE -d_lite_step(int argc, VALUE *argv, VALUE self) -{ - VALUE limit, step, date; - int c; - - rb_scan_args(argc, argv, "11", &limit, &step); - - if (argc < 2) - step = INT2FIX(1); - -#if 0 - if (f_zero_p(step)) - rb_raise(rb_eArgError, "step can't be 0"); -#endif - - RETURN_ENUMERATOR(self, argc, argv); - - date = self; - c = f_cmp(step, INT2FIX(0)); - if (c < 0) { - while (FIX2INT(d_lite_cmp(date, limit)) >= 0) { - rb_yield(date); - date = d_lite_plus(date, step); - } - } - else if (c == 0) { - while (1) - rb_yield(date); - } - else /* if (c > 0) */ { - while (FIX2INT(d_lite_cmp(date, limit)) <= 0) { - rb_yield(date); - date = d_lite_plus(date, step); - } - } - return self; -} - -/* - * call-seq: - * upto(max){|date| ... } -> self - * - * Equivalent to #step with arguments +max+ and +1+. - */ -static VALUE -d_lite_upto(VALUE self, VALUE max) -{ - VALUE date; - - RETURN_ENUMERATOR(self, 1, &max); - - date = self; - while (FIX2INT(d_lite_cmp(date, max)) <= 0) { - rb_yield(date); - date = d_lite_plus(date, INT2FIX(1)); - } - return self; -} - -/* - * call-seq: - * downto(min){|date| ... } -> self - * - * Equivalent to #step with arguments +min+ and -1. - */ -static VALUE -d_lite_downto(VALUE self, VALUE min) -{ - VALUE date; - - RETURN_ENUMERATOR(self, 1, &min); - - date = self; - while (FIX2INT(d_lite_cmp(date, min)) >= 0) { - rb_yield(date); - date = d_lite_plus(date, INT2FIX(-1)); - } - return self; -} - -static VALUE -cmp_gen(VALUE self, VALUE other) -{ - get_d1(self); - - if (k_numeric_p(other)) - return INT2FIX(f_cmp(m_ajd(dat), other)); - else if (k_date_p(other)) - return INT2FIX(f_cmp(m_ajd(dat), f_ajd(other))); - return rb_num_coerce_cmp(self, other, id_cmp); -} - -static VALUE -cmp_dd(VALUE self, VALUE other) -{ - get_d2(self, other); - - { - VALUE a_nth, b_nth, - a_sf, b_sf; - int a_jd, b_jd, - a_df, b_df; - - m_canonicalize_jd(self, adat); - m_canonicalize_jd(other, bdat); - a_nth = m_nth(adat); - b_nth = m_nth(bdat); - if (f_eqeq_p(a_nth, b_nth)) { - a_jd = m_jd(adat); - b_jd = m_jd(bdat); - if (a_jd == b_jd) { - a_df = m_df(adat); - b_df = m_df(bdat); - if (a_df == b_df) { - a_sf = m_sf(adat); - b_sf = m_sf(bdat); - if (f_eqeq_p(a_sf, b_sf)) { - return INT2FIX(0); - } - else if (f_lt_p(a_sf, b_sf)) { - return INT2FIX(-1); - } - else { - return INT2FIX(1); - } - } - else if (a_df < b_df) { - return INT2FIX(-1); - } - else { - return INT2FIX(1); - } - } - else if (a_jd < b_jd) { - return INT2FIX(-1); - } - else { - return INT2FIX(1); - } - } - else if (f_lt_p(a_nth, b_nth)) { - return INT2FIX(-1); - } - else { - return INT2FIX(1); - } - } -} - -/* - * call-seq: - * self <=> other -> -1, 0, 1 or nil - * - * Compares +self+ and +other+, returning: - * - * - -1 if +other+ is larger. - * - 0 if the two are equal. - * - 1 if +other+ is smaller. - * - +nil+ if the two are incomparable. - * - * Argument +other+ may be: - * - * - Another \Date object: - * - * d = Date.new(2022, 7, 27) # => # - * prev_date = d.prev_day # => # - * next_date = d.next_day # => # - * d <=> next_date # => -1 - * d <=> d # => 0 - * d <=> prev_date # => 1 - * - * - A DateTime object: - * - * d <=> DateTime.new(2022, 7, 26) # => 1 - * d <=> DateTime.new(2022, 7, 27) # => 0 - * d <=> DateTime.new(2022, 7, 28) # => -1 - * - * - A numeric (compares self.ajd to +other+): - * - * d <=> 2459788 # => -1 - * d <=> 2459787 # => 1 - * d <=> 2459786 # => 1 - * d <=> d.ajd # => 0 - * - * - Any other object: - * - * d <=> Object.new # => nil - * - */ -static VALUE -d_lite_cmp(VALUE self, VALUE other) -{ - if (!k_date_p(other)) - return cmp_gen(self, other); - - { - get_d2(self, other); - - if (!(simple_dat_p(adat) && simple_dat_p(bdat) && - m_gregorian_p(adat) == m_gregorian_p(bdat))) - return cmp_dd(self, other); - - { - VALUE a_nth, b_nth; - int a_jd, b_jd; - - m_canonicalize_jd(self, adat); - m_canonicalize_jd(other, bdat); - a_nth = m_nth(adat); - b_nth = m_nth(bdat); - if (f_eqeq_p(a_nth, b_nth)) { - a_jd = m_jd(adat); - b_jd = m_jd(bdat); - if (a_jd == b_jd) { - return INT2FIX(0); - } - else if (a_jd < b_jd) { - return INT2FIX(-1); - } - else { - return INT2FIX(1); - } - } - else if (f_lt_p(a_nth, b_nth)) { - return INT2FIX(-1); - } - else { - return INT2FIX(1); - } - } - } -} - -static VALUE -equal_gen(VALUE self, VALUE other) -{ - get_d1(self); - - if (k_numeric_p(other)) - return f_eqeq_p(m_real_local_jd(dat), other); - else if (k_date_p(other)) - return f_eqeq_p(m_real_local_jd(dat), f_jd(other)); - return rb_num_coerce_cmp(self, other, id_eqeq_p); -} - -/* - * call-seq: - * self === other -> true, false, or nil. - * - * Returns +true+ if +self+ and +other+ represent the same date, - * +false+ if not, +nil+ if the two are not comparable. - * - * Argument +other+ may be: - * - * - Another \Date object: - * - * d = Date.new(2022, 7, 27) # => # - * prev_date = d.prev_day # => # - * next_date = d.next_day # => # - * d === prev_date # => false - * d === d # => true - * d === next_date # => false - * - * - A DateTime object: - * - * d === DateTime.new(2022, 7, 26) # => false - * d === DateTime.new(2022, 7, 27) # => true - * d === DateTime.new(2022, 7, 28) # => false - * - * - A numeric (compares self.jd to +other+): - * - * d === 2459788 # => true - * d === 2459787 # => false - * d === 2459786 # => false - * d === d.jd # => true - * - * - An object not comparable: - * - * d === Object.new # => nil - * - */ -static VALUE -d_lite_equal(VALUE self, VALUE other) -{ - if (!k_date_p(other)) - return equal_gen(self, other); - - { - get_d2(self, other); - - if (!(m_gregorian_p(adat) == m_gregorian_p(bdat))) - return equal_gen(self, other); - - { - VALUE a_nth, b_nth; - int a_jd, b_jd; - - m_canonicalize_jd(self, adat); - m_canonicalize_jd(other, bdat); - a_nth = m_nth(adat); - b_nth = m_nth(bdat); - a_jd = m_local_jd(adat); - b_jd = m_local_jd(bdat); - if (f_eqeq_p(a_nth, b_nth) && - a_jd == b_jd) - return Qtrue; - return Qfalse; - } - } -} - -/* :nodoc: */ -static VALUE -d_lite_eql_p(VALUE self, VALUE other) -{ - if (!k_date_p(other)) - return Qfalse; - return f_zero_p(d_lite_cmp(self, other)); -} - -/* :nodoc: */ -static VALUE -d_lite_hash(VALUE self) -{ - st_index_t v, h[4]; - - get_d1(self); - h[0] = m_nth(dat); - h[1] = m_jd(dat); - h[2] = m_df(dat); - h[3] = m_sf(dat); - v = rb_memhash(h, sizeof(h)); - return ST2FIX(v); -} - -#include "date_tmx.h" -static void set_tmx(VALUE, struct tmx *); -static VALUE strftimev(const char *, VALUE, - void (*)(VALUE, struct tmx *)); - -/* - * call-seq: - * to_s -> string - * - * Returns a string representation of the date in +self+ - * in {ISO 8601 extended date format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-ISO+8601+Format+Specifications] - * ('%Y-%m-%d'): - * - * Date.new(2001, 2, 3).to_s # => "2001-02-03" - * - */ -static VALUE -d_lite_to_s(VALUE self) -{ - return strftimev("%Y-%m-%d", self, set_tmx); -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -mk_inspect_raw(union DateData *x, VALUE klass) -{ - char flags[6]; - - flags[0] = (x->flags & COMPLEX_DAT) ? 'C' : 'S'; - flags[1] = (x->flags & HAVE_JD) ? 'j' : '-'; - flags[2] = (x->flags & HAVE_DF) ? 'd' : '-'; - flags[3] = (x->flags & HAVE_CIVIL) ? 'c' : '-'; - flags[4] = (x->flags & HAVE_TIME) ? 't' : '-'; - flags[5] = '\0'; - - if (simple_dat_p(x)) { - return rb_enc_sprintf(rb_usascii_encoding(), - "#<%"PRIsVALUE": " - "(%+"PRIsVALUE"th,%dj),+0s,%.0fj; " - "%dy%dm%dd; %s>", - klass, - x->s.nth, x->s.jd, x->s.sg, -#ifndef USE_PACK - x->s.year, x->s.mon, x->s.mday, -#else - x->s.year, - EX_MON(x->s.pc), EX_MDAY(x->s.pc), -#endif - flags); - } - else { - return rb_enc_sprintf(rb_usascii_encoding(), - "#<%"PRIsVALUE": " - "(%+"PRIsVALUE"th,%dj,%ds,%+"PRIsVALUE"n)," - "%+ds,%.0fj; " - "%dy%dm%dd %dh%dm%ds; %s>", - klass, - x->c.nth, x->c.jd, x->c.df, x->c.sf, - x->c.of, x->c.sg, -#ifndef USE_PACK - x->c.year, x->c.mon, x->c.mday, - x->c.hour, x->c.min, x->c.sec, -#else - x->c.year, - EX_MON(x->c.pc), EX_MDAY(x->c.pc), - EX_HOUR(x->c.pc), EX_MIN(x->c.pc), - EX_SEC(x->c.pc), -#endif - flags); - } -} - -/* :nodoc: */ -static VALUE -d_lite_inspect_raw(VALUE self) -{ - get_d1(self); - return mk_inspect_raw(dat, rb_obj_class(self)); -} -#endif - -static VALUE -mk_inspect(union DateData *x, VALUE klass, VALUE to_s) -{ - return rb_enc_sprintf(rb_usascii_encoding(), - "#<%"PRIsVALUE": %"PRIsVALUE" " - "((%+"PRIsVALUE"j,%ds,%+"PRIsVALUE"n),%+ds,%.0fj)>", - klass, to_s, - m_real_jd(x), m_df(x), m_sf(x), - m_of(x), m_sg(x)); -} - -/* - * call-seq: - * inspect -> string - * - * Returns a string representation of +self+: - * - * Date.new(2001, 2, 3).inspect - * # => "#" - * - */ -static VALUE -d_lite_inspect(VALUE self) -{ - get_d1(self); - return mk_inspect(dat, rb_obj_class(self), self); -} - -#include -#include "date_tmx.h" - -size_t date_strftime(char *s, size_t maxsize, const char *format, - const struct tmx *tmx); - -#define SMALLBUF 100 -static size_t -date_strftime_alloc(char **buf, const char *format, - struct tmx *tmx) -{ - size_t size, len, flen; - - (*buf)[0] = '\0'; - flen = strlen(format); - if (flen == 0) { - return 0; - } - errno = 0; - len = date_strftime(*buf, SMALLBUF, format, tmx); - if (len != 0 || (**buf == '\0' && errno != ERANGE)) return len; - for (size=1024; ; size*=2) { - *buf = xmalloc(size); - (*buf)[0] = '\0'; - len = date_strftime(*buf, size, format, tmx); - /* - * buflen can be zero EITHER because there's not enough - * room in the string, or because the control command - * goes to the empty string. Make a reasonable guess that - * if the buffer is 1024 times bigger than the length of the - * format string, it's not failing for lack of room. - */ - if (len > 0) break; - xfree(*buf); - if (size >= 1024 * flen) { - rb_sys_fail(format); - break; - } - } - return len; -} - -static VALUE -tmx_m_secs(union DateData *x) -{ - VALUE s; - int df; - - s = day_to_sec(f_sub(m_real_jd(x), - UNIX_EPOCH_IN_CJD)); - if (simple_dat_p(x)) - return s; - df = m_df(x); - if (df) - s = f_add(s, INT2FIX(df)); - return s; -} - -#define MILLISECOND_IN_NANOSECONDS 1000000 - -static VALUE -tmx_m_msecs(union DateData *x) -{ - VALUE s, sf; - - s = sec_to_ms(tmx_m_secs(x)); - if (simple_dat_p(x)) - return s; - sf = m_sf(x); - if (f_nonzero_p(sf)) - s = f_add(s, f_div(sf, INT2FIX(MILLISECOND_IN_NANOSECONDS))); - return s; -} - -static int -tmx_m_of(union DateData *x) -{ - return m_of(x); -} - -static char * -tmx_m_zone(union DateData *x) -{ - VALUE zone = m_zone(x); - /* TODO: fix potential dangling pointer */ - return RSTRING_PTR(zone); -} - -static const struct tmx_funcs tmx_funcs = { - (VALUE (*)(void *))m_real_year, - (int (*)(void *))m_yday, - (int (*)(void *))m_mon, - (int (*)(void *))m_mday, - (VALUE (*)(void *))m_real_cwyear, - (int (*)(void *))m_cweek, - (int (*)(void *))m_cwday, - (int (*)(void *))m_wnum0, - (int (*)(void *))m_wnum1, - (int (*)(void *))m_wday, - (int (*)(void *))m_hour, - (int (*)(void *))m_min, - (int (*)(void *))m_sec, - (VALUE (*)(void *))m_sf_in_sec, - (VALUE (*)(void *))tmx_m_secs, - (VALUE (*)(void *))tmx_m_msecs, - (int (*)(void *))tmx_m_of, - (char *(*)(void *))tmx_m_zone -}; - -static void -set_tmx(VALUE self, struct tmx *tmx) -{ - get_d1(self); - tmx->dat = (void *)dat; - tmx->funcs = &tmx_funcs; -} - -static VALUE -date_strftime_internal(int argc, VALUE *argv, VALUE self, - const char *default_fmt, - void (*func)(VALUE, struct tmx *)) -{ - VALUE vfmt; - const char *fmt; - long len; - char buffer[SMALLBUF], *buf = buffer; - struct tmx tmx; - VALUE str; - - rb_scan_args(argc, argv, "01", &vfmt); - - if (argc < 1) - vfmt = rb_usascii_str_new2(default_fmt); - else { - StringValue(vfmt); - if (!rb_enc_str_asciicompat_p(vfmt)) { - rb_raise(rb_eArgError, - "format should have ASCII compatible encoding"); - } - } - fmt = RSTRING_PTR(vfmt); - len = RSTRING_LEN(vfmt); - (*func)(self, &tmx); - if (memchr(fmt, '\0', len)) { - /* Ruby string may contain \0's. */ - const char *p = fmt, *pe = fmt + len; - - str = rb_str_new(0, 0); - while (p < pe) { - len = date_strftime_alloc(&buf, p, &tmx); - rb_str_cat(str, buf, len); - p += strlen(p); - if (buf != buffer) { - xfree(buf); - buf = buffer; - } - for (fmt = p; p < pe && !*p; ++p); - if (p > fmt) rb_str_cat(str, fmt, p - fmt); - } - rb_enc_copy(str, vfmt); - return str; - } - else - len = date_strftime_alloc(&buf, fmt, &tmx); - - str = rb_str_new(buf, len); - if (buf != buffer) xfree(buf); - rb_enc_copy(str, vfmt); - return str; -} - -/* - * call-seq: - * strftime(format = '%F') -> string - * - * Returns a string representation of the date in +self+, - * formatted according the given +format+: - * - * Date.new(2001, 2, 3).strftime # => "2001-02-03" - * - * For other formats, see - * {Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html]. - * - */ -static VALUE -d_lite_strftime(int argc, VALUE *argv, VALUE self) -{ - return date_strftime_internal(argc, argv, self, - "%Y-%m-%d", set_tmx); -} - -static VALUE -strftimev(const char *fmt, VALUE self, - void (*func)(VALUE, struct tmx *)) -{ - char buffer[SMALLBUF], *buf = buffer; - struct tmx tmx; - long len; - VALUE str; - - (*func)(self, &tmx); - len = date_strftime_alloc(&buf, fmt, &tmx); - RB_GC_GUARD(self); - str = rb_usascii_str_new(buf, len); - if (buf != buffer) xfree(buf); - return str; -} - -/* - * call-seq: - * asctime -> string - * - * Equivalent to #strftime with argument '%a %b %e %T %Y' - * (or its {shorthand form}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-Shorthand+Conversion+Specifiers] - * '%c'): - * - * Date.new(2001, 2, 3).asctime # => "Sat Feb 3 00:00:00 2001" - * - * See {asctime}[https://linux.die.net/man/3/asctime]. - * - */ -static VALUE -d_lite_asctime(VALUE self) -{ - return strftimev("%a %b %e %H:%M:%S %Y", self, set_tmx); -} - -/* - * call-seq: - * iso8601 -> string - * - * Equivalent to #strftime with argument '%Y-%m-%d' - * (or its {shorthand form}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-Shorthand+Conversion+Specifiers] - * '%F'); - * - * Date.new(2001, 2, 3).iso8601 # => "2001-02-03" - * - */ -static VALUE -d_lite_iso8601(VALUE self) -{ - return strftimev("%Y-%m-%d", self, set_tmx); -} - -/* - * call-seq: - * rfc3339 -> string - * - * Equivalent to #strftime with argument '%FT%T%:z'; - * see {Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html]: - * - * Date.new(2001, 2, 3).rfc3339 # => "2001-02-03T00:00:00+00:00" - * - */ -static VALUE -d_lite_rfc3339(VALUE self) -{ - return strftimev("%Y-%m-%dT%H:%M:%S%:z", self, set_tmx); -} - -/* - * call-seq: - * rfc2822 -> string - * - * Equivalent to #strftime with argument '%a, %-d %b %Y %T %z'; - * see {Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html]: - * - * Date.new(2001, 2, 3).rfc2822 # => "Sat, 3 Feb 2001 00:00:00 +0000" - * - */ -static VALUE -d_lite_rfc2822(VALUE self) -{ - return strftimev("%a, %-d %b %Y %T %z", self, set_tmx); -} - -/* - * call-seq: - * httpdate -> string - * - * Equivalent to #strftime with argument '%a, %d %b %Y %T GMT'; - * see {Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html]: - * - * Date.new(2001, 2, 3).httpdate # => "Sat, 03 Feb 2001 00:00:00 GMT" - * - */ -static VALUE -d_lite_httpdate(VALUE self) -{ - volatile VALUE dup = dup_obj_with_new_offset(self, 0); - return strftimev("%a, %d %b %Y %T GMT", dup, set_tmx); -} - -enum { - DECIMAL_SIZE_OF_LONG = DECIMAL_SIZE_OF_BITS(CHAR_BIT*sizeof(long)), - JISX0301_DATE_SIZE = DECIMAL_SIZE_OF_LONG+8 -}; - -static const char * -jisx0301_date_format(char *fmt, size_t size, VALUE jd, VALUE y) -{ - if (FIXNUM_P(jd)) { - long d = FIX2INT(jd); - long s; - char c; - if (d < 2405160) - return "%Y-%m-%d"; - if (d < 2419614) { - c = 'M'; - s = 1867; - } - else if (d < 2424875) { - c = 'T'; - s = 1911; - } - else if (d < 2447535) { - c = 'S'; - s = 1925; - } - else if (d < 2458605) { - c = 'H'; - s = 1988; - } - else { - c = 'R'; - s = 2018; - } - snprintf(fmt, size, "%c%02ld" ".%%m.%%d", c, FIX2INT(y) - s); - return fmt; - } - return "%Y-%m-%d"; -} - -/* - * call-seq: - * jisx0301 -> string - * - * Returns a string representation of the date in +self+ - * in JIS X 0301 format. - * - * Date.new(2001, 2, 3).jisx0301 # => "H13.02.03" - * - */ -static VALUE -d_lite_jisx0301(VALUE self) -{ - char fmtbuf[JISX0301_DATE_SIZE]; - const char *fmt; - - get_d1(self); - fmt = jisx0301_date_format(fmtbuf, sizeof(fmtbuf), - m_real_local_jd(dat), - m_real_year(dat)); - return strftimev(fmt, self, set_tmx); -} - -static VALUE -deconstruct_keys(VALUE self, VALUE keys, int is_datetime) -{ - VALUE h = rb_hash_new(); - long i; - - get_d1(self); - - if (NIL_P(keys)) { - rb_hash_aset(h, sym_year, m_real_year(dat)); - rb_hash_aset(h, sym_month, INT2FIX(m_mon(dat))); - rb_hash_aset(h, sym_day, INT2FIX(m_mday(dat))); - rb_hash_aset(h, sym_yday, INT2FIX(m_yday(dat))); - rb_hash_aset(h, sym_wday, INT2FIX(m_wday(dat))); - if (is_datetime) { - rb_hash_aset(h, sym_hour, INT2FIX(m_hour(dat))); - rb_hash_aset(h, sym_min, INT2FIX(m_min(dat))); - rb_hash_aset(h, sym_sec, INT2FIX(m_sec(dat))); - rb_hash_aset(h, sym_sec_fraction, m_sf_in_sec(dat)); - rb_hash_aset(h, sym_zone, m_zone(dat)); - } - - return h; - } - if (!RB_TYPE_P(keys, T_ARRAY)) { - rb_raise(rb_eTypeError, - "wrong argument type %"PRIsVALUE" (expected Array or nil)", - rb_obj_class(keys)); - - } - - for (i=0; i hash - * - * Returns a hash of the name/value pairs, to use in pattern matching. - * Possible keys are: :year, :month, :day, - * :wday, :yday. - * - * Possible usages: - * - * d = Date.new(2022, 10, 5) - * - * if d in wday: 3, day: ..7 # uses deconstruct_keys underneath - * puts "first Wednesday of the month" - * end - * #=> prints "first Wednesday of the month" - * - * case d - * in year: ...2022 - * puts "too old" - * in month: ..9 - * puts "quarter 1-3" - * in wday: 1..5, month: - * puts "working day in month #{month}" - * end - * #=> prints "working day in month 10" - * - * Note that deconstruction by pattern can also be combined with class check: - * - * if d in Date(wday: 3, day: ..7) - * puts "first Wednesday of the month" - * end - * - */ -static VALUE -d_lite_deconstruct_keys(VALUE self, VALUE keys) -{ - return deconstruct_keys(self, keys, /* is_datetime=false */ 0); -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -d_lite_marshal_dump_old(VALUE self) -{ - VALUE a; - - get_d1(self); - - a = rb_ary_new3(3, - m_ajd(dat), - m_of_in_day(dat), - DBL2NUM(m_sg(dat))); - - if (FL_TEST(self, FL_EXIVAR)) { - rb_copy_generic_ivar(a, self); - FL_SET(a, FL_EXIVAR); - } - - return a; -} -#endif - -/* :nodoc: */ -static VALUE -d_lite_marshal_dump(VALUE self) -{ - VALUE a; - - get_d1(self); - - a = rb_ary_new3(6, - m_nth(dat), - INT2FIX(m_jd(dat)), - INT2FIX(m_df(dat)), - m_sf(dat), - INT2FIX(m_of(dat)), - DBL2NUM(m_sg(dat))); - - if (FL_TEST(self, FL_EXIVAR)) { - rb_copy_generic_ivar(a, self); - FL_SET(a, FL_EXIVAR); - } - - return a; -} - -/* :nodoc: */ -static VALUE -d_lite_marshal_load(VALUE self, VALUE a) -{ - VALUE nth, sf; - int jd, df, of; - double sg; - - get_d1(self); - - rb_check_frozen(self); - - if (!RB_TYPE_P(a, T_ARRAY)) - rb_raise(rb_eTypeError, "expected an array"); - - switch (RARRAY_LEN(a)) { - case 2: /* 1.6.x */ - case 3: /* 1.8.x, 1.9.2 */ - { - VALUE ajd, vof, vsg; - - if (RARRAY_LEN(a) == 2) { - ajd = f_sub(RARRAY_AREF(a, 0), half_days_in_day); - vof = INT2FIX(0); - vsg = RARRAY_AREF(a, 1); - if (!k_numeric_p(vsg)) - vsg = DBL2NUM(RTEST(vsg) ? GREGORIAN : JULIAN); - } - else { - ajd = RARRAY_AREF(a, 0); - vof = RARRAY_AREF(a, 1); - vsg = RARRAY_AREF(a, 2); - } - - old_to_new(ajd, vof, vsg, - &nth, &jd, &df, &sf, &of, &sg); - } - break; - case 6: - { - nth = RARRAY_AREF(a, 0); - jd = NUM2INT(RARRAY_AREF(a, 1)); - df = NUM2INT(RARRAY_AREF(a, 2)); - sf = RARRAY_AREF(a, 3); - of = NUM2INT(RARRAY_AREF(a, 4)); - sg = NUM2DBL(RARRAY_AREF(a, 5)); - } - break; - default: - rb_raise(rb_eTypeError, "invalid size"); - break; - } - - if (simple_dat_p(dat)) { - if (df || !f_zero_p(sf) || of) { - /* loading a fractional date; promote to complex */ - dat = ruby_xrealloc(dat, sizeof(struct ComplexDateData)); - RTYPEDDATA(self)->data = dat; - goto complex_data; - } - set_to_simple(self, &dat->s, nth, jd, sg, 0, 0, 0, HAVE_JD); - } else { - complex_data: - set_to_complex(self, &dat->c, nth, jd, df, sf, of, sg, - 0, 0, 0, 0, 0, 0, - HAVE_JD | HAVE_DF); - } - - if (FL_TEST(a, FL_EXIVAR)) { - rb_copy_generic_ivar(self, a); - FL_SET(self, FL_EXIVAR); - } - - return self; -} - -/* :nodoc: */ -static VALUE -date_s__load(VALUE klass, VALUE s) -{ - VALUE a, obj; - - a = rb_marshal_load(s); - obj = d_lite_s_alloc(klass); - return d_lite_marshal_load(obj, a); -} - -/* datetime */ - -/* - * call-seq: - * DateTime.jd([jd=0[, hour=0[, minute=0[, second=0[, offset=0[, start=Date::ITALY]]]]]]) -> datetime - * - * Creates a DateTime object denoting the given chronological Julian - * day number. - * - * DateTime.jd(2451944) #=> # - * DateTime.jd(2451945) #=> # - * DateTime.jd(Rational('0.5')) - * #=> # - */ -static VALUE -datetime_s_jd(int argc, VALUE *argv, VALUE klass) -{ - VALUE vjd, vh, vmin, vs, vof, vsg, jd, fr, fr2, ret; - int h, min, s, rof; - double sg; - - rb_scan_args(argc, argv, "06", &vjd, &vh, &vmin, &vs, &vof, &vsg); - - jd = INT2FIX(0); - - h = min = s = 0; - fr2 = INT2FIX(0); - rof = 0; - sg = DEFAULT_SG; - - switch (argc) { - case 6: - val2sg(vsg, sg); - case 5: - val2off(vof, rof); - case 4: - check_numeric(vs, "second"); - num2int_with_frac(s, positive_inf); - case 3: - check_numeric(vmin, "minute"); - num2int_with_frac(min, 3); - case 2: - check_numeric(vh, "hour"); - num2int_with_frac(h, 2); - case 1: - check_numeric(vjd, "jd"); - num2num_with_frac(jd, 1); - } - - { - VALUE nth; - int rh, rmin, rs, rjd, rjd2; - - if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs)) - rb_raise(eDateError, "invalid date"); - canon24oc(); - - decode_jd(jd, &nth, &rjd); - rjd2 = jd_local_to_utc(rjd, - time_to_df(rh, rmin, rs), - rof); - - ret = d_complex_new_internal(klass, - nth, rjd2, - 0, INT2FIX(0), - rof, sg, - 0, 0, 0, - rh, rmin, rs, - HAVE_JD | HAVE_TIME); - } - add_frac(); - return ret; -} - -/* - * call-seq: - * DateTime.ordinal([year=-4712[, yday=1[, hour=0[, minute=0[, second=0[, offset=0[, start=Date::ITALY]]]]]]]) -> datetime - * - * Creates a DateTime object denoting the given ordinal date. - * - * DateTime.ordinal(2001,34) #=> # - * DateTime.ordinal(2001,34,4,5,6,'+7') - * #=> # - * DateTime.ordinal(2001,-332,-20,-55,-54,'+7') - * #=> # - */ -static VALUE -datetime_s_ordinal(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vd, vh, vmin, vs, vof, vsg, y, fr, fr2, ret; - int d, h, min, s, rof; - double sg; - - rb_scan_args(argc, argv, "07", &vy, &vd, &vh, &vmin, &vs, &vof, &vsg); - - y = INT2FIX(-4712); - d = 1; - - h = min = s = 0; - fr2 = INT2FIX(0); - rof = 0; - sg = DEFAULT_SG; - - switch (argc) { - case 7: - val2sg(vsg, sg); - case 6: - val2off(vof, rof); - case 5: - check_numeric(vs, "second"); - num2int_with_frac(s, positive_inf); - case 4: - check_numeric(vmin, "minute"); - num2int_with_frac(min, 4); - case 3: - check_numeric(vh, "hour"); - num2int_with_frac(h, 3); - case 2: - check_numeric(vd, "yday"); - num2int_with_frac(d, 2); - case 1: - check_numeric(vy, "year"); - y = vy; - } - - { - VALUE nth; - int ry, rd, rh, rmin, rs, rjd, rjd2, ns; - - if (!valid_ordinal_p(y, d, sg, - &nth, &ry, - &rd, &rjd, - &ns)) - rb_raise(eDateError, "invalid date"); - if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs)) - rb_raise(eDateError, "invalid date"); - canon24oc(); - - rjd2 = jd_local_to_utc(rjd, - time_to_df(rh, rmin, rs), - rof); - - ret = d_complex_new_internal(klass, - nth, rjd2, - 0, INT2FIX(0), - rof, sg, - 0, 0, 0, - rh, rmin, rs, - HAVE_JD | HAVE_TIME); - } - add_frac(); - return ret; -} - -/* - * Same as DateTime.new. - */ -static VALUE -datetime_s_civil(int argc, VALUE *argv, VALUE klass) -{ - return datetime_initialize(argc, argv, d_lite_s_alloc_complex(klass)); -} - -static VALUE -datetime_initialize(int argc, VALUE *argv, VALUE self) -{ - VALUE vy, vm, vd, vh, vmin, vs, vof, vsg, y, fr, fr2, ret; - int m, d, h, min, s, rof; - double sg; - struct ComplexDateData *dat = rb_check_typeddata(self, &d_lite_type); - - if (!complex_dat_p(dat)) { - rb_raise(rb_eTypeError, "DateTime expected"); - } - - rb_scan_args(argc, argv, "08", &vy, &vm, &vd, &vh, &vmin, &vs, &vof, &vsg); - - y = INT2FIX(-4712); - m = 1; - d = 1; - - h = min = s = 0; - fr2 = INT2FIX(0); - rof = 0; - sg = DEFAULT_SG; - - switch (argc) { - case 8: - val2sg(vsg, sg); - case 7: - val2off(vof, rof); - case 6: - check_numeric(vs, "second"); - num2int_with_frac(s, positive_inf); - case 5: - check_numeric(vmin, "minute"); - num2int_with_frac(min, 5); - case 4: - check_numeric(vh, "hour"); - num2int_with_frac(h, 4); - case 3: - check_numeric(vd, "day"); - num2int_with_frac(d, 3); - case 2: - check_numeric(vm, "month"); - m = NUM2INT(vm); - case 1: - check_numeric(vy, "year"); - y = vy; - } - - if (guess_style(y, sg) < 0) { - VALUE nth; - int ry, rm, rd, rh, rmin, rs; - - if (!valid_gregorian_p(y, m, d, - &nth, &ry, - &rm, &rd)) - rb_raise(eDateError, "invalid date"); - if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs)) - rb_raise(eDateError, "invalid date"); - canon24oc(); - - set_to_complex(self, dat, - nth, 0, - 0, INT2FIX(0), - rof, sg, - ry, rm, rd, - rh, rmin, rs, - HAVE_CIVIL | HAVE_TIME); - } - else { - VALUE nth; - int ry, rm, rd, rh, rmin, rs, rjd, rjd2, ns; - - if (!valid_civil_p(y, m, d, sg, - &nth, &ry, - &rm, &rd, &rjd, - &ns)) - rb_raise(eDateError, "invalid date"); - if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs)) - rb_raise(eDateError, "invalid date"); - canon24oc(); - - rjd2 = jd_local_to_utc(rjd, - time_to_df(rh, rmin, rs), - rof); - - set_to_complex(self, dat, - nth, rjd2, - 0, INT2FIX(0), - rof, sg, - ry, rm, rd, - rh, rmin, rs, - HAVE_JD | HAVE_CIVIL | HAVE_TIME); - } - ret = self; - add_frac(); - return ret; -} - -/* - * call-seq: - * DateTime.commercial([cwyear=-4712[, cweek=1[, cwday=1[, hour=0[, minute=0[, second=0[, offset=0[, start=Date::ITALY]]]]]]]]) -> datetime - * - * Creates a DateTime object denoting the given week date. - * - * DateTime.commercial(2001) #=> # - * DateTime.commercial(2002) #=> # - * DateTime.commercial(2001,5,6,4,5,6,'+7') - * #=> # - */ -static VALUE -datetime_s_commercial(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vw, vd, vh, vmin, vs, vof, vsg, y, fr, fr2, ret; - int w, d, h, min, s, rof; - double sg; - - rb_scan_args(argc, argv, "08", &vy, &vw, &vd, &vh, &vmin, &vs, &vof, &vsg); - - y = INT2FIX(-4712); - w = 1; - d = 1; - - h = min = s = 0; - fr2 = INT2FIX(0); - rof = 0; - sg = DEFAULT_SG; - - switch (argc) { - case 8: - val2sg(vsg, sg); - case 7: - val2off(vof, rof); - case 6: - check_numeric(vs, "second"); - num2int_with_frac(s, positive_inf); - case 5: - check_numeric(vmin, "minute"); - num2int_with_frac(min, 5); - case 4: - check_numeric(vh, "hour"); - num2int_with_frac(h, 4); - case 3: - check_numeric(vd, "cwday"); - num2int_with_frac(d, 3); - case 2: - check_numeric(vw, "cweek"); - w = NUM2INT(vw); - case 1: - check_numeric(vy, "year"); - y = vy; - } - - { - VALUE nth; - int ry, rw, rd, rh, rmin, rs, rjd, rjd2, ns; - - if (!valid_commercial_p(y, w, d, sg, - &nth, &ry, - &rw, &rd, &rjd, - &ns)) - rb_raise(eDateError, "invalid date"); - if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs)) - rb_raise(eDateError, "invalid date"); - canon24oc(); - - rjd2 = jd_local_to_utc(rjd, - time_to_df(rh, rmin, rs), - rof); - - ret = d_complex_new_internal(klass, - nth, rjd2, - 0, INT2FIX(0), - rof, sg, - 0, 0, 0, - rh, rmin, rs, - HAVE_JD | HAVE_TIME); - } - add_frac(); - return ret; -} - -#ifndef NDEBUG -/* :nodoc: */ -static VALUE -datetime_s_weeknum(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vw, vd, vf, vh, vmin, vs, vof, vsg, y, fr, fr2, ret; - int w, d, f, h, min, s, rof; - double sg; - - rb_scan_args(argc, argv, "09", &vy, &vw, &vd, &vf, - &vh, &vmin, &vs, &vof, &vsg); - - y = INT2FIX(-4712); - w = 0; - d = 1; - f = 0; - - h = min = s = 0; - fr2 = INT2FIX(0); - rof = 0; - sg = DEFAULT_SG; - - switch (argc) { - case 9: - val2sg(vsg, sg); - case 8: - val2off(vof, rof); - case 7: - num2int_with_frac(s, positive_inf); - case 6: - num2int_with_frac(min, 6); - case 5: - num2int_with_frac(h, 5); - case 4: - f = NUM2INT(vf); - case 3: - num2int_with_frac(d, 4); - case 2: - w = NUM2INT(vw); - case 1: - y = vy; - } - - { - VALUE nth; - int ry, rw, rd, rh, rmin, rs, rjd, rjd2, ns; - - if (!valid_weeknum_p(y, w, d, f, sg, - &nth, &ry, - &rw, &rd, &rjd, - &ns)) - rb_raise(eDateError, "invalid date"); - if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs)) - rb_raise(eDateError, "invalid date"); - canon24oc(); - - rjd2 = jd_local_to_utc(rjd, - time_to_df(rh, rmin, rs), - rof); - ret = d_complex_new_internal(klass, - nth, rjd2, - 0, INT2FIX(0), - rof, sg, - 0, 0, 0, - rh, rmin, rs, - HAVE_JD | HAVE_TIME); - } - add_frac(); - return ret; -} - -/* :nodoc: */ -static VALUE -datetime_s_nth_kday(int argc, VALUE *argv, VALUE klass) -{ - VALUE vy, vm, vn, vk, vh, vmin, vs, vof, vsg, y, fr, fr2, ret; - int m, n, k, h, min, s, rof; - double sg; - - rb_scan_args(argc, argv, "09", &vy, &vm, &vn, &vk, - &vh, &vmin, &vs, &vof, &vsg); - - y = INT2FIX(-4712); - m = 1; - n = 1; - k = 1; - - h = min = s = 0; - fr2 = INT2FIX(0); - rof = 0; - sg = DEFAULT_SG; - - switch (argc) { - case 9: - val2sg(vsg, sg); - case 8: - val2off(vof, rof); - case 7: - num2int_with_frac(s, positive_inf); - case 6: - num2int_with_frac(min, 6); - case 5: - num2int_with_frac(h, 5); - case 4: - num2int_with_frac(k, 4); - case 3: - n = NUM2INT(vn); - case 2: - m = NUM2INT(vm); - case 1: - y = vy; - } - - { - VALUE nth; - int ry, rm, rn, rk, rh, rmin, rs, rjd, rjd2, ns; - - if (!valid_nth_kday_p(y, m, n, k, sg, - &nth, &ry, - &rm, &rn, &rk, &rjd, - &ns)) - rb_raise(eDateError, "invalid date"); - if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs)) - rb_raise(eDateError, "invalid date"); - canon24oc(); - - rjd2 = jd_local_to_utc(rjd, - time_to_df(rh, rmin, rs), - rof); - ret = d_complex_new_internal(klass, - nth, rjd2, - 0, INT2FIX(0), - rof, sg, - 0, 0, 0, - rh, rmin, rs, - HAVE_JD | HAVE_TIME); - } - add_frac(); - return ret; -} -#endif - -/* - * call-seq: - * DateTime.now([start=Date::ITALY]) -> datetime - * - * Creates a DateTime object denoting the present time. - * - * DateTime.now #=> # - */ -static VALUE -datetime_s_now(int argc, VALUE *argv, VALUE klass) -{ - VALUE vsg, nth, ret; - double sg; -#ifdef HAVE_CLOCK_GETTIME - struct timespec ts; -#else - struct timeval tv; -#endif - time_t sec; - struct tm tm; - long sf, of; - int y, ry, m, d, h, min, s; - - rb_scan_args(argc, argv, "01", &vsg); - - if (argc < 1) - sg = DEFAULT_SG; - else - sg = NUM2DBL(vsg); - -#ifdef HAVE_CLOCK_GETTIME - if (clock_gettime(CLOCK_REALTIME, &ts) == -1) - rb_sys_fail("clock_gettime"); - sec = ts.tv_sec; -#else - if (gettimeofday(&tv, NULL) == -1) - rb_sys_fail("gettimeofday"); - sec = tv.tv_sec; -#endif - tzset(); - if (!localtime_r(&sec, &tm)) - rb_sys_fail("localtime"); - - y = tm.tm_year + 1900; - m = tm.tm_mon + 1; - d = tm.tm_mday; - h = tm.tm_hour; - min = tm.tm_min; - s = tm.tm_sec; - if (s == 60) - s = 59; -#ifdef HAVE_STRUCT_TM_TM_GMTOFF - of = tm.tm_gmtoff; -#elif defined(HAVE_TIMEZONE) -#if defined(HAVE_ALTZONE) && !defined(_AIX) - of = (long)-((tm.tm_isdst > 0) ? altzone : timezone); -#else - of = (long)-timezone; - if (tm.tm_isdst) { - time_t sec2; - - tm.tm_isdst = 0; - sec2 = mktime(&tm); - of += (long)difftime(sec2, sec); - } -#endif -#elif defined(HAVE_TIMEGM) - { - time_t sec2; - - sec2 = timegm(&tm); - of = (long)difftime(sec2, sec); - } -#else - { - struct tm tm2; - time_t sec2; - - if (!gmtime_r(&sec, &tm2)) - rb_sys_fail("gmtime"); - tm2.tm_isdst = tm.tm_isdst; - sec2 = mktime(&tm2); - of = (long)difftime(sec, sec2); - } -#endif -#ifdef HAVE_CLOCK_GETTIME - sf = ts.tv_nsec; -#else - sf = tv.tv_usec * 1000; -#endif - - if (of < -DAY_IN_SECONDS || of > DAY_IN_SECONDS) { - of = 0; - rb_warning("invalid offset is ignored"); - } - - decode_year(INT2FIX(y), -1, &nth, &ry); - - ret = d_complex_new_internal(klass, - nth, 0, - 0, LONG2NUM(sf), - (int)of, GREGORIAN, - ry, m, d, - h, min, s, - HAVE_CIVIL | HAVE_TIME); - { - get_d1(ret); - set_sg(dat, sg); - } - return ret; -} - -static VALUE -dt_new_by_frags(VALUE klass, VALUE hash, VALUE sg) -{ - VALUE jd, sf, t; - int df, of; - - if (!c_valid_start_p(NUM2DBL(sg))) { - sg = INT2FIX(DEFAULT_SG); - rb_warning("invalid start is ignored"); - } - - if (NIL_P(hash)) - rb_raise(eDateError, "invalid date"); - - if (NIL_P(ref_hash("jd")) && - NIL_P(ref_hash("yday")) && - !NIL_P(ref_hash("year")) && - !NIL_P(ref_hash("mon")) && - !NIL_P(ref_hash("mday"))) { - jd = rt__valid_civil_p(ref_hash("year"), - ref_hash("mon"), - ref_hash("mday"), sg); - - if (NIL_P(ref_hash("hour"))) - set_hash("hour", INT2FIX(0)); - if (NIL_P(ref_hash("min"))) - set_hash("min", INT2FIX(0)); - if (NIL_P(ref_hash("sec"))) - set_hash("sec", INT2FIX(0)); - else if (f_eqeq_p(ref_hash("sec"), INT2FIX(60))) - set_hash("sec", INT2FIX(59)); - } - else { - hash = rt_rewrite_frags(hash); - hash = rt_complete_frags(klass, hash); - jd = rt__valid_date_frags_p(hash, sg); - } - - if (NIL_P(jd)) - rb_raise(eDateError, "invalid date"); - - { - int rh, rmin, rs; - - if (!c_valid_time_p(NUM2INT(ref_hash("hour")), - NUM2INT(ref_hash("min")), - NUM2INT(ref_hash("sec")), - &rh, &rmin, &rs)) - rb_raise(eDateError, "invalid date"); - - df = time_to_df(rh, rmin, rs); - } - - t = ref_hash("sec_fraction"); - if (NIL_P(t)) - sf = INT2FIX(0); - else - sf = sec_to_ns(t); - - t = ref_hash("offset"); - if (NIL_P(t)) - of = 0; - else { - of = NUM2INT(t); - if (of < -DAY_IN_SECONDS || of > DAY_IN_SECONDS) { - of = 0; - rb_warning("invalid offset is ignored"); - } - } - { - VALUE nth; - int rjd, rjd2; - - decode_jd(jd, &nth, &rjd); - rjd2 = jd_local_to_utc(rjd, df, of); - df = df_local_to_utc(df, of); - - return d_complex_new_internal(klass, - nth, rjd2, - df, sf, - of, NUM2DBL(sg), - 0, 0, 0, - 0, 0, 0, - HAVE_JD | HAVE_DF); - } -} - -/* - * call-seq: - * DateTime._strptime(string[, format='%FT%T%z']) -> hash - * - * Parses the given representation of date and time with the given - * template, and returns a hash of parsed elements. _strptime does - * not support specification of flags and width unlike strftime. - * - * See also strptime(3) and #strftime. - */ -static VALUE -datetime_s__strptime(int argc, VALUE *argv, VALUE klass) -{ - return date_s__strptime_internal(argc, argv, klass, "%FT%T%z"); -} - -/* - * call-seq: - * DateTime.strptime([string='-4712-01-01T00:00:00+00:00'[, format='%FT%T%z'[ ,start=Date::ITALY]]]) -> datetime - * - * Parses the given representation of date and time with the given - * template, and creates a DateTime object. strptime does not support - * specification of flags and width unlike strftime. - * - * DateTime.strptime('2001-02-03T04:05:06+07:00', '%Y-%m-%dT%H:%M:%S%z') - * #=> # - * DateTime.strptime('03-02-2001 04:05:06 PM', '%d-%m-%Y %I:%M:%S %p') - * #=> # - * DateTime.strptime('2001-W05-6T04:05:06+07:00', '%G-W%V-%uT%H:%M:%S%z') - * #=> # - * DateTime.strptime('2001 04 6 04 05 06 +7', '%Y %U %w %H %M %S %z') - * #=> # - * DateTime.strptime('2001 05 6 04 05 06 +7', '%Y %W %u %H %M %S %z') - * #=> # - * DateTime.strptime('-1', '%s') - * #=> # - * DateTime.strptime('-1000', '%Q') - * #=> # - * DateTime.strptime('sat3feb014pm+7', '%a%d%b%y%H%p%z') - * #=> # - * - * See also strptime(3) and #strftime. - */ -static VALUE -datetime_s_strptime(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, fmt, sg; - - rb_scan_args(argc, argv, "03", &str, &fmt, &sg); - - switch (argc) { - case 0: - str = rb_str_new2(JULIAN_EPOCH_DATETIME); - case 1: - fmt = rb_str_new2("%FT%T%z"); - case 2: - sg = INT2FIX(DEFAULT_SG); - } - - { - VALUE argv2[2], hash; - - argv2[0] = str; - argv2[1] = fmt; - hash = date_s__strptime(2, argv2, klass); - return dt_new_by_frags(klass, hash, sg); - } -} - -/* - * call-seq: - * DateTime.parse(string='-4712-01-01T00:00:00+00:00'[, comp=true[, start=Date::ITALY]], limit: 128) -> datetime - * - * Parses the given representation of date and time, and creates a - * DateTime object. - * - * This method *does* *not* function as a validator. If the input - * string does not match valid formats strictly, you may get a cryptic - * result. Should consider to use DateTime.strptime instead of this - * method as possible. - * - * If the optional second argument is true and the detected year is in - * the range "00" to "99", makes it full. - * - * DateTime.parse('2001-02-03T04:05:06+07:00') - * #=> # - * DateTime.parse('20010203T040506+0700') - * #=> # - * DateTime.parse('3rd Feb 2001 04:05:06 PM') - * #=> # - * - * Raise an ArgumentError when the string length is longer than _limit_. - * You can stop this check by passing limit: nil, but note - * that it may take a long time to parse. - */ -static VALUE -datetime_s_parse(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, comp, sg, opt; - - argc = rb_scan_args(argc, argv, "03:", &str, &comp, &sg, &opt); - - switch (argc) { - case 0: - str = rb_str_new2(JULIAN_EPOCH_DATETIME); - case 1: - comp = Qtrue; - case 2: - sg = INT2FIX(DEFAULT_SG); - } - - { - int argc2 = 2; - VALUE argv2[3], hash; - argv2[0] = str; - argv2[1] = comp; - argv2[2] = opt; - if (!NIL_P(opt)) argc2++; - hash = date_s__parse(argc2, argv2, klass); - return dt_new_by_frags(klass, hash, sg); - } -} - -/* - * call-seq: - * DateTime.iso8601(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime - * - * Creates a new DateTime object by parsing from a string according to - * some typical ISO 8601 formats. - * - * DateTime.iso8601('2001-02-03T04:05:06+07:00') - * #=> # - * DateTime.iso8601('20010203T040506+0700') - * #=> # - * DateTime.iso8601('2001-W05-6T04:05:06+07:00') - * #=> # - * - * Raise an ArgumentError when the string length is longer than _limit_. - * You can stop this check by passing limit: nil, but note - * that it may take a long time to parse. - */ -static VALUE -datetime_s_iso8601(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, sg, opt; - - argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - - switch (argc) { - case 0: - str = rb_str_new2(JULIAN_EPOCH_DATETIME); - case 1: - sg = INT2FIX(DEFAULT_SG); - } - - { - int argc2 = 1; - VALUE argv2[2], hash; - argv2[0] = str; - argv2[1] = opt; - if (!NIL_P(opt)) argc2++; - hash = date_s__iso8601(argc2, argv2, klass); - return dt_new_by_frags(klass, hash, sg); - } -} - -/* - * call-seq: - * DateTime.rfc3339(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime - * - * Creates a new DateTime object by parsing from a string according to - * some typical RFC 3339 formats. - * - * DateTime.rfc3339('2001-02-03T04:05:06+07:00') - * #=> # - * - * Raise an ArgumentError when the string length is longer than _limit_. - * You can stop this check by passing limit: nil, but note - * that it may take a long time to parse. - */ -static VALUE -datetime_s_rfc3339(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, sg, opt; - - argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - - switch (argc) { - case 0: - str = rb_str_new2(JULIAN_EPOCH_DATETIME); - case 1: - sg = INT2FIX(DEFAULT_SG); - } - - { - int argc2 = 1; - VALUE argv2[2], hash; - argv2[0] = str; - argv2[1] = opt; - if (!NIL_P(opt)) argc2++; - hash = date_s__rfc3339(argc2, argv2, klass); - return dt_new_by_frags(klass, hash, sg); - } -} - -/* - * call-seq: - * DateTime.xmlschema(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime - * - * Creates a new DateTime object by parsing from a string according to - * some typical XML Schema formats. - * - * DateTime.xmlschema('2001-02-03T04:05:06+07:00') - * #=> # - * - * Raise an ArgumentError when the string length is longer than _limit_. - * You can stop this check by passing limit: nil, but note - * that it may take a long time to parse. - */ -static VALUE -datetime_s_xmlschema(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, sg, opt; - - argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - - switch (argc) { - case 0: - str = rb_str_new2(JULIAN_EPOCH_DATETIME); - case 1: - sg = INT2FIX(DEFAULT_SG); - } - - { - int argc2 = 1; - VALUE argv2[2], hash; - argv2[0] = str; - argv2[1] = opt; - if (!NIL_P(opt)) argc2++; - hash = date_s__xmlschema(argc2, argv2, klass); - return dt_new_by_frags(klass, hash, sg); - } -} - -/* - * call-seq: - * DateTime.rfc2822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY], limit: 128) -> datetime - * DateTime.rfc822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY], limit: 128) -> datetime - * - * Creates a new DateTime object by parsing from a string according to - * some typical RFC 2822 formats. - * - * DateTime.rfc2822('Sat, 3 Feb 2001 04:05:06 +0700') - * #=> # - * - * Raise an ArgumentError when the string length is longer than _limit_. - * You can stop this check by passing limit: nil, but note - * that it may take a long time to parse. - */ -static VALUE -datetime_s_rfc2822(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, sg, opt; - - argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - - switch (argc) { - case 0: - str = rb_str_new2(JULIAN_EPOCH_DATETIME_RFC3339); - case 1: - sg = INT2FIX(DEFAULT_SG); - } - - { - int argc2 = 1; - VALUE argv2[2], hash; - argv2[0] = str; - argv2[1] = opt; - if (!NIL_P(opt)) argc2++; - hash = date_s__rfc2822(argc2, argv2, klass); - return dt_new_by_frags(klass, hash, sg); - } -} - -/* - * call-seq: - * DateTime.httpdate(string='Mon, 01 Jan -4712 00:00:00 GMT'[, start=Date::ITALY]) -> datetime - * - * Creates a new DateTime object by parsing from a string according to - * some RFC 2616 format. - * - * DateTime.httpdate('Sat, 03 Feb 2001 04:05:06 GMT') - * #=> # - * - * Raise an ArgumentError when the string length is longer than _limit_. - * You can stop this check by passing limit: nil, but note - * that it may take a long time to parse. - */ -static VALUE -datetime_s_httpdate(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, sg, opt; - - argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - - switch (argc) { - case 0: - str = rb_str_new2(JULIAN_EPOCH_DATETIME_HTTPDATE); - case 1: - sg = INT2FIX(DEFAULT_SG); - } - - { - int argc2 = 1; - VALUE argv2[2], hash; - argv2[0] = str; - argv2[1] = opt; - if (!NIL_P(opt)) argc2++; - hash = date_s__httpdate(argc2, argv2, klass); - return dt_new_by_frags(klass, hash, sg); - } -} - -/* - * call-seq: - * DateTime.jisx0301(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime - * - * Creates a new DateTime object by parsing from a string according to - * some typical JIS X 0301 formats. - * - * DateTime.jisx0301('H13.02.03T04:05:06+07:00') - * #=> # - * - * For no-era year, legacy format, Heisei is assumed. - * - * DateTime.jisx0301('13.02.03T04:05:06+07:00') - * #=> # - * - * Raise an ArgumentError when the string length is longer than _limit_. - * You can stop this check by passing limit: nil, but note - * that it may take a long time to parse. - */ -static VALUE -datetime_s_jisx0301(int argc, VALUE *argv, VALUE klass) -{ - VALUE str, sg, opt; - - argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - - switch (argc) { - case 0: - str = rb_str_new2(JULIAN_EPOCH_DATETIME); - case 1: - sg = INT2FIX(DEFAULT_SG); - } - - { - int argc2 = 1; - VALUE argv2[2], hash; - argv2[0] = str; - argv2[1] = opt; - if (!NIL_P(opt)) argc2++; - hash = date_s__jisx0301(argc2, argv2, klass); - return dt_new_by_frags(klass, hash, sg); - } -} - -/* - * call-seq: - * dt.to_s -> string - * - * Returns a string in an ISO 8601 format. (This method doesn't use the - * expanded representations.) - * - * DateTime.new(2001,2,3,4,5,6,'-7').to_s - * #=> "2001-02-03T04:05:06-07:00" - */ -static VALUE -dt_lite_to_s(VALUE self) -{ - return strftimev("%Y-%m-%dT%H:%M:%S%:z", self, set_tmx); -} - -/* - * call-seq: - * strftime(format = '%FT%T%:z') -> string - * - * Returns a string representation of +self+, - * formatted according the given +format: - * - * DateTime.now.strftime # => "2022-07-01T11:03:19-05:00" - * - * For other formats, - * see {Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html]: - * - */ -static VALUE -dt_lite_strftime(int argc, VALUE *argv, VALUE self) -{ - return date_strftime_internal(argc, argv, self, - "%Y-%m-%dT%H:%M:%S%:z", set_tmx); -} - -static VALUE -iso8601_timediv(VALUE self, long n) -{ - static const char timefmt[] = "T%H:%M:%S"; - static const char zone[] = "%:z"; - char fmt[sizeof(timefmt) + sizeof(zone) + rb_strlen_lit(".%N") + - DECIMAL_SIZE_OF_LONG]; - char *p = fmt; - - memcpy(p, timefmt, sizeof(timefmt)-1); - p += sizeof(timefmt)-1; - if (n > 0) p += snprintf(p, fmt+sizeof(fmt)-p, ".%%%ldN", n); - memcpy(p, zone, sizeof(zone)); - return strftimev(fmt, self, set_tmx); -} - -/* - * call-seq: - * dt.iso8601([n=0]) -> string - * dt.xmlschema([n=0]) -> string - * - * This method is equivalent to strftime('%FT%T%:z'). - * The optional argument +n+ is the number of digits for fractional seconds. - * - * DateTime.parse('2001-02-03T04:05:06.123456789+07:00').iso8601(9) - * #=> "2001-02-03T04:05:06.123456789+07:00" - */ -static VALUE -dt_lite_iso8601(int argc, VALUE *argv, VALUE self) -{ - long n = 0; - - rb_check_arity(argc, 0, 1); - if (argc >= 1) - n = NUM2LONG(argv[0]); - - return rb_str_append(strftimev("%Y-%m-%d", self, set_tmx), - iso8601_timediv(self, n)); -} - -/* - * call-seq: - * dt.rfc3339([n=0]) -> string - * - * This method is equivalent to strftime('%FT%T%:z'). - * The optional argument +n+ is the number of digits for fractional seconds. - * - * DateTime.parse('2001-02-03T04:05:06.123456789+07:00').rfc3339(9) - * #=> "2001-02-03T04:05:06.123456789+07:00" - */ -static VALUE -dt_lite_rfc3339(int argc, VALUE *argv, VALUE self) -{ - return dt_lite_iso8601(argc, argv, self); -} - -/* - * call-seq: - * dt.jisx0301([n=0]) -> string - * - * Returns a string in a JIS X 0301 format. - * The optional argument +n+ is the number of digits for fractional seconds. - * - * DateTime.parse('2001-02-03T04:05:06.123456789+07:00').jisx0301(9) - * #=> "H13.02.03T04:05:06.123456789+07:00" - */ -static VALUE -dt_lite_jisx0301(int argc, VALUE *argv, VALUE self) -{ - long n = 0; - - rb_check_arity(argc, 0, 1); - if (argc >= 1) - n = NUM2LONG(argv[0]); - - return rb_str_append(d_lite_jisx0301(self), - iso8601_timediv(self, n)); -} - -/* - * call-seq: - * deconstruct_keys(array_of_names_or_nil) -> hash - * - * Returns a hash of the name/value pairs, to use in pattern matching. - * Possible keys are: :year, :month, :day, - * :wday, :yday, :hour, :min, - * :sec, :sec_fraction, :zone. - * - * Possible usages: - * - * dt = DateTime.new(2022, 10, 5, 13, 30) - * - * if d in wday: 1..5, hour: 10..18 # uses deconstruct_keys underneath - * puts "Working time" - * end - * #=> prints "Working time" - * - * case dt - * in year: ...2022 - * puts "too old" - * in month: ..9 - * puts "quarter 1-3" - * in wday: 1..5, month: - * puts "working day in month #{month}" - * end - * #=> prints "working day in month 10" - * - * Note that deconstruction by pattern can also be combined with class check: - * - * if d in DateTime(wday: 1..5, hour: 10..18, day: ..7) - * puts "Working time, first week of the month" - * end - * - */ -static VALUE -dt_lite_deconstruct_keys(VALUE self, VALUE keys) -{ - return deconstruct_keys(self, keys, /* is_datetime=true */ 1); -} - -/* conversions */ - -#define f_subsec(x) rb_funcall(x, rb_intern("subsec"), 0) -#define f_utc_offset(x) rb_funcall(x, rb_intern("utc_offset"), 0) -#define f_local3(x,y,m,d) rb_funcall(x, rb_intern("local"), 3, y, m, d) - -/* - * call-seq: - * t.to_time -> time - * - * Returns self. - */ -static VALUE -time_to_time(VALUE self) -{ - return self; -} - -/* - * call-seq: - * t.to_date -> date - * - * Returns a Date object which denotes self. - */ -static VALUE -time_to_date(VALUE self) -{ - VALUE y, nth, ret; - int ry, m, d; - - y = f_year(self); - m = FIX2INT(f_mon(self)); - d = FIX2INT(f_mday(self)); - - decode_year(y, -1, &nth, &ry); - - ret = d_simple_new_internal(cDate, - nth, 0, - GREGORIAN, - ry, m, d, - HAVE_CIVIL); - { - get_d1(ret); - set_sg(dat, DEFAULT_SG); - } - return ret; -} - -/* - * call-seq: - * t.to_datetime -> datetime - * - * Returns a DateTime object which denotes self. - */ -static VALUE -time_to_datetime(VALUE self) -{ - VALUE y, sf, nth, ret; - int ry, m, d, h, min, s, of; - - y = f_year(self); - m = FIX2INT(f_mon(self)); - d = FIX2INT(f_mday(self)); - - h = FIX2INT(f_hour(self)); - min = FIX2INT(f_min(self)); - s = FIX2INT(f_sec(self)); - if (s == 60) - s = 59; - - sf = sec_to_ns(f_subsec(self)); - of = FIX2INT(f_utc_offset(self)); - - decode_year(y, -1, &nth, &ry); - - ret = d_complex_new_internal(cDateTime, - nth, 0, - 0, sf, - of, GREGORIAN, - ry, m, d, - h, min, s, - HAVE_CIVIL | HAVE_TIME); - { - get_d1(ret); - set_sg(dat, DEFAULT_SG); - } - return ret; -} - -/* - * call-seq: - * to_time -> time - * - * Returns a new Time object with the same value as +self+; - * if +self+ is a Julian date, derives its Gregorian date - * for conversion to the \Time object: - * - * Date.new(2001, 2, 3).to_time # => 2001-02-03 00:00:00 -0600 - * Date.new(2001, 2, 3, Date::JULIAN).to_time # => 2001-02-16 00:00:00 -0600 - * - */ -static VALUE -date_to_time(VALUE self) -{ - VALUE t; - - get_d1a(self); - - if (m_julian_p(adat)) { - VALUE g = d_lite_gregorian(self); - get_d1b(g); - adat = bdat; - self = g; - } - - t = f_local3(rb_cTime, - m_real_year(adat), - INT2FIX(m_mon(adat)), - INT2FIX(m_mday(adat))); - RB_GC_GUARD(self); /* may be the converted gregorian */ - return t; -} - -/* - * call-seq: - * to_date -> self - * - * Returns +self+. - */ -static VALUE -date_to_date(VALUE self) -{ - return self; -} - -/* - * call-seq: - * d.to_datetime -> datetime - * - * Returns a DateTime whose value is the same as +self+: - * - * Date.new(2001, 2, 3).to_datetime # => # - * - */ -static VALUE -date_to_datetime(VALUE self) -{ - get_d1a(self); - - if (simple_dat_p(adat)) { - VALUE new = d_lite_s_alloc_simple(cDateTime); - { - get_d1b(new); - bdat->s = adat->s; - return new; - } - } - else { - VALUE new = d_lite_s_alloc_complex(cDateTime); - { - get_d1b(new); - bdat->c = adat->c; - bdat->c.df = 0; - RB_OBJ_WRITE(new, &bdat->c.sf, INT2FIX(0)); -#ifndef USE_PACK - bdat->c.hour = 0; - bdat->c.min = 0; - bdat->c.sec = 0; -#else - bdat->c.pc = PACK5(EX_MON(adat->c.pc), EX_MDAY(adat->c.pc), - 0, 0, 0); - bdat->c.flags |= HAVE_DF | HAVE_TIME; -#endif - return new; - } - } -} - -/* - * call-seq: - * dt.to_time -> time - * - * Returns a Time object which denotes self. - */ -static VALUE -datetime_to_time(VALUE self) -{ - get_d1(self); - - if (m_julian_p(dat)) { - VALUE g = d_lite_gregorian(self); - get_d1a(g); - dat = adat; - self = g; - } - - { - VALUE t; - - t = rb_funcall(rb_cTime, - rb_intern("new"), - 7, - m_real_year(dat), - INT2FIX(m_mon(dat)), - INT2FIX(m_mday(dat)), - INT2FIX(m_hour(dat)), - INT2FIX(m_min(dat)), - f_add(INT2FIX(m_sec(dat)), - m_sf_in_sec(dat)), - INT2FIX(m_of(dat))); - RB_GC_GUARD(self); /* may be the converted gregorian */ - return t; - } -} - -/* - * call-seq: - * dt.to_date -> date - * - * Returns a Date object which denotes self. - */ -static VALUE -datetime_to_date(VALUE self) -{ - get_d1a(self); - - if (simple_dat_p(adat)) { - VALUE new = d_lite_s_alloc_simple(cDate); - { - get_d1b(new); - bdat->s = adat->s; - bdat->s.jd = m_local_jd(adat); - return new; - } - } - else { - VALUE new = d_lite_s_alloc_simple(cDate); - { - get_d1b(new); - copy_complex_to_simple(new, &bdat->s, &adat->c); - bdat->s.jd = m_local_jd(adat); - bdat->s.flags &= ~(HAVE_DF | HAVE_TIME | COMPLEX_DAT); - return new; - } - } -} - -/* - * call-seq: - * dt.to_datetime -> self - * - * Returns self. - */ -static VALUE -datetime_to_datetime(VALUE self) -{ - return self; -} - -#ifndef NDEBUG -/* tests */ - -#define MIN_YEAR -4713 -#define MAX_YEAR 1000000 -#define MIN_JD -327 -#define MAX_JD 366963925 - -/* :nodoc: */ -static int -test_civil(int from, int to, double sg) -{ - int j; - - fprintf(stderr, "test_civil: %d...%d (%d) - %.0f\n", - from, to, to - from, sg); - for (j = from; j <= to; j++) { - int y, m, d, rj, ns; - - c_jd_to_civil(j, sg, &y, &m, &d); - c_civil_to_jd(y, m, d, sg, &rj, &ns); - if (j != rj) { - fprintf(stderr, "%d != %d\n", j, rj); - return 0; - } - } - return 1; -} - -/* :nodoc: */ -static VALUE -date_s_test_civil(VALUE klass) -{ - if (!test_civil(MIN_JD, MIN_JD + 366, GREGORIAN)) - return Qfalse; - if (!test_civil(2305814, 2598007, GREGORIAN)) - return Qfalse; - if (!test_civil(MAX_JD - 366, MAX_JD, GREGORIAN)) - return Qfalse; - - if (!test_civil(MIN_JD, MIN_JD + 366, ITALY)) - return Qfalse; - if (!test_civil(2305814, 2598007, ITALY)) - return Qfalse; - if (!test_civil(MAX_JD - 366, MAX_JD, ITALY)) - return Qfalse; - - return Qtrue; -} - -/* :nodoc: */ -static int -test_ordinal(int from, int to, double sg) -{ - int j; - - fprintf(stderr, "test_ordinal: %d...%d (%d) - %.0f\n", - from, to, to - from, sg); - for (j = from; j <= to; j++) { - int y, d, rj, ns; - - c_jd_to_ordinal(j, sg, &y, &d); - c_ordinal_to_jd(y, d, sg, &rj, &ns); - if (j != rj) { - fprintf(stderr, "%d != %d\n", j, rj); - return 0; - } - } - return 1; -} - -/* :nodoc: */ -static VALUE -date_s_test_ordinal(VALUE klass) -{ - if (!test_ordinal(MIN_JD, MIN_JD + 366, GREGORIAN)) - return Qfalse; - if (!test_ordinal(2305814, 2598007, GREGORIAN)) - return Qfalse; - if (!test_ordinal(MAX_JD - 366, MAX_JD, GREGORIAN)) - return Qfalse; - - if (!test_ordinal(MIN_JD, MIN_JD + 366, ITALY)) - return Qfalse; - if (!test_ordinal(2305814, 2598007, ITALY)) - return Qfalse; - if (!test_ordinal(MAX_JD - 366, MAX_JD, ITALY)) - return Qfalse; - - return Qtrue; -} - -/* :nodoc: */ -static int -test_commercial(int from, int to, double sg) -{ - int j; - - fprintf(stderr, "test_commercial: %d...%d (%d) - %.0f\n", - from, to, to - from, sg); - for (j = from; j <= to; j++) { - int y, w, d, rj, ns; - - c_jd_to_commercial(j, sg, &y, &w, &d); - c_commercial_to_jd(y, w, d, sg, &rj, &ns); - if (j != rj) { - fprintf(stderr, "%d != %d\n", j, rj); - return 0; - } - } - return 1; -} - -/* :nodoc: */ -static VALUE -date_s_test_commercial(VALUE klass) -{ - if (!test_commercial(MIN_JD, MIN_JD + 366, GREGORIAN)) - return Qfalse; - if (!test_commercial(2305814, 2598007, GREGORIAN)) - return Qfalse; - if (!test_commercial(MAX_JD - 366, MAX_JD, GREGORIAN)) - return Qfalse; - - if (!test_commercial(MIN_JD, MIN_JD + 366, ITALY)) - return Qfalse; - if (!test_commercial(2305814, 2598007, ITALY)) - return Qfalse; - if (!test_commercial(MAX_JD - 366, MAX_JD, ITALY)) - return Qfalse; - - return Qtrue; -} - -/* :nodoc: */ -static int -test_weeknum(int from, int to, int f, double sg) -{ - int j; - - fprintf(stderr, "test_weeknum: %d...%d (%d) - %.0f\n", - from, to, to - from, sg); - for (j = from; j <= to; j++) { - int y, w, d, rj, ns; - - c_jd_to_weeknum(j, f, sg, &y, &w, &d); - c_weeknum_to_jd(y, w, d, f, sg, &rj, &ns); - if (j != rj) { - fprintf(stderr, "%d != %d\n", j, rj); - return 0; - } - } - return 1; -} - -/* :nodoc: */ -static VALUE -date_s_test_weeknum(VALUE klass) -{ - int f; - - for (f = 0; f <= 1; f++) { - if (!test_weeknum(MIN_JD, MIN_JD + 366, f, GREGORIAN)) - return Qfalse; - if (!test_weeknum(2305814, 2598007, f, GREGORIAN)) - return Qfalse; - if (!test_weeknum(MAX_JD - 366, MAX_JD, f, GREGORIAN)) - return Qfalse; - - if (!test_weeknum(MIN_JD, MIN_JD + 366, f, ITALY)) - return Qfalse; - if (!test_weeknum(2305814, 2598007, f, ITALY)) - return Qfalse; - if (!test_weeknum(MAX_JD - 366, MAX_JD, f, ITALY)) - return Qfalse; - } - - return Qtrue; -} - -/* :nodoc: */ -static int -test_nth_kday(int from, int to, double sg) -{ - int j; - - fprintf(stderr, "test_nth_kday: %d...%d (%d) - %.0f\n", - from, to, to - from, sg); - for (j = from; j <= to; j++) { - int y, m, n, k, rj, ns; - - c_jd_to_nth_kday(j, sg, &y, &m, &n, &k); - c_nth_kday_to_jd(y, m, n, k, sg, &rj, &ns); - if (j != rj) { - fprintf(stderr, "%d != %d\n", j, rj); - return 0; - } - } - return 1; -} - -/* :nodoc: */ -static VALUE -date_s_test_nth_kday(VALUE klass) -{ - if (!test_nth_kday(MIN_JD, MIN_JD + 366, GREGORIAN)) - return Qfalse; - if (!test_nth_kday(2305814, 2598007, GREGORIAN)) - return Qfalse; - if (!test_nth_kday(MAX_JD - 366, MAX_JD, GREGORIAN)) - return Qfalse; - - if (!test_nth_kday(MIN_JD, MIN_JD + 366, ITALY)) - return Qfalse; - if (!test_nth_kday(2305814, 2598007, ITALY)) - return Qfalse; - if (!test_nth_kday(MAX_JD - 366, MAX_JD, ITALY)) - return Qfalse; - - return Qtrue; -} - -/* :nodoc: */ -static int -test_unit_v2v(VALUE i, - VALUE (* conv1)(VALUE), - VALUE (* conv2)(VALUE)) -{ - VALUE c, o; - c = (*conv1)(i); - o = (*conv2)(c); - return f_eqeq_p(o, i); -} - -/* :nodoc: */ -static int -test_unit_v2v_iter2(VALUE (* conv1)(VALUE), - VALUE (* conv2)(VALUE)) -{ - if (!test_unit_v2v(INT2FIX(0), conv1, conv2)) - return 0; - if (!test_unit_v2v(INT2FIX(1), conv1, conv2)) - return 0; - if (!test_unit_v2v(INT2FIX(2), conv1, conv2)) - return 0; - if (!test_unit_v2v(INT2FIX(3), conv1, conv2)) - return 0; - if (!test_unit_v2v(INT2FIX(11), conv1, conv2)) - return 0; - if (!test_unit_v2v(INT2FIX(65535), conv1, conv2)) - return 0; - if (!test_unit_v2v(INT2FIX(1073741823), conv1, conv2)) - return 0; - if (!test_unit_v2v(INT2NUM(1073741824), conv1, conv2)) - return 0; - if (!test_unit_v2v(rb_rational_new2(INT2FIX(0), INT2FIX(1)), conv1, conv2)) - return 0; - if (!test_unit_v2v(rb_rational_new2(INT2FIX(1), INT2FIX(1)), conv1, conv2)) - return 0; - if (!test_unit_v2v(rb_rational_new2(INT2FIX(1), INT2FIX(2)), conv1, conv2)) - return 0; - if (!test_unit_v2v(rb_rational_new2(INT2FIX(2), INT2FIX(3)), conv1, conv2)) - return 0; - return 1; -} - -/* :nodoc: */ -static int -test_unit_v2v_iter(VALUE (* conv1)(VALUE), - VALUE (* conv2)(VALUE)) -{ - if (!test_unit_v2v_iter2(conv1, conv2)) - return 0; - if (!test_unit_v2v_iter2(conv2, conv1)) - return 0; - return 1; -} - -/* :nodoc: */ -static VALUE -date_s_test_unit_conv(VALUE klass) -{ - if (!test_unit_v2v_iter(sec_to_day, day_to_sec)) - return Qfalse; - if (!test_unit_v2v_iter(ms_to_sec, sec_to_ms)) - return Qfalse; - if (!test_unit_v2v_iter(ns_to_day, day_to_ns)) - return Qfalse; - if (!test_unit_v2v_iter(ns_to_sec, sec_to_ns)) - return Qfalse; - return Qtrue; -} - -/* :nodoc: */ -static VALUE -date_s_test_all(VALUE klass) -{ - if (date_s_test_civil(klass) == Qfalse) - return Qfalse; - if (date_s_test_ordinal(klass) == Qfalse) - return Qfalse; - if (date_s_test_commercial(klass) == Qfalse) - return Qfalse; - if (date_s_test_weeknum(klass) == Qfalse) - return Qfalse; - if (date_s_test_nth_kday(klass) == Qfalse) - return Qfalse; - if (date_s_test_unit_conv(klass) == Qfalse) - return Qfalse; - return Qtrue; -} -#endif - -static const char *monthnames[] = { - NULL, - "January", "February", "March", - "April", "May", "June", - "July", "August", "September", - "October", "November", "December" -}; - -static const char *abbr_monthnames[] = { - NULL, - "Jan", "Feb", "Mar", "Apr", - "May", "Jun", "Jul", "Aug", - "Sep", "Oct", "Nov", "Dec" -}; - -static const char *daynames[] = { - "Sunday", "Monday", "Tuesday", "Wednesday", - "Thursday", "Friday", "Saturday" -}; - -static const char *abbr_daynames[] = { - "Sun", "Mon", "Tue", "Wed", - "Thu", "Fri", "Sat" -}; - -static VALUE -mk_ary_of_str(long len, const char *a[]) -{ - VALUE o; - long i; - - o = rb_ary_new2(len); - for (i = 0; i < len; i++) { - VALUE e; - - if (!a[i]) - e = Qnil; - else { - e = rb_usascii_str_new2(a[i]); - rb_obj_freeze(e); - } - rb_ary_push(o, e); - } - rb_ary_freeze(o); - return o; -} - -/* :nodoc: */ -static VALUE -d_lite_zero(VALUE x) -{ - return INT2FIX(0); -} - -void -Init_date_core(void) -{ - #ifdef HAVE_RB_EXT_RACTOR_SAFE - RB_EXT_RACTOR_SAFE(true); - #endif - id_cmp = rb_intern_const("<=>"); - id_le_p = rb_intern_const("<="); - id_ge_p = rb_intern_const(">="); - id_eqeq_p = rb_intern_const("=="); - - sym_year = ID2SYM(rb_intern_const("year")); - sym_month = ID2SYM(rb_intern_const("month")); - sym_yday = ID2SYM(rb_intern_const("yday")); - sym_wday = ID2SYM(rb_intern_const("wday")); - sym_day = ID2SYM(rb_intern_const("day")); - sym_hour = ID2SYM(rb_intern_const("hour")); - sym_min = ID2SYM(rb_intern_const("min")); - sym_sec = ID2SYM(rb_intern_const("sec")); - sym_sec_fraction = ID2SYM(rb_intern_const("sec_fraction")); - sym_zone = ID2SYM(rb_intern_const("zone")); - - half_days_in_day = rb_rational_new2(INT2FIX(1), INT2FIX(2)); - -#if (LONG_MAX / DAY_IN_SECONDS) > SECOND_IN_NANOSECONDS - day_in_nanoseconds = LONG2NUM((long)DAY_IN_SECONDS * - SECOND_IN_NANOSECONDS); -#elif defined HAVE_LONG_LONG - day_in_nanoseconds = LL2NUM((LONG_LONG)DAY_IN_SECONDS * - SECOND_IN_NANOSECONDS); -#else - day_in_nanoseconds = f_mul(INT2FIX(DAY_IN_SECONDS), - INT2FIX(SECOND_IN_NANOSECONDS)); -#endif - - rb_gc_register_mark_object(half_days_in_day); - rb_gc_register_mark_object(day_in_nanoseconds); - - positive_inf = +INFINITY; - negative_inf = -INFINITY; - - /* - * \Class \Date provides methods for storing and manipulating - * calendar dates. - * - * Consider using - * {class Time}[https://docs.ruby-lang.org/en/master/Time.html] - * instead of class \Date if: - * - * - You need both dates and times; \Date handles only dates. - * - You need only Gregorian dates (and not Julian dates); - * see {Julian and Gregorian Calendars}[rdoc-ref:calendars.rdoc]. - * - * A \Date object, once created, is immutable, and cannot be modified. - * - * == Creating a \Date - * - * You can create a date for the current date, using Date.today: - * - * Date.today # => # - * - * You can create a specific date from various combinations of arguments: - * - * - Date.new takes integer year, month, and day-of-month: - * - * Date.new(1999, 12, 31) # => # - * - * - Date.ordinal takes integer year and day-of-year: - * - * Date.ordinal(1999, 365) # => # - * - * - Date.jd takes integer Julian day: - * - * Date.jd(2451544) # => # - * - * - Date.commercial takes integer commercial data (year, week, day-of-week): - * - * Date.commercial(1999, 52, 5) # => # - * - * - Date.parse takes a string, which it parses heuristically: - * - * Date.parse('1999-12-31') # => # - * Date.parse('31-12-1999') # => # - * Date.parse('1999-365') # => # - * Date.parse('1999-W52-5') # => # - * - * - Date.strptime takes a date string and a format string, - * then parses the date string according to the format string: - * - * Date.strptime('1999-12-31', '%Y-%m-%d') # => # - * Date.strptime('31-12-1999', '%d-%m-%Y') # => # - * Date.strptime('1999-365', '%Y-%j') # => # - * Date.strptime('1999-W52-5', '%G-W%V-%u') # => # - * Date.strptime('1999 52 5', '%Y %U %w') # => # - * Date.strptime('1999 52 5', '%Y %W %u') # => # - * Date.strptime('fri31dec99', '%a%d%b%y') # => # - * - * See also the specialized methods in - * {"Specialized Format Strings" in Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-Specialized+Format+Strings] - * - * == Argument +limit+ - * - * Certain singleton methods in \Date that parse string arguments - * also take optional keyword argument +limit+, - * which can limit the length of the string argument. - * - * When +limit+ is: - * - * - Non-negative: - * raises ArgumentError if the string length is greater than _limit_. - * - Other numeric or +nil+: ignores +limit+. - * - Other non-numeric: raises TypeError. - * - */ - cDate = rb_define_class("Date", rb_cObject); - - /* Exception for invalid date/time */ - eDateError = rb_define_class_under(cDate, "Error", rb_eArgError); - - rb_include_module(cDate, rb_mComparable); - - /* An array of strings of full month names in English. The first - * element is nil. - */ - rb_define_const(cDate, "MONTHNAMES", mk_ary_of_str(13, monthnames)); - - /* An array of strings of abbreviated month names in English. The - * first element is nil. - */ - rb_define_const(cDate, "ABBR_MONTHNAMES", - mk_ary_of_str(13, abbr_monthnames)); - - /* An array of strings of the full names of days of the week in English. - * The first is "Sunday". - */ - rb_define_const(cDate, "DAYNAMES", mk_ary_of_str(7, daynames)); - - /* An array of strings of abbreviated day names in English. The - * first is "Sun". - */ - rb_define_const(cDate, "ABBR_DAYNAMES", mk_ary_of_str(7, abbr_daynames)); - - /* The Julian day number of the day of calendar reform for Italy - * and some catholic countries. - */ - rb_define_const(cDate, "ITALY", INT2FIX(ITALY)); - - /* The Julian day number of the day of calendar reform for England - * and her colonies. - */ - rb_define_const(cDate, "ENGLAND", INT2FIX(ENGLAND)); - - /* The Julian day number of the day of calendar reform for the - * proleptic Julian calendar. - */ - rb_define_const(cDate, "JULIAN", DBL2NUM(JULIAN)); - - /* The Julian day number of the day of calendar reform for the - * proleptic Gregorian calendar. - */ - rb_define_const(cDate, "GREGORIAN", DBL2NUM(GREGORIAN)); - - rb_define_alloc_func(cDate, d_lite_s_alloc_simple); - -#ifndef NDEBUG - rb_define_private_method(CLASS_OF(cDate), "_valid_jd?", - date_s__valid_jd_p, -1); - rb_define_private_method(CLASS_OF(cDate), "_valid_ordinal?", - date_s__valid_ordinal_p, -1); - rb_define_private_method(CLASS_OF(cDate), "_valid_civil?", - date_s__valid_civil_p, -1); - rb_define_private_method(CLASS_OF(cDate), "_valid_date?", - date_s__valid_civil_p, -1); - rb_define_private_method(CLASS_OF(cDate), "_valid_commercial?", - date_s__valid_commercial_p, -1); - rb_define_private_method(CLASS_OF(cDate), "_valid_weeknum?", - date_s__valid_weeknum_p, -1); - rb_define_private_method(CLASS_OF(cDate), "_valid_nth_kday?", - date_s__valid_nth_kday_p, -1); -#endif - - rb_define_singleton_method(cDate, "valid_jd?", date_s_valid_jd_p, -1); - rb_define_singleton_method(cDate, "valid_ordinal?", - date_s_valid_ordinal_p, -1); - rb_define_singleton_method(cDate, "valid_civil?", date_s_valid_civil_p, -1); - rb_define_singleton_method(cDate, "valid_date?", date_s_valid_civil_p, -1); - rb_define_singleton_method(cDate, "valid_commercial?", - date_s_valid_commercial_p, -1); - -#ifndef NDEBUG - rb_define_private_method(CLASS_OF(cDate), "valid_weeknum?", - date_s_valid_weeknum_p, -1); - rb_define_private_method(CLASS_OF(cDate), "valid_nth_kday?", - date_s_valid_nth_kday_p, -1); - rb_define_private_method(CLASS_OF(cDate), "zone_to_diff", - date_s_zone_to_diff, 1); -#endif - - rb_define_singleton_method(cDate, "julian_leap?", date_s_julian_leap_p, 1); - rb_define_singleton_method(cDate, "gregorian_leap?", - date_s_gregorian_leap_p, 1); - rb_define_singleton_method(cDate, "leap?", - date_s_gregorian_leap_p, 1); - -#ifndef NDEBUG - rb_define_singleton_method(cDate, "new!", date_s_new_bang, -1); - rb_define_alias(rb_singleton_class(cDate), "new_l!", "new"); -#endif - - rb_define_singleton_method(cDate, "jd", date_s_jd, -1); - rb_define_singleton_method(cDate, "ordinal", date_s_ordinal, -1); - rb_define_singleton_method(cDate, "civil", date_s_civil, -1); - rb_define_singleton_method(cDate, "commercial", date_s_commercial, -1); - -#ifndef NDEBUG - rb_define_singleton_method(cDate, "weeknum", date_s_weeknum, -1); - rb_define_singleton_method(cDate, "nth_kday", date_s_nth_kday, -1); -#endif - - rb_define_singleton_method(cDate, "today", date_s_today, -1); - rb_define_singleton_method(cDate, "_strptime", date_s__strptime, -1); - rb_define_singleton_method(cDate, "strptime", date_s_strptime, -1); - rb_define_singleton_method(cDate, "_parse", date_s__parse, -1); - rb_define_singleton_method(cDate, "parse", date_s_parse, -1); - rb_define_singleton_method(cDate, "_iso8601", date_s__iso8601, -1); - rb_define_singleton_method(cDate, "iso8601", date_s_iso8601, -1); - rb_define_singleton_method(cDate, "_rfc3339", date_s__rfc3339, -1); - rb_define_singleton_method(cDate, "rfc3339", date_s_rfc3339, -1); - rb_define_singleton_method(cDate, "_xmlschema", date_s__xmlschema, -1); - rb_define_singleton_method(cDate, "xmlschema", date_s_xmlschema, -1); - rb_define_singleton_method(cDate, "_rfc2822", date_s__rfc2822, -1); - rb_define_singleton_method(cDate, "_rfc822", date_s__rfc2822, -1); - rb_define_singleton_method(cDate, "rfc2822", date_s_rfc2822, -1); - rb_define_singleton_method(cDate, "rfc822", date_s_rfc2822, -1); - rb_define_singleton_method(cDate, "_httpdate", date_s__httpdate, -1); - rb_define_singleton_method(cDate, "httpdate", date_s_httpdate, -1); - rb_define_singleton_method(cDate, "_jisx0301", date_s__jisx0301, -1); - rb_define_singleton_method(cDate, "jisx0301", date_s_jisx0301, -1); - - rb_define_method(cDate, "initialize", date_initialize, -1); - rb_define_method(cDate, "initialize_copy", d_lite_initialize_copy, 1); - -#ifndef NDEBUG - rb_define_method(cDate, "fill", d_lite_fill, 0); -#endif - - rb_define_method(cDate, "ajd", d_lite_ajd, 0); - rb_define_method(cDate, "amjd", d_lite_amjd, 0); - rb_define_method(cDate, "jd", d_lite_jd, 0); - rb_define_method(cDate, "mjd", d_lite_mjd, 0); - rb_define_method(cDate, "ld", d_lite_ld, 0); - - rb_define_method(cDate, "year", d_lite_year, 0); - rb_define_method(cDate, "yday", d_lite_yday, 0); - rb_define_method(cDate, "mon", d_lite_mon, 0); - rb_define_method(cDate, "month", d_lite_mon, 0); - rb_define_method(cDate, "mday", d_lite_mday, 0); - rb_define_method(cDate, "day", d_lite_mday, 0); - rb_define_method(cDate, "day_fraction", d_lite_day_fraction, 0); - - rb_define_method(cDate, "cwyear", d_lite_cwyear, 0); - rb_define_method(cDate, "cweek", d_lite_cweek, 0); - rb_define_method(cDate, "cwday", d_lite_cwday, 0); - -#ifndef NDEBUG - rb_define_private_method(cDate, "wnum0", d_lite_wnum0, 0); - rb_define_private_method(cDate, "wnum1", d_lite_wnum1, 0); -#endif - - rb_define_method(cDate, "wday", d_lite_wday, 0); - - rb_define_method(cDate, "sunday?", d_lite_sunday_p, 0); - rb_define_method(cDate, "monday?", d_lite_monday_p, 0); - rb_define_method(cDate, "tuesday?", d_lite_tuesday_p, 0); - rb_define_method(cDate, "wednesday?", d_lite_wednesday_p, 0); - rb_define_method(cDate, "thursday?", d_lite_thursday_p, 0); - rb_define_method(cDate, "friday?", d_lite_friday_p, 0); - rb_define_method(cDate, "saturday?", d_lite_saturday_p, 0); - -#ifndef NDEBUG - rb_define_method(cDate, "nth_kday?", d_lite_nth_kday_p, 2); -#endif - - rb_define_private_method(cDate, "hour", d_lite_zero, 0); - rb_define_private_method(cDate, "min", d_lite_zero, 0); - rb_define_private_method(cDate, "minute", d_lite_zero, 0); - rb_define_private_method(cDate, "sec", d_lite_zero, 0); - rb_define_private_method(cDate, "second", d_lite_zero, 0); - - rb_define_method(cDate, "julian?", d_lite_julian_p, 0); - rb_define_method(cDate, "gregorian?", d_lite_gregorian_p, 0); - rb_define_method(cDate, "leap?", d_lite_leap_p, 0); - - rb_define_method(cDate, "start", d_lite_start, 0); - rb_define_method(cDate, "new_start", d_lite_new_start, -1); - rb_define_method(cDate, "italy", d_lite_italy, 0); - rb_define_method(cDate, "england", d_lite_england, 0); - rb_define_method(cDate, "julian", d_lite_julian, 0); - rb_define_method(cDate, "gregorian", d_lite_gregorian, 0); - - rb_define_method(cDate, "+", d_lite_plus, 1); - rb_define_method(cDate, "-", d_lite_minus, 1); - - rb_define_method(cDate, "next_day", d_lite_next_day, -1); - rb_define_method(cDate, "prev_day", d_lite_prev_day, -1); - rb_define_method(cDate, "next", d_lite_next, 0); - rb_define_method(cDate, "succ", d_lite_next, 0); - - rb_define_method(cDate, ">>", d_lite_rshift, 1); - rb_define_method(cDate, "<<", d_lite_lshift, 1); - - rb_define_method(cDate, "next_month", d_lite_next_month, -1); - rb_define_method(cDate, "prev_month", d_lite_prev_month, -1); - rb_define_method(cDate, "next_year", d_lite_next_year, -1); - rb_define_method(cDate, "prev_year", d_lite_prev_year, -1); - - rb_define_method(cDate, "step", d_lite_step, -1); - rb_define_method(cDate, "upto", d_lite_upto, 1); - rb_define_method(cDate, "downto", d_lite_downto, 1); - - rb_define_method(cDate, "<=>", d_lite_cmp, 1); - rb_define_method(cDate, "===", d_lite_equal, 1); - rb_define_method(cDate, "eql?", d_lite_eql_p, 1); - rb_define_method(cDate, "hash", d_lite_hash, 0); - - rb_define_method(cDate, "to_s", d_lite_to_s, 0); -#ifndef NDEBUG - rb_define_method(cDate, "inspect_raw", d_lite_inspect_raw, 0); -#endif - rb_define_method(cDate, "inspect", d_lite_inspect, 0); - - rb_define_method(cDate, "strftime", d_lite_strftime, -1); - - rb_define_method(cDate, "asctime", d_lite_asctime, 0); - rb_define_method(cDate, "ctime", d_lite_asctime, 0); - rb_define_method(cDate, "iso8601", d_lite_iso8601, 0); - rb_define_method(cDate, "xmlschema", d_lite_iso8601, 0); - rb_define_method(cDate, "rfc3339", d_lite_rfc3339, 0); - rb_define_method(cDate, "rfc2822", d_lite_rfc2822, 0); - rb_define_method(cDate, "rfc822", d_lite_rfc2822, 0); - rb_define_method(cDate, "httpdate", d_lite_httpdate, 0); - rb_define_method(cDate, "jisx0301", d_lite_jisx0301, 0); - - rb_define_method(cDate, "deconstruct_keys", d_lite_deconstruct_keys, 1); - -#ifndef NDEBUG - rb_define_method(cDate, "marshal_dump_old", d_lite_marshal_dump_old, 0); -#endif - rb_define_method(cDate, "marshal_dump", d_lite_marshal_dump, 0); - rb_define_method(cDate, "marshal_load", d_lite_marshal_load, 1); - rb_define_singleton_method(cDate, "_load", date_s__load, 1); - - /* - * == DateTime - * - * A subclass of Date that easily handles date, hour, minute, second, - * and offset. - * - * DateTime class is considered deprecated. Use Time class. - * - * DateTime does not consider any leap seconds, does not track - * any summer time rules. - * - * A DateTime object is created with DateTime::new, DateTime::jd, - * DateTime::ordinal, DateTime::commercial, DateTime::parse, - * DateTime::strptime, DateTime::now, Time#to_datetime, etc. - * - * require 'date' - * - * DateTime.new(2001,2,3,4,5,6) - * #=> # - * - * The last element of day, hour, minute, or second can be a - * fractional number. The fractional number's precision is assumed - * at most nanosecond. - * - * DateTime.new(2001,2,3.5) - * #=> # - * - * An optional argument, the offset, indicates the difference - * between the local time and UTC. For example, Rational(3,24) - * represents ahead of 3 hours of UTC, Rational(-5,24) represents - * behind of 5 hours of UTC. The offset should be -1 to +1, and - * its precision is assumed at most second. The default value is - * zero (equals to UTC). - * - * DateTime.new(2001,2,3,4,5,6,Rational(3,24)) - * #=> # - * - * The offset also accepts string form: - * - * DateTime.new(2001,2,3,4,5,6,'+03:00') - * #=> # - * - * An optional argument, the day of calendar reform (+start+), denotes - * a Julian day number, which should be 2298874 to 2426355 or - * negative/positive infinity. - * The default value is +Date::ITALY+ (2299161=1582-10-15). - * - * A DateTime object has various methods. See each reference. - * - * d = DateTime.parse('3rd Feb 2001 04:05:06+03:30') - * #=> # - * d.hour #=> 4 - * d.min #=> 5 - * d.sec #=> 6 - * d.offset #=> (7/48) - * d.zone #=> "+03:30" - * d += Rational('1.5') - * #=> # - * d = d.new_offset('+09:00') - * #=> # - * d.strftime('%I:%M:%S %p') - * #=> "09:35:06 PM" - * d > DateTime.new(1999) - * #=> true - * - * === When should you use DateTime and when should you use Time? - * - * It's a common misconception that - * {William Shakespeare}[https://en.wikipedia.org/wiki/William_Shakespeare] - * and - * {Miguel de Cervantes}[https://en.wikipedia.org/wiki/Miguel_de_Cervantes] - * died on the same day in history - - * so much so that UNESCO named April 23 as - * {World Book Day because of this fact}[https://en.wikipedia.org/wiki/World_Book_Day]. - * However, because England hadn't yet adopted the - * {Gregorian Calendar Reform}[https://en.wikipedia.org/wiki/Gregorian_calendar#Gregorian_reform] - * (and wouldn't until {1752}[https://en.wikipedia.org/wiki/Calendar_(New_Style)_Act_1750]) - * their deaths are actually 10 days apart. - * Since Ruby's Time class implements a - * {proleptic Gregorian calendar}[https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar] - * and has no concept of calendar reform there's no way - * to express this with Time objects. This is where DateTime steps in: - * - * shakespeare = DateTime.iso8601('1616-04-23', Date::ENGLAND) - * #=> Tue, 23 Apr 1616 00:00:00 +0000 - * cervantes = DateTime.iso8601('1616-04-23', Date::ITALY) - * #=> Sat, 23 Apr 1616 00:00:00 +0000 - * - * Already you can see something is weird - the days of the week - * are different. Taking this further: - * - * cervantes == shakespeare - * #=> false - * (shakespeare - cervantes).to_i - * #=> 10 - * - * This shows that in fact they died 10 days apart (in reality - * 11 days since Cervantes died a day earlier but was buried on - * the 23rd). We can see the actual date of Shakespeare's death by - * using the #gregorian method to convert it: - * - * shakespeare.gregorian - * #=> Tue, 03 May 1616 00:00:00 +0000 - * - * So there's an argument that all the celebrations that take - * place on the 23rd April in Stratford-upon-Avon are actually - * the wrong date since England is now using the Gregorian calendar. - * You can see why when we transition across the reform - * date boundary: - * - * # start off with the anniversary of Shakespeare's birth in 1751 - * shakespeare = DateTime.iso8601('1751-04-23', Date::ENGLAND) - * #=> Tue, 23 Apr 1751 00:00:00 +0000 - * - * # add 366 days since 1752 is a leap year and April 23 is after February 29 - * shakespeare + 366 - * #=> Thu, 23 Apr 1752 00:00:00 +0000 - * - * # add another 365 days to take us to the anniversary in 1753 - * shakespeare + 366 + 365 - * #=> Fri, 04 May 1753 00:00:00 +0000 - * - * As you can see, if we're accurately tracking the number of - * {solar years}[https://en.wikipedia.org/wiki/Tropical_year] - * since Shakespeare's birthday then the correct anniversary date - * would be the 4th May and not the 23rd April. - * - * So when should you use DateTime in Ruby and when should - * you use Time? Almost certainly you'll want to use Time - * since your app is probably dealing with current dates and - * times. However, if you need to deal with dates and times in a - * historical context you'll want to use DateTime to avoid - * making the same mistakes as UNESCO. If you also have to deal - * with timezones then best of luck - just bear in mind that - * you'll probably be dealing with - * {local solar times}[https://en.wikipedia.org/wiki/Solar_time], - * since it wasn't until the 19th century that the introduction - * of the railways necessitated the need for - * {Standard Time}[https://en.wikipedia.org/wiki/Standard_time#Great_Britain] - * and eventually timezones. - */ - - cDateTime = rb_define_class("DateTime", cDate); - rb_define_alloc_func(cDateTime, d_lite_s_alloc_complex); - - rb_define_singleton_method(cDateTime, "jd", datetime_s_jd, -1); - rb_define_singleton_method(cDateTime, "ordinal", datetime_s_ordinal, -1); - rb_define_singleton_method(cDateTime, "civil", datetime_s_civil, -1); - rb_define_singleton_method(cDateTime, "new", datetime_s_civil, -1); - rb_define_singleton_method(cDateTime, "commercial", - datetime_s_commercial, -1); - -#ifndef NDEBUG - rb_define_singleton_method(cDateTime, "weeknum", - datetime_s_weeknum, -1); - rb_define_singleton_method(cDateTime, "nth_kday", - datetime_s_nth_kday, -1); -#endif - - rb_undef_method(CLASS_OF(cDateTime), "today"); - - rb_define_singleton_method(cDateTime, "now", datetime_s_now, -1); - rb_define_singleton_method(cDateTime, "_strptime", - datetime_s__strptime, -1); - rb_define_singleton_method(cDateTime, "strptime", - datetime_s_strptime, -1); - rb_define_singleton_method(cDateTime, "parse", - datetime_s_parse, -1); - rb_define_singleton_method(cDateTime, "iso8601", - datetime_s_iso8601, -1); - rb_define_singleton_method(cDateTime, "rfc3339", - datetime_s_rfc3339, -1); - rb_define_singleton_method(cDateTime, "xmlschema", - datetime_s_xmlschema, -1); - rb_define_singleton_method(cDateTime, "rfc2822", - datetime_s_rfc2822, -1); - rb_define_singleton_method(cDateTime, "rfc822", - datetime_s_rfc2822, -1); - rb_define_singleton_method(cDateTime, "httpdate", - datetime_s_httpdate, -1); - rb_define_singleton_method(cDateTime, "jisx0301", - datetime_s_jisx0301, -1); - - rb_define_method(cDateTime, "hour", d_lite_hour, 0); - rb_define_method(cDateTime, "min", d_lite_min, 0); - rb_define_method(cDateTime, "minute", d_lite_min, 0); - rb_define_method(cDateTime, "sec", d_lite_sec, 0); - rb_define_method(cDateTime, "second", d_lite_sec, 0); - rb_define_method(cDateTime, "sec_fraction", d_lite_sec_fraction, 0); - rb_define_method(cDateTime, "second_fraction", d_lite_sec_fraction, 0); - rb_define_method(cDateTime, "offset", d_lite_offset, 0); - rb_define_method(cDateTime, "zone", d_lite_zone, 0); - rb_define_method(cDateTime, "new_offset", d_lite_new_offset, -1); - - rb_define_method(cDateTime, "to_s", dt_lite_to_s, 0); - - rb_define_method(cDateTime, "strftime", dt_lite_strftime, -1); - - rb_define_method(cDateTime, "iso8601", dt_lite_iso8601, -1); - rb_define_method(cDateTime, "xmlschema", dt_lite_iso8601, -1); - rb_define_method(cDateTime, "rfc3339", dt_lite_rfc3339, -1); - rb_define_method(cDateTime, "jisx0301", dt_lite_jisx0301, -1); - - rb_define_method(cDateTime, "deconstruct_keys", dt_lite_deconstruct_keys, 1); - - /* conversions */ - - rb_define_method(rb_cTime, "to_time", time_to_time, 0); - rb_define_method(rb_cTime, "to_date", time_to_date, 0); - rb_define_method(rb_cTime, "to_datetime", time_to_datetime, 0); - - rb_define_method(cDate, "to_time", date_to_time, 0); - rb_define_method(cDate, "to_date", date_to_date, 0); - rb_define_method(cDate, "to_datetime", date_to_datetime, 0); - - rb_define_method(cDateTime, "to_time", datetime_to_time, 0); - rb_define_method(cDateTime, "to_date", datetime_to_date, 0); - rb_define_method(cDateTime, "to_datetime", datetime_to_datetime, 0); - -#ifndef NDEBUG - /* tests */ - - rb_define_singleton_method(cDate, "test_civil", date_s_test_civil, 0); - rb_define_singleton_method(cDate, "test_ordinal", date_s_test_ordinal, 0); - rb_define_singleton_method(cDate, "test_commercial", - date_s_test_commercial, 0); - rb_define_singleton_method(cDate, "test_weeknum", date_s_test_weeknum, 0); - rb_define_singleton_method(cDate, "test_nth_kday", date_s_test_nth_kday, 0); - rb_define_singleton_method(cDate, "test_unit_conv", - date_s_test_unit_conv, 0); - rb_define_singleton_method(cDate, "test_all", date_s_test_all, 0); -#endif -} - -/* -Local variables: -c-file-style: "ruby" -End: -*/ diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_parse.c b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_parse.c deleted file mode 100644 index a1600e4..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_parse.c +++ /dev/null @@ -1,3086 +0,0 @@ -/* - date_parse.c: Coded by Tadayoshi Funaba 2011,2012 -*/ - -#include "ruby.h" -#include "ruby/encoding.h" -#include "ruby/re.h" -#include - -#undef strncasecmp -#define strncasecmp STRNCASECMP - -RUBY_EXTERN VALUE rb_int_positive_pow(long x, unsigned long y); -RUBY_EXTERN unsigned long ruby_scan_digits(const char *str, ssize_t len, int base, size_t *retlen, int *overflow); - -/* #define TIGHT_PARSER */ - -#define sizeof_array(o) (sizeof o / sizeof o[0]) - -#define f_negate(x) rb_funcall(x, rb_intern("-@"), 0) -#define f_add(x,y) rb_funcall(x, '+', 1, y) -#define f_sub(x,y) rb_funcall(x, '-', 1, y) -#define f_mul(x,y) rb_funcall(x, '*', 1, y) -#define f_div(x,y) rb_funcall(x, '/', 1, y) -#define f_idiv(x,y) rb_funcall(x, rb_intern("div"), 1, y) -#define f_mod(x,y) rb_funcall(x, '%', 1, y) -#define f_expt(x,y) rb_funcall(x, rb_intern("**"), 1, y) - -#define f_lt_p(x,y) rb_funcall(x, '<', 1, y) -#define f_gt_p(x,y) rb_funcall(x, '>', 1, y) -#define f_le_p(x,y) rb_funcall(x, rb_intern("<="), 1, y) -#define f_ge_p(x,y) rb_funcall(x, rb_intern(">="), 1, y) - -#define f_to_s(x) rb_funcall(x, rb_intern("to_s"), 0) - -#define f_match(r,s) rb_funcall(r, rb_intern("match"), 1, s) -#define f_aref(o,i) rb_funcall(o, rb_intern("[]"), 1, i) -#define f_aref2(o,i,j) rb_funcall(o, rb_intern("[]"), 2, i, j) -#define f_begin(o,i) rb_funcall(o, rb_intern("begin"), 1, i) -#define f_end(o,i) rb_funcall(o, rb_intern("end"), 1, i) -#define f_aset(o,i,v) rb_funcall(o, rb_intern("[]="), 2, i, v) -#define f_aset2(o,i,j,v) rb_funcall(o, rb_intern("[]="), 3, i, j, v) -#define f_sub_bang(s,r,x) rb_funcall(s, rb_intern("sub!"), 2, r, x) -#define f_gsub_bang(s,r,x) rb_funcall(s, rb_intern("gsub!"), 2, r, x) - -#define set_hash(k,v) rb_hash_aset(hash, ID2SYM(rb_intern(k"")), v) -#define ref_hash(k) rb_hash_aref(hash, ID2SYM(rb_intern(k""))) -#define del_hash(k) rb_hash_delete(hash, ID2SYM(rb_intern(k""))) - -#define cstr2num(s) rb_cstr_to_inum(s, 10, 0) -#define str2num(s) rb_str_to_inum(s, 10, 0) - -static const char abbr_days[][4] = { - "sun", "mon", "tue", "wed", - "thu", "fri", "sat" -}; - -static const char abbr_months[][4] = { - "jan", "feb", "mar", "apr", "may", "jun", - "jul", "aug", "sep", "oct", "nov", "dec" -}; - -#define issign(c) ((c) == '-' || (c) == '+') -#define asp_string() rb_str_new(" ", 1) -#ifdef TIGHT_PARSER -#define asuba_string() rb_str_new("\001", 1) -#define asubb_string() rb_str_new("\002", 1) -#define asubw_string() rb_str_new("\027", 1) -#define asubt_string() rb_str_new("\024", 1) -#endif - -static size_t -digit_span(const char *s, const char *e) -{ - size_t i = 0; - while (s + i < e && isdigit((unsigned char)s[i])) i++; - return i; -} - -static void -s3e(VALUE hash, VALUE y, VALUE m, VALUE d, int bc) -{ - VALUE vbuf = 0; - VALUE c = Qnil; - - if (!RB_TYPE_P(m, T_STRING)) - m = f_to_s(m); - - if (!NIL_P(y) && !NIL_P(m) && NIL_P(d)) { - VALUE oy = y; - VALUE om = m; - VALUE od = d; - - y = od; - m = oy; - d = om; - } - - if (NIL_P(y)) { - if (!NIL_P(d) && RSTRING_LEN(d) > 2) { - y = d; - d = Qnil; - } - if (!NIL_P(d) && RSTRING_LEN(d) > 0 && *RSTRING_PTR(d) == '\'') { - y = d; - d = Qnil; - } - } - - if (!NIL_P(y)) { - const char *s, *bp, *ep; - size_t l; - - s = RSTRING_PTR(y); - ep = RSTRING_END(y); - while (s < ep && !issign(*s) && !isdigit((unsigned char)*s)) - s++; - if (s >= ep) goto no_date; - bp = s; - if (issign((unsigned char)*s)) - s++; - l = digit_span(s, ep); - ep = s + l; - if (*ep) { - y = d; - d = rb_str_new(bp, ep - bp); - } - no_date:; - } - - if (!NIL_P(m)) { - const char *s; - - s = RSTRING_PTR(m); - if (*s == '\'' || RSTRING_LEN(m) > 2) { - /* us -> be */ - VALUE oy = y; - VALUE om = m; - VALUE od = d; - - y = om; - m = od; - d = oy; - } - } - - if (!NIL_P(d)) { - const char *s; - - s = RSTRING_PTR(d); - if (*s == '\'' || RSTRING_LEN(d) > 2) { - VALUE oy = y; - VALUE od = d; - - y = od; - d = oy; - } - } - - if (!NIL_P(y)) { - const char *s, *bp, *ep; - int sign = 0; - size_t l; - VALUE iy; - - s = RSTRING_PTR(y); - ep = RSTRING_END(y); - while (s < ep && !issign(*s) && !isdigit((unsigned char)*s)) - s++; - if (s >= ep) goto no_year; - bp = s; - if (issign(*s)) { - s++; - sign = 1; - } - if (sign) - c = Qfalse; - l = digit_span(s, ep); - ep = s + l; - if (l > 2) - c = Qfalse; - { - char *buf; - - buf = ALLOCV_N(char, vbuf, ep - bp + 1); - memcpy(buf, bp, ep - bp); - buf[ep - bp] = '\0'; - iy = cstr2num(buf); - ALLOCV_END(vbuf); - } - set_hash("year", iy); - no_year:; - } - - if (bc) - set_hash("_bc", Qtrue); - - if (!NIL_P(m)) { - const char *s, *bp, *ep; - size_t l; - VALUE im; - - s = RSTRING_PTR(m); - ep = RSTRING_END(m); - while (s < ep && !isdigit((unsigned char)*s)) - s++; - if (s >= ep) goto no_month; - bp = s; - l = digit_span(s, ep); - ep = s + l; - { - char *buf; - - buf = ALLOCV_N(char, vbuf, ep - bp + 1); - memcpy(buf, bp, ep - bp); - buf[ep - bp] = '\0'; - im = cstr2num(buf); - ALLOCV_END(vbuf); - } - set_hash("mon", im); - no_month:; - } - - if (!NIL_P(d)) { - const char *s, *bp, *ep; - size_t l; - VALUE id; - - s = RSTRING_PTR(d); - ep = RSTRING_END(d); - while (s < ep && !isdigit((unsigned char)*s)) - s++; - if (s >= ep) goto no_mday; - bp = s; - l = digit_span(s, ep); - ep = s + l; - { - char *buf; - - buf = ALLOCV_N(char, vbuf, ep - bp + 1); - memcpy(buf, bp, ep - bp); - buf[ep - bp] = '\0'; - id = cstr2num(buf); - ALLOCV_END(vbuf); - } - set_hash("mday", id); - no_mday:; - } - - if (!NIL_P(c)) - set_hash("_comp", c); -} - -#define DAYS "sunday|monday|tuesday|wednesday|thursday|friday|saturday" -#define MONTHS "january|february|march|april|may|june|july|august|september|october|november|december" -#define ABBR_DAYS "sun|mon|tue|wed|thu|fri|sat" -#define ABBR_MONTHS "jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec" - -#define NUMBER "(? n && isspace((unsigned char)s[l - n - 1])); - return n; -} - -static long -shrunk_size(const char *s, long l) -{ - long i, ni; - int sp = 0; - for (i = ni = 0; i < l; ++i) { - if (!isspace((unsigned char)s[i])) { - if (sp) ni++; - sp = 0; - ni++; - } - else { - sp = 1; - } - } - return ni < l ? ni : 0; -} - -static long -shrink_space(char *d, const char *s, long l) -{ - long i, ni; - int sp = 0; - for (i = ni = 0; i < l; ++i) { - if (!isspace((unsigned char)s[i])) { - if (sp) d[ni++] = ' '; - sp = 0; - d[ni++] = s[i]; - } - else { - sp = 1; - } - } - return ni; -} - -VALUE -date_zone_to_diff(VALUE str) -{ - VALUE offset = Qnil; - long l = RSTRING_LEN(str); - const char *s = RSTRING_PTR(str); - - { - int dst = 0; - int w; - - if ((w = str_end_with_word(s, l, "time")) > 0) { - int wtime = w; - l -= w; - if ((w = str_end_with_word(s, l, "standard")) > 0) { - l -= w; - } - else if ((w = str_end_with_word(s, l, "daylight")) > 0) { - l -= w; - dst = 1; - } - else { - l += wtime; - } - } - else if ((w = str_end_with_word(s, l, "dst")) > 0) { - l -= w; - dst = 1; - } - - { - const char *zn = s; - long sl = shrunk_size(s, l); - char shrunk_buff[MAX_WORD_LENGTH]; /* no terminator to be added */ - const struct zone *z = 0; - - if (sl <= 0) { - sl = l; - } - else if (sl <= MAX_WORD_LENGTH) { - char *d = shrunk_buff; - sl = shrink_space(d, s, l); - zn = d; - } - - if (sl > 0 && sl <= MAX_WORD_LENGTH) { - z = zonetab(zn, (unsigned int)sl); - } - - if (z) { - int d = z->offset; - if (dst) - d += 3600; - offset = INT2FIX(d); - goto ok; - } - } - - { - char *p; - int sign = 0; - long hour = 0, min = 0, sec = 0; - - if (l > 3 && - (strncasecmp(s, "gmt", 3) == 0 || - strncasecmp(s, "utc", 3) == 0)) { - s += 3; - l -= 3; - } - if (issign(*s)) { - sign = *s == '-'; - s++; - l--; - -#define out_of_range(v, min, max) ((v) < (min) || (max) < (v)) - hour = STRTOUL(s, &p, 10); - if (*p == ':') { - if (out_of_range(hour, 0, 23)) return Qnil; - s = ++p; - min = STRTOUL(s, &p, 10); - if (out_of_range(min, 0, 59)) return Qnil; - if (*p == ':') { - s = ++p; - sec = STRTOUL(s, &p, 10); - if (out_of_range(sec, 0, 59)) return Qnil; - } - } - else if (*p == ',' || *p == '.') { - /* fractional hour */ - size_t n; - int ov; - /* no over precision for offset; 10**-7 hour = 0.36 - * milliseconds should be enough. */ - const size_t max_digits = 7; /* 36 * 10**7 < 32-bit FIXNUM_MAX */ - - if (out_of_range(hour, 0, 23)) return Qnil; - - n = (s + l) - ++p; - if (n > max_digits) n = max_digits; - sec = ruby_scan_digits(p, n, 10, &n, &ov); - if ((p += n) < s + l && *p >= ('5' + !(sec & 1)) && *p <= '9') { - /* round half to even */ - sec++; - } - sec *= 36; - if (sign) { - hour = -hour; - sec = -sec; - } - if (n <= 2) { - /* HH.nn or HH.n */ - if (n == 1) sec *= 10; - offset = INT2FIX(sec + hour * 3600); - } - else { - VALUE denom = rb_int_positive_pow(10, (int)(n - 2)); - offset = f_add(rb_rational_new(INT2FIX(sec), denom), INT2FIX(hour * 3600)); - if (rb_rational_den(offset) == INT2FIX(1)) { - offset = rb_rational_num(offset); - } - } - goto ok; - } - else if (l > 2) { - size_t n; - int ov; - - if (l >= 1) - hour = ruby_scan_digits(&s[0], 2 - l % 2, 10, &n, &ov); - if (l >= 3) - min = ruby_scan_digits(&s[2 - l % 2], 2, 10, &n, &ov); - if (l >= 5) - sec = ruby_scan_digits(&s[4 - l % 2], 2, 10, &n, &ov); - } - sec += min * 60 + hour * 3600; - if (sign) sec = -sec; - offset = INT2FIX(sec); -#undef out_of_range - } - } - } - RB_GC_GUARD(str); - ok: - return offset; -} - -static int -day_num(VALUE s) -{ - int i; - - for (i = 0; i < (int)sizeof_array(abbr_days); i++) - if (strncasecmp(abbr_days[i], RSTRING_PTR(s), 3) == 0) - break; - return i; -} - -static int -mon_num(VALUE s) -{ - int i; - - for (i = 0; i < (int)sizeof_array(abbr_months); i++) - if (strncasecmp(abbr_months[i], RSTRING_PTR(s), 3) == 0) - break; - return i + 1; -} - -static int -parse_day_cb(VALUE m, VALUE hash) -{ - VALUE s; - - s = rb_reg_nth_match(1, m); - set_hash("wday", INT2FIX(day_num(s))); - return 1; -} - -static int -parse_day(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifndef TIGHT_PARSER - "\\b(" ABBR_DAYS ")[^-/\\d\\s]*" -#else - "(" VALID_DAYS ")" -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); -#ifndef TIGHT_PARSER - SUBS(str, pat, parse_day_cb); -#else - SUBW(str, pat, parse_day_cb); -#endif -} - -static int -parse_time2_cb(VALUE m, VALUE hash) -{ - VALUE h, min, s, f, p; - - h = rb_reg_nth_match(1, m); - h = str2num(h); - - min = rb_reg_nth_match(2, m); - if (!NIL_P(min)) - min = str2num(min); - - s = rb_reg_nth_match(3, m); - if (!NIL_P(s)) - s = str2num(s); - - f = rb_reg_nth_match(4, m); - - if (!NIL_P(f)) - f = rb_rational_new2(str2num(f), - f_expt(INT2FIX(10), LONG2NUM(RSTRING_LEN(f)))); - - p = rb_reg_nth_match(5, m); - - if (!NIL_P(p)) { - int ih = NUM2INT(h); - ih %= 12; - if (*RSTRING_PTR(p) == 'P' || *RSTRING_PTR(p) == 'p') - ih += 12; - h = INT2FIX(ih); - } - - set_hash("hour", h); - if (!NIL_P(min)) - set_hash("min", min); - if (!NIL_P(s)) - set_hash("sec", s); - if (!NIL_P(f)) - set_hash("sec_fraction", f); - - return 1; -} - -static int -parse_time_cb(VALUE m, VALUE hash) -{ - static const char pat_source[] = - "\\A(\\d+)h?" - "(?:\\s*:?\\s*(\\d+)m?" - "(?:" - "\\s*:?\\s*(\\d+)(?:[,.](\\d+))?s?" - ")?" - ")?" - "(?:\\s*([ap])(?:m\\b|\\.m\\.))?"; - static VALUE pat = Qnil; - VALUE s1, s2; - - s1 = rb_reg_nth_match(1, m); - s2 = rb_reg_nth_match(2, m); - - if (!NIL_P(s2)) - set_hash("zone", s2); - - REGCOMP_I(pat); - - { - VALUE m = f_match(pat, s1); - - if (NIL_P(m)) - return 0; - parse_time2_cb(m, hash); - } - - return 1; -} - -static int -parse_time(VALUE str, VALUE hash) -{ - static const char pat_source[] = - "(" - "" NUMBER "+\\s*" - "(?:" - "(?:" - ":\\s*\\d+" - "(?:" -#ifndef TIGHT_PARSER - "\\s*:\\s*\\d+(?:[,.]\\d*)?" -#else - "\\s*:\\s*\\d+(?:[,.]\\d+)?" -#endif - ")?" - "|" - "h(?:\\s*\\d+m?(?:\\s*\\d+s?)?)?" - ")" - "(?:" - "\\s*" - "[ap](?:m\\b|\\.m\\.)" - ")?" - "|" - "[ap](?:m\\b|\\.m\\.)" - ")" - ")" - "(?:" - "\\s*" - "(" - "(?:gmt|utc?)?[-+]\\d+(?:[,.:]\\d+(?::\\d+)?)?" - "|" - "(?-i:[[:alpha:].\\s]+)(?:standard|daylight)\\stime\\b" - "|" - "(?-i:[[:alpha:]]+)(?:\\sdst)?\\b" - ")" - ")?"; - static VALUE pat = Qnil; - - REGCOMP_I(pat); -#ifndef TIGHT_PARSER - SUBS(str, pat, parse_time_cb); -#else - SUBT(str, pat, parse_time_cb); -#endif -} - -#define BEGIN_ERA "\\b" -#define END_ERA "(?!(? 1) - return 0; - return 1; -} -#endif - -static int -parse_eu_cb(VALUE m, VALUE hash) -{ -#ifndef TIGHT_PARSER - VALUE y, mon, d, b; - - d = rb_reg_nth_match(1, m); - mon = rb_reg_nth_match(2, m); - b = rb_reg_nth_match(3, m); - y = rb_reg_nth_match(4, m); - - mon = INT2FIX(mon_num(mon)); - - s3e(hash, y, mon, d, !NIL_P(b) && - (*RSTRING_PTR(b) == 'B' || - *RSTRING_PTR(b) == 'b')); -#else - VALUE y, mon, d; - - d = rb_reg_nth_match(1, m); - mon = rb_reg_nth_match(2, m); - y = rb_reg_nth_match(3, m); - - if (!check_apost(d, mon, y)) - return 0; - - mon = INT2FIX(mon_num(mon)); - - s3e(hash, y, mon, d, 0); -#endif - return 1; -} - -static int -parse_eu(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifdef TIGHT_PARSER - BOS - FPW_COM FPT_COM -#endif -#ifndef TIGHT_PARSER - "('?" NUMBER "+)[^-\\d\\s]*" -#else - "(\\d+)(?:(?:st|nd|rd|th)\\b)?" -#endif - "\\s*" -#ifndef TIGHT_PARSER - "(" ABBR_MONTHS ")[^-\\d\\s']*" -#else - "(" VALID_MONTHS ")" -#endif - "(?:" - "\\s*" -#ifndef TIGHT_PARSER - "(?:" - BEGIN_ERA - "(c(?:e|\\.e\\.)|b(?:ce|\\.c\\.e\\.)|a(?:d|\\.d\\.)|b(?:c|\\.c\\.))" - END_ERA - ")?" - "\\s*" - "('?-?\\d+(?:(?:st|nd|rd|th)\\b)?)" -#else - "(?:" FPA ")?" - "\\s*" - "([-']?\\d+)" - "\\s*" - "(?:" FPA "|" FPB ")?" -#endif - ")?" -#ifdef TIGHT_PARSER - COM_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_eu_cb); -} - -static int -parse_us_cb(VALUE m, VALUE hash) -{ -#ifndef TIGHT_PARSER - VALUE y, mon, d, b; - - mon = rb_reg_nth_match(1, m); - d = rb_reg_nth_match(2, m); - - b = rb_reg_nth_match(3, m); - y = rb_reg_nth_match(4, m); - - mon = INT2FIX(mon_num(mon)); - - s3e(hash, y, mon, d, !NIL_P(b) && - (*RSTRING_PTR(b) == 'B' || - *RSTRING_PTR(b) == 'b')); -#else - VALUE y, mon, d; - - mon = rb_reg_nth_match(1, m); - d = rb_reg_nth_match(2, m); - y = rb_reg_nth_match(3, m); - - if (!check_apost(mon, d, y)) - return 0; - - mon = INT2FIX(mon_num(mon)); - - s3e(hash, y, mon, d, 0); -#endif - return 1; -} - -static int -parse_us(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifdef TIGHT_PARSER - BOS - FPW_COM FPT_COM -#endif -#ifndef TIGHT_PARSER - "\\b(" ABBR_MONTHS ")[^-\\d\\s']*" -#else - "\\b(" VALID_MONTHS ")" -#endif - "\\s*" -#ifndef TIGHT_PARSER - "('?\\d+)[^-\\d\\s']*" -#else - "('?\\d+)(?:(?:st|nd|rd|th)\\b)?" - COM_FPT -#endif - "(?:" - "\\s*+,?" - "\\s*+" -#ifndef TIGHT_PARSER - "(c(?:e|\\.e\\.)|b(?:ce|\\.c\\.e\\.)|a(?:d|\\.d\\.)|b(?:c|\\.c\\.))?" - "\\s*" - "('?-?\\d+)" -#else - "(?:" FPA ")?" - "\\s*" - "([-']?\\d+)" - "\\s*" - "(?:" FPA "|" FPB ")?" -#endif - ")?" -#ifdef TIGHT_PARSER - COM_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_us_cb); -} - -static int -parse_iso_cb(VALUE m, VALUE hash) -{ - VALUE y, mon, d; - - y = rb_reg_nth_match(1, m); - mon = rb_reg_nth_match(2, m); - d = rb_reg_nth_match(3, m); - -#ifdef TIGHT_PARSER - if (!check_apost(y, mon, d)) - return 0; -#endif - - s3e(hash, y, mon, d, 0); - return 1; -} - -static int -parse_iso(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifndef TIGHT_PARSER - "('?[-+]?" NUMBER "+)-(\\d+)-('?-?\\d+)" -#else - BOS - FPW_COM FPT_COM - "([-+']?\\d+)-(\\d+)-([-']?\\d+)" - TEE_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_0(pat); - SUBS(str, pat, parse_iso_cb); -} - -static int -parse_iso21_cb(VALUE m, VALUE hash) -{ - VALUE y, w, d; - - y = rb_reg_nth_match(1, m); - w = rb_reg_nth_match(2, m); - d = rb_reg_nth_match(3, m); - - if (!NIL_P(y)) - set_hash("cwyear", str2num(y)); - set_hash("cweek", str2num(w)); - if (!NIL_P(d)) - set_hash("cwday", str2num(d)); - - return 1; -} - -static int -parse_iso21(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifndef TIGHT_PARSER - "\\b(\\d{2}|\\d{4})?-?w(\\d{2})(?:-?(\\d))?\\b" -#else - BOS - FPW_COM FPT_COM - "(\\d{2}|\\d{4})?-?w(\\d{2})(?:-?(\\d))?" - TEE_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_iso21_cb); -} - -static int -parse_iso22_cb(VALUE m, VALUE hash) -{ - VALUE d; - - d = rb_reg_nth_match(1, m); - set_hash("cwday", str2num(d)); - return 1; -} - -static int -parse_iso22(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifndef TIGHT_PARSER - "-w-(\\d)\\b" -#else - BOS - FPW_COM FPT_COM - "-w-(\\d)" - TEE_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_iso22_cb); -} - -static int -parse_iso23_cb(VALUE m, VALUE hash) -{ - VALUE mon, d; - - mon = rb_reg_nth_match(1, m); - d = rb_reg_nth_match(2, m); - - if (!NIL_P(mon)) - set_hash("mon", str2num(mon)); - set_hash("mday", str2num(d)); - - return 1; -} - -static int -parse_iso23(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifndef TIGHT_PARSER - "--(\\d{2})?-(\\d{2})\\b" -#else - BOS - FPW_COM FPT_COM - "--(\\d{2})?-(\\d{2})" - TEE_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_0(pat); - SUBS(str, pat, parse_iso23_cb); -} - -static int -parse_iso24_cb(VALUE m, VALUE hash) -{ - VALUE mon, d; - - mon = rb_reg_nth_match(1, m); - d = rb_reg_nth_match(2, m); - - set_hash("mon", str2num(mon)); - if (!NIL_P(d)) - set_hash("mday", str2num(d)); - - return 1; -} - -static int -parse_iso24(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifndef TIGHT_PARSER - "--(\\d{2})(\\d{2})?\\b" -#else - BOS - FPW_COM FPT_COM - "--(\\d{2})(\\d{2})?" - TEE_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_0(pat); - SUBS(str, pat, parse_iso24_cb); -} - -static int -parse_iso25_cb(VALUE m, VALUE hash) -{ - VALUE y, d; - - y = rb_reg_nth_match(1, m); - d = rb_reg_nth_match(2, m); - - set_hash("year", str2num(y)); - set_hash("yday", str2num(d)); - - return 1; -} - -static int -parse_iso25(VALUE str, VALUE hash) -{ - static const char pat0_source[] = -#ifndef TIGHT_PARSER - "[,.](\\d{2}|\\d{4})-\\d{3}\\b" -#else - BOS - FPW_COM FPT_COM - "[,.](\\d{2}|\\d{4})-\\d{3}" - TEE_FPT COM_FPW - EOS -#endif - ; - static VALUE pat0 = Qnil; - static const char pat_source[] = -#ifndef TIGHT_PARSER - "\\b(\\d{2}|\\d{4})-(\\d{3})\\b" -#else - BOS - FPW_COM FPT_COM - "(\\d{2}|\\d{4})-(\\d{3})" - TEE_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_0(pat0); - REGCOMP_0(pat); - - if (!NIL_P(f_match(pat0, str))) - return 0; - SUBS(str, pat, parse_iso25_cb); -} - -static int -parse_iso26_cb(VALUE m, VALUE hash) -{ - VALUE d; - - d = rb_reg_nth_match(1, m); - set_hash("yday", str2num(d)); - - return 1; -} -static int -parse_iso26(VALUE str, VALUE hash) -{ - static const char pat0_source[] = -#ifndef TIGHT_PARSER - "\\d-\\d{3}\\b" -#else - BOS - FPW_COM FPT_COM - "\\d-\\d{3}" - TEE_FPT COM_FPW - EOS -#endif - ; - static VALUE pat0 = Qnil; - static const char pat_source[] = -#ifndef TIGHT_PARSER - "\\b-(\\d{3})\\b" -#else - BOS - FPW_COM FPT_COM - "-(\\d{3})" - TEE_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_0(pat0); - REGCOMP_0(pat); - - if (!NIL_P(f_match(pat0, str))) - return 0; - SUBS(str, pat, parse_iso26_cb); -} - -static int -parse_iso2(VALUE str, VALUE hash) -{ - if (parse_iso21(str, hash)) - goto ok; - if (parse_iso22(str, hash)) - goto ok; - if (parse_iso23(str, hash)) - goto ok; - if (parse_iso24(str, hash)) - goto ok; - if (parse_iso25(str, hash)) - goto ok; - if (parse_iso26(str, hash)) - goto ok; - return 0; - - ok: - return 1; -} - -#define JISX0301_ERA_INITIALS "mtshr" -#define JISX0301_DEFAULT_ERA 'H' /* obsolete */ - -static int -gengo(int c) -{ - int e; - - switch (c) { - case 'M': case 'm': e = 1867; break; - case 'T': case 't': e = 1911; break; - case 'S': case 's': e = 1925; break; - case 'H': case 'h': e = 1988; break; - case 'R': case 'r': e = 2018; break; - default: e = 0; break; - } - return e; -} - -static int -parse_jis_cb(VALUE m, VALUE hash) -{ - VALUE e, y, mon, d; - int ep; - - e = rb_reg_nth_match(1, m); - y = rb_reg_nth_match(2, m); - mon = rb_reg_nth_match(3, m); - d = rb_reg_nth_match(4, m); - - ep = gengo(*RSTRING_PTR(e)); - - set_hash("year", f_add(str2num(y), INT2FIX(ep))); - set_hash("mon", str2num(mon)); - set_hash("mday", str2num(d)); - - return 1; -} - -static int -parse_jis(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifndef TIGHT_PARSER - "\\b([" JISX0301_ERA_INITIALS "])(\\d+)\\.(\\d+)\\.(\\d+)" -#else - BOS - FPW_COM FPT_COM - "([" JISX0301_ERA_INITIALS "])(\\d+)\\.(\\d+)\\.(\\d+)" - TEE_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_jis_cb); -} - -static int -parse_vms11_cb(VALUE m, VALUE hash) -{ - VALUE y, mon, d; - - d = rb_reg_nth_match(1, m); - mon = rb_reg_nth_match(2, m); - y = rb_reg_nth_match(3, m); - -#ifdef TIGHT_PARSER - if (!check_apost(d, mon, y)) - return 0; -#endif - - mon = INT2FIX(mon_num(mon)); - - s3e(hash, y, mon, d, 0); - return 1; -} - -static int -parse_vms11(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifndef TIGHT_PARSER - "('?-?" NUMBER "+)-(" ABBR_MONTHS ")[^-/.]*" - "-('?-?\\d+)" -#else - BOS - FPW_COM FPT_COM - "([-']?\\d+)-(" DOTLESS_VALID_MONTHS ")" - "-([-']?\\d+)" - COM_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_vms11_cb); -} - -static int -parse_vms12_cb(VALUE m, VALUE hash) -{ - VALUE y, mon, d; - - mon = rb_reg_nth_match(1, m); - d = rb_reg_nth_match(2, m); - y = rb_reg_nth_match(3, m); - -#ifdef TIGHT_PARSER - if (!check_apost(mon, d, y)) - return 0; -#endif - - mon = INT2FIX(mon_num(mon)); - - s3e(hash, y, mon, d, 0); - return 1; -} - -static int -parse_vms12(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifndef TIGHT_PARSER - "\\b(" ABBR_MONTHS ")[^-/.]*" - "-('?-?\\d+)(?:-('?-?\\d+))?" -#else - BOS - FPW_COM FPT_COM - "(" DOTLESS_VALID_MONTHS ")" - "-([-']?\\d+)(?:-([-']?\\d+))?" - COM_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_vms12_cb); -} - -static int -parse_vms(VALUE str, VALUE hash) -{ - if (parse_vms11(str, hash)) - goto ok; - if (parse_vms12(str, hash)) - goto ok; - return 0; - - ok: - return 1; -} - -static int -parse_sla_cb(VALUE m, VALUE hash) -{ - VALUE y, mon, d; - - y = rb_reg_nth_match(1, m); - mon = rb_reg_nth_match(2, m); - d = rb_reg_nth_match(3, m); - -#ifdef TIGHT_PARSER - if (!check_apost(y, mon, d)) - return 0; -#endif - - s3e(hash, y, mon, d, 0); - return 1; -} - -static int -parse_sla(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifndef TIGHT_PARSER - "('?-?" NUMBER "+)/\\s*('?\\d+)(?:\\D\\s*('?-?\\d+))?" -#else - BOS - FPW_COM FPT_COM - "([-']?\\d+)/\\s*('?\\d+)(?:(?:[-/]|\\s+)\\s*([-']?\\d+))?" - COM_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_sla_cb); -} - -#ifdef TIGHT_PARSER -static int -parse_sla2_cb(VALUE m, VALUE hash) -{ - VALUE y, mon, d; - - d = rb_reg_nth_match(1, m); - mon = rb_reg_nth_match(2, m); - y = rb_reg_nth_match(3, m); - - if (!check_apost(d, mon, y)) - return 0; - - mon = INT2FIX(mon_num(mon)); - - s3e(hash, y, mon, d, 0); - return 1; -} - -static int -parse_sla2(VALUE str, VALUE hash) -{ - static const char pat_source[] = - BOS - FPW_COM FPT_COM - "([-']?\\d+)/\\s*(" DOTLESS_VALID_MONTHS ")(?:(?:[-/]|\\s+)\\s*([-']?\\d+))?" - COM_FPT COM_FPW - EOS - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_sla2_cb); -} - -static int -parse_sla3_cb(VALUE m, VALUE hash) -{ - VALUE y, mon, d; - - mon = rb_reg_nth_match(1, m); - d = rb_reg_nth_match(2, m); - y = rb_reg_nth_match(3, m); - - if (!check_apost(mon, d, y)) - return 0; - - mon = INT2FIX(mon_num(mon)); - - s3e(hash, y, mon, d, 0); - return 1; -} - -static int -parse_sla3(VALUE str, VALUE hash) -{ - static const char pat_source[] = - BOS - FPW_COM FPT_COM - "(" DOTLESS_VALID_MONTHS ")/\\s*([-']?\\d+)(?:(?:[-/]|\\s+)\\s*([-']?\\d+))?" - COM_FPT COM_FPW - EOS - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_sla3_cb); -} -#endif - -static int -parse_dot_cb(VALUE m, VALUE hash) -{ - VALUE y, mon, d; - - y = rb_reg_nth_match(1, m); - mon = rb_reg_nth_match(2, m); - d = rb_reg_nth_match(3, m); - -#ifdef TIGHT_PARSER - if (!check_apost(y, mon, d)) - return 0; -#endif - - s3e(hash, y, mon, d, 0); - return 1; -} - -static int -parse_dot(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifndef TIGHT_PARSER - "('?-?" NUMBER "+)\\.\\s*('?\\d+)\\.\\s*('?-?\\d+)" -#else - BOS - FPW_COM FPT_COM - "([-']?\\d+)\\.\\s*(\\d+)\\.\\s*([-']?\\d+)" - COM_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_dot_cb); -} - -#ifdef TIGHT_PARSER -static int -parse_dot2_cb(VALUE m, VALUE hash) -{ - VALUE y, mon, d; - - d = rb_reg_nth_match(1, m); - mon = rb_reg_nth_match(2, m); - y = rb_reg_nth_match(3, m); - - if (!check_apost(d, mon, y)) - return 0; - - mon = INT2FIX(mon_num(mon)); - - s3e(hash, y, mon, d, 0); - return 1; -} - -static int -parse_dot2(VALUE str, VALUE hash) -{ - static const char pat_source[] = - BOS - FPW_COM FPT_COM - "([-']?\\d+)\\.\\s*(" DOTLESS_VALID_MONTHS ")(?:(?:[./])\\s*([-']?\\d+))?" - COM_FPT COM_FPW - EOS - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_dot2_cb); -} - -static int -parse_dot3_cb(VALUE m, VALUE hash) -{ - VALUE y, mon, d; - - mon = rb_reg_nth_match(1, m); - d = rb_reg_nth_match(2, m); - y = rb_reg_nth_match(3, m); - - if (!check_apost(mon, d, y)) - return 0; - - mon = INT2FIX(mon_num(mon)); - - s3e(hash, y, mon, d, 0); - return 1; -} - -static int -parse_dot3(VALUE str, VALUE hash) -{ - static const char pat_source[] = - BOS - FPW_COM FPT_COM - "(" DOTLESS_VALID_MONTHS ")\\.\\s*([-']?\\d+)(?:(?:[./])\\s*([-']?\\d+))?" - COM_FPT COM_FPW - EOS - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_dot3_cb); -} -#endif - -static int -parse_year_cb(VALUE m, VALUE hash) -{ - VALUE y; - - y = rb_reg_nth_match(1, m); - set_hash("year", str2num(y)); - return 1; -} - -static int -parse_year(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifndef TIGHT_PARSER - "'(\\d+)\\b" -#else - BOS - FPW_COM FPT_COM - "'(\\d+)" - COM_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_0(pat); - SUBS(str, pat, parse_year_cb); -} - -static int -parse_mon_cb(VALUE m, VALUE hash) -{ - VALUE mon; - - mon = rb_reg_nth_match(1, m); - set_hash("mon", INT2FIX(mon_num(mon))); - return 1; -} - -static int -parse_mon(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifndef TIGHT_PARSER - "\\b(" ABBR_MONTHS ")\\S*" -#else - BOS - FPW_COM FPT_COM - "(" VALID_MONTHS ")" - COM_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_mon_cb); -} - -static int -parse_mday_cb(VALUE m, VALUE hash) -{ - VALUE d; - - d = rb_reg_nth_match(1, m); - set_hash("mday", str2num(d)); - return 1; -} - -static int -parse_mday(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifndef TIGHT_PARSER - "(" NUMBER "+)(st|nd|rd|th)\\b" -#else - BOS - FPW_COM FPT_COM - "(\\d+)(st|nd|rd|th)" - COM_FPT COM_FPW - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_mday_cb); -} - -static int -n2i(const char *s, long f, long w) -{ - long e, i; - int v; - - e = f + w; - v = 0; - for (i = f; i < e; i++) { - v *= 10; - v += s[i] - '0'; - } - return v; -} - -static int -parse_ddd_cb(VALUE m, VALUE hash) -{ - VALUE s1, s2, s3, s4, s5; - const char *cs2, *cs3, *cs5; - long l2, l3, l4, l5; - - s1 = rb_reg_nth_match(1, m); - s2 = rb_reg_nth_match(2, m); - s3 = rb_reg_nth_match(3, m); - s4 = rb_reg_nth_match(4, m); - s5 = rb_reg_nth_match(5, m); - - cs2 = RSTRING_PTR(s2); - l2 = RSTRING_LEN(s2); - - switch (l2) { - case 2: - if (NIL_P(s3) && !NIL_P(s4)) - set_hash("sec", INT2FIX(n2i(cs2, l2-2, 2))); - else - set_hash("mday", INT2FIX(n2i(cs2, 0, 2))); - break; - case 4: - if (NIL_P(s3) && !NIL_P(s4)) { - set_hash("sec", INT2FIX(n2i(cs2, l2-2, 2))); - set_hash("min", INT2FIX(n2i(cs2, l2-4, 2))); - } - else { - set_hash("mon", INT2FIX(n2i(cs2, 0, 2))); - set_hash("mday", INT2FIX(n2i(cs2, 2, 2))); - } - break; - case 6: - if (NIL_P(s3) && !NIL_P(s4)) { - set_hash("sec", INT2FIX(n2i(cs2, l2-2, 2))); - set_hash("min", INT2FIX(n2i(cs2, l2-4, 2))); - set_hash("hour", INT2FIX(n2i(cs2, l2-6, 2))); - } - else { - int y = n2i(cs2, 0, 2); - if (!NIL_P(s1) && *RSTRING_PTR(s1) == '-') - y = -y; - set_hash("year", INT2FIX(y)); - set_hash("mon", INT2FIX(n2i(cs2, 2, 2))); - set_hash("mday", INT2FIX(n2i(cs2, 4, 2))); - } - break; - case 8: - case 10: - case 12: - case 14: - if (NIL_P(s3) && !NIL_P(s4)) { - set_hash("sec", INT2FIX(n2i(cs2, l2-2, 2))); - set_hash("min", INT2FIX(n2i(cs2, l2-4, 2))); - set_hash("hour", INT2FIX(n2i(cs2, l2-6, 2))); - set_hash("mday", INT2FIX(n2i(cs2, l2-8, 2))); - if (l2 >= 10) - set_hash("mon", INT2FIX(n2i(cs2, l2-10, 2))); - if (l2 == 12) { - int y = n2i(cs2, l2-12, 2); - if (!NIL_P(s1) && *RSTRING_PTR(s1) == '-') - y = -y; - set_hash("year", INT2FIX(y)); - } - if (l2 == 14) { - int y = n2i(cs2, l2-14, 4); - if (!NIL_P(s1) && *RSTRING_PTR(s1) == '-') - y = -y; - set_hash("year", INT2FIX(y)); - set_hash("_comp", Qfalse); - } - } - else { - int y = n2i(cs2, 0, 4); - if (!NIL_P(s1) && *RSTRING_PTR(s1) == '-') - y = -y; - set_hash("year", INT2FIX(y)); - set_hash("mon", INT2FIX(n2i(cs2, 4, 2))); - set_hash("mday", INT2FIX(n2i(cs2, 6, 2))); - if (l2 >= 10) - set_hash("hour", INT2FIX(n2i(cs2, 8, 2))); - if (l2 >= 12) - set_hash("min", INT2FIX(n2i(cs2, 10, 2))); - if (l2 >= 14) - set_hash("sec", INT2FIX(n2i(cs2, 12, 2))); - set_hash("_comp", Qfalse); - } - break; - case 3: - if (NIL_P(s3) && !NIL_P(s4)) { - set_hash("sec", INT2FIX(n2i(cs2, l2-2, 2))); - set_hash("min", INT2FIX(n2i(cs2, l2-3, 1))); - } - else - set_hash("yday", INT2FIX(n2i(cs2, 0, 3))); - break; - case 5: - if (NIL_P(s3) && !NIL_P(s4)) { - set_hash("sec", INT2FIX(n2i(cs2, l2-2, 2))); - set_hash("min", INT2FIX(n2i(cs2, l2-4, 2))); - set_hash("hour", INT2FIX(n2i(cs2, l2-5, 1))); - } - else { - int y = n2i(cs2, 0, 2); - if (!NIL_P(s1) && *RSTRING_PTR(s1) == '-') - y = -y; - set_hash("year", INT2FIX(y)); - set_hash("yday", INT2FIX(n2i(cs2, 2, 3))); - } - break; - case 7: - if (NIL_P(s3) && !NIL_P(s4)) { - set_hash("sec", INT2FIX(n2i(cs2, l2-2, 2))); - set_hash("min", INT2FIX(n2i(cs2, l2-4, 2))); - set_hash("hour", INT2FIX(n2i(cs2, l2-6, 2))); - set_hash("mday", INT2FIX(n2i(cs2, l2-7, 1))); - } - else { - int y = n2i(cs2, 0, 4); - if (!NIL_P(s1) && *RSTRING_PTR(s1) == '-') - y = -y; - set_hash("year", INT2FIX(y)); - set_hash("yday", INT2FIX(n2i(cs2, 4, 3))); - } - break; - } - RB_GC_GUARD(s2); - if (!NIL_P(s3)) { - cs3 = RSTRING_PTR(s3); - l3 = RSTRING_LEN(s3); - - if (!NIL_P(s4)) { - switch (l3) { - case 2: - case 4: - case 6: - set_hash("sec", INT2FIX(n2i(cs3, l3-2, 2))); - if (l3 >= 4) - set_hash("min", INT2FIX(n2i(cs3, l3-4, 2))); - if (l3 >= 6) - set_hash("hour", INT2FIX(n2i(cs3, l3-6, 2))); - break; - } - } - else { - switch (l3) { - case 2: - case 4: - case 6: - set_hash("hour", INT2FIX(n2i(cs3, 0, 2))); - if (l3 >= 4) - set_hash("min", INT2FIX(n2i(cs3, 2, 2))); - if (l3 >= 6) - set_hash("sec", INT2FIX(n2i(cs3, 4, 2))); - break; - } - } - RB_GC_GUARD(s3); - } - if (!NIL_P(s4)) { - l4 = RSTRING_LEN(s4); - - set_hash("sec_fraction", - rb_rational_new2(str2num(s4), - f_expt(INT2FIX(10), LONG2NUM(l4)))); - } - if (!NIL_P(s5)) { - cs5 = RSTRING_PTR(s5); - l5 = RSTRING_LEN(s5); - - set_hash("zone", s5); - - if (*cs5 == '[') { - const char *s1, *s2; - VALUE zone; - - l5 -= 2; - s1 = cs5 + 1; - s2 = memchr(s1, ':', l5); - if (s2) { - s2++; - zone = rb_str_subseq(s5, s2 - cs5, l5 - (s2 - s1)); - s5 = rb_str_subseq(s5, 1, s2 - s1); - } - else { - zone = rb_str_subseq(s5, 1, l5); - if (isdigit((unsigned char)*s1)) - s5 = rb_str_append(rb_str_new_cstr("+"), zone); - else - s5 = zone; - } - set_hash("zone", zone); - set_hash("offset", date_zone_to_diff(s5)); - } - RB_GC_GUARD(s5); - } - - return 1; -} - -static int -parse_ddd(VALUE str, VALUE hash) -{ - static const char pat_source[] = -#ifdef TIGHT_PARSER - BOS -#endif - "([-+]?)(" NUMBER "{2,14})" - "(?:" - "\\s*" - "t?" - "\\s*" - "(\\d{2,6})?(?:[,.](\\d*))?" - ")?" - "(?:" - "\\s*" - "(" - "z\\b" - "|" - "[-+]\\d{1,4}\\b" - "|" - "\\[[-+]?\\d[^\\]]*\\]" - ")" - ")?" -#ifdef TIGHT_PARSER - EOS -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_ddd_cb); -} - -#ifndef TIGHT_PARSER -static int -parse_bc_cb(VALUE m, VALUE hash) -{ - set_hash("_bc", Qtrue); - return 1; -} - -static int -parse_bc(VALUE str, VALUE hash) -{ - static const char pat_source[] = - "\\b(bc\\b|bce\\b|b\\.c\\.|b\\.c\\.e\\.)"; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_bc_cb); -} - -static int -parse_frag_cb(VALUE m, VALUE hash) -{ - VALUE s, n; - - s = rb_reg_nth_match(1, m); - - if (!NIL_P(ref_hash("hour")) && NIL_P(ref_hash("mday"))) { - n = str2num(s); - if (f_ge_p(n, INT2FIX(1)) && - f_le_p(n, INT2FIX(31))) - set_hash("mday", n); - } - if (!NIL_P(ref_hash("mday")) && NIL_P(ref_hash("hour"))) { - n = str2num(s); - if (f_ge_p(n, INT2FIX(0)) && - f_le_p(n, INT2FIX(24))) - set_hash("hour", n); - } - - return 1; -} - -static int -parse_frag(VALUE str, VALUE hash) -{ - static const char pat_source[] = "\\A\\s*(\\d{1,2})\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - SUBS(str, pat, parse_frag_cb); -} -#endif - -#ifdef TIGHT_PARSER -static int -parse_dummy_cb(VALUE m, VALUE hash) -{ - return 1; -} - -static int -parse_wday_only(VALUE str, VALUE hash) -{ - static const char pat_source[] = "\\A\\s*" FPW "\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_0(pat); - SUBS(str, pat, parse_dummy_cb); -} - -static int -parse_time_only(VALUE str, VALUE hash) -{ - static const char pat_source[] = "\\A\\s*" FPT "\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_0(pat); - SUBS(str, pat, parse_dummy_cb); -} - -static int -parse_wday_and_time(VALUE str, VALUE hash) -{ - static const char pat_source[] = "\\A\\s*(" FPW "\\s+" FPT "|" FPT "\\s+" FPW ")\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_0(pat); - SUBS(str, pat, parse_dummy_cb); -} - -static unsigned -have_invalid_char_p(VALUE s) -{ - long i; - - for (i = 0; i < RSTRING_LEN(s); i++) - if (iscntrl((unsigned char)RSTRING_PTR(s)[i]) && - !isspace((unsigned char)RSTRING_PTR(s)[i])) - return 1; - return 0; -} -#endif - -#define HAVE_ALPHA (1<<0) -#define HAVE_DIGIT (1<<1) -#define HAVE_DASH (1<<2) -#define HAVE_DOT (1<<3) -#define HAVE_SLASH (1<<4) - -static unsigned -check_class(VALUE s) -{ - unsigned flags; - long i; - - flags = 0; - for (i = 0; i < RSTRING_LEN(s); i++) { - if (isalpha((unsigned char)RSTRING_PTR(s)[i])) - flags |= HAVE_ALPHA; - if (isdigit((unsigned char)RSTRING_PTR(s)[i])) - flags |= HAVE_DIGIT; - if (RSTRING_PTR(s)[i] == '-') - flags |= HAVE_DASH; - if (RSTRING_PTR(s)[i] == '.') - flags |= HAVE_DOT; - if (RSTRING_PTR(s)[i] == '/') - flags |= HAVE_SLASH; - } - return flags; -} - -#define HAVE_ELEM_P(x) ((check_class(str) & (x)) == (x)) - -#ifdef TIGHT_PARSER -#define PARSER_ERROR return rb_hash_new() -#endif - -VALUE -date__parse(VALUE str, VALUE comp) -{ - VALUE backref, hash; - -#ifdef TIGHT_PARSER - if (have_invalid_char_p(str)) - PARSER_ERROR; -#endif - - backref = rb_backref_get(); - rb_match_busy(backref); - - { - static const char pat_source[] = -#ifndef TIGHT_PARSER - "[^-+',./:@[:alnum:]\\[\\]]+" -#else - "[^[:graph:]]+" -#endif - ; - static VALUE pat = Qnil; - - REGCOMP_0(pat); - str = rb_str_dup(str); - f_gsub_bang(str, pat, asp_string()); - } - - hash = rb_hash_new(); - set_hash("_comp", comp); - - if (HAVE_ELEM_P(HAVE_ALPHA)) - parse_day(str, hash); - if (HAVE_ELEM_P(HAVE_DIGIT)) - parse_time(str, hash); - -#ifdef TIGHT_PARSER - if (HAVE_ELEM_P(HAVE_ALPHA)) - parse_era(str, hash); -#endif - - if (HAVE_ELEM_P(HAVE_ALPHA|HAVE_DIGIT)) { - if (parse_eu(str, hash)) - goto ok; - if (parse_us(str, hash)) - goto ok; - } - if (HAVE_ELEM_P(HAVE_DIGIT|HAVE_DASH)) - if (parse_iso(str, hash)) - goto ok; - if (HAVE_ELEM_P(HAVE_DIGIT|HAVE_DOT)) - if (parse_jis(str, hash)) - goto ok; - if (HAVE_ELEM_P(HAVE_ALPHA|HAVE_DIGIT|HAVE_DASH)) - if (parse_vms(str, hash)) - goto ok; - if (HAVE_ELEM_P(HAVE_DIGIT|HAVE_SLASH)) - if (parse_sla(str, hash)) - goto ok; -#ifdef TIGHT_PARSER - if (HAVE_ELEM_P(HAVE_ALPHA|HAVE_DIGIT|HAVE_SLASH)) { - if (parse_sla2(str, hash)) - goto ok; - if (parse_sla3(str, hash)) - goto ok; - } -#endif - if (HAVE_ELEM_P(HAVE_DIGIT|HAVE_DOT)) - if (parse_dot(str, hash)) - goto ok; -#ifdef TIGHT_PARSER - if (HAVE_ELEM_P(HAVE_ALPHA|HAVE_DIGIT|HAVE_DOT)) { - if (parse_dot2(str, hash)) - goto ok; - if (parse_dot3(str, hash)) - goto ok; - } -#endif - if (HAVE_ELEM_P(HAVE_DIGIT)) - if (parse_iso2(str, hash)) - goto ok; - if (HAVE_ELEM_P(HAVE_DIGIT)) - if (parse_year(str, hash)) - goto ok; - if (HAVE_ELEM_P(HAVE_ALPHA)) - if (parse_mon(str, hash)) - goto ok; - if (HAVE_ELEM_P(HAVE_DIGIT)) - if (parse_mday(str, hash)) - goto ok; - if (HAVE_ELEM_P(HAVE_DIGIT)) - if (parse_ddd(str, hash)) - goto ok; - -#ifdef TIGHT_PARSER - if (parse_wday_only(str, hash)) - goto ok; - if (parse_time_only(str, hash)) - goto ok; - if (parse_wday_and_time(str, hash)) - goto ok; - - PARSER_ERROR; /* not found */ -#endif - - ok: -#ifndef TIGHT_PARSER - if (HAVE_ELEM_P(HAVE_ALPHA)) - parse_bc(str, hash); - if (HAVE_ELEM_P(HAVE_DIGIT)) - parse_frag(str, hash); -#endif - - { - if (RTEST(del_hash("_bc"))) { - VALUE y; - - y = ref_hash("cwyear"); - if (!NIL_P(y)) { - y = f_add(f_negate(y), INT2FIX(1)); - set_hash("cwyear", y); - } - y = ref_hash("year"); - if (!NIL_P(y)) { - y = f_add(f_negate(y), INT2FIX(1)); - set_hash("year", y); - } - } - - if (RTEST(del_hash("_comp"))) { - VALUE y; - - y = ref_hash("cwyear"); - if (!NIL_P(y)) - if (f_ge_p(y, INT2FIX(0)) && f_le_p(y, INT2FIX(99))) { - if (f_ge_p(y, INT2FIX(69))) - set_hash("cwyear", f_add(y, INT2FIX(1900))); - else - set_hash("cwyear", f_add(y, INT2FIX(2000))); - } - y = ref_hash("year"); - if (!NIL_P(y)) - if (f_ge_p(y, INT2FIX(0)) && f_le_p(y, INT2FIX(99))) { - if (f_ge_p(y, INT2FIX(69))) - set_hash("year", f_add(y, INT2FIX(1900))); - else - set_hash("year", f_add(y, INT2FIX(2000))); - } - } - - } - - { - VALUE zone = ref_hash("zone"); - if (!NIL_P(zone) && NIL_P(ref_hash("offset"))) - set_hash("offset", date_zone_to_diff(zone)); - } - - rb_backref_set(backref); - - return hash; -} - -static VALUE -comp_year69(VALUE y) -{ - if (f_ge_p(y, INT2FIX(69))) - return f_add(y, INT2FIX(1900)); - return f_add(y, INT2FIX(2000)); -} - -static VALUE -comp_year50(VALUE y) -{ - if (f_ge_p(y, INT2FIX(50))) - return f_add(y, INT2FIX(1900)); - return f_add(y, INT2FIX(2000)); -} - -static VALUE -sec_fraction(VALUE f) -{ - return rb_rational_new2(str2num(f), - f_expt(INT2FIX(10), - LONG2NUM(RSTRING_LEN(f)))); -} - -#define SNUM 14 - -static int -iso8601_ext_datetime_cb(VALUE m, VALUE hash) -{ - VALUE s[SNUM + 1], y; - - { - int i; - s[0] = Qnil; - for (i = 1; i <= SNUM; i++) - s[i] = rb_reg_nth_match(i, m); - } - - if (!NIL_P(s[1])) { - if (!NIL_P(s[3])) set_hash("mday", str2num(s[3])); - if (strcmp(RSTRING_PTR(s[1]), "-") != 0) { - y = str2num(s[1]); - if (RSTRING_LEN(s[1]) < 4) - y = comp_year69(y); - set_hash("year", y); - } - if (NIL_P(s[2])) { - if (strcmp(RSTRING_PTR(s[1]), "-") != 0) - return 0; - } - else - set_hash("mon", str2num(s[2])); - } - else if (!NIL_P(s[5])) { - set_hash("yday", str2num(s[5])); - if (!NIL_P(s[4])) { - y = str2num(s[4]); - if (RSTRING_LEN(s[4]) < 4) - y = comp_year69(y); - set_hash("year", y); - } - } - else if (!NIL_P(s[8])) { - set_hash("cweek", str2num(s[7])); - set_hash("cwday", str2num(s[8])); - if (!NIL_P(s[6])) { - y = str2num(s[6]); - if (RSTRING_LEN(s[6]) < 4) - y = comp_year69(y); - set_hash("cwyear", y); - } - } - else if (!NIL_P(s[9])) { - set_hash("cwday", str2num(s[9])); - } - if (!NIL_P(s[10])) { - set_hash("hour", str2num(s[10])); - set_hash("min", str2num(s[11])); - if (!NIL_P(s[12])) - set_hash("sec", str2num(s[12])); - } - if (!NIL_P(s[13])) { - set_hash("sec_fraction", sec_fraction(s[13])); - } - if (!NIL_P(s[14])) { - set_hash("zone", s[14]); - set_hash("offset", date_zone_to_diff(s[14])); - } - - return 1; -} - -static int -iso8601_ext_datetime(VALUE str, VALUE hash) -{ - static const char pat_source[] = - "\\A\\s*(?:([-+]?\\d{2,}|-)-(\\d{2})?(?:-(\\d{2}))?|" - "([-+]?\\d{2,})?-(\\d{3})|" - "(\\d{4}|\\d{2})?-w(\\d{2})-(\\d)|" - "-w-(\\d))" - "(?:t" - "(\\d{2}):(\\d{2})(?::(\\d{2})(?:[,.](\\d+))?)?" - "(z|[-+]\\d{2}(?::?\\d{2})?)?)?\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - MATCH(str, pat, iso8601_ext_datetime_cb); -} - -#undef SNUM -#define SNUM 17 - -static int -iso8601_bas_datetime_cb(VALUE m, VALUE hash) -{ - VALUE s[SNUM + 1], y; - - { - int i; - s[0] = Qnil; - for (i = 1; i <= SNUM; i++) - s[i] = rb_reg_nth_match(i, m); - } - - if (!NIL_P(s[3])) { - set_hash("mday", str2num(s[3])); - if (strcmp(RSTRING_PTR(s[1]), "--") != 0) { - y = str2num(s[1]); - if (RSTRING_LEN(s[1]) < 4) - y = comp_year69(y); - set_hash("year", y); - } - if (*RSTRING_PTR(s[2]) == '-') { - if (strcmp(RSTRING_PTR(s[1]), "--") != 0) - return 0; - } - else - set_hash("mon", str2num(s[2])); - } - else if (!NIL_P(s[5])) { - set_hash("yday", str2num(s[5])); - y = str2num(s[4]); - if (RSTRING_LEN(s[4]) < 4) - y = comp_year69(y); - set_hash("year", y); - } - else if (!NIL_P(s[6])) { - set_hash("yday", str2num(s[6])); - } - else if (!NIL_P(s[9])) { - set_hash("cweek", str2num(s[8])); - set_hash("cwday", str2num(s[9])); - y = str2num(s[7]); - if (RSTRING_LEN(s[7]) < 4) - y = comp_year69(y); - set_hash("cwyear", y); - } - else if (!NIL_P(s[11])) { - set_hash("cweek", str2num(s[10])); - set_hash("cwday", str2num(s[11])); - } - else if (!NIL_P(s[12])) { - set_hash("cwday", str2num(s[12])); - } - if (!NIL_P(s[13])) { - set_hash("hour", str2num(s[13])); - set_hash("min", str2num(s[14])); - if (!NIL_P(s[15])) - set_hash("sec", str2num(s[15])); - } - if (!NIL_P(s[16])) { - set_hash("sec_fraction", sec_fraction(s[16])); - } - if (!NIL_P(s[17])) { - set_hash("zone", s[17]); - set_hash("offset", date_zone_to_diff(s[17])); - } - - return 1; -} - -static int -iso8601_bas_datetime(VALUE str, VALUE hash) -{ - static const char pat_source[] = - "\\A\\s*(?:([-+]?(?:\\d{4}|\\d{2})|--)(\\d{2}|-)(\\d{2})|" - "([-+]?(?:\\d{4}|\\d{2}))(\\d{3})|" - "-(\\d{3})|" - "(\\d{4}|\\d{2})w(\\d{2})(\\d)|" - "-w(\\d{2})(\\d)|" - "-w-(\\d))" - "(?:t?" - "(\\d{2})(\\d{2})(?:(\\d{2})(?:[,.](\\d+))?)?" - "(z|[-+]\\d{2}(?:\\d{2})?)?)?\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - MATCH(str, pat, iso8601_bas_datetime_cb); -} - -#undef SNUM -#define SNUM 5 - -static int -iso8601_ext_time_cb(VALUE m, VALUE hash) -{ - VALUE s[SNUM + 1]; - - { - int i; - s[0] = Qnil; - for (i = 1; i <= SNUM; i++) - s[i] = rb_reg_nth_match(i, m); - } - - set_hash("hour", str2num(s[1])); - set_hash("min", str2num(s[2])); - if (!NIL_P(s[3])) - set_hash("sec", str2num(s[3])); - if (!NIL_P(s[4])) - set_hash("sec_fraction", sec_fraction(s[4])); - if (!NIL_P(s[5])) { - set_hash("zone", s[5]); - set_hash("offset", date_zone_to_diff(s[5])); - } - - return 1; -} - -#define iso8601_bas_time_cb iso8601_ext_time_cb - -static int -iso8601_ext_time(VALUE str, VALUE hash) -{ - static const char pat_source[] = - "\\A\\s*(\\d{2}):(\\d{2})(?::(\\d{2})(?:[,.](\\d+))?" - "(z|[-+]\\d{2}(:?\\d{2})?)?)?\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - MATCH(str, pat, iso8601_ext_time_cb); -} - -static int -iso8601_bas_time(VALUE str, VALUE hash) -{ - static const char pat_source[] = - "\\A\\s*(\\d{2})(\\d{2})(?:(\\d{2})(?:[,.](\\d+))?" - "(z|[-+]\\d{2}(\\d{2})?)?)?\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - MATCH(str, pat, iso8601_bas_time_cb); -} - -VALUE -date__iso8601(VALUE str) -{ - VALUE backref, hash; - - backref = rb_backref_get(); - rb_match_busy(backref); - - hash = rb_hash_new(); - - if (iso8601_ext_datetime(str, hash)) - goto ok; - if (iso8601_bas_datetime(str, hash)) - goto ok; - if (iso8601_ext_time(str, hash)) - goto ok; - if (iso8601_bas_time(str, hash)) - goto ok; - - ok: - rb_backref_set(backref); - - return hash; -} - -#undef SNUM -#define SNUM 8 - -static int -rfc3339_cb(VALUE m, VALUE hash) -{ - VALUE s[SNUM + 1]; - - { - int i; - s[0] = Qnil; - for (i = 1; i <= SNUM; i++) - s[i] = rb_reg_nth_match(i, m); - } - - set_hash("year", str2num(s[1])); - set_hash("mon", str2num(s[2])); - set_hash("mday", str2num(s[3])); - set_hash("hour", str2num(s[4])); - set_hash("min", str2num(s[5])); - set_hash("sec", str2num(s[6])); - set_hash("zone", s[8]); - set_hash("offset", date_zone_to_diff(s[8])); - if (!NIL_P(s[7])) - set_hash("sec_fraction", sec_fraction(s[7])); - - return 1; -} - -static int -rfc3339(VALUE str, VALUE hash) -{ - static const char pat_source[] = - "\\A\\s*(-?\\d{4})-(\\d{2})-(\\d{2})" - "(?:t|\\s)" - "(\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?" - "(z|[-+]\\d{2}:\\d{2})\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - MATCH(str, pat, rfc3339_cb); -} - -VALUE -date__rfc3339(VALUE str) -{ - VALUE backref, hash; - - backref = rb_backref_get(); - rb_match_busy(backref); - - hash = rb_hash_new(); - rfc3339(str, hash); - rb_backref_set(backref); - return hash; -} - -#undef SNUM -#define SNUM 8 - -static int -xmlschema_datetime_cb(VALUE m, VALUE hash) -{ - VALUE s[SNUM + 1]; - - { - int i; - s[0] = Qnil; - for (i = 1; i <= SNUM; i++) - s[i] = rb_reg_nth_match(i, m); - } - - set_hash("year", str2num(s[1])); - if (!NIL_P(s[2])) - set_hash("mon", str2num(s[2])); - if (!NIL_P(s[3])) - set_hash("mday", str2num(s[3])); - if (!NIL_P(s[4])) - set_hash("hour", str2num(s[4])); - if (!NIL_P(s[5])) - set_hash("min", str2num(s[5])); - if (!NIL_P(s[6])) - set_hash("sec", str2num(s[6])); - if (!NIL_P(s[7])) - set_hash("sec_fraction", sec_fraction(s[7])); - if (!NIL_P(s[8])) { - set_hash("zone", s[8]); - set_hash("offset", date_zone_to_diff(s[8])); - } - - return 1; -} - -static int -xmlschema_datetime(VALUE str, VALUE hash) -{ - static const char pat_source[] = - "\\A\\s*(-?\\d{4,})(?:-(\\d{2})(?:-(\\d{2}))?)?" - "(?:t" - "(\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?)?" - "(z|[-+]\\d{2}:\\d{2})?\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - MATCH(str, pat, xmlschema_datetime_cb); -} - -#undef SNUM -#define SNUM 5 - -static int -xmlschema_time_cb(VALUE m, VALUE hash) -{ - VALUE s[SNUM + 1]; - - { - int i; - s[0] = Qnil; - for (i = 1; i <= SNUM; i++) - s[i] = rb_reg_nth_match(i, m); - } - - set_hash("hour", str2num(s[1])); - set_hash("min", str2num(s[2])); - if (!NIL_P(s[3])) - set_hash("sec", str2num(s[3])); - if (!NIL_P(s[4])) - set_hash("sec_fraction", sec_fraction(s[4])); - if (!NIL_P(s[5])) { - set_hash("zone", s[5]); - set_hash("offset", date_zone_to_diff(s[5])); - } - - return 1; -} - -static int -xmlschema_time(VALUE str, VALUE hash) -{ - static const char pat_source[] = - "\\A\\s*(\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?" - "(z|[-+]\\d{2}:\\d{2})?\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - MATCH(str, pat, xmlschema_time_cb); -} - -#undef SNUM -#define SNUM 4 - -static int -xmlschema_trunc_cb(VALUE m, VALUE hash) -{ - VALUE s[SNUM + 1]; - - { - int i; - s[0] = Qnil; - for (i = 1; i <= SNUM; i++) - s[i] = rb_reg_nth_match(i, m); - } - - if (!NIL_P(s[1])) - set_hash("mon", str2num(s[1])); - if (!NIL_P(s[2])) - set_hash("mday", str2num(s[2])); - if (!NIL_P(s[3])) - set_hash("mday", str2num(s[3])); - if (!NIL_P(s[4])) { - set_hash("zone", s[4]); - set_hash("offset", date_zone_to_diff(s[4])); - } - - return 1; -} - -static int -xmlschema_trunc(VALUE str, VALUE hash) -{ - static const char pat_source[] = - "\\A\\s*(?:--(\\d{2})(?:-(\\d{2}))?|---(\\d{2}))" - "(z|[-+]\\d{2}:\\d{2})?\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - MATCH(str, pat, xmlschema_trunc_cb); -} - -VALUE -date__xmlschema(VALUE str) -{ - VALUE backref, hash; - - backref = rb_backref_get(); - rb_match_busy(backref); - - hash = rb_hash_new(); - - if (xmlschema_datetime(str, hash)) - goto ok; - if (xmlschema_time(str, hash)) - goto ok; - if (xmlschema_trunc(str, hash)) - goto ok; - - ok: - rb_backref_set(backref); - - return hash; -} - -#undef SNUM -#define SNUM 8 - -static int -rfc2822_cb(VALUE m, VALUE hash) -{ - VALUE s[SNUM + 1], y; - - { - int i; - s[0] = Qnil; - for (i = 1; i <= SNUM; i++) - s[i] = rb_reg_nth_match(i, m); - } - - if (!NIL_P(s[1])) { - set_hash("wday", INT2FIX(day_num(s[1]))); - } - set_hash("mday", str2num(s[2])); - set_hash("mon", INT2FIX(mon_num(s[3]))); - y = str2num(s[4]); - if (RSTRING_LEN(s[4]) < 4) - y = comp_year50(y); - set_hash("year", y); - set_hash("hour", str2num(s[5])); - set_hash("min", str2num(s[6])); - if (!NIL_P(s[7])) - set_hash("sec", str2num(s[7])); - set_hash("zone", s[8]); - set_hash("offset", date_zone_to_diff(s[8])); - - return 1; -} - -static int -rfc2822(VALUE str, VALUE hash) -{ - static const char pat_source[] = - "\\A\\s*(?:(" ABBR_DAYS ")\\s*,\\s+)?" - "(\\d{1,2})\\s+" - "(" ABBR_MONTHS ")\\s+" - "(-?\\d{2,})\\s+" - "(\\d{2}):(\\d{2})(?::(\\d{2}))?\\s*" - "([-+]\\d{4}|ut|gmt|e[sd]t|c[sd]t|m[sd]t|p[sd]t|[a-ik-z])\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - MATCH(str, pat, rfc2822_cb); -} - -VALUE -date__rfc2822(VALUE str) -{ - VALUE backref, hash; - - backref = rb_backref_get(); - rb_match_busy(backref); - - hash = rb_hash_new(); - rfc2822(str, hash); - rb_backref_set(backref); - return hash; -} - -#undef SNUM -#define SNUM 8 - -static int -httpdate_type1_cb(VALUE m, VALUE hash) -{ - VALUE s[SNUM + 1]; - - { - int i; - s[0] = Qnil; - for (i = 1; i <= SNUM; i++) - s[i] = rb_reg_nth_match(i, m); - } - - set_hash("wday", INT2FIX(day_num(s[1]))); - set_hash("mday", str2num(s[2])); - set_hash("mon", INT2FIX(mon_num(s[3]))); - set_hash("year", str2num(s[4])); - set_hash("hour", str2num(s[5])); - set_hash("min", str2num(s[6])); - set_hash("sec", str2num(s[7])); - set_hash("zone", s[8]); - set_hash("offset", INT2FIX(0)); - - return 1; -} - -static int -httpdate_type1(VALUE str, VALUE hash) -{ - static const char pat_source[] = - "\\A\\s*(" ABBR_DAYS ")\\s*,\\s+" - "(\\d{2})\\s+" - "(" ABBR_MONTHS ")\\s+" - "(-?\\d{4})\\s+" - "(\\d{2}):(\\d{2}):(\\d{2})\\s+" - "(gmt)\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - MATCH(str, pat, httpdate_type1_cb); -} - -#undef SNUM -#define SNUM 8 - -static int -httpdate_type2_cb(VALUE m, VALUE hash) -{ - VALUE s[SNUM + 1], y; - - { - int i; - s[0] = Qnil; - for (i = 1; i <= SNUM; i++) - s[i] = rb_reg_nth_match(i, m); - } - - set_hash("wday", INT2FIX(day_num(s[1]))); - set_hash("mday", str2num(s[2])); - set_hash("mon", INT2FIX(mon_num(s[3]))); - y = str2num(s[4]); - if (f_ge_p(y, INT2FIX(0)) && f_le_p(y, INT2FIX(99))) - y = comp_year69(y); - set_hash("year", y); - set_hash("hour", str2num(s[5])); - set_hash("min", str2num(s[6])); - set_hash("sec", str2num(s[7])); - set_hash("zone", s[8]); - set_hash("offset", INT2FIX(0)); - - return 1; -} - -static int -httpdate_type2(VALUE str, VALUE hash) -{ - static const char pat_source[] = - "\\A\\s*(" DAYS ")\\s*,\\s+" - "(\\d{2})\\s*-\\s*" - "(" ABBR_MONTHS ")\\s*-\\s*" - "(\\d{2})\\s+" - "(\\d{2}):(\\d{2}):(\\d{2})\\s+" - "(gmt)\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - MATCH(str, pat, httpdate_type2_cb); -} - -#undef SNUM -#define SNUM 7 - -static int -httpdate_type3_cb(VALUE m, VALUE hash) -{ - VALUE s[SNUM + 1]; - - { - int i; - s[0] = Qnil; - for (i = 1; i <= SNUM; i++) - s[i] = rb_reg_nth_match(i, m); - } - - set_hash("wday", INT2FIX(day_num(s[1]))); - set_hash("mon", INT2FIX(mon_num(s[2]))); - set_hash("mday", str2num(s[3])); - set_hash("hour", str2num(s[4])); - set_hash("min", str2num(s[5])); - set_hash("sec", str2num(s[6])); - set_hash("year", str2num(s[7])); - - return 1; -} - -static int -httpdate_type3(VALUE str, VALUE hash) -{ - static const char pat_source[] = - "\\A\\s*(" ABBR_DAYS ")\\s+" - "(" ABBR_MONTHS ")\\s+" - "(\\d{1,2})\\s+" - "(\\d{2}):(\\d{2}):(\\d{2})\\s+" - "(\\d{4})\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - MATCH(str, pat, httpdate_type3_cb); -} - -VALUE -date__httpdate(VALUE str) -{ - VALUE backref, hash; - - backref = rb_backref_get(); - rb_match_busy(backref); - - hash = rb_hash_new(); - - if (httpdate_type1(str, hash)) - goto ok; - if (httpdate_type2(str, hash)) - goto ok; - if (httpdate_type3(str, hash)) - goto ok; - - ok: - rb_backref_set(backref); - - return hash; -} - -#undef SNUM -#define SNUM 9 - -static int -jisx0301_cb(VALUE m, VALUE hash) -{ - VALUE s[SNUM + 1]; - int ep; - - { - int i; - s[0] = Qnil; - for (i = 1; i <= SNUM; i++) - s[i] = rb_reg_nth_match(i, m); - } - - ep = gengo(NIL_P(s[1]) ? JISX0301_DEFAULT_ERA : *RSTRING_PTR(s[1])); - set_hash("year", f_add(str2num(s[2]), INT2FIX(ep))); - set_hash("mon", str2num(s[3])); - set_hash("mday", str2num(s[4])); - if (!NIL_P(s[5])) { - set_hash("hour", str2num(s[5])); - if (!NIL_P(s[6])) - set_hash("min", str2num(s[6])); - if (!NIL_P(s[7])) - set_hash("sec", str2num(s[7])); - } - if (!NIL_P(s[8])) - set_hash("sec_fraction", sec_fraction(s[8])); - if (!NIL_P(s[9])) { - set_hash("zone", s[9]); - set_hash("offset", date_zone_to_diff(s[9])); - } - - return 1; -} - -static int -jisx0301(VALUE str, VALUE hash) -{ - static const char pat_source[] = - "\\A\\s*([" JISX0301_ERA_INITIALS "])?(\\d{2})\\.(\\d{2})\\.(\\d{2})" - "(?:t" - "(?:(\\d{2}):(\\d{2})(?::(\\d{2})(?:[,.](\\d*))?)?" - "(z|[-+]\\d{2}(?::?\\d{2})?)?)?)?\\s*\\z"; - static VALUE pat = Qnil; - - REGCOMP_I(pat); - MATCH(str, pat, jisx0301_cb); -} - -VALUE -date__jisx0301(VALUE str) -{ - VALUE backref, hash; - - backref = rb_backref_get(); - rb_match_busy(backref); - - hash = rb_hash_new(); - if (jisx0301(str, hash)) - goto ok; - hash = date__iso8601(str); - - ok: - rb_backref_set(backref); - return hash; -} - -/* -Local variables: -c-file-style: "ruby" -End: -*/ diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_strftime.c b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_strftime.c deleted file mode 100644 index d7f2898..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_strftime.c +++ /dev/null @@ -1,638 +0,0 @@ -/* - date_strftime.c: based on a public-domain implementation of ANSI C - library routine strftime, which is originally written by Arnold - Robbins. - */ - -#include "ruby/ruby.h" -#include "date_tmx.h" - -#include -#include -#include -#include - -#if defined(HAVE_SYS_TIME_H) -#include -#endif - -#undef strchr /* avoid AIX weirdness */ - -#define range(low, item, hi) (item) - -#define add(x,y) (rb_funcall((x), '+', 1, (y))) -#define sub(x,y) (rb_funcall((x), '-', 1, (y))) -#define mul(x,y) (rb_funcall((x), '*', 1, (y))) -#define quo(x,y) (rb_funcall((x), rb_intern("quo"), 1, (y))) -#define div(x,y) (rb_funcall((x), rb_intern("div"), 1, (y))) -#define mod(x,y) (rb_funcall((x), '%', 1, (y))) - -static void -upcase(char *s, size_t i) -{ - do { - if (ISLOWER(*s)) - *s = TOUPPER(*s); - } while (s++, --i); -} - -static void -downcase(char *s, size_t i) -{ - do { - if (ISUPPER(*s)) - *s = TOLOWER(*s); - } while (s++, --i); -} - -/* strftime --- produce formatted time */ - -static size_t -date_strftime_with_tmx(char *s, const size_t maxsize, const char *format, - const struct tmx *tmx) -{ - char *endp = s + maxsize; - char *start = s; - const char *sp, *tp; - auto char tbuf[100]; - ptrdiff_t i; - int v, w; - size_t colons; - int precision, flags; - char padding; - /* LOCALE_[OE] and COLONS are actually modifiers, not flags */ - enum {LEFT, CHCASE, LOWER, UPPER, LOCALE_O, LOCALE_E, COLONS}; -#define BIT_OF(n) (1U<<(n)) - - /* various tables for locale C */ - static const char days_l[][10] = { - "Sunday", "Monday", "Tuesday", "Wednesday", - "Thursday", "Friday", "Saturday", - }; - static const char months_l[][10] = { - "January", "February", "March", "April", - "May", "June", "July", "August", "September", - "October", "November", "December", - }; - static const char ampm[][3] = { "AM", "PM", }; - - if (s == NULL || format == NULL || tmx == NULL || maxsize == 0) - return 0; - - /* quick check if we even need to bother */ - if (strchr(format, '%') == NULL && strlen(format) + 1 >= maxsize) { - err: - errno = ERANGE; - return 0; - } - - for (; *format && s < endp - 1; format++) { -#define FLAG_FOUND() do { \ - if (precision > 0 || flags & (BIT_OF(LOCALE_E) | BIT_OF(LOCALE_O) | BIT_OF(COLONS))) \ - goto unknown; \ - } while (0) -#define NEEDS(n) do if (s >= endp || (n) >= endp - s - 1) goto err; while (0) -#define FILL_PADDING(i) do { \ - if (!(flags & BIT_OF(LEFT)) && precision > (i)) { \ - NEEDS(precision); \ - memset(s, padding ? padding : ' ', precision - (i)); \ - s += precision - (i); \ - } \ - else { \ - NEEDS(i); \ - } \ - } while (0); -#define FMT(def_pad, def_prec, fmt, val) \ - do { \ - int l; \ - if (precision <= 0) precision = (def_prec); \ - if (flags & BIT_OF(LEFT)) precision = 1; \ - l = snprintf(s, endp - s, \ - ((padding == '0' || (!padding && (def_pad) == '0')) ? \ - "%0*"fmt : "%*"fmt), \ - precision, (val)); \ - if (l < 0) goto err; \ - s += l; \ - } while (0) -#define STRFTIME(fmt) \ - do { \ - i = date_strftime_with_tmx(s, endp - s, (fmt), tmx); \ - if (!i) return 0; \ - if (flags & BIT_OF(UPPER)) \ - upcase(s, i); \ - if (!(flags & BIT_OF(LEFT)) && precision > i) { \ - if (start + maxsize < s + precision) { \ - errno = ERANGE; \ - return 0; \ - } \ - memmove(s + precision - i, s, i); \ - memset(s, padding ? padding : ' ', precision - i); \ - s += precision; \ - } \ - else s += i; \ - } while (0) -#define FMTV(def_pad, def_prec, fmt, val) \ - do { \ - VALUE tmp = (val); \ - if (FIXNUM_P(tmp)) { \ - FMT((def_pad), (def_prec), "l"fmt, FIX2LONG(tmp)); \ - } \ - else { \ - VALUE args[2], result; \ - size_t l; \ - if (precision <= 0) precision = (def_prec); \ - if (flags & BIT_OF(LEFT)) precision = 1; \ - args[0] = INT2FIX(precision); \ - args[1] = (val); \ - if (padding == '0' || (!padding && (def_pad) == '0')) \ - result = rb_str_format(2, args, rb_str_new2("%0*"fmt)); \ - else \ - result = rb_str_format(2, args, rb_str_new2("%*"fmt)); \ - l = strlcpy(s, StringValueCStr(result), endp - s); \ - if ((size_t)(endp - s) <= l) \ - goto err; \ - s += l; \ - } \ - } while (0) - - if (*format != '%') { - *s++ = *format; - continue; - } - tp = tbuf; - sp = format; - precision = -1; - flags = 0; - padding = 0; - colons = 0; - again: - switch (*++format) { - case '\0': - format--; - goto unknown; - - case 'A': /* full weekday name */ - case 'a': /* abbreviated weekday name */ - if (flags & BIT_OF(CHCASE)) { - flags &= ~(BIT_OF(LOWER) | BIT_OF(CHCASE)); - flags |= BIT_OF(UPPER); - } - { - int wday = tmx_wday; - if (wday < 0 || wday > 6) - i = 1, tp = "?"; - else { - if (*format == 'A') - i = strlen(tp = days_l[wday]); - else - i = 3, tp = days_l[wday]; - } - } - break; - - case 'B': /* full month name */ - case 'b': /* abbreviated month name */ - case 'h': /* same as %b */ - if (flags & BIT_OF(CHCASE)) { - flags &= ~(BIT_OF(LOWER) | BIT_OF(CHCASE)); - flags |= BIT_OF(UPPER); - } - { - int mon = tmx_mon; - if (mon < 1 || mon > 12) - i = 1, tp = "?"; - else { - if (*format == 'B') - i = strlen(tp = months_l[mon - 1]); - else - i = 3, tp = months_l[mon - 1]; - } - } - break; - - case 'C': /* century (year/100) */ - FMTV('0', 2, "d", div(tmx_year, INT2FIX(100))); - continue; - - case 'c': /* appropriate date and time representation */ - STRFTIME("%a %b %e %H:%M:%S %Y"); - continue; - - case 'D': - STRFTIME("%m/%d/%y"); - continue; - - case 'd': /* day of the month, 01 - 31 */ - case 'e': /* day of month, blank padded */ - v = range(1, tmx_mday, 31); - FMT((*format == 'd') ? '0' : ' ', 2, "d", v); - continue; - - case 'F': - STRFTIME("%Y-%m-%d"); - continue; - - case 'G': /* year of ISO week with century */ - case 'Y': /* year with century */ - { - VALUE year = (*format == 'G') ? tmx_cwyear : tmx_year; - if (FIXNUM_P(year)) { - long y = FIX2LONG(year); - FMT('0', 0 <= y ? 4 : 5, "ld", y); - } - else { - FMTV('0', 4, "d", year); - } - } - continue; - - case 'g': /* year of ISO week without a century */ - case 'y': /* year without a century */ - v = NUM2INT(mod((*format == 'g') ? tmx_cwyear : tmx_year, INT2FIX(100))); - FMT('0', 2, "d", v); - continue; - - case 'H': /* hour, 24-hour clock, 00 - 23 */ - case 'k': /* hour, 24-hour clock, blank pad */ - v = range(0, tmx_hour, 23); - FMT((*format == 'H') ? '0' : ' ', 2, "d", v); - continue; - - case 'I': /* hour, 12-hour clock, 01 - 12 */ - case 'l': /* hour, 12-hour clock, 1 - 12, blank pad */ - v = range(0, tmx_hour, 23); - if (v == 0) - v = 12; - else if (v > 12) - v -= 12; - FMT((*format == 'I') ? '0' : ' ', 2, "d", v); - continue; - - case 'j': /* day of the year, 001 - 366 */ - v = range(1, tmx_yday, 366); - FMT('0', 3, "d", v); - continue; - - case 'L': /* millisecond */ - case 'N': /* nanosecond */ - if (*format == 'L') - w = 3; - else - w = 9; - if (precision <= 0) - precision = w; - NEEDS(precision); - - { - VALUE subsec = tmx_sec_fraction; - int ww; - long n; - - ww = precision; - while (9 <= ww) { - subsec = mul(subsec, INT2FIX(1000000000)); - ww -= 9; - } - n = 1; - for (; 0 < ww; ww--) - n *= 10; - if (n != 1) - subsec = mul(subsec, INT2FIX(n)); - subsec = div(subsec, INT2FIX(1)); - - if (FIXNUM_P(subsec)) { - (void)snprintf(s, endp - s, "%0*ld", - precision, FIX2LONG(subsec)); - s += precision; - } - else { - VALUE args[2], result; - args[0] = INT2FIX(precision); - args[1] = subsec; - result = rb_str_format(2, args, rb_str_new2("%0*d")); - (void)strlcpy(s, StringValueCStr(result), endp - s); - s += precision; - } - } - continue; - - case 'M': /* minute, 00 - 59 */ - v = range(0, tmx_min, 59); - FMT('0', 2, "d", v); - continue; - - case 'm': /* month, 01 - 12 */ - v = range(1, tmx_mon, 12); - FMT('0', 2, "d", v); - continue; - - case 'n': /* same as \n */ - FILL_PADDING(1); - *s++ = '\n'; - continue; - - case 't': /* same as \t */ - FILL_PADDING(1); - *s++ = '\t'; - continue; - - case 'P': /* am or pm based on 12-hour clock */ - case 'p': /* AM or PM based on 12-hour clock */ - if ((*format == 'p' && (flags & BIT_OF(CHCASE))) || - (*format == 'P' && !(flags & (BIT_OF(CHCASE) | BIT_OF(UPPER))))) { - flags &= ~(BIT_OF(UPPER) | BIT_OF(CHCASE)); - flags |= BIT_OF(LOWER); - } - v = range(0, tmx_hour, 23); - if (v < 12) - tp = ampm[0]; - else - tp = ampm[1]; - i = 2; - break; - - case 'Q': /* milliseconds since Unix epoch */ - FMTV('0', 1, "d", tmx_msecs); - continue; - - case 'R': - STRFTIME("%H:%M"); - continue; - - case 'r': - STRFTIME("%I:%M:%S %p"); - continue; - - case 'S': /* second, 00 - 59 */ - v = range(0, tmx_sec, 59); - FMT('0', 2, "d", v); - continue; - - case 's': /* seconds since Unix epoch */ - FMTV('0', 1, "d", tmx_secs); - continue; - - case 'T': - STRFTIME("%H:%M:%S"); - continue; - - case 'U': /* week of year, Sunday is first day of week */ - case 'W': /* week of year, Monday is first day of week */ - v = range(0, (*format == 'U') ? tmx_wnum0 : tmx_wnum1, 53); - FMT('0', 2, "d", v); - continue; - - case 'u': /* weekday, Monday == 1, 1 - 7 */ - v = range(1, tmx_cwday, 7); - FMT('0', 1, "d", v); - continue; - - case 'V': /* week of year according ISO 8601 */ - v = range(1, tmx_cweek, 53); - FMT('0', 2, "d", v); - continue; - - case 'v': - STRFTIME("%e-%^b-%Y"); - continue; - - case 'w': /* weekday, Sunday == 0, 0 - 6 */ - v = range(0, tmx_wday, 6); - FMT('0', 1, "d", v); - continue; - - case 'X': /* appropriate time representation */ - STRFTIME("%H:%M:%S"); - continue; - - case 'x': /* appropriate date representation */ - STRFTIME("%m/%d/%y"); - continue; - - case 'Z': /* time zone name or abbreviation */ - if (flags & BIT_OF(CHCASE)) { - flags &= ~(BIT_OF(UPPER) | BIT_OF(CHCASE)); - flags |= BIT_OF(LOWER); - } - { - char *zone = tmx_zone; - if (zone == NULL) - tp = ""; - else - tp = zone; - i = strlen(tp); - } - break; - - case 'z': /* offset from UTC */ - { - long off, aoff; - int hl, hw; - - off = tmx_offset; - aoff = off; - if (aoff < 0) - aoff = -off; - - if ((aoff / 3600) < 10) - hl = 1; - else - hl = 2; - hw = 2; - if (flags & BIT_OF(LEFT) && hl == 1) - hw = 1; - - switch (colons) { - case 0: /* %z -> +hhmm */ - precision = precision <= (3 + hw) ? hw : precision - 3; - NEEDS(precision + 3); - break; - - case 1: /* %:z -> +hh:mm */ - precision = precision <= (4 + hw) ? hw : precision - 4; - NEEDS(precision + 4); - break; - - case 2: /* %::z -> +hh:mm:ss */ - precision = precision <= (7 + hw) ? hw : precision - 7; - NEEDS(precision + 7); - break; - - case 3: /* %:::z -> +hh[:mm[:ss]] */ - { - if (aoff % 3600 == 0) { - precision = precision <= (1 + hw) ? - hw : precision - 1; - NEEDS(precision + 3); - } - else if (aoff % 60 == 0) { - precision = precision <= (4 + hw) ? - hw : precision - 4; - NEEDS(precision + 4); - } - else { - precision = precision <= (7 + hw) ? - hw : precision - 7; - NEEDS(precision + 7); - } - } - break; - - default: - format--; - goto unknown; - } - if (padding == ' ' && precision > hl) { - i = snprintf(s, endp - s, "%*s", precision - hl, ""); - precision = hl; - if (i < 0) goto err; - s += i; - } - if (off < 0) { - off = -off; - *s++ = '-'; - } else { - *s++ = '+'; - } - i = snprintf(s, endp - s, "%.*ld", precision, off / 3600); - if (i < 0) goto err; - s += i; - off = off % 3600; - if (colons == 3 && off == 0) - continue; - if (1 <= colons) - *s++ = ':'; - i = snprintf(s, endp - s, "%02d", (int)(off / 60)); - if (i < 0) goto err; - s += i; - off = off % 60; - if (colons == 3 && off == 0) - continue; - if (2 <= colons) { - *s++ = ':'; - i = snprintf(s, endp - s, "%02d", (int)off); - if (i < 0) goto err; - s += i; - } - } - continue; - - case '+': - STRFTIME("%a %b %e %H:%M:%S %Z %Y"); - continue; - - case 'E': - /* POSIX locale extensions, ignored for now */ - flags |= BIT_OF(LOCALE_E); - if (*(format + 1) && strchr("cCxXyY", *(format + 1))) - goto again; - goto unknown; - case 'O': - /* POSIX locale extensions, ignored for now */ - flags |= BIT_OF(LOCALE_O); - if (*(format + 1) && strchr("deHkIlmMSuUVwWy", *(format + 1))) - goto again; - goto unknown; - - case ':': - flags |= BIT_OF(COLONS); - { - size_t l = strspn(format, ":"); - format += l; - if (*format == 'z') { - colons = l; - format--; - goto again; - } - format -= l; - } - goto unknown; - - case '_': - FLAG_FOUND(); - padding = ' '; - goto again; - - case '-': - FLAG_FOUND(); - flags |= BIT_OF(LEFT); - goto again; - - case '^': - FLAG_FOUND(); - flags |= BIT_OF(UPPER); - goto again; - - case '#': - FLAG_FOUND(); - flags |= BIT_OF(CHCASE); - goto again; - - case '0': - FLAG_FOUND(); - padding = '0'; - case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - { - char *e; - unsigned long prec = strtoul(format, &e, 10); - if (prec > INT_MAX || prec > maxsize) { - errno = ERANGE; - return 0; - } - precision = (int)prec; - format = e - 1; - goto again; - } - - case '%': - FILL_PADDING(1); - *s++ = '%'; - continue; - - default: - unknown: - i = format - sp + 1; - tp = sp; - precision = -1; - flags = 0; - padding = 0; - colons = 0; - break; - } - if (i) { - FILL_PADDING(i); - memcpy(s, tp, i); - switch (flags & (BIT_OF(UPPER) | BIT_OF(LOWER))) { - case BIT_OF(UPPER): - upcase(s, i); - break; - case BIT_OF(LOWER): - downcase(s, i); - break; - } - s += i; - } - } - if (s >= endp) { - goto err; - } - if (*format == '\0') { - *s = '\0'; - return (s - start); - } - return 0; -} - -size_t -date_strftime(char *s, size_t maxsize, const char *format, - const struct tmx *tmx) -{ - return date_strftime_with_tmx(s, maxsize, format, tmx); -} - -/* -Local variables: -c-file-style: "ruby" -End: -*/ diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_strptime.c b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_strptime.c deleted file mode 100644 index da58c21..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_strptime.c +++ /dev/null @@ -1,703 +0,0 @@ -/* - date_strptime.c: Coded by Tadayoshi Funaba 2011,2012 -*/ - -#include "ruby.h" -#include "ruby/encoding.h" -#include "ruby/re.h" -#include - -#undef strncasecmp -#define strncasecmp STRNCASECMP - -static const char *day_names[] = { - "Sunday", "Monday", "Tuesday", "Wednesday", - "Thursday", "Friday", "Saturday", -}; -static const int ABBREVIATED_DAY_NAME_LENGTH = 3; - -static const char *month_names[] = { - "January", "February", "March", "April", - "May", "June", "July", "August", "September", - "October", "November", "December", -}; -static const int ABBREVIATED_MONTH_NAME_LENGTH = 3; - -#define sizeof_array(o) (sizeof o / sizeof o[0]) - -#define f_negate(x) rb_funcall(x, rb_intern("-@"), 0) -#define f_add(x,y) rb_funcall(x, '+', 1, y) -#define f_sub(x,y) rb_funcall(x, '-', 1, y) -#define f_mul(x,y) rb_funcall(x, '*', 1, y) -#define f_div(x,y) rb_funcall(x, '/', 1, y) -#define f_idiv(x,y) rb_funcall(x, rb_intern("div"), 1, y) -#define f_mod(x,y) rb_funcall(x, '%', 1, y) -#define f_expt(x,y) rb_funcall(x, rb_intern("**"), 1, y) - -#define f_lt_p(x,y) rb_funcall(x, '<', 1, y) -#define f_gt_p(x,y) rb_funcall(x, '>', 1, y) -#define f_le_p(x,y) rb_funcall(x, rb_intern("<="), 1, y) -#define f_ge_p(x,y) rb_funcall(x, rb_intern(">="), 1, y) - -#define f_match(r,s) rb_funcall(r, rb_intern("match"), 1, s) -#define f_aref(o,i) rb_funcall(o, rb_intern("[]"), 1, i) -#define f_end(o,i) rb_funcall(o, rb_intern("end"), 1, i) - -#define issign(c) ((c) == '-' || (c) == '+') - -static int -num_pattern_p(const char *s) -{ - if (isdigit((unsigned char)*s)) - return 1; - if (*s == '%') { - s++; - if (*s == 'E' || *s == 'O') - s++; - if (*s && - (strchr("CDdeFGgHIjkLlMmNQRrSsTUuVvWwXxYy", *s) || - isdigit((unsigned char)*s))) - return 1; - } - return 0; -} - -#define NUM_PATTERN_P() num_pattern_p(&fmt[fi + 1]) - -static long -read_digits(const char *s, size_t slen, VALUE *n, size_t width) -{ - size_t l; - - if (!width) - return 0; - - l = 0; - while (l < slen && ISDIGIT(s[l])) { - if (++l == width) break; - } - - if (l == 0) - return 0; - - if ((4 * l * sizeof(char)) <= (sizeof(long)*CHAR_BIT)) { - const char *os = s; - long v; - - v = 0; - while ((size_t)(s - os) < l) { - v *= 10; - v += *s - '0'; - s++; - } - if (os == s) - return 0; - *n = LONG2NUM(v); - return l; - } - else { - VALUE vbuf = 0; - char *s2 = ALLOCV_N(char, vbuf, l + 1); - memcpy(s2, s, l); - s2[l] = '\0'; - *n = rb_cstr_to_inum(s2, 10, 0); - ALLOCV_END(vbuf); - return l; - } -} - -#define set_hash(k,v) rb_hash_aset(hash, ID2SYM(rb_intern(k"")), v) -#define ref_hash(k) rb_hash_aref(hash, ID2SYM(rb_intern(k""))) -#define del_hash(k) rb_hash_delete(hash, ID2SYM(rb_intern(k""))) - -#define fail() \ -do { \ - set_hash("_fail", Qtrue); \ - return 0; \ -} while (0) - -#define fail_p() (!NIL_P(ref_hash("_fail"))) - -#define READ_DIGITS(n,w) \ -do { \ - size_t l; \ - l = read_digits(&str[si], slen - si, &n, w); \ - if (l == 0) \ - fail(); \ - si += l; \ -} while (0) - -#define READ_DIGITS_MAX(n) READ_DIGITS(n, LONG_MAX) - -static int -valid_range_p(VALUE v, int a, int b) -{ - if (FIXNUM_P(v)) { - int vi = FIX2INT(v); - return !(vi < a || vi > b); - } - return !(f_lt_p(v, INT2NUM(a)) || f_gt_p(v, INT2NUM(b))); -} - -#define recur(fmt) \ -do { \ - size_t l; \ - l = date__strptime_internal(&str[si], slen - si, \ - fmt, sizeof fmt - 1, hash); \ - if (fail_p()) \ - return 0; \ - si += l; \ -} while (0) - -VALUE date_zone_to_diff(VALUE); - -static inline int -head_match_p(size_t len, const char *name, const char *str, size_t slen, size_t si) -{ - return slen - si >= len && strncasecmp(name, &str[si], len) == 0; -} - -static size_t -date__strptime_internal(const char *str, size_t slen, - const char *fmt, size_t flen, VALUE hash) -{ - size_t si, fi; - int c; - -#define HEAD_MATCH_P(len, name) head_match_p(len, name, str, slen, si) - si = fi = 0; - - while (fi < flen) { - if (isspace((unsigned char)fmt[fi])) { - while (si < slen && isspace((unsigned char)str[si])) - si++; - while (++fi < flen && isspace((unsigned char)fmt[fi])); - continue; - } - - if (si >= slen) fail(); - - switch (fmt[fi]) { - case '%': - - again: - fi++; - c = fmt[fi]; - - switch (c) { - case 'E': - if (fmt[fi + 1] && strchr("cCxXyY", fmt[fi + 1])) - goto again; - fi--; - goto ordinal; - case 'O': - if (fmt[fi + 1] && strchr("deHImMSuUVwWy", fmt[fi + 1])) - goto again; - fi--; - goto ordinal; - case ':': - { - int i; - - for (i = 1; i < 3 && fi + i < flen && fmt[fi+i] == ':'; ++i); - if (fmt[fi+i] == 'z') { - fi += i - 1; - goto again; - } - fail(); - } - - case 'A': - case 'a': - { - int i; - - for (i = 0; i < (int)sizeof_array(day_names); i++) { - const char *day_name = day_names[i]; - size_t l = strlen(day_name); - if (HEAD_MATCH_P(l, day_name) || - HEAD_MATCH_P(l = ABBREVIATED_DAY_NAME_LENGTH, day_name)) { - si += l; - set_hash("wday", INT2FIX(i)); - goto matched; - } - } - fail(); - } - case 'B': - case 'b': - case 'h': - { - int i; - - for (i = 0; i < (int)sizeof_array(month_names); i++) { - const char *month_name = month_names[i]; - size_t l = strlen(month_name); - if (HEAD_MATCH_P(l, month_name) || - HEAD_MATCH_P(l = ABBREVIATED_MONTH_NAME_LENGTH, month_name)) { - si += l; - set_hash("mon", INT2FIX(i + 1)); - goto matched; - } - } - fail(); - } - - case 'C': - { - VALUE n; - - if (NUM_PATTERN_P()) - READ_DIGITS(n, 2); - else - READ_DIGITS_MAX(n); - set_hash("_cent", n); - goto matched; - } - - case 'c': - recur("%a %b %e %H:%M:%S %Y"); - goto matched; - - case 'D': - recur("%m/%d/%y"); - goto matched; - - case 'd': - case 'e': - { - VALUE n; - - if (str[si] == ' ') { - si++; - READ_DIGITS(n, 1); - } else { - READ_DIGITS(n, 2); - } - if (!valid_range_p(n, 1, 31)) - fail(); - set_hash("mday", n); - goto matched; - } - - case 'F': - recur("%Y-%m-%d"); - goto matched; - - case 'G': - { - VALUE n; - - if (NUM_PATTERN_P()) - READ_DIGITS(n, 4); - else - READ_DIGITS_MAX(n); - set_hash("cwyear", n); - goto matched; - } - - case 'g': - { - VALUE n; - - READ_DIGITS(n, 2); - if (!valid_range_p(n, 0, 99)) - fail(); - set_hash("cwyear",n); - if (NIL_P(ref_hash("_cent"))) - set_hash("_cent", - INT2FIX(f_ge_p(n, INT2FIX(69)) ? 19 : 20)); - goto matched; - } - - case 'H': - case 'k': - { - VALUE n; - - if (str[si] == ' ') { - si++; - READ_DIGITS(n, 1); - } else { - READ_DIGITS(n, 2); - } - if (!valid_range_p(n, 0, 24)) - fail(); - set_hash("hour", n); - goto matched; - } - - case 'I': - case 'l': - { - VALUE n; - - if (str[si] == ' ') { - si++; - READ_DIGITS(n, 1); - } else { - READ_DIGITS(n, 2); - } - if (!valid_range_p(n, 1, 12)) - fail(); - set_hash("hour", n); - goto matched; - } - - case 'j': - { - VALUE n; - - READ_DIGITS(n, 3); - if (!valid_range_p(n, 1, 366)) - fail(); - set_hash("yday", n); - goto matched; - } - - case 'L': - case 'N': - { - VALUE n; - int sign = 1; - size_t osi; - - if (issign(str[si])) { - if (str[si] == '-') - sign = -1; - si++; - } - osi = si; - if (NUM_PATTERN_P()) - READ_DIGITS(n, c == 'L' ? 3 : 9); - else - READ_DIGITS_MAX(n); - if (sign == -1) - n = f_negate(n); - set_hash("sec_fraction", - rb_rational_new2(n, - f_expt(INT2FIX(10), - ULONG2NUM(si - osi)))); - goto matched; - } - - case 'M': - { - VALUE n; - - READ_DIGITS(n, 2); - if (!valid_range_p(n, 0, 59)) - fail(); - set_hash("min", n); - goto matched; - } - - case 'm': - { - VALUE n; - - READ_DIGITS(n, 2); - if (!valid_range_p(n, 1, 12)) - fail(); - set_hash("mon", n); - goto matched; - } - - case 'n': - case 't': - recur(" "); - goto matched; - - case 'P': - case 'p': - if (slen - si < 2) fail(); - { - char c = str[si]; - const int hour = (c == 'P' || c == 'p') ? 12 : 0; - if (!hour && !(c == 'A' || c == 'a')) fail(); - if ((c = str[si+1]) == '.') { - if (slen - si < 4 || str[si+3] != '.') fail(); - c = str[si += 2]; - } - if (!(c == 'M' || c == 'm')) fail(); - si += 2; - set_hash("_merid", INT2FIX(hour)); - goto matched; - } - - case 'Q': - { - VALUE n; - int sign = 1; - - if (str[si] == '-') { - sign = -1; - si++; - } - READ_DIGITS_MAX(n); - if (sign == -1) - n = f_negate(n); - set_hash("seconds", - rb_rational_new2(n, INT2FIX(1000))); - goto matched; - } - - case 'R': - recur("%H:%M"); - goto matched; - - case 'r': - recur("%I:%M:%S %p"); - goto matched; - - case 'S': - { - VALUE n; - - READ_DIGITS(n, 2); - if (!valid_range_p(n, 0, 60)) - fail(); - set_hash("sec", n); - goto matched; - } - - case 's': - { - VALUE n; - int sign = 1; - - if (str[si] == '-') { - sign = -1; - si++; - } - READ_DIGITS_MAX(n); - if (sign == -1) - n = f_negate(n); - set_hash("seconds", n); - goto matched; - } - - case 'T': - recur("%H:%M:%S"); - goto matched; - - case 'U': - case 'W': - { - VALUE n; - - READ_DIGITS(n, 2); - if (!valid_range_p(n, 0, 53)) - fail(); - set_hash(c == 'U' ? "wnum0" : "wnum1", n); - goto matched; - } - - case 'u': - { - VALUE n; - - READ_DIGITS(n, 1); - if (!valid_range_p(n, 1, 7)) - fail(); - set_hash("cwday", n); - goto matched; - } - - case 'V': - { - VALUE n; - - READ_DIGITS(n, 2); - if (!valid_range_p(n, 1, 53)) - fail(); - set_hash("cweek", n); - goto matched; - } - - case 'v': - recur("%e-%b-%Y"); - goto matched; - - case 'w': - { - VALUE n; - - READ_DIGITS(n, 1); - if (!valid_range_p(n, 0, 6)) - fail(); - set_hash("wday", n); - goto matched; - } - - case 'X': - recur("%H:%M:%S"); - goto matched; - - case 'x': - recur("%m/%d/%y"); - goto matched; - - case 'Y': - { - VALUE n; - int sign = 1; - - if (issign(str[si])) { - if (str[si] == '-') - sign = -1; - si++; - } - if (NUM_PATTERN_P()) - READ_DIGITS(n, 4); - else - READ_DIGITS_MAX(n); - if (sign == -1) - n = f_negate(n); - set_hash("year", n); - goto matched; - } - - case 'y': - { - VALUE n; - int sign = 1; - - READ_DIGITS(n, 2); - if (!valid_range_p(n, 0, 99)) - fail(); - if (sign == -1) - n = f_negate(n); - set_hash("year", n); - if (NIL_P(ref_hash("_cent"))) - set_hash("_cent", - INT2FIX(f_ge_p(n, INT2FIX(69)) ? 19 : 20)); - goto matched; - } - - case 'Z': - case 'z': - { - static const char pat_source[] = - "\\A(" - "(?:gmt|utc?)?[-+]\\d+(?:[,.:]\\d+(?::\\d+)?)?" - "|(?-i:[[:alpha:].\\s]+)(?:standard|daylight)\\s+time\\b" - "|(?-i:[[:alpha:]]+)(?:\\s+dst)?\\b" - ")"; - static VALUE pat = Qnil; - VALUE m, b; - - if (NIL_P(pat)) { - pat = rb_reg_new(pat_source, sizeof pat_source - 1, - ONIG_OPTION_IGNORECASE); - rb_obj_freeze(pat); - rb_gc_register_mark_object(pat); - } - - b = rb_backref_get(); - rb_match_busy(b); - m = f_match(pat, rb_usascii_str_new(&str[si], slen - si)); - - if (!NIL_P(m)) { - VALUE s, l, o; - - s = rb_reg_nth_match(1, m); - l = f_end(m, INT2FIX(0)); - o = date_zone_to_diff(s); - si += NUM2LONG(l); - set_hash("zone", s); - set_hash("offset", o); - rb_backref_set(b); - goto matched; - } - rb_backref_set(b); - fail(); - } - - case '%': - if (str[si] != '%') - fail(); - si++; - goto matched; - - case '+': - recur("%a %b %e %H:%M:%S %Z %Y"); - goto matched; - - default: - if (str[si] != '%') - fail(); - si++; - if (fi < flen) { - if (si >= slen || str[si] != fmt[fi]) - fail(); - si++; - } - goto matched; - } - default: - ordinal: - if (str[si] != fmt[fi]) - fail(); - si++; - fi++; - break; - matched: - fi++; - break; - } - } - - return si; -} - -VALUE -date__strptime(const char *str, size_t slen, - const char *fmt, size_t flen, VALUE hash) -{ - size_t si; - VALUE cent, merid; - - si = date__strptime_internal(str, slen, fmt, flen, hash); - - if (slen > si) { - VALUE s; - - s = rb_usascii_str_new(&str[si], slen - si); - set_hash("leftover", s); - } - - if (fail_p()) - return Qnil; - - cent = del_hash("_cent"); - if (!NIL_P(cent)) { - VALUE year; - - year = ref_hash("cwyear"); - if (!NIL_P(year)) - set_hash("cwyear", f_add(year, f_mul(cent, INT2FIX(100)))); - year = ref_hash("year"); - if (!NIL_P(year)) - set_hash("year", f_add(year, f_mul(cent, INT2FIX(100)))); - } - - merid = del_hash("_merid"); - if (!NIL_P(merid)) { - VALUE hour; - - hour = ref_hash("hour"); - if (!NIL_P(hour)) { - hour = f_mod(hour, INT2FIX(12)); - set_hash("hour", f_add(hour, merid)); - } - } - - return hash; -} - -/* -Local variables: -c-file-style: "ruby" -End: -*/ diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_tmx.h b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_tmx.h deleted file mode 100644 index 993a153..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_tmx.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef DATE_TMX_H -#define DATE_TMX_H - -struct tmx_funcs { - VALUE (*year)(void *dat); - int (*yday)(void *dat); - int (*mon)(void *dat); - int (*mday)(void *dat); - VALUE (*cwyear)(void *dat); - int (*cweek)(void *dat); - int (*cwday)(void *dat); - int (*wnum0)(void *dat); - int (*wnum1)(void *dat); - int (*wday)(void *dat); - int (*hour)(void *dat); - int (*min)(void *dat); - int (*sec)(void *dat); - VALUE (*sec_fraction)(void *dat); - VALUE (*secs)(void *dat); - VALUE (*msecs)(void *dat); - int (*offset)(void *dat); - char *(*zone)(void *dat); -}; -struct tmx { - void *dat; - const struct tmx_funcs *funcs; -}; - -#define tmx_attr(x) (tmx->funcs->x)(tmx->dat) - -#define tmx_year tmx_attr(year) -#define tmx_yday tmx_attr(yday) -#define tmx_mon tmx_attr(mon) -#define tmx_mday tmx_attr(mday) -#define tmx_cwyear tmx_attr(cwyear) -#define tmx_cweek tmx_attr(cweek) -#define tmx_cwday tmx_attr(cwday) -#define tmx_wnum0 tmx_attr(wnum0) -#define tmx_wnum1 tmx_attr(wnum1) -#define tmx_wday tmx_attr(wday) -#define tmx_hour tmx_attr(hour) -#define tmx_min tmx_attr(min) -#define tmx_sec tmx_attr(sec) -#define tmx_sec_fraction tmx_attr(sec_fraction) -#define tmx_secs tmx_attr(secs) -#define tmx_msecs tmx_attr(msecs) -#define tmx_offset tmx_attr(offset) -#define tmx_zone tmx_attr(zone) - -#endif - -/* -Local variables: -c-file-style: "ruby" -End: -*/ diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/extconf.rb b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/extconf.rb deleted file mode 100644 index 8a1467d..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/extconf.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true -require 'mkmf' - -config_string("strict_warnflags") {|w| $warnflags += " #{w}"} - -append_cflags("-Wno-compound-token-split-by-macro") if RUBY_VERSION < "2.7." -have_func("rb_category_warn") -with_werror("", {:werror => true}) do |opt, | - have_var("timezone", "time.h", opt) - have_var("altzone", "time.h", opt) -end - -create_makefile('date_core') diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/prereq.mk b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/prereq.mk deleted file mode 100644 index b5d271a..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/prereq.mk +++ /dev/null @@ -1,19 +0,0 @@ -.SUFFIXES: .list - -.list.h: - gperf --ignore-case -L ANSI-C -C -c -P -p -j1 -i 1 -g -o -t -N $(*F) $< \ - | sed -f $(top_srcdir)/tool/gperf.sed \ - > $(@F) - -zonetab.h: zonetab.list - -.PHONY: update-zonetab -update-zonetab: - $(RUBY) -C $(srcdir) update-abbr - -.PHONY: update-nothing -update-nothing: - -update = nothing - -zonetab.list: update-$(update) diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/zonetab.h b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/zonetab.h deleted file mode 100644 index 2a2e891..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/zonetab.h +++ /dev/null @@ -1,1564 +0,0 @@ -/* ANSI-C code produced by gperf version 3.1 */ -/* Command-line: gperf --ignore-case -L ANSI-C -C -c -P -p -j1 -i 1 -g -o -t -N zonetab zonetab.list */ -/* Computed positions: -k'1-4,9' */ - -#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ - && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ - && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ - && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ - && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ - && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ - && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ - && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ - && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ - && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ - && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ - && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ - && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ - && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ - && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ - && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ - && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ - && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ - && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ - && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ - && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ - && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ - && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) -/* The character set is not based on ISO-646. */ -#error "gperf generated tables don't work with this execution character set. Please report a bug to ." -#endif - -#line 1 "zonetab.list" - -#define GPERF_DOWNCASE 1 -#define GPERF_CASE_STRNCMP 1 -#define gperf_case_strncmp strncasecmp -struct zone { - int name; - int offset; -}; -static const struct zone *zonetab(register const char *str, register size_t len); -#line 12 "zonetab.list" -struct zone; - -#define TOTAL_KEYWORDS 316 -#define MIN_WORD_LENGTH 1 -#define MAX_WORD_LENGTH 17 -#define MIN_HASH_VALUE 2 -#define MAX_HASH_VALUE 619 -/* maximum key range = 618, duplicates = 0 */ - -#ifndef GPERF_DOWNCASE -#define GPERF_DOWNCASE 1 -static unsigned char gperf_downcase[256] = - { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255 - }; -#endif - -#ifndef GPERF_CASE_STRNCMP -#define GPERF_CASE_STRNCMP 1 -static int -gperf_case_strncmp (register const char *s1, register const char *s2, register size_t n) -{ - for (; n > 0;) - { - unsigned char c1 = gperf_downcase[(unsigned char)*s1++]; - unsigned char c2 = gperf_downcase[(unsigned char)*s2++]; - if (c1 != 0 && c1 == c2) - { - n--; - continue; - } - return (int)c1 - (int)c2; - } - return 0; -} -#endif - -#ifdef __GNUC__ -__inline -#else -#ifdef __cplusplus -inline -#endif -#endif -static unsigned int -hash (register const char *str, register size_t len) -{ - static const unsigned short asso_values[] = - { - 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 17, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 3, 2, 620, 620, 620, - 620, 620, 70, 8, 3, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 39, 176, 207, 70, 168, - 1, 5, 18, 74, 218, 2, 117, 130, 48, 88, - 125, 225, 92, 1, 1, 12, 54, 30, 36, 13, - 48, 168, 263, 59, 114, 166, 109, 39, 176, 207, - 70, 168, 1, 5, 18, 74, 218, 2, 117, 130, - 48, 88, 125, 225, 92, 1, 1, 12, 54, 30, - 36, 13, 48, 168, 263, 59, 114, 166, 109, 27, - 104, 1, 9, 4, 309, 190, 188, 177, 255, 108, - 2, 341, 3, 620, 620, 620, 620, 620, 620, 12, - 54, 30, 36, 13, 48, 168, 263, 59, 114, 166, - 109, 27, 104, 1, 9, 4, 309, 190, 188, 177, - 255, 108, 2, 341, 3, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, - 620, 620, 620, 620, 620, 620, 620, 620 - }; - register unsigned int hval = (unsigned int)len; - - switch (hval) - { - default: - hval += asso_values[(unsigned char)str[8]]; - /*FALLTHROUGH*/ - case 8: - case 7: - case 6: - case 5: - case 4: - hval += asso_values[(unsigned char)str[3]]; - /*FALLTHROUGH*/ - case 3: - hval += asso_values[(unsigned char)str[2]]; - /*FALLTHROUGH*/ - case 2: - hval += asso_values[(unsigned char)str[1]+6]; - /*FALLTHROUGH*/ - case 1: - hval += asso_values[(unsigned char)str[0]+52]; - break; - } - return (unsigned int)hval; -} - -struct stringpool_t - { - char stringpool_str2[sizeof("o")]; - char stringpool_str3[sizeof("x")]; - char stringpool_str4[sizeof("z")]; - char stringpool_str5[sizeof("q")]; - char stringpool_str8[sizeof("omst")]; - char stringpool_str9[sizeof("omsst")]; - char stringpool_str10[sizeof("p")]; - char stringpool_str13[sizeof("a")]; - char stringpool_str14[sizeof("e")]; - char stringpool_str15[sizeof("pet")]; - char stringpool_str16[sizeof("pmst")]; - char stringpool_str17[sizeof("pett")]; - char stringpool_str18[sizeof("petst")]; - char stringpool_str19[sizeof("eet")]; - char stringpool_str20[sizeof("aest")]; - char stringpool_str21[sizeof("eest")]; - char stringpool_str22[sizeof("eat")]; - char stringpool_str24[sizeof("east")]; - char stringpool_str25[sizeof("easst")]; - char stringpool_str26[sizeof("pst")]; - char stringpool_str27[sizeof("eastern")]; - char stringpool_str28[sizeof("m")]; - char stringpool_str29[sizeof("ast")]; - char stringpool_str30[sizeof("est")]; - char stringpool_str31[sizeof("c")]; - char stringpool_str32[sizeof("mmt")]; - char stringpool_str33[sizeof("met")]; - char stringpool_str35[sizeof("mest")]; - char stringpool_str36[sizeof("cet")]; - char stringpool_str37[sizeof("d")]; - char stringpool_str38[sizeof("cest")]; - char stringpool_str39[sizeof("cat")]; - char stringpool_str41[sizeof("cast")]; - char stringpool_str42[sizeof("magt")]; - char stringpool_str43[sizeof("magst")]; - char stringpool_str44[sizeof("mst")]; - char stringpool_str45[sizeof("msk")]; - char stringpool_str46[sizeof("cot")]; - char stringpool_str47[sizeof("cst")]; - char stringpool_str48[sizeof("aqtt")]; - char stringpool_str49[sizeof("f")]; - char stringpool_str52[sizeof("art")]; - char stringpool_str53[sizeof("fnt")]; - char stringpool_str54[sizeof("fet")]; - char stringpool_str55[sizeof("b")]; - char stringpool_str57[sizeof("anat")]; - char stringpool_str58[sizeof("anast")]; - char stringpool_str59[sizeof("bnt")]; - char stringpool_str60[sizeof("i")]; - char stringpool_str61[sizeof("pht")]; - char stringpool_str62[sizeof("at")]; - char stringpool_str63[sizeof("zp6")]; - char stringpool_str64[sizeof("mewt")]; - char stringpool_str65[sizeof("fst")]; - char stringpool_str66[sizeof("ahst")]; - char stringpool_str67[sizeof("mawt")]; - char stringpool_str68[sizeof("zp5")]; - char stringpool_str70[sizeof("bot")]; - char stringpool_str71[sizeof("bst")]; - char stringpool_str72[sizeof("pwt")]; - char stringpool_str74[sizeof("pont")]; - char stringpool_str75[sizeof("iot")]; - char stringpool_str76[sizeof("ist")]; - char stringpool_str77[sizeof("awst")]; - char stringpool_str79[sizeof("mht")]; - char stringpool_str80[sizeof("mez")]; - char stringpool_str81[sizeof("orat")]; - char stringpool_str82[sizeof("mesz")]; - char stringpool_str84[sizeof("chst")]; - char stringpool_str85[sizeof("pmdt")]; - char stringpool_str88[sizeof("central")]; - char stringpool_str89[sizeof("aedt")]; - char stringpool_str90[sizeof("act")]; - char stringpool_str91[sizeof("ect")]; - char stringpool_str92[sizeof("acst")]; - char stringpool_str93[sizeof("eadt")]; - char stringpool_str94[sizeof("brt")]; - char stringpool_str95[sizeof("chut")]; - char stringpool_str96[sizeof("brst")]; - char stringpool_str97[sizeof("cen. australia")]; - char stringpool_str100[sizeof("davt")]; - char stringpool_str101[sizeof("irst")]; - char stringpool_str102[sizeof("irkt")]; - char stringpool_str103[sizeof("irkst")]; - char stringpool_str104[sizeof("bt")]; - char stringpool_str105[sizeof("n")]; - char stringpool_str106[sizeof("btt")]; - char stringpool_str107[sizeof("mountain")]; - char stringpool_str108[sizeof("cct")]; - char stringpool_str109[sizeof("w")]; - char stringpool_str110[sizeof("l")]; - char stringpool_str111[sizeof("fwt")]; - char stringpool_str113[sizeof("msd")]; - char stringpool_str114[sizeof("wet")]; - char stringpool_str116[sizeof("west")]; - char stringpool_str117[sizeof("wat")]; - char stringpool_str119[sizeof("wast")]; - char stringpool_str120[sizeof("wakt")]; - char stringpool_str121[sizeof("nst")]; - char stringpool_str122[sizeof("acwst")]; - char stringpool_str123[sizeof("chast")]; - char stringpool_str124[sizeof("cist")]; - char stringpool_str125[sizeof("azt")]; - char stringpool_str126[sizeof("clt")]; - char stringpool_str127[sizeof("azst")]; - char stringpool_str128[sizeof("clst")]; - char stringpool_str129[sizeof("mart")]; - char stringpool_str130[sizeof("zp4")]; - char stringpool_str131[sizeof("jst")]; - char stringpool_str132[sizeof("central asia")]; - char stringpool_str133[sizeof("aft")]; - char stringpool_str134[sizeof("e. south america")]; - char stringpool_str135[sizeof("central america")]; - char stringpool_str137[sizeof("ict")]; - char stringpool_str143[sizeof("pgt")]; - char stringpool_str144[sizeof("nrt")]; - char stringpool_str145[sizeof("mexico")]; - char stringpool_str146[sizeof("awdt")]; - char stringpool_str147[sizeof("egt")]; - char stringpool_str148[sizeof("cxt")]; - char stringpool_str149[sizeof("egst")]; - char stringpool_str150[sizeof("phot")]; - char stringpool_str151[sizeof("alaskan")]; - char stringpool_str154[sizeof("nt")]; - char stringpool_str158[sizeof("wt")]; - char stringpool_str160[sizeof("west asia")]; - char stringpool_str161[sizeof("acdt")]; - char stringpool_str162[sizeof("npt")]; - char stringpool_str163[sizeof("lhst")]; - char stringpool_str164[sizeof("afghanistan")]; - char stringpool_str167[sizeof("k")]; - char stringpool_str169[sizeof("g")]; - char stringpool_str170[sizeof("irdt")]; - char stringpool_str171[sizeof("chot")]; - char stringpool_str172[sizeof("chost")]; - char stringpool_str173[sizeof("gmt")]; - char stringpool_str174[sizeof("get")]; - char stringpool_str175[sizeof("novt")]; - char stringpool_str176[sizeof("novst")]; - char stringpool_str177[sizeof("fjt")]; - char stringpool_str178[sizeof("u")]; - char stringpool_str179[sizeof("fjst")]; - char stringpool_str181[sizeof("pyst")]; - char stringpool_str182[sizeof("nct")]; - char stringpool_str183[sizeof("kst")]; - char stringpool_str184[sizeof("kost")]; - char stringpool_str185[sizeof("gst")]; - char stringpool_str186[sizeof("iran")]; - char stringpool_str187[sizeof("e. africa")]; - char stringpool_str188[sizeof("wadt")]; - char stringpool_str189[sizeof("t")]; - char stringpool_str190[sizeof("e. australia")]; - char stringpool_str191[sizeof("s")]; - char stringpool_str192[sizeof("chadt")]; - char stringpool_str193[sizeof("tmt")]; - char stringpool_str194[sizeof("cidst")]; - char stringpool_str195[sizeof("aoe")]; - char stringpool_str197[sizeof("myt")]; - char stringpool_str198[sizeof("west pacific")]; - char stringpool_str199[sizeof("mut")]; - char stringpool_str200[sizeof("wit")]; - char stringpool_str201[sizeof("sast")]; - char stringpool_str202[sizeof("sakt")]; - char stringpool_str203[sizeof("new zealand")]; - char stringpool_str204[sizeof("tot")]; - char stringpool_str205[sizeof("china")]; - char stringpool_str206[sizeof("tost")]; - char stringpool_str207[sizeof("sst")]; - char stringpool_str209[sizeof("india")]; - char stringpool_str211[sizeof("warst")]; - char stringpool_str212[sizeof("sbt")]; - char stringpool_str214[sizeof("azot")]; - char stringpool_str215[sizeof("azost")]; - char stringpool_str216[sizeof("taht")]; - char stringpool_str217[sizeof("nzt")]; - char stringpool_str218[sizeof("dateline")]; - char stringpool_str219[sizeof("nzst")]; - char stringpool_str220[sizeof("tokyo")]; - char stringpool_str221[sizeof("central pacific")]; - char stringpool_str223[sizeof("qyzt")]; - char stringpool_str224[sizeof("atlantic")]; - char stringpool_str225[sizeof("nft")]; - char stringpool_str227[sizeof("ut")]; - char stringpool_str228[sizeof("trt")]; - char stringpool_str229[sizeof("wft")]; - char stringpool_str230[sizeof("srt")]; - char stringpool_str231[sizeof("pdt")]; - char stringpool_str232[sizeof("lhdt")]; - char stringpool_str234[sizeof("adt")]; - char stringpool_str235[sizeof("edt")]; - char stringpool_str238[sizeof("pkt")]; - char stringpool_str239[sizeof("almt")]; - char stringpool_str240[sizeof("wita")]; - char stringpool_str242[sizeof("wgt")]; - char stringpool_str243[sizeof("akst")]; - char stringpool_str244[sizeof("wgst")]; - char stringpool_str246[sizeof("krat")]; - char stringpool_str247[sizeof("krast")]; - char stringpool_str248[sizeof("mid-atlantic")]; - char stringpool_str249[sizeof("mdt")]; - char stringpool_str250[sizeof("lint")]; - char stringpool_str251[sizeof("malay peninsula")]; - char stringpool_str252[sizeof("cdt")]; - char stringpool_str253[sizeof("swt")]; - char stringpool_str255[sizeof("se asia")]; - char stringpool_str256[sizeof("v")]; - char stringpool_str258[sizeof("tonga")]; - char stringpool_str259[sizeof("ckt")]; - char stringpool_str261[sizeof("vet")]; - char stringpool_str262[sizeof("caucasus")]; - char stringpool_str263[sizeof("central europe")]; - char stringpool_str264[sizeof("h")]; - char stringpool_str265[sizeof("central european")]; - char stringpool_str266[sizeof("newfoundland")]; - char stringpool_str267[sizeof("arab")]; - char stringpool_str268[sizeof("sct")]; - char stringpool_str269[sizeof("arabic")]; - char stringpool_str270[sizeof("arabian")]; - char stringpool_str271[sizeof("ddut")]; - char stringpool_str273[sizeof("vost")]; - char stringpool_str274[sizeof("hast")]; - char stringpool_str275[sizeof("nepal")]; - char stringpool_str276[sizeof("nut")]; - char stringpool_str277[sizeof("fkt")]; - char stringpool_str279[sizeof("fkst")]; - char stringpool_str280[sizeof("hst")]; - char stringpool_str281[sizeof("idt")]; - char stringpool_str284[sizeof("tlt")]; - char stringpool_str285[sizeof("w. australia")]; - char stringpool_str286[sizeof("egypt")]; - char stringpool_str287[sizeof("myanmar")]; - char stringpool_str288[sizeof("nzdt")]; - char stringpool_str289[sizeof("gft")]; - char stringpool_str290[sizeof("uzt")]; - char stringpool_str293[sizeof("north asia")]; - char stringpool_str294[sizeof("mvt")]; - char stringpool_str295[sizeof("galt")]; - char stringpool_str296[sizeof("nfdt")]; - char stringpool_str297[sizeof("cvt")]; - char stringpool_str298[sizeof("north asia east")]; - char stringpool_str300[sizeof("kgt")]; - char stringpool_str301[sizeof("aus central")]; - char stringpool_str302[sizeof("pacific")]; - char stringpool_str304[sizeof("canada central")]; - char stringpool_str306[sizeof("pacific sa")]; - char stringpool_str307[sizeof("azores")]; - char stringpool_str308[sizeof("gamt")]; - char stringpool_str309[sizeof("tft")]; - char stringpool_str310[sizeof("r")]; - char stringpool_str311[sizeof("fle")]; - char stringpool_str312[sizeof("akdt")]; - char stringpool_str313[sizeof("ulat")]; - char stringpool_str314[sizeof("ulast")]; - char stringpool_str315[sizeof("ret")]; - char stringpool_str317[sizeof("tjt")]; - char stringpool_str319[sizeof("south africa")]; - char stringpool_str324[sizeof("sgt")]; - char stringpool_str326[sizeof("ndt")]; - char stringpool_str327[sizeof("rott")]; - char stringpool_str330[sizeof("samt")]; - char stringpool_str332[sizeof("tasmania")]; - char stringpool_str334[sizeof("hovt")]; - char stringpool_str335[sizeof("hovst")]; - char stringpool_str338[sizeof("gyt")]; - char stringpool_str342[sizeof("y")]; - char stringpool_str343[sizeof("hadt")]; - char stringpool_str344[sizeof("sa western")]; - char stringpool_str345[sizeof("hawaiian")]; - char stringpool_str347[sizeof("uyt")]; - char stringpool_str349[sizeof("uyst")]; - char stringpool_str350[sizeof("yekt")]; - char stringpool_str351[sizeof("yekst")]; - char stringpool_str352[sizeof("kuyt")]; - char stringpool_str353[sizeof("yakt")]; - char stringpool_str354[sizeof("yakst")]; - char stringpool_str358[sizeof("yst")]; - char stringpool_str359[sizeof("jerusalem")]; - char stringpool_str365[sizeof("sri lanka")]; - char stringpool_str367[sizeof("yakutsk")]; - char stringpool_str375[sizeof("wib")]; - char stringpool_str377[sizeof("aus eastern")]; - char stringpool_str378[sizeof("gilt")]; - char stringpool_str387[sizeof("us mountain")]; - char stringpool_str391[sizeof("vlat")]; - char stringpool_str392[sizeof("vlast")]; - char stringpool_str395[sizeof("gtb")]; - char stringpool_str398[sizeof("taipei")]; - char stringpool_str399[sizeof("sret")]; - char stringpool_str408[sizeof("cape verde")]; - char stringpool_str417[sizeof("tkt")]; - char stringpool_str418[sizeof("samoa")]; - char stringpool_str421[sizeof("sa pacific")]; - char stringpool_str427[sizeof("vut")]; - char stringpool_str428[sizeof("idlw")]; - char stringpool_str432[sizeof("fiji")]; - char stringpool_str435[sizeof("utc")]; - char stringpool_str443[sizeof("korea")]; - char stringpool_str445[sizeof("e. europe")]; - char stringpool_str449[sizeof("syot")]; - char stringpool_str452[sizeof("n. central asia")]; - char stringpool_str455[sizeof("tvt")]; - char stringpool_str458[sizeof("w. central africa")]; - char stringpool_str466[sizeof("ekaterinburg")]; - char stringpool_str468[sizeof("vladivostok")]; - char stringpool_str476[sizeof("yapt")]; - char stringpool_str477[sizeof("us eastern")]; - char stringpool_str482[sizeof("sa eastern")]; - char stringpool_str485[sizeof("hdt")]; - char stringpool_str486[sizeof("russian")]; - char stringpool_str492[sizeof("hkt")]; - char stringpool_str497[sizeof("romance")]; - char stringpool_str540[sizeof("w. europe")]; - char stringpool_str563[sizeof("ydt")]; - char stringpool_str566[sizeof("idle")]; - char stringpool_str567[sizeof("greenwich")]; - char stringpool_str619[sizeof("greenland")]; - }; -static const struct stringpool_t stringpool_contents = - { - "o", - "x", - "z", - "q", - "omst", - "omsst", - "p", - "a", - "e", - "pet", - "pmst", - "pett", - "petst", - "eet", - "aest", - "eest", - "eat", - "east", - "easst", - "pst", - "eastern", - "m", - "ast", - "est", - "c", - "mmt", - "met", - "mest", - "cet", - "d", - "cest", - "cat", - "cast", - "magt", - "magst", - "mst", - "msk", - "cot", - "cst", - "aqtt", - "f", - "art", - "fnt", - "fet", - "b", - "anat", - "anast", - "bnt", - "i", - "pht", - "at", - "zp6", - "mewt", - "fst", - "ahst", - "mawt", - "zp5", - "bot", - "bst", - "pwt", - "pont", - "iot", - "ist", - "awst", - "mht", - "mez", - "orat", - "mesz", - "chst", - "pmdt", - "central", - "aedt", - "act", - "ect", - "acst", - "eadt", - "brt", - "chut", - "brst", - "cen. australia", - "davt", - "irst", - "irkt", - "irkst", - "bt", - "n", - "btt", - "mountain", - "cct", - "w", - "l", - "fwt", - "msd", - "wet", - "west", - "wat", - "wast", - "wakt", - "nst", - "acwst", - "chast", - "cist", - "azt", - "clt", - "azst", - "clst", - "mart", - "zp4", - "jst", - "central asia", - "aft", - "e. south america", - "central america", - "ict", - "pgt", - "nrt", - "mexico", - "awdt", - "egt", - "cxt", - "egst", - "phot", - "alaskan", - "nt", - "wt", - "west asia", - "acdt", - "npt", - "lhst", - "afghanistan", - "k", - "g", - "irdt", - "chot", - "chost", - "gmt", - "get", - "novt", - "novst", - "fjt", - "u", - "fjst", - "pyst", - "nct", - "kst", - "kost", - "gst", - "iran", - "e. africa", - "wadt", - "t", - "e. australia", - "s", - "chadt", - "tmt", - "cidst", - "aoe", - "myt", - "west pacific", - "mut", - "wit", - "sast", - "sakt", - "new zealand", - "tot", - "china", - "tost", - "sst", - "india", - "warst", - "sbt", - "azot", - "azost", - "taht", - "nzt", - "dateline", - "nzst", - "tokyo", - "central pacific", - "qyzt", - "atlantic", - "nft", - "ut", - "trt", - "wft", - "srt", - "pdt", - "lhdt", - "adt", - "edt", - "pkt", - "almt", - "wita", - "wgt", - "akst", - "wgst", - "krat", - "krast", - "mid-atlantic", - "mdt", - "lint", - "malay peninsula", - "cdt", - "swt", - "se asia", - "v", - "tonga", - "ckt", - "vet", - "caucasus", - "central europe", - "h", - "central european", - "newfoundland", - "arab", - "sct", - "arabic", - "arabian", - "ddut", - "vost", - "hast", - "nepal", - "nut", - "fkt", - "fkst", - "hst", - "idt", - "tlt", - "w. australia", - "egypt", - "myanmar", - "nzdt", - "gft", - "uzt", - "north asia", - "mvt", - "galt", - "nfdt", - "cvt", - "north asia east", - "kgt", - "aus central", - "pacific", - "canada central", - "pacific sa", - "azores", - "gamt", - "tft", - "r", - "fle", - "akdt", - "ulat", - "ulast", - "ret", - "tjt", - "south africa", - "sgt", - "ndt", - "rott", - "samt", - "tasmania", - "hovt", - "hovst", - "gyt", - "y", - "hadt", - "sa western", - "hawaiian", - "uyt", - "uyst", - "yekt", - "yekst", - "kuyt", - "yakt", - "yakst", - "yst", - "jerusalem", - "sri lanka", - "yakutsk", - "wib", - "aus eastern", - "gilt", - "us mountain", - "vlat", - "vlast", - "gtb", - "taipei", - "sret", - "cape verde", - "tkt", - "samoa", - "sa pacific", - "vut", - "idlw", - "fiji", - "utc", - "korea", - "e. europe", - "syot", - "n. central asia", - "tvt", - "w. central africa", - "ekaterinburg", - "vladivostok", - "yapt", - "us eastern", - "sa eastern", - "hdt", - "russian", - "hkt", - "romance", - "w. europe", - "ydt", - "idle", - "greenwich", - "greenland" - }; -#define stringpool ((const char *) &stringpool_contents) -const struct zone * -zonetab (register const char *str, register size_t len) -{ - static const struct zone wordlist[] = - { - {-1}, {-1}, -#line 37 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str2, -2*3600}, -#line 46 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str3, -11*3600}, -#line 48 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str4, 0*3600}, -#line 39 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str5, -4*3600}, - {-1}, {-1}, -#line 272 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str8,21600}, -#line 271 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str9,25200}, -#line 38 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str10, -3*3600}, - {-1}, {-1}, -#line 24 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str13, 1*3600}, -#line 28 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str14, 5*3600}, -#line 274 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str15,-18000}, -#line 282 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str16,-10800}, -#line 276 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str17,43200}, -#line 275 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str18,43200}, -#line 83 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str19, 2*3600}, -#line 189 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str20,36000}, -#line 91 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str21, 3*3600}, -#line 90 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str22, 3*3600}, - {-1}, -#line 104 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str24,-6*3600}, -#line 220 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str25,-18000}, -#line 22 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str26, -8*3600}, -#line 136 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str27, -18000}, -#line 35 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str28, 12*3600}, -#line 59 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str29, -4*3600}, -#line 16 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str30, -5*3600}, -#line 26 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str31, 3*3600}, -#line 259 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str32,23400}, -#line 76 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str33, 1*3600}, - {-1}, -#line 85 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str35, 2*3600}, -#line 74 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str36, 1*3600}, -#line 27 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str37, 4*3600}, -#line 82 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str38, 2*3600}, -#line 68 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str39,2*3600}, - {-1}, -#line 205 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str41,28800}, -#line 255 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str42,39600}, -#line 254 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str43,43200}, -#line 20 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str44, -7*3600}, -#line 92 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str45, 3*3600}, -#line 215 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str46,-18000}, -#line 18 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str47, -6*3600}, -#line 195 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str48,18000}, -#line 29 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str49, 6*3600}, - {-1}, {-1}, -#line 54 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str52, -3*3600}, -#line 229 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str53,-7200}, -#line 224 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str54,10800}, -#line 25 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str55, 2*3600}, - {-1}, -#line 193 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str57,43200}, -#line 192 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str58,43200}, -#line 202 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str59,28800}, -#line 32 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str60, 9*3600}, -#line 279 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str61,28800}, -#line 51 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str62, -2*3600}, -#line 97 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str63, 6*3600}, -#line 77 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str64, 1*3600}, -#line 84 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str65, 2*3600}, -#line 67 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str66,-10*3600}, -#line 257 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str67,18000}, -#line 95 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str68, 5*3600}, - {-1}, -#line 203 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str70,-14400}, -#line 73 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str71, 1*3600}, -#line 284 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str72,32400}, - {-1}, -#line 283 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str74,39600}, -#line 241 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str75,21600}, -#line 96 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str76, (5*3600+1800)}, -#line 197 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str77,28800}, - {-1}, -#line 258 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str79,43200}, -#line 78 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str80, 1*3600}, -#line 273 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str81,18000}, -#line 86 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str82, 2*3600}, - {-1}, -#line 210 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str84,36000}, -#line 281 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str85,-7200}, - {-1}, {-1}, -#line 129 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str88, -21600}, -#line 188 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str89,39600}, -#line 186 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str90,-18000}, -#line 221 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str91,-18000}, -#line 185 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str92,34200}, -#line 106 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str93,11*3600}, -#line 56 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str94, -3*3600}, -#line 211 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str95,36000}, -#line 52 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str96,-2*3600}, -#line 123 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str97, 34200}, - {-1}, {-1}, -#line 218 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str100,25200}, -#line 245 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str101,12600}, -#line 244 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str102,28800}, -#line 243 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str103,32400}, -#line 89 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str104, 3*3600}, -#line 36 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str105, -1*3600}, -#line 204 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str106,21600}, -#line 151 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str107, -25200}, -#line 99 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str108, (6*3600+1800)}, -#line 45 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str109, -10*3600}, -#line 34 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str110, 11*3600}, -#line 75 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str111, 1*3600}, - {-1}, -#line 93 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str113, 4*3600}, -#line 50 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str114, 0*3600}, - {-1}, -#line 81 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str116, 1*3600}, -#line 80 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str117, 1*3600}, - {-1}, -#line 98 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str119, 2*3600}, -#line 316 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str120,43200}, -#line 58 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str121, -(2*3600+1800)}, -#line 187 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str122,31500}, -#line 207 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str123,45900}, -#line 213 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str124,-18000}, -#line 201 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str125,14400}, -#line 60 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str126, -4*3600}, -#line 200 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str127,18000}, -#line 57 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str128,-3*3600}, -#line 256 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str129,-30600}, -#line 94 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str130, 4*3600}, -#line 102 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str131, 9*3600}, -#line 125 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str132, 21600}, -#line 190 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str133,16200}, -#line 135 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str134, -10800}, -#line 124 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str135, -21600}, - {-1}, -#line 239 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str137,25200}, - {-1}, {-1}, {-1}, {-1}, {-1}, -#line 277 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str143,36000}, -#line 269 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str144,43200}, -#line 149 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str145, -21600}, -#line 196 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str146,32400}, -#line 223 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str147,-3600}, -#line 217 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str148,25200}, -#line 222 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str149,0}, -#line 278 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str150,46800}, -#line 112 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str151, -32400}, - {-1}, {-1}, -#line 71 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str154, -11*3600}, - {-1}, {-1}, {-1}, -#line 324 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str158,0}, - {-1}, -#line 181 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str160, 18000}, -#line 184 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str161,37800}, -#line 268 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str162,20700}, -#line 252 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str163,37800}, -#line 111 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str164, 16200}, - {-1}, {-1}, -#line 33 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str167, 10*3600}, - {-1}, -#line 30 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str169, 7*3600}, -#line 242 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str170,16200}, -#line 209 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str171,28800}, -#line 208 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str172,32400}, -#line 15 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str173, 0*3600}, -#line 232 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str174,14400}, -#line 267 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str175,25200}, -#line 266 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str176,25200}, -#line 226 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str177,43200}, -#line 43 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str178, -8*3600}, -#line 225 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str179,46800}, - {-1}, -#line 285 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str181,-10800}, -#line 263 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str182,39600}, -#line 103 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str183, 9*3600}, -#line 247 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str184,39600}, -#line 105 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str185, 10*3600}, -#line 146 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str186, 12600}, -#line 132 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str187, 10800}, -#line 101 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str188, 8*3600}, -#line 42 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str189, -7*3600}, -#line 133 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str190, 36000}, -#line 41 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str191, -6*3600}, -#line 206 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str192,49500}, -#line 301 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str193,18000}, -#line 212 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str194,-14400}, -#line 194 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str195,-43200}, - {-1}, -#line 262 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str197,28800}, -#line 182 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str198, 36000}, -#line 260 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str199,14400}, -#line 322 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str200,32400}, -#line 87 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str201, 2*3600}, -#line 289 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str202,39600}, -#line 155 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str203, 43200}, -#line 303 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str204,46800}, -#line 130 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str205, 28800}, -#line 302 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str206,50400}, -#line 88 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str207, -11*3600}, - {-1}, -#line 145 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str209, 19800}, - {-1}, -#line 317 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str211,-10800}, -#line 291 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str212,39600}, - {-1}, -#line 199 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str214,-3600}, -#line 198 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str215,0}, -#line 296 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str216,-36000}, -#line 109 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str217, 12*3600}, -#line 131 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str218, -43200}, -#line 108 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str219,12*3600}, -#line 173 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str220, 32400}, -#line 128 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str221, 39600}, - {-1}, -#line 286 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str223,21600}, -#line 116 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str224, -14400}, -#line 265 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str225,39600}, - {-1}, -#line 14 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str227, 0*3600}, -#line 304 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str228,10800}, -#line 318 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str229,43200}, -#line 294 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str230,-10800}, -#line 23 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str231, -7*3600}, -#line 251 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str232,39600}, - {-1}, -#line 55 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str234, -3*3600}, -#line 17 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str235, -4*3600}, - {-1}, {-1}, -#line 280 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str238,18000}, -#line 191 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str239,21600}, -#line 323 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str240,28800}, - {-1}, -#line 320 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str242,-7200}, -#line 63 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str243,-9*3600}, -#line 319 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str244,-3600}, - {-1}, -#line 249 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str246,25200}, -#line 248 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str247,28800}, -#line 150 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str248, -7200}, -#line 21 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str249, -6*3600}, -#line 253 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str250,50400}, -#line 168 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str251, 28800}, -#line 19 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str252, -5*3600}, -#line 79 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str253, 1*3600}, - {-1}, -#line 167 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str255, 25200}, -#line 44 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str256, -9*3600}, - {-1}, -#line 174 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str258, 46800}, -#line 214 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str259,-36000}, - {-1}, -#line 311 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str261,-14400}, -#line 122 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str262, 14400}, -#line 126 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str263, 3600}, -#line 31 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str264, 8*3600}, -#line 127 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str265, 3600}, -#line 156 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str266, -12600}, -#line 113 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str267, 10800}, -#line 292 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str268,14400}, -#line 115 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str269, 10800}, -#line 114 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str270, 14400}, -#line 219 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str271,36000}, - {-1}, -#line 314 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str273,21600}, -#line 69 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str274,-10*3600}, -#line 154 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str275, 20700}, -#line 270 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str276,-39600}, -#line 228 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str277,-14400}, - {-1}, -#line 227 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str279,-10800}, -#line 70 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str280,-10*3600}, -#line 240 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str281,10800}, - {-1}, {-1}, -#line 300 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str284,32400}, -#line 178 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str285, 28800}, -#line 137 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str286, 7200}, -#line 152 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str287, 23400}, -#line 110 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str288,13*3600}, -#line 233 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str289,-10800}, -#line 310 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str290,18000}, - {-1}, {-1}, -#line 158 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str293, 25200}, -#line 261 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str294,18000}, -#line 230 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str295,-21600}, -#line 264 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str296,43200}, -#line 216 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str297,-3600}, -#line 157 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str298, 28800}, - {-1}, -#line 246 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str300,21600}, -#line 117 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str301, 34200}, -#line 160 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str302, -28800}, - {-1}, -#line 120 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str304, -21600}, - {-1}, -#line 159 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str306, -14400}, -#line 119 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str307, -3600}, -#line 231 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str308,-32400}, -#line 297 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str309,18000}, -#line 40 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str310, -5*3600}, -#line 140 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str311, 7200}, -#line 61 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str312,-8*3600}, -#line 307 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str313,28800}, -#line 306 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str314,32400}, -#line 287 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str315,14400}, - {-1}, -#line 298 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str317,18000}, - {-1}, -#line 169 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str319, 7200}, - {-1}, {-1}, {-1}, {-1}, -#line 100 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str324, 8*3600}, - {-1}, -#line 53 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str326, -(1*3600+1800)}, -#line 288 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str327,-10800}, - {-1}, {-1}, -#line 290 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str330,14400}, - {-1}, -#line 172 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str332, 36000}, - {-1}, -#line 238 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str334,25200}, -#line 237 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str335,28800}, - {-1}, {-1}, -#line 235 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str338,-14400}, - {-1}, {-1}, {-1}, -#line 47 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str342, -12*3600}, -#line 64 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str343,-9*3600}, -#line 165 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str344, -14400}, -#line 144 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str345, -36000}, - {-1}, -#line 309 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str347,-10800}, - {-1}, -#line 308 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str349,-7200}, -#line 329 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str350,18000}, -#line 328 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str351,21600}, -#line 250 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str352,14400}, -#line 326 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str353,32400}, -#line 325 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str354,36000}, - {-1}, {-1}, {-1}, -#line 66 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str358, -9*3600}, -#line 147 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str359, 7200}, - {-1}, {-1}, {-1}, {-1}, {-1}, -#line 170 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str365, 21600}, - {-1}, -#line 183 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str367, 32400}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, -#line 321 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str375,25200}, - {-1}, -#line 118 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str377, 36000}, -#line 234 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str378,43200}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, -#line 176 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str387, -25200}, - {-1}, {-1}, {-1}, -#line 313 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str391,36000}, -#line 312 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str392,39600}, - {-1}, {-1}, -#line 143 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str395, 7200}, - {-1}, {-1}, -#line 171 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str398, 28800}, -#line 293 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str399,39600}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, -#line 121 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str408, -3600}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, -#line 299 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str417,46800}, -#line 166 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str418, -39600}, - {-1}, {-1}, -#line 164 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str421, -18000}, - {-1}, {-1}, {-1}, {-1}, {-1}, -#line 315 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str427,39600}, -#line 72 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str428,-12*3600}, - {-1}, {-1}, {-1}, -#line 139 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str432, 43200}, - {-1}, {-1}, -#line 49 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str435, 0*3600}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, -#line 148 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str443, 32400}, - {-1}, -#line 134 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str445, 7200}, - {-1}, {-1}, {-1}, -#line 295 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str449,10800}, - {-1}, {-1}, -#line 153 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str452, 21600}, - {-1}, {-1}, -#line 305 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str455,43200}, - {-1}, {-1}, -#line 179 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str458, 3600}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, -#line 138 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str466, 18000}, - {-1}, -#line 177 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str468, 36000}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, -#line 327 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str476,36000}, -#line 175 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str477, -18000}, - {-1}, {-1}, {-1}, {-1}, -#line 163 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str482, -10800}, - {-1}, {-1}, -#line 65 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str485, -9*3600}, -#line 162 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str486, 10800}, - {-1}, {-1}, {-1}, {-1}, {-1}, -#line 236 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str492,28800}, - {-1}, {-1}, {-1}, {-1}, -#line 161 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str497, 3600}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, -#line 180 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str540, 3600}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, - {-1}, {-1}, {-1}, {-1}, -#line 62 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str563, -8*3600}, - {-1}, {-1}, -#line 107 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str566,12*3600}, -#line 142 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str567, 0}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, -#line 141 "zonetab.list" - {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str619, -10800} - }; - - if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) - { - register unsigned int key = hash (str, len); - - if (key <= MAX_HASH_VALUE) - { - register int o = wordlist[key].name; - if (o >= 0) - { - register const char *s = o + stringpool; - - if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_strncmp (str, s, len) && s[len] == '\0') - return &wordlist[key]; - } - } - } - return 0; -} -#line 330 "zonetab.list" - diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/zonetab.list b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/zonetab.list deleted file mode 100644 index 63b6873..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/zonetab.list +++ /dev/null @@ -1,330 +0,0 @@ -%{ -#define GPERF_DOWNCASE 1 -#define GPERF_CASE_STRNCMP 1 -#define gperf_case_strncmp strncasecmp -struct zone { - int name; - int offset; -}; -static const struct zone *zonetab(register const char *str, register size_t len); -%} - -struct zone; -%% -ut, 0*3600 -gmt, 0*3600 -est, -5*3600 -edt, -4*3600 -cst, -6*3600 -cdt, -5*3600 -mst, -7*3600 -mdt, -6*3600 -pst, -8*3600 -pdt, -7*3600 -a, 1*3600 -b, 2*3600 -c, 3*3600 -d, 4*3600 -e, 5*3600 -f, 6*3600 -g, 7*3600 -h, 8*3600 -i, 9*3600 -k, 10*3600 -l, 11*3600 -m, 12*3600 -n, -1*3600 -o, -2*3600 -p, -3*3600 -q, -4*3600 -r, -5*3600 -s, -6*3600 -t, -7*3600 -u, -8*3600 -v, -9*3600 -w, -10*3600 -x, -11*3600 -y, -12*3600 -z, 0*3600 -utc, 0*3600 -wet, 0*3600 -at, -2*3600 -brst,-2*3600 -ndt, -(1*3600+1800) -art, -3*3600 -adt, -3*3600 -brt, -3*3600 -clst,-3*3600 -nst, -(2*3600+1800) -ast, -4*3600 -clt, -4*3600 -akdt,-8*3600 -ydt, -8*3600 -akst,-9*3600 -hadt,-9*3600 -hdt, -9*3600 -yst, -9*3600 -ahst,-10*3600 -cat,2*3600 -hast,-10*3600 -hst,-10*3600 -nt, -11*3600 -idlw,-12*3600 -bst, 1*3600 -cet, 1*3600 -fwt, 1*3600 -met, 1*3600 -mewt, 1*3600 -mez, 1*3600 -swt, 1*3600 -wat, 1*3600 -west, 1*3600 -cest, 2*3600 -eet, 2*3600 -fst, 2*3600 -mest, 2*3600 -mesz, 2*3600 -sast, 2*3600 -sst, -11*3600 -bt, 3*3600 -eat, 3*3600 -eest, 3*3600 -msk, 3*3600 -msd, 4*3600 -zp4, 4*3600 -zp5, 5*3600 -ist, (5*3600+1800) -zp6, 6*3600 -wast, 2*3600 -cct, (6*3600+1800) -sgt, 8*3600 -wadt, 8*3600 -jst, 9*3600 -kst, 9*3600 -east,-6*3600 -gst, 10*3600 -eadt,11*3600 -idle,12*3600 -nzst,12*3600 -nzt, 12*3600 -nzdt,13*3600 -afghanistan, 16200 -alaskan, -32400 -arab, 10800 -arabian, 14400 -arabic, 10800 -atlantic, -14400 -aus central, 34200 -aus eastern, 36000 -azores, -3600 -canada central, -21600 -cape verde, -3600 -caucasus, 14400 -cen. australia, 34200 -central america, -21600 -central asia, 21600 -central europe, 3600 -central european, 3600 -central pacific, 39600 -central, -21600 -china, 28800 -dateline, -43200 -e. africa, 10800 -e. australia, 36000 -e. europe, 7200 -e. south america, -10800 -eastern, -18000 -egypt, 7200 -ekaterinburg, 18000 -fiji, 43200 -fle, 7200 -greenland, -10800 -greenwich, 0 -gtb, 7200 -hawaiian, -36000 -india, 19800 -iran, 12600 -jerusalem, 7200 -korea, 32400 -mexico, -21600 -mid-atlantic, -7200 -mountain, -25200 -myanmar, 23400 -n. central asia, 21600 -nepal, 20700 -new zealand, 43200 -newfoundland, -12600 -north asia east, 28800 -north asia, 25200 -pacific sa, -14400 -pacific, -28800 -romance, 3600 -russian, 10800 -sa eastern, -10800 -sa pacific, -18000 -sa western, -14400 -samoa, -39600 -se asia, 25200 -malay peninsula, 28800 -south africa, 7200 -sri lanka, 21600 -taipei, 28800 -tasmania, 36000 -tokyo, 32400 -tonga, 46800 -us eastern, -18000 -us mountain, -25200 -vladivostok, 36000 -w. australia, 28800 -w. central africa, 3600 -w. europe, 3600 -west asia, 18000 -west pacific, 36000 -yakutsk, 32400 -acdt,37800 -acst,34200 -act,-18000 -acwst,31500 -aedt,39600 -aest,36000 -aft,16200 -almt,21600 -anast,43200 -anat,43200 -aoe,-43200 -aqtt,18000 -awdt,32400 -awst,28800 -azost,0 -azot,-3600 -azst,18000 -azt,14400 -bnt,28800 -bot,-14400 -btt,21600 -cast,28800 -chadt,49500 -chast,45900 -chost,32400 -chot,28800 -chst,36000 -chut,36000 -cidst,-14400 -cist,-18000 -ckt,-36000 -cot,-18000 -cvt,-3600 -cxt,25200 -davt,25200 -ddut,36000 -easst,-18000 -ect,-18000 -egst,0 -egt,-3600 -fet,10800 -fjst,46800 -fjt,43200 -fkst,-10800 -fkt,-14400 -fnt,-7200 -galt,-21600 -gamt,-32400 -get,14400 -gft,-10800 -gilt,43200 -gyt,-14400 -hkt,28800 -hovst,28800 -hovt,25200 -ict,25200 -idt,10800 -iot,21600 -irdt,16200 -irkst,32400 -irkt,28800 -irst,12600 -kgt,21600 -kost,39600 -krast,28800 -krat,25200 -kuyt,14400 -lhdt,39600 -lhst,37800 -lint,50400 -magst,43200 -magt,39600 -mart,-30600 -mawt,18000 -mht,43200 -mmt,23400 -mut,14400 -mvt,18000 -myt,28800 -nct,39600 -nfdt,43200 -nft,39600 -novst,25200 -novt,25200 -npt,20700 -nrt,43200 -nut,-39600 -omsst,25200 -omst,21600 -orat,18000 -pet,-18000 -petst,43200 -pett,43200 -pgt,36000 -phot,46800 -pht,28800 -pkt,18000 -pmdt,-7200 -pmst,-10800 -pont,39600 -pwt,32400 -pyst,-10800 -qyzt,21600 -ret,14400 -rott,-10800 -sakt,39600 -samt,14400 -sbt,39600 -sct,14400 -sret,39600 -srt,-10800 -syot,10800 -taht,-36000 -tft,18000 -tjt,18000 -tkt,46800 -tlt,32400 -tmt,18000 -tost,50400 -tot,46800 -trt,10800 -tvt,43200 -ulast,32400 -ulat,28800 -uyst,-7200 -uyt,-10800 -uzt,18000 -vet,-14400 -vlast,39600 -vlat,36000 -vost,21600 -vut,39600 -wakt,43200 -warst,-10800 -wft,43200 -wgst,-3600 -wgt,-7200 -wib,25200 -wit,32400 -wita,28800 -wt,0 -yakst,36000 -yakt,32400 -yapt,36000 -yekst,21600 -yekt,18000 -%% diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/lib/date.rb b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/lib/date.rb deleted file mode 100644 index aa630eb..0000000 --- a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/lib/date.rb +++ /dev/null @@ -1,70 +0,0 @@ -# frozen_string_literal: true -# date.rb: Written by Tadayoshi Funaba 1998-2011 - -require 'date_core' - -class Date - VERSION = "3.4.1" # :nodoc: - - # call-seq: - # infinite? -> false - # - # Returns +false+ - def infinite? - false - end - - class Infinity < Numeric # :nodoc: - - def initialize(d=1) @d = d <=> 0 end - - def d() @d end - - protected :d - - def zero?() false end - def finite?() false end - def infinite?() d.nonzero? end - def nan?() d.zero? end - - def abs() self.class.new end - - def -@() self.class.new(-d) end - def +@() self.class.new(+d) end - - def <=>(other) - case other - when Infinity; return d <=> other.d - when Float::INFINITY; return d <=> 1 - when -Float::INFINITY; return d <=> -1 - when Numeric; return d - else - begin - l, r = other.coerce(self) - return l <=> r - rescue NoMethodError - end - end - nil - end - - def coerce(other) - case other - when Numeric; return -d, d - else - super - end - end - - def to_f - return 0 if @d == 0 - if @d > 0 - Float::INFINITY - else - -Float::INFINITY - end - end - - end - -end diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/lib/date_core.so b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/lib/date_core.so deleted file mode 100755 index 115901b0df20a32fc0933bdc27b916371aed5df6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1299200 zcmd@733wD`@&}I3!W*IRE@z4g{x?=ef=>0_hpcAN1RZM(r{LN;5f{-C7(Y@-Np!)#sg@1?eWtZYo^ zNe5r9(s9OTJcp@{So%7U!`9FGH=@`B9wECm!kla{amWGf^*Rd|KbD)8Dgx zCh6}PpHv6^jodWi34|(3u4Rbwno>LhFd1Iw+>2@|&Tkj__F#%F7Y>sgA(UD-rMmU>qIQyAk+~_$PZv z#Q)a6ha&KKQ3U+32>ibt0sl}0`D}^6zc&J%$_RAcjlk#e2<10Gza7c#jtKm0iXi_v z5$w4!0zY>|uq$r_`j1DD!_N`$g`j`2Rk?tFjlgH02<;snf&VR_)sftyBFK4J1Ukzj zw3mEeBL27jJsF{0Ya+DE4+0(WSsbDK6)2x*trYNk5$vQs0-dpVrz81CVSMR`pD!cG zzkdX|JsCl6w?&Zuk_h_$0{+(8oe>e*>xh6akANQ?q28zn@;?%xyRwBz9(S%>uun@9N$@|KY{7-OxxN<7!3Zd?9D!GrAED9^YX)W{%x6=v*ym9 zms#YQQRvCcv}LAE$jHpjDa@IbSLDeloRBdlfBw9j2{UHq=kRA8KgrB0o{^cGH*ZFM z-l7~^;mpje**RHrGCg+}Ye&YPc^KR;`RCvW~d8{W)8*}_~;-ds@i&b&LbcrHlH&(eY1!W>px(cMLy5>=B| zJUDNjhiaVXoojprCZ}-TV8YJI%A7l+a1MRVnE(deg@yAA2`ZeCSHzjW**iCuf}DBT1QFK|`Yf}q8HIVCy9u&(njfH4l&deEw zg?Tx;9!UE{&O4WikU+9$=F``OGYaQ{8Ty)+J-Fy@_I&n?qS=`<3Uiots4zIC5_59y zUO2xnJ9Adv0%)p$n^Wc=^NNZG4jDLzO0YMxy~d;29!~+;oL;gpH*4^)!Gm?Ecy4|X zta|PY^XZTwLx$^6UeWwv*MKN9+023&h1`;O1v&XSAZpY%qlinLJtO1b??B82+|Iet zW#!K(Dx#Ni^XJd-7a%%xrH;(9?xuaZ1PGZh#W{F2ZlVq z5FRXZVV-ApW|8j8U}l5!*n7k*`5f-!V7i7kWFEzE25Iy1Jef?XS@R2dUn};YlVpK- zX3>mX?qhBVd5-KHcuvUQP`C(ZLf^bs%pEg-F6@eVV(^(QAfab7m&+8=|K@J9DNAml>R6)GmFNS z%$YP;5RXM3Hf-eQKrlr)^NR93P&+wRj5$R)x@kjOne(97xidUj%=)Qoz!vkMdm_S~ zledNySssxfGd*()GG}^ob9r02xJ(>3nk@8CNR7-DBs}xIXfXq_X3T@p&&u;K3x|nj z7R=Y#ESS&gq$-QNGmCQmL>$b-5DA}V_-Mv6YA<50nTnF%63S6u1)7Ee^lySPF>uY# z8ayP#2p@ImC3-)1ej$kJ5P5huH1IJ6&+{=r5v95F7vvD(q5|fx!8is|ddrKitn=sR z&7>w?Ib^`#0Y&o%;KK&gT>5?ueaqtCZcI-bJtlK73JtXx-v?bC`Z{D-=&OJX;f4$_ zv4gHfP-74KFX|*HIt&wD+Js_4rNSvt366;keKX&R{Egm;(%HCHgV8XLa~-_I|YOH67;lM}_J))`{?#{RKzy z&jfw_$iSEA_(Ti7;Z7dkCR^~Sb)3#X3%=kvjvr>h4_w3XsTO?61)RQQ!5`er%a60* z6L)a@WGj9v$4|H54}Qw=v#t0VjxVs_%Vu$Wu>~K@<@gc{-lpSMTJTNddHFI6zF{55 zueRdXbNm_$KKMSzms{{9Pjh_Gf`4QepLf(*@C9kSe4_=Q>g4!DeO=J7hmUr1I>{D% zt&SgP!8hpmVHW&$9iM8!KcnL%3;r7&KhA>xPRCES;P>eG=@$G?I)1hVe?-R@Sn%yS zzSx3~+r#BhV!=<+%dfQHr|S4J3qD)NueRXxb^IC&eu0iJx8RrR__Y@N3LS4N;1gFv zj|QA*!C$ABPqyH1(D4H;_|ZCkm<2yp$ERBGf6(!g1%I=SA7{bersJnu@P?dcTkwXQ z3oLj;&cznIA?Fec-jMT33*L}(nFVjix!i((Q0ITG1^%$)-tZ^I7JR$TXNd)G z_><}Lx!fr2Wu%D66VDd#da8^$=mG&R=3R>gyt%{0W-Af!moN(apOpgM*wR8z$^`t? zLiyDKo}xkHZ;gQ0hYYr3gdIFfWKY9R|xny0zN3<=L`5c0q+&?4FZ0FfNvD= z_X_wX0q+y=4Ycr!KcqzwyP1ED0-lcu{8^KL=WlYnD&X~$A$xF8z?1Hczcv9+b%*}) zO@2Z?9S`FKyphACcj5)So+4$W5(IoVhT;Dt3U~ybp}%ASkL+sbZ=is8gs?W-Fab}o zu<@5F;Klr~B;aY^i}5#3!0Rbn_Gq$z*Hf(wKV86|V-UgTYyqDj;0px&xdOgez@I1J zO9cG+0)C}{?<3&L1iY~oiyp5Q@D~c@*9iE&0=`_pCkptr0{$WaUm@Tx7Vtpkw18hN;KvB~H3Hrx z;L8QPTfnas@M8shg@C_Nzy}4qB;e}=ygoHzPa6dMAB6Ia0{$ie-z4DE1-vTYGX(rW z0e`cAZxish2zc8()BbN2@NokEHUS?m;Pojedzv8NCkW*e1^h$-pDf@f3HX5mezJfc zCgAT7@Tmg+P600o_`3xBH~~LJz)u$NQw98V0Y6Q^&ld2R0=_`NPZ#jT0)B>oFA?xF z1^h|@pC#bS1bnuDUoGHs1pFESpDWaD1pGJwzf8bS7Vygj{QuX# z9(G)KO!EC0Cn>RcqoQq+Kj?{SZ;*U7an(#T?L(iqKHApa?@9dY=$mSz@~q!zyV~2^ zbITY^fxfoQgrf+qGGTJT+M6a!6E^KR6Q%%Pd)S02u-BHGFd45_Xu@#>&op5Q;I-RK zm?nPOXcMMDUK?z}6u@g2n=l3L+F2${0lOAu!W5`$Ehj?lr2t*qWx^DgYuikiCYV~4 z3Dd+hfSCQbZxl_Q(&$YnlJ_A+DsFsKwP`cged^mMw>7N-r8Uj zrhr?!*n}@2_$(8q09%VPVG69ZmS02dPb7Gk2~!}gZ8PDE39d5XO9+0`gej2Lo-<(z zptXlhm;z^Qxd~rJaG?n&6Fk#|DL~e4Ghqshwb3R_0kJmNgeef#E;eBbfVHzsm;zrd z%7m{XxaF5n`zZj{c9}2*zS=eurhr$gGGPjIwKq-pYJ#6LVG4M)hfSCQU2VAuUrTVI z2~)tU%`{;ObhX<|m;zjFv?C-b36CbY%7n)d{H6(0psGD*!W5ut51TLrrrL57zLDTU6P5^`X~GnMYPXp%1)kby z6Q+Pu8*IW9XlfUmFa?;}Std+@r50tv6i{j{$3pENNANBarod9$X2KLuYE>pofu#1P z2~z;6J!ircIBE}@Fa?a-audFt;6f9oz)_oN!W1xSx0x^nirQ!srT|eJY{C>6Y8RXE zRD#bkVG0DbC=;dtP-{6FYX5YCcbV`Eg14FQOoFRSIE&ynO_%~Z?Ku;sfKGeZgej2I zmYeV_f(uQU1|V&w2~)tP-DbiRsA;23cn-mXO_%~U?P3$AKutT#gegGNqD*)`!7Xi} z_EVsy?J{8s(6ntKxV_&E!=i1uj=r#S8Xw#H@$zQF=tV}S=) z;7cv=g%-HC1wPXPce21IhJ?4L)dKIgzS6dH(KEJ7WiEY{JI5x!2&;R zfmd1J2Q2Uk3%tYvFR;M#EO4#`o@Rk3S>T&3@K_6cg9X0E0uQjjms;QpEpTrOe5M8N zWPwi%w&>pi@3+8vEbzA$c)JDOY=Jjg;Pn>xT?_oW1%AN-KW%|mS>OjO@CpmO!~!p{ z!1F9{t_7ZEfhSqun=SBI3w(nGzQzI%u)vpE;0rBqZwq{;1@2^lPYkl?-vaNqzS6dH(KEJ7WiEY{JI5x!2&;Rfmd1J2Q2Uk3%tYvFR;M#EO4#`o@Rk3S>T&3 z@K_6cg9X0E0uQjjms;QpEpTrOe5M8NWPwi%wCLXg@3+8vEbzA>csxjnj_d8U4gA4tjmghm9PV>*j0p0uwqLHOYyBq*U`6>DzJh6 zKj7@7K3n%UJoLi|8Zegd`u7D)*0)D%+wZ z`$lQ&2~STD=%*8iYj5Ilfbl-X2PGp%;$54!|3t|*G72Rjklmhck}{I&RbM*N-mYe2 zHo7sk7s}bE;@wdF^uD$b4|RUzw!qQ^f6yV-29}KQw>qRFfkh+y+Z@sk**>V=DGzkY zJ$!8m3(xSKxPD=*@7VPVy32LdxdV*$|C8qODB#rw)pu!eJX+b@lxsfCEmItle5|!H z%6o&dFhM>jAMx!ORjGEXJkZJ4)YrFnR9-M1v*$VOBkXPVgZ)P*7GD@xTk`se_K{0( zwc8xGZ1mMf$)o$oXBh2|Edjn+gHX8qm1`yWXlm=mIEViMaH1?tP;TuLeQTm)<#K?5 zkfULTi!KF99)k?c)VBI+DvJW~*^&~|kLJOW>~0$r zOl_^TdpbdGcJGyv>^&$cL(fADDg`nQzE8EO&m)?Zl!0rY zl#!5zpO74`s^&)ZGIT$~o(|?Zk`Kz;eQi-oJNXXSeZg*r9ZR}zz4Bd}Ca<%{6E_i273Fq==q{4UUaF*Tv!FKE%xkeK!Y^9h=T z7Tf`qGSc6NlS2Psqz*Gu0Sl?)BB@DxK;j!}Hd@hdIf?>4hW{I3lHcI-Fi3;@0s9vW zBg-Mut>E%Fk?uZNCw(y2KdX% z3jFDLs&wM#q(HorydTZ|(J<U z5`y|SuJ0`%e+U9NOaeH9w>LuoP&c^)vS6W_$5=I(ClkFk{y2W|2!TZQc73c;XjhATyl#`-s6%F zsE6Sboyw?m`O9>9Te`fNJyu^s5aAj=x5n#m55L$^N<$X+`-6h;wsj$I>+o+S4;#p7 zyvsSoIn_DMnMuQVDp2mABxkJtfO4$x<>l$})UtFrW35Z}KA$0PY;p8(SCF4(Ir@xp zv}&#Vm2(p0?XJj>kLuk08_C)`@9+n`eSOV#-*LNli?)d6uLlL)!-qH?4Qg{)j9?>^ zpIDKuOkABIA52$Jmx8(!@AK~HYtb;)DraDcowakb`YDoN)INv5Ki;P{`YCVjR)%O_ zqDuAG!$^vV@d1rb&fC-E9niUGCP3E+;xAWH}`P(!(CP|WOsp?;+^0)6J`fBFSC^h_W;ihyb___U*-|=0K zCQ`7~T+Z@0)E+jto~bT7*xpV`DN0)oK29xEKSBxA&PHlU-l*MzGJZ;IX0~jpRdbT?O8iVGx?UTTOzDjOVNA zxqJ*oMu|o2C}Qw;m}?;RQ!1(qRCkjKUV?JlJ)L-9K~j4Ia0mQa;}VgJMFMzexlRSBPj`AX2;`Oep0+78~ti3 zoIB;+SYb!$Qm6{$;!vy`y)cemn2;2Yuagt;7N99fiMj>i-LjHRB~H0#lBA4_OOq!g z#VO-r(rR5vv|<86@u~4nU}KbVJ(bji!+6`36i?5SDadlluA~GaiXuHjG@-y*IK>O? ztof_1KsA>PBV=FDO^5N^7zkS0+E#pt^!~F?Iv-N7>>v$qSb7CQT?#^_fXilY9?t1V z?`LMMpXb>EwGMAsjCdzBpV1@0^|UA=)w&Pb;at_n4v?{l;b2sKwR#oo*P?&Y?J4lL zY<&}*P!I8E+w{cs7XFqx`~C!%@%#KeI&`7>Z*<0!`FjvtcfcQ6UV7lQ0uUzygqM+) z{a8-i$nQv0V_@hP=SSPbkhyVCFkOCa93HAq>_Z9pTPg6^bXN95!b-BAL$SxtBg^#9 zrlNh(VbHIofS-|-{gZ)BSN_i4P#7{@-m6LnsaSQ!@E<*K1h+9^yBjeY@R;4(Lt0kD z8RT|5wOV}(Ery?``GF*#z_jxIhcV(_fC_{b^YvE#+)K}YrA0c?|C;ark)Ho6^7Bl3 z{-O2x#P`Y6$%#)GpB~7mCwcmQ94N|8l`1CmldkKRab3TS?m9@^9hCg7ONL7FAt}(S z56Gg?gM#ackeaWxxBrvo?$T;0Fs_RMKWf3O2JG?03`V8|GV&IOT`z*A6rng5wE-q&tlh_44F`Lp#PWrG7! z2GW$sGni&Ma7KM0O{VIRSK;0zaxWhu{+gFe*VT*IbN zgId*Fn!}`R_;YdoZOVUN8RR<^^dso!ReC^FFWcMRKByIfLU}Ujbh$+e#2!0`bpSGTbw5gA@O6|9#oL2g2eqf!zg6pb4Z~0X zJwxw3139GklVm_#t{83|z9Gb>@)#?ld`J&T*Oka~pfj;oln)s>xeB^bi&+odsZNJ2 zr3XetQ^#_Ur96Yd0o|D1$QXXa;rkkGPM422pKbOC$yaSp8~&~5oRaHpo|d%XI~~5e zIWwgwOd|S9;+3V#C(=`nsa;W-HYvofq;%4y2lI0HPtYrY4@to4vtS4BvhRLahOfA% z-BB8(5=yLx2DHG?PaiW}ei2Gg9LGEj6H?$qVqD!sGkxVL)@=9|m}#;~0`Zds(uX&D z;t2OPUYC@2s4|^j^;r^&;-(-|cPsNHg}nvuLIxuSR-y4gferY-cKB`7vjQW%4`4Jn zLKP~^Ml=-`iN2s71`e9`b0zU-AK;nM7slYZdIBO4%-ir^f$m!ZFz$gU&iX^3`@aZI z1kC%Y9utO*dg`E{Z?D~(3*p^JDUVur6Ae`q>s=xRE@%V=&|i=27=*Y}Jxr!3$M&J3 z$jt3!d?DY_gdR(_@fK^7=s5<$bHp>xL3&W!)-<-Y5|qArkqJl`3oc!if6dL4-AdzNwVFoezOZR0>$AC*G`Yda@|mPF79-4Uz?k;QcquUTb4Vju)EgoKl2^LCRiF56T2CCh zU}|k}Gfw5YbXiN6ccBCGso$FzuwB9Xj!1ZF2TX)wf0MUI0@O% z%KeEc2e+#BgOzGj;OY%1VN2O4H>4a)sT&=bklYzbQbY4T zWzE~1vOO@VlXeRzsY7;i`ytWa?nG8#QiiW@%+9g{E1 z8mO23K(Z(yKJ<7*KH{7N+p0h}B1?42pO7$oKTb|pyzxjQB&5r3N?WWZNtDAf!_qF} zJNq#!cdv0sUtvjNB@reel_Le=lE0I`a>*xoXQQLT87L9k{zoN{jFhz z)8#|zw>;fa;YmIzze4T_LYT~Yo0(s655K|t8DzD3cmlE@j(3C2wQSxcZwf56rw80M ztd}G2^EMJME7f12LaGscY#kUF9T@Q|=yGmRI_OGik6v7(PSW{s_{j=g%Hnm9!Ak8i zGNgU*NM`&&;pk?6Fd%hzNR@-?T>+^b-M{O?Y4TCuchUa#;%WYRN9pURBdX+4ytGF<>a!bsz_A_?;&E{BDnI7ntCS|q#A<#{h>_;(ZcSh*w-==hXFmP`VJC=6* z+m_54zG-Qe+=;n6ryNgfI;@@kdT*jDZwry;&z4mZd1qyPlylk9~;Z@Uh}7MDHL!72ur4m&41c?~Yg+BtIO4Fm zyev)WjD;}C*XHncOPAZ#AJMdOyElO6EyvWuz6t;Vj`e;|%zd_~8DE+!nf$r@;G-stN96xN9cq=73lW=oyuS7*hyOi>h~0fQ zLV6{aLPtvXw4zEq-7}AZqe*~~`wcECKr$8U0Ta6aj5rXO?xpx#n1Bw~eL2HiRktu5 zPAB$W!jGqNfeF`mn4d`7+mA;aCM3-vhH4Y_H<94Atg+_%5tOP(dSpK)(%) zj4wsd+460Bdx)NQZSxoJV-{m$-BI21FXE5#I85Ixvjpu*^5RCx*B;|3#Qd-k=_B<5 z5TPMAU6~%A=KD3qGYbs0^U;P@7eQhxwN4ec|F|sdso<4kUVGPS9i5OT-zd6(RJn0$KnHu-7%lJxhV%V$^w zeryr>x%4D{V!E3ANdF~2WRD%mrvRO$WBIJYcxI7LCzGFw#{W(}2@&{dLRajVpH3(7 zlZ}g%4f{#{4SvFHIl&SmqpS5c-3+?gVu+gcOR=9xCSMN!-_YM^u>iiO0sYN$bB2X5I4Q#LzfPqpBN&>%hwIx>YuH>gpcW zrB2C6to*JAeI`_X*SibFya|dswHs3MZVK)&0yhaGFxdkwG~AU|>rMs}w&q95GW@OH zvjMa5Sj&R|xO~zS+MvS5WlZ#ss1u-?awK%_)tP524tv!AM5qnHTZTR)C0c*a)00|* z=^r`V94bdEVKk(~F4*xPjV}lr+m$70U)~!%(~$l5|FQ#gwJeDR-5W0Fl6?_NoRp9d)d#lH=V=ZCD*!S z_i8n7Cxy^d_pWq#zdrjuq7FtC3ai=$s;>U-pcCuNF60j%t8xtwIvxvlY49DiBcw;) zs0;NChd&9iBaCIXU@4}^WN(@CpS0GBX#Q=qc&#V}$P=>+or6v5yP+5~c@)DRLj1LC z{*R^KJ$iw5^^I@a+pnKm<6Y!iysn$qgA72>J5Rwxh)I$s5}08fi@@J>a|AYUp^IxgL4UH1^+wpd2UMMdVAO4?ePdB*7-)RprSVJe+C@$Wu zUa>__AuDmMl_g$GP#W00PAN`kt;D9k0GV4spXdUZTN$Zq6*IRJ+}v8EtnE(ukg?-$ zTgcw(9NAkckHOxMdD%qvw#&3PymwH_YDIb|%-;6H-ZoaAfW2*Y&DlJnau2t+ zsxHU6w8-NU@4I8_Qv7=;W@1MUCYNOq^uv_GUTYM-Ya13TK6zBxks3WW9*_lYh> z`zRk4cwFpG$D}Oui=)f-@cz_6`;J9w-|6+IsxB>Ej#2xzSMKjN)wicFns^Osq8=CM zc9~DU#`K{39d)Yh<@pAlXVA0$!^EJn4zZou&75yez&+O# zm#ps$c#NT*rksw_RkZb2i7gZ8y|}MP)n=3#}gv;q^VrOL_JR#7Qnc z{qnp}x|N>sxD7p=Rmz z(fSjwul@|)K&mh2r25A5`kv>7sC`&HI1-X)PgY+DWwfuH>Z2;u!+76Nz@i|buKOg7ZaIIOHkOho{}kKe;<=E$gw>QK4@NYEmP(`-2~75 z7$ub0eO*j_Jy96a7fnxyj*ru+;ib48A0U}1*iOc6xnUC{^cS5F$z>7tFhq?{Znj|9yc^TRat!aP4v{u~&!1SoP zf05gL2cpT#(4MG(_ib8Y{2Yr775akDIwUtGBex!7Z2ZQ`gW4bS1w_wpvm7~Fp1?{4 zwmX)&17qRPy{mbc{k*yhNqq$wY{mV&qUgir%J62YaAhPP@T4N2R9UI{hxmD7_ z$BB&IKV4Gl4BT$V zzCgV!-t2gxhe$T~gYT37#BOwKffq&Z@Q>ipy(C2UF^;M;e-dpmVF{ zve#q9#}(+t+Tl#8cggiBM}3u8O5%+P&~%SU&xPsNy6>5km}J&4$sl3|&!N>W#27ds z5S6ki(CrI6x20^At5Pm0I%@ETu_G}!B;EG$m3*I9g0RoT{;UT+8q zC-6NA{}cbWyHbwIo8-EVq$#e0)nOe>`wB0xc5ghgT|PwXc;@2Hrmg$zn=1EVX-VfW z<&eC|SJjD4AJspgSDb8rv|kewH`w2&w9xno?S$p|$;nUvrp(xx%C@Sy*H~th&}*FA z-;Qmy$7pidmGpzT6$~F!LF}yDDDNc0EmLP;VFa@n5_Orc3YJ&Shv?aBx0!Ofb$)xR>)pRl)(DPuS9Indzcn`q5(5Y7eA8X2aUPPT`1 zU%HY5kMN!P5PIM6sc(DFa1Zy|9Hr-h(UVq@*an*LRU|%c$=f04BiP}T*UlFy4 z#d6|NT23_jNXikc>Qr{pZf4P83Gv89Kx<8M#!6ZwBU!9gCw>=_#cHf_(JtJTOeRm_ z9k!3KOkD@sC0MHZH&qDl0e_55%I=k}6l}hR-{bXkf(rk7_1{yoDpqWL`J+mT~w zIzZtKPDuIMljzh-t=&5cTQQPj;pnjggb%W`i2?FZU*1RqMK$b3H8*^W!ZuC5?^Ta? zaR>&~aDeA)-}gP6VMF?U2X#(0C5k*jX{*W;a}HNy^P6f6T1EYj{5S2aNWkXM8?DN99}5x>JMKijLS$u8I3LK|U`w$2IrJbQcj%z>3SJr$-&{xaVTW)W z+mGBEk}4hqHO3x|jn;Ux>3B&VEjM{C0xik%baa&;9oD4y;Zdr(c#dA|e+GcYXd0q|yE z`Za!s%)>SdZ>mXpzjz`A4_W`d1`~&hzHPU^BQ#t znq}divS8snpS;mST|oJFj9UR0n&aQ*y#{8}z$>C{vLD@~{^?xwmOA22&7?^C0*EDMp{-@oYvCd*N!;;gp<5k!%!E^DEoiubhqZR4hds zK2$Fw3pC`xm*mT&SSl>ZmBks-U)X||bmTZui<1H#8v>TCY4SCJWvkKT=2u~lFdqsp z4OWaeIjDXHe$hsK@1;#T(jfhXNZ~UD+cbz);HLKGf2enYb91~i)=%Ms4kP@tsz8O9 zUTUQr{Xn&nB*ON{J4)-(6zV#Q5kDfx`UYOMiK0i^pQ^aO@dt}1l}CF9=LKn@J(ext z*TszNiuHTx+-<&HI07nm`MashBcD)TU6xlzZ?N-sd}SUB^ZL5{$IWYV%gUp@eSV|N zi$@w*_{G=m_g$8^jji1`FoGj#^}Yg}+a!m(L8F|bnof-hj4Z{^NvT0h15QC6fB83; z$3LKIeGz#C^E>myWzhqj3bODuMI#B0laRh9G+W$&cb0zAATTnPs&}G#bsdNbJ(!(W z5POQT(@yLsa5zxY%%iBj*4@DRDpo{kp80J~Xx>7TDALf!AAxH*_G&6kc8$GX4KOIf zuqA9dSs5f#Vzxc?C`yBvgd%vvyO%!KWi_dHp)mD=qV>q=p49)(JK4WsKRAjuf2MB5 zn`Q6^$#vwTZgl-4P5r zm2OE02-^U*``WrX?xU~f8b&xHfbiq}Sw9dU%?S%_iQNXU z**fS6hjQAzYfz*dydu_-HF^V^eX!#QI{XMTJ9cU+#XX1uOIk(XQg!%g2a1IAS}wUx zm}($U<5MS6Nfx3n?9mI{YqP5^7=M~_gWBf^1yUL1Fd~Ql4JJJI8tN?{=SSHTtlWFz z2pWne^GFRF3U|8XjB<4wOpo5wiqKC(@dt}x!9QmmY^yJ0;m|2p(pu73lqC7Ml!4lA zcp~zbfed|6pz)uHf>H`-j7?qhA=6p+hU0YD5b|J5o{1N=!(gAy)4`3p`UB1hO;H$K zwKpu7$H8pA%IB$Uj>>FS-U3Mv6ipIcR6PU@pc^@TKiG5A97{GjN}nMvt^;*AZY)?j zeY@?RC29%~6rIu;F>J_kVe5pva~!?~Y1GB5^EMKMb*hYtakOlszDFYvHWJEJ6_lRv zZ}aq2FzHnm*TFY8sBO>z#L@uoBdnPYhBl4WLkd0kd|mBNc7jd*CA@v=`G9F$nL^(3 zLP$*TPCP!+`)``u&L`}A!lbX5N~kyi1{W`TU#0&0wCjx7u8uTh@a)GM&39SdpLP^8Z{&|SR{2~?iJCL0z@ zPerB5^_T~&NtdyiPySAsSdQg5GJc|FTEDjC5LrnHI6#RirA zpnz>NnAeb*tp+jmQM`KR9ZtCh&K2w7VO{Mb(Boar&<~xCmQ*BS*VZP`#w(w za6$Qlpxk{;8)7B@D(WZ8Sub<3_NxUISQd@e29TxvjQ1#>;^S#xX!c%kz_w|9Kz$F= z35%IA-BB-kx4pg9R)TFxVsH@JCL50_3S>{Fiu%&zAdNbU(Gi_WY9D8GYGU!6Kp8C_ z=vOOL@h#O(ko3f4DASYa#0|M7xq>kEd4qpN$zq`wYeBYA7@gG9i~%G0_FX8>hn7i4$-ZCoAK9Eqak`B^@kSHfzZ!H6e&=wyZ}T#|-8=9e9UkLN|L2>e1nm$aAxw~_-hmm)PDq4a zZvG5P()(**>FR{qU_5sOR>xC}!J}iZAW2N~aim8p@!+4*@2ZX#tUR#SW zMu*1{yauq5PYUZ*7%f^m+dY?n7gY#RH;}Vrx5AkHfu*4^kKn1N0a+~dbR&JN=z-#t zesU={B`Ejwgx_yOH1&;3-sF-uSMKXkxxY8gXZ!Xz)Xs47%Gt_IiLF&}4nOSxk+($O z)5o#0H%J8T6IZOUhocrdIh@PB3%i7;t*>tr7UXd>qzzZ_$QxZL*gC%vH}JUfw(}c! zD2rGtWo@Ko`Me;l$vZ3CkpIOi2P@mK9v^hg368+dFud30gtN;bXBUL~Hzgn*2fI$+ zccYZWjdb(Ses=TF9^>Yr))DrDE_+={U9pP~jL*=ne|xQOlU=?iMm}464=Ok1#gc8a znxSX-oAW}+Hhqg+sts4(G}o{^gr0Z1l=5y)a>&aLLT7I<14`BRqiFjLdooAWusqxa z)E7|GM?^p(0`u^O`YzDi59sSb$Q9x6Nt*m?IudrR^U=g=d-sqX5ZUzFq(Dyx7UTOfZXK*#e)VTX)LhK229nAD%AHe6rDbCgn=yZRE zj(af<0I=?*5@k+vXoZB%sgMqJ`McoJ3JhVQQ; zd_`@yF}6`Pj;FR@-7eEP84jf@n{_ll#qzOPZbZrxpQmQPUz&%kccVYbmbjt8n5Yy`YD+LzZYXwy0W;02%B9!Nc9l*LL2FpuG zEF4j{VH%6*2~l<(`?eQdQ2mK2qk|SRc%V9=yMh}?fa!idJ{M*}f!)t#7#y@1i9AZ| z*@Pd$yW;Z@BDx}8Z7{o`e&~Z`ah41u3ur@#)SQ4ptKzmO2wh#xDm@USZKiaQ6?Hn? z^K{=+)Cbrs+nrc`Hf$2a)`j~S2*<{%H6N+KhO__%U zuqd`1!u%IrUd>Zw1;l?U_}3=t!1+^X zP=AbSM4u`n^;f7Ejy@y|V_DK!c&z3!3DCSrpO5wW{7am@ zrQOYlU)9H70daQTXf(UH1LuyIJF=WRlJtW|wWAa9B0qn`>7oDNeEyY7K@?X{$opvp zC{7($PGmZt%eB0F=PhBhii?U~K+P@s1u69o@ymna_N2 zsliQXhWWy;FR~ZTcJ!btOYXu8lj%!VVr^<4;>potdZJXD%37g}Pw>T^v1}I&#Ms&u zPS=P(c>V@Au2driM))kDw-u9h`B8zZAsPzGU?Xq-e;b2?{l0gPMnul2U{n z$~BT)fYqptopCDz)_(mokypmB3sV?J;>{^zu;1H-n^VU0)UQn;u%|L6f$be-SEne^ z-Ii0%2^TV`#uAbGSE!PB7!tA z$0QOCuOgM@#s6W^-xhQ%ivG~=&$}hcR<9jG)K=zeIxI&w<9;kXUS)UI@L=#F#F%hA z*U`s{Zg@L97{rplyP<<%@EDwLhruAllmC-okRm}>%J%;<82scngTYZ92ZM{CA${Ih z9H(Y}2i=6nf#0wKJPxeyI1apf58T(=dO3aHB(0}&x}oe!SRB}kT!j$_rV@c7yrI4h zv@qMId?U@b*=!rf!1M)zL~*D_rWMyFIQ&asDL8ZCC|%A>2Iu7TRq`d0?|71@xa4>@ zPZ1g188ASKw(8Vzuxt2VNyW5+)RIf)#CT%9KWi``7vd=JTq?wEL-SW#jp(>qwHi6#)VF^|0RYS0d?KT;>V zgwwymppQNDd_|U0!*mwmklKVI_|%tfb{cyS8C`NrK|E)7eT6MKFQzdI9z|Gn#<&nV z*KvlUbPT#WViAY;Vv^5wXbnz=a4bL3;qYIBBJ469mJRS2f#p`U+l^%h( zC)q~{y<@SD5e9wI6ZQN4oc;uZeh2oUvLcb~qmG`V9%omw7k1Yl?Bm#1yj5f$f4%V} z`*`bF)~?TaDbHT3eH4M{e`OynAaJVov0#m1AL}5~4(;O+ko*6ceY8Gf)IUO~->{D$ z!d$~|SC6&W#~iQ@`*@O<3A2xZOvI7xV;sF>v5!6meZxMwa{5UI{SNG-junY)ALaBM z_0Z4snD(&=0Wh_S?BgEyN%rvwM1pob&r6+bALBvvzp{^QAaJVoG3jYTKTkrY9ok0` z$Qky5E5j`J!>CH<@)AcWrM;0H#D2Dg%8iLwjdNE1(iaP~QBGe?f4Ta|*AA&sJ<8Np zD}{%f12D~&zpP*BNt7IK)ZK;f_8nIgHUjU$QWf?M_s^@O{GKxVEI-NP(T8q^DGliUGJUL|ZN1^~Xr$!iAK}52uF9B1c3y}jCu>=9 zav8;=9UP}Ilau;+8YCy{`Dr0KO(So2rBqRJa+i^uL_E5K#iQ)Z5WgavCnxy93^`7cyVZj)4S5egK)%;-L2GUySnDH2BPR*es&T%gsFIt2#Zp zy1U-)Tt_DfC=c3I>y9UMf5S=p315OM);tCu9mlT|p-ifY?I$EZuZ>|Z7M>W%o6W$2=YOD$bwc)Ej`5%v8nTHlbd8*sU?*~S{??fJc z#FNxbL(h1;4EtwGQ(=KJ>jK`(B!#Y07q%ri{Jp4GK)Cv9YY9YTE06Jhp*qkLTuK%u zt$m`$;J_B`=Md%*PJ0c^c}zSv=PHV<26X=#9}CjRl#$p&wk!h)c5FKGey%RV2(P$5 zS0;Yr>l!1E!P)1=%3VDwn|gO?z|?)&uJ(4j4cE+%Nzf)Ea5UNp{iwB{b7`Ly(rfc` z!gIDy(9BC~aFxx=_2*9Ck9M~2+bG|$KK*~?HGBl$61x@zv>PaRy%5qBf>%LbI3nJ$ zjOmis7))cY!F^Gs??Pah;#aCYXg_bb)OU(f56xGx8FRDxIDD@t_s%F9QSN`Bh;u;q zEc#eMDXxxWAB$m)%RVG{D4`?Sk7Ke25p3t>iq#NYqJk(?uwXh7SMG^1bjuW5j-fdM zanj}q^o3CSsK2R4wsC2X4(U^)v=8t1=*K%wdfu#v`Xq{mK8^l+4XsPuO6t>)ZqSai zBB=<|_5MAUp3k7?_4It0QD4XQ;6*p3{{05Mu!dfEnGr;4&e$ywHlKCt<)5MQ1yr6w zU-es{|0nj-+t=hcb^Ey;j^~u^=M0KS2Xw!LJ|f!B28^x|RBY+HC)>|U2tH9k6+Sw) zpV^U#cWgiJHT<^yJbu#i)3KkIzW8nXk?HyG*w4_%1^by!FZ{Os#Omdl{S2h?%zmB* zx+D9+{eLxVJRvt^4Rw%s+xRf5m#Y=ZrwuK~$x7NUZ8{>lIN4%NTSadKKL`K6g=TKu z;21?y`sKHVfR7MHLeq`(vEtzfu4vKIr)o+!qmK#$%nVL_5k3}7?#K@%My5=5)Q%p> z#(Q<)=9BDalHm`?Kiz)P^X5lH|I>vPEL)GZFW(#rxW$9sWM-!AR#ux+(iWnsTi=iK^!doHv}bz{&0$4nIa=u3zf+ z2dy>o{h&sRk+C6yo;Pq;Q3YMiMn_X|qma|L$L=jwhdjhgoVEr@_{tV33$ZSTWblOU zds6u#(^ZO*_BU3Z1LZwFhCE4>;$oG%ex z!TLI_C}BE54X$qKcE)F(sHN3s9V-2cVtO%UmAVKUyy_J1*YwM5TDdG;ioRx)TE8Ah~p z{$kK};_qxu@0U8(5YFFHlU@v?hr3AWnEw&H1e$dy3v$86u%&g~Ch2+5HTDp|W70bg${%fQS+4TR{Jx`X$K2_w!r;7dMP%WwA03#HR!F6 z(w8U4A!x_T7co)N`o8BP#k&S{%F(;msxQ?MQTJMIYrByLqH$P>y@>o*px@TPVRAO? zcRVwI*k3lVr@S2>Fxxc)5I+kG%95DfCN%-#Z^%IufRd9NDH={+gZn{U$lSvKX2 z>milcIXW@2w^gjOmO%KXy}iX06YCP`^)=}|PxQ#%E+u=zMYZhqRNd%q|B63Ef*-D2 zUq6gJgpd@KRSxP<9%FcYpHSQi2{V852Gcc@$JKg$j?y+110ugHE$vLh3gH!VCelWPVW<5hPShp>5jEC9rUO@nhqnU4J@A?L#!hhdCdmAW*B+t8+c0IKYZ8fEle{xjpkyaa85yq)vCByNX{Qz zWtH<7W}vY(ypXPcrY^4k`%pjGo1(QN2`1zVVz&x(vqN+Zc{ekG#=a`jz1^hy%?iPv z-S`U=zPhjqpZ*}TsC0+BNjv8_tJ1~P>lErcjI?jKz1+j=>m$~;m+73fBcIi$>vu2e z(|^;mRvk@F43$ENI410F)6T$CbsfYa%WpQ{4kWIcH--EE3Mx5L?AI#In?|D`f{RgTsbc{Guf;j0oQli=VL!+YpP}shnN5 zhBm|^=e&jGoRLsO&KW<&iJUWjij(J@@l%|~DCgY5^OvE#Gm_5s2IPe0F_aB{i%qXm z#k|)c#AT4x83>>B`9hJnZ&+@@hGA?Q#)e@M(P!`($Y}by5nL28Hl3A8h4%G)*Cfh!{fW|1U($0r zlTPD_zCYvk5Pu!dKfN$xa?@-+u!acG>^buM)2)|(kmbLq{EO(t>bF1(){XaB{AvcS zVK&}Ki!@$$x-vfwdpB`Pbf@|g`UpFeZ~*%(5-Y(JToR1F5!=A|U7!yCrLaMyuZ?5p zJgz1Jn$I-z+2>*?X5J4Uc2<8q9ZM3L4vFmPe%tha=X zR_w1YovWqe_)G;MPUs2&4AgZrZqd3Ug)r(R#8K!L0ex6kyAu}O9z93c*ngN_ghpA= z%J!{H)o@ol*`G?k!6MbxF2lhu#Hsk{IPVno#V1${2=e+R2DHi}VcVGcnvc1E=Z7Q} z`kgs!SDlkg>+VJCKnE6nLs;G3d#GM>J0kAe!2PCh`B(zEGKdRXJa6mA%9>?1E)Xd- zV)X-f_04}3#xucoz1^k22($}(AiCop^$ipc>n`Mv==YrhLwl~p;EMI5AD8IsNBVk` z@%-mE*mFK7#9c|2EmG>+cu&s=I{f#Mc(4uxYo=}5kkne$cN7Iy<7)-94yi7|S3X!V zv7vbK`b4~km;z7g)GThS*77Rv z#?PyJFbd;dC}rZSMjtMZ(1#~5R#KUtRj)!vARA)+Sf`DPN}gr&1LM2|6Eb{pDs{z- zkIJcqMccGqxAr=Sx$*WvoAl>xaq8IilL> z)C_(%@B&MWP)izMr)Fq8KuCdgEKeMk!<)B*FCkVqM6njezk&GZV83Lf_32H}PKWE$ zT~P6Vu|BPzoT0_(%DvtG|F=F(al#IY6WFS;ao&ZE+gDWx`iEVOiPwz%lA&>U0FA?G zq`O-`gznbCjSAy1U#3EwK<8|pAiL>!Jl;*c4VLyE5sD{5Y`^4^r51;w`wQBi9ZC)j z6O97fC6&(Poar__Y>Dvyjm(UXxIuDu_xxKJabN!@s>QjpaL29Q&YVfDItpPS4hxdI zz`Amn3!lOJ`LJ|3sCRWfE>jg1%Rv?W8ttiPKaz+;J{|b(LyH;p=D(A?&_9C4c&_nI zSOU&%>KqUgoxyL8=NDedO!``UgvN7n2KcQL8qX`JzkLOVjPomvAq(0G2? zyH-1B{*CcG?Ss=F&v)O;YhdGfJP7dddE?% z`^R27v@K(1Jo^dDyAgq_7{1d3*)}`W>nK&IpmG;ZEbdf?y~CLCF2co|`ha^CJ*Hi% z8V&f%N-wmjgTXQei?BN!F>*Ah=i&i|?&j-BuhRRSCY^cZn@=5Jzl*uD%(MeNifGu1 z+d9ZnQ z$fvR0LOsmDoQ^`Gzw)K=&6hKK+Djj&alY_H`0ft3l%Gj1@_%u@@PD(V{I|~+dW11o zIA6FG9?p!nnV;-TheeHXlKV+o-emeW<}0S3OsRl*zo$Rf=PPu5Jd->5$wwpm$q(=5 zH8DS_z6V0=eBq=;;EBD@?cwBu+pq>>ew~D4T9cIdv-v+`jF}x9<5a_Lm>n)%%dO+iPd7E4_9!?@xuNj)PrcuLdh`F+xOPu*{{PnL#|!Uxcny61|0e8#&;K!YhAAYJk74(W;fQr$=*!Py zCTY2y5>caCh;Ro(JWC75`pZ!Wcf>u#>+#-&>nEQ@H54AuFB8JsJ4(yQKPs`qUj-hk zJ(L%I>pTdQ{9$MvvVRegjqS+`QC>K7uI3R~~jO=`{^lMEn=*zlfG_lbf(My$dVV-!C{59_$CKL^nC^yAA}%pS3t0 zm)Ep7rr_+`Rk8oV3y%Bx;*kMm*{_4DkriQL})WnVhrV;dzMG@3sR*(&s1DyhS06o{=QfO!ewC5Ny}Yw zQ}f+?f34d272P6wV+=)o^Nov zsJ&CMxDskFoeHP+7K3ZFm*RtH*!4;qc&71xHa_`{hl93-?mXnbSy+Wcwjq}^`vxfx z``Lw2wz1JkSc+`YrlFa-{Xq3EC6ektgTE%#L-4G@YRfv31@uZS$W$kf|jMrr!#RQ#MOZhD6BYSjJ35az@>CF2vtU4!Wk zetoENSMM&Ha6<<6i7xw&ZOPpvk54e#F2^v|Q)yixQNNcFQm|R>ZgkxD3z`$*ZpJ~| z*u{*FN2|2$D8=<18aHpC`SKlTboYy1huhl0nw)C;t-8uUh0TZg_^3}w!t$YipU*7N z^CA&$cnyS?Fv2!Wg8biOkO_&s|4R^w5roxY&Fm9PqJJNx&EyFufW423Zi66v!Hv+d z+#qlD?HWbBcMU)~l&P^BI=(Y*=%^oIud_GwAA=3mls6SLW#3542SqX3t>8$P3pBU7 z95vm8J-1wWOmkObWDnEauHN+1QJbJPs7o8iS_eN%b~28)Pfdk?6z$}sycx5T%Tb$A zm0>3v5nhDV7RgSuy;ww0c5QJBt~^5e ztLp_A`}ux$ezjtqT5*`2LBT=={wo{qM9`rS|# zhaUMmm<*c_oxGpDH}wN{zwx=RVEi}sv!hD=wldwmo2dJ#8}d0tb{^s2%dqd8Nk-G= zLPq9f4E3Kz`_Jd?hZwBwZ!z1Cn_wq4Qu+oP{0FY-py~G*P1pS`UG9A3`O|7Yn)AEu zpCh*arBM4JmX6vV7+SNM+sl))@FMKx2iVqc*$c(2h+hJD4L2R`p^YW#bb41A`4XyQ zC)!KAPPGqPi{As1baL|sl)&NquJ9MaNqst{uNEDm8`E$j0LG;_V?`bJAAF5eG*!R} z{F+Nugx@v5j`ZJ-2`6lK3=W21p#I&91?XA<)kak=OG<(R>!@lL?@+L{5`C!o8SZ~h z-CnBBW%lwlJ}maK@}Oxije}arS|)x@Jw`nf%ReV|7Ir&uy>b5`*-PznT)RTNeA4+3 zv%hFB{=U6DMs5NA-!2z^BR3=IAG(J=j3bKdIPSs+Afk~gGLXJtF%$Lo3ul2E_@Nzl`~ zWN^rPvlSVzR=1uOEY(cb;ltLmF5;>ircW|xJu8SjbsSrFev$HrJJmWkr&HF~J&2Jp z>^zE(kiHQ4hNY;lMKp72DQfEKd>%vkTKdfC=mOs=m%^qa~Z>1)W3g1$PDA)c(SH>gvJ6GDgoRP>bqFL28G`nV_4*AMuJsIU9b zZT=H|ZF!1IQ}BDg(Z3Eocl!DYWb+zW|Ed51uCGfWI8k2+tg83%e9;Z3nlEC%V3SgZ z36rbJoNt{*{zxZ)Uwh#+m>nDOUd%(xe$;O=(EyC!NjiI@ID7aJ8TNZHaurKwo&1Y1 zb#fIh4mlRfE{d0Q77=%z27f7afpMKIL_+asb{Xeygw9{7#>ID<{Mr8({0T%t{M9_j z`FnC2m){TSf5czZ|AIe(NQl2AoxfkEa{gTZ8Gq6L3;qNmA^u7q;PRWI^Y{GT|44o@ z{|o*EA|d{M2yp(^P2uv3`Oo<4^uORwAQIxwrSsQE=P!E?m*2Ig-hZX6ZES}Lrd6q@ z-ETuLhfNR6{Wj0v&*gXTU0i-OyHA@x-!c7HAZXrqx_-rcIgCMl{)Y2^I)C5X$@xpt z`6K@#(Qjz|uKQ!VU$N8`XNZFR9u4F36w~`~f4E}Lj7>=ohJVh+R#ao@Rm_IcwP4AN zXC8xHMJXjlQ|`u_7L?P=xzi z`&sz~ua{!j>u}AB(vkmX*1U?u)RB3?E1fhA$&2!8>V1#FNW$_BS|bXvJdLrQWv;)z zgj9-Fp+DExtBx=bpxfMCt}{?7mpqvIJZEzdI%X~Xa5t!U%TG;KWi$H2ZNF0nf?C54uQwE5L^|FdXi-<^$Cj?|z3 zgLtMb=Rzwx3wG;-8y!U~|6fVCacR!BbS9wbC7W4Wueoz(Z9^wN5zkbGFQj!mlia>$ zr-@E(**=~0kO&CrWT*gHJkvwG&Jienf9f=)_g(rE2^SO=Um};h;#tTa7^V|Uv{wS# z54;Sg(f_C)k? zbzck0=%a7KUMjV7x74n@%*ih^$hUW*wfEo01MH+m|Nj~f&^M${^TS>?(^KL0;sH($ zzGuY)lo^1bCI`0@4={c<M-`~P7)z^A8qOmAnKp`fb(EdGx;EpI#i z;Q2v$iw9VPZ^Xv~{F9}YUuWxlq*?hHSx zU*u+?6jV(6Gnq#J{Tpj^FK(BO?7|&{myLzLl?Qc9SAJYX9@KGJc~B21O-`^hs6h}J zIa_P+5UX=;)(AF{ApJm3>D3fog*7T(w;gn|Uo{6c_%Bk=Gs!u_>FpnVzgXXI-~RXF z4t&3M``-`J_jB6*9>%nFWQXALSmKS!J=Nlt_R^@Uz0H)Sb53Gcmc_VFV=SGqL(T`Y zTWW`#^J#)NU2de}#1{b3Wd=`d1uvVpllG7k{F?9}2b9nKK0gn$EeeF@+2#@(w9ySa z)#xwu52x?Mh*f=|edKJLZ`q&*F2$&2o0IfoZ${!nk$p7RJ4OTSb>7Czvg0(mRxhzcG=ycues|`Zsl;Y$ix02g;?UZ(T z+`pTM<0eFa-c@ihF@)iDFc;47)SMhWg*zIOan)7lAH}0!5$*}g4h>?K0oq+C>Q7E8 z)M*3d7yX>xl_t*Vn7mEUqm7^LVo{D8lUA*?X~zx}ka}qRc()CaQE{EjQOe&Fx)yh8 zjwVj%9!;Fn)Ac#oT8&%ZA?xnn(>bU=%L0~p5vy9F(F|i7LzY1PaKb*WZ~@KjH1QEx zwwc)#;B7$v^h+hU@6Gt|rQpGQl+LujKu;RAd-$a-|A~YV9Maj1%;)|SA`6%v?mzMMzm;DA!zR0aKday5hSGK5kb|V)1z)UE=kuomCv7jJ z@#*H_-P#7cmG-I0t!H3>HwSo^WWoD4m)~s*Z?QFAP}~N*+5lcX@ch;8y9MA50KHiP zmp*Tr?(Y>I-WOWOx9aZ^0leV`kHb9$&-qf7g7fYZcf8{oh#`q^{sREsmbL5 z@9Co$@9ND*bD<+}e@p3T;w??A&N*KS=s;ft=gHT)mu!#<4o$=LNqaS~GXuCiVNu4h z9)JY_qMG0Rfj0BGor3wT_HaJYy1P|>V*#8o&?Tx(u`17s&4&M&k8sj$)8X76#{Zrj?#@Kbq7;V`oAtA+X`THu z0DgR;=jHZl1Of8Kw`x2~fK=`p;|wvm;ewzSoz->apqizz!u|6wp9dFi_>4l^@Xz~N z&x?P^7I^|pn8QCB%(3cxqTq2~E=~X1PwZ!Ou$1AwA%OC8pxpcobmjR+_4o7jFK(m0 zvro)_nVK+qFA4yOe~uTR9DKx&Z&=}i?rp%E6Tq8yk~9I4Fe3>ks#Ks&!EHa}Bivs= zhy3GDWY;?;p;>zto!Wq|pg@=Df|o3s&mXTWN*++SPQ4pOdl@xRG0{}S=sC%f2c#mT z4+7PIPAIAODgzB6g@9i03c@tQPNjZg4*(TS?3N9!Cf46b14YDIs|D8Qx$>H*`M{pZ z$m`0^8txH{0lt);S+e^^h9gDe-Y*cy?A0p#d){Wr?7ozN79ushcxY~Po9TKu{@cpq zsxRikLb1ebq(V!MSoUVYSE#v2{9^vq_#TSHm+F;X93<60#r-vAuD3{yjy6K#Q(_6b zj>D}0Ei(@47EYqL8>)E~UXM{w$GJw<I9~-gD|^$^?M%ij$LX){PaI2i04TPQ*dI zWr1W0*IEO6L9A}x6at@PRX^taLn`xIJ|+CM4RwKC(6wM93dFo-^Dn15E(eaeB^J4^ z)1a2w7weUlkos?^i0TY{9cB4zBDL@E=46GZC9PcvgF(xSlXY|u-u1we3pGv`c0Scx zRKrgh^twC!4}A9$p!1}(1o-gyTodB8^@5Tm0nn~AxUCeB-$!=gMA;4}nH=#pL+W~z zFsvjxsw*10UZy}|b}{(4Vu~g0vB^e5olB)C9>`k=+Lx65afE989CD)f_QTiYs8FgM zpF$;{XY*I|;yQGCA38&ucj~z(&+Z>I$oeLWp3EhrMM@y0EL!!435-V@_W~^`5y_gx z7H`%lC?ER?3Iilh%w&z>YQ?YqTPTQRPUiXnJ`Ju?4vWF#Kts}Q&+vY;O|F_rLcVpU z0AF(ARAT~?;D+^r3o?+aL&)!SQ6lsF$`NKg-bw;f4m)_9S>d>xqb`?Rf%^Nc=HI z!P@y+win?eK5%IRqmG!;T`7%`sTE53Q|E8-iTTz?&tp1!yoB)Q?|^TxT7;Z##$CK2 z^4kKLW`1d5ajGwZYAQ1Aiw-{GlV2Z3u0Mvch{TWJ-wlz2*c9Z{Pg6-f+{*6*xUF}W z$+{+}WX^`jnFU7zPr~O#22#I&X$>DVdY+qOZw_jR%_-9bkJ0KMSuP~G+?OO6?iPPs zG7{gDmdg^88$8);?9gXQML}uu>ONS2+4qL)zVK-bG=`53M3wDKzhB!NNz4aHWsC~$ z0QZ+e>L%Hn2T!bS&UdH!I?-f@K7FUq0nt|rI6zGCCy_Puqmt=b*8peG`Sp?OAHkG} z#P8={yHC~(%E|Ta^J|#}k>I&}k>(n5pRj2Xz^MRIhL5FTnMz(nlimBs4HTbaD6UP6 zoa1`DBvrOf6H@QSF+NFdmO{MfUf)Dh$)JWo%Sk0N<)c61D>_9(T+g+SPW$80GozzY z*RVA6d@m}BOWuoNYJRJSWP2qq<$i!j{MY;r7kGysYR(5h^+#RFLL?b&$xZIW zLBZ2bk$8fYy(q6{e|3k^7wp<%eh|j}u~>$2)iu@uE!bTu;~7i%A7<=CPLzy(_xAQC z_YGnRe!NT71AYwWO8KT9H>Ow}z6$S6pBpyiW?6wIcmFW7%jA0QEsE5v?qoBdk*{IF z<1Txaiy-0a$#Y%tH5w9T=_o#EmS)YhSxZgda!Put1P0{ML^!HWk@7qX? zfDGq4=_mDS?DS%fe@(~%#4@oavV{6o=J?gt|y{C z+Wzc5y+o#`Qle_>wb%ra8~Q=W^x_hP)ENV|e4U?H)huHHuDfJzYG*!PFmppJa!`ZB zDCGvcLy-$2BUkY909-EpKHLylv}Om^<)0F#|FT|O5IOCm)cb}~4b!fPKfR!KLw;WL zImC5K>Pq`m%rtL$r|qdNPi$s(OEtB+wzFjJiFLh>^mE#{m3byWwKxw>VPfl#lZjd~ zm&q;bzc`rkvi@7k>Yfn^Sw?Krll3TujFhxMQ=RSnUd+Q7=DE{=WZcl6(LwKRywbQ( zM?41a=je2Ly(sCm($+@>ulYh1Uob)8)hS&7)KoH4ef1jjE)@#I0WBy+*x-)Pd1zk> zUag0BWfr`U&&B#rMFmXw+AwU(`g2r(HY7@XtG~#?|8JkQ#=oa;FF$NAgd8kSORc>o zckZ!mwmU^D%b+#ao3df`=MJ#;mD{R8S9`d;ZSa~ZYmZUr%_y`JUfc&p|NT;Qy#HA7 zMF=p!=c%FM-w(8Qc;%Q(bJPrnq86bRVw9wG2p|U|^qjktkJXcBihSloYM!#mo;=4L zekDDXFnkkX7;w^6Xs?iy;(rfR*(FlA=atGH;4L8a*qyFuUTKctUZXke=Kfk0l1k!ehA`S zz4YTY`KiYgev6O5O?8TDM7 z$M_aWQblg4!*_RVge1=?Kb$mH>G206`o2YO-PwjOP?pZdop(^IbbF%IF-`8ViU)mGp83;8C_ z$*ml4bkO_9fI};DQ$-Zc$Ya`PqI~-+Zl_4@2qH876d-W*chYC>BHEXM<8|5r4XC~n z>{{KYSPx1(71Uy&MXFDPZm{Yb)aHJwYkED6qSqo`*wIzjP54P1{KXtsgRj8f5*F6X zN+?PMH6P{6)!an6)PXb-mXd(`m%jd#tbf1?G`S^1WW88^%<)%vp;`#bO!!c$1^p_1 z87ONvQBdl?!!HbRpr|&ja=$Z3bnZRhIj^rvu#ak*K&@m@OX`NN({cow#u1n-_~MW4 z@;0qPs~0``xmgOlMWFYh?JXSLFnPYfFD)A>YJAEvCe)8#9_gv!=idl2c-pPuPipLv zgXd5|@&||;rFx6*2Vz=|wYV`J?jHmf)<*=S#A*v-iOPC6OWh#@pl_+kRnrn*3!X^{ z%`-K}>sCQP^_o*wXDexG^xV{FyixKW_(h|vrf#5?dVOPnpR~dY{75}!Zy49LuHRIK zN1`M30m9AGg^dqZP|;(U3ss8)GivhO)Dmj|qhfM>E^YdrhHC3g=2M-)6g#_MM{pLZ zsjIc-C~8^$x1%CA{0>0OYDg^>!5van_2PVY6A-Y3Qb)?amLVbcC*EiM4s~W`<#47I zXmWozTqKoxiT-24$Sz79C0+~YX{{R=SHI8hQ&=KR_VoACh28t4N@*}Hk8;>}fMh_( z#*0meeQ|`af$An01&B^F!_r3iXDP2mGS_8;!?CG#ITjjkf^;%GG$tr|oLIdUqYV*W_cq1b{6WcU%YIRExdR_G7lZ zEWD)+dHE8vz-l@5Dnsv{dkA4!QXi=;2eGQj^3A-1QAFj4W`{g-$7_p3WPhEsth)JT&KuqP-_V?jr^|J@25y_cVAB<+;<9qL>}w) z7v>Qsr5gArO}MQk=evi|9ZAkLR6z_3scc(vKH|$&%(1*$v1Gx(OTFOR2jMgMeTj;p zCijlO-a+o|;y>reJ$ErclG>UrnTzLj)2dA?;WJ>pe~E`B`+ShW^72q})D1IuPx&GS zZ%!!CdI>44$<$*^GlFnpeAT4$s)F^^+q|pBALN%+sV07A4`VoOp$lfkU{CA1doq+q zl@F(8TD7(Ak*ZMaoQYVdz67`?XHu611qMQ~w$4jU#MqIfx`rxImV<>dgti(Jz_5R# zd=C9&^PM{pEUHQ}^wXcx?o(d6p^St4mu%A)R_wi&buCeKR4LsaOZ(jS#k`!;4he?@lfEDCeH5D zu_SSIpAIq*m?_7i-67S>3hL^p3Jd1?N?UjkS_Q0CNizBK`VIT_hO-S@(8~KSf7d>?*LzIfGQWbE0P+3 z$_3gTg2oTU%}-}4Pf*uUk2o_ADVX>N?WEreIkH7`9Y5Hz`}wXPtxtMRdnJjo1%P(s4;1>Erl0em>@`z_DZcqp?^tNSk-s#J(ffK# zC&nF{;28=&4YlQQwr{mNfEFped?o$c2Qx`5s2)sAUL`TE6InQ+wi@I zcbrOux(JX#kfE;~kzU?hLoP@yZGy{CL!r<2aACI+iUsw#CGjsKwfEChwCX={&|R|= zc3rgUOBs{VjZ2Uk%BRI9sX6q24+I;YR)D2VbQ;lB86zxF>rqqw?&NVaq}eAN!j$x{ z`KwmrJ$R797!a0FNOE*z6E}gI$8^!MOiH_DpR=@2Bw<)Q)TwFl*sxcwd7YswWRH#RKxKbznA+m?M#ilpDuA z9TY9|@UzQh+bvaoeKDQV;-%EX^cp%VP3{co!%LM}bUUuFU41=r>b{Yp=}U(qdu zTUBSe$uFwrM4&nGa=v!TtLX~vpJ z-%NM%Ds=e4UB>ZeLa79rBC1=@KdLvJ{|M86LhkIJp1ydHPd!uGsw&ly^AYkwA;$~N zv=L}FcupXv&$X}JV3!Zi}iHfZ^PzJ|&=mE=HtGC_{ZFYRXZVZXrVec2+S$FhQ7R(Rzhs^QIL9JEV_12KH~Bh`okjBRH17+mm|gRF#ZF~o8-Jbb z&{URaSKXK&t8VBR8?v;bS1j3e$V=CL5aX;-v%PF;*MV8(TjeK1UW&v!1C~2_yv(cK z+CEaVj?dLwk>3(8j85;pF`~Ro_NHsBY4M;{GDCK;AWWuwE;k(16eoT}- z_BU8mvT8rX`0!TkYM!t=7e%JsZDkJW@fL50^W;}qa`2k75#h;8W|k%olZEm%&_m1i zpDJNFPwU-Zr|{mV1N};x;ICL2m#Ruu=yHmw`{vR)Nxtdm81_*XCLRTo~ladau{ujSiM-&Ja-QL=fTw3oc= zvI95}I~*DDT9^d$G983zVf1zRUu48G#B9C_O-=GnV%CRxjOg;rTSk>#PU3H5S{+}Z zk>!Id9T{7k#FG4_AtxD5BtAfLq}6@1aZj3&Zd{W#4JWm}8 z*0bTc$4nm2M{stedI#m(IJa}7zK;*u3(iH(v!5Erw)-_;KacV4>eCql;1hsvul#?0 z?#tV`oqj668H>dI88C=Q+VT3F^S{HjM*Y;izc&@w2;@KAuRvq z$-evpLHSR%Qhw9Quz1?v8kWDym(LvQXmzImP9`_T!@_UiW&EA#^h ze=RR{^amNTke`vM`v+12dLqe9q(+wlB(Lg@sl*j}mnKM-GP)jlDX=9F^hhVi>5?z6bVGyF@ej8u{{x%+r%4hC-#;_G8Yjy(}!vr+c{A8dRy-6Q%opr@T z=>sX(>_mv?@EgIs`}h_8&z`ZUYSHiodlxjm*sf|zzq4nwo4CjL2EESBj5zITAp3Nh zB$UgF`1t}@Cb`Ci&QHfuugRG%7)c*SR$K4_rA!oF=n*;EDL*2J0x!e3eW<3+- zU~uY1$+Sg#Bh!L>5aIcQw(l%hrh9>W>K@%x0RNxf75+j_OnzKyCPu<`NPb>q#EY== zD1J>C7idDF+{6+k^{)M0rdUd_X>p-`h<%&b;;#9P7O3mW##YXAzdOw)mGE1J>7=^i z!<0lcn?ir6dE(4T_^-O+!p{4i81ks2*)P2nncmvqCS z7_X_5q1aGAF$+UCdR;gZnToTqqssljGYOH4)roaZ=Q**M7o_Ni=T~x1RWK$eaPg7d zqGW?)gVS$iWJK@Y7>SXCdmpAhQ^!zAD&6jy4%=;;KF{wJ435N&@R&Xde09DtsOLT| z6j5E2mXpnNEQhdsQZmig9Qxp`O{|Oi`7z;2p%G3gcQHiz6AZ$PGDpl6Gv_U|97=T2%VCovme0)Y^QbzLAvhuUZu!jiv>#LGx%9hV_6zuPIkIJs zy#N`sWO)*X3Xt$}5AiAMcn<54P#<@XdHwyxZpu^0e&=F%i0@|KlbbN~qqj~?m)s$= z=qn|`yFkO5C3U+v;mm{jS0t|wtC_J#LO5X(Y{yFS47OArQat3M4i)XI_uC4ct<2i7 z>FSO6OwPJczWgYcS;-!(d6s}5@@ob&c04n-jEi+|V=)VlKA}HTb)G{LpUKy;40Zo< zae@ooUg2gn?pM=IZl6Wm1cEK|PMuPoo|XJNkAjYsFNFV0`qe_5n< zZwej|AJZe>G?=>(~Kl^XF-M^gS>cw^K6CLL2vbhA93jq>rkMLYw`mG zflyr40@0*Y!`kt}V)A!vOAFZ{*o{zS*(>vj; z`KkNvQX~03*U%Xn-gmdwequjo#wOrN5n-N-@9r@&JAIx2v=|QCD?c(QZ+7|=l|P&o z+*iELVjp=D9f=IjqQczbe|Bii${E9MdpVrOP9!9Kci;js+93r&rX3yq<0sN2$ZG=a2SaopX zRGf^xG%fN9X@ZfDcH6n+Y8d(cCr!L}jwm?ZQk65W%vYyUqXoBIjwWWz&z;-TL##Mo zC@$Q^P*v{PKk`1h@rC?~tHF6vxaE6US)!SJqvq2>`C|J@H$lAGO{yD)+jevQgq@gG z;_T014#%&u?X*O%J}H!wKgS`ZXT_^+5Q_X!xk0>*s@ylmI)Oe&7F7Ml2vrdd^gQ=I z>UHkGZo;_WYzi5j27w~#%z8f26UFiCbU5@?IW*0`nQ7NM)2;&8I zBw3~=_>__3{U!hPr;YqbE6~kvwxOHfgQwcm&06LEuW`L4C$IP^ z)ja9gEVZ0lOnrtB6fx&Q%?L9 zYO>y1i5?+2cq~qq)Zb_#@FxA6M+m$v2iYfGebXjCBdYg13I{<$?guZ`-OJg`e?2o=ZRQ0Q}ca$-MM4m(qXaNCRX z@-4@6Aot`l!KI+xR@aY0CCQVsb{!7`L>56r^Bc3b9aj=W1*3eeKU1HfKQdy&ZAb1R zHs{1F@pZ88{6FtIzLKUhe0iJk+NAzyZy1pF94*ESj#Y2jD^l}5Z#OQ%Wv1&Qf}9)u znJB^?2;EUMQF;86NX>j6N(t=9u6hUWro7yt6it)==kOR!mY4%{v6a|Vo}Ap#oqoBBa3pWByLeUrc8NQe$7tdO zqDb;9I+-zL@krqSLaE$x(?FMoVidYJ;9Sj7r;;IGL~5{1yeX0GusB!T6Q&jSE;amN zISh78P$cW}8!MRlh@%kx9|yX!xdt-TD%C>;DcK zS$vbfSZq@g=$AXN(_ovY`Qz6YAA;*;Gu~lD^yH!6jYpcGbXG%A5UNF;K ziK+Hr6w))}`3`^jp%k`6mBe+xBQ?xMQ;4w%=9Kc!0?65$r2dlesjTrqy$I z_E6tY;pr-T6oA|oUT6GU;d=eNBmOJ-+j~b~dRlu_M42e54+-XPj3xW*3lPb#OSmZj zVPscKBlF`7zl<$Dm%DWZ})=y}3dF&O4@z7MhXwZc}Cmn?AofE*nW;~WwjhZyM5 z(1jOXjv(Dlb4gYd{LE*CV+y=JDW` znC;#U6FpGuq)4xI@FTmK=*M$N$(Br!u-h9EAkJMaCTjI|zN~kl2I&M_Q zZTT}aj4YExY2sTL@DEwjN@h>YQn#gx(EnGio^<09f73%1U z4>m68Soy9LvTA&y`o{*7tNxzAnRhHWHHNJ|lRQvU7OE8)we%=bGe@7lX=gZ4 zsn$&c*Q&`gl+;J2wTB|28iIHiFU-f#hI5D{vJ}Iw9X_Ee${o^WEN>#y3ixI8OlVW} znjM9=-PQXpM3gL_6JO5xCmuy8TaHEukF3QT9lu8cK;t31A;v-DyhzPrAeG^Q=A2}h z-&9hosXa2C-jO>AXQyRd-Ijm$su+lITyY?~oMO|i&|NF$>}nRUglMq-ZDkKVMC+JL z8tfbosI4lo8ajv6P15dyn($BMCKi7WagiL3+vurJnw zruNm;NenBrex#)OLVQXIafPclw~x$tjWY7aL~iJ9SZ#*W>zH~KDNJ?t{{M2FRM}rD zx@nk>Qsgz?VB=y@$Pdf9YZ~T{8jPkDoqr5jUG_NhkruhvK~Um|0V)F3euU>D6c<)V z(Z8d8p-9cMreLu5S>Z!=-UT%EpS)!SyaVe*gj`n&H1tJKV(JRRDBEFobx%96zV zPr`Vayug$G0~B_<=jm|x+(gOaCge&tb?B2c{ua7Ug|4QOu5e%BrG+K7Q>w5m zd3jGOIm9iolC|3@+0PZ{OK-qCsUyKOW6!yr`Oy4AnqJ&iaBEIxemC>mHtsxMxmEl| zHl)V-`4LmQCf~(3p)YMtP>sBeB2U{5UFT*C{%;Ka zCU?ZP@R9Exem|Xe1AgBSey?2k%>FM4Mr8JPrPGLv9>0SM8QGEbsWtedBp%t-i@nDG zr3Skw*f#o&7rqn&V07HvJ+-mkmMhWASfx4nMW z4kE$5r@H&Vj&-a_J3?b`IZ(Y@9L)a*vE*<>9|pp4{cP--+DVl0v!nlcT-WnPbUu;a zJ$aqibX=kS$Xl7ZZlmN++Mh~_L%U21zf{#1jzX>Mu2@}ss3ew;O17M1L11!xxZV?+ zOkA=BD>qQ~jG*iap2zs_i}+q2)|dNJ&nx-P>Ra^}Ytq8l<`<-q72Et4R@2NNwz)U* zlBngj;+og{xaN1SZX>RFy^m}DBOsgNeP~Q$P`!1>$h7O#N?nir@5|3)A7yNZ>tgvU zj%ir~y+CRMj=-dXQy%O|m9pgB>IO4<`acxiFn^L>;$AqA}2It z0{4Up{h1}Yk@bUU4ym8;gxXseqLFE3LL<3QV@3o2xf7B}EMzg?;{F9FzUWykTuKpI z&|+^tAh~O{KpRQJB@y?9Ho5-3vC7WXTRTK%tfyRg;#=Zz&m9Qm_;hv_9J~;lx5ZsV zWD{@o90nslBK78b=z5Jxw|ECi!gZ#_SaP=dmWW%W1ZiYvL)$HG-l3F5V|62FoHBYB znQ=M56rrA67~{8Z*h+5@8zmR&Ic)fIS_m7Sb!xg{hg5d6zRzmdDp|vuwWK&a({MW) z*1O0I8SU2aZ9~I`SG&n-^j=95j%-nYX^!{gS8~3AtQ$EcR#(@L7iD#I*hT!Ye0f+K z?#`(9;P<3ja=r#T7`3`Of?ibtEL342e~Jla$%nTk7uJG)(#lkS-!oG4Cw>->Z|q7& zrR02-O)gYL(hiC=le3TD-;0(WU7X*LzqweO)SQ;fS#>UwD>rKXfeSmGjy5{&H-na^ zGj~{bNF*@DJyOUBlDGo`l)%{aS2jD5ntOp4%XK?V1}FIxIL4P1O{4W>;x-Ko$rKo= z!TVD+%KoPKNCO}~g0MOs+>RF_2EBk|=4(h(*D(zqQ*WSn2Bi!x9z@8)sfpIm6k!SFT@I4&eTW50zT{wo~$5qpC>Yse__DA*S`Ie*J9jN!+Ks2yRawqCdHDeBVZlqkDnXA-! z4`~dC=DB9B21$)d+cj>Ley>cogR-uLAk2^qleE-A(X4N1*b>u~CYGdrXCqb2qQ#~= z^;_SEwYQqqY67Mvc6Yj-o<-CY{9LpbXAco#FW*M=djy`fTf;1R{*I0CUR}{&QS$CB zt-R`rc2lY4JiB6A7sw@McBHArOSRy5i5ECcaZ#j*Fx~WFbQfq9VCSw9KV( zat+Oe-j4adujjTPahu|jDf9|Gw?kxFzSnc-pt{=7bHlMw#3N$qjGnuU(Uk5wu>)@r zA%Q}8iJ-VZ1r^ee+sf`TrXKYssX7(zJ(v=*;nqV}*~-pg^F^k`s8yCMdZWK-qcf;f znmjy~SlEvz_wVmaDd;&A(?cj9Hh$@E(v4RG++9QCX>DYcOerAv$am_|2(^*kMP|H2 zEw7C#!yZpB)0|j7UDE8TluXd$gCkL!Kgg(Lvp@GAi2=csjE9e zW$WsO+Ml?TS#e^6yBJ=OQaX?}ij(tIhrLh2sj{iVv3E61q)LDL6oV8QjcfSO( zX~g7wK}1`LzVvl9|98DcNS0lz1aRE*a)ZTeLAL!RlvG*x7gG9xA)OBHrVQYMTGpjOjuLN3f-%l zv;zrScq3r4VGs6zv>&z3ooj$5qtU|fM1?fEofx(tH%gQ1?dJpEVdb$jnjLU@j<}HB z%rF+f$G^ntp3Q4%e8NL;9{>w;g6b8VTwU#cEnzoySTAXZ_h`)TCF^qsPz2OEcM;sG zMZ}Hzu{Vx=Pchj6l!=lR?!0vd+4c@ahXgCz(Ur%8-lmoqk=wa-vrK4x1wuPJBzg?P zoVA@p^rvuqS_ssQT!P$dAlRAcXLmaGPO_wd@N-TzSeWyYaFZ%|YI+w`=QL(ntHoj( zG9kOaV~n(o|6N~s{8>&JAF1Vmt?*O4UoL(`2Mr5$Z$HMeVe{(;{-p1@WhzH50pS33 zcRM`t-{HMHjWYPG~nV$q2XHG!HiN{{ABw@iI%`+fy1IBP_kKyr~(Wz3I5Q4 z8yGyxfRok>92Qf;@6u{|mH`*@-(|q19U8-f?{Zk2;lIm{OFJ~i1mD*Hcu8pBU7?Mj z;DmN1IiH!IDb4$6oYdKjA0yAsXD{M>_J#`fr`i<{`TpvEtH|fEYTh;}6D|j|H&lKc z9r9`<-V3lzaqKd$%&J>DMy4IArs{gk`D;E=9h#*b(%VjUC*p9hm0Qe81`H!{xmC={i$)G;LQxgu zA0RXDTV9tXAJkCNNPjf~C;bOd{1x;&PcZ26Wvr!p?oqPW6XSu!&*W9n58PB@$L(4)w*9bGfv5cdJgTj?|_X`7FhS@ap@+X z!qjqa(oE2`MBFNw!MIYOCIv04gL0hcWn{)eZ%QE~Heh!$xe=&#xyd&Q; zLs+avE~Ams#G(>FC(WMr_*x^?s+nA<=McarvNQ1|K+y~_V_0`Ne>k*1oHsI+FdvC( zY0=NF_R|*m!=a`4X5b`e+elm~W0VM4nU$9TGC5l`lC;qWW_J&$mj@ujvY3oGpTO{{ zaEvNg8FP+&iBd^BM^rYsP!%yZMeWJi!Yao(f;Tl=M&`G6j;zgfjtK3TzuCdvsOV2D zPN*FnfgPocDj6kG1H`*po)Gww}BMOQ2?vhx%tj2Z~15qD|~#CQ;p>m~n)=u9uP zY84umNyhBQ6_^p!&(sM(gf#$hw}H@b3%YC|1F<@7w+WA052qCZZM3{U)dG1exiGxV z_Hn$3lGAP7ge^oqZQ3cMe5*z>g?-=JQ8@6&FO+0-6`Uam{4B({>|*rurvv0;*$HT} zegB4GHSsXu7tG-aLGprKdp6)EeofdL3+uw^W(=MPBw?-cA#xD5WHQVrGI6`F@D}mz z-fOWVr{FW<(scqr>Iak$aA;wJ9V7;9`q+CUQ4;$ z{8Hot^n8{-=FM9@e0P@W&j1l$-<@ReUr2TL_Am@GNth>AXS-zVJ{344&s|M%^U7cx zrc#E}6yE#sPu)Ta*^43N8p-aV}y#z7kuVsp@^uzg)opBa1_BkQYC&-62Xj7JG*i>-=_dU|vg z=v8OUduID?JNpfDz;|2qEol_0XAP2`QQsv~0^J?zUY{#v1#hLXEj3C%6P`h8l!ieY zV|63zoA<^ZkHwcu?=JOuQSz&o5@0XAyF&X1I}Q0pc~O=tFN)M|K2T7*E7(8yCK7*> z39)o2Pw;Tr;~L)o{(%_zEL(RV$`eL*~GXyQVscgN^L>P21|-Qk;$ ziA-yl=O=Q~7_(kgz zX`M*3Dfl;}bZdbg%KR}ZVHV;{H}Gf?p6w>w2KsIw7sZ(?=Msw-`>+?ErQyi{2OgPC zi^88v!M6tzR)i+T{3zsi%WCIcNzBCR>W|S)4Rq7JLG%$c45w;Zz2`-m+kO5q9|A2N zXttTE>=o0+6v1zi_&`cX@`%;S96g`MGx|xw#T1f87w7xg{PFf{ppgavOD1@7^c>8i z(OrWCiugVR&Gn+s*-2(}WFW|+*mjZ`wX;o*SA z--;V?b{nx6$Au|%jPIa^g=#Xz`VfI78XH{y)8*$|d7VEude6ykh+)s$;%$)JA&q3K zye^&R1afSapTE>m0o?Q{p4_}F@1vtq4U}Q>-L(uZ%hcTbhWC9SD$C?$(UQsZt}Z)D z=Vb}5W|hpwasswWK#} zlwL)mJ}oXc4|U6GgyPfcXtL;3S$*Vnn1&ELfqnpJb%N);Sa|Y$IY3=R&&i^GzUVT& z5R+1%4SR$8=J->lvG9jF-kvpy6 z;EZK3z#A)ibSEJsGKbwGwTdIkS>!IsYWhcdK-0U^^n}SlRKK<955YIMg{T+5!j+3- zyGwK3*xXY$Hg~A{XbL?@w2#F93c01G^H0DJtb5mSMnI$O<1!eJbpQgNfo7dqy@4aOtbY8r(`KMg3_kQ%}nTL5k z3;kDp{P*zuiiP#Jan0Ai-vvK^A!0iKu%43>s`AV-y3YY}yEnEIqMLOK7x>}LdcUU# zaq>)!UFC6bPT%XaQvA$42J^Ive70j%)l1IEm|2Tw3MjNYP7QF3iv0Mis5f>+(f*J1 z$-CxZ4g}uT+=r`TY~!qI%K>?P`LVyGUDcL{&d`rh{>K;9ee)K?82RY)r|943KH_4F z;>fQzFId7uS>)I2Q@3hf;ICRFM0N@iIUjOJxG9T-kHRQ}gh%Ml)Ej^xGPa?p8#x^d z4ent>?rZlAd_inla^%d=$25IAJ|=>uHF;itM4vA=Y)=xB((9wSZ;Ckt&*H@Q&-LPC z+1Lg&-$RV+poa4P>)rU3_Br)uC;|U8biD~G7gc4>|E5NTbou-UgFg}Y&3~6aJD}rZ zMCWIU3_I-!Ssf6TS3U`U_+$zd8O>9zew_NLvvTNrj<bk<=ij_t4FnoiIe^KaVW{w!3AqKT6Qm;Fqh1;rnK z3JQT7%A7CSu@Z;TNnP0tC4#siMbL5H%vhs~RIjG$j8p_|Kw489Vp zk0Z8};>UURqtX93*?z3@KaR8?+Et)fU;7bZ?2{!gGwxB|b+UJ}WH${N{4FOOxp&O} zSZzPpxYL&x?Z*#P<;Q&c@hU$!AXQr3l&`qyI9r7+Wk+4rHB!g^249912B^NG;_;FC z%!Z+2y>Qcre7Uu8&vzKsA%p*6MUD-MjKow7ieScZvdw+NSW~RRiuDbOeO1)D*vr0H zi51&9DE7|zt&835i|uB`@Oc|vW6mL7o~y5?KMeMDleklIOKf~g-_o1x%PE%?$?L-njHDEVt)^n zInPz^xskRk1lGDEjz|v|^YbU_q;|6&VQ=VrKfL^z`5UG0DcH^ES?P?8t(5EIb`hP= zlyay_DFazBE+t{P=*9+04iH)Sk~^tnI?rmWavWR_%YB5ZO`RCF`#cD?Fd{Gq0qt2g;MDpKhY}q-Q z_`bORJ0<;JYh2s8Wc<6@VlD3fUNrHV?kpYudZME2kI4fdbPMyQ>S;LB;Gd(TNCuN3I`an^kvJsCSNS2o9N%r}X8ugk`K zg~vP#pd4hV=Iu629ubp*6=E52yAt?5BV)gwHa{-X}5KsEG)PT z(J$kD`0Kc0K%U6|4t*f%Tm0ucg3p6;K39&X<~6~m-S{NVdPTc}$-(FN*OHDupbz!s zE;e}iQk41f5nobAvYx40qzLd7T0VU2l6j1Qvg-Fic|}F*;bb&V(d#bZ>+EULN=YBr z1JdenOe#GFau8=Zcw{eHpHqvF>OQ`7(CexB{4jZty&mGO=zryL$_KT~YJXgeKwz9e zKJh{)pMV%5DW)vTNtZqWnYskbL1Ds6fvhdKF6&}h9o>`4ENz%0%~PIGP5$A|MO z{d-=rn+43-J)M(aWy&nbe)p`0%IgMq2Cn_*HE;Zylk8@7zSU1$57sx^wss#fNt9UT z0k>y@ANF-t#F7QK;%LB-vHQ7)U5V`%*lWSg>T0)`>53%^DttMeXX$bI4q9^RtPpAO zkF>xkceNU+8(GVEV0-a5cL{ify2AO0Uc!x4j%SZu9vi=0 zQc$9;aWhgdRha*Mcj2gxqdr%zQW0ju^VIKH|F5^Rbl>*jX#3t z(qeWc8b1s0T-Is5@N8^M?NI$8s1|q1Pu*^si80(3PaWp}e;Lot)gL0$gy+YSAWKbx zOoX+o8tt){B#3|e6pwE9iojlN#n1o29t`;T4ET9YYkpq%QktJP%=P@tHC)EeuYV;T zW|!Tf7LljQ`fR*^p&MD98<+ttzS8e1nGq(4&&C>gjr9snZ_%MyQAIoG{{CCEW6 z^K(3q962w`&(bOo0nZcycc{fb$Q3AjRv=5VT`$WR+njZ4Ha^vp4WC=}XKHUswuR3z z|1~~G1^8%Pw^F_Yox_PhVHx>!2SEtPCx&`)syVddvR2YxUu_ueWEkDU9NffcsYu_fh^#xS}nXXZ$qG8erNodR_q!ETXQKvm8LUk05vd?PmWi zQX?lq=6jJyMN9CCpze8@ZU2lt_(S*(}nzmY4^P z`tZ_}dSpUYlXnw+S@20M&Ir)DI-pz-7gAT~V>5Fvz?oxQu@|{U) zO4xk7O#Lr-K!uri?3>%pV3-U^1T6L>2@u?E@H~I*Ew6&}&R&8BO}HzqOq08@>BpAp zh5#MFX+YJ|_rxD?&c@ESmeWNzL|KDR>WY`Yyq5h!a^YN3&lpZpg}RcPagyDNrorHK zIO4c|`QJp3%`8rA<*Z)wF5aFXF9iw9ZrDdd#!eKMza`!y+-O8}WLeU7Y`GhC3e<+j zZoc-Yf_*LbKu4Z!>#5?|B>qlLDdXsL-|6sh(r<+)PSJCnMuX3D?bKW_EEu0j8@Jqh zks|T?G^+mWj`or=9?;Z9*GSN3&1-DaYns-?GF>mObAA0+NN+M!epo{SxG%QpL)M$^ znfg;=HraUcV>_pIf-f`nU)DH(-A%^Uy4M-oQ#H0DYc1g@8zB3e;W~KbCE6chw%i0d zk>#&r4W9UvG<$C_ls&Ue0ypS&1jwn+i)bo~J=KT#mLRb;;t_Wx^KL4+#HCXaaVi!r zN{-&V+@Ezw=gTJT7Dq5E9=8EyQ>V!t03*6jfstN+&}8=gZ+jqHK-T+H+q%EQy`ake zds-fh409D=?yR-V%49*y7Ni2H0e2V15dGZDGdA_&!ORsPo4od zd@^0d#3#lWc2$*|A`w!(1matF76TAHJ34xF>LT{r-2{9c|BsFD9wwGR1qAv2ajP= z7@~Udwd_!u9Nke4t{eDSp1hzV*@7x|vMaCRk3rk%%cH4YmN>tGg?neZflzU`(sx7M zqk5WUMSnyWyG-Pq4=4*gProRQA3rx7?WEyPH z^GG5Z9DP|yk}xay&M$93+w{jIi^-iPxjeoHJ>pj0R68^r}o0-da$ zmUhrc(mPD(=AQ+0t{1It&Rp&8SsZj)yI--U2L5eH_2D1%OWok7*4ym48}Z@Ms>K8r z+=UlQto3YAHGUPN!Zv zUk?40$;a6dSd5?gddV>wg!30L3JO$w2;erYH5}i~QzE9;JKGrrppTtWu*O z_^>^#2UcNPm_G=ykei?BQi^9;;Q3sdwayLs0n98*PWb``om@HYZHAmgIX(pwcV{iI zd^zD3>o$pUE~LR={MEjGD$~OXn6xB$0r{bh$E$ffE94L8MOOP^;j)IORj_+xgBzXCRR9Tjm+N5~1S?lo&+&&`OZPHv#X3kBH z_#{PfY<&iN2UzP=p3EsD9{1r-?pg-aJ8H!IDL$C7nR*wA9`qj)d8!3c2(2d3NmFk&T~7vzGXYSmHguGIG~1%;1-ouBZ0L z;NlX0FLtN#BvD}-Z`1FiRB8o!0=vN01^XL8PGQ{glyB=VMjoCYh%M8U&qoZ2EQ*J) z3mBO(P7rPYf&~K2;bRHep$0W*Dk@er|0_r#r3E+%hx+-j6@BYan*41)8`#Nn-5QBy zEF2RSzXJ!`kqZ$} zl}@eiN)w{Lr&*rI8?Jl>e(37YQs75O+cR#J$dh8-L=<)94g{GqM6nH_ds%&;CN#+Q z<{EV)YXOsWzJD8hH(0xsdp8${_|_ZUtu_(qy5(Yf9u8cg(b;NUvmzT?)px%N@VrO} zZHs50ZSl;VpFrP76F=yDjI2bTbP_||U!Z%#Rq%IN@~~1oafvtB{H?sg9Ska{q5G+PZ_WUPSHqtGKO932c| zaAtfA|5eNM6r~=L#=;=+gN$=-#nFt^8#SCn&Mb+aMlNT`lJxSc?>Pwf*L$o#MPQ03CD-Jcg?M&d%z zupG^3-q+}nv8vcPHuih2Ui}XRjz}NOcsn?l@%7d3t4!{}jJI_#&L41}EbR6g7E@ z8^Ewa zD8~iB1wq6Lhry*mFONdu6at$I!E8GJujTv{jqmUc?Hsti71KXUMz%f}KS;<#k(FK?AACpJOjUDI7? z=ZY=64zi6y3R7s!sBYZv+n~BqAK&fcPep=4h@K5Ta-#-PQNO#`Af|_G>c7mK@b&{G z3pQUM@={6a95G(f5fY*o;;!GxmagZ_57u zD5H}3&M8+Bk}$HASniqm#@DI+fKReG)J17k%UPX~KsRgza;)fjBDW$p$fVXV^vc3M z^{C-A1z4DYCFC;SCro5@5l#!szWegy>`MP=u-CcE=nIx|cA~6x?r$I%vqV`hD3R6c zlr;)p&O`H4+k;ynxbJ|Vl135FcEOnf$?HXuZEOVmQ5i`HhwpgFmLW`vnL9>ABH7Z_&cCuIN@hf2HSS z(T=|8Ju14@Y8O~T-nLV2ggx9VF!Fv?&HrPU5Td);r~#x+xgCY z@y|r2O#(%)SkX}Y+Jj`J! z--;-hzBHU^tyq90{L5aH`iNC_G@gwI8ZF2Xf{K(bRQ-pbWQ1gL# zHlT2f&Ci4L1kLAuqPZ(*PD}8Q%o-1@ppk-J4|IQ=lhXY>a%TmlAEz|1?-ndfzP@Ke z7LjRMy7@GtO8`)oSWl6HKYT@hB-VeFSih#L7wOmRrf=nZV{(_H+_~>%Hr36Q{XZNC z1zj0IT|o(j&X{;xNd5Gq>h5O$Ikbp&g@F7~(d2xa_nb4K0io1c@&)%V#G8cl2bkv^ z(diCoEMU@;d_jMr<2Nd3B-;2{=iFy z^^*KBBTeB?Tym&vpOQS-Bu(uV&(UdF(&UL*D4c>IdPT7-Zu;7QIEHDgbB&cktx2{q z;L`j(crGf%n;;xD6}9=}c*3R0ILbe*;ESGQxQRUUS7=+fC6hj2Od8Hl189n?5p@d? zMz#8Dpo&nUwq63>;I3`J3nb3=@G>9?G`#Rxadz0R3_jb`PdEJ~?w*W2L;a$e+pkZp zh1S+@sHOEO!bGOL`{aT2LTWRGY+n6&)IR}Di>RIW>(8Thv^R$|*?H8WcKovQsP7SF zN9gv`Kmv=tDi5T))f}xzpM~d9r_J`EF2Bc`z%-b6O3r!ID*=!y<^_kwVw_F5(jHcBo-?D#IsO*AtTd@h5jvj-&jc2XO=gl znD}RnuY2h}Z%_Zz2Ap+y3#ol?^hUn136gs71T3}k#CJ@maZu{l6!v`RlGIOiO#hB4 z->)KW)Asn2IrJH2i{Fm_rtN~3NSt+8raV)VMbE*xw>vin{1u!Jep*~;{!)=ZlWk?| zl{*`BpqYZ{4k0gfeK4q{_RZjzOy`$9P$G^|Dfa3&P`wA)rePO_Zmgep#iytRu zBwnl5M4Q(N@zKzP$rTH+LOn~YZIE_3UTOZyRk5cAw9I-o2~(g!MnlOpvAzEwY8 zvE+{FWr=Q5j46NbS~qwuvp8H!0)J@Vy$KWuT0mH#ycPE4Ww-TiJ{Yo=$5-if4PB+^ zYkoxjaX&YT#?VO(k6=?={33LM$ud+Qrd6T0$OyM+{b$Ts-QYWZja~lL$-&ywRV*X5{V8s5(s{ZnZCYxFxox@=aZRHn zB%E%4*Yh{^&rS3&S@6axL+&3m;1?*z(Mpy-Iq=tNbyEGsq-~c8ljy$;_XZ*^EXfM% z0;S&0NsH&xtE}`cypnl1SFgE9nOi2;r`Ko6?mH^y>yEKx=N)1RE<$VQ2$l7${EVa6 zm4jGa&y+8qEZO%u5Dr{grO8A4$cCMvQM5C~mHTt=?oML6J^RTWUuw_Tig+u_xDDh{nY`->sYul7@ZF}Y;tF^kYwSn zyc`MkWR`-Sd+RREyrN#*g=&Y4lacG^@I_bfA#u8Nz_jIUmzzhTb$T+JU2ft@X4%9F z{wfYx5zjr_<-9UYL9+`y(eN4`l~slN))b zMr3mb_T@^e@!7LCm(Rr!J92EP^5ycQF6%m(J^d33n_rC$8C^daRY&&w#OQh`NB1tA z^R7C>?OXIi7{^Kc3(t_I{iqm+ovxKR$%-^3Z(%6+^;^=7V)djLh}2A%s(`9kbm)p$zqqibwPW2EMLqw0eD*~>*RRsNhM{4PX3 zhwVby?h!hhC`kAc6<=tbw1lZF8?rf4)1uar1;zSU*ZVc*Tu^$Y$DjIhef@p2>(_+! z|H6`*`tSeS>Q8N}{y1O%DHUN^Z0#3^_3tCbhx!%1e)m$}es}GH4D|KR%&ylttT$+P ztJlZZ`zn@IZ!_|Y{&vc)_a+Qz{Y~v@^_IME_&%Fmuff;5SD!*WZw>0jZ-Vv)ttzc6 zVUuq1+~~8CIKyC3?`B+;00~1;x zJcw@KtepEj-*uM-;sKrLYDJt05{giHk=v;rrt>pj`IqveCPQEeK}nVrHs2E9kt}#w z;+l!;$0WXM(_aIE!TqBe%v0~MLAlG9Q@lfyd;TB6p!Df(gK}8_MDf!5pCB6Y_m`@E zH($RjyZ*JRFD#e34q+E-)_8jC7QoscSZj_?)1ygS!COqXn4~Wx7Z_~A=a3A%$NwG- zSq*rIKpyi2D+O;4!)=Q7Pl{FWuJG`tXTw{~KnD1omxjmjf5AId1?zgh0%{t!!hm1W z`0eN6ncNETn~{OnUGS7UqvBHJ$i!=g0dlj%LS65x0+2mzy#Z?DSjW@Vcl9}>t71Ss zJrUdk{Q3x9?sD)p5t7-m>vIHixO;w#dd|k9ptuo2SN5NDL-YK!l=%hX-el2i%u;Zy z@JLh^f@o<;eqOr2ztRLI3PuD-+I-y3oIlNQg-Bj|8&=ch2C?9%0FdTmYjI|NJzo(2 zX#-TyJsaN1t>7IZcq?R4B@13!=_f+)hJaY>`IzP5-Q|mUdTF84+4!x#6?nK}1uq%U zpX6aGgP%xcB?~UPIzAv}lShvOipVf3o)}czmx}vSF|Z@4SMTff&#rg1k%`^u(qXYH|_R`8;KU8(lE=d?G_*Sj~nUT3R^!?WP}ta{(kTn5k0 z_xt{3*L%~Zx1^qmr9nmE+1WTLz_Y>E>z`fkR^w{|V9{=5LyQvA$c|}ZDOZ(+S4S>4 z&`s_UM&GVGejZ%~PcFh_eK7bon{P1!(P(}V6fx>d@!UQj@M{~Wp~k{PefxI=BxB>$ z3jnt5Sa4lHa2lr>$7T1oqpx>vcD+v^7jq039G6w^l$?4iw3ta0?3-Qh0V6XTr~IIz z#_1|5rss2xulHdLRNlIqo_Np(u)6N>PNEn9Sr%W-6g8y67gA%1l&bH0Q+Wbnrwy zDivLo3SE_ZWJpC)6y=h5pGKtQlFR&FueJ93{oZGWr{{S--{;pKne$$Izt-Aot-bcz zm-l{ad*76Lw96Y-y_1saP11T%yI#JyC(Z`M0s~D&`f(O2>U`cE7gkIXrdg)4_;Gt- z%Fff&)NO#ejZk+yUB9{Vt77v@SAK=4lUSn-q+L4O{q#4?P}n}DYx_Q@ud7|gxOOQ_ zw#xzO4#m#qf8ub_wVBtc8Xq!TIG#LuAzM|5C@1W;T-j?v;ZlUc7Y*!V zfDQ3$aIwIt29x&87EHnGpm?b^UTxG?LAHGD+jDe=ZO;^~w@3?UdpE#=G=9El)w?9A z-ZJFW(9c%DZ-`LsrVF3dv)eDs?pmG zH;zZIbY=r}JerBzA9~5L`8*Cj$#(rr9J<(f=Si_EH5N30wCi00D0aO;@pgYDjZ?Wh zqqa)1S|3aNoYBd)YjdqP%dVF$_1I6JuM7_M|rrcSZMv!x1yuNOwe&f+JIl=i<~Rb2d~nwVYbDy}444D*xpR-)~zc)tjdE zmTLiRM_9en==)Vum-_C`x}LqMhugLOD7$`^*5_Unc=tE;=`Yoj>U;CE3I7m(X=^|< z|AP-{aIa$k=r0|#)A|15ND>~{{ki3@OXz-#m(gGHXzx%=&S$Y_V|@+_sp3kocZv9E zvGeu#Bc<0OV6tnxph%L3yZ~{Hy$hAkD4S1TR0j`h9DK$AJ_0~>pOArL{JpR};WYlX zR=gHAUUk&g_*K=^Is>&vp6}Y()7JpNBlvAyp^X-OtyC8?Mq8vLd4I7Z0Fv{R)3yF& zyZ$(>Z;bYUsn2mS&#g~;50kt)aE+-d^Ml@~s>-{-RHJ{!**CrMw5!&uZ`W&pdTOHu z*a3I#;#&(A$`PrGoi^iK7ArsV`(r>9D*bVjx9e3%5$P&tKwb#m<(o(jSeo z@(m>WtTYAZ_iJVSs@Uf}sY>U*&s3#fou*Z@ zta(^9<(q5s9g50OB6E9Pj$)JF5eF)Eo{76=scDeu=k281sGo;ap54o={@Fw!t$uTp z!Mg-_r3KS47%!*>h2V8m?f{e)Oc71PGib3=?83#Kq$*1b#*`KmmdZEcoKuKVw4^mh z>5t=QED*-uiGB{F5*DljHdiLa^cPwyXu^RVeXreWA%wBVmWb}c9 zOD!#&0+%)mWG_8N(XnD5=>;@yr0nLk>9LGYP=RqIQY!Ii^LYyQhoswqmkEbfV%;s_ ztc2|__!z`lKulBw7zDb-5@z>tJvBK}lzDA&$h1C9B zMY>IqezTj_&Bs_4b(?nHFCxtXEm%PH{Lw}+PPf|QE+Upf!5`D(Op7)GD6vcIgxg}U z9gDYr@k!5djRBi@NY=&b#L!FIV8hf|jdzBizCS)qQr`r_?mfwr1K)t^sc$^k8BTS; zNmi?~XFDI^Ek4iicxXNY3I|vaL&MxRuk>3laJ<*~6#uq4O$4|@1o+goUt^=Q^HhLb zTY#VlfPN;b-#rGcO_kQxVSjJ4w@s;Y=zMvRLEdr7F^lzW)|+K=EZ3LxHvSyyxOl{U zAugQ6I%0; zgb>mJ!dr9&`vEN|Ub6Ze^^(JqJO}#Q7~etP2BW`=5m~-nl;27U;z+_wuENF}K4x&< zSDfQWHoYeiN0I+nr8^!yx=Qo$+}iSZQv3;9^PF1X1)^ml2~g>BV)fBIRVUQj5BYk#&< zaZXkk#%UME*$3^}abRr(J>&cT##|Ywd9)tzX*kJT+h8ES2i%TI$1+y~w`l|L`AK80 zjN2A@=4!`gA#~TJs=LTkAP@rCYum}<8Dg#}5JG#vU(y3If-Gp_{`Y6G(njZ?B-VjF z3oVSb=%S_v^mQ>J#al(ki&@ZMJY_IGRE%jh#spw|%!I}O4FOQ1NHGSZpy|o zZ%(?5*>7FI-Y)O;J6WUD7YlNM(p?J`oDQfVEtq@jJ_K>9DNYj`XQ+>Js8Df&;d3b) z9Pg5M@r1)2c8S0IfvFpAQ9#KDkuI<5<4X7{kIr5z#o)~B= zUBt*=%Fe9vhsjsIWe|BCz0}!?;+Zm8{Y%Weu;2{9Ue(;4Z+W<#6nBl5(s{&dKJHl_ zZnz_ISEoAkgfs$5dd9;2tC@$JE+JyO^Ai;cecQN~`M7IFy7Gpx%$DN3M?Ud9+!-?^ z7fCc;n!=sGlX9ZVpekfgxzW7w&P+HW)9K@oX%5Ps+c|6CEwkl7bSn1)>GxS_xPAd@ zJ1sZfYA|IQKOaZF5wdnUy;PnJ^lZ4b%!e0oulMn{J`8-OR;RRCU(&%}A93b@apDT}YIh!7?9@Zn zA6*L4+5Zd%BLi+9b<#yj?7-a;!gM;+oVe-Bs7 z#EG8FQ9D>2!P+@M$*|M`on}VAyCW?tx>>(JssHEZ8Q#fWNFQ}ZyoR#L7i`FPn34}i zalIp+@qJT-&4rosc>ql8m$(>ah_?wYO+sW^uWsX`Rm+M`HS(>-L z6$>nyr@r454tuBcK6n1feh?GK2~5^PYR7$ITe0Kt5vu24xKMJ7z#xMLyEUB!iCw#) zcS1Ycolc6EW#hf(JutgHb0Ql`3HC;mpwC!~EKjPi4 zcpoWIGsr9-Z#iaWn%1n7v?fq!P^gzzfWq}K;xtm68*Q9JVm>kbC=UmRnm8EnUIs=3 z;!qkFXPr#I0#$6B_k5g=9?o3&2ypoAML@g+2*Sy^7RobTab|(ckRtZJ)5qEUAl7;w zAOv)@hM_=$7tj0R9Ew(wA?6a1EsT=tk{uMcr;S@1xN=^`7;z846Q3Y|G5(DH*a$HA ziqU$fIea$pmHJo%!{=l)V9RL?2)J(?**p9r)y97h@d>{vtSECL@o$p+DByhL>#+_n zTs@9goaIV3?Jt9qOPqToX$j1LFGE=8T`p5_KUTJ`#_|p#BcqC7lsS(BOB*bl9Z9Dm(6X+|JPPkr`hVa4Q&iEXpTYKn z!@tq~mCyeB?ca0E_QQOC+kVJnwg3Kd?S~)yU)z7Gw!a$&LZ>1){2T4R{y%8{AIEGz zZ1=bAhdfsM3(B?M^N;`D{-&e#JB95Bhkv8}yPo;??T_2SkKzBY-QTt!@>uQ9FV}w0 zKmPCSZ^-t8!@tq~k^e#acOSF;u-)IbAM#l3A5yOUo`3w`+uwlg2Zw*7{lWjB{l6Wv z{jlBNwjc6X?Z2;F`#t|iZa+hw`90OV}{=d_igw$Mqs`D27@pLVD~GBayEu^ z`$LE04k2pbLn|1cHKt>Ho`TV0cAM2Djl|#aHACEI^Ow2Lreo13_~4;8Kv(YgJ-;(7 zA3Wp$Z9aI20XjD-J4PM94@Q0mi=w~q%JU}qqeA`=Tq78M7e7LJLx(vWfU82e6XlIq zg&3*|b;#;7rl`0AhOF_exSl4YC!;+)Ys*>g5J-un z_H&eAGA{G`jS$-8vo{aMpPYYledh%&#N@l(gt|;b-SwS)&Y6lc+{XE*kJG^51jAQQ zIH>22shkesGd4?|T`Q<{es93px{0idL-O)UfYQhN%!OkjU!BSF+nt-hi1lLq7G}i? zK&!Lxd7MXYg!bH;6MT4yGYZzh3ownaM1=1sIk zX90|B`bQS!(gW%}4G{IeLwZM++5aa_HN`p0#u@7492x|iSOL$<%R#wf=h|6BE>7&0 z^^=T)Z=${Nc5gyLM2KIZeJ6zfx%T(Q58TVb`&f#0Ty95|e|yGu5;{Y<8Cyf#uZr2& ze>q<(hJ`U-3x;{?Ip=HxIA?p7c8~G60p@J+R<&y(LYb+Xd#(h5U#D%CeLz)|nYN8Y z&%E54wq^G3mv{<`1ZKSTp+7nSXVaxu;zNI~zQ`JEp99T=!d=d?J1~X&#@N3a+ zEMH_S#Qz~e!9q0Bd3{WM zvEAp-*xJGmW&DRU3EXq##xJ_?uz{im437Ez3`RjS6&dHPv++jck@WnIu-Y=2btk$? zb&XFhtFxMN;xB-Q2kjAKV99t4C^@Of@{gs|G9q6ys#R^JZI);T7r{6Vb&9U@b4^ry<`2V?n8^WxXevNK+VZ?G)-}c|>*UURt z5MwMb{F)m?@E9DMb{nFe}}?g)*MT}`v?5b^m`Z%X6e`H zrb-Ry<{fbTZ}e+yvRE&;U5+9AL9If zF@79%{ty2sG{;u^jFD8L3TOU$GB#dN=p@FtUC>{(HeWb7+7iHHSh?}{i<4REIzYVq zIzS!t1Fi%7ib;!E2Y3V%BCZ2`k4HY9o1&yvg$c)@h^_~`>gJb6Sr7Q`MkI|B(G%!@ zlFx`ogrYz5>)4nydTT3&p3liRri?VNHwnjX)XQicA)Nkcqi68^?~ zuJ%+s>Y|Uv=%WKu@aQak6agek{m4i4@d#-geirj*RhGbv`*-%uct#T~c_&G`WNugN ztX0yqN&=EY(i%gWtE9u*HI$@t4e2B$y``kyB-J&fQgk_ap~f7$4xCNuKs@Er zLo_fNKSQ%qQ=UJq1y-2w;BL}8(g?APoA`Gt`8#lbO%%jUpp`}FuB?Xl82K<7XsN$C zJ;{fyoioLR?RH2b$m9a0*AjY7C)Q8UoA7BgP(z73Cu-%LATFqZp5yH4OCcAJ&xv(z zk~xo)XB?`^uj!n{>iWIL#{Fq$+!T&WB9>HkwxC&g9S;?Jfd}xcA>ij+s7?703n#p? zGv4k7h$ZgkOh9pE6;)O`A1cdlt`Oz>kh8$r;&)#%zr|>R^Cd)r>biUUN?;Z8>)@PD ze%wfN>i;W#xjw(lWPTNr`PCx7{>pFdb8h>_d;H!-FI0Z7UniY8YY2{@oa~`UrOlOq&n5&Uc{-FRw zK3ShP;qw~75TF0T=V^G(i@JWAj32M6-AeH{=&M2JO&^;OepqBSixg>*4O-*_Q)C{B zfa_9y+GPX;c}xqwi$@<}&V?9I=QeB}12;y#&r;#BjENR`*$N@wPx5dj7Z5P|y#Z)< z2T3<7>DpvcUrK@(d$IN8bkPzWEbI;MQ-XFE5ulNh>yyl>FeGa@Sy;CtIaSGjJ*%v> zM7w4rZKKuVfjZ;`zm8>mBZZb4n1(G`Xb}s=GCl^$ZTQ{Ih5HX_AioH5F5aHQ2+8)l zrE>Ark9eJeb1_*hloEAV8YS-YOMHtGL#Clbe<@L8rk1$eFYzTxv>A#Loux!zlyW)S zFR>IQ23JOjlTZTiwOkUOkDex4xB``&gVzdq&oh22_WvraXiM@2C4Xa)mp>x4Pa%1p zl0UG>5Ay!5c)JvmpI7ofE%N$8slA;l8mZ)A9$9qr9cC5I%}VO$k>YiZ*P0)&X10GC3hzIZ6&{EkxP(1K&(0>k5lp(i~PBgOOfO__b7RwMZOC?47InD+*8SySmd*J z3HWl7&sFl77WswYQu|$!Ybm+9MINtqev;%pS4+EpMZVxV^Q`9ud?d+zl>8;hrYoI* zSqMZMMDqDco&hrM)r!}-a;?zTq=0sk(k8gHI|d4DH`Y6Hm2e&E(w_fK>OIGLTaQo590X@pea!;Q3Yhe3kV)16T;xqY2qT$+HX@A2V$C39B{I=TGA~mfonCc3V?f zt!YKXOea;z4@xyi`PK6x$vG(E{Cp+;j%DT1OhtjILv{Czo)|j*crR{vm7%-sqX3`MXC~dV%Yk|!z@S99phSEN8X>TcQ z3~7y(_KZtwvsdaBkQPwd!!GT8rQJ+gq7TX;KXPgH_ei}fNc%!*7rV5E`-FBOX|t5p zQfOSz#Wz2&J?Yd}&p*L>zLL*V_4!{&WN2-cuRvWS)M2;axofuOhw=O?eg2tMeg&Sx zoVVdkBIg|?PZu)G`2^mj0OVVAtP@qVaW3s*r9DmBU%lCc!0TWQ7l~!ufkIrQj@Kzf zDQ7*&v5eks)#+-ryI6IB(mH_VcG?}O!u1l8rzp9;TXm+=I*=At+F@il(qr?Lb{c87 zD{Zq&>!7sbNXu2)r!MVKitsx?#kE%2>!7(oB9B*m!|h2vUdfMH-_u)B=_6b&?oDoXi zJHZ$EvBw0pCu{dt@>+}h&{!e2Be{!`XOnD1ZlL7)BsWs>(-yhkIH?^VIaSFITI5UP zLf%bx+j52I<2s8xPQf>jyjaPdEpqFBO6_8jUsiHMl1;$A_bDO2MRG*RN1pJ>FFq;c z2_)aDl}`Ok?$&Lp{tk{iRZ3oEk=OJR@;s7f z3%T7akTHp!$wv`Binkm43jUF)@Z%sl*Q>`D636tH9oGuZ^!=!G4=N#J{u+Nn!`Hf{ zG-Li644q4*L>-n!i4J}VX3SHcLy5CQmW+lj3D2W=4p}nDqJ{v}xLyJFjq?RL{bqX3 zmrluL)O=tANV)Mqiv#$?d!_u2x}`l1^JM&0I~bmbzxe*~UHG?i^23l^W@C&IYJ$V%MO-0JyZw7E!OMOMZiKD@J?Z$(a$0$bk6cJ<{g%bgk5E%$m%r2O6@)SK<=mHOD*zA-w1gl$rmd5 z9FQfHJgn(*$sW*N%##+?a%op+p1y{(N0qiOZt9({w6wjT-J!JgF6|OcqMQB++NDZc z;L^@k+7i;vRoY7~?WWtoKi=+k@;gy!qg~p?N_&DD_$ycB9OTk|`CaPGW4#}hc9~0? zKTBwhN&7@;=Yi(h??TWV(#WjM7&)kDz%Q1AGOHu+$X}; zC3$ZT(ZOv5jBaxWtkw@QZEre`_-mv@!!JgO*wUO?(vvzl9|@@wD$3&vO3{W_^cf#C zybATv7({}N2SIvFd8G-jol@n)5%A;t^m$24WRT~;dhQ?_0qJ<(PKlf+WIN#Ms5 zyq{C3&)>##eh>YC`Tab85Uyt`S(2cpm4T<;kLQs`^SZ{#u*yo9O&Zz_n#KLD5%e&{$u0r?2kuOE|B6sebyaHAFwJ?Mjlz)z5hKc&F5Ua34 zP03;>6WSUt@?V(~J(Af6q5bS8*h#`Z(rxv6wOP*wl{7K^Ehj$wxfD60>U@;V&Yz#h zt156>w0i!T2*o-3DyB3_Ny%TE6T812K2lMD70ZlzztZ;#);Uknlrg-+Gn?Yf=8lAk zfu3A=9`BawJ$3c-FZ)AKbXM%NM{*g$v8+2&a6@_^!H5er@p7zlAc21_k9wX%D@FrL zw2<1l88qShT@|#iY`^s4u_uq5m(z%WaC%UphVwAn8U0bVBeD1A+>PJZIx{{AUvzT8 z3KWQWhY^$a{`^UwR5{)LQA_2_vgI6!_DT?z{&8a#f9*2h&hH?qw^ugEyo{*H4l1Cl zf3NEtwhs4Hd47h#)=Y5Sepdy!ZnVVRto@U|@LR@TPWw0fCE6{?Un(8jUz}fzzuZb8 zeShILkLMZ2kKr#-_X7grL}3)ddEDSBe~FAoi=P{%?PdMtD^-Q~OL~dxFRmS8&<6D7 z_e8Rt?6gwEsn%Z2z28*&%B;1MYZ$`8>3A4KK`!> zYDDkBBA8qP*)hC z*k7)OP^Q1&sJD!7KhX-&z*)9jm#JK4JZS^Da*7V87t|`Ng)B_O{f_jy8UbB&?P#M1 zu-xRR9$dc|qWs>|BC3atBEH*?7Ii&}zQs4OZ7&g*2X3QZBhH2pC8r_Jnv#pFhV4NF zr}`mBGd3zZVkV;+->dE`QLT{vF5A&!f3yzmKjg}j8y_*#9Y0_g+!f|bfynTpHaKv3 z7+(ZvkI@C-pRh)8_DmUTz<~Nq1p}jBH-9Kn{D~fZ^neQw-8orQhe6@(Sh2uOT2k;n zL=-Axuk#eI^D*%DfSen>WhOs;Ha}G)S z@hFjl-_G0k%Swjb{N2khLa~wMatu!kq164sF^qyxK^LlE6Pn)p5p8-SShXX9o0o6A z+eO;lR_XBHc%GMUET{t%=U!+A5_<{NVrQKAJlcj8OEs`(lO{k0sRvF&;S|7 zoYUE;p={K5z$qUOz4uj_b9*DGq}?6FByLnFcAA^t?CKm<>*2RV$bn<8``{{Z}4S&wE@w*GY8<$!TzlFiqc$6C-S4kr-W9w5)aLpuIAn}6WO+QTJ}dj5n3&|VJKnG7u**??$*VsQ@+PBt~g+d|z(fqLT*}+IPJn&1y*PxBfZt2^kbe3sV;%&U^qvMSM zPnF_#&@0%`+9+<(OJ;cXl=6wYQBdh#K55QZ9xk^`P_N8*?K}WgVV%UBNnGpjK?Imo?K<=oB(AeZi8^v0BzlOVa78%y~kiy&N=!*9hx6K_K<1~ z?~k==`J5jskq`lGXEL9DKK|srNqoPuy@5i$-l_wjn6JAyE2ssW z_q1`^`#5vkDNZo_2^EX);ykEgAMmG5&UuQ{+s1jp$7$lpb*^*=%Z$MY$DX5^674qG3Nx+EM8o%rOxl39RkGxnVDtni z(f3PKDCWfvNb`{g#z$yx(nOH?^9>Z4gVZ;04ZzK0Sup4V2s|%nf@XFUSopt-+e2}~ z9%W9Mp$LOtA~G8eKe7__nU&_-Y_ zJ#4sLkV*mI9t%aP2h8lZOAJ;>fJlLUKB=bDz zgEwF~S3zLo$I0>B4d!lV?oQYL0C$pzX8g~^8=`nwHr__G(H}1twWfH76|c61mo4HMJl>Z_`A%279kxG@ z6Fhf3yBBz~X}P4?XE5?Jm5DoetQn|3-@z?&v+>1bY+b{lP;I;GG6Z0Ovtef}rpwcZ+s&ROTdhKLRx_w1R@_jIHf-v};t=A-H8w2522{Lm|j z?}?!xvZcg1N>uycGp=zo$;%HvhOjB~uT`PC?1WHNjbj6TEtyC8jHFaAP234xe8f_YUV|M#)Y=%*afq5Qa{h@`15_ICJG_pcqc}k#!@gLyC=1B z!HN8OD#-b_Vyaeaxy)o6vONnRVK``+LF=;biSI@lP!$hgBI-#hI@c>X5od+*#2QPD+I?rDAXI!#6Q`@ywp8xUX#S{ zcz)}6XL>8UeJ7dr1;by1Y`5`S)Cv~O!&8Who3orV+0MiG&33|~vJS+iUg%r}%)AzR zFg0tlu;c_8k8lYKCdf;<8Jk}X2q$ubwsHYy6lqd36uby)W{CTFEq3O_FHH@NI#7yO z7aaW{8k7^~SB$s0euI|>LQPY6lDP$jhb_N_I_}A@6B@N6r6x7@c$59uo5HDbhZ;g0}@4d8OPu|W6(j>Yb z_QCJ-{c{Osu>Ls9Z11PD*yjS1wUFkemr2DDxXKJU(o&~2*kDnRp==xkEa`@R>D{jp zKtDiNO`MP3&*$R2k+-1&^?|f>e9FFH8cjSD4>M)F!~7r?Xl%(ff2}JQ$}kCYdZ=87 z?$wxuepBpxC_at#+1k_-BzvkQgqM4DZ)PxbXM(SRXKrkWI#yNK0n})>NT}Y8$5=3Sm4r$71xUpYXwCP=g<&sk#$VA%*BI zHsHuZ$?tmgyH1&O%ukR<&>YRA@{}=imiAE&p8+jV?6Q_G~yT5gi z{?-d4x8zleo#u4eSfJxzU(Z`sx_X9m;@3l{2+S+Bkm`A(xT2@$g)p7;qx=xyw%o07 z++Uc##+&a#M9qH`Z?2Y7ym1Ckhnaf`XV2$@k=D|{qz{Sb@Cau=tp4}FqVzhiD}fi^yuZV9$RCu_3Zv38lGJZt=Ow0z|^FOxfRl(~wTcyj5{$cLW=<3EX z?B}H5i>eSXatY4~G1f#T;xFk38u_Lm@fctDP`zfs2rpR_%N5k63=l9e+lSr6awx#;=Gy(2VmD zDkK_{C)7LcY7k}rwmDfF>E_VI66^MvGB=qr*xG^~ta7y66sDivenn3FO02IglL0gO zWoXeaY3!uI8J~!(Z=X(Ck$4V0Y{_^ab6Thl*PV~z%^@1~gcUn@0XmM_Icj7rQd?D@bwmh*O zVyPXgt}q%N)3l6+(dR|Ok_l47NcL%y*ecdQ;&!Ff$eWT_i+9B|pNVID{2BbBGb!$P zd6nQ8M?`uVnWH$}fa9Eil8H}5nk+$oko6BiOWp|36!r6B>aa{tBSl(2jrCWfWa2lt zm}M`uYfreU*WNC4greNq`%@Cf)86{${m`WO^B@XHM~>fI1O8JmJG;%ViL=qJywn|V zC;TEck%GHSFwQ3$pg2aL#3SI$m?dfRHgM!t1G?&XxC`?e<7o_O2xZguAc9C&o(Otk z6AZ&noDVimjwti;nq)(666tQPSugQADurSocv9rX`MdzNLa}Z&L-D?8^%60(Dks*x zW?uZ}O7#*Y5YL*D_~+NmdikH&-IHx@Js~6edsjn~Trof|fb$nSA@iFl6Z5?e<~KVH z7Ob4+_>F~UrT}^COG}ZygeJ)vEx($B=}Po~jBC4`U3jApGhypQox4|uQ9iv%N+TRl z!o9OuO*o&;Z;QEXrc9_iUzGnbP&?n08JxJVWCrI|NS#p3BR^ZR(OoCbxCrsyS#sLZ z<5BYZ67FL-TKlEPxb4UM$^6##7dsuyZ?FCM?Y19hxBo@^ap~s&5A82z`y2mF`;U6w zqd&CfTmDn$QuEuj{Dt_fa{@_47NM!mNoZ8^fsLd3+fn)Lgp@YFAI)!<-hw?IkM{fgha7|d$^RGrI~$d0zxnO8 zAHU1$`whHfddvp<{rjlxeYgz2yUXzFe-wTf{CoVo{gpT}^r9WZu);AWH+CD3L+DXQ z?(-s1)NDS#M##Yj1W7!{yo<4S>{vW={%pv#qVMwJ=?%a$)}al)F|w|t-mT+{j^Iq>_vnQS zQ}GP9pXPL2m|rjWLFK(!m*GJ4CKBd@Zwj7c_KjR<>__rzO>pc?ax41l_~6(_Av1zo z+QUusEK0oHG>A{xJ2#MvMj~sNgA^@J%PHECmKFSNVMkQwjJ<&W?-BE|8|XCySp zWyX|Ao6lg{jJr>AqmH#`XvWn#twmF4&_*=ene&w@3-A5mjAiCLkzKTr_!apYwFkAu zFGiF1*9?xvYhk5XxVb%EqXKpSGK-F+1;gBX501Wq+K$&K!PqX>#({=a$vf~gfw`Ky z&jeF^g!rnKBL7Z?e<71YkN*<6<6iQL>`9!1eO#4I#%eX!{<906J zbiN=MUJoWkn+`)^sh!UXMuuw+RyR1h68}ow5Q;yDTh6zIS{%VHbExP@rTeSS#*{n7 z+}55qMOfsHvLaARNRhg9Aar2NSInjl|`5iwxAGI@!Hl^ma zSk!Ul@Z-7`mUaw2zo_s4JY*e~_!=w>E&8cKW??B#Hk<|-@&@kZ*Hz#F6@sH1h<*P` zEvSTo&xTUh=cfLF1Fk2hCa~CM<%gN^D-S`dPhyLt=&$tqv4nM1<=}_4d#0|!UuoW7 z738l^f**8G4StxFS)F8j0_)r0hrN5=p1LYy5ZDDrN0BQ;7vVLirLbMjfb?Z(Q6YND zn0r8gWrDk5nRw@#ndi12wGA5*IB0RDrXP4q#F+|hpm3xc9(611+#b{ptQX5G1mqAv zW=DR_jAboLkB?_VgV~>$L%WH-D5vAA>+f@y(wrNeTmxDUB@)%}KX=}P{BI#TV&{{Q zl{G{PTqqJb&d_)yjIl2#Bd%%5<~-*J6$)r*#9wVT;U`Zqp7FeaZ;t-Ra{@&_dPu$6wLZW&NU}mv5otF4DDN=_!?>``lZ4GarptiJ5F6RF+QBf-j?== zXPwWL_-W2+Xa>7M({#o9Oz_~+(_~SH+)vVz1+e^w*_fn+Az&!xh)_&09%TRRQFa`x4E|gDy=0@dPprPpd_sDZ}!&WDPM@)WWUQwuK ziN#qDJu?*Ve4cuUa3w`f1L*6h`Gy&f z%A5el$aHm?^>$|yQUV!QLr11^rhAkG=`JA0BGnP9Fr}@D64THX0thL15*(Y$;1<6WpHR=kS%w3ZgQIVOFN#lOMR$k3 z-cq=&PcU){cA*fDD+R-oQ67I)3`R0gPPVVALaSJ_sE0#=IEjK~fl2A{iG?*`rr`W; zsqw7KR|O+q1R*(2;OEN;{2)$wapMyE%NZvvLN)I^LaEb<&KeEuxK4`bI?ropo}?kN ztrvw2fLy_6l13&z{4}l0{q~GY=MlcEdp;TO&(q_u{%7M;zdn8o#kU#}P<+g9MEtH6 zeqye{r)_ZP#(7Bb8`${U>yam~66f;b^4j>tNpu{eLbMN-qVTV5mF}W3up=0Za3dC< z0+}hl!oz`$Rs4E6`?6C~8ex)BBQI8OsnER+po$0hzH1N0sKh?*tkc__x>l!pX@l#xU*B?u2iTrc5jLLsi5`IU)Pb+d- zbK0yf9x;%u0a+1{-uUL}e}dxnb#dKs7h}kNF%6f};qlJ*$3uX4He6lKTr=OCMl0p# zv0rl8(u-E^np^mcYV?4sacq+Z(ObiYSPZN6 z!>&2(2R!S%3Im|MaeVugMo;Jv7l1ygkeTK?(rA)#Ayw#V?P9;G;fjb-jUCB%4dz1QhOAmvfmG1uZfhU6ho}8 zGtAFA<%ltTW)MG0-C&f3V1(fUJ!OGm$#@zEOU6?U9*jpNR6q8;Y<^eK=aBrGfYbpD zq2ILN*y-p)!sL+6@o;&L*@j~aaD3uJ+do{sLzHg=o9{;YjL&yrQ21gjIZydk^toOv z1BdUBpZ8X+;=E5r12A;+Ezcj*l;6u*PW3uieAJD*J;5%qTvEiY@QaLRK0tohfYq>? zn>02?w(fWHO?qIy8R5>W0lvo?;ZCmtKk`PnyNtNhPlu!SpI%ft{LPkk0er*n_fwC< zc@DZ~o7Mh$Z@l^w!TGf@$}ZIKS+qY;Py!d&(+m0;uo@#QVkx|@5xg&i28wc*_CXk&(IhJ_-;3>8v>#2{k5?@GaAZv7j_%i(wl_=~cLyl{ z&USlOLiv7sXVo~yxb6m}{VIDfG7aW|6n8-i-~Nif#%*7sh&JT+6W)0bc5VwY2h_w$ zJVyUu-o6n3#%mW|6r7)a9`{A*<{Y&OevwHVcVZ%28G8^G{myn1CaTiEAwfUCf4lMa zA!;!i=&YsG54Y3SzTYpaj_tLD8W)bjzY_R+jd^AS%N`AC!HRZQN z%jIuRU@_2||K$|zs*n?ZICcI7D9^pU9@Qv|yekw8_lHMw@)N%YQ`^6=^_$ybFH&OX zM7L1%dtHn`j#+`v@UbsATP0;yz;juz;KM6!{ziEof)&yJt(RMVww=oN-rHSnz@4r; zndS2&@7r2h-UnU-K;PfzL;upw(-k*tW>*kUGNj( z?I>Z!eK)k95u`DU`~EvPU*h@KOE4PkYV!{!@!wq)B_xbulb?Jpc2iXT?d7QY66%i2 z)QcF;dV-M`&)oQVp7L9w<~N7Fa_{&jm52_&vYB>j^Kg58bJG;EmnwU|W% zNISf7^Id8;8c4VKoSMuhMftey1U{9@kCb!ZgA5nsGZ!m(E+4l&J(SNxEv9z zvG}}Jj!&BMX>0QtEWYCUaZj)r4+pE_;vjnUk#I`=a4OCCH3yA{ezxXX@v9kd+N?I& zQdPjffu|)pV>e0W8}7X2Y)qSu?e}RiPUjQXAE$$ne2hmBWb)fI6#6Cof^wXva%8!3 zBznkrhKn)~<<3OM(|&>RZS`9i-+Hq+rTP?`bco0D+D+d0!k-%j!#~O#5hrvoiwcj! zAYRy^RWK64g3-S36A#N;7RqBus?YesZ74rS%J)Qh9A3Mb>utpk;q@*yH&O3R`~#P8!zljrqNpw;9KmS{ zb}oGUH)A5yfbUPae)mU3vEv3Up?-Hgbm!+AnE{3gYuZ*O<$PMJ1|!Y!twJz(<4ukS zF8&0?&v)??6;KMPMAmt3wk|))Wb0UI4;;9}?=KsHsr}Q%?WDMCw2;dEni#jw7~_Fs z(vK)7H%k{zWwLZ~8f`dnUa(_2Ir;N~uhDw=`OP+;F3Efvfe(CYJn|z~OTy`(+b=aK zVxOvGI5FQH0Z!g{;fqkPjANFp)lENbKF;+V^hPC?K}8}-9FcDMauV3$ZFp% z+A`*~Z&d~1i|fH|g|v|1xL{-px`xJ#FgiZ6>T>zLHD2a7vAgw?013rRx8_&D(X9(A z?8EiMfmdv3gJ3~_;Vf|ii^>=_8VW;}M| zWlV8)bhp~Q54M&wS&4(#ypwM0EeMub8|ka{_&!U<>ems6U45QsWALIvfs5qG{+->87&=SmOHmGex++vDPKvEiTaHD3=8q#R@3fJZAm-h|5bpzIn`3}~hUUQK7a?!ca-aWzB=eW7F%{c?eInk^iP(tn;3Knd~ z*FU*agb5i|5ck4sLNVQr;ujzz1$ZDw67^_Uehu&F)b9vv@|HH18MxO`IJ^lyQW)XB z2N3QNNFapMfMCud<9=weUji>FzzZ)7xQ&t0ef_eVFEF1Q0E0qPy|sWD{~$KrN0SpK zOPyJVP=YgaN*Jz+2D|v}J^UZK`uKGOpOzqgn&QvZ0*XI43BRY}<5R5iRRl-K8K+1C#c6*ps&H?`q^hM8c(O3FDYJU8!woIxBD+jz1GZBYOa59#cntxbhke9Cv-6_&i5Rt0(kkqe zMGw_XL%0c!J&&bh0mG*N>kUm`dxfHe(O|D9Z+8|`%eddnmggLi2X@Bgk4v57A&=b! zB8M?`IC>{)0;bxD!sF0!@RC#q?*3qYbo$BQm^lNJKOqJ^_ zOD^(sCctlGEd=NOmO2FoAe(#4GXruZ&UEKBBgROFiku5o!rW8T-15F+Y{Vp2o;4bt zp{ZxEvB@sX_4|{2dE9*GS!y8~$k$TZ&nhL!lGrbP;37XL$n@6^2ATf)@f6ws{_5g( zQ{37%?hN>d-w*x)TpV4;l#?NCHDaq}^xEKJjJ_l|_EWSK3>S2krUWB$_hYagbc%8MVpwDG(DY$Odee&)~m{ z6SxIfet(4DV3If!3%kyn5YRqvAn*6#wkRDhyP}FcUXI!^1q!@56w|wSLeXptnKIwh zadRj5+T-R495?4(?GAF0{^*5xpaUt#&A3Dpe;ADX0{?|E@nJ0n(ObD%9ve~U>gQoN zwf6EiJ8G}u{f0}Pv*M5E|F9196V`ItuV$dJejoqGpZw*$wtkvmvtNY_Hv830f^GGy zlD(>T8}}-~b>nPD;38WXhE`i0YB9?A9qJ`%Sm4_Z+6rEikq%B+Z*b#zk@9&@OXP2N z*E?WP2U_;s|Fb=0=Xz5u^i)?{mxHBx)1`(_OYk{+ayfrzKdWWhNDikmeJYIw!sF4yTO_Fzwt}fMI8xG|>Dl-E-VFN_aSz|QA^m9y&>P5U%AGu4bjwht~Ek%{JIz|GV^t}UF)e`+yiLK z(LG6y7LWt|fw{NUAKsS zF9>sf{C4H<4S1FR9W5#2OYG@#cqc2~<1QZkel%?F>v7<2+L>PjD9wrYZGuxX=4k(M zIWhc{<52Y>e_o{81h(x>If$qru;_5R-ZAAln+FE|M z54OgjWAdi&exp9;UCyYgr;iKz6^^XeDukE#3T`>3h+SO~cTvQJiEU8vt$6<`6>G7$ ziyyCVRKUE15kDC`|D{k2ZwGR%w-zBfw90?h)$&dVrdsZ-@&+TIlmfLe;P=AQ<~)z2Wsc~8sH{v04-v@O$gSbLwYgWs#= z_os=+G0bTzE4i%^M_+iC$F zXBI#>=`N9>ywJX z@L8rz6Ma%O7`~~JmN`M6;EZqU%K9WlpPYd8GgE6P>|t+ceppt+Qk|+ zJsomZcG{%^;X+h7Qz!yP2Qj54bp#;fb&O?GJBC32b}{3^|l`3TG6u3Hfa!H@ZBD*^86->=$BaT~a}Xt;Y{Nzy`EGrx;C`^PlV0Ay=KPdSvh6;7R{UFRRB|iu*FlazE8ooQ5A~ z4av*_t0`u_!7MhIT;F_a9J;86ES!I(cA|mYW8j5dygBOQ4Gdn)!n?u78=`o7S{+@! zwk}?(h89iz8TmKR|Jpu{0~a-?KSl$wbwuvi8t&F(T`%UYKoI(;|vuX zvDcw3p1tH6xY|Z8`u`n3^ww_{!?0-oo|eWw^q+HlocDmELH;v%9Ftw=E7nMUGhzjt z8F^TTvM)|{MU94S8UR|x#uG8zd1K=nKrS;jzJ_7Z`F*O4jgeoli^oy%zE@@JtrU#h zfF}tW5_vChd!Fp#@|7MB_X@#9T;QXQ_ z$f;glx)#%c(iH5u6?(C0)!Jx`>K}Z{~QDH6UB1qvk)4gKAt|w)kg;#>7w#TGpLWp6e;ouKv27vSNmzZc6#~Rna`tk zuBn}+wQG2_<96+(o66}R?FH06&eX2R+C>>l>r1w}3sv!Jrv942U$MY|X1wt67P;e} z>kz{v2>LVGG&(5GbD)^S7u@$a3;=FFW&XI3MR@Eoe428&SUJqnU#<1mH_C7Q89qOD zmdXqk?jZRTv;k%xqKwPzV7+8!y$rL03@G(m5IvKAv=PdP2d;qf;hbh92atgiOvayFCT{z6}!*@>M_*>1-mU3etHV z(li^XL3yO7p9a#+2C1(>+WMmOo=85%Pa?0;-{H=nL(Wg@x^kXk_on$jmXmWuG0-al zJ&}s4I7`*Au_xKP0QcJXNcp-m=A!Or&uJS!k=r>MuJ<_K3Tt__v&z@LcOGg#Zfb{7 zo9(EMb|AyYI~m{NJR9#XYdFe7JPQerhxq#s<=S%Ud>~$+h~cMDKha7~BVwKdoNGLs zY*CttFmIH{8TtlrexJTh@6k$;;mJ`tBPuEM!6&48^8_Ko6RN4=|^tp2( zIyL$+`nb%QBA?3{j)qk{yaP7gi{e=Pm@;Fyb z1kQ^F=hDN#dD7JjC7ca5I%@Ca^bI-DY3T5|=z!M##!FBSy8P!_LdWZ%gf%z6-n}04 z_brI#I&oR4>b?$3&`w2(7mKOx^(e*hzZ=BF9hhy=h(tYzq?KA|rAM*I>U;%szMOzc zubN87X{EZXgsnGIsUlO{ct#tnxI2^mO81&d-^srXzpsr-k9w6(RZe}mJa(I3sk5o{ zvR3-D7An2&wW*d?s>Dj?`jsk~N`tl1Y*zXhmEd%zYmGi!c1ZDSeDl3(Awz4NLfKwC zNP`pH)9~yIRfnn5z7B?0b!X?}|ybCwFAR>8+ zw_bjo2p^cN#jqZnhH}Tmt>NK5>*AiyI2Ugi8Kt;h{;#>^~kghGCgi*}STi-k>h) z_?3QHr);j!N}b5&7OXOBrIuRh8*?umD@Ryv58vva>+sfVfbu2!neN;5r9$OWi~AIT}xuXLiR^srWH#!3@l zM-|U_;wZMMx?gGYT2(}jRyu)|YI~LLP)<9rPU5VUZZ3*=(^RUhmF}vEN^fb`s;xCz zQnpw88V{NpTjbw{MXb>dY+%+}T4NnmFvPDBGBsvujU3jnqC23^uLEss!AW>LU&Q=^vF zc$qaeB2z$fu;fPL%%aLPUP+AyOpVR*Z^N5dqoMM^^n^7Av&MZskM5?%46V_eHJF7t z7sCCl(*~Gt*z2+0H>!$ul)DtYwm``}67^v^XAOSm#xkBfE|phy>Ft`sbZKI_q^Ww9 zIXBjye?%6eH2?Eb&eNs+fypSWDJR~~#rv(|agsph&2~0Q8M${n|9qYce0wcTwaYn! zgygB(MaV%gRcoFb-DJJOJ{~eAYCuLg>M>FUY;Fn2^9zS1^pugWNE#eC#NDU+kOpGn^NZm`8Q)zb@)Rs)P#_8 z@wY1HbJmRos#!vEUb3lBQgLEB#RomBx9MLR#t5$582V zzfx0EDXx`1U?qH4xYTI?@vR=>-+$%Z{~=%gEO+V0p4C)~^p6A3vhyB+W9|9?7{e3a zLdCtINDram*O4z`=2u8J!21VHA0An@e=vzl0}Av!oXMrEFU4;ubUO!f<=p6IXCaDE zb20_o0RPXF&?f$u#Ue+XA5aAQdVA!WV7ziB`+8$ctZ^70cr8mTkjLE9$aD1wTb^_% zkn#*cgCI{6EvWh8M)(5GXCnY|I=bj9l(2SIdwS^Gkq!}^`+M;R)SsXW!97`VmuL~i z9i425JUt#_M+ z+pi4n9JUhgrQ5j8l5ndCZr~)8$i?@uC?MXyYC3tS%okjJ4pE#vNOwH>HcIdD?7xy) z*ynV7htm(rwLlAt-M;`F_jQ@yQIDr9-een({U6RGs$A;a3q1If?CTb^XV^bSES7Y4 z$?NRjxVr?`u~}i?Kab)}AMZ-j!bpSn51PJnKc&gSG>bzh<(WV&;Qdfro>JJvx9jFF zF&`?B0N+(_)R})HxyLiMBPVu#hwyAR>{g7D)WkWWk#?6?LUc((ChE*b1FYzB?D6;Z zvU{Nu0SV|(G%^elI8Q=a=W@bhe8YSRJCYj3=OWdG=CjcZ3^j!`CihoPddO|B8^>Rw zcJbb*+g{xCT4;@Lh%cE7Fl?nb*NS5FLmuI#a0e4#Q2R$`1c-<)hj`631Sk_Oksz^q zE0#`9eA?3DMN4ikyG9*GV_?4Nad$CbH*z)CAKn?_`h%p9$Y3W>yI2paT*;oaz?AX|Bko?r6voMOnWjsAxD7>r2$zH*Oyeu?^>K<(i>SX#jNzw~6!|CdR7 zy^~}2dZVx#+L`mK=OpB5Jo4;)y5dcC^-{*(TS4Y%D!J_u zEU(PrV8q;DuTvQ+&55ROFfWG%aIb1i-wMgU%I#A07j4`-Rs4Qi6WS^hm!75eaXv~* zslF@7WZ(@H0?(k*_a3rwXKwbFD}x{AqY z8(894^V@RyXKmDms*qa1)4X%y$8Mn1uaL@?fLEVh$c{y@h|3|^qSLQ zL)c-mt0(54e!!Rc?IslQ=C>~%b$)voMXb1Q@=whPQ#F!$@p=*3tMih<0qs$okM74p zCF3>yo^r*cp@Cd2qWx(fdyqHJ{q7U7-y~<|aCo_Qv(pI%l<&Pw1E}Q}#63@OccdG? zr{BGhggXkj?58G#vC?rAS>B$4;K8w@C6f(IQ4GHS-E_KiF_WLN%8JFJ*Wosw_DOu| ztNh;l^mR~GFI@~U^)h;3vR;NLZUY;4qx3^>{}Ncdbk_Ye0{eyxG;|B`((wP zt3_1bqs2Eint9+r#WflG3VL}gFdXIG*(&w0^LC1B>0vQjiT87D+;fuTJs!B6rA4uc ztnEM5lCzMa_5{W4YvY!} zHh%jyF97azL=NJ@1c_9rqFCmmx6mlaNccWqODN8d=W@PD{9p0kVx zmI6>e1I*1RUG37qcqSM*%TNfqO6-O#`j~k;#)~dUG@Lu23~Cbns|zHig#ISa`qmeCPxBqs9h!mU`; zhpyg-THTb0>kt1Qd+!2YMRh&?PF{c}dazzI^PbcSLV9br=ZWW@5sfS1;3iS8Ei__x=dJw`jh+FS)`k z?0k!<H zarc738yQ=Kk*pu)ARzk9np`VPltadwoc4S<=B|5WysZq3_MiFaaKV7g%{1krj=`pTa?e_aH-;h6&?@gNT zYK>y~A8EsUUw%gMT^VXFa|=7)VygTI(+=(SLd`eb&G(K7zBg*VPP>hgmZLK_-Ki{j z;+v!2Y0>5Rl=Yaz>2F>TZR_Ip>g)1d>kj=5!|@M7OGOI0qj|7;SWq?pZSWUE)1O^_ zEnJW3&%O!eYW_iozk9vnP^hoP*drr?Z8ypY<3+3A9Bzp${eW)8>Bw!jlX%Uyhs{^| zu?k`#AHg?D^L6shFC4xVF1|sF zubm&R*Lks`&TxnCk6e5o?7%lh^ZoLOQc25O9KrW0#W(I1Fzmb| zy_hNt%TEO5ZD2ZFi$Z|9+0%`e^N*IH(;ha?@c z^T$+-L||>im+t)0NLD*0f1IuPHQ0XdkUw^DSw=Og*Y{GDey&eHzxQ?MD=w2i{z?AW zO8z+7&B`AmOWjTK4jGwP`QvoV_?BYCN&D1K)Q=OU8|EzT+bJCTYG-`+J6~+76Rkd}nva7uA|?vYYQA zd>OXG8&5DFxSPE@lGpS&{2s}hjU#`=SSs|Psz$9_JPoF-Tbz$1S#=|O9%LN8U+pBd z=r(D(^XXVaYr}LmTXg#s9J%`dbOltXE34N;;~Bt)%ELtCEuzOY(QkyPf|)`n4G%=D zcewVu95cS}3pJ@1JB5<4MCfDTRzETWZqC>~mE1z}-h+e1DmE zp)SseSNfw8W)2ZU{0~B(g5@lE>?C&dFd>|Oto!9U3zT8v5;Tf# zckdugc%JyoW2${Dx0hlwsZdXCU;iS^xAr>S?(Ft)w&uG|qiDW2NAUG)zD+jY&$+7k z7Q6WNxA@w5|Id#ryJxxi_JfkatF^vxn&xY*zh5C!b^EPdwQpl0mKiqc4IIA`gVo3F z{#>ge>kbR2iyE$VhY7mA4H`%5@wAG2d!6Lh>&05%gwDFtUU#_JVkq;b2NlEcee&-` zI-Xy1^P3yNFH`Y56go?4j=VQ0A16I_q$~1=(OPcn+ZN?F%j@|(&+7bD9iqi0dzP&r&G6Z*-LnwU^IYs`^+mzfMU+BZ zgF(fl--MR$28|a2jf1OhiIrR-Z<@0t|0y+8-nySM3IhNG#_jA70$9MWVER^_ac`)}4@mbwl>ixs&RaUhx%eT`!H5=tZEuWq%Z}QYU z!U?Yid^S;xQTI+LO5$4Hk0q}dW(R)FdZKwkV{9*FV> z4pI`!-+3vc$>2kKH}OplJ{$IK+D1|+!@<%hKGU_tvn*L8Z@fI4P6$5Re7Ui=`JxVA zY3@VX5@^sijSP*DKAF zzMZer4ffQu^$<1A`58$wwFXapD(Cg(E7R&)_@?lX7MZ>LdTpCL08uxDkO^%@fNe$} zB;+WPZ~7vMS}NsU~{FyqVit#Hd&| z+`nZH-{xt2OpMD*C(&Q}$jsp{mfe<>L?a9F?R7rn$fTH$LuWT-Cmq@7g}J&X{XAba zZmM}1)jZFB9@_P=1W!g2RuUH3Q7^VGf-Cm$+#v;NU%yb|shz`7`tqes`a5O3GK1!6 zRT`R2!`Q_2n=KZ63C-$beZzP9JY#oe4S(Kq>j88@)Mi3u7~j63xqhKuF=DrOwMLT7 zYeQ$O3^hHX0-BfN%eT2&(1q{b43PZtAY82cg4)~!Ab<~{wx_zDE9~sZO4^t9QddJY zJe8ltJc4j*IS8!*{-oFKCQ78IuinQ8a@7~ws<(GT(dcwf#%>6Bh4e7;MmI}CbF##r z8ieF(x=>X0k$BItK4**h6$8G&_?%=4Ut>a*uQBchwoww)B(`2YPt81<3heRdSn9VW zs@{!8j<=3@R&etR75E|<-=aU1UN@sDG)_hFjHa~ej}p?<6O_07fDnl~#7VdEr0lv@ zjG^--pFfDId%im4uRikQiZ0b3&P-c=mV99^d-&_+A7$6Iwf;nME^W?gD^^4C>E=dT z9p|Y@LLaBCW#y{2#`_3rnyA$G#*y^8Ez&OJBYa!_HLCjgSP7DeucXy&r^Q6H7V{jj z#5sMgv0BR^Ij6M{8cu6j@Q`XP%ilyU$XA zb{S}=JY;#!@}uQsb8=76#qsq7AYXKRNquETbV3taev5p{uQ9HK3O;afb7w{q3hhRw;`Oxi|s@vJyPcuT*b{N+5(b1{`wA2?0AqNuwr zuL#|VxirPi@7BH>yj;3o)@OZuu*TOI`-AEOQRV;U;BG07V1h8~L(?=hqs83M(9QKy zh~Zgv>b1Vy4WFDX9eA6PBfS5G_Ta0FOBOP9--rEt^@_r-Mb?nN0*h88t@1l2F#4;I zG_9u0H;#}su<1irOP3Q$SS^DQ)r6&C4P!QlflE9!GVdW7onGFJtnyV_^{cVk`?~jS z?ETAHuB%UwJ1IgXLv!-v$S5KO`WnZy`8*SMxBic6wT5MSNe|}aMQA2@!D@SItcetvo=H0~Qk1-t#dn4k zm>IS2mdEiy6<#op!y_V%h4PGzo~JUJQW!DFg12^V2dtF9z=r!CYy>-$7ye?S=`7d-E53>jZ85IVhiA*kpK{rqBGBlebT?|@wVK$RF{IF+5Tf7V*bK(r&@EI#T zw+@6hTkhh0k(tDngU=>3R*p16iyq{4MGP-Q(7Nx`2qUxZJ!fdK_;<{Ao)ZajmY$pfw;FCrD}3}Vg$Iydg3Tg<=LM27dGj{6E%y-f|-q#apaYd z=h^OcZ&d%wU;W*WE8?m@n7O>0jD&o{x0V01b+SsN$4S}doyzq(PwCpm`U~q{of&JwsmUew z@`CE_iodGf9(#h}UK5=v6RQ_gt1*=*+d@a1Wy;_l1=5SQK1p67ZajBnASEmrDqkV; zdY)PmO=|7ddJa}q2z?!db2(yE?^Q^xUvd`dswc;G=Bmv+nQfb7EpCgHMYZIbVGM#C zR~^SsVvp|NNqd(_ESH0_Kn5$9gk!a6~%Q;DVDZ}6cr7uRc{##^- z$T~B!I+L}#OV)Pm*O{yh^caq;tg{?1u0-Bh;oe1MX+7JqdKYtY$;q?#?cAVL!-^AR z?-Ez`t{qL5Rkxa0ZJ0HI<%A49tXL`5`Z+cuTh{!O(TcL!nJDSlEQ%Ac*=fpV&mHb) zvkPH&Y<}2#DD2-?uwQ33n~n^Q%}(Io!CKbNhjixTS*_12gv)pSlQ_4g;H)l`r`bI| zuSjBPE2HlH@O;x5r`&m;8mHVPv@%X1l}ewUQTM%sr^@tdC?Q>(%}-CK`2Mx@_GWiJ zd@Tpzam}_+@B2FrQe}wqN;j33b%w9oBa?G$2*7lNVUV4r^SIeWmVP`_XX$BjN}SRW zw%#ErE+S^{1?yP*=X@5n|9E`Xnf-Uu+D~SG$%E^`vr~ZAs>(GAKUQ8L#uj4O@}F;F!)7nSgMPGmhUcsr(PB zO2YTUOK0i3g{zgNqgsna&gxfF8B%^UPKNa?Zs-A_PBo#TRWj_}mf0BFrE1s`Pwh2f zp=^&eP6k6Y0H3~(01Igt;k5)6{7qGKE>@diI4t?BZcA3~_HXuhGPjJpzky-zGWj?l zDhs|E2&bt5spOpWq&@7o;N?YsA;dk)vRNEfGr4;?9nw<$ZItKkmg<(c^x-XPl+rl) zs3+?cm7*398;w`-wRq-DZ>l*Ht1^w#D6LxBTMqCshuxu3R&{@n zxX6FEJF^9b_;#f%9aNh!S&hkE(>!;zWG3w?KP`jNc5S+Rl4Vofa{VuhWs2q6Bj50( z0xL^Yv*kcs-5zDZJ`Bx8I?3E4Lo&uY298wVL?Q+wqw8Hl#xT zB~sD}r+d=>?#|&sc8Q-I?c-YEgrc+PuVX|0x_QsX%nBfPAYV%RChqn1Jr^eA=@G$ zs|KVJvhq2>`pZY`m0ZJ;!nTYxFB5SxB9lj1`dlINb7%Z@w)n9wE07+kq} z8#TsK=Z)EGRPRB=g*GbE@Dj!Esl{HRs7lpirxlciJlNSCJCnrjImCywOqCe-jnLgf z(r2OH|3csP7(upZjomLPgS-ohxi`SW2>LWVD3Q7v?Da$;%741=f}k%;4{&;HV)j88x2<-yvUq#kemn z4Kw@h5?4O2_;Js#d{c(!sZYmvo{lY;vn3Q?y)Wv(8kp6HIC6_^LG*!5&bcLD-P`)J zC%)W&@OJ2)?wg8y@uYfxRQW;9w8Cs26$beI8-wd8h zPT1|-sVbj_Ry{4PGIQS+x+|d*7P9_j#T86u3KNE`cQGPwIj~8_t8z|10?oG0cE?#I| zK(N~W^VPi?A=qtmC6XH_MA6(^q$b}j-t0t3>i)`DEe5PC&!gXk zCa;i~*~a|sz?#q$NpBysuoF6sqsaJl-S1`eKu@HTQ8aW>}9to?6~D zs`mEDGmlxr|6MjCv!2_yPi6H+*H^wy_eFVwTcIuOeqe-(E7=E_J^Z6!@)*xkJ^Fl| zJ~_(E_lhlIZ+JWekEy*4bv^i~b-naobQN-E*M1%Sj!VQZ@`$o2t8D|ya_NQ97HGYdPYCE^a^?WZba}V6ukRYAFL^=V*$9XO^ z9`n!-^wmguKSBi!PWF6k>LHxz*ssC2*s^sh{?vKN$9uHj)_h-s@7LtaS=&9Y(AM-Y*_r+%4c&ZaGq;at*U43;DBf()k7|ZxL!lu!fD7y6~ z!eT<>&^}ppyBTq>WRxkducxhTVm*dtIjzdsdBFCCx)<1yuspMF7k5ge@8Yf{cf;-X ztTx8gZ8nUF^+Q8h!$0!ex}!Hr5EAM!%Wpy>8&oG$`y|B_W!JT5u^WP$!}8%U?h`L3 zlB%-w$BwwIBJ9%|$3hJjyUU5$nQeyKIk(ZA?b{(qZl>5@lRaYt7Oq#GN zrmxeu^2wuAHa~%{qjkAz8#9)R3D6PR?3JOt;x1lkueRjina%YQ-C>&6Npy;x+lsl} zDcXv=ZCn5BGE(nIBlVPE`U-6l42S?GbkDGPaOe~1k&D}8dQ%Svigj+N%) z60B6F@p<8$-2cm}`^SXF6kfA9ZKE27XC-|C4_2x&#Ka_rY0aSz==3pVvow5sk~VntZlJ<;;E@1beW}0 z!$>~lr4t^f#3u4Q>D)Y<#>O^rSax&he4XGz{RGmU)Lr?PLfvjxK7%u#a3`)>f5U)Q z)TtWf_0-(@KVpP`gjEyQEA>!oMsw(NrPd537ix)Mo|^g6T%xv;M>cLc-_pr?@7gq4 z1UZ&HJ)%_tTH(8zCaf9eXpD>-KHC!JEtOD! zjay_qjofSkStGhULjpCBn*rR^pNK|shlw_XeM0?MH?)-(si-;mEhUfCT+ZvZRHONw zqLaXv%B4SJoXPweW@c!LuK&w7t@^F@?dT+0h~C<_!ZFk=ktAE$Xg7VAb1a*?Yy0X| zVQo+GoYnd;XKOTqI*!?+!u|M;xsl}|jHemdj`{o|$1#LkPbIu1nQqa_D+{^%BVMTo z+tHwLWSR5>^>J&^(ecWD#EtYy6-@2t8O+cXb;>V6+b*qZ-NE(SUShrD>+nYeIYx&i zuHce6tQfV^;ChtViKuZ_WN@t;q}15*hD#0EQXi>?)XDnx0+#BJw-D%@h zp&M8V5X(9?Cw`MY5f$#kP_+IkHMt^anpJx|jhbltS+w-+pH7*?zpFX z5M7p;tmcc_;b!Qg+f==q!BYOPsa0ThXlOr`7<6?~KdKGaCityuCCp@H<^!KBHrB-V zVcg|;Dz;DczV}lmdukTaP*T!7wdY~VA#ZXey-!riAWuySUJ;aRPi=Qde7Vo7F@mdG z+5A@}AK!i=(OKp!bD7h6AC?(9TkF%H@yTDeLcm+YPk+{sFW&SxPb??-O7a%HNp+3r z&#mi>m7!(Ok|xMokA$n-+U+&5DBBaQfj~1>jUv%%k4R2S4d=6J zY(%{8+7Y%dyodowWDLHwU+YIM_=_-5HxL;Fk>ftcpILQxFVfv;Rp?x$m~3c~H+6!U zsspj8%(7}Y67}s)my8QVSwfNVcxXvL)~~ijVJVvta-p}P^3?pDSjc<>^td&z%BHoW zB3!ESOXJA7Y`ejnRo3{=dH&H1U8dy>LSx6Pd+?_E2DMvNlV>jv-6Do_MXmoxVk#vABiNY1MWvZq669L zfd9bCAHt~7hZO_^5Y!4*Pwn&J#?wpD+PNqkuWyNU_};_ImVUbZG>(Z@Go0uwc7Igw zIhT3WcOyKtJ2_x38l$eosB2Hy*Vb~N%41cot@@7pA|FyF`?1)}w{09Vo{=)+$*TLl zwTs+_)5EJKJDuxc(Vg5%!M0*1)RN64Y=4|#H&03FFa1D-um_A{^XFKKvP>%@L}|L7 z+SdiGe&k0gaM*74nXHmF_U<8_Sl#<-{1N(_IHxY|Il&<(F#h?t^(FA+d-dTFP&dZ` zMcliHa6lrfz#SZLwH0S@^VFuvSVE72exqo$1Bh>D{G&zarNor+S2QHr_BC$?$E16n z#bAV5-C5tfIW!ebMphscmA6t(Y0D2U#}=&tK6` zGG5q@YGf)yG#Mv0hYFM%oI$s6_0$Z&o%ZO|9&vX%fGA>_UR)I~y`|l;HI95s^{8>F z+ojYRoxU$295Fhr!rbBbysS#OC;=Mr&;HimD}obC|0n9l2+h=D+r(3I`Hvmx8N#KA zQ|Vh(8y2rv1M4SP4iwQt(s6`Ezfz0-&uuQz`yL}Y{eYccZ@O8@y#WF(_rD}mI*qE! z28bxGarNuk`0i$%r7Bi^5byAl;f{`~3`J`n zw*I`AlsWW_VnMk67j@c{z=`Y!Z_@QAL#Oq>7@|oG=k&ObpmYuTei$+6Qv*Ih?R3D$ zf>Cp*kY!{EA@PvJFwQ3GGn%bzp$31%F|nN8?5VxmgAmWqvC6-jv*@fE<^GpW#!kkl z`AaxJB$?^~-!-hA(0io3sPypE?p8w{HLsc5PyD8BZ#{=>hN_uvkx~*gKJoe+MG&?- z{H%2TE<>LPzrRE5b;u?OZomKA4!FjV*-7ELBgP*wy8c~`-5-ZY&wcpJYay1vM#^MJ z?lOvNW?G_+OY2b&kce$PHRVuRZQtr?wrsUb(o52>4#%ZRB|99`X~$hvJ2OKIDwSOt zG!b_By9Ajl3t96_7=^RYC)|EHrX9<(7j_oX+>bMj32{3{n(~W`JX}qAoQyc@1JHAk*1Qkn5 z6|HSJS3AB;*B|TD{~>w&WOnkFxvfDpf9J`gX^E(`9 z&U%P#w=r7o4G<`~9Un-jc9@^tBeCHc=~h(8d0dIAj5_RT2gBT<3~>i0%HnPf3eYa? z@yA<>l$}zbIca_URDF6}`^duZTu`Pc(vl39jYI)IQ!zt|=(m^;yA_UOhrfCKP(k!8BM+id<_yv6#n3rdn>4#@z@L)sTPuX7z_GG(X=@svL%u zWn4e3FICVJI0}C#MyiXu!c{dBKpAWjMaLQ$+UC$831*j}&s54w_aijfD_eU@#C96o zpQ@D_S5o+bK!MI3+}~h)*y!Ls({5FbBj*u3b_Zjvi#ckXr`6aDsj^_}E3~i9ht#Pb zNsT8OQh!MvRYO4?g$$_+xb=xh%_1rMA!kV4CTR5|Q&pV|seeOrVMx725~@9~%d?##h16VchwplC{Igt@12)=DNZVs~kIW`}RZK0&k$b+95&!e9u6R zD0zbQ0Oej9Y3+Q;kFHi|-A|Xue4$*)Ujw?ftK9In$K#%wM;XPq#^gIli+HHRn7nna z9&4R&gnfEvnqGINThrs^8jq!^*u|yk60Patu%_jgyR}r~1fBPp{|A+xS+<@IpJSUq z=n|Dz!Z#~CWzrntx~YmH^Nh6g7rn0hQl{(K%W{XZ=ZWgsCb479nonI9^ z!+HIC?1u%iAk}faR?&s~zZfk7b%)1W3-_tIn^8ABZ+eiWLwmec6eZFgXS}uOecb?m z%go!hA=Y`B9+7A%RZ3XntyW1dt_Eno@5&5~(Q>CdazCz6!*X|)HJ+trY!)f^lNi~S z8x@W(cgsJt+<%O0PUmU4XKxa1EV+ktklVSx?aceCZ&Y?qhDzK03);Ce{w~Jq^b;o@ ze;-C3YD62?_`3p1+QvpSdiD+Suy{fD4crkqlX$Z&?yJja#@xBjxWrx}xu$XC`#+Qc zKozzKkIUaGQSuH2UCTRKa9v%Q8YrkxUEHxN>!-uT-Iaa3QL44NvN6)tiI*Ek>Khhz zsHTSFbc(Kj9dx?>Xoz^euKN4vh2!OpuG-1RR)bJ}k=(8Rvz#scsfnRv4^wO~Yh4>+oLje`McVvnJdMEf0UIP3Ec12xo-x=SgJP zW=?nIg9Fq{KG^EmIR>iZ2vFRa05gvfpua7^Rv9*HKYuNquOk3{w)>j}y8bVpw*6cU z(KC9yu`Sg0?y)M@mN3&{xUuI+Az`?YOe<%&arL>J+ry0>n(dQ}(GM+9`X1Tfa`Zjmp)W&6>)r*? zUqxeB9{Lt3oh>GE&mo)pirZShC%?%!U6R0jLQd|V=ypgS<65MWMoen|Xt!z^YI;I~ zl%7cLPS(!Wc1jRgq;Yt(yqCM>{bs(BH}r%{-u+aGylR5=?5#8sR+h~P(rEQP1uAV0 z-Jn_(H_76*{+^AAm*m5ze&j|uzLR5wkTqsx%5HAGk1mn^=1wIDf>n!7jlI|XQ2H93 z=P_VtftIB}qp|*Tz0y5yf=xF;(*--wU8d>!I&>EbUiG&zp4)n##@)uM%04lJJhf+W zOw2{AyN|8Sst=3YHSjZ>C)Pu7J!cyyd0O^b#F>wwf8)qsbQfE;ln)Ub;6}M2(c}y% z*NPG9;@$#RbyRkS7Gp@qJmlpeZ+4umUW4#eOz@DadJn|y8A}M z3F}Uq6M9K&+}V8(S`1I46I=?}!!33Yd0JB#wy2%gt=BT0P}^-=v(?06{bHE2#P zG&`dB6W$TvH2*bol`)ICHr*^uSNkW6 zV6v`np}W3en$9mcHeG*BmuSn`Q`24PrZY5Mlv~cj?5oH%!yr;HL9- zQeSsX*W0#>q3JGi(}e;`zi-|3?f#px%ctusKWvxt#@?Tu<9J{{3nr@^mr&rUBb<=gzbU$|2cjRr+ zZ|Ta=0J%v2W;1wSE;ROzb2HeMrwnxD5m&`eD+VKLY=Ixrbgz-AoB+5()6H@Ve6yzO zVbc|By1U(U*J`@MZh^;Xx~;aHKh<N7Jnq*`)=VyOe&3Zo2)sO1~<% ze(wlg{m346ecLqMryiGnk7~NZZo2y|I$OUxG~JVKx(bWVE$3WKS76I|t)^S*rW>W{ zeD3-#(R6)ny7M(%hMTUdrZe1h-@K*t8*1yfU(OqQpW&u^eYUbocek9+X}VaO?omzm z_L(lb+@tCCx$9e|>GEv43QhN0H{DE4m+G!>lBU~h>o-c%1>AJ~G~GsbeLvE4TWz|o znr@(*?vP*U*X*Wy|4n6=yKK7G<-D=?S7*5Nds@?#xal6!bOmdzIJ-yF{l!gpv!?S2 zj@^KZHC@)j7TruuSL>!5r|J3&j!pMdO_yxf*H6=ByXicduA93)^9`k6ja}a%IdANJ zj+^eCS;{W6-1TkKbSY~rIiJ>a?SD(x&mQAbHB?%PCoPeAw$?clYBHJmnK=`YTh0;rl$d-lL|Eann@{@ZBrkWOxo$ zy6zY6550ARve8hDqn{fXrQ+#*Mzf)@{)W3e{`8;{OWy7o zAJ%W+1xlDIDDCx(L!sZyP36{7`8bjVAIq-58?yP-y zVo<6MP0@Vra`Vygr|gstlVkKk8$Ey1s)hCX1ZJJ;^%@t%-1Tu6TH@fhfq!6e#$FG! z<#|ClJnrZpTzXwXXz~;V?N~zMEUnj@8biGwb5A!%FIbATLpNzY>)d?yD<5kAyZ!Z7 zXb^3Y#Zlrkm1SP#e=XPk&;ZSEs+-?EVSc@ShOw3NZxI0+1D5j>g|*x^{Xm@0x``3m z0w?>cX_n`?Ubr)~#*&Hqmk%oK)%O^lA~>D>i2Fkii1y5jHHP-PM}?F9U5C%F6AXDM z%=PSC8P5TAx8Cr`Gl9%fK2cBi@+4O%RRx{AmH#QLUU?t;byDvj=YA~~R(8Em*Wci- z{|@DLyZ#%gzcubC>1r7YK_=B7myouL2SEt&Ai6fSP zne0s*2rtmD^CnL9CN41sB_<{oPM&(TabtP0Q*T+&UmEo0mwEH& z78REU@{EG~!u+677RW6w$}2PS@)sKOipxul!u%pBoH?h|pBv0CE;5!B7X^%hz?@+5 z!a%9PYXuU=PEDLjjY)Fv^3uGmGcUDGLORTrMt{IX4hg*KKR+ zi*B_BrW$h!ii=A{lu}1~M;n_k&mRmJcB!{`4*yFvZce4eN2Nm+mGl~KgT2sS6KhH=<5U*W{I-80C!X>%Ig#=J; zzQ4f8&0m;bU=)|;1I{{Z#ZeaT1}c_lyN%8`nx_(vF>cb; za-`yT=KQ=-){!NUeX69iPsGgjaafa4#{BYve1Fl*f`Gqdlrgt7Ft@lgd>$;8D4AIn zEG<#ao>}5AEejYk^UI2d{bcYEV`k}`+{-SzY`8IVQDH$@?z}*uUzJ@t?9xlsfr9gb z!4l==ne+3@77e}(!u+EAAchndg%4-u7MCnG{Dt^}YQu3~hWGu8M;V2*4}rn*K$$wI z2;>!6hrxN}rMhrVX}-Ex<`0&asw1tUOS@6xd9wg!D1s&G`GM{jA_)c9gG3S zK#&&&XTr%SDGe-C2U0@I$jvpb#HT451M!0MG>$%0bgF47LUmLY43rqdm0fN?E(YU;dl zV{B=@F~uJ=xF#0ivH&o|_=2S!BDl&QLLgV5QQk1d`-_aRf!Rhj87Hlz6u8(JPetR) z3yie#xyBUiGYRD<7B4i?Nj%_}`%4!KO{qG7Fn6Ai(gGn22<2iSEiXf?KuIuAIGgkc zk79xF(FHKm2Qz2qVyhrbW(VeyV*~j8`WYjQi!XLkb_T7DXvC-l2^yBFh%CsTJ1=PD zQO(@KpkzeDYs@7-USK2+zPNyHL;V?iu^jO$yd*L2lElS^>MwXjiQScy=n}dWBQY>A z@rKz0rFXfw%t#!h7#!RA{7m|v+%b!$FTRc#@GZzJD9oNxKJA){YZn_MjG1%%n1b@m zaOuq4KvB?`DIFe?P>ZTWb)UKZBI)%cO1z?CL12+LpGfqU<;#gNr??dBc+2R63i7=3 z{0jr#v?*gUGZnHwm_NIKoLH1wOzxX242egMyahC&;5={t#3kiP~--0Hk7{8Q$CVM<~_e*6fp{Pp(lpEv+GKRGe4ELj~EB?0AR(BL`qldd$3iqc}l z@t4k}yDtiQgNsW77OkDzy=l^Wc#BKDMfn9umRJ(X$=<<3yab$AWpuBd%e~T{>g%0e zCf5%hY>Y|I3yd8%*OxheK~_O_;l!)1E}c>~bz1o~3$Lx1zUaEec0C z^6T2o!Te_N3r%Y`PosQ0$G`Enn^iO0%@%%#`K`}sH?O0t`>b~J?t*r6SAM(MV}84t z!|yJBTlrP;E$#6O+RZOH9=5jK?714g{MPe3%x^HSpB~oSZaxK^#ZQJZC;P{a4dV)a zKjXKE-#z@eg2>hQ8u(L8y6mIVhxHj$aXbj`JRG~$aF&Z8orQuEs8ma1h*TPi))T{e7 z|N2UOzVjY|sXLdZq{;Q=Z-0viax~gw) z9j)jMT2M(B__zBu5&6z9mAC=~) zpx5;?#;By%u4HUc$*`i5@kAvfiAqKhNjYT$`p@?lRn7^_uB6AU^p}(Z7gx@Qh5G^%o-Q=a5*Fe9|5!_DNFxU>s2 ze~oU3feoojHRJ&_$p4PJEx-0IW^+mJI#lgl62!^n_)jI#`q|NCTh4~a5Uk88OFD&$ zJ2AlVTfJ>vTYs%r*n{CCE9Z4Iv4s$s>%v^aN1gc(tz0fVUJVf$^|-3o@u#AB6r53o zh}H@bewOJf?SrJsPB9hQWlNJPmF49?G;|nM*apeT1Es^6kR(au1nus{#&-G>F1pl= zj1es}iM&%|M(QVOB`-x8J3vHZ`yyH4Nkp{41HVJfjAVa#{zGDGdVC9zzw@seeC6 z9Oq(@LE_PVxF&oo*>Qj~lM2(yQAheq!sHSn>H1W2uzl?2@L%}v`WpsbGHAxd169=` znQDWghn#e%q@#QT|Ko5uraHIy5)by^R!5YKY{hg6DEp{TcbQmXW&n|6OB}(k(# zpPam$vVOEH$CW5ymFb2%AX!@Ofd09h1}bv~Nn5X+%}K7DkponLpMpHj^PH>tqJ)%U z-KohVR6t9Y>XsNxeuF=hgCuxkW_d~2^g*vUZ%PmP1XN;f5{99<3h=eg9!*MEM%k@AtO{)#o(@UxztaUBdAjj>G%hz zs{4-`m_OqB>qqztO6K`T%pjl4P)*ccYpY}eqt@CO%F03{Dt92!_&H^)#YygRY!MMy z)(H`CqLIBcUJ3jeaz|4BQ81ui@}Nsbq>6;x6G8s#>4OI7%g6jJi2mRGcb0KH`WPeH zb#1KC&4_WGhpGA*>y6iqvBnxB%7`<5V2n5Z4rRG+#XS*&ley~ZeEB*DH)V<%hE zI^vx}xxBBOZQ91S*u<8!eoM@e20~Ef~1tNcrRXz(Sd}Q!5j|Ij#K#|YpJD+o@zt}1- z1Evn+JzZA0EdI!K8~^8=SC#PA7vTDPS;GTLy(@rCzctNY0;RrR$#vueMag|1Q0(yl zQ0!>)vmv*;m3`QzqWtnlpzwJN=&t_>&ZWMM7JL>c@;nc0Lb$Eg`F5cA_f??O_c~DY z-USqXyQRF$G~WY?TpwD{mgf`B#g6|13f*Tw;cs96f^*UT8=&z29ymRl>p+pm#*2;8 z@^%9Xp9G-PC+om&y?)5K_+LKbDstQOHuTDM{NEoa^$rw>ePvx(;N`%TwT3amx;_dh z@iqo1e0@OSn++5^o39OXD3`eQ1BVfebAY190-)%9BT)Pi1Rnm}G#3Iz?2*TZ$5HGK>wt zEP_Jz%ZMH11zN)Y1)%tE8&K@M11R=*1Gs3pY5ol;cz*|qe*XZ9J_mq48rvbD;2Y7} z?zWuWITt(G=O=?bgdY3%1d9B<mI zJ_ibYyIe<)=ol?W7ofyrJW%B84pe>xiXL8|&|d`HM=}}!bo=QN&Q+eU>bsnC(f10V z@U!I@#ks^qI#B+N2THq|1eE%w07dQ`>)a0%JIw{U`N(6X64#Z2hrYEPuGeuc{~CZ| z$0osp|6M?lYb8+ZxeDm!`#bCUgFxYH%WcDlDHl8c5h(RP4ivlC*PrHG^3k7x65lOA z(bvBIqLj}zj8}j{C*OP*{P%$3&ky7r`+j0w{~9Rm|2v>N-?Vcse7eNydTjpPI2V7N z2^729#qXE-twHJ#Kqe{@zWll+n=qRi(a1srGNQWuG7A4zEN?S zkA2>qbJ6oWpzxFLu}B>B1BzS&fa1@AK+$6eQ26~sAo^Va6n)cxVt1Qw2Ip?QGC3D| z`}*4R`5EUSUUqT=Q0&!_E|+q5z4JJC`}s!B#f}SsZoW1jzWNv8XS>{nRa}?$ zeXH=nF3T+ZUjp6n`Ww#O^4-t5w3F39vBSfHk6#`Iio6?uVz+02Zh7r`ZTKA5rQR2S zr(!>w?lthGKKuL~&ZR#4{6B^7iyYX|ru&Fr3W{&mDZ)$?rV-SIVr^UnNX^P9o-&hqDM%H45m%!c1=3Q9OHVI#AVPeHz*RR|jN zg@GmPc!vvOE-`Y2x}-2q1TG4evJ2iH;Djd?4B5Ku7uf=SN@gQj?!0n2pa|qaUOzi^ zp~&~M&3hrW$c6mU1?mrnvx7zvf2fFU|3N=HbaUazPJLqz!WEX~85L+*Ar`7YoC;C1 z!VfuHqp4Wr&1Ew+f0g`8I4I!45-BO*4_mlI=b^@YDbdn<{bh*bpM%hYyk*7Z>}2(; zr$zi>4C_1}VM_2v5nKubi}G`eu@Q;}D9dGAcwjDUOXgude}TVj0o$FiCW4E=RyDbx z7nKB!0x_b0&fIzaB18pqfiV|La5Y!x`NMVYsu(TG;euVk9YseQv&NYW5cgjKam1pe6p?{5d=#!hVaWtcebK9u)B>?sd70Nzz_2~RhH-zMzhkktjP|mG=a*r9-kzS`c`p#WeIX#lT-yNIUTJ@DsxE2hzEO<6w&fP$zx=#{3S& zR{PoIrE^6do)aTniWi^>?ssW`0JbvHJWw6~V>Ki!Eyl#T0pV^5uow(P49Fudfuf3h zo{CUMDp=L{gq!emE3+kS8ti-pF6J?rB6(B>!_B3Ilo;%MmDD5;sPI?}y&F%But$}g zM~>jB5j4OqK|SE<@b|Cfrn&q7CBLugv@Acoy>pqKxlNZ3UKYMSb0PN(PT_Zzi>9N# z4=y&%5f!|xvxfEZTGMRicbMPhi@2|`gnLhw;ria>d>(QLtOH)gwM&j57l{D_Y{97G_>KmDAK9La-1 z`k#90M;)q1f7Frn{13;+J_5uu3HC!k@<@?>3P`gOeElR7M?3+-&I7q%KhMOfr@g~E z{6v%eNR!aoPc;eAasIut$~2pPaqREVamqWx?O0aCx=zP3`~0h4n&!*Y_ZB!M_nGEr z{2o|inioB6nxlVZnqBS*)Bcs??UW1r`C9I2{+h3p{>e0p9yQG~n@#g2e(&7LSAXx< zaP03W<2UHuFb}(48`||h`+L)T_%8jEYmdWUo2S`%_|?! z<$nXNSdBanQa8V`f6(>Y=4OA*|3iCE2Ap{F2~QpA-6w_-bzaOB8@sV4#=W)8XSbQV zI6io8n|Ty?6xic5?vM3pGgHntj3nU73%DN+Y#PKpKH&Dj+`9w%xbL$97`oIj3NCCj zlcC!IOa&(QZ8N6=_X6huj{+-!35oCl_5!X3W&yVXHv>b!hJMHa%(=MD?0!0O4S*kT zb8?$m0^AF{3z#sl&D;P?0m^F;a)5_{mB0kvy|5WL7`OwN4%`cz4(xRa^l}}z5tuW$ z&D;x29@1uZOF$lAFJJ+1Ft7ob4qOME4$Qf<&8!0M16E15rcLI}vA4~b= z*zpYX2KEOg`~-UfcK{23l|OAWR{^tzwV6AB1;B&Aw!msdw~r+N}q5xbUbQ57?{j6`%{4lyc(ef zxPw<_Y!o;fI|C2q;jbR>4d5r>4&KRC2~6NEbnAeFV`FJyOgiMu07%Zt2T2oFyYtW16SP(J}_k! zaRST%9u#;V@x`W=f@bV0@b_)zEMVmWZRT=d!-L2ra1C(@OnA7>{1UioE%rJW{T@Ls zV9sO27q9`iQsCpnm%u05%zePkK;t~%hBkAkz$a-3z?`SiADHkAaVh1Ss0Wz!XX*hS z1oq^9Ps3*75}5oKE`Y0cVi(}SH}MxRcSDS^qr9(}y%1w0BY0jBWmX9I8ta3e5>XFm4=R{@Uz5Aw|C z;ETZHdCwf+LEv&=gTLL}0L;m4HxB|=@vLWmHeVeDW&u+w+RYkZ)?)C0Irp}k9|I5m z9{Kxo&U2tC0(t(kK;R#cU*JRND{u{V5%_SsnVbaVIno?p$~xo)u3F!2ZU**xoaa@6 zl~2I;V&Y>%yO|11c?!P3RZq8@D}hHhVh>=>ChP&s+T3n>2SE2`yEzq@{1(r-0#^Z7 z%lR(k0B#0;3CwyM`z6C4m=0X^H~0fn-oc;19l-4Zcf%i8u&3SZJCJ&TSpxswZY}~Q z>}@yK08{?aZtj-z_uEZl5d8LGXW-_KcqSIO_n-I?*w9Km0dqd%ncGXS-*@OI@O%6x z@F?{IbK0mMxEFX>&f9tJb};e)Q-LWaaVqC=jLm@w=kuNuDZj`xdk(=4gBaHXdkx__ zaNStOX22bprg;RIJdr(8mr_36G^YbM&*0uUa8*9{ynzRcOf%s!NaHwIBy4Am^C083!i@Hahm(aCaQR}JDq-`D+gzG zAA4rc@t*jKZdJypbBAAiSzlU>rcVck&SHEa1=c^|o5OD(`Gr%qgz2 zgcCD*y6~{X%TjMHQ&vC(dZ6>Ky{S$s$`7NTXn=X>CimQEaLCQ|I%0!og{7NVr zEM*yIcE2rp%o$zMs$=G$vzH>-!&b%he7T-xU61yi&Se?$D8BNH^A2!iAC~-+y3#pb z-kW?Kt%?l7&zMeGy0=a3AJe?Xp3x=!j+hm(;~L`{__BG|=-&zB3>XXka`0DQ(5CkF zIdzY|BWB!+*v7aFMUX4_W5D-9T)wy!%t#iGPp7p zKU;A5CuMn*_3u!&h_ay_%4Dxns;f-eU^8Vhre812R80EL=rX1uraCtIKD%PU+Ya6? z@NN`5JGM36Xu+F+QAC!*;3Z$wW}YT^{FAcSSmdM3Ept!GhPuimMv^H@rR;I+>ezFv z#B^iaRSjLLyT)7*Ep?5z>dFCsXa8_skh)4J+ur|dC~9loO*VtgpMP#C7i z&lF&{71`@EJ&AG0@$rA=#{U@n-QaH%eA_nTlnrY&`+$wEa$b)({C#no+S{!0$Dh$f z8WrRc4@0f%VR^5mZA(045)VP)HBMqsbejck!hkk&sl>1CztJmVvKnJE8sgFk;T>88 z3%?2c9Oh)FIr!u#@<7Il*bF-nL_aJfgvfw$g$>75rh$ z1OFxXw!L*Ms`ff2evVdv%YFIPfPV!1R|VhZpDFgloVN*TM!evy1Fv~Vn|Z6?*?coB zJmv9Bg(vrnyIp#6yrbZioC027`mf!mfR_bc>SZUdHwfOEQ@~pVUiYDGrmQPCcCqyh zX^V?b1h^T70mZvRKLvo$9ph>@&J#>b9+# z_L)(FE@?#NjA7ufW{%y$x%?A3vM8H8-14JUHjA=^5#ciNW011#l)cNb)4rw&`}Fwe z-|A`vZxwh|SG1WQ9T#tk^7mHod?_c!6Pp|aulvY0^O{&r>^Sq;I?^S_oEXT#oD6?e54+cLA{H8H&=9~`r?zS5fs|Zwn@Iq4s&5jJ_ zY#ci>(N{*-izL2y!I5>HMPu8{=iN9N)iF0~6ea6+aQd>w@VJ9Bj=ZrV#^>Z2)ijgcf7gl zgS!u0+3T+5(fsW(nk2#x1wAW1+Ak0>5PZX&8fUVH^rZB&!Z+GnEZo3mzw=CVKYNuavF#Vdyep%M)rn<_! z;L5t)WXisCNwJcQCfWTwTeLE z;~@C^z?Wx696J$D6J;Or9@rhMfcwvzSCovg>53hs7rx6U~^uGsBMa5v7Q?Ym{r z)FnA9VcqM?~9k|hH3`|;HARn zYPX$KJ6J5$`XoMu-(BD>Drhq=b=zFGmkEL><4eJlb=#(*ljD61-kK6O9_>%-t6GsH z5aB25zAdFE#*-Kx3f}Huo4G{v=q!fS5O9LZ8MDAmUdUQ0{jn2ss(tWrCDpNh9w$0Y zijTfUpmYpgP**~?YiXPLrrSr7Lq`ji9_MTZr>TnZhTER@_+Yx`CjR~yyd$iq{-QIy z`vuPzA6+DHv}$)fx-;IZKEA()TG!hg{jsM#Ui*XQBRb@Oms;CqM!Wq;+fh}Kjl||v z;3O|2|2n)RcC0a7gVsUt)_@mVXN`+(o7;F_3tpOPuRFmz2;S*#yHTfd36p1$>q~HU z*Hfn(2iyK!*dUkS$eR3y6&>bNDq7~N`L)QD0#5fkPHz7^@D??-nZrd#yB|~Y1?g(v z(@I)HVu`Q2z+e80HuL9<)t&fq=DaZvskTWYkha+Z?%rRunTZ^0TzoMRJvjC9+sE~T zTvz>@Z8wRdGO0FQ*-Y*yY`>=y9ObA?6%+lzS-rCJdInREkLw$_{vF4T%u2^e=r~n7 zD0+!N>F$(lmC#hNF8_s_Mr13|CJ`GqgOhV_n|ZI;PRZ|zwd(~>&keSNx9c};=GxBi z)Fg7W8Y>ft((|3S9+B>dJO|-1314t zM)xpI4mg7!=)fmBTMVSeY+}PIaMpoyu9G9MA?;PQ#fiEtt_Ek#gKcJ?4mc{BXa^D} z+eMy-=v&-lAo}*PtReWNM%upQ!o%PlT-#<|B5`83MaEc}GN#Yc3v;S#r#B)^7+&sG z9ekwCq#3DyQZ|&bBOS_ol*O)##LJqJI$5gG3SXE`{s zM&{s5w&y8~VXs#iK#k`Fe=GRA|I}t)Cc4`^U1O@4UNOR5t&0i%m*9sUV;tn>Z>{5u zSAEjsssd@Kg5Q_>Z{0R94s+wX<*AR9NABnKe@fpcbmYOtYTl&g3o(aOr$=WeIjjc! z-O+6(!xB2-F5RoU-WJ`^r7>>V+(*0`GMD_>!JE7$X7U6vT(P<+wCwar{pw44v+ zw~Mlkls)a1*JY3BcXbHHoUi1T>7IH|WdipNQ@O8ok@VHJ9i921Odh&gipG4Y4zl87 zHmIR>dc4Rf_az7KI#y1RX&%?6a_z|ReDn*&acq3dC5})k|3TMlcbh5C3p(+t$3njr zEo9InHrx*0)_2>?ejIDrv60me$n_A{cX9oqPOgiOWx@Ajt{26+=(AlhR~(*0NFOx} z{J#6z%pV*_pXhZW-5Aw(S%ubA?FhCUrDG*Zg^#`76h!9qQO2 z=;>9>6W6c@jgRv^EQ^4!qyS>wSk;H0_b^UgS5B_xGKyCr4 z6&$q|A@w$ZUvhrCzW-#~U$u4B24vc!^6>`nHiDPvo>Mq{B~N{(6cfghBR>}Wi`q@5 zLF%8B9ieOkWx`YbN&F?yVAfOis^bsrWsl)vMl0XR{U^a42JY00+s!xKwzYAizYrq{ zs**Pk+-{e&n~*;8#C7!rXAw9Z>yj8t<=QH)O>oD4gfDbH zr_ns6w8V=d<09xb3~x8bi42a64KeA}u`0qc;;+Vp+SaSV-3{&o$Kpm`E0&%RUn

qM%3d;2a43L!pCZ=96!|xQ)a}t5*7yIfK?abV^Tu4)Gv3i~n70I@J zLqM{Z@~i>#;8CDi_Qq+|%Pu-e66r*_RP@c6ciu`k+uS~VkTG_1Xq;W106krv335CR z;QaXCrrYXUmR37?02ahfb9@7IakRCKXKKTKZmNE6^8kRpA`^qnYa%n5CC`zZlf#Pt zw0JOpp>Kw6>YhWj{LX`~L22sXaAAqmtcQ;?6{XxR>M-(#>0d^cuf~>Pi7Zo3|p68O5unQ zBK(@ZH}g(}-_&CUcM2GAU9!H!dU&UTD^GB`lv5v@cuBqsxQ25kgoHb@-1YEuD&Tq- z)!5rX5c_&tgv0!K2_(oI96GeHRt@06?sx~eo*je)mAlDyiu zLk^IZjBXi{#rUBn@puj+OxOL{T!0$goaf7jrVKgoWdm2b-c!qXSS|L_^1ZOcm_&xH ztjCylsCC_+O?gmr0q=~`5-gJ=biwKEp4TDSg|o#`|ML5Y5kvOH4oOk9F5+2O>WHfL z5PBNnzgTt|_cXsdlo!@@$Xym6QqC(^aTyX2CSB0N4sdS8>0t_ z^)2{$r`!EX0rvotg2DynJ*==B50AGpCV{&9c_BXhj;OF;1zmdi|G%~TEeomjh-Os{ z(2O<(iL*>=5ZrNjxePcaLA13*R)hDH)F8ZY>WxitL~#x<9nv;;&@~)@gQXM?Bbc7S zUK{j8DI#nBRNN_h6+i#ndm`t_iJNeGkWe8{y>S;DR1Ta>A_qkL+iM%7(A}jRw29f1 z04U^5^Am$b-{WwKXce_^L56zOQo(iQhqm$=MXn2ws(s#-vXR)m_v8;+z}pIz#EGn? zkz2v$`wI5rt~_UCHLO$=c639wGo&eXQjGpwP)1P=v^Z|t!q#d~v4+Xi(e-DCZA@8Q z%;hUmJx?)P$p$6EU75hx(Ay?SmKqAA2oS?4g|2uxo!KdaBSS8TT=1AikDyy~x||fr zF>()_x_|Xw;?9iOyOsB5Tz6&8 z529Ze!6;--asQ*`bNSWZqO?Jaj~ls57wl1+5+`$}yAoSH9TM5@(=YVRa8l?{IP7{c zXnY%w42W)r@n}$5TBe{6;d>tk9M$jh06Dc_ST3d@YWCn;@zje9L&Om6O#X0?pe(i+ z2unxqB)RTKLB?8L6@uj+2RRX0d9H!sA|5{2wLM{e&I*GUgzIGAvTUf-rj3>AP;1kJ zT-V=@$=QJ~zjEF}EkWWO)0E66wsG`q7{N!Fl5`n9$#W6m7SNQ2+lBAYoa?QhZ#!em zX4ou7+se>Si#N-e%7hFovmns7gQf2sBFS&jfWp>DxOM>*ZkFeApp+Bqt57*o6aZO3 zroXLhS@dD^(oX=jqUjVbtigFS!^nZyBAR9W_HwXz8A`o)O9W14On0Th6bfN0Pc~uV zxFkvT%~SvL=ckP-mz!XbwY4C#)0_IoPbL(o(;YPivRn>J-9(P4j|t1g7rBJ!+7L3> z`f9RN!4;`%)uq(EzT-wAu)vLYuFJZbTP`gd;HW`cQMp!mZ)!<>CQ7XC>Sa;M2{^Q+ z2hqkO)W4fXoZc^^RnWDBAp0c8aY-a=GhthGGhOOceUZVEN*0QNpk2?+(4{`-xvS@J z6`0Sd8yjcZ8QB8;GAi|E$;8Uo*bE0eA!EE47PX08hg#Kx0@D%y>Oy92;1=ij^<^5z z=>{8j!QrUnd^6xotBNk%^fBPl$8?YlW(NQL<7YvVTtpWNg#-v zs-gV)DX2m5{$Er7dHa8Db*O^p|-*Rn)sTyD|ylPUq*Y;AwUx(x!?0b(Wi_5>U}kZ)Yyj5CjXdo?Tg| zYE-Mtu8wfgPfFGu5z5n4u3iV*;#F%kq$d?oO1I%a`rV5rEv6}4f)B(iTvm;mL1|UN zj4b5M+@|qG{OcqaD*QSGmH7G;at-9w`QrNnW+>0cYTBLL!#C)v_~T z(05n6GN1QN5WP61&sL$&CqD!5=4WeknNLiEe0{7A!VqFZ~Q z)FojTEAA4*z?jP2%6mJmyK<;(?$`pS0dwk~tV?g6=1m1%y_~MC)GaeAX#w#&0wJ0F z5xuCLGyNm_Is1e9x%i{z0~&xoqNA&u-?0~m_DUk@N_>$-s@gfUm?Gp+U3q?(F)UBH zGqjJMMEXb4*Ttndhp^u*B!aO#bCL_wZk%TY|vBOPxgaIhO ztnN}$F&+NW@JhSqrkmE@m0%N=yxl8(j|WXPNmWasQ7&avt7)1de|k-rRoy?Yx&? z#_Y{1XBp8VUEb9gv^CR0K4)f^I|~3)U3RADykzm^Ktok6XiQV>ML-faHvN^1aVQ70 z2RFWH5$lX#(WpO}#_!xG1XXdJ+z$5849G_65~`*v^^eY7#Sevyf%~VMq~h}-5jd{yH=kVe=%BsfEhn|sC9OOpx zF#->YK;-iTY%MhWDG;SuYv-P&d$Qp-8@dyM}8KZ973EwvYI!a|hUd&rh8sMBC5!>6g;nGuxd2yn$AjZz$##d>%oz zXXd^no6NWRT--FP-N?$4Y-@xfX*_Y;fvm(?mOQ5)h+Sb9Zp#tVC{*#eM>**%BjZjx zIe^v*emwmo{J4y?xWs1>!IM=Q}YkSaghQvd%F zR$~kP`&aa3^yOCc<(JXXiTeLm^i%Y6^db7!iOG-^>a5L5>Ft_<938;&KD=c$OAclH z7#V-Q-oO(&Q-*}2R^#O1ibs(9mvMiPy9rt6LZ$KqbXuH#K1%xhb&8gIeJzB)?q4Wi zO>bS?w!=eY)1Bl?al-@gpl1t(MH@oX(3HE@LBU8XLRZGgxJ6&}&S0JBzh@e*5wgn) zQH3Q$*Qjh&J63C3E76em4~+z0xdSl$^T-u;3~e|mFjB#z3WgQl zDJE0nWS(9|=CR;C&J<)0X31m^(8mORHS42OK4xax0G6f!RL5x5qnqJq1deo#-8U~A zoC=_UO}O(%Rt}%jH0irgQEH`R{ZBi;KmP*uKl9VuPi+BMX#dlB{A6>zXz$?Ly~Bg=|F#p=-Y5nt z8Atofgs79}tX)?lDJdGd`{wUQ)%}-mU-Z5|*zJ9{zjyGu_ubC^!R~$)D8Dsv61!jm z4g@{u9qxhBl8Hi&stdua*4KXh>}a_T!(2gpPt2pnbaWwqi;<(6O7|ns%X5`u)-xA&gO7C#M-*$ zcFDze^?BL{ZbRV~A~e2-)urWzfE@7@TyzF$beY`903K>1sH+F3;lb~m@rAyl>k550 z$pi5hI__~PzW+2Ma$W+Vl#bsoUiWk^8uH53rM<^)4U=lj53z3t>ed8Lkf!tp;UDBX z#6L`i2dELl;zjyV%7(O%kmQmKfZ?Kq9(@duzM9>|w10ga4;=XD*!}Qbr+a{P*wT@) zq8;P!s-Cxi;=Fl#xZ92Pbdtu);rNQupQ!u%6}mviYRP7CI#WNU@pbZ!HV3$=s4+|~ z6SqHPS+R#yy0P79M4S!MCI6$7BxahE+pq zAk!(ui-plbhL?VHrVc4Ud2UPwlD8C~3o)d+kx9U#DRG5A2(P(!kWHr88Qxd%3(2%8 zFY;^%(Hf{G-oBF_{=bIN9l#fSHdVBbn%RmvtC)kHMj(qY)kYE%c&?j`Ld~|K4i*C{ z0wdWwk8Ty5F8l9dj4?WmTaZf?dE|J8IZ_#TDHc=!Rp6m@MOUR(8vg>@Qi7<__>Wn? zydmbVBFs?T3813dGu+t}yq+-=JH!$`2hiY7i^mtUOKOCha(aXZQFN`nu50_yOg->| z+H7)zb%7+d%p<^ry0dyA2shB1sv&~yF`RjRr^x^i0Zy>K0udVItER9Pcob-Ol4oJW z7&6t>6@{S)z3BF&Kto$tF)%X_fh6a;Em#5tFhH6c$YrNG6ziyt%wc*44>ElMej$B` zwO3rx27G<1M+SZoH!+w12Eq3^4ivYPZuPQ1nZV8fi$UHzSO}f@qE0hfbD&MMQBu^` znxev5B+&#+S?3ejNFmDG)YK5xYm_8cDar}@#^nLU2}B(c@2ZtbRpH_}XtohhQqwUXd1|&zN>oWYdYz$vLv!? z@ql;@CL93VGdl_jKgu%~6oQ@mW zhGWXqr8-yO>|5l8DP?1(>V0Kst|`%4V&Iv=4t)9$D1DiRH5J4_l#4sb!b$gtG}<`; zl4%Z?61^Mtqj)GNl%=eMq+L`Pcn37In>&NSkghF?Qt5N+x<9?L5bvXtl5wS0S0Gi7 z@B&k7VK0_7Ge3zrRAqf7GF*_^&G%FU(D&PSc{HLe*qKV{2z%DLVw(g}+fn z#{}rx;Xv&+10>i4)*IY`wF2oopta7`L<1ZvBL)&P2d*dmDNSF~UNiK-3PZmHB?0nHmR(dv1+`y*J;y0*|5cvuEXy^C5&0z$+!6U&hN&Na01cO5;^X z8#5)P8OLrCp7=)lsWWuW`lr2{;egV&&(QjX1o0GRi=9(QEZ-Xq6)7K6HUzE5wJp+Y zcgN~h4x!%Y`qTrJ&zW|&h@?%mNUB-n6lP@iJUo-0+hl{zwAh;@Lww1jN23k3O{A&L z^K0}<1x*9PtW8gN!cz!1?8eE)Xc3qVK-ci%9zBnF^0HO^tfb}tu`oT*h(gXzR>I$y zT{UR)Dm;MOuvvdFco=OPZ72D-1hvq@t3X3*U z6Gi3X>9|2BYJ*?E;x@1~I)A`!g?J)r6OA(9+!$kKjPhU0ESo{XiC#6VR%=T?v)L64 zr*}4r`{Nq-+>At@buWs?)G9HlE?Lk7tCE^sI-6Ciq|@!A+P?bNs%bL=v|V`}6lfw+ zX&YZ*@tOb&tBb7wXd84kHP}rM!=hV$6tp-MSK;Ng2<2;ihF-ntzlT@kI0C(4OAT`x zHkdq{1J#mY8>CU~Fm=h9QG#z7%%)=aLb+xlD2)JyLRcN0%U?59fr7zjZD~ZjcKQzM zLbS7_>$)~Cx-qHkt+ITp3hK2$K22SSg=ke%$jyq$#ZWR!JLsKK_u_3uJ zr82f;@TBC}Q_ZeQB}aGt`R7qhI6wwZ4l<>6UYVGtJPHVBq`ENXjPki~9aA$Da{_Yb zHh}htl?N*x2KtcqrzFj>mT3PtebhRB)be_9fbF`REI$Cx?95KsUoIFMNCk2h(>tN% z2(t@sOPZo#dqNlf%gkJ(#j|G)B!fWkJtC0NKyzKsbWMU2y$_T5OqCWTvaro_eqcLm zDjVrhK*sCI|qx?y-$peuPGODwQvPgm?=ozy$f z@~7*K!(sOA?NO1hhKcy587&~14NJ8sNfy+pnWCCnHd$tcVblm1{+X*P8j7`}8o}5k zmTL;M(9Gu35Qj16@kpivlRgCcu$K-SH`mS+3J}{4ca^|PJ=6loaSArd2=4(-k^aW? zl42w_q8i+OwfJw+(veq4$^jR*IzifqIkYVislYO@=R*{GmTO>@Xu5A7_>_JOIL%9) z%o5DqNA17i{M=na)`8(YQ`88XA}}Fbg&HgiZ|gMS&7j?VMch7fV; z0C%72gVa)KvBZ)L`u&dw#T=6rDATb4K>nLqVJ~386|_=8|!Qg-EOTe zGclwl!nhhd#SOKwT*Iy^PGY$1o@am>_x~(eQ3r^z{?EK!>Z;C1!Bigw)*=C}?v^+> zw|4_Jf4_-MgU@zK3e%Z;3g7iLofgxDJvqW47(^(ND1-ynJ&PWsx z8F(FA(OSyX#2EA~-VXLQs9;MHdi9#5pp~~fjd|I)5uNGpK0NH$AsjklqbD~&*pXH+% zbeX%3x9}P1Od(jmK?5|cejVr&2L-m*{aXNRI#wM<)z2v z7jnD?%}Y6xGG3P$V8Q%$(Y;#L*ltQ_$y91Jk#MvO$8%Tg20Af=23qdxF6sjm?TRoP zX^)MQd&#-1D}{N1?IxqPh4zz>V$!&6bV5^cbPB4`c;?o_;tiXX$p#V3FWw3i$JXQf zv>g|>9GS^Hlc5&z4jc0(Cfm_=+*jNBee_}Yfsg8;$w26%wQbaC)APa2M)Bekc=7ZM z78SV;I|cX#MhC8QL+}COud)Le?`BX`GCRF#-taxLlOTnU_vu@w?RP}{4C#= zr_ZZFvaaE|d6o_1<<-@s!M(nbc2JSmYEykA@Gq2v&+}voALtH=&oTLWQ|l6|KEgF5 z!cn_JY?i1bd_(F+k7mOWd?Dw^s*mc5F&fiBz5VZY_IKZai6sh4A;JODnr4(HaBzU92-riY%h@c7 z`_s`aM!p|{6Wnk_iiI0AOgsadv!t#Qwk?2*FnO&r>KRlX<%jsq>#(D`~r{O3aB>X|p4aW@(S9Q_F}E{DoW~o?KEmS#ty*b<)`hf+D>vBCWM`qmqXmrple3!Fd8N_6=4 z~@#WY#RAEUC-ikO{Ivjwp+la`XYYPU@ru(A;G}(@B2P{y#0pV=P6&N19AV~*m6CH2Q;azkO{40_rWv9 z*;^@&nz{RcFtFe zr3Nh)9NNU8P?M=u_xcC+qM-V!9~m!(BL0YoMG&U!r!Jh}RU;dOQ!__2s9$~lxm1$T zLn*M>syZ*Mk}NDf^3_etk2Q^Wt!V-WH%+MGCJ(k5V5(iN$`9M@ z29*g_JL@US~>xx#+A@Uw_hZ&-8R7&w+ zyHKr1BVDWs}mWelTG{4JSDnXyDad5N6gV5p9a{;l=Dpp6PXU}&Gtx!Fux z$UaV!`3wxR6mbEeq8bEvL~;|2$OtXX1_#GBNb}aS1MdyTu0;yj02yQW$ut3npEmgb zSPLHuI5^Nudrj)~gOn?om#$$cnWic#;5*z@o6;<$3U)qF%yB<556FGU{3M4P&q|f< zCKdK$7~r0{0oLCcP#T9UTTa`L(`lQ=uruq~CxtZ(_H1hg1N0p{pO4V|91LaVGwG?R?kNp6r!j^%(#EF7 zpLNZb!i5_Hx;+OgT22CAwnh*cqRw>`;VlCJvKEMUUHYxV7^-GSUqTH*qIs-(rwA91 z0+ow-_Fj4~8M6>|tO6!-4l+GEVGmgI?E%S7mgagEOwwgdb%l#f7vg?Ur8b*RS_4CP zXfk&_7mg%n`EwZy`#aYx$6Dcor$7_@*k?9M1p#1|kS)Ka42B*McWo>KDS{r`1%eU2 zLk)7mP?k88IPhZBp3U#dA`eO)p0?3X=*wtT?l4y5!uz9Dqno+`l-e(smaz#9n3=Nd zk7Q^0Q5CtH9}vwPgD;P{%NkF)8BXEwuvV5)29_BMNn4fhBN7;5xWK-;@kn>Z9@F_L zro_`>V|ES?_j|A3zTEqIZ+HK|=Lvv8kIF=Hboka<%nAuzEMnR8M9~yt6t2oB=vu9VJd^YwlCg(6Y1*z)=IgjIgG6nC} zX`&7QwPK@N^#4Sk${TQw1+#MSwW?mDfq6QI7nir~l9!J<ES5SjjZqA6bKVSQLy4DJ|l4e@z36*_#5Dvd!=E+Ucd*T%?lql+mS-;=dTAuBzG#yIgC(?=;u$>f2inS8~h> zmM|r--*Rcj%QRYNBg;urb2?Cl7(rmbX6kk$1%@fP3o_&TDD!#V`F!m8wwclUJiEo{ z&XbCaKo@W28D0v7f}=-)NuND0UhNzlc!!Tw?-<2vDgh|m#RMs>a159EWYEV8hw)W( z#qpUXvKl!LO?-aN$X5JY)UFnu(gx6?b%1y~`Ud5x&Pv^NeO*XV zIp`~Vu>x(70dwiMtb^__pHCeyQ=E!$Fr);@ZgRa1YD;bdPv{%|E7&3;WQo=WRl8lf zu2s!;mImVi-?=bhDe{!riXM8Gim;h)aKj2h51X~RJZJ08w8-q(2TF}2ht)A?g;0)( z9JLbvdaPOW`BS4;lyPdhSyf%hZovR}g_2G8{;|sqzuI}dROqI^lo;FEJ9dk9u>Iy4bN{i(9skLT2E%es=YJr`GM(w~uyO|KEwT4m5E0R=On=_}+WH^F5PhDg{jK z)CtvLCcD%wrL_p|Q?X2i&~oLR**p^wQ6~#-rEv z6vjqBGvyFh!UBknljek5=!GJ4;3dQs@Z~TWSAoUG!O~OUQ&`!G9EF8?rT|v4`g*cZl4xk{(CD3v<#2l2Bg+Pjo3>gh z>s%c4>Mii*U5XB8ddz6R-}OiH*lNtrlCe=|Ssq7s_f^&$uNm_N~}*-LSF;f|HL>LwPCyI~9PP76SIe2S*5z3q)}4 zSO~;c5Qz7Uqvkf8H9~Ox)lgWooWR`oPokZXb+q{DC_0{QyF#fvYe+_<*>bKU`c9RmU1t%6D_%=xmK*1bqPd|iVCAg3I7|H zz%QXIFp%*>#QNLz6Chj&m6sXXGJeXz6*Q4;mQsq~e%Pju?h@O=_g1Ds`;{G*`Z2%-KSBvASdjoC=Ehx&|r~u7{Q( zIux=xe5tTzw?^~paTH2KY_E3OND+f-;%?Y>LlAbIBCchl(fHV(WJ+H9sS-81+x42Y zBdymMa&^pl-8o)o@+ISyK6vo(U%Cqu7#2wN!XBwZy*Q6*#|Mw&+l zns@PD145l(4}Wf-sY~{(2I@9H7>r&FjPf33jdR;1M1R<6GT4o|Vn&rgXV1b3;e2Xn z2gt@cAJ`h_gE6oSA@();AK?YQLFYfU=FCSTh(`u;_ z+y!etIa>WahPc{{R+}aSj3u22XObOYM&2WTxJ}(zlRhmF!KbPt~?1XgD)r@Xx!%-*w{VXM@)&oP zCgRbD43YvG;?sWwgWxf9$RY_x;6Rqu4>CHQtdeJe*}4WqLkIk&l!)gs5!K{8+QAFz z!F)1FrZbejpT*O$#|0aBA|U&8r==<&n}Hg&#Y?$t+%vH%8M_>#08@~vW!_%hWUY1v ziIIk7B^kU7z+YBGW)y~#dnw5`e_Q0@%?o0azi@&xh+as{I0lN>xmwhQq#P3>!$u%o z3`c*FzGFB26xIJ6&VJx8qZz;=3(vgJB%a5JNx;&SX;zvhnMyM!Ws2|_4W>Y87N;_y z*$9W1;B4F_HrhWglM9RG?4a$Vl6yO5<;ZX9mR!3sQ}M52fhDnxto(#`zZ&2D`RZ?O z{ts8e?Hk#^(j8S%h#5*tBYa$zZ;kUh1EiUrRNcTHq>A*-IZ?hKMIxN~qw;Vi5c^6N zbv4l}2wEgJ$;Rq8QBC?wuTwxg&ZqL0Y|alyQ{13#!`y*fA9#2)JkQAyK<~3nA(`t1 z8gyRdHY-alliowC#&hgq`~VDmYydGRygfXMFz^qSjD}d!%!2= z^6OhstSmzSaCz~>3_7xDB)j&3c;&R}w7|(TqpljLVo6WYPE5ZhnE6xc)1(YMmYU1Q zOa=N`IGy{=#yNt_Hd?|rZh0qAOcqXA{Dz!)zR9NNS|f!fZV4Wj*T1LdDA&D+e}&eW z=-gXct0k+tp?|qF(2=$li;JlRsS~uq$A{AVW;x;GlH$jp0MZYI4#u17n$vr@9<*=P zCZJ-*AMO1qC^CAu8v`4Y%GPR?m*~XQ3i+94NM9)1O)lZ%6t3Bw!zo;s@z424QAm-< z!CaFyn`0iB45E>>VJ7-D6p=If51+K_&p*@XloBplV-`X{?wf&2% zcbPDHgJKnNz{vBV2|D|*6Fj*5Tp!Y8nd5t9@_cxaR*cCoh7jwVc)0>N0@*#AS@W9- zNnC(&v|Ve zB65tFDBWqGouG+l;$^rBN*=-vw-U>iHPLg{srb5{%c^qJJjMddBSgxAhWg&f?2~1= zRms9>dVwA+P9R-tT5k;l{t#w2v|rKHY5AOFCaIze3!1VMIhXlUw|W*BPKd=ooLxTw zb1`STGrqkaW9vAYqA=QLd6ybsRoiGAnhhGXFqk`|(+S4k7Yq(MMUF ztt|`M`eG(6+YgOQGDnKIA!wHi+>}iP66U-ld*L4qIZgOJy3+qvXr?RCxBYi;uTbnX zB?S|a^F8Q03vV%_8QsLDHE0G{a}XS&-}OyQd3k1uY97zJ3g#k2#D%BbF34a#@afp} zWm~q4)~rP64E^>E;2HL6+SFN3_T{o$Sk$A&TB%v2)^W^TMMe+vo|%=hnpSy1f0p`Z zd9%_-aD|1u94{*Bq9N}EU2e%W(^{;umgo6DG7e2gQYf(DB8D|2nVGwBrj<1uXP3ga351?|a z!o_3=2318$Euy&FDfzmC6K)HH%ii9Z>Zsv*d}2%XVVS7ya>L`7&$rFjDkZFVyKJ{wntfj z+*RT53&_^hu&Q`0=e$#WEI_y`6I_X6{JYWY&ia$#4Ef$W4Et3MELUErCfjnR(uWUQ zeozQ9HOa&oYszLyix4xQEXXIq`DC}^NJPUVIA<-3kL~>6xRiXZk%^DnppL_r)Ic)% znlTwuLuwXyOgVq{_Pv#J^RD09825M1m0O$=_s?v%e`dS=G}&(dOmHiOB8sx8<0xPU zN}dQ_rMxfzOGp4gn(hh>{Z;sHNxS;@D_MJBqMTc9@&~ zZ4(tL%u!qQNkyMYimQ|cpXwjn{%JRAt3UHbXQ9A+RjmGStbKLHnj9lESJcUeR9$4b zUv#dChIN&4t@2)dyQ`P=0fNub()+l!QVJPALkZzVWnTI5lR_w7T6hF5h1EHd?RFr|n zM~L?4r?;Ha&y$RaII|hDuh2w??9lcEOWhc)j#nnrgXl0No0zmZPRwP_$)kt)e&lBM zErEB(XNvfZFWTh8s4k22TaaAy2x1iJAI?pYSngC^Xk7CMdvK@hmRP0(tM%qX__YQ@P3JJB{hI9jD+qN{@gGn_{~ZK@r)*JjbE)(hdq znLM1qlH*rY5#iYm?A6eXIEcPE_=56Li+2s_h zq5JBt=QI$Y7A|$ki2z4XECs2*7k=J98LHKs7r&9lM^SKDA~%I=NqUc)y|GnvT_lgTT%VK7_dYju4atYmzVfE}j8q%T;c7_m7o zc)${l{$6t!ULmK!WkN3$F}=1Il+INH2b)_hM<`6HxgXTOAbn(ggQ6hmaDcZPs$BN> znx7jtC(9zul^V^Pt2?=ztwK|stDQZ9@Dq5bgywwjAlIQV*M_Q^fJ1|%hq9xd^%cn* zX(jp|Mv2GW4|w)LkQmbJpuNM|4psvm?!z&-DW~jfr-lOuvuN-KY(o`HlhHdW zb%9ZDN4Vjdn05F@cQhWL2nrG&pAm2&-|^|KXb_ow47Uj^a-Y&5gIEl$?l4}goKRJf zW;EJY2kqI_P*6u&7JTikMF^@0Qy}v?1$OB^@b;;RnmM2XLbN)Bta(-1FYpcT{l6oE z1dtQcXl1(eHX&GSr#&pHuZ)?U>NiZ%ryM$B#Z|HjMokZ`h^K#(`qeCLxaX-C*!fHG zw}l+7V^vjfGZ4Zsuzm4Dxl?KkCk#-OmpR81#duH&Ne1%H;UZ;~fP9C7qb#P@-U;r9 zgjzbTjl|ue6T8d;*K!`}kvKNMrn$|qnO;sanb2~~nC;Q8=Hm9Lg?l!?i_e=&k3O&c zB_gX8^&u9+IXy#oW)LPTnuTj|riQBv|5SI-yxm$LP7?#=z33G7w78*5Mzvb{-LA5k zAWZHRHYcQ#EF|W~R)M|Qw6Cb5BAMdyB?8js_PC(8P(bbZ1jG-Gangv`FTFp#K>p0j z8fqi()bvHYKyMT@BnoBPbh1_ZJyER2NXG}aIFTucy+`0qwpdM5Fy$y!gcM9Q$*HwQ zHvW?ltOCXkiZD-oC2Bwj89!RMKX3&o-)NPC8XcXKmJM$yBv&0j9MW)XA|jcvHj{aJ z31tJuP!tynOOdo-OM^CFQ{(xR1Ho5ZkTtTc=SZ483!Z${Q;2@Sy`m;f{!p0MCFlP& zW93&ZqY2Z)m%Cqm|4ncI<=Yp*{<6V%6a+pBIbzsQ937Rm=Evd()~*r0F2E80I!;2& zB218Y;M&$=)5WM@pj3dHS)Cvury~O*lnni>nbY?^y$G?!m&dJq3T*CG{{J4 zr3E=gTn$Hjq|I*Ybw!1L(;0WfkWYR*b0cn`yE|M`U z2r6jno?evwuY2diX*zQc$a{(|T?u5q^pZ_Wbov*=be)5Zj`8XJcIU<4B251Z+a+N8(ouV6Bkr$)ML@^u%l2Gvaz0~o5$b?PYEr+34_OmN*4Q++6MHQ{0 zD#bak)i*b018hm#h*~y+E~wmq1E!*-TnYEDw1VARO)#Uw-GjruH{XbII#FB3 z&O|s+O`Ozh(g9-PL_Db-xuO=o3HI}BG(w*x$s6&bvUxAYbUFXQ*&)oMS{%yaJ`ExZL>483Ca3`YG@iO!jktVlNiG1 zqRHbKx$j)FZ6_x@6J9uJ8(k3NU;EdSQ7o;H0XFATMPL+%tId)7ib$Cv$ut|K_Vq0~ z3^`memG~hxfweDVn_rDg|BzoB-#S4GU{lR*5`{}K>DwXGp7z-`?&9R&-B4R8xrqmm zdwWMT4)8dQInlQ2;09Bn&^>`g-!v5t#!hs^3c|@Y4QxbplQr&1gqV;Fe}UBzm&H7X zrP3nPoR3Z}>UyIJ&%k@>-a~E5$o}js{;z1IyM26GJ378;oiys4xu-7F-F7XuAl}{} zxfugJD*0_6nS#yeAz6(wq|HHN+bR|N-fB9X&Y45i11Bq*Q9QnY@JU(#o3TxxV#xF5 zLn>RySqRra>Hd!EdFRcysOCv!g2M9z0L7Yb3UEZ`Lk_u%Y6}19a^uBKuItc^1DD2_ zO+|_#@IhCH_{{nv9K>qpj#ABjzDAz4+x>1De>Y9Q*| z6E$f1Y^l!^2f4FeEf9($CjyEaiXoD^h$8&iM-zQI9&MhJb6Q`?d-Ij*9OxPOmFOS@ zQ+92th^#Wy-Vk(;=Mm=>$IYb^i;Lz2Wp&&I@*9mnwYP4sux8l@S13IW`j!8 z%lH_&#>%l7(Ge&KqXWf74f@jo@?X)`mr*R$QO^<6#xu*&SD$@WCGlzC-Dh7`>)BX} zulu*B7=Q&1KqeZTu&6>iTUf6^O}4PRi&46K!fO86Fvv{t0nFsRRbZBeu7dX#{%c3XU)iTsUxR2 zm}Q=bAceWcJhCZccb}~$l$|7em|d}Ls~9JGd(+eR>S($8;M%x>%em;!nrU)0$=}*w zLmi;`jk>?Lz26F4Q8&tfP*A@?EP?F;q1|>`J856{Coo_&Ud@}_wf~{k)vmaMFVCK} zcHe$oDplTtu%nHH;Z9xaha+(6;J^m7j9KT_~f`k$ymSUjb0dcV?n1R z&QzE0qv7}jPU;yMR*|8UIjNnkl`)Gd+Dc-!_e;qp0tfJB3f(VZajIZGFZoaWXEK7RG8^B#}m0Z8IF45@w>6fpaq6v$FA�Jhx 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 bWx^cX|ECT6moNXyz`ru^uMGSjW#HccWAOb> diff --git a/vendor/bundle/ruby/3.2.0/cache/rspec-3.13.1.gem b/vendor/bundle/ruby/3.2.0/cache/rspec-3.13.1.gem deleted file mode 100644 index 747921058b6c3bbb40a7e0e36a214c620aac2293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10752 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 M5%?8>zhngd1L$nPqW}N^ diff --git a/vendor/bundle/ruby/3.2.0/cache/rspec-core-3.13.5.gem b/vendor/bundle/ruby/3.2.0/cache/rspec-core-3.13.5.gem deleted file mode 100644 index 64d5cb8f9cd713b73c2ee57b34ec8984201e5368..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167424 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

f&0P9ai=n= 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 diff --git a/vendor/bundle/ruby/3.2.0/cache/psych-5.2.6.gem b/vendor/bundle/ruby/3.2.0/cache/psych-5.2.6.gem deleted file mode 100644 index becbf8075baf886b17eaefd0088edd3d1c7d361d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39424 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

ZnvUbTPqa`I69)IL^$>zg+W>RvI ztA)$AyvcYL(V#JV!-7)GPii>7jeMY^b!HJ$F0vXzt7#J;VAV}Q_1DCF-I~qDg{?4*Lfy zhxRfn#bJy@t3&zKLy#PIJq{XJuP(RdKGWNaY6B$5@~v^&GqeJk zP@~g?CN!FIgsCP>^4kB_P*j3;?jE`&7$~eJA`fCra8zguuA%Vww~#Q**c>dp2l-Kr z#{2eDJu**$I~}aFT5#fP(OI#VD(duulOX+~Co%nO;=xK&3*;wMZo{bko1^3cRqj48 zB!NE3B9ASuCtocBq3h|tVPsG+B#J)Jhc;);$_fh;D;TpjCKg`q6pp~cI9aN%bYbN1 z|8b)!;Wuuz+tc;Ge)?_9zhZ{#PE{ zy_>iHy3PN7bM3$6z4e|>hv^BOOn6?v(HQ8)yjG?~J z_J~AmFF?H;XTsXtnP|>5PW*fhOk?X}5}10Y@oX|e#+ls(7;1_cZaog} zM`s6lPh%T^$yx?8Box~%fLIhE#mR!LAF(Y82BrIY%FzkdAAT`LSCW1X`5HMptYU8( z6C4gHy3bi%Rbgdc_c&{CHz(R*)Q@^?J8)vy@8+_|P=1Ov@q?bIPb)=f;tO3UoYI;6 z7EUD`7$$!C%R>s&BE*xYC#jvBNJ6Jl?x(ij%FgOIhzl=5vm=*4xfq*S#cp%00ik( zM^=a36F;phR?;AL7eq$ql(~JQ9&WL^#aOig`$(K1aE{Fb7A(59Q*K=nE7l%-zGzHW zUhNU*H5BB$?HQ9oW?fj&vZyQYU#nQSv{F(HoMXUR3cZO(d^@D9kh%fhe`HnOaF!r*JnV*eya$XeQqVFa3Z-*|gK|J~((3b@nt@#5yY`hTyiMq4PnnrZ}XGv?SR^G(oI2ia@6K!~4y&XJ^;^=7L59wQ&f(%t? zcg#>22*6N!zoyXDRc*;&W4#j`WQ!PO>2FaGikhftUN`V5;LI95qNcK@Ep1hyp`Rq) z3B|>$*8h?;+Tt$>*;HY)^uP2~r1QV@tKu)>K!I!`Mpg&3#`hVuM2O;(dP~sgEyYq- z<{}K6wl{Ur{!D6E;Uzz*_p;j<@Q&7=pM0e#&_la z50+Q+@t+^w`v2ZY{x3ZTYNe*ZmIvTj6n{wA8z}s39QJbFKyS2549z>fhg}@{!zex{ zU?$B+S=!OQ6{mv{FnLX9a)T=HOp?-l&H<{nxVQ)hj!3IC2(dL)NRp-{GfiI6vkx{9 zIzzE5Bju6^*rkqrEcHffyHXYS)s-gNlpaaGwAoITqQ%*jsSia4k9Mod)umFJPvaRB z=zXwLX*?UCX)#C4Qm+U#`O2y&^O%TCX*(f_`$eS|ksEvFi`pEmFZzT+S|g-BoYHzU zCUt{AQ`k*5g=&VMY^Sn3-c~x6V)UK#D#iWK8B>ZoW2HcG`t+Bx&nkMj8_vv*LwG?} zDQt=Yb3@sp@QKy`=ncf<$N$-V`}|!~bh|G%w>sS}K5cDo!;@GLEBZXEkDT4P&y+-} z4^mOjOZ;HQL&i}bXJ_XB=GX(>6a10PMFF+?(x{HEh|LE-QZSHIX zqp96*t+pPJNpf&Z;%&FH{R&PG5I@ z;>>)vZ0eh>e`$a5{n!89hYxb=|Mvd>X6pacEK$>?HmQuvdO5L-yaAtBhGH(EqH1EP z-;yYtUW$^gcFCf>cFRHv*1t`m>){1c?|&a;?Y|#Byp8{NbM1eWrJiMb?SgO{g z4t42#-IaDnLbS2nX{D8VYqrult;PqhTk@kQW=xrMoKVqsv5Zv2u=(87GYOvk>| zb&&3lO$@|#`^9)T^5Y$eiETV8WV>>wVr0KS^%l8Aw5xNU`Q61@Rg>y~|2-5Jm%y|M zK#P2^U4!@14bR$2)J3;*9}u-NHv)w_aqo+e$=!SQR;(cA^!rn>(;I9le) zsFl58idwlmN>@YQYOdh+WjeKGj^2Xa$S*B^;GPYJXDJOP!;(0xDTy6_8CzB|Lk3BSKCO^{?4yZOfr%( zMnE#VnbpB#5+F0Yn~>Q+&e>VV@iDd%yx10F8xofA-`}q4i>hyuZAd0FhkOZ^T79YR zuCA)CdWwrpj*fFdOLo}d9ez`}%5nZHJ^HpJfJ*)Ek(vML$>S$?=l?fp|49;DAM0S( z>G11u+ZW6)C;Z>xs{?Q$VuFGeD2V{OVH^<9*qhO7Kz}+*(}P!g2RpBJ_YZys4rD)NeE9Jrut4hpzu;6qors}} z2Pg7bn(xrE8+Cw*%0o@mTsLblM`t`BP z+O@of(7tG~!fmazA{H^PiyHVVQkpvYYVO6Vl77}d2R#(H1b-L{w+HOJHkX0kfHAd2 zQX{I&vq~g*9Q!yQUSu6yX;HDBTc{GZDfv}a5ea|>pw&Hc2_vdjnJ+XM751qmp)&TB z_o;xslMBWbVf&7<(*Dtq77(q7YFjnOzcR?bLT3)q*R&W0$IM_M(IQ$2g>A(w!dOHi zagrlZUSYW5n2K7#cU(M^kC=2Z4#InoGiP!cvONGRS>m?WnOO8F74N9!kT;W@kI%Zj z()x&ljAiyL1td~{iE}o{%F))`E9d@Ztgiwrrp=AM zXxQpF8+OrxWKN@@odm8TWDg0N!JyVTVs-j#@L@OW4MyEzs7*CWA3=CL_|O-x14H5n zicfv8xa{kW_&mX9R{yX^HLXX0mkX$jwKA|>1bL)D$LJC|O$r1^wWLTXS#{DITnvWM z!x?}Fc3T_u;O}ilWiWO!Hl%P4X8>H-k#Vs<{{4rIjW`az*9guEF>XA~dh7hXlh)GC zOG%ujGVd{(;^(2vP7X0zpS*9D<`!oaKLK7b z{1m2(pIW2Ar*ZpXe1Cl;a3~$ibDEz|dKd>Ss%@nLfS6;%hHuw_(XDGoePPboAWw%~ zxaQVlx=4RpsranTF?M?=-3f*?iQ5$YFhS;91f%OK{8I>_abwkw&kdz??EU*_?_hUt z*YVZB|JDA_2d`f5?L0l)b9^`QfA{jui=%xAvvPbk_J3ArM%s74SveIOuCY_DYW^w^ zHy^h6lqwTe9jjE~@}9NGie%MG5lWFlOkkWAN4*5Cjao_j>QVjib&SZh63ld}&#(|{ z?I?{YU1`@wYaF=>|KeD_9k%B-WAsx^l0+9s3!13kbBo?Ck zV(1IXr#?wiXOnUQJE*Nixpk~V>TkEuiElKHdxkT{D~#BR5LAPt&@yLc$<U4R z7N=O$EefLy8v{frHF&Q$`hef!=&g$vv*+ZUvuRhs+FUV}`Q99*DATDni!x!}g9*Q)72I+ci$ z@#-2sT~JvnxGX08bg@|Pyu!HeZ?04+F4Kzn)|YZNI%X2LZa5OC^sIlK;{7xce-o&3 z&uQ?P&}&UKTxyQQA4JUwk(5BJqaQMv6|SJQEec$i1voxG89*W~>Y9-! zi3Bef+bNo+=+Y9^RLvp3xAoUuPN+wfG$)}7E^ahg^G&Y~Hi6I|`+=#fHAFX)yqQ1-T zZ$d(DRz2y4z8c^O>Ka!I>^+`L3O==F0Qi^KT~Nwg>p~OYJr1o^FPJ9uSnj|`tx=?* z^$8O1GgAsAfjZzchgAR}#n=l*^jTO(!FfB%yPxRTXFu71(RKda8PG$j0gS6Y6w8BZ&9fs|C!2TSJx*xKz zZLnF|VQG&k>9NC#b1Pj|rXbc)%z@d3SSQ}`em2g*xgDRBbRW79uK2c*Ljo!_g&zMG z86rwzhA0LtVrDpvGlSrDSV*)KM0KvskA>0_J9v6Mo z%L`qc1A!2(o!C4Y1M`ZDq~i^r(c3AXxTGCb(L553aW-o?6uoUoc?#~dob8lZg^0`~ z(!&`tEs7AWQ-_#Vzi0>7+N#vK9cpP`PDyhvKI9e^%tBvqXlrj9ZL4XPv<>0n95UO7 zZAZf`aon~mjzp|_-UCseC)6pOR(!O$g^SwdmSU}xu@-VGsMs-~tyM13Rj6lgEPAXmVIpIIjEi(eiGo{9pn;6Ox3{4kQ5a0hxVg z6Iee*dG#zrG53UDT9e1lP03`@6Wn6v)U#&Xh8}pKgIAeL0lmav(HZdz+tXP~Iw%7p z!Dad0^jThR8)Pn1G=ea)xeocM1GInfvH|mo@&~RMlq2f)lVzBzE5~k zocV^FT?z%*aYX^H4K`2a)5zAwhL?Yt1j)-Qu*U>(gzYA(TEPx+R%v5T90V(_HGhcLURWYQz#qL4T!Jn zL5rxc{Mq7n7v$!`bTPDyCxQ?{1YRkXKG9UdJ#->zN&x|A8e5l>5wF&LC1VlFG6{*} z(u*QcdJZB}^cdN7EmJ@Lpv{)YijM5l*2^dtC!&UXfJ6?+5!vuV)^8ZTuikOm_GIpc z=^3Op#1*F=y|onv-+dRH!d*^quim!F}Zp$?R1;bp~FrhS2>gd)5Yb;>@2jf zZJBS2FR2eNdlFl{Uzu;HTG8u@O)s(4Bxc$cV5U6@H2`DMF~jMZ@6i&ftU?yQ!4%+R z^9hslF*Vcqc-F-%O(!xxHDfdE$K)d%oP$~LF&~FBqn_i8_5<+Ed7{7fvIa~B2+_Eg zA}}Srth`mqZ`s_&1i6`{^)ERH(&>r6=&j7Uo2z#`~1eY?okdk? zXP6I9@@|%~a)t4#4stvkMTioQRa!_a76LFl&8AEO-Wvl|?t(x6^6{VIkFSRRv-#+W z9sjv`m;dF@g#TklJi3F+I1HQi(62wQ2HV}UfrdOzqAB&Tb=3k`|1q!;WMXk{LKi=q ziWfcwxht)4X2=*lznoyaRk*09DcJcsVNC2PtiRmjd6IRGFFON(CmPHyokCd=&)V(H z3Mh6VY={9+Te?0d^gj^aCcX0s)6!1<5&+h)=uTPJ5egXN_ zO;%5b<%e_HiOl7I7)P>NH}b&UdGodTzd~F6I`}U?JpN(B;{SK}-`{ThKTQ-D-Wo)} zV)6SDJceJ}s_=ct6@eLO*#ne(g+((6p63&pBskUbu>^q_N}-n6naI_ZCoR9V#ncBa z)w$3RNTCE%gsnn})h$uImLerc68RN5PSx-#!3B8v*Qnf0x^_NvPhu`SY#4Ev8pTd9 z;qF*+tkLoahcHk1UVc87DVJ$Lmz7(|N(ihejC#xBlz@XxCYa*Gz|7e!yyo2?%xuR~0Ew&YT%2ukvZrS3p$I zRDaC_zEmfuOEmmM%exH(`ZJ&~5pW6DS7pc%NHE?v-O|1-iS2qvsML^6YIqdIh}B-# z$g)l7qC-{4Nx~QA0JaMd&Ejo~LTl==B1LI1uacizTEM1Jw$TXIHVsSQ5iBA0nDK0g z{1~t?Gt$6EYxof(I9#i+w@gFb=*4o-700`|e;EnHQ-0;|n&;yj@Yz z>J_P$E$b1J5WsFZ&c|!x>;pf)*tTU|huy3Cp48$>10T*MoU?=XmkPu~QQdgeCh#C& zD4UAOZ4uukQ(zaxX;&sznh&Cr)F08Go1ZOI< znVHQjP2U_n|IymB8VqWY?JSvf&)6L3j#8XCG`Mh8sWNefVK-Qyq&gZ=TxQ-@W(5Xc zAexkfRwsqs2meJrUJ@IZ&z!KLR(ZS>MgfsehNKDA9&Xk*+sIPXPC3D&u5Cn#74OBz zZQaG?DR`FBYfIHc)tB7hKj)`%_atFVBD_AqebRv1kaY%SjF-+E9XppZCh?}*{yOIIPKN*yd;LdE!8K3lRi8t$!* zI{kj3DAx|a3WMcbx=*uC9oLb|qbE?x#SIsV&3z@{kj2LwQUQ356Qg0+hx^m1@{Z4A zX5XsZp|6;>DwZg#i9OnsL+{NF^&q%$u$fuhv0**P`&i=HK5I|Y3=~=dJUdXZ*>@Qb z2`^;ixKu4ECs_Y@eqWwwm>kya^=ODDm%5orUrGi&c}p3Y1^Z<_%mbTq+|{v(FXR;kg|ytg z#7ULOWw|rZpn83Tz9761A_#m=?wk^90*(~IYe%~yc`0RTSp)5*!uQVq%Fs)eSD5m$ zkuemZXC|S9Xw|YDuDNa8K1&{NP42haH*AF8Xh}(0yVXH?is<7u?rPAuRVo~rYH4k}rR;rP?JtD%%){Xp-57EDTcJb4?nCY7*f;3BU4nK!Q za%!3lrZOvqh+{SQ@h5%xu90W-|F~Ve{Ygtx*Q=0qeIU$T zt2xocz=^+fp)kNiSJ{64oJ~;APw?oaY>80)U6iXB1eU0I$S^|TP*(7HpG2J#F_dE= zlG`sat_rldoE2LuTimyeZ^~0juXwjYrZd-bUI%~^)`TT|yJ}lH%WY{0_JoTH`bx_7 zTX^>uig7j^$_`8|d2PyAsI~Gf$JdRT$C@|!-VntmK3U#e(vk)hjJ|Yxr(KO}ISx-MVJ%g{JZ( z_;mUrW(Ga60Y_ZZ6L~NZ@rN~oT}h4`7<8Q+-@q*U=sG#IG_w3^e%HQ=5;`*j^v z@pPOI%7Ep+41qi9f-hXZYk5t~L@SyOLC0y(0w!JilKjJqi6WDOIq#yaaBD`q+aV8` zPv{Z1(d1^P*$E$OTWxq1_>|M_nxqsw4Z96)@s>Lhk=^B(%h@?Wu9?u<~;O*A(G}meQ*PHGhC~+?E)NrINN4=YQ zhG^G0)Yj2HFf$ucCG_L68%Gi2!N)svA{XDkLS;Cr!PQd&-oc?G?RnKk@9m z$8_aTbZNMIF(Q;bl%jJ2OTt4IF0`x_DE9u4-bjfhkE?RH%t3yvXDy|#2;uNSW%q|{ zy0+?u>&$;jXYC9=tlKRf4haZVYqZ4k<(j$A>%4K$C?I<6*PiSx>)dx-y>{e4CWcmy zINNOnj9nXv+Z^l}qm}R@y|t)_pEcvP$rz}7haLdk_NdHM?n3*F9z6vk3%-KSbf0u7 z>emLrg93|)y@%}io>4(anio+w8EtbpThmq^;}m+8qEkUR?^)_690m}G3Vja`I(g+B zYK{RM1`f)se|hMUnL+><*k5i4aqv#Vs;7L!WBl6GCG5O~Rb-c1e7GUf_1HJR9*Jgb z4}>AlWx`fdURxuD{rUOmZj>lfs#dK&JViyJNZF)wbyJBBFFz@kj$GupRJ775bp#4MJ2)8JDshRc)K{ zFojn#OZv3-osJCgbzuX*mv%!4u5b^vAZ<@Z84e=*{H(3ld>xvc4vkpCi{k&mk-{}XxCV> zMw1}M1-k%{Fr$Ci`=oCA@jgF@>g~DCP@#zX4gv`{xO)iLe{Wv}p+142{^nZ3wHwW4dO7{Ep zc9#PpzOqo-nJQ@GcI;#%yYsNZv*&Bzb~%)o$)wP5i}^k9Ui+Px)vmQslAPc}JXOe2 z8T+p$TQR$d>1OR=PY+9$Exj&X`Uq>UgikuTqMzF|%xn!UEN@`T*bjLc%JIr1QA<$t zeavwR7TRYmt1}3JJ5jkJB{>p^9H-8b!3@*dG4E(uesxK)|$Q9YzF zX8pLn&LBM6GT-e%Z>H|{!i6xFl}BgnRW=moL)>rVlu!E#XtD_THxjLrs_5}WY8Q&s zmgpfN*Ldm;c({ZhCn)A$?-m;FWsr~Pmnm*O)vs<^q=h^_3KKbJ9rtzCTS<$}G#a%E zb@Ab3sVlh70kNKVRyVt7UOzlMY}aZs5jB?EB>$Z;$_x`!#!eAo_*!t3noyU(KwgF? zC~8B#TswSti3C*Jd^Y;Jf%X;n1Y0VMtg^DyTwS>GHS5?`935PsK&Dj^+cQB4bs3H- zJj9(naA~|s81M`jxd*E}ENXFs0vZ*Tm|WbTWeOmG*vSW7PM&0zyj;;$cw72bQbL7= zfU6E|YjR9D9ITQs;O0fr^D9k=YI8{2@dMFzx_Yr-okHaL2)1|a&6c{$)gQAbghm_r z@8b~Y?b-Zo@;5T}NLM$wE;IAI5d^Xi=4-T)Hw##k3z@xoqXhFNe%Fv=yHIgp|4T7A zGq8}jHz5P)mFA@i~YmhT^D~TIsoyxWvH(65JR>~cI=A46{^bDYS8!r9BY=uvdn~%wjNu!Pwbqr zL8UISBp$U=0Z7t?&#AFoN!p#6vYe zTHBXDTiYj0P`<^+X0TQt^YLr4qJq+pidCjYB^@OrH+i#18( lA3_S>0%IOz5)q3x;yb=l{ZH@UZ*spK`0c=N2mU(;{sEQcb87$q diff --git a/vendor/bundle/ruby/3.2.0/cache/puma-6.6.1.gem b/vendor/bundle/ruby/3.2.0/cache/puma-6.6.1.gem deleted file mode 100644 index 4bf4af8fa3693609576a3bfa88d34f54eafcecfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239104 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 !lwP6MaA!H zG`CbPqf3N$sA!{KCzpo1q(1K3sNdV|dOezgadAS^yJ_Fm z#TdkFG!mH_Fe{(?zBI@Avq(`|11;eV-0sX_2e#M#1m1o zsr6xkG#pvSysM4&SFpT`1o*;`2{AGf^#lE)rV)So>EcJv5_f zIA$GCkmM)y&=>x2kT5{ZfM-BB@527Ut%FfY{vLR{7^Ku-?U1 zT29VNy^ZdodQS|Qt{XB9P429bZ)}i_Fp#%yk6L)RxVTtZBV^6Y3d%=EN2?55Jb+Fn z0Qwa6_et^K$O!m+TuI#hcfIHFN>ETxdOB(M_RdbP5}f$Liz}rxI<0DmK7E=Fe^cX| z`~I(AW(=S>S|~=m3~=l4XU|!ZzQVuRIXUZX;lwTdPq*dSJ zR(Kis+sw_)%?tsnOlR&t>wOWCku{rEK|iU)J+#_wr$6~z{8k222mdpk*R|#tK7d6U zY!zcjWf;R@Dk>_k>a9-?>PB^X5;uj{ufS6O?gh_&kkdU>sxLBKcagP?{(UIa;B-K6;3QxYO$VTiDo1PrjRUU^6 z|E~L43_Pxw|MfGvJTg8$SKPCb2_zr}*G#}%Q%iKIg28RumybI)_6(nBFX%!hmvSB+ z!BctMbFTk-6+nXUA29s~pZ}(T$v~37%;~>g4>+@jFXREU_di?y@Nv}f6qz#k~^R>F7K{ZA9R|5WHTBC`=P?#9`*18voC&M9YSOjxTzPJA?%PjY)K*N zvbh{T2N?Q8TH2NBR+zx1#K#L{Up*xDdt?sW*{n^L?+E=>gmvcqgjvHg6?#=IJnd5c zH)^?3cWDDSK-T(=CPq>z(y!@-m}Jbv3?z5Uy07qW6dvRe6@}LHQdbORXpY1J-CiJn z^fi6g3V0V5zy|r|=jVm94mAUACYRG_&i5uu0k>&?{u0QfTA;B#5>(*QJJZj=x0i>n z-IM3$=Ay95%gU?)))N{Unu3LisXv!lTW(xq_DBf+to0}ihXU{g#&)~e%G0W`09bDT z3~)I|(f7n$uTC`ISzyIKr5TBGoy2qd25XvVT44mOPeXh+0A=ZSHVo(mjU0&#Uphe3 z>xS%fU-LBFU#1)ggO_GCsk-b&U6?-OJ}p~_d*;T z(fl&{U12yPPAd}DW3+`o>gxsXU*Fu{9=qnokO_qKz>DhuF>U9k=o=6aAbi|%+!hjo zvY!rxLZ8KYqWfyot^E z^7q`wXNgqaBBeJgzQ-@7`;Lb)1WFc<0RT3cB2M8 zS?`KKqx)jqo`W90$ugR&JsLoWF;3bTG?74aI{(?Au226L?`Iprq{Rk@IuK_*BO*

x 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 diff --git a/vendor/bundle/ruby/3.2.0/cache/rack-3.2.0.gem b/vendor/bundle/ruby/3.2.0/cache/rack-3.2.0.gem deleted file mode 100644 index 2f3af2a12a8825ca3df62c6f8ad6bc81ff0dc130..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117248 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

CNAVc07|a|V1>?& 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 diff --git a/vendor/bundle/ruby/3.2.0/cache/rack-test-2.2.0.gem b/vendor/bundle/ruby/3.2.0/cache/rack-test-2.2.0.gem deleted file mode 100644 index b0b9c9d82020472bf6f93c89eeeb487e9dc26262..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20992 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 K1OL4q`2PUXs%Xmq diff --git a/vendor/bundle/ruby/3.2.0/cache/rdoc-6.14.2.gem b/vendor/bundle/ruby/3.2.0/cache/rdoc-6.14.2.gem deleted file mode 100644 index 7d4e3990016eabce9c1603fed2f80dd1cec9627d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 671744 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μ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%0A>C6<(r)X&3sT!N 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 q6{oUE6Od#odX4d8u3LAy$^ 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

+d4 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 1.9`. + + Resolves [#63][issue-63]. + +## 1.4.2 / 2020-06-23 + +- Camille Drapier fixed a small issue with RuboCop configuration. [#59][pull-59] + +- Applied another fix (and unit test) to fix an issue for the Chef team. + [#60][issue-60], [#61][pull-61] + +## 1.4.1 / 2020-06-23 + +- Fix an issue where diff sizes could be negative, and they should be. + [#57][issue-57], [#58][pull-58] + +## 1.4 / 2020-06-23 + +- Ruby versions lower than 2.4 are soft-deprecated and will not be run as part + of the CI process any longer. + +- Akinora MUSHA (knu) added the ability for `Diff::LCS::Change` objects to be + implicitly treated arrays. Originally provided as pull request [#47][pull-47], + but it introduced a number of test failures as documented in [#48][issue-48], + and remediation of `Diff::LCS` itself was introduced in [#49][pull-49]. + +- Resolved [#5][issue-05] with some tests comparing output from `system` calls + to `bin/ldiff` with some pre-generated output. Resolved [#6][issue-06] with + these tests. + +- Resolved a previously undetected `bin/ldiff` issue with `--context` output not + matching `diff --context` output. + +- Resolved an issue with later versions of Ruby not working with an `OptParse` + specification of `Numeric`; this has been changed to `Integer`. + +- Brandon Fish added TruffleRuby in [#52][pull-52]. + +- Fixed two missing classes as reported in [#53][issue-53]. + +## 1.3 / 2017-01-18 + +- Bugs fixed: + + - Fixed an error for `bin/ldiff --version`. Fixes issue [#21][issue-21]. + + - Force `Diff::LCS::Change` and `Diff::LCS::ContextChange` to only perform + equality comparisons against themselves. Provided by Kevin Mook in pull + request [#29][pull-29]. + + - Fix tab expansion in `htmldiff`, provided by Mark Friedgan in pull request + [#25][pull-25]. + + - Silence Ruby 2.4 `Fixnum` deprecation warnings. Fixes issue [#38][issue-38] + and pull request [#36][pull-36]. + + - Ensure that test dependencies are loaded properly. Fixes issue + [#33][issue-33] and pull request [#34][pull-34]. + + - Fix issue [#1][issue-01] with incorrect intuition of patch direction. + Tentative fix, but the previous failure cases pass now. + +- Tooling changes: + + - Added SimpleCov and Coveralls support. + + - Change the homepage (temporarily) to the GitHub repo. + + - Updated testing and gem infrastructure. + + - Modernized the specs. + +- Cleaned up documentation. + +- Added a Code of Conduct. + +## 1.2.5 / 2013-11-08 + +- Bugs fixed: + + - Comparing arrays flattened them too far, especially with `Diff::LCS.sdiff`. + Fixed by Josh Bronson in pull request [#23][pull-23]. + +## 1.2.4 / 2013-04-20 + +- Bugs fixed: + + - A bug was introduced after 1.1.3 when pruning common sequences at the start + of comparison. Paul Kunysch (@pck) fixed this in pull request + [#18][pull-18]. Thanks! + + - The Rubinius (1.9 mode) bug in [rubinius/rubinius#2268][rubinius#2268] has + been fixed by the Rubinius team two days after it was filed. Thanks for + fixing this so quickly! + +- Switching to Raggi's hoe-gemspec2 for gemspec generation. + +## 1.2.3 / 2013-04-11 + +- Bugs Fixed: + + - The new encoding detection for diff output generation (added in 1.2.2) + introduced a bug if the left side of the comparison was the empty set. + Originally found in [rspec/rspec-expectations#238][rspec-expectations#238] + and [rspec/rspec-expectations#239][rspec-expectations#239]. Jon Rowe + developed a reasonable heuristic (left side, right side, empty string + literal) to avoid this bug. + + - There is a known issue with Rubinius in 1.9 mode reported in + [rubinius/rubinius#2268][rubinius#2268] and demonstrated in the Travis CI + builds. For all other tested platforms, diff-lcs is considered stable. As + soon as a suitably small test-case can be created for the Rubinius team to + examine, this will be added to the Rubinius issue around this. + +## 1.2.2 / 2013-03-30 + +- Bugs Fixed: + + - `Diff::LCS::Hunk` could not properly generate a difference for comparison + sets that are not US-ASCII-compatible because of the use of literal regular + expressions and strings. Jon Rowe found this in + [rspec/rspec-expectations#219][rspec-expectations#219] and provided a first + pass implementation in pull request [#15][pull-15]. I've reworked it because + of test failures in Rubinius when running in Ruby 1.9 mode. This coerces the + added values to the encoding of the old dataset (as determined by the first + piece of the old dataset). + + - Adding Travis CI testing for Ruby 2.0. + +## 1.2.1 / 2013-02-09 + +- Bugs Fixed: + + - As seen in [rspec/rspec-expectations#200][rspec-expectations#200], the + release of `Diff::LCS` 1.2 introduced an unnecessary public API change to + `Diff::LCS::Hunk` (see the change at + [rspec/rspec-expectations@3d6fc82c][rspec-expectations@3d6fc82c] for + details). The new method name (and behaviour) is more correct, but I should + not have renamed the function or should have at least provided an alias. + This release restores `Diff::LCS::Hunk#unshift` as an alias to #merge. Note + that the old `#unshift` behaviour was incorrect and will not be restored. + +## 1.2.0 / 2013-01-21 + +- Minor Enhancements: + + - Added special case handling for `Diff::LCS.patch` so that it handles patches + that are empty or contain no changes. + + - Added two new methods (`#patch_me` and `#unpatch_me`) to the include-able + module. + +- Bugs Fixed: + + - Fixed issue [#1][issue-01] patch direction detection. + + - Resolved issue [#2][issue-02] by handling `string[string.size, 1]` properly + (it returns `""` not `nil`). + + - Michael Granger (ged) fixed an implementation error in `Diff::LCS::Change` + and added specs in pull request [#8][pull-08]. Thanks! + + - Made the code auto-testable. + + - Vít Ondruch (voxik) provided the latest version of the GPL2 license file in + pull request [#10][pull-10]. Thanks! + + - Fixed a documentation issue with the include-able versions of `#patch!` and + `#unpatch!` where they implied that they would replace the original value. + Given that `Diff::LCS.patch` always returns a copy, the documentation was + incorrect and has been corrected. To provide the behaviour that was + originally documented, two new methods were added to provide this behaviour. + Found by scooter-dangle in issue [#12][issue-12]. Thanks! + +- Code Style Changes: + + - Removed trailing spaces. + + - Calling class methods using `.` instead of `::`. + + - Vít Ondruch (voxik) removed unnecessary shebangs in pull request + [#9][pull-09]. Thanks! + + - Kenichi Kamiya (kachick) removed some warnings of an unused variable in + lucky pull request [#13][pull-13]. Thanks! + + - Embarked on a major refactoring to make the files a little more manageable + and understand the code on a deeper level. + + - Adding CI via Travis CI. + +## 1.1.3 / 2011-08-27 + +- Converted to 'hoe' for release. + +- Converted tests to RSpec 2. + +- Extracted the body of `htmldiff` into a class available from + `diff/lcs/htmldiff`. + +- Migrated development and issue tracking to GitHub. + +- Bugs fixed: + + - Eliminated the explicit use of RubyGems in both `bin/htmldiff` and + `bin/ldiff`. Resolves issue [#4][issue-04]. + + - Eliminated Ruby warnings. Resolves issue [#3][issue-03]. + +## 1.1.2 / 2004-10-20 + +- Fixed a problem reported by Mauricio Fernandez in `htmldiff`. + +## 1.1.1 / 2004-09-25 + +- Fixed bug #891 (Set returned from patch command does not contain last equal + part). + +- Fixed a problem with callback initialisation code (it assumed that all + callbacks passed as classes can be initialised; now, it rescues NoMethodError + in the event of private :new being called). + +- Modified the non-initialisable callbacks to have a private `#new` method. + +- Moved `ldiff` core code to `Diff::LCS::Ldiff` (`diff/lcs/ldiff.rb`). + +## 1.1.0 + +- Eliminated the need for `Diff::LCS::Event` and removed it. + +- Added a contextual diff callback, `Diff::LCS::ContextDiffCallback`. + +- Implemented (un-)patching for standard diff callback output formats with both + `#diff` and `#sdiff`. + +- Extensive documentation changes. + +## 1.0.4 + +- Fixed a problem with `bin/ldiff` output, especially for unified format. + Newlines that should have been present weren't. + +- Changed the `.tar.gz` installer to generate Windows batch files if ones do not + exist already. Removed the existing batch files as they didn't work. + +## 1.0.3 + +- Fixed a problem with `#traverse_sequences` where the first difference from the + left sequence might not be appropriately captured. + +## 1.0.2 + +- Fixed an issue with `ldiff` not working because actions were changed from + symbols to strings. + +## 1.0.1 + +- Minor modifications to the `gemspec`, the `README`. + +- Renamed the diff program to `ldiff` (as well as the companion batch file) so + as to not collide with the standard diff program. + +- Fixed issues with RubyGems. Requires RubyGems > 0.6.1 or >= 0.6.1 with the + latest CVS version. + +## 1.0 + +- Initial release based mostly on Perl's Algorithm::Diff. + +[age]: https://github.com/FiloSottile/age +[hoe-halostatue]: https://github.com/halostatue/hoe-halostatue +[hoe-markdown]: https://github.com/flavorjones/hoe-markdown +[issue-01]: https://github.com/halostatue/diff-lcs/issues/1 +[issue-02]: https://github.com/halostatue/diff-lcs/issues/2 +[issue-03]: https://github.com/halostatue/diff-lcs/issues/3 +[issue-04]: https://github.com/halostatue/diff-lcs/issues/4 +[issue-05]: https://github.com/halostatue/diff-lcs/issues/5 +[issue-06]: https://github.com/halostatue/diff-lcs/issues/6 +[issue-12]: https://github.com/halostatue/diff-lcs/issues/12 +[issue-21]: https://github.com/halostatue/diff-lcs/issues/21 +[issue-33]: https://github.com/halostatue/diff-lcs/issues/33 +[issue-35]: https://github.com/halostatue/diff-lcs/issues/35 +[issue-38]: https://github.com/halostatue/diff-lcs/issues/38 +[issue-43]: https://github.com/halostatue/diff-lcs/issues/43 +[issue-44]: https://github.com/halostatue/diff-lcs/issues/44 +[issue-46]: https://github.com/halostatue/diff-lcs/issues/46 +[issue-48]: https://github.com/halostatue/diff-lcs/issues/48 +[issue-53]: https://github.com/halostatue/diff-lcs/issues/53 +[issue-57]: https://github.com/halostatue/diff-lcs/issues/57 +[issue-60]: https://github.com/halostatue/diff-lcs/issues/60 +[issue-63]: https://github.com/halostatue/diff-lcs/issues/63 +[issue-65]: https://github.com/halostatue/diff-lcs/issues/65 +[issue-70]: https://github.com/halostatue/diff-lcs/issues/70 +[issue-91]: https://github.com/halostatue/diff-lcs/issues/91 +[issue-95]: https://github.com/halostatue/diff-lcs/issues/95 +[issue-100]: https://github.com/halostatue/diff-lcs/issues/100 +[issue-102]: https://github.com/halostatue/diff-lcs/issues/102 +[issue-106]: https://github.com/halostatue/diff-lcs/issues/106 +[issue-107]: https://github.com/halostatue/diff-lcs/issues/107 +[pull-08]: https://github.com/halostatue/diff-lcs/pull/8 +[pull-09]: https://github.com/halostatue/diff-lcs/pull/9 +[pull-10]: https://github.com/halostatue/diff-lcs/pull/10 +[pull-13]: https://github.com/halostatue/diff-lcs/pull/13 +[pull-15]: https://github.com/halostatue/diff-lcs/pull/15 +[pull-18]: https://github.com/halostatue/diff-lcs/pull/18 +[pull-23]: https://github.com/halostatue/diff-lcs/pull/23 +[pull-25]: https://github.com/halostatue/diff-lcs/pull/25 +[pull-29]: https://github.com/halostatue/diff-lcs/pull/29 +[pull-34]: https://github.com/halostatue/diff-lcs/pull/34 +[pull-36]: https://github.com/halostatue/diff-lcs/pull/36 +[pull-47]: https://github.com/halostatue/diff-lcs/pull/47 +[pull-49]: https://github.com/halostatue/diff-lcs/pull/49 +[pull-52]: https://github.com/halostatue/diff-lcs/pull/52 +[pull-58]: https://github.com/halostatue/diff-lcs/pull/58 +[pull-59]: https://github.com/halostatue/diff-lcs/pull/59 +[pull-61]: https://github.com/halostatue/diff-lcs/pull/61 +[pull-69]: https://github.com/halostatue/diff-lcs/pull/69 +[pull-71]: https://github.com/halostatue/diff-lcs/pull/71 +[pull-72]: https://github.com/halostatue/diff-lcs/pull/72 +[pull-73]: https://github.com/halostatue/diff-lcs/pull/73 +[pull-75]: https://github.com/halostatue/diff-lcs/pull/75 +[pull-79]: https://github.com/halostatue/diff-lcs/pull/79 +[pull-80]: https://github.com/halostatue/diff-lcs/pull/80 +[pull-82]: https://github.com/halostatue/diff-lcs/pull/82 +[pull-84]: https://github.com/halostatue/diff-lcs/pull/84 +[pull-86]: https://github.com/halostatue/diff-lcs/pull/86 +[pull-89]: https://github.com/halostatue/diff-lcs/pull/89 +[pull-90]: https://github.com/halostatue/diff-lcs/pull/90 +[pull-92]: https://github.com/halostatue/diff-lcs/pull/92 +[pull-93]: https://github.com/halostatue/diff-lcs/pull/93 +[pull-101]: https://github.com/halostatue/diff-lcs/pull/101 +[pull-103]: https://github.com/halostatue/diff-lcs/pull/103 +[pull-104]: https://github.com/halostatue/diff-lcs/pull/104 +[pull-105]: https://github.com/halostatue/diff-lcs/pull/105 +[pull-129]: https://github.com/halostatue/diff-lcs/pull/129 +[pull-147]: https://github.com/halostatue/diff-lcs/pull/147 +[pull-148]: https://github.com/halostatue/diff-lcs/pull/148 +[rspec-expectations#200]: https://github.com/rspec/rspec-expectations/pull/200 +[rspec-expectations#219]: https://github.com/rspec/rspec-expectations/issues/219 +[rspec-expectations#238]: https://github.com/rspec/rspec-expectations/issues/238 +[rspec-expectations#239]: https://github.com/rspec/rspec-expectations/issues/239 +[rspec-expectations@3d6fc82c]: https://github.com/rspec/rspec-expectations/commit/3d6fc82c +[rubinius#2268]: https://github.com/rubinius/rubinius/issues/2268 +[standard ruby]: https://github.com/standardrb/standard +[tidelift]: https://tidelift.com/security +[tp]: https://guides.rubygems.org/trusted-publishing/ diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CODE_OF_CONDUCT.md b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..184b5fb --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or advances of + any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, + without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official email address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at [INSERT CONTACT +METHOD]. All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +. Translations are available at +. + +[homepage]: https://www.contributor-covenant.org +[Mozilla CoC]: https://github.com/mozilla/diversity diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTING.md b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTING.md new file mode 100644 index 0000000..4bcde4b --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTING.md @@ -0,0 +1,71 @@ +# Contributing + +Contribution to diff-lcs is encouraged in any form: a bug report, a feature +request, or code contributions. There are a few DOs and DON'Ts for +contributions. + +- DO: + + - Keep the coding style that already exists for any updated Ruby code (support + or otherwise). I use [Standard Ruby][standardrb] for linting and formatting. + + - Use thoughtfully-named topic branches for contributions. Rebase your commits + into logical chunks as necessary. + + - Use [quality commit messages][qcm]. + + - Add your name or GitHub handle to `CONTRIBUTORS.md` and a record in the + `CHANGELOG.md` as a separate commit from your main change. (Follow the style + in the `CHANGELOG.md` and provide a link to your PR.) + + - Add or update tests as appropriate for your change. The test suite is + written in [RSpec][rspec]. + + - Add or update documentation as appropriate for your change. The + documentation is RDoc; diff-lcs does not use extensions that may be present + in alternative documentation generators. + +- DO NOT: + + - Modify `VERSION` in `lib/diff/lcs/version.rb`. When your patch is accepted + and a release is made, the version will be updated at that point. + + - Modify `diff-lcs.gemspec`; it is a generated file. (You _may_ use + `rake gemspec` to regenerate it if your change involves metadata related to + gem itself). + + - Modify the `Gemfile`. + +## Test Dependencies + +diff-lcs uses Ryan Davis's [Hoe][Hoe] to manage the release process, and it adds +a number of rake tasks. You will mostly be interested in `rake`, which runs +tests in the same way that `rake spec` does. + +To assist with the installation of the development dependencies for diff-lcs, I +have provided a Gemfile pointing to the (generated) `diff-lcs.gemspec` file. +`minitar.gemspec` file. This will permit you to use `bundle install` to install +the dependencies. + +You can run tests with code coverage analysis by running `rake spec:coverage`. + +## Workflow + +Here's the most direct way to get your work merged into the project: + +- Fork the project. +- Clone your fork (`git clone git://github.com//diff-lcs.git`). +- Create a topic branch to contain your change + (`git checkout -b my_awesome_feature`). +- Hack away, add tests. Not necessarily in that order. +- Make sure everything still passes by running `rake`. +- If necessary, rebase your commits into logical chunks, without errors. +- Push the branch up (`git push origin my_awesome_feature`). +- Create a pull request against halostatue/diff-lcs and describe what your + change does and the why you think it should be merged. + +[hoe]: https://github.com/seattlerb/hoe +[qcm]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html +[release-gem]: https://github.com/rubygems/release-gem +[rspec]: http://rspec.info/documentation/ +[standardrb]: https://github.com/standardrb/standard diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTORS.md b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTORS.md new file mode 100644 index 0000000..9053019 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/CONTRIBUTORS.md @@ -0,0 +1,49 @@ +# Contributors + +- Austin Ziegler (@halostatue) created diff-lcs. + +Thanks to everyone else who has contributed to diff-lcs over the years: + +- @ginriki +- @joshbronson +- @kevinmook +- @mckaz +- Akinori Musha +- Artem Ignatyev +- Brandon Fish +- Baptiste Courtois (@annih) +- Camille Drapier +- Cédric Boutillier +- @earlopain +- Gregg Kellogg +- Jagdeep Singh +- Jason Gladish +- Jon Rowe +- Josef Strzibny +- Josep (@apuratepp) +- Josh Bronson +- Jun Aruga +- Justin Steele +- Kenichi Kamiya +- Kensuke Nagae +- Kevin Ansfield +- Koichi Ito +- Mark Friedgan +- Masato Nakamura +- Mark Young +- Michael Granger +- Myron Marston +- Nicolas Leger +- Oleg Orlov +- Patrick Linnane +- Paul Kunysch +- Pete Higgins +- Peter Goldstein +- Peter Wagenet +- Philippe Lafoucrière +- Ryan Lovelett +- Scott Steele +- Simon Courtois +- Tien (@tiendo1011) +- Tomas Jura +- Vít Ondruch diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/LICENCE.md b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/LICENCE.md new file mode 100644 index 0000000..c57c3f1 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/LICENCE.md @@ -0,0 +1,40 @@ +# Licence + +This software is available under three licenses: the GNU GPL version 2 (or at +your option, a later version), the Perl Artistic license, or the MIT license. +Note that my preference for licensing is the MIT license, but Algorithm::Diff +was dually originally licensed with the Perl Artistic and the GNU GPL ("the same +terms as Perl itself") and given that the Ruby implementation originally hewed +pretty closely to the Perl version, I must maintain the additional licensing +terms. + +- Copyright 2004–2025 Austin Ziegler and contributors. +- Adapted from Algorithm::Diff (Perl) by Ned Konz and a Smalltalk version by + Mario I. Wolczko. + +## MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## Perl Artistic License + +See the file docs/artistic.txt in the main distribution. + +## GNU GPL version 2 + +See the file docs/COPYING.txt in the main distribution. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/Manifest.txt b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/Manifest.txt new file mode 100644 index 0000000..fe58c86 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/Manifest.txt @@ -0,0 +1,115 @@ +.rspec +CHANGELOG.md +CODE_OF_CONDUCT.md +CONTRIBUTING.md +CONTRIBUTORS.md +LICENCE.md +Manifest.txt +README.md +Rakefile +SECURITY.md +bin/htmldiff +bin/ldiff +docs/COPYING.txt +docs/artistic.txt +lib/diff-lcs.rb +lib/diff/lcs.rb +lib/diff/lcs/array.rb +lib/diff/lcs/backports.rb +lib/diff/lcs/block.rb +lib/diff/lcs/callbacks.rb +lib/diff/lcs/change.rb +lib/diff/lcs/htmldiff.rb +lib/diff/lcs/hunk.rb +lib/diff/lcs/internals.rb +lib/diff/lcs/ldiff.rb +lib/diff/lcs/string.rb +lib/diff/lcs/version.rb +mise.toml +spec/change_spec.rb +spec/diff_spec.rb +spec/fixtures/123_x +spec/fixtures/456_x +spec/fixtures/aX +spec/fixtures/bXaX +spec/fixtures/ds1.csv +spec/fixtures/ds2.csv +spec/fixtures/empty +spec/fixtures/file1.bin +spec/fixtures/file2.bin +spec/fixtures/four_lines +spec/fixtures/four_lines_with_missing_new_line +spec/fixtures/ldiff/diff.missing_new_line1-e +spec/fixtures/ldiff/diff.missing_new_line1-f +spec/fixtures/ldiff/diff.missing_new_line2-e +spec/fixtures/ldiff/diff.missing_new_line2-f +spec/fixtures/ldiff/error.diff.chef-e +spec/fixtures/ldiff/error.diff.chef-f +spec/fixtures/ldiff/error.diff.missing_new_line1-e +spec/fixtures/ldiff/error.diff.missing_new_line1-f +spec/fixtures/ldiff/error.diff.missing_new_line2-e +spec/fixtures/ldiff/error.diff.missing_new_line2-f +spec/fixtures/ldiff/output.diff +spec/fixtures/ldiff/output.diff-c +spec/fixtures/ldiff/output.diff-e +spec/fixtures/ldiff/output.diff-f +spec/fixtures/ldiff/output.diff-u +spec/fixtures/ldiff/output.diff.bin1 +spec/fixtures/ldiff/output.diff.bin1-c +spec/fixtures/ldiff/output.diff.bin1-e +spec/fixtures/ldiff/output.diff.bin1-f +spec/fixtures/ldiff/output.diff.bin1-u +spec/fixtures/ldiff/output.diff.bin2 +spec/fixtures/ldiff/output.diff.bin2-c +spec/fixtures/ldiff/output.diff.bin2-e +spec/fixtures/ldiff/output.diff.bin2-f +spec/fixtures/ldiff/output.diff.bin2-u +spec/fixtures/ldiff/output.diff.chef +spec/fixtures/ldiff/output.diff.chef-c +spec/fixtures/ldiff/output.diff.chef-e +spec/fixtures/ldiff/output.diff.chef-f +spec/fixtures/ldiff/output.diff.chef-u +spec/fixtures/ldiff/output.diff.chef2 +spec/fixtures/ldiff/output.diff.chef2-c +spec/fixtures/ldiff/output.diff.chef2-d +spec/fixtures/ldiff/output.diff.chef2-e +spec/fixtures/ldiff/output.diff.chef2-f +spec/fixtures/ldiff/output.diff.chef2-u +spec/fixtures/ldiff/output.diff.empty.vs.four_lines +spec/fixtures/ldiff/output.diff.empty.vs.four_lines-c +spec/fixtures/ldiff/output.diff.empty.vs.four_lines-e +spec/fixtures/ldiff/output.diff.empty.vs.four_lines-f +spec/fixtures/ldiff/output.diff.empty.vs.four_lines-u +spec/fixtures/ldiff/output.diff.four_lines.vs.empty +spec/fixtures/ldiff/output.diff.four_lines.vs.empty-c +spec/fixtures/ldiff/output.diff.four_lines.vs.empty-e +spec/fixtures/ldiff/output.diff.four_lines.vs.empty-f +spec/fixtures/ldiff/output.diff.four_lines.vs.empty-u +spec/fixtures/ldiff/output.diff.issue95_trailing_context +spec/fixtures/ldiff/output.diff.issue95_trailing_context-c +spec/fixtures/ldiff/output.diff.issue95_trailing_context-e +spec/fixtures/ldiff/output.diff.issue95_trailing_context-f +spec/fixtures/ldiff/output.diff.issue95_trailing_context-u +spec/fixtures/ldiff/output.diff.missing_new_line1 +spec/fixtures/ldiff/output.diff.missing_new_line1-c +spec/fixtures/ldiff/output.diff.missing_new_line1-e +spec/fixtures/ldiff/output.diff.missing_new_line1-f +spec/fixtures/ldiff/output.diff.missing_new_line1-u +spec/fixtures/ldiff/output.diff.missing_new_line2 +spec/fixtures/ldiff/output.diff.missing_new_line2-c +spec/fixtures/ldiff/output.diff.missing_new_line2-e +spec/fixtures/ldiff/output.diff.missing_new_line2-f +spec/fixtures/ldiff/output.diff.missing_new_line2-u +spec/fixtures/new-chef +spec/fixtures/new-chef2 +spec/fixtures/old-chef +spec/fixtures/old-chef2 +spec/hunk_spec.rb +spec/issues_spec.rb +spec/lcs_spec.rb +spec/ldiff_spec.rb +spec/patch_spec.rb +spec/sdiff_spec.rb +spec/spec_helper.rb +spec/traverse_balanced_spec.rb +spec/traverse_sequences_spec.rb diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/README.md b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/README.md new file mode 100644 index 0000000..6583803 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/README.md @@ -0,0 +1,92 @@ +# Diff::LCS + +- home :: https://github.com/halostatue/diff-lcs +- changelog :: https://github.com/halostatue/diff-lcs/blob/main/CHANGELOG.md +- code :: https://github.com/halostatue/diff-lcs +- bugs :: https://github.com/halostatue/diff-lcs/issues +- rdoc :: http://rubydoc.info/github/halostatue/diff-lcs + + + + + +## Description + +Diff::LCS computes the difference between two Enumerable sequences using the +McIlroy-Hunt longest common subsequence (LCS) algorithm. It includes utilities +to create a simple HTML diff output format and a standard diff-like tool. + +This is release 1.6.1, providing a simple extension that allows for +Diff::LCS::Change objects to be treated implicitly as arrays and fixes a number +of formatting issues. + +Ruby versions below 2.5 are soft-deprecated, which means that older versions are +no longer part of the CI test suite. If any changes have been introduced that +break those versions, bug reports and patches will be accepted, but it will be +up to the reporter to verify any fixes prior to release. The next major release +will completely break compatibility. + +## Synopsis + +Using this module is quite simple. By default, Diff::LCS does not extend objects +with the Diff::LCS interface, but will be called as if it were a function: + +```ruby +require 'diff/lcs' + +seq1 = %w(a b c e h j l m n p) +seq2 = %w(b c d e f j k l m r s t) + +lcs = Diff::LCS.LCS(seq1, seq2) +diffs = Diff::LCS.diff(seq1, seq2) +sdiff = Diff::LCS.sdiff(seq1, seq2) +seq = Diff::LCS.traverse_sequences(seq1, seq2, callback_obj) +bal = Diff::LCS.traverse_balanced(seq1, seq2, callback_obj) +seq2 == Diff::LCS.patch!(seq1, diffs) +seq1 == Diff::LCS.unpatch!(seq2, diffs) +seq2 == Diff::LCS.patch!(seq1, sdiff) +seq1 == Diff::LCS.unpatch!(seq2, sdiff) +``` + +Objects can be extended with Diff::LCS: + +```ruby +seq1.extend(Diff::LCS) +lcs = seq1.lcs(seq2) +diffs = seq1.diff(seq2) +sdiff = seq1.sdiff(seq2) +seq = seq1.traverse_sequences(seq2, callback_obj) +bal = seq1.traverse_balanced(seq2, callback_obj) +seq2 == seq1.patch!(diffs) +seq1 == seq2.unpatch!(diffs) +seq2 == seq1.patch!(sdiff) +seq1 == seq2.unpatch!(sdiff) +``` + +By requiring 'diff/lcs/array' or 'diff/lcs/string', Array or String will be +extended for use this way. + +Note that Diff::LCS requires a sequenced enumerable container, which means that +the order of enumeration is both predictable and consistent for the same set of +data. While it is theoretically possible to generate a diff for an unordered +hash, it will only be meaningful if the enumeration of the hashes is consistent. +In general, this will mean that containers that behave like String or Array will +perform best. + +## History + +Diff::LCS is a port of Perl's Algorithm::Diff that uses the McIlroy-Hunt longest +common subsequence (LCS) algorithm to compute intelligent differences between +two sequenced enumerable containers. The implementation is based on Mario I. +Wolczko's [Smalltalk version 1.2][smalltalk] (1993) and Ned Konz's Perl version +[Algorithm::Diff 1.15][perl]. `Diff::LCS#sdiff` and +`Diff::LCS#traverse_balanced` were originally written for the Perl version by +Mike Schilli. + +The algorithm is described in A Fast Algorithm for Computing Longest Common +Subsequences, CACM, vol.20, no.5, pp.350-353, May 1977, with a few minor +improvements to improve the speed. A simplified description of the algorithm, +originally written for the Perl version, was written by Mark-Jason Dominus. + +[smalltalk]: ftp://st.cs.uiuc.edu/pub/Smalltalk/MANCHESTER/manchester/4.0/diff.st +[perl]: http://search.cpan.org/~nedkonz/Algorithm-Diff-1.15/ diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/Rakefile b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/Rakefile new file mode 100644 index 0000000..0bfe927 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/Rakefile @@ -0,0 +1,115 @@ +require "rubygems" +require "rspec" +require "rspec/core/rake_task" +require "hoe" +require "rake/clean" + +MAINTENANCE = ENV["MAINTENANCE"] == "true" +BUILD_DOCS = MAINTENANCE || ENV["DOCS"] == "true" +TRUSTED_RELEASE = ENV["rubygems_release_gem"] == "true" + +Hoe.plugin :halostatue +Hoe.plugin :rubygems + +Hoe.plugins.delete :debug +Hoe.plugins.delete :newb +Hoe.plugins.delete :signing +Hoe.plugins.delete :publish unless BUILD_DOCS + +if RUBY_VERSION < "1.9" + class Array # :nodoc: + def to_h + Hash[*flatten(1)] + end + end + + class Gem::Specification # :nodoc: + def metadata=(*) + end + + def default_value(*) + end + end + + class Object # :nodoc: + def caller_locations(*) + [] + end + end +end + +_spec = Hoe.spec "diff-lcs" do + developer("Austin Ziegler", "halostatue@gmail.com") + + self.trusted_release = TRUSTED_RELEASE + + require_ruby_version ">= 1.8" + + self.history_file = "CHANGELOG.md" + self.readme_file = "README.md" + self.licenses = ["MIT", "Artistic-1.0-Perl", "GPL-2.0-or-later"] + + spec_extras[:metadata] = ->(val) { + val["rubygems_mfa_required"] = "true" + } + + extra_dev_deps << ["hoe", "~> 4.0"] + extra_dev_deps << ["hoe-halostatue", "~> 2.0"] + extra_dev_deps << ["hoe-rubygems", "~> 1.0"] + extra_dev_deps << ["rspec", ">= 2.0", "< 4"] + extra_dev_deps << ["rake", ">= 10.0", "< 14"] + extra_dev_deps << ["rdoc", ">= 6.3.1", "< 7"] +end + +if BUILD_DOCS + rake_tasks = Rake.application.instance_variable_get(:@tasks) + tasks = ["publish_docs", "publish_on_announce", "debug_email", "post_blog", "announce"] + tasks.each do |task| + rake_tasks.delete(task) + end +end + +desc "Run all specifications" +RSpec::Core::RakeTask.new(:spec) do |t| + rspec_dirs = %w[spec lib].join(":") + t.rspec_opts = ["-I#{rspec_dirs}"] +end + +task :version do + require "diff/lcs/version" + puts Diff::LCS::VERSION +end + +Rake::Task["spec"].actions.uniq! { |a| a.source_location } + +# standard:disable Style/HashSyntax +task :default => :spec unless Rake::Task["default"].prereqs.include?("spec") +task :test => :spec unless Rake::Task["test"].prereqs.include?("spec") +# standard:enable Style/HashSyntax + +if RUBY_VERSION >= "3.0" && RUBY_ENGINE == "ruby" + namespace :spec do + desc "Runs test coverage. Only works Ruby 2.0+ and assumes 'simplecov' is installed." + task :coverage do + ENV["COVERAGE"] = "true" + Rake::Task["spec"].execute + end + end +end + +if MAINTENANCE + task ruby18: :package do + require "diff/lcs/version" + # standard:disable Layout/HeredocIndentation + puts <<-MESSAGE +You are starting a barebones Ruby 1.8 docker environment for testing. +A snapshot package has been built, so install it with: + + cd diff-lcs + gem install pkg/diff-lcs-#{Diff::LCS::VERSION} + + MESSAGE + # standard:enable Layout/HeredocIndentation + sh "docker run -it --rm -v #{Dir.pwd}:/root/diff-lcs bellbind/docker-ruby18-rails2 bash -l" + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/SECURITY.md b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/SECURITY.md new file mode 100644 index 0000000..16854f6 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/SECURITY.md @@ -0,0 +1,41 @@ +# diff-lcs Security + +## Supported Versions + +Security reports are accepted for the most recent major release and the previous +version for a limited time after the initial major release version. After a +major release, the previous version will receive full support for six months and +security support for an additional six months (for a total of twelve months). + +Because diff-lcs 1.x supports a wide range of Ruby versions, security reports +will only be accepted when they can be demonstrated on Ruby 3.1 or higher. + +> [!information] +> +> There will be a diff-lcs 2.0 released in 2025 which narrows support to modern +> versions of Ruby only. +> +> | Release Date | Support Ends | Security Support Ends | +> | ------------ | ------------ | --------------------- | +> | 2025 | +6 months | +12 months | +> +> If the 2.0.0 release happens on 2025-07-01, regular support for diff-lcs 1.x +> will end on 2026-12-31 and security support for diff-lcs 1.x will end on +> 2026-06-30. + +## Reporting a Vulnerability + +By preference, use the [Tidelift security contact][tidelift]. Tidelift will +coordinate the fix and disclosure. + +Alternatively, Send an email to [diff-lcs@halostatue.ca][email] with the text +`Diff::LCS` in the subject. Emails sent to this address should be encrypted +using [age][age] with the following public key: + +``` +age1fc6ngxmn02m62fej5cl30lrvwmxn4k3q2atqu53aatekmnqfwumqj4g93w +``` + +[tidelift]: https://tidelift.com/security +[email]: mailto:diff-lcs@halostatue.ca +[age]: https://github.com/FiloSottile/age diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/bin/htmldiff b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/bin/htmldiff new file mode 100755 index 0000000..bcd89d2 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/bin/htmldiff @@ -0,0 +1,35 @@ +#! /usr/bin/env ruby -w +# frozen_string_literal: true + +require "diff/lcs" +require "diff/lcs/htmldiff" + +begin + require "text/format" +rescue LoadError + Diff::LCS::HTMLDiff.can_expand_tabs = false +end + +if ARGV.size < 2 or ARGV.size > 3 + warn "usage: #{File.basename($0)} old new [output.html]" + warn " #{File.basename($0)} old new > output.html" + exit 127 +end + +left = IO.read(ARGV[0]).split($/) +right = IO.read(ARGV[1]).split($/) + +options = { :title => "diff #{ARGV[0]} #{ARGV[1]}" } + +htmldiff = Diff::LCS::HTMLDiff.new(left, right, options) + +if ARGV[2] + File.open(ARGV[2], "w") do |f| + htmldiff.options[:output] = f + htmldiff.run + end +else + htmldiff.run +end + +# vim: ft=ruby diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/bin/ldiff b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/bin/ldiff new file mode 100755 index 0000000..f4734f5 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/bin/ldiff @@ -0,0 +1,9 @@ +#! /usr/bin/env ruby -w +# frozen_string_literal: true + +require 'diff/lcs' +require 'diff/lcs/ldiff' + +exit Diff::LCS::Ldiff.run(ARGV) + +# vim: ft=ruby diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/docs/COPYING.txt b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/docs/COPYING.txt new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/docs/COPYING.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/docs/artistic.txt b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/docs/artistic.txt new file mode 100644 index 0000000..763e17a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/docs/artistic.txt @@ -0,0 +1,127 @@ +The "Artistic License" + + Preamble + +The intent of this document is to state the conditions under which a +Package may be copied, such that the Copyright Holder maintains some +semblance of artistic control over the development of the package, +while giving the users of the package the right to use and distribute +the Package in a more-or-less customary fashion, plus the right to make +reasonable modifications. + +Definitions: + + "Package" refers to the collection of files distributed by the + Copyright Holder, and derivatives of that collection of files + created through textual modification. + + "Standard Version" refers to such a Package if it has not been + modified, or has been modified in accordance with the wishes + of the Copyright Holder as specified below. + + "Copyright Holder" is whoever is named in the copyright or + copyrights for the package. + + "You" is you, if you're thinking about copying or distributing + this Package. + + "Reasonable copying fee" is whatever you can justify on the + basis of media cost, duplication charges, time of people involved, + and so on. (You will not be required to justify it to the + Copyright Holder, but only to the computing community at large + as a market that must bear the fee.) + + "Freely Available" means that no fee is charged for the item + itself, though there may be fees involved in handling the item. + It also means that recipients of the item may redistribute it + under the same conditions they received it. + +1. You may make and give away verbatim copies of the source form of the +Standard Version of this Package without restriction, provided that you +duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications +derived from the Public Domain or from the Copyright Holder. A Package +modified in such a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided +that you insert a prominent notice in each changed file stating how and +when you changed that file, and provided that you do at least ONE of the +following: + + a) place your modifications in the Public Domain or otherwise make them + Freely Available, such as by posting said modifications to Usenet or + an equivalent medium, or placing the modifications on a major archive + site such as uunet.uu.net, or by allowing the Copyright Holder to include + your modifications in the Standard Version of the Package. + + b) use the modified Package only within your corporation or organization. + + c) rename any non-standard executables so the names do not conflict + with standard executables, which must also be provided, and provide + a separate manual page for each non-standard executable that clearly + documents how it differs from the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or +executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, + together with instructions (in the manual page or equivalent) on where + to get the Standard Version. + + b) accompany the distribution with the machine-readable source of + the Package with your modifications. + + c) give non-standard executables non-standard names, and clearly + document the differences in manual pages (or equivalent), together + with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this +Package. You may charge any fee you choose for support of this +Package. You may not charge a fee for this Package itself. However, +you may distribute this Package in aggregate with other (possibly +commercial) programs as part of a larger (possibly commercial) software +distribution provided that you do not advertise this Package as a +product of your own. You may embed this Package's interpreter within +an executable of yours (by linking); this shall be construed as a mere +form of aggregation, provided that the complete Standard Version of the +interpreter is so embedded. + +6. The scripts and library files supplied as input to or produced as +output from the programs of this Package do not automatically fall +under the copyright of this Package, but belong to whoever generated +them, and may be sold commercially, and may be aggregated with this +Package. If such scripts or library files are aggregated with this +Package via the so-called "undump" or "unexec" methods of producing a +binary executable image, then distribution of such an image shall +neither be construed as a distribution of this Package nor shall it +fall under the restrictions of Paragraphs 3 and 4, provided that you do +not represent such an executable image as a Standard Version of this +Package. + +7. C subroutines (or comparably compiled subroutines in other +languages) supplied by you and linked into this Package in order to +emulate subroutines and variables of the language defined by this +Package shall not be considered part of this Package, but are the +equivalent of input as in Paragraph 6, provided these subroutines do +not change the language in any way that would cause it to fail the +regression tests for the language. + +8. Aggregation of this Package with a commercial distribution is always +permitted provided that the use of this Package is embedded; that is, +when no overt attempt is made to make this Package's interfaces visible +to the end user of the commercial distribution. Such use shall not be +construed as a distribution of this Package. + +9. The name of the Copyright Holder may not be used to endorse or promote +products derived from this software without specific prior written permission. + +10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + The End diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff-lcs.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff-lcs.rb new file mode 100644 index 0000000..bc07bf9 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff-lcs.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require "diff/lcs" diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs.rb new file mode 100644 index 0000000..5ee8937 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs.rb @@ -0,0 +1,742 @@ +# frozen_string_literal: true + +module Diff; end unless defined? Diff + +# == How Diff Works (by Mark-Jason Dominus) +# +# I once read an article written by the authors of +diff+; they said that they +# hard worked very hard on the algorithm until they found the right one. +# +# I think what they ended up using (and I hope someone will correct me, because +# I am not very confident about this) was the `longest common subsequence' +# method. In the LCS problem, you have two sequences of items: +# +# a b c d f g h j q z +# a b c d e f g i j k r x y z +# +# and you want to find the longest sequence of items that is present in both +# original sequences in the same order. That is, you want to find a new +# sequence *S* which can be obtained from the first sequence by deleting some +# items, and from the second sequence by deleting other items. You also want +# *S* to be as long as possible. In this case *S* is: +# +# a b c d f g j z +# +# From there it's only a small step to get diff-like output: +# +# e h i k q r x y +# + - + + - + + + +# +# This module solves the LCS problem. It also includes a canned function to +# generate +diff+-like output. +# +# It might seem from the example above that the LCS of two sequences is always +# pretty obvious, but that's not always the case, especially when the two +# sequences have many repeated elements. For example, consider +# +# a x b y c z p d q +# a b c a x b y c z +# +# A naive approach might start by matching up the +a+ and +b+ that appear at +# the beginning of each sequence, like this: +# +# a x b y c z p d q +# a b c a b y c z +# +# This finds the common subsequence +a b c z+. But actually, the LCS is +a x b +# y c z+: +# +# a x b y c z p d q +# a b c a x b y c z +module Diff::LCS +end + +require "diff/lcs/version" +require "diff/lcs/callbacks" +require "diff/lcs/internals" + +module Diff::LCS + # Returns an Array containing the longest common subsequence(s) between + # +self+ and +other+. See Diff::LCS#lcs. + # + # lcs = seq1.lcs(seq2) + # + # A note when using objects: Diff::LCS only works properly when each object + # can be used as a key in a Hash. This means that those objects must implement + # the methods +#hash+ and +#eql?+ such that two objects containing identical values + # compare identically for key purposes. That is: + # + # O.new('a').eql?(O.new('a')) == true && + # O.new('a').hash == O.new('a').hash + def lcs(other, &block) # :yields: self[i] if there are matched subsequences + Diff::LCS.lcs(self, other, &block) + end + + # Returns the difference set between +self+ and +other+. See Diff::LCS#diff. + def diff(other, callbacks = nil, &block) + Diff::LCS.diff(self, other, callbacks, &block) + end + + # Returns the balanced ("side-by-side") difference set between +self+ and + # +other+. See Diff::LCS#sdiff. + def sdiff(other, callbacks = nil, &block) + Diff::LCS.sdiff(self, other, callbacks, &block) + end + + # Traverses the discovered longest common subsequences between +self+ and + # +other+. See Diff::LCS#traverse_sequences. + def traverse_sequences(other, callbacks = nil, &block) + Diff::LCS.traverse_sequences(self, other, callbacks || Diff::LCS::SequenceCallbacks, &block) + end + + # Traverses the discovered longest common subsequences between +self+ and + # +other+ using the alternate, balanced algorithm. See + # Diff::LCS#traverse_balanced. + def traverse_balanced(other, callbacks = nil, &block) + Diff::LCS.traverse_balanced(self, other, callbacks || Diff::LCS::BalancedCallbacks, &block) + end + + # Attempts to patch +self+ with the provided +patchset+. A new sequence based + # on +self+ and the +patchset+ will be created. See Diff::LCS#patch. Attempts + # to autodiscover the direction of the patch. + def patch(patchset) + Diff::LCS.patch(self, patchset) + end + alias_method :unpatch, :patch + + # Attempts to patch +self+ with the provided +patchset+. A new sequence based + # on +self+ and the +patchset+ will be created. See Diff::LCS#patch. Does no + # patch direction autodiscovery. + def patch!(patchset) + Diff::LCS.patch!(self, patchset) + end + + # Attempts to unpatch +self+ with the provided +patchset+. A new sequence + # based on +self+ and the +patchset+ will be created. See Diff::LCS#unpatch. + # Does no patch direction autodiscovery. + def unpatch!(patchset) + Diff::LCS.unpatch!(self, patchset) + end + + # Attempts to patch +self+ with the provided +patchset+, using #patch!. If + # the sequence this is used on supports #replace, the value of +self+ will be + # replaced. See Diff::LCS#patch. Does no patch direction autodiscovery. + def patch_me(patchset) + if respond_to? :replace + replace(patch!(patchset)) + else + patch!(patchset) + end + end + + # Attempts to unpatch +self+ with the provided +patchset+, using #unpatch!. + # If the sequence this is used on supports #replace, the value of +self+ will + # be replaced. See Diff::LCS#unpatch. Does no patch direction autodiscovery. + def unpatch_me(patchset) + if respond_to? :replace + replace(unpatch!(patchset)) + else + unpatch!(patchset) + end + end +end + +class << Diff::LCS + def lcs(seq1, seq2, &block) # :yields: seq1[i] for each matched + matches = Diff::LCS::Internals.lcs(seq1, seq2) + ret = [] + string = seq1.is_a? String + matches.each_index do |i| + next if matches[i].nil? + + v = string ? seq1[i, 1] : seq1[i] + v = block[v] if block + ret << v + end + ret + end + alias_method :LCS, :lcs + + # #diff computes the smallest set of additions and deletions necessary to + # turn the first sequence into the second, and returns a description of these + # changes. + # + # See Diff::LCS::DiffCallbacks for the default behaviour. An alternate + # behaviour may be implemented with Diff::LCS::ContextDiffCallbacks. If a + # Class argument is provided for +callbacks+, #diff will attempt to + # initialise it. If the +callbacks+ object (possibly initialised) responds to + # #finish, it will be called. + def diff(seq1, seq2, callbacks = nil, &block) # :yields: diff changes + diff_traversal(:diff, seq1, seq2, callbacks || Diff::LCS::DiffCallbacks, &block) + end + + # #sdiff computes all necessary components to show two sequences and their + # minimized differences side by side, just like the Unix utility + # sdiff does: + # + # old < - + # same same + # before | after + # - > new + # + # See Diff::LCS::SDiffCallbacks for the default behaviour. An alternate + # behaviour may be implemented with Diff::LCS::ContextDiffCallbacks. If a + # Class argument is provided for +callbacks+, #diff will attempt to + # initialise it. If the +callbacks+ object (possibly initialised) responds to + # #finish, it will be called. + # + # Each element of a returned array is a Diff::LCS::ContextChange object, + # which can be implicitly converted to an array. + # + # Diff::LCS.sdiff(a, b).each do |action, (old_pos, old_element), (new_pos, new_element)| + # case action + # when '!' + # # replace + # when '-' + # # delete + # when '+' + # # insert + # end + # end + def sdiff(seq1, seq2, callbacks = nil, &block) # :yields: diff changes + diff_traversal(:sdiff, seq1, seq2, callbacks || Diff::LCS::SDiffCallbacks, &block) + end + + # #traverse_sequences is the most general facility provided by this module; + # #diff and #lcs are implemented as calls to it. + # + # The arguments to #traverse_sequences are the two sequences to traverse, and + # a callback object, like this: + # + # traverse_sequences(seq1, seq2, Diff::LCS::ContextDiffCallbacks.new) + # + # == Callback Methods + # + # Optional callback methods are emphasized. + # + # callbacks#match:: Called when +a+ and +b+ are pointing to + # common elements in +A+ and +B+. + # callbacks#discard_a:: Called when +a+ is pointing to an + # element not in +B+. + # callbacks#discard_b:: Called when +b+ is pointing to an + # element not in +A+. + # callbacks#finished_a:: Called when +a+ has reached the end of + # sequence +A+. + # callbacks#finished_b:: Called when +b+ has reached the end of + # sequence +B+. + # + # == Algorithm + # + # a---+ + # v + # A = a b c e h j l m n p + # B = b c d e f j k l m r s t + # ^ + # b---+ + # + # If there are two arrows (+a+ and +b+) pointing to elements of sequences +A+ + # and +B+, the arrows will initially point to the first elements of their + # respective sequences. #traverse_sequences will advance the arrows through + # the sequences one element at a time, calling a method on the user-specified + # callback object before each advance. It will advance the arrows in such a + # way that if there are elements A[i] and B[j] which are + # both equal and part of the longest common subsequence, there will be some + # moment during the execution of #traverse_sequences when arrow +a+ is + # pointing to A[i] and arrow +b+ is pointing to B[j]. When + # this happens, #traverse_sequences will call callbacks#match and + # then it will advance both arrows. + # + # Otherwise, one of the arrows is pointing to an element of its sequence that + # is not part of the longest common subsequence. #traverse_sequences will + # advance that arrow and will call callbacks#discard_a or + # callbacks#discard_b, depending on which arrow it advanced. If both + # arrows point to elements that are not part of the longest common + # subsequence, then #traverse_sequences will advance arrow +a+ and call the + # appropriate callback, then it will advance arrow +b+ and call the appropriate + # callback. + # + # The methods for callbacks#match, callbacks#discard_a, and + # callbacks#discard_b are invoked with an event comprising the + # action ("=", "+", or "-", respectively), the indexes +i+ and +j+, and the + # elements A[i] and B[j]. Return values are discarded by + # #traverse_sequences. + # + # === End of Sequences + # + # If arrow +a+ reaches the end of its sequence before arrow +b+ does, + # #traverse_sequence will try to call callbacks#finished_a with the + # last index and element of +A+ (A[-1]) and the current index and + # element of +B+ (B[j]). If callbacks#finished_a does not + # exist, then callbacks#discard_b will be called on each element of + # +B+ until the end of the sequence is reached (the call will be done with + # A[-1] and B[j] for each element). + # + # If +b+ reaches the end of +B+ before +a+ reaches the end of +A+, + # callbacks#finished_b will be called with the current index and + # element of +A+ (A[i]) and the last index and element of +B+ + # (A[-1]). Again, if callbacks#finished_b does not exist on + # the callback object, then callbacks#discard_a will be called on + # each element of +A+ until the end of the sequence is reached (A[i] + # and B[-1]). + # + # There is a chance that one additional callbacks#discard_a or + # callbacks#discard_b will be called after the end of the sequence + # is reached, if +a+ has not yet reached the end of +A+ or +b+ has not yet + # reached the end of +B+. + def traverse_sequences(seq1, seq2, callbacks = Diff::LCS::SequenceCallbacks) # :yields: change events + callbacks ||= Diff::LCS::SequenceCallbacks + matches = Diff::LCS::Internals.lcs(seq1, seq2) + + run_finished_a = run_finished_b = false + string = seq1.is_a?(String) + + a_size = seq1.size + b_size = seq2.size + ai = bj = 0 + + matches.each do |b_line| + if b_line.nil? + unless seq1[ai].nil? + ax = string ? seq1[ai, 1] : seq1[ai] + bx = string ? seq2[bj, 1] : seq2[bj] + + event = Diff::LCS::ContextChange.new("-", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_a(event) + end + else + ax = string ? seq1[ai, 1] : seq1[ai] + + loop do + break unless bj < b_line + + bx = string ? seq2[bj, 1] : seq2[bj] + event = Diff::LCS::ContextChange.new("+", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_b(event) + bj += 1 + end + bx = string ? seq2[bj, 1] : seq2[bj] + event = Diff::LCS::ContextChange.new("=", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.match(event) + bj += 1 + end + ai += 1 + end + + # The last entry (if any) processed was a match. +ai+ and +bj+ point just + # past the last matching lines in their sequences. + while (ai < a_size) || (bj < b_size) + # last A? + if ai == a_size && bj < b_size + if callbacks.respond_to?(:finished_a) && !run_finished_a + ax = string ? seq1[-1, 1] : seq1[-1] + bx = string ? seq2[bj, 1] : seq2[bj] + event = Diff::LCS::ContextChange.new(">", a_size - 1, ax, bj, bx) + event = yield event if block_given? + callbacks.finished_a(event) + run_finished_a = true + else + ax = string ? seq1[ai, 1] : seq1[ai] + loop do + bx = string ? seq2[bj, 1] : seq2[bj] + event = Diff::LCS::ContextChange.new("+", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_b(event) + bj += 1 + break unless bj < b_size + end + end + end + + # last B? + if bj == b_size && ai < a_size + if callbacks.respond_to?(:finished_b) && !run_finished_b + ax = string ? seq1[ai, 1] : seq1[ai] + bx = string ? seq2[-1, 1] : seq2[-1] + event = Diff::LCS::ContextChange.new("<", ai, ax, b_size - 1, bx) + event = yield event if block_given? + callbacks.finished_b(event) + run_finished_b = true + else + bx = string ? seq2[bj, 1] : seq2[bj] + loop do + ax = string ? seq1[ai, 1] : seq1[ai] + event = Diff::LCS::ContextChange.new("-", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_a(event) + ai += 1 + break unless bj < b_size + end + end + end + + if ai < a_size + ax = string ? seq1[ai, 1] : seq1[ai] + bx = string ? seq2[bj, 1] : seq2[bj] + event = Diff::LCS::ContextChange.new("-", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_a(event) + ai += 1 + end + + if bj < b_size + ax = string ? seq1[ai, 1] : seq1[ai] + bx = string ? seq2[bj, 1] : seq2[bj] + event = Diff::LCS::ContextChange.new("+", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_b(event) + bj += 1 + end + end + end + + # #traverse_balanced is an alternative to #traverse_sequences. It uses a + # different algorithm to iterate through the entries in the computed longest + # common subsequence. Instead of viewing the changes as insertions or + # deletions from one of the sequences, #traverse_balanced will report + # changes between the sequences. + # + # The arguments to #traverse_balanced are the two sequences to traverse and a + # callback object, like this: + # + # traverse_balanced(seq1, seq2, Diff::LCS::ContextDiffCallbacks.new) + # + # #sdiff is implemented with #traverse_balanced. + # + # == Callback Methods + # + # Optional callback methods are emphasized. + # + # callbacks#match:: Called when +a+ and +b+ are pointing to + # common elements in +A+ and +B+. + # callbacks#discard_a:: Called when +a+ is pointing to an + # element not in +B+. + # callbacks#discard_b:: Called when +b+ is pointing to an + # element not in +A+. + # callbacks#change:: Called when +a+ and +b+ are pointing to + # the same relative position, but + # A[a] and B[b] are not + # the same; a change has + # occurred. + # + # #traverse_balanced might be a bit slower than #traverse_sequences, + # noticeable only while processing huge amounts of data. + # + # == Algorithm + # + # a---+ + # v + # A = a b c e h j l m n p + # B = b c d e f j k l m r s t + # ^ + # b---+ + # + # === Matches + # + # If there are two arrows (+a+ and +b+) pointing to elements of sequences +A+ + # and +B+, the arrows will initially point to the first elements of their + # respective sequences. #traverse_sequences will advance the arrows through + # the sequences one element at a time, calling a method on the user-specified + # callback object before each advance. It will advance the arrows in such a + # way that if there are elements A[i] and B[j] which are + # both equal and part of the longest common subsequence, there will be some + # moment during the execution of #traverse_sequences when arrow +a+ is + # pointing to A[i] and arrow +b+ is pointing to B[j]. When + # this happens, #traverse_sequences will call callbacks#match and + # then it will advance both arrows. + # + # === Discards + # + # Otherwise, one of the arrows is pointing to an element of its sequence that + # is not part of the longest common subsequence. #traverse_sequences will + # advance that arrow and will call callbacks#discard_a or + # callbacks#discard_b, depending on which arrow it advanced. + # + # === Changes + # + # If both +a+ and +b+ point to elements that are not part of the longest + # common subsequence, then #traverse_sequences will try to call + # callbacks#change and advance both arrows. If + # callbacks#change is not implemented, then + # callbacks#discard_a and callbacks#discard_b will be + # called in turn. + # + # The methods for callbacks#match, callbacks#discard_a, + # callbacks#discard_b, and callbacks#change are invoked + # with an event comprising the action ("=", "+", "-", or "!", respectively), + # the indexes +i+ and +j+, and the elements A[i] and B[j]. + # Return values are discarded by #traverse_balanced. + # + # === Context + # + # Note that +i+ and +j+ may not be the same index position, even if +a+ and + # +b+ are considered to be pointing to matching or changed elements. + def traverse_balanced(seq1, seq2, callbacks = Diff::LCS::BalancedCallbacks) + matches = Diff::LCS::Internals.lcs(seq1, seq2) + a_size = seq1.size + b_size = seq2.size + ai = bj = mb = 0 + ma = -1 + string = seq1.is_a?(String) + + # Process all the lines in the match vector. + loop do + # Find next match indexes +ma+ and +mb+ + loop do + ma += 1 + break unless ma < matches.size && matches[ma].nil? + end + + break if ma >= matches.size # end of matches? + + mb = matches[ma] + + # Change(seq2) + while (ai < ma) || (bj < mb) + ax = string ? seq1[ai, 1] : seq1[ai] + bx = string ? seq2[bj, 1] : seq2[bj] + + case [(ai < ma), (bj < mb)] + when [true, true] + if callbacks.respond_to?(:change) + event = Diff::LCS::ContextChange.new("!", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.change(event) + ai += 1 + else + event = Diff::LCS::ContextChange.new("-", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_a(event) + ai += 1 + ax = string ? seq1[ai, 1] : seq1[ai] + event = Diff::LCS::ContextChange.new("+", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_b(event) + end + + bj += 1 + when [true, false] + event = Diff::LCS::ContextChange.new("-", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_a(event) + ai += 1 + when [false, true] + event = Diff::LCS::ContextChange.new("+", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_b(event) + bj += 1 + end + end + + # Match + ax = string ? seq1[ai, 1] : seq1[ai] + bx = string ? seq2[bj, 1] : seq2[bj] + event = Diff::LCS::ContextChange.new("=", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.match(event) + ai += 1 + bj += 1 + end + + while (ai < a_size) || (bj < b_size) + ax = string ? seq1[ai, 1] : seq1[ai] + bx = string ? seq2[bj, 1] : seq2[bj] + + case [(ai < a_size), (bj < b_size)] + when [true, true] + if callbacks.respond_to?(:change) + event = Diff::LCS::ContextChange.new("!", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.change(event) + ai += 1 + else + event = Diff::LCS::ContextChange.new("-", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_a(event) + ai += 1 + ax = string ? seq1[ai, 1] : seq1[ai] + event = Diff::LCS::ContextChange.new("+", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_b(event) + end + + bj += 1 + when [true, false] + event = Diff::LCS::ContextChange.new("-", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_a(event) + ai += 1 + when [false, true] + event = Diff::LCS::ContextChange.new("+", ai, ax, bj, bx) + event = yield event if block_given? + callbacks.discard_b(event) + bj += 1 + end + end + end + + # standard:disable Style/HashSyntax + PATCH_MAP = { # :nodoc: + :patch => {"+" => "+", "-" => "-", "!" => "!", "=" => "="}.freeze, + :unpatch => {"+" => "-", "-" => "+", "!" => "!", "=" => "="}.freeze + }.freeze + # standard:enable Style/HashSyntax + + # Applies a +patchset+ to the sequence +src+ according to the +direction+ + # (:patch or :unpatch), producing a new sequence. + # + # If the +direction+ is not specified, Diff::LCS::patch will attempt to + # discover the direction of the +patchset+. + # + # A +patchset+ can be considered to apply forward (:patch) if the + # following expression is true: + # + # patch(s1, diff(s1, s2)) -> s2 + # + # A +patchset+ can be considered to apply backward (:unpatch) if the + # following expression is true: + # + # patch(s2, diff(s1, s2)) -> s1 + # + # If the +patchset+ contains no changes, the +src+ value will be returned as + # either src.dup or +src+. A +patchset+ can be deemed as having no + # changes if the following predicate returns true: + # + # patchset.empty? or + # patchset.flatten(1).all? { |change| change.unchanged? } + # + # === Patchsets + # + # A +patchset+ is always an enumerable sequence of changes, hunks of changes, + # or a mix of the two. A hunk of changes is an enumerable sequence of + # changes: + # + # [ # patchset + # # change + # [ # hunk + # # change + # ] + # ] + # + # The +patch+ method accepts patchsets that are enumerable sequences + # containing either Diff::LCS::Change objects (or a subclass) or the array + # representations of those objects. Prior to application, array + # representations of Diff::LCS::Change objects will be reified. + def patch(src, patchset, direction = nil) + # Normalize the patchset. + has_changes, patchset = Diff::LCS::Internals.analyze_patchset(patchset) + + return src.respond_to?(:dup) ? src.dup : src unless has_changes + + string = src.is_a?(String) + # Start with a new empty type of the source's class + res = src.class.new + + direction ||= Diff::LCS::Internals.intuit_diff_direction(src, patchset) + + ai = bj = 0 + + patch_map = PATCH_MAP[direction] + + patchset.each do |change| + # Both Change and ContextChange support #action + action = patch_map[change.action] + + case change + when Diff::LCS::ContextChange + case direction + when :patch + el = change.new_element + op = change.old_position + np = change.new_position + when :unpatch + el = change.old_element + op = change.new_position + np = change.old_position + end + + case action + when "-" # Remove details from the old string + while ai < op + res << (string ? src[ai, 1] : src[ai]) + ai += 1 + bj += 1 + end + ai += 1 + when "+" + while bj < np + res << (string ? src[ai, 1] : src[ai]) + ai += 1 + bj += 1 + end + + res << el + bj += 1 + when "=" + # This only appears in sdiff output with the SDiff callback. + # Therefore, we only need to worry about dealing with a single + # element. + res << el + + ai += 1 + bj += 1 + when "!" + while ai < op + res << (string ? src[ai, 1] : src[ai]) + ai += 1 + bj += 1 + end + + bj += 1 + ai += 1 + + res << el + end + when Diff::LCS::Change + case action + when "-" + while ai < change.position + res << (string ? src[ai, 1] : src[ai]) + ai += 1 + bj += 1 + end + ai += 1 + when "+" + while bj < change.position + res << (string ? src[ai, 1] : src[ai]) + ai += 1 + bj += 1 + end + + bj += 1 + + res << change.element + end + end + end + + while ai < src.size + res << (string ? src[ai, 1] : src[ai]) + ai += 1 + bj += 1 + end + + res + end + + # Given a set of patchset, convert the current version to the prior version. + # Does no auto-discovery. + def unpatch!(src, patchset) + patch(src, patchset, :unpatch) + end + + # Given a set of patchset, convert the current version to the next version. + # Does no auto-discovery. + def patch!(src, patchset) + patch(src, patchset, :patch) + end +end + +require "diff/lcs/backports" diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/array.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/array.rb new file mode 100644 index 0000000..663918a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/array.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +require "diff/lcs" + +class Array + include Diff::LCS +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/backports.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/backports.rb new file mode 100644 index 0000000..6543c8a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/backports.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +unless 0.respond_to?(:positive?) + class Fixnum # standard:disable Lint/UnifiedInteger + def positive? + self > 0 + end + + def negative? + self < 0 + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/block.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/block.rb new file mode 100644 index 0000000..226ed6f --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/block.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +# A block is an operation removing, adding, or changing a group of items. +# Basically, this is just a list of changes, where each change adds or +# deletes a single item. Used by bin/ldiff. +class Diff::LCS::Block + attr_reader :changes, :insert, :remove + + def initialize(chunk) + @changes = [] + @insert = [] + @remove = [] + + chunk.each do |item| + @changes << item + @remove << item if item.deleting? + @insert << item if item.adding? + end + end + + def diff_size + @insert.size - @remove.size + end + + def op + case [@remove.empty?, @insert.empty?] + when [false, false] + "!" + when [false, true] + "-" + when [true, false] + "+" + else # [true, true] + "^" + end + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/callbacks.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/callbacks.rb new file mode 100644 index 0000000..2c5a779 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/callbacks.rb @@ -0,0 +1,327 @@ +# frozen_string_literal: true + +require "diff/lcs/change" + +module Diff::LCS + # This callback object implements the default set of callback events, + # which only returns the event itself. Note that #finished_a and + # #finished_b are not implemented -- I haven't yet figured out where they + # would be useful. + # + # Note that this is intended to be called as is, e.g., + # + # Diff::LCS.LCS(seq1, seq2, Diff::LCS::DefaultCallbacks) + class DefaultCallbacks + class << self + # Called when two items match. + def match(event) + event + end + + # Called when the old value is discarded in favour of the new value. + def discard_a(event) + event + end + + # Called when the new value is discarded in favour of the old value. + def discard_b(event) + event + end + + # Called when both the old and new values have changed. + def change(event) + event + end + + private :new + end + end + + # An alias for DefaultCallbacks that is used in + # Diff::LCS#traverse_sequences. + # + # Diff::LCS.LCS(seq1, seq2, Diff::LCS::SequenceCallbacks) + SequenceCallbacks = DefaultCallbacks + + # An alias for DefaultCallbacks that is used in + # Diff::LCS#traverse_balanced. + # + # Diff::LCS.LCS(seq1, seq2, Diff::LCS::BalancedCallbacks) + BalancedCallbacks = DefaultCallbacks + + def self.callbacks_for(callbacks) + callbacks.new + rescue + callbacks + end +end + +# This will produce a compound array of simple diff change objects. Each +# element in the #diffs array is a +hunk+ or +hunk+ array, where each +# element in each +hunk+ array is a single Change object representing the +# addition or removal of a single element from one of the two tested +# sequences. The +hunk+ provides the full context for the changes. +# +# diffs = Diff::LCS.diff(seq1, seq2) +# # This example shows a simplified array format. +# # [ [ [ '-', 0, 'a' ] ], # 1 +# # [ [ '+', 2, 'd' ] ], # 2 +# # [ [ '-', 4, 'h' ], # 3 +# # [ '+', 4, 'f' ] ], +# # [ [ '+', 6, 'k' ] ], # 4 +# # [ [ '-', 8, 'n' ], # 5 +# # [ '-', 9, 'p' ], +# # [ '+', 9, 'r' ], +# # [ '+', 10, 's' ], +# # [ '+', 11, 't' ] ] ] +# +# There are five hunks here. The first hunk says that the +a+ at position 0 +# of the first sequence should be deleted ('-'). The second hunk +# says that the +d+ at position 2 of the second sequence should be inserted +# ('+'). The third hunk says that the +h+ at position 4 of the +# first sequence should be removed and replaced with the +f+ from position 4 +# of the second sequence. The other two hunks are described similarly. +# +# === Use +# +# This callback object must be initialised and is used by the Diff::LCS#diff +# method. +# +# cbo = Diff::LCS::DiffCallbacks.new +# Diff::LCS.LCS(seq1, seq2, cbo) +# cbo.finish +# +# Note that the call to #finish is absolutely necessary, or the last set of +# changes will not be visible. Alternatively, can be used as: +# +# cbo = Diff::LCS::DiffCallbacks.new { |tcbo| Diff::LCS.LCS(seq1, seq2, tcbo) } +# +# The necessary #finish call will be made. +# +# === Simplified Array Format +# +# The simplified array format used in the example above can be obtained +# with: +# +# require 'pp' +# pp diffs.map { |e| e.map { |f| f.to_a } } +class Diff::LCS::DiffCallbacks + # Returns the difference set collected during the diff process. + attr_reader :diffs + + def initialize # :yields: self + @hunk = [] + @diffs = [] + + return unless block_given? + + begin + yield self + ensure + finish + end + end + + # Finalizes the diff process. If an unprocessed hunk still exists, then it + # is appended to the diff list. + def finish + finish_hunk + end + + def match(_event) + finish_hunk + end + + def discard_a(event) + @hunk << Diff::LCS::Change.new("-", event.old_position, event.old_element) + end + + def discard_b(event) + @hunk << Diff::LCS::Change.new("+", event.new_position, event.new_element) + end + + def finish_hunk + @diffs << @hunk unless @hunk.empty? + @hunk = [] + end + private :finish_hunk +end + +# This will produce a compound array of contextual diff change objects. Each +# element in the #diffs array is a "hunk" array, where each element in each +# "hunk" array is a single change. Each change is a Diff::LCS::ContextChange +# that contains both the old index and new index values for the change. The +# "hunk" provides the full context for the changes. Both old and new objects +# will be presented for changed objects. +nil+ will be substituted for a +# discarded object. +# +# seq1 = %w(a b c e h j l m n p) +# seq2 = %w(b c d e f j k l m r s t) +# +# diffs = Diff::LCS.diff(seq1, seq2, Diff::LCS::ContextDiffCallbacks) +# # This example shows a simplified array format. +# # [ [ [ '-', [ 0, 'a' ], [ 0, nil ] ] ], # 1 +# # [ [ '+', [ 3, nil ], [ 2, 'd' ] ] ], # 2 +# # [ [ '-', [ 4, 'h' ], [ 4, nil ] ], # 3 +# # [ '+', [ 5, nil ], [ 4, 'f' ] ] ], +# # [ [ '+', [ 6, nil ], [ 6, 'k' ] ] ], # 4 +# # [ [ '-', [ 8, 'n' ], [ 9, nil ] ], # 5 +# # [ '+', [ 9, nil ], [ 9, 'r' ] ], +# # [ '-', [ 9, 'p' ], [ 10, nil ] ], +# # [ '+', [ 10, nil ], [ 10, 's' ] ], +# # [ '+', [ 10, nil ], [ 11, 't' ] ] ] ] +# +# The five hunks shown are comprised of individual changes; if there is a +# related set of changes, they are still shown individually. +# +# This callback can also be used with Diff::LCS#sdiff, which will produce +# results like: +# +# diffs = Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextCallbacks) +# # This example shows a simplified array format. +# # [ [ [ "-", [ 0, "a" ], [ 0, nil ] ] ], # 1 +# # [ [ "+", [ 3, nil ], [ 2, "d" ] ] ], # 2 +# # [ [ "!", [ 4, "h" ], [ 4, "f" ] ] ], # 3 +# # [ [ "+", [ 6, nil ], [ 6, "k" ] ] ], # 4 +# # [ [ "!", [ 8, "n" ], [ 9, "r" ] ], # 5 +# # [ "!", [ 9, "p" ], [ 10, "s" ] ], +# # [ "+", [ 10, nil ], [ 11, "t" ] ] ] ] +# +# The five hunks are still present, but are significantly shorter in total +# presentation, because changed items are shown as changes ("!") instead of +# potentially "mismatched" pairs of additions and deletions. +# +# The result of this operation is similar to that of +# Diff::LCS::SDiffCallbacks. They may be compared as: +# +# s = Diff::LCS.sdiff(seq1, seq2).reject { |e| e.action == "=" } +# c = Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextDiffCallbacks).flatten(1) +# +# s == c # -> true +# +# === Use +# +# This callback object must be initialised and can be used by the +# Diff::LCS#diff or Diff::LCS#sdiff methods. +# +# cbo = Diff::LCS::ContextDiffCallbacks.new +# Diff::LCS.LCS(seq1, seq2, cbo) +# cbo.finish +# +# Note that the call to #finish is absolutely necessary, or the last set of +# changes will not be visible. Alternatively, can be used as: +# +# cbo = Diff::LCS::ContextDiffCallbacks.new { |tcbo| Diff::LCS.LCS(seq1, seq2, tcbo) } +# +# The necessary #finish call will be made. +# +# === Simplified Array Format +# +# The simplified array format used in the example above can be obtained +# with: +# +# require 'pp' +# pp diffs.map { |e| e.map { |f| f.to_a } } +class Diff::LCS::ContextDiffCallbacks < Diff::LCS::DiffCallbacks + def discard_a(event) + @hunk << Diff::LCS::ContextChange.simplify(event) + end + + def discard_b(event) + @hunk << Diff::LCS::ContextChange.simplify(event) + end + + def change(event) + @hunk << Diff::LCS::ContextChange.simplify(event) + end +end + +# This will produce a simple array of diff change objects. Each element in +# the #diffs array is a single ContextChange. In the set of #diffs provided +# by SDiffCallbacks, both old and new objects will be presented for both +# changed and unchanged objects. +nil+ will be substituted +# for a discarded object. +# +# The diffset produced by this callback, when provided to Diff::LCS#sdiff, +# will compute and display the necessary components to show two sequences +# and their minimized differences side by side, just like the Unix utility +# +sdiff+. +# +# same same +# before | after +# old < - +# - > new +# +# seq1 = %w(a b c e h j l m n p) +# seq2 = %w(b c d e f j k l m r s t) +# +# diffs = Diff::LCS.sdiff(seq1, seq2) +# # This example shows a simplified array format. +# # [ [ "-", [ 0, "a"], [ 0, nil ] ], +# # [ "=", [ 1, "b"], [ 0, "b" ] ], +# # [ "=", [ 2, "c"], [ 1, "c" ] ], +# # [ "+", [ 3, nil], [ 2, "d" ] ], +# # [ "=", [ 3, "e"], [ 3, "e" ] ], +# # [ "!", [ 4, "h"], [ 4, "f" ] ], +# # [ "=", [ 5, "j"], [ 5, "j" ] ], +# # [ "+", [ 6, nil], [ 6, "k" ] ], +# # [ "=", [ 6, "l"], [ 7, "l" ] ], +# # [ "=", [ 7, "m"], [ 8, "m" ] ], +# # [ "!", [ 8, "n"], [ 9, "r" ] ], +# # [ "!", [ 9, "p"], [ 10, "s" ] ], +# # [ "+", [ 10, nil], [ 11, "t" ] ] ] +# +# The result of this operation is similar to that of +# Diff::LCS::ContextDiffCallbacks. They may be compared as: +# +# s = Diff::LCS.sdiff(seq1, seq2).reject { |e| e.action == "=" } +# c = Diff::LCS.sdiff(seq1, seq2, Diff::LCS::ContextDiffCallbacks).flatten(1) +# +# s == c # -> true +# +# === Use +# +# This callback object must be initialised and is used by the Diff::LCS#sdiff +# method. +# +# cbo = Diff::LCS::SDiffCallbacks.new +# Diff::LCS.LCS(seq1, seq2, cbo) +# +# As with the other initialisable callback objects, +# Diff::LCS::SDiffCallbacks can be initialised with a block. As there is no +# "fininishing" to be done, this has no effect on the state of the object. +# +# cbo = Diff::LCS::SDiffCallbacks.new { |tcbo| Diff::LCS.LCS(seq1, seq2, tcbo) } +# +# === Simplified Array Format +# +# The simplified array format used in the example above can be obtained +# with: +# +# require 'pp' +# pp diffs.map { |e| e.to_a } +class Diff::LCS::SDiffCallbacks + # Returns the difference set collected during the diff process. + attr_reader :diffs + + def initialize # :yields: self + @diffs = [] + yield self if block_given? + end + + def match(event) + @diffs << Diff::LCS::ContextChange.simplify(event) + end + + def discard_a(event) + @diffs << Diff::LCS::ContextChange.simplify(event) + end + + def discard_b(event) + @diffs << Diff::LCS::ContextChange.simplify(event) + end + + def change(event) + @diffs << Diff::LCS::ContextChange.simplify(event) + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/change.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/change.rb new file mode 100644 index 0000000..714d78c --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/change.rb @@ -0,0 +1,174 @@ +# frozen_string_literal: true + +# Represents a simplistic (non-contextual) change. Represents the removal or +# addition of an element from either the old or the new sequenced +# enumerable. +class Diff::LCS::Change + IntClass = 1.class # Fixnum is deprecated in Ruby 2.4 # standard:disable Naming/ConstantName + + # The only actions valid for changes are '+' (add), '-' (delete), '=' + # (no change), '!' (changed), '<' (tail changes from first sequence), or + # '>' (tail changes from second sequence). The last two ('<>') are only + # found with Diff::LCS::diff and Diff::LCS::sdiff. + VALID_ACTIONS = %w[+ - = ! > <].freeze + + def self.valid_action?(action) + VALID_ACTIONS.include? action + end + + # Returns the action this Change represents. + attr_reader :action + + # Returns the position of the Change. + attr_reader :position + # Returns the sequence element of the Change. + attr_reader :element + + def initialize(*args) + @action, @position, @element = *args + + fail "Invalid Change Action '#{@action}'" unless Diff::LCS::Change.valid_action?(@action) + fail "Invalid Position Type" unless @position.is_a? IntClass + end + + def inspect(*_args) + "#<#{self.class}: #{to_a.inspect}>" + end + + def to_a + [@action, @position, @element] + end + + alias_method :to_ary, :to_a + + def self.from_a(arr) + arr = arr.flatten(1) + case arr.size + when 5 + Diff::LCS::ContextChange.new(*arr[0...5]) + when 3 + Diff::LCS::Change.new(*arr[0...3]) + else + fail "Invalid change array format provided." + end + end + + include Comparable + + def ==(other) + (self.class == other.class) and + (action == other.action) and + (position == other.position) and + (element == other.element) + end + + def <=>(other) + r = action <=> other.action + r = position <=> other.position if r.zero? + r = element <=> other.element if r.zero? + r + end + + def adding? + @action == "+" + end + + def deleting? + @action == "-" + end + + def unchanged? + @action == "=" + end + + def changed? + @action == "!" + end + + def finished_a? + @action == ">" + end + + def finished_b? + @action == "<" + end +end + +# Represents a contextual change. Contains the position and values of the +# elements in the old and the new sequenced enumerables as well as the action +# taken. +class Diff::LCS::ContextChange < Diff::LCS::Change + # We don't need these two values. + undef :position + undef :element + + # Returns the old position being changed. + attr_reader :old_position + # Returns the new position being changed. + attr_reader :new_position + # Returns the old element being changed. + attr_reader :old_element + # Returns the new element being changed. + attr_reader :new_element + + def initialize(*args) + @action, @old_position, @old_element, @new_position, @new_element = *args + + fail "Invalid Change Action '#{@action}'" unless Diff::LCS::Change.valid_action?(@action) + fail "Invalid (Old) Position Type" unless @old_position.nil? || @old_position.is_a?(IntClass) + fail "Invalid (New) Position Type" unless @new_position.nil? || @new_position.is_a?(IntClass) + end + + def to_a + [ + @action, + [@old_position, @old_element], + [@new_position, @new_element] + ] + end + + alias_method :to_ary, :to_a + + def self.from_a(arr) + Diff::LCS::Change.from_a(arr) + end + + # Simplifies a context change for use in some diff callbacks. '<' actions + # are converted to '-' and '>' actions are converted to '+'. + def self.simplify(event) + ea = event.to_a + + case ea[0] + when "-" + ea[2][1] = nil + when "<" + ea[0] = "-" + ea[2][1] = nil + when "+" + ea[1][1] = nil + when ">" + ea[0] = "+" + ea[1][1] = nil + end + + Diff::LCS::ContextChange.from_a(ea) + end + + def ==(other) + (self.class == other.class) and + (@action == other.action) and + (@old_position == other.old_position) and + (@new_position == other.new_position) and + (@old_element == other.old_element) and + (@new_element == other.new_element) + end + + def <=>(other) + r = @action <=> other.action + r = @old_position <=> other.old_position if r.zero? + r = @new_position <=> other.new_position if r.zero? + r = @old_element <=> other.old_element if r.zero? + r = @new_element <=> other.new_element if r.zero? + r + end +end diff --git a/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/htmldiff.rb b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/htmldiff.rb new file mode 100644 index 0000000..9073243 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/diff-lcs-1.6.2/lib/diff/lcs/htmldiff.rb @@ -0,0 +1,160 @@ +# frozen_string_literal: true + +require "erb" + +# Produce a simple HTML diff view. +class Diff::LCS::HTMLDiff + class << self + # standard:disable ThreadSafety/ClassAndModuleAttributes + attr_accessor :can_expand_tabs # :nodoc: + # standard:enable ThreadSafety/ClassAndModuleAttributes + end + self.can_expand_tabs = true + + class Callbacks # :nodoc: + attr_accessor :output + attr_accessor :match_class + attr_accessor :only_a_class + attr_accessor :only_b_class + + def initialize(output, options = {}) + @output = output + options ||= {} + + @match_class = options[:match_class] || "match" + @only_a_class = options[:only_a_class] || "only_a" + @only_b_class = options[:only_b_class] || "only_b" + end + + def htmlize(element, css_class) + element = " " if element.empty? + %(

i0 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 # +Date.jd(2451944) + #=> # +Date.ordinal(2001,34) + #=> # +Date.commercial(2001,5,6) + #=> # +Date.parse('2001-02-03') + #=> # +Date.strptime('03-02-2001', '%d-%m-%Y') + #=> # +Time.new(2001,2,3).to_date + #=> # +``` + +All `Date` objects are immutable; hence cannot modify themselves. + +The concept of a date object can be represented as a tuple of the day count, the offset and the day of calendar reform. + +The day count denotes the absolute position of a temporal dimension. The offset is relative adjustment, which determines decoded local time with the day count. The day of calendar reform denotes the start day of the new style. The old style of the West is the Julian calendar which was adopted by Caesar. The new style is the Gregorian calendar, which is the current civil calendar of many countries. + +The day count is virtually the astronomical Julian day number. The offset in this class is usually zero, and cannot be specified directly. + +A `Date` object can be created with an optional argument, the day of calendar reform as a Julian day number, which should be 2298874 to 2426355 or negative/positive infinity. The default value is `Date::ITALY` (2299161=1582-10-15). See also sample/cal.rb. + +``` +$ ruby sample/cal.rb -c it 10 1582 +October 1582 +S M Tu W Th F S +1 2 3 4 15 16 +17 18 19 20 21 22 23 +24 25 26 27 28 29 30 +31 +``` + +``` +$ ruby sample/cal.rb -c gb 9 1752 +September 1752 +S M Tu W Th F S +1 2 14 15 16 +17 18 19 20 21 22 23 +24 25 26 27 28 29 30 +``` + +A `Date` object has various methods. See each reference. + +```ruby +d = Date.parse('3rd Feb 2001') + #=> # +d.year #=> 2001 +d.mon #=> 2 +d.mday #=> 3 +d.wday #=> 6 +d += 1 #=> # +d.strftime('%a %d %b %Y') #=> "Sun 04 Feb 2001" +``` + +## Development + +After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. + +To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). + +## Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/date. + +## License + +The gem is available as open source under the terms of the [2-Clause BSD License](https://opensource.org/licenses/BSD-2-Clause). diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/Makefile b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/Makefile new file mode 100644 index 0000000..62ec5b0 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/Makefile @@ -0,0 +1,269 @@ + +SHELL = /bin/sh + +# V=0 quiet, V=1 verbose. other values don't work. +V = 0 +V0 = $(V:0=) +Q1 = $(V:1=) +Q = $(Q1:0=@) +ECHO1 = $(V:1=@ :) +ECHO = $(ECHO1:0=@ echo) +NULLCMD = : + +#### Start of system configuration section. #### + +srcdir = . +topdir = /usr/include/ruby-3.2.0 +hdrdir = $(topdir) +arch_hdrdir = /usr/include/x86_64-linux-gnu/ruby-3.2.0 +PATH_SEPARATOR = : +VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby +prefix = $(DESTDIR)/usr +rubysitearchprefix = $(sitearchlibdir)/$(RUBY_BASE_NAME) +rubyarchprefix = $(archlibdir)/$(RUBY_BASE_NAME) +rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) +exec_prefix = $(prefix) +vendorarchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/vendor_ruby +sitearchhdrdir = $(sitearchincludedir)/$(RUBY_VERSION_NAME)/site_ruby +rubyarchhdrdir = $(archincludedir)/$(RUBY_VERSION_NAME) +vendorhdrdir = $(rubyhdrdir)/vendor_ruby +sitehdrdir = $(rubyhdrdir)/site_ruby +rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) +vendorarchdir = $(rubysitearchprefix)/vendor_ruby/$(ruby_version) +vendorlibdir = $(vendordir)/$(ruby_version) +vendordir = $(rubylibprefix)/vendor_ruby +sitearchdir = $(DESTDIR)/usr/local/lib/x86_64-linux-gnu/site_ruby +sitelibdir = $(sitedir)/$(ruby_version) +sitedir = $(DESTDIR)/usr/local/lib/site_ruby +rubyarchdir = $(rubyarchprefix)/$(ruby_version) +rubylibdir = $(rubylibprefix)/$(ruby_version) +sitearchincludedir = $(includedir)/$(sitearch) +archincludedir = $(includedir)/$(arch) +sitearchlibdir = $(libdir)/$(sitearch) +archlibdir = $(libdir)/$(arch) +ridir = $(datarootdir)/$(RI_BASE_NAME) +mandir = $(datarootdir)/man +localedir = $(datarootdir)/locale +libdir = $(exec_prefix)/lib +psdir = $(docdir) +pdfdir = $(docdir) +dvidir = $(docdir) +htmldir = $(docdir) +infodir = $(datarootdir)/info +docdir = $(datarootdir)/doc/$(PACKAGE) +oldincludedir = $(DESTDIR)/usr/include +includedir = $(prefix)/include +runstatedir = $(DESTDIR)/var/run +localstatedir = $(DESTDIR)/var +sharedstatedir = $(prefix)/com +sysconfdir = $(DESTDIR)/etc +datadir = $(datarootdir) +datarootdir = $(prefix)/share +libexecdir = $(exec_prefix)/libexec +sbindir = $(exec_prefix)/sbin +bindir = $(exec_prefix)/bin +archdir = $(rubyarchdir) + + +CC_WRAPPER = +CC = x86_64-linux-gnu-gcc +CXX = x86_64-linux-gnu-g++ +LIBRUBY = $(LIBRUBY_SO) +LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a +LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) +LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static $(MAINLIBS) +empty = +OUTFLAG = -o $(empty) +COUTFLAG = -o $(empty) +CSRCFLAG = $(empty) + +RUBY_EXTCONF_H = +cflags = $(optflags) $(debugflags) $(warnflags) +cxxflags = +optflags = -O3 -fno-fast-math +debugflags = -ggdb3 +warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdiv-by-zero -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wold-style-definition -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef +cppflags = +CCDLFLAGS = -fPIC +CFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 -fPIC $(ARCH_FLAG) +INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) +DEFS = +CPPFLAGS = -DHAVE_RB_CATEGORY_WARN -DHAVE_TIMEZONE -Wdate-time -D_FORTIFY_SOURCE=3 $(DEFS) $(cppflags) +CXXFLAGS = $(CCDLFLAGS) -g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=BUILDDIR=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=BUILDDIR=/usr/src/ruby3.2-3.2.3-1ubuntu0.24.04.5 $(ARCH_FLAG) +ldflags = -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed +dldflags = -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now +ARCH_FLAG = +DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) +LDSHARED = $(CC) -shared +LDSHAREDXX = $(CXX) -shared +AR = x86_64-linux-gnu-gcc-ar +EXEEXT = + +RUBY_INSTALL_NAME = $(RUBY_BASE_NAME)3.2 +RUBY_SO_NAME = ruby-3.2 +RUBYW_INSTALL_NAME = +RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) +RUBYW_BASE_NAME = rubyw +RUBY_BASE_NAME = ruby + +arch = x86_64-linux-gnu +sitearch = $(arch) +ruby_version = 3.2.0 +ruby = $(bindir)/$(RUBY_BASE_NAME)3.2 +RUBY = $(ruby) +BUILTRUBY = $(bindir)/$(RUBY_BASE_NAME)3.2 +ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h + +RM = rm -f +RM_RF = rm -fr +RMDIRS = rmdir --ignore-fail-on-non-empty -p +MAKEDIRS = /bin/mkdir -p +INSTALL = /usr/bin/install -c +INSTALL_PROG = $(INSTALL) -m 0755 +INSTALL_DATA = $(INSTALL) -m 644 +COPY = cp +TOUCH = exit > + +#### End of system configuration section. #### + +preload = +libpath = . $(archlibdir) +LIBPATH = -L. -L$(archlibdir) +DEFFILE = + +CLEANFILES = mkmf.log +DISTCLEANFILES = +DISTCLEANDIRS = + +extout = +extout_prefix = +target_prefix = +LOCAL_LIBS = +LIBS = $(LIBRUBYARG_SHARED) -lm -lpthread -lc +ORIG_SRCS = date_core.c date_parse.c date_strftime.c date_strptime.c +SRCS = $(ORIG_SRCS) +OBJS = date_core.o date_parse.o date_strftime.o date_strptime.o +HDRS = $(srcdir)/date_tmx.h $(srcdir)/zonetab.h +LOCAL_HDRS = +TARGET = date_core +TARGET_NAME = date_core +TARGET_ENTRY = Init_$(TARGET_NAME) +DLLIB = $(TARGET).so +EXTSTATIC = +STATIC_LIB = + +TIMESTAMP_DIR = . +BINDIR = $(bindir) +RUBYCOMMONDIR = $(sitedir)$(target_prefix) +RUBYLIBDIR = $(sitelibdir)$(target_prefix) +RUBYARCHDIR = $(sitearchdir)$(target_prefix) +HDRDIR = $(sitehdrdir)$(target_prefix) +ARCHHDRDIR = $(sitearchhdrdir)$(target_prefix) +TARGET_SO_DIR = +TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) +CLEANLIBS = $(TARGET_SO) false +CLEANOBJS = $(OBJS) *.bak +TARGET_SO_DIR_TIMESTAMP = $(TIMESTAMP_DIR)/.sitearchdir.time + +all: $(DLLIB) +static: $(STATIC_LIB) +.PHONY: all install static install-so install-rb +.PHONY: clean clean-so clean-static clean-rb + +clean-static:: +clean-rb-default:: +clean-rb:: +clean-so:: +clean: clean-so clean-static clean-rb-default clean-rb + -$(Q)$(RM_RF) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time + +distclean-rb-default:: +distclean-rb:: +distclean-so:: +distclean-static:: +distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb + -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log + -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) + -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true + +realclean: distclean +install: install-so install-rb + +install-so: $(DLLIB) $(TARGET_SO_DIR_TIMESTAMP) + $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) +clean-static:: + -$(Q)$(RM) $(STATIC_LIB) +install-rb: pre-install-rb do-install-rb install-rb-default +install-rb-default: pre-install-rb-default do-install-rb-default +pre-install-rb: Makefile +pre-install-rb-default: Makefile +do-install-rb: +do-install-rb-default: +pre-install-rb-default: + @$(NULLCMD) +$(TARGET_SO_DIR_TIMESTAMP): + $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) + $(Q) $(TOUCH) $@ + +site-install: site-install-so site-install-rb +site-install-so: install-so +site-install-rb: install-rb + +.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S + +.cc.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cc.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.mm.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.mm.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cxx.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cxx.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cpp.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cpp.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.c.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.c.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.m.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.m.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +$(TARGET_SO): $(OBJS) Makefile + $(ECHO) linking shared-object $(DLLIB) + -$(Q)$(RM) $(@) + $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) + + + +$(OBJS): $(HDRS) $(ruby_headers) diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_core.c b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_core.c new file mode 100644 index 0000000..2e92539 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_core.c @@ -0,0 +1,10064 @@ +/* + date_core.c: Coded by Tadayoshi Funaba 2010-2014 +*/ + +#include "ruby.h" +#include "ruby/encoding.h" +#include "ruby/util.h" +#include +#include +#if defined(HAVE_SYS_TIME_H) +#include +#endif + +#undef NDEBUG +#define NDEBUG +#include + +#ifdef RUBY_EXTCONF_H +#include RUBY_EXTCONF_H +#endif + +#define USE_PACK + +static ID id_cmp, id_le_p, id_ge_p, id_eqeq_p; +static VALUE cDate, cDateTime; +static VALUE eDateError; +static VALUE half_days_in_day, day_in_nanoseconds; +static double positive_inf, negative_inf; + +// used by deconstruct_keys +static VALUE sym_year, sym_month, sym_day, sym_yday, sym_wday; +static VALUE sym_hour, sym_min, sym_sec, sym_sec_fraction, sym_zone; + +#define f_boolcast(x) ((x) ? Qtrue : Qfalse) + +#define f_abs(x) rb_funcall(x, rb_intern("abs"), 0) +#define f_negate(x) rb_funcall(x, rb_intern("-@"), 0) +#define f_add(x,y) rb_funcall(x, '+', 1, y) +#define f_sub(x,y) rb_funcall(x, '-', 1, y) +#define f_mul(x,y) rb_funcall(x, '*', 1, y) +#define f_div(x,y) rb_funcall(x, '/', 1, y) +#define f_quo(x,y) rb_funcall(x, rb_intern("quo"), 1, y) +#define f_idiv(x,y) rb_funcall(x, rb_intern("div"), 1, y) +#define f_mod(x,y) rb_funcall(x, '%', 1, y) +#define f_remainder(x,y) rb_funcall(x, rb_intern("remainder"), 1, y) +#define f_expt(x,y) rb_funcall(x, rb_intern("**"), 1, y) +#define f_floor(x) rb_funcall(x, rb_intern("floor"), 0) +#define f_ceil(x) rb_funcall(x, rb_intern("ceil"), 0) +#define f_truncate(x) rb_funcall(x, rb_intern("truncate"), 0) +#define f_round(x) rb_funcall(x, rb_intern("round"), 0) + +#define f_to_i(x) rb_funcall(x, rb_intern("to_i"), 0) +#define f_to_r(x) rb_funcall(x, rb_intern("to_r"), 0) +#define f_to_s(x) rb_funcall(x, rb_intern("to_s"), 0) +#define f_inspect(x) rb_funcall(x, rb_intern("inspect"), 0) + +#define f_add3(x,y,z) f_add(f_add(x, y), z) +#define f_sub3(x,y,z) f_sub(f_sub(x, y), z) + +#define f_frozen_ary(...) rb_ary_freeze(rb_ary_new3(__VA_ARGS__)) + +static VALUE date_initialize(int argc, VALUE *argv, VALUE self); +static VALUE datetime_initialize(int argc, VALUE *argv, VALUE self); + +#define RETURN_FALSE_UNLESS_NUMERIC(obj) if(!RTEST(rb_obj_is_kind_of((obj), rb_cNumeric))) return Qfalse +inline static void +check_numeric(VALUE obj, const char* field) +{ + if(!RTEST(rb_obj_is_kind_of(obj, rb_cNumeric))) { + rb_raise(rb_eTypeError, "invalid %s (not numeric)", field); + } +} + +inline static int +f_cmp(VALUE x, VALUE y) +{ + if (FIXNUM_P(x) && FIXNUM_P(y)) { + long c = FIX2LONG(x) - FIX2LONG(y); + if (c > 0) + return 1; + else if (c < 0) + return -1; + return 0; + } + return rb_cmpint(rb_funcallv(x, id_cmp, 1, &y), x, y); +} + +inline static VALUE +f_lt_p(VALUE x, VALUE y) +{ + if (FIXNUM_P(x) && FIXNUM_P(y)) + return f_boolcast(FIX2LONG(x) < FIX2LONG(y)); + return rb_funcall(x, '<', 1, y); +} + +inline static VALUE +f_gt_p(VALUE x, VALUE y) +{ + if (FIXNUM_P(x) && FIXNUM_P(y)) + return f_boolcast(FIX2LONG(x) > FIX2LONG(y)); + return rb_funcall(x, '>', 1, y); +} + +inline static VALUE +f_le_p(VALUE x, VALUE y) +{ + if (FIXNUM_P(x) && FIXNUM_P(y)) + return f_boolcast(FIX2LONG(x) <= FIX2LONG(y)); + return rb_funcall(x, id_le_p, 1, y); +} + +inline static VALUE +f_ge_p(VALUE x, VALUE y) +{ + if (FIXNUM_P(x) && FIXNUM_P(y)) + return f_boolcast(FIX2LONG(x) >= FIX2LONG(y)); + return rb_funcall(x, id_ge_p, 1, y); +} + +inline static VALUE +f_eqeq_p(VALUE x, VALUE y) +{ + if (FIXNUM_P(x) && FIXNUM_P(y)) + return f_boolcast(FIX2LONG(x) == FIX2LONG(y)); + return rb_funcall(x, id_eqeq_p, 1, y); +} + +inline static VALUE +f_zero_p(VALUE x) +{ + switch (TYPE(x)) { + case T_FIXNUM: + return f_boolcast(FIX2LONG(x) == 0); + case T_BIGNUM: + return Qfalse; + case T_RATIONAL: + { + VALUE num = rb_rational_num(x); + return f_boolcast(FIXNUM_P(num) && FIX2LONG(num) == 0); + } + } + return rb_funcall(x, id_eqeq_p, 1, INT2FIX(0)); +} + +#define f_nonzero_p(x) (!f_zero_p(x)) + +inline static VALUE +f_negative_p(VALUE x) +{ + if (FIXNUM_P(x)) + return f_boolcast(FIX2LONG(x) < 0); + return rb_funcall(x, '<', 1, INT2FIX(0)); +} + +#define f_positive_p(x) (!f_negative_p(x)) + +#define f_ajd(x) rb_funcall(x, rb_intern("ajd"), 0) +#define f_jd(x) rb_funcall(x, rb_intern("jd"), 0) +#define f_year(x) rb_funcall(x, rb_intern("year"), 0) +#define f_mon(x) rb_funcall(x, rb_intern("mon"), 0) +#define f_mday(x) rb_funcall(x, rb_intern("mday"), 0) +#define f_wday(x) rb_funcall(x, rb_intern("wday"), 0) +#define f_hour(x) rb_funcall(x, rb_intern("hour"), 0) +#define f_min(x) rb_funcall(x, rb_intern("min"), 0) +#define f_sec(x) rb_funcall(x, rb_intern("sec"), 0) + +/* copied from time.c */ +#define NDIV(x,y) (-(-((x)+1)/(y))-1) +#define NMOD(x,y) ((y)-(-((x)+1)%(y))-1) +#define DIV(n,d) ((n)<0 ? NDIV((n),(d)) : (n)/(d)) +#define MOD(n,d) ((n)<0 ? NMOD((n),(d)) : (n)%(d)) + +#define HAVE_JD (1 << 0) +#define HAVE_DF (1 << 1) +#define HAVE_CIVIL (1 << 2) +#define HAVE_TIME (1 << 3) +#define COMPLEX_DAT (1 << 7) + +#define have_jd_p(x) ((x)->flags & HAVE_JD) +#define have_df_p(x) ((x)->flags & HAVE_DF) +#define have_civil_p(x) ((x)->flags & HAVE_CIVIL) +#define have_time_p(x) ((x)->flags & HAVE_TIME) +#define complex_dat_p(x) ((x)->flags & COMPLEX_DAT) +#define simple_dat_p(x) (!complex_dat_p(x)) + +#define ITALY 2299161 /* 1582-10-15 */ +#define ENGLAND 2361222 /* 1752-09-14 */ +#define JULIAN positive_inf +#define GREGORIAN negative_inf +#define DEFAULT_SG ITALY + +#define UNIX_EPOCH_IN_CJD INT2FIX(2440588) /* 1970-01-01 */ + +#define MINUTE_IN_SECONDS 60 +#define HOUR_IN_SECONDS 3600 +#define DAY_IN_SECONDS 86400 +#define SECOND_IN_MILLISECONDS 1000 +#define SECOND_IN_NANOSECONDS 1000000000 + +#define JC_PERIOD0 1461 /* 365.25 * 4 */ +#define GC_PERIOD0 146097 /* 365.2425 * 400 */ +#define CM_PERIOD0 71149239 /* (lcm 7 1461 146097) */ +#define CM_PERIOD (0xfffffff / CM_PERIOD0 * CM_PERIOD0) +#define CM_PERIOD_JCY (CM_PERIOD / JC_PERIOD0 * 4) +#define CM_PERIOD_GCY (CM_PERIOD / GC_PERIOD0 * 400) + +#define REFORM_BEGIN_YEAR 1582 +#define REFORM_END_YEAR 1930 +#define REFORM_BEGIN_JD 2298874 /* ns 1582-01-01 */ +#define REFORM_END_JD 2426355 /* os 1930-12-31 */ + +#ifdef USE_PACK +#define SEC_WIDTH 6 +#define MIN_WIDTH 6 +#define HOUR_WIDTH 5 +#define MDAY_WIDTH 5 +#define MON_WIDTH 4 + +#define SEC_SHIFT 0 +#define MIN_SHIFT SEC_WIDTH +#define HOUR_SHIFT (MIN_WIDTH + SEC_WIDTH) +#define MDAY_SHIFT (HOUR_WIDTH + MIN_WIDTH + SEC_WIDTH) +#define MON_SHIFT (MDAY_WIDTH + HOUR_WIDTH + MIN_WIDTH + SEC_WIDTH) + +#define PK_MASK(x) ((1 << (x)) - 1) + +#define EX_SEC(x) (((x) >> SEC_SHIFT) & PK_MASK(SEC_WIDTH)) +#define EX_MIN(x) (((x) >> MIN_SHIFT) & PK_MASK(MIN_WIDTH)) +#define EX_HOUR(x) (((x) >> HOUR_SHIFT) & PK_MASK(HOUR_WIDTH)) +#define EX_MDAY(x) (((x) >> MDAY_SHIFT) & PK_MASK(MDAY_WIDTH)) +#define EX_MON(x) (((x) >> MON_SHIFT) & PK_MASK(MON_WIDTH)) + +#define PACK5(m,d,h,min,s) \ + (((m) << MON_SHIFT) | ((d) << MDAY_SHIFT) |\ + ((h) << HOUR_SHIFT) | ((min) << MIN_SHIFT) | ((s) << SEC_SHIFT)) + +#define PACK2(m,d) \ + (((m) << MON_SHIFT) | ((d) << MDAY_SHIFT)) +#endif + +#ifdef HAVE_FLOAT_H +#include +#endif + +#if defined(FLT_RADIX) && defined(FLT_MANT_DIG) && FLT_RADIX == 2 && FLT_MANT_DIG > 22 +#define date_sg_t float +#else +#define date_sg_t double +#endif + +#define JULIAN_EPOCH_DATE "-4712-01-01" +#define JULIAN_EPOCH_DATETIME JULIAN_EPOCH_DATE "T00:00:00+00:00" +#define JULIAN_EPOCH_DATETIME_RFC3339 "Mon, 1 Jan -4712 00:00:00 +0000" +#define JULIAN_EPOCH_DATETIME_HTTPDATE "Mon, 01 Jan -4712 00:00:00 GMT" + +/* A set of nth, jd, df and sf denote ajd + 1/2. Each ajd begin at + * noon of GMT (assume equal to UTC). However, this begins at + * midnight. + */ + +struct SimpleDateData +{ + unsigned flags; + int jd; /* as utc */ + VALUE nth; /* not always canonicalized */ + date_sg_t sg; /* 2298874..2426355 or -/+oo -- at most 22 bits */ + /* decoded as utc=local */ + int year; /* truncated */ +#ifndef USE_PACK + int mon; + int mday; + /* hour is zero */ + /* min is zero */ + /* sec is zero */ +#else + /* packed civil */ + unsigned pc; +#endif +}; + +struct ComplexDateData +{ + unsigned flags; + int jd; /* as utc */ + VALUE nth; /* not always canonicalized */ + date_sg_t sg; /* 2298874..2426355 or -/+oo -- at most 22 bits */ + /* decoded as local */ + int year; /* truncated */ +#ifndef USE_PACK + int mon; + int mday; + int hour; + int min; + int sec; +#else + /* packed civil */ + unsigned pc; +#endif + int df; /* as utc, in secs */ + int of; /* in secs */ + VALUE sf; /* in nano secs */ +}; + +union DateData { + unsigned flags; + struct SimpleDateData s; + struct ComplexDateData c; +}; + +#define get_d1(x)\ + union DateData *dat;\ + TypedData_Get_Struct(x, union DateData, &d_lite_type, dat); + +#define get_d1a(x)\ + union DateData *adat;\ + TypedData_Get_Struct(x, union DateData, &d_lite_type, adat); + +#define get_d1b(x)\ + union DateData *bdat;\ + TypedData_Get_Struct(x, union DateData, &d_lite_type, bdat); + +#define get_d2(x,y)\ + union DateData *adat, *bdat;\ + TypedData_Get_Struct(x, union DateData, &d_lite_type, adat);\ + TypedData_Get_Struct(y, union DateData, &d_lite_type, bdat); + +inline static VALUE +canon(VALUE x) +{ + if (RB_TYPE_P(x, T_RATIONAL)) { + VALUE den = rb_rational_den(x); + if (FIXNUM_P(den) && FIX2LONG(den) == 1) + return rb_rational_num(x); + } + return x; +} + +#ifndef USE_PACK +#define set_to_simple(obj, x, _nth, _jd ,_sg, _year, _mon, _mday, _flags) \ +do {\ + RB_OBJ_WRITE((obj), &(x)->nth, canon(_nth)); \ + (x)->jd = _jd;\ + (x)->sg = (date_sg_t)(_sg);\ + (x)->year = _year;\ + (x)->mon = _mon;\ + (x)->mday = _mday;\ + (x)->flags = (_flags) & ~COMPLEX_DAT;\ +} while (0) +#else +#define set_to_simple(obj, x, _nth, _jd ,_sg, _year, _mon, _mday, _flags) \ +do {\ + RB_OBJ_WRITE((obj), &(x)->nth, canon(_nth)); \ + (x)->jd = _jd;\ + (x)->sg = (date_sg_t)(_sg);\ + (x)->year = _year;\ + (x)->pc = PACK2(_mon, _mday);\ + (x)->flags = (_flags) & ~COMPLEX_DAT;\ +} while (0) +#endif + +#ifndef USE_PACK +#define set_to_complex(obj, x, _nth, _jd ,_df, _sf, _of, _sg,\ +_year, _mon, _mday, _hour, _min, _sec, _flags) \ +do {\ + RB_OBJ_WRITE((obj), &(x)->nth, canon(_nth));\ + (x)->jd = _jd;\ + (x)->df = _df;\ + RB_OBJ_WRITE((obj), &(x)->sf, canon(_sf));\ + (x)->of = _of;\ + (x)->sg = (date_sg_t)(_sg);\ + (x)->year = _year;\ + (x)->mon = _mon;\ + (x)->mday = _mday;\ + (x)->hour = _hour;\ + (x)->min = _min;\ + (x)->sec = _sec;\ + (x)->flags = (_flags) | COMPLEX_DAT;\ +} while (0) +#else +#define set_to_complex(obj, x, _nth, _jd ,_df, _sf, _of, _sg,\ +_year, _mon, _mday, _hour, _min, _sec, _flags) \ +do {\ + RB_OBJ_WRITE((obj), &(x)->nth, canon(_nth));\ + (x)->jd = _jd;\ + (x)->df = _df;\ + RB_OBJ_WRITE((obj), &(x)->sf, canon(_sf));\ + (x)->of = _of;\ + (x)->sg = (date_sg_t)(_sg);\ + (x)->year = _year;\ + (x)->pc = PACK5(_mon, _mday, _hour, _min, _sec);\ + (x)->flags = (_flags) | COMPLEX_DAT;\ +} while (0) +#endif + +#ifndef USE_PACK +#define copy_simple_to_complex(obj, x, y) \ +do {\ + RB_OBJ_WRITE((obj), &(x)->nth, (y)->nth);\ + (x)->jd = (y)->jd;\ + (x)->df = 0;\ + (x)->sf = INT2FIX(0);\ + (x)->of = 0;\ + (x)->sg = (date_sg_t)((y)->sg);\ + (x)->year = (y)->year;\ + (x)->mon = (y)->mon;\ + (x)->mday = (y)->mday;\ + (x)->hour = 0;\ + (x)->min = 0;\ + (x)->sec = 0;\ + (x)->flags = (y)->flags;\ +} while (0) +#else +#define copy_simple_to_complex(obj, x, y) \ +do {\ + RB_OBJ_WRITE((obj), &(x)->nth, (y)->nth);\ + (x)->jd = (y)->jd;\ + (x)->df = 0;\ + RB_OBJ_WRITE((obj), &(x)->sf, INT2FIX(0));\ + (x)->of = 0;\ + (x)->sg = (date_sg_t)((y)->sg);\ + (x)->year = (y)->year;\ + (x)->pc = PACK5(EX_MON((y)->pc), EX_MDAY((y)->pc), 0, 0, 0);\ + (x)->flags = (y)->flags;\ +} while (0) +#endif + +#ifndef USE_PACK +#define copy_complex_to_simple(obj, x, y) \ +do {\ + RB_OBJ_WRITE((obj), &(x)->nth, (y)->nth);\ + (x)->jd = (y)->jd;\ + (x)->sg = (date_sg_t)((y)->sg);\ + (x)->year = (y)->year;\ + (x)->mon = (y)->mon;\ + (x)->mday = (y)->mday;\ + (x)->flags = (y)->flags;\ +} while (0) +#else +#define copy_complex_to_simple(obj, x, y) \ +do {\ + RB_OBJ_WRITE((obj), &(x)->nth, (y)->nth);\ + (x)->jd = (y)->jd;\ + (x)->sg = (date_sg_t)((y)->sg);\ + (x)->year = (y)->year;\ + (x)->pc = PACK2(EX_MON((y)->pc), EX_MDAY((y)->pc));\ + (x)->flags = (y)->flags;\ +} while (0) +#endif + +/* base */ + +static int c_valid_civil_p(int, int, int, double, + int *, int *, int *, int *); + +static int +c_find_fdoy(int y, double sg, int *rjd, int *ns) +{ + int d, rm, rd; + + for (d = 1; d < 31; d++) + if (c_valid_civil_p(y, 1, d, sg, &rm, &rd, rjd, ns)) + return 1; + return 0; +} + +static int +c_find_ldoy(int y, double sg, int *rjd, int *ns) +{ + int i, rm, rd; + + for (i = 0; i < 30; i++) + if (c_valid_civil_p(y, 12, 31 - i, sg, &rm, &rd, rjd, ns)) + return 1; + return 0; +} + +#ifndef NDEBUG +/* :nodoc: */ +static int +c_find_fdom(int y, int m, double sg, int *rjd, int *ns) +{ + int d, rm, rd; + + for (d = 1; d < 31; d++) + if (c_valid_civil_p(y, m, d, sg, &rm, &rd, rjd, ns)) + return 1; + return 0; +} +#endif + +static int +c_find_ldom(int y, int m, double sg, int *rjd, int *ns) +{ + int i, rm, rd; + + for (i = 0; i < 30; i++) + if (c_valid_civil_p(y, m, 31 - i, sg, &rm, &rd, rjd, ns)) + return 1; + return 0; +} + +static void +c_civil_to_jd(int y, int m, int d, double sg, int *rjd, int *ns) +{ + double a, b, jd; + + if (m <= 2) { + y -= 1; + m += 12; + } + a = floor(y / 100.0); + b = 2 - a + floor(a / 4.0); + jd = floor(365.25 * (y + 4716)) + + floor(30.6001 * (m + 1)) + + d + b - 1524; + if (jd < sg) { + jd -= b; + *ns = 0; + } + else + *ns = 1; + + *rjd = (int)jd; +} + +static void +c_jd_to_civil(int jd, double sg, int *ry, int *rm, int *rdom) +{ + double x, a, b, c, d, e, y, m, dom; + + if (jd < sg) + a = jd; + else { + x = floor((jd - 1867216.25) / 36524.25); + a = jd + 1 + x - floor(x / 4.0); + } + b = a + 1524; + c = floor((b - 122.1) / 365.25); + d = floor(365.25 * c); + e = floor((b - d) / 30.6001); + dom = b - d - floor(30.6001 * e); + if (e <= 13) { + m = e - 1; + y = c - 4716; + } + else { + m = e - 13; + y = c - 4715; + } + + *ry = (int)y; + *rm = (int)m; + *rdom = (int)dom; +} + +static void +c_ordinal_to_jd(int y, int d, double sg, int *rjd, int *ns) +{ + int ns2; + + c_find_fdoy(y, sg, rjd, &ns2); + *rjd += d - 1; + *ns = (*rjd < sg) ? 0 : 1; +} + +static void +c_jd_to_ordinal(int jd, double sg, int *ry, int *rd) +{ + int rm2, rd2, rjd, ns; + + c_jd_to_civil(jd, sg, ry, &rm2, &rd2); + c_find_fdoy(*ry, sg, &rjd, &ns); + *rd = (jd - rjd) + 1; +} + +static void +c_commercial_to_jd(int y, int w, int d, double sg, int *rjd, int *ns) +{ + int rjd2, ns2; + + c_find_fdoy(y, sg, &rjd2, &ns2); + rjd2 += 3; + *rjd = + (rjd2 - MOD((rjd2 - 1) + 1, 7)) + + 7 * (w - 1) + + (d - 1); + *ns = (*rjd < sg) ? 0 : 1; +} + +static void +c_jd_to_commercial(int jd, double sg, int *ry, int *rw, int *rd) +{ + int ry2, rm2, rd2, a, rjd2, ns2; + + c_jd_to_civil(jd - 3, sg, &ry2, &rm2, &rd2); + a = ry2; + c_commercial_to_jd(a + 1, 1, 1, sg, &rjd2, &ns2); + if (jd >= rjd2) + *ry = a + 1; + else { + c_commercial_to_jd(a, 1, 1, sg, &rjd2, &ns2); + *ry = a; + } + *rw = 1 + DIV(jd - rjd2, 7); + *rd = MOD(jd + 1, 7); + if (*rd == 0) + *rd = 7; +} + +static void +c_weeknum_to_jd(int y, int w, int d, int f, double sg, int *rjd, int *ns) +{ + int rjd2, ns2; + + c_find_fdoy(y, sg, &rjd2, &ns2); + rjd2 += 6; + *rjd = (rjd2 - MOD(((rjd2 - f) + 1), 7) - 7) + 7 * w + d; + *ns = (*rjd < sg) ? 0 : 1; +} + +static void +c_jd_to_weeknum(int jd, int f, double sg, int *ry, int *rw, int *rd) +{ + int rm, rd2, rjd, ns, j; + + c_jd_to_civil(jd, sg, ry, &rm, &rd2); + c_find_fdoy(*ry, sg, &rjd, &ns); + rjd += 6; + j = jd - (rjd - MOD((rjd - f) + 1, 7)) + 7; + *rw = (int)DIV(j, 7); + *rd = (int)MOD(j, 7); +} + +#ifndef NDEBUG +/* :nodoc: */ +static void +c_nth_kday_to_jd(int y, int m, int n, int k, double sg, int *rjd, int *ns) +{ + int rjd2, ns2; + + if (n > 0) { + c_find_fdom(y, m, sg, &rjd2, &ns2); + rjd2 -= 1; + } + else { + c_find_ldom(y, m, sg, &rjd2, &ns2); + rjd2 += 7; + } + *rjd = (rjd2 - MOD((rjd2 - k) + 1, 7)) + 7 * n; + *ns = (*rjd < sg) ? 0 : 1; +} +#endif + +inline static int +c_jd_to_wday(int jd) +{ + return MOD(jd + 1, 7); +} + +#ifndef NDEBUG +/* :nodoc: */ +static void +c_jd_to_nth_kday(int jd, double sg, int *ry, int *rm, int *rn, int *rk) +{ + int rd, rjd, ns2; + + c_jd_to_civil(jd, sg, ry, rm, &rd); + c_find_fdom(*ry, *rm, sg, &rjd, &ns2); + *rn = DIV(jd - rjd, 7) + 1; + *rk = c_jd_to_wday(jd); +} +#endif + +static int +c_valid_ordinal_p(int y, int d, double sg, + int *rd, int *rjd, int *ns) +{ + int ry2, rd2; + + if (d < 0) { + int rjd2, ns2; + + if (!c_find_ldoy(y, sg, &rjd2, &ns2)) + return 0; + c_jd_to_ordinal(rjd2 + d + 1, sg, &ry2, &rd2); + if (ry2 != y) + return 0; + d = rd2; + } + c_ordinal_to_jd(y, d, sg, rjd, ns); + c_jd_to_ordinal(*rjd, sg, &ry2, &rd2); + if (ry2 != y || rd2 != d) + return 0; + return 1; +} + +static const int monthtab[2][13] = { + { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, + { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } +}; + +inline static int +c_julian_leap_p(int y) +{ + return MOD(y, 4) == 0; +} + +inline static int +c_gregorian_leap_p(int y) +{ + return (MOD(y, 4) == 0 && y % 100 != 0) || MOD(y, 400) == 0; +} + +static int +c_julian_last_day_of_month(int y, int m) +{ + assert(m >= 1 && m <= 12); + return monthtab[c_julian_leap_p(y) ? 1 : 0][m]; +} + +static int +c_gregorian_last_day_of_month(int y, int m) +{ + assert(m >= 1 && m <= 12); + return monthtab[c_gregorian_leap_p(y) ? 1 : 0][m]; +} + +static int +c_valid_julian_p(int y, int m, int d, int *rm, int *rd) +{ + int last; + + if (m < 0) + m += 13; + if (m < 1 || m > 12) + return 0; + last = c_julian_last_day_of_month(y, m); + if (d < 0) + d = last + d + 1; + if (d < 1 || d > last) + return 0; + *rm = m; + *rd = d; + return 1; +} + +static int +c_valid_gregorian_p(int y, int m, int d, int *rm, int *rd) +{ + int last; + + if (m < 0) + m += 13; + if (m < 1 || m > 12) + return 0; + last = c_gregorian_last_day_of_month(y, m); + if (d < 0) + d = last + d + 1; + if (d < 1 || d > last) + return 0; + *rm = m; + *rd = d; + return 1; +} + +static int +c_valid_civil_p(int y, int m, int d, double sg, + int *rm, int *rd, int *rjd, int *ns) +{ + int ry; + + if (m < 0) + m += 13; + if (m < 1 || m > 12) + return 0; + if (d < 0) { + if (!c_find_ldom(y, m, sg, rjd, ns)) + return 0; + c_jd_to_civil(*rjd + d + 1, sg, &ry, rm, rd); + if (ry != y || *rm != m) + return 0; + d = *rd; + } + c_civil_to_jd(y, m, d, sg, rjd, ns); + c_jd_to_civil(*rjd, sg, &ry, rm, rd); + if (ry != y || *rm != m || *rd != d) + return 0; + return 1; +} + +static int +c_valid_commercial_p(int y, int w, int d, double sg, + int *rw, int *rd, int *rjd, int *ns) +{ + int ns2, ry2, rw2, rd2; + + if (d < 0) + d += 8; + if (w < 0) { + int rjd2; + + c_commercial_to_jd(y + 1, 1, 1, sg, &rjd2, &ns2); + c_jd_to_commercial(rjd2 + w * 7, sg, &ry2, &rw2, &rd2); + if (ry2 != y) + return 0; + w = rw2; + } + c_commercial_to_jd(y, w, d, sg, rjd, ns); + c_jd_to_commercial(*rjd, sg, &ry2, rw, rd); + if (y != ry2 || w != *rw || d != *rd) + return 0; + return 1; +} + +static int +c_valid_weeknum_p(int y, int w, int d, int f, double sg, + int *rw, int *rd, int *rjd, int *ns) +{ + int ns2, ry2, rw2, rd2; + + if (d < 0) + d += 7; + if (w < 0) { + int rjd2; + + c_weeknum_to_jd(y + 1, 1, f, f, sg, &rjd2, &ns2); + c_jd_to_weeknum(rjd2 + w * 7, f, sg, &ry2, &rw2, &rd2); + if (ry2 != y) + return 0; + w = rw2; + } + c_weeknum_to_jd(y, w, d, f, sg, rjd, ns); + c_jd_to_weeknum(*rjd, f, sg, &ry2, rw, rd); + if (y != ry2 || w != *rw || d != *rd) + return 0; + return 1; +} + +#ifndef NDEBUG +/* :nodoc: */ +static int +c_valid_nth_kday_p(int y, int m, int n, int k, double sg, + int *rm, int *rn, int *rk, int *rjd, int *ns) +{ + int ns2, ry2, rm2, rn2, rk2; + + if (k < 0) + k += 7; + if (n < 0) { + int t, ny, nm, rjd2; + + t = y * 12 + m; + ny = DIV(t, 12); + nm = MOD(t, 12) + 1; + + c_nth_kday_to_jd(ny, nm, 1, k, sg, &rjd2, &ns2); + c_jd_to_nth_kday(rjd2 + n * 7, sg, &ry2, &rm2, &rn2, &rk2); + if (ry2 != y || rm2 != m) + return 0; + n = rn2; + } + c_nth_kday_to_jd(y, m, n, k, sg, rjd, ns); + c_jd_to_nth_kday(*rjd, sg, &ry2, rm, rn, rk); + if (y != ry2 || m != *rm || n != *rn || k != *rk) + return 0; + return 1; +} +#endif + +static int +c_valid_time_p(int h, int min, int s, int *rh, int *rmin, int *rs) +{ + if (h < 0) + h += 24; + if (min < 0) + min += 60; + if (s < 0) + s += 60; + *rh = h; + *rmin = min; + *rs = s; + return !(h < 0 || h > 24 || + min < 0 || min > 59 || + s < 0 || s > 59 || + (h == 24 && (min > 0 || s > 0))); +} + +inline static int +c_valid_start_p(double sg) +{ + if (isnan(sg)) + return 0; + if (isinf(sg)) + return 1; + if (sg < REFORM_BEGIN_JD || sg > REFORM_END_JD) + return 0; + return 1; +} + +inline static int +df_local_to_utc(int df, int of) +{ + df -= of; + if (df < 0) + df += DAY_IN_SECONDS; + else if (df >= DAY_IN_SECONDS) + df -= DAY_IN_SECONDS; + return df; +} + +inline static int +df_utc_to_local(int df, int of) +{ + df += of; + if (df < 0) + df += DAY_IN_SECONDS; + else if (df >= DAY_IN_SECONDS) + df -= DAY_IN_SECONDS; + return df; +} + +inline static int +jd_local_to_utc(int jd, int df, int of) +{ + df -= of; + if (df < 0) + jd -= 1; + else if (df >= DAY_IN_SECONDS) + jd += 1; + return jd; +} + +inline static int +jd_utc_to_local(int jd, int df, int of) +{ + df += of; + if (df < 0) + jd -= 1; + else if (df >= DAY_IN_SECONDS) + jd += 1; + return jd; +} + +inline static int +time_to_df(int h, int min, int s) +{ + return h * HOUR_IN_SECONDS + min * MINUTE_IN_SECONDS + s; +} + +inline static void +df_to_time(int df, int *h, int *min, int *s) +{ + *h = df / HOUR_IN_SECONDS; + df %= HOUR_IN_SECONDS; + *min = df / MINUTE_IN_SECONDS; + *s = df % MINUTE_IN_SECONDS; +} + +static VALUE +sec_to_day(VALUE s) +{ + if (FIXNUM_P(s)) + return rb_rational_new2(s, INT2FIX(DAY_IN_SECONDS)); + return f_quo(s, INT2FIX(DAY_IN_SECONDS)); +} + +inline static VALUE +isec_to_day(int s) +{ + return sec_to_day(INT2FIX(s)); +} + +static VALUE +ns_to_day(VALUE n) +{ + if (FIXNUM_P(n)) + return rb_rational_new2(n, day_in_nanoseconds); + return f_quo(n, day_in_nanoseconds); +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +ms_to_sec(VALUE m) +{ + if (FIXNUM_P(m)) + return rb_rational_new2(m, INT2FIX(SECOND_IN_MILLISECONDS)); + return f_quo(m, INT2FIX(SECOND_IN_MILLISECONDS)); +} +#endif + +static VALUE +ns_to_sec(VALUE n) +{ + if (FIXNUM_P(n)) + return rb_rational_new2(n, INT2FIX(SECOND_IN_NANOSECONDS)); + return f_quo(n, INT2FIX(SECOND_IN_NANOSECONDS)); +} + +#ifndef NDEBUG +/* :nodoc: */ +inline static VALUE +ins_to_day(int n) +{ + return ns_to_day(INT2FIX(n)); +} +#endif + +static int +safe_mul_p(VALUE x, long m) +{ + long ix; + + if (!FIXNUM_P(x)) + return 0; + ix = FIX2LONG(x); + if (ix < 0) { + if (ix <= (FIXNUM_MIN / m)) + return 0; + } + else { + if (ix >= (FIXNUM_MAX / m)) + return 0; + } + return 1; +} + +static VALUE +day_to_sec(VALUE d) +{ + if (safe_mul_p(d, DAY_IN_SECONDS)) + return LONG2FIX(FIX2LONG(d) * DAY_IN_SECONDS); + return f_mul(d, INT2FIX(DAY_IN_SECONDS)); +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +day_to_ns(VALUE d) +{ + return f_mul(d, day_in_nanoseconds); +} +#endif + +static VALUE +sec_to_ms(VALUE s) +{ + if (safe_mul_p(s, SECOND_IN_MILLISECONDS)) + return LONG2FIX(FIX2LONG(s) * SECOND_IN_MILLISECONDS); + return f_mul(s, INT2FIX(SECOND_IN_MILLISECONDS)); +} + +static VALUE +sec_to_ns(VALUE s) +{ + if (safe_mul_p(s, SECOND_IN_NANOSECONDS)) + return LONG2FIX(FIX2LONG(s) * SECOND_IN_NANOSECONDS); + return f_mul(s, INT2FIX(SECOND_IN_NANOSECONDS)); +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +isec_to_ns(int s) +{ + return sec_to_ns(INT2FIX(s)); +} +#endif + +static VALUE +div_day(VALUE d, VALUE *f) +{ + if (f) + *f = f_mod(d, INT2FIX(1)); + return f_floor(d); +} + +static VALUE +div_df(VALUE d, VALUE *f) +{ + VALUE s = day_to_sec(d); + + if (f) + *f = f_mod(s, INT2FIX(1)); + return f_floor(s); +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +div_sf(VALUE s, VALUE *f) +{ + VALUE n = sec_to_ns(s); + + if (f) + *f = f_mod(n, INT2FIX(1)); + return f_floor(n); +} +#endif + +static void +decode_day(VALUE d, VALUE *jd, VALUE *df, VALUE *sf) +{ + VALUE f; + + *jd = div_day(d, &f); + *df = div_df(f, &f); + *sf = sec_to_ns(f); +} + +inline static double +s_virtual_sg(union DateData *x) +{ + if (isinf(x->s.sg)) + return x->s.sg; + if (f_zero_p(x->s.nth)) + return x->s.sg; + else if (f_negative_p(x->s.nth)) + return positive_inf; + return negative_inf; +} + +inline static double +c_virtual_sg(union DateData *x) +{ + if (isinf(x->c.sg)) + return x->c.sg; + if (f_zero_p(x->c.nth)) + return x->c.sg; + else if (f_negative_p(x->c.nth)) + return positive_inf; + return negative_inf; +} + +inline static double +m_virtual_sg(union DateData *x) +{ + if (simple_dat_p(x)) + return s_virtual_sg(x); + else + return c_virtual_sg(x); +} + +#define canonicalize_jd(_nth, _jd) \ +do {\ + if (_jd < 0) {\ + _nth = f_sub(_nth, INT2FIX(1));\ + _jd += CM_PERIOD;\ + }\ + if (_jd >= CM_PERIOD) {\ + _nth = f_add(_nth, INT2FIX(1));\ + _jd -= CM_PERIOD;\ + }\ +} while (0) + +inline static void +canonicalize_s_jd(VALUE obj, union DateData *x) +{ + int j = x->s.jd; + VALUE nth = x->s.nth; + assert(have_jd_p(x)); + canonicalize_jd(nth, x->s.jd); + RB_OBJ_WRITE(obj, &x->s.nth, nth); + if (x->s.jd != j) + x->flags &= ~HAVE_CIVIL; +} + +inline static void +get_s_jd(union DateData *x) +{ + assert(simple_dat_p(x)); + if (!have_jd_p(x)) { + int jd, ns; + + assert(have_civil_p(x)); +#ifndef USE_PACK + c_civil_to_jd(x->s.year, x->s.mon, x->s.mday, + s_virtual_sg(x), &jd, &ns); +#else + c_civil_to_jd(x->s.year, EX_MON(x->s.pc), EX_MDAY(x->s.pc), + s_virtual_sg(x), &jd, &ns); +#endif + x->s.jd = jd; + x->s.flags |= HAVE_JD; + } +} + +inline static void +get_s_civil(union DateData *x) +{ + assert(simple_dat_p(x)); + if (!have_civil_p(x)) { + int y, m, d; + + assert(have_jd_p(x)); + c_jd_to_civil(x->s.jd, s_virtual_sg(x), &y, &m, &d); + x->s.year = y; +#ifndef USE_PACK + x->s.mon = m; + x->s.mday = d; +#else + x->s.pc = PACK2(m, d); +#endif + x->s.flags |= HAVE_CIVIL; + } +} + +inline static void +get_c_df(union DateData *x) +{ + assert(complex_dat_p(x)); + if (!have_df_p(x)) { + assert(have_time_p(x)); +#ifndef USE_PACK + x->c.df = df_local_to_utc(time_to_df(x->c.hour, x->c.min, x->c.sec), + x->c.of); +#else + x->c.df = df_local_to_utc(time_to_df(EX_HOUR(x->c.pc), + EX_MIN(x->c.pc), + EX_SEC(x->c.pc)), + x->c.of); +#endif + x->c.flags |= HAVE_DF; + } +} + +inline static void +get_c_time(union DateData *x) +{ + assert(complex_dat_p(x)); + if (!have_time_p(x)) { +#ifndef USE_PACK + int r; + assert(have_df_p(x)); + r = df_utc_to_local(x->c.df, x->c.of); + df_to_time(r, &x->c.hour, &x->c.min, &x->c.sec); + x->c.flags |= HAVE_TIME; +#else + int r, m, d, h, min, s; + + assert(have_df_p(x)); + m = EX_MON(x->c.pc); + d = EX_MDAY(x->c.pc); + r = df_utc_to_local(x->c.df, x->c.of); + df_to_time(r, &h, &min, &s); + x->c.pc = PACK5(m, d, h, min, s); + x->c.flags |= HAVE_TIME; +#endif + } +} + +inline static void +canonicalize_c_jd(VALUE obj, union DateData *x) +{ + int j = x->c.jd; + VALUE nth = x->c.nth; + assert(have_jd_p(x)); + canonicalize_jd(nth, x->c.jd); + RB_OBJ_WRITE(obj, &x->c.nth, nth); + if (x->c.jd != j) + x->flags &= ~HAVE_CIVIL; +} + +inline static void +get_c_jd(union DateData *x) +{ + assert(complex_dat_p(x)); + if (!have_jd_p(x)) { + int jd, ns; + + assert(have_civil_p(x)); +#ifndef USE_PACK + c_civil_to_jd(x->c.year, x->c.mon, x->c.mday, + c_virtual_sg(x), &jd, &ns); +#else + c_civil_to_jd(x->c.year, EX_MON(x->c.pc), EX_MDAY(x->c.pc), + c_virtual_sg(x), &jd, &ns); +#endif + + get_c_time(x); +#ifndef USE_PACK + x->c.jd = jd_local_to_utc(jd, + time_to_df(x->c.hour, x->c.min, x->c.sec), + x->c.of); +#else + x->c.jd = jd_local_to_utc(jd, + time_to_df(EX_HOUR(x->c.pc), + EX_MIN(x->c.pc), + EX_SEC(x->c.pc)), + x->c.of); +#endif + x->c.flags |= HAVE_JD; + } +} + +inline static void +get_c_civil(union DateData *x) +{ + assert(complex_dat_p(x)); + if (!have_civil_p(x)) { +#ifndef USE_PACK + int jd, y, m, d; +#else + int jd, y, m, d, h, min, s; +#endif + + assert(have_jd_p(x)); + get_c_df(x); + jd = jd_utc_to_local(x->c.jd, x->c.df, x->c.of); + c_jd_to_civil(jd, c_virtual_sg(x), &y, &m, &d); + x->c.year = y; +#ifndef USE_PACK + x->c.mon = m; + x->c.mday = d; +#else + h = EX_HOUR(x->c.pc); + min = EX_MIN(x->c.pc); + s = EX_SEC(x->c.pc); + x->c.pc = PACK5(m, d, h, min, s); +#endif + x->c.flags |= HAVE_CIVIL; + } +} + +inline static int +local_jd(union DateData *x) +{ + assert(complex_dat_p(x)); + assert(have_jd_p(x)); + assert(have_df_p(x)); + return jd_utc_to_local(x->c.jd, x->c.df, x->c.of); +} + +inline static int +local_df(union DateData *x) +{ + assert(complex_dat_p(x)); + assert(have_df_p(x)); + return df_utc_to_local(x->c.df, x->c.of); +} + +static void +decode_year(VALUE y, double style, + VALUE *nth, int *ry) +{ + int period; + VALUE t; + + period = (style < 0) ? + CM_PERIOD_GCY : + CM_PERIOD_JCY; + if (FIXNUM_P(y)) { + long iy, it, inth; + + iy = FIX2LONG(y); + if (iy >= (FIXNUM_MAX - 4712)) + goto big; + it = iy + 4712; /* shift */ + inth = DIV(it, ((long)period)); + *nth = LONG2FIX(inth); + if (inth) + it = MOD(it, ((long)period)); + *ry = (int)it - 4712; /* unshift */ + return; + } + big: + t = f_add(y, INT2FIX(4712)); /* shift */ + *nth = f_idiv(t, INT2FIX(period)); + if (f_nonzero_p(*nth)) + t = f_mod(t, INT2FIX(period)); + *ry = FIX2INT(t) - 4712; /* unshift */ +} + +static void +encode_year(VALUE nth, int y, double style, + VALUE *ry) +{ + int period; + VALUE t; + + period = (style < 0) ? + CM_PERIOD_GCY : + CM_PERIOD_JCY; + if (f_zero_p(nth)) + *ry = INT2FIX(y); + else { + t = f_mul(INT2FIX(period), nth); + t = f_add(t, INT2FIX(y)); + *ry = t; + } +} + +static void +decode_jd(VALUE jd, VALUE *nth, int *rjd) +{ + *nth = f_idiv(jd, INT2FIX(CM_PERIOD)); + if (f_zero_p(*nth)) { + *rjd = FIX2INT(jd); + return; + } + *rjd = FIX2INT(f_mod(jd, INT2FIX(CM_PERIOD))); +} + +static void +encode_jd(VALUE nth, int jd, VALUE *rjd) +{ + if (f_zero_p(nth)) { + *rjd = INT2FIX(jd); + return; + } + *rjd = f_add(f_mul(INT2FIX(CM_PERIOD), nth), INT2FIX(jd)); +} + +inline static double +guess_style(VALUE y, double sg) /* -/+oo or zero */ +{ + double style = 0; + + if (isinf(sg)) + style = sg; + else if (!FIXNUM_P(y)) + style = f_positive_p(y) ? negative_inf : positive_inf; + else { + long iy = FIX2LONG(y); + + assert(FIXNUM_P(y)); + if (iy < REFORM_BEGIN_YEAR) + style = positive_inf; + else if (iy > REFORM_END_YEAR) + style = negative_inf; + } + return style; +} + +inline static void +m_canonicalize_jd(VALUE obj, union DateData *x) +{ + if (simple_dat_p(x)) { + get_s_jd(x); + canonicalize_s_jd(obj, x); + } + else { + get_c_jd(x); + canonicalize_c_jd(obj, x); + } +} + +inline static VALUE +m_nth(union DateData *x) +{ + if (simple_dat_p(x)) + return x->s.nth; + else { + get_c_civil(x); + return x->c.nth; + } +} + +inline static int +m_jd(union DateData *x) +{ + if (simple_dat_p(x)) { + get_s_jd(x); + return x->s.jd; + } + else { + get_c_jd(x); + return x->c.jd; + } +} + +static VALUE +m_real_jd(union DateData *x) +{ + VALUE nth, rjd; + int jd; + + nth = m_nth(x); + jd = m_jd(x); + + encode_jd(nth, jd, &rjd); + return rjd; +} + +static int +m_local_jd(union DateData *x) +{ + if (simple_dat_p(x)) { + get_s_jd(x); + return x->s.jd; + } + else { + get_c_jd(x); + get_c_df(x); + return local_jd(x); + } +} + +static VALUE +m_real_local_jd(union DateData *x) +{ + VALUE nth, rjd; + int jd; + + nth = m_nth(x); + jd = m_local_jd(x); + + encode_jd(nth, jd, &rjd); + return rjd; +} + +inline static int +m_df(union DateData *x) +{ + if (simple_dat_p(x)) + return 0; + else { + get_c_df(x); + return x->c.df; + } +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +m_df_in_day(union DateData *x) +{ + return isec_to_day(m_df(x)); +} +#endif + +static int +m_local_df(union DateData *x) +{ + if (simple_dat_p(x)) + return 0; + else { + get_c_df(x); + return local_df(x); + } +} + +#ifndef NDEBUG +static VALUE +m_local_df_in_day(union DateData *x) +{ + return isec_to_day(m_local_df(x)); +} +#endif + +inline static VALUE +m_sf(union DateData *x) +{ + if (simple_dat_p(x)) + return INT2FIX(0); + else + return x->c.sf; +} + +#ifndef NDEBUG +static VALUE +m_sf_in_day(union DateData *x) +{ + return ns_to_day(m_sf(x)); +} +#endif + +static VALUE +m_sf_in_sec(union DateData *x) +{ + return ns_to_sec(m_sf(x)); +} + +static VALUE +m_fr(union DateData *x) +{ + if (simple_dat_p(x)) + return INT2FIX(0); + else { + int df; + VALUE sf, fr; + + df = m_local_df(x); + sf = m_sf(x); + fr = isec_to_day(df); + if (f_nonzero_p(sf)) + fr = f_add(fr, ns_to_day(sf)); + return fr; + } +} + +#define HALF_DAYS_IN_SECONDS (DAY_IN_SECONDS / 2) + +static VALUE +m_ajd(union DateData *x) +{ + VALUE r, sf; + int df; + + if (simple_dat_p(x)) { + r = m_real_jd(x); + if (FIXNUM_P(r) && FIX2LONG(r) <= (FIXNUM_MAX / 2)) { + long ir = FIX2LONG(r); + ir = ir * 2 - 1; + return rb_rational_new2(LONG2FIX(ir), INT2FIX(2)); + } + else + return rb_rational_new2(f_sub(f_mul(r, + INT2FIX(2)), + INT2FIX(1)), + INT2FIX(2)); + } + + r = m_real_jd(x); + df = m_df(x); + df -= HALF_DAYS_IN_SECONDS; + if (df) + r = f_add(r, isec_to_day(df)); + sf = m_sf(x); + if (f_nonzero_p(sf)) + r = f_add(r, ns_to_day(sf)); + + return r; +} + +static VALUE +m_amjd(union DateData *x) +{ + VALUE r, sf; + int df; + + r = m_real_jd(x); + if (FIXNUM_P(r) && FIX2LONG(r) >= (FIXNUM_MIN + 2400001)) { + long ir = FIX2LONG(r); + ir -= 2400001; + r = rb_rational_new1(LONG2FIX(ir)); + } + else + r = rb_rational_new1(f_sub(m_real_jd(x), + INT2FIX(2400001))); + + if (simple_dat_p(x)) + return r; + + df = m_df(x); + if (df) + r = f_add(r, isec_to_day(df)); + sf = m_sf(x); + if (f_nonzero_p(sf)) + r = f_add(r, ns_to_day(sf)); + + return r; +} + +inline static int +m_of(union DateData *x) +{ + if (simple_dat_p(x)) + return 0; + else { + get_c_jd(x); + return x->c.of; + } +} + +static VALUE +m_of_in_day(union DateData *x) +{ + return isec_to_day(m_of(x)); +} + +inline static double +m_sg(union DateData *x) +{ + if (simple_dat_p(x)) + return x->s.sg; + else { + get_c_jd(x); + return x->c.sg; + } +} + +static int +m_julian_p(union DateData *x) +{ + int jd; + double sg; + + if (simple_dat_p(x)) { + get_s_jd(x); + jd = x->s.jd; + sg = s_virtual_sg(x); + } + else { + get_c_jd(x); + jd = x->c.jd; + sg = c_virtual_sg(x); + } + if (isinf(sg)) + return sg == positive_inf; + return jd < sg; +} + +inline static int +m_gregorian_p(union DateData *x) +{ + return !m_julian_p(x); +} + +inline static int +m_proleptic_julian_p(union DateData *x) +{ + double sg; + + sg = m_sg(x); + if (isinf(sg) && sg > 0) + return 1; + return 0; +} + +inline static int +m_proleptic_gregorian_p(union DateData *x) +{ + double sg; + + sg = m_sg(x); + if (isinf(sg) && sg < 0) + return 1; + return 0; +} + +inline static int +m_year(union DateData *x) +{ + if (simple_dat_p(x)) { + get_s_civil(x); + return x->s.year; + } + else { + get_c_civil(x); + return x->c.year; + } +} + +static VALUE +m_real_year(union DateData *x) +{ + VALUE nth, ry; + int year; + + nth = m_nth(x); + year = m_year(x); + + if (f_zero_p(nth)) + return INT2FIX(year); + + encode_year(nth, year, + m_gregorian_p(x) ? -1 : +1, + &ry); + return ry; +} + +inline static int +m_mon(union DateData *x) +{ + if (simple_dat_p(x)) { + get_s_civil(x); +#ifndef USE_PACK + return x->s.mon; +#else + return EX_MON(x->s.pc); +#endif + } + else { + get_c_civil(x); +#ifndef USE_PACK + return x->c.mon; +#else + return EX_MON(x->c.pc); +#endif + } +} + +inline static int +m_mday(union DateData *x) +{ + if (simple_dat_p(x)) { + get_s_civil(x); +#ifndef USE_PACK + return x->s.mday; +#else + return EX_MDAY(x->s.pc); +#endif + } + else { + get_c_civil(x); +#ifndef USE_PACK + return x->c.mday; +#else + return EX_MDAY(x->c.pc); +#endif + } +} + +static const int yeartab[2][13] = { + { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }, + { 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 } +}; + +static int +c_julian_to_yday(int y, int m, int d) +{ + assert(m >= 1 && m <= 12); + return yeartab[c_julian_leap_p(y) ? 1 : 0][m] + d; +} + +static int +c_gregorian_to_yday(int y, int m, int d) +{ + assert(m >= 1 && m <= 12); + return yeartab[c_gregorian_leap_p(y) ? 1 : 0][m] + d; +} + +static int +m_yday(union DateData *x) +{ + int jd, ry, rd; + double sg; + + jd = m_local_jd(x); + sg = m_virtual_sg(x); /* !=m_sg() */ + + if (m_proleptic_gregorian_p(x) || + (jd - sg) > 366) + return c_gregorian_to_yday(m_year(x), m_mon(x), m_mday(x)); + if (m_proleptic_julian_p(x)) + return c_julian_to_yday(m_year(x), m_mon(x), m_mday(x)); + c_jd_to_ordinal(jd, sg, &ry, &rd); + return rd; +} + +static int +m_wday(union DateData *x) +{ + return c_jd_to_wday(m_local_jd(x)); +} + +static int +m_cwyear(union DateData *x) +{ + int ry, rw, rd; + + c_jd_to_commercial(m_local_jd(x), m_virtual_sg(x), /* !=m_sg() */ + &ry, &rw, &rd); + return ry; +} + +static VALUE +m_real_cwyear(union DateData *x) +{ + VALUE nth, ry; + int year; + + nth = m_nth(x); + year = m_cwyear(x); + + if (f_zero_p(nth)) + return INT2FIX(year); + + encode_year(nth, year, + m_gregorian_p(x) ? -1 : +1, + &ry); + return ry; +} + +static int +m_cweek(union DateData *x) +{ + int ry, rw, rd; + + c_jd_to_commercial(m_local_jd(x), m_virtual_sg(x), /* !=m_sg() */ + &ry, &rw, &rd); + return rw; +} + +static int +m_cwday(union DateData *x) +{ + int w; + + w = m_wday(x); + if (w == 0) + w = 7; + return w; +} + +static int +m_wnumx(union DateData *x, int f) +{ + int ry, rw, rd; + + c_jd_to_weeknum(m_local_jd(x), f, m_virtual_sg(x), /* !=m_sg() */ + &ry, &rw, &rd); + return rw; +} + +static int +m_wnum0(union DateData *x) +{ + return m_wnumx(x, 0); +} + +static int +m_wnum1(union DateData *x) +{ + return m_wnumx(x, 1); +} + +inline static int +m_hour(union DateData *x) +{ + if (simple_dat_p(x)) + return 0; + else { + get_c_time(x); +#ifndef USE_PACK + return x->c.hour; +#else + return EX_HOUR(x->c.pc); +#endif + } +} + +inline static int +m_min(union DateData *x) +{ + if (simple_dat_p(x)) + return 0; + else { + get_c_time(x); +#ifndef USE_PACK + return x->c.min; +#else + return EX_MIN(x->c.pc); +#endif + } +} + +inline static int +m_sec(union DateData *x) +{ + if (simple_dat_p(x)) + return 0; + else { + get_c_time(x); +#ifndef USE_PACK + return x->c.sec; +#else + return EX_SEC(x->c.pc); +#endif + } +} + +#define decode_offset(of,s,h,m)\ +do {\ + int a;\ + s = (of < 0) ? '-' : '+';\ + a = (of < 0) ? -of : of;\ + h = a / HOUR_IN_SECONDS;\ + m = a % HOUR_IN_SECONDS / MINUTE_IN_SECONDS;\ +} while (0) + +static VALUE +of2str(int of) +{ + int s, h, m; + + decode_offset(of, s, h, m); + return rb_enc_sprintf(rb_usascii_encoding(), "%c%02d:%02d", s, h, m); +} + +static VALUE +m_zone(union DateData *x) +{ + if (simple_dat_p(x)) + return rb_usascii_str_new2("+00:00"); + return of2str(m_of(x)); +} + +inline static VALUE +f_kind_of_p(VALUE x, VALUE c) +{ + return rb_obj_is_kind_of(x, c); +} + +inline static VALUE +k_date_p(VALUE x) +{ + return f_kind_of_p(x, cDate); +} + +inline static VALUE +k_numeric_p(VALUE x) +{ + return f_kind_of_p(x, rb_cNumeric); +} + +inline static VALUE +k_rational_p(VALUE x) +{ + return f_kind_of_p(x, rb_cRational); +} + +static inline void +expect_numeric(VALUE x) +{ + if (!k_numeric_p(x)) + rb_raise(rb_eTypeError, "expected numeric"); +} + +#ifndef NDEBUG +/* :nodoc: */ +static void +civil_to_jd(VALUE y, int m, int d, double sg, + VALUE *nth, int *ry, + int *rjd, + int *ns) +{ + double style = guess_style(y, sg); + + if (style == 0) { + int jd; + + c_civil_to_jd(FIX2INT(y), m, d, sg, &jd, ns); + decode_jd(INT2FIX(jd), nth, rjd); + if (f_zero_p(*nth)) + *ry = FIX2INT(y); + else { + VALUE nth2; + decode_year(y, *ns ? -1 : +1, &nth2, ry); + } + } + else { + decode_year(y, style, nth, ry); + c_civil_to_jd(*ry, m, d, style, rjd, ns); + } +} + +static void +jd_to_civil(VALUE jd, double sg, + VALUE *nth, int *rjd, + int *ry, int *rm, int *rd) +{ + decode_jd(jd, nth, rjd); + c_jd_to_civil(*rjd, sg, ry, rm, rd); +} + +static void +ordinal_to_jd(VALUE y, int d, double sg, + VALUE *nth, int *ry, + int *rjd, + int *ns) +{ + double style = guess_style(y, sg); + + if (style == 0) { + int jd; + + c_ordinal_to_jd(FIX2INT(y), d, sg, &jd, ns); + decode_jd(INT2FIX(jd), nth, rjd); + if (f_zero_p(*nth)) + *ry = FIX2INT(y); + else { + VALUE nth2; + decode_year(y, *ns ? -1 : +1, &nth2, ry); + } + } + else { + decode_year(y, style, nth, ry); + c_ordinal_to_jd(*ry, d, style, rjd, ns); + } +} + +static void +jd_to_ordinal(VALUE jd, double sg, + VALUE *nth, int *rjd, + int *ry, int *rd) +{ + decode_jd(jd, nth, rjd); + c_jd_to_ordinal(*rjd, sg, ry, rd); +} + +static void +commercial_to_jd(VALUE y, int w, int d, double sg, + VALUE *nth, int *ry, + int *rjd, + int *ns) +{ + double style = guess_style(y, sg); + + if (style == 0) { + int jd; + + c_commercial_to_jd(FIX2INT(y), w, d, sg, &jd, ns); + decode_jd(INT2FIX(jd), nth, rjd); + if (f_zero_p(*nth)) + *ry = FIX2INT(y); + else { + VALUE nth2; + decode_year(y, *ns ? -1 : +1, &nth2, ry); + } + } + else { + decode_year(y, style, nth, ry); + c_commercial_to_jd(*ry, w, d, style, rjd, ns); + } +} + +static void +jd_to_commercial(VALUE jd, double sg, + VALUE *nth, int *rjd, + int *ry, int *rw, int *rd) +{ + decode_jd(jd, nth, rjd); + c_jd_to_commercial(*rjd, sg, ry, rw, rd); +} + +static void +weeknum_to_jd(VALUE y, int w, int d, int f, double sg, + VALUE *nth, int *ry, + int *rjd, + int *ns) +{ + double style = guess_style(y, sg); + + if (style == 0) { + int jd; + + c_weeknum_to_jd(FIX2INT(y), w, d, f, sg, &jd, ns); + decode_jd(INT2FIX(jd), nth, rjd); + if (f_zero_p(*nth)) + *ry = FIX2INT(y); + else { + VALUE nth2; + decode_year(y, *ns ? -1 : +1, &nth2, ry); + } + } + else { + decode_year(y, style, nth, ry); + c_weeknum_to_jd(*ry, w, d, f, style, rjd, ns); + } +} + +static void +jd_to_weeknum(VALUE jd, int f, double sg, + VALUE *nth, int *rjd, + int *ry, int *rw, int *rd) +{ + decode_jd(jd, nth, rjd); + c_jd_to_weeknum(*rjd, f, sg, ry, rw, rd); +} + +static void +nth_kday_to_jd(VALUE y, int m, int n, int k, double sg, + VALUE *nth, int *ry, + int *rjd, + int *ns) +{ + double style = guess_style(y, sg); + + if (style == 0) { + int jd; + + c_nth_kday_to_jd(FIX2INT(y), m, n, k, sg, &jd, ns); + decode_jd(INT2FIX(jd), nth, rjd); + if (f_zero_p(*nth)) + *ry = FIX2INT(y); + else { + VALUE nth2; + decode_year(y, *ns ? -1 : +1, &nth2, ry); + } + } + else { + decode_year(y, style, nth, ry); + c_nth_kday_to_jd(*ry, m, n, k, style, rjd, ns); + } +} + +static void +jd_to_nth_kday(VALUE jd, double sg, + VALUE *nth, int *rjd, + int *ry, int *rm, int *rn, int *rk) +{ + decode_jd(jd, nth, rjd); + c_jd_to_nth_kday(*rjd, sg, ry, rm, rn, rk); +} +#endif + +static int +valid_ordinal_p(VALUE y, int d, double sg, + VALUE *nth, int *ry, + int *rd, int *rjd, + int *ns) +{ + double style = guess_style(y, sg); + int r; + + if (style == 0) { + int jd; + + r = c_valid_ordinal_p(FIX2INT(y), d, sg, rd, &jd, ns); + if (!r) + return 0; + decode_jd(INT2FIX(jd), nth, rjd); + if (f_zero_p(*nth)) + *ry = FIX2INT(y); + else { + VALUE nth2; + decode_year(y, *ns ? -1 : +1, &nth2, ry); + } + } + else { + decode_year(y, style, nth, ry); + r = c_valid_ordinal_p(*ry, d, style, rd, rjd, ns); + } + return r; +} + +static int +valid_gregorian_p(VALUE y, int m, int d, + VALUE *nth, int *ry, + int *rm, int *rd) +{ + decode_year(y, -1, nth, ry); + return c_valid_gregorian_p(*ry, m, d, rm, rd); +} + +static int +valid_civil_p(VALUE y, int m, int d, double sg, + VALUE *nth, int *ry, + int *rm, int *rd, int *rjd, + int *ns) +{ + double style = guess_style(y, sg); + int r; + + if (style == 0) { + int jd; + + r = c_valid_civil_p(FIX2INT(y), m, d, sg, rm, rd, &jd, ns); + if (!r) + return 0; + decode_jd(INT2FIX(jd), nth, rjd); + if (f_zero_p(*nth)) + *ry = FIX2INT(y); + else { + VALUE nth2; + decode_year(y, *ns ? -1 : +1, &nth2, ry); + } + } + else { + decode_year(y, style, nth, ry); + if (style < 0) + r = c_valid_gregorian_p(*ry, m, d, rm, rd); + else + r = c_valid_julian_p(*ry, m, d, rm, rd); + if (!r) + return 0; + c_civil_to_jd(*ry, *rm, *rd, style, rjd, ns); + } + return r; +} + +static int +valid_commercial_p(VALUE y, int w, int d, double sg, + VALUE *nth, int *ry, + int *rw, int *rd, int *rjd, + int *ns) +{ + double style = guess_style(y, sg); + int r; + + if (style == 0) { + int jd; + + r = c_valid_commercial_p(FIX2INT(y), w, d, sg, rw, rd, &jd, ns); + if (!r) + return 0; + decode_jd(INT2FIX(jd), nth, rjd); + if (f_zero_p(*nth)) + *ry = FIX2INT(y); + else { + VALUE nth2; + decode_year(y, *ns ? -1 : +1, &nth2, ry); + } + } + else { + decode_year(y, style, nth, ry); + r = c_valid_commercial_p(*ry, w, d, style, rw, rd, rjd, ns); + } + return r; +} + +static int +valid_weeknum_p(VALUE y, int w, int d, int f, double sg, + VALUE *nth, int *ry, + int *rw, int *rd, int *rjd, + int *ns) +{ + double style = guess_style(y, sg); + int r; + + if (style == 0) { + int jd; + + r = c_valid_weeknum_p(FIX2INT(y), w, d, f, sg, rw, rd, &jd, ns); + if (!r) + return 0; + decode_jd(INT2FIX(jd), nth, rjd); + if (f_zero_p(*nth)) + *ry = FIX2INT(y); + else { + VALUE nth2; + decode_year(y, *ns ? -1 : +1, &nth2, ry); + } + } + else { + decode_year(y, style, nth, ry); + r = c_valid_weeknum_p(*ry, w, d, f, style, rw, rd, rjd, ns); + } + return r; +} + +#ifndef NDEBUG +/* :nodoc: */ +static int +valid_nth_kday_p(VALUE y, int m, int n, int k, double sg, + VALUE *nth, int *ry, + int *rm, int *rn, int *rk, int *rjd, + int *ns) +{ + double style = guess_style(y, sg); + int r; + + if (style == 0) { + int jd; + + r = c_valid_nth_kday_p(FIX2INT(y), m, n, k, sg, rm, rn, rk, &jd, ns); + if (!r) + return 0; + decode_jd(INT2FIX(jd), nth, rjd); + if (f_zero_p(*nth)) + *ry = FIX2INT(y); + else { + VALUE nth2; + decode_year(y, *ns ? -1 : +1, &nth2, ry); + } + } + else { + decode_year(y, style, nth, ry); + r = c_valid_nth_kday_p(*ry, m, n, k, style, rm, rn, rk, rjd, ns); + } + return r; +} +#endif + +VALUE date_zone_to_diff(VALUE); + +static int +offset_to_sec(VALUE vof, int *rof) +{ + int try_rational = 1; + + again: + switch (TYPE(vof)) { + case T_FIXNUM: + { + long n; + + n = FIX2LONG(vof); + if (n != -1 && n != 0 && n != 1) + return 0; + *rof = (int)n * DAY_IN_SECONDS; + return 1; + } + case T_FLOAT: + { + double n; + + n = RFLOAT_VALUE(vof) * DAY_IN_SECONDS; + if (n < -DAY_IN_SECONDS || n > DAY_IN_SECONDS) + return 0; + *rof = (int)round(n); + if (*rof != n) + rb_warning("fraction of offset is ignored"); + return 1; + } + default: + expect_numeric(vof); + vof = f_to_r(vof); + if (!k_rational_p(vof)) { + if (!try_rational) Check_Type(vof, T_RATIONAL); + try_rational = 0; + goto again; + } + /* fall through */ + case T_RATIONAL: + { + VALUE vs, vn, vd; + long n; + + vs = day_to_sec(vof); + + if (!k_rational_p(vs)) { + vn = vs; + goto rounded; + } + vn = rb_rational_num(vs); + vd = rb_rational_den(vs); + + if (FIXNUM_P(vn) && FIXNUM_P(vd) && (FIX2LONG(vd) == 1)) + n = FIX2LONG(vn); + else { + vn = f_round(vs); + if (!f_eqeq_p(vn, vs)) + rb_warning("fraction of offset is ignored"); + rounded: + if (!FIXNUM_P(vn)) + return 0; + n = FIX2LONG(vn); + if (n < -DAY_IN_SECONDS || n > DAY_IN_SECONDS) + return 0; + } + *rof = (int)n; + return 1; + } + case T_STRING: + { + VALUE vs = date_zone_to_diff(vof); + long n; + + if (!FIXNUM_P(vs)) + return 0; + n = FIX2LONG(vs); + if (n < -DAY_IN_SECONDS || n > DAY_IN_SECONDS) + return 0; + *rof = (int)n; + return 1; + } + } + return 0; +} + +/* date */ + +#define valid_sg(sg) \ +do {\ + if (!c_valid_start_p(sg)) {\ + sg = 0;\ + rb_warning("invalid start is ignored");\ + }\ +} while (0) + +static VALUE +valid_jd_sub(int argc, VALUE *argv, VALUE klass, int need_jd) +{ + double sg = NUM2DBL(argv[1]); + valid_sg(sg); + return argv[0]; +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +date_s__valid_jd_p(int argc, VALUE *argv, VALUE klass) +{ + VALUE vjd, vsg; + VALUE argv2[2]; + + rb_scan_args(argc, argv, "11", &vjd, &vsg); + + argv2[0] = vjd; + if (argc < 2) + argv2[1] = DBL2NUM(GREGORIAN); + else + argv2[1] = vsg; + + return valid_jd_sub(2, argv2, klass, 1); +} +#endif + +/* + * call-seq: + * Date.valid_jd?(jd, start = Date::ITALY) -> true + * + * Implemented for compatibility; + * returns +true+ unless +jd+ is invalid (i.e., not a Numeric). + * + * Date.valid_jd?(2451944) # => true + * + * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * + * Related: Date.jd. + */ +static VALUE +date_s_valid_jd_p(int argc, VALUE *argv, VALUE klass) +{ + VALUE vjd, vsg; + VALUE argv2[2]; + + rb_scan_args(argc, argv, "11", &vjd, &vsg); + + RETURN_FALSE_UNLESS_NUMERIC(vjd); + argv2[0] = vjd; + if (argc < 2) + argv2[1] = INT2FIX(DEFAULT_SG); + else + argv2[1] = vsg; + + if (NIL_P(valid_jd_sub(2, argv2, klass, 0))) + return Qfalse; + return Qtrue; +} + +static VALUE +valid_civil_sub(int argc, VALUE *argv, VALUE klass, int need_jd) +{ + VALUE nth, y; + int m, d, ry, rm, rd; + double sg; + + y = argv[0]; + m = NUM2INT(argv[1]); + d = NUM2INT(argv[2]); + sg = NUM2DBL(argv[3]); + + valid_sg(sg); + + if (!need_jd && (guess_style(y, sg) < 0)) { + if (!valid_gregorian_p(y, m, d, + &nth, &ry, + &rm, &rd)) + return Qnil; + return INT2FIX(0); /* dummy */ + } + else { + int rjd, ns; + VALUE rjd2; + + if (!valid_civil_p(y, m, d, sg, + &nth, &ry, + &rm, &rd, &rjd, + &ns)) + return Qnil; + if (!need_jd) + return INT2FIX(0); /* dummy */ + encode_jd(nth, rjd, &rjd2); + return rjd2; + } +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +date_s__valid_civil_p(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vm, vd, vsg; + VALUE argv2[4]; + + rb_scan_args(argc, argv, "31", &vy, &vm, &vd, &vsg); + + argv2[0] = vy; + argv2[1] = vm; + argv2[2] = vd; + if (argc < 4) + argv2[3] = DBL2NUM(GREGORIAN); + else + argv2[3] = vsg; + + return valid_civil_sub(4, argv2, klass, 1); +} +#endif + +/* + * call-seq: + * Date.valid_civil?(year, month, mday, start = Date::ITALY) -> true or false + * + * Returns +true+ if the arguments define a valid ordinal date, + * +false+ otherwise: + * + * Date.valid_date?(2001, 2, 3) # => true + * Date.valid_date?(2001, 2, 29) # => false + * Date.valid_date?(2001, 2, -1) # => true + * + * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * + * Related: Date.jd, Date.new. + */ +static VALUE +date_s_valid_civil_p(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vm, vd, vsg; + VALUE argv2[4]; + + rb_scan_args(argc, argv, "31", &vy, &vm, &vd, &vsg); + + RETURN_FALSE_UNLESS_NUMERIC(vy); + RETURN_FALSE_UNLESS_NUMERIC(vm); + RETURN_FALSE_UNLESS_NUMERIC(vd); + argv2[0] = vy; + argv2[1] = vm; + argv2[2] = vd; + if (argc < 4) + argv2[3] = INT2FIX(DEFAULT_SG); + else + argv2[3] = vsg; + + if (NIL_P(valid_civil_sub(4, argv2, klass, 0))) + return Qfalse; + return Qtrue; +} + +static VALUE +valid_ordinal_sub(int argc, VALUE *argv, VALUE klass, int need_jd) +{ + VALUE nth, y; + int d, ry, rd; + double sg; + + y = argv[0]; + d = NUM2INT(argv[1]); + sg = NUM2DBL(argv[2]); + + valid_sg(sg); + + { + int rjd, ns; + VALUE rjd2; + + if (!valid_ordinal_p(y, d, sg, + &nth, &ry, + &rd, &rjd, + &ns)) + return Qnil; + if (!need_jd) + return INT2FIX(0); /* dummy */ + encode_jd(nth, rjd, &rjd2); + return rjd2; + } +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +date_s__valid_ordinal_p(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vd, vsg; + VALUE argv2[3]; + + rb_scan_args(argc, argv, "21", &vy, &vd, &vsg); + + argv2[0] = vy; + argv2[1] = vd; + if (argc < 3) + argv2[2] = DBL2NUM(GREGORIAN); + else + argv2[2] = vsg; + + return valid_ordinal_sub(3, argv2, klass, 1); +} +#endif + +/* + * call-seq: + * Date.valid_ordinal?(year, yday, start = Date::ITALY) -> true or false + * + * Returns +true+ if the arguments define a valid ordinal date, + * +false+ otherwise: + * + * Date.valid_ordinal?(2001, 34) # => true + * Date.valid_ordinal?(2001, 366) # => false + * + * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * + * Related: Date.jd, Date.ordinal. + */ +static VALUE +date_s_valid_ordinal_p(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vd, vsg; + VALUE argv2[3]; + + rb_scan_args(argc, argv, "21", &vy, &vd, &vsg); + + RETURN_FALSE_UNLESS_NUMERIC(vy); + RETURN_FALSE_UNLESS_NUMERIC(vd); + argv2[0] = vy; + argv2[1] = vd; + if (argc < 3) + argv2[2] = INT2FIX(DEFAULT_SG); + else + argv2[2] = vsg; + + if (NIL_P(valid_ordinal_sub(3, argv2, klass, 0))) + return Qfalse; + return Qtrue; +} + +static VALUE +valid_commercial_sub(int argc, VALUE *argv, VALUE klass, int need_jd) +{ + VALUE nth, y; + int w, d, ry, rw, rd; + double sg; + + y = argv[0]; + w = NUM2INT(argv[1]); + d = NUM2INT(argv[2]); + sg = NUM2DBL(argv[3]); + + valid_sg(sg); + + { + int rjd, ns; + VALUE rjd2; + + if (!valid_commercial_p(y, w, d, sg, + &nth, &ry, + &rw, &rd, &rjd, + &ns)) + return Qnil; + if (!need_jd) + return INT2FIX(0); /* dummy */ + encode_jd(nth, rjd, &rjd2); + return rjd2; + } +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +date_s__valid_commercial_p(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vw, vd, vsg; + VALUE argv2[4]; + + rb_scan_args(argc, argv, "31", &vy, &vw, &vd, &vsg); + + argv2[0] = vy; + argv2[1] = vw; + argv2[2] = vd; + if (argc < 4) + argv2[3] = DBL2NUM(GREGORIAN); + else + argv2[3] = vsg; + + return valid_commercial_sub(4, argv2, klass, 1); +} +#endif + +/* + * call-seq: + * Date.valid_commercial?(cwyear, cweek, cwday, start = Date::ITALY) -> true or false + * + * Returns +true+ if the arguments define a valid commercial date, + * +false+ otherwise: + * + * Date.valid_commercial?(2001, 5, 6) # => true + * Date.valid_commercial?(2001, 5, 8) # => false + * + * See Date.commercial. + * + * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * + * Related: Date.jd, Date.commercial. + */ +static VALUE +date_s_valid_commercial_p(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vw, vd, vsg; + VALUE argv2[4]; + + rb_scan_args(argc, argv, "31", &vy, &vw, &vd, &vsg); + + RETURN_FALSE_UNLESS_NUMERIC(vy); + RETURN_FALSE_UNLESS_NUMERIC(vw); + RETURN_FALSE_UNLESS_NUMERIC(vd); + argv2[0] = vy; + argv2[1] = vw; + argv2[2] = vd; + if (argc < 4) + argv2[3] = INT2FIX(DEFAULT_SG); + else + argv2[3] = vsg; + + if (NIL_P(valid_commercial_sub(4, argv2, klass, 0))) + return Qfalse; + return Qtrue; +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +valid_weeknum_sub(int argc, VALUE *argv, VALUE klass, int need_jd) +{ + VALUE nth, y; + int w, d, f, ry, rw, rd; + double sg; + + y = argv[0]; + w = NUM2INT(argv[1]); + d = NUM2INT(argv[2]); + f = NUM2INT(argv[3]); + sg = NUM2DBL(argv[4]); + + valid_sg(sg); + + { + int rjd, ns; + VALUE rjd2; + + if (!valid_weeknum_p(y, w, d, f, sg, + &nth, &ry, + &rw, &rd, &rjd, + &ns)) + return Qnil; + if (!need_jd) + return INT2FIX(0); /* dummy */ + encode_jd(nth, rjd, &rjd2); + return rjd2; + } +} + +/* :nodoc: */ +static VALUE +date_s__valid_weeknum_p(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vw, vd, vf, vsg; + VALUE argv2[5]; + + rb_scan_args(argc, argv, "41", &vy, &vw, &vd, &vf, &vsg); + + argv2[0] = vy; + argv2[1] = vw; + argv2[2] = vd; + argv2[3] = vf; + if (argc < 5) + argv2[4] = DBL2NUM(GREGORIAN); + else + argv2[4] = vsg; + + return valid_weeknum_sub(5, argv2, klass, 1); +} + +/* :nodoc: */ +static VALUE +date_s_valid_weeknum_p(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vw, vd, vf, vsg; + VALUE argv2[5]; + + rb_scan_args(argc, argv, "41", &vy, &vw, &vd, &vf, &vsg); + + argv2[0] = vy; + argv2[1] = vw; + argv2[2] = vd; + argv2[3] = vf; + if (argc < 5) + argv2[4] = INT2FIX(DEFAULT_SG); + else + argv2[4] = vsg; + + if (NIL_P(valid_weeknum_sub(5, argv2, klass, 0))) + return Qfalse; + return Qtrue; +} + +static VALUE +valid_nth_kday_sub(int argc, VALUE *argv, VALUE klass, int need_jd) +{ + VALUE nth, y; + int m, n, k, ry, rm, rn, rk; + double sg; + + y = argv[0]; + m = NUM2INT(argv[1]); + n = NUM2INT(argv[2]); + k = NUM2INT(argv[3]); + sg = NUM2DBL(argv[4]); + + { + int rjd, ns; + VALUE rjd2; + + if (!valid_nth_kday_p(y, m, n, k, sg, + &nth, &ry, + &rm, &rn, &rk, &rjd, + &ns)) + return Qnil; + if (!need_jd) + return INT2FIX(0); /* dummy */ + encode_jd(nth, rjd, &rjd2); + return rjd2; + } +} + +/* :nodoc: */ +static VALUE +date_s__valid_nth_kday_p(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vm, vn, vk, vsg; + VALUE argv2[5]; + + rb_scan_args(argc, argv, "41", &vy, &vm, &vn, &vk, &vsg); + + argv2[0] = vy; + argv2[1] = vm; + argv2[2] = vn; + argv2[3] = vk; + if (argc < 5) + argv2[4] = DBL2NUM(GREGORIAN); + else + argv2[4] = vsg; + + return valid_nth_kday_sub(5, argv2, klass, 1); +} + +/* :nodoc: */ +static VALUE +date_s_valid_nth_kday_p(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vm, vn, vk, vsg; + VALUE argv2[5]; + + rb_scan_args(argc, argv, "41", &vy, &vm, &vn, &vk, &vsg); + + argv2[0] = vy; + argv2[1] = vm; + argv2[2] = vn; + argv2[3] = vk; + if (argc < 5) + argv2[4] = INT2FIX(DEFAULT_SG); + else + argv2[4] = vsg; + + if (NIL_P(valid_nth_kday_sub(5, argv2, klass, 0))) + return Qfalse; + return Qtrue; +} + +/* :nodoc: */ +static VALUE +date_s_zone_to_diff(VALUE klass, VALUE str) +{ + return date_zone_to_diff(str); +} +#endif + +/* + * call-seq: + * Date.julian_leap?(year) -> true or false + * + * Returns +true+ if the given year is a leap year + * in the {proleptic Julian calendar}[https://en.wikipedia.org/wiki/Proleptic_Julian_calendar], +false+ otherwise: + * + * Date.julian_leap?(1900) # => true + * Date.julian_leap?(1901) # => false + * + * Related: Date.gregorian_leap?. + */ +static VALUE +date_s_julian_leap_p(VALUE klass, VALUE y) +{ + VALUE nth; + int ry; + + check_numeric(y, "year"); + decode_year(y, +1, &nth, &ry); + return f_boolcast(c_julian_leap_p(ry)); +} + +/* + * call-seq: + * Date.gregorian_leap?(year) -> true or false + * + * Returns +true+ if the given year is a leap year + * in the {proleptic Gregorian calendar}[https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar], +false+ otherwise: + * + * Date.gregorian_leap?(2000) # => true + * Date.gregorian_leap?(2001) # => false + * + * Related: Date.julian_leap?. + */ +static VALUE +date_s_gregorian_leap_p(VALUE klass, VALUE y) +{ + VALUE nth; + int ry; + + check_numeric(y, "year"); + decode_year(y, -1, &nth, &ry); + return f_boolcast(c_gregorian_leap_p(ry)); +} + +static void +d_lite_gc_mark(void *ptr) +{ + union DateData *dat = ptr; + if (simple_dat_p(dat)) + rb_gc_mark(dat->s.nth); + else { + rb_gc_mark(dat->c.nth); + rb_gc_mark(dat->c.sf); + } +} + +static size_t +d_lite_memsize(const void *ptr) +{ + const union DateData *dat = ptr; + return complex_dat_p(dat) ? sizeof(struct ComplexDateData) : sizeof(struct SimpleDateData); +} + +#ifndef HAVE_RB_EXT_RACTOR_SAFE +# define RUBY_TYPED_FROZEN_SHAREABLE 0 +#endif + +static const rb_data_type_t d_lite_type = { + "Date", + {d_lite_gc_mark, RUBY_TYPED_DEFAULT_FREE, d_lite_memsize,}, + 0, 0, + RUBY_TYPED_FREE_IMMEDIATELY|RUBY_TYPED_WB_PROTECTED|RUBY_TYPED_FROZEN_SHAREABLE, +}; + +inline static VALUE +d_simple_new_internal(VALUE klass, + VALUE nth, int jd, + double sg, + int y, int m, int d, + unsigned flags) +{ + struct SimpleDateData *dat; + VALUE obj; + + obj = TypedData_Make_Struct(klass, struct SimpleDateData, + &d_lite_type, dat); + set_to_simple(obj, dat, nth, jd, sg, y, m, d, flags); + + assert(have_jd_p(dat) || have_civil_p(dat)); + + return obj; +} + +inline static VALUE +d_complex_new_internal(VALUE klass, + VALUE nth, int jd, + int df, VALUE sf, + int of, double sg, + int y, int m, int d, + int h, int min, int s, + unsigned flags) +{ + struct ComplexDateData *dat; + VALUE obj; + + obj = TypedData_Make_Struct(klass, struct ComplexDateData, + &d_lite_type, dat); + set_to_complex(obj, dat, nth, jd, df, sf, of, sg, + y, m, d, h, min, s, flags); + + assert(have_jd_p(dat) || have_civil_p(dat)); + assert(have_df_p(dat) || have_time_p(dat)); + + return obj; +} + +static VALUE +d_lite_s_alloc_simple(VALUE klass) +{ + return d_simple_new_internal(klass, + INT2FIX(0), 0, + DEFAULT_SG, + 0, 0, 0, + HAVE_JD); +} + +static VALUE +d_lite_s_alloc_complex(VALUE klass) +{ + return d_complex_new_internal(klass, + INT2FIX(0), 0, + 0, INT2FIX(0), + 0, DEFAULT_SG, + 0, 0, 0, + 0, 0, 0, + HAVE_JD | HAVE_DF); +} + +static VALUE +d_lite_s_alloc(VALUE klass) +{ + return d_lite_s_alloc_complex(klass); +} + +static void +old_to_new(VALUE ajd, VALUE of, VALUE sg, + VALUE *rnth, int *rjd, int *rdf, VALUE *rsf, + int *rof, double *rsg) +{ + VALUE jd, df, sf, of2, t; + + decode_day(f_add(ajd, half_days_in_day), + &jd, &df, &sf); + t = day_to_sec(of); + of2 = f_round(t); + + if (!f_eqeq_p(of2, t)) + rb_warning("fraction of offset is ignored"); + + decode_jd(jd, rnth, rjd); + + *rdf = NUM2INT(df); + *rsf = sf; + *rof = NUM2INT(of2); + *rsg = NUM2DBL(sg); + + if (*rdf < 0 || *rdf >= DAY_IN_SECONDS) + rb_raise(eDateError, "invalid day fraction"); + + if (f_lt_p(*rsf, INT2FIX(0)) || + f_ge_p(*rsf, INT2FIX(SECOND_IN_NANOSECONDS))) + + if (*rof < -DAY_IN_SECONDS || *rof > DAY_IN_SECONDS) { + *rof = 0; + rb_warning("invalid offset is ignored"); + } + + if (!c_valid_start_p(*rsg)) { + *rsg = DEFAULT_SG; + rb_warning("invalid start is ignored"); + } +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +date_s_new_bang(int argc, VALUE *argv, VALUE klass) +{ + VALUE ajd, of, sg, nth, sf; + int jd, df, rof; + double rsg; + + rb_scan_args(argc, argv, "03", &ajd, &of, &sg); + + switch (argc) { + case 0: + ajd = INT2FIX(0); + case 1: + of = INT2FIX(0); + case 2: + sg = INT2FIX(DEFAULT_SG); + } + + old_to_new(ajd, of, sg, + &nth, &jd, &df, &sf, &rof, &rsg); + + if (!df && f_zero_p(sf) && !rof) + return d_simple_new_internal(klass, + nth, jd, + rsg, + 0, 0, 0, + HAVE_JD); + else + return d_complex_new_internal(klass, + nth, jd, + df, sf, + rof, rsg, + 0, 0, 0, + 0, 0, 0, + HAVE_JD | HAVE_DF); +} +#endif + +inline static int +wholenum_p(VALUE x) +{ + if (FIXNUM_P(x)) + return 1; + switch (TYPE(x)) { + case T_BIGNUM: + return 1; + case T_FLOAT: + { + double d = RFLOAT_VALUE(x); + return round(d) == d; + } + break; + case T_RATIONAL: + { + VALUE den = rb_rational_den(x); + return FIXNUM_P(den) && FIX2LONG(den) == 1; + } + break; + } + return 0; +} + +inline static VALUE +to_integer(VALUE x) +{ + if (RB_INTEGER_TYPE_P(x)) + return x; + return f_to_i(x); +} + +inline static VALUE +d_trunc(VALUE d, VALUE *fr) +{ + VALUE rd; + + if (wholenum_p(d)) { + rd = to_integer(d); + *fr = INT2FIX(0); + } + else { + rd = f_idiv(d, INT2FIX(1)); + *fr = f_mod(d, INT2FIX(1)); + } + return rd; +} + +#define jd_trunc d_trunc +#define k_trunc d_trunc + +inline static VALUE +h_trunc(VALUE h, VALUE *fr) +{ + VALUE rh; + + if (wholenum_p(h)) { + rh = to_integer(h); + *fr = INT2FIX(0); + } + else { + rh = f_idiv(h, INT2FIX(1)); + *fr = f_mod(h, INT2FIX(1)); + *fr = f_quo(*fr, INT2FIX(24)); + } + return rh; +} + +inline static VALUE +min_trunc(VALUE min, VALUE *fr) +{ + VALUE rmin; + + if (wholenum_p(min)) { + rmin = to_integer(min); + *fr = INT2FIX(0); + } + else { + rmin = f_idiv(min, INT2FIX(1)); + *fr = f_mod(min, INT2FIX(1)); + *fr = f_quo(*fr, INT2FIX(1440)); + } + return rmin; +} + +inline static VALUE +s_trunc(VALUE s, VALUE *fr) +{ + VALUE rs; + + if (wholenum_p(s)) { + rs = to_integer(s); + *fr = INT2FIX(0); + } + else { + rs = f_idiv(s, INT2FIX(1)); + *fr = f_mod(s, INT2FIX(1)); + *fr = f_quo(*fr, INT2FIX(86400)); + } + return rs; +} + +#define num2num_with_frac(s,n) \ +do {\ + s = s##_trunc(v##s, &fr);\ + if (f_nonzero_p(fr)) {\ + if (argc > n)\ + rb_raise(eDateError, "invalid fraction");\ + fr2 = fr;\ + }\ +} while (0) + +#define num2int_with_frac(s,n) \ +do {\ + s = NUM2INT(s##_trunc(v##s, &fr));\ + if (f_nonzero_p(fr)) {\ + if (argc > n)\ + rb_raise(eDateError, "invalid fraction");\ + fr2 = fr;\ + }\ +} while (0) + +#define canon24oc() \ +do {\ + if (rh == 24) {\ + rh = 0;\ + fr2 = f_add(fr2, INT2FIX(1));\ + }\ +} while (0) + +#define add_frac() \ +do {\ + if (f_nonzero_p(fr2))\ + ret = d_lite_plus(ret, fr2);\ +} while (0) + +#define val2sg(vsg,dsg) \ +do {\ + dsg = NUM2DBL(vsg);\ + if (!c_valid_start_p(dsg)) {\ + dsg = DEFAULT_SG;\ + rb_warning("invalid start is ignored");\ + }\ +} while (0) + +static VALUE d_lite_plus(VALUE, VALUE); + +/* + * call-seq: + * Date.jd(jd = 0, start = Date::ITALY) -> date + * + * Returns a new \Date object formed from the arguments: + * + * Date.jd(2451944).to_s # => "2001-02-03" + * Date.jd(2451945).to_s # => "2001-02-04" + * Date.jd(0).to_s # => "-4712-01-01" + * + * The returned date is: + * + * - Gregorian, if the argument is greater than or equal to +start+: + * + * Date::ITALY # => 2299161 + * Date.jd(Date::ITALY).gregorian? # => true + * Date.jd(Date::ITALY + 1).gregorian? # => true + * + * - Julian, otherwise + * + * Date.jd(Date::ITALY - 1).julian? # => true + * + * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * + * Related: Date.new. + */ +static VALUE +date_s_jd(int argc, VALUE *argv, VALUE klass) +{ + VALUE vjd, vsg, jd, fr, fr2, ret; + double sg; + + rb_scan_args(argc, argv, "02", &vjd, &vsg); + + jd = INT2FIX(0); + fr2 = INT2FIX(0); + sg = DEFAULT_SG; + + switch (argc) { + case 2: + val2sg(vsg, sg); + case 1: + check_numeric(vjd, "jd"); + num2num_with_frac(jd, positive_inf); + } + + { + VALUE nth; + int rjd; + + decode_jd(jd, &nth, &rjd); + ret = d_simple_new_internal(klass, + nth, rjd, + sg, + 0, 0, 0, + HAVE_JD); + } + add_frac(); + return ret; +} + +/* + * call-seq: + * Date.ordinal(year = -4712, yday = 1, start = Date::ITALY) -> date + * + * Returns a new \Date object formed fom the arguments. + * + * With no arguments, returns the date for January 1, -4712: + * + * Date.ordinal.to_s # => "-4712-01-01" + * + * With argument +year+, returns the date for January 1 of that year: + * + * Date.ordinal(2001).to_s # => "2001-01-01" + * Date.ordinal(-2001).to_s # => "-2001-01-01" + * + * With positive argument +yday+ == +n+, + * returns the date for the +nth+ day of the given year: + * + * Date.ordinal(2001, 14).to_s # => "2001-01-14" + * + * With negative argument +yday+, counts backward from the end of the year: + * + * Date.ordinal(2001, -14).to_s # => "2001-12-18" + * + * Raises an exception if +yday+ is zero or out of range. + * + * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * + * Related: Date.jd, Date.new. + */ +static VALUE +date_s_ordinal(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vd, vsg, y, fr, fr2, ret; + int d; + double sg; + + rb_scan_args(argc, argv, "03", &vy, &vd, &vsg); + + y = INT2FIX(-4712); + d = 1; + fr2 = INT2FIX(0); + sg = DEFAULT_SG; + + switch (argc) { + case 3: + val2sg(vsg, sg); + case 2: + check_numeric(vd, "yday"); + num2int_with_frac(d, positive_inf); + case 1: + check_numeric(vy, "year"); + y = vy; + } + + { + VALUE nth; + int ry, rd, rjd, ns; + + if (!valid_ordinal_p(y, d, sg, + &nth, &ry, + &rd, &rjd, + &ns)) + rb_raise(eDateError, "invalid date"); + + ret = d_simple_new_internal(klass, + nth, rjd, + sg, + 0, 0, 0, + HAVE_JD); + } + add_frac(); + return ret; +} + +/* + * Same as Date.new. + */ +static VALUE +date_s_civil(int argc, VALUE *argv, VALUE klass) +{ + return date_initialize(argc, argv, d_lite_s_alloc_simple(klass)); +} + +/* + * call-seq: + * Date.new(year = -4712, month = 1, mday = 1, start = Date::ITALY) -> date + * + * Returns a new \Date object constructed from the given arguments: + * + * Date.new(2022).to_s # => "2022-01-01" + * Date.new(2022, 2).to_s # => "2022-02-01" + * Date.new(2022, 2, 4).to_s # => "2022-02-04" + * + * Argument +month+ should be in range (1..12) or range (-12..-1); + * when the argument is negative, counts backward from the end of the year: + * + * Date.new(2022, -11, 4).to_s # => "2022-02-04" + * + * Argument +mday+ should be in range (1..n) or range (-n..-1) + * where +n+ is the number of days in the month; + * when the argument is negative, counts backward from the end of the month. + * + * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * + * Related: Date.jd. + */ +static VALUE +date_initialize(int argc, VALUE *argv, VALUE self) +{ + VALUE vy, vm, vd, vsg, y, fr, fr2, ret; + int m, d; + double sg; + struct SimpleDateData *dat = rb_check_typeddata(self, &d_lite_type); + + if (!simple_dat_p(dat)) { + rb_raise(rb_eTypeError, "Date expected"); + } + + rb_scan_args(argc, argv, "04", &vy, &vm, &vd, &vsg); + + y = INT2FIX(-4712); + m = 1; + d = 1; + fr2 = INT2FIX(0); + sg = DEFAULT_SG; + + switch (argc) { + case 4: + val2sg(vsg, sg); + case 3: + check_numeric(vd, "day"); + num2int_with_frac(d, positive_inf); + case 2: + check_numeric(vm, "month"); + m = NUM2INT(vm); + case 1: + check_numeric(vy, "year"); + y = vy; + } + + if (guess_style(y, sg) < 0) { + VALUE nth; + int ry, rm, rd; + + if (!valid_gregorian_p(y, m, d, + &nth, &ry, + &rm, &rd)) + rb_raise(eDateError, "invalid date"); + + set_to_simple(self, dat, nth, 0, sg, ry, rm, rd, HAVE_CIVIL); + } + else { + VALUE nth; + int ry, rm, rd, rjd, ns; + + if (!valid_civil_p(y, m, d, sg, + &nth, &ry, + &rm, &rd, &rjd, + &ns)) + rb_raise(eDateError, "invalid date"); + + set_to_simple(self, dat, nth, rjd, sg, ry, rm, rd, HAVE_JD | HAVE_CIVIL); + } + ret = self; + add_frac(); + return ret; +} + +/* + * call-seq: + * Date.commercial(cwyear = -4712, cweek = 1, cwday = 1, start = Date::ITALY) -> date + * + * Returns a new \Date object constructed from the arguments. + * + * Argument +cwyear+ gives the year, and should be an integer. + * + * Argument +cweek+ gives the index of the week within the year, + * and should be in range (1..53) or (-53..-1); + * in some years, 53 or -53 will be out-of-range; + * if negative, counts backward from the end of the year: + * + * Date.commercial(2022, 1, 1).to_s # => "2022-01-03" + * Date.commercial(2022, 52, 1).to_s # => "2022-12-26" + * + * Argument +cwday+ gives the indes of the weekday within the week, + * and should be in range (1..7) or (-7..-1); + * 1 or -7 is Monday; + * if negative, counts backward from the end of the week: + * + * Date.commercial(2022, 1, 1).to_s # => "2022-01-03" + * Date.commercial(2022, 1, -7).to_s # => "2022-01-03" + * + * When +cweek+ is 1: + * + * - If January 1 is a Friday, Saturday, or Sunday, + * the first week begins in the week after: + * + * Date::ABBR_DAYNAMES[Date.new(2023, 1, 1).wday] # => "Sun" + * Date.commercial(2023, 1, 1).to_s # => "2023-01-02" + Date.commercial(2023, 1, 7).to_s # => "2023-01-08" + * + * - Otherwise, the first week is the week of January 1, + * which may mean some of the days fall on the year before: + * + * Date::ABBR_DAYNAMES[Date.new(2020, 1, 1).wday] # => "Wed" + * Date.commercial(2020, 1, 1).to_s # => "2019-12-30" + Date.commercial(2020, 1, 7).to_s # => "2020-01-05" + * + * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * + * Related: Date.jd, Date.new, Date.ordinal. + */ +static VALUE +date_s_commercial(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vw, vd, vsg, y, fr, fr2, ret; + int w, d; + double sg; + + rb_scan_args(argc, argv, "04", &vy, &vw, &vd, &vsg); + + y = INT2FIX(-4712); + w = 1; + d = 1; + fr2 = INT2FIX(0); + sg = DEFAULT_SG; + + switch (argc) { + case 4: + val2sg(vsg, sg); + case 3: + check_numeric(vd, "cwday"); + num2int_with_frac(d, positive_inf); + case 2: + check_numeric(vw, "cweek"); + w = NUM2INT(vw); + case 1: + check_numeric(vy, "year"); + y = vy; + } + + { + VALUE nth; + int ry, rw, rd, rjd, ns; + + if (!valid_commercial_p(y, w, d, sg, + &nth, &ry, + &rw, &rd, &rjd, + &ns)) + rb_raise(eDateError, "invalid date"); + + ret = d_simple_new_internal(klass, + nth, rjd, + sg, + 0, 0, 0, + HAVE_JD); + } + add_frac(); + return ret; +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +date_s_weeknum(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vw, vd, vf, vsg, y, fr, fr2, ret; + int w, d, f; + double sg; + + rb_scan_args(argc, argv, "05", &vy, &vw, &vd, &vf, &vsg); + + y = INT2FIX(-4712); + w = 0; + d = 1; + f = 0; + fr2 = INT2FIX(0); + sg = DEFAULT_SG; + + switch (argc) { + case 5: + val2sg(vsg, sg); + case 4: + f = NUM2INT(vf); + case 3: + num2int_with_frac(d, positive_inf); + case 2: + w = NUM2INT(vw); + case 1: + y = vy; + } + + { + VALUE nth; + int ry, rw, rd, rjd, ns; + + if (!valid_weeknum_p(y, w, d, f, sg, + &nth, &ry, + &rw, &rd, &rjd, + &ns)) + rb_raise(eDateError, "invalid date"); + + ret = d_simple_new_internal(klass, + nth, rjd, + sg, + 0, 0, 0, + HAVE_JD); + } + add_frac(); + return ret; +} + +/* :nodoc: */ +static VALUE +date_s_nth_kday(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vm, vn, vk, vsg, y, fr, fr2, ret; + int m, n, k; + double sg; + + rb_scan_args(argc, argv, "05", &vy, &vm, &vn, &vk, &vsg); + + y = INT2FIX(-4712); + m = 1; + n = 1; + k = 1; + fr2 = INT2FIX(0); + sg = DEFAULT_SG; + + switch (argc) { + case 5: + val2sg(vsg, sg); + case 4: + num2int_with_frac(k, positive_inf); + case 3: + n = NUM2INT(vn); + case 2: + m = NUM2INT(vm); + case 1: + y = vy; + } + + { + VALUE nth; + int ry, rm, rn, rk, rjd, ns; + + if (!valid_nth_kday_p(y, m, n, k, sg, + &nth, &ry, + &rm, &rn, &rk, &rjd, + &ns)) + rb_raise(eDateError, "invalid date"); + + ret = d_simple_new_internal(klass, + nth, rjd, + sg, + 0, 0, 0, + HAVE_JD); + } + add_frac(); + return ret; +} +#endif + +#if !defined(HAVE_GMTIME_R) +static struct tm* +gmtime_r(const time_t *t, struct tm *tm) +{ + auto struct tm *tmp = gmtime(t); + if (tmp) + *tm = *tmp; + return tmp; +} + +static struct tm* +localtime_r(const time_t *t, struct tm *tm) +{ + auto struct tm *tmp = localtime(t); + if (tmp) + *tm = *tmp; + return tmp; +} +#endif + +static void set_sg(union DateData *, double); + +/* + * call-seq: + * Date.today(start = Date::ITALY) -> date + * + * Returns a new \Date object constructed from the present date: + * + * Date.today.to_s # => "2022-07-06" + * + * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * + */ +static VALUE +date_s_today(int argc, VALUE *argv, VALUE klass) +{ + VALUE vsg, nth, ret; + double sg; + time_t t; + struct tm tm; + int y, ry, m, d; + + rb_scan_args(argc, argv, "01", &vsg); + + if (argc < 1) + sg = DEFAULT_SG; + else + val2sg(vsg, sg); + + if (time(&t) == -1) + rb_sys_fail("time"); + tzset(); + if (!localtime_r(&t, &tm)) + rb_sys_fail("localtime"); + + y = tm.tm_year + 1900; + m = tm.tm_mon + 1; + d = tm.tm_mday; + + decode_year(INT2FIX(y), -1, &nth, &ry); + + ret = d_simple_new_internal(klass, + nth, 0, + GREGORIAN, + ry, m, d, + HAVE_CIVIL); + { + get_d1(ret); + set_sg(dat, sg); + } + return ret; +} + +#define set_hash0(k,v) rb_hash_aset(hash, k, v) +#define ref_hash0(k) rb_hash_aref(hash, k) +#define del_hash0(k) rb_hash_delete(hash, k) + +#define sym(x) ID2SYM(rb_intern(x"")) + +#define set_hash(k,v) set_hash0(sym(k), v) +#define ref_hash(k) ref_hash0(sym(k)) +#define del_hash(k) del_hash0(sym(k)) + +static VALUE +rt_rewrite_frags(VALUE hash) +{ + VALUE seconds; + + seconds = del_hash("seconds"); + if (!NIL_P(seconds)) { + VALUE offset, d, h, min, s, fr; + + offset = ref_hash("offset"); + if (!NIL_P(offset)) + seconds = f_add(seconds, offset); + + d = f_idiv(seconds, INT2FIX(DAY_IN_SECONDS)); + fr = f_mod(seconds, INT2FIX(DAY_IN_SECONDS)); + + h = f_idiv(fr, INT2FIX(HOUR_IN_SECONDS)); + fr = f_mod(fr, INT2FIX(HOUR_IN_SECONDS)); + + min = f_idiv(fr, INT2FIX(MINUTE_IN_SECONDS)); + fr = f_mod(fr, INT2FIX(MINUTE_IN_SECONDS)); + + s = f_idiv(fr, INT2FIX(1)); + fr = f_mod(fr, INT2FIX(1)); + + set_hash("jd", f_add(UNIX_EPOCH_IN_CJD, d)); + set_hash("hour", h); + set_hash("min", min); + set_hash("sec", s); + set_hash("sec_fraction", fr); + } + return hash; +} + +static VALUE d_lite_year(VALUE); +static VALUE d_lite_wday(VALUE); +static VALUE d_lite_jd(VALUE); + +static VALUE +rt_complete_frags(VALUE klass, VALUE hash) +{ + static VALUE tab = Qnil; + int g; + long e; + VALUE k, a, d; + + if (NIL_P(tab)) { + tab = f_frozen_ary(11, + f_frozen_ary(2, + sym("time"), + f_frozen_ary(3, + sym("hour"), + sym("min"), + sym("sec"))), + f_frozen_ary(2, + Qnil, + f_frozen_ary(1, + sym("jd"))), + f_frozen_ary(2, + sym("ordinal"), + f_frozen_ary(5, + sym("year"), + sym("yday"), + sym("hour"), + sym("min"), + sym("sec"))), + f_frozen_ary(2, + sym("civil"), + f_frozen_ary(6, + sym("year"), + sym("mon"), + sym("mday"), + sym("hour"), + sym("min"), + sym("sec"))), + f_frozen_ary(2, + sym("commercial"), + f_frozen_ary(6, + sym("cwyear"), + sym("cweek"), + sym("cwday"), + sym("hour"), + sym("min"), + sym("sec"))), + f_frozen_ary(2, + sym("wday"), + f_frozen_ary(4, + sym("wday"), + sym("hour"), + sym("min"), + sym("sec"))), + f_frozen_ary(2, + sym("wnum0"), + f_frozen_ary(6, + sym("year"), + sym("wnum0"), + sym("wday"), + sym("hour"), + sym("min"), + sym("sec"))), + f_frozen_ary(2, + sym("wnum1"), + f_frozen_ary(6, + sym("year"), + sym("wnum1"), + sym("wday"), + sym("hour"), + sym("min"), + sym("sec"))), + f_frozen_ary(2, + Qnil, + f_frozen_ary(6, + sym("cwyear"), + sym("cweek"), + sym("wday"), + sym("hour"), + sym("min"), + sym("sec"))), + f_frozen_ary(2, + Qnil, + f_frozen_ary(6, + sym("year"), + sym("wnum0"), + sym("cwday"), + sym("hour"), + sym("min"), + sym("sec"))), + f_frozen_ary(2, + Qnil, + f_frozen_ary(6, + sym("year"), + sym("wnum1"), + sym("cwday"), + sym("hour"), + sym("min"), + sym("sec")))); + rb_gc_register_mark_object(tab); + } + + { + long i, eno = 0, idx = 0; + + for (i = 0; i < RARRAY_LEN(tab); i++) { + VALUE x, a; + + x = RARRAY_AREF(tab, i); + a = RARRAY_AREF(x, 1); + + { + long j, n = 0; + + for (j = 0; j < RARRAY_LEN(a); j++) + if (!NIL_P(ref_hash0(RARRAY_AREF(a, j)))) + n++; + if (n > eno) { + eno = n; + idx = i; + } + } + } + if (eno == 0) + g = 0; + else { + g = 1; + k = RARRAY_AREF(RARRAY_AREF(tab, idx), 0); + a = RARRAY_AREF(RARRAY_AREF(tab, idx), 1); + e = eno; + } + } + + d = Qnil; + + if (g && !NIL_P(k) && (RARRAY_LEN(a) - e)) { + if (k == sym("ordinal")) { + if (NIL_P(ref_hash("year"))) { + if (NIL_P(d)) + d = date_s_today(0, (VALUE *)0, cDate); + set_hash("year", d_lite_year(d)); + } + if (NIL_P(ref_hash("yday"))) + set_hash("yday", INT2FIX(1)); + } + else if (k == sym("civil")) { + long i; + + for (i = 0; i < RARRAY_LEN(a); i++) { + VALUE e = RARRAY_AREF(a, i); + + if (!NIL_P(ref_hash0(e))) + break; + if (NIL_P(d)) + d = date_s_today(0, (VALUE *)0, cDate); + set_hash0(e, rb_funcall(d, SYM2ID(e), 0)); + } + if (NIL_P(ref_hash("mon"))) + set_hash("mon", INT2FIX(1)); + if (NIL_P(ref_hash("mday"))) + set_hash("mday", INT2FIX(1)); + } + else if (k == sym("commercial")) { + long i; + + for (i = 0; i < RARRAY_LEN(a); i++) { + VALUE e = RARRAY_AREF(a, i); + + if (!NIL_P(ref_hash0(e))) + break; + if (NIL_P(d)) + d = date_s_today(0, (VALUE *)0, cDate); + set_hash0(e, rb_funcall(d, SYM2ID(e), 0)); + } + if (NIL_P(ref_hash("cweek"))) + set_hash("cweek", INT2FIX(1)); + if (NIL_P(ref_hash("cwday"))) + set_hash("cwday", INT2FIX(1)); + } + else if (k == sym("wday")) { + if (NIL_P(d)) + d = date_s_today(0, (VALUE *)0, cDate); + set_hash("jd", d_lite_jd(f_add(f_sub(d, + d_lite_wday(d)), + ref_hash("wday")))); + } + else if (k == sym("wnum0")) { + long i; + + for (i = 0; i < RARRAY_LEN(a); i++) { + VALUE e = RARRAY_AREF(a, i); + + if (!NIL_P(ref_hash0(e))) + break; + if (NIL_P(d)) + d = date_s_today(0, (VALUE *)0, cDate); + set_hash0(e, rb_funcall(d, SYM2ID(e), 0)); + } + if (NIL_P(ref_hash("wnum0"))) + set_hash("wnum0", INT2FIX(0)); + if (NIL_P(ref_hash("wday"))) + set_hash("wday", INT2FIX(0)); + } + else if (k == sym("wnum1")) { + long i; + + for (i = 0; i < RARRAY_LEN(a); i++) { + VALUE e = RARRAY_AREF(a, i); + + if (!NIL_P(ref_hash0(e))) + break; + if (NIL_P(d)) + d = date_s_today(0, (VALUE *)0, cDate); + set_hash0(e, rb_funcall(d, SYM2ID(e), 0)); + } + if (NIL_P(ref_hash("wnum1"))) + set_hash("wnum1", INT2FIX(0)); + if (NIL_P(ref_hash("wday"))) + set_hash("wday", INT2FIX(1)); + } + } + + if (g && k == sym("time")) { + if (f_le_p(klass, cDateTime)) { + if (NIL_P(d)) + d = date_s_today(0, (VALUE *)0, cDate); + if (NIL_P(ref_hash("jd"))) + set_hash("jd", d_lite_jd(d)); + } + } + + if (NIL_P(ref_hash("hour"))) + set_hash("hour", INT2FIX(0)); + if (NIL_P(ref_hash("min"))) + set_hash("min", INT2FIX(0)); + if (NIL_P(ref_hash("sec"))) + set_hash("sec", INT2FIX(0)); + else if (f_gt_p(ref_hash("sec"), INT2FIX(59))) + set_hash("sec", INT2FIX(59)); + + return hash; +} + +static VALUE +rt__valid_jd_p(VALUE jd, VALUE sg) +{ + return jd; +} + +static VALUE +rt__valid_ordinal_p(VALUE y, VALUE d, VALUE sg) +{ + VALUE nth, rjd2; + int ry, rd, rjd, ns; + + if (!valid_ordinal_p(y, NUM2INT(d), NUM2DBL(sg), + &nth, &ry, + &rd, &rjd, + &ns)) + return Qnil; + encode_jd(nth, rjd, &rjd2); + return rjd2; +} + +static VALUE +rt__valid_civil_p(VALUE y, VALUE m, VALUE d, VALUE sg) +{ + VALUE nth, rjd2; + int ry, rm, rd, rjd, ns; + + if (!valid_civil_p(y, NUM2INT(m), NUM2INT(d), NUM2DBL(sg), + &nth, &ry, + &rm, &rd, &rjd, + &ns)) + return Qnil; + encode_jd(nth, rjd, &rjd2); + return rjd2; +} + +static VALUE +rt__valid_commercial_p(VALUE y, VALUE w, VALUE d, VALUE sg) +{ + VALUE nth, rjd2; + int ry, rw, rd, rjd, ns; + + if (!valid_commercial_p(y, NUM2INT(w), NUM2INT(d), NUM2DBL(sg), + &nth, &ry, + &rw, &rd, &rjd, + &ns)) + return Qnil; + encode_jd(nth, rjd, &rjd2); + return rjd2; +} + +static VALUE +rt__valid_weeknum_p(VALUE y, VALUE w, VALUE d, VALUE f, VALUE sg) +{ + VALUE nth, rjd2; + int ry, rw, rd, rjd, ns; + + if (!valid_weeknum_p(y, NUM2INT(w), NUM2INT(d), NUM2INT(f), NUM2DBL(sg), + &nth, &ry, + &rw, &rd, &rjd, + &ns)) + return Qnil; + encode_jd(nth, rjd, &rjd2); + return rjd2; +} + +static VALUE +rt__valid_date_frags_p(VALUE hash, VALUE sg) +{ + { + VALUE vjd; + + if (!NIL_P(vjd = ref_hash("jd"))) { + VALUE jd = rt__valid_jd_p(vjd, sg); + if (!NIL_P(jd)) + return jd; + } + } + + { + VALUE year, yday; + + if (!NIL_P(yday = ref_hash("yday")) && + !NIL_P(year = ref_hash("year"))) { + VALUE jd = rt__valid_ordinal_p(year, yday, sg); + if (!NIL_P(jd)) + return jd; + } + } + + { + VALUE year, mon, mday; + + if (!NIL_P(mday = ref_hash("mday")) && + !NIL_P(mon = ref_hash("mon")) && + !NIL_P(year = ref_hash("year"))) { + VALUE jd = rt__valid_civil_p(year, mon, mday, sg); + if (!NIL_P(jd)) + return jd; + } + } + + { + VALUE year, week, wday; + + wday = ref_hash("cwday"); + if (NIL_P(wday)) { + wday = ref_hash("wday"); + if (!NIL_P(wday)) + if (f_zero_p(wday)) + wday = INT2FIX(7); + } + + if (!NIL_P(wday) && + !NIL_P(week = ref_hash("cweek")) && + !NIL_P(year = ref_hash("cwyear"))) { + VALUE jd = rt__valid_commercial_p(year, week, wday, sg); + if (!NIL_P(jd)) + return jd; + } + } + + { + VALUE year, week, wday; + + wday = ref_hash("wday"); + if (NIL_P(wday)) { + wday = ref_hash("cwday"); + if (!NIL_P(wday)) + if (f_eqeq_p(wday, INT2FIX(7))) + wday = INT2FIX(0); + } + + if (!NIL_P(wday) && + !NIL_P(week = ref_hash("wnum0")) && + !NIL_P(year = ref_hash("year"))) { + VALUE jd = rt__valid_weeknum_p(year, week, wday, INT2FIX(0), sg); + if (!NIL_P(jd)) + return jd; + } + } + + { + VALUE year, week, wday; + + wday = ref_hash("wday"); + if (NIL_P(wday)) + wday = ref_hash("cwday"); + if (!NIL_P(wday)) + wday = f_mod(f_sub(wday, INT2FIX(1)), + INT2FIX(7)); + + if (!NIL_P(wday) && + !NIL_P(week = ref_hash("wnum1")) && + !NIL_P(year = ref_hash("year"))) { + VALUE jd = rt__valid_weeknum_p(year, week, wday, INT2FIX(1), sg); + if (!NIL_P(jd)) + return jd; + } + } + return Qnil; +} + +static VALUE +d_new_by_frags(VALUE klass, VALUE hash, VALUE sg) +{ + VALUE jd; + + if (!c_valid_start_p(NUM2DBL(sg))) { + sg = INT2FIX(DEFAULT_SG); + rb_warning("invalid start is ignored"); + } + + if (NIL_P(hash)) + rb_raise(eDateError, "invalid date"); + + if (NIL_P(ref_hash("jd")) && + NIL_P(ref_hash("yday")) && + !NIL_P(ref_hash("year")) && + !NIL_P(ref_hash("mon")) && + !NIL_P(ref_hash("mday"))) + jd = rt__valid_civil_p(ref_hash("year"), + ref_hash("mon"), + ref_hash("mday"), sg); + else { + hash = rt_rewrite_frags(hash); + hash = rt_complete_frags(klass, hash); + jd = rt__valid_date_frags_p(hash, sg); + } + + if (NIL_P(jd)) + rb_raise(eDateError, "invalid date"); + { + VALUE nth; + int rjd; + + decode_jd(jd, &nth, &rjd); + return d_simple_new_internal(klass, + nth, rjd, + NUM2DBL(sg), + 0, 0, 0, + HAVE_JD); + } +} + +VALUE date__strptime(const char *str, size_t slen, + const char *fmt, size_t flen, VALUE hash); + +static VALUE +date_s__strptime_internal(int argc, VALUE *argv, VALUE klass, + const char *default_fmt) +{ + VALUE vstr, vfmt, hash; + const char *str, *fmt; + size_t slen, flen; + + rb_scan_args(argc, argv, "11", &vstr, &vfmt); + + StringValue(vstr); + if (!rb_enc_str_asciicompat_p(vstr)) + rb_raise(rb_eArgError, + "string should have ASCII compatible encoding"); + str = RSTRING_PTR(vstr); + slen = RSTRING_LEN(vstr); + if (argc < 2) { + fmt = default_fmt; + flen = strlen(default_fmt); + } + else { + StringValue(vfmt); + if (!rb_enc_str_asciicompat_p(vfmt)) + rb_raise(rb_eArgError, + "format should have ASCII compatible encoding"); + fmt = RSTRING_PTR(vfmt); + flen = RSTRING_LEN(vfmt); + } + hash = rb_hash_new(); + if (NIL_P(date__strptime(str, slen, fmt, flen, hash))) + return Qnil; + + { + VALUE zone = ref_hash("zone"); + VALUE left = ref_hash("leftover"); + + if (!NIL_P(zone)) { + rb_enc_copy(zone, vstr); + set_hash("zone", zone); + } + if (!NIL_P(left)) { + rb_enc_copy(left, vstr); + set_hash("leftover", left); + } + } + + return hash; +} + +/* + * call-seq: + * Date._strptime(string, format = '%F') -> hash + * + * Returns a hash of values parsed from +string+ + * according to the given +format+: + * + * Date._strptime('2001-02-03', '%Y-%m-%d') # => {:year=>2001, :mon=>2, :mday=>3} + * + * For other formats, see + * {Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html]. + * (Unlike Date.strftime, does not support flags and width.) + * + * See also {strptime(3)}[https://man7.org/linux/man-pages/man3/strptime.3.html]. + * + * Related: Date.strptime (returns a \Date object). + */ +static VALUE +date_s__strptime(int argc, VALUE *argv, VALUE klass) +{ + return date_s__strptime_internal(argc, argv, klass, "%F"); +} + +/* + * call-seq: + * Date.strptime(string = '-4712-01-01', format = '%F', start = Date::ITALY) -> date + * + * Returns a new \Date object with values parsed from +string+, + * according to the given +format+: + * + * Date.strptime('2001-02-03', '%Y-%m-%d') # => # + * Date.strptime('03-02-2001', '%d-%m-%Y') # => # + * Date.strptime('2001-034', '%Y-%j') # => # + * Date.strptime('2001-W05-6', '%G-W%V-%u') # => # + * Date.strptime('2001 04 6', '%Y %U %w') # => # + * Date.strptime('2001 05 6', '%Y %W %u') # => # + * Date.strptime('sat3feb01', '%a%d%b%y') # => # + * + * For other formats, see + * {Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html]. + * (Unlike Date.strftime, does not support flags and width.) + * + * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * + * See also {strptime(3)}[https://man7.org/linux/man-pages/man3/strptime.3.html]. + * + * Related: Date._strptime (returns a hash). + */ +static VALUE +date_s_strptime(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, fmt, sg; + + rb_scan_args(argc, argv, "03", &str, &fmt, &sg); + + switch (argc) { + case 0: + str = rb_str_new2(JULIAN_EPOCH_DATE); + case 1: + fmt = rb_str_new2("%F"); + case 2: + sg = INT2FIX(DEFAULT_SG); + } + + { + VALUE argv2[2], hash; + + argv2[0] = str; + argv2[1] = fmt; + hash = date_s__strptime(2, argv2, klass); + return d_new_by_frags(klass, hash, sg); + } +} + +VALUE date__parse(VALUE str, VALUE comp); + +static size_t +get_limit(VALUE opt) +{ + if (!NIL_P(opt)) { + VALUE limit = rb_hash_aref(opt, ID2SYM(rb_intern("limit"))); + if (NIL_P(limit)) return SIZE_MAX; + return NUM2SIZET(limit); + } + return 128; +} + +#ifndef HAVE_RB_CATEGORY_WARN +#define rb_category_warn(category, fmt) rb_warn(fmt) +#endif + +static void +check_limit(VALUE str, VALUE opt) +{ + size_t slen, limit; + if (NIL_P(str)) return; + StringValue(str); + slen = RSTRING_LEN(str); + limit = get_limit(opt); + if (slen > limit) { + rb_raise(rb_eArgError, + "string length (%"PRI_SIZE_PREFIX"u) exceeds the limit %"PRI_SIZE_PREFIX"u", slen, limit); + } +} + +static VALUE +date_s__parse_internal(int argc, VALUE *argv, VALUE klass) +{ + VALUE vstr, vcomp, hash, opt; + + argc = rb_scan_args(argc, argv, "11:", &vstr, &vcomp, &opt); + check_limit(vstr, opt); + StringValue(vstr); + if (!rb_enc_str_asciicompat_p(vstr)) + rb_raise(rb_eArgError, + "string should have ASCII compatible encoding"); + if (argc < 2) + vcomp = Qtrue; + + hash = date__parse(vstr, vcomp); + + return hash; +} + +/* + * call-seq: + * Date._parse(string, comp = true, limit: 128) -> hash + * + * Note: + * This method recognizes many forms in +string+, + * but it is not a validator. + * For formats, see + * {"Specialized Format Strings" in Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-Specialized+Format+Strings] + * + * If +string+ does not specify a valid date, + * the result is unpredictable; + * consider using Date._strptime instead. + * + * Returns a hash of values parsed from +string+: + * + * Date._parse('2001-02-03') # => {:year=>2001, :mon=>2, :mday=>3} + * + * If +comp+ is +true+ and the given year is in the range (0..99), + * the current century is supplied; + * otherwise, the year is taken as given: + * + * Date._parse('01-02-03', true) # => {:year=>2001, :mon=>2, :mday=>3} + * Date._parse('01-02-03', false) # => {:year=>1, :mon=>2, :mday=>3} + * + * See argument {limit}[rdoc-ref:Date@Argument+limit]. + * + * Related: Date.parse(returns a \Date object). + */ +static VALUE +date_s__parse(int argc, VALUE *argv, VALUE klass) +{ + return date_s__parse_internal(argc, argv, klass); +} + +/* + * call-seq: + * Date.parse(string = '-4712-01-01', comp = true, start = Date::ITALY, limit: 128) -> date + * + * Note: + * This method recognizes many forms in +string+, + * but it is not a validator. + * For formats, see + * {"Specialized Format Strings" in Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-Specialized+Format+Strings] + * If +string+ does not specify a valid date, + * the result is unpredictable; + * consider using Date._strptime instead. + * + * Returns a new \Date object with values parsed from +string+: + * + * Date.parse('2001-02-03') # => # + * Date.parse('20010203') # => # + * Date.parse('3rd Feb 2001') # => # + * + * If +comp+ is +true+ and the given year is in the range (0..99), + * the current century is supplied; + * otherwise, the year is taken as given: + * + * Date.parse('01-02-03', true) # => # + * Date.parse('01-02-03', false) # => # + * + * See: + * + * - Argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * - Argument {limit}[rdoc-ref:Date@Argument+limit]. + * + * Related: Date._parse (returns a hash). + */ +static VALUE +date_s_parse(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, comp, sg, opt; + + argc = rb_scan_args(argc, argv, "03:", &str, &comp, &sg, &opt); + + switch (argc) { + case 0: + str = rb_str_new2(JULIAN_EPOCH_DATE); + case 1: + comp = Qtrue; + case 2: + sg = INT2FIX(DEFAULT_SG); + } + + { + int argc2 = 2; + VALUE argv2[3], hash; + argv2[0] = str; + argv2[1] = comp; + if (!NIL_P(opt)) argv2[argc2++] = opt; + hash = date_s__parse(argc2, argv2, klass); + return d_new_by_frags(klass, hash, sg); + } +} + +VALUE date__iso8601(VALUE); +VALUE date__rfc3339(VALUE); +VALUE date__xmlschema(VALUE); +VALUE date__rfc2822(VALUE); +VALUE date__httpdate(VALUE); +VALUE date__jisx0301(VALUE); + +/* + * call-seq: + * Date._iso8601(string, limit: 128) -> hash + * + * Returns a hash of values parsed from +string+, which should contain + * an {ISO 8601 formatted date}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-ISO+8601+Format+Specifications]: + * + * d = Date.new(2001, 2, 3) + * s = d.iso8601 # => "2001-02-03" + * Date._iso8601(s) # => {:mday=>3, :year=>2001, :mon=>2} + * + * See argument {limit}[rdoc-ref:Date@Argument+limit]. + * + * Related: Date.iso8601 (returns a \Date object). + */ +static VALUE +date_s__iso8601(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, opt; + + rb_scan_args(argc, argv, "1:", &str, &opt); + check_limit(str, opt); + + return date__iso8601(str); +} + +/* + * call-seq: + * Date.iso8601(string = '-4712-01-01', start = Date::ITALY, limit: 128) -> date + * + * Returns a new \Date object with values parsed from +string+, + * which should contain + * an {ISO 8601 formatted date}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-ISO+8601+Format+Specifications]: + * + * d = Date.new(2001, 2, 3) + * s = d.iso8601 # => "2001-02-03" + * Date.iso8601(s) # => # + * + * See: + * + * - Argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * - Argument {limit}[rdoc-ref:Date@Argument+limit]. + * + * Related: Date._iso8601 (returns a hash). + */ +static VALUE +date_s_iso8601(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, sg, opt; + + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); + + switch (argc) { + case 0: + str = rb_str_new2(JULIAN_EPOCH_DATE); + case 1: + sg = INT2FIX(DEFAULT_SG); + } + + { + int argc2 = 1; + VALUE argv2[2], hash; + argv2[0] = str; + if (!NIL_P(opt)) argv2[argc2++] = opt; + hash = date_s__iso8601(argc2, argv2, klass); + return d_new_by_frags(klass, hash, sg); + } +} + +/* + * call-seq: + * Date._rfc3339(string, limit: 128) -> hash + * + * Returns a hash of values parsed from +string+, which should be a valid + * {RFC 3339 format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-RFC+3339+Format]: + * + * d = Date.new(2001, 2, 3) + * s = d.rfc3339 # => "2001-02-03T00:00:00+00:00" + * Date._rfc3339(s) + * # => {:year=>2001, :mon=>2, :mday=>3, :hour=>0, :min=>0, :sec=>0, :zone=>"+00:00", :offset=>0} + * + * See argument {limit}[rdoc-ref:Date@Argument+limit]. + * + * Related: Date.rfc3339 (returns a \Date object). + */ +static VALUE +date_s__rfc3339(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, opt; + + rb_scan_args(argc, argv, "1:", &str, &opt); + check_limit(str, opt); + + return date__rfc3339(str); +} + +/* + * call-seq: + * Date.rfc3339(string = '-4712-01-01T00:00:00+00:00', start = Date::ITALY, limit: 128) -> date + * + * Returns a new \Date object with values parsed from +string+, + * which should be a valid + * {RFC 3339 format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-RFC+3339+Format]: + * + * d = Date.new(2001, 2, 3) + * s = d.rfc3339 # => "2001-02-03T00:00:00+00:00" + * Date.rfc3339(s) # => # + * + * See: + * + * - Argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * - Argument {limit}[rdoc-ref:Date@Argument+limit]. + * + * Related: Date._rfc3339 (returns a hash). + */ +static VALUE +date_s_rfc3339(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, sg, opt; + + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); + + switch (argc) { + case 0: + str = rb_str_new2(JULIAN_EPOCH_DATETIME); + case 1: + sg = INT2FIX(DEFAULT_SG); + } + + { + int argc2 = 1; + VALUE argv2[2], hash; + argv2[0] = str; + if (!NIL_P(opt)) argv2[argc2++] = opt; + hash = date_s__rfc3339(argc2, argv2, klass); + return d_new_by_frags(klass, hash, sg); + } +} + +/* + * call-seq: + * Date._xmlschema(string, limit: 128) -> hash + * + * Returns a hash of values parsed from +string+, which should be a valid + * XML date format: + * + * d = Date.new(2001, 2, 3) + * s = d.xmlschema # => "2001-02-03" + * Date._xmlschema(s) # => {:year=>2001, :mon=>2, :mday=>3} + * + * See argument {limit}[rdoc-ref:Date@Argument+limit]. + * + * Related: Date.xmlschema (returns a \Date object). + */ +static VALUE +date_s__xmlschema(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, opt; + + rb_scan_args(argc, argv, "1:", &str, &opt); + check_limit(str, opt); + + return date__xmlschema(str); +} + +/* + * call-seq: + * Date.xmlschema(string = '-4712-01-01', start = Date::ITALY, limit: 128) -> date + * + * Returns a new \Date object with values parsed from +string+, + * which should be a valid XML date format: + * + * d = Date.new(2001, 2, 3) + * s = d.xmlschema # => "2001-02-03" + * Date.xmlschema(s) # => # + * + * See: + * + * - Argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * - Argument {limit}[rdoc-ref:Date@Argument+limit]. + * + * Related: Date._xmlschema (returns a hash). + */ +static VALUE +date_s_xmlschema(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, sg, opt; + + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); + + switch (argc) { + case 0: + str = rb_str_new2(JULIAN_EPOCH_DATE); + case 1: + sg = INT2FIX(DEFAULT_SG); + } + + { + int argc2 = 1; + VALUE argv2[2], hash; + argv2[0] = str; + if (!NIL_P(opt)) argv2[argc2++] = opt; + hash = date_s__xmlschema(argc2, argv2, klass); + return d_new_by_frags(klass, hash, sg); + } +} + +/* + * call-seq: + * Date._rfc2822(string, limit: 128) -> hash + * + * Returns a hash of values parsed from +string+, which should be a valid + * {RFC 2822 date format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-RFC+2822+Format]: + * + * d = Date.new(2001, 2, 3) + * s = d.rfc2822 # => "Sat, 3 Feb 2001 00:00:00 +0000" + * Date._rfc2822(s) + * # => {:wday=>6, :mday=>3, :mon=>2, :year=>2001, :hour=>0, :min=>0, :sec=>0, :zone=>"+0000", :offset=>0} + * + * See argument {limit}[rdoc-ref:Date@Argument+limit]. + * + * Related: Date.rfc2822 (returns a \Date object). + */ +static VALUE +date_s__rfc2822(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, opt; + + rb_scan_args(argc, argv, "1:", &str, &opt); + check_limit(str, opt); + + return date__rfc2822(str); +} + +/* + * call-seq: + * Date.rfc2822(string = 'Mon, 1 Jan -4712 00:00:00 +0000', start = Date::ITALY, limit: 128) -> date + * + * Returns a new \Date object with values parsed from +string+, + * which should be a valid + * {RFC 2822 date format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-RFC+2822+Format]: + * + * d = Date.new(2001, 2, 3) + * s = d.rfc2822 # => "Sat, 3 Feb 2001 00:00:00 +0000" + * Date.rfc2822(s) # => # + * + * See: + * + * - Argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * - Argument {limit}[rdoc-ref:Date@Argument+limit]. + * + * Related: Date._rfc2822 (returns a hash). + */ +static VALUE +date_s_rfc2822(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, sg, opt; + + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); + + switch (argc) { + case 0: + str = rb_str_new2(JULIAN_EPOCH_DATETIME_RFC3339); + case 1: + sg = INT2FIX(DEFAULT_SG); + } + + { + int argc2 = 1; + VALUE argv2[2], hash; + argv2[0] = str; + if (!NIL_P(opt)) argv2[argc2++] = opt; + hash = date_s__rfc2822(argc2, argv2, klass); + return d_new_by_frags(klass, hash, sg); + } +} + +/* + * call-seq: + * Date._httpdate(string, limit: 128) -> hash + * + * Returns a hash of values parsed from +string+, which should be a valid + * {HTTP date format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-HTTP+Format]: + * + * d = Date.new(2001, 2, 3) + * s = d.httpdate # => "Sat, 03 Feb 2001 00:00:00 GMT" + * Date._httpdate(s) + * # => {:wday=>6, :mday=>3, :mon=>2, :year=>2001, :hour=>0, :min=>0, :sec=>0, :zone=>"GMT", :offset=>0} + * + * Related: Date.httpdate (returns a \Date object). + */ +static VALUE +date_s__httpdate(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, opt; + + rb_scan_args(argc, argv, "1:", &str, &opt); + check_limit(str, opt); + + return date__httpdate(str); +} + +/* + * call-seq: + * Date.httpdate(string = 'Mon, 01 Jan -4712 00:00:00 GMT', start = Date::ITALY, limit: 128) -> date + * + * Returns a new \Date object with values parsed from +string+, + * which should be a valid + * {HTTP date format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-HTTP+Format]: + * + * d = Date.new(2001, 2, 3) + s = d.httpdate # => "Sat, 03 Feb 2001 00:00:00 GMT" + Date.httpdate(s) # => # + * + * See: + * + * - Argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * - Argument {limit}[rdoc-ref:Date@Argument+limit]. + * + * Related: Date._httpdate (returns a hash). + */ +static VALUE +date_s_httpdate(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, sg, opt; + + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); + + switch (argc) { + case 0: + str = rb_str_new2(JULIAN_EPOCH_DATETIME_HTTPDATE); + case 1: + sg = INT2FIX(DEFAULT_SG); + } + + { + int argc2 = 1; + VALUE argv2[2], hash; + argv2[0] = str; + if (!NIL_P(opt)) argv2[argc2++] = opt; + hash = date_s__httpdate(argc2, argv2, klass); + return d_new_by_frags(klass, hash, sg); + } +} + +/* + * call-seq: + * Date._jisx0301(string, limit: 128) -> hash + * + * Returns a hash of values parsed from +string+, which should be a valid + * {JIS X 0301 date format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-JIS+X+0301+Format]: + * + * d = Date.new(2001, 2, 3) + * s = d.jisx0301 # => "H13.02.03" + * Date._jisx0301(s) # => {:year=>2001, :mon=>2, :mday=>3} + * + * See argument {limit}[rdoc-ref:Date@Argument+limit]. + * + * Related: Date.jisx0301 (returns a \Date object). + */ +static VALUE +date_s__jisx0301(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, opt; + + rb_scan_args(argc, argv, "1:", &str, &opt); + check_limit(str, opt); + + return date__jisx0301(str); +} + +/* + * call-seq: + * Date.jisx0301(string = '-4712-01-01', start = Date::ITALY, limit: 128) -> date + * + * Returns a new \Date object with values parsed from +string+, + * which should be a valid {JIS X 0301 format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-JIS+X+0301+Format]: + * + * d = Date.new(2001, 2, 3) + * s = d.jisx0301 # => "H13.02.03" + * Date.jisx0301(s) # => # + * + * For no-era year, legacy format, Heisei is assumed. + * + * Date.jisx0301('13.02.03') # => # + * + * See: + * + * - Argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * - Argument {limit}[rdoc-ref:Date@Argument+limit]. + * + * Related: Date._jisx0301 (returns a hash). + */ +static VALUE +date_s_jisx0301(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, sg, opt; + + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); + + switch (argc) { + case 0: + str = rb_str_new2(JULIAN_EPOCH_DATE); + case 1: + sg = INT2FIX(DEFAULT_SG); + } + + { + int argc2 = 1; + VALUE argv2[2], hash; + argv2[0] = str; + if (!NIL_P(opt)) argv2[argc2++] = opt; + hash = date_s__jisx0301(argc2, argv2, klass); + return d_new_by_frags(klass, hash, sg); + } +} + +static VALUE +dup_obj(VALUE self) +{ + get_d1a(self); + + if (simple_dat_p(adat)) { + VALUE new = d_lite_s_alloc_simple(rb_obj_class(self)); + { + get_d1b(new); + bdat->s = adat->s; + RB_OBJ_WRITTEN(new, Qundef, bdat->s.nth); + return new; + } + } + else { + VALUE new = d_lite_s_alloc_complex(rb_obj_class(self)); + { + get_d1b(new); + bdat->c = adat->c; + RB_OBJ_WRITTEN(new, Qundef, bdat->c.nth); + RB_OBJ_WRITTEN(new, Qundef, bdat->c.sf); + return new; + } + } +} + +static VALUE +dup_obj_as_complex(VALUE self) +{ + get_d1a(self); + + if (simple_dat_p(adat)) { + VALUE new = d_lite_s_alloc_complex(rb_obj_class(self)); + { + get_d1b(new); + copy_simple_to_complex(new, &bdat->c, &adat->s); + bdat->c.flags |= HAVE_DF | COMPLEX_DAT; + return new; + } + } + else { + VALUE new = d_lite_s_alloc_complex(rb_obj_class(self)); + { + get_d1b(new); + bdat->c = adat->c; + RB_OBJ_WRITTEN(new, Qundef, bdat->c.nth); + RB_OBJ_WRITTEN(new, Qundef, bdat->c.sf); + return new; + } + } +} + +#define val2off(vof,iof) \ +do {\ + if (!offset_to_sec(vof, &iof)) {\ + iof = 0;\ + rb_warning("invalid offset is ignored");\ + }\ +} while (0) + +#if 0 +static VALUE +d_lite_initialize(int argc, VALUE *argv, VALUE self) +{ + VALUE jd, vjd, vdf, sf, vsf, vof, vsg; + int df, of; + double sg; + + rb_check_frozen(self); + + rb_scan_args(argc, argv, "05", &vjd, &vdf, &vsf, &vof, &vsg); + + jd = INT2FIX(0); + df = 0; + sf = INT2FIX(0); + of = 0; + sg = DEFAULT_SG; + + switch (argc) { + case 5: + val2sg(vsg, sg); + case 4: + val2off(vof, of); + case 3: + sf = vsf; + if (f_lt_p(sf, INT2FIX(0)) || + f_ge_p(sf, INT2FIX(SECOND_IN_NANOSECONDS))) + rb_raise(eDateError, "invalid second fraction"); + case 2: + df = NUM2INT(vdf); + if (df < 0 || df >= DAY_IN_SECONDS) + rb_raise(eDateError, "invalid day fraction"); + case 1: + jd = vjd; + } + + { + VALUE nth; + int rjd; + + get_d1(self); + + decode_jd(jd, &nth, &rjd); + if (!df && f_zero_p(sf) && !of) { + set_to_simple(self, &dat->s, nth, rjd, sg, 0, 0, 0, HAVE_JD); + } + else { + if (!complex_dat_p(dat)) + rb_raise(rb_eArgError, + "cannot load complex into simple"); + + set_to_complex(self, &dat->c, nth, rjd, df, sf, of, sg, + 0, 0, 0, 0, 0, 0, HAVE_JD | HAVE_DF); + } + } + return self; +} +#endif + +/* :nodoc: */ +static VALUE +d_lite_initialize_copy(VALUE copy, VALUE date) +{ + rb_check_frozen(copy); + + if (copy == date) + return copy; + { + get_d2(copy, date); + if (simple_dat_p(bdat)) { + if (simple_dat_p(adat)) { + adat->s = bdat->s; + } + else { + adat->c.flags = bdat->s.flags | COMPLEX_DAT; + adat->c.nth = bdat->s.nth; + adat->c.jd = bdat->s.jd; + adat->c.df = 0; + adat->c.sf = INT2FIX(0); + adat->c.of = 0; + adat->c.sg = bdat->s.sg; + adat->c.year = bdat->s.year; +#ifndef USE_PACK + adat->c.mon = bdat->s.mon; + adat->c.mday = bdat->s.mday; + adat->c.hour = bdat->s.hour; + adat->c.min = bdat->s.min; + adat->c.sec = bdat->s.sec; +#else + adat->c.pc = bdat->s.pc; +#endif + } + } + else { + if (!complex_dat_p(adat)) + rb_raise(rb_eArgError, + "cannot load complex into simple"); + + adat->c = bdat->c; + } + } + return copy; +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +d_lite_fill(VALUE self) +{ + get_d1(self); + + if (simple_dat_p(dat)) { + get_s_jd(dat); + get_s_civil(dat); + } + else { + get_c_jd(dat); + get_c_civil(dat); + get_c_df(dat); + get_c_time(dat); + } + return self; +} +#endif + +/* + * call-seq: + * d.ajd -> rational + * + * Returns the astronomical Julian day number. This is a fractional + * number, which is not adjusted by the offset. + * + * DateTime.new(2001,2,3,4,5,6,'+7').ajd #=> (11769328217/4800) + * DateTime.new(2001,2,2,14,5,6,'-7').ajd #=> (11769328217/4800) + */ +static VALUE +d_lite_ajd(VALUE self) +{ + get_d1(self); + return m_ajd(dat); +} + +/* + * call-seq: + * d.amjd -> rational + * + * Returns the astronomical modified Julian day number. This is + * a fractional number, which is not adjusted by the offset. + * + * DateTime.new(2001,2,3,4,5,6,'+7').amjd #=> (249325817/4800) + * DateTime.new(2001,2,2,14,5,6,'-7').amjd #=> (249325817/4800) + */ +static VALUE +d_lite_amjd(VALUE self) +{ + get_d1(self); + return m_amjd(dat); +} + +/* + * call-seq: + * d.jd -> integer + * + * Returns the Julian day number. This is a whole number, which is + * adjusted by the offset as the local time. + * + * DateTime.new(2001,2,3,4,5,6,'+7').jd #=> 2451944 + * DateTime.new(2001,2,3,4,5,6,'-7').jd #=> 2451944 + */ +static VALUE +d_lite_jd(VALUE self) +{ + get_d1(self); + return m_real_local_jd(dat); +} + +/* + * call-seq: + * d.mjd -> integer + * + * Returns the modified Julian day number. This is a whole number, + * which is adjusted by the offset as the local time. + * + * DateTime.new(2001,2,3,4,5,6,'+7').mjd #=> 51943 + * DateTime.new(2001,2,3,4,5,6,'-7').mjd #=> 51943 + */ +static VALUE +d_lite_mjd(VALUE self) +{ + get_d1(self); + return f_sub(m_real_local_jd(dat), INT2FIX(2400001)); +} + +/* + * call-seq: + * ld -> integer + * + * Returns the + * {Lilian day number}[https://en.wikipedia.org/wiki/Lilian_date], + * which is the number of days since the beginning of the Gregorian + * calendar, October 15, 1582. + * + * Date.new(2001, 2, 3).ld # => 152784 + * + */ +static VALUE +d_lite_ld(VALUE self) +{ + get_d1(self); + return f_sub(m_real_local_jd(dat), INT2FIX(2299160)); +} + +/* + * call-seq: + * year -> integer + * + * Returns the year: + * + * Date.new(2001, 2, 3).year # => 2001 + * (Date.new(1, 1, 1) - 1).year # => 0 + * + */ +static VALUE +d_lite_year(VALUE self) +{ + get_d1(self); + return m_real_year(dat); +} + +/* + * call-seq: + * yday -> integer + * + * Returns the day of the year, in range (1..366): + * + * Date.new(2001, 2, 3).yday # => 34 + * + */ +static VALUE +d_lite_yday(VALUE self) +{ + get_d1(self); + return INT2FIX(m_yday(dat)); +} + +/* + * call-seq: + * mon -> integer + * + * Returns the month in range (1..12): + * + * Date.new(2001, 2, 3).mon # => 2 + * + */ +static VALUE +d_lite_mon(VALUE self) +{ + get_d1(self); + return INT2FIX(m_mon(dat)); +} + +/* + * call-seq: + * mday -> integer + * + * Returns the day of the month in range (1..31): + * + * Date.new(2001, 2, 3).mday # => 3 + * + */ +static VALUE +d_lite_mday(VALUE self) +{ + get_d1(self); + return INT2FIX(m_mday(dat)); +} + +/* + * call-seq: + * day_fraction -> rational + * + * Returns the fractional part of the day in range (Rational(0, 1)...Rational(1, 1)): + * + * DateTime.new(2001,2,3,12).day_fraction # => (1/2) + * + */ +static VALUE +d_lite_day_fraction(VALUE self) +{ + get_d1(self); + if (simple_dat_p(dat)) + return INT2FIX(0); + return m_fr(dat); +} + +/* + * call-seq: + * cwyear -> integer + * + * Returns commercial-date year for +self+ + * (see Date.commercial): + * + * Date.new(2001, 2, 3).cwyear # => 2001 + * Date.new(2000, 1, 1).cwyear # => 1999 + * + */ +static VALUE +d_lite_cwyear(VALUE self) +{ + get_d1(self); + return m_real_cwyear(dat); +} + +/* + * call-seq: + * cweek -> integer + * + * Returns commercial-date week index for +self+ + * (see Date.commercial): + * + * Date.new(2001, 2, 3).cweek # => 5 + * + */ +static VALUE +d_lite_cweek(VALUE self) +{ + get_d1(self); + return INT2FIX(m_cweek(dat)); +} + +/* + * call-seq: + * cwday -> integer + * + * Returns the commercial-date weekday index for +self+ + * (see Date.commercial); + * 1 is Monday: + * + * Date.new(2001, 2, 3).cwday # => 6 + * + */ +static VALUE +d_lite_cwday(VALUE self) +{ + get_d1(self); + return INT2FIX(m_cwday(dat)); +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +d_lite_wnum0(VALUE self) +{ + get_d1(self); + return INT2FIX(m_wnum0(dat)); +} + +/* :nodoc: */ +static VALUE +d_lite_wnum1(VALUE self) +{ + get_d1(self); + return INT2FIX(m_wnum1(dat)); +} +#endif + +/* + * call-seq: + * wday -> integer + * + * Returns the day of week in range (0..6); Sunday is 0: + * + * Date.new(2001, 2, 3).wday # => 6 + * + */ +static VALUE +d_lite_wday(VALUE self) +{ + get_d1(self); + return INT2FIX(m_wday(dat)); +} + +/* + * call-seq: + * sunday? -> true or false + * + * Returns +true+ if +self+ is a Sunday, +false+ otherwise. + */ +static VALUE +d_lite_sunday_p(VALUE self) +{ + get_d1(self); + return f_boolcast(m_wday(dat) == 0); +} + +/* + * call-seq: + * monday? -> true or false + * + * Returns +true+ if +self+ is a Monday, +false+ otherwise. + */ +static VALUE +d_lite_monday_p(VALUE self) +{ + get_d1(self); + return f_boolcast(m_wday(dat) == 1); +} + +/* + * call-seq: + * tuesday? -> true or false + * + * Returns +true+ if +self+ is a Tuesday, +false+ otherwise. + */ +static VALUE +d_lite_tuesday_p(VALUE self) +{ + get_d1(self); + return f_boolcast(m_wday(dat) == 2); +} + +/* + * call-seq: + * wednesday? -> true or false + * + * Returns +true+ if +self+ is a Wednesday, +false+ otherwise. + */ +static VALUE +d_lite_wednesday_p(VALUE self) +{ + get_d1(self); + return f_boolcast(m_wday(dat) == 3); +} + +/* + * call-seq: + * thursday? -> true or false + * + * Returns +true+ if +self+ is a Thursday, +false+ otherwise. + */ +static VALUE +d_lite_thursday_p(VALUE self) +{ + get_d1(self); + return f_boolcast(m_wday(dat) == 4); +} + +/* + * call-seq: + * friday? -> true or false + * + * Returns +true+ if +self+ is a Friday, +false+ otherwise. + */ +static VALUE +d_lite_friday_p(VALUE self) +{ + get_d1(self); + return f_boolcast(m_wday(dat) == 5); +} + +/* + * call-seq: + * saturday? -> true or false + * + * Returns +true+ if +self+ is a Saturday, +false+ otherwise. + */ +static VALUE +d_lite_saturday_p(VALUE self) +{ + get_d1(self); + return f_boolcast(m_wday(dat) == 6); +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +d_lite_nth_kday_p(VALUE self, VALUE n, VALUE k) +{ + int rjd, ns; + + get_d1(self); + + if (NUM2INT(k) != m_wday(dat)) + return Qfalse; + + c_nth_kday_to_jd(m_year(dat), m_mon(dat), + NUM2INT(n), NUM2INT(k), m_virtual_sg(dat), /* !=m_sg() */ + &rjd, &ns); + if (m_local_jd(dat) != rjd) + return Qfalse; + return Qtrue; +} +#endif + +/* + * call-seq: + * hour -> integer + * + * Returns the hour in range (0..23): + * + * DateTime.new(2001, 2, 3, 4, 5, 6).hour # => 4 + * + */ +static VALUE +d_lite_hour(VALUE self) +{ + get_d1(self); + return INT2FIX(m_hour(dat)); +} + +/* + * call-seq: + * min -> integer + * + * Returns the minute in range (0..59): + * + * DateTime.new(2001, 2, 3, 4, 5, 6).min # => 5 + * + */ +static VALUE +d_lite_min(VALUE self) +{ + get_d1(self); + return INT2FIX(m_min(dat)); +} + +/* + * call-seq: + * sec -> integer + * + * Returns the second in range (0..59): + * + * DateTime.new(2001, 2, 3, 4, 5, 6).sec # => 6 + * + */ +static VALUE +d_lite_sec(VALUE self) +{ + get_d1(self); + return INT2FIX(m_sec(dat)); +} + +/* + * call-seq: + * sec_fraction -> rational + * + * Returns the fractional part of the second in range + * (Rational(0, 1)...Rational(1, 1)): + * + * DateTime.new(2001, 2, 3, 4, 5, 6.5).sec_fraction # => (1/2) + * + */ +static VALUE +d_lite_sec_fraction(VALUE self) +{ + get_d1(self); + return m_sf_in_sec(dat); +} + +/* + * call-seq: + * d.offset -> rational + * + * Returns the offset. + * + * DateTime.parse('04pm+0730').offset #=> (5/16) + */ +static VALUE +d_lite_offset(VALUE self) +{ + get_d1(self); + return m_of_in_day(dat); +} + +/* + * call-seq: + * d.zone -> string + * + * Returns the timezone. + * + * DateTime.parse('04pm+0730').zone #=> "+07:30" + */ +static VALUE +d_lite_zone(VALUE self) +{ + get_d1(self); + return m_zone(dat); +} + +/* + * call-seq: + * d.julian? -> true or false + * + * Returns +true+ if the date is before the date of calendar reform, + * +false+ otherwise: + * + * (Date.new(1582, 10, 15) - 1).julian? # => true + * Date.new(1582, 10, 15).julian? # => false + * + */ +static VALUE +d_lite_julian_p(VALUE self) +{ + get_d1(self); + return f_boolcast(m_julian_p(dat)); +} + +/* + * call-seq: + * gregorian? -> true or false + * + * Returns +true+ if the date is on or after + * the date of calendar reform, +false+ otherwise: + * + * Date.new(1582, 10, 15).gregorian? # => true + * (Date.new(1582, 10, 15) - 1).gregorian? # => false + * + */ +static VALUE +d_lite_gregorian_p(VALUE self) +{ + get_d1(self); + return f_boolcast(m_gregorian_p(dat)); +} + +/* + * call-seq: + * leap? -> true or false + * + * Returns +true+ if the year is a leap year, +false+ otherwise: + * + * Date.new(2000).leap? # => true + * Date.new(2001).leap? # => false + * + */ +static VALUE +d_lite_leap_p(VALUE self) +{ + int rjd, ns, ry, rm, rd; + + get_d1(self); + if (m_gregorian_p(dat)) + return f_boolcast(c_gregorian_leap_p(m_year(dat))); + + c_civil_to_jd(m_year(dat), 3, 1, m_virtual_sg(dat), + &rjd, &ns); + c_jd_to_civil(rjd - 1, m_virtual_sg(dat), &ry, &rm, &rd); + return f_boolcast(rd == 29); +} + +/* + * call-seq: + * start -> float + * + * Returns the Julian start date for calendar reform; + * if not an infinity, the returned value is suitable + * for passing to Date#jd: + * + * d = Date.new(2001, 2, 3, Date::ITALY) + * s = d.start # => 2299161.0 + * Date.jd(s).to_s # => "1582-10-15" + * + * d = Date.new(2001, 2, 3, Date::ENGLAND) + * s = d.start # => 2361222.0 + * Date.jd(s).to_s # => "1752-09-14" + * + * Date.new(2001, 2, 3, Date::GREGORIAN).start # => -Infinity + * Date.new(2001, 2, 3, Date::JULIAN).start # => Infinity + * + * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * + */ +static VALUE +d_lite_start(VALUE self) +{ + get_d1(self); + return DBL2NUM(m_sg(dat)); +} + +static void +clear_civil(union DateData *x) +{ + if (simple_dat_p(x)) { + x->s.year = 0; +#ifndef USE_PACK + x->s.mon = 0; + x->s.mday = 0; +#else + x->s.pc = 0; +#endif + x->s.flags &= ~HAVE_CIVIL; + } + else { + x->c.year = 0; +#ifndef USE_PACK + x->c.mon = 0; + x->c.mday = 0; + x->c.hour = 0; + x->c.min = 0; + x->c.sec = 0; +#else + x->c.pc = 0; +#endif + x->c.flags &= ~(HAVE_CIVIL | HAVE_TIME); + } +} + +static void +set_sg(union DateData *x, double sg) +{ + if (simple_dat_p(x)) { + get_s_jd(x); + clear_civil(x); + x->s.sg = (date_sg_t)sg; + } else { + get_c_jd(x); + get_c_df(x); + clear_civil(x); + x->c.sg = (date_sg_t)sg; + } +} + +static VALUE +dup_obj_with_new_start(VALUE obj, double sg) +{ + volatile VALUE dup = dup_obj(obj); + { + get_d1(dup); + set_sg(dat, sg); + } + return dup; +} + +/* + * call-seq: + * new_start(start = Date::ITALY]) -> new_date + * + * Returns a copy of +self+ with the given +start+ value: + * + * d0 = Date.new(2000, 2, 3) + * d0.julian? # => false + * d1 = d0.new_start(Date::JULIAN) + * d1.julian? # => true + * + * See argument {start}[rdoc-ref:calendars.rdoc@Argument+start]. + * + */ +static VALUE +d_lite_new_start(int argc, VALUE *argv, VALUE self) +{ + VALUE vsg; + double sg; + + rb_scan_args(argc, argv, "01", &vsg); + + sg = DEFAULT_SG; + if (argc >= 1) + val2sg(vsg, sg); + + return dup_obj_with_new_start(self, sg); +} + +/* + * call-seq: + * italy -> new_date + * + * Equivalent to Date#new_start with argument Date::ITALY. + * + */ +static VALUE +d_lite_italy(VALUE self) +{ + return dup_obj_with_new_start(self, ITALY); +} + +/* + * call-seq: + * england -> new_date + * + * Equivalent to Date#new_start with argument Date::ENGLAND. + */ +static VALUE +d_lite_england(VALUE self) +{ + return dup_obj_with_new_start(self, ENGLAND); +} + +/* + * call-seq: + * julian -> new_date + * + * Equivalent to Date#new_start with argument Date::JULIAN. + */ +static VALUE +d_lite_julian(VALUE self) +{ + return dup_obj_with_new_start(self, JULIAN); +} + +/* + * call-seq: + * gregorian -> new_date + * + * Equivalent to Date#new_start with argument Date::GREGORIAN. + */ +static VALUE +d_lite_gregorian(VALUE self) +{ + return dup_obj_with_new_start(self, GREGORIAN); +} + +static void +set_of(union DateData *x, int of) +{ + assert(complex_dat_p(x)); + get_c_jd(x); + get_c_df(x); + clear_civil(x); + x->c.of = of; +} + +static VALUE +dup_obj_with_new_offset(VALUE obj, int of) +{ + volatile VALUE dup = dup_obj_as_complex(obj); + { + get_d1(dup); + set_of(dat, of); + } + return dup; +} + +/* + * call-seq: + * d.new_offset([offset=0]) -> date + * + * Duplicates self and resets its offset. + * + * d = DateTime.new(2001,2,3,4,5,6,'-02:00') + * #=> # + * d.new_offset('+09:00') #=> # + */ +static VALUE +d_lite_new_offset(int argc, VALUE *argv, VALUE self) +{ + VALUE vof; + int rof; + + rb_scan_args(argc, argv, "01", &vof); + + rof = 0; + if (argc >= 1) + val2off(vof, rof); + + return dup_obj_with_new_offset(self, rof); +} + +/* + * call-seq: + * d + other -> date + * + * Returns a date object pointing +other+ days after self. The other + * should be a numeric value. If the other is a fractional number, + * assumes its precision is at most nanosecond. + * + * Date.new(2001,2,3) + 1 #=> # + * DateTime.new(2001,2,3) + Rational(1,2) + * #=> # + * DateTime.new(2001,2,3) + Rational(-1,2) + * #=> # + * DateTime.jd(0,12) + DateTime.new(2001,2,3).ajd + * #=> # + */ +static VALUE +d_lite_plus(VALUE self, VALUE other) +{ + int try_rational = 1; + get_d1(self); + + again: + switch (TYPE(other)) { + case T_FIXNUM: + { + VALUE nth; + long t; + int jd; + + nth = m_nth(dat); + t = FIX2LONG(other); + if (DIV(t, CM_PERIOD)) { + nth = f_add(nth, INT2FIX(DIV(t, CM_PERIOD))); + t = MOD(t, CM_PERIOD); + } + + if (!t) + jd = m_jd(dat); + else { + jd = m_jd(dat) + (int)t; + canonicalize_jd(nth, jd); + } + + if (simple_dat_p(dat)) + return d_simple_new_internal(rb_obj_class(self), + nth, jd, + dat->s.sg, + 0, 0, 0, + (dat->s.flags | HAVE_JD) & + ~HAVE_CIVIL); + else + return d_complex_new_internal(rb_obj_class(self), + nth, jd, + dat->c.df, dat->c.sf, + dat->c.of, dat->c.sg, + 0, 0, 0, +#ifndef USE_PACK + dat->c.hour, + dat->c.min, + dat->c.sec, +#else + EX_HOUR(dat->c.pc), + EX_MIN(dat->c.pc), + EX_SEC(dat->c.pc), +#endif + (dat->c.flags | HAVE_JD) & + ~HAVE_CIVIL); + } + break; + case T_BIGNUM: + { + VALUE nth; + int jd, s; + + if (f_positive_p(other)) + s = +1; + else { + s = -1; + other = f_negate(other); + } + + nth = f_idiv(other, INT2FIX(CM_PERIOD)); + jd = FIX2INT(f_mod(other, INT2FIX(CM_PERIOD))); + + if (s < 0) { + nth = f_negate(nth); + jd = -jd; + } + + if (!jd) + jd = m_jd(dat); + else { + jd = m_jd(dat) + jd; + canonicalize_jd(nth, jd); + } + + if (f_zero_p(nth)) + nth = m_nth(dat); + else + nth = f_add(m_nth(dat), nth); + + if (simple_dat_p(dat)) + return d_simple_new_internal(rb_obj_class(self), + nth, jd, + dat->s.sg, + 0, 0, 0, + (dat->s.flags | HAVE_JD) & + ~HAVE_CIVIL); + else + return d_complex_new_internal(rb_obj_class(self), + nth, jd, + dat->c.df, dat->c.sf, + dat->c.of, dat->c.sg, + 0, 0, 0, +#ifndef USE_PACK + dat->c.hour, + dat->c.min, + dat->c.sec, +#else + EX_HOUR(dat->c.pc), + EX_MIN(dat->c.pc), + EX_SEC(dat->c.pc), +#endif + (dat->c.flags | HAVE_JD) & + ~HAVE_CIVIL); + } + break; + case T_FLOAT: + { + double jd, o, tmp; + int s, df; + VALUE nth, sf; + + o = RFLOAT_VALUE(other); + + if (o > 0) + s = +1; + else { + s = -1; + o = -o; + } + + o = modf(o, &tmp); + + if (!floor(tmp / CM_PERIOD)) { + nth = INT2FIX(0); + jd = (int)tmp; + } + else { + double i, f; + + f = modf(tmp / CM_PERIOD, &i); + nth = f_floor(DBL2NUM(i)); + jd = (int)(f * CM_PERIOD); + } + + o *= DAY_IN_SECONDS; + o = modf(o, &tmp); + df = (int)tmp; + o *= SECOND_IN_NANOSECONDS; + sf = INT2FIX((int)round(o)); + + if (s < 0) { + jd = -jd; + df = -df; + sf = f_negate(sf); + } + + if (f_zero_p(sf)) + sf = m_sf(dat); + else { + sf = f_add(m_sf(dat), sf); + if (f_lt_p(sf, INT2FIX(0))) { + df -= 1; + sf = f_add(sf, INT2FIX(SECOND_IN_NANOSECONDS)); + } + else if (f_ge_p(sf, INT2FIX(SECOND_IN_NANOSECONDS))) { + df += 1; + sf = f_sub(sf, INT2FIX(SECOND_IN_NANOSECONDS)); + } + } + + if (!df) + df = m_df(dat); + else { + df = m_df(dat) + df; + if (df < 0) { + jd -= 1; + df += DAY_IN_SECONDS; + } + else if (df >= DAY_IN_SECONDS) { + jd += 1; + df -= DAY_IN_SECONDS; + } + } + + if (!jd) + jd = m_jd(dat); + else { + jd = m_jd(dat) + jd; + canonicalize_jd(nth, jd); + } + + if (f_zero_p(nth)) + nth = m_nth(dat); + else + nth = f_add(m_nth(dat), nth); + + if (!df && f_zero_p(sf) && !m_of(dat)) + return d_simple_new_internal(rb_obj_class(self), + nth, (int)jd, + m_sg(dat), + 0, 0, 0, + (dat->s.flags | HAVE_JD) & + ~(HAVE_CIVIL | HAVE_TIME | + COMPLEX_DAT)); + else + return d_complex_new_internal(rb_obj_class(self), + nth, (int)jd, + df, sf, + m_of(dat), m_sg(dat), + 0, 0, 0, + 0, 0, 0, + (dat->c.flags | + HAVE_JD | HAVE_DF) & + ~(HAVE_CIVIL | HAVE_TIME)); + } + break; + default: + expect_numeric(other); + other = f_to_r(other); + if (!k_rational_p(other)) { + if (!try_rational) Check_Type(other, T_RATIONAL); + try_rational = 0; + goto again; + } + /* fall through */ + case T_RATIONAL: + { + VALUE nth, sf, t; + int jd, df, s; + + if (wholenum_p(other)) { + other = rb_rational_num(other); + goto again; + } + + if (f_positive_p(other)) + s = +1; + else { + s = -1; + other = f_negate(other); + } + + nth = f_idiv(other, INT2FIX(CM_PERIOD)); + t = f_mod(other, INT2FIX(CM_PERIOD)); + + jd = FIX2INT(f_idiv(t, INT2FIX(1))); + t = f_mod(t, INT2FIX(1)); + + t = f_mul(t, INT2FIX(DAY_IN_SECONDS)); + df = FIX2INT(f_idiv(t, INT2FIX(1))); + t = f_mod(t, INT2FIX(1)); + + sf = f_mul(t, INT2FIX(SECOND_IN_NANOSECONDS)); + + if (s < 0) { + nth = f_negate(nth); + jd = -jd; + df = -df; + sf = f_negate(sf); + } + + if (f_zero_p(sf)) + sf = m_sf(dat); + else { + sf = f_add(m_sf(dat), sf); + if (f_lt_p(sf, INT2FIX(0))) { + df -= 1; + sf = f_add(sf, INT2FIX(SECOND_IN_NANOSECONDS)); + } + else if (f_ge_p(sf, INT2FIX(SECOND_IN_NANOSECONDS))) { + df += 1; + sf = f_sub(sf, INT2FIX(SECOND_IN_NANOSECONDS)); + } + } + + if (!df) + df = m_df(dat); + else { + df = m_df(dat) + df; + if (df < 0) { + jd -= 1; + df += DAY_IN_SECONDS; + } + else if (df >= DAY_IN_SECONDS) { + jd += 1; + df -= DAY_IN_SECONDS; + } + } + + if (!jd) + jd = m_jd(dat); + else { + jd = m_jd(dat) + jd; + canonicalize_jd(nth, jd); + } + + if (f_zero_p(nth)) + nth = m_nth(dat); + else + nth = f_add(m_nth(dat), nth); + + if (!df && f_zero_p(sf) && !m_of(dat)) + return d_simple_new_internal(rb_obj_class(self), + nth, jd, + m_sg(dat), + 0, 0, 0, + (dat->s.flags | HAVE_JD) & + ~(HAVE_CIVIL | HAVE_TIME | + COMPLEX_DAT)); + else + return d_complex_new_internal(rb_obj_class(self), + nth, jd, + df, sf, + m_of(dat), m_sg(dat), + 0, 0, 0, + 0, 0, 0, + (dat->c.flags | + HAVE_JD | HAVE_DF) & + ~(HAVE_CIVIL | HAVE_TIME)); + } + break; + } +} + +static VALUE +minus_dd(VALUE self, VALUE other) +{ + get_d2(self, other); + + { + int d, df; + VALUE n, sf, r; + + n = f_sub(m_nth(adat), m_nth(bdat)); + d = m_jd(adat) - m_jd(bdat); + df = m_df(adat) - m_df(bdat); + sf = f_sub(m_sf(adat), m_sf(bdat)); + canonicalize_jd(n, d); + + if (df < 0) { + d -= 1; + df += DAY_IN_SECONDS; + } + else if (df >= DAY_IN_SECONDS) { + d += 1; + df -= DAY_IN_SECONDS; + } + + if (f_lt_p(sf, INT2FIX(0))) { + df -= 1; + sf = f_add(sf, INT2FIX(SECOND_IN_NANOSECONDS)); + } + else if (f_ge_p(sf, INT2FIX(SECOND_IN_NANOSECONDS))) { + df += 1; + sf = f_sub(sf, INT2FIX(SECOND_IN_NANOSECONDS)); + } + + if (f_zero_p(n)) + r = INT2FIX(0); + else + r = f_mul(n, INT2FIX(CM_PERIOD)); + + if (d) + r = f_add(r, rb_rational_new1(INT2FIX(d))); + if (df) + r = f_add(r, isec_to_day(df)); + if (f_nonzero_p(sf)) + r = f_add(r, ns_to_day(sf)); + + if (RB_TYPE_P(r, T_RATIONAL)) + return r; + return rb_rational_new1(r); + } +} + +/* + * call-seq: + * d - other -> date or rational + * + * If the other is a date object, returns a Rational + * whose value is the difference between the two dates in days. + * If the other is a numeric value, returns a date object + * pointing +other+ days before self. + * If the other is a fractional number, + * assumes its precision is at most nanosecond. + * + * Date.new(2001,2,3) - 1 #=> # + * DateTime.new(2001,2,3) - Rational(1,2) + * #=> # + * Date.new(2001,2,3) - Date.new(2001) + * #=> (33/1) + * DateTime.new(2001,2,3) - DateTime.new(2001,2,2,12) + * #=> (1/2) + */ +static VALUE +d_lite_minus(VALUE self, VALUE other) +{ + if (k_date_p(other)) + return minus_dd(self, other); + + switch (TYPE(other)) { + case T_FIXNUM: + return d_lite_plus(self, LONG2NUM(-FIX2LONG(other))); + case T_FLOAT: + return d_lite_plus(self, DBL2NUM(-RFLOAT_VALUE(other))); + default: + expect_numeric(other); + /* fall through */ + case T_BIGNUM: + case T_RATIONAL: + return d_lite_plus(self, f_negate(other)); + } +} + +/* + * call-seq: + * next_day(n = 1) -> new_date + * + * Equivalent to Date#+ with argument +n+. + */ +static VALUE +d_lite_next_day(int argc, VALUE *argv, VALUE self) +{ + VALUE n; + + rb_scan_args(argc, argv, "01", &n); + if (argc < 1) + n = INT2FIX(1); + return d_lite_plus(self, n); +} + +/* + * call-seq: + * prev_day(n = 1) -> new_date + * + * Equivalent to Date#- with argument +n+. + */ +static VALUE +d_lite_prev_day(int argc, VALUE *argv, VALUE self) +{ + VALUE n; + + rb_scan_args(argc, argv, "01", &n); + if (argc < 1) + n = INT2FIX(1); + return d_lite_minus(self, n); +} + +/* + * call-seq: + * d.next -> new_date + * + * Returns a new \Date object representing the following day: + * + * d = Date.new(2001, 2, 3) + * d.to_s # => "2001-02-03" + * d.next.to_s # => "2001-02-04" + * + */ +static VALUE +d_lite_next(VALUE self) +{ + return d_lite_next_day(0, (VALUE *)NULL, self); +} + +/* + * call-seq: + * d >> n -> new_date + * + * Returns a new \Date object representing the date + * +n+ months later; +n+ should be a numeric: + * + * (Date.new(2001, 2, 3) >> 1).to_s # => "2001-03-03" + * (Date.new(2001, 2, 3) >> -2).to_s # => "2000-12-03" + * + * When the same day does not exist for the new month, + * the last day of that month is used instead: + * + * (Date.new(2001, 1, 31) >> 1).to_s # => "2001-02-28" + * (Date.new(2001, 1, 31) >> -4).to_s # => "2000-09-30" + * + * This results in the following, possibly unexpected, behaviors: + * + * d0 = Date.new(2001, 1, 31) + * d1 = d0 >> 1 # => # + * d2 = d1 >> 1 # => # + * + * d0 = Date.new(2001, 1, 31) + * d1 = d0 >> 1 # => # + * d2 = d1 >> -1 # => # + * + */ +static VALUE +d_lite_rshift(VALUE self, VALUE other) +{ + VALUE t, y, nth, rjd2; + int m, d, rjd; + double sg; + + get_d1(self); + t = f_add3(f_mul(m_real_year(dat), INT2FIX(12)), + INT2FIX(m_mon(dat) - 1), + other); + if (FIXNUM_P(t)) { + long it = FIX2LONG(t); + y = LONG2NUM(DIV(it, 12)); + it = MOD(it, 12); + m = (int)it + 1; + } + else { + y = f_idiv(t, INT2FIX(12)); + t = f_mod(t, INT2FIX(12)); + m = FIX2INT(t) + 1; + } + d = m_mday(dat); + sg = m_sg(dat); + + while (1) { + int ry, rm, rd, ns; + + if (valid_civil_p(y, m, d, sg, + &nth, &ry, + &rm, &rd, &rjd, &ns)) + break; + if (--d < 1) + rb_raise(eDateError, "invalid date"); + } + encode_jd(nth, rjd, &rjd2); + return d_lite_plus(self, f_sub(rjd2, m_real_local_jd(dat))); +} + +/* + * call-seq: + * d << n -> date + * + * Returns a new \Date object representing the date + * +n+ months earlier; +n+ should be a numeric: + * + * (Date.new(2001, 2, 3) << 1).to_s # => "2001-01-03" + * (Date.new(2001, 2, 3) << -2).to_s # => "2001-04-03" + * + * When the same day does not exist for the new month, + * the last day of that month is used instead: + * + * (Date.new(2001, 3, 31) << 1).to_s # => "2001-02-28" + * (Date.new(2001, 3, 31) << -6).to_s # => "2001-09-30" + * + * This results in the following, possibly unexpected, behaviors: + * + * d0 = Date.new(2001, 3, 31) + * d0 << 2 # => # + * d0 << 1 << 1 # => # + * + * d0 = Date.new(2001, 3, 31) + * d1 = d0 << 1 # => # + * d2 = d1 << -1 # => # + * + */ +static VALUE +d_lite_lshift(VALUE self, VALUE other) +{ + expect_numeric(other); + return d_lite_rshift(self, f_negate(other)); +} + +/* + * call-seq: + * next_month(n = 1) -> new_date + * + * Equivalent to #>> with argument +n+. + */ +static VALUE +d_lite_next_month(int argc, VALUE *argv, VALUE self) +{ + VALUE n; + + rb_scan_args(argc, argv, "01", &n); + if (argc < 1) + n = INT2FIX(1); + return d_lite_rshift(self, n); +} + +/* + * call-seq: + * prev_month(n = 1) -> new_date + * + * Equivalent to #<< with argument +n+. + */ +static VALUE +d_lite_prev_month(int argc, VALUE *argv, VALUE self) +{ + VALUE n; + + rb_scan_args(argc, argv, "01", &n); + if (argc < 1) + n = INT2FIX(1); + return d_lite_lshift(self, n); +} + +/* + * call-seq: + * next_year(n = 1) -> new_date + * + * Equivalent to #>> with argument n * 12. + */ +static VALUE +d_lite_next_year(int argc, VALUE *argv, VALUE self) +{ + VALUE n; + + rb_scan_args(argc, argv, "01", &n); + if (argc < 1) + n = INT2FIX(1); + return d_lite_rshift(self, f_mul(n, INT2FIX(12))); +} + +/* + * call-seq: + * prev_year(n = 1) -> new_date + * + * Equivalent to #<< with argument n * 12. + */ +static VALUE +d_lite_prev_year(int argc, VALUE *argv, VALUE self) +{ + VALUE n; + + rb_scan_args(argc, argv, "01", &n); + if (argc < 1) + n = INT2FIX(1); + return d_lite_lshift(self, f_mul(n, INT2FIX(12))); +} + +static VALUE d_lite_cmp(VALUE, VALUE); + +/* + * call-seq: + * step(limit, step = 1){|date| ... } -> self + * + * Calls the block with specified dates; + * returns +self+. + * + * - The first +date+ is +self+. + * - Each successive +date+ is date + step, + * where +step+ is the numeric step size in days. + * - The last date is the last one that is before or equal to +limit+, + * which should be a \Date object. + * + * Example: + * + * limit = Date.new(2001, 12, 31) + * Date.new(2001).step(limit){|date| p date.to_s if date.mday == 31 } + * + * Output: + * + * "2001-01-31" + * "2001-03-31" + * "2001-05-31" + * "2001-07-31" + * "2001-08-31" + * "2001-10-31" + * "2001-12-31" + * + * Returns an Enumerator if no block is given. + */ +static VALUE +d_lite_step(int argc, VALUE *argv, VALUE self) +{ + VALUE limit, step, date; + int c; + + rb_scan_args(argc, argv, "11", &limit, &step); + + if (argc < 2) + step = INT2FIX(1); + +#if 0 + if (f_zero_p(step)) + rb_raise(rb_eArgError, "step can't be 0"); +#endif + + RETURN_ENUMERATOR(self, argc, argv); + + date = self; + c = f_cmp(step, INT2FIX(0)); + if (c < 0) { + while (FIX2INT(d_lite_cmp(date, limit)) >= 0) { + rb_yield(date); + date = d_lite_plus(date, step); + } + } + else if (c == 0) { + while (1) + rb_yield(date); + } + else /* if (c > 0) */ { + while (FIX2INT(d_lite_cmp(date, limit)) <= 0) { + rb_yield(date); + date = d_lite_plus(date, step); + } + } + return self; +} + +/* + * call-seq: + * upto(max){|date| ... } -> self + * + * Equivalent to #step with arguments +max+ and +1+. + */ +static VALUE +d_lite_upto(VALUE self, VALUE max) +{ + VALUE date; + + RETURN_ENUMERATOR(self, 1, &max); + + date = self; + while (FIX2INT(d_lite_cmp(date, max)) <= 0) { + rb_yield(date); + date = d_lite_plus(date, INT2FIX(1)); + } + return self; +} + +/* + * call-seq: + * downto(min){|date| ... } -> self + * + * Equivalent to #step with arguments +min+ and -1. + */ +static VALUE +d_lite_downto(VALUE self, VALUE min) +{ + VALUE date; + + RETURN_ENUMERATOR(self, 1, &min); + + date = self; + while (FIX2INT(d_lite_cmp(date, min)) >= 0) { + rb_yield(date); + date = d_lite_plus(date, INT2FIX(-1)); + } + return self; +} + +static VALUE +cmp_gen(VALUE self, VALUE other) +{ + get_d1(self); + + if (k_numeric_p(other)) + return INT2FIX(f_cmp(m_ajd(dat), other)); + else if (k_date_p(other)) + return INT2FIX(f_cmp(m_ajd(dat), f_ajd(other))); + return rb_num_coerce_cmp(self, other, id_cmp); +} + +static VALUE +cmp_dd(VALUE self, VALUE other) +{ + get_d2(self, other); + + { + VALUE a_nth, b_nth, + a_sf, b_sf; + int a_jd, b_jd, + a_df, b_df; + + m_canonicalize_jd(self, adat); + m_canonicalize_jd(other, bdat); + a_nth = m_nth(adat); + b_nth = m_nth(bdat); + if (f_eqeq_p(a_nth, b_nth)) { + a_jd = m_jd(adat); + b_jd = m_jd(bdat); + if (a_jd == b_jd) { + a_df = m_df(adat); + b_df = m_df(bdat); + if (a_df == b_df) { + a_sf = m_sf(adat); + b_sf = m_sf(bdat); + if (f_eqeq_p(a_sf, b_sf)) { + return INT2FIX(0); + } + else if (f_lt_p(a_sf, b_sf)) { + return INT2FIX(-1); + } + else { + return INT2FIX(1); + } + } + else if (a_df < b_df) { + return INT2FIX(-1); + } + else { + return INT2FIX(1); + } + } + else if (a_jd < b_jd) { + return INT2FIX(-1); + } + else { + return INT2FIX(1); + } + } + else if (f_lt_p(a_nth, b_nth)) { + return INT2FIX(-1); + } + else { + return INT2FIX(1); + } + } +} + +/* + * call-seq: + * self <=> other -> -1, 0, 1 or nil + * + * Compares +self+ and +other+, returning: + * + * - -1 if +other+ is larger. + * - 0 if the two are equal. + * - 1 if +other+ is smaller. + * - +nil+ if the two are incomparable. + * + * Argument +other+ may be: + * + * - Another \Date object: + * + * d = Date.new(2022, 7, 27) # => # + * prev_date = d.prev_day # => # + * next_date = d.next_day # => # + * d <=> next_date # => -1 + * d <=> d # => 0 + * d <=> prev_date # => 1 + * + * - A DateTime object: + * + * d <=> DateTime.new(2022, 7, 26) # => 1 + * d <=> DateTime.new(2022, 7, 27) # => 0 + * d <=> DateTime.new(2022, 7, 28) # => -1 + * + * - A numeric (compares self.ajd to +other+): + * + * d <=> 2459788 # => -1 + * d <=> 2459787 # => 1 + * d <=> 2459786 # => 1 + * d <=> d.ajd # => 0 + * + * - Any other object: + * + * d <=> Object.new # => nil + * + */ +static VALUE +d_lite_cmp(VALUE self, VALUE other) +{ + if (!k_date_p(other)) + return cmp_gen(self, other); + + { + get_d2(self, other); + + if (!(simple_dat_p(adat) && simple_dat_p(bdat) && + m_gregorian_p(adat) == m_gregorian_p(bdat))) + return cmp_dd(self, other); + + { + VALUE a_nth, b_nth; + int a_jd, b_jd; + + m_canonicalize_jd(self, adat); + m_canonicalize_jd(other, bdat); + a_nth = m_nth(adat); + b_nth = m_nth(bdat); + if (f_eqeq_p(a_nth, b_nth)) { + a_jd = m_jd(adat); + b_jd = m_jd(bdat); + if (a_jd == b_jd) { + return INT2FIX(0); + } + else if (a_jd < b_jd) { + return INT2FIX(-1); + } + else { + return INT2FIX(1); + } + } + else if (f_lt_p(a_nth, b_nth)) { + return INT2FIX(-1); + } + else { + return INT2FIX(1); + } + } + } +} + +static VALUE +equal_gen(VALUE self, VALUE other) +{ + get_d1(self); + + if (k_numeric_p(other)) + return f_eqeq_p(m_real_local_jd(dat), other); + else if (k_date_p(other)) + return f_eqeq_p(m_real_local_jd(dat), f_jd(other)); + return rb_num_coerce_cmp(self, other, id_eqeq_p); +} + +/* + * call-seq: + * self === other -> true, false, or nil. + * + * Returns +true+ if +self+ and +other+ represent the same date, + * +false+ if not, +nil+ if the two are not comparable. + * + * Argument +other+ may be: + * + * - Another \Date object: + * + * d = Date.new(2022, 7, 27) # => # + * prev_date = d.prev_day # => # + * next_date = d.next_day # => # + * d === prev_date # => false + * d === d # => true + * d === next_date # => false + * + * - A DateTime object: + * + * d === DateTime.new(2022, 7, 26) # => false + * d === DateTime.new(2022, 7, 27) # => true + * d === DateTime.new(2022, 7, 28) # => false + * + * - A numeric (compares self.jd to +other+): + * + * d === 2459788 # => true + * d === 2459787 # => false + * d === 2459786 # => false + * d === d.jd # => true + * + * - An object not comparable: + * + * d === Object.new # => nil + * + */ +static VALUE +d_lite_equal(VALUE self, VALUE other) +{ + if (!k_date_p(other)) + return equal_gen(self, other); + + { + get_d2(self, other); + + if (!(m_gregorian_p(adat) == m_gregorian_p(bdat))) + return equal_gen(self, other); + + { + VALUE a_nth, b_nth; + int a_jd, b_jd; + + m_canonicalize_jd(self, adat); + m_canonicalize_jd(other, bdat); + a_nth = m_nth(adat); + b_nth = m_nth(bdat); + a_jd = m_local_jd(adat); + b_jd = m_local_jd(bdat); + if (f_eqeq_p(a_nth, b_nth) && + a_jd == b_jd) + return Qtrue; + return Qfalse; + } + } +} + +/* :nodoc: */ +static VALUE +d_lite_eql_p(VALUE self, VALUE other) +{ + if (!k_date_p(other)) + return Qfalse; + return f_zero_p(d_lite_cmp(self, other)); +} + +/* :nodoc: */ +static VALUE +d_lite_hash(VALUE self) +{ + st_index_t v, h[4]; + + get_d1(self); + h[0] = m_nth(dat); + h[1] = m_jd(dat); + h[2] = m_df(dat); + h[3] = m_sf(dat); + v = rb_memhash(h, sizeof(h)); + return ST2FIX(v); +} + +#include "date_tmx.h" +static void set_tmx(VALUE, struct tmx *); +static VALUE strftimev(const char *, VALUE, + void (*)(VALUE, struct tmx *)); + +/* + * call-seq: + * to_s -> string + * + * Returns a string representation of the date in +self+ + * in {ISO 8601 extended date format}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-ISO+8601+Format+Specifications] + * ('%Y-%m-%d'): + * + * Date.new(2001, 2, 3).to_s # => "2001-02-03" + * + */ +static VALUE +d_lite_to_s(VALUE self) +{ + return strftimev("%Y-%m-%d", self, set_tmx); +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +mk_inspect_raw(union DateData *x, VALUE klass) +{ + char flags[6]; + + flags[0] = (x->flags & COMPLEX_DAT) ? 'C' : 'S'; + flags[1] = (x->flags & HAVE_JD) ? 'j' : '-'; + flags[2] = (x->flags & HAVE_DF) ? 'd' : '-'; + flags[3] = (x->flags & HAVE_CIVIL) ? 'c' : '-'; + flags[4] = (x->flags & HAVE_TIME) ? 't' : '-'; + flags[5] = '\0'; + + if (simple_dat_p(x)) { + return rb_enc_sprintf(rb_usascii_encoding(), + "#<%"PRIsVALUE": " + "(%+"PRIsVALUE"th,%dj),+0s,%.0fj; " + "%dy%dm%dd; %s>", + klass, + x->s.nth, x->s.jd, x->s.sg, +#ifndef USE_PACK + x->s.year, x->s.mon, x->s.mday, +#else + x->s.year, + EX_MON(x->s.pc), EX_MDAY(x->s.pc), +#endif + flags); + } + else { + return rb_enc_sprintf(rb_usascii_encoding(), + "#<%"PRIsVALUE": " + "(%+"PRIsVALUE"th,%dj,%ds,%+"PRIsVALUE"n)," + "%+ds,%.0fj; " + "%dy%dm%dd %dh%dm%ds; %s>", + klass, + x->c.nth, x->c.jd, x->c.df, x->c.sf, + x->c.of, x->c.sg, +#ifndef USE_PACK + x->c.year, x->c.mon, x->c.mday, + x->c.hour, x->c.min, x->c.sec, +#else + x->c.year, + EX_MON(x->c.pc), EX_MDAY(x->c.pc), + EX_HOUR(x->c.pc), EX_MIN(x->c.pc), + EX_SEC(x->c.pc), +#endif + flags); + } +} + +/* :nodoc: */ +static VALUE +d_lite_inspect_raw(VALUE self) +{ + get_d1(self); + return mk_inspect_raw(dat, rb_obj_class(self)); +} +#endif + +static VALUE +mk_inspect(union DateData *x, VALUE klass, VALUE to_s) +{ + return rb_enc_sprintf(rb_usascii_encoding(), + "#<%"PRIsVALUE": %"PRIsVALUE" " + "((%+"PRIsVALUE"j,%ds,%+"PRIsVALUE"n),%+ds,%.0fj)>", + klass, to_s, + m_real_jd(x), m_df(x), m_sf(x), + m_of(x), m_sg(x)); +} + +/* + * call-seq: + * inspect -> string + * + * Returns a string representation of +self+: + * + * Date.new(2001, 2, 3).inspect + * # => "#" + * + */ +static VALUE +d_lite_inspect(VALUE self) +{ + get_d1(self); + return mk_inspect(dat, rb_obj_class(self), self); +} + +#include +#include "date_tmx.h" + +size_t date_strftime(char *s, size_t maxsize, const char *format, + const struct tmx *tmx); + +#define SMALLBUF 100 +static size_t +date_strftime_alloc(char **buf, const char *format, + struct tmx *tmx) +{ + size_t size, len, flen; + + (*buf)[0] = '\0'; + flen = strlen(format); + if (flen == 0) { + return 0; + } + errno = 0; + len = date_strftime(*buf, SMALLBUF, format, tmx); + if (len != 0 || (**buf == '\0' && errno != ERANGE)) return len; + for (size=1024; ; size*=2) { + *buf = xmalloc(size); + (*buf)[0] = '\0'; + len = date_strftime(*buf, size, format, tmx); + /* + * buflen can be zero EITHER because there's not enough + * room in the string, or because the control command + * goes to the empty string. Make a reasonable guess that + * if the buffer is 1024 times bigger than the length of the + * format string, it's not failing for lack of room. + */ + if (len > 0) break; + xfree(*buf); + if (size >= 1024 * flen) { + rb_sys_fail(format); + break; + } + } + return len; +} + +static VALUE +tmx_m_secs(union DateData *x) +{ + VALUE s; + int df; + + s = day_to_sec(f_sub(m_real_jd(x), + UNIX_EPOCH_IN_CJD)); + if (simple_dat_p(x)) + return s; + df = m_df(x); + if (df) + s = f_add(s, INT2FIX(df)); + return s; +} + +#define MILLISECOND_IN_NANOSECONDS 1000000 + +static VALUE +tmx_m_msecs(union DateData *x) +{ + VALUE s, sf; + + s = sec_to_ms(tmx_m_secs(x)); + if (simple_dat_p(x)) + return s; + sf = m_sf(x); + if (f_nonzero_p(sf)) + s = f_add(s, f_div(sf, INT2FIX(MILLISECOND_IN_NANOSECONDS))); + return s; +} + +static int +tmx_m_of(union DateData *x) +{ + return m_of(x); +} + +static char * +tmx_m_zone(union DateData *x) +{ + VALUE zone = m_zone(x); + /* TODO: fix potential dangling pointer */ + return RSTRING_PTR(zone); +} + +static const struct tmx_funcs tmx_funcs = { + (VALUE (*)(void *))m_real_year, + (int (*)(void *))m_yday, + (int (*)(void *))m_mon, + (int (*)(void *))m_mday, + (VALUE (*)(void *))m_real_cwyear, + (int (*)(void *))m_cweek, + (int (*)(void *))m_cwday, + (int (*)(void *))m_wnum0, + (int (*)(void *))m_wnum1, + (int (*)(void *))m_wday, + (int (*)(void *))m_hour, + (int (*)(void *))m_min, + (int (*)(void *))m_sec, + (VALUE (*)(void *))m_sf_in_sec, + (VALUE (*)(void *))tmx_m_secs, + (VALUE (*)(void *))tmx_m_msecs, + (int (*)(void *))tmx_m_of, + (char *(*)(void *))tmx_m_zone +}; + +static void +set_tmx(VALUE self, struct tmx *tmx) +{ + get_d1(self); + tmx->dat = (void *)dat; + tmx->funcs = &tmx_funcs; +} + +static VALUE +date_strftime_internal(int argc, VALUE *argv, VALUE self, + const char *default_fmt, + void (*func)(VALUE, struct tmx *)) +{ + VALUE vfmt; + const char *fmt; + long len; + char buffer[SMALLBUF], *buf = buffer; + struct tmx tmx; + VALUE str; + + rb_scan_args(argc, argv, "01", &vfmt); + + if (argc < 1) + vfmt = rb_usascii_str_new2(default_fmt); + else { + StringValue(vfmt); + if (!rb_enc_str_asciicompat_p(vfmt)) { + rb_raise(rb_eArgError, + "format should have ASCII compatible encoding"); + } + } + fmt = RSTRING_PTR(vfmt); + len = RSTRING_LEN(vfmt); + (*func)(self, &tmx); + if (memchr(fmt, '\0', len)) { + /* Ruby string may contain \0's. */ + const char *p = fmt, *pe = fmt + len; + + str = rb_str_new(0, 0); + while (p < pe) { + len = date_strftime_alloc(&buf, p, &tmx); + rb_str_cat(str, buf, len); + p += strlen(p); + if (buf != buffer) { + xfree(buf); + buf = buffer; + } + for (fmt = p; p < pe && !*p; ++p); + if (p > fmt) rb_str_cat(str, fmt, p - fmt); + } + rb_enc_copy(str, vfmt); + return str; + } + else + len = date_strftime_alloc(&buf, fmt, &tmx); + + str = rb_str_new(buf, len); + if (buf != buffer) xfree(buf); + rb_enc_copy(str, vfmt); + return str; +} + +/* + * call-seq: + * strftime(format = '%F') -> string + * + * Returns a string representation of the date in +self+, + * formatted according the given +format+: + * + * Date.new(2001, 2, 3).strftime # => "2001-02-03" + * + * For other formats, see + * {Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html]. + * + */ +static VALUE +d_lite_strftime(int argc, VALUE *argv, VALUE self) +{ + return date_strftime_internal(argc, argv, self, + "%Y-%m-%d", set_tmx); +} + +static VALUE +strftimev(const char *fmt, VALUE self, + void (*func)(VALUE, struct tmx *)) +{ + char buffer[SMALLBUF], *buf = buffer; + struct tmx tmx; + long len; + VALUE str; + + (*func)(self, &tmx); + len = date_strftime_alloc(&buf, fmt, &tmx); + RB_GC_GUARD(self); + str = rb_usascii_str_new(buf, len); + if (buf != buffer) xfree(buf); + return str; +} + +/* + * call-seq: + * asctime -> string + * + * Equivalent to #strftime with argument '%a %b %e %T %Y' + * (or its {shorthand form}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-Shorthand+Conversion+Specifiers] + * '%c'): + * + * Date.new(2001, 2, 3).asctime # => "Sat Feb 3 00:00:00 2001" + * + * See {asctime}[https://linux.die.net/man/3/asctime]. + * + */ +static VALUE +d_lite_asctime(VALUE self) +{ + return strftimev("%a %b %e %H:%M:%S %Y", self, set_tmx); +} + +/* + * call-seq: + * iso8601 -> string + * + * Equivalent to #strftime with argument '%Y-%m-%d' + * (or its {shorthand form}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-Shorthand+Conversion+Specifiers] + * '%F'); + * + * Date.new(2001, 2, 3).iso8601 # => "2001-02-03" + * + */ +static VALUE +d_lite_iso8601(VALUE self) +{ + return strftimev("%Y-%m-%d", self, set_tmx); +} + +/* + * call-seq: + * rfc3339 -> string + * + * Equivalent to #strftime with argument '%FT%T%:z'; + * see {Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html]: + * + * Date.new(2001, 2, 3).rfc3339 # => "2001-02-03T00:00:00+00:00" + * + */ +static VALUE +d_lite_rfc3339(VALUE self) +{ + return strftimev("%Y-%m-%dT%H:%M:%S%:z", self, set_tmx); +} + +/* + * call-seq: + * rfc2822 -> string + * + * Equivalent to #strftime with argument '%a, %-d %b %Y %T %z'; + * see {Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html]: + * + * Date.new(2001, 2, 3).rfc2822 # => "Sat, 3 Feb 2001 00:00:00 +0000" + * + */ +static VALUE +d_lite_rfc2822(VALUE self) +{ + return strftimev("%a, %-d %b %Y %T %z", self, set_tmx); +} + +/* + * call-seq: + * httpdate -> string + * + * Equivalent to #strftime with argument '%a, %d %b %Y %T GMT'; + * see {Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html]: + * + * Date.new(2001, 2, 3).httpdate # => "Sat, 03 Feb 2001 00:00:00 GMT" + * + */ +static VALUE +d_lite_httpdate(VALUE self) +{ + volatile VALUE dup = dup_obj_with_new_offset(self, 0); + return strftimev("%a, %d %b %Y %T GMT", dup, set_tmx); +} + +enum { + DECIMAL_SIZE_OF_LONG = DECIMAL_SIZE_OF_BITS(CHAR_BIT*sizeof(long)), + JISX0301_DATE_SIZE = DECIMAL_SIZE_OF_LONG+8 +}; + +static const char * +jisx0301_date_format(char *fmt, size_t size, VALUE jd, VALUE y) +{ + if (FIXNUM_P(jd)) { + long d = FIX2INT(jd); + long s; + char c; + if (d < 2405160) + return "%Y-%m-%d"; + if (d < 2419614) { + c = 'M'; + s = 1867; + } + else if (d < 2424875) { + c = 'T'; + s = 1911; + } + else if (d < 2447535) { + c = 'S'; + s = 1925; + } + else if (d < 2458605) { + c = 'H'; + s = 1988; + } + else { + c = 'R'; + s = 2018; + } + snprintf(fmt, size, "%c%02ld" ".%%m.%%d", c, FIX2INT(y) - s); + return fmt; + } + return "%Y-%m-%d"; +} + +/* + * call-seq: + * jisx0301 -> string + * + * Returns a string representation of the date in +self+ + * in JIS X 0301 format. + * + * Date.new(2001, 2, 3).jisx0301 # => "H13.02.03" + * + */ +static VALUE +d_lite_jisx0301(VALUE self) +{ + char fmtbuf[JISX0301_DATE_SIZE]; + const char *fmt; + + get_d1(self); + fmt = jisx0301_date_format(fmtbuf, sizeof(fmtbuf), + m_real_local_jd(dat), + m_real_year(dat)); + return strftimev(fmt, self, set_tmx); +} + +static VALUE +deconstruct_keys(VALUE self, VALUE keys, int is_datetime) +{ + VALUE h = rb_hash_new(); + long i; + + get_d1(self); + + if (NIL_P(keys)) { + rb_hash_aset(h, sym_year, m_real_year(dat)); + rb_hash_aset(h, sym_month, INT2FIX(m_mon(dat))); + rb_hash_aset(h, sym_day, INT2FIX(m_mday(dat))); + rb_hash_aset(h, sym_yday, INT2FIX(m_yday(dat))); + rb_hash_aset(h, sym_wday, INT2FIX(m_wday(dat))); + if (is_datetime) { + rb_hash_aset(h, sym_hour, INT2FIX(m_hour(dat))); + rb_hash_aset(h, sym_min, INT2FIX(m_min(dat))); + rb_hash_aset(h, sym_sec, INT2FIX(m_sec(dat))); + rb_hash_aset(h, sym_sec_fraction, m_sf_in_sec(dat)); + rb_hash_aset(h, sym_zone, m_zone(dat)); + } + + return h; + } + if (!RB_TYPE_P(keys, T_ARRAY)) { + rb_raise(rb_eTypeError, + "wrong argument type %"PRIsVALUE" (expected Array or nil)", + rb_obj_class(keys)); + + } + + for (i=0; i hash + * + * Returns a hash of the name/value pairs, to use in pattern matching. + * Possible keys are: :year, :month, :day, + * :wday, :yday. + * + * Possible usages: + * + * d = Date.new(2022, 10, 5) + * + * if d in wday: 3, day: ..7 # uses deconstruct_keys underneath + * puts "first Wednesday of the month" + * end + * #=> prints "first Wednesday of the month" + * + * case d + * in year: ...2022 + * puts "too old" + * in month: ..9 + * puts "quarter 1-3" + * in wday: 1..5, month: + * puts "working day in month #{month}" + * end + * #=> prints "working day in month 10" + * + * Note that deconstruction by pattern can also be combined with class check: + * + * if d in Date(wday: 3, day: ..7) + * puts "first Wednesday of the month" + * end + * + */ +static VALUE +d_lite_deconstruct_keys(VALUE self, VALUE keys) +{ + return deconstruct_keys(self, keys, /* is_datetime=false */ 0); +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +d_lite_marshal_dump_old(VALUE self) +{ + VALUE a; + + get_d1(self); + + a = rb_ary_new3(3, + m_ajd(dat), + m_of_in_day(dat), + DBL2NUM(m_sg(dat))); + + if (FL_TEST(self, FL_EXIVAR)) { + rb_copy_generic_ivar(a, self); + FL_SET(a, FL_EXIVAR); + } + + return a; +} +#endif + +/* :nodoc: */ +static VALUE +d_lite_marshal_dump(VALUE self) +{ + VALUE a; + + get_d1(self); + + a = rb_ary_new3(6, + m_nth(dat), + INT2FIX(m_jd(dat)), + INT2FIX(m_df(dat)), + m_sf(dat), + INT2FIX(m_of(dat)), + DBL2NUM(m_sg(dat))); + + if (FL_TEST(self, FL_EXIVAR)) { + rb_copy_generic_ivar(a, self); + FL_SET(a, FL_EXIVAR); + } + + return a; +} + +/* :nodoc: */ +static VALUE +d_lite_marshal_load(VALUE self, VALUE a) +{ + VALUE nth, sf; + int jd, df, of; + double sg; + + get_d1(self); + + rb_check_frozen(self); + + if (!RB_TYPE_P(a, T_ARRAY)) + rb_raise(rb_eTypeError, "expected an array"); + + switch (RARRAY_LEN(a)) { + case 2: /* 1.6.x */ + case 3: /* 1.8.x, 1.9.2 */ + { + VALUE ajd, vof, vsg; + + if (RARRAY_LEN(a) == 2) { + ajd = f_sub(RARRAY_AREF(a, 0), half_days_in_day); + vof = INT2FIX(0); + vsg = RARRAY_AREF(a, 1); + if (!k_numeric_p(vsg)) + vsg = DBL2NUM(RTEST(vsg) ? GREGORIAN : JULIAN); + } + else { + ajd = RARRAY_AREF(a, 0); + vof = RARRAY_AREF(a, 1); + vsg = RARRAY_AREF(a, 2); + } + + old_to_new(ajd, vof, vsg, + &nth, &jd, &df, &sf, &of, &sg); + } + break; + case 6: + { + nth = RARRAY_AREF(a, 0); + jd = NUM2INT(RARRAY_AREF(a, 1)); + df = NUM2INT(RARRAY_AREF(a, 2)); + sf = RARRAY_AREF(a, 3); + of = NUM2INT(RARRAY_AREF(a, 4)); + sg = NUM2DBL(RARRAY_AREF(a, 5)); + } + break; + default: + rb_raise(rb_eTypeError, "invalid size"); + break; + } + + if (simple_dat_p(dat)) { + if (df || !f_zero_p(sf) || of) { + /* loading a fractional date; promote to complex */ + dat = ruby_xrealloc(dat, sizeof(struct ComplexDateData)); + RTYPEDDATA(self)->data = dat; + goto complex_data; + } + set_to_simple(self, &dat->s, nth, jd, sg, 0, 0, 0, HAVE_JD); + } else { + complex_data: + set_to_complex(self, &dat->c, nth, jd, df, sf, of, sg, + 0, 0, 0, 0, 0, 0, + HAVE_JD | HAVE_DF); + } + + if (FL_TEST(a, FL_EXIVAR)) { + rb_copy_generic_ivar(self, a); + FL_SET(self, FL_EXIVAR); + } + + return self; +} + +/* :nodoc: */ +static VALUE +date_s__load(VALUE klass, VALUE s) +{ + VALUE a, obj; + + a = rb_marshal_load(s); + obj = d_lite_s_alloc(klass); + return d_lite_marshal_load(obj, a); +} + +/* datetime */ + +/* + * call-seq: + * DateTime.jd([jd=0[, hour=0[, minute=0[, second=0[, offset=0[, start=Date::ITALY]]]]]]) -> datetime + * + * Creates a DateTime object denoting the given chronological Julian + * day number. + * + * DateTime.jd(2451944) #=> # + * DateTime.jd(2451945) #=> # + * DateTime.jd(Rational('0.5')) + * #=> # + */ +static VALUE +datetime_s_jd(int argc, VALUE *argv, VALUE klass) +{ + VALUE vjd, vh, vmin, vs, vof, vsg, jd, fr, fr2, ret; + int h, min, s, rof; + double sg; + + rb_scan_args(argc, argv, "06", &vjd, &vh, &vmin, &vs, &vof, &vsg); + + jd = INT2FIX(0); + + h = min = s = 0; + fr2 = INT2FIX(0); + rof = 0; + sg = DEFAULT_SG; + + switch (argc) { + case 6: + val2sg(vsg, sg); + case 5: + val2off(vof, rof); + case 4: + check_numeric(vs, "second"); + num2int_with_frac(s, positive_inf); + case 3: + check_numeric(vmin, "minute"); + num2int_with_frac(min, 3); + case 2: + check_numeric(vh, "hour"); + num2int_with_frac(h, 2); + case 1: + check_numeric(vjd, "jd"); + num2num_with_frac(jd, 1); + } + + { + VALUE nth; + int rh, rmin, rs, rjd, rjd2; + + if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs)) + rb_raise(eDateError, "invalid date"); + canon24oc(); + + decode_jd(jd, &nth, &rjd); + rjd2 = jd_local_to_utc(rjd, + time_to_df(rh, rmin, rs), + rof); + + ret = d_complex_new_internal(klass, + nth, rjd2, + 0, INT2FIX(0), + rof, sg, + 0, 0, 0, + rh, rmin, rs, + HAVE_JD | HAVE_TIME); + } + add_frac(); + return ret; +} + +/* + * call-seq: + * DateTime.ordinal([year=-4712[, yday=1[, hour=0[, minute=0[, second=0[, offset=0[, start=Date::ITALY]]]]]]]) -> datetime + * + * Creates a DateTime object denoting the given ordinal date. + * + * DateTime.ordinal(2001,34) #=> # + * DateTime.ordinal(2001,34,4,5,6,'+7') + * #=> # + * DateTime.ordinal(2001,-332,-20,-55,-54,'+7') + * #=> # + */ +static VALUE +datetime_s_ordinal(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vd, vh, vmin, vs, vof, vsg, y, fr, fr2, ret; + int d, h, min, s, rof; + double sg; + + rb_scan_args(argc, argv, "07", &vy, &vd, &vh, &vmin, &vs, &vof, &vsg); + + y = INT2FIX(-4712); + d = 1; + + h = min = s = 0; + fr2 = INT2FIX(0); + rof = 0; + sg = DEFAULT_SG; + + switch (argc) { + case 7: + val2sg(vsg, sg); + case 6: + val2off(vof, rof); + case 5: + check_numeric(vs, "second"); + num2int_with_frac(s, positive_inf); + case 4: + check_numeric(vmin, "minute"); + num2int_with_frac(min, 4); + case 3: + check_numeric(vh, "hour"); + num2int_with_frac(h, 3); + case 2: + check_numeric(vd, "yday"); + num2int_with_frac(d, 2); + case 1: + check_numeric(vy, "year"); + y = vy; + } + + { + VALUE nth; + int ry, rd, rh, rmin, rs, rjd, rjd2, ns; + + if (!valid_ordinal_p(y, d, sg, + &nth, &ry, + &rd, &rjd, + &ns)) + rb_raise(eDateError, "invalid date"); + if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs)) + rb_raise(eDateError, "invalid date"); + canon24oc(); + + rjd2 = jd_local_to_utc(rjd, + time_to_df(rh, rmin, rs), + rof); + + ret = d_complex_new_internal(klass, + nth, rjd2, + 0, INT2FIX(0), + rof, sg, + 0, 0, 0, + rh, rmin, rs, + HAVE_JD | HAVE_TIME); + } + add_frac(); + return ret; +} + +/* + * Same as DateTime.new. + */ +static VALUE +datetime_s_civil(int argc, VALUE *argv, VALUE klass) +{ + return datetime_initialize(argc, argv, d_lite_s_alloc_complex(klass)); +} + +static VALUE +datetime_initialize(int argc, VALUE *argv, VALUE self) +{ + VALUE vy, vm, vd, vh, vmin, vs, vof, vsg, y, fr, fr2, ret; + int m, d, h, min, s, rof; + double sg; + struct ComplexDateData *dat = rb_check_typeddata(self, &d_lite_type); + + if (!complex_dat_p(dat)) { + rb_raise(rb_eTypeError, "DateTime expected"); + } + + rb_scan_args(argc, argv, "08", &vy, &vm, &vd, &vh, &vmin, &vs, &vof, &vsg); + + y = INT2FIX(-4712); + m = 1; + d = 1; + + h = min = s = 0; + fr2 = INT2FIX(0); + rof = 0; + sg = DEFAULT_SG; + + switch (argc) { + case 8: + val2sg(vsg, sg); + case 7: + val2off(vof, rof); + case 6: + check_numeric(vs, "second"); + num2int_with_frac(s, positive_inf); + case 5: + check_numeric(vmin, "minute"); + num2int_with_frac(min, 5); + case 4: + check_numeric(vh, "hour"); + num2int_with_frac(h, 4); + case 3: + check_numeric(vd, "day"); + num2int_with_frac(d, 3); + case 2: + check_numeric(vm, "month"); + m = NUM2INT(vm); + case 1: + check_numeric(vy, "year"); + y = vy; + } + + if (guess_style(y, sg) < 0) { + VALUE nth; + int ry, rm, rd, rh, rmin, rs; + + if (!valid_gregorian_p(y, m, d, + &nth, &ry, + &rm, &rd)) + rb_raise(eDateError, "invalid date"); + if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs)) + rb_raise(eDateError, "invalid date"); + canon24oc(); + + set_to_complex(self, dat, + nth, 0, + 0, INT2FIX(0), + rof, sg, + ry, rm, rd, + rh, rmin, rs, + HAVE_CIVIL | HAVE_TIME); + } + else { + VALUE nth; + int ry, rm, rd, rh, rmin, rs, rjd, rjd2, ns; + + if (!valid_civil_p(y, m, d, sg, + &nth, &ry, + &rm, &rd, &rjd, + &ns)) + rb_raise(eDateError, "invalid date"); + if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs)) + rb_raise(eDateError, "invalid date"); + canon24oc(); + + rjd2 = jd_local_to_utc(rjd, + time_to_df(rh, rmin, rs), + rof); + + set_to_complex(self, dat, + nth, rjd2, + 0, INT2FIX(0), + rof, sg, + ry, rm, rd, + rh, rmin, rs, + HAVE_JD | HAVE_CIVIL | HAVE_TIME); + } + ret = self; + add_frac(); + return ret; +} + +/* + * call-seq: + * DateTime.commercial([cwyear=-4712[, cweek=1[, cwday=1[, hour=0[, minute=0[, second=0[, offset=0[, start=Date::ITALY]]]]]]]]) -> datetime + * + * Creates a DateTime object denoting the given week date. + * + * DateTime.commercial(2001) #=> # + * DateTime.commercial(2002) #=> # + * DateTime.commercial(2001,5,6,4,5,6,'+7') + * #=> # + */ +static VALUE +datetime_s_commercial(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vw, vd, vh, vmin, vs, vof, vsg, y, fr, fr2, ret; + int w, d, h, min, s, rof; + double sg; + + rb_scan_args(argc, argv, "08", &vy, &vw, &vd, &vh, &vmin, &vs, &vof, &vsg); + + y = INT2FIX(-4712); + w = 1; + d = 1; + + h = min = s = 0; + fr2 = INT2FIX(0); + rof = 0; + sg = DEFAULT_SG; + + switch (argc) { + case 8: + val2sg(vsg, sg); + case 7: + val2off(vof, rof); + case 6: + check_numeric(vs, "second"); + num2int_with_frac(s, positive_inf); + case 5: + check_numeric(vmin, "minute"); + num2int_with_frac(min, 5); + case 4: + check_numeric(vh, "hour"); + num2int_with_frac(h, 4); + case 3: + check_numeric(vd, "cwday"); + num2int_with_frac(d, 3); + case 2: + check_numeric(vw, "cweek"); + w = NUM2INT(vw); + case 1: + check_numeric(vy, "year"); + y = vy; + } + + { + VALUE nth; + int ry, rw, rd, rh, rmin, rs, rjd, rjd2, ns; + + if (!valid_commercial_p(y, w, d, sg, + &nth, &ry, + &rw, &rd, &rjd, + &ns)) + rb_raise(eDateError, "invalid date"); + if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs)) + rb_raise(eDateError, "invalid date"); + canon24oc(); + + rjd2 = jd_local_to_utc(rjd, + time_to_df(rh, rmin, rs), + rof); + + ret = d_complex_new_internal(klass, + nth, rjd2, + 0, INT2FIX(0), + rof, sg, + 0, 0, 0, + rh, rmin, rs, + HAVE_JD | HAVE_TIME); + } + add_frac(); + return ret; +} + +#ifndef NDEBUG +/* :nodoc: */ +static VALUE +datetime_s_weeknum(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vw, vd, vf, vh, vmin, vs, vof, vsg, y, fr, fr2, ret; + int w, d, f, h, min, s, rof; + double sg; + + rb_scan_args(argc, argv, "09", &vy, &vw, &vd, &vf, + &vh, &vmin, &vs, &vof, &vsg); + + y = INT2FIX(-4712); + w = 0; + d = 1; + f = 0; + + h = min = s = 0; + fr2 = INT2FIX(0); + rof = 0; + sg = DEFAULT_SG; + + switch (argc) { + case 9: + val2sg(vsg, sg); + case 8: + val2off(vof, rof); + case 7: + num2int_with_frac(s, positive_inf); + case 6: + num2int_with_frac(min, 6); + case 5: + num2int_with_frac(h, 5); + case 4: + f = NUM2INT(vf); + case 3: + num2int_with_frac(d, 4); + case 2: + w = NUM2INT(vw); + case 1: + y = vy; + } + + { + VALUE nth; + int ry, rw, rd, rh, rmin, rs, rjd, rjd2, ns; + + if (!valid_weeknum_p(y, w, d, f, sg, + &nth, &ry, + &rw, &rd, &rjd, + &ns)) + rb_raise(eDateError, "invalid date"); + if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs)) + rb_raise(eDateError, "invalid date"); + canon24oc(); + + rjd2 = jd_local_to_utc(rjd, + time_to_df(rh, rmin, rs), + rof); + ret = d_complex_new_internal(klass, + nth, rjd2, + 0, INT2FIX(0), + rof, sg, + 0, 0, 0, + rh, rmin, rs, + HAVE_JD | HAVE_TIME); + } + add_frac(); + return ret; +} + +/* :nodoc: */ +static VALUE +datetime_s_nth_kday(int argc, VALUE *argv, VALUE klass) +{ + VALUE vy, vm, vn, vk, vh, vmin, vs, vof, vsg, y, fr, fr2, ret; + int m, n, k, h, min, s, rof; + double sg; + + rb_scan_args(argc, argv, "09", &vy, &vm, &vn, &vk, + &vh, &vmin, &vs, &vof, &vsg); + + y = INT2FIX(-4712); + m = 1; + n = 1; + k = 1; + + h = min = s = 0; + fr2 = INT2FIX(0); + rof = 0; + sg = DEFAULT_SG; + + switch (argc) { + case 9: + val2sg(vsg, sg); + case 8: + val2off(vof, rof); + case 7: + num2int_with_frac(s, positive_inf); + case 6: + num2int_with_frac(min, 6); + case 5: + num2int_with_frac(h, 5); + case 4: + num2int_with_frac(k, 4); + case 3: + n = NUM2INT(vn); + case 2: + m = NUM2INT(vm); + case 1: + y = vy; + } + + { + VALUE nth; + int ry, rm, rn, rk, rh, rmin, rs, rjd, rjd2, ns; + + if (!valid_nth_kday_p(y, m, n, k, sg, + &nth, &ry, + &rm, &rn, &rk, &rjd, + &ns)) + rb_raise(eDateError, "invalid date"); + if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs)) + rb_raise(eDateError, "invalid date"); + canon24oc(); + + rjd2 = jd_local_to_utc(rjd, + time_to_df(rh, rmin, rs), + rof); + ret = d_complex_new_internal(klass, + nth, rjd2, + 0, INT2FIX(0), + rof, sg, + 0, 0, 0, + rh, rmin, rs, + HAVE_JD | HAVE_TIME); + } + add_frac(); + return ret; +} +#endif + +/* + * call-seq: + * DateTime.now([start=Date::ITALY]) -> datetime + * + * Creates a DateTime object denoting the present time. + * + * DateTime.now #=> # + */ +static VALUE +datetime_s_now(int argc, VALUE *argv, VALUE klass) +{ + VALUE vsg, nth, ret; + double sg; +#ifdef HAVE_CLOCK_GETTIME + struct timespec ts; +#else + struct timeval tv; +#endif + time_t sec; + struct tm tm; + long sf, of; + int y, ry, m, d, h, min, s; + + rb_scan_args(argc, argv, "01", &vsg); + + if (argc < 1) + sg = DEFAULT_SG; + else + sg = NUM2DBL(vsg); + +#ifdef HAVE_CLOCK_GETTIME + if (clock_gettime(CLOCK_REALTIME, &ts) == -1) + rb_sys_fail("clock_gettime"); + sec = ts.tv_sec; +#else + if (gettimeofday(&tv, NULL) == -1) + rb_sys_fail("gettimeofday"); + sec = tv.tv_sec; +#endif + tzset(); + if (!localtime_r(&sec, &tm)) + rb_sys_fail("localtime"); + + y = tm.tm_year + 1900; + m = tm.tm_mon + 1; + d = tm.tm_mday; + h = tm.tm_hour; + min = tm.tm_min; + s = tm.tm_sec; + if (s == 60) + s = 59; +#ifdef HAVE_STRUCT_TM_TM_GMTOFF + of = tm.tm_gmtoff; +#elif defined(HAVE_TIMEZONE) +#if defined(HAVE_ALTZONE) && !defined(_AIX) + of = (long)-((tm.tm_isdst > 0) ? altzone : timezone); +#else + of = (long)-timezone; + if (tm.tm_isdst) { + time_t sec2; + + tm.tm_isdst = 0; + sec2 = mktime(&tm); + of += (long)difftime(sec2, sec); + } +#endif +#elif defined(HAVE_TIMEGM) + { + time_t sec2; + + sec2 = timegm(&tm); + of = (long)difftime(sec2, sec); + } +#else + { + struct tm tm2; + time_t sec2; + + if (!gmtime_r(&sec, &tm2)) + rb_sys_fail("gmtime"); + tm2.tm_isdst = tm.tm_isdst; + sec2 = mktime(&tm2); + of = (long)difftime(sec, sec2); + } +#endif +#ifdef HAVE_CLOCK_GETTIME + sf = ts.tv_nsec; +#else + sf = tv.tv_usec * 1000; +#endif + + if (of < -DAY_IN_SECONDS || of > DAY_IN_SECONDS) { + of = 0; + rb_warning("invalid offset is ignored"); + } + + decode_year(INT2FIX(y), -1, &nth, &ry); + + ret = d_complex_new_internal(klass, + nth, 0, + 0, LONG2NUM(sf), + (int)of, GREGORIAN, + ry, m, d, + h, min, s, + HAVE_CIVIL | HAVE_TIME); + { + get_d1(ret); + set_sg(dat, sg); + } + return ret; +} + +static VALUE +dt_new_by_frags(VALUE klass, VALUE hash, VALUE sg) +{ + VALUE jd, sf, t; + int df, of; + + if (!c_valid_start_p(NUM2DBL(sg))) { + sg = INT2FIX(DEFAULT_SG); + rb_warning("invalid start is ignored"); + } + + if (NIL_P(hash)) + rb_raise(eDateError, "invalid date"); + + if (NIL_P(ref_hash("jd")) && + NIL_P(ref_hash("yday")) && + !NIL_P(ref_hash("year")) && + !NIL_P(ref_hash("mon")) && + !NIL_P(ref_hash("mday"))) { + jd = rt__valid_civil_p(ref_hash("year"), + ref_hash("mon"), + ref_hash("mday"), sg); + + if (NIL_P(ref_hash("hour"))) + set_hash("hour", INT2FIX(0)); + if (NIL_P(ref_hash("min"))) + set_hash("min", INT2FIX(0)); + if (NIL_P(ref_hash("sec"))) + set_hash("sec", INT2FIX(0)); + else if (f_eqeq_p(ref_hash("sec"), INT2FIX(60))) + set_hash("sec", INT2FIX(59)); + } + else { + hash = rt_rewrite_frags(hash); + hash = rt_complete_frags(klass, hash); + jd = rt__valid_date_frags_p(hash, sg); + } + + if (NIL_P(jd)) + rb_raise(eDateError, "invalid date"); + + { + int rh, rmin, rs; + + if (!c_valid_time_p(NUM2INT(ref_hash("hour")), + NUM2INT(ref_hash("min")), + NUM2INT(ref_hash("sec")), + &rh, &rmin, &rs)) + rb_raise(eDateError, "invalid date"); + + df = time_to_df(rh, rmin, rs); + } + + t = ref_hash("sec_fraction"); + if (NIL_P(t)) + sf = INT2FIX(0); + else + sf = sec_to_ns(t); + + t = ref_hash("offset"); + if (NIL_P(t)) + of = 0; + else { + of = NUM2INT(t); + if (of < -DAY_IN_SECONDS || of > DAY_IN_SECONDS) { + of = 0; + rb_warning("invalid offset is ignored"); + } + } + { + VALUE nth; + int rjd, rjd2; + + decode_jd(jd, &nth, &rjd); + rjd2 = jd_local_to_utc(rjd, df, of); + df = df_local_to_utc(df, of); + + return d_complex_new_internal(klass, + nth, rjd2, + df, sf, + of, NUM2DBL(sg), + 0, 0, 0, + 0, 0, 0, + HAVE_JD | HAVE_DF); + } +} + +/* + * call-seq: + * DateTime._strptime(string[, format='%FT%T%z']) -> hash + * + * Parses the given representation of date and time with the given + * template, and returns a hash of parsed elements. _strptime does + * not support specification of flags and width unlike strftime. + * + * See also strptime(3) and #strftime. + */ +static VALUE +datetime_s__strptime(int argc, VALUE *argv, VALUE klass) +{ + return date_s__strptime_internal(argc, argv, klass, "%FT%T%z"); +} + +/* + * call-seq: + * DateTime.strptime([string='-4712-01-01T00:00:00+00:00'[, format='%FT%T%z'[ ,start=Date::ITALY]]]) -> datetime + * + * Parses the given representation of date and time with the given + * template, and creates a DateTime object. strptime does not support + * specification of flags and width unlike strftime. + * + * DateTime.strptime('2001-02-03T04:05:06+07:00', '%Y-%m-%dT%H:%M:%S%z') + * #=> # + * DateTime.strptime('03-02-2001 04:05:06 PM', '%d-%m-%Y %I:%M:%S %p') + * #=> # + * DateTime.strptime('2001-W05-6T04:05:06+07:00', '%G-W%V-%uT%H:%M:%S%z') + * #=> # + * DateTime.strptime('2001 04 6 04 05 06 +7', '%Y %U %w %H %M %S %z') + * #=> # + * DateTime.strptime('2001 05 6 04 05 06 +7', '%Y %W %u %H %M %S %z') + * #=> # + * DateTime.strptime('-1', '%s') + * #=> # + * DateTime.strptime('-1000', '%Q') + * #=> # + * DateTime.strptime('sat3feb014pm+7', '%a%d%b%y%H%p%z') + * #=> # + * + * See also strptime(3) and #strftime. + */ +static VALUE +datetime_s_strptime(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, fmt, sg; + + rb_scan_args(argc, argv, "03", &str, &fmt, &sg); + + switch (argc) { + case 0: + str = rb_str_new2(JULIAN_EPOCH_DATETIME); + case 1: + fmt = rb_str_new2("%FT%T%z"); + case 2: + sg = INT2FIX(DEFAULT_SG); + } + + { + VALUE argv2[2], hash; + + argv2[0] = str; + argv2[1] = fmt; + hash = date_s__strptime(2, argv2, klass); + return dt_new_by_frags(klass, hash, sg); + } +} + +/* + * call-seq: + * DateTime.parse(string='-4712-01-01T00:00:00+00:00'[, comp=true[, start=Date::ITALY]], limit: 128) -> datetime + * + * Parses the given representation of date and time, and creates a + * DateTime object. + * + * This method *does* *not* function as a validator. If the input + * string does not match valid formats strictly, you may get a cryptic + * result. Should consider to use DateTime.strptime instead of this + * method as possible. + * + * If the optional second argument is true and the detected year is in + * the range "00" to "99", makes it full. + * + * DateTime.parse('2001-02-03T04:05:06+07:00') + * #=> # + * DateTime.parse('20010203T040506+0700') + * #=> # + * DateTime.parse('3rd Feb 2001 04:05:06 PM') + * #=> # + * + * Raise an ArgumentError when the string length is longer than _limit_. + * You can stop this check by passing limit: nil, but note + * that it may take a long time to parse. + */ +static VALUE +datetime_s_parse(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, comp, sg, opt; + + argc = rb_scan_args(argc, argv, "03:", &str, &comp, &sg, &opt); + + switch (argc) { + case 0: + str = rb_str_new2(JULIAN_EPOCH_DATETIME); + case 1: + comp = Qtrue; + case 2: + sg = INT2FIX(DEFAULT_SG); + } + + { + int argc2 = 2; + VALUE argv2[3], hash; + argv2[0] = str; + argv2[1] = comp; + argv2[2] = opt; + if (!NIL_P(opt)) argc2++; + hash = date_s__parse(argc2, argv2, klass); + return dt_new_by_frags(klass, hash, sg); + } +} + +/* + * call-seq: + * DateTime.iso8601(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime + * + * Creates a new DateTime object by parsing from a string according to + * some typical ISO 8601 formats. + * + * DateTime.iso8601('2001-02-03T04:05:06+07:00') + * #=> # + * DateTime.iso8601('20010203T040506+0700') + * #=> # + * DateTime.iso8601('2001-W05-6T04:05:06+07:00') + * #=> # + * + * Raise an ArgumentError when the string length is longer than _limit_. + * You can stop this check by passing limit: nil, but note + * that it may take a long time to parse. + */ +static VALUE +datetime_s_iso8601(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, sg, opt; + + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); + + switch (argc) { + case 0: + str = rb_str_new2(JULIAN_EPOCH_DATETIME); + case 1: + sg = INT2FIX(DEFAULT_SG); + } + + { + int argc2 = 1; + VALUE argv2[2], hash; + argv2[0] = str; + argv2[1] = opt; + if (!NIL_P(opt)) argc2++; + hash = date_s__iso8601(argc2, argv2, klass); + return dt_new_by_frags(klass, hash, sg); + } +} + +/* + * call-seq: + * DateTime.rfc3339(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime + * + * Creates a new DateTime object by parsing from a string according to + * some typical RFC 3339 formats. + * + * DateTime.rfc3339('2001-02-03T04:05:06+07:00') + * #=> # + * + * Raise an ArgumentError when the string length is longer than _limit_. + * You can stop this check by passing limit: nil, but note + * that it may take a long time to parse. + */ +static VALUE +datetime_s_rfc3339(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, sg, opt; + + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); + + switch (argc) { + case 0: + str = rb_str_new2(JULIAN_EPOCH_DATETIME); + case 1: + sg = INT2FIX(DEFAULT_SG); + } + + { + int argc2 = 1; + VALUE argv2[2], hash; + argv2[0] = str; + argv2[1] = opt; + if (!NIL_P(opt)) argc2++; + hash = date_s__rfc3339(argc2, argv2, klass); + return dt_new_by_frags(klass, hash, sg); + } +} + +/* + * call-seq: + * DateTime.xmlschema(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime + * + * Creates a new DateTime object by parsing from a string according to + * some typical XML Schema formats. + * + * DateTime.xmlschema('2001-02-03T04:05:06+07:00') + * #=> # + * + * Raise an ArgumentError when the string length is longer than _limit_. + * You can stop this check by passing limit: nil, but note + * that it may take a long time to parse. + */ +static VALUE +datetime_s_xmlschema(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, sg, opt; + + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); + + switch (argc) { + case 0: + str = rb_str_new2(JULIAN_EPOCH_DATETIME); + case 1: + sg = INT2FIX(DEFAULT_SG); + } + + { + int argc2 = 1; + VALUE argv2[2], hash; + argv2[0] = str; + argv2[1] = opt; + if (!NIL_P(opt)) argc2++; + hash = date_s__xmlschema(argc2, argv2, klass); + return dt_new_by_frags(klass, hash, sg); + } +} + +/* + * call-seq: + * DateTime.rfc2822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY], limit: 128) -> datetime + * DateTime.rfc822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY], limit: 128) -> datetime + * + * Creates a new DateTime object by parsing from a string according to + * some typical RFC 2822 formats. + * + * DateTime.rfc2822('Sat, 3 Feb 2001 04:05:06 +0700') + * #=> # + * + * Raise an ArgumentError when the string length is longer than _limit_. + * You can stop this check by passing limit: nil, but note + * that it may take a long time to parse. + */ +static VALUE +datetime_s_rfc2822(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, sg, opt; + + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); + + switch (argc) { + case 0: + str = rb_str_new2(JULIAN_EPOCH_DATETIME_RFC3339); + case 1: + sg = INT2FIX(DEFAULT_SG); + } + + { + int argc2 = 1; + VALUE argv2[2], hash; + argv2[0] = str; + argv2[1] = opt; + if (!NIL_P(opt)) argc2++; + hash = date_s__rfc2822(argc2, argv2, klass); + return dt_new_by_frags(klass, hash, sg); + } +} + +/* + * call-seq: + * DateTime.httpdate(string='Mon, 01 Jan -4712 00:00:00 GMT'[, start=Date::ITALY]) -> datetime + * + * Creates a new DateTime object by parsing from a string according to + * some RFC 2616 format. + * + * DateTime.httpdate('Sat, 03 Feb 2001 04:05:06 GMT') + * #=> # + * + * Raise an ArgumentError when the string length is longer than _limit_. + * You can stop this check by passing limit: nil, but note + * that it may take a long time to parse. + */ +static VALUE +datetime_s_httpdate(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, sg, opt; + + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); + + switch (argc) { + case 0: + str = rb_str_new2(JULIAN_EPOCH_DATETIME_HTTPDATE); + case 1: + sg = INT2FIX(DEFAULT_SG); + } + + { + int argc2 = 1; + VALUE argv2[2], hash; + argv2[0] = str; + argv2[1] = opt; + if (!NIL_P(opt)) argc2++; + hash = date_s__httpdate(argc2, argv2, klass); + return dt_new_by_frags(klass, hash, sg); + } +} + +/* + * call-seq: + * DateTime.jisx0301(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime + * + * Creates a new DateTime object by parsing from a string according to + * some typical JIS X 0301 formats. + * + * DateTime.jisx0301('H13.02.03T04:05:06+07:00') + * #=> # + * + * For no-era year, legacy format, Heisei is assumed. + * + * DateTime.jisx0301('13.02.03T04:05:06+07:00') + * #=> # + * + * Raise an ArgumentError when the string length is longer than _limit_. + * You can stop this check by passing limit: nil, but note + * that it may take a long time to parse. + */ +static VALUE +datetime_s_jisx0301(int argc, VALUE *argv, VALUE klass) +{ + VALUE str, sg, opt; + + argc = rb_scan_args(argc, argv, "02:", &str, &sg, &opt); + + switch (argc) { + case 0: + str = rb_str_new2(JULIAN_EPOCH_DATETIME); + case 1: + sg = INT2FIX(DEFAULT_SG); + } + + { + int argc2 = 1; + VALUE argv2[2], hash; + argv2[0] = str; + argv2[1] = opt; + if (!NIL_P(opt)) argc2++; + hash = date_s__jisx0301(argc2, argv2, klass); + return dt_new_by_frags(klass, hash, sg); + } +} + +/* + * call-seq: + * dt.to_s -> string + * + * Returns a string in an ISO 8601 format. (This method doesn't use the + * expanded representations.) + * + * DateTime.new(2001,2,3,4,5,6,'-7').to_s + * #=> "2001-02-03T04:05:06-07:00" + */ +static VALUE +dt_lite_to_s(VALUE self) +{ + return strftimev("%Y-%m-%dT%H:%M:%S%:z", self, set_tmx); +} + +/* + * call-seq: + * strftime(format = '%FT%T%:z') -> string + * + * Returns a string representation of +self+, + * formatted according the given +format: + * + * DateTime.now.strftime # => "2022-07-01T11:03:19-05:00" + * + * For other formats, + * see {Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html]: + * + */ +static VALUE +dt_lite_strftime(int argc, VALUE *argv, VALUE self) +{ + return date_strftime_internal(argc, argv, self, + "%Y-%m-%dT%H:%M:%S%:z", set_tmx); +} + +static VALUE +iso8601_timediv(VALUE self, long n) +{ + static const char timefmt[] = "T%H:%M:%S"; + static const char zone[] = "%:z"; + char fmt[sizeof(timefmt) + sizeof(zone) + rb_strlen_lit(".%N") + + DECIMAL_SIZE_OF_LONG]; + char *p = fmt; + + memcpy(p, timefmt, sizeof(timefmt)-1); + p += sizeof(timefmt)-1; + if (n > 0) p += snprintf(p, fmt+sizeof(fmt)-p, ".%%%ldN", n); + memcpy(p, zone, sizeof(zone)); + return strftimev(fmt, self, set_tmx); +} + +/* + * call-seq: + * dt.iso8601([n=0]) -> string + * dt.xmlschema([n=0]) -> string + * + * This method is equivalent to strftime('%FT%T%:z'). + * The optional argument +n+ is the number of digits for fractional seconds. + * + * DateTime.parse('2001-02-03T04:05:06.123456789+07:00').iso8601(9) + * #=> "2001-02-03T04:05:06.123456789+07:00" + */ +static VALUE +dt_lite_iso8601(int argc, VALUE *argv, VALUE self) +{ + long n = 0; + + rb_check_arity(argc, 0, 1); + if (argc >= 1) + n = NUM2LONG(argv[0]); + + return rb_str_append(strftimev("%Y-%m-%d", self, set_tmx), + iso8601_timediv(self, n)); +} + +/* + * call-seq: + * dt.rfc3339([n=0]) -> string + * + * This method is equivalent to strftime('%FT%T%:z'). + * The optional argument +n+ is the number of digits for fractional seconds. + * + * DateTime.parse('2001-02-03T04:05:06.123456789+07:00').rfc3339(9) + * #=> "2001-02-03T04:05:06.123456789+07:00" + */ +static VALUE +dt_lite_rfc3339(int argc, VALUE *argv, VALUE self) +{ + return dt_lite_iso8601(argc, argv, self); +} + +/* + * call-seq: + * dt.jisx0301([n=0]) -> string + * + * Returns a string in a JIS X 0301 format. + * The optional argument +n+ is the number of digits for fractional seconds. + * + * DateTime.parse('2001-02-03T04:05:06.123456789+07:00').jisx0301(9) + * #=> "H13.02.03T04:05:06.123456789+07:00" + */ +static VALUE +dt_lite_jisx0301(int argc, VALUE *argv, VALUE self) +{ + long n = 0; + + rb_check_arity(argc, 0, 1); + if (argc >= 1) + n = NUM2LONG(argv[0]); + + return rb_str_append(d_lite_jisx0301(self), + iso8601_timediv(self, n)); +} + +/* + * call-seq: + * deconstruct_keys(array_of_names_or_nil) -> hash + * + * Returns a hash of the name/value pairs, to use in pattern matching. + * Possible keys are: :year, :month, :day, + * :wday, :yday, :hour, :min, + * :sec, :sec_fraction, :zone. + * + * Possible usages: + * + * dt = DateTime.new(2022, 10, 5, 13, 30) + * + * if d in wday: 1..5, hour: 10..18 # uses deconstruct_keys underneath + * puts "Working time" + * end + * #=> prints "Working time" + * + * case dt + * in year: ...2022 + * puts "too old" + * in month: ..9 + * puts "quarter 1-3" + * in wday: 1..5, month: + * puts "working day in month #{month}" + * end + * #=> prints "working day in month 10" + * + * Note that deconstruction by pattern can also be combined with class check: + * + * if d in DateTime(wday: 1..5, hour: 10..18, day: ..7) + * puts "Working time, first week of the month" + * end + * + */ +static VALUE +dt_lite_deconstruct_keys(VALUE self, VALUE keys) +{ + return deconstruct_keys(self, keys, /* is_datetime=true */ 1); +} + +/* conversions */ + +#define f_subsec(x) rb_funcall(x, rb_intern("subsec"), 0) +#define f_utc_offset(x) rb_funcall(x, rb_intern("utc_offset"), 0) +#define f_local3(x,y,m,d) rb_funcall(x, rb_intern("local"), 3, y, m, d) + +/* + * call-seq: + * t.to_time -> time + * + * Returns self. + */ +static VALUE +time_to_time(VALUE self) +{ + return self; +} + +/* + * call-seq: + * t.to_date -> date + * + * Returns a Date object which denotes self. + */ +static VALUE +time_to_date(VALUE self) +{ + VALUE y, nth, ret; + int ry, m, d; + + y = f_year(self); + m = FIX2INT(f_mon(self)); + d = FIX2INT(f_mday(self)); + + decode_year(y, -1, &nth, &ry); + + ret = d_simple_new_internal(cDate, + nth, 0, + GREGORIAN, + ry, m, d, + HAVE_CIVIL); + { + get_d1(ret); + set_sg(dat, DEFAULT_SG); + } + return ret; +} + +/* + * call-seq: + * t.to_datetime -> datetime + * + * Returns a DateTime object which denotes self. + */ +static VALUE +time_to_datetime(VALUE self) +{ + VALUE y, sf, nth, ret; + int ry, m, d, h, min, s, of; + + y = f_year(self); + m = FIX2INT(f_mon(self)); + d = FIX2INT(f_mday(self)); + + h = FIX2INT(f_hour(self)); + min = FIX2INT(f_min(self)); + s = FIX2INT(f_sec(self)); + if (s == 60) + s = 59; + + sf = sec_to_ns(f_subsec(self)); + of = FIX2INT(f_utc_offset(self)); + + decode_year(y, -1, &nth, &ry); + + ret = d_complex_new_internal(cDateTime, + nth, 0, + 0, sf, + of, GREGORIAN, + ry, m, d, + h, min, s, + HAVE_CIVIL | HAVE_TIME); + { + get_d1(ret); + set_sg(dat, DEFAULT_SG); + } + return ret; +} + +/* + * call-seq: + * to_time -> time + * + * Returns a new Time object with the same value as +self+; + * if +self+ is a Julian date, derives its Gregorian date + * for conversion to the \Time object: + * + * Date.new(2001, 2, 3).to_time # => 2001-02-03 00:00:00 -0600 + * Date.new(2001, 2, 3, Date::JULIAN).to_time # => 2001-02-16 00:00:00 -0600 + * + */ +static VALUE +date_to_time(VALUE self) +{ + VALUE t; + + get_d1a(self); + + if (m_julian_p(adat)) { + VALUE g = d_lite_gregorian(self); + get_d1b(g); + adat = bdat; + self = g; + } + + t = f_local3(rb_cTime, + m_real_year(adat), + INT2FIX(m_mon(adat)), + INT2FIX(m_mday(adat))); + RB_GC_GUARD(self); /* may be the converted gregorian */ + return t; +} + +/* + * call-seq: + * to_date -> self + * + * Returns +self+. + */ +static VALUE +date_to_date(VALUE self) +{ + return self; +} + +/* + * call-seq: + * d.to_datetime -> datetime + * + * Returns a DateTime whose value is the same as +self+: + * + * Date.new(2001, 2, 3).to_datetime # => # + * + */ +static VALUE +date_to_datetime(VALUE self) +{ + get_d1a(self); + + if (simple_dat_p(adat)) { + VALUE new = d_lite_s_alloc_simple(cDateTime); + { + get_d1b(new); + bdat->s = adat->s; + return new; + } + } + else { + VALUE new = d_lite_s_alloc_complex(cDateTime); + { + get_d1b(new); + bdat->c = adat->c; + bdat->c.df = 0; + RB_OBJ_WRITE(new, &bdat->c.sf, INT2FIX(0)); +#ifndef USE_PACK + bdat->c.hour = 0; + bdat->c.min = 0; + bdat->c.sec = 0; +#else + bdat->c.pc = PACK5(EX_MON(adat->c.pc), EX_MDAY(adat->c.pc), + 0, 0, 0); + bdat->c.flags |= HAVE_DF | HAVE_TIME; +#endif + return new; + } + } +} + +/* + * call-seq: + * dt.to_time -> time + * + * Returns a Time object which denotes self. + */ +static VALUE +datetime_to_time(VALUE self) +{ + get_d1(self); + + if (m_julian_p(dat)) { + VALUE g = d_lite_gregorian(self); + get_d1a(g); + dat = adat; + self = g; + } + + { + VALUE t; + + t = rb_funcall(rb_cTime, + rb_intern("new"), + 7, + m_real_year(dat), + INT2FIX(m_mon(dat)), + INT2FIX(m_mday(dat)), + INT2FIX(m_hour(dat)), + INT2FIX(m_min(dat)), + f_add(INT2FIX(m_sec(dat)), + m_sf_in_sec(dat)), + INT2FIX(m_of(dat))); + RB_GC_GUARD(self); /* may be the converted gregorian */ + return t; + } +} + +/* + * call-seq: + * dt.to_date -> date + * + * Returns a Date object which denotes self. + */ +static VALUE +datetime_to_date(VALUE self) +{ + get_d1a(self); + + if (simple_dat_p(adat)) { + VALUE new = d_lite_s_alloc_simple(cDate); + { + get_d1b(new); + bdat->s = adat->s; + bdat->s.jd = m_local_jd(adat); + return new; + } + } + else { + VALUE new = d_lite_s_alloc_simple(cDate); + { + get_d1b(new); + copy_complex_to_simple(new, &bdat->s, &adat->c); + bdat->s.jd = m_local_jd(adat); + bdat->s.flags &= ~(HAVE_DF | HAVE_TIME | COMPLEX_DAT); + return new; + } + } +} + +/* + * call-seq: + * dt.to_datetime -> self + * + * Returns self. + */ +static VALUE +datetime_to_datetime(VALUE self) +{ + return self; +} + +#ifndef NDEBUG +/* tests */ + +#define MIN_YEAR -4713 +#define MAX_YEAR 1000000 +#define MIN_JD -327 +#define MAX_JD 366963925 + +/* :nodoc: */ +static int +test_civil(int from, int to, double sg) +{ + int j; + + fprintf(stderr, "test_civil: %d...%d (%d) - %.0f\n", + from, to, to - from, sg); + for (j = from; j <= to; j++) { + int y, m, d, rj, ns; + + c_jd_to_civil(j, sg, &y, &m, &d); + c_civil_to_jd(y, m, d, sg, &rj, &ns); + if (j != rj) { + fprintf(stderr, "%d != %d\n", j, rj); + return 0; + } + } + return 1; +} + +/* :nodoc: */ +static VALUE +date_s_test_civil(VALUE klass) +{ + if (!test_civil(MIN_JD, MIN_JD + 366, GREGORIAN)) + return Qfalse; + if (!test_civil(2305814, 2598007, GREGORIAN)) + return Qfalse; + if (!test_civil(MAX_JD - 366, MAX_JD, GREGORIAN)) + return Qfalse; + + if (!test_civil(MIN_JD, MIN_JD + 366, ITALY)) + return Qfalse; + if (!test_civil(2305814, 2598007, ITALY)) + return Qfalse; + if (!test_civil(MAX_JD - 366, MAX_JD, ITALY)) + return Qfalse; + + return Qtrue; +} + +/* :nodoc: */ +static int +test_ordinal(int from, int to, double sg) +{ + int j; + + fprintf(stderr, "test_ordinal: %d...%d (%d) - %.0f\n", + from, to, to - from, sg); + for (j = from; j <= to; j++) { + int y, d, rj, ns; + + c_jd_to_ordinal(j, sg, &y, &d); + c_ordinal_to_jd(y, d, sg, &rj, &ns); + if (j != rj) { + fprintf(stderr, "%d != %d\n", j, rj); + return 0; + } + } + return 1; +} + +/* :nodoc: */ +static VALUE +date_s_test_ordinal(VALUE klass) +{ + if (!test_ordinal(MIN_JD, MIN_JD + 366, GREGORIAN)) + return Qfalse; + if (!test_ordinal(2305814, 2598007, GREGORIAN)) + return Qfalse; + if (!test_ordinal(MAX_JD - 366, MAX_JD, GREGORIAN)) + return Qfalse; + + if (!test_ordinal(MIN_JD, MIN_JD + 366, ITALY)) + return Qfalse; + if (!test_ordinal(2305814, 2598007, ITALY)) + return Qfalse; + if (!test_ordinal(MAX_JD - 366, MAX_JD, ITALY)) + return Qfalse; + + return Qtrue; +} + +/* :nodoc: */ +static int +test_commercial(int from, int to, double sg) +{ + int j; + + fprintf(stderr, "test_commercial: %d...%d (%d) - %.0f\n", + from, to, to - from, sg); + for (j = from; j <= to; j++) { + int y, w, d, rj, ns; + + c_jd_to_commercial(j, sg, &y, &w, &d); + c_commercial_to_jd(y, w, d, sg, &rj, &ns); + if (j != rj) { + fprintf(stderr, "%d != %d\n", j, rj); + return 0; + } + } + return 1; +} + +/* :nodoc: */ +static VALUE +date_s_test_commercial(VALUE klass) +{ + if (!test_commercial(MIN_JD, MIN_JD + 366, GREGORIAN)) + return Qfalse; + if (!test_commercial(2305814, 2598007, GREGORIAN)) + return Qfalse; + if (!test_commercial(MAX_JD - 366, MAX_JD, GREGORIAN)) + return Qfalse; + + if (!test_commercial(MIN_JD, MIN_JD + 366, ITALY)) + return Qfalse; + if (!test_commercial(2305814, 2598007, ITALY)) + return Qfalse; + if (!test_commercial(MAX_JD - 366, MAX_JD, ITALY)) + return Qfalse; + + return Qtrue; +} + +/* :nodoc: */ +static int +test_weeknum(int from, int to, int f, double sg) +{ + int j; + + fprintf(stderr, "test_weeknum: %d...%d (%d) - %.0f\n", + from, to, to - from, sg); + for (j = from; j <= to; j++) { + int y, w, d, rj, ns; + + c_jd_to_weeknum(j, f, sg, &y, &w, &d); + c_weeknum_to_jd(y, w, d, f, sg, &rj, &ns); + if (j != rj) { + fprintf(stderr, "%d != %d\n", j, rj); + return 0; + } + } + return 1; +} + +/* :nodoc: */ +static VALUE +date_s_test_weeknum(VALUE klass) +{ + int f; + + for (f = 0; f <= 1; f++) { + if (!test_weeknum(MIN_JD, MIN_JD + 366, f, GREGORIAN)) + return Qfalse; + if (!test_weeknum(2305814, 2598007, f, GREGORIAN)) + return Qfalse; + if (!test_weeknum(MAX_JD - 366, MAX_JD, f, GREGORIAN)) + return Qfalse; + + if (!test_weeknum(MIN_JD, MIN_JD + 366, f, ITALY)) + return Qfalse; + if (!test_weeknum(2305814, 2598007, f, ITALY)) + return Qfalse; + if (!test_weeknum(MAX_JD - 366, MAX_JD, f, ITALY)) + return Qfalse; + } + + return Qtrue; +} + +/* :nodoc: */ +static int +test_nth_kday(int from, int to, double sg) +{ + int j; + + fprintf(stderr, "test_nth_kday: %d...%d (%d) - %.0f\n", + from, to, to - from, sg); + for (j = from; j <= to; j++) { + int y, m, n, k, rj, ns; + + c_jd_to_nth_kday(j, sg, &y, &m, &n, &k); + c_nth_kday_to_jd(y, m, n, k, sg, &rj, &ns); + if (j != rj) { + fprintf(stderr, "%d != %d\n", j, rj); + return 0; + } + } + return 1; +} + +/* :nodoc: */ +static VALUE +date_s_test_nth_kday(VALUE klass) +{ + if (!test_nth_kday(MIN_JD, MIN_JD + 366, GREGORIAN)) + return Qfalse; + if (!test_nth_kday(2305814, 2598007, GREGORIAN)) + return Qfalse; + if (!test_nth_kday(MAX_JD - 366, MAX_JD, GREGORIAN)) + return Qfalse; + + if (!test_nth_kday(MIN_JD, MIN_JD + 366, ITALY)) + return Qfalse; + if (!test_nth_kday(2305814, 2598007, ITALY)) + return Qfalse; + if (!test_nth_kday(MAX_JD - 366, MAX_JD, ITALY)) + return Qfalse; + + return Qtrue; +} + +/* :nodoc: */ +static int +test_unit_v2v(VALUE i, + VALUE (* conv1)(VALUE), + VALUE (* conv2)(VALUE)) +{ + VALUE c, o; + c = (*conv1)(i); + o = (*conv2)(c); + return f_eqeq_p(o, i); +} + +/* :nodoc: */ +static int +test_unit_v2v_iter2(VALUE (* conv1)(VALUE), + VALUE (* conv2)(VALUE)) +{ + if (!test_unit_v2v(INT2FIX(0), conv1, conv2)) + return 0; + if (!test_unit_v2v(INT2FIX(1), conv1, conv2)) + return 0; + if (!test_unit_v2v(INT2FIX(2), conv1, conv2)) + return 0; + if (!test_unit_v2v(INT2FIX(3), conv1, conv2)) + return 0; + if (!test_unit_v2v(INT2FIX(11), conv1, conv2)) + return 0; + if (!test_unit_v2v(INT2FIX(65535), conv1, conv2)) + return 0; + if (!test_unit_v2v(INT2FIX(1073741823), conv1, conv2)) + return 0; + if (!test_unit_v2v(INT2NUM(1073741824), conv1, conv2)) + return 0; + if (!test_unit_v2v(rb_rational_new2(INT2FIX(0), INT2FIX(1)), conv1, conv2)) + return 0; + if (!test_unit_v2v(rb_rational_new2(INT2FIX(1), INT2FIX(1)), conv1, conv2)) + return 0; + if (!test_unit_v2v(rb_rational_new2(INT2FIX(1), INT2FIX(2)), conv1, conv2)) + return 0; + if (!test_unit_v2v(rb_rational_new2(INT2FIX(2), INT2FIX(3)), conv1, conv2)) + return 0; + return 1; +} + +/* :nodoc: */ +static int +test_unit_v2v_iter(VALUE (* conv1)(VALUE), + VALUE (* conv2)(VALUE)) +{ + if (!test_unit_v2v_iter2(conv1, conv2)) + return 0; + if (!test_unit_v2v_iter2(conv2, conv1)) + return 0; + return 1; +} + +/* :nodoc: */ +static VALUE +date_s_test_unit_conv(VALUE klass) +{ + if (!test_unit_v2v_iter(sec_to_day, day_to_sec)) + return Qfalse; + if (!test_unit_v2v_iter(ms_to_sec, sec_to_ms)) + return Qfalse; + if (!test_unit_v2v_iter(ns_to_day, day_to_ns)) + return Qfalse; + if (!test_unit_v2v_iter(ns_to_sec, sec_to_ns)) + return Qfalse; + return Qtrue; +} + +/* :nodoc: */ +static VALUE +date_s_test_all(VALUE klass) +{ + if (date_s_test_civil(klass) == Qfalse) + return Qfalse; + if (date_s_test_ordinal(klass) == Qfalse) + return Qfalse; + if (date_s_test_commercial(klass) == Qfalse) + return Qfalse; + if (date_s_test_weeknum(klass) == Qfalse) + return Qfalse; + if (date_s_test_nth_kday(klass) == Qfalse) + return Qfalse; + if (date_s_test_unit_conv(klass) == Qfalse) + return Qfalse; + return Qtrue; +} +#endif + +static const char *monthnames[] = { + NULL, + "January", "February", "March", + "April", "May", "June", + "July", "August", "September", + "October", "November", "December" +}; + +static const char *abbr_monthnames[] = { + NULL, + "Jan", "Feb", "Mar", "Apr", + "May", "Jun", "Jul", "Aug", + "Sep", "Oct", "Nov", "Dec" +}; + +static const char *daynames[] = { + "Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday" +}; + +static const char *abbr_daynames[] = { + "Sun", "Mon", "Tue", "Wed", + "Thu", "Fri", "Sat" +}; + +static VALUE +mk_ary_of_str(long len, const char *a[]) +{ + VALUE o; + long i; + + o = rb_ary_new2(len); + for (i = 0; i < len; i++) { + VALUE e; + + if (!a[i]) + e = Qnil; + else { + e = rb_usascii_str_new2(a[i]); + rb_obj_freeze(e); + } + rb_ary_push(o, e); + } + rb_ary_freeze(o); + return o; +} + +/* :nodoc: */ +static VALUE +d_lite_zero(VALUE x) +{ + return INT2FIX(0); +} + +void +Init_date_core(void) +{ + #ifdef HAVE_RB_EXT_RACTOR_SAFE + RB_EXT_RACTOR_SAFE(true); + #endif + id_cmp = rb_intern_const("<=>"); + id_le_p = rb_intern_const("<="); + id_ge_p = rb_intern_const(">="); + id_eqeq_p = rb_intern_const("=="); + + sym_year = ID2SYM(rb_intern_const("year")); + sym_month = ID2SYM(rb_intern_const("month")); + sym_yday = ID2SYM(rb_intern_const("yday")); + sym_wday = ID2SYM(rb_intern_const("wday")); + sym_day = ID2SYM(rb_intern_const("day")); + sym_hour = ID2SYM(rb_intern_const("hour")); + sym_min = ID2SYM(rb_intern_const("min")); + sym_sec = ID2SYM(rb_intern_const("sec")); + sym_sec_fraction = ID2SYM(rb_intern_const("sec_fraction")); + sym_zone = ID2SYM(rb_intern_const("zone")); + + half_days_in_day = rb_rational_new2(INT2FIX(1), INT2FIX(2)); + +#if (LONG_MAX / DAY_IN_SECONDS) > SECOND_IN_NANOSECONDS + day_in_nanoseconds = LONG2NUM((long)DAY_IN_SECONDS * + SECOND_IN_NANOSECONDS); +#elif defined HAVE_LONG_LONG + day_in_nanoseconds = LL2NUM((LONG_LONG)DAY_IN_SECONDS * + SECOND_IN_NANOSECONDS); +#else + day_in_nanoseconds = f_mul(INT2FIX(DAY_IN_SECONDS), + INT2FIX(SECOND_IN_NANOSECONDS)); +#endif + + rb_gc_register_mark_object(half_days_in_day); + rb_gc_register_mark_object(day_in_nanoseconds); + + positive_inf = +INFINITY; + negative_inf = -INFINITY; + + /* + * \Class \Date provides methods for storing and manipulating + * calendar dates. + * + * Consider using + * {class Time}[https://docs.ruby-lang.org/en/master/Time.html] + * instead of class \Date if: + * + * - You need both dates and times; \Date handles only dates. + * - You need only Gregorian dates (and not Julian dates); + * see {Julian and Gregorian Calendars}[rdoc-ref:calendars.rdoc]. + * + * A \Date object, once created, is immutable, and cannot be modified. + * + * == Creating a \Date + * + * You can create a date for the current date, using Date.today: + * + * Date.today # => # + * + * You can create a specific date from various combinations of arguments: + * + * - Date.new takes integer year, month, and day-of-month: + * + * Date.new(1999, 12, 31) # => # + * + * - Date.ordinal takes integer year and day-of-year: + * + * Date.ordinal(1999, 365) # => # + * + * - Date.jd takes integer Julian day: + * + * Date.jd(2451544) # => # + * + * - Date.commercial takes integer commercial data (year, week, day-of-week): + * + * Date.commercial(1999, 52, 5) # => # + * + * - Date.parse takes a string, which it parses heuristically: + * + * Date.parse('1999-12-31') # => # + * Date.parse('31-12-1999') # => # + * Date.parse('1999-365') # => # + * Date.parse('1999-W52-5') # => # + * + * - Date.strptime takes a date string and a format string, + * then parses the date string according to the format string: + * + * Date.strptime('1999-12-31', '%Y-%m-%d') # => # + * Date.strptime('31-12-1999', '%d-%m-%Y') # => # + * Date.strptime('1999-365', '%Y-%j') # => # + * Date.strptime('1999-W52-5', '%G-W%V-%u') # => # + * Date.strptime('1999 52 5', '%Y %U %w') # => # + * Date.strptime('1999 52 5', '%Y %W %u') # => # + * Date.strptime('fri31dec99', '%a%d%b%y') # => # + * + * See also the specialized methods in + * {"Specialized Format Strings" in Formats for Dates and Times}[https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html#label-Specialized+Format+Strings] + * + * == Argument +limit+ + * + * Certain singleton methods in \Date that parse string arguments + * also take optional keyword argument +limit+, + * which can limit the length of the string argument. + * + * When +limit+ is: + * + * - Non-negative: + * raises ArgumentError if the string length is greater than _limit_. + * - Other numeric or +nil+: ignores +limit+. + * - Other non-numeric: raises TypeError. + * + */ + cDate = rb_define_class("Date", rb_cObject); + + /* Exception for invalid date/time */ + eDateError = rb_define_class_under(cDate, "Error", rb_eArgError); + + rb_include_module(cDate, rb_mComparable); + + /* An array of strings of full month names in English. The first + * element is nil. + */ + rb_define_const(cDate, "MONTHNAMES", mk_ary_of_str(13, monthnames)); + + /* An array of strings of abbreviated month names in English. The + * first element is nil. + */ + rb_define_const(cDate, "ABBR_MONTHNAMES", + mk_ary_of_str(13, abbr_monthnames)); + + /* An array of strings of the full names of days of the week in English. + * The first is "Sunday". + */ + rb_define_const(cDate, "DAYNAMES", mk_ary_of_str(7, daynames)); + + /* An array of strings of abbreviated day names in English. The + * first is "Sun". + */ + rb_define_const(cDate, "ABBR_DAYNAMES", mk_ary_of_str(7, abbr_daynames)); + + /* The Julian day number of the day of calendar reform for Italy + * and some catholic countries. + */ + rb_define_const(cDate, "ITALY", INT2FIX(ITALY)); + + /* The Julian day number of the day of calendar reform for England + * and her colonies. + */ + rb_define_const(cDate, "ENGLAND", INT2FIX(ENGLAND)); + + /* The Julian day number of the day of calendar reform for the + * proleptic Julian calendar. + */ + rb_define_const(cDate, "JULIAN", DBL2NUM(JULIAN)); + + /* The Julian day number of the day of calendar reform for the + * proleptic Gregorian calendar. + */ + rb_define_const(cDate, "GREGORIAN", DBL2NUM(GREGORIAN)); + + rb_define_alloc_func(cDate, d_lite_s_alloc_simple); + +#ifndef NDEBUG + rb_define_private_method(CLASS_OF(cDate), "_valid_jd?", + date_s__valid_jd_p, -1); + rb_define_private_method(CLASS_OF(cDate), "_valid_ordinal?", + date_s__valid_ordinal_p, -1); + rb_define_private_method(CLASS_OF(cDate), "_valid_civil?", + date_s__valid_civil_p, -1); + rb_define_private_method(CLASS_OF(cDate), "_valid_date?", + date_s__valid_civil_p, -1); + rb_define_private_method(CLASS_OF(cDate), "_valid_commercial?", + date_s__valid_commercial_p, -1); + rb_define_private_method(CLASS_OF(cDate), "_valid_weeknum?", + date_s__valid_weeknum_p, -1); + rb_define_private_method(CLASS_OF(cDate), "_valid_nth_kday?", + date_s__valid_nth_kday_p, -1); +#endif + + rb_define_singleton_method(cDate, "valid_jd?", date_s_valid_jd_p, -1); + rb_define_singleton_method(cDate, "valid_ordinal?", + date_s_valid_ordinal_p, -1); + rb_define_singleton_method(cDate, "valid_civil?", date_s_valid_civil_p, -1); + rb_define_singleton_method(cDate, "valid_date?", date_s_valid_civil_p, -1); + rb_define_singleton_method(cDate, "valid_commercial?", + date_s_valid_commercial_p, -1); + +#ifndef NDEBUG + rb_define_private_method(CLASS_OF(cDate), "valid_weeknum?", + date_s_valid_weeknum_p, -1); + rb_define_private_method(CLASS_OF(cDate), "valid_nth_kday?", + date_s_valid_nth_kday_p, -1); + rb_define_private_method(CLASS_OF(cDate), "zone_to_diff", + date_s_zone_to_diff, 1); +#endif + + rb_define_singleton_method(cDate, "julian_leap?", date_s_julian_leap_p, 1); + rb_define_singleton_method(cDate, "gregorian_leap?", + date_s_gregorian_leap_p, 1); + rb_define_singleton_method(cDate, "leap?", + date_s_gregorian_leap_p, 1); + +#ifndef NDEBUG + rb_define_singleton_method(cDate, "new!", date_s_new_bang, -1); + rb_define_alias(rb_singleton_class(cDate), "new_l!", "new"); +#endif + + rb_define_singleton_method(cDate, "jd", date_s_jd, -1); + rb_define_singleton_method(cDate, "ordinal", date_s_ordinal, -1); + rb_define_singleton_method(cDate, "civil", date_s_civil, -1); + rb_define_singleton_method(cDate, "commercial", date_s_commercial, -1); + +#ifndef NDEBUG + rb_define_singleton_method(cDate, "weeknum", date_s_weeknum, -1); + rb_define_singleton_method(cDate, "nth_kday", date_s_nth_kday, -1); +#endif + + rb_define_singleton_method(cDate, "today", date_s_today, -1); + rb_define_singleton_method(cDate, "_strptime", date_s__strptime, -1); + rb_define_singleton_method(cDate, "strptime", date_s_strptime, -1); + rb_define_singleton_method(cDate, "_parse", date_s__parse, -1); + rb_define_singleton_method(cDate, "parse", date_s_parse, -1); + rb_define_singleton_method(cDate, "_iso8601", date_s__iso8601, -1); + rb_define_singleton_method(cDate, "iso8601", date_s_iso8601, -1); + rb_define_singleton_method(cDate, "_rfc3339", date_s__rfc3339, -1); + rb_define_singleton_method(cDate, "rfc3339", date_s_rfc3339, -1); + rb_define_singleton_method(cDate, "_xmlschema", date_s__xmlschema, -1); + rb_define_singleton_method(cDate, "xmlschema", date_s_xmlschema, -1); + rb_define_singleton_method(cDate, "_rfc2822", date_s__rfc2822, -1); + rb_define_singleton_method(cDate, "_rfc822", date_s__rfc2822, -1); + rb_define_singleton_method(cDate, "rfc2822", date_s_rfc2822, -1); + rb_define_singleton_method(cDate, "rfc822", date_s_rfc2822, -1); + rb_define_singleton_method(cDate, "_httpdate", date_s__httpdate, -1); + rb_define_singleton_method(cDate, "httpdate", date_s_httpdate, -1); + rb_define_singleton_method(cDate, "_jisx0301", date_s__jisx0301, -1); + rb_define_singleton_method(cDate, "jisx0301", date_s_jisx0301, -1); + + rb_define_method(cDate, "initialize", date_initialize, -1); + rb_define_method(cDate, "initialize_copy", d_lite_initialize_copy, 1); + +#ifndef NDEBUG + rb_define_method(cDate, "fill", d_lite_fill, 0); +#endif + + rb_define_method(cDate, "ajd", d_lite_ajd, 0); + rb_define_method(cDate, "amjd", d_lite_amjd, 0); + rb_define_method(cDate, "jd", d_lite_jd, 0); + rb_define_method(cDate, "mjd", d_lite_mjd, 0); + rb_define_method(cDate, "ld", d_lite_ld, 0); + + rb_define_method(cDate, "year", d_lite_year, 0); + rb_define_method(cDate, "yday", d_lite_yday, 0); + rb_define_method(cDate, "mon", d_lite_mon, 0); + rb_define_method(cDate, "month", d_lite_mon, 0); + rb_define_method(cDate, "mday", d_lite_mday, 0); + rb_define_method(cDate, "day", d_lite_mday, 0); + rb_define_method(cDate, "day_fraction", d_lite_day_fraction, 0); + + rb_define_method(cDate, "cwyear", d_lite_cwyear, 0); + rb_define_method(cDate, "cweek", d_lite_cweek, 0); + rb_define_method(cDate, "cwday", d_lite_cwday, 0); + +#ifndef NDEBUG + rb_define_private_method(cDate, "wnum0", d_lite_wnum0, 0); + rb_define_private_method(cDate, "wnum1", d_lite_wnum1, 0); +#endif + + rb_define_method(cDate, "wday", d_lite_wday, 0); + + rb_define_method(cDate, "sunday?", d_lite_sunday_p, 0); + rb_define_method(cDate, "monday?", d_lite_monday_p, 0); + rb_define_method(cDate, "tuesday?", d_lite_tuesday_p, 0); + rb_define_method(cDate, "wednesday?", d_lite_wednesday_p, 0); + rb_define_method(cDate, "thursday?", d_lite_thursday_p, 0); + rb_define_method(cDate, "friday?", d_lite_friday_p, 0); + rb_define_method(cDate, "saturday?", d_lite_saturday_p, 0); + +#ifndef NDEBUG + rb_define_method(cDate, "nth_kday?", d_lite_nth_kday_p, 2); +#endif + + rb_define_private_method(cDate, "hour", d_lite_zero, 0); + rb_define_private_method(cDate, "min", d_lite_zero, 0); + rb_define_private_method(cDate, "minute", d_lite_zero, 0); + rb_define_private_method(cDate, "sec", d_lite_zero, 0); + rb_define_private_method(cDate, "second", d_lite_zero, 0); + + rb_define_method(cDate, "julian?", d_lite_julian_p, 0); + rb_define_method(cDate, "gregorian?", d_lite_gregorian_p, 0); + rb_define_method(cDate, "leap?", d_lite_leap_p, 0); + + rb_define_method(cDate, "start", d_lite_start, 0); + rb_define_method(cDate, "new_start", d_lite_new_start, -1); + rb_define_method(cDate, "italy", d_lite_italy, 0); + rb_define_method(cDate, "england", d_lite_england, 0); + rb_define_method(cDate, "julian", d_lite_julian, 0); + rb_define_method(cDate, "gregorian", d_lite_gregorian, 0); + + rb_define_method(cDate, "+", d_lite_plus, 1); + rb_define_method(cDate, "-", d_lite_minus, 1); + + rb_define_method(cDate, "next_day", d_lite_next_day, -1); + rb_define_method(cDate, "prev_day", d_lite_prev_day, -1); + rb_define_method(cDate, "next", d_lite_next, 0); + rb_define_method(cDate, "succ", d_lite_next, 0); + + rb_define_method(cDate, ">>", d_lite_rshift, 1); + rb_define_method(cDate, "<<", d_lite_lshift, 1); + + rb_define_method(cDate, "next_month", d_lite_next_month, -1); + rb_define_method(cDate, "prev_month", d_lite_prev_month, -1); + rb_define_method(cDate, "next_year", d_lite_next_year, -1); + rb_define_method(cDate, "prev_year", d_lite_prev_year, -1); + + rb_define_method(cDate, "step", d_lite_step, -1); + rb_define_method(cDate, "upto", d_lite_upto, 1); + rb_define_method(cDate, "downto", d_lite_downto, 1); + + rb_define_method(cDate, "<=>", d_lite_cmp, 1); + rb_define_method(cDate, "===", d_lite_equal, 1); + rb_define_method(cDate, "eql?", d_lite_eql_p, 1); + rb_define_method(cDate, "hash", d_lite_hash, 0); + + rb_define_method(cDate, "to_s", d_lite_to_s, 0); +#ifndef NDEBUG + rb_define_method(cDate, "inspect_raw", d_lite_inspect_raw, 0); +#endif + rb_define_method(cDate, "inspect", d_lite_inspect, 0); + + rb_define_method(cDate, "strftime", d_lite_strftime, -1); + + rb_define_method(cDate, "asctime", d_lite_asctime, 0); + rb_define_method(cDate, "ctime", d_lite_asctime, 0); + rb_define_method(cDate, "iso8601", d_lite_iso8601, 0); + rb_define_method(cDate, "xmlschema", d_lite_iso8601, 0); + rb_define_method(cDate, "rfc3339", d_lite_rfc3339, 0); + rb_define_method(cDate, "rfc2822", d_lite_rfc2822, 0); + rb_define_method(cDate, "rfc822", d_lite_rfc2822, 0); + rb_define_method(cDate, "httpdate", d_lite_httpdate, 0); + rb_define_method(cDate, "jisx0301", d_lite_jisx0301, 0); + + rb_define_method(cDate, "deconstruct_keys", d_lite_deconstruct_keys, 1); + +#ifndef NDEBUG + rb_define_method(cDate, "marshal_dump_old", d_lite_marshal_dump_old, 0); +#endif + rb_define_method(cDate, "marshal_dump", d_lite_marshal_dump, 0); + rb_define_method(cDate, "marshal_load", d_lite_marshal_load, 1); + rb_define_singleton_method(cDate, "_load", date_s__load, 1); + + /* + * == DateTime + * + * A subclass of Date that easily handles date, hour, minute, second, + * and offset. + * + * DateTime class is considered deprecated. Use Time class. + * + * DateTime does not consider any leap seconds, does not track + * any summer time rules. + * + * A DateTime object is created with DateTime::new, DateTime::jd, + * DateTime::ordinal, DateTime::commercial, DateTime::parse, + * DateTime::strptime, DateTime::now, Time#to_datetime, etc. + * + * require 'date' + * + * DateTime.new(2001,2,3,4,5,6) + * #=> # + * + * The last element of day, hour, minute, or second can be a + * fractional number. The fractional number's precision is assumed + * at most nanosecond. + * + * DateTime.new(2001,2,3.5) + * #=> # + * + * An optional argument, the offset, indicates the difference + * between the local time and UTC. For example, Rational(3,24) + * represents ahead of 3 hours of UTC, Rational(-5,24) represents + * behind of 5 hours of UTC. The offset should be -1 to +1, and + * its precision is assumed at most second. The default value is + * zero (equals to UTC). + * + * DateTime.new(2001,2,3,4,5,6,Rational(3,24)) + * #=> # + * + * The offset also accepts string form: + * + * DateTime.new(2001,2,3,4,5,6,'+03:00') + * #=> # + * + * An optional argument, the day of calendar reform (+start+), denotes + * a Julian day number, which should be 2298874 to 2426355 or + * negative/positive infinity. + * The default value is +Date::ITALY+ (2299161=1582-10-15). + * + * A DateTime object has various methods. See each reference. + * + * d = DateTime.parse('3rd Feb 2001 04:05:06+03:30') + * #=> # + * d.hour #=> 4 + * d.min #=> 5 + * d.sec #=> 6 + * d.offset #=> (7/48) + * d.zone #=> "+03:30" + * d += Rational('1.5') + * #=> # + * d = d.new_offset('+09:00') + * #=> # + * d.strftime('%I:%M:%S %p') + * #=> "09:35:06 PM" + * d > DateTime.new(1999) + * #=> true + * + * === When should you use DateTime and when should you use Time? + * + * It's a common misconception that + * {William Shakespeare}[https://en.wikipedia.org/wiki/William_Shakespeare] + * and + * {Miguel de Cervantes}[https://en.wikipedia.org/wiki/Miguel_de_Cervantes] + * died on the same day in history - + * so much so that UNESCO named April 23 as + * {World Book Day because of this fact}[https://en.wikipedia.org/wiki/World_Book_Day]. + * However, because England hadn't yet adopted the + * {Gregorian Calendar Reform}[https://en.wikipedia.org/wiki/Gregorian_calendar#Gregorian_reform] + * (and wouldn't until {1752}[https://en.wikipedia.org/wiki/Calendar_(New_Style)_Act_1750]) + * their deaths are actually 10 days apart. + * Since Ruby's Time class implements a + * {proleptic Gregorian calendar}[https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar] + * and has no concept of calendar reform there's no way + * to express this with Time objects. This is where DateTime steps in: + * + * shakespeare = DateTime.iso8601('1616-04-23', Date::ENGLAND) + * #=> Tue, 23 Apr 1616 00:00:00 +0000 + * cervantes = DateTime.iso8601('1616-04-23', Date::ITALY) + * #=> Sat, 23 Apr 1616 00:00:00 +0000 + * + * Already you can see something is weird - the days of the week + * are different. Taking this further: + * + * cervantes == shakespeare + * #=> false + * (shakespeare - cervantes).to_i + * #=> 10 + * + * This shows that in fact they died 10 days apart (in reality + * 11 days since Cervantes died a day earlier but was buried on + * the 23rd). We can see the actual date of Shakespeare's death by + * using the #gregorian method to convert it: + * + * shakespeare.gregorian + * #=> Tue, 03 May 1616 00:00:00 +0000 + * + * So there's an argument that all the celebrations that take + * place on the 23rd April in Stratford-upon-Avon are actually + * the wrong date since England is now using the Gregorian calendar. + * You can see why when we transition across the reform + * date boundary: + * + * # start off with the anniversary of Shakespeare's birth in 1751 + * shakespeare = DateTime.iso8601('1751-04-23', Date::ENGLAND) + * #=> Tue, 23 Apr 1751 00:00:00 +0000 + * + * # add 366 days since 1752 is a leap year and April 23 is after February 29 + * shakespeare + 366 + * #=> Thu, 23 Apr 1752 00:00:00 +0000 + * + * # add another 365 days to take us to the anniversary in 1753 + * shakespeare + 366 + 365 + * #=> Fri, 04 May 1753 00:00:00 +0000 + * + * As you can see, if we're accurately tracking the number of + * {solar years}[https://en.wikipedia.org/wiki/Tropical_year] + * since Shakespeare's birthday then the correct anniversary date + * would be the 4th May and not the 23rd April. + * + * So when should you use DateTime in Ruby and when should + * you use Time? Almost certainly you'll want to use Time + * since your app is probably dealing with current dates and + * times. However, if you need to deal with dates and times in a + * historical context you'll want to use DateTime to avoid + * making the same mistakes as UNESCO. If you also have to deal + * with timezones then best of luck - just bear in mind that + * you'll probably be dealing with + * {local solar times}[https://en.wikipedia.org/wiki/Solar_time], + * since it wasn't until the 19th century that the introduction + * of the railways necessitated the need for + * {Standard Time}[https://en.wikipedia.org/wiki/Standard_time#Great_Britain] + * and eventually timezones. + */ + + cDateTime = rb_define_class("DateTime", cDate); + rb_define_alloc_func(cDateTime, d_lite_s_alloc_complex); + + rb_define_singleton_method(cDateTime, "jd", datetime_s_jd, -1); + rb_define_singleton_method(cDateTime, "ordinal", datetime_s_ordinal, -1); + rb_define_singleton_method(cDateTime, "civil", datetime_s_civil, -1); + rb_define_singleton_method(cDateTime, "new", datetime_s_civil, -1); + rb_define_singleton_method(cDateTime, "commercial", + datetime_s_commercial, -1); + +#ifndef NDEBUG + rb_define_singleton_method(cDateTime, "weeknum", + datetime_s_weeknum, -1); + rb_define_singleton_method(cDateTime, "nth_kday", + datetime_s_nth_kday, -1); +#endif + + rb_undef_method(CLASS_OF(cDateTime), "today"); + + rb_define_singleton_method(cDateTime, "now", datetime_s_now, -1); + rb_define_singleton_method(cDateTime, "_strptime", + datetime_s__strptime, -1); + rb_define_singleton_method(cDateTime, "strptime", + datetime_s_strptime, -1); + rb_define_singleton_method(cDateTime, "parse", + datetime_s_parse, -1); + rb_define_singleton_method(cDateTime, "iso8601", + datetime_s_iso8601, -1); + rb_define_singleton_method(cDateTime, "rfc3339", + datetime_s_rfc3339, -1); + rb_define_singleton_method(cDateTime, "xmlschema", + datetime_s_xmlschema, -1); + rb_define_singleton_method(cDateTime, "rfc2822", + datetime_s_rfc2822, -1); + rb_define_singleton_method(cDateTime, "rfc822", + datetime_s_rfc2822, -1); + rb_define_singleton_method(cDateTime, "httpdate", + datetime_s_httpdate, -1); + rb_define_singleton_method(cDateTime, "jisx0301", + datetime_s_jisx0301, -1); + + rb_define_method(cDateTime, "hour", d_lite_hour, 0); + rb_define_method(cDateTime, "min", d_lite_min, 0); + rb_define_method(cDateTime, "minute", d_lite_min, 0); + rb_define_method(cDateTime, "sec", d_lite_sec, 0); + rb_define_method(cDateTime, "second", d_lite_sec, 0); + rb_define_method(cDateTime, "sec_fraction", d_lite_sec_fraction, 0); + rb_define_method(cDateTime, "second_fraction", d_lite_sec_fraction, 0); + rb_define_method(cDateTime, "offset", d_lite_offset, 0); + rb_define_method(cDateTime, "zone", d_lite_zone, 0); + rb_define_method(cDateTime, "new_offset", d_lite_new_offset, -1); + + rb_define_method(cDateTime, "to_s", dt_lite_to_s, 0); + + rb_define_method(cDateTime, "strftime", dt_lite_strftime, -1); + + rb_define_method(cDateTime, "iso8601", dt_lite_iso8601, -1); + rb_define_method(cDateTime, "xmlschema", dt_lite_iso8601, -1); + rb_define_method(cDateTime, "rfc3339", dt_lite_rfc3339, -1); + rb_define_method(cDateTime, "jisx0301", dt_lite_jisx0301, -1); + + rb_define_method(cDateTime, "deconstruct_keys", dt_lite_deconstruct_keys, 1); + + /* conversions */ + + rb_define_method(rb_cTime, "to_time", time_to_time, 0); + rb_define_method(rb_cTime, "to_date", time_to_date, 0); + rb_define_method(rb_cTime, "to_datetime", time_to_datetime, 0); + + rb_define_method(cDate, "to_time", date_to_time, 0); + rb_define_method(cDate, "to_date", date_to_date, 0); + rb_define_method(cDate, "to_datetime", date_to_datetime, 0); + + rb_define_method(cDateTime, "to_time", datetime_to_time, 0); + rb_define_method(cDateTime, "to_date", datetime_to_date, 0); + rb_define_method(cDateTime, "to_datetime", datetime_to_datetime, 0); + +#ifndef NDEBUG + /* tests */ + + rb_define_singleton_method(cDate, "test_civil", date_s_test_civil, 0); + rb_define_singleton_method(cDate, "test_ordinal", date_s_test_ordinal, 0); + rb_define_singleton_method(cDate, "test_commercial", + date_s_test_commercial, 0); + rb_define_singleton_method(cDate, "test_weeknum", date_s_test_weeknum, 0); + rb_define_singleton_method(cDate, "test_nth_kday", date_s_test_nth_kday, 0); + rb_define_singleton_method(cDate, "test_unit_conv", + date_s_test_unit_conv, 0); + rb_define_singleton_method(cDate, "test_all", date_s_test_all, 0); +#endif +} + +/* +Local variables: +c-file-style: "ruby" +End: +*/ diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_parse.c b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_parse.c new file mode 100644 index 0000000..a1600e4 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_parse.c @@ -0,0 +1,3086 @@ +/* + date_parse.c: Coded by Tadayoshi Funaba 2011,2012 +*/ + +#include "ruby.h" +#include "ruby/encoding.h" +#include "ruby/re.h" +#include + +#undef strncasecmp +#define strncasecmp STRNCASECMP + +RUBY_EXTERN VALUE rb_int_positive_pow(long x, unsigned long y); +RUBY_EXTERN unsigned long ruby_scan_digits(const char *str, ssize_t len, int base, size_t *retlen, int *overflow); + +/* #define TIGHT_PARSER */ + +#define sizeof_array(o) (sizeof o / sizeof o[0]) + +#define f_negate(x) rb_funcall(x, rb_intern("-@"), 0) +#define f_add(x,y) rb_funcall(x, '+', 1, y) +#define f_sub(x,y) rb_funcall(x, '-', 1, y) +#define f_mul(x,y) rb_funcall(x, '*', 1, y) +#define f_div(x,y) rb_funcall(x, '/', 1, y) +#define f_idiv(x,y) rb_funcall(x, rb_intern("div"), 1, y) +#define f_mod(x,y) rb_funcall(x, '%', 1, y) +#define f_expt(x,y) rb_funcall(x, rb_intern("**"), 1, y) + +#define f_lt_p(x,y) rb_funcall(x, '<', 1, y) +#define f_gt_p(x,y) rb_funcall(x, '>', 1, y) +#define f_le_p(x,y) rb_funcall(x, rb_intern("<="), 1, y) +#define f_ge_p(x,y) rb_funcall(x, rb_intern(">="), 1, y) + +#define f_to_s(x) rb_funcall(x, rb_intern("to_s"), 0) + +#define f_match(r,s) rb_funcall(r, rb_intern("match"), 1, s) +#define f_aref(o,i) rb_funcall(o, rb_intern("[]"), 1, i) +#define f_aref2(o,i,j) rb_funcall(o, rb_intern("[]"), 2, i, j) +#define f_begin(o,i) rb_funcall(o, rb_intern("begin"), 1, i) +#define f_end(o,i) rb_funcall(o, rb_intern("end"), 1, i) +#define f_aset(o,i,v) rb_funcall(o, rb_intern("[]="), 2, i, v) +#define f_aset2(o,i,j,v) rb_funcall(o, rb_intern("[]="), 3, i, j, v) +#define f_sub_bang(s,r,x) rb_funcall(s, rb_intern("sub!"), 2, r, x) +#define f_gsub_bang(s,r,x) rb_funcall(s, rb_intern("gsub!"), 2, r, x) + +#define set_hash(k,v) rb_hash_aset(hash, ID2SYM(rb_intern(k"")), v) +#define ref_hash(k) rb_hash_aref(hash, ID2SYM(rb_intern(k""))) +#define del_hash(k) rb_hash_delete(hash, ID2SYM(rb_intern(k""))) + +#define cstr2num(s) rb_cstr_to_inum(s, 10, 0) +#define str2num(s) rb_str_to_inum(s, 10, 0) + +static const char abbr_days[][4] = { + "sun", "mon", "tue", "wed", + "thu", "fri", "sat" +}; + +static const char abbr_months[][4] = { + "jan", "feb", "mar", "apr", "may", "jun", + "jul", "aug", "sep", "oct", "nov", "dec" +}; + +#define issign(c) ((c) == '-' || (c) == '+') +#define asp_string() rb_str_new(" ", 1) +#ifdef TIGHT_PARSER +#define asuba_string() rb_str_new("\001", 1) +#define asubb_string() rb_str_new("\002", 1) +#define asubw_string() rb_str_new("\027", 1) +#define asubt_string() rb_str_new("\024", 1) +#endif + +static size_t +digit_span(const char *s, const char *e) +{ + size_t i = 0; + while (s + i < e && isdigit((unsigned char)s[i])) i++; + return i; +} + +static void +s3e(VALUE hash, VALUE y, VALUE m, VALUE d, int bc) +{ + VALUE vbuf = 0; + VALUE c = Qnil; + + if (!RB_TYPE_P(m, T_STRING)) + m = f_to_s(m); + + if (!NIL_P(y) && !NIL_P(m) && NIL_P(d)) { + VALUE oy = y; + VALUE om = m; + VALUE od = d; + + y = od; + m = oy; + d = om; + } + + if (NIL_P(y)) { + if (!NIL_P(d) && RSTRING_LEN(d) > 2) { + y = d; + d = Qnil; + } + if (!NIL_P(d) && RSTRING_LEN(d) > 0 && *RSTRING_PTR(d) == '\'') { + y = d; + d = Qnil; + } + } + + if (!NIL_P(y)) { + const char *s, *bp, *ep; + size_t l; + + s = RSTRING_PTR(y); + ep = RSTRING_END(y); + while (s < ep && !issign(*s) && !isdigit((unsigned char)*s)) + s++; + if (s >= ep) goto no_date; + bp = s; + if (issign((unsigned char)*s)) + s++; + l = digit_span(s, ep); + ep = s + l; + if (*ep) { + y = d; + d = rb_str_new(bp, ep - bp); + } + no_date:; + } + + if (!NIL_P(m)) { + const char *s; + + s = RSTRING_PTR(m); + if (*s == '\'' || RSTRING_LEN(m) > 2) { + /* us -> be */ + VALUE oy = y; + VALUE om = m; + VALUE od = d; + + y = om; + m = od; + d = oy; + } + } + + if (!NIL_P(d)) { + const char *s; + + s = RSTRING_PTR(d); + if (*s == '\'' || RSTRING_LEN(d) > 2) { + VALUE oy = y; + VALUE od = d; + + y = od; + d = oy; + } + } + + if (!NIL_P(y)) { + const char *s, *bp, *ep; + int sign = 0; + size_t l; + VALUE iy; + + s = RSTRING_PTR(y); + ep = RSTRING_END(y); + while (s < ep && !issign(*s) && !isdigit((unsigned char)*s)) + s++; + if (s >= ep) goto no_year; + bp = s; + if (issign(*s)) { + s++; + sign = 1; + } + if (sign) + c = Qfalse; + l = digit_span(s, ep); + ep = s + l; + if (l > 2) + c = Qfalse; + { + char *buf; + + buf = ALLOCV_N(char, vbuf, ep - bp + 1); + memcpy(buf, bp, ep - bp); + buf[ep - bp] = '\0'; + iy = cstr2num(buf); + ALLOCV_END(vbuf); + } + set_hash("year", iy); + no_year:; + } + + if (bc) + set_hash("_bc", Qtrue); + + if (!NIL_P(m)) { + const char *s, *bp, *ep; + size_t l; + VALUE im; + + s = RSTRING_PTR(m); + ep = RSTRING_END(m); + while (s < ep && !isdigit((unsigned char)*s)) + s++; + if (s >= ep) goto no_month; + bp = s; + l = digit_span(s, ep); + ep = s + l; + { + char *buf; + + buf = ALLOCV_N(char, vbuf, ep - bp + 1); + memcpy(buf, bp, ep - bp); + buf[ep - bp] = '\0'; + im = cstr2num(buf); + ALLOCV_END(vbuf); + } + set_hash("mon", im); + no_month:; + } + + if (!NIL_P(d)) { + const char *s, *bp, *ep; + size_t l; + VALUE id; + + s = RSTRING_PTR(d); + ep = RSTRING_END(d); + while (s < ep && !isdigit((unsigned char)*s)) + s++; + if (s >= ep) goto no_mday; + bp = s; + l = digit_span(s, ep); + ep = s + l; + { + char *buf; + + buf = ALLOCV_N(char, vbuf, ep - bp + 1); + memcpy(buf, bp, ep - bp); + buf[ep - bp] = '\0'; + id = cstr2num(buf); + ALLOCV_END(vbuf); + } + set_hash("mday", id); + no_mday:; + } + + if (!NIL_P(c)) + set_hash("_comp", c); +} + +#define DAYS "sunday|monday|tuesday|wednesday|thursday|friday|saturday" +#define MONTHS "january|february|march|april|may|june|july|august|september|october|november|december" +#define ABBR_DAYS "sun|mon|tue|wed|thu|fri|sat" +#define ABBR_MONTHS "jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec" + +#define NUMBER "(? n && isspace((unsigned char)s[l - n - 1])); + return n; +} + +static long +shrunk_size(const char *s, long l) +{ + long i, ni; + int sp = 0; + for (i = ni = 0; i < l; ++i) { + if (!isspace((unsigned char)s[i])) { + if (sp) ni++; + sp = 0; + ni++; + } + else { + sp = 1; + } + } + return ni < l ? ni : 0; +} + +static long +shrink_space(char *d, const char *s, long l) +{ + long i, ni; + int sp = 0; + for (i = ni = 0; i < l; ++i) { + if (!isspace((unsigned char)s[i])) { + if (sp) d[ni++] = ' '; + sp = 0; + d[ni++] = s[i]; + } + else { + sp = 1; + } + } + return ni; +} + +VALUE +date_zone_to_diff(VALUE str) +{ + VALUE offset = Qnil; + long l = RSTRING_LEN(str); + const char *s = RSTRING_PTR(str); + + { + int dst = 0; + int w; + + if ((w = str_end_with_word(s, l, "time")) > 0) { + int wtime = w; + l -= w; + if ((w = str_end_with_word(s, l, "standard")) > 0) { + l -= w; + } + else if ((w = str_end_with_word(s, l, "daylight")) > 0) { + l -= w; + dst = 1; + } + else { + l += wtime; + } + } + else if ((w = str_end_with_word(s, l, "dst")) > 0) { + l -= w; + dst = 1; + } + + { + const char *zn = s; + long sl = shrunk_size(s, l); + char shrunk_buff[MAX_WORD_LENGTH]; /* no terminator to be added */ + const struct zone *z = 0; + + if (sl <= 0) { + sl = l; + } + else if (sl <= MAX_WORD_LENGTH) { + char *d = shrunk_buff; + sl = shrink_space(d, s, l); + zn = d; + } + + if (sl > 0 && sl <= MAX_WORD_LENGTH) { + z = zonetab(zn, (unsigned int)sl); + } + + if (z) { + int d = z->offset; + if (dst) + d += 3600; + offset = INT2FIX(d); + goto ok; + } + } + + { + char *p; + int sign = 0; + long hour = 0, min = 0, sec = 0; + + if (l > 3 && + (strncasecmp(s, "gmt", 3) == 0 || + strncasecmp(s, "utc", 3) == 0)) { + s += 3; + l -= 3; + } + if (issign(*s)) { + sign = *s == '-'; + s++; + l--; + +#define out_of_range(v, min, max) ((v) < (min) || (max) < (v)) + hour = STRTOUL(s, &p, 10); + if (*p == ':') { + if (out_of_range(hour, 0, 23)) return Qnil; + s = ++p; + min = STRTOUL(s, &p, 10); + if (out_of_range(min, 0, 59)) return Qnil; + if (*p == ':') { + s = ++p; + sec = STRTOUL(s, &p, 10); + if (out_of_range(sec, 0, 59)) return Qnil; + } + } + else if (*p == ',' || *p == '.') { + /* fractional hour */ + size_t n; + int ov; + /* no over precision for offset; 10**-7 hour = 0.36 + * milliseconds should be enough. */ + const size_t max_digits = 7; /* 36 * 10**7 < 32-bit FIXNUM_MAX */ + + if (out_of_range(hour, 0, 23)) return Qnil; + + n = (s + l) - ++p; + if (n > max_digits) n = max_digits; + sec = ruby_scan_digits(p, n, 10, &n, &ov); + if ((p += n) < s + l && *p >= ('5' + !(sec & 1)) && *p <= '9') { + /* round half to even */ + sec++; + } + sec *= 36; + if (sign) { + hour = -hour; + sec = -sec; + } + if (n <= 2) { + /* HH.nn or HH.n */ + if (n == 1) sec *= 10; + offset = INT2FIX(sec + hour * 3600); + } + else { + VALUE denom = rb_int_positive_pow(10, (int)(n - 2)); + offset = f_add(rb_rational_new(INT2FIX(sec), denom), INT2FIX(hour * 3600)); + if (rb_rational_den(offset) == INT2FIX(1)) { + offset = rb_rational_num(offset); + } + } + goto ok; + } + else if (l > 2) { + size_t n; + int ov; + + if (l >= 1) + hour = ruby_scan_digits(&s[0], 2 - l % 2, 10, &n, &ov); + if (l >= 3) + min = ruby_scan_digits(&s[2 - l % 2], 2, 10, &n, &ov); + if (l >= 5) + sec = ruby_scan_digits(&s[4 - l % 2], 2, 10, &n, &ov); + } + sec += min * 60 + hour * 3600; + if (sign) sec = -sec; + offset = INT2FIX(sec); +#undef out_of_range + } + } + } + RB_GC_GUARD(str); + ok: + return offset; +} + +static int +day_num(VALUE s) +{ + int i; + + for (i = 0; i < (int)sizeof_array(abbr_days); i++) + if (strncasecmp(abbr_days[i], RSTRING_PTR(s), 3) == 0) + break; + return i; +} + +static int +mon_num(VALUE s) +{ + int i; + + for (i = 0; i < (int)sizeof_array(abbr_months); i++) + if (strncasecmp(abbr_months[i], RSTRING_PTR(s), 3) == 0) + break; + return i + 1; +} + +static int +parse_day_cb(VALUE m, VALUE hash) +{ + VALUE s; + + s = rb_reg_nth_match(1, m); + set_hash("wday", INT2FIX(day_num(s))); + return 1; +} + +static int +parse_day(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifndef TIGHT_PARSER + "\\b(" ABBR_DAYS ")[^-/\\d\\s]*" +#else + "(" VALID_DAYS ")" +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); +#ifndef TIGHT_PARSER + SUBS(str, pat, parse_day_cb); +#else + SUBW(str, pat, parse_day_cb); +#endif +} + +static int +parse_time2_cb(VALUE m, VALUE hash) +{ + VALUE h, min, s, f, p; + + h = rb_reg_nth_match(1, m); + h = str2num(h); + + min = rb_reg_nth_match(2, m); + if (!NIL_P(min)) + min = str2num(min); + + s = rb_reg_nth_match(3, m); + if (!NIL_P(s)) + s = str2num(s); + + f = rb_reg_nth_match(4, m); + + if (!NIL_P(f)) + f = rb_rational_new2(str2num(f), + f_expt(INT2FIX(10), LONG2NUM(RSTRING_LEN(f)))); + + p = rb_reg_nth_match(5, m); + + if (!NIL_P(p)) { + int ih = NUM2INT(h); + ih %= 12; + if (*RSTRING_PTR(p) == 'P' || *RSTRING_PTR(p) == 'p') + ih += 12; + h = INT2FIX(ih); + } + + set_hash("hour", h); + if (!NIL_P(min)) + set_hash("min", min); + if (!NIL_P(s)) + set_hash("sec", s); + if (!NIL_P(f)) + set_hash("sec_fraction", f); + + return 1; +} + +static int +parse_time_cb(VALUE m, VALUE hash) +{ + static const char pat_source[] = + "\\A(\\d+)h?" + "(?:\\s*:?\\s*(\\d+)m?" + "(?:" + "\\s*:?\\s*(\\d+)(?:[,.](\\d+))?s?" + ")?" + ")?" + "(?:\\s*([ap])(?:m\\b|\\.m\\.))?"; + static VALUE pat = Qnil; + VALUE s1, s2; + + s1 = rb_reg_nth_match(1, m); + s2 = rb_reg_nth_match(2, m); + + if (!NIL_P(s2)) + set_hash("zone", s2); + + REGCOMP_I(pat); + + { + VALUE m = f_match(pat, s1); + + if (NIL_P(m)) + return 0; + parse_time2_cb(m, hash); + } + + return 1; +} + +static int +parse_time(VALUE str, VALUE hash) +{ + static const char pat_source[] = + "(" + "" NUMBER "+\\s*" + "(?:" + "(?:" + ":\\s*\\d+" + "(?:" +#ifndef TIGHT_PARSER + "\\s*:\\s*\\d+(?:[,.]\\d*)?" +#else + "\\s*:\\s*\\d+(?:[,.]\\d+)?" +#endif + ")?" + "|" + "h(?:\\s*\\d+m?(?:\\s*\\d+s?)?)?" + ")" + "(?:" + "\\s*" + "[ap](?:m\\b|\\.m\\.)" + ")?" + "|" + "[ap](?:m\\b|\\.m\\.)" + ")" + ")" + "(?:" + "\\s*" + "(" + "(?:gmt|utc?)?[-+]\\d+(?:[,.:]\\d+(?::\\d+)?)?" + "|" + "(?-i:[[:alpha:].\\s]+)(?:standard|daylight)\\stime\\b" + "|" + "(?-i:[[:alpha:]]+)(?:\\sdst)?\\b" + ")" + ")?"; + static VALUE pat = Qnil; + + REGCOMP_I(pat); +#ifndef TIGHT_PARSER + SUBS(str, pat, parse_time_cb); +#else + SUBT(str, pat, parse_time_cb); +#endif +} + +#define BEGIN_ERA "\\b" +#define END_ERA "(?!(? 1) + return 0; + return 1; +} +#endif + +static int +parse_eu_cb(VALUE m, VALUE hash) +{ +#ifndef TIGHT_PARSER + VALUE y, mon, d, b; + + d = rb_reg_nth_match(1, m); + mon = rb_reg_nth_match(2, m); + b = rb_reg_nth_match(3, m); + y = rb_reg_nth_match(4, m); + + mon = INT2FIX(mon_num(mon)); + + s3e(hash, y, mon, d, !NIL_P(b) && + (*RSTRING_PTR(b) == 'B' || + *RSTRING_PTR(b) == 'b')); +#else + VALUE y, mon, d; + + d = rb_reg_nth_match(1, m); + mon = rb_reg_nth_match(2, m); + y = rb_reg_nth_match(3, m); + + if (!check_apost(d, mon, y)) + return 0; + + mon = INT2FIX(mon_num(mon)); + + s3e(hash, y, mon, d, 0); +#endif + return 1; +} + +static int +parse_eu(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifdef TIGHT_PARSER + BOS + FPW_COM FPT_COM +#endif +#ifndef TIGHT_PARSER + "('?" NUMBER "+)[^-\\d\\s]*" +#else + "(\\d+)(?:(?:st|nd|rd|th)\\b)?" +#endif + "\\s*" +#ifndef TIGHT_PARSER + "(" ABBR_MONTHS ")[^-\\d\\s']*" +#else + "(" VALID_MONTHS ")" +#endif + "(?:" + "\\s*" +#ifndef TIGHT_PARSER + "(?:" + BEGIN_ERA + "(c(?:e|\\.e\\.)|b(?:ce|\\.c\\.e\\.)|a(?:d|\\.d\\.)|b(?:c|\\.c\\.))" + END_ERA + ")?" + "\\s*" + "('?-?\\d+(?:(?:st|nd|rd|th)\\b)?)" +#else + "(?:" FPA ")?" + "\\s*" + "([-']?\\d+)" + "\\s*" + "(?:" FPA "|" FPB ")?" +#endif + ")?" +#ifdef TIGHT_PARSER + COM_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_eu_cb); +} + +static int +parse_us_cb(VALUE m, VALUE hash) +{ +#ifndef TIGHT_PARSER + VALUE y, mon, d, b; + + mon = rb_reg_nth_match(1, m); + d = rb_reg_nth_match(2, m); + + b = rb_reg_nth_match(3, m); + y = rb_reg_nth_match(4, m); + + mon = INT2FIX(mon_num(mon)); + + s3e(hash, y, mon, d, !NIL_P(b) && + (*RSTRING_PTR(b) == 'B' || + *RSTRING_PTR(b) == 'b')); +#else + VALUE y, mon, d; + + mon = rb_reg_nth_match(1, m); + d = rb_reg_nth_match(2, m); + y = rb_reg_nth_match(3, m); + + if (!check_apost(mon, d, y)) + return 0; + + mon = INT2FIX(mon_num(mon)); + + s3e(hash, y, mon, d, 0); +#endif + return 1; +} + +static int +parse_us(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifdef TIGHT_PARSER + BOS + FPW_COM FPT_COM +#endif +#ifndef TIGHT_PARSER + "\\b(" ABBR_MONTHS ")[^-\\d\\s']*" +#else + "\\b(" VALID_MONTHS ")" +#endif + "\\s*" +#ifndef TIGHT_PARSER + "('?\\d+)[^-\\d\\s']*" +#else + "('?\\d+)(?:(?:st|nd|rd|th)\\b)?" + COM_FPT +#endif + "(?:" + "\\s*+,?" + "\\s*+" +#ifndef TIGHT_PARSER + "(c(?:e|\\.e\\.)|b(?:ce|\\.c\\.e\\.)|a(?:d|\\.d\\.)|b(?:c|\\.c\\.))?" + "\\s*" + "('?-?\\d+)" +#else + "(?:" FPA ")?" + "\\s*" + "([-']?\\d+)" + "\\s*" + "(?:" FPA "|" FPB ")?" +#endif + ")?" +#ifdef TIGHT_PARSER + COM_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_us_cb); +} + +static int +parse_iso_cb(VALUE m, VALUE hash) +{ + VALUE y, mon, d; + + y = rb_reg_nth_match(1, m); + mon = rb_reg_nth_match(2, m); + d = rb_reg_nth_match(3, m); + +#ifdef TIGHT_PARSER + if (!check_apost(y, mon, d)) + return 0; +#endif + + s3e(hash, y, mon, d, 0); + return 1; +} + +static int +parse_iso(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifndef TIGHT_PARSER + "('?[-+]?" NUMBER "+)-(\\d+)-('?-?\\d+)" +#else + BOS + FPW_COM FPT_COM + "([-+']?\\d+)-(\\d+)-([-']?\\d+)" + TEE_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_0(pat); + SUBS(str, pat, parse_iso_cb); +} + +static int +parse_iso21_cb(VALUE m, VALUE hash) +{ + VALUE y, w, d; + + y = rb_reg_nth_match(1, m); + w = rb_reg_nth_match(2, m); + d = rb_reg_nth_match(3, m); + + if (!NIL_P(y)) + set_hash("cwyear", str2num(y)); + set_hash("cweek", str2num(w)); + if (!NIL_P(d)) + set_hash("cwday", str2num(d)); + + return 1; +} + +static int +parse_iso21(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifndef TIGHT_PARSER + "\\b(\\d{2}|\\d{4})?-?w(\\d{2})(?:-?(\\d))?\\b" +#else + BOS + FPW_COM FPT_COM + "(\\d{2}|\\d{4})?-?w(\\d{2})(?:-?(\\d))?" + TEE_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_iso21_cb); +} + +static int +parse_iso22_cb(VALUE m, VALUE hash) +{ + VALUE d; + + d = rb_reg_nth_match(1, m); + set_hash("cwday", str2num(d)); + return 1; +} + +static int +parse_iso22(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifndef TIGHT_PARSER + "-w-(\\d)\\b" +#else + BOS + FPW_COM FPT_COM + "-w-(\\d)" + TEE_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_iso22_cb); +} + +static int +parse_iso23_cb(VALUE m, VALUE hash) +{ + VALUE mon, d; + + mon = rb_reg_nth_match(1, m); + d = rb_reg_nth_match(2, m); + + if (!NIL_P(mon)) + set_hash("mon", str2num(mon)); + set_hash("mday", str2num(d)); + + return 1; +} + +static int +parse_iso23(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifndef TIGHT_PARSER + "--(\\d{2})?-(\\d{2})\\b" +#else + BOS + FPW_COM FPT_COM + "--(\\d{2})?-(\\d{2})" + TEE_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_0(pat); + SUBS(str, pat, parse_iso23_cb); +} + +static int +parse_iso24_cb(VALUE m, VALUE hash) +{ + VALUE mon, d; + + mon = rb_reg_nth_match(1, m); + d = rb_reg_nth_match(2, m); + + set_hash("mon", str2num(mon)); + if (!NIL_P(d)) + set_hash("mday", str2num(d)); + + return 1; +} + +static int +parse_iso24(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifndef TIGHT_PARSER + "--(\\d{2})(\\d{2})?\\b" +#else + BOS + FPW_COM FPT_COM + "--(\\d{2})(\\d{2})?" + TEE_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_0(pat); + SUBS(str, pat, parse_iso24_cb); +} + +static int +parse_iso25_cb(VALUE m, VALUE hash) +{ + VALUE y, d; + + y = rb_reg_nth_match(1, m); + d = rb_reg_nth_match(2, m); + + set_hash("year", str2num(y)); + set_hash("yday", str2num(d)); + + return 1; +} + +static int +parse_iso25(VALUE str, VALUE hash) +{ + static const char pat0_source[] = +#ifndef TIGHT_PARSER + "[,.](\\d{2}|\\d{4})-\\d{3}\\b" +#else + BOS + FPW_COM FPT_COM + "[,.](\\d{2}|\\d{4})-\\d{3}" + TEE_FPT COM_FPW + EOS +#endif + ; + static VALUE pat0 = Qnil; + static const char pat_source[] = +#ifndef TIGHT_PARSER + "\\b(\\d{2}|\\d{4})-(\\d{3})\\b" +#else + BOS + FPW_COM FPT_COM + "(\\d{2}|\\d{4})-(\\d{3})" + TEE_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_0(pat0); + REGCOMP_0(pat); + + if (!NIL_P(f_match(pat0, str))) + return 0; + SUBS(str, pat, parse_iso25_cb); +} + +static int +parse_iso26_cb(VALUE m, VALUE hash) +{ + VALUE d; + + d = rb_reg_nth_match(1, m); + set_hash("yday", str2num(d)); + + return 1; +} +static int +parse_iso26(VALUE str, VALUE hash) +{ + static const char pat0_source[] = +#ifndef TIGHT_PARSER + "\\d-\\d{3}\\b" +#else + BOS + FPW_COM FPT_COM + "\\d-\\d{3}" + TEE_FPT COM_FPW + EOS +#endif + ; + static VALUE pat0 = Qnil; + static const char pat_source[] = +#ifndef TIGHT_PARSER + "\\b-(\\d{3})\\b" +#else + BOS + FPW_COM FPT_COM + "-(\\d{3})" + TEE_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_0(pat0); + REGCOMP_0(pat); + + if (!NIL_P(f_match(pat0, str))) + return 0; + SUBS(str, pat, parse_iso26_cb); +} + +static int +parse_iso2(VALUE str, VALUE hash) +{ + if (parse_iso21(str, hash)) + goto ok; + if (parse_iso22(str, hash)) + goto ok; + if (parse_iso23(str, hash)) + goto ok; + if (parse_iso24(str, hash)) + goto ok; + if (parse_iso25(str, hash)) + goto ok; + if (parse_iso26(str, hash)) + goto ok; + return 0; + + ok: + return 1; +} + +#define JISX0301_ERA_INITIALS "mtshr" +#define JISX0301_DEFAULT_ERA 'H' /* obsolete */ + +static int +gengo(int c) +{ + int e; + + switch (c) { + case 'M': case 'm': e = 1867; break; + case 'T': case 't': e = 1911; break; + case 'S': case 's': e = 1925; break; + case 'H': case 'h': e = 1988; break; + case 'R': case 'r': e = 2018; break; + default: e = 0; break; + } + return e; +} + +static int +parse_jis_cb(VALUE m, VALUE hash) +{ + VALUE e, y, mon, d; + int ep; + + e = rb_reg_nth_match(1, m); + y = rb_reg_nth_match(2, m); + mon = rb_reg_nth_match(3, m); + d = rb_reg_nth_match(4, m); + + ep = gengo(*RSTRING_PTR(e)); + + set_hash("year", f_add(str2num(y), INT2FIX(ep))); + set_hash("mon", str2num(mon)); + set_hash("mday", str2num(d)); + + return 1; +} + +static int +parse_jis(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifndef TIGHT_PARSER + "\\b([" JISX0301_ERA_INITIALS "])(\\d+)\\.(\\d+)\\.(\\d+)" +#else + BOS + FPW_COM FPT_COM + "([" JISX0301_ERA_INITIALS "])(\\d+)\\.(\\d+)\\.(\\d+)" + TEE_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_jis_cb); +} + +static int +parse_vms11_cb(VALUE m, VALUE hash) +{ + VALUE y, mon, d; + + d = rb_reg_nth_match(1, m); + mon = rb_reg_nth_match(2, m); + y = rb_reg_nth_match(3, m); + +#ifdef TIGHT_PARSER + if (!check_apost(d, mon, y)) + return 0; +#endif + + mon = INT2FIX(mon_num(mon)); + + s3e(hash, y, mon, d, 0); + return 1; +} + +static int +parse_vms11(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifndef TIGHT_PARSER + "('?-?" NUMBER "+)-(" ABBR_MONTHS ")[^-/.]*" + "-('?-?\\d+)" +#else + BOS + FPW_COM FPT_COM + "([-']?\\d+)-(" DOTLESS_VALID_MONTHS ")" + "-([-']?\\d+)" + COM_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_vms11_cb); +} + +static int +parse_vms12_cb(VALUE m, VALUE hash) +{ + VALUE y, mon, d; + + mon = rb_reg_nth_match(1, m); + d = rb_reg_nth_match(2, m); + y = rb_reg_nth_match(3, m); + +#ifdef TIGHT_PARSER + if (!check_apost(mon, d, y)) + return 0; +#endif + + mon = INT2FIX(mon_num(mon)); + + s3e(hash, y, mon, d, 0); + return 1; +} + +static int +parse_vms12(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifndef TIGHT_PARSER + "\\b(" ABBR_MONTHS ")[^-/.]*" + "-('?-?\\d+)(?:-('?-?\\d+))?" +#else + BOS + FPW_COM FPT_COM + "(" DOTLESS_VALID_MONTHS ")" + "-([-']?\\d+)(?:-([-']?\\d+))?" + COM_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_vms12_cb); +} + +static int +parse_vms(VALUE str, VALUE hash) +{ + if (parse_vms11(str, hash)) + goto ok; + if (parse_vms12(str, hash)) + goto ok; + return 0; + + ok: + return 1; +} + +static int +parse_sla_cb(VALUE m, VALUE hash) +{ + VALUE y, mon, d; + + y = rb_reg_nth_match(1, m); + mon = rb_reg_nth_match(2, m); + d = rb_reg_nth_match(3, m); + +#ifdef TIGHT_PARSER + if (!check_apost(y, mon, d)) + return 0; +#endif + + s3e(hash, y, mon, d, 0); + return 1; +} + +static int +parse_sla(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifndef TIGHT_PARSER + "('?-?" NUMBER "+)/\\s*('?\\d+)(?:\\D\\s*('?-?\\d+))?" +#else + BOS + FPW_COM FPT_COM + "([-']?\\d+)/\\s*('?\\d+)(?:(?:[-/]|\\s+)\\s*([-']?\\d+))?" + COM_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_sla_cb); +} + +#ifdef TIGHT_PARSER +static int +parse_sla2_cb(VALUE m, VALUE hash) +{ + VALUE y, mon, d; + + d = rb_reg_nth_match(1, m); + mon = rb_reg_nth_match(2, m); + y = rb_reg_nth_match(3, m); + + if (!check_apost(d, mon, y)) + return 0; + + mon = INT2FIX(mon_num(mon)); + + s3e(hash, y, mon, d, 0); + return 1; +} + +static int +parse_sla2(VALUE str, VALUE hash) +{ + static const char pat_source[] = + BOS + FPW_COM FPT_COM + "([-']?\\d+)/\\s*(" DOTLESS_VALID_MONTHS ")(?:(?:[-/]|\\s+)\\s*([-']?\\d+))?" + COM_FPT COM_FPW + EOS + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_sla2_cb); +} + +static int +parse_sla3_cb(VALUE m, VALUE hash) +{ + VALUE y, mon, d; + + mon = rb_reg_nth_match(1, m); + d = rb_reg_nth_match(2, m); + y = rb_reg_nth_match(3, m); + + if (!check_apost(mon, d, y)) + return 0; + + mon = INT2FIX(mon_num(mon)); + + s3e(hash, y, mon, d, 0); + return 1; +} + +static int +parse_sla3(VALUE str, VALUE hash) +{ + static const char pat_source[] = + BOS + FPW_COM FPT_COM + "(" DOTLESS_VALID_MONTHS ")/\\s*([-']?\\d+)(?:(?:[-/]|\\s+)\\s*([-']?\\d+))?" + COM_FPT COM_FPW + EOS + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_sla3_cb); +} +#endif + +static int +parse_dot_cb(VALUE m, VALUE hash) +{ + VALUE y, mon, d; + + y = rb_reg_nth_match(1, m); + mon = rb_reg_nth_match(2, m); + d = rb_reg_nth_match(3, m); + +#ifdef TIGHT_PARSER + if (!check_apost(y, mon, d)) + return 0; +#endif + + s3e(hash, y, mon, d, 0); + return 1; +} + +static int +parse_dot(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifndef TIGHT_PARSER + "('?-?" NUMBER "+)\\.\\s*('?\\d+)\\.\\s*('?-?\\d+)" +#else + BOS + FPW_COM FPT_COM + "([-']?\\d+)\\.\\s*(\\d+)\\.\\s*([-']?\\d+)" + COM_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_dot_cb); +} + +#ifdef TIGHT_PARSER +static int +parse_dot2_cb(VALUE m, VALUE hash) +{ + VALUE y, mon, d; + + d = rb_reg_nth_match(1, m); + mon = rb_reg_nth_match(2, m); + y = rb_reg_nth_match(3, m); + + if (!check_apost(d, mon, y)) + return 0; + + mon = INT2FIX(mon_num(mon)); + + s3e(hash, y, mon, d, 0); + return 1; +} + +static int +parse_dot2(VALUE str, VALUE hash) +{ + static const char pat_source[] = + BOS + FPW_COM FPT_COM + "([-']?\\d+)\\.\\s*(" DOTLESS_VALID_MONTHS ")(?:(?:[./])\\s*([-']?\\d+))?" + COM_FPT COM_FPW + EOS + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_dot2_cb); +} + +static int +parse_dot3_cb(VALUE m, VALUE hash) +{ + VALUE y, mon, d; + + mon = rb_reg_nth_match(1, m); + d = rb_reg_nth_match(2, m); + y = rb_reg_nth_match(3, m); + + if (!check_apost(mon, d, y)) + return 0; + + mon = INT2FIX(mon_num(mon)); + + s3e(hash, y, mon, d, 0); + return 1; +} + +static int +parse_dot3(VALUE str, VALUE hash) +{ + static const char pat_source[] = + BOS + FPW_COM FPT_COM + "(" DOTLESS_VALID_MONTHS ")\\.\\s*([-']?\\d+)(?:(?:[./])\\s*([-']?\\d+))?" + COM_FPT COM_FPW + EOS + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_dot3_cb); +} +#endif + +static int +parse_year_cb(VALUE m, VALUE hash) +{ + VALUE y; + + y = rb_reg_nth_match(1, m); + set_hash("year", str2num(y)); + return 1; +} + +static int +parse_year(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifndef TIGHT_PARSER + "'(\\d+)\\b" +#else + BOS + FPW_COM FPT_COM + "'(\\d+)" + COM_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_0(pat); + SUBS(str, pat, parse_year_cb); +} + +static int +parse_mon_cb(VALUE m, VALUE hash) +{ + VALUE mon; + + mon = rb_reg_nth_match(1, m); + set_hash("mon", INT2FIX(mon_num(mon))); + return 1; +} + +static int +parse_mon(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifndef TIGHT_PARSER + "\\b(" ABBR_MONTHS ")\\S*" +#else + BOS + FPW_COM FPT_COM + "(" VALID_MONTHS ")" + COM_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_mon_cb); +} + +static int +parse_mday_cb(VALUE m, VALUE hash) +{ + VALUE d; + + d = rb_reg_nth_match(1, m); + set_hash("mday", str2num(d)); + return 1; +} + +static int +parse_mday(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifndef TIGHT_PARSER + "(" NUMBER "+)(st|nd|rd|th)\\b" +#else + BOS + FPW_COM FPT_COM + "(\\d+)(st|nd|rd|th)" + COM_FPT COM_FPW + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_mday_cb); +} + +static int +n2i(const char *s, long f, long w) +{ + long e, i; + int v; + + e = f + w; + v = 0; + for (i = f; i < e; i++) { + v *= 10; + v += s[i] - '0'; + } + return v; +} + +static int +parse_ddd_cb(VALUE m, VALUE hash) +{ + VALUE s1, s2, s3, s4, s5; + const char *cs2, *cs3, *cs5; + long l2, l3, l4, l5; + + s1 = rb_reg_nth_match(1, m); + s2 = rb_reg_nth_match(2, m); + s3 = rb_reg_nth_match(3, m); + s4 = rb_reg_nth_match(4, m); + s5 = rb_reg_nth_match(5, m); + + cs2 = RSTRING_PTR(s2); + l2 = RSTRING_LEN(s2); + + switch (l2) { + case 2: + if (NIL_P(s3) && !NIL_P(s4)) + set_hash("sec", INT2FIX(n2i(cs2, l2-2, 2))); + else + set_hash("mday", INT2FIX(n2i(cs2, 0, 2))); + break; + case 4: + if (NIL_P(s3) && !NIL_P(s4)) { + set_hash("sec", INT2FIX(n2i(cs2, l2-2, 2))); + set_hash("min", INT2FIX(n2i(cs2, l2-4, 2))); + } + else { + set_hash("mon", INT2FIX(n2i(cs2, 0, 2))); + set_hash("mday", INT2FIX(n2i(cs2, 2, 2))); + } + break; + case 6: + if (NIL_P(s3) && !NIL_P(s4)) { + set_hash("sec", INT2FIX(n2i(cs2, l2-2, 2))); + set_hash("min", INT2FIX(n2i(cs2, l2-4, 2))); + set_hash("hour", INT2FIX(n2i(cs2, l2-6, 2))); + } + else { + int y = n2i(cs2, 0, 2); + if (!NIL_P(s1) && *RSTRING_PTR(s1) == '-') + y = -y; + set_hash("year", INT2FIX(y)); + set_hash("mon", INT2FIX(n2i(cs2, 2, 2))); + set_hash("mday", INT2FIX(n2i(cs2, 4, 2))); + } + break; + case 8: + case 10: + case 12: + case 14: + if (NIL_P(s3) && !NIL_P(s4)) { + set_hash("sec", INT2FIX(n2i(cs2, l2-2, 2))); + set_hash("min", INT2FIX(n2i(cs2, l2-4, 2))); + set_hash("hour", INT2FIX(n2i(cs2, l2-6, 2))); + set_hash("mday", INT2FIX(n2i(cs2, l2-8, 2))); + if (l2 >= 10) + set_hash("mon", INT2FIX(n2i(cs2, l2-10, 2))); + if (l2 == 12) { + int y = n2i(cs2, l2-12, 2); + if (!NIL_P(s1) && *RSTRING_PTR(s1) == '-') + y = -y; + set_hash("year", INT2FIX(y)); + } + if (l2 == 14) { + int y = n2i(cs2, l2-14, 4); + if (!NIL_P(s1) && *RSTRING_PTR(s1) == '-') + y = -y; + set_hash("year", INT2FIX(y)); + set_hash("_comp", Qfalse); + } + } + else { + int y = n2i(cs2, 0, 4); + if (!NIL_P(s1) && *RSTRING_PTR(s1) == '-') + y = -y; + set_hash("year", INT2FIX(y)); + set_hash("mon", INT2FIX(n2i(cs2, 4, 2))); + set_hash("mday", INT2FIX(n2i(cs2, 6, 2))); + if (l2 >= 10) + set_hash("hour", INT2FIX(n2i(cs2, 8, 2))); + if (l2 >= 12) + set_hash("min", INT2FIX(n2i(cs2, 10, 2))); + if (l2 >= 14) + set_hash("sec", INT2FIX(n2i(cs2, 12, 2))); + set_hash("_comp", Qfalse); + } + break; + case 3: + if (NIL_P(s3) && !NIL_P(s4)) { + set_hash("sec", INT2FIX(n2i(cs2, l2-2, 2))); + set_hash("min", INT2FIX(n2i(cs2, l2-3, 1))); + } + else + set_hash("yday", INT2FIX(n2i(cs2, 0, 3))); + break; + case 5: + if (NIL_P(s3) && !NIL_P(s4)) { + set_hash("sec", INT2FIX(n2i(cs2, l2-2, 2))); + set_hash("min", INT2FIX(n2i(cs2, l2-4, 2))); + set_hash("hour", INT2FIX(n2i(cs2, l2-5, 1))); + } + else { + int y = n2i(cs2, 0, 2); + if (!NIL_P(s1) && *RSTRING_PTR(s1) == '-') + y = -y; + set_hash("year", INT2FIX(y)); + set_hash("yday", INT2FIX(n2i(cs2, 2, 3))); + } + break; + case 7: + if (NIL_P(s3) && !NIL_P(s4)) { + set_hash("sec", INT2FIX(n2i(cs2, l2-2, 2))); + set_hash("min", INT2FIX(n2i(cs2, l2-4, 2))); + set_hash("hour", INT2FIX(n2i(cs2, l2-6, 2))); + set_hash("mday", INT2FIX(n2i(cs2, l2-7, 1))); + } + else { + int y = n2i(cs2, 0, 4); + if (!NIL_P(s1) && *RSTRING_PTR(s1) == '-') + y = -y; + set_hash("year", INT2FIX(y)); + set_hash("yday", INT2FIX(n2i(cs2, 4, 3))); + } + break; + } + RB_GC_GUARD(s2); + if (!NIL_P(s3)) { + cs3 = RSTRING_PTR(s3); + l3 = RSTRING_LEN(s3); + + if (!NIL_P(s4)) { + switch (l3) { + case 2: + case 4: + case 6: + set_hash("sec", INT2FIX(n2i(cs3, l3-2, 2))); + if (l3 >= 4) + set_hash("min", INT2FIX(n2i(cs3, l3-4, 2))); + if (l3 >= 6) + set_hash("hour", INT2FIX(n2i(cs3, l3-6, 2))); + break; + } + } + else { + switch (l3) { + case 2: + case 4: + case 6: + set_hash("hour", INT2FIX(n2i(cs3, 0, 2))); + if (l3 >= 4) + set_hash("min", INT2FIX(n2i(cs3, 2, 2))); + if (l3 >= 6) + set_hash("sec", INT2FIX(n2i(cs3, 4, 2))); + break; + } + } + RB_GC_GUARD(s3); + } + if (!NIL_P(s4)) { + l4 = RSTRING_LEN(s4); + + set_hash("sec_fraction", + rb_rational_new2(str2num(s4), + f_expt(INT2FIX(10), LONG2NUM(l4)))); + } + if (!NIL_P(s5)) { + cs5 = RSTRING_PTR(s5); + l5 = RSTRING_LEN(s5); + + set_hash("zone", s5); + + if (*cs5 == '[') { + const char *s1, *s2; + VALUE zone; + + l5 -= 2; + s1 = cs5 + 1; + s2 = memchr(s1, ':', l5); + if (s2) { + s2++; + zone = rb_str_subseq(s5, s2 - cs5, l5 - (s2 - s1)); + s5 = rb_str_subseq(s5, 1, s2 - s1); + } + else { + zone = rb_str_subseq(s5, 1, l5); + if (isdigit((unsigned char)*s1)) + s5 = rb_str_append(rb_str_new_cstr("+"), zone); + else + s5 = zone; + } + set_hash("zone", zone); + set_hash("offset", date_zone_to_diff(s5)); + } + RB_GC_GUARD(s5); + } + + return 1; +} + +static int +parse_ddd(VALUE str, VALUE hash) +{ + static const char pat_source[] = +#ifdef TIGHT_PARSER + BOS +#endif + "([-+]?)(" NUMBER "{2,14})" + "(?:" + "\\s*" + "t?" + "\\s*" + "(\\d{2,6})?(?:[,.](\\d*))?" + ")?" + "(?:" + "\\s*" + "(" + "z\\b" + "|" + "[-+]\\d{1,4}\\b" + "|" + "\\[[-+]?\\d[^\\]]*\\]" + ")" + ")?" +#ifdef TIGHT_PARSER + EOS +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_ddd_cb); +} + +#ifndef TIGHT_PARSER +static int +parse_bc_cb(VALUE m, VALUE hash) +{ + set_hash("_bc", Qtrue); + return 1; +} + +static int +parse_bc(VALUE str, VALUE hash) +{ + static const char pat_source[] = + "\\b(bc\\b|bce\\b|b\\.c\\.|b\\.c\\.e\\.)"; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_bc_cb); +} + +static int +parse_frag_cb(VALUE m, VALUE hash) +{ + VALUE s, n; + + s = rb_reg_nth_match(1, m); + + if (!NIL_P(ref_hash("hour")) && NIL_P(ref_hash("mday"))) { + n = str2num(s); + if (f_ge_p(n, INT2FIX(1)) && + f_le_p(n, INT2FIX(31))) + set_hash("mday", n); + } + if (!NIL_P(ref_hash("mday")) && NIL_P(ref_hash("hour"))) { + n = str2num(s); + if (f_ge_p(n, INT2FIX(0)) && + f_le_p(n, INT2FIX(24))) + set_hash("hour", n); + } + + return 1; +} + +static int +parse_frag(VALUE str, VALUE hash) +{ + static const char pat_source[] = "\\A\\s*(\\d{1,2})\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + SUBS(str, pat, parse_frag_cb); +} +#endif + +#ifdef TIGHT_PARSER +static int +parse_dummy_cb(VALUE m, VALUE hash) +{ + return 1; +} + +static int +parse_wday_only(VALUE str, VALUE hash) +{ + static const char pat_source[] = "\\A\\s*" FPW "\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_0(pat); + SUBS(str, pat, parse_dummy_cb); +} + +static int +parse_time_only(VALUE str, VALUE hash) +{ + static const char pat_source[] = "\\A\\s*" FPT "\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_0(pat); + SUBS(str, pat, parse_dummy_cb); +} + +static int +parse_wday_and_time(VALUE str, VALUE hash) +{ + static const char pat_source[] = "\\A\\s*(" FPW "\\s+" FPT "|" FPT "\\s+" FPW ")\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_0(pat); + SUBS(str, pat, parse_dummy_cb); +} + +static unsigned +have_invalid_char_p(VALUE s) +{ + long i; + + for (i = 0; i < RSTRING_LEN(s); i++) + if (iscntrl((unsigned char)RSTRING_PTR(s)[i]) && + !isspace((unsigned char)RSTRING_PTR(s)[i])) + return 1; + return 0; +} +#endif + +#define HAVE_ALPHA (1<<0) +#define HAVE_DIGIT (1<<1) +#define HAVE_DASH (1<<2) +#define HAVE_DOT (1<<3) +#define HAVE_SLASH (1<<4) + +static unsigned +check_class(VALUE s) +{ + unsigned flags; + long i; + + flags = 0; + for (i = 0; i < RSTRING_LEN(s); i++) { + if (isalpha((unsigned char)RSTRING_PTR(s)[i])) + flags |= HAVE_ALPHA; + if (isdigit((unsigned char)RSTRING_PTR(s)[i])) + flags |= HAVE_DIGIT; + if (RSTRING_PTR(s)[i] == '-') + flags |= HAVE_DASH; + if (RSTRING_PTR(s)[i] == '.') + flags |= HAVE_DOT; + if (RSTRING_PTR(s)[i] == '/') + flags |= HAVE_SLASH; + } + return flags; +} + +#define HAVE_ELEM_P(x) ((check_class(str) & (x)) == (x)) + +#ifdef TIGHT_PARSER +#define PARSER_ERROR return rb_hash_new() +#endif + +VALUE +date__parse(VALUE str, VALUE comp) +{ + VALUE backref, hash; + +#ifdef TIGHT_PARSER + if (have_invalid_char_p(str)) + PARSER_ERROR; +#endif + + backref = rb_backref_get(); + rb_match_busy(backref); + + { + static const char pat_source[] = +#ifndef TIGHT_PARSER + "[^-+',./:@[:alnum:]\\[\\]]+" +#else + "[^[:graph:]]+" +#endif + ; + static VALUE pat = Qnil; + + REGCOMP_0(pat); + str = rb_str_dup(str); + f_gsub_bang(str, pat, asp_string()); + } + + hash = rb_hash_new(); + set_hash("_comp", comp); + + if (HAVE_ELEM_P(HAVE_ALPHA)) + parse_day(str, hash); + if (HAVE_ELEM_P(HAVE_DIGIT)) + parse_time(str, hash); + +#ifdef TIGHT_PARSER + if (HAVE_ELEM_P(HAVE_ALPHA)) + parse_era(str, hash); +#endif + + if (HAVE_ELEM_P(HAVE_ALPHA|HAVE_DIGIT)) { + if (parse_eu(str, hash)) + goto ok; + if (parse_us(str, hash)) + goto ok; + } + if (HAVE_ELEM_P(HAVE_DIGIT|HAVE_DASH)) + if (parse_iso(str, hash)) + goto ok; + if (HAVE_ELEM_P(HAVE_DIGIT|HAVE_DOT)) + if (parse_jis(str, hash)) + goto ok; + if (HAVE_ELEM_P(HAVE_ALPHA|HAVE_DIGIT|HAVE_DASH)) + if (parse_vms(str, hash)) + goto ok; + if (HAVE_ELEM_P(HAVE_DIGIT|HAVE_SLASH)) + if (parse_sla(str, hash)) + goto ok; +#ifdef TIGHT_PARSER + if (HAVE_ELEM_P(HAVE_ALPHA|HAVE_DIGIT|HAVE_SLASH)) { + if (parse_sla2(str, hash)) + goto ok; + if (parse_sla3(str, hash)) + goto ok; + } +#endif + if (HAVE_ELEM_P(HAVE_DIGIT|HAVE_DOT)) + if (parse_dot(str, hash)) + goto ok; +#ifdef TIGHT_PARSER + if (HAVE_ELEM_P(HAVE_ALPHA|HAVE_DIGIT|HAVE_DOT)) { + if (parse_dot2(str, hash)) + goto ok; + if (parse_dot3(str, hash)) + goto ok; + } +#endif + if (HAVE_ELEM_P(HAVE_DIGIT)) + if (parse_iso2(str, hash)) + goto ok; + if (HAVE_ELEM_P(HAVE_DIGIT)) + if (parse_year(str, hash)) + goto ok; + if (HAVE_ELEM_P(HAVE_ALPHA)) + if (parse_mon(str, hash)) + goto ok; + if (HAVE_ELEM_P(HAVE_DIGIT)) + if (parse_mday(str, hash)) + goto ok; + if (HAVE_ELEM_P(HAVE_DIGIT)) + if (parse_ddd(str, hash)) + goto ok; + +#ifdef TIGHT_PARSER + if (parse_wday_only(str, hash)) + goto ok; + if (parse_time_only(str, hash)) + goto ok; + if (parse_wday_and_time(str, hash)) + goto ok; + + PARSER_ERROR; /* not found */ +#endif + + ok: +#ifndef TIGHT_PARSER + if (HAVE_ELEM_P(HAVE_ALPHA)) + parse_bc(str, hash); + if (HAVE_ELEM_P(HAVE_DIGIT)) + parse_frag(str, hash); +#endif + + { + if (RTEST(del_hash("_bc"))) { + VALUE y; + + y = ref_hash("cwyear"); + if (!NIL_P(y)) { + y = f_add(f_negate(y), INT2FIX(1)); + set_hash("cwyear", y); + } + y = ref_hash("year"); + if (!NIL_P(y)) { + y = f_add(f_negate(y), INT2FIX(1)); + set_hash("year", y); + } + } + + if (RTEST(del_hash("_comp"))) { + VALUE y; + + y = ref_hash("cwyear"); + if (!NIL_P(y)) + if (f_ge_p(y, INT2FIX(0)) && f_le_p(y, INT2FIX(99))) { + if (f_ge_p(y, INT2FIX(69))) + set_hash("cwyear", f_add(y, INT2FIX(1900))); + else + set_hash("cwyear", f_add(y, INT2FIX(2000))); + } + y = ref_hash("year"); + if (!NIL_P(y)) + if (f_ge_p(y, INT2FIX(0)) && f_le_p(y, INT2FIX(99))) { + if (f_ge_p(y, INT2FIX(69))) + set_hash("year", f_add(y, INT2FIX(1900))); + else + set_hash("year", f_add(y, INT2FIX(2000))); + } + } + + } + + { + VALUE zone = ref_hash("zone"); + if (!NIL_P(zone) && NIL_P(ref_hash("offset"))) + set_hash("offset", date_zone_to_diff(zone)); + } + + rb_backref_set(backref); + + return hash; +} + +static VALUE +comp_year69(VALUE y) +{ + if (f_ge_p(y, INT2FIX(69))) + return f_add(y, INT2FIX(1900)); + return f_add(y, INT2FIX(2000)); +} + +static VALUE +comp_year50(VALUE y) +{ + if (f_ge_p(y, INT2FIX(50))) + return f_add(y, INT2FIX(1900)); + return f_add(y, INT2FIX(2000)); +} + +static VALUE +sec_fraction(VALUE f) +{ + return rb_rational_new2(str2num(f), + f_expt(INT2FIX(10), + LONG2NUM(RSTRING_LEN(f)))); +} + +#define SNUM 14 + +static int +iso8601_ext_datetime_cb(VALUE m, VALUE hash) +{ + VALUE s[SNUM + 1], y; + + { + int i; + s[0] = Qnil; + for (i = 1; i <= SNUM; i++) + s[i] = rb_reg_nth_match(i, m); + } + + if (!NIL_P(s[1])) { + if (!NIL_P(s[3])) set_hash("mday", str2num(s[3])); + if (strcmp(RSTRING_PTR(s[1]), "-") != 0) { + y = str2num(s[1]); + if (RSTRING_LEN(s[1]) < 4) + y = comp_year69(y); + set_hash("year", y); + } + if (NIL_P(s[2])) { + if (strcmp(RSTRING_PTR(s[1]), "-") != 0) + return 0; + } + else + set_hash("mon", str2num(s[2])); + } + else if (!NIL_P(s[5])) { + set_hash("yday", str2num(s[5])); + if (!NIL_P(s[4])) { + y = str2num(s[4]); + if (RSTRING_LEN(s[4]) < 4) + y = comp_year69(y); + set_hash("year", y); + } + } + else if (!NIL_P(s[8])) { + set_hash("cweek", str2num(s[7])); + set_hash("cwday", str2num(s[8])); + if (!NIL_P(s[6])) { + y = str2num(s[6]); + if (RSTRING_LEN(s[6]) < 4) + y = comp_year69(y); + set_hash("cwyear", y); + } + } + else if (!NIL_P(s[9])) { + set_hash("cwday", str2num(s[9])); + } + if (!NIL_P(s[10])) { + set_hash("hour", str2num(s[10])); + set_hash("min", str2num(s[11])); + if (!NIL_P(s[12])) + set_hash("sec", str2num(s[12])); + } + if (!NIL_P(s[13])) { + set_hash("sec_fraction", sec_fraction(s[13])); + } + if (!NIL_P(s[14])) { + set_hash("zone", s[14]); + set_hash("offset", date_zone_to_diff(s[14])); + } + + return 1; +} + +static int +iso8601_ext_datetime(VALUE str, VALUE hash) +{ + static const char pat_source[] = + "\\A\\s*(?:([-+]?\\d{2,}|-)-(\\d{2})?(?:-(\\d{2}))?|" + "([-+]?\\d{2,})?-(\\d{3})|" + "(\\d{4}|\\d{2})?-w(\\d{2})-(\\d)|" + "-w-(\\d))" + "(?:t" + "(\\d{2}):(\\d{2})(?::(\\d{2})(?:[,.](\\d+))?)?" + "(z|[-+]\\d{2}(?::?\\d{2})?)?)?\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + MATCH(str, pat, iso8601_ext_datetime_cb); +} + +#undef SNUM +#define SNUM 17 + +static int +iso8601_bas_datetime_cb(VALUE m, VALUE hash) +{ + VALUE s[SNUM + 1], y; + + { + int i; + s[0] = Qnil; + for (i = 1; i <= SNUM; i++) + s[i] = rb_reg_nth_match(i, m); + } + + if (!NIL_P(s[3])) { + set_hash("mday", str2num(s[3])); + if (strcmp(RSTRING_PTR(s[1]), "--") != 0) { + y = str2num(s[1]); + if (RSTRING_LEN(s[1]) < 4) + y = comp_year69(y); + set_hash("year", y); + } + if (*RSTRING_PTR(s[2]) == '-') { + if (strcmp(RSTRING_PTR(s[1]), "--") != 0) + return 0; + } + else + set_hash("mon", str2num(s[2])); + } + else if (!NIL_P(s[5])) { + set_hash("yday", str2num(s[5])); + y = str2num(s[4]); + if (RSTRING_LEN(s[4]) < 4) + y = comp_year69(y); + set_hash("year", y); + } + else if (!NIL_P(s[6])) { + set_hash("yday", str2num(s[6])); + } + else if (!NIL_P(s[9])) { + set_hash("cweek", str2num(s[8])); + set_hash("cwday", str2num(s[9])); + y = str2num(s[7]); + if (RSTRING_LEN(s[7]) < 4) + y = comp_year69(y); + set_hash("cwyear", y); + } + else if (!NIL_P(s[11])) { + set_hash("cweek", str2num(s[10])); + set_hash("cwday", str2num(s[11])); + } + else if (!NIL_P(s[12])) { + set_hash("cwday", str2num(s[12])); + } + if (!NIL_P(s[13])) { + set_hash("hour", str2num(s[13])); + set_hash("min", str2num(s[14])); + if (!NIL_P(s[15])) + set_hash("sec", str2num(s[15])); + } + if (!NIL_P(s[16])) { + set_hash("sec_fraction", sec_fraction(s[16])); + } + if (!NIL_P(s[17])) { + set_hash("zone", s[17]); + set_hash("offset", date_zone_to_diff(s[17])); + } + + return 1; +} + +static int +iso8601_bas_datetime(VALUE str, VALUE hash) +{ + static const char pat_source[] = + "\\A\\s*(?:([-+]?(?:\\d{4}|\\d{2})|--)(\\d{2}|-)(\\d{2})|" + "([-+]?(?:\\d{4}|\\d{2}))(\\d{3})|" + "-(\\d{3})|" + "(\\d{4}|\\d{2})w(\\d{2})(\\d)|" + "-w(\\d{2})(\\d)|" + "-w-(\\d))" + "(?:t?" + "(\\d{2})(\\d{2})(?:(\\d{2})(?:[,.](\\d+))?)?" + "(z|[-+]\\d{2}(?:\\d{2})?)?)?\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + MATCH(str, pat, iso8601_bas_datetime_cb); +} + +#undef SNUM +#define SNUM 5 + +static int +iso8601_ext_time_cb(VALUE m, VALUE hash) +{ + VALUE s[SNUM + 1]; + + { + int i; + s[0] = Qnil; + for (i = 1; i <= SNUM; i++) + s[i] = rb_reg_nth_match(i, m); + } + + set_hash("hour", str2num(s[1])); + set_hash("min", str2num(s[2])); + if (!NIL_P(s[3])) + set_hash("sec", str2num(s[3])); + if (!NIL_P(s[4])) + set_hash("sec_fraction", sec_fraction(s[4])); + if (!NIL_P(s[5])) { + set_hash("zone", s[5]); + set_hash("offset", date_zone_to_diff(s[5])); + } + + return 1; +} + +#define iso8601_bas_time_cb iso8601_ext_time_cb + +static int +iso8601_ext_time(VALUE str, VALUE hash) +{ + static const char pat_source[] = + "\\A\\s*(\\d{2}):(\\d{2})(?::(\\d{2})(?:[,.](\\d+))?" + "(z|[-+]\\d{2}(:?\\d{2})?)?)?\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + MATCH(str, pat, iso8601_ext_time_cb); +} + +static int +iso8601_bas_time(VALUE str, VALUE hash) +{ + static const char pat_source[] = + "\\A\\s*(\\d{2})(\\d{2})(?:(\\d{2})(?:[,.](\\d+))?" + "(z|[-+]\\d{2}(\\d{2})?)?)?\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + MATCH(str, pat, iso8601_bas_time_cb); +} + +VALUE +date__iso8601(VALUE str) +{ + VALUE backref, hash; + + backref = rb_backref_get(); + rb_match_busy(backref); + + hash = rb_hash_new(); + + if (iso8601_ext_datetime(str, hash)) + goto ok; + if (iso8601_bas_datetime(str, hash)) + goto ok; + if (iso8601_ext_time(str, hash)) + goto ok; + if (iso8601_bas_time(str, hash)) + goto ok; + + ok: + rb_backref_set(backref); + + return hash; +} + +#undef SNUM +#define SNUM 8 + +static int +rfc3339_cb(VALUE m, VALUE hash) +{ + VALUE s[SNUM + 1]; + + { + int i; + s[0] = Qnil; + for (i = 1; i <= SNUM; i++) + s[i] = rb_reg_nth_match(i, m); + } + + set_hash("year", str2num(s[1])); + set_hash("mon", str2num(s[2])); + set_hash("mday", str2num(s[3])); + set_hash("hour", str2num(s[4])); + set_hash("min", str2num(s[5])); + set_hash("sec", str2num(s[6])); + set_hash("zone", s[8]); + set_hash("offset", date_zone_to_diff(s[8])); + if (!NIL_P(s[7])) + set_hash("sec_fraction", sec_fraction(s[7])); + + return 1; +} + +static int +rfc3339(VALUE str, VALUE hash) +{ + static const char pat_source[] = + "\\A\\s*(-?\\d{4})-(\\d{2})-(\\d{2})" + "(?:t|\\s)" + "(\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?" + "(z|[-+]\\d{2}:\\d{2})\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + MATCH(str, pat, rfc3339_cb); +} + +VALUE +date__rfc3339(VALUE str) +{ + VALUE backref, hash; + + backref = rb_backref_get(); + rb_match_busy(backref); + + hash = rb_hash_new(); + rfc3339(str, hash); + rb_backref_set(backref); + return hash; +} + +#undef SNUM +#define SNUM 8 + +static int +xmlschema_datetime_cb(VALUE m, VALUE hash) +{ + VALUE s[SNUM + 1]; + + { + int i; + s[0] = Qnil; + for (i = 1; i <= SNUM; i++) + s[i] = rb_reg_nth_match(i, m); + } + + set_hash("year", str2num(s[1])); + if (!NIL_P(s[2])) + set_hash("mon", str2num(s[2])); + if (!NIL_P(s[3])) + set_hash("mday", str2num(s[3])); + if (!NIL_P(s[4])) + set_hash("hour", str2num(s[4])); + if (!NIL_P(s[5])) + set_hash("min", str2num(s[5])); + if (!NIL_P(s[6])) + set_hash("sec", str2num(s[6])); + if (!NIL_P(s[7])) + set_hash("sec_fraction", sec_fraction(s[7])); + if (!NIL_P(s[8])) { + set_hash("zone", s[8]); + set_hash("offset", date_zone_to_diff(s[8])); + } + + return 1; +} + +static int +xmlschema_datetime(VALUE str, VALUE hash) +{ + static const char pat_source[] = + "\\A\\s*(-?\\d{4,})(?:-(\\d{2})(?:-(\\d{2}))?)?" + "(?:t" + "(\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?)?" + "(z|[-+]\\d{2}:\\d{2})?\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + MATCH(str, pat, xmlschema_datetime_cb); +} + +#undef SNUM +#define SNUM 5 + +static int +xmlschema_time_cb(VALUE m, VALUE hash) +{ + VALUE s[SNUM + 1]; + + { + int i; + s[0] = Qnil; + for (i = 1; i <= SNUM; i++) + s[i] = rb_reg_nth_match(i, m); + } + + set_hash("hour", str2num(s[1])); + set_hash("min", str2num(s[2])); + if (!NIL_P(s[3])) + set_hash("sec", str2num(s[3])); + if (!NIL_P(s[4])) + set_hash("sec_fraction", sec_fraction(s[4])); + if (!NIL_P(s[5])) { + set_hash("zone", s[5]); + set_hash("offset", date_zone_to_diff(s[5])); + } + + return 1; +} + +static int +xmlschema_time(VALUE str, VALUE hash) +{ + static const char pat_source[] = + "\\A\\s*(\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?" + "(z|[-+]\\d{2}:\\d{2})?\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + MATCH(str, pat, xmlschema_time_cb); +} + +#undef SNUM +#define SNUM 4 + +static int +xmlschema_trunc_cb(VALUE m, VALUE hash) +{ + VALUE s[SNUM + 1]; + + { + int i; + s[0] = Qnil; + for (i = 1; i <= SNUM; i++) + s[i] = rb_reg_nth_match(i, m); + } + + if (!NIL_P(s[1])) + set_hash("mon", str2num(s[1])); + if (!NIL_P(s[2])) + set_hash("mday", str2num(s[2])); + if (!NIL_P(s[3])) + set_hash("mday", str2num(s[3])); + if (!NIL_P(s[4])) { + set_hash("zone", s[4]); + set_hash("offset", date_zone_to_diff(s[4])); + } + + return 1; +} + +static int +xmlschema_trunc(VALUE str, VALUE hash) +{ + static const char pat_source[] = + "\\A\\s*(?:--(\\d{2})(?:-(\\d{2}))?|---(\\d{2}))" + "(z|[-+]\\d{2}:\\d{2})?\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + MATCH(str, pat, xmlschema_trunc_cb); +} + +VALUE +date__xmlschema(VALUE str) +{ + VALUE backref, hash; + + backref = rb_backref_get(); + rb_match_busy(backref); + + hash = rb_hash_new(); + + if (xmlschema_datetime(str, hash)) + goto ok; + if (xmlschema_time(str, hash)) + goto ok; + if (xmlschema_trunc(str, hash)) + goto ok; + + ok: + rb_backref_set(backref); + + return hash; +} + +#undef SNUM +#define SNUM 8 + +static int +rfc2822_cb(VALUE m, VALUE hash) +{ + VALUE s[SNUM + 1], y; + + { + int i; + s[0] = Qnil; + for (i = 1; i <= SNUM; i++) + s[i] = rb_reg_nth_match(i, m); + } + + if (!NIL_P(s[1])) { + set_hash("wday", INT2FIX(day_num(s[1]))); + } + set_hash("mday", str2num(s[2])); + set_hash("mon", INT2FIX(mon_num(s[3]))); + y = str2num(s[4]); + if (RSTRING_LEN(s[4]) < 4) + y = comp_year50(y); + set_hash("year", y); + set_hash("hour", str2num(s[5])); + set_hash("min", str2num(s[6])); + if (!NIL_P(s[7])) + set_hash("sec", str2num(s[7])); + set_hash("zone", s[8]); + set_hash("offset", date_zone_to_diff(s[8])); + + return 1; +} + +static int +rfc2822(VALUE str, VALUE hash) +{ + static const char pat_source[] = + "\\A\\s*(?:(" ABBR_DAYS ")\\s*,\\s+)?" + "(\\d{1,2})\\s+" + "(" ABBR_MONTHS ")\\s+" + "(-?\\d{2,})\\s+" + "(\\d{2}):(\\d{2})(?::(\\d{2}))?\\s*" + "([-+]\\d{4}|ut|gmt|e[sd]t|c[sd]t|m[sd]t|p[sd]t|[a-ik-z])\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + MATCH(str, pat, rfc2822_cb); +} + +VALUE +date__rfc2822(VALUE str) +{ + VALUE backref, hash; + + backref = rb_backref_get(); + rb_match_busy(backref); + + hash = rb_hash_new(); + rfc2822(str, hash); + rb_backref_set(backref); + return hash; +} + +#undef SNUM +#define SNUM 8 + +static int +httpdate_type1_cb(VALUE m, VALUE hash) +{ + VALUE s[SNUM + 1]; + + { + int i; + s[0] = Qnil; + for (i = 1; i <= SNUM; i++) + s[i] = rb_reg_nth_match(i, m); + } + + set_hash("wday", INT2FIX(day_num(s[1]))); + set_hash("mday", str2num(s[2])); + set_hash("mon", INT2FIX(mon_num(s[3]))); + set_hash("year", str2num(s[4])); + set_hash("hour", str2num(s[5])); + set_hash("min", str2num(s[6])); + set_hash("sec", str2num(s[7])); + set_hash("zone", s[8]); + set_hash("offset", INT2FIX(0)); + + return 1; +} + +static int +httpdate_type1(VALUE str, VALUE hash) +{ + static const char pat_source[] = + "\\A\\s*(" ABBR_DAYS ")\\s*,\\s+" + "(\\d{2})\\s+" + "(" ABBR_MONTHS ")\\s+" + "(-?\\d{4})\\s+" + "(\\d{2}):(\\d{2}):(\\d{2})\\s+" + "(gmt)\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + MATCH(str, pat, httpdate_type1_cb); +} + +#undef SNUM +#define SNUM 8 + +static int +httpdate_type2_cb(VALUE m, VALUE hash) +{ + VALUE s[SNUM + 1], y; + + { + int i; + s[0] = Qnil; + for (i = 1; i <= SNUM; i++) + s[i] = rb_reg_nth_match(i, m); + } + + set_hash("wday", INT2FIX(day_num(s[1]))); + set_hash("mday", str2num(s[2])); + set_hash("mon", INT2FIX(mon_num(s[3]))); + y = str2num(s[4]); + if (f_ge_p(y, INT2FIX(0)) && f_le_p(y, INT2FIX(99))) + y = comp_year69(y); + set_hash("year", y); + set_hash("hour", str2num(s[5])); + set_hash("min", str2num(s[6])); + set_hash("sec", str2num(s[7])); + set_hash("zone", s[8]); + set_hash("offset", INT2FIX(0)); + + return 1; +} + +static int +httpdate_type2(VALUE str, VALUE hash) +{ + static const char pat_source[] = + "\\A\\s*(" DAYS ")\\s*,\\s+" + "(\\d{2})\\s*-\\s*" + "(" ABBR_MONTHS ")\\s*-\\s*" + "(\\d{2})\\s+" + "(\\d{2}):(\\d{2}):(\\d{2})\\s+" + "(gmt)\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + MATCH(str, pat, httpdate_type2_cb); +} + +#undef SNUM +#define SNUM 7 + +static int +httpdate_type3_cb(VALUE m, VALUE hash) +{ + VALUE s[SNUM + 1]; + + { + int i; + s[0] = Qnil; + for (i = 1; i <= SNUM; i++) + s[i] = rb_reg_nth_match(i, m); + } + + set_hash("wday", INT2FIX(day_num(s[1]))); + set_hash("mon", INT2FIX(mon_num(s[2]))); + set_hash("mday", str2num(s[3])); + set_hash("hour", str2num(s[4])); + set_hash("min", str2num(s[5])); + set_hash("sec", str2num(s[6])); + set_hash("year", str2num(s[7])); + + return 1; +} + +static int +httpdate_type3(VALUE str, VALUE hash) +{ + static const char pat_source[] = + "\\A\\s*(" ABBR_DAYS ")\\s+" + "(" ABBR_MONTHS ")\\s+" + "(\\d{1,2})\\s+" + "(\\d{2}):(\\d{2}):(\\d{2})\\s+" + "(\\d{4})\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + MATCH(str, pat, httpdate_type3_cb); +} + +VALUE +date__httpdate(VALUE str) +{ + VALUE backref, hash; + + backref = rb_backref_get(); + rb_match_busy(backref); + + hash = rb_hash_new(); + + if (httpdate_type1(str, hash)) + goto ok; + if (httpdate_type2(str, hash)) + goto ok; + if (httpdate_type3(str, hash)) + goto ok; + + ok: + rb_backref_set(backref); + + return hash; +} + +#undef SNUM +#define SNUM 9 + +static int +jisx0301_cb(VALUE m, VALUE hash) +{ + VALUE s[SNUM + 1]; + int ep; + + { + int i; + s[0] = Qnil; + for (i = 1; i <= SNUM; i++) + s[i] = rb_reg_nth_match(i, m); + } + + ep = gengo(NIL_P(s[1]) ? JISX0301_DEFAULT_ERA : *RSTRING_PTR(s[1])); + set_hash("year", f_add(str2num(s[2]), INT2FIX(ep))); + set_hash("mon", str2num(s[3])); + set_hash("mday", str2num(s[4])); + if (!NIL_P(s[5])) { + set_hash("hour", str2num(s[5])); + if (!NIL_P(s[6])) + set_hash("min", str2num(s[6])); + if (!NIL_P(s[7])) + set_hash("sec", str2num(s[7])); + } + if (!NIL_P(s[8])) + set_hash("sec_fraction", sec_fraction(s[8])); + if (!NIL_P(s[9])) { + set_hash("zone", s[9]); + set_hash("offset", date_zone_to_diff(s[9])); + } + + return 1; +} + +static int +jisx0301(VALUE str, VALUE hash) +{ + static const char pat_source[] = + "\\A\\s*([" JISX0301_ERA_INITIALS "])?(\\d{2})\\.(\\d{2})\\.(\\d{2})" + "(?:t" + "(?:(\\d{2}):(\\d{2})(?::(\\d{2})(?:[,.](\\d*))?)?" + "(z|[-+]\\d{2}(?::?\\d{2})?)?)?)?\\s*\\z"; + static VALUE pat = Qnil; + + REGCOMP_I(pat); + MATCH(str, pat, jisx0301_cb); +} + +VALUE +date__jisx0301(VALUE str) +{ + VALUE backref, hash; + + backref = rb_backref_get(); + rb_match_busy(backref); + + hash = rb_hash_new(); + if (jisx0301(str, hash)) + goto ok; + hash = date__iso8601(str); + + ok: + rb_backref_set(backref); + return hash; +} + +/* +Local variables: +c-file-style: "ruby" +End: +*/ diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_strftime.c b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_strftime.c new file mode 100644 index 0000000..d7f2898 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_strftime.c @@ -0,0 +1,638 @@ +/* + date_strftime.c: based on a public-domain implementation of ANSI C + library routine strftime, which is originally written by Arnold + Robbins. + */ + +#include "ruby/ruby.h" +#include "date_tmx.h" + +#include +#include +#include +#include + +#if defined(HAVE_SYS_TIME_H) +#include +#endif + +#undef strchr /* avoid AIX weirdness */ + +#define range(low, item, hi) (item) + +#define add(x,y) (rb_funcall((x), '+', 1, (y))) +#define sub(x,y) (rb_funcall((x), '-', 1, (y))) +#define mul(x,y) (rb_funcall((x), '*', 1, (y))) +#define quo(x,y) (rb_funcall((x), rb_intern("quo"), 1, (y))) +#define div(x,y) (rb_funcall((x), rb_intern("div"), 1, (y))) +#define mod(x,y) (rb_funcall((x), '%', 1, (y))) + +static void +upcase(char *s, size_t i) +{ + do { + if (ISLOWER(*s)) + *s = TOUPPER(*s); + } while (s++, --i); +} + +static void +downcase(char *s, size_t i) +{ + do { + if (ISUPPER(*s)) + *s = TOLOWER(*s); + } while (s++, --i); +} + +/* strftime --- produce formatted time */ + +static size_t +date_strftime_with_tmx(char *s, const size_t maxsize, const char *format, + const struct tmx *tmx) +{ + char *endp = s + maxsize; + char *start = s; + const char *sp, *tp; + auto char tbuf[100]; + ptrdiff_t i; + int v, w; + size_t colons; + int precision, flags; + char padding; + /* LOCALE_[OE] and COLONS are actually modifiers, not flags */ + enum {LEFT, CHCASE, LOWER, UPPER, LOCALE_O, LOCALE_E, COLONS}; +#define BIT_OF(n) (1U<<(n)) + + /* various tables for locale C */ + static const char days_l[][10] = { + "Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday", + }; + static const char months_l[][10] = { + "January", "February", "March", "April", + "May", "June", "July", "August", "September", + "October", "November", "December", + }; + static const char ampm[][3] = { "AM", "PM", }; + + if (s == NULL || format == NULL || tmx == NULL || maxsize == 0) + return 0; + + /* quick check if we even need to bother */ + if (strchr(format, '%') == NULL && strlen(format) + 1 >= maxsize) { + err: + errno = ERANGE; + return 0; + } + + for (; *format && s < endp - 1; format++) { +#define FLAG_FOUND() do { \ + if (precision > 0 || flags & (BIT_OF(LOCALE_E) | BIT_OF(LOCALE_O) | BIT_OF(COLONS))) \ + goto unknown; \ + } while (0) +#define NEEDS(n) do if (s >= endp || (n) >= endp - s - 1) goto err; while (0) +#define FILL_PADDING(i) do { \ + if (!(flags & BIT_OF(LEFT)) && precision > (i)) { \ + NEEDS(precision); \ + memset(s, padding ? padding : ' ', precision - (i)); \ + s += precision - (i); \ + } \ + else { \ + NEEDS(i); \ + } \ + } while (0); +#define FMT(def_pad, def_prec, fmt, val) \ + do { \ + int l; \ + if (precision <= 0) precision = (def_prec); \ + if (flags & BIT_OF(LEFT)) precision = 1; \ + l = snprintf(s, endp - s, \ + ((padding == '0' || (!padding && (def_pad) == '0')) ? \ + "%0*"fmt : "%*"fmt), \ + precision, (val)); \ + if (l < 0) goto err; \ + s += l; \ + } while (0) +#define STRFTIME(fmt) \ + do { \ + i = date_strftime_with_tmx(s, endp - s, (fmt), tmx); \ + if (!i) return 0; \ + if (flags & BIT_OF(UPPER)) \ + upcase(s, i); \ + if (!(flags & BIT_OF(LEFT)) && precision > i) { \ + if (start + maxsize < s + precision) { \ + errno = ERANGE; \ + return 0; \ + } \ + memmove(s + precision - i, s, i); \ + memset(s, padding ? padding : ' ', precision - i); \ + s += precision; \ + } \ + else s += i; \ + } while (0) +#define FMTV(def_pad, def_prec, fmt, val) \ + do { \ + VALUE tmp = (val); \ + if (FIXNUM_P(tmp)) { \ + FMT((def_pad), (def_prec), "l"fmt, FIX2LONG(tmp)); \ + } \ + else { \ + VALUE args[2], result; \ + size_t l; \ + if (precision <= 0) precision = (def_prec); \ + if (flags & BIT_OF(LEFT)) precision = 1; \ + args[0] = INT2FIX(precision); \ + args[1] = (val); \ + if (padding == '0' || (!padding && (def_pad) == '0')) \ + result = rb_str_format(2, args, rb_str_new2("%0*"fmt)); \ + else \ + result = rb_str_format(2, args, rb_str_new2("%*"fmt)); \ + l = strlcpy(s, StringValueCStr(result), endp - s); \ + if ((size_t)(endp - s) <= l) \ + goto err; \ + s += l; \ + } \ + } while (0) + + if (*format != '%') { + *s++ = *format; + continue; + } + tp = tbuf; + sp = format; + precision = -1; + flags = 0; + padding = 0; + colons = 0; + again: + switch (*++format) { + case '\0': + format--; + goto unknown; + + case 'A': /* full weekday name */ + case 'a': /* abbreviated weekday name */ + if (flags & BIT_OF(CHCASE)) { + flags &= ~(BIT_OF(LOWER) | BIT_OF(CHCASE)); + flags |= BIT_OF(UPPER); + } + { + int wday = tmx_wday; + if (wday < 0 || wday > 6) + i = 1, tp = "?"; + else { + if (*format == 'A') + i = strlen(tp = days_l[wday]); + else + i = 3, tp = days_l[wday]; + } + } + break; + + case 'B': /* full month name */ + case 'b': /* abbreviated month name */ + case 'h': /* same as %b */ + if (flags & BIT_OF(CHCASE)) { + flags &= ~(BIT_OF(LOWER) | BIT_OF(CHCASE)); + flags |= BIT_OF(UPPER); + } + { + int mon = tmx_mon; + if (mon < 1 || mon > 12) + i = 1, tp = "?"; + else { + if (*format == 'B') + i = strlen(tp = months_l[mon - 1]); + else + i = 3, tp = months_l[mon - 1]; + } + } + break; + + case 'C': /* century (year/100) */ + FMTV('0', 2, "d", div(tmx_year, INT2FIX(100))); + continue; + + case 'c': /* appropriate date and time representation */ + STRFTIME("%a %b %e %H:%M:%S %Y"); + continue; + + case 'D': + STRFTIME("%m/%d/%y"); + continue; + + case 'd': /* day of the month, 01 - 31 */ + case 'e': /* day of month, blank padded */ + v = range(1, tmx_mday, 31); + FMT((*format == 'd') ? '0' : ' ', 2, "d", v); + continue; + + case 'F': + STRFTIME("%Y-%m-%d"); + continue; + + case 'G': /* year of ISO week with century */ + case 'Y': /* year with century */ + { + VALUE year = (*format == 'G') ? tmx_cwyear : tmx_year; + if (FIXNUM_P(year)) { + long y = FIX2LONG(year); + FMT('0', 0 <= y ? 4 : 5, "ld", y); + } + else { + FMTV('0', 4, "d", year); + } + } + continue; + + case 'g': /* year of ISO week without a century */ + case 'y': /* year without a century */ + v = NUM2INT(mod((*format == 'g') ? tmx_cwyear : tmx_year, INT2FIX(100))); + FMT('0', 2, "d", v); + continue; + + case 'H': /* hour, 24-hour clock, 00 - 23 */ + case 'k': /* hour, 24-hour clock, blank pad */ + v = range(0, tmx_hour, 23); + FMT((*format == 'H') ? '0' : ' ', 2, "d", v); + continue; + + case 'I': /* hour, 12-hour clock, 01 - 12 */ + case 'l': /* hour, 12-hour clock, 1 - 12, blank pad */ + v = range(0, tmx_hour, 23); + if (v == 0) + v = 12; + else if (v > 12) + v -= 12; + FMT((*format == 'I') ? '0' : ' ', 2, "d", v); + continue; + + case 'j': /* day of the year, 001 - 366 */ + v = range(1, tmx_yday, 366); + FMT('0', 3, "d", v); + continue; + + case 'L': /* millisecond */ + case 'N': /* nanosecond */ + if (*format == 'L') + w = 3; + else + w = 9; + if (precision <= 0) + precision = w; + NEEDS(precision); + + { + VALUE subsec = tmx_sec_fraction; + int ww; + long n; + + ww = precision; + while (9 <= ww) { + subsec = mul(subsec, INT2FIX(1000000000)); + ww -= 9; + } + n = 1; + for (; 0 < ww; ww--) + n *= 10; + if (n != 1) + subsec = mul(subsec, INT2FIX(n)); + subsec = div(subsec, INT2FIX(1)); + + if (FIXNUM_P(subsec)) { + (void)snprintf(s, endp - s, "%0*ld", + precision, FIX2LONG(subsec)); + s += precision; + } + else { + VALUE args[2], result; + args[0] = INT2FIX(precision); + args[1] = subsec; + result = rb_str_format(2, args, rb_str_new2("%0*d")); + (void)strlcpy(s, StringValueCStr(result), endp - s); + s += precision; + } + } + continue; + + case 'M': /* minute, 00 - 59 */ + v = range(0, tmx_min, 59); + FMT('0', 2, "d", v); + continue; + + case 'm': /* month, 01 - 12 */ + v = range(1, tmx_mon, 12); + FMT('0', 2, "d", v); + continue; + + case 'n': /* same as \n */ + FILL_PADDING(1); + *s++ = '\n'; + continue; + + case 't': /* same as \t */ + FILL_PADDING(1); + *s++ = '\t'; + continue; + + case 'P': /* am or pm based on 12-hour clock */ + case 'p': /* AM or PM based on 12-hour clock */ + if ((*format == 'p' && (flags & BIT_OF(CHCASE))) || + (*format == 'P' && !(flags & (BIT_OF(CHCASE) | BIT_OF(UPPER))))) { + flags &= ~(BIT_OF(UPPER) | BIT_OF(CHCASE)); + flags |= BIT_OF(LOWER); + } + v = range(0, tmx_hour, 23); + if (v < 12) + tp = ampm[0]; + else + tp = ampm[1]; + i = 2; + break; + + case 'Q': /* milliseconds since Unix epoch */ + FMTV('0', 1, "d", tmx_msecs); + continue; + + case 'R': + STRFTIME("%H:%M"); + continue; + + case 'r': + STRFTIME("%I:%M:%S %p"); + continue; + + case 'S': /* second, 00 - 59 */ + v = range(0, tmx_sec, 59); + FMT('0', 2, "d", v); + continue; + + case 's': /* seconds since Unix epoch */ + FMTV('0', 1, "d", tmx_secs); + continue; + + case 'T': + STRFTIME("%H:%M:%S"); + continue; + + case 'U': /* week of year, Sunday is first day of week */ + case 'W': /* week of year, Monday is first day of week */ + v = range(0, (*format == 'U') ? tmx_wnum0 : tmx_wnum1, 53); + FMT('0', 2, "d", v); + continue; + + case 'u': /* weekday, Monday == 1, 1 - 7 */ + v = range(1, tmx_cwday, 7); + FMT('0', 1, "d", v); + continue; + + case 'V': /* week of year according ISO 8601 */ + v = range(1, tmx_cweek, 53); + FMT('0', 2, "d", v); + continue; + + case 'v': + STRFTIME("%e-%^b-%Y"); + continue; + + case 'w': /* weekday, Sunday == 0, 0 - 6 */ + v = range(0, tmx_wday, 6); + FMT('0', 1, "d", v); + continue; + + case 'X': /* appropriate time representation */ + STRFTIME("%H:%M:%S"); + continue; + + case 'x': /* appropriate date representation */ + STRFTIME("%m/%d/%y"); + continue; + + case 'Z': /* time zone name or abbreviation */ + if (flags & BIT_OF(CHCASE)) { + flags &= ~(BIT_OF(UPPER) | BIT_OF(CHCASE)); + flags |= BIT_OF(LOWER); + } + { + char *zone = tmx_zone; + if (zone == NULL) + tp = ""; + else + tp = zone; + i = strlen(tp); + } + break; + + case 'z': /* offset from UTC */ + { + long off, aoff; + int hl, hw; + + off = tmx_offset; + aoff = off; + if (aoff < 0) + aoff = -off; + + if ((aoff / 3600) < 10) + hl = 1; + else + hl = 2; + hw = 2; + if (flags & BIT_OF(LEFT) && hl == 1) + hw = 1; + + switch (colons) { + case 0: /* %z -> +hhmm */ + precision = precision <= (3 + hw) ? hw : precision - 3; + NEEDS(precision + 3); + break; + + case 1: /* %:z -> +hh:mm */ + precision = precision <= (4 + hw) ? hw : precision - 4; + NEEDS(precision + 4); + break; + + case 2: /* %::z -> +hh:mm:ss */ + precision = precision <= (7 + hw) ? hw : precision - 7; + NEEDS(precision + 7); + break; + + case 3: /* %:::z -> +hh[:mm[:ss]] */ + { + if (aoff % 3600 == 0) { + precision = precision <= (1 + hw) ? + hw : precision - 1; + NEEDS(precision + 3); + } + else if (aoff % 60 == 0) { + precision = precision <= (4 + hw) ? + hw : precision - 4; + NEEDS(precision + 4); + } + else { + precision = precision <= (7 + hw) ? + hw : precision - 7; + NEEDS(precision + 7); + } + } + break; + + default: + format--; + goto unknown; + } + if (padding == ' ' && precision > hl) { + i = snprintf(s, endp - s, "%*s", precision - hl, ""); + precision = hl; + if (i < 0) goto err; + s += i; + } + if (off < 0) { + off = -off; + *s++ = '-'; + } else { + *s++ = '+'; + } + i = snprintf(s, endp - s, "%.*ld", precision, off / 3600); + if (i < 0) goto err; + s += i; + off = off % 3600; + if (colons == 3 && off == 0) + continue; + if (1 <= colons) + *s++ = ':'; + i = snprintf(s, endp - s, "%02d", (int)(off / 60)); + if (i < 0) goto err; + s += i; + off = off % 60; + if (colons == 3 && off == 0) + continue; + if (2 <= colons) { + *s++ = ':'; + i = snprintf(s, endp - s, "%02d", (int)off); + if (i < 0) goto err; + s += i; + } + } + continue; + + case '+': + STRFTIME("%a %b %e %H:%M:%S %Z %Y"); + continue; + + case 'E': + /* POSIX locale extensions, ignored for now */ + flags |= BIT_OF(LOCALE_E); + if (*(format + 1) && strchr("cCxXyY", *(format + 1))) + goto again; + goto unknown; + case 'O': + /* POSIX locale extensions, ignored for now */ + flags |= BIT_OF(LOCALE_O); + if (*(format + 1) && strchr("deHkIlmMSuUVwWy", *(format + 1))) + goto again; + goto unknown; + + case ':': + flags |= BIT_OF(COLONS); + { + size_t l = strspn(format, ":"); + format += l; + if (*format == 'z') { + colons = l; + format--; + goto again; + } + format -= l; + } + goto unknown; + + case '_': + FLAG_FOUND(); + padding = ' '; + goto again; + + case '-': + FLAG_FOUND(); + flags |= BIT_OF(LEFT); + goto again; + + case '^': + FLAG_FOUND(); + flags |= BIT_OF(UPPER); + goto again; + + case '#': + FLAG_FOUND(); + flags |= BIT_OF(CHCASE); + goto again; + + case '0': + FLAG_FOUND(); + padding = '0'; + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + { + char *e; + unsigned long prec = strtoul(format, &e, 10); + if (prec > INT_MAX || prec > maxsize) { + errno = ERANGE; + return 0; + } + precision = (int)prec; + format = e - 1; + goto again; + } + + case '%': + FILL_PADDING(1); + *s++ = '%'; + continue; + + default: + unknown: + i = format - sp + 1; + tp = sp; + precision = -1; + flags = 0; + padding = 0; + colons = 0; + break; + } + if (i) { + FILL_PADDING(i); + memcpy(s, tp, i); + switch (flags & (BIT_OF(UPPER) | BIT_OF(LOWER))) { + case BIT_OF(UPPER): + upcase(s, i); + break; + case BIT_OF(LOWER): + downcase(s, i); + break; + } + s += i; + } + } + if (s >= endp) { + goto err; + } + if (*format == '\0') { + *s = '\0'; + return (s - start); + } + return 0; +} + +size_t +date_strftime(char *s, size_t maxsize, const char *format, + const struct tmx *tmx) +{ + return date_strftime_with_tmx(s, maxsize, format, tmx); +} + +/* +Local variables: +c-file-style: "ruby" +End: +*/ diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_strptime.c b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_strptime.c new file mode 100644 index 0000000..da58c21 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_strptime.c @@ -0,0 +1,703 @@ +/* + date_strptime.c: Coded by Tadayoshi Funaba 2011,2012 +*/ + +#include "ruby.h" +#include "ruby/encoding.h" +#include "ruby/re.h" +#include + +#undef strncasecmp +#define strncasecmp STRNCASECMP + +static const char *day_names[] = { + "Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday", +}; +static const int ABBREVIATED_DAY_NAME_LENGTH = 3; + +static const char *month_names[] = { + "January", "February", "March", "April", + "May", "June", "July", "August", "September", + "October", "November", "December", +}; +static const int ABBREVIATED_MONTH_NAME_LENGTH = 3; + +#define sizeof_array(o) (sizeof o / sizeof o[0]) + +#define f_negate(x) rb_funcall(x, rb_intern("-@"), 0) +#define f_add(x,y) rb_funcall(x, '+', 1, y) +#define f_sub(x,y) rb_funcall(x, '-', 1, y) +#define f_mul(x,y) rb_funcall(x, '*', 1, y) +#define f_div(x,y) rb_funcall(x, '/', 1, y) +#define f_idiv(x,y) rb_funcall(x, rb_intern("div"), 1, y) +#define f_mod(x,y) rb_funcall(x, '%', 1, y) +#define f_expt(x,y) rb_funcall(x, rb_intern("**"), 1, y) + +#define f_lt_p(x,y) rb_funcall(x, '<', 1, y) +#define f_gt_p(x,y) rb_funcall(x, '>', 1, y) +#define f_le_p(x,y) rb_funcall(x, rb_intern("<="), 1, y) +#define f_ge_p(x,y) rb_funcall(x, rb_intern(">="), 1, y) + +#define f_match(r,s) rb_funcall(r, rb_intern("match"), 1, s) +#define f_aref(o,i) rb_funcall(o, rb_intern("[]"), 1, i) +#define f_end(o,i) rb_funcall(o, rb_intern("end"), 1, i) + +#define issign(c) ((c) == '-' || (c) == '+') + +static int +num_pattern_p(const char *s) +{ + if (isdigit((unsigned char)*s)) + return 1; + if (*s == '%') { + s++; + if (*s == 'E' || *s == 'O') + s++; + if (*s && + (strchr("CDdeFGgHIjkLlMmNQRrSsTUuVvWwXxYy", *s) || + isdigit((unsigned char)*s))) + return 1; + } + return 0; +} + +#define NUM_PATTERN_P() num_pattern_p(&fmt[fi + 1]) + +static long +read_digits(const char *s, size_t slen, VALUE *n, size_t width) +{ + size_t l; + + if (!width) + return 0; + + l = 0; + while (l < slen && ISDIGIT(s[l])) { + if (++l == width) break; + } + + if (l == 0) + return 0; + + if ((4 * l * sizeof(char)) <= (sizeof(long)*CHAR_BIT)) { + const char *os = s; + long v; + + v = 0; + while ((size_t)(s - os) < l) { + v *= 10; + v += *s - '0'; + s++; + } + if (os == s) + return 0; + *n = LONG2NUM(v); + return l; + } + else { + VALUE vbuf = 0; + char *s2 = ALLOCV_N(char, vbuf, l + 1); + memcpy(s2, s, l); + s2[l] = '\0'; + *n = rb_cstr_to_inum(s2, 10, 0); + ALLOCV_END(vbuf); + return l; + } +} + +#define set_hash(k,v) rb_hash_aset(hash, ID2SYM(rb_intern(k"")), v) +#define ref_hash(k) rb_hash_aref(hash, ID2SYM(rb_intern(k""))) +#define del_hash(k) rb_hash_delete(hash, ID2SYM(rb_intern(k""))) + +#define fail() \ +do { \ + set_hash("_fail", Qtrue); \ + return 0; \ +} while (0) + +#define fail_p() (!NIL_P(ref_hash("_fail"))) + +#define READ_DIGITS(n,w) \ +do { \ + size_t l; \ + l = read_digits(&str[si], slen - si, &n, w); \ + if (l == 0) \ + fail(); \ + si += l; \ +} while (0) + +#define READ_DIGITS_MAX(n) READ_DIGITS(n, LONG_MAX) + +static int +valid_range_p(VALUE v, int a, int b) +{ + if (FIXNUM_P(v)) { + int vi = FIX2INT(v); + return !(vi < a || vi > b); + } + return !(f_lt_p(v, INT2NUM(a)) || f_gt_p(v, INT2NUM(b))); +} + +#define recur(fmt) \ +do { \ + size_t l; \ + l = date__strptime_internal(&str[si], slen - si, \ + fmt, sizeof fmt - 1, hash); \ + if (fail_p()) \ + return 0; \ + si += l; \ +} while (0) + +VALUE date_zone_to_diff(VALUE); + +static inline int +head_match_p(size_t len, const char *name, const char *str, size_t slen, size_t si) +{ + return slen - si >= len && strncasecmp(name, &str[si], len) == 0; +} + +static size_t +date__strptime_internal(const char *str, size_t slen, + const char *fmt, size_t flen, VALUE hash) +{ + size_t si, fi; + int c; + +#define HEAD_MATCH_P(len, name) head_match_p(len, name, str, slen, si) + si = fi = 0; + + while (fi < flen) { + if (isspace((unsigned char)fmt[fi])) { + while (si < slen && isspace((unsigned char)str[si])) + si++; + while (++fi < flen && isspace((unsigned char)fmt[fi])); + continue; + } + + if (si >= slen) fail(); + + switch (fmt[fi]) { + case '%': + + again: + fi++; + c = fmt[fi]; + + switch (c) { + case 'E': + if (fmt[fi + 1] && strchr("cCxXyY", fmt[fi + 1])) + goto again; + fi--; + goto ordinal; + case 'O': + if (fmt[fi + 1] && strchr("deHImMSuUVwWy", fmt[fi + 1])) + goto again; + fi--; + goto ordinal; + case ':': + { + int i; + + for (i = 1; i < 3 && fi + i < flen && fmt[fi+i] == ':'; ++i); + if (fmt[fi+i] == 'z') { + fi += i - 1; + goto again; + } + fail(); + } + + case 'A': + case 'a': + { + int i; + + for (i = 0; i < (int)sizeof_array(day_names); i++) { + const char *day_name = day_names[i]; + size_t l = strlen(day_name); + if (HEAD_MATCH_P(l, day_name) || + HEAD_MATCH_P(l = ABBREVIATED_DAY_NAME_LENGTH, day_name)) { + si += l; + set_hash("wday", INT2FIX(i)); + goto matched; + } + } + fail(); + } + case 'B': + case 'b': + case 'h': + { + int i; + + for (i = 0; i < (int)sizeof_array(month_names); i++) { + const char *month_name = month_names[i]; + size_t l = strlen(month_name); + if (HEAD_MATCH_P(l, month_name) || + HEAD_MATCH_P(l = ABBREVIATED_MONTH_NAME_LENGTH, month_name)) { + si += l; + set_hash("mon", INT2FIX(i + 1)); + goto matched; + } + } + fail(); + } + + case 'C': + { + VALUE n; + + if (NUM_PATTERN_P()) + READ_DIGITS(n, 2); + else + READ_DIGITS_MAX(n); + set_hash("_cent", n); + goto matched; + } + + case 'c': + recur("%a %b %e %H:%M:%S %Y"); + goto matched; + + case 'D': + recur("%m/%d/%y"); + goto matched; + + case 'd': + case 'e': + { + VALUE n; + + if (str[si] == ' ') { + si++; + READ_DIGITS(n, 1); + } else { + READ_DIGITS(n, 2); + } + if (!valid_range_p(n, 1, 31)) + fail(); + set_hash("mday", n); + goto matched; + } + + case 'F': + recur("%Y-%m-%d"); + goto matched; + + case 'G': + { + VALUE n; + + if (NUM_PATTERN_P()) + READ_DIGITS(n, 4); + else + READ_DIGITS_MAX(n); + set_hash("cwyear", n); + goto matched; + } + + case 'g': + { + VALUE n; + + READ_DIGITS(n, 2); + if (!valid_range_p(n, 0, 99)) + fail(); + set_hash("cwyear",n); + if (NIL_P(ref_hash("_cent"))) + set_hash("_cent", + INT2FIX(f_ge_p(n, INT2FIX(69)) ? 19 : 20)); + goto matched; + } + + case 'H': + case 'k': + { + VALUE n; + + if (str[si] == ' ') { + si++; + READ_DIGITS(n, 1); + } else { + READ_DIGITS(n, 2); + } + if (!valid_range_p(n, 0, 24)) + fail(); + set_hash("hour", n); + goto matched; + } + + case 'I': + case 'l': + { + VALUE n; + + if (str[si] == ' ') { + si++; + READ_DIGITS(n, 1); + } else { + READ_DIGITS(n, 2); + } + if (!valid_range_p(n, 1, 12)) + fail(); + set_hash("hour", n); + goto matched; + } + + case 'j': + { + VALUE n; + + READ_DIGITS(n, 3); + if (!valid_range_p(n, 1, 366)) + fail(); + set_hash("yday", n); + goto matched; + } + + case 'L': + case 'N': + { + VALUE n; + int sign = 1; + size_t osi; + + if (issign(str[si])) { + if (str[si] == '-') + sign = -1; + si++; + } + osi = si; + if (NUM_PATTERN_P()) + READ_DIGITS(n, c == 'L' ? 3 : 9); + else + READ_DIGITS_MAX(n); + if (sign == -1) + n = f_negate(n); + set_hash("sec_fraction", + rb_rational_new2(n, + f_expt(INT2FIX(10), + ULONG2NUM(si - osi)))); + goto matched; + } + + case 'M': + { + VALUE n; + + READ_DIGITS(n, 2); + if (!valid_range_p(n, 0, 59)) + fail(); + set_hash("min", n); + goto matched; + } + + case 'm': + { + VALUE n; + + READ_DIGITS(n, 2); + if (!valid_range_p(n, 1, 12)) + fail(); + set_hash("mon", n); + goto matched; + } + + case 'n': + case 't': + recur(" "); + goto matched; + + case 'P': + case 'p': + if (slen - si < 2) fail(); + { + char c = str[si]; + const int hour = (c == 'P' || c == 'p') ? 12 : 0; + if (!hour && !(c == 'A' || c == 'a')) fail(); + if ((c = str[si+1]) == '.') { + if (slen - si < 4 || str[si+3] != '.') fail(); + c = str[si += 2]; + } + if (!(c == 'M' || c == 'm')) fail(); + si += 2; + set_hash("_merid", INT2FIX(hour)); + goto matched; + } + + case 'Q': + { + VALUE n; + int sign = 1; + + if (str[si] == '-') { + sign = -1; + si++; + } + READ_DIGITS_MAX(n); + if (sign == -1) + n = f_negate(n); + set_hash("seconds", + rb_rational_new2(n, INT2FIX(1000))); + goto matched; + } + + case 'R': + recur("%H:%M"); + goto matched; + + case 'r': + recur("%I:%M:%S %p"); + goto matched; + + case 'S': + { + VALUE n; + + READ_DIGITS(n, 2); + if (!valid_range_p(n, 0, 60)) + fail(); + set_hash("sec", n); + goto matched; + } + + case 's': + { + VALUE n; + int sign = 1; + + if (str[si] == '-') { + sign = -1; + si++; + } + READ_DIGITS_MAX(n); + if (sign == -1) + n = f_negate(n); + set_hash("seconds", n); + goto matched; + } + + case 'T': + recur("%H:%M:%S"); + goto matched; + + case 'U': + case 'W': + { + VALUE n; + + READ_DIGITS(n, 2); + if (!valid_range_p(n, 0, 53)) + fail(); + set_hash(c == 'U' ? "wnum0" : "wnum1", n); + goto matched; + } + + case 'u': + { + VALUE n; + + READ_DIGITS(n, 1); + if (!valid_range_p(n, 1, 7)) + fail(); + set_hash("cwday", n); + goto matched; + } + + case 'V': + { + VALUE n; + + READ_DIGITS(n, 2); + if (!valid_range_p(n, 1, 53)) + fail(); + set_hash("cweek", n); + goto matched; + } + + case 'v': + recur("%e-%b-%Y"); + goto matched; + + case 'w': + { + VALUE n; + + READ_DIGITS(n, 1); + if (!valid_range_p(n, 0, 6)) + fail(); + set_hash("wday", n); + goto matched; + } + + case 'X': + recur("%H:%M:%S"); + goto matched; + + case 'x': + recur("%m/%d/%y"); + goto matched; + + case 'Y': + { + VALUE n; + int sign = 1; + + if (issign(str[si])) { + if (str[si] == '-') + sign = -1; + si++; + } + if (NUM_PATTERN_P()) + READ_DIGITS(n, 4); + else + READ_DIGITS_MAX(n); + if (sign == -1) + n = f_negate(n); + set_hash("year", n); + goto matched; + } + + case 'y': + { + VALUE n; + int sign = 1; + + READ_DIGITS(n, 2); + if (!valid_range_p(n, 0, 99)) + fail(); + if (sign == -1) + n = f_negate(n); + set_hash("year", n); + if (NIL_P(ref_hash("_cent"))) + set_hash("_cent", + INT2FIX(f_ge_p(n, INT2FIX(69)) ? 19 : 20)); + goto matched; + } + + case 'Z': + case 'z': + { + static const char pat_source[] = + "\\A(" + "(?:gmt|utc?)?[-+]\\d+(?:[,.:]\\d+(?::\\d+)?)?" + "|(?-i:[[:alpha:].\\s]+)(?:standard|daylight)\\s+time\\b" + "|(?-i:[[:alpha:]]+)(?:\\s+dst)?\\b" + ")"; + static VALUE pat = Qnil; + VALUE m, b; + + if (NIL_P(pat)) { + pat = rb_reg_new(pat_source, sizeof pat_source - 1, + ONIG_OPTION_IGNORECASE); + rb_obj_freeze(pat); + rb_gc_register_mark_object(pat); + } + + b = rb_backref_get(); + rb_match_busy(b); + m = f_match(pat, rb_usascii_str_new(&str[si], slen - si)); + + if (!NIL_P(m)) { + VALUE s, l, o; + + s = rb_reg_nth_match(1, m); + l = f_end(m, INT2FIX(0)); + o = date_zone_to_diff(s); + si += NUM2LONG(l); + set_hash("zone", s); + set_hash("offset", o); + rb_backref_set(b); + goto matched; + } + rb_backref_set(b); + fail(); + } + + case '%': + if (str[si] != '%') + fail(); + si++; + goto matched; + + case '+': + recur("%a %b %e %H:%M:%S %Z %Y"); + goto matched; + + default: + if (str[si] != '%') + fail(); + si++; + if (fi < flen) { + if (si >= slen || str[si] != fmt[fi]) + fail(); + si++; + } + goto matched; + } + default: + ordinal: + if (str[si] != fmt[fi]) + fail(); + si++; + fi++; + break; + matched: + fi++; + break; + } + } + + return si; +} + +VALUE +date__strptime(const char *str, size_t slen, + const char *fmt, size_t flen, VALUE hash) +{ + size_t si; + VALUE cent, merid; + + si = date__strptime_internal(str, slen, fmt, flen, hash); + + if (slen > si) { + VALUE s; + + s = rb_usascii_str_new(&str[si], slen - si); + set_hash("leftover", s); + } + + if (fail_p()) + return Qnil; + + cent = del_hash("_cent"); + if (!NIL_P(cent)) { + VALUE year; + + year = ref_hash("cwyear"); + if (!NIL_P(year)) + set_hash("cwyear", f_add(year, f_mul(cent, INT2FIX(100)))); + year = ref_hash("year"); + if (!NIL_P(year)) + set_hash("year", f_add(year, f_mul(cent, INT2FIX(100)))); + } + + merid = del_hash("_merid"); + if (!NIL_P(merid)) { + VALUE hour; + + hour = ref_hash("hour"); + if (!NIL_P(hour)) { + hour = f_mod(hour, INT2FIX(12)); + set_hash("hour", f_add(hour, merid)); + } + } + + return hash; +} + +/* +Local variables: +c-file-style: "ruby" +End: +*/ diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_tmx.h b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_tmx.h new file mode 100644 index 0000000..993a153 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/date_tmx.h @@ -0,0 +1,56 @@ +#ifndef DATE_TMX_H +#define DATE_TMX_H + +struct tmx_funcs { + VALUE (*year)(void *dat); + int (*yday)(void *dat); + int (*mon)(void *dat); + int (*mday)(void *dat); + VALUE (*cwyear)(void *dat); + int (*cweek)(void *dat); + int (*cwday)(void *dat); + int (*wnum0)(void *dat); + int (*wnum1)(void *dat); + int (*wday)(void *dat); + int (*hour)(void *dat); + int (*min)(void *dat); + int (*sec)(void *dat); + VALUE (*sec_fraction)(void *dat); + VALUE (*secs)(void *dat); + VALUE (*msecs)(void *dat); + int (*offset)(void *dat); + char *(*zone)(void *dat); +}; +struct tmx { + void *dat; + const struct tmx_funcs *funcs; +}; + +#define tmx_attr(x) (tmx->funcs->x)(tmx->dat) + +#define tmx_year tmx_attr(year) +#define tmx_yday tmx_attr(yday) +#define tmx_mon tmx_attr(mon) +#define tmx_mday tmx_attr(mday) +#define tmx_cwyear tmx_attr(cwyear) +#define tmx_cweek tmx_attr(cweek) +#define tmx_cwday tmx_attr(cwday) +#define tmx_wnum0 tmx_attr(wnum0) +#define tmx_wnum1 tmx_attr(wnum1) +#define tmx_wday tmx_attr(wday) +#define tmx_hour tmx_attr(hour) +#define tmx_min tmx_attr(min) +#define tmx_sec tmx_attr(sec) +#define tmx_sec_fraction tmx_attr(sec_fraction) +#define tmx_secs tmx_attr(secs) +#define tmx_msecs tmx_attr(msecs) +#define tmx_offset tmx_attr(offset) +#define tmx_zone tmx_attr(zone) + +#endif + +/* +Local variables: +c-file-style: "ruby" +End: +*/ diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/extconf.rb b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/extconf.rb new file mode 100644 index 0000000..8a1467d --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/extconf.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +require 'mkmf' + +config_string("strict_warnflags") {|w| $warnflags += " #{w}"} + +append_cflags("-Wno-compound-token-split-by-macro") if RUBY_VERSION < "2.7." +have_func("rb_category_warn") +with_werror("", {:werror => true}) do |opt, | + have_var("timezone", "time.h", opt) + have_var("altzone", "time.h", opt) +end + +create_makefile('date_core') diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/prereq.mk b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/prereq.mk new file mode 100644 index 0000000..b5d271a --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/prereq.mk @@ -0,0 +1,19 @@ +.SUFFIXES: .list + +.list.h: + gperf --ignore-case -L ANSI-C -C -c -P -p -j1 -i 1 -g -o -t -N $(*F) $< \ + | sed -f $(top_srcdir)/tool/gperf.sed \ + > $(@F) + +zonetab.h: zonetab.list + +.PHONY: update-zonetab +update-zonetab: + $(RUBY) -C $(srcdir) update-abbr + +.PHONY: update-nothing +update-nothing: + +update = nothing + +zonetab.list: update-$(update) diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/zonetab.h b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/zonetab.h new file mode 100644 index 0000000..2a2e891 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/zonetab.h @@ -0,0 +1,1564 @@ +/* ANSI-C code produced by gperf version 3.1 */ +/* Command-line: gperf --ignore-case -L ANSI-C -C -c -P -p -j1 -i 1 -g -o -t -N zonetab zonetab.list */ +/* Computed positions: -k'1-4,9' */ + +#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ + && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ + && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ + && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ + && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ + && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ + && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ + && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ + && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ + && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ + && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ + && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ + && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ + && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ + && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ + && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ + && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ + && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ + && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ + && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ + && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ + && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ + && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) +/* The character set is not based on ISO-646. */ +#error "gperf generated tables don't work with this execution character set. Please report a bug to ." +#endif + +#line 1 "zonetab.list" + +#define GPERF_DOWNCASE 1 +#define GPERF_CASE_STRNCMP 1 +#define gperf_case_strncmp strncasecmp +struct zone { + int name; + int offset; +}; +static const struct zone *zonetab(register const char *str, register size_t len); +#line 12 "zonetab.list" +struct zone; + +#define TOTAL_KEYWORDS 316 +#define MIN_WORD_LENGTH 1 +#define MAX_WORD_LENGTH 17 +#define MIN_HASH_VALUE 2 +#define MAX_HASH_VALUE 619 +/* maximum key range = 618, duplicates = 0 */ + +#ifndef GPERF_DOWNCASE +#define GPERF_DOWNCASE 1 +static unsigned char gperf_downcase[256] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255 + }; +#endif + +#ifndef GPERF_CASE_STRNCMP +#define GPERF_CASE_STRNCMP 1 +static int +gperf_case_strncmp (register const char *s1, register const char *s2, register size_t n) +{ + for (; n > 0;) + { + unsigned char c1 = gperf_downcase[(unsigned char)*s1++]; + unsigned char c2 = gperf_downcase[(unsigned char)*s2++]; + if (c1 != 0 && c1 == c2) + { + n--; + continue; + } + return (int)c1 - (int)c2; + } + return 0; +} +#endif + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static unsigned int +hash (register const char *str, register size_t len) +{ + static const unsigned short asso_values[] = + { + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 17, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 3, 2, 620, 620, 620, + 620, 620, 70, 8, 3, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 39, 176, 207, 70, 168, + 1, 5, 18, 74, 218, 2, 117, 130, 48, 88, + 125, 225, 92, 1, 1, 12, 54, 30, 36, 13, + 48, 168, 263, 59, 114, 166, 109, 39, 176, 207, + 70, 168, 1, 5, 18, 74, 218, 2, 117, 130, + 48, 88, 125, 225, 92, 1, 1, 12, 54, 30, + 36, 13, 48, 168, 263, 59, 114, 166, 109, 27, + 104, 1, 9, 4, 309, 190, 188, 177, 255, 108, + 2, 341, 3, 620, 620, 620, 620, 620, 620, 12, + 54, 30, 36, 13, 48, 168, 263, 59, 114, 166, + 109, 27, 104, 1, 9, 4, 309, 190, 188, 177, + 255, 108, 2, 341, 3, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620 + }; + register unsigned int hval = (unsigned int)len; + + switch (hval) + { + default: + hval += asso_values[(unsigned char)str[8]]; + /*FALLTHROUGH*/ + case 8: + case 7: + case 6: + case 5: + case 4: + hval += asso_values[(unsigned char)str[3]]; + /*FALLTHROUGH*/ + case 3: + hval += asso_values[(unsigned char)str[2]]; + /*FALLTHROUGH*/ + case 2: + hval += asso_values[(unsigned char)str[1]+6]; + /*FALLTHROUGH*/ + case 1: + hval += asso_values[(unsigned char)str[0]+52]; + break; + } + return (unsigned int)hval; +} + +struct stringpool_t + { + char stringpool_str2[sizeof("o")]; + char stringpool_str3[sizeof("x")]; + char stringpool_str4[sizeof("z")]; + char stringpool_str5[sizeof("q")]; + char stringpool_str8[sizeof("omst")]; + char stringpool_str9[sizeof("omsst")]; + char stringpool_str10[sizeof("p")]; + char stringpool_str13[sizeof("a")]; + char stringpool_str14[sizeof("e")]; + char stringpool_str15[sizeof("pet")]; + char stringpool_str16[sizeof("pmst")]; + char stringpool_str17[sizeof("pett")]; + char stringpool_str18[sizeof("petst")]; + char stringpool_str19[sizeof("eet")]; + char stringpool_str20[sizeof("aest")]; + char stringpool_str21[sizeof("eest")]; + char stringpool_str22[sizeof("eat")]; + char stringpool_str24[sizeof("east")]; + char stringpool_str25[sizeof("easst")]; + char stringpool_str26[sizeof("pst")]; + char stringpool_str27[sizeof("eastern")]; + char stringpool_str28[sizeof("m")]; + char stringpool_str29[sizeof("ast")]; + char stringpool_str30[sizeof("est")]; + char stringpool_str31[sizeof("c")]; + char stringpool_str32[sizeof("mmt")]; + char stringpool_str33[sizeof("met")]; + char stringpool_str35[sizeof("mest")]; + char stringpool_str36[sizeof("cet")]; + char stringpool_str37[sizeof("d")]; + char stringpool_str38[sizeof("cest")]; + char stringpool_str39[sizeof("cat")]; + char stringpool_str41[sizeof("cast")]; + char stringpool_str42[sizeof("magt")]; + char stringpool_str43[sizeof("magst")]; + char stringpool_str44[sizeof("mst")]; + char stringpool_str45[sizeof("msk")]; + char stringpool_str46[sizeof("cot")]; + char stringpool_str47[sizeof("cst")]; + char stringpool_str48[sizeof("aqtt")]; + char stringpool_str49[sizeof("f")]; + char stringpool_str52[sizeof("art")]; + char stringpool_str53[sizeof("fnt")]; + char stringpool_str54[sizeof("fet")]; + char stringpool_str55[sizeof("b")]; + char stringpool_str57[sizeof("anat")]; + char stringpool_str58[sizeof("anast")]; + char stringpool_str59[sizeof("bnt")]; + char stringpool_str60[sizeof("i")]; + char stringpool_str61[sizeof("pht")]; + char stringpool_str62[sizeof("at")]; + char stringpool_str63[sizeof("zp6")]; + char stringpool_str64[sizeof("mewt")]; + char stringpool_str65[sizeof("fst")]; + char stringpool_str66[sizeof("ahst")]; + char stringpool_str67[sizeof("mawt")]; + char stringpool_str68[sizeof("zp5")]; + char stringpool_str70[sizeof("bot")]; + char stringpool_str71[sizeof("bst")]; + char stringpool_str72[sizeof("pwt")]; + char stringpool_str74[sizeof("pont")]; + char stringpool_str75[sizeof("iot")]; + char stringpool_str76[sizeof("ist")]; + char stringpool_str77[sizeof("awst")]; + char stringpool_str79[sizeof("mht")]; + char stringpool_str80[sizeof("mez")]; + char stringpool_str81[sizeof("orat")]; + char stringpool_str82[sizeof("mesz")]; + char stringpool_str84[sizeof("chst")]; + char stringpool_str85[sizeof("pmdt")]; + char stringpool_str88[sizeof("central")]; + char stringpool_str89[sizeof("aedt")]; + char stringpool_str90[sizeof("act")]; + char stringpool_str91[sizeof("ect")]; + char stringpool_str92[sizeof("acst")]; + char stringpool_str93[sizeof("eadt")]; + char stringpool_str94[sizeof("brt")]; + char stringpool_str95[sizeof("chut")]; + char stringpool_str96[sizeof("brst")]; + char stringpool_str97[sizeof("cen. australia")]; + char stringpool_str100[sizeof("davt")]; + char stringpool_str101[sizeof("irst")]; + char stringpool_str102[sizeof("irkt")]; + char stringpool_str103[sizeof("irkst")]; + char stringpool_str104[sizeof("bt")]; + char stringpool_str105[sizeof("n")]; + char stringpool_str106[sizeof("btt")]; + char stringpool_str107[sizeof("mountain")]; + char stringpool_str108[sizeof("cct")]; + char stringpool_str109[sizeof("w")]; + char stringpool_str110[sizeof("l")]; + char stringpool_str111[sizeof("fwt")]; + char stringpool_str113[sizeof("msd")]; + char stringpool_str114[sizeof("wet")]; + char stringpool_str116[sizeof("west")]; + char stringpool_str117[sizeof("wat")]; + char stringpool_str119[sizeof("wast")]; + char stringpool_str120[sizeof("wakt")]; + char stringpool_str121[sizeof("nst")]; + char stringpool_str122[sizeof("acwst")]; + char stringpool_str123[sizeof("chast")]; + char stringpool_str124[sizeof("cist")]; + char stringpool_str125[sizeof("azt")]; + char stringpool_str126[sizeof("clt")]; + char stringpool_str127[sizeof("azst")]; + char stringpool_str128[sizeof("clst")]; + char stringpool_str129[sizeof("mart")]; + char stringpool_str130[sizeof("zp4")]; + char stringpool_str131[sizeof("jst")]; + char stringpool_str132[sizeof("central asia")]; + char stringpool_str133[sizeof("aft")]; + char stringpool_str134[sizeof("e. south america")]; + char stringpool_str135[sizeof("central america")]; + char stringpool_str137[sizeof("ict")]; + char stringpool_str143[sizeof("pgt")]; + char stringpool_str144[sizeof("nrt")]; + char stringpool_str145[sizeof("mexico")]; + char stringpool_str146[sizeof("awdt")]; + char stringpool_str147[sizeof("egt")]; + char stringpool_str148[sizeof("cxt")]; + char stringpool_str149[sizeof("egst")]; + char stringpool_str150[sizeof("phot")]; + char stringpool_str151[sizeof("alaskan")]; + char stringpool_str154[sizeof("nt")]; + char stringpool_str158[sizeof("wt")]; + char stringpool_str160[sizeof("west asia")]; + char stringpool_str161[sizeof("acdt")]; + char stringpool_str162[sizeof("npt")]; + char stringpool_str163[sizeof("lhst")]; + char stringpool_str164[sizeof("afghanistan")]; + char stringpool_str167[sizeof("k")]; + char stringpool_str169[sizeof("g")]; + char stringpool_str170[sizeof("irdt")]; + char stringpool_str171[sizeof("chot")]; + char stringpool_str172[sizeof("chost")]; + char stringpool_str173[sizeof("gmt")]; + char stringpool_str174[sizeof("get")]; + char stringpool_str175[sizeof("novt")]; + char stringpool_str176[sizeof("novst")]; + char stringpool_str177[sizeof("fjt")]; + char stringpool_str178[sizeof("u")]; + char stringpool_str179[sizeof("fjst")]; + char stringpool_str181[sizeof("pyst")]; + char stringpool_str182[sizeof("nct")]; + char stringpool_str183[sizeof("kst")]; + char stringpool_str184[sizeof("kost")]; + char stringpool_str185[sizeof("gst")]; + char stringpool_str186[sizeof("iran")]; + char stringpool_str187[sizeof("e. africa")]; + char stringpool_str188[sizeof("wadt")]; + char stringpool_str189[sizeof("t")]; + char stringpool_str190[sizeof("e. australia")]; + char stringpool_str191[sizeof("s")]; + char stringpool_str192[sizeof("chadt")]; + char stringpool_str193[sizeof("tmt")]; + char stringpool_str194[sizeof("cidst")]; + char stringpool_str195[sizeof("aoe")]; + char stringpool_str197[sizeof("myt")]; + char stringpool_str198[sizeof("west pacific")]; + char stringpool_str199[sizeof("mut")]; + char stringpool_str200[sizeof("wit")]; + char stringpool_str201[sizeof("sast")]; + char stringpool_str202[sizeof("sakt")]; + char stringpool_str203[sizeof("new zealand")]; + char stringpool_str204[sizeof("tot")]; + char stringpool_str205[sizeof("china")]; + char stringpool_str206[sizeof("tost")]; + char stringpool_str207[sizeof("sst")]; + char stringpool_str209[sizeof("india")]; + char stringpool_str211[sizeof("warst")]; + char stringpool_str212[sizeof("sbt")]; + char stringpool_str214[sizeof("azot")]; + char stringpool_str215[sizeof("azost")]; + char stringpool_str216[sizeof("taht")]; + char stringpool_str217[sizeof("nzt")]; + char stringpool_str218[sizeof("dateline")]; + char stringpool_str219[sizeof("nzst")]; + char stringpool_str220[sizeof("tokyo")]; + char stringpool_str221[sizeof("central pacific")]; + char stringpool_str223[sizeof("qyzt")]; + char stringpool_str224[sizeof("atlantic")]; + char stringpool_str225[sizeof("nft")]; + char stringpool_str227[sizeof("ut")]; + char stringpool_str228[sizeof("trt")]; + char stringpool_str229[sizeof("wft")]; + char stringpool_str230[sizeof("srt")]; + char stringpool_str231[sizeof("pdt")]; + char stringpool_str232[sizeof("lhdt")]; + char stringpool_str234[sizeof("adt")]; + char stringpool_str235[sizeof("edt")]; + char stringpool_str238[sizeof("pkt")]; + char stringpool_str239[sizeof("almt")]; + char stringpool_str240[sizeof("wita")]; + char stringpool_str242[sizeof("wgt")]; + char stringpool_str243[sizeof("akst")]; + char stringpool_str244[sizeof("wgst")]; + char stringpool_str246[sizeof("krat")]; + char stringpool_str247[sizeof("krast")]; + char stringpool_str248[sizeof("mid-atlantic")]; + char stringpool_str249[sizeof("mdt")]; + char stringpool_str250[sizeof("lint")]; + char stringpool_str251[sizeof("malay peninsula")]; + char stringpool_str252[sizeof("cdt")]; + char stringpool_str253[sizeof("swt")]; + char stringpool_str255[sizeof("se asia")]; + char stringpool_str256[sizeof("v")]; + char stringpool_str258[sizeof("tonga")]; + char stringpool_str259[sizeof("ckt")]; + char stringpool_str261[sizeof("vet")]; + char stringpool_str262[sizeof("caucasus")]; + char stringpool_str263[sizeof("central europe")]; + char stringpool_str264[sizeof("h")]; + char stringpool_str265[sizeof("central european")]; + char stringpool_str266[sizeof("newfoundland")]; + char stringpool_str267[sizeof("arab")]; + char stringpool_str268[sizeof("sct")]; + char stringpool_str269[sizeof("arabic")]; + char stringpool_str270[sizeof("arabian")]; + char stringpool_str271[sizeof("ddut")]; + char stringpool_str273[sizeof("vost")]; + char stringpool_str274[sizeof("hast")]; + char stringpool_str275[sizeof("nepal")]; + char stringpool_str276[sizeof("nut")]; + char stringpool_str277[sizeof("fkt")]; + char stringpool_str279[sizeof("fkst")]; + char stringpool_str280[sizeof("hst")]; + char stringpool_str281[sizeof("idt")]; + char stringpool_str284[sizeof("tlt")]; + char stringpool_str285[sizeof("w. australia")]; + char stringpool_str286[sizeof("egypt")]; + char stringpool_str287[sizeof("myanmar")]; + char stringpool_str288[sizeof("nzdt")]; + char stringpool_str289[sizeof("gft")]; + char stringpool_str290[sizeof("uzt")]; + char stringpool_str293[sizeof("north asia")]; + char stringpool_str294[sizeof("mvt")]; + char stringpool_str295[sizeof("galt")]; + char stringpool_str296[sizeof("nfdt")]; + char stringpool_str297[sizeof("cvt")]; + char stringpool_str298[sizeof("north asia east")]; + char stringpool_str300[sizeof("kgt")]; + char stringpool_str301[sizeof("aus central")]; + char stringpool_str302[sizeof("pacific")]; + char stringpool_str304[sizeof("canada central")]; + char stringpool_str306[sizeof("pacific sa")]; + char stringpool_str307[sizeof("azores")]; + char stringpool_str308[sizeof("gamt")]; + char stringpool_str309[sizeof("tft")]; + char stringpool_str310[sizeof("r")]; + char stringpool_str311[sizeof("fle")]; + char stringpool_str312[sizeof("akdt")]; + char stringpool_str313[sizeof("ulat")]; + char stringpool_str314[sizeof("ulast")]; + char stringpool_str315[sizeof("ret")]; + char stringpool_str317[sizeof("tjt")]; + char stringpool_str319[sizeof("south africa")]; + char stringpool_str324[sizeof("sgt")]; + char stringpool_str326[sizeof("ndt")]; + char stringpool_str327[sizeof("rott")]; + char stringpool_str330[sizeof("samt")]; + char stringpool_str332[sizeof("tasmania")]; + char stringpool_str334[sizeof("hovt")]; + char stringpool_str335[sizeof("hovst")]; + char stringpool_str338[sizeof("gyt")]; + char stringpool_str342[sizeof("y")]; + char stringpool_str343[sizeof("hadt")]; + char stringpool_str344[sizeof("sa western")]; + char stringpool_str345[sizeof("hawaiian")]; + char stringpool_str347[sizeof("uyt")]; + char stringpool_str349[sizeof("uyst")]; + char stringpool_str350[sizeof("yekt")]; + char stringpool_str351[sizeof("yekst")]; + char stringpool_str352[sizeof("kuyt")]; + char stringpool_str353[sizeof("yakt")]; + char stringpool_str354[sizeof("yakst")]; + char stringpool_str358[sizeof("yst")]; + char stringpool_str359[sizeof("jerusalem")]; + char stringpool_str365[sizeof("sri lanka")]; + char stringpool_str367[sizeof("yakutsk")]; + char stringpool_str375[sizeof("wib")]; + char stringpool_str377[sizeof("aus eastern")]; + char stringpool_str378[sizeof("gilt")]; + char stringpool_str387[sizeof("us mountain")]; + char stringpool_str391[sizeof("vlat")]; + char stringpool_str392[sizeof("vlast")]; + char stringpool_str395[sizeof("gtb")]; + char stringpool_str398[sizeof("taipei")]; + char stringpool_str399[sizeof("sret")]; + char stringpool_str408[sizeof("cape verde")]; + char stringpool_str417[sizeof("tkt")]; + char stringpool_str418[sizeof("samoa")]; + char stringpool_str421[sizeof("sa pacific")]; + char stringpool_str427[sizeof("vut")]; + char stringpool_str428[sizeof("idlw")]; + char stringpool_str432[sizeof("fiji")]; + char stringpool_str435[sizeof("utc")]; + char stringpool_str443[sizeof("korea")]; + char stringpool_str445[sizeof("e. europe")]; + char stringpool_str449[sizeof("syot")]; + char stringpool_str452[sizeof("n. central asia")]; + char stringpool_str455[sizeof("tvt")]; + char stringpool_str458[sizeof("w. central africa")]; + char stringpool_str466[sizeof("ekaterinburg")]; + char stringpool_str468[sizeof("vladivostok")]; + char stringpool_str476[sizeof("yapt")]; + char stringpool_str477[sizeof("us eastern")]; + char stringpool_str482[sizeof("sa eastern")]; + char stringpool_str485[sizeof("hdt")]; + char stringpool_str486[sizeof("russian")]; + char stringpool_str492[sizeof("hkt")]; + char stringpool_str497[sizeof("romance")]; + char stringpool_str540[sizeof("w. europe")]; + char stringpool_str563[sizeof("ydt")]; + char stringpool_str566[sizeof("idle")]; + char stringpool_str567[sizeof("greenwich")]; + char stringpool_str619[sizeof("greenland")]; + }; +static const struct stringpool_t stringpool_contents = + { + "o", + "x", + "z", + "q", + "omst", + "omsst", + "p", + "a", + "e", + "pet", + "pmst", + "pett", + "petst", + "eet", + "aest", + "eest", + "eat", + "east", + "easst", + "pst", + "eastern", + "m", + "ast", + "est", + "c", + "mmt", + "met", + "mest", + "cet", + "d", + "cest", + "cat", + "cast", + "magt", + "magst", + "mst", + "msk", + "cot", + "cst", + "aqtt", + "f", + "art", + "fnt", + "fet", + "b", + "anat", + "anast", + "bnt", + "i", + "pht", + "at", + "zp6", + "mewt", + "fst", + "ahst", + "mawt", + "zp5", + "bot", + "bst", + "pwt", + "pont", + "iot", + "ist", + "awst", + "mht", + "mez", + "orat", + "mesz", + "chst", + "pmdt", + "central", + "aedt", + "act", + "ect", + "acst", + "eadt", + "brt", + "chut", + "brst", + "cen. australia", + "davt", + "irst", + "irkt", + "irkst", + "bt", + "n", + "btt", + "mountain", + "cct", + "w", + "l", + "fwt", + "msd", + "wet", + "west", + "wat", + "wast", + "wakt", + "nst", + "acwst", + "chast", + "cist", + "azt", + "clt", + "azst", + "clst", + "mart", + "zp4", + "jst", + "central asia", + "aft", + "e. south america", + "central america", + "ict", + "pgt", + "nrt", + "mexico", + "awdt", + "egt", + "cxt", + "egst", + "phot", + "alaskan", + "nt", + "wt", + "west asia", + "acdt", + "npt", + "lhst", + "afghanistan", + "k", + "g", + "irdt", + "chot", + "chost", + "gmt", + "get", + "novt", + "novst", + "fjt", + "u", + "fjst", + "pyst", + "nct", + "kst", + "kost", + "gst", + "iran", + "e. africa", + "wadt", + "t", + "e. australia", + "s", + "chadt", + "tmt", + "cidst", + "aoe", + "myt", + "west pacific", + "mut", + "wit", + "sast", + "sakt", + "new zealand", + "tot", + "china", + "tost", + "sst", + "india", + "warst", + "sbt", + "azot", + "azost", + "taht", + "nzt", + "dateline", + "nzst", + "tokyo", + "central pacific", + "qyzt", + "atlantic", + "nft", + "ut", + "trt", + "wft", + "srt", + "pdt", + "lhdt", + "adt", + "edt", + "pkt", + "almt", + "wita", + "wgt", + "akst", + "wgst", + "krat", + "krast", + "mid-atlantic", + "mdt", + "lint", + "malay peninsula", + "cdt", + "swt", + "se asia", + "v", + "tonga", + "ckt", + "vet", + "caucasus", + "central europe", + "h", + "central european", + "newfoundland", + "arab", + "sct", + "arabic", + "arabian", + "ddut", + "vost", + "hast", + "nepal", + "nut", + "fkt", + "fkst", + "hst", + "idt", + "tlt", + "w. australia", + "egypt", + "myanmar", + "nzdt", + "gft", + "uzt", + "north asia", + "mvt", + "galt", + "nfdt", + "cvt", + "north asia east", + "kgt", + "aus central", + "pacific", + "canada central", + "pacific sa", + "azores", + "gamt", + "tft", + "r", + "fle", + "akdt", + "ulat", + "ulast", + "ret", + "tjt", + "south africa", + "sgt", + "ndt", + "rott", + "samt", + "tasmania", + "hovt", + "hovst", + "gyt", + "y", + "hadt", + "sa western", + "hawaiian", + "uyt", + "uyst", + "yekt", + "yekst", + "kuyt", + "yakt", + "yakst", + "yst", + "jerusalem", + "sri lanka", + "yakutsk", + "wib", + "aus eastern", + "gilt", + "us mountain", + "vlat", + "vlast", + "gtb", + "taipei", + "sret", + "cape verde", + "tkt", + "samoa", + "sa pacific", + "vut", + "idlw", + "fiji", + "utc", + "korea", + "e. europe", + "syot", + "n. central asia", + "tvt", + "w. central africa", + "ekaterinburg", + "vladivostok", + "yapt", + "us eastern", + "sa eastern", + "hdt", + "russian", + "hkt", + "romance", + "w. europe", + "ydt", + "idle", + "greenwich", + "greenland" + }; +#define stringpool ((const char *) &stringpool_contents) +const struct zone * +zonetab (register const char *str, register size_t len) +{ + static const struct zone wordlist[] = + { + {-1}, {-1}, +#line 37 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str2, -2*3600}, +#line 46 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str3, -11*3600}, +#line 48 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str4, 0*3600}, +#line 39 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str5, -4*3600}, + {-1}, {-1}, +#line 272 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str8,21600}, +#line 271 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str9,25200}, +#line 38 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str10, -3*3600}, + {-1}, {-1}, +#line 24 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str13, 1*3600}, +#line 28 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str14, 5*3600}, +#line 274 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str15,-18000}, +#line 282 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str16,-10800}, +#line 276 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str17,43200}, +#line 275 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str18,43200}, +#line 83 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str19, 2*3600}, +#line 189 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str20,36000}, +#line 91 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str21, 3*3600}, +#line 90 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str22, 3*3600}, + {-1}, +#line 104 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str24,-6*3600}, +#line 220 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str25,-18000}, +#line 22 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str26, -8*3600}, +#line 136 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str27, -18000}, +#line 35 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str28, 12*3600}, +#line 59 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str29, -4*3600}, +#line 16 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str30, -5*3600}, +#line 26 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str31, 3*3600}, +#line 259 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str32,23400}, +#line 76 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str33, 1*3600}, + {-1}, +#line 85 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str35, 2*3600}, +#line 74 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str36, 1*3600}, +#line 27 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str37, 4*3600}, +#line 82 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str38, 2*3600}, +#line 68 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str39,2*3600}, + {-1}, +#line 205 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str41,28800}, +#line 255 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str42,39600}, +#line 254 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str43,43200}, +#line 20 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str44, -7*3600}, +#line 92 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str45, 3*3600}, +#line 215 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str46,-18000}, +#line 18 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str47, -6*3600}, +#line 195 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str48,18000}, +#line 29 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str49, 6*3600}, + {-1}, {-1}, +#line 54 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str52, -3*3600}, +#line 229 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str53,-7200}, +#line 224 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str54,10800}, +#line 25 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str55, 2*3600}, + {-1}, +#line 193 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str57,43200}, +#line 192 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str58,43200}, +#line 202 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str59,28800}, +#line 32 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str60, 9*3600}, +#line 279 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str61,28800}, +#line 51 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str62, -2*3600}, +#line 97 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str63, 6*3600}, +#line 77 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str64, 1*3600}, +#line 84 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str65, 2*3600}, +#line 67 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str66,-10*3600}, +#line 257 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str67,18000}, +#line 95 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str68, 5*3600}, + {-1}, +#line 203 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str70,-14400}, +#line 73 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str71, 1*3600}, +#line 284 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str72,32400}, + {-1}, +#line 283 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str74,39600}, +#line 241 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str75,21600}, +#line 96 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str76, (5*3600+1800)}, +#line 197 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str77,28800}, + {-1}, +#line 258 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str79,43200}, +#line 78 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str80, 1*3600}, +#line 273 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str81,18000}, +#line 86 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str82, 2*3600}, + {-1}, +#line 210 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str84,36000}, +#line 281 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str85,-7200}, + {-1}, {-1}, +#line 129 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str88, -21600}, +#line 188 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str89,39600}, +#line 186 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str90,-18000}, +#line 221 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str91,-18000}, +#line 185 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str92,34200}, +#line 106 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str93,11*3600}, +#line 56 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str94, -3*3600}, +#line 211 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str95,36000}, +#line 52 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str96,-2*3600}, +#line 123 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str97, 34200}, + {-1}, {-1}, +#line 218 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str100,25200}, +#line 245 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str101,12600}, +#line 244 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str102,28800}, +#line 243 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str103,32400}, +#line 89 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str104, 3*3600}, +#line 36 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str105, -1*3600}, +#line 204 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str106,21600}, +#line 151 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str107, -25200}, +#line 99 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str108, (6*3600+1800)}, +#line 45 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str109, -10*3600}, +#line 34 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str110, 11*3600}, +#line 75 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str111, 1*3600}, + {-1}, +#line 93 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str113, 4*3600}, +#line 50 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str114, 0*3600}, + {-1}, +#line 81 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str116, 1*3600}, +#line 80 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str117, 1*3600}, + {-1}, +#line 98 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str119, 2*3600}, +#line 316 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str120,43200}, +#line 58 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str121, -(2*3600+1800)}, +#line 187 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str122,31500}, +#line 207 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str123,45900}, +#line 213 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str124,-18000}, +#line 201 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str125,14400}, +#line 60 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str126, -4*3600}, +#line 200 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str127,18000}, +#line 57 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str128,-3*3600}, +#line 256 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str129,-30600}, +#line 94 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str130, 4*3600}, +#line 102 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str131, 9*3600}, +#line 125 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str132, 21600}, +#line 190 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str133,16200}, +#line 135 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str134, -10800}, +#line 124 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str135, -21600}, + {-1}, +#line 239 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str137,25200}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 277 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str143,36000}, +#line 269 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str144,43200}, +#line 149 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str145, -21600}, +#line 196 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str146,32400}, +#line 223 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str147,-3600}, +#line 217 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str148,25200}, +#line 222 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str149,0}, +#line 278 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str150,46800}, +#line 112 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str151, -32400}, + {-1}, {-1}, +#line 71 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str154, -11*3600}, + {-1}, {-1}, {-1}, +#line 324 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str158,0}, + {-1}, +#line 181 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str160, 18000}, +#line 184 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str161,37800}, +#line 268 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str162,20700}, +#line 252 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str163,37800}, +#line 111 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str164, 16200}, + {-1}, {-1}, +#line 33 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str167, 10*3600}, + {-1}, +#line 30 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str169, 7*3600}, +#line 242 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str170,16200}, +#line 209 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str171,28800}, +#line 208 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str172,32400}, +#line 15 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str173, 0*3600}, +#line 232 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str174,14400}, +#line 267 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str175,25200}, +#line 266 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str176,25200}, +#line 226 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str177,43200}, +#line 43 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str178, -8*3600}, +#line 225 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str179,46800}, + {-1}, +#line 285 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str181,-10800}, +#line 263 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str182,39600}, +#line 103 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str183, 9*3600}, +#line 247 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str184,39600}, +#line 105 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str185, 10*3600}, +#line 146 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str186, 12600}, +#line 132 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str187, 10800}, +#line 101 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str188, 8*3600}, +#line 42 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str189, -7*3600}, +#line 133 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str190, 36000}, +#line 41 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str191, -6*3600}, +#line 206 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str192,49500}, +#line 301 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str193,18000}, +#line 212 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str194,-14400}, +#line 194 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str195,-43200}, + {-1}, +#line 262 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str197,28800}, +#line 182 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str198, 36000}, +#line 260 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str199,14400}, +#line 322 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str200,32400}, +#line 87 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str201, 2*3600}, +#line 289 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str202,39600}, +#line 155 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str203, 43200}, +#line 303 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str204,46800}, +#line 130 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str205, 28800}, +#line 302 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str206,50400}, +#line 88 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str207, -11*3600}, + {-1}, +#line 145 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str209, 19800}, + {-1}, +#line 317 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str211,-10800}, +#line 291 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str212,39600}, + {-1}, +#line 199 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str214,-3600}, +#line 198 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str215,0}, +#line 296 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str216,-36000}, +#line 109 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str217, 12*3600}, +#line 131 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str218, -43200}, +#line 108 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str219,12*3600}, +#line 173 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str220, 32400}, +#line 128 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str221, 39600}, + {-1}, +#line 286 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str223,21600}, +#line 116 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str224, -14400}, +#line 265 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str225,39600}, + {-1}, +#line 14 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str227, 0*3600}, +#line 304 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str228,10800}, +#line 318 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str229,43200}, +#line 294 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str230,-10800}, +#line 23 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str231, -7*3600}, +#line 251 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str232,39600}, + {-1}, +#line 55 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str234, -3*3600}, +#line 17 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str235, -4*3600}, + {-1}, {-1}, +#line 280 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str238,18000}, +#line 191 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str239,21600}, +#line 323 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str240,28800}, + {-1}, +#line 320 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str242,-7200}, +#line 63 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str243,-9*3600}, +#line 319 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str244,-3600}, + {-1}, +#line 249 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str246,25200}, +#line 248 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str247,28800}, +#line 150 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str248, -7200}, +#line 21 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str249, -6*3600}, +#line 253 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str250,50400}, +#line 168 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str251, 28800}, +#line 19 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str252, -5*3600}, +#line 79 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str253, 1*3600}, + {-1}, +#line 167 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str255, 25200}, +#line 44 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str256, -9*3600}, + {-1}, +#line 174 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str258, 46800}, +#line 214 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str259,-36000}, + {-1}, +#line 311 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str261,-14400}, +#line 122 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str262, 14400}, +#line 126 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str263, 3600}, +#line 31 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str264, 8*3600}, +#line 127 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str265, 3600}, +#line 156 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str266, -12600}, +#line 113 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str267, 10800}, +#line 292 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str268,14400}, +#line 115 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str269, 10800}, +#line 114 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str270, 14400}, +#line 219 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str271,36000}, + {-1}, +#line 314 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str273,21600}, +#line 69 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str274,-10*3600}, +#line 154 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str275, 20700}, +#line 270 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str276,-39600}, +#line 228 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str277,-14400}, + {-1}, +#line 227 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str279,-10800}, +#line 70 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str280,-10*3600}, +#line 240 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str281,10800}, + {-1}, {-1}, +#line 300 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str284,32400}, +#line 178 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str285, 28800}, +#line 137 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str286, 7200}, +#line 152 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str287, 23400}, +#line 110 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str288,13*3600}, +#line 233 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str289,-10800}, +#line 310 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str290,18000}, + {-1}, {-1}, +#line 158 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str293, 25200}, +#line 261 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str294,18000}, +#line 230 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str295,-21600}, +#line 264 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str296,43200}, +#line 216 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str297,-3600}, +#line 157 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str298, 28800}, + {-1}, +#line 246 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str300,21600}, +#line 117 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str301, 34200}, +#line 160 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str302, -28800}, + {-1}, +#line 120 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str304, -21600}, + {-1}, +#line 159 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str306, -14400}, +#line 119 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str307, -3600}, +#line 231 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str308,-32400}, +#line 297 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str309,18000}, +#line 40 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str310, -5*3600}, +#line 140 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str311, 7200}, +#line 61 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str312,-8*3600}, +#line 307 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str313,28800}, +#line 306 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str314,32400}, +#line 287 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str315,14400}, + {-1}, +#line 298 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str317,18000}, + {-1}, +#line 169 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str319, 7200}, + {-1}, {-1}, {-1}, {-1}, +#line 100 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str324, 8*3600}, + {-1}, +#line 53 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str326, -(1*3600+1800)}, +#line 288 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str327,-10800}, + {-1}, {-1}, +#line 290 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str330,14400}, + {-1}, +#line 172 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str332, 36000}, + {-1}, +#line 238 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str334,25200}, +#line 237 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str335,28800}, + {-1}, {-1}, +#line 235 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str338,-14400}, + {-1}, {-1}, {-1}, +#line 47 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str342, -12*3600}, +#line 64 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str343,-9*3600}, +#line 165 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str344, -14400}, +#line 144 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str345, -36000}, + {-1}, +#line 309 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str347,-10800}, + {-1}, +#line 308 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str349,-7200}, +#line 329 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str350,18000}, +#line 328 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str351,21600}, +#line 250 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str352,14400}, +#line 326 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str353,32400}, +#line 325 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str354,36000}, + {-1}, {-1}, {-1}, +#line 66 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str358, -9*3600}, +#line 147 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str359, 7200}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 170 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str365, 21600}, + {-1}, +#line 183 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str367, 32400}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 321 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str375,25200}, + {-1}, +#line 118 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str377, 36000}, +#line 234 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str378,43200}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 176 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str387, -25200}, + {-1}, {-1}, {-1}, +#line 313 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str391,36000}, +#line 312 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str392,39600}, + {-1}, {-1}, +#line 143 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str395, 7200}, + {-1}, {-1}, +#line 171 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str398, 28800}, +#line 293 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str399,39600}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 121 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str408, -3600}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 299 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str417,46800}, +#line 166 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str418, -39600}, + {-1}, {-1}, +#line 164 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str421, -18000}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 315 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str427,39600}, +#line 72 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str428,-12*3600}, + {-1}, {-1}, {-1}, +#line 139 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str432, 43200}, + {-1}, {-1}, +#line 49 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str435, 0*3600}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 148 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str443, 32400}, + {-1}, +#line 134 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str445, 7200}, + {-1}, {-1}, {-1}, +#line 295 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str449,10800}, + {-1}, {-1}, +#line 153 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str452, 21600}, + {-1}, {-1}, +#line 305 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str455,43200}, + {-1}, {-1}, +#line 179 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str458, 3600}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 138 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str466, 18000}, + {-1}, +#line 177 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str468, 36000}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 327 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str476,36000}, +#line 175 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str477, -18000}, + {-1}, {-1}, {-1}, {-1}, +#line 163 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str482, -10800}, + {-1}, {-1}, +#line 65 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str485, -9*3600}, +#line 162 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str486, 10800}, + {-1}, {-1}, {-1}, {-1}, {-1}, +#line 236 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str492,28800}, + {-1}, {-1}, {-1}, {-1}, +#line 161 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str497, 3600}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 180 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str540, 3600}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, +#line 62 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str563, -8*3600}, + {-1}, {-1}, +#line 107 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str566,12*3600}, +#line 142 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str567, 0}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, + {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, +#line 141 "zonetab.list" + {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str619, -10800} + }; + + if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) + { + register unsigned int key = hash (str, len); + + if (key <= MAX_HASH_VALUE) + { + register int o = wordlist[key].name; + if (o >= 0) + { + register const char *s = o + stringpool; + + if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_strncmp (str, s, len) && s[len] == '\0') + return &wordlist[key]; + } + } + } + return 0; +} +#line 330 "zonetab.list" + diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/zonetab.list b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/zonetab.list new file mode 100644 index 0000000..63b6873 --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/ext/date/zonetab.list @@ -0,0 +1,330 @@ +%{ +#define GPERF_DOWNCASE 1 +#define GPERF_CASE_STRNCMP 1 +#define gperf_case_strncmp strncasecmp +struct zone { + int name; + int offset; +}; +static const struct zone *zonetab(register const char *str, register size_t len); +%} + +struct zone; +%% +ut, 0*3600 +gmt, 0*3600 +est, -5*3600 +edt, -4*3600 +cst, -6*3600 +cdt, -5*3600 +mst, -7*3600 +mdt, -6*3600 +pst, -8*3600 +pdt, -7*3600 +a, 1*3600 +b, 2*3600 +c, 3*3600 +d, 4*3600 +e, 5*3600 +f, 6*3600 +g, 7*3600 +h, 8*3600 +i, 9*3600 +k, 10*3600 +l, 11*3600 +m, 12*3600 +n, -1*3600 +o, -2*3600 +p, -3*3600 +q, -4*3600 +r, -5*3600 +s, -6*3600 +t, -7*3600 +u, -8*3600 +v, -9*3600 +w, -10*3600 +x, -11*3600 +y, -12*3600 +z, 0*3600 +utc, 0*3600 +wet, 0*3600 +at, -2*3600 +brst,-2*3600 +ndt, -(1*3600+1800) +art, -3*3600 +adt, -3*3600 +brt, -3*3600 +clst,-3*3600 +nst, -(2*3600+1800) +ast, -4*3600 +clt, -4*3600 +akdt,-8*3600 +ydt, -8*3600 +akst,-9*3600 +hadt,-9*3600 +hdt, -9*3600 +yst, -9*3600 +ahst,-10*3600 +cat,2*3600 +hast,-10*3600 +hst,-10*3600 +nt, -11*3600 +idlw,-12*3600 +bst, 1*3600 +cet, 1*3600 +fwt, 1*3600 +met, 1*3600 +mewt, 1*3600 +mez, 1*3600 +swt, 1*3600 +wat, 1*3600 +west, 1*3600 +cest, 2*3600 +eet, 2*3600 +fst, 2*3600 +mest, 2*3600 +mesz, 2*3600 +sast, 2*3600 +sst, -11*3600 +bt, 3*3600 +eat, 3*3600 +eest, 3*3600 +msk, 3*3600 +msd, 4*3600 +zp4, 4*3600 +zp5, 5*3600 +ist, (5*3600+1800) +zp6, 6*3600 +wast, 2*3600 +cct, (6*3600+1800) +sgt, 8*3600 +wadt, 8*3600 +jst, 9*3600 +kst, 9*3600 +east,-6*3600 +gst, 10*3600 +eadt,11*3600 +idle,12*3600 +nzst,12*3600 +nzt, 12*3600 +nzdt,13*3600 +afghanistan, 16200 +alaskan, -32400 +arab, 10800 +arabian, 14400 +arabic, 10800 +atlantic, -14400 +aus central, 34200 +aus eastern, 36000 +azores, -3600 +canada central, -21600 +cape verde, -3600 +caucasus, 14400 +cen. australia, 34200 +central america, -21600 +central asia, 21600 +central europe, 3600 +central european, 3600 +central pacific, 39600 +central, -21600 +china, 28800 +dateline, -43200 +e. africa, 10800 +e. australia, 36000 +e. europe, 7200 +e. south america, -10800 +eastern, -18000 +egypt, 7200 +ekaterinburg, 18000 +fiji, 43200 +fle, 7200 +greenland, -10800 +greenwich, 0 +gtb, 7200 +hawaiian, -36000 +india, 19800 +iran, 12600 +jerusalem, 7200 +korea, 32400 +mexico, -21600 +mid-atlantic, -7200 +mountain, -25200 +myanmar, 23400 +n. central asia, 21600 +nepal, 20700 +new zealand, 43200 +newfoundland, -12600 +north asia east, 28800 +north asia, 25200 +pacific sa, -14400 +pacific, -28800 +romance, 3600 +russian, 10800 +sa eastern, -10800 +sa pacific, -18000 +sa western, -14400 +samoa, -39600 +se asia, 25200 +malay peninsula, 28800 +south africa, 7200 +sri lanka, 21600 +taipei, 28800 +tasmania, 36000 +tokyo, 32400 +tonga, 46800 +us eastern, -18000 +us mountain, -25200 +vladivostok, 36000 +w. australia, 28800 +w. central africa, 3600 +w. europe, 3600 +west asia, 18000 +west pacific, 36000 +yakutsk, 32400 +acdt,37800 +acst,34200 +act,-18000 +acwst,31500 +aedt,39600 +aest,36000 +aft,16200 +almt,21600 +anast,43200 +anat,43200 +aoe,-43200 +aqtt,18000 +awdt,32400 +awst,28800 +azost,0 +azot,-3600 +azst,18000 +azt,14400 +bnt,28800 +bot,-14400 +btt,21600 +cast,28800 +chadt,49500 +chast,45900 +chost,32400 +chot,28800 +chst,36000 +chut,36000 +cidst,-14400 +cist,-18000 +ckt,-36000 +cot,-18000 +cvt,-3600 +cxt,25200 +davt,25200 +ddut,36000 +easst,-18000 +ect,-18000 +egst,0 +egt,-3600 +fet,10800 +fjst,46800 +fjt,43200 +fkst,-10800 +fkt,-14400 +fnt,-7200 +galt,-21600 +gamt,-32400 +get,14400 +gft,-10800 +gilt,43200 +gyt,-14400 +hkt,28800 +hovst,28800 +hovt,25200 +ict,25200 +idt,10800 +iot,21600 +irdt,16200 +irkst,32400 +irkt,28800 +irst,12600 +kgt,21600 +kost,39600 +krast,28800 +krat,25200 +kuyt,14400 +lhdt,39600 +lhst,37800 +lint,50400 +magst,43200 +magt,39600 +mart,-30600 +mawt,18000 +mht,43200 +mmt,23400 +mut,14400 +mvt,18000 +myt,28800 +nct,39600 +nfdt,43200 +nft,39600 +novst,25200 +novt,25200 +npt,20700 +nrt,43200 +nut,-39600 +omsst,25200 +omst,21600 +orat,18000 +pet,-18000 +petst,43200 +pett,43200 +pgt,36000 +phot,46800 +pht,28800 +pkt,18000 +pmdt,-7200 +pmst,-10800 +pont,39600 +pwt,32400 +pyst,-10800 +qyzt,21600 +ret,14400 +rott,-10800 +sakt,39600 +samt,14400 +sbt,39600 +sct,14400 +sret,39600 +srt,-10800 +syot,10800 +taht,-36000 +tft,18000 +tjt,18000 +tkt,46800 +tlt,32400 +tmt,18000 +tost,50400 +tot,46800 +trt,10800 +tvt,43200 +ulast,32400 +ulat,28800 +uyst,-7200 +uyt,-10800 +uzt,18000 +vet,-14400 +vlast,39600 +vlat,36000 +vost,21600 +vut,39600 +wakt,43200 +warst,-10800 +wft,43200 +wgst,-3600 +wgt,-7200 +wib,25200 +wit,32400 +wita,28800 +wt,0 +yakst,36000 +yakt,32400 +yapt,36000 +yekst,21600 +yekt,18000 +%% diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/lib/date.rb b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/lib/date.rb new file mode 100644 index 0000000..aa630eb --- /dev/null +++ b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/lib/date.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true +# date.rb: Written by Tadayoshi Funaba 1998-2011 + +require 'date_core' + +class Date + VERSION = "3.4.1" # :nodoc: + + # call-seq: + # infinite? -> false + # + # Returns +false+ + def infinite? + false + end + + class Infinity < Numeric # :nodoc: + + def initialize(d=1) @d = d <=> 0 end + + def d() @d end + + protected :d + + def zero?() false end + def finite?() false end + def infinite?() d.nonzero? end + def nan?() d.zero? end + + def abs() self.class.new end + + def -@() self.class.new(-d) end + def +@() self.class.new(+d) end + + def <=>(other) + case other + when Infinity; return d <=> other.d + when Float::INFINITY; return d <=> 1 + when -Float::INFINITY; return d <=> -1 + when Numeric; return d + else + begin + l, r = other.coerce(self) + return l <=> r + rescue NoMethodError + end + end + nil + end + + def coerce(other) + case other + when Numeric; return -d, d + else + super + end + end + + def to_f + return 0 if @d == 0 + if @d > 0 + Float::INFINITY + else + -Float::INFINITY + end + end + + end + +end diff --git a/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/lib/date_core.so b/vendor/bundle/ruby/3.2.0/gems/date-3.4.1/lib/date_core.so new file mode 100755 index 0000000000000000000000000000000000000000..115901b0df20a32fc0933bdc27b916371aed5df6 GIT binary patch literal 1299200 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�Jhx zJV9^`AHwY&+3$Lu?oE~0b{c?yy9MhPA!K_Q(Xx}7no1ZQopXzYNF4NDF0I(3nF96Y z5)^)q!qar2%wEe;IYqbnX$71a0c>pv0jz%|02>jVbX(FWUqq)7$UZ89^b1$#2H%sZ@!2`N#g zL!jCXP9@SnGY;m08~VVyiK~h?rx0wv%!jc#Mp5a^Rf&u}Cw?_;qmlb{{|ZhI%2L9g zdI<2(U;aD(M#IyUsiJ=?B!pR+&QEW9vm_a%?djSMLDy83uy<1ef9=YMXlt#16K zv$?w7*?hdA{!`_jtZr=nC0hL>05FG`=xQhmQ{z!Vxkc~&$^Do7Rp4m-Cq*I$UFrxj zxb;U}qWo$nRiYOhE}lesn(6`J0Ua`I9KxNnRB{4R96)mM7@p2zCd#E#vD10wR{-XD{&gkRI7I#X)1=tB^p6+O&5+uP^7a z$MLGj7AiM9r0!9aeomJH^2xp&o;&e9^wjMOnbr@AP^dSy4eMcCxn4LlLs4Kp)r7s< zvuy)eW1u?FuC_wwWIk1RHdK${ieU96K4#csQ{jg`Gu2lc)8F`r#ux;wozs#iFcwAI zwyoQ?ZQHhO-?nYrwr$(CZ`G+$NS$QwwKx|8TKr%kWX^kS{D{a?B>|B%>qUgMT3%DP2>Y0MG3hWTzAnAJSL;^NZRMK!# zf^|Ok<{UwyeY!7%EP$YQV`8=_=QwMP@2Pa5YMfc{D8gT>vbp-NBF|3Ypbc?%ek-7{+ zzG{@pkQ;Q}!s|^?0)>>I@}&5!uzFh9;MY}?ytsIL8t6C#Zr-b*o~zQJ>8PzTD`#^aJ`P8+uY<uIb|8PW6UbOb%3Oej5r7g z%M}o&!>rgBE(n!F9#0=MynunXqu$esN4~dzyFUxRV~cl3=PuGqZ}TX&)y~(AgPGCO z?8mO}*jMb<0KwvJTQa53TNEs9-|KZ#E?ob?BWuP}?O5vP38O$FB+69rSVs;Vog}K! zlMdy$-`;zQyI&YOj}snnyZsln%bn0LTEA98YQK9GcU?TvXCecHKMp4r-!0`$}DAl}pm?&^$}=h&-ERi%OM%wF+Y{h+~Sskfd-b(=WRug91fmGtQht-8)x4(f_>VBcfqO ze|Bt!FMrPVlj6nsVx^JJt={`%Xt$hFT9v>KHOvs08Gr{7?Pf*g(fnfgGTl!L zi!W#-^Rc@6Me$d#Tr!Yj?a4gNxl_*{dc|!dK&NXR8#r+YJss)|MZq3D&(pjV#(|`S z_2{8;UxQoL2x~HS9ET^m&jT%zcro8_;Jr{>Z-5}57_f^^36<8YQDQ?!qa9<0_Frk= zWzCe`uVL$A9|~2=VIw;baFN*-Hl$p&E6{@Zo-eBlt5$_u97CUFStzJr*Xt!hbi=}^ z@Hcf%v?vo2flup! zjJCIJkKh!eD31hpl8A^WSH==ggXvx#V^^AnD259pgj*<(jW)iH5XeT3P_}5~4tqe8 zHJ_1&=pMI)G{Z0C`pGTJJ~+~v6gP;87Y#HTrZ6w+z?Uszw|jX`8ugorYfSG?HPj+VS13Tk8r&>N#bDVRcuU+y2pJ0oj7*2;~nC5%K^ zt62t`Oainl5Nx9}zn0Nd+jZZ_Ez=D7$qjnZ8}W z&klH?;x?z;jb6i1Rq!-)O=n z_ZHHS#Yk}*x`ApGp+LuLNExzuv)O_{O6CB8wdc#&+pNc%-^0VqJ$>g<%7aV8fC2MH zpoMlXa0P*_didXUjlJ0AH@jE8UmrV@+o=kF|M7p(igDTLit=6J`g}Zp2t9p`LJU}5 z^T+e{k8sy|}_>%K8kg zl!TXum$LmFWHuSqVJAUV?VErB6Wj`clXOq4m2p7;noF(JB4}C6A?fa6m{yRBhb|@# zpc)0I!r1Y^*xr}MyZv~1eI~;?zAL98h7l|gCDWjC>UU_DJ>Oy^QKayc)Inpn4of$_= zMzgd|kcNnPF^A!vmy|V9C5GAbNqPj24-#SuK&j=ir@DT+Mj7oj3=k@7H7U*LN@xDE z6!OxLuN^N{uG4*!OTPB4{2UcXlcRv4O!{$N;k3f;`MNobZXWfW@cjlp;yaJ?d_%iW z5lbt%9tA&_gI0;Z0n|LVCrt5`pIYxRY$%ldu;^5(K)?=^Ymx@lBJVVJ(*lFbSMKjM zuZXC{h%zp9!Og6gDqRR24>ex^Gg8>&Xt7#GZPje{QBw?_=U*n&lr3k3j?%+ODR)(k z<<#@K6S0!nw|m6mMolm$YsYG^hX~qV1R)Ld(aD2E){a4JTC-Y!Vp?F*Sf21xoKgd) zrnI-x50{%-fE(*3tjj)V?R%!oiK7RJrmd&x+TZ_YY)%L-NOm*=d7hCethTLXdUY04 z?QVLfx(p4Wx1^30z0lAH?zt(F_m9zp${|!hY<}161sd4{UY|0Ni(Y5&e4+k(Yp2l6$SDJ_bMv@PcS#ZD7R& z(7@NPuxxGvCLZ3a`N6VxrQ9kev=vErtboTEZwVbAfgoVWo*h^=M%}*qfn6TtP|cD! zGY?tySo74s2S0ZdV^U8q#J*BQtomrZ^ZQYXAGj@@SIb|I?EG&eLJ_E4i=fHWmC6@x zvmrGQJNMZvtq9Xy?cKT;Sn64|JYs9In>r|Q*tzLRw`V5XoPuNhB{^N)00D2dp1Yl^ zMcryC!|n9WBw`N^8N@_N2Sx?rOc$dWGnztP@oAx2SuM6?P3Sq#_G>pIUES2WiI?j# zPl1X;;A04)$I(TIW&x1IbTCeluf>yr0w z2qDM;7~mpG2^@e6sv^r0Kz+FBkzvAL0h=3Pk8b%c8Iny=tvpSil{peDy%tnF3ZUPM zxp_7pJ`m)Y;prB4LT&j1y2+HFVzh)eo@Q%gfUaFnB@62GRDXutJ&8T4Egumpl(25Q zC(qx0wFTr^z7tIG+t{gb$FyD!_#&@IRtu}TO@A+?>m7g7Q7-4}3hZGX^ z^hjZ`qJ_4?nm5>)I@)ahVN>he-%&Ga8_!<36GG1{u%|fQNn;|iz-94J9XCqJ-izL_ zBx4d_seHROU&k;4N;7&{oZ!$o&Qp@*17s6D67Wdgxy zq(ebFi(N{gKmNr7NHw`NQ9W`CA1Q+Xuf>iAUNSRN&O3pV(M(3fU!1ZAD>$KA_=b5; zy1GHG!Iz(4irGgWy%!hjh>csEIf=hA#>tq(j^L5p!p-i{l!O#Hu+PsA@nD)#b%}%B zuifP?M@C!`JCcFJEVw!kKt?Ovq;0F%(mtjbN&KlFkYF4Q6=x-H5TBOgoyLUPv42MR z)-r1=>YyKV!9)G_;jPTZEYeAE-LWDJYDs|&nFVRt@8o3fiW*SR-G`T(3F^cSRiu`v zcC?-WxRip9jiCtYW0q7i7$^S=C-?e%!vk@)qat78F{l1h$Je>Z18EzxM7FyKX;~DN zm&WYYACGT>yJn^0u|hXFcGv6Yy;29s1L#n5KC2SPBLa_W)jow#{uZ+j_UMBpY`+AJ zG5UhF03DnGdvAjN7N2)16!(ZyF|U%fFtkzz;&IJZj9l(ImcyQGi(?r{d3mU^X$M{l zSEZ?0)TEKb6GNA-8YvB4JPyA*HOwacu=7t`bW_RQUvy9sd)>UIAhYUg9`g)OAosEi zAu4gqSB-r=q0GF#mitUQ^#!$_$x3(B$?yW2^R|>rSX_E%Sb`kTK8d40y&Y&U5*4yjZ2>X z5)s%X%9uRfla&6Li|W+v)mTMhMq$Ef!9K&vOWLPa@W+Ey-_c01Ilt5$yB(9K*VLiOe)W)F1Wx9URnVp^o8_5$!Vc;hxuP+^ zWzLIyD7@WhXXrx*l#Y1|8z+Y$8bF+C#{>R3gYJt>|C8q+w1&b1F=|n4sEHCp4tKHM zaofHfV(LaA3VIuZLCKU}U>^3^^PFOU&CdnFLkNRBJh(c32)RKV0`RkDEQyH{cNZl< z(BGM^@~6lQY*8wh&qO@1xq8PEWi_iJ<#XPL->Jl{@@l4H*b6n1(3!_e)EnA5jb)l9o0lFi>P+2?xDOUM1aZK)J%*1mJ zbA4MFcwiT-&Dmz0ewcg42xE2ZU_gq#A?<^)>uwMI$AWZu4^I5p{H?w7E`xOmB5lAG z2C4O-XSumQjs1`2{c&p)zH#AC(-###vFSq~KXBhPV0wQg_E=tUf4Gu1PBq?e$_bP| zUYQkqMw2Sap{L)q6agtHy^2=nd&xP&akb8{rrxfmMDrUhri-p`w}HuDpodxRou>0B zG|?xtmX3WSFvxrHaFFn$gz)EZxO0#kw)2tYXzSJrLC5PH`Ulmr8D?q6 z7h>CxMPszZu|9X%iC-nIVKHLzz{5^vQER1%$R&BQca2gH2VjT#4~1~^rB3kE3#2*^ z75TO6*<}-uQSB-8aP8TB_ZNS30zRdh4i`m_3-;Bfrz%v}&zBnCv+J%`3DAly{70Xxa~2ip5VMp9|7z^FAX_R;dm7hL6B%w}aOrn2XKTPoJn2 z6BL7!GW;+!r4FCO$R1=h=}w>}&otTdOa_s4HZ0Yv)B|kC}mQ98- zlYb7sQjS1az{vu};Ua(yxb{k`m$&8_O)a^Lx#rrkmCL_NZ?Vw7c6@*p7)t8?Q;%J7 z4qJV(e1=bLqYe#3$W?yW`npuLJ`jJ(eRv0Y$ZgN%w_%O1m4XAzRBE9@9a-l-+0&%u z_@Gd1n`8a^z7rl=xTdJN)%)u}A>ktGL5x0WLabV7GBP-;Wneh|3@#P@rr%-Vq?bxU zi`4-;@@fd#I{0-!;19%zB4TZDlm2RPg4wsQv>NlYLWX4zMH{!+_(Ba%PtA-Ax-Dt& zA*M$xBSS5GQlDF|DgK=UMc>l($n3e0TTH+q06QBZAgCmpiA?u!ay0?=KmB(zTHh0WZ}r0SIHMlVF1j_ z+nK%D_#To#eq=g?T0bpwg(x6WL(bw_E)Y59 z`X{HH;~S`t=bV}Ax7`YARlJg6wU2%={d5c6bEt-|Dkq!uk^vJQibX-S!+zD&)gO_j zYzvK2%?O6#{(PxtU&L0ZdvnpP*4d5c`--4!}Uz?J^hGj6&y;0u>BGM}BBw zF#wY$DZc`xyh7w2O<6a6PueS(zzqp)Oubx+DPj}-s;u+H@nxEj4UBPzlDDj-u#eES!%*Ou$p%1nb3C*uVj#uy$};tgwf7oUIfdef~#N`z9%DX z8#bc_&A)g?2iFypVPFHLGJXhIn#T;sAC#|vT`A=P zby{wsrx$S>2gE#t=L-GNZ+>$~3d zou${C$*Y~AyFK3Po1Wz^xNr*aC_?Q$Jn;VIkXa#2=XDW|XBE*_r6O8h1L?@ssGRe> z0kCrePZnO!HJCc^;4Z0zw>1)OE&5Cy@LKw_D4w+mHv4Ce&wTD})Sf}|Fy9}z7{Qt4 z=AJ%FqJ!#(Hyb?72MBjfU}FUj9R|F0@Wpcuike;?#^zIY91PkXe`fif>?|10=xB;A zq~xDG=N>&3AARZGrkS69O&=429@|qx_{ORP@?!)*j9kg52CweJ7y0T{U5gLBZv;I* z2kn!o9BZkZGE}Hv;SqpvzknT{h8(seBBGrS@s4e+1{~c~&%=`NE$9idC$5Adty0Of z0DvI&^YtfTV+v3|UkUZV-P|)**jLJDE#gCoNwyFtH)2XXPG@>~fCMxP?$xm`m>iBH z_^<-w)#D9G1*Fj473O)WKyz`CC2py=poR9+pmi&XwS;a-PRVS?BRSI@lkO6xXZd@m zi95+iL-f^@y2)jhl_CT65u*UH51EJ+6hY>N2ZR}2rfu&IzX&{ zp3XV>NcbsPBrg7q3&=QyD-a^`hQdzy zx(*LnCTyLVS=KC*4u0ky)lNvLwbTiWWb(Ws_<22_)g@#6GrUe}AfrvXP!U8e%=^l# z$S*-5TdQ#$MX^LsHWy!d+xS>Y6q2ANeo zjg636XEDkAM<%ZAY;L9J970>7AZ15_gbncaS+X8yBiXvpww3v#Gd6C9)o_iK=o1qx9a#`OqisYA<-Rl?e>@mab z`sP_>Ii#7#_3>8J{ZU98U&L{oMmoXn~-~PU$uD+%h1Ir#ilIY+T`PVGEMJK4XkBe zsf%M%@$bXW^80rPTT#bkOQtw)k>xAPZLv|EU+=Kw6##uS58a-y^1PA_v_wxAlz0x5 zt(MG5`VoK+?hJSESWhXB9gcj&Xz!mIoLiYPLM|6uops&SPhAEQ<@u&7?V4+oaG)IE z75;RXBALLR2Kh=z0ReR=EX3w zb>3#^kQq#KxI`o?>lahksHg>IhsHR*8nC1#gB5YAdtagJ;H9eOI?>FdIl^dN3YAYL zU@a^x`|mdp+GbKRjq|Rse@d6W>hJ~(jJ_gc?Ely_;>OBYV2)$MuMi9L z`x;m*kh_$2LAxu}9$NWXILm1>vIFF4zN(d&JXxo0HC-^boU9%|uU_)W0XadV=)%S?^rSx$C!4|rXbGj7Vn(t?aP*RdP)B}(`T76DliBbqWWZ1GvkR?kWJj{OVA|h|PH@-fuse;W3Hfn7NIc>Z# zT{2#geJgXVK9PMYb1&XY->ZFW_hv(CIwkn9wOokzW2N}0~P1ZiW&r5PL<%oqXj zW`$>|IM)4UTqJ7VDts$sDWMp7BWpQ8EPTEYQ|Qh>BoNLR^ToGGM_S=bCRp}=Z5(5} zqa+>(tASeX23|;n$ujIS1|a!qg-~~ktV;9j8E~3GAQgnjB6Z4+PG}SWylzAv9Cs)t z{QOfTz~<5_m+H~lfz*u4?q<$`9=3Vqu+_Q9UgFpH-!VeC>Bfo?Uoxd;(IkVvN?r4g z3M}SY-oB-+&pfTJdPa3_f~?^O12#bqox(I!3GA=5_I1LB0rj|RJ9>+xvRE_qXu1>- z(${sT=m{#sqv||02Hn58PEU9|AcoXd8(W1*_hcAGcmlpW42ik98BfNY6Ht1I4BT|0 z*=kCi`3BFo`K%7UaJ?R^@hH*Q5txjG)@(s?0jzH53~bTMjV>PzlX2s&UQqRPh`*z- zd3rHFii|kS1<@F<@tgdZ=Eahb0^4%a42pplZHosvD;YryX7m#S)5lIhjqH3{D#%6x z)N0n+9cg)(wN8^KCHZo?#h`&Ste;ir4N7~Vm8C=_`xGVbTEv7>3%#lQfG)eoOvCiQ zs)@2Wa|a)iLgK?SB9F@LqBm%i4e?><$#89SPw(<#e<*N{DqF$6l32^l?Zd^d)X~x_ zu_v3SkNt>SwRvPhh$sfymTay@XCx5{Y3e9$as-rD8-PEhb6@+vY+W7tWh+tE*Gou{ z)osIs=L?wFULR2i)%e26T>C;-uf?(piF*v^R5h3M^M0n6r(<(FLu0vipusR&w+7jo!tHwk+2VM?tP zB$9PJ*?q)cu$T;2kD!4Do1W+`OF|AJ&)d&exzlho&I?7qq_eG)UpmgXJjU|tt`I+^uQI8To(PO^0eA96Mw>Ap>N z@CB4u^PTsM3;Q7tni{;E`it*k@WLtqm0zA-z(Wy1vVKh6Jh?U-dFX`1{_c#cHuF`G z71U2aDWc12m}iVxVbL|@=s~loYG$1VUC&4bOvF2J@dSv`5?dZ#2Jb8YK=IlFlX4~Dx*4#G9f5Z=GPkw=4y`De(`^IASPMx`POxtDu>UVuz5u_Mt!U4; zYr4%7lErbi!9H-EI%IR=zA~51^@RQLwHZKz;fIVf3Y|)hkhX(0$2v7#rryyHzdxRO z+0bC@ftfU)!mm*P*h)ApDl70$yJBHUVgsxUZWKKQqwEm%pS~;_@(C*4#RPuh_W{fj zvvcheoi7xrY_oM5o#Hq`{-5@QmW5+pajz2=b+N`}MYxc;#6Pug3fP=PkUD$%K)H4- zUf-&`@zAF%(`dnUG%hsnqRsB0E<~5MaO}<8XiFFf(C7tMr3e=`?2(I*!ZE5{bWn5_ zDl;eN74|;5N^<&35qEP)VpRe6D~oUK@zo3;P()H!Gk#t<8wWp(NLY<=AOAHq6n#x{ zE4*Zd<~qTHjD)Imjm1lo&r#Pf-{ge0{57Js0{`dq+xw;BQ`uSMzy92y-f_adV;-QF zP3T+Ba&)n%qpFzHs_U*`Z+sey-Rjd>qb>Coryem>Y>3#$7;} z4^&G|VOQZsL!g-3A3AD;QWM@9yTw_Yn-6TEh?Kzf&?H(bbhc%2FSaY*;Y!Qdg&;G4 zU{!Jx!@(#@(M%|p*TaG)G{KGeMOzH|_t+Xm*|N?SgkxvsViYiTS&8CsqK0y+^e%&0 ziW)iI4vKoTWgWh`T)oLpJFT7W^;(6MYhdS_&FYq-7bkRxPWT1s44Ae}uyMMPGkMo` zbVe4ypJQ%+pv0T!>X5D`b|O`V-?a2J)n=z!`pIsGRBHu%(-`>n8*2*Jk&5p%#VzH# zb63vHeYWSpz!l~suLu!je|o9PuD7Uovs+z1>YFSr8hpy;a#62?ual1W*r{7IR|W?l zn$aPPN2+I&Gy%5|QG^K8Fk;B^rDZC{im;F~`A>Ql=`MZ^9H9)lky~$}xd@lg&oiZf zE@L0FGYw1i$aMWtnS*VUPi$ni6yo1euJOcTVWu6d1rxto#>3o3D)VyoC5Aqf`OD59 zobFZg8?XaPHpplq92;DCCdbn&3vj!-_^$Qh28qOW>X@axslVzJXvc)@7amE^W~&pd z5=UtjC`A|{j-?!3@$`%`4ANpPneZq7_^5mE29Qb{cfqYg3*~@!;c994 z)(tF>c|o$MtX~8x#IP0yF(Nv?im)CG# z7fN4D#D1@;m1ht>nc$5$D7$|Qy#T>OIB-*Vj?BlQv$!-1hHepJBxnC%N_BfxDBK(y zG2sRFX@6ah1b*dXeGESKXJs1%>w~+K!8}~Ir(o|2{^F>T4t(aB{BWsUstwJ1fX{rV zY-py2Rm94-pXuxV2=be4B3W^#=GN3nh;_*5%DyRUZ`;2jjD^_pX0q7wbTT>K8ce)R zr4U%UtzW9L2bNtIfw`<&6tTii6ach{xZkjIz2gHe=<>4>@Q~&Gt`W zl6Oao!fpN8r$>dF-?PW)-#6l)Ktzcj#tRK3;#@sjYuc}V7y)O5Z*3k`~(5v*E4 z#(P07#oWN}03(!(giA%U>0cQsStNg&EIK(uhcUEleh3DZ3E^sPd0xV#XL(O6oh{5C ztQX;`Xdb64zZ(4%n66?%DQ}LZ%aY(R4dZhV6*6J{tB^I15N&OviDkj#3Ck*qo$z`~ zcT+}O6!m&o|58c(7RDkGnC32Wk)gd8OBSGcip+P;E{(bvUWyGj*nS$7@Hrc{lU>N+MR{DgPgvxs@gg)GyB6@DvD_Hw{+ z80*&Y?JM}=2ztWRTtc*p8Dx&}2N;qfQc(IuD_R5Lb$J0DZi&jjy;vZ#E?yH(TPAE- zCTyz&O*g#GxZ9cPfq5jBm@q6cxnGyHJE?s-w4dIeb0hHP95DT!mXf<_V>;=QbeZsA ztleDGzr2B(QA(M#l@dI*8&>r&^Zjx1g9<-4nr>$163tLz8ft2NuubPYL%b@X^jZ)0 zI%=u#Y>$Iv2m7X{`-gKv_L;CezE~cwBBz87nCYdsK2VdUxix2{R`=!UYf5j>ZCB)Kp5BeNYXWaP zzP3u`TsmjQm~Cq$VAkd?TCcg6ot$!O96GU)OtDREXOyBdu^mUSJ#4T4yF-G*_Sj}6 zUSeam?T}-!<&S&ka>HrOY$i!mHE(I!OB@SX^3y@o3i4?vU$+;6Z(G%Hf+24ft@L z=CdZ)UQ2ZG8L3BEE-cl%{ex(ou46<|JG+ufd~oSF$K{%I)${rNbb%jTSY?!L`Dubn zC4I;{>tie=_O$a8I%}QOSBI z=>Sd7F=8??%k(wAmxWG}^?}fr91jI2?Q04A?OS5--F~e2334He=T6C5;-E!LSJL`c=We22bH-IU%_TdXl-&Rx^sGE>jf7T;O z8}<}Q$3IXq!cnK>ROet^O!tC-l@jz#XxBzsXMpSl!$-HLU~7q?PLKOu)7-Qr?*4~r zp&H8(hvsC!nr0}2LCLM>PRe$}*ndkM$(T0onUUX-(3%%20Pnc^mfX&lQI{(hCcnN1 zVaOroj{@&LcC-mcfbHAA!HJ_a@z4ig@lRK-9x=Wsz7csm;;?pF5q!)YGZQfTt+`YV zCelrKoVMVTjNh-f_>iL&TT?R4_Utk9TR%05h}V8tRh^$1&}ds~nRcEC`HU>8e}eEd zqaSi&AhXtP^Ie|L(!zds2vhzo?r?a}Obkt+Rqf3n3RoP%5^p>k2h>jFzKFy9cScod zr`3T}&afh*od%zoP*Q2Q7k^59H*?uf_rI%uHXrTG($kALsPWaEydm|UE0(oE>gtJI zMY>Mo;49j*#^`G`0FuQf<=44Gu(X>pXc{fkhoa>Txsuv2bssadq+ZPOgDh<6;H?PZ zFS$X`^xO@^(iyjdN6I}$cF z-q7PbjlPh_zn;x~B@FGDdC}|HGID=En!R9^Xi32B^unHpD%OC(LTe{!*eJ1cSt)B@ zdbWMLFYB84HtVc?-s`Nr?{Ua^GpBQEw>Ao$f2?5_A|{c1$CvNZ{L5|L9V@p+W(NKK z30c+B^231LJqzi`q~8 zG$s8tAWZ%t)A(VA>{O2!nWg~ezm+50O0zgon-r_$$8tPo<2$4k68-E?_U>No+S_-8 zxJm8%uDr$x4QKbfS=&^xt*o-Kv3}Rh{B-TEjJ%5;!bd-QRL<{g`TgX5o``lng_?im z3ixs0K>$&%raEv>QM8ip-fa1f_4XwVp2FR&#|eUoVVuHC5}P4r|B5Zw)9_lth(4B9 zy~l@nzg(OymGs$0d0<^1rpoK`+&J0@E|^Cr9U2O)w*t&T87BBeb44#uIO0}z&!smA z21XZF*m6X*sylOqO}N){;f=`j9hTzfF6XZTWiP7O6wY?D-w$2;qo}5@ z62SHF0FK>}2@*j@S|*{Zo$)y{@SmhQe^|jaPr7ycHRGEKPohTN=Kracv%mlYU2oB;!&{y}|&#NtD5QAyvuiATRm4LqX?q)S~9j3u!edM;~6| z7ja5)3V~N0E+R4k1t^ice4eI*h)qRKAU>*Sc&?> z!$t?n&@thpGkk8+N$fyHIPeprFyT(R$?FMN2rrx89&>&mRJ3>qrJAGb>mog=WpZD; zKOj^h+>L?&4LQB%e?lg>h9)dzqf>GZeE9T-ww`R)6(;*&5FTu)sIfX{U8Yct?MnA! z!nHV?S&?^!dUT#orDzre^3vshoj2)viUaNyX`ugD?Y)wTB3C6x-cc;yFVuXr0C(*f8K{3r;1Vc zavQ!KBTmxAs{8yMy8pi)Iq?}v^gyOMi|XxN{FNN3NY9H}onON#)xForv{<&^ZB3`B)j_yBYBCL?4X^Jg;Uw0 zFZ5&poEKS7Cg?~C!~_ekz6*5RK`$|Ckvuqlhm0wP0#LS# z99)Da0{)K`;+UZyEe-HPN*g|8(43bSX;Ltm3eaM8wLt?rne*b#wCAfsIP36UJgw0A&)_oUCS5uEeUt%Rhuzlc|dHz`Lt^ zPX&Y6L=9MvH3O~iMWI?~z@t1l-hAgvB>=80xGLbKY~b4~X>i;P|kTG(Y|Y zk;_C9W2GH7hJ?I>bb6XbNKDRx8Hr6cg#^5hHOwojw)Da1lL1 zHA*7^kT!5p;+=g#9R!wYd8NP4u3J|@OAK$Nc_{pEj*7?jE0cRpO&BC?5Oz5)MVLl_A%UB6Tvmx&O@WQaUjU-M82LKj&iZVab0vuO8o|My5(kIJ7a~QejCHf%9aH}35NG7?CO@~^ z{hMq}B`IOvw`sSj?u^5W#X8CG7N%8sM@YbG3xK6iK80OaT3{z;uX_V!yP1z?A6DMq zL@0A~>~VyGmiry%{c9wru7FZUlPkF+ru;L9wJ*B(DcGpZwW;k%(s7x;;rdIDfc_rQ zqTlMY-$ zt40`HVx&oZS02<6;`Q+*Q-fNmLofbI_Y|Q?3=)ya6*VSc2vhA8=Aj{KnZMs7)DsE; z%z^4*YFLSGda80r4sHcW;eK@L*9;zx`jn{?{x2rc3~o>%F{p?3aQ~H{@g@{GB>EFIoUeK4L9p2q`nQEgNQ37_*I}JhaKZ=C)-kl}pkMa$op)oE=3KBKO6e2}RS% zD6;L-pO#~3T8Zjz+u1+e*+qsLTs+cd_4kZtAxk*uP{4>xsJl?J8AWh zmBK=h)vh~)6m&|_q!V+TBLaC6@~(USR>|f_#iY3mQAca6*(n~_B_VtFEHsEp?}Az; zfnCNE#T2`^$3%Bd%4vNuc<4i8-VE3p!}e8WS5!Z!!7sS|2Gt~B7BFd2_ZVcw+!9IO zfwRcH&-IT4JcJZvA?*t#OGKoDn+JdUWiG3YHK$K9ZiVm~eU5XTy&3F}kPq(9WT(R; zOKyyUGk*YBM0t7pyKaO>^tzZhB8q~G-1#jisOHqHJ>}4vaQVu6m(B|HmU3TfQ`0^k z0csiuy#hLpuTp|xV=9hO)Wk)5$GLT$!3Ch$^Tl#xXqsRBoz=K-WEtl?oebk5CA-+h zX0UtnSB{#Iu{X!ePx_XVI)l&`LwtYuB2qJ!47i$+e5o1RVcQ?6M`TmvgTeRcd4bs> zOOXQqo61PbX%PkS09Bcg2F(IfEXxwJ)b4rE%=9XWSRg^S!`VE0f(_58qnCgqw<6L4 zO-I>^BNupbK;OPNy~^CKX=5IwB{!EXmHB5Iz6MnnLGU3@`4tbSxov`K*}=3 zK`v$%NB}eCC=jG85gvuu8>@>wzmKR)meZ>X)j49WhymvC7$aZM2~X^M{~ipsA5-3g zOu5V}>O z?Hgr<$1YGrf5$2zO9{7oKvyWq+)=nfYm_St!;x}^`v(*SKgr~l4Al;(x{56yjd8!N zmM&bz3_~07Ko16F$Y2B@Idu>2d=#zt=QR^2OQa%z#ly!xX-%Jdn=v=ZM;%Q$!e_aR zDf*uRrbrg7)?VTa&OqJ}`ttY3bkB%heM9*@bS0W(a)$cin(#B_%$%FyRM7^P_^;QG zL~ZBhsYA3W9kS!R_{(AS+vw2?p%dA;RXl+iH5AZs!WCs_reSxzln*m%fQE?kiD5kG zg-radlFw$&V4G6|taXTR^rH$C}zEtUJL8_6?W zLK0Gefa9Mgre6mOj=E99=XG|Mt;la(!Dau7losdW*$EL(B6o5!0GujGd z&FV4^hNa>_l%6}Y99#J>MT(+spW}Iiljh1rXYFTr)CN zO0j0Jlaeas%|Rop?lE@5T!gME#5ehQ@9R;pZ|Mqm}ysNBP{nFi5ZuQ8!Ta!Eo)WRCJSbeMiJAPyvLM2MI@PQ=5JBjC8$+P53GZ5 z7O+LD{OX@XvTT#1u=k2i2l`y1HKfx6!iF8VtyaDE~$|A z<;JJi<$rYO-ce`Ex^c8WizVSKsEkmQj0C<{bLQx+OBPYF*PIpXe%-x=Zw_)w<7u>r zpTza|qeil9j-9u=t(7$u&XSxOGlxB!osFX*>zX*-SFTb#j>wq$4{_%d<7v=t`?hUO z+qOMz+qP|E+O}=mwr%{or)}GNzMY(leX=i4a_*{O89QRCQOuR=%#rv@7rS+KOp+>Zq&qb0*)aw>hbJHpo?NoGUG<^YRkn zQZ|X}TFg`YRe>-`C-9f;+zFN#h*OT72F!u4v7S_ozzx(i%+ssa8{5%U6SQX2Rdvw!ipeUHc^fk3FXo)T^CQo*8rOcJd*5~c%r2R-21 zv_6HW_74)8=JPxV!cH}{FC=lNFPl)`48(J&XNcz%R)c}2M0Ie8dmB5&2S?V7Z2ri9 zF#DLoUxx|5EbLN9eEHiE?VNZN`m_C5D<<8g`gZGjt+}yD=z-x(Lq&4baZdmGW=H%l zJq7hBT-AIdKu{8?bBnD}zOzmU#S*qfauO?Rn+X{zSm!5f{BrY^ED}KFhHwLo)2=xg zkyi7T9Mi}0TyuGyv81s)>RK3ZHuFdlUui(XSyHyJ(5FAPeH@*EK07Y=a~jIkNX_ZK zQ^IHw!Off?DMryq4`688|fRnk~gvHRB*wwFzTBj^FoK?BcY4cu_7(t|;DpcgqU6k8i2X z?m!Ap>SAi_Z!-T0miA&hckAQv=-Iv6*Z26{v_4@vZIw(ji&KNt zPi~tUPc)`rdk3c?hC1>u7jYTY@xZj2L#M`yRf73Q0V^b>dSLW;cnNP!Y3CF*FMc6J zhE~@!T~Q3Xwo~e_m5qJD5KS}|x;#}hmMxJ2v3!cqsD^H(qE27Acn;_nEsVGojiPV` zzUW9@lww8=JNoQvtEOvJR8vJ}ZB3gw}i4)pJ zTh!6^m-pOgi1%;gnh{z>vzi>!cn^!|Gj5O^dG<~hW(`$+m)PPy)``QcLol2HY>?Zs zCx#o?zO-_YUn*DwePxUzidt2bn#?%oh7&BEYZp?BEZv4W*Y$#6A&C}B3x@P70EJ)0 z`V4NMp%$(m>sm0e*3>e!zsSc^Hud0CbOVACYoy!Durslg7nBNqtGe4d7)Q7Nm^6q| zOIQRT$#?^6$scjQdzDLV;A9)Wet>;(;-Xu{t`TOnGzEQ$Y@+@-8`e!!tJLeG5h@uH zozWw?B4e!b{K>j@l>P_-QiNP^#;exL$K(xz%VM;Ipx_F5LK`yb>Pi?>48c2P#(c<_ zztXjmA%K|&A7cqIyj2-ih3%cX)kmkOoXXTU7i9L|{h*%6eFfjLitq-))Ce{cQ-r1$ z2>W1oK{V*=8B|2?gsfZE3?o?v9T~5+U;V9O1yZ#ajZ2%L+d0htWFugn6;FErzHFJDq9ttjbQSr91nLNl!mTPt!rO=sHiegH$G3Rxz&>EDr# z0?6hN4o+GuH&=fLP62)k6`jklKD{xAsf8x90!L@lcHt1WzK#_=>L7sx1-HT?lo0jA zIQAPA3Z}ga6JAhT%YjNwrHatqZjpJMM8b7S$VHE28;Uh?r>)W33Z?5()sA&4lBkoQ zxpC{M4E81>4C4$yK#auB{}&Jo@9GfF$r3LbTi7+L_0{&avaVMO+PtW38ajo0w3C6l zvJ6n&-Wnbft4Vaxo{=v4?StpkunfK`H5V^lD%~kzQNpt_tdLlm%(_;5%$WM^fl+xn z7uZidTN<&*r1{jFqn|Buj)1F_!mT-pEK$J(ftpC}YMh;W32qLwx`YFnS(+7-MCorLnQUmlM4>u@bzg?V=Zl|hejSb^ zS0g-+)=&jTVI#kd?nU()@Ux2MGm=t{<~O z@DFScxHq2|^Kd#C#Y8|X`PIo$O=K3?)=W9mkYTPdqn)>_Fr093e@PC+CcjGs*^(nw ze;Mrh3zfp6;W~lCB6LDy=bkEhYBQEsZqyR63$LBlX7M(asw{da0SC(3imPiiGr6Ul zz&QfW;c-sau(rsol0B(zw-?vBec!`SDjy5|i}?$=)71X3(oJ8-I72DM~*+CQejswKh`Z86@9tZ`tmRk{1 zjolSi<|LgOwpE?9l%rs}ZBcG&Bw%Q(@5ZA)VoO|=ZnK3WE4h!ExlTr9Eh^yVj|eG< zh`ac1Z=8zLog@c&&{Q6evRO>6>xt6l`WVch15r9ehvOL25a#?q;1;P~f7J?5?&DEZ_XO@V$@$}wprTp){d4R=#X@@e7Yi5_!TvklQRIZB% zGp@p@IUGv1LpCF#L%eDakj=#=1uLuIA(Z5OA|ccMhqo7*pb0R9sM*v;?y1?|n7PZ< z%(q)v$7)8vc@}A1c}BLHo;n=4lh(431rO=%6PJVym0rnfvhyPvG%Gobx)X29AR9^v zIpu?P_T2mX8ENv6l$fe?Ol*IPh^lbB=BunsVJYwMb99o zo?Y5GU}obJL5EUjiO_yQ`D@?TDoy5sl$;hfm%9rV+&?OJm7ZL(@>v?PIQ#$&SIbdk z)+o~#ndP|0QNZ?sFYojOKdWa}z+MzG)NU8ni=F_jLPvcsmeSWiw#Y85lFrloW~8Yo zi>BSh6!&Gnvp7|=WjseVwWjd3K&V?xfk6yMm|{v*NgqDL6KfJzKW6Y=0v?I@wdYho za;R41;a2*aW0RpuY%cpF9Gt=9>N^h5CUDg!ly~9uW-00Gj`%`kdG)n3S@VD&V4{A# zR)09PX1{CLvA85vQjF?!uEekA_x8NfyK-wgQEZ~R2JYeu_~c`^Pjn)(K=a$+X=ZGv zIr~$6POY!HIubvPJ(egpURiUmY6^HIXmHF)RM+K*Mb!RmTk$C~ zAu|I!*3A@4UO&>E#Qu&7KKu zNzBRwAEP?#UxZpgBI58QVjar-2-~G@jy!Uzuux*|kVc<>LZ=>4Dp6|w@85&jz21AO z+}B0^nXClW)Oh{*z@8t|!<7DXSM!`4#<|hE>G=TOt3!Xgsm4i;VCw~Vzv=7hUVVKO zrXE`lk0*#HwcG)!i9URYlc85K_BYw}s_D*9##}q8UZqJXN?gTF} z$)&ZKlc@j~wZvDAyuVM*q(D~`^h(0ECJbylWkD|(2tSamf;2ft2K>?}v3PYNvTms_ zyjlBO5@lkvOv>}w(w_*yXyttV^*$aNB@ep3%UG0ix%@#3r8^?uS}2U`8)w9)wNRTQ ze$qkQ=S$2$mqF?mnR}zs4GM4?mT%V}8%3>Fq%~4G>SsAWMnT|%z7K#Lqw{*RkHuuh zzb1F);YUTMSi<~dX7*hya=s=S|ErVRR0vYeo)#lENzLPWwZY;gD7gcEh+=V*H!#sqp1u&~xSyR8@b|6k4HqoL5yNFziJ!T4%+nn$ zV|-VB?_yIEp+YbG?>^I-{?jtKugT;n#au`d(+-&d=biJ<=(^pEv71x$MmwjSlrk;0 zS=Y&ewCf{Z3NLDg@AV!za$jBoW&+(MpbdF%C`%HpmPksh5Q&hAKg4snD}FvNzRyLT zt;8xEh-;#3m{%Wi1$uP{Q(l!V-sSM^+kg})^v|qhXhhZV0IdMTLW2VE-zw3!5sIfH zRw|z~-_Z4in1WnSi>ee_bq3^p{ptKqXd1v@VG(1BAd+``B%-VH%+Qlom`+GEECC3W z+19yMa3MEuzS9l7h5hJxpOw2|c+aJu#af=xbsT@tS!suZ18yoa+<|0GJxS0MuqU*0 zQ2qGPB?pth^(krN)Ns)sG}?0sKK~e;6Dh+BNHjl~aLUw9@HmYwvxtvtfOSAY3tftvydMSUC%_4av8krtQe!7N>fb zEZK)Qpuhd<2%RSHS#asUxi9?koZPc{Eeyo7!WI{O)D*8*tEDsY+L^8hKqYiR6n!M+HMp~EtW<1 zz414X{fE(R>$6F6zOY6XqN!yjPsd-|%H|%Cq<2D;y<>cp`-ic)rZiwLw5@%Q4x(w~ zsjY(pcY~6BlkO}z&KPK9Mh6X62ro^ffzG&-h~#NJVJDTz7B+n>j#X&OjB!>%AQBsv zJ(g!>jMqHrnn0xgA~S5I;(rNVHviPi>rJ`@S6=1MWPr9X*v`nRgqX z9h=#ahBtLjXPe)YS!14m$RwOSvtWV{wPysr4SR(BVAX7UQyV`5CXbWiO3rsM8*chm zo=}k}sf}NeNpao}bL7w2@gBhKWZ5Y=Q@m|3NXXWvxk|Ho#i9kx8l4|GM%2h!k`*j! zkfM-C1C1XUexUF+!lD>6UA%xu<8#Nkasg$;=t2K?mb}op`$3jC(UbRFg#|@cRAJ7j z@MgQtsZ_ZsMEAnZY>Govdpl8AGbB@Xl;7UKtM-#8XxI!U{>t}iXqew#;8WWWfPq%? zr{VJD6#IKUK^VQTUL!1APKO0rw_MQ-r38ZSnF3|y6Lp~3gkg0X+N9MT|5jO|tQ98@ zTxKWkRIDOTSg-VH$;uCd(NloO3URlb|6Kg_PI-XR0#}Gp8}WxqBab(MA3Hh-gL2cN z&DkFYc2Wd4W)4{Fw>3CQk?WJPg8=4dd5G~6@Y0T3|0O57JNxDP1wwPFpmpc^_z9?g z^FoPbuwvAbaW71TiXtBVbJMy^~D z#OS<^?XCWXM^L6IQzFlRo!P?ohW6)!dATrg~cDHA~Np1v7eQl zeaV#6aUpJn3UNBPchOmDGJnSHEidS8S;Ti(9Vc2_%qBL<@84Nh+8}+=8<_#aV$L)# zW$`H$1GG=7hE!~ z9^X^?)NzQoby|}r%*gf-MtAdXqh9G7GL7c3JQ0oZw6^p&TJ_w_*p~=1HnHJCG{LS6 zv5;)DK*S{-3HG0WFQ6&M9%od zve?Dm?`DhQZ&L%D8QTkq8i0%18~nS~!$kJ^x7(?R>bBRnEca2Voej8#$Tst)P1MG^ zrH_~m`>MOsy1g+=myz>Fk_8DpgI+MN!Ij(iCw*y7tA@}aMR8-ZyKpSwRZXg@BNxgW zh+^SGxM1~NbydZLy0u0SQDsA@u5pIu0eIhNVJkVh$6i%~K}7?LLJZ}>px&#o@$YMC zHaD}%1{S55oCK@OXcc4gVjORRm32(Xz`#EIh28>T+0;y&3#b;gt=U7<>QRjTO^6q7 z<0yYp`!MN7(yEpYN*Z1^y>@F_5UXzbWsjJuhWc9DnlOt4l$L>I3r04a#P;6;vbDP= zo2(u9UFpl~Lsg@0JvdcDY^xtuw7Gx72AaX(A(j%4!DXTbC^yIRFEwBdV{G-<*cn#V z6P1mnrD6~@mH(XJRO75^(ecD#CgKppEf+^zxx&KvIE~ms4DDpHJ=ay=EovJJ3~aWl z7%=iME77J~RU56kVZmvOTUWmh7OKmo-+>d!m65UnccH^ z&2xJ#OW4Se6F(UOu@6V(3|BtXjD*d{%WAdt&ut74wifd)n5bAJI;AYtYP@yUh1=Jv zSiYZf0J9R^UIjcIl59D5&96yITy2cu$C~PgL`s1|-K*xyA#lZFoPDMyK(mzyE!E+n zU^1)y8hxjhHDJTyiW4Ixe8oMNidWfHw53E#9g<*Gtg3w4Jgg+nAP% zTFIQ(sk@_O4z)UW@@>OyikjFn#%)MZceB+if6C#@Vh94qmR2X%RA@y%Yjxd2d(vX) zgQ{5Rt1y;|(kjdyZq-lLy)t75dy0NE#Ow=AslskSM|8L)$JA_-`&%xv%r$twnYOHb z;dt=blmVN|?2PhM4AqwYd*itm2EyZ7z9`}Q{%Qfn<2i10xy6oSS$^P4h7DZ5Hr!GE zJZ0!_=oK!d_)l)nNXuV)2(zM8@+{!s*3N%&f?shJ-ADDLGha9kQQoNSO0TzxO1;ub zhyM~+phG;$dPQE)6IGD7Z_6+9pkLzbEy3)9=A6aR^SZ~a%%HRwOy5HDt!)3YN5YXi z%RXg)C22Gn#)Qh*eA^L^GNWSLGuzs*FY;bRV9hwdibmu2G7yuK8u8Mkk!#U7$WhWe z?B|tSXW4+mjczh7$>sG_edXD_YD^^h7Fp=E+ta4o7Vl8AQe}8z$XK8{0*pbALf1f^iv!$k0M5X{008iE+9h;Ngc_{T3LR@ds&L&)G z<#z!dbH&!c@~@TLoX!S(nHA$SCXOxk6pm$H7v+`H7F!tG@&)JrjMj!&4)s%e@A@B~ zL6>YRo3=PgH=Q%)W*JxTqgpc~Y_$pPDi>UoY8LS3RSaaqm>8695^)&_hOuybi7%b`xnyh{(jsDT}9ii$z}~_ zb?e`1;J;f~wYCx|?U9T&S7VDc>(G94^J7XX0u=#HE>U+A*7kFon5vq7b^&YlKhe9a zx;!W{&s^F&+-PCXTwCGXC_hhJxR%^*GV3Qc)MpCGYbQ3he<@{OB`+k#hH?F7KW1Vv z!Ctwp1#(;>3O{tJ;lr;GA$OI%@oWl}e_mrFqQ7*qmwD8>FHVf$F4vi=^P=Kh z#zac|=wE1f)T+-;8o6%LUl-;^%-f7bL;UD_iGJ}cJ~&6v%sU!!2&8GN{-VjgckVFV zZP-T=i1Wx>XfTHTZN$@==9u=9XfU0Xm1we)bnbUq(Z&f24%4)gr86GOfxc9FPImub zu2<*2yf>rV2fqqO2R^vTOnN`Jna_sE#GiB}lv)m2`zDh=JbrHer39zzvhwxZ8!DjU-dLl>>e5MfaW!wTmPPD;7hf}Z`vQ2 z<(7b8KWnL&BLTUXQuDJ6fp#R1db36)j-u>y4XS7s{_ZK5o^{%C>FvygJ$**i5@@C5 zwSC8Y$!CrN%$TtgNo5Xl$YZ%HGKYUdA)6Eyg>A?6G)e0E8!#8&+Qjk?tG9%~`#b;7 zv;kC*kq=cOUsqO!f+}3UyxNMXN?`9$jgu=o6P$;$GSpTF4({VrSZBv;IyiaJDuJrU&&btY7XD9)nhG85U|k2PAH7yW+;E|pR-85YI$*zW zl-;jy&*mo!@#MG+?u7WSHf%uN1sk8X(iJ(5_WjSYOMVCWM_e5n2>f zQ~+H^@?^H7>V?lZPao!C%u|@49?-?ZG)NP{_Wt=sBNtmW6BxY_^c-{<&8OJ6R%b#WVHH&C;7l!FuE&Q%cIJytr z=(7gtz&^yQ8J#uQCZwXPRnv=Tq&&vtBeyM`$`-IKTTW{nYzb`7gSzxfswHjTZ)e*=w zE9x|*+YXqV#`(hfZ^5hd8SX*{>Z(~`$wdu&@QDs&8CytYj^GOIf#s`e!_BwHjV%ik zCZPkCD%%(t8q1<5E|+Jq)|v-HgUvW_V^=oL?wG%~?5)8S1K3+|nZ;R#SuQN;I3@tI zc-JhURa=OURk-IG>`QHy^)|J7`x=8?t%2T_AYW_nkJJ`_8`^C_dX@?;>XER$L4 z459N4S1)M(uVpTQiSMwVm7mbyB{m)Gzy7Nl-Q}WYP7fWM8evEF&c+9b7oT$_77sb!|9TGw`p7llFG4S^nXxKiFXD2MgT!PQKV@u~M zn*$<2#1opsvA>epqvy<#x!lt!y!!w=tOSS4h9^|wh)K^6d)5y^2n5H)`D8*N@&75IuCGPjfc}YSqDCkP^6T4zWOAhB7DfRaQ9cW`ME|2H0{6M{Cv-Yz4Fb5 zPh5L}j{+|k_{WTkQ|wx8=GmmSyb}q&mHK@s3tey1O7>{^<12GMRe7R;kJ(tVEEnn4 zu9K_2PZPiZ9zm>%f_kCT8#WgOfGVt!ZOrk~v!t+9;e2Hz7Nar2(Il#QDKnwH^FSJZ z7B!U-n9bt=3KQtv8*i*k%tLe_aAKD2tU$_LLuQSKa*kw9pFuYC7P{`d7bkoiI~*u^ z_l8lupb;uKr0k}GAHe@?!RKxP=R9jS$}7^G;}}-<<{c~lpf4aeV=7MRuET#~>1j1j z8@LdmWLH+}R=sN6n~8L*n1a_`<#4ej?BhxbCh^hC4;SwunpBHw>M_*#oQ99KCRh?` zgzWa#{~3JV?@};UUjrOKW{xq^2VYvq-kHSLrJh$Ikk>`=MVcEcwMat6i6z=39gk@4 z;VF1gxIMt4!Jm-gr4a7!2F%R*+vc2Q*vY07%$#nlv<=(*+t5S*;%F<&+HGuJe(MWP zV&v~c9nKY;{`D@T1w^tS-}yQ-oc4GTdi+iiMzmP?x?!a9oG;MzNf9(^b(hOeJ4N8E zXs-HK+21r>Z(ysLYF*>!Vff;sI5z@0YPYscx1|7j8igX_35EMnH%-2sBdpo8GiWuVa;4@pa9O3yA z;uc-41vF918ATbr&JPY~CUPdt@bKPd>h8nBV%lvYn=%*2=2*5YFdeC5Ax&5}xZoCP z69KV3p4g`~K#ykR9&l-XnSe5K+{<3j8>1AGsYAt z`+f`pKR4Z(QKT&^VhC}Yc%1>7EaC!Tb{UVe*cV;P13`Hi6Nm1BBw;RYa!<>KBGepZ zPUq>wDOt)~4gtvHbHMQw;;He(Q{(Yn{hs37JWZXsf}EPK48~T6vQ776XYEkdT@{!h zf1h{zhbU|xA!LzicHVP)eQlSB6`wIU=4L4BcaKmb#!+Btc=xJ!Cn`Cit9T`=R!Qs5 zp|7^VW{@#An%J!i&8I@at&LNg6ZE>;bbw762Cfzwg`a0@(u(G~$^_4z32MX>RfX-z zX;%Z;7u(!mJMMXP{is-iL5KF&qKA4$7^?*cK!!5q0j69o(4zZE$pPCVmUkd6!^ADq z!Yv*RT1Ep-m^GAr;~0ObcZ=x82j+k*|lT5)UNX+&C?P46BXdBYh2TS?K zqvDkuU5cD9Hp+5qd6F*O1QoZgkkbkSEIwUh^;(=yP;6FViqw>HmK-u;4HTY`px6r3 zl*ywqvL^uFc35%Ci#JVM*gxlrt@iI1F4}g}iQ4TtbeYSX^2cT+sX0L!~W(e zWir)71;d5=S_wb1l|mUBL$QJw=(~LkT2vdS6(~@F`zeZ)C346DjaEV!ii8=uqe<7K z*LnrJGj_uv+&N!A{F{*cen;r-EM$J4Z%+#Y7yo#+5ReMi?L=1Q$hs-4nxn6ep7-;p z`zQb{vUeJlz)g1w(f?az$sp-sIw_KpuxBEgEj|TZ!h7;Ptjtj$lMGB`1Ge;#OxP`;B8Ut=UowBz z?>>0Jfc+F6@+X`G*KXipD+v3_r0IpvEwnqN49quWpbq8p)F)9#G^`HH(*o+2$0sGb zV#nbFO#XIItfeVQGE;8$@5iqS@0(e#^0fk;2B~NYjUtWemlNa9-i`twIcjDDv?o-t z?%2IN+C#*H4IgHsOYv~lE^yRy{2nY_+Tn!adD#>z@i8>~%1OmSx!Zma#oDonM{ri; zm^W0kee5G>Ck29DATS)?`hK)dHFg}Tu0e%0!H7_&N8jpw;eEDHY`b1Vm!bb}qE);i zM_aE_eG_50D<@{?VrG*;IGLxA0PPb`7tbht4($KXt-{Z?`xX2Oao}pj1}2kvqA1jZ z73Hr{ivJGWThbNu3?#c?D}g;zL9uky!HW?H)hSF)MayBA-Lk2_2qYo*i73aKuTXw# zn8vMAxkYBLbWV7tsma2ga3B3;-l;-7SQxoXym|7u)T2n^$EleSUt_&R4tz#h6l=CZ zS7ao7q0W`_#w-`-^;Y}11H6DM=$3L6Y2LJj2e?2{DST|B;&f7vg>n2J*{g0lbM?A_ z{jZa|I<@Mpy%IUE3K6IkFn@SZ2nL)Y^7jqZvk@EhH~J5l#sX}9_9OAR$OZbej{vpO zqdpdvwMr$7n&6M&e$FVP8WR=&pJ)q<3^3CcSg!CCY(YrXSvGmL(7_k^)k45eM0;`N z>!G?Kc{e9xj_bq_Mk6&g3=YP=ki=|}>fdlxv3ZryW|*R&hM@>^3yVn!lw8_)4;}m( zc51=n@>Pdp$V1IbzFatdqvE;PPy*6TPi8#wwQ)dCf^2L5Uz}w)fsfa->;u=~dfrMl zYJ|k+M_2R0t{Oqrt|cy?m9zRAiYs^t>9L0a)s~5V;38eI8yu%)&Ev{VJO$Zmg%+K8 zcM`7P$1TE^ZJHYTa~u}h4D$sh$YAAPuV zEQ>wl3ALCkz;PS3u8iY^&1~&`IAP>{L;0x zf)>MHr=9MywS%{vvOs;I1Za9%G?Mey$NgQ5}|2L4@{QF9D^0}3o+qt z$TQL`2onyVBL389aDtg^4U$nr?u_K)&zQ|sNYuDtBaR(93QsS^ne!P8cJ|fwzlWq2 zHgOROzL1Lt6O{sy5J%Xm;USdn+jHYnBw9VB+7oAk38oR%&$DLwVMUK&wGl`9`90iUWvN4oL;j0M>hb$ZyYBkoemyJu zQU|C*{^J{g9|!nBeh!}Qru272pU%b{wVuaKBf-*SsDCK&ly2JGTI?@Y->Pvd?pch zHnj=x(FDCSSxi_83Hq}Nz8e@fJE$Fl$)`&m6##cP}=r^O1)8xIM7jift6BxUB4bF`8ICjPX6 zJ;E}EiDhM609Tp_nP%j8DCCJg_m1?M59-toJ4A9M&~{m`EuwzYmJO);4rRkYR9b2T zDKrf_5ueC>`2t4BxYGS@-=B7X@^@TL-rh7ws#0<;+y~(7uMs1+{5Fi0trVLOZ`GV| zHr%%GJ2w3Yf^l+@S6}fh;+ zH%k5|_ob{E2gCH!Bz+BC*S;4d$<|G#Nu?4Qe0615A^wjWd-lr#YqX?KicfUcL&CMa zruh`Q`#^Bwx%mX%f${d937Ayj-{#qN7cM?c-Rp$IHzx9+%H@e68<08r4@ zh6BSJTJ{+9?$L{X#W>4fCfhQ0^m6Fy#%{bO4}nua;>99&il_)rE)bjGc>-S!j|bLl ziPhY0W5Es6WmErB(J#0J7E2qKxTO37Og7j3jB6kii|0n#KanX-6s&J<`~1EuJ^))o z1TV30G`9$(!7tAXS1D?@uQEPJE(K zpvgi*L^BW>f46U-8Q_fPM@59G9Sdu}w4A~WD4`e7fhLQ?#SI1_ZXhs=cIxFwIIxiO zdc&n4?R&kosf)?rb7!AM6A}565<*%mt^VNVrf($jv;L(GRLmV;gjmwNhUaoOyI2U6 zJ5086;a&@YO6?R7xi?(z`kMn@nO59FxP6{W8XeRkFRd@{f(|6k)hQw;vB~8pPAgO8vn?b=l>9t z7%+8@$AY7E93p4VBnRV3pzqu=iHOQOl#8mo*$R!~Y(ud7`&+No9BE`)bKMvCG`vXz zkDw0hmp_TPJH<8*=PsIk2%FyzKdU5zJg=FsNX-SXkui=SJs!bo|Pk$k=_ZtR- zkHNYe5iQjRAXFN*i!4+!H_abCgNXeupjHRxo~CHDkx6_TArk@;YmhMEj#8!x6+N{X zRo2OX_Aag*92|kwi!;Y;@I*9LT%E_5KdFbKvFM2rS7tp^2zytp^kjoPUqZvnABCBA zXHSQZiH5q5Y@Bcpsr4dV?h09%=ENTtoR-x!^xUaeSMru-W7!^^E)H-JgKp?sinb$L zgjjjUm|FOF|6t3A(uwH49X}eNhtmOwY7N>AqWF;2#qMSZd{F`VejJIa6s%dC5b`sm z{kz(?&a-mgl_N%4q+2ddUWqb>)gJ>a7gi+dOf+eg(Z3T#TP|_UyT4k47b4c9F@9L! z7nE@MwqmyVIO+OR?fyI{H6e|A?CdzntaHlNRC$9vDh2A@$zik){ zR`Y-idlbGg5?QH#gvHIZ6j@#BhVbyw@8LV|_4;W101RCC4g>ZetI)w2t-DP%X&_Ub z>vSiou$Z-_+>pq>XM)P6U}>BqIjmBE?78CWya^#AT{MP?etWowTZ38nF-9z~jRj&a zgXm&sl%Qpjtzh99iaWz-t&$2o@M+>)**fvPJLCCck*zhCBhhM^MkkiKsipPAwVQQC z>al?wU2xOO8ugGDmO@N3vCzc2^$Ed}g^E6RaJzLx{!<3jXe@#_`uY`$Df%osO${`bpAE6i5~Fuus&T?S#KGxIm)fo z9VEwJsRp&AX}?ckLaoorofH=FM#0;kv$O~I7RLQmD_vp7d?v+Ir+2a#2wl!CzfxCV%@n;6qg46p$ckcu_hpa#nmZOlS z%?jzd>K1wJh!vLgI4_jRD#ASNZUd4XF<<}6MM~UCCJ4Bzwm`+GPBwMGQI#c{xF9E<}m zTTZZ4#CX(`Slk6!uLzjX<&RX111lZrA96kVj$YF;C5Z7Z+Q%6lk}%NAYGOnSfK?3X zT3iGdq$ro`M%I2Nm)LLajw3gT-d#Te{eRCc*`7En^JfDz7$2yr%lQ*$jeQ4!s$-y9 zpfykl-W&MPYQNkit7*F_RBCQXdh#9`owe9gZX`S6fE^pjo@-g)h?gd21Rka{-w|VA z(JEF?g)80<#;nI#lMR|)f}T9|Gu3yBy63*Hw~uQg3ls2*Qx;=gV|ma*ZHGDMd|yXfK`ED7!J;z>`vu?tBPwMoe&ZzUWj1=P zQFf`ciANOKDlJTrIz2XM9UrC~D*txcX?68URE`3Sd_F%9R|%F+RzJK_SiIy zgID*@LloqXM1?gZ+!I(gDcc?&<=fl@J4DVQL8j$Z`8s%Vyt+}Oix_ve$N2Ji;0Gz* z5f=~MVB{|dR?}#SzJQao(TG4Hd;{vKT6dA~Q zM3v_GQ!&`Q&~@$$r121;$8;C{mbuNaKoM|Uw0$1n8q*r=)k>9^T2h8yLf+N04FIex zH#O^O=ZE9nxoz&!9z30=q$FuU7ETK}bBZ5W!HQS|gzmzbAbS^bq-cJE8=U1XKLSNA zgAdE2zkv%fGjuaD*bRMna{UwS^UH_uZnhI^v- zxnw5_^IDm=#($t;WhI#lBBoNTv)NE_(HeQO#F{g*<|B}SEDJ8sn>Q6*Bwg~(fHNu; zrw!XImqN!IL$-^NURCtOpHrge3-fg}V&_N5)GD-GkKy#fEw{8sae4ZE<16v45&mOQ2NDC%O2cyE>_GpUU!&Ui?J4PC<)VBF&u@ zDwnrQEovBqDN6+jzw?{>+Yj$;D^%yUkCeHy=> z);MKyTG&8cV`?W>7SOMKKfitb_=WqGM8{C71sW-3mmdK5g-SgtEhY9VsJGH@ko6!r zZUe?7q;G=vq4+mi2#IgYOW_2^o-ahbjy=~Z&Rw-X0D!KFSIZAzXRa=;IR7Y4Jx0d( z+;>`7Nb~ve>DM-y{;;|-NI<5-+9uJZSUcC4w-A76R;2;z!I;VVYasd9qr9@==Crvh z*%BF(w~44hHe{2qp!%y@e+*{&pi}J^+91>P%|~pLW85X3?*eehH_`VF-+s@B?}E(^ zpB>V$9w>xO-|}1!)xOA}A zMX(A#WJyJ`wiWaE905hsVp>(=&(@7Uf?wHIUevXJZCxA3*NeWkwzmGY|995zPjOb3 z{jJkRy3X53qrkr~if_$CIO+PIQ9zJu3pmZihj(!HmbcBT`kFOD_0f}dazq%UQ4(23 zOotC3?m&^Z$v(!XCe^%|cphibQ#4KX%(RZa_8oA|C-aA`H(1Lha{q3v8Rt#(F5UDz z)n{z8Q$I2Jb-!;bYjO26&CcJCDW2yCH)i!+Y%1&Liu}_jPTZcalw$EdL=U>Z#_@9ler}0@pf%Uw6 z1q~q}IWCV|w#liX=>AQ>8gD4C@A-Chyg1Yre!-v^-e>t#z6aJ>5d*L#wnYin8Y{w+vxYsIqvM5x=kMthf9e(8$rpBDI$Ptu%VN4g@>H}yl@^FU~ z{EO6U&Z~@#={qrP4hL=5nJNjKg^@%)eFWSP7aV@{K_DtAU9w48vr^w zOmGkZFy8Fep9yOk@W8TOluvp)gtJwj&AASag>v$D{JU(5@h_d19>oeV4AQ}upX@Rs zj+|?6-m?W^g%jyh;lBV>K&!vTTaCO)X5V2s)fjI9_%@hxv6C;`R)O;_E?~a|r0Sxd zkho<69-UD_F;rwLtL#bYA}!n7QkA_F*Cazd#6IF8E@u3m>6<~*I>yOo#G9*m0Jd;ovaM9WGVA-|5F`}n;Fhla)%auTg# zJl)Z&0iQiz#l6uBJVmx^snb}`ld@Pz`GFD0%zghm;C}L?zKUm;Nk3($(s6@?OYkNv zX*r=A-Tk|a>MH@I*u9eBzHu{^R1G%Cs3CEp*5lSbHdxtIoT*CLM z_yTgEgd*liW(o0Vn#AYR6B9+$DquQ$f*`(9H!)|5-*n0AL4S66qVGd*HPsomIUOP< z(Q5~(lH|OB0Tb$hcIl><>R$$Kuzs6H!)4I&wx|r+cJj(l7!vaFgmsH(b$sHSyn9vsA&MwrOma%fh<7%JhRW|1FF`0N~q1_)l z0ePwy@Mm2X>Tbx3IeM~gm4t)L z{NK}PqhOUerD(hyGjIRxQQ>El{%A_`k-U$NrLQLuT^+|LcfcteDuxpHbeg<+UXnb# zi+c4e%!ZHei%$i1w+du zC~sJre&6i>`JMV3y;ebT6bgIjJ4+a|@`Dbwr=V6@S`i;N3_!rcT7Naaisn%CbZ{|G z<|GrZ>V<=IqgX^bvr4joJ(3jrs54{^Q~-P9J+x9swDU8gn>FX3>zyb_f7wTaJihV6^9zuowU^*W5Zh!{lP8FXIev>nnE72$E zwB?Gm3o>m^^ldddA=gf8x){fi#O0I0_M%d!M1e3JPh{Lvb*k#`At+P=pbeuKQ6Z=uXvHGV#NF zL_bf(pbnjZUJYg_OE@&u%)6V_Q?X_OfV3wz?y=(EdZ?;*WYG!C%kN~;XXM4Xnfib) zRNxjqW)Yk=>f)@r!Q<1en{RU}qT)z?cGVK5v3 z@AFnzup#2&j3+lAYRTT9vgaUFP;yC#k5N~Q<{8?fiZ>-xWwlZ!6IRqBA$OBokWFlM ziMlLOxG33cT0HLYv97n)>GYy_sdS3j^{k8pb_%uH@hGXCSej|E8Wn4UqIdJIcrc0v z{+{|q4n!yMnC|ZkZ&KCp9!E4EE0HUg3g@##`CinE71neNaC5ggOLMk93#n7mW%~@W zi2B+~A+0w*>C<_$-$~Wt{g3L8($fQ-F)I9Sr1wUT?gq{(>c=pJ5d~6HZtB3XxOJWK z)>Wa2wF4+(@(Bfv&~a@Zff~(_G<7j*ftW}zY93FdYO36X+;vfEj%42AbWS4Ktw;w@ z(I)_bUf3HQ*yre?kLl4-x*s>AWOQ>yY*DL0e+f3@wFnoz8F?sOX-BsE=Yv;AKhU6G z!~fb!cc=3TWZhM7hz2kuYl`^nxj=B#23g`u3PmX^Kuy^U?sDBnVGjs`PJg`n)7!(N z6TmzJ$-}t>=-~3o6O*q*lW$aNFpjK6i(G?1&Dw4@HdLoDEi@IW0qhi2y1S!F59pgV z3{So2OBnSC)zR6segX2ay!O|ll3bkA^a7Qq5_4WI1COuU`^h zo~K6WXSt`Se3C5OS+$knOI6h6a7<6x41-fm3lY@bd!P!ZYLZHSJ)leXzu58IDa6_& z?xbq0+*-sZTN=``at{n=)n%5Vi0=WO(&bKqEYU@cxOkM%3$ydMj@sXh45*HY?t!9~ zjXpIr`XK%H>60{7N{i%z3W;77u%npY56_N7#U6zq9*YuFT!vR#%-8YrJo!n!S7=-? z{!q%n^`U5pHGwesn8M_(1kDwb13DSuFyh~Ns1-@ooqD>iBnq(m;)9V7YIm>9@qrqp zPVo`ig4V&q3Ipl?mflaBKfXu{It1$5sd|ExcMV`9OSMNpRywrZEkpZo>~c=RqXu8P zy!-0lP|K)3{4ed0f@H7)(0Wur9fUfZqJv8Sbdc}&2lThTaKMJrbWLkx5=B3%tsv{w z_3%t(`Juhd07M|PSRi0oI?xzj(Q@^O1HMb9Zmw2!ptL}AG%wDV^_gjGefCU+X4Cg? z%>`@k2K<9Y8n|3h8AmZBiyNW;VZ4aO5{OUru6Pr z4o~aBwUKs4no)DrNU@>Y*8dD6dTtT6kLMO)GrL>l5vvnp9N1H44S^g=rv;5S05DhN zl!ihRpjusDu&lWheEh1$9Rn&qq+5(OO!6Fd!6*j8RcTInRBwe9KC!RJE)N|-^c?s+ zolwmBiJd@(Ua}MBnp5VyeN0Exlv=tYVO@aU2z;y-Ajgcw(8fz!vD77EEIC=!GktLR zDIYd^y zu&6Y17fmR2Xy)>))@ zt1nPyg4vvCJn-GkhrUY0SK!T+pho)E#9W?z@;yn-0~K;+%*V6N0qkTxD$8i?9e)3d zfBb5n&swxMA)Xxmuv9%v4VBR$K=5?fi_AB`lhydzxzvbW*7MPVQ1ar1CY=-~p{~Bo zOOv?MvHOya6kqnLSCo)2V6HPx$<0BzFc|k5^7^H1 zLOG-aRRhXGPT0NlT2>7#)Hwj2W^D;7Dn#XFm4egh*aN!5uxC)tK>6(F2S34;$y9YSy^wg;zLWKqjSEPIe$#5NP9pTp?)r{WZZX1n>w+?dn{ z6RQ|=wL2KCq87CZh--0(p@Jl{4C&QKKKzKllI+CUK)O78=H2W(oXc9-sALy{MWJ^w z>5VU`WN{B8!YWV6jtcC>eewhD{}NA5L3zB=N6Q*BwMi!?(mp*jGhvCvg?2u@6ec`} z4Z^5Dyb)(0c@ojA>4G)Y4pUs6Qt?A|ny&nS4dtwIBr!H+J{`9`kwx zjs_+2Sa9ejDaGW(=2$Ajph!*~clCWM6idUy_|9Zod`2Fhs^ERGkU}$O0{p-u#B-pk1}tYXd^_xoKD?Ia5yQ+@gbDV%i(2Y1jtpN`HKcP`zh|LPoMA}X-9G?psq5CjTA)d2 zFf#1@XjOoS?krQwVwAk0)o7IiX!)-BpJO%>plfQ3>2t()~HXnB_M@K5b-(B-0 zs8Kmp{RAWg(hwiZv6p^awM+u!(?G!zOojNTkAS513*E4^s~2 z@z|VLo=)Q42OJ|)-M!Fe;z?R1Xj`T1F$f+=px#fj%{10-?^yCr3if*nvbsuP7!(t46(3`5K(!Q7KkX zXBV12fqY}%*H9)H9DSOOx4P7|W#JH_E*rv}1=xl7?R+pKN#pYAD;-vyqiLcXTdgt^ z##0HbX_hm$O&!@!ggsWSsxF%~%HOcDoyFouet5X~4WRf-1j_g5Xxxf%?&Q6ca zYIt2um7;`HHe28RF&Ib3InwqddMYJ(XX%0=nE|8zm6tqD#@6YbS%hp%oIRyh$cQHy`j5HI0C zak)G0$o}ZWF*g|dh1o*|CYptWZ3LLVT31 z^#?!GIeH45?0;iu6V?bV8q?iC+ywFNZ6I$J!19r(hwZGV4XWn7ufDvDs#Zd}%SKl# zBlG69dg}leA61e*1Vk68QZ}0hqZp|Nk)3|g4O8gN~bs=_)aMj#r4u&h(63#PKsVf@ODYC$hW+q%GsyG69Z2E(kx zhZ9B@=nP_S87*dUqp=H`5|aF@$T6$lX=|OV&kBsfPgh%5i>e(j)Z)@7hcD%Rm_Dk) zE8-?7H%?XblqIDW78dlb&}=AGEmku@Uu<4d0ZZsc0zJvj`*Rg@n3e(ijT(k4jsUi{ zm@%j|-qx_`5Bdl+AUYFwuqx3Sgk{qbKrCr_WORRX}=Jy#Yi2a3HmbGHEFPUp#5 zAq`(k8~ezVf}nEh3X)LAsqRI-os0uOtD(!F$bv>JKw?f1iT&#eXLw;E>K33QQoc~<#fTFlxuu;9`xYTsn>o`f&acNMpzg{5EptTX zv(gDS^ecSUf2~^Zf35$j4qQ>m!}~G)GxSi$;;`YqBqRx0>;~#zb=zf>sr9EnnI7-% z8YZ~AGk-&Rsa~><`@NB50F9Gq)zn#))YeJHy^5@jC2Y<<#<(?ERof2UOrmv-9v_+v zX0fvR>mW<|c?OOiQPySvIitCVy{I*x54%s2tf za+bU(vzL;pN+?>}ehKk@uIG4CC*-MMX8-v**i<9eH=*-99~w|XzMmxX@ige&M)2I>lBV)1!kXh+%z9I)?6jnHwnvz6TH3vO( zG0)<7+I`ELzx2SRpvbRE;N1y~-c*g`7J_m}R<;RzJpk>4yg%bRvb(z$)ac%s1~wM_ zXdOcwoSW8D9AYdRV!xuq6UWVjl8okTx?;^;;-aqdO6MA~!=!;S3f_p9DUZ`N(EIoG zd!iHr+*x2SIpq`*X6~NL-UOAO7nWs*nFD7g`{D$dosaizqK4V2DyB_|=K6r; zSG~qWdm91~aQQ9b?gKOL841^`HQ@VO`U#7b3XgVuML$Et>>eo;c4T{?M?&toM7i_r z&#zzaA62Z0Yos84s`*7=790p*`LM?T+3d4*7TS^Ho2A|Upx=eHqKj)qdczIn@WlBA z$ol?YlKGENsMC2jj)%jSSX+nCF)O+mBG>q;@5I;*mh2tSvTZr-h2C6ut}&Z!PU`uR zP=&m`5C_wkIzbWH_@Iv2=p7+`ruC-w_jzx~(Z<;08@T)b4q;~WiUdtX_2XrZZDbf_ z8cWQ2grT0PvJ~>B!E)3%(?*w+1&;6f-DnM-1ruo}BCpBW?fv^b+4$El=y{~_i(OE2 z-v6V5Pb85gt5msv|NbAvidO#czO_i!uh6j;Hm#UMLJw1HJHsHvXU2~r73I1192Uwf z1|XFC_zZA@Z-;m6uHnVS3A#56eZ)1#C|8dDN07pCsw<%b*#L;DYqW9rCNc!cSpr{i zvfNmSa)b+kv+*%wKI-ccfAqv+MAZQYVPocucch|j{hKhmyMbwk5?L3pCR)bPj5n`L zDcc*+k!|YCV?N^hPJy`j#<=dBsoA=X0)OYbyID?rDlO>6rzE>}{QZ^KMoArm-(H&jrQRk@d7vt57-Fsl*#aiy9+=A^3=eJmS-Xu0;o)KhhD za5k2oViKK|(D$?xE!7FP9lRACkd`BM^_QuvPWof-+MsxA;A|ph$N0V&>;{x;j2%&A z_kkjX+(7eJk)ov-yBEHlgnn!GN%jhFlbyN8YlfM53w$|bpDnu>1J4qLQUisM5iR$tX}16xbGrEkL#R{WVW0lV;(+{?X}px`ymO^RC*v8-?$zsCpEZ z+X3i30M;BGZYE2jiqA;}Pce{@imFFJ_sr6mGUKDo-oHI> zKQ`>;d5_xi4gVL&IA0ACiX8F(v-fV>Z5&zJU|;ho(tu?EBA6iMQ#G2DL`$^AZb{UL zbh&DgEI0`y$t-~YIuj7hl3441hnb6+wPtQ-t+|nb@a@9g&#;^Puxll9L!N1b+3^iq{D_?a3t|DYL!hi#--)3_181 z0$R;FOFTn#v`_&ikwBo;rxjDd_(=I;HeXY)gn`#jRv2<(N=FuaX4K5$KvR=U494(G zDAs8Q;Rje8*zAa~jhos6Fr^3~1Zyt~2SxFiXuyfua=$%3RkvQx7;Nc5Aj!pkjy=2S z+UU>HVTom8i(WRgv5~!*C1D|U$vl8qY7hd^5nytg`yHibTTv8v<1s<10TBULRRV79 zOtV6$7-$B(9kXJ?wECNBy9T9Ocp`&jPPP|p!>ES8->8$oET!O28frdyz(k;DzwI|F zWH+JqLW`2QFzKuc9Y(#24B{AyT}Em?K*AM0Hu9EiAPAujS0tNb+UD za2VFI0ff5tE!q`$!{=B~n(LBJ>QZL0BjvRfP6emq5=OK}y~USMz>>P{b=Im$u%<~Y zHSyWUWpG9)&3E|ub_t{;-JHdri-<2rjr4ldYGXg7J4xWQq%ZY_g_EuQYQ6aZeQA5L z-!FHi*O5!Qv2?+qwCL1S_6_&cfynG!;e?5-G&I>GS6u*WOFTjG;IPnGu3hfHqhPz_{`Idfn(ZM^NM&NQ= zqg1IuZm?dt+HTOJw7mPP>;$zp777sUz7w@^N~}4R+mXDpKy13Zv z*XF!ME|*r2`q*r-b{#)TC9Eth5Qk9JR$sC}8?_iG5XWt1*pWi;IG8b{V7;IWCv96o zxN`xc(4xJ|GI~m{R@TKhCa>0o2f7E6d9A0TRNnxAHy5*bX09rvx@_U3ma5CwZi03D z(rlGMJIxgyWxEm}=`x=#E-pn1D^ad(f6PSC!!}|$LY>YRGm3Pi+vE$LP-zhP;gE_& zu7pV#&1g8DmTe?ldx?s~)pd!O{WLq(WZLiVz1n}Zx8{{l25=1=oAWff7LZ(S{3F$9 z5Oiol73%gm$YGVf-RbIZ@6vKu^1`K^j%MdLdy_J1f@#1vN!~n5{^nE{;AGs7zH`1G zCPgHCxQ$L}{Dzu(?|zrFMD z(fgg99rMq__d9=o|M21aljD<9^ZfV6olkrIy_qy4o}U6V&-&SeM|{Qk#@QU&xy|NY zso7W2&<7D(cH+x~8z*MFx{6#R?)rf^NKkD(fuay%12hmTz|U8yKnD;mCyCaJ^)& zM8^?bR^?e zeb(|VzO^3&RbGLW+F&QiKR=Y3PbS=Y?bD!3LbjhKxCMspw=!4^;=u8|8LuDhV6MC;xYWPpHydKwCJA_7BYQ}qhi(X~4T%*PY zhoU=a0~~({4%0b}fG^B}E}tbuDD#1^xEOlU3n?$^()#f6u(yoI(`$sN7vnwLWl_F& z1t+l!IAlddfnT@+S9LZggbd0tq^Lrz(=G*-vQI5c2|_g}6#hbytuRJTahZ_DdB%bW>t$|K(8& z;kB4hak-d7WNyoGP_m=F*DqRi$#g|<6x|ef{q*3;;Pu|OhvuK}_WtzBG`M$iEPQm{F+zP_RtEu6-3{@)9Vs7$RWD)}gWX(!=Ol(<;g^3h z12#v;12~N53j12i4g*YVna-**Tvlu@bdz@2Umef46EDqlTb4R|M>R{{gtz2A1 zFR*D%+rH>jXtW37a$7|}>SP|Of$f~1d0xz&b8*{b==_RUajK@(E~|Iqb@s&H(ZcIr zq>AhP**tHh%d}=B;eY?~@xTAR|BbV=9;}*Pp7pFxL7bocnq_QmZEk+`#TWmwN&kg^ zH@Cie@Go0mZhpS?o zrTi_O3{se>;Ip>{`q2KSgJ80WwqiMr%P*%_J*U&)P`Qp1S8oBM#d%!_}*g_RdIPt zCyOgn1OP$2&623!2ezmi8CI$p{pTXhGmN7+%HC$9g}LF}a4L$p3O9r*L=Xi_5H2g{Kj0w3 zmfvzhu8c#1m`ke7jW$5*ln>mNkWLA31W23VvV;vqi#s_Uqb2ECp5XLB*QTmcJj&}p z4&9_MZhREIgrf$g%4AxuuZ4{?^?=?r^^lnKVN2k%qf1#XuuFt0#zdN^x|`1>G7!Z# zB!hPpMaT^fvh);&zy-TjG@(csYQJ+0!*22d4g=qw%{9gkg-z1~$A*O<-3U6)K0s^j z1Jv0(^v5v2%*Fh^Bdgt{ZMD135{z%Tu&z;iF%W_Cpv&b`!Bip@U^!{^;h(bLoy~Gr*+&U6DTP?L($I`Y_`!ozU(qV6KN9h9X<|rIN{}L&>l!F&X}X zQRH<^budka>bIfkot2Ha;0mPx-f)inRWH9fqDbj#J~4z9NRG(I5Ozc#iUTJIZyl$S7c0~} za61ts16PQL;0Y#?!wCGG;$pt4sjZoheJK@n_s zw#(fKs4wu6t)}58H!W}#$j+@F<_`6T68&=nJpT)mB)$L$SB2QXBB1wc6(Na1K%xO2 zFt3*w->B5mSWbx+PcAhD7YQIE26j4YYkWC$bx>lC_cYK;va2&mo42=Nk}Y?Y zV@j&U>5z;%`itr3wj1xxd%@0URr?#$y!X*tGQzuEtC5HwpH?sS=`az5C)m#5z~+;k z!Wb-yG&lSSZn$>$bL;wf_9nG#W7n|-OESZeodXL3t9)iy2Uwm+%yB5AtY8x!VqfKA z97me-04jzZxkx9>=^{841R5q2K3846LCBec-6H2loryS34s75EL-SX6{)lo z9ND>lRX~dnYwlGMra=4GU@AH~@@Sr1@6=wet7PW|ns?0Zwj5yDoFdTBQ@fh-k2f9bfOVFy zOt-A$Oy-%M(zL*fm~_dr3^?*^h^#tB@di9*ivxn3i{Jl_tl4m2sRgT%7AfM3xOKRX zj<04TH9G(lG({ywl7YSHja8nUGecl5iK*GNA-@!tPy_&P$b>BnI2XA0nIjgyw(hiz zoh{7qx?ys1&$-?~V;9*#Fd2e_T$$|DV|cmv@hW+f{)l_bVnVN|>a?J3hmip>V5E#P zir^?3LriY|{}Oh&n?T>li3lDH?vUPanAAD;hPl#@Q*Z|XTTBS#R89+n3F(oPnM-c~ zcEQ|lP{GR*MO$4`w~kUXN@Ey80ZPFIM6uZECW*Q^>?B}sl^&G$Bz;eV`;@7O=HZ~w zU|j9Jpk`$8yB*vAb^=T-|06@gf3*B>b93v#7bW@M)`O4ozkj~`FOZ;_I)1_5a1!pMRA9{|?r_m`uQ7+akF?-{DXy;VyC@ zs*?D$j5yYY9ip>VtwVsRCOQNspFc8hqag$IsTrWX^{oaYMZ5W1{0cJ6!`|D*A6rN%Uzro}Qhh`9P99r8rQQvB<_KV?u7t z%$$pqU{*X%&AW}T@EQew)SE9RP{Qqb%43~MvLRHeavt{CR%iQ-`f{t^+yy*7WTy;{ei)_RLS`U8McJ~W-l-mf)TXb?jyz&Y{t-tN;E zdoj%g`xWhOsB0u-otF~q8O=s>|9zy>BpYwpAK9sGjb9yZim~qruDF7kh^wRSOKA`*x&3vas_|y~rp?RUf~|e~`j` zN!2&}lG3-^64WHzu+4Zvhr1x5ge8eCsd!U#Rj;@OO(%@6OSqC`nd?9kvw4<`v%itg zt7)j$a0hbQ7r@epjHUx%du}^ab1*V%JkQXGIq0;;YYO0Ifns3H8`Z|T666(I{x%se zR75BGRH)jJ;bzWaOZ0=KN#GW6T0#@k%zxsM>GdTahdhq$y$MgSpqyLXuGCO)8I2~9Yfa#>=(!lCi%*}?~T5dNG z{g5(~5T4N2)2PUB6o|mV zLE9|}%RtzZAm&Gg91aApk-U`9+0I&mbd--l$K*6c0**aJNN6QxL*7LncBt|N&)EUQ9xMuT81~Pnj6%(1zGJaE zo(5GJMDC79du2xAua@V{;4AeU_*lc?Nj~mPc6EPFq1L7CAYXclRt4txgMsb$(X3c1 z!9@YYu3>fhy5H8yU?x+i=>$E6nKC%fq9q&MZ?nX{m$=vQpay{S4sEI>C%R6Vq1j9+W!7@KWsOp+RGwfR z4bNS_T>Y4JY&(}>1^V?iT^Y;*(`~|(?nG_r60_Z4FLeNQGIJ5y7%TuQewEDHpY_oV z+u^lx%aWU@@pL+|E20b(NREz3^fpS)(U|g`ROQx;qhXjwn*VYt2HX$Yi-{d74k2gy zOudYumK{!AgHMSrRAypJr?}`2SdyFLffH0X!R;+X9SeLWINr}~B)H-HksirqrB55! zANO7#?jO8df$Z*gq^&xGLYY!A5GMG_*q6Zs#&iQy*%>}M_w^x4EGS26n)6JG#9M=&IFuLM;4LnO`OSkER>`gH|JS#Niiq#3_VMl6gSxMY4!rU&YrF+AnQ}FGzr)hXu{V=fZ8{~G%oC=;NIC9 zb;Xmm8>tK(eSl1J!E*F=r^x!??#Qor#AYS(oc=_N4}kd`pV|?}NT8MD-ZVU`=^Kv- zIf1(E#nnQmn$CDSt7c$=r&%5kFX0<5DDvq6!z@(KT0DQDqbgueGFP^1s(ptWC$6WM zkwKQ$H#;34~x9{Qd5MRA9-7%O2eYX~L zSJ1PzrvfK0Yy*Y*8ZPpjyyhO;y{Mv{KEF^xcB`gXfwWZtQ0JCp>D=KZ;FYb8Qrh9@ zFo5atsLH)i@2lX!UE+cxa#;@72UOnfE$H(JrQsf|=L7CM40%mSXfq?TpqeCPhTz15 z3Q3S;eFHAkoc6IN{X0em`P5+z9^wVnLqMXex>QA!{hC`*tK*0e((#>X_$#fv-($YD zpRtm`DyHvkF4{RyHY^@+i2~XvuO5H9Z3G0+qc5@zaUTpDmcqRKq}1&Y0c1Qz>-Mv0 z5ire<`A|1i)sqVLfmf!eI{vk0$=|WZnw6VybhRij{`QdVL(+55L=plZNurnMhYLJd z7jS-JuJf!XC!pF_an(3-Kcv=N!W=0c-~$A7c{|NUU{#WxV_>{&&a_>*RAg)oaiGfe z$5oI*p8@3!+)L`EDav|V4u`68bi6F8GfQB z{*zI}v2V%?Za340)n?N=AHXQe>%%U22O7R2IBtpqPR73%`E*1=~qhTTwmo#OUg^HGK)Y zpq7(%3|-w>X77~dP&WHLGeES|<%JICh4($E#H%z%*!<~)!J2J$Z5(@@X9$7#DDsIp zMk2o&8Bs%U8nhv5Ud>uS-zJsag6J#>B*A1RE}FAI4X7(iN}r!QBIH({_fU=0C&r^77y)oDZG{0hZ4ymkk?9Zj!c55$IXa&x2n z7UAf+?A(RmZaIY8H3iL}yZ-QC>kGp?ui0aU^EhU@F5@3I|KO>bbhF6y0$l02e=>3c zi2z)U?JglR0=%)b1LB)Wzpgd8%#t0VodEQHC0-rC)%Bx4n3d(_sD+jzW6*OiN-(9B zj)3MA;H`!+nWNb_8DhY0auCd?(|K1e?&yBf#ET~ROU2eX4-S6+76^L*qZ9@YKEREuOgXHH~QXp(DIKy3<-(9ZHd$4G^Jf??J^e#p} zxW|OcZ><}v2w+6mhzY>MX(R;Pz4k>iBWT{DfCU8TfUx}L1$EVw`V%Ea)9tUOeVhA&P6Xovl&EZM08u2bxNnu6aa<>;jL|5=kYD3^$4W;d26ImHucimA&T_gqv{^$ zW2t}uHdBEb>TngJ>2osTYPG}TlCBa0(Gai7QdWL%^+nC-+3u77h(u8R>GOl#r-N6! zN6$3U;oOE;4ahiGI|@fgrs-Dd-ZNXp3>=58M84OmbClQ4zN!$pbW6*GqUd7FNzcsE zc@yY7-1Y=}A1CZvH36D`Yf@cF0=$pe4o2xuCW%!bvakb@K+y*nSgMLvyWDWL4F=!t zKi?Y+Iz;`p!s0rA%d$n2RLTHwG&klEno z!`RNG*cojM4868LH>6kNVsZ9KyLYl11_n_(-EGe-{T2qQRBx4@*c&2>I@j~!Ndc>7 z=Z8-9*TU`{W+=e$4qp8gK*ny=iy}?(A*FELcrU;A7Z~H-y)OOEt^mW;KAxM&WS%@# zGOjzjGj!|fG)dlO7j%aRD`D72^QwZV+YM^T5(P>WQh_cSPy#=@LIcJSGyW;@<#7;@}_Kn!@Z)gikblS9lFYCZT;EskRD^hcN>wh#w3b2eh45(qtTF-(oUQ)&vW&@$i9fWnW5JeI}j-wL+ z#uUYQFq4bAgyR2sOTZlyWm_N0&Y`4qV7ZIbF9xfIjizvdi?eob&_4dl;PigS?DeLe z@yS-J^8qDe88#B->T+G@{1%1FX0UYq)fza-%>yRQzaJjFjCji-CTJR-D{MpPg4(;8 zNV6MEJQ&&>rsPReu~ZN5RGEs|>d#ZnwlS;Dm*4n21wTy9 z*jXzTFX6FDVy@iwRDnK;M+-CS-B`GkF}8<(hsNq9?qw-Ep$5J2HpzJy26&4F_%>JO zZDVPyUG3zLph&Pe>3z$)KnkQvDcC*jd3D2rR%C5RLIVJ>fn-@md?&Mw#86>-u2M5O zxu~6nE#u#!;U$(`gY?F4U>63+W;xz+nvS}O1^PqYSwtTwziFyat|r8%!Zlh zd#}Ig_rX{J519dTpRV1w?cZ+qD4!uBQ6^PtSM2 z7Ed#=z$%hyDC96p#H63!m@DdKn$At#wtL)8=oM)77FE-{--3c?4}ZYng)rtRh8SS4 z_qs*^Tg+ViV3B9H;ua60N;Dv7*X8uQC~i9X~i^bUt@V*9V%l-^rVPUudJun)lep+Vatz zu^4=W14L=t3zvfA1!mcbkfIgGtsspuo@OhMk~JQEVOvWjgma&&?dk1jkJKF($oXYN}F0lOK{8)qY__%qLbq9C>hgn3-WD9z7{Y99;FyIEdcAN@Q~IMbfEG*NHqUFV`gK>VnXO^%!Xd z!-|$@1<^vDC-hN{+77bA!pb*6=Iy+te4UrnLi5wY;#DIC+YSVgOrc<~`G7X#x9Q`u z3QjKFy*1Qho$2>uYcmab`jN}o$A3FEKoiGO)rOrMl^bq7N@B+{JBtm@0;)cu^=TYh zYv)gl{qep0Ue8=*d*&+J%d=1Kb)&6QoA_8#W2jqsxa~E%Zm=-wI=nvh3YPxYWgp`- zDor5-Ie?qRN}3r7Ml{7kcvqqbDepoNQBwno&){8&BBZ87#(K|sF0b1uOq5hoONoIsrO#vT?_>4sujf$7YsVc8qacU~P<4B#?XD!b=IUu=Fs zS0;kYJiGA(T22~Qx+qx@N4rwQD6E}26XX>*3^tBfFcxjUIUD(`loeSU{s}%J%&E0u zX{@c5%dkRn;KVRa-WlAuO#4f{vnL@o3PF>iEh38QHZEn_j!D~}Aq+pYJIFxVJwo`^ z{{mciH@Y7vD!UPpikjeF*{5Kg3e30uMl5C+)XjGMmdJY`b)bs4I}3?gT%YH<+aO^b zgZ=t$m*-kpfG;?clj6fWLu6ilpJ+`1L3B`H*Yl||2N9rQzhU;2q4O9nVpU7H3eueS z6FHM~9k#b4Cu>=9gy_?QjkHlJ1Y+VgoFH)Xqf_J&A0u^&G18~?JhY6Wcd`{T=~idW z?T)qK4PeKV%B-o7i}Oq881Ee4Yyyd(&IyXe)m4(;tUR|IT|BB<74%w9Oa6DrcfffE zH?vWaOS~1EzwS^|#RW=oV9@QX8tu@ZRwSepRR_1iZPKm_OcK7L`WI6d{<{OpgXlZ!)@x;~}1 zQi&$Kk`%XWB5)^BuoFp>Jow)lKSSc|?_*CTK6cp`)IW+fBc7l$=d+_1&m$DTQWPXo ze>x+pl8Q3i*_4oXr&7-R0fq+E9B#czQ%Qb@Vkzi!w0OM0WNMMHAJ2fhYigWUfHc17 zn>Co84|tS{4<%S4pop)~CReFdqI$JTDNJ}tgBY#SAbNbD^~WzwQee!Mov`YrT6Gf> zeUuaEuSad#YRThEE}|V37MgViZI!Fz=782Dxc^iFo^=FmPFt#`x%$8OoQ|9-lK_)F1-z0k0; z@lL?J9Fs!s_>0p!R+s45%3)PH;dIuCKzt+janRek&dpn($TIKY zCJ=ly371`!bugNxLLIcz@R_5=lj&ki4xm_dnCvHw8X2)S-EU7CakOg|5*S;<>ck%^ zB*gqtLt4ttu^%Xz@CSlq6TZ_DQ8L%oyT~Yhao?0rwh!njQEe%@Y3S7v|}s|IhCv{x539V0u8np&{GA3|VEU?`~gl0$%eA7D0Zxq{;1>3O8kE=BxtPB$8 zEhI;Sgn5S+kXrRL?0M+gP71QQf}zlM@Wi3naxrol6>9eHEryq~pW&Wmo93(~Je?TZ z!h1u4pEn&=9fo&vLJ5mLr@NlNaW1%R-`Gn6>TVR29aPE;XJU!ke6!T-(uR?&#JWQ) zOnu|>VKE<@p*59Ngn=x#f^I`%aBO>Rt;%M2lWc|mCxGWcp;Q!fW0+x!GSCQ8j@k^` zqWF&l??ZyG+6>iEY&wOyi;lG5M&9o>V84| zvMoQVi{p=x{J3+WFeAJI;RVF5l-~4~pw%V><)iA>OWMW#@XpmB5FM`~^r}sNDqGFS zJM`!7gUZ&l>sMicWKw!nR~luzswnCSMbISU6>~Pep%`G`4Ljjtr3U8&E{c1_Y?05* z>a;+Um|+0UROS@&Y7l%Wl|EdID=;AG*d>cT+V;S2DO zT0$<3qNOr2DLmcW>#m$jUJ>vDd3{CI<+j7`PBrO#Jk?xoeyy^)IbyTgF7va>YnPe3 zN|!6$8jv-*?An_) z*ymDr+W3bpg)sL{w6P^J4tu#Mv$s3^ahcKeIGtRu4~V-&V4n(0OFa!9DSQ_L`(SNe zO%uNDzEV}+W<_>}T736K#ZU#Z?~!=S=gT8jCLD9lnCjLQN-=8kU0#eciTQ114T;k` zo{JD?;EpHaXgWzN4@Cb%IUc8f5V96sJisNAl(|yD^_N|uw>CHLbqzxV^N(Ip6w;Jp zKTrZ3u5~jtIn!eD#@r4jIvy+DedN*b?3h%o{$SF{?=6UYMa+%=&%Nx1m|1PPn}tq0@bVOMy4 z{7I|xAq2j|3je#QuxMcIDz9a3kdd=|44R+e0&$&Y*M_>~X$Hl+{Q27xVv=5Ed~X?E zb(BW>Sl#j^wH%X>v|Ik}&d!UNoto#Ol zT~5a%0mZ%mo9{XBDp0t;h}FqM97UNs_r z@!6bMlTr(yD*M2^Lj%xU1xn~tsFrOP0HGEAQgM#`yuopUAvJj;vALYTA|Hbo@G?F( z$Ae)?1gC~^a-00xE;Ptfxx!>0@Hrz}GB{w&&A-!GI7jqn7TA=JI9Ge~N;zCgHbE^ZMKZK{<|yv3Ja3f5bLGr|`69A=m^Sn?)6Dzycc)R}C{ZTpFm_$$PBep(`Bs_QgG2L6@I~ zh0><}^9!|-_NqepW2w+5GSdB@*-|IfuWYM)E)~3MXJr3p6|8j#RVBOc<&LHq`|~?m z^kbDBO&?2zzOrhJpVwaRL=4KLZ>KJ#NK|#g-f8Bey_8!@A6!k^Au4N0dsnH%dtb#5 z&hOpx4?R;tSvp+WoYkwnaWX5?k?Gsbc z?uShyqU*FIT!hf3a!MdA)c89B5$SE$G{^TIjC$sOr{;WE>iP_d=KGOn!r4<-mZf>U>Mcv?=yj~H_0wWLnl9$? z9FAiV;$bHR{nAC59|lQ8m!b?@Z{`Jsmmo<1iWFk>_)+5RrVTo6rZC7}L7E656#-Yx z+<+wt5zJrHgZl?DLrf0l(?{(-&(Q&V?nIB^yM7h*)tmS_o4`w^NbFiNw$lN=9dDhY zdz#hcgV6C0o1DemM+Y*%1Flg!ptIo(dQ24qXE!I@5)$~)Fy3Xdp7g019RZWn05{tK z_#NBC5LFFis0}m0!}n`?0x(po{5)>^RoEz3p%cY%w4qR4Y~IZ{egH^G4ZEs5c~dib zGEO-x2a1hw6&aS;T(oA18CA0=Y3CTH=X1D&uqy-Uq~@1yX3X;RZ8lvLL$`r+=)oz^RC+YEjGzg(ut@h78^Bx~YGN%5PP#U{v-5)MBd7uwY@?T>%2nnGzboA1c( zNh{c?1bkmZz2wHaq+z}lj8K=i)dkc@RKj8~N?Yl|Q*rpP=3_}MtE?6JeK1vMHCrX? z0BQrht8RgEKdmX1Pdq~!j2uecf2Ao0hnCv^!BqaAfdBF3SDO#MF5!P{eU$(He&YW| zEm$&(c{VOuEVtc_ATHIEVq#N#ObqxaqB#i;3*gON6+x^+0cOERf)F9Dk_kE=10n_j z4B z#RM~QS4Ds{tj2j#z$rMMPTwqM;IeoQ%D`sCvJW zQH@Aa2`XE>l;)9{8a4>4WF%@7+(eip(YXW`VnmehLr7pm7c*K(UgWYaL(1mr?sb)6 z2$I+p`-0wptX*nAWm6>3CIq#^>AYBFQEQI7Tz3#l;EeMW+gYgJqcA(S5v1dYN z9l^qZ7>^aS5L}{63JI{8+>|&(BurWvp$h}RgHb`+LDX8(zEGpoM*>U4-N~RDKHeZx zS|_+cjy;SOLZlxIdBFRYjU`8B43z*qP(n9y`XYl{ z5*domf*9tR=$m>s-?76TVqe=@xC+k=5 z8ow+xZWDf59W2{50*?x62CP3~<0v=u6B^Jn7S$7S=BOx_wp~kdMQM&Lb=&HPlxFiU zDHmdQ81{iSSi;yuDIXXq!PyQFR5y{uy}}Z}!lo!pHTt9cW?=SFEu2X($SYuv zA+ahNg7&u}9QYB3cVI?Cb}my8K(?#xpah-%G|wO|G;Oy5s%1re5Y5{6M7L}OPi=cZ z_#KWcfu9qiG>uq#IoFhUpYSQUN=Uwd+&KB$jdB&C`>N;O$jNXp6~J zGKWa%_C7}!<0YtO(9;0$13j~@B*AF6L?<9cn8V;Q6(ZpPA`%^z2p`e{_S>M>W>eFV zfgbY|Q}1J$brfq`df0upoktGW3|h?y%F-RstCHI*S97vJ@uCWeoYl5}UVH#|74= zbb*$ZR))f0Xk6~c;*EZp6rd)4cPk;_v6A6y5@6uVNWI2jpz0fbVfq!Pm&;f_ts+13 zk}08xESV0DnD2hCarJy89vxc#aovt0#RnJ|BfzjBI_ptF(G;bD5yomoQ-My1^(+-8 zrtFCgH&u8TcB;49l7pBmqFUSI$CCP#*(yw5U44B{vokH9EMR+-=KcN?zfLxJ8_jY} z5~_$Y&yWxC-0Vu^7bSs_RCLSoa32c|s5jW)*iQp6$F*ebO=s17@Ce%MLGlU>9`=mA zN}%BfbIOT=@jjZ)2*XETyp;{K#Can8%TbUkE}`5dXT@}EHd!0^UUgYN3cgZX)TzU= zW838bMB&!xu}AGx8|LU7K^5W5Tvn@)0tE-l#l$&hQ|N+aoI0hw9;D-QeLJYG?vBeT ziGxjONe-xmD;V-U^6wd%wm%VGSVJ&i9jyyHvb5?_Kzmt&Jfi8Xw{$HhCMjn-FF2NP zz7aT&b!No$W?i8u*n>CIdo_6}B0v>7;-PH&y)(rk8Mvc?ex;AvhbUg_fYnfYn3zgH z5IDSlP5k{O%-`u)gQ@TnVu~`UJH$*v=q&*~Bvh$&Z%(auZ4f!Ool4l=F@n&Z?n;2} z02s!OS2DyAs9HICThe16ED0}{wxALd&1-RGf!ZQ&)7f?z0VbHQF^bkqxDY5S|JaM_9DN>~;NqmsZ}bWx6$YsoX%2aD4Uj^y8~sO` zPs}X4o`T8X867C>tlrM%_QJ%V)huJkDO9VuUs708ch;zC+34Z!B2b1*bIxnE9YLEy zRUbIO7+Zb-{wNjjT-X8=3A}~#Zi-b9VH*K|T9kbth%o%(bU_i@{g8*SN2=!7$I`UQ@L2HYndZF&JeAH6vP3Jx!|{HHM?K7;ZG*p^(Z{xf~?@ zi56jh_<#%<|F>yLv@y280)!-9fD!K+=M9zjrDn9Q0SKYGL+ylR@o-yeA|SAst>f1t z?5pabzF$2A72#&hm1TPFZIPARlHT;n+hE0}1VA4JA=?N57ld!d&@lzRfhCUuFNcJP zYy(|MFa$G@DhO@D)+0?Oq_G*ed>Upkkd7*tMGJ;OCnMq|I<5gh6RUs%6opZ0c;(cK zU*&9sBSAU2noceZ2ez>lZ^d6)Eid!Ufiwkv@J#%S~%rUDTX#f$;WGZ^ym4P)0(sa4#B)*GCqoSdex7{Le7mlC8_mOWBHl|w@4 zp4k|%{Xx2Zjda$pvdO@G!RTFxB1pB`p3fg{Y`E{+J@bMEAQ}ZTrM8K|&IA~>Ce?QU zRrTY0J#ql7)E8~P7INeLX>gVl*>FJ9Zonrv9H*?Y;XT@(&eCyb={akwZur`OJy+9f zq!g;=&wK#stJn$kZoL4_egiP#51DCr*hAPK^!{;a`wJ6jKFYsPm4z>O;oyZLUi2>C@vaJv^rc|M0D^j^4jGNN8H9!7C zNKCgqBv$^m7RH9CLW!w6DD-Jh2T|o&?}jp*2_=f(;-Nvv!K-C`Pn5JTcBM_K#e4NK zz4$zxn*p{WhtX6ZIL+?Uq zAnVQ-Y=}@DnscRKl_D=x&pJ0ph^f^g#B73-QQcRSJk!k%%gm12j_IvlYIiRip&`&> zXyOFJ(K;ME>vhHB`Pe4@5q|RF2Pf4|DKWk00rXB=v%%~r8;8YYo{d96sw8oJxGqSehSv09 z!r(l%6j$ss%P%m9+5+4o)MA}%2k1&;yXA`Y8VN`X;^Gro8yjmDZqZ(f^gZDMBv>q}6K>q?(oTzSyP2BUmSQ`K3sh)+@|pU2mSj2g zvUF-Ua?BBD-ri=$!|VAHyW}9gF57;?in}vFGM=`y) z75}TdqkNMN6S%Hkrx1R40sD-WP{4`-xXA>a831g}3glVDh<6WPcxY(h-3rI?3}8sF zP30~kby0B@_yP8WpCVo3JiE9wMP4U}mkl+`F@ofTkB}r{xP>M}7%Sj{_i%@rWe0D` z9SPYN_z2ve-qKpC60Oq;h-1v<^84BeQuGGnlV|1yUTG&IbWH%Juqg&RSXEBqq=|k+ zcpDEMnOMgQ(UD=w$!1*PhcI@(uvsHSs~T2WI~ zPEgT6vtsit6&vwXks5;j!DIw1I=oQz{u283^!vwu>7TBD+EbOPn0|WR`5~u;ne~ct zmp1qME_YMjpyhRp5Ntr(D&-n?p~%R@6(lRA8x87*EVd2yMH2avVxlzzM?Awed?+*= z5&Gf^y&tAvlGEpGNhjK4QiZ9-4J%tA#>gC_S^-|rJWnPCC?G&Kz!}dv(M$HvxK46w zO`ptW`E-_NV24r6rT{03>aw@!$C_A?XDcQst=oXxL z6x0BxFrO~Oz(G@axbQ|M1m__w`qxYXJ5+Fku-*R2j{9I2L^Gmd8&9Bsk+UCezLSiI z1MT%DR-^e&r~yiHbRy)4g~B5j@TcdOw>?qsitnsTDx(%V>W^$KySDC>!7V&xgKL|| zdspS$lr>sojS0|{99~h%YQ}&uG~eIRGis;gEQLWoVARBiDXa}< zjEi(`uCc>6W}`PO7u?EIPGaA0_gNU)a&Phbpu4>EYidqc z_F%w?<;(!TmmtUS?A0$E1O`=NP;n7-kam{`gJ?!4eoNhVm+DR_1hZnPM66lrc4BfD1v z@$y+(Z*sc4GMefR4qvC@pthWHV2U-Jn3{1pRx4-5L5D4YyP#G773*T%`ox+?8xD-* zu^tKKc?<`xt7l*lZ`Fp3PX)!f)7^fwCIarj)*;B$+3uawI!$mdl~B~l?Cw@|ciHvS zF1CEvQ!m`+S8sghCI5TWYqsP2ou2+gD)8vjEr89)5H(}iswm1N065XD6}2Fw@RJ{U z9nZTx}-E@fFIFv|S}Rqgc3B zBhv-p+Pg@|RZVe=4T*jWEVi<|LpVJ&UC(@thYzRj2O2N3uG!``%ld1Tb`qo?@YRIK6mjW%4RT{lX zZ)#*%Ls4Pd#GYk}r9iflG=(_&7vzhV)UVcUB7rW01!L0YS?a@x*zh_cM-9coE5&}E z0|`Nb;Hl$j#>w?#d4Md=&EMZJ#sdYeD#hOg~k{AL( zAh1~-E=p-Ien5xszy!TUxaErvYpsdW75tH9UjFmcN9D1cjYE%+Xgn&PWB5btBA`5BwGV?}9R^TRm=O8J03 z>Qgvdsx}qA3 zLm#;WqN$a|VtV9$_U+F)3yAX8b!=0fRtY>S6H0_q*Gm@q26woD0}*sxb{92UqR=i+J z)hoS@p}3JpZIVAElTnh7*c1IM zhfu(tP^071Y=HG)qozh^w}_-*j`@`$gE~_uNFxNusj_f5eO?D3CA8{v5s1lUWIy=pkCYr0QGed0)0YNR%v;;~PO3zNnNQzK6C!xwkdJi*r+&sQn zqI01lRw`XE*-jh(bSeq}j14ZkUgql?zE?m%xFzH))Cm{Y!CVfL@z~^;M^)WRH8tek5-!p05P+%dM(4>G zVx%I3AgX1$q&)0e+odjQPP);)IUX+3yvvt&^Y`ZJY-+Nx(!-ptVe~FO96^yxfIy@j z1OKl97+F1PHz;$%A^nho7tkqDVqlnPu+^PGT)6pMY|N41*3pqo=0puuKAH0Xlw&f#H;$vN*)Rk@Z&_+DTxJ zB2e}afC$(Sxk2VnaGHQY_gd2dZm@Hyv@3^N;Q5n5VESoJ^5vkt9HimdUUYcy?a>dr zulJ(;!|2uPgFo&+-Fq4}b`Q;SqZ|FOfAs9&`=iLDc)k1b=+Du?x6$s)KS%$u|MDsH z_}-shz1}-Kj1FE$`!8NS-`{&`j`EjJo`3&z|K)elHzw!HgQMvA{)_!1L-yzZi)3Q^ zdnVtvhRBP(*H50A7rWo=Ki@z4b2s{S|L7%9{nn7(jb81(KH7is{qx<|(W~!YzdAVF zGgWwM^1VEGx&QLp*QTVs7ke*{VpFnt7w!EK?8OeB?LL2w#qEA?+VC3d_~hW#pI`5P z_v|QocJTb^o_YDro+0#nfA^c`dsLih+>__K`!BlD)7=-l-|b<(14HLECgU3Z@N5rX znG$!+|35j}KX_>fncjJF@bc)jdC@hkeSKsz|FD0!XLz93`-jjm-@ZOD1whA|90y3o z2%49X zc$@i43^GNK2^TGU0nlAV(f_*U`z)Tf_ohv;gondo}Qhh z`M_m*O4Kry?x$ z>DeM1kAlKT+)xa20Qc=e05O#DSoj@ab76xu`vAB&$FAvpyv~@*ERm;>(Tq1m9{?K4 z>?4HvWSXg(h-3~kxcEeSKPB*2La4aG6fUU6U))F{{3_feAkBLY76QK!Wg0^BzTVq? z`eHAJcMbg={$Vo+-U-`YTEp1`2X_B{?>>ZB?qFVEz-9AYhh*ylrv>=yZZOWq)8QK& zu!){_lr~1|96J1zmmDZ}EHH|mtE88Ou6vtgV>Eyq8s2DnmHmwlI>EBWs_pDVhqH8O z4mb?{X1!H#R&taSlkCsa1-j8(n|&o#Kv>Tq7cz2DxB8XFsCF*HgOi*_IieS(6oGji!0Mg8sc>Y>zqyJsHY2<^+3QvQm2 zS3gfnUudrE^HA^{z@bpkW>u4?OI3pDZe|G@EhZ3m2T^Lww79?li=!Vh3=Bc&W7yy5 z(%+?Ly$O=5KfwAmIdSS<+fV{f&!JgOGV|4BC2gXqze$suW%LH)<3Rgh;-x=tQ)y$J z!P2BK;q?#HBThc$mU`z>&^4mIEC|wmn64m$|~|t?eyKm{Y@$ zs~o%qoitYkS0=V;8M2Nn4phZ#J9M#EUjAs*;*Qp3@ zA*urv*aG51n!^+jG?MwhA^zX=yf0fS%Fvmzxf85I>e2LivfhOh@UNKykTSNmj_+O& z#cz>faf=7jMxLJcsj2k&G5uNRRHt#dvQ)E*UQmMfDfp|WvSD7%uf{g4JssP+TN?1a zQPnTBAhTTe4GM-$X?T1F`>0UGxsL2lVSA}6unCHW%MGE}O;gxawAecwVNAxOk3vdY zK7k2<{mvwHQaMH7^ ztbhkVAigkgfO7{I+)91Pviz1Dn|e^8Lyu2ur-_9ba_IYb88kPvF&8T*3l+@#2sQ8y zrIaJ^{BW6~9tj3yp=uApTQmZqSPnnU(;TW{Zn9=C(*>dIwyG@2Q;I<&>=Nzk*K&lA z9Xjdkm~|>MNU+bn%~C?d1a8S+Jyns*N%2nm76{;PvUEJ^J7*%97OXYBOowmSbVWsI zU@GnnQb8iX>L4dLz!p5R5xdOorlc|0V+dR{@_=ADB$c1r`^@r$Xokb0nK5~>V& z2hh@ZcJ$&oZ842%1*5D$ESRC&B~-dhXgzbW!|9FNY9P)9vIU?3f{hJ$B9+J-TP8^h z&bAgip%Bw-9kWTtsb9$cuim*`TD`QBhRhPmQ29=solVAOEt!+(TJFj&QsO9`nPWOp zAkmb1z}bD|9&*EXyGqkf?9rnsfnwO-ta>|b9JD;f~;xuAZcr)qQsRA>~U~Sh|GfbWjB36o%r}AXihH zMN~2+ooy+Qk*%q^ic%%ZE45zsm%enO@VXR;g#>s3p&W3c3fsD%f zWt_(6W<|}@iP%N2)eQyKRTX{e{BPA;NL8wz?W4zp$UIurpSAG<`&-|jW z;o8uK6%^<`TLb@nTFggjp2rkB8#mA9JIKttF>JDelh6eEuh$(+rS5 zLe^mi&5rC7+8yC_24$Rh<)QlsVh58Tu!FZ1XNBm)$g7VbVq}R^xN{9Wl@ZoNzgbcv zn~nqKG^%SB@?LlEnpAa8x~ejHy1W|Y!;?l=-rM2Cf0`Jbe1@E{0GFF{OXHcE$qDEj zhGz!EHHNsNmA_9jVwg-s1^$AaieNLpN+#KCF(&n$Sslo`!CYHg z^8x{&!eFD6qdm0%>NN8cLaj@T8F7&YQ&HRmY87=+oXnJM-!uQ)!wPKO)?05x*U6wek zL$uzq_#$A^Wp0XQ1VEBIOY`xK!)6@uh;qCpp->Se2tTERbHmKR9*f;~bT9yxV({eI zE*P+Yb<7TyYqj)XSim&N?)UOod$GTBA+o1MIvD-uVmimGYfxId_5c2l|D)w-b)#0J z)#>`Vi)Fe0H$V4DOJ}$CR5T`~?ElaI<>zh>J1ToR9%r*6E26sW|L_0!KmGi19P9j7 zgAqlOuFe0y`1vxINRX&I7eUCLN@E5!N70DyN`7n@91NWOMhWgwI& zbK52COG=EP?oz^|{bWO{hl=IJ1gd3{_8H>1Ykz41<-mS>=&J*QzB9cO0M-<2;n+DT z&V3Y#SjjQ__?T=(8xk@i8oo_O%F`MT0z^YW(I+f=_#qx(5TxY#62wmM7O{0cY4_TX z`X}GLKgm07^DBP$huhBmN1gWZUry#H`N`z;-Ddae+s?_n*U{1xkQp1!|I@8o^UnkG zPb+Fg_oMb7qK)X&2XT@8E$!SkyyUcDI@HrkbKax_yHA>tr0NTXsm)tPX|YW=ckHo< zNbPs|ih`9g(EfN~)+cxPI6a>OLcbx!Hmk)Ygf=YZL|2gaA2eOl;4u*d>Y{L@O~6?0`|0W()iMry`a` z`_63cK+$AWyRs&Bn31jQ>Kdw`__ftlSt!iC%lL#Z7&g6berd$%0|Sy1GFVrF?vCx%3OB8qA(QBvJZ$&!d%ctU z@%@wgy?Y!zP655w41s)sRsscCaT}y8=$mdoKDqA4&7Dskz5mN++YkS~ezMWKe{%2f zk0-|`r>E=px-cb3H-t*K9T+$7dBq&TWR3@inOHGZfYFS&jqCR$l*W_`xgUM{Sv*cB z7v?UYH+GlJAkD^Y`=VgR5rf6OqMMH3)Y)lf#;H00^MjN zr#N3}yAj^(imviGqA+O^tc>7L?JcfAAKc)6VZ{z~DH^HezusNE4JF83NvRsH4v_HAZ3MLwDH{TV< zTc@`V4U2ctkR!XuF2E)bbW1&ZJF2WzWfhM9^6+&1r1z+}A2t?MR;Hxl!ziAdv`-E@ zj@DvAp+Yc39BjLA{lc&zd3s(ZZ5rtG?BS?Z6&J(*wNK(lov;HnP58@`_1KDyKCqiJ!$+x7lo)HgOZdaFpYFziDKuckZs8FW8`MgDK^8>^_h?ch-$ z%ItgcwNr)qpt^kX(IdR95LOWwsynKWl#eumASG z)p_^e)|LMOW$W(wu)-_ayQX4xyPX<5rz|}sP?Nf}er&0?UeRtduYkX*?#Ci%ihpLX z(O?+d%AaP`rE2Fx*sh=_brY9WN(;m5YE^2cAzs;Kpj^mrz%+h((T%QdI4)z+ip<@t zNc+I!!2Jw$rV#`eHT&w%t>bUe-K%C8>a3elGJ1=V5?MNd(b;BGIA$~SyoB>DJI{vT z!)Cb`2e$_Y5!~u|K;!jC?MFMu+b8BsXtaL(Y~vJ;g=S+-4<=;_aM`5I__1!1a&d62 zz5cYfs{0@+UNKi6FgW^M05v5Z&I1?(_~^Ud5vW=AU8It%p90myjSRA+yKZ$l2~ks{04(Ci`HGy8`0L9 z?eZB!Vzs0wxqbAykBTtx{n!@3=ZC*hVre zjPWX3zHnHThn28`xnF9w6oibxK%aDB!tIe@F4GArtQlEtlG2so@YU{&A-ow@b9bP?dkjDPd5Jk*=Hv|fQaIEh^*u6 zKc;WU3Ls6ceq}q5<@O(&Up@Hp>%jiwtIaRJ_-Oy}JHUSdbB^8U2Lp( zY0O3aA_3bM=6PQ?#hI#L>3`$B0-9Ulj$iAtzldx ztAr=(da>e(h&NU^1kn-(!0sXLIkz9W3kiUa;7y_~B*ole0LtV38*>dh4b@y@ZovlU7|5HVP3=XWa zYpXRMCs${qrVa_H&{0Q*8!d_ww|-iw`5(A3vb!6LWv4A4AbV>8XXU zYO|!KpQgj;L$a7HGyQ4iWuaH~!@-(tm4n{Y55{CpJ#;>vCi6;D60Ax>j>MEUyGkyy ziMiy}rpM!itkWvL7mT|Izd_h~_hDtqgR}Ia>%Gw2?CRmIpK|ORBP|b-M~Ybj?SHvM)Mt}xjkt-Y`%lsx7$5DrJL_?urPj= zH=GXWGaQogwYu6mXm>OcKBBPp5zNk@*X>YD1FuI`?id718SFkHC&Wb~?w za&g*YYwaEY#Tg0mDyo!XPAYkxYzg$5N&I@aDW|rj9SQ;JE*QFE*`lZ`n$+ZXNFR5Y z8UCbp$7&NgMcXOI2N9{Ew0-^UF-D-tA~H@9_~sXnThNd2 zTfNqR%5&J=_Sod-7Yakr^Y!o}>}>OeO+|X2hzxZ>g}hhXRUB7d32~w^F{fo4;^j(1 z;UIkiL5Wx*d$~RyD>MZU^J@gYcR7Yd@!fKrmuLgZkAUr&la|j0Kha}K1p4jC6brWY z+;p`WElgz;Sif^%^&s)`GTD6}MW{FM!Pp}GboA6HL&*vtNns1c5Eq0q;s0JS)& zjP5Lf6~*5$#aFc@kC<8ZNuc)vMq~ybH(NOSbYpw-GT#cKx>Er5QC*Vre~DRoG^di- z&}VUwrN2c}vP$emVqZHXX2d8ggX@^S?>k<%zT${{7A5i#rLv`K3U$fa9>ujAS4(bg>cw2?@U@d}4uMeI8=}0H zTBA&$<>aFD$3UOyOy!|>9yQs(-c9k0z$b2sG-XOy!BjF*h_J;SM8cro48U&+5TX&a ziz+moEyb2wMMR|qZqur7R|RNxF&wf>4iclR%L43D;W8(5*28cjheI<0ITaGf`|iF5 zUSTFTFNtls^XV!W4YJUo<>H4DdVYEGFp|7Shf;fn#32A;%9XKYNidcLONm&~1S@M& zWs}gB4iNFr{DSN1#sOaqEsE1aq@Ffwspe{ymnkA58Ugo<_xV%2(1EKos!pj-%q$rQ zGNh4YttS4BskspEhe+%pL4wi!R%D|^9(fd6?JDfwWs^U6@LsfdZ|9E!LBl4_ouPayTih-Zeyx>Z_@qluL9eXJ7@zc z*+X)L5k3Wh7`UUWMq}T(urNfwg^<{YiT0ssFU|+vzH6tQ>D@u{=(jtyLr2#%Ky07z zCY*|?+6Y${trtGJBd?vF(x`zz85hYBe+`{pFv9th z3~I{wII11L<0l;n2FlElBpt2JH3cn8fcB6}nxndM0Ma2XA(FKT{rwpwT4OPiR5^Av zzXX>9Aj^gp*!#Bvr%5 zG%%6z0mO%0HP8Q&t@JOXH9J{02I@mM;}u()%p$uFf%4K+NX9@&P=7pTz3b|`t*n-3 zV;L)JG4*DI9_+J?Gemj;PVa0v9?z*!&^v0rJCcOnQM)h?`9(5SjR4;XCdg;He5sx} z$Dxs3h^yPpwo4N3xbnj=w-{1rZ#cdp8ZE6w5uWRiaFPBtzez#CCKwOvwg|CKj;finDhX$v2 zG!AI}gP8+fdyP`d=gHoSVg!BSWN~@EV~dLq?mae&4OK&a^!FvV!l9h5jjAZi2FmgY>(KTwu}J_{q22LUE6HggvXf`%uZ^9#Q7dPy z#@ueg^@Psh<)@ctTL2-8pztt$d$OIQDSl03imxbe1Jrgvfa>$U64|cJ`XQ8dd^n>d zPk>UaNKu8=xc$Ad*_Zp4QhXLTqU4JN53d+k@-~6M58(I?PJ#)Hnn8ITaFgp=ZNpCc z$6c7le2Y>SyNw!HN#L~7(O((6PM~<7v^o&rk%L&wL#RP`a`LS^H z#0$!mgyz5+@7iM$$w_1X^p-q;!!@$C4;$~if8$N-#7%OtCqq4GOdGyjcXqF;i^;fY zW*UhxMbaNu7JY;6ja3Qt!~3=q1Z3Pi!w)*gbRlRN*nt(RX$T`P2klg1edA}W|27l0 zzc~a-h-Ge5wb}&hU73-(pEJ2ZU0Oz zDxs9uLRkD~x!4S;oKJLCc?xNuL4;UHF^y|h3)L^39LrFhHu(@4MBXF0mqW9eqc0(C zF_r$<^w{Q-rxFGplz(Jy6}7T7_qZY!CodCp>nr{&BuhSbnO_U#u$EQWJUGLaUa`Kr zey<(6mYHe9m;x1Z5uS6r?+9TRw*j!? zO0}jqfc_6@tbxFEdINUahn@AK{^#J7-oH1OnjC+S%P(ttec%X(r<}40`1>Addrt#T3n^`& z|95dnG2jQCwtx}4P(OP^x)*0>U@n?>ysMFRDQX*&f*O2#D5{|48z+I3ah1KV$*YrG zX!cV$m2&8{W;=v%Vjp6>Gz`JyucxxNqVp4u5hX|K8_v7gEvGnyynbr}es?kCEWO)k z`Q_qMi(TRJy0?FHW-amA)Fu4O>2n4!iQ_Md3XO#o_0_6^Nc9~y}j*UCa(>wJ<8(}3)hLV`}x2H#&OCVtG$?@BXU z;rZ_&^u?B1@oZv?49Kfgk({edP zVECFV8~o=U+wE*)m+6Rqtb|@T&a7Z?9z#SW~recP%>wb?hW-bY=iaGvRvTBIpdv3I51vKU{x>MBIu>V+tynbNL!B5UVTEu)3 z9zhRdiQ`;c-)tmTg%S<6X4~nwasYOki3%OiH~kd{_d$cdZ@Ai9*r@v!+ZnOZs-N!S zlZBnkWt?b9sW4aSPB@i9V%{f4N!qHPkxdk182!h&x#o0YSN^3W7Wg%&kkpGsl%$t$Ez2}%=-*W-NWtoo^*pcFPO zK}%DHWVxTv&iDfzg&G>-i@8~;6~CzKwj|Bc!@eqGdezrQH7#3_x1YC6>$_%4s`d#eb_b8QGwjnxCa+l>l;I0cB3Cl!Go}X#T`?B5IvpjaqNrU4$*yngv-0M0 z<+cV$jdsT>VL;FDIo2^L_&}DQ%o%%egC0vXS;^}3I+H|-eq=PRV=s}LNfp}Tdud$k zN|pyjW72s=MG(qCEIN`D?t}z+UpbrJ)Ms<2dcwuc_|9Nish|?6qn@|$OK|p7)32Wa z@x42x-HqBk2)`XxbFkL5zW6?a4+aM7zgQ_TG;H2KM5Ty!K3tUa#NXUepEKcCjLS=v zio6}~EL}-7RNaVA=4x*;cS*f#o z`DMBGg2lR4@2~18l=`!Zjb(U-sbMgSv{an>Th){p>d5b%4UjJAWoBeZm7B+MZH}q7 z8ta|5fS`)8l(Y+?`vS(&x7Y61aCJAN-SYOEiJ6o^|zhQO<0x8Q5H2v z8qqtA@jKQIr5OWR;;vjXN_iEhx@yg_Md+<|{BF=gHCJY?1}fYaip%(mEaX#+*Q!vL z(nWW9LV_38SB4A@JmTK1L9%004Ubg{n~q%5 zkjqTBB}S~^`D{UHy@FP#R`CQ3$$eA!SdSbcadRTmUvt*1XK?4)#?uQ@;tV&OvOIZ{ ztT)*ph4S_g3DRW`x^&V@JA+uC*W(3ziFpBXG=zWzDEhvQFFF$L{CWSoK_z(3qcPvY z^q!tmvYdy_FN!8I{#&pk2cR4ZPXtV@&G`iX_)a#}e+K ze7c<%NH-MQpsk-*Hy$~wV>9m_#%Hw+)K0e+{0V12+XH|$%g#8#f_r?yC|t9;P3X&c z{qA`E-|{~~v{~fO%E*-K3pC2AgM6GtC2|Uj%2~2A4YaE@xrhf#WR#7achpGcF@=Px zf}3we!1XEU&F6g&iyM713SmCdQo)Z1*QsM(rs+}$Rz%O%7AXVHZre{VXIRQ~AcuFX z-~GlSET>D~(6AeJGFWl_=@FLmx5G1mMf(N=-QlbOOn}&zDvgW`wC1RlSeIrk=p$Dv zjGVKvKX7W0cKqy2OZOH@S>O1If1nzt@~rtG&Fd*HdG#QHc31$DI0E`8)M!J2>=L1( z@*bJj3YNKh{!THv-yjpi&MIu7&}o#`J8|&I@;iw(L#t>S#BMW2jt<&(u_6S4_>?#V zXJjpi{_(v&Dc*=--IqhWQBM7g^)z7Wlpf1yHAG?!44}KF!OQveAbvqX?Wq4%njkN2 z^BH&oS=E8ho6e`WwwN9QOjC^n;grR@DG^Hq9X%r$jK_BhW%Y~4JC@ZQ&~n*6+1mzd zWH{+^B=ORlTz3zl_2ehPL}NeGOSxH7;q(%>_Yx=Qe#T&p0h_~QZTtba3N%{gr+Nvk z@(E|hs<~cM6tzEOvX*q-;gP?SP0GA2B`fy^k*0qGD(yMwtV8SZL?bP+5)%q~XO3n_ z2{X^lyLhb_ikUat{Y2(uCbXwkBYgLZdnJ{`Iy=J>#Iv79t_fW4^oyp6`X8y^cl%oW zXu>P{Av!2w$opg*lwjgA0ca__A_c#@Vqmbq4%tNp;Y|0+YvvetaNYO5Uu$inbQL-$ z;)6!ONRs9#it#wUX;puFQzi|m#3cp!;8${Pr-J-lJ$Bx-0w0kLb3#$*!o&fuaxj* zZ|MQECX?-to2|1@|1@-lV5p9*cq*FYqg_kg*9~{cbVp*}lTaMGWDmYlonKh*(I&KP z#{N`!nr>9m1o*QtB9n&l4yL)3=dy~`c6_aF*U@@V*gL>}=q(35lbyXa)4gN+@NL*! z2`OtPuoIf}2%Y%r3U^T__QL9hA2Wj#*AYnhe8TyW_RN;i~$X=h^v>hWKu%oqkI_tv$05Q*s&6#g}G;4ah zu;uR|)5D$blkf{U2sCtt2><|KFa*F+Yc>%8mF9K!&ycB=xv8zIyS*!`x3Rq)tEJCB zv-ls>Wq&1ZZf?N8^H=(>{8h#W;NW5B;^5)sejNaI4sKo!J^&^AKWP7drRMJHX6*9n zlBboqx!r$b>3@>{M{NHY+<#;0|C5L!3KigRXki79U>+;rf-8mrxbz?VX2c-JB{-DE zsU*(83U6q7LwJ)!S z?s_@~uU@+gf|XEgfq9mj1AjDQ(7+z~a`UX}*G|~Umz_i$6k}C!CZax41$;H;&dAyu z!4?LQrlH=`s1+nZsK^I4P+6;eP;0>)@#`(WN$LLv?r>pod6&=mY^@3@P>%KT?oAsD bWx^cX|ECT6moNXyz`ru^uMGSjW#HccWAOb> literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/cache/rspec-3.13.1.gem b/vendor/bundle/ruby/3.2.0/cache/rspec-3.13.1.gem new file mode 100644 index 0000000000000000000000000000000000000000..747921058b6c3bbb40a7e0e36a214c620aac2293 GIT binary patch literal 10752 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 M5%?8>zhngd1L$nPqW}N^ literal 0 HcmV?d00001 diff --git a/vendor/bundle/ruby/3.2.0/cache/rspec-core-3.13.5.gem b/vendor/bundle/ruby/3.2.0/cache/rspec-core-3.13.5.gem new file mode 100644 index 0000000000000000000000000000000000000000..64d5cb8f9cd713b73c2ee57b34ec8984201e5368 GIT binary patch literal 167424 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