From 5e545317e4bf39381ccc2c668cfee940e86f222d Mon Sep 17 00:00:00 2001 From: mkruskal-google Date: Fri, 2 Sep 2022 17:24:27 -0400 Subject: [PATCH 01/27] Rename repo to rules_ruby for consistency --- README.adoc | 14 +++++++------- WORKSPACE | 8 ++++---- examples/example_gem/BUILD.bazel | 2 +- examples/example_gem/WORKSPACE | 6 +++--- examples/example_gem/lib/BUILD | 2 +- examples/example_gem/lib/foo/BUILD | 2 +- examples/simple_rails_api/BUILD | 2 +- examples/simple_rails_api/WORKSPACE | 8 ++++---- examples/simple_script/BUILD.bazel | 2 +- examples/simple_script/WORKSPACE | 8 ++++---- examples/simple_script/lib/BUILD | 2 +- examples/simple_script_vendored/BUILD.bazel | 2 +- examples/simple_script_vendored/WORKSPACE | 8 ++++---- examples/simple_script_vendored/lib/BUILD | 2 +- ruby/defs.bzl | 14 +++++++------- ruby/deps.bzl | 4 ++-- ruby/private/constants.bzl | 2 +- ruby/private/rubocop/def.bzl | 4 ++-- ruby/private/sdk.bzl | 2 +- ruby/tests/BUILD.bazel | 10 +++++----- ruby/tests/load_path_in_runfiles_test.rb | 2 +- ruby/tests/testdata/another_workspace/WORKSPACE | 4 ++-- .../testdata/another_workspace/baz/qux/BUILD.bazel | 2 +- .../testdata/bundle_includes_workspace/BUILD.bazel | 2 +- .../testdata/bundle_includes_workspace/WORKSPACE | 8 ++++---- 25 files changed, 61 insertions(+), 61 deletions(-) diff --git a/README.adoc b/README.adoc index 758e9bb..8dccdae 100644 --- a/README.adoc +++ b/README.adoc @@ -92,13 +92,13 @@ load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") #——————————————————————————————————————————————————————————————————————— git_repository( - name = "bazelruby_rules_ruby", + name = "rules_ruby", remote = "https://github.com/bazelruby/rules_ruby.git", branch = "master" ) load( - "@bazelruby_rules_ruby//ruby:deps.bzl", + "@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_select_sdk", ) @@ -120,7 +120,7 @@ rules_ruby_select_sdk(version = "3.0.2") #——————————————————————————————————————————————————————————————————————— load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_bundle", ) @@ -170,7 +170,7 @@ Add `ruby_library`, `ruby_binary`, `ruby_rspec` or `ruby_test` into your `BUILD. #——————————————————————————————————————————————————————————————————————— load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_binary", "ruby_library", "ruby_test", @@ -215,7 +215,7 @@ Use `ruby_gem` rule to package any number of ruby files or folders into a Ruby-G [source,python] ---- load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_gem", ) @@ -555,7 +555,7 @@ List of glob patterns per gem to be excluded from the library. Keys are the name [source,python] ---- -load("@bazelruby_rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") ruby_bundle( name = "gems", @@ -572,7 +572,7 @@ your workspace. The name should match the name of the bundle. [source,python] ---- -load("@bazelruby_rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") workspace( name = "my_wksp", diff --git a/WORKSPACE b/WORKSPACE index e08c5ee..21ab40d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,4 +1,4 @@ -workspace(name = "bazelruby_rules_ruby") +workspace(name = "rules_ruby") load("@//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_select_sdk") @@ -15,12 +15,12 @@ versions.check("3.4.1") rules_ruby_select_sdk("3.0.2") local_repository( - name = "bazelruby_rules_ruby_ruby_tests_testdata_another_workspace", + name = "rules_ruby_ruby_tests_testdata_another_workspace", path = "ruby/tests/testdata/another_workspace", ) local_repository( - name = "bazelruby_rules_ruby_ruby_tests_testdata_bundle_includes_workspace", + name = "rules_ruby_ruby_tests_testdata_bundle_includes_workspace", path = "ruby/tests/testdata/bundle_includes_workspace", ) @@ -95,7 +95,7 @@ container_pull( repository = "library/ruby", ) -load("@bazelruby_rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") ruby_bundle( name = "bundle", diff --git a/examples/example_gem/BUILD.bazel b/examples/example_gem/BUILD.bazel index 55948ee..9b7baf6 100644 --- a/examples/example_gem/BUILD.bazel +++ b/examples/example_gem/BUILD.bazel @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_gem", ) diff --git a/examples/example_gem/WORKSPACE b/examples/example_gem/WORKSPACE index 0f096a7..a6d9a27 100644 --- a/examples/example_gem/WORKSPACE +++ b/examples/example_gem/WORKSPACE @@ -1,14 +1,14 @@ -workspace(name = "bazelruby_rules_ruby_example_gem") +workspace(name = "rules_ruby_example_gem") # Importing rules_ruby from the parent directory for developing # rules_ruby itself... local_repository( - name = "bazelruby_rules_ruby", + name = "rules_ruby", path = "../..", ) load( - "@bazelruby_rules_ruby//ruby:deps.bzl", + "@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_select_sdk", ) diff --git a/examples/example_gem/lib/BUILD b/examples/example_gem/lib/BUILD index 3239452..360c4c2 100644 --- a/examples/example_gem/lib/BUILD +++ b/examples/example_gem/lib/BUILD @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_library", ) diff --git a/examples/example_gem/lib/foo/BUILD b/examples/example_gem/lib/foo/BUILD index 9e6e2fe..65ad9e7 100644 --- a/examples/example_gem/lib/foo/BUILD +++ b/examples/example_gem/lib/foo/BUILD @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_library", ) diff --git a/examples/simple_rails_api/BUILD b/examples/simple_rails_api/BUILD index c53e54b..8481592 100644 --- a/examples/simple_rails_api/BUILD +++ b/examples/simple_rails_api/BUILD @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_binary", ) diff --git a/examples/simple_rails_api/WORKSPACE b/examples/simple_rails_api/WORKSPACE index 8585cfe..83683f7 100644 --- a/examples/simple_rails_api/WORKSPACE +++ b/examples/simple_rails_api/WORKSPACE @@ -1,14 +1,14 @@ -workspace(name = "bazelruby_rules_ruby_example") +workspace(name = "rules_ruby_example") # Importing rules_ruby from the parent directory for developing # rules_ruby itself... local_repository( - name = "bazelruby_rules_ruby", + name = "rules_ruby", path = "../..", ) load( - "@bazelruby_rules_ruby//ruby:deps.bzl", + "@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_select_sdk", ) @@ -21,7 +21,7 @@ load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") bazel_skylib_workspace() -load("@bazelruby_rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") ruby_bundle( name = "bundle", diff --git a/examples/simple_script/BUILD.bazel b/examples/simple_script/BUILD.bazel index 3f81e7b..678c649 100644 --- a/examples/simple_script/BUILD.bazel +++ b/examples/simple_script/BUILD.bazel @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_binary", "ruby_rspec", "ruby_rubocop", diff --git a/examples/simple_script/WORKSPACE b/examples/simple_script/WORKSPACE index 4ad11d1..be045d2 100644 --- a/examples/simple_script/WORKSPACE +++ b/examples/simple_script/WORKSPACE @@ -1,14 +1,14 @@ -workspace(name = "bazelruby_rules_ruby_example") +workspace(name = "rules_ruby_example") # Importing rules_ruby from the parent directory for developing # rules_ruby itself... local_repository( - name = "bazelruby_rules_ruby", + name = "rules_ruby", path = "../..", ) load( - "@bazelruby_rules_ruby//ruby:deps.bzl", + "@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_select_sdk", ) @@ -17,7 +17,7 @@ rules_ruby_dependencies() rules_ruby_select_sdk(version = "3.0.2") -load("@bazelruby_rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") ruby_bundle( name = "bundle", diff --git a/examples/simple_script/lib/BUILD b/examples/simple_script/lib/BUILD index f125ff8..b212e7f 100644 --- a/examples/simple_script/lib/BUILD +++ b/examples/simple_script/lib/BUILD @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_library", ) diff --git a/examples/simple_script_vendored/BUILD.bazel b/examples/simple_script_vendored/BUILD.bazel index 1fc2d13..43b72f7 100644 --- a/examples/simple_script_vendored/BUILD.bazel +++ b/examples/simple_script_vendored/BUILD.bazel @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_binary", "ruby_rspec", "ruby_rubocop", diff --git a/examples/simple_script_vendored/WORKSPACE b/examples/simple_script_vendored/WORKSPACE index 3aff264..a002fb1 100644 --- a/examples/simple_script_vendored/WORKSPACE +++ b/examples/simple_script_vendored/WORKSPACE @@ -1,17 +1,17 @@ workspace( - name = "bazelruby_rules_ruby_example", + name = "rules_ruby_example", managed_directories = {"@bundle": ["vendor"]}, ) # Importing rules_ruby from the parent directory for developing # rules_ruby itself... local_repository( - name = "bazelruby_rules_ruby", + name = "rules_ruby", path = "../..", ) load( - "@bazelruby_rules_ruby//ruby:deps.bzl", + "@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_select_sdk", ) @@ -20,7 +20,7 @@ rules_ruby_dependencies() rules_ruby_select_sdk(version = "2.7.1") -load("@bazelruby_rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") ruby_bundle( name = "bundle", diff --git a/examples/simple_script_vendored/lib/BUILD b/examples/simple_script_vendored/lib/BUILD index f125ff8..b212e7f 100644 --- a/examples/simple_script_vendored/lib/BUILD +++ b/examples/simple_script_vendored/lib/BUILD @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_library", ) diff --git a/ruby/defs.bzl b/ruby/defs.bzl index 1777d38..f2b35a9 100644 --- a/ruby/defs.bzl +++ b/ruby/defs.bzl @@ -1,32 +1,32 @@ load( - "@bazelruby_rules_ruby//ruby/private:toolchain.bzl", + "@rules_ruby//ruby/private:toolchain.bzl", _toolchain = "ruby_toolchain", ) load( - "@bazelruby_rules_ruby//ruby/private:library.bzl", + "@rules_ruby//ruby/private:library.bzl", _library = "ruby_library", ) load( - "@bazelruby_rules_ruby//ruby/private:binary.bzl", + "@rules_ruby//ruby/private:binary.bzl", _binary = "ruby_binary", _test = "ruby_test", ) load( - "@bazelruby_rules_ruby//ruby/private/bundle:def.bzl", + "@rules_ruby//ruby/private/bundle:def.bzl", _bundle = "bundle_install", _ruby_bundle = "ruby_bundle_install", ) load( - "@bazelruby_rules_ruby//ruby/private:rspec.bzl", + "@rules_ruby//ruby/private:rspec.bzl", _rspec = "ruby_rspec", _rspec_test = "ruby_rspec_test", ) load( - "@bazelruby_rules_ruby//ruby/private/rubocop:def.bzl", + "@rules_ruby//ruby/private/rubocop:def.bzl", _rubocop = "rubocop", ) load( - "@bazelruby_rules_ruby//ruby/private/gemspec:def.bzl", + "@rules_ruby//ruby/private/gemspec:def.bzl", _gem = "gem", _gemspec = "gemspec", ) diff --git a/ruby/deps.bzl b/ruby/deps.bzl index 3a7c45b..8812fd3 100644 --- a/ruby/deps.bzl +++ b/ruby/deps.bzl @@ -1,10 +1,10 @@ # Repository rules load( - "@bazelruby_rules_ruby//ruby/private:dependencies.bzl", + "@rules_ruby//ruby/private:dependencies.bzl", _rules_ruby_dependencies = "rules_ruby_dependencies", ) load( - "@bazelruby_rules_ruby//ruby/private:sdk.bzl", + "@rules_ruby//ruby/private:sdk.bzl", _rules_ruby_select_sdk = "rules_ruby_select_sdk", ) diff --git a/ruby/private/constants.bzl b/ruby/private/constants.bzl index a76f8f3..14c0e00 100644 --- a/ruby/private/constants.bzl +++ b/ruby/private/constants.bzl @@ -1,7 +1,7 @@ # Ruby Constants load(":providers.bzl", "RubyLibraryInfo") -RULES_RUBY_WORKSPACE_NAME = "@bazelruby_rules_ruby" +RULES_RUBY_WORKSPACE_NAME = "@rules_ruby" TOOLCHAIN_TYPE_NAME = "%s//ruby:toolchain_type" % RULES_RUBY_WORKSPACE_NAME DEFAULT_BUNDLER_VERSION = "2.1.4" diff --git a/ruby/private/rubocop/def.bzl b/ruby/private/rubocop/def.bzl index 0319906..28cb240 100644 --- a/ruby/private/rubocop/def.bzl +++ b/ruby/private/rubocop/def.bzl @@ -1,4 +1,4 @@ -load("@bazelruby_rules_ruby//ruby/private:binary.bzl", "ruby_binary") +load("@rules_ruby//ruby/private:binary.bzl", "ruby_binary") # This wraps an rb_binary in a script that is executed from the workspace folder def rubocop(name, bin, deps): @@ -9,7 +9,7 @@ def rubocop(name, bin, deps): deps = deps, ) - runner = "@bazelruby_rules_ruby//ruby/private/rubocop:runner.sh.tpl" + runner = "@rules_ruby//ruby/private/rubocop:runner.sh.tpl" native.genrule( name = name, tools = [bin_name], diff --git a/ruby/private/sdk.bzl b/ruby/private/sdk.bzl index 7123575..bc21c68 100644 --- a/ruby/private/sdk.bzl +++ b/ruby/private/sdk.bzl @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby/private/toolchains:ruby_runtime.bzl", + "@rules_ruby//ruby/private/toolchains:ruby_runtime.bzl", _ruby_runtime = "ruby_runtime", ) diff --git a/ruby/tests/BUILD.bazel b/ruby/tests/BUILD.bazel index b3e7290..cded039 100644 --- a/ruby/tests/BUILD.bazel +++ b/ruby/tests/BUILD.bazel @@ -120,7 +120,7 @@ ruby_binary( main = "load_path_in_runfiles_test.rb", deps = [ "//ruby/tests/testdata:g", - "@bazelruby_rules_ruby_ruby_tests_testdata_another_workspace//baz/qux:j", + "@rules_ruby_ruby_tests_testdata_another_workspace//baz/qux:j", ], ) @@ -137,7 +137,7 @@ ruby_test( main = "load_path_in_runfiles_test.rb", deps = [ "//ruby/tests/testdata:g", - "@bazelruby_rules_ruby_ruby_tests_testdata_another_workspace//baz/qux:j", + "@rules_ruby_ruby_tests_testdata_another_workspace//baz/qux:j", ], ) @@ -250,13 +250,13 @@ pkg_tar( include_runfiles = True, package_dir = "/app", remap_paths = { - "ruby": "load_path_in_runfiles.runfiles/bazelruby_rules_ruby/ruby", + "ruby": "load_path_in_runfiles.runfiles/rules_ruby/ruby", ".": "load_path_in_runfiles.runfiles/", }, strip_prefix = "dummy", symlinks = { - "/app/load_path_in_runfiles.runfiles/bazelruby_rules_ruby/external": "/app/load_path_in_runfiles.runfiles", - "/app/load_path_in_runfiles": "/app/load_path_in_runfiles.runfiles/bazelruby_rules_ruby/ruby/tests/load_path_in_runfiles", + "/app/load_path_in_runfiles.runfiles/rules_ruby/external": "/app/load_path_in_runfiles.runfiles", + "/app/load_path_in_runfiles": "/app/load_path_in_runfiles.runfiles/rules_ruby/ruby/tests/load_path_in_runfiles", }, ) diff --git a/ruby/tests/load_path_in_runfiles_test.rb b/ruby/tests/load_path_in_runfiles_test.rb index 9521827..1af9a4e 100644 --- a/ruby/tests/load_path_in_runfiles_test.rb +++ b/ruby/tests/load_path_in_runfiles_test.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true require 'ruby/tests/testdata/foo/g' -require 'external/bazelruby_rules_ruby_ruby_tests_testdata_another_workspace/baz/qux/j' +require 'external/rules_ruby_ruby_tests_testdata_another_workspace/baz/qux/j' [g, j] diff --git a/ruby/tests/testdata/another_workspace/WORKSPACE b/ruby/tests/testdata/another_workspace/WORKSPACE index 86ed1c1..0ffdd6e 100644 --- a/ruby/tests/testdata/another_workspace/WORKSPACE +++ b/ruby/tests/testdata/another_workspace/WORKSPACE @@ -1,5 +1,5 @@ -workspace(name = "bazelruby_rules_ruby_ruby_tests_testdata_another_workspace") +workspace(name = "rules_ruby_ruby_tests_testdata_another_workspace") -load("@bazelruby_rules_ruby//ruby:defs.bzl", "rules_ruby_select_sdk") +load("@rules_ruby//ruby:defs.bzl", "rules_ruby_select_sdk") rules_ruby_select_sdk() diff --git a/ruby/tests/testdata/another_workspace/baz/qux/BUILD.bazel b/ruby/tests/testdata/another_workspace/baz/qux/BUILD.bazel index 89a2dfe..96d5c61 100644 --- a/ruby/tests/testdata/another_workspace/baz/qux/BUILD.bazel +++ b/ruby/tests/testdata/another_workspace/baz/qux/BUILD.bazel @@ -1,4 +1,4 @@ -load("@bazelruby_rules_ruby//ruby:defs.bzl", "ruby_library") +load("@rules_ruby//ruby:defs.bzl", "ruby_library") package(default_visibility = ["//visibility:public"]) diff --git a/ruby/tests/testdata/bundle_includes_workspace/BUILD.bazel b/ruby/tests/testdata/bundle_includes_workspace/BUILD.bazel index 01b33fa..5663a68 100644 --- a/ruby/tests/testdata/bundle_includes_workspace/BUILD.bazel +++ b/ruby/tests/testdata/bundle_includes_workspace/BUILD.bazel @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_binary", ) diff --git a/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE b/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE index 00a3bb4..2cabf3c 100644 --- a/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE +++ b/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE @@ -1,12 +1,12 @@ -workspace(name = "bazelruby_rules_ruby_ruby_tests_testdata_bundle_includes_workspace") +workspace(name = "rules_ruby_ruby_tests_testdata_bundle_includes_workspace") local_repository( - name = "bazelruby_rules_ruby", + name = "rules_ruby", path = "../../../..", ) load( - "@bazelruby_rules_ruby//ruby:deps.bzl", + "@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_select_sdk", ) @@ -15,7 +15,7 @@ rules_ruby_dependencies() rules_ruby_select_sdk(version = "3.0.2") -load("@bazelruby_rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") ruby_bundle( name = "gems", From 9d825541149481f91b967ac737e63319f7d166a7 Mon Sep 17 00:00:00 2001 From: mkruskal-google Date: Fri, 2 Sep 2022 17:25:14 -0400 Subject: [PATCH 02/27] Allow generation of gemfile lock if one doesn't exist --- ruby/private/bundle/def.bzl | 40 +++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/ruby/private/bundle/def.bzl b/ruby/private/bundle/def.bzl index e368bd4..fa6fb45 100644 --- a/ruby/private/bundle/def.bzl +++ b/ruby/private/bundle/def.bzl @@ -44,7 +44,7 @@ def run_bundler(runtime_ctx, bundler_arguments, previous_result): # $ bundle config --local | --global config-option config-value # # @config_category can be either 'local' or 'global' -def set_bundler_config(runtime_ctx, previous_result, config_category = "local"): +def set_bundler_config(runtime_ctx, previous_result, has_lock = True, config_category = "local"): # Bundler is deprecating various flags in favor of the configuration. # HOWEVER — for reasons I can't explain, Bazel runs "bundle install" *prior* # to setting these flags. So the flags are then useless until we can force the @@ -53,11 +53,11 @@ def set_bundler_config(runtime_ctx, previous_result, config_category = "local"): # # Set local configuration options for bundler bundler_config = { - "deployment": "true", + "deployment": "true" if has_lock else "false", "standalone": "true", "force": "false", "redownload": "false", - "frozen": "true", + "frozen": "true" if has_lock else "false", "path": BUNDLE_PATH, "jobs": "20", "shebang": runtime_ctx.interpreter, @@ -116,12 +116,12 @@ def install_bundler(runtime_ctx, bundler_version): def bundle_install(runtime_ctx, previous_result): cwd = runtime_ctx.ctx.path(".") bundler_args = [ - "install", - "--binstubs={}".format(cwd.get_child(BUNDLE_BIN_PATH)), - "--path={}".format(cwd.get_child(BUNDLE_PATH)), + "install", "-V", "--standalone", "--gemfile={}".format(runtime_ctx.ctx.attr.gemfile.name), + "--jobs=10", # run a few jobs to ensure no gem install is blocking another ] + if runtime_ctx.ctx.attr.gemfile_lock: bundler_args += ["--deployment", "--frozen"] @@ -133,8 +133,15 @@ def bundle_install(runtime_ctx, previous_result): if result.return_code: fail("bundle install failed: %s%s" % (result.stdout, result.stderr)) - else: - return result + + # Creates a directory and place any executables from the gem there. + result = run_bundler(runtime_ctx, [ + "binstubs", "--all", "--path", "{}".format(BUNDLE_BIN_PATH) + ], previous_result) + if result.return_code: + fail("bundle binstubs failed: %s%s" % (result.stdout, result.stderr)) + + return result def generate_bundle_build_file(runtime_ctx, previous_result): if runtime_ctx.ctx.attr.gemfile_lock: @@ -185,16 +192,27 @@ def _ruby_bundle_impl(ctx): environment = {"RUBYOPT": "--enable-gems"}, ) + result = run_bundler( + runtime_ctx, + ["clean"], + None, + ) + # 1. Install the right version of the Bundler Gem result = install_bundler(runtime_ctx, bundler_version) - # 2. Set Bundler config in the .bundle/config file + # 2. Generate a Gemfile.lock file if one isn't provided + if not runtime_ctx.ctx.attr.gemfile_lock: + result = set_bundler_config(runtime_ctx, result, has_lock=False) + result = bundle_install(runtime_ctx, result) + + # 3. Set Bundler config in the .bundle/config file result = set_bundler_config(runtime_ctx, result) - # 3. Run bundle install + # 4. Run bundle install result = bundle_install(runtime_ctx, result) - # 4. Generate the BUILD file for the bundle + # 5. Generate the BUILD file for the bundle generate_bundle_build_file(runtime_ctx, result) ruby_bundle_install = repository_rule( From 6bae07f73229d7dc0b318b3733843f77edd9899b Mon Sep 17 00:00:00 2001 From: mkruskal-google Date: Sat, 3 Sep 2022 23:20:23 -0400 Subject: [PATCH 03/27] Upgrade ruby-build and add jruby support --- ruby/private/sdk.bzl | 19 +++++++++++++------ ruby/private/toolchains/ruby_runtime.bzl | 15 ++++++++++----- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/ruby/private/sdk.bzl b/ruby/private/sdk.bzl index bc21c68..792b6ab 100644 --- a/ruby/private/sdk.bzl +++ b/ruby/private/sdk.bzl @@ -28,16 +28,23 @@ def rules_ruby_select_sdk(version = "host"): "3.0.3", "3.1.0", "3.1.1", + "jruby-9.2.21.0", + "jruby-9.3.6.0", ] - if version in supported_versions: - _ruby_runtime( - name = "org_ruby_lang_ruby_toolchain", - version = version, - ) - else: + for v in sorted(supported_versions, reverse=True): + if v.startswith(version): + supported_version = v + break + + if not supported_version: fail("rules_ruby_select_sdk: unsupported ruby version '%s' not in '%s'" % (version, supported_versions)) + _ruby_runtime( + name = "org_ruby_lang_ruby_toolchain", + version = supported_version, + ) + native.register_toolchains( "@org_ruby_lang_ruby_toolchain//:toolchain", ) diff --git a/ruby/private/toolchains/ruby_runtime.bzl b/ruby/private/toolchains/ruby_runtime.bzl index 5e53377..4959dbf 100644 --- a/ruby/private/toolchains/ruby_runtime.bzl +++ b/ruby/private/toolchains/ruby_runtime.bzl @@ -3,17 +3,19 @@ load("//ruby/private/toolchains:repository_context.bzl", "ruby_repository_contex def _install_ruby_version(ctx, version): ctx.download_and_extract( - url = "https://github.com/rbenv/ruby-build/archive/refs/tags/v20220218.tar.gz", - sha256 = "35c82b13b7bc3713eee5615b0145c79fbbac32873f55f2ab796620d76970d8e3", - stripPrefix = "ruby-build-20220218", + url = "https://github.com/rbenv/ruby-build/archive/refs/tags/v20220825.tar.gz", + sha256 = "55d9363a27486e4ec9623985d7764c5cf8e59cafe58afcf666e81fa148dea2f0", + stripPrefix = "ruby-build-20220825", ) install_path = "./build" - ctx.execute( + result = ctx.execute( ["./bin/ruby-build", "--verbose", version, install_path], quiet = False, timeout = 1600, # massive timeout because this does a lot and is a beast ) + if result.return_code: + fail("Ruby build failed: %s %s" % (result.stdout, result.stderr)) def _is_subpath(path, ancestors): """Determines if path is a subdirectory of one of the ancestors""" @@ -107,6 +109,9 @@ def host_ruby_is_correct_version(ctx, version): return False ruby_version = ctx.execute(["ruby", "-e", "print RUBY_VERSION"]).stdout + ruby_platform = ctx.execute(["ruby", "-e", "print RUBY_PLATFORM"]).stdout + if ruby_platform == "java": + ruby_version = "jruby-" + ruby_version have_ruby_version = (version == ruby_version) @@ -124,7 +129,7 @@ def _ruby_runtime_impl(ctx): _install_ruby_version(ctx, version) interpreter_path = ctx.path("./build/bin/ruby") - if not interpreter_path: + if not interpreter_path or not interpreter_path.exists: fail( "Command 'ruby' not found. Set $PATH or specify interpreter_path", "interpreter_path", From d5d428e1283aa9e3866049680e47ba1bb6ff0530 Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Fri, 30 Sep 2022 10:42:36 -0700 Subject: [PATCH 04/27] Adding necessary info for go/releasing (#6) --- CONTRIBUTING.md | 32 ++++++++++++++++++++++++++++++++ LICENSE | 3 ++- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..e330683 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,32 @@ +# How to Contribute + +This repository is currently a WIP, forked from +[rules_ruby](https://github.com/bazelruby/rules_ruby) for use in building and +testing Ruby [Protobuf](https://github.com/protocolbuffers/protobuf). + +TODO(mkruskal): Fill in automated testing procedure. + +## Contributor License Agreement + +Contributions to this project must be accompanied by a Contributor License +Agreement (CLA). You (or your employer) retain the copyright to your +contribution; this simply gives us permission to use and redistribute your +contributions as part of the project. Head over to + to see your current agreements on file or +to sign a new one. + +You generally only need to submit a CLA once, so if you've already submitted one +(even if it was for a different project), you probably don't need to do it +again. + +## Code Reviews + +All submissions, including submissions by project members, require review. We +use GitHub pull requests for this purpose. Consult +[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more +information on using pull requests. + +## Community Guidelines + +This project follows +[Google's Open Source Community Guidelines](https://opensource.google/conduct/). diff --git a/LICENSE b/LICENSE index 261eeb9..61679c3 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,8 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2018-2021 BazelRubyContributors. + Copyright 2022 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 1f3f49fe1586902640dad05d31029f31a7c72b2d Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Tue, 4 Oct 2022 10:33:12 -0700 Subject: [PATCH 05/27] Update CONTRIBUTING.md --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e330683..f7f24c1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,8 @@ This repository is currently a WIP, forked from [rules_ruby](https://github.com/bazelruby/rules_ruby) for use in building and testing Ruby [Protobuf](https://github.com/protocolbuffers/protobuf). -TODO(mkruskal): Fill in automated testing procedure. +We'd love to accept your patches and contributions to this project. There are +just a few small guidelines you need to follow. ## Contributor License Agreement From 9465e27cdcaa02c3f16b51315bb768e2d1013cab Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Thu, 6 Oct 2022 11:46:28 -0700 Subject: [PATCH 06/27] Fixing license template (#7) --- LICENSE | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index 61679c3..261eeb9 100644 --- a/LICENSE +++ b/LICENSE @@ -186,8 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2018-2021 BazelRubyContributors. - Copyright 2022 Google LLC + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 019aab101e31f525b5338b2c1efc38c9d11ddbd8 Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Tue, 25 Oct 2022 12:19:45 -0700 Subject: [PATCH 07/27] Add github actions for CI (#8) * Add github actions for CI * Ran builidifier --- .github/workflows/tests.yaml | 25 +++++++++++++++++++++++++ ruby/private/bundle/def.bzl | 10 +++++++--- ruby/private/sdk.bzl | 2 +- 3 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/tests.yaml diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml new file mode 100644 index 0000000..00501d6 --- /dev/null +++ b/.github/workflows/tests.yaml @@ -0,0 +1,25 @@ +name: Tests + +on: + push: + branches: + - master + pull_request: + branches: + - master + +jobs: + test-suite: + name: "Test Suite" + + runs-on: ubuntu-latest + + strategy: + fail-fast: false # Don't cancel all jobs if one fails. + + steps: + - uses: actions/checkout@v3 + - name: Run Setup + run: cd ${{ github.workspace }} && bin/setup + - name: Run Bazel Tests + run: cd ${{ github.workspace }} && bin/test-suite diff --git a/ruby/private/bundle/def.bzl b/ruby/private/bundle/def.bzl index fa6fb45..802c11b 100644 --- a/ruby/private/bundle/def.bzl +++ b/ruby/private/bundle/def.bzl @@ -116,7 +116,8 @@ def install_bundler(runtime_ctx, bundler_version): def bundle_install(runtime_ctx, previous_result): cwd = runtime_ctx.ctx.path(".") bundler_args = [ - "install", "-V", + "install", + "-V", "--standalone", "--gemfile={}".format(runtime_ctx.ctx.attr.gemfile.name), "--jobs=10", # run a few jobs to ensure no gem install is blocking another @@ -136,7 +137,10 @@ def bundle_install(runtime_ctx, previous_result): # Creates a directory and place any executables from the gem there. result = run_bundler(runtime_ctx, [ - "binstubs", "--all", "--path", "{}".format(BUNDLE_BIN_PATH) + "binstubs", + "--all", + "--path", + "{}".format(BUNDLE_BIN_PATH), ], previous_result) if result.return_code: fail("bundle binstubs failed: %s%s" % (result.stdout, result.stderr)) @@ -203,7 +207,7 @@ def _ruby_bundle_impl(ctx): # 2. Generate a Gemfile.lock file if one isn't provided if not runtime_ctx.ctx.attr.gemfile_lock: - result = set_bundler_config(runtime_ctx, result, has_lock=False) + result = set_bundler_config(runtime_ctx, result, has_lock = False) result = bundle_install(runtime_ctx, result) # 3. Set Bundler config in the .bundle/config file diff --git a/ruby/private/sdk.bzl b/ruby/private/sdk.bzl index 792b6ab..b82402d 100644 --- a/ruby/private/sdk.bzl +++ b/ruby/private/sdk.bzl @@ -32,7 +32,7 @@ def rules_ruby_select_sdk(version = "host"): "jruby-9.3.6.0", ] - for v in sorted(supported_versions, reverse=True): + for v in sorted(supported_versions, reverse = True): if v.startswith(version): supported_version = v break From fdcf4ce5cc4eaf786212f45f5a44d076f1ace11b Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Wed, 26 Oct 2022 13:29:45 -0700 Subject: [PATCH 08/27] Add ruby versioning support (#1) * Use specified toolchain for ruby binaries instead of host default * Support autodetection of ruby platform * Implement ruby versioning scheme based on flag settings * Cleaning up toolchain registration * Fixed broken tests in bin/test-suite * Responding to review comments * Consolidate version settings, add some testing * Ran buildifier * Rename main branch for CI --- .github/workflows/tests.yaml | 4 +- README.adoc | 13 +-- WORKSPACE | 9 +- bin/test-suite | 26 ++++-- examples/example_gem/WORKSPACE | 10 +- examples/simple_rails_api/WORKSPACE | 10 +- examples/simple_script/WORKSPACE | 8 +- examples/simple_script_vendored/WORKSPACE | 8 +- ruby/deps.bzl | 4 +- ruby/private/BUILD.bazel | 1 + ruby/private/binary.bzl | 26 +++++- ruby/private/binary_runner.tpl | 14 +++ ruby/private/binary_wrapper.tpl | 2 - ruby/private/constants.bzl | 53 ++++++++++- ruby/private/providers.bzl | 11 +++ ruby/private/runtime_alias.bzl | 74 +++++++++++++++ ruby/private/sdk.bzl | 91 +++++++++--------- ruby/private/toolchain.bzl | 21 ++--- ruby/private/toolchains/BUILD.runtime.tpl | 31 +++++++ ruby/private/toolchains/ruby_runtime.bzl | 27 ++++-- ruby/runtime/BUILD.bazel | 93 +++++++++++++++++++ ruby/runtime/version_support.bzl | 26 ++++++ ruby/tests/BUILD.bazel | 12 +-- ruby/tests/runtime_run_ruby_test.sh | 2 +- .../testdata/another_workspace/WORKSPACE | 4 +- .../bundle_includes_workspace/WORKSPACE | 8 +- 26 files changed, 454 insertions(+), 134 deletions(-) create mode 100644 ruby/private/binary_runner.tpl create mode 100644 ruby/private/runtime_alias.bzl create mode 100644 ruby/runtime/BUILD.bazel create mode 100644 ruby/runtime/version_support.bzl diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 00501d6..2333bc3 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -3,10 +3,10 @@ name: Tests on: push: branches: - - master + - main pull_request: branches: - - master + - main jobs: test-suite: diff --git a/README.adoc b/README.adoc index 8dccdae..a41ebc6 100644 --- a/README.adoc +++ b/README.adoc @@ -97,12 +97,7 @@ git_repository( branch = "master" ) -load( - "@rules_ruby//ruby:deps.bzl", - "rules_ruby_dependencies", - "rules_ruby_select_sdk", -) - +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() #——————————————————————————————————————————————————————————————————————— @@ -113,7 +108,8 @@ rules_ruby_dependencies() load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") bazel_skylib_workspace() -rules_ruby_select_sdk(version = "3.0.2") +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") +rules_ruby_register_toolchains(["ruby-3.0"]) #——————————————————————————————————————————————————————————————————————— # Now, load the ruby_bundle rule & install gems specified in the Gemfile @@ -486,8 +482,7 @@ ruby_bundle( excludes = {}, srcs = [], vendor_cache = False, - ruby_sdk = "@org_ruby_lang_ruby_toolchain", - ruby_interpreter = "@org_ruby_lang_ruby_toolchain//:ruby", + ruby_interpreter = "@rules_ruby//ruby/runtime:interpreter", ) ---- diff --git a/WORKSPACE b/WORKSPACE index 21ab40d..4f8da71 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,6 +1,6 @@ workspace(name = "rules_ruby") -load("@//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_select_sdk") +load("@//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() @@ -12,7 +12,12 @@ load("@bazel_skylib//lib:versions.bzl", "versions") versions.check("3.4.1") -rules_ruby_select_sdk("3.0.2") +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") + +rules_ruby_register_toolchains([ + "ruby-3.0", + "jruby-9.2", +]) local_repository( name = "rules_ruby_ruby_tests_testdata_another_workspace", diff --git a/bin/test-suite b/bin/test-suite index 63643f1..080f291 100755 --- a/bin/test-suite +++ b/bin/test-suite @@ -32,11 +32,6 @@ export BashMatic__Expr=" [[ -f ${HOME}/.bashmatic/init.sh ]] && source ${HOME}/.bashmatic/init.sh; set -e " -export Bazel__BuildSteps=" - bazel ${BAZEL_OPTS} info; echo; echo - bazel ${BAZEL_OPTS} build ${BAZEL_BUILD_OPTS} -- //... ; echo; echo - bazel ${BAZEL_OPTS} test ${BAZEL_BUILD_OPTS} ${BAZEL_TEST_OPTS} -- //... ; echo; echo -" deps.start-clock run.set-all abort-on-error show-output-on @@ -162,9 +157,11 @@ test.buildifier() { test.simple-script() { __test.exec simple-script " cd examples/simple_script - ${Bazel__BuildSteps} - echo run :bin; bazel ${BAZEL_OPTS} run ${BAZEL_BUILD_OPTS} :bin - echo run :rubocop; bazel ${BAZEL_OPTS} run ${BAZEL_BUILD_OPTS} :rubocop + bazel ${BAZEL_OPTS} info; echo; echo + bazel ${BAZEL_OPTS} build ${BAZEL_BASE_BUILD_OPTS} -- //... ; echo; echo + bazel ${BAZEL_OPTS} test ${BAZEL_BASE_BUILD_OPTS} ${BAZEL_TEST_OPTS} -- //... ; echo; echo + echo run :bin; bazel ${BAZEL_OPTS} run ${BAZEL_BASE_BUILD_OPTS} :bin + echo run :rubocop; bazel ${BAZEL_OPTS} run ${BAZEL_BASE_BUILD_OPTS} :rubocop " } @@ -172,12 +169,21 @@ test.simple-script() { test.example-gem() { __test.exec example-gem " cd examples/example_gem - echo bazel ${BAZEL_OPTS} build ...:all; bazel ${BAZEL_OPTS} build ...:all + echo bazel ${BAZEL_OPTS} build ...:all + bazel ${BAZEL_OPTS} build --@rules_ruby//ruby/runtime:version=ruby-3.0 ...:all " } test.workspace() { - __test.exec workspace "${Bazel__BuildSteps}" + __test.exec workspace " + bazel ${BAZEL_OPTS} info; echo; echo + bazel ${BAZEL_OPTS} build ${BAZEL_BUILD_OPTS} -- //... ; echo; echo + bazel ${BAZEL_OPTS} test ${BAZEL_BUILD_OPTS} ${BAZEL_TEST_OPTS} -- //... ; echo; echo + bazel ${BAZEL_OPTS} build ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=ruby-3.0 -- //... ; echo; echo + bazel ${BAZEL_OPTS} test ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=ruby-3.0 ${BAZEL_TEST_OPTS} -- //... ; echo; echo + bazel ${BAZEL_OPTS} build ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=jruby-9.2 -- //... ; echo; echo + bazel ${BAZEL_OPTS} test ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=jruby-9.2 ${BAZEL_TEST_OPTS} -- //... ; echo; echo + " } # Private diff --git a/examples/example_gem/WORKSPACE b/examples/example_gem/WORKSPACE index a6d9a27..c55061d 100644 --- a/examples/example_gem/WORKSPACE +++ b/examples/example_gem/WORKSPACE @@ -7,15 +7,13 @@ local_repository( path = "../..", ) -load( - "@rules_ruby//ruby:deps.bzl", - "rules_ruby_dependencies", - "rules_ruby_select_sdk", -) +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() -rules_ruby_select_sdk("3.0.2") +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") + +rules_ruby_register_toolchains(["ruby-3.0"]) load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") diff --git a/examples/simple_rails_api/WORKSPACE b/examples/simple_rails_api/WORKSPACE index 83683f7..6c031ef 100644 --- a/examples/simple_rails_api/WORKSPACE +++ b/examples/simple_rails_api/WORKSPACE @@ -7,15 +7,13 @@ local_repository( path = "../..", ) -load( - "@rules_ruby//ruby:deps.bzl", - "rules_ruby_dependencies", - "rules_ruby_select_sdk", -) +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() -rules_ruby_select_sdk(version = "3.0.2") +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") + +rules_ruby_register_toolchains(["ruby-3.0"]) load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") diff --git a/examples/simple_script/WORKSPACE b/examples/simple_script/WORKSPACE index be045d2..c95bbb8 100644 --- a/examples/simple_script/WORKSPACE +++ b/examples/simple_script/WORKSPACE @@ -7,15 +7,11 @@ local_repository( path = "../..", ) -load( - "@rules_ruby//ruby:deps.bzl", - "rules_ruby_dependencies", - "rules_ruby_select_sdk", -) +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_register_toolchains") rules_ruby_dependencies() -rules_ruby_select_sdk(version = "3.0.2") +rules_ruby_register_toolchains(["ruby-3.0"]) load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") diff --git a/examples/simple_script_vendored/WORKSPACE b/examples/simple_script_vendored/WORKSPACE index a002fb1..95d5446 100644 --- a/examples/simple_script_vendored/WORKSPACE +++ b/examples/simple_script_vendored/WORKSPACE @@ -10,15 +10,11 @@ local_repository( path = "../..", ) -load( - "@rules_ruby//ruby:deps.bzl", - "rules_ruby_dependencies", - "rules_ruby_select_sdk", -) +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_register_toolchains") rules_ruby_dependencies() -rules_ruby_select_sdk(version = "2.7.1") +rules_ruby_register_toolchains(["ruby-2.7.1"]) load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") diff --git a/ruby/deps.bzl b/ruby/deps.bzl index 8812fd3..73b5b80 100644 --- a/ruby/deps.bzl +++ b/ruby/deps.bzl @@ -5,8 +5,8 @@ load( ) load( "@rules_ruby//ruby/private:sdk.bzl", - _rules_ruby_select_sdk = "rules_ruby_select_sdk", + _rules_ruby_register_toolchains = "rules_ruby_register_toolchains", ) rules_ruby_dependencies = _rules_ruby_dependencies -rules_ruby_select_sdk = _rules_ruby_select_sdk +rules_ruby_register_toolchains = _rules_ruby_register_toolchains diff --git a/ruby/private/BUILD.bazel b/ruby/private/BUILD.bazel index 1c16e04..98152bb 100644 --- a/ruby/private/BUILD.bazel +++ b/ruby/private/BUILD.bazel @@ -1,6 +1,7 @@ exports_files( [ "binary_wrapper.tpl", + "binary_runner.tpl", ], visibility = ["//visibility:public"], ) diff --git a/ruby/private/binary.bzl b/ruby/private/binary.bzl index 4a38054..480fe5e 100644 --- a/ruby/private/binary.bzl +++ b/ruby/private/binary.bzl @@ -29,7 +29,9 @@ def _get_gem_path(incpaths): # to create a rule (eg, rubocop) that does exactly the same. def ruby_binary_macro(ctx, main, srcs): sdk = ctx.toolchains[TOOLCHAIN_TYPE_NAME].ruby_runtime - interpreter = sdk.interpreter[DefaultInfo].files_to_run.executable + interpreter_info = sdk.interpreter[DefaultInfo] + interpreter = interpreter_info.files_to_run.executable + interpreter_runfiles = interpreter_info.default_runfiles.merge(interpreter_info.data_runfiles) if not main: expected_name = "%s.rb" % ctx.attr.name @@ -45,10 +47,11 @@ def ruby_binary_macro(ctx, main, srcs): ) executable = ctx.actions.declare_file(ctx.attr.name) + wrapper = ctx.actions.declare_file(ctx.attr.name + "_wrapper") deps = _transitive_deps( ctx, - extra_files = [executable], + extra_files = [executable, wrapper, interpreter], extra_deps = ctx.attr._misc_deps, ) @@ -60,21 +63,34 @@ def ruby_binary_macro(ctx, main, srcs): ctx.actions.expand_template( template = ctx.file._wrapper_template, - output = executable, + output = wrapper, substitutions = { "{loadpaths}": repr(deps.incpaths.to_list()), "{rubyopt}": repr(rubyopt), "{main}": repr(_to_manifest_path(ctx, main)), - "{interpreter}": _to_manifest_path(ctx, interpreter), "{gem_path}": gem_path, "{should_gem_pristine}": str(len(gems_to_pristine) > 0).lower(), "{gems_to_pristine}": " ".join(gems_to_pristine), }, ) + ctx.actions.expand_template( + template = ctx.file._runner_template, + output = executable, + substitutions = { + "{main}": wrapper.short_path, + "{interpreter}": interpreter.short_path, + "{workspace_name}": ctx.label.workspace_name or ctx.workspace_name, + }, + is_executable = True, + ) + info = DefaultInfo( executable = executable, - runfiles = deps.default_files.merge(deps.data_files), + runfiles = deps.default_files + .merge(deps.data_files) + .merge(interpreter_runfiles) + .merge(ctx.runfiles(files = [wrapper])), ) return [info] diff --git a/ruby/private/binary_runner.tpl b/ruby/private/binary_runner.tpl new file mode 100644 index 0000000..dc5ae04 --- /dev/null +++ b/ruby/private/binary_runner.tpl @@ -0,0 +1,14 @@ +#!/bin/sh + +if [ -n "${RUNFILES_DIR+x}" ]; then + PATH_PREFIX=$RUNFILES_DIR/{workspace_name}/ +elif [ -s `dirname $0`/../../MANIFEST ]; then + PATH_PREFIX=`cd $(dirname $0); pwd`/ +elif [ -d $0.runfiles ]; then + PATH_PREFIX=`cd $0.runfiles; pwd`/{workspace_name}/ +else + echo "WARNING: it does not look to be at the .runfiles directory" >&2 + exit 1 +fi + +$PATH_PREFIX{interpreter} -I${PATH_PREFIX} ${PATH_PREFIX}{main} "$@" \ No newline at end of file diff --git a/ruby/private/binary_wrapper.tpl b/ruby/private/binary_wrapper.tpl index 09e0402..3b63362 100755 --- a/ruby/private/binary_wrapper.tpl +++ b/ruby/private/binary_wrapper.tpl @@ -1,5 +1,3 @@ -#!/usr/bin/env ruby - # Ruby-port of the Bazel's wrapper script for Python # Copyright 2017 The Bazel Authors. All rights reserved. diff --git a/ruby/private/constants.bzl b/ruby/private/constants.bzl index 14c0e00..3bd1e9a 100644 --- a/ruby/private/constants.bzl +++ b/ruby/private/constants.bzl @@ -38,6 +38,10 @@ RUBY_ATTRS = { allow_single_file = True, default = "binary_wrapper.tpl", ), + "_runner_template": attr.label( + allow_single_file = True, + default = "binary_runner.tpl", + ), "_misc_deps": attr.label_list( allow_files = True, default = ["@bazel_tools//tools/bash/runfiles"], @@ -66,11 +70,8 @@ RSPEC_ATTRS.update(RUBY_ATTRS) RSPEC_ATTRS.update(_RSPEC_ATTRS) BUNDLE_ATTRS = { - "ruby_sdk": attr.string( - default = "@org_ruby_lang_ruby_toolchain", - ), "ruby_interpreter": attr.label( - default = "@org_ruby_lang_ruby_toolchain//:ruby", + default = "@local_config_ruby_system//:ruby", ), "gemfile": attr.label( allow_single_file = True, @@ -154,3 +155,47 @@ GEMSPEC_ATTRS = { default = "%s//ruby/private/gemspec:readme_template.tpl" % RULES_RUBY_WORKSPACE_NAME, ), } + +# The full list of supported pinned version numbers. +SUPPORTED_VERSIONS = [ + "system", + "ruby-2.5.8", + "ruby-2.5.9", + "ruby-2.6.3", + "ruby-2.6.4", + "ruby-2.6.5", + "ruby-2.6.6", + "ruby-2.6.7", + "ruby-2.6.8", + "ruby-2.6.9", + "ruby-2.7.1", + "ruby-2.7.2", + "ruby-2.7.3", + "ruby-2.7.4", + "ruby-2.7.5", + "ruby-3.0.0", + "ruby-3.0.1", + "ruby-3.0.2", + "ruby-3.0.3", + "ruby-3.1.0", + "ruby-3.1.1", + "jruby-9.2.21.0", # Corresponded to 2.5.8 + "jruby-9.3.6.0", # Corresponds to 2.6.8 +] + +def get_supported_version(version): + """Transforms a user-friendly version identifier to a full version number.""" + + if version[0] >= "0" and version[1] <= "9": + version = "ruby-" + version + + supported_version = None + for v in sorted(SUPPORTED_VERSIONS, reverse = True): + if v.startswith(version): + supported_version = v + break + + if not supported_version: + fail("rules_ruby_register_toolchains: unsupported ruby version '%s' not in '%s'" % (version, SUPPORTED_VERSIONS)) + + return supported_version diff --git a/ruby/private/providers.bzl b/ruby/private/providers.bzl index 131f335..58281e4 100644 --- a/ruby/private/providers.bzl +++ b/ruby/private/providers.bzl @@ -19,6 +19,17 @@ RubyRuntimeInfo = provider( ], ) +RubyRuntimeToolchainInfo = provider( + doc = "Information about a Ruby interpreter, related commands and libraries", + fields = { + "interpreter": "A label which points the Ruby interpreter", + "bundler": "A label which points bundler command", + "runtime": "A list of labels which points runtime libraries", + "headers": "A list of labels which points to the ruby headers", + "rubyopt": "A list of strings which should be passed to the interpreter as command line options", + }, +) + RubyGemInfo = provider( doc = "Carries info required to package a ruby gem", fields = [ diff --git a/ruby/private/runtime_alias.bzl b/ruby/private/runtime_alias.bzl new file mode 100644 index 0000000..302c8bc --- /dev/null +++ b/ruby/private/runtime_alias.bzl @@ -0,0 +1,74 @@ +load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") +load(":constants.bzl", "TOOLCHAIN_TYPE_NAME") +load(":providers.bzl", "RubyRuntimeToolchainInfo") + +# These rules expose the runtime targets of whichever toolchain has been resolved. + +def _ruby_runtime_alias_impl(ctx): + ruby = ctx.toolchains[TOOLCHAIN_TYPE_NAME].ruby_runtime + return [ + DefaultInfo( + runfiles = ctx.runfiles(transitive_files = depset(ruby.runtime)), + files = depset(ruby.runtime), + ), + ruby, + ] + +ruby_runtime_alias = rule( + implementation = _ruby_runtime_alias_impl, + toolchains = [TOOLCHAIN_TYPE_NAME], +) + +def _ruby_headers_alias_impl(ctx): + runtime = ctx.attr.runtime[RubyRuntimeToolchainInfo] + target = runtime.headers + return [ + ctx.attr.runtime[DefaultInfo], + target[CcInfo], + target[InstrumentedFilesInfo], + target[OutputGroupInfo], + ] + +ruby_headers_alias = rule( + implementation = _ruby_headers_alias_impl, + attrs = { + "runtime": attr.label( + doc = "The runtime alias to use.", + mandatory = True, + ), + }, +) + +def _ruby_interpreter_alias_impl(ctx): + runtime = ctx.attr.runtime[RubyRuntimeToolchainInfo] + target = runtime.interpreter + output = ctx.actions.declare_file("ruby_interpreter") + + #fail(target[DefaultInfo].files_to_run.executable) + ctx.actions.symlink( + output = output, + target_file = target[DefaultInfo].files_to_run.executable, + is_executable = True, + ) + runfiles = ctx.attr.runtime[DefaultInfo].default_runfiles.merge( + ctx.attr.runtime[DefaultInfo].data_runfiles, + ) + + return [ + DefaultInfo( + files = target.files, + runfiles = runfiles, + executable = output, + ), + ] + +ruby_interpreter_alias = rule( + implementation = _ruby_interpreter_alias_impl, + executable = True, + attrs = { + "runtime": attr.label( + doc = "The runtime alias to use.", + mandatory = True, + ), + }, +) diff --git a/ruby/private/sdk.bzl b/ruby/private/sdk.bzl index b82402d..3580d9d 100644 --- a/ruby/private/sdk.bzl +++ b/ruby/private/sdk.bzl @@ -1,50 +1,57 @@ -load( - "@rules_ruby//ruby/private/toolchains:ruby_runtime.bzl", - _ruby_runtime = "ruby_runtime", -) +load("@rules_ruby//ruby/private/toolchains:ruby_runtime.bzl", "ruby_runtime") +load(":constants.bzl", "get_supported_version") -def rules_ruby_select_sdk(version = "host"): +def _register_toolchain(version): """Registers ruby toolchains in the WORKSPACE file.""" + name = "local_config_ruby_%s" % version - supported_versions = [ - "host", - "2.5.8", - "2.5.9", - "2.6.3", - "2.6.4", - "2.6.5", - "2.6.6", - "2.6.7", - "2.6.8", - "2.6.9", - "2.7.1", - "2.7.2", - "2.7.3", - "2.7.4", - "2.7.5", - "3.0.0", - "3.0.1", - "3.0.2", - "3.0.3", - "3.1.0", - "3.1.1", - "jruby-9.2.21.0", - "jruby-9.3.6.0", - ] - - for v in sorted(supported_versions, reverse = True): - if v.startswith(version): - supported_version = v - break - - if not supported_version: - fail("rules_ruby_select_sdk: unsupported ruby version '%s' not in '%s'" % (version, supported_versions)) - - _ruby_runtime( - name = "org_ruby_lang_ruby_toolchain", + supported_version = get_supported_version(version) + if supported_version.startswith("ruby-"): + supported_version = supported_version[5:] + + ruby_runtime( + name = name, version = supported_version, ) native.register_toolchains( - "@org_ruby_lang_ruby_toolchain//:toolchain", + "@%s//:toolchain" % name, + ) + +def rules_ruby_register_toolchains(versions = []): + """Initializes ruby toolchains at different supported versions. + + A special version "system" will use whatever version of ruby is installed + on the host system. Besides that, this rules supports all of versions in + the SUPPORTED_VERSIONS list. The most recent matching version will be + selected. + + If the current system ruby doesn't match a given version, it will be + downloaded and built for use by the toolchain. Toolchain selection occurs + based on the //ruby/runtime:version flag setting. + + For example, + rules_ruby_register_toolchains(["system", ruby-2.5", "jruby-9.2"])` will + download and build the latest supported version of Ruby 2.5 and jruby 9.2. + By default, the system ruby will be used for all Bazel build and + tests. However, passing a flag such as: + --@rules_ruby//ruby/runtime:version="ruby-2.5" + will select the Ruby 2.5 installation. + + Args: + versions: a list of version identifiers + """ + for version in versions: + _register_toolchain(version) + + # Always provide a system toolchain for internal use. + if not "system" in version: + _register_toolchain("system") + native.bind( + name = "rules_ruby_system_jruby_implementation", + actual = "@local_config_ruby_system//:jruby_implementation", + ) + native.bind( + name = "rules_ruby_system_interpreter", + actual = "@local_config_ruby_system//:ruby", ) diff --git a/ruby/private/toolchain.bzl b/ruby/private/toolchain.bzl index cbaebd6..152e92e 100644 --- a/ruby/private/toolchain.bzl +++ b/ruby/private/toolchain.bzl @@ -1,21 +1,13 @@ load(":constants.bzl", "RULES_RUBY_WORKSPACE_NAME") - -RubyRuntimeInfo = provider( - doc = "Information about a Ruby interpreter, related commands and libraries", - fields = { - "interpreter": "A label which points the Ruby interpreter", - "bundler": "A label which points bundler command", - "runtime": "A list of labels which points runtime libraries", - "rubyopt": "A list of strings which should be passed to the interpreter as command line options", - }, -) +load(":providers.bzl", "RubyRuntimeToolchainInfo") def _ruby_toolchain_impl(ctx): return [ platform_common.ToolchainInfo( - ruby_runtime = RubyRuntimeInfo( + ruby_runtime = RubyRuntimeToolchainInfo( interpreter = ctx.attr.interpreter, runtime = ctx.files.runtime, + headers = ctx.attr.headers, rubyopt = ctx.attr.rubyopt, ), ), @@ -35,6 +27,11 @@ _ruby_toolchain = rule( allow_files = True, cfg = "target", ), + "headers": attr.label( + mandatory = True, + allow_files = True, + cfg = "target", + ), "rubyopt": attr.string_list( default = [], ), @@ -45,6 +42,7 @@ def ruby_toolchain( name, interpreter, runtime, + headers, rubyopt = [], rules_ruby_workspace = RULES_RUBY_WORKSPACE_NAME, **kwargs): @@ -53,6 +51,7 @@ def ruby_toolchain( name = impl_name, interpreter = interpreter, runtime = runtime, + headers = headers, rubyopt = rubyopt, ) diff --git a/ruby/private/toolchains/BUILD.runtime.tpl b/ruby/private/toolchains/BUILD.runtime.tpl index fbb3e64..02a36b8 100644 --- a/ruby/private/toolchains/BUILD.runtime.tpl +++ b/ruby/private/toolchains/BUILD.runtime.tpl @@ -3,6 +3,7 @@ load( "ruby_library", "ruby_toolchain", ) +load("@bazel_skylib//rules:common_settings.bzl", "string_flag") package(default_visibility = ["//visibility:public"]) @@ -11,6 +12,10 @@ ruby_toolchain( interpreter = "//:ruby_bin", rules_ruby_workspace = "{rules_ruby_workspace}", runtime = "//:runtime", + headers = "//:headers", + target_settings = [ + "{rules_ruby_workspace}//ruby/runtime:{setting}" + ], # TODO(yugui) Extract platform info from RbConfig # exec_compatible_with = [], # target_compatible_with = [], @@ -46,4 +51,30 @@ filegroup( ), ) +# Provide config settings to signal the ruby platform to downstream code. +# This should never be overridden, and is determined automatically during the +# creation of the toolchain. +string_flag( + name = "internal_ruby_implementation", + build_setting_default = "{implementation}", + values = [ + "ruby", + "jruby", + ], +) + +config_setting( + name = "jruby_implementation", + flag_values = { + ":internal_ruby_implementation": "jruby", + }, +) + +config_setting( + name = "ruby_implementation", + flag_values = { + ":internal_ruby_implementation": "ruby", + }, +) + # vim: set ft=bzl : diff --git a/ruby/private/toolchains/ruby_runtime.bzl b/ruby/private/toolchains/ruby_runtime.bzl index 4959dbf..1239d59 100644 --- a/ruby/private/toolchains/ruby_runtime.bzl +++ b/ruby/private/toolchains/ruby_runtime.bzl @@ -101,16 +101,26 @@ def _install_ruby(ctx, ruby): shared_library = _relativate(shared_library), ) -def host_ruby_is_correct_version(ctx, version): +def get_ruby_info(ctx, interpreter_path): + platform = ctx.execute([interpreter_path, "-e", "print RUBY_PLATFORM"]).stdout + if platform == "java": + ruby_impl = "jruby" + ruby_version = ctx.execute([interpreter_path, "-e", "print JRUBY_VERSION"]).stdout + else: + ruby_impl = "ruby" + ruby_version = ctx.execute([interpreter_path, "-e", "print RUBY_VERSION"]).stdout + + return ruby_impl, ruby_version + +def system_ruby_is_correct_version(ctx, version): interpreter_path = ctx.which("ruby") if not interpreter_path: print("Can't find ruby interpreter in the PATH") return False - ruby_version = ctx.execute(["ruby", "-e", "print RUBY_VERSION"]).stdout - ruby_platform = ctx.execute(["ruby", "-e", "print RUBY_PLATFORM"]).stdout - if ruby_platform == "java": + ruby_impl, ruby_version = get_ruby_info(ctx, interpreter_path) + if ruby_impl == "jruby": ruby_version = "jruby-" + ruby_version have_ruby_version = (version == ruby_version) @@ -123,7 +133,7 @@ def host_ruby_is_correct_version(ctx, version): def _ruby_runtime_impl(ctx): # If the current version of ruby is correct use that version = ctx.attr.version - if version == "host" or host_ruby_is_correct_version(ctx, version): + if version == "system" or system_ruby_is_correct_version(ctx, version): interpreter_path = ctx.which("ruby") else: _install_ruby_version(ctx, version) @@ -139,6 +149,8 @@ def _ruby_runtime_impl(ctx): installed = _install_ruby(ctx, ruby) + ruby_impl, ruby_version = get_ruby_info(ctx, interpreter_path) + ctx.template( "BUILD.bazel", ctx.attr._buildfile_template, @@ -148,6 +160,9 @@ def _ruby_runtime_impl(ctx): "{static_library}": repr(installed.static_library), "{shared_library}": repr(installed.shared_library), "{rules_ruby_workspace}": RULES_RUBY_WORKSPACE_NAME, + "{implementation}": ruby_impl, + "{version}": ruby_version, + "{setting}": "config_system" if version == "system" else "config_%s-%s" % (ruby_impl, ruby_version), }, executable = False, ) @@ -155,7 +170,7 @@ def _ruby_runtime_impl(ctx): ruby_runtime = repository_rule( implementation = _ruby_runtime_impl, attrs = { - "version": attr.string(default = "host"), + "version": attr.string(default = "system"), "_buildfile_template": attr.label( default = "%s//ruby/private/toolchains:BUILD.runtime.tpl" % ( RULES_RUBY_WORKSPACE_NAME diff --git a/ruby/runtime/BUILD.bazel b/ruby/runtime/BUILD.bazel new file mode 100644 index 0000000..3e7e824 --- /dev/null +++ b/ruby/runtime/BUILD.bazel @@ -0,0 +1,93 @@ +load("@bazel_skylib//lib:selects.bzl", "selects") +load("@bazel_skylib//rules:common_settings.bzl", "string_flag") +load("@rules_ruby//ruby/private:constants.bzl", "get_supported_version") +load( + ":version_support.bzl", + "ALL_JRUBY_MAJOR_MINOR_VERSIONS", + "ALL_RUBY_MAJOR_MINOR_VERSIONS", + "SUPPORTED_MAJOR_MINOR_VERSIONS", +) +load( + "@rules_ruby//ruby/private:runtime_alias.bzl", + _ruby_headers_alias = "ruby_headers_alias", + _ruby_interpreter_alias = "ruby_interpreter_alias", + _ruby_runtime_alias = "ruby_runtime_alias", +) + +package(default_visibility = ["//visibility:public"]) + +toolchain_type(name = "toolchain_type") + +# Alias targets corresponding to whichever toolchain was resolved based on +# the selected version. + +_ruby_runtime_alias( + name = "runtime", +) + +_ruby_headers_alias( + name = "headers", + runtime = ":runtime", +) + +_ruby_interpreter_alias( + name = "interpreter", + runtime = ":runtime", +) + +# Supported ruby versions, which can be selected by flags. +# For example: --@rules_ruby//ruby/runtime:version=jruby-9.3 +string_flag( + name = "version", + build_setting_default = "system", + values = ["system"] + SUPPORTED_MAJOR_MINOR_VERSIONS, +) + +config_setting( + name = "config_system", + flag_values = {"version": "system"}, +) + +[ + config_setting( + name = "config_" + get_supported_version(version), + flag_values = {"version": version}, + ) + for version in SUPPORTED_MAJOR_MINOR_VERSIONS +] + +[ + alias( + name = "config_" + version, + actual = ":config_" + get_supported_version(version), + ) + for version in SUPPORTED_MAJOR_MINOR_VERSIONS +] + +selects.config_setting_group( + name = "config_system_ruby", + match_all = [ + ":config_system", + "//external:rules_ruby_system_jruby_implementation", + ], +) + +selects.config_setting_group( + name = "config_ruby", + match_any = [":config_system_ruby"] + + [":config_%s" % v for v in ALL_RUBY_MAJOR_MINOR_VERSIONS], +) + +selects.config_setting_group( + name = "config_system_jruby", + match_all = [ + ":config_system", + "//external:rules_ruby_system_jruby_implementation", + ], +) + +selects.config_setting_group( + name = "config_jruby", + match_any = [":config_system_ruby"] + + [":config_%s" % v for v in ALL_JRUBY_MAJOR_MINOR_VERSIONS], +) diff --git a/ruby/runtime/version_support.bzl b/ruby/runtime/version_support.bzl new file mode 100644 index 0000000..40dfa63 --- /dev/null +++ b/ruby/runtime/version_support.bzl @@ -0,0 +1,26 @@ +load("@bazel_skylib//lib:new_sets.bzl", "sets") +load( + "@rules_ruby//ruby/private:constants.bzl", + "SUPPORTED_VERSIONS", +) + +def _major_minor_versions(): + """Filters supported versions to unique major/minor pairs""" + versions = sets.make() + for s in SUPPORTED_VERSIONS: + if s.find(".") < 0: + continue + split = s.find(".", s.find(".") + 1) + sets.insert(versions, s[0:split]) + return sorted(sets.to_list(versions)) + +def _filter(versions, prefix): + filtered = [] + for v in versions: + if v.startswith(prefix): + filtered.append(v) + return filtered + +SUPPORTED_MAJOR_MINOR_VERSIONS = _major_minor_versions() +ALL_RUBY_MAJOR_MINOR_VERSIONS = _filter(SUPPORTED_MAJOR_MINOR_VERSIONS, "ruby-") +ALL_JRUBY_MAJOR_MINOR_VERSIONS = _filter(SUPPORTED_MAJOR_MINOR_VERSIONS, "jruby-") diff --git a/ruby/tests/BUILD.bazel b/ruby/tests/BUILD.bazel index cded039..1ac2d43 100644 --- a/ruby/tests/BUILD.bazel +++ b/ruby/tests/BUILD.bazel @@ -65,7 +65,7 @@ sh_test( ], data = [ "args_check.rb", - "@org_ruby_lang_ruby_toolchain//:ruby_bin", + "@rules_ruby//ruby/runtime:interpreter", ], ) @@ -74,7 +74,7 @@ genrule( name = "generate_genrule_run_ruby_test", outs = ["genrules_run_ruby_test.sh"], cmd = " && ".join([ - ("$(location @org_ruby_lang_ruby_toolchain//:ruby_bin) " + + ("$(location @rules_ruby//ruby/runtime:interpreter) " + "$(location args_check.rb) foo bar baz"), "echo '#!/bin/sh -e' > $@", "echo true >> $@", @@ -83,8 +83,8 @@ genrule( output_to_bindir = 1, tools = [ "args_check.rb", - "@org_ruby_lang_ruby_toolchain//:ruby_bin", - "@org_ruby_lang_ruby_toolchain//:runtime", + "@rules_ruby//ruby/runtime", + "@rules_ruby//ruby/runtime:interpreter", ], ) @@ -188,7 +188,7 @@ cc_binary( testonly = True, srcs = ["example_ext.c"], linkshared = True, - deps = ["@org_ruby_lang_ruby_toolchain//:headers"], + deps = ["@rules_ruby//ruby/runtime:headers"], ) cc_library( @@ -197,7 +197,7 @@ cc_library( srcs = ["example_ext.c"], linkstatic = True, tags = ["manual"], - deps = ["@org_ruby_lang_ruby_toolchain//:headers"], + deps = ["@rules_ruby//ruby/runtime:headers"], alwayslink = True, ) diff --git a/ruby/tests/runtime_run_ruby_test.sh b/ruby/tests/runtime_run_ruby_test.sh index 6a3e270..7de0ac8 100755 --- a/ruby/tests/runtime_run_ruby_test.sh +++ b/ruby/tests/runtime_run_ruby_test.sh @@ -1,2 +1,2 @@ #!/bin/sh -e -external/org_ruby_lang_ruby_toolchain/ruby_bin $* +ruby/runtime/ruby_interpreter $* diff --git a/ruby/tests/testdata/another_workspace/WORKSPACE b/ruby/tests/testdata/another_workspace/WORKSPACE index 0ffdd6e..ca5bbe6 100644 --- a/ruby/tests/testdata/another_workspace/WORKSPACE +++ b/ruby/tests/testdata/another_workspace/WORKSPACE @@ -1,5 +1,5 @@ workspace(name = "rules_ruby_ruby_tests_testdata_another_workspace") -load("@rules_ruby//ruby:defs.bzl", "rules_ruby_select_sdk") +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") -rules_ruby_select_sdk() +rules_ruby_register_toolchains() diff --git a/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE b/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE index 2cabf3c..af7ac93 100644 --- a/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE +++ b/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE @@ -5,15 +5,11 @@ local_repository( path = "../../../..", ) -load( - "@rules_ruby//ruby:deps.bzl", - "rules_ruby_dependencies", - "rules_ruby_select_sdk", -) +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_register_toolchains") rules_ruby_dependencies() -rules_ruby_select_sdk(version = "3.0.2") +rules_ruby_register_toolchains(["ruby-3.0"]) load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") From 44a995f67aa319e6b702c0b1601f8151525df57a Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Wed, 7 Dec 2022 20:17:30 -0800 Subject: [PATCH 09/27] Handle missing ruby runtime (#10) * Warn but allow systems with no ruby installation * Fix generated registration function * Run setup as root * Fixed typo in no implementation forwarding * Use a mock/incompatible toolchain to always register system ruby * Remove comment * Make ruby_bundle a generated repository rule for each version. This removes the need to ever use the system ruby * Auto detect toolchain by default * Add placeholder for when the system ruby isn't requested * Fix typo for system label * Run tests as root * Don't run workflow as sudo * Always run rbenv in workflow * Buildifier * Refactor toolchain registration to explicitly specify repo name * Move toolchain registration out of runtime macro * Adding comments to workspace file --- README.adoc | 13 +- WORKSPACE | 28 +++- bin/setup | 2 +- examples/example_gem/WORKSPACE | 6 +- examples/simple_rails_api/WORKSPACE | 8 +- examples/simple_script/WORKSPACE | 10 +- examples/simple_script_vendored/WORKSPACE | 13 +- ruby/defs.bzl | 13 +- ruby/deps.bzl | 5 - ruby/private/bundle/def.bzl | 9 +- ruby/private/constants.bzl | 5 +- ruby/private/dependencies.bzl | 15 ++ ruby/private/runtime_alias.bzl | 1 - ruby/private/sdk.bzl | 86 +++++----- ruby/private/toolchain.bzl | 26 +++ ruby/private/toolchains/BUILD | 1 - ruby/private/toolchains/BUILD.bazel | 38 +++++ ruby/private/toolchains/BUILD.runtime.tpl | 60 ++----- ruby/private/toolchains/ruby_runtime.bzl | 150 ++++++++++++++++-- ruby/runtime/BUILD.bazel | 47 +++++- .../testdata/another_workspace/WORKSPACE | 6 +- .../bundle_includes_workspace/WORKSPACE | 10 +- 22 files changed, 387 insertions(+), 165 deletions(-) delete mode 100644 ruby/private/toolchains/BUILD create mode 100644 ruby/private/toolchains/BUILD.bazel diff --git a/README.adoc b/README.adoc index a41ebc6..1db3c55 100644 --- a/README.adoc +++ b/README.adoc @@ -108,17 +108,14 @@ rules_ruby_dependencies() load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") bazel_skylib_workspace() -load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") -rules_ruby_register_toolchains(["ruby-3.0"]) +load("@rules_ruby//ruby:deps.bzl", "register_toolchain") +register_toolchains("ruby-3.0") #——————————————————————————————————————————————————————————————————————— # Now, load the ruby_bundle rule & install gems specified in the Gemfile #——————————————————————————————————————————————————————————————————————— -load( - "@rules_ruby//ruby:defs.bzl", - "ruby_bundle", -) +load("@ruby-3.0//:bundle.bzl", "ruby_bundle") ruby_bundle( name = "bundle", @@ -550,7 +547,7 @@ List of glob patterns per gem to be excluded from the library. Keys are the name [source,python] ---- -load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@ruby-3.0//:bundle.bzl", "ruby_bundle") ruby_bundle( name = "gems", @@ -567,7 +564,7 @@ your workspace. The name should match the name of the bundle. [source,python] ---- -load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@ruby-3.0//:bundle.bzl", "ruby_bundle") workspace( name = "my_wksp", diff --git a/WORKSPACE b/WORKSPACE index 4f8da71..abca524 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -12,12 +12,28 @@ load("@bazel_skylib//lib:versions.bzl", "versions") versions.check("3.4.1") -load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") +load("@rules_ruby//ruby:defs.bzl", "ruby_runtime") -rules_ruby_register_toolchains([ - "ruby-3.0", - "jruby-9.2", -]) +# Register the system ruby version with a custom name. +ruby_runtime( + name = "system_ruby_custom", + version = "system", +) + +register_toolchains("@system_ruby_custom//:toolchain") + +# Register a versioned ruby with a custom name. +ruby_runtime( + name = "ruby3", + version = "ruby-3.0", +) + +register_toolchains("@ruby3//:toolchain") + +# Register a versioned ruby with its default name. +ruby_runtime("jruby-9.2") + +register_toolchains("@jruby-9.2//:toolchain") local_repository( name = "rules_ruby_ruby_tests_testdata_another_workspace", @@ -100,7 +116,7 @@ container_pull( repository = "library/ruby", ) -load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@system_ruby_custom//:bundle.bzl", "ruby_bundle") ruby_bundle( name = "bundle", diff --git a/bin/setup b/bin/setup index c0799ca..8875e27 100755 --- a/bin/setup +++ b/bin/setup @@ -37,7 +37,7 @@ setup.rbenv() { local installed_version="$(ruby -e 'puts RUBY_VERSION' | tr -d '\n')" if [[ ${installed_version} == ${ruby_version} ]]; then info "RUBY already installed, current version: ${bldylw}${ruby_version}" - return 0 + info "Setting up rbenv anyway" fi fi diff --git a/examples/example_gem/WORKSPACE b/examples/example_gem/WORKSPACE index c55061d..150de3b 100644 --- a/examples/example_gem/WORKSPACE +++ b/examples/example_gem/WORKSPACE @@ -11,9 +11,11 @@ load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() -load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") +load("@rules_ruby//ruby:defs.bzl", "ruby_runtime") -rules_ruby_register_toolchains(["ruby-3.0"]) +ruby_runtime("ruby-3.0") + +register_toolchains("@ruby-3.0//:toolchain") load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") diff --git a/examples/simple_rails_api/WORKSPACE b/examples/simple_rails_api/WORKSPACE index 6c031ef..287c06b 100644 --- a/examples/simple_rails_api/WORKSPACE +++ b/examples/simple_rails_api/WORKSPACE @@ -11,15 +11,17 @@ load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() -load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") +load("@rules_ruby//ruby:defs.bzl", "ruby_runtime") -rules_ruby_register_toolchains(["ruby-3.0"]) +ruby_runtime("ruby-3.0") + +register_toolchains("@ruby-3.0//:toolchain") load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") bazel_skylib_workspace() -load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@workspace_ruby//:bundle.bzl", "ruby_bundle") ruby_bundle( name = "bundle", diff --git a/examples/simple_script/WORKSPACE b/examples/simple_script/WORKSPACE index c95bbb8..8534646 100644 --- a/examples/simple_script/WORKSPACE +++ b/examples/simple_script/WORKSPACE @@ -7,13 +7,17 @@ local_repository( path = "../..", ) -load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_register_toolchains") +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() -rules_ruby_register_toolchains(["ruby-3.0"]) +load("@rules_ruby//ruby:defs.bzl", "ruby_runtime") -load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") +ruby_runtime("ruby-3.0") + +register_toolchains("@ruby-3.0//:toolchain") + +load("@ruby-3.0//:bundle.bzl", "ruby_bundle") ruby_bundle( name = "bundle", diff --git a/examples/simple_script_vendored/WORKSPACE b/examples/simple_script_vendored/WORKSPACE index 95d5446..9360923 100644 --- a/examples/simple_script_vendored/WORKSPACE +++ b/examples/simple_script_vendored/WORKSPACE @@ -10,13 +10,20 @@ local_repository( path = "../..", ) -load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_register_toolchains") +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() -rules_ruby_register_toolchains(["ruby-2.7.1"]) +load("@rules_ruby//ruby:defs.bzl", "ruby_runtime") -load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") +ruby_runtime( + name = "ruby-2.7", + version = "ruby-2.7.1", +) + +register_toolchains("@ruby-2.7//:toolchain") + +load("@ruby-2.7.1//:bundle.bzl", "ruby_bundle") ruby_bundle( name = "bundle", diff --git a/ruby/defs.bzl b/ruby/defs.bzl index f2b35a9..924ac2a 100644 --- a/ruby/defs.bzl +++ b/ruby/defs.bzl @@ -1,5 +1,6 @@ load( "@rules_ruby//ruby/private:toolchain.bzl", + _mock_toolchain = "mock_ruby_toolchain", _toolchain = "ruby_toolchain", ) load( @@ -13,8 +14,7 @@ load( ) load( "@rules_ruby//ruby/private/bundle:def.bzl", - _bundle = "bundle_install", - _ruby_bundle = "ruby_bundle_install", + _bundle_install = "bundle_install", ) load( "@rules_ruby//ruby/private:rspec.bzl", @@ -30,15 +30,20 @@ load( _gem = "gem", _gemspec = "gemspec", ) +load( + "@rules_ruby//ruby/private:sdk.bzl", + _register_ruby_runtime = "register_ruby_runtime", +) +ruby_mock_toolchain = _mock_toolchain ruby_toolchain = _toolchain ruby_library = _library ruby_binary = _binary ruby_test = _test ruby_rspec_test = _rspec_test ruby_rspec = _rspec -ruby_bundle = _ruby_bundle -ruby_bundle_install = _bundle +ruby_bundle_install = _bundle_install ruby_rubocop = _rubocop ruby_gemspec = _gemspec ruby_gem = _gem +ruby_runtime = _register_ruby_runtime diff --git a/ruby/deps.bzl b/ruby/deps.bzl index 73b5b80..90c53ac 100644 --- a/ruby/deps.bzl +++ b/ruby/deps.bzl @@ -3,10 +3,5 @@ load( "@rules_ruby//ruby/private:dependencies.bzl", _rules_ruby_dependencies = "rules_ruby_dependencies", ) -load( - "@rules_ruby//ruby/private:sdk.bzl", - _rules_ruby_register_toolchains = "rules_ruby_register_toolchains", -) rules_ruby_dependencies = _rules_ruby_dependencies -rules_ruby_register_toolchains = _rules_ruby_register_toolchains diff --git a/ruby/private/bundle/def.bzl b/ruby/private/bundle/def.bzl index 802c11b..c289d0a 100644 --- a/ruby/private/bundle/def.bzl +++ b/ruby/private/bundle/def.bzl @@ -173,7 +173,7 @@ def generate_bundle_build_file(runtime_ctx, previous_result): if result.return_code: fail("build file generation failed: %s%s" % (result.stdout, result.stderr)) -def _ruby_bundle_impl(ctx): +def ruby_bundle_impl(ctx, ruby_interpreter): ctx.symlink(ctx.attr.gemfile, ctx.attr.gemfile.name) if ctx.attr.gemfile_lock: ctx.symlink(ctx.attr.gemfile_lock, ctx.attr.gemfile_lock.name) @@ -192,7 +192,7 @@ def _ruby_bundle_impl(ctx): # Setup this provider that we pass around between functions for convenience runtime_ctx = RubyRuntimeInfo( ctx = ctx, - interpreter = ctx.path(ctx.attr.ruby_interpreter), + interpreter = ruby_interpreter, environment = {"RUBYOPT": "--enable-gems"}, ) @@ -218,8 +218,3 @@ def _ruby_bundle_impl(ctx): # 5. Generate the BUILD file for the bundle generate_bundle_build_file(runtime_ctx, result) - -ruby_bundle_install = repository_rule( - implementation = _ruby_bundle_impl, - attrs = BUNDLE_ATTRS, -) diff --git a/ruby/private/constants.bzl b/ruby/private/constants.bzl index 3bd1e9a..dd48c4f 100644 --- a/ruby/private/constants.bzl +++ b/ruby/private/constants.bzl @@ -70,9 +70,6 @@ RSPEC_ATTRS.update(RUBY_ATTRS) RSPEC_ATTRS.update(_RSPEC_ATTRS) BUNDLE_ATTRS = { - "ruby_interpreter": attr.label( - default = "@local_config_ruby_system//:ruby", - ), "gemfile": attr.label( allow_single_file = True, mandatory = True, @@ -196,6 +193,6 @@ def get_supported_version(version): break if not supported_version: - fail("rules_ruby_register_toolchains: unsupported ruby version '%s' not in '%s'" % (version, SUPPORTED_VERSIONS)) + fail("ruby_runtime: unsupported ruby version '%s' not in '%s'" % (version, SUPPORTED_VERSIONS)) return supported_version diff --git a/ruby/private/dependencies.bzl b/ruby/private/dependencies.bzl index 0a51d7a..589a821 100644 --- a/ruby/private/dependencies.bzl +++ b/ruby/private/dependencies.bzl @@ -3,6 +3,7 @@ Dependencies """ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +load(":constants.bzl", "RULES_RUBY_WORKSPACE_NAME") def rules_ruby_dependencies(): if "bazel_skylib" not in native.existing_rules(): @@ -24,3 +25,17 @@ def rules_ruby_dependencies(): sha256 = "85e26971904cbb387688bd2a9e87c105f7cd7d986dc1b96bb1391924479c5ef6", strip_prefix = "rules_pkg-3e0cd514ad1cdd2d23ab3d427d34436f75060018/pkg", ) + + # Register placeholders for the system ruby. + native.bind( + name = "rules_ruby_system_jruby_implementation", + actual = "%s//:missing_jruby_implementation" % RULES_RUBY_WORKSPACE_NAME, + ) + native.bind( + name = "rules_ruby_system_ruby_implementation", + actual = "%s//:missing_ruby_implementation" % RULES_RUBY_WORKSPACE_NAME, + ) + native.bind( + name = "rules_ruby_system_no_implementation", + actual = "%s//:missing_no_implementation" % RULES_RUBY_WORKSPACE_NAME, + ) diff --git a/ruby/private/runtime_alias.bzl b/ruby/private/runtime_alias.bzl index 302c8bc..5a1598e 100644 --- a/ruby/private/runtime_alias.bzl +++ b/ruby/private/runtime_alias.bzl @@ -44,7 +44,6 @@ def _ruby_interpreter_alias_impl(ctx): target = runtime.interpreter output = ctx.actions.declare_file("ruby_interpreter") - #fail(target[DefaultInfo].files_to_run.executable) ctx.actions.symlink( output = output, target_file = target[DefaultInfo].files_to_run.executable, diff --git a/ruby/private/sdk.bzl b/ruby/private/sdk.bzl index 3580d9d..28ca3cd 100644 --- a/ruby/private/sdk.bzl +++ b/ruby/private/sdk.bzl @@ -1,57 +1,61 @@ load("@rules_ruby//ruby/private/toolchains:ruby_runtime.bzl", "ruby_runtime") -load(":constants.bzl", "get_supported_version") +load(":constants.bzl", "RULES_RUBY_WORKSPACE_NAME", "get_supported_version") -def _register_toolchain(version): - """Registers ruby toolchains in the WORKSPACE file.""" - name = "local_config_ruby_%s" % version +def register_ruby_runtime(name, version = None): + """Initializes a ruby toolchain at a specific version. - supported_version = get_supported_version(version) - if supported_version.startswith("ruby-"): - supported_version = supported_version[5:] - - ruby_runtime( - name = name, - version = supported_version, - ) - - native.register_toolchains( - "@%s//:toolchain" % name, - ) - -def rules_ruby_register_toolchains(versions = []): - """Initializes ruby toolchains at different supported versions. - - A special version "system" will use whatever version of ruby is installed - on the host system. Besides that, this rules supports all of versions in - the SUPPORTED_VERSIONS list. The most recent matching version will be - selected. + A special version "system" or "system_ruby" will use whatever version of + ruby is installed on the host system. Besides that, this rules supports all + of versions in the SUPPORTED_VERSIONS list. The most recent matching + version will beselected. If the current system ruby doesn't match a given version, it will be downloaded and built for use by the toolchain. Toolchain selection occurs based on the //ruby/runtime:version flag setting. - For example, - rules_ruby_register_toolchains(["system", ruby-2.5", "jruby-9.2"])` will - download and build the latest supported version of Ruby 2.5 and jruby 9.2. + For example, `register_toolchains("ruby", "ruby-2.5")` will download and + build the latest supported version of Ruby 2.5. By default, the system ruby will be used for all Bazel build and tests. However, passing a flag such as: --@rules_ruby//ruby/runtime:version="ruby-2.5" will select the Ruby 2.5 installation. + Optionally, a single string can be passed to this macro and it will use it + for both the name and version. + Args: - versions: a list of version identifiers + name: the name of the generated Bazel repository + version: a version identifier (e.g. system, ruby-2.5, jruby-9.2) """ - for version in versions: - _register_toolchain(version) - - # Always provide a system toolchain for internal use. - if not "system" in version: - _register_toolchain("system") - native.bind( - name = "rules_ruby_system_jruby_implementation", - actual = "@local_config_ruby_system//:jruby_implementation", - ) - native.bind( - name = "rules_ruby_system_interpreter", - actual = "@local_config_ruby_system//:ruby", + if not version: + version = name + if version == "system_ruby": + # Special handling to give the system ruby repo a friendly name. + version = "system" + + supported_version = get_supported_version(version) + if supported_version.startswith("ruby-"): + supported_version = supported_version[5:] + + ruby_runtime( + name = name, + version = supported_version, ) + + if supported_version == "system": + native.bind( + name = "rules_ruby_system_jruby_implementation", + actual = "@%s//:jruby_implementation" % name, + ) + native.bind( + name = "rules_ruby_system_ruby_implementation", + actual = "@%s//:ruby_implementation" % name, + ) + native.bind( + name = "rules_ruby_system_no_implementation", + actual = "@%s//:no_implementation" % name, + ) + native.bind( + name = "rules_ruby_system_interpreter", + actual = "@%s//:ruby" % name, + ) diff --git a/ruby/private/toolchain.bzl b/ruby/private/toolchain.bzl index 152e92e..63cf0c9 100644 --- a/ruby/private/toolchain.bzl +++ b/ruby/private/toolchain.bzl @@ -61,3 +61,29 @@ def ruby_toolchain( toolchain = ":%s" % impl_name, **kwargs ) + +def _mock_ruby_toolchain_impl(ctx): + return [ + platform_common.ToolchainInfo(), + ] + +_mock_ruby_toolchain = rule( + implementation = _mock_ruby_toolchain_impl, +) + +def mock_ruby_toolchain( + name, + rules_ruby_workspace = RULES_RUBY_WORKSPACE_NAME, + **kwargs): + impl_name = name + "_sdk" + _mock_ruby_toolchain( + name = impl_name, + ) + native.toolchain( + name = name, + toolchain_type = "%s//ruby:toolchain_type" % rules_ruby_workspace, + toolchain = ":%s" % impl_name, + exec_compatible_with = ["@platforms//:incompatible"], + target_compatible_with = ["@platforms//:incompatible"], + **kwargs + ) diff --git a/ruby/private/toolchains/BUILD b/ruby/private/toolchains/BUILD deleted file mode 100644 index 67efa96..0000000 --- a/ruby/private/toolchains/BUILD +++ /dev/null @@ -1 +0,0 @@ -package(default_visibility = ["//ruby/private:__pkg__"]) diff --git a/ruby/private/toolchains/BUILD.bazel b/ruby/private/toolchains/BUILD.bazel new file mode 100644 index 0000000..282fec8 --- /dev/null +++ b/ruby/private/toolchains/BUILD.bazel @@ -0,0 +1,38 @@ +load("@bazel_skylib//lib:selects.bzl", "selects") +load("@bazel_skylib//rules:common_settings.bzl", "string_flag") + +package(default_visibility = ["//ruby/private:__pkg__"]) + +# Placeholders for cases when no system ruby is requested +string_flag( + name = "internal_missing_ruby", + build_setting_default = "none", + values = [ + "none", + "ruby", + "jruby", + ], +) + +config_setting( + name = "missing_jruby_implementation", + flag_values = { + ":internal_ruby_implementation": "jruby", + }, +) + +config_setting( + name = "missing_ruby_implementation", + flag_values = { + ":internal_ruby_implementation": "ruby", + }, +) + +config_setting( + name = "missing_no_implementation", + flag_values = { + ":internal_ruby_implementation": "none", + }, +) + +# vim: set ft=bzl : diff --git a/ruby/private/toolchains/BUILD.runtime.tpl b/ruby/private/toolchains/BUILD.runtime.tpl index 02a36b8..d4bb281 100644 --- a/ruby/private/toolchains/BUILD.runtime.tpl +++ b/ruby/private/toolchains/BUILD.runtime.tpl @@ -1,55 +1,11 @@ -load( - "{rules_ruby_workspace}//ruby:defs.bzl", - "ruby_library", - "ruby_toolchain", -) +load("@bazel_skylib//lib:selects.bzl", "selects") load("@bazel_skylib//rules:common_settings.bzl", "string_flag") package(default_visibility = ["//visibility:public"]) -ruby_toolchain( - name = "toolchain", - interpreter = "//:ruby_bin", - rules_ruby_workspace = "{rules_ruby_workspace}", - runtime = "//:runtime", - headers = "//:headers", - target_settings = [ - "{rules_ruby_workspace}//ruby/runtime:{setting}" - ], - # TODO(yugui) Extract platform info from RbConfig - # exec_compatible_with = [], - # target_compatible_with = [], -) - -sh_binary( - name = "ruby_bin", - srcs = ["ruby"], - data = [":runtime"], -) - -cc_import( - name = "libruby", - hdrs = glob({hdrs}), - shared_library = {shared_library}, - static_library = {static_library}, -) - -cc_library( - name = "headers", - hdrs = glob({hdrs}), - includes = {includes}, -) - -filegroup( - name = "runtime", - srcs = glob( - include = ["**/*"], - exclude = [ - "BUILD.bazel", - "WORKSPACE", - ], - ), -) +# Toolchain targets. These will be mocked out with stubs if no ruby version +# can be found. +{toolchain} # Provide config settings to signal the ruby platform to downstream code. # This should never be overridden, and is determined automatically during the @@ -58,6 +14,7 @@ string_flag( name = "internal_ruby_implementation", build_setting_default = "{implementation}", values = [ + "none", "ruby", "jruby", ], @@ -77,4 +34,11 @@ config_setting( }, ) +config_setting( + name = "no_implementation", + flag_values = { + ":internal_ruby_implementation": "none", + }, +) + # vim: set ft=bzl : diff --git a/ruby/private/toolchains/ruby_runtime.bzl b/ruby/private/toolchains/ruby_runtime.bzl index 1239d59..05fe6d6 100644 --- a/ruby/private/toolchains/ruby_runtime.bzl +++ b/ruby/private/toolchains/ruby_runtime.bzl @@ -1,6 +1,109 @@ load("//ruby/private:constants.bzl", "RULES_RUBY_WORKSPACE_NAME") load("//ruby/private/toolchains:repository_context.bzl", "ruby_repository_context") +_mock_toolchain = """ +load( + "{rules_ruby_workspace}//ruby:defs.bzl", + "ruby_mock_toolchain", +) + +ruby_mock_toolchain( + name = "toolchain", + rules_ruby_workspace = "{rules_ruby_workspace}", +) + +sh_binary( + name = "ruby_bin", + srcs = ["ruby"], + data = [":runtime"], +) + +cc_import( + name = "libruby", + hdrs = [], +) + +cc_library( + name = "headers", + hdrs = [], + includes = [], +) + +filegroup( + name = "runtime", + srcs = [], +) +""" + +_toolchain = """ +load( + "{rules_ruby_workspace}//ruby:defs.bzl", + "ruby_toolchain", +) + +ruby_toolchain( + name = "toolchain", + interpreter = "//:ruby_bin", + rules_ruby_workspace = "{rules_ruby_workspace}", + runtime = "//:runtime", + headers = "//:headers", + target_settings = [ + "{rules_ruby_workspace}//ruby/runtime:{setting}" + ], + # TODO(yugui) Extract platform info from RbConfig + # exec_compatible_with = [], + # target_compatible_with = [], +) + +sh_binary( + name = "ruby_bin", + srcs = ["ruby"], + data = [":runtime"], +) + +cc_import( + name = "libruby", + hdrs = glob({hdrs}), + shared_library = {shared_library}, + static_library = {static_library}, +) + +cc_library( + name = "headers", + hdrs = glob({hdrs}), + includes = {includes}, +) + +filegroup( + name = "runtime", + srcs = glob( + include = ["**/*"], + exclude = [ + "BUILD.bazel", + "WORKSPACE", + ], + ), +) +""" + +_bundle_bzl = """ +load("{rules_ruby_workspace}//ruby/private/bundle:def.bzl", "ruby_bundle_impl") +load("{rules_ruby_workspace}//ruby/private:constants.bzl", "BUNDLE_ATTRS") + +def _ruby_bundle_impl(ctx): + ruby_bundle_impl(ctx, "{interpreter}") + +ruby_bundle = repository_rule( + implementation = _ruby_bundle_impl, + attrs = BUNDLE_ATTRS, +) +""" + +_mock_bundle_bzl = """ +def ruby_bundle(**kwargs): + print("WARNING: no system ruby found for bundle") +""" + def _install_ruby_version(ctx, version): ctx.download_and_extract( url = "https://github.com/rbenv/ruby-build/archive/refs/tags/v20220825.tar.gz", @@ -138,34 +241,47 @@ def _ruby_runtime_impl(ctx): else: _install_ruby_version(ctx, version) interpreter_path = ctx.path("./build/bin/ruby") + if not interpreter_path or not interpreter_path.exists: + fail("Installation of ruby version %s failed") - if not interpreter_path or not interpreter_path.exists: - fail( - "Command 'ruby' not found. Set $PATH or specify interpreter_path", - "interpreter_path", + if interpreter_path and interpreter_path.exists: + ruby = ruby_repository_context(ctx, interpreter_path) + installed = _install_ruby(ctx, ruby) + ruby_impl, ruby_version = get_ruby_info(ctx, interpreter_path) + hdrs = ["%s/**/*.h" % path for path in installed.includedirs] + toolchain = _toolchain.format( + includes = repr(installed.includedirs), + hdrs = repr(["%s/**/*.h" % path for path in installed.includedirs]), + static_library = repr(installed.static_library), + shared_library = repr(installed.shared_library), + rules_ruby_workspace = RULES_RUBY_WORKSPACE_NAME, + version = ruby_version, + setting = "config_system" if version == "system" else "config_%s-%s" % (ruby_impl, ruby_version), ) - - ruby = ruby_repository_context(ctx, interpreter_path) - - installed = _install_ruby(ctx, ruby) - - ruby_impl, ruby_version = get_ruby_info(ctx, interpreter_path) + bundle_bzl = _bundle_bzl.format( + interpreter = ruby.interpreter_realpath, + rules_ruby_workspace = RULES_RUBY_WORKSPACE_NAME, + ) + else: + print("WARNING: no system ruby available, builds against system ruby will fail") + support = "none" + ruby_impl = "none" + toolchain = _mock_toolchain.format( + rules_ruby_workspace = RULES_RUBY_WORKSPACE_NAME, + ) + ctx.file("ruby", content = "", executable = True) + bundle_bzl = _mock_bundle_bzl ctx.template( "BUILD.bazel", ctx.attr._buildfile_template, substitutions = { - "{includes}": repr(installed.includedirs), - "{hdrs}": repr(["%s/**/*.h" % path for path in installed.includedirs]), - "{static_library}": repr(installed.static_library), - "{shared_library}": repr(installed.shared_library), - "{rules_ruby_workspace}": RULES_RUBY_WORKSPACE_NAME, + "{toolchain}": toolchain, "{implementation}": ruby_impl, - "{version}": ruby_version, - "{setting}": "config_system" if version == "system" else "config_%s-%s" % (ruby_impl, ruby_version), }, executable = False, ) + ctx.file("bundle.bzl", bundle_bzl) ruby_runtime = repository_rule( implementation = _ruby_runtime_impl, diff --git a/ruby/runtime/BUILD.bazel b/ruby/runtime/BUILD.bazel index 3e7e824..443f763 100644 --- a/ruby/runtime/BUILD.bazel +++ b/ruby/runtime/BUILD.bazel @@ -39,23 +39,50 @@ _ruby_interpreter_alias( # For example: --@rules_ruby//ruby/runtime:version=jruby-9.3 string_flag( name = "version", - build_setting_default = "system", - values = ["system"] + SUPPORTED_MAJOR_MINOR_VERSIONS, + build_setting_default = "auto", + values = [ + "auto", + "system", + ] + SUPPORTED_MAJOR_MINOR_VERSIONS, ) config_setting( - name = "config_system", + name = "config_auto", + flag_values = {"version": "auto"}, +) + +config_setting( + name = "internal_config_system", flag_values = {"version": "system"}, ) [ config_setting( - name = "config_" + get_supported_version(version), + name = "internal_config_" + get_supported_version(version), flag_values = {"version": version}, ) for version in SUPPORTED_MAJOR_MINOR_VERSIONS ] +selects.config_setting_group( + name = "config_system", + match_any = [ + ":config_auto", + ":internal_config_system", + ], +) + +[ + selects.config_setting_group( + name = "config_" + get_supported_version(version), + match_any = [ + ":config_auto", + ":internal_config_" + get_supported_version(version), + ], + ) + for version in SUPPORTED_MAJOR_MINOR_VERSIONS +] + [ alias( name = "config_" + version, @@ -68,7 +95,7 @@ selects.config_setting_group( name = "config_system_ruby", match_all = [ ":config_system", - "//external:rules_ruby_system_jruby_implementation", + "//external:rules_ruby_system_ruby_implementation", ], ) @@ -88,6 +115,14 @@ selects.config_setting_group( selects.config_setting_group( name = "config_jruby", - match_any = [":config_system_ruby"] + + match_any = [":config_system_jruby"] + [":config_%s" % v for v in ALL_JRUBY_MAJOR_MINOR_VERSIONS], ) + +selects.config_setting_group( + name = "config_system_none", + match_all = [ + ":config_system", + "//external:rules_ruby_system_no_implementation", + ], +) diff --git a/ruby/tests/testdata/another_workspace/WORKSPACE b/ruby/tests/testdata/another_workspace/WORKSPACE index ca5bbe6..0f914eb 100644 --- a/ruby/tests/testdata/another_workspace/WORKSPACE +++ b/ruby/tests/testdata/another_workspace/WORKSPACE @@ -1,5 +1,7 @@ workspace(name = "rules_ruby_ruby_tests_testdata_another_workspace") -load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") +load("@rules_ruby//ruby:defs.bzl", "ruby_runtime") -rules_ruby_register_toolchains() +ruby_runtime("system_ruby") + +register_toolchains("@system_ruby//:toolchain") diff --git a/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE b/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE index af7ac93..25c14f5 100644 --- a/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE +++ b/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE @@ -5,13 +5,17 @@ local_repository( path = "../../../..", ) -load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_register_toolchains") +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() -rules_ruby_register_toolchains(["ruby-3.0"]) +load("@rules_ruby//ruby:defs.bzl", "ruby_runtime") -load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") +ruby_runtime("ruby-3.0") + +register_toolchains("@ruby-3.0//:toolchain") + +load("@ruby-3.0//:bundle.bzl", "ruby_bundle") ruby_bundle( name = "gems", From b8f651f80a5fad90d4db6e486b0ae047a8a46640 Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Thu, 22 Dec 2022 20:19:08 -0800 Subject: [PATCH 10/27] Disable "auto" version selection option (#11) * Don't mark fixed versions auto * Explicitly specify version for test workspace w/o system ruby * Debug logging in setup * Revert logging changes, keep pin of bashmatic version --- bin/deps | 3 ++- bin/test-suite | 10 ++++++---- ruby/runtime/BUILD.bazel | 1 - 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/bin/deps b/bin/deps index dfdbbcc..378a29d 100755 --- a/bin/deps +++ b/bin/deps @@ -10,8 +10,9 @@ # ————————————————————————————————————————————————————————————————————————————————————— +export BASHMATIC_OS="$(uname -s | tr '[:upper:]' '[:lower:]')" [[ -z ${BASHMATIC_HOME} ]] && export BASHMATIC_HOME="${HOME}/.bashmatic" -[[ -d ${BASHMATIC_HOME} ]] || bash -c "$(curl -fsSL https://bashmatic.re1.re); bashmatic-install -q" +[[ -d ${BASHMATIC_HOME} ]] || bash -c "$(curl -fsSL https://bashmatic.re1.re); bashmatic-install -v -f -b v2.7.2" # shellcheck disable=SC1090 source "${BASHMATIC_HOME}/init.sh" 1>/dev/null 2>&1 diff --git a/bin/test-suite b/bin/test-suite index 080f291..d583a4c 100755 --- a/bin/test-suite +++ b/bin/test-suite @@ -155,13 +155,15 @@ test.buildifier() { # Builds and runs workspace inside examples/simple_script test.simple-script() { + # This workspace requires a version specification + local RUBY_VERSION="--@rules_ruby//ruby/runtime:version=ruby-3.0 " __test.exec simple-script " cd examples/simple_script bazel ${BAZEL_OPTS} info; echo; echo - bazel ${BAZEL_OPTS} build ${BAZEL_BASE_BUILD_OPTS} -- //... ; echo; echo - bazel ${BAZEL_OPTS} test ${BAZEL_BASE_BUILD_OPTS} ${BAZEL_TEST_OPTS} -- //... ; echo; echo - echo run :bin; bazel ${BAZEL_OPTS} run ${BAZEL_BASE_BUILD_OPTS} :bin - echo run :rubocop; bazel ${BAZEL_OPTS} run ${BAZEL_BASE_BUILD_OPTS} :rubocop + bazel ${BAZEL_OPTS} build ${BAZEL_BASE_BUILD_OPTS} ${RUBY_VERSION} -- //... ; echo; echo + bazel ${BAZEL_OPTS} test ${BAZEL_BASE_BUILD_OPTS} ${BAZEL_TEST_OPTS} ${RUBY_VERSION} -- //... ; echo; echo + echo run :bin; bazel ${BAZEL_OPTS} run ${BAZEL_BASE_BUILD_OPTS} ${RUBY_VERSION} :bin + echo run :rubocop; bazel ${BAZEL_OPTS} run ${BAZEL_BASE_BUILD_OPTS} ${RUBY_VERSION} :rubocop " } diff --git a/ruby/runtime/BUILD.bazel b/ruby/runtime/BUILD.bazel index 443f763..332ddc0 100644 --- a/ruby/runtime/BUILD.bazel +++ b/ruby/runtime/BUILD.bazel @@ -76,7 +76,6 @@ selects.config_setting_group( selects.config_setting_group( name = "config_" + get_supported_version(version), match_any = [ - ":config_auto", ":internal_config_" + get_supported_version(version), ], ) From fe92d2f1e495f365b773822587486b7754bca33b Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Tue, 27 Dec 2022 11:46:53 -0800 Subject: [PATCH 11/27] Export JRuby jar files (#13) * Export JRuby jar to avoid pinning a version through maven downstream * Buildifier * Create a dummy jar for non-java ruby --- ruby/private/providers.bzl | 1 + ruby/private/runtime_alias.bzl | 24 ++++++++++++++++++ ruby/private/toolchain.bzl | 8 ++++++ ruby/private/toolchains/ruby_runtime.bzl | 31 ++++++++++++++++++++++++ ruby/runtime/BUILD.bazel | 6 +++++ 5 files changed, 70 insertions(+) diff --git a/ruby/private/providers.bzl b/ruby/private/providers.bzl index 58281e4..624a530 100644 --- a/ruby/private/providers.bzl +++ b/ruby/private/providers.bzl @@ -25,6 +25,7 @@ RubyRuntimeToolchainInfo = provider( "interpreter": "A label which points the Ruby interpreter", "bundler": "A label which points bundler command", "runtime": "A list of labels which points runtime libraries", + "jars": "A list of labels which points to ruby jars", "headers": "A list of labels which points to the ruby headers", "rubyopt": "A list of strings which should be passed to the interpreter as command line options", }, diff --git a/ruby/private/runtime_alias.bzl b/ruby/private/runtime_alias.bzl index 5a1598e..d37f590 100644 --- a/ruby/private/runtime_alias.bzl +++ b/ruby/private/runtime_alias.bzl @@ -19,6 +19,30 @@ ruby_runtime_alias = rule( toolchains = [TOOLCHAIN_TYPE_NAME], ) +def _ruby_jars_alias_impl(ctx): + runtime = ctx.attr.runtime[RubyRuntimeToolchainInfo] + target = runtime.jars + infos = [ + DefaultInfo( + files = target.files, + runfiles = ctx.runfiles(transitive_files = target.files), + ), + ] + for jar in infos[0].files.to_list(): + infos.append(JavaInfo(jar, jar)) + + return infos + +ruby_jars_alias = rule( + implementation = _ruby_jars_alias_impl, + attrs = { + "runtime": attr.label( + doc = "The runtime alias to use.", + mandatory = True, + ), + }, +) + def _ruby_headers_alias_impl(ctx): runtime = ctx.attr.runtime[RubyRuntimeToolchainInfo] target = runtime.headers diff --git a/ruby/private/toolchain.bzl b/ruby/private/toolchain.bzl index 63cf0c9..8af44df 100644 --- a/ruby/private/toolchain.bzl +++ b/ruby/private/toolchain.bzl @@ -7,6 +7,7 @@ def _ruby_toolchain_impl(ctx): ruby_runtime = RubyRuntimeToolchainInfo( interpreter = ctx.attr.interpreter, runtime = ctx.files.runtime, + jars = ctx.attr.jars, headers = ctx.attr.headers, rubyopt = ctx.attr.rubyopt, ), @@ -27,6 +28,11 @@ _ruby_toolchain = rule( allow_files = True, cfg = "target", ), + "jars": attr.label( + mandatory = True, + allow_files = True, + cfg = "target", + ), "headers": attr.label( mandatory = True, allow_files = True, @@ -42,6 +48,7 @@ def ruby_toolchain( name, interpreter, runtime, + jars, headers, rubyopt = [], rules_ruby_workspace = RULES_RUBY_WORKSPACE_NAME, @@ -51,6 +58,7 @@ def ruby_toolchain( name = impl_name, interpreter = interpreter, runtime = runtime, + jars = jars, headers = headers, rubyopt = rubyopt, ) diff --git a/ruby/private/toolchains/ruby_runtime.bzl b/ruby/private/toolchains/ruby_runtime.bzl index 05fe6d6..bfb445a 100644 --- a/ruby/private/toolchains/ruby_runtime.bzl +++ b/ruby/private/toolchains/ruby_runtime.bzl @@ -29,6 +29,16 @@ cc_library( includes = [], ) +java_binary( + name = "dummy_jar" + srcs = ["Dummy.java"], +) + +filegroup( + name = "jars", + srcs = [":dummy_jar"], +) + filegroup( name = "runtime", srcs = [], @@ -46,6 +56,7 @@ ruby_toolchain( interpreter = "//:ruby_bin", rules_ruby_workspace = "{rules_ruby_workspace}", runtime = "//:runtime", + jars = "//:jars", headers = "//:headers", target_settings = [ "{rules_ruby_workspace}//ruby/runtime:{setting}" @@ -74,6 +85,16 @@ cc_library( includes = {includes}, ) +java_library( + name = "dummy_jar", + srcs = ["Dummy.java"], +) + +filegroup( + name = "jars", + srcs = {jars}, +) + filegroup( name = "runtime", srcs = glob( @@ -86,6 +107,13 @@ filegroup( ) """ +# Define a dummy java file for creating a no-op jar when JRuby isn't selected. +_dummy_jar = """ +public class Dummy { + public static void main(String[] args) {} +} +""" + _bundle_bzl = """ load("{rules_ruby_workspace}//ruby/private/bundle:def.bzl", "ruby_bundle_impl") load("{rules_ruby_workspace}//ruby/private:constants.bzl", "BUNDLE_ATTRS") @@ -244,6 +272,8 @@ def _ruby_runtime_impl(ctx): if not interpreter_path or not interpreter_path.exists: fail("Installation of ruby version %s failed") + ctx.file("Dummy.java", _dummy_jar) + if interpreter_path and interpreter_path.exists: ruby = ruby_repository_context(ctx, interpreter_path) installed = _install_ruby(ctx, ruby) @@ -252,6 +282,7 @@ def _ruby_runtime_impl(ctx): toolchain = _toolchain.format( includes = repr(installed.includedirs), hdrs = repr(["%s/**/*.h" % path for path in installed.includedirs]), + jars = "glob([\"**/lib/jruby.jar\"])" if ruby_impl == "jruby" else [":dummy_jar"], static_library = repr(installed.static_library), shared_library = repr(installed.shared_library), rules_ruby_workspace = RULES_RUBY_WORKSPACE_NAME, diff --git a/ruby/runtime/BUILD.bazel b/ruby/runtime/BUILD.bazel index 332ddc0..365d230 100644 --- a/ruby/runtime/BUILD.bazel +++ b/ruby/runtime/BUILD.bazel @@ -11,6 +11,7 @@ load( "@rules_ruby//ruby/private:runtime_alias.bzl", _ruby_headers_alias = "ruby_headers_alias", _ruby_interpreter_alias = "ruby_interpreter_alias", + _ruby_jars_alias = "ruby_jars_alias", _ruby_runtime_alias = "ruby_runtime_alias", ) @@ -25,6 +26,11 @@ _ruby_runtime_alias( name = "runtime", ) +_ruby_jars_alias( + name = "jars", + runtime = ":runtime", +) + _ruby_headers_alias( name = "headers", runtime = ":runtime", From 59732544ce3a4bc4e8e4d4e8c8f318c931c17eae Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Tue, 27 Dec 2022 12:04:03 -0800 Subject: [PATCH 12/27] Fix typo from PR #13 (#14) * Fix typo in no-ruby BUILD file * Fix broken bashmatic url --- bin/deps | 2 +- ruby/private/toolchains/ruby_runtime.bzl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/deps b/bin/deps index 378a29d..00ffdd4 100755 --- a/bin/deps +++ b/bin/deps @@ -12,7 +12,7 @@ export BASHMATIC_OS="$(uname -s | tr '[:upper:]' '[:lower:]')" [[ -z ${BASHMATIC_HOME} ]] && export BASHMATIC_HOME="${HOME}/.bashmatic" -[[ -d ${BASHMATIC_HOME} ]] || bash -c "$(curl -fsSL https://bashmatic.re1.re); bashmatic-install -v -f -b v2.7.2" +[[ -d ${BASHMATIC_HOME} ]] || bash -c "$(curl -fsSL https://raw.githubusercontent.com/kigster/bashmatic/master/bin/bashmatic-install); bashmatic-install -v -f -b v2.7.2" # shellcheck disable=SC1090 source "${BASHMATIC_HOME}/init.sh" 1>/dev/null 2>&1 diff --git a/ruby/private/toolchains/ruby_runtime.bzl b/ruby/private/toolchains/ruby_runtime.bzl index bfb445a..975fb81 100644 --- a/ruby/private/toolchains/ruby_runtime.bzl +++ b/ruby/private/toolchains/ruby_runtime.bzl @@ -30,7 +30,7 @@ cc_library( ) java_binary( - name = "dummy_jar" + name = "dummy_jar", srcs = ["Dummy.java"], ) From 37cf5900d0b0e44fa379c0ea3f5fcee0035d77ca Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Thu, 12 Jan 2023 14:54:33 -0800 Subject: [PATCH 13/27] Add a jruby java_binary rule for deploy_env exclusion (#15) --- ruby/private/runtime_alias.bzl | 1 + ruby/runtime/BUILD.bazel | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/ruby/private/runtime_alias.bzl b/ruby/private/runtime_alias.bzl index d37f590..8da0085 100644 --- a/ruby/private/runtime_alias.bzl +++ b/ruby/private/runtime_alias.bzl @@ -1,4 +1,5 @@ load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") +load("@rules_java//java:defs.bzl", "java_binary") load(":constants.bzl", "TOOLCHAIN_TYPE_NAME") load(":providers.bzl", "RubyRuntimeToolchainInfo") diff --git a/ruby/runtime/BUILD.bazel b/ruby/runtime/BUILD.bazel index 365d230..288e3d1 100644 --- a/ruby/runtime/BUILD.bazel +++ b/ruby/runtime/BUILD.bazel @@ -31,6 +31,12 @@ _ruby_jars_alias( runtime = ":runtime", ) +java_binary( + name = "jruby_binary", + main_class = "org.jruby.Main", + runtime_deps = [":jars"], +) + _ruby_headers_alias( name = "headers", runtime = ":runtime", From 8fca842a3006c3d637114aba4f6bf9695bb3a432 Mon Sep 17 00:00:00 2001 From: Jason Lunn Date: Wed, 12 Jul 2023 20:16:30 -0400 Subject: [PATCH 14/27] Add JRuby 9.4 and prefer to use it rather than 9.2. (#16) * Add JRuby 9.4 and prefer to use it rather than 9.2. * Bump ruby-build version. --- WORKSPACE | 4 ++-- bin/test-suite | 4 ++-- ruby/private/constants.bzl | 3 ++- ruby/private/sdk.bzl | 2 +- ruby/private/toolchains/ruby_runtime.bzl | 6 +++--- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index abca524..49876aa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -31,9 +31,9 @@ ruby_runtime( register_toolchains("@ruby3//:toolchain") # Register a versioned ruby with its default name. -ruby_runtime("jruby-9.2") +ruby_runtime("jruby-9.4") -register_toolchains("@jruby-9.2//:toolchain") +register_toolchains("@jruby-9.4//:toolchain") local_repository( name = "rules_ruby_ruby_tests_testdata_another_workspace", diff --git a/bin/test-suite b/bin/test-suite index d583a4c..bb43541 100755 --- a/bin/test-suite +++ b/bin/test-suite @@ -183,8 +183,8 @@ test.workspace() { bazel ${BAZEL_OPTS} test ${BAZEL_BUILD_OPTS} ${BAZEL_TEST_OPTS} -- //... ; echo; echo bazel ${BAZEL_OPTS} build ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=ruby-3.0 -- //... ; echo; echo bazel ${BAZEL_OPTS} test ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=ruby-3.0 ${BAZEL_TEST_OPTS} -- //... ; echo; echo - bazel ${BAZEL_OPTS} build ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=jruby-9.2 -- //... ; echo; echo - bazel ${BAZEL_OPTS} test ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=jruby-9.2 ${BAZEL_TEST_OPTS} -- //... ; echo; echo + bazel ${BAZEL_OPTS} build ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=jruby-9.4 -- //... ; echo; echo + bazel ${BAZEL_OPTS} test ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=jruby-9.4 ${BAZEL_TEST_OPTS} -- //... ; echo; echo " } diff --git a/ruby/private/constants.bzl b/ruby/private/constants.bzl index dd48c4f..4bafff0 100644 --- a/ruby/private/constants.bzl +++ b/ruby/private/constants.bzl @@ -177,7 +177,8 @@ SUPPORTED_VERSIONS = [ "ruby-3.1.0", "ruby-3.1.1", "jruby-9.2.21.0", # Corresponded to 2.5.8 - "jruby-9.3.6.0", # Corresponds to 2.6.8 + "jruby-9.3.10.0", # Corresponds to 2.6.8 + "jruby-9.4.3.0", # Corresponds to 3.1.4 ] def get_supported_version(version): diff --git a/ruby/private/sdk.bzl b/ruby/private/sdk.bzl index 28ca3cd..da84961 100644 --- a/ruby/private/sdk.bzl +++ b/ruby/private/sdk.bzl @@ -25,7 +25,7 @@ def register_ruby_runtime(name, version = None): Args: name: the name of the generated Bazel repository - version: a version identifier (e.g. system, ruby-2.5, jruby-9.2) + version: a version identifier (e.g. system, ruby-2.5, jruby-9.4) """ if not version: version = name diff --git a/ruby/private/toolchains/ruby_runtime.bzl b/ruby/private/toolchains/ruby_runtime.bzl index 975fb81..ae8e574 100644 --- a/ruby/private/toolchains/ruby_runtime.bzl +++ b/ruby/private/toolchains/ruby_runtime.bzl @@ -134,9 +134,9 @@ def ruby_bundle(**kwargs): def _install_ruby_version(ctx, version): ctx.download_and_extract( - url = "https://github.com/rbenv/ruby-build/archive/refs/tags/v20220825.tar.gz", - sha256 = "55d9363a27486e4ec9623985d7764c5cf8e59cafe58afcf666e81fa148dea2f0", - stripPrefix = "ruby-build-20220825", + url = "https://github.com/rbenv/ruby-build/archive/refs/tags/v20230710.tar.gz", + sha256 = "8c9cf458d461a9b6b63d44e4b5b246304168f665fd47adea1733ab6a7cd0f077", + stripPrefix = "ruby-build-20230710", ) install_path = "./build" From 29ed0a8bb10049bfd8b284978c44283a8f0f49bb Mon Sep 17 00:00:00 2001 From: Jason Lunn Date: Fri, 21 Jul 2023 15:08:20 -0400 Subject: [PATCH 15/27] Implement a workaround for FFI (#17) --- ruby/private/bundle/create_bundle_build_file.rb | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ruby/private/bundle/create_bundle_build_file.rb b/ruby/private/bundle/create_bundle_build_file.rb index 52626cf..ee981ec 100755 --- a/ruby/private/bundle/create_bundle_build_file.rb +++ b/ruby/private/bundle/create_bundle_build_file.rb @@ -84,6 +84,8 @@ Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/specifications/#{gem_name}-#{gem_version}*.gemspec").first end +HERE = File.absolute_path '.' + require 'bundler' require 'json' require 'stringio' @@ -261,7 +263,14 @@ def register_gem(spec, template_out, bundle_lib_paths, bundle_binaries) # Usually, registering the directory paths listed in the `require_paths` of gemspecs is sufficient, but # some gems also require additional paths to be included in the load paths. require_paths += include_array(spec.name) - gem_lib_paths = require_paths.map { |require_path| File.join(gem_path, require_path) } + gem_lib_paths = require_paths.map do |require_path| + # Gems with native extensions (like ffi) will sometimes have elements of + # require_paths that are absolute rather than gem-path relative paths. + # It is incorrect to prepend those paths with the gem_path and Bazel will + # only allow relative paths as inputs to its glob() function. + pathname = Pathname.new(require_path) + pathname.absolute? ? pathname.relative_path_from(HERE).to_s : File.join(gem_path, require_path) + end bundle_lib_paths.push(*gem_lib_paths) # paths to search for executables From 85ba963612b0e11a30b2df30c15d5873e0f9ae60 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Mon, 12 Feb 2024 14:30:31 -0800 Subject: [PATCH 16/27] Make the ruby_runtime() rule re-load if PATH changes. (#22) This will make `rvm use` commands take effect immediately, rather than requiring a `blaze clean --expunge` first. This has an unfortunate side-effect of also forcing a re-download of hermetic Ruby versions when PATH changes. To fix this, we should make `system_ruby()` its own repository rule, so that hermetic Ruby versions are not affected by PATH. --- ruby/private/toolchains/ruby_runtime.bzl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ruby/private/toolchains/ruby_runtime.bzl b/ruby/private/toolchains/ruby_runtime.bzl index ae8e574..2e60c48 100644 --- a/ruby/private/toolchains/ruby_runtime.bzl +++ b/ruby/private/toolchains/ruby_runtime.bzl @@ -331,4 +331,9 @@ ruby_runtime = repository_rule( allow_single_file = True, ), }, + # Force a re-fetch when the Ruby version is changed through RVM. + # This will also force a re-download when PATH changes, which is + # unnecessary. To fix this, we may want to make system_ruby() + # a different repository rule from ruby_runtime(). + environ = ["PATH"], ) From 4f05aac363689551acb6d13fa015e51352af3960 Mon Sep 17 00:00:00 2001 From: Jason Lunn Date: Thu, 4 Apr 2024 13:58:40 -0400 Subject: [PATCH 17/27] Support ruby version paths that include the '+0' suffix observed when installing from ruby head. Also support gem paths used by bundler when installing gems from Github rather than RubyGems. (#28) --- WORKSPACE | 2 +- .../bundle/create_bundle_build_file.rb | 21 ++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 49876aa..6a1b951 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -120,7 +120,7 @@ load("@system_ruby_custom//:bundle.bzl", "ruby_bundle") ruby_bundle( name = "bundle", - bundler_version = "2.1.4", + bundler_version = "2.4.22", excludes = { "mini_portile": ["test/**/*"], }, diff --git a/ruby/private/bundle/create_bundle_build_file.rb b/ruby/private/bundle/create_bundle_build_file.rb index ee981ec..0c67128 100755 --- a/ruby/private/bundle/create_bundle_build_file.rb +++ b/ruby/private/bundle/create_bundle_build_file.rb @@ -68,7 +68,9 @@ # # Library path differs across implementations as `lib/ruby` on MRI and `lib/jruby` on JRuby. GEM_PATH = ->(ruby_version, gem_name, gem_version) do - Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/gems/#{gem_name}-#{gem_version}*").first + glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/gems/#{gem_name}-#{gem_version}*").first + alt_glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/bundler/gems/#{gem_name}-*").first + glob || alt_glob end # For ordinary gems, this path is like 'lib/ruby/3.0.0/specifications/rspec-3.10.0.gemspec'. @@ -81,7 +83,9 @@ # # Library path differs across implementations as `lib/ruby` on MRI and `lib/jruby` on JRuby. SPEC_PATH = ->(ruby_version, gem_name, gem_version) do - Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/specifications/#{gem_name}-#{gem_version}*.gemspec").first + glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/specifications/#{gem_name}-#{gem_version}*.gemspec").first + alt_glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/bundler/gems/#{gem_name}-*/**/*.gemspec").first + glob || alt_glob end HERE = File.absolute_path '.' @@ -193,7 +197,18 @@ def initialize(workspace_name:, # This attribute returns 0 as the third minor version number, which happens to be # what Ruby uses in the PATH to gems, eg. ruby 2.6.5 would have a folder called # ruby/2.6.0/gems for all minor versions of 2.6.* - @ruby_version ||= (RUBY_VERSION.split('.')[0..1] << 0).join('.') + @ruby_version ||= begin + version_string = (RUBY_VERSION.split('.')[0..1] << 0).join('.') + if File.exist?("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{version_string}") + version_string + else + if File.exist?("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{version_string}+0") + version_string + "+0" + else + raise "Cannot find directory named #{version_string} within lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}" + end + end + end end def generate! From 38cc4e071dccef9b2f70fb2347c6b1c510ee615c Mon Sep 17 00:00:00 2001 From: Zoey Greer Date: Fri, 11 Oct 2024 11:45:35 -0400 Subject: [PATCH 18/27] Use `RUBY_BASE_NAME`, since that is what the libdir uses (#38) --- ruby/private/bundle/create_bundle_build_file.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ruby/private/bundle/create_bundle_build_file.rb b/ruby/private/bundle/create_bundle_build_file.rb index 0c67128..dfa8596 100755 --- a/ruby/private/bundle/create_bundle_build_file.rb +++ b/ruby/private/bundle/create_bundle_build_file.rb @@ -68,8 +68,8 @@ # # Library path differs across implementations as `lib/ruby` on MRI and `lib/jruby` on JRuby. GEM_PATH = ->(ruby_version, gem_name, gem_version) do - glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/gems/#{gem_name}-#{gem_version}*").first - alt_glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/bundler/gems/#{gem_name}-*").first + glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_BASE_NAME']}/#{ruby_version}/gems/#{gem_name}-#{gem_version}*").first + alt_glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_BASE_NAME']}/#{ruby_version}/bundler/gems/#{gem_name}-*").first glob || alt_glob end @@ -83,8 +83,8 @@ # # Library path differs across implementations as `lib/ruby` on MRI and `lib/jruby` on JRuby. SPEC_PATH = ->(ruby_version, gem_name, gem_version) do - glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/specifications/#{gem_name}-#{gem_version}*.gemspec").first - alt_glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/bundler/gems/#{gem_name}-*/**/*.gemspec").first + glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_BASE_NAME']}/#{ruby_version}/specifications/#{gem_name}-#{gem_version}*.gemspec").first + alt_glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_BASE_NAME']}/#{ruby_version}/bundler/gems/#{gem_name}-*/**/*.gemspec").first glob || alt_glob end @@ -199,13 +199,13 @@ def initialize(workspace_name:, # ruby/2.6.0/gems for all minor versions of 2.6.* @ruby_version ||= begin version_string = (RUBY_VERSION.split('.')[0..1] << 0).join('.') - if File.exist?("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{version_string}") + if File.exist?("lib/#{RbConfig::CONFIG['RUBY_BASE_NAME']}/#{version_string}") version_string else - if File.exist?("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{version_string}+0") + if File.exist?("lib/#{RbConfig::CONFIG['RUBY_BASE_NAME']}/#{version_string}+0") version_string + "+0" else - raise "Cannot find directory named #{version_string} within lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}" + raise "Cannot find directory named #{version_string} within lib/#{RbConfig::CONFIG['RUBY_BASE_NAME']}" end end end From f4de0fb975515f46d3603954eb34d7cff11b311c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Aug 2024 19:40:09 +0000 Subject: [PATCH 19/27] Bump rexml from 3.2.5 to 3.3.6 Bumps [rexml](https://github.com/ruby/rexml) from 3.2.5 to 3.3.6. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.2.5...v3.3.6) --- updated-dependencies: - dependency-name: rexml dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9243824..a5bc485 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,7 +7,8 @@ GEM ast (~> 2.4.1) rainbow (3.0.0) regexp_parser (2.1.1) - rexml (3.2.5) + rexml (3.3.6) + strscan rubocop (0.93.1) parallel (~> 1.10) parser (>= 2.7.1.5) @@ -20,6 +21,7 @@ GEM rubocop-ast (1.11.0) parser (>= 3.0.1.1) ruby-progressbar (1.11.0) + strscan (3.1.0) unicode-display_width (1.8.0) PLATFORMS From e9db4239628380cb29b868a0b4b4a0f198ae97d7 Mon Sep 17 00:00:00 2001 From: Adam Cozzette Date: Thu, 24 Aug 2023 11:28:45 -0700 Subject: [PATCH 20/27] Set `allow_empty = True` on file globs This allows everything to build successfully with the `--incompatible_disallow_empty_glob` flag, which will eventually by enabled by default. I believe these particular globs are expected to be empty if Ruby is not installed locally. --- ruby/private/toolchains/ruby_runtime.bzl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruby/private/toolchains/ruby_runtime.bzl b/ruby/private/toolchains/ruby_runtime.bzl index 2e60c48..651366c 100644 --- a/ruby/private/toolchains/ruby_runtime.bzl +++ b/ruby/private/toolchains/ruby_runtime.bzl @@ -74,14 +74,14 @@ sh_binary( cc_import( name = "libruby", - hdrs = glob({hdrs}), + hdrs = glob({hdrs}, allow_empty = True), shared_library = {shared_library}, static_library = {static_library}, ) cc_library( name = "headers", - hdrs = glob({hdrs}), + hdrs = glob({hdrs}, allow_empty = True), includes = {includes}, ) From aabf3c7621c3d1cc231ec6b5abfe55241922d4ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 15:47:59 +0000 Subject: [PATCH 21/27] Bump rexml from 3.2.5 to 3.3.6 in /examples/simple_script_vendored Bumps [rexml](https://github.com/ruby/rexml) from 3.2.5 to 3.3.6. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.2.5...v3.3.6) --- updated-dependencies: - dependency-name: rexml dependency-type: indirect ... Signed-off-by: dependabot[bot] --- examples/simple_script_vendored/Gemfile.lock | 4 +++- .../vendor/cache/rexml-3.2.5.gem | Bin 93184 -> 0 bytes .../vendor/cache/rexml-3.3.6.gem | Bin 0 -> 104448 bytes .../vendor/cache/strscan-3.1.0.gem | Bin 0 -> 16384 bytes 4 files changed, 3 insertions(+), 1 deletion(-) delete mode 100644 examples/simple_script_vendored/vendor/cache/rexml-3.2.5.gem create mode 100644 examples/simple_script_vendored/vendor/cache/rexml-3.3.6.gem create mode 100644 examples/simple_script_vendored/vendor/cache/strscan-3.1.0.gem diff --git a/examples/simple_script_vendored/Gemfile.lock b/examples/simple_script_vendored/Gemfile.lock index 315f6e6..bc9b5d3 100644 --- a/examples/simple_script_vendored/Gemfile.lock +++ b/examples/simple_script_vendored/Gemfile.lock @@ -8,7 +8,8 @@ GEM ast (~> 2.4.1) rainbow (3.0.0) regexp_parser (2.1.1) - rexml (3.2.5) + rexml (3.3.6) + strscan rspec (3.7.0) rspec-core (~> 3.7.0) rspec-expectations (~> 3.7.0) @@ -37,6 +38,7 @@ GEM rubocop-ast (1.11.0) parser (>= 3.0.1.1) ruby-progressbar (1.11.0) + strscan (3.1.0) unicode-display_width (2.1.0) PLATFORMS diff --git a/examples/simple_script_vendored/vendor/cache/rexml-3.2.5.gem b/examples/simple_script_vendored/vendor/cache/rexml-3.2.5.gem deleted file mode 100644 index 5680fec4c6a6c21d480bf8501599ebd4278097ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93184 zcmeFYQ;;r95H_~9ZTqZk+qQYuwtaT@tZjSG+O}=mw)cJW{mDgAe^n|sNhKHQn^8^I z^i1_r(@)RXTez8+o4A=UTKRzdKPAln2|GJG$p0w+lmEG7;pF53VPR)xW98stXJ+LD zVP;`t=U@XNVg7$=LH|d+?yhboF8?jb^S6bC-T!gmf2#jqjsI`9{qM&8Pt*Uu+9ZyF z0l|8=F$M#_(cX(cVn+#>GeUhm$xBMv-I1d}8M6;Z@qDXK1qoI@USAqrZU_}HEF}SW zj>-huWw9HO7ADWP#+uLh;RX_o9Wf~+Q2+)%UGg&@J@+#Lq22T9@b_KFdBm*UN^}st z?F#>CJj1LeGUT^kjO}8MJitEl8k9K}OR{X^=&2!eQkxR}GBY5ed_W%6A~|Z2Itty< zejk#PE0!o-7Tx5Jz#>D!f;VK5Ar1UtKtq6S(5LT{$8t;>+45=_?=tG-4mdO-14aA| znk9EWiih4SMD{w|k#By{qHJ6lXsjAKS~($@vjaiYZ{2JxbME{0qUC8o?RLhx8mQ>) z+u|i5xy>a`i+v9>$sSpV2akopELDrBhBW)Z2t^?Xe_>U&(MZ^R{N6Xi5;8Pw8^sg_ zNH2lpcCZM|J;;p<1iX_PDz^owHP-#>!@g4OYoX+XC`efsE#a6gD$JeN< z2a0ZlV2MPYm)BZ^V@6=(SAOEX9DKc1D_vmg_0IV!4<2p?ekh zqieB68aoaSA~=S8>g1U)#e4}FZc}JBUYk@h+GROM^#eKP1w+1B)0R}xd= zZZjBqUuOa3B*GWUT6M;bt3fI_nU_bs>}H=yiaY4_M_f?Jk7PHj^bRw-d4vLEsP`cf zOTag`USRNrI%+l1RuGd`zBh0(;-%v9%g|nzDHuy6kOAd;DBwN1@#^`4(2rRmh8M%{ zY3-M^K`FO7zjP5&RTXdh886W0+f`FSIXi6<)`BjzwP{)kw}d|WSyHsrZPo3tw;NpK3+>WmKk4(4=_za#thkf>$II)@QIsJ$2k;nm25TI4(LebJPcj!#k>n z`AVbJP)0Mr=DCE(x}aKtY?nh*_4{;iaw2ZFLWS|5A@gUCCR3)hG|Y*VeN`PpQopuG z=cr5WBa~l+btRtsx%Zm2<&&5i21%9v(5&Y44jMk=a>tY`7Z(WsF zOxgoMLboVCPEh`D1e5<2`~O40|JU%Jm4kzsi|v2Lf42X+{(t=czww;^&s6>I_rWTQ?e`yKX(piSCU{$oVG6`Y*^yk`|Vb@CP&F0&4fPB-?CCCgZJPMRWRH} zi%AGz9Ou!G*0BeKhYz?fKc7p`5xUPMbHW!awo$YO&PBsee-OutCoR_DXG3ZuLGT7+ z{8*lgr;OPjeNAz~i9?C}a1Ff3-^ZXyegeEO5oRU02%f=eFtq9yONDGSG_wXrXs`}4 zMN9Et3vdv4+>DPwqhaQ*!iXPIDa0*M;zDZof;>g&KS5wYGs-H27>VZf+wLIK1D0!Q z%C;gsY5>)*g=Rf0`)+$QFt?he*dAl)0OR9I6CJSV$a^ZZ^xg4zusUM=%f$o|X?%B_ zo#OPa$U`UK$iiJVG#^-RAJ01Q>-KfF)e8{G?bAWdxkuEqErgQoyJcz{cz166_OVs` z6Dsxq_&Fs_sav_%uyDOYZg`64g64~i1e3k%4S2G_HU^mwo#`pw$sLMV-`Vnc@$mJ$ zYl{FuF?9q=cW?Ul_(F`tz2dKHQW_{+_o38zBDES0&dr>4)p^7NNYo9liEd2vm{2$# zET8s&dtTjC&wxLi-V9{_4CTVTTKc{@U9FtnUgh4D1)UbkG(5fK_K-WjyF9J@>hiqL zU+OsH3)(t;(&EFk0pV@y@vU!i59?vxYYkEiTCI-Y_G@Zti81m3G=TfB^S>99nh@Q7 z-!Nc=q^I7@tY!C!q@PkNgGm}+-3-jy4r6o%zQ2APEZi<^6%#&e0RXQikRZgj1mA=> zUk6NwD*#f|i<<*QF*`>hd(|NjFdB%ugRiHy$S(2fou1;{(9kx=IFGlt%hdF*K5!P0 zF@=gw1@WD|;#x3+S7d;2fi!rLx7atp1v-zI1UE`GTRKFnV0~3(gbwNk6g0j@FuEsq z&+rD&+SJw(>iC8_dDj)m=icC5@B0VRqhn)_3s`a8SIT%a4x;(Jl9i8$C)DsIYUcp- z$6iPaHyKCvJb7LZRN?XKdQoNW$W9gd(F=U_2oSO}eC@TtM}GyD+tzP%eE~0vTUsK2 zfO>wX!+C+2T6C_irvExN{phhqE*~!^4er?FqfR2Z0t?`_7$>HbSlvxr{R8Wt;@9eQ|K$pz+au9{1@3kI;WreZ4T=a0MAiRF zI(%=T=3l_gZ!$00Tu17X;t~r)qG171eHImx{4B5|{kC0ygElm}c2Jud0D(kPa(IEV z!-#|Kkw5{DI6P_>x+kwge-2$hY^D10KM!4Aj2}vC$BB(_wza;vysW~F<>QL+cXZlC zD1M?0tY;6JXbD5NvHnTMVgTm!7=Q#K!G5;dp?kV^q(S(~!NX zsJos`Tt;&!0jA==r|=t|7Vw8ZnvQ$+;zOI>Ox@TJ(EG1t+OR!Fxl9nuH=YE&nn9Ax zo3@UqCuFl|Y{gSj^Rczku(dSN#dW$Egh~(c?fbUIXbGvypTCUiij0qo3v#p-tEV*Q zgi~>)bbb!7@y;~DpB|G(PFf<F3eDBK!AskuK{?AnLi}u@K-c6Zgs~p{{28h(b;= z^sdFox*nHvd+I{Z#bD6uu>HN8qJn=T zVQJ#8d&&dB5u-wxfx0X9&^JA+;Pf4!T4@D=YxZa z9TXfdC<&%iStJJ6e-S~D=L43gD&^wLHqm?jBx8vDpm6c+^`v7;S)mSeerFkmcMAZP zIALjDBgg@G9Zk*&c#@07B@nsUn&FIb+~&paOsjb#lcONQ-As{RF+xg)pIM*LuM{TZ zy9DnKFvmRP={=;N91bmc;NBln)h`}*j&+`jBH@q&%XdEJOM`{sOafrwYM0=D4Vb#| z*f|aZ8AQM9B*57B(c>f88>I&sX{Zh??qOs3fCQ1`S$v7mzq080K?;cT;?ebCaqe6* z#$1K!1Z3=Jr0Thjh}M}_GfEa(XG_%F~Ny1a`HOpOTQVU%W1Thu<+U#QNRI# z1`p!BMGJ)DxZj4ZJRH0W_&rGRvVz{YhA8?jbl!EWIPb*<_ucy*7$78kaXu7V48HGU zyiZShZzu~E(jr_I8Ndw}DRwF=K1VomgMK(a7dH>H97q%w3eu=1G zyB}rigzJR!HysoJlHc!BS1TR=)%WiH<|f4=2wLU_?1!#%pPNTn&ZeZ6$j=K;lxTXs zCxU=d2lPC-GYF$!3)$Mn6I0#@DQTt=UkmMx0>o^)R11X;Cx?!ry>P_4 zB~@@XFG2}$Aq|2dKSijMsBsVby5kMS^bLZ@7-s#D%|X%xM5H@(2*P8=<2m=PImP`h zUcShX1cMPm5s7=@g5E~JImmyMQz$vbxOHxKX zfuef}6P-}~?kMwI+2R5rk>9-^2PZBkCPL1QWXp5cOUYfd4e#526L%3iqG`Is8Z@xI0gp zeSa8xcpADHSsD2!cxg-hRQK0YuIGaU%F@r6MUIFewcHXSzPI$dt+BK9m4Xx~5b$mO zA_Dlr%JAr{slV`9rfs)C;9Ok5U?!f zsz@dx1z|4^hjBfAb9~QfEJWmk%^3DJZn~SFAbm`OFh5ms89|YgY|vUvqyxuftS_># zI~Td@q6rzrB-3N&24C?eF$k*d#(zK>2?FV<<`<5ORi7StNH9A_&Qk0We6+~VaDcCD zpAShCDZZn%BO!0?WoWMO!gw`H;pjmvg!z+6rcf0#M&$+1 zDzsr0PhVZj=Fpt2C)Os2XYbc*U=$)W6ODFnns3!n1zSvAO}_}G@JgOAU|sdrXfgYt z`;S!6Dxrf?m&CjP$$7-c@d~E25-%J52JwN%HfR%HAKiLr&+!+YmD_?@O(H^~NN?yP z_N5MefC$=I@GTsY(E4aGk)4o zlU`>P-cg4<5K|bt%T;uB8}OqkeI^>OyaBdzODrMlk~}gf`+c_5vrT`{ReC4IMSP#A z7c#xDv!`hY)0X+0knx%6$trZhAnQCE(!N%r@PprGKlBJ({LK<|Ob1#?FMNj03*k&X zFO=Vt@q+g6_a_L%{+rrHMVl=l6E?a>6Wnl0W@WA~f?2hibdHIcRfkJ}4s;M3FVy{2+r!YK6?7=M70BPs1#S*bg=OZ_ErB2z zLN-hL56BN=6#Nvw#y5eMXOP?-&eRhYZ_NYh<6=>A+)s!MV(oBXujPty0M8R>iR|?- z8C8A>7jE&@{uE6*xqJY5)PWD?9~MGzxoo` zA}y;@^=&Rou-TSbV!U-2EJMt(*uIZBR81L{7ITTvJ93_m=V9eGbvwfskr|A(EeEHJ z#k>4f(-?AC*SNY=Pjggr`WuE_4{UN*=0ddNtp0pDxqgGR_pGs`)B| z^W?ljD-n$NteUTdt)7Cu@V;Y@6dy;zco%R;5(=%U?0iqOfRa=3>9IsAXGv=dI!D2* ziP3F2h3WOYOc&E4WFp1!Q)CX(%sEWf_EMMjZyYw(3EsZZ;pP~ce=zL!F-p;pTHV$e z(1vxM(Z~FvYzL*2CyCK;Wz_U08$=Cgc+l8b3Z}}fN(?*Owi;adSKa-$C zTN=m!E=WS@Cf#LuJnJ0S&(1STOAw^y)2XaChx8A4Mc@iR3ed{DLwx8e`1oO?vz{$s zOvD>&M;0dz#UBqwnuCHPS|x7dNnayVmqPV*q1Z&UJSnW1z7pQxx$9-|>K`W=^C z;VveQ#uu<|I~oh8l%R*UYwW{s<2@!vAhGvDq!;Wzpqzp6ThA9COvXO&;r!uIb`St` zbH5n?9_eiWt)Wr%xKC4~U&O|bE^rv!%+`T##_2z$XkWeWeqqVs2o>-5uQ*)$YB|g^ zF$)$z2#=t&nw<~16fb=}Dsr zT9E8I`gwD&=@KZBJ@54hs>RZhdSlN3Pn2SzyXF6N zRTuOK--v>T{19$vLu8lDfH1=T&vR%{3s&GU=sjz*Pu(zxmqIp)8agrekj4AL)e-1G zu+VjA%A5n~YQHk75o>i5O*g$U7HTSk0KI;WWN054VP_ekThl(}cZ^4X)me(1i%@yd zNbyPs5cO*PXmvuHn~>ADgnk(5dRL&0%qs7r&B?m62NR$t9r!t9xzm0?zC^u5d z-t!$%f~A(gC$XMWx|j^ss8Ic3*ki1$s{M?1WvS;orxW^;y?s4B_3Tv%{;_CQN;hwu zJB8JJmh-6g8F8c*;I@5I;0)#S^1efZ_jRv$C=4MAA+OTY2mCb&tV(|?0h7N6dN+P@ zUjUz;FP0+Th4wT7Tr~qf3YIp8PYoO2hY$1d%RN5q1hUqB)b8OK&k&EY4Q`MVUk>r5 zsly96IZ4w_4)NZ}GfYyyo?bIFVzyOzc;QmKXR>ByK|b*c^9!BLBSM@%MZYLN44E?F zAmQS5C1G=|=K3a27xfm`TuD3_Ba5>M9RB6C>h>ozX0)7UaCY5>lz2`;%2IVAK9nU$+->2x_IleSqJzvGM_AZ06*p>l_E zgFiTU8g<+T>VcUIH7woxqeSUnUsV10*@ppMS|X%TqBX0XyvWj4B%KwAi!ax7}|{i{C7Caqxc$4j5zGlQg0g1^xw?1+8nr3JT;Z| z8^`G3JKSr0|0Cr3iVMI-kh;}TI-B` zNudt$do~alY5B3fT4Kk1Q#&s9wg~MWn97x{T>E<-_PAvX-vIGGp%&X;96D2Eh-#x6 zQLXouB^>xoX9PwC^a2+l5_EG*ik$b%ZMTAL1-M0J=B%P|-3jEgRcpu`GYIKJAVT4v zx%7!VKgLjh_ir%Jl~>1CpY9bJwyr+&+uqvZ0A5XIbc6tBujVIR^&{uAz=wo}4g8lX ze2zSd#*V*Yvbb9n^JARYP;|CBP^Vy7w0>vCE(#({Gz!gw8R{hdbbO;J=D%*Eavq-; zE$Cg{b#xb}MLR&nuDwuoj@ZsLtK_LlokrdYmNAZ1HF7>Aut61U-}r{qV{pwA8zOQ{ zTQ@9zaQP`cUhIm8&v&%sbkN(jgQhv%Z+N~mA_udEl1O06XO~>$SVhafaN-at`Q2?P ztpjVg{e@mqXL%42)fsyJ{<|V{VRMJLlv(Nrf~lR;T+qT5y^c<3#o2%xo6?Vv?z#pLwAx z?T~e$YF;5-8`aaR^4KZ#awjWVLC8v`-X}r{m{(i7?t{FrFy`w1Tb#x4IIDYSSL0cT z|1QKU>CL9J_%XL_E=Rw&%4SI)@Nm9|^fNWqzfSjapw+>a(djN-n_PkBk6h%l=#IVx zj9WICDXuMI;?u8o%vu!vZDX~l_icYI#U;b3=k{!_(slk!Ys5gy9hhbG=LfJM`h$%c z@LWtIEQDoFJ6WoTnKP_+YX$Qdm(fVm!ge0f6P7&Chg|Bn;d^oV_If^YXjGl)CR!aJ zYuyAR@d}{TFfbS+#pDq@QY+Aq8baCd^CRjtxZXK}=RVh(gq*xdX)-l8)m0}S>ipD;Wctn8 zTF&%pQHJ+c{j1JMx*Rx9q$$Dor-1CIzz(mwDe(69@4%aj%}d?KZ{WmZa^w@x(FaiX z261-gp9cWS?mzLu3golA<)9eg9^3(+$ zd|J8U6(5ZsL>$P(_EFvaveVhfWXcd7`=;}&>`f&&p#igR4PjOav1@tO6>wFJn(yy9^3(zE{Mx>FHw}m#cGG2VO zn>312D?^Gh_mDE&<;P2j=3E3Fv<~`X0@FUI4mzBW4C~XjXHayep7$b%jU(I(BHKYD zI)ZKtB;Eq8TNHhgY?4;<9CNY@isUi{{y@?wF|KP$`?Qnm;jGJzN%rOtjd&BJUbYtV z`tS+0S8YgD9YO0qW)mS=ii(ZrCo__D;KXL1&i6PEp3(o9hTv@u6SScN&e) zB_3|JF`mMf_w9P}W~{X}EyJ_bT>LJ1M(52vW|!xRz0$fwVUkr{5catqk~>5R>mx`) z@B2{4`?3QwHB~2aZFzy?-#asbt@IkL%o;?5{2#VD;;+*2JRO64ADvl&E5J#_(HNN0 zTKfJ0L{!6g5%a_wb>LOKLEvB10XVcOiZNlIVPguytxo0#tdGVcWOJ%*m&wxb5UN}Z zSs$Z(7#)C;+MD;`jCVQ>K-N3@SP@~hn)=^R9hb_wXzD!Ho$qOopw5tgq&Qc{+U_ZO z{A)!ky_SoE46iC)v7_kB9ox}ua*_>t3%?>9cGY%7Sy_(WTu+@tjsga$%=Ql;CVjUf z<7|~@B2i&^`FcCy*W3#i`4vfi)*l4k4SgWDd2Vi1%GZfhAsy+{k#b9GSmIHd&B>o^ z42gr;s+B&A&Yhucu8*yUS-Tf2d8`JXq zf2(P%xi?|P!fFyS^uPu(4WVHV`5q74GKdf(Ln_6IsMuo&Adn%MS$gX&i+Jxr zXe8sSH}~8;;;0;t+(}67$6i+r#fkWB$SJ*>GD{A6(+rmxVwHnCHG?t+sFkH+JgG$) zaR%%hD@hznDN7>Zy>KrHBr*gUA-Q&N9*=Y=m?|9NXF#x?gga4X(r4IlY&q1o3v<;P zlb!H+RFxG47`^DpH}6NzAQRKK;2qSR#%XRkQPa!8P@eq*Vd`$n3w}uno>tf4Xgg3R)NSNIc|_z?|y`Y$rH5ylotQXF{}IP^L=^S{v&q;Yg=Ba;!z zFhw>+)9<{GmN-a9x=1j7>ELAK?JI4C4Gxz;gs9Xvi7J43r*3yWhK2K4PMl{2p7rV1 z(UR5y+<6}>GYVI6_rZX>x$}7X1Xfo3BBa-B zlG;JE6WZQE>PkytEj38KmQLq3r>uX9CMJ@V25LS1gMa@iRthrPj%yOCW`#cZ(O4)_ zxiun8$P=2SD`8k_fRqONlS%Y)7x?Az(2+n%VD~{1i?A{=qi+v2=&Z4OD$d}F3D?TE zs9XZF_|B3b%HsJX~QIKpm8JhnBOOBqQ6D;uW` z=1h>{LtX5mAfAbI8O8!j9}jVJJ*BpG(SjvFk^#Df^Xh6VNE)tGB+oA)P(QcBj=i&>Ldbyi!X zi?`kJmSL`2K}8KEb|y)Y>$eGK+e~VyvXNl=h+vDYEyt7O=CIX{01sI`i&&ANWMT+n zXj4w*yxg2Omr>WkO)-df6Up?3dWWEa}LQZA(o58~(TA&7L9&)8^`2$Q3^;^2t`E-MKos9QQGo z>FzYzr)FOyW$>=oo})^N^wsY=toWH%c|=-NgQxb~5;)H?+U*%81R#xG^E%-N?!e@G zCDW@=R_JPu_kr(D%*CA6wQf$0Nb8?Mkj6Qcm^pP$UbnBFn7}UltDe~1PgO^=9i{vR zZH7?wyFgU2gd>L?WgpJa3!WIIC={ZcEV9raX<_4q+jiUe)uacHw?M(d>O}faRrg0&Is)TcHApxyZeRpU$f#B0{xhKP$f7WWc-S(1Vp^STzP98yNO(@o=5J`Ndv!Nl%nRD+A-ft z(48uo)(wL!%NKqPXHv`t$B+(o`-1xAk{2mao0X;|KEJ&<`0B^KbXb|;_~DkuIUuOE zmSsv0pRm7v@jg?fp&*(L%V*rMsDsQR1A| zqm>U)pt5c2b3r8>tzfXjE@S$*C4!Od05y{m7L|Iw#CQtEFBG;W*KHw~tR}cDf}VeC zd&QtZQb@g)_x)@= zEds{&?q}a%uE#H~qGBf#1Jh_{fFS%+=kz)^Mt_U1feYiYo#O1deO_?CM!-Ekz2MEd zN~w(4nT$99QYx-f(_x=?_5LE*Z0tVeuV=w_3w10ZAA33x2ji_**xMJ`wZ|B0isYHH zDt9tCNBHK&3Ci3Ov|}b+nS!o5bkFeJEXG~TcwJvUMed+n&^=sjl%6E!5r4CiuHQg^ zu1_)T7?KUeou;-2))C4uR9Im40(j$eU0T@U1g<2*4nbk)iY>95H(QEc#wY_^chLaC zY#HJ7{xp&N+Rzmm>iMK)?y)=jWw#{XPyLt4rb;VK{?OTE3Y}h!TgR0sZYu6s%V#mr z&}t@PAHh+AER0EBgLjr<>NnfggZ^$}!nI;1pZHo0CxfvR$q_6H)tf-Yk`ERf#_{hsB2Cuh4b? z$+5-K1H@y|fg22o25dtH5>V*oi05D=YhjG;*erj-Vnr>s$rBk2xLw zFk;@(uizyXWLUEQjC&P1eZfNpRTb~*5T3{(uPODK-%7t3J%acU6=sj>g^C~50O#Y0 zxzk#!>mL15<6l@#u`xsyO`b$?sSG3t`ji2>Ei0`?H?7GFlJ%fN5)Y&9 z-|S%Qcc)3&_kTEp&VCyx6E?tw4l5S zUvwe@c7N{|{v3Sn zhYrXuory8V*&~{J>51Dja?2}1A<5;^Jya&*tD*>O1nbq;-_j3SgTMDVh<)yAv5^f` zS#;%x44Go6aDk7UT;V~Sdaa)g4Yfc(xMcY)Y)FjESF-Z4cpK%{gCYsPYFqBE7j?we zL15!F07=le?6B)_-lOa&RT%Ze}HU@>SZ_R%7dh#gz3Ju@+fvn|hpiBnU z>|Nn0cS{S88eUBBt`k0-=;X0aqPoHa83n`Aw*sR4_j*jIC5nE3X)t&AUwT_^$pJxH zh-(HSbU{!YIGlakU4ys$TG$!<>XZET(|U|4`IP2k+Y*vs@xB@mHQwidTL8YYAB;YK zWJOA!qN~@i_ygtHXF8}K*I2A^WnznrC#asn&1--z6M9bjL@s0nQ~w+Uf9J2GooN-c zXX+NK&7Cy9x`Vw2NfW2{IcBX3ec~J~()?!q(i{B4n5fMwukxZ{Xe7Dgyxz9CtMPwv zeh-NplXfXv!xx|4l?!U}9dP9MK>mX%^Z5H}7pNW3{769y6!3XG{x7Ay`)K4+S(K36 z!ur&>jSa)DUyqZO%qd8Wh50K?J;$#{S~3-%*bzY)k?6J2?Zx^jPHE}%@G{K~t&bE8 zO`3Bhr+MQ;J$XbMqs0IBl57i|t-Y>}dXrD~>`u;JLtc_RrviNj!Uk1pKetxD3Yn8& zH!P128)-E!lpTHPEo2Rw1U_rqP0BwI|9Z_qG<8O5yNJX;za9bMnAinHY%uI2k9xnd z-CEkMm$Jgcbd-ImJ`0-m${!OfuOGFk0yPzqOPj)AM9`A-^Od~^42eri-?!buDOVM- z(x+rLxtw<}T&86zF{X|t|I$Y$%cnZk+r^v5X!F(Wd_Vhjs7)vBHj_d}hZoD{K6&k1+d)S~4C76Hj)gh554V9!z)C9G07;kDr`g1c zcRX|$GBQs!{4fXUaLJ(k620X@HghIgM#}1>+|~egN4GK>U7g*UdLqlSD5*)&XFe)8 zceHQbpV+C=pq_#{;(NHdG83GMs>7R{rKyBnApiO~L*ihwa;n@#((DMU4e#i-ZWvUt zL+P&YGc3R|8$FOA$abm9+Wa)I$wUGSOqz52ISi+zhXv=!sW|VGfQQMTLWWTuE zA7r<{wsdyR>WuQku1G47?UYuC(vE<~WT*uT+B_OHFs1kDo{+(dySWr{Fc+DVxG{f%utBIFiVegR8ugLN)&pDe6mpk8h@`8o|R7u6kQYm$@ z;BF+{;&t`*_J-AU%V>r8RIs5ldu;mJOzm1t4eyrTkgF-#(W5V?a;sZvE;n-%0M{$< z_IGTjJFrahRPPgd2eISpi6jdz{_BM$tMDVUCqcH2<6r)wfKzrQf9CD9_3inUTi{QR zl4HeJ(InwdsimQ^=Y2)z5Lw>F*=4|H&djeXqV`e3pVqR`{XG6IOPja2UL&>^o@~!` zJ6kU-U<2;!UYBpi%>22)d%=#va(ig{<~8D86Y-XS9IofRTedaB&H}bW8K>22T6Ry1 z??ZWZ$A|BIdv?c-X@2*kWnPk@FPqDT&iAKfD%$P&ho=>(9o=4k=BU5T-M~i21wA1A zZC@x)vN?8cK?SoeEX3Hioew<)6}mEmQrTY}Hk~o0^N|@?DzlFBq!2Xl7Gl z{kKKF54;t_sKcyTe^w77?~dPS?0Hb`~jN)<05rlO~1XyQf_~ z301a~kyff~DZifq?HWPVd%&Y{hhM}H5A;_)k&p++*(Nfn z&D{rpIBM_>3*c+|?I{16Hx2|mlLD^ZVu2Plpls`^w?o>jr5wjdr*U5mR@*zq&QdYM zgbGNWjkMF2>=}!6PE0ny8lRs&Okle2U0Vkb(Jzn(6NuU?bPv3n0Jf;uaAq%QvC#Sp z#4PyZh4n`CoEc8@c-F6Ox3QdFt?Txd(w^Y!%Jw#r9>;ma;ZEZiP02p|i$!^}Hp`d@ zbE?A%*+2lXc=>{U`5F6u4n>*@oT+$f*~}mT4qT;%0s3COZb$)dTp!a1v1LjCVJb-e z8@0uS0J*J`gdZdjK@{k7j_5;Pw#h9_&{}^r;l?z>KID!V7VO@u0uGg-B(EU;|O&=9t9!iIBt+R$16l4P=OD)>K30 z*&38h`(57Tx5LcH@SpD%BLm4)hYIhwBL=Ab21xL6*sce~baE=A%%lB!t)TvR4PKGZ zG8U-({#nFVb!6Pv;2!-R55R!T6|_{03w;7@ZS-%>z15O7Nri$5Aedh#{>#U;y@~r= zOe(B^5_A+VL&!cI*|ntch|c6ml1_c^dvOie&i6%y|@tCb@B}avxHuW03N(y z)|7#A6cK6%&>l%gEnf`}+j24%LJAx~quo8Hm5U#B?!8rDpEDsGMh=HGiwd<4y<$Ek0cnV) z^I#$#JY+;=;jceg4>x}NC@KQg-vBhXUIk&N<({?F6iG2o{RlX z1-m~Lvfruo2(ttb*^QrUDv+QiC~dQY^+ysKw#x7RcpFswQ40R=sl$G2iVpGTBDmRZ z4B;uEsFvB-`6JlrE{HKn5Qj0pIkOKn$)i_Jfr}TBJIJv7YL0e?s=~zPF@Tn}ksI+l z4AL76JU}YlM$i~ePI*r|+19}2)s>}BN35}hpndp^{OWI=B<&G-;csjpF#3@=`F@vU z0QMt)HBZndCjm$#6!3@we3423E`H`?$yDLG5E-J3Cq1?%u7Kb-GHPC3q4oXQA=K`- zgl$8_4mzvnK+>ksPyf3`r&C(AQi`~)Tth-=@Vh(|pMW)u1nmG5UI5P%BR{~5R_3pn z5E)C7XI(Xj_!Q_r#}aWZ!#-$X+0Df3WDDf&1_GI|J>ExXywe?M-J0Z_Q<(SsOTz0t zEo_mukQ1<>TD|}wf}F7q(P&7Upf91RKzX_IT=>{9{iI+#8|>s6V@FDw?JTL_cyeYi zQSC?62fp8%?BaL3c0`0X1lI$CZO@DV>ww#*-P5bwrJ>@`E#7a3qoyO9n-amj?+cxu zoy*1dB-r}4rY3){PH&&~rk1`o|IQZ|tE)cL@$b*{zG?6bLh<9W6;Y?Q7o*Cz$d5ql!^y*n6Gfg~4 zk1{+@hFN`)6!y)40Px7i-G)cHf>=o#-{kVcxuUJ(?&3IHAj(}sv{Sd`^phj{Dnl3e zuVX~wu03?o4Eo|pr%#t3Y%qn0R^11;hoIfZDXNOu*irt$AwlxN(k)=3N2!8$YdvrkLEjM*uJj8oBm|r z8z&4;(FbfrgIpfc*LW5brym#jlSX4Rl!6a58Kit!17%2i0<{sQj`Rdk*c2gm!*+r2 z^rV|oHg-@gFZ^Xu0v|10ZDi)LO0&VCWgt-JceSDhcX?@8Z9iKDDYjU48N=GpohW?h z>hIQ(x})GPJ&pxQJUoR^V?CdUCJ-4e(3xtPm}Um}rjOyf2FXf|B=J!Fw9m>ZVc%`o zr2>J^S_g3E_WFRcBZoX4WwNxOldDc;wjHg!v{VGARlGTh;L0O6oma$D75#~R?nmRx zm?~Y3Eb?i8%i-T&r5+B>;4L23LtoV&pWDI6pV$4&8odNLLzK%DBa9QI2}{dTloyYZ zXhT_Z0ZUgeiX0>~ynlMqq}1>tI_k}#<=jNNa-7qs{nH-c|S5#B^ za8unCkbQFWv)2CX#)fBGRVjV0?>is3Na!^%aVa|@8*(@WCrHMe3Z8mISYsg*{MF-N z0l|CaPeAhZV!=bylao85(O6bSj(*JWfSb~HEp*_p<)%#VS$cL*Y~~_>aH%q|T2Vu= zRg8&jSNSZCsfX4(N%cgJkzQ=prPP}vX{ND-{X6$l%M}-U5{&?Z0qDoj5>4SE7{rPy z6YfE&Oy~+REU-rS!W0{;t*y<{vYlb(HR9#f1`Bsfw4tAgg&q)cUhH69lLUpL=shb; z$b+MJYtuck3gaODw!L#%f6FH6X4v3xk({H=sW?7$8Sn-a$U*EF;k@5qBi znFYccU;U8Cy42DDA6~vofQj^%`g!_p!>PNPd&s0?L!yTs*9daufX9|ypQhFNJARBe zJtH;}i1;$o`tla6j-I@mFnKg3WrTK-3E$SM+TtS{T7RAsHKv z_G`lSkkiGtdwcr_uQy-q{=c2=GR6?qdHY1A{SQEz<*A;af?2$h9 zgPblhiL8h7c3(3{lt-XcTNxzsKtLYeu0`)#?Snmfa)l z{IA~~N#1Xhe~%FD-!!P41Qzf{-U}k1jPH2T<@a0>BAYoHyFa4=dxNVbIvR^wZPo%z z4U(W?X?8FC?uW#9WErp0qoj!>G6~1NgR&oHSEL;U={bsgpDh_tVmpn;bQX0s&X@Dx z+c+M3Y_%9kI%>L_Jv1UD5(Ki9g&v2XGCG~KSQwc=i4@6Gl+^Y$zw;ZOnZk6beeiFT zA-5)1mpn$Vy9X@u^09TuVs?8zcVAymY$g*=TC5r4lnn;)5a^>8^haUIMiLu%Sl92< z5P)Hf)K-sQZ5Ez-w*cUmex3VFv~~8D+p5b{bWQhIsK`^J)cH@h=Z(Ct;srR#|7T?_ zdH?Uxla;3r=RZH>`45U()zlFWAAf9Z!xR$h#4Blv9v*ET9KpP=t^fI$f-4@^p;CpK~lyWoh` zrPHGq)7dUf)iyHyOamr+L8NP_!VMnJhF}Pa+^Hk)*XV7N5DIwLo3MJ6>6XLY5}JR_+n8+GF|*Jd>N49q zZw_|0Hjj3;wYbH{0L;LZBU*&_xVj&_b65T2^G@7~QD;FQz;-==59uk_#xh(?ZOE6fbWcV`yc88fhnRf+9;Q{gpNq?HYaIjbOid9mXT_+=0S9-#G2SBV|IElR~Mj z=Snd(U2I=OLXc$x^YIY7^6*fj(A9qTHLM0`OW<*1Ca^roDh zmHWmx@}*mY*5VxtNZOBptO3JeKR~mD@wYGy%bT<0ZUWNNNNU>}fU2#`fjBm}-{?AC z&sf0hlisA{DjOzql(0N5qvR?2oXi#KtGDcP+zas(iI4NpE19K+0q(MWd=yJNlZL{T zn_8o$Ux4jA<6lSGSok^uBN;hk$3jJRP*2|Ye-br zQngw}Vr6p+SHQ;R<=`Y}8B(7%$wyx7tOs9Z;>kj9oMz{5-mOB^u(k=Eyx*9 zYb1{hSxsF!WoPvZO}bfCF37ahuwLZ*1~30Fx@HsT|yjx(m}?vHdJ9mmY=0=`7=32SW&k1o@b zVSowA5bVP?=SbNz2fBEE=FzFIGyu%o$GzQTP0LfD({$(q`m}mOC&BC9#(HOIW4#Oi zFL_2Cu`8tpUJfUB@>F(<7){0~*=ttCeVT=o5*ROw4#z$C=Cn*rptAH#R&37`+SwFU zy~`)5S+wNTpi+%ntWY}t0tK~mOJGx50y4#rIXUNq@}$u|IMfE^$Uaq6j6Tih)wXS6 zPD8A`K5l%>L^J4tTyykeUbEDj5g~p?)im9U!Z7X?DCcnM@$LVOkf(AH2|9iCZ zG2mSAd)c=Uxv_7agl8Hi;EjZ zLz7vSvTk$2J77(8o6|mGs3M@MeY#Kuh*kTBg|Y`D0u`g~d31mZT(u=lTwG-?Q>Qyh zd!@@Aj@|X4n-N-N@out`Nm1WuvyVL)mpN%23g?1WdxLq>{YBVL8e7 z#vm}0C6Eg0JDuz%lq?-X2T(2N+^vcYxVW=>ZlPPghK@hwE2Ya`sN2)zfQ^c}QBI=e!f*d&wej9>3X++?&Er(iHP>>fwJXemzBK$r9S8Gf~{T2 z@_bWO)!>7G@nr`U?=!)-wO9%2ns{7PHVMe5?5Um%Z-!ptbjr{yI#1AdFFH4tai(dr z3tF0TRd9%bfsc1qfdNuXr)KV9gxK@_o?KV}49{nR(T&pGSg_lCv&$wAX}wBfGSLHK zwv&XanqC>F2QaFc6Y0C1D%d(79l7N(YTOu<)kAF|6pw&r;4c{r*LV0W(qB(|^%h_T zacEukU2ku=;y$~L5@zr&=K$|pV>!toRyXZw3k~;*`hXm#jyz_$gcnWMVtn`Fl=ATT z4)VYBSo`Mk|H{*~wUw0ozq^HIRUw8c>?!VP(?~aq_?M+tnAS)h1 z)@zu&qws@2h-*1+NeBKJ$T)+pPp*hjmf#rlh@&+s8Ml;%;|@sEr%*%^C$m(16Oa7M z!Xna99UXVHonJN#LZbYpO{K|J@%~2gnRXd*8prE&&I2Rt+79&EZ+;ks{qTJ3xXq*M z`X~yA7uL-WdE17Ip@LP*z9Et-_pVy#0MDY0?eb}h0#z~hS&>QmLXvelhZ;F=bu^NB zz`JgZPX?N)`;w}R+qaC{l1a>|+%5DVh0m>eSxp_4ApV&nnDuJveied%vY9YyUy(E} zGP!gyqD79WVS9h;=#Mu$b_5*T?2r(v*8eQa6Ew6yU=#`Y>@aD!?#W|HO8a}X%`v2v z9h1UTT=}4tczp8Q@lgv(*3}m)=!KNsv@KM#tL?CRge+lQYQ>KA1NwPH%r0sCkchh$ zkPZ3skHe##*Z6?H@zXbNpTFAO!l(R=pKkBG*nIoy=yYfAX!mFr2+Yf^N0&t@98&twpW_L&EExDpj$DJ^vsRjM=Ib8>XzH{Z7E9<7Bci1yV@l>)$yX*Mpe`mX6EY0 zsZmHzab1Smzk~b%c1LUmfW52Zb^14=7sTFh=zCGK$S{<3_g^o|c53pgB6zBDDsQp> zI*x(~kpL1lBsWAE-q^{!4{uM~#69{bI#8+gENQ^hFI&rCs^0$ePB z!S`TAoqhz>6V0)w=l*EEWlCBYFv*JRL793{cPWh9be%n3J}K<#@yba-506(*GJ9~m zc2XD`!Hyl5kEjeg(?%wb5r|r?=U(jd4_+&5Wi>VYk2=Bvmcf97wpc)~p~ob?p;9wC zb#E4G@-!S`G_0;SsG|+M6h+Whn$1OvMov%&KWBbtig+oTfsL9|(p)zJY6|xzB;CR} z*3`#XaJ^7`Axqj9jSin3>$e~Lo5n}4|HYyLzyTS=y}>Gr)$Pub#7xlaARju`q&7-6 z?T~^LL1z~;0$t_~#^$McRy$I%<1s!y zX{PRbyYDlYf3Igb@Tjeno|KVK`7)K$5+4j^i?JFT$=W&UEP6e$cVcR{V|6Uk=|_4c z1M80h|Dy~s%SH|iC=C_Q0*v#)UvE@Y3Z?GWlxrlYW3E5vYX*!X#ajg(iM{j(QSd>$ z2C)W|-&n@1C0{IRQ+BZnGE^2*xWXWDj`r&gIls5{V0V${$5Y5B2Aeg?5kp4Po}CKZ z*i2MN^)iPTz_v^{6;^TT;u(v^t)k_VB9aU}K;eo*6b^a+j9IlbF&CuaMA=HzeJ+a3 zi5-*ir#rC^D&d}nA}uSb|5hnJz73T_0V0r$C@?MIHS!fpXaZg{UvGlof=-)1-l$_eEWW2xpS&AR}OOKt#m|v(o86{6XRT(YZj~W6`%)e!&QofG^F3nEYqe ztp{l~RB_s4PBztb(*+poq7@$8cCT^`CL)fynE}>~Q;RC$>}ToAt_wAJ#ruxFE4h+u zP6&wfywMv46GFNL%d7zwSu*WM&|BA$C=FkNm0X9n&H@r=z?^sY{F?-ovxw}wJM^@a zO4oNfV{<2`D+$LrCT&BstZgVUq1e1|8T4SKV&sob1NSVa_x8D%G{jh(;8(5-5BZCG zP{yZY?s*uWgB4CvbslEh^UO0>XiVH8GR%t&@O%45n@79*dw5)xh}%(49Z|ITRZ&xR zqmdN;b3}iIPLc_eSiMnAJk2|XD;;B{ydY#->h=D0w@t^I7W(^x&-h*aKgM6j0le7% zW9`w((`5XY$7>JypMFsPj~G*d!%p+$ zs9Lr3%SCt%V)A)kIir&Lr2@crWgwf6fv4E|Toi^39P7$9jo_r;SXY?Ph$|nz;n+Bo zamoyll_3kn!d;Y?Uyh@QOjG=r^IX;B1u;s&a^_tI{lJU(qOKwc#}K7_vp}^`&>aJ2 z0`r=qQgjI$T7$}A>Ll#tmB*f!F^5s1cb_Q@Iwiu6Z;zYJrOX8BmmX})5hh4K#RTci zi_vBOq@j@r1{MO1EZ8KiD=HN3b(QZ&;J17mqz!VL(&Y2}jAv2v4xCf>$=;`mlv z-eAZ{*yy1!%6?5**($cZv-N88fF+)Gs+@$>!h6z-vHwqFjYd&N>kxDuz{p#lZ|fLE z2a23JSJhO#fI_>$(wV-ho{{Bira~p+VZ=MBqiCAT+r>_m-_d}Aw}a(12zDDMhXWPJ zR$D;^f-JFmG9-thXN>KtO>JSP_w0CV2Lg7`(6=-eq&|kqC!=B~HSpZy5*dO4M@cHq z4ueS|3A6T84{B{4*~G^BSr~4-2*dRy{IcHhqK)TXw7!I2)|aSAZBj4i4d8lqk4v{z zNE$t{@~ATq?{@c{C`rn(NQ6UQ-JU@o5}k5_tZ4Xzp~y3`GSqw#^nEGQ*G5esL9HP& z2?0c-vWS8yT8nCRIv)(eFXk>nCV7LD3chwRt zV2urO-G^N~wgSZQt6Qt86CXUD|4eQ(*xYghU1&bh_mx`yOn`Bzq_?zSR=$Rs+d5oy#fEWYs)o^bMAej-=EsGmD+9543hZdGB6!H z+hJd-7e1<%zA=-j3GjV?1%%C9DAMoSI>LvMo{^ z3Nd4kOdNULoYGB>7)`fbish!Rilj_g28w(5CK)0It&t95PCWW#7RT*m&}$2@EbGFT zhzK{AqkZDn8B;f=aD^h`z`N_iFZo!@AZflGOmr>_%zSc;^zX^ zTxb@tU4^2>ca^J&vwchUB{c!HYpWcv6a<`;obe<~s39r7Yy@SDfTT`Lbq7g4iY~?CGiP(-l zJ}s%8%8i*Rt?rjiCbaFtOb*iyp)=q(PQ}FpW=buHc{&qJ&)O)Pv~}Z{%xQFkkq*kF z?y7?>K4L@4^u)1xZ-=W%_ulR`yj*g6D?Lh*!Nk&j9kRR5tr8^+9xtEd7Zgr8I(!TH6=0wbgK1Ug`ti~v2r7=*B_5Kx0M$=jfq;OrM~0fP=Ez<8=CqM}kENF-%O zMH%x=XX9p1IxCdWDIU#Sqbs_mFCMeY$DhTQYui8T+V~tuy41y&FZN^Ee3oNYaF*Hh z9G(n{!MKn9sJN2QSvEW)hYG7{XIf{eVcd}*IPEEkn6r2PD-9DGI0VT5M@tp~d zUX|Bj-4@!;W}NF*(mQl_Hiykt9y~l92Pp@6PmdD*$bc89eAZDC<*xEWh(PlR%fo(#7u{z^yWF5{2f_+c$ zO$(DGAI>kC#M#ESZu3@MLFU(L;NG%oU+GMZ+E*E~q$hdipb%&vGXB-0!QsPll>-MI zbG=I5b3=YGlCcRJ#wA)T0LX>1wiIO`ltw^%d!yDl^csF$+L#P1r@q@qie?#x#_^M> zYA%4xS&MMa<*Ue1L505jBJkf-`b}|LVkA^L7#IvC;!PR|R{%*1ZTB@6T6WTFOI{bO z#$#$aZuUmKsyj|f2;&0?BDgCzO*w8E@X`b5US}ycNQ#PO21$wVI7;e!?(n#J&ZOb7 zW0le%+1U$SP~}I?(Jrbh&E=|&yVtJ1J$kYD*XlEO*tC+89yeRk%hG7FRT^ltW*V(g zqejOmJ^XjaD=7v$<0qN2ExNi!D0mIS6@APTd{ct#eB!{Xu0R&gFiAI@VDf8`EyJE> zs-}v8r57tY14?6uRuyUHVKznbqK*AgBWLDGsIyMF)e=)qA!E`Svcz$DM$ z0&=L-z|Ys4_KOL2CfNrvG0E>`M@H98ZkAJzhJtjD9AM>1ay&G;Oix*8$}!0R^4H|B z=-8gAadF-h4-8%v?VWmPMtnALB&aZzwKM(s_q0}$(5DllIM{{9Grw_sSY(&T26_37cGU;`Zm3^g)E4>4sX;yA_^c zV=dhpK9Mc7WQ+DAJ&Bo2x9%16-}OC0G&Q0pj-b{U6>>W#=M!#RMLWLYWOveWT*V_8 zjDpB_j(i(3paV9aFlELjd7$%D9cY5AGtBm+q1fT*1h2gf>aJyXlRYd$;uv0E48wrK zH(p)%6#7ehHOPpKGDGy0O$&8AYZ+hXGo*rN8+8qqvPzFALZ&vLQJ6bLAj1#FSf39Nbh$HEZO0N)wsSr)F#J+fsbVKq8rfxGF}BeOw}7w zs%Q+CNi;+wk0LdhnHLY_W?N|| z!f>u1-W8U$)|F4PwbWPLM(`vG*0l_+h*G4lF9PMI$I?POtS3Avyz+GJsZew;yurD< z14syRuQyq=ifLa+g%Ns#AL)Cyj#YT19J>oh)eu<}Pu-4|O`8KDJ|d7wRbo+FUzhu0 z?H86WnJGlRbJtmKr0SwG;y3aK&6zG)mktz~dByrF=zfih)#$CYhT<`46_&o_O+=;_JCUX6WDD_iH z)>>RNp_hOI_kB-Y2QbO*$Z!b#F(ZhXBgw=bC*val`{pHC5O9^YVA|%{(o5nVbwyhB z5#Z7W-pb-b;*rO}@}cYKD`Ail{opc?Qx4GDrOR~wNbFn>`v53Pq`YHiX|>x+Dc<0< zqa+Q^2_MSOhyiy7D&)1RqbQ09L;ks9-&)VXk=_8R)#aK5jrSj9EJ0)_vYdeK2$(!N$ zX{*A=a%VWPjz@YbQASaU?3fE$ zDmL;k24XP;PiKO} zWMUILx&zHo%{i3((rVFV2I*?6yv-VX4SQfkD%K&94ymLa6e(S&NkB8Q)bJ&6zDTLP z)tIq2#q%32*3sELKBYUn9CCjJ@9?;C-L@4V`)#Z*s~*bxFwK--9KmcWcHPV%M^2S_ z+#)qGCNuzZ`=gi2%kta*-R`@V*$MFPeb`qY-L>E3B059ot$JlAfT{A8X2E?@V@6_> zoeqf_CT_eP+%emCwPGc_>xNP9G+Atd>+3>WAIs`UEa_4krRK7AU~Ht~k6SiM?bKPO_RsA4R^O#h^LwVuCq8T+jW1 z@BfZ^OID=qd%OlbA^+3z+T&#YrzcO=9zWdw{UPuFHk(T_1ytffs{E+}8L_%&2O+fM zM>wI2H;;~9?H(Rg?Kh_fJMePpf8NDE&3&dPw@YIc-{=k0*g4pfWuVBsD%1Sw*+yLz zeBe0Ku7CLd+vk5r~!leil{o-XinJztgW`gXGn=cBdTR zDmg_d-o#RiN=XTljuc}^WI@&1jaEoO)##yqL{~f$!JcJg-_r}fk7o)Q74XVtVeux4 zt64#Jjpb)f9C;roEEqS>$ASncMr*6F110+<8_MXO3XR`Z39U^WPeeTE%ib$b#AT}w z8MKj|wW2IF4cm519GBjxdjZY<$6qR`h?j`a`nm&!q)e_;Pqt=lH-)YByby_<0En(#*hj`fQ zXW#!V=Kc-k|EDXKkWbi_vL>#$X<^8zw>J6_0HZD^8Z{y1NfhW3Q*t3(-mxZ z@8X5|`Dd-;*1M~dgso6`#PCuX3+Snnks$Kpk$$0*5!^4wORRq_z1^o8 zFk$_#tv*W1|4$x0eaQdzFR}i$L{qT*F-r9xQ)vGxZ&7MBKWqIb{HZ^ie|NP|hi_bx z*12A@YjyYcWBC1(#V>TOq>0eEWD+_QgGYPYn@5}Q7mGe~8+h|-b9XNbz66`V)v3C3 zum#l0sQjPh0ANxfCO5kxsGAs>IMAhV=4pFyB>}+0*qAl`K zjZ_ilrA|Q;3N#g^TE&H+YiHHD&zC*moVS9$JUY2eCPK4Xle8#8h>H{>l#H(JAVk>Y zqrg+6kR({57=am^mQ$;+aV~Qo&07LJpLURrx}$>cv8UUa2TEs8@(|tzs|`e`j&td< zXFDNS`)JQ>qL#*-2>dFqglP67=D2>f;wFiy&Z)lfeLVh=)`7XS>TveON(+Fs=u zfNfO2*xV>~1#&W-Fo#Iuwgr#*5Nm@ovsp zaILSR;oTRNRS19EfH=bjo%@>l{V@D69*Rr6&~rv%$rY>$M?&QsTmJPZ!Z_}iVRVBR zI~cDRqoo(&Q&G`W)x8|PTP1rEj5yPgq8Q)JXxOxKvv;f zH1ke1%qI^dX^1T}^fmHsu(@c&(CkgZ>TqSYN4od#VnU=te%eSDOhAGM2gfpAHVF z%5aEMjvN3ls=EG>%D^KNJIGsfP6IOY8s}rrf{0O@RR!JicW+cSq*UiGlMBz#YA@oI=>!2EZ@{RZun#L50yIRVZ)WC`j#oOWrG% z982F5v;vmNtMlKmQO4(s^5TQ<4`bFb zVgC1hkD^0xs0t48XD%gEbxcX)Spnf;D&TGMX5E?rZcd8z^~Ih2BlU{oPV8+vuR zyktEgd1u)w@#n=w*;TQ;xMa|$JFOzl5fTG$w{)!l~kK6 z*=?>Aw7F8y=8Dy(jJKzLTJ*32y$6&m+zJ|hO1H5~g|g?MEz?D^r#ck1uPwv(*$;Jw z0zPn|CA+fhl;FJ7GA*?j;+Y?Z*CYevZA-}Cw^fP($J2u^lG+TT>N2&Ko)gtX0lcB! z67L3biolm-3F%bV5_-ZUOYEAp(MnIC6ufO1Nr1+as9K2d$|QtW${@Tl1;Q&65MHTT z$*4H?t=e{o!H*@k0D(8a-~`NASrTUXV$KQMik#AY?wx@wXpd!PHX3hfW4#Oi_m=GJ zGv!l$%;n6}u6}U5aw0dCu3pwOMIHR-yN&D(l;b?>N~7@9Q#nNd_lCfr9}R*H|Moby zNG4rn{9r{|Ni6yFR0pV@vs-iC=An3962Lz8cuq$GoEnRSWwaJP~Y`XHYWGwGPtPc3 zk};jU+oDs@q{U0_b}^@13CQ9Fa`OnLzYJYv+qcxND$h=>M+yBq)eOn`GSs|jBj!L^ zO2}u+sng=;odIlv5oS2QJ-!%?hH+~N4J2_h8h36M`yR;JVRXLa52Ph#$y8tyiHql+ zvIHg`D_iHH73}pW{NN8_hkI~#U{2k%g*E`G>b^7C4!Llv1q-~@N~G-LP(QXYQOr?d z8mAKg7N<(A>R6!dIGPD$sFR)y*T<2Iba*?jZ%oD#YH}?SaNOqI zj^@)dr6+$rrV#zbL`-I1kobmYXP^~YL{f(1Rw}f7Dt(9BAyaXi9+(^s?vz4B#45Z6 zN>OYf)ai$4DMx!LsVtK~oMKUjno~hE8e#s2)4lrsNX2CAQabU#Ym}+YB2d>GXinnJ zA!Fsr=oiWf_uQqKdy~--z)qr$dXBPrB$jRz!Omn%B1Zm`X>>;vVvTX3gRK0i|Bm9G zr4|59TuCa)1I$5;JRovs5TYw97}jRhF*Gs(#uS|-h(vX4gN01isA$W=hn#9MSD{HSJaz=RaZ|cx3*i&N~XtC(bRu?u&Yl{ zb3i!6;-gz>GVS?i0b0MU^U7e50g6vX{UWMM#8gQ^X+`3CiUE~vId_EqHuj?%sR>F- z>tH$#shoTS-r%NT;yo(9)$u{}p*V=Lqo^|`z+B=naxcK>&?Y+w<e4={!{ESks3@;4%XR1J}#iRw!{zlCa;y zO@xCq;w)f?CmH2hA>|J~22nWRje%nU$0m8CS_;siUSB6sC44+NZ!o_wC)>@>4PYDH zlz)MyYpo&l8F3=naBga_1WcW(YidBroUx=PXS*e3q(()9qmI3+MLNT}QHufvOx3dv>x> zHpP2h=j=T1ddE{qYt`aU>AY1TCqtvztJ4M3Io+LL;3kb$A~+KHoyffa$~g&Moq9II z%Ba}P%Hu8QjU|ke*-8KYEWYUPc79a5*Btmq8Y=0gi?L^ArAM_0fo;19=*#7im+~BC z@h(VfURuU8brW7pybFa%fn*R`E@vrkwUWHLsd^!k#97;vyNMi91GY4iole>>$4%XX zsd)Y~o#-GA%kun<4t$(Nm_QXE3aHesE!W`hr*>_nmV#bTzGmOMy6TOg^+n3~hYU_qIzE?rS zqmP(}x1PQzrBXj@C!qAL>uRDm=`^}nXlbK5)xzWhp;F>wmb9RyQ)CJraCEst>4Ow& z5lDa?yqOS6VO{Rr#;xERE)nj!mPgX-BQa^HycJNG1yT}Q)A5CKGu4uIE;FQ#RjS$| z!WWv47O>@o4DmhTRE&<|WRFWF?u(LHaS6Xfo)eX31HFQcY0VVJRE@#enNOps&78W2 z3HgMqf0k$Df=8lIvN+A3R6E8!wtQ+j%q7HrQA-_4DP&EZQ8=_xIQN=tSGU|qJlk_t zE*j!}ZM&|jC;e^Hb=Z4~N52gXB^469)R=`-vRb+@pXOykPZTbgAh;qkCJC)p%8<|}FE=gDAxHE}ryozUKeJ*l2 zxE-Kj*zdL2MBOl!^kzo>=u>$=O9t+wmV^E?@r>i0x70(oY`HAmQ?WXIoLbTf{}oxn zH6c%O5M@I zEyXQWG!xUr$=gqy8zd!EE{#J*p4a>pkj+rDdz9a+6wlQ2znRY2?#$wm^hwpf)y9JP zx68~*=PF2=Q7#~^3ka?FtSHc@ZfeU}pc~H%CJA9Pm0)se(~%1T4fQ^{R_P3DfFNZe zJooUtKH)XI;3!=Sb^=&*-?J_O1BFzEDU+_vr4uM?7D4R5Y#7zbHC#B)j$4v+);ZdV zZ9Z|p&KFk0$L^EY^@MNQy$(t6Ap25f{Qq)=@e!bjv3ckPLRNrNzPA`V3g@- zy2DwZCiXbzlTL@`l7m8pj0b&a&VAFivKcy+${4e_vmVA$rx845I|IgmH zw>Oa-d!N7kDF%62Nm!OIz-A*X8!t8+pRk62NpfCW(KD9Dpdd?*Mgn_nozMPuUAnuv zr)MM?LpbNKPl7cweede(>guXrxebu5o5vCKI^UnPDuh#WPAadh#pPDrj5>LFl`c!Q zsB~3oPOEcc`jKu5+2US|uS2T|Jt2lG}&+c`|yJROB)cDXZ>M@LE>97);^{LmpX!A;!X* zjCvt`$D)?V`rvjkOu=#zVs4IlAB`hK}e*C3^%j89}Hkm$NxbIPSq~ zOfOAi`I_ELOZpf`&&TVv$0#(GFrxh22*3zkO#k+%maDZM%7lvu-% zvs})kv0ZkWq*v`ctJQHo;KtMbpk0aAx=@Jn^(*-en=!OW+z;WC~u|)&dJ_ zw+b1*7V>JhCSy8-xwdoI#pm4X3VQagdqON8NlUSG0CSpV`+7PYzZaH`PODecNUyk7 zemUKCO9@*)IL-c@T#3hvw7y1O&-gUXY*20$ksubwP>NTLdc72|1v=&$TV_3f&Z3N( z{~fLUgVL-8t23)m6=s`cSM8h^>Au5F#m_fhV9Jnk;=oi zXXhE)Gwzld=8PXeP0vR>zQf6w)8fV*gk)pR3G=7Q_%wXhY&qmVW4@A&+fCM}aI&;y zrsu(74{6h0NK)8=(sMK$Gkw+e|49!$_JmkGdHG{?^9{R4C zmE`3<+i}L{`B#Tn7gW+WG0uxoH7c&>8cCTltJZT9 zJ5s3dlHxL*&&4d-arvKd-|ZX1q6V0e?|d+sTy>dzL! zG0I0Os^>VkX3i$2(OD+YF-@7H5r`lGKP=AFLSz;7y3Nu?37}Q+=O+B@+P6tQy$Omc znx1m6TjpWEh!StuEsU>hGBrzxpLC-E?>3!xT`yf&{uX16W+47tAl0ng=_F`Zd~?Xe zI{bdl9=IBa>vu7F^Nds~hpMK>rN#jnd;w1_uX)A{777?^Q~F}hx;e+A7Hxd)kT~7% z_r(xse`SNn&wF)YCvlCB5wP9uA!joDLc&|UA0>$cab`3S;5SX^W8w;ensMtP+f;wo z))rriLBavnUQ};nk6TU6i<^oQ17*>RA8GVpmv3D4l72UBcrL?OK9&nXOHk2SK?Dqg z6)w&62z=4G%+sdc-We~t=LR+QLgoeYG@XN?RO(N$Z#6!`>R#PyM}z&nVu3Hdi4DxV zA4qGrV2l6*v(TQjeTpsu9r)W(yU})cYpr|xtq6y7L3WW9n^beM@4DW*oQucIj)M>h zv$vYeSSFWoXN;^S9tQ_Dum6Zn{sjghyx|f8ME<)I6XiMlUOc+5T2yY2kS)>szzQR6$XllW2z+kc!bADpL&B(C>zhi!XCp`S$#8bZ# zC&lQ5{J$hg05obg=SC!$+A9mE<fkJD^s)^;1ZL;xYu{Ca0Dns9$b*?T|38Y`oNdDGdc$Z=D%@P*=XJA3eD_k(afIaWy{WP zaG>NQ`cXu3XE_sY?%w>uh#GL;hHiRlAbj}d@Ek_nA$lS!)PP#p^bBf<#z!ly2V@XaLf+& zjEIGWm%09S_yzHbey$gC$mGszQ*L8a19H5-a}Dt>wn1v9GL$feZqpE!XxQ)G1BuWQ z*Vfua*02u6X#%IjnG|SnUMdHG($-mMMaL&6I|5Gc10xW2QL%DWlIF=%qNV0ewB(G2 z+fs`L6bE9Wn&=$%t~ui)kR})L2z=}z6e0yA84L%j4oZFvZCN0Altv-i2bnM(>e!($ zE~*5&*XTJO3n5Y=6F|?2pF4x+MuTs}4Ii^>y(%*KNKNIqm^uzY)@hyNq7DF{77z}* z2EtmdZ#wze)oDFF0Fg|WUa?}d*$YM=>(pPi)l<*nK&MyqY*{^@KM)L5F?R?ug85j0 z6&Y^J2K>r#n!obW*Fz|mzX(W}m;6rnK;96z*zi_!GS}KSG%thF2Zz)JpumisU zNrYNKi%RBna!iG^B%+;_q)bgr@IiYg7Y?s!aarpa<^DRlfnmC#)o+9?l!T@kQ*^V^ z=GciSg=dQA1ll6>3m0nmSoMZBNBFL7jk%)e= zmI8F{_d~_o3?A)dgy<%0xJuyQ0`CA#HHM#Rh8`9F7NJbAx;Q7SiQCVNwGwx#UIa(O zFkH6Knq=?fk#EA?Eg~ESPbxguXikX-44qoN5E=5D8aplRjcNCxXqN?BwhnCW)Tv%% z>-4Q;6$`HAQC!f3)U6e$I&y0D1ZHQyYm%xn5?*G=LG!?LxsoH)SprrqMP#TyN26cQB_sNT$kKrkGHt~njra6e%+n8W_$cO!EY__$%~vH^HJ zTarA!C(zO}Va#W-4q`=yVPsjT!#+9agLRPmT-F)8tkYV12SQ{m1~#_lql^Vlwq}+* z8}ZnQLW}WdODctf8xR~)Z#<1S7++i{dU8d0>RlTG*R^eyMY;)$SMb8QJL{rDI-SLC z>X^IWtOt&It-B~i6y(54n$60+Lc}$bwU3emDYsV)|K}W*3pdvVgz3*2X|Z^MSkJ|S zru`&aU#@7k2FK9f-rmiGe)0|wWnZ&;tm&Dw7pVndtb&&bEc4|L& zLZ8<K9ff;_bMQ{rPx1+=dICtvx z=ciQ5x7}6@4$Er4Px=rvgI2a)@QNe!Q4Fa&AP2hWz=wINfXvlA+0iLLNuVE-QJU2M zIqVH8YK}^otI1p5aO`?9&%gE!2gmh=RZkM3{bEc=@hd)A<2jo`vB6*hd5+8VDhdWG za^eWH=MZN=y@T=o89?Odd5^=}blVP06;)+w{{+1mu@wANc5$FH!a!xcPG?F8eo(b8 zY1p(IaVJkW*H{XVulRTom6osZ?X(dsUqjkyRG}ZFqMKGNd(d=QY@JbBZ{Thbc|j>e zL8Xlb?UGX3kl!~OC{q*_@vuRv#=IgPHIQW%74f*C#__P%$7t-;(i|EgVf39#Eu6{5 z%C=@1ZWQDh{x*yF*{D4U$pk8BmayuQp`_{zQbN)wL)Nm{ZMY0C4LkFthX27|xlE)S}L zWdcYmLY{b+o-@|M9Oze!@=+S3>!pkhllit$@)u6*B|f!@H#3P(y~G_Sfi#f1E0d`3 zI*v7)H@?>f>`V2rOsy(otICcrFHHN93-C>bOdn1?7+xghY5_M8P9WA*M&O)$buuXl zvS`H3a;%005Chde#KNlP$)pa_aY;{zZmEB& zwk{IhvUh-uB%Yl;cmP2_zP}4hJpk4os)O}-xDz!#Bv)BDBav8r7sx11Nri|=q6p-F zvkEb?ux!4En8uhcR%iy3#i#s2<>#!}W(Gu$p?R~CGlrg2 znDGv=1Leld^oJz3n{ko+F=NPP*Un=%XYG`F{;}0c?p&`$sqRDq}w5FvqyWjv7-jHz#_C+DZhNOXR4)grM#0z7GpJ)reO7J}T*AGrm)4~y^k*zJF- z79G1I&}!umL0m0bOR1$tTtDy>L{Ez76FT<5G)C7FswsELSeqs^g>Z}Cg+a`g4>nSP zVyQq--<#6mSTY$ojMou#U@v@Ac4NX9xhk>_0k5AAVU`Cw^Yo(L_^=V<6d8hQZu#lcdwZ5 zbmMXC#sQzs3$h2opSkd zglo=t``7W*HYQ`R_-un)vf^mu0?W>;h6U1`O;t0KSzLggAPUoH(gEC8m!`yr&!DRVTgsQCt(~!w>XPxg+E0f&;cpudS$pS8P+3n< znH)@!AjpKWq}J19(z}UzVNw&rSqlttE2k`v&V1$cQ z=xK%yY-{Hs0PfGLHqvM~8GCv$ zf@17UMyWc@_0`D)T4sDN^i?ojuZuWM{0fwAtgiX=zNgM0>Ez;KI8qZ;-rC}$Tlq<( z9Z^1^wT{*sJNFu&da7P^-~%1q*wze+`GKr?cc9HC>Jc1FS2t>4`$Oq~{B%K+H0eIE zXM~zlEhVSudO8C(axlTOt0H#NMAHD7MZjsja^QS|roBDF0gvKybwU}d2JVqs990gh zIxP8k6mv*E(J!!NGVjq94)oH5G1KM1yxWMDG}fWYc?$eCU8wWZ_-gfH)Weqb2IMvu zN1x&=>mWyP%fedO;KasfXVTyWy~^W}I%SOk(2LoC6E#;&Q__APcRq;z9KmS9JK%u{ zP((~as+xK>Br1s3wgLSamB`UJeuu-P8V2#!#8JNAJMZyasoD=zuSSDp9PM9T^i@G4 zZ2SKgIUvDC;a0m`PZa3O4`QW zv1AHN*KD4WlPS|O#e+>!vWBI0m@$cDpjppVB3RxlTpx3kB}{U?as#C@339QS;%s4N z5H$V3yw&t#u6ni=Y88Ks$Ch?7_IlQDSUc{4!ITqUQxU~*Ai}_63ePZ5Eje63P5HHM zx2l`Ljp+Zt>{Y%^6LPG9TR-0IWm;v5n@ZzqZb!YJ4Bn03D`InKtqYf~Itks`l2w_U zH#G`s?nrImthyB$46{}0IeDPC(|yqtpLh`Zwbc&(KTIv@)q9MYZYM@c%4l@t_@S(;JFN4PC4@o46r6A>n9M}3RH zqE~IT&C*7Fy@bsN7`SHX?a}kqpG$ZaB;>2%@B@SbO!OOm7r{pJZaBJXmOAQDxER2Ze+EFn6#Y-FmQ<0H_A1S-ObTW^$_Jg5u$Sq3TE1ZMCr$jQswn_aQn` zBotrWvPTb9j~>tH5j{EU+%k;$&hE<=GeDf*1wy2g08i7)Tdr7Oi|*=FuW zymenfPwJQ%`)UVFM)7GsDMC#9R3W*?4<41ar4v9#g@Qi#rltBgtgmr(gheb_d#qA? zGveT?(Y<#A+z43g5~Bs&dm;C!klsX;U&H09LUNt^PF#O)Eg+_9+6hu zSe;J=XqSCI11HTU45FjqXB)zx#|LD*d)IEg{#5EII}&;m!ihk98+xCGBhrAr(JF{$2E#~a{WfpwPSzk)XhK^E{ z@sV5Jqnz@T6j5d=qHLsyoYIdU=Qzb28Gmxt0TX4gVXu;q^yJqB7#4ieFkKk~3ulax zROw&tgb-}X$slhqqz|`$77&-x&Ugo75CusyHxQA}7c_z5dX7H!Vp5eF?525%G)#DR zKx<_yiIrQy~EcR#Hw6xO)pjVJDd@xIGy_$d4& zvG0oZnyng}$?ayeQ8ML3TS7TV>e#3cu=^--vmqb5yV!J&zS4?)28_+qR7U<4rj{dO zp+t`&tc@U@cIbkuA<*mLy(OCtNRk}q+(pWO_^`NM)Yc!C_S4=-@JT_Ku zysSFKA8ogmqY#R(jMV2Awf3@gf?34q(#X1Cx5>o9kWXl}q+5eVnAz7sX_%4Q zAQUOPOyq+xv1U@s@1&H}o^BfP4y-rvsJjwq!-~MxG{7{WbayZ5{o8~)$TpYVsZ)je z=7r{P0-#p_RuEP_P1$89!HCmUdqfEiYe2SZxDD963wF0DdMv?uMt*lctG1b>=>|G= zoJGQ;*mIj^)75h> z98w83pEPdAjt_m$!pggNeP&lwL>Bpg^RCA!<(7zjeufOv3TK)}(}G@jw{T_zx0q34 zQ1TG5IpfDTuX3tfmXR{N7?=TDti>X41j`Gl6NO8nC%5FCZ#@^9YYL43OIu~uvz|@OX}Ev$xaBMwZhi4E>x+d~H{L!*x_lD!>9M}KzEYJ_)Nc=& zWC3xDBCmh>Wkuwhvv-qtzj-V5h_kjftG6%0w(a5kZ3BsIcC#L@7a?*KL}$;LOg|j^ zH_8>i^lW2;zRekzO$&oE`L6S74npQuXPOKty zhU1~P1I?q}Fq>$w1V{Q!`dX^yL@n`2dn;m{w{l7C_rt;Jcn|9L?IcU;@#52koxs^A z!rQP?eH&22j)tJ9zwTB-L(!EelO8SLFog&X>{D7&aQBK5^=%e4X7iSfxr3_L^A>b|%JNii#86oLo^QRPy6c$>{e`eAOpYivgMQ zs!rzCW8>z&Zm5B3Zi|7M4IFfr6bu7ErT*`y;;%)@i_!B8wd*|9%t_o)2!nbSjo$&G z&r9vugIy;0hNXA(QOQw~6)XUT8Pw3<=&a|{aJaOuBdN_Gqhx))%c6~(WCT`{tk)z} zXPWC%XtI%mTQa-pkNw1jWa+EtKZhi5PmYYBP{n31(kEd(2~9p9G7)KP=5p>ibx3W^*ILIsKypkp*Tij5!$bVB7ODSj z{6YO`&9f%lo|zWeC1AsX6)yulbNLG(w^NmjdLrDnOs@z=hsp?$E`I{+@i|o_OwjhK z%$A^b86@*cQjJ_f_qWe!ruw-qYyaude@(lbh`6}{2cKs_rWRZQ7@8|f{fiO5Twugf zwMPn;%%uo_QI^wIBk}}@#=UcY!AUOyC{YQ@Y3gX!(bPLp@gzg$(hMT zm_kxB+y*&}n3c}vLjy#~QGNMZ42uXF^@G$TW6pBp#8Wx;ZqF%kwHCNl$3-TivG@wT z`QojB5$>if=6JIfJrs`*Ytf?s>nyO_&q@~PQw=LoBZlgMLzZd+-Ucs*yb&yvD89YX z%^SY(RT|*4{LdFwQo>z*nX3RxW+wR#iTr0sJOuGCBshnvK@&Ie;EGKt++4>Xn& zP&A+{brdU|^yBex)R<@d)@j_v!*SdX4jX;}V;(6P$zfof&74hcqO~Z@0Ti+YkkG1MsBw*|;d5FZrjYrq zGmf2FeXvNp^fZYF0OFS@k#smlJipOIEz^EKHqXQ66e8W9JXWk=q>RXT^Y~E z6%e3|i8pys1+ZUAfoTzCC6)mf*HQJ^Am0KXGT>G;c(x9V-m5XWyE@;Dn*hD$4+;u%cv4RNnwWqMR*9uUzykg0zc_ zNzcC~;9pPIJNUcH_o}JsoAqy#Zf)%R27it>>h;ylmiBuCbbPg2?3B@*RlF$q)K(T{ zePIl(-J_$|2fw^M+W#CBtuKe6g(Rs4yEia0HSRPbbSp5FfwZ4CkXu;N@B-8yh@cDy z3?7+(3?8Bo{wuOBM$t0A~;|VpUQt zUS)N);HL_UfK?4Y4P-PD^1x8bd)V!r^@48pb6pZbk!c|4OsX%NyrgyNR=cN-(CZ?^ zfc+M9w9tV72yslE5D6j=XN+bkFpTGl#f_3PP<0J`!-W-N*u-0kuwO9WC|FqNi-Rn< zQqM=2aWB4}W-dtQ*wc@l;J?_nHpd7o1|V@mTH1&fhKO7zYbP{@AM8RBBbBRB8dzr) zO$Gx%nuK1<@EMrcD7o;|F&I-U2R(?lj&9jd1lcUTACE5@YinSVz^_l^k$DYQ!YcD-m@)p|HOtrvyFjXWX~ zurPq(Mu;GT0Z3#-z&Yh-M`X53j@mt2cFr&&?lHtlR1760*l2MXV@LY`;zDp_a=RL$ z+pPz^CwaRIPOFGRBFe1ELTjSbmbZHm-b@fNLt1a!v)05l& z>T*`0oPr>Z-&gG&tXlGv3C)~$ITlE=@cJ!rYa!ChhJdF#E^*W0!>03rUv8B`>+!P} zTpr7^D~gzw*Ly3cw-#C`fdhbh66TA$8Asu~ZOxpHCF)1lu?$5Hn|L%-qs)cY8hzPuR7vcnNmOuD=h$teTc zq0-TSq-wiNFe-SSvJ&Zh-U1ZZTLzRZ~RU5$?qB<^tr|l@boF z?9B61S5F+Z^88=Tq|c@3)ghVHHfO_`J8)zx_?~gC2CJx`HTYwQ?#|aGY%*x~?9g^+ zKsG-nBM1?stw0S%6*WhyhrjQTUw(%?HoF>-1QeCg({j4g_;;J`p-%U(R7f~PH0+L^ zdSp^G*MUl>U=cH~le#hq-f%j(+=k$eZ?cA& zxc+=h#Sr&4d^cPYv-o?Q$QKFJ5gla{;IEzG;H=;4ARirQ0V(xV6Q&3#vV=^qghUdk zkw1$mg+!)k)o?pj`lSq>mV9y&+rjfwa)(9YrkmT9Xb=|o6@+Ts*HDZ|AWI>`fRd3F z%>cpWEd;Ry4|T(OPD;zywuRG^QX?v@giCxyBLq3TQB&DeNA(BOe0U9GoLAt5El^I8 zEzKDW^}1A@LzY95jU>tX%>~A&U)7chtScPCQU5hrLSeLx!pva1j*V1(R0AroA$GMaU|iG zB$8%HNGF#~^epD5t7d8ZDM?Dv@6FP?{%~|rTDxU@VHPSxr_IQ+QP?GDa;`F(9Gy%X z2c^<2Do0I&PgYl>@@#F{@ir2?ePa(nW$bu4BrD%`rk+>xKrj=4T;RM|RH ztiRB>ea^@U0(R8P6faJVS!$HizH5t4U@!XfFsclST$ElU9kkBNIh6(R{n2K5DiVIY2R%Zx!eoxGa~)c^Y`Y%SF;`A$S|}G>dFn z*zGtP4=+~x$;YH0*{JIgq)tYTw#&9)fukP4H@W*(958Ux=!&Lcf*a`AExuY=>#N

D1$}KwM!C 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%0D$g!E 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 diff --git a/examples/simple_script_vendored/vendor/cache/rexml-3.3.6.gem b/examples/simple_script_vendored/vendor/cache/rexml-3.3.6.gem new file mode 100644 index 0000000000000000000000000000000000000000..bf6b6fdb8fc64704f63b5b15aad117428bab6abd GIT binary patch literal 104448 zcmeFYLy#{_5a8M7YumPM>$Pp$wr$(C{o1x|+jjpO`_1lQHs-RYiQU6y9jYoaDkBT= ztB9;DTT>T96GIn6dUG$J|6RiPpRlsB0{xHrKlxv4CU#b4ASPCJb|yAP4i;7xAVww@ zRyJlJLdO4H4*lQlx;ncUI{oL8yM?K#&Hr8TzqJ3K^#9k~{^#WWm*M|k?Gi*o0UgDS znt_1csB703vm^SQsn0(($qT0JsG%uU_vBPmb#@_8C~3E95gC*3$2L~-#f|@b#u259 z5H`r)h-8C}{G1x|9yRhEQAQ2g$4tdX&I*8zJyTRHxoiPp@C;zV)Pjsy{S^VVr3(hd zl-A&WSgh}%gc^dqF#Tfwp|>C%%4KJ}C~yZkZCD&F6GHtd(gi2p=3b^B52X%~6!}Ep z#GLjR0i*hOQdVFjgT-5o_NQlgF?tCS2TfZ zJ@b;T)lwDHN(E{W$Yat`;_yK!5?#>!D!tY)jhbc7Lj*|Z{r%WEJ#s@aj$Q_|f7s%z zfw$(d+v5w^e6sf>xJ0uZXc1XP_QVAOW$tVZ4?)+5(3)XAa|&2Clfo<#OI(1MLBp}I za4R@(WoIior@69wCVDV?C#thV8=zb64v8t*?npR8CCmO8E_Zm0Mix}+kK>AD`6H#nSsgU%#(kxTEB@5! z9OW%>T`Nc_wOW_F6IDVpO^P6!*F)M@dOqQN0W%1T{cO{;N&p_eyoHB0T3O4niF=u^t5$j z+!D7dd0HV@3!Ew7=o=}C)=e#R$y_W*XCWgON>3-EMjrliIj`#9`P7SZK@?Syqk<5; z?N4pPawj=Pd^c;5_<_`vX+6~-(@U2GN%rUz=!0dB=Z{k#CZ3|O<-d!lUyfi8qoNf* zQ#cW)?g$*-&))~og{}v=y3EQv`j#RXIIL883;u$`W@OFLhX3EqjsKJV{}J&2HU6_O z{#V%kSN^kbF#Z4h|KGj$|HJuE(kPF}45kPDv&uwSu5 zljD#XuAp_Kb+?s&m~uIx%+ZD z?*pzH7#w;oWM2XN-;OFBuYldqHD^RYUCuxnaXW__vBWKm;{MFiuve1T7GSUvR?pf762znf>9j~iLR z>+YtD!y5=R0N?J8;O+*0Wn}lKn&Zy>_0_)$7KrE-A#NnQr_Fmz;rhKG&Q^7CWq82) z!R_sSW$xY?aI%}-bEFTQy5>CwSYNdkmF?c*=iT*w`I&hw^mzNZ-x*l21NUxjc7MK{ zdEMRG$t?>wEtG5oyzP7&J3c?XW^D_|ZZ87X!t5pD>Z_n-?+*TW3i+$ao z%|p+7DPu_7x#`~=r0@7&3lsc9@UNB5km&k-!iO1{nw)*zy2&q)enO!H#`Splad@LM zg4q%9`h7h2xO@M8sC&QIH#n;R35a(?_=S)9KJV~wb`TZy@^8_`;Mp46T4oFYf*G)W z|9Sjgz+bSk|MhsgzyIz!>Iwc1ot%U017ZRiv#sb95#?JiuLIGAhxZpN_zPO(sr&W# zM9(WA%8Xq4FA+>auu**str)Wf5{#Gqlk(Nw->dm;>Gr2u*T*|R!Eb|SQx|b7+*?A! zAU^xs6tFfq;C;#L1krF2Gw`y1x4Xz%QbM1)Yk2E%CtZuEXu|e`z*w;-C@u zQvbcV`*B+Cz7?>-8F}(QldNvd%J}7>naaI;`b~e&MgiQ)YE(|oM4p^FIm@z&Lee&g zUs)C}A?2U)cM3tV2pMDjw7p_Y%|!NC=dkPK=oFM8`Uhg&VdFoG`SW7$^TO*Nlw#~a zzquX%5y@&XcpUP?I}bN87zmE7xb7!9T@ezM4a{(3+R6mDLY zJAWMoP9t&2Hlk>AgECtL^16{Isy;xBsoQd%-wvt-$UT1>(jlwEuOrL-;kzG1KyS>? z63Ej`kx$sUJ%z##dMWUR?F)o6kfMwMeH(<+A>`QL#V5r2lMDRjx(&AzaUqBYS`3=0 z1Y4;NzsWQo!8-Bt@EQvxVJEL0ivDv`(r|5mhez;5`@^l~RKy6OJnCAf9058I1aUu! zGa6)dFl%(UD;~kHs8Wo3v|!l^^B}0n)$0^SP|{$M#9lYh*V=G_)L|7f?&c&~=a)yD zd=}m%IQ#NKLWLlEd!LD3&vJdf(GMC7$nhF3KAVIdk=+lrl?;LE*%Nxq5whnsh(^|M zZTUuE7Lzd6z+y}kiB_IEjbDiwNX0%ykW!Q!L<Ct5CRz&Xhe_FBd{DD0eyS*Y9OU*8(!p&f&~l#!<_bw>KR1p0WO+J3yIH$-e-{r zzIvT+Oy(!O>ZzJ_L^DrxT>Ey$$V52tiAYM(W4HA}V3F+K7qC2hu?IzYQ;HuH(9^VF zQ{2Gz1-*q#)xr2HfGUG$^y*}A&n;!hqj@AhPd%qYsUVt^4Zez=qV1qL1>%>K+~9Rn6}LfW%gpRKQ)ol zRcyB_QpB6<(njObMk!)nwS=*GIu8v2D+$al*;urI-08oxU3;2Y|i9FH6jM|~6 z;(<7URE#kFE`g29Z6ExaICx?|79n-i`t1d@!ynvMan1*Rw30^@C}({|mQl+|Ev}!v zIHO^(uhUKLyd2AB=bm>k7C`7OhrbCyj(FvH zYHCugi*(#)IewNcY;w)rPba>$u@SsM3FwlZa)Z^!`g*tcIJ7lxWR^gp7Ve$)_45X3 zz2asy%I`$s;lrfguxmYG-J;|$+(k5^tOU-ppL94Ab_-Ue}F_E*saFNA-9t?^??+y$!0u z1SuA*_<;-X*_kmZIUWx%9qw4yXf1C{G=A$HeL1fIhn)BH-}7_lrcDvoQsp1h=TcXh zE2(lv8>qSuhK6)q#>Cw@q4(?>bCS@pJ@5wYu{%bQx_Wf>p_C`h2q+6VSI>2`AT0_a zcgDS+n(VgGC+5mkJX+@`hxW)I);fci`Tuy8WJH+BMwp~c9x{O?pI$3ZZ>$y(uUYfT zFl;3HXMxN-ust~B7{PYR0{N&wUQLozGsz*{{AJW;xN2_qpP)$1p=j8P%8GoaSWmRd z@~kp%)6*dgc+GfSrCfC|7nb>6Cw9L3|n(^2+=gM_CA!uu4+coYN%R=AX8uW4_ z&@sELDouYvvU;`JT}b{4=O7?`^#gYJNJwmVp+U~<2FR_pTK;Wa=;;(#6XOQ-TAcn9 z-S;3@p2S4`v*GOUa0;R4{OLJ}g?;+K_P5#jV$^w|6qfij zV^^eA!6lrpFa8i}a!|D0xY36Tb}#o~Z#&!3S?wy098=cm6H7V3&k59vQtIxJnf{(z z9$BPuylWaCk*%@jaQC5~XzYlNJEzCOVXTKUaJG(*hp(f15W%km(E7H3u{GrXS$?Ww zV4r*#;&4-N=JdB|x9h4>5?e^X62;=35|kTTg5Rzg`z7Duo1*-oxcuwf68U(_5hx5h zrjBE_6(xr}yp)M>p}#L|L@po-x`f>BZUY85JRa;Gmf{mg$@%7QJJlFkEbb56nM+q7 zU;#8JzrLJ8A;L>1y^bV{&wUq;!2eOTx_d_lT+c6TU*Y z>mgUJlXb^76V!qU4F^!)SBUeAIsTYKnx&m}Uvu~jdG+#=5b0oCJy-4wLLg)q&2eM# zu7eA?1@XHq1Ac$@`djaDJPOJz5y(nC^BR?W(v+ea*g;={qG(DlQLHM%{myr~;}MN{0A%c{I1gH*tjm4^4i+|lhe^R%HC=kH9o;W>1}LW$XW zA)g^6BWM2A8^q5%+1_-jyxk5iKrS+Ir#kK?ZM4^&rw$*4~1mmR|%$fxS!)@Bf2-w;xIXm zblBjC0jNLkHHTn!{P5TV5ZqH8N58Czh3qR}9K6d0@$*V}Vtr;t7A3SAc=XY934uO+ z`(Sat2RdD$C{2q-x^{)kz>_3wx1oTe+b}q!XaR7}{`U`$e12^$JyWWmn-{_MzQOtI zfRbrxXxV9X-yQaeT&?GE{Sl4+b$qb3{W-k+(xd=7=>%2s(}&kCNcC9kcAzbr*3GCB z50jmm(-_BjWyaS)ZFBuXfU{?;7!jhd5rUonUNR0Qi+^U*7W^YN5y z#Pdfy2k`n3=HDz#x!kmcW*P=eNX_p94D7SGL98CTDd-#?%N%=&N^s82yn-WKY(@(P zaC!;U{`TM#+)u|pFGPv90*$3_wHQA4LO_6nyCWLY63y6LcVGW~?x7EG#)dkH8qMiK zn{@nlK68gKLotm&Jm3OC2MU-syRa6l6h(W^-rG*0P9*T6yQq0t%Inu9=v+zW0s4Z> zh1F?|P-v=wnAhWPB@QSDy#Bf{u&A>2KEK~JK1Kk@uL}&&X$k93IppIRY4w)0y#f)z zXfap{n)5Bzwvfo-Ji-w3r{6i;tl=Oy3+AftB1beJkv>d5n(5x{SZO`uwUcyHkKSg> zNr?u8N?RS{6td|z%aLxT-HrLWsCegIEEnff98Bjr{HP+uT2#xk*??EqqivDFW$+1M z{FysU>z^&t*9!C)>f>))Pum?r+mjkUDk(k5iV>*++)<1;XuP|CaY{vqjo8a7(o1X6u|8(OckOuaKN0b`hJBWHckNhmc<_Az*Z%Y|hC z85zw03YCy;2Vh||fidHN4%!Oi+V8xuyt3Xx9zE=OrVwZFaiL+V#ruFPA>F^GzHje0 zzpcw$Vl4cO8)`vh^-w8I1m$iRa$k3^&rpDv=%)qhpv=Tbxb=y$GuRp6l?ggeKlttTx*ImXCwgzM|Tl_tkT+$SK8L7Pq3&yz4{qOFilf_684 zRJ{7Uctax7m7KDJ8>+J{PH_bz<_4KFT4z_iqE)H3aD)i{b3VzJeltj!(_|@T>apRx z5g3Z&J&?iYjbxV~PObKW*%II*e5T15fx=oRdkYrZ20Diq@#_kSuO&fnTf+tv2Z`nR z7ae4-)PxWd)WqvtTn1vnS=|y4!u34Oj2-yN@XdrckZWe^_-9xZ7MA0hizLI^<1o^W zw>5E8s{PIn46l1tGZ}e9&$gC)I!L4edyGJb5hr|yc4-<}Q*sgvE=AVLMWSCJlVsCwh)`bP zsSC6r8MIzvfC;o7XFNIPuzpseoZhaEcRmZF4wM~!YtOdg!rur{fr$k}^xrhqdvDC@e7w&=TV@^>jECM=QHX{kb_UU|2CdSGYkH=Psl4@gs zxxs<$;Ge-D5E|llsgqa^myxD(;8}jNoU^6PM<5X?>kp&Wd z(+VFTrLXxGQ7LeE>oqraRz>Xuv#EmNcCWSQ$|FvBp5yWl{l(z0~h?5_r(eQ?9 z(B**1ZD<$9dY2Q>0oh>(!(r9g1o82JlUnc^@Q7d%3xZdIbzirC$7qP_HBeQQSS<#g zrU#G0g%3-rgds8^&fQtG)-@`?;2S%c1kZSJ)f4!S=H8bqcM-$0z<8ji$$Em*(r;O* z7+U9bOX>D0q!VJP+aMBAu46;J@bkr`u1y$K$oQWSf>tC&{$bDD$qaL$a}+Hme<_$> zLD!dzcrTS*V3hvmxEO+OI55yBczU8uxc zV2I<#aBM%ZIugOoZ-l8im00HxMv0(?*zNl}l$yhn@CPy=x%-N^WKAVIEN?|BW#1U& zGzu8Ww#p9dwD=JTVKoU2hm;Si~RbMxhdsJYAusxSD1Ue^y9DRXT1UlM|+!iqMSB53Yp4mEB?6rdmj))DMq!LDn7ZN(~*c%9O z{L#gy9jAK^@O9}1?!Xbk9%x^nVjOLGn)!mSqap#HDQ1Xw!_FP82KJJdJKG!X&_M59 z?r@nuQR*&rF2L$9X0ZHiiYvNATvrN~T$Kzpt_MHbNvOrF;^>Puq^vTVUtsORUcUCs?LXXb|p zlew2&9eBuEv_~cFn1-^nYm#sETiOyY;68QYESsP#Z}Hj_dD@R+-#guO$PE@XMoFex zSmKJ=fHNg}aG6Su=V=pMN+tzEX=*Gump6tq`j+ryy2<(92iMP<&Cv9%;<7;Awn7J)f|QgQ2D-R*KCp#F%5T0@agVuG~v zizQWmakssjuMQQFHmBg25+YYQAH2ns;d{&&8+<@(;0VpzA<^YPRtk#iR8m@)aissq z2*c-OZ_g$$pqh=plcFff;<+Y$DRrTv?^*bles>IGj&d@zjMGIwX>!4T; z?Fp!}&Sn%vHi|QYF+J+C_BrOxta7{(l%_ha)!IeLb9JZuH9N>q7CCZ5Okj&XmsAb} zK?3Z8+kp>7oO=`W{9w8V1BU()0tT+e_2@` zF+hHvIVp{ouRP`h@%XM_)IE-V@WD$Hr~v2EOlZ~YVM2$9Cuo^>!KP;mI)`XytMmSo z7VJ%jBmJJ5=A}!qetD2M8B6vx8Sl5}#3X}3@ZHF-S!9ju;cts%NSM_f*z-SM_y?o>qovi zCt6ySE{l|8D$d$v=K|b}MUz8rt!_t-@@0J!#Thl1XCM%;Av*Lr@w0EDwXEo$Nr-6f z5p{M5u>zwUm=(ooLj`F|_L}Hq>;eStYKZnVIf3+4P%1DfFeh*zD^B43Rr|x>!a`z3Wb(P#p6l9ani2nNZ^U_7F1r zbF5*-eMkNt(zm`Ue#)$2awy5hh+~Tg+R+pRBu$snYi2*ps~9hE^r#ZsgVb8Yeai%5 zAFqV9a;)Qr@f@=hP_Gk6CvxjD?1@rQ3cid&Io=FyD@K$O55^&Rd=j!zX1JXTro zBn@H4}kI8FEG`v^COC zdO=2caqbQC&geV=2eIv29;Zj$Hx;G|E(VL~Gwnk>yL;d}`Tk8r@qbx{);?jk?Et~@>ZnF%FpQWiDmMdGv+|yXwQo{$nT!0#A&Xq7 zjGW*6&KaUz$l*K=!r;WYAanpz?w%rbMQmRmgEBf`GR+JYgTn4!y+DM)4iXf@14>{m zoQHEeSQ%bv!N|^)AkSDg*?uP`aLKfn%{2Xd&WA-3+vX5OdAU1L%#qq540e<1TrQRL zpaWd;;|wi(@%a%pNlQlP7S+%>OiCYnoV@lF01GZ7X}BOClZ}VRYsq*;!L>2Mu=J&b z^H}OxN{!e|Zwkxppd|L=BlMGU7RQInIxASu-xnR!2zy5gFG?s%NMCjK_A3g|e|Zc{ z1423UU*)cje9wpH|FQe^R|E*C!M)nc-HIFY$58Y+@H&B}as(YIOl;mwwF>{e0*jJj zT7^-1^W{&}L$)3f=xm0XcFLL^f;VM;itaJ3?fTAxEwVTGH* zdq%}EezI&C3TH5<$ivodAb013DRc;2xY`hc5Gl8zP$lW9H4=V(#fn&v;3X~uMDJ** zRRif)1WE3hYJfX~Xz_<4{lSu|olc72rE&>gU z$sG4=m0c*-1dFrYXQSVJqqEOOh(%Pk(j?@#I|28s zbd7_|tTAl}OfB?^N0V6jOAv(EgC`Vd5_{u{*GC!mwex`@Q-{CK<@svi;Z|D_ZfwW@ zkleVL;H6rd4IOzyXOz5jdPf!0I2#re!&(#m6eNqv=S;A@tNmaxy_lkCZrObWt`aA zQgcM6ZE6(OL+bK!L=F0uPeocYNIQ;{gq89iY2{WER4E;FhE}14>TFJ5|6u4p+y8EG7MS!;0mJ1n z?TY3|3F|znafy@20FLc|(idMCx)eGk!~%Jy-^&}iNe25YLbFBU^3+X6`GqorE+&(a@0{)~p5 z3;kVy13@^_P$;cP;8t}=vh&15KelBuRkTvqJAc@dr1H&$4*%#8@Z0gwnkhl?dQpyM z4^}w7%Xg}*zS1Zu>Nod+Y0*-@e}XRiFYhPn;xxnL>bnSUU*x%3O4Rv03`$0bnbuBm zs(a^tfk%H*zPmUMKU)8I;;48W>lJ6~9C)%2WOrp%z`0>KnySK3#hSM7-??x-_H$G- zh@6Jx!e>0SV(!dkE{>XhMQCzlJ}%8WfAWR@*)Fe*xN(llguuk`H-)9J#_tdLmXC2Bk(rpyXD*8== zR=x}f$uy4;vNo%>=0%trv)`P30AlFPH6}y=< z6Ctx30Hg7t;WxubrM#GTX{OfE`Q$)~Qg?OUM8#L`Gp(E^&P7$C0{fu%z)$Evsuwte z!a+?uD8KC#Z4`&=k_|Pluo8x7y(F&XhWEzPL^k*#35Aonw~!jk>kKT%)CDGNTDja6 z3uQNW9MHth(LYUAn+^;43AMrn_+|+!ecSW%ppEW-7D{<%YHU0|we@ap&j3l3l9_aD zKQa7yqdM~9f7Q>?7OsP2a>@*kK;OQA8GtTagr6yJ5wI z-w4;BGOT4M^e77+tR_+?&2g?_KUlX^4iFZWG|e>-iZ3_UAZzfyX4V}Q(I(!!Zb0~4*g)LbOt{O(nJrYO`y%L6MIkjhD<6ll`CJD1htPXi_^Gt~( zwpwSmlT%~o*0cnkCFY{HiPM;;PO-Zh$1EMo65YwiDlq1ALzsp?`LvILQS8qn(T~f` zG}H{ua`lzX*4Q70oNEbn%1L$5e=-p`n z6D16luH}E04a0th<-kZJE1Gcmu#kc?U1aVChn0`%Xz(e~+tsK`LX*gI(Y3tdkF@!bu%~7f6PlW~RAX=PcuF z%7yD)MasDw43aCx{H%yS5F6WmJSMrhRW5IHZNjR;r(1a>_9UKAcfFSe}kX5DLT@m93$gG(8{$i{MaAt}J|V z@QR|b#BnA-^x(VPxE3a7H^E~1H!YU`=uWY@&lIX07^)qdY9p2xD|4h2WzOicvaBYu zEGI8YgyV(zNdF>3mKktl2kmsjh>Gc88{PX4bSBIRD-gv%k8?;Py=)@C7>bnhm|paYnRF5khdI$4TnYy-FElIt z5kl@B^(jiOkiVdrO2&__*3mc>BAwK=au~po8wib*0B3GDQiy1tRB3dQp#)QmZJuuD zek!|*AJl?}@<|6JCh1s7FKo2C+zT6~{v=lQXV!(&)re~1be1dUQHgDN{C>Ttc1YLr zq|TKU>}kL8HH9&wb%mv1@x+C!Z#NOd*{S`zi?s3r`7L0`+ax$SKE>$Tvxn>0M2y`y(yLtrnj5%~HkcP!Irboj__io2uc7X{tJ*pw!Ie=JdN+P{kPOIk$t!}A?Lp7H5`#3w3a@|5O92@Ql z*hQAFonVJ_aK_r4l>eK^|EF;NL}w>odg(>iM{#!-5gX_2T&>lJ+1qh~>aXppRPt7P z;~XU??2Epr98gwYXa_)_H2)vd_T`B0yMdcXbwt^RO4F#vbGW8-6D72i6Kx>B6GNak zJVot`R&OJ=oOz9zLlpTsLuzN3vMe!il;C255sDN(>zX2z;i~61G!YCVEWB#s1$tFy zmZy_G-;`Eu+Lp>1;dG>?z%rLDWm92ihgdPdIn6o~K48+|8CoTwZWRkEu_jYztHRa#~P+OFHrf4_GD_laCg zR_K{sntP`(nv37APABy9xr6o0@JiOzr}^d@QbP&TcW9^3PN-`Ltbw}0VC`_#s<^GY7Ez^d_jLtp~o zxoys!Dz@Imf)Je1_q|Hb?sg`Pb~-daBhg2}gKUz4f@NDM33+W6jX(#=lyT|(6HnjB zq8sd{VacQ%vbG178y|UbVGY^$dQ=YKj=RKn#0txpU+?Lg!Rn+LzOQ;IX{T-r?7Z}K z>&IJ+$qG~O<9>qwVqo+WB5`J{3&b-gyt&$8PMwk(@>?pE$~h%vdg~T4KyVH>C|%QM z9@%dH14()_r2EVM@YB}Xy8LZ_vwHdVg`iLQJGAxg)>ab($va!)0?F()^6J?0de7@U z5Nnz$zb<;IM~^+LNgXYPp|7cixT8c|W!k%soE19Fs4Tzc9$^mN!PDAnT(K`s?YwBVz~v!y0yJZZyoWz(|94Z$z)!R5># zn`k_mIaXG`9(=}6$KN)cPoxbHM5B@v??P5&QnKZ~Unwnq_PKFEJZU~oxOFJjX zu#P~}vKd|qSvb{zEg4p#zB3FWlc+;^t}{Cw184k+F~Ti7l~PmnTp=rZu5~1b)tw<| z5~TbFQfOSQu8b8;K0L3AaQ4`Iu>68a7hJB%#mTk^uUkzD87ZR1lm%JU1b)!Tofdjx zi^y=bXA{zo!qJlYr^ zq5Ni~7bl>79CUlVUnE3M?1BcxRYt7D3-ihTZO+qVI&KLoIs*RrOT{Q5h2`3A`Ev-#m*Yoc@X>%X?&b5Y~SOq$g@ zG2k|4XiTgRp88@+fGk_A;e>pMoZ!Il>Pzo)LWj*)I}L>TYhu0+e1idbd(YgdrGqG5 zHj`(?)7#sLzKMV46B<<8z;4NRn405AGsQA`YKd(Yerl@37&pCCGKnzhT~e3Kmfzd^ zQj*x-qs6ahdvc7Skg}-^izHSV18^fNt*|eR6f31OddM>GB}*6l84)`dhuwDbiM}e~ zTFsEBx(UVV^0;gE?k--xo9n6tH{8jy>$SdecL}@eeTkq~QI5xX^3>+HKa=*#^HVVX z$GW5vnv&PgXs<18LK8NIeLpdj9EwpjXJjH3g_e=I;lAz9!D`ON%H^%yC*PY@7xCoI68-KDX?I51Y_cPT(*DcsxTU$dZ_^{)P-$&WHK2g*xPf&ic z)bz^Fv6JJ`Ou)+I^{;3idlAIy>~Rd)t;!3HAxX?U90mLoGs#BU*rczDow1H}cjoe< z+cgW-?IMuM`7!MMng9x31NsAF2*W*3K;{fn8~qwrHPa{M4Z(3*J@&G-)v;&0dffnd zC>_B(3##q+T1GJZ{<(pk+F=~%;11WjX(^#O6BCEKui%(ECz)pk50;)1spO5bi4k9r zPH~-TagMsdzFCgA7ZmjEH{q9PkCKqhX6dEE5$}X}NOn z54b%KX&u9?lF?H_6c1fIBLL#ZtGn`vjC*9loFL=FFlDkhJnjNjAK;_e91E#kq1fXE zn4vl3G0;ZPgT63t!L$!KNy;5ucB`vX%%kev&W5yj%@3G*M_AtSh|JxQmg#4D8M94b zy|oBId3I}EJqevNrcJ!}9)u;QjRK#zJR0RHo5sZxJ6Ky4wVbv~5&vB?$zb=uaAKrE z0vXlKS<*R+rMox%h&gb$je;A8Ge&`shWQOqo&&zu!F1HbcB#pOka`b33vif4&lP)X zGJJPpv+=)HHOD`F+ed92Z%>jlyPAOQK-s$spC-pt7pSr_T7ab~@|t}}_ceE(pq@+4 zzXJiR5#cv(QhM+LSZFsL4d?#?Zd~pzY2H^Naaqc$oQf1|3+3c_&1p}Ao%8lO1uwZk z!^HE>IalFR7JVi67uZ*aPk66<<~P^gv+WjZZvr7mn0pT^+4rK)0Z-|E4sDt@1M(H> zZ1l%5-B4*o?OUyyuHh@Sy2G7!+kr8M@3?lfiqOSjED&B`+5(<(1okAz_Bl*$qfdje zWFPeOK4;tmYUL|hI~qmx57~zYRxN~8ixcAGX(+Wb_6B7Xs(Cm6hMo8PfV{I zZJ_>W{?<_f;7irV8GL2UL5!Q5yt&n9W?!(T=AO$ zPgcOQU%Jurtl|4fJgk@8DYCl<1w?`U2JIE*4<1od%9v4&7i+iUQlqe~gPOjppZEpe zH>3VbZk+au)jRiNaldwLYRGTDu39&80PnA{^!KBASpRWtF_JSS2s_+P(0}ap-HPuY zCU*NSJ3>QVQQ`rAb~P|0oVFBoA1P?|r$!%NiM#be)}rrBwrdrYxnq(NkEjrJ>=aYA zd6f!hEj7$ST=8*fQHBcehhWCB_RYedx%IR866-O(4Hi6XTkYr%J>==bv2`30Vd#wp zXgev_+WzE71{Spa3BKQ3coUu~;`v-P2eo?SzD3>7CoMnR+*^6^&;C&_ufw;1$td_u zS6@~7^tZk7{@PPt`SmEal#=Kl8j-0r+V1k;i@JSmg~iZu35!-?#KEQ%;r`p-xYe*b zqHCTQnHVIkik>T0*A$_;uTJ0F6k52>)32s;=9Q%u7VQlgtz&B>{Q%eSSljC?wb#V> zU#ovT76eO%KaV9JKk zKyX|8{RVHDwUD#u(I=Vhr%Uoih9FlJ^?9(lTEe9wiS5(;%(($ikQzIPP$MP1Eetd;^slIrmHKa zECiwWu|H7%J(J4!a(il#LL#Pxz%yWzJ?)R^eIyyUg5z-ak1`(dBxhU>_}=`B+3Z?` zOx4y#8?TW?@(L}+l|KIO+&!~j!*2_JH6|qK!Afyk-BUV+eUGwtfuiiYT!?9UEl}o0 z?(A)7r$=Y_{1TWUm~Z+|NY4_yeMwlC_N2A^s^z)#Zu#qP{Yb;BvN|=1o9)uQfkVJy z(1w}m;^ZSlN1+K*_xkjVi>IOx$p2A*!+&jFy)^pTWEBeqGA1=a#ud|Km?y|BpE?JQUOgh!#UXai<=`$?hz&GyW_ipxQPz z6UC<^HgT)l7O*f0`zJk|ni9_KdOqh1?+XZII+^$-^}*v=RoMqszU}$@dH8%0&7RV zR4zg!t0%CjP^!6&QI>V-x^^1-p4B({Eg~|j$J=oob))|SOj$_664oP%n?<531>&2q zk+!+b?bjkbbIWhpBO`qH(hrHH`KgSvtc-PAv&hbjV(;3KOS$bMAd!cq^&6^@4e=Djcif^P zyl9f|sMHK!;Vq(~bBr*L>-5raGl!1)3b%-li#HMP!Kl7d6^?Cn#(eDvM12$KLJmI3YT9lXIe;_rC4STm(sQ+G0e= zgQhFN_3&a7m+J1J$SL25DG{|3Nx~s#!?J203tJ)#uyXoYT4>p1x#LuqjXOCnFeZ*g zG?)!j8E1{RLRzzKAMYR^+M30v1rXHnWG?c{xP|7*5{v9{pr_SBgzMWo*7QS<{ znp0+GyPm672pbsQ;7F6L{w=Fw%TZS@Iekh}y0mPxd$YvMJ^UNe5^>+; zbL+7_AgfpN#8p|g**?$EZ2XAzjbtV+X176Qo}!TL0Ve;#F_Gy(1`R@!QI29q*m>?1 z+NjAh##L3lG9|pe+JsB>F0%Q#>@>M@`-X^xBWM2XfjQ*hG>gvA9AROzC}d`i01kopM9OOkL4*_*k!gnmfi z56jenLbxQ#m;qLB^ZoVx_?g-AKN^Rez~!AU>Z|!)vnxJG|L@xjzvg$|FJS8U7pZT7 zE$~pIiJ*;f0J|f3PQQT7gY$NGMOf8o-xZXi9mRwJ!sLCyQ-hN9Q*T_6v0(7hL#TjZ z6t(+YjM(9q?bRTZBCNOFg$W!o!H=*Rn5_^CnqXh={{U7%slSW|gFA8Uc(9ZNGpBFA zy>_B;;MT082LLZzc>_A2$9FekLy21)xuL{E-KNzTa)o;&8+Go4KSFXl*sy;M zOxcK{EeUL63BFU43IM%;-^Fd0MG;u>E^r4P7_JVkB`OsRDRpn1YcQBX0rnAC3SkJP z`OZ~D|H8);mB{5D8pRmrOzehvs5g$>eikcI9jF`wq|hG+Jx))7LUQd4?-Ff$@^s&Y zH*hPT=uXWh!25i16-A?PeQD|D=B9bG9QLk!e-Ji%{`C^-O{(C7`k-UoaU`aqU$;NO6C7A}Bb zgBVLX0c!*GiW-AK2-fJGPRBv^D+mJHFE>|Uf>69-1>@rIr9X~ycl6_g8+9z(yW;D< zfjT`0#{^$IT=It7%4?vt?sN|X@x}!>BOJiGNtugBUZndGgv03$T${B>s>V3*YNS+< zmGQ;9?+^Ey_&paZTcZ zg9|hs6680e>2F6=fCEz0n>f3Vb-Qw6q^_@%4Em_uL*@{-*0e?vN?O;|d@GCS0Ucfa zZSMfs{^9w5(6zT#E1r+n*}6mE>09m;DmEn;q}f20K(`jr&@v)a#Y^w2N+Y3!(*a>6`1OkWkyId#Ap(R=Vx0ubK;u)sGCAh4 zWVK3VKq$9aQu`V#$>u14sSmg*?FObuh=e2EPyGVARk~97MK?a{QwR7v@IJUWNPQFp zsB%dMI$_QRZ2@ydNTn*tc@Ooed?rJ1n>b=Z1}0KjGp!5Cc}X(OEpLEUr`W0Hj{v5RV86AYxpkNmXG;pvOP7>-Lp% zD})N{6pP;@hN>Eyg^TOnoe^#~{gbUSigo$tg-bRmgpgaNXlx_dhs_$1$E5+0nTQWlmR-+|gPp&>%k zx6&BQH>C%L(04DA298I?f&URs&McM0P1y=N2Ii#^6-paYy+t?U0xk6A1NJti%YWJ( z0xAJcfuB#XuMIG9*W-t$V8);VY9z)?e#`2hg{){)jfr)P!zXn4m=q1OP))c#3`Ech zBR7ahhJjr?1BUUy9}m5MjY$~d0aTgiaRW*g4SGpT)UtuHH2Vv3q-qYm(+#15(qj=V z*btOn0HR~yGVe?8FR&5W)05tth3Ci@4K%tN(bypmvHk&MX&R;QI~}pDR8Fk4b*HHK zw{0y6Ybe*$6$q3j2qCWT&d|o&6t#^%?Hs&1{`K81Xc&L1rru`EQCw$%O2F$g1P5if za1;K+2iDu{3FbIe3~!Q`lU3EmrwaYl`JR$}qy-TY-JzjQ{S))f0JL5RBV3hRT#%in z`G>+Eupl+33t>By4a06iLdTpJ3UFe+vVdbb?nc#M5CQ$|ZKgpsr<+pq;bQ0xE*1@_ zx&(+Ivc*`90S)vkb3O4z)h!_a1h--f>p^NY%MlCYPs$oxVT`>{u+CNGeOzV2h)qM8eEhM1v( z0 zE{aC+I_Qc~!vkq;IHS?P>ye&A{=L{bovl*kL@C_dUiM^x3Efgz8saWls%&GUv3qbV z*AN?jYBXT(X*9Ns2VEyn4^+v?3QP`Mg`<*z9?3vY$w0421|;HjF}GnqSrja{O+B5S zQGGxnW>cT})Ypva7jg=FP-nB{H1iFT?Ua|{Bj;}5JAG+?TYi}+aLHaGM?@WL21=EL z!&o_kMPOJi%6TUhqcnlI59l4GC+r}_&Pbh)AKa}|Yg5u{=(bic}!weF+ zmws@!S?j@1z_g}?=Ja0BWM>`-+>P6PKuGLL*sP5lSh9DW-iI=+zZ?aMi*%UJaiwH!)T=MY1a(V#qN*coh5>B1$N(9<&hxL zoda{1CwEdc?@nHVg1b;RS|nqhfdc8R6}8%gnHim>xONQUR8n1nC)b^U1uwbkRRE;* zn>L)ZW$O+G-Y5i;&ZDy&-jcU`0m#?KY1a+oO;*>)BBeD7fcfQ$eDky~3;)5|Pra?n zda?=lKW-+g{n*TU=1o5d_r-MfhQ?_>7jW;H{`t;;e@W*{jRqf*K3$#1aW*oeFc2G_vBwGZmi zT^K}neVCv3B4^+^xDSRUxUe$@^nQj>=&q#a5@)THRQp zuk>&fcs+M(xz%j7HkSAYAV>a#Y&^AY&qVZRCkXDuJ0J6cWFh%i@wX-{;BW8@MrrIi z&zjGkmBNmuicG}*L3#4U-*6ZHC~|@*6FXF6;%)CIR9ZtDKl%Ng8;F;FbT!2OWxW5} z7=tt&Sg&Qi<`&*~!))k(cf9_cGjzy(yzgAXy7ZsUFq=@zX+o_`MW~FKFq3p|pcM=V z#z`!TYP*5=K^y~Hox9SQE(4~k*_g(@s|<&5zDACHz2=}rg_PwkmRiR07SoVTx{O^t zSsXey;w@$KE5svkZY&Jce%1UUdT|%gC%Xs>*+rbFvFx>s5f9yzXB1x>3tyeLr?7ps z!Iz|hdXC$N0AM~Wzp0fXl7dCZefrEZtaTq88AfU*Pzwv1{kNrgL%uk58jJjLdcs0* zn{h$eb;lc;S1L^)gXzRh(LsWW{omdN?#0V)0@`9TZ$h$M9Yr&d0u_7oGyV#;>=hpA z8Q88&^KbdaSd>zZrviEQ{WK9%3z-L}TEe}QLA4xT(=1e*+!&XagxfEn1<)bKiYGz3 z%xwnCVK+fa>w>lzZ@lnJ@`5|_1tfTKV~Q90NM8wiZjSvUDQ@uNEUHZ_bWPd9Y&6Q_ z)s&o?ghK}UntF2mWD^fX9Tq!%_x8*ip5+jc-UA$avq(5}Jl7cv@CB}Hxq7@b5%ahU z|4)pdHS6gub6mQ_(UCAd21a`nBclS1EYh6}Pj%>0yU}$*w~yn?3aereP@u&Hl2fln z5$RS@Bs^h%KwUqW%o?NY!y*8C7U$TCDd zZ|u_!-GySc4kV}7JV3Be-ZkDluYO-XZv}#3nPibwm?=7xLydPO)@4>&XAZ?E@9HttxY=6b^VJE!BMfoKr zF70>)*bKej-3&j^m?kf^BMSn3L5mTJEnDCK{bXdDmOlbXCgL-Vle{yd98P)xk=R0T z@LITdtwhB#5nL~^B1tdu5-XH+f$}SsjJneU&t1_x1oX@m&qDz&u_DTC>Qu`NSavdr zNul+4a+;RkI6=ZC3UD{ z>P?`d4drP9HT!Kttt+z-Z*)#)L%;^J+B!9zq&mlpOk|PCK_2exB1!S^cQ^3azaZI} z@RTrP<=HhM{TXwldm5rGofs2Xo8h&Z=&B+#=HVO2!-6c|%6Qw>Z`&DfpXj$wGTuJb zZ=Y5&UN;c7e4X*OquxHrs=V5YD_2gEx2#PVYgdk5+k`JNw`z=e0U+T%cG5MKRL(Zc zZ08#V@#C+=!7^iO-3CLoE}TK=7I#S1NQs|aE|h`>ung~Vmg6m!tT1bR8NZA>rz6r- zW9zM3&I;kWou?~L-Dhhp@uP&WnIW56I74IZU5Ovc*e;hsyQIl?3QO3mz^<}WT9b2W5BA+f8(aP}d+PkG=;Q)-)o_1=h(8IE0l>_?{Q8pKW z|GO(KDN@e_F(JG;F^Jfg*m}wiNz4vPgr`e!?No?j;>1cSQc?Cq1}w5gM~{rRP43x? zBIO}VUOOWh>8QdS#b+*=2wpUQ8G*T_86ZPoC$K;kn~@2Lu-#PP?tMwG`mkw}Up}_V zWU(N@098`50637t02Qrk|31xyLdPLK%l1wv9yJa=J(+NS+~jyQ9Z6omOEyiiBhY7K z?u*C?F5Rew2mD^7pSK0{@5O_#nNUqK+3dGbYBHN;IcAUdhw!qQY=y+9pPlBwO0YUX zC1iVoKqLazrF|u=9E{N@YvE8lN0E8M!0u(*Fo?2d4IRIjpm(ycHqJSbG;KIbTUc(R zyR>x;CdWo^X-f)PZ8`~KjBEj;XYt#~g2lyH7NS2ylr2~6Br$%RW>-!K623?2!G5yV zpykPx@Au0(E_iorqS$cEI~T_DLo%{TpKGOHr{{cNJ8L6e7bHnol>4u-$SE|8^RMVA zQnr44y>(Us6mt;7A*iZP&~D~Hume^}nsP$|3YJ*7R7o}**I~goH(X}j@h@(NNtREV zxRyZ`qz1)@B^C%qVcc~$h}Nu70&2=h@xi@gsgSX;x)xcV&nvDjNhk5_oF?%df5s`{ z;)skwE@0!Kq_Ba$UG>xFN)anktxVuZxi+f`NOf~74ezsp!^@!jkfgROct+=RH)SQ@ zfq^|cOmur@jf|7bx(3HhtJ2IY)c_x&G-Wm22didwL+0^6&H5sF&G3-vG*gHlr=wwq zil%+N!a-H?WTSiwiz|-?zm`<08{S=a{XxdCpLv8@=kjI9(j5RG3wS?u@C+Hx&^v$5px_js|wE%uWK6=TFuy1S@R z;uwwE(o(mEMqRfVlfyh|UbWxN*Y0Xks;iyUJE;j4N)3EnFKJ!V+^jr6@{m?sxMJ^^ z(J8F^as$WbSK^1w3#WG4H0UB{>RXtiffJxoaIyxve@<2G&RVfot|EN<9ltFDh)QAj z5nWiFx!tHefy@_OcAnZ_sN}L-{O7Q|EQT&Oh>2`_Zh(e)obJj8OJ80Elk^PRCOUg!$>DqLy1+!XhI%rO zIa=d)o;$!O5t%E83v>s5?*lq+^_4T2>^0?uC|*_0k?n7Xl+d#?LTkb72Q4NCdA&&; z7nEnd>9n*yDXmX_)6QL)R1M!lk{&B0DZZ*`x_vql4e}VzgM8pYgoZwO=o?g@o(?yHdG`uZ7vkD`Z zrPfjQ`XncDgs5#eTN_>B^*3RLUD|@#1;2LiYd?PKqIb}-T!U%hN%U;K=Jmn&npvW- zb(j?M*-5CvRGD9*Z@`cY(wl#hQ$&6TPv-kDk1OJfMOyAHCRA_+;q_Q7U;vp21klc< zREmOi0UdZuGL|P&bmavmjjo;BB!z~)KsPI=dW=ai9A9@~0S1aFXIp)0iqu8>VTe-P z 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

cM^SkB@=EJ$`qnYch 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 cbs`$wGU$KBPW)?*e Date: Fri, 20 Sep 2024 17:50:55 +0000 Subject: [PATCH 22/27] Bump puma from 4.3.12 to 5.6.9 in /examples/simple_rails_api Bumps [puma](https://github.com/puma/puma) from 4.3.12 to 5.6.9. - [Release notes](https://github.com/puma/puma/releases) - [Changelog](https://github.com/puma/puma/blob/master/History.md) - [Commits](https://github.com/puma/puma/compare/v4.3.12...v5.6.9) --- updated-dependencies: - dependency-name: puma dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- examples/simple_rails_api/Gemfile | 2 +- examples/simple_rails_api/Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/simple_rails_api/Gemfile b/examples/simple_rails_api/Gemfile index 3fab5da..179bf18 100644 --- a/examples/simple_rails_api/Gemfile +++ b/examples/simple_rails_api/Gemfile @@ -6,7 +6,7 @@ gem 'rails', '~> 6.0.2' # Use sqlite3 as the database for Active Record gem 'sqlite3', '~> 1.4' # Use Puma as the app server -gem 'puma', '~> 4.3' +gem 'puma', '~> 5.6' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder # gem 'jbuilder', '~> 2.7' # Use Redis adapter to run Action Cable in production diff --git a/examples/simple_rails_api/Gemfile.lock b/examples/simple_rails_api/Gemfile.lock index 9da3cb4..90653a2 100644 --- a/examples/simple_rails_api/Gemfile.lock +++ b/examples/simple_rails_api/Gemfile.lock @@ -82,11 +82,11 @@ GEM mini_portile2 (2.8.0) minitest (5.14.4) msgpack (1.4.2) - nio4r (2.5.8) + nio4r (2.7.3) nokogiri (1.13.4) mini_portile2 (~> 2.8.0) racc (~> 1.4) - puma (4.3.12) + puma (5.6.9) nio4r (~> 2.0) racc (1.6.0) rack (2.2.3) @@ -150,7 +150,7 @@ DEPENDENCIES bootsnap (>= 1.4.2) byebug listen (>= 3.0.5, < 3.2) - puma (~> 4.3) + puma (~> 5.6) rails (~> 6.0.2) spring spring-watcher-listen (~> 2.0.0) From a267759c09ca1af31367fd05f6ae8ba981133723 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Aug 2024 00:58:17 +0000 Subject: [PATCH 23/27] Bump rexml from 3.2.5 to 3.3.3 in /examples/simple_script Bumps [rexml](https://github.com/ruby/rexml) from 3.2.5 to 3.3.3. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.2.5...v3.3.3) --- updated-dependencies: - dependency-name: rexml dependency-type: indirect ... Signed-off-by: dependabot[bot] --- examples/simple_script/Gemfile.lock | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/simple_script/Gemfile.lock b/examples/simple_script/Gemfile.lock index 002c127..9c0f9ef 100644 --- a/examples/simple_script/Gemfile.lock +++ b/examples/simple_script/Gemfile.lock @@ -10,7 +10,8 @@ GEM ast (~> 2.4.1) rainbow (3.0.0) regexp_parser (2.1.1) - rexml (3.2.5) + rexml (3.3.3) + strscan rspec (3.7.0) rspec-core (~> 3.7.0) rspec-expectations (~> 3.7.0) @@ -39,6 +40,7 @@ GEM rubocop-ast (1.11.0) parser (>= 3.0.1.1) ruby-progressbar (1.11.0) + strscan (3.1.0) unicode-display_width (2.1.0) PLATFORMS From 3882649b6a5b686788448b2ae234c745d1f391ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 May 2024 22:01:23 +0000 Subject: [PATCH 24/27] Bump rack from 2.2.3 to 2.2.9 in /examples/simple_rails_api Bumps [rack](https://github.com/rack/rack) from 2.2.3 to 2.2.9. - [Release notes](https://github.com/rack/rack/releases) - [Changelog](https://github.com/rack/rack/blob/main/CHANGELOG.md) - [Commits](https://github.com/rack/rack/compare/2.2.3...v2.2.9) --- updated-dependencies: - dependency-name: rack dependency-type: indirect ... Signed-off-by: dependabot[bot] --- examples/simple_rails_api/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/simple_rails_api/Gemfile.lock b/examples/simple_rails_api/Gemfile.lock index 90653a2..153f4a4 100644 --- a/examples/simple_rails_api/Gemfile.lock +++ b/examples/simple_rails_api/Gemfile.lock @@ -89,7 +89,7 @@ GEM puma (5.6.9) nio4r (~> 2.0) racc (1.6.0) - rack (2.2.3) + rack (2.2.9) rack-test (1.1.0) rack (>= 1.0, < 3) rails (6.0.4.1) From b6d7239452908abe44d085ce90ead801635b395f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Sep 2023 04:42:48 +0000 Subject: [PATCH 25/27] Bump tzinfo from 1.2.9 to 1.2.11 in /examples/simple_rails_api Bumps [tzinfo](https://github.com/tzinfo/tzinfo) from 1.2.9 to 1.2.11. - [Release notes](https://github.com/tzinfo/tzinfo/releases) - [Changelog](https://github.com/tzinfo/tzinfo/blob/master/CHANGES.md) - [Commits](https://github.com/tzinfo/tzinfo/compare/v1.2.9...v1.2.11) --- updated-dependencies: - dependency-name: tzinfo dependency-type: indirect ... Signed-off-by: dependabot[bot] --- examples/simple_rails_api/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/simple_rails_api/Gemfile.lock b/examples/simple_rails_api/Gemfile.lock index 153f4a4..f8db77a 100644 --- a/examples/simple_rails_api/Gemfile.lock +++ b/examples/simple_rails_api/Gemfile.lock @@ -136,7 +136,7 @@ GEM sqlite3 (1.4.2) thor (1.1.0) thread_safe (0.3.6) - tzinfo (1.2.9) + tzinfo (1.2.11) thread_safe (~> 0.1) websocket-driver (0.7.5) websocket-extensions (>= 0.1.0) From 080cdd8e53c7ebcf0236e533858d76cf630a22b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 16:24:50 +0000 Subject: [PATCH 26/27] Bump rails from 6.0.4.1 to 6.1.7.7 in /examples/simple_rails_api Bumps [rails](https://github.com/rails/rails) from 6.0.4.1 to 6.1.7.7. - [Release notes](https://github.com/rails/rails/releases) - [Commits](https://github.com/rails/rails/compare/v6.0.4.1...v6.1.7.7) --- updated-dependencies: - dependency-name: rails dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- examples/simple_rails_api/Gemfile | 2 +- examples/simple_rails_api/Gemfile.lock | 209 ++++++++++++++----------- 2 files changed, 115 insertions(+), 96 deletions(-) diff --git a/examples/simple_rails_api/Gemfile b/examples/simple_rails_api/Gemfile index 179bf18..385b769 100644 --- a/examples/simple_rails_api/Gemfile +++ b/examples/simple_rails_api/Gemfile @@ -2,7 +2,7 @@ source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '~> 6.0.2' +gem 'rails', '~> 6.1.7' # Use sqlite3 as the database for Active Record gem 'sqlite3', '~> 1.4' # Use Puma as the app server diff --git a/examples/simple_rails_api/Gemfile.lock b/examples/simple_rails_api/Gemfile.lock index f8db77a..1a98bb7 100644 --- a/examples/simple_rails_api/Gemfile.lock +++ b/examples/simple_rails_api/Gemfile.lock @@ -1,124 +1,143 @@ GEM remote: https://rubygems.org/ specs: - actioncable (6.0.4.1) - actionpack (= 6.0.4.1) + actioncable (6.1.7.7) + actionpack (= 6.1.7.7) + activesupport (= 6.1.7.7) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.0.4.1) - actionpack (= 6.0.4.1) - activejob (= 6.0.4.1) - activerecord (= 6.0.4.1) - activestorage (= 6.0.4.1) - activesupport (= 6.0.4.1) + actionmailbox (6.1.7.7) + actionpack (= 6.1.7.7) + activejob (= 6.1.7.7) + activerecord (= 6.1.7.7) + activestorage (= 6.1.7.7) + activesupport (= 6.1.7.7) mail (>= 2.7.1) - actionmailer (6.0.4.1) - actionpack (= 6.0.4.1) - actionview (= 6.0.4.1) - activejob (= 6.0.4.1) + actionmailer (6.1.7.7) + actionpack (= 6.1.7.7) + actionview (= 6.1.7.7) + activejob (= 6.1.7.7) + activesupport (= 6.1.7.7) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.0.4.1) - actionview (= 6.0.4.1) - activesupport (= 6.0.4.1) - rack (~> 2.0, >= 2.0.8) + actionpack (6.1.7.7) + actionview (= 6.1.7.7) + activesupport (= 6.1.7.7) + rack (~> 2.0, >= 2.0.9) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.0.4.1) - actionpack (= 6.0.4.1) - activerecord (= 6.0.4.1) - activestorage (= 6.0.4.1) - activesupport (= 6.0.4.1) + actiontext (6.1.7.7) + actionpack (= 6.1.7.7) + activerecord (= 6.1.7.7) + activestorage (= 6.1.7.7) + activesupport (= 6.1.7.7) nokogiri (>= 1.8.5) - actionview (6.0.4.1) - activesupport (= 6.0.4.1) + actionview (6.1.7.7) + activesupport (= 6.1.7.7) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) - activejob (6.0.4.1) - activesupport (= 6.0.4.1) + activejob (6.1.7.7) + activesupport (= 6.1.7.7) globalid (>= 0.3.6) - activemodel (6.0.4.1) - activesupport (= 6.0.4.1) - activerecord (6.0.4.1) - activemodel (= 6.0.4.1) - activesupport (= 6.0.4.1) - activestorage (6.0.4.1) - actionpack (= 6.0.4.1) - activejob (= 6.0.4.1) - activerecord (= 6.0.4.1) - marcel (~> 1.0.0) - activesupport (6.0.4.1) + activemodel (6.1.7.7) + activesupport (= 6.1.7.7) + activerecord (6.1.7.7) + activemodel (= 6.1.7.7) + activesupport (= 6.1.7.7) + activestorage (6.1.7.7) + actionpack (= 6.1.7.7) + activejob (= 6.1.7.7) + activerecord (= 6.1.7.7) + activesupport (= 6.1.7.7) + marcel (~> 1.0) + mini_mime (>= 1.1.0) + activesupport (6.1.7.7) concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 0.7, < 2) - minitest (~> 5.1) - tzinfo (~> 1.1) - zeitwerk (~> 2.2, >= 2.2.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + zeitwerk (~> 2.3) bootsnap (1.9.1) msgpack (~> 1.0) - builder (3.2.4) + builder (3.3.0) byebug (11.1.3) - concurrent-ruby (1.1.9) + concurrent-ruby (1.3.4) crass (1.0.6) - erubi (1.10.0) + date (3.3.4) + erubi (1.13.0) ffi (1.15.4) - globalid (0.5.2) - activesupport (>= 5.0) - i18n (1.8.10) + globalid (1.2.1) + activesupport (>= 6.1) + i18n (1.14.6) concurrent-ruby (~> 1.0) listen (3.0.8) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) - loofah (2.12.0) + loofah (2.22.0) crass (~> 1.0.2) - nokogiri (>= 1.5.9) - mail (2.7.1) + nokogiri (>= 1.12.0) + mail (2.8.1) mini_mime (>= 0.1.1) - marcel (1.0.2) - method_source (1.0.0) - mini_mime (1.1.1) - mini_portile2 (2.8.0) - minitest (5.14.4) + net-imap + net-pop + net-smtp + marcel (1.0.4) + method_source (1.1.0) + mini_mime (1.1.5) + mini_portile2 (2.8.7) + minitest (5.25.1) msgpack (1.4.2) + net-imap (0.4.16) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.2) + timeout + net-smtp (0.5.0) + net-protocol nio4r (2.7.3) - nokogiri (1.13.4) - mini_portile2 (~> 2.8.0) + nokogiri (1.16.7) + mini_portile2 (~> 2.8.2) racc (~> 1.4) puma (5.6.9) nio4r (~> 2.0) - racc (1.6.0) + racc (1.8.1) rack (2.2.9) - rack-test (1.1.0) - rack (>= 1.0, < 3) - rails (6.0.4.1) - actioncable (= 6.0.4.1) - actionmailbox (= 6.0.4.1) - actionmailer (= 6.0.4.1) - actionpack (= 6.0.4.1) - actiontext (= 6.0.4.1) - actionview (= 6.0.4.1) - activejob (= 6.0.4.1) - activemodel (= 6.0.4.1) - activerecord (= 6.0.4.1) - activestorage (= 6.0.4.1) - activesupport (= 6.0.4.1) - bundler (>= 1.3.0) - railties (= 6.0.4.1) + rack-test (2.1.0) + rack (>= 1.3) + rails (6.1.7.7) + actioncable (= 6.1.7.7) + actionmailbox (= 6.1.7.7) + actionmailer (= 6.1.7.7) + actionpack (= 6.1.7.7) + actiontext (= 6.1.7.7) + actionview (= 6.1.7.7) + activejob (= 6.1.7.7) + activemodel (= 6.1.7.7) + activerecord (= 6.1.7.7) + activestorage (= 6.1.7.7) + activesupport (= 6.1.7.7) + bundler (>= 1.15.0) + railties (= 6.1.7.7) sprockets-rails (>= 2.0.0) - rails-dom-testing (2.0.3) - activesupport (>= 4.2.0) + rails-dom-testing (2.2.0) + activesupport (>= 5.0.0) + minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.4.2) - loofah (~> 2.3) - railties (6.0.4.1) - actionpack (= 6.0.4.1) - activesupport (= 6.0.4.1) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) + railties (6.1.7.7) + actionpack (= 6.1.7.7) + activesupport (= 6.1.7.7) method_source - rake (>= 0.8.7) - thor (>= 0.20.3, < 2.0) - rake (13.0.6) + rake (>= 12.2) + thor (~> 1.0) + rake (13.2.1) rb-fsevent (0.11.0) rb-inotify (0.10.1) ffi (~> 1.0) @@ -126,22 +145,22 @@ GEM spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) spring (>= 1.2, < 3.0) - sprockets (4.0.2) + sprockets (4.2.1) concurrent-ruby (~> 1.0) - rack (> 1, < 3) - sprockets-rails (3.2.2) - actionpack (>= 4.0) - activesupport (>= 4.0) + rack (>= 2.2.4, < 4) + sprockets-rails (3.5.2) + actionpack (>= 6.1) + activesupport (>= 6.1) sprockets (>= 3.0.0) sqlite3 (1.4.2) - thor (1.1.0) - thread_safe (0.3.6) - tzinfo (1.2.11) - thread_safe (~> 0.1) - websocket-driver (0.7.5) + thor (1.3.2) + timeout (0.4.1) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - zeitwerk (2.4.2) + zeitwerk (2.7.0) PLATFORMS ruby @@ -151,7 +170,7 @@ DEPENDENCIES byebug listen (>= 3.0.5, < 3.2) puma (~> 5.6) - rails (~> 6.0.2) + rails (~> 6.1.7) spring spring-watcher-listen (~> 2.0.0) sqlite3 (~> 1.4) From 588d9dd40487277e2560ece09fe310d7c0ecb4a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 16:51:45 +0000 Subject: [PATCH 27/27] Bump actionpack from 6.1.7.7 to 6.1.7.8 in /examples/simple_rails_api Bumps [actionpack](https://github.com/rails/rails) from 6.1.7.7 to 6.1.7.8. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v7.2.1/actionpack/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v6.1.7.7...v6.1.7.8) --- updated-dependencies: - dependency-name: actionpack dependency-type: indirect ... Signed-off-by: dependabot[bot] --- examples/simple_rails_api/Gemfile.lock | 106 ++++++++++++------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/examples/simple_rails_api/Gemfile.lock b/examples/simple_rails_api/Gemfile.lock index 1a98bb7..4e78dc3 100644 --- a/examples/simple_rails_api/Gemfile.lock +++ b/examples/simple_rails_api/Gemfile.lock @@ -1,60 +1,60 @@ GEM remote: https://rubygems.org/ specs: - actioncable (6.1.7.7) - actionpack (= 6.1.7.7) - activesupport (= 6.1.7.7) + actioncable (6.1.7.8) + actionpack (= 6.1.7.8) + activesupport (= 6.1.7.8) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.1.7.7) - actionpack (= 6.1.7.7) - activejob (= 6.1.7.7) - activerecord (= 6.1.7.7) - activestorage (= 6.1.7.7) - activesupport (= 6.1.7.7) + actionmailbox (6.1.7.8) + actionpack (= 6.1.7.8) + activejob (= 6.1.7.8) + activerecord (= 6.1.7.8) + activestorage (= 6.1.7.8) + activesupport (= 6.1.7.8) mail (>= 2.7.1) - actionmailer (6.1.7.7) - actionpack (= 6.1.7.7) - actionview (= 6.1.7.7) - activejob (= 6.1.7.7) - activesupport (= 6.1.7.7) + actionmailer (6.1.7.8) + actionpack (= 6.1.7.8) + actionview (= 6.1.7.8) + activejob (= 6.1.7.8) + activesupport (= 6.1.7.8) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.1.7.7) - actionview (= 6.1.7.7) - activesupport (= 6.1.7.7) + actionpack (6.1.7.8) + actionview (= 6.1.7.8) + activesupport (= 6.1.7.8) rack (~> 2.0, >= 2.0.9) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.1.7.7) - actionpack (= 6.1.7.7) - activerecord (= 6.1.7.7) - activestorage (= 6.1.7.7) - activesupport (= 6.1.7.7) + actiontext (6.1.7.8) + actionpack (= 6.1.7.8) + activerecord (= 6.1.7.8) + activestorage (= 6.1.7.8) + activesupport (= 6.1.7.8) nokogiri (>= 1.8.5) - actionview (6.1.7.7) - activesupport (= 6.1.7.7) + actionview (6.1.7.8) + activesupport (= 6.1.7.8) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) - activejob (6.1.7.7) - activesupport (= 6.1.7.7) + activejob (6.1.7.8) + activesupport (= 6.1.7.8) globalid (>= 0.3.6) - activemodel (6.1.7.7) - activesupport (= 6.1.7.7) - activerecord (6.1.7.7) - activemodel (= 6.1.7.7) - activesupport (= 6.1.7.7) - activestorage (6.1.7.7) - actionpack (= 6.1.7.7) - activejob (= 6.1.7.7) - activerecord (= 6.1.7.7) - activesupport (= 6.1.7.7) + activemodel (6.1.7.8) + activesupport (= 6.1.7.8) + activerecord (6.1.7.8) + activemodel (= 6.1.7.8) + activesupport (= 6.1.7.8) + activestorage (6.1.7.8) + actionpack (= 6.1.7.8) + activejob (= 6.1.7.8) + activerecord (= 6.1.7.8) + activesupport (= 6.1.7.8) marcel (~> 1.0) mini_mime (>= 1.1.0) - activesupport (6.1.7.7) + activesupport (6.1.7.8) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) @@ -109,20 +109,20 @@ GEM rack (2.2.9) rack-test (2.1.0) rack (>= 1.3) - rails (6.1.7.7) - actioncable (= 6.1.7.7) - actionmailbox (= 6.1.7.7) - actionmailer (= 6.1.7.7) - actionpack (= 6.1.7.7) - actiontext (= 6.1.7.7) - actionview (= 6.1.7.7) - activejob (= 6.1.7.7) - activemodel (= 6.1.7.7) - activerecord (= 6.1.7.7) - activestorage (= 6.1.7.7) - activesupport (= 6.1.7.7) + rails (6.1.7.8) + actioncable (= 6.1.7.8) + actionmailbox (= 6.1.7.8) + actionmailer (= 6.1.7.8) + actionpack (= 6.1.7.8) + actiontext (= 6.1.7.8) + actionview (= 6.1.7.8) + activejob (= 6.1.7.8) + activemodel (= 6.1.7.8) + activerecord (= 6.1.7.8) + activestorage (= 6.1.7.8) + activesupport (= 6.1.7.8) bundler (>= 1.15.0) - railties (= 6.1.7.7) + railties (= 6.1.7.8) sprockets-rails (>= 2.0.0) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) @@ -131,9 +131,9 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (6.1.7.7) - actionpack (= 6.1.7.7) - activesupport (= 6.1.7.7) + railties (6.1.7.8) + actionpack (= 6.1.7.8) + activesupport (= 6.1.7.8) method_source rake (>= 12.2) thor (~> 1.0) pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy